summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsjaz <sjaz@5417fbe8-f217-4b02-8779-1006273d7864>2009-01-01 12:00:20 +0000
committersjaz <sjaz@5417fbe8-f217-4b02-8779-1006273d7864>2009-01-01 12:00:20 +0000
commitc777c8d9aa7cd5c2e9a399727a7fa9985a77fb1c (patch)
tree9e996ae4a1bbb833cec036c5cd4d87a590149e85
Anope Stable Branch
git-svn-id: http://anope.svn.sourceforge.net/svnroot/anope/stable@1902 5417fbe8-f217-4b02-8779-1006273d7864
-rw-r--r--.BANNER18
-rw-r--r--Changes1223
-rw-r--r--Changes.conf782
-rw-r--r--Changes.lang558
-rw-r--r--Changes.mysql129
-rwxr-xr-xConfig325
-rw-r--r--Config.bat3
-rw-r--r--Makefile.in131
-rw-r--r--Makefile.win3296
-rw-r--r--aclocal.m4863
-rw-r--r--anope.bat3
-rw-r--r--anope.m431
-rw-r--r--config.guess1526
-rw-r--r--config.sub1662
-rwxr-xr-xconfigure9526
-rw-r--r--configure.in304
-rw-r--r--data/example.chk44
-rw-r--r--data/example.conf1598
-rw-r--r--data/tables.sql433
-rw-r--r--docs/BUGS4
-rw-r--r--docs/COPYING339
-rw-r--r--docs/DEFCON118
-rw-r--r--docs/EVENTS416
-rw-r--r--docs/FAQ480
-rw-r--r--docs/INSTALL184
-rw-r--r--docs/IRCD601
-rw-r--r--docs/MODULES124
-rw-r--r--docs/MYSQL109
-rw-r--r--docs/NEWS55
-rw-r--r--docs/OLDCHANGES1299
-rw-r--r--docs/OLDNEWS139
-rw-r--r--docs/PROXY41
-rw-r--r--docs/README377
-rw-r--r--docs/WIN32.txt209
-rw-r--r--include/Makefile20
-rw-r--r--include/commands.h34
-rw-r--r--include/config.h76
-rw-r--r--include/datafiles.h71
-rw-r--r--include/defs.h40
-rw-r--r--include/depricated.h127
-rw-r--r--include/encrypt.h22
-rw-r--r--include/events.h64
-rw-r--r--include/extern.h1406
-rw-r--r--include/makefile.win3225
-rw-r--r--include/messages.h23
-rw-r--r--include/module.h16
-rw-r--r--include/modules.h383
-rw-r--r--include/pseudo.h20
-rw-r--r--include/resource.h20
-rw-r--r--include/services.h1389
-rw-r--r--include/slist.h50
-rw-r--r--include/sockets.h47
-rw-r--r--include/sysconf.h.in227
-rw-r--r--include/sysconf.h.win3250
-rw-r--r--include/timeout.h50
-rw-r--r--include/version.sh86
-rw-r--r--include/version.sh.c224
-rw-r--r--install-script29
-rw-r--r--install.js571
-rw-r--r--install.sh0
-rw-r--r--lang/Makefile82
-rw-r--r--lang/Makefile.win3275
-rw-r--r--lang/cat.l6911
-rw-r--r--lang/de.l6872
-rw-r--r--lang/en_us.l6516
-rw-r--r--lang/es.l6875
-rw-r--r--lang/fr.l6948
-rw-r--r--lang/gr.l6795
-rw-r--r--lang/hun.l6680
-rw-r--r--lang/it.l6741
-rw-r--r--lang/langcomp.c275
-rw-r--r--lang/langtool.c74
-rw-r--r--lang/nl.l6702
-rw-r--r--lang/pl.l7766
-rw-r--r--lang/pt.l6665
-rw-r--r--lang/ru.l6807
-rw-r--r--lang/tr.l6713
-rw-r--r--makefile.inc.win3299
-rw-r--r--src/Makefile138
-rw-r--r--src/actions.c270
-rw-r--r--src/anope-icon.icobin0 -> 3774 bytes
-rw-r--r--src/base64.c410
-rwxr-xr-xsrc/bin/am499
-rw-r--r--src/bin/anoperc.in141
-rwxr-xr-xsrc/bin/cp-recursive21
-rwxr-xr-xsrc/bin/langtool239
-rwxr-xr-xsrc/bin/mydbgen222
-rwxr-xr-xsrc/bin/register101
-rw-r--r--src/botserv.c1171
-rw-r--r--src/channels.c2322
-rw-r--r--src/chanserv.c2674
-rw-r--r--src/commands.c271
-rw-r--r--src/compat.c228
-rw-r--r--src/config.c1420
-rw-r--r--src/core/Makefile45
-rw-r--r--src/core/Makefile.sub29
-rw-r--r--src/core/Makefile.win3224
-rw-r--r--src/core/bs_act.c92
-rw-r--r--src/core/bs_assign.c102
-rw-r--r--src/core/bs_badwords.c326
-rw-r--r--src/core/bs_bot.c378
-rw-r--r--src/core/bs_botlist.c108
-rw-r--r--src/core/bs_fantasy.c89
-rw-r--r--src/core/bs_fantasy_kick.c98
-rw-r--r--src/core/bs_fantasy_kickban.c99
-rw-r--r--src/core/bs_fantasy_owner.c88
-rw-r--r--src/core/bs_fantasy_seen.c139
-rw-r--r--src/core/bs_help.c67
-rw-r--r--src/core/bs_info.c282
-rw-r--r--src/core/bs_kick.c379
-rw-r--r--src/core/bs_say.c97
-rw-r--r--src/core/bs_set.c208
-rw-r--r--src/core/bs_unassign.c89
-rwxr-xr-xsrc/core/configure53
-rw-r--r--src/core/cs_access.c543
-rw-r--r--src/core/cs_akick.c668
-rw-r--r--src/core/cs_ban.c227
-rw-r--r--src/core/cs_clear.c402
-rw-r--r--src/core/cs_drop.c128
-rw-r--r--src/core/cs_forbid.c139
-rw-r--r--src/core/cs_getkey.c88
-rw-r--r--src/core/cs_getpass.c102
-rw-r--r--src/core/cs_help.c84
-rw-r--r--src/core/cs_identify.c117
-rw-r--r--src/core/cs_info.c249
-rw-r--r--src/core/cs_invite.c90
-rw-r--r--src/core/cs_kick.c152
-rw-r--r--src/core/cs_list.c199
-rw-r--r--src/core/cs_logout.c131
-rw-r--r--src/core/cs_modes.c392
-rw-r--r--src/core/cs_register.c192
-rw-r--r--src/core/cs_sendpass.c125
-rw-r--r--src/core/cs_set.c837
-rw-r--r--src/core/cs_status.c102
-rw-r--r--src/core/cs_suspend.c211
-rw-r--r--src/core/cs_topic.c119
-rw-r--r--src/core/cs_xop.c509
-rw-r--r--src/core/dummy/Makefile6
-rw-r--r--src/core/enc_md5.c427
-rw-r--r--src/core/enc_none.c78
-rw-r--r--src/core/enc_old.c451
-rw-r--r--src/core/enc_sha1.c275
-rw-r--r--src/core/he_help.c76
-rw-r--r--src/core/hs_del.c91
-rw-r--r--src/core/hs_delall.c96
-rw-r--r--src/core/hs_group.c124
-rw-r--r--src/core/hs_help.c66
-rw-r--r--src/core/hs_list.c187
-rw-r--r--src/core/hs_off.c87
-rw-r--r--src/core/hs_on.c102
-rw-r--r--src/core/hs_set.c178
-rw-r--r--src/core/hs_setall.c180
-rw-r--r--src/core/ms_cancel.c105
-rw-r--r--src/core/ms_check.c118
-rw-r--r--src/core/ms_del.c202
-rw-r--r--src/core/ms_help.c66
-rw-r--r--src/core/ms_info.c231
-rw-r--r--src/core/ms_list.c197
-rw-r--r--src/core/ms_read.c203
-rw-r--r--src/core/ms_rsend.c120
-rw-r--r--src/core/ms_send.c74
-rw-r--r--src/core/ms_sendall.c96
-rw-r--r--src/core/ms_set.c266
-rw-r--r--src/core/ms_staff.c93
-rw-r--r--src/core/ns_access.c189
-rw-r--r--src/core/ns_alist.c186
-rw-r--r--src/core/ns_drop.c156
-rw-r--r--src/core/ns_forbid.c155
-rw-r--r--src/core/ns_getemail.c102
-rw-r--r--src/core/ns_getpass.c112
-rw-r--r--src/core/ns_ghost.c118
-rw-r--r--src/core/ns_group.c337
-rw-r--r--src/core/ns_help.c79
-rw-r--r--src/core/ns_identify.c171
-rw-r--r--src/core/ns_info.c284
-rw-r--r--src/core/ns_list.c247
-rw-r--r--src/core/ns_logout.c128
-rw-r--r--src/core/ns_recover.c137
-rw-r--r--src/core/ns_register.c490
-rw-r--r--src/core/ns_release.c127
-rw-r--r--src/core/ns_saset.c533
-rw-r--r--src/core/ns_sendpass.c122
-rw-r--r--src/core/ns_set.c475
-rw-r--r--src/core/ns_status.c94
-rw-r--r--src/core/ns_suspend.c193
-rw-r--r--src/core/ns_update.c90
-rw-r--r--src/core/os_admin.c249
-rw-r--r--src/core/os_akill.c386
-rw-r--r--src/core/os_chankill.c134
-rw-r--r--src/core/os_chanlist.c116
-rw-r--r--src/core/os_clearmodes.c328
-rw-r--r--src/core/os_defcon.c169
-rw-r--r--src/core/os_global.c82
-rw-r--r--src/core/os_help.c66
-rw-r--r--src/core/os_ignore.c146
-rw-r--r--src/core/os_jupe.c88
-rw-r--r--src/core/os_kick.c100
-rw-r--r--src/core/os_logonnews.c98
-rw-r--r--src/core/os_mode.c102
-rw-r--r--src/core/os_modinfo.c139
-rw-r--r--src/core/os_modlist.c195
-rw-r--r--src/core/os_modload.c83
-rw-r--r--src/core/os_modunload.c85
-rw-r--r--src/core/os_noop.c106
-rw-r--r--src/core/os_oline.c108
-rw-r--r--src/core/os_oper.c252
-rw-r--r--src/core/os_opernews.c97
-rw-r--r--src/core/os_quit.c82
-rw-r--r--src/core/os_randomnews.c66
-rw-r--r--src/core/os_raw.c78
-rw-r--r--src/core/os_reload.c84
-rw-r--r--src/core/os_restart.c91
-rw-r--r--src/core/os_session.c68
-rw-r--r--src/core/os_set.c264
-rw-r--r--src/core/os_sgline.c362
-rw-r--r--src/core/os_shutdown.c83
-rw-r--r--src/core/os_sqline.c355
-rw-r--r--src/core/os_staff.c156
-rw-r--r--src/core/os_stats.c453
-rw-r--r--src/core/os_svsnick.c125
-rw-r--r--src/core/os_szline.c350
-rw-r--r--src/core/os_umode.c116
-rw-r--r--src/core/os_update.c74
-rw-r--r--src/core/os_userlist.c121
-rw-r--r--src/datafiles.c788
-rw-r--r--src/encrypt.c122
-rw-r--r--src/events.c787
-rw-r--r--src/helpserv.c69
-rw-r--r--src/hostserv.c655
-rw-r--r--src/init.c789
-rw-r--r--src/ircd.c1215
-rw-r--r--src/language.c309
-rw-r--r--src/list.c196
-rw-r--r--src/log.c336
-rw-r--r--src/mail.c285
-rw-r--r--src/main.c752
-rw-r--r--src/makefile.win32109
-rw-r--r--src/memory.c138
-rw-r--r--src/memoserv.c445
-rw-r--r--src/messages.c415
-rw-r--r--src/misc.c1663
-rw-r--r--src/mod_version.c36
-rw-r--r--src/modules.c2874
-rw-r--r--src/modules/Makefile48
-rw-r--r--src/modules/Makefile.sub28
-rw-r--r--src/modules/README1
-rw-r--r--src/modules/bs_fantasy_unban.c82
-rwxr-xr-xsrc/modules/configure58
-rw-r--r--src/modules/cs_appendtopic.c247
-rw-r--r--src/modules/cs_enforce.c479
-rw-r--r--src/modules/cs_tban.c253
-rw-r--r--src/modules/demos/catserv/Makefile9
-rw-r--r--src/modules/demos/catserv/README4
-rw-r--r--src/modules/demos/catserv/catserv_extern.h11
-rw-r--r--src/modules/demos/catserv/catserv_messages.c14
-rw-r--r--src/modules/demos/catserv/catserv_messages.h10
-rw-r--r--src/modules/demos/catserv/ircd_catserv.c112
-rw-r--r--src/modules/demos/catserv/makefile.win324
-rw-r--r--src/modules/demos/catserv/meow.c9
-rw-r--r--src/modules/demos/catserv/meow.h9
-rw-r--r--src/modules/demos/catserv/purr.c8
-rw-r--r--src/modules/demos/catserv/purr.h9
-rw-r--r--src/modules/demos/events.c82
-rw-r--r--src/modules/demos/hs_conf.c74
-rw-r--r--src/modules/demos/hs_moo.c119
-rw-r--r--src/modules/dummy/Makefile6
-rw-r--r--src/modules/hs_request.c986
-rw-r--r--src/modules/makefile.inc.win322
-rw-r--r--src/modules/makefile.sub.win3219
-rw-r--r--src/modules/makefile.win3241
-rw-r--r--src/modules/ns_maxemail.c228
-rw-r--r--src/modules/ns_noop_convert.c173
-rw-r--r--src/modules/os_ignore_db.c545
-rw-r--r--src/modules/os_info.c780
-rw-r--r--src/mypasql.c122
-rw-r--r--src/mypasql.def10
-rw-r--r--src/mysql.c2058
-rw-r--r--src/news.c554
-rw-r--r--src/nickserv.c1995
-rw-r--r--src/operserv.c1774
-rw-r--r--src/process.c417
-rw-r--r--src/protocol/Makefile45
-rw-r--r--src/protocol/Makefile.sub29
-rw-r--r--src/protocol/Makefile.win3226
-rw-r--r--src/protocol/bahamut.c1680
-rw-r--r--src/protocol/bahamut.h131
-rw-r--r--src/protocol/charybdis.c2008
-rw-r--r--src/protocol/charybdis.h120
-rwxr-xr-xsrc/protocol/configure53
-rw-r--r--src/protocol/dreamforge.c1384
-rw-r--r--src/protocol/dreamforge.h111
-rw-r--r--src/protocol/dummy/Makefile6
-rw-r--r--src/protocol/hybrid.c1573
-rw-r--r--src/protocol/hybrid.h115
-rw-r--r--src/protocol/inspircd10.c1713
-rw-r--r--src/protocol/inspircd10.h133
-rw-r--r--src/protocol/inspircd11.c1928
-rwxr-xr-xsrc/protocol/inspircd11.h134
-rw-r--r--src/protocol/plexus2.c1880
-rw-r--r--src/protocol/plexus2.h126
-rw-r--r--src/protocol/plexus3.c1857
-rw-r--r--src/protocol/plexus3.h113
-rw-r--r--src/protocol/ptlink.c1800
-rw-r--r--src/protocol/ptlink.h152
-rw-r--r--src/protocol/rageircd.c1679
-rw-r--r--src/protocol/rageircd.h113
-rw-r--r--src/protocol/ratbox.c1882
-rw-r--r--src/protocol/ratbox.h119
-rw-r--r--src/protocol/shadowircd.c1833
-rw-r--r--src/protocol/shadowircd.h142
-rw-r--r--src/protocol/solidircd.c1710
-rw-r--r--src/protocol/solidircd.h137
-rw-r--r--src/protocol/ultimate2.c1734
-rw-r--r--src/protocol/ultimate2.h120
-rw-r--r--src/protocol/ultimate3.c1818
-rw-r--r--src/protocol/ultimate3.h125
-rw-r--r--src/protocol/unreal31.c1592
-rw-r--r--src/protocol/unreal31.h124
-rw-r--r--src/protocol/unreal32.c2232
-rw-r--r--src/protocol/unreal32.h153
-rw-r--r--src/protocol/viagra.c1716
-rw-r--r--src/protocol/viagra.h132
-rw-r--r--src/rdb.c499
-rw-r--r--src/send.c341
-rw-r--r--src/servers.c618
-rw-r--r--src/sessions.c873
-rw-r--r--src/slist.c395
-rw-r--r--src/sockutil.c737
-rw-r--r--src/timeout.c132
-rw-r--r--src/tools/Anope_Install_Script.nsi540
-rw-r--r--src/tools/Anope_MySQL_Install_Script.nsi542
-rw-r--r--src/tools/Makefile39
-rw-r--r--src/tools/Makefile.win3229
-rw-r--r--src/tools/README58
-rw-r--r--src/tools/anopesmtp.c604
-rw-r--r--src/tools/db-merger.c2031
-rw-r--r--src/tools/epona2anope.c856
-rw-r--r--src/tools/smtp.h130
-rw-r--r--src/users.c1125
-rw-r--r--src/win32.rc.template90
-rw-r--r--version.log90
-rw-r--r--version.log.old4968
342 files changed, 224456 insertions, 0 deletions
diff --git a/.BANNER b/.BANNER
new file mode 100644
index 000000000..659c322af
--- /dev/null
+++ b/.BANNER
@@ -0,0 +1,18 @@
+ ___
+ / _ \ http://www.anope.org
+ | /_\ | _ __ _ _ _ _ ___
+ | _ || '_ \/ _ \/ _ \ / _ \
+ | | | || | | |_| |_| | __/
+ |_| |_||_| |_\___/| _/ \___|
+ | |
+ |_| IRC Services
+ CURVER
+This program will help you to compile your Services, and ask you
+questions regarding the compile-time settings of it during the
+process. For more options type ./Config --help
+
+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.
+
+For all your Anope needs please visit our portal at www.anope.org
diff --git a/Changes b/Changes
new file mode 100644
index 000000000..8d660d3d3
--- /dev/null
+++ b/Changes
@@ -0,0 +1,1223 @@
+Anope Version 1.8.0
+-------------------
+10/19 F Updated Anope Credits [ #00]
+11/12 F Fixed a potential problem with NS ACCESS and UseRDB [ #00]
+11/14 F Fixed two potential format vulnerabilities. [ #00]
+11/15 F Fixed ns resending of passcode issue. [#964]
+12/05 F Fixed session count being decremented twice on GHOST. [#969]
+12/05 F Fixed CS setting +i when akicking a user from an empty channel. [#973]
+12/07 F Fixed improper detection of 'd' usermode on UnrealIRCd. [#966]
+12/20 F Fixed crashbug in db-merger. [ #00]
+12/29 F Fixed incorrect merging when db-merger is given arguments. [#976]
+12/29 F Fixed akicklist not being reordered after a nickcore is dropped. [#983]
+
+Provided by Julien S. <SnakeBrothers@hotmail.com> - 2008
+11/14 F Fixed BotInfo::chancount not being set properly with UseRDB [#965]
+
+Provided by Szymek <szymek@adres.pl> - 2008
+10/25 F Updated Polish language file translation. [ #00]
+
+Provided by Kein <kein-of@yandex.ru> - 2008
+10/25 F Updated Russian language file translation [#959]
+
+Anope Version 1.7.24
+--------------------
+10/14 F Fixed minor error in German language file. [#958]
+10/12 F Fixed language error in saset help. [ #00]
+10/12 F Fixed MySQL DB routines not storing passwords properly. [#940]
+10/12 F Fixed OS STATS missing HS and showing disabled clients. [#956]
+10/19 F Added warning regarding combined use of MySQL and skeleton mode. [#957]
+
+Provided by Szymek <szymek@adres.pl> - 2008
+10/14 F Updated Polish language file translation. [ #00]
+
+Provided by Han` <Han@mefalcon.org> - 2008
+10/19 F Updated German language file. [ #00]
+
+
+Anope Version 1.7.23b
+--------------------
+10/06 F Fixed issue with encrypted nick databases. [ #00]
+
+Anope Version 1.7.23
+--------------------
+10/01 A Added modular database back-end for IGNORE. [#948]
+09/18 R Removed password truncating. [ #00]
+09/15 F Dealt with the nss_dns.so.1 issue on freebsd 7. [ #00]
+09/23 F Fixed numerous possible buffer overflows in NS and CS. [ #00]
+09/25 F Fixed UnRestrictSAdmin on Unreal and Inspircd. [#942]
+09/25 F Fixed menu not properly removed after uninstall on windows. [#944]
+09/27 F Fixed a buffer overflow in enc_sha1. [#947]
+09/30 F Fixed error in OPER help. [#943]
+09/30 F Fixed OS IGNORE behaviour. [#941]
+09/30 F Fixed error in the SASET help. [#950]
+10/01 F Fixed an error in the OS IGNORE documentation. [#948]
+10/01 F Fixed DB routines not storing nick passwords properly. [#940]
+10/04 F Fixed errors in CS LOGOUT documentation. [#941]
+10/04 F Fixed missing optional params in MODLIST help. [#951]
+
+Provided by Robin Burchell <w00t@inspircd.org> - 2008
+09/22 F Enabled UMODE functionality for InspIRCd 1.1 [ #00]
+09/22 F Fix pointer comparison on non-ptr in CS CLEAR. [ #00]
+09/23 F Possible buffer overflow in NS/CS REGISTER. [ #00]
+09/27 F Incorrect maths in strnrepl(), from atheme/denora. [ #00]
+
+Anope Version 1.7.22
+--------------------
+01/24 A Added a check for hosts too long in BotServs bots. [ #00]
+02/12 A Added SUSPENDED to NS LIST keywords. [#869]
+02/20 A Added NS SASET LANGUAGE. [#872]
+09/03 A Added CIDR support in channel bans/excepts. [#876]
+09/03 A Anope on windows now has advanced startup options. [#931]
+01/15 F BOT_NOT_ASSIGNED language string error. [#828]
+01/15 F listchans now shows if a channel is suspended. [#825]
+01/15 F listnicks now shows if a nickname is suspended. [#825]
+01/15 F Re-assigned access to OS CHANLIST to Services Opers. [#827]
+01/24 F Several language errors. [ #00]
+01/26 F Various oddities in moduleAddData(). [#833]
+01/26 F Various oddities in ChanServ suspend code. [#834]
+01/26 F Channel walking for mass modes and restoring topics. [#835]
+01/26 F Memory leaks in OperServ CLEARMODES. [#836]
+01/26 F Check for LogChannel when running with -logchan option. [#837]
+01/26 F Enough LogChannel checks for bs_say and bs_act with LogBot on. [#838]
+01/26 F Memory leak and old code in ChanServ CLEAR. [#839]
+01/26 F Memory leak in ChanServ LIST. [#840]
+01/26 F Memory leaks in HostServ SETALL. [#841]
+01/26 F Memory leak in ChanServ AKICK. [#842]
+01/26 F Removed broken detection of Windows MCE/Tablet edition. [#845]
+02/04 F Memleak in botchanmsgs(), botserv.c [#850]
+02/04 F Memleak in bs_fantasy_seen.c [#851]
+02/04 F Memleak in bs_fantasy_unban.c [#852]
+02/04 F No variable for NSReleaseTimeout in NICK_RECOVERED message. [#848]
+02/04 F Added missed NickServ HELP for RESEND command. [#847]
+02/05 F Updated config.guess and config.sub from upstream. [#853]
+02/05 F Various small compiler warnings. [#685]
+02/05 F Updated docs/WIN32.txt. [#846]
+02/05 F Removed bs_fantasy_unban from core modules. [#854]
+02/05 F Defcon mode parsing breaking when fed with modes with parameters. [#855]
+02/05 F do_cmode() called without passing TS. [#820]
+02/07 F do_sjoin() looking for NULL-nick sometimes with TS6. [#858]
+02/07 F Oddity in do_cmode(). [#859]
+02/07 F findchan() debug messages not being logical. [#857]
+02/07 F NickServ replying to SVSNICK command when OperServ must. [#861]
+02/11 F Fixed configure script so it will complain about args. [#864]
+02/11 F Fixed memory leak in add_akill(). [#868]
+02/11 F Fixed memory leak in cs_akick(). [#870]
+02/11 F Added missed debug message when HostServ is disabled. [#863]
+02/12 F rdb_close() where rdb_open() is used in rdb_dbase() functions. [#862]
+02/12 F Removed extra loop when parsing defcon modes. [#867]
+02/21 F Fixed errors in lang files related to NS SASET LANGUAGE [#881]
+04/30 F Operators can now also use NickServ INFO ALL. [ #00]
+05/12 F install.js now works properly on x64 machines [#897]
+05/12 F anope_cmd_notice_ops for unreal now includes source. [ #00]
+05/12 F moduleNoticeLang() now calls notice_user instead of notice(). [ #00]
+08/11 F Updated os_raw.c to show up as a 3rd party module. [ #00]
+08/15 F CS OP now correctly works if there is only 1 user in the channel. [#922]
+08/16 F Forbidden channels no longer appear in /list when inhabited. [#924]
+08/17 F Various InspIRCd issues. [#832]
+08/18 F CS GETKEY response. [#880]
+08/21 F Potential issues caused by not setting SO_REUSEADDR on socket. [ #00]
+08/28 F Fixed several language & help related errors. [#875]
+08/28 F Replaced static count in login/opernews help. [#882]
+08/28 F Updated help on ChanServ AKICK. [#879]
+09/01 F Fixed crashbug in cs_access. [#932]
+09/02 F Fixed bug in enc_none in combination with truncated pass. [#934]
+09/03 F Fixed variables not correctly shown in help. [#873]
+09/04 F Rewrote the ignore system to fix several issues. [#930]
+09/13 F AKICK now respects the PEACE setting. [#935]
+09/13 F Fixed bug in ratbox RESV support. [#937]
+09/14 F Fixed CLEAR not always sending correct modes. [#938]
+09/14 F Fixed compile warning in os_clearmodes.c. [#939]
+
+Provided by Robin Burchell <w00t@inspircd.org> - 2008
+08/08 F Strict warnings in send.c from comparing address of non-ptr [ #00]
+08/08 F Removed sa-commands from inspircd protocol support. [ #00]
+08/24 F InspIRCd FMODE timestamp issue. [#927]
+
+Provided by Christian Schroer <Christian.Schroer@coderschlampe.com> - 2008
+07/20 F Updated Deutch language file. [#892]
+
+Provided by Trystan <trystan@nomadirc.net> - 2008
+02/11 F Last part of memory leak in cs_akick() [#870]
+
+Provided by Johno Crawford <johno.crawford@gmail.com> - 2008
+02/08 F x86_64 generating improper SHA1 hash values. [#856]
+
+Provided by Jan Milants <jan_renee@msn.com> - 2008
+01/16 F Server traversion with next_server() failed to list all servers. [#831]
+02/08 F Removed excessive free in ChanServ AKICK code. [#849]
+07/20 F make install now runs install routine for modules subdirs also. [#917]
+07/20 F Fixes weird hs_setall behaviour (memory issues). [#916]
+07/20 F DEFCON was akilling ulined servers clients. [#899]
+07/20 F Botserv replying with /(null). [#894]
+07/20 F Anope will not limit sessions for ulined servers. [#909]
+07/20 F EVENT_BOT_KICK not being send under all circumstances [#910]
+08/17 F Changes.conf updated with forgotten deleted directives. [#905]
+
+Provided by Martin J. Green <mail@martinjgreen.me.uk> - 2008
+08/17 A SQLINE and SGLINE support for Hybrid. [#887]
+
+Provided by Twitch <mitch@zomgirc.net> - 2008
+08/17 F Warnings in users.c. [#925]
+
+Provided by Hal9000 <hal9000@pimpmylinux.org> - 2008
+04/29 F Potential crash in channels.c. [ #00]
+04/29 F TS handling on incoming FMODE with InspIRCd 1.1. [ #00]
+05/20 F Possible crash in new TS handling for InspIRCd 1.1. [#904]
+
+Anope Version 1.7.21
+--------------------
+12/30 F Grouped root nicks could result in loss of power when using MySQL.[#812]
+01/01 F Databases not being saved on quit caused by connection error. [#811]
+01/05 F Re-idenficiation after netsplit on InspIRCd. [#817]
+01/05 F Founder channelmode (+q) not correctly parsed in FJOIN. [ #00]
+01/06 F Updated documentation where needed. [ #00]
+01/06 F InspIRCD +q and +a prefixes were swapped. [ #00]
+01/09 F InspIRCd crash on certain FMODE sends. [#821]
+01/12 F Nonsensical data appended to some bans. [#824]
+
+Provided by Trystan <trystan@nomadirc.net> - 2008
+01/04 F Detection of Windows Vista and Windows Server 2008. [#815]
+
+Provided by Jan Milants <jan_renee@msn.com> - 2008
+01/04 F EVENT_ACCESS_DEL being sent with NULL-param when using XOP. [#816]
+
+Provided by Kein <kein-of@yandex.ru> - 2008
+01/04 A Russian translation for bundled modules. [ #00]
+01/04 F Updated Russian language file. [ #00]
+
+Anope Version 1.7.20
+--------------------
+12/28 F Some silly logic errors in anope_event_capab() in inspircd11.c [ #00]
+12/28 F RSQUIT support for InspIRCd 1.1 [#692]
+12/24 F inspircd11 module now uses FMODE instead of MODE [#724]
+08/29 A Session limit exceptions now support IP numbers as hostmask. [#723]
+08/29 A Added InspIRCd11 vIdent support. [#684]
+08/30 A Added support for channel keys to UnrealIRCd 3.2 SVSJOIN command. [#774]
+08/31 A Added hostip member to user_ struct so we can now use users' IPs. [ #00]
+12/03 A Support for MS VC++ 2008 Express. [#802]
+06/15 F Non-existing servers being SQUIT'd when they were juped. [#726]
+06/15 F Back online notice being sent to juped servers. [#726]
+06/15 F Not informing opers a SQUIT for a juped server was received. [#718]
+06/18 F OperServ MODINFO giving misleading errors. [#732]
+07/09 F Various access levels for oper-commands. [#729]
+07/09 F GlobalOnCycle notices being sent to Anope itself or juped servers.[#737]
+07/09 F Possible buffer overflow in inspircd10.c [#741]
+07/09 F Various compile errors with `make strict`. [#743]
+07/14 F No longer displaying commands on add/remove in debug mode 1. [ #00]
+08/05 F ChanServ access level AUTODEOP works again. [#750]
+08/08 F Wrong debug notice when killing people due to the session limit. [#734]
+08/08 F DefCon modes being re-set after mass-unset when leaving DefCon. [#727]
+08/11 F CAPAB tokens for InspIRCd 1.1 never parsed. [#742]
+08/21 F Updated the WIN32.txt document a bit. [ #00]
+08/21 F Re-worded the CHAN_LEVELS_XOP string in en_us. [ #00]
+08/27 F Functions firstuser and first_uid now don't collide when used. [#764]
+08/27 F Is not posible to use CS SET XOP when cs_xop is not loaded. [#747]
+08/27 F Services administrators and opers can be kicked by ChanServ now. [#753]
+08/27 F Added missing help for NS CONFIRM. [#759]
+08/27 F Fixed typo in English language file. [#767]
+08/27 F Protocol for InspIRCd 1.1 now uses SVSHOLD. [#683]
+08/28 F Bug when truncating passwords to PASSMAX with enc_none. [#765]
+08/28 F Bug in PTLink protocol where topic time was not being sent. [#763]
+08/28 F Automatic displaying of 'Limited to ...' lines in help. [#729]
+08/28 F We now check required commands existance on inspircd11 protocol. [#773]
+08/28 F SuperAdmin now always overrules channel founder. [#770]
+08/29 F InspIRCD11 protocol now uses SVSJOIN/PART instead of SAJOIN/PART. [#772]
+08/29 F OperServ SGLINE ADD now strips a trailing space from the mask. [#761]
+08/29 F TS6 UID generation for all supported TS6 IRCDs. [#731]
+08/31 F is_excepted() now uses match_userip() also. [#778]
+08/31 F Wrong reply when deleting entries by number (akick, badwords) [#776]
+09/01 F Added a note in WIN32.txt about pre-compiled installers [# 00]
+09/02 F Created MySQL indexes to decrease load on the database. [# 00]
+09/05 F Removed Limited to... message from os_akill.c and os_modload.c [#780]
+09/05 F Removed extra bolded commands in OS HELP SET [#781]
+09/08 F User being able to set modes on empty channels without permission.[#703]
+09/09 F Undeclared identifiers in module cleaning code on windows. [#782]
+09/09 F Missing test to check mysql_config sanity in ./configure. [#757]
+09/24 F Polish language reported itself as English when switching to it. [#789]
+09/24 F OperServ HELP OPER showing incorrect access levels. [#788]
+10/05 F Typo in inspircd11.c checking for m_chgident.so loaded. [#793]
+10/07 F Segfault on missing required InspIRCd11 modules. [#794]
+12/02 F Fixed a typo in en_us.l. [#806]
+12/02 F Fixed a typo in install.js. [#804]
+12/02 F Fixed the protect commands in inspircd11.c. [#805]
+12/03 F Unregistered users now have access level 0 instead of -1. [#796]
+12/03 F Malformed command for InspIRCd 1.1. [#797]
+12/03 F Updates to various documentation. [ #00]
+12/15 F Inconsistent use of ACESS events. [#791]
+12/27 F Module error strings were outdated. [#810]
+
+Provided by Trystan <trystan@nomadirc.net> - 2007
+08/29 F Module runtime directory not always properly cleaned up. [#768]
+09/24 F ModuleGetConfigDirective having issues with CRLF line-ends. [#787]
+
+Provided by nenolod <nenolod@nenolod.net> - 2007
+08/29 F TS6 UID generation for Charybdis. [#731]
+
+Provided by Jilles Tjoelker <jilles+anope@stack.nl> - 2007
+12/28 F Wrong TS sometimes sent in SJOIN. [#685]
+
+Anope Version 1.7.19
+--------------------
+01/01 A Support for InspIRCd 1.1. [ #00]
+01/02 F Issues with both InspIRCd protocol modules. [ #00]
+01/02 F Error reporting on LIST commands accepting ranges. [#622]
+01/02 F ChanServ LIST now searches for '#chan' if only 'chan' is given. [#622]
+01/06 F Missing backtick in SQL query for saving news items. [ #00]
+01/06 F Some OperServ commands not respecting OSOpersOnly when disabled. [#657]
+01/06 F MySQL code not always reporting Services Root flags correctly. [#659]
+01/10 F Minor syntax error in anoperc. [#665]
+01/10 F CHAN_SYMBOL_REQUIRED claimed one can register local (&) channels. [#666]
+01/10 F BotServ kicks now obeys the channel's SignKick option. [#663]
+01/15 F Only send PONG during MySQL save when we're not syncing. [#669]
+01/15 F InspIRCD 1.1 protocol module used windows incompatible strtok_r. [#667]
+01/22 F Crash during first save when MySQL is enabled. [#672]
+03/03 F SAs can no longer move other SAs down to ServicesOpers. [#690]
+03/03 F We now send out UNKLINE on hybrid when /os akill del is issued. [#656]
+03/14 F /os modunload dosnt clear moduleData before calling AnopeFini. [ #00]
+03/18 F DefCon's AKILL will now honor the server's sync flag. [#643]
+03/18 F Password length checking in some cases was out. [ #00]
+04/21 F DefCon did not force DefCon modes while in DefCon mode. [#661]
+04/21 F Event ACCESS_DEL not sent on mass-deleted in cs_xop. [#706]
+06/04 F prenick database was not backed up. [#713]
+06/04 F Typo in SQL query in rdb.c [#719]
+06/04 F remove_backups() did not check that s_Bot/HostServ != NULL. [ #00]
+06/09 F NSDefMsg can now only be enabled when UsePrivmsg is enabled. [#671]
+06/09 F NSDefMsg now controls send behaviour for unregistered users. [#671]
+
+Provided by Jan Milants <jan_renee@msn.com> - 2007
+04/21 F Array count decremention in the ChanServ access lists. [#662]
+04/21 F Swapped ACCESS_ADD and ACCESS_CHANGE events in cs_xop. [#705]
+
+Provided by Jilles Tjoelker <jilles+anope@stack.nl> - 2007
+04/21 F Various Charybdis and TS6 related fixes. [#707]
+
+Anope Version 1.7.18
+--------------------
+12/09 A Ability to see if AutoOp is enabled in NickServ INFO displays. [#621]
+12/12 A EVENT_BOT_KICK and EVENT_BOT_BAN added for modules. [ #00]
+10/17 F Encryption, users can now pick none, old, md5 or sha1. [ #00]
+10/18 F MLock support for +c was missing on ultimate3. [ #00]
+10/20 F Error message when unable to register due to NSRegDelay. [#616]
+10/21 F SVSPART sends SVSPART instead of EOB. [#617]
+11/02 F HostServ REQUEST module no longer returns MOD_STOP. [ #00]
+11/02 F AnopeRC sends correct signals. [#623]
+12/07 F BotServ KICK incorrectly reported assigned status of bots. [#632]
+12/07 F Windows install.js script is now able to check multiple drives. [#634]
+12/09 F Reviewed and updated all of the MySQL code. [ #00]
+12/09 F Langfiles had CHANAKILL instead of CHANKILL in syntax lines. [#640]
+12/10 F NickServ ALIST not accepting Founder as level param. [#629]
+12/10 F EVENT_TOPIC_UPDATES was not always sent when it should be. [#641]
+12/24 F anoperc sends SIGTERM for restart and uses command line params. [#645]
+12/24 F Nickname changes were not recognised on TS6-based IRCd's. [#646]
+12/24 F Small typo in CHAN_REGISTER_NONE_CHANNEL. [#647]
+12/24 F Display error messages when RDB functions fail. [ #00]
+12/27 F ModuleNoticeLang was printf'ing twice. [#650]
+12/27 F Module (un)loading was only giving error numbers, not messages. [#652]
+12/29 F Channel joins logged twice on some IRCd's with debug mode on. [#651]
+12/29 F Botserv incorrectly attempted to remove bans with BSSmartJoin [#653]
+
+Anope Version 1.7.17
+--------------------
+10/15 F MySQL detection now checks for valid values from mysql_config. [ #00]
+10/15 F Correctly compiling mod_version with module options now. [ #00]
+10/16 F MySQL functions did not always escape all values correctly. [#612]
+10/16 F Made anoperc restart to accepts arguments like anoperc start. [#611]
+10/16 F MySQL query debug quoted displayed queries just a tad too much. [ #00]
+10/16 F MySQL query error in RDB functions. [ #00]
+10/17 F Erroneous code caused MySQL to store all passwords as blank. [#614]
+10/17 F Saving of ttb-data when using MySQL. [ #00]
+
+Anope Version 1.7.16
+--------------------
+Provided by Anope Dev. <dev@anope.org> - 2006
+09/10 A Added SASET AUTOOP to NickServ to match SET AUTOOP. [#588]
+09/11 A Added detection in install.js for the latest PlatformSDK. [#596]
+09/29 A Ability for modules to backup their databases. [#604]
+10/07 A IRCDs supporting SVSMODE now have it parsed as MODE. [#603]
+08/09 F Fixed port checking when using command line switches. [#575]
+08/14 F Fixed db_mysql_query for better robustness. [#585]
+08/27 F Fixed mod_current_module being incorrect resulting in segfault. [#593]
+09/10 F Issues with make strict for the src/tools dir. [#579]
+09/10 F Help for NickServ SET AUTOOP was missing. [#587]
+09/10 F Added HOP to the /CS ACCESS error when XOP is enabled. [#598]
+09/10 F MySQL no longer connects again on each query. [#595]
+09/10 F Nick Enforcers can now be whois'd on services. [#601]
+09/10 F Corrected valid nick characters for /OS SVSNICK. [#599]
+09/17 F Small mistakes in Dutch language file. [ #00]
+09/23 F Restarting under Windows now works correctly [#589]
+09/25 F Make now works with multiple threads. [ #00]
+09/28 F We will now process UnrealIRCd's SVS(2)MODE messages. [#603]
+09/29 F The 'nmake clean' on Windows now uses 'spotless' instead [ #00]
+09/29 F Fixed a typo in Makefile.win32 [ #00]
+10/07 F BotServ KICK CAPS now only counts alphabetic chars for percentage.[#607]
+10/09 F Removed LANGUAGE from the SASET help in most languages. [#609]
+
+Provided by Trystan <trystan@nomadirc.net> - 2006
+08/20 F Fixed several compiler warnings. [#586]
+08/20 F Fixed several compiler warnings. [#584]
+08/20 F log.c rewrite. [#582]
+08/20 F Fixed bsd compier warning. [#578]
+09/10 F Fixed mass compiler warnings on FC5 with make strict. [#583]
+
+Provided by ThaPrince <jon@vile.com> - 2006
+08/22 F Plexus3 svid_mode3 support fixed. [ #00]
+08/23 F Plexus3 syncing after remote netjoins issue. [ #00]
+09/08 F Plexus3 noop support. [ #00]
+
+Anope Version 1.7.15
+--------------------
+Provided by Anope Dev. <dev@anope.org> - 2006
+06/14 A Indication in the version string if we're running on win32. [ #00]
+06/20 A Added support for Visual Studio 2005. [#408]
+06/22 A Ability for ircd modules to set extra modes on id. [ #00]
+06/22 A Support startup flag. [ #00]
+06/21 A Module version check. [ #00]
+06/25 A Optional strict privmsg format. [ #00]
+07/15 A Added BOT_LONG_IDENT for too long idents. [#538]
+07/10 A Moved ns_noop into core and assigned an NI_ flag. [#423]
+08/06 A Option to modules_unload_all() to say if we should unload proto. [#552]
+07/22 R Removed clone stuff. [ #00]
+04/08 F Fixed Charybdis support on win32. [#487]
+04/08 F Fixed thread stuff on windows. [#488]
+04/08 F Fixed SGLine stuff on inspircd (not supported). [#489]
+04/20 F Fixed index of backtrace(). [#499]
+04/29 F Added is_on_chan() check for fantasy kick commands. [#501]
+05/13 F Fixed memleak in moduleGetConfigDirective(). [#504]
+05/16 F Suspended nicks and chans won't expire from now on. [ #00]
+05/25 F NICKIP/NICKv2 support on unreal32. [#507]
+05/25 F src/bin/register being too case sensitive on YES. [#500]
+05/25 F src/bin/register still said ./configured instead of ./Config . [ #00]
+05/25 F Q:Line not added for bots when only changing nicks. [#493]
+06/03 F Removed INTTYPE_WORKAROUND stuff which could cause warnings. [#509]
+06/03 F Fixed compiler warnings. [#511]
+06/10 F Win32 Makefile for plexus3 support. [#520]
+06/11 F Two pointers in modules.c weren't NULL-ified by default. [ #00]
+06/11 F Updated InspIRCd protocol support module. [ #00]
+06/11 F Module Clear Error macro was broken on *BSD. [#515]
+06/13 F Walking memory using wrong pointer in moduleGetConfigDirective. [#516]
+06/13 F Added cleanup code to tools/anopesmtp. [#464]
+06/13 F Fixed a lot of redundant function declarations. [#510]
+06/14 F Removed last traces of threading support. [#498]
+06/14 F Changed mysql detection to use mysql_config. [ #00]
+06/15 F OpenBSD Config issue. [#519]
+06/15 F langcomp with _GNU_SOURCES defined. [ #00]
+06/16 F Fixed several memleaks in ns_noop.c. [ #00]
+06/16 F Fixed typo in function name. [#524]
+06/18 F Removed legacy my_vsnprintf code. [#496]
+06/18 F HOP cannot remove VOPs anymore to be consitent with adding. [#525]
+06/18 F Moduledata was cleared before calling AnopeFini. [#523]
+06/20 F Make does not recompile everything even on no change anymore. [ #00]
+06/20 F Versions in win32.rc are now updated correctly. [#526]
+06/21 F Syntax for NickServ SET MSG showed syntax for SET PRIVATE. [ #00]
+06/26 F A few small bugs with module configure scripts. [ #00]
+07/02 F Fixed readonly stuff on memoserv del. [#529]
+07/13 F Fixed socket buffering, hopefully should make inspircd play nice. [ #00]
+07/14 F Removed old HAS_RTLD_LOCAL check. [#541]
+07/20 F Removed bold chars from botserv langauge files. [#530]
+07/20 F Fixed win32 versions of db-merger.c and epona2anope.c. [#536]
+07/20 F db-merger.c and epona2anope.c will now properly delete old dbs. [ #00]
+08/02 F Fixed very nasty typecast. GCC Hardened should now work. [#557]
+08/03 F Corrected usermodes for ratbox and shadow. [#558]
+08/04 F Various small fixes for Charybdis. [#561]
+08/04 F Autovoice for unregistered users works again. [#569]
+08/05 F Support for SVSJOIN/SVSPART/SWHOIS in protocol modules. [#566]
+08/05 F os_info save on unload. [#523]
+08/05 F Externed doValidHost call for modules to use. [#570]
+08/05 F Lang files now support %R for use with StrictPrivMsg. [#565]
+08/06 F Segfault when shuting down anope. [#491]
+08/06 F Fixed typos in cs_appendtopic.c. [#571]
+08/06 F TSMode support for ratbox; TS6 works for ratbox now. [#563]
+08/07 F Increased langauge buffer size. [#572]
+08/08 F Fixed integer types in db-merger.c. [#573]
+
+Provided by ThaPrince <jon@vile.com> - 2006
+05/19 A Plexus 3 support. [ #00]
+08/07 F Plexus 2/3 updates, registered nick format. [ #00]
+06/25 F root/admin/oper mode now honours secure. [ #00]
+
+Provided by Trystan <trystan@nomadirc.net> - 2006
+06/15 F NS Resend delay. [ #00]
+07/02 F Fixed module version stuff. [#531]
+07/14 F Another version fix. [#545]
+07/15 F Fixed max param count for SJOINs. [#549]
+07/15 F Fixed !halfop fantasy stuff. [#534]
+07/25 F Fixed /newmask stuff for ptlink. [#560]
+07/14 A Added anope_cmd_action() and new param for EVENT_PART_CHANNEL. [#550]
+
+Anope Version 1.7.14
+--------------------
+Provided by Anope Dev. <dev@anope.org> - 2006
+02/04 A Events for channel kicks and NickServ logout. [ #00]
+03/02 A Added support for TS6 Save (FNC) on ratbox, shadow and charybdis. [#424]
+03/07 F Counting issue in /os stats uplink. [#468]
+03/02 F BotServ/HostServ are no longer loaded when they are disabled. [#440]
+03/01 F Added ircd module support for valid_chan. [ #00]
+03/01 F Minor issues in ns_saset. [#455]
+02/13 F Yet anotehr 64bit issue. [ #00]
+01/14 F SGLines will now be removed correctly. [ #00]
+01/26 F Export buildStringList() for modules. [#425]
+02/11 F Fixed a few memleaks. [#420]
+02/17 F cs_getpass will now unload if encryption is enaled. [ #00]
+02/19 F Fixed position of EVENT_ACCESS_DEL. [ #00]
+03/01 F Fixed ident check on /bs bot change. [#463]
+03/01 F Fixed # prefix check on /cs forbid. [#461]
+03/01 F Fixed events on /join 0. [#417]
+03/01 F Added NULL checks to add_invite and add_exception. [#419]
+03/01 F Fixed suspend check on /cs invite. [#429]
+03/01 F Fixed memleaks in some protocol files. [#434]
+03/01 F Fixed bot check on /bs unassign. [#446]
+03/01 F Fixed wasteful finduser() call in os_oline.c. [#457]
+03/01 F Fixed memleak in runDefCon(). [#451]
+03/01 F Fixed function type of get_xop_level. [#459]
+03/01 F Prevented registration of UnrealIRCd's "local" channels. [#456]
+03/01 F Fixed bug in moduleNoticeLang(). [#421]
+03/01 F Made should_mode_change() extern. [#436]
+03/01 F Made add_ns_timeout() static. [#438]
+03/01 F Fixed memleak in os_mode.c. [#444]
+03/01 F Fixed memleak in do_mass_mode(). [#450]
+03/01 F Fixed memleaks in cs_list.c, hs_list.c and ns_list.c. [#447]
+03/01 F Fixed memleaks in hs_set.c. [#441]
+03/02 F Fixed missing TS6 functionality in channels.c. [#418]
+03/02 F Fixed possible overflow in process(). [#445]
+03/02 F Fixed memleak in do_cmode(). [#430]
+03/03 F Rage, Bahamut and Viagra will now use the correct server desc. [#467]
+03/03 F Fixed botserv's mode behaviour with protect umode. [#333]
+03/18 F Fixed sstrdup() with NULL argument in cs_akick.c. [#460]
+03/18 F Fixed charybdis umodes. [#471]
+03/19 F Fixed a gcc4 compiling issue. [#453]
+03/21 F Fixed bot check on /bs kick. [ #00]
+03/23 F Fixed some obsolete defines. [#390]
+
+Provided by nenolod. <nenolod@nenolod.net> - 2006
+02/03 A Support for Charybdis IRCd. [ #00]
+02/12 F more va_list issues for 64bit platforms. [ #00]
+01/15 F va_arg issue on various 64bit platforms. [#415]
+
+Provided by illu. <illu@rs2i.net> - 2006
+01/25 F Updated the french language file. [ #00]
+
+Provided by Trystan <trystan@nomadirc.net> - 2006
+03/18 A New icon file for anope win32. [#472]
+03/14 A Anope will now terminate on Win98. Added version check. [#473]
+03/01 A Clarity on module loading status numbers. [#435]
+03/24 F Fixed segfault on /bs change. [#483]
+03/22 F Fixed distclean in all Makefiles. [#481]
+03/19 F Fixed some gcc4 compiling issues. [#453]
+03/18 F Fixed closing of file pointer in langtool.c. [#478]
+03/14 F Fixed gcc switches for modules. [#474]
+03/12 F moduleGetLastBuffer() returning NULL on alias and pseudo clients [#476]
+03/12 F nickIsServices() returns correctly for aliases [ #00]
+03/05 F Fixed moduleNoteiceLang() issue. [#469]
+03/01 F Applied ultiamte3 chan sqline patch. [#412]
+03/01 F Crash when not giving user for moduleGetLangString. [#454]
+02/23 F Usermatching possible null arg on sstrdup. [ #00]
+02/20 F Fixed some TS6 issues with do_cmode() and do_nick() [#396]
+02/12 F Double unbanning of in certain conditions. [ #00]
+01/25 F va_copy issue for various platforms. [ #00]
+
+Provided by ThaPrince <jon@vile.com> - 2006
+02/28 F fantasy kick now honours protected, just like cs versions. [ #00]
+
+Provided by Brain <brain@inspircd.org> - 2006
+03/01 F Updated inspircd protocol files. [#422]
+
+Provided by Monk <monk@mindforge.org> - 2006
+03/22 U Updated de.l. [#482]
+
+Anope Version 1.7.13
+--------------------
+Provided by Anope Dev. <dev@anope.org> - 2005
+12/26 F Generating language.h failed on certain setups. [ #00]
+12/11 F First user on HelpChannel always got +h, even without access. [#405]
+12/02 F Missing quitmessage when catching unknown signals. [ #00]
+11/14 F Added a check for nickchars before trying to use them in /os stats[ #00]
+11/08 F Remove tmp modules from runtime folder when we can. [ #00]
+11/02 F !protect/!deprotect no longer work for a number of ircds. [#403]
+11/02 F segfault when os modloading a non-existing module. [ #00]
+11/01 F /os reload - BSFantasyChar was not sstrduped if not defined. [ #00]
+10/30 F Updated docs/FAQ. [ #00]
+
+Provided by Trystan <trystan@nomadirc.net> - 2005
+11/19 F find_byuid for ircds which didnt give us a uid. [ #00]
+01/22 F Updated config.guess and config.sub [ #00]
+
+Provided by Vladimir K. <wawaka@gmail.com> - 2005
+12/11 F Enforcers had incorrect user when only user specified. [#410]
+
+Provided by Brain <brain@inspircd.org> - 2005
+12/26 A InspIRCd 1.0 Beta 6+ support module to replace old (b3) support. [ #00]
+
+Anope Version 1.7.12
+--------------------
+Provided by Anope Dev. <dev@anope.org> - 2005
+10/01 A Information on uplink server can be displayed via OperServ STATS. [ #00]
+09/29 A Configuration option to change fantasy command prefix character. [ #00]
+09/28 A Event for fantasy commands triggered without channel access. [ #00]
+10/25 F Memleaks and not removing tempfiles on failed module loading. [ #00]
+10/25 F Help response for os random news was using opernews text. [ #00]
+10/05 F Changed NickLen and BSFantasyChar into recommended and optional. [ #00]
+10/04 F Added missing hs_request to win32 modules makefile. [ #00]
+10/03 F Changed error on identical userkeys into a warning. [ #00]
+10/02 F Added check in OperServ stats to avoid segfault without param. [ #00]
+10/02 F Numeric 219 didn't give correct letter for STATS u. [ #00]
+10/02 F ChanServ HOP was available on IRCDs without halfop support. [ #00]
+10/01 F Placed capab tokens and flags into a table for easier handling. [ #00]
+10/01 F Capab parsing on hybrid/plexus/ratbox failed. [ #00]
+10/01 F Typo in example.conf (DevNullAlias was called DevNullName). [ #00]
+10/01 F UserKeys gave an error without message when missing. [ #00]
+09/30 F Stripping fantasy character from fantasy commands. [ #00]
+09/28 F Made module (un)loading code more friendly for modularized core. [ #00]
+09/28 F NickServ SASET didn't fill the nick in the 'not registered' line. [ #00]
+
+Provided by Hal9000 <hal9000@pimpmylinux.org> - 2005
+09/28 F Updated Italian language file. [ #00]
+
+Provided by Cloud <cloud@shortcut.game-host.org> - 2005
+09/28 F Updated German translation for cs_appendtopic. [ #00]
+
+Anope Version 1.7.11
+---------------------
+Provided by Anope Dev. <dev@anope.org> - 2005
+09/01 A Function to retrieve a module language string. [ #00]
+08/21 A NickServ SASET to set options on other nicks (split from SET). [ #00]
+08/10 A New Windows installation files. [ #00]
+07/04 A Warning when running Anope as root (DON'T DO THAT! :)). [ #00]
+07/01 A Events for channel access/xop updates. [ #00]
+06/26 A New module pack module: hs_request. [ #00]
+06/03 A Protocol files can now fill mod_current_buffer with custom code. [#389]
+09/25 F Missing End If in install.vbs. [ #00]
+09/24 F Typo in English language file. [ #00]
+09/21 F Segfault when find_byuid() was called with a NULL argument. [ #00]
+09/20 F Ident length checking when adding a bot was broken. [ #00]
+09/20 F No response was giving when trying to load a non-existing module. [ #00]
+09/18 F Last host was not always correctly set to a vHost if applied. [ #00]
+09/14 F Various issues with handling the version identifiers. [ #00]
+09/13 F make strict/profile now work for core and protocol files. [ #00]
+09/13 F Unused variables removed from modules.c. [ #00]
+09/11 F Disallow botnicks longer than the net's max nick length. [ #00]
+09/09 F Giving some more error output when opening a database fails. [ #00]
+09/04 F Protocol module for plexus called wrong UNSGLINE function. [ #00]
+08/31 F Help for /os modlist had faulty 'limited to' information. [ #00]
+08/30 F Changed UserKeys to RECOMMENDED instead of REQUIRED. [ #00]
+08/29 F Pseudo-clients can now part with no instead of an empty reason. [ #00]
+08/29 F Memory leak when using mysql to save data. [ #00]
+08/29 F Organised docs/FAQ a bit more and slightly restyled it. [ #00]
+08/25 F Compiler warnings in tools with gcc4. [ #00]
+08/21 F Default config location in example.conf was wrong. [ #00]
+08/10 F Few memleaks in bundled os_info module. [ #00]
+08/07 F NS SET sometimes seeing options as nicks. [ #00]
+08/05 F Bot max nick length limited by NICKMAX now. [ #00]
+07/07 F Typing mistake in module error message. [ #00]
+07/07 F Clarified comments for SendmailPath regarding -t option. [ #00]
+07/02 F Module languages now default to NSDefLanguage, not English. [ #00]
+07/02 F Various compile warnings when using AMD64. [ #00]
+07/01 F Modules will now be properly unloaded on shutdown. [ #00]
+07/01 F Modules now use a more random filename in the runtime folder. [#400]
+07/01 F Most core compile warnings when using make strict. [ #00]
+07/01 F Requesting a -version on startup doesn't require a valid config. [ #00]
+06/04 F Register script now works again. [#394]
+06/04 F Finishing sync for Ultimate3 was not done correctly. [#398]
+06/03 F Moved checks for UseTokens, UseTS6, and Numeric. [#385]
+06/03 F Load protocol module before launching listnicks/listchans. [#391]
+05/29 F operserv opernews dispalys the correct help now. [#386]
+05/27 F Updated docs/FAQ. [ #00]
+05/25 F Segfault when clearing non-existing nick '0' from ignore list. [#383]
+05/25 F Removed a double extern definition of rdb_tag_table. [#381]
+05/25 F Fixed mydbgen so it sends the pass and installs in the data dir. [ #00]
+05/25 F Not all nick options were displayed in listnicks. [#380]
+
+Provided by Ricardo <ricardoltdb@gmail.com> - 2005
+06/25 A Portugese translation for hs_request. [ #00]
+05/30 F Updated Portuguese language file. And bundled modules language. [ #00]
+
+Provided by Trystan <trystan@nomadirc.net> - 2005
+09/21 F Various fixes in hs_request. [ #00]
+09/21 F NormalizeBuffer() strips CR/LF as well now. [ #00]
+09/18 F Removed color codes for tools on win32. [ #00]
+09/18 F MySQL detection for win32 in install.vbs had issues. [ #00]
+09/18 F Memleak when AddAkiller was enabled. [ #00]
+09/13 F Reduntant IRCD defines removed. [ #00]
+09/13 F Double Makedile generation. [ #00]
+09/06 F Memory for vHosts/vIdents was not (always) being freed. [ #00]
+06/04 F Removed ircd-file related code from configure(.in) [#384]
+
+Provided by DrStein <drstein@anope.org> - 2005
+08/30 A anoperc is now configured by the Config script [ #00]
+
+Provided by Hal9000 <hal9000@musichat.net> - 2005
+06/27 A Italian translations for modpack modules. [ #00]
+06/25 F Updated Italian language file. [ #00]
+
+Provided by ThaPrince <jon@vile.com> - 2005
+09/06 A SGLINE support for plexus. [ #00]
+09/10 F Sending XLINEs with plexus was broken. [ #00]
+09/06 F Missing sources and other minor issues with plexus. [ #00]
+09/04 F SGLINE/SQLINE for ratbox/plexus/etc needs a valid nick. [ #00]
+
+Provided by Certus <> - 2005
+09/11 F Took care of an overflow and data corruption. [ #00]
+
+Anope Version 1.7.10
+--------------------
+Provided by Anope Dev. <dev@anope.org> - 2005
+05/23 F Updated install.vbs to detect SDK paths. [ #00]
+05/22 F Removed trailing space for whois output. [ #00]
+05/17 F Compiling on solaris and amd64 systems. [ #00]
+05/13 F Possible segfault with do_part by using freed memory. [#379]
+05/13 F Long hosts got cut off when setting topic and host was recorded. [#377]
+05/12 F NSListOpersOnly works correctly. [#375]
+05/12 F Using variable for EVENT_PART_CHANNEL after freeing it. [#374]
+05/11 F Unable to make when using an old shell. [#369]
+05/10 F AnopeFini was called without mod_current_module_name set. [#371]
+05/10 F Unidentified users now have level -1 instead of 0 again. [#372]
+05/09 F Segfault in ns_maxemail when user's email not set. [ #00]
+05/06 F Compiler warnings when using make strict. [ #00]
+05/06 F Segfault in os_clearmodes when chan had invites (+I) set. [#357]
+05/06 F Identified founders are now logged out if the channel is dropped. [#364]
+05/06 F Founders identified by pass can get founder chanmode again. [#358]
+05/05 F Segfault in ns_maxemail when passing wrong param count. [ #00]
+05/05 F ULined servers still got their modes removed with SecureOps on. [ #00]
+05/05 F Missing access checks when removing modes due to SecureOps. [#366]
+
+Provided by crazytoon <crazy@anope.org> - 2005
+05/08 A Updated German language file. [ #00]
+05/08 A German translation for all modulepack modules [ #00]
+05/08 F Removed "IRCDFILE" from the Makefile's [ #00]
+05/10 F Removed BOT LIST from BOT_BOT_SYNTAX [ #00]
+
+Provided by Sascha Just <bugs.anope@nmg.own-hero.de> - 2005
+05/13 F Nicer used of fgets, dont free the buffer. [#378]
+
+Anope Version 1.7.9
+-------------------
+Provided by Anope Dev. <dev@anope.org> - 2005
+05/03 A Dutch translation for all modulepack modules, where needed. [ #00]
+04/30 A Modulepack with a few useful modules which are loaded by default. [ #00]
+04/30 A Modularized all BotServ fantasy commands. [ #00]
+04/30 A Event EVENT_PART_CHANNEL for when users part a channel. [ #00]
+04/30 A Event EVENT_JOIN_CHANNEL for when users join a channel. [ #00]
+04/25 A Support for multiple lines in module language texts. [ #00]
+04/25 A Multi language module support. [ #00]
+04/22 A Option to make OperServ configurable oper-only or not. [ #00]
+04/21 A Events now accept argc/argv making them more useful/expandable. [ #00]
+04/20 A Fully modular core now in place, including dynamic help. [ #00]
+04/16 A Module subfolders now check configure executed if it exists. [ #00]
+04/14 A Added EVENT_BOT_CMD for !commands in a botserv fantasy channel. [ #00]
+04/14 A Added EVENT_RELOAD for config reloads. [ #00]
+04/13 A moduleGetConfigDirective to allow config files access to the conf.[ #00]
+04/12 A IRCD Protocol Module support. [ #00]
+03/25 A Added nickserv suspend/unsuspend command. [ #00]
+03/25 A Added check for UID in anoperc. Stops running as root. [ #00]
+03/11 A Event for database backups. [ #00]
+03/09 A Documentation on the proxy detector in docs/PROXY. [ #00]
+03/03 A ShadowIRCD 4.0 beta 7 support added. [ #00]
+02/27 A Added multi-file module support. [ #00]
+02/13 A Internal Event support, see EVENTS in the doc folder for help [ #00]
+02/05 A Support for Unreal 3.2 +I channel mode. [ #00]
+02/03 A Merged anope-win32 branch into the main, now Win32 ready. [ #00]
+05/04 F vHost handling with PTlink was broken in a subtle way. [#352]
+05/04 F Missing check for valid ChannelInfo in topic handling. [#363]
+05/04 F Module language texts sometimes being mixed. [ #00]
+05/04 F Wrong datatype in the config parser for OSInfoDBName. [ #00]
+05/03 F Wrong variable checking in anope_event_away(). [ #00]
+05/02 F Wrong use of anope_cmd_mode() for dreamforge and ultimate2. [#332]
+05/02 F Usermode +R instead of +Z used for services roots with Ultimate3. [#361]
+05/02 F Getting op if you had access to protect and not op on a channel. [#355]
+05/01 F Typo in include/extern.h with restore_unsynced_topics. [#354]
+05/01 F Modes with no arguments where required no longer set with OS mode.[#316]
+05/01 F Update win32 documentation and files so it works again. [ #00]
+04/30 F Removed newline after BOT_SEEN_UNKNOWN in most languages. [ #00]
+04/30 F Updated docs/EVENTS for change to argc/argv and new events. [ #00]
+04/27 F Rob's spelling mistakes. It's language, not langauge! [ #00]
+04/25 F Displaying help texts with module language system. [ #00]
+04/24 F Call to sstrdup() with NULL-args if empty topic was set. [ #00]
+04/24 F Event for topic changes only being sent for registered channels. [ #00]
+04/24 F Buffer normalization not checking allocated memory for errors. [ #00]
+04/21 F Updated example modules to use id strings as versions. [ #00]
+04/21 F Renamed EVENT_BOT_CMD to EVENT_BOT_FANTASY. [ #00]
+04/19 F Updated docs/FAQ. [ #00]
+04/19 F Case sensitive tokens for ircd modules actaully work now. [ #00]
+04/16 F Events no longer cause a segfault after being modunload-ed. [ #00]
+04/14 F When setting multiple ops, SecureOps will check each user. [#342]
+04/12 F Users channel modes are correctly set on join. [#342]
+04/11 F Make sure nick isn't in use on nickserv collide. [#341]
+04/07 F Added channel names to XOP/ACCESS/AKICK CLEAR [#346]
+04/07 F Only users with vHost/vIdent can /hostserv off [#351]
+04/01 F Sync state for leaf-servers not updated correctly. [ #00]
+03/30 F ChanServ now sets topic again when channel is re-created. [#339]
+03/29 F Changed anoperc script to use kill numerics for compliance. [ #00]
+03/28 F Moved where GlobalOnCycleUP is located so it now works. [#336]
+03/28 F Fixed the change display name function to update correct db table.[#337]
+03/28 F Changed the ultimate3 usermode for SRA. [#326]
+03/28 F Segfault on joining unregistered channels in some cases. [#327]
+03/28 F Adding and removing modes are now merged per user while syncing. [#329]
+03/28 F Modes not being correctly removed from all users. [#335]
+03/28 F Topics not always set on channel creation. [#334]
+03/26 F stripModePrefix not checking if it was stripping a mode prefix. [ #00]
+03/26 F Memleak in nickIsServices() [ #00]
+03/22 F Wrong behaviour of /ns update for channel founders. [#323]
+03/21 F Topics being set too often during bursts. [ #00]
+03/16 F Send the correct numeric for a missing MOTD file. [#315]
+03/16 F Wrong modes being set in certain cases with SJOIN. [#320]
+03/14 F Two normalized strings not being freed. [#314]
+03/14 F Various minor mistakes (see bugreport for full list). [#313]
+03/14 F Sync state of servers was not recorded reliable enough. [ #00]
+03/12 F Services setting already set channel modes. [ #00]
+03/12 F Not displaying entrymessage/greets on (re-)sync of uplink anymore.[ #00]
+03/12 F Sync state for uplink server not being set correctly. [ #00]
+03/11 F EVENT_BOT_ASSIGN now reports channel name instead of bot nick. [ #00]
+03/08 F Display of real host instead of vhost on alog(). [ #00]
+03/07 F tolower/toupper compiler errors on Win32. [ #00]
+03/06 F Services not remove modes correct in some cases. [#308]
+03/06 F Protected Umode users are protected from bans. [#311]
+03/05 F Added UPDATE to ns help menu [ #00]
+03/05 F Updated Unreal 3.2 token support. [#310]
+03/03 F Numeric in the config is now a string not an int [ #00]
+03/02 F Fixed LogUser message, normalizes the "realname" on nick change. [#306]
+03/02 F ircd protocol support for owner and admin taken from proto. files.[ #00]
+03/02 F /ns alist output. [#288]
+02/28 F normalizeBuffer() now strips two digit color codes [#303]
+02/28 F nickIsServices() no longer alters the buffer [#304]
+02/22 F Uninitialized variable in NickServ DROP. [ #00]
+02/22 F Remote whois sending incorrect numeric back. [#301]
+02/22 F Several OperServ commands not respecting NickServ SET MSG. [#302]
+02/21 F Updated documentation for one style and small fixes. [ #00]
+02/13 F nickIsServices() works if format is nick@services [ #00]
+02/12 F Win32 builds can now build with encryption [ #00]
+02/10 F mod_current_buffer was not set in all possible cases [#296]
+02/07 F Updated userkey information in example.conf. [ #00]
+02/06 F Win32 Module Load Errors. [#294]
+02/05 F Change Ident function did not update the vident. [#293]
+01/30 F ChanServ help to reflect the avaiable commands. [ #00]
+01/30 F ChanServ used some commands that were not valid on all ircds. [ #00]
+01/30 F Compiling modules under Mac OSX. [#285]
+03/07 R Removed Proxy Detector from core. [ #00]
+
+Provided by Brain <brain@inspircd.org> - 2005
+04/18 A InspIRCd 1.0 Beta 3 support module. [ #00]
+
+Provided by Trystan <trystan@nomadirc.net> - 2005
+04/07 F Win32 now includes SVN revision in version [#328]
+03/16 F Shadowircd nick handling and vhost changing [#321]
+03/14 R Removed some old irc-services convertor ifdef's [#317]
+
+Provided by DrStein <drstein@anope.org> - 2005
+04/07 A NickServ's ALIST won't accept invalid access levels for min_level [ #00]
+03/22 A Compiling extra tools (db-merger, epona2anope) [ #00]
+03/17 A Improvements on Config script. [ #00]
+03/17 A OS SET SQL ON shall warn about SQL disabled in services.conf [ #00]
+03/15 A ChanServ will now include the channel name in SET's responses [#318]
+05/01 F Fixed small typo in data/example.conf for OSInfoDBName. [ #00]
+05/01 F Updated modpack ns_noop to fix a few bugs. [ #00]
+04/21 F alog() in ns_group wich was storing the wrong suspended nick. [#343]
+04/21 F NS SUSPEND now uses the same reason for the whole group. [#343]
+04/12 F Introduction text data file was missing. [ #00]
+04/07 F NickServ shall give the correct response to GLIST/ALIST [#345]
+03/15 F ChanServ's do_getkey() function is now using notice_lang() [#319]
+03/14 F Updated docs/FAQ. [#312]
+03/09 F Updated Spanish language file (es.l). [ #00]
+
+Provided by Scott 'Simba' Garron <simba@anthrochat.net> - 2005
+03/21 F Identical topics still being re-set if TOPICLOCK on. [ #00]
+
+Provided by Ricardo <ricardoltdb@gmail.com> - 2005
+03/08 F Updated Portuguese language file. [ #00]
+
+Provided by crazytoon <da.crew@gmx.net> - 2005
+04/07 A Updated German language file. [ #00]
+04/30 F gcc4.0 compiler errors. [ #00]
+04/04 F Installation of mydbgen. [ #00]
+04/04 F SolidIRCd code did not recognize channelmodes +S and +N. [#331]
+
+Provided by BarkerJr <barkerjr@barkerjr.net> - 2005
+02/05 A Setting and Removal of SQLINEs on forbid of Channels and Nicks. [ #00]
+
+Provided by nenolod <nenolod@gmail.com> - 2005
+04/07 F Numerous ShadowIRCD fixes [ #00]
+
+Anope Version 1.7.8
+-------------------
+Provided by Anope Dev. <dev@anope.org> - 2005
+01/23 A Support for Ratbox IRCD (With and Without TS6). [ #00]
+01/23 A Support for TS6 protocol. [ #00]
+01/19 A Add simple smtp client, read the README in src/tools for info. [ #00]
+01/16 A Support for PTlinks VHOST (NEWMASK) command. [ #00]
+01/16 A Ulines Servers are now except from NOJOIN bans. [#281]
+01/29 F Fixes help for HS HELP LIST. [#290]
+01/29 F Memoserv rsend issue. [#291]
+01/23 F Fixed u_char warnings under OpenBSD. [ #00]
+01/23 F anope_cmd_ctcp() fixed it was setup wrong. [ #00]
+01/23 F Checks to make sure Services and Services Alias are not the same [ #00]
+01/23 F SIGINT now shuts down Anope correctly when running with -nofork. [ #00]
+01/23 F Attempting to set +h (helper) modes on ircd where there is no +h [ #00]
+01/23 F Fixed problem when dealing with non-existant user privmsg. [ #00]
+01/23 F Updated IRCD, FAQ, README to be more current. [ #00]
+01/23 F Free's memory on shutdown that is in the User and Channel structs [ #00]
+01/20 F Misplaced MEMO_NO_RSEND_SELF in es.l reordered. [ #00]
+01/19 F OperServ HELP does not show commands not usable on that ircd. [ #25]
+01/16 F Help messages restricted to the right access level. [#272]
+01/16 F Updated IGNORE system to allow ircops past in all areas. [#275]
+01/16 F Help for /OS SET IGNORE. [#271]
+01/16 F Updated language files to show the correct vhost character. [#278]
+01/16 F Disables UseRDB when MysqlSecure is enabled. [#276]
+01/16 F BS bots no longer flood resetting modes if its the same mode. [#263]
+01/16 F IRCops are now except from KillonSQline and KillonSGline. [#274]
+01/16 F BS Badwords had a false positives if BSCaseSensitive wass enabled [#277]
+01/15 F Updated typo in example.conf. [#279]
+
+Provided by Ricardo <ricardoltdb@gmail.com> - 2005
+01/20 F Completely updated pt.l language file. [ #00]
+
+Anope Version 1.7.7
+-------------------
+Provided by Anope Dev. <dev@anope.org> - 2004/2005
+01/12 A Added make profile to allow for gprof profileing of anope. [ #00]
+12/30 A Warnings for NULL values with sstrdup/moduleData. [#261]
+12/26 A Services can enforce SGLINE/SQLINE by killing the user on set. [#245]
+12/25 A Flag to tell if we need to enforce SGlines or not. [ #00]
+12/02 A Support for other Ulines Servers (NeoStats/SolarStats). [ #00]
+11/28 A Support for Unreal's version of SVSHOLD. [ #00]
+11/28 A /OS SET LIST to list the set options. [ #00]
+11/27 A Solid IRCD support (Solid IRCD 3.4.6 or later). [ #00]
+11/27 A Exceptions now update if the limit is different. [ #00]
+11/27 A Segfaults logged to the services log when DumpCore is disabled. [ #00]
+11/27 A OperServ SET SQL [on|off] disable/enable SQL during run time. [ #00]
+11/21 A Opened SGLINE to all ircd that support GEOS bans. [ #00]
+11/21 A Opened SZLINE to all ircd that support ZLINE's. [ #00]
+11/19 A Added anope_cmd_ctcp() to code API, for sending CTCP messages. [ #00]
+11/18 A Unable to use registered nicknames as bot nicks from now on. [ #00]
+11/18 A NSAddAccessOnReg to control access list on registration. [ #00]
+01/08 F /NS Status always returns 0 for unregisterd nicks like help says [ #00]
+01/07 F Fixed example.conf syntax mistake. [ #00]
+01/06 F Possible crash using memoserv. [#269]
+01/05 F Few updates to Dutch language file (nl.l). [ #00]
+01/05 F BotServ's banning would trigger a TSMODE error on a capable IRCd. [ #00]
+01/05 F Not resetting the topic on channel creation with KEEPTOPIC off. [#267]
+01/04 F Fixed up some alog() messages that were incorrect. [#266]
+01/01 F Ultimate3 channel modes, which had been defined incorrectly. [ #00]
+12/31 F Fixed integer overflow error with CS ACCESS/LEVELS. [#262]
+12/30 F Fixed moduleAddData using an old moduleData as list head. [#261]
+12/30 F List handling of moduleData was bad on deletion. [#261]
+12/30 F Few memleaks with moduleData functions returning early. [ #00]
+12/30 F Modules can no longer add commands with mod_name set. [#261]
+12/30 F Catserv now uses moduleAddCommand instead of addCommand. [#261]
+12/27 F Not freeing memory when a channel got deleted. [ #00]
+12/27 F Segfaults with enforcing KillonSGline/KillonSQline. [#260]
+12/26 F Updated IRCD doc to show all the flags currently in the code. [ #00]
+12/26 F Fixed segfault with some config options if they are set wrong. [ #00]
+12/26 F Updated PTLink support to be more in line with the ircd protocol. [ #00]
+12/25 F Fixed up user and channel modes for various ircds. [ #00]
+12/23 F Several compiler errors under make strict. [ #00]
+12/21 F Unsetting away would not trigger checking of memos. [#258]
+12/21 F Dreamforge compile. [ #00]
+12/21 F Moved global about del of non-existant session inside debug() if. [ #00]
+12/19 F Fixed LogUser messages where the nickip is 0. [#253]
+12/19 F Segfault if USERDB enabled and tables don't exist. [#255]
+12/18 F Now only builds the ircd you selected. [ #00]
+12/17 F In some cases READONLY was not respected, and data was saved. [#244]
+12/17 F Corrected a few mistakes in example.conf. [#251]
+12/17 F Wrong column type in tables.sql for nick alias status fiag. [#248]
+12/17 F listchans and listnicks work under Cygwin. [#247]
+12/17 F NickRegDelay no longer accepts negative values. [#250]
+12/17 F -is44 option not show if converter not built. [#249]
+12/11 F Fixed possible crashbug (NULL-free) in nickserv's delcore(). [ #00]
+12/09 F Hybrid crash on unsetting registration mode. [ #00]
+12/09 F BotServ !seen not recognizing founder. [#167]
+12/08 F ChanServ ACCESS wrong when dealing negative numbers. [#240]
+12/06 F Fixed misplaced pointer in moduleAddData(). [ #00]
+12/06 F Fixed infinite loop with moduleGetData(). [#239]
+12/05 F CS CLEAR OPS strips +a/+q modes, and uses SVSMODE where possible. [ #00]
+12/05 F Ultimate3 not setting +a on channel admins. [ #00]
+12/04 F Cleaned up some memory warnings found with Valgrind. [ #00]
+12/03 F Unreal 391 TIME replies. [ #00]
+12/03 F CS TOPICLOCK setting a maliformed topic in some cases. [ #00]
+12/03 F Bahamut support +I channel modes. [ #00]
+12/02 F Ultimate3 botserv bots were getting wrong modes. [ #00]
+12/01 F ChanServ AKICK DEL (reordering) (pointed to freed memory). [ #00]
+12/01 F del_session() warning messages when LimitSessions is disabled. [ #00]
+11/30 F Fixed ircd->chanmodes (pointed to freed memory). [ #00]
+11/28 F NSSecureAdmins now restricts /NS SET EMAIL. [#218]
+11/27 F Compiles and Runs under CYGWIN again. [ #00]
+11/27 F bot_raw_mode() would cause a TSMODE warning. [#234]
+11/27 F do_kill() not removing users from the user list. [#222]
+11/27 F Unreal3.2 supports SVSMODE -b on clearing bans. [ #00]
+11/27 F Removed +d references from the PTlink protocol file. [ #00]
+11/23 F Rage 2 updated to support BETA 7. [#226]
+11/23 F PTLink anope_cmd_server() message. [ #00]
+11/21 F Fixed session decrease on /NS GHOST. [#229]
+11/20 F Disables UseRDB if there is an error during SQL init. [ #00]
+11/20 F MS CHECK now checks if the nick is forbidden. [#225]
+11/20 F Removing Sqline on bot nicks change if the nick was registered. [#224]
+11/19 F normalizeBuffer() now strips control character 1. [ #00]
+11/19 F CTCP Ping replies when UsePrivmsg is enabled. [ #00]
+11/19 F Some config options could overflow strtol(). [ #00]
+11/19 F Wrong string and missing registered nick check in bot change. [#221]
+11/16 F NickTracking could allow usage of forbidden nick in some cases. [ #00]
+
+Provided by DrStein <gacevedo@anope.org> - 2004/2005
+01/03 F Duplicated TOPIC sent, when TOPICLOCK is ON. [#265]
+01/03 F If SYMBIOSIS ON, BotServ's bot should be the topic setter. [#265]
+12/23 A NS STATUS will return your status if no nickname is given. [ #00]
+12/26 F Error message during SQL init even if UseRDB was disabled. [ #00]
+12/10 F Extra tab in language files, causing bad answer in !seen. [#243]
+11/28 F Fixes RSEND oddity. [#237]
+11/26 F Memos sent as notification of receipt can't be cancelled. [#192]
+11/23 F Moving Services Operators to Services Admins and vice-versa. [#230]
+11/22 F HelpChan +h mode not being given if status was greater then op. [#223]
+
+Provided by Jens Hoffrichter <joho@nickstories.de> - 2004
+12/17 F Provides clear message of SUPERADMIN is not enabled. [#246]
+
+Provided by mitch{Xy} <mitch@bondage.com> - 2004
+12/20 F Removed unclear email text from language files. [ #00]
+
+Provided by ThaPrince <jon@vile.com> - 2004/2005
+01/13 A Support for plexus SVSID. [ #00]
+12/25 A Support for Hybrid TBURST. [#259]
+12/21 A Support for Hybrid IRCDs QS (Quit Storm). [#256]
+12/20 A Added plexus ircd support. [ #00]
+01/13 F halfop support working for plexus. [ #00]
+12/22 F Updated the plexus support. [ #00]
+
+Anope Version 1.7.6
+-------------------
+Provided by Anope Dev. <dev@anope.org> - 2004
+10/13 A Added argv[0] as nick for AnopeInit. [ #00]
+09/20 A Added RestrictOperNicks as new feature in services.conf. [ #00]
+09/08 A Removed rand() and ported bsd's arc4random() to fit our needs. [ #00]
+08/24 A New -l option for am script to list possible selectors. [ #00]
+10/16 F Fixed RestrictOperNicks for /ns group command. [#188]
+10/13 F Type in comments on all src files - yay. [ #00]
+10/12 F Code Tidy, fixed some error checking. [ #00]
+10/09 F Bug in LogChannel possibly causing segfaults. [#176]
+10/03 F Changed UserKeys from uint to long uint. [ #00]
+09/21 F An option to explicitly not use mysql is added to Config. [ #00]
+09/19 F Rewrote the internals of moduleData to save lots of memory. [ #00]
+09/14 F Protection unsetting now does -a instead of +a. [ #00]
+09/12 F Updated Dutch language file. [ #00]
+09/10 F Typo in anope_cmd_relase_svshold function name. [ #00]
+09/09 F Fixed bug with uninitialized pointer in check_sqline. [ #00]
+09/08 F Fixed gcc2 support with multiple C++ style comments. [ #00]
+08/26 F Fixed spelling stuff in the german langfile. [#159]
+08/24 F Compile error with gcc2. [ #00]
+
+Provided by Trystan <trystan@nomadirc.net> - 2004
+10/29 A Added UnRestrictSAdmin to allow use of umode +a. [ #00]
+10/23 A Added depricated.h, this will allow old mods to work for now. [ #00]
+10/23 A Add hook for SJOIN for Unreal future +I support. [ #00]
+10/06 A Bahamut's channel mode +j (join throttle). [ #00]
+10/05 A Globalized CS/NS STATUS messages. [ #00]
+10/02 A Added NewsCount as new feature in services.conf. [ #00]
+08/28 A CSupport for +I channel mode. [ #00]
+08/28 A Complete support for Unreal3.2. [ #00]
+08/28 A New BASE64 general library. [ #00]
+09/07 A Unreal32 channel mode +T support. [ #00]
+09/07 A Ircd CHANMODE now trapped and stored. [ #00]
+08/23 A New protocol independent design (aka anope-capab). [ #00]
+08/28 A New IRCD document for adding new ircd support to new design. [ #00]
+11/11 F OS CLEARMODES now takes +q/+a. [ #00]
+11/11 F Updated PTlink support. [#211]
+11/06 F Fixed syntax error when NSForceEmail is disabled. [ #00]
+11/06 F Fixed using "make" under some BSD systems. [ #00]
+11/06 F Chanserv taking modes more than once. [ #68]
+10/31 F Fixes configure warning on BSD systems. [#160]
+10/30 F Fixed OS CLEARMODE, so the correct messages are sent. [#207]
+10/30 F Fixed MS INFO using the correct message. [#205]
+10/29 F Fixed CS CLEAR MODES not resetting the modes. [#182]
+10/29 F Fixed LogUser message, now normalizes the "realname" for display. [#199]
+10/29 F Fixed BS ACT, if the string contained control character 1. [#193]
+10/27 F Fixed hardcored ircd sqlines from taking out services. [#133]
+10/27 F Fixed TOPIC timestamp not being read correctly. [#196]
+10/24 F Fixed OPNOTICE when doing /CS OP. [#198]
+10/20 F Updated Base64 Lib to fix Unreal NICKIP. [ #00]
+10/16 F Fixed BS TTB. [#185]
+10/16 F RestrictOperNicks is no longer case sensitive. [#190]
+10/16 F Fixed tsbuf not being sent on registration. [#180]
+10/15 F Fixed OS JUPE. [#147]
+10/14 F Fixed NickServ Logout. [#180]
+10/14 F Fixed HelpChannel with Unreal. [#180]
+10/09 F Bug in MySQL debug, possibly causing segfaults. [#149]
+10/09 F Lots of code clean up to prevent segfaults. [ #00]
+10/07 F Fixed TSMODE ircds that don't stay this in their CAPAB. [ #00]
+10/05 F Cleaned up how OS/CS CLEAR MODES works. [ #00]
+09/27 F Verbose message for vident. [#173]
+09/27 F Check and trap for forbidden nicks on HS. [#172]
+09/27 F Tracking of IP address for simple checks. [#166]
+09/27 F Proper deletion of added NS timeouts. [#143]
+09/27 F Partial fix for +a compile error. [#147]
+09/27 F Resolved longstanding NICKIP issue on AKILLs. [ #17]
+09/07 F Handling of most Unknown Message from Server commands. [ #00]
+09/07 F Several Hybrid support fixes and improvements. [ #00]
+09/07 F Several Unreal support fixes and improvements. [ #00]
+09/07 F Several Ultimate support fixes and improvements. [ #00]
+08/28 F Channel registration handling for non chanops. [#142]
+08/28 F Protection from accessing unavailable struct data. [#152]
+08/28 F Rage2 mode +M/+A channel support. [#154]
+08/28 F Rage2 Beta6 support. [#155]
+08/28 F Undefined references on botserv.c upon compilation. [#156]
+08/28 F Memory leaks taken care of. [#157]
+08/28 F Buffer preparation for vsnprintf() call. [#158]
+
+Provided by DrStein <gacevedo@anope.org> - 2004
+11/06 A NS ACCESS LIST reports correctly that the list is empty [ #00]
+10/05 A CS/NS INFO shows the expire time. [ #00]
+10/05 A NS GLIST shows the expire time. [ #00]
+11/06 F Service Admins can now modify the XOP list [#170]
+10/29 F ChanServ XOP reordering fix [#187]
+10/29 F ChanServ AKICK reordering fix [#201]
+10/29 F ChanServ now requires a more obscure password [#202]
+10/27 F MS CHECK to look for the correct sender value. [#200]
+10/21 F Updated Spanish language file. [ #00]
+10/15 F More Check and trap for forbidden nicks on HS. [#183]
+10/07 F NEWS reordering issue [ #00]
+10/05 F NS GLIST allows the owner of the nick to use the nickname param. [ #00]
+09/17 F Fixed MySQL error, whereby checks are only done if mysql is on. [ #00]
+09/14 F Fixed /os MODE by joining nested ifs into one. [ #00]
+
+Provided by crazytoon <da.crew@gmx.net> - 2004
+10/24 A Updated German language file [ #00]
+
+Provided by Miles Nordin <carton@Ivy.NET> - 2004
+11/06 F Fixes segfault under NetBSD with channel names using i18n symbols [ #00]
+
+
+Anope Version 1.7.5
+-------------------
+Provided by Anope Dev. <dev@anope.org> - 2004
+07/17 A Switched to autoconf for configure script. [ #00]
+07/05 A Warning when LocalAddress conflicts with RemoteServer. [#118]
+06/18 A Added proper Bahamut1.8 support. [ #55]
+08/11 F Proper make distclean to leave source spotless. [ #00]
+08/11 F Fixed support for Ultimate, Rage and Viagra. [#113]
+08/10 F Fixed previous BotServ buffer fix. [#131]
+08/10 F Updated documentation to reflect the changed build process. [ #00]
+08/07 F configure will be ok if you dont have mysqlclient lib file. [ #00]
+07/23 F Fixed BotServ buffer. [#131]
+07/22 F Free NSNickTracking when a user quits. [#126]
+07/22 F NOOP bug with wildcards. [#115]
+07/22 F Removed RESTRICTED from incorrectly labeled lang file entry. [#111]
+07/15 F Fixed the bug where /ns release didn't work with UseSVSHOLD. [#125]
+07/15 F Fixed a tiny memleak in the db routine. [ #00]
+07/15 F Updated Dutch language file. [ #00]
+07/14 F Added CHECK to the memoserv help menu. [ #00]
+07/12 F Bots will join a channel even for ignored users. [ #00]
+07/05 F Global now joins LogChan on startup with hybrid. [ #97]
+07/04 F Fixed a bug with m_time. [ #00]
+06/30 F Fixed bug which caused failure in anope crontab script. [ #00]
+06/28 F Fixed compiling bug with UltimateIRCd3, ViagraIRCd, Rage2IRCd. [ #00]
+06/26 F Removed TSMODE from usermodes for bahamut. [#112]
+06/22 F Changed all strcasecmp's to stricmp's. [ #00]
+06/20 F PTLink server support. [ #00]
+
+Provided by Trystan <trystan@nomadirc.net> - 2004
+07/22 A Added VIAGRA support for modes +A and +H. [ #99]
+08/17 F Rage2 SNICK event handling. [#128]
+08/17 F Included XOP reference to /CS HELP SET. [#139]
+08/17 F French language update. [#146]
+08/17 F Ultimate3 channel modes fixed. [#147]
+08/17 F Ultimate3 configuration defines set properly. [#148]
+
+Provided by Janos Kapitany <sarkanyka@cjbchat.hu>
+08/04 A New language file hun.l (Hungarian) [ #00]
+
+Provided by Mateusz Szczyrzyca <annihilator@ircnet.pl> - 2004
+08/11 A New language file pl.l (Polish) [ #00]
+
+Anope Version 1.7.4
+-------------------
+Provided by Anope Dev. <dev@anope.org> - 2004
+06/16 A More verbose error messages for services.conf checking. [ #00]
+06/10 A Improved handling of /NS INFO for pseudo-clients. [ #98]
+06/07 A Added register script in /bin/ for users to register anope. [ #00]
+05/27 A Better /OS MODLIST output to include version information. [ #74]
+05/25 A New /CS CLEAR HOPS for ircd's that support halfops. [ #72]
+05/24 A New NSNickTracking directive to provide nick tracking. [ #71]
+05/21 A Auto enforce upon AKICK addition. [ #63]
+05/21 A New file docs/OLDCHANGES contains all change history. [ #65]
+06/17 F Added SQLINE to NICK() on PTlink. [ #96]
+06/16 F Module support for OpenBSD systems [#106]
+06/12 F We check now for valid arguments in ModuleAddData(). [ #90]
+06/12 F Unified kill_user function to handle all ircd protocols. [#101]
+06/10 F Added check to see if MysqlUser and MysqlName were not null. [ #92]
+06/09 F Corrected a number of spelling errors in en_us.l. [ #94]
+06/09 F Corrected a large number of spelling and typing errors in docs. [ #87]
+06/09 F Corrected compile warning for Hybrid support. [ #93]
+06/06 F Fixed a bug with long NSGuestNickPrefixes. [ #00]
+06/04 F Buffer initialization for encrypted MySQL passwords. [ #86]
+06/04 F Rewrite of del_exception() fixing segfault and memory leak. [ #78]
+06/04 F MemoServ send limit does no longer apply for services operators. [ #84]
+06/03 F Reversed pthread library detection order on ./configure script. [ #67]
+06/02 F Fixed bug where people who set memoserv notify off were notified. [ #79]
+05/30 F HostServ functions no longer called for non VHOST capable ircds. [ #77]
+05/28 F Fixed botserv bug with HAS_EXCEPTION (chmode +e). [ #80]
+05/26 F Repaired /NS GROUP for compiled but disabled MySQL support. [ #73]
+05/24 F Fixed typo in example.conf. [ #70]
+05/24 F Cleaned up compile errors on older compilers. [ #69]
+05/21 F Removed threads.c file. [ #64]
+05/21 F Check for VHOST capable ircd on HostServAlias induction. [ #56]
+05/21 F Allow /CS SUSPEND on registered channels only. [ #54]
+05/21 F Reserved nicks (Q-lined) will be KILLed if taken on induction. [ #50]
+
+Provided by Trystan <trystan@nomadirc.net> - 2004
+06/10 A User customizable pseudo-client modes. [ #99]
+06/17 F GlobalOnCycleMessage checked at startup [ #91]
+
+Anope Version 1.7.3
+-------------------
+Provided by Anope Dev. <dev@anope.org> - 2004
+05/16 A make install will now move anoperc to bin, fixed anoperc bug
+05/15 A New standard Changes file format.
+05/15 A BSCaseSensitive directive for a cAsE sEnSiTiVe badword kicker.
+05/14 A Support for +a/-a on PTLink ircd.
+05/02 A New moduleAddData support.
+04/29 A MemoServ command CHECK to check whether a memo has been read.
+04/23 A MemoServ command RSEND to send a memo requesting a receipt.
+04/19 A Console control script bin/anoperc.
+05/03 F Always set the right module name when executing mod_tail commands.
+05/14 F Removed some illegal sizeof(void). Thanks to codemastr.
+05/04 F Badwords kicker to ignore control characters and color codes.
+05/12 F Missing RANDOMNEWS entry on /OS HELP [ #40]
+05/14 F HELP LIST and LIST SYNTAX help messages [ #53]
+05/14 F Globals containing format characters [ #52]
+05/14 F Typo in HostServ help [ #51]
+05/12 F Missing RANDOMNEWS entry on /OS HELP [ #40]
+05/12 F xOP management inconsistency [ #38]
+05/11 F Bug with module unload / memo moduleData [ #43]
+05/05 F Bug with RDB and empty nickserv greet message [ #28]
+05/08 F Segfault on MySQL FORBID [ #14]
+04/22 F ALIST bug when being invoked by systems admins [ #20]
+
+Provided by Rage IRCD. <rageircd@users.sourceforge.net> - 2004
+05/11 A Rage2 IRCD support accepted feature request. [ #46]
+
+Anope Version 1.7.2
+--------------------
+Provided by Anope Dev. <dev@anope.org>
+2004/04/17 Fixed table.sql usage on mydbgen script (Bug #10)
+2004/04/17 Fixed bug where anope_ns_req was being referenced
+2004/04/17 Added SIGUSR2 signal to Rehash Config and Save DBs
+2004/04/16 Fixed broken password saves to MySQL (Bug #11)
+
+Anope Version 1.7.1
+--------------------
+Provided by Anope Dev. <dev@anope.org>
+2004/04/12 Fixed quoted MD5 password for MySQL use (Bug #11)
+2004/04/11 Fixed table.sql detection on mydbgen script (Bug #10)
+2004/04/09 Fixed segfault due to coreless nicks in MySQL db (Bug #8)
+2004/04/08 Added NickRegDelay. Nicks have to be connected longer than X seconds before a /ns register.
+2004/04/08 Added "is a services root administrator" to /ns info.
+2004/04/08 Added option for SOs and above to hide their services access status in /ns info.
+2004/04/07 Added -help arguement for command line parameters.
+2004/04/04 Added -version argument to return version and build info.
+2004/04/04 Fixed moduleAddCommand for a non-existant service.
+2004/04/01 Added memo2mail and /msg memoserv set notify MAIL/NOMAIL.
+2004/03/31 Fixed MySQL double encryption if using MD5.
+2004/03/31 Implemented MySQL Phase2 (see docs/MYSQL file).
+2004/03/31 Modules can now add Commands/Messages from outside of AnopeInit.
+2004/03/31 Fixed a bug with recersive module callbacks.
+2004/03/30 Added channelname to entrymsg.
+2004/03/28 Fixed tables.sql and removed needless tables.
+2004/03/28 Forked 1.7 development stream.
+
+NOTE: FOR PREVIOUS CHANGES PLEASE REFER TO FILE docs/OLDCHANGES
diff --git a/Changes.conf b/Changes.conf
new file mode 100644
index 000000000..14c4a3780
--- /dev/null
+++ b/Changes.conf
@@ -0,0 +1,782 @@
+Anope Version 1.8.0
+-------------------
+** ADDED CONFIGURATION DIRECTIVES **
+
+** MODIFIED CONFIGURATION DIRECTIVES **
+
+** DELETED CONFIGURATION DIRECTIVES **
+
+
+Anope Version 1.7.24
+--------------------
+** ADDED CONFIGURATION DIRECTIVES **
+
+** MODIFIED CONFIGURATION DIRECTIVES **
+
+** DELETED CONFIGURATION DIRECTIVES **
+
+Anope Version 1.7.23b
+--------------------
+** ADDED CONFIGURATION DIRECTIVES **
+
+** MODIFIED CONFIGURATION DIRECTIVES **
+
+** DELETED CONFIGURATION DIRECTIVES **
+
+Anope Version 1.7.23
+--------------------
+** ADDED CONFIGURATION DIRECTIVES **
+# OSIgnoreDBName [OPTIONAL]
+# Module: os_ignore_db
+#
+# Use the given filename as database for services ignores.
+# If not given, the default of "os_ignore.db" will be used.
+#
+#OSIgnoreDBName "os_ignore.db"
+
+** MODIFIED CONFIGURATION DIRECTIVES **
+
+** DELETED CONFIGURATION DIRECTIVES **
+
+Anope Version 1.7.22
+--------------------
+** ADDED CONFIGURATION DIRECTIVES **
+
+** MODIFIED CONFIGURATION DIRECTIVES **
+# BotCoreModules <list> [RECOMMENDED]
+# These modules will be loaded as part of BotServ's core.
+# It is not recommended you change these settings unless you are
+# sure you understand exactly what it is you are doing.
+BotCoreModules "bs_help bs_botlist bs_assign bs_set bs_kick bs_badwords bs_act bs_info bs_say bs_unassign bs_bot bs_fantasy bs_fantasy_kick bs_fantasy_kickban bs_fantasy_owner bs_fantasy_seen"
+
+** DELETED CONFIGURATION DIRECTIVES **
+
+Anope Version 1.7.21
+--------------------
+** ADDED CONFIGURATION DIRECTIVES **
+
+** MODIFIED CONFIGURATION DIRECTIVES **
+
+** DELETED CONFIGURATION DIRECTIVES **
+
+Anope Version 1.7.20
+--------------------
+** ADDED CONFIGURATION DIRECTIVES **
+
+** MODIFIED CONFIGURATION DIRECTIVES **
+
+** DELETED CONFIGURATION DIRECTIVES **
+
+Anope Version 1.7.19
+--------------------
+** ADDED CONFIGURATION DIRECTIVES **
+
+** MODIFIED CONFIGURATION DIRECTIVES **
+
+** DELETED CONFIGURATION DIRECTIVES **
+
+Anope Version 1.7.18
+--------------------
+** ADDED CONFIGURATION DIRECTIVES **
+###########################################################################
+#
+# Encryption settings
+#
+###########################################################################
+
+# EncModule <module_name> [REQUIRED]
+# The encryption module to use when dealing with passwords.
+# This determines how the passwords are stored in the databases,
+# and does not add any security as far as transmitting passwords over
+# the network goes.
+# enc_none provides no password encryption, storing the password in
+# plain text, this is the most versiatle as passwords can easily be
+# recovered.
+#
+# NOTE: users of anope's previous (broken) md5 implementation should
+# select the enc_old option, or things may break.
+#
+# NOTE2: Some of these encryption methods are one-way (md5, sha1, old)
+# meaning that you can NOT retrive the passwords in plain text once
+# encrypted.
+#
+# Plain Text - enc_none
+# Previous (broken) MD5 - enc_old
+# MD5 - enc_md5
+# SHA1 - enc_sha1
+#
+
+EncModule "enc_none"
+
+** MODIFIED CONFIGURATION DIRECTIVES **
+
+** DELETED CONFIGURATION DIRECTIVES **
+
+Anope Version 1.7.17
+--------------------
+** ADDED CONFIGURATION DIRECTIVES **
+
+** MODIFIED CONFIGURATION DIRECTIVES **
+
+** DELETED CONFIGURATION DIRECTIVES **
+
+Anope Version 1.7.16
+--------------------
+** ADDED CONFIGURATION DIRECTIVES **
+
+** MODIFIED CONFIGURATION DIRECTIVES **
+
+** DELETED CONFIGURATION DIRECTIVES **
+
+Anope Version 1.7.15
+--------------------
+** ADDED CONFIGURATION DIRECTIVES **
+# UseStrictPrivMsg [OPTIONAL]
+# Using this directive will force services to only respond to privmsgs
+# addressed to Nick@ServerName - e.g. NickServ@localhost.net.
+# This should be used on conjunction with ircd aliases.
+#
+
+#UseStrictPrivMsg
+
+# NSResendDelay <time> [RECOMMENDED]
+# Sets the minimum length of time between consecutive uses of the
+# RESEND command. If not given, this restriction is disabled (note
+# that this allows "resend flooding" or "mail bombing").
+
+NSResendDelay 90s
+
+NSDefAutoop
+
+** MODIFIED CONFIGURATION DIRECTIVES **
+ModuleDelayedAutoload "cs_appendtopic cs_enforce ns_maxemail os_info hs_request"
+
+# 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.
+#
+# NOTE: This option is not available when STREAMLINED is defined in
+# the Makefile.
+
+LimitSessions
+
+** DELETED CONFIGURATION DIRECTIVES **
+# NSAutoOPDBName [OPTIONAL]
+# Module: ns_noop
+#
+# Use the given filename as database for the autoop list. If not given,
+# the default of "autoop.db" will be used.
+#
+#NSAutoOPDBName "autoop.db"
+
+# KillClonesAkillExpire <time> [REQUIRED]
+# Sets the expiry time for autokills added for hosts that have been
+# killed using the KILLCLONES command.
+
+KillClonesAkillExpire 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 superseded 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
+
+Anope Version 1.7.13
+--------------------
+** ADDED CONFIGURATION DIRECTIVES **
+
+** MODIFIED CONFIGURATION DIRECTIVES **
+
+** DELETED CONFIGURATION DIRECTIVES **
+
+Anope Version 1.7.12
+--------------------
+** ADDED CONFIGURATION DIRECTIVES **
+
+# BSFantasyCharacter [REQUIRED]
+# This option allows you to change the default prefix for fantasy
+# commands in channels. This character will have to be prepended to all
+# fantasy commands. If you choose "!" (the default), fantasy commands
+# will, for example, be "!kick", "!op", etc.
+
+BSFantasyCharacter "!"
+
+** MODIFIED CONFIGURATION DIRECTIVES **
+
+** DELETED CONFIGURATION DIRECTIVES **
+
+Anope Version 1.7.11
+--------------------
+** ADDED CONFIGURATION DIRECTIVES **
+
+# NickLen [REQUIRED]
+# Set this to the maximum allowed nick length on your network. Anope does
+# not support values larger than 31, so setting them makes no sense. Be
+# sure to set this correctly, as setting this wrong can result in services
+# being disconnected from the network.
+
+NickLen 31
+
+** MODIFIED CONFIGURATION DIRECTIVES **
+# UserKey1|2|3 <value> [RECOMMENDED]
+#
+# These keys are required to initiate the random number generator. These
+# numbers MUST be random as you want your passcodes to be random. Don't
+# give these keys to anyone! Keep them private!
+#
+# *** NOTE ***
+# If you don't enable these, or keep their default values, any talented
+# programmer would be able to easily "guess" random strings used to mask
+# information. Be safe, and come up with three different 7 digit numbers
+
+#UserKey1 9866235
+#UserKey2 8362013
+#UserKey3 2362899
+
+** DELETED CONFIGURATION DIRECTIVES **
+
+Anope Version 1.7.10
+--------------------
+** ADDED CONFIGURATION DIRECTIVES **
+
+** MODIFIED CONFIGURATION DIRECTIVES **
+
+** DELETED CONFIGURATION DIRECTIVES **
+
+Anope Version 1.7.9
+-------------------
+** ADDED CONFIGURATION DIRECTIVES **
+# IRCDModule <module_name> [REQUIRED]
+# The ircd protocol module should be used when connecting anope to your
+# chosen IRCD. This should be one of the following options, or a file
+# provided by your IRCD author.
+#
+# Bahamut 1.4.27 [or later] - "bahamut"
+# DreamForge 4.6.7 - "dreamforge"
+# Hybrid IRCd 7.0 [experimental] - "hybrid"
+# InspIRCd 1.0 Beta 5 - "inspircd"
+# InspIRCd module is provided by Brain <brain@inspircd.org>
+# Plexus 2.0 [or later] - "plexus"
+# PTLink 6.15.0 [experimental] - "ptlink"
+# RageIRCd 2.0.0 [beta-6 of later] - "rageircd"
+# Ratbox 2.0.6 [or later] - "ratbox"
+# ShadowIRCD 4.0x [beta 7 or later] - "shadowircd"
+# Solid IRCD 3.4.x [3.4.6 or later] - "solidircd"
+# UltimateIRCd 3.0.0 [or later] - "ultimate3"
+# UltimateIRCd 2.8.2 [or later] - "ultimate2"
+# Unreal 3.2 [beta-19 or later] - "unreal32"
+# Unreal 3.1.1 [or later] - "unreal31"
+# ViagraIRCd 1.3.x [or later] - "viagra"
+#
+
+#IRCDModule "unreal32"
+
+# HostCoreModules <list> [RECOMMENDED]
+# These modules will be loaded as part of HostServ's core.
+# It is not recommended you change these settings unless you are
+# sure you understand exactly what it is you are doing.
+HostCoreModules "hs_help hs_on hs_off hs_group hs_list hs_set hs_setall hs_del hs_delall"
+
+# MemoCoreModules <list> [RECOMMENDED]
+# These modules will be loaded as part of MemoServ's core.
+# It is not recommended you change these settings unless you are
+# sure you understand exactly what it is you are doing.
+MemoCoreModules "ms_send ms_cancel ms_list ms_read ms_del ms_set ms_info ms_rsend ms_check ms_staff ms_sendall ms_help"
+
+# HelpCoreModules <list> [RECOMMENDED]
+# These modules will be loaded as part of HelpServ's core.
+# It is not recommended you change these settings unless you are
+# sure you understand exactly what it is you are doing.
+HelpCoreModules "he_help"
+
+# BotCoreModules <list> [RECOMMENDED]
+# These modules will be loaded as part of BotServ's core.
+# It is not recommended you change these settings unless you are
+# sure you understand exactly what it is you are doing.
+BotCoreModules "bs_help bs_botlist bs_assign bs_set bs_kick bs_badwords bs_act bs_info bs_say bs_unassign bs_bot bs_fantasy bs_fantasy_kick bs_fantasy_kickban bs_fantasy_owner bs_fantasy_seen bs_fantasy_unban"
+
+# OperCoreModules <list> [RECOMMENDED]
+# These modules will be loaded as part of OperServ's core.
+# It is not recommended you change these settings unless you are
+# sure you understand exactly what it is you are doing.
+OperCoreModules "os_help os_global os_stats os_oper os_admin os_staff os_mode os_kick os_clearmodes os_killclones os_akill os_sgline os_sqline os_szline os_chanlist os_userlist os_logonnews os_randomnews os_opernews os_session os_noop os_jupe os_ignore os_set os_reload os_update os_restart os_quit os_shutdown os_defcon os_chankill os_svsnick os_oline os_umode os_modload os_modunload os_modlist os_modinfo"
+
+# NickCoreModules <list> [RECOMMENDED]
+# These modules will be loaded as part of NickServ's core.
+# It is not recommended you change these settings unless you are
+# sure you understand exactly what it is you are doing.
+NickCoreModules "ns_help ns_register ns_group ns_identify ns_access ns_set ns_drop ns_recover ns_release ns_sendpass ns_ghost ns_alist ns_info ns_list ns_logout ns_status ns_update ns_getpass ns_getemail ns_forbid ns_suspend"
+
+# ChanCoreModules <list> [RECOMMENDED]
+# These modules will be loaded as part of ChanServ's core.
+# It is not recommended you change these settings unless you are
+# sure you understand exactly what it is you are doing.
+ChanCoreModules "cs_help cs_register cs_identify cs_set cs_xop cs_access cs_akick cs_drop cs_sendpass cs_ban cs_clear cs_modes cs_getkey cs_invite cs_kick cs_list cs_logout cs_topic cs_info cs_getpass cs_forbid cs_suspend cs_status"
+
+# OSOpersOnly [RECOMMENDED]
+# If this is defined, only IRC Operators will be permitted to use
+# OperServ, regardless of module based command access restrictions.
+
+OSOpersOnly
+
+# NSEmailMax [OPTIONAL]
+# Module: ns_maxemail
+#
+# Limit the amount of registrations with the same email address to the
+# amount given here. If set to 0 or left commented, there will be no limit
+# enforced when registering new accounts or using /msg NickServ SET EMAIL.
+#
+#NSEmailMax 1
+
+# NSAutoOPDBName [OPTIONAL]
+# Module: ns_noop
+#
+# Use the given filename as database for the autoop list. If not given,
+# the default of "autoop.db" will be used.
+#
+#NSAutoOPDBName "autoop.db"
+
+# OSInfoDBName [OPTIONAL]
+# Module: os_info
+#
+# Use the given filename as database for the oper information lines.
+# If not given, the default of "os_info.db" will be used.
+#
+#OSInfoDBName "os_info.db"
+
+** MODIFIED CONFIGURATION DIRECTIVES **
+
+# UserKey1|2|3 <value> [REQUIRED]
+#
+# These keys are required to initiate the random number generator. These
+# numbers MUST be random as you want your passcodes to be random. Don't
+# give these keys to no anyone! Keep them private!
+# For those pple who don't understand what to do here: Just pick three
+# _different_ _random_ numbers with about 6 or 7 digits and put them here.
+# If the keys don't work, they might be too long or you forgot to remove
+# the # in front of them. Example:
+# UserKey1 9866235
+
+# UserKey1 <your_first_random_number_here>
+# UserKey2 <your_second_random_number_here>
+# UserKey3 <you_third_random_number_here>
+
+# Numeric [OPTIONAL]
+# Many ircd identify themselves with a Numeric ID when using this option
+# consult your ircds documentation before using this.
+#Numeric "3AX"
+#Numeric "4"
+
+# ModuleDelayedAutoload [OPTIONAL]
+#
+# When compiled with module support, this contains a space separated list
+# of modules to automaticaly load when services are ready for new clients.
+# e.g. new pesudo clients such as CatServ :-) *meow*
+# By default a number of modules that we found worth adding by default are
+# loaded. Feel free to change this if you want to add more, or remove some
+# from the list.
+#
+ModuleDelayedAutoload "cs_appendtopic cs_enforce ns_maxemail ns_noop os_info"
+
+** DELETED CONFIGURATION DIRECTIVES **
+
+###########################################################################
+#
+# 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 responsibility 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 Anope will 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. If this is not set the default time is 2 days.
+
+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> [REQUIRED]
+#
+# 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
+
+
+Anope Version 1.7.8
+-------------------
+** ADDED CONFIGURATION DIRECTIVES **
+
+# UseTS6 [OPTIONAL]
+#
+# Modern hybrid ircd like Ratbox 2.0.x support a protocol called TS6.
+# However this protocol is optional thus our default support is for without
+# TS6, if you want to take advantage of TS6, enable this option.
+
+#UseTS6
+
+** MODIFIED CONFIGURATION DIRECTIVES **
+
+** DELETED CONFIGURATION DIRECTIVES **
+
+Anope Version 1.7.7
+-------------------
+** ADDED CONFIGURATION DIRECTIVES **
+
+# NSAddAccessOnReg [OPTIONAL]
+#
+# When enabled, services will add the usermask of registering users to the
+# access list of their newly created account. If you disable this, users
+# will always have to identify to nickserv before being recognized, unless
+# they manually add an address to the access list of their account.
+
+NSAddAccessOnReg
+
+# UlineServers [OPTIONAL]
+#
+# A list of ulined servers on your network, these servers are assumed they
+# can set channel modes and we will not attempt to take them from them
+# WARNING: do not put your user servers in this option
+
+UlineServers "stats.your.network, proxy.your.network"
+
+# KillOnSGline [OPTIONAL]
+#
+# When enabled, this option makes the services send an (SVS)KILL command
+# immediately after SGLINE ADD. This eliminates the need of killing the
+# users after the SGLINE has been added.
+
+# KillOnSGline
+
+# KillOnSQline [OPTIONAL]
+#
+# When enabled, this option makes the services send an (SVS)KILL command
+# immediately after SQLINE ADD. This eliminates the need of killing the
+# users after the SQLINE has been added.
+
+# KillOnSQline
+
+** MODIFIED CONFIGURATION DIRECTIVES **
+
+** DELETED 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.
+#
+# You can specify more than one Network Domain by separating each one by
+# a space: NetworkDomain "localnet.net localnet.com"
+#
+# Note that this directive is no longer used by the GLOBAL command, since
+# it uses a dynamic list of connected servers regardless of their
+# domains. However, some modules may still use this value, so you might
+# want to keep it just in case.
+
+NetworkDomain "localnet.com"
+
+# 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
+
+Anope Version 1.7.6
+-------------------
+** ADDED CONFIGURATION DIRECTIVES **
+
+# UserKey1|2|3 <value> [REQUIRED]
+#
+# These keys are required to initiate the random number generator. These
+# numbers MUST be random as you want your passcodes to be random. Don't
+# give these keys to no anyone! Keep them private!
+
+#UserKey1 9866235
+#UserKey2 5216332
+#UserKey3 9651291
+
+
+# RestrictOperNick [OPTIONAL]
+# Forbids the registration of nicks that contain nick with services
+# access. So if Tester is a Services Oper, for example, You can't
+# register NewTester or Tester123 unless you are an IRC operator.
+#RestrictOperNicks
+
+# UseTokens [OPTIONAL]
+# Allows irc networks to use TOKEN commands instead of the
+# standard commands. This saves bandwidth but can break older
+# modules that are not set to trap for TOKEN - if you are using
+# older modules do NOT use this option
+#UseTokens
+
+# UseSVS2MODE [OPTIONAL]
+# On Unreal IRCD use SVS2MODE instead of SVSMODE, doing this will
+# show services changing user modes.
+#UseSVS2MODE
+
+# NewsCount [OPTIONAL]
+# The number of LOGON/OPER News item to display when a user logs
+# on. The default value is 3
+#NewsCount 3
+
+# Numeric [OPTIONAL]
+# Many ircd identify themselves with a Numeric when using this option
+# consult your ircds documentation before using this
+#Numeric 0
+
+# UnRestrictSAdmin [OPTIONAL]
+# On many ircd Anope removes the umode of +a from users whom are not
+# Service Admin in Anope. This mode is NOT used by Anope for any form
+# of access. Thus this option allows them to keep the mode without having
+# to be a Service Admin in Anope
+#UnRestrictSAdmin
+
+
+** MODIFIED CONFIGURATION DIRECTIVES **
+** DELETED CONFIGURATION DIRECTIVES **
+
+Anope Version 1.7.5
+-------------------
+** ADDED CONFIGURATION DIRECTIVES **
+
+# UseSVSHOLD [OPTIONAL]
+# Allows Bahamut-networks to use SVSHOLD instead of the services
+# enforcer. This option has been introduced in Bahamut 1.4.35 and
+# places a temporary Q:Line instead of introducing a new nick,
+# which is better for both CPU and bandwidth. If you enable this
+# option on a pre-1.4.35 Bahamut, it is most likely to break.
+#UseSVSHOLD
+
+** 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.
+#
+# You can specify more than one Network Domain by separating each one by
+# a space: NetworkDomain "localnet.net localnet.com"
+#
+# Note that this directive is no longer used by the GLOBAL command, since
+# it uses a dynamic list of connected servers regardless of their
+# domains. However, some modules may still use this value, so you might
+# want to keep it just in case.
+
+NetworkDomain "localnet.com"
+
+** DELETED CONFIGURATION DIRECTIVES **
+
+Anope Version 1.7.4
+-------------------
+** ADDED CONFIGURATION DIRECTIVES **
+
+# NSNickTracking [OPTIONAL]
+#
+# When enabled, services will track your last nick identified when issuing
+# nick changes.
+
+#NSNickTracking
+
+** MODIFIED CONFIGURATION DIRECTIVES **
+** DELETED CONFIGURATION DIRECTIVES **
+
+Anope Version 1.7.3
+-------------------
+** ADDED CONFIGURATION DIRECTIVES **
+
+# BSCaseSensitive [OPTIONAL]
+# This option will make botserv use cAsE sEnSiTiVe checking for badwords
+
+# BSCaseSensitive
+
+# MSMemoReceipt [OPTIONAL]
+# Allow the use of memo receipts for the following groups:
+# 1 - Opers Only
+# 2 - Everybody
+#
+#MSMemoReceipt 1
+
+Anope Version 1.7.2
+--------------------
+No Changes.
+
+Anope Version 1.7.1
+--------------------
+** ADDED CONFIGURATION DIRECTIVES **
+
+# UseRDB [OPTIONAL]
+#
+# Enable this if you want anope to load its data from a remote database.
+# (e.g. MySQL)
+#
+#UseRDB
+
+# NickRegDelay <seconds> [OPTIONAL]
+# Prevents users from regging their nick if they are not
+# connected for at least X seconds.
+#NickRegDelay 30
+
+** MODIFIED CONFIGURATION DIRECTIVES **
+** DELETED CONFIGURATION DIRECTIVES **
diff --git a/Changes.lang b/Changes.lang
new file mode 100644
index 000000000..9938c29ef
--- /dev/null
+++ b/Changes.lang
@@ -0,0 +1,558 @@
+Anope Version 1.8.0
+-------------------
+*** New Strings:
+
+*** Mod Strings:
+
+*** Del Strings:
+
+Anope Version 1.7.24
+--------------------
+*** New Strings:
+ OPER_STATS_HOSTSERV_MEM
+
+*** Mod Strings:
+ NICK_HELP_SASET_AUTOOP
+
+*** Del Strings:
+
+Anope Version 1.7.23b
+--------------------
+*** New Strings:
+
+*** Mod Strings:
+
+*** Del Strings:
+
+Anope Version 1.7.23
+--------------------
+*** New Strings:
+ PASSWORD_TOO_LONG
+ CHAN_LOGOUT_FOUNDER_FAILED
+
+*** Mod Strings:
+ OPER_HELP_OPER
+ NICK_HELP_SASET_PASSWORD
+ OPER_IGNORE_SYNTAX
+ OPER_HELP_IGNORE
+ CHAN_LOGOUT_ALL_SUCCEEDED
+ OPER_HELP_MODLIST
+
+*** Del Strings:
+ PASSWORD_TRUNCATED
+
+Anope Version 1.7.22
+--------------------
+*** New Strings:
+ NICK_SASET_LANGUAGE_SYNTAX
+ NICK_SASET_LANGUAGE_UNKNOWN
+ NICK_SASET_LANGUAGE_CHANGED
+ NICK_HELP_SASET_LANGUAGE
+ NICK_HELP_RESEND
+
+*** Mod Strings:
+ NICK_HELP_SASET
+ NICK_RECOVERED
+ NICK_LIST_SERVADMIN_SYNTAX
+ NICK_SERVADMIN_HELP_LIST
+ CHAN_GETKEY_KEY
+ NICK_SERVADMIN_HELP_LIST
+ CHAN_SERVADMIN_HELP_LIST
+ OPER_HELP_GLOBAL
+ OPER_HELP_UMODE
+ OPER_HELP_OLINE
+ OPER_HELP_KICK
+ OPER_HELP_SVSNICK
+ OPER_HELP_SET_LOGCHAN
+ OPER_HELP_SET_SUPERADMIN
+ CHAN_HELP_AKICK
+ NICK_HELP_RECOVER
+ NICK_HELP_RELEASE
+ NEWS_HELP_LOGON
+ NEWS_HELP_OPER
+ OPER_HELP_IGNORE
+ OPER_IGNORE_TIME_DONE
+ OPER_IGNORE_PERM_DONE
+ OPER_IGNORE_DEL_DONE
+
+*** Del Strings:
+ NICK_SET_UNKNOWN_OPTION_OR_BAD_NICK
+ OPER_HELP_KILLCLONES
+
+Anope Version 1.7.21
+--------------------
+*** New Strings:
+
+*** Mod Strings:
+
+*** Del Strings:
+
+Anope Version 1.7.20
+--------------------
+*** New Strings:
+ NICK_HELP_CONFIRM
+ CHAN_XOP_NOT_AVAILABLE
+ HELP_LIMIT_SERV_OPER
+ HELP_LIMIT_SERV_ADMIN
+ HELP_LIMIT_SERV_ROOT
+ HELP_LIMIT_IRC_OPER
+ HELP_LIMIT_HOST_SETTER
+ HELP_LIMIT_HOST_REMOVER
+
+*** Mod Strings:
+ OPER_HELP_SET
+In all of the following strings only the trailing 'Limited to ...' line has been removed:
+ OPER_HELP_EXCEPTION
+ OPER_HELP_SESSION
+ NICK_HELP_SASET
+ NICK_HELP_SASET_DISPLAY
+ NICK_HELP_SASET_PASSWORD
+ NICK_HELP_SASET_URL
+ NICK_HELP_SASET_EMAIL
+ NICK_HELP_SASET_ICQ
+ NICK_HELP_SASET_GREET
+ NICK_HELP_SASET_KILL
+ NICK_HELP_SASET_SECURE
+ NICK_HELP_SASET_PRIVATE
+ NICK_HELP_SASET_HIDE
+ NICK_HELP_SASET_MSG
+ NICK_HELP_SASET_NOEXPIRE
+ NICK_HELP_SASET_AUTOOP
+ NICK_SERVADMIN_HELP_GETPASS
+ NICK_SERVADMIN_HELP_GETEMAIL
+ NICK_SERVADMIN_HELP_FORBID
+ NICK_SERVADMIN_HELP_SUSPEND
+ NICK_SERVADMIN_HELP_UNSUSPEND
+ CHAN_SERVADMIN_HELP_SET_NOEXPIRE
+ CHAN_SERVADMIN_HELP_GETPASS
+ CHAN_SERVADMiN_HELP_FORBID
+ CHAN_SERVADMIN_HELP_SUSPEND
+ CHAN_SERVADMIN_HELP_UNSUSPEND
+ CHAN_SERVADMIN_HELP_STATUS
+ OPER_HELP_MODE
+ 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_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_MODLOAD
+ OPER_HELP_MODUNLOAD
+ OPER_HELP_MODINFO
+ OPER_HELP_MODLIST
+ BOT_SERVADMIN_HELP_SET_NOBOT
+ BOT_SERVADMIN_HELP_SET_PRIVATE
+ HOST_HELP_SET
+ HOST_HELP_DELALL
+ HOST_HELP_SETALL
+ HOST_HELP_DEL
+ HOST_HELP_LIST
+
+*** Del Strings:
+
+Anope Version 1.7.19
+--------------------
+*** New Strings:
+
+*** Mod Strings:
+ CHAN_HELP_LIST
+ BOT_SET_SYNTAX
+ BOT_HELP_SET
+
+*** Del Strings:
+
+Anope Version 1.7.18
+--------------------
+*** New Strings:
+
+*** Mod Strings:
+
+*** Del Strings:
+
+Anope Version 1.7.17
+--------------------
+*** New Strings:
+
+*** Mod Strings:
+
+*** Del Strings:
+
+Anope Version 1.7.16
+--------------------
+*** New Strings:
+
+*** Mod Strings:
+
+*** Del Strings:
+
+Anope Version 1.7.15
+--------------------
+*** New Strings:
+ INVALID_TARGET
+ NICK_SET_AUTOOP_SYNTAX
+ NICK_SET_AUTOOP_ON
+ NICK_SET_AUTOOP_OFF
+ BOT_LONG_IDENT
+
+*** Mod Strings:
+ NICK_HELP_SET
+*** Del Strings:
+
+Anope Version 1.7.14
+--------------------
+*** New Strings:
+ CHAN_X_INVALID
+
+*** Mod Strings:
+
+*** Del Strings:
+
+Anope Version 1.7.13
+--------------------
+*** New Strings:
+
+*** Mod Strings:
+
+*** Del Strings:
+
+Anope Version 1.7.12
+--------------------
+*** New Strings:
+ OPER_STATS_UPLINK_SERVER
+ OPER_STATS_UPLINK_CAPAB
+ OPER_STATS_UPLINK_SERVER_COUNT
+
+*** Mod Strings:
+ OPER_HELP_STATS
+
+*** Del Strings:
+
+Anope Version 1.7.11
+---------------------
+*** New Strings:
+ NICK_SASET_SYNTAX
+ NICK_SASET_DISABLED
+ NICK_SASET_UNKNOWN_OPTION
+ NICK_SASET_BAD_NICK
+ NICK_SASET_OPTION_DISABLED
+ NICK_SASET_DISPLAY_INVALID
+ NICK_SASET_DISPLAY_CHANGED
+ NICK_SASET_PASSWORD_FAILED
+ NICK_SASET_PASSWORD_CHANGED
+ NICK_SASET_PASSWORD_CHANGED_TO
+ NICK_SASET_LANGUAGE_SYNTAX
+ NICK_SASET_LANGUAGE_UNKNOWN
+ NICK_SASET_LANGUAGE_CHANGED
+ NICK_SASET_URL_CHANGED
+ NICK_SASET_URL_UNSET
+ NICK_SASET_EMAIL_CHANGED
+ NICK_SASET_EMAIL_UNSET
+ NICK_SASET_EMAIL_UNSET_IMPOSSIBLE
+ NICK_SASET_ICQ_CHANGED
+ NICK_SASET_ICQ_UNSET
+ NICK_SASET_ICQ_INVALID
+ NICK_SASET_GREET_CHANGED
+ NICK_SASET_GREET_UNSET
+ NICK_SASET_KILL_SYNTAX
+ NICK_SASET_KILL_IMMED_SYNTAX
+ NICK_SASET_KILL_ON
+ NICK_SASET_KILL_QUICK
+ NICK_SASET_KILL_IMMED
+ NICK_SASET_KILL_IMMED_DISABLED
+ NICK_SASET_KILL_OFF
+ NICK_SASET_SECURE_SYNTAX
+ NICK_SASET_SECURE_ON
+ NICK_SASET_SECURE_OFF
+ NICK_SASET_PRIVATE_SYNTAX
+ NICK_SASET_PRIVATE_ON
+ NICK_SASET_PRIVATE_OFF
+ NICK_SASET_HIDE_SYNTAX
+ NICK_SASET_HIDE_EMAIL_ON
+ NICK_SASET_HIDE_EMAIL_OFF
+ NICK_SASET_HIDE_MASK_ON
+ NICK_SASET_HIDE_MASK_OFF
+ NICK_SASET_HIDE_QUIT_ON
+ NICK_SASET_HIDE_QUIT_OFF
+ NICK_SASET_HIDE_STATUS_ON
+ NICK_SASET_HIDE_STATUS_OFF
+ NICK_SASET_MSG_SYNTAX
+ NICK_SASET_MSG_ON
+ NICK_SASET_MSG_OFF
+ NICK_SASET_NOEXPIRE_SYNTAX
+ NICK_SASET_NOEXPIRE_ON
+ NICK_SASET_NOEXPIRE_OFF
+ NICK_HELP_SASET
+ NICK_HELP_SASET_DISPLAY
+ NICK_HELP_SASET_PASSWORD
+ NICK_HELP_SASET_LANGUAGE
+ NICK_HELP_SASET_URL
+ NICK_HELP_SASET_EMAIL
+ NICK_HELP_SASET_ICQ
+ NICK_HELP_SASET_GREET
+ NICK_HELP_SASET_KILL
+ NICK_HELP_SASET_SECURE
+ NICK_HELP_SASET_PRIVATE
+ NICK_HELP_SASET_HIDE
+ NICK_HELP_SASET_MSG
+ NICK_HELP_SASET_NOEXPIRE
+ NICK_HELP_CMD_SASET
+
+*** Mod Strings:
+ OPER_HELP_MODLIST
+
+*** Del Strings:
+ NICK_SERVADMIN_HELP_SET
+ NICK_SERVADMIN_HELP_SET_NOEXPIRE
+ NICK_SET_NOEXPIRE_SYNTAX
+ NICK_SET_NOEXPIRE_ON
+ NICK_SET_NOEXPIRE_OFF
+ NICK_SASET_LANGUAGE_SYNTAX
+ NICK_SASET_LANGUAGE_UNKNOWN
+ NICK_SASET_LANGUAGE_CHANGED
+ NICK_HELP_SASET_LANGUAGE
+
+
+Anope Version 1.7.10
+--------------------
+*** New Strings:
+
+*** Mod Strings:
+
+*** Del Strings:
+
+Anope Version 1.7.9
+-------------------
+*** New Strings:
+ CHAN_HELP_IRCD_HALFOP
+ CHAN_HELP_IRCD_PROTECT
+ CHAN_GETKEY_SYNTAX
+ CHAN_GETKEY_NOKEY
+ CHAN_GETKEY_KEY
+ OPER_SET_SQL_ERROR_DISABLED
+ NICK_X_SUSPENDED
+ NICK_INFO_SUSPENDED
+ NICK_SUSPEND_SYNTAX
+ NICK_SUSPEND_SUCCEEDED
+ NICK_SUSPEND_FAILED
+ NICK_UNSUSPEND_SYNTAX
+ NICK_UNSUSPEND_SUCCEEDED
+ NICK_UNSUSPEND_FAILED
+ NICK_SERVADMIN_HELP_SUSPEND
+ NICK_SERVADMIN_HELP_UNSUSPEND
+
+*** Mod Strings:
+ OPER_HELP_SET
+ NICK_HELP
+ CHAN_AOP_CLEAR
+ CHAN_HOP_CLEAR
+ CHAN_SOP_CLEAR
+ CHAN_VOP_CLEAR
+ CHAN_ACCESS_CLEAR
+ CHAN_AKICK_CLEAR
+ CHAN_SET_KEEPTOPIC_ON
+ CHAN_SET_KEEPTOPIC_OFF
+ CHAN_SET_TOPICLOCK_ON
+ CHAN_SET_TOPICLOCK_OFF
+ CHAN_SET_PEACE_ON
+ CHAN_SET_PEACE_OFF
+ CHAN_SET_PRIVATE_ON
+ CHAN_SET_PRIVATE_OFF
+ CHAN_SET_SECUREOPS_ON
+ CHAN_SET_SECUREOPS_OFF
+ CHAN_SET_SECUREFOUNDER_ON
+ CHAN_SET_SECUREFOUNDER_OFF
+ CHAN_SET_RESTRICTED_ON
+ CHAN_SET_RESTRICTED_OFF
+ CHAN_SET_SECURE_ON
+ CHAN_SET_SECURE_OFF
+ CHAN_SET_SIGNKICK_ON
+ CHAN_SET_SIGNKICK_LEVEL
+ CHAN_SET_SIGNKICK_OFF
+ CHAN_SET_OPNOTICE_ON
+ CHAN_SET_OPNOTICE_OFF
+ CHAN_SET_XOP_ON
+ CHAN_SET_XOP_OFF
+
+*** Del Strings:
+ CHAN_HELP_ULTIMATE
+ OPER_STATS_PROXY_MEM
+ 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_HELP_CACHE
+
+Anope Version 1.7.8
+-------------------
+*** New Strings:
+ OPER_HELP_SET_IGNORE
+ OPER_HELP_ADMIN_CMD_EXTRA
+ OPER_HELP_ADMIN_CMD_OLINE
+ OPER_HELP_ADMIN_CMD_UMODE
+ OPER_HELP_ADMIN_CMD_SVSNICK
+ OPER_HELP_OPER_CMD_EXTRA
+ OPER_HELP_OPER_CMD_SGLINE
+ OPER_HELP_OPER_CMD_SQLINE
+ OPER_HELP_OPER_CMD_SZLINE
+
+*** Mod Strings:
+ HOST_OFF_UNREAL
+ OPER_HELP_OPER_CMD
+ OPER_HELP_ADMIN_CMD
+
+*** Del Strings:
+
+Anope Version 1.7.7
+-------------------
+*** New Strings:
+ MEMO_NO_RSEND_SELF
+ NICK_REGISTERED_NO_MASK
+ OPER_ADMIN_MOVED
+ OPER_OPER_MOVED
+ OPER_HELP_SET_SQL
+ OPER_SET_SQL_ON
+ OPER_SET_SQL_OFF
+ OPER_SET_SQL_ERROR
+ OPER_SET_SQL_ERROR_INIT
+ OPER_EXCEPTION_EXISTS
+ OPER_EXCEPTION_CHANGED
+ OPER_SET_LIST_OPTION_ON
+ OPER_SET_LIST_OPTION_OFF
+ OPER_HELP_SET_LIST
+ OPER_SUPER_ADMIN_NOT_ENABLED
+
+*** Mod Strings:
+
+ BOT_SERVADMIN_HELP_BOT
+ NICK_HELP_STATUS
+
+*** Del Strings:
+
+Anope Version 1.7.6
+-------------------
+*** New Strings:
+
+ CHAN_REGISTER_NONE_CHANNEL
+ CHAN_SYMBOL_REQUIRED
+ OPER_SVSNICK_UNSUPPORTED
+ OPER_SQLINE_UNSUPPORTED
+ OPER_SVSO_UNSUPPORTED
+ OPER_UMODE_UNSUPPORTED
+ CHAN_CLEARED_INVITES
+ NICK_INFO_VHOST2
+ NICK_STATUS_0
+ NICK_STATUS_1
+ NICK_STATUS_2
+ NICK_STATUS_3
+ CHAN_STATUS_SYNTAX
+ CHAN_STATUS_NOT_REGGED
+ CHAN_STATUS_FORBIDDEN
+ CHAN_STATUS_NOTONLINE
+ CHAN_STATUS_INFO
+ NICK_INFO_EXPIRE
+ NICK_GLIST_REPLY
+ NICK_GLIST_REPLY_ADMIN
+ CHAN_INFO_EXPIRE
+ NICK_ACCESS_LIST_EMPTY
+ NICK_ACCESS_LIST_X_EMPTY
+
+*** Mod Strings:
+
+*** Del Strings:
+
+Anope Version 1.7.5
+-------------------
+*** New Strings:
+
+*** Mod Strings:
+
+ MEMO_HELP
+ CHAN_LEVEL_NOJOIN
+
+*** Del Strings:
+
+Anope Version 1.7.4
+-------------------
+*** New Strings:
+
+ CHAN_CLEARED_HOPS
+ OPER_MODULE_LIST_HEADER
+ OPER_MODULE_LIST_FOOTER
+ NICK_X_IS_SERVICES
+
+*** Mod Strings:
+
+ CHAN_HELP_CLEAR
+
+*** Del Strings:
+
+Anope Version 1.7.3
+-------------------
+*** New Strings:
+
+ MEMO_RSEND_PLEASE_WAIT
+ MEMO_RSEND_DISABLED
+ MEMO_RSEND_SYNTAX
+ MEMO_RSEND_NICK_MEMO_TEXT
+ MEMO_RSEND_CHAN_MEMO_TEXT
+ MEMO_RSEND_USER_NOTIFICATION
+ MEMO_HELP_RSEND
+ MEMO_CHECK_SYNTAX
+ MEMO_CHECK_NOT_READ
+ MEMO_CHECK_READ
+ MEMO_CHECK_NO_MEMO
+ MEMO_HELP_CHECK
+
+*** Mod Strings:
+ MEMO_HELP
+ NICK_LIST_SERVADMIN_SYNTAX
+ NICK_SERVADMIN_HELP_LIST
+
+Anope Version 1.7.2
+--------------------
+No Changes.
+
+Anope Version 1.7.1
+--------------------
+*** New Strings:
+
+ MEMO_SET_NOTIFY_MAIL
+ MEMO_SET_NOTIFY_NOMAIL
+ MEMO_SET_NOTIFY_INVALIDMAIL
+ MEMO_MAIL_SUBJECT
+ MEMO_MAIL_TEXT1
+ MEMO_MAIL_TEXT2
+ MEMO_MAIL_TEXT3
+ NICK_INFO_SERVICES_ROOT
+ NICK_SET_HIDE_STATUS_ON
+ NICK_SET_HIDE_STATUS_OFF
+ NICK_REG_DELAY
+
+*** Mod Strings:
+ MEMO_SET_NOTIFY_SYNTAX
+ NICK_HELP_SET_HIDE
+
+*** Del Strings:
diff --git a/Changes.mysql b/Changes.mysql
new file mode 100644
index 000000000..b51e2e306
--- /dev/null
+++ b/Changes.mysql
@@ -0,0 +1,129 @@
+Anope Version 1.8.0
+-------------------
+ALTER TABLE `anope_ns_access` DROP INDEX display;
+
+Anope Version 1.7.24
+--------------------
+- NONE
+
+Anope Version 1.7.23b
+--------------------
+- NONE
+
+Anope Version 1.7.23
+--------------------
+- NONE
+
+Anope Version 1.7.22
+--------------------
+- NONE
+
+Anope Version 1.7.21
+--------------------
+- NONE
+
+Anope Version 1.7.20
+--------------------
+ALTER TABLE `anope_ns_request` DROP INDEX `nick_index` ;
+ALTER TABLE `anope_ns_core` DROP INDEX `display_index` ;
+ALTER TABLE `anope_ns_access` ADD UNIQUE (`display`) ;
+ALTER TABLE `anope_ms_info` ADD UNIQUE (`nm_id` , `serv`) ;
+ALTER TABLE `anope_ns_alias` DROP INDEX `nick_index` ;
+ALTER TABLE `anope_cs_info` DROP INDEX `name_index` ;
+ALTER TABLE `anope_cs_access` ADD UNIQUE (`channel` , `display`) ;
+ALTER TABLE `anope_cs_levels` ADD UNIQUE (`channel` , `position`) ;
+ALTER TABLE `anope_cs_akicks` CHANGE `dmask` `dmask` VARCHAR( 255 ) NOT NULL ;
+ALTER TABLE `anope_cs_akicks` ADD UNIQUE (`channel` , `dmask`) ;
+ALTER TABLE `anope_cs_badwords` CHANGE `word` `word` VARCHAR( 255 ) NOT NULL ;
+ALTER TABLE `anope_cs_badwords` ADD UNIQUE (`channel` , `word`) ;
+ALTER TABLE `anope_cs_ttb` ADD UNIQUE (`channel` , `ttb_id`) ;
+ALTER TABLE `anope_os_akills` CHANGE `user` `user` VARCHAR( 255 ) NOT NULL , CHANGE `host` `host` VARCHAR( 255 ) NOT NULL ;
+ALTER TABLE `anope_os_akills` ADD UNIQUE (`user` , `host`) ;
+ALTER TABLE `anope_os_sglines` CHANGE `mask` `mask` VARCHAR( 255 ) NOT NULL ;
+ALTER TABLE `anope_os_sglines` ADD UNIQUE (`mask`) ;
+ALTER TABLE `anope_os_sqlines` CHANGE `mask` `mask` VARCHAR( 255 ) NOT NULL ;
+ALTER TABLE `anope_os_sqlines` ADD UNIQUE (`mask`) ;
+ALTER TABLE `anope_os_szlines` CHANGE `mask` `mask` VARCHAR( 255 ) NOT NULL ;
+ALTER TABLE `anope_os_szlines` ADD UNIQUE (`mask`) ;
+ALTER TABLE `anope_os_news` ADD UNIQUE (`type` , `num` , `time`) ;
+ALTER TABLE `anope_os_exceptions` CHANGE `mask` `mask` VARCHAR( 255 ) NOT NULL ;
+ALTER TABLE `anope_os_exceptions` ADD UNIQUE (`mask`) ;
+ALTER TABLE `anope_hs_core` DROP INDEX `nick_index` ;
+ALTER TABLE `anope_bs_core` DROP INDEX `nick_index` ;
+ALTER TABLE `anope_ms_info` CHANGE `receiver` `receiver` VARCHAR( 255 ) NOT NULL ;
+ALTER TABLE `anope_ms_info` ADD INDEX ( `receiver` , `serv` ) ;
+
+Anope Version 1.7.19
+--------------------
+- NONE
+
+Anope Version 1.7.18
+--------------------
+- DROP TABLE IF EXISTS `anope_os_status`
+- ALTER TABLE `anope_bs_core` ADD `active` TINYINT( 1 ) DEFAULT '1' NOT NULL
+- ALTER TABLE `anope_cs_access` ADD `active` TINYINT( 1 ) DEFAULT '1' NOT NULL
+- ALTER TABLE `anope_cs_akicks` ADD `active` TINYINT( 1 ) DEFAULT '1' NOT NULL
+- ALTER TABLE `anope_cs_badwords` ADD `active` TINYINT( 1 ) DEFAULT '1' NOT NULL
+- ALTER TABLE `anope_cs_levels` ADD `active` TINYINT( 1 ) DEFAULT '1' NOT NULL
+- ALTER TABLE `anope_cs_ttb` ADD `active` TINYINT( 1 ) DEFAULT '1' NOT NULL
+- ALTER TABLE `anope_hs_core` ADD `active` TINYINT( 1 ) DEFAULT '1' NOT NULL
+- ALTER TABLE `anope_ms_info` ADD `active` TINYINT( 1 ) DEFAULT '1' NOT NULL
+- ALTER TABLE `anope_ns_access` ADD `active` TINYINT( 1 ) DEFAULT '1' NOT NULL
+- ALTER TABLE `anope_ns_request` CHANGE `active` `active` TINYINT( 1 ) DEFAULT '1' NOT NULL
+- ALTER TABLE `anope_os_akills` ADD `active` TINYINT( 1 ) DEFAULT '1' NOT NULL
+- ALTER TABLE `anope_os_exceptions` ADD `active` TINYINT( 1 ) DEFAULT '1' NOT NULL
+- ALTER TABLE `anope_os_news` ADD `active` TINYINT( 1 ) DEFAULT '1' NOT NULL
+- ALTER TABLE `anope_os_sglines` ADD `active` TINYINT( 1 ) DEFAULT '1' NOT NULL
+- ALTER TABLE `anope_os_sqlines` ADD `active` TINYINT( 1 ) DEFAULT '1' NOT NULL
+- ALTER TABLE `anope_os_szlines` ADD `active` TINYINT( 1 ) DEFAULT '1' NOT NULL
+
+Anope Version 1.7.17
+--------------------
+- CREATE TABLE anope_cs_ttb (
+ ct_id int(11) NOT NULL auto_increment,
+ channel varchar(255) NOT NULL default '',
+ ttb_id int(11) NOT NULL default '0',
+ value int(11) NOT NULL default '0',
+ PRIMARY KEY (ct_id)
+ ) TYPE=MyISAM
+- ALTER TABLE anope_cs_info DROP ttb
+
+Anope Version 1.7.16
+--------------------
+- NONE
+
+Anope Version 1.7.15
+--------------------
+- NONE
+
+Anope Version 1.7.14
+--------------------
+- NONE
+
+Anope Version 1.7.13
+--------------------
+- NONE
+
+Anope Version 1.7.12
+--------------------
+- NONE
+
+Anope Version 1.7.11
+--------------------
+- NONE
+
+Anope Version 1.7.10
+--------------------
+- NONE
+
+Anope Version 1.7.9
+-------------------
+- DROP TABLE IF EXISTS anope_os_cache
+
+Anope Version 1.7.8
+-------------------
+- NONE
+
+Anope Version 1.7.7
+-------------------
+- ALTER TABLE anope_ns_alias CHANGE status status int(11) unsigned NOT NULL default '0'
diff --git a/Config b/Config
new file mode 100755
index 000000000..c35c7a7db
--- /dev/null
+++ b/Config
@@ -0,0 +1,325 @@
+#!/bin/sh
+#
+# Configuration script for Services.
+#
+# Anope (c) 2003-2007 Anope team
+# Contact us at dev@anope.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.
+#
+###########################################################################
+
+echo2 () {
+ $ECHO2 "$*$ECHO2SUF" # these are defined later
+}
+
+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
+}
+
+Load_Cache () {
+ if [ -f config.cache -a -r config.cache -a ! "$IGNORE_CACHE" ] ; then
+ echo "Using defaults from config.cache. To ignore, ./Config -nocache"
+ echo ""
+ . config.cache
+ CAN_QUICK="yes"
+ else
+ CAN_QUICK="no"
+ fi
+}
+
+Run_Configure () {
+WITH_BIN=""
+WITH_DATA=""
+WITH_ENC=""
+WITH_RUN=""
+WITH_PERM=""
+WITH_MYSQL=""
+
+if [ "$BINDEST" != "" ] ; then
+ WITH_BIN=" --with-bindir=$BINDEST"
+ WITH_DATA=" --with-datadir=$DATDEST"
+fi
+
+if [ "$DATDEST" != "" ] ; then
+ WITH_DATA=" --with-datadir=$DATDEST"
+fi
+
+if [ "$RUNGROUP" != "" ] ; then
+ WITH_RUN=" --with-rungroup=$RUNGROUP"
+fi
+
+if [ "$UMASK" != "" ] ; then
+ WITH_PERM=" --with-permissions=$UMASK"
+fi
+
+if [ "$MYSQL" != "yes" ] ; then
+ WITH_MYSQL=" --without-mysql"
+fi
+
+
+echo "./configure $WITH_BIN $WITH_DATA $WITH_ENC $WITH_RUN $WITH_PERM $WITH_MYSQL"
+
+./configure $WITH_BIN $WITH_DATA $WITH_ENC $WITH_RUN $WITH_PERM $WITH_MYSQL
+}
+
+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
+
+###########################################################################
+# Init values
+###########################################################################
+
+BINDEST=$HOME/services
+DATDEST=$HOME/services
+RUNGROUP=
+UMASK=
+IRCTYPE="no default"
+CAN_QUICK="no"
+
+###########################################################################
+# Check out the options
+###########################################################################
+while [ $# -ge 1 ] ; do
+ if [ $1 = "--help" ] ; then
+ echo "Config utility for Anope"
+ echo "------------------------"
+ echo "Syntax: ./Config [options]"
+ echo "-nocache Ignore settings saved in config.cache"
+ echo "-nointro Skip intro (disclaimer, etc)"
+ echo "-quick Skip questions, go straight to configure"
+ exit 0
+ elif [ $1 = "-nocache" ] ; then
+ IGNORE_CACHE="1"
+ elif [ $1 = "-nointro" ] ; then
+ NO_INTRO="1"
+ elif [ $1 = "-quick" -o $1 = "-q" ] ; then
+ Load_Cache
+ if [ $CAN_QUICK = "yes" ] ; then
+ Run_Configure
+ else
+ echo ""
+ echo "Can't find cache file (config.cache), aborting..."
+ fi
+ exit 0
+ fi
+ shift 1
+done
+
+###########################################################################
+if [ ! "$NO_INTRO" ] ; then
+ clear
+ . ./version.log
+ cat .BANNER | sed "s/CURVER/$VERSION_MAJOR.$VERSION_MINOR.$VERSION_PATCH$VERSION_EXTRA/" | more
+ echo ""
+else
+ echo ""
+fi
+
+echo "Beginning Services configuration."
+echo ""
+
+###########################################################################
+# Load the cache
+###########################################################################
+if [ ! "$IGNORE_CACHE" ] ; then
+ Load_Cache
+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/include/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/include/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
+DEF=yes
+echo "Allow anope to automatically check for mysql libaries?"
+echo "unless you get errors with make, there is no need to"
+echo "change this setting."
+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*)
+ MYSQL=
+ ok=1
+ ;;
+ y*|Y*)
+ MYSQL="yes"
+ ok=1
+ ;;
+ *)
+ echo "Please enter 'yes' or 'no'."
+ ;;
+ esac
+done
+echo ""
+
+####
+
+
+################################################################################
+# Store values
+################################################################################
+echo2 "Saving configuration results in config.cache... "
+
+cat <<EOT >config.cache
+BINDEST="$BINDEST"
+DATDEST="$DATDEST"
+RUNGROUP="$RUNGROUP"
+UMASK=$UMASK
+IRCTYPE="$IRCTYPE"
+IRCTYPE_DEF="$IRCTYPE_DEF"
+MYSQL="$MYSQL"
+EOT
+echo "done."
+
+
+################################################################################
+# Build the configure string
+################################################################################
+Run_Configure
diff --git a/Config.bat b/Config.bat
new file mode 100644
index 000000000..96501a98c
--- /dev/null
+++ b/Config.bat
@@ -0,0 +1,3 @@
+@echo off
+cscript /nologo install.js
+
diff --git a/Makefile.in b/Makefile.in
new file mode 100644
index 000000000..96cde3433
--- /dev/null
+++ b/Makefile.in
@@ -0,0 +1,131 @@
+CC=@CC@
+INCLUDEDIR=../include
+ANOPELIBS=@ANOPELIBS@
+CFLAGS=@CFLAGS@
+STRICT=-Wall -ansi -pedantic
+PROFILE=-pg
+LDPROFILE=
+SHELL=/bin/sh
+SUBDIRS=src
+BINDEST=@BINDEST@
+DATDEST=@DATDEST@
+INSTALL=@INSTALL@
+RM=@RM@
+CP=@CP@
+TOUCH=@TOUCH@
+MODULE_PATH=@MODULE_PATH@
+MYSQL=@MYSQL@
+RDB=@RDB@
+LDFLAGS=@LDFLAGS@
+RUNGROUP=@RUNGROUP@
+SHARED=@SHARED@
+MODULEFLAGS=@MODULEFLAGS@
+
+all: language headers build core protocols tools modules
+strict: language headers strict_build strict_core strict_protocols strict_tools strict_modules
+profile: language headers profile_build profile_core profile_protocols profile_tools profile_modules
+
+MAKEARGS = 'CFLAGS=${CFLAGS}' 'CC=${CC}' 'ANOPELIBS=${ANOPELIBS}' \
+ 'LDFLAGS=${LDFLAGS}' 'BINDEST=${BINDEST}' 'INSTALL=${INSTALL}' \
+ 'INCLUDEDIR=${INCLUDEDIR}' 'RM=${RM}' 'CP=${CP}' \
+ 'TOUCH=${TOUCH}' 'SHELL=${SHELL}' 'DATDEST=${DATDEST}' \
+ 'RUNGROUP=${RUNGROUP}' 'MODULE_PATH=${MODULE_PATH}' 'RDB=${RDB}'\
+ 'MYSQL=${MYSQL}' 'SHARED=${SHARED}' 'MODULEFLAGS=${MODULEFLAGS}'
+
+build: language headers
+ @for i in $(SUBDIRS); do \
+ echo "*** Building $$i";\
+ ( cd $$i; ${MAKE} ${MAKEARGS} all; ) \
+ done
+
+strict_build:
+ @for i in $(SUBDIRS); do \
+ echo "*** Strict Building $$i";\
+ ( cd $$i; ${MAKE} ${MAKEARGS} 'CFLAGS=${CFLAGS} $(STRICT)' all; ) \
+ done
+
+profile_build:
+ @for i in $(SUBDIRS); do \
+ echo "*** Strict Building $$i";\
+ ( cd $$i; ${MAKE} ${MAKEARGS} 'CFLAGS=${CFLAGS} $(PROFILE)' 'LDFLAGS=${LDFLAGS} ${PROFILE}' all; ) \
+ done
+
+modules: build
+ (cd src/modules ; ./configure ; ${MAKE} ${MAKEARGS} all; )
+ @echo "*** All done, now (g)make install to install Anope/Modules";
+
+clean_modules:
+ (cd src ; ${MAKE} ${MAKEARGS} clean_modules )
+
+distclean_modules:
+ (cd src ; ${MAKE} ${MAKEARGS} distclean_modules )
+
+protocols: build
+ @echo "*** Building protocol support";
+ (cd src/protocol ; ./configure ; ${MAKE} ${MAKEARGS} all; )
+
+strict_protocols: build
+ @echo "*** Building protocol support";
+ (cd src/protocol ; ./configure ; ${MAKE} ${MAKEARGS} 'CFLAGS=${CFLAGS} $(STRICT)' all; )
+
+profile_protocols: build
+ @echo "*** Building protocol support";
+ (cd src/protocol ; ./configure ; ${MAKE} ${MAKEARGS} 'CFLAGS=${CFLAGS} ${PROFILE}' 'PROFILE=${PROFILE}' all; )
+
+core: build
+ @echo "*** Building Core modules";
+ (cd src/ ; ${MAKE} ${MAKEARGS} core; )
+
+strict_core: build
+ @echo "*** Building Core modules";
+ (cd src/ ; ${MAKE} ${MAKEARGS} 'CFLAGS=${CFLAGS} $(STRICT)' core; )
+
+profile_core: build
+ @echo "*** Building Core modules";
+ (cd src/ ; ${MAKE} ${MAKEARGS} 'CFLAGS=${CFLAGS} ${PROFILE}' 'PROFILE=${PROFILE}' core; )
+
+tools: build
+ (cd src/tools ; ${MAKE} ${MAKEARGS} all; )
+ @echo "*** All done, now (g)make install to install Anope/Modules/Tools";
+
+strict_tools: strict_build
+ (cd src/tools ; ${MAKE} ${MAKEARGS} 'CFLAGS=${CFLAGS} $(STRICT)' all; )
+ @echo "*** All done, now (g)make install to install Anope/Modules/Tools";
+
+profile_tools: profile_build
+ (cd src/tools ; ${MAKE} ${MAKEARGS} 'CFLAGS=${CFLAGS} $(PROFILE)' all; )
+ @echo "*** All done, now (g)make install to install Anope/Modules/Tools";
+
+strict_modules: strict_build
+ (cd src/modules ; ./configure ; ${MAKE} ${MAKEARGS} 'CFLAGS=$(CFLAGS) $(STRICT)' all; )
+ @echo "*** All done, now (g)make install to install Anope/Modules";
+
+profile_modules: profile_build
+ (cd src/modules ; ./configure ; ${MAKE} ${MAKEARGS} 'CFLAGS=${CFLAGS} ${PROFILE}' 'PROFILE=${PROFILE}' all; )
+ @echo "*** All done, now (g)make install to install Anope/Modules";
+
+language:
+ (cd lang ; $(MAKE) ${MAKEARGS} all language.h ; )
+
+headers:
+ (cd include ; ${MAKE} ${MAKEARGS} )
+
+clean:
+ (cd lang ; ${MAKE} ${MAKEARGS} clean )
+ (cd include ; ${MAKE} ${MAKEARGS} clean )
+ (cd src ; ${MAKE} ${MAKEARGS} clean )
+ (cd src/tools ; ${MAKE} ${MAKEARGS} clean )
+
+distclean: clean
+ (cd lang ; ${MAKE} distclean )
+ (cd include ; ${MAKE} distclean )
+ (cd src ; ${MAKE} distclean )
+ (cd src/tools ; ${MAKE} distclean )
+ rm -f config.log config.status config.cache Makefile src/bin/anoperc
+
+install: DUMMY
+ (cd src ; ${MAKE} ${MAKEARGS} install)
+ (cd src/tools ; ${MAKE} ${MAKEARGS} install)
+ @echo "*** All done, Anope is now installed. Please read docs/INSTALL for details on what to do now.";
+
+DUMMY:
diff --git a/Makefile.win32 b/Makefile.win32
new file mode 100644
index 000000000..a6dfe119b
--- /dev/null
+++ b/Makefile.win32
@@ -0,0 +1,96 @@
+# Makefile for Anope.
+#
+# (C) 2003-2008 Anope Team
+# Contact us at info@anope.org
+#
+# This program is free but copyrighted software; see the file COPYING for
+# details.
+#
+# Based on the original code of Epona by Lara.
+# Based on the original code of Services by Andy Church.
+
+include Makefile.inc.win32
+
+###########################################################################
+
+all: src core protocols languages tools modules install
+
+src: include\version.h include\sysconf.h include\language.h include\sysconf.h
+ cd src && $(MAKE) && cd ..
+
+install:
+ -@mkdir $(DATDEST)\backups
+ -@mkdir $(DATDEST)\logs
+ -@mkdir $(DATDEST)\languages
+ cd lang && $(MAKE) install && cd ..
+ cd src && $(MAKE) install && cd ..
+ cd src\modules && $(MAKE) install && cd ..
+ cd src\modules && $(MAKE) subs-install && cd ..
+ cd src\protocol && $(MAKE) install && cd ..
+ cd src\core && $(MAKE) install && cd ..
+ cd src\tools && $(MAKE) install && cd ..
+ -@echo ---
+ -@echo Anope has been installed successfully!
+ -@echo See docs\INSTALL for details on how to configure Anope for use.
+ -@echo ---
+
+spotless:
+ cd lang && $(MAKE) spotless && cd ..
+ cd src && $(MAKE) spotless && cd ..
+ cd src\modules && $(MAKE) spotless && cd ..\..
+ cd src\protocol && $(MAKE) spotless && cd ..\..
+ cd src\core && $(MAKE) spotless && cd ..\..
+ cd src\tools && $(MAKE) spotless && cd ..\..
+ -@erase include\language.h include\version.h *.manifest *~ anope.exe version.sh.exe *.obj anopesmtp.exe
+ -@echo --
+ -@echo NOTICE:
+ -@echo You will need to run cscript /nologo install.js again
+ -@echo --
+
+mypasql:
+ $(MYPASQL_BUILD)
+
+distclean: spotless
+
+clean: spotless
+
+###########################################################################
+
+
+languages: FRC
+ cd lang && $(MAKE) && cd ..
+
+tools: FRC
+ cd src\tools && $(MAKE) && cd ..\..
+
+core: FRC
+ cd src\core && $(MAKE) && cd ..\..
+
+protocols: FRC
+ cd src\protocol && $(MAKE) && cd ..\..
+
+modules: FRC
+ cd src\modules && $(MAKE) && cd ..\..
+
+###########################################################################
+
+include\sysconf.h:
+ copy include\sysconf.h.win32 include\sysconf.h
+
+lang\language.h: lang\Makefile lang\index
+ cd lang && $(MAKE) language.h && cd ..
+
+lang\index:
+ cd lang && $(MAKE) index && cd ..
+
+include\language.h: lang\language.h
+ cd lang && copy language.h ..\include\language.h && cd ..
+
+include\version.h: version.sh.exe version.log include\services.h include\pseudo.h include\messages.h
+ version.sh.exe
+ move version.h include\version.h
+
+version.sh.exe:
+ $(CC) $(BASE_CFLAGS) include\version.sh.c /link $(LFLAGS)
+
+FRC:
diff --git a/aclocal.m4 b/aclocal.m4
new file mode 100644
index 000000000..0d17d95bd
--- /dev/null
+++ b/aclocal.m4
@@ -0,0 +1,863 @@
+dnl aclocal.m4 generated automatically by aclocal 1.4-p6
+
+dnl Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl This program is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+dnl PARTICULAR PURPOSE.
+
+# lib-prefix.m4 serial 4 (gettext-0.14.2)
+dnl Copyright (C) 2001-2005 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and
+dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't
+dnl require excessive bracketing.
+ifdef([AC_HELP_STRING],
+[AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])],
+[AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])])
+
+dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed
+dnl to access previously installed libraries. The basic assumption is that
+dnl a user will want packages to use other packages he previously installed
+dnl with the same --prefix option.
+dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate
+dnl libraries, but is otherwise very convenient.
+AC_DEFUN([AC_LIB_PREFIX],
+[
+ AC_BEFORE([$0], [AC_LIB_LINKFLAGS])
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+ dnl By default, look in $includedir and $libdir.
+ use_additional=yes
+ AC_LIB_WITH_FINAL_PREFIX([
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ ])
+ AC_LIB_ARG_WITH([lib-prefix],
+[ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib
+ --without-lib-prefix don't search for libraries in includedir and libdir],
+[
+ if test "X$withval" = "Xno"; then
+ use_additional=no
+ else
+ if test "X$withval" = "X"; then
+ AC_LIB_WITH_FINAL_PREFIX([
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ ])
+ else
+ additional_includedir="$withval/include"
+ additional_libdir="$withval/lib"
+ fi
+ fi
+])
+ if test $use_additional = yes; then
+ dnl Potentially add $additional_includedir to $CPPFLAGS.
+ dnl But don't add it
+ dnl 1. if it's the standard /usr/include,
+ dnl 2. if it's already present in $CPPFLAGS,
+ dnl 3. if it's /usr/local/include and we are using GCC on Linux,
+ dnl 4. if it doesn't exist as a directory.
+ if test "X$additional_includedir" != "X/usr/include"; then
+ haveit=
+ for x in $CPPFLAGS; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-I$additional_includedir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test "X$additional_includedir" = "X/usr/local/include"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ if test -d "$additional_includedir"; then
+ dnl Really add $additional_includedir to $CPPFLAGS.
+ CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir"
+ fi
+ fi
+ fi
+ fi
+ dnl Potentially add $additional_libdir to $LDFLAGS.
+ dnl But don't add it
+ dnl 1. if it's the standard /usr/lib,
+ dnl 2. if it's already present in $LDFLAGS,
+ dnl 3. if it's /usr/local/lib and we are using GCC on Linux,
+ dnl 4. if it doesn't exist as a directory.
+ if test "X$additional_libdir" != "X/usr/lib"; then
+ haveit=
+ for x in $LDFLAGS; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-L$additional_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test "X$additional_libdir" = "X/usr/local/lib"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux*) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ if test -d "$additional_libdir"; then
+ dnl Really add $additional_libdir to $LDFLAGS.
+ LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir"
+ fi
+ fi
+ fi
+ fi
+ fi
+])
+
+dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix,
+dnl acl_final_exec_prefix, containing the values to which $prefix and
+dnl $exec_prefix will expand at the end of the configure script.
+AC_DEFUN([AC_LIB_PREPARE_PREFIX],
+[
+ dnl Unfortunately, prefix and exec_prefix get only finally determined
+ dnl at the end of configure.
+ if test "X$prefix" = "XNONE"; then
+ acl_final_prefix="$ac_default_prefix"
+ else
+ acl_final_prefix="$prefix"
+ fi
+ if test "X$exec_prefix" = "XNONE"; then
+ acl_final_exec_prefix='${prefix}'
+ else
+ acl_final_exec_prefix="$exec_prefix"
+ fi
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ eval acl_final_exec_prefix=\"$acl_final_exec_prefix\"
+ prefix="$acl_save_prefix"
+])
+
+dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the
+dnl variables prefix and exec_prefix bound to the values they will have
+dnl at the end of the configure script.
+AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX],
+[
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ $1
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+])
+
+# lib-link.m4 serial 6 (gettext-0.14.3)
+dnl Copyright (C) 2001-2005 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+AC_PREREQ(2.50)
+
+dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and
+dnl the libraries corresponding to explicit and implicit dependencies.
+dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and
+dnl augments the CPPFLAGS variable.
+AC_DEFUN([AC_LIB_LINKFLAGS],
+[
+ AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+ AC_REQUIRE([AC_LIB_RPATH])
+ define([Name],[translit([$1],[./-], [___])])
+ define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
+ AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [
+ AC_LIB_LINKFLAGS_BODY([$1], [$2])
+ ac_cv_lib[]Name[]_libs="$LIB[]NAME"
+ ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME"
+ ac_cv_lib[]Name[]_cppflags="$INC[]NAME"
+ ])
+ LIB[]NAME="$ac_cv_lib[]Name[]_libs"
+ LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs"
+ INC[]NAME="$ac_cv_lib[]Name[]_cppflags"
+ AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
+ AC_SUBST([LIB]NAME)
+ AC_SUBST([LTLIB]NAME)
+ dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the
+ dnl results of this search when this library appears as a dependency.
+ HAVE_LIB[]NAME=yes
+ undefine([Name])
+ undefine([NAME])
+])
+
+dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode)
+dnl searches for libname and the libraries corresponding to explicit and
+dnl implicit dependencies, together with the specified include files and
+dnl the ability to compile and link the specified testcode. If found, it
+dnl sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} and
+dnl LTLIB${NAME} variables and augments the CPPFLAGS variable, and
+dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs
+dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty.
+AC_DEFUN([AC_LIB_HAVE_LINKFLAGS],
+[
+ AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+ AC_REQUIRE([AC_LIB_RPATH])
+ define([Name],[translit([$1],[./-], [___])])
+ define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
+
+ dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME
+ dnl accordingly.
+ AC_LIB_LINKFLAGS_BODY([$1], [$2])
+
+ dnl Add $INC[]NAME to CPPFLAGS before performing the following checks,
+ dnl because if the user has installed lib[]Name and not disabled its use
+ dnl via --without-lib[]Name-prefix, he wants to use it.
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
+
+ AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [
+ ac_save_LIBS="$LIBS"
+ LIBS="$LIBS $LIB[]NAME"
+ AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name=no])
+ LIBS="$ac_save_LIBS"
+ ])
+ if test "$ac_cv_lib[]Name" = yes; then
+ HAVE_LIB[]NAME=yes
+ AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the $1 library.])
+ AC_MSG_CHECKING([how to link with lib[]$1])
+ AC_MSG_RESULT([$LIB[]NAME])
+ else
+ HAVE_LIB[]NAME=no
+ dnl If $LIB[]NAME didn't lead to a usable library, we don't need
+ dnl $INC[]NAME either.
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LIB[]NAME=
+ LTLIB[]NAME=
+ fi
+ AC_SUBST([HAVE_LIB]NAME)
+ AC_SUBST([LIB]NAME)
+ AC_SUBST([LTLIB]NAME)
+ undefine([Name])
+ undefine([NAME])
+])
+
+dnl Determine the platform dependent parameters needed to use rpath:
+dnl libext, shlibext, hardcode_libdir_flag_spec, hardcode_libdir_separator,
+dnl hardcode_direct, hardcode_minus_L.
+AC_DEFUN([AC_LIB_RPATH],
+[
+ dnl Tell automake >= 1.10 to complain if config.rpath is missing.
+ m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([config.rpath])])
+ AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS
+ AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host
+ AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir
+ AC_CACHE_CHECK([for shared library run path origin], acl_cv_rpath, [
+ CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \
+ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh
+ . ./conftest.sh
+ rm -f ./conftest.sh
+ acl_cv_rpath=done
+ ])
+ wl="$acl_cv_wl"
+ libext="$acl_cv_libext"
+ shlibext="$acl_cv_shlibext"
+ hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
+ hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
+ hardcode_direct="$acl_cv_hardcode_direct"
+ hardcode_minus_L="$acl_cv_hardcode_minus_L"
+ dnl Determine whether the user wants rpath handling at all.
+ AC_ARG_ENABLE(rpath,
+ [ --disable-rpath do not hardcode runtime library paths],
+ :, enable_rpath=yes)
+])
+
+dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and
+dnl the libraries corresponding to explicit and implicit dependencies.
+dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables.
+AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
+[
+ define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
+ dnl By default, look in $includedir and $libdir.
+ use_additional=yes
+ AC_LIB_WITH_FINAL_PREFIX([
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ ])
+ AC_LIB_ARG_WITH([lib$1-prefix],
+[ --with-lib$1-prefix[=DIR] search for lib$1 in DIR/include and DIR/lib
+ --without-lib$1-prefix don't search for lib$1 in includedir and libdir],
+[
+ if test "X$withval" = "Xno"; then
+ use_additional=no
+ else
+ if test "X$withval" = "X"; then
+ AC_LIB_WITH_FINAL_PREFIX([
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ ])
+ else
+ additional_includedir="$withval/include"
+ additional_libdir="$withval/lib"
+ fi
+ fi
+])
+ dnl Search the library and its dependencies in $additional_libdir and
+ dnl $LDFLAGS. Using breadth-first-seach.
+ LIB[]NAME=
+ LTLIB[]NAME=
+ INC[]NAME=
+ rpathdirs=
+ ltrpathdirs=
+ names_already_handled=
+ names_next_round='$1 $2'
+ while test -n "$names_next_round"; do
+ names_this_round="$names_next_round"
+ names_next_round=
+ for name in $names_this_round; do
+ already_handled=
+ for n in $names_already_handled; do
+ if test "$n" = "$name"; then
+ already_handled=yes
+ break
+ fi
+ done
+ if test -z "$already_handled"; then
+ names_already_handled="$names_already_handled $name"
+ dnl See if it was already located by an earlier AC_LIB_LINKFLAGS
+ dnl or AC_LIB_HAVE_LINKFLAGS call.
+ uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'`
+ eval value=\"\$HAVE_LIB$uppername\"
+ if test -n "$value"; then
+ if test "$value" = yes; then
+ eval value=\"\$LIB$uppername\"
+ test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value"
+ eval value=\"\$LTLIB$uppername\"
+ test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value"
+ else
+ dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined
+ dnl that this library doesn't exist. So just drop it.
+ :
+ fi
+ else
+ dnl Search the library lib$name in $additional_libdir and $LDFLAGS
+ dnl and the already constructed $LIBNAME/$LTLIBNAME.
+ found_dir=
+ found_la=
+ found_so=
+ found_a=
+ if test $use_additional = yes; then
+ if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then
+ found_dir="$additional_libdir"
+ found_so="$additional_libdir/lib$name.$shlibext"
+ if test -f "$additional_libdir/lib$name.la"; then
+ found_la="$additional_libdir/lib$name.la"
+ fi
+ else
+ if test -f "$additional_libdir/lib$name.$libext"; then
+ found_dir="$additional_libdir"
+ found_a="$additional_libdir/lib$name.$libext"
+ if test -f "$additional_libdir/lib$name.la"; then
+ found_la="$additional_libdir/lib$name.la"
+ fi
+ fi
+ fi
+ fi
+ if test "X$found_dir" = "X"; then
+ for x in $LDFLAGS $LTLIB[]NAME; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ case "$x" in
+ -L*)
+ dir=`echo "X$x" | sed -e 's/^X-L//'`
+ if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then
+ found_dir="$dir"
+ found_so="$dir/lib$name.$shlibext"
+ if test -f "$dir/lib$name.la"; then
+ found_la="$dir/lib$name.la"
+ fi
+ else
+ if test -f "$dir/lib$name.$libext"; then
+ found_dir="$dir"
+ found_a="$dir/lib$name.$libext"
+ if test -f "$dir/lib$name.la"; then
+ found_la="$dir/lib$name.la"
+ fi
+ fi
+ fi
+ ;;
+ esac
+ if test "X$found_dir" != "X"; then
+ break
+ fi
+ done
+ fi
+ if test "X$found_dir" != "X"; then
+ dnl Found the library.
+ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name"
+ if test "X$found_so" != "X"; then
+ dnl Linking with a shared library. We attempt to hardcode its
+ dnl directory into the executable's runpath, unless it's the
+ dnl standard /usr/lib.
+ if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then
+ dnl No hardcoding is needed.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+ else
+ dnl Use an explicit option to hardcode DIR into the resulting
+ dnl binary.
+ dnl Potentially add DIR to ltrpathdirs.
+ dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
+ haveit=
+ for x in $ltrpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ ltrpathdirs="$ltrpathdirs $found_dir"
+ fi
+ dnl The hardcoding into $LIBNAME is system dependent.
+ if test "$hardcode_direct" = yes; then
+ dnl Using DIR/libNAME.so during linking hardcodes DIR into the
+ dnl resulting binary.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+ else
+ if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then
+ dnl Use an explicit option to hardcode DIR into the resulting
+ dnl binary.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+ dnl Potentially add DIR to rpathdirs.
+ dnl The rpathdirs will be appended to $LIBNAME at the end.
+ haveit=
+ for x in $rpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ rpathdirs="$rpathdirs $found_dir"
+ fi
+ else
+ dnl Rely on "-L$found_dir".
+ dnl But don't add it if it's already contained in the LDFLAGS
+ dnl or the already constructed $LIBNAME
+ haveit=
+ for x in $LDFLAGS $LIB[]NAME; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-L$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir"
+ fi
+ if test "$hardcode_minus_L" != no; then
+ dnl FIXME: Not sure whether we should use
+ dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
+ dnl here.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+ else
+ dnl We cannot use $hardcode_runpath_var and LD_RUN_PATH
+ dnl here, because this doesn't fit in flags passed to the
+ dnl compiler. So give up. No hardcoding. This affects only
+ dnl very old systems.
+ dnl FIXME: Not sure whether we should use
+ dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
+ dnl here.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
+ fi
+ fi
+ fi
+ fi
+ else
+ if test "X$found_a" != "X"; then
+ dnl Linking with a static library.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a"
+ else
+ dnl We shouldn't come here, but anyway it's good to have a
+ dnl fallback.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name"
+ fi
+ fi
+ dnl Assume the include files are nearby.
+ additional_includedir=
+ case "$found_dir" in
+ */lib | */lib/)
+ basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'`
+ additional_includedir="$basedir/include"
+ ;;
+ esac
+ if test "X$additional_includedir" != "X"; then
+ dnl Potentially add $additional_includedir to $INCNAME.
+ dnl But don't add it
+ dnl 1. if it's the standard /usr/include,
+ dnl 2. if it's /usr/local/include and we are using GCC on Linux,
+ dnl 3. if it's already present in $CPPFLAGS or the already
+ dnl constructed $INCNAME,
+ dnl 4. if it doesn't exist as a directory.
+ if test "X$additional_includedir" != "X/usr/include"; then
+ haveit=
+ if test "X$additional_includedir" = "X/usr/local/include"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ for x in $CPPFLAGS $INC[]NAME; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-I$additional_includedir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_includedir"; then
+ dnl Really add $additional_includedir to $INCNAME.
+ INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir"
+ fi
+ fi
+ fi
+ fi
+ fi
+ dnl Look for dependencies.
+ if test -n "$found_la"; then
+ dnl Read the .la file. It defines the variables
+ dnl dlname, library_names, old_library, dependency_libs, current,
+ dnl age, revision, installed, dlopen, dlpreopen, libdir.
+ save_libdir="$libdir"
+ case "$found_la" in
+ */* | *\\*) . "$found_la" ;;
+ *) . "./$found_la" ;;
+ esac
+ libdir="$save_libdir"
+ dnl We use only dependency_libs.
+ for dep in $dependency_libs; do
+ case "$dep" in
+ -L*)
+ additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+ dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME.
+ dnl But don't add it
+ dnl 1. if it's the standard /usr/lib,
+ dnl 2. if it's /usr/local/lib and we are using GCC on Linux,
+ dnl 3. if it's already present in $LDFLAGS or the already
+ dnl constructed $LIBNAME,
+ dnl 4. if it doesn't exist as a directory.
+ if test "X$additional_libdir" != "X/usr/lib"; then
+ haveit=
+ if test "X$additional_libdir" = "X/usr/local/lib"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ haveit=
+ for x in $LDFLAGS $LIB[]NAME; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-L$additional_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_libdir"; then
+ dnl Really add $additional_libdir to $LIBNAME.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir"
+ fi
+ fi
+ haveit=
+ for x in $LDFLAGS $LTLIB[]NAME; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-L$additional_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_libdir"; then
+ dnl Really add $additional_libdir to $LTLIBNAME.
+ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir"
+ fi
+ fi
+ fi
+ fi
+ ;;
+ -R*)
+ dir=`echo "X$dep" | sed -e 's/^X-R//'`
+ if test "$enable_rpath" != no; then
+ dnl Potentially add DIR to rpathdirs.
+ dnl The rpathdirs will be appended to $LIBNAME at the end.
+ haveit=
+ for x in $rpathdirs; do
+ if test "X$x" = "X$dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ rpathdirs="$rpathdirs $dir"
+ fi
+ dnl Potentially add DIR to ltrpathdirs.
+ dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
+ haveit=
+ for x in $ltrpathdirs; do
+ if test "X$x" = "X$dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ ltrpathdirs="$ltrpathdirs $dir"
+ fi
+ fi
+ ;;
+ -l*)
+ dnl Handle this in the next round.
+ names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
+ ;;
+ *.la)
+ dnl Handle this in the next round. Throw away the .la's
+ dnl directory; it is already contained in a preceding -L
+ dnl option.
+ names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+ ;;
+ *)
+ dnl Most likely an immediate library name.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep"
+ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep"
+ ;;
+ esac
+ done
+ fi
+ else
+ dnl Didn't find the library; assume it is in the system directories
+ dnl known to the linker and runtime loader. (All the system
+ dnl directories known to the linker should also be known to the
+ dnl runtime loader, otherwise the system is severely misconfigured.)
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
+ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name"
+ fi
+ fi
+ fi
+ done
+ done
+ if test "X$rpathdirs" != "X"; then
+ if test -n "$hardcode_libdir_separator"; then
+ dnl Weird platform: only the last -rpath option counts, the user must
+ dnl pass all path elements in one option. We can arrange that for a
+ dnl single library, but not when more than one $LIBNAMEs are used.
+ alldirs=
+ for found_dir in $rpathdirs; do
+ alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir"
+ done
+ dnl Note: hardcode_libdir_flag_spec uses $libdir and $wl.
+ acl_save_libdir="$libdir"
+ libdir="$alldirs"
+ eval flag=\"$hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
+ else
+ dnl The -rpath options are cumulative.
+ for found_dir in $rpathdirs; do
+ acl_save_libdir="$libdir"
+ libdir="$found_dir"
+ eval flag=\"$hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
+ done
+ fi
+ fi
+ if test "X$ltrpathdirs" != "X"; then
+ dnl When using libtool, the option that works for both libraries and
+ dnl executables is -R. The -R options are cumulative.
+ for found_dir in $ltrpathdirs; do
+ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir"
+ done
+ fi
+])
+
+dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR,
+dnl unless already present in VAR.
+dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes
+dnl contains two or three consecutive elements that belong together.
+AC_DEFUN([AC_LIB_APPENDTOVAR],
+[
+ for element in [$2]; do
+ haveit=
+ for x in $[$1]; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X$element"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ [$1]="${[$1]}${[$1]:+ }$element"
+ fi
+ done
+])
+
+# lib-ld.m4 serial 3 (gettext-0.13)
+dnl Copyright (C) 1996-2003 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Subroutines of libtool.m4,
+dnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision
+dnl with libtool.m4.
+
+dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no.
+AC_DEFUN([AC_LIB_PROG_LD_GNU],
+[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], acl_cv_prog_gnu_ld,
+[# I'd rather use --version here, but apparently some GNU ld's only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+ acl_cv_prog_gnu_ld=yes ;;
+*)
+ acl_cv_prog_gnu_ld=no ;;
+esac])
+with_gnu_ld=$acl_cv_prog_gnu_ld
+])
+
+dnl From libtool-1.4. Sets the variable LD.
+AC_DEFUN([AC_LIB_PROG_LD],
+[AC_ARG_WITH(gnu-ld,
+[ --with-gnu-ld assume the C compiler uses GNU ld [default=no]],
+test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no)
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+ac_prog=ld
+if test "$GCC" = yes; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ AC_MSG_CHECKING([for ld used by GCC])
+ case $host in
+ *-*-mingw*)
+ # gcc leaves a trailing carriage return which upsets mingw
+ ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+ *)
+ ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+ esac
+ case $ac_prog in
+ # Accept absolute paths.
+ [[\\/]* | [A-Za-z]:[\\/]*)]
+ [re_direlt='/[^/][^/]*/\.\./']
+ # Canonicalize the path of ld
+ ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'`
+ while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD="$ac_prog"
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test "$with_gnu_ld" = yes; then
+ AC_MSG_CHECKING([for GNU ld])
+else
+ AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL(acl_cv_path_LD,
+[if test -z "$LD"; then
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+ acl_cv_path_LD="$ac_dir/$ac_prog"
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some GNU ld's only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in
+ *GNU* | *'with BFD'*)
+ test "$with_gnu_ld" != no && break ;;
+ *)
+ test "$with_gnu_ld" != yes && break ;;
+ esac
+ fi
+ done
+ IFS="$ac_save_ifs"
+else
+ acl_cv_path_LD="$LD" # Let the user override the test with a path.
+fi])
+LD="$acl_cv_path_LD"
+if test -n "$LD"; then
+ AC_MSG_RESULT($LD)
+else
+ AC_MSG_RESULT(no)
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+AC_LIB_PROG_LD_GNU
+])
+
+dnl Macro: anope_CHECK_TYPE_SIZES
+dnl
+dnl Check the size of several types and define a valid int16_t and int32_t.
+dnl
+AC_DEFUN(anope_CHECK_TYPE_SIZES,
+[dnl Check type sizes
+AC_CHECK_SIZEOF(short)
+AC_CHECK_SIZEOF(int)
+AC_CHECK_SIZEOF(long)
+if test "$ac_cv_sizeof_int" = 2 ; then
+ AC_CHECK_TYPE(int16_t, int)
+ AC_CHECK_TYPE(u_int16_t, unsigned int)
+elif test "$ac_cv_sizeof_short" = 2 ; then
+ AC_CHECK_TYPE(int16_t, short)
+ AC_CHECK_TYPE(u_int16_t, unsigned short)
+else
+ AC_MSG_ERROR([Cannot find a type with size of 16 bits])
+fi
+if test "$ac_cv_sizeof_int" = 4 ; then
+ AC_CHECK_TYPE(int32_t, int)
+ AC_CHECK_TYPE(u_int32_t, unsigned int)
+elif test "$ac_cv_sizeof_short" = 4 ; then
+ AC_CHECK_TYPE(int32_t, short)
+ AC_CHECK_TYPE(u_int32_t, unsigned short)
+elif test "$ac_cv_sizeof_long" = 4 ; then
+ AC_CHECK_TYPE(int32_t, long)
+ AC_CHECK_TYPE(u_int32_t, unsigned long)
+else
+ AC_MSG_ERROR([Cannot find a type with size of 32 bits])
+fi
+])
+
diff --git a/anope.bat b/anope.bat
new file mode 100644
index 000000000..20cebfa9c
--- /dev/null
+++ b/anope.bat
@@ -0,0 +1,3 @@
+@ECHO OFF
+anope.exe %1 %2 %3 %4 %5
+pause \ No newline at end of file
diff --git a/anope.m4 b/anope.m4
new file mode 100644
index 000000000..56e750dd3
--- /dev/null
+++ b/anope.m4
@@ -0,0 +1,31 @@
+dnl Macro: anope_CHECK_TYPE_SIZES
+dnl
+dnl Check the size of several types and define a valid int16_t and int32_t.
+dnl
+AC_DEFUN(anope_CHECK_TYPE_SIZES,
+[dnl Check type sizes
+AC_CHECK_SIZEOF(short)
+AC_CHECK_SIZEOF(int)
+AC_CHECK_SIZEOF(long)
+if test "$ac_cv_sizeof_int" = 2 ; then
+ AC_CHECK_TYPE(int16_t, int)
+ AC_CHECK_TYPE(u_int16_t, unsigned int)
+elif test "$ac_cv_sizeof_short" = 2 ; then
+ AC_CHECK_TYPE(int16_t, short)
+ AC_CHECK_TYPE(u_int16_t, unsigned short)
+else
+ AC_MSG_ERROR([Cannot find a type with size of 16 bits])
+fi
+if test "$ac_cv_sizeof_int" = 4 ; then
+ AC_CHECK_TYPE(int32_t, int)
+ AC_CHECK_TYPE(u_int32_t, unsigned int)
+elif test "$ac_cv_sizeof_short" = 4 ; then
+ AC_CHECK_TYPE(int32_t, short)
+ AC_CHECK_TYPE(u_int32_t, unsigned short)
+elif test "$ac_cv_sizeof_long" = 4 ; then
+ AC_CHECK_TYPE(int32_t, long)
+ AC_CHECK_TYPE(u_int32_t, unsigned long)
+else
+ AC_MSG_ERROR([Cannot find a type with size of 32 bits])
+fi
+])
diff --git a/config.guess b/config.guess
new file mode 100644
index 000000000..f32079abd
--- /dev/null
+++ b/config.guess
@@ -0,0 +1,1526 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
+# Free Software Foundation, Inc.
+
+timestamp='2008-01-23'
+
+# This file 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., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Originally written by Per Bothner <per@bothner.com>.
+# Please send patches to <config-patches@gnu.org>. Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub. If it succeeds, it prints the system name on stdout, and
+# exits with 0. Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit build system type.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+ -h, --help print this help, then exit
+ -t, --time-stamp print date of last modification, then exit
+ -v, --version print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+ echo "$timestamp" ; exit ;;
+ --version | -v )
+ echo "$version" ; exit ;;
+ --help | --h* | -h )
+ echo "$usage"; exit ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+ break ;;
+ -* )
+ echo "$me: invalid option $1$help" >&2
+ exit 1 ;;
+ * )
+ break ;;
+ esac
+done
+
+if test $# != 0; then
+ echo "$me: too many arguments$help" >&2
+ exit 1
+fi
+
+trap 'exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,) echo "int x;" > $dummy.c ;
+ for c in cc gcc c89 c99 ; do
+ if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
+ CC_FOR_BUILD="$c"; break ;
+ fi ;
+ done ;
+ if test x"$CC_FOR_BUILD" = x ; then
+ CC_FOR_BUILD=no_compiler_found ;
+ fi
+ ;;
+ ,,*) CC_FOR_BUILD=$CC ;;
+ ,*,*) CC_FOR_BUILD=$HOST_CC ;;
+esac ; set_cc_for_build= ;'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+ PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+ *:NetBSD:*:*)
+ # NetBSD (nbsd) targets should (where applicable) match one or
+ # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+ # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently
+ # switched to ELF, *-*-netbsd* would select the old
+ # object file format. This provides both forward
+ # compatibility and a consistent mechanism for selecting the
+ # object file format.
+ #
+ # Note: NetBSD doesn't particularly care about the vendor
+ # portion of the name. We always set it to "unknown".
+ sysctl="sysctl -n hw.machine_arch"
+ UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
+ /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+ case "${UNAME_MACHINE_ARCH}" in
+ armeb) machine=armeb-unknown ;;
+ arm*) machine=arm-unknown ;;
+ sh3el) machine=shl-unknown ;;
+ sh3eb) machine=sh-unknown ;;
+ sh5el) machine=sh5le-unknown ;;
+ *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+ esac
+ # The Operating System including object format, if it has switched
+ # to ELF recently, or will in the future.
+ case "${UNAME_MACHINE_ARCH}" in
+ arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+ eval $set_cc_for_build
+ if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep __ELF__ >/dev/null
+ then
+ # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+ # Return netbsd for either. FIX?
+ os=netbsd
+ else
+ os=netbsdelf
+ fi
+ ;;
+ *)
+ os=netbsd
+ ;;
+ esac
+ # The OS release
+ # Debian GNU/NetBSD machines have a different userland, and
+ # thus, need a distinct triplet. However, they do not need
+ # kernel version information, so it can be replaced with a
+ # suitable tag, in the style of linux-gnu.
+ case "${UNAME_VERSION}" in
+ Debian*)
+ release='-gnu'
+ ;;
+ *)
+ release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+ ;;
+ esac
+ # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+ # contains redundant information, the shorter form:
+ # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+ echo "${machine}-${os}${release}"
+ exit ;;
+ *:OpenBSD:*:*)
+ UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+ echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
+ exit ;;
+ *:ekkoBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+ exit ;;
+ *:SolidBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
+ exit ;;
+ macppc:MirBSD:*:*)
+ echo powerpc-unknown-mirbsd${UNAME_RELEASE}
+ exit ;;
+ *:MirBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+ exit ;;
+ alpha:OSF1:*:*)
+ case $UNAME_RELEASE in
+ *4.0)
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+ ;;
+ *5.*)
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+ ;;
+ esac
+ # According to Compaq, /usr/sbin/psrinfo has been available on
+ # OSF/1 and Tru64 systems produced since 1995. I hope that
+ # covers most systems running today. This code pipes the CPU
+ # types through head -n 1, so we only detect the type of CPU 0.
+ ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+ case "$ALPHA_CPU_TYPE" in
+ "EV4 (21064)")
+ UNAME_MACHINE="alpha" ;;
+ "EV4.5 (21064)")
+ UNAME_MACHINE="alpha" ;;
+ "LCA4 (21066/21068)")
+ UNAME_MACHINE="alpha" ;;
+ "EV5 (21164)")
+ UNAME_MACHINE="alphaev5" ;;
+ "EV5.6 (21164A)")
+ UNAME_MACHINE="alphaev56" ;;
+ "EV5.6 (21164PC)")
+ UNAME_MACHINE="alphapca56" ;;
+ "EV5.7 (21164PC)")
+ UNAME_MACHINE="alphapca57" ;;
+ "EV6 (21264)")
+ UNAME_MACHINE="alphaev6" ;;
+ "EV6.7 (21264A)")
+ UNAME_MACHINE="alphaev67" ;;
+ "EV6.8CB (21264C)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.8AL (21264B)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.8CX (21264D)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.9A (21264/EV69A)")
+ UNAME_MACHINE="alphaev69" ;;
+ "EV7 (21364)")
+ UNAME_MACHINE="alphaev7" ;;
+ "EV7.9 (21364A)")
+ UNAME_MACHINE="alphaev79" ;;
+ esac
+ # A Pn.n version is a patched version.
+ # A Vn.n version is a released version.
+ # A Tn.n version is a released field test version.
+ # A Xn.n version is an unreleased experimental baselevel.
+ # 1.2 uses "1.2" for uname -r.
+ echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+ exit ;;
+ Alpha\ *:Windows_NT*:*)
+ # How do we know it's Interix rather than the generic POSIX subsystem?
+ # Should we change UNAME_MACHINE based on the output of uname instead
+ # of the specific Alpha model?
+ echo alpha-pc-interix
+ exit ;;
+ 21064:Windows_NT:50:3)
+ echo alpha-dec-winnt3.5
+ exit ;;
+ Amiga*:UNIX_System_V:4.0:*)
+ echo m68k-unknown-sysv4
+ exit ;;
+ *:[Aa]miga[Oo][Ss]:*:*)
+ echo ${UNAME_MACHINE}-unknown-amigaos
+ exit ;;
+ *:[Mm]orph[Oo][Ss]:*:*)
+ echo ${UNAME_MACHINE}-unknown-morphos
+ exit ;;
+ *:OS/390:*:*)
+ echo i370-ibm-openedition
+ exit ;;
+ *:z/VM:*:*)
+ echo s390-ibm-zvmoe
+ exit ;;
+ *:OS400:*:*)
+ echo powerpc-ibm-os400
+ exit ;;
+ arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+ echo arm-acorn-riscix${UNAME_RELEASE}
+ exit ;;
+ arm:riscos:*:*|arm:RISCOS:*:*)
+ echo arm-unknown-riscos
+ exit ;;
+ SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+ echo hppa1.1-hitachi-hiuxmpp
+ exit ;;
+ Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+ # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+ if test "`(/bin/universe) 2>/dev/null`" = att ; then
+ echo pyramid-pyramid-sysv3
+ else
+ echo pyramid-pyramid-bsd
+ fi
+ exit ;;
+ NILE*:*:*:dcosx)
+ echo pyramid-pyramid-svr4
+ exit ;;
+ DRS?6000:unix:4.0:6*)
+ echo sparc-icl-nx6
+ exit ;;
+ DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+ case `/usr/bin/uname -p` in
+ sparc) echo sparc-icl-nx7; exit ;;
+ esac ;;
+ sun4H:SunOS:5.*:*)
+ echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+ echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
+ echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ sun4*:SunOS:6*:*)
+ # According to config.sub, this is the proper way to canonicalize
+ # SunOS6. Hard to guess exactly what SunOS6 will be like, but
+ # it's likely to be more like Solaris than SunOS4.
+ echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ sun4*:SunOS:*:*)
+ case "`/usr/bin/arch -k`" in
+ Series*|S4*)
+ UNAME_RELEASE=`uname -v`
+ ;;
+ esac
+ # Japanese Language versions have a version number like `4.1.3-JL'.
+ echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+ exit ;;
+ sun3*:SunOS:*:*)
+ echo m68k-sun-sunos${UNAME_RELEASE}
+ exit ;;
+ sun*:*:4.2BSD:*)
+ UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+ test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+ case "`/bin/arch`" in
+ sun3)
+ echo m68k-sun-sunos${UNAME_RELEASE}
+ ;;
+ sun4)
+ echo sparc-sun-sunos${UNAME_RELEASE}
+ ;;
+ esac
+ exit ;;
+ aushp:SunOS:*:*)
+ echo sparc-auspex-sunos${UNAME_RELEASE}
+ exit ;;
+ # The situation for MiNT is a little confusing. The machine name
+ # can be virtually everything (everything which is not
+ # "atarist" or "atariste" at least should have a processor
+ # > m68000). The system name ranges from "MiNT" over "FreeMiNT"
+ # to the lowercase version "mint" (or "freemint"). Finally
+ # the system name "TOS" denotes a system which is actually not
+ # MiNT. But MiNT is downward compatible to TOS, so this should
+ # be no problem.
+ atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit ;;
+ atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit ;;
+ *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit ;;
+ milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+ echo m68k-milan-mint${UNAME_RELEASE}
+ exit ;;
+ hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+ echo m68k-hades-mint${UNAME_RELEASE}
+ exit ;;
+ *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+ echo m68k-unknown-mint${UNAME_RELEASE}
+ exit ;;
+ m68k:machten:*:*)
+ echo m68k-apple-machten${UNAME_RELEASE}
+ exit ;;
+ powerpc:machten:*:*)
+ echo powerpc-apple-machten${UNAME_RELEASE}
+ exit ;;
+ RISC*:Mach:*:*)
+ echo mips-dec-mach_bsd4.3
+ exit ;;
+ RISC*:ULTRIX:*:*)
+ echo mips-dec-ultrix${UNAME_RELEASE}
+ exit ;;
+ VAX*:ULTRIX*:*:*)
+ echo vax-dec-ultrix${UNAME_RELEASE}
+ exit ;;
+ 2020:CLIX:*:* | 2430:CLIX:*:*)
+ echo clipper-intergraph-clix${UNAME_RELEASE}
+ exit ;;
+ mips:*:*:UMIPS | mips:*:*:RISCos)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h> /* for printf() prototype */
+ int main (int argc, char *argv[]) {
+#else
+ int main (argc, argv) int argc; char *argv[]; {
+#endif
+ #if defined (host_mips) && defined (MIPSEB)
+ #if defined (SYSTYPE_SYSV)
+ printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_SVR4)
+ printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+ printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+ #endif
+ #endif
+ exit (-1);
+ }
+EOF
+ $CC_FOR_BUILD -o $dummy $dummy.c &&
+ dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+ SYSTEM_NAME=`$dummy $dummyarg` &&
+ { echo "$SYSTEM_NAME"; exit; }
+ echo mips-mips-riscos${UNAME_RELEASE}
+ exit ;;
+ Motorola:PowerMAX_OS:*:*)
+ echo powerpc-motorola-powermax
+ exit ;;
+ Motorola:*:4.3:PL8-*)
+ echo powerpc-harris-powermax
+ exit ;;
+ Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+ echo powerpc-harris-powermax
+ exit ;;
+ Night_Hawk:Power_UNIX:*:*)
+ echo powerpc-harris-powerunix
+ exit ;;
+ m88k:CX/UX:7*:*)
+ echo m88k-harris-cxux7
+ exit ;;
+ m88k:*:4*:R4*)
+ echo m88k-motorola-sysv4
+ exit ;;
+ m88k:*:3*:R3*)
+ echo m88k-motorola-sysv3
+ exit ;;
+ AViiON:dgux:*:*)
+ # DG/UX returns AViiON for all architectures
+ UNAME_PROCESSOR=`/usr/bin/uname -p`
+ if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+ then
+ if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+ [ ${TARGET_BINARY_INTERFACE}x = x ]
+ then
+ echo m88k-dg-dgux${UNAME_RELEASE}
+ else
+ echo m88k-dg-dguxbcs${UNAME_RELEASE}
+ fi
+ else
+ echo i586-dg-dgux${UNAME_RELEASE}
+ fi
+ exit ;;
+ M88*:DolphinOS:*:*) # DolphinOS (SVR3)
+ echo m88k-dolphin-sysv3
+ exit ;;
+ M88*:*:R3*:*)
+ # Delta 88k system running SVR3
+ echo m88k-motorola-sysv3
+ exit ;;
+ XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+ echo m88k-tektronix-sysv3
+ exit ;;
+ Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+ echo m68k-tektronix-bsd
+ exit ;;
+ *:IRIX*:*:*)
+ echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+ exit ;;
+ ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+ echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
+ exit ;; # Note that: echo "'`uname -s`'" gives 'AIX '
+ i*86:AIX:*:*)
+ echo i386-ibm-aix
+ exit ;;
+ ia64:AIX:*:*)
+ if [ -x /usr/bin/oslevel ] ; then
+ IBM_REV=`/usr/bin/oslevel`
+ else
+ IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+ fi
+ echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+ exit ;;
+ *:AIX:2:3)
+ if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <sys/systemcfg.h>
+
+ main()
+ {
+ if (!__power_pc())
+ exit(1);
+ puts("powerpc-ibm-aix3.2.5");
+ exit(0);
+ }
+EOF
+ if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
+ then
+ echo "$SYSTEM_NAME"
+ else
+ echo rs6000-ibm-aix3.2.5
+ fi
+ elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+ echo rs6000-ibm-aix3.2.4
+ else
+ echo rs6000-ibm-aix3.2
+ fi
+ exit ;;
+ *:AIX:*:[456])
+ IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+ if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+ IBM_ARCH=rs6000
+ else
+ IBM_ARCH=powerpc
+ fi
+ if [ -x /usr/bin/oslevel ] ; then
+ IBM_REV=`/usr/bin/oslevel`
+ else
+ IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+ fi
+ echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+ exit ;;
+ *:AIX:*:*)
+ echo rs6000-ibm-aix
+ exit ;;
+ ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+ echo romp-ibm-bsd4.4
+ exit ;;
+ ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and
+ echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to
+ exit ;; # report: romp-ibm BSD 4.3
+ *:BOSX:*:*)
+ echo rs6000-bull-bosx
+ exit ;;
+ DPX/2?00:B.O.S.:*:*)
+ echo m68k-bull-sysv3
+ exit ;;
+ 9000/[34]??:4.3bsd:1.*:*)
+ echo m68k-hp-bsd
+ exit ;;
+ hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+ echo m68k-hp-bsd4.4
+ exit ;;
+ 9000/[34678]??:HP-UX:*:*)
+ HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+ case "${UNAME_MACHINE}" in
+ 9000/31? ) HP_ARCH=m68000 ;;
+ 9000/[34]?? ) HP_ARCH=m68k ;;
+ 9000/[678][0-9][0-9])
+ if [ -x /usr/bin/getconf ]; then
+ sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+ sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+ case "${sc_cpu_version}" in
+ 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+ 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+ 532) # CPU_PA_RISC2_0
+ case "${sc_kernel_bits}" in
+ 32) HP_ARCH="hppa2.0n" ;;
+ 64) HP_ARCH="hppa2.0w" ;;
+ '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20
+ esac ;;
+ esac
+ fi
+ if [ "${HP_ARCH}" = "" ]; then
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+
+ #define _HPUX_SOURCE
+ #include <stdlib.h>
+ #include <unistd.h>
+
+ int main ()
+ {
+ #if defined(_SC_KERNEL_BITS)
+ long bits = sysconf(_SC_KERNEL_BITS);
+ #endif
+ long cpu = sysconf (_SC_CPU_VERSION);
+
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+ case CPU_PA_RISC2_0:
+ #if defined(_SC_KERNEL_BITS)
+ switch (bits)
+ {
+ case 64: puts ("hppa2.0w"); break;
+ case 32: puts ("hppa2.0n"); break;
+ default: puts ("hppa2.0"); break;
+ } break;
+ #else /* !defined(_SC_KERNEL_BITS) */
+ puts ("hppa2.0"); break;
+ #endif
+ default: puts ("hppa1.0"); break;
+ }
+ exit (0);
+ }
+EOF
+ (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+ test -z "$HP_ARCH" && HP_ARCH=hppa
+ fi ;;
+ esac
+ if [ ${HP_ARCH} = "hppa2.0w" ]
+ then
+ eval $set_cc_for_build
+
+ # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+ # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler
+ # generating 64-bit code. GNU and HP use different nomenclature:
+ #
+ # $ CC_FOR_BUILD=cc ./config.guess
+ # => hppa2.0w-hp-hpux11.23
+ # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+ # => hppa64-hp-hpux11.23
+
+ if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+ grep __LP64__ >/dev/null
+ then
+ HP_ARCH="hppa2.0w"
+ else
+ HP_ARCH="hppa64"
+ fi
+ fi
+ echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+ exit ;;
+ ia64:HP-UX:*:*)
+ HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+ echo ia64-hp-hpux${HPUX_REV}
+ exit ;;
+ 3050*:HI-UX:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <unistd.h>
+ int
+ main ()
+ {
+ long cpu = sysconf (_SC_CPU_VERSION);
+ /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+ true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct
+ results, however. */
+ if (CPU_IS_PA_RISC (cpu))
+ {
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+ default: puts ("hppa-hitachi-hiuxwe2"); break;
+ }
+ }
+ else if (CPU_IS_HP_MC68K (cpu))
+ puts ("m68k-hitachi-hiuxwe2");
+ else puts ("unknown-hitachi-hiuxwe2");
+ exit (0);
+ }
+EOF
+ $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
+ { echo "$SYSTEM_NAME"; exit; }
+ echo unknown-hitachi-hiuxwe2
+ exit ;;
+ 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+ echo hppa1.1-hp-bsd
+ exit ;;
+ 9000/8??:4.3bsd:*:*)
+ echo hppa1.0-hp-bsd
+ exit ;;
+ *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+ echo hppa1.0-hp-mpeix
+ exit ;;
+ hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+ echo hppa1.1-hp-osf
+ exit ;;
+ hp8??:OSF1:*:*)
+ echo hppa1.0-hp-osf
+ exit ;;
+ i*86:OSF1:*:*)
+ if [ -x /usr/sbin/sysversion ] ; then
+ echo ${UNAME_MACHINE}-unknown-osf1mk
+ else
+ echo ${UNAME_MACHINE}-unknown-osf1
+ fi
+ exit ;;
+ parisc*:Lites*:*:*)
+ echo hppa1.1-hp-lites
+ exit ;;
+ C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+ echo c1-convex-bsd
+ exit ;;
+ C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit ;;
+ C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+ echo c34-convex-bsd
+ exit ;;
+ C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+ echo c38-convex-bsd
+ exit ;;
+ C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+ echo c4-convex-bsd
+ exit ;;
+ CRAY*Y-MP:*:*:*)
+ echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*[A-Z]90:*:*:*)
+ echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+ -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*TS:*:*:*)
+ echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*T3E:*:*:*)
+ echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*SV1:*:*:*)
+ echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ *:UNICOS/mp:*:*)
+ echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+ FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+ FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+ echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ exit ;;
+ 5000:UNIX_System_V:4.*:*)
+ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+ FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+ echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ exit ;;
+ i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+ echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+ exit ;;
+ sparc*:BSD/OS:*:*)
+ echo sparc-unknown-bsdi${UNAME_RELEASE}
+ exit ;;
+ *:BSD/OS:*:*)
+ echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+ exit ;;
+ *:FreeBSD:*:*)
+ case ${UNAME_MACHINE} in
+ pc98)
+ echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+ amd64)
+ echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+ *)
+ echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+ esac
+ exit ;;
+ i*:CYGWIN*:*)
+ echo ${UNAME_MACHINE}-pc-cygwin
+ exit ;;
+ *:MINGW*:*)
+ echo ${UNAME_MACHINE}-pc-mingw32
+ exit ;;
+ i*:windows32*:*)
+ # uname -m includes "-pc" on this system.
+ echo ${UNAME_MACHINE}-mingw32
+ exit ;;
+ i*:PW*:*)
+ echo ${UNAME_MACHINE}-pc-pw32
+ exit ;;
+ *:Interix*:[3456]*)
+ case ${UNAME_MACHINE} in
+ x86)
+ echo i586-pc-interix${UNAME_RELEASE}
+ exit ;;
+ EM64T | authenticamd)
+ echo x86_64-unknown-interix${UNAME_RELEASE}
+ exit ;;
+ IA64)
+ echo ia64-unknown-interix${UNAME_RELEASE}
+ exit ;;
+ esac ;;
+ [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+ echo i${UNAME_MACHINE}-pc-mks
+ exit ;;
+ i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+ # How do we know it's Interix rather than the generic POSIX subsystem?
+ # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+ # UNAME_MACHINE based on the output of uname instead of i386?
+ echo i586-pc-interix
+ exit ;;
+ i*:UWIN*:*)
+ echo ${UNAME_MACHINE}-pc-uwin
+ exit ;;
+ amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+ echo x86_64-unknown-cygwin
+ exit ;;
+ p*:CYGWIN*:*)
+ echo powerpcle-unknown-cygwin
+ exit ;;
+ prep*:SunOS:5.*:*)
+ echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ *:GNU:*:*)
+ # the GNU system
+ echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+ exit ;;
+ *:GNU/*:*:*)
+ # other systems with GNU libc and userland
+ echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
+ exit ;;
+ i*86:Minix:*:*)
+ echo ${UNAME_MACHINE}-pc-minix
+ exit ;;
+ arm*:Linux:*:*)
+ eval $set_cc_for_build
+ if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep -q __ARM_EABI__
+ then
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ else
+ echo ${UNAME_MACHINE}-unknown-linux-gnueabi
+ fi
+ exit ;;
+ avr32*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ cris:Linux:*:*)
+ echo cris-axis-linux-gnu
+ exit ;;
+ crisv32:Linux:*:*)
+ echo crisv32-axis-linux-gnu
+ exit ;;
+ frv:Linux:*:*)
+ echo frv-unknown-linux-gnu
+ exit ;;
+ ia64:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ m32r*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ m68*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ mips:Linux:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #undef CPU
+ #undef mips
+ #undef mipsel
+ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+ CPU=mipsel
+ #else
+ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+ CPU=mips
+ #else
+ CPU=
+ #endif
+ #endif
+EOF
+ eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+ /^CPU/{
+ s: ::g
+ p
+ }'`"
+ test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+ ;;
+ mips64:Linux:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #undef CPU
+ #undef mips64
+ #undef mips64el
+ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+ CPU=mips64el
+ #else
+ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+ CPU=mips64
+ #else
+ CPU=
+ #endif
+ #endif
+EOF
+ eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+ /^CPU/{
+ s: ::g
+ p
+ }'`"
+ test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+ ;;
+ or32:Linux:*:*)
+ echo or32-unknown-linux-gnu
+ exit ;;
+ ppc:Linux:*:*)
+ echo powerpc-unknown-linux-gnu
+ exit ;;
+ ppc64:Linux:*:*)
+ echo powerpc64-unknown-linux-gnu
+ exit ;;
+ alpha:Linux:*:*)
+ case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+ EV5) UNAME_MACHINE=alphaev5 ;;
+ EV56) UNAME_MACHINE=alphaev56 ;;
+ PCA56) UNAME_MACHINE=alphapca56 ;;
+ PCA57) UNAME_MACHINE=alphapca56 ;;
+ EV6) UNAME_MACHINE=alphaev6 ;;
+ EV67) UNAME_MACHINE=alphaev67 ;;
+ EV68*) UNAME_MACHINE=alphaev68 ;;
+ esac
+ objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
+ if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+ echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+ exit ;;
+ parisc:Linux:*:* | hppa:Linux:*:*)
+ # Look for CPU level
+ case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+ PA7*) echo hppa1.1-unknown-linux-gnu ;;
+ PA8*) echo hppa2.0-unknown-linux-gnu ;;
+ *) echo hppa-unknown-linux-gnu ;;
+ esac
+ exit ;;
+ parisc64:Linux:*:* | hppa64:Linux:*:*)
+ echo hppa64-unknown-linux-gnu
+ exit ;;
+ s390:Linux:*:* | s390x:Linux:*:*)
+ echo ${UNAME_MACHINE}-ibm-linux
+ exit ;;
+ sh64*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ sh*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ sparc:Linux:*:* | sparc64:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ vax:Linux:*:*)
+ echo ${UNAME_MACHINE}-dec-linux-gnu
+ exit ;;
+ x86_64:Linux:*:*)
+ echo x86_64-unknown-linux-gnu
+ exit ;;
+ xtensa*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ i*86:Linux:*:*)
+ # The BFD linker knows what the default object file format is, so
+ # first see if it will tell us. cd to the root directory to prevent
+ # problems with other programs or directories called `ld' in the path.
+ # Set LC_ALL=C to ensure ld outputs messages in English.
+ ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \
+ | sed -ne '/supported targets:/!d
+ s/[ ][ ]*/ /g
+ s/.*supported targets: *//
+ s/ .*//
+ p'`
+ case "$ld_supported_targets" in
+ elf32-i386)
+ TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
+ ;;
+ a.out-i386-linux)
+ echo "${UNAME_MACHINE}-pc-linux-gnuaout"
+ exit ;;
+ coff-i386)
+ echo "${UNAME_MACHINE}-pc-linux-gnucoff"
+ exit ;;
+ "")
+ # Either a pre-BFD a.out linker (linux-gnuoldld) or
+ # one that does not give us useful --help.
+ echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
+ exit ;;
+ esac
+ # Determine whether the default compiler is a.out or elf
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <features.h>
+ #ifdef __ELF__
+ # ifdef __GLIBC__
+ # if __GLIBC__ >= 2
+ LIBC=gnu
+ # else
+ LIBC=gnulibc1
+ # endif
+ # else
+ LIBC=gnulibc1
+ # endif
+ #else
+ #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC)
+ LIBC=gnu
+ #else
+ LIBC=gnuaout
+ #endif
+ #endif
+ #ifdef __dietlibc__
+ LIBC=dietlibc
+ #endif
+EOF
+ eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+ /^LIBC/{
+ s: ::g
+ p
+ }'`"
+ test x"${LIBC}" != x && {
+ echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
+ exit
+ }
+ test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; }
+ ;;
+ i*86:DYNIX/ptx:4*:*)
+ # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+ # earlier versions are messed up and put the nodename in both
+ # sysname and nodename.
+ echo i386-sequent-sysv4
+ exit ;;
+ i*86:UNIX_SV:4.2MP:2.*)
+ # Unixware is an offshoot of SVR4, but it has its own version
+ # number series starting with 2...
+ # I am not positive that other SVR4 systems won't match this,
+ # I just have to hope. -- rms.
+ # Use sysv4.2uw... so that sysv4* matches it.
+ echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+ exit ;;
+ i*86:OS/2:*:*)
+ # If we were able to find `uname', then EMX Unix compatibility
+ # is probably installed.
+ echo ${UNAME_MACHINE}-pc-os2-emx
+ exit ;;
+ i*86:XTS-300:*:STOP)
+ echo ${UNAME_MACHINE}-unknown-stop
+ exit ;;
+ i*86:atheos:*:*)
+ echo ${UNAME_MACHINE}-unknown-atheos
+ exit ;;
+ i*86:syllable:*:*)
+ echo ${UNAME_MACHINE}-pc-syllable
+ exit ;;
+ i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
+ echo i386-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ i*86:*DOS:*:*)
+ echo ${UNAME_MACHINE}-pc-msdosdjgpp
+ exit ;;
+ i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+ UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+ if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+ echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+ else
+ echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+ fi
+ exit ;;
+ i*86:*:5:[678]*)
+ # UnixWare 7.x, OpenUNIX and OpenServer 6.
+ case `/bin/uname -X | grep "^Machine"` in
+ *486*) UNAME_MACHINE=i486 ;;
+ *Pentium) UNAME_MACHINE=i586 ;;
+ *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+ esac
+ echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+ exit ;;
+ i*86:*:3.2:*)
+ if test -f /usr/options/cb.name; then
+ UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+ echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+ elif /bin/uname -X 2>/dev/null >/dev/null ; then
+ UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+ (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+ (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+ && UNAME_MACHINE=i586
+ (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+ && UNAME_MACHINE=i686
+ (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+ && UNAME_MACHINE=i686
+ echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+ else
+ echo ${UNAME_MACHINE}-pc-sysv32
+ fi
+ exit ;;
+ pc:*:*:*)
+ # Left here for compatibility:
+ # uname -m prints for DJGPP always 'pc', but it prints nothing about
+ # the processor, so we play safe by assuming i386.
+ echo i386-pc-msdosdjgpp
+ exit ;;
+ Intel:Mach:3*:*)
+ echo i386-pc-mach3
+ exit ;;
+ paragon:*:*:*)
+ echo i860-intel-osf1
+ exit ;;
+ i860:*:4.*:*) # i860-SVR4
+ if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+ echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+ else # Add other i860-SVR4 vendors below as they are discovered.
+ echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4
+ fi
+ exit ;;
+ mini*:CTIX:SYS*5:*)
+ # "miniframe"
+ echo m68010-convergent-sysv
+ exit ;;
+ mc68k:UNIX:SYSTEM5:3.51m)
+ echo m68k-convergent-sysv
+ exit ;;
+ M680?0:D-NIX:5.3:*)
+ echo m68k-diab-dnix
+ exit ;;
+ M68*:*:R3V[5678]*:*)
+ test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+ 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+ OS_REL=''
+ test -r /etc/.relid \
+ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+ 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4; exit; } ;;
+ m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+ echo m68k-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ mc68030:UNIX_System_V:4.*:*)
+ echo m68k-atari-sysv4
+ exit ;;
+ TSUNAMI:LynxOS:2.*:*)
+ echo sparc-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ rs6000:LynxOS:2.*:*)
+ echo rs6000-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
+ echo powerpc-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ SM[BE]S:UNIX_SV:*:*)
+ echo mips-dde-sysv${UNAME_RELEASE}
+ exit ;;
+ RM*:ReliantUNIX-*:*:*)
+ echo mips-sni-sysv4
+ exit ;;
+ RM*:SINIX-*:*:*)
+ echo mips-sni-sysv4
+ exit ;;
+ *:SINIX-*:*:*)
+ if uname -p 2>/dev/null >/dev/null ; then
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ echo ${UNAME_MACHINE}-sni-sysv4
+ else
+ echo ns32k-sni-sysv
+ fi
+ exit ;;
+ PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+ # says <Richard.M.Bartel@ccMail.Census.GOV>
+ echo i586-unisys-sysv4
+ exit ;;
+ *:UNIX_System_V:4*:FTX*)
+ # From Gerald Hewes <hewes@openmarket.com>.
+ # How about differentiating between stratus architectures? -djm
+ echo hppa1.1-stratus-sysv4
+ exit ;;
+ *:*:*:FTX*)
+ # From seanf@swdc.stratus.com.
+ echo i860-stratus-sysv4
+ exit ;;
+ i*86:VOS:*:*)
+ # From Paul.Green@stratus.com.
+ echo ${UNAME_MACHINE}-stratus-vos
+ exit ;;
+ *:VOS:*:*)
+ # From Paul.Green@stratus.com.
+ echo hppa1.1-stratus-vos
+ exit ;;
+ mc68*:A/UX:*:*)
+ echo m68k-apple-aux${UNAME_RELEASE}
+ exit ;;
+ news*:NEWS-OS:6*:*)
+ echo mips-sony-newsos6
+ exit ;;
+ R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+ if [ -d /usr/nec ]; then
+ echo mips-nec-sysv${UNAME_RELEASE}
+ else
+ echo mips-unknown-sysv${UNAME_RELEASE}
+ fi
+ exit ;;
+ BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
+ echo powerpc-be-beos
+ exit ;;
+ BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only.
+ echo powerpc-apple-beos
+ exit ;;
+ BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
+ echo i586-pc-beos
+ exit ;;
+ SX-4:SUPER-UX:*:*)
+ echo sx4-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-5:SUPER-UX:*:*)
+ echo sx5-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-6:SUPER-UX:*:*)
+ echo sx6-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-7:SUPER-UX:*:*)
+ echo sx7-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-8:SUPER-UX:*:*)
+ echo sx8-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-8R:SUPER-UX:*:*)
+ echo sx8r-nec-superux${UNAME_RELEASE}
+ exit ;;
+ Power*:Rhapsody:*:*)
+ echo powerpc-apple-rhapsody${UNAME_RELEASE}
+ exit ;;
+ *:Rhapsody:*:*)
+ echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+ exit ;;
+ *:Darwin:*:*)
+ UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+ case $UNAME_PROCESSOR in
+ unknown) UNAME_PROCESSOR=powerpc ;;
+ esac
+ echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+ exit ;;
+ *:procnto*:*:* | *:QNX:[0123456789]*:*)
+ UNAME_PROCESSOR=`uname -p`
+ if test "$UNAME_PROCESSOR" = "x86"; then
+ UNAME_PROCESSOR=i386
+ UNAME_MACHINE=pc
+ fi
+ echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+ exit ;;
+ *:QNX:*:4*)
+ echo i386-pc-qnx
+ exit ;;
+ NSE-?:NONSTOP_KERNEL:*:*)
+ echo nse-tandem-nsk${UNAME_RELEASE}
+ exit ;;
+ NSR-?:NONSTOP_KERNEL:*:*)
+ echo nsr-tandem-nsk${UNAME_RELEASE}
+ exit ;;
+ *:NonStop-UX:*:*)
+ echo mips-compaq-nonstopux
+ exit ;;
+ BS2000:POSIX*:*:*)
+ echo bs2000-siemens-sysv
+ exit ;;
+ DS/*:UNIX_System_V:*:*)
+ echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+ exit ;;
+ *:Plan9:*:*)
+ # "uname -m" is not consistent, so use $cputype instead. 386
+ # is converted to i386 for consistency with other x86
+ # operating systems.
+ if test "$cputype" = "386"; then
+ UNAME_MACHINE=i386
+ else
+ UNAME_MACHINE="$cputype"
+ fi
+ echo ${UNAME_MACHINE}-unknown-plan9
+ exit ;;
+ *:TOPS-10:*:*)
+ echo pdp10-unknown-tops10
+ exit ;;
+ *:TENEX:*:*)
+ echo pdp10-unknown-tenex
+ exit ;;
+ KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+ echo pdp10-dec-tops20
+ exit ;;
+ XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+ echo pdp10-xkl-tops20
+ exit ;;
+ *:TOPS-20:*:*)
+ echo pdp10-unknown-tops20
+ exit ;;
+ *:ITS:*:*)
+ echo pdp10-unknown-its
+ exit ;;
+ SEI:*:*:SEIUX)
+ echo mips-sei-seiux${UNAME_RELEASE}
+ exit ;;
+ *:DragonFly:*:*)
+ echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+ exit ;;
+ *:*VMS:*:*)
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ case "${UNAME_MACHINE}" in
+ A*) echo alpha-dec-vms ; exit ;;
+ I*) echo ia64-dec-vms ; exit ;;
+ V*) echo vax-dec-vms ; exit ;;
+ esac ;;
+ *:XENIX:*:SysV)
+ echo i386-pc-xenix
+ exit ;;
+ i*86:skyos:*:*)
+ echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
+ exit ;;
+ i*86:rdos:*:*)
+ echo ${UNAME_MACHINE}-pc-rdos
+ exit ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+eval $set_cc_for_build
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+ /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed,
+ I don't know.... */
+ printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+ printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+ "4"
+#else
+ ""
+#endif
+ ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+ printf ("arm-acorn-riscix\n"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+ printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+ int version;
+ version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+ if (version < 4)
+ printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+ else
+ printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+ exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+ printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+ printf ("ns32k-encore-mach\n"); exit (0);
+#else
+ printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+ printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+ printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+ printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+ struct utsname un;
+
+ uname(&un);
+
+ if (strncmp(un.version, "V2", 2) == 0) {
+ printf ("i386-sequent-ptx2\n"); exit (0);
+ }
+ if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+ printf ("i386-sequent-ptx1\n"); exit (0);
+ }
+ printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+# if !defined (ultrix)
+# include <sys/param.h>
+# if defined (BSD)
+# if BSD == 43
+ printf ("vax-dec-bsd4.3\n"); exit (0);
+# else
+# if BSD == 199006
+ printf ("vax-dec-bsd4.3reno\n"); exit (0);
+# else
+ printf ("vax-dec-bsd\n"); exit (0);
+# endif
+# endif
+# else
+ printf ("vax-dec-bsd\n"); exit (0);
+# endif
+# else
+ printf ("vax-dec-ultrix\n"); exit (0);
+# endif
+#endif
+
+#if defined (alliant) && defined (i860)
+ printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+ exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
+ { echo "$SYSTEM_NAME"; exit; }
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+ case `getsysinfo -f cpu_type` in
+ c1*)
+ echo c1-convex-bsd
+ exit ;;
+ c2*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit ;;
+ c34*)
+ echo c34-convex-bsd
+ exit ;;
+ c38*)
+ echo c38-convex-bsd
+ exit ;;
+ c4*)
+ echo c4-convex-bsd
+ exit ;;
+ esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+ http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+and
+ http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches@gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo = `(hostinfo) 2>/dev/null`
+/bin/universe = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/config.sub b/config.sub
new file mode 100644
index 000000000..de5d6a731
--- /dev/null
+++ b/config.sub
@@ -0,0 +1,1662 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
+# Free Software Foundation, Inc.
+
+timestamp='2008-02-05'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine. It does not imply ALL GNU software can.
+#
+# This file 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., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Please send patches to <config-patches@gnu.org>. Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support. The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+ $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+ -h, --help print this help, then exit
+ -t, --time-stamp print date of last modification, then exit
+ -v, --version print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+ echo "$timestamp" ; exit ;;
+ --version | -v )
+ echo "$version" ; exit ;;
+ --help | --h* | -h )
+ echo "$usage"; exit ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+ break ;;
+ -* )
+ echo "$me: invalid option $1$help"
+ exit 1 ;;
+
+ *local*)
+ # First pass through any local machine types.
+ echo $1
+ exit ;;
+
+ * )
+ break ;;
+ esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+ exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+ exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+ nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
+ uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
+ storm-chaos* | os2-emx* | rtmk-nova*)
+ os=-$maybe_os
+ basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+ ;;
+ *)
+ basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+ if [ $basic_machine != $1 ]
+ then os=`echo $1 | sed 's/.*-/-/'`
+ else os=; fi
+ ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work. We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+ -sun*os*)
+ # Prevent following clause from handling this invalid input.
+ ;;
+ -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+ -apple | -axis | -knuth | -cray)
+ os=
+ basic_machine=$1
+ ;;
+ -sim | -cisco | -oki | -wec | -winbond)
+ os=
+ basic_machine=$1
+ ;;
+ -scout)
+ ;;
+ -wrs)
+ os=-vxworks
+ basic_machine=$1
+ ;;
+ -chorusos*)
+ os=-chorusos
+ basic_machine=$1
+ ;;
+ -chorusrdb)
+ os=-chorusrdb
+ basic_machine=$1
+ ;;
+ -hiux*)
+ os=-hiuxwe2
+ ;;
+ -sco6)
+ os=-sco5v6
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco5)
+ os=-sco3.2v5
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco4)
+ os=-sco3.2v4
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2.[4-9]*)
+ os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2v[4-9]*)
+ # Don't forget version if it is 3.2v4 or newer.
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco5v6*)
+ # Don't forget version if it is 3.2v4 or newer.
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco*)
+ os=-sco3.2v2
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -udk*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -isc)
+ os=-isc2.2
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -clix*)
+ basic_machine=clipper-intergraph
+ ;;
+ -isc*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -lynx*)
+ os=-lynxos
+ ;;
+ -ptx*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+ ;;
+ -windowsnt*)
+ os=`echo $os | sed -e 's/windowsnt/winnt/'`
+ ;;
+ -psos*)
+ os=-psos
+ ;;
+ -mint | -mint[0-9]*)
+ basic_machine=m68k-atari
+ os=-mint
+ ;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+ # Recognize the basic CPU types without company name.
+ # Some are omitted here because they have special meanings below.
+ 1750a | 580 \
+ | a29k \
+ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+ | am33_2.0 \
+ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
+ | bfin \
+ | c4x | clipper \
+ | d10v | d30v | dlx | dsp16xx \
+ | fido | fr30 | frv \
+ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+ | i370 | i860 | i960 | ia64 \
+ | ip2k | iq2000 \
+ | m32c | m32r | m32rle | m68000 | m68k | m88k \
+ | maxq | mb | microblaze | mcore | mep \
+ | mips | mipsbe | mipseb | mipsel | mipsle \
+ | mips16 \
+ | mips64 | mips64el \
+ | mips64octeon | mips64octeonel \
+ | mips64orion | mips64orionel \
+ | mips64r5900 | mips64r5900el \
+ | mips64vr | mips64vrel \
+ | mips64vr4100 | mips64vr4100el \
+ | mips64vr4300 | mips64vr4300el \
+ | mips64vr5000 | mips64vr5000el \
+ | mips64vr5900 | mips64vr5900el \
+ | mipsisa32 | mipsisa32el \
+ | mipsisa32r2 | mipsisa32r2el \
+ | mipsisa64 | mipsisa64el \
+ | mipsisa64r2 | mipsisa64r2el \
+ | mipsisa64sb1 | mipsisa64sb1el \
+ | mipsisa64sr71k | mipsisa64sr71kel \
+ | mipstx39 | mipstx39el \
+ | mn10200 | mn10300 \
+ | mt \
+ | msp430 \
+ | nios | nios2 \
+ | ns16k | ns32k \
+ | or32 \
+ | pdp10 | pdp11 | pj | pjl \
+ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+ | pyramid \
+ | score \
+ | sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+ | sh64 | sh64le \
+ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
+ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \
+ | spu | strongarm \
+ | tahoe | thumb | tic4x | tic80 | tron \
+ | v850 | v850e \
+ | we32k \
+ | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \
+ | z8k)
+ basic_machine=$basic_machine-unknown
+ ;;
+ m6811 | m68hc11 | m6812 | m68hc12)
+ # Motorola 68HC11/12.
+ basic_machine=$basic_machine-unknown
+ os=-none
+ ;;
+ m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+ ;;
+ ms1)
+ basic_machine=mt-unknown
+ ;;
+
+ # We use `pc' rather than `unknown'
+ # because (1) that's what they normally are, and
+ # (2) the word "unknown" tends to confuse beginning users.
+ i*86 | x86_64)
+ basic_machine=$basic_machine-pc
+ ;;
+ # Object if more than one company name word.
+ *-*-*)
+ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+ exit 1
+ ;;
+ # Recognize the basic CPU types with company name.
+ 580-* \
+ | a29k-* \
+ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \
+ | avr-* | avr32-* \
+ | bfin-* | bs2000-* \
+ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
+ | clipper-* | craynv-* | cydra-* \
+ | d10v-* | d30v-* | dlx-* \
+ | elxsi-* \
+ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
+ | h8300-* | h8500-* \
+ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+ | i*86-* | i860-* | i960-* | ia64-* \
+ | ip2k-* | iq2000-* \
+ | m32c-* | m32r-* | m32rle-* \
+ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+ | m88110-* | m88k-* | maxq-* | mcore-* \
+ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+ | mips16-* \
+ | mips64-* | mips64el-* \
+ | mips64octeon-* | mips64octeonel-* \
+ | mips64orion-* | mips64orionel-* \
+ | mips64r5900-* | mips64r5900el-* \
+ | mips64vr-* | mips64vrel-* \
+ | mips64vr4100-* | mips64vr4100el-* \
+ | mips64vr4300-* | mips64vr4300el-* \
+ | mips64vr5000-* | mips64vr5000el-* \
+ | mips64vr5900-* | mips64vr5900el-* \
+ | mipsisa32-* | mipsisa32el-* \
+ | mipsisa32r2-* | mipsisa32r2el-* \
+ | mipsisa64-* | mipsisa64el-* \
+ | mipsisa64r2-* | mipsisa64r2el-* \
+ | mipsisa64sb1-* | mipsisa64sb1el-* \
+ | mipsisa64sr71k-* | mipsisa64sr71kel-* \
+ | mipstx39-* | mipstx39el-* \
+ | mmix-* \
+ | mt-* \
+ | msp430-* \
+ | nios-* | nios2-* \
+ | none-* | np1-* | ns16k-* | ns32k-* \
+ | orion-* \
+ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+ | pyramid-* \
+ | romp-* | rs6000-* \
+ | sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
+ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
+ | sparclite-* \
+ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
+ | tahoe-* | thumb-* \
+ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+ | tron-* \
+ | v850-* | v850e-* | vax-* \
+ | we32k-* \
+ | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
+ | xstormy16-* | xtensa*-* \
+ | ymp-* \
+ | z8k-*)
+ ;;
+ # Recognize the basic CPU types without company name, with glob match.
+ xtensa*)
+ basic_machine=$basic_machine-unknown
+ ;;
+ # Recognize the various machine names and aliases which stand
+ # for a CPU type and a company and sometimes even an OS.
+ 386bsd)
+ basic_machine=i386-unknown
+ os=-bsd
+ ;;
+ 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+ basic_machine=m68000-att
+ ;;
+ 3b*)
+ basic_machine=we32k-att
+ ;;
+ a29khif)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ abacus)
+ basic_machine=abacus-unknown
+ ;;
+ adobe68k)
+ basic_machine=m68010-adobe
+ os=-scout
+ ;;
+ alliant | fx80)
+ basic_machine=fx80-alliant
+ ;;
+ altos | altos3068)
+ basic_machine=m68k-altos
+ ;;
+ am29k)
+ basic_machine=a29k-none
+ os=-bsd
+ ;;
+ amd64)
+ basic_machine=x86_64-pc
+ ;;
+ amd64-*)
+ basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ amdahl)
+ basic_machine=580-amdahl
+ os=-sysv
+ ;;
+ amiga | amiga-*)
+ basic_machine=m68k-unknown
+ ;;
+ amigaos | amigados)
+ basic_machine=m68k-unknown
+ os=-amigaos
+ ;;
+ amigaunix | amix)
+ basic_machine=m68k-unknown
+ os=-sysv4
+ ;;
+ apollo68)
+ basic_machine=m68k-apollo
+ os=-sysv
+ ;;
+ apollo68bsd)
+ basic_machine=m68k-apollo
+ os=-bsd
+ ;;
+ aux)
+ basic_machine=m68k-apple
+ os=-aux
+ ;;
+ balance)
+ basic_machine=ns32k-sequent
+ os=-dynix
+ ;;
+ blackfin)
+ basic_machine=bfin-unknown
+ os=-linux
+ ;;
+ blackfin-*)
+ basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
+ os=-linux
+ ;;
+ c90)
+ basic_machine=c90-cray
+ os=-unicos
+ ;;
+ convex-c1)
+ basic_machine=c1-convex
+ os=-bsd
+ ;;
+ convex-c2)
+ basic_machine=c2-convex
+ os=-bsd
+ ;;
+ convex-c32)
+ basic_machine=c32-convex
+ os=-bsd
+ ;;
+ convex-c34)
+ basic_machine=c34-convex
+ os=-bsd
+ ;;
+ convex-c38)
+ basic_machine=c38-convex
+ os=-bsd
+ ;;
+ cray | j90)
+ basic_machine=j90-cray
+ os=-unicos
+ ;;
+ craynv)
+ basic_machine=craynv-cray
+ os=-unicosmp
+ ;;
+ cr16)
+ basic_machine=cr16-unknown
+ os=-elf
+ ;;
+ crds | unos)
+ basic_machine=m68k-crds
+ ;;
+ crisv32 | crisv32-* | etraxfs*)
+ basic_machine=crisv32-axis
+ ;;
+ cris | cris-* | etrax*)
+ basic_machine=cris-axis
+ ;;
+ crx)
+ basic_machine=crx-unknown
+ os=-elf
+ ;;
+ da30 | da30-*)
+ basic_machine=m68k-da30
+ ;;
+ decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+ basic_machine=mips-dec
+ ;;
+ decsystem10* | dec10*)
+ basic_machine=pdp10-dec
+ os=-tops10
+ ;;
+ decsystem20* | dec20*)
+ basic_machine=pdp10-dec
+ os=-tops20
+ ;;
+ delta | 3300 | motorola-3300 | motorola-delta \
+ | 3300-motorola | delta-motorola)
+ basic_machine=m68k-motorola
+ ;;
+ delta88)
+ basic_machine=m88k-motorola
+ os=-sysv3
+ ;;
+ djgpp)
+ basic_machine=i586-pc
+ os=-msdosdjgpp
+ ;;
+ dpx20 | dpx20-*)
+ basic_machine=rs6000-bull
+ os=-bosx
+ ;;
+ dpx2* | dpx2*-bull)
+ basic_machine=m68k-bull
+ os=-sysv3
+ ;;
+ ebmon29k)
+ basic_machine=a29k-amd
+ os=-ebmon
+ ;;
+ elxsi)
+ basic_machine=elxsi-elxsi
+ os=-bsd
+ ;;
+ encore | umax | mmax)
+ basic_machine=ns32k-encore
+ ;;
+ es1800 | OSE68k | ose68k | ose | OSE)
+ basic_machine=m68k-ericsson
+ os=-ose
+ ;;
+ fx2800)
+ basic_machine=i860-alliant
+ ;;
+ genix)
+ basic_machine=ns32k-ns
+ ;;
+ gmicro)
+ basic_machine=tron-gmicro
+ os=-sysv
+ ;;
+ go32)
+ basic_machine=i386-pc
+ os=-go32
+ ;;
+ h3050r* | hiux*)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ h8300hms)
+ basic_machine=h8300-hitachi
+ os=-hms
+ ;;
+ h8300xray)
+ basic_machine=h8300-hitachi
+ os=-xray
+ ;;
+ h8500hms)
+ basic_machine=h8500-hitachi
+ os=-hms
+ ;;
+ harris)
+ basic_machine=m88k-harris
+ os=-sysv3
+ ;;
+ hp300-*)
+ basic_machine=m68k-hp
+ ;;
+ hp300bsd)
+ basic_machine=m68k-hp
+ os=-bsd
+ ;;
+ hp300hpux)
+ basic_machine=m68k-hp
+ os=-hpux
+ ;;
+ hp3k9[0-9][0-9] | hp9[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hp9k2[0-9][0-9] | hp9k31[0-9])
+ basic_machine=m68000-hp
+ ;;
+ hp9k3[2-9][0-9])
+ basic_machine=m68k-hp
+ ;;
+ hp9k6[0-9][0-9] | hp6[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hp9k7[0-79][0-9] | hp7[0-79][0-9])
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k78[0-9] | hp78[0-9])
+ # FIXME: really hppa2.0-hp
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+ # FIXME: really hppa2.0-hp
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[0-9][13679] | hp8[0-9][13679])
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[0-9][0-9] | hp8[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hppa-next)
+ os=-nextstep3
+ ;;
+ hppaosf)
+ basic_machine=hppa1.1-hp
+ os=-osf
+ ;;
+ hppro)
+ basic_machine=hppa1.1-hp
+ os=-proelf
+ ;;
+ i370-ibm* | ibm*)
+ basic_machine=i370-ibm
+ ;;
+# I'm not sure what "Sysv32" means. Should this be sysv3.2?
+ i*86v32)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv32
+ ;;
+ i*86v4*)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv4
+ ;;
+ i*86v)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv
+ ;;
+ i*86sol2)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-solaris2
+ ;;
+ i386mach)
+ basic_machine=i386-mach
+ os=-mach
+ ;;
+ i386-vsta | vsta)
+ basic_machine=i386-unknown
+ os=-vsta
+ ;;
+ iris | iris4d)
+ basic_machine=mips-sgi
+ case $os in
+ -irix*)
+ ;;
+ *)
+ os=-irix4
+ ;;
+ esac
+ ;;
+ isi68 | isi)
+ basic_machine=m68k-isi
+ os=-sysv
+ ;;
+ m68knommu)
+ basic_machine=m68k-unknown
+ os=-linux
+ ;;
+ m68knommu-*)
+ basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
+ os=-linux
+ ;;
+ m88k-omron*)
+ basic_machine=m88k-omron
+ ;;
+ magnum | m3230)
+ basic_machine=mips-mips
+ os=-sysv
+ ;;
+ merlin)
+ basic_machine=ns32k-utek
+ os=-sysv
+ ;;
+ mingw32)
+ basic_machine=i386-pc
+ os=-mingw32
+ ;;
+ mingw32ce)
+ basic_machine=arm-unknown
+ os=-mingw32ce
+ ;;
+ miniframe)
+ basic_machine=m68000-convergent
+ ;;
+ *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+ basic_machine=m68k-atari
+ os=-mint
+ ;;
+ mips3*-*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+ ;;
+ mips3*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+ ;;
+ monitor)
+ basic_machine=m68k-rom68k
+ os=-coff
+ ;;
+ morphos)
+ basic_machine=powerpc-unknown
+ os=-morphos
+ ;;
+ msdos)
+ basic_machine=i386-pc
+ os=-msdos
+ ;;
+ ms1-*)
+ basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
+ ;;
+ mvs)
+ basic_machine=i370-ibm
+ os=-mvs
+ ;;
+ ncr3000)
+ basic_machine=i486-ncr
+ os=-sysv4
+ ;;
+ netbsd386)
+ basic_machine=i386-unknown
+ os=-netbsd
+ ;;
+ netwinder)
+ basic_machine=armv4l-rebel
+ os=-linux
+ ;;
+ news | news700 | news800 | news900)
+ basic_machine=m68k-sony
+ os=-newsos
+ ;;
+ news1000)
+ basic_machine=m68030-sony
+ os=-newsos
+ ;;
+ news-3600 | risc-news)
+ basic_machine=mips-sony
+ os=-newsos
+ ;;
+ necv70)
+ basic_machine=v70-nec
+ os=-sysv
+ ;;
+ next | m*-next )
+ basic_machine=m68k-next
+ case $os in
+ -nextstep* )
+ ;;
+ -ns2*)
+ os=-nextstep2
+ ;;
+ *)
+ os=-nextstep3
+ ;;
+ esac
+ ;;
+ nh3000)
+ basic_machine=m68k-harris
+ os=-cxux
+ ;;
+ nh[45]000)
+ basic_machine=m88k-harris
+ os=-cxux
+ ;;
+ nindy960)
+ basic_machine=i960-intel
+ os=-nindy
+ ;;
+ mon960)
+ basic_machine=i960-intel
+ os=-mon960
+ ;;
+ nonstopux)
+ basic_machine=mips-compaq
+ os=-nonstopux
+ ;;
+ np1)
+ basic_machine=np1-gould
+ ;;
+ nsr-tandem)
+ basic_machine=nsr-tandem
+ ;;
+ op50n-* | op60c-*)
+ basic_machine=hppa1.1-oki
+ os=-proelf
+ ;;
+ openrisc | openrisc-*)
+ basic_machine=or32-unknown
+ ;;
+ os400)
+ basic_machine=powerpc-ibm
+ os=-os400
+ ;;
+ OSE68000 | ose68000)
+ basic_machine=m68000-ericsson
+ os=-ose
+ ;;
+ os68k)
+ basic_machine=m68k-none
+ os=-os68k
+ ;;
+ pa-hitachi)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ paragon)
+ basic_machine=i860-intel
+ os=-osf
+ ;;
+ parisc)
+ basic_machine=hppa-unknown
+ os=-linux
+ ;;
+ parisc-*)
+ basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
+ os=-linux
+ ;;
+ pbd)
+ basic_machine=sparc-tti
+ ;;
+ pbb)
+ basic_machine=m68k-tti
+ ;;
+ pc532 | pc532-*)
+ basic_machine=ns32k-pc532
+ ;;
+ pc98)
+ basic_machine=i386-pc
+ ;;
+ pc98-*)
+ basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentium | p5 | k5 | k6 | nexgen | viac3)
+ basic_machine=i586-pc
+ ;;
+ pentiumpro | p6 | 6x86 | athlon | athlon_*)
+ basic_machine=i686-pc
+ ;;
+ pentiumii | pentium2 | pentiumiii | pentium3)
+ basic_machine=i686-pc
+ ;;
+ pentium4)
+ basic_machine=i786-pc
+ ;;
+ pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+ basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentiumpro-* | p6-* | 6x86-* | athlon-*)
+ basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+ basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentium4-*)
+ basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pn)
+ basic_machine=pn-gould
+ ;;
+ power) basic_machine=power-ibm
+ ;;
+ ppc) basic_machine=powerpc-unknown
+ ;;
+ ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppcle | powerpclittle | ppc-le | powerpc-little)
+ basic_machine=powerpcle-unknown
+ ;;
+ ppcle-* | powerpclittle-*)
+ basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppc64) basic_machine=powerpc64-unknown
+ ;;
+ ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+ basic_machine=powerpc64le-unknown
+ ;;
+ ppc64le-* | powerpc64little-*)
+ basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ps2)
+ basic_machine=i386-ibm
+ ;;
+ pw32)
+ basic_machine=i586-unknown
+ os=-pw32
+ ;;
+ rdos)
+ basic_machine=i386-pc
+ os=-rdos
+ ;;
+ rom68k)
+ basic_machine=m68k-rom68k
+ os=-coff
+ ;;
+ rm[46]00)
+ basic_machine=mips-siemens
+ ;;
+ rtpc | rtpc-*)
+ basic_machine=romp-ibm
+ ;;
+ s390 | s390-*)
+ basic_machine=s390-ibm
+ ;;
+ s390x | s390x-*)
+ basic_machine=s390x-ibm
+ ;;
+ sa29200)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ sb1)
+ basic_machine=mipsisa64sb1-unknown
+ ;;
+ sb1el)
+ basic_machine=mipsisa64sb1el-unknown
+ ;;
+ sde)
+ basic_machine=mipsisa32-sde
+ os=-elf
+ ;;
+ sei)
+ basic_machine=mips-sei
+ os=-seiux
+ ;;
+ sequent)
+ basic_machine=i386-sequent
+ ;;
+ sh)
+ basic_machine=sh-hitachi
+ os=-hms
+ ;;
+ sh5el)
+ basic_machine=sh5le-unknown
+ ;;
+ sh64)
+ basic_machine=sh64-unknown
+ ;;
+ sparclite-wrs | simso-wrs)
+ basic_machine=sparclite-wrs
+ os=-vxworks
+ ;;
+ sps7)
+ basic_machine=m68k-bull
+ os=-sysv2
+ ;;
+ spur)
+ basic_machine=spur-unknown
+ ;;
+ st2000)
+ basic_machine=m68k-tandem
+ ;;
+ stratus)
+ basic_machine=i860-stratus
+ os=-sysv4
+ ;;
+ sun2)
+ basic_machine=m68000-sun
+ ;;
+ sun2os3)
+ basic_machine=m68000-sun
+ os=-sunos3
+ ;;
+ sun2os4)
+ basic_machine=m68000-sun
+ os=-sunos4
+ ;;
+ sun3os3)
+ basic_machine=m68k-sun
+ os=-sunos3
+ ;;
+ sun3os4)
+ basic_machine=m68k-sun
+ os=-sunos4
+ ;;
+ sun4os3)
+ basic_machine=sparc-sun
+ os=-sunos3
+ ;;
+ sun4os4)
+ basic_machine=sparc-sun
+ os=-sunos4
+ ;;
+ sun4sol2)
+ basic_machine=sparc-sun
+ os=-solaris2
+ ;;
+ sun3 | sun3-*)
+ basic_machine=m68k-sun
+ ;;
+ sun4)
+ basic_machine=sparc-sun
+ ;;
+ sun386 | sun386i | roadrunner)
+ basic_machine=i386-sun
+ ;;
+ sv1)
+ basic_machine=sv1-cray
+ os=-unicos
+ ;;
+ symmetry)
+ basic_machine=i386-sequent
+ os=-dynix
+ ;;
+ t3e)
+ basic_machine=alphaev5-cray
+ os=-unicos
+ ;;
+ t90)
+ basic_machine=t90-cray
+ os=-unicos
+ ;;
+ tic54x | c54x*)
+ basic_machine=tic54x-unknown
+ os=-coff
+ ;;
+ tic55x | c55x*)
+ basic_machine=tic55x-unknown
+ os=-coff
+ ;;
+ tic6x | c6x*)
+ basic_machine=tic6x-unknown
+ os=-coff
+ ;;
+ tile*)
+ basic_machine=tile-unknown
+ os=-linux-gnu
+ ;;
+ tx39)
+ basic_machine=mipstx39-unknown
+ ;;
+ tx39el)
+ basic_machine=mipstx39el-unknown
+ ;;
+ toad1)
+ basic_machine=pdp10-xkl
+ os=-tops20
+ ;;
+ tower | tower-32)
+ basic_machine=m68k-ncr
+ ;;
+ tpf)
+ basic_machine=s390x-ibm
+ os=-tpf
+ ;;
+ udi29k)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ ultra3)
+ basic_machine=a29k-nyu
+ os=-sym1
+ ;;
+ v810 | necv810)
+ basic_machine=v810-nec
+ os=-none
+ ;;
+ vaxv)
+ basic_machine=vax-dec
+ os=-sysv
+ ;;
+ vms)
+ basic_machine=vax-dec
+ os=-vms
+ ;;
+ vpp*|vx|vx-*)
+ basic_machine=f301-fujitsu
+ ;;
+ vxworks960)
+ basic_machine=i960-wrs
+ os=-vxworks
+ ;;
+ vxworks68)
+ basic_machine=m68k-wrs
+ os=-vxworks
+ ;;
+ vxworks29k)
+ basic_machine=a29k-wrs
+ os=-vxworks
+ ;;
+ w65*)
+ basic_machine=w65-wdc
+ os=-none
+ ;;
+ w89k-*)
+ basic_machine=hppa1.1-winbond
+ os=-proelf
+ ;;
+ xbox)
+ basic_machine=i686-pc
+ os=-mingw32
+ ;;
+ xps | xps100)
+ basic_machine=xps100-honeywell
+ ;;
+ ymp)
+ basic_machine=ymp-cray
+ os=-unicos
+ ;;
+ z8k-*-coff)
+ basic_machine=z8k-unknown
+ os=-sim
+ ;;
+ none)
+ basic_machine=none-none
+ os=-none
+ ;;
+
+# Here we handle the default manufacturer of certain CPU types. It is in
+# some cases the only manufacturer, in others, it is the most popular.
+ w89k)
+ basic_machine=hppa1.1-winbond
+ ;;
+ op50n)
+ basic_machine=hppa1.1-oki
+ ;;
+ op60c)
+ basic_machine=hppa1.1-oki
+ ;;
+ romp)
+ basic_machine=romp-ibm
+ ;;
+ mmix)
+ basic_machine=mmix-knuth
+ ;;
+ rs6000)
+ basic_machine=rs6000-ibm
+ ;;
+ vax)
+ basic_machine=vax-dec
+ ;;
+ pdp10)
+ # there are many clones, so DEC is not a safe bet
+ basic_machine=pdp10-unknown
+ ;;
+ pdp11)
+ basic_machine=pdp11-dec
+ ;;
+ we32k)
+ basic_machine=we32k-att
+ ;;
+ sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele)
+ basic_machine=sh-unknown
+ ;;
+ sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
+ basic_machine=sparc-sun
+ ;;
+ cydra)
+ basic_machine=cydra-cydrome
+ ;;
+ orion)
+ basic_machine=orion-highlevel
+ ;;
+ orion105)
+ basic_machine=clipper-highlevel
+ ;;
+ mac | mpw | mac-mpw)
+ basic_machine=m68k-apple
+ ;;
+ pmac | pmac-mpw)
+ basic_machine=powerpc-apple
+ ;;
+ *-unknown)
+ # Make sure to match an already-canonicalized machine name.
+ ;;
+ *)
+ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+ *-digital*)
+ basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+ ;;
+ *-commodore*)
+ basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+ ;;
+ *)
+ ;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+ # First match some system type aliases
+ # that might get confused with valid system types.
+ # -solaris* is a basic system type, with this one exception.
+ -solaris1 | -solaris1.*)
+ os=`echo $os | sed -e 's|solaris1|sunos4|'`
+ ;;
+ -solaris)
+ os=-solaris2
+ ;;
+ -svr4*)
+ os=-sysv4
+ ;;
+ -unixware*)
+ os=-sysv4.2uw
+ ;;
+ -gnu/linux*)
+ os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+ ;;
+ # First accept the basic system types.
+ # The portable systems comes first.
+ # Each alternative MUST END IN A *, to match a version number.
+ # -sysv* is not here because it comes later, after sysvr4.
+ -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
+ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+ | -aos* \
+ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
+ | -openbsd* | -solidbsd* \
+ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+ | -chorusos* | -chorusrdb* \
+ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+ | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
+ | -uxpv* | -beos* | -mpeix* | -udk* \
+ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+ | -skyos* | -haiku* | -rdos* | -toppers* | -drops*)
+ # Remember, each alternative MUST END IN *, to match a version number.
+ ;;
+ -qnx*)
+ case $basic_machine in
+ x86-* | i*86-*)
+ ;;
+ *)
+ os=-nto$os
+ ;;
+ esac
+ ;;
+ -nto-qnx*)
+ ;;
+ -nto*)
+ os=`echo $os | sed -e 's|nto|nto-qnx|'`
+ ;;
+ -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
+ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+ ;;
+ -mac*)
+ os=`echo $os | sed -e 's|mac|macos|'`
+ ;;
+ -linux-dietlibc)
+ os=-linux-dietlibc
+ ;;
+ -linux*)
+ os=`echo $os | sed -e 's|linux|linux-gnu|'`
+ ;;
+ -sunos5*)
+ os=`echo $os | sed -e 's|sunos5|solaris2|'`
+ ;;
+ -sunos6*)
+ os=`echo $os | sed -e 's|sunos6|solaris3|'`
+ ;;
+ -opened*)
+ os=-openedition
+ ;;
+ -os400*)
+ os=-os400
+ ;;
+ -wince*)
+ os=-wince
+ ;;
+ -osfrose*)
+ os=-osfrose
+ ;;
+ -osf*)
+ os=-osf
+ ;;
+ -utek*)
+ os=-bsd
+ ;;
+ -dynix*)
+ os=-bsd
+ ;;
+ -acis*)
+ os=-aos
+ ;;
+ -atheos*)
+ os=-atheos
+ ;;
+ -syllable*)
+ os=-syllable
+ ;;
+ -386bsd)
+ os=-bsd
+ ;;
+ -ctix* | -uts*)
+ os=-sysv
+ ;;
+ -nova*)
+ os=-rtmk-nova
+ ;;
+ -ns2 )
+ os=-nextstep2
+ ;;
+ -nsk*)
+ os=-nsk
+ ;;
+ # Preserve the version number of sinix5.
+ -sinix5.*)
+ os=`echo $os | sed -e 's|sinix|sysv|'`
+ ;;
+ -sinix*)
+ os=-sysv4
+ ;;
+ -tpf*)
+ os=-tpf
+ ;;
+ -triton*)
+ os=-sysv3
+ ;;
+ -oss*)
+ os=-sysv3
+ ;;
+ -svr4)
+ os=-sysv4
+ ;;
+ -svr3)
+ os=-sysv3
+ ;;
+ -sysvr4)
+ os=-sysv4
+ ;;
+ # This must come after -sysvr4.
+ -sysv*)
+ ;;
+ -ose*)
+ os=-ose
+ ;;
+ -es1800*)
+ os=-ose
+ ;;
+ -xenix)
+ os=-xenix
+ ;;
+ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+ os=-mint
+ ;;
+ -aros*)
+ os=-aros
+ ;;
+ -kaos*)
+ os=-kaos
+ ;;
+ -zvmoe)
+ os=-zvmoe
+ ;;
+ -none)
+ ;;
+ *)
+ # Get rid of the `-' at the beginning of $os.
+ os=`echo $os | sed 's/[^-]*-//'`
+ echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system. Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+ score-*)
+ os=-elf
+ ;;
+ spu-*)
+ os=-elf
+ ;;
+ *-acorn)
+ os=-riscix1.2
+ ;;
+ arm*-rebel)
+ os=-linux
+ ;;
+ arm*-semi)
+ os=-aout
+ ;;
+ c4x-* | tic4x-*)
+ os=-coff
+ ;;
+ # This must come before the *-dec entry.
+ pdp10-*)
+ os=-tops20
+ ;;
+ pdp11-*)
+ os=-none
+ ;;
+ *-dec | vax-*)
+ os=-ultrix4.2
+ ;;
+ m68*-apollo)
+ os=-domain
+ ;;
+ i386-sun)
+ os=-sunos4.0.2
+ ;;
+ m68000-sun)
+ os=-sunos3
+ # This also exists in the configure program, but was not the
+ # default.
+ # os=-sunos4
+ ;;
+ m68*-cisco)
+ os=-aout
+ ;;
+ mep-*)
+ os=-elf
+ ;;
+ mips*-cisco)
+ os=-elf
+ ;;
+ mips*-*)
+ os=-elf
+ ;;
+ or32-*)
+ os=-coff
+ ;;
+ *-tti) # must be before sparc entry or we get the wrong os.
+ os=-sysv3
+ ;;
+ sparc-* | *-sun)
+ os=-sunos4.1.1
+ ;;
+ *-be)
+ os=-beos
+ ;;
+ *-haiku)
+ os=-haiku
+ ;;
+ *-ibm)
+ os=-aix
+ ;;
+ *-knuth)
+ os=-mmixware
+ ;;
+ *-wec)
+ os=-proelf
+ ;;
+ *-winbond)
+ os=-proelf
+ ;;
+ *-oki)
+ os=-proelf
+ ;;
+ *-hp)
+ os=-hpux
+ ;;
+ *-hitachi)
+ os=-hiux
+ ;;
+ i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+ os=-sysv
+ ;;
+ *-cbm)
+ os=-amigaos
+ ;;
+ *-dg)
+ os=-dgux
+ ;;
+ *-dolphin)
+ os=-sysv3
+ ;;
+ m68k-ccur)
+ os=-rtu
+ ;;
+ m88k-omron*)
+ os=-luna
+ ;;
+ *-next )
+ os=-nextstep
+ ;;
+ *-sequent)
+ os=-ptx
+ ;;
+ *-crds)
+ os=-unos
+ ;;
+ *-ns)
+ os=-genix
+ ;;
+ i370-*)
+ os=-mvs
+ ;;
+ *-next)
+ os=-nextstep3
+ ;;
+ *-gould)
+ os=-sysv
+ ;;
+ *-highlevel)
+ os=-bsd
+ ;;
+ *-encore)
+ os=-bsd
+ ;;
+ *-sgi)
+ os=-irix
+ ;;
+ *-siemens)
+ os=-sysv4
+ ;;
+ *-masscomp)
+ os=-rtu
+ ;;
+ f30[01]-fujitsu | f700-fujitsu)
+ os=-uxpv
+ ;;
+ *-rom68k)
+ os=-coff
+ ;;
+ *-*bug)
+ os=-coff
+ ;;
+ *-apple)
+ os=-macos
+ ;;
+ *-atari*)
+ os=-mint
+ ;;
+ *)
+ os=-none
+ ;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer. We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+ *-unknown)
+ case $os in
+ -riscix*)
+ vendor=acorn
+ ;;
+ -sunos*)
+ vendor=sun
+ ;;
+ -aix*)
+ vendor=ibm
+ ;;
+ -beos*)
+ vendor=be
+ ;;
+ -hpux*)
+ vendor=hp
+ ;;
+ -mpeix*)
+ vendor=hp
+ ;;
+ -hiux*)
+ vendor=hitachi
+ ;;
+ -unos*)
+ vendor=crds
+ ;;
+ -dgux*)
+ vendor=dg
+ ;;
+ -luna*)
+ vendor=omron
+ ;;
+ -genix*)
+ vendor=ns
+ ;;
+ -mvs* | -opened*)
+ vendor=ibm
+ ;;
+ -os400*)
+ vendor=ibm
+ ;;
+ -ptx*)
+ vendor=sequent
+ ;;
+ -tpf*)
+ vendor=ibm
+ ;;
+ -vxsim* | -vxworks* | -windiss*)
+ vendor=wrs
+ ;;
+ -aux*)
+ vendor=apple
+ ;;
+ -hms*)
+ vendor=hitachi
+ ;;
+ -mpw* | -macos*)
+ vendor=apple
+ ;;
+ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+ vendor=atari
+ ;;
+ -vos*)
+ vendor=stratus
+ ;;
+ esac
+ basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+ ;;
+esac
+
+echo $basic_machine$os
+exit
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/configure b/configure
new file mode 100755
index 000000000..5fbf7cafe
--- /dev/null
+++ b/configure
@@ -0,0 +1,9526 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.61.
+#
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+# 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## --------------------- ##
+## M4sh Initialization. ##
+## --------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in
+ *posix*) set -o posix ;;
+esac
+
+fi
+
+
+
+
+# PATH needs CR
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ as_unset=unset
+else
+ as_unset=false
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+as_nl='
+'
+IFS=" "" $as_nl"
+
+# Find who we are. Look in the path if we contain no directory separator.
+case $0 in
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ { (exit 1); exit 1; }
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+ LC_TELEPHONE LC_TIME
+do
+ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+ eval $as_var=C; export $as_var
+ else
+ ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+ fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# CDPATH.
+$as_unset CDPATH
+
+
+if test "x$CONFIG_SHELL" = x; then
+ if (eval ":") 2>/dev/null; then
+ as_have_required=yes
+else
+ as_have_required=no
+fi
+
+ if test $as_have_required = yes && (eval ":
+(as_func_return () {
+ (exit \$1)
+}
+as_func_success () {
+ as_func_return 0
+}
+as_func_failure () {
+ as_func_return 1
+}
+as_func_ret_success () {
+ return 0
+}
+as_func_ret_failure () {
+ return 1
+}
+
+exitcode=0
+if as_func_success; then
+ :
+else
+ exitcode=1
+ echo as_func_success failed.
+fi
+
+if as_func_failure; then
+ exitcode=1
+ echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+ :
+else
+ exitcode=1
+ echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+ exitcode=1
+ echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+ :
+else
+ exitcode=1
+ echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0) || { (exit 1); exit 1; }
+
+(
+ as_lineno_1=\$LINENO
+ as_lineno_2=\$LINENO
+ test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" &&
+ test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; }
+") 2> /dev/null; then
+ :
+else
+ as_candidate_shells=
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ case $as_dir in
+ /*)
+ for as_base in sh bash ksh sh5; do
+ as_candidate_shells="$as_candidate_shells $as_dir/$as_base"
+ done;;
+ esac
+done
+IFS=$as_save_IFS
+
+
+ for as_shell in $as_candidate_shells $SHELL; do
+ # Try only shells that exist, to save several forks.
+ if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+ { ("$as_shell") 2> /dev/null <<\_ASEOF
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in
+ *posix*) set -o posix ;;
+esac
+
+fi
+
+
+:
+_ASEOF
+}; then
+ CONFIG_SHELL=$as_shell
+ as_have_required=yes
+ if { "$as_shell" 2> /dev/null <<\_ASEOF
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in
+ *posix*) set -o posix ;;
+esac
+
+fi
+
+
+:
+(as_func_return () {
+ (exit $1)
+}
+as_func_success () {
+ as_func_return 0
+}
+as_func_failure () {
+ as_func_return 1
+}
+as_func_ret_success () {
+ return 0
+}
+as_func_ret_failure () {
+ return 1
+}
+
+exitcode=0
+if as_func_success; then
+ :
+else
+ exitcode=1
+ echo as_func_success failed.
+fi
+
+if as_func_failure; then
+ exitcode=1
+ echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+ :
+else
+ exitcode=1
+ echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+ exitcode=1
+ echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = "$1" ); then
+ :
+else
+ exitcode=1
+ echo positional parameters were not saved.
+fi
+
+test $exitcode = 0) || { (exit 1); exit 1; }
+
+(
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; }
+
+_ASEOF
+}; then
+ break
+fi
+
+fi
+
+ done
+
+ if test "x$CONFIG_SHELL" != x; then
+ for as_var in BASH_ENV ENV
+ do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+ done
+ export CONFIG_SHELL
+ exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
+fi
+
+
+ if test $as_have_required = no; then
+ echo This script requires a shell more modern than all the
+ echo shells that I found on your system. Please install a
+ echo modern shell, or manually run the script under such a
+ echo shell if you do have one.
+ { (exit 1); exit 1; }
+fi
+
+
+fi
+
+fi
+
+
+
+(eval "as_func_return () {
+ (exit \$1)
+}
+as_func_success () {
+ as_func_return 0
+}
+as_func_failure () {
+ as_func_return 1
+}
+as_func_ret_success () {
+ return 0
+}
+as_func_ret_failure () {
+ return 1
+}
+
+exitcode=0
+if as_func_success; then
+ :
+else
+ exitcode=1
+ echo as_func_success failed.
+fi
+
+if as_func_failure; then
+ exitcode=1
+ echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+ :
+else
+ exitcode=1
+ echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+ exitcode=1
+ echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+ :
+else
+ exitcode=1
+ echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0") || {
+ echo No shell found that supports shell functions.
+ echo Please tell autoconf@gnu.org about your system,
+ echo including any error possibly output before this
+ echo message
+}
+
+
+
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
+
+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+ # uniformly replaced by the line number. The first 'sed' inserts a
+ # line-number line after each line using $LINENO; the second 'sed'
+ # does the real work. The second script uses 'N' to pair each
+ # line-number line with the line containing $LINENO, and appends
+ # trailing '-' during substitution so that $LINENO is not a special
+ # case at line end.
+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+ # scripts with optimization help from Paolo Bonzini. Blame Lee
+ # E. McMahon (1931-1989) for sed's syntax. :-)
+ sed -n '
+ p
+ /[$]LINENO/=
+ ' <$as_myself |
+ sed '
+ s/[$]LINENO.*/&-/
+ t lineno
+ b
+ :lineno
+ N
+ :loop
+ s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+ t loop
+ s/-\n.*//
+ ' >$as_me.lineno &&
+ chmod +x "$as_me.lineno" ||
+ { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+ { (exit 1); exit 1; }; }
+
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensitive to this).
+ . "./$as_me.lineno"
+ # Exit status is that of the last command.
+ exit
+}
+
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+ case `echo 'x\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ *) ECHO_C='\c';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir
+fi
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -p'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -p'
+elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+else
+ as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p=:
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+ as_test_x='test -x'
+else
+ if ls -dL / >/dev/null 2>&1; then
+ as_ls_L_option=L
+ else
+ as_ls_L_option=
+ fi
+ as_test_x='
+ eval sh -c '\''
+ if test -d "$1"; then
+ test -d "$1/.";
+ else
+ case $1 in
+ -*)set "./$1";;
+ esac;
+ case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
+ ???[sx]*):;;*)false;;esac;fi
+ '\'' sh
+ '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+
+exec 7<&0 </dev/null 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Identity of this package.
+PACKAGE_NAME=
+PACKAGE_TARNAME=
+PACKAGE_VERSION=
+PACKAGE_STRING=
+PACKAGE_BUGREPORT=
+
+ac_unique_file="src/actions.c"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+# endif
+#endif
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+# include <memory.h>
+# endif
+# include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_subst_vars='SHELL
+PATH_SEPARATOR
+PACKAGE_NAME
+PACKAGE_TARNAME
+PACKAGE_VERSION
+PACKAGE_STRING
+PACKAGE_BUGREPORT
+exec_prefix
+prefix
+program_transform_name
+bindir
+sbindir
+libexecdir
+datarootdir
+datadir
+sysconfdir
+sharedstatedir
+localstatedir
+includedir
+oldincludedir
+docdir
+infodir
+htmldir
+dvidir
+pdfdir
+psdir
+libdir
+localedir
+mandir
+DEFS
+ECHO_C
+ECHO_N
+ECHO_T
+LIBS
+build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+CPPFLAGS
+ac_ct_CC
+EXEEXT
+OBJEXT
+RM
+CP
+TOUCH
+INSTALL
+MYSQLCONF
+MYSQL
+RDB
+ANOPELIBS
+CPP
+GREP
+EGREP
+SHARED
+MODULEFLAGS
+RUNGROUP
+BINDEST
+DATDEST
+MODULE_PATH
+LIBOBJS
+LTLIBOBJS'
+ac_subst_files=''
+ ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CPP'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval $ac_prev=\$ac_option
+ ac_prev=
+ continue
+ fi
+
+ case $ac_option in
+ *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+ *) ac_optarg=yes ;;
+ esac
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case $ac_dashdash$ac_option in
+ --)
+ ac_dashdash=yes ;;
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir=$ac_optarg ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build_alias ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build_alias=$ac_optarg ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file=$ac_optarg ;;
+
+ --config-cache | -C)
+ cache_file=config.cache ;;
+
+ -datadir | --datadir | --datadi | --datad)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=*)
+ datadir=$ac_optarg ;;
+
+ -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+ | --dataroo | --dataro | --datar)
+ ac_prev=datarootdir ;;
+ -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+ datarootdir=$ac_optarg ;;
+
+ -disable-* | --disable-*)
+ ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+ { (exit 1); exit 1; }; }
+ ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'`
+ eval enable_$ac_feature=no ;;
+
+ -docdir | --docdir | --docdi | --doc | --do)
+ ac_prev=docdir ;;
+ -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+ docdir=$ac_optarg ;;
+
+ -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+ ac_prev=dvidir ;;
+ -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+ dvidir=$ac_optarg ;;
+
+ -enable-* | --enable-*)
+ ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+ { (exit 1); exit 1; }; }
+ ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'`
+ eval enable_$ac_feature=\$ac_optarg ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix=$ac_optarg ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he | -h)
+ ac_init_help=long ;;
+ -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+ ac_init_help=recursive ;;
+ -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+ ac_init_help=short ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host_alias ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host_alias=$ac_optarg ;;
+
+ -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+ ac_prev=htmldir ;;
+ -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+ | --ht=*)
+ htmldir=$ac_optarg ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir=$ac_optarg ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir=$ac_optarg ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir=$ac_optarg ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir=$ac_optarg ;;
+
+ -localedir | --localedir | --localedi | --localed | --locale)
+ ac_prev=localedir ;;
+ -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+ localedir=$ac_optarg ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst | --locals)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+ localstatedir=$ac_optarg ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir=$ac_optarg ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c | -n)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir=$ac_optarg ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix=$ac_optarg ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix=$ac_optarg ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix=$ac_optarg ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name=$ac_optarg ;;
+
+ -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+ ac_prev=pdfdir ;;
+ -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+ pdfdir=$ac_optarg ;;
+
+ -psdir | --psdir | --psdi | --psd | --ps)
+ ac_prev=psdir ;;
+ -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+ psdir=$ac_optarg ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir=$ac_optarg ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir=$ac_optarg ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site=$ac_optarg ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir=$ac_optarg ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir=$ac_optarg ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target_alias ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target_alias=$ac_optarg ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers | -V)
+ ac_init_version=: ;;
+
+ -with-* | --with-*)
+ ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid package name: $ac_package" >&2
+ { (exit 1); exit 1; }; }
+ ac_package=`echo $ac_package | sed 's/[-.]/_/g'`
+ eval with_$ac_package=\$ac_optarg ;;
+
+ -without-* | --without-*)
+ ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid package name: $ac_package" >&2
+ { (exit 1); exit 1; }; }
+ ac_package=`echo $ac_package | sed 's/[-.]/_/g'`
+ eval with_$ac_package=no ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes=$ac_optarg ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries=$ac_optarg ;;
+
+ -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+ { (exit 1); exit 1; }; }
+ ;;
+
+ *=*)
+ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+ { (exit 1); exit 1; }; }
+ eval $ac_envvar=\$ac_optarg
+ export $ac_envvar ;;
+
+ *)
+ # FIXME: should be removed in autoconf 3.0.
+ echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+ : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+ { echo "$as_me: error: missing argument to $ac_option" >&2
+ { (exit 1); exit 1; }; }
+fi
+
+# Be sure to have absolute directory names.
+for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
+ datadir sysconfdir sharedstatedir localstatedir includedir \
+ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+ libdir localedir mandir
+do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* ) continue;;
+ NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+ esac
+ { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+ { (exit 1); exit 1; }; }
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+ if test "x$build_alias" = x; then
+ cross_compiling=maybe
+ echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+ If a cross compiler is detected then cross compile mode will be used." >&2
+ elif test "x$build_alias" != "x$host_alias"; then
+ cross_compiling=yes
+ fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+ { echo "$as_me: error: Working directory cannot be determined" >&2
+ { (exit 1); exit 1; }; }
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+ { echo "$as_me: error: pwd does not report name of working directory" >&2
+ { (exit 1); exit 1; }; }
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then the parent directory.
+ ac_confdir=`$as_dirname -- "$0" ||
+$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$0" : 'X\(//\)[^/]' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$0" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ srcdir=$ac_confdir
+ if test ! -r "$srcdir/$ac_unique_file"; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+ test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+ { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+ { (exit 1); exit 1; }; }
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+ cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2
+ { (exit 1); exit 1; }; }
+ pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+ srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+ eval ac_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_env_${ac_var}_value=\$${ac_var}
+ eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat <<_ACEOF
+\`configure' configures this package to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE. See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+ -h, --help display this help and exit
+ --help=short display options specific to this package
+ --help=recursive display the short help of all the included packages
+ -V, --version display version information and exit
+ -q, --quiet, --silent do not print \`checking...' messages
+ --cache-file=FILE cache test results in FILE [disabled]
+ -C, --config-cache alias for \`--cache-file=config.cache'
+ -n, --no-create do not create output files
+ --srcdir=DIR find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+ --bindir=DIR user executables [EPREFIX/bin]
+ --sbindir=DIR system admin executables [EPREFIX/sbin]
+ --libexecdir=DIR program executables [EPREFIX/libexec]
+ --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data [PREFIX/var]
+ --libdir=DIR object code libraries [EPREFIX/lib]
+ --includedir=DIR C header files [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc [/usr/include]
+ --datarootdir=DIR read-only arch.-independent data root [PREFIX/share]
+ --datadir=DIR read-only architecture-independent data [DATAROOTDIR]
+ --infodir=DIR info documentation [DATAROOTDIR/info]
+ --localedir=DIR locale-dependent data [DATAROOTDIR/locale]
+ --mandir=DIR man documentation [DATAROOTDIR/man]
+ --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE]
+ --htmldir=DIR html documentation [DOCDIR]
+ --dvidir=DIR dvi documentation [DOCDIR]
+ --pdfdir=DIR pdf documentation [DOCDIR]
+ --psdir=DIR ps documentation [DOCDIR]
+_ACEOF
+
+ cat <<\_ACEOF
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+
+ cat <<\_ACEOF
+
+Optional Packages:
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --without-mysql Do not use MySQL or attempt to find it
+ --with-mysqlconfig-path=PATH Complete path to the mysql_config executable
+ --with-rungroup=group Specify the rungroup for anope
+ --with-permissions=permissions Specify the default permissions for anope
+ --with-bindir=bindir Specify the default binary dir for anope
+ --with-datadir=datadir Specify the location of the services data folder
+
+Some influential environment variables:
+ CC C compiler command
+ CFLAGS C compiler flags
+ LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
+ nonstandard directory <lib dir>
+ LIBS libraries to pass to the linker, e.g. -l<library>
+ CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I<include dir> if
+ you have headers in a nonstandard directory <include dir>
+ CPP C preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+ # If there are subdirs, report their specific --help.
+ for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+ test -d "$ac_dir" || continue
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+ cd "$ac_dir" || { ac_status=$?; continue; }
+ # Check for guested configure.
+ if test -f "$ac_srcdir/configure.gnu"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+ elif test -f "$ac_srcdir/configure"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure" --help=recursive
+ else
+ echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ fi || ac_status=$?
+ cd "$ac_pwd" || { ac_status=$?; break; }
+ done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+ cat <<\_ACEOF
+configure
+generated by GNU Autoconf 2.61
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+ exit
+fi
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by $as_me, which was
+generated by GNU Autoconf 2.61. Invocation command line was
+
+ $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
+
+/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown`
+/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
+/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ echo "PATH: $as_dir"
+done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+ for ac_arg
+ do
+ case $ac_arg in
+ -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ continue ;;
+ *\'*)
+ ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ case $ac_pass in
+ 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+ 2)
+ ac_configure_args1="$ac_configure_args1 '$ac_arg'"
+ if test $ac_must_keep_next = true; then
+ ac_must_keep_next=false # Got value, back to normal.
+ else
+ case $ac_arg in
+ *=* | --config-cache | -C | -disable-* | --disable-* \
+ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+ | -with-* | --with-* | -without-* | --without-* | --x)
+ case "$ac_configure_args0 " in
+ "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+ esac
+ ;;
+ -* ) ac_must_keep_next=true ;;
+ esac
+ fi
+ ac_configure_args="$ac_configure_args '$ac_arg'"
+ ;;
+ esac
+ done
+done
+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log. We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+ # Save into config.log some information that might help in debugging.
+ {
+ echo
+
+ cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+ echo
+ # The following way of writing the cache mishandles newlines in values,
+(
+ for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
+echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ *) $as_unset $ac_var ;;
+ esac ;;
+ esac
+ done
+ (set) 2>&1 |
+ case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ sed -n \
+ "s/'\''/'\''\\\\'\'''\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+ ;; #(
+ *)
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+)
+ echo
+
+ cat <<\_ASBOX
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+_ASBOX
+ echo
+ for ac_var in $ac_subst_vars
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ echo "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+
+ if test -n "$ac_subst_files"; then
+ cat <<\_ASBOX
+## ------------------- ##
+## File substitutions. ##
+## ------------------- ##
+_ASBOX
+ echo
+ for ac_var in $ac_subst_files
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ echo "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+ fi
+
+ if test -s confdefs.h; then
+ cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+ echo
+ cat confdefs.h
+ echo
+ fi
+ test "$ac_signal" != 0 &&
+ echo "$as_me: caught signal $ac_signal"
+ echo "$as_me: exit $exit_status"
+ } >&5
+ rm -f core *.core core.conftest.* &&
+ rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+ exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+ trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer explicitly selected file to automatically selected ones.
+if test -n "$CONFIG_SITE"; then
+ set x "$CONFIG_SITE"
+elif test "x$prefix" != xNONE; then
+ set x "$prefix/share/config.site" "$prefix/etc/config.site"
+else
+ set x "$ac_default_prefix/share/config.site" \
+ "$ac_default_prefix/etc/config.site"
+fi
+shift
+for ac_site_file
+do
+ if test -r "$ac_site_file"; then
+ { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+ sed 's/^/| /' "$ac_site_file" >&5
+ . "$ac_site_file"
+ fi
+done
+
+if test -r "$cache_file"; then
+ # Some versions of bash will fail to source /dev/null (special
+ # files actually), so we avoid doing that.
+ if test -f "$cache_file"; then
+ { echo "$as_me:$LINENO: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) . "$cache_file";;
+ *) . "./$cache_file";;
+ esac
+ fi
+else
+ { echo "$as_me:$LINENO: creating cache $cache_file" >&5
+echo "$as_me: creating cache $cache_file" >&6;}
+ >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+ eval ac_old_set=\$ac_cv_env_${ac_var}_set
+ eval ac_new_set=\$ac_env_${ac_var}_set
+ eval ac_old_val=\$ac_cv_env_${ac_var}_value
+ eval ac_new_val=\$ac_env_${ac_var}_value
+ case $ac_old_set,$ac_new_set in
+ set,)
+ { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,set)
+ { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,);;
+ *)
+ if test "x$ac_old_val" != "x$ac_new_val"; then
+ { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ { echo "$as_me:$LINENO: former value: $ac_old_val" >&5
+echo "$as_me: former value: $ac_old_val" >&2;}
+ { echo "$as_me:$LINENO: current value: $ac_new_val" >&5
+echo "$as_me: current value: $ac_new_val" >&2;}
+ ac_cache_corrupted=:
+ fi;;
+ esac
+ # Pass precious variables to config.status.
+ if test "$ac_new_set" = set; then
+ case $ac_new_val in
+ *\'*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *) ac_arg=$ac_var=$ac_new_val ;;
+ esac
+ case " $ac_configure_args " in
+ *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
+ *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+ esac
+ fi
+done
+if $ac_cache_corrupted; then
+ { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+ { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+# If no bindir, we tell him to run ./Config.
+if test "${with_bindir+set}" != set || test "${with_datadir+set}" != set; then
+ echo "You might want to run ./Config or provide some parameters to this script."
+ echo "./configure --help for information about this script"
+ exit 0
+fi
+
+
+ac_config_headers="$ac_config_headers include/sysconf.h"
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_CC="${ac_tool_prefix}gcc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_ac_ct_CC="gcc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet. If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet. If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_CC="${ac_tool_prefix}cc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+ fi
+fi
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# != 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+ fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in cl.exe
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+ test -n "$CC" && break
+ done
+fi
+if test -z "$CC"; then
+ ac_ct_CC=$CC
+ for ac_prog in cl.exe
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_ac_ct_CC="$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+ test -n "$ac_ct_CC" && break
+done
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet. If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet. If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+fi
+
+fi
+
+
+test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&5
+echo "$as_me: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO: checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (ac_try="$ac_compiler --version >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compiler --version >&5") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (ac_try="$ac_compiler -v >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compiler -v >&5") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (ac_try="$ac_compiler -V >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compiler -V >&5") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
+echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6; }
+ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+#
+# List of possible output files, starting from the most likely.
+# The algorithm is not robust to junk in `.', hence go to wildcards (a.*)
+# only as a last resort. b.out is created by i960 compilers.
+ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out'
+#
+# The IRIX 6 linker writes into existing files which may not be
+# executable, retaining their permissions. Remove them first so a
+# subsequent execution test works.
+ac_rmfiles=
+for ac_file in $ac_files
+do
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;;
+ * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+ esac
+done
+rm -f $ac_rmfiles
+
+if { (ac_try="$ac_link_default"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link_default") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile. We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj )
+ ;;
+ [ab].out )
+ # We found the default executable, but exeext='' is most
+ # certainly right.
+ break;;
+ *.* )
+ if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+ then :; else
+ ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ fi
+ # We set ac_cv_exeext here because the later test for it is not
+ # safe: cross compilers may not add the suffix if given an `-o'
+ # argument, so we may need to know it at that point already.
+ # Even if this section looks crufty: it has the advantage of
+ # actually working.
+ break;;
+ * )
+ break;;
+ esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+ ac_file=''
+fi
+
+{ echo "$as_me:$LINENO: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6; }
+if test -z "$ac_file"; then
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: C compiler cannot create executables
+See \`config.log' for more details." >&5
+echo "$as_me: error: C compiler cannot create executables
+See \`config.log' for more details." >&2;}
+ { (exit 77); exit 77; }; }
+fi
+
+ac_exeext=$ac_cv_exeext
+
+# Check that the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+{ echo "$as_me:$LINENO: checking whether the C compiler works" >&5
+echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6; }
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+ if { ac_try='./$ac_file'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ cross_compiling=no
+ else
+ if test "$cross_compiling" = maybe; then
+ cross_compiling=yes
+ else
+ { { echo "$as_me:$LINENO: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ fi
+fi
+{ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+
+rm -f a.out a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+# Check that the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+{ echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6; }
+{ echo "$as_me:$LINENO: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6; }
+
+{ echo "$as_me:$LINENO: checking for suffix of executables" >&5
+echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6; }
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;;
+ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ break;;
+ * ) break;;
+ esac
+done
+else
+ { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest$ac_cv_exeext
+{ echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+{ echo "$as_me:$LINENO: checking for suffix of object files" >&5
+echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6; }
+if test "${ac_cv_objext+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ for ac_file in conftest.o conftest.obj conftest.*; do
+ test -f "$ac_file" || continue;
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf ) ;;
+ *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+ break;;
+ esac
+done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; }
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_compiler_gnu=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_compiler_gnu=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; }
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cc_g+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_save_c_werror_flag=$ac_c_werror_flag
+ ac_c_werror_flag=yes
+ ac_cv_prog_cc_g=no
+ CFLAGS="-g"
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_prog_cc_g=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ CFLAGS=""
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_c_werror_flag=$ac_save_c_werror_flag
+ CFLAGS="-g"
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_prog_cc_g=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+ CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+ if test "$GCC" = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-g"
+ fi
+else
+ if test "$GCC" = yes; then
+ CFLAGS="-O2"
+ else
+ CFLAGS=
+ fi
+fi
+{ echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5
+echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cc_c89+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+ char **p;
+ int i;
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
+ function prototypes and stuff, but not '\xHH' hex character constants.
+ These don't provoke an error unfortunately, instead are silently treated
+ as 'x'. The following induces an error, until -std is added to get
+ proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an
+ array size at least. It's necessary to write '\x00'==0 to get something
+ that's true only with -std. */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+ inside strings and character constants. */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
+ ;
+ return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+ CC="$ac_save_CC $ac_arg"
+ rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_prog_cc_c89=$ac_arg
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext
+ test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+ x)
+ { echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6; } ;;
+ xno)
+ { echo "$as_me:$LINENO: result: unsupported" >&5
+echo "${ECHO_T}unsupported" >&6; } ;;
+ *)
+ CC="$CC $ac_cv_prog_cc_c89"
+ { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+if test "$ac_cv_c_compiler_gnu" = "yes"; then
+# CFLAGS="$CFLAGS -funsigned-char"
+
+{ echo "$as_me:$LINENO: checking if gcc has a working -pipe" >&5
+echo $ECHO_N "checking if gcc has a working -pipe... $ECHO_C" >&6; }
+if test "${ac_cv_pipe+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ save_cflags="$CFLAGS"
+ CFLAGS="$CFLAGS -pipe"
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_pipe="yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_pipe="no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ CFLAGS="$save_cflags"
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_pipe" >&5
+echo "${ECHO_T}$ac_cv_pipe" >&6; }
+ if test "$ac_cv_pipe" = "yes"; then
+ CFLAGS="-pipe $CFLAGS"
+ fi
+fi
+
+
+# Extract the first word of "rm", so it can be a program name with args.
+set dummy rm; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_RM+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $RM in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_RM="$RM" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_path_RM="$as_dir/$ac_word$ac_exec_ext"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+RM=$ac_cv_path_RM
+if test -n "$RM"; then
+ { echo "$as_me:$LINENO: result: $RM" >&5
+echo "${ECHO_T}$RM" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+# Extract the first word of "cp", so it can be a program name with args.
+set dummy cp; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_CP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $CP in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_CP="$CP" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_path_CP="$as_dir/$ac_word$ac_exec_ext"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+CP=$ac_cv_path_CP
+if test -n "$CP"; then
+ { echo "$as_me:$LINENO: result: $CP" >&5
+echo "${ECHO_T}$CP" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+# Extract the first word of "touch", so it can be a program name with args.
+set dummy touch; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_TOUCH+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $TOUCH in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_TOUCH="$TOUCH" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_path_TOUCH="$as_dir/$ac_word$ac_exec_ext"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+TOUCH=$ac_cv_path_TOUCH
+if test -n "$TOUCH"; then
+ { echo "$as_me:$LINENO: result: $TOUCH" >&5
+echo "${ECHO_T}$TOUCH" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+# Extract the first word of "install", so it can be a program name with args.
+set dummy install; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_INSTALL+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $INSTALL in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_INSTALL="$INSTALL" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_path_INSTALL="$as_dir/$ac_word$ac_exec_ext"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+INSTALL=$ac_cv_path_INSTALL
+if test -n "$INSTALL"; then
+ { echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+{ echo "$as_me:$LINENO: checking for inet_ntoa in -lnsl" >&5
+echo $ECHO_N "checking for inet_ntoa in -lnsl... $ECHO_C" >&6; }
+if test "${ac_cv_lib_nsl_inet_ntoa+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lnsl $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char inet_ntoa ();
+int
+main ()
+{
+return inet_ntoa ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext &&
+ $as_test_x conftest$ac_exeext; then
+ ac_cv_lib_nsl_inet_ntoa=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_lib_nsl_inet_ntoa=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_nsl_inet_ntoa" >&5
+echo "${ECHO_T}$ac_cv_lib_nsl_inet_ntoa" >&6; }
+if test $ac_cv_lib_nsl_inet_ntoa = yes; then
+ ANOPELIBS="$ANOPELIBS-lnsl "
+fi
+
+{ echo "$as_me:$LINENO: checking for socket in -lsocket" >&5
+echo $ECHO_N "checking for socket in -lsocket... $ECHO_C" >&6; }
+if test "${ac_cv_lib_socket_socket+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsocket $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char socket ();
+int
+main ()
+{
+return socket ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext &&
+ $as_test_x conftest$ac_exeext; then
+ ac_cv_lib_socket_socket=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_lib_socket_socket=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_socket_socket" >&5
+echo "${ECHO_T}$ac_cv_lib_socket_socket" >&6; }
+if test $ac_cv_lib_socket_socket = yes; then
+ ANOPELIBS="$ANOPELIBS-lsocket "
+fi
+
+{ echo "$as_me:$LINENO: checking for res_query in -lresolv" >&5
+echo $ECHO_N "checking for res_query in -lresolv... $ECHO_C" >&6; }
+if test "${ac_cv_lib_resolv_res_query+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lresolv $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char res_query ();
+int
+main ()
+{
+return res_query ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext &&
+ $as_test_x conftest$ac_exeext; then
+ ac_cv_lib_resolv_res_query=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_lib_resolv_res_query=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_resolv_res_query" >&5
+echo "${ECHO_T}$ac_cv_lib_resolv_res_query" >&6; }
+if test $ac_cv_lib_resolv_res_query = yes; then
+ ANOPELIBS="$ANOPELIBS-lresolv "
+fi
+
+{ echo "$as_me:$LINENO: checking for revoke in -lbsd" >&5
+echo $ECHO_N "checking for revoke in -lbsd... $ECHO_C" >&6; }
+if test "${ac_cv_lib_bsd_revoke+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lbsd $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char revoke ();
+int
+main ()
+{
+return revoke ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext &&
+ $as_test_x conftest$ac_exeext; then
+ ac_cv_lib_bsd_revoke=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_lib_bsd_revoke=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_bsd_revoke" >&5
+echo "${ECHO_T}$ac_cv_lib_bsd_revoke" >&6; }
+if test $ac_cv_lib_bsd_revoke = yes; then
+ ANOPELIBS="$ANOPELIBS-lbsd "
+fi
+
+
+
+
+{ echo "$as_me:$LINENO: checking whether va_list assignments need array notation" >&5
+echo $ECHO_N "checking whether va_list assignments need array notation... $ECHO_C" >&6; }
+if test "${ac_cv_valistisarray+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_valistisarray=false
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdlib.h>
+ #include <stdarg.h>
+ void foo(int i, ...) {
+ va_list ap1, ap2;
+ va_start(ap1, i);
+ ap2 = ap1;
+ if (va_arg(ap2, int) != 123 || va_arg(ap1, int) != 123) { exit(1); }
+ va_end(ap1); va_end(ap2);
+ }
+ int main()
+ { foo(0, 123); return(0); }
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_valistisarray=false
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_valistisarray=true
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+fi
+
+
+if test "$ac_cv_valistisarray" = true ; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_VA_LIST_AS_ARRAY 1
+_ACEOF
+
+ { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+DIS_MYSQL=" MySQL: No"
+
+# Check whether --with-mysql was given.
+if test "${with_mysql+set}" = set; then
+ withval=$with_mysql;
+else
+
+
+# Check whether --with-mysqlconfig-path was given.
+if test "${with_mysqlconfig_path+set}" = set; then
+ withval=$with_mysqlconfig_path; mysql_config_path="$withval"
+else
+ mysql_config_path=""
+fi
+
+ MYSQLCONF=""
+ if test "$mysql_config_path" != ""; then
+ if test -x "$mysql_config_path"; then
+ MYSQLCONF="$mysql_config_path"
+ echo "checking for mysql_config... $MYSQLCONF" >&6
+ fi
+ fi
+ if test "$MYSQLCONF" = ""; then
+ # Extract the first word of "mysql_config", so it can be a program name with args.
+set dummy mysql_config; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_MYSQLCONF+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $MYSQLCONF in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_MYSQLCONF="$MYSQLCONF" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_path_MYSQLCONF="$as_dir/$ac_word$ac_exec_ext"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+IFS=$as_save_IFS
+
+ test -z "$ac_cv_path_MYSQLCONF" && ac_cv_path_MYSQLCONF=""""
+ ;;
+esac
+fi
+MYSQLCONF=$ac_cv_path_MYSQLCONF
+if test -n "$MYSQLCONF"; then
+ { echo "$as_me:$LINENO: result: $MYSQLCONF" >&5
+echo "${ECHO_T}$MYSQLCONF" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+ fi
+ if test "$MYSQLCONF" != ""; then
+ hold_cflags="$CFLAGS"
+ hold_ldflags="$LDFLAGS"
+ if test "$MYSQL_CFLAGS" = ""; then
+ MYSQL_CFLAGS="`$MYSQLCONF --cflags`"
+ fi
+ if test "$MYSQL_LDFLAGS" = ""; then
+ MYSQL_LDFLAGS="`$MYSQLCONF --libs`"
+ fi
+ CFLAGS="$CFLAGS $MYSQL_CFLAGS"
+ LDFLAGS="$LDFLAGS $MYSQL_LDFLAGS"
+ echo $ECHO_N "checking if mysql_config produces valid values... $ECHO_C" >&6
+ if test "$cross_compiling" = yes; then
+ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#include <mysql.h>
+
+int main()
+{
+ MYSQL *mysql = mysql_init(0);
+
+ return 0;
+}
+
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_mysql_valid=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_mysql_valid=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+ echo $ac_cv_mysql_valid >&6
+ if test "$ac_cv_mysql_valid" = "yes"; then
+
+cat >>confdefs.h <<_ACEOF
+#define USE_MYSQL 1
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define USE_RDB 1
+_ACEOF
+
+ MYSQL=" mysql.c "
+ RDB=" rdb.c "
+
+
+ DIS_MYSQL=" MySQL: Yes"
+ else
+ CFLAGS="$hold_cflags"
+ LDFLAGS="$hold_ldflags"
+ fi
+ fi
+
+fi
+
+
+{ echo "$as_me:$LINENO: checking whether this is a bit or little endian system" >&5
+echo $ECHO_N "checking whether this is a bit or little endian system... $ECHO_C" >&6; }
+if test "$cross_compiling" = yes; then
+ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int main()
+{
+ short s = 1;
+ short* ptr = &s;
+ unsigned char c = *((char*)ptr);
+ return c;
+}
+
+
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ cat >>confdefs.h <<\_ACEOF
+#define BIG_ENDIAN 1
+_ACEOF
+
+ { echo "$as_me:$LINENO: result: big" >&5
+echo "${ECHO_T}big" >&6; }
+
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+cat >>confdefs.h <<\_ACEOF
+#define LITTLE_ENDIAN 1
+_ACEOF
+
+ { echo "$as_me:$LINENO: result: little" >&5
+echo "${ECHO_T}little" >&6; }
+
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
+echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+ if test "${ac_cv_prog_CPP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ # Double quotes because CPP needs to be expanded
+ for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+ do
+ ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null && {
+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Broken: fails on valid input.
+continue
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null && {
+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ }; then
+ # Broken: success on invalid input.
+continue
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+ break
+fi
+
+ done
+ ac_cv_prog_CPP=$CPP
+
+fi
+ CPP=$ac_cv_prog_CPP
+else
+ ac_cv_prog_CPP=$CPP
+fi
+{ echo "$as_me:$LINENO: result: $CPP" >&5
+echo "${ECHO_T}$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null && {
+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Broken: fails on valid input.
+continue
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null && {
+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ }; then
+ # Broken: success on invalid input.
+continue
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+ :
+else
+ { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&5
+echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+{ echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5
+echo $ECHO_N "checking for grep that handles long lines and -e... $ECHO_C" >&6; }
+if test "${ac_cv_path_GREP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ # Extract the first word of "grep ggrep" to use in msg output
+if test -z "$GREP"; then
+set dummy grep ggrep; ac_prog_name=$2
+if test "${ac_cv_path_GREP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_path_GREP_found=false
+# Loop through the user's path and test for each of PROGNAME-LIST
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in grep ggrep; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+ { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
+ # Check for GNU ac_path_GREP and select it if it is found.
+ # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+ ac_count=0
+ echo $ECHO_N "0123456789$ECHO_C" >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ echo 'GREP' >> "conftest.nl"
+ "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ ac_count=`expr $ac_count + 1`
+ if test $ac_count -gt ${ac_path_GREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_GREP="$ac_path_GREP"
+ ac_path_GREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+
+ $ac_path_GREP_found && break 3
+ done
+done
+
+done
+IFS=$as_save_IFS
+
+
+fi
+
+GREP="$ac_cv_path_GREP"
+if test -z "$GREP"; then
+ { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
+echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+else
+ ac_cv_path_GREP=$GREP
+fi
+
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5
+echo "${ECHO_T}$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ echo "$as_me:$LINENO: checking for egrep" >&5
+echo $ECHO_N "checking for egrep... $ECHO_C" >&6; }
+if test "${ac_cv_path_EGREP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+ then ac_cv_path_EGREP="$GREP -E"
+ else
+ # Extract the first word of "egrep" to use in msg output
+if test -z "$EGREP"; then
+set dummy egrep; ac_prog_name=$2
+if test "${ac_cv_path_EGREP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_path_EGREP_found=false
+# Loop through the user's path and test for each of PROGNAME-LIST
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in egrep; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+ { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
+ # Check for GNU ac_path_EGREP and select it if it is found.
+ # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+ ac_count=0
+ echo $ECHO_N "0123456789$ECHO_C" >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ echo 'EGREP' >> "conftest.nl"
+ "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ ac_count=`expr $ac_count + 1`
+ if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_EGREP="$ac_path_EGREP"
+ ac_path_EGREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+
+ $ac_path_EGREP_found && break 3
+ done
+done
+
+done
+IFS=$as_save_IFS
+
+
+fi
+
+EGREP="$ac_cv_path_EGREP"
+if test -z "$EGREP"; then
+ { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
+echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+else
+ ac_cv_path_EGREP=$EGREP
+fi
+
+
+ fi
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5
+echo "${ECHO_T}$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+{ echo "$as_me:$LINENO: checking for ANSI C header files" >&5
+echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6; }
+if test "${ac_cv_header_stdc+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_header_stdc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_header_stdc=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+ # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "memchr" >/dev/null 2>&1; then
+ :
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "free" >/dev/null 2>&1; then
+ :
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+ if test "$cross_compiling" = yes; then
+ :
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+ (('a' <= (c) && (c) <= 'i') \
+ || ('j' <= (c) && (c) <= 'r') \
+ || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+ int i;
+ for (i = 0; i < 256; i++)
+ if (XOR (islower (i), ISLOWER (i))
+ || toupper (i) != TOUPPER (i))
+ return 2;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ :
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+fi
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
+echo "${ECHO_T}$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define STDC_HEADERS 1
+_ACEOF
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+
+
+
+
+
+
+
+
+
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+ inttypes.h stdint.h unistd.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ eval "$as_ac_Header=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_Header=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+if test "${ac_cv_header_sys_types_h+set}" = set; then
+ { echo "$as_me:$LINENO: checking for sys/types.h" >&5
+echo $ECHO_N "checking for sys/types.h... $ECHO_C" >&6; }
+if test "${ac_cv_header_sys_types_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_sys_types_h" >&5
+echo "${ECHO_T}$ac_cv_header_sys_types_h" >&6; }
+else
+ # Is the header compilable?
+{ echo "$as_me:$LINENO: checking sys/types.h usability" >&5
+echo $ECHO_N "checking sys/types.h usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <sys/types.h>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking sys/types.h presence" >&5
+echo $ECHO_N "checking sys/types.h presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null && {
+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ }; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: sys/types.h: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: sys/types.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: sys/types.h: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: sys/types.h: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: sys/types.h: present but cannot be compiled" >&5
+echo "$as_me: WARNING: sys/types.h: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: sys/types.h: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: sys/types.h: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: sys/types.h: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: sys/types.h: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: sys/types.h: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: sys/types.h: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: sys/types.h: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: sys/types.h: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: sys/types.h: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: sys/types.h: in the future, the compiler will take precedence" >&2;}
+
+ ;;
+esac
+{ echo "$as_me:$LINENO: checking for sys/types.h" >&5
+echo $ECHO_N "checking for sys/types.h... $ECHO_C" >&6; }
+if test "${ac_cv_header_sys_types_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_header_sys_types_h=$ac_header_preproc
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_sys_types_h" >&5
+echo "${ECHO_T}$ac_cv_header_sys_types_h" >&6; }
+
+fi
+if test $ac_cv_header_sys_types_h = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAS_SYS_TYPES_H 1
+_ACEOF
+
+fi
+
+
+
+DIS_MODULES="Modules: Yes"
+
+
+
+
+{ echo "$as_me:$LINENO: checking for dlopen" >&5
+echo $ECHO_N "checking for dlopen... $ECHO_C" >&6; }
+if test "${ac_cv_func_dlopen+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define dlopen to an innocuous variant, in case <limits.h> declares dlopen.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define dlopen innocuous_dlopen
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char dlopen (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef dlopen
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined __stub_dlopen || defined __stub___dlopen
+choke me
+#endif
+
+int
+main ()
+{
+return dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext &&
+ $as_test_x conftest$ac_exeext; then
+ ac_cv_func_dlopen=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_func_dlopen=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5
+echo "${ECHO_T}$ac_cv_func_dlopen" >&6; }
+if test $ac_cv_func_dlopen = yes; then
+ :
+else
+ { echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5
+echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6; }
+if test "${ac_cv_lib_dl_dlopen+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext &&
+ $as_test_x conftest$ac_exeext; then
+ ac_cv_lib_dl_dlopen=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_lib_dl_dlopen=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5
+echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6; }
+if test $ac_cv_lib_dl_dlopen = yes; then
+
+ ANOPELIBS="$ANOPELIBS -ldl"
+
+cat >>confdefs.h <<\_ACEOF
+#define USE_MODULES 1
+_ACEOF
+
+ USE_MODULES="yes"
+ DIS_MODULES="Modules: Yes"
+
+else
+
+{ echo "$as_me:$LINENO: WARNING: Dynamic linking is not enabled because dlopen was not found" >&5
+echo "$as_me: WARNING: Dynamic linking is not enabled because dlopen was not found" >&2;}
+
+cat >>confdefs.h <<\_ACEOF
+#define STATIC_LINKING "NO_MODULES"
+_ACEOF
+
+ DIS_MODULES="Modules: No"
+
+fi
+
+fi
+
+
+hold_cflags=$CFLAGS
+CFLAGS="$CFLAGS -export-dynamic"
+{ echo "$as_me:$LINENO: checking if we need the -export-dynamic flag" >&5
+echo $ECHO_N "checking if we need the -export-dynamic flag... $ECHO_C" >&6; }
+if test "${ac_cv_export_dynamic+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+int i;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext &&
+ $as_test_x conftest$ac_exeext; then
+ ac_cv_export_dynamic=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_export_dynamic=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_export_dynamic" >&5
+echo "${ECHO_T}$ac_cv_export_dynamic" >&6; }
+if test "$ac_cv_export_dynamic" = "no"; then
+CFLAGS=$hold_cflags
+fi
+
+{ echo "$as_me:$LINENO: checking for compiler option to produce PIC" >&5
+echo $ECHO_N "checking for compiler option to produce PIC... $ECHO_C" >&6; }
+if test "${ac_cv_pic+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+if test "$ac_cv_c_compiler_gnu" = "yes"; then
+ ac_cv_pic="-fPIC -DPIC -shared"
+ case `uname -s` in
+ Darwin*)
+ ac_cv_pic="-bundle -flat_namespace -undefined suppress"
+ ;;
+ HP-UX*)
+ ac_cv_pic="-fPIC"
+ ;;
+ esac
+else
+case `uname -s` in
+ SunOS*)
+ ac_cv_pic="-KPIC -DPIC -G"
+ ;;
+esac
+
+fi
+
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_pic" >&5
+echo "${ECHO_T}$ac_cv_pic" >&6; }
+
+if test "$ac_cv_c_compiler_gnu" = "yes"; then
+ case `uname -s` in
+ Darwin*)
+ SHARED="-bundle -flat_namespace -undefined suppress"
+
+ ;;
+ *)
+ SHARED="-shared"
+
+ ;;
+ esac
+fi
+
+{ echo "$as_me:$LINENO: checking if your system prepends an underscore on symbols" >&5
+echo $ECHO_N "checking if your system prepends an underscore on symbols... $ECHO_C" >&6; }
+if test "${ac_cv_underscore+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >uscore.c << __EOF__
+int main() {
+return 0;
+}
+__EOF__
+$CC -o uscore $CFLAGS uscore.c 1>&5
+if test -z "`strings -a uscore |grep '^_main$'`"; then
+ ac_cv_underscore=no
+else
+ ac_cv_underscore=yes
+fi
+
+rm -f uscore uscore.c
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_underscore" >&5
+echo "${ECHO_T}$ac_cv_underscore" >&6; }
+if test "$ac_cv_underscore" = "yes"; then
+
+cat >>confdefs.h <<\_ACEOF
+#define DL_PREFIX "_"
+_ACEOF
+
+else
+
+cat >>confdefs.h <<\_ACEOF
+#define DL_PREFIX ""
+_ACEOF
+
+fi
+
+MODULEFLAGS=$ac_cv_pic
+
+
+cat >>confdefs.h <<\_ACEOF
+#define USE_MODULES 1
+_ACEOF
+
+
+{ echo "$as_me:$LINENO: checking for short" >&5
+echo $ECHO_N "checking for short... $ECHO_C" >&6; }
+if test "${ac_cv_type_short+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+typedef short ac__type_new_;
+int
+main ()
+{
+if ((ac__type_new_ *) 0)
+ return 0;
+if (sizeof (ac__type_new_))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_type_short=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_type_short=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_short" >&5
+echo "${ECHO_T}$ac_cv_type_short" >&6; }
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ echo "$as_me:$LINENO: checking size of short" >&5
+echo $ECHO_N "checking size of short... $ECHO_C" >&6; }
+if test "${ac_cv_sizeof_short+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then
+ # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+ typedef short ac__type_sizeof_;
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_lo=0 ac_mid=0
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+ typedef short ac__type_sizeof_;
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_hi=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_lo=`expr $ac_mid + 1`
+ if test $ac_lo -le $ac_mid; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+ typedef short ac__type_sizeof_;
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_hi=-1 ac_mid=-1
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+ typedef short ac__type_sizeof_;
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_lo=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_hi=`expr '(' $ac_mid ')' - 1`
+ if test $ac_mid -le $ac_hi; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid`
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_lo= ac_hi=
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+ ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+ typedef short ac__type_sizeof_;
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_hi=$ac_mid
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_short=$ac_lo;;
+'') if test "$ac_cv_type_short" = yes; then
+ { { echo "$as_me:$LINENO: error: cannot compute sizeof (short)
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (short)
+See \`config.log' for more details." >&2;}
+ { (exit 77); exit 77; }; }
+ else
+ ac_cv_sizeof_short=0
+ fi ;;
+esac
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+ typedef short ac__type_sizeof_;
+static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); }
+static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+ FILE *f = fopen ("conftest.val", "w");
+ if (! f)
+ return 1;
+ if (((long int) (sizeof (ac__type_sizeof_))) < 0)
+ {
+ long int i = longval ();
+ if (i != ((long int) (sizeof (ac__type_sizeof_))))
+ return 1;
+ fprintf (f, "%ld\n", i);
+ }
+ else
+ {
+ unsigned long int i = ulongval ();
+ if (i != ((long int) (sizeof (ac__type_sizeof_))))
+ return 1;
+ fprintf (f, "%lu\n", i);
+ }
+ return ferror (f) || fclose (f) != 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_sizeof_short=`cat conftest.val`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+if test "$ac_cv_type_short" = yes; then
+ { { echo "$as_me:$LINENO: error: cannot compute sizeof (short)
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (short)
+See \`config.log' for more details." >&2;}
+ { (exit 77); exit 77; }; }
+ else
+ ac_cv_sizeof_short=0
+ fi
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.val
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_short" >&5
+echo "${ECHO_T}$ac_cv_sizeof_short" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_SHORT $ac_cv_sizeof_short
+_ACEOF
+
+
+{ echo "$as_me:$LINENO: checking for int" >&5
+echo $ECHO_N "checking for int... $ECHO_C" >&6; }
+if test "${ac_cv_type_int+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+typedef int ac__type_new_;
+int
+main ()
+{
+if ((ac__type_new_ *) 0)
+ return 0;
+if (sizeof (ac__type_new_))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_type_int=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_type_int=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_int" >&5
+echo "${ECHO_T}$ac_cv_type_int" >&6; }
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ echo "$as_me:$LINENO: checking size of int" >&5
+echo $ECHO_N "checking size of int... $ECHO_C" >&6; }
+if test "${ac_cv_sizeof_int+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then
+ # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+ typedef int ac__type_sizeof_;
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_lo=0 ac_mid=0
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+ typedef int ac__type_sizeof_;
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_hi=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_lo=`expr $ac_mid + 1`
+ if test $ac_lo -le $ac_mid; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+ typedef int ac__type_sizeof_;
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_hi=-1 ac_mid=-1
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+ typedef int ac__type_sizeof_;
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_lo=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_hi=`expr '(' $ac_mid ')' - 1`
+ if test $ac_mid -le $ac_hi; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid`
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_lo= ac_hi=
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+ ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+ typedef int ac__type_sizeof_;
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_hi=$ac_mid
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_int=$ac_lo;;
+'') if test "$ac_cv_type_int" = yes; then
+ { { echo "$as_me:$LINENO: error: cannot compute sizeof (int)
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (int)
+See \`config.log' for more details." >&2;}
+ { (exit 77); exit 77; }; }
+ else
+ ac_cv_sizeof_int=0
+ fi ;;
+esac
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+ typedef int ac__type_sizeof_;
+static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); }
+static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+ FILE *f = fopen ("conftest.val", "w");
+ if (! f)
+ return 1;
+ if (((long int) (sizeof (ac__type_sizeof_))) < 0)
+ {
+ long int i = longval ();
+ if (i != ((long int) (sizeof (ac__type_sizeof_))))
+ return 1;
+ fprintf (f, "%ld\n", i);
+ }
+ else
+ {
+ unsigned long int i = ulongval ();
+ if (i != ((long int) (sizeof (ac__type_sizeof_))))
+ return 1;
+ fprintf (f, "%lu\n", i);
+ }
+ return ferror (f) || fclose (f) != 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_sizeof_int=`cat conftest.val`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+if test "$ac_cv_type_int" = yes; then
+ { { echo "$as_me:$LINENO: error: cannot compute sizeof (int)
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (int)
+See \`config.log' for more details." >&2;}
+ { (exit 77); exit 77; }; }
+ else
+ ac_cv_sizeof_int=0
+ fi
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.val
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_int" >&5
+echo "${ECHO_T}$ac_cv_sizeof_int" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_INT $ac_cv_sizeof_int
+_ACEOF
+
+
+{ echo "$as_me:$LINENO: checking for long" >&5
+echo $ECHO_N "checking for long... $ECHO_C" >&6; }
+if test "${ac_cv_type_long+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+typedef long ac__type_new_;
+int
+main ()
+{
+if ((ac__type_new_ *) 0)
+ return 0;
+if (sizeof (ac__type_new_))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_type_long=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_type_long=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_long" >&5
+echo "${ECHO_T}$ac_cv_type_long" >&6; }
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ echo "$as_me:$LINENO: checking size of long" >&5
+echo $ECHO_N "checking size of long... $ECHO_C" >&6; }
+if test "${ac_cv_sizeof_long+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then
+ # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+ typedef long ac__type_sizeof_;
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_lo=0 ac_mid=0
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+ typedef long ac__type_sizeof_;
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_hi=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_lo=`expr $ac_mid + 1`
+ if test $ac_lo -le $ac_mid; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+ typedef long ac__type_sizeof_;
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_hi=-1 ac_mid=-1
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+ typedef long ac__type_sizeof_;
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_lo=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_hi=`expr '(' $ac_mid ')' - 1`
+ if test $ac_mid -le $ac_hi; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid`
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_lo= ac_hi=
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+ ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+ typedef long ac__type_sizeof_;
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_hi=$ac_mid
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_long=$ac_lo;;
+'') if test "$ac_cv_type_long" = yes; then
+ { { echo "$as_me:$LINENO: error: cannot compute sizeof (long)
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (long)
+See \`config.log' for more details." >&2;}
+ { (exit 77); exit 77; }; }
+ else
+ ac_cv_sizeof_long=0
+ fi ;;
+esac
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+ typedef long ac__type_sizeof_;
+static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); }
+static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+ FILE *f = fopen ("conftest.val", "w");
+ if (! f)
+ return 1;
+ if (((long int) (sizeof (ac__type_sizeof_))) < 0)
+ {
+ long int i = longval ();
+ if (i != ((long int) (sizeof (ac__type_sizeof_))))
+ return 1;
+ fprintf (f, "%ld\n", i);
+ }
+ else
+ {
+ unsigned long int i = ulongval ();
+ if (i != ((long int) (sizeof (ac__type_sizeof_))))
+ return 1;
+ fprintf (f, "%lu\n", i);
+ }
+ return ferror (f) || fclose (f) != 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_sizeof_long=`cat conftest.val`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+if test "$ac_cv_type_long" = yes; then
+ { { echo "$as_me:$LINENO: error: cannot compute sizeof (long)
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (long)
+See \`config.log' for more details." >&2;}
+ { (exit 77); exit 77; }; }
+ else
+ ac_cv_sizeof_long=0
+ fi
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.val
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_long" >&5
+echo "${ECHO_T}$ac_cv_sizeof_long" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_LONG $ac_cv_sizeof_long
+_ACEOF
+
+
+if test "$ac_cv_sizeof_int" = 2 ; then
+ { echo "$as_me:$LINENO: checking for int16_t" >&5
+echo $ECHO_N "checking for int16_t... $ECHO_C" >&6; }
+if test "${ac_cv_type_int16_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+typedef int16_t ac__type_new_;
+int
+main ()
+{
+if ((ac__type_new_ *) 0)
+ return 0;
+if (sizeof (ac__type_new_))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_type_int16_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_type_int16_t=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_int16_t" >&5
+echo "${ECHO_T}$ac_cv_type_int16_t" >&6; }
+if test $ac_cv_type_int16_t = yes; then
+ :
+else
+
+cat >>confdefs.h <<_ACEOF
+#define int16_t int
+_ACEOF
+
+fi
+
+ { echo "$as_me:$LINENO: checking for u_int16_t" >&5
+echo $ECHO_N "checking for u_int16_t... $ECHO_C" >&6; }
+if test "${ac_cv_type_u_int16_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+typedef u_int16_t ac__type_new_;
+int
+main ()
+{
+if ((ac__type_new_ *) 0)
+ return 0;
+if (sizeof (ac__type_new_))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_type_u_int16_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_type_u_int16_t=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_u_int16_t" >&5
+echo "${ECHO_T}$ac_cv_type_u_int16_t" >&6; }
+if test $ac_cv_type_u_int16_t = yes; then
+ :
+else
+
+cat >>confdefs.h <<_ACEOF
+#define u_int16_t unsigned int
+_ACEOF
+
+fi
+
+elif test "$ac_cv_sizeof_short" = 2 ; then
+ { echo "$as_me:$LINENO: checking for int16_t" >&5
+echo $ECHO_N "checking for int16_t... $ECHO_C" >&6; }
+if test "${ac_cv_type_int16_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+typedef int16_t ac__type_new_;
+int
+main ()
+{
+if ((ac__type_new_ *) 0)
+ return 0;
+if (sizeof (ac__type_new_))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_type_int16_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_type_int16_t=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_int16_t" >&5
+echo "${ECHO_T}$ac_cv_type_int16_t" >&6; }
+if test $ac_cv_type_int16_t = yes; then
+ :
+else
+
+cat >>confdefs.h <<_ACEOF
+#define int16_t short
+_ACEOF
+
+fi
+
+ { echo "$as_me:$LINENO: checking for u_int16_t" >&5
+echo $ECHO_N "checking for u_int16_t... $ECHO_C" >&6; }
+if test "${ac_cv_type_u_int16_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+typedef u_int16_t ac__type_new_;
+int
+main ()
+{
+if ((ac__type_new_ *) 0)
+ return 0;
+if (sizeof (ac__type_new_))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_type_u_int16_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_type_u_int16_t=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_u_int16_t" >&5
+echo "${ECHO_T}$ac_cv_type_u_int16_t" >&6; }
+if test $ac_cv_type_u_int16_t = yes; then
+ :
+else
+
+cat >>confdefs.h <<_ACEOF
+#define u_int16_t unsigned short
+_ACEOF
+
+fi
+
+else
+ { { echo "$as_me:$LINENO: error: Cannot find a type with size of 16 bits" >&5
+echo "$as_me: error: Cannot find a type with size of 16 bits" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test "$ac_cv_sizeof_int" = 4 ; then
+ { echo "$as_me:$LINENO: checking for int32_t" >&5
+echo $ECHO_N "checking for int32_t... $ECHO_C" >&6; }
+if test "${ac_cv_type_int32_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+typedef int32_t ac__type_new_;
+int
+main ()
+{
+if ((ac__type_new_ *) 0)
+ return 0;
+if (sizeof (ac__type_new_))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_type_int32_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_type_int32_t=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_int32_t" >&5
+echo "${ECHO_T}$ac_cv_type_int32_t" >&6; }
+if test $ac_cv_type_int32_t = yes; then
+ :
+else
+
+cat >>confdefs.h <<_ACEOF
+#define int32_t int
+_ACEOF
+
+fi
+
+ { echo "$as_me:$LINENO: checking for u_int32_t" >&5
+echo $ECHO_N "checking for u_int32_t... $ECHO_C" >&6; }
+if test "${ac_cv_type_u_int32_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+typedef u_int32_t ac__type_new_;
+int
+main ()
+{
+if ((ac__type_new_ *) 0)
+ return 0;
+if (sizeof (ac__type_new_))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_type_u_int32_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_type_u_int32_t=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_u_int32_t" >&5
+echo "${ECHO_T}$ac_cv_type_u_int32_t" >&6; }
+if test $ac_cv_type_u_int32_t = yes; then
+ :
+else
+
+cat >>confdefs.h <<_ACEOF
+#define u_int32_t unsigned int
+_ACEOF
+
+fi
+
+elif test "$ac_cv_sizeof_short" = 4 ; then
+ { echo "$as_me:$LINENO: checking for int32_t" >&5
+echo $ECHO_N "checking for int32_t... $ECHO_C" >&6; }
+if test "${ac_cv_type_int32_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+typedef int32_t ac__type_new_;
+int
+main ()
+{
+if ((ac__type_new_ *) 0)
+ return 0;
+if (sizeof (ac__type_new_))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_type_int32_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_type_int32_t=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_int32_t" >&5
+echo "${ECHO_T}$ac_cv_type_int32_t" >&6; }
+if test $ac_cv_type_int32_t = yes; then
+ :
+else
+
+cat >>confdefs.h <<_ACEOF
+#define int32_t short
+_ACEOF
+
+fi
+
+ { echo "$as_me:$LINENO: checking for u_int32_t" >&5
+echo $ECHO_N "checking for u_int32_t... $ECHO_C" >&6; }
+if test "${ac_cv_type_u_int32_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+typedef u_int32_t ac__type_new_;
+int
+main ()
+{
+if ((ac__type_new_ *) 0)
+ return 0;
+if (sizeof (ac__type_new_))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_type_u_int32_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_type_u_int32_t=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_u_int32_t" >&5
+echo "${ECHO_T}$ac_cv_type_u_int32_t" >&6; }
+if test $ac_cv_type_u_int32_t = yes; then
+ :
+else
+
+cat >>confdefs.h <<_ACEOF
+#define u_int32_t unsigned short
+_ACEOF
+
+fi
+
+elif test "$ac_cv_sizeof_long" = 4 ; then
+ { echo "$as_me:$LINENO: checking for int32_t" >&5
+echo $ECHO_N "checking for int32_t... $ECHO_C" >&6; }
+if test "${ac_cv_type_int32_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+typedef int32_t ac__type_new_;
+int
+main ()
+{
+if ((ac__type_new_ *) 0)
+ return 0;
+if (sizeof (ac__type_new_))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_type_int32_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_type_int32_t=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_int32_t" >&5
+echo "${ECHO_T}$ac_cv_type_int32_t" >&6; }
+if test $ac_cv_type_int32_t = yes; then
+ :
+else
+
+cat >>confdefs.h <<_ACEOF
+#define int32_t long
+_ACEOF
+
+fi
+
+ { echo "$as_me:$LINENO: checking for u_int32_t" >&5
+echo $ECHO_N "checking for u_int32_t... $ECHO_C" >&6; }
+if test "${ac_cv_type_u_int32_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+typedef u_int32_t ac__type_new_;
+int
+main ()
+{
+if ((ac__type_new_ *) 0)
+ return 0;
+if (sizeof (ac__type_new_))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_type_u_int32_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_cv_type_u_int32_t=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_u_int32_t" >&5
+echo "${ECHO_T}$ac_cv_type_u_int32_t" >&6; }
+if test $ac_cv_type_u_int32_t = yes; then
+ :
+else
+
+cat >>confdefs.h <<_ACEOF
+#define u_int32_t unsigned long
+_ACEOF
+
+fi
+
+else
+ { { echo "$as_me:$LINENO: error: Cannot find a type with size of 32 bits" >&5
+echo "$as_me: error: Cannot find a type with size of 32 bits" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+
+if test "${ac_cv_header_strings_h+set}" = set; then
+ { echo "$as_me:$LINENO: checking for strings.h" >&5
+echo $ECHO_N "checking for strings.h... $ECHO_C" >&6; }
+if test "${ac_cv_header_strings_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_strings_h" >&5
+echo "${ECHO_T}$ac_cv_header_strings_h" >&6; }
+else
+ # Is the header compilable?
+{ echo "$as_me:$LINENO: checking strings.h usability" >&5
+echo $ECHO_N "checking strings.h usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <strings.h>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking strings.h presence" >&5
+echo $ECHO_N "checking strings.h presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <strings.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null && {
+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ }; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: strings.h: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: strings.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: strings.h: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: strings.h: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: strings.h: present but cannot be compiled" >&5
+echo "$as_me: WARNING: strings.h: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: strings.h: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: strings.h: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: strings.h: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: strings.h: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: strings.h: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: strings.h: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: strings.h: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: strings.h: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: strings.h: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: strings.h: in the future, the compiler will take precedence" >&2;}
+
+ ;;
+esac
+{ echo "$as_me:$LINENO: checking for strings.h" >&5
+echo $ECHO_N "checking for strings.h... $ECHO_C" >&6; }
+if test "${ac_cv_header_strings_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_header_strings_h=$ac_header_preproc
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_strings_h" >&5
+echo "${ECHO_T}$ac_cv_header_strings_h" >&6; }
+
+fi
+if test $ac_cv_header_strings_h = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_STRINGS_H 1
+_ACEOF
+
+fi
+
+
+if test "${ac_cv_header_sys_select_h+set}" = set; then
+ { echo "$as_me:$LINENO: checking for sys/select.h" >&5
+echo $ECHO_N "checking for sys/select.h... $ECHO_C" >&6; }
+if test "${ac_cv_header_sys_select_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_sys_select_h" >&5
+echo "${ECHO_T}$ac_cv_header_sys_select_h" >&6; }
+else
+ # Is the header compilable?
+{ echo "$as_me:$LINENO: checking sys/select.h usability" >&5
+echo $ECHO_N "checking sys/select.h usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <sys/select.h>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking sys/select.h presence" >&5
+echo $ECHO_N "checking sys/select.h presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/select.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null && {
+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ }; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: sys/select.h: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: sys/select.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: sys/select.h: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: sys/select.h: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: sys/select.h: present but cannot be compiled" >&5
+echo "$as_me: WARNING: sys/select.h: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: sys/select.h: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: sys/select.h: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: sys/select.h: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: sys/select.h: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: sys/select.h: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: sys/select.h: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: sys/select.h: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: sys/select.h: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: sys/select.h: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: sys/select.h: in the future, the compiler will take precedence" >&2;}
+
+ ;;
+esac
+{ echo "$as_me:$LINENO: checking for sys/select.h" >&5
+echo $ECHO_N "checking for sys/select.h... $ECHO_C" >&6; }
+if test "${ac_cv_header_sys_select_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_header_sys_select_h=$ac_header_preproc
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_sys_select_h" >&5
+echo "${ECHO_T}$ac_cv_header_sys_select_h" >&6; }
+
+fi
+if test $ac_cv_header_sys_select_h = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_SYS_SELECT_H 1
+_ACEOF
+
+fi
+
+
+if test "${ac_cv_header_execinfo_h+set}" = set; then
+ { echo "$as_me:$LINENO: checking for execinfo.h" >&5
+echo $ECHO_N "checking for execinfo.h... $ECHO_C" >&6; }
+if test "${ac_cv_header_execinfo_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_execinfo_h" >&5
+echo "${ECHO_T}$ac_cv_header_execinfo_h" >&6; }
+else
+ # Is the header compilable?
+{ echo "$as_me:$LINENO: checking execinfo.h usability" >&5
+echo $ECHO_N "checking execinfo.h usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <execinfo.h>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking execinfo.h presence" >&5
+echo $ECHO_N "checking execinfo.h presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <execinfo.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null && {
+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ }; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: execinfo.h: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: execinfo.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: execinfo.h: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: execinfo.h: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: execinfo.h: present but cannot be compiled" >&5
+echo "$as_me: WARNING: execinfo.h: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: execinfo.h: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: execinfo.h: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: execinfo.h: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: execinfo.h: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: execinfo.h: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: execinfo.h: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: execinfo.h: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: execinfo.h: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: execinfo.h: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: execinfo.h: in the future, the compiler will take precedence" >&2;}
+
+ ;;
+esac
+{ echo "$as_me:$LINENO: checking for execinfo.h" >&5
+echo $ECHO_N "checking for execinfo.h... $ECHO_C" >&6; }
+if test "${ac_cv_header_execinfo_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_header_execinfo_h=$ac_header_preproc
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_execinfo_h" >&5
+echo "${ECHO_T}$ac_cv_header_execinfo_h" >&6; }
+
+fi
+if test $ac_cv_header_execinfo_h = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_BACKTRACE 1
+_ACEOF
+
+fi
+
+
+
+
+for ac_func in strerror
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined __stub_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext &&
+ $as_test_x conftest$ac_exeext; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+ cat >>confdefs.h <<\_ACEOF
+#define HAVE_STRERROR 1
+_ACEOF
+
+fi
+done
+
+
+for ac_func in sys_errlist
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined __stub_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext &&
+ $as_test_x conftest$ac_exeext; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+ cat >>confdefs.h <<\_ACEOF
+#define HAVE_SYS_ERRLIST 1
+_ACEOF
+
+fi
+done
+
+
+for ac_func in snprintf
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined __stub_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext &&
+ $as_test_x conftest$ac_exeext; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+ cat >>confdefs.h <<\_ACEOF
+#define HAVE_SNPRINTF 1
+_ACEOF
+
+fi
+done
+
+
+for ac_func in stricmp
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined __stub_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext &&
+ $as_test_x conftest$ac_exeext; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+ cat >>confdefs.h <<\_ACEOF
+#define HAVE_STRICMP 1
+_ACEOF
+
+fi
+done
+
+
+for ac_func in strcasecmp
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined __stub_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext &&
+ $as_test_x conftest$ac_exeext; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+ cat >>confdefs.h <<\_ACEOF
+#define HAVE_STRCASECMP 1
+_ACEOF
+
+fi
+done
+
+
+for ac_func in strdup
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined __stub_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext &&
+ $as_test_x conftest$ac_exeext; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+ cat >>confdefs.h <<\_ACEOF
+#define HAVE_STRDUP 1
+_ACEOF
+
+fi
+done
+
+
+for ac_func in strspn
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined __stub_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext &&
+ $as_test_x conftest$ac_exeext; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+ cat >>confdefs.h <<\_ACEOF
+#define HAVE_STRSPN 1
+_ACEOF
+
+fi
+done
+
+
+for ac_func in strsignal
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined __stub_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext &&
+ $as_test_x conftest$ac_exeext; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+ cat >>confdefs.h <<\_ACEOF
+#define HAVE_STRSIGNAL 1
+_ACEOF
+
+fi
+done
+
+
+for ac_func in gettimeofday
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined __stub_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext &&
+ $as_test_x conftest$ac_exeext; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+ cat >>confdefs.h <<\_ACEOF
+#define HAVE_GETTIMEOFDAY 1
+_ACEOF
+
+fi
+done
+
+
+for ac_func in setgrent
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined __stub_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext &&
+ $as_test_x conftest$ac_exeext; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+ cat >>confdefs.h <<\_ACEOF
+#define HAVE_SETGRENT 1
+_ACEOF
+
+fi
+done
+
+
+for ac_func in umask
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined __stub_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext &&
+ $as_test_x conftest$ac_exeext; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+ cat >>confdefs.h <<\_ACEOF
+#define HAVE_UMASK 1
+_ACEOF
+
+fi
+done
+
+
+for ac_func in fork
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined __stub_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext &&
+ $as_test_x conftest$ac_exeext; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+ cat >>confdefs.h <<\_ACEOF
+#define HAVE_FORK 1
+_ACEOF
+
+fi
+done
+
+
+for ac_func in gethostbyname
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined __stub_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext &&
+ $as_test_x conftest$ac_exeext; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+ cat >>confdefs.h <<\_ACEOF
+#define HAVE_GETHOSTBYNAME 1
+_ACEOF
+
+fi
+done
+
+
+for ac_func in gethostbyname_r
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined __stub_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext &&
+ $as_test_x conftest$ac_exeext; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+ cat >>confdefs.h <<\_ACEOF
+#define HAVE_GETHOSTBYNAME_R 1
+_ACEOF
+
+fi
+done
+
+
+for ac_func in strlcpy
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined __stub_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext &&
+ $as_test_x conftest$ac_exeext; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+ cat >>confdefs.h <<\_ACEOF
+#define HAVE_STRLCPY 1
+_ACEOF
+
+fi
+done
+
+
+for ac_func in strlcat
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined __stub_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext &&
+ $as_test_x conftest$ac_exeext; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+ cat >>confdefs.h <<\_ACEOF
+#define HAVE_STRLCAT 1
+_ACEOF
+
+fi
+done
+
+
+
+# Check whether --with-rungroup was given.
+if test "${with_rungroup+set}" = set; then
+ withval=$with_rungroup;
+
+cat >>confdefs.h <<_ACEOF
+#define RUNGROUP "$withval"
+_ACEOF
+
+ RUNGROUP=$withval
+
+fi
+
+
+
+
+
+# Check whether --with-permissions was given.
+if test "${with_permissions+set}" = set; then
+ withval=$with_permissions;
+cat >>confdefs.h <<_ACEOF
+#define DEFUMASK $withval
+_ACEOF
+
+else
+
+cat >>confdefs.h <<\_ACEOF
+#define DEFUMASK 007
+_ACEOF
+
+fi
+
+
+
+# Check whether --with-bindir was given.
+if test "${with_bindir+set}" = set; then
+ withval=$with_bindir;
+
+cat >>confdefs.h <<_ACEOF
+#define SERVICES_BIN "${withval}/services"
+_ACEOF
+
+ BINDEST=$withval
+ DATDEST=$withval
+ MODULE_PATH=${withval}/modules/
+
+fi
+
+
+
+
+
+# Check whether --with-datadir was given.
+if test "${with_datadir+set}" = set; then
+ withval=$with_datadir;
+
+cat >>confdefs.h <<_ACEOF
+#define SERVICES_DIR "$withval"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define MODULE_PATH "${withval}/modules/"
+_ACEOF
+
+ DATDEST=$withval
+ MODULE_PATH=${withval}/modules/
+
+fi
+
+
+
+
+
+ac_config_files="$ac_config_files Makefile src/bin/anoperc"
+
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems. If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+ for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
+echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ *) $as_unset $ac_var ;;
+ esac ;;
+ esac
+ done
+
+ (set) 2>&1 |
+ case $as_nl`(ac_space=' '; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ # `set' does not quote correctly, so add quotes (double-quote
+ # substitution turns \\\\ into \\, and sed turns \\ into \).
+ sed -n \
+ "s/'/'\\\\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+ ;; #(
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+) |
+ sed '
+ /^ac_cv_env_/b end
+ t clear
+ :clear
+ s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+ t end
+ s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+ :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+ if test -w "$cache_file"; then
+ test "x$cache_file" != "x/dev/null" &&
+ { echo "$as_me:$LINENO: updating cache $cache_file" >&5
+echo "$as_me: updating cache $cache_file" >&6;}
+ cat confcache >$cache_file
+ else
+ { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5
+echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+ fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+ # 1. Remove the extension, and $U if already installed.
+ ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+ ac_i=`echo "$ac_i" | sed "$ac_script"`
+ # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR
+ # will be set to the directory where LIBOBJS objects are built.
+ ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+ ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+
+: ${CONFIG_STATUS=./config.status}
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+## --------------------- ##
+## M4sh Initialization. ##
+## --------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in
+ *posix*) set -o posix ;;
+esac
+
+fi
+
+
+
+
+# PATH needs CR
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ as_unset=unset
+else
+ as_unset=false
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+as_nl='
+'
+IFS=" "" $as_nl"
+
+# Find who we are. Look in the path if we contain no directory separator.
+case $0 in
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ { (exit 1); exit 1; }
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+ LC_TELEPHONE LC_TIME
+do
+ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+ eval $as_var=C; export $as_var
+ else
+ ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+ fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# CDPATH.
+$as_unset CDPATH
+
+
+
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
+
+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+ # uniformly replaced by the line number. The first 'sed' inserts a
+ # line-number line after each line using $LINENO; the second 'sed'
+ # does the real work. The second script uses 'N' to pair each
+ # line-number line with the line containing $LINENO, and appends
+ # trailing '-' during substitution so that $LINENO is not a special
+ # case at line end.
+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+ # scripts with optimization help from Paolo Bonzini. Blame Lee
+ # E. McMahon (1931-1989) for sed's syntax. :-)
+ sed -n '
+ p
+ /[$]LINENO/=
+ ' <$as_myself |
+ sed '
+ s/[$]LINENO.*/&-/
+ t lineno
+ b
+ :lineno
+ N
+ :loop
+ s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+ t loop
+ s/-\n.*//
+ ' >$as_me.lineno &&
+ chmod +x "$as_me.lineno" ||
+ { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+ { (exit 1); exit 1; }; }
+
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensitive to this).
+ . "./$as_me.lineno"
+ # Exit status is that of the last command.
+ exit
+}
+
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+ case `echo 'x\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ *) ECHO_C='\c';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir
+fi
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -p'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -p'
+elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+else
+ as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p=:
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+ as_test_x='test -x'
+else
+ if ls -dL / >/dev/null 2>&1; then
+ as_ls_L_option=L
+ else
+ as_ls_L_option=
+ fi
+ as_test_x='
+ eval sh -c '\''
+ if test -d "$1"; then
+ test -d "$1/.";
+ else
+ case $1 in
+ -*)set "./$1";;
+ esac;
+ case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
+ ???[sx]*):;;*)false;;esac;fi
+ '\'' sh
+ '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+
+# Save the log message, to keep $[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by $as_me, which was
+generated by GNU Autoconf 2.61. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+ CONFIG_HEADERS = $CONFIG_HEADERS
+ CONFIG_LINKS = $CONFIG_LINKS
+ CONFIG_COMMANDS = $CONFIG_COMMANDS
+ $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+ -h, --help print this help, then exit
+ -V, --version print version number and configuration settings, then exit
+ -q, --quiet do not print progress messages
+ -d, --debug don't remove temporary files
+ --recheck update $as_me by reconfiguring in the same conditions
+ --file=FILE[:TEMPLATE]
+ instantiate the configuration file FILE
+ --header=FILE[:TEMPLATE]
+ instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Report bugs to <bug-autoconf@gnu.org>."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+ac_cs_version="\\
+config.status
+configured by $0, generated by GNU Autoconf 2.61,
+ with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright (C) 2006 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If no file are specified by the user, then we need to provide default
+# value. By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+ case $1 in
+ --*=*)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+ ac_shift=:
+ ;;
+ *)
+ ac_option=$1
+ ac_optarg=$2
+ ac_shift=shift
+ ;;
+ esac
+
+ case $ac_option in
+ # Handling of the options.
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ ac_cs_recheck=: ;;
+ --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+ echo "$ac_cs_version"; exit ;;
+ --debug | --debu | --deb | --de | --d | -d )
+ debug=: ;;
+ --file | --fil | --fi | --f )
+ $ac_shift
+ CONFIG_FILES="$CONFIG_FILES $ac_optarg"
+ ac_need_defaults=false;;
+ --header | --heade | --head | --hea )
+ $ac_shift
+ CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
+ ac_need_defaults=false;;
+ --he | --h)
+ # Conflict between --help and --header
+ { echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2
+ { (exit 1); exit 1; }; };;
+ --help | --hel | -h )
+ echo "$ac_cs_usage"; exit ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil | --si | --s)
+ ac_cs_silent=: ;;
+
+ # This is an error.
+ -*) { echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2
+ { (exit 1); exit 1; }; } ;;
+
+ *) ac_config_targets="$ac_config_targets $1"
+ ac_need_defaults=false ;;
+
+ esac
+ shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+ exec 6>/dev/null
+ ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+if \$ac_cs_recheck; then
+ echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
+ CONFIG_SHELL=$SHELL
+ export CONFIG_SHELL
+ exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+exec 5>>config.log
+{
+ echo
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+ echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+ case $ac_config_target in
+ "include/sysconf.h") CONFIG_HEADERS="$CONFIG_HEADERS include/sysconf.h" ;;
+ "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+ "src/bin/anoperc") CONFIG_FILES="$CONFIG_FILES src/bin/anoperc" ;;
+
+ *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+ { (exit 1); exit 1; }; };;
+ esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used. Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+ test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+ test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+fi
+
+# Have a temporary directory for convenience. Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+ tmp=
+ trap 'exit_status=$?
+ { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
+' 0
+ trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+ tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+ test -n "$tmp" && test -d "$tmp"
+} ||
+{
+ tmp=./conf$$-$RANDOM
+ (umask 077 && mkdir "$tmp")
+} ||
+{
+ echo "$me: cannot create a temporary directory in ." >&2
+ { (exit 1); exit 1; }
+}
+
+#
+# Set up the sed scripts for CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "$CONFIG_FILES"; then
+
+_ACEOF
+
+
+
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+ cat >conf$$subs.sed <<_ACEOF
+SHELL!$SHELL$ac_delim
+PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim
+PACKAGE_NAME!$PACKAGE_NAME$ac_delim
+PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim
+PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim
+PACKAGE_STRING!$PACKAGE_STRING$ac_delim
+PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim
+exec_prefix!$exec_prefix$ac_delim
+prefix!$prefix$ac_delim
+program_transform_name!$program_transform_name$ac_delim
+bindir!$bindir$ac_delim
+sbindir!$sbindir$ac_delim
+libexecdir!$libexecdir$ac_delim
+datarootdir!$datarootdir$ac_delim
+datadir!$datadir$ac_delim
+sysconfdir!$sysconfdir$ac_delim
+sharedstatedir!$sharedstatedir$ac_delim
+localstatedir!$localstatedir$ac_delim
+includedir!$includedir$ac_delim
+oldincludedir!$oldincludedir$ac_delim
+docdir!$docdir$ac_delim
+infodir!$infodir$ac_delim
+htmldir!$htmldir$ac_delim
+dvidir!$dvidir$ac_delim
+pdfdir!$pdfdir$ac_delim
+psdir!$psdir$ac_delim
+libdir!$libdir$ac_delim
+localedir!$localedir$ac_delim
+mandir!$mandir$ac_delim
+DEFS!$DEFS$ac_delim
+ECHO_C!$ECHO_C$ac_delim
+ECHO_N!$ECHO_N$ac_delim
+ECHO_T!$ECHO_T$ac_delim
+LIBS!$LIBS$ac_delim
+build_alias!$build_alias$ac_delim
+host_alias!$host_alias$ac_delim
+target_alias!$target_alias$ac_delim
+CC!$CC$ac_delim
+CFLAGS!$CFLAGS$ac_delim
+LDFLAGS!$LDFLAGS$ac_delim
+CPPFLAGS!$CPPFLAGS$ac_delim
+ac_ct_CC!$ac_ct_CC$ac_delim
+EXEEXT!$EXEEXT$ac_delim
+OBJEXT!$OBJEXT$ac_delim
+RM!$RM$ac_delim
+CP!$CP$ac_delim
+TOUCH!$TOUCH$ac_delim
+INSTALL!$INSTALL$ac_delim
+MYSQLCONF!$MYSQLCONF$ac_delim
+MYSQL!$MYSQL$ac_delim
+RDB!$RDB$ac_delim
+ANOPELIBS!$ANOPELIBS$ac_delim
+CPP!$CPP$ac_delim
+GREP!$GREP$ac_delim
+EGREP!$EGREP$ac_delim
+SHARED!$SHARED$ac_delim
+MODULEFLAGS!$MODULEFLAGS$ac_delim
+RUNGROUP!$RUNGROUP$ac_delim
+BINDEST!$BINDEST$ac_delim
+DATDEST!$DATDEST$ac_delim
+MODULE_PATH!$MODULE_PATH$ac_delim
+LIBOBJS!$LIBOBJS$ac_delim
+LTLIBOBJS!$LTLIBOBJS$ac_delim
+_ACEOF
+
+ if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 63; then
+ break
+ elif $ac_last_try; then
+ { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+ { (exit 1); exit 1; }; }
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+
+ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed`
+if test -n "$ac_eof"; then
+ ac_eof=`echo "$ac_eof" | sort -nru | sed 1q`
+ ac_eof=`expr $ac_eof + 1`
+fi
+
+cat >>$CONFIG_STATUS <<_ACEOF
+cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b end
+_ACEOF
+sed '
+s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g
+s/^/s,@/; s/!/@,|#_!!_#|/
+:n
+t n
+s/'"$ac_delim"'$/,g/; t
+s/$/\\/; p
+N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n
+' >>$CONFIG_STATUS <conf$$subs.sed
+rm -f conf$$subs.sed
+cat >>$CONFIG_STATUS <<_ACEOF
+:end
+s/|#_!!_#|//g
+CEOF$ac_eof
+_ACEOF
+
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=/{
+s/:*\$(srcdir):*/:/
+s/:*\${srcdir}:*/:/
+s/:*@srcdir@:*/:/
+s/^\([^=]*=[ ]*\):*/\1/
+s/:*$//
+s/^[^=]*=[ ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+fi # test -n "$CONFIG_FILES"
+
+
+for ac_tag in :F $CONFIG_FILES :H $CONFIG_HEADERS
+do
+ case $ac_tag in
+ :[FHLC]) ac_mode=$ac_tag; continue;;
+ esac
+ case $ac_mode$ac_tag in
+ :[FHL]*:*);;
+ :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5
+echo "$as_me: error: Invalid tag $ac_tag." >&2;}
+ { (exit 1); exit 1; }; };;
+ :[FH]-) ac_tag=-:-;;
+ :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+ esac
+ ac_save_IFS=$IFS
+ IFS=:
+ set x $ac_tag
+ IFS=$ac_save_IFS
+ shift
+ ac_file=$1
+ shift
+
+ case $ac_mode in
+ :L) ac_source=$1;;
+ :[FH])
+ ac_file_inputs=
+ for ac_f
+ do
+ case $ac_f in
+ -) ac_f="$tmp/stdin";;
+ *) # Look for the file first in the build tree, then in the source tree
+ # (if the path is not absolute). The absolute path cannot be DOS-style,
+ # because $ac_f cannot contain `:'.
+ test -f "$ac_f" ||
+ case $ac_f in
+ [\\/$]*) false;;
+ *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+ esac ||
+ { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5
+echo "$as_me: error: cannot find input file: $ac_f" >&2;}
+ { (exit 1); exit 1; }; };;
+ esac
+ ac_file_inputs="$ac_file_inputs $ac_f"
+ done
+
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ configure_input="Generated from "`IFS=:
+ echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure."
+ if test x"$ac_file" != x-; then
+ configure_input="$ac_file. $configure_input"
+ { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+ fi
+
+ case $ac_tag in
+ *:-:* | *:-) cat >"$tmp/stdin";;
+ esac
+ ;;
+ esac
+
+ ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ { as_dir="$ac_dir"
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
+echo "$as_me: error: cannot create directory $as_dir" >&2;}
+ { (exit 1); exit 1; }; }; }
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+ case $ac_mode in
+ :F)
+ #
+ # CONFIG_FILE
+ #
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+
+case `sed -n '/datarootdir/ {
+ p
+ q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p
+' $ac_file_inputs` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+ { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+ ac_datarootdir_hack='
+ s&@datadir@&$datadir&g
+ s&@docdir@&$docdir&g
+ s&@infodir@&$infodir&g
+ s&@localedir@&$localedir&g
+ s&@mandir@&$mandir&g
+ s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF
+ sed "$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s&@configure_input@&$configure_input&;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+$ac_datarootdir_hack
+" $ac_file_inputs | sed -f "$tmp/subs-1.sed" >$tmp/out
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+ { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
+ { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
+ { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined." >&5
+echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined." >&2;}
+
+ rm -f "$tmp/stdin"
+ case $ac_file in
+ -) cat "$tmp/out"; rm -f "$tmp/out";;
+ *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;;
+ esac
+ ;;
+ :H)
+ #
+ # CONFIG_HEADER
+ #
+_ACEOF
+
+# Transform confdefs.h into a sed script `conftest.defines', that
+# substitutes the proper values into config.h.in to produce config.h.
+rm -f conftest.defines conftest.tail
+# First, append a space to every undef/define line, to ease matching.
+echo 's/$/ /' >conftest.defines
+# Then, protect against being on the right side of a sed subst, or in
+# an unquoted here document, in config.status. If some macros were
+# called several times there might be several #defines for the same
+# symbol, which is useless. But do not sort them, since the last
+# AC_DEFINE must be honored.
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+# These sed commands are passed to sed as "A NAME B PARAMS C VALUE D", where
+# NAME is the cpp macro being defined, VALUE is the value it is being given.
+# PARAMS is the parameter list in the macro definition--in most cases, it's
+# just an empty string.
+ac_dA='s,^\\([ #]*\\)[^ ]*\\([ ]*'
+ac_dB='\\)[ (].*,\\1define\\2'
+ac_dC=' '
+ac_dD=' ,'
+
+uniq confdefs.h |
+ sed -n '
+ t rset
+ :rset
+ s/^[ ]*#[ ]*define[ ][ ]*//
+ t ok
+ d
+ :ok
+ s/[\\&,]/\\&/g
+ s/^\('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/ '"$ac_dA"'\1'"$ac_dB"'\2'"${ac_dC}"'\3'"$ac_dD"'/p
+ s/^\('"$ac_word_re"'\)[ ]*\(.*\)/'"$ac_dA"'\1'"$ac_dB$ac_dC"'\2'"$ac_dD"'/p
+ ' >>conftest.defines
+
+# Remove the space that was appended to ease matching.
+# Then replace #undef with comments. This is necessary, for
+# example, in the case of _POSIX_SOURCE, which is predefined and required
+# on some systems where configure will not decide to define it.
+# (The regexp can be short, since the line contains either #define or #undef.)
+echo 's/ $//
+s,^[ #]*u.*,/* & */,' >>conftest.defines
+
+# Break up conftest.defines:
+ac_max_sed_lines=50
+
+# First sed command is: sed -f defines.sed $ac_file_inputs >"$tmp/out1"
+# Second one is: sed -f defines.sed "$tmp/out1" >"$tmp/out2"
+# Third one will be: sed -f defines.sed "$tmp/out2" >"$tmp/out1"
+# et cetera.
+ac_in='$ac_file_inputs'
+ac_out='"$tmp/out1"'
+ac_nxt='"$tmp/out2"'
+
+while :
+do
+ # Write a here document:
+ cat >>$CONFIG_STATUS <<_ACEOF
+ # First, check the format of the line:
+ cat >"\$tmp/defines.sed" <<\\CEOF
+/^[ ]*#[ ]*undef[ ][ ]*$ac_word_re[ ]*\$/b def
+/^[ ]*#[ ]*define[ ][ ]*$ac_word_re[( ]/b def
+b
+:def
+_ACEOF
+ sed ${ac_max_sed_lines}q conftest.defines >>$CONFIG_STATUS
+ echo 'CEOF
+ sed -f "$tmp/defines.sed"' "$ac_in >$ac_out" >>$CONFIG_STATUS
+ ac_in=$ac_out; ac_out=$ac_nxt; ac_nxt=$ac_in
+ sed 1,${ac_max_sed_lines}d conftest.defines >conftest.tail
+ grep . conftest.tail >/dev/null || break
+ rm -f conftest.defines
+ mv conftest.tail conftest.defines
+done
+rm -f conftest.defines conftest.tail
+
+echo "ac_result=$ac_in" >>$CONFIG_STATUS
+cat >>$CONFIG_STATUS <<\_ACEOF
+ if test x"$ac_file" != x-; then
+ echo "/* $configure_input */" >"$tmp/config.h"
+ cat "$ac_result" >>"$tmp/config.h"
+ if diff $ac_file "$tmp/config.h" >/dev/null 2>&1; then
+ { echo "$as_me:$LINENO: $ac_file is unchanged" >&5
+echo "$as_me: $ac_file is unchanged" >&6;}
+ else
+ rm -f $ac_file
+ mv "$tmp/config.h" $ac_file
+ fi
+ else
+ echo "/* $configure_input */"
+ cat "$ac_result"
+ fi
+ rm -f "$tmp/out12"
+ ;;
+
+
+ esac
+
+done # for ac_tag
+
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded. So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status. When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+ ac_cs_success=:
+ ac_config_status_args=
+ test "$silent" = yes &&
+ ac_config_status_args="$ac_config_status_args --quiet"
+ exec 5>/dev/null
+ $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+ exec 5>>config.log
+ # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+ # would make configure fail if this is the last instruction.
+ $ac_cs_success || { (exit 1); exit 1; }
+fi
+
+
+cat <<EOT
+
+$DIS_MODULES
+$DIS_MYSQL
+
+All done! Now run "make" (or possibly "gmake") to compile Anope.
+See the INSTALL, README and FAQ files if you have any problems.
+EOT
+
diff --git a/configure.in b/configure.in
new file mode 100644
index 000000000..a5af8ea68
--- /dev/null
+++ b/configure.in
@@ -0,0 +1,304 @@
+dnl autoconf.in for Services.
+dnl
+dnl Anope (c) 2003-2007 Anope team
+dnl Contact us at dev@anope.org
+
+dnl This program is free but copyrighted software; see the file COPYING for
+dnl details.
+
+dnl Based heavily on the Unreal configure.in script, and extra thanks to
+dnl codemastr from UnrealIRCD.
+
+AC_INIT
+
+# If no bindir, we tell him to run ./Config.
+if test "${with_bindir+set}" != set || test "${with_datadir+set}" != set; then
+ echo "You might want to run ./Config or provide some parameters to this script."
+ echo "./configure --help for information about this script"
+ exit 0
+fi
+
+AC_CONFIG_SRCDIR([src/actions.c])
+AC_CONFIG_HEADER(include/sysconf.h)
+AC_PROG_CC
+if test "$ac_cv_c_compiler_gnu" = "yes"; then
+# CFLAGS="$CFLAGS -funsigned-char"
+ AC_CACHE_CHECK(if gcc has a working -pipe, ac_cv_pipe, [
+ save_cflags="$CFLAGS"
+ CFLAGS="$CFLAGS -pipe"
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],[ac_cv_pipe="yes"],[ac_cv_pipe="no"])
+ CFLAGS="$save_cflags"
+ ])
+ if test "$ac_cv_pipe" = "yes"; then
+ CFLAGS="-pipe $CFLAGS"
+ fi
+fi
+
+dnl CFLAGS="$CFLAGS -W -Wall"
+
+AC_PATH_PROG(RM,rm)
+AC_PATH_PROG(CP,cp)
+AC_PATH_PROG(TOUCH,touch)
+AC_PATH_PROG(INSTALL,install)
+AC_CHECK_LIB(nsl,inet_ntoa,ANOPELIBS="$ANOPELIBS-lnsl ")
+AC_CHECK_LIB(socket, socket,ANOPELIBS="$ANOPELIBS-lsocket ")
+AC_CHECK_LIB(resolv, res_query,ANOPELIBS="$ANOPELIBS-lresolv ")
+AC_CHECK_LIB(bsd, revoke,ANOPELIBS="$ANOPELIBS-lbsd ")
+
+dnl Does this platform require array notation to assign to a va_list?
+dnl If cross-compiling, we assume va_list is "normal". If this breaks
+dnl you, set ac_cv_valistisarray=true and maybe define HAVE_VA_LIST_AS_ARRAY
+dnl also just to be sure.
+
+dnl NOTE: this autoconf test is taken from mozilla: www.mozilla.org.
+
+AC_MSG_CHECKING(whether va_list assignments need array notation)
+AC_CACHE_VAL(ac_cv_valistisarray,
+ [AC_RUN_IFELSE([AC_LANG_SOURCE([[#include <stdlib.h>
+ #include <stdarg.h>
+ void foo(int i, ...) {
+ va_list ap1, ap2;
+ va_start(ap1, i);
+ ap2 = ap1;
+ if (va_arg(ap2, int) != 123 || va_arg(ap1, int) != 123) { exit(1); }
+ va_end(ap1); va_end(ap2);
+ }
+ int main()
+ { foo(0, 123); return(0); }]])],[ac_cv_valistisarray=false],[ac_cv_valistisarray=true],[ac_cv_valistisarray=false])])
+
+if test "$ac_cv_valistisarray" = true ; then
+ AC_DEFINE(HAVE_VA_LIST_AS_ARRAY,[1],[va_list as array])
+ AC_MSG_RESULT(yes)
+else
+ AC_MSG_RESULT(no)
+fi
+
+
+DIS_MYSQL=" MySQL: No"
+AC_ARG_WITH(mysql, [ --without-mysql Do not use MySQL or attempt to find it],,[
+ AC_ARG_WITH(mysqlconfig-path, [ --with-mysqlconfig-path=PATH Complete path to the mysql_config executable],
+ mysql_config_path="$withval", mysql_config_path="")
+ MYSQLCONF=""
+ if test "$mysql_config_path" != ""; then
+ if test -x "$mysql_config_path"; then
+ MYSQLCONF="$mysql_config_path"
+ echo "checking for mysql_config... $MYSQLCONF" >&6
+ fi
+ fi
+ if test "$MYSQLCONF" = ""; then
+ AC_PATH_PROG(MYSQLCONF,mysql_config, "")
+ fi
+ if test "$MYSQLCONF" != ""; then
+ hold_cflags="$CFLAGS"
+ hold_ldflags="$LDFLAGS"
+ if test "$MYSQL_CFLAGS" = ""; then
+ MYSQL_CFLAGS="`$MYSQLCONF --cflags`"
+ fi
+ if test "$MYSQL_LDFLAGS" = ""; then
+ MYSQL_LDFLAGS="`$MYSQLCONF --libs`"
+ fi
+ CFLAGS="$CFLAGS $MYSQL_CFLAGS"
+ LDFLAGS="$LDFLAGS $MYSQL_LDFLAGS"
+ echo $ECHO_N "checking if mysql_config produces valid values... $ECHO_C" >&6
+ AC_TRY_RUN([
+#include <mysql.h>
+
+int main()
+{
+ MYSQL *mysql = mysql_init(0);
+
+ return 0;
+}
+ ], ac_cv_mysql_valid=yes, ac_cv_mysql_valid=no)
+ echo $ac_cv_mysql_valid >&6
+ if test "$ac_cv_mysql_valid" = "yes"; then
+ AC_DEFINE_UNQUOTED(USE_MYSQL,1,"Use Mysql")
+ AC_DEFINE_UNQUOTED(USE_RDB,1,"Use RDB")
+ MYSQL=" mysql.c "
+ RDB=" rdb.c "
+ AC_SUBST(MYSQL)
+ AC_SUBST(RDB)
+ DIS_MYSQL=" MySQL: Yes"
+ else
+ CFLAGS="$hold_cflags"
+ LDFLAGS="$hold_ldflags"
+ fi
+ fi
+])
+
+AC_MSG_CHECKING(whether this is a bit or little endian system)
+AC_TRY_RUN([
+int main()
+{
+ short s = 1;
+ short* ptr = &s;
+ unsigned char c = *((char*)ptr);
+ return c;
+}
+]
+, AC_DEFINE(BIG_ENDIAN)
+ AC_MSG_RESULT(big)
+, AC_DEFINE(LITTLE_ENDIAN)
+ AC_MSG_RESULT(little)
+)
+
+AC_SUBST(ANOPELIBS)
+AC_SUBST(LDFLAGS)
+
+AC_CHECK_HEADER(sys/types.h,AC_DEFINE(HAS_SYS_TYPES_H,1,"Has sys/types.h"))
+
+DIS_MODULES="Modules: Yes"
+
+dnl module checking based on Unreal's module checking code
+AC_DEFUN(AC_ENABLE_DYN,
+[
+AC_CHECK_FUNC(dlopen,, AC_CHECK_LIB(dl,dlopen,[
+ ANOPELIBS="$ANOPELIBS -ldl"
+ AC_DEFINE(USE_MODULES,1,"Modules are available")
+ USE_MODULES="yes"
+ DIS_MODULES="Modules: Yes"
+],
+[
+AC_MSG_WARN(Dynamic linking is not enabled because dlopen was not found)
+AC_DEFINE(STATIC_LINKING,"NO_MODULES","modules not available")
+ DIS_MODULES="Modules: No"
+]))
+
+hold_cflags=$CFLAGS
+CFLAGS="$CFLAGS -export-dynamic"
+AC_CACHE_CHECK(if we need the -export-dynamic flag, ac_cv_export_dynamic, [
+AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[int i;]])],[ac_cv_export_dynamic=yes],[ac_cv_export_dynamic=no])])
+if test "$ac_cv_export_dynamic" = "no"; then
+CFLAGS=$hold_cflags
+fi
+
+AC_CACHE_CHECK(for compiler option to produce PIC,ac_cv_pic,[
+if test "$ac_cv_c_compiler_gnu" = "yes"; then
+ ac_cv_pic="-fPIC -DPIC -shared"
+ case `uname -s` in
+ Darwin*[)]
+ ac_cv_pic="-bundle -flat_namespace -undefined suppress"
+ ;;
+ HP-UX*[)]
+ ac_cv_pic="-fPIC"
+ ;;
+ esac
+else
+case `uname -s` in
+ SunOS*[)]
+ ac_cv_pic="-KPIC -DPIC -G"
+ ;;
+esac
+
+fi
+
+])
+
+if test "$ac_cv_c_compiler_gnu" = "yes"; then
+ case `uname -s` in
+ Darwin*[)]
+ SHARED="-bundle -flat_namespace -undefined suppress"
+ AC_SUBST(SHARED)
+ ;;
+ *[)]
+ SHARED="-shared"
+ AC_SUBST(SHARED)
+ ;;
+ esac
+fi
+
+AC_CACHE_CHECK(if your system prepends an underscore on symbols,ac_cv_underscore,[
+cat >uscore.c << __EOF__
+int main() {
+return 0;
+}
+__EOF__
+$CC -o uscore $CFLAGS uscore.c 1>&5
+if test -z "`strings -a uscore |grep '^_main$'`"; then
+ ac_cv_underscore=no
+else
+ ac_cv_underscore=yes
+fi
+
+rm -f uscore uscore.c
+])
+if test "$ac_cv_underscore" = "yes"; then
+AC_DEFINE(DL_PREFIX,"_","Underscore needed for dlopen")
+else
+AC_DEFINE(DL_PREFIX,"","No prefix needed for dlopen")
+fi
+
+MODULEFLAGS=$ac_cv_pic
+AC_SUBST(MODULEFLAGS)
+AC_DEFINE(USE_MODULES,1,"Modules available")
+])
+
+AC_ENABLE_DYN
+anope_CHECK_TYPE_SIZES
+
+AC_CHECK_HEADER(strings.h,AC_DEFINE(HAVE_STRINGS_H,1,""))
+AC_CHECK_HEADER(sys/select.h,AC_DEFINE(HAVE_SYS_SELECT_H,1,""))
+AC_CHECK_HEADER(execinfo.h,AC_DEFINE(HAVE_BACKTRACE,1,""))
+
+AC_CHECK_FUNCS(strerror,AC_DEFINE(HAVE_STRERROR,1))
+AC_CHECK_FUNCS(sys_errlist,AC_DEFINE(HAVE_SYS_ERRLIST,1))
+AC_CHECK_FUNCS(snprintf,AC_DEFINE(HAVE_SNPRINTF,1))
+AC_CHECK_FUNCS(stricmp,AC_DEFINE(HAVE_STRICMP,1))
+AC_CHECK_FUNCS(strcasecmp,AC_DEFINE(HAVE_STRCASECMP,1))
+AC_CHECK_FUNCS(strdup,AC_DEFINE(HAVE_STRDUP,1))
+AC_CHECK_FUNCS(strspn,AC_DEFINE(HAVE_STRSPN,1))
+AC_CHECK_FUNCS(strsignal,AC_DEFINE(HAVE_STRSIGNAL,1))
+AC_CHECK_FUNCS(gettimeofday,AC_DEFINE(HAVE_GETTIMEOFDAY,1))
+AC_CHECK_FUNCS(setgrent,AC_DEFINE(HAVE_SETGRENT,1))
+AC_CHECK_FUNCS(umask,AC_DEFINE(HAVE_UMASK,1))
+AC_CHECK_FUNCS(fork,AC_DEFINE(HAVE_FORK,1))
+AC_CHECK_FUNCS(gethostbyname,AC_DEFINE(HAVE_GETHOSTBYNAME,1))
+AC_CHECK_FUNCS(gethostbyname_r,AC_DEFINE(HAVE_GETHOSTBYNAME_R,1))
+AC_CHECK_FUNCS(strlcpy,AC_DEFINE(HAVE_STRLCPY,1))
+AC_CHECK_FUNCS(strlcat,AC_DEFINE(HAVE_STRLCAT,1))
+
+AC_ARG_WITH(rungroup, [ --with-rungroup=group Specify the rungroup for anope], [
+ AC_DEFINE_UNQUOTED(RUNGROUP,"$withval","Run group")
+ RUNGROUP=$withval
+])
+AC_SUBST(RUNGROUP)
+
+dnl AC_DEFINE_UNQUOTED(MYOSNAME,"`uname -a`","uname")
+
+AC_ARG_WITH(permissions, [ --with-permissions=permissions Specify the default permissions for anope], AC_DEFINE_UNQUOTED(DEFUMASK,$withval,"Default umask permissions"), AC_DEFINE(DEFUMASK, 007,"Default umask Permissions"))
+
+AC_ARG_WITH(bindir, [ --with-bindir=bindir Specify the default binary dir for anope], [
+ AC_DEFINE_UNQUOTED(SERVICES_BIN,"${withval}/services","Binary Dir")
+ BINDEST=$withval
+ DATDEST=$withval
+ MODULE_PATH=${withval}/modules/
+])
+
+AC_SUBST(BINDEST)
+
+AC_ARG_WITH(datadir, [ --with-datadir=datadir Specify the location of the services data folder], [
+ AC_DEFINE_UNQUOTED(SERVICES_DIR,"$withval","services bin dir")
+ AC_DEFINE_UNQUOTED(MODULE_PATH,"${withval}/modules/","Module dir")
+ DATDEST=$withval
+ MODULE_PATH=${withval}/modules/
+])
+
+AC_SUBST(DATDEST)
+AC_SUBST(MODULE_PATH)
+
+AC_CONFIG_FILES( \
+ Makefile \
+ src/bin/anoperc \
+)
+
+AC_OUTPUT
+
+cat <<EOT
+
+$DIS_MODULES
+$DIS_MYSQL
+
+All done! Now run "make" (or possibly "gmake") to compile Anope.
+See the INSTALL, README and FAQ files if you have any problems.
+EOT
+
diff --git a/data/example.chk b/data/example.chk
new file mode 100644
index 000000000..6f2a2343d
--- /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 auwx | 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..2c494fa4a
--- /dev/null
+++ b/data/example.conf
@@ -0,0 +1,1598 @@
+# 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 /home/username/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.
+
+###########################################################################
+#
+# IRCD configuration
+#
+###########################################################################
+
+# IRCDModule <module_name> [REQUIRED]
+# The ircd protocol module should be used when connecting anope to your
+# chosen IRCD. This should be one of the following options, or a file
+# provided by your IRCD author.
+#
+# Bahamut 1.4.27 [or later] - "bahamut"
+# Charybdis 1.0 [or later] - "charybdis"
+# DreamForge 4.6.7 - "dreamforge"
+# Hybrid IRCd 7.0 [experimental] - "hybrid"
+# InspIRCd 1.0 [beta 5 or later] - "inspircd10"
+# InspIRCd 1.1 [beta 8 or later] - "inspircd11"
+# Plexus 3.0 [or later] - "plexus3"
+# Plexus 2.0 [or later] - "plexus2"
+# PTLink 6.15.0 [experimental] - "ptlink"
+# RageIRCd 2.0.x - "rageircd"
+# Ratbox 2.0.6 [or later] - "ratbox"
+# ShadowIRCD 4.0x [beta 7 or later] - "shadowircd"
+# Solid IRCD 3.4.x [3.4.6 or later] - "solidircd"
+# UltimateIRCd 3.0.0 [or later] - "ultimate3"
+# UltimateIRCd 2.8.2 [or later] - "ultimate2"
+# Unreal 3.2 [beta-19 or later] - "unreal32"
+# Unreal 3.1.1 [or later] - "unreal31"
+# ViagraIRCd 1.3.x [or later] - "viagra"
+#
+
+#IRCDModule "unreal32"
+
+###########################################################################
+#
+# Encryption settings
+#
+###########################################################################
+
+# EncModule <module_name> [REQUIRED]
+# The encryption module to use when dealing with passwords.
+# This determines how the passwords are stored in the databases,
+# and does not add any security as far as transmitting passwords over
+# the network goes.
+# enc_none provides no password encryption, storing the password in
+# plain text, this is the most versiatle as passwords can easily be
+# recovered.
+#
+# NOTE: users of anope's previous (broken) md5 implementation should
+# select the enc_old option, or things may break.
+#
+# NOTE2: Some of these encryption methods are one-way (md5, sha1, old)
+# meaning that you can NOT retrieve the passwords in plain text once
+# encrypted.
+#
+# Plain Text - enc_none
+# Previous (broken) MD5 - enc_old
+# MD5 - enc_md5
+# SHA1 - enc_sha1
+#
+
+EncModule "enc_none"
+
+###########################################################################
+#
+# Core module configuration
+#
+###########################################################################
+# HostCoreModules <list> [RECOMMENDED]
+# These modules will be loaded as part of HostServ's core.
+# It is not recommended you change these settings unless you are
+# sure you understand exactly what it is you are doing.
+HostCoreModules "hs_help hs_on hs_off hs_group hs_list hs_set hs_setall hs_del hs_delall"
+
+# MemoCoreModules <list> [RECOMMENDED]
+# These modules will be loaded as part of MemoServ's core.
+# It is not recommended you change these settings unless you are
+# sure you understand exactly what it is you are doing.
+MemoCoreModules "ms_send ms_cancel ms_list ms_read ms_del ms_set ms_info ms_rsend ms_check ms_staff ms_sendall ms_help"
+
+# HelpCoreModules <list> [RECOMMENDED]
+# These modules will be loaded as part of HelpServ's core.
+# It is not recommended you change these settings unless you are
+# sure you understand exactly what it is you are doing.
+HelpCoreModules "he_help"
+
+# BotCoreModules <list> [RECOMMENDED]
+# These modules will be loaded as part of BotServ's core.
+# It is not recommended you change these settings unless you are
+# sure you understand exactly what it is you are doing.
+BotCoreModules "bs_help bs_botlist bs_assign bs_set bs_kick bs_badwords bs_act bs_info bs_say bs_unassign bs_bot bs_fantasy bs_fantasy_kick bs_fantasy_kickban bs_fantasy_owner bs_fantasy_seen"
+
+# OperCoreModules <list> [RECOMMENDED]
+# These modules will be loaded as part of OperServ's core.
+# It is not recommended you change these settings unless you are
+# sure you understand exactly what it is you are doing.
+OperCoreModules "os_help os_global os_stats os_oper os_admin os_staff os_mode os_kick os_clearmodes os_akill os_sgline os_sqline os_szline os_chanlist os_userlist os_logonnews os_randomnews os_opernews os_session os_noop os_jupe os_ignore os_set os_reload os_update os_restart os_quit os_shutdown os_defcon os_chankill os_svsnick os_oline os_umode os_modload os_modunload os_modlist os_modinfo"
+
+# NickCoreModules <list> [RECOMMENDED]
+# These modules will be loaded as part of NickServ's core.
+# It is not recommended you change these settings unless you are
+# sure you understand exactly what it is you are doing.
+NickCoreModules "ns_help ns_register ns_group ns_identify ns_access ns_set ns_saset ns_drop ns_recover ns_release ns_sendpass ns_ghost ns_alist ns_info ns_list ns_logout ns_status ns_update ns_getpass ns_getemail ns_forbid ns_suspend"
+
+# ChanCoreModules <list> [RECOMMENDED]
+# These modules will be loaded as part of ChanServ's core.
+# It is not recommended you change these settings unless you are
+# sure you understand exactly what it is you are doing.
+ChanCoreModules "cs_help cs_register cs_identify cs_set cs_xop cs_access cs_akick cs_drop cs_sendpass cs_ban cs_clear cs_modes cs_getkey cs_invite cs_kick cs_list cs_logout cs_topic cs_info cs_getpass cs_forbid cs_suspend cs_status"
+###########################################################################
+#
+# 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 something, 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"
+#DevNullAlias "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 has or gets op status 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
+
+# NetworkName <name> [REQUIRED]
+#
+# This is the name of the network the Services are running on.
+
+NetworkName "LocalNet"
+
+# Numeric [OPTIONAL]
+# Many ircd identify themselves with a Numeric ID when using this option
+# consult your ircds documentation before using this
+#Numeric "64"
+
+# NickLen [RECOMMENDED]
+# Set this to the maximum allowed nick length on your network. Anope does
+# not support values larger than 31, so setting them makes no sense. Be
+# sure to set this correctly, as setting this wrong can result in services
+# being disconnected from the network.
+
+NickLen 31
+
+###########################################################################
+#
+# Basic functionality
+#
+###########################################################################
+
+# UserKey1|2|3 <value> [RECOMMENDED]
+#
+# These keys are required to initiate the random number generator. These
+# numbers MUST be random as you want your passcodes to be random. Don't
+# give these keys to anyone! Keep them private!
+#
+# *** NOTE ***
+# If you don't enable these, or keep their default values, any talented
+# programmer would be able to easily "guess" random strings used to mask
+# information. Be safe, and come up with three different 7 digit numbers
+
+#UserKey1 9866235
+#UserKey2 8362013
+#UserKey3 2362899
+
+# 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
+
+# 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 (subject 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 indefinitely.
+#
+# 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 allows users to let Services send PRIVMSGs to them
+# instead of NOTICEs. Also see NSDefMsg, which also toggles the default
+# communication (PRIVMSG or NOTICE) to use for unregistered users.
+#
+# This is a feature that is against the IRC RFC and should be used
+# _only_ if absolutely necessary.
+
+#UsePrivmsg
+
+# UseStrictPrivMsg [OPTIONAL]
+# Using this directive will force services to only respond to privmsgs
+# addressed to Nick@ServerName - e.g. NickServ@localhost.net.
+# This should be used on conjunction with ircd aliases.
+#
+# When using Bahamut, this option will NOT work if the uplink server is
+# configured as a services hub. The serviceshub option is not designed to
+# be used with Anope.
+
+#UseStrictPrivMsg
+
+# 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 shutting 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
+
+# NickRegDelay <seconds> [OPTIONAL]
+# Prevents users from regging their nick if they are not
+# connected for at least X seconds.
+#NickRegDelay 30
+
+# UseSVSHOLD [OPTIONAL]
+# Allows networks running Bahamut (1.4.35 or later), Unreal (3.2),
+# and Plexus (3.0) to use SVSHOLD instead of the services enforcer.
+# This option places a temporary Q:Line on the held nick instead
+# of introducing a new pseudoclient with that nick, which is better
+# for both CPU and bandwidth. If you enable this option on an
+# incompatible IRCd (like a pre-1.4.35 Bahamut), it is most likely
+# to break.
+#UseSVSHOLD
+
+# RestrictOperNick [OPTIONAL]
+# Forbids the registration of nicks that contain nick with services
+# access. So if Tester is a Services Oper, for example, You can't
+# register NewTester or Tester123 unless you are an IRC operator.
+# IMPORTANT: Remember that you have to be an ircop if you want to
+# register the root's nick when setting up Anope for the
+# the first time.
+#RestrictOperNicks
+
+# UseTokens [OPTIONAL]
+# Allows irc networks to use TOKEN commands instead of the
+# standard commands. This saves bandwidth but can break older
+# modules that are not set to trap for TOKEN - if you are using
+# older modules do NOT use this option
+#UseTokens
+
+# UseSVS2MODE [OPTIONAL]
+# On Unreal IRCD use SVS2MODE instead of SVSMODE, doing this will
+# show services changing user modes.
+#UseSVS2MODE
+
+# NewsCount [OPTIONAL]
+# The number of LOGON/OPER News item to display when a user logs
+# on. The default value is 3
+#NewsCount 3
+
+# UnRestrictSAdmin [OPTIONAL]
+# On many ircd Anope removes the umode of +a from users whom are not
+# Service Admin in Anope. This mode is NOT used by Anope for any form
+# of access. Thus this option allows them to keep the mode without having
+# to be a Service Admin in Anope
+#UnRestrictSAdmin
+
+# UlineServers [OPTIONAL]
+#
+# A list of ulined servers on your network, these servers are assumed they
+# can set channel modes and we will not attempt to take them from them
+# WARNING: do not put your user servers in this option
+
+UlineServers "stats.your.network proxy.your.network"
+
+# UseTS6 [OPTIONAL]
+#
+# Modern hybrid ircd like Ratbox 2.0.x support a protocol called TS6.
+# However this protocol is optional thus our default support is for without
+# TS6, if you want to take advantage of TS6, enable this option.
+
+#UseTS6
+
+###########################################################################
+#
+# 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.
+# This setting is [REQUIRED] if NSEmailReg is enabled.
+
+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 usually needs no parameters on the command line.
+# Most sendmail applications (or replacements of it) require the -t
+# option to be used.
+
+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
+
+###########################################################################
+#
+# 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 setting is [REQUIRED] if NSEmailReg
+# is enabled.
+#
+# 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. This setting is [REQUIRED] if NSEmailReg
+# is enabled.
+
+# 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.
+#
+# NSDefMsg also controls the default setting for unregistered users.
+# If NSDefMsg is enabled, unregistered users will receive PRIVMSGs
+# instead of NOTICEs from Services. See UsePrivmsg for more information.
+#
+# 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
+NSDefAutoop
+
+# 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
+
+# NSResendDelay <time> [RECOMMENDED]
+# Sets the minimum length of time between consecutive uses of the
+# RESEND command. If not given, this restriction is disabled (note
+# that this allows "resend flooding" or "mail bombing").
+
+NSResendDelay 90s
+
+# 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 released
+# for general use again. This setting is [REQUIRED] if NSEmailReg is
+# enabled.
+
+# 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
+
+# NSNickTracking [OPTIONAL]
+#
+# When enabled, services will track your last nick identified when issuing
+# nick changes.
+
+#NSNickTracking
+
+# NSAddAccessOnReg [OPTIONAL]
+#
+# When enabled, services will add the usermask of registering users to the
+# access list of their newly created account. If you disable this, users
+# will always have to identify to nickserv before being recognized, unless
+# they manually add an address to the access list of their account.
+
+NSAddAccessOnReg
+
+###########################################################################
+#
+# 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 example) 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
+
+# MSMemoReceipt [OPTIONAL]
+# Allow the use of memo receipts for the following groups:
+# 1 - Opers Only
+# 2 - Everybody
+#
+#MSMemoReceipt 1
+
+###########################################################################
+#
+# 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 slightly.
+
+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
+
+# BSCaseSensitive [OPTIONAL]
+# This option will make botserv use cAsE sEnSiTiVe checking for badwords
+
+# BSCaseSensitive
+
+# BSFantasyCharacter [OPTIONAL]
+# This option allows you to change the default prefix for fantasy
+# commands in channels. This character will have to be prepended to
+# all fantasy commands. If you choose "!", fantasy commands will, for
+# example, be "!kick", "!op", etc. If left out, the default fantasy
+# character will be "!".
+
+# BSFantasyCharacter "!"
+
+###########################################################################
+#
+# 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
+
+# KillOnSGline [OPTIONAL]
+#
+# When enabled, this option makes the services send an (SVS)KILL command
+# immediately after SGLINE ADD. This eliminates the need of killing the
+# users after the SGLINE has been added.
+
+# KillOnSGline
+
+# KillOnSQline [OPTIONAL]
+#
+# When enabled, this option makes the services send an (SVS)KILL command
+# immediately after SQLINE ADD. This eliminates the need of killing the
+# users after the SQLINE has been added.
+
+# KillOnSQline
+
+# 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 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.
+#
+# 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
+
+
+# AddAkiller [OPTIONAL]
+# Adds the nickname of the Operator issuing an AKILL to the kill reason.
+#
+AddAkiller
+
+# OSOpersOnly [RECOMMENDED]
+# If this is defined, only IRC Operators will be permitted to use
+# OperServ, regardless of module based command access restrictions.
+
+OSOpersOnly
+
+
+###########################################################################
+#
+# 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
+# 31 + 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 automatically 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 appropriate 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
+
+# UseRDB [OPTIONAL]
+#
+# Enable this if you want anope to load its data from a remote database.
+# (e.g. MySQL)
+#
+#UseRDB
+
+###########################################################################
+#
+# Module configuration
+#
+###########################################################################
+#
+# ModuleAutoload [OPTIONAL]
+#
+# When compiled with module support, this contains a space separated list
+# of modules to automatically load as soon as possible, e.g. IRCD support modules.
+#
+#ModuleAutoload "hs_moo ircd_defizzer os_ignore_db"
+
+# ModuleDelayedAutoload [OPTIONAL]
+#
+# When compiled with module support, this contains a space separated list
+# of modules to automaticaly load when services are ready for new clients.
+# e.g. new pesudo clients such as CatServ :-) *meow*
+# By default a number of modules that we found worth adding by default are
+# loaded. Feel free to change this if you want to add more, or remove some
+# from the list.
+#
+ModuleDelayedAutoload "cs_appendtopic cs_enforce ns_maxemail os_info hs_request"
+
+###########################################################################
+#
+# Module specific configuration
+#
+###########################################################################
+#
+# This section contains configuration options specific to certain modules.
+# The options in here are for the modules shipped by default. You can add
+# more options for other modules you load here. Check the documentation of
+# the module to see what configuration options it provides.
+
+# NSEmailMax [OPTIONAL]
+# Module: ns_maxemail
+#
+# Limit the amount of registrations with the same email address to the
+# amount given here. If set to 0 or left commented, there will be no limit
+# enforced when registering new accounts or using /msg NickServ SET EMAIL.
+#
+#NSEmailMax 1
+
+# OSInfoDBName [OPTIONAL]
+# Module: os_info
+#
+# Use the given filename as database for the oper information lines.
+# If not given, the default of "os_info.db" will be used.
+#
+#OSInfoDBName "os_info.db"
+
+# HSRequestMemo... [OPTIONAL]
+# Module: hs_request
+#
+# Specify if we should send memo's on certain actions with requested vHosts.
+# Enable HSRequestMemoUser to send memo's to the user requesting a vHost
+# when it's being approved or rejected. Enable HSRequestMemoOper or
+# HSRequestMemoSetters if you want to send a memo to all services staff
+# or host setters when a new vHost is requested.
+#
+#HSRequestMemoUser
+#HSRequestMemoOper
+#HSRequestMemoSetters
+
+# HSRequestDBName [OPTIONAL]
+# Module: hs_request
+#
+# Use the given filename as database for the vhost requests. If not given,
+# the default of "hs_request.db" will be used.
+#
+#HSRequestDBName "hs_request.db"
+
+# OSIgnoreDBName [OPTIONAL]
+# Module: os_ignore_db
+#
+# Use the given filename as database to store services' ignores.
+# If not given, the default of "os_ignore.db" will be used.
+#
+#OSIgnoreDBName "os_ignore.db"
+
+#EOF
diff --git a/data/tables.sql b/data/tables.sql
new file mode 100644
index 000000000..2d4889cb5
--- /dev/null
+++ b/data/tables.sql
@@ -0,0 +1,433 @@
+
+-- If you need to create your db, uncomment the following lines.
+--
+-- CREATE DATABASE anope;
+-- USE anope;
+
+--
+-- 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',
+ active int(1) NOT NULL default '1',
+ PRIMARY KEY (bs_id),
+ UNIQUE KEY nick (nick)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+
+-- --------------------------------------------------------
+
+--
+-- 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',
+ active tinyint(1) NOT NULL default '1',
+ PRIMARY KEY (ca_id),
+ UNIQUE KEY channel (channel,display)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+
+-- --------------------------------------------------------
+
+--
+-- 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 varchar(255) NOT NULL,
+ reason text NOT NULL,
+ creator text NOT NULL,
+ addtime int(11) NOT NULL default '0',
+ active tinyint(1) NOT NULL default '1',
+ PRIMARY KEY (ck_id),
+ UNIQUE KEY channel (channel,dmask)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+
+-- --------------------------------------------------------
+
+--
+-- 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 varchar(255) NOT NULL,
+ `type` int(11) NOT NULL default '0',
+ active tinyint(1) NOT NULL default '1',
+ PRIMARY KEY (cw_id),
+ UNIQUE KEY channel (channel,word)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+
+-- --------------------------------------------------------
+
+--
+-- 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',
+ 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`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+
+-- --------------------------------------------------------
+
+--
+-- 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',
+ active tinyint(1) NOT NULL default '1',
+ PRIMARY KEY (cl_id),
+ UNIQUE KEY channel (channel,position)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+
+-- --------------------------------------------------------
+
+--
+-- Table structure for table 'anope_cs_ttb'
+--
+
+DROP TABLE IF EXISTS anope_cs_ttb;
+CREATE TABLE anope_cs_ttb (
+ ct_id int(11) NOT NULL auto_increment,
+ channel varchar(255) NOT NULL default '',
+ ttb_id int(11) NOT NULL default '0',
+ `value` int(11) NOT NULL default '0',
+ active tinyint(1) NOT NULL default '1',
+ PRIMARY KEY (ct_id),
+ UNIQUE KEY channel (channel,ttb_id)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+
+-- --------------------------------------------------------
+
+--
+-- 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',
+ active tinyint(1) NOT NULL default '1',
+ PRIMARY KEY (bs_id),
+ UNIQUE KEY nick (nick)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+
+-- --------------------------------------------------------
+
+--
+-- 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
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+
+-- --------------------------------------------------------
+
+--
+-- 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 varchar(255) 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',
+ active tinyint(1) NOT NULL default '1',
+ PRIMARY KEY (nm_id),
+ UNIQUE KEY nm_id (nm_id,serv),
+ KEY receiver (receiver,serv)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+
+-- --------------------------------------------------------
+
+--
+-- 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,
+ active tinyint(1) NOT NULL default '1',
+ PRIMARY KEY (na_id),
+ UNIQUE KEY display (display)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+
+-- --------------------------------------------------------
+
+--
+-- 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` int(11) unsigned 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)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+
+-- --------------------------------------------------------
+
+--
+-- 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)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+
+-- --------------------------------------------------------
+
+--
+-- 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 tinyint(1) NOT NULL default '1',
+ PRIMARY KEY (nr_id),
+ UNIQUE KEY nick (nick)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+
+-- --------------------------------------------------------
+
+--
+-- 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` varchar(255) NOT NULL,
+ host varchar(255) NOT NULL,
+ xby text NOT NULL,
+ reason text NOT NULL,
+ seton int(11) NOT NULL default '0',
+ expire int(11) NOT NULL default '0',
+ active tinyint(1) NOT NULL default '1',
+ PRIMARY KEY (ok_id),
+ UNIQUE KEY `user` (`user`,host)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+
+-- --------------------------------------------------------
+
+--
+-- 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)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+
+-- --------------------------------------------------------
+
+--
+-- 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 varchar(255) 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',
+ active tinyint(1) NOT NULL default '1',
+ PRIMARY KEY (oe_id),
+ UNIQUE KEY mask (mask)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+
+-- --------------------------------------------------------
+
+--
+-- 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',
+ active tinyint(1) NOT NULL default '1',
+ PRIMARY KEY (on_id),
+ UNIQUE KEY `type` (`type`,num,`time`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+
+-- --------------------------------------------------------
+
+--
+-- 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 varchar(255) NOT NULL,
+ xby text NOT NULL,
+ reason text NOT NULL,
+ seton int(11) NOT NULL default '0',
+ expire int(11) NOT NULL default '0',
+ active tinyint(1) NOT NULL default '1',
+ PRIMARY KEY (og_id),
+ UNIQUE KEY mask (mask)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+
+-- --------------------------------------------------------
+
+--
+-- 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 varchar(255) NOT NULL,
+ xby text NOT NULL,
+ reason text NOT NULL,
+ seton int(11) NOT NULL default '0',
+ expire int(11) NOT NULL default '0',
+ active tinyint(1) NOT NULL default '1',
+ PRIMARY KEY (og_id),
+ UNIQUE KEY mask (mask)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+
+-- --------------------------------------------------------
+
+--
+-- 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 varchar(255) NOT NULL,
+ xby text NOT NULL,
+ reason text NOT NULL,
+ seton int(11) NOT NULL default '0',
+ expire int(11) NOT NULL default '0',
+ active tinyint(1) NOT NULL default '1',
+ PRIMARY KEY (og_id),
+ UNIQUE KEY mask (mask)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
diff --git a/docs/BUGS b/docs/BUGS
new file mode 100644
index 000000000..1f640fa5e
--- /dev/null
+++ b/docs/BUGS
@@ -0,0 +1,4 @@
+Reported Bugs from Bugzilla: http://bugs.anope.org/
+---------------------------------------------------
+
+
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..1f5218d19
--- /dev/null
+++ b/docs/DEFCON
@@ -0,0 +1,118 @@
+Anope DefCon
+------------
+
+1) Introduction
+2) Installation
+3) Configuration
+4) Usage
+5) Usage Example
+6) Support
+
+1) 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.
+
+2) 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.
+
+3) 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.
+
+4) Usage
+
+ Anope starts up in DEFCON5 (normal readiness). To change the Defcon level
+ in action use:
+
+ /msg OperServ DEFCON 1|2|3|4|5
+
+5) Usage 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
+
+6) 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/EVENTS b/docs/EVENTS
new file mode 100644
index 000000000..bc8af9dce
--- /dev/null
+++ b/docs/EVENTS
@@ -0,0 +1,416 @@
+Anope Internal Events
+---------------------
+
+1) Intro
+2) Complex Events
+3) Triggered Events
+4) Triggered Events List
+
+1) Introduction to Internal Events
+
+ Internal Events are setup to give module developers more information
+ about what the core is doing at different times. This information can
+ be as complex as data we are feeding to the uplink, to simple triggered
+ events such as the databases being saved. A list of triggered events
+ can be found below. Additional there is a module included with the core
+ which can provide some clue as to how to use the code in your modules.
+ The rest of this document assumes that you are used to writing modules.
+
+2) Complex Events
+
+ This type of events are based around what happens when we talk to the
+ IRCd, much like MESSAGE events that the IRCD sends to us. The events
+ are triggered when Anope writes to the ircd. To watch for these events
+ you must have some knowledge of how the IRCd command system works. In
+ our example we will trap for NICK events.
+
+ A) All functions most be formatted as:
+
+ int functioname(char *source, int ac, char **av);
+
+ B) In AnopeInit you must declare EvtMessage in some fashion, it is into
+ this variable that we will create the event handler. Here is what the
+ base AnopeInit should look like at this point:
+
+ int AnopeInit(int argc, char **argv)
+ {
+ EvtMessage *msg = NULL;
+ int status;
+
+ moduleAddAuthor(AUTHOR);
+ moduleAddVersion(VERSION);
+ return MOD_CONT;
+ }
+
+ Note that AUTHOR and VERSION should be defined above the AnopeInit
+ function, just like you should do with any module.
+
+ C) Pass "createEventHandler" the name of the message in this case NICK,
+ and the function that was created in Step A. At this point you should
+ assign the return of "createEventHandler" to the EvtMessage variable.
+
+ msg = createEventHandler("NICK", my_nick);
+
+ D) The Handler is not ready for use yet; now you must add it to the hash
+ with "moduleAddEventHandler". You will want to pass to this function
+ the return of "createEventHandler".
+
+ status = moduleAddEventHandler(msg);
+
+ It will return the same module error codes as adding a regular message,
+ which you can use to confirm it was added correctly.
+
+ E) With that setup in your function you will be passed 3 items. The source
+ most of the time this will be set to ServerName or NULL; consult our
+ IRCd documentation about how messages are formatted. AC is the count of
+ variables you will find in AV.
+
+ int my_nick(char *source, int ac, char **av)
+ {
+ alog("Internal Event - nick is %s",av[0]);
+ return MOD_CONT;
+ }
+
+3) Triggered Events
+
+ These events also known as "event hooks" are internal events such as
+ expiring of nicks to the saving of databases.
+
+ A) All functions most be formatted as:
+
+ int functioname(int argc, char **argv);
+
+ B) In AnopeInit you must declare EvtHook in some fashion; it is into
+ this variable that we will create the event handler. Here is what
+ the base AnopeInit should look like at this point:
+
+ int AnopeInit(int argc, char **argv)
+ {
+ EvtHook *hook = NULL;
+ int status;
+
+ moduleAddAuthor(AUTHOR);
+ moduleAddVersion(VERSION);
+ return MOD_CONT;
+ }
+
+ C) Pass "createEventHook" the name of the event. In this case we are
+ going to hook to the saving of databases, "EVENT_DB_SAVING".
+
+ hook = createEventHook(EVENT_DB_SAVING, my_save);
+
+ D) The Handler is not ready for use yet; now you must add it to the hash
+ with "moduleAddEventHook". You will want to pass to this function the
+ return of "createEventHook"
+
+ status = moduleAddEventHook(hook);
+
+ It will return the same module error codes as adding a regular message,
+ which you can use to confirm it was added correctly.
+
+ E) With that setup in your function you will be passed 1 item. The message
+ is very simple; it could be as simple as a start, stop or message. In
+ the case of saving it has a start and stop.
+
+ int my_save(int argc, char **argv)
+ {
+ if (argc < 1) {
+ return MOD_CONT;
+ }
+
+ if (!stricmp(argv[0], EVENT_START)) {
+ alog("Saving the databases! has started");
+ } else {
+ alog("Saving the databases is complete");
+ }
+ return MOD_CONT;
+ }
+
+4) Triggered Events List
+
+ Here's a list of all event hooks we currently offer, with a description
+ of what argument is being passed to the event functions for this type of
+ event. All arguments are plain-text strings (char *). The list is sorted
+ in alphabetical order.
+
+ Note that all events are emitted AFTER the action has taken place, so
+ any deleted nick/channel/etc won't exist anymore and any created one will
+ exist when your function is being run, unless noted otherwise.
+
+ Also note that EVENT_START and EVENT_STOP should not be matched with an
+ equal sign, but with string comparision. See the bundled events module for
+ an example on how to do this.
+
+ The arguments are given as av[0] for the first argument, av[1] for the
+ second argument, and so on. If av[0] and av[1] are given, the event has
+ two arguments, and argc should be 2.
+
+ EVENT_ACCESS_ADD
+ An user has been added to a channel access list.
+ av[0] Name of the channel the user has been added to.
+ av[1] The nickname of the user that has just added an entry to the
+ access list.
+ av[2] The nickname of the user that has been added to the access
+ list.
+ av[3] The level number the user has been added with.
+
+ EVENT_ACCESS_CHANGE
+ An user level has been changed on a channel access list.
+ av[0] Name of the channel the access list has been modified which.
+ av[1] The nickname of the user that has just modified the access
+ list of the channel.
+ av[2] The nickname of the user wich his access level has just been
+ modified.
+ av[3] The new access level for the user.
+
+ EVENT_ACCESS_CLEAR
+ A channel access list has been cleared.
+ av[0] Name of the channel the access list has been cleared of
+ av[1] The nickname of the user that has cleared the access list
+
+ EVENT_ACCESS_DEL
+ An user has been deleted of a channel access list.
+ av[0] Name of the channel the access entry has been deleted which.
+ av[1] The nickname of the user that has just deleted the access entry.
+ av[2] [OPTIONAL] The nickname of the user wich his access level has just
+ been removed. Not present if numbers were used (e.g. /cs access
+ del 7).
+
+ EVENT_BOT_ASSIGN
+ A BotServ bot has been assigned to a channel.
+ av[0] Name of the channel the bot has been assigned to.
+ av[1] The nickname of the bot that has been assigned to the channel.
+
+ EVENT_BOT_BAN
+ A BotServ bot has banned a user, e.g. kickers.
+ av[0] The nick of the user banned.
+ av[1] The Channel the user was banned from.
+ av[2] The mask that was banned.
+
+ EVENT_BOT_CHANGE
+ The properties of a BotServ bot have been changed.
+ av[0] The nickname of the bot involved.
+
+ EVENT_BOT_CREATE
+ A new BotServ bot has been created, and is ready to use.
+ av[0] The nickname of the newly created bot.
+
+ EVENT_BOT_DEL
+ A BotServ bot is being deleted from BotServ. This event is being sent
+ just before the actual deletion is performed.
+ av[0] The nickname of the bot being deleted.
+
+ EVENT_BOT_FANTASY
+ A fantasy command of the bot has been triggered. This event should be
+ used to create your own fantasy commands.
+ av[0] The fantasy command that has been triggered without leading '!'.
+ av[1] The nickname of the user that has triggered the fantasy
+ command.
+ av[2] The name of the channel the fantasy command has been triggered
+ on.
+ av[3] Contains any optional paramenters passed after the fantasy
+ command. If none are present, this will not exist, and argc will
+ will be 3.
+
+ EVENT_BOT_FANTASY_NO_ACCESS
+ A fantasy command of the bot has been triggered by someone without
+ access to BotServ FANTASY commands on the channel. This will NOT
+ trigger if someone with access has triggered a fantasy command; use
+ EVENT_BOT_FANTASY for those. Hook to both events to catch both event
+ triggers.
+ av[0] The fantasy command that has been triggered without leading '!'.
+ av[1] The nickname of the user that has triggered the fantasy
+ command.
+ av[2] The name of the channel the fantasy command has been triggered
+ on.
+ av[3] Contains any optional paramenters passed after the fantasy
+ command. If none are present, this will not exist, and argc will
+ will be 3.
+
+ EVENT_BOT_JOIN
+ A BotServ bot has joined a channel and opped itself.
+ av[0] The channel name the bot has just joined.
+ av[1] The nickname of the bot that has joined the channel.
+
+ EVENT_BOT_KICK
+ A BotServ bot has kicked a user from a channel.
+ av[0] The name of the user that has been kicked.
+ av[1] The name of the channel the user was kicked from.
+ av[2] The reason for the kick.
+
+ EVENT_BOT_UNASSIGN
+ A BotServ bot is being unassigned from a channel. This event is being
+ sent before the actual removing of the bot is done.
+ av[0] The channel name the bot has been unassigned from.
+ av[1] The nickname of the bot that has been unassigned.
+
+ EVENT_CHAN_DROP
+ A channel has been dropped and deleted.
+ av[0] The name of the channel that has been dropped.
+
+ EVENT_CHAN_EXPIRE
+ A channel has been expired and will be deleted. The event will be
+ emitted just before the actual channel deletion happens.
+ av[0] The name of the channel that has been expired.
+
+ EVENT_CHAN_FORBIDDEN
+ A channel has been forbidden (ChanServ FORBID).
+ av[0] The name of the channel that has been forbidden.
+
+ EVENT_CHAN_KICK
+ Someone has just been kicked from a channel.
+ av[0] The nick of the user that has been kicked.
+ av[1] The channel the user has been kicked from.
+
+ EVENT_CHAN_REGISTERED
+ A new channel has been registered.
+ av[0] The name of the channel that has been registered.
+
+ EVENT_CHAN_SUSPENDED
+ A channel has been suspended (ChanServ SUSPEND).
+ av[0] The name of the channel that has been suspended.
+
+ EVENT_CHAN_UNSUSPEND
+ A channel has been unsuspended (ChanServ UNSUSPEND).
+ av[0] The name of the channel that has been unsuspended.
+
+ EVENT_CHANGE_NICK
+ A user has just changed it's nick.
+ av[0] The new nickname of the user.
+
+ EVENT_CONNECT
+ This event is emitted when the connection to our uplink hub is being
+ made.
+ av[0] EVENT_START or EVENT_STOP, to indicate if it's emitted before
+ or after the connection has been made. EVENT_STOP is emitted
+ before our burst is being sent over the link.
+
+ EVENT_DB_EXPIRE
+ This event is emitted when the expiry routines for all things that can
+ expire in Anope are being run.
+ av[0] EVENT_START or EVENT_STOP, to indicate if it's being emitted
+ before or after the expiry routines have been run.
+
+ EVENT_DB_SAVING
+ This event is emitted when the databases are being saved.
+ av[0] EVENT_START or EVENT_STOP, to indicate if it's emitted before
+ or after the saving routines have been run.
+
+ EVENT_DB_BACKUP
+ This event is emitted when the databases are backed up.
+ av[0] EVENT_START when the backup commences, and EVENT_STOP when it
+ finishes.
+
+ EVENT_DEFCON_LEVEL
+ The DefCon level has just been changed. This event is emitted before
+ any DefCon-related action is taken. The internal DefConLevel has
+ already been raised at this point.
+ av[0] The new level of DefCon being invoked.
+
+ EVENT_GROUP
+ A user has grouped it's nickname to another user group.
+ av[0] The nickname of the user that joined the group.
+
+ EVENT_JOIN_CHANNEL
+ A user joins a channel.
+ av[0] EVENT_START or EVENT_STOP. EVENT_START when the user has passed
+ all access checks and is allowed to join, but has not yet
+ joined the channel. EVENT_STOP when the user has joined and all
+ needed modes are set etc.
+ av[1] The nickname of the user joining the channel.
+ av[2] The name of the channel the user has joined.
+
+ EVENT_NEWNICK
+ A new user has been introduced on the network.
+ av[0] The nickname of the newly introduced user.
+
+ EVENT_NICK_DROPPED
+ A user's nick has just been dropped. Note that the nickname information
+ has already been deleted!
+ av[0] The nickname of the user that has just been dropped.
+
+ EVENT_NICK_EXPIRE
+ A user's nick has just expired. Note that, as with EVENT_NICK_DROPPED,
+ the nickname information has already been deleted!
+ av[0] The nickname of the user that has just expired.
+
+ EVENT_NICK_FORBIDDEN
+ A user's nick has just been forbidden.
+ av[0] The nickname that has just been forbidden.
+
+ EVENT_NICK_IDENTIFY
+ A user has just identified for it's nickname with NickServ.
+ av[0] The nickname of the user that just identified.
+
+ EVENT_NICK_LOGOUT
+ A user has just (been) logged out.
+ av[0] The nickname of the user that has (been) logged out.
+
+ EVENT_NICK_REGISTERED
+ A new user has just registered it's nickname. This event is being
+ emitted when the registration is completed, but the user modes have not
+ yet been set.
+ av[0] The nickname of the newly registered user.
+
+ EVENT_NICK_SUSPENDED
+ A user's nick has just been suspended.
+ av[0] The nickname that has just been suspended.
+
+ EVENT_NICK_UNSUSPEND
+ A user's nick has just been unsuspended.
+ av[0] The nickname that has just been unsuspended.
+
+ EVENT_PART_CHANNEL
+ A user parts a channel.
+ av[0] EVENT_START or EVENT_STOP. EVENT_START when the user is about
+ to be removed from the channel internally, EVENT_STOP when
+ this has been done.
+ av[1] The nickname of the user parting the channel.
+ av[2] The name of the channel the user has parted.
+ av[3] The reason the user parted the channel, this is not always sent
+ so check the count to make sure it was passed. (ac == 4)
+
+ EVENT_RELOAD
+ This event is emitted after the configuration file has been reloaded.
+ av[0] Always EVENT_START.
+
+ EVENT_RESTART
+ This event is emitted before the services are being restarted.
+ av[0] Always EVENT_START.
+
+ EVENT_SERVER_CONNECT
+ A new server has just connected to the network.
+ av[0] The name of the new server.
+
+ EVENT_SERVER_SQUIT
+ A server has sent an SQUIT and is about to be removed from the
+ network. This event is being sent before the server is actually
+ removed from the network.
+ av[0] The name of the server that is being removed.
+
+ EVENT_SHUTDOWN
+ This event is emitted when Anope is being shut down.
+ av[0] EVENT_START or EVENT_STOP, to indicate where in the process of
+ restarting the core is. With EVENT_START, services are still
+ fully online and operating. With EVENT_STOP, every internal
+ clean up has been done already, and the SQUIT has been sent;
+ the only thing done after emitting the event is closing the
+ socket to the uplink hub.
+
+ EVENT_SIGNAL
+ This event is emitted when Anope is quitting because of a signal it
+ received.
+ av[0] The quit message that will be sent with the SQUIT for this
+ shutdown.
+
+ EVENT_TOPIC_UPDATED
+ A channel topic has been succesfully updated. Note that this event is
+ only emitted if the new topic has been fully accepted and set by the
+ Anope core.
+ av[0] The name of the channel involved.
+ av[1] The new topic set on the channel.
+
+ EVENT_USER_LOGOFF
+ A user has left the network. This event is emitted before the internal
+ removal is performed, so the user still exists internally.
+ av[0] The nickname of the user leaving the network.
diff --git a/docs/FAQ b/docs/FAQ
new file mode 100644
index 000000000..93c069f0b
--- /dev/null
+++ b/docs/FAQ
@@ -0,0 +1,480 @@
+Frequently Asked Questions (FAQ) concerning Anope
+------------------------------------------------
+
+NOTE:
+An updated version of this FAQ can be found on our website: www.anope.org
+
+Table of Contents
+-----------------
+
+1) General
+ 1.1) What is Anope?
+ 1.2) Where can I find Anope?
+ 1.3) Does Anope run under Windows?
+ 1.4) Can I send you questions without reading the FAQ, INSTALL or README
+ files?
+ 1.5) I need support for the XYZ protocol.
+ 1.6) Your Services program doesn't do XYZ like DALnet (or other) Services.
+ What's wrong?
+ 1.7) I've got a great new idea for Services. Do you want it?
+ 1.8) 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:
+ 1.9) Can you help me?
+ 1.10) Where is RootServ?
+
+2) Installation / Configuration
+ 2.1) When I run "make", I get an error message like "missing separator",
+ "Unassociated shell command", "Unexpected end of line seen", etc.
+ 2.2) I get an error like "Makefile.inc not found".
+ 2.3) I typed "./services" at the command line, but nothing happened!
+ 2.4) 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: ...".
+ 2.5) 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?
+ 2.6) When I say "/connect services.*", it doesn't work!
+ 2.7) Anope starts up okay, but if I try to register a nickname, it comes
+ back with "Sorry, registration failed."
+ 2.8) Anope reports (via /stats u or /msg OperServ STATS) a different number
+ of users online than I get from doing /lusers.
+
+3) OperServ
+ 3.1) Using the OperServ JUPE command results in server messages like
+ "Server juped.server introduced by non-hub server services.my.net".
+ 3.2) I can't use the ADMIN command to add Services admins, it tells me
+ "Permission denied."
+ 3.3) When I add an AKILL, the users matching it don't get killed.
+ 3.4) 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.
+ 3.5) When I used the OperServ RAW command, Anope and/or my network crashed,
+ or did weird things! Please fix this bug!
+ 3.6) I would like to have the list of the different RAW on OperServ.
+ 3.7) I can't get /OS UMODES and /OS SVSNICK to work!
+ 3.8) What is a Super-Admin? How does it work? Why might it not work?
+ 3.9) How can i enable the OperServ RAW command?
+
+4) Bugs / Crashes
+ 4.1) Anope always dies after about five minutes, saying "FATAL ERROR! Can't
+ back up nick.db".
+ 4.2) Anope crashed with a segmentation fault.
+ 4.3) I've found a bug that's not mentioned here or in the README or BUGS
+ files. What should I do?
+ 4.4) My FreeBSD box complains about 'Shared object "nss_dns.so.1" not
+ found'
+ 4.5) Anope and long (more then 30 character) nicknames.
+
+5) ChanServ
+ 5.1) 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.
+ 5.2) Anope ignored the SET SUCCESSOR setting and deleted a channel when the
+ founder expired.
+ 5.3) How to auto voice all those whom join my #channel?
+ 5.4) Channel options like RESTRICTED or SECUREOPS don't work. What's wrong?
+
+6) BotServ
+ 6.1) How do I add bots to BotServ?
+ 6.2) Why do kick triggers and fantasy commands fail to work with my Bahamut
+ IRCd?
+
+7) Language
+ 7.1) Anope complains in the logfile about being unable to load the default
+ language.
+ 7.2) Anope spricht kein Deutsch!, etc. (Anope doesn't speak my language!)
+ 7.3) I selected a language other than English, but sometimes Anope sends
+ responses in English instead.
+
+8) DevNull
+ 8.1) What is the purpose of DevNull?
+
+-------------------------------------------------------------------------------
+
+1) General
+
+1.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
+ :)
+
+1.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://www.anope.org/ in the
+ main page.
+
+1.3) Does Anope run under Windows?
+
+ Yes. For more information on how to obtain the windows version of Anope
+ visit http://wiki.anope.org/Windows
+
+1.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.
+
+1.5) I need support for the XYZ protocol.
+
+ Since Anope 1.7.9, support for other IRCD's, and thus protocols, has been
+ made modular. More information on making a support file for your favorite
+ IRCD can be found in the docs/IRCD file.
+
+1.6) 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.
+
+1.7) 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 question 1.8 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 on our online Forum, in the Feature
+ Requests section.
+
+1.8) 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.
+
+1.9) Can you help me?
+
+ No, we can't help you unless you tell us what you need help with.
+
+1.10) Where is RootServ?
+
+ Anope does not supply RootServ. All functions you would find in RootServ
+ have been integrated into OperServ. If you really want to use RootServ, you
+ can set the OperServAlias in services.conf to be RootServ. This will enable
+ the RootServ nick to be used for OperServ as well. Read the comments near
+ OperServAlias in the configuration file for more information.
+
+
+2) Installation / Configuration
+
+2.1) 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.
+
+2.2) I get an error like "Makefile.inc not found".
+
+ You forgot to run the Config script first. See the INSTALL file for
+ compilation instructions.
+
+2.3) 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 in the
+ configuration file. (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 we 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. You can also start services with the -nofork command line option
+ to prevent it from running in the background, and it will output the
+ messages written to the log file to the console as well.
+
+2.4) 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 section 3 of the INSTALL file.
+
+2.5) 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.
+
+2.6) When I say "/connect services.*", it doesn't work!
+
+ Of course not. RTFM (Read The Fine Manual), and see the previous answer.
+
+2.7) 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 2.4 for details.
+
+2.8) 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, while the IRC server does.
+
+
+3) OperServ
+
+3.1) 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
+
+3.2) 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. Also, you must be
+ a global IRC Operator and your nickname must be registered and properly
+ indentified with NickServ.
+
+3.3) When I add an AKILL, the users matching it don't get killed.
+
+ Use the AkillOnAdd configuration directive.
+
+3.4) 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 a global oper (i.e. user mode +o) to access OperServ. This
+ can be configured via the OSOpersOnly directive in services.conf .
+
+3.5) 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.
+
+3.6) I would like to have the list of the different RAW on OperServ.
+
+ If you have to ask, you should not be messing with RAW :)
+
+3.7) I can't get /OS UMODES and /OS SVSNICK to work!
+
+ You need to be a SuperAdmin to be able to use these commands.
+
+3.8) 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 Roots. It is set using OperServ and is not persistent. It only
+ works if SuperAdmin is not commented in the services configuration file.
+ This is commented by default. Read /msg OperServ HELP SET SUPERADMIN for
+ further help.
+
+3.9) How can i enable the OperServ RAW command?
+
+ Enabling the OperServ RAW command is VERY dangerous and should never be
+ done on a real network without thinking about it very well first. The RAW
+ command can easily break your whole network if used incorrectly, and thus
+ you will receive NO SUPPORT if you enable RAW on your network.
+
+ Before you enable RAW, be very sure you really want to enable it, and keep
+ in mind that you will NOT BE ABLE to receive ANY SUPPORT anymore, because
+ Anope's stability cannot be guaranteed if RAW is enabled.
+
+ The RAW command comes bundled as a core module for operserv. To load it,
+ add the os_raw module to the list of OperServ core modules. But be sure to
+ keep in mind that when you enable the RAW command, you CANNOT GET ANY
+ SUPPORT for Anope anymore.
+
+
+4) Bugs / Crashes
+
+4.1) 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 Config 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.
+
+4.2) 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.
+
+4.3) 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.
+
+4.4) My FreeBSD box complains about 'Shared object "nss_dns.so.1" not found'
+
+ We haven't figured out the exact cause yet, but as a quickfix you can
+ delete the /etc/nsswitch.conf file. Please keep in mind that removing a
+ configuration file can be dangerous, so only do this if you know what you
+ are doing.
+
+4.5) Anope and long (more then 30 character) nicknames.
+
+ By default anope only supports nicknames up to 30 characters (NICKLEN=30).
+ If your IRCd allows for longer nicknames or has been modified to do so
+ anope will start logging a lot of ("NICK from nonexistent nick") messages.
+ This is because once a user uses a nick that is too long for anope to handle,
+ anope loses track of the user for the remainder of the session.
+ It is POSSIBLE but not NOT RECOMMENDED to extend the maximum length of nicknames
+ anope can track, however this will also break database compatibility. DBs saved
+ with anope set to allow for example 40 chars cannot be read by a default anope
+ and vice versa. So changing the maximum nick length is only possible
+ when starting with fresh databases and even then the consequences of this are
+ UNTESTED.
+ In order to change the maximum internal nick length, change the NICKMAX setting
+ in include/config.h, recompile anope and start without databases.
+
+
+5) ChanServ
+
+5.1) 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 server on your network has a U: line for Services in
+ ircd.conf, for example:
+
+ U:services.whatever.net:*:*
+
+5.2) 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).
+
+5.3) How to auto voice all those whom join my #channel?
+
+ Execute the following commands (/cs is an alias for /msg ChanServ):
+
+ /cs set #channel secure off
+ /cs set #channel xop off
+ /cs levels #channel set AUTOVOICE -1
+
+5.4) Channel options like RESTRICTED or SECUREOPS don't work. What's wrong?
+
+ Make sure that you didn't put any of your normal IRCd's as a ULined server
+ in Anope. Some access checks for clients from ULined servers are skipped to
+ avoid fights between the ULined servers. This is usually only useful when
+ you have a statistics server connected to your network.
+
+
+6) BotServ
+
+6.1) How do I add bots to BotServ?
+
+ Read /msg BotServ HELP and /msg BotServ HELP BOT. Note that you need to be
+ opered up and identified as a Services Administrator before you can use the
+ BOT command.
+
+6.2) Why do kick triggers and fantasy commands fail to work with my Bahamut
+ IRCd?
+
+ Bahamut allows you to setup a server as 'serviceshub'. This will filter
+ certain data services usually don't need to process. This option also
+ filters channel messages, because DALnet's services have no use for them.
+ Anope parses the channel messages for kick triggers and fantasy commands.
+ To make sure these work the server type of the hub they're linked to should
+ be simply 'hub' and not 'serviceshub'.
+
+
+7) Language
+
+7.1) Anope complains in the logfile about being unable to load the default
+ language.
+
+ You forgot to run "make install".
+
+7.2) Anope spricht kein Deutsch!, etc. (Anope doesn't speak my language!)
+
+ See section 5 of the README file.
+
+7.3) 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.
+
+
+8) DevNull
+
+8.1) What is the purpose of DevNull?
+
+ DevNull functions as a message sink. Any message sent to it will be
+ ignored. It will not be logged, there will be no response. It will be lost
+ forever. Whether it's useful or not is up to you; we just provide you with
+ the option.
diff --git a/docs/INSTALL b/docs/INSTALL
new file mode 100644
index 000000000..33e62f346
--- /dev/null
+++ b/docs/INSTALL
@@ -0,0 +1,184 @@
+Anope Installation Instructions
+-------------------------------
+
+1) Installing Anope
+2) Upgrading Anope
+3) Setting up the IRCd
+4) Starting Anope
+5) Setting up a crontab
+
+Note: 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:
+
+ http://www.anope.org/
+
+ Next, unpack the package in your home directory, and go into the created
+ directory.
+
+ Now type ./Config 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 trouble 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
+ configuration file (example.conf) to services.conf, and open the latter
+ with your favorite 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
+
+ Note that upgrading anope with a patchfile isn't recommended. You should
+ download a new, clean source package, as this will give the best results.
+
+ 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). Note that
+ this samples are made to be as generic as possible, but there might be
+ small variations, depending on your IRCd. For IRCd-specific help with
+ configuration, read near the end of this section.
+
+ 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 mentioned 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 correctly.
+
+ 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 your IRCd to apply changes.
+
+ A new trend in ircd configuration is popping all over the place, good
+ examples are the latest Hybrid, Unreal and Bahamut, which use a more
+ "readable" form 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;
+ };
+
+ Note that this block-style configuration files differ heavily, depending
+ on the IRCd. Consult the interactive link maker (link is below) for more
+ details on the exact configuration used by your IRCd.
+
+ If you're unable to get a link with your IRCd after reading this section,
+ you might try the interactive link maker, which is located at:
+
+ http://anope.org/~heinz/ilm.php
+
+4) Starting Anope
+
+ Go into the directory where binaries were installed (by default, this is
+ ~/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 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 after about a minute, 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,
+ this is ~/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). Consult
+ your system's manual pages for more details on the syntax of the crontab
+ file. Interesting manpages are crontab(5), crontab(1) and cron(8).
+
+ Save and exit, and it's installed.
diff --git a/docs/IRCD b/docs/IRCD
new file mode 100644
index 000000000..c99f2558a
--- /dev/null
+++ b/docs/IRCD
@@ -0,0 +1,601 @@
+How To Add IRCd Support
+-----------------------
+
+1) Files to Edit
+2) Modifing the Header File
+3) The Code
+4) Modes
+5) Functions / Events
+6) CAPAB/PROTOCTL
+
+1) Files to Edit
+
+ When preparing to add support to Anope for your ircd, you need to edit
+ the following files.
+
+ A) Make a copy of the .c and .h file of the IRCd that matches the ircd
+ that you are attempting to add support for best.
+ B) Make a backup copy of include/services.h, include/sysconf.h.in
+ C) Make a backup copy of Config and configure.in
+
+ First step in this process is to rename the .c and .h file after the IRCd
+ that you are going to be adding support for. Its recommended that you come
+ up with a name that is clear and easy to understand.
+
+ Now that you have the files that you will need to create your own ircd
+ support, starting with Config. This file is a shell script file; scroll
+ down until you find the list of ircs for the user to select. Indicate
+ the based ircd version which is supported such as a series 1.x or 2.2.x,
+ placing in the comment side an exact version that the support is for or
+ "experimental" if you are not the ircd developer. The next step is to
+ decide how the IRCd will be defined, following the existing examples edit
+ 'IRCTYPE_DEF="IRC_RATBOX"' to be the descriptive define for your ircd.
+
+ With the Config file ready to go, edit configure.in and find in there the
+ reference to --with-ircd. You should see the various other ircds, and
+ you will want to add yours in there using the same IRC_ name you came up
+ with above. Important in this step is to make sure that you set the
+ IRCDFILE to the name of the .c file you set in step 1. Once you have the
+ configure.in created you can remove the old configure and at the command
+ prompt type "autconf"; this will generate the new configure file.
+
+ Getting close to actually modify code. Open sysconf.h.in and add two
+ lines for your given ircd, which is similar to this:
+
+ /* "First IRCD type" */
+ #undef IRC_RATBOX
+
+ Open services.h and add a line with the rest of the ircd include files to
+ match the name of the .h file you set in step 1.
+
+ #include "ratbox.h"
+
+ Taking the .c and .h file open them and replace the #ifdef IRC_* with the
+ IRC_ name you set in step two. Ensure that the code comments at the top
+ of the file match the ircd that the code will be for.
+
+ You are now ready to start getting into the code.
+
+2) Modifying the Header File
+
+ Now that you have gotten past the first part of the creation process, you
+ are into the code. This part is the harder and more complex part. You
+ will need a general understanding of C code to continue. Here are the
+ step by step instructions required to make this work.
+
+ Open the .h file and find the section of code with
+
+ #define PROTECT_SET_MODE "+"
+ #define PROTECT_UNSET_MODE "-"
+ #define CS_CMD_PROTECT "PROTECT"
+ #define CS_CMD_DEPROTECT "DEPROTECT"
+ #define FANT_PROTECT_ADD "!protect"
+ #define FANT_PROTECT_DEL "!deprotect"
+ #define LEVEL_PROTECT_WORD "AUTOPROTECT"
+ #define LEVELINFO_PROTECT_WORD "PROTECT"
+ #define LEVELINFO_PROTECTME_WORD "PROTECTME"
+
+ If the ircd supports a protective/admin (not owner) mode, set the
+ PROTECT_SET_MODE and PROTECT_UNSET_MODE to be that mode. On most ircds
+ it's usermode "a" so you will be setting it to "+a" and "-a". The next
+ two are based more on what this mode is called. When you message ChanServ
+ to get this mode, this is the command you will be using. After this are
+ the fantasy commands which can be used in channel to get these modes. The
+ next three relate to the ACCESS LEVEL list system. Again these are the
+ words to gain these levels in the ACCESS LEVEL system. If your ircd does
+ not have these functions, leave them at what ever value is currently set;
+ the core code will ignore the request of the user.
+
+ Now that this is set, you can define the MODES. All user modes are stored
+ with UMODE_ followed by a letter matching the modes case; be careful to
+ use the correct case as this will make it clear when you setup MODES in
+ the .c in a few. Use hex values for the modes so starting at 0x00000001
+ to 0x8000000. In most cases you want to list all modes. If you run out of
+ values look at removing any modes that do not impact services.
+
+ Channel modes are done much like user modes, with the exception that
+ bans, exceptions, invites, and modes that are applied to a user such as
+ op and voice are not defined here. All other modes are defined in here.
+ Again be clear and use the correct case and use hex values as done with
+ user modes.
+
+ Finally we come to DEFAULT_MLOCK; this is the mode that services will set
+ by default on channels when they are registered. In general you want this
+ to be what is acceptable by the ircd; in most cases this is "+nt"
+
+3) The Code
+
+ Here is where the code of the .c file comes in. Be prepared to spend at
+ least an hour, if not longer, going over the code and getting it right;
+ Especially if you are setting up an ircd that is completely different
+ than the one you used as a base. This section covers the majority of the
+ code that is in use.
+
+ The first bit of code you will face is:
+
+ const char version_protocol[] = "Ratbox IRCD";
+
+ This the protocol name which will appear in various places; especially
+ when you do -version at the command prompt, this is where you state the
+ server name. The version is not always needed unless you are showing that
+ the support is for one branch of a ircd family, such as Unreal 3.1 and
+ Unreal 3.2.
+
+ Once you have decided on this little piece of code, you will come to
+ flood mode characters being used for setting and removing. If your IRCd
+ does not support flood modes, you can just use ""; we will be setting if
+ your IRCD supports flooding or not in a little bit.
+
+ const char flood_mode_char_set[] = "+f";
+ const char flood_mode_char_remove[] = "-f";
+
+ The next task that you will face is setting whether the IRCD sends time
+ stamps on modes but does not tell us that it will do so. If it does, set
+ UseTSMODE to 1; if it does not set it to be 0. If you're not sure refer
+ to your IRCd's documentation on how MODE is sent.
+
+ int UseTSMODE = 0;
+
+ Now you've come to the part where you setup your ircd. There are two
+ structs which hold this information; This allows you to quickly setup
+ your specific ircd.
+
+ IRCDVar ircd[] = { }
+
+ This struct contains your basic IRCd functions. Your base source file has
+ the list of all available variables; note that you should not swap any
+ around, or you will break stuff. Here is a brief description of the usage
+ of each.
+
+ 1) Name: This member tells Anope about the IRCD's name. It may contain
+ text about it's name and version. This is used to identify the
+ build on startup.
+
+ 2) NickServ Mode: This is the user mode set by Anope on NickServ.
+ Normally you want this to be some form of oper flag,
+ or a services flag.
+
+ 3) ChanServ Mode: This is the user mode set by Anope on ChanServ.
+ Normally you want this to be some form of oper flag,
+ or a services flag.
+
+ 4) MemoServ Mode: This is the user mode set by Anope on MemoServ.
+ Normally you want this to be some form of oper flag,
+ or a services flag.
+
+ 5) HostServ Mode: This is the user mode set by Anope on HostServ.
+ Normally you want this to be some form of oper flag,
+ or a services flag. Note that if your ircd does not
+ support HostServ, you can safely make this NULL or +,
+ as there is a check before bringing HostServ online.
+
+ 6) OperServ Mode: This is the user mode set by Anope on OperServ.
+ Normally you want this to be some form of oper flag,
+ or a services flag.
+
+ 7) BotServ Mode: This is the user mode set by Anope on BotServ.
+ Normally you want this to be some form of oper flag,
+ or a services flag.
+
+ 8) HelpServ Mode: This is the user mode set by Anope on HelpServ.
+ Normally you want this to be some form of oper flag,
+ or a services flag.
+
+ 9) DevNull Mode: This is the user mode set by Anope on DevNull.
+ Normally you want this to be some form of oper flag,
+ or a services flag.
+
+ 10) Global Mode: This is the user mode set by Anope on Global.
+ Normally you want this to be some form of oper flag,
+ or a services flag.
+
+ 11) NickServ Alias Mode: This is the user mode set by Anope on the alias
+ of NickServ. Normally you want this to be some
+ form of oper flag, or a services flag.
+
+ 12) ChanServ Alias Mode: This is the user mode set by Anope on the alias
+ of ChanServ. Normally you want this to be some
+ form of oper flag, or a services flag.
+
+ 13) MemoServ Alias Mode: This is the user mode set by Anope on the alias
+ of MemoServ. Normally you want this to be some
+ form of oper flag, or a services flag.
+
+ 14) HostServ Alias Mode: This is the user mode set by Anope on the alias
+ of MemoServ. Normally you want this to be some
+ form of oper flag, or a services flag. Note that
+ if your ircd does not support HostServ, you can
+ safely make this NULL or +, as there is a check
+ before bringing HostServ online.
+
+ 15) OperServ Alias Mode: This is the user mode set by Anope on the alias
+ of OperServ. Normally you want this to be some
+ form of oper flag, or a services flag.
+
+ 16) BotServ Alias Mode: This is the user mode set by Anope on the alias
+ of BotServ. Normally you want this to be some
+ form of oper flag, or a services flag.
+
+ 17) HelpServ Alias Mode: This is the user mode set by Anope on the alias
+ of HelpServ. Normally you want this to be some
+ form of oper flag, or a services flag.
+
+ 18) DevNull Alias Mode: This is the user mode set by Anope on the alias
+ of DevNull. Normally you want this to be some
+ form of oper flag, or a services flag.
+
+ 19) Global Alias Mode: This is the user mode set by Anope on the alias
+ of Global. Normally you want this to be some form
+ of oper flag, or a services flag.
+
+ 20) BotServ Bots Mode: This is the user mode set by Anope on all BotServ
+ bots. Normally you want this to be a some form of
+ service or bot flag; you can use + for no mode at
+ all.
+
+ 21) Max Channelmode Symbols: This is the total number of possible channel
+ modes that can appear before a nick. Do
+ remember to count each possible mode, so +ov
+ is 2.
+
+ 22) Modes to Remove: This is every mode that Anope should remove when
+ stripping channel modes.
+
+ 23) Channelmode for bots: When a BotServ bot joins a channel, this is the
+ mode set on them. Normally you will want them
+ opped (+o), and protected (+a) on IRCd's that
+ support it.
+
+ 24) SVSNICK: Can the ircd use SVSNICK to change some ones nick? Otherwise,
+ KILL is used. Use 1 for yes, 0 for no.
+
+ 25) VHOST: Can a user's host be changed on the fly? Enabling this allow
+ HostServ online. Use 1 for yes, 0 for no.
+
+ 26) OWNER: Has a channel umode for being the channel owner. For example,
+ UnrealIRCd has mode +q. Use 1 for yes, 0 for no.
+
+ 27) OWNER MODE SET: What mode to set to make someone the owner. If the
+ IRCd doesn't support owners, set this to NULL.
+
+ 28) OWNER MODE UNSET: What mode to unset to take away someone's channel
+ owner status. If the IRCd doesn't support owners,
+ set this to NULL.
+
+ 29) ADMIN MODE SET: What mode to set to make someone a channel admin.
+ If the IRCd dosn't support admins, set to NULL.
+
+ 30) ADMIN MODE UNSET: What mode to unset to take away channel admin.
+ If the IRCd dosn't support admins, set to NULL.
+
+ 31) Mode on Nick Register: What mode to give users when they register
+ with NickServ. If your ircd doesn't set expect
+ a mode to be set on registration, you should
+ set this to NULL.
+
+ 32) Mode on Nick Unregister: What mode to set give users when they cancel
+ their registration with NickServ. If your
+ IRCd doesn't set a mode for registered users
+ you should set this to NULL.
+
+ 33) Mode on Nick Change: What mode to give users when they change their
+ nick. If your ircd doesn't set a mode, you
+ should set this to NULL.
+
+ 34) SGLINE: Does the IRCd support realname (geocs) bans? Use 1 for yes,
+ 0 for no.
+
+ 35) SQLINE: Does the IRCd support nick bans? Use 1 for yes, 0 for no.
+
+ 36) SZLINE: Does the IRCd support SZLINES? Use 1 for yes, 0 for no.
+
+ 37) HALFOP: Is channel mode +h for halfop supported by the IRCd? Use 1 for
+ yes, 0 for no.
+
+ 38) Number of Server Args: When an IRCd connects, this is the number of
+ parameters that are passed.
+
+ 39) Join to Set: Services must join a channel to set any modes on that
+ channel. Use 1 for yes, 0 for no.
+
+ 40) Join to Message: Services must join a channel to send any message to
+ that channel (cannot override +n). Use 1 for yes,
+ 0 for no.
+
+ 41) Exceptions: Support for channel exceptions (mode +e). Use 1 for yes,
+ 0 for no.
+
+ 42) TS Topic Forward: Some IRCd's (like UnrealIRCd) like their topic TS
+ set forward by +1. Use 1 for yes, 0 for no.
+
+ 43) TS Topic Backward: Some IRCd's (mainly older DreamForge-like ones)
+ like their topic TS set back by -1. Use 1 for yes,
+ 0 for no.
+
+ 44) Protected Umode: UMODE_ define that defines the protected usermod.
+ Use 0 for no support, or enter the UMODE_ define.
+
+ 45) Admin: Support for channel admins (Mainly used by UltimateIRCd). Use
+ 1 for yes, 0 for no.
+
+ 46) SQline Channels: The IRCd's supports banning channel names via
+ SQLINES. Use 1 for yes, 0 for no.
+
+ 47) Quit On Kill: When we (SVS)KILL a user, does the IRCd send back a
+ QUIT message for that user? Use 1 for yes, 0 for no.
+
+ 48) SVSMODE -b: We can use SVSMODE to unban hosts from a channel. Use
+ 1 for yes, 0 for no.
+
+ 49) Protect: Support for channel protect (mode +a, mainly being used by
+ UnrealIRCd and ViagraIRCd). Use 1 for yes, 0 for no.
+
+ 50) Reverse: We can do a reverse check when unbanning. For use with
+ DreamForge based IRCd's. Use 1 for yes, 0 for no.
+
+ 51) Register Channels: Supports sending a channelmode for registered
+ channels. Use 1 for yes, 0 for no.
+
+ 52) Registered Mode: Channelmode to set on registered channels, see the
+ option above. Use 1 for yes, 0 for no.
+
+ 53) vIdent: Support for including a user's ident in their vHost. Use
+ 1 for yes, 0 for no.
+
+ 54) SVSHOLD: Support for temporarily 'holding' a nick, instead of using
+ a nick enforcer client. Use 1 for yes, 0 for no.
+
+ 55) TS on MODE: We need to send a timestamp when modes are being changed.
+ Use 1 for yes, 0 for no.
+
+ 56) NICKIP: The IP address of new users is being sent along with their
+ hostname when new users are being introduced on the network.
+ Use 1 for yes, 0 for no.
+
+ 57) Umode: We can use OperServ to change a user's mode. Use 1 for yes,
+ 0 for no.
+
+ 58) O:LINE: We can use OperServ to give some user a temporary O:LINE.
+ Use 1 for yes, 0 for no.
+
+ 59) Vhost On Nick: On NICK the IRCd sends the VHOST. Use 1 for yes,
+ 0 for no.
+
+ 60) Change Realname: Change real name. Use 1 for yes, 0 for no.
+
+ 61) Extra Help: If the IRCd has more help for functions in ChanServ than
+ the default help, you should put the language string
+ identifier here. Use 0 for no extra help.
+
+ 62) No Knock: CMODE_ that defines NO KNOCK. Use 0 for no support.
+
+ 63) Admin Only: CMODE_ that defines Admin Only. Use 0 for no support.
+
+ 64) Default MLock: Default channelmodes for MLOCK. Use 0 for no modes.
+
+ 65) Vhost Umode: UMODE_ that indicates if the user currently has a vHost.
+ Use 0 for no support.
+
+ 66) Flood Mode: The IRCd has a channelmode for blocking floods. Use 1 for
+ yes, 0 for no.
+
+ 67) Link Mode: The IRCd has a channelmode for linking a channel to some
+ other channel. Use 1 for yes, 0 for no.
+
+ 68) CMode F: CMODE_ that defines flood mode. Use 0 for no support.
+
+ 69) CMode L: CMODE_ that defines link mode. Use 0 for no support.
+
+ 70) Check Nick ID: Should we check if a user should remain identified when
+ changing their nick? This is for IRCd's that remove
+ their registered-user mode when someone changes their
+ nick (like Bahamut does).
+ Use 1 for yes, 0 for no.
+
+ 71) No Knock Requires +i: Does the No Knock channel mode require invite
+ only channels? Use 1 for yes, 0 for no.
+
+ 72) Chan Modes: If sent in CAPAB/PROTOCOL, we store it in here. This is
+ NULL by default.
+
+ 73) Tokens: Can we use tokens to talk to the IRCd? Use 1 for yes,
+ 0 for no.
+
+ 74) Token Case Senstive: Are the IRCd's TOKENS/COMMANDS case sensitive?
+ Use 1 for yes, 0 for no.
+
+ 75) base64 SJOIN TS: Are the timestamps sent with a SJOIN in base64? Use
+ 1 for yes, 0 for no.
+
+ 76) Supports +I: Does the IRCd support channelmode +I? Use 1 for yes,
+ 0 for no.
+
+ 77) SJOIN Ban Char: Character used to identify bans. Use ''.
+
+ 78) SJOIN Except Char: Character used to identify exceptions. use ''.
+
+ 79) SVSMODE UCMODE: Can we clear user channel modes with SVSMODE? Use
+ 1 for yes, 0 for no.
+
+ 80) SGline Enforce: Does the IRCd enforce SGLINES for us or do we need to
+ do so? Use 1 for yes, 0 for no.
+
+ 81) Vhost Character: The character used to represent the vHost mode, if
+ this is supported by the IRCd.
+
+ 82) TS6: Does the IRCd support TS6? Use 1 for yes, 0 for no.
+
+ 83) UMode +h: Does the IRCd support usermode +h for helpers?
+ Use 1 for yes, 0 for no.
+
+ 84) P10: Is this IRCd a P10-style IRCd? Use 1 for yes, 0 for no.
+
+ 85) Character Set: Unreal passes the character set during PROTOCTL,
+ the value is stored here. Set this NULL to start.
+
+ 86) Reports sync: Does the IRCd report when it's in sync (or done bursting,
+ depending on how you want to say it)? Remember to set
+ the sync state for servers correctly if it does.
+ Use 1 for yes, 0 for no.
+
+ 87) Channel CIDR: Set to 1 if channel bans, excepts and invites
+ support CIDR masks. Expected syntax: *!*@ip/mask.
+ When set to 1, anope will only parse strict CIDR masks.
+ IRCd's that try to correct invalid CIDR's (like nefarious)
+ will need a custom implementation in the core.
+ Contact the anope Dev Team if this is the case.
+ Set to 0 if CIDR's are not supported by your IRCd.
+
+ So we've had this long list. Now there's a second struct to fill. This
+ struct isn't as long as the previous one though, so we'll handle it quite
+ quick compared to the previous one.
+
+ IRCDCAPAB ircdcap[] = { }
+
+ This struct is based on the CAPAB defines. You should review the CAPAB
+ table below to see how this should be done.
+
+ Define Table
+ --------------------------------------------------------------------------
+ Define | Value | Token | Description
+ ----------------|------------|-----------|--------------------------------
+ CAPAB_NOQUIT | 0x00000001 | NOQUIT | NOQUIT protocol support
+ CAPAB_TSMODE | 0x00000002 | TS | Chanmodes are timestamped
+ CAPAB_UNCONNECT | 0x00000004 | UNCONNECT | UNCONNECT protocol support
+ CAPAB_NICKIP | 0x00000008 | NICKIP | IP sent in the NICK line
+ CAPAB_NSJOIN | 0x00000010 | SSJOIN | Smart SJOIN support
+ CAPAB_ZIP | 0x00000020 | ZIP | Support for gzipped links
+ CAPAB_BURST | 0x00000040 | BURST | Supports BURST command
+ CAPAB_TS3 | 0x00000080 | TS3 | Support for TS3 protocol
+ CAPAB_TS5 | 0x00000100 | TS5 | Support for TS5 protocol
+ CAPAB_DKEY | 0x00000200 | DKEY | DH-Key exchange using DKEY
+ CAPAB_DOZIP | 0x00000400 | ZIP | Link traffic will be gzipped
+ CAPAB_DODKEY | 0x00000800 | DKEY | Do DKEY with this link
+ CAPAB_QS | 0x00001000 | QS | Supports quit storm removal
+ CAPAB_SCS | 0x00002000 | SCS | String Cache System support
+ CAPAB_PT4 | 0x00004000 | PT4 | Support for PT4 protocol
+ CAPAB_UID | 0x00008000 | UID | Support for UIDs
+ CAPAB_KNOCK | 0x00010000 | KNOCK | Supports KNOCK
+ CAPAB_CLIENT | 0x00020000 | CLIENT | Supports CLIENT
+ CAPAB_IPV6 | 0x00040000 | IPV6 | Support for IPv6 addresses
+ CAPAB_SSJ5 | 0x00080000 | SSJ5 | Smart Join protocol 5 support
+ CAPAB_SN2 | 0x00100000 | SN2 | Support for SN2 protocol
+ CAPAB_VHOST | 0x00200000 | VHOST | Supports VHOST protocol
+ CAPAB_TOKEN | 0x00400000 | TOKEN | Supports s2s tokens
+ CAPAB_SSJ3 | 0x00800000 | SSJ3 | Smart Join protocol 3 support
+ CAPAB_NICK2 | 0x01000000 | NICK2 | Support for extended NICK (v2)
+ CAPAB_UMODE2 | 0x02000000 | UMODE2 | Supports UMODE2 command
+ CAPAB_VL | 0x04000000 | VL | VLine information in info field
+ CAPAB_TLKEXT | 0x08000000 | TLKEXT | Not 8, but 10 params in TKL's
+ CAPAB_CHANMODE | 0x10000000 | CHANMODE | Channel modes are passed here
+ CAPAB_SJB64 | 0x20000000 | SJB64 | SJOIN timestamps are base64 encoded
+ CAPAB_NICKCHARS | 0x40000000 | NICKCHARS | Character set used by the IRCD for nicks
+
+
+4) Modes
+
+ The next thing you should do is defining the user modes. You will want to
+ have your .h file handy for this part.
+
+ unsigned long umodes[128] = { }
+
+ This array goes from 0 to 127 in the ASCII character set. Insert the user
+ modes at the slot where the mode fits. If you are adding a the user mode
+ of +i find the 105th (ASCII code of 'i') character slot in the array, and
+ place the UMODE_i into this slot. Your base .c file should contain a good
+ start for this, as well as a little help locating the characters.
+
+ The following mode set is for the channel symbols. During a SJOIN event
+ the modes are sent usually before the nick. These normally are @, +, %
+ etc.. depending on the ircd. Starting at ASCII 0 and running to 127.
+ Replace the 0 with the character (o = @, h = %) for the given mode. In the
+ case of halfop which is usually sent as % replace the 37th character with
+ 'h', do this until all modes that are possible be received in this manor
+ have been inserted into the array.
+
+ Now that you have that complete, the following array is ready to be dealt
+ with. This is the cmmodes array, like the others it is a ASCII array
+ starting at 0 and going to 127. However at the given letter you will want
+ to enter the add, and delete function for the given mode. In the case of
+ bans (+b) there is add_ban, and del_ban. Anope provides functions for
+ bans, exceptions and invites, should your ircd have more then these please
+ contact Anope to discuss what can be done to add this mode.
+
+5) Functions and Events
+
+ A brief word about functions and events. All events are captured using:
+
+ void moduleAddIRCDMsgs(void)
+ {
+ m = createMessage("NICK", anope_event_nick);
+ addCoreMessage(IRCD,m);
+ }
+
+ Each event should have a event handler if its important enough to be
+ processed by services. All event functions should be formed like this:
+
+ int anope_event_capab(char *source, int ac, char **av)
+ {
+ return MOD_CONT;
+ }
+
+ They will receive the source; this can be NULL at times depending on the
+ event. Next, ac is the number of arguments that are in the event, and av
+ holds the values for each; so av[0] is the first variable, av[1] will be
+ the second one, and so on. Events are likely to pass to various upper
+ level event handlers; see the previous ircd source for how they handle
+ these events.
+
+ All commands are formed like this:
+
+ void anope_cmd_svsnoop(char *server, int set)
+ {
+ send_cmd(NULL, "SVSNOOP %s %s", server, (set ? "+" : "-"));
+ }
+
+ They may take any number of arguments, depending on the command. They
+ should eventually come to a send_cmd(); this root function is how
+ commands are sent to the IRCd.
+
+6) CAPAB/PROTOCTL
+
+ Most IRCD send a CAPAB or PROTOCTL line so that they can work out what
+ the other end of the connection is capable of doing. Anope has a function
+ to read these lines and set itself up to to handle these events better.
+ When adding support for your ircd, take the following steps.
+
+ 1) In the ircd.c find the function anope_cmd_capab(); this function will
+ send the CAPAB/PROTOCTL line (consult your ircd documentation for
+ which to send). In a single line type in the tokens that anope must
+ send. Here is an example of Hybrid's capab line:
+
+ /* CAPAB */
+ void anope_cmd_capab()
+ {
+ send_cmd(NULL, "CAPAB TS5 EX IE HOPS HUB AOPS");
+ }
+
+ 2) In the ircd.h file make sure to place the defines (see below) that
+ match your IRCd's tokens; only use the ones that matter to your ircd.
+ Should your IRCd add new features not covered in the defined, please
+ contact the Anope Dev team before doing so. See README for information
+ on how to contact the Anope team.
+
+ 3) Ensure that the CAPAB/PROTOCTL event his handled correctly.
+
+ A) In the function "moduleAddIRCDMsgs" making sure that you have the
+ following two lines:
+
+ m = createMessage("CAPAB", anope_event_capab);
+ addCoreMessage(IRCD,m);
+
+ B) Add the function to handle the event
+
+ int anope_event_capab(char *source, int ac, char **av)
+ {
+ capab_parse(ac, av);
+ return MOD_CONT;
+ }
+
+ This function should call the capab_parse function which parses
+ the received CAPAB/PROTOCTL line.
diff --git a/docs/MODULES b/docs/MODULES
new file mode 100644
index 000000000..6c1fbcc8a
--- /dev/null
+++ b/docs/MODULES
@@ -0,0 +1,124 @@
+Anope Modules
+-------------
+
+1) Introduction
+2) Installation
+3) Usage
+4) Usage Example
+5) More Modules
+6) Support
+7) Information for Developers
+8) Modules Repository
+
+1) 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.
+
+2) Installation
+
+ 1. If modules are supported by your system, they will be configured
+ automatically when you run ./Config. The modules will be installed
+ to the modules directory in your data path (by default this will
+ be ~/services/modules).
+
+ Note: you might need to run "make distclean" prior to running ./Config
+
+ 2. Compile Anope as usual. The (g)make process will now compile module
+ support into Anope, and compile the default sample modules, and/or
+ any other module located on the modules folder ("src/modules/").
+
+ 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.
+ Note that you do not need to restart to load new or changed modules,
+ only to make use of a new Anope executable.
+
+3) 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.
+
+4) Usage 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 abbreviated service name they attach to (hs_ for
+ HostServ, cs_ for ChanServ, etc) followed by a descriptive keyword.
+
+5) More Modules
+
+ Anope ships with three sample modules that only illustrates some of the
+ implemented module capabilities. They don't really do much or anything
+ useful.
+
+ You can download more useful modules from http://modules.anope.org/. Just
+ grab the module file (usually with a .c extension). Place the module
+ file in your modules (src/modules) folder; the same folder that contains
+ 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. Make sure you're in the main source directory. (usually anope-1.X.XX/)
+ 2. Run `make modules` to compile any new or changed modules.
+ 3. Run `make install` to install the modules.
+
+ You can now use /msg OperServ MODLOAD to load the new modules.
+
+6) 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.
+
+7) Information for Developers
+
+ There are a number of useful documents on the Anope Wiki. The Anope Wiki
+ can be reached at:
+
+ * http://wiki.anope.org/
+
+
+8) Modules Repository
+
+ You can find modules at http://modules.anope.org
+
+ These modules are 3rd party and as such are not supported by the Anope Team.
+ Contact the Module Author directly with problems, not the Anope Team.
diff --git a/docs/MYSQL b/docs/MYSQL
new file mode 100644
index 000000000..1dd10298e
--- /dev/null
+++ b/docs/MYSQL
@@ -0,0 +1,109 @@
+Anope MySQL Support
+-------------------
+
+1) 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 conjunction 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.
+ (COMPLETED)
+
+ UPDATE: Anope 1.7.0 (Revision 11 and above) finally supports phase 2!
+ A new config directive called 'UseRDB' has been added.
+ If you enable this, anope will automatically try to load its
+ data from MySQL (if configured and compiled with).
+
+ 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 externally (web?).
+ Again, the FFF will be kept intact.
+
+2) Requirements
+
+ 1. MySQL server version 3.23.32 or greater
+ 2. MySQL libs and development files (usually called mysql-dev).
+ 3. A MySQL user account
+ 4. A MySQL database
+
+3) Installation
+
+ 1. The ./Config script automatically detects if your system is capable
+ of running Anope with MySQL support. There is no need anymore to
+ answer yes when asked.
+
+ Note: You might need to run "make distclean" prior to running ./Config
+
+ 2. Compile Anope as usual. The (g)make process will now compile MySQL
+ support into Anope.
+
+ 3. Install Anope as usual.
+
+4) Configuration
+
+ 1. Go to your "services bin directory" (eg: /home/someuser/services/) and run 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.
+
+5) 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 available 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 encryption. This is a one way
+ encryption algorithm. You can only validate it against 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.
+ This is a one way encryption algorithm. SLOW
+
+ MysqlSecure "sha"
+
+ Calculates an SHA 160-bit checksum for the password. The value is
+ returned as a 40-digit hex number. This is a one way encryption
+ algorithm. SLOWEST
+
+ MysqlSecure "mykey"
+
+ Encodes the passwords using "mykey" as the encryption password. It
+ produces a binary string and can be decoded using the MySQL built in
+ 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.
+
+ Caveat: If you enable MysqlSecure you can not longer use the UseRDB directive
+ as all the password types are encrypted with a one way encryption method for
+ older MySQL servers.
diff --git a/docs/NEWS b/docs/NEWS
new file mode 100644
index 000000000..8b31c751b
--- /dev/null
+++ b/docs/NEWS
@@ -0,0 +1,55 @@
+Highlighted News in Anope 1.8
+============================================
+ * Added a new and improved ./Config script.
+ * Added MySQL phase 2 implementation (see docs/MYSQL).
+ * Added NickServ registration delays.
+ * Added read receipts for memos.
+ * Added a way for modules to store data with internal structures.
+ * Added nick tracking support.
+ * Added support for SVSHOLD.
+ * Added support for U:Lined servers.
+ * Added support for TS6 IRCd's.
+ * Added support for Windows.
+ * Added internal events for modules.
+ * Added a way to suspend nicks.
+ * Added support for module configuration directives.
+ * Added translation support for modules.
+ * Added a module pack with handy modules.
+ * Added IRCd protocol modules.
+ * Added support for new IRCd's. Currently supported:
+ - Bahamut 1.4.27 or later (including 1.8)
+ - Charybdis 1.0 or later
+ - DreamForge 4.6.7
+ - Hybrid 7 or later
+ - InspIRCd 1.0 or later (including 1.1)
+ - Plexus 2.0 or later (including 3.0)
+ - PTLink 6.15 or later
+ - RageIRCd 2.0 or later
+ - Ratbox 2.0.6 or later
+ - ShadowIRCd 4.0 beta 7 or later
+ - Solid IRCd 3.4.6 or later
+ - UltimateIRCd 2.8.2 or later (including 3.0)
+ - UnrealIRCd 3.1.1 or later (including 3.2)
+ - ViagraIRCd 1.3 or later
+ * Added new languages. Currently included:
+ Catalan, German, English, Spanish, French, Greek,
+ Hungarian, Italian, Dutch, Polish, Portugese,
+ Russian, Turkish
+ * Added support for CIDR channel lists.
+ * Converted the core to be completely modular.
+ * Improved random number algorithm.
+ * Removed proxy detector (see docs/PROXY).
+ * Fixed various exploits and vulnerabilities.
+ * Fixed various language typos and inconsistencies.
+ * Fixed a bug in the database system causing nickserv passwords
+ to be saved incorrectly. Note that this breaks backwards
+ compatibility on nick.db !!!
+
+
+
+For the full changes, see the Changes file.
+
+For announcements and discussions about Anope, please visit our
+web site http://www.anope.org
+
+
diff --git a/docs/OLDCHANGES b/docs/OLDCHANGES
new file mode 100644
index 000000000..af1ca30e5
--- /dev/null
+++ b/docs/OLDCHANGES
@@ -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/docs/OLDNEWS b/docs/OLDNEWS
new file mode 100644
index 000000000..f8e0c85a6
--- /dev/null
+++ b/docs/OLDNEWS
@@ -0,0 +1,139 @@
+Highlighted News in Anope 1.7 (and soon 1.8)
+============================================
+ * Added a new and improved ./Config script.
+ * Added MySQL phase 2 implementation (see docs/MYSQL).
+ * Added NickServ registration delays.
+ * Added read receipts for memos.
+ * Added a way for modules to store data with internal structures.
+ * Added nick tracking support.
+ * Added support for SVSHOLD.
+ * Added support for U:Lined servers.
+ * Added support for TS6 IRCd's.
+ * Added support for Windows.
+ * Added internal events for modules.
+ * Added a way to suspend nicks.
+ * Added support for module configuration directives.
+ * Added translation support for modules.
+ * Added a module pack with handy modules.
+ * Added IRCd protocol modules.
+ * Added support for new IRCd's. Currently supported:
+ - Bahamut 1.4.27 or later (including 1.8)
+ - Charybdis 1.0 or later
+ - DreamForge 4.6.7
+ - Hybrid 7 or later
+ - InspIRCd 1.0 or later (including 1.1)
+ - Plexus 2.0 or later (including 3.0)
+ - PTLink 6.15 or later
+ - RageIRCd 2.0 or later
+ - Ratbox 2.0.6 or later
+ - ShadowIRCd 4.0 beta 7 or later
+ - Solid IRCd 3.4.6 or later
+ - UltimateIRCd 2.8.2 or later (including 3.0)
+ - UnrealIRCd 3.1.1 or later (including 3.2)
+ - ViagraIRCd 1.3 or later
+ * Added new languages. Currently included:
+ Catalan, German, English, Spanish, French, Greek,
+ Hungarian, Italian, Dutch, Polish, Portugese,
+ Russian, Turkish
+ * Added support for CIDR channel lists.
+ * Converted the core to be completely modular.
+ * Improved random number algorithm.
+ * Removed proxy detector (see docs/PROXY).
+ * Fixed various exploits and vulnerabilities.
+ * Fixed various language typos and inconsistencies.
+ * Fixed a bug in the database system causing nickserv passwords
+ to be saved incorrectly. Note that this breaks backwards
+ compatibility on nick.db !!!
+
+Highlighted News in Anope 1.6
+=============================
+ * Fixed various exploits and vulnerabilities.
+ * 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 masquerading.
+ * 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, please visit our
+web site http://www.anope.org
+
+
diff --git a/docs/PROXY b/docs/PROXY
new file mode 100644
index 000000000..24499be11
--- /dev/null
+++ b/docs/PROXY
@@ -0,0 +1,41 @@
+Anope Proxy Detector
+--------------------
+
+1) Introduction
+2) Alternatives
+
+1) Introduction
+
+ Anope has had a built-in proxy detector since it's first version. Recently,
+ however, this built-in proxy detector has been removed. This was because
+ the Anope team found that the proxy detector was showing it's age, and the
+ time needed to restore it to a good state wasn't worth it, also considering
+ that there are currently good alternatives out there which do the job as
+ good as it can be done already.
+
+2) Alternatives
+
+ A) Blitzed Open Proxy Monitor (BOPM)
+ B) NeoStats + OPSB
+
+ Note that these are seperate projects and that the Anope team won't give
+ support on these programs. For support, please refer to the sites of the
+ creators of the software packages.
+
+ A) Blitzed Open Proxy Monitor (BOPM)
+
+ URL: http://wiki.blitzed.org/BOPM
+
+ BOPM is currently the leading proxy detector for IRC networks out
+ there. Altough it is not designed to run on a central place for the
+ entire network, it can be done with some minor tweaking on most IRCd's.
+ The Anope Team advises BOPM for the best security.
+
+ B) NeoStats + OPSB
+
+ URL: http://www.neostats.net/
+
+ NeoStats is the swiss knife of IRC tools. In combination with the OPSB
+ module by NeoStats Software, it can scan for proxies in a similar way
+ as BOPM does. The OPSB module is based on BOPM and has been adjusted to
+ be able to scan all clients from one centralized proxy detector.
diff --git a/docs/README b/docs/README
new file mode 100644
index 000000000..830e97b33
--- /dev/null
+++ b/docs/README
@@ -0,0 +1,377 @@
+Anope -- a set of IRC services for IRC networks
+-----------------------------------------------
+
+Anope is 2003-2008 Anope Team <info@anope.org>.
+Based on Epona 2000-2002 PegSoft <epona@pegsoft.net>.
+Based on Services 1996-1999 Andrew Church <achurch@achurch.org>.
+
+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.esper.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>
+ * Amanda Folson <amanda@anope.org>
+ * Andrew Berquist <vash@anope.org>
+ * Björn Stiddien <keeper@anope.org>
+ * Charles Kingsley <chaz@anope.org>
+ * Chris Hogben <heinz@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>
+ * Gabriel Acevedo H. <drstein@anope.org>
+ * Jan Milants <viper@anope.org>
+ * JH <jh@irc-chat.net>
+ * Joris Vink <joris@anope.org>
+ * Lucas Nussbaum <lucas@lucas-nussbaum.net>
+ * Mark Summers <mark@goopler.net>
+ * Matthew Beeching <jobe@invictachat.net>
+ * Naram Qashat <cyberbotx@anope.org>
+ * Pieter Bootsma <geniusdex@anope.org>
+ * Robin Burchell <w00t@inspircd.org>
+ * Thomas Juberg Stensås <ShadowMaster@Shadow-Realm.org>
+ * Trystan .S Lee <trystan@nomadirc.net>
+ * openglx <openglx@brasnerd.com.br>
+
+ Anope Translations:
+
+ * GeniusDex <geniusdex@anope.org> (nl.l)
+ * Kein <kein-of@yandex.ru> (ru.l)
+ * Stuff <the.stuff@gmx.de> (de.l)
+ * Gabriel Acevedo H. <drstein@anope.org> (es.l)
+ * Janos Kapitany <sarkanyka@cjbchat.hu> (hun.l)
+ * Szymon S'wierkosz <szymek@adres.pl> (pl.l)
+
+ Anope uses the strlcat() and strlcpy() functions from OpenSSH 2.5.1p2.
+ These functions are copyrighted by Todd C. Miller:
+
+ Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. The name of the author may not be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+ THIS SOFTWARE IS PROVIDED `AS IS'' AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+ TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+
+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 the user to register as many nicks as needed
+ while still being able to take profit of his privileges and to
+ modify the 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 privileged 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, and swearing, and to take appropriate actions. It
+ also can handle user-friendly commands (like !op, !deop, !voice,
+ !devoice, !kick, and many others), 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 daemons supporting ip cloaking, such as UnrealIRCd, UltimateIRCd
+ and ViagraIRCd.
+
+ * HelpServ, a skeleton service used to serve help files.
+
+ Anope currently works with:
+
+ * Bahamut 1.4.27 or later (including 1.8)
+ * Charybdis 1.0 or later
+ * DreamForge 4.6.7
+ * Hybrid 7 or later
+ * InspIRCd 1.0 or later (including 1.1)
+ * Plexus 2.0 or later (including 3.0)
+ * PTlink 6.15 or later
+ * RageIRCd 2.0 beta-6 or later
+ * Ratbox 2.0.6 or later
+ * ShadowIRCd 4.0 beta 7 or later
+ * Solid IRCd 3.4.6 or later
+ * UltimateIRCd 2.8.2 or later (including 3.0)
+ * UnrealIRCd 3.1.1 or later (including 3.2)
+ * ViagraIRCd 1.3 or later
+
+ Anope could also work with some of the daemons derived by the ones listed
+ above, but there's no support for them if they work or don't work.
+
+
+3) Installation
+
+ See the INSTALL file for instruction on installing Anope.
+
+
+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. for
+ [host]:[port] 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
+ -version Display the version of Anope
+ -nothird Do not load the modules specified in ModulesAutoload
+ or ModulesDelayedAutoload in the config file
+ -protocoldebug Debug each incoming message after protocol parsing
+ -support Used for support, same as -debug -nofork -nothird
+
+ 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; we 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 yo
+ 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 highly
+ recommended to keep backup copies of your databases in case something
+ does happen (since Anope will stop at the first error in a database, 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 thirteen languages: Catalan, Dutch,
+ English, French, German, Greek, Hungarian, Italian, Polish, Portuguese,
+ Russian, Spanish and Turkish. If you want to translate Anope messages
+ into another language, follow this 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 favorite 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 network 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
+ (http://bugs.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. :)
diff --git a/docs/WIN32.txt b/docs/WIN32.txt
new file mode 100644
index 000000000..241390271
--- /dev/null
+++ b/docs/WIN32.txt
@@ -0,0 +1,209 @@
+Anope for Windows
+-----------------
+
+1) Building the Source
+2) Installation
+3) Compiling Modules
+4) Other compile options
+5) Credits
+
+1) Building the Source
+
+ NOTE: If you have downloaded one of the pre-compiled installers, you do
+ NOT need to complete this step, and you can proceed to step 2.
+
+ If you want to build Anope from source on a Win32 system, you will need
+ to follow this instructions:
+
+ 1) Download the required files:
+
+ * Current Anope source:
+ http://sourceforge.net/project/showfiles.php?group_id=94081
+
+ If you have Visual C++ 6, 7 (.NET 2002/2003) or 8 (2005) skip ahead to step 2, else you
+ need to download the following free components from Microsoft. Once
+ downloaded, install these packages.
+
+ * Microsoft Visual C++ 2008 Express Edition:
+ http://www.microsoft.com/express/vc/
+
+ or
+
+ * Microsoft Visual C++ 2005 Express Edition:
+ http://msdn.microsoft.com/vstudio/express/visualc/download/
+
+ then download and install:
+
+ * Microsoft Windows PlatformSDK: (Requires WGA validation)
+ http://www.microsoft.com/downloads/details.aspx?FamilyId=0BAF2B35-C656-4969-ACE8-E4C0C0716ADB&displaylang=en
+
+ (NOTE: Although this says for Windows Server 2003, it does infact work on all supported
+ versions of Windows. When installing, you should select the Custom option, and ensure
+ that only the top selection, and the bottom selection are checked. This will cut down
+ install time dramatically)
+
+ * MySQL for Windows (only needed if building with MySQL enabled):
+ http://dev.mysql.com/
+
+ (NOTE: Anope can be compiled against MySQL Version 3.23 and above)
+
+
+ 2) Unpack the Anope tarball with your favorite uncompression program
+ (WinZip or WinRAR, etc).
+
+ 3) Bring up the Visual C++ Command Prompt; This will launch a
+ DOS Command Prompt like window, which will set the environment
+ properties needed to make Anope.
+
+ Change directories to where you unpacked the source code in step 2, by typing:
+
+ cd <path to extracted source>
+
+ e.g.
+
+ cd c:\anope-trunk
+
+ 4) You now need to configure Anope to your requirements. At the prompt type:
+
+ Config.bat
+
+ NOTE: If you run an Anti-Virus program such as McAfee or Norton, you may
+ be unable to run this command due to the protection in place. Some Anti-
+ Virus programs may detect the Anope Configuration Tool as a worm, however
+ this is not the case. If you are prompted to allow or deny execution of
+ the script, you should choose allow. If the script fails to run, and no
+ notice is displayed, please check your Anti-Virus settings before seeking
+ assistance.
+
+ An interactive configuration program should guide you through the install
+ options, and then detect your Microsoft Visual C++ Library files. If it
+ fails to detect them, you should check you have everything installed.
+
+ If you cannot find whats causing the error, please visit our forums or
+ our IRC Support channel for assistance.
+
+ 5) You are now ready to compile. At the prompt type:
+
+ nmake -f Makefile.win32
+
+ Once you are back at the command prompt again, if there have been no
+ errors, you are ready to go.
+
+ Should you encounter errors with the installation process, check the
+ messages displayed for advice on resolving them. If you are unable to
+ resolve the issues yourself, seek assistance on our forums or in our
+ IRC Support channel.
+
+ 6) Anope will install the files where they belong. The only thing you need
+ to do is rename "data/example.conf" to be "data/services.conf".
+
+ You have now completed the building phase of Anope for Windows. You can
+ now move on to the next section, which is related to setting up Anope.
+
+2) Installation
+
+ Since Anope for Windows does not use a visual interface, you must do the
+ configuration with a text editor before proceeding with running Anope
+ itself.
+
+ NOTE: You may need to open the configuration file with Wordpad, or a text
+ editor which supports UNIX line endings. Opening the configuration file in
+ Notepad will cause strange characters to appear, and you may not be able to
+ edit the file correctly.
+
+ Open services.conf, and read through it carefully and adjust the settings
+ you think you need to adjust. Pay special attention to these settings:
+
+ A) IRCDModule: This is the name of an IRCd Module that Anope will use
+ to communicate with your server. Anope supports 15 IRCds,
+ so ensure you set the right value here.
+ B) RemoteServer: This is the address to your ircd, along with the port
+ and password. You should consult your ircd
+ documentation on how to link ircds.
+ C) ServicesRoot: Remove the # and change the names to your nick so you
+ can take control of services once they are online.
+ D) UserKey1/2/3: Remove the # infront of the three UserKey settings, and
+ change the parameters to numbers; around 6-7 digits will
+ do.
+
+ If you are unsure of the settings, you can go to the dos command prompt
+ and run "anope.exe -nofork -debug" and watch the information as it
+ attempts to connect.
+
+ You can launch services in two ways. If you are sure that the entered
+ configuration information is correct, simply double clicking the Anope
+ executable will cause it to start; no window will pop up. If you'd rather
+ have a more textual output, you can start at the dos prompt and type in
+ "anope.exe". If services are successfully started up the dos prompt will
+ seem to hang; at this point you can safely close the dos window.
+
+3) Compiling Modules
+
+ If you want to build other modules than the ones shipped by default, you
+ will need to modify the Makefile.inc.win32 file, in the src\modules folder.
+
+ A) Add modules; find the line stating "SRCS=" and add the name of the
+ file to the end of the line. So if you have two files:
+
+ SRCS=file.c file2.c
+
+ If you are compiling a folder of module components, such as the example
+ "catserv", you will need to add/change the "SUBS=" line. If you were
+ compiling the "catserv" example, the line would look like this:
+
+ SUBS=catserv
+
+ B) When you've done this, use the same command prompt you set up in part
+ 1, change directories to the src\modules folder, and type:
+
+ nmake -f Makefile.win32
+
+ followed afterwards, by:
+
+ nmake -f Makefile.win32 install
+
+ C) You should now be able to load your modules on IRC via OperServ, or via
+ the services.conf file.
+
+
+4) Other compile options
+
+ A) If you have trouble recompiling Anope, you should try:
+
+ nmake -f Makefile.win32 distclean
+
+ This will clean up the source directory and allow for chages to be applied
+ to previously compiled files.
+
+ B) A list of valid options are:
+
+ install
+ distclean
+ clean
+ spotless
+ all
+ core
+ protocols
+ mypasql
+ languages
+ modules
+
+ The syntax for these options is:
+
+ nmake -f Makefile.win32 [option]
+
+5) Credits
+
+ Anope is based on Epona and IRCServices. See CREDITS for more credits and
+ a complete list of all developers.
+
+ Anope's Windows-specific code is provided by:
+
+ * Dominick Meglio <codemastr@unrealircd.com>
+ * Trystan Scott Lee <trystan@nomadirc.net>
+ * Chris Hogben <heinz@anope.org>
+
+ Anope's Windows Installer was made using:
+
+ * NSIS 2.20 <http://nsis.sourceforge.net>
+
diff --git a/include/Makefile b/include/Makefile
new file mode 100644
index 000000000..b5641c71b
--- /dev/null
+++ b/include/Makefile
@@ -0,0 +1,20 @@
+
+all: services.h extern.h pseudo.h version.h
+
+version.h: Makefile version.sh services.h pseudo.h messages.h $(SRCS)
+ sh version.sh
+
+services.h: sysconf.h config.h extern.h
+ touch $@
+
+extern.h: slist.h
+ touch $@
+
+pseudo.h: commands.h timeout.h encrypt.h datafiles.h slist.h
+ touch $@
+
+clean:
+ (rm -f language.h)
+
+distclean: clean
+ (rm -f sysconf.h version.h)
diff --git a/include/commands.h b/include/commands.h
new file mode 100644
index 000000000..bff95eb16
--- /dev/null
+++ b/include/commands.h
@@ -0,0 +1,34 @@
+/* Declarations for command data.
+ *
+ * (C) 2003-2008 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$
+ *
+ */
+
+ #include "modules.h"
+
+/*************************************************************************/
+
+/* Routines for looking up commands. Command lists are arrays that must be
+ * terminated with a NULL name.
+ */
+
+extern MDE Command *lookup_cmd(Command *list, char *name);
+extern void run_cmd(char *service, User *u, Command *list,
+ char *name);
+extern void help_cmd(char *service, User *u, Command *list,
+ char *name);
+extern void do_run_cmd(char *service, User * u, Command *c,const char *cmd);
+extern MDE void do_help_limited(char *service, User * u, Command * c);
+extern void do_help_cmd(char *service, User * u, Command *c,const char *cmd);
+extern MDE void mod_help_cmd(char *service, User *u, CommandHash *cmdTable[],const char *cmd);
+extern MDE void mod_run_cmd(char *service, User *u, CommandHash *cmdTable[],const char *cmd);
+
+/*************************************************************************/
diff --git a/include/config.h b/include/config.h
new file mode 100644
index 000000000..648205e7c
--- /dev/null
+++ b/include/config.h
@@ -0,0 +1,76 @@
+/* Services configuration.
+ *
+ * (C) 2003-2008 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$
+ *
+ */
+
+#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 *******/
+
+/* 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/include/datafiles.h b/include/datafiles.h
new file mode 100644
index 000000000..71f269252
--- /dev/null
+++ b/include/datafiles.h
@@ -0,0 +1,71 @@
+/* Database file descriptor structure and file handling routine prototypes.
+ *
+ * (C) 2003-2008 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$
+ *
+ */
+
+#ifndef DATAFILES_H
+#define DATAFILES_H
+
+#ifndef _WIN32
+#include <sys/param.h>
+#endif
+
+/*************************************************************************/
+
+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[MAXPATHLEN]; /* Name of the database file */
+ char backupname[MAXPATHLEN]; /* 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/include/defs.h b/include/defs.h
new file mode 100644
index 000000000..78371946d
--- /dev/null
+++ b/include/defs.h
@@ -0,0 +1,40 @@
+/* Set default values for any constants that should be in include files but
+ *
+ * (C) 2003-2008 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$
+ *
+ */
+
+/*************************************************************************/
+
+#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/include/depricated.h b/include/depricated.h
new file mode 100644
index 000000000..0d2f7073d
--- /dev/null
+++ b/include/depricated.h
@@ -0,0 +1,127 @@
+/* depricated.h
+ *
+ * (C) 2003-2008 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.
+ *
+ *
+ */
+
+/*
+ All of these functions were replaced in 1.7.6, you should move your modules
+ to use the new functions
+*/
+
+#define change_user_mode(u, modes, arg) common_svsmode(u, modes, arg)
+#define GetIdent(x) common_get_vident(x)
+#define GetHost(x) common_get_vhost(x)
+
+#define NEWNICK(nick,user,host,real,modes,qline) \
+ anope_cmd_bot_nick(nick,user,host,real,modes)
+
+#define s_akill(user, host, who, when, expires, reason) \
+ anope_cmd_akill(user, host, who, when, expires, reason)
+
+#define set_umode(user, ac, av) anope_set_umode(user, ac, av)
+
+#define s_svsnoop(server, set) anope_cmd_svsnoop(server, set)
+
+#define s_sqline(mask, reason) anope_cmd_sqline(mask, reason)
+
+#define s_sgline(mask, reason) anope_cmd_sgline(mask, reason)
+#define s_szline(mask, reason) anope_cmd_szline(mask, reason)
+#define s_unsgline(mask) anope_cmd_unsgline(mask)
+#define s_unsqline(mask) anope_cmd_unsqline(mask)
+#define s_unszline(mask) anope_cmd_unszline(mask)
+
+#define s_rakill(user, host) anope_cmd_remove_akill(user, host)
+
+
+# define NICKSERV_MODE ircd->nickservmode
+# define CHANSERV_MODE ircd->chanservmode
+# define HOSTSERV_MODE ircd->hostservmode
+# define MEMOSERV_MODE ircd->memoservmode
+# define BOTSERV_MODE ircd->botservmode
+# define HELPSERV_MODE ircd->helpservmode
+# define OPERSERV_MODE ircd->oprservmode
+# define DEVNULL_MODE ircd->devnullmode
+# define GLOBAL_MODE ircd->globalmode
+# define NICKSERV_ALIAS_MODE ircd->nickservaliasmode
+# define CHANSERV_ALIAS_MODE ircd->chanservaliasmode
+# define MEMOSERV_ALIAS_MODE ircd->memoservaliasmode
+# define BOTSERV_ALIAS_MODE ircd->botservaliasmode
+# define HELPSERV_ALIAS_MODE ircd->helpservaliasmode
+# define OPERSERV_ALIAS_MODE ircd->operservaliasmode
+# define DEVNULL_ALIAS_MODE ircd->devnullaliasmode
+# define GLOBAL_ALIAS_MODE ircd->globalaliasmode
+# define HOSTSERV_ALIAS_MODE ircd->hostservaliasmode
+# define BOTSERV_BOTS_MODE ircd->botserv_bot_mode
+#define CHAN_MAX_SYMBOL ircd->max_symbols
+#define MODESTOREMOVE ircd->modestoremove
+
+#ifdef IRC_HYBRID
+# define HAS_HALFOP
+# define HAS_EXCEPT
+#endif
+
+#ifdef IRC_VIAGRA
+# define HAS_HALFOP
+# define HAS_VHOST
+# define HAS_VIDENT
+# define HAS_EXCEPT
+#endif
+
+#ifdef IRC_BAHAMUT
+# define HAS_NICKIP
+# define HAS_EXCEPT
+# define HAS_SVSHOLD
+#endif
+
+#ifdef IRC_RAGE2
+# define HAS_HALFOP
+# define HAS_EXCEPT
+# define HAS_VHOST
+# define HAS_NICKVHOST
+#endif
+
+#ifdef IRC_PTLINK
+# define HAS_NICKVHOST
+# define HAS_VHOST
+# define HAS_FMODE
+# define HAS_EXCEPT
+#endif
+
+#ifdef IRC_ULTIMATE2
+# define IRC_ULTIMATE /* gotta do this for old mods */
+# define HAS_FMODE
+# define HAS_HALFOP
+# define HAS_LMODE
+# define HAS_VHOST
+# define HAS_VIDENT
+# define HAS_EXCEPT
+#endif
+
+#if defined(IRC_UNREAL31) || defined(IRC_UNREAL32)
+# define IRC_UNREAL /* gotta do this for old mods */
+# define HAS_FMODE
+# define HAS_HALFOP
+# define HAS_LMODE
+# define HAS_NICKVHOST
+# define HAS_VHOST
+# define HAS_VIDENT
+# define HAS_EXCEPT
+#endif
+
+#ifdef IRC_ULTIMATE3
+# define HAS_HALFOP
+# define HAS_VHOST
+# define HAS_NICKVHOST
+# define HAS_VIDENT
+# define HAS_EXCEPT
+#endif
+
+
diff --git a/include/encrypt.h b/include/encrypt.h
new file mode 100644
index 000000000..7ac3d884a
--- /dev/null
+++ b/include/encrypt.h
@@ -0,0 +1,22 @@
+/* Include file for high-level encryption routines.
+ *
+ * (C) 2003-2008 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$
+ *
+ */
+
+typedef struct encryption_ {
+ int (*encrypt)(const char *src, int len, char *dest, int size);
+ int (*encrypt_in_place)(char *buf, int size);
+ int (*encrypt_check_len)(int passlen, int bufsize);
+ int (*decrypt)(const char *src, char *dest, int size);
+ int (*check_password)(const char *plaintext, const char *password);
+} Encryption;
+
diff --git a/include/events.h b/include/events.h
new file mode 100644
index 000000000..77ec0bf8e
--- /dev/null
+++ b/include/events.h
@@ -0,0 +1,64 @@
+/* Prototypes and external variable declarations.
+ *
+ * (C) 2003-2008 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$
+ *
+ */
+
+#define EVENT_START "start"
+#define EVENT_STOP "stop"
+
+#define EVENT_DB_SAVING "db_saving"
+#define EVENT_DB_BACKUP "db_backup"
+#define EVENT_NEWNICK "newnick"
+#define EVENT_BOT_UNASSIGN "bot_unassign"
+#define EVENT_BOT_JOIN "bot_join"
+#define EVENT_BOT_CREATE "bot_create"
+#define EVENT_BOT_CHANGE "bot_change"
+#define EVENT_BOT_FANTASY "bot_command"
+#define EVENT_BOT_FANTASY_NO_ACCESS "bot_command_no_access"
+#define EVENT_BOT_DEL "bot_del"
+#define EVENT_BOT_ASSIGN "bot_assign"
+#define EVENT_BOT_KICK "bot_kick"
+#define EVENT_BOT_BAN "bot_ban"
+#define EVENT_TOPIC_UPDATED "chan_topic_updated"
+#define EVENT_CHAN_EXPIRE "chan_expire"
+#define EVENT_CHAN_REGISTERED "chan_registered"
+#define EVENT_CHAN_DROP "chan_dropped"
+#define EVENT_CHAN_FORBIDDEN "chan_forbidden"
+#define EVENT_CHAN_SUSPENDED "chan_suspended"
+#define EVENT_CHAN_UNSUSPEND "chan_unsuspend"
+#define EVENT_CONNECT "connect"
+#define EVENT_DB_EXPIRE "db_expire"
+#define EVENT_RESTART "restart"
+#define EVENT_RELOAD "reload"
+#define EVENT_SHUTDOWN "shutdown"
+#define EVENT_SIGNAL "signal"
+#define EVENT_NICK_REGISTERED "nick_registered"
+#define EVENT_NICK_DROPPED "nick_dropped"
+#define EVENT_NICK_FORBIDDEN "nick_forbidden"
+#define EVENT_NICK_EXPIRE "nick_expire"
+#define EVENT_CHANGE_NICK "change_nick"
+#define EVENT_USER_LOGOFF "user_logoff"
+#define EVENT_GROUP "nick_group"
+#define EVENT_NICK_IDENTIFY "nick_id"
+#define EVENT_SERVER_SQUIT "server_squit"
+#define EVENT_SERVER_CONNECT "server_connect"
+#define EVENT_DEFCON_LEVEL "defcon_level"
+#define EVENT_NICK_SUSPENDED "nick_suspended"
+#define EVENT_NICK_UNSUSPEND "nick_unsuspend"
+#define EVENT_JOIN_CHANNEL "join_channel"
+#define EVENT_PART_CHANNEL "part_channel"
+#define EVENT_ACCESS_ADD "access_add"
+#define EVENT_ACCESS_CHANGE "access_change"
+#define EVENT_ACCESS_DEL "access_del"
+#define EVENT_ACCESS_CLEAR "access_clear"
+#define EVENT_NICK_LOGOUT "nick_logout"
+#define EVENT_CHAN_KICK "chan_kick"
diff --git a/include/extern.h b/include/extern.h
new file mode 100644
index 000000000..89e03689b
--- /dev/null
+++ b/include/extern.h
@@ -0,0 +1,1406 @@
+/* Prototypes and external variable declarations.
+ *
+ * (C) 2003-2008 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$
+ *
+ */
+
+#ifndef EXTERN_H
+#define EXTERN_H
+
+#ifndef _WIN32
+#define E extern
+#define EI extern
+#else
+#ifndef MODULE_COMPILE
+#define E extern __declspec(dllexport)
+#define EI extern __declspec(dllimport)
+#else
+#define E extern __declspec(dllimport)
+#define EI extern __declspec(dllexport)
+#endif
+#endif
+
+#include "slist.h"
+
+E void ModuleRunTimeDirCleanUp(void);
+
+
+E char *uplink;
+
+/* IRC Variables */
+
+E IRCDVar *ircd;
+E IRCDCAPAB *ircdcap;
+E char *flood_mode_char_set;
+E char *flood_mode_char_remove;
+E int UseTSMODE; /* hack to get around bahamut clones that don't send TSMODE */
+EI unsigned long umodes[128];
+E char csmodes[128];
+E CMMode cmmodes[128];
+E CBMode cbmodes[128];
+E CBModeInfo *cbmodeinfos;
+E CUMode cumodes[128];
+E char *IRCDModule;
+E IRCDProto ircdproto;
+
+/**** actions.c ****/
+
+E void kill_user(char *source, char *user, char *reason);
+E void bad_password(User * u);
+E void sqline(char *mask, char *reason);
+E void common_unban(ChannelInfo * ci, char *nick);
+E void common_svsmode(User * u, char *modes, char *arg);
+
+/**** botserv.c ****/
+
+E BotInfo *botlists[256];
+E int nbots;
+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 *makebot(char *nick);
+E BotInfo *findbot(char *nick);
+E void bot_join(ChannelInfo *ci);
+E void bot_rejoin_all(BotInfo *bi);
+E char *normalizeBuffer(char *);
+E void unassign(User * u, ChannelInfo * ci);
+E void insert_bot(BotInfo * bi);
+
+E void bot_raw_ban(User * requester, ChannelInfo * ci, char *nick, char *reason);
+E void bot_raw_kick(User * requester, ChannelInfo * ci, char *nick, char *reason);
+E void bot_raw_mode(User * requester, ChannelInfo * ci, char *mode, char *nick);
+
+/**** channels.c ****/
+
+E Channel *chanlist[1024];
+
+E void add_ban(Channel * chan, char *mask);
+E void chan_adduser2(User * user, Channel * c);
+E void add_invite(Channel * chan, char *mask);
+E void chan_delete(Channel * c);
+E void del_ban(Channel * chan, char *mask);
+E void chan_set_key(Channel * chan, char *value);
+E void set_limit(Channel * chan, char *value);
+E void del_invite(Channel * chan, char *mask);
+E char *get_key(Channel * chan);
+E char *get_limit(Channel * chan);
+E Channel *chan_create(char *chan, time_t ts);
+E Channel *join_user_update(User * user, Channel * chan, char *name, time_t chants);
+
+E void add_exception(Channel * chan, char *mask);
+E void del_exception(Channel * chan, char *mask);
+E char *get_flood(Channel * chan);
+E void set_flood(Channel * chan, char *value);
+E char *get_redirect(Channel * chan);
+E void set_redirect(Channel * chan, char *value);
+
+
+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 const 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);
+
+E void chan_set_correct_modes(User * user, Channel * c, int give_modes);
+E void restore_unsynced_topics(void);
+
+E Entry *entry_create(char *mask);
+E Entry *entry_add(EList *list, char *mask);
+E void entry_delete(EList *list, Entry *e);
+E EList *list_create();
+E int entry_match(Entry *e, char *nick, char *user, char *host, uint32 ip);
+E int entry_match_mask(Entry *e, char *mask, uint32 ip);
+E Entry *elist_match(EList *list, char *nick, char *user, char *host, uint32 ip);
+E Entry *elist_match_mask(EList *list, char *mask, uint32 ip);
+E Entry *elist_match_user(EList *list, User *u);
+E Entry *elist_find_mask(EList *list, char *mask);
+E long get_memuse(EList *list);
+
+
+#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 LevelInfo levelinfo[];
+
+E void listchans(int count_only, const char *chan);
+E void get_chanserv_stats(long *nrec, long *memuse);
+
+E int delchan(ChannelInfo * ci);
+E void alpha_insert_chan(ChannelInfo * ci);
+E void reset_levels(ChannelInfo * ci);
+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 int is_real_founder(User * user, ChannelInfo * ci);
+
+E void check_modes(Channel * c);
+E int check_valid_admin(User * user, Channel * chan, int servermode);
+E int check_valid_op(User * user, Channel * chan, int servermode);
+E int check_should_op(User * user, char *chan);
+E int check_should_voice(User * user, char *chan);
+E int check_should_halfop(User * user, char *chan);
+E int check_should_owner(User * user, char *chan);
+E int check_should_protect(User * user, char *chan);
+E int check_kick(User * user, char *chan, time_t chants);
+E void record_topic(const char *chan);
+E void restore_topic(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);
+E char *cs_get_flood(ChannelInfo * ci);
+E void cs_set_flood(ChannelInfo * ci, char *value);
+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);
+E char *cs_get_redirect(ChannelInfo * ci);
+E void cs_set_redirect(ChannelInfo * ci, char *value);
+
+E int levelinfo_maxwidth;
+E ChannelInfo *makechan(const char *chan);
+E int is_identified(User * user, ChannelInfo * ci);
+E char *get_mlock_modes(ChannelInfo * ci, int complete);
+
+/**** 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
+#ifdef _WIN32
+char *sockstrerror(int error);
+#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 *NetworkName;
+E int NickLen;
+
+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_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_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 UseStrictPrivMsg;
+E int DumpCore;
+E int LogUsers;
+E int NickRegDelay;
+E int UseSVSHOLD;
+E int UseSVS2MODE;
+E int RestrictOperNicks;
+E int UseTokens;
+E int NewsCount;
+E char *Numeric;
+E int UnRestrictSAdmin;
+E int UseTS6;
+
+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 NSDefFlags;
+E int NSDefLanguage;
+E int NSRegDelay;
+E int NSResendDelay;
+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 NSNickTracking;
+E int NSAddAccessOnReg;
+
+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 MSMemoReceipt;
+
+E int BSDefFlags;
+E int BSKeepData;
+E int BSMinUsers;
+E int BSBadWordsMax;
+E int BSSmartJoin;
+E int BSGentleBWReason;
+E int BSCaseSensitive;
+E char *BSFantasyCharacter;
+
+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 KillonSGline;
+E int KillonSQline;
+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 AddAkiller;
+
+E int parse_directive(Directive * d, char *dir, int ac, char *av[MAXPARAMS], int linenum, int reload, char *s);
+
+/**
+ * Modules Stuff
+ **/
+E char **ModulesAutoload;
+E int ModulesNumber;
+E char **ModulesDelayedAutoload;
+E int ModulesDelayedNumber;
+
+E char **HostServCoreModules;
+E int HostServCoreNumber;
+
+E char **HelpServCoreModules;
+E int HelpServCoreNumber;
+
+E char **MemoServCoreModules;
+E int MemoServCoreNumber;
+
+E char **BotServCoreModules;
+E int BotServCoreNumber;
+
+E char **OperServCoreModules;
+E int OperServCoreNumber;
+
+E char **NickServCoreModules;
+E int NickServCoreNumber;
+
+E char **ChanServCoreModules;
+E int ChanServCoreNumber;
+
+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;
+
+E char *UlineServers;
+E char **Ulines;
+E int NumUlines;
+
+#ifdef USE_RDB
+E int rdb_init();
+E int rdb_open();
+E int rdb_close();
+E char *rdb_quote(char *str);
+E int rdb_tag_table(char *table);
+E int rdb_tag_table_where(char *table, char *clause);
+E int rdb_empty_table(char *table);
+E int rdb_clean_table(char *table);
+E int rdb_clean_table_where(char *table, char *clause);
+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_save_ns_core(NickCore * nc);
+E int rdb_save_ns_alias(NickAlias * na);
+E int rdb_save_ns_req(NickRequest * nr);
+E int rdb_save_cs_info(ChannelInfo * ci);
+E int rdb_save_bs_core(BotInfo * bi);
+E int rdb_save_bs_rdb_core(BotInfo * bi);
+E int rdb_save_hs_core(HostCore * hc);
+E int rdb_save_os_db(unsigned int maxucnt, unsigned int maxutime,
+ SList * ak, SList * sgl, SList * sql, SList * szl);
+E int rdb_save_news(NewsItem * ni);
+E int rdb_save_exceptions(Exception * e);
+E int rdb_load_bs_dbase(void);
+E int rdb_load_hs_dbase(void);
+E int rdb_load_ns_dbase(void);
+E int rdb_load_dbases(void);
+#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;
+E int UseRDB;
+#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;
+
+E long unsigned int UserKey1;
+E long unsigned int UserKey2;
+E long unsigned int UserKey3;
+/**** converter.c ****/
+
+E int convert_ircservices_44(void);
+
+/**** encrypt.c ****/
+E char *EncModule;
+E void initEncryption();
+E int enc_encrypt(const char *src, int len, char *dest, int size);
+E int enc_encrypt_in_place(char *buf, int size);
+E int enc_encrypt_check_len(int passlen, int bufsize);
+E int enc_decrypt(const char *src, char *dest, int size);
+E int enc_check_password(const char *plaintext, const char *password);
+E void encmodule_encrypt(int (*func)(const char *src, int len, char *dest, int size));
+E void encmodule_encrypt_in_place(int (*func)(char *buf, int size));
+E void encmodule_encrypt_check_len(int (*func)(int passlen, int bufsize));
+E void encmodule_decrypt(int (*func)(const char *src, char *dest, int size));
+E void encmodule_check_password(int (*func)(const char *plaintext, const char *password));
+
+/**** helpserv.c ****/
+E void helpserv(User * u, char *buf);
+E void helpserv_init(void);
+
+/**** hostserv.c ****/
+E void get_hostserv_stats(long *nrec, long *memuse);
+E void hostserv_init(void);
+E void addHostCore(char *nick, char *vIdent, char *vhost, char *creator, int32 tmp_time);
+E char *getvIdent(char *nick);
+E char *getvHost(char *nick);
+E int is_host_remover(User * u);
+E int is_host_setter(User *u);
+E HostCore *hostCoreListHead();
+E HostCore *findHostCore(HostCore * head, char *nick, boolean * found);
+E HostCore *createHostCorelist(HostCore * next, char *nick, char *vIdent, char *vHost, char *creator, int32 tmp_time);
+E HostCore *insertHostCore(HostCore * head, HostCore * prev, char *nick, char *vIdent, char *vHost, char *creator, int32 tmp_time);
+E HostCore *deleteHostCore(HostCore * head, HostCore * prev);
+E void set_lastmask(User * u);
+
+/**** init.c ****/
+
+E void introduce_user(const char *user);
+E int init_primary(int ac, char **av);
+E int init_secondary(int ac, char **av);
+E int servernum;
+
+/**** ircd.c ****/
+E void pmodule_set_mod_current_buffer(void (*func) (int ac, char **av));
+E void pmodule_cmd_svsnoop(void (*func) (char *server, int set));
+E void pmodule_cmd_remove_akill(void (*func) (char *user, char *host));
+E void pmodule_cmd_topic(void (*func) (char *whosets, char *chan, char *whosetit, char *topic, time_t when));
+E void pmodule_cmd_vhost_off(void (*func) (User * u));
+E void pmodule_cmd_akill(void (*func) (char *user, char *host, char *who, time_t when, time_t expires, char *reason));
+E void pmodule_cmd_svskill(void (*func) (char *source, char *user, char *buf));
+E void pmodule_cmd_svsmode(void (*func) (User * u, int ac, char **av));
+E void pmodule_cmd_372(void (*func) (char *source, char *msg));
+E void pmodule_cmd_372_error(void (*func) (char *source));
+E void pmodule_cmd_375(void (*func) (char *source));
+E void pmodule_cmd_376(void (*func) (char *source));
+E void pmodule_cmd_nick(void (*func) (char *nick, char *name, char *modes));
+E void pmodule_cmd_guest_nick(void (*func) (char *nick, char *user, char *host, char *real, char *modes));
+E void pmodule_cmd_mode(void (*func) (char *source, char *dest, char *buf));
+E void pmodule_cmd_bot_nick(void (*func) (char *nick, char *user, char *host, char *real, char *modes));
+E void pmodule_cmd_kick(void (*func) (char *source, char *chan, char *user, char *buf));
+E void pmodule_cmd_notice_ops(void (*func) (char *source, char *dest, char *buf));
+E void pmodule_cmd_notice(void (*func) (char *source, char *dest, char *buf));
+E void pmodule_cmd_notice2(void (*func) (char *source, char *dest, char *msg));
+E void pmodule_cmd_privmsg(void (*func) (char *source, char *dest, char *buf));
+E void pmodule_cmd_privmsg2(void (*func) (char *source, char *dest, char *msg));
+E void pmodule_cmd_serv_notice(void (*func) (char *source, char *dest, char *msg));
+E void pmodule_cmd_serv_privmsg(void (*func) (char *source, char *dest, char *msg));
+E void pmodule_cmd_bot_chan_mode(void (*func) (char *nick, char *chan));
+E void pmodule_cmd_351(void (*func) (char *source));
+E void pmodule_cmd_quit(void (*func) (char *source, char *buf));
+E void pmodule_cmd_pong(void (*func) (char *servname, char *who));
+E void pmodule_cmd_join(void (*func) (char *user, char *channel, time_t chantime));
+E void pmodule_cmd_unsqline(void (*func) (char *user));
+E void pmodule_cmd_invite(void (*func) (char *source, char *chan, char *nick));
+E void pmodule_cmd_part(void (*func) (char *nick, char *chan, char *buf));
+E void pmodule_cmd_391(void (*func) (char *source, char *timestr));
+E void pmodule_cmd_250(void (*func) (char *buf));
+E void pmodule_cmd_307(void (*func) (char *buf));
+E void pmodule_cmd_311(void (*func) (char *buf));
+E void pmodule_cmd_312(void (*func) (char *buf));
+E void pmodule_cmd_317(void (*func) (char *buf));
+E void pmodule_cmd_219(void (*func) (char *source, char *letter));
+E void pmodule_cmd_401(void (*func) (char *source, char *who));
+E void pmodule_cmd_318(void (*func) (char *source, char *who));
+E void pmodule_cmd_242(void (*func) (char *buf));
+E void pmodule_cmd_243(void (*func) (char *buf));
+E void pmodule_cmd_211(void (*func) (char *buf));
+E void pmodule_cmd_global(void (*func) (char *source, char *buf));
+E void pmodule_cmd_global_legacy(void (*func) (char *source, char *fmt));
+E void pmodule_cmd_sqline(void (*func) (char *mask, char *reason));
+E void pmodule_cmd_squit(void (*func) (char *servname, char *message));
+E void pmodule_cmd_svso(void (*func) (char *source, char *nick, char *flag));
+E void pmodule_cmd_chg_nick(void (*func) (char *oldnick, char *newnick));
+E void pmodule_cmd_svsnick(void (*func) (char *source, char *guest, time_t when));
+E void pmodule_cmd_vhost_on(void (*func) (char *nick, char *vIdent, char *vhost));
+E void pmodule_cmd_connect(void (*func) (int servernum));
+E void pmodule_cmd_svshold(void (*func) (char *nick));
+E void pmodule_cmd_release_svshold(void (*func) (char *nick));
+E void pmodule_cmd_unsgline(void (*func) (char *mask));
+E void pmodule_cmd_unszline(void (*func) (char *mask));
+E void pmodule_cmd_szline(void (*func) (char *mask, char *reason, char *whom));
+E void pmodule_cmd_sgline(void (*func) (char *mask, char *reason));
+E void pmodule_cmd_unban(void (*func) (char *name, char *nick));
+E void pmodule_cmd_svsmode_chan(void (*func) (char *name, char *mode, char *nick));
+E void pmodule_cmd_svid_umode(void (*func) (char *nick, time_t ts));
+E void pmodule_cmd_nc_change(void (*func) (User * u));
+E void pmodule_cmd_svid_umode2(void (*func) (User * u, char *ts));
+E void pmodule_cmd_svid_umode3(void (*func) (User * u, char *ts));
+E void pmodule_cmd_ctcp(void (*func) (char *source, char *dest, char *buf));
+E void pmodule_cmd_svsjoin(void (*func) (char *source, char *nick, char *chan, char *param));
+E void pmodule_cmd_svspart(void (*func) (char *source, char *nick, char *chan));
+E void pmodule_cmd_swhois(void (*func) (char *source, char *who, char *mask));
+E void pmodule_cmd_eob(void (*func) ());
+E void pmodule_cmd_jupe(void (*func) (char *jserver, char *who, char *reason));
+E void pmodule_set_umode(void (*func) (User * user, int ac, char **av));
+E void pmodule_valid_nick(int (*func) (char *nick));
+E void pmodule_valid_chan(int (*func) (char *chan));
+E void pmodule_flood_mode_check(int (*func) (char *value));
+E void pmodule_ircd_var(IRCDVar * ircdvar);
+E void pmodule_ircd_cap(IRCDCAPAB * cap);
+E void pmodule_ircd_version(char *version);
+E void pmodule_ircd_cbmodeinfos(CBModeInfo * modeinfos);
+E void pmodule_ircd_cumodes(CUMode modes[128]);
+E void pmodule_ircd_flood_mode_char_set(char *mode);
+E void pmodule_ircd_flood_mode_char_remove(char *mode);
+E void pmodule_ircd_cbmodes(CBMode modes[128]);
+E void pmodule_ircd_cmmodes(CMMode modes[128]);
+E void pmodule_ircd_csmodes(char mode[128]);
+E void pmodule_ircd_useTSMode(int use);
+E void pmodule_invis_umode(int mode);
+E void pmodule_oper_umode(int mode);
+E void pmodule_invite_cmode(int mode);
+E void pmodule_secret_cmode(int mode);
+E void pmodule_private_cmode(int mode);
+E void pmodule_key_mode(int mode);
+E void pmodule_limit_mode(int mode);
+
+E int anope_get_secret_mode();
+E int anope_get_invite_mode();
+E int anope_get_key_mode();
+E int anope_get_limit_mode();
+E int anope_get_private_mode();
+E int anope_get_invis_mode();
+E int anope_get_oper_mode();
+
+/**** 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(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 MailInfo *MailMemoBegin(NickCore * nc);
+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_number_dotted[];
+E const char version_build[];
+E 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 nothird;
+E int noexpire;
+E int protocoldebug;
+
+#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);
+E void expire_all(void);
+E void do_backtrace(int show_segheader);
+E void sighandler(int signum);
+E void do_restart_services(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);
+E MemoInfo *getmemoinfo(const char *name, int *ischan, int *isforbid);
+E void memo_send(User * u, char *name, char *text, int z);
+E int delmemo(MemoInfo * mi, int num);
+
+/**** messages.c ****/
+
+E int m_nickcoll(char *user);
+E int m_away(char *source, char *msg);
+E int m_kill(char *nick, char *msg);
+E int m_motd(char *source);
+E int m_privmsg(char *source, char *receiver, char *msg);
+E int m_stats(char *source, int ac, char **av);
+E int m_whois(char *source, char *who);
+E int m_time(char *source, int ac, char **av);
+E int m_version(char *source, int ac, char **av);
+
+
+/**** misc.c ****/
+
+E int toupper(char);
+E int tolower(char);
+E char *strscpy(char *d, const char *s, size_t len);
+#ifndef HAVE_STRLCPY
+E size_t strlcpy(char *, const char *, size_t);
+#endif
+#ifndef HAVE_STRLCAT
+E size_t strlcat(char *, const char *, size_t);
+#endif
+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);
+E void protocol_debug(char *source, char *cmd, int argc, char **argv);
+E int doValidHost(const char *host, int type);
+
+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(const 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 char *stripModePrefix(const char *str);
+E int myNumToken(const char *str, const char dilim);
+E void doCleanBuffer(char *str);
+E void EnforceQlinedNick(char *nick, char *killer);
+E int nickIsServices(char *nick, int bot);
+
+E void add_entropy_userkeys(void);
+E void rand_init(void);
+E unsigned char getrandom8(void);
+E u_int16_t getrandom16(void);
+E u_int32_t getrandom32(void);
+
+E char *str_signed(unsigned char *str);
+
+E void ntoa(struct in_addr addr, char *ipaddr, int len);
+
+E char **buildStringList(char *src, int *number);
+E void binary_to_hex(unsigned char *bin, char *hex, int length);
+
+E uint32 cidr_to_netmask(uint16 cidr);
+E uint16 netmask_to_cidr(uint32 mask);
+
+E int str_is_wildcard(const char *str);
+E int str_is_pure_wildcard(const char *str);
+
+E uint32 str_is_ip(char *str);
+E int str_is_cidr(char *str, uint32 * ip, uint32 * mask, char **host);
+
+
+/**** modules.c ****/
+E void modules_core_init(int number, char **list);
+E void modules_unload_all(boolean fini, boolean unload_proto); /* Read warnings near function source */
+E void moduleCallBackRun(void);
+E void moduleCleanStruct(ModuleData **moduleData);
+E void ModuleDatabaseBackup(char *dbname);
+E void ModuleRemoveBackups(char *dbname);
+
+/**** news.c ****/
+
+E int32 nnews, news_size;
+E NewsItem *news;
+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 NickRequest *findrequestnick(const char *nick);
+E int delnickrequest(NickRequest * nr);
+E unsigned int guestnum;
+E void insert_requestnick(NickRequest * nr);
+E void alpha_insert_alias(NickAlias * na);
+E void insert_core(NickCore * nc);
+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 collide(NickAlias * na, int from_timeout);
+E void del_ns_timeout(NickAlias * na, int type);
+E void change_core_display(NickCore * nc, char *newdisplay);
+E void release(NickAlias * na, int from_timeout);
+E int do_setmodes(User * u);
+E int should_mode_change(int16 status, int16 mode);
+
+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);
+EI 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);
+E void nsStartNickTracking(User * u);
+E void nsStopNickTracking(User * u);
+E int nsCheckNickTracking(User *u);
+
+E int group_identified(User * u, NickCore * nc);
+E int is_on_access(User * u, NickCore * nc);
+
+/**** operserv.c ****/
+
+E SList akills, sglines, sqlines, szlines;
+E SList servadmins;
+E SList servopers;
+
+E int DefConModesSet;
+E uint32 DefConModesOn;
+E uint32 DefConModesOff;
+E ChannelInfo DefConModesCI;
+
+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_root(NickCore * nc);
+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(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, ...);
+
+E int add_sgline(User *u, char *mask, const char *by, const time_t expires, const char *reason);
+E int check_sgline(char *nick, const char *realname);
+E void expire_sglines(void);
+
+E int add_sqline(User *u, char *mask, const char *by, const time_t expires, const char *reason);
+E int check_sqline(char *nick, int nick_change);
+E void expire_sqlines(void);
+E int check_chan_sqline(const char *chan);
+
+E int add_szline(User * u, char *mask, const char *by,
+ const time_t expires, const char *reason);
+E void expire_szlines(void);
+E int check_szline(char *nick, char *ip);
+
+E Server *server_global(Server * s, char *msg);
+
+E int OSOpersOnly;
+E time_t DefContimer;
+E void runDefCon(void);
+E int defconParseModeString(const char *str);
+
+/**** 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 delete_ignore(const char *nick);
+E int clear_ignores();
+
+E int split_buf(char *buf, char ***argv, int colon_special);
+E void process(void);
+
+/**** 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 notice_server(char *source, Server * s, char *fmt, ...)
+ FORMAT(printf,3,4);
+E void notice_user(char *source, User *u, const char *fmt, ...)
+ FORMAT(printf,3,4);
+
+E void notice_list(char *source, char *dest, char **text);
+E void notice_lang(char *source, User *dest, int message, ...);
+E void notice_help(char *source, User *dest, int message, ...);
+
+
+/**** servers.c ****/
+
+E Server *servlist;
+E Server *me_server;
+E Server *serv_uplink;
+E uint32 uplink_capab;
+E CapabInfo capab_info[];
+
+E Server *first_server(int flags);
+E Server *next_server(int flags);
+
+E int is_ulined(char *server);
+E int is_sync(Server *server);
+
+E Server *new_server(Server * uplink, const char *name, const char *desc,
+ uint16 flags, char *suid);
+
+E Server *findserver(Server *s, const char *name);
+
+E void do_server(const char *source, char *servername, char *hops, char *descript, char *numeric);
+E void do_squit(const char *source, int ac, char **av);
+E void capab_parse(int ac, char **av);
+E int anope_check_sync(const char *name);
+
+E void finish_sync(Server *serv, int sync_links);
+
+E void ts6_uid_init(void);
+E void ts6_uid_increment(unsigned int slot);
+E char *ts6_uid_retrieve(void);
+
+/**** sessions.c ****/
+
+E Exception *exceptions;
+E int16 nexceptions;
+
+E Session *sessionlist[1024];
+E int32 nsessions;
+
+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(char *nick, char *host, char *hostip);
+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);
+
+E Session *findsession(const char *host);
+
+E Exception *find_host_exception(const char *host);
+E Exception *find_hostip_exception(const char *host, const char *hostip);
+E int exception_add(User * u, const char *mask, const int limit,
+ const char *reason, const char *who,
+ const time_t expires);
+
+/**** slist.c ****/
+E int slist_add(SList *slist, void *item);
+E void slist_clear(SList *slist, int free);
+E int slist_delete(SList *slist, int index);
+E int slist_delete_range(SList *slist, char *range, slist_delcheckcb_t cb, ...);
+E int slist_enum(SList *slist, char *range, slist_enumcb_t cb, ...);
+E int slist_full(SList *slist);
+E int slist_indexof(SList *slist, void *item);
+E void slist_init(SList *slist);
+E void slist_pack(SList *slist);
+E int slist_remove(SList *slist, void *item);
+E int slist_setcapacity(SList *slist, int16 capacity);
+
+/**** sockutil.c ****/
+
+E int32 total_read, total_written;
+E int32 read_buffer_len(void);
+E int32 write_buffer_len(void);
+
+E int sgetc(ano_socket_t s);
+E char *sgets(char *buf, int len, ano_socket_t s);
+E char *sgets2(char *buf, int len, ano_socket_t s);
+E int sread(ano_socket_t s, char *buf, int len);
+E int sputs(char *str, ano_socket_t s);
+E int sockprintf(ano_socket_t s, char *fmt, ...);
+E int conn(const char *host, int port, const char *lhost, int lport);
+E void disconn(ano_socket_t s);
+
+/**** users.c ****/
+
+E User *userlist[1024];
+
+E int32 usercnt, opcnt;
+E uint32 maxusercnt;
+E time_t maxusertime;
+
+E void delete_user(User *user);
+
+E void get_user_stats(long *nusers, long *memuse);
+E User *finduser(const char *nick);
+E User *firstuser(void);
+E User *nextuser(void);
+
+E User *find_byuid(const char *uid);
+E User *first_uid(void);
+E User *next_uid(void);
+E Uid *new_uid(const char *nick, char *uid);
+E Uid *find_uid(const char *nick);
+E Uid *find_nickuid(const char *uid);
+E Server *findserver_uid(Server * s, const char *name);
+E char *TS6SID;
+E char *TS6UPLINK;
+
+E void update_host(User * user);
+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);
+
+E User *do_nick(const char *source, char *nick, char *username, char *host,
+ char *server, char *realname, time_t ts, uint32 svid, uint32 ip, char *vhost, char *uid);
+
+E void do_umode(const char *source, int ac, char **av);
+E void do_umode2(const char *source, int ac, char **av);
+E void do_quit(const char *source, int ac, char **av);
+E void do_kill(char *source, char *reason);
+
+E int is_oper(User * user);
+E int is_protected(User * user);
+
+E int is_excepted(ChannelInfo * ci, User * user);
+E int is_excepted_mask(ChannelInfo * ci, char *mask);
+
+E int match_usermask(const char *mask, User * user);
+E int match_userip(const char *mask, User * user, char *host);
+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 char *db_mysql_quote_buffer(char *sql, int size);
+E int db_mysql_try(const char *fmt, ...);
+E int db_mysql_save_ns_core(NickCore * nc);
+E int db_mysql_save_ns_alias(NickAlias * na);
+E int db_mysql_save_ns_req(NickRequest * nr);
+E int db_mysql_save_cs_info(ChannelInfo * ci);
+E int db_mysql_save_os_db(unsigned int maxucnt, unsigned int maxutime,
+ SList * ak, SList * sgl, SList * sql,
+ SList * szl);
+E int db_mysql_save_news(NewsItem * ni);
+E int db_mysql_save_exceptions(Exception * e);
+E int db_mysql_save_hs_core(HostCore * hc);
+E int db_mysql_save_bs_core(BotInfo * bi);
+E int db_mysql_load_bs_dbase(void);
+E int db_mysql_load_hs_dbase(void);
+E int db_mysql_load_ns_dbase(void);
+E int db_mysql_load_ns_req_dbase(void);
+E int db_mysql_load_cs_dbase(void);
+E int db_mysql_load_os_dbase(void);
+E int db_mysql_load_exceptions(void);
+E int db_mysql_load_news(void);
+E unsigned int mysql_rand(void);
+#endif
+
+E void privmsg(char *source, char *dest, const char *fmt, ...);
+E void notice(char *source, char *dest, const char *fmt, ...);
+
+/******************************************************************************/
+
+E int anope_set_mod_current_buffer(int ac, char **av);
+
+E void anope_cmd_211(const char *fmt, ...); /* 211 */
+E void anope_cmd_219(char *source, char *who); /* 219 */
+E void anope_cmd_242(const char *fmt, ...); /* 242 */
+E void anope_cmd_243(const char *fmt, ...); /* 243 */
+E void anope_cmd_250(const char *fmt, ...); /* 250 */
+E void anope_cmd_307(const char *fmt, ...); /* 307 */
+E void anope_cmd_311(const char *fmt, ...); /* 311 */
+E void anope_cmd_312(const char *fmt, ...); /* 312 */
+E void anope_cmd_317(const char *fmt, ...); /* 317 */
+E void anope_cmd_318(char *source, char *who); /* 318 */
+E void anope_cmd_351(char *source); /* 351 */
+E void anope_cmd_372(char *source, char *msg); /* 372 */
+E void anope_cmd_372_error(char *source); /* 372 */
+E void anope_cmd_375(char *source); /* 375 */
+E void anope_cmd_376(char *source); /* 376 */
+E void anope_cmd_391(char *source, char *timestr); /* 391 */
+E void anope_cmd_401(char *source, char *who); /* 401 */
+E void anope_cmd_akill(char *user, char *host, char *who, time_t when, time_t expires, char *reason); /* AKILL */
+E void anope_cmd_capab(); /* CAPAB */
+E void anope_cmd_chghost(char *nick, char *vhost); /* CHGHOST */
+E void anope_cmd_chgident(char *nick, char *vIdent); /* CHGIDENT */
+E void anope_cmd_vhost_on(char *nick, char *vIdent, char *vhost); /* CHGHOST + CHGIDENT */
+E void anope_cmd_vhost_off(User *u);
+E void anope_cmd_connect(int servernum); /* Connect */
+E void anope_cmd_ea(); /* EA */
+E void anope_cmd_global(char *source, const char *fmt, ...); /* GLOBOPS */
+E void anope_cmd_invite(char *source, char *chan, char *nick); /* INVITE */
+E void anope_cmd_join(char *user, char *channel, time_t chantime); /* JOIN */
+E void anope_cmd_kick(char *source, char *chan, char *user, const char *fmt, ...); /* KICK */
+E void anope_cmd_mode(char *source, char *dest, const char *fmt, ...); /* MODE */
+E void anope_cmd_tmode(char *source, char *dest, const char *fmt, ...); /* TMODE */
+E void anope_cmd_unban(char *name, char *nick); /* MODE -b */
+E void anope_cmd_bot_chan_mode(char *nick, char *chan); /* MODE BotServ */
+E void anope_cmd_netinfo(int ac, char **av); /* NETINFO */
+E void anope_cmd_nick(char *nick, char *name, char *mode); /* NICK */
+E void anope_cmd_chg_nick(char *oldnick, char *newnick); /* NICK */
+E void anope_cmd_bot_nick(char *nick, char *user,char *host,char *real,char *modes); /* NICK */
+E void anope_cmd_guest_nick(char *nick, char *user,char *host,char *real,char *modes); /* NICK */
+E void anope_cmd_notice(char *source, char *dest, const char *fmt, ...); /* NOTICE */
+E void anope_cmd_notice_ops(char *source, char *dest, const char *fmt, ...); /* NOTICE */
+E void anope_cmd_notice2(char *source, char *dest, char *msg); /* NOTICE */
+E void anope_cmd_serv_notice(char *source, char *dest, char *msg); /* NOTICE */
+E void anope_cmd_part(char *nick, char *chan, const char *fmt, ...); /* PART */
+E void anope_cmd_pass(char *pass); /* PASS */
+E void anope_cmd_pong(char *servname, char *who); /* PONG */
+E void anope_cmd_privmsg(char *source, char *dest, const char *fmt, ...); /* PRIVMSG */
+E void anope_cmd_action(char *source, char *dest, const char *fmt, ...); /* PRIVMSG */
+E void anope_cmd_privmsg2(char *source, char *dest, char *msg); /* PRIVMSG */
+E void anope_cmd_serv_privmsg(char *source, char *dest, char *msg); /* PRIVMSG */
+E void anope_cmd_protoctl(); /* PROTOCTL */
+E void anope_cmd_quit(char *source, const char *fmt, ...); /* QUIT */
+E void anope_cmd_remove_akill(char *user, char *host); /* RAKILL */
+E void anope_cmd_server(char *servname, int hop, char *descript); /* SERVER */
+E void anope_cmd_sgline(char *mask, char *reason); /* SGLINE */
+E void anope_cmd_sqline(char *mask, char *reason); /* SQLINE */
+E void anope_cmd_szline(char *mask, char *reason, char *whom); /* SZLINE */
+E void anope_cmd_squit(char *servname, char *message); /* SQUIT */
+E void anope_cmd_svinfo(); /* SVINFO */
+E void anope_cmd_svsadmin(char *server, int set); /* SVSADMIN */
+E void anope_cmd_svshold(char *nick); /* SVSHOLD */
+E void anope_cmd_release_svshold(char *nick); /* SVSHOLD */
+E void anope_cmd_svsinfo(); /* SVSINFO */
+E void anope_cmd_svsjoin(char *source, char *nick,char *chan, char *param); /* SVSJOIN */
+E void anope_cmd_svskill(char *source,char *user, const char *fmt, ...); /* SVSKILL */
+E void anope_cmd_svsmode(User * u, int ac, char **av); /* SVSMODE */
+E void anope_cmd_svsmode_chan(char *name, char *mode, char *nick); /* SVSMODE */
+E void anope_cmd_svsnick(char *nick,char *newnick, time_t when); /* SVSNICK */
+E void anope_cmd_svsnoop(char *server, int set); /* SVSNOOP */
+E void anope_cmd_svso(char *source,char *nick, char *flag); /* SVSO */
+E void anope_cmd_svspart(char *source, char *nick,char *chan); /* SVSPART */
+E void anope_cmd_swhois(char *source, char *who, char *mask); /* SWHOIS */
+E void anope_cmd_topic(char *whosets, char *chan, char *whosetit, char *topic, time_t when); /* TOPIC */
+E void anope_cmd_unsgline(char *mask); /* UNSGLINE */
+E void anope_cmd_unsqline(char *user); /* UNSQLINE */
+E void anope_cmd_unszline(char *mask); /* UNSZLINE */
+E void anope_cmd_eob(); /* EOB - end of burst */
+E void anope_cmd_burst(); /* BURST - use eob to send burst 0 */
+E void anope_cmd_svswatch(char *sender, char *nick, char *parm);
+E void anope_cmd_ctcp(char *source, char *dest, const char *fmt, ...); /* CTCP */
+
+EI int anope_event_482(char *source, int ac, char **av);
+EI int anope_event_436(char *source, int ac, char **av);
+EI int anope_event_away(char *source, int ac, char **av);
+EI int anope_event_ping(char *source, int ac, char **av);
+EI int anope_event_motd(char *source, int ac, char **av);
+EI int anope_event_join(char *source, int ac, char **av);
+EI int anope_event_kick(char *source, int ac, char **av);
+EI int anope_event_kill(char *source, int ac, char **av);
+EI int anope_event_mode(char *source, int ac, char **av);
+EI int anope_event_tmode(char *source, int ac, char **av);
+EI int anope_event_quit(char *source, int ac, char **av);
+EI int anope_event_squit(char *source, int ac, char **av);
+EI int anope_event_topic(char *source, int ac, char **av);
+EI int anope_event_whois(char *source, int ac, char **av);
+EI int anope_event_part(char *source, int ac, char **av);
+EI int anope_event_server(char *source, int ac, char **av);
+EI int anope_event_sid(char *source, int ac, char **av);
+EI int anope_event_nick(char *source, int ac, char **av);
+EI int anope_event_bmask(char *source, int ac, char **av);
+EI int anope_event_gnotice(char *source, int ac, char **av);
+EI int anope_event_privmsg(char *source, int ac, char **av);
+EI int anope_event_capab(char *source, int ac, char **av);
+EI int anope_event_sjoin(char *source, int ac, char **av);
+EI int anope_event_cs(char *source, int ac, char **av);
+EI int anope_event_hs(char *source, int ac, char **av);
+EI int anope_event_ms(char *source, int ac, char **av);
+EI int anope_event_ns(char *source, int ac, char **av);
+EI int anope_event_os(char *source, int ac, char **av);
+EI int anope_event_vs(char *source, int ac, char **av);
+EI int anope_event_svinfo(char *source, int ac, char **av);
+EI int anope_event_chghost(char *source, int ac, char **av);
+EI int anope_event_sethost(char *source, int ac, char **av);
+EI int anope_event_chgident(char *source, int ac, char **av);
+EI int anope_event_setident(char *source, int ac, char **av);
+EI int anope_event_chgname(char *source, int ac, char **av);
+EI int anope_event_setname(char *source, int ac, char **av);
+EI int anope_event_svsinfo(char *source, int ac, char **av);
+EI int anope_event_snick(char *source, int ac, char **av);
+EI int anope_event_vhost(char *source, int ac, char **av);
+EI int anope_event_tkl(char *source, int ac, char **av);
+EI int anope_event_eos(char *source, int ac, char **av);
+EI int anope_event_eob(char *source, int ac, char **av);
+EI int anope_event_pass(char *source, int ac, char **av);
+EI int anope_event_netinfo(char *source, int ac, char **av);
+EI int anope_event_error(char *source, int ac, char **av);
+EI int anope_event_eb(char *source, int ac, char **av);
+EI int anope_event_netctrl(char *source, int ac, char **av);
+EI int anope_event_notice(char *source, int ac, char **av);
+EI int anope_event_snotice(char *source, int ac, char **av);
+EI int anope_event_sqline(char *source, int ac, char **av);
+EI int anope_event_smo(char *source, int ac, char **av);
+EI int anope_event_myid(char *source, int ac, char **av);
+EI int anope_event_vctrl(char *source, int ac, char **av);
+EI int anope_event_tctrl(char *source, int ac, char **av);
+EI int anope_event_snetinfo(char *source, int ac, char **av);
+EI int anope_event_umode2(char *source, int ac, char **av);
+EI int anope_event_globops(char *source, int ac, char **av);
+EI int anope_event_swhois(char *source, int ac, char **av);
+EI int anope_event_burst(char *source, int ac, char **av);
+EI int anope_event_luserslock(char *source, int ac, char **av);
+EI int anope_event_admin(char *source, int ac, char **av);
+EI int anope_event_credits(char *source, int ac, char **av);
+EI int anope_event_rehash(char *source, int ac, char **av);
+EI int anope_event_sdesc(char *source, int ac, char **av);
+EI int anope_event_netglobal(char *source, int ac, char **av);
+EI int anope_event_invite(char *source, int ac, char **av);
+E int anope_event_null(char *source, int ac, char **av);
+
+E void anope_set_umode(User * user, int ac, char **av);
+E void anope_cmd_svid_umode(char *nick, time_t ts);
+E void anope_cmd_svid_umode2(User *u, char *ts);
+E void anope_cmd_svid_umode3(User *u, char *ts);
+E void anope_cmd_nc_change(User *u);
+E int anope_flood_mode_check(char *value);
+
+E void anope_cmd_jupe(char *jserver, char *who, char *reason);
+
+E void anope_cmd_global_legacy(char *source, char *fmt);
+E void wallops(char *source, const char *fmt, ...);
+
+E int anope_valid_nick(char *nick);
+E int anope_valid_chan(char *chan);
+
+E char *common_get_vident(User *u);
+E char *common_get_vhost(User *u);
+E char *send_token(char *token1, char *token2);
+E char *base64enc(long i);
+E long base64dec(char *b64);
+E long base64dects(char *ts);
+E int b64_encode(char *src, size_t srclength, char *target, size_t targsize);
+E int b64_decode(char *src, char *target, size_t targsize);
+E char *encode_ip(unsigned char *ip);
+E int decode_ip(char *buf);
+
+#define Anope_Free(x) if ((x) != NULL) free(x)
+
+E char *host_resolve(char *host);
+
+E void event_message_process(char *eventbuf);
+E void eventprintf(char *fmt, ...);
+E void event_process_hook(const char *name, int argc, char **argv);
+E void send_event(const char *name, int argc, ...);
+
+#ifdef _WIN32
+E char *GetWindowsVersion(void) ;
+E int SupportedWindowsVersion(void);
+#endif
+
+#endif /* EXTERN_H */
diff --git a/include/makefile.win32 b/include/makefile.win32
new file mode 100644
index 000000000..5d0b9b49b
--- /dev/null
+++ b/include/makefile.win32
@@ -0,0 +1,25 @@
+# Make file for Win32
+#
+# (C) 2003-2008 Anope Team
+# Contact us at info@anope.org
+#
+# Please read COPYING and README for further details.
+#
+# Based on the original code of Epona by Lara.
+# Based on the original code of Services by Andy Church.
+#
+# $Id$
+#
+
+###########################################################################
+
+clean:
+ -@erase language.h
+
+spotless: clean
+ -@erase sysconf.h version.h
+
+distclean: spotless
+
+
+FRC:
diff --git a/include/messages.h b/include/messages.h
new file mode 100644
index 000000000..47ac9cda7
--- /dev/null
+++ b/include/messages.h
@@ -0,0 +1,23 @@
+/* Declarations of IRC message structures, variables, and functions.
+ *
+ * (C) 2003-2008 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$
+ *
+ */
+
+/*************************************************************************/
+#include "modules.h"
+
+extern Message messages[];
+extern void moduleAddMsgs(void);
+extern Message *find_message(const char *name);
+
+
+/*************************************************************************/
diff --git a/include/module.h b/include/module.h
new file mode 100644
index 000000000..bd5171c8b
--- /dev/null
+++ b/include/module.h
@@ -0,0 +1,16 @@
+#ifndef MODULE_H
+#define MODULE_H
+
+#include "services.h"
+#include "commands.h"
+#include "language.h"
+#include "modules.h"
+#include "depricated.h"
+#include "version.h"
+
+#define MOD_UNIQUE 0
+#define MOD_HEAD 1
+#define MOD_TAIL 2
+
+#endif
+
diff --git a/include/modules.h b/include/modules.h
new file mode 100644
index 000000000..c04138a23
--- /dev/null
+++ b/include/modules.h
@@ -0,0 +1,383 @@
+/* Modular support
+ *
+ * (C) 2003-2008 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$
+ */
+
+#ifndef MODULES_H
+#define MODULES_H
+
+#include <time.h>
+#include "services.h"
+#include <stdio.h>
+
+/* Cross OS compatibility macros */
+#ifdef _WIN32
+typedef HMODULE ano_module_t;
+
+#define ano_modopen(file) LoadLibrary(file)
+/* ano_moderr in modules.c */
+#define ano_modsym(file, symbol) (void *)GetProcAddress(file, symbol)
+#define ano_modclose(file) FreeLibrary(file) ? 0 : 1
+#define ano_modclearerr() SetLastError(0)
+#define MODULE_EXT ".dll"
+
+#else
+typedef void * ano_module_t;
+
+#define ano_modopen(file) dlopen(file, RTLD_LAZY)
+#define ano_moderr() dlerror()
+#define ano_modsym(file, symbol) dlsym(file, DL_PREFIX symbol)
+#define ano_modclose(file) dlclose(file)
+/* We call dlerror() here because it clears the module error after being
+ * called. This previously read 'errno = 0', but that didn't work on
+ * all POSIX-compliant architectures. This way the error is guaranteed
+ * to be cleared, POSIX-wise. -GD
+ */
+#define ano_modclearerr() dlerror()
+#define MODULE_EXT ".so"
+
+#endif
+
+
+/*************************************************************************/
+#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
+#define EVENT EVENT_cmdTable
+#define EVENTHOOKS HOOK_cmdTable
+
+/**********************************************************************
+ * 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
+ #define MOD_ERR_NOSERVICE 12
+ #define MOD_ERR_NO_MOD_NAME 13
+
+/*************************************************************************/
+/* Macros to export the Module API functions/variables */
+#ifndef _WIN32
+#define MDE
+#else
+#ifndef MODULE_COMPILE
+#define MDE __declspec(dllexport)
+#else
+#define MDE __declspec(dllimport)
+#endif
+#endif
+/*************************************************************************/
+
+typedef enum { CORE,PROTOCOL,THIRD,SUPPORTED,QATESTED,ENCRYPTION } MODType;
+typedef enum { MOD_OP_LOAD, MOD_OP_UNLOAD } ModuleOperation;
+
+/*************************************************************************/
+/* Structure for information about a *Serv command. */
+
+typedef struct Command_ Command;
+typedef struct CommandHash_ CommandHash;
+typedef struct Module_ Module;
+typedef struct ModuleLang_ ModuleLang;
+typedef struct ModuleHash_ ModuleHash;
+typedef struct ModuleQueue_ ModuleQueue;
+typedef struct Message_ Message;
+typedef struct MessageHash_ MessageHash;
+typedef struct ModuleCallBack_ ModuleCallBack;
+typedef struct EvtMessage_ EvtMessage;
+typedef struct EvtMessageHash_ EvtMessageHash;
+typedef struct EvtHook_ EvtHook;
+typedef struct EvtHookHash_ EvtHookHash;
+
+extern MDE CommandHash *HOSTSERV[MAX_CMD_HASH];
+extern MDE CommandHash *BOTSERV[MAX_CMD_HASH];
+extern MDE CommandHash *MEMOSERV[MAX_CMD_HASH];
+extern MDE CommandHash *NICKSERV[MAX_CMD_HASH];
+extern MDE CommandHash *CHANSERV[MAX_CMD_HASH];
+extern MDE CommandHash *HELPSERV[MAX_CMD_HASH];
+extern MDE CommandHash *OPERSERV[MAX_CMD_HASH];
+extern MDE MessageHash *IRCD[MAX_CMD_HASH];
+extern MDE ModuleHash *MODULE_HASH[MAX_CMD_HASH];
+extern MDE EvtMessageHash *EVENT[MAX_CMD_HASH];
+extern MDE EvtHookHash *EVENTHOOKS[MAX_CMD_HASH];
+
+struct ModuleLang_ {
+ int argc;
+ char **argv;
+};
+
+struct Module_ {
+ char *name;
+ char *filename;
+ void *handle;
+ time_t time;
+ char *version;
+ char *author;
+
+ MODType type;
+
+ 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];
+ ModuleLang lang[NUM_LANGS];
+};
+
+struct ModuleHash_ {
+ char *name;
+ Module *m;
+ ModuleHash *next;
+};
+
+struct ModuleQueue_ {
+ Module *m;
+ ModuleOperation op;
+ User *u;
+
+ ModuleQueue *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;
+};
+
+struct EvtMessage_ {
+ char *name;
+ int (*func)(char *source, int ac, char **av);
+ int core;
+ char *mod_name;
+ EvtMessage *next;
+};
+
+struct EvtMessageHash_ {
+ char *name;
+ EvtMessage *evm;
+ EvtMessageHash *next;
+};
+
+
+struct EvtHook_ {
+ int (*func)(int argc, char **argv);
+ int core;
+ char *name;
+ char *mod_name;
+ EvtHook *next;
+};
+
+struct EvtHookHash_ {
+ char *name;
+ EvtHook *evh;
+ EvtHookHash *next;
+};
+
+
+/*************************************************************************/
+/* Module Managment Functions */
+MDE 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 */
+MDE Module *findModule(char *name); /* Find a module */
+int loadModule(Module *m,User *u); /* Load the given module into the program */
+int encryption_module_init(void); /* Load the encryption module */
+int protocol_module_init(void); /* Load the IRCD Protocol Module up*/
+int unloadModule(Module *m, User *u); /* Unload the given module from the pro */
+int prepForUnload(Module *m); /* Prepare the module for unload */
+MDE void moduleAddVersion(const char *version);
+MDE void moduleAddAuthor(const char *author);
+void modules_init(void);
+void modules_delayed_init(void);
+void moduleCallBackPrepForUnload(char *mod_name);
+MDE void moduleCallBackDeleteEntry(ModuleCallBack * prev);
+MDE char *moduleGetLastBuffer(void);
+MDE void moduleSetHelpHelp(void (*func) (User * u));
+MDE void moduleDisplayHelp(int service, User *u);
+MDE void moduleSetHostHelp(void (*func) (User * u));
+MDE void moduleSetOperHelp(void (*func) (User * u));
+MDE void moduleSetBotHelp(void (*func) (User * u));
+MDE void moduleSetMemoHelp(void (*func) (User * u));
+MDE void moduleSetChanHelp(void (*func) (User * u));
+MDE void moduleSetNickHelp(void (*func) (User * u));
+MDE int moduleAddHelp(Command * c, int (*func) (User * u));
+MDE int moduleAddRegHelp(Command * c, int (*func) (User * u));
+MDE int moduleAddOperHelp(Command * c, int (*func) (User * u));
+MDE int moduleAddAdminHelp(Command * c, int (*func) (User * u));
+MDE int moduleAddRootHelp(Command * c, int (*func) (User * u));
+MDE void moduleSetType(MODType type);
+extern MDE Module *mod_current_module;
+extern MDE char *mod_current_module_name;
+extern MDE char *mod_current_buffer;
+extern MDE int mod_current_op;
+extern MDE User *mod_current_user;
+
+MDE int moduleGetConfigDirective(Directive *h);
+/*************************************************************************/
+/*************************************************************************/
+/* Command Managment Functions */
+MDE 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);
+MDE int destroyCommand(Command *c); /* destroy a command */
+MDE int addCoreCommand(CommandHash *cmdTable[], Command *c); /* Add a command to a command table */
+MDE int moduleAddCommand(CommandHash *cmdTable[], Command *c, int pos);
+MDE int addCommand(CommandHash *cmdTable[], Command *c,int pos);
+MDE int delCommand(CommandHash *cmdTable[], Command *c,char *mod_name); /* Del a command from a cmd table */
+MDE 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 */
+MDE Message *createMessage(const char *name,int (*func)(char *source, int ac, char **av));
+Message *findMessage(MessageHash *msgTable[], const char *name); /* Find a Message */
+MDE int addMessage(MessageHash *msgTable[], Message *m, int pos); /* Add a Message to a Message table */
+MDE int addCoreMessage(MessageHash *msgTable[], Message *m); /* Add a Message to a Message table */
+MDE int moduleAddMessage(Message *m, int pos);
+int delMessage(MessageHash *msgTable[], Message *m, char *mod_name); /* Del a Message from a msg table */
+MDE int moduleDelMessage(char *name);
+int destroyMessage(Message *m); /* destroy a Message*/
+
+/*************************************************************************/
+
+MDE EvtMessage *createEventHandler(char *name, int (*func) (char *source, int ac, char **av));
+EvtMessage *findEventHandler(EvtMessageHash * msgEvtTable[], const char *name);
+int addCoreEventHandler(EvtMessageHash * msgEvtTable[], EvtMessage * evm);
+MDE int moduleAddEventHandler(EvtMessage * evm);
+MDE int moduleEventDelHandler(char *name);
+int delEventHandler(EvtMessageHash * msgEvtTable[], EvtMessage * evm, char *mod_name);
+int destroyEventHandler(EvtMessage * evm);
+int addEventHandler(EvtMessageHash * msgEvtTable[], EvtMessage * evm);
+
+MDE EvtHook *createEventHook(char *name, int (*func) (int argc, char **argv));
+EvtHook *findEventHook(EvtHookHash * HookEvtTable[], const char *name);
+int addCoreEventHook(EvtHookHash * HookEvtTable[], EvtHook * evh);
+MDE int moduleAddEventHook(EvtHook * evh);
+MDE int moduleEventDelHook(const char *name);
+int delEventHook(EvtHookHash * HookEvtTable[], EvtHook * evh, char *mod_name);
+int destroyEventHook(EvtHook * evh);
+extern char *mod_current_evtbuffer;
+
+MDE void moduleInsertLanguage(int langNumber, int ac, char **av);
+MDE void moduleNoticeLang(char *source, User *u, int number, ...);
+MDE char *moduleGetLangString(User * u, int number);
+MDE void moduleDeleteLanguage(int langNumber);
+
+/*************************************************************************/
+
+MDE int moduleAddCallback(char *name,time_t when,int (*func)(int argc, char *argv[]),int argc, char **argv);
+MDE void moduleDelCallback(char *name);
+
+MDE char *moduleGetData(ModuleData **md, char *key); /* Get the value for this key from this struct */
+MDE int moduleAddData(ModuleData **md, char *key, char *value); /* Set the value for this key for this struct */
+MDE void moduleDelData(ModuleData **md, char *key); /* Delete this key/value pair */
+MDE void moduleDelAllData(ModuleData **md); /* Delete all key/value pairs for this module for this struct */
+void moduleDelAllDataMod(Module *m); /* remove all module data from all structs for this module */
+int moduleDataDebug(ModuleData **md); /* Allow for debug output of a moduleData struct */
+MDE boolean moduleMinVersion(int major,int minor,int patch,int build); /* Checks if the current version of anope is before or after a given verison */
+
+/*************************************************************************/
+/* Module Queue Operations */
+MDE int queueModuleLoad(char *name, User *u);
+MDE int queueModuleUnload(char *name, User *u);
+MDE void handleModuleOperationQueue(void);
+
+/*************************************************************************/
+/* Some IRCD protocol module support functions */
+
+/** Update the protect deatials, could be either protect or admin etc.. */
+MDE void updateProtectDetails(char *level_info_protect_word, char *level_info_protectme_word, char *fant_protect_add, char *fant_protect_del, char *level_protect_word, char *protect_set_mode, char *protect_unset_mode);
+
+/************************************************************************/
+
+#endif
+/* EOF */
diff --git a/include/pseudo.h b/include/pseudo.h
new file mode 100644
index 000000000..e20ec8b7b
--- /dev/null
+++ b/include/pseudo.h
@@ -0,0 +1,20 @@
+/* Include extra includes needed by most/all pseudo-clients.
+ *
+ * (C) 2003-2008 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$
+ *
+ */
+
+#include "commands.h"
+#include "language.h"
+#include "timeout.h"
+#include "encrypt.h"
+#include "datafiles.h"
+#include "slist.h"
diff --git a/include/resource.h b/include/resource.h
new file mode 100644
index 000000000..2f3b54bfc
--- /dev/null
+++ b/include/resource.h
@@ -0,0 +1,20 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Developer Studio generated include file.
+// Used by Win32GUI.rc
+//
+#define VER_ANOPE 1
+#define MANIFEST_RESOURCE_ID 2
+#define ICON_APP 129
+
+
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NO_MFC 1
+#define _APS_NEXT_RESOURCE_VALUE 152
+#define _APS_NEXT_COMMAND_VALUE 40061
+#define _APS_NEXT_CONTROL_VALUE 1167
+#define _APS_NEXT_SYMED_VALUE 104
+#endif
+#endif
diff --git a/include/services.h b/include/services.h
new file mode 100644
index 000000000..f350d0d2a
--- /dev/null
+++ b/include/services.h
@@ -0,0 +1,1389 @@
+/*
+ *
+ * (C) 2003-2008 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"
+
+#ifndef MAX_CMD_HASH
+#define MAX_CMD_HASH 1024
+#endif
+
+/* Some Linux boxes (or maybe glibc includes) require this for the
+ * prototype of strsignal(). */
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+
+/* Some SUN fixs */
+#ifdef __sun
+/* Solaris specific code, types that do not exist in Solaris'
+ * sys/types.h
+ **/
+#undef u_int8_t
+#undef u_int16_t
+#undef u_int32_t
+#undef u_int_64_t
+#define u_int8_t uint8_t
+#define u_int16_t uint16_t
+#define u_int32_t uint32_t
+#define u_int64_t uint64_t
+
+#ifndef INADDR_NONE
+#define INADDR_NONE (-1)
+#endif
+
+#endif
+
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* Windows does not have:
+ * unistd.h, grp.h,
+ * netdb.h, netinet/in.h,
+ * sys/socket.h, sys/time.h
+ * Windows requires:
+ * winsock.h
+ * -- codemastr
+ */
+
+#ifndef _WIN32
+#include <unistd.h>
+#endif
+
+#include <signal.h>
+#include <time.h>
+#include <errno.h>
+
+#ifndef _WIN32
+#include <grp.h>
+#endif
+
+#include <limits.h>
+
+#ifndef _WIN32
+#include <netdb.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <sys/socket.h>
+#else
+#include <winsock.h>
+#include <windows.h>
+#endif
+
+#include <sys/stat.h> /* for umask() on some systems */
+#include <sys/types.h>
+
+#ifndef _WIN32
+#include <sys/time.h>
+#endif
+
+#ifdef _WIN32
+#include <sys/timeb.h>
+#include <direct.h>
+#include <io.h>
+#endif
+
+#include <fcntl.h>
+
+#ifndef _WIN32
+#ifdef HAVE_BACKTRACE
+#include <execinfo.h>
+#endif
+#endif
+
+#ifndef _WIN32
+#include <dirent.h>
+#endif
+
+#ifdef _WIN32
+/* VS2008 hates having this define before its own */
+#define vsnprintf _vsnprintf
+#endif
+
+#ifdef USE_RDB
+# define MAX_SQL_BUF 4096
+#endif
+
+#ifdef USE_MYSQL
+# define MYSQL_WARNING 2
+# define MYSQL_ERROR 4
+# define MYSQL_DEFAULT_PORT 3306
+#ifdef MYSQL_HEADER_PREFIX
+# include <mysql/mysql.h>
+# include <mysql/errmsg.h>
+#else
+# include <mysql.h>
+# include <errmsg.h>
+#endif
+#endif
+
+#if HAVE_STRINGS_H
+# include <strings.h>
+#endif
+
+#if HAVE_SYS_SELECT_H
+# include <sys/select.h>
+#endif
+
+#include "sockets.h"
+
+#ifndef va_copy
+# ifdef __va_copy
+# define VA_COPY(DEST,SRC) __va_copy((DEST),(SRC))
+# else
+# define VA_COPY(DEST, SRC) memcpy ((&DEST), (&SRC), sizeof(va_list))
+# endif
+#else
+# ifdef HAVE_VA_LIST_AS_ARRAY
+# define VA_COPY(DEST,SRC) (*(DEST) = *(SRC))
+# else
+# define VA_COPY(DEST, SRC) va_copy(DEST, SRC)
+# endif
+#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_
+
+/* We also have our own encrypt(). */
+#define encrypt encrypt_
+
+
+#ifdef __WINS__
+#ifndef BKCHECK
+#define BKCHECK
+ extern "C" void __pfnBkCheck() {}
+#endif
+#endif
+
+
+#if INTTYPE_WORKAROUND
+# undef int16
+# undef int32
+#endif
+
+
+/* Miscellaneous definitions. */
+#include "defs.h"
+#include "slist.h"
+#include "events.h"
+
+/*************************************************************************/
+
+typedef struct server_ Server;
+typedef struct user_ User;
+typedef struct channel_ Channel;
+typedef struct c_elist EList;
+typedef struct c_elist_entry Entry;
+typedef struct ModuleData_ ModuleData; /* ModuleData struct */
+typedef struct memo_ Memo;
+typedef struct nickrequest_ NickRequest;
+typedef struct nickalias_ NickAlias;
+typedef struct nickcore_ NickCore;
+typedef struct botinfo_ BotInfo;
+typedef struct chaninfo_ ChannelInfo;
+typedef struct badword_ BadWord;
+typedef struct bandata_ BanData;
+typedef struct userdata_ UserData;
+typedef struct mailinfo_ MailInfo;
+typedef struct akill_ Akill;
+typedef struct sxline_ SXLine;
+typedef struct hostcore_ HostCore;
+typedef struct newsitem_ NewsItem;
+typedef struct exception_ Exception;
+typedef struct cbmode_ CBMode;
+typedef struct cbmodeinfo_ CBModeInfo;
+typedef struct cmmode_ CMMode;
+typedef struct csmode_ CSMode;
+typedef struct cumode_ CUMode;
+typedef struct csmodeutil_ CSModeUtil;
+typedef struct session_ Session;
+typedef struct uid_ Uid;
+
+/*************************************************************************/
+
+/* Windows defines a boolean type as an
+ * unsigned char. It does however need
+ * true/false. -- codemastr
+ */
+#ifndef _WIN32
+typedef enum { false, true } boolean;
+#else
+ #ifndef true
+ #define true 1
+ #endif
+ #ifndef false
+ #define false 0
+ #endif
+#endif /* _WIN32 */
+
+/*************************************************************************/
+
+/* Protocol tweaks */
+
+typedef struct ircdvars_ IRCDVar;
+typedef struct ircdcapab_ IRCDCAPAB;
+
+struct ircdvars_ {
+ char *name; /* Name of the ChanServ command */
+ char *nickservmode; /* Mode used by NickServ */
+ char *chanservmode; /* Mode used by ChanServ */
+ char *memoservmode; /* Mode used by MemoServ */
+ char *hostservmode; /* Mode used by HostServ */
+ char *operservmode; /* Mode used by OperServ */
+ char *botservmode; /* Mode used by BotServ */
+ char *helpservmode; /* Mode used by HelpServ */
+ char *devnullmode; /* Mode used by Dev/Null */
+ char *globalmode; /* Mode used by Global */
+ char *nickservaliasmode; /* Mode used by NickServ Alias */
+ char *chanservaliasmode; /* Mode used by ChanServ Alias */
+ char *memoservaliasmode; /* Mode used by MemoServ Alias */
+ char *hostservaliasmode; /* Mode used by HostServ Alias */
+ char *operservaliasmode; /* Mode used by OperServ Alias */
+ char *botservaliasmode; /* Mode used by BotServ Alias */
+ char *helpservaliasmode; /* Mode used by HelpServ Alias */
+ char *devnullvaliasmode; /* Mode used by Dev/Null Alias */
+ char *globalaliasmode; /* Mode used by Global Alias */
+ char *botserv_bot_mode; /* Mode used by BotServ Bots */
+ int max_symbols; /* Chan Max Symbols */
+ char *modestoremove; /* Channel Modes to remove */
+ char *botchanumode; /* Modes set when botserv joins a channel */
+ int svsnick; /* Supports SVSNICK */
+ int vhost; /* Supports vhost */
+ int owner; /* Supports Owner */
+ char *ownerset; /* Mode to set for owner */
+ char *ownerunset; /* Mode to unset for a owner */
+ char *adminset; /* Mode to set for admin */
+ char *adminunset; /* Mode to unset for admin */
+ char *modeonreg; /* Mode on Register */
+ char *rootmodeonid; /* Mode on ID for ROOTS */
+ char *adminmodeonid; /* Mode on ID for ADMINS */
+ char *opermodeonid; /* Mode on ID for OPERS */
+ char *modeonunreg; /* Mode on Unregister */
+ char *modeonnick; /* Mode on nick change */
+ int sgline; /* Supports SGline */
+ int sqline; /* Supports SQline */
+ int szline; /* Supports SZline */
+ int halfop; /* Supports HalfOp */
+ int numservargs; /* Number of Server Args */
+ int join2set; /* Join 2 Set Modes */
+ int join2msg; /* Join 2 Message */
+ int except; /* exception +e */
+ int topictsforward; /* TS on Topics Forward */
+ int topictsbackward; /* TS on Topics Backward */
+ uint32 protectedumode; /* What is the Protected Umode */
+ int admin; /* Has Admin */
+ int chansqline; /* Supports Channel Sqlines */
+ int quitonkill; /* IRCD sends QUIT when kill */
+ int svsmode_unban; /* svsmode can be used to unban */
+ int protect; /* Has protect modes */
+ int reversekickcheck; /* Can reverse ban check */
+ int chanreg; /* channel mode +r for register */
+ uint32 regmode; /* Mode to use for +r */
+ int vident; /* Supports vidents */
+ int svshold; /* Supports svshold */
+ int tsonmode; /* Timestamp on mode changes */
+ int nickip; /* Sends IP on NICK */
+ int omode; /* On the fly o:lines */
+ int umode; /* change user modes */
+ int nickvhost; /* Users vhost sent during NICK */
+ int chgreal; /* Change RealName */
+ uint32 noknock; /* Channel Mode for no knock */
+ uint32 adminmode; /* Admin Only Channel Mode */
+ uint32 defmlock; /* Default mlock modes */
+ uint32 vhostmode; /* Vhost mode */
+ int fmode; /* +f */
+ int Lmode; /* +L */
+ uint32 chan_fmode; /* Mode */
+ uint32 chan_lmode; /* Mode */
+ int check_nick_id; /* On nick change check if they could be identified */
+ int knock_needs_i; /* Check if we needed +i when setting NOKNOCK */
+ char *chanmodes; /* If the ircd sends CHANMODE in CAPAB this is where we store it */
+ int token; /* Does Anope support the tokens for the ircd */
+ int tokencaseless; /* TOKEN are not case senstive - most its Unreal that is case senstive */
+ int sjb64; /* Base 64 encode TIMESTAMP */
+ int invitemode; /* +I */
+ int sjoinbanchar; /* use single quotes to define it */
+ int sjoinexchar; /* use single quotes to define it */
+ int sjoininvchar; /* use single quotes to define it */
+ int svsmode_ucmode; /* Can remove User Channel Modes with SVSMODE */
+ int sglineenforce;
+ char *vhostchar; /* char used for vhosting */
+ int ts6; /* ircd is TS6 */
+ int supporthelper; /* +h helper umodes */
+ int p10; /* ircd is P10 */
+ char *nickchars; /* character set */
+ int sync; /* reports sync state */
+ int cidrchanbei; /* channel bans/excepts/invites support CIDR (syntax: +b *!*@192.168.0.0/15)
+ * 0 for no support, 1 for strict cidr support, anything else
+ * for ircd specific support (nefarious only cares about first /mask) */
+};
+
+struct ircdcapab_ {
+ uint32 noquit;
+ uint32 tsmode;
+ uint32 unconnect;
+ uint32 nickip;
+ uint32 nsjoin;
+ uint32 zip;
+ uint32 burst;
+ uint32 ts5;
+ uint32 ts3;
+ uint32 dkey;
+ uint32 pt4;
+ uint32 scs;
+ uint32 qs;
+ uint32 uid;
+ uint32 knock;
+ uint32 client;
+ uint32 ipv6;
+ uint32 ssj5;
+ uint32 sn2;
+ uint32 token;
+ uint32 vhost;
+ uint32 ssj3;
+ uint32 nick2;
+ uint32 umode2;
+ uint32 vl;
+ uint32 tlkext;
+ uint32 dodkey;
+ uint32 dozip;
+ uint32 chanmodes;
+ uint32 sjb64;
+ uint32 nickchars;
+};
+
+/* tiny struct needed for P10 and other UID servers so we can track
+ services UID
+*/
+struct uid_ {
+ Uid *next, *prev;
+ char nick[NICKMAX];
+ char *uid;
+};
+
+/*************************************************************************/
+/* Config Details */
+/*************************************************************************/
+
+#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 */
+
+/*************************************************************************/
+
+/* 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 14
+#define PRE_NICK_VERSION 2
+#define OPER_VERSION 13
+#define HELP_VERSION 1
+#define HOST_VERSION 3
+
+/*************************************************************************/
+
+
+/**
+ * ModuleData strucs used to allow modules to add / delete module Data from existing structs
+ */
+
+struct ModuleData_ {
+ char *moduleName; /* Which module we belong to */
+ char *key; /* The key */
+ char *value; /* The Value */
+ ModuleData *next; /* The next ModuleData record */
+};
+
+ /*************************************************************************/
+
+/* Memo info structures. Since both nicknames and channels can have memos,
+ * we encapsulate memo data in a MemoList to make it easier to handle. */
+
+struct memo_ {
+ uint32 number; /* Index number -- not necessarily array position! */
+ uint16 flags;
+ time_t time; /* When it was sent */
+ char sender[NICKMAX];
+ char *text;
+ ModuleData *moduleData; /* Module saved data attached to the Memo */
+#ifdef USE_MYSQL
+ uint32 id; /* Database ID; see mysql.c */
+#endif
+};
+
+typedef struct {
+ int16 memocount, memomax;
+ Memo *memos;
+} MemoInfo;
+
+/*************************************************************************/
+
+/* NickServ nickname structures. */
+
+
+struct nickrequest_ {
+ NickRequest *next, *prev;
+ char *nick;
+ char *passcode;
+ char password[PASSMAX];
+ 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 */
+ uint16 status; /* See NS_* below */
+ NickCore *nc; /* I'm an alias of this */
+ /* Not saved */
+ ModuleData *moduleData; /* Module saved data attached to the nick alias */
+ User *u; /* Current online user that has me */
+};
+
+struct nickcore_ {
+ NickCore *next, *prev;
+
+ char *display; /* How the nick is displayed */
+ char pass[PASSMAX]; /* 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 */
+ uint32 flags; /* See NI_* below */
+ uint16 language; /* Language selected by nickname owner (LANG_*) */
+ uint16 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 */
+ ModuleData *moduleData; /* Module saved data attached to the NickCore */
+ time_t lastmail; /* Last time this nick record got a mail */
+ SList aliases; /* List of aliases */
+};
+
+
+/*************************************************************************/
+
+/* Bot info structures. Note that since there won't be many bots,
+ * they're not in a hash list.
+ * --lara
+ */
+
+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 */
+};
+
+
+
+/* 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 {
+ uint16 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. Also read below.
+ */
+#define ACCESS_FOUNDER 10000 /* Numeric level indicating founder access */
+#define ACCESS_INVALID -10000 /* Used in levels[] for disabled settings */
+/* There is one exception to the above access levels: SuperAdmins will have
+ * access level 10001. This level is never stored, however; it is only used
+ * in comparison and to let SuperAdmins win from founders where needed
+ */
+#define ACCESS_SUPERADMIN 10001
+
+/* Levels for xOP */
+
+#define ACCESS_VOP 3
+#define ACCESS_HOP 4
+#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 */
+ uint16 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. */
+
+struct badword_ {
+ uint16 in_use;
+ char *word;
+ uint16 type; /* BW_* below */
+};
+
+#define BW_ANY 0
+#define BW_SINGLE 1
+#define BW_START 2
+#define BW_END 3
+
+
+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 */
+
+ uint16 accesscount;
+ ChanAccess *access; /* List of authorized users */
+ uint16 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 */
+ char *mlock_flood; /* NULL if no +f */
+ char *mlock_redirect; /* NULL if no +L */
+
+ char *entry_message; /* Notice sent on entering channel */
+
+ MemoInfo memos;
+
+ struct channel_ *c; /* Pointer to channel record (if *
+ * channel is currently in use) */
+
+ ModuleData *moduleData; /* Module saved data attached to the ChannelInfo */
+
+ /* For BotServ */
+
+ BotInfo *bi; /* Bot used on this channel */
+ uint32 botflags; /* BS_* below */
+ int16 *ttb; /* Times to ban for each kicker */
+
+ uint16 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 */
+ /* Why are these commented out and not removed? -GD */
+#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 */
+
+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 */
+};
+
+typedef struct {
+ int what;
+ char *name;
+ int desc;
+} LevelInfo;
+
+
+/*************************************************************************/
+
+/* Server data */
+
+typedef enum {
+ SSYNC_UNKNOWN = 0, /* We can't get the sync state */
+ SSYNC_IN_PROGRESS = 1, /* Sync is currently in progress */
+ SSYNC_DONE = 2 /* We're in sync */
+} SyncState;
+
+struct server_ {
+ Server *next, *prev;
+
+ char *name; /* Server name */
+ uint16 hops; /* Hops between services and server */
+ char *desc; /* Server description */
+ uint16 flags; /* Some info flags, as defined below */
+ char *suid; /* Server Univeral ID */
+ SyncState sync; /* Server sync state (see above) */
+
+ Server *links; /* Linked list head for linked servers */
+ Server *uplink; /* Server which pretends to be the uplink */
+};
+
+#define SERVER_ISME 0x0001
+#define SERVER_JUPED 0x0002
+
+/*************************************************************************/
+
+/* Online user and channel data. */
+struct user_ {
+ User *next, *prev;
+
+ char nick[NICKMAX];
+
+ char *username; /* ident */
+ char *host; /* User's real hostname */
+ char *hostip; /* User's IP number */
+ char *vhost; /* User's virtual hostname */
+ char *vident; /* User's virtual ident */
+ char *realname; /* Realname */
+ Server *server; /* Server user is connected to */
+ char *nickTrack; /* Nick Tracking */
+ 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 */
+ char *uid; /* Univeral ID */
+
+ NickAlias *na;
+
+ ModuleData *moduleData; /* defined for it, it should allow the module Add/Get */
+
+ 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 */
+};
+
+
+
+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);
+};
+
+/* Channel user mode flags */
+
+#define CUF_PROTECT_BOTSERV 0x0001
+
+/* 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;
+};
+
+/* Channelban type flags */
+#define ENTRYTYPE_NONE 0x00000000
+#define ENTRYTYPE_CIDR4 0x00000001
+#define ENTRYTYPE_NICK_WILD 0x00000004
+#define ENTRYTYPE_NICK 0x00000008
+#define ENTRYTYPE_USER_WILD 0x00000010
+#define ENTRYTYPE_USER 0x00000020
+#define ENTRYTYPE_HOST_WILD 0x00000040
+#define ENTRYTYPE_HOST 0x00000080
+
+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 */
+ char *redirect; /* +L; NULL if none */
+ char *flood; /* +f; NULL if none */
+ EList *bans;
+ EList *excepts;
+ EList *invites;
+ 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? */
+ int16 topic_sync; /* Is the topic in sync? */
+};
+
+struct c_elist {
+ Entry *entries;
+ int32 count;
+};
+
+struct c_elist_entry {
+ Entry *next, *prev;
+ uint32 type;
+ uint32 cidr_ip; /* IP mask for CIDR matching */
+ uint32 cidr_mask; /* Netmask for CIDR matching */
+ char *nick, *user, *host, *mask;
+};
+
+/*************************************************************************/
+
+/* 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 *prev, *next;
+ char *mask;
+ time_t time; /* When do we stop ignoring them? */
+} IgnoreData;
+
+/*************************************************************************/
+
+/* Mail data */
+
+struct mailinfo_ {
+ FILE *pipe;
+ User *sender;
+ NickCore *recipient;
+ NickRequest *recip;
+};
+
+/*************************************************************************/
+
+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 */
+
+struct sxline_ {
+ char *mask;
+ char *by;
+ char *reason;
+ time_t seton;
+ time_t expires;
+};
+
+
+/************************************************************************/
+
+/* Host serv structures */
+
+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 */
+};
+
+/*************************************************************************/
+
+struct newsitem_ {
+ uint16 type;
+ uint32 num; /* Numbering is separate for login and oper news */
+ char *text;
+ char who[NICKMAX];
+ time_t time;
+};
+
+/*************************************************************************/
+
+
+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. */
+};
+
+/*************************************************************************/
+
+struct session_ {
+ Session *prev, *next;
+ char *host;
+ int count; /* Number of clients with this host */
+ int hits; /* Number of subsequent kills for a host */
+};
+
+/*************************************************************************/
+/**
+ * IRCD Protocol module support struct.
+ * protocol modules register the command they want touse for function X with our set
+ * functions, we then call the correct function for the anope_ commands.
+ **/
+typedef struct ircd_proto_ {
+ void (*ircd_set_mod_current_buffer)(int ac, char **av);
+ void (*ircd_cmd_svsnoop)(char *server, int set);
+ void (*ircd_cmd_remove_akill)(char *user, char *host);
+ void (*ircd_cmd_topic)(char *whosets, char *chan, char *whosetit, char *topic, time_t when);
+ void (*ircd_cmd_vhost_off)(User * u);
+ void (*ircd_cmd_akill)(char *user, char *host, char *who, time_t when,time_t expires, char *reason);
+ void (*ircd_cmd_svskill)(char *source, char *user, char *buf);
+ void (*ircd_cmd_svsmode)(User * u, int ac, char **av);
+ void (*ircd_cmd_372)(char *source, char *msg);
+ void (*ircd_cmd_372_error)(char *source);
+ void (*ircd_cmd_375)(char *source);
+ void (*ircd_cmd_376)(char *source);
+ void (*ircd_cmd_nick)(char *nick, char *name, char *modes);
+ void (*ircd_cmd_guest_nick)(char *nick, char *user, char *host, char *real, char *modes);
+ void (*ircd_cmd_mode)(char *source, char *dest, char *buf);
+ void (*ircd_cmd_bot_nick)(char *nick, char *user, char *host, char *real, char *modes);
+ void (*ircd_cmd_kick)(char *source, char *chan, char *user, char *buf);
+ void (*ircd_cmd_notice_ops)(char *source, char *dest, char *buf);
+ void (*ircd_cmd_notice)(char *source, char *dest, char *buf);
+ void (*ircd_cmd_notice2)(char *source, char *dest, char *msg);
+ void (*ircd_cmd_privmsg)(char *source, char *dest, char *buf);
+ void (*ircd_cmd_privmsg2)(char *source, char *dest, char *msg);
+ void (*ircd_cmd_serv_notice)(char *source, char *dest, char *msg);
+ void (*ircd_cmd_serv_privmsg)(char *source, char *dest, char *msg);
+ void (*ircd_cmd_bot_chan_mode)(char *nick, char *chan);
+ void (*ircd_cmd_351)(char *source);
+ void (*ircd_cmd_quit)(char *source, char *buf);
+ void (*ircd_cmd_pong)(char *servname, char *who);
+ void (*ircd_cmd_join)(char *user, char *channel, time_t chantime);
+ void (*ircd_cmd_unsqline)(char *user);
+ void (*ircd_cmd_invite)(char *source, char *chan, char *nick);
+ void (*ircd_cmd_part)(char *nick, char *chan, char *buf);
+ void (*ircd_cmd_391)(char *source, char *timestr);
+ void (*ircd_cmd_250)(char *buf);
+ void (*ircd_cmd_307)(char *buf);
+ void (*ircd_cmd_311)(char *buf);
+ void (*ircd_cmd_312)(char *buf);
+ void (*ircd_cmd_317)(char *buf);
+ void (*ircd_cmd_219)(char *source, char *letter);
+ void (*ircd_cmd_401)(char *source, char *who);
+ void (*ircd_cmd_318)(char *source, char *who);
+ void (*ircd_cmd_242)(char *buf);
+ void (*ircd_cmd_243)(char *buf);
+ void (*ircd_cmd_211)(char *buf);
+ void (*ircd_cmd_global)(char *source, char *buf);
+ void (*ircd_cmd_global_legacy)(char *source, char *fmt);
+ void (*ircd_cmd_sqline)(char *mask, char *reason);
+ void (*ircd_cmd_squit)(char *servname, char *message);
+ void (*ircd_cmd_svso)(char *source, char *nick, char *flag);
+ void (*ircd_cmd_chg_nick)(char *oldnick, char *newnick);
+ void (*ircd_cmd_svsnick)(char *source, char *guest, time_t when);
+ void (*ircd_cmd_vhost_on)(char *nick, char *vIdent, char *vhost);
+ void (*ircd_cmd_connect)(int servernum);
+ void (*ircd_cmd_svshold)(char *nick);
+ void (*ircd_cmd_release_svshold)(char *nick);
+ void (*ircd_cmd_unsgline)(char *mask);
+ void (*ircd_cmd_unszline)(char *mask);
+ void (*ircd_cmd_szline)(char *mask, char *reason, char *whom);
+ void (*ircd_cmd_sgline)(char *mask, char *reason);
+ void (*ircd_cmd_unban)(char *name, char *nick);
+ void (*ircd_cmd_svsmode_chan)(char *name, char *mode, char *nick);
+ void (*ircd_cmd_svid_umode)(char *nick, time_t ts);
+ void (*ircd_cmd_nc_change)(User * u);
+ void (*ircd_cmd_svid_umode2)(User * u, char *ts);
+ void (*ircd_cmd_svid_umode3)(User * u, char *ts);
+ void (*ircd_cmd_ctcp)(char *source, char *dest, char *buf);
+ void (*ircd_cmd_svsjoin)(char *source, char *nick, char *chan, char *param);
+ void (*ircd_cmd_svspart)(char *source, char *nick, char *chan);
+ void (*ircd_cmd_swhois)(char *source, char *who, char *mask);
+ void (*ircd_cmd_eob)();
+ void (*ircd_cmd_jupe)(char *jserver, char *who, char *reason);
+ void (*ircd_set_umode)(User *user, int ac, char **av);
+ int (*ircd_valid_nick)(char *nick);
+ int (*ircd_valid_chan)(char *chan);
+ int (*ircd_flood_mode_check)(char *value);
+} IRCDProto;
+
+typedef struct ircd_modes_ {
+ int user_invis;
+ int user_oper;
+ int chan_invite;
+ int chan_secret;
+ int chan_private;
+ int chan_key;
+ int chan_limit;
+} IRCDModes;
+
+
+
+/*************************************************************************/
+/**
+ * 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 */
+
+/*************************************************************************/
+
+/* Memo Flags */
+#define MF_UNREAD 0x0001 /* Memo has not yet been read */
+#define MF_RECEIPT 0x0002 /* Sender requested receipt */
+#define MF_NOTIFYS 0x0004 /* Memo is a notification of receitp */
+
+/* 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 */
+#define NI_MEMO_MAIL 0x00010000 /* User gets email on memo */
+#define NI_HIDE_STATUS 0x00020000 /* Don't show services access status */
+#define NI_SUSPENDED 0x00040000 /* Nickname is suspended */
+#define NI_AUTOOP 0x00080000 /* Autoop nickname in channels */
+/* 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 LANG_HUN 14 /* Hungarian */
+#define LANG_PL 15 /* Polish */
+
+#define NUM_LANGS 16 /* Number of languages */
+#define USED_LANGS 13 /* Number of languages provided */
+
+
+#define DEF_LANGUAGE LANG_EN_US
+
+#define BI_PRIVATE 0x0001
+
+#define CUS_OP 0x0001
+#define CUS_VOICE 0x0002
+#define CUS_HALFOP 0x0004 /* Halfop (+h) */
+#define CUS_OWNER 0x0008 /* Owner/Founder (+q) */
+#define CUS_PROTECT 0x0010 /* Protected users (+a) */
+#define CUS_DEOPPED 0x0080 /* User has been specifically deopped */
+
+#define MUT_DEOP 0
+#define MUT_OP 1
+#define MUT_DEVOICE 2
+#define MUT_VOICE 3
+#define MUT_DEHALFOP 4
+#define MUT_HALFOP 5
+#define MUT_DEPROTECT 6
+#define MUT_PROTECT 7
+
+/*************************************************************************/
+/* CAPAB stuffs */
+
+typedef struct capabinfo_ CapabInfo;
+struct capabinfo_ {
+ char *token;
+ uint32 flag;
+};
+
+#define CAPAB_NOQUIT 0x00000001
+#define CAPAB_TSMODE 0x00000002
+#define CAPAB_UNCONNECT 0x00000004
+#define CAPAB_NICKIP 0x00000008
+#define CAPAB_NSJOIN 0x00000010
+#define CAPAB_ZIP 0x00000020
+#define CAPAB_BURST 0x00000040
+#define CAPAB_TS3 0x00000080
+#define CAPAB_TS5 0x00000100
+#define CAPAB_DKEY 0x00000200
+#define CAPAB_DOZIP 0x00000400
+#define CAPAB_DODKEY 0x00000800
+#define CAPAB_QS 0x00001000
+#define CAPAB_SCS 0x00002000
+#define CAPAB_PT4 0x00004000
+#define CAPAB_UID 0x00008000
+#define CAPAB_KNOCK 0x00010000
+#define CAPAB_CLIENT 0x00020000
+#define CAPAB_IPV6 0x00040000
+#define CAPAB_SSJ5 0x00080000
+#define CAPAB_SN2 0x00100000
+#define CAPAB_VHOST 0x00200000
+#define CAPAB_TOKEN 0x00400000
+#define CAPAB_SSJ3 0x00800000
+#define CAPAB_NICK2 0x01000000
+#define CAPAB_UMODE2 0x02000000
+#define CAPAB_VL 0x04000000
+#define CAPAB_TLKEXT 0x08000000
+#define CAPAB_CHANMODE 0x10000000
+#define CAPAB_SJB64 0x20000000
+#define CAPAB_NICKCHARS 0x40000000
+
+/*************************************************************************/
+
+/**
+ * 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)=='-' )
+
+/*************************************************************************/
+
+#include "extern.h"
+
+/*************************************************************************/
+
+#endif /* SERVICES_H */
diff --git a/include/slist.h b/include/slist.h
new file mode 100644
index 000000000..64ecbe996
--- /dev/null
+++ b/include/slist.h
@@ -0,0 +1,50 @@
+/* Header for Services list handler.
+ *
+ * (C) 2003-2008 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$
+ *
+ */
+
+#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);
+
+#endif /* SLIST_H */
+
diff --git a/include/sockets.h b/include/sockets.h
new file mode 100644
index 000000000..470ad7761
--- /dev/null
+++ b/include/sockets.h
@@ -0,0 +1,47 @@
+/*
+ *
+ * (C) 2004-2008 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 SOCKETS_H
+#define SOCKETS_H
+
+#ifdef _WIN32
+typedef SOCKET ano_socket_t;
+#define ano_sockread(fd, buf, len) recv(fd, buf, len, 0)
+#define ano_sockwrite(fd, buf, len) send(fd, buf, len, 0)
+#define ano_sockclose(fd) closesocket(fd)
+#define ano_sockgeterr() WSAGetLastError()
+#define ano_sockseterr(err) WSASetLastError(err)
+/* ano_sockstrerror in sockutil.c */
+/* ano_socksetnonb in sockutil.c */
+#define ano_sockerrnonb(err) (err == WSAEINPROGRESS || err == WSAEWOULDBLOCK)
+#define SOCKERR_EBADF WSAENOTSOCK
+#define SOCKERR_EINTR WSAEINTR
+#define SOCKERR_EINVAL WSAEINVAL
+#define SOCKERR_EINPROGRESS WSAEINPROGRESS
+#else
+typedef int ano_socket_t;
+#define ano_sockread(fd, buf, len) read(fd, buf, len)
+#define ano_sockwrite(fd, buf, len) write(fd, buf, len)
+#define ano_sockclose(fd) close(fd)
+#define ano_sockgeterr() errno
+#define ano_sockseterr(err) errno = err
+#define ano_sockstrerror(err) strerror(err)
+#define ano_socksetnonb(fd) fcntl(fd, F_SETFL, O_NONBLOCK)
+#define ano_sockerrnonb(err) (err == EINPROGRESS)
+#define SOCKERR_EBADF EBADF
+#define SOCKERR_EINTR EINTR
+#define SOCKERR_EINVAL EINVAL
+#define SOCKERR_EINPROGRESS EINPROGRESS
+#endif
+
+#endif
diff --git a/include/sysconf.h.in b/include/sysconf.h.in
new file mode 100644
index 000000000..59f900433
--- /dev/null
+++ b/include/sysconf.h.in
@@ -0,0 +1,227 @@
+/* include/sysconf.h.in. Generated from configure.in by autoheader. */
+
+/* "Default umask Permissions" */
+#undef DEFUMASK
+
+/* "No prefix needed for dlopen" */
+#undef DL_PREFIX
+
+/* "Has sys/types.h" */
+#undef HAS_SYS_TYPES_H
+
+/* "" */
+#undef HAVE_BACKTRACE
+
+/* Define to 1 if you have the `fork' function. */
+#undef HAVE_FORK
+
+/* Define to 1 if you have the `gethostbyname' function. */
+#undef HAVE_GETHOSTBYNAME
+
+/* Define to 1 if you have the `gethostbyname_r' function. */
+#undef HAVE_GETHOSTBYNAME_R
+
+/* Define to 1 if you have the `gettimeofday' function. */
+#undef HAVE_GETTIMEOFDAY
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have the `setgrent' function. */
+#undef HAVE_SETGRENT
+
+/* Define to 1 if you have the `snprintf' function. */
+#undef HAVE_SNPRINTF
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the `strcasecmp' function. */
+#undef HAVE_STRCASECMP
+
+/* Define to 1 if you have the `strdup' function. */
+#undef HAVE_STRDUP
+
+/* Define to 1 if you have the `strerror' function. */
+#undef HAVE_STRERROR
+
+/* Define to 1 if you have the `stricmp' function. */
+#undef HAVE_STRICMP
+
+/* "" */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the `strlcat' function. */
+#undef HAVE_STRLCAT
+
+/* Define to 1 if you have the `strlcpy' function. */
+#undef HAVE_STRLCPY
+
+/* Define to 1 if you have the `strsignal' function. */
+#undef HAVE_STRSIGNAL
+
+/* Define to 1 if you have the `strspn' function. */
+#undef HAVE_STRSPN
+
+/* Define to 1 if you have the `sys_errlist' function. */
+#undef HAVE_SYS_ERRLIST
+
+/* "" */
+#undef HAVE_SYS_SELECT_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the `umask' function. */
+#undef HAVE_UMASK
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* va_list as array */
+#undef HAVE_VA_LIST_AS_ARRAY
+
+/* "Module dir" */
+#undef MODULE_PATH
+
+/* "Has mysql/mysql.h" */
+#undef MYSQL_HEADER_PREFIX
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* "Run group" */
+#undef RUNGROUP
+
+/* "Binary Dir" */
+#undef SERVICES_BIN
+
+/* "services bin dir" */
+#undef SERVICES_DIR
+
+/* The size of a `int', as computed by sizeof. */
+#undef SIZEOF_INT
+
+/* The size of a `long', as computed by sizeof. */
+#undef SIZEOF_LONG
+
+/* The size of a `short', as computed by sizeof. */
+#undef SIZEOF_SHORT
+
+/* "modules not available" */
+#undef STATIC_LINKING
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* "Modules available" */
+#undef USE_MODULES
+
+/* "Use Mysql" */
+#undef USE_MYSQL
+
+/* "Use RDB" */
+#undef USE_RDB
+
+/* Define to `short' if <sys/types.h> does not define. */
+#undef int16_t
+
+/* Define to `long' if <sys/types.h> does not define. */
+#undef int32_t
+
+/* Define to `unsigned short' if <sys/types.h> does not define. */
+#undef u_int16_t
+
+/* Define to `unsigned long' if <sys/types.h> does not define. */
+#undef u_int32_t
+
+/* Static config, copy from here to below before running autoheader! */
+
+#ifndef BIG_ENDIAN
+
+/* Big Endian system */
+#undef BIG_ENDIAN
+
+#endif
+
+#ifndef LITTLE_ENDIAN
+
+/* Little Endian system */
+#undef LITTLE_ENDIAN
+
+#endif
+
+/**
+ * NOTE: BIG_ENDIAN and LITTLE_ENDIAN defines should not be left in
+ * by autoheader as they may be defined or may not be, as such we check
+ * if there defined before messing with them!
+ **/
+
+#ifdef HAS_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#ifdef __STRICT_ANSI__
+#include <stdarg.h>
+#include <stdio.h>
+
+/* We KNOW these are not ansi, we are defining them here to suppress the warning
+ * * s messages on a "make strict" compile */
+#ifndef snprintf
+int snprintf(char *str, size_t size, const char *format, ...);
+#endif
+#ifndef vprintf
+int vprintf(const char *format, va_list ap);
+#endif
+#ifndef vfprintf
+int vfprintf(FILE *stream, const char *format, va_list ap);
+#endif
+#ifndef vsprintf
+int vsprintf(char *str, const char *format, va_list ap);
+#endif
+#ifndef vsnprintf
+int vsnprintf(char *str, size_t size, const char *format, va_list ap);
+#endif
+
+FILE *popen(const char *command, const char *type);
+int pclose(FILE *stream);
+FILE *fdopen(int fildes, const char *mode);
+
+int ftruncate(int fd, off_t length);
+
+#ifdef HAVE_STRSIGNAL
+char *strsignal(int sig);
+#endif
+
+#endif
+
+
+typedef int16_t int16;
+typedef u_int16_t uint16;
+typedef int32_t int32;
+typedef u_int32_t uint32;
+
diff --git a/include/sysconf.h.win32 b/include/sysconf.h.win32
new file mode 100644
index 000000000..a11694469
--- /dev/null
+++ b/include/sysconf.h.win32
@@ -0,0 +1,50 @@
+
+#define SERVICES_DIR "data"
+#define SERVICES_BIN "anope.exe"
+
+typedef signed __int16 int16;
+typedef signed __int16 int16_t;
+typedef unsigned __int16 uint16;
+typedef unsigned __int16 u_int16_t;
+typedef signed __int32 int32;
+typedef signed __int32 int32_t;
+typedef unsigned __int32 uint32;
+typedef unsigned __int32 u_int32_t;
+typedef unsigned __int8 u_int8_t;
+
+#define HAVE_STRINGS_H 0
+#define HAVE_SYS_SELECT_H 0
+#define HAVE_SYS_SYSPROTO_H 0
+
+#define HAVE_STRERROR 1
+#define HAVE_SYS_ERRLIST 0
+#define HAVE_SNPRINTF 1
+#define BAD_SNPRINTF 0
+#define HAVE_STRICMP 1
+#define HAVE_STRCASECMP 0
+#define HAVE_STRDUP 1
+#define HAVE_STRSPN 1
+#define HAVE_STRSIGNAL 0
+#define HAVE_GETTIMEOFDAY 0
+#define HAVE_SETGRENT 0
+#define HAVE_UMASK 0
+#define HAVE_FORK 0
+#define HAVE_GETHOSTBYNAME 1
+#define HAVE_BACKTRACE 0
+
+/* Enable Module support */
+#define USE_MODULES
+#define MODULE_PATH ".\\modules\\"
+
+/* Windows/MSVC likes to name things differently */
+#define snprintf _snprintf
+#define popen _popen
+#define pclose _pclose
+#define ftruncate _chsize
+#define PATH_MAX MAX_PATH
+#define MAXPATHLEN MAX_PATH
+#define bzero(buf, size) memset(buf, 0, size)
+#define strcasecmp stricmp
+#define sleep(x) Sleep(x*1000)
+
+
diff --git a/include/timeout.h b/include/timeout.h
new file mode 100644
index 000000000..ac2f3deda
--- /dev/null
+++ b/include/timeout.h
@@ -0,0 +1,50 @@
+/* Time-delay routine include stuff.
+ *
+ * (C) 2003-2008 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$
+ *
+ */
+
+#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 int send_timeout_list(User *u);
+#endif
+
+
+#endif /* TIMEOUT_H */
diff --git a/include/version.sh b/include/version.sh
new file mode 100644
index 000000000..1ee2d756c
--- /dev/null
+++ b/include/version.sh
@@ -0,0 +1,86 @@
+#!/bin/sh
+#
+# Build version string and increment Services build number.
+#
+
+# Grab version information from the version control file.
+CTRL="../version.log"
+if [ -f $CTRL ] ; then
+ . $CTRL
+else
+ echo "Error: Unable to find control file: $CTRL"
+ exit 0
+fi
+
+VERSION="${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}${VERSION_EXTRA} (${VERSION_BUILD})"
+VERSIONDOTTED="${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}${VERSION_EXTRA}.${VERSION_BUILD}"
+
+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-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and CREDITS for further 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
+ *
+ */
+
+ #ifndef VERSION_H
+ #define VERSION_H
+
+#define VERSION_MAJOR $VERSION_MAJOR
+#define VERSION_MINOR $VERSION_MINOR
+#define VERSION_PATCH $VERSION_PATCH
+#define VERSION_EXTRA "$VERSION_EXTRA"
+#define VERSION_BUILD $VERSION_BUILD
+
+#define BUILD "$BUILD"
+#define VERSION_STRING "$VERSION"
+#define VERSION_STRING_DOTTED "$VERSIONDOTTED"
+
+#ifdef DEBUG_COMMANDS
+# define VER_DEBUG "D"
+#else
+# define VER_DEBUG
+#endif
+
+#if defined(_WIN32)
+# if _MSC_VER >= 1400
+# define VER_OS "W"
+# else
+# define VER_OS "w"
+# endif
+#else
+# define VER_OS
+#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
+
+#endif
+
+EOF
+
diff --git a/include/version.sh.c b/include/version.sh.c
new file mode 100644
index 000000000..f69fe8992
--- /dev/null
+++ b/include/version.sh.c
@@ -0,0 +1,224 @@
+/* version file handler for win32.
+ *
+ * (C) 2003-2008 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.
+ *
+ * Written by Dominick Meglio <codemastr@unrealircd.com>
+ *
+ */
+
+/* Needed due to Windows lack of a decent interpreter */
+
+#include <stdio.h>
+#include <string.h>
+
+#define CTRL "version.log"
+
+long version_major, version_minor, version_patch, version_build, build;
+char *version_extra = NULL;
+char version[1024];
+char version_dotted[1024];
+
+
+void load_ctrl(FILE *);
+long get_value(char *);
+char *get_value_str(char *);
+char *strip(char *);
+void parse_version(FILE *);
+void write_version(FILE *);
+void parse_line(FILE *, char *);
+
+int main()
+{
+ FILE *fd = fopen(CTRL, "r");
+
+
+ if (!fd) {
+ fprintf(stderr, "Error: Unable to find control file: " CTRL "\n");
+ exit(0);
+ }
+
+ load_ctrl(fd);
+ fclose(fd);
+
+ _snprintf(version, 1024, "%d.%d.%d%s (%d)", version_major, version_minor,
+ version_patch, (version_extra ? version_extra : ""), version_build);
+
+ _snprintf(version_dotted, 1024, "%d.%d.%d%s.%d", version_major, version_minor,
+ version_patch, (version_extra ? version_extra : ""), version_build);
+
+ fd = fopen("version.h", "r");
+
+ if (fd) {
+ parse_version(fd);
+ fclose(fd);
+ } else
+ build = 1;
+
+
+ fd = fopen("version.h", "w");
+ write_version(fd);
+ fclose(fd);
+
+ if (version_extra)
+ free(version_extra);
+}
+
+void load_ctrl(FILE * fd)
+{
+ char buf[512];
+ while (fgets(buf, 511, fd)) {
+ char *var;
+
+ strip(buf);
+
+ var = strtok(buf, "=");
+ if (!var)
+ continue;
+ if (!strcmp(var, "VERSION_MAJOR"))
+ version_major = get_value(strtok(NULL, ""));
+ else if (!strcmp(var, "VERSION_MINOR"))
+ version_minor = get_value(strtok(NULL, ""));
+ else if (!strcmp(var, "VERSION_PATCH"))
+ version_patch = get_value(strtok(NULL, ""));
+ else if (!strcmp(var, "VERSION_BUILD"))
+ version_build = get_value(strtok(NULL, ""));
+ else if (!strcmp(var, "VERSION_EXTRA"))
+ version_extra = get_value_str(strtok(NULL, ""));
+
+ }
+}
+
+char *strip(char *str)
+{
+ char *c;
+ if ((c = strchr(str, '\n')))
+ *c = 0;
+ if ((c = strchr(str, '\r')))
+ *c = 0;
+ return str;
+}
+
+long get_value(char *string)
+{
+ return atol(get_value_str(string));
+}
+
+char *get_value_str(char *string)
+{
+ int len;
+
+ if (*string == '"')
+ string++;
+
+ len = strlen(string);
+
+ if (string[len - 1] == '"')
+ string[len - 1] = 0;
+ if (!*string)
+ return NULL;
+ return strdup(string);
+}
+
+void parse_version(FILE * fd)
+{
+ char buf[1024];
+
+ while (fgets(buf, 1023, fd)) {
+ char *para1;
+
+ strip(buf);
+ para1 = strtok(buf, " \t");
+
+ if (!para1)
+ continue;
+
+ if (!strcmp(para1, "#define")) {
+ char *para2 = strtok(NULL, " \t");
+
+ if (!para2)
+ continue;
+
+ if (!strcmp(para2, "BUILD")) {
+ char *value = strtok(NULL, "");
+ build = get_value(value);
+ build++;
+ return;
+ }
+ }
+ }
+ build = 1;
+}
+
+void write_version(FILE * fd)
+{
+ FILE *fdin = fopen("include\\version.sh", "r");
+ char buf[1024];
+ short until_eof = 0;
+
+ while (fgets(buf, 1023, fdin)) {
+ strip(buf);
+
+ if (until_eof)
+ if (!strcmp(buf, "EOF"))
+ break;
+ else
+ parse_line(fd, buf);
+
+ if (!strcmp(buf, "cat >version.h <<EOF"))
+ until_eof = 1;
+ }
+
+}
+
+void parse_line(FILE * fd, char *line)
+{
+ char *c;
+ for (c = line; *c; c++) {
+ /* It's a variable, find out which */
+ if (*c == '$') {
+ char *var, *varbegin;
+
+ if (*(c + 1))
+ c++;
+ else
+ continue;
+ for (var = varbegin = c; var; var++) {
+ if (!isalnum(*var) && *var != '_')
+ break;
+ }
+ if (var != varbegin) {
+ char tmp = *var;
+
+ *var = 0;
+ if (!strcmp(varbegin, "VERSION_MAJOR"))
+ fprintf(fd, "%d", version_major);
+ else if (!strcmp(varbegin, "VERSION_MINOR"))
+ fprintf(fd, "%d", version_minor);
+ else if (!strcmp(varbegin, "VERSION_PATCH"))
+ fprintf(fd, "%d", version_patch);
+ else if (!strcmp(varbegin, "VERSION_EXTRA")) {
+ if (version_extra)
+ fprintf(fd, "%s", version_extra);
+ } else if (!strcmp(varbegin, "VERSION_BUILD"))
+ fprintf(fd, "%d", version_build);
+ else if (!strcmp(varbegin, "BUILD"))
+ fprintf(fd, "%d", build);
+ else if (!strcmp(varbegin, "VERSION"))
+ fprintf(fd, "%s", version);
+ else if (!strcmp(varbegin, "VERSIONDOTTED"))
+ fprintf(fd, "%s", version_dotted);
+ fputc(tmp, fd);
+ }
+ c = var;
+ } else
+ fputc(*c, fd);
+ }
+ /* We only need \n here - we didn't open the file as binary -GD */
+ fprintf(fd, "\n");
+}
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/install.js b/install.js
new file mode 100644
index 000000000..d9f0f46ab
--- /dev/null
+++ b/install.js
@@ -0,0 +1,571 @@
+//
+// install.js - Windows Configuration
+//
+// (C) 2003-2008 Anope Team
+// Contact us at info@anope.org
+//
+// This program is free but copyrighted software; see the file COPYING for
+// details.
+//
+// Based on the original code of Epona by Lara.
+// Based on the original code of Services by Andy Church.
+//
+// $Id$
+//
+
+var anopeVersion = "Unknown";
+var vMaj, vMin, vPat, vBuild, vExtra;
+var drivesToCheck = ['C', 'D', 'E', 'F', 'G', 'H'];
+
+var installerResponses = new Array();
+var softwareVersions = {
+ 'Compiler' : false,
+ 'MySQLDB' : false
+ };
+
+var installerQuestions = [
+ {
+ 'question' : [
+ 'Do you want to compile Anope with MySQL Support?',
+ 'NOTE: You will need to have installed MySQL 3.23 or Above'
+ ],
+ 'short' : 'Enable MySQL Support?',
+ 'options' : [
+ 'yes',
+ 'no'
+ ],
+ 'default_answer' : 'no',
+ 'store_answer' : function (answer) {
+ if (answer == 'yes') {
+ if (!findMySQL()) {
+ WScript.Echo("\nERROR: Cannot find MySQL - See error messages above for details.\n");
+ return false;
+ }
+ }
+ installerResponses['MySQL DB Support'] = answer;
+ return true;
+ },
+ 'commit_config' : function() {
+ if (installerResponses['MySQL DB Support'] == 'yes') {
+ f.WriteLine("USE_MYSQL=1");
+ f.WriteLine("MYSQL_LIB=\""+softwareVersions['MySQLDB'].installedDrive+":\\"+softwareVersions['MySQLDB'].libpaths[0]+"\"");
+ f.WriteLine("MYSQL_INC=\""+softwareVersions['MySQLDB'].installedDrive+":\\"+softwareVersions['MySQLDB'].incpaths[0]+"\"");
+ f.WriteLine("LIBS=$(LIBS) /LIBPATH:$(MYSQL_LIB)");
+ f.WriteLine("MYSQL_LIB_PATH=/LIBPATH:$(MYSQL_LIB)");
+ f.WriteLine("BASE_CFLAGS=$(BASE_CFLAGS) /I $(MYSQL_INC)");
+ f.WriteLine("MYSQL_INC_PATH=/I $(MYSQL_INC)");
+ f.WriteLine("RDB_C=rdb.c");
+ f.WriteLine("RDB_O=rdb.obj");
+ f.WriteLine("MYSQL_C=mysql.c");
+ f.WriteLine("MYSQL_O=mysql.obj");
+ f.WriteLine("BASE_CFLAGS=/D USE_MYSQL /D USE_RDB $(BASE_CFLAGS) /D HAVE_MYSQL_MYSQL_H");
+ f.WriteLine("MYPASQL_BUILD=$(CC) /LD $(MYSQL_INC_PATH) src\\mypasql.c /link $(MYSQL_LIB_PATH) $(LFLAGS) /DEF:src\mypasql.def libmysql.lib zlib.lib ws2_32.lib advapi32.lib /NODEFAULTLIB:LIBCMTD.lib");
+ f.WriteLine("LIBS=$(LIBS) libmysql.lib zlib.lib");
+ }
+ else {
+ f.WriteLine("USE_MYSQL=0");
+ }
+ }
+ },
+
+ ];
+
+var buildPackages = [
+ {
+ 'name' : 'Microsoft Visual Studio 2008 (New PSDK)',
+ 'libpaths' : [
+ 'Program Files\\Microsoft Visual Studio 9.0\\VC\\Lib',
+ 'Program Files\\Microsoft Platform SDK for Windows Server 2003 R2\\Lib'
+ ],
+ 'incpaths' : [
+ 'Program Files\\Microsoft Visual Studio 9.0\\VC\\Include',
+ 'Program Files\\Microsoft Platform SDK for Windows Server 2003 R2\\Include'
+ ],
+ 'nmake' : [
+ 'Program Files\\Microsoft Platform SDK for Windows Server 2003 R2\\Bin',
+ ],
+ 'additional_switches' : [ '/w' ],
+ 'installedDrive' : 'C'
+ },
+ {
+ 'name' : 'Microsoft Visual Studio 2008 (64bit) (New PSDK)',
+ 'libpaths' : [
+ 'Program Files (x86)\\Microsoft Visual Studio 9.0\\VC\\Lib',
+ 'Program Files\\Microsoft Platform SDK for Windows Server 2003 R2\\Lib'
+ ],
+ 'incpaths' : [
+ 'Program Files (x86)\\Microsoft Visual Studio 9.0\\VC\\Include',
+ 'Program Files\\Microsoft Platform SDK for Windows Server 2003 R2\\Include'
+ ],
+ 'nmake' : [
+ 'Program Files\\Microsoft Platform SDK for Windows Server 2003 R2\\Bin',
+ ],
+ 'additional_switches' : [ '/w' ],
+ 'installedDrive' : 'C'
+ },
+
+ {
+ 'name' : 'Microsoft Visual Studio 2005 (New PSDK)',
+ 'libpaths' : [
+ 'Program Files\\Microsoft Visual Studio 8\\VC\\Lib',
+ 'Program Files\\Microsoft Platform SDK for Windows Server 2003 R2\\Lib'
+ ],
+ 'incpaths' : [
+ 'Program Files\\Microsoft Visual Studio 8\\VC\\Include',
+ 'Program Files\\Microsoft Platform SDK for Windows Server 2003 R2\\Include'
+ ],
+ 'nmake' : [
+ 'Program Files\\Microsoft Platform SDK for Windows Server 2003 R2\\Bin',
+ ''
+ ],
+ 'additional_switches' : [
+ '/w'
+ ],
+ 'installedDrive' : 'C'
+ },
+ {
+ 'name' : 'Microsoft Visual Studio 2005 (Old PSDK)',
+ 'libpaths' : [
+ 'Program Files\\Microsoft Visual Studio 8\\VC\\Lib',
+ 'Program Files\\Microsoft Platform SDK\\Lib'
+ ],
+ 'incpaths' : [
+ 'Program Files\\Microsoft Visual Studio 8\\VC\\Include',
+ 'Program Files\\Microsoft Platform SDK\\Include'
+ ],
+ 'nmake' : [
+ 'Program Files\\Microsoft Platform SDK\\Bin',
+ ''
+ ],
+ 'additional_switches' : [
+ '/w'
+ ],
+ 'installedDrive' : 'C'
+ },
+
+ {
+ 'name' : 'Microsoft Visual Studio .NET 2003',
+ 'libpaths' : [
+ 'Program Files\\Microsoft Visual Studio .NET 2003\\VC7\\Lib',
+ 'Program Files\\Microsoft Visual Studio .NET 2003\\PlatformSDK\\Lib'
+ ],
+ 'incpaths' : [
+ 'Program Files\\Microsoft Visual Studio .NET 2003\\VC7\\Include',
+ 'Program Files\\Microsoft Visual Studio .NET 2003\\PlatformSDK\\Include'
+ ],
+ 'nmake' : [
+ 'Program Files\\Microsoft Visual Studio .NET 2003\\VC7\\Bin',
+ ''
+ ],
+ 'additional_switches' : false,
+ 'installedDrive' : 'C'
+ },
+
+ {
+ 'name' : 'Microsoft Visual Studio 98',
+ 'libpaths' : [
+ 'Program Files\\Microsoft Visual Studio\\VC98\\Lib'
+ ],
+ 'incpaths' : [
+ 'Program Files\\Microsoft Visual Studio\\VC98\\Include'
+ ],
+ 'nmake' : [
+ 'Program Files\\Microsoft Visual Studio\\VC98\\Bin',
+ ''
+ ],
+ 'additional_switches' : [
+ '/QIfist'
+ ],
+ 'installedDrive' : 'C'
+ }
+
+ ];
+
+
+ var mysqlVersions = [
+ {
+ 'name' : 'MySQL 5.1',
+ 'libpaths' : [
+ 'Program Files\\MySQL\\MySQL Server 5.1\\Lib\\opt'
+ ],
+ 'incpaths' : [
+ 'Program Files\\MySQL\\MySQL Server 5.1\\Include'
+ ],
+ 'dllfile' : 'Program Files\\MySQL\\MySQL Server 5.1\\bin\\libmsyql.dll',
+ 'installedDrive' : 'C'
+ },
+
+ {
+ 'name' : 'MySQL 5.0',
+ 'libpaths' : [
+ 'Program Files\\MySQL\\MySQL Server 5.0\\Lib\\opt'
+ ],
+ 'incpaths' : [
+ 'Program Files\\MySQL\\MySQL Server 5.0\\Include'
+ ],
+ 'dllfile' : 'Program Files\\MySQL\\MySQL Server 5.0\\Bin\\libmysql.dll',
+ 'installedDrive' : 'C'
+ },
+
+ {
+ 'name' : 'MySQL 4.1',
+ 'libpaths' : [
+ 'Program Files\\MySQL\\MySQL Server 4.1\\Lib\\opt'
+ ],
+ 'incpaths' : [
+ 'Program Files\\MySQL\\MySQL Server 4.1\\Include'
+ ],
+ 'dllfile' : 'Program Files\\MySQL\\MySQL Server 4.1\\Bin\\libmysql.dll',
+ 'installedDrive' : 'C'
+ },
+
+ {
+ 'name' : 'MySQL 4.0',
+ 'libpaths' : [
+ 'Program Files\\MySQL\\MySQL Server 4.0\\Lib\\opt'
+ ],
+ 'incpaths' : [
+ 'Program Files\\MySQL\\MySQL Server 4.0\\Include'
+ ],
+ 'dllfile' : 'Program Files\\MySQL\\MySQL Server 4.0\\Bin\\libmysql.dll',
+ 'installedDrive' : 'C'
+ },
+
+ {
+ 'name' : 'MySQL 3.23 or older (or other default path)',
+ 'libpaths' : [
+ 'mysql\\lib\\opt'
+ ],
+ 'incpaths' : [
+ 'mysql\\include'
+ ],
+ 'dllfile' : 'mysql\\Bin\\libmysql.dll',
+ 'installedDrive' : 'C'
+ }
+
+ ];
+
+ var bannerReplacements = [
+ {
+ 'findtext' : /CURVER/g,
+ 'replacement' : function() { FindAnopeVersion(); return anopeVersion; }
+ },
+ {
+ 'findtext' : / For more options type .\/Config --help/g,
+ 'replacement' : function() { return ''; }
+ }
+ ];
+
+
+ var fso = WScript.CreateObject("Scripting.FileSystemObject");
+ var x, y, z;
+
+ if (fso.FileExists('.BANNER')) {
+ var bannerStream = fso.OpenTextFile(".BANNER");
+ var bannerText = bannerStream.ReadAll();
+ bannerStream.close();
+
+ for (x in bannerReplacements) {
+ var thisReplacement = bannerReplacements[x];
+ bannerText = bannerText.replace(thisReplacement['findtext'], thisReplacement['replacement']);
+ }
+
+ WScript.Echo(bannerText+"\n");
+ }
+ else {
+ WScript.Echo("ERROR: Cannot find banner file!\n");
+ }
+
+ WScript.Echo("Press Enter to Begin...");
+ InstallerInput();
+ WScript.Echo("");
+
+ for (x in installerQuestions) {
+ var thisQuestion = installerQuestions[x];
+ var validResponse = false;
+ var validOpts = new Array();
+ while (!validResponse) {
+ for (y in thisQuestion.question) {
+ var qLine = thisQuestion.question[y];
+ WScript.Echo(qLine);
+ }
+ WScript.Echo('');
+ var choiceLine = '';
+ for (y in thisQuestion.options) {
+ choiceLine += thisQuestion.options[y] + ', ';
+ validOpts[thisQuestion.options[y]] = true;
+ }
+ choiceLine = choiceLine.substring(0, choiceLine.length - 2);
+ WScript.Echo("Available Options: "+choiceLine);
+ WScript.Echo("Default Answer: "+thisQuestion.default_answer+"\n");
+ WScript.Echo(thisQuestion.short);
+ var inputValue = InstallerInput().toLowerCase();
+ if (!inputValue) {
+ inputValue = thisQuestion.default_answer;
+ }
+ if (!validOpts[inputValue]) {
+ WScript.Echo("ERROR: Invalid option '"+inputValue+"'\n");
+ }
+ else if (thisQuestion.store_answer(inputValue)) {
+ validResponse = true;
+ }
+ }
+ WScript.Echo("");
+ }
+
+ if (!findCompiler()) {
+ WScript.Echo("\nERROR: No suitable build tools were found!");
+ WScript.Echo("Please ensure you have downloaded and installed a version of Visual C++ and/or PlatformSDK.\n");
+ WScript.Echo("For more information on the tools needed to build Anope on Windows, see:\nhttp://windows.anope.org\n");
+ }
+ else {
+ WScript.Echo("\nBuild tools were found successfully!\n");
+ WScript.Echo("\nAnope will be compiled with the following options:\n");
+ for (x in installerResponses) {
+ var thisResponse = installerResponses[x];
+ WScript.Echo("\t"+x+":\t\t["+thisResponse.toUpperCase()+"]");
+ }
+ for (x in softwareVersions) {
+ var thisVer = softwareVersions[x];
+ if (!thisVer) {
+ WScript.Echo("\t"+x+" Version:\t\tNot Enabled");
+ }
+ else {
+ WScript.Echo("\t"+x+" Version:\t\t"+thisVer.name);
+ }
+ }
+ WScript.Echo("\tAnope Version:\t\t\t"+anopeVersion);
+ WScript.Echo("\nTo continue, please press Enter...");
+ InstallerInput();
+
+ var f = fso.OpenTextFile("Makefile.inc.win32", 2);
+ f.WriteLine("#");
+ f.WriteLine("# Generated by install.js");
+ f.WriteLine("#");
+
+ if (typeof(softwareVersions['Compiler'].additional_switches) !== 'boolean') {
+ var switch_line = '';
+ for (x in softwareVersions['Compiler'].additional_switches) {
+ switch_line += softwareVersions['Compiler'].additional_switches[x]+" ";
+ }
+ f.WriteLine("VC6="+switch_line);
+ }
+ var path_line = '';
+ for (x in softwareVersions['Compiler'].libpaths) {
+ path_line += "/LIBPATH:\""+softwareVersions['Compiler'].installedDrive+":\\"+softwareVersions['Compiler'].libpaths[x]+"\" ";
+ }
+ f.WriteLine("LIBPATH="+path_line);
+ path_line = '';
+ var path_line_rc = '';
+ for (x in softwareVersions['Compiler'].incpaths) {
+ path_line += "/I \""+softwareVersions['Compiler'].installedDrive+":\\"+softwareVersions['Compiler'].incpaths[x]+"\" ";
+ path_line_rc += "/i \""+softwareVersions['Compiler'].installedDrive+":\\"+softwareVersions['Compiler'].incpaths[x]+"\" ";
+ }
+ f.WriteLine("INCFLAGS="+path_line);
+ f.WriteLine("VERSION="+anopeVersion);
+ f.WriteLine("PROGRAM=anope.exe");
+ f.WriteLine("DATDEST=data");
+ f.WriteLine("CC=cl");
+ f.WriteLine("RC=rc");
+ f.WriteLine("MAKE=nmake -f Makefile.win32");
+ f.WriteLine("BASE_CFLAGS=$(VC6) /O2 /MD $(INCFLAGS)");
+ f.WriteLine("RC_FLAGS="+path_line_rc);
+ f.WriteLine("LIBS=wsock32.lib advapi32.lib /NODEFAULTLIB:libcmtd.lib");
+ f.WriteLine("LFLAGS=$(LIBPATH)");
+
+ for (x in installerQuestions) {
+ var thisQuestion = installerQuestions[x];
+ thisQuestion.commit_config();
+ }
+
+ f.WriteLine("MORE_CFLAGS = /I\"../include\"");
+ f.WriteLine("CFLAGS = /nologo $(CDEFS) $(BASE_CFLAGS) $(MORE_CFLAGS)");
+ f.close();
+
+ generateRC();
+
+ WScript.Echo("\nConfiguration Complete!");
+ WScript.Echo("-----------------------\n");
+ WScript.Echo("Anope has been configured to your system. To compile, simply type:");
+ WScript.Echo("nmake -f Makefile.win32\n");
+ WScript.Echo("If you update Anope, you should run this script again to ensure\nall available options are set.\n");
+
+ }
+ // Fin.
+
+ // -----------------------------------------------------------------
+
+ // Functions
+
+ function FindAnopeVersion() {
+ if (!fso.FileExists('version.log')) {
+ anopeVersion = 'Unknown';
+ return;
+ }
+
+ var versionLog = fso.OpenTextFile("version.log");
+ while (!versionLog.atEndOfStream) {
+ var versionLine = versionLog.readline();
+ var thisMatch = versionLine.replace('\n', '');
+ while (thisMatch.match(/\"/g)) {
+ thisMatch = thisMatch.replace('"', '');
+ }
+ versionLine = thisMatch;
+ if (versionLine.match(/VERSION_MAJOR=/g)) {
+ vMaj = versionLine.replace('VERSION_MAJOR=', '');
+ continue;
+ }
+ if (versionLine.match(/VERSION_MINOR=/g)) {
+ vMin = versionLine.replace('VERSION_MINOR=', '');
+ continue;
+ }
+ if (versionLine.match(/VERSION_PATCH=/g)) {
+ vPat = versionLine.replace('VERSION_PATCH=', '');
+ continue;
+ }
+ if (versionLine.match(/VERSION_EXTRA=/g)) {
+ vExtra = versionLine.replace('VERSION_EXTRA=', '');
+ continue;
+ }
+ if (versionLine.match(/VERSION_BUILD=/g)) {
+ vBuild = versionLine.replace('VERSION_BUILD=', '');
+ continue;
+ }
+ }
+ versionLog.close();
+ anopeVersion = vMaj+"."+vMin+"."+vPat+"."+vBuild+vExtra;
+ return;
+ }
+
+ function InstallerInput() {
+ var input = WScript.StdIn.Readline();
+ return input;
+ }
+
+ function findMySQL() {
+ WScript.Echo("\nLooking for MySQL...\n");
+ var installedDrive = "";
+ for (x in mysqlVersions) {
+ var thisSQLVer = mysqlVersions[x];
+ WScript.Echo("Looking for: "+thisSQLVer.name+"...");
+ if (!(installedDrive = findFile("libmysql.lib", thisSQLVer.libpaths))) {
+ WScript.Echo("ERROR: Cannot find libmysql.lib - This version is probably not installed...\n");
+ continue;
+ }
+ if (!findFile("mysql.h", thisSQLVer.incpaths)) {
+ WScript.Echo("ERROR: Cannot find mysql.h - Half of this version of MySQL is installed (strange)...\n");
+ continue;
+ }
+ WScript.Echo("SUCCESS: "+thisSQLVer.name+" is installed, and is complete!\n");
+ thisSQLVer.installedDrive = installedDrive;
+ softwareVersions.MySQLDB = thisSQLVer;
+ return true;
+ }
+ return false;
+ }
+
+ function findCompiler() {
+ WScript.Echo("\nLooking for a suitable compiler...\n");
+ var noPSDK = false;
+ var installedDrive = "";
+ for (x in buildPackages) {
+ var thisPack = buildPackages[x];
+ WScript.Echo("Looking for: "+thisPack.name+"...");
+ if (!(installedDrive = findFile("MSVCRT.lib", thisPack.libpaths))) {
+ WScript.Echo("ERROR: Cannot find MSVCRT.lib - This version is probably not installed...\n");
+ continue;
+ }
+ if (!findFile("wsock32.lib", thisPack.libpaths)) {
+ WScript.Echo("ERROR: Cannot find wsock32.lib - Probably missing PlatformSDK...\n");
+ noPSDK = true;
+ continue;
+ }
+ if (!findFile("advapi32.lib", thisPack.libpaths)) {
+ WScript.Echo("ERROR: Cannot find advapi32.lib - Probably missing PlatformSDK...\n");
+ noPSDK = true;
+ continue;
+ }
+ if (!findFile("stdio.h", thisPack.incpaths)) {
+ WScript.Echo("ERROR: Cannot find stdio.h - Missing core header files...\n");
+ continue;
+ }
+ if (!findFile("windows.h", thisPack.incpaths)) {
+ WScript.Echo("ERROR: Cannot find windows.h - Probably missing PlatformSDK headers...\n");
+ noPSDK = true;
+ continue;
+ }
+ if (!findFile("nmake.exe", thisPack.nmake)) {
+ WScript.Echo("ERROR: Cannot find a copy of nmake.exe...\n");
+ WScript.Echo("In order to compile Anope, you need a working copy of nmake.exe on your system.");
+ WScript.Echo("A freely available copy can be downloaded from the url below.");
+ WScript.Echo("nmake.exe is also available in the PlatformSDK which can be freely downloaded from Microsoft.\n");
+ WScript.Echo("nmake.exe:\nhttp://download.microsoft.com/download/vc15/patch/1.52/w95/en-us/nmake15.exe\n");
+ break;
+ }
+ WScript.Echo("SUCCESS: "+thisPack.name+" was found, and is complete!");
+ thisPack.installedDrive = installedDrive;
+ softwareVersions.Compiler = thisPack;
+ return true;
+ }
+ if (noPSDK) {
+ WScript.Echo("Some of the build tools were detected on your computer, but the essential PlatformSDK components were missing.");
+ WScript.Echo("You will need to download the PlatformSDK from the URL below, ensuring that the Core Windows files, and Debugging Tools are installed.");
+ WScript.Echo("For more details on installing the PlatformSDK, visit http://windows.anope.org\n");
+ WScript.Echo("PSDK: http://download.microsoft.com/download/a/5/f/a5f0d781-e201-4ab6-8c6a-9bb4efed1e1a/PSDK-x86.exe\n");
+ }
+ return false;
+ }
+
+ function findFile(fileName, arrayOfPaths) {
+ for (z in arrayOfPaths) {
+ var thisPath = arrayOfPaths[z];
+ for (y in drivesToCheck) {
+ var thisDrive = drivesToCheck[y];
+ if (fso.FileExists(thisDrive+":\\"+thisPath+"\\"+fileName)) {
+ return thisDrive;
+ }
+ }
+ }
+ return false;
+ }
+
+ function generateRC() {
+ var version_matches = [
+ {
+ 'find' : /VERSION_COMMA/g,
+ 'replacement' : vMaj+","+vMin+","+vPat+","+vBuild
+ },
+
+ {
+ 'find' : /VERSION_FULL/g,
+ 'replacement' : anopeVersion
+ },
+
+ {
+ 'find' : /VERSION_DOTTED/g,
+ 'replacement' : vMaj+"."+vMin+"."+vPat+"."+vBuild
+ }
+ ];
+
+ var template = fso.OpenTextFile("src/win32.rc.template", 1);
+ var output = fso.OpenTextFile("src/win32.rc", 2, true);
+ if (!template) {
+ WScript.Echo("ERROR: Unable to generate win32.rc file - Couldn't open source file..");
+ }
+ if (!output) {
+ WScript.Echo("ERROR: Unable to generate win32.rc file - Couldn't open output file..");
+ }
+ var templateText = template.ReadAll();
+ template.close();
+
+ for (x in version_matches) {
+ var thisVerStr = version_matches[x];
+ while (templateText.match(thisVerStr.find)) {
+ templateText = templateText.replace(thisVerStr.find, thisVerStr.replacement);
+ }
+ }
+
+ output.WriteLine(templateText);
+ output.close();
+ }
+
diff --git a/install.sh b/install.sh
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/install.sh
diff --git a/lang/Makefile b/lang/Makefile
new file mode 100644
index 000000000..9f7a9a7e0
--- /dev/null
+++ b/lang/Makefile
@@ -0,0 +1,82 @@
+# Makefile for language module
+
+MAKEARGS = 'CFLAGS=${CFLAGS}' 'CC=${CC}' 'ANOPELIBS=${ANOPELIBS}' \
+ 'LDFLAGS=${LDFLAGS}' 'BINDEST=${BINDEST}' 'INSTALL=${INSTALL}' \
+ 'INCLUDEDIR=${INCLUDEDIR}' 'RM=${RM}' 'CP=${CP}' \
+ 'TOUCH=${TOUCH}' 'SHELL=${SHELL}' 'DATDEST=${DATDEST}' \
+ 'RUNGROUP=${RUNGROUP}' 'USE_MODULES=${USE_MODULES}'
+
+LANGOBJS = cat de en_us es fr gr hun it nl pl pt ru tr
+LANGSRCS = cat.l de.l en_us.l es.l fr.l gr.l hun.l it.l nl.l pl.l pt.l ru.l tr.l
+
+LANGCOMP = ./langcomp
+#LANGCOMP = ./langcomp -w
+
+
+all: $(LANGOBJS)
+
+distclean: clean spotless
+
+install: all
+ test -d $(DATDEST)/languages || mkdir $(DATDEST)/languages
+ @if [ "$(RUNGROUP)" ] ; then \
+ echo chgrp -R $(RUNGROUP) $(DATDEST)/languages ; \
+ chgrp -R $(RUNGROUP) $(DATDEST)/languages ; \
+ echo chmod -R g+rw $(DATDEST)/languages ; \
+ chmod -R g+rw $(DATDEST)/languages ; \
+ $(CP) $(LANGOBJS) $(DATDEST)/languages ; \
+ echo chgrp -R $(RUNGROUP) $(DATDEST)/languages ; \
+ chgrp -R $(RUNGROUP) $(DATDEST)/languages/* ; \
+ echo chmod -R g+rw $(DATDEST)/languages/* ; \
+ chmod -R g+rw $(DATDEST)/languages/* ; \
+ fi
+ @if [ ! "$(RUNGROUP)" ] ; then \
+ chmod 700 $(DATDEST)/languages/ ; \
+ $(CP) $(LANGOBJS) $(DATDEST)/languages ; \
+ chmod 600 $(DATDEST)/languages/* ; \
+ fi
+
+clean:
+ rm -f $(LANGOBJS) langcomp language.h
+
+spotless: clean
+ rm -f index
+
+
+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
+hun: hun.l langcomp index
+ ./langcomp $@.l
+it: it.l langcomp index
+ ./langcomp $@.l
+nl: nl.l langcomp index
+ ./langcomp $@.l
+pl: pl.l langcomp index
+ ./langcomp $@.l
+pt: pt.l langcomp index
+ ./langcomp $@.l
+ru: ru.l langcomp index
+ ./langcomp $@.l
+tr: tr.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";'
+ cp language.h ../include
+
+index: en_us.l
+ grep '^[A-Z]' en_us.l >index
diff --git a/lang/Makefile.win32 b/lang/Makefile.win32
new file mode 100644
index 000000000..4791287e0
--- /dev/null
+++ b/lang/Makefile.win32
@@ -0,0 +1,75 @@
+# Makefile for language module
+
+include ../Makefile.inc.win32
+
+
+LANGOBJS = cat de en_us es fr hun gr nl pl pt tr it ru
+LANGSRCS = cat de en_us.l es fr.l hun.l gr.l nl.l pl.l pt.l tr.l it.l ru.l
+
+LANGCOMP = ./langcomp
+#LANGCOMP = ./langcomp -w
+
+
+all: $(LANGOBJS)
+
+
+install: all
+ -copy cat ..\$(DATDEST)\languages
+ -copy en_us ..\$(DATDEST)\languages
+ -copy de ..\$(DATDEST)\languages
+ -copy es ..\$(DATDEST)\languages
+ -copy fr ..\$(DATDEST)\languages
+ -copy hun ..\$(DATDEST)\languages
+ -copy gr ..\$(DATDEST)\languages
+ -copy nl ..\$(DATDEST)\languages
+ -copy pl ..\$(DATDEST)\languages
+ -copy pt ..\$(DATDEST)\languages
+ -copy tr ..\$(DATDEST)\languages
+ -copy it ..\$(DATDEST)\languages
+ -copy ru ..\$(DATDEST)\languages
+
+clean:
+ -@erase $(LANGOBJS) langcomp.exe langtool.exe *.obj index
+
+spotless: clean
+ -@erase language.h
+
+
+cat: cat.l langtool.exe langcomp.exe index
+ langcomp $@.l
+de: de.l langtool.exe langcomp.exe index
+ langcomp $@.l
+en_us: en_us.l langtool.exe langcomp.exe index
+ langcomp $@.l
+es: es.l langtool.exe langcomp.exe index
+ langcomp $@.l
+fr: fr.l langtool.exe langcomp.exe index
+ langcomp $@.l
+hun: hun.l langtool.exe langcomp.exe index
+ langcomp $@.l
+gr: gr.l langtool.exe langcomp.exe index
+ langcomp $@.l
+nl: nl.l langtool.exe langcomp.exe index
+ langcomp $@.l
+pl: pl.l langtool.exe langcomp.exe index
+ langcomp $@.l
+pt: pt.l langtool.exe langcomp.exe index
+ langcomp $@.l
+tr: tr.l langtool.exe langcomp.exe index
+ langcomp $@.l
+it: it.l langtool.exe langcomp.exe index
+ langcomp $@.l
+ru: ru.l langtool.exe langcomp.exe index
+ langcomp $@.l
+
+langtool.exe: langtool.c
+ $(CC) $(CFLAGS) langtool.c -o $@ /link $(LFLAGS)
+
+langcomp.exe: langcomp.c
+ $(CC) $(CFLAGS) langcomp.c -o $@ /link $(LFLAGS)
+
+language.h: langtool.exe index
+ langtool language.h
+
+index: langtool.exe en_us.l
+ langtool index
diff --git a/lang/cat.l b/lang/cat.l
new file mode 100644
index 000000000..cc1653bd6
--- /dev/null
+++ b/lang/cat.l
@@ -0,0 +1,6911 @@
+# Catalan Language File.
+#
+# (C) 2003-2008 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 parameters, let us know
+# (dev@anope.org) 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
+# services.conf). 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. "%R%s HELP" per ajuda.
+SYNTAX_ERROR
+ Sintàxis: %s
+MORE_INFO
+ %R%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.
+INVALID_TARGET
+ "/msg %s" is no longer supported. Use "/msg %s@%s" or "/%s" instead.
+
+# 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_TOO_LONG
+ Your password is too long. Please try again with a shorter password.
+
+NICK_NOT_REGISTERED
+ El teu nick no esta registrat.
+NICK_NOT_REGISTERED_HELP
+ El teu nick no esta registrat. Escriu %R%s HELP per mes informació al registrat el teu nickname.
+NICK_X_IS_SERVICES
+ Nick %s is part of this Network's Services.
+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.
+NICK_X_SUSPENDED
+ Nick %s is currently suspended.
+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 %R%s IDENTIFY clau.
+CHAN_IDENTIFY_REQUIRED
+ Autentificació per clau requerida per aquesta comanda.
+ Intenta de nou després d'escriure %R%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
+LIST_INCORRECT_RANGE
+ Incorrect range specified. The correct syntax is #from-to.
+CS_LIST_INCORRECT_RANGE
+ To search for channels starting with #, search for the channel
+ name without the #-sign prepended (anope instead of #anope).
+
+###########################################################################
+#
+# NickServ messages
+#
+###########################################################################
+
+# Automatic messages
+HELP_LIMIT_SERV_OPER
+ Limited to Services Operators.
+HELP_LIMIT_SERV_ADMIN
+ Limited to Services Administrators.
+HELP_LIMIT_SERV_ROOT
+ Limited to Services Roots.
+HELP_LIMIT_IRC_OPER
+ Limited to IRC Operators.
+HELP_LIMIT_HOST_SETTER
+ Limited to Host Setters.
+HELP_LIMIT_HOST_REMOVER
+ Limited to Host Removers.
+
+
+###########################################################################
+#
+# 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 %R%s IDENTIFY clau.)
+NICK_IS_SECURE
+ Aquest nick esta registrat i protegit. Si es el teu
+ nick, escriu %R%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_REGISTERED_NO_MASK
+ Nickname %s registered.
+NICK_PASSWORD_IS
+ La teva clau es %s - Recordala per un us futur.
+
+# GROUP responses
+NICK_REG_DELAY
+ You have to be connected longer than %d seconds to register your nick.
+
+# 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 %R%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 %R%s HELP GLIST i %R%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 %R%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_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 %R%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_HIDE_STATUS_ON
+ Your services access status will now be hidden from %s INFO displays.
+NICK_SET_HIDE_STATUS_OFF
+ Your services access status will now be shown in %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 AUTOOP responses
+NICK_SET_AUTOOP_SYNTAX
+ SET AUTOOP {ON | OFF}
+NICK_SET_AUTOOP_ON
+ Services will now autoop you in channels.
+NICK_SET_AUTOOP_OFF
+ Services will no longer autoop you in channels.
+
+# SASET NOEXPIRE responses
+NICK_SASET_SYNTAX
+ SASET nickname option parameters
+NICK_SASET_DISABLED
+ Sorry, nickname option setting is temporarily disabled.
+NICK_SASET_UNKNOWN_OPTION
+ Unknown SASET option %s.
+NICK_SASET_BAD_NICK
+ Nickname %s not registered.
+NICK_SASET_OPTION_DISABLED
+ Option %s cannot be set on this network.
+
+# SASET DISPLAY responses
+NICK_SASET_DISPLAY_INVALID
+ The new display for %s MUST be a nickname of the nickname group!
+NICK_SASET_DISPLAY_CHANGED
+ The new display is now %s.
+
+# SASET PASSWORD responses
+NICK_SASET_PASSWORD_FAILED
+ Sorry, couldn't change password for %s.
+NICK_SASET_PASSWORD_CHANGED
+ Password for %s changed.
+NICK_SASET_PASSWORD_CHANGED_TO
+ Password for %s changed to %s.
+
+# SASET LANGUAGE responses
+NICK_SASET_URL_CHANGED
+ URL for %s changed to %s.
+NICK_SASET_URL_UNSET
+ URL %s unset.
+
+# SASET EMAIL responses
+NICK_SASET_EMAIL_CHANGED
+ E-mail address for %s changed to %s.
+NICK_SASET_EMAIL_UNSET
+ E-mail address for %s unset.
+NICK_SASET_EMAIL_UNSET_IMPOSSIBLE
+ You cannot unset the e-mail on this network.
+
+# SASET ICQ responses
+NICK_SASET_ICQ_CHANGED
+ ICQ number for %s set to %s.
+NICK_SASET_ICQ_UNSET
+ ICQ number for %s unset.
+NICK_SASET_ICQ_INVALID
+ %s is not a valid number.
+
+# SASET GREET responses
+NICK_SASET_GREET_CHANGED
+ Greet message for %s changed to %s.
+NICK_SASET_GREET_UNSET
+ Greet message for %s unset.
+
+# SASET PROTECT responses
+NICK_SASET_KILL_SYNTAX
+ SASET nickname KILL {ON | QUICK | OFF}
+NICK_SASET_KILL_IMMED_SYNTAX
+ SASET nickname KILL {ON | QUICK | IMMED | OFF}
+NICK_SASET_KILL_ON
+ Protection is now ON for %s.
+NICK_SASET_KILL_QUICK
+ Protection is now ON for %s, with a reduced delay.
+NICK_SASET_KILL_IMMED
+ Protection is now ON for %s, with no delay.
+NICK_SASET_KILL_IMMED_DISABLED
+ The IMMED option is not available on this network.
+NICK_SASET_KILL_OFF
+ Protection is now OFF for %s.
+
+# SASET SECURE responses
+NICK_SASET_SECURE_SYNTAX
+ SASET nickname SECURE {ON | OFF}
+NICK_SASET_SECURE_ON
+ Secure option is now ON for %s.
+NICK_SASET_SECURE_OFF
+ Secure option is now OFF for %s.
+
+# SASET PRIVATE responses
+NICK_SASET_PRIVATE_SYNTAX
+ SASET nickname PRIVATE {ON | OFF}
+NICK_SASET_PRIVATE_ON
+ Private option is now ON for %s.
+NICK_SASET_PRIVATE_OFF
+ Private option is now OFF for %s.
+
+# SASET HIDE responses
+NICK_SASET_HIDE_SYNTAX
+ SET nickname HIDE {EMAIL | USERMASK | QUIT} {ON | OFF}
+NICK_SASET_HIDE_EMAIL_ON
+ The E-mail address of %s will now be hidden from %s INFO displays.
+NICK_SASET_HIDE_EMAIL_OFF
+ The E-mail address of %s will now be shown in %s INFO displays.
+NICK_SASET_HIDE_MASK_ON
+ The last seen user@host mask of %s will now be hidden from %s INFO displays.
+NICK_SASET_HIDE_MASK_OFF
+ The last seen user@host mask of %s will now be shown in %s INFO displays.
+NICK_SASET_HIDE_QUIT_ON
+ The last quit message of %s will now be hidden from %s INFO displays.
+NICK_SASET_HIDE_QUIT_OFF
+ The last quit message of %s will now be shown in %s INFO displays.
+NICK_SASET_HIDE_STATUS_ON
+ The services access status of %s will now be hidden from %s INFO displays.
+NICK_SASET_HIDE_STATUS_OFF
+ The services access status of %s will now be shown in %s INFO displays.
+
+# SASET MSG responses
+NICK_SASET_MSG_SYNTAX
+ SSAET nickname PRIVATE {ON | OFF}
+NICK_SASET_MSG_ON
+ Services will now reply to %s with messages.
+NICK_SASET_MSG_OFF
+ Services will now reply to %s with notices.
+
+# SET NOEXPIRE responses
+NICK_SASET_NOEXPIRE_SYNTAX
+ SASET nickname NOEXPIRE {ON | OFF}
+NICK_SASET_NOEXPIRE_ON
+ Nick %s will not expire.
+NICK_SASET_NOEXPIRE_OFF
+ Nick %s will expire.
+
+# ACCESS responses
+NICK_SASET_AUTOOP_SYNTAX
+ SASET nickname AUTOOP {ON | OFF}
+NICK_SASET_AUTOOP_ON
+ Services will now autoop %s in channels.
+NICK_SASET_AUTOOP_OFF
+ Services will no longer autoop %s in channels.
+
+# SASET LANGUAGE responses
+NICK_SASET_LANGUAGE_SYNTAX
+ SASET nickname LANGUAGE number
+NICK_SASET_LANGUAGE_UNKNOWN
+ Unknown language number %d. Type %R%s HELP SET LANGUAGE for a list of languages.
+NICK_SASET_LANGUAGE_CHANGED
+ Language changed to Catalan.
+
+
+# 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:
+NICK_ACCESS_LIST_EMPTY
+ Your access list is empty.
+NICK_ACCESS_LIST_X_EMPTY
+ Access list for %s is empty.
+
+# Status messages
+NICK_STATUS_0
+ STATUS %s 0
+NICK_STATUS_1
+ STATUS %s 1
+NICK_STATUS_2
+ STATUS %s 2
+NICK_STATUS_3
+ STATUS %s 3
+
+# 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_SERVICES_ROOT
+ %s is a services root administrator.
+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_VHOST2
+ vhost: %s@%s
+NICK_INFO_ICQ
+ ICQ #: %d
+NICK_INFO_GREET
+ Missatge de benvinguda: %s
+NICK_INFO_OPTIONS
+ Opciós: %s
+NICK_INFO_EXPIRE
+ Expires in: %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_AUTOOP
+ Auto-op
+NICK_INFO_OPT_NONE
+ Cap
+NICK_INFO_NO_EXPIRE
+ Aquest nickname no caducara.
+NICK_INFO_FOR_MORE
+ Per més informació, escriu %R%s INFO %s ALL.
+
+# LIST responses
+NICK_INFO_SUSPENDED
+ This nickname is currently suspended, reason: %s
+NICK_INFO_SUSPENDED_NO_REASON
+ This nickname is currently suspended
+
+# LIST responses
+NICK_LIST_SYNTAX
+ LIST patro
+NICK_LIST_SERVADMIN_SYNTAX
+ LIST patro [FORBIDDEN] [SUSPENDED] [NOEXPIRE] [UNCONFIRMED]
+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.
+NICK_GLIST_REPLY
+ %c%s
+NICK_GLIST_REPLY_ADMIN
+ %c%s (expires in %s)
+
+# 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.
+ %R%s RELEASE %s per recuperar-lo abans %s 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.
+
+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_SUSPEND_SYNTAX
+ SUSPEND nickname reason
+NICK_SUSPEND_SUCCEEDED
+ Nick %s is now suspended.
+NICK_SUSPEND_FAILED
+ Couldn't suspend nick %s!
+
+# UNSUSPEND responses
+NICK_UNSUSPEND_SYNTAX
+ UNSUSPEND nickname
+NICK_UNSUSPEND_SUCCEEDED
+ Nick %s is now released.
+NICK_UNSUSPEND_FAILED
+ Couldn't release nick %s!
+
+# 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 %R%s confirm <passcode> to complete registration
+NICK_CONFIRM_NOT_FOUND
+ Registration step 1 may have expired, please use "%R%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 " %R%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_X_INVALID
+ Channel %s is not a valid channel.
+
+# 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 %R%s HELP per més informació de com registrar nicknames.
+CHAN_MUST_IDENTIFY_NICK
+ Per favor primer identifica't amb %s, utilitzant la comanda:
+ %R%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.
+CHAN_REGISTER_NONE_CHANNEL
+ You have attempted to register a nonexistent channel %s
+CHAN_SYMBOL_REQUIRED
+ Please use the symbol of # when attempting to register
+
+
+# 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 (except the channel founder).
+CHAN_LOGOUT_FOUNDER_FAILED
+ You may not log out of %s (you are founder).
+
+# 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
+ Topic retention option for %s is now ON.
+CHAN_SET_KEEPTOPIC_OFF
+ Topic retention option for %s is now OFF.
+
+# SET TOPICLOCK responses
+CHAN_SET_TOPICLOCK_SYNTAX
+ SET canal TOPICLOCK {ON | OFF}
+CHAN_SET_TOPICLOCK_ON
+ Topic lock option for %s is now ON.
+CHAN_SET_TOPICLOCK_OFF
+ Topic lock option for %s is now OFF.
+
+# SET PEACE responses
+CHAN_SET_PEACE_SYNTAX
+ SET canal PEACE {ON | OFF}
+CHAN_SET_PEACE_ON
+ Peace option for %s is now ON.
+CHAN_SET_PEACE_OFF
+ Peace option for %s is now OFF.
+
+# SET PRIVATE responses
+CHAN_SET_PRIVATE_SYNTAX
+ SET canal PRIVATE {ON | OFF}
+CHAN_SET_PRIVATE_ON
+ Private option for %s is now ON.
+CHAN_SET_PRIVATE_OFF
+ Private option for %s is now OFF.
+
+# SET SECUREOPS responses
+CHAN_SET_SECUREOPS_SYNTAX
+ SET canal SECUREOPS {ON | OFF}
+CHAN_SET_SECUREOPS_ON
+ Secure ops option for %s is now ON.
+CHAN_SET_SECUREOPS_OFF
+ Secure ops option for %s is now OFF.
+
+# SET SECUREFOUNDER responses
+CHAN_SET_SECUREFOUNDER_SYNTAX
+ SET canal SECUREFOUNDER {ON | OFF}
+CHAN_SET_SECUREFOUNDER_ON
+ Secure founder option for %s is now ON.
+CHAN_SET_SECUREFOUNDER_OFF
+ Secure founder option for %s is now OFF.
+
+# SET RESTRICTED responses
+CHAN_SET_RESTRICTED_SYNTAX
+ SET canal RESTRICTED {ON | OFF}
+CHAN_SET_RESTRICTED_ON
+ Restricted access option for %s is now ON.
+CHAN_SET_RESTRICTED_OFF
+ Restricted access option for %s is now OFF.
+
+# SET SECURE responses
+CHAN_SET_SECURE_SYNTAX
+ SET canal SECURE {ON | OFF}
+CHAN_SET_SECURE_ON
+ Secure option for %s is now ON.
+CHAN_SET_SECURE_OFF
+ Secure option for %s is now OFF.
+
+# SET SIGNKICK responses
+CHAN_SET_SIGNKICK_SYNTAX
+ SET canal SIGNKICK {ON | LEVEL | OFF}
+CHAN_SET_SIGNKICK_ON
+ Signed kick option for %s is now ON.
+CHAN_SET_SIGNKICK_LEVEL
+ Signed kick option for %s is now ON, but depends of the
+ level of the user that is using the command.
+CHAN_SET_SIGNKICK_OFF
+ Signed kick option for %s is now OFF.
+
+# SET OPNOTICE responses
+CHAN_SET_OPNOTICE_SYNTAX
+ SET canal OPNOTICE {ON | OFF}
+CHAN_SET_OPNOTICE_ON
+ Op-notice option for %s is now ON.
+CHAN_SET_OPNOTICE_OFF
+ Op-notice option for %s is now OFF.
+
+# SET XOP responses
+CHAN_SET_XOP_SYNTAX
+ SET canal XOP {ON | OFF}
+CHAN_SET_XOP_ON
+ xOP lists system for %s is now ON.
+CHAN_SET_XOP_OFF
+ xOP lists system for %s is now OFF.
+
+# 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 %R%s HELP ACCESS per més informació.
+CHAN_XOP_NOT_AVAILABLE
+ xOP system is not available.
+
+# 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 %s 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 %s 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 SOP de canals %s 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 VOP de canals %s 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 %R%s HELP comanda per a més informació.
+CHAN_ACCESS_XOP_HOP
+ You can't use this command.
+ Use the AOP, SOP, HOP and VOP commands instead.
+ Type %R%s HELP command for more information.
+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 %s 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 en canal %s 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 %R%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.
+
+# Status Messages
+CHAN_STATUS_SYNTAX
+ STATUS ERROR Syntax error
+CHAN_STATUS_NOT_REGGED
+ STATUS ERROR Channel %s not registered
+CHAN_STATUS_FORBIDDEN
+ STATUS ERROR Channel %s forbidden
+CHAN_STATUS_NOTONLINE
+ STATUS ERROR Nick %s not online
+CHAN_STATUS_INFO
+ STATUS %s %s %d
+
+# 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_EXPIRE
+ Expires in: %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_HOPS
+ Mode +h has been cleared from channel %s.
+CHAN_CLEARED_VOICES
+ Mode +v ha estat eliminat del canal %s.
+CHAN_CLEARED_USERS
+ Tots els usuaris han estat kickegats del canal %s.
+CHAN_CLEARED_INVITES
+ All invites on channel %s have been removed.
+
+# 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_GETKEY_SYNTAX
+ GETKEY channel
+CHAN_GETKEY_NOKEY
+ The channel %s has no key.
+CHAN_GETKEY_KEY
+ KEY %s %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 %R%s READ LAST per llegir el teu últim memo.
+MEMO_TYPE_READ_NUM
+ Escriu %R%s READ %d per a llegir-lo.
+MEMO_TYPE_LIST_NEW
+ Escriu %R%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 %R%s READ %s %d to read it.
+MEMO_NEW_MEMO_ARRIVED
+ Tens un nou memo de %s.
+ Escriu %R%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: %R%s READ numero
+MEMO_LIST_NEW_MEMOS
+ Nous memos per a %s. per a llegir-los escriu: %R%s READ numero
+MEMO_LIST_CHAN_MEMOS
+ Memos per a %s. per a llegir-los escriu: %R%s READ %s numero
+MEMO_LIST_CHAN_NEW_MEMOS
+ Nous memos per a %s. Per a llegir-los escriu: %R%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: %R%s DEL %d
+MEMO_CHAN_HEADER
+ Memo %d de %s (%s). per a esborrar-lo escriu: %R%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_NOTIFY_MAIL
+ You will now be informed about new memos via email.
+MEMO_SET_NOTIFY_NOMAIL
+ You will no longer be informed via email.
+MEMO_SET_NOTIFY_INVALIDMAIL
+ There's no email address set for your nick.
+
+# 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
+MEMO_MAIL_SUBJECT
+ New memo
+MEMO_MAIL_TEXT1
+ Hi %s
+MEMO_MAIL_TEXT2
+ You've just received a new memo from %s. This is memo number %d.
+MEMO_MAIL_TEXT3
+ Memo Text:
+
+###########################################################################
+#
+# BotServ messages
+#
+###########################################################################
+
+# Standard responses
+MEMO_RSEND_PLEASE_WAIT
+ Please wait %d seconds before using the RSEND command again.
+MEMO_RSEND_DISABLED
+ Sorry, RSEND has been disabled on this network.
+MEMO_RSEND_SYNTAX
+ RSEND {nick | channel} memo-text
+MEMO_RSEND_NICK_MEMO_TEXT
+ [auto-memo] The memo you sent has been viewed.
+MEMO_RSEND_CHAN_MEMO_TEXT
+ [auto-memo] The memo you sent to %s has been viewed.
+MEMO_RSEND_USER_NOTIFICATION
+ A notification memo has been sent to %s informing him/her you have
+ read his/her memo.
+
+###########################################################################
+#
+# BotServ messages
+#
+###########################################################################
+
+# Standard responses
+MEMO_CHECK_SYNTAX
+ CHECK nickname
+MEMO_CHECK_NOT_READ
+ The last memo you sent to %s (sent on %s) has not yet been read.
+MEMO_CHECK_READ
+ The last memo you sent to %s (sent on %s) has been read.
+MEMO_CHECK_NO_MEMO
+ Nick %s doesn't have a memo from you.
+
+###########################################################################
+#
+# BotServ messages
+#
+###########################################################################
+
+# Standard responses
+MEMO_NO_RSEND_SELF
+ You can not request a receipt when sending a memo to yourself.
+
+###########################################################################
+#
+# 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 %R%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_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 %R%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 %R%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.
+BOT_LONG_IDENT
+ Bot Idents may only contain %d characters.
+BOT_LONG_HOST
+ Bot Hosts may only contain %d 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_HOSTSERV_MEM
+ HostServ : %6d registres, %5d kB
+OPER_STATS_OPERSERV_MEM
+ OperServ : %6d registres, %5d kB
+OPER_STATS_SESSIONS_MEM
+ Sessions : %6d registres, %5d 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_STATS_UPLINK_SERVER
+ Uplink server: %s
+OPER_STATS_UPLINK_CAPAB
+ Uplink capab: %s
+OPER_STATS_UPLINK_SERVER_COUNT
+ Servers found: %d
+
+# 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_ADMIN_MOVED
+ %s has been moved to Services Administrators list.
+
+# 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.
+OPER_OPER_MOVED
+ %s has been moved to Services Operators list.
+
+# 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
+ CHANKILL [+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.
+OPER_SET_SQL_ON
+ SQL code will be used.
+OPER_SET_SQL_OFF
+ SQL code will not be used.
+OPER_SET_SQL_ERROR
+ Setting for SQL must be ON or OFF.
+OPER_SET_SQL_ERROR_INIT
+ Error during init of SQL, check your logs to correct.
+OPER_SET_SQL_ERROR_DISABLED
+ SQL is not configured for this network. Please edit the
+ configuration file (services.conf).
+OPER_SET_LIST_OPTION_ON
+ %s is enable
+OPER_SET_LIST_OPTION_OFF
+ %s is disabled
+
+# 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 | mask]
+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_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_NO_UNLOAD
+ This module can not be unloaded.
+OPER_MODULE_LOAD_SYNTAX
+ MODLOAD FileName
+OPER_MODULE_UNLOAD_SYNTAX
+ MODUNLOAD FileName
+OPER_MODULE_LIST_HEADER
+ Current Module list:
+OPER_MODULE_LIST
+ Module: %s [%s] [%s]
+OPER_MODULE_LIST_FOOTER
+ %d Modules loaded.
+OPER_MODULE_INFO_LIST
+ Module: %s Version: %s Author: %s loaded: %s
+OPER_MODULE_CMD_LIST
+ Providing command: %R%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.
+OPER_EXCEPTION_EXISTS
+ %s already exists on the EXCEPTION list.
+OPER_EXCEPTION_CHANGED
+ Exception for %s has been updated to %d.
+
+# 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
+ 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 %s messages will be
+ sent in order to avoid flooding the user. If there are
+ more news messages, only the most recent will be sent.)
+ NewsCount can be configured in services.conf.
+
+ 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 %s messages will
+ be sent in order to avoid flooding the user. If there are
+ more news messages, only the most recent will be sent.)
+ NewsCount can be configured in services.conf.
+
+ 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
+ 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:
+
+ %R%s HELP
+ per mes informació sobre registrar nicknames
+
+ %R%s HELP
+ per mes informació sobre registrar i controlar
+ canals
+
+ %R%s HELP
+ per més informació sobre enviar missatges a usuaris no
+ en linea.
+
+HELP_HELP_BOT
+
+ %R%s HELP
+ per més informació sobre establir un bot en el teu canal
+
+HELP_HELP_HOST
+
+ %R%s HELP
+ for information on setting up nick vHosts
+
+###########################################################################
+#
+# NickServ help messages
+#
+###########################################################################
+
+NICK_HELP_CMD_CONFIRM
+ CONFIRM Confirm a nickserv auth code
+NICK_HELP_CMD_RESEND
+ RESEND Resend a nickserv auth code
+NICK_HELP_CMD_REGISTER
+ REGISTER Registra un nickname
+NICK_HELP_CMD_GROUP
+ GROUP Ingresa en un grup
+NICK_HELP_CMD_IDENTIFY
+ IDENTIFY Per identificar-te amb la teva clau
+NICK_HELP_CMD_ACCESS
+ ACCESS Modifica la llista d'adreçes autoritzades
+NICK_HELP_CMD_SET
+ SET Estableix proteccions, inclouent kills
+NICK_HELP_CMD_SASET
+ SASET Set SET-options on another nickname
+NICK_HELP_CMD_DROP
+ DROP Cancela el registre d'un nickname
+NICK_HELP_CMD_RECOVER
+ RECOVER Kickeja un usuari que estigui utilitzant el teu nickname
+NICK_HELP_CMD_RELEASE
+ RELEASE Repren possesió del teu nick després de RECOVER
+NICK_HELP_CMD_SENDPASS
+ SENDPASS Vas oblidar la teva clau? Intenta això
+NICK_HELP_CMD_GHOST
+ GHOST Disconnects a "ghost" IRC session using your nick
+NICK_HELP_CMD_ALIST
+ ALIST List channels you have access on
+NICK_HELP_CMD_GLIST
+ GLIST Lists all nicknames in your group
+NICK_HELP_CMD_INFO
+ INFO Displays information about a given nickname
+NICK_HELP_CMD_LIST
+ LIST List all registered nicknames that match a given pattern
+NICK_HELP_CMD_LOGOUT
+ LOGOUT Reverses the effect of the IDENTIFY command
+NICK_HELP_CMD_STATUS
+ STATUS Returns the owner status of the given nickname
+NICK_HELP_CMD_UPDATE
+ UPDATE Updates your current status, i.e. it checks for new memos
+NICK_HELP_CMD_GETPASS
+ GETPASS Recupera la clau per un nickname
+ (sols si encriptació esta deshabilitada)
+NICK_HELP_CMD_GETEMAIL
+ GETEMAIL Matches and returns all users that registered using given email
+NICK_HELP_CMD_FORBID
+ FORBID Impossibilita que un nickname sigui utilitzat
+NICK_HELP_CMD_SUSPEND
+ SUSPEND Suspend a given nick
+NICK_HELP_CMD_UNSUSPEND
+ UNSUSPEND Unsuspend a given nick
+
+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 %R%S comanda.
+ per més informació sobre una comanda especifica
+ escriu %R%S HELP comanda.
+
+NICK_HELP_FOOTER
+ 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 %R%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 %R%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 (%R%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
+ %R%S LIST
+ HIDE Oculta algunes parts de la teva informació
+ MSG canvia el metode de comunicació amb els
+ serveis
+ AUTOOP Should services op you automatically.
+
+ Per utilitzar aquest comanda, has d'identificar-te primer
+ utilitzant la teva clau (%R%S HELP IDENTIFY
+ per mes informació).
+
+ Escriu %R%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_SET_AUTOOP
+ Syntax: SET AUTOOP {ON | OFF}
+
+ Sets whether you will be opped automatically. Set to ON to
+ allow ChanServ to op you automatically when entering channels.
+
+NICK_HELP_SASET
+ Syntax: SASET nickname option parameters.
+
+ Sets various nickname options. option can be one of:
+
+ DISPLAY Set the display of the group in Services
+ PASSWORD Set the nickname password
+ URL Associate a URL with the nickname
+ EMAIL Associate an E-mail address with the nickname
+ ICQ Associate an ICQ number with the nickname
+ GREET Associate a greet message with the nickname
+ KILL Turn protection on or off
+ SECURE Turn nickname security on or off
+ PRIVATE Prevent the nickname from appearing in a
+ %R%S LIST
+ HIDE Hide certain pieces of nickname information
+ MSG Change the communication method of Services
+ NOEXPIRE Prevent the nickname from expiring
+ LANGUAGE Set the language Services will use when
+ sending messages to nickname
+
+ Type %R%S HELP SASET option for more information
+ on a specific option. The options will be set on the given
+ nickname.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_DISPLAY
+ Syntax: SASET nickname DISPLAY new-display
+
+ Changes the display used to refer to the nickname group in
+ Services. The new display MUST be a nick of the group.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_PASSWORD
+ Syntax: SASET nickname PASSWORD new-password
+
+ Changes the password used to identify as the nick's owner.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_URL
+ Syntax: SASET nickname URL url
+
+ Associates the given URL with the nickname. This URL
+ will be displayed whenever someone requests information
+ on the nick with the INFO command.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_EMAIL
+ Syntax: SASET nickname EMAIL address
+
+ Associates the given E-mail address with the nickname.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_ICQ
+ Syntax: SASET nickname ICQ number
+
+ Associates the given ICQ number with the nickname. This
+ number will be displayed whenever someone requests
+ information on the nick with the INFO command.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_GREET
+ Syntax: SASET nickname GREET message
+
+ Makes the given message the greet of the nickname, that
+ will be displayed when joining a channel that has GREET
+ option enabled, provided that the user has the necessary
+ access on it.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_KILL
+ Syntax: SASET nickname KILL {ON | QUICK | IMMED | OFF}
+
+ Turns the automatic protection option for the nick
+ on or off. With protection on, if another user
+ tries to take the 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.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_SECURE
+ Syntax: SASET nickname 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.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_PRIVATE
+ Syntax: SASET nickname PRIVATE {ON | OFF}
+
+ Turns %S's privacy option on or off for the nick.
+ With PRIVATE set, the nickname will not appear in
+ nickname lists generated with %S's LIST command.
+ (However, anyone who knows the nickname can still get
+ information on it using the INFO command.)
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_HIDE
+ Syntax: SASET nickname HIDE {EMAIL | STATUS | USERMASK | QUIT} {ON | OFF}
+
+ Allows you to prevent certain pieces of information from
+ being displayed when someone does a %S INFO on the
+ nick. You can hide the E-mail address (EMAIL), last seen
+ user@host mask (USERMASK), the services access status
+ (STATUS) and last quit message (QUIT).
+ The second parameter specifies whether the information should
+ be displayed (OFF) or hidden (ON).
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_MSG
+ Syntax: SASET nickname MSG {ON | OFF}
+
+ Allows you to choose the way Services are communicating with
+ the given user. With MSG set, Services will use messages,
+ else they'll use notices.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_NOEXPIRE
+ Syntax: SASET nickname NOEXPIRE {ON | OFF}
+
+ Sets whether the given nickname will expire. Setting this
+ to ON prevents the nickname from expiring.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_AUTOOP
+ Syntax: SASET nickname AUTOOP {ON | OFF}
+
+ Sets whether the given nickname will be opped automatically.
+ Set to ON to allow ChanServ to op the given nickname
+ automatically when joining channels.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_LANGUAGE
+ Syntax: SASET nickname LANGUAGE number
+
+ Changes the language Services uses when sending messages to
+ nickname (for example, when responding to a command he sends).
+ number should be chosen from a list of supported languages
+ that you can get by typing %R%S HELP SET LANGUAGE.
+
+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
+ remain online for %s to ensure that the other
+ user does not immediately reconnect; after that time, you
+ can reclaim your nick. Alternatively, use the RELEASE
+ command (%R%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. This holds lasts for %s;
+ 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
+ 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. If no nickname is given, your status
+ will be returned.
+
+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_HELP_CONFIRM
+ Syntax: CONFIRM passcode
+
+ This is the second step of nickname registration process.
+ You must perform this command in order to get your nickname
+ registered with %S. The passcode (or called auth code also)
+ is sent to your e-mail address in the first step of the
+ registration process. For more information about the first
+ stage of the registration process, type: %R%S HELP REGISTER
+
+NICK_HELP_RESEND
+ Syntax: RESEND
+
+ This command will re-send the auth code (also called passcode)
+ to the e-mail address of the user whom is performing it.
+
+NICK_SERVADMIN_HELP
+ 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
+ (%R%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_INFO
+
+ Administradors de serveis poden utilitzar el parametre
+ ALL amb qualsevol nick.
+
+NICK_SERVADMIN_HELP_LIST
+ Sintaxis: LIST patró [FORBIDDEN] [SUSPENDED] [NOEXPIRE] [UNCONFIRMED]
+
+ 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.
+
+ If the FORBIDDEN, SUSPENDED, NOEXPIRE or UNCONFIRMED options are given, only
+ nicks which, respectively, are FORBIDDEN, SUSPENDED, UNCONFIRMED or have the
+ NOEXPIRE flag set will be displayed. If multiple options are
+ given, all nicks matching at least one option will be displayed.
+ These options are limited to Services admins.
+
+ 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
+#
+###########################################################################
+
+NICK_SERVADMIN_HELP_SUSPEND
+ Syntax: SUSPEND nickname reason / UNSUSPEND nickname
+
+ SUSPENDs / UNSUSPENDs a nickname from being identified to
+
+ Limited to Services admins.
+
+###########################################################################
+#
+# ChanServ help messages
+#
+###########################################################################
+
+NICK_SERVADMIN_HELP_UNSUSPEND
+ Syntax: UNSUSPEND nickname
+
+ UNSUSPENDS a nickname from being used.
+
+ Limited to Services admins.
+
+###########################################################################
+#
+# ChanServ help messages
+#
+###########################################################################
+CHAN_HELP_CMD_GETPASS
+ GETPASS Retorna la clau de fundador per a un canal
+ (sols si l'encriptació esta deshabilitada)
+CHAN_HELP_CMD_FORBID
+ FORBID Evita que un canal es faci servir
+CHAN_HELP_CMD_SUSPEND
+ SUSPEND Prevent a channel from being used preserving
+ channel data and settings
+CHAN_HELP_CMD_UNSUSPEND
+ UNSUSPEND Releases a suspended channel
+CHAN_HELP_CMD_STATUS
+ STATUS Returns the current access level of a user
+ on a channel
+CHAN_HELP_CMD_REGISTER
+ REGISTER Registra un canal
+CHAN_HELP_CMD_IDENTIFY
+ IDENTIFY T'identifica amb la teva clau
+CHAN_HELP_CMD_SET
+ SET Establir opcions i informació d'un canal
+CHAN_HELP_CMD_AOP
+ AOP Modifica la llista d'usuaris AOP
+CHAN_HELP_CMD_SOP
+ SOP Modifica la llista d'usuaris SOP
+CHAN_HELP_CMD_ACCESS
+ ACCESS Modifica la llista d'usuaris privilegiats
+CHAN_HELP_CMD_LEVELS
+ LEVELS Redefine el significat de nivells d'accés
+CHAN_HELP_CMD_AKICK
+ AKICK Manté la llista d'AutoKick
+CHAN_HELP_CMD_DROP
+ DROP Cancel.la l'enregistrament d'un canal
+CHAN_HELP_CMD_SENDPASS
+ SENDPASS Ajuda a recuperar claus perdudes
+CHAN_HELP_CMD_BAN
+ BAN Bans a selected nick on a channel
+CHAN_HELP_CMD_CLEAR
+ CLEAR Tells ChanServ to clear certain settings on a channel
+CHAN_HELP_CMD_DEVOICE
+ DEVOICE Devoices a selected nick on a channel
+CHAN_HELP_CMD_GETKEY
+ GETKEY Returns the key of the given channel
+CHAN_HELP_CMD_INFO
+ INFO Lists information about the named registered channel
+CHAN_HELP_CMD_INVITE
+ INVITE Tells ChanServ to invite you or a given nick into a channel
+CHAN_HELP_CMD_KICK
+ KICK Kicks a selected nick from a channel
+CHAN_HELP_CMD_LIST
+ LIST Lists all registered channels matching the given pattern
+CHAN_HELP_CMD_LOGOUT
+ LOGOUT This command will logout the selected nickname
+CHAN_HELP_CMD_OP
+ OP Gives Op status to a selected nick on a channel
+CHAN_HELP_CMD_TOPIC
+ TOPIC Manipulate the topic of the specified channel
+CHAN_HELP_CMD_UNBAN
+ UNBAN Remove all bans preventing you from entering a channel
+CHAN_HELP_CMD_VOICE
+ VOICE Voices a selected nick on a channel
+CHAN_HELP_CMD_VOP
+ VOP Maintains the VOP (VOicePeople) list for a channel
+CHAN_HELP_CMD_DEHALFOP
+ DEHALFOP Dehalfops a selected nick on a channel
+CHAN_HELP_CMD_DEOWNER
+ DEOWNER Removes your owner status on a channel
+CHAN_HELP_CMD_DEPROTECT
+ DEPROTECT Deprotects a selected nick on a channel
+CHAN_HELP_CMD_HALFOP
+ HALFOP Halfops a selected nick on a channel
+CHAN_HELP_CMD_HOP
+ HOP Maintains the HOP (HalfOP) list for a channel
+CHAN_HELP_CMD_OWNER
+ OWNER Gives you owner status on channel
+CHAN_HELP_CMD_PROTECT
+ PROTECT Protects a selected nick on a channel
+CHAN_HELP_CMD_ADMIN
+ ADMIN Protects a selected nick on a channel
+CHAN_HELP_CMD_DEADMIN
+ DEADMIN Deprotects a selected nick on a channel
+CHAN_HELP_CMD_DEOP
+ DEOP Deops a selected nick on a channel
+
+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 %R%S comanda.
+ Per més informació sobre una comanda especifica,
+ escriu %R%S HELP comanda.
+
+
+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
+ (%R%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
+ %R%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 %R%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 %R%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 %R%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
+ %R%S HELP ACCESS per a informació sobre la llista
+ de accés i %R%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
+ %R%S HELP ACCESS per a informació sobre la llista
+ d'accés i %R%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
+ %R%S HELP ACCESS per a informació sobre la llista
+ d'accés i %R%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
+ %R%S HELP ACCESS per a informació sobre la llista
+ d'accés i %R%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;
+ %R%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 %R%S HELP LEVELS
+ per a més informació.
+
+CHAN_HELP_AKICK
+ Sintàxi: AKICK channel ADD {nick | mask} [reason]
+ AKICK channel STICK mask
+ AKICK channel UNSTICK mask
+ AKICK channel DEL {nick | mask | entry-num | list}
+ AKICK channel LIST [mask | entry-num | list]
+ AKICK channel VIEW [mask | entry-num | list]
+ 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".
+ When akicking a registered nick the nickserv account
+ will be added to the akick list instead of the mask.
+ All users within that nickgroup will then be akicked.
+
+ 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 %R%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.
+ HOPS Removes channel-halfoperator status (mode +h) from
+ all channel halfoperators, if supported.
+ 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:
+
+ 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_CMD_SEND
+ SEND Envia un memo a un nick o canal
+MEMO_HELP_CMD_CANCEL
+ CANCEL Cancela l'últim memo enviat
+MEMO_HELP_CMD_LIST
+ LIST llista els teus memos
+MEMO_HELP_CMD_READ
+ READ Llegeix un o més memos
+MEMO_HELP_CMD_DEL
+ DEL Esborra un o més memos
+MEMO_HELP_CMD_SET
+ SET Estableix opcions relacionades a memos
+MEMO_HELP_CMD_INFO
+ INFO Displays information about your memos
+MEMO_HELP_CMD_RSEND
+ RSEND Sends a memo and requests a read receipt
+MEMO_HELP_CMD_CHECK
+ CHECK Checks if last memo to a nick was read
+MEMO_HELP_CMD_SENDALL
+ SENDALL Send a memo to all registered users
+MEMO_HELP_CMD_STAFF
+ STAFF Send a memo to all opers/admins
+
+MEMO_HELP_HEADER
+ %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:
+
+MEMO_HELP_ADMIN
+ not used.
+MEMO_HELP_OPER
+ not used.
+MEMO_HELP_FOOTER
+
+ escriu %R%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 %R%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
+#
+###########################################################################
+
+MEMO_HELP_RSEND
+ Syntax: RSEND {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.
+ Once the memo is read by its recepient, an automatic notification
+ memo will be sent to the sender informing him/her that the memo
+ has been read.
+
+###########################################################################
+#
+# OperServ help messages
+#
+###########################################################################
+
+MEMO_HELP_CHECK
+ Syntax: CHECK nick
+
+ Checks whether the _last_ memo you sent to nick has been read
+ or not. Note that this does only work with nicks, not with chans.
+
+###########################################################################
+#
+# OperServ help messages
+#
+###########################################################################
+OPER_HELP_CMD_GLOBAL
+ GLOBAL Envia un missatge a totss els usuaris
+OPER_HELP_CMD_STATS
+ STATS mostra estatus dels serveis i la xarxa
+OPER_HELP_CMD_OPER
+ OPER Modifica la llista d'operadors de serveis
+OPER_HELP_CMD_ADMIN
+ ADMIN Modifica la llista d'administradors de
+ serveis
+OPER_HELP_CMD_STAFF
+ STAFF Display Services staff and online status
+OPER_HELP_CMD_MODE
+ MODE Canvia els Modes d'un canal
+OPER_HELP_CMD_KICK
+ KICK Kickeja un usuari d'un canal
+OPER_HELP_CMD_CLEARMODES
+ CLEARMODES neteja els Modes d'un canal
+OPER_HELP_CMD_KILLCLONES
+ KILLCLONES Mata tots els usuaris en un host
+OPER_HELP_CMD_AKILL
+ AKILL Manipula la llista AKILL
+OPER_HELP_CMD_SGLINE
+ SGLINE Manipula la llista SGLINE
+OPER_HELP_CMD_SQLINE
+ SQLINE Manipula la llista SQLINE
+OPER_HELP_CMD_SZLINE
+ SZLINE Manipula la llista SZLINE
+OPER_HELP_CMD_CHANLIST
+ CHANLIST Llista tots els records de canal
+OPER_HELP_CMD_USERLIST
+ USERLIST Llista tots els records d'usuaris
+OPER_HELP_CMD_LOGONNEWS
+ LOGONNEWS Defineix missatges per a ser mostrats a usuaris
+ al conectarse
+OPER_HELP_CMD_RANDOMNEWS
+ RANDOMNEWS Defineix missatges per a ser mostrats a usuaris
+ al conectarse
+OPER_HELP_CMD_OPERNEWS
+ OPERNEWS Defineix missatges per a ser mostrats a usuaris
+ al transformar-se en operadors
+OPER_HELP_CMD_SESSION
+ SESSION Mostra la llista de sessions de host
+OPER_HELP_CMD_EXCEPTION
+ EXCEPTION Modifica la llista de límit de sessió
+OPER_HELP_CMD_NOOP
+ NOOP Temporalment elimina totes les linees O:
+ d'un servidor remotamente
+OPER_HELP_CMD_JUPE
+ JUPE "Jupiter" (Mart,Saturn....) un servidor
+OPER_HELP_CMD_IGNORE
+ IGNORE Modify the Services ignore list
+OPER_HELP_CMD_SET
+ SET Estableix varies opcions globals dels serveis
+OPER_HELP_CMD_RELOAD
+ RELOAD Recarrega la configuració dels serveis
+OPER_HELP_CMD_UPDATE
+ UPDATE Força a la base de dades dels serveis a
+ ser actualitzada a disc inmediatament
+OPER_HELP_CMD_RESTART
+ RESTART Guarda la base de dades dels serveis i
+ reinicia els serveis
+OPER_HELP_CMD_QUIT
+ QUIT Termina el programa de serveis sense guardar
+ els canvis
+OPER_HELP_CMD_SHUTDOWN
+ SHUTDOWN Termina el programa de serveis guardant els
+ canvios
+OPER_HELP_CMD_DEFCON
+ DEFCON Manipulate the DefCon system
+OPER_HELP_CMD_CHANKILL
+ CHANKILL Kill all users on a specific channel
+OPER_HELP_CMD_OLINE
+ OLINE Give Operflags to a certain user
+OPER_HELP_CMD_UMODE
+ UMODE Change a user's modes
+OPER_HELP_CMD_SVSNICK
+ SVSNICK Forcefully change a user's nickname
+OPER_HELP_CMD_MODLOAD
+ MODLOAD Load a module
+OPER_HELP_CMD_MODUNLOAD
+ MODUNLOAD Un-Load a module
+OPER_HELP_CMD_MODINFO
+ MODINFO Info about a loaded module
+OPER_HELP_CMD_MODLIST
+ MODLIST List loaded modules
+
+OPER_HELP
+ %S commands:
+
+OPER_HELP_LOGGED
+ Noticia: Totes les comandes enviades a %S son monitorejades!
+
+OPER_HELP_GLOBAL
+ Sintàxi: GLOBAL missatge
+
+ Permet als Administrators 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 root 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.
+
+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|CLEAR} [time] [nick | mask]
+
+ Allows Services Admins to make Services ignore a nick or mask
+ 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.
+ When adding a mask, it should be in the format user@host
+ or nick!user@host, everything else will be considered a nick.
+ Wildcards are permitted.
+
+ Ignores will not be enforced on IRC Operators.
+
+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 Super Admins to set user modes for any user.
+ Parameters are the same as for the standard /MODE
+ command.
+
+OPER_HELP_OLINE
+ Syntax: OLINE user flags
+
+ Allows Super 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.
+
+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 Super 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
+ SUPERADMIN Activate or deactivate super-admin mode
+ SQL Activate or deactivate sql mode
+ IGNORE Activate or deactivate ignore mode
+ LIST List the options
+
+ 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.
+
+ This option is equivalent to the command-line option -logchan.
+
+ 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_SET_SQL
+ Syntax: SET SQL {ON | OFF}
+
+ Setting this will toggle Anope's from usage of SQL, this should
+ be used to disable and enable SQL should your SQL server go down
+ while services are running.
+
+OPER_HELP_SET_IGNORE
+ Syntax: SET IGNORE {ON | OFF}
+
+ Setting this will toggle Anope's usage of the IGNORE system
+ on or off.
+
+OPER_HELP_SET_LIST
+ Syntax: SET LIST
+
+ Display the various %S settings
+
+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_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_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 [Core|3rd|protocol|encryption|supported|qatested]
+
+ Lists all currently loaded modules.
+
+ Limited to Services Roots.
+
+
+###########################################################################
+#
+# BotServ help messages
+#
+###########################################################################
+
+BOT_HELP_CMD_BOTLIST
+ BOTLIST Llista bots disponibles
+BOT_HELP_CMD_ASSIGN
+ ASSIGN Assigna un bot a un canal
+BOT_HELP_CMD_SET
+ SET Configura opcions de bots
+BOT_HELP_CMD_KICK
+ KICK Configura kickers
+BOT_HELP_CMD_BADWORDS
+ BADWORDS Manté una llista de paraules malsonants
+BOT_HELP_CMD_ACT
+ ACT Makes the bot do the equivalent of a "/me" command
+BOT_HELP_CMD_INFO
+ INFO Allows you to see BotServ information about a channel or a bot
+BOT_HELP_CMD_SAY
+ SAY Makes the bot say the given text on the given channel
+BOT_HELP_CMD_UNASSIGN
+ UNASSIGN Unassigns a bot from a channel
+BOT_HELP_CMD_BOT
+ BOT Manté la llista de bots de la xarxa
+
+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 %R%S comanda. per a més
+ informació sobre un comanda especifica, escriu
+ %R%S HELP comanda.
+
+
+BOT_HELP_FOOTER
+ 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 %R%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 %R%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 %R%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 %R%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_BOT
+ Sintaxi: BOT ADD nick usuari host real
+ BOT CHANGE nick-ant nick-nue [usuari [host [real]]]
+ BOT DEL nick
+
+ 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.
+
+ 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 %R%s set <nick> <hostmask>.
+HOST_SETALL_SYNTAX
+ Syntax %R%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: %R%s del <nick>.
+
+###########################################################################
+#
+# HostServ Help messages
+#
+###########################################################################
+HOST_OFF_UNREAL
+ Your vhost was removed. To re-enable the standard host cloaking, type /mode %s +%s
+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_CMD_ON
+ ON Activates your assigned vhost
+
+HOST_HELP_CMD_OFF
+ OFF Deactivates your assigned vhost
+
+HOST_HELP_CMD_GROUP
+ GROUP Syncs the vhost for all nicks in a group
+
+HOST_HELP_CMD_SET
+ SET Set the vhost of another user
+
+HOST_HELP_CMD_SETALL
+ SETALL Set the vhost for all nicks in a group
+
+HOST_HELP_CMD_DEL
+ DEL Delete the vhost of another user
+
+HOST_HELP_CMD_DELALL
+ DELALL Delete the vhost for all nicks in a group
+
+HOST_HELP_CMD_LIST
+ LIST Displays one or more vhost entries.
+
+HOST_OPER_HELP
+ not used.
+
+HOST_ADMIN_HELP
+ not used.
+
+HOST_HELP
+ %S commands:
+
+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.
+
+OPER_SVSNICK_UNSUPPORTED
+ Sorry, SVSNICK is not available on this network.
+
+OPER_SQLINE_UNSUPPORTED
+ Sorry, SQLINE is not available on this network.
+
+OPER_SVSO_UNSUPPORTED
+ Sorry, OLINE is not available on this network.
+
+OPER_UMODE_UNSUPPORTED
+ Sorry, UMODE is not available on this network.
+
+OPER_SUPER_ADMIN_NOT_ENABLED
+ SuperAdmin setting not enabled in services.conf
diff --git a/lang/de.l b/lang/de.l
new file mode 100644
index 000000000..ab43d2adb
--- /dev/null
+++ b/lang/de.l
@@ -0,0 +1,6872 @@
+# Deutsches Language file.
+#
+# (C) 2003-2008 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> bis 28.02.2003
+# - 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 us know
+# (dev@anope.org) 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
+# services.conf). 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.
+##########################################################################
+#
+# INFO ::: Letzte Änderung: 19.10.2008 -- Han` --
+#
+##########################################################################
+
+
+###########################################################################
+#
+# 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 ## 20.10.2004 ##
+#
+###########################################################################
+
+# 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
+ So
+ Mo
+ Di
+ Mi
+ Do
+ Fr
+ Sa
+# %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 die Anfrage nicht verarbeiten.
+UNKNOWN_COMMAND
+ Unbekannter Befehl %s.
+UNKNOWN_COMMAND_HELP
+ Unbekannter Befehl %s. "%R%s HELP" für Hilfe.
+SYNTAX_ERROR
+ Syntax: %s
+MORE_INFO
+ %R%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
+ Die Hostmaske 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.
+INVALID_TARGET
+ "/msg %s" wird nicht mehr unterstützt. Benutze "/msg %s@%s" oder "/%s" stattdessen.
+
+# 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 Nicknamen zu tun haben. Weiterhin
+ kann keine Leer oder Tabulatortaste enthalten sein.
+
+PASSWORD_TOO_LONG
+ Dein Passwort ist zu lang. Versuche es erneut mit einen kürzeren Passwort.
+
+NICK_NOT_REGISTERED
+ Dein Nickname ist nicht registriert.
+NICK_NOT_REGISTERED_HELP
+ Dein Nickname ist nicht registriert. Benutze %R%s HELP REGISTER um zu erfahren wie du einen Nicknamen registrieren kannst.
+NICK_X_IS_SERVICES
+ Der Nickname %s ist ein teil der Network Services.
+NICK_X_NOT_REGISTERED
+ Der Nickname %s ist nicht registriert.
+NICK_X_IN_USE
+ Der Nickname %s wird derzeit benutzt.
+NICK_X_NOT_IN_USE
+ Der Nickname %s wird derzeit nicht benutzt.
+NICK_X_NOT_ON_CHAN
+ %s ist derzeit nicht im channel %s.
+NICK_X_FORBIDDEN
+ Der Nickname %s ist verboten und darf nicht verwendet werden.
+NICK_X_FORBIDDEN_OPER
+ Der Nickname %s wurde verboten von %s:
+ %s
+NICK_X_ILLEGAL
+ Der Nickname %s ist ein illegaler Nickname und kann nicht benutzt werden.
+NICK_X_TRUNCATED
+ Dein Nickname %s wurde auf %d Zeichen gekürzt.
+NICK_X_SUSPENDED
+ Der Nick %s ist vorübergehend gesperrt.
+CHAN_X_NOT_REGISTERED
+ Der Channel %s ist nicht registriert.
+CHAN_X_NOT_IN_USE
+ Dieser Channel %s existiert nicht.
+CHAN_X_FORBIDDEN
+ Der Channel %s ist verboten und darf nicht verwendet werden.
+CHAN_X_FORBIDDEN_OPER
+ Der Channel %s wurde verboten von %s:
+ %s
+CHAN_X_SUSPENDED
+ Vorübergehend gesperrt: [%s] %s
+NICK_IDENTIFY_REQUIRED
+ Um diesen Befehl nutzen zu können, musst du dich identifizieren.
+ Versuch es erneut nach %R%s IDENTIFY Passwort.
+CHAN_IDENTIFY_REQUIRED
+ Um diesen Befehl nutzen zu können, musst du dich identifizieren.
+ Versuch es erneut nach %R%s IDENTIFY %s Passwort.
+
+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
+ Ende der %s Liste.
+
+###########################################################################
+#
+# NickServ messages
+#
+###########################################################################
+
+# Automatic messages
+LIST_INCORRECT_RANGE
+ Incorrect range specified. The correct syntax is #from-to.
+CS_LIST_INCORRECT_RANGE
+ To search for channels starting with #, search for the channel
+ name without the #-sign prepended (anope instead of #anope).
+
+###########################################################################
+#
+# NickServ messages
+#
+###########################################################################
+
+# Automatic messages
+HELP_LIMIT_SERV_OPER
+ Diese Funktion ist beschränkt auf Services Operatoren.
+HELP_LIMIT_SERV_ADMIN
+ Diese Funktion ist beschränkt auf Services Administratoren.
+HELP_LIMIT_SERV_ROOT
+ Diese Funktion ist beschränkt auf Services Root-Administratoren.
+HELP_LIMIT_IRC_OPER
+ Diese Funktion ist beschränkt auf IRC Operatoren.
+HELP_LIMIT_HOST_SETTER
+ Diese Funktion ist beschränkt auf Host Setters.
+HELP_LIMIT_HOST_REMOVER
+ Diese Funktion ist beschränkt auf Host Removers.
+
+
+###########################################################################
+#
+# NickServ messages
+#
+###########################################################################
+
+# Automatic messages
+NICK_IS_REGISTERED
+ Dieser Nickname gehört schon jemand anderem. Bitte wähle einen anderen.
+ (Sollte dieser Nickname dir gehören, tippe %R%s IDENTIFY Passwort.)
+NICK_IS_SECURE
+ Dieser Nickname ist registriert und geschützt. Wenn es dein Nickname
+ ist, tippe %R%s IDENTIFY Passwort. Ansonsten wähle bitte
+ einen anderen Nickname.
+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 Passwort [eMail]
+NICK_REGISTER_SYNTAX_EMAIL
+ REGISTER Passwort eMail
+NICK_REGISTRATION_DISABLED
+ Das Registrieren von Nicknamen ist derzeit deaktiviert.
+NICK_REGISTRATION_FAILED
+ Registrierung fehlgeschlagen.
+NICK_REG_PLEASE_WAIT
+ Bitte warte %d Sekunden, bevor der REGISTER Befehl wieder funktioniert.
+NICK_CANNOT_BE_REGISTERED
+ Dieser Nickname %s kann nicht registriert werden.
+NICK_ALREADY_REGISTERED
+ Dieser Nickname %s ist bereits registriert!
+NICK_REGISTERED
+ Dein Nickname %s ist unter deinem Host registriert worden: %s
+NICK_REGISTERED_NO_MASK
+ Der Nickname %s wurde erfolgreich registriert.
+NICK_PASSWORD_IS
+ Dein Passwort ist %s - behalte es für spätere Benutzung.
+NICK_REG_DELAY
+ Du musst länger als %d Sekunden verbunden sein, um einen Nicknamen zu registrieren.
+
+# GROUP responses
+NICK_GROUP_SYNTAX
+ GROUP Ziel Passwort
+NICK_GROUP_DISABLED
+ Das Gruppieren von Nicknamen ist derzeit deaktiviert.
+NICK_GROUP_FAILED
+ Gruppieren fehlgeschlagen.
+NICK_GROUP_PLEASE_WAIT
+ Bitte warte %d Sekunden, bevor der GROUP Befehl wieder funktioniert.
+NICK_GROUP_CHANGE_DISABLED
+ Dein Nickname ist bereits registriert, tippe %R%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 Nicknamen in %s's Gruppe. Liste sie auf und lösche einige davon.
+ Tippe %R%s HELP GLIST und %R%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
+ Die Identifizierung ist fehlgeschlagen.
+NICK_IDENTIFY_SUCCEEDED
+ Passwort akzeptiert - du bist jetzt angemeldet.
+NICK_IDENTIFY_EMAIL_REQUIRED
+ Du musst eine eMail-Adresse für deinen Nicknamen angeben.
+ NickServ kann dir dann dein Passwort per Mail senden, falls du es
+ vergessen solltest.
+NICK_IDENTIFY_EMAIL_HOWTO
+ Tippe %R%S SET EMAIL eMail wenn du deine eMail-Adresse einstellen willst.
+ Deine Privatsphäre wird respektiert und deine 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
+ Der Nickname %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
+ Das Entfernen von Nicknamen ist derzeit deaktiviert.
+NICK_DROPPED
+ Die Registrierung deines Nicknamens wurde gelöscht.
+NICK_X_DROPPED
+ Der Nickname %s wurde aus der Datenbank entfernt.
+
+# SET responses
+NICK_SET_SYNTAX
+ SET Option Parameter
+NICK_SET_SERVADMIN_SYNTAX
+ SET [Nickname] Option Parameter
+NICK_SET_DISABLED
+ Das Ändern der Optionen wurde deaktiviert.
+NICK_SET_UNKNOWN_OPTION
+ Unbekannte SET Option %s.
+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 Nickname in deiner Gruppe sein!
+NICK_SET_DISPLAY_CHANGED
+ Der neue "Anführer" deiner Gruppe ist jetzt %s.
+
+# SET PASSWORD responses
+NICK_SET_PASSWORD_FAILED
+ 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 %R%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 jetzt OFF.
+
+# SET SECURE responses
+NICK_SET_SECURE_SYNTAX
+ SET SECURE {ON | OFF}
+NICK_SET_SECURE_ON
+ Nickname-Sicherheit ist jetzt ON.
+NICK_SET_SECURE_OFF
+ Nickname-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.
+NICK_SET_HIDE_STATUS_ON
+ Dein Services-Zugriffsstatus wird jetzt in %s INFO Anzeigen versteckt.
+NICK_SET_HIDE_STATUS_OFF
+ Dein Services-Zugriffsstatus wird nicht länger in %s INFO Anzeigen versteckt.
+
+# SET MSG responses
+NICK_SET_MSG_SYNTAX
+ SET PRIVATE {ON | OFF}
+NICK_SET_MSG_ON
+ Die Services werden dir jetzt durch messages antworten.
+NICK_SET_MSG_OFF
+ Die Services werden dir jetzt durch notices antworten.
+
+# SET AUTOOP responses
+NICK_SET_AUTOOP_SYNTAX
+ SET AUTOOP {ON | OFF}
+NICK_SET_AUTOOP_ON
+ Die Services werden Dir jetzt automatisch Op-Status geben in den Channels.
+NICK_SET_AUTOOP_OFF
+ Die Services werden Dir jetzt nicht mehr automatisch Op-Status geben in den Channels.
+
+# SET NOEXPIRE responses
+NICK_SASET_SYNTAX
+ SASET nickname option parameters
+NICK_SASET_DISABLED
+ Das Setzen von Nick-Optionen ist zeitweise deaktiviert.
+NICK_SASET_UNKNOWN_OPTION
+ Ubekannte SASET option %s.
+NICK_SASET_BAD_NICK
+ Nickname %s ist nicht registriert.
+NICK_SASET_OPTION_DISABLED
+ Die Einstellung %s ist auf diesem Netzwerk nicht verfügbar.
+
+# SASET DISPLAY responses
+NICK_SASET_DISPLAY_INVALID
+ Der für %s angezeigte Ursprung muss ein Nickname aus der zugehörigen Gruppe sein!
+NICK_SASET_DISPLAY_CHANGED
+ Der angezeigte Gruppenursprung ist jetzt %s.
+
+# SASET PASSWORD responses
+NICK_SASET_PASSWORD_FAILED
+ Das Passwort für %s konnte nicht geändert werden.
+NICK_SASET_PASSWORD_CHANGED
+ Passwort für %s wurde geändert.
+NICK_SASET_PASSWORD_CHANGED_TO
+ Passwort für %s wurde auf %s gesetzt.
+
+# SASET LANGUAGE responses
+NICK_SASET_URL_CHANGED
+ URL für %s wurde auf %s gesetzt.
+NICK_SASET_URL_UNSET
+ URL %s wurde entfernt.
+
+# SASET EMAIL responses
+NICK_SASET_EMAIL_CHANGED
+ E-mail Adresse für %s wurde auf %s geändert.
+NICK_SASET_EMAIL_UNSET
+ E-mail Adresse %s wurde entfernt.
+NICK_SASET_EMAIL_UNSET_IMPOSSIBLE
+ Auf diesem Netzwerk ist es nicht möglich die E-Mail Adresse zu entfernen.
+
+# SASET ICQ responses
+NICK_SASET_ICQ_CHANGED
+ ICQ Nummer für %s wurde auf %s gesetzt.
+NICK_SASET_ICQ_UNSET
+ ICQ Nummer %s wurde entfernt.
+NICK_SASET_ICQ_INVALID
+ %s ist keine gültige ICQ Nummer.
+
+# SASET GREET responses
+NICK_SASET_GREET_CHANGED
+ Begrüssungsnachricht %s wurde auf %s geändert.
+NICK_SASET_GREET_UNSET
+ Begrüssungsnachricht %s wurde entfernt.
+
+# SASET PROTECT responses
+NICK_SASET_KILL_SYNTAX
+ SASET nickname KILL {ON | QUICK | OFF}
+NICK_SASET_KILL_IMMED_SYNTAX
+ SASET nickname KILL {ON | QUICK | IMMED | OFF}
+NICK_SASET_KILL_ON
+ Schutz des Nicknamens %s ist jetzt aktiviert (ON).
+NICK_SASET_KILL_QUICK
+ Schutz des Nicknamens %s mit verkürzter Verzögerung aktiviert (ON).
+NICK_SASET_KILL_IMMED
+ Schutz des Nicknamens %s ohne Verzögerung aktiviert (ON).
+NICK_SASET_KILL_IMMED_DISABLED
+ Die IMMED Einstellung (Schutz ohne Verzögerung) ist auf diesem Netzwerk nicht verfügbar.
+NICK_SASET_KILL_OFF
+ Schutz des Nicknamens %s ist jetzt deaktiviert (OFF).
+
+# SASET SECURE responses
+NICK_SASET_SECURE_SYNTAX
+ SASET nickname SECURE {ON | OFF}
+NICK_SASET_SECURE_ON
+ Sicherheitsfunktion (SECURE) ist für %s jetzt aktiviert (ON).
+NICK_SASET_SECURE_OFF
+ Sicherheitsfunktion (SECURE) ist für %s jetzt deaktiviert (OFF).
+
+# SASET PRIVATE responses
+NICK_SASET_PRIVATE_SYNTAX
+ SASET nickname PRIVATE {ON | OFF}
+NICK_SASET_PRIVATE_ON
+ Der Privat-Modus (PRIVATE) ist für %s jetzt aktiviert (ON).
+NICK_SASET_PRIVATE_OFF
+ Der Privat-Modus (PRIVATE) ist für %s jetzt deaktiviert (OFF).
+
+# SASET HIDE responses
+NICK_SASET_HIDE_SYNTAX
+ SASET nickname HIDE {EMAIL | USERMASK | QUIT} {ON | OFF}
+NICK_SASET_HIDE_EMAIL_ON
+ Die Emailadresse %s wird jetzt bei %s INFO Abrufen versteckt.
+NICK_SASET_HIDE_EMAIL_OFF
+ Die Emailadresse %s wird jetzt bei %s INFO Abrufen angezeigt.
+NICK_SASET_HIDE_MASK_ON
+ Die letzte bekannte user@host Maske von %s wird jetzt bei %s INFO Abrufen versteckt.
+NICK_SASET_HIDE_MASK_OFF
+ Die letzte bekannte user@host Maske von %s wird jetzt bei %s INFO Abrufen angezeigt.
+NICK_SASET_HIDE_QUIT_ON
+ Die letzte Quit-Nachricht von %s wird jetzt bei %s INFO Abrufen versteckt.
+NICK_SASET_HIDE_QUIT_OFF
+ Die letzte Quit-Nachricht von %s wird jetzt bei %s INFO Abrufen angezeigt.
+NICK_SASET_HIDE_STATUS_ON
+ Die Services-Zugriffsberechtigungen von %s werden jetzt bei %s INFO Abrufen versteckt.
+NICK_SASET_HIDE_STATUS_OFF
+ Die Services-Zugriffsberechtigungen von %s werden jetzt bei %s INFO Abrufen angezeigt.
+
+# SASET MSG responses
+NICK_SASET_MSG_SYNTAX
+ SASET nickname PRIVATE {ON | OFF}
+NICK_SASET_MSG_ON
+ Die Services werden jetzt %s mit messages antworten.
+NICK_SASET_MSG_OFF
+ Die Services werden jetzt %s mit notices antworten.
+
+# SET NOEXPIRE responses
+NICK_SASET_NOEXPIRE_SYNTAX
+ SASET nickname NOEXPIRE {ON | OFF}
+NICK_SASET_NOEXPIRE_ON
+ Nickname %s wird nicht mehr verfallen.
+NICK_SASET_NOEXPIRE_OFF
+ Nickname %s wird wieder verfallen.
+
+# ACCESS responses
+NICK_SASET_AUTOOP_SYNTAX
+ SASET nickname AUTOOP {ON | OFF}
+NICK_SASET_AUTOOP_ON
+ Die Services werden %s jetzt automatisch Op-Status geben in den Channels.
+NICK_SASET_AUTOOP_OFF
+ Die Services werden %s jetzt nicht mehr automatisch Op-Status geben in den Channels.
+
+# SASET LANGUAGE responses
+NICK_SASET_LANGUAGE_SYNTAX
+ SASET nickname LANGUAGE number
+NICK_SASET_LANGUAGE_UNKNOWN
+ Unbekannte Sprachen-Nummer %d.
+ Tippe %R%s HELP SET LANGUAGE um eine Liste aller verfügbaren Sprachen zu erhalten.
+NICK_SASET_LANGUAGE_CHANGED
+ Sprache wurde geändert zu Deutsch.
+
+
+# ACCESS responses
+NICK_ACCESS_SYNTAX
+ ACCESS {ADD | DEL | LIST} [Maske]
+NICK_ACCESS_ALREADY_PRESENT
+ Diese Hostmaske %s ist bereits auf der Access-Liste.
+NICK_ACCESS_REACHED_LIMIT
+ 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-Liste von %s:
+NICK_ACCESS_LIST_EMPTY
+ Deine Access-Liste ist leer.
+NICK_ACCESS_LIST_X_EMPTY
+ Die Access-Liste für %s leer.
+
+# Status messages
+NICK_STATUS_0
+ STATUS %s 0
+NICK_STATUS_1
+ STATUS %s 1
+NICK_STATUS_2
+ STATUS %s 2
+NICK_STATUS_3
+ STATUS %s 3
+
+# INFO responses
+NICK_INFO_SYNTAX
+ INFO Nickname [ALL]
+NICK_INFO_REALNAME
+ %s ist %s
+NICK_INFO_SERVICES_OPER
+ %s ist ein Services Operator.
+NICK_INFO_SERVICES_ADMIN
+ %s ist ein Services Administrator.
+NICK_INFO_SERVICES_ROOT
+ %s ist ein Services Root Administrator.
+NICK_INFO_ADDRESS
+ Letzte gesehene Hostmaske: %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_VHOST2
+ vHost: %s@%s
+NICK_INFO_ICQ
+ ICQ #: %d
+NICK_INFO_GREET
+ Grussnachricht: %s
+NICK_INFO_OPTIONS
+ Optionen: %s
+NICK_INFO_EXPIRE
+ Wird am %s auslaufen
+# 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_AUTOOP
+ Auto-op
+NICK_INFO_OPT_NONE
+ Keine
+NICK_INFO_NO_EXPIRE
+ Dieser Nickname wird nicht auslaufen.
+NICK_INFO_FOR_MORE
+ Für weitere Informationen, tippe %R%s INFO %s ALL.
+
+# LIST responses
+NICK_INFO_SUSPENDED
+ Dieser Nickname ist zur Zeit gesperrt, Grund: %s
+NICK_INFO_SUSPENDED_NO_REASON
+ Dieser Nickname ist zur Zeit gesperrt
+
+
+# LIST responses
+NICK_LIST_SYNTAX
+ LIST Muster
+NICK_LIST_SERVADMIN_SYNTAX
+ LIST Muster [FORBIDDEN] [SUSPENDED] [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
+ Die Channels auf die du Zugriff hast:
+ Nummer Channel Level Beschreibung
+NICK_ALIST_HEADER_X
+ Die Channels auf die %s Zugriff hat:
+ Nummer Channel Level Beschreibung
+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 Nicknamen in deiner Gruppe:
+NICK_GLIST_HEADER_X
+ Liste der Nicknamen in der Gruppe von %s:
+NICK_GLIST_FOOTER
+ %d Nicknamen in der Gruppe.
+NICK_GLIST_REPLY
+ %c%s
+NICK_GLIST_REPLY_ADMIN
+ %c%s (wird in %s auslaufen)
+
+# 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 Nicknamen online gewesen ist, wurde entfernt.Tippe:
+ %R%s RELEASE %s ein, um ihn vor dem %s-Timeout zurückzubekommen.
+
+# RELEASE responses
+NICK_RELEASE_SYNTAX
+ RELEASE Nickname [Password]
+NICK_RELEASE_NOT_HELD
+ Der Nickname %s ist nicht gesperrt.
+NICK_RELEASED
+ Die Services haben den Nicknamen 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 Nicknamen 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 Nicknamen %s via eMail schicken 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_SUSPEND_SYNTAX
+ SUSPEND Nickname Grund
+NICK_SUSPEND_SUCCEEDED
+ Der Nickname %s ist jetzt suspendiert.
+NICK_SUSPEND_FAILED
+ Konnte den Nicknamen %s nicht suspendieren!
+
+# UNSUSPEND responses
+NICK_UNSUSPEND_SYNTAX
+ UNSUSPEND Nickname
+NICK_UNSUSPEND_SUCCEEDED
+ Der Nickname %s ist jetzt freigegeben.
+NICK_UNSUSPEND_FAILED
+ Konnte den Nicknamen %s nicht freigeben!
+
+# FORBID responses
+NICK_FORBID_SYNTAX
+ FORBID Nickname [Grund]
+NICK_FORBID_SYNTAX_REASON
+ FORBID Nickname Grund
+NICK_FORBID_SUCCEEDED
+ Der Nickname %s ist jetzt verboten.
+NICK_FORBID_FAILED
+ Konnte den Nicknamen %s nicht verbieten!
+
+# Nick Registration responses
+NICK_REQUESTED
+ Dieser Nickname 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 Nickname benötigt das Email Bestätigungs Passwort vor Abschluß der Registrierung.
+NICK_ENTER_REG_CODE
+ Ein Password wurde zu %s gesendet, bitte tippe %R%s confirm <passcode> um die Registrierung abzuschließen.
+NICK_CONFIRM_NOT_FOUND
+ Registrieungs Stufe 1 ist eventuell abgelaufen, bitte nutze zuerst "%R%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 " %R%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_X_INVALID
+ Channel %s ist kein gültiger Channel.
+
+# REGISTER responses
+CHAN_REGISTER_SYNTAX
+ REGISTER Channel Passwort Beschreibung
+CHAN_REGISTER_DISABLED
+ 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 Nicknamen registrieren. Tippe %R%s HELP REGISTER um Hilfe zu erhalten.
+CHAN_MUST_IDENTIFY_NICK
+ Bitte identifiziere dich zuerst durch %s, in dem du diesen Befehl benutzt:
+ %R%s IDENTIFY Passwort
+CHAN_MAY_NOT_BE_REGISTERED
+ Der Channel %s kann nicht registriert werden.
+CHAN_ALREADY_REGISTERED
+ Der Channel %s ist bereits registriert!
+CHAN_MUST_BE_CHANOP
+ Du musst Channel-Operator sein um diesen Channel zu registrieren.
+CHAN_REACHED_CHANNEL_LIMIT
+ Du hast bereits %d Channels auf deinen Nicknamen registriert.
+CHAN_EXCEEDED_CHANNEL_LIMIT
+ Du hast bereits das Limit von %d registrierten Channels erreicht.
+CHAN_REGISTRATION_FAILED
+ Registrierung fehlgeschlagen.
+CHAN_REGISTERED
+ Der Channel %s ist registriert unter deinem Nicknamen: %s
+CHAN_PASSWORD_IS
+ Dein Channel-Passwort ist %s - behalte es für spätere Benutzung.
+CHAN_REGISTER_NONE_CHANNEL
+ Du hast versucht ein nicht existierender Channel %s zu registrieren.
+CHAN_SYMBOL_REQUIRED
+ Verwende bitte nur das Symbol # wenn du versuchst ein
+ Channel zu registrieren.
+
+# IDENTIFY responses
+CHAN_IDENTIFY_SYNTAX
+ IDENTIFY Channel Passwort
+CHAN_IDENTIFY_FAILED
+ 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
+ Der User %s wurde vom Channel %s ausgeloggt.
+CHAN_LOGOUT_ALL_SUCCEEDED
+ Alle identifizierten User wurden vom Channel ausgeloggt %s (except the channel founder).
+
+# DROP responses
+CHAN_DROP_SYNTAX
+ DROP Channel
+CHAN_DROP_DISABLED
+ 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
+ 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 Nicknamen 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
+ 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
+ Begrüssungsnachricht von %s wurde geändert.
+CHAN_ENTRY_MSG_UNSET
+ Begrüssungsnachricht 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
+ Die Topic-Beibehaltung für %s ist jetzt aktiviert (ON).
+CHAN_SET_KEEPTOPIC_OFF
+ Die Topic-Beibehaltung für %s ist jetzt deaktiviert (OFF).
+
+# SET TOPICLOCK responses
+CHAN_SET_TOPICLOCK_SYNTAX
+ SET Channel TOPICLOCK {ON | OFF}
+CHAN_SET_TOPICLOCK_ON
+ Topic-Sperre Option für %s ist jetzt ON.
+CHAN_SET_TOPICLOCK_OFF
+ Topic-Sperre Option für %s ist jetzt OFF.
+
+# SET PRIVATE responses
+CHAN_SET_PEACE_SYNTAX
+ SET Channel PEACE {ON | OFF}
+CHAN_SET_PEACE_ON
+ Peace Option für %s ist jetzt ON.
+CHAN_SET_PEACE_OFF
+ Peace Option für %s ist jetzt OFF.
+
+# SET PRIVATE responses
+CHAN_SET_PRIVATE_SYNTAX
+ SET Channel PRIVATE {ON | OFF}
+CHAN_SET_PRIVATE_ON
+ Private Option für %s ist jetzt ON.
+CHAN_SET_PRIVATE_OFF
+ Private Option für %s ist jetzt OFF.
+
+# SET SECUREOPS responses
+CHAN_SET_SECUREOPS_SYNTAX
+ SET Channel SECUREOPS {ON | OFF}
+CHAN_SET_SECUREOPS_ON
+ Secure-Ops Option für %s ist jetzt ON.
+CHAN_SET_SECUREOPS_OFF
+ Secure-Ops Option für %s ist jetzt OFF.
+
+# SET SECUREFOUNDER responses
+CHAN_SET_SECUREFOUNDER_SYNTAX
+ SET Channel SECUREFOUNDER {ON | OFF}
+CHAN_SET_SECUREFOUNDER_ON
+ Secure Founder Option für %s ist jetzt ON.
+CHAN_SET_SECUREFOUNDER_OFF
+ Secure Founder Option für %s ist jetzt OFF.
+
+# SET RESTRICTED responses
+CHAN_SET_RESTRICTED_SYNTAX
+ SET Channel RESTRICTED {ON | OFF}
+CHAN_SET_RESTRICTED_ON
+ Eingeschränkter Access Option für %s ist jetzt ON.
+CHAN_SET_RESTRICTED_OFF
+ Eingeschränkter Access Option für %s ist jetzt OFF.
+
+# SET SECURE responses
+CHAN_SET_SECURE_SYNTAX
+ SET Channel SECURE {ON | OFF}
+CHAN_SET_SECURE_ON
+ Secure Option für %s ist jetzt ON.
+CHAN_SET_SECURE_OFF
+ Secure Option für %s ist jetzt OFF.
+
+# SET SIGNKICK responses
+CHAN_SET_SIGNKICK_SYNTAX
+ SET Channel SIGNKICK {ON | LEVEL | OFF}
+CHAN_SET_SIGNKICK_ON
+ Signierte kicks Option für %s ist jetzt ON.
+CHAN_SET_SIGNKICK_LEVEL
+ Signierte kicks Option für %s ist jetzt ON, hängt aber von den
+ Level des Benutzers der den Befehl verwendet ab.
+CHAN_SET_SIGNKICK_OFF
+ Signierte kicks Option für %s ist jetzt OFF.
+
+# SET OPNOTICE responses
+CHAN_SET_OPNOTICE_SYNTAX
+ SET Channel OPNOTICE {ON | OFF}
+CHAN_SET_OPNOTICE_ON
+ Op-notice Option für %s ist jetzt ON.
+CHAN_SET_OPNOTICE_OFF
+ Op-notice Option für %s ist jetzt OFF.
+
+# SET NOEXPIRE responses
+CHAN_SET_XOP_SYNTAX
+ SET Channel XOP {ON | OFF}
+CHAN_SET_XOP_ON
+ XOP System für %s ist jetzt ON.
+CHAN_SET_XOP_OFF
+ XOP System für %s ist jetzt OFF.
+
+# SET NOEXPIRE responses
+CHAN_SET_NOEXPIRE_SYNTAX
+ SET channel NOEXPIRE {ON | OFF}
+CHAN_SET_NOEXPIRE_ON
+ Der Channel %s wird nicht mehr auslaufen.
+CHAN_SET_NOEXPIRE_OFF
+ Der Channel %s wird nach einer bestimmten Zeit auslaufen.
+
+# xOP messages
+CHAN_XOP_REACHED_LIMIT
+ 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 %R%s HELP ACCESS für weitere Informationen.
+CHAN_XOP_NOT_AVAILABLE
+ XOP System ist nicht verfügbar.
+
+# AOP messages
+CHAN_AOP_SYNTAX
+ AOP Channel {ADD|DEL|LIST|CLEAR} [Nickname | entry-liste]
+CHAN_AOP_DISABLED
+ Die Channel AOP-Liste kann derzeit nicht geändert werden.
+CHAN_AOP_NICKS_ONLY
+ Die Channel AOP-Liste darf nur registrierte Nicknamen 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 AOP-Liste von %s ist leer.
+CHAN_AOP_LIST_HEADER
+ AOP Liste für %s:
+ Nummer Nickname
+CHAN_AOP_CLEAR
+ Die AOP-Liste von %s wurde geleert.
+
+# HOP messages
+CHAN_HOP_SYNTAX
+ HOP Channel {ADD|DEL|LIST|CLEAR} [Nickname | entry-liste]
+CHAN_HOP_DISABLED
+ Die Channel HOP-Liste kann derzeit nicht geändert werden.
+CHAN_HOP_NICKS_ONLY
+ Die Channel HOP-Liste darf nur registrierte Nicknamen 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 wurden von der %s HOP-Liste gelöscht.
+CHAN_HOP_LIST_EMPTY
+ Die HOP-Liste von %s ist leer.
+CHAN_HOP_LIST_HEADER
+ HOP Liste für %s:
+ Nummer Nickname
+CHAN_HOP_CLEAR
+ Die %s HOP-Liste wurde geleert.
+
+# SOP messages
+CHAN_SOP_SYNTAX
+ SOP Channel {ADD|DEL|LIST|CLEAR} [Nickname | entry-liste]
+CHAN_SOP_DISABLED
+ Die Channel SOP-Liste kann derzeit nicht geändert werden.
+CHAN_SOP_NICKS_ONLY
+ Die Channel SOP-Liste darf nur registrierte Nicknamen 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 SOP-Liste von %s ist leer.
+CHAN_SOP_LIST_HEADER
+ SOP Liste für %s:
+ Nummer Nickname
+CHAN_SOP_CLEAR
+ Die SOP-Liste von %s wurde geleert.
+
+# VOP messages
+CHAN_VOP_SYNTAX
+ VOP Channel {ADD|DEL|LIST|CLEAR} [Nickname | entry-liste]
+CHAN_VOP_DISABLED
+ Die Channel VOP-Liste kann derzeit nicht geändert werden.
+CHAN_VOP_NICKS_ONLY
+ Die Channel VOP-Liste darf nur registrierte Nicknamen 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 VOP-Liste von %s ist leer.
+CHAN_VOP_LIST_HEADER
+ VOP Liste für %s:
+ Nummer Nickname
+CHAN_VOP_CLEAR
+ Die VOP-Liste von %s wurde geleert.
+
+# ACCESS messages
+CHAN_ACCESS_SYNTAX
+ ACCESS Channel {ADD|DEL|LIST|CLEAR} [Nickname [Level] | entry-liste]
+CHAN_ACCESS_XOP
+ Du kannst dieses Befehl nicht nutzen.
+ Nutze stattdessen die AOP, SOP und VOP Befehle.
+ Tippe %R%s HELP Befehl für weitere Informationen.
+CHAN_ACCESS_XOP_HOP
+ Du kannst dieses Befehl nicht nutzen.
+ Nutze stattdessen die AOP, SOP, HOP und VOP Befehle.
+ Tippe %R%s HELP Befehl für weitere Informationen.
+CHAN_ACCESS_DISABLED
+ Das Ändern der Channel-Access-Liste wurde zwischenzeitig deaktiviert.
+CHAN_ACCESS_LEVEL_NONZERO
+ Access-Level muss grösser als 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 Nicknamen enthalten.
+CHAN_ACCESS_REACHED_LIMIT
+ 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:
+ Nummer Level Nickname
+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 von %s wurde geleert.
+
+# AKICK responses
+CHAN_AKICK_SYNTAX
+ AKICK Channel {ADD | DEL | LIST | VIEW | ENFORCE | CLEAR} [Nickname/Usermaske]
+CHAN_AKICK_DISABLED
+ 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
+ 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 jetzt stetig aktiviert im %s.
+CHAN_AKICK_UNSTUCK
+ %s ist jetzt nicht mehr stetig aktiviert im %s.
+CHAN_AKICK_DELETED
+ %s wurde von der Autokick-Liste von %s entfernt.
+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) (von %s am %s)
+ %s
+CHAN_AKICK_ENFORCE_DONE
+ AKICK ENFORCE für %s erledigt. %d User betroffen.
+CHAN_AKICK_CLEAR
+ Die Autokick-Liste von %s wurde geleert.
+
+# LEVELS responses
+CHAN_LEVELS_SYNTAX
+ LEVELS Channel {SET | DIS[ABLE] | LIST | RESET} [item [Level]]
+CHAN_LEVELS_XOP
+ Der Befehl 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 %R%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.
+
+# Status Messages
+CHAN_STATUS_SYNTAX
+ STATUS ERROR Syntax error
+CHAN_STATUS_NOT_REGGED
+ STATUS ERROR Channel %s ist nicht registriert
+CHAN_STATUS_FORBIDDEN
+ STATUS ERROR Channel %s ist verboten
+CHAN_STATUS_NOTONLINE
+ STATUS ERROR Nickname %s ist nicht online
+CHAN_STATUS_INFO
+ STATUS %s %s %d
+
+# 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
+ Eingeschränkter 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 Listen-System
+CHAN_INFO_OPT_NONE
+ Keine
+CHAN_INFO_MODE_LOCK
+ Mode lock: %s
+CHAN_INFO_EXPIRE
+ Wird am %s auslaufen.
+CHAN_INFO_NO_EXPIRE
+ Dieser Channel wird nicht auslaufen.
+
+# LIST responses
+CHAN_LIST_SYNTAX
+ LIST Muster
+CHAN_LIST_SERVADMIN_SYNTAX
+ LIST Muster [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 was
+CHAN_CLEARED_BANS
+ Alle Bans in %s wurden entfernt.
+CHAN_CLEARED_EXCEPTS
+ Alle Ausnahmen 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_HOPS
+ Alle HalfOp-Flags wurden im Channel %s entfernt.
+CHAN_CLEARED_VOICES
+ Alle Voice-Flags wurden im Channel %s entfernt.
+CHAN_CLEARED_USERS
+ Alle User wurden aus Channel %s gekicked.
+CHAN_CLEARED_INVITES
+ Alle Invites wurden im Channel %s entfernt.
+
+# 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_GETKEY_SYNTAX
+ GETKEY Channel
+CHAN_GETKEY_NOKEY
+ Der Channel %s hat keinen Schlüßel.
+CHAN_GETKEY_KEY
+ KEY %s %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 [Grund]
+CHAN_FORBID_SYNTAX_REASON
+ FORBID Channel Grund
+CHAN_FORBID_SUCCEEDED
+ Der 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 [Grund]
+CHAN_SUSPEND_SYNTAX_REASON
+ SUSPEND Channel Grund
+CHAN_SUSPEND_SUCCEEDED
+ Der Channel %s ist jetzt 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
+ Der Channel %s ist jetzt nicht mehr auf SUSPENDED gesetzt.
+CHAN_UNSUSPEND_FAILED
+ Der Channel %s konnte nicht auf UNSUSPENED gesetzt werden!
+
+# Misc responses
+CHAN_EXCEPTED
+ %s passt zur Ausnahme von %s und kann nicht gebannt werden, solange die Ausnahme 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 %R%s READ LAST um sie zu lesen.
+MEMO_TYPE_READ_NUM
+ Tippe %R%s READ %d um sie zu lesen.
+MEMO_TYPE_LIST_NEW
+ Tippe %R%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 %R%s READ %s %d um sie zu lesen.
+MEMO_NEW_MEMO_ARRIVED
+ Du hast eine neue Nachricht von %s empfangen.
+ Tippe %R%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 {Nickname | Channel} Memo-text
+MEMO_SEND_DISABLED
+ 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 {Nickname | Channel}
+MEMO_CANCEL_DISABLED
+ 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] [Liste | 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 %R%s READ Nummer
+MEMO_LIST_NEW_MEMOS
+ Neue Memos für %s. Um sie zu lesen, tippe %R%s READ Nummer
+MEMO_LIST_CHAN_MEMOS
+ Memos für %s. Um sie zu lesen, tippe %R%s READ %s Nummer
+MEMO_LIST_CHAN_NEW_MEMOS
+ Neue Memos für %s. Um sie zu lesen, tippe %R%s READ %s Nummer
+MEMO_LIST_HEADER
+ Nummer Sender Datum/Zeit
+MEMO_LIST_FORMAT
+ %c%3d %-16s %s
+
+# READ responses
+MEMO_READ_SYNTAX
+ READ [Channel] {Liste | LAST | NEW}
+MEMO_HEADER
+ Memo %d von %s (%s). Um sie zu löschen, tippe %R%s DEL %d
+MEMO_CHAN_HEADER
+ Memo %d von %s (%s). Um sie zu löschen, tippe %R%s DEL %s %d
+MEMO_TEXT
+ %s
+
+# DEL responses
+MEMO_DEL_SYNTAX
+ DEL [Channel] {Nummer | Liste | 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 Parameter
+MEMO_SET_DISABLED
+ 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.
+MEMO_SET_NOTIFY_MAIL
+ Du wirst jetzt per Email über neue Memos informiert.
+MEMO_SET_NOTIFY_NOMAIL
+ Du wirst nicht länger per Email über neue Memos benachrichtigt.
+MEMO_SET_NOTIFY_INVALIDMAIL
+ Du hast keine zulässige Email Adresse gesetzt.
+
+# 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 [Nickname | 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.
+
+# Memo2Mail
+MEMO_MAIL_SUBJECT
+ Neue Memo
+MEMO_MAIL_TEXT1
+ Hi %s
+MEMO_MAIL_TEXT2
+ Du hast gerade eine neue Memo von %s erhalten. Dies ist Memo Nummer %d.
+MEMO_MAIL_TEXT3
+ Memo Text:
+
+# Standard responses
+MEMO_RSEND_PLEASE_WAIT
+ Bitte warte %d Sekunden bevor der RSEND Befehl wieder funktioniert.
+MEMO_RSEND_DISABLED
+ RSEND ist auf diesem Netzwerk ausgeschaltet.
+MEMO_RSEND_SYNTAX
+ RSEND {Nickname | Channel} Memo-text
+MEMO_RSEND_NICK_MEMO_TEXT
+ [auto-memo] Die Memo die du gesendet hast wurde angesehen.
+MEMO_RSEND_CHAN_MEMO_TEXT
+ [auto-memo] Die Memo die du zum %s gesendet hast wurde angesehen.
+MEMO_RSEND_USER_NOTIFICATION
+ Eine Benachrichtigungs-Memo wurde zum %s gesendet um ihn/sie zu
+ informieren das du seine/ihre Memo gelesen hast.
+
+# Standard responses
+MEMO_CHECK_SYNTAX
+ CHECK Nickname
+MEMO_CHECK_NOT_READ
+ Die letzte Memo die du zu %s gesendet hast (gesendet am %s) wurde nicht gelesen.
+MEMO_CHECK_READ
+ Die letzte Memo die du zu %s gesendet hast (gesendet am %s) wurde gelesen.
+MEMO_CHECK_NO_MEMO
+ Nickname %s hat keine Memo von dir.
+
+# Standard responses
+MEMO_NO_RSEND_SELF
+ Das Erhalten von Empfangsbestätigungen ist nur beim Senden
+ einer Memo an andere User möglich.
+
+###########################################################################
+#
+# 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 %R%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 Botnick User Hostmaske Realname
+ BOT CHANGE Botnick Neuer-Botnick [User [Hostmaske [Realname]]]
+ BOT DEL Nickname
+BOT_BOT_ALREADY_EXISTS
+ Bot %s existiert bereits.
+BOT_BOT_CREATION_FAILED
+ Erstellung des Bots ist fehlgeschlagen.
+BOT_BOT_READONLY
+ Das Verändern von Bot-Einstellungen ist derzeit deaktiviert.
+BOT_BOT_ADDED
+ %s!%s@%s (%s) wurde zur der 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 die für IRC Operatoren reserviert sind:
+BOT_BOTLIST_FOOTER
+ %d Bots verfügbar.
+BOT_BOTLIST_EMPTY
+ Es sind derzeit keine Bots verfügbar. Frag einen
+ Services Administrator, ob er einen erstellt.
+
+# ASSIGN responses
+BOT_ASSIGN_SYNTAX
+ ASSIGN Channel Nickname
+BOT_ASSIGN_READONLY
+ 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 channel
+BOT_UNASSIGN_UNASSIGNED
+ Der Bot von %s wurde entfernt.
+
+# INFO responses
+BOT_INFO_SYNTAX
+ INFO {Channel | Nickname}
+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
+ Botnick : %s
+BOT_INFO_CHAN_BOT_NONE
+ Botnick : 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
+ Begrüssungsnachricht
+BOT_INFO_OPT_NOBOT
+ Kein Bot
+BOT_INFO_OPT_SYMBIOSIS
+ Symbiosis
+BOT_INFO_OPT_NONE
+ Keine
+
+# SET responses
+BOT_SET_SYNTAX
+ SET (Channel | Bot) Option Einstellungen
+BOT_SET_DISABLED
+ Die SET-Optionen sind derzeit deaktiviert.
+BOT_SET_UNKNOWN
+ Unbekannte Option %s.
+ Tippe %R%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
+ Begrüssungsnachricht ist jetzt ON im %s.
+BOT_SET_GREET_OFF
+ Begrüssungsnachricht ist jetzt OFF im %s.
+
+# SET NOBOT
+BOT_SET_NOBOT_SYNTAX
+ SET Channel 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 jetzt ON.
+BOT_SET_PRIVATE_OFF
+ Private-Mode des Bots im %s ist jetzt 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} [Einstellungen]
+BOT_KICK_DISABLED
+ Die Konfiguration des Kickers ist derzeit deaktiviert.
+BOT_KICK_UNKNOWN
+ Unbekannte Option %s.
+ Tippe %R%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 User, die farbig schreiben.
+BOT_KICK_COLORS_ON_BAN
+ Bot kickt jetzt User, 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 User die sich wiederholen ( %d Mal das Gleiche)
+BOT_KICK_REPEAT_ON_BAN
+ Bot kickt jetzt User die sich wiederholen ( %d Mal das Gleiche), und setzt
+ einen Ban nach %d Kicks.
+BOT_KICK_REPEAT_OFF
+ Bot ignoriert jetzt jetzt User die sich wiederholen und wird nicht kicken.
+BOT_KICK_REVERSES_ON
+ Bot kickt Leute, die invertiert schreiben.
+BOT_KICK_REVERSES_ON_BAN
+ Bot kickt User, 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 User, die unterstrichen schreiben.
+BOT_KICK_UNDERLINES_ON_BAN
+ Bot kickt jetzt User, 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} [Wort | entry-liste] [SINGLE|START|END]
+BOT_BADWORDS_DISABLED
+ Das Ändern der Bad Words-Liste ist derzeit deaktiviert.
+BOT_BADWORDS_REACHED_LIMIT
+ 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:
+ Nummer 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.
+
+
+# General messages
+BOT_BAD_NICK
+ Bot Nicknamen 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.
+BOT_LONG_IDENT
+ Bot Idents dürfen nur %d Zeichen enthalten.
+BOT_LONG_HOST
+ Bot Hosts may only contain %d characters.
+###########################################################################
+#
+# OperServ messages
+#
+###########################################################################
+
+# General messages
+OPER_BOUNCY_MODES
+ Services können die Modi nicht ändern. Ist der Server richtig konfiguriert?
+OPER_BOUNCY_MODES_U_LINE
+ Services können die Modi 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_HOSTSERV_MEM
+ HostServ : %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_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 Tage
+OPER_STATS_SQLINE_EXPIRE_DAY
+ Standard Auslaufzeit von SQLINEs: 1 Tag
+OPER_STATS_SQLINE_EXPIRE_HOURS
+ Standard Auslaufzeit von SQLINEs: %d Stunden
+OPER_STATS_SQLINE_EXPIRE_HOUR
+ Standard Auslaufzeit von SQLINEs: 1 Stunde
+OPER_STATS_SQLINE_EXPIRE_MINS
+ Standard Auslaufzeit von SQLINEs: %d Minuten
+OPER_STATS_SQLINE_EXPIRE_MIN
+ Standard Auslaufzeit von SQLINEs: 1 Minuten
+OPER_STATS_SQLINE_EXPIRE_NONE
+ Standard Auslaufzeit von SQLINEs: Kein Auslauf, permanent
+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_STATS_UPLINK_SERVER
+ Uplink Server: %s
+OPER_STATS_UPLINK_CAPAB
+ Uplink-Fähigkeiten: %s
+OPER_STATS_UPLINK_SERVER_COUNT
+ Server gefunden: %d
+
+# MODE responses
+OPER_MODE_SYNTAX
+ MODE Channel Modi
+
+# UMODE respondes
+OPER_UMODE_SYNTAX
+ UMODE Nickname Modi
+
+# UMODE responses
+OPER_UMODE_SUCCESS
+ Usermodi von %s geändert.
+OPER_UMODE_CHANGED
+ %s hat deine Usermodi geändert.
+
+# OLINE responses
+OPER_OLINE_SYNTAX
+ OLINE Nickname Flags
+OPER_OLINE_SUCCESS
+ Operflags %s wurden für %s hinzugefügt.
+OPER_OLINE_IRCOP
+ Du bist jetzt ein IRC Operator.
+
+# CLEARMODES responses
+OPER_CLEARMODES_SYNTAX
+ CLEARMODES Channel [ALL]
+OPER_CLEARMODES_DONE
+ Alle binären Modi und Bans wurden aus dem Channel %s entfernt.
+OPER_CLEARMODES_ALL_DONE
+ Alle Modi wurden vom Channel %s zurückgesetzt.
+
+
+# KICK responses
+OPER_KICK_SYNTAX
+ KICK Channel User Grund
+
+# ADMIN responses
+OPER_SVSNICK_SYNTAX
+ SVSNICK Nickname Neuer-Nickname
+OPER_SVSNICK_NEWNICK
+ Der Nickname %s wird jetzt zu %s geändert.
+
+# ADMIN responses
+OPER_ADMIN_SYNTAX
+ ADMIN {ADD|DEL|LIST|CLEAR} [Nickname | entry-liste]
+OPER_ADMIN_SKELETON
+ Services sind im Basis-Modus. Das ADMIN-Befehl ist nicht verfügbar.
+OPER_ADMIN_EXISTS
+ %s existiert bereits auf der Services Administratoren-Liste.
+OPER_ADMIN_REACHED_LIMIT
+ Du kannst nur %d Services Administratoren haben.
+OPER_ADMIN_ADDED
+ %s wurde zur Liste der Services Administratoren hinzugefügt.
+OPER_ADMIN_NOT_FOUND
+ %s wurde nicht auf der Liste der Services Administratoren gefunden.
+OPER_ADMIN_NO_MATCH
+ Keine entsprechenden Einträge in der Services Administratoren-Liste gefunden.
+OPER_ADMIN_DELETED
+ %s wurde aus der Services Administratoren-Liste entfernt.
+OPER_ADMIN_DELETED_ONE
+ Es wurde 1 Eintrag aus der Services Administratoren-Liste entfernt.
+OPER_ADMIN_DELETED_SEVERAL
+ Es wurden %d Einträge aus der Services Administratoren-Liste entfernt.
+OPER_ADMIN_LIST_EMPTY
+ Die Services Administratoren-Liste ist leer.
+OPER_ADMIN_LIST_HEADER
+ Services Administratoren-Liste:
+ Nummer Nickname
+OPER_ADMIN_LIST_FORMAT
+ %3d %s
+OPER_ADMIN_CLEAR
+ Die Liste der Services Administratoren wurde geleert.
+OPER_ADMIN_MOVED
+ %s wurde zu der Services Administratoren-Liste verschoben.
+
+# OPER responses
+OPER_OPER_SYNTAX
+ OPER {ADD|DEL|LIST|CLEAR} [Nickname | entry-liste]
+OPER_OPER_SKELETON
+ Services sind im Basis-Modus. Das OPER-Befehl ist nicht verfügbar.
+OPER_OPER_EXISTS
+ %s existiert bereits auf der Services Operatoren-Liste.
+OPER_OPER_REACHED_LIMIT
+ Du kannst nur %d Services Operatoren haben.
+OPER_OPER_ADDED
+ %s wurde zur der Services Operatoren-Liste hinzugefügt.
+OPER_OPER_NOT_FOUND
+ %s wurde nicht auf der Services Operatoren-Liste gefunden.
+OPER_OPER_NO_MATCH
+ Keine entsprechenden Einträge in der Services Operatoren-Liste gefunden.
+OPER_OPER_DELETED
+ %s wurde aus der Services Operatoren-Liste entfernt.
+OPER_OPER_DELETED_ONE
+ Es wurde 1 Eintrag aus der Services Operatoren-Liste entfernt.
+OPER_OPER_DELETED_SEVERAL
+ Es wurden %d Einträge aus der Services Operatoren-Liste entfernt.
+OPER_OPER_LIST_EMPTY
+ Die Services Operatoren-Liste ist leer.
+OPER_OPER_LIST_HEADER
+ Services Operatoren-Liste:
+ Nummer Nickname
+OPER_OPER_LIST_FORMAT
+ %3d %s
+OPER_OPER_CLEAR
+ Die Liste der Services Operatoren wurde geleert.
+OPER_OPER_MOVED
+ %s wurde zu der Services Operatoren-Liste verschoben.
+
+# AKILL responses
+OPER_AKILL_SYNTAX
+ AKILL {ADD | DEL | LIST | VIEW | CLEAR} [[+Zeit] {Hostmaske | entry-liste} [Grund]]
+OPER_AKILL_EXISTS
+ %s existiert bereits auf der AKILL-Liste.
+OPER_AKILL_ALREADY_COVERED
+ %s wird bereits von %s getroffen.
+OPER_AKILL_REACHED_LIMIT
+ 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:
+ Nummer 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
+ CHANKILL [+Zeit] {Channel} [Grund]
+# SGLINE responses
+OPER_SGLINE_SYNTAX
+ SGLINE {ADD | DEL | LIST | VIEW | CLEAR} [[+Zeit] {Hostmask | entry-liste}[:Grund]]
+OPER_SGLINE_UNSUPPORTED
+ 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
+ Du kannst nur %d SGLINE's 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:
+ Nummer 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} [[+Zeit] {Hostmaske | entry-liste} [Grund]]
+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
+ Du kannst nur %d SQLINE's 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:
+ Nummer Maske Grund
+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 (von %s am %s, %s)
+ %s
+OPER_SQLINE_CLEAR
+ Die SQLINE-Liste wurde geleert.
+
+# SZLINE responses
+OPER_SZLINE_SYNTAX
+ SZLINE {ADD | DEL | LIST | VIEW | CLEAR} [[+Zeit] {Hostmaske | entry-liste} [Grund]]
+OPER_SZLINE_UNSUPPORTED
+ SZLINE ist auf diesem Netzwerk 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
+ Du kannst nur %d SZLINE's 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:
+ Nummer 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 Einstellungen
+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 jetzt Logmessages an %s senden.
+OPER_SET_LOGCHAN_OFF
+ Die Services werden jetzt 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.
+OPER_SET_SQL_ON
+ SQL code wird jetzt benutzt.
+OPER_SET_SQL_OFF
+ SQL code wird jetzt NICHT mehr benutzt.
+OPER_SET_SQL_ERROR
+ Einstellungen für SQL können nur ON oder OFF sein.
+OPER_SET_SQL_ERROR_INIT
+ SQL FEHLER, schaue bitte in deine Logs nach um zu sehen wie du es berichtigen kannst.
+OPER_SET_SQL_ERROR_DISABLED
+ SQL ist für den Netzwerk nicht konfiguriert. Um SQL code zu
+ benutzen mußt du es in deine services.conf richtig Konfigurieren.
+OPER_SET_LIST_OPTION_ON
+ %s ist eingeschaltet
+OPER_SET_LIST_OPTION_OFF
+ %s ist ausgeschaltet
+
+# 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 [Grund]
+
+# 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} [Zeit] [Nickname | Hostmaske]
+OPER_IGNORE_VALID_TIME
+ Du musst eine zulässige Zahl als Zeit eingeben.
+OPER_IGNORE_TIME_DONE
+ %s wird jetzt für %s ignoriert.
+OPER_IGNORE_PERM_DONE
+ %s will wird jetzt permanent ignoriert.
+OPER_IGNORE_DEL_DONE
+ %s wird nicht länger ignoriert.
+OPER_IGNORE_LIST
+ Services Ignore-Liste:
+OPER_IGNORE_LIST_NOMATCH
+ Der Nickname %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 Nickname
+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:
+ Nickname Maske
+OPER_USERLIST_HEADER_CHAN
+ %s User-Liste:
+ Nickname Maske
+OPER_USERLIST_RECORD
+ %-20s %s@%s
+OPER_USERLIST_END
+ Ende der User-Liste.
+
+###########################################################################
+#
+# Session Limiting and Exception messages
+#
+###########################################################################
+
+# EXCEPTION responses
+OPER_SUPER_ADMIN_ON
+ Du bist jetzt ein Super-Admin.
+OPER_SUPER_ADMIN_OFF
+ Du bist jetzt kein Super-Admin mehr.
+OPER_SUPER_ADMIN_SYNTAX
+ Super-Admin muss ON oder OFF sein.
+OPER_SUPER_ADMIN_WALL_ON
+ %s ist jetzt ein Super-Admin.
+OPER_SUPER_ADMIN_WALL_OFF
+ %s verlässt den Super-Admin Mode.
+OPER_SUPER_ADMIN_ONLY
+ NUR Super-Admins können dieses Befehl benutzen.
+
+OPER_STAFF_LIST_HEADER
+ On Level Nickname
+
+# DefCon Messages
+
+OPER_STAFF_FORMAT
+ %c %s %s
+OPER_STAFF_AFORMAT
+ %c %s %s [%s]
+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 jetzt beim DEFCON %d
+OPER_DEFCON_WALL
+ %s hat das DEFCON-Level geändert zu %d
+DEFCON_GLOBAL
+ Das Defcon-Level ist jetzt auf Level: %d
+
+# Module strings
+
+OPER_MODULE_LOADED
+ Modul %s geladen
+OPER_MODULE_UNLOADED
+ Modul %s entfernt
+OPER_MODULE_LOAD_FAIL
+ Kann Modul %s nicht laden
+OPER_MODULE_REMOVE_FAIL
+ Kann Modul %s nicht entfernen
+OPER_MODULE_NO_UNLOAD
+ Modul KANN NICHT entfernt werden.
+OPER_MODULE_LOAD_SYNTAX
+ MODLOAD Modul-Name
+OPER_MODULE_UNLOAD_SYNTAX
+ MODUNLOAD Modul-Name
+OPER_MODULE_LIST_HEADER
+ Aktuelle Module - Liste:
+OPER_MODULE_LIST
+ Module: %s [%s] [%s]
+OPER_MODULE_LIST_FOOTER
+ %d Module geladen.
+OPER_MODULE_INFO_LIST
+ Module: %s Version: %s Autor: %s geladen: %s
+OPER_MODULE_CMD_LIST
+ Unterstützte Befehle: %R%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 Modul %s verfügbar
+OPER_MODULE_INFO_SYNTAX
+ MODINFO Modul-Name
+
+MODULE_HELP_HEADER
+ Die folgenden Befehle wurden durch ein Modul geladen:
+
+###########################################################################
+#
+# Session Limiting and Exception messages
+#
+###########################################################################
+
+# EXCEPTION responses
+OPER_EXCEPTION_SYNTAX
+ EXCEPTION {ADD | DEL | MOVE | LIST | VIEW} [Parameter]
+OPER_EXCEPTION_ADD_SYNTAX
+ EXCEPTION ADD [+Zeit] Hostmaske Limit Grund
+OPER_EXCEPTION_DEL_SYNTAX
+ EXCEPTION DEL {Hostmaske | Liste}
+OPER_EXCEPTION_MOVE_SYNTAX
+ EXCEPTION MOVE Nummer 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
+ DIe Exception für %s (#%d) wurde auf die %d Position verschoben.
+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
+ Nummer Limit Host
+# mask, set-by, set-time, expires, limit, reason
+OPER_EXCEPTION_VIEW_FORMAT
+ %3d. %s (von %s am %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 Nicknamen und Idents).
+OPER_EXCEPTION_EXISTS
+ %s ist bereits in der EXCEPTION-Liste.
+OPER_EXCEPTION_CHANGED
+ Exception für %s ist zu %d aktualisiert worden.
+
+# 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 Befehl 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 [+Zeit] Hostmaske Limit Grund
+ EXCEPTION DEL {Hostmaske | Liste}
+ EXCEPTION MOVE Nummer Position
+ EXCEPTION LIST [Hostmaske | Liste]
+ EXCEPTION VIEW [Hostmaske | Liste]
+
+ Erlaubt Services Administratoren, die Liste der Verbindungs-
+ einschränkungen zu bearbeiten.Dadurch ist es möglich
+ bestimmte Hosts, z.b. Shell-Server, auf eine bestimmte
+ Anzahl von gleichzeitigen Verbindungen einschränken.Hat
+ ein Host dieses Limit erreicht, wird jede neue Verbindung
+ (vom gleichen Host) nicht mehr akzeptiert. Der betroffene User
+ wird entfernt (gekilled) und via Notice vom %S informiert
+ warum er vom Netzwerk getrennt wurden.
+
+ EXCEPTION ADD fügt die angegebene Hostmaske 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 Nicknamen
+ oder Idents nicht von Interesse sind.
+ Limit muss eine Nummer grösser oder gleich 0 sein, und legt
+ fest, wieviele 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 Zeit
+ Parameter.
+
+ EXCEPTION DEL entfernt den Host von der Liste.
+
+ EXCEPTION MOVE verschiebt den Eintrag mit der Nummer
+ auf die 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 Hostmaske
+ 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 verbundender 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.
+
+OPER_HELP_SESSION
+ Syntax: SESSION LIST threshold
+ SESSION VIEW Host
+
+ Zeigt Services Administratoren 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.
+
+###########################################################################
+#
+# News system messages
+#
+###########################################################################
+
+OPER_HELP_STAFF
+ Syntax: STAFF
+
+ Zeigt alle Nicknamen, 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 Netzwerk.
+
+OPER_HELP_DEFCON_NO_NEW_CHANNELS
+ * Keine neuen Channel-Registrierungen
+OPER_HELP_DEFCON_NO_NEW_NICKS
+ * Keine neuen Nicknamen-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
+OPER_HELP_DEFCON_NO_NEW_MEMOS
+ * Es werden keine neuen Memos gesendet
+OPER_HELP_CHANKILL
+ Syntax: CHANKILL [+Zeit] Channel Grund
+
+ Setzt einen AKILL für jeden Nicknamen des angegebenen Channels.
+ Es werden die Einträge und komplette reale ident@host für jeden
+ Nickname benutzt, dann wird der AKILL durchgeführt.
+
+###########################################################################
+#
+# News system messages ## 19.10.2004 ##
+#
+###########################################################################
+
+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|Nummer]
+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 {Nummer | 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|Nummer]
+NEWS_OPER_LIST_HEADER
+ Oper News Einträge:
+NEWS_OPER_LIST_ENTRY
+ %5d (%s von %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 {Nummer | 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|Nummer]
+NEWS_RANDOM_LIST_HEADER
+ Random news Einträge:
+NEWS_RANDOM_LIST_ENTRY
+ %5d (%s von %s)
+ %s
+NEWS_RANDOM_LIST_NONE
+ Keine randomnews vorhanden.
+NEWS_RANDOM_ADD_SYNTAX
+ Syntax: RANDOMNEWS ADD Text
+NEWS_RANDOM_ADD_FULL
+ Die News Liste ist voll!
+NEWS_RANDOM_ADDED
+ Neuer randomnews Eintrag hinzugefügt (#%d).
+NEWS_RANDOM_DEL_SYNTAX
+ Syntax: RANDOMNEWS DEL {Nummer | ALL}
+NEWS_RANDOM_DEL_NOT_FOUND
+ Randomnews Eintrag #%d nicht gefunden!
+NEWS_RANDOM_DELETED
+ Randomnews Eintrag #%d gelöscht.
+NEWS_RANDOM_DEL_NONE
+ Keine randomnews Einträge zu löschen!
+NEWS_RANDOM_DELETED_ALL
+ Ale randomnews Einträge wurden gelöscht.
+
+NEWS_HELP_LOGON
+ Syntax: LOGONNEWS ADD Text
+ LOGONNEWS DEL {Nummer | ALL}
+ LOGONNEWS LIST
+
+ Zeigt oder bearbeitet die Liste der LogonNews.
+ Nach der Verbindung des Users werden diese Nachrichten
+ angezeigt. (Es werden jedoch nur max. %s angezeigt, um ein
+ Flooding des Users zu verhindern. Wenn mehr News
+ existieren, werden nur die neuesten angezeigt.)
+ NewsCount can be configured in services.conf.
+
+ 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 {Nummer | 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. %s Nachrichten angezeigt, um ein
+ Flooding des Users zu verhindern. Wenn mehr News
+ existieren, werden nur die neüsten angezeigt.)
+ NewsCount can be configured in services.conf.
+
+ 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.
+
+NEWS_HELP_RANDOM
+ Syntax: RANDOMNEWS ADD Text
+ RANDOMNEWS DEL {Nummer | ALL}
+ RANDOMNEWS LIST
+
+ Bearbeitet die Liste der RandomNews Nachrichten oder zeigt diese an.
+ Wenn ein User zum Network verbindet, wird eine (und nur eine!) dieser
+ RandomNews Nachrichten zufällig gewählt und an den User gesendet.
+
+ RANDOMNEWS LIST kann von jedem IRC Operator genutzt werden um die
+ aktuellen News Nachrichten aufzulisten. ADD und DEL können nur von
+ Services Administratoren genutzt werden.
+
+###########################################################################
+#
+# HelpServ help message ## 20.10.2004 ##
+#
+###########################################################################
+
+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:
+
+ %R%s HELP
+ für Informationen zum Registrieren der Nicknames
+
+ %R%s HELP
+ für Informationen zum Registrieren und Kontrollieren der
+ Channels
+
+ %R%s HELP
+ für Informationen zum Senden von Memos an User, die im
+ Moment nicht online sind
+
+HELP_HELP_BOT
+
+ %R%s HELP
+ für Informationen wie man einen Bot in einem Channel
+ einrichtet
+
+HELP_HELP_HOST
+
+ %R%s HELP
+ für Informationen über vHosts Einstellungen
+
+###########################################################################
+#
+# NickServ help messages
+#
+###########################################################################
+NICK_HELP_CMD_CONFIRM
+ CONFIRM Bestätigt einen "nickserv auth code".
+NICK_HELP_CMD_RESEND
+ RESEND Sendet ernuet ein "nickserv auth code".
+
+NICK_HELP_CMD_REGISTER
+ REGISTER Registriert einen Nicknamen
+NICK_HELP_CMD_GROUP
+ GROUP Verwaltung von Nickname-Gruppierungen
+NICK_HELP_CMD_IDENTIFY
+ IDENTIFY Identifizierung des Nicknames
+NICK_HELP_CMD_ACCESS
+ ACCESS Liste der autorisierten Adressen
+NICK_HELP_CMD_SET
+ SET Optionen einstellen, auch Kill-Schutz
+NICK_HELP_CMD_SASET
+ SASET Setzt SET Einstellungen auf einen anderen Nicknamen
+NICK_HELP_CMD_DROP
+ DROP Die Registrierung einen Nicknamen löschen
+NICK_HELP_CMD_RECOVER
+ RECOVER User killen, der deinen Nicknamen verwendet
+NICK_HELP_CMD_RELEASE
+ RELEASE Hebt die Nickname-Sperre auf nach der
+ verwendung des RECOVER Befehls
+NICK_HELP_CMD_SENDPASS
+ SENDPASS Passwort vergessen? Versuch das hier.
+NICK_HELP_CMD_GHOST
+ GHOST Trennt eine "ghost" IRC-Verbindung mit deinen Nicknamen
+NICK_HELP_CMD_ALIST
+ ALIST Listet Channels in dem du Zugang hast
+NICK_HELP_CMD_GLIST
+ GLIST Listet alle Nicknamen in deine Gruppe
+NICK_HELP_CMD_INFO
+ INFO Zeigt Informationen über den angegebenen Nicknamen
+NICK_HELP_CMD_LIST
+ LIST Listet alle registrieten Nicknamen des angegebene Muster
+NICK_HELP_CMD_LOGOUT
+ LOGOUT Macht das IDENTIFY Befehl rückgängig
+NICK_HELP_CMD_STATUS
+ STATUS Zeigt den Status des angegebenen Nicknamens an
+NICK_HELP_CMD_UPDATE
+ UPDATE Erneuert dein gegenwärtigen Status ( Memos , Flags , vHost )
+NICK_HELP_CMD_GETPASS
+ GETPASS Das Passwort eines Nicknamens aus der
+ Datenbank auslesen (nur wenn keine
+ Verschlüsselung aktiv ist)
+NICK_HELP_CMD_GETEMAIL
+ GETEMAIL Gibt die passenden Nicknamen wieder,
+ welche die angegebene eMail benutzen.
+NICK_HELP_CMD_FORBID
+ FORBID Einen bestimmten Nicknamen verbieten
+NICK_HELP_CMD_SUSPEND
+ SUSPEND Suspendet den angegebenen Nicknamen
+NICK_HELP_CMD_UNSUSPEND
+ UNSUSPEND Unsuspend den angegebenen Nicknamen
+
+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
+ %R%S Befehl. Für weitergehende Informationen zu
+ einem bestimmten Befehl, tippe %R%S HELP Befehl.
+
+NICK_HELP_FOOTER
+ WARNUNG: Dieser Service soll den Usern einen Weg ermöglichen,
+ den Missbrauch ihres Nicknames zu verhindern.Es ist NICHT dazu
+ gedacht, Nicknamen zu stehlen oder in Massen zu reservieren.
+ Missbrauch von %S wird geahndet und resultiert mindestens im
+ Verlust deiner registrierten Nicknamen.
+
+NICK_HELP_EXPIRES
+
+ Nicknamen 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 Passwort [eMail]
+
+ Registriert deinen Nicknamen in der Datenbank von
+ %S. Nachdem dein Nickname registriert ist, kannst du mit
+ den SET und ACCESS Befehlen die Einstellungen deines
+ Nicknames 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 eMail zu senden, falls
+ du es vergessen haben solltest.
+ Deine Privatsphäre wird respektiert und deine
+ eMail-Adresse wird keinem Dritten verfügbar gemacht.
+
+ Dieser Befehl (REGISTER) erstellt auch ausserdem
+ eine neue Gruppe für deinen Nicknamen, die dir erlaubt,
+ nachher weitere Nicknamen in diese Gruppe aufzunehmen,
+ die dann automatisch die gleiche Konfiguration und
+ Channel-Privilegien bekommen. Für weitere Informationen
+ über diese Funktion tippe %R%S HELP GROUP.
+
+NICK_HELP_GROUP
+ Syntax: GROUP Ziel Passwort
+
+ Dieser Befehl verbindet deinen Nicknamen mit der
+ Gruppe von Ziel. Passwort ist das Passwort
+ des Ziel-Nicknamens.
+
+ Das Teilnehmen in der Gruppe teilt deine Konfiguration,
+ Memos und Channel-Privilegien mit allen Nicknamen der
+ Gruppe, und vieles mehr!
+
+ Eine Gruppe existiert so lange es sinnvoll ist. Dies
+ bedeutet, dass selbst wenn ein Nicknamen der Gruppe
+ GEDROPED (gelöscht) wird, die geteilten Konfigurationen,
+ Rechte erhalten bleiben, so lange mindestens ein Nickname
+ in der Gruppe verbleibt.
+
+ Dieser Befehl lässt sich sogar verwenden, wenn dein Nickname
+ (noch) nicht registriert ist. Wenn er jedoch registriert ist,
+ musst du dich vorher identifizieren.
+ Tippe %R%S HELP IDENTIFY für weitere Informationen.
+
+ Es wird allerdings empfohlen diesen Befehl mit einem
+ nicht-registrierten Nicknamen zu verwenden, da der
+ Nickname automatisch registriert wird, wenn er der Gruppe
+ beitritt. Das Beitreten einer Gruppe mit einem bereits
+ registrierten Nicknamen 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 Passwort
+
+ Beweist %S, dass du wirklich der Besitzer dieses
+ Nicknamens 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
+
+ Dieser Befehl macht den Effekt des IDENTIFY Befehls
+ rückgängig. NickServ erkennt dich also nicht mehr als
+ den Besitzer des Nicknamens. 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 gelöschter Nickname
+ 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 Befehl benutzen willst, musst du
+ dich vorher mit deinem Passwort identifizieren.
+ Tippe : %R%S HELP IDENTIFY für weitere Informationen
+
+NICK_HELP_ACCESS
+ Syntax: ACCESS ADD Maske
+ ACCESS DEL Maske
+ ACCESS LIST
+
+ Zeigt oder bearbeitet die Zugriffsliste für deinen
+ Nicknamen. Durch diese Liste erkennt %S dich
+ automatisch als berechtigt, diesen Nicknamen zu
+ nutzen. Wenn du den Nicknamen von anderen Adressen
+ verwenden willst, musst du dich durch das
+ IDENTIFY Befehls 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 Parameter
+
+ 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 Nicknamens neu
+ LANGUAGE Stellt die Sprache ein, in der dir die
+ Services antworten sollen.
+ URL Verbindet eine URL mit deinem Nicknamen
+ ICQ Trägt deine ICQ-Nummer unter den Infos
+ zu deinem Nicknamen ein.
+ MSG Ändert die Methode, wie die Services mit
+ dir kommunizieren
+ EMAIL Verbindet eine öffentliche eMail-Adresse
+ mit deinem Nicknamen
+ GREET Stellt eine Begrüssungsmeldung für deinen
+ Nicknamen ein.
+ KILL Stellt Kill-Schutz an oder aus.
+ SECURE Aktiviert/Deaktiviert den Sicherheitsmodus
+ für deinen Nicknamen
+ PRIVATE Verhindert das Erscheinen deines Nicknamens
+ auf der Liste von %R%S LIST
+ HIDE Versteckt bestimmte Informationen deines
+ Nicknamens
+ AUTOOP Sollten Dir die Services automatisch
+ Op-Status geben.
+
+ Wenn du eines dieser Optionen nutzen willst, musst du dich
+ vorher identifizeren.
+ Tippe: %R%S HELP IDENTIFY für weitere Informationen.
+
+ Tippe %R%S HELP SET Option für Erläuterungen
+ zu einer bestimmten oben genannten Option.
+
+NICK_HELP_SET_DISPLAY
+ Syntax: SET DISPLAY Neues-Display
+
+ Ändert den virtuellen "Anführer" deiner Gruppe in den
+ Services. Der wert von Neues-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 Neues-Passwort
+
+ Ändert das Passwort, mit dem du dich als Besitzer des
+ Nicknamen identifizierst.
+
+NICK_HELP_SET_LANGUAGE
+ Syntax: SET LANGUAGE Nummer
+
+ Stellt die Sprache ein, mit der die Services mit dir
+ kommunizieren. (Zum Beispiel in einer Antwort auf einen
+ Befehl den du gesendet hast.)
+
+ Nummer 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 Nicknamen mit dem INFO Befehl anfordert.
+
+NICK_HELP_SET_EMAIL
+ Syntax: SET EMAIL Adresse
+
+ Verbindet die angegebene eMail-Adresse mit deinem
+ Nicknamen. Diese Adresse wird angezeigt, wenn jemand
+ Informationen über deinen Nicknamen mit dem INFO
+ Befehl anfordert.
+
+NICK_HELP_SET_ICQ
+ Syntax: SET ICQ Nummer
+
+ Verbindet die angegebene ICQ Nummer mit deinem Nicknamen.
+ Diese Nummer wird angezeigt, wenn jemand Informationen
+ über deinen Nicknamen mit dem INFO Befehl anfordert.
+
+NICK_HELP_SET_GREET
+ Syntax: SET GREET Nachricht
+
+ Die angegebene Nachricht 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 Nickname,
+ 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
+ Nicknamens 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
+ Nicknamen an oder aus. Mit eingeschaltetem SECURE
+ musst du dich immer identifizieren, egal ob deine
+ Hostmaske auf der Zugriffsliste für den Nicknamen
+ steht oder nicht. Wenn du allerdings auf
+ der Zugriffsliste stehst, wird %S bei
+ fehlender Identifizierung den Nicknamen 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 Nicknamen.
+ Mit eingeschaltetem PRIVATE wird dein Nickname
+ nicht auf Listen erscheinen, die durch %S's LIST
+ Befehls erstellt wurden.
+
+ (Jeder der deinen Nicknamen kennt, kann gezielt mit
+ dem INFO Befehl Informationen über deinen Nicknamen
+ abrufen, unabhängig vom Privat-Modus.)
+
+NICK_HELP_SET_HIDE
+ Syntax: SET HIDE {EMAIL | STATUS | 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), dein
+ Services-Zugriffsstatus (STATUS) 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_SET_AUTOOP
+ Syntax: SET AUTOOP {ON | OFF}
+
+ Bestimmt ob Du automatisch Op-Status erhälst. Auf ON gestellt
+ erlaubt es ChanServ Dir automatisch Op-Status zu geben,
+ wenn Du die Channels betrittst.
+
+NICK_HELP_SASET
+ Syntax: SASET nickname option parameters.
+
+ Setzt verschiedene Einstellungen für den Nicknamen. Gültig für option ist:
+
+ DISPLAY Setzt einen Nicknamen als Ursprung der Nickgruppe
+ PASSWORD Setzt das Passwort eines Nicknamens
+ URL Fügt eine URL dem Nicknamen hinzu
+ EMAIL Fügt eine Emailadresse dem Nicknamen hinzu
+ ICQ Fügt eine ICQ Nummer dem Nicknamen hinzu
+ GREET Fügt eine Begrüssungsnachricht dem Nicknamen hinzu
+ KILL Schützt den Nicknamen durch Identifikationszwang
+ SECURE Schaltet die Identifikationssicherheitsfunktion
+ an oder aus
+ PRIVATE Verhindert, dass der Nickname im Befehl
+ %R%S LIST auftaucht
+ HIDE Versteckt bestimmte, dem Nicknamen zugeordnete,
+ Informationen
+ MSG Bestimmt die Art wie die Services Nachrichten senden
+ NOEXPIRE Verhindert, dass der Nickname nach einer bestimmten
+ Zeit verfällt
+ LANGUAGE Stellt die Sprache ein, in der die Services
+ dem Nicknamen antworten sollen.
+ AUTOOP Sollten die Services dem Nick automatisch seinen
+ Op-Status geben.
+
+ Mit %R%S HELP SASET option können mehr Informationen zu
+ den Einstellungen angefordert werden. Die Einstellungen betreffen den
+ angegebenen Nicknamen.
+
+ Die Befehle sind nur für Services Admins verfügbar.
+
+NICK_HELP_SASET_DISPLAY
+ Syntax: SASET nickname DISPLAY new-display
+
+ Ändert den Nicknamen der als Ursprung einer Nicknamengruppe
+ angezeigt wird. Der neue Ursprung muss ein Nickname der
+ entsprechenden Gruppe sein.
+
+NICK_HELP_SASET_PASSWORD
+ Syntax: SASET nickname PASSWORD new-password
+
+ Ändert das Passwort um sich als Besitzer eines Nicknamens
+ zu identifizieren.
+
+NICK_HELP_SASET_URL
+ Syntax: SASET nickname URL url
+
+ Verknüpft eine URL mit dem Nicknamen. Diese URL wird
+ angezeigt wenn jemand mit dem INFO Befehl nähere
+ Informationen zu dem Nicknamen abruft.
+
+NICK_HELP_SASET_EMAIL
+ Syntax: SASET nickname EMAIL address
+
+ Verknüpft die angegeben Emailadresse mit dem
+ Nicknamen.
+
+NICK_HELP_SASET_ICQ
+ Syntax: SASET nickname ICQ number
+
+ Verknüpft die angegebene ICQ Nummer mit dem Nicknamen.
+ Diese ICQ Nummer wird angezeigt wenn jemand mit dem
+ INFO Befehl nähere Informationen zu dem Nicknamen abruft.
+
+NICK_HELP_SASET_GREET
+ Syntax: SASET nickname GREET message
+
+ Setzt die angegebene Nachricht als Begrüssungsnachricht
+ für den Nicknamen. Diese wird angezeigt, wenn der Nickname
+ den Channel betritt und die GREET Einstellung aktiviert
+ ist. Vorraussetzung ist, dass der Benutzer die entsprechenden
+ Rechte besitzt.
+
+NICK_HELP_SASET_KILL
+ Syntax: SASET nickname KILL {ON | QUICK | IMMED | OFF}
+
+ Stellt den automatischen Schutz des Nicknames durch
+ einen Kill an oder aus. Nimmt ein User diesen Nickname,
+ 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
+ Nicknamens steht. Bitte benutze diese Option nicht
+ unnötigerweise.
+ Ausserdem ist es möglich, dass die Netz-Admins
+ diese Option deaktiviert haben.
+
+NICK_HELP_SASET_SECURE
+ Syntax: SASET nickname SECURE {ON | OFF}
+
+ Schaltet die Sicherheitsfunktionen von %S für den
+ Nicknamen an oder aus. Mit eingeschaltetem SECURE
+ muss sich der Nickname immer identifizieren, egal
+ ob seine Hostmaske auf der Zugriffsliste für den
+ Nicknamen steht oder nicht. Wenn er allerdings auf
+ der Zugriffsliste stehst, wird %S bei
+ fehlender Identifizierung den Nicknamen nicht killen
+ (ist von der KILL Option unabhängig).
+
+NICK_HELP_SASET_PRIVATE
+ Syntax: SASET nickname PRIVATE {ON | OFF}
+
+ Ändert %S's Privat-Modus für den Nicknamen.
+ Mit eingeschaltetem PRIVATE wird der Nickname
+ nicht auf Listen erscheinen, die durch %S's LIST
+ Befehl erstellt wurden.
+
+ (Jeder der den Nicknamen kennt, kann gezielt mit
+ dem INFO Befehl Informationen über den Nicknamen
+ abrufen, unabhängig vom Privat-Modus.)
+
+NICK_HELP_SASET_HIDE
+ Syntax: SASET nickname HIDE {EMAIL | STATUS | USERMASK | QUIT} {ON | OFF}
+
+ Erlaubt es beim angegebenen Nicknamen , bestimmte Informationen
+ in der Ausgabe von %S INFO zu verstecken.
+ Es kann die eMail-Adresse versteckt (EMAIL) werden, die
+ zuletzt gesehene user@host-Maske (USERMASK), der
+ Services-Zugriffsstatus (STATUS) und die letzte Quit-Nachricht
+ (QUIT).
+ Der zweite Parameter bestimmt, ob die Information angezeigt
+ werden soll (OFF) oder nicht (ON).
+
+NICK_HELP_SASET_MSG
+ Syntax: SASET nickname MSG {ON | OFF}
+
+ Bestimmt die Art, mit dem sich die Services mit dem
+ angebenen Nicknamen unterhalten.
+ Ist MSG eingeschaltet, benutzen die Services Messages
+ (Queries), ansonsten werden die Antworten als Notices
+ geschickt (Standard).
+
+NICK_HELP_SASET_NOEXPIRE
+ Syntax: SASET nickname NOEXPIRE {ON | OFF}
+
+ Bestimmt ob ein Nickname nach einer gewissen Zeit
+ verfällt. Wird NOEXPIRE auf ON gesetzt verfällt
+ der Nickname nie.
+
+NICK_HELP_SASET_AUTOOP
+ Syntax: SASET nickname AUTOOP {ON | OFF}
+
+ Bestimmt ob der angegebene Nickname automatisch Op-Status erhält.
+ Wird AUTOOP auf ON gestellt erlaubt es ChanServ den
+ angegebenen Nicknamen automatisch Op-Status zu geben,
+ wenn der Nick die Channels betritt.
+
+NICK_HELP_SASET_LANGUAGE
+ Syntax: SASET nickname LANGUAGE number
+
+ Wechselt die Sprache der Services, wenn Meldungen an den
+ Nicknamen gesendet werden.
+ (Zum Beispiel in einer Antwort auf einen Befehl den der User gesendet hat).
+ Die Nummer sollte aus der Liste der unterstützten Sprachen gewählt
+ werden, die man mit tippen des Befehls %R%S HELP SET LANGUAGE bekommt.
+
+NICK_HELP_RECOVER
+ Syntax: RECOVER Nickname [Passwort]
+
+ Ermöglicht dir, deinen Nicknamen wieder freizugeben,
+ wenn jemand anderes ihn angenommen hat. Diese Funktion
+ wird auch durch %S genutzt, wenn jemand einen Nickname
+ mit Kill-Schutz anzunehmen.
+
+ Bei Aufruf dieses Befehls wird %S einen virtuellen
+ User mit dem gleichen Nick online schalten den du
+ recovern willst. Die Folge davon ist, dass der User,
+ der deinen Nickname angenommen hatte, vom Server getrennt
+ wird. Der virtuelle User von den Services wird noch
+ %s online bleiben, um sicherzustellen, dass der
+ andere User nicht sofort neu connected; Nach dieser
+ zeit wird der Nickname wieder freigegeben und du kannst
+ ihn annehmen.
+
+ Als Alternative gibt es das RELEASE Befehl,
+ (%R%S HELP RELEASE) um deinen Nickname
+ schneller zurückzubekommen.
+
+ Als Vorraussetzung für das RECOVER Befehl muss
+ deine aktuelle Adresse (siehe Ausgabe von /WHOIS)
+ auf der Zugriffsliste des zu recovernden Nicknamens
+ oder in dessen Gruppe sein. Als dritte Möglichkeit
+ kannst du das Passwort für den Nicknamen angeben.
+
+NICK_HELP_RELEASE
+ Syntax: RELEASE Nickname [Passwort]
+
+ Durch %S wird die Nickname-Sperre, ausgelöst
+ durch z.B. den automatischen Kill-Schutz oder durch
+ Verwendung des RECOVER Befehls, aufgehoben.
+ Standardmässig hält diese Sperre %s, dieser
+ Befehl setzt den Nickname früher wieder frei.
+
+ Als Vorraussetzung für die Verwendung des RELEASE
+ Befehl für einen Nickname, muss deine aktuelle Hostmaske
+ (siehe /WHOIS) in der Zugriffsliste des entsprechenden
+ Nicknamens oder in der Gruppe des Nicknamen sein. Weiterhin
+ musst du das richtige Passwort für den Nicknamen haben.
+
+NICK_HELP_GHOST
+ Syntax: GHOST Nickname [Passwort]
+
+ Trennt eine "geisternde" IRC Verbindung, die deinen
+ Nickname 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 Befehk benutzen willst,muss
+ deine aktuelle Hostmaske (siehe /WHOIS) in der
+ Zugriffsliste des entsprechenden Nicknamens oder
+ in der Gruppe des Nicknamens sein.Weiterhin musst
+ du das richtige Passwort für den Nickname haben.
+
+NICK_HELP_INFO
+ Syntax: INFO Nickname [ALL]
+
+ Zeigt Informationen über den angegebenen Nickname, zum
+ Beispiel den Besitzer des Nicknamens, die letzte gesehene
+ Adresse und dessen Uhrzeit und die Optionen des Nicknamens.
+ Wenn du dich für den Nickname ü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 Muster
+
+ Listet alle registrierten Nicknamen auf, die auf das
+ Suchmuster passen, im Format nickname!user@host.
+ Nicknamen mit aktivierter PRIVATE Option werden
+ allerdings nicht angezeigt.
+
+ Beispiele:
+
+ LIST *!joeuser@foo.com
+ Zeigt alle Nicknamen an, deren Besitzer joeuser@foo.com
+ ist.
+
+ LIST *Bot*!*@*
+ Zeigt alle registrierten Nicknamen mit Bot in ihrem
+ Ident (Gross/Kleinschreibung wird nicht unterschieden).
+
+ LIST *!*@*.bar.org
+ Listet alle Nicknamen von Usern in der bar.org Domain.
+
+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.
+
+ Beispiele:
+
+ 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 mit der NOEXPIRE Option sind mit einem Ausrufezeichen markiert.
+
+NICK_HELP_GLIST
+ Syntax: GLIST
+
+ Zeigt alle Nicknamen die in deiner Gruppe enthalten sind.
+
+NICK_HELP_STATUS
+ Syntax: STATUS Nickname
+
+ Liefert einen Wert zurück, der besagt, ob der augenblickliche
+ Nutzer des Nicknamens der identifizierte Eigentümer ist, oder
+ nicht.Die Antwort hat das Format:
+
+ Nickname Status-Code
+
+ wobei Nickname der Nickname ist, der mit dem Befehl angefragt
+ wurde und Status-Code eine der folgenden Werte:
+
+ 0 - User ist nicht online oder Nickname ist 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 mit dem Befehl übergeben werden,
+ der Rest wird ignoriert. Wenn kein Nickname angegeben wird,
+ wird dein STATUS angezeigt.
+
+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_HELP_CONFIRM
+ Syntax: CONFIRM passcode
+
+ Dies ist der zweite Schritt beim Registrieren des Nicknamens.
+ Du mußt diesen Befehl ausführen, um ihn mit %S zu registrieren.
+ Der Passcode (oder auch Authentifizierungscode genannt) wird
+ an Deine email-adresse gesendet beim ersten Schritt des
+ Registrationsprozesses. Für mehr Informationen über die erste
+ Stufe des Registrationsprozesses tippe: %R%S HELP REGISTER
+
+NICK_HELP_RESEND
+ Syntax: RESEND
+
+ Dieser Befehl löst das Versenden des Authentifizierungscodes
+ (auch Passcode genannt) erneut an die gespeicherte Emailadresse
+ des Users, sobald der User ihn ausführt.
+
+NICK_SERVADMIN_HELP
+ Services Administratoren können auch registrierte Nicknamen
+ löschen,ohne sich für den jeweiligen Nicknamen identifizieren
+ zu müssen. Zusätzlich können sie die Zugriffsliste eines
+ jeden Nicknamen ansehen und bearbeiten. Siehe :
+ %R%S ACCESS LIST Nickname
+
+NICK_SERVADMIN_HELP_LOGOUT
+ Syntax: LOGOUT [Nickname [REVALIDATE]]
+
+ Ohne angegebenen Parameter, macht dieser Befehl die
+ Wirkung von IDENTIFY rückgängig, zum Beispiel
+ wirst du nicht mehr als Eigentümer des Nicknamens 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 Nickname
+ zu identifizieren.
+
+ Diese Funktion ist beschränkt auf die Services Administartoren.
+
+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 Nickname
+ in deiner Gruppe ohne bestimmte Privilegien entfernen.
+
+ Das Entfernen eines beliebigen Nicknamen ist beschränkt
+ auf Services Administratoren.
+
+NICK_SERVADMIN_HELP_INFO
+
+ Services Administratoren können den ALL Parameter für
+ jeden beliebigen Nickname benutzen.
+
+NICK_SERVADMIN_HELP_LIST
+ Syntax: LIST Muster [FORBIDDEN] [SUSPENDED] [NOEXPIRE] [UNCONFIRMED]
+
+ Zeigt alle registrierten Nicknamen an, die einem bestimmten
+ Muster, nickname!user@host, entsprechen. Nicknamen mit
+ aktivierter PRIVATE und NOEXPIRE Option werden nur
+ Services Administratoren angezeigt. Nicknamen bei denen das
+ NOEXPIRE eingeschaltet ist, werden ein ! vor ihrem
+ Eintrag in der Liste haben.
+
+ Wenn die Option FORBIDDEN, SUSPENDED, NOEXPIRE oder UNCONFIRMED
+ angegeben wird, werden nur Nicknamen angezeigt die das entsprechene
+ Muster haben (FORBIDDEN, SUSPENDED, UNCONFIRMED oder NOEXPIRE).
+ Wenn mehr Optionen angegeben werden, werden alle Nicknamen angezeigt
+ die den Muster entsprechen.
+
+ Diese optionen ist beschränkt auf Services Administratoren.
+
+ 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 Nicknamen 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.
+
+NICK_SERVADMIN_HELP_GLIST
+ Syntax: GLIST [Nickname]
+
+ Wird kein Parameter angegeben, werden alle Nicknamen
+ in deiner Gruppe angezeigt.
+
+ Ansonsten werden alle Nicknamen, die in der Gruppe des
+ angegebenen Nicknamens sind, aufgelistet.
+
+NICK_SERVADMIN_HELP_GETPASS
+ Syntax: GETPASS Nickname
+
+ Liest das Passwort von Nickname aus der Datenbank aus.
+ Beachte dass wenn jemand dieses Befehl benutzt,
+ diese Aktion im Logbuch der Services vermerkt wird.
+ Zusätzlich wird eine Nachricht an alle IRC Operatoren
+ per WALLOPS/GLOBOPS ausgesandt.
+
+ Dieser Befehl ist nicht verfügbar bei aktivierter
+ Verschlüsselung.
+
+NICK_SERVADMIN_HELP_GETEMAIL
+ Syntax: GETEMAIL user@emailhost
+
+ Gibt die passenden Nicknamen 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 Nickname der Person mitgeloggt.
+
+NICK_SERVADMIN_HELP_FORBID
+ Syntax: FORBID Nickname [Grund]
+
+ Verhindert, dass der angegebene Nickname registriert
+ oder genutzt wird. Diese Einschränkung kann durch
+ DROPEN (löschen) des Nicknamen aufgehoben werden.
+
+ In bestimmten Netzen wird ein Grund für das
+ Verbot benötigt.
+
+NICK_SERVADMIN_HELP_SUSPEND
+ Syntax: SUSPEND Nickname Grund
+
+ SUSPEND verhindert das der angegebene Nickname sich identifizieren kann.
+
+NICK_SERVADMIN_HELP_UNSUSPEND
+ Syntax: UNSUSPEND Nickname
+
+ Gibt einen Nicknamen der SUSPENDED ist wieder frei.
+
+###########################################################################
+#
+# ChanServ help messages
+#
+###########################################################################
+CHAN_HELP_CMD_GETPASS
+ GETPASS Liest das Passwort des Channel-Founders
+ aus der Datenbank aus (wenn die
+ Verschlüsselung deaktiviert ist)
+CHAN_HELP_CMD_FORBID
+ FORBID Verhindert die Nutzung eines Channels
+CHAN_HELP_CMD_SUSPEND
+ SUSPEND Verbietet jegliche Nutzung des Channels.
+ Die Channel Einstellungen bleiben jedoch
+ erhalten
+CHAN_HELP_CMD_UNSUSPEND
+ UNSUSPEND Hebt ein SUSPEND wieder auf
+CHAN_HELP_CMD_STATUS
+ STATUS Liefert das Zugriffslevel eines Users
+ in dem Channel
+CHAN_HELP_CMD_REGISTER
+ REGISTER Einen Channel registrieren
+CHAN_HELP_CMD_IDENTIFY
+ IDENTIFY Sich mit Passwort als Founder (z.B.)
+ des Channels identifizieren
+CHAN_HELP_CMD_SET
+ SET Bestimmte Channel-Optionen und
+ Informationen einstellen
+CHAN_HELP_CMD_AOP
+ AOP Verwaltet die AOP-Liste von einen Channel
+CHAN_HELP_CMD_SOP
+ SOP Verwaltet die SOP-Liste von einen Channel
+CHAN_HELP_CMD_ACCESS
+ ACCESS Die Liste der priviligierten User
+ bearbeiten
+CHAN_HELP_CMD_LEVELS
+ LEVELS Die Einstellungen verschiedener
+ Zugriffslevel neu definieren
+CHAN_HELP_CMD_AKICK
+ AKICK Die Autokick-Liste bearbeiten
+CHAN_HELP_CMD_DROP
+ DROP Registrierung eines Channels aufheben
+CHAN_HELP_CMD_SENDPASS
+ SENDPASS Hilft bei vergessenen Passwörtern
+CHAN_HELP_CMD_BAN
+ BAN Bant den angegebenen Nicknamen aus einen Channel
+CHAN_HELP_CMD_CLEAR
+ CLEAR Entfernt bestimmte Einstellungen des angegebenen Channel
+CHAN_HELP_CMD_DEVOICE
+ DEVOICE Enfernt den Voice-Status des angegebenen Nicknamens
+ in einen Channel
+CHAN_HELP_CMD_GETKEY
+ GETKEY Gibt den Channel-Schlüßel wieder
+CHAN_HELP_CMD_INFO
+ INFO Zeigt Informationen über den angegebenen Channel
+CHAN_HELP_CMD_INVITE
+ INVITE Veranlaßt den ChanServ den angegebenen Nickname in
+ einen Channel eizuladen
+CHAN_HELP_CMD_KICK
+ KICK Kickt den angegebenen Nicknamen aus einen Channel
+CHAN_HELP_CMD_LIST
+ LIST Listet alle registrieten Channels des angegebene Muster
+CHAN_HELP_CMD_LOGOUT
+ LOGOUT Das Befehl wir den angegegenen Nickname abmelden
+CHAN_HELP_CMD_OP
+ OP Gibt den angegebenen Nicknamen Op-Status in einen Channel
+CHAN_HELP_CMD_TOPIC
+ TOPIC Ändert den Topic des angegebenen Channels
+CHAN_HELP_CMD_UNBAN
+ UNBAN Enfernt ein ban(s) die dich betreffen aus einen Channel
+CHAN_HELP_CMD_VOICE
+ VOICE Gibt den angegebenen User Voice-Status in einen Channel
+CHAN_HELP_CMD_VOP
+ VOP Verwaltet die VOP-Liste von einen Channel
+CHAN_HELP_CMD_DEHALFOP
+ DEHALFOP Enfernt den HalfOP-Status des angegebenen Nicknamens
+ in einen Channel
+CHAN_HELP_CMD_DEOWNER
+ DEOWNER Entfernt dein Gründer Status in einen Channel
+CHAN_HELP_CMD_DEPROTECT
+ DEPROTECT Entfernt den schutz des angegebenen Nicknamens
+ in einen Channel
+CHAN_HELP_CMD_HALFOP
+ HALFOP Gibt den angegebenen User HalfOP-Status in einen Channel
+CHAN_HELP_CMD_HOP
+ HOP Verwaltet die HOP-Liste von einen Channel
+CHAN_HELP_CMD_OWNER
+ OWNER Gibt dir Gründer Staus in einen Channel
+CHAN_HELP_CMD_PROTECT
+ PROTECT Schützt den angegebenen Nicknamen in einen Channel
+CHAN_HELP_CMD_ADMIN
+ ADMIN Schützt den angegebenen Nicknamen in einen Channel
+CHAN_HELP_CMD_DEADMIN
+ DEADMIN Entfernt den Schutz des angegebenen Nicknamens
+ in einen Channel
+CHAN_HELP_CMD_DEOP
+ DEOP Enfernt den OP-Status des angegebenen Nicknamens
+ in einen Channel
+
+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
+ Nicknamen begrenzt. Verfügbare Befehle sind unten aufgelistet.
+ Um sie zu benutzen tippe %R%S Befehl. Für weitere
+ Informationen zu einem bestimmten Befehl, tippe :
+ %R%S HELP Befehl.
+
+
+CHAN_HELP_EXPIRES
+
+ Beachte das jeder Channel der für %d Tage nicht
+ genutzt wird,automatisch auslaufen wird.
+
+CHAN_HELP_REGISTER
+ Syntax: REGISTER Channel Password Beschreibung
+
+ Registriert einen Channel in der Datenbank von %S.
+ Wenn du dieses Befehl nutzen möchtest, musst du
+ Operator-Status in dem Channel besitzen. Das
+ Passwort, dass du mit dem IDENTIFY Befehl
+ 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 Nickname
+ 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 Befehls (%R%S HELP ACCESS) kann man
+ einen Teil dieser Privilegien anderen registrierten
+ Nicknamen ebenfalls erteilen.
+
+ Hinweis: Für das Registrieren eines Channels musst du
+ einen registrierten und identifizierten Nickname benutzen.
+ Hast du dies noch nicht getan, tippe %R%s HELP REGISTER
+ um weitere Informationen darüber zu erhalten.
+
+CHAN_HELP_IDENTIFY
+ Syntax: IDENTIFY Channel Passwort
+
+ Identifiziert ein Nickname gegenüber %S als
+ Gründer (Founder) des angegebenen Channels.
+ Das Passwort muss dasselbe wie bei der
+ registrierung des angegebenen Channels sein
+ und ist in der Regel von den Real-Founder des
+ Channels zu erhalten.
+
+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.
+
+CHAN_HELP_SET
+ Syntax: SET Channel Option Parameter
+
+ 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-Befehl
+ benutzt werden
+ XOP Schaltet das Listen System ein oder aus
+
+ Tippe %R%S HELP Option für weitere Informationen
+ zu einem bestimmten Befehl.
+
+CHAN_HELP_SET_FOUNDER
+ Syntax: SET Channel FOUNDER Nickname
+
+ Ändert den Gründer (Founder) eines Channels. Der neue
+ Nickname muss registriert sein.
+
+CHAN_HELP_SET_SUCCESSOR
+ Syntax: SET Channel SUCCESSOR Nickname
+
+ Ä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 Passwort
+
+ Ändert das Passwort, dass dich als Founder (Gründer)
+ des Channels identifiziert.
+
+CHAN_HELP_SET_DESC
+ Syntax: SET Channel DESC Beschreibung
+
+ Ändert die Beschreibung für einen Channel, die bei
+ dem LIST und INFO Befehl 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 Befehl abfragt.
+ Wird kein Parameter angegeben, wird die aktuelle
+ URL gelöscht.
+
+CHAN_HELP_SET_EMAIL
+ Syntax: SET Channel EMAIL [eMail-Adresse]
+
+ Verbindet die angegebene eMail-Adresse mit dem
+ Channel. Diese eMail-Adresse wird angezeigt,
+ wenn jemand Informationen über den Channel mit
+ dem INFO Befehl abfragt.Wird kein Parameter
+ angegeben, wird die aktuelle eMail-Adresse gelöscht.
+
+CHAN_HELP_SET_ENTRYMSG
+ Syntax: SET Channel ENTRYMSG [Nachricht]
+
+ Ä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 Ban-Typ
+
+ 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 Modi
+
+ 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 Modes die gelockt werden können sind von dein IRCD abhängig.
+ Jede einzelne dieser Modes kann ein/aus oder gar nicht gelockt werden.
+ Der Modi Parameter ist genauso aufgebaut wie das jeweilige /MODE Befehl.
+ 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 jetzt 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%R%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 (Nicknamen mit negativem Zugriffslevel, oder wenn
+ Secure Ops aktiv ist, Nicknamen 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
+ Nicknamen (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 Nicknamen,
+ 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(löschen), 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 Grund
+ 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 %R%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
+ Befehl benutzen, um Zugriffslevel festlegen zu können. Andernfalls
+ musst du das ACCESS Befehl benutzen.
+
+ 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 Befehle
+ benutzt werden.
+
+CHAN_HELP_AOP
+ Syntax: AOP Channel ADD Nickname
+ AOP Channel DEL {Nickname | entry-num | Liste}
+ AOP Channel LIST [Maske | Liste]
+ 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 Befehle UNBAN und INVITE.
+ zu nutzen, beim Betreten des Channels werden die Greet
+ Messages dieser User angezeigt, usw.
+
+ Der AOP ADD Befehl fügt den jeweiligen Nicknamen zur AOP-Liste
+ hinzu.
+
+ Der AOP DEL Befehl löscht den jeweiligen Nickname aus der
+ AOP-Liste. Wenn mehrere Eintragsnummern angegeben werden,
+ werden diese Einträge gelöscht. (Siehe Beispiel bei LIST.)
+
+
+ Der AOP LIST Befehl 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.
+
+ Der AOP CLEAR Befehl 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 den AOP LIST Befehl benutzen.
+
+ Dieser Befehl kann für deinen Channel ausgeschaltet sein, in
+ diesem Fall nutze bitte die Access Liste. Für weitere Infos zur
+ Access Liste, tippe bitte %R%S HELP ACCESS und
+ %R%S HELP SET XOP für Infos über den Wechsel vom XOP und
+ vom Access System.
+
+CHAN_HELP_HOP
+ Syntax: HOP Channel ADD Nickname
+ HOP Channel DEL {Nickname | entry-num | Liste}
+ HOP Channel LIST [Maske | Liste]
+ HOP Channel CLEAR
+
+ Verwaltet die HOP (HalfOP) Liste eines Channels. User auf
+ dieser Liste werden automatisch gehalfopt, wenn sie joinen.
+
+ Der HOP ADD Befehl fügt den jeweiligen Nicknamen zur HOP-Liste
+ hinzu.
+
+ Der HOP DEL Befehl löscht den jeweiligen Nicknamen aus der
+ HOP-Liste. Wenn mehrere Eintragsnummern angegeben werden,
+ werden diese Einträge gelöscht. (Siehe Beispiel bei LIST.)
+
+
+ Der HOP LIST Befehl zeigt die aktuelle HOP-Liste an. 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.
+
+ Der HOP CLEAR Befehl 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.
+
+ Dieser Befehl kann für deinen Channel ausgeschaltet sein, in
+ diesem Fall nutze bitte die Access Liste. Für weitere Infos zur
+ Access Liste, tippe bitte %R%S HELP ACCESS und
+ %R%S HELP SET XOP für Infos über den Wechsel vom xOP und
+ vom Access System.
+
+CHAN_HELP_SOP
+ Syntax: SOP Channel ADD Nickname
+ SOP Channel DEL {Nickname | entry-num | Liste}
+ SOP Channel LIST [Maske | Liste]
+ 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.
+
+ Der SOP ADD Befehl fügt den jeweiligen Nicknamen zur SOP-Liste
+ hinzu.
+
+ Der SOP DEL Befehl löscht den jeweiligen Nicknamen aus der
+ SOP-Liste. Wenn mehrere Eintragsnummern angegeben werden,
+ werden diese Einträge gelöscht. (Siehe Beispiel bei LIST.)
+
+
+ Der SOP LIST Befehl 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.
+
+ Der SOP CLEAR Befehl 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.
+
+ Dieser Befehl kann für deinen Channel ausgeschaltet sein, in
+ diesem Fall nutze bitte die Access Liste. Für weitere Infos zur
+ Access Liste, tippe bitte %R%S HELP ACCESS und
+ %R%S HELP SET XOP für Infos über den Wechsel vom xOP und
+ vom Access System.
+
+CHAN_HELP_VOP
+ Syntax: VOP Channel ADD Nickname
+ VOP Channel DEL {Nickname | entry-num | Liste}
+ VOP Channel LIST [Maske | Liste]
+ VOP Channel CLEAR
+
+ Verwaltet die VOP (Voice) Liste eines Channels.VOPs
+ bekommen automatisch Voice, wenn sie den Channel betreten.
+
+ Der VOP ADD Befehl fügt den jeweiligen Nicknamen zur VOP-Liste
+ hinzu.
+
+ Der VOP DEL Befehl löscht den jeweiligen Nicknamen aus der
+ VOP Liste. Wenn mehrere Eintragsnummern angegeben werden,
+ werden diese Einträge gelöscht. (Siehe Beispiel bei LIST.)
+
+
+ Der VOP LIST Befehl 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.
+
+ Der VOP CLEAR Befehl 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.
+
+ Dieser Befehl kann für deinen Channel ausgeschaltet sein, in
+ diesem Fall nutze bitte die Access Liste. Für weitere Infos zur
+ Access Liste, tippe bitte %R%S HELP ACCESS und
+ %R%S HELP SET XOP für Infos über den Wechsel vom xOP und
+ vom Access System.
+
+CHAN_HELP_ACCESS
+ Syntax: ACCESS Channel ADD Nickname Level
+ ACCESS Channel DEL {Nickname | entry-num | Liste}
+ ACCESS Channel LIST [Maske | Liste]
+ 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 Befehle des Channels
+ freigeschaltet werden soll.
+
+ Verschiedene Zugriffslevel bestimmen den Zugriff auf
+ Privilegien, die dieser User dann im Channel besitzt.
+ Tippe %R%S HELP ACCESS LEVELS für weitere Infos.
+ Jeder Nickname, der nicht auf der Zugriffsliste steht,
+ hat automatisch einen Level von 0.
+
+ Der ACCESS ADD Befehl fügt einen Nickname mit dem
+ angegeben Level auf die Zugriffsliste ein. Wenn der
+ Nickname 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
+ Nickname schon auf der Zugriffsliste steht, muss sein
+ aktueller Level ebenfalls kleiner sein, als von dem User,
+ der den Befehl aufruft.
+
+ Mit ACCESS DEL wird ein Nickname 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).
+
+ Der ACCESS LIST Befehl 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 den ACCESS Befehls
+ 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 Befehls. Tippe %R
+ %S HELP LEVELS für weitere Informationen.
+
+CHAN_HELP_AKICK
+ Syntax: AKICK channel ADD {nick | mask} [reason]
+ AKICK channel STICK mask
+ AKICK channel UNSTICK mask
+ AKICK channel DEL {nick | mask | entry-num | list}
+ AKICK channel LIST [mask | entry-num | list]
+ AKICK channel VIEW [mask | entry-num | list]
+ 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 Nicknamen oder Hostmasken
+ der AutoKick-Liste hinzufügen. Wird ein Grund beim
+ Befehl angegeben, wird dieser als Kick-Grund für den
+ User genutzt, ohne Reason wird standardmässig
+ "You have been banned from the channel" verwendet.
+ Wird ein registrierter Nick gekickt, so wird der
+ registrierte Nickname zur Kickliste hinzugefügt,
+ anstatt der Hostmaske. Alle Nicknamen die dieser Gruppe
+ angehören werden ebenfalls gekickt.
+
+ Durch den AKICK DEL Befehls 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 Nicknamen genutzt werden.
+
+ Der AKICK UNSTICK Befehl macht den AKICK STICK
+ Befehl wieder rückgängig, sodass der Ban wieder
+ entfernt werden kann.
+
+ Der AKICK LIST Befehl 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.
+
+ Der AKICK CLEAR Befehl entfernt alle Einträge aus
+ Der AutoKick-Liste.
+
+CHAN_HELP_LEVELS
+ Syntax: LEVELS channel SET Typ Level
+ LEVELS channel {DIS | DISABLE} Typ
+ LEVELS channel LIST
+ LEVELS channel RESET
+
+
+ Der LEVELS Befehl erlaubt eine feinere Regelung
+ der Zugriffslevel eines Channels. Mit diesem Befehl
+ kann man Zugriffslevel definieren, die die meisten
+ Funktionen von %S abdecken. (SET FOUNDER und SET PASSWORD,
+ genau wie dieser Befehl, 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 Begrüssungsnachricht und
+ die Successors (Vertreter) ebenfalls angezeigt.
+
+CHAN_HELP_LIST
+ Syntax: LIST Muster
+
+ Listet alle registrierten Channels, die dem Muster
+ entsprechen, auf. (Alle Channels mit aktiviertem
+ PRIVATE-Flag werden nicht angezeigt.)
+ Anmerkung: Beachte, dass ein führendes '#' einen
+ numerischen Bereich angibt, Channelnamen müssen
+ ohne '#' angegeben werden.
+
+CHAN_HELP_OP
+ Syntax: OP [Channel [Nickname]]
+
+ Setzt den Operator-Status des angegebenen Nicknamen
+ in dem Channel. Wird kein Nickname 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 [Nickname]]
+
+ Entfernt den Operator-Status eines bestimmten Nickname
+ in dem Channel. Wird kein Nickname 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 [Nickname]]
+
+ Erteilt dem angegebenen Nickname Voice-Status in dem
+ Channel. Wird kein Nick angegeben, wird ChanServ dich
+ voicen. Wird weder Channel noch Nickane 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 [Nickname]]
+
+ Entfernt den Voice-Status des Nicknamen in dem Channel.
+ Wird kein Nickname 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 [Nickname]]
+
+ Setzt den Half-Op-Status des angegebenen Nicknamen in dem
+ Channel. Wird kein Nickname angegeben, wird ChanServ dich
+ halfoppen. Wird weder Channel noch Nickname 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 [Nickname]]
+
+ Entfernt den Half-Op-Status des angegebenen Nicknamen in dem
+ Channel. Wird kein Nickname angegeben, wird ChanServ dich
+ dehalfoppen. Wird weder Channel noch Nickname 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 [Nickname]]
+
+ Beschützt den angegebenen Nicknamen in dem Channel. Wird kein
+ Nickname angegeben, wird ChanServ dich beschützen. Wird weder
+ Nickname 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 [Nickname]]
+
+ Entfernt den Schutz auf den angegebenen Nickname in dem Channel.
+ Wird kein Nickname angegeben, wird ChanServ dich nicht mehr
+ beschützen. Wird weder Nickname 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 Nickname auf der
+ Zugriffsliste des Channels einen Level grösser 5
+ (oder INVITE) 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
+ 5 (oder UNBAN)ist.
+
+CHAN_HELP_KICK
+ Syntax: KICK [Channel [Nickname [Grund]]]
+
+ Kickt den ausgewählten Nicknamen aus dem Channel. Wird
+ kein Nickname angegeben, wird ChanServ dich (!) kicken.
+ Wenn weder Nickname 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 [Nickname [Grund]]]
+
+ Bannt einen Nicknamen im Channel. Falls kein Nickname angegeben
+ wird, wirst du gebannt. Falls kein Nickname 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. Dieser
+ Befehl ist vor allem in Verbindung mit SET TOPICLOCK
+ nützlich. Tippe %R%S HELP SET TOPICLOCK für weitere
+ Informationen.
+
+ Standardmässig auf Founder (Gründer) beschränkt.
+
+CHAN_HELP_CLEAR
+ Syntax: CLEAR Channel was
+
+ Sagt %S, dass es bestimmte Einstellungen
+ in einem Channel zurücksetzen soll. Die Option
+ kann eine der folgenden sein:
+
+ MODES Setzt alle Modi in dem Channel zurück.
+ (z.B. Modi 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.
+ HOPS Entfernt jeden Halfoperator-Status (mode +h)
+ in den Channel.(Falls dein IRCD es unterstützt).
+ 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. Dieser
+ Befehl 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. Dieser Befehl ist sehr nützlich,
+ wenn man mit dem Problem des vergessenen Passwortes
+ konfrontiert wird.
+
+ Kann in einigen Netzen auf IRC Operatoren beschränkt
+ sein.
+
+ Dieser Befehl ist nicht verfügbar, wenn die
+ Datenbank verschlüsselt gespeichert wird.
+
+CHAN_SERVADMIN_HELP
+
+ Services Administratoren können weiterhin beliebige Channels
+ DROPEN (löschen), 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 dieser Befehl 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 Administrator, 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 Nickname 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 Administratoren können Channel DROPEN,
+ (löschen) ohne sich vorher gegenüber dem Channel als
+ Founder zu identifizieren.
+
+CHAN_SERVADMIN_HELP_SET
+
+ Services Administratoren können zusätzlich die Option NOEXPIRE
+ an einem Channel setzen, dies verhindert den automatischen
+ Auslauf des Channels.
+
+ Weiterhin können Services Administratoren 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 Administratoren.
+
+CHAN_SERVADMIN_HELP_INFO
+
+ Services Administratoren können den ALL Parameter bei jedem
+ Channel benutzen.
+
+CHAN_SERVADMIN_HELP_LIST
+ Syntax: LIST Muster [FORBIDDEN] [NOEXPIRE]
+
+ Zeigt alle registrierten Channels die auf das angegebene
+ Muster treffen.Channels mit aktivierter PRIVATE Option
+ werden nur Services Administratoren 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 mehr Optionen
+ angegeben, werden nur Channels angezeigt, die mindestens eins
+ der entsprechenden Flags gesetzt haben. Diese Funktionen sind
+ beschränkt auf Services Administratoren.
+
+CHAN_SERVADMIN_HELP_GETPASS
+ Syntax: GETPASS Channel
+
+ Liest das Founder-Passwort des angegebenen Channels
+ aus der Datenbank von ChanServ aus.
+ Beachte dass wenn jemand dieser Befehl benutzt,
+ diese Aktion im Logbuch der Services vermerkt wird.
+ Zusätzlich wird eine Nachricht an alle IRC Operatoren
+ per WALLOPS/GLOBOPS ausgesandt.
+
+CHAN_SERVADMIN_HELP_FORBID
+ Syntax: FORBID Channel [Grund]
+
+ Verbietet die Nutzung bzw die Registrierung des
+ angegebenen Channels.
+ Die Wirkung wird wieder aufgehoben durch DROPEN
+ (löschen) des Channels.
+
+ Bei einigen Netzen muss evtl ein Grund angegeben
+ werden.
+
+CHAN_SERVADMIN_HELP_SUSPEND
+ Syntax: SUSPEND Channel [Grund]
+
+ Verbietet jegliche Nutzung des Channels. Kann durch
+ den UNSUSPEND Befehls wieder aufgehoben werden,
+ wobei alle vorherigen Einstellungen wieder übernommen
+ werden.
+
+ Ein Grund kann auf manchen Netzwerke notwendig sein.
+
+CHAN_SERVADMIN_HELP_UNSUSPEND
+ Syntax: UNSUSPEND Channel
+
+ Gibt einen Channel, der auf SUSPEND gesetzt ist,
+ wieder frei. Alle vorherigen Einstellungen werden
+ übernommen.
+
+CHAN_SERVADMIN_HELP_STATUS
+ Syntax: STATUS Channel Nickname
+
+ Liefert den Zugriffslevel des angegebenen Nicknamen 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
+
+###########################################################################
+#
+# MemoServ help messages
+#
+###########################################################################
+MEMO_HELP_CMD_SEND
+ SEND Sendet eine Memo an einen Nickname oder Channel
+MEMO_HELP_CMD_CANCEL
+ CANCEL Annulliert deine letzte gesendete Memo
+MEMO_HELP_CMD_LIST
+ LIST Erzeugt eine Liste deiner Memos
+MEMO_HELP_CMD_READ
+ READ Lesen einer oder mehrerer Memos
+MEMO_HELP_CMD_DEL
+ DEL Löschen einer oder mehrerer Memos
+MEMO_HELP_CMD_SET
+ SET Stellt bestimmte Optionen ein in Hinsicht
+ auf Memos
+MEMO_HELP_CMD_INFO
+ INFO Zeigt Informationen bezüglich deiner Memos an
+MEMO_HELP_CMD_RSEND
+ RSEND Sendet eine Memo an einen Nickname oder Channel
+ und sendet dir eine Empfangsbestätigung zurück
+MEMO_HELP_CMD_CHECK
+ CHECK Überprüft ob deine letzte gesendete Memo an
+ einen Nicknamen gelesen wurde
+
+MEMO_HELP_CMD_SENDALL
+ SENDALL Sendet eine Nachricht an alle registrierten User.
+MEMO_HELP_CMD_STAFF
+ STAFF Sendet allen Opers/Admins eine Nachricht.
+
+MEMO_HELP_HEADER
+ %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 Nickname des Senders als auch Empfängers müssen
+ registriert sein, um eine Memo versenden zu können.
+
+ %S's Befehle beinhalten:
+
+MEMO_HELP_ADMIN
+ NICHT benutzt.
+MEMO_HELP_OPER
+ NICHT benutzt.
+MEMO_HELP_FOOTER
+
+ Tippe: %R%S HELP Befehl 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 {Nickname | Channel} Memo-Text
+
+ Sendet an einen Nicknamen 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 (Nickname/Channel) muss registriert sein.
+
+MEMO_HELP_CANCEL
+ Syntax: CANCEL {Nickname | Channel}
+
+ Widerruft die letzte Memo die du an den angegebenen Nicknamen
+ 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] {Nummer | 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
+ Nummer 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] {Nummer | 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 Parameter
+
+ 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: %R%S HELP SET Option für weitere Informationen
+ ü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 Befehls ist beschränkt auf
+ Services Administratoren. 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.
+ Der HARD Befehl kann er auch nicht nutzen.
+
+MEMO_SERVADMIN_HELP_INFO
+ Syntax: INFO [Nickname | 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 Administratoren.
+
+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 an beide der Services-Zugriffs-Listen
+ (Oper und Admin) hast, so werden die alle diese Nachricht erhalten.
+ Das gleichte trifft für die Operatoren auf der Root-Liste zu.
+
+MEMO_HELP_SENDALL
+ Syntax: SENDALL Memo-Text
+
+ Sendet allen registrieten Usern eine Nachricht mit dem
+ Memo-Text.
+
+MEMO_HELP_RSEND
+ Syntax: RSEND {Nickname | Channel} Memo-Text
+
+ Sendet an einen Nicknamen 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 (Nickname/Channel) muss
+ registriert sein. Wenn deine Memo gelesen worden ist,
+ bekommst du eine Auto-Memo die dich Informirmiert
+ das der / die jenige dein Memo-Text gelesen hat.
+
+MEMO_HELP_CHECK
+ Syntax: CHECK Nickname
+
+ Überprüft ob deine letzte gesendete Memo an einen Nicknamen gelesen
+ worden ist oder nicht. Der CHECK Befehl funktioniert nicht mit Channels.
+
+###########################################################################
+#
+# OperServ help messages
+#
+###########################################################################
+
+OPER_HELP_CMD_GLOBAL
+ GLOBAL Eine Notice an alle User schicken
+OPER_HELP_CMD_STATS
+ STATS Status des Netzes und der Services anzeigen
+OPER_HELP_CMD_OPER
+ OPER Die Services Operatoren Liste bearbeiten
+OPER_HELP_CMD_ADMIN
+ ADMIN Liste der Services Administratoren bearbeiten
+OPER_HELP_CMD_STAFF
+ STAFF Zeigt alle Nicknamen, die Zugriff auf die
+ Services haben, Onlinestatus und Level
+OPER_HELP_CMD_MODE
+ MODE Channel-Modes ändern
+OPER_HELP_CMD_KICK
+ KICK Einen User aus einem beliebigen
+ Channel kicken
+OPER_HELP_CMD_CLEARMODES
+ CLEARMODES Die Modi eines Channels zurücksetzen
+OPER_HELP_CMD_KILLCLONES
+ KILLCLONES Alle User mit einem bestimmten Host killen
+OPER_HELP_CMD_AKILL
+ AKILL Die AutoKill-Liste bearbeiten
+OPER_HELP_CMD_SGLINE
+ SGLINE Die SGLINE-Liste bearbeiten
+OPER_HELP_CMD_SQLINE
+ SQLINE Die SQLINE-Liste bearbeiten
+OPER_HELP_CMD_SZLINE
+ SZLINE Die SZLINE-Liste bearbeiten
+OPER_HELP_CMD_CHANLIST
+ CHANLIST Alle registrierten Channels anzeigen
+OPER_HELP_CMD_USERLIST
+ USERLIST Alle registrierten Nicknamen anzeigen
+OPER_HELP_CMD_LOGONNEWS
+ LOGONNEWS Logon-News bearbeiten
+OPER_HELP_CMD_RANDOMNEWS
+ RANDOMNEWS Definiert Nachrichten, die den Benutzern zufällig
+ beim Verbinden angezeigt werden
+OPER_HELP_CMD_OPERNEWS
+ OPERNEWS Oper News bearbeiten
+OPER_HELP_CMD_SESSION
+ SESSION Hosts mit einer bestimmten Anzahl
+OPER_HELP_CMD_EXCEPTION
+ EXCEPTION Bearbeiten der Liste der eingeschränkten Verbindungen
+OPER_HELP_CMD_NOOP
+ NOOP Alle O:Lines temporär deaktivieren
+OPER_HELP_CMD_JUPE
+ JUPE Einen Server "jupitern"
+OPER_HELP_CMD_IGNORE
+ IGNORE Die "Services Ignore Liste" bearbeiten
+OPER_HELP_CMD_SET
+ SET Verschiedene Services Optionen einstellen
+OPER_HELP_CMD_RELOAD
+ RELOAD Die Konfigurationsdatei neu einlesen
+OPER_HELP_CMD_UPDATE
+ UPDATE Die Services Datenbänke sofort speichern
+OPER_HELP_CMD_RESTART
+ RESTART Datenbanken speichern und Services neustarten
+OPER_HELP_CMD_QUIT
+ QUIT Services _ohne_ Speichern der Datenbanken
+ beenden
+OPER_HELP_CMD_SHUTDOWN
+ SHUTDOWN Datenbanken speichern und Services beenden
+OPER_HELP_CMD_DEFCON
+ DEFCON Ändert das DefCon System
+OPER_HELP_CMD_CHANKILL
+ CHANKILL Killt alle User des angegebenen Channels
+OPER_HELP_CMD_OLINE
+ OLINE Einem User "Operflags" setzen
+OPER_HELP_CMD_UMODE
+ UMODE User Modi ändern
+OPER_HELP_CMD_SVSNICK
+ SVSNICK Erzwingt einen Nicknamen wechsel
+OPER_HELP_CMD_MODLOAD
+ MODLOAD Lädt ein Modul
+OPER_HELP_CMD_MODUNLOAD
+ MODUNLOAD Entfernt ein Modul
+OPER_HELP_CMD_MODINFO
+ MODINFO Info über ein geladenes Modul
+OPER_HELP_CMD_MODLIST
+ MODLIST Listet die geladenen Module auf
+
+OPER_HELP
+ Befehle von %S:
+
+OPER_HELP_LOGGED
+ Achtung: Alle Befehle die an %S gesendet werden,
+ werden geloggt!
+
+OPER_HELP_GLOBAL
+ Syntax: GLOBAL Nachricht
+
+ Ermöglicht Administratoren 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 wurden 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 Administratoren verfügbar.
+ Sie zeigt unter anderem den aktuellen Speicherverbrauch der
+ Services. Dieser Befehl 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
+ verbundenen User.
+
+ UPTIME kann als Synonym für STATS verwendet werden.
+
+OPER_HELP_OPER
+ Syntax: OPER ADD Nickname
+ OPER DEL {Nickname | entry-num | Liste}
+ OPER LIST [Maske | Liste]
+ OPER CLEAR
+
+ Erlaubt Services Root bestimmte Nicknamen in
+ die Liste der Services Operatoren aufnehmen oder zu entfernen.
+ Ein User der sich für diesen Nicknamen gegenüber %s
+ identifiziert hat und auf der Liste der Services Operatoren
+ ist, hat Zugriff auf die Befehle von OperServ.
+
+ Mit OPER ADD wird der angegebene Nickname auf die Liste der
+ Services Operatoren hinzugefügt.
+
+ Durch OPER DEL wird der angegebene Nickname von der Liste
+ entfernt. Wird ein Bereich von Zahlen eingegeben, werden
+ die entsprechenden Einträge gelöscht. (Siehe das Beispiel
+ für LIST weiter unten.)
+
+ Der OPER LIST Befehl 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 den OPER LIST Befehl verwenden.
+
+OPER_HELP_ADMIN
+ Syntax: ADMIN ADD Nickname
+ ADMIN DEL {Nickname | entry-num | Liste}
+ ADMIN LIST [Maske | Liste]
+ ADMIN CLEAR
+
+ Erlaubt Services Roots bestimmte Nicknamen in die Liste
+ der Services Administratoren aufnehmen oder zu entfernen.
+ Ein User der sich für diesen Nicknamen gegenüber %s
+ identifiziert hat und auf die Services Adminstratoren-Liste
+ ist, hat Zugriff auf die Admin Befehlen von OperServ.
+
+ Mit ADMIN ADD wir der angegebene Nickname auf die
+ Services Administratoren-Liste hinzugefügt.
+
+ Durch ADMIN DEL wird der angegebene Nickname von der Liste
+ entfernt. Wird ein Bereich von Zahlen eingegeben, werden
+ die entsprechenden Einträge gelöscht. (Siehe das Beispiel
+ für LIST weiter unten.)
+
+ Der ADMIN LIST Befehl zeigt den Inhalt der Services
+ Administratoren-Liste an. Wird eine Maske mit Platzhaltern
+ (Wildcards) angegeben, werden die entsprechenden Einträge
+ angezeigt. Wird ein 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
+ Services Administratoren-Liste an.
+
+ Mit Hilfe von ADMIN CLEAR wird die Services
+ Administartoren-Liste komplett geleert.
+
+ Jeder IRC Operator kann den Befehl ADMIN LIST nutzen,
+ jegliche anderen Befehle können nur von Services Roots
+ aufgerufen werden.
+
+OPER_HELP_IGNORE
+ Syntax: IGNORE {ADD|DEL|LIST|CLEAR} [time] [nick | mask]
+
+ Erlaubt Services Admins den Services einen Nick oder eine
+ Hostmaske für eine bestimmte Zeit oder bis zum nächsten
+ Neustart zu ignorieren. Mit Hilfe von Zeit lässt sich eine
+ bestimmte Auslaufzeit dieses Eintrags definieren.
+ Zeit wird durch eine Ganzzahl angegeben, gefolgt von einem
+ Buchstaben: s (Sekunden), m (Minuten), h (Stunden)
+ oder d (Tage).
+ Kombinationen (wie zum Beispiel 1h30m) sind nicht zulässig.
+ Wird kein Buchstabe angegeben, wird von Sekunden ausgegangen
+ (also 30 bedeutet dann z.B. 30 Sekunden). Um einen
+ IGNORE-Eintrag zu erstellen, der nicht ausläuft, benutze 0.
+ Wenn eine Hostmaske hinzugefügt wird sollte es in dem Format
+ user@host oder nick!user@host erfolgen, ansonsten wird es als
+ Nick angesehen. Wildcards sind erlaubt.
+
+ Ignores werden nicht bei IRC Operatoren erzwungen.
+
+OPER_HELP_MODE
+ Syntax: MODE Channel Modi
+
+ Erlaubt es Services Operatoren die Channel Modes eines
+ beliebigen Channels zu verändern. Der Paramater hat das
+ gleiche Format wie der normale /MODE Befehl.
+
+OPER_HELP_UMODE
+ Syntax: UMODE User Modi
+
+ Erlaubt es Super Adminstratoren die Usermodi eines
+ beliebigen Users zu ändern. Der Paramater hat das gleiche
+ Format wie der normale /MODE Befehl.
+
+OPER_HELP_OLINE
+ Syntax: OLINE User Flags
+
+ Erlaubt es Super Adminstratoren einem User Operflags
+ zu setzen.Den Flags muss ein "+" oder ein "-" vorangestellt
+ werden. Um alle Operflags zu entfernen, nutze einfach ein
+ "-" ohne Operflags.
+
+OPER_HELP_CLEARMODES
+ Syntax: CLEARMODES Channel [ALL]
+
+ Entfernt alle Modi und Bans eines Channels.
+ Wird ALL angegeben, werden ebenfalls alle
+ Op-Flags und Voices (+o und +v Modi) entfernt.
+
+OPER_HELP_KICK
+ Syntax: KICK Channel User Grund
+
+ Erlaubt staff einen User aus einem beliebigen
+ Channel zu kicken. Die Parameter sind dieselben
+ wie für das normale /KICK Befehl.
+ Die Kick-Nachricht wird den Nicknamen des IRCops
+ vor dem Grund haben. Zum Beispiel:
+
+ *** SpamMan has been kicked off channel #my_channel by %S (chemical (Flood))
+
+OPER_HELP_SVSNICK
+ Syntax: SVSNICK Nickname Neuer-Nickname
+
+ Erzwingt die Änderung des Nicknamens eines User zu dem neuen Nicknamen.
+ Limited to Super Admins.
+
+OPER_HELP_AKILL
+ Syntax: AKILL ADD [+Zeit] Maske Grund
+ AKILL DEL {Maske | entry-num | Liste}
+ AKILL LIST [Maske | Liste]
+ AKILL VIEW [Maske | Liste]
+ AKILL CLEAR
+
+ Erlaubt Services Operatoren die AutoKill-Liste zu
+ bearbeiten. Versucht ein User der einen entsprechenden
+ Eintrag auf der AKILL-Liste hat zu verbinden, werden
+ die Services ihn killen und falls der Server dies
+ unterstützt wird ein Ban (G-line) für den User gesetzt.
+
+ AKILL ADD fügt die angegebene user@Hostmaske mit
+ dem Grund (dieser muss angegeben werden) zur AKILL-
+ Liste hinzu. Mit Hilfe von Zeit lässt sich eine bestimmte
+ Auslaufzeit dieses Eintrags definieren.
+ Zeit 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 (Zeit) 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 Befehl 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
+ Befehls 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.
+
+OPER_HELP_SGLINE
+ Syntax: SGLINE ADD [+Zeit] Maske:Grund
+ SGLINE DEL {Maske | entry-num | Liste}
+ SGLINE LIST [Maske | Liste]
+ SGLINE VIEW [Maske | Liste]
+ SGLINE CLEAR
+
+ Erlaubt Services Operatoren die SGLINE-Liste zu
+ bearbeiten. Versucht ein User dessen Realname auf
+ einen Eintrag in der SGLINE-Liste trifft zu verbinden,
+ werden die Services ihn die verbindung 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 Zeit lässt sich eine bestimmte
+ Auslaufzeit dieses Eintrags definieren.
+ Zeit 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 Grund
+ ein Doppelpunkt.
+
+ Das SGLINE DEL Befehl 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 Befehls 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.
+
+OPER_HELP_SQLINE
+ Syntax: SQLINE ADD [+Zeit] Maske Grund
+ SQLINE DEL {Maske | entry-num | Liste}
+ SQLINE LIST [Maske | Liste]
+ SQLINE VIEW [Maske | Liste]
+ SQLINE CLEAR
+
+ Erlaubt Services Operatoren die SQLINE Liste zu bearbeiten.
+ Falls ein User mit passendem Nicknamen sich zum Netzwerk
+ verbinden möchte, werden die Services diese Verbindung nicht
+ 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 Nicknamen mit dem Grund (muss
+ angegeben werden) zur SGLINE-Liste hinzu. ^_Zeit^_ 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 Maske und den Grund.
+
+ SQLINE CLEAR löscht alle Einträge der SQLINE Liste.
+
+OPER_HELP_SZLINE
+ Syntax: SZLINE ADD [+Zeit] Maske Grund
+ SZLINE DEL {Maske | entry-num | Liste}
+ SZLINE LIST [Maske | Liste]
+ SZLINE VIEW [Maske | Liste]
+ 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.
+
+ Der SZLINE DEL Befehl 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 Befehls 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.
+
+OPER_HELP_SET
+ Syntax: SET Option Einstellungen
+
+ Ä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 Auslauf-Modus der Services
+ an oder aus
+ SUPERADMIN Den Super-Admin Modus an oder aus
+ SQL SQL-Modus an oder aus
+ IGNORE Ignore-Modus an oder aus
+ LIST Optionen-Liste
+
+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 (löschen) 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.
+
+ Diese Option ist äquivalent mit der Befehlszeilen-
+ Option -logchan.
+
+ 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 | Nummer}
+
+ 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 Nummer angegeben, wird der Debugging
+ Level auf Nummer 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 Nicknamen, 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_SET_SQL
+ Syntax: SET SQL {ON | OFF}
+
+ Diese Einstellung wird Anope veranlassen SQL zu benutzen oder nicht.
+ Kann nützlich sein wenn zB der MySQL-Server aus ist.
+
+OPER_HELP_SET_IGNORE
+ Syntax: SET IGNORE {ON | OFF}
+
+ Mit diese Einstellung kannst du Anope's IGNORE-System
+ an oder aus machen.
+
+OPER_HELP_SET_LIST
+ Syntax: SET LIST
+
+ Zeigt dir eine Liste der verfügbaren Einstellungen von %S
+
+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.
+
+OPER_HELP_JUPE
+ Syntax: JUPE Server [Grund]
+
+ 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 Befehls
+ entfernt werden. Wird ein Grund angegeben,
+ wird dieser im Server Informationsfeld angezeigt,
+ ansonsten nur "Jupitered by <nick>".
+
+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!
+
+OPER_HELP_UPDATE
+ Syntax: UPDATE
+
+ Erzwingt die Services, sofort alle Datenbanken auf der
+ Festplatte zu aktualisieren.
+
+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.)
+
+OPER_HELP_QUIT
+ Syntax: QUIT
+
+ Zwingt die Services, sich sofort zu beenden. Die
+ Datenbanken werden dabei nicht gespeichert.
+ Dieser Befehl sollte nicht benutzt werden, ausser
+ die Datenbanken sollen wirklich nicht aktualisiert
+ werden. Für das normale Beenden der Services sollte
+ der SHUTDOWN Befehl benutzt werden.
+
+OPER_HELP_SHUTDOWN
+ Syntax: SHUTDOWN
+
+ Die Services werden durch dieses Befehl normal
+ beendet und die Datenbanken werden gespeichert.
+
+OPER_HELP_RESTART
+ Syntax: RESTART
+
+ Die Services werden sich bei diesem Befehl beenden,
+ die Datenbanken speichern, und danach neustarten
+ (die ausführbare Datei erneut aufrufen).
+
+OPER_HELP_CHANLIST
+ Syntax: CHANLIST [{Muster | Nickname} [SECRET]]
+
+ Zeigt alle Channel an, die augenblicklich benutzt werden,
+ egal ob sie registriert sind oder nicht.
+
+ Wird ein Muster 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.
+
+OPER_HELP_USERLIST
+ Syntax: USERLIST [{Muster | Channel} [INVISIBLE]]
+
+ Listet alle User auf, die gerade im IRC Netzwerk sind, egal ob
+ ihr Nicknamen registriert ist oder nicht.
+
+ Wird ein Muster 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.
+
+OPER_HELP_MODLOAD
+ Syntax: MODLOAD Modul-Name
+
+ Dieser Befehl lädt das benannte Module aus dem
+ modules - Verzeichnis.
+
+OPER_HELP_MODUNLOAD
+ Syntax: MODUNLOAD Modul-Name
+
+ Dieser Befehl entfernt das benannte Module aus dem
+ modules - Verzeichnis.
+
+OPER_HELP_MODINFO
+ Syntax: MODINFO Modul-Name
+
+ Dieser Befehl listet Informationen über das benannte, geladene
+ Module auf.
+
+OPER_HELP_MODLIST
+ Syntax: MODLIST [Core|3rd|protocol|encryption|supported|qatested]
+
+ Listet alle derzeit geladenen Module auf.
+
+###########################################################################
+#
+# BotServ help messages
+#
+###########################################################################
+
+
+BOT_HELP_CMD_BOTLIST
+ BOTLIST Zeigt alle vorhandenen Bots an
+BOT_HELP_CMD_ASSIGN
+ ASSIGN Weist einem Channel einen Bot zu
+BOT_HELP_CMD_SET
+ SET Konfiguriert die Bot-Optionen
+BOT_HELP_CMD_KICK
+ KICK Konfiguriert den Kicker (s.u.)
+BOT_HELP_CMD_BADWORDS
+ BADWORDS Verwaltet die Bad-Word-Liste
+BOT_HELP_CMD_ACT
+ ACT Veranlaßt den Bot ein "/me" Befehl ausführen
+BOT_HELP_CMD_INFO
+ INFO Erlaubt dir Informationen über ein BotServ ServicesBot zu sehen
+BOT_HELP_CMD_SAY
+ SAY Veranlaßt ein Bot ein Text in einen Channel zu sagen
+BOT_HELP_CMD_UNASSIGN
+ UNASSIGN Entfernt ein ServicesBot von einen Channel
+BOT_HELP_CMD_BOT
+ BOT Verwaltung von Bots
+
+BOT_HELP
+ %S ist dafür geschaffen, Bots in Channels
+ einzubringen. Geschaffen wurde er für User, die
+ selbst keinen Bot ausfetzen können, oder auch Netzwerke,
+ die Bots verbieten. Mögliche Befehle siehe unten,
+ die Syntax ist %R%S Befehl.
+
+ Für weitere Hilfe zu einem bestimmten Befehl
+ tippe %R%S HELP Befehl
+
+BOT_HELP_FOOTER
+ Ein Bot betritt den Channel erst, wenn sich %d User
+ in diesem Channel befinden.
+
+BOT_HELP_BOTLIST
+ Syntax: BOTLIST
+
+ Zeigt alle verfügbaren Bots des Netzwerkes.
+
+BOT_HELP_ASSIGN
+ Syntax: ASSIGN Channel Botnick
+
+ Weist einem Channel einen Bot zu. Der Botnick muss
+ jedoch existieren. Nach dieser Zuweisung können die
+ Channel-spezifischen Einstellungen des Bots angepasst
+ werden.
+
+BOT_HELP_UNASSIGN
+ Syntax: UNASSIGN Channel
+
+ Löscht die Zuweisung eines Bots zu einem Channel.
+ Dieser Befehl bewirkt, dass der Bot den Channel
+ nicht mehr betritt. Die Konfiguration des Bots für den
+ Channel bleibt jedoch erhalten, sodass der Bot dem
+ Channel wieder zugewiesen werden kann, ohne das
+ alle Einstellungen verloren gehen.
+
+BOT_HELP_INFO
+ Syntax: INFO {Channel | Botnick}
+
+ 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 Botnick ist, werden Informationen wie
+ Erstellungsdatum oder Anzahl der Channels angezeigt.
+
+BOT_HELP_SET
+ Syntax: SET (Channel | Bot) Option Parameter
+
+ Konfiguriert Optionen für einen Bot.
+ Option kann folgende Werte annehmen:
+
+ DONTKICKOPS Chan-Ops werden (nicht) vom Bot
+ gekickt.
+ DONTKICKVOICES Gevoicte User werden (nicht)
+ vom Bot gekickt.
+ GREET Begrüssungsnachricht
+ FANTASY Aktiviert Befehle wie !op !deop usw.
+ SYMBIOSIS Bot übernimmt die Aufgaben vom ChanServ
+
+ %R%S HELP SET Option um weitere Informationen
+ über einen spezifischen Befehl zu erhalten.
+
+ Achtung: Die Berechtigungsstufen für diesen Befehl
+ können variieren!
+
+BOT_HELP_SET_DONTKICKOPS
+ Syntax: SET Channel DONTKICKOPS {ON|OFF}
+
+ Aktiviert / deaktiviert die Op Protection in einem
+ Channel. Wenn diese aktiviert ist, 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 oder deaktiviert die Voice Protection
+ in einem Channel. Wenn diese aktiviert ist, werden
+ User mit voice (+v) vom Bot nicht 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, Befehle wie !op, !deop, !voice, !devoice,
+ !kick, !kb, !unban, !seen und !halfop im Channel zu
+ benutzen. Die Befehle sind selbsterklärend,
+ probiert's halt mal aus, mit oder ohne Nickname.
+
+ Hinweis: Auch hier benötigt der ausführende User
+ die Rechte, um die Befehle zu benutzen, und zwar
+ sowohl das Level um Fantasy zu nutzen, als auch
+ ein Level bzw Mode, mit dem er 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 diese Mode aktiviert ist, zeigt der Bot
+ eine Begrüssungsnachricht 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 diese Mode aktiviert ist, führt der Bot alle Aktionen aus,
+ die sonst %s übernimmt.
+ (Modechanges, Kicks, Begrüssungsnachrichten usw.)
+
+BOT_HELP_KICK
+ Syntax: KICK Channel Option Parameter
+
+ 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
+
+ %R%S HELP KICK Option um weitere
+ Informationen über einen bestimmten Befehl
+ zu erhalten.
+
+ Achtung: Die Berechtigungsstufen für diesen Befehl
+ 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 gekickt 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 gekickt 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 gekickt 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 gekickt 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 [prozente]]]
+
+ 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 prozente%%
+ 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 gekickt 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 gekickt 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 [nummer]]
+
+ Schaltet den Wiederholungs-Kicker an oder aus.Wenn
+ dieser aktiviert ist, wird ein User, der sich nummer
+ mal wiederholt, gekickt. Sollte kein nummer angegeben
+ sein, so wird 3 als Standardwert gesetzt.
+
+ ttb beschreibt wie oft der User gekickt 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 Befehl festgelegt.
+ %R%S HELP BADWORDS um weitere Informationen zu erhalten.
+
+ ttb beschreibt wie oft der User gekickt wird, bevor
+ er einen Ban bekommt. Wenn keine ttb angegeben
+ wird, wird er nie gebannt.
+
+BOT_HELP_BADWORDS
+ Syntax: BADWORDS Channel ADD Wort [SINGLE | START | END]
+ BADWORDS Channel DEL {Wort | entry-num | Liste}
+ BADWORDS Channel LIST [Maske | Liste]
+ 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: %R%S HELP KICK BADWORDS.
+
+ Der BADWORDS ADD Befehl fügt Wörter zur der
+ 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.
+
+ Der BADWORDS DEL Befehl 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).
+
+ Der BADWORDS LIST Befehl 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-Liste an.
+
+ Der BADWORDS CLEAR Befehl löscht alle Einträge aus der
+ Bad-Word-Liste.
+
+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_BOT
+ Syntax: BOT ADD Botnick User Host Realname
+ BOT CHANGE Botnick Neuer-Botnick [User [Host [Realname]]]
+ BOT DEL Botnick
+
+ Erlaubt Services Administratoren Bots zu erstellen/verändern/
+ löschen, die die User in Ihren Channeln benutzen können.
+
+ Der BOT ADD Befehl fügt einen Bot mit dem angegebenen
+ Botnick, User, Host und Realnamen hinzu.
+ Der BOT CHANGE Befehl ändert Attribute eines Bots.
+ Der BOT DEL Befehl löscht den angegebenen Bot aus der Botliste.
+
+ Achtung: Wenn ein Bot erstellt wird, dessen Nickname
+ registriert ist, wird dieser Nickname gelöscht. Falls
+ der User mit diesem Nicknamen online ist, wird dieser
+ entfernt (gekillt).
+
+BOT_SERVADMIN_HELP_SET
+
+ Diese Optionen sind nur durch Services Administratoren nutzbar:
+
+ NOBOT Mit dieser Option kann man einem Channel
+ keinen Bot zuweisen und alle aktuellen
+ Zuweisungen aufheben.
+
+ PRIVATE Verhindert das Bots von Nicht-IRC Operatoren
+ assigned werden können.
+
+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.
+
+BOT_SERVADMIN_HELP_SET_PRIVATE
+ Syntax: SET Botnick PRIVATE {ON|OFF}
+
+ Verhindert, das der Bot durch Nicht-IRC Operatoren
+ assigned werden kann.
+
+###########################################################################
+#
+# HostServ messages
+#
+###########################################################################
+HOST_EMPTY
+ Die vHost Liste ist leer.
+HOST_ENTRY
+ #%d Nickname:%s, vHost:%s (%s - %s)
+HOST_IDENT_ENTRY
+ #%d Nickname:%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 Gruppe %s wurde gesetzt: %s.
+HOST_DELALL
+ vHost für die Gruppe %s wurden gelöscht.
+HOST_DELALL_SYNTAX
+ Syntax: DELALL Nickname.
+HOST_IDENT_SETALL
+ vHost für die Gruppe %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
+ Fehler! Eine vHost-vIdent muss das Format einer gültiger Ident haben.
+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 Datenbank gefunden.
+HOST_SET_SYNTAX
+ Syntax %R%s SET Nickname Hostmaske.
+HOST_SETALL_SYNTAX
+ Syntax %R%s SETALL Nickname Hostmaske.
+HOST_DENIED
+ Zugriff verweigert.
+HOST_NOT_ASSIGNED
+ Bitte kontaktiere einen IRC Operator, um diesem Nicknamen einen vHost zuzuweisen.
+HOST_ACTIVATED
+ Dein vHost (%s) ist jetzt aktiviert.
+HOST_IDENT_ACTIVATED
+ Dein vHost (%s@%s) ist jetzt aktiviert.
+HOST_ID
+ Bitte identifiziere dich zuerst.
+HOST_NOT_REGED
+ Du musst erst deinen Nickname registrieren, um einen vHost zu erhalten.
+HOST_DEL
+ vHost für %s wurde gelöscht.
+HOST_DEL_SYNTAX
+ Syntax: %R%s DEL Nickname.
+HOST_OFF_UNREAL
+ Dein vHost wurde gelöscht. Um die normale Host-Verschlüsselung zu reaktivieren, tippe /mode %s +%s
+HOST_NO_VIDENT
+ Dein IRCd unterstützt keine vIdents. Falls das inkorrekt sein sollte, melde das bitte als einen Bug.
+HOST_GROUP
+ Alle vHosts in der Gruppe %s wurden auf %s gesetzt.
+HOST_IDENT_GROUP
+ Alle vHosts in der Gruppe %s wurden auf %s@%s gesetzt.
+HOST_LIST_FOOTER
+ Liste alle Einträge. (Count: %d)
+HOST_LIST_RANGE_FOOTER
+ Einträge von %d bis %d
+HOST_LIST_KEY_FOOTER
+ Auf das Muster %s passenden Einträge. (Count: %d)
+
+HOST_HELP_CMD_ON
+ ON Aktiviert deinen vHost
+HOST_HELP_CMD_OFF
+ OFF Deaktiviert deinen vHost
+HOST_HELP_CMD_GROUP
+ GROUP Gleicht den vHost aller Nicknamen
+ in einer Gruppe an
+
+HOST_HELP_CMD_SET
+ SET Setzt einem User einen vHost
+HOST_HELP_CMD_SETALL
+ SETALL Setzt einer Gruppe einen vHost
+HOST_HELP_CMD_DEL
+ DEL Löscht den vHost eines Users
+HOST_HELP_CMD_DELALL
+ DELALL Löscht den vHost einer Gruppe
+HOST_HELP_CMD_LIST
+ LIST Zeigt einen oder mehrere vHost Einträge an
+
+HOST_OPER_HELP
+ Nicht benutzt.
+
+HOST_ADMIN_HELP
+ Nicht benutzt.
+
+HOST_HELP
+ %S Befehle:
+
+HOST_HELP_ON
+ Syntax: ON
+
+ Aktiviert den vHost der deinem Nicknamen zugewiesen wurde.
+ Wenn du diesen Befehl benutzt, wird jeder User, der ein /whois
+ auf dich anwendet, diesen vHost anstatt deiner Host sehen.
+
+HOST_HELP_SET
+ Syntax: SET Nickname Hostmaske.
+
+ Setzt einem User einen vHost anstelle des normalen
+ Hosts. Falls dein IRCd vIdents unterstützt, kannst
+ du mit SET <nickname> <ident>@<hostmaske> auch eine Ident
+ wie einen vHost setzen.
+
+HOST_HELP_DELALL
+ Syntax: DELALL Nickname.
+
+ Löscht den vHost aller Nicknamen aus der gleichen Gruppe
+ des angegeben Nicknamens.
+
+HOST_HELP_SETALL
+ Syntax: SETALL Nickname Hostmaske.
+
+ Setzt allen Usern einer Gruppe einen vHost. Falls dein
+ IRCd vIdents unterstützt, kannst du mit
+ SETALL <nickname> <ident>@<hostmaske> eine Ident sowie
+ einen vHosts setzen.
+
+ * Anmerkung: Dieser Befehl betrifft keine Nicknamen,
+ die nachträglich zu der Gruppe hinzugefügt wurden.
+
+HOST_HELP_OFF
+ Syntax: OFF
+
+ Deaktiviert den gerade genutzten vHost eines Nicknamens.
+ Nach der Nutzung dieses Befehls wird jeder User, der
+ ein /whois auf dich anwendet, deine echte IP Adresse
+ sehen.
+
+HOST_HELP_DEL
+ Syntax: DEL Nickname
+
+ Löscht den vHost des angegebenen Nicknamens.
+
+HOST_HELP_LIST
+ Syntax: LIST [Muster|#X-Y]
+
+ Dieser Befehl listet dem Operator die registrierten vHost's.
+ Wenn ein Muster angegeben ist, werden nur die Einträge des
+ Nicknamens oder die vHost's, die dem gegeben Muster 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 Nicknamen/vHost-Einträge anzeigen.
+
+ Die Liste benutzt jedes mal den Wert von NSListMax als ein
+ festes Limit für die Anzahl der dem Operator anzuzeigenden
+ Einträge.
+
+HOST_HELP_GROUP
+ Syntax:GROUP
+
+ Dieser Befehl erlaubt es Usern, den vHost ihres aktuellen
+ Nicknamens, zum vHost der gesamten Gruppe zu setzen.
+
+OPER_SVSNICK_UNSUPPORTED
+ SVSNICK ist auf diesem Netzwerk nicht verfügbar.
+
+OPER_SQLINE_UNSUPPORTED
+ SQLINE ist auf diesem Netzwerk nicht verfügbar.
+
+OPER_SVSO_UNSUPPORTED
+ OLINE ist auf diesem Netzwerk nicht verfügbar.
+
+OPER_UMODE_UNSUPPORTED
+ UMODE ist auf diesem Netzwerk nicht verfügbar.
+
+OPER_SUPER_ADMIN_NOT_ENABLED
+ SuperAdmin muss in der services.conf eingeschaltet werden.
diff --git a/lang/en_us.l b/lang/en_us.l
new file mode 100644
index 000000000..7e2991d0a
--- /dev/null
+++ b/lang/en_us.l
@@ -0,0 +1,6516 @@
+# United States English language file.
+#
+# (C) 2003-2008 Anope Team
+# Contact us at info@anope.org
+#
+# Please read COPYING and README for further 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 us know
+# (dev@anope.org) 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
+# services.conf). 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�l (Spanish)" or "Fran�is (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. "%R%s HELP" for help.
+SYNTAX_ERROR
+ Syntax: %s
+MORE_INFO
+ %R%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.
+INVALID_TARGET
+ "/msg %s" is no longer supported. Use "/msg %s@%s" or "/%s" instead.
+
+# 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 SASET 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_TOO_LONG
+ Your password is too long. Please try again with a shorter password.
+
+NICK_NOT_REGISTERED
+ Your nick isn't registered.
+NICK_NOT_REGISTERED_HELP
+ Your nick isn't registered. Type %R%s HELP for information on registering your nickname.
+NICK_X_IS_SERVICES
+ Nick %s is part of this Network's Services.
+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.
+NICK_X_SUSPENDED
+ Nick %s is currently suspended.
+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 %R%s IDENTIFY password.
+CHAN_IDENTIFY_REQUIRED
+ Password authentication required for that command.
+ Retry after typing %R%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.
+
+# Generic List error messages
+LIST_INCORRECT_RANGE
+ Incorrect range specified. The correct syntax is #from-to.
+CS_LIST_INCORRECT_RANGE
+ To search for channels starting with #, search for the channel
+ name without the #-sign prepended (anope instead of #anope).
+
+# Generic help limited to messages
+HELP_LIMIT_SERV_OPER
+
+ Limited to Services Operators.
+HELP_LIMIT_SERV_ADMIN
+
+ Limited to Services Administrators.
+HELP_LIMIT_SERV_ROOT
+
+ Limited to Services Roots.
+HELP_LIMIT_IRC_OPER
+
+ Limited to IRC Operators.
+HELP_LIMIT_HOST_SETTER
+
+ Limited to Host Setters.
+HELP_LIMIT_HOST_REMOVER
+
+ Limited to Host Removers.
+
+
+###########################################################################
+#
+# NickServ messages
+#
+###########################################################################
+
+# Automatic messages
+NICK_IS_REGISTERED
+ This nick is owned by someone else. Please choose another.
+ (If this is your nick, type %R%s IDENTIFY password.)
+NICK_IS_SECURE
+ This nickname is registered and protected. If it is your
+ nick, type %R%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_REGISTERED_NO_MASK
+ Nickname %s registered.
+NICK_PASSWORD_IS
+ Your password is %s - remember this for later use.
+NICK_REG_DELAY
+ You must have been using this nick for at least %d seconds to register.
+
+# 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 %R%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 %R%s HELP GLIST and %R%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 %R%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_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 %R%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.
+NICK_SET_HIDE_STATUS_ON
+ Your services access status will now be hidden from %s INFO displays.
+NICK_SET_HIDE_STATUS_OFF
+ Your services access status will now be shown in %s INFO displays.
+
+# SET MSG responses
+NICK_SET_MSG_SYNTAX
+ SET MSG {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 AUTOOP responses
+NICK_SET_AUTOOP_SYNTAX
+ SET AUTOOP {ON | OFF}
+NICK_SET_AUTOOP_ON
+ Services will now autoop you in channels.
+NICK_SET_AUTOOP_OFF
+ Services will no longer autoop you in channels.
+
+
+# SASET responses
+NICK_SASET_SYNTAX
+ SASET nickname option parameters
+NICK_SASET_DISABLED
+ Sorry, nickname option setting is temporarily disabled.
+NICK_SASET_UNKNOWN_OPTION
+ Unknown SASET option %s.
+NICK_SASET_BAD_NICK
+ Nickname %s not registered.
+NICK_SASET_OPTION_DISABLED
+ Option %s cannot be set on this network.
+
+# SASET DISPLAY responses
+NICK_SASET_DISPLAY_INVALID
+ The new display for %s MUST be a nickname of the nickname group!
+NICK_SASET_DISPLAY_CHANGED
+ The new display is now %s.
+
+# SASET PASSWORD responses
+NICK_SASET_PASSWORD_FAILED
+ Sorry, couldn't change password for %s.
+NICK_SASET_PASSWORD_CHANGED
+ Password for %s changed.
+NICK_SASET_PASSWORD_CHANGED_TO
+ Password for %s changed to %s.
+
+# SASET URL responses
+NICK_SASET_URL_CHANGED
+ URL for %s changed to %s.
+NICK_SASET_URL_UNSET
+ URL %s unset.
+
+# SASET EMAIL responses
+NICK_SASET_EMAIL_CHANGED
+ E-mail address for %s changed to %s.
+NICK_SASET_EMAIL_UNSET
+ E-mail address for %s unset.
+NICK_SASET_EMAIL_UNSET_IMPOSSIBLE
+ You cannot unset the e-mail on this network.
+
+# SASET ICQ responses
+NICK_SASET_ICQ_CHANGED
+ ICQ number for %s set to %s.
+NICK_SASET_ICQ_UNSET
+ ICQ number for %s unset.
+NICK_SASET_ICQ_INVALID
+ %s is not a valid number.
+
+# SASET GREET responses
+NICK_SASET_GREET_CHANGED
+ Greet message for %s changed to %s.
+NICK_SASET_GREET_UNSET
+ Greet message for %s unset.
+
+# SASET PROTECT responses
+NICK_SASET_KILL_SYNTAX
+ SASET nickname KILL {ON | QUICK | OFF}
+NICK_SASET_KILL_IMMED_SYNTAX
+ SASET nickname KILL {ON | QUICK | IMMED | OFF}
+NICK_SASET_KILL_ON
+ Protection is now ON for %s.
+NICK_SASET_KILL_QUICK
+ Protection is now ON for %s, with a reduced delay.
+NICK_SASET_KILL_IMMED
+ Protection is now ON for %s, with no delay.
+NICK_SASET_KILL_IMMED_DISABLED
+ The IMMED option is not available on this network.
+NICK_SASET_KILL_OFF
+ Protection is now OFF for %s.
+
+# SASET SECURE responses
+NICK_SASET_SECURE_SYNTAX
+ SASET nickname SECURE {ON | OFF}
+NICK_SASET_SECURE_ON
+ Secure option is now ON for %s.
+NICK_SASET_SECURE_OFF
+ Secure option is now OFF for %s.
+
+# SASET PRIVATE responses
+NICK_SASET_PRIVATE_SYNTAX
+ SASET nickname PRIVATE {ON | OFF}
+NICK_SASET_PRIVATE_ON
+ Private option is now ON for %s.
+NICK_SASET_PRIVATE_OFF
+ Private option is now OFF for %s.
+
+# SASET HIDE responses
+NICK_SASET_HIDE_SYNTAX
+ SASET nickname HIDE {EMAIL | USERMASK | QUIT} {ON | OFF}
+NICK_SASET_HIDE_EMAIL_ON
+ The E-mail address of %s will now be hidden from %s INFO displays.
+NICK_SASET_HIDE_EMAIL_OFF
+ The E-mail address of %s will now be shown in %s INFO displays.
+NICK_SASET_HIDE_MASK_ON
+ The last seen user@host mask of %s will now be hidden from %s INFO displays.
+NICK_SASET_HIDE_MASK_OFF
+ The last seen user@host mask of %s will now be shown in %s INFO displays.
+NICK_SASET_HIDE_QUIT_ON
+ The last quit message of %s will now be hidden from %s INFO displays.
+NICK_SASET_HIDE_QUIT_OFF
+ The last quit message of %s will now be shown in %s INFO displays.
+NICK_SASET_HIDE_STATUS_ON
+ The services access status of %s will now be hidden from %s INFO displays.
+NICK_SASET_HIDE_STATUS_OFF
+ The services access status of %s will now be shown in %s INFO displays.
+
+# SASET MSG responses
+NICK_SASET_MSG_SYNTAX
+ SASAET nickname PRIVATE {ON | OFF}
+NICK_SASET_MSG_ON
+ Services will now reply to %s with messages.
+NICK_SASET_MSG_OFF
+ Services will now reply to %s with notices.
+
+# SASET NOEXPIRE responses
+NICK_SASET_NOEXPIRE_SYNTAX
+ SASET nickname NOEXPIRE {ON | OFF}
+NICK_SASET_NOEXPIRE_ON
+ Nick %s will not expire.
+NICK_SASET_NOEXPIRE_OFF
+ Nick %s will expire.
+
+# SASET AUTOOP responses
+NICK_SASET_AUTOOP_SYNTAX
+ SASET nickname AUTOOP {ON | OFF}
+NICK_SASET_AUTOOP_ON
+ Services will now autoop %s in channels.
+NICK_SASET_AUTOOP_OFF
+ Services will no longer autoop %s in channels.
+
+# SASET LANGUAGE responses
+NICK_SASET_LANGUAGE_SYNTAX
+ SASET nickname LANGUAGE number
+NICK_SASET_LANGUAGE_UNKNOWN
+ Unknown language number %d. Type %R%s HELP SET LANGUAGE for a list of languages.
+NICK_SASET_LANGUAGE_CHANGED
+ Language changed to English.
+
+
+# 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:
+NICK_ACCESS_LIST_EMPTY
+ Your access list is empty.
+NICK_ACCESS_LIST_X_EMPTY
+ Access list for %s is empty.
+
+# Status messages
+NICK_STATUS_0
+ STATUS %s 0
+NICK_STATUS_1
+ STATUS %s 1
+NICK_STATUS_2
+ STATUS %s 2
+NICK_STATUS_3
+ STATUS %s 3
+
+# 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_SERVICES_ROOT
+ %s is a services root administrator.
+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_VHOST2
+ vhost: %s@%s
+NICK_INFO_ICQ
+ ICQ #: %d
+NICK_INFO_GREET
+ Greet message: %s
+NICK_INFO_OPTIONS
+ Options: %s
+NICK_INFO_EXPIRE
+ Expires on: %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_AUTOOP
+ Auto-op
+NICK_INFO_OPT_NONE
+ None
+NICK_INFO_NO_EXPIRE
+ This nickname will not expire.
+NICK_INFO_FOR_MORE
+ For more verbose information, type %R%s INFO %s ALL.
+NICK_INFO_SUSPENDED
+ This nickname is currently suspended, reason: %s
+NICK_INFO_SUSPENDED_NO_REASON
+ This nickname is currently suspended
+
+# LIST responses
+NICK_LIST_SYNTAX
+ LIST pattern
+NICK_LIST_SERVADMIN_SYNTAX
+ LIST pattern [FORBIDDEN] [SUSPENDED] [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.
+NICK_GLIST_REPLY
+ %c%s
+NICK_GLIST_REPLY_ADMIN
+ %c%s (expires in %s)
+
+# 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.
+ %R%s RELEASE %s to get it back before %s 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.
+
+# SUSPEND responses
+NICK_SUSPEND_SYNTAX
+ SUSPEND nickname reason
+NICK_SUSPEND_SUCCEEDED
+ Nick %s is now suspended.
+NICK_SUSPEND_FAILED
+ Couldn't suspend nick %s!
+
+# UNSUSPEND responses
+NICK_UNSUSPEND_SYNTAX
+ UNSUSPEND nickname
+NICK_UNSUSPEND_SUCCEEDED
+ Nick %s is now released.
+NICK_UNSUSPEND_FAILED
+ Couldn't release nick %s!
+
+# 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 %R%s confirm <passcode> to complete registration
+NICK_CONFIRM_NOT_FOUND
+ Registration step 1 may have expired, please use "%R%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 " %R%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
+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.
+CHAN_X_INVALID
+ Channel %s is not a valid 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 %R%s HELP for information on registering nicknames.
+CHAN_MUST_IDENTIFY_NICK
+ Please identify with %s first, using the command:
+ %R%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.
+CHAN_REGISTER_NONE_CHANNEL
+ You have attempted to register a nonexistent channel %s
+CHAN_SYMBOL_REQUIRED
+ Please use the symbol of # when attempting to register
+
+
+# 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 (except the channel founder).
+CHAN_LOGOUT_FOUNDER_FAILED
+ You may not log out of %s (you are founder).
+
+# 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 for %s is now ON.
+CHAN_SET_KEEPTOPIC_OFF
+ Topic retention option for %s is now OFF.
+
+# SET TOPICLOCK responses
+CHAN_SET_TOPICLOCK_SYNTAX
+ SET channel TOPICLOCK {ON | OFF}
+CHAN_SET_TOPICLOCK_ON
+ Topic lock option for %s is now ON.
+CHAN_SET_TOPICLOCK_OFF
+ Topic lock option for %s is now OFF.
+
+# SET PEACE responses
+CHAN_SET_PEACE_SYNTAX
+ SET channel PEACE {ON | OFF}
+CHAN_SET_PEACE_ON
+ Peace option for %s is now ON.
+CHAN_SET_PEACE_OFF
+ Peace option for %s is now OFF.
+
+# SET PRIVATE responses
+CHAN_SET_PRIVATE_SYNTAX
+ SET channel PRIVATE {ON | OFF}
+CHAN_SET_PRIVATE_ON
+ Private option for %s is now ON.
+CHAN_SET_PRIVATE_OFF
+ Private option for %s is now OFF.
+
+# SET SECUREOPS responses
+CHAN_SET_SECUREOPS_SYNTAX
+ SET channel SECUREOPS {ON | OFF}
+CHAN_SET_SECUREOPS_ON
+ Secure ops option for %s is now ON.
+CHAN_SET_SECUREOPS_OFF
+ Secure ops option for %s is now OFF.
+
+# SET SECUREFOUNDER responses
+CHAN_SET_SECUREFOUNDER_SYNTAX
+ SET channel SECUREFOUNDER {ON | OFF}
+CHAN_SET_SECUREFOUNDER_ON
+ Secure founder option for %s is now ON.
+CHAN_SET_SECUREFOUNDER_OFF
+ Secure founder option for %s is now OFF.
+
+# SET RESTRICTED responses
+CHAN_SET_RESTRICTED_SYNTAX
+ SET channel RESTRICTED {ON | OFF}
+CHAN_SET_RESTRICTED_ON
+ Restricted access option for %s is now ON.
+CHAN_SET_RESTRICTED_OFF
+ Restricted access option for %s is now OFF.
+
+# SET SECURE responses
+CHAN_SET_SECURE_SYNTAX
+ SET channel SECURE {ON | OFF}
+CHAN_SET_SECURE_ON
+ Secure option for %s is now ON.
+CHAN_SET_SECURE_OFF
+ Secure option for %s is now OFF.
+
+# SET SIGNKICK responses
+CHAN_SET_SIGNKICK_SYNTAX
+ SET channel SIGNKICK {ON | LEVEL | OFF}
+CHAN_SET_SIGNKICK_ON
+ Signed kick option for %s is now ON.
+CHAN_SET_SIGNKICK_LEVEL
+ Signed kick option for %s is now ON, but depends of the
+ level of the user that is using the command.
+CHAN_SET_SIGNKICK_OFF
+ Signed kick option for %s is now OFF.
+
+# SET OPNOTICE responses
+CHAN_SET_OPNOTICE_SYNTAX
+ SET channel OPNOTICE {ON | OFF}
+CHAN_SET_OPNOTICE_ON
+ Op-notice option for %s is now ON.
+CHAN_SET_OPNOTICE_OFF
+ Op-notice option for %s is now OFF.
+
+# SET XOP responses
+CHAN_SET_XOP_SYNTAX
+ SET channel XOP {ON | OFF}
+CHAN_SET_XOP_ON
+ xOP lists system for %s is now ON.
+CHAN_SET_XOP_OFF
+ xOP lists system for %s 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 %R%s HELP ACCESS for more information.
+CHAN_XOP_NOT_AVAILABLE
+ xOP system is not available.
+
+# 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 %s 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 %s 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 %s 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 %s 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 %R%s HELP command for more information.
+CHAN_ACCESS_XOP_HOP
+ You can't use this command.
+ Use the AOP, SOP, HOP and VOP commands instead.
+ Type %R%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 %s 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 %s akick list has been cleared.
+
+# LEVELS responses
+CHAN_LEVELS_SYNTAX
+ LEVELS channel {SET | DIS[ABLE] | LIST | RESET} [item [level]]
+CHAN_LEVELS_XOP
+ Levels are not available as xOP is enabled on this channel.
+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 %R%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.
+
+# Status Messages
+CHAN_STATUS_SYNTAX
+ STATUS ERROR Syntax error
+CHAN_STATUS_NOT_REGGED
+ STATUS ERROR Channel %s not registered
+CHAN_STATUS_FORBIDDEN
+ STATUS ERROR Channel %s forbidden
+CHAN_STATUS_NOTONLINE
+ STATUS ERROR Nick %s not online
+CHAN_STATUS_INFO
+ STATUS %s %s %d
+
+# 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_EXPIRE
+ Expires on: %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_HOPS
+ Mode +h 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.
+CHAN_CLEARED_INVITES
+ All invites on channel %s have been removed.
+
+# 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.
+
+# GETKEY responses
+CHAN_GETKEY_SYNTAX
+ GETKEY channel
+CHAN_GETKEY_NOKEY
+ The channel %s has no key.
+CHAN_GETKEY_KEY
+ KEY %s %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 %R%s READ LAST to read it.
+MEMO_TYPE_READ_NUM
+ Type %R%s READ %d to read it.
+MEMO_TYPE_LIST_NEW
+ Type %R%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 %R%s READ %s %d to read it.
+MEMO_NEW_MEMO_ARRIVED
+ You have a new memo from %s.
+ Type %R%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 canceling is temporarily disabled.
+MEMO_CANCEL_NONE
+ No memo was cancelable.
+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: %R%s READ num
+MEMO_LIST_NEW_MEMOS
+ New memos for %s. To read, type: %R%s READ num
+MEMO_LIST_CHAN_MEMOS
+ Memos for %s. To read, type: %R%s READ %s num
+MEMO_LIST_CHAN_NEW_MEMOS
+ New memos for %s. To read, type: %R%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: %R%s DEL %d
+MEMO_CHAN_HEADER
+ Memo %d from %s (%s). To delete, type: %R%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 | MAIL | 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.
+MEMO_SET_NOTIFY_MAIL
+ You will now be informed about new memos via email.
+MEMO_SET_NOTIFY_NOMAIL
+ You will no longer be informed via email.
+MEMO_SET_NOTIFY_INVALIDMAIL
+ There's no email address set for your nick.
+
+# 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.
+
+# Memo2Mail responses
+MEMO_MAIL_SUBJECT
+ New memo
+MEMO_MAIL_TEXT1
+ Hi %s
+MEMO_MAIL_TEXT2
+ You've just received a new memo from %s. This is memo number %d.
+MEMO_MAIL_TEXT3
+ Memo Text:
+
+# RSEND responses
+MEMO_RSEND_PLEASE_WAIT
+ Please wait %d seconds before using the RSEND command again.
+MEMO_RSEND_DISABLED
+ Sorry, RSEND has been disabled on this network.
+MEMO_RSEND_SYNTAX
+ RSEND {nick | channel} memo-text
+MEMO_RSEND_NICK_MEMO_TEXT
+ [auto-memo] The memo you sent has been viewed.
+MEMO_RSEND_CHAN_MEMO_TEXT
+ [auto-memo] The memo you sent to %s has been viewed.
+MEMO_RSEND_USER_NOTIFICATION
+ A notification memo has been sent to %s informing him/her you have
+ read his/her memo.
+
+# CHECK responses
+MEMO_CHECK_SYNTAX
+ CHECK nickname
+MEMO_CHECK_NOT_READ
+ The last memo you sent to %s (sent on %s) has not yet been read.
+MEMO_CHECK_READ
+ The last memo you sent to %s (sent on %s) has been read.
+MEMO_CHECK_NO_MEMO
+ Nick %s doesn't have a memo from you.
+MEMO_NO_RSEND_SELF
+ You can not request a receipt when sending a memo to yourself.
+
+###########################################################################
+#
+# 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 %R%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 the 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_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 | bot) option settings
+BOT_SET_DISABLED
+ Sorry, bot option setting is temporarily disabled.
+BOT_SET_UNKNOWN
+ Unknown option %s.
+ Type %R%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 %R%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.
+BOT_LONG_IDENT
+ Bot Idents may only contain %d characters.
+BOT_LONG_HOST
+ Bot Hosts may only contain %d 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_HOSTSERV_MEM
+ HostServ : %6d records, %5d kB
+OPER_STATS_OPERSERV_MEM
+ OperServ : %6d records, %5d kB
+OPER_STATS_SESSIONS_MEM
+ Sessions : %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.
+OPER_STATS_UPLINK_SERVER
+ Uplink server: %s
+OPER_STATS_UPLINK_CAPAB
+ Uplink capab: %s
+OPER_STATS_UPLINK_SERVER_COUNT
+ Servers found: %d
+
+# 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_ADMIN_MOVED
+ %s has been moved to Services Administrators list.
+
+# 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.
+OPER_OPER_MOVED
+ %s has been moved to Services Operators list.
+
+# 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
+ CHANKILL [+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 are now in read-only mode.
+OPER_SET_READONLY_OFF
+ Services are now in read-write mode.
+OPER_SET_READONLY_ERROR
+ Setting for READONLY must be ON or OFF.
+OPER_SET_LOGCHAN_ON
+ Services are now reporting log messages to %s.
+OPER_SET_LOGCHAN_OFF
+ Services are 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 are now in debug mode.
+OPER_SET_DEBUG_OFF
+ Services are now in non-debug mode.
+OPER_SET_DEBUG_LEVEL
+ Services are 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 are now in no expire mode.
+OPER_SET_NOEXPIRE_OFF
+ Services are now in expire mode.
+OPER_SET_NOEXPIRE_ERROR
+ Setting for NOEXPIRE must be ON or OFF.
+OPER_SET_UNKNOWN_OPTION
+ Unknown option %s.
+OPER_SET_SQL_ON
+ SQL code will be used.
+OPER_SET_SQL_OFF
+ SQL code will not be used.
+OPER_SET_SQL_ERROR
+ Setting for SQL must be ON or OFF.
+OPER_SET_SQL_ERROR_INIT
+ Error during init of SQL, check your logs to correct.
+OPER_SET_SQL_ERROR_DISABLED
+ SQL is not configured for this network. Please edit the
+ configuration file (services.conf).
+OPER_SET_LIST_OPTION_ON
+ %s is enabled
+OPER_SET_LIST_OPTION_OFF
+ %s is disabled
+
+# 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 | mask]
+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
+ 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.
+
+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_NO_UNLOAD
+ This module can not be unloaded.
+OPER_MODULE_LOAD_SYNTAX
+ MODLOAD FileName
+OPER_MODULE_UNLOAD_SYNTAX
+ MODUNLOAD FileName
+OPER_MODULE_LIST_HEADER
+ Current Module list:
+OPER_MODULE_LIST
+ Module: %s [%s] [%s]
+OPER_MODULE_LIST_FOOTER
+ %d Modules loaded.
+OPER_MODULE_INFO_LIST
+ Module: %s Version: %s Author: %s loaded: %s
+OPER_MODULE_CMD_LIST
+ Providing command: %R%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.
+OPER_EXCEPTION_EXISTS
+ %s already exists on the EXCEPTION list.
+OPER_EXCEPTION_CHANGED
+ Exception for %s has been updated to %d.
+
+# 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 at least %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.
+
+OPER_HELP_SESSION
+ Syntax: SESSION LIST threshold
+ SESSION VIEW host
+
+ Allows Services admins to view the session list.
+
+ SESSION LIST lists hosts with at least 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.
+
+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 attempted
+ 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 %s messages will be
+ sent in order to avoid flooding the user. If there are
+ more news messages, only the most recent will be sent.)
+ NewsCount can be configured in services.conf.
+
+ 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 %s messages will
+ be sent in order to avoid flooding the user. If there are
+ more news messages, only the most recent will be sent.)
+ NewsCount can be configured in services.conf.
+
+ 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:
+
+ %R%s HELP
+ for information on registering nicknames
+
+ %R%s HELP
+ for information on registering and controlling
+ channels
+
+ %R%s HELP
+ for information on sending messages to off-line users
+
+HELP_HELP_BOT
+
+ %R%s HELP
+ for information on setting up a bot on your channel
+
+HELP_HELP_HOST
+
+ %R%s HELP
+ for information on setting up nick vHosts
+
+###########################################################################
+#
+# NickServ help messages
+#
+###########################################################################
+
+NICK_HELP_CMD_CONFIRM
+ CONFIRM Confirm a nickserv auth code
+NICK_HELP_CMD_RESEND
+ RESEND Resend a nickserv auth code
+NICK_HELP_CMD_REGISTER
+ REGISTER Register a nickname
+NICK_HELP_CMD_GROUP
+ GROUP Join a group
+NICK_HELP_CMD_IDENTIFY
+ IDENTIFY Identify yourself with your password
+NICK_HELP_CMD_ACCESS
+ ACCESS Modify the list of authorized addresses
+NICK_HELP_CMD_SET
+ SET Set options, including kill protection
+NICK_HELP_CMD_SASET
+ SASET Set SET-options on another nickname
+NICK_HELP_CMD_DROP
+ DROP Cancel the registration of a nickname
+NICK_HELP_CMD_RECOVER
+ RECOVER Kill another user who has taken your nick
+NICK_HELP_CMD_RELEASE
+ RELEASE Regain custody of your nick after RECOVER
+NICK_HELP_CMD_SENDPASS
+ SENDPASS Forgot your password? Try this
+NICK_HELP_CMD_GHOST
+ GHOST Disconnects a "ghost" IRC session using your nick
+NICK_HELP_CMD_ALIST
+ ALIST List channels you have access on
+NICK_HELP_CMD_GLIST
+ GLIST Lists all nicknames in your group
+NICK_HELP_CMD_INFO
+ INFO Displays information about a given nickname
+NICK_HELP_CMD_LIST
+ LIST List all registered nicknames that match a given pattern
+NICK_HELP_CMD_LOGOUT
+ LOGOUT Reverses the effect of the IDENTIFY command
+NICK_HELP_CMD_STATUS
+ STATUS Returns the owner status of the given nickname
+NICK_HELP_CMD_UPDATE
+ UPDATE Updates your current status, i.e. it checks for new memos
+NICK_HELP_CMD_GETPASS
+ GETPASS Retrieve the password for a nickname
+NICK_HELP_CMD_GETEMAIL
+ GETEMAIL Matches and returns all users that registered using given email
+NICK_HELP_CMD_FORBID
+ FORBID Prevents a nickname from being registered
+NICK_HELP_CMD_SUSPEND
+ SUSPEND Suspend a given nick
+NICK_HELP_CMD_UNSUSPEND
+ UNSUSPEND Unsuspend a given nick
+
+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 %R%S command.
+ For more information on a specific command, type
+ %R%S HELP command.
+
+
+NICK_HELP_FOOTER
+
+ 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 %R%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 privileges 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
+ %R%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 (%R%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
+ %R%S LIST
+ HIDE Hide certain pieces of nickname information
+ MSG Change the communication method of Services
+ AUTOOP Should services op you automatically.
+
+ In order to use this command, you must first identify
+ with your password (%R%S HELP IDENTIFY for more
+ information).
+
+ Type %R%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 nickname 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 | STATUS | 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), your services access status
+ (STATUS) 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_SET_AUTOOP
+ Syntax: SET AUTOOP {ON | OFF}
+
+ Sets whether you will be opped automatically. Set to ON to
+ allow ChanServ to op you automatically when entering channels.
+
+NICK_HELP_SASET
+ Syntax: SASET nickname option parameters.
+
+ Sets various nickname options. option can be one of:
+
+ DISPLAY Set the display of the group in Services
+ PASSWORD Set the nickname password
+ URL Associate a URL with the nickname
+ EMAIL Associate an E-mail address with the nickname
+ ICQ Associate an ICQ number with the nickname
+ GREET Associate a greet message with the nickname
+ KILL Turn protection on or off
+ SECURE Turn nickname security on or off
+ PRIVATE Prevent the nickname from appearing in a
+ %R%S LIST
+ HIDE Hide certain pieces of nickname information
+ MSG Change the communication method of Services
+ NOEXPIRE Prevent the nickname from expiring
+ AUTOOP Turn autoop on or off
+ LANGUAGE Set the language Services will use when
+ sending messages to nickname
+
+ Type %R%S HELP SASET option for more information
+ on a specific option. The options will be set on the given
+ nickname.
+
+NICK_HELP_SASET_DISPLAY
+ Syntax: SASET nickname DISPLAY new-display
+
+ Changes the display used to refer to the nickname group in
+ Services. The new display MUST be a nick of the group.
+
+NICK_HELP_SASET_PASSWORD
+ Syntax: SASET nickname PASSWORD new-password
+
+ Changes the password used to identify as the nick's owner.
+
+NICK_HELP_SASET_URL
+ Syntax: SASET nickname URL url
+
+ Associates the given URL with the nickname. This URL
+ will be displayed whenever someone requests information
+ on the nick with the INFO command.
+
+NICK_HELP_SASET_EMAIL
+ Syntax: SASET nickname EMAIL address
+
+ Associates the given E-mail address with the nickname.
+
+NICK_HELP_SASET_ICQ
+ Syntax: SASET nickname ICQ number
+
+ Associates the given ICQ number with the nickname. This
+ number will be displayed whenever someone requests
+ information on the nick with the INFO command.
+
+NICK_HELP_SASET_GREET
+ Syntax: SASET nickname GREET message
+
+ Makes the given message the greet of the nickname, that
+ will be displayed when joining a channel that has GREET
+ option enabled, provided that the user has the necessary
+ access on it.
+
+NICK_HELP_SASET_KILL
+ Syntax: SASET nickname KILL {ON | QUICK | IMMED | OFF}
+
+ Turns the automatic protection option for the nick
+ on or off. With protection on, if another user
+ tries to take the 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_SASET_SECURE
+ Syntax: SASET nickname 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_SASET_PRIVATE
+ Syntax: SASET nickname PRIVATE {ON | OFF}
+
+ Turns %S's privacy option on or off for the nick.
+ With PRIVATE set, the nickname will not appear in
+ nickname lists generated with %S's LIST command.
+ (However, anyone who knows the nickname can still get
+ information on it using the INFO command.)
+
+NICK_HELP_SASET_HIDE
+ Syntax: SASET nickname HIDE {EMAIL | STATUS | USERMASK | QUIT} {ON | OFF}
+
+ Allows you to prevent certain pieces of information from
+ being displayed when someone does a %S INFO on the
+ nick. You can hide the E-mail address (EMAIL), last seen
+ user@host mask (USERMASK), the services access status
+ (STATUS) and last quit message (QUIT).
+ The second parameter specifies whether the information should
+ be displayed (OFF) or hidden (ON).
+
+NICK_HELP_SASET_MSG
+ Syntax: SASET nickname MSG {ON | OFF}
+
+ Allows you to choose the way Services are communicating with
+ the given user. With MSG set, Services will use messages,
+ else they'll use notices.
+
+NICK_HELP_SASET_NOEXPIRE
+ Syntax: SASET nickname NOEXPIRE {ON | OFF}
+
+ Sets whether the given nickname will expire. Setting this
+ to ON prevents the nickname from expiring.
+
+NICK_HELP_SASET_AUTOOP
+ Syntax: SASET nickname AUTOOP {ON | OFF}
+
+ Sets whether the given nickname will be opped automatically.
+ Set to ON to allow ChanServ to op the given nickname
+ automatically when joining channels.
+
+NICK_HELP_SASET_LANGUAGE
+ Syntax: SASET nickname LANGUAGE number
+
+ Changes the language Services uses when sending messages to
+ nickname (for example, when responding to a command he sends).
+ number should be chosen from a list of supported languages
+ that you can get by typing %R%S HELP SET LANGUAGE.
+
+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
+ remain online for %s to ensure that the other
+ user does not immediately reconnect; after that time, you
+ can reclaim your nick. Alternatively, use the RELEASE
+ command (%R%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. This holds lasts for %s;
+ 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. If no nickname is given, your status
+ will be returned.
+
+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_HELP_CONFIRM
+ Syntax: CONFIRM passcode
+
+ This is the second step of nickname registration process.
+ You must perform this command in order to get your nickname
+ registered with %S. The passcode (or called auth code also)
+ is sent to your e-mail address in the first step of the
+ registration process. For more information about the first
+ stage of the registration process, type: %R%S HELP REGISTER
+
+NICK_HELP_RESEND
+ Syntax: RESEND
+
+ This command will re-send the auth code (also called passcode)
+ to the e-mail address of the user whom is performing it.
+
+NICK_SERVADMIN_HELP
+
+ Services admins can also drop any nickname without needing
+ to identify for the nick, and may view the access list for
+ any nickname (%R%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_INFO
+
+ Services admins may use the ALL parameter with any nick.
+
+NICK_SERVADMIN_HELP_LIST
+ Syntax: LIST pattern [FORBIDDEN] [SUSPENDED] [NOEXPIRE] [UNCONFIRMED]
+
+ 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 ! appended to
+ the nickname for Services admins.
+
+ If the FORBIDDEN, SUSPENDED, NOEXPIRE or UNCONFIRMED options are given, only
+ nicks which, respectively, are FORBIDDEN, SUSPENDED, UNCONFIRMED or have the
+ NOEXPIRE flag set will be displayed. If multiple options are
+ given, all nicks matching at least one option 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.
+
+ 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.
+
+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.
+
+NICK_SERVADMIN_HELP_SUSPEND
+ Syntax: SUSPEND nickname reason
+
+ SUSPENDs a nickname from being used.
+
+NICK_SERVADMIN_HELP_UNSUSPEND
+ Syntax: UNSUSPEND nickname
+
+ UNSUSPENDS a nickname from being used.
+
+###########################################################################
+#
+# ChanServ help messages
+#
+###########################################################################
+
+CHAN_HELP_CMD_GETPASS
+ GETPASS Retrieve the founder password for a channel
+CHAN_HELP_CMD_FORBID
+ FORBID Prevent a channel from being used
+CHAN_HELP_CMD_SUSPEND
+ SUSPEND Prevent a channel from being used preserving
+ channel data and settings
+CHAN_HELP_CMD_UNSUSPEND
+ UNSUSPEND Releases a suspended channel
+CHAN_HELP_CMD_STATUS
+ STATUS Returns the current access level of a user
+ on a channel
+CHAN_HELP_CMD_REGISTER
+ REGISTER Register a channel
+CHAN_HELP_CMD_IDENTIFY
+ IDENTIFY Identify yourself with your password
+CHAN_HELP_CMD_SET
+ SET Set channel options and information
+CHAN_HELP_CMD_AOP
+ AOP Modify the list of AOP users
+CHAN_HELP_CMD_SOP
+ SOP Modify the list of SOP users
+CHAN_HELP_CMD_ACCESS
+ ACCESS Modify the list of privileged users
+CHAN_HELP_CMD_LEVELS
+ LEVELS Redefine the meanings of access levels
+CHAN_HELP_CMD_AKICK
+ AKICK Maintain the AutoKick list
+CHAN_HELP_CMD_DROP
+ DROP Cancel the registration of a channel
+CHAN_HELP_CMD_SENDPASS
+ SENDPASS Help retrieve lost passwords
+CHAN_HELP_CMD_BAN
+ BAN Bans a selected nick on a channel
+CHAN_HELP_CMD_CLEAR
+ CLEAR Tells ChanServ to clear certain settings on a channel
+CHAN_HELP_CMD_DEVOICE
+ DEVOICE Devoices a selected nick on a channel
+CHAN_HELP_CMD_GETKEY
+ GETKEY Returns the key of the given channel
+CHAN_HELP_CMD_INFO
+ INFO Lists information about the named registered channel
+CHAN_HELP_CMD_INVITE
+ INVITE Tells ChanServ to invite you or a given nick into a channel
+CHAN_HELP_CMD_KICK
+ KICK Kicks a selected nick from a channel
+CHAN_HELP_CMD_LIST
+ LIST Lists all registered channels matching the given pattern
+CHAN_HELP_CMD_LOGOUT
+ LOGOUT This command will logout the selected nickname
+CHAN_HELP_CMD_OP
+ OP Gives Op status to a selected nick on a channel
+CHAN_HELP_CMD_TOPIC
+ TOPIC Manipulate the topic of the specified channel
+CHAN_HELP_CMD_UNBAN
+ UNBAN Remove all bans preventing you from entering a channel
+CHAN_HELP_CMD_VOICE
+ VOICE Voices a selected nick on a channel
+CHAN_HELP_CMD_VOP
+ VOP Maintains the VOP (VOicePeople) list for a channel
+CHAN_HELP_CMD_DEHALFOP
+ DEHALFOP Dehalfops a selected nick on a channel
+CHAN_HELP_CMD_DEOWNER
+ DEOWNER Removes your owner status on a channel
+CHAN_HELP_CMD_DEPROTECT
+ DEPROTECT Deprotects a selected nick on a channel
+CHAN_HELP_CMD_HALFOP
+ HALFOP Halfops a selected nick on a channel
+CHAN_HELP_CMD_HOP
+ HOP Maintains the HOP (HalfOP) list for a channel
+CHAN_HELP_CMD_OWNER
+ OWNER Gives you owner status on channel
+CHAN_HELP_CMD_PROTECT
+ PROTECT Protects a selected nick on a channel
+CHAN_HELP_CMD_ADMIN
+ ADMIN Protects a selected nick on a channel
+CHAN_HELP_CMD_DEADMIN
+ DEADMIN Deprotects a selected nick on a channel
+CHAN_HELP_CMD_DEOP
+ DEOP Deops a selected nick on a channel
+
+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 privileges. Available
+ commands are listed below; to use them, type
+ %R%S command. For more information on a
+ specific command, type %R%S HELP command.
+
+
+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 (%R%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,
+ %R%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 %R%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 %R%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 %R%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
+ %R%S HELP ACCESS for information about the access list,
+ and %R%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
+ %R%S HELP ACCESS for information about the access list,
+ and %R%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
+ %R%S HELP ACCESS for information about the access list,
+ and %R%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
+ %R%S HELP ACCESS for information about the access list,
+ and %R%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; %R%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 %R%S HELP LEVELS for
+ information.
+
+CHAN_HELP_AKICK
+ Syntax: AKICK channel ADD {nick | mask} [reason]
+ AKICK channel STICK mask
+ AKICK channel UNSTICK mask
+ AKICK channel DEL {nick | mask | entry-num | list}
+ AKICK channel LIST [mask | entry-num | list]
+ AKICK channel VIEW [mask | entry-num | list]
+ 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".
+ When akicking a registered nick the nickserv account
+ will be added to the akick list instead of the mask.
+ All users within that nickgroup will then be akicked.
+
+ 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.)
+ Note that a preceding '#' specifies a range, channel names
+ are to be written without '#'.
+
+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 %R%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.
+ HOPS Removes channel-halfoperator status (mode +h) from
+ all channel halfoperators, if supported.
+ 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
+
+ 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.
+
+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 ! appended 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 multiple options are
+ given, more 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.
+
+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.
+
+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.
+
+CHAN_SERVADMIN_HELP_UNSUSPEND
+ Syntax: UNSUSPEND channel
+
+ Releases a suspended channel. All data and settings
+ are preserved from before the suspension.
+
+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
+
+###########################################################################
+#
+# MemoServ help messages
+#
+###########################################################################
+
+MEMO_HELP_CMD_SEND
+ SEND Send a memo to a nick or channel
+MEMO_HELP_CMD_CANCEL
+ CANCEL Cancel last memo you sent
+MEMO_HELP_CMD_LIST
+ LIST List your memos
+MEMO_HELP_CMD_READ
+ READ Read a memo or memos
+MEMO_HELP_CMD_DEL
+ DEL Delete a memo or memos
+MEMO_HELP_CMD_SET
+ SET Set options related to memos
+MEMO_HELP_CMD_INFO
+ INFO Displays information about your memos
+MEMO_HELP_CMD_RSEND
+ RSEND Sends a memo and requests a read receipt
+MEMO_HELP_CMD_CHECK
+ CHECK Checks if last memo to a nick was read
+MEMO_HELP_CMD_SENDALL
+ SENDALL Send a memo to all registered users
+MEMO_HELP_CMD_STAFF
+ STAFF Send a memo to all opers/admins
+
+MEMO_HELP_HEADER
+ %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:
+
+
+MEMO_HELP_ADMIN
+ not used.
+MEMO_HELP_OPER
+ not used.
+
+MEMO_HELP_FOOTER
+
+ Type %R%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 %R%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 receive 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.
+
+MEMO_HELP_RSEND
+ Syntax: RSEND {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.
+ Once the memo is read by its recipient, an automatic notification
+ memo will be sent to the sender informing him/her that the memo
+ has been read.
+
+MEMO_HELP_CHECK
+ Syntax: CHECK nick
+
+ Checks whether the _last_ memo you sent to nick has been read
+ or not. Note that this does only work with nicks, not with chans.
+
+###########################################################################
+#
+# OperServ help messages
+#
+###########################################################################
+OPER_HELP_CMD_GLOBAL
+ GLOBAL Send a message to all users
+OPER_HELP_CMD_STATS
+ STATS Show status of Services and network
+OPER_HELP_CMD_OPER
+ OPER Modify the Services operator list
+OPER_HELP_CMD_ADMIN
+ ADMIN Modify the Services admin list
+OPER_HELP_CMD_STAFF
+ STAFF Display Services staff and online status
+OPER_HELP_CMD_MODE
+ MODE Change a channel's modes
+OPER_HELP_CMD_KICK
+ KICK Kick a user from a channel
+OPER_HELP_CMD_CLEARMODES
+ CLEARMODES Clear modes of a channel
+OPER_HELP_CMD_KILLCLONES
+ KILLCLONES Kill all users that have a certain host
+OPER_HELP_CMD_AKILL
+ AKILL Manipulate the AKILL list
+OPER_HELP_CMD_SGLINE
+ SGLINE Manipulate the SGLINE list
+OPER_HELP_CMD_SQLINE
+ SQLINE Manipulate the SQLINE list
+OPER_HELP_CMD_SZLINE
+ SZLINE Manipulate the SZLINE list
+OPER_HELP_CMD_CHANLIST
+ CHANLIST Lists all channel records
+OPER_HELP_CMD_USERLIST
+ USERLIST Lists all user records
+OPER_HELP_CMD_LOGONNEWS
+ LOGONNEWS Define messages to be shown to users at logon
+OPER_HELP_CMD_RANDOMNEWS
+ RANDOMNEWS Define messages to be randomly shown to users
+ at logon
+OPER_HELP_CMD_OPERNEWS
+ OPERNEWS Define messages to be shown to users who oper
+OPER_HELP_CMD_SESSION
+ SESSION View the list of host sessions
+OPER_HELP_CMD_EXCEPTION
+ EXCEPTION Modify the session-limit exception list
+OPER_HELP_CMD_NOOP
+ NOOP Temporarily remove all O:lines of a server
+ remotely
+
+OPER_HELP_CMD_JUPE
+ JUPE "Jupiter" a server
+OPER_HELP_CMD_IGNORE
+ IGNORE Modify the Services ignore list
+OPER_HELP_CMD_SET
+ SET Set various global Services options
+OPER_HELP_CMD_RELOAD
+ RELOAD Reload services' configuration file
+OPER_HELP_CMD_UPDATE
+ UPDATE Force the Services databases to be
+ updated on disk immediately
+OPER_HELP_CMD_RESTART
+ RESTART Save databases and restart Services
+OPER_HELP_CMD_QUIT
+ QUIT Terminate the Services program with no save
+OPER_HELP_CMD_SHUTDOWN
+ SHUTDOWN Terminate the Services program with save
+OPER_HELP_CMD_DEFCON
+ DEFCON Manipulate the DefCon system
+OPER_HELP_CMD_CHANKILL
+ CHANKILL Kill all users on a specific channel
+OPER_HELP_CMD_OLINE
+ OLINE Give Operflags to a certain user
+OPER_HELP_CMD_UMODE
+ UMODE Change a user's modes
+OPER_HELP_CMD_SVSNICK
+ SVSNICK Forcefully change a user's nickname
+OPER_HELP_CMD_MODLOAD
+ MODLOAD Load a module
+OPER_HELP_CMD_MODUNLOAD
+ MODUNLOAD Un-Load a module
+OPER_HELP_CMD_MODINFO
+ MODINFO Info about a loaded module
+OPER_HELP_CMD_MODLIST
+ MODLIST List loaded modules
+
+OPER_HELP
+ %S commands:
+
+OPER_HELP_LOGGED
+ Notice: All commands sent to %S are logged!
+
+OPER_HELP_GLOBAL
+ Syntax: GLOBAL message
+
+ Allows Administrators 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 | MEMORY | UPLINK]
+
+ 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 RESET option currently resets the maximum user count
+ to the number of users currently present on the network.
+
+ The MEMORY option displays information on the memory
+ usage of Services. Using this option can freeze Services for
+ a short period of time on large networks; don't overuse it!
+
+ The UPLINK option displays information about the current
+ server Anope uses as an uplink to the network.
+
+ The ALL displays the user and uptime statistics, and
+ everything you'd see with MEMORY and UPLINK options.
+
+ 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 Root 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.
+
+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 | mask]
+
+ Allows Services Admins to make Services ignore a nick or mask
+ 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.
+ When adding a mask, it should be in the format user@host
+ or nick!user@host, everything else will be considered a nick.
+ Wildcards are permitted.
+
+ Ignores will not be enforced on IRC Operators.
+
+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.
+
+OPER_HELP_UMODE
+ Syntax: UMODE user modes
+
+ Allows Super Admins to set user modes for any user.
+ Parameters are the same as for the standard /MODE
+ command.
+
+OPER_HELP_OLINE
+ Syntax: OLINE user flags
+
+ Allows Super 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.
+
+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.
+
+OPER_HELP_KICK
+ Syntax: KICK channel user reason
+
+ Allows staff 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))
+
+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.
+
+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.
+
+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.
+
+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.
+
+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
+ SQL Activate or deactivate sql mode
+ IGNORE Activate or deactivate ignore mode
+ LIST List the options
+
+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.
+
+ This option is equivalent to the command-line option -logchan.
+
+ 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 privileges such as the
+ ability to be "founder" on all channel's etc...
+
+ This option is not persistent, and should only be used when
+ needed, and set back to OFF when no longer needed.
+
+OPER_HELP_SET_SQL
+ Syntax: SET SQL {ON | OFF}
+
+ Setting this will toggle Anope's usage of SQL, this should
+ be used to disable and enable SQL should your SQL server go down
+ while services are running.
+
+OPER_HELP_SET_IGNORE
+ Syntax: SET IGNORE {ON | OFF}
+
+ Setting this will toggle Anope's usage of the IGNORE system
+ on or off.
+
+OPER_HELP_SET_LIST
+ Syntax: SET LIST
+
+ Display the various %S settings
+
+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.
+
+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.
+
+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!
+
+OPER_HELP_UPDATE
+ Syntax: UPDATE
+
+ Causes Services to update all database files as soon as you
+ send the command.
+
+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.)
+
+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.
+
+OPER_HELP_SHUTDOWN
+ Syntax: SHUTDOWN
+
+ Causes Services to save all databases and then shut down.
+
+OPER_HELP_RESTART
+ Syntax: RESTART
+
+ Causes Services to save all databases and then restart
+ (i.e. exit and immediately re-run the executable).
+
+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.
+
+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.
+
+OPER_HELP_MODLOAD
+ Syntax: MODLOAD FileName
+
+ This command loads the module named FileName from the modules
+ directory.
+
+OPER_HELP_MODUNLOAD
+ Syntax: MODUNLOAD FileName
+
+ This command unloads the module named FileName from the modules
+ directory.
+
+OPER_HELP_MODINFO
+ Syntax: MODINFO FileName
+
+ This command lists information about the specified loaded module
+
+OPER_HELP_MODLIST
+ Syntax: MODLIST [Core|3rd|protocol|encryption|supported|qatested]
+
+ Lists all currently loaded modules.
+
+
+###########################################################################
+#
+# BotServ help messages
+#
+###########################################################################
+BOT_HELP_CMD_BOTLIST
+ BOTLIST Lists available bots
+BOT_HELP_CMD_ASSIGN
+ ASSIGN Assigns a bot to a channel
+BOT_HELP_CMD_SET
+ SET Configures bot options
+BOT_HELP_CMD_KICK
+ KICK Configures kickers
+BOT_HELP_CMD_BADWORDS
+ BADWORDS Maintains bad words list
+BOT_HELP_CMD_ACT
+ ACT Makes the bot do the equivalent of a "/me" command
+BOT_HELP_CMD_INFO
+ INFO Allows you to see BotServ information about a channel or a bot
+BOT_HELP_CMD_SAY
+ SAY Makes the bot say the given text on the given channel
+BOT_HELP_CMD_UNASSIGN
+ UNASSIGN Unassigns a bot from a channel
+BOT_HELP_CMD_BOT
+ BOT Maintains network bot list
+
+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 %R%S command. For
+ more information on a specific command, type %R
+ %S HELP command.
+
+
+BOT_HELP_FOOTER
+ 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 | bot) 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 %R%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 %R%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 %R%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 %R%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_BOT
+ Syntax: BOT ADD nick user host real
+ BOT CHANGE oldnick newnick [user [host [real]]]
+ BOT DEL nick
+
+ 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.
+
+ Note: you cannot create a bot that has a nick that is
+ currently registered. If an unregistered user is currently
+ using the nick, they 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.
+
+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.
+
+###########################################################################
+#
+# 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 %R%s set <nick> <hostmask>.
+HOST_SETALL_SYNTAX
+ Syntax %R%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: %R%s del <nick>.
+HOST_OFF_UNREAL
+ Your vhost was removed. To re-enable the standard host cloaking, type /mode %s +%s
+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_CMD_ON
+ ON Activates your assigned vhost
+
+HOST_HELP_CMD_OFF
+ OFF Deactivates your assigned vhost
+
+HOST_HELP_CMD_GROUP
+ GROUP Syncs the vhost for all nicks in a group
+
+HOST_HELP_CMD_SET
+ SET Set the vhost of another user
+
+HOST_HELP_CMD_SETALL
+ SETALL Set the vhost for all nicks in a group
+
+HOST_HELP_CMD_DEL
+ DEL Delete the vhost of another user
+
+HOST_HELP_CMD_DELALL
+ DELALL Delete the vhost for all nicks in a group
+
+HOST_HELP_CMD_LIST
+ LIST Displays one or more vhost entries.
+
+HOST_OPER_HELP
+ not used.
+
+HOST_ADMIN_HELP
+ not used.
+
+HOST_HELP
+ %S commands:
+
+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.
+
+HOST_HELP_DELALL
+ Syntax: DELALL <nick>.
+
+ Deletes the vhost for all nick's in the same group as
+ that of the given nick.
+
+
+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.
+
+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.
+
+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.
+
+HOST_HELP_GROUP
+ Syntax: GROUP
+
+ This command allows users to set the vhost of their
+ CURRENT nick to be the vhost for all nicks in the same
+ group.
+
+OPER_SVSNICK_UNSUPPORTED
+ Sorry, SVSNICK is not available on this network.
+
+OPER_SQLINE_UNSUPPORTED
+ Sorry, SQLINE is not available on this network.
+
+OPER_SVSO_UNSUPPORTED
+ Sorry, OLINE is not available on this network.
+
+OPER_UMODE_UNSUPPORTED
+ Sorry, UMODE is not available on this network.
+
+OPER_SUPER_ADMIN_NOT_ENABLED
+ SuperAdmin setting not enabled in services.conf
+
diff --git a/lang/es.l b/lang/es.l
new file mode 100644
index 000000000..1afd82d76
--- /dev/null
+++ b/lang/es.l
@@ -0,0 +1,6875 @@
+# Spanish Language File.
+#
+# (C) 2003-2008 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 us know
+# (dev@anope.org) 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
+# services.conf). 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. "%R%s HELP" para ayuda.
+SYNTAX_ERROR
+ Sintaxis: %s
+MORE_INFO
+ %R%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.
+INVALID_TARGET
+ "/msg %s" is no longer supported. Use "/msg %s@%s" or "/%s" instead.
+
+# 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_TOO_LONG
+ Your password is too long. Please try again with a shorter password.
+
+NICK_NOT_REGISTERED
+ Tu nick no esta registrado.
+NICK_NOT_REGISTERED_HELP
+ Tu nick no esta registrado. Tipea %R%s HELP para mayor
+ informacion sobre el registro de nicknames.
+NICK_X_IS_SERVICES
+ Nick %s is part of this Network's Services.
+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.
+NICK_X_SUSPENDED
+ Nick %s is currently suspended.
+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 %R%s IDENTIFY clave.
+CHAN_IDENTIFY_REQUIRED
+ Autentificacion por clave requerida para ese comando.
+ Intenta nuevamente despues de tipear %R%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
+LIST_INCORRECT_RANGE
+ Incorrect range specified. The correct syntax is #from-to.
+CS_LIST_INCORRECT_RANGE
+ To search for channels starting with #, search for the channel
+ name without the #-sign prepended (anope instead of #anope).
+
+###########################################################################
+#
+# NickServ messages
+#
+###########################################################################
+
+# Automatic messages
+HELP_LIMIT_SERV_OPER
+ Limited to Services Operators.
+HELP_LIMIT_SERV_ADMIN
+ Limited to Services Administrators.
+HELP_LIMIT_SERV_ROOT
+ Limited to Services Roots.
+HELP_LIMIT_IRC_OPER
+ Limited to IRC Operators.
+HELP_LIMIT_HOST_SETTER
+ Limited to Host Setters.
+HELP_LIMIT_HOST_REMOVER
+ Limited to Host Removers.
+
+
+###########################################################################
+#
+# NickServ messages
+#
+###########################################################################
+
+# Automatic messages
+NICK_IS_REGISTERED
+ Este nick pertenece a otra persona. Por favor elige otro nick.
+ (Si este es tu nick, tipea %R%s IDENTIFY clave.)
+NICK_IS_SECURE
+ Este nick esta registrado y protegido. Si es tu
+ nick, tipea %R%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_REGISTERED_NO_MASK
+ Nickname %s registrado.
+NICK_PASSWORD_IS
+ Tu clave es %s - Recuerdala para uso futuro.
+
+# GROUP responses
+NICK_REG_DELAY
+ Debes estar conectado mas de %d segundos para registrar tu nick.
+
+# 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 %R%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 %R%s HELP GLIST y %R%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 - Has 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 %R%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_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 %R%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_HIDE_STATUS_ON
+ Tu estado de acceso a los Servicios no sera mostrado en %s INFO.
+NICK_SET_HIDE_STATUS_OFF
+ Tu estado de acceso a los Servicios ahora sera mostrado en %s INFO.
+
+# 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 AUTOOP responses
+NICK_SET_AUTOOP_SYNTAX
+ SET AUTOOP {ON | OFF}
+NICK_SET_AUTOOP_ON
+ Services will now autoop you in channels.
+NICK_SET_AUTOOP_OFF
+ Services will no longer autoop you in channels.
+
+# SET NOEXPIRE responses
+NICK_SASET_SYNTAX
+ SASET nickname option parameters
+NICK_SASET_DISABLED
+ Sorry, nickname option setting is temporarily disabled.
+NICK_SASET_UNKNOWN_OPTION
+ Unknown SASET option %s.
+NICK_SASET_BAD_NICK
+ Nickname %s not registered.
+NICK_SASET_OPTION_DISABLED
+ Option %s cannot be set on this network.
+
+# SASET DISPLAY responses
+NICK_SASET_DISPLAY_INVALID
+ The new display for %s MUST be a nickname of the nickname group!
+NICK_SASET_DISPLAY_CHANGED
+ The new display is now %s.
+
+# SASET PASSWORD responses
+NICK_SASET_PASSWORD_FAILED
+ Sorry, couldn't change password for %s.
+NICK_SASET_PASSWORD_CHANGED
+ Password for %s changed.
+NICK_SASET_PASSWORD_CHANGED_TO
+ Password for %s changed to %s.
+
+# SASET LANGUAGE responses
+NICK_SASET_URL_CHANGED
+ URL for %s changed to %s.
+NICK_SASET_URL_UNSET
+ URL %s unset.
+
+# SASET EMAIL responses
+NICK_SASET_EMAIL_CHANGED
+ E-mail address for %s changed to %s.
+NICK_SASET_EMAIL_UNSET
+ E-mail address for %s unset.
+NICK_SASET_EMAIL_UNSET_IMPOSSIBLE
+ You cannot unset the e-mail on this network.
+
+# SASET ICQ responses
+NICK_SASET_ICQ_CHANGED
+ ICQ number for %s set to %s.
+NICK_SASET_ICQ_UNSET
+ ICQ number for %s unset.
+NICK_SASET_ICQ_INVALID
+ %s is not a valid number.
+
+# SASET GREET responses
+NICK_SASET_GREET_CHANGED
+ Greet message for %s changed to %s.
+NICK_SASET_GREET_UNSET
+ Greet message for %s unset.
+
+# SASET PROTECT responses
+NICK_SASET_KILL_SYNTAX
+ SASET nickname KILL {ON | QUICK | OFF}
+NICK_SASET_KILL_IMMED_SYNTAX
+ SASET nickname KILL {ON | QUICK | IMMED | OFF}
+NICK_SASET_KILL_ON
+ Protection is now ON for %s.
+NICK_SASET_KILL_QUICK
+ Protection is now ON for %s, with a reduced delay.
+NICK_SASET_KILL_IMMED
+ Protection is now ON for %s, with no delay.
+NICK_SASET_KILL_IMMED_DISABLED
+ The IMMED option is not available on this network.
+NICK_SASET_KILL_OFF
+ Protection is now OFF for %s.
+
+# SASET SECURE responses
+NICK_SASET_SECURE_SYNTAX
+ SASET nickname SECURE {ON | OFF}
+NICK_SASET_SECURE_ON
+ Secure option is now ON for %s.
+NICK_SASET_SECURE_OFF
+ Secure option is now OFF for %s.
+
+# SASET PRIVATE responses
+NICK_SASET_PRIVATE_SYNTAX
+ SASET nickname PRIVATE {ON | OFF}
+NICK_SASET_PRIVATE_ON
+ Private option is now ON for %s.
+NICK_SASET_PRIVATE_OFF
+ Private option is now OFF for %s.
+
+# SASET HIDE responses
+NICK_SASET_HIDE_SYNTAX
+ SET nickname HIDE {EMAIL | USERMASK | QUIT} {ON | OFF}
+NICK_SASET_HIDE_EMAIL_ON
+ The E-mail address of %s will now be hidden from %s INFO displays.
+NICK_SASET_HIDE_EMAIL_OFF
+ The E-mail address of %s will now be shown in %s INFO displays.
+NICK_SASET_HIDE_MASK_ON
+ The last seen user@host mask of %s will now be hidden from %s INFO displays.
+NICK_SASET_HIDE_MASK_OFF
+ The last seen user@host mask of %s will now be shown in %s INFO displays.
+NICK_SASET_HIDE_QUIT_ON
+ The last quit message of %s will now be hidden from %s INFO displays.
+NICK_SASET_HIDE_QUIT_OFF
+ The last quit message of %s will now be shown in %s INFO displays.
+NICK_SASET_HIDE_STATUS_ON
+ The services access status of %s will now be hidden from %s INFO displays.
+NICK_SASET_HIDE_STATUS_OFF
+ The services access status of %s will now be shown in %s INFO displays.
+
+# SASET MSG responses
+NICK_SASET_MSG_SYNTAX
+ SSAET nickname PRIVATE {ON | OFF}
+NICK_SASET_MSG_ON
+ Services will now reply to %s with messages.
+NICK_SASET_MSG_OFF
+ Services will now reply to %s with notices.
+
+# SET NOEXPIRE responses
+NICK_SASET_NOEXPIRE_SYNTAX
+ SASET nickname NOEXPIRE {ON | OFF}
+NICK_SASET_NOEXPIRE_ON
+ Nick %s will not expire.
+NICK_SASET_NOEXPIRE_OFF
+ Nick %s will expire.
+
+# ACCESS responses
+NICK_SASET_AUTOOP_SYNTAX
+ SASET nickname AUTOOP {ON | OFF}
+NICK_SASET_AUTOOP_ON
+ Services will now autoop %s in channels.
+NICK_SASET_AUTOOP_OFF
+ Services will no longer autoop %s in channels.
+
+# SASET LANGUAGE responses
+NICK_SASET_LANGUAGE_SYNTAX
+ SASET nickname LANGUAGE number
+NICK_SASET_LANGUAGE_UNKNOWN
+ Unknown language number %d. Type %R%s HELP SET LANGUAGE for a list of languages.
+NICK_SASET_LANGUAGE_CHANGED
+ Language changed to Spanish.
+
+
+# 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:
+NICK_ACCESS_LIST_EMPTY
+ Tu lista de acceso esta vacia.
+NICK_ACCESS_LIST_X_EMPTY
+ La lista de acceso para %s esta vacia.
+
+# Status messages
+NICK_STATUS_0
+ STATUS %s 0
+NICK_STATUS_1
+ STATUS %s 1
+NICK_STATUS_2
+ STATUS %s 2
+NICK_STATUS_3
+ STATUS %s 3
+
+# 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_SERVICES_ROOT
+ %s is a services root administrator.
+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_VHOST2
+ vhost: %s@%s
+NICK_INFO_ICQ
+ ICQ #: %d
+NICK_INFO_GREET
+ Mensaje de bienvenida: %s
+NICK_INFO_OPTIONS
+ Opciones: %s
+NICK_INFO_EXPIRE
+ Expira en: %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_AUTOOP
+ Auto-op
+NICK_INFO_OPT_NONE
+ Ninguno
+NICK_INFO_NO_EXPIRE
+ Este nickname no expirara.
+NICK_INFO_FOR_MORE
+ Para mayor informacion, tipea %R%s INFO %s ALL.
+
+# LIST responses
+NICK_INFO_SUSPENDED
+ This nickname is currently suspended, reason: %s
+NICK_INFO_SUSPENDED_NO_REASON
+ This nickname is currently suspended
+
+
+# LIST responses
+NICK_LIST_SYNTAX
+ LIST patron
+NICK_LIST_SERVADMIN_SYNTAX
+ LIST patron [FORBIDDEN] [SUSPENDED] [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.
+NICK_GLIST_REPLY
+ %c%s
+NICK_GLIST_REPLY_ADMIN
+ %c%s (expires in %s)
+
+# RECOVER responses
+NICK_RECOVER_SYNTAX
+ RECOVER nickname [clave]
+NICK_NO_RECOVER_SELF
+ No puedes recuperarte a ti mismo!
+NICK_RECOVERED
+ El usuario que ocupaba tu nick ha sido killeado.
+ %R%s RELEASE %s para recuperarlo antes de %s.
+
+# 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_SUSPEND_SYNTAX
+ SUSPEND nickname reason
+NICK_SUSPEND_SUCCEEDED
+ Nick %s is now suspended.
+NICK_SUSPEND_FAILED
+ Couldn't suspend nick %s!
+
+# UNSUSPEND responses
+NICK_UNSUSPEND_SYNTAX
+ UNSUSPEND nickname
+NICK_UNSUSPEND_SUCCEEDED
+ Nick %s is now released.
+NICK_UNSUSPEND_FAILED
+ Couldn't release nick %s!
+
+# 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 %R%s confirm <password> para completar el registro.
+NICK_CONFIRM_NOT_FOUND
+ El paso de registro 1 puede haber expirado. Usa "%R%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 " %R%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_X_INVALID
+ Channel %s is not a valid channel.
+
+# 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 %R%s HELP para informacion en como registrar nicknames.
+CHAN_MUST_IDENTIFY_NICK
+ Por favor primero identificate con %s, usando el comando:
+ %R%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.
+CHAN_REGISTER_NONE_CHANNEL
+ Has intentado registrar el canal %s, el cual no existe.
+CHAN_SYMBOL_REQUIRED
+ Por favor usar el simbolo # cuando intentes registrar un canal.
+
+
+# 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 (except the channel founder).
+CHAN_LOGOUT_FOUNDER_FAILED
+ You may not log out of %s (you are founder).
+
+# 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 para %s Activada.
+CHAN_SET_KEEPTOPIC_OFF
+ Retencion de topic para %s Desactivada.
+
+# SET TOPICLOCK responses
+CHAN_SET_TOPICLOCK_SYNTAX
+ SET canal TOPICLOCK {ON | OFF}
+CHAN_SET_TOPICLOCK_ON
+ Lock de topic para %s Activado.
+CHAN_SET_TOPICLOCK_OFF
+ Lock de topic para %s Desactivado.
+
+# SET PEACE responses
+CHAN_SET_PEACE_SYNTAX
+ SET canal PEACE {ON | OFF}
+CHAN_SET_PEACE_ON
+ Opcion de paz para %s Activada.
+CHAN_SET_PEACE_OFF
+ Opcion de paz para %s Desactivada.
+
+# SET PRIVATE responses
+CHAN_SET_PRIVATE_SYNTAX
+ SET canal PRIVATE {ON | OFF}
+CHAN_SET_PRIVATE_ON
+ Opcion de privacidad para %s Activada.
+CHAN_SET_PRIVATE_OFF
+ Opcion de privacidad para %s Desactivada.
+
+# SET SECUREOPS responses
+CHAN_SET_SECUREOPS_SYNTAX
+ SET canal SECUREOPS {ON | OFF}
+CHAN_SET_SECUREOPS_ON
+ Seguridad de OPs para %s Activada.
+CHAN_SET_SECUREOPS_OFF
+ Seguridad de OPs para %s Desactivada.
+
+# SET SECUREFOUNDER responses
+CHAN_SET_SECUREFOUNDER_SYNTAX
+ SET canal SECUREFOUNDER {ON | OFF}
+CHAN_SET_SECUREFOUNDER_ON
+ Seguridad de fundador para %s Activada.
+CHAN_SET_SECUREFOUNDER_OFF
+ Seguridad de fundador para %s Desactivada.
+
+# SET RESTRICTED responses
+CHAN_SET_RESTRICTED_SYNTAX
+ SET canal RESTRICTED {ON | OFF}
+CHAN_SET_RESTRICTED_ON
+ Acceso restringido para %s Activado.
+CHAN_SET_RESTRICTED_OFF
+ Acceso restringido para %s Desactivado.
+
+# SET SECURE responses
+CHAN_SET_SECURE_SYNTAX
+ SET canal SECURE {ON | OFF}
+CHAN_SET_SECURE_ON
+ Opcion de seguridad para %s Activada.
+CHAN_SET_SECURE_OFF
+ Opcion de seguridad para %s Desactivada.
+
+# SET SIGNKICK responses
+CHAN_SET_SIGNKICK_SYNTAX
+ SET canal SIGNKICK {ON | LEVEL | OFF}
+CHAN_SET_SIGNKICK_ON
+ Opcion de kick firmado para %s Activada.
+CHAN_SET_SIGNKICK_LEVEL
+ Opcion de kick firmado para %s Activada, pero depende
+ del nivel del usuario que use el comando.
+CHAN_SET_SIGNKICK_OFF
+ Opcion de kick firmado para %s Desactivada.
+
+# SET OPNOTICE responses
+CHAN_SET_OPNOTICE_SYNTAX
+ SET canal OPNOTICE {ON | OFF}
+CHAN_SET_OPNOTICE_ON
+ Opcion OP-notice para %s Activada.
+CHAN_SET_OPNOTICE_OFF
+ Opcion OP-notice para %s Desactivada.
+
+# SET XOP responses
+CHAN_SET_XOP_SYNTAX
+ SET canal XOP {ON | OFF}
+CHAN_SET_XOP_ON
+ El sistema de listas xOP para %s esta ahora Encendido.
+CHAN_SET_XOP_OFF
+ El sistema de listas xOP para %s esta 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 %R%s HELP ACCESS para mayor informacion.
+CHAN_XOP_NOT_AVAILABLE
+ El sistema xOP no esta disponible.
+
+# 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 %s 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 %s 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 %s 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 %s 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 %R%s HELP comando para mayor informacion.
+CHAN_ACCESS_XOP_HOP
+ You can't use this command.
+ Use the AOP, SOP, HOP and VOP commands instead.
+ Type %R%s HELP command for more information.
+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 %s 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 del canal %s 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 %R%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.
+
+# Status Messages
+CHAN_STATUS_SYNTAX
+ STATUS ERROR Error de sintaxis
+CHAN_STATUS_NOT_REGGED
+ STATUS ERROR El canal %s no esta registrado
+CHAN_STATUS_FORBIDDEN
+ STATUS ERROR El canal %s esta prohibido
+CHAN_STATUS_NOTONLINE
+ STATUS ERROR El nick %s no esta online
+CHAN_STATUS_INFO
+ STATUS %s %s %d
+
+# 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_EXPIRE
+ Expira en: %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
+ Has 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_HOPS
+ El modo +h 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.
+CHAN_CLEARED_INVITES
+ Todos los invites en el canal %s han sido removidos.
+
+# 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.
+
+# GETKEY responses
+CHAN_GETKEY_SYNTAX
+ GETKEY canal
+CHAN_GETKEY_NOKEY
+ El canal %s no tiene clave.
+CHAN_GETKEY_KEY
+ KEY %s %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
+ Has 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 %R%s READ LAST para leer tu ultimo memo.
+MEMO_TYPE_READ_NUM
+ Tipea %R%s READ %d para leerlo.
+MEMO_TYPE_LIST_NEW
+ Tipea %R%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 %R%s READ %s %d para leerlo.
+MEMO_NEW_MEMO_ARRIVED
+ Tienes un nuevo memo de %s.
+ Tipea %R%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: %R%s READ numero
+MEMO_LIST_NEW_MEMOS
+ Nuevos memos para %s. Para leerlos tipea: %R%s READ numero
+MEMO_LIST_CHAN_MEMOS
+ Memos para %s. Para leerlos tipea: %R%s READ %s numero
+MEMO_LIST_CHAN_NEW_MEMOS
+ Nuevos memos para %s. Para leerlos tipea: %R%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: %R%s DEL %d
+MEMO_CHAN_HEADER
+ Memo %d de %s (%s). Para borrarlo tipea: %R%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_NOTIFY_MAIL
+ Seras informado de nuevos memos via email.
+MEMO_SET_NOTIFY_NOMAIL
+ No seras informado de nuevos memos via email.
+MEMO_SET_NOTIFY_INVALIDMAIL
+ Tu nick no tiene una direccion de e-mail.
+
+# 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.
+
+# Standard responses
+MEMO_MAIL_SUBJECT
+ Nuevo memo
+MEMO_MAIL_TEXT1
+ Hola %s
+MEMO_MAIL_TEXT2
+ Acabas de recibir un nuevo memo de %s. Es el memo numero %d.
+MEMO_MAIL_TEXT3
+ Texto del Memo:
+
+# Standard responses
+MEMO_RSEND_PLEASE_WAIT
+ Por favor espera %d segundos antes de usar el comando RSEND nuevamente.
+MEMO_RSEND_DISABLED
+ Lo siento, RSEND ha sido deshabilitado en esta red.
+MEMO_RSEND_SYNTAX
+ RSEND {nick | canal} texto-memo
+MEMO_RSEND_NICK_MEMO_TEXT
+ [auto-memo] El memo que enviaste ha sido leido.
+MEMO_RSEND_CHAN_MEMO_TEXT
+ [auto-memo] El memo que enviaste a %s ha sido leido.
+MEMO_RSEND_USER_NOTIFICATION
+ Una notificacion ha sido enviada a %s informando que has leido su memo.
+
+# Standard responses
+MEMO_CHECK_SYNTAX
+ CHECK nickname
+MEMO_CHECK_NOT_READ
+ El ultimo memo que enviaste a %s (enviado el %s) aun no ha sido leido.
+MEMO_CHECK_READ
+ El ultimo memo que enviaste a %s (enviado el %s) ha sido leido.
+MEMO_CHECK_NO_MEMO
+ El nick %s no ha recibido ningun memo tuyo.
+MEMO_NO_RSEND_SELF
+ No puedes pedir una notificacion cuando te envias el memo a ti mismo.
+
+###########################################################################
+#
+# 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 %R%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_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 %R%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 %R%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.
+BOT_LONG_IDENT
+ Los Idents de bots pueden tener solo %d caracteres.
+BOT_LONG_HOST
+ Los Hosts de bots pueden tener solo %d caracteres.
+###########################################################################
+#
+# 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_HOSTSERV_MEM
+ HostServ : %6d records, %5d kB
+OPER_STATS_OPERSERV_MEM
+ OperServ : %6d records, %5d kB
+OPER_STATS_SESSIONS_MEM
+ Sesiones : %6d records, %5d 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_STATS_UPLINK_SERVER
+ Uplink server: %s
+OPER_STATS_UPLINK_CAPAB
+ Uplink capab: %s
+OPER_STATS_UPLINK_SERVER_COUNT
+ Servers found: %d
+
+# 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 O:Line 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_ADMIN_MOVED
+ %s ha sido movido a la lista de Administradores de Servicios.
+
+# 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.
+OPER_OPER_MOVED
+ %s ha sido movido a la lista de Operadores de Servicios.
+
+# 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
+ CHANKILL [+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 Mascara Razon
+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.
+OPER_SET_SQL_ON
+ El codigo SQL sera usado.
+OPER_SET_SQL_OFF
+ El codigo SQL no sera usado.
+OPER_SET_SQL_ERROR
+ Opciones para SQL son ON o OFF.
+OPER_SET_SQL_ERROR_INIT
+ Error durante el inicio de SQL, revisa tus logs para corregir.
+OPER_SET_SQL_ERROR_DISABLED
+ SQL no esta configurado para esta red. Por favor edita
+ el archivo de configuracion (services.conf).
+OPER_SET_LIST_OPTION_ON
+ %s esta habilitado
+OPER_SET_LIST_OPTION_OFF
+ %s esta deshabilitado
+
+# 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 | mask]
+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_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_NO_UNLOAD
+ This module can not be unloaded.
+OPER_MODULE_LOAD_SYNTAX
+ MODLOAD NombreArchivo
+OPER_MODULE_UNLOAD_SYNTAX
+ MODUNLOAD NombreArchivo
+OPER_MODULE_LIST_HEADER
+ Lista actual de modulos:
+OPER_MODULE_LIST
+ Modulo: %s [%s] [%s]
+OPER_MODULE_LIST_FOOTER
+ %d Modulos cargados.
+OPER_MODULE_INFO_LIST
+ Modulo: %s Version: %s Autor: %s cargado: %s
+OPER_MODULE_CMD_LIST
+ Comandos entregados: %R%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.
+OPER_EXCEPTION_EXISTS
+ %s already exists on the EXCEPTION list.
+OPER_EXCEPTION_CHANGED
+ Exception for %s has been updated to %d.
+
+# 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
+ 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 %s messages will be
+ sent in order to avoid flooding the user. If there are
+ more news messages, only the most recent will be sent.)
+ NewsCount can be configured in services.conf.
+
+ 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 %s messages will
+ be sent in order to avoid flooding the user. If there are
+ more news messages, only the most recent will be sent.)
+ NewsCount can be configured in services.conf.
+
+ 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
+ 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:
+
+ %R%s HELP
+ para informacion acerca registrar nicknames
+
+ %R%s HELP
+ para informacion acerca registrar y controlar
+ canales
+
+ %R%s HELP
+ para informacion acerca enviar mensajes a usuarios no
+ en linea.
+
+HELP_HELP_BOT
+
+ %R%s HELP
+ para informacion acerca setear un bot en tu canal
+
+HELP_HELP_HOST
+
+ %R%s HELP
+ Para informacion sobre como setear vHosts para nicknames.
+
+###########################################################################
+#
+# NickServ help messages
+#
+###########################################################################
+NICK_HELP_CMD_CONFIRM
+ CONFIRM Confirm a nickserv auth code
+NICK_HELP_CMD_RESEND
+ RESEND Resend a nickserv auth code
+
+NICK_HELP_CMD_REGISTER
+ REGISTER Registra un nickname
+NICK_HELP_CMD_GROUP
+ GROUP Ingresa a un grupo
+NICK_HELP_CMD_IDENTIFY
+ IDENTIFY Para identificarte con tu clave
+NICK_HELP_CMD_ACCESS
+ ACCESS Modifica la lista de direcciones autorizadas
+NICK_HELP_CMD_SET
+ SET Setea protecciones, incluyendo kills
+NICK_HELP_CMD_SASET
+ SASET Set SET-options on another nickname
+NICK_HELP_CMD_DROP
+ DROP Cancela la registracion de un nickname
+NICK_HELP_CMD_RECOVER
+ RECOVER Killea otro usuario que este usando tu nickname
+NICK_HELP_CMD_RELEASE
+ RELEASE Retoma custodia de tu nick luego de RECOVER
+NICK_HELP_CMD_SENDPASS
+ SENDPASS Olvidaste tu clave? Intenta esto
+NICK_HELP_CMD_GHOST
+ GHOST Disconnects a "ghost" IRC session using your nick
+NICK_HELP_CMD_ALIST
+ ALIST List channels you have access on
+NICK_HELP_CMD_GLIST
+ GLIST Lists all nicknames in your group
+NICK_HELP_CMD_INFO
+ INFO Displays information about a given nickname
+NICK_HELP_CMD_LIST
+ LIST List all registered nicknames that match a given pattern
+NICK_HELP_CMD_LOGOUT
+ LOGOUT Reverses the effect of the IDENTIFY command
+NICK_HELP_CMD_STATUS
+ STATUS Returns the owner status of the given nickname
+NICK_HELP_CMD_UPDATE
+ UPDATE Updates your current status, i.e. it checks for new memos
+NICK_HELP_CMD_GETPASS
+ GETPASS Recupera la clave para un nickname
+ (solo si encripcion esta desabilitada)
+NICK_HELP_CMD_GETEMAIL
+ GETEMAIL Matches and returns all users that registered using given email
+NICK_HELP_CMD_FORBID
+ FORBID Previene un nickname a ser usado
+NICK_HELP_CMD_SUSPEND
+ SUSPEND Suspend a given nick
+NICK_HELP_CMD_UNSUSPEND
+ UNSUSPEND Unsuspend a given nick
+
+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 %R%S comando.
+ Para mayor informacion acerca de un comando especifico
+ tipea %R%S HELP comando.
+
+NICK_HELP_FOOTER
+ 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 %R%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 %R%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 (%R%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
+ %R%S LIST
+ HIDE Esconde algunas partes de tu informacion
+ MSG Cambia el metodo de comunicacion con
+ Servicios
+ AUTOOP Should services op you automatically.
+
+ Para usar este comando, debes primero identificarte con
+ Servicios usando tu clave (%R%S HELP IDENTIFY
+ para mayor informacion).
+
+ Tipea %R%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_SET_AUTOOP
+ Syntax: SET AUTOOP {ON | OFF}
+
+ Sets whether you will be opped automatically. Set to ON to
+ allow ChanServ to op you automatically when entering channels.
+
+NICK_HELP_SASET
+ Syntax: SASET nickname option parameters.
+
+ Sets various nickname options. option can be one of:
+
+ DISPLAY Set the display of the group in Services
+ PASSWORD Set the nickname password
+ URL Associate a URL with the nickname
+ EMAIL Associate an E-mail address with the nickname
+ ICQ Associate an ICQ number with the nickname
+ GREET Associate a greet message with the nickname
+ KILL Turn protection on or off
+ SECURE Turn nickname security on or off
+ PRIVATE Prevent the nickname from appearing in a
+ %R%S LIST
+ HIDE Hide certain pieces of nickname information
+ MSG Change the communication method of Services
+ NOEXPIRE Prevent the nickname from expiring
+ LANGUAGE Set the language Services will use when
+ sending messages to nickname
+
+ Type %R%S HELP SASET option for more information
+ on a specific option. The options will be set on the given
+ nickname.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_DISPLAY
+ Syntax: SASET nickname DISPLAY new-display
+
+ Changes the display used to refer to the nickname group in
+ Services. The new display MUST be a nick of the group.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_PASSWORD
+ Syntax: SASET nickname PASSWORD new-password
+
+ Changes the password used to identify as the nick's owner.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_URL
+ Syntax: SASET nickname URL url
+
+ Associates the given URL with the nickname. This URL
+ will be displayed whenever someone requests information
+ on the nick with the INFO command.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_EMAIL
+ Syntax: SASET nickname EMAIL address
+
+ Associates the given E-mail address with the nickname.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_ICQ
+ Syntax: SASET nickname ICQ number
+
+ Associates the given ICQ number with the nickname. This
+ number will be displayed whenever someone requests
+ information on the nick with the INFO command.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_GREET
+ Syntax: SASET nickname GREET message
+
+ Makes the given message the greet of the nickname, that
+ will be displayed when joining a channel that has GREET
+ option enabled, provided that the user has the necessary
+ access on it.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_KILL
+ Syntax: SASET nickname KILL {ON | QUICK | IMMED | OFF}
+
+ Turns the automatic protection option for the nick
+ on or off. With protection on, if another user
+ tries to take the 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.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_SECURE
+ Syntax: SASET nickname 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.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_PRIVATE
+ Syntax: SASET nickname PRIVATE {ON | OFF}
+
+ Turns %S's privacy option on or off for the nick.
+ With PRIVATE set, the nickname will not appear in
+ nickname lists generated with %S's LIST command.
+ (However, anyone who knows the nickname can still get
+ information on it using the INFO command.)
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_HIDE
+ Syntax: SASET nickname HIDE {EMAIL | STATUS | USERMASK | QUIT} {ON | OFF}
+
+ Allows you to prevent certain pieces of information from
+ being displayed when someone does a %S INFO on the
+ nick. You can hide the E-mail address (EMAIL), last seen
+ user@host mask (USERMASK), the services access status
+ (STATUS) and last quit message (QUIT).
+ The second parameter specifies whether the information should
+ be displayed (OFF) or hidden (ON).
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_MSG
+ Syntax: SASET nickname MSG {ON | OFF}
+
+ Allows you to choose the way Services are communicating with
+ the given user. With MSG set, Services will use messages,
+ else they'll use notices.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_NOEXPIRE
+ Syntax: SASET nickname NOEXPIRE {ON | OFF}
+
+ Sets whether the given nickname will expire. Setting this
+ to ON prevents the nickname from expiring.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_AUTOOP
+ Syntax: SASET nickname AUTOOP {ON | OFF}
+
+ Sets whether the given nickname will be opped automatically.
+ Set to ON to allow ChanServ to op the given nickname
+ automatically when joining channels.
+
+NICK_HELP_SASET_LANGUAGE
+ Syntax: SASET nickname LANGUAGE number
+
+ Changes the language Services uses when sending messages to
+ nickname (for example, when responding to a command he sends).
+ number should be chosen from a list of supported languages
+ that you can get by typing %R%S HELP SET LANGUAGE.
+
+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
+ remain online for %s to ensure that the other
+ user does not immediately reconnect; after that time, you
+ can reclaim your nick. Alternatively, use the RELEASE
+ command (%R%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. This holds lasts for %s;
+ 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
+ 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. Si no se entrega un nickname, se mostrara
+ tu estado.
+
+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_HELP_CONFIRM
+ Sintaxis: CONFIRM passcode
+
+ Este es el segundo paso en el proceso de registro de nicknames.
+ Debes ejecutar este comando para que tu nick sea registrado con %S.
+ El passcode (tambien conocido como codigo de autorizacion) es
+ enviado a tu direccion e-mail en el primer paso del proceso de
+ registo. Para mas informacion sobre la primera etpa del proceso
+ de registro, escribe: %R%S HELP REGISTER
+
+NICK_HELP_RESEND
+ Sintaxis: RESEND
+
+ Este comando envia el codigo de autorizacion (conocido como passcode)
+ a la direccion e-mail del usuario que lo esta ejecutando.
+
+NICK_SERVADMIN_HELP
+ 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
+ (%R%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_INFO
+
+ Administradores de Servicios pueden usar el parametro
+ ALL con cualquier nick.
+
+NICK_SERVADMIN_HELP_LIST
+ Sintaxis: LIST patron [FORBIDDEN] [SUSPENDED] [NOEXPIRE] [UNCONFIRMED]
+
+ 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, SUSPENDED, NOEXPIRE o UNCONFIRMED son dadas,
+ solo nicks que, respectivamete, esten FORBIDDEN, SUSPENDED, UNCONFIRMED
+ o esten seteados NOEXPIRE seran mostrados. Si las tres opciones
+ son dadas, los tres 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
+#
+###########################################################################
+
+NICK_SERVADMIN_HELP_SUSPEND
+ Syntax: SUSPEND nickname reason / UNSUSPEND nickname
+
+ SUSPENDs / UNSUSPENDs a nickname from being identified to
+
+ Limited to Services admins.
+
+###########################################################################
+#
+# ChanServ help messages
+#
+###########################################################################
+
+NICK_SERVADMIN_HELP_UNSUSPEND
+ Syntax: UNSUSPEND nickname
+
+ UNSUSPENDS a nickname from being used.
+
+ Limited to Services admins.
+
+###########################################################################
+#
+# ChanServ help messages
+#
+###########################################################################
+CHAN_HELP_CMD_GETPASS
+ GETPASS Retorna la clave de fundador para un canal
+CHAN_HELP_CMD_FORBID
+ FORBID Previene un canal a ser usado
+CHAN_HELP_CMD_SUSPEND
+ SUSPEND Previene un canal a ser usado preservando
+ toda su informacion.
+CHAN_HELP_CMD_UNSUSPEND
+ UNSUSPEND Libera la suspencion del canal.
+CHAN_HELP_CMD_STATUS
+ STATUS Retorna el nivel de acceso actual de un
+ usuario en un canal
+CHAN_HELP_CMD_REGISTER
+ REGISTER Registra un canal
+CHAN_HELP_CMD_IDENTIFY
+ IDENTIFY Te identifica con tu clave
+CHAN_HELP_CMD_SET
+ SET Setea opciones e informacion de un canal
+CHAN_HELP_CMD_AOP
+ AOP Modifica la lista de usuarios AOP
+CHAN_HELP_CMD_SOP
+ SOP Modifica la lista de usuarios SOP
+CHAN_HELP_CMD_ACCESS
+ ACCESS Modifica la lista de usuarios privilegiados
+CHAN_HELP_CMD_LEVELS
+ LEVELS Redefine el significado de niveles de acceso
+CHAN_HELP_CMD_AKICK
+ AKICK Mantiene la lista de AutoKick
+CHAN_HELP_CMD_DROP
+ DROP Cancela la registracion de un canal
+CHAN_HELP_CMD_SENDPASS
+ SENDPASS Ayuda a recuperar claves perdidas
+CHAN_HELP_CMD_BAN
+ BAN Bans a selected nick on a channel
+CHAN_HELP_CMD_CLEAR
+ CLEAR Tells ChanServ to clear certain settings on a channel
+CHAN_HELP_CMD_DEVOICE
+ DEVOICE Devoices a selected nick on a channel
+CHAN_HELP_CMD_GETKEY
+ GETKEY Returns the key of the given channel
+CHAN_HELP_CMD_INFO
+ INFO Lists information about the named registered channel
+CHAN_HELP_CMD_INVITE
+ INVITE Tells ChanServ to invite you or a given nick into a channel
+CHAN_HELP_CMD_KICK
+ KICK Kicks a selected nick from a channel
+CHAN_HELP_CMD_LIST
+ LIST Lists all registered channels matching the given pattern
+CHAN_HELP_CMD_LOGOUT
+ LOGOUT This command will logout the selected nickname
+CHAN_HELP_CMD_OP
+ OP Gives Op status to a selected nick on a channel
+CHAN_HELP_CMD_TOPIC
+ TOPIC Manipulate the topic of the specified channel
+CHAN_HELP_CMD_UNBAN
+ UNBAN Remove all bans preventing you from entering a channel
+CHAN_HELP_CMD_VOICE
+ VOICE Voices a selected nick on a channel
+CHAN_HELP_CMD_VOP
+ VOP Maintains the VOP (VOicePeople) list for a channel
+CHAN_HELP_CMD_DEHALFOP
+ DEHALFOP Dehalfops a selected nick on a channel
+CHAN_HELP_CMD_DEOWNER
+ DEOWNER Removes your owner status on a channel
+CHAN_HELP_CMD_DEPROTECT
+ DEPROTECT Deprotects a selected nick on a channel
+CHAN_HELP_CMD_HALFOP
+ HALFOP Halfops a selected nick on a channel
+CHAN_HELP_CMD_HOP
+ HOP Maintains the HOP (HalfOP) list for a channel
+CHAN_HELP_CMD_OWNER
+ OWNER Gives you owner status on channel
+CHAN_HELP_CMD_PROTECT
+ PROTECT Protects a selected nick on a channel
+CHAN_HELP_CMD_ADMIN
+ ADMIN Protects a selected nick on a channel
+CHAN_HELP_CMD_DEADMIN
+ DEADMIN Deprotects a selected nick on a channel
+CHAN_HELP_CMD_DEOP
+ DEOP Deops a selected nick on a channel
+
+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 %R%S comando.
+ Para mayor informacion acerca de un comando especifico,
+ tipea %R%S HELP comando.
+
+
+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
+ (%R%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
+ %R%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 %R%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 %R%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 %R%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
+ %R%S HELP ACCESS para incormacion acerca la lista
+ de acceso y %R%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
+ %R%S HELP ACCESS para incormacion acerca la lista
+ de acceso y %R%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
+ %R%S HELP ACCESS para incormacion acerca la lista
+ de acceso y %R%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
+ %R%S HELP ACCESS para incormacion acerca la lista
+ de acceso y %R%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;
+ %R%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 %R%S HELP LEVELS
+ para mayor informacion.
+
+CHAN_HELP_AKICK
+ Sintaxis: AKICK channel ADD {nick | mask} [reason]
+ AKICK channel STICK mask
+ AKICK channel UNSTICK mask
+ AKICK channel DEL {nick | mask | entry-num | list}
+ AKICK channel LIST [mask | entry-num | list]
+ AKICK channel VIEW [mask | entry-num | list]
+ 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
+ "Has sido baneado del canal".
+ When akicking a registered nick the nickserv account
+ will be added to the akick list instead of the mask.
+ All users within that nickgroup will then be akicked.
+
+ 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 %R%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.
+ HOPS Removes channel-halfoperator status (mode +h) from
+ all channel halfoperators, if supported.
+ 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
+
+ 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_CMD_SEND
+ SEND Envia un memo a un nick o canal
+MEMO_HELP_CMD_CANCEL
+ CANCEL Cancela el ultimo memo que enviaste
+MEMO_HELP_CMD_LIST
+ LIST Lista tus memos
+MEMO_HELP_CMD_READ
+ READ Lee uno o mas memos
+MEMO_HELP_CMD_DEL
+ DEL Borra uno o mas memos
+MEMO_HELP_CMD_SET
+ SET Setea opciones relacionadas a memos
+MEMO_HELP_CMD_INFO
+ INFO Displays information about your memos
+MEMO_HELP_CMD_RSEND
+ RSEND Sends a memo and requests a read receipt
+MEMO_HELP_CMD_CHECK
+ CHECK Checks if last memo to a nick was read
+MEMO_HELP_CMD_SENDALL
+ SENDALL Envia un memo a todos los usuarios registrados
+MEMO_HELP_CMD_STAFF
+ STAFF Envia un memo a todos los opers/admins
+
+MEMO_HELP_HEADER
+ %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:
+
+
+MEMO_HELP_ADMIN
+ not used.
+MEMO_HELP_OPER
+ not used.
+MEMO_HELP_FOOTER
+
+ Tipea %R%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 %R%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
+#
+###########################################################################
+
+MEMO_HELP_RSEND
+ Sintaxis: RSEND {nick | canal} texto-memo
+
+ Envia a nick o canal un memo conteniendo memo-text.
+ Cuando se envia a un nickname, el receptor recibira una noticia
+ informandole que tiene un nuevo memo. El nickname o canal al cual se le
+ enviara el memo debe estar registrado.
+ Una vez que el memo ha sido leido, quien envio el memo recibira una
+ notificacion automatica informando que el memo ha sido leido.
+
+###########################################################################
+#
+# OperServ help messages
+#
+###########################################################################
+
+MEMO_HELP_CHECK
+ Sintaxis: CHECK nick
+
+ Verifica que el _ultimo_ memo que enviaste a nick haya sido leido.
+ Nota que esto solo funciona para nicknames, no para canales.
+
+###########################################################################
+#
+# OperServ help messages
+#
+###########################################################################
+
+OPER_HELP_CMD_GLOBAL
+ GLOBAL Envia un mensaje a todos los usuarios
+OPER_HELP_CMD_STATS
+ STATS Muestra estatus de los Servicios y la red
+OPER_HELP_CMD_OPER
+ OPER Modifica la lista de operadores de Servicios
+OPER_HELP_CMD_ADMIN
+ ADMIN Modifica la lista de administradores de
+ Servicios
+OPER_HELP_CMD_STAFF
+ STAFF Muestra la lista del staff y su status
+OPER_HELP_CMD_MODE
+ MODE Cambia los modos de un canal
+OPER_HELP_CMD_KICK
+ KICK Kickea un usuario de un canal
+OPER_HELP_CMD_CLEARMODES
+ CLEARMODES Limpia los modos de un canal
+OPER_HELP_CMD_KILLCLONES
+ KILLCLONES Killea todos los usuarios en un host
+OPER_HELP_CMD_AKILL
+ AKILL Manipula la lista AKILL
+OPER_HELP_CMD_SGLINE
+ SGLINE Manipula la lista SGLINE
+OPER_HELP_CMD_SQLINE
+ SQLINE Manipula la lista SQLINE
+OPER_HELP_CMD_SZLINE
+ SZLINE Manipula la lista SZLINE
+OPER_HELP_CMD_CHANLIST
+ CHANLIST Lista todos los records de canal
+OPER_HELP_CMD_USERLIST
+ USERLIST Lista todos los records de usuarios
+OPER_HELP_CMD_LOGONNEWS
+ LOGONNEWS Define mensajes para ser mostrados a usuarios
+ al conectarse
+OPER_HELP_CMD_RANDOMNEWS
+ RANDOMNEWS Define mensajes para ser mostrados al azar a
+ usuarios al conectarse
+OPER_HELP_CMD_OPERNEWS
+ OPERNEWS Define mensajes a ser mostrados a usuarios al
+ transformarse en operadores
+OPER_HELP_CMD_SESSION
+ SESSION Muestra la lista de sesiones de host
+OPER_HELP_CMD_EXCEPTION
+ EXCEPTION Modifica la lista de limite de sesion
+OPER_HELP_CMD_NOOP
+ NOOP Temporalmente remueve todas las lineas O: de
+ un servidor remotamente
+OPER_HELP_CMD_JUPE
+ JUPE "Jupiter" un servidor
+OPER_HELP_CMD_IGNORE
+ IGNORE Ignora a un usuario
+OPER_HELP_CMD_SET
+ SET Setea varias opciones globales de los Servicios
+OPER_HELP_CMD_RELOAD
+ RELOAD Recarga la configuracion de los Servicios
+OPER_HELP_CMD_UPDATE
+ UPDATE Fuerza a la base de datos de los Servicios a
+ ser updateada a disco inmediatamente
+OPER_HELP_CMD_RESTART
+ RESTART Guarda la base de datos de los Servicios y
+ recarga los Servicios
+OPER_HELP_CMD_QUIT
+ QUIT Termina el programa de servicios sin guardar
+ los cambios
+OPER_HELP_CMD_SHUTDOWN
+ SHUTDOWN Termina el programa de Servicios guardando los
+ cambios
+OPER_HELP_CMD_DEFCON
+ DEFCON Manipulate the DefCon system
+OPER_HELP_CMD_CHANKILL
+ CHANKILL Kill all users on a specific channel
+OPER_HELP_CMD_OLINE
+ OLINE Otorga privilegios IRCOP temporarios
+OPER_HELP_CMD_UMODE
+ UMODE Otorga cambios de modos de usuario
+OPER_HELP_CMD_SVSNICK
+ SVSNICK Forcefully change a user's nickname
+OPER_HELP_CMD_MODLOAD
+ MODLOAD Load a module
+OPER_HELP_CMD_MODUNLOAD
+ MODUNLOAD Un-Load a module
+OPER_HELP_CMD_MODINFO
+ MODINFO Info about a loaded module
+OPER_HELP_CMD_MODLIST
+ MODLIST List loaded modules
+
+OPER_HELP
+ Comandos para %S:
+
+OPER_HELP_LOGGED
+ Noticia: todos los comandos enviados a %S son monitoreados!
+
+OPER_HELP_GLOBAL
+ Sintaxis: GLOBAL mensaje
+
+ Permite a los Administrators 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 root 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.
+
+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
+ Syntax: IGNORE {ADD|DEL|LIST|CLEAR} [time] [nick | mask]
+
+ Allows Services Admins to make Services ignore a nick or mask
+ 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.
+ When adding a mask, it should be in the format user@host
+ or nick!user@host, everything else will be considered a nick.
+ Wildcards are permitted.
+
+ Ignores will not be enforced on IRC Operators.
+
+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 Super Admins a setear modos de
+ usuarios para cualquier usuario. Los parametros son los
+ mismos que para el comando /MODE.
+
+OPER_HELP_OLINE
+ Sintaxis: OLINE usuario opciones
+
+ Permite a Super Admins 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.
+
+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 Super Admins.
+
+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
+ SQL Activate or deactivate sql mode
+ IGNORE Activate or deactivate ignore mode
+ LIST List the options
+
+ 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.
+
+ Esta opcion es equivalente a la opcion -logchan en
+ la linea de comando.
+
+ 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_SET_SQL
+ Syntax: SET SQL {ON | OFF}
+
+ Setting this will toggle Anope's from usage of SQL, this should
+ be used to disable and enable SQL should your SQL server go down
+ while services are running.
+
+OPER_HELP_SET_IGNORE
+ Syntax: SET IGNORE {ON | OFF}
+
+ Setting this will toggle Anope's usage of the IGNORE system
+ on or off.
+
+OPER_HELP_SET_LIST
+ Syntax: SET LIST
+
+ Display the various %S settings
+
+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_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_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 [Core|3rd|protocol|encryption|supported|qatested]
+
+ Lista todos los modulos actualmente cargados.
+
+ Limitado a Services Roots.
+
+
+###########################################################################
+#
+# BotServ help messages
+#
+###########################################################################
+
+BOT_HELP_CMD_BOTLIST
+ BOTLIST Lista bots disponibles
+BOT_HELP_CMD_ASSIGN
+ ASSIGN Asigna un bot a un canal
+BOT_HELP_CMD_SET
+ SET Configura opciones de bots
+BOT_HELP_CMD_KICK
+ KICK Configura kickers
+BOT_HELP_CMD_BADWORDS
+ BADWORDS Mantiene lista de bad words
+BOT_HELP_CMD_ACT
+ ACT Makes the bot do the equivalent of a "/me" command
+BOT_HELP_CMD_INFO
+ INFO Allows you to see BotServ information about a channel or a bot
+BOT_HELP_CMD_SAY
+ SAY Makes the bot say the given text on the given channel
+BOT_HELP_CMD_UNASSIGN
+ UNASSIGN Unassigns a bot from a channel
+BOT_HELP_CMD_BOT
+ BOT Mantiene la lista de bots de la red
+
+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 %R%S comando. Para mayor
+ informacion sobre un comando especifico, tipea
+ %R%S HELP comando.
+
+BOT_HELP_FOOTER
+ 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 %R%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 %R%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 %R%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 %R%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_BOT
+ Sintaxis: BOT ADD nick usuario host real
+ BOT CHANGE nick-ant nick-nue [usuario [host [real]]]
+ BOT DEL nick
+
+ 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.
+
+ Nota:: no puedes crear un bot que tenga un nick que ya
+ este registrado. Si un usuario no registrado esta 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 %R%s set <nick> <hostmask>.
+HOST_SETALL_SYNTAX
+ Sintaxis %R%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: %R%s del <nick>.
+
+###########################################################################
+#
+# HostServ Help messages
+#
+###########################################################################
+HOST_OFF_UNREAL
+ Tu vhost ha sido removido. Para habilitar nuevamente el enmascaramiento de hosts tipea /mode %s +%s
+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_CMD_ON
+ ON Activa tu vhost asignado.
+
+HOST_HELP_CMD_OFF
+ OFF Desactiva tu vhost asignado.
+
+HOST_HELP_CMD_GROUP
+ GROUP Sincroniza vhost en todos los nicks del grupo.
+
+HOST_HELP_CMD_SET
+ SET Setea el vhost de otro usuario.
+HOST_HELP_CMD_SETALL
+ SETALL Setea el vhost de todos los nicks en un grupo.
+HOST_HELP_CMD_DEL
+ DEL Borra el vhost de otro usuario.
+HOST_HELP_CMD_DELALL
+ DELALL Borra el vhost de todos los nicks en un grupo.
+HOST_HELP_CMD_LIST
+ LIST Muestra uno o mas vhosts.
+
+HOST_OPER_HELP
+ not used.
+
+HOST_ADMIN_HELP
+ not used.
+
+HOST_HELP
+ Comandos para %S:
+
+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.
+
+OPER_SVSNICK_UNSUPPORTED
+ Lo siento, SVSNICK no esta disponible en esta red.
+
+OPER_SQLINE_UNSUPPORTED
+ Lo siento, SQLINE no esta disponible en esta red.
+
+OPER_SVSO_UNSUPPORTED
+ Lo siento, OLINE no esta disponible en esta red.
+
+OPER_UMODE_UNSUPPORTED
+ Lo siento, OLINE no esta disponible en esta red.
+
+OPER_SUPER_ADMIN_NOT_ENABLED
+ SuperAdmin setting not enabled in services.conf
+
diff --git a/lang/fr.l b/lang/fr.l
new file mode 100644
index 000000000..3ff6a5016
--- /dev/null
+++ b/lang/fr.l
@@ -0,0 +1,6948 @@
+# French language file.
+#
+# (C) 2003-2008 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
+#
+# Updated by illu@rs2i.net (04/09/2005)
+# irc.rs2i.net - http://www.rs2i.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 us know
+# (dev@anope.org) 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
+# services.conf). 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 "%R%s HELP" pour obtenir de l'aide.
+SYNTAX_ERROR
+ Syntaxe: %s
+MORE_INFO
+ Tapez %R%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 plus 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.
+INVALID_TARGET
+ "/msg %s" is no longer supported. Use "/msg %s@%s" or "/%s" instead.
+
+# 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
+ L'option RAW n'est pas active. Si vous voulez l'utiliser, desactiver l'option DisableRaw dans la configuration des services.
+
+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 pseudo), et ne doit pas contenir d'espaces ou de tabulations.
+PASSWORD_TOO_LONG
+ Your password is too long. Please try again with a shorter password.
+
+NICK_NOT_REGISTERED
+ Votre pseudo n'est pas enregistré.
+NICK_NOT_REGISTERED_HELP
+ Votre pseudo n'est pas enregistré. Tapez %R%s HELP pour des informations sur l'enregistrement des pseudos.
+NICK_X_IS_SERVICES
+ Le pseudo %s fait partie des services du réseau.
+NICK_X_NOT_REGISTERED
+ Le nick %s n'est pas enregistré.
+NICK_X_IN_USE
+ Le pseudo %s est déja utilisé.
+NICK_X_NOT_IN_USE
+ Le pseudo %s n'est actuellement pas utilisé.
+NICK_X_NOT_ON_CHAN
+ %s n'est actuelement pas sur %s.
+NICK_X_FORBIDDEN
+ Le pseudo %s ne peut être enregistré ou utilisé.
+NICK_X_FORBIDDEN_OPER
+ Le pseudo %s a été interdit par %s:
+ %s
+NICK_X_ILLEGAL
+ Le pseudo %s est un pseudo illégale et ne peut pas etre utilisé
+NICK_X_TRUNCATED
+ Le pseudo %s a été tronqué de %d caractères.
+NICK_X_SUSPENDED
+ Le pseudo %s est actuelement suspendu.
+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
+ Suspendu: [%s] %s
+NICK_IDENTIFY_REQUIRED
+ L'authentification par mot de passe est requise pour cette commande.
+ Réessayez après avoir tapé %R%s IDENTIFY motdepasse.
+CHAN_IDENTIFY_REQUIRED
+ L'authentification par mot de passe est requise pour cette commande.
+ Réessayez après avoir tapé %R%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, veuillez 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
+ Fin du %s list.
+
+###########################################################################
+#
+# NickServ messages
+#
+###########################################################################
+
+# Automatic messages
+LIST_INCORRECT_RANGE
+ Incorrect range specified. The correct syntax is #from-to.
+CS_LIST_INCORRECT_RANGE
+ To search for channels starting with #, search for the channel
+ name without the #-sign prepended (anope instead of #anope).
+
+###########################################################################
+#
+# NickServ messages
+#
+###########################################################################
+
+# Automatic messages
+HELP_LIMIT_SERV_OPER
+ Limited to Services Operators.
+HELP_LIMIT_SERV_ADMIN
+ Limited to Services Administrators.
+HELP_LIMIT_SERV_ROOT
+ Limited to Services Roots.
+HELP_LIMIT_IRC_OPER
+ Limited to IRC Operators.
+HELP_LIMIT_HOST_SETTER
+ Limited to Host Setters.
+HELP_LIMIT_HOST_REMOVER
+ Limited to Host Removers.
+
+###########################################################################
+#
+# NickServ messages
+#
+###########################################################################
+
+# Automatic messages
+NICK_IS_REGISTERED
+ Ce nick appartient à quelqu'un d'autre. Veuillez en changer.
+ (Si c'est votre nick, tapez %R%s IDENTIFY motdepasse.)
+NICK_IS_SECURE
+ Ce pseudo est enregistré et protégé. Si c'est votre pseudo,
+ tapez %R%s IDENTIFY motdepasse.
+ Sinon, veuillez choisir un pseudo différent.
+NICK_MAY_NOT_BE_USED
+ Ce pseudo 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 pseudo.
+FORCENICKCHANGE_IN_20_SECONDS
+ Si vous ne changez pas d'ici 20 secondes, je changerai votre pseudo.
+FORCENICKCHANGE_NOW
+ Ce pseudo a été enregistré, vous ne pouvez pas l'utiliser.
+FORCENICKCHANGE_CHANGING
+ Votre pseudo 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 pseudos 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 pseudo %s ne peut être enregistré.
+NICK_ALREADY_REGISTERED
+ Le pseudo %s est déjà enregistré!
+NICK_REGISTERED
+ Le pseudo %s est maintenant enregistré sous votre masque: %s
+NICK_REGISTERED_NO_MASK
+ Le pseudo %s est enregistré.
+NICK_PASSWORD_IS
+ Votre mot de passe est %s - notez le pour une utilisation ultérieure.
+
+# GROUP responses
+NICK_REG_DELAY
+ Vous devez rester connecté plus de %d secondes pour enregistrer votre pseudo.
+
+# GROUP responses
+NICK_GROUP_SYNTAX
+ GROUP cible motdepasse
+NICK_GROUP_DISABLED
+ Désolés, le groupage de pseudo est temporairement désactivé.
+NICK_GROUP_FAILED
+ Désolés, le groupage de pseudo a échoué.
+NICK_GROUP_PLEASE_WAIT
+ Attendez %d secondes avant d'utiliser la commande GROUP à nouveau.
+NICK_GROUP_CHANGE_DISABLED
+ Votre pseudo est déjà enregistré, tapez %R%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 pseudos dans le groupe de %s; listez-les et
+ effacez-en quelques uns.
+ Tapez %R%s HELP GLIST et %R%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 pseudo.
+ Cet e-mail vous permettra de retrouver votre mot de passe
+ au cas où vous le perdriez.
+NICK_IDENTIFY_EMAIL_HOWTO
+ Tapez %R%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
+ Vous êtes déjà identifié.
+
+# UPDATE responses
+NICK_UPDATE_SUCCESS
+ Status mis à jour (memos, vhost, modes, flags).
+
+# LOGOUT responses
+NICK_LOGOUT_SYNTAX
+ LOGOUT
+NICK_LOGOUT_SUCCEEDED
+ Votre pseudo n'est plus identifié.
+NICK_LOGOUT_X_SUCCEEDED
+ Le pseudo %s n'est plus identifié.
+
+# DROP responses
+NICK_LOGOUT_SERVICESADMIN
+ Vous ne pouvez pas logout %s parceque c'est un administrateur
+ des services.
+
+# DROP responses
+NICK_DROP_DISABLED
+ Désolés, l'effacement de pseudo est temporairement désactivé.
+NICK_DROPPED
+ Votre pseudo a été effacé.
+NICK_X_DROPPED
+ Le pseudo %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 pseudo est temporairement désactivée.
+NICK_SET_UNKNOWN_OPTION
+ L'option SET %s est inconnue.
+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 pseudo de votre groupe de pseudos!
+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 %R%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 pseudo est maintenant privé.
+NICK_SET_PRIVATE_OFF
+ Votre pseudo 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_HIDE_STATUS_ON
+ Votre status sera caché dans l'affichage de la commande INFO de %s.
+NICK_SET_HIDE_STATUS_OFF
+ Votre status sera affiché dans l'affichage de la commande INFO de %s.
+
+# SET MSG responses
+NICK_SET_MSG_SYNTAX
+ SET PRIVATE {ON | OFF}
+NICK_SET_MSG_ON
+ Les services vous repondrons avec des messages.
+NICK_SET_MSG_OFF
+ Les services vous repondrons avec des notice.
+
+# SET AUTOOP responses
+NICK_SET_AUTOOP_SYNTAX
+ SET AUTOOP {ON | OFF}
+NICK_SET_AUTOOP_ON
+ Services will now autoop you in channels.
+NICK_SET_AUTOOP_OFF
+ Services will no longer autoop you in channels.
+
+
+# SET NOEXPIRE responses
+NICK_SASET_SYNTAX
+ SASET pseudo option paramètres
+NICK_SASET_DISABLED
+ Désole, le changement d'options sur les pseudos est temporairement
+ désactivé.
+NICK_SASET_UNKNOWN_OPTION
+ Option SASET %s inconnue.
+NICK_SASET_BAD_NICK
+ Le pseudo %s n'est pas enregistré.
+NICK_SASET_OPTION_DISABLED
+ L'option %s ne peut pas configuré sur ce réseau.
+
+# SASET DISPLAY responses
+NICK_SASET_DISPLAY_INVALID
+ Le nouvel affichage pour %s DOIT etre un pseudo de son groupe!
+NICK_SASET_DISPLAY_CHANGED
+ Le nouvel affichage est maintenant %s.
+
+# SASET PASSWORD responses
+NICK_SASET_PASSWORD_FAILED
+ Désolé, impossible de changé le mot de passe pour %s.
+NICK_SASET_PASSWORD_CHANGED
+ Mot de passe changé pour %s.
+NICK_SASET_PASSWORD_CHANGED_TO
+ Le mot de passe pour %s a été changé en %s.
+
+# SASET LANGUAGE responses
+NICK_SASET_URL_CHANGED
+ L'URL pour %s a été changé en %s.
+NICK_SASET_URL_UNSET
+ L'URL %s a été effacé.
+
+# SASET EMAIL responses
+NICK_SASET_EMAIL_CHANGED
+ L'adresse E-mail pour %s a été changé en %s.
+NICK_SASET_EMAIL_UNSET
+ L'adresse E-mail pour %s a été effacé.
+NICK_SASET_EMAIL_UNSET_IMPOSSIBLE
+ Vous ne pouvez pas configurer d'E-mail sur ce réseau.
+
+# SASET ICQ responses
+NICK_SASET_ICQ_CHANGED
+ Le numéro ICQ pour %s a été changé en %s.
+NICK_SASET_ICQ_UNSET
+ Le numéro ICQ pour %s a été effacé.
+NICK_SASET_ICQ_INVALID
+ %s n'est pas un numéro ICQ valide.
+
+# SASET GREET responses
+NICK_SASET_GREET_CHANGED
+ Le message de greet pour %s a été changé en %s
+NICK_SASET_GREET_UNSET
+ Le message de greet de %s a été effacé.
+
+# SASET PROTECT responses
+NICK_SASET_KILL_SYNTAX
+ SASET pseudo KILL {ON | QUICK | OFF}
+NICK_SASET_KILL_IMMED_SYNTAX
+ SASET pseudo KILL {ON | QUICK | IMMED | OFF}
+NICK_SASET_KILL_ON
+ La protection est maintenant ACTIVE pour %s.
+NICK_SASET_KILL_QUICK
+ La protection est maintenant ACTIVE pour %s, avec un délais réduit.
+NICK_SASET_KILL_IMMED
+ La protection est maintenant ACTIVE pour %s, sans aucun délais.
+NICK_SASET_KILL_IMMED_DISABLED
+ L'option IMMED est pas accéssible sur ce réseau.
+NICK_SASET_KILL_OFF
+ La protection est maintenant INACTIVE pour %s.
+
+# SASET SECURE responses
+NICK_SASET_SECURE_SYNTAX
+ SASET pseudo SECURE {ON | OFF}
+NICK_SASET_SECURE_ON
+ L'option sécurité est maintenant ACTIVE pour %s.
+NICK_SASET_SECURE_OFF
+ L'option de sécurité est maintenant INACTIVE pour %s.
+
+# SASET PRIVATE responses
+NICK_SASET_PRIVATE_SYNTAX
+ SASET pseudo PRIVATE {ON | OFF}
+NICK_SASET_PRIVATE_ON
+ L'option privé est maintenant ACTIVE pour %s.
+NICK_SASET_PRIVATE_OFF
+ L'option privé est maintenant INACTIVE pour %s.
+
+# SASET HIDE responses
+NICK_SASET_HIDE_SYNTAX
+ SET pseudo HIDE {EMAIL | USERMASK | QUIT} {ON | OFF}
+NICK_SASET_HIDE_EMAIL_ON
+ L'adresse E-mail de %s sera caché dans la commande INFO de %s.
+NICK_SASET_HIDE_EMAIL_OFF
+ L'adresse email de %s sera maintenant affiché dans la commande INFO de %s.
+NICK_SASET_HIDE_MASK_ON
+ Le dernier masque user@host de %s sera maintenant caché dans la commande INFO
+ de %s.
+NICK_SASET_HIDE_MASK_OFF
+ Le dernier masque user@host de %s sera maintenant affiché dans la commande INFO
+ de %s.
+NICK_SASET_HIDE_QUIT_ON
+ Le dernier message de quit de %s ne sera plus affiché dans la commande INFO de %s.
+NICK_SASET_HIDE_QUIT_OFF
+ Le dernier message de quit de %s sera affiché dans la commande INFO de %s.
+NICK_SASET_HIDE_STATUS_ON
+ Le status sur les services de %s sera maintenant caché dans la commande INFO de %s.
+NICK_SASET_HIDE_STATUS_OFF
+ Le status sur les services de %s sera maintenant affiché dans la commande INFO de %s.
+
+# SASET MSG responses
+NICK_SASET_MSG_SYNTAX
+ SASET pseudo PRIVATE {ON | OFF}
+NICK_SASET_MSG_ON
+ Les services repondront à %s par des messages.
+NICK_SASET_MSG_OFF
+ Les services repondront à %s par des notices.
+
+# SET NOEXPIRE responses
+NICK_SASET_NOEXPIRE_SYNTAX
+ SASET pseudo NOEXPIRE {ON | OFF}
+NICK_SASET_NOEXPIRE_ON
+ Le pseudo %s n'expirera pas.
+NICK_SASET_NOEXPIRE_OFF
+ Le pseudo %s expirera.
+
+# ACCESS responses
+NICK_SASET_AUTOOP_SYNTAX
+ SASET nickname AUTOOP {ON | OFF}
+NICK_SASET_AUTOOP_ON
+ Services will now autoop %s in channels.
+NICK_SASET_AUTOOP_OFF
+ Services will no longer autoop %s in channels.
+
+# SASET LANGUAGE responses
+NICK_SASET_LANGUAGE_SYNTAX
+ SASET nickname LANGUAGE number
+NICK_SASET_LANGUAGE_UNKNOWN
+ Unknown language number %d. Type %R%s HELP SET LANGUAGE for a list of languages.
+NICK_SASET_LANGUAGE_CHANGED
+ Language changed to French.
+
+
+# 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:
+NICK_ACCESS_LIST_EMPTY
+ Votre liste d'accès est vide.
+NICK_ACCESS_LIST_X_EMPTY
+ La liste d'accès de %s est vide.
+
+# Status messages
+NICK_STATUS_0
+ STATUS %s 0
+NICK_STATUS_1
+ STATUS %s 1
+NICK_STATUS_2
+ STATUS %s 2
+NICK_STATUS_3
+ STATUS %s 3
+
+# INFO responses
+NICK_INFO_SYNTAX
+ INFO pseudo [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_SERVICES_ROOT
+ %s est un services root.
+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_VHOST2
+ vhost: %s@%s
+NICK_INFO_ICQ
+ Numéro ICQ: %d
+NICK_INFO_GREET
+ Message d'accueil: %s
+NICK_INFO_OPTIONS
+ Options: %s
+NICK_INFO_EXPIRE
+ Expire le: %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_AUTOOP
+ Auto-op
+NICK_INFO_OPT_NONE
+ Aucune
+NICK_INFO_NO_EXPIRE
+ Ce nick n'expirera pas.
+NICK_INFO_FOR_MORE
+ Pour plus d'informations, tapez %R%s INFO %s ALL.
+
+# LIST responses
+NICK_INFO_SUSPENDED
+ Ce pseudo est actuelement suspendu, raison: %s
+NICK_INFO_SUSPENDED_NO_REASON
+ Ce pseudo est actuelement suspendu.
+
+
+# LIST responses
+NICK_LIST_SYNTAX
+ LIST modèle
+NICK_LIST_SERVADMIN_SYNTAX
+ LIST modèle [FORBIDDEN] [SUSPENDED] [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 pseudo
+NICK_ALIST_HEADER
+ Liste des cannaux auquels vous avez accès:
+ Num Canal Level Description
+NICK_ALIST_HEADER_X
+ Liste des cannaux auquels %s a accès:
+ Num Canal 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 pseudos dans votre groupe:
+NICK_GLIST_HEADER_X
+ Liste des pseudos dans le groupe de %s:
+NICK_GLIST_FOOTER
+ %d pseudos dans le groupe.
+NICK_GLIST_REPLY
+ %c%s
+NICK_GLIST_REPLY_ADMIN
+ %c%s (expire le %s)
+
+# RECOVER responses
+NICK_RECOVER_SYNTAX
+ RECOVER pseudo [motdepasse]
+NICK_NO_RECOVER_SELF
+ Vous ne pouvez utiliser RECOVER sur vous-même!
+NICK_RECOVERED
+ L'utilisateur se servant de votre pseudo a été déconnecté.
+ %R%s RELEASE %s pour le récupérer avant que la %s ne s'écoule.
+
+# RELEASE responses
+NICK_RELEASE_SYNTAX
+ RELEASE pseudo [motdepasse]
+NICK_RELEASE_NOT_HELD
+ Le pseudo %s n'est pas en tutelle.
+NICK_RELEASED
+ La tutelle des Services sur votre pseudo a été enlevée.
+
+# GHOST responses
+NICK_GHOST_SYNTAX
+ GHOST pseudo [motdepasse]
+NICK_NO_GHOST_SELF
+ Vous ne pouvez utiliser GHOST sur vous-même!
+NICK_GHOST_KILLED
+ L'utilisateur fantôme utilisant votre pseudo a été déconnecté.
+
+# GETPASS responses
+NICK_GETPASS_SYNTAX
+ GETPASS pseudo
+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 Pas de WildCards!!
+NICK_GETEMAIL_EMAILS_ARE
+ Emails trouvés %s pour %s.
+NICK_GETEMAIL_NOT_USED
+ Aucun Emails listé pour %s.
+
+# SENDPASS responses
+NICK_SENDPASS_SYNTAX
+ SENDPASS pseudo
+NICK_SENDPASS_UNAVAILABLE
+ La commande SENDPASS est indisponible car l'encryption est utilisée.
+NICK_SENDPASS_SUBJECT
+ Mot de passe du pseudo %s
+NICK_SENDPASS_HEAD
+ Bonjour,
+NICK_SENDPASS_LINE_1
+ Vous avez demandé à recevoir le mot de passe du pseudo %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_SUSPEND_SYNTAX
+ SUSPEND pseudo raison
+NICK_SUSPEND_SUCCEEDED
+ Le pseudo %s est suspendu.
+NICK_SUSPEND_FAILED
+ Impossible de suspend le pseudo %s!
+
+# UNSUSPEND responses
+NICK_UNSUSPEND_SYNTAX
+ UNSUSPEND pseudo
+NICK_UNSUSPEND_SUCCEEDED
+ Le pseudo %s est liberé.
+NICK_UNSUSPEND_FAILED
+ Impossible de liberer le pseudo %s!
+
+# FORBID responses
+NICK_FORBID_SYNTAX
+ FORBID pseudo [raison]
+NICK_FORBID_SYNTAX_REASON
+ FORBID pseudo raison
+NICK_FORBID_SUCCEEDED
+ Le pseudo %s est désormais interdit.
+NICK_FORBID_FAILED
+ Impossible d'interdire le pseudo %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 %R%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: "%R%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 " %R%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_X_INVALID
+ Channel %s is not a valid channel.
+
+# REGISTER responses
+CHAN_REGISTER_SYNTAX
+ REGISTER canal motdepasse description
+CHAN_REGISTER_DISABLED
+ Désolés, l'enregistrement des cannaux est temporairement désactivé.
+CHAN_REGISTER_NOT_LOCAL
+ Les cannaux locaux ne peuvent être enregistrés.
+CHAN_MUST_REGISTER_NICK
+ Vous devez d'abord enregistrer votre pseudo. Tapez %R%s HELP pour savoir comment enregistrer votre pseudo.
+CHAN_MUST_IDENTIFY_NICK
+ Vous devez d'abord vous identifier avec %s, en utilisant la commande:
+ %R%s IDENTIFY motdepasse
+CHAN_MAY_NOT_BE_REGISTERED
+ Le canal %s ne peut être enregistré.
+CHAN_ALREADY_REGISTERED
+ Le canal %s est déjà enregistré!
+CHAN_MUST_BE_CHANOP
+ Vous devez être un opérateur du canal pour l'enregistrer.
+CHAN_REACHED_CHANNEL_LIMIT
+ Désolés, vous avez déjà atteint votre limite de %d canaux.
+CHAN_EXCEEDED_CHANNEL_LIMIT
+ Désolés, vous avez déjà dépassé votre limite de %d canaux.
+CHAN_REGISTRATION_FAILED
+ Désolés, l'enregistrement a échoué.
+CHAN_REGISTERED
+ Le canal %s a été enregistré sous votre pseudo: %s
+CHAN_PASSWORD_IS
+ Le mot de passe du canal est %s - notez le pour une utilisation ultérieure.
+CHAN_REGISTER_NONE_CHANNEL
+ Vous avez essayé d'enregistrer le canal %s qui n'éxiste pas.
+CHAN_SYMBOL_REQUIRED
+ Veuillez utiliser les symbole # quand vous voulez enregistrer
+ un canal.
+
+# IDENTIFY responses
+CHAN_IDENTIFY_SYNTAX
+ IDENTIFY canal 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 canal pseudo
+CHAN_LOGOUT_SERVADMIN_SYNTAX
+ LOGOUT canal [pseudo]
+CHAN_LOGOUT_SUCCEEDED
+ L'utilisateur %s n'est plus identifié pour le canal %s.
+CHAN_LOGOUT_ALL_SUCCEEDED
+ Tous les utilisateurs identifiés au canal %s ne le sont plus (except the channel founder).
+CHAN_LOGOUT_FOUNDER_FAILED
+ You may not log out of %s (you are founder).
+
+# DROP responses
+CHAN_DROP_SYNTAX
+ DROP canal
+CHAN_DROP_DISABLED
+ Désolés, l'effacement de canaux est temporairement désactivé.
+CHAN_DROPPED
+ Le canal %s a été effacé.
+
+# SET responses
+CHAN_SET_SYNTAX
+ SET canal option paramètres
+CHAN_SET_DISABLED
+ Désolés, la configuration des options du canal 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 canal %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 garder le mode +l pour en faire autant avec le mode +L.
+CHAN_SET_MLOCK_K_REQUIRED
+ Vous devez faire garder le mode +i pour en faire autant avec le mode +K.
+CHAN_MLOCK_CHANGED
+ Les modes maintenus du canal %s sont maintenant %s.
+
+# SET KEEPTOPIC responses
+CHAN_SET_KEEPTOPIC_SYNTAX
+ SET canal KEEPTOPIC {ON | OFF}
+CHAN_SET_KEEPTOPIC_ON
+ Le maintient du topic est maintenant ACTIF sur %s.
+CHAN_SET_KEEPTOPIC_OFF
+ Le maintient du topic est maintenant INACTIF sur %s.
+
+# SET TOPICLOCK responses
+CHAN_SET_TOPICLOCK_SYNTAX
+ SET canal TOPICLOCK {ON | OFF}
+CHAN_SET_TOPICLOCK_ON
+ Le vérouillage du topic pour %s est maintenant ACTIF.
+CHAN_SET_TOPICLOCK_OFF
+ Le vérouillage du topic pour %s est maintenant INACTIF.
+
+# SET PEACE responses
+CHAN_SET_PEACE_SYNTAX
+ SET canal PEACE {ON | OFF}
+CHAN_SET_PEACE_ON
+ Le mode 'paix' est ACTIF pour %s.
+CHAN_SET_PEACE_OFF
+ Le mode 'paix' est INACTIF pour %s.
+
+# SET PRIVATE responses
+CHAN_SET_PRIVATE_SYNTAX
+ SET canal PRIVATE {ON | OFF}
+CHAN_SET_PRIVATE_ON
+ L'option privé pour %s est maintenant ACTIVE.
+CHAN_SET_PRIVATE_OFF
+ L'option privé pour %s est maintenant INACTIVE.
+
+# SET SECUREOPS responses
+CHAN_SET_SECUREOPS_SYNTAX
+ SET canal SECUREOPS {ON | OFF}
+CHAN_SET_SECUREOPS_ON
+ La sécurité des ops pour %s est maintenant ACTIVE.
+CHAN_SET_SECUREOPS_OFF
+ La sécurité des ops sur %s est maintenant INACTIVE.
+
+# SET SECUREFOUNDER responses
+CHAN_SET_SECUREFOUNDER_SYNTAX
+ SET canal SECUREFOUNDER {ON | OFF}
+CHAN_SET_SECUREFOUNDER_ON
+ L'option de sécurité du propriétaire pour %s est ACTIVE.
+CHAN_SET_SECUREFOUNDER_OFF
+ L'option de sécurité du propriétaire pour %s est INACTIVE.
+
+# SET RESTRICTED responses
+CHAN_SET_RESTRICTED_SYNTAX
+ SET canal RESTRICTED {ON | OFF}
+CHAN_SET_RESTRICTED_ON
+ Les restrictions d'accès pour %s sont maintenant ACTIVES.
+CHAN_SET_RESTRICTED_OFF
+ Les restrictions d'accès pour %s sont maintenant INACTIVES.
+
+# SET SECURE responses
+CHAN_SET_SECURE_SYNTAX
+ SET canal SECURE {ON | OFF}
+CHAN_SET_SECURE_ON
+ L'option de sécurité pour %s est ACTIVE.
+CHAN_SET_SECURE_OFF
+ L'option de sécurité pour %s est INACTIVE.
+
+# SET SIGNKICK responses
+CHAN_SET_SIGNKICK_SYNTAX
+ SET canal SIGNKICK {ON | LEVEL | OFF}
+CHAN_SET_SIGNKICK_ON
+ Les kicks seront maintenant signé sur %s.
+CHAN_SET_SIGNKICK_LEVEL
+ Les kicks seront maintenant signé sur %s en fonction de
+ l'accès de l'user sur le canal.
+CHAN_SET_SIGNKICK_OFF
+ Les kicks ne seront plus signé sur %s.
+
+# SET OPNOTICE responses
+CHAN_SET_OPNOTICE_SYNTAX
+ SET canal OPNOTICE {ON | OFF}
+CHAN_SET_OPNOTICE_ON
+ L'option 'op-notice' est maintenant ACTVE sur %s.
+CHAN_SET_OPNOTICE_OFF
+ L'option 'op-notice' est maintenant INACTIVE sur
+ %s.
+
+# SET OPNOTICE responses
+CHAN_SET_XOP_SYNTAX
+ SET canal XOP {ON | OFF}
+CHAN_SET_XOP_ON
+ Le système de xOP est maintenant ACTIF sur %s.
+CHAN_SET_XOP_OFF
+ Le système de xOP est maintenant INACTIF sur %s.
+
+# SET NOEXPIRE responses
+CHAN_SET_NOEXPIRE_SYNTAX
+ SET canal NOEXPIRE {ON | OFF}
+CHAN_SET_NOEXPIRE_ON
+ Le canal %s n'expirera pas.
+CHAN_SET_NOEXPIRE_OFF
+ Le canal %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 canal.
+CHAN_XOP_LIST_FORMAT
+ %3d %s
+CHAN_XOP_ACCESS
+ Vous ne pouvez pas utiliser cette commande.
+ Utilisez la commandes ACCESS à la place.
+ Tapez %R%s HELP ACCESS pour plus d'informations.
+CHAN_XOP_NOT_AVAILABLE
+ xOP system is not available.
+
+# AOP messages
+CHAN_AOP_SYNTAX
+ AOP canal {ADD|DEL|LIST|CLEAR} [pseudo [level] | liste-d'entrées]
+CHAN_AOP_DISABLED
+ Désolés, la modification des listes des AOPs des canaux est temporairement désactivée.
+CHAN_AOP_NICKS_ONLY
+ Les listes des AOPs des canaux ne peuvent contenir que des pseudos enregistrés.
+CHAN_AOP_ADDED
+ %s ajouté à la liste des AOPs de %s.
+CHAN_AOP_MOVED
+ %s a été bougé dans la liste des AOPs de %s.
+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 Pseudo
+CHAN_AOP_CLEAR
+ La liste des AOPs de %s est maintenant vide.
+
+# HOP messages
+CHAN_HOP_SYNTAX
+ HOP canal {ADD|DEL|LIST|CLEAR} [pseudo [level] | liste-d'entrées]
+CHAN_HOP_DISABLED
+ Désolés, la modification des listes des HOPs des canaux est temporairement désactivée.
+CHAN_HOP_NICKS_ONLY
+ Les listes des HOPs des cannaux ne peuvent contenir que des pseudos enregistrés.
+CHAN_HOP_ADDED
+ %s ajouté à la liste des HOPs de %s.
+CHAN_HOP_MOVED
+ %s a été bougé dans la liste des HOPs de %s.
+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 Pseudo
+CHAN_HOP_CLEAR
+ La liste des HOPs de %s est maintenant vide.
+
+# SOP messages
+CHAN_SOP_SYNTAX
+ SOP canal {ADD|DEL|LIST|CLEAR} [pseudo [level] | liste-d'entrées]
+CHAN_SOP_DISABLED
+ Désolés, la modification des listes des SOPs des cannaux est temporairement désactivée.
+CHAN_SOP_NICKS_ONLY
+ Les listes des SOPs des cannaux ne peuvent contenir que des pseudos enregistrés.
+CHAN_SOP_ADDED
+ %s ajouté à la liste des SOPs de %s.
+CHAN_SOP_MOVED
+ %s a été bougé dans la liste des SOPs de %s.
+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 Pseudo
+CHAN_SOP_CLEAR
+ La liste des SOPs de %s est maintenant vide.
+
+# VOP messages
+CHAN_VOP_SYNTAX
+ VOP canal {ADD|DEL|LIST|CLEAR} [pseudo [level] | liste-d'entrées]
+CHAN_VOP_DISABLED
+ Désolés, la modification des listes des VOPs des canaux est temporairement désactivée.
+CHAN_VOP_NICKS_ONLY
+ Les listes des VOPs des canaux ne peuvent contenir que des pseudos enregistrés.
+CHAN_VOP_ADDED
+ %s ajouté à la liste des VOPs de %s.
+CHAN_VOP_MOVED
+ %s a été bougé dans la liste des VOPs de %s.
+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 Pseudo
+CHAN_VOP_CLEAR
+ La liste des VOPs de %s est maintenant vide.
+
+# ACCESS messages
+CHAN_ACCESS_SYNTAX
+ ACCESS canal {ADD|DEL|LIST|CLEAR} [pseudo [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 %R%s HELP commande pour plus d'informations.
+CHAN_ACCESS_XOP_HOP
+ You can't use this command.
+ Use the AOP, SOP, HOP and VOP commands instead.
+ Type %R%s HELP command for more information.
+CHAN_ACCESS_DISABLED
+ Désolés, la modification des listes d'accès des canaux 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 canaux ne peuvent contenir que des pseudos 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 canal.
+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 Pseudo
+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 de %s est maintenant vide.
+
+# AKICK responses
+CHAN_AKICK_SYNTAX
+ AKICK canal {ADD | STICK | UNSTICK | DEL | LIST | VIEW | ENFORCE | CLEAR} [pseudo-ou-usermask]
+CHAN_AKICK_DISABLED
+ Désolés, la modification de la liste de kicks automatiques du canal
+ 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 canal.
+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 de %s est maintenant vide.
+
+# LEVELS responses
+CHAN_LEVELS_SYNTAX
+ LEVELS canal {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 %R%s HELP LEVELS DESC pour une
+ liste d'options valides.
+CHAN_LEVELS_DISABLED
+ Le level %s est maintenant désactivé sur le canal %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.
+
+# Status Messages
+CHAN_STATUS_SYNTAX
+ ERREUR STATUS : Erreur de syntaxe.
+CHAN_STATUS_NOT_REGGED
+ ERREUR STATUS : Le canal %s n'est pas enregistré.
+CHAN_STATUS_FORBIDDEN
+ ERREUR STATUS : Le canal %s est FORBID.
+CHAN_STATUS_NOTONLINE
+ ERREUR STATUS : Le pseudo %s n'est pas connecté.
+CHAN_STATUS_INFO
+ STATUS %s %s %d
+
+# INFO responses
+CHAN_INFO_SYNTAX
+ INFO canal [ALL]
+CHAN_INFO_HEADER
+ Informations pour le canal %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_EXPIRE
+ Expires in: %s
+CHAN_INFO_NO_EXPIRE
+ Ce canal n'expirera pas.
+
+# LIST responses
+CHAN_LIST_SYNTAX
+ LIST modèle
+CHAN_LIST_SERVADMIN_SYNTAX
+ LIST modèle [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 canal
+
+# UNBAN responses
+CHAN_UNBAN_SYNTAX
+ UNBAN canal
+CHAN_UNBANNED
+ Vous avez été débanni de %s.
+
+# TOPIC responses
+CHAN_TOPIC_SYNTAX
+ TOPIC canal [topic]
+
+# CLEAR responses
+CHAN_CLEAR_SYNTAX
+ CLEAR canal raison
+CHAN_CLEARED_BANS
+ Tous les bans du canal %s ont été supprimés.
+CHAN_CLEARED_EXCEPTS
+ Tous les excepts du canal %s ont été supprimés.
+CHAN_CLEARED_MODES
+ Tous les modes du canal %s ont été réinitialisés.
+CHAN_CLEARED_OPS
+ Tous les ops du canal %s ont été enlevés.
+CHAN_CLEARED_HOPS
+ Tous les halfop du canal %s ont été enlevés.
+CHAN_CLEARED_VOICES
+ Tous les voices du canal %s ont été enlevés.
+CHAN_CLEARED_USERS
+ Tous les utilisateurs du canal %s ont été kickés.
+CHAN_CLEARED_INVITES
+ Toutes les invites du canal %s ont été enlevés.
+
+# GETPASS responses
+CHAN_GETPASS_SYNTAX
+ GETPASS canal
+CHAN_GETPASS_UNAVAILABLE
+ La commande GETPASS est indisponible car l'encryption est utilisée.
+CHAN_GETPASS_PASSWORD_IS
+ Le mot de passe du canal %s est %s.
+
+# SENDPASS responses
+CHAN_GETKEY_SYNTAX
+ GETKEY canal
+CHAN_GETKEY_NOKEY
+ Le canal %s n'a pas de clé.
+CHAN_GETKEY_KEY
+ KEY %s %s
+
+# SENDPASS responses
+CHAN_SENDPASS_SYNTAX
+ SENDPASS canal
+CHAN_SENDPASS_UNAVAILABLE
+ La commande SENDPASS est indisponible car l'encryption est utilisée.
+CHAN_SENDPASS_SUBJECT
+ Mot de passe du canal %s
+CHAN_SENDPASS_HEAD
+ Bonjour,
+CHAN_SENDPASS_LINE_1
+ Vous avez demandé à recevoir le mot de passe du canal %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 canal [raison]
+CHAN_FORBID_SYNTAX_REASON
+ FORBID canal raison
+CHAN_FORBID_SUCCEEDED
+ Le canal %s est maintenant interdit.
+CHAN_FORBID_FAILED
+ Impossible d'interdire le canal %s!
+
+# Misc responses
+CHAN_FORBID_REASON
+ Ce canal a été FORBID.
+
+# SUSPEND responses
+CHAN_SUSPEND_SYNTAX
+ SUSPEND canal [raison]
+CHAN_SUSPEND_SYNTAX_REASON
+ SUSPEND canal raison
+CHAN_SUSPEND_SUCCEEDED
+ Le canal %s est maintenant suspendu.
+CHAN_SUSPEND_FAILED
+ Impossible de suspendre le canal %s!
+CHAN_SUSPEND_REASON
+ Ce canal est suspendu.
+
+# UNSUSPEND responses
+CHAN_UNSUSPEND_SYNTAX
+ UNSUSPEND canal
+CHAN_UNSUSPEND_ERROR
+ Aucun # trouvé devant le nom du canal.
+CHAN_UNSUSPEND_SUCCEEDED
+ Le canal %s est maintenant liberé.
+CHAN_UNSUSPEND_FAILED
+ Impossible de liberer le canal %s!
+
+# Misc responses
+CHAN_EXCEPTED
+ %s a trouvé un except sur %s et ne peut le bannir tant que l'except n'a pas été retiré.
+
+###########################################################################
+#
+# 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 %R%s READ LAST pour le lire.
+MEMO_TYPE_READ_NUM
+ Tapez %R%s READ %d pour le lire.
+MEMO_TYPE_LIST_NEW
+ Tapez %R%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 %R%s READ %s %d pour le lire.
+MEMO_NEW_MEMO_ARRIVED
+ Vous avez un nouveau memo de %s.
+ Tapez %R%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 {pseudo | canal} 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
+ Un mass memo a été envoyé a tout les pseudos enregistrés.
+
+# CANCEL responses
+MEMO_CANCEL_SYNTAX
+ CANCEL {pseudo | canal}
+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 [canal] [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: %R%s READ num
+MEMO_LIST_NEW_MEMOS
+ Nouveaux memos pour %s. Pour lire, tapez: %R%s READ num
+MEMO_LIST_CHAN_MEMOS
+ Memos pour %s. Pour lire, tapez: %R%s READ %s num
+MEMO_LIST_CHAN_NEW_MEMOS
+ Nouveaux memos pour %s. Pour lire, tapez: %R%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 [canal] {liste | LAST | NEW}
+MEMO_HEADER
+ Memo %d de %s (%s). Pour supprimer, tapez: %R%s DEL %d
+MEMO_CHAN_HEADER
+ Memo %d de %s (%s). Pour supprimer, tapez: %R%s DEL %s %d
+MEMO_TEXT
+ %s
+
+# DEL responses
+MEMO_DEL_SYNTAX
+ DEL [canal] {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_NOTIFY_MAIL
+ Vous serez maintenant averti par mail de l'arrivé de nouveau(x) memo(s).
+MEMO_SET_NOTIFY_NOMAIL
+ Vous ne serez plus averti par mail de l'arrivé de nouveau(x) memo(s).
+MEMO_SET_NOTIFY_INVALIDMAIL
+ Vous n'avez configurer aucune adresse email pour votre pseudo.
+
+# SET LIMIT responses
+MEMO_SET_LIMIT_SYNTAX
+ SET LIMIT [canal] limite
+MEMO_SET_LIMIT_SERVADMIN_SYNTAX
+ SET LIMIT [utilisateur | canal] {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 [canal]
+MEMO_INFO_SERVADMIN_SYNTAX
+ INFO [pseudo | canal]
+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
+MEMO_MAIL_SUBJECT
+ Nouveau memo
+MEMO_MAIL_TEXT1
+ Bonjour %s,
+MEMO_MAIL_TEXT2
+ Vous venez de recevoir un memo de %s. Le numéro de ce memo est %d.
+MEMO_MAIL_TEXT3
+ Memo:
+
+###########################################################################
+#
+# BotServ messages
+#
+###########################################################################
+
+# Standard responses
+MEMO_RSEND_PLEASE_WAIT
+ Veuillez attendre %d secondes avant d'utiliser RSEND à nouveau.
+MEMO_RSEND_DISABLED
+ Désolé, RSEND est désactivé sur ce réseau.
+MEMO_RSEND_SYNTAX
+ RSEND {pseudo | canal} memo-text
+MEMO_RSEND_NICK_MEMO_TEXT
+ [auto-memo] Le memo que vous avez envoyé a été vu.
+MEMO_RSEND_CHAN_MEMO_TEXT
+ [auto-memo] Le memo que vous avez envoyé a %s a été vu.
+MEMO_RSEND_USER_NOTIFICATION
+ Un accusé de reception a été envoyé a %s pour l'informer que vous avez lu son
+ memo.
+
+###########################################################################
+#
+# BotServ messages
+#
+###########################################################################
+
+# Standard responses
+MEMO_CHECK_SYNTAX
+ CHECK pseudo
+MEMO_CHECK_NOT_READ
+ Le dernier mémo que vous avez envoyé à %s (le %s) n'a pas encore été lu.
+MEMO_CHECK_READ
+ Le dernier mémo que vous avez envoyé à %s (le %s) a été lu.
+MEMO_CHECK_NO_MEMO
+ Le pseudo %s n'a aucun memo de votre part.
+
+###########################################################################
+#
+# BotServ messages
+#
+###########################################################################
+
+# Standard responses
+MEMO_NO_RSEND_SELF
+ Vous ne pouvez pas recevoir d'accusé de reception quand vous vous
+ ètes envoyé un message a vous meme.
+
+###########################################################################
+#
+# BotServ messages
+#
+###########################################################################
+
+# Standard responses
+BOT_DOES_NOT_EXIST
+ Le bot %s n'existe pas.
+BOT_NOT_ASSIGNED
+ Vous devez attribuer un bot au canal avant d'utiliser
+ cette commande.
+ Tapez %R%S HELP ASSIGN pour plus d'informations.
+BOT_NOT_ON_CHANNEL
+ Le bot n'est pas sur le canal %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 pseudo user host real
+ BOT CHANGE ancien-pseudo nouveau-pseudo [user [host [real]]]
+ BOT DEL pseudo
+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 canal pseudo
+BOT_ASSIGN_READONLY
+ Désolés, l'attribution des bots est temporairement désactivée.
+BOT_ASSIGN_ALREADY
+ Le bot %s est déja assigné au canal %s.
+BOT_ASSIGN_ASSIGNED
+ Le bot %s a été attribué à %s.
+
+# UNASSIGN responses
+BOT_UNASSIGN_SYNTAX
+ UNASSIGN canal
+BOT_UNASSIGN_UNASSIGNED
+ Il n'y a plus de bot attribué à %s.
+
+# INFO responses
+BOT_INFO_SYNTAX
+ INFO {canal | pseudo}
+BOT_INFO_NOT_FOUND
+ %s n'est pas un bot ou canal 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 canal 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 %R%S HELP SET pour plus d'informations.
+
+# SET DONTKICKOPS messages
+BOT_SET_DONTKICKOPS_SYNTAX
+ SET canal DONTKICKOPS {ON|OFF}
+BOT_SET_DONTKICKOPS_ON
+ Le bot ne kickera pas les ops du canal %s.
+BOT_SET_DONTKICKOPS_OFF
+ Le bot kickera les ops du canal %s.
+
+# SET DONTKICKVOICES messages
+BOT_SET_DONTKICKVOICES_SYNTAX
+ SET canal DONTKICKVOICES {ON|OFF}
+BOT_SET_DONTKICKVOICES_ON
+ Le bot ne kickera pas les voices du canal %s.
+BOT_SET_DONTKICKVOICES_OFF
+ Le bot kickera les voices du canal %s.
+
+# SET FANTASY messages
+BOT_SET_FANTASY_SYNTAX
+ SET canal FANTASY {ON|OFF}
+BOT_SET_FANTASY_ON
+ La fantaisie est maintenant activée sur le canal %s.
+BOT_SET_FANTASY_OFF
+ La fantaisie est maintenant désactivée sur le canal %s.
+
+# SET GREET messages
+BOT_SET_GREET_SYNTAX
+ SET canal GREET {ON|OFF}
+BOT_SET_GREET_ON
+ Le message d'accueil est maintenant activé sur le canal %s.
+BOT_SET_GREET_OFF
+ Le message d'accueil est maintenant désactivé sur le canal %s.
+
+# SET NOBOT
+BOT_SET_NOBOT_SYNTAX
+ SET canal NOBOT {ON|OFF}
+BOT_SET_NOBOT_ON
+ Le mode sans bot est maintenant activé sur le canal %s.
+BOT_SET_NOBOT_OFF
+ Le mode sans bot est maintenant désactivé sur le canal %s.
+
+# SET PRIVATE
+BOT_SET_PRIVATE_SYNTAX
+ SET canal 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 canal SYMBIOSIS {ON|OFF}
+BOT_SET_SYMBIOSIS_ON
+ La symbiose est maintenant activée sur le canal %s.
+BOT_SET_SYMBIOSIS_OFF
+ La symbiose est maintenant désactivée sur le canal %s.
+
+# KICK responses
+BOT_KICK_SYNTAX
+ KICK canal 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 %R%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 canal {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 canal texte
+
+# ACT responses
+BOT_ACT_SYNTAX
+ ACT canal texte
+
+###########################################################################
+#
+# OperServ messages
+#
+###########################################################################
+
+# General messages
+BOT_EXCEPT
+ Utilisateur trouvé dans les excepts.
+
+###########################################################################
+#
+# OperServ messages
+#
+###########################################################################
+
+# General messages
+BOT_BAD_NICK
+ Les pseudos des bots ne peuvent contenir que des caractéres valide.
+BOT_BAD_HOST
+ Les hosts des bots doivent contenir uniquement des caractéres valide.
+BOT_BAD_IDENT
+ Les identds des bots doivent contenir que des caractères valide.
+BOT_LONG_IDENT
+ Bot Idents may only contain %d characters.
+BOT_LONG_HOST
+ Bot Hosts may only contain %d 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 inconnue %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_HOSTSERV_MEM
+ HostServ : %6d enregistrements, %5d ko
+OPER_STATS_OPERSERV_MEM
+ OperServ : %6d enregistrements, %5d ko
+OPER_STATS_SESSIONS_MEM
+ Sessions : %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_STATS_UPLINK_SERVER
+ Connecté à: %s
+OPER_STATS_UPLINK_CAPAB
+ Caractéristiques du link: %s
+OPER_STATS_UPLINK_SERVER_COUNT
+ Serveurs trouvés: %d
+
+# MODE responses
+OPER_MODE_SYNTAX
+ MODE canal modes
+
+# CLEARMODES responses
+OPER_UMODE_SYNTAX
+ UMODE pseudo 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 pseudo 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 canal [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 canal utilisateur raison
+
+# ADMIN responses
+OPER_SVSNICK_SYNTAX
+ SVSNICK pseudo nouveau-pseudo
+OPER_SVSNICK_NEWNICK
+ Le pseudo de %s a été changé en %s.
+
+# ADMIN responses
+OPER_ADMIN_SYNTAX
+ ADMIN {ADD|DEL|LIST|CLEAR} [pseudo | 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 Pseudo
+OPER_ADMIN_LIST_FORMAT
+ %3d %s
+OPER_ADMIN_CLEAR
+ La liste des Services admins a été vidée.
+OPER_ADMIN_MOVED
+ %s a été retiré de la liste des services admins.
+
+# OPER responses
+OPER_OPER_SYNTAX
+ OPER {ADD|DEL|LIST|CLEAR} [pseudo | 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 oper.
+OPER_OPER_REACHED_LIMIT
+ Vous ne pouvez avoir que %d Services oper.
+OPER_OPER_ADDED
+ %s a été ajouté à la liste des Services oper.
+OPER_OPER_NOT_FOUND
+ %s est introuvable sur la liste des Services oper.
+OPER_OPER_NO_MATCH
+ Aucune entrée correspondante sur la liste des Services oper.
+OPER_OPER_DELETED
+ %s a été supprimé de la liste des Services oper.
+OPER_OPER_DELETED_ONE
+ 1 entrée a été supprimée de la liste des Services oper.
+OPER_OPER_DELETED_SEVERAL
+ %d entrées ont été supprimées de la liste des Services oper.
+OPER_OPER_LIST_EMPTY
+ La liste des Services oper est vide.
+OPER_OPER_LIST_HEADER
+ Liste des Services oper:
+ Num Pseudo
+OPER_OPER_LIST_FORMAT
+ %3d %s
+OPER_OPER_CLEAR
+ La liste des Services oper a été vidée.
+OPER_OPER_MOVED
+ %s a été bougé dans la liste des services oper.
+
+# 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 pseudo, assurez vous que vous n'avez pas mis de partie pseudo 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
+ CHANKILL [+expiry] {#canal} [raison]
+# 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
+ Les services reporteront maintenant les logs sur %s.
+OPER_SET_LOGCHAN_OFF
+ Les services ne reporteront plus les logs sur un canal.
+OPER_SET_LOGCHAN_ERROR
+ Les valeurs pour LOGCHAN doivent etre ON ou OFF et LogChannel dois etre défini.
+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.
+OPER_SET_SQL_ON
+ Le code SQL dois etre utilisé.
+OPER_SET_SQL_OFF
+ Le code SQL ne dois pas etre utilisé.
+OPER_SET_SQL_ERROR
+ Les configurations pour SQL doivent etre ON ou OFF.
+OPER_SET_SQL_ERROR_INIT
+ Erreur durant l'initialisation de SQL, verifier les logs pour corriger l'erreur.
+OPER_SET_SQL_ERROR_DISABLED
+ SQL n'est pas configuré pour ce réseau. Editer le fichier
+ de configuration (services.conf) pour l'activer.
+OPER_SET_LIST_OPTION_ON
+ %s est activé
+OPER_SET_LIST_OPTION_OFF
+ %s est désactivé
+
+# 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 nom-du-serveur [raison]
+
+# RAW responses
+OPER_JUPE_HOST_ERROR
+ Veuillez indiquer un nom de serveur valide pour JUPE.
+
+# 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] [nick | mask]
+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é en permanance.
+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
+ La liste des ignores est vide.
+
+# KILLCLONES responses
+OPER_IGNORE_LIST_CLEARED
+ La liste des ignores a été purgé.
+
+# KILLCLONES responses
+OPER_KILLCLONES_SYNTAX
+ KILLCLONES pseudo
+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_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 Pseudo
+
+# DefCon Messages
+
+OPER_STAFF_FORMAT
+ %c %s %s
+OPER_STAFF_AFORMAT
+ %c %s %s [%s]
+
+# DefCon Messages
+
+OPER_DEFCON_SYNTAX
+ Syntaxe: DEFCON [1|2|3|4|5]
+OPER_DEFCON_DENIED
+ Ce service est temporairement désactivé, veuillez réessayer ultérieurement.
+OPER_DEFCON_NO_CONF
+ Defcon dois etre activé dans le fichier services.conf.
+OPER_DEFCON_CHANGED
+ Les services sont maintenant sur DEFCON %d.
+OPER_DEFCON_WALL
+ %s a changé le niveau de DEFCON en %d.
+DEFCON_GLOBAL
+ Le niveau de DEFCON est maintenant: %d.
+
+# Modules strings
+
+OPER_MODULE_LOADED
+ Le module %s a été chargé.
+OPER_MODULE_UNLOADED
+ Le module %s a été déchargé.
+OPER_MODULE_LOAD_FAIL
+ Impossible de charger le module %s.
+OPER_MODULE_REMOVE_FAIL
+ Impossible de déchager le module %s.
+OPER_MODULE_NO_UNLOAD
+ Ce module ne peux pas etre déchargé.
+OPER_MODULE_LOAD_SYNTAX
+ MODLOAD Fichier
+OPER_MODULE_UNLOAD_SYNTAX
+ MODUNLOAD Fichier
+OPER_MODULE_LIST_HEADER
+ Liste des modules courant:
+OPER_MODULE_LIST
+ Module: %s [%s] [%s]
+OPER_MODULE_LIST_FOOTER
+ %d Modules changés.
+OPER_MODULE_INFO_LIST
+ Module: %s Version: %s Auteur: %s chargé: %s
+OPER_MODULE_CMD_LIST
+ Fournir la commande: %R%s %s
+OPER_MODULE_MSG_LIST
+ Providing IRCD handler for: %s
+OPER_MODULE_NO_LIST
+ Aucun module n'est chargé
+OPER_MODULE_NO_INFO
+ Aucune information sur le module %s n'est accéssible.
+OPER_MODULE_INFO_SYNTAX
+ MODINFO Fichier
+
+###########################################################################
+#
+# Session Limiting and Exception messages
+#
+###########################################################################
+
+# EXCEPTION responses
+MODULE_HELP_HEADER
+ Cette commande est chargé via un 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 pseudos et usernames.
+OPER_EXCEPTION_EXISTS
+ %s existe deja dans la liste des exceptions.
+OPER_EXCEPTION_CHANGED
+ L'exception pour %s a été changé en %d.
+
+# 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 aux 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
+ Syntaxe: STAFF
+
+ Affiche tout les pseudos du staff des services avec leur
+ niveau d'accès et leur status (online/offline).
+
+OPER_HELP_DEFCON
+ Syntax: DEFCON [1|2|3|4|5]
+
+ Le système defcon utilise et applique des configurations
+ pré-definies pour proteger durant une attaque sur le réseau.
+ attack on the network.
+
+OPER_HELP_DEFCON_NO_NEW_CHANNELS
+ * Enregistrement de nouveaux canaux bloqué
+OPER_HELP_DEFCON_NO_NEW_NICKS
+ * Enregistrement de nouveaux pseudo bloqué
+OPER_HELP_DEFCON_NO_MLOCK_CHANGE
+ * Changement des MLOCK bloqué
+OPER_HELP_DEFCON_FORCE_CHAN_MODES
+ * Application des modes %s sur tout les canaux.
+OPER_HELP_DEFCON_REDUCE_SESSION
+ * Utilisation du nombre maxi de session a %d
+OPER_HELP_DEFCON_NO_NEW_CLIENTS
+ * Kill toutes nouvelles connexions client
+OPER_HELP_DEFCON_OPER_ONLY
+ * Ignore tout les non opers pour les messages
+OPER_HELP_DEFCON_SILENT_OPER_ONLY
+ * Ignore silencieusement les non-opers
+OPER_HELP_DEFCON_AKILL_NEW_CLIENTS
+ * AKILL toutes les nouvelles connexions
+
+
+###########################################################################
+#
+# News system messages
+#
+###########################################################################
+
+OPER_HELP_DEFCON_NO_NEW_MEMOS
+ * Aucun(s) nouveau(x) memo(s) envoyé(s)
+OPER_HELP_CHANKILL
+ Syntaxe: CHANKILL [+expire] canal raison
+
+ Inflige un AKILL a toutes les personnes qui sont sur le canal
+ spécifié. Ceci utilise le réel identd@host de tout les pseudos.
+
+###########################################################################
+#
+# News system messages
+#
+###########################################################################
+
+NEWS_LOGON_TEXT
+ [Logon News - %s] %s
+NEWS_OPER_TEXT
+ [Oper News - %s] %s
+
+NEWS_RANDOM_TEXT
+ [News Aléatoire - %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
+ La liste des News est 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
+ La liste d'oper news est 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 %s messages ne seront
+ envoyés pour éviter le flood des utilisateurs. Si il y a
+ plus messages de news, seuls les plus récents seront envoyés.)
+ NewsCount peut être configuré en services.conf.
+
+ 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 %s messages ne seront
+ envoyés afin de ne pas flooder l'utilisateur. Si il y a plus
+ messages news, seuls les plus récents seront envoyés.)
+ NewsCount peut être configuré en services.conf.
+
+ OPERNEWS LIST peut être utilisée par tout IRC operator pour
+ lister les messages oper news actuels. ADD et DEL peuvent
+ uniquement être utilisés 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:
+
+ %R%s HELP
+ pour des informations sur l'enregistrement des nicks
+
+ %R%s HELP
+ pour des informations sur l'enregistrement et le
+ contrôle des channels
+
+ %R%s HELP
+ pour des informations sur l'envoi de messages aux
+ utilisateurs non connectés
+
+HELP_HELP_BOT
+
+ %R%s HELP
+ pour des informations sur l'installation d'un bot
+ sur votre channel
+
+HELP_HELP_HOST
+
+ %R%s HELP
+ pour des informations sur la configuration des vhosts.
+
+###########################################################################
+#
+# NickServ help messages
+#
+###########################################################################
+NICK_HELP_CMD_CONFIRM
+ CONFIRM Confirme une inscription à NickServ
+NICK_HELP_CMD_RESEND
+ RESEND Renvoie le code de confirmation de
+ l'inscription à NickServ
+NICK_HELP_CMD_REGISTER
+ REGISTER Enregistre un pseudo
+NICK_HELP_CMD_GROUP
+ GROUP Joint un groupe
+NICK_HELP_CMD_IDENTIFY
+ IDENTIFY Vous identifie avec votre mot de passe
+NICK_HELP_CMD_ACCESS
+ ACCESS Modifie la liste des adresses autorisées
+NICK_HELP_CMD_SET
+ SET Configure les options, protection comprise
+NICK_HELP_CMD_SASET
+ SASET Configure des options sur d'autres pseudos
+NICK_HELP_CMD_DROP
+ DROP Annule l'enregistrement d'un pseudo
+NICK_HELP_CMD_RECOVER
+ RECOVER Change le pseudo d'un utilisateur qui a pris
+ votre pseudo
+NICK_HELP_CMD_RELEASE
+ RELEASE Reprendre la tutelle de votre pseudo
+ après un RECOVER
+NICK_HELP_CMD_SENDPASS
+ SENDPASS A utiliser en cas de perte de mot de passe
+NICK_HELP_CMD_GHOST
+ GHOST Deconnect un "ghost irc" utilisant votre pseudo
+NICK_HELP_CMD_ALIST
+ ALIST Liste tout les canaux auquels vous avez un accès
+NICK_HELP_CMD_GLIST
+ GLIST Liste tout les pseudos de votre groupe
+NICK_HELP_CMD_INFO
+ INFO Affiche des informations sur un pseudo
+NICK_HELP_CMD_LIST
+ LIST Liste tout les pseudos en rapport avec la recherche
+NICK_HELP_CMD_LOGOUT
+ LOGOUT Inverse la commande LOGIN
+NICK_HELP_CMD_STATUS
+ STATUS Renvoie le statut de propriétaire du pseudo donné
+NICK_HELP_CMD_UPDATE
+ UPDATE Met à jour votre status, ex : verification de nouveau memo
+NICK_HELP_CMD_GETPASS
+ GETPASS Retrouve le mot de passe pour un pseudo
+ (uniquement si l'encryption est désactivée)
+NICK_HELP_CMD_GETEMAIL
+ GETEMAIL Cherche et retourne la liste des pseudos enregistrés
+ avec un certain email
+NICK_HELP_CMD_FORBID
+ FORBID Empêche l'utilisation d'un pseudo
+NICK_HELP_CMD_SUSPEND
+ SUSPEND Suspend un pseudo
+NICK_HELP_CMD_UNSUSPEND
+ UNSUSPEND Unsuspend un pseudo
+
+NICK_HELP
+ %S vous permet d'enregistrer un pseudo et d'empêcher les
+ autres de l'utiliser. Les commandes suivantes
+ permettent l'enregistrement et la gestion des pseudo. Pour
+ les utiliser, tapez %R%S commande. Pour plus
+ d'informations sur une certaine commande, tapez
+ %R%S HELP commande.
+
+NICK_HELP_FOOTER
+ 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
+ pseudos ou autres choses de ce genre. L'abus de %S entraînera,
+ au minimum, la perte du(des) pseudo(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 pseudo dans la base de données de %S. Une fois
+ que votre pseudo est enregistré, vous pouvez utiliser les
+ commandes SET et ACCESS pour configurer votre pseudo 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 pseudo 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 pseudo
+ 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. 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
+ pseudo. 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 %R%S HELP GROUP.
+
+NICK_HELP_GROUP
+ Syntaxe: GROUP cible motdepasse
+
+ Cette commande joint votre pseudo au groupe du nick cible.
+ motdepasse est le mot de passe du pseudo 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 pseudos du groupe est effacé, les éléments partagés
+ sus-nommés sont conservés pour peu qu'il reste d'autres pseudos
+ dans le groupe.
+
+ Il est préférable d'utiliser cette commande avec un pseudo
+ non enregistré puisqu'il sera automatiquement enregistré
+ lorsque vous utiliserez cette commande. Vous pouvez l'utiliser
+ avec un pseudo enregistré (pour changer votre groupe) uniquement
+ si vos administrateurs l'autorisent. (%R%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 pseudos 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 pseudo. 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
+
+ Actualise votre session, ex : vérification de l'arriver de
+ nouveau(x) memo(s), l'application des modes sur les canaux
+ (ModeonID), met à jour votre vhost et vos flags
+ (dernière fois vu, 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 pseudo. Notez
+ cependant que l'on ne vous demandera pas de vous réidentifier.
+
+NICK_HELP_DROP
+ Syntaxe: DROP [nick]
+
+ Efface votre pseudo de la base de données de %S. Un pseudo
+ qui a été effacé est libre d'être réenregistré par
+ n'importe qui.
+
+ Vous pouvez effacer un pseudo 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 (%R%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 pseudo. C'est
+ la liste des adresses qui seront automatiquement reconnue
+ par %S comme autorisée à utiliser le pseudo. Si vous voulez
+ utiliser le pseudo 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 pseudo. option peut être:
+
+ DISPLAY Change l'affichage de votre groupe
+ dans les services
+ PASSWORD Change le mot de passe de votre pseudo
+ LANGUAGE Change la langue dans laquelle les Services
+ vous envoient leurs messages
+ URL Associe une adresse de site à votre pseudo
+ EMAIL Associe un e-mail à votre pseudo
+ ICQ Associe un numéro ICQ à votre pseudo
+ GREET Associe un message d'accueil à votre pseudo
+ KILL Active ou désactive la protection
+ SECURE Active ou désactive la sécurité du pseudo
+ PRIVATE Empêche votre pseudo d'être affiché par
+ %R%S LIST
+ HIDE Cache certaines parties des informations du pseudo
+ MSG Change le mode de communication des Services
+ AUTOOP Should services op you automatically.
+
+ Pour utiliser cette commande, vous devez d'abord vous
+ identifier avec votre mot de passe (%R%S HELP
+ IDENTIFY pour plus d'informations).
+
+ Tapez %R%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
+ pseudos dans les services. Le nouvel affichage DOIT être un
+ pseudo 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 pseudo.
+
+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 pseudo. Cette adresse
+ sera affichée lorsque quelqu'un demandera des informations sur
+ votre pseudo avec la commande INFO.
+
+NICK_HELP_SET_EMAIL
+ Syntaxe: SET EMAIL adresse
+
+ Associe l'e-mail donné avec votre pseudo. L'email
+ sera affiché lorsque quelqu'un demandera des informations
+ sur votre pseudo avec la commande INFO.
+
+NICK_HELP_SET_ICQ
+ Syntaxe: SET ICQ numéro
+
+ Associe le numéro ICQ donné à votre pseudo. Ce numéro
+ sera affiché lorsque quelqu'un demandera des informations sur
+ votre pseudo avec la commande INFO.
+
+NICK_HELP_SET_GREET
+ Syntaxe: SET GREET message
+
+ Définit un message d'accueil pour votre pseudo, 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 pseudo. Avec la protection activée, si
+ un autre utilisateur essaie de prendre votre pseudo, il aura
+ une minute pour changer de pseudo, après quoi son pseudo sera
+ changé de force par %S.
+
+ Si vous sélectionnez QUICK, l'utilisateur aura seulement 20
+ secondes pour changer de pseudo au lieu des 60 habituelles. Si
+ vous sélectionnez IMMED, l'utilisateur verra son pseudo changé
+ immédiatement sans être d'abord prévenu et sans avoir de chance
+ pour changer son pseudo, n'utilisez cette option que si nécessaire.
+ 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 la sécurité de %S pour votre pseudo.
+ Si la sécurité est active, vous devrez obligatoirement
+ entrer votre mot de passe pour être reconnu en tant que
+ propriétaire du pseudo, 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 le mode privé de %S de votre pseudo.
+ Si le mode privé est actif, votre pseudo n'apparaitra pas
+ dans les listes de pseudos générées par la commande LIST
+ de %S. (Cependant, quiconque connaissant votre pseudo 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
+ pseudo. 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_SET_AUTOOP
+ Syntax: SET AUTOOP {ON | OFF}
+
+ Sets whether you will be opped automatically. Set to ON to
+ allow ChanServ to op you automatically when entering channels.
+
+NICK_HELP_SASET
+ Syntaxe: SASET pseudo option parametres.
+
+ Configure plusieurs options sur un pseudo. option dois etre une ci dessou:
+
+ DISPLAY Affiche les pseudos du groupe du pseudo donné
+ PASSWORD Change le mot de passe du pseudo donné
+ URL Associe une url au pseudo donné
+ EMAIL Associe un email au pseudo donné
+ ICQ Associe un compte ICQ au pseudo donné
+ GREET Associe un message de greet au pseudo donné
+ KILL Active ou désactive l'option kill du pseudo donné
+ SECURE Active ou désactive la securité du pseudo donné
+ PRIVATE Empêche le pseudo d'apparaître dans un
+ %R%S LIST
+ HIDE Cache certaine informations personnel au pseudo
+ MSG Change le mode de communication des services
+ NOEXPIRE Empêche le pseudo d'expirer
+ LANGUAGE Set the language Services will use when
+ sending messages to nickname
+
+ Taper %R%S HELP SASET option pour plus d'information
+ sur une option spécifique. L'option devra etre mise avec le pseudo
+ en prefix.
+
+ Limité aux Services admins.
+
+NICK_HELP_SASET_DISPLAY
+ Syntaxe: SASET pseudo DISPLAY nouvel-affichage
+
+ Change l'affichage utilisé pour nommer le groupe du
+ pseudos dans les services. Le nouvel affichage DOIT être un
+ pseudo de votre groupe.
+
+ Limité aux Services admins.
+
+NICK_HELP_SASET_PASSWORD
+ Syntaxe: SASET pseudo PASSWORD nouveau-mot-de-passe
+
+ Change le mot de passe utilisé pour s'identifier comme propiétaire
+ du pseudo.
+
+ Limité aux Services admins.
+
+NICK_HELP_SASET_URL
+ Syntaxe: SASET pseudo URL url
+
+ Associe l'URL donné au pseudo. Cette URL sera affiché
+ a toutes les personnes demandant des informations sur
+ le pseudo via la commande INFO.
+
+ Limité aux Services admins.
+
+NICK_HELP_SASET_EMAIL
+ Syntaxe: SASET pseudo EMAIL adresse-email
+
+ Associe l'E-mail donné au pseudo.
+
+ Limité aux Services admins.
+
+NICK_HELP_SASET_ICQ
+ Syntaxe: SASET pseudo ICQ numéro
+
+ Associe le numéro ICQ donné au pseudo. Ce numéro ICQ sera affiché
+ a toutes les personnes demandant des informations sur le pseudo
+ via la commande INFO.
+
+ Limité aux Services admins.
+
+NICK_HELP_SASET_GREET
+ Syntaxe: SASET pseudo GREET message
+
+ Définit un message d'accueil au pseudo, qui sera
+ affiché lorsqu'il joint un channel qui a l'option
+ GREET active, à condition d'avoir un niveau d'accès
+ suffisant.
+
+ Limité aux Services admins.
+
+NICK_HELP_SASET_KILL
+ Syntaxe: SASET pseudo KILL {ON | QUICK | IMMED | OFF}
+
+ Active ou désactive la protection automatique pour le pseudo donné.
+ Avec la protection activée, si un autre utilisateur essaie de
+ prendre son pseudo, il aura une minute pour changer de pseudo,
+ après quoi son pseudo sera changé de force par %S.
+
+ Si vous sélectionnez QUICK, l'utilisateur aura seulement 20
+ secondes pour changer de pseudo au lieu des 60 habituelles. Si
+ vous sélectionnez IMMED, l'utilisateur verra son pseudo changé
+ immédiatement sans être d'abord prévenu et sans avoir de chance
+ pour changer son pseudo, n'utilisez cette option que si nécessaire.
+ Les administrateurs de votre réseau peuvent avoir désactivé cette option.
+
+ Limité aux Services admins.
+
+NICK_HELP_SASET_SECURE
+ Syntaxe: SASET pseudo SECURE {ON | OFF}
+
+ Active ou désactive la sécurité de %S pour le pseudo donné.
+ Si la sécurité est active, il devra obligatoirement
+ entrer son mot de passe pour être reconnu en tant que
+ propriétaire du pseudo, que son 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.
+
+ Limité aux Services admins.
+
+NICK_HELP_SASET_PRIVATE
+ Syntaxe: SASET pseudo PRIVATE {ON | OFF}
+
+ Active ou désactive le mode privé de %S du pseudo donné.
+ Si le mode privé est actif, son pseudo n'apparaitra pas
+ dans les listes de pseudos générées par la commande LIST
+ de %S. (Cependant, quiconque connaissant son pseudo peut
+ tout de même avoir des informations en utilisant
+ la commande INFO).
+
+ Limité aux Services admins.
+
+NICK_HELP_SASET_HIDE
+ Syntaxe: SASET pseudo HIDE {EMAIL | STATUS | USERMASK | QUIT} {ON | OFF}
+
+ Vous permet d'empêcher l'affichage de certaines parties
+ des informations quand quelqu'un fait un %S INFO sur le pseudo
+ donné. Vous pouvez cacher son 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).
+
+ Limité aux Services admins.
+
+NICK_HELP_SASET_MSG
+ Syntaxe: SASET pseudo MSG {ON | OFF}
+
+ Vous permet de choisir la façon dont les services communiquent
+ le pseudo donné. Si cette option est activée, ils utiliseront des
+ messages, sinon ils utiliseront des notices.
+
+ Limité aux Services admins.
+
+NICK_HELP_SASET_NOEXPIRE
+ Syntaxe: SASET pseudo NOEXPIRE {ON | OFF}
+
+ Permet d'activer le mode NOEXPIRE au pseudo donné.
+ Configurez ce paramètres sur ON pour que le
+ pseudo n'expire pas.
+
+ Limité aux Services admins.
+
+NICK_HELP_SASET_AUTOOP
+ Syntax: SASET nickname AUTOOP {ON | OFF}
+
+ Sets whether the given nickname will be opped automatically.
+ Set to ON to allow ChanServ to op the given nickname
+ automatically when joining channels.
+
+NICK_HELP_SASET_LANGUAGE
+ Syntax: SASET nickname LANGUAGE number
+
+ Changes the language Services uses when sending messages to
+ nickname (for example, when responding to a command he sends).
+ number should be chosen from a list of supported languages
+ that you can get by typing %R%S HELP SET LANGUAGE.
+
+NICK_HELP_RECOVER
+ Syntaxe: RECOVER pseudo [motdepasse]
+
+ Vous permet de récupérer votre pseudo 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 pseudo
+ protégé par SET KILL.
+
+ Quand vous utilisez cette commande, %S connectera un faux
+ utilisateur avec le même pseudo que l'utilisateur dont
+ vous essayez de récupérer le pseudo. Cela provoque la déconnexion
+ par les serveurs IRC de l'autre utilisateur. Ce faux utilisateur
+ restera connecté pendant %s pour s'assurer que l'autre
+ utilisateur ne se reconnecte pas immédiatement. Après ces
+ temps, vous pouvez reprendre votre pseudo. Alternativement,
+ utilisez la commande RELEASE (%R%S HELP RELEASE) pour
+ reprendre votre pseudo plus tôt.
+
+ Pour utiliser la commande RECOVER pour un pseudo, l'adresse
+ telle qu'elle est montrée dans un /WHOIS doit être sur la
+ liste d'accès du pseudo, vous devez être identifié et dans
+ le groupe du pseudo, ou vous devez fournir le mot de passe
+ correct du pseudo.
+
+NICK_HELP_RELEASE
+ Syntaxe: RELEASE pseudo [motdepasse]
+
+ Ordonne à %S de supprimer toute tutelle sur votre pseudo
+ provoquée par la protection de SET KILL ou
+ l'utilisation de la commande RECOVER. Par défaut, les
+ tutelles durent %s, cette commande les arrête plus tôt.
+
+ Pour utiliser la commande RELEASE pour un pseudo, l'adresse
+ telle qu'elle est montrée dans un /WHOIS doit être sur la
+ liste d'accès du pseudo, vous devez être identifié et dans
+ le groupe du pseudo, ou vous devez fournir le mot de passe
+ correct du pseudo.
+
+NICK_HELP_GHOST
+ Syntaxe: GHOST pseudo [motdepasse]
+
+ Arrête une session IRC "fantôme" utilisant votre pseudo. 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 pseudo, l'adresse
+ telle qu'elle est montrée dans un /WHOIS doit être sur la
+ liste d'accès du pseudo, ou vous devez fournir le mot de passe
+ correct pour le pseudo.
+
+NICK_HELP_INFO
+ Syntaxe: INFO pseudo [ALL]
+
+ Affiche des informations sur le pseudo donné, telles que
+ le propriétaire du pseudo, l'adresse avec laquelle il était
+ connecté pour la dernière fois, et les options du pseudo. Si
+ vous êtes identifié pour le pseudo 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 pseudos enregistrés qui correspondent
+ au modèle donné, dans le format pseudo!user@host. Les
+ pseudos avec l'option PRIVATE active ne seront pas
+ affichés.
+
+ Exemples:
+
+ LIST *!joeuser@foo.com
+ Liste tous les pseudos appartenant à joeuser@foo.com.
+
+ LIST *Bot*!*@*
+ Liste tous les pseudo enregistrés avec Bot dans leurs
+ noms (ne différencie pas minuscules et majuscules).
+
+ LIST *!*@*.bar.org
+ Liste tous les pseudo appartenant aux utilisateurs dans le
+ domaine bar.org.
+
+NICK_HELP_ALIST
+ Syntaxe: ALIST [level]
+
+ Liste tout les canaux auquels vous avez accès. Optionnelement, vous
+ pouvez spécifier un niveau au format XOP ou ACCESS. Le résultat
+ retournera uniquement les canaux auquels vous avez un accès supérieur
+ ou égale au niveau donné.
+
+ Exemples:
+ ALIST Founder
+ Liste tout les canaux auquels vous avez un accès
+ FOUNDER.
+
+ ALIST AOP
+ Liste tout les canaux ou vous avez un accès AOP ou plus.
+
+ ALIST 10
+ Liste tout les canaux ou vous avez un accès 10 ou plus.
+
+ Les canaux ayant l'option NOEXPIRE active seront retourné avec un point
+ d'exclamation devant.
+
+NICK_HELP_GLIST
+ Syntaxe: GLIST
+
+ Liste tous les pseudos dans votre groupe.
+
+NICK_HELP_STATUS
+ Syntaxe: STATUS nick...
+
+ Retourne si l'utilisateur utilisant le pseudo donné est reconnu
+ en tant que propriétaire du pseudo. La réponse a ce format:
+
+ pseudo code-status
+
+ où pseudo est le pseudo envoyé avec la commande, et
+ code-status peut être l'un des suivants:
+
+ 0 - cet utilisateur n'est pas online ou le pseudo 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 pseudos peuvent être envoyés avec chaque commande,
+ le reste sera ignoré. Si aucun pseudo n'est donné, votre status
+ sera retourné.
+
+NICK_HELP_SENDPASS
+ Syntaxe: SENDPASS pseudo
+
+ Envoie le mot de passe du pseudo donné à l'adresse e-mail
+ qui a été définie pour ce pseudo. 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_HELP_CONFIRM
+ Syntax: CONFIRM passcode
+
+ This is the second step of nickname registration process.
+ You must perform this command in order to get your nickname
+ registered with %S. The passcode (or called auth code also)
+ is sent to your e-mail address in the first step of the
+ registration process. For more information about the first
+ stage of the registration process, type: %R%S HELP REGISTER
+
+NICK_HELP_RESEND
+ Syntax: RESEND
+
+ This command will re-send the auth code (also called passcode)
+ to the e-mail address of the user whom is performing it.
+
+NICK_SERVADMIN_HELP
+
+ Les Services admins peuvent également effacer n'importe quel
+ pseudo sans avoir besoin de s'identifier pour le nick, et
+ peuvent voir l'access list pour n'importe quel pseudo
+ (%R%S ACCESS LIST nick).
+
+NICK_SERVADMIN_HELP_LOGOUT
+ Syntaxe: LOGOUT [pseudo [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 pseudo. Notez
+ cependant que l'on ne vous demandera pas de vous réidentifier.
+
+ Avec un paramètre, fait la même chose avec le pseudo donné. Si
+ vous spécifiez également REVALIDATE, les Services demanderont
+ au pseudo donné de se ré-identifier. Cette utilisation est
+ réservée aux Services admins.
+
+NICK_SERVADMIN_HELP_DROP
+ Syntaxe: DROP [pseudo]
+
+ Sans paramètre, efface votre pseudo de la base de données
+ de %S.
+
+ Avec un paramètre, efface le pseudo donné de la base de
+ données. Vous pouvez effacer n'importe quel pseudo de votre
+ groupe sans privilèges particuliers. La possibilité
+ d'effacer n'importe quel pseudo est cependant réservée aux
+ Services admins.
+
+NICK_SERVADMIN_HELP_INFO
+
+ Les services admins peuvent utiliser le paramètre ALL
+ avec n'importe quel pseudo.
+
+NICK_SERVADMIN_HELP_LIST
+ Syntaxe: LIST modèle [FORBIDDEN] [SUSPENDED] [NOEXPIRE] [UNCONFIRMED]
+
+ Liste tous les pseudos enregistrés qui correspondent au modèle
+ donné, de format nick!user@host. Les pseudos ayant l'option
+ PRIVATE ne seront affichés qu'aux Services admins. Les
+ pseudos ayant l'option NOEXPIRE seront préfixés par un !
+ devant leur pseudo pour les Services admins.
+
+ Si les option FORBIDDEN, SUSPENDED, NOEXPIRE ou UNCONFIRMED sont donné,
+ les pseudos qui sont FORBID, SUSPENDED, NON CONFIRMER ou ont l'option
+ NOEXPIRE seront affiché. Si plus options sont indiquées,
+ tout les pseudos correspondant aux une des critères seront affichés.
+ Réservé aux Services admins.
+
+ Exemples:
+
+ LIST *!joeuser@foo.com
+ Liste tous les pseudos enregistrés appartenant à
+ joeuser@foo.com.
+
+ LIST *Bot*!*@*
+ Liste tous les pseudos enregistrés ayant Bot dans
+ leur nom (ne respecte pas les majuscules).
+
+ LIST * NOEXPIRE
+ Liste tous les pseudos qui n'expireront pas.
+
+NICK_SERVADMIN_HELP_ALIST
+ Syntax: ALIST [pseudo] [level]
+
+ Sans aucun paramètres, retourne la liste des canaux ou vous avez un accès.
+ pseudo liste les canaux auquel le pseudo donné a accès
+ level liste les canaux auquel le pseudo donné a un accès supérieur
+ ou égale au level donné
+
+ Réservé aux Services admins.
+
+NICK_SERVADMIN_HELP_GLIST
+ Syntaxe: GLIST [nick]
+
+ Sans paramètre, liste tous les pseudos qui sont dans
+ votre groupe.
+
+ Avec un paramètre, liste tous les pseudos qui sont dans
+ le groupe du pseudo donné.
+ Cette utilisation est limitée aux administrateurs des
+ Services.
+
+NICK_SERVADMIN_HELP_GETPASS
+ Syntaxe: GETPASS nick
+
+ Retourne le mot de passe du pseudo donné. Notez que pour
+ chaque utilisation de cette commande, un message comprenant
+ la personne qui a émis la commande et le pseudo 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
+
+ Retourne la liste des pseudos enregistré avec l'email donné.
+ Note vous ne pouvez pas utiliser de wildcards pour plusieurs
+ pseudos.
+ Lorsque cette commande est utilisé, un message incluant
+ le pseudo de la personne qui a utilisé la commande et
+ vers quel email a été destiné la commande dans les logs.
+
+ Limité aux Services admins.
+
+NICK_SERVADMIN_HELP_FORBID
+ Syntaxe: FORBID nick [raison]
+
+ Empêche un pseudo d'être enregistré ou utilisé par
+ quelqu'un. Peut être annulé en effaçant le pseudo.
+
+ Sur certains réseaux, la raison est requise.
+
+ Réservée aux Services admins.
+
+###########################################################################
+#
+# ChanServ help messages
+#
+###########################################################################
+
+NICK_SERVADMIN_HELP_SUSPEND
+ Syntaxe: SUSPEND pseudo raison / UNSUSPEND pseudo
+
+ Suspend / libere le pseudo pseudo spécifié.
+
+ Limité aux Services admins.
+
+###########################################################################
+#
+# ChanServ help messages
+#
+###########################################################################
+
+NICK_SERVADMIN_HELP_UNSUSPEND
+ Syntaxe: UNSUSPEND pseudo
+
+ Libere un pseudo suspendu.
+
+ Limité aux Services admins.
+
+###########################################################################
+#
+# ChanServ help messages
+#
+###########################################################################
+CHAN_HELP_CMD_GETPASS
+ GETPASS Retrouve le mot de passe du propriétaire pour
+ un channel
+CHAN_HELP_CMD_FORBID
+ FORBID Empêche un channel d'être utilisé
+CHAN_HELP_CMD_SUSPEND
+ SUSPEND Suspend un canal pour ne pas qu'il soit utilisé
+ tout en conservant les données et configurations.
+CHAN_HELP_CMD_UNSUSPEND
+ UNSUSPEND Libère un canal suspendu
+CHAN_HELP_CMD_STATUS
+ STATUS Retourne le level d'accès courant d'un
+ utilisateur sur un channel
+CHAN_HELP_CMD_REGISTER
+ REGISTER Enregistre un channel
+CHAN_HELP_CMD_IDENTIFY
+ IDENTIFY Vous identifie avec votre mot de passe
+CHAN_HELP_CMD_SET
+ SET Configure les options et informations du
+ channel
+CHAN_HELP_CMD_AOP
+ AOP Modifie la liste des utilisateurs AOPs
+CHAN_HELP_CMD_SOP
+ SOP Modifie la liste des utilisateurs SOPs
+CHAN_HELP_CMD_ACCESS
+ ACCESS Modifie la liste des utilisateurs privilégiés
+CHAN_HELP_CMD_LEVELS
+ LEVELS Redéfinit la signification des levels d'accès
+CHAN_HELP_CMD_AKICK
+ AKICK Gère la liste des kicks automatiques
+CHAN_HELP_CMD_DROP
+ DROP Annule l'enregistrement d'un channel
+CHAN_HELP_CMD_SENDPASS
+ SENDPASS Aide à retrouver les mots de passe égarés
+CHAN_HELP_CMD_BAN
+ BAN Ban un pseudo spécifié dans un canal
+CHAN_HELP_CMD_CLEAR
+ CLEAR Ordonne à ChanServ de nettoyé certain paramètres
+ sur un canal
+CHAN_HELP_CMD_DEVOICE
+ DEVOICE Devoice le pseudo spécifié sur un canal
+CHAN_HELP_CMD_GETKEY
+ GETKEY Retourne la clé du canal specifié
+CHAN_HELP_CMD_INFO
+ INFO Liste les informations sur un canal enregistré
+CHAN_HELP_CMD_INVITE
+ INVITE Ordone à ChanServ de vous inviter ou d'inviter un pseudo
+ sur un canal
+CHAN_HELP_CMD_KICK
+ KICK Kick le pseudo spécifié d'un canal
+CHAN_HELP_CMD_LIST
+ LIST Liste tout les canaux enregistré en rapport avec la recherche
+CHAN_HELP_CMD_LOGOUT
+ LOGOUT Cette commande inverse la commande IDENTIFY
+CHAN_HELP_CMD_OP
+ OP Donne l'Op au pseudo spécifié sur un canal
+CHAN_HELP_CMD_TOPIC
+ TOPIC Change le topic sur un canal spécifié
+CHAN_HELP_CMD_UNBAN
+ UNBAN Retire tout les bans vous empechant d'entrer sur un canal
+CHAN_HELP_CMD_VOICE
+ VOICE Donne un voice au pseudo spécifié sur un canal
+CHAN_HELP_CMD_VOP
+ VOP Configure la liste des VOP pour un canal (VOicePeople)
+CHAN_HELP_CMD_DEHALFOP
+ DEHALFOP Dehalfop le pseudo spécifié sur un canal
+CHAN_HELP_CMD_DEOWNER
+ DEOWNER Retire votre status d'owner sur un canal
+CHAN_HELP_CMD_DEPROTECT
+ DEPROTECT Deprotège le pseudo donné sur un canal
+CHAN_HELP_CMD_HALFOP
+ HALFOP Donne le status d'halfop au pseudo donné sur un canal
+CHAN_HELP_CMD_HOP
+ HOP Configure la liste de HOP d'un canal (HalfOP)
+CHAN_HELP_CMD_OWNER
+ OWNER Vous donne votre accès owner sur un canal
+CHAN_HELP_CMD_PROTECT
+ PROTECT Protège le pseudo spécifié sur un canal
+CHAN_HELP_CMD_ADMIN
+ ADMIN Protège le pseudo spécifié sur un canal
+CHAN_HELP_CMD_DEADMIN
+ DEADMIN Deprotège le pseudo donné sur un canal
+CHAN_HELP_CMD_DEOP
+ DEOP Deop le pseudo spécifié sur un canal
+
+CHAN_HELP
+ %S vous permet d'enregistrer et de contrôler divers
+ aspects des canaux. %S empêche souvent de malicieux
+ utilisateurs de faire des "take overs" sur les canaux
+ en limitant ceux qui sont autorisés à être channel
+ operator. Les commandes disponibles sont listées ci-dessous,
+ pour les utiliser, tapez %R%S commande. Pour plus
+ d'informations sur une commande spécifique, tapez
+ %R%S HELP commande.
+
+
+CHAN_HELP_EXPIRES
+
+ Notez que tout canal non utilisé pendant %d jours
+ (c'est-à-dire une période pendant laquelle aucun
+ utilisateur figurant sur la liste d'accès du canal
+ ne vient sur le canal) sera automatiquement effacé.
+
+CHAN_HELP_REGISTER
+ Syntaxe: REGISTER canal motdepasse description
+
+ Enregistre un canal dans la base de données de %S. Pour
+ utiliser cette commande, vous devez d'abord être un
+ opérateur sur le canal 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 canal plus tard. Le dernier
+ paramètre, qui doit être inclus, est une description
+ générale du canal.
+
+ Quand vous enregistrez un canal, vous êtes enregistré
+ comme "propriétaire" du canal. Le propriétaire du canal peut
+ tout changer dans la configuration du canal, %S donnera
+ aussi automatiquement au propriétaire les droits d'opérateur
+ du canal quand il ou elle joint le canal.
+ Consultez la commande ACCESS (%R%S HELP ACCESS) pour
+ savoir comment donner un sous ensemble de ces droits à
+ d'autres utilisateurs du canal.
+
+ REMARQUE: Pour enregistrer un canal, vous devez
+ d'abord enregistrer votre pseudo. Si ce n'est pas déjà fait,
+ tapez %R%s HELP pour savoir comment faire.
+
+CHAN_HELP_IDENTIFY
+ Syntaxe: IDENTIFY canal motdepasse
+
+ Certifie à %S que vous êtes autorisé à modifier le canal 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 canal pseudo
+
+ Cette commande supprime l'identification du pseudo sélectionné
+ pour le canal donné.
+
+ Si vous êtes le propriétaire du canal, 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 canal
+
+ Efface le canal donné. Peut uniquement être utilisé par
+ le propriétaire du canal, qui doit utiliser la commande
+ IDENTIFY d'abord.
+
+CHAN_HELP_SET
+ Syntaxe: SET canal option paramètres
+
+ Permet au propriétaire du canal de configurer diverses options
+ du canal et d'autres informations.
+
+ Options disponibles:
+
+ FOUNDER Définit le propriétaire d'un canal
+ SUCCESSOR Définit le successeur d'un canal
+ PASSWORD Définit le mot de passe du canal
+ DESC Définit la description du canal
+ URL Associe un site avec un canal
+ EMAIL Associe un E-mail avec le canal
+ ENTRYMSG Définit un message envoyé aux utilisateurs
+ qui entrent sur le canal
+ TOPIC Change le topic du canal
+ BANTYPE Définit comment les services mettent les bans
+ sur le canal
+ MLOCK Oblige ou interdit des modes de canal
+ KEEPTOPIC Maintient le topic quand le canal 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 canal de la commande LIST
+ RESTRICTED Restreindre l'accès au canal
+ 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 canal
+ 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 %R%S HELP SET option pour plus d'informations sur
+ une option particulière.
+
+CHAN_HELP_SET_FOUNDER
+ Syntaxe: SET canal FOUNDER pseudo
+
+ Change le propriétaire d'un canal. Le nouveau pseudo doit être
+ enregistré.
+
+CHAN_HELP_SET_SUCCESSOR
+ Syntaxe: SET canal SUCCESSOR pseudo
+
+ Change le successeur d'un canal. Si le pseudo du propriétaire
+ expire ou est effacé alors que le canal est toujours
+ enregistré, le successeur deviendra le nouveau propriétaire du
+ canal. Cependant, si le successeur a déjà trop de canaux
+ enregistrés (%d), le canal sera tout de même effacé, comme
+ si aucun successeur n'avait été nommé. Le nouveau pseudo
+ doit être enregistré.
+
+CHAN_HELP_SET_PASSWORD
+ Syntaxe: SET canal PASSWORD motdepasse
+
+ Définit le mot de passe utilisé pour s'identifier en tant
+ que propriétaire du canal.
+
+CHAN_HELP_SET_DESC
+ Syntaxe: SET canal DESC description
+
+ Définit la description du canal, qui apparait dans les
+ commandes LIST et INFO.
+
+CHAN_HELP_SET_URL
+ Syntaxe: SET canal URL [adresse]
+
+ Associe l'adresse de site web donnée avec le canal. Cette adresse
+ sera affichée à chaque fois que quelqu'un demande des informations
+ sur le canal avec la commande INFO. Si aucun paramètre
+ n'est donné, supprime l'adresse de site du canal.
+
+CHAN_HELP_SET_EMAIL
+ Syntaxe: SET canal EMAIL [adresse]
+
+ Associe l'e-mail donné avec le canal. Cet
+ e-mail sera affiché lorsque quelqu'un demande des informations
+ sur le canal avec la commande INFO. Si aucun paramètre
+ n'est donné, supprime l'e-mail actuel du canal.
+
+CHAN_HELP_SET_ENTRYMSG
+ Syntaxe: SET canal ENTRYMSG [message]
+
+ Définit le message qui sera envoyé en /notice aux
+ utilisateurs quand ils entrent dans un canal. Si aucun
+ paramètre n'est donné, aucun message n'est envoyé à
+ l'entrée.
+
+CHAN_HELP_SET_BANTYPE
+ Syntaxe: SET canal BANTYPE typedeban
+
+ Définit le type de ban qui sera utilisé par les services
+ lorsqu'ils doivent bannir quelqu'un de votre canal.
+
+ 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 canal KEEPTOPIC {ON | OFF}
+
+ Active ou désactive l'option de maintien du topic pour
+ un canal. Lorsque le maintien du topic est défini, le
+ topic pour le canal sera retenu par %S même après que le
+ dernier utilisateur quitte le canal, et sera restauré la
+ prochaine fois que le canal est créé.
+
+CHAN_HELP_SET_TOPICLOCK
+ Syntaxe: SET canal TOPICLOCK {ON | OFF}
+
+ Active ou désactive l'option de verrouillage du topic pour
+ un caanal. Lorsque le verrouillage du topic est actif,
+ %S ne permettra pas le changement du topic du canal sauf
+ avec la commande TOPIC.
+
+CHAN_HELP_SET_MLOCK
+ Syntaxe: SET canal MLOCK modes
+
+ Configure les modes maintenus sur le canal. %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 canal.
+
+ 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 canal (HELP SET
+ RESTRICTED pour plus d'informations), sinon toute personne
+ entrant sur le canal lorsqu'il est vide verra la clef!
+
+ Exemples:
+
+ SET #canal 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 #canal 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 canal sera
+ "ma-clef".
+
+ SET #canal MLOCK +
+ Réinitialise tous les modes précédemment maintenus, qui
+ pourront désormais être librement utilisés.
+
+CHAN_HELP_SET_PEACE
+ Syntaxe: SET canal PEACE {ON | OFF}
+
+ Active ou désactive l'option de paix pour un canal.
+ Quand elle est active, cette option empêche un
+ utilisateur de kicker, bannir ou enlever un privilège
+ de canal d'un user qui a un niveau supérieur ou
+ égal au sien via les commandes de %S.
+
+CHAN_HELP_SET_PRIVATE
+ Syntaxe: SET canal PRIVATE {ON | OFF}
+
+ Active ou désactive l'option private pour un canal.
+ Si private est défini, un %R%S LIST ne comprendra
+ le canal dans aucune liste.
+
+CHAN_HELP_SET_RESTRICTED
+ Syntaxe: SET canal RESTRICTED {ON | OFF}
+
+ Active ou désactive l'option d'accès restreint pour un
+ canal. Lorsque l'accès restreint est actif, les
+ utilisateurs qui n'auraient normalement pas la permission
+ d'être opérateur du canal (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 canal.
+
+CHAN_HELP_SET_SECURE
+ Syntaxe: SET canal SECURE {ON | OFF}
+
+ Active ou désactive %S caractéristiques de sécurité
+ pour un canal. Lorsque la sécurité est active, seuls les
+ utilisateurs qui ont enregistré leurs pseudos avec %s et
+ qui sont identifiés avec leur mot de passe auront accès
+ au canal sous contrôle de la liste d'accès.
+
+CHAN_HELP_SET_SECUREOPS
+ Syntaxe: SET canal SECUREOPS {ON | OFF}
+
+ Active ou désactive le contrôle des ops sur un canal.
+ 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 canal SECUREFOUNDER {ON | OFF}
+
+ Active ou désactive l'option contrôle du propriétaire pour un canal.
+ Lorsque le contrôle du propriétaire est activé, seul le vrai
+ propriétaire pourra effacer le canal, 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 canal SIGNKICK {ON | LEVEL | OFF}
+
+ Active ou désactive les kicks signés sur un canal.
+ Quand cette option est utilisée, les kicks générés
+ par la commande %S KICK auront le pseudo 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 canal ne
+ génèreront pas de kicks signés. Consultez %R%S HELP LEVELS
+ pour plus d'informations.
+
+CHAN_HELP_SET_XOP
+ Syntaxe: SET canal XOP {ON | OFF}
+
+ Active ou désactive le système de listes de xOPs pour
+ un canal. 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 canal OPNOTICE {ON | OFF}
+
+ Active ou désactive l'option notice sur OP/DEOP pour un canal.
+ Lorsque notice sur OP/DEOP est défini, %S enverra un notice au
+ canal à chaque fois que les commandes OP ou DEOP sont
+ utilisées par un utilisateur sur le canal.
+
+CHAN_HELP_AOP
+ Syntaxe: AOP canal ADD pseudo
+ AOP canal DEL {pseudo | liste d'entrées | liste}
+ AOP canal LIST [masque | liste]
+ AOP canal CLEAR
+
+ Gère la liste des AOPs (AutoOPs) d'un canal. La liste des
+ AOPs donne aux utilisateurs le droit de recevoir le
+ status d'opérateur automatiquement sur votre canal,
+ 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 pseudo donné à la liste des
+ AOPs.
+
+ La commande AOP DEL supprime le pseudo 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 #canal 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 canal.
+ Cependant, la commande AOP LIST peut être utilisée
+ en étant AOP ou plus.
+
+ Cette commande peut avoir été désactivée pour votre canal,
+ et vous devrez dans ce cas utiliser la liste d'accès. Tapez
+ %R%S HELP ACCESS pour savoir comment utiliser la liste
+ d'accès, et %R%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 canal ADD pseudo
+ HOP canal DEL {pseudo | liste d'entrées | liste}
+ HOP canal LIST [masque | liste]
+ HOP canal CLEAR
+
+ Gère la liste des HOPs (HalfOPs) d'un canal. La liste des
+ HOPs donne aux utilisateurs le droit de recevoir le
+ status de semi-opérateur automatiquement sur votre canal.
+
+ La commande HOP ADD ajoute le pseudo donné à la liste des
+ HOPs.
+
+ La commande HOP DEL supprime le pseudo 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 #canal 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 canal.
+
+ Cette commande peut avoir été désactivée pour votre canal,
+ et vous devrez dans ce cas utiliser la liste d'accès. Tapez
+ %R%S HELP ACCESS pour savoir comment utiliser la liste
+ d'accès, et %R%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 canal ADD pseudo
+ SOP canal DEL {pseudo | liste d'entrées | liste}
+ SOP canal LIST [masque | liste]
+ SOP canal CLEAR
+
+ Gère la liste des SOPs (SuperOPs) d'un canal. 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
+ canal, etc.
+
+ La commande SOP ADD ajoute le nick donné à la liste des
+ SOPs.
+
+ La commande SOP DEL supprime le pseudo 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 #canal 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 canal.
+ Cependant, la commande SOP LIST peut être utilisée
+ en étant AOP ou plus.
+
+ Cette commande peut avoir été désactivée pour votre canal,
+ et vous devrez dans ce cas utiliser la liste d'accès. Tapez
+ %R%S HELP ACCESS pour savoir comment utiliser la liste
+ d'accès, et %R%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 canal ADD pseudo
+ VOP canal DEL {pseudo | liste d'entrées | liste}
+ VOP canal LIST [masque | liste]
+ VOP canal CLEAR
+
+ Gère la liste des VOPs (VOicePeople) d'un canal. 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 pseudo donné à la liste des
+ VOPs.
+
+ La commande VOP DEL supprime le pseudo 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 #canal 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 canal.
+
+ Cette commande peut avoir été désactivée pour votre canal,
+ et vous devrez dans ce cas utiliser la liste d'accès. Tapez
+ %R%S HELP ACCESS pour savoir comment utiliser la liste
+ d'accès, et %R%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 canal ADD pseudo level
+ ACCESS canal DEL {pseudo | numéros d'entrée | liste}
+ ACCESS canal LIST [mask | liste]
+ ACCESS canal CLEAR
+
+ Gère la liste d'accès d'un canal. 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 canal. Différents
+ levels utilisateur donnent accès à différents lots de
+ privilèges, %R%S HELP ACCESS LEVELS pour des informations
+ plus détaillées. Tout pseudo qui n'est pas sur la liste
+ d'accès a un level utilisateur de 0.
+
+ La commande ACCESS ADD ajoute le pseudo donné à la liste
+ d'accès avec le level utilisateur choisi, si le pseudo 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 pseudo 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 pseudo 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 #canal 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 canal.
+ 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 %R%S HELP LEVELS
+ pour plus d'informations.
+
+CHAN_HELP_AKICK
+ Syntaxe: AKICK channel ADD {nick | masque} [raison]
+ AKICK channel STICK masque
+ AKICK channel UNSTICK masque
+ AKICK channel DEL {nick | mask | entry-num | liste}
+ AKICK channel LIST [masque | entry-num | liste]
+ AKICK channel VIEW [masque | entry-num | liste]
+ AKICK canal ENFORCE
+ AKICK canal CLEAR
+
+ Gère la liste de kicks automatiques d'un canal. Si
+ un utilisateur figurant sur la liste de kicks automatiques tente
+ de joindre un canal, %S bannira cet utilisateur du canal,
+ et kickera ensuite l'utilisateur.
+
+ La commande AKICK ADD ajoute le pseudo 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
+ "Vous n'ètes plus le bienvenue sur ce canal".
+ When akicking a registered nick the nickserv account
+ will be added to the akick list instead of the mask.
+ All users within that nickgroup will then be akicked.
+
+ La commande AKICK DEL supprime le pseudo 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 canal. Si quelqu'un essaie d'enlever le
+ ban, %S le remettra automatiquement. Vous ne pouvez l'utiliser
+ sur des pseudos enregistrés.
+
+ La commande AKICK UNSTICK annule les effets de la commande
+ AKICK STICK, et vous pourrez donc à nouveau enlever le
+ ban du canal.
+
+ 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 canal 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 canal SET type level
+ LEVELS canal {DIS | DISABLE} type
+ LEVELS canal LIST
+ LEVELS canal RESET
+
+ La commande LEVELS permet un contrôle précis de la
+ signification des levels d'accès utilisés pour les canaux.
+ 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 canal.)
+
+ 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 canal.
+ 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 canal 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 canal [ALL]
+
+ Liste les informations concernant le canal 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 canal.
+
+CHAN_HELP_LIST
+ Syntaxe: LIST modèle
+
+ Liste tous les canaux enregistrés correspondants au
+ modèle donné. (Les canaux avec l'option PRIVATE ne
+ sont pas listés.)
+
+CHAN_HELP_OP
+ Syntaxe: OP [#canal [pseudo]]
+
+ Op le pseudo sélectionné sur un canal. Si pseudo n'est pas
+ donné, vous oppera sur le canal donné. Si pseudo et
+ #canal ne sont pas donnés, vous oppera sur tous
+ les canaux où vous êtes.
+
+ Par défaut, limité aux AOPs ou à ceux ayant un niveau
+ d'accès de 5 ou plus sur le canal.
+
+CHAN_HELP_DEOP
+ Syntaxe: DEOP [#canal [pseudo]]
+
+ Deop le pseudo sélectionné sur un canal. Si pseudo n'est pas
+ donné, vous deoppera sur le canal donné. Si pseudo et
+ #canal ne sont pas donnés, vous deoppera sur tous
+ les canaux où vous êtes.
+
+ Par défaut, limité aux AOPs ou à ceux ayant un niveau
+ d'accès de 5 ou plus sur le canal.
+
+CHAN_HELP_VOICE
+ Syntaxe: VOICE [#canal [pseudo]]
+
+ Voice le pseudo sélectionné sur un canal. Si pseudo n'est pas
+ donné, vous voicera sur le canal donné. Si pseudo et
+ canal ne sont pas donnés, vous voicera sur tous
+ les canaux où vous êtes.
+
+ Par défaut, limité aux AOPs ou à ceux ayant un level d'accès
+ de 5 ou plus sur le canal, 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 [#canal [pseudo]]
+
+ Devoice le pseudo sélectionné sur un canal. Si pseudo n'est pas
+ donné, vous devoicera sur le canal donné. Si pseudo et
+ #canal ne sont pas donnés, vous devoicera sur tous
+ les canaux où vous êtes.
+
+ Par défaut, limité aux AOPs ou à ceux ayant un level d'accès
+ de 5 ou plus sur le canal, 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 [#canal [pseudo]]
+
+ Halfop le pseudo sélectionné sur un canal. Si pseudo n'est pas
+ donné, vous halfoppera sur le canal donné. Si pseudo et
+ #canal ne sont pas donnés, vous halfoppera sur tous
+ les canaux où vous êtes.
+
+ Par défaut, limité aux AOPs ou à ceux ayant un level d'accès
+ de 5 ou plus sur le canal, 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 [#canal [pseudo]]
+
+ Dehalfop le pseudo sélectionné sur un canal. Si pseudo n'est pas
+ donné, vous dehalfoppera sur le canal donné. Si pseudo et
+ #canal ne sont pas donnés, vous dehalfoppera sur tous
+ les canaux où vous êtes.
+
+ Par défaut, limité aux AOPs ou à ceux ayant un level d'accès
+ de 5 ou plus sur le canal, 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 [#canal [pseudo]]
+
+ Protège le pseudo sélectionné sur un canal. Si pseudo n'est pas
+ donné, vous protègera sur le canal donné. Si pseudo et
+ #canal ne sont pas donnés, vous protègera sur tous
+ les canaux 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 [#canal [pseudo]]
+
+ Enlève la protection du pseudo sélectionné sur un canal. Si
+ pseudo n'est pas donné, vous déprotègera sur le canal
+ donné. Si pseudo et #canal ne sont pas donnés, vous
+ déprotègera sur tous les canaux où vous êtes.
+
+ Par défaut, limité au propriétaire du canal, 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 [#canal]
+
+ Vous donne le status de propriétaire sur le canal donné.
+ Si #canal n'est pas donné, vous donnera le status de
+ propriétaire sur tous les canaux où vous êtes, à condition
+ bien sûr d'y avoir droit.
+
+ Limité à ceux ayant un accès de propriétaire sur le canal.
+
+CHAN_HELP_DEOWNER
+ Syntaxe: DEOWNER [#canal]
+
+ Vous supprime le status de propriétaire sur le canal
+ donné. Si canal n'est pas donné, vous donnera le status
+ de propriétaire sur tous les canaux où vous êtes, à
+ condition bien sûr d'y avoir droit.
+
+ Limité à ceux ayant un accès de propriétaire sur le canal.
+
+CHAN_HELP_INVITE
+ Syntaxe: INVITE canal
+
+ Demande à %S de vous inviter sur le canal donné.
+
+ Par défaut, limité aux AOPs ou à ceux ayant un niveau
+ d'accès de 5 ou plus sur le canal.
+
+CHAN_HELP_UNBAN
+ Syntaxe: UNBAN canal
+
+ Demande à %S d'enlever tous les bans vous empêchant
+ d'entrer sur le canal donné.
+
+ Par défaut, limité aux AOPs ou à ceux ayant un niveau
+ d'accès de 5 ou plus sur le canal.
+
+CHAN_HELP_KICK
+ Syntaxe: KICK [#canal [pseudo [raison]]]
+
+ Kicke le pseudo sélectionné sur un canal. Si pseudo n'est pas
+ donné, vous kickera sur le canal donné. Si pseudo et
+ #canal ne sont pas donnés, vous kickera sur tous
+ les canaux où vous êtes.
+
+ Par défaut, limité aux AOPs ou à ceux ayant un niveau
+ d'accès de 5 ou plus sur le canal.
+
+CHAN_HELP_BAN
+ Syntaxe: BAN [#canal [pseudo [raison]]]
+
+ Bannit le pseudo sélectionné sur un canal. Si pseudo n'est pas
+ donné, vous bannira sur le canal donné. Si pseudo et
+ canal ne sont pas donnés, vous bannira sur tous
+ les canaux où vous êtes.
+
+ Par défaut, limité aux AOPs ou à ceux ayant un niveau
+ d'accès de 5 ou plus sur le canal.
+
+CHAN_HELP_TOPIC
+ Syntaxe: TOPIC canal [topic]
+
+ %S change le topic du canal pour celui spécifié. Si
+ topic n'est pas donné, alors le topic du canal sera
+ supprimé. Cette commande est surtout utile en conjonction
+ avec la commande SET TOPICLOCK. Consultez
+ %R%S HELP SET TOPICLOCK pour plus d'informations.
+
+ Par défault, limité à ceux ayant un accès de propriétaire
+ sur le canal.
+
+CHAN_HELP_CLEAR
+ Syntaxe: CLEAR canal quoi
+
+ Demande à %S d'enlever certains aspects d'un canal.
+ quoi peut être un des suivants:
+
+ MODES Réinitialise tous les modes d'un canal
+ BANS Enlève tous les bans d'un canal.
+ EXCEPTS Enlève tous les excepts d'un canal.
+ OPS Enlève le status d'opérateur du canal à
+ tous les opérateurs du canal.
+ HOPS Enlève le status d'halfop (mode +h) a tout les halfop
+ du canal.
+ VOICES Enlève le status de "voice" (mode +v) à toute
+ personne ayant ce mode.
+ USERS Kicke tous les utilisateurs d'un canal.
+
+ Par défault, limité à ceux ayant un accès de propriétaire
+ sur le canal.
+
+CHAN_HELP_GETKEY
+ Syntaxe: GETKEY canal
+
+ Retourne la clef du canal 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 <canal> <clef>
+
+ La clef sera "NO KEY" si aucune clef n'est définie.
+
+CHAN_HELP_SENDPASS
+ Syntaxe: SENDPASS canal
+
+ Envoie le mot de passe du canal donné à l'adresse e-mail
+ qui a été définie pour le propriétaire de ce canal. 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 Services admins peuvent aussi effacer tout canal sans
+ avoir besoin de s'identifier avec un mot de pass, et peuvent
+ voir l'access, AKICK, et level lists de tout canaux.
+
+CHAN_SERVADMIN_HELP_LOGOUT
+ Syntaxe: LOGOUT canal [pseudo]
+
+ Cette commande supprime l'identification du pseudo sélectionné
+ pour le canal donné.
+
+ Si vous êtes le propriétaire du canal, 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
+ canal sans avoir besoin d'être le propriétaire du canal.
+ Vous pouvez également omettre le paramètre pseudo, cela aura
+ pour effet de supprimer l'identification pour tous les
+ utilisateurs identifiés au canal.
+
+CHAN_SERVADMIN_HELP_DROP
+ Syntaxe: DROP canal
+
+ Efface le canal nommé. Seuls les Services admins
+ peuvent effacer un canal 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 canaux peuvent être empêchés
+ d'expirer. De plus, les Services admins peuvent définir
+ les options de tout canal sans s'identifier avec le
+ mot de passe du canal.
+
+CHAN_SERVADMIN_HELP_SET_NOEXPIRE
+ Syntaxe: SET canal NOEXPIRE {ON | OFF}
+
+ Définit si le canal donné expirera. Mettre ceci à ON
+ empêche le canal 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 canal.
+
+CHAN_SERVADMIN_HELP_LIST
+ Syntaxe: LIST modèle
+
+ Liste tous les canaux enregistrés correspondants au modèle
+ donné. Les canaux avec l'option PRIVATE seront uniquement
+ affichés aux Services admins. Les canaux 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 canaux qui, respectivement, sont interdits ou ont l'option
+ NOEXPIRE active seront affichés. Si plus options sont
+ données, les deux types de canaux seront affichés. Ces options
+ sont réservées aux Services admins.
+
+CHAN_SERVADMIN_HELP_GETPASS
+ Syntaxe: GETPASS canal
+
+ Retourne le mot de passe du canal donné. Notez que
+ lorsque cette commande est utilisée, un message comprenant
+ la personne qui a utilisé cette commande et le canal
+ 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 canal [raison]
+
+ Empêche toute personne d'enregistrer ou d'utiliser le
+ canal donné. Peut être annulé en effacant le canal.
+
+ La raison peut être requise sur certains réseaux.
+
+ Réservée aux Services admins.
+
+CHAN_SERVADMIN_HELP_SUSPEND
+ Syntax: SUSPEND canal [raison]
+
+ Désactive l'enregistrement du canal donné. Ceci peu
+ etre inversé via la commande UNSUSPEND et recupèrer
+ les données et configurations.
+
+ Une raison peut etre demandé sur certain réseaux.
+
+ Limité aux Services admins.
+
+CHAN_SERVADMIN_HELP_UNSUSPEND
+ Syntax: UNSUSPEND canal
+
+ Libère un canal qui a été suspendu. Toutes les données
+ et configurations seront restauré tel qu'elles etait
+ avant la suspension.
+
+ Limité aux Services admins.
+
+CHAN_SERVADMIN_HELP_STATUS
+ Syntaxe: STATUS canal pseudo
+
+ Retourne le level d'accès actuel du pseudo donné pour le
+ canal donné. La réponse est de la forme:
+
+ STATUS canal pseudo 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_CMD_SEND
+ SEND Envoie un memo à un pseudo ou un canal
+MEMO_HELP_CMD_CANCEL
+ CANCEL Annule le dernier memo que vous avez envoyé
+MEMO_HELP_CMD_LIST
+ LIST Liste vos memos
+MEMO_HELP_CMD_READ
+ READ Lit un ou des memos
+MEMO_HELP_CMD_DEL
+ DEL Efface un ou des memos
+MEMO_HELP_CMD_SET
+ SET Définit des options relatifs aux memos
+MEMO_HELP_CMD_INFO
+ INFO Affiche des informations à propos de vos memos
+MEMO_HELP_CMD_RSEND
+ RSEND Envoie un memo et demande un accusé de reception
+MEMO_HELP_CMD_CHECK
+ CHECK Vérifie si le dernier memo envoyé a un pseudo a été
+ lu
+MEMO_HELP_CMD_SENDALL
+ SENDALL Envoie un memo a tout les pseudos enregistré
+MEMO_HELP_CMD_STAFF
+ STAFF Envoie un memo à tout les opers/admins
+
+MEMO_HELP_HEADER
+ %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
+ canaux(*). Le pseudo de l'expéditeur ET du destinataire ou
+ du canal doivent être enregistrés pour pouvoir envoyer un
+ memo.
+
+ Les commandes de %S sont:
+
+
+MEMO_HELP_ADMIN
+ not used.
+MEMO_HELP_OPER
+ not used.
+MEMO_HELP_FOOTER
+
+ Tapez %R%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 canal peut lire ces memos du canal. Ceci
+ peut être changé avec la commande LEVELS de %s.
+
+MEMO_HELP_SEND
+ Syntaxe: SEND {pseudo | canal} texte du memo
+
+ Envoie un memo au pseudo ou canal nommé contenant
+ texte du memo. En envoyant à un pseudo, le destinataire
+ sera informé qu'il/elle a un nouveau memo. Le pseudo/canal
+ destinataire doit être enregistré.
+
+MEMO_HELP_CANCEL
+ Syntaxe: CANCEL {pseudo | canal}
+
+ Supprime le dernier memo que vous avez envoyé à un pseudo ou
+ canal donné, à condition qu'il n'ait pas été lu lorsque vous
+ utilisez la commande.
+
+MEMO_HELP_LIST
+ Syntaxe: LIST [canal] [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 [canal] {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 [canal] {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
+ pseudos)
+ LIMIT Définit le nombre de memos maximum que
+ vous pouvez recevoir
+
+ Tapez %R%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 [canal] limite
+
+ Définit le nombre maximum de memos que vous (ou le canal
+ 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 [canal]
+
+ 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 canal donné.
+
+MEMO_SERVADMIN_HELP_SET_LIMIT
+ Syntaxe: SET LIMIT [utilisateur | canal] {limite | NONE} [HARD]
+
+ Définit le nombre maximum de memos qu'un utilisateur ou
+ un canal 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
+ pseudo ou de canal, 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 canal 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 [pseudo | canal]
+
+ 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 canal, affiche la même information
+ pour le canal donné.
+
+ Avec un paramètre de pseudo, affiche la même information
+ pour le pseudo donné. Cette utilisation réservée aux Services
+ admins.
+
+###########################################################################
+#
+# OperServ help messages
+#
+###########################################################################
+
+MEMO_HELP_STAFF
+ Syntaxe: STAFF texte
+
+ Envoie un memo à tout le staff des services contenant le
+ texte.
+ Note: Si vous avez un bot ou des clones dans la liste des
+ oper et admins, ils recevront aussi un memo.
+
+###########################################################################
+#
+# OperServ help messages
+#
+###########################################################################
+
+MEMO_HELP_SENDALL
+ Syntaxe: SENDALL texte
+
+ Envoie un memo a tout les pseudos enregistré contenant le texte.
+
+###########################################################################
+#
+# OperServ help messages
+#
+###########################################################################
+
+MEMO_HELP_RSEND
+ Syntaxe: RSEND {pseudo | canal} texte
+
+ Envoie un memo au pseudo ou canal donné contenant le texte.
+ Lorsque c'est envoyé a un pseudo, le destinataire recevra une notice
+ l'avertissant de l'arrivé de nouveau(x) memo(s). Le destinataire dois
+ etre un pseudo ou un canal enregistré.
+ Une fois le memo lu, un accusé de réception vous est automatiquement
+ envoyé afin de vous assuré que le memo a été lu.
+
+###########################################################################
+#
+# OperServ help messages
+#
+###########################################################################
+
+MEMO_HELP_CHECK
+ Syntaxe: CHECK pseudo
+
+ Vérifie si le dernier memo que vous avez envoyé au pseudo donné
+ a été lu ou non.
+ Note: Cela fonctionne uniquement avec un pseudo et non pas avec un
+ canal.
+
+###########################################################################
+#
+# OperServ help messages
+#
+###########################################################################
+
+OPER_HELP_CMD_GLOBAL
+ GLOBAL Envoie un message à tous les utilisateurs
+OPER_HELP_CMD_STATS
+ STATS Affiche le status des Services et du réseau
+OPER_HELP_CMD_OPER
+ OPER Modifie la liste des opérateurs des Services
+OPER_HELP_CMD_ADMIN
+ ADMIN Modifie la liste des administrateurs des Services
+OPER_HELP_CMD_STAFF
+ STAFF Affiche le staff des services et leurs status
+OPER_HELP_CMD_MODE
+ MODE Change les modes d'un canal
+OPER_HELP_CMD_KICK
+ KICK Expulse un utilisateur d'un canal
+OPER_HELP_CMD_CLEARMODES
+ CLEARMODES Supprime tous les modes d'un canal
+OPER_HELP_CMD_KILLCLONES
+ KILLCLONES Déconnecte tous les utilisateurs ayant un
+ certain hostname
+OPER_HELP_CMD_AKILL
+ AKILL Contrôle la liste des AKILLs
+OPER_HELP_CMD_SGLINE
+ SGLINE Contrôle la liste des SGLINEs
+OPER_HELP_CMD_SQLINE
+ SQLINE Contrôle la liste des SQLINEs
+OPER_HELP_CMD_SZLINE
+ SZLINE Contrôle la liste des SZLINEs
+OPER_HELP_CMD_CHANLIST
+ CHANLIST Liste tous les canaux
+OPER_HELP_CMD_USERLIST
+ USERLIST Liste tous les utilisateurs
+OPER_HELP_CMD_LOGONNEWS
+ LOGONNEWS Définit les messages affichés aux utilisateurs
+ à la connexion
+OPER_HELP_CMD_RANDOMNEWS
+ RANDOMNEWS Définit les messages affichés aléatoirement
+ aux utilisateurs à la connexion
+OPER_HELP_CMD_OPERNEWS
+ OPERNEWS Définit les messages affichés aux utilisateurs
+ qui deviennent IRCops
+OPER_HELP_CMD_SESSION
+ SESSION Affiche la liste des sessions par host
+OPER_HELP_CMD_EXCEPTION
+ EXCEPTION Modifie la liste d'exceptions à la limite de
+ session
+OPER_HELP_CMD_NOOP
+ NOOP Supprime temporairement toutes les O:lines
+ d'un serveur
+OPER_HELP_CMD_JUPE
+ JUPE "Jupiter" un serveur
+OPER_HELP_CMD_IGNORE
+ IGNORE Modifier la liste d'ignore des services
+OPER_HELP_CMD_SET
+ SET Configure des options globales des Services
+OPER_HELP_CMD_RELOAD
+ RELOAD Recharge le fichier de configuration des Services
+OPER_HELP_CMD_UPDATE
+ UPDATE Oblige les bases de données des Services
+ à être sauvegardées immédiatement.
+OPER_HELP_CMD_RESTART
+ RESTART Sauvegarde les bases de données et relance les
+ Services.
+OPER_HELP_CMD_QUIT
+ QUIT Arrête les Services sans sauvegarde
+OPER_HELP_CMD_SHUTDOWN
+ SHUTDOWN Arrête les Services avec sauvegarde
+OPER_HELP_CMD_DEFCON
+ DEFCON Active/Désactive DefCon
+OPER_HELP_CMD_CHANKILL
+ CHANKILL Kill tout les utilisateurs d'un canal spécifique
+OPER_HELP_CMD_OLINE
+ OLINE Donne les flags d'un Oper à un utilisateur
+OPER_HELP_CMD_UMODE
+ UMODE Change un mode d'un utilisateur
+OPER_HELP_CMD_SVSNICK
+ SVSNICK Force le changement de pseudo d'un utilisateur
+OPER_HELP_CMD_MODLOAD
+ MODLOAD Charge un module
+OPER_HELP_CMD_MODUNLOAD
+ MODUNLOAD Décharge un module
+OPER_HELP_CMD_MODINFO
+ MODINFO Liste les informations sur un module chargé
+OPER_HELP_CMD_MODLIST
+ MODLIST Liste les modules chargés
+
+OPER_HELP
+ Commandes %S:
+
+OPER_HELP_LOGGED
+ Remarque: Toutes les commandes envoyées à %S sont enregistrées!
+
+OPER_HELP_GLOBAL
+ Syntaxe: GLOBAL message
+
+ Permet aux Administrators d'envoyer des messages à tous
+ les utilisateurs du réseau. Le message sera envoyé avec
+ le pseudo %s.
+
+OPER_HELP_STATS
+ Syntaxe: STATS [AKILL | ALL | RESET | MEMORY | UPLINK]
+
+ 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 la liste
+ d'AKILL 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.
+
+ L'option MEMORYaffiche les informations sur l'utilisation
+ de la mémoire par les services. L'utilisation de cette commande
+ peut paralyser les Services durant un court instant sur les gros
+ réseaux; n'en abuser pas!
+
+ L'option UPLINK affiche les informations sur le serveur qui est
+ utilisé pour linker Anope au réseau.
+
+ UPTIME est l'équivalent de STATS.
+
+OPER_HELP_OPER
+ Syntaxe: OPER ADD pseudo
+ OPER DEL {pseudo | entrée | liste}
+ OPER LIST [mask | liste]
+ OPER CLEAR
+
+ Permet aux Services Root d'ajouter ou de supprimer des
+ pseudo à ou de la liste des Services operators. Un utilisateur
+ dont le pseudo est dans la liste des Services operators et qui est
+ identifié auprès de %s aura accès aux commandes de Services
+ operateur.
+
+ La commande OPER ADD ajoute le pseudo donné à la liste
+ des Services operateurs.
+
+ La commande OPER DEL supprime le pseudo donné de
+ la liste des Services operateurs. 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 operateurs.
+ 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 operateurs.
+
+ Un opérateur IRC peut utiliser la forme OPER LIST de
+ la commande.
+
+OPER_HELP_ADMIN
+ Syntaxe: ADMIN ADD pseudo
+ ADMIN DEL {pseudo | entrée | liste}
+ ADMIN LIST [mask | liste]
+ ADMIN CLEAR
+
+ Permet au Services root d'ajouter ou de supprimer des
+ pseudos à ou de la liste des Services admins. Un utilisateur
+ dont le pseudo 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 pseudo donné à la liste
+ des Services admins.
+
+ La commande ADMIN DEL supprime le pseudo 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|CLEAR} [time] [nick | mask]
+
+ Allows Services Admins to make Services ignore a nick or mask
+ 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.
+ When adding a mask, it should be in the format user@host
+ or nick!user@host, everything else will be considered a nick.
+ Wildcards are permitted.
+
+ Ignores will not be enforced on IRC Operators.
+
+OPER_HELP_MODE
+ Syntaxe: MODE canal modes
+
+ Permet aux Services operateurs de définir les modes d'un
+ canal. Les paramètres sont les mêmes que pour la commande
+ /MODE normale.
+
+ Réservée aux Services operateurs.
+
+OPER_HELP_UMODE
+ Syntaxe: UMODE pseudo modes
+
+ Permet aux Super Admins de changer un mode d'un utilisateur.
+
+OPER_HELP_OLINE
+ Syntaxe: OLINE pseudo flags
+
+ Permet de mettre un OperFlag à un utilisateur.
+ Préfixes: "+" et "-". Pour tout supprimer, spécifiez "-"
+
+ Limité aux Super Admins.
+
+OPER_HELP_CLEARMODES
+ Syntaxe: CLEARMODES canal [ALL]
+
+ Enlève tous les modes binaires (i,k,l,m,n,p,s,t) et les bans
+ d'un canal. Si ALL est donné, enlève également tous les
+ ops et voices (modes +o et +v) du canal.
+
+ Réservée aux Services operators.
+
+OPER_HELP_KICK
+ Syntaxe: KICK canal utilisateur raison
+
+ Permet aux staff de kicker un utilisateur d'un canal.
+ Les paramètres sont les mêmes que pour la commande /KICK
+ normale. Le message de kick sera préfixé du pseudo de
+ l'IRCop ayant utilisé la commande KICK, par exemple:
+
+ *** SpamMan a été kické du canal #canal par %S (Alcan (Flood))
+
+ Réservée aux Services operators.
+
+OPER_HELP_SVSNICK
+ Syntaxe: SVSNICK pseudo nouveau-pseudo
+
+ Force le changement de pseudo d'un pseudo.
+ Limité aux Super 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 des logs sur un canal
+ 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
+ SQL Active ou désactive le mode SQL
+ IGNORE Active ou désactive le mode ignore
+ LIST Liste les options
+
+ 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 canaux et pseudos, etc. Les IRCops
+ ayant suffisamment de droits sur les Services pourront
+ modifier l'AKILL list des services et effacer ou interdire
+ des pseudos et canaux, 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.
+
+ Cette option est équivalente à l'option de la ligne de commande
+ -logchan.
+
+ 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 pseudos, canaux, 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_SET_SQL
+ Syntaxe: SET SQL {ON | OFF}
+
+ Activer cette option fera utiliser SQL a anope, cette option est
+ utilisé pour activé ou désactiver mysql lorsque votre serveur est
+ down et que les services sont en cour de fonctionnement.
+
+OPER_HELP_SET_IGNORE
+ Syntaxe: SET IGNORE {ON | OFF}
+
+ Activer ou désactivé cette option pour l'utilisation de l'ignore.
+
+OPER_HELP_SET_LIST
+ Syntaxe: SET LIST
+
+ Afficher diverse option à propos de %S
+
+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 <pseudo>", laissant paraître le pseudo
+ 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_CHANLIST
+ Syntaxe: CHANLIST [{modèle | pseudo} [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 canaux correspondants sont listés. Si
+ un pseudo est donné, les canaux sur lesquels est l'utilisateur ayant
+ ce pseudo seront listés. Si SECRET est spécifié, liste seulement les canaux
+ correspondants à modèle qui ont le mode +s ou +p.
+
+ Réservée aux Services admins.
+
+OPER_HELP_USERLIST
+ Syntaxe: USERLIST [{modèle | canal} [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 canal est donné, seuls les
+ utilisateurs du canal seront listés. +i INVISIBLE est spécifié,
+ seuls les utilisateurs avec le mode +i seront listés.
+
+ Réservée aux Services admins.
+
+OPER_HELP_MODLOAD
+ Syntaxe: MODLOAD Fichier
+
+ Cette commande charge le module depuis le fichier situé dans le repertoire
+ des modules.
+
+ Limité aux Services Roots.
+
+OPER_HELP_MODUNLOAD
+ Syntaxe: MODUNLOAD Fichier
+
+ Cette commande décharge le module depuis le fichier situé dans le repertoire
+ des modules.
+
+ Limité aux Services Roots.
+
+OPER_HELP_MODINFO
+ Syntaxe: MODINFO Fichier
+
+ Cette commande donne des informations sur un module chargé.
+
+ Limité aux Services Roots.
+
+OPER_HELP_MODLIST
+ Syntaxe: MODLIST [Core|3rd|protocol|encryption|supported|qatested]
+
+ Liste les modules actuelement chargés.
+
+ Limité aux Services Roots.
+
+
+###########################################################################
+#
+# BotServ help messages
+#
+###########################################################################
+
+BOT_HELP_CMD_BOTLIST
+ BOTLIST Liste les bots disponibles
+BOT_HELP_CMD_ASSIGN
+ ASSIGN Attribue un bot à un canal
+BOT_HELP_CMD_SET
+ SET Configure les options du bot
+BOT_HELP_CMD_KICK
+ KICK Configure les kickers
+BOT_HELP_CMD_BADWORDS
+ BADWORDS Gère la liste des mots interdits
+BOT_HELP_CMD_ACT
+ ACT Fait faire au bot l'équivalent de la commande /me
+BOT_HELP_CMD_INFO
+ INFO Vous permet de voir des informations a propos de BotServ sur
+ un canal ou un bot
+BOT_HELP_CMD_SAY
+ SAY Fait dire au bot le texte donné sur un canal
+BOT_HELP_CMD_UNASSIGN
+ UNASSIGN Retire le bot d'un canal
+BOT_HELP_CMD_BOT
+ BOT Gère la liste des bots du réseau
+
+BOT_HELP
+ %S vous permet d'avoir un bot sur votre canal.
+ 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
+ %R%S command. Pour plus d'information sur
+ une commande spécifique, tapez %R%S HELP command.
+
+BOT_HELP_FOOTER
+ Le bot joindra un canal dès qu'il y aura au moins
+ %d utilisateur(s) dessus.
+
+BOT_HELP_BOTLIST
+ Syntaxe: BOTLIST
+
+ Liste tous les bots disponibles sur ce réseau.
+
+BOT_HELP_ASSIGN
+ Syntaxe: ASSIGN canal pseudo
+
+ Attribue le bot désigné par pseudo au canal. Vous
+ pouvez ensuite configurer le bot pour qu'il convienne à
+ vos besoins.
+
+BOT_HELP_UNASSIGN
+ Syntaxe: UNASSIGN canal
+
+ Retire le bot d'un canal. Si vous utilisez cette commande,
+ le bot ne joindra plus le canal. 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 {canal | pseudo}
+
+ Vous permet de voir les informations %S pour un canal
+ ou un bot. Si le paramètre est un canal, vous verrez
+ des informations sur le canal tels que les kickers
+ actifs. Si le paramètre est un pseudo, vous verrez des
+ informations à propos d'un bot, comme le temps de
+ création ou le nombre de canaux auxquels il a été
+ attribué.
+
+BOT_HELP_SET
+ Syntaxe: SET canal option paramètres
+
+ 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 %R%S HELP SET option pour plus d'infos
+ sur une option spécifique.
+
+BOT_HELP_SET_DONTKICKOPS
+ Syntaxe: SET canal DONTKICKOPS {ON|OFF}
+
+ Active ou désactive la protection des ops sur un
+ canal. 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 canal DONTKICKVOICES {ON|OFF}
+
+ Active ou désactive la protection des voices sur un
+ canal. 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
+ Syntaxe: SET canal FANTASY {ON|OFF}
+
+ Active ou désactive le mode fantaisie sur un
+ canal. Quand elle est active, cette option
+ permet aux utilisateurs d'utiliser les commandes
+ !op, !deop, !voice, !devoice, !kick, !kb, !unban
+ et !seen sur un canal (trouvez comment les utiliser;
+ essayez avec ou sans pseudo 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 canal GREET {ON|OFF}
+
+ Active ou désactive le mode message d'accueil
+ sur un canal. Quand elle est active, cette option
+ fait afficher au bot le message d'accueil de chaque
+ utilisateur qui a un accès suffisant au canal.
+
+BOT_HELP_SET_SYMBIOSIS
+ Syntax: SET canal SYMBIOSIS {ON|OFF}
+
+ Active ou désactive la symbiose sur un canal.
+ Quand elle est active, cette option fait faire
+ au bot tout ce qui est normalement effectué
+ par %s sur les canaux, tels que les MODEs,
+ les KICKs, et même le message d'entrée.
+
+BOT_HELP_KICK
+ Syntaxe: KICK canal option paramètres
+
+ 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 %R%S HELP KICK option pour plus d'informations
+ sur une option en particulier.
+
+BOT_HELP_KICK_BOLDS
+ Syntaxe: KICK canal 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 canal 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 canal 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 canal 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 canal 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 canal.
+
+ 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 canal 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 canal
+ 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 #canal 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 #canal 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 canal.
+
+ Vous pouvez définir les mots interdits pour votre
+ channel en utilisant la commande BADWORDS. Tapez
+ %R%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 canal ADD mot [SINGLE | START | END]
+ BADWORDS canal DEL {mot | entry-num | liste}
+ BADWORDS canal LIST [mask | liste]
+ BADWORDS canal CLEAR
+
+ Gère la liste des mots interdits d'un canal. 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 %R%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 #canal 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 canal texte
+
+ Fait dire au bot le texte donné sur le canal donné.
+
+BOT_HELP_ACT
+ Syntaxe: ACT canal texte
+
+ Fait faire au bot l'équivalent d'une commande "/me"
+ sur le canal donné avec le texte donné.
+
+BOT_SERVADMIN_HELP_BOT
+ Syntax: BOT ADD pseudo user host real
+ BOT CHANGE ancien-pseudo nouveau-pseudo [user [host [real]]]
+ BOT DEL pseudo
+
+ Permet aux Services admins de créer, modifier, et
+ supprimer les bots que les utilisateurs pourront
+ utiliser sur leurs canaux.
+
+ BOT ADD ajoute un bot avec le pseudo, 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 pseudo, 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.
+
+ Note: si vous créez un bot ayant un pseudo enregistré
+ avec NickServ, il sera effacé. De plus, si un utilisateur
+ utilise le pseudo 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 canal
+ PRIVATE Empêche un bot d'être attribué par
+ des non-opérateurs IRC
+
+BOT_SERVADMIN_HELP_SET_NOBOT
+ Syntaxe: SET canal NOBOT {ON|OFF}
+
+ Cette option empêche un bot d'être attribué au canal.
+ 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
+ canal 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 Pseudo:%s, vhost:%s (%s - %s)
+HOST_IDENT_ENTRY
+ #%d Pseudo:%s, vhost:%s@%s (%s - %s)
+HOST_SET
+ Le vhost pour %s enregistrée en %s.
+HOST_IDENT_SET
+ Le vhost pour %s enregistrée en %s@%s.
+HOST_SETALL
+ Le vhost pour le groupe %s enregistrée en %s.
+HOST_DELALL
+ Le vhosts pour le groupe %s a été supprimé.
+HOST_DELALL_SYNTAX
+ Syntaxe: DELALL <pseudo>.
+HOST_IDENT_SETALL
+ Le 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
+ L'identd du vhost dois etre dans un format d'identd valide
+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 %R%s set <pseudo> <hostmask>.
+HOST_SETALL_SYNTAX
+ Syntaxe %R%s setall <pseudo> <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
+ Le vhost pour %s a été supprimé.
+HOST_DEL_SYNTAX
+ Syntaxe: %R%s del <pseudo>.
+
+###########################################################################
+#
+# HostServ Help messages
+#
+###########################################################################
+HOST_OFF_UNREAL
+ Votre vhost a été enlevée. Pour réactiver la protection de votre IP, tapez /mode %s +%s
+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
+ Affiche tout les enregistrement (Nb: %d)
+HOST_LIST_RANGE_FOOTER
+ Affiche les enregistrement de %d à %d
+HOST_LIST_KEY_FOOTER
+ Affiche les enregistrement contenant %s (Nb: %d)
+
+###########################################################################
+#
+# HostServ Help messages
+#
+###########################################################################
+HOST_HELP_CMD_ON
+ ON Active une vhost
+HOST_HELP_CMD_OFF
+ OFF Désactive une vhost
+HOST_HELP_CMD_GROUP
+ GROUP Synchronise toutes les vhosts d'un group
+HOST_HELP_CMD_SET
+ SET Configure la vhost d'un pseudo
+HOST_HELP_CMD_SETALL
+ SETALL Configure la vhost pour tous les pseudos d'un groupe
+HOST_HELP_CMD_DEL
+ DEL Supprime la vhost d'un pseudo
+HOST_HELP_CMD_DELALL
+ DELALL Supprime la vhost pour tout les pseudo d'un groupe
+HOST_HELP_CMD_LIST
+ LIST Recherche une vhost
+HOST_OPER_HELP
+ not used.
+
+HOST_ADMIN_HELP
+ not used.
+
+HOST_HELP
+ %S commandes:
+
+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 <pseudo> <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
+ Syntaxe: DELALL <pseudo>.
+
+ Supprime tout les vhosts pour tout les pseudos du meme
+ groupe que le pseudo donné.
+
+ Limité aux Services Oper.
+
+
+HOST_HELP_SETALL
+ Syntaxe: SETALL <pseudo> <hostmask>.
+
+ Configure la vhost pour toutes les pseudos d'un même
+ groupe. Si l'ircd supporte la modification de l'ident, utilisez
+ SET <pseudo> <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 <pseudo>
+
+ Supprime la vhost pour le pseudo indiqué.
+
+ Limité aux ServicesOpérateurs.
+
+HOST_HELP_LIST
+ Syntaxe: LIST [<clé>|<#X-Y>]
+
+ Cette commande liste tout les vhosts enregistré, si une clé
+ est spécifié, seulement les résultats contenant le pseudo ou
+ le vhosts seront afficher, par exemple : Rob* pour toute les
+ entrée contenant "Rob"
+
+ Si le style #X-Y est utilisé, seul les entrée entre X et Y
+ seront affiché, par exemple: #1-3 affichera les 3 premières
+ entrée.
+
+ La liste utilise la valeur de NSListMax pour une limite hard
+ du nombre de résultats affichés en une fois.
+
+ Limité aux Services operateurs.
+
+HOST_HELP_GROUP
+ Syntaxe: GROUP
+
+ Permet d'enregistrer la vHost du pseudo actuellement
+ utilisé pour tous les pseudos du groupe.
+
+OPER_SVSNICK_UNSUPPORTED
+ Désolé, SVSNICK n'est pas accéssibe sur ce réseau.
+
+OPER_SQLINE_UNSUPPORTED
+ Désolé, SQLINE n'est pas accéssible sur ce réseau.
+
+OPER_SVSO_UNSUPPORTED
+ Désolé, OLINE n'est pas accéssible sur ce réseau.
+
+OPER_UMODE_UNSUPPORTED
+ Désolé, UMODE n'est pas accéssible sur ce réseau.
+
+OPER_SUPER_ADMIN_NOT_ENABLED
+ L'option SuperAdmin n'est pas activé dans le services.conf
+
diff --git a/lang/gr.l b/lang/gr.l
new file mode 100644
index 000000000..e4b3f2d09
--- /dev/null
+++ b/lang/gr.l
@@ -0,0 +1,6795 @@
+# Greek language file.
+#
+# (C) 2003-2008 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 us know
+# (dev@anope.org) 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
+# services.conf). 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. "%R%s HELP" ãéá âïÞèåéá.
+SYNTAX_ERROR
+ Óýíôáîç åíôïëÞò: %s
+MORE_INFO
+ %R%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
+ ËÜèïò êùäéêüò.
+INVALID_TARGET
+ "/msg %s" is no longer supported. Use "/msg %s@%s" or "/%s" instead.
+
+# 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_TOO_LONG
+ Your password is too long. Please try again with a shorter password.
+
+NICK_NOT_REGISTERED
+ Áõôü ôï øåõäþíõìï äåí Ý÷åé êáôï÷õñùèåß.
+NICK_NOT_REGISTERED_HELP
+ Áõôü ôï øåõäþíõìï äåí Ý÷åé êáôï÷õñùèåß. ÃñÜøå %R%s HELP ãéá ðåñéóóüôåñåò ðëçñïöïñßåò ó÷åôéêÜ ãéá ôçí êáôï÷ýñùóç øåõäùíýìïõ..
+NICK_X_IS_SERVICES
+ Nick %s is part of this Network's Services.
+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.
+NICK_X_SUSPENDED
+ Nick %s is currently suspended.
+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
+ Ï êùäéêüò áíáãíþñéóçò áðáéôåßôáé ãéá áõôÞ ôçí åíôïëÞ.
+ ÎáíáðñïóðáèÞóôå áöïý ãñÜøåôå %R%s IDENTIFY ^_êùäéêüò^_.
+CHAN_IDENTIFY_REQUIRED
+ Ï êùäéêüò áíáãíþñéóçò áðáéôåßôáé ãéá áõôÞ ôçí åíôïëÞ.
+ ÎáíáðñïóðáèÞóôå áöïý ãñÜøåôå %R%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
+LIST_INCORRECT_RANGE
+ Incorrect range specified. The correct syntax is #from-to.
+CS_LIST_INCORRECT_RANGE
+ To search for channels starting with #, search for the channel
+ name without the #-sign prepended (anope instead of #anope).
+
+###########################################################################
+#
+# NickServ messages
+#
+###########################################################################
+
+# Automatic messages
+HELP_LIMIT_SERV_OPER
+ Limited to Services Operators.
+HELP_LIMIT_SERV_ADMIN
+ Limited to Services Administrators.
+HELP_LIMIT_SERV_ROOT
+ Limited to Services Roots.
+HELP_LIMIT_IRC_OPER
+ Limited to IRC Operators.
+HELP_LIMIT_HOST_SETTER
+ Limited to Host Setters.
+HELP_LIMIT_HOST_REMOVER
+ Limited to Host Removers.
+
+
+###########################################################################
+#
+# NickServ messages
+#
+###########################################################################
+
+# Automatic messages
+NICK_IS_REGISTERED
+ Áõôü ôï øåõäþíõìï áíÞêåé óå êÜðïéïí Üëëïí. Ðáñáêáëþ äéÜëåîå êÜðïéï Üëëï.
+ (Áí áõôü åßíáé ôï øåõäþíõìü óïõ, ãñÜøå %R%s IDENTIFY ^_êùäéêü^_.)
+NICK_IS_SECURE
+ Áõôü ôï øåõäþíõìï åßíáé êáôï÷õñùìÝíï êáé ðñïóôáôåõìÝíï. Áí áõôü åßíáé ôï
+ øåõäþíõìï óïõ, ãñÜøå %R%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_REGISTERED_NO_MASK
+ Nickname %s registered.
+NICK_PASSWORD_IS
+ Ï êùäéêüò óïõ åßíáé %s - èõìÞóïõ ôïí ãéá áñãüôåñç ÷ñÞóç.
+
+# GROUP responses
+NICK_REG_DELAY
+ You have to be connected longer than %d seconds to register your nick.
+
+# GROUP responses
+NICK_GROUP_SYNTAX
+ GROUP ^_óôü÷ïò^_ ^_êùäéêü^_
+NICK_GROUP_DISABLED
+ Óõãíþìç, ç ïìáäïðïßçóç ôïõ øåõäþíõìïý óïõ åßíáé ãéá ôçí þñá áðåíåñãïðïéçìÝíç.
+NICK_GROUP_FAILED
+ Óõãíþìç, ç ïìáäïðïßçóç ôïõ øåõäþíõìïý óïõ åßíáé ãéá ôçí þñá áðåíåñãïðïéçìÝíç.
+NICK_GROUP_PLEASE_WAIT
+ Ðáñáêáëþ ðåñßìåíå %d äåõôåñüëåðôá êáé ìåôÜ îáíá÷ñçóéìïðïßçóå ôçí åíôïëÞ ïìáäïðïßçóçò.
+NICK_GROUP_CHANGE_DISABLED
+ Áõôü ôï øåõäþíõìï åßíáé Þäç êáôï÷õñùìÝíï; ãñÜøå %R%s DROP áñ÷éêÜ.
+NICK_GROUP_SAME
+ Åßóáé Þäç ìÝëïò ôçò ïìÜäáò ôïõ %s.
+NICK_GROUP_TOO_MANY
+ Åßíáé ðÜñá ðïëëÜ øåõäþíõìá ìÝóá %s's ïìÜäá; êñÜôá ìåñéêÜ êáé âãÜëå êÜðïéá.
+ ÃñÜøå ^B%R%s HELP GLIST^B êáé %R%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
+ ÃñÜøå %R%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_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. ÃñÜøå %R%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_HIDE_STATUS_ON
+ Your services access status will now be hidden from %s INFO displays.
+NICK_SET_HIDE_STATUS_OFF
+ Your services access status will now be shown in %s INFO displays.
+
+# SET MSG responses
+NICK_SET_MSG_SYNTAX
+ SET PRIVATE {ON | OFF}
+NICK_SET_MSG_ON
+ Ïé õðçñåóßåò èá óå åéäïðïéïýí ìå messages.
+NICK_SET_MSG_OFF
+ Ïé õðçñåóßåò èá óå åéäïðïéïýí ìå notices.
+
+# SET AUTOOP responses
+NICK_SET_AUTOOP_SYNTAX
+ SET AUTOOP {ON | OFF}
+NICK_SET_AUTOOP_ON
+ Services will now autoop you in channels.
+NICK_SET_AUTOOP_OFF
+ Services will no longer autoop you in channels.
+
+# SET NOEXPIRE responses
+NICK_SASET_SYNTAX
+ SASET nickname option parameters
+NICK_SASET_DISABLED
+ Sorry, nickname option setting is temporarily disabled.
+NICK_SASET_UNKNOWN_OPTION
+ Unknown SASET option %s.
+NICK_SASET_BAD_NICK
+ Nickname %s not registered.
+NICK_SASET_OPTION_DISABLED
+ Option %s cannot be set on this network.
+
+# SASET DISPLAY responses
+NICK_SASET_DISPLAY_INVALID
+ The new display for %s MUST be a nickname of the nickname group!
+NICK_SASET_DISPLAY_CHANGED
+ The new display is now %s.
+
+# SASET PASSWORD responses
+NICK_SASET_PASSWORD_FAILED
+ Sorry, couldn't change password for %s.
+NICK_SASET_PASSWORD_CHANGED
+ Password for %s changed.
+NICK_SASET_PASSWORD_CHANGED_TO
+ Password for %s changed to %s.
+
+# SASET LANGUAGE responses
+NICK_SASET_URL_CHANGED
+ URL for %s changed to %s.
+NICK_SASET_URL_UNSET
+ URL %s unset.
+
+# SASET EMAIL responses
+NICK_SASET_EMAIL_CHANGED
+ E-mail address for %s changed to %s.
+NICK_SASET_EMAIL_UNSET
+ E-mail address for %s unset.
+NICK_SASET_EMAIL_UNSET_IMPOSSIBLE
+ You cannot unset the e-mail on this network.
+
+# SASET ICQ responses
+NICK_SASET_ICQ_CHANGED
+ ICQ number for %s set to %s.
+NICK_SASET_ICQ_UNSET
+ ICQ number for %s unset.
+NICK_SASET_ICQ_INVALID
+ %s is not a valid number.
+
+# SASET GREET responses
+NICK_SASET_GREET_CHANGED
+ Greet message for %s changed to %s.
+NICK_SASET_GREET_UNSET
+ Greet message for %s unset.
+
+# SASET PROTECT responses
+NICK_SASET_KILL_SYNTAX
+ SASET nickname KILL {ON | QUICK | OFF}
+NICK_SASET_KILL_IMMED_SYNTAX
+ SASET nickname KILL {ON | QUICK | IMMED | OFF}
+NICK_SASET_KILL_ON
+ Protection is now ON for %s.
+NICK_SASET_KILL_QUICK
+ Protection is now ON for %s, with a reduced delay.
+NICK_SASET_KILL_IMMED
+ Protection is now ON for %s, with no delay.
+NICK_SASET_KILL_IMMED_DISABLED
+ The IMMED option is not available on this network.
+NICK_SASET_KILL_OFF
+ Protection is now OFF for %s.
+
+# SASET SECURE responses
+NICK_SASET_SECURE_SYNTAX
+ SASET nickname SECURE {ON | OFF}
+NICK_SASET_SECURE_ON
+ Secure option is now ON for %s.
+NICK_SASET_SECURE_OFF
+ Secure option is now OFF for %s.
+
+# SASET PRIVATE responses
+NICK_SASET_PRIVATE_SYNTAX
+ SASET nickname PRIVATE {ON | OFF}
+NICK_SASET_PRIVATE_ON
+ Private option is now ON for %s.
+NICK_SASET_PRIVATE_OFF
+ Private option is now OFF for %s.
+
+# SASET HIDE responses
+NICK_SASET_HIDE_SYNTAX
+ SET nickname HIDE {EMAIL | USERMASK | QUIT} {ON | OFF}
+NICK_SASET_HIDE_EMAIL_ON
+ The E-mail address of %s will now be hidden from %s INFO displays.
+NICK_SASET_HIDE_EMAIL_OFF
+ The E-mail address of %s will now be shown in %s INFO displays.
+NICK_SASET_HIDE_MASK_ON
+ The last seen user@host mask of %s will now be hidden from %s INFO displays.
+NICK_SASET_HIDE_MASK_OFF
+ The last seen user@host mask of %s will now be shown in %s INFO displays.
+NICK_SASET_HIDE_QUIT_ON
+ The last quit message of %s will now be hidden from %s INFO displays.
+NICK_SASET_HIDE_QUIT_OFF
+ The last quit message of %s will now be shown in %s INFO displays.
+NICK_SASET_HIDE_STATUS_ON
+ The services access status of %s will now be hidden from %s INFO displays.
+NICK_SASET_HIDE_STATUS_OFF
+ The services access status of %s will now be shown in %s INFO displays.
+
+# SASET MSG responses
+NICK_SASET_MSG_SYNTAX
+ SSAET nickname PRIVATE {ON | OFF}
+NICK_SASET_MSG_ON
+ Services will now reply to %s with messages.
+NICK_SASET_MSG_OFF
+ Services will now reply to %s with notices.
+
+# SET NOEXPIRE responses
+NICK_SASET_NOEXPIRE_SYNTAX
+ SASET nickname NOEXPIRE {ON | OFF}
+NICK_SASET_NOEXPIRE_ON
+ Nick %s will not expire.
+NICK_SASET_NOEXPIRE_OFF
+ Nick %s will expire.
+
+# ACCESS responses
+NICK_SASET_AUTOOP_SYNTAX
+ SASET nickname AUTOOP {ON | OFF}
+NICK_SASET_AUTOOP_ON
+ Services will now autoop %s in channels.
+NICK_SASET_AUTOOP_OFF
+ Services will no longer autoop %s in channels.
+
+# SASET LANGUAGE responses
+NICK_SASET_LANGUAGE_SYNTAX
+ SASET nickname LANGUAGE number
+NICK_SASET_LANGUAGE_UNKNOWN
+ Unknown language number %d. Type %R%s HELP SET LANGUAGE for a list of languages.
+NICK_SASET_LANGUAGE_CHANGED
+ Language changed to Greek.
+
+
+# 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:
+NICK_ACCESS_LIST_EMPTY
+ Your access list is empty.
+NICK_ACCESS_LIST_X_EMPTY
+ Access list for %s is empty.
+
+# Status messages
+NICK_STATUS_0
+ STATUS %s 0
+NICK_STATUS_1
+ STATUS %s 1
+NICK_STATUS_2
+ STATUS %s 2
+NICK_STATUS_3
+ STATUS %s 3
+
+# 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_SERVICES_ROOT
+ %s is a services root administrator.
+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_VHOST2
+ vhost: %s@%s
+NICK_INFO_ICQ
+ ICQ #: %d
+NICK_INFO_GREET
+ ÌÞíõìá ÷áéñåôéóìïý: %s
+NICK_INFO_OPTIONS
+ ÅðéëïãÝò: %s
+NICK_INFO_EXPIRE
+ Expires in: %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_AUTOOP
+ Auto-op
+NICK_INFO_OPT_NONE
+ ÊáíÝíá
+NICK_INFO_NO_EXPIRE
+ Áõôü ôï øåõäþíõìï äåí èá ëÞîåé ðïôÝ.
+NICK_INFO_FOR_MORE
+ Ãéá ðåñéóóüôåñåò ðëçñïöïñßåò, ãñÜøå %R%s INFO %s ALL.
+
+# LIST responses
+NICK_INFO_SUSPENDED
+ This nickname is currently suspended, reason: %s
+NICK_INFO_SUSPENDED_NO_REASON
+ This nickname is currently suspended
+
+# LIST responses
+NICK_LIST_SYNTAX
+ LIST pattern
+NICK_LIST_SERVADMIN_SYNTAX
+ LIST pattern [FORBIDDEN] [SUSPENDED] [NOEXPIRE] [UNCONFIRMED]
+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 øåõäþíõìá ìÝóá óôçí ïìÜäá.
+NICK_GLIST_REPLY
+ %c%s
+NICK_GLIST_REPLY_ADMIN
+ %c%s (expires in %s)
+
+# RECOVER responses
+NICK_RECOVER_SYNTAX
+ RECOVER nickname [password]
+NICK_NO_RECOVER_SELF
+ Äåí ìðïñåßò íá øÜ÷íåéò ôïí åáõôü óïõ!
+NICK_RECOVERED
+ User claiming your nick has been killed.
+ %R%s RELEASE %s to get it back before %s timeout.
+
+# 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_SUSPEND_SYNTAX
+ SUSPEND nickname reason
+NICK_SUSPEND_SUCCEEDED
+ Nick %s is now suspended.
+NICK_SUSPEND_FAILED
+ Couldn't suspend nick %s!
+
+# UNSUSPEND responses
+NICK_UNSUSPEND_SYNTAX
+ UNSUSPEND nickname
+NICK_UNSUSPEND_SUCCEEDED
+ Nick %s is now released.
+NICK_UNSUSPEND_FAILED
+ Couldn't release nick %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 %R%s confirm <passcode> to complete registration
+NICK_CONFIRM_NOT_FOUND
+ Registration step 1 may have expired, please use "%R%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 " %R%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_X_INVALID
+ Channel %s is not a valid channel.
+
+# REGISTER responses
+CHAN_REGISTER_SYNTAX
+ REGISTER channel password description
+CHAN_REGISTER_DISABLED
+ Óõãíþìç, ç õðçñåóßá êáôï÷ýñùóåéò êáíáëéþí äåí ëåéôïõñãåß ãéá ôçí þñá.
+CHAN_REGISTER_NOT_LOCAL
+ ÊáíÜëéá ôïðéêÜ äåí ìðïñïýí íá êáôï÷õñùèïýí.
+CHAN_MUST_REGISTER_NICK
+ ÐñÝðåé íá êáôï÷õñþóåéò ôï øåõäþíõìü óïõ ðñþôá. ÃñÜøå %R%s HELP ãéá ðëçñïöïñßåò ó÷åôéêÜ ìå ôá ïíüìáôá ðïõ Ý÷ïõí êáôï÷õñùèåß..
+CHAN_MUST_IDENTIFY_NICK
+ Ðáñáêáëþ êÜíå ôçí åíôïëÞ áíáãíþñéóçò ìå ôïí %s ðñþôá, ÷ñçóéìïðïéþíôáò ôçí åíôïëÞ:
+ %R%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 - èõìÞóïõ ôïí ãéáôß èá ôïí ÷ñåéáóôåßò ìåôÜ.
+CHAN_REGISTER_NONE_CHANNEL
+ You have attempted to register a nonexistent channel %s
+CHAN_SYMBOL_REQUIRED
+ Please use the symbol of # when attempting to register
+
+
+# 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 (except the channel founder).
+CHAN_LOGOUT_FOUNDER_FAILED
+ You may not log out of %s (you are founder).
+
+# 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 option for %s is now ON.
+CHAN_SET_KEEPTOPIC_OFF
+ Topic retention option for %s is now OFF.
+
+# SET TOPICLOCK responses
+CHAN_SET_TOPICLOCK_SYNTAX
+ SET channel TOPICLOCK {ON | OFF}
+CHAN_SET_TOPICLOCK_ON
+ Topic lock option for %s is now ON.
+CHAN_SET_TOPICLOCK_OFF
+ Topic lock option for %s is now OFF.
+
+# SET PEACE responses
+CHAN_SET_PEACE_SYNTAX
+ SET channel PEACE {ON | OFF}
+CHAN_SET_PEACE_ON
+ Peace option for %s is now ON.
+CHAN_SET_PEACE_OFF
+ Peace option for %s is now OFF.
+
+# SET PRIVATE responses
+CHAN_SET_PRIVATE_SYNTAX
+ SET channel PRIVATE {ON | OFF}
+CHAN_SET_PRIVATE_ON
+ Private option for %s is now ON.
+CHAN_SET_PRIVATE_OFF
+ Private option for %s is now OFF.
+
+# SET SECUREOPS responses
+CHAN_SET_SECUREOPS_SYNTAX
+ SET channel SECUREOPS {ON | OFF}
+CHAN_SET_SECUREOPS_ON
+ Secure ops option for %s is now ON.
+CHAN_SET_SECUREOPS_OFF
+ Secure ops option for %s is now OFF.
+
+# SET SECUREFOUNDER responses
+CHAN_SET_SECUREFOUNDER_SYNTAX
+ SET channel SECUREFOUNDER {ON | OFF}
+CHAN_SET_SECUREFOUNDER_ON
+ Secure founder option for %s is now ON.
+CHAN_SET_SECUREFOUNDER_OFF
+ Secure founder option for %s is now OFF.
+
+# SET RESTRICTED responses
+CHAN_SET_RESTRICTED_SYNTAX
+ SET channel RESTRICTED {ON | OFF}
+CHAN_SET_RESTRICTED_ON
+ Restricted access option for %s is now ON.
+CHAN_SET_RESTRICTED_OFF
+ Restricted access option for %s is now OFF.
+
+# SET SECURE responses
+CHAN_SET_SECURE_SYNTAX
+ SET channel SECURE {ON | OFF}
+CHAN_SET_SECURE_ON
+ Secure option for %s is now ON.
+CHAN_SET_SECURE_OFF
+ Secure option for %s is now OFF.
+
+# SET SIGNKICK responses
+CHAN_SET_SIGNKICK_SYNTAX
+ SET channel SIGNKICK {ON | LEVEL | OFF}
+CHAN_SET_SIGNKICK_ON
+ Signed kick option for %s is now ON.
+CHAN_SET_SIGNKICK_LEVEL
+ Signed kick option for %s is now ON, but depends of the
+ level of the user that is using the command.
+CHAN_SET_SIGNKICK_OFF
+ Signed kick option for %s is now OFF.
+
+# SET OPNOTICE responses
+CHAN_SET_OPNOTICE_SYNTAX
+ SET channel OPNOTICE {ON | OFF}
+CHAN_SET_OPNOTICE_ON
+ Op-notice option for %s is now ON.
+CHAN_SET_OPNOTICE_OFF
+ Op-notice option for %s is now OFF.
+
+# SET XOP responses
+CHAN_SET_XOP_SYNTAX
+ SET channel XOP {ON | OFF}
+CHAN_SET_XOP_ON
+ xOP lists system for %s is now ON.
+CHAN_SET_XOP_OFF
+ xOP lists system for %s is now 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 åíôïëÞ áíôß ãéá áõôÞ.
+ ÃñÜøå %R%s HELP ACCESS ãéá ðåñéóóüôåñåò ðëçñïöïñßåò.
+CHAN_XOP_NOT_AVAILABLE
+ xOP system is not available.
+
+# 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 åßíáé :
+ Íïýìåñï Øåõäþíõìï
+
+# HOP messages
+CHAN_AOP_CLEAR
+ Channel %s AOP list has been cleared.
+
+# 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 åßíáé:
+ Íïýìåñï Øåõäþíõìï
+
+# SOP messages
+CHAN_HOP_CLEAR
+ Channel %s HOP list has been cleared.
+
+# 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 åßíáé:
+ Íïýìåñï Øåõäþíõìï
+
+# VOP messages
+CHAN_SOP_CLEAR
+ Channel %s SOP list has been cleared.
+
+# 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 åßíáé:
+ Íïýìåñï Øåõäþíõìï
+
+# ACCESS messages
+CHAN_VOP_CLEAR
+ Channel %s VOP list has been cleared.
+
+# ACCESS messages
+CHAN_ACCESS_SYNTAX
+ ACCESS channel {ADD|DEL|LIST|CLEAR} [nick [level] | entry-list]
+CHAN_ACCESS_XOP
+ Äåí ìðïñåßò íá ÷ñçóéìïðïéÞóåéò áõôÞ ôçí åíôïëÞ.
+ ×ñçóéìïðïßçóå AOP, SOP êáé VOP åíôïëÝò áíôß ãéá ôçí access.
+ ÃñÜøå %R%s HELP command ãéá ðåñéóóüôåñåò ðëçñïöïñßåò.
+CHAN_ACCESS_XOP_HOP
+ You can't use this command.
+ Use the AOP, SOP, HOP and VOP commands instead.
+ Type %R%s HELP command for more information.
+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
+
+# AKICK responses
+CHAN_ACCESS_CLEAR
+ Channel %s 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
+ Óõãíþìç, ç õðçñåóßá ãéá ôçí åíôïëÞ 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 ÷ñÞóôåò èá åðéññåáóôïýí.
+
+# LEVELS responses
+CHAN_AKICK_CLEAR
+ Channel %s akick list has been cleared.
+
+# 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 äåí åßíáé ãíùóôÞ. ÃñÜøå %R%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 óâÞóôçêå óôï áñ÷éêü.
+
+# Status Messages
+CHAN_STATUS_SYNTAX
+ STATUS ERROR Syntax error
+CHAN_STATUS_NOT_REGGED
+ STATUS ERROR Channel %s not registered
+CHAN_STATUS_FORBIDDEN
+ STATUS ERROR Channel %s forbidden
+CHAN_STATUS_NOTONLINE
+ STATUS ERROR Nick %s not online
+CHAN_STATUS_INFO
+ STATUS %s %s %d
+
+# 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_EXPIRE
+ Expires in: %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 channel what
+CHAN_CLEARED_BANS
+ ¼ëá ôá bans áðü ôï êáíÜëé %s Ý÷ïõí áðïìáêñõíèåß.
+CHAN_CLEARED_EXCEPTS
+ ¼ëá ôá excepts áðü ôï êáíÜëé %s Ý÷ïõí áðïìáêñõíèåß.
+CHAN_CLEARED_MODES
+ ¼ëá ôá modes áðü ôï êáíÜëé %s Ý÷ïõí óâçóôåß.
+CHAN_CLEARED_OPS
+ ¼ëá ôá Mode +o Ý÷åé êáèáñéóôåß áðü ôï êáíÜëé %s.
+CHAN_CLEARED_HOPS
+ Mode +h has been cleared from channel %s.
+CHAN_CLEARED_VOICES
+ ¼ëá ôá Mode +v Ý÷åé êáèáñéóôåß áðü ôï êáíÜëé %s.
+CHAN_CLEARED_USERS
+ ¼ëïé ïé ÷ñÞóôåò Ýãéíáí kick áðü ôï êáíÜëé %s.
+CHAN_CLEARED_INVITES
+ All invites on channel %s have been removed.
+
+# GETPASS responses
+CHAN_GETPASS_SYNTAX
+ GETPASS êáíÜëé
+CHAN_GETPASS_UNAVAILABLE
+ Ç åíôïëÞ GETPASS äåí åßíáé äéáèÝóéìç ãéáôß ç êùäéêïðïßçóç åßíáé óå ëåéôïõñãßá.
+CHAN_GETPASS_PASSWORD_IS
+ Ï êùäéêüò ãéá ôï êáíÜëé %s åßíáé %s.
+
+# SENDPASS responses
+CHAN_GETKEY_SYNTAX
+ GETKEY channel
+CHAN_GETKEY_NOKEY
+ The channel %s has no key.
+CHAN_GETKEY_KEY
+ KEY %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
+ ÃñÜøå %R%s READ LAST ãéá íá ôï äéáâÜóåéò.
+MEMO_TYPE_READ_NUM
+ ÃñÜøå %R%s READ %d ãéá íá äéáâÜóåéò.
+MEMO_TYPE_LIST_NEW
+ ÃñÜøå %R%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 %R%s READ %s %d to read it.
+MEMO_NEW_MEMO_ARRIVED
+ ¸÷åéò Ýíá íÝï ìÞíõìá áðü %s.
+ ÃñÜøå %R%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. Ãéá íá ôï äéáâÜóåéò, ãñÜøå: %R%s READ num
+MEMO_LIST_NEW_MEMOS
+ ÍÝá ìçíýìáôá ãéá ôïí %s. Ãéá íá ôá äéáâÜóåéò, ãñÜøå: %R%s READ num
+MEMO_LIST_CHAN_MEMOS
+ Ìçíýìáôá ãéá ôïí %s. Ãéá íá ôá äéáâÜóåéò, ãñÜøå: %R%s READ %s num
+MEMO_LIST_CHAN_NEW_MEMOS
+ ÍÝá ìçíýìáôá ãéá ôï %s. Ãéá íá ôá äéáâÜóåéò, ãñÜøå: %R%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). Ãéá íá ôï óâÞóåéò, ãñÜøå: %R%s DEL %d
+MEMO_CHAN_HEADER
+ ÌÞíõìá %d áðü %s (%s). Ãéá íá ôï óâÞóåéò, ãñÜøå: %R%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_NOTIFY_MAIL
+ You will now be informed about new memos via email.
+MEMO_SET_NOTIFY_NOMAIL
+ You will no longer be informed via email.
+MEMO_SET_NOTIFY_INVALIDMAIL
+ There's no email address set for your nick.
+
+# 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
+MEMO_MAIL_SUBJECT
+ New memo
+MEMO_MAIL_TEXT1
+ Hi %s
+MEMO_MAIL_TEXT2
+ You've just received a new memo from %s. This is memo number %d.
+MEMO_MAIL_TEXT3
+ Memo Text:
+
+###########################################################################
+#
+# BotServ messages
+#
+###########################################################################
+
+# Standard responses
+MEMO_RSEND_PLEASE_WAIT
+ Please wait %d seconds before using the RSEND command again.
+MEMO_RSEND_DISABLED
+ Sorry, RSEND has been disabled on this network.
+MEMO_RSEND_SYNTAX
+ RSEND {nick | channel} memo-text
+MEMO_RSEND_NICK_MEMO_TEXT
+ [auto-memo] The memo you sent has been viewed.
+MEMO_RSEND_CHAN_MEMO_TEXT
+ [auto-memo] The memo you sent to %s has been viewed.
+MEMO_RSEND_USER_NOTIFICATION
+ A notification memo has been sent to %s informing him/her you have
+ read his/her memo.
+
+###########################################################################
+#
+# BotServ messages
+#
+###########################################################################
+
+# Standard responses
+MEMO_CHECK_SYNTAX
+ CHECK nickname
+MEMO_CHECK_NOT_READ
+ The last memo you sent to %s (sent on %s) has not yet been read.
+MEMO_CHECK_READ
+ The last memo you sent to %s (sent on %s) has been read.
+MEMO_CHECK_NO_MEMO
+ Nick %s doesn't have a memo from you.
+
+###########################################################################
+#
+# BotServ messages
+#
+###########################################################################
+
+# Standard responses
+MEMO_NO_RSEND_SELF
+ You can not request a receipt when sending a memo to yourself.
+
+###########################################################################
+#
+# BotServ messages
+#
+###########################################################################
+
+# Standard responses
+BOT_DOES_NOT_EXIST
+ Ôï Bot %s äåí õðÜñ÷åé.
+BOT_NOT_ASSIGNED
+ ÐñÝðåé íá êÜíåéò assign óôï bot ãéá íá ìðåß óôï êáíÜëé.
+ ÃñÜøå %R%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_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.
+ ÃñÜøå %R%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.
+ ÃñÜøå %R%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.
+BOT_LONG_IDENT
+ Bot Idents may only contain %d characters.
+BOT_LONG_HOST
+ Bot Hosts may only contain %d 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_HOSTSERV_MEM
+ HostServ : %6d records, %5d kB
+OPER_STATS_OPERSERV_MEM
+ OperServ : %6d âÜóåéò, %5d kB
+OPER_STATS_SESSIONS_MEM
+ Sessions : %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_STATS_UPLINK_SERVER
+ Uplink server: %s
+OPER_STATS_UPLINK_CAPAB
+ Uplink capab: %s
+OPER_STATS_UPLINK_SERVER_COUNT
+ Servers found: %d
+
+# 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_ADMIN_MOVED
+ %s has been moved to Services Administrators list.
+
+# 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 êáèáñßóôçêå.
+OPER_OPER_MOVED
+ %s has been moved to Services Operators list.
+
+# 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
+ CHANKILL [+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.
+OPER_SET_SQL_ON
+ SQL code will be used.
+OPER_SET_SQL_OFF
+ SQL code will not be used.
+OPER_SET_SQL_ERROR
+ Setting for SQL must be ON or OFF.
+OPER_SET_SQL_ERROR_INIT
+ Error during init of SQL, check your logs to correct.
+OPER_SET_SQL_ERROR_DISABLED
+ SQL is not configured for this network. Please edit the
+ configuration file (services.conf).
+OPER_SET_LIST_OPTION_ON
+ %s is enable
+OPER_SET_LIST_OPTION_OFF
+ %s is disabled
+
+# 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 | mask]
+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_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_NO_UNLOAD
+ This module can not be unloaded.
+OPER_MODULE_LOAD_SYNTAX
+ MODLOAD FileName
+OPER_MODULE_UNLOAD_SYNTAX
+ MODUNLOAD FileName
+OPER_MODULE_LIST_HEADER
+ Current Module list:
+OPER_MODULE_LIST
+ Module: %s [%s] [%s]
+OPER_MODULE_LIST_FOOTER
+ %d Modules loaded.
+OPER_MODULE_INFO_LIST
+ Module: %s Version: %s Author: %s loaded: %s
+OPER_MODULE_CMD_LIST
+ Providing command: %R%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.
+OPER_EXCEPTION_EXISTS
+ %s already exists on the EXCEPTION list.
+OPER_EXCEPTION_CHANGED
+ Exception for %s has been updated to %d.
+
+# 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
+ 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 %s messages will be
+ sent in order to avoid flooding the user. If there are
+ more news messages, only the most recent will be sent.)
+ NewsCount can be configured in services.conf.
+
+ 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 %s messages will
+ be sent in order to avoid flooding the user. If there are
+ more news messages, only the most recent will be sent.)
+ NewsCount can be configured in services.conf.
+
+ 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
+ Óýíôáîç: RANDOMNEWS ADD ðåñéå÷üìåíá
+ RANDOMNEWS DEL {íïýìåñï | ALL}
+ RANDOMNEWS LIST
+
+ Ìðïñåßò íá ðñïóèÝóåéò, íá áöáéñÝóåéò Þ íá äåéò ôçí ëßóôá ôùí ìçíõìÜôùí.
+ ¼ôáí Ýíáò ÷ñÞóôçò óõíäåèåß óôï äßêôõï, Ýíá (êáé ìüíï Ýíá) áðü ôá
+ ìçíýìáôá èá åðéëå÷èåß ôõ÷áßá êáé èá óôáëåß.
+
+ RANDOMNEWS LIST ìðïñåß íá ÷ñçóéìïðïéçèåß áðü ôïõò IRC operators ãéá íá
+ äïýí ôá ìçíýìáôá. ADD êáé DEL ìðïñåß íá ÷ñçóéìïðïéÞóïõí ïé
+ åðéêåöáëåßò ôùí õðçñåóéþí (Services admins).
+
+###########################################################################
+#
+# HelpServ help message
+#
+###########################################################################
+
+HELP_HELP
+ %S åßíáé ìéá õðçñåóßá ó÷åäéáóìÝíç ùóôå íá óáò äßíåé ðëçñïöïñßåò ãéá
+ ôéò õðçñåóßåò. Ãéá ðåñéóóüôåñåò âïÞèåéåò åêôüò ôïõ HELP
+ èá âñåßôå óôéò ðáñáêÜôù (õðï)õðçñåóßåò ìå ðåñéóóüôåñç áíáëõôéêüôçô:
+
+ %R%s HELP
+ ãéá ðëçñïöïñßåò ó÷åôéêÜ ìå ôçí êáôï÷ýñùóç øåõäþíõìùí
+
+ %R%s HELP
+ ãéá ðëçñïöïñßåò ó÷åôéêÜ ìå ôçí êáôï÷ýñùóç êáé ôçí äéá÷åßñçóç
+ ôùí êáíáëéþí.
+
+ %R%s HELP
+ ãéá ðëçñïöïñßåò ó÷åôéêÜ ìå ôçí áðïóôïëÞ ìçíõìÜôùí óôïõò off-line ÷ñÞóôåò
+
+HELP_HELP_BOT
+
+ %R%s HELP
+ ãéá ðëçñïöïñßåò ó÷åôéêÜ ìå ôéò åðéëïãÝò ôïõ bot óôï êáíÜëé óáò
+
+HELP_HELP_HOST
+
+ %R%s HELP
+ for information on setting up nick vHosts
+
+###########################################################################
+#
+# NickServ help messages
+#
+###########################################################################
+NICK_HELP_CMD_CONFIRM
+ CONFIRM Confirm a nickserv auth code
+NICK_HELP_CMD_RESEND
+ RESEND Resend a nickserv auth code
+
+NICK_HELP_CMD_REGISTER
+ REGISTER Êáôï÷õñþíåé Ýíá øåõäþíõìï
+NICK_HELP_CMD_GROUP
+ GROUP ÌðÝíåôå óå ïìÜäá øåõäþíõìïõ
+NICK_HELP_CMD_IDENTIFY
+ IDENTIFY Óáò áíáãíùñßæåé ìå ôç ÷ñÞóç êùäéêïý
+NICK_HELP_CMD_ACCESS
+ ACCESS ÁëëÜæåé ôç ëßóôá ôùí åîïõóéïäïôçìÝíùí äéåõèýíóåùí
+NICK_HELP_CMD_SET
+ SET ÁëëáãÞ åðéëïãþí, óõìðåñéëáìâÜíåôáé ç ðñïóôáóßá ìå áðïóýíäåóç
+NICK_HELP_CMD_SASET
+ SASET Set SET-options on another nickname
+NICK_HELP_CMD_DROP
+ DROP ÄéáãñÜöåé Ýíá øåõäþíõìï
+NICK_HELP_CMD_RECOVER
+ RECOVER Áðïóýíäåóç åíüò Üëëïõ ÷ñÞóôç ðïõ Ý÷åé ðÜñåé ôï øåõäþíõìü óáò
+NICK_HELP_CMD_RELEASE
+ RELEASE ÁíÜêôçóç ôçò êáôáêñÜôçóçò ôïõ øåõäùíýìïõ,ìåôÜ áðü RECOVER
+NICK_HELP_CMD_SENDPASS
+ SENDPASS ÎÝ÷áóåò ôïí êùäéêü? Äïêßìáóå áõôü êáé èá óôï óôåßëïõìå åìåßò
+NICK_HELP_CMD_GHOST
+ GHOST Disconnects a "ghost" IRC session using your nick
+NICK_HELP_CMD_ALIST
+ ALIST List channels you have access on
+NICK_HELP_CMD_GLIST
+ GLIST Lists all nicknames in your group
+NICK_HELP_CMD_INFO
+ INFO Displays information about a given nickname
+NICK_HELP_CMD_LIST
+ LIST List all registered nicknames that match a given pattern
+NICK_HELP_CMD_LOGOUT
+ LOGOUT Reverses the effect of the IDENTIFY command
+NICK_HELP_CMD_STATUS
+ STATUS Returns the owner status of the given nickname
+NICK_HELP_CMD_UPDATE
+ UPDATE Updates your current status, i.e. it checks for new memos
+NICK_HELP_CMD_GETPASS
+ GETPASS Åìöáíßæåé ôïí êùäéêü ãéá ôï óõãêåêñéìÝíï øåõäþíõìï
+ (ìüíï áí ç êùäéêïðïßçóç åßíáé áíåíåñãÞ)
+NICK_HELP_CMD_GETEMAIL
+ GETEMAIL Matches and returns all users that registered using given email
+NICK_HELP_CMD_FORBID
+ FORBID ÊáôáóôÝëåé Ýíá øåõäþíõìï,äçë ôï êÜíåé íá ìçí ôï ÷ñçóéìïðïéåß
+ êáíåßò,üðïéïò ôï ðÜñåé Ý÷åé kill
+NICK_HELP_CMD_SUSPEND
+ SUSPEND Suspend a given nick
+NICK_HELP_CMD_UNSUSPEND
+ UNSUSPEND Unsuspend a given nick
+
+NICK_HELP
+ O %S óáò åðéôñÝðåé íá êáôï÷õñþóåôå Ýíá øåõäþíõìï,
+ åìðïäßæïíôáò Ýôóé Üëëïõò ÷ñÞóôåò íá ôï ÷ñçóéìïðïéïýí.
+ Ïé ðáñáêÜôù åíôïëÝò, åðéôñÝðïõí ôçí êáôï÷ýñùóç êáé ôç äéá÷åßñçóç ôùí
+ øåõäùíýìùí; ãéá íá ÷ñçóéìïðïéÞóåôå áõôÜ, ãñÜøôå %R%S ^_command^_.
+ Ãéá ðåñéóóüôåñåò ðëçñïöïñßåò óå ìéá óõãêåêñéìÝíç åíôïëÞ,ãñÜøôå
+ %R%S HELP ^_command^_.
+
+NICK_HELP_FOOTER
+ ÐÁÑÁÔÇÑÇÓÇ: ÁõôÞ ç õðçñåóßá óêïðåýåé íá ðáñÝ÷åé Ýíá ôñüðï
+ óôïõò ÷ñÞóôåò ôïõ äéêôýïõ, íá äéáóöáëßóïõí üôé ç ôáõôüôçôÜ
+ ôïõò äåí åêôßèåôáé. ÄÅÍ õößóôáôáé ãéá íá åîõðçñåôåß Þ íá
+ äéåõêïëÞíåé ôçí "êëïðÞ" ôùí øåõäùíýìùí Þ Üëëåò íïóçñÝò
+ åíÝñãåéåò. Ç êáôÜ÷ñçóç ôïõ %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 äåí èá ôï ðÜñåé
+ êáíÝíá ôñßôï Üôïìï.
+
+ ÁõôÞ ç åíôïëÞ äçìéïõñãåß íÝåò ïìÜäåò ãéá ôï øåõäþíõìü óáò,
+ êáé ìðïñïýí íá åðéôñÝðïõí ôçí êáôï÷ýñùóç Üëëùí øåõäïíýìùí áñãüôåñá
+ ìå ìïßñáóìá ßäéùí óåôáñéóìÜôùí, ßäéùí ìçíõìÜôùí êáé ßäéùí
+ äéêáéùìÜôùí óôá êáíÜëéá. Ãéá ðåñéóóüôåñåò ðëçñïöïñßåò ãéá áõôÞ
+ ôç ìåëëïíôéêÞ åíôïëÞ, ãñÜøå %R%S HELP GROUP.
+
+NICK_HELP_GROUP
+ Óýíôáîç: GROUP óôü÷ïò êùäéêüò
+
+ ÁõôÞ ç åíôïëÞ êÜíåé ôï øåõäþíõìï óïõ íá ìðÝíåé óôï óôü÷ï ôùí
+ øåõäùíýìùí ôçò ïìáäïðïßçóçò. Êùäéêüò åßíáé ï êùäéêüò ôïõ
+ óôü÷ïõ,äçë ôïõ Üëëïõ øåõäùíýìïõ.
+
+ Ìðáßíïíôáò óôçí ïìÜäá Ý÷åéò ðñüóâáóç êáé ìïéñÜæåóáé,ôá ìçíýìáôá
+ äçë memos, êáé êõñéáñ÷ßá óôá êáíÜëéá ðïõ áíôéóôïé÷ïýí üëá
+ ôá øåõäþíõìá óå áõôÞ ôçí ïìÜäá, êáé ðïëëÜ Üëëá!
+
+ Ç ïìÜäá öôéÜ÷åôáé ãéá íá óáò åîõðçñåôåß êáëýôåñá. Áõôü óçìáßíåé
+ ïôé áí äéáãñÜøåôå êÜðïéï øåõäþíõìï êáé åßíáé óôçí ïìÜäá,
+ äåí èá ÷Üóåôå ôéò ðëçñïöïñßåò êáé ôá ìïéñáóìÝíá ðñÜãìáôá ðïõ
+ Ý÷åôå ìå ôá Üëëá øåõäþíõìá, áñêåß üìùò óôçí ïìÜäá
+ íá õðÜñ÷åé ôïõëÜ÷éóôïí Ýíá øåõäþíõìï.
+
+ Ìðïñåßò íá åêôåëÝóåéò áõôÞ ôçí åíôïëÞ áêüìá êáé üôáí äåí
+ Ý÷åéò êáôï÷õñþóåé êÜðïéï øåõäþíõìï áêüìá. Áí ôï øåõäþíõìï åßíáé
+ êáôï÷õñùìÝíï, èá ðñÝðåé íá êÜíåéò åíôïëÞ áíáãíþñéóçò ðñþôá êáé
+ ìåôÜ íá ÷ñçóéìïðïéÞóåéò áõôÞ ôçí åíôïëÞ. ÃñÜøå
+ %R%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 (%R%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 Åìðïäßæåé ôï øåõäþíõìü óáò íá åìöáíßæåôáé
+ ìå ôçí åíôïëÞ %R%S LIST
+ HIDE Áðïêñýðôåé óõãêåêñéìÝíá ôìÞìáôá ðëçñïöïñéþí ôïõ øåõäùíýìïõ
+ MSG ÁëëÜæåé ôçí ìÝèïäï åðéêïéíùíßáò ìå ôéò õðçñåóßåò
+ AUTOOP Should services op you automatically.
+
+ Ãéá íá ÷ñçóéìïðïéÞóåôå áõôÞ ôçí åíôïëÞ, ðñÝðåé ðñþôá íá
+ áíáãíùñéóôåßôå ìå ôïí êùäéêü óáò (ãéá ðåñéóóüôåñåò ðëçñïöïñßåò,
+ %R%S HELP IDENTIFY).
+
+ ÐëçêôñïëïãÞóôå %R%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_SET_AUTOOP
+ Syntax: SET AUTOOP {ON | OFF}
+
+ Sets whether you will be opped automatically. Set to ON to
+ allow ChanServ to op you automatically when entering channels.
+
+NICK_HELP_SASET
+ Syntax: SASET nickname option parameters.
+
+ Sets various nickname options. option can be one of:
+
+ DISPLAY Set the display of the group in Services
+ PASSWORD Set the nickname password
+ URL Associate a URL with the nickname
+ EMAIL Associate an E-mail address with the nickname
+ ICQ Associate an ICQ number with the nickname
+ GREET Associate a greet message with the nickname
+ KILL Turn protection on or off
+ SECURE Turn nickname security on or off
+ PRIVATE Prevent the nickname from appearing in a
+ %R%S LIST
+ HIDE Hide certain pieces of nickname information
+ MSG Change the communication method of Services
+ NOEXPIRE Prevent the nickname from expiring
+ LANGUAGE Set the language Services will use when
+ sending messages to nickname
+
+ Type %R%S HELP SASET option for more information
+ on a specific option. The options will be set on the given
+ nickname.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_DISPLAY
+ Syntax: SASET nickname DISPLAY new-display
+
+ Changes the display used to refer to the nickname group in
+ Services. The new display MUST be a nick of the group.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_PASSWORD
+ Syntax: SASET nickname PASSWORD new-password
+
+ Changes the password used to identify as the nick's owner.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_URL
+ Syntax: SASET nickname URL url
+
+ Associates the given URL with the nickname. This URL
+ will be displayed whenever someone requests information
+ on the nick with the INFO command.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_EMAIL
+ Syntax: SASET nickname EMAIL address
+
+ Associates the given E-mail address with the nickname.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_ICQ
+ Syntax: SASET nickname ICQ number
+
+ Associates the given ICQ number with the nickname. This
+ number will be displayed whenever someone requests
+ information on the nick with the INFO command.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_GREET
+ Syntax: SASET nickname GREET message
+
+ Makes the given message the greet of the nickname, that
+ will be displayed when joining a channel that has GREET
+ option enabled, provided that the user has the necessary
+ access on it.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_KILL
+ Syntax: SASET nickname KILL {ON | QUICK | IMMED | OFF}
+
+ Turns the automatic protection option for the nick
+ on or off. With protection on, if another user
+ tries to take the 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.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_SECURE
+ Syntax: SASET nickname 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.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_PRIVATE
+ Syntax: SASET nickname PRIVATE {ON | OFF}
+
+ Turns %S's privacy option on or off for the nick.
+ With PRIVATE set, the nickname will not appear in
+ nickname lists generated with %S's LIST command.
+ (However, anyone who knows the nickname can still get
+ information on it using the INFO command.)
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_HIDE
+ Syntax: SASET nickname HIDE {EMAIL | STATUS | USERMASK | QUIT} {ON | OFF}
+
+ Allows you to prevent certain pieces of information from
+ being displayed when someone does a %S INFO on the
+ nick. You can hide the E-mail address (EMAIL), last seen
+ user@host mask (USERMASK), the services access status
+ (STATUS) and last quit message (QUIT).
+ The second parameter specifies whether the information should
+ be displayed (OFF) or hidden (ON).
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_MSG
+ Syntax: SASET nickname MSG {ON | OFF}
+
+ Allows you to choose the way Services are communicating with
+ the given user. With MSG set, Services will use messages,
+ else they'll use notices.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_NOEXPIRE
+ Syntax: SASET nickname NOEXPIRE {ON | OFF}
+
+ Sets whether the given nickname will expire. Setting this
+ to ON prevents the nickname from expiring.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_AUTOOP
+ Syntax: SASET nickname AUTOOP {ON | OFF}
+
+ Sets whether the given nickname will be opped automatically.
+ Set to ON to allow ChanServ to op the given nickname
+ automatically when joining channels.
+
+NICK_HELP_SASET_LANGUAGE
+ Syntax: SASET nickname LANGUAGE number
+
+ Changes the language Services uses when sending messages to
+ nickname (for example, when responding to a command he sends).
+ number should be chosen from a list of supported languages
+ that you can get by typing %R%S HELP SET LANGUAGE.
+
+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
+ remain online for %s to ensure that the other
+ user does not immediately reconnect; after that time, you
+ can reclaim your nick. Alternatively, use the RELEASE
+ command (%R%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. This holds lasts for %s;
+ 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
+ Óýíôáîç: 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 - ï ÷ñÞóôçò áíáãíùñßóôçêå óáí êÜôï÷ïò ôïõ øåõäùíýìïõ ìÝóù ôçò áíáãíþñéóçò ìå êùäéêü
+
+ ÌÝ÷ñé äåêáÝîé øåõäþíõìá ìðïñïýí íá ÷ñçóéìïðïéçèïýí ìå êÜèå åíôïëÞ; Ôá
+ õðüëïéðá èá áãíïïýíôáé. If no nickname is given, your status
+ will be returned.
+
+NICK_HELP_SENDPASS
+ Óýíôáîç: SENDPASS øåõäþíõìï
+
+ Äßíåé ôïí êùäéêü ôïõ øåõäþíõìïõ ìÝóù the e-mail.
+ ÁõôÞ ç åíôïëÞ åßíáé ðñáãìáôéêÜ ÷ñÞóéìç ãéá íá ðÜñåé êÜðïéïò ôïí
+ ÷áìÝíï êùäéêü ôïõ êáé ìå ðåñéóóüôåñç áóöÜëåéá.
+
+ Ìüíï ïé IRC operators óôá äßêôõá ðïõ åßíáé ìðïñïýí íá ôï êÜíïõí.
+
+ ÁõôÞ ç åíôïëÞ åßíáé áäýíáôç áí Ý÷åé åíåñãïðïéçèåß ç êùäéêïðïßçóç ôùí êùäéêþí.
+
+NICK_HELP_CONFIRM
+ Syntax: CONFIRM passcode
+
+ This is the second step of nickname registration process.
+ You must perform this command in order to get your nickname
+ registered with %S. The passcode (or called auth code also)
+ is sent to your e-mail address in the first step of the
+ registration process. For more information about the first
+ stage of the registration process, type: %R%S HELP REGISTER
+
+NICK_HELP_RESEND
+ Syntax: RESEND
+
+ This command will re-send the auth code (also called passcode)
+ to the e-mail address of the user whom is performing it.
+
+NICK_SERVADMIN_HELP
+ Ïé Services admins (åðéêåöáëåßò) ìðïñïýí íá äéáãñÜøïõí Ýíá øåõäþíõìï ÷ùñßò íá
+ ÷ñåéáóôåß íá êÜíïõí åíôïëÞ áíáãíþñéóçò êáé êáí áëëáãÞ øåõäþíõìïõ, êáé ìðïñïýí íá
+ äïõí ôçí ëßóôá access ãéá êÜèå øåõäþíõìï (%R%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_INFO
+
+ Ïé Services admins ìðïñïýí íá ÷ñçóéìïðïéïýí ôçí ALL ðáñÜìåôñï ãéá
+ êÜèå øåõäþíõìï.
+
+NICK_SERVADMIN_HELP_LIST
+ Óýíôáîç: LIST pattern [FORBIDDEN] [SUSPENDED] [NOEXPIRE] [UNCONFIRMED]
+
+ Äßíåé ôçí ëßóôá üëùí ôùí êáôï÷õñùìÝíùí øåõäþíõìùí ðïõ ôáéñéÜæïõí ìå ôï áíÜëïãï
+ 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
+#
+###########################################################################
+
+NICK_SERVADMIN_HELP_SUSPEND
+ Syntax: SUSPEND nickname reason / UNSUSPEND nickname
+
+ SUSPENDs / UNSUSPENDs a nickname from being identified to
+
+ Limited to Services admins.
+
+###########################################################################
+#
+# ChanServ help messages
+#
+###########################################################################
+
+NICK_SERVADMIN_HELP_UNSUSPEND
+ Syntax: UNSUSPEND nickname
+
+ UNSUSPENDS a nickname from being used.
+
+ Limited to Services admins.
+
+###########################################################################
+#
+# ChanServ help messages
+#
+###########################################################################
+CHAN_HELP_CMD_GETPASS
+ GETPASS ÂëÝðåéò ôïí êùäéêü ôïõ óõãêåêñéìÝíïõ êáíáëéïý
+CHAN_HELP_CMD_FORBID
+ FORBID ÊáôáóôÝëåé ôï êáíÜëé,äåí ìðïñåß íá ôï ÷ñçóéìïðïéÞóç êáíåßò
+CHAN_HELP_CMD_SUSPEND
+ SUSPEND Prevent a channel from being used preserving
+ channel data and settings
+CHAN_HELP_CMD_UNSUSPEND
+ UNSUSPEND Releases a suspended channel
+CHAN_HELP_CMD_STATUS
+ STATUS ÅðéóôñÝöåé ôçí óõãêåêñéìÝíç access level ôïõ ÷ñÞóôç óôï
+ êáíÜëé
+CHAN_HELP_CMD_REGISTER
+ REGISTER Êáôï÷õñþíåé Ýíá êáíÜëé
+CHAN_HELP_CMD_IDENTIFY
+ IDENTIFY Óáò áíáãíùñßæåé ìå êùäéêü
+CHAN_HELP_CMD_SET
+ SET Ñõèìßæåé ôéò åðéëïãÝò êáé ôéò ðëçñïöïñßåò
+ ôïõ êáíáëéïý
+CHAN_HELP_CMD_AOP
+ AOP ÁëëÜæåé ôçí ëßóôá ôùí AOP ÷ñçóôþí
+CHAN_HELP_CMD_SOP
+ SOP ÁëëÜæåé ôçí ëßóôá ôùí SOP ÷ñçóôþí
+CHAN_HELP_CMD_ACCESS
+ ACCESS ÁëëÜæåé ôç ëßóôá ôùí åîïõóéïäïôçìÝíùí ÷ñçóôþí
+CHAN_HELP_CMD_LEVELS
+ LEVELS Åðáíáêáèïñßæåé ôï íüçìá ôùí åðéðÝäùí ðñüóâáóçò
+CHAN_HELP_CMD_AKICK
+ AKICK Óõíôçñåß ôç ëßóôá áõôüìáôçò áðüññéøçò
+CHAN_HELP_CMD_DROP
+ DROP Áêõñþíåé ôçí êáôï÷ýñùóç åíüò êáíáëéïý
+CHAN_HELP_CMD_SENDPASS
+ SENDPASS ÓôÝëíåé ôïí ÷áìÝíï êùäéêü ôïõ êáíáëéïý
+CHAN_HELP_CMD_BAN
+ BAN Bans a selected nick on a channel
+CHAN_HELP_CMD_CLEAR
+ CLEAR Tells ChanServ to clear certain settings on a channel
+CHAN_HELP_CMD_DEVOICE
+ DEVOICE Devoices a selected nick on a channel
+CHAN_HELP_CMD_GETKEY
+ GETKEY Returns the key of the given channel
+CHAN_HELP_CMD_INFO
+ INFO Lists information about the named registered channel
+CHAN_HELP_CMD_INVITE
+ INVITE Tells ChanServ to invite you or a given nick into a channel
+CHAN_HELP_CMD_KICK
+ KICK Kicks a selected nick from a channel
+CHAN_HELP_CMD_LIST
+ LIST Lists all registered channels matching the given pattern
+CHAN_HELP_CMD_LOGOUT
+ LOGOUT This command will logout the selected nickname
+CHAN_HELP_CMD_OP
+ OP Gives Op status to a selected nick on a channel
+CHAN_HELP_CMD_TOPIC
+ TOPIC Manipulate the topic of the specified channel
+CHAN_HELP_CMD_UNBAN
+ UNBAN Remove all bans preventing you from entering a channel
+CHAN_HELP_CMD_VOICE
+ VOICE Voices a selected nick on a channel
+CHAN_HELP_CMD_VOP
+ VOP Maintains the VOP (VOicePeople) list for a channel
+CHAN_HELP_CMD_DEHALFOP
+ DEHALFOP Dehalfops a selected nick on a channel
+CHAN_HELP_CMD_DEOWNER
+ DEOWNER Removes your owner status on a channel
+CHAN_HELP_CMD_DEPROTECT
+ DEPROTECT Deprotects a selected nick on a channel
+CHAN_HELP_CMD_HALFOP
+ HALFOP Halfops a selected nick on a channel
+CHAN_HELP_CMD_HOP
+ HOP Maintains the HOP (HalfOP) list for a channel
+CHAN_HELP_CMD_OWNER
+ OWNER Gives you owner status on channel
+CHAN_HELP_CMD_PROTECT
+ PROTECT Protects a selected nick on a channel
+CHAN_HELP_CMD_ADMIN
+ ADMIN Protects a selected nick on a channel
+CHAN_HELP_CMD_DEADMIN
+ DEADMIN Deprotects a selected nick on a channel
+CHAN_HELP_CMD_DEOP
+ DEOP Deops a selected nick on a channel
+
+CHAN_HELP
+ Ï %S óáò åðéôñÝðåé íá êáôï÷õñþóåôå êáé íá ÷åéñéóôåßôå
+ äéÜöïñåò ëåéôïõñãßåò ôùí êáíáëéþí. Ï %S ìðïñåß óõíÞèùò
+ íá áðïôñÝøåé êáêüâïõëïõò ÷ñÞóôåò íá êÜíïõí "êáôÜëçøç" óå
+ êáíÜëéá, ìå ôï íá ðåñéïñßæåé ôéò áñìïäéüôçôåò ôùí
+ äéá÷åéñéóôþí êáíáëéþí. Ïé äéáèÝóéìåò åíôïëÝò, âñßóêïíôáé
+ ðáñáêÜôù. Ãéá íá ôéò ÷ñçóéìïðïéÞóåôå, ðëçêôñïëïãÞóôå
+ %R%S åíôïëÞ. Ãéá ðåñéóóüôåñåò ðëçñïöïñßåò óå ìßá
+ óõãêåêñéìÝíç åíôïëÞ, ðëçêôñïëïãÞóôå %R%S HELP åíôïëÞ.
+
+
+CHAN_HELP_EXPIRES
+
+ Óçìåßùóç: ïðïéïäÞðïôå êáíÜëé äåí ÷ñçóéìïðïéåßôáé ãéá %d ìÝñåò
+ (äçë êáíÝíáò ÷ñÞóôçò ðïõ Ý÷åé access äåí ìðÝíåé óôï êáíÜëé
+ ãéá åêåßíç ôçí ðåñßïäï ôùí çìåñþí) èá äéáãñáöåß áõôüìáôá.
+
+CHAN_HELP_REGISTER
+ Óýíôáîç: REGISTER êáíÜëé êùäéêüò ðåñéãñáöÞ
+
+ Êáôï÷õñþíåé Ýíá êáíÜëé óôç âÜóç äåäïìÝíùí ôïõ %S. Ãéá
+ íá ÷ñçóéìïðïéÞóåôå áõôÞ ôçí åíôïëÞ, ðñÝðåé ðñþôá íá åßóôå
+ äéá÷åéñéóôÞò êáíáëéïý ìÝóá óôï êáíÜëé ðïõ ðñïóðáèåßôå íá
+ êáôï÷õñþóåôå. Ï êùäéêüò ÷ñçóéìïðïéåßôáé ìå ôçí åíôïëÞ
+ IDENTIFY ãéá íá óáò åðéôñÝðåé íá êÜíåôå áëëáãÝò óôéò
+ ñõèìßóåéò ôïõ êáíáëéïý áñãüôåñá. Ç ôåëåõôáßá ðáñÜìåôñïò,
+ ç ïðïßá êáé ðñÝðåé íá óõìðåñéëçöèåß, åßíáé ìßá ãåíéêÞ
+ ðåñéãñáöÞ ãéá ôï óêïðü ýðáñîçò ôïõ êáíáëéïý.
+
+ ¼ôáí êáôï÷õñþíåôå Ýíá êáíÜëé, ïñßæåóôå óáí "éäñõôÞò" ôïõ.
+ Ï éäñõôÞò åíüò êáíáëéïý, åðéôñÝðåôáé íá áëëÜîåé üëåò ôéò
+ ñõèìßóåéò ôïõ; Ï %S åðßóçò èá ôïõ äþóåé áõôüìáôá
+ áñìïäéüôçôåò éäñõôÞ êáé äéá÷åéñéóôÞ êáíáëéïý, ìå ôçí åßóïäü
+ ôïõ óôï êáíÜëé.Äåßôå ôçí åíôïëÞ ACCESS command.
+ (%R%S HELP ACCESS) ãéá ðëçñïöïñßåò ó÷åôéêÜ ìå ôçí ðáñï÷Þ ìÝñïõò ôùí
+ áñìïäéïôÞôùí áõôþí, óå Üëëïõò ÷ñÞóôåò ôïõ êáíáëéïý.
+
+ ÓÇÌÅÉÙÓÇ: Ãéá íá êáôï÷õñþóåôå Ýíá êáíÜëé, ðñÝðåé íá Ý÷åôå
+ ðñþôá êáôï÷õñþóåé ôï øåõäþíõìü óáò. Áí äåí ôï Ý÷åôå êÜíåé,
+ %R%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
+
+ ÃñÜøå %R%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 åíôïëÞ, ôï êáíÜëé äå óõìðåñéëáìâÜíåôáé
+ óôç ëßóôá ðïõ ðñïêýðôåé áðü ôçí åíôïëÞ %R%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. Äåò %R%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. Äåßôå
+ %R%S HELP ACCESS ãéá ðëçñïöïñßåò ó÷åôéêÜ ìå ôçí åíôïëÞ access list,
+ êáé %R%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. Äåßôå
+ %R%S HELP ACCESS ãéá ðëçñïöïñßåò ó÷åôéêÜ ìå ôçí åíôïëÞ access list,
+ êáé %R%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. Äåßôå
+ %R%S HELP ACCESS ãéá ðëçñïöïñßåò ó÷åôéêÜ ìå ôçí åíôïëÞ access list,
+ êáé %R%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. Äåßôå
+ %R%S HELP ACCESS ãéá ðëçñïöïñßåò ó÷åôéêÜ ìå ôçí åíôïëÞ access list,
+ êáé %R%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 ðïõ Ý÷åé,äéáöïñåôéêÜ äéêáéþìáôá èá Ý÷åé.
+ %R%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; ãñÜøôå %R%S HELP LEVELS ãéá
+ ðëçñïöïñßåò.
+
+CHAN_HELP_AKICK
+ Óýíôáîç: AKICK channel ADD {nick | mask} [reason]
+ AKICK channel STICK mask
+ AKICK channel UNSTICK mask
+ AKICK channel DEL {nick | mask | entry-num | list}
+ AKICK channel LIST [mask | entry-num | list]
+ AKICK channel VIEW [mask | entry-num | list]
+ 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. Äåò %R%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.
+ HOPS Removes channel-halfoperator status (mode +h) from
+ all channel halfoperators, if supported.
+ 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 ìðïñïýí íá äéáãñÜøïõí ïðïéïäÞðïôå êáíÜëé, ÷ùñßò íá êÜíïõí
+ åíôïëÞ áíáãíþñéóçò ìÝóù êùäéêïý, ìðïñïýí íá äïýí ôçí 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_CMD_SEND
+ SEND ÓôÝëíåé Ýíá ìÞíõìá óå Ýíá øåõäþíõìï Þ Ýíá êáíÜëé
+MEMO_HELP_CMD_CANCEL
+ CANCEL Áêõñþíåé ôï ôåëåõôáßï ìÞíõìá ðïõ óôÝëíåôå
+MEMO_HELP_CMD_LIST
+ LIST Åìöáíßæåé ëßóôá ìå ôá ìçíýìáôá óáò
+MEMO_HELP_CMD_READ
+ READ ÄéáâÜæåé Ýíá Þ ðïëëÜ ìçíýìáôá
+MEMO_HELP_CMD_DEL
+ DEL ÄéáãñÜöåé Ýíá Þ ðïëëÜ ìçíýìáôá
+MEMO_HELP_CMD_SET
+ SET ÁëëÜæåé ôéò åðéëïãÝò ôùí ìçíõìÜôùí
+MEMO_HELP_CMD_INFO
+ INFO Displays information about your memos
+MEMO_HELP_CMD_RSEND
+ RSEND Sends a memo and requests a read receipt
+MEMO_HELP_CMD_CHECK
+ CHECK Checks if last memo to a nick was read
+MEMO_HELP_CMD_SENDALL
+ SENDALL Send a memo to all registered users
+MEMO_HELP_CMD_STAFF
+ STAFF Send a memo to all opers/admins
+
+MEMO_HELP_HEADER
+ Ï %S åßíáé ìéá õðçñåóßá ðïõ åðéôñÝðåé óôïõò ÷ñÞóôåò
+ ôïõ IRC íá óôÝëíïõí ìéêñÜ ãñáðôÜ ìçíýìáôá óå Üëëïõò ÷ñÞóôåò
+ ôïõ äéêôýïõ (åßôå âñßóêïíôáé óõíäåäåìÝíïé åêåßíç ôç óôéãìÞ,
+ åßôå ü÷é) Þ óå êáíÜëéá(*).
+ Ôá øåõäþíõìá ôïõ áðïóôïëÝá êáé ôïõ ðáñáëÞðôç ðñÝðåé íá åßíáé
+ êáôï÷õñùìÝíá ãéá íá ÷ñçóéìïðïéçèåß ç õðçñåóßá.
+
+ Ïé åíôïëÝò ôïõ %S åßíáé:
+
+
+MEMO_HELP_ADMIN
+ not used.
+MEMO_HELP_OPER
+ not used.
+MEMO_HELP_FOOTER
+
+ ÃñÜøôå %R%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 ÁëëÜæåé ôï ìÝãéóôï áñéèìü ìçíõìÜôùí ðïõ
+ ìðïñåßôå íá äå÷ôåßôå
+
+ ÃñÜøôå %R%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
+#
+###########################################################################
+
+MEMO_HELP_RSEND
+ Syntax: RSEND {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.
+ Once the memo is read by its recepient, an automatic notification
+ memo will be sent to the sender informing him/her that the memo
+ has been read.
+
+###########################################################################
+#
+# OperServ help messages
+#
+###########################################################################
+
+MEMO_HELP_CHECK
+ Syntax: CHECK nick
+
+ Checks whether the _last_ memo you sent to nick has been read
+ or not. Note that this does only work with nicks, not with chans.
+
+###########################################################################
+#
+# OperServ help messages
+#
+###########################################################################
+
+OPER_HELP_CMD_GLOBAL
+ GLOBAL ÓôÝëíåé ìÞíõìá óå üëïõò ôïõò ÷ñÞóôåò
+OPER_HELP_CMD_STATS
+ STATS Äåß÷íåé óôáôéóôéêÜ ó÷åôéêÜ ìå ôá Services êáé ôï äßêôõï
+OPER_HELP_CMD_OPER
+ OPER ÁëëÜæåé ôçí ëßóôá ôùí Services operator
+OPER_HELP_CMD_ADMIN
+ ADMIN ÁëëÜæåé ôçí ëßóôá ôùí Services admin
+OPER_HELP_CMD_STAFF
+ STAFF Display Services staff and online status
+OPER_HELP_CMD_MODE
+ MODE ÁëëÜæåé modes óå êáíÜëé êáé Üëëá
+OPER_HELP_CMD_KICK
+ KICK Áðïìáêñýíåé ôï ÷ñÞóôç áðü ôï êáíÜëé
+OPER_HELP_CMD_CLEARMODES
+ CLEARMODES Êáèáñßæåé ôá modes áðü ôï êáíÜëé
+OPER_HELP_CMD_KILLCLONES
+ KILLCLONES Óêïôþíåé üëïõò ôïõò ÷ñÞóôåò ðïõ Ý÷ïõí ôï ßäéï host
+OPER_HELP_CMD_AKILL
+ AKILL ÐñïóèÝôåé ip êëð óôçí ëßóôá AKILL
+OPER_HELP_CMD_SGLINE
+ SGLINE ÐñïóèÝôåé ip óôçí ëßóôá SGLINE
+OPER_HELP_CMD_SQLINE
+ SQLINE ÐñïóèÝôåé ip óôçí ëßóôá SQLINE
+OPER_HELP_CMD_SZLINE
+ SZLINE ÐñïóèÝôåé ip óôçí ëßóôá SZLINE
+OPER_HELP_CMD_CHANLIST
+ CHANLIST Åìöáíßæåé üëá ôá êáíÜëéá
+OPER_HELP_CMD_USERLIST
+ USERLIST Åìöáíßæåé üëïõò ôïõò ÷ñÞóôåò
+OPER_HELP_CMD_LOGONNEWS
+ LOGONNEWS ÁëëÜæåéò ôá ìçíýìáôá ðïõ èá åìöáíßæïíôáé üôáí áõôïß èá ìðÝíïõí
+ óôï äßêôõï
+OPER_HELP_CMD_RANDOMNEWS
+ RANDOMNEWS ÁëëÜæåéò ôá ôõ÷áßá åðéëåãüìåíá ìçíýìáôá ðïõ èá åìöáíßæïíôáé
+ üôáí áõôïß èá ìðÝíïõí óôï äßêôõï
+OPER_HELP_CMD_OPERNEWS
+ OPERNEWS ÁëëÜæåéò ôá ìçíýìáôá ðïõ èá åìöáíßæïíôáé óôïõò ÷ñÞóôåò ðïõ
+ ãßíïíôáé oper
+OPER_HELP_CMD_SESSION
+ SESSION ÂëÝðåéò ôçí ëßóôá ìå ôá host sessions
+OPER_HELP_CMD_EXCEPTION
+ EXCEPTION ÁëëÜæåéò ôçí ëßóôá ôïõ session-limit exception
+OPER_HELP_CMD_NOOP
+ NOOP Áöáéñåß ðñïóùñéíÜ üëåò ôéò O:ãñáììÝò áðü ôïí server
+ áõôüìáôá
+OPER_HELP_CMD_JUPE
+ JUPE "Jupiter" óå server
+OPER_HELP_CMD_IGNORE
+ IGNORE Modify the Services ignore list
+OPER_HELP_CMD_SET
+ SET Ñõèìßæåéò äéÜöïñåò åðéëïãÝò ôùí Services
+OPER_HELP_CMD_RELOAD
+ RELOAD Îáíáöïñôþíåé ôï services' configuration áñ÷åßï
+OPER_HELP_CMD_UPDATE
+ UPDATE Åíåñãïýí ôá Services (âÜóåéò äåäïìÝíùí) ãéá
+ íá ãßíïõí update óôï äßóêï áìÝóùò
+OPER_HELP_CMD_RESTART
+ RESTART Óþæåé ôéò âÜóåéò äåäïìÝíùí êáé åðáíåêêéíåß ôá Services
+OPER_HELP_CMD_QUIT
+ QUIT Ôåñìáôßæåé ôï ðñüãñáììá ôùí Services ÷ùñßò íá óþóåé ôéò áëëáãÝò
+OPER_HELP_CMD_SHUTDOWN
+ SHUTDOWN Ôåñìáôßæåé ôï ðñüãñáììá ôùí Services ìå ôáõôü÷ñïíï ãñÜøéìï ôùí
+ áëëáãþí
+OPER_HELP_CMD_DEFCON
+ DEFCON Manipulate the DefCon system
+OPER_HELP_CMD_CHANKILL
+ CHANKILL Kill all users on a specific channel
+OPER_HELP_CMD_OLINE
+ OLINE Give Operflags to a certain user
+OPER_HELP_CMD_UMODE
+ UMODE Change a user's modes
+OPER_HELP_CMD_SVSNICK
+ SVSNICK Forcefully change a user's nickname
+OPER_HELP_CMD_MODLOAD
+ MODLOAD Load a module
+OPER_HELP_CMD_MODUNLOAD
+ MODUNLOAD Un-Load a module
+OPER_HELP_CMD_MODINFO
+ MODINFO Info about a loaded module
+OPER_HELP_CMD_MODLIST
+ MODLIST List loaded modules
+
+OPER_HELP
+ Ïé åíôïëÝò ôïõ %S åßíáé::
+
+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 Root íá ðñïóèÝóïõí Þ íá áöáéñÝóïõí
+ øåõäþíõìá áðü ôçí ëßóôá 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.
+
+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|CLEAR} [time] [nick | mask]
+
+ Allows Services Admins to make Services ignore a nick or mask
+ 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.
+ When adding a mask, it should be in the format user@host
+ or nick!user@host, everything else will be considered a nick.
+ Wildcards are permitted.
+
+ Ignores will not be enforced on IRC Operators.
+
+OPER_HELP_MODE
+ Óýíôáîç: MODE êáíÜëé modes
+
+ ÅðéôñÝðåé óôïõò Services operators íá áëëÜæïõí ôá modes êÜèå êáíáëéïý.
+ Ïé ðáñÜìåôñïé åßíáé ßäéïé óáí ôçò åíôïëÞò /MODE.
+
+ Ìüíï ãéá ôïõò Services operators.
+
+OPER_HELP_UMODE
+ Syntax: UMODE user modes
+
+ Allows Super Admins to set user modes for any user.
+ Parameters are the same as for the standard /MODE
+ command.
+
+OPER_HELP_OLINE
+ Syntax: OLINE user flags
+
+ Allows Super 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.
+
+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 Super 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
+ SUPERADMIN Activate or deactivate super-admin mode
+ SQL Activate or deactivate sql mode
+ IGNORE Activate or deactivate ignore mode
+ LIST List the options
+
+ Ìüíï ãéá ôïõò 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.
+
+ This option is equivalent to the command-line option -logchan.
+
+ 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_SET_SQL
+ Syntax: SET SQL {ON | OFF}
+
+ Setting this will toggle Anope's from usage of SQL, this should
+ be used to disable and enable SQL should your SQL server go down
+ while services are running.
+
+OPER_HELP_SET_IGNORE
+ Syntax: SET IGNORE {ON | OFF}
+
+ Setting this will toggle Anope's usage of the IGNORE system
+ on or off.
+
+OPER_HELP_SET_LIST
+ Syntax: SET LIST
+
+ Display the various %S settings
+
+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_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_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 [Core|3rd|protocol|encryption|supported|qatested]
+
+ Lists all currently loaded modules.
+
+ Limited to Services Roots.
+
+
+###########################################################################
+#
+# BotServ help messages
+#
+###########################################################################
+
+BOT_HELP_CMD_BOTLIST
+ BOTLIST Ëßóôá ìå äéáèÝóéìá bots
+BOT_HELP_CMD_ASSIGN
+ ASSIGN ÆçôÜôå áðü ôï bot íá Ýñèåé óôï êáíÜëé óáò
+BOT_HELP_CMD_SET
+ SET ÁëëÜæåôå ôéò åðéëïãÝò ôïõ bot
+BOT_HELP_CMD_KICK
+ KICK Ñõèìßæåôáé ôé íá êÜíåé óôïõò "Üôáêôïõò ÷ñÞóôåò"
+BOT_HELP_CMD_BADWORDS
+ BADWORDS ÁëëÜæåôå ôçí ëßóôá êáêþí ëÝîåùí
+BOT_HELP_CMD_ACT
+ ACT Makes the bot do the equivalent of a "/me" command
+BOT_HELP_CMD_INFO
+ INFO Allows you to see BotServ information about a channel or a bot
+BOT_HELP_CMD_SAY
+ SAY Makes the bot say the given text on the given channel
+BOT_HELP_CMD_UNASSIGN
+ UNASSIGN Unassigns a bot from a channel
+BOT_HELP_CMD_BOT
+ BOT ÁëëÜæåé ôçí ëßóôá ôùí bot ôïõ äéêôýïõ
+
+BOT_HELP
+ Ï %S óïõ åðéôñÝðåé íá Ý÷åéò bot óôï äéêü óïõ êáíÜëé.
+ ÁõôÞ ç õðçñåóéá Ý÷åé äçìéïõñãçèåß ãéá ôïõò ÷ñÞóôåò ðïõ äåí ìðïñïýí
+ íá ñõèìßóïõí bots Þ ãéá äßêôõá ðïõ äåí åðéôñÝðïõí ïé ÷ñÞóôåò íá Ý÷ïõí
+ éêÜ ôïõò bots ãéá áóöÜëåéá.
+ ÄéáèÝóçìåò åíôïëÝò åßíáé ïé åðüìåíåò, ãéá íá ôéò äåßôå ãñÜøôå
+ %R%S command.Ãéá ðåñéóóüôåñåò ðëçñïöïñßåò óå óõãêåêñéìÝíåò
+ åíôïëÝò ãñÜøôå %R%S HELP command.
+
+BOT_HELP_FOOTER
+ Ôï 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
+
+ ÃñÜøå %R%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 áõôïýò ðïõ
+ ãñÜöïõí ìå õðïãñáììéóìÝíïõò ÷áñáêôÞñåò
+
+ ÃñÜøå %R%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. ÃñÜøå %R%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 åßíáé åíåñãïðïéçìÝíï. Ãéá ðåñéóóüôåñåò ðëçñïöïñßåò,
+ ãñÜöôå %R%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_BOT
+ Óýíôáîç: BOT ADD øåõäþíõìï ID host ðñáãìáôéêü üíïìá
+ BOT CHANGE ðáëéü-øåõäþíõìïick íÝï-øåõäþíõìï [ID [host [ðñáãìáôéêü üíïìá]]]
+ BOT DEL øåõäþíõìï
+
+ ÅðéôñÝðåé ìüíï óôïõò Services admins íá äçìéïõñãÞóïõí, áëëÜîïõí, êáé
+ íá óâÞóïõí ôá bots óôá ïðïßá ïé ÷ñÞóôåò èá ìðïñïýí íá ÷ñçóéìïðïéÞóïõí
+ óôá äéêÜ ôïõò ôá êáíÜëéá.
+
+ Ç åíôïëÞ BOT ADD ðñïóèÝôåé Ýíá botìå ôï øåõäþíõìï, ID,
+ hostname êáé ðñáãìáôéêü üíïìá. Áí äåí ãßíïõí ïé êáôÜëëçëïé Ýëåã÷ïé
+ ìå ôéò åðéëïãÝò, íá åßóôå ðñïóåêôéêïß.
+ Ç åíôïëÞ BOT CHANGE óáò åðéôñÝðåé íá áëëÜîåôå ôï øåõäþíõìï, ID, hostname
+ Þ ðñáãìáôéêü üíïìá ôïõ bot ÷ùñßò íá ÷ñåéÜæåôáé íá ôï óâÞóåôå (êáé üëåò
+ ïé ñõèìßóåéò èá ìåßíïõí).
+ Ç åíôïëÞ BOT DEL áöáéñåß ôï bot áðü ôçí ëßóôá bot.
+
+ Óçìåßùóç: áí öôéÜîåéò Ýíá 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 %R%s set <nick> <hostmask>.
+HOST_SETALL_SYNTAX
+ Syntax %R%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: %R%s del <nick>.
+
+###########################################################################
+#
+# HostServ Help messages
+#
+###########################################################################
+HOST_OFF_UNREAL
+ Your vhost was removed. To re-enable the standard host cloaking, type /mode %s +%s
+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_CMD_ON
+ ON Activates your assigned vhost
+
+HOST_HELP_CMD_OFF
+ OFF Deactivates your assigned vhost
+
+HOST_HELP_CMD_GROUP
+ GROUP Syncs the vhost for all nicks in a group
+
+HOST_HELP_CMD_SET
+ SET Set the vhost of another user
+
+HOST_HELP_CMD_SETALL
+ SETALL Set the vhost for all nicks in a group
+
+HOST_HELP_CMD_DEL
+ DEL Delete the vhost of another user
+
+HOST_HELP_CMD_DELALL
+ DELALL Delete the vhost for all nicks in a group
+
+HOST_HELP_CMD_LIST
+ LIST Displays one or more vhost entries.
+
+HOST_OPER_HELP
+ not used.
+
+HOST_ADMIN_HELP
+ not used.
+
+HOST_HELP
+ %S commands:
+
+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.
+
+OPER_SVSNICK_UNSUPPORTED
+ Sorry, SVSNICK is not available on this network.
+
+OPER_SQLINE_UNSUPPORTED
+ Sorry, SQLINE is not available on this network.
+
+OPER_SVSO_UNSUPPORTED
+ Sorry, OLINE is not available on this network.
+
+OPER_UMODE_UNSUPPORTED
+ Sorry, UMODE is not available on this network.
+
+OPER_SUPER_ADMIN_NOT_ENABLED
+ SuperAdmin setting not enabled in services.conf
+
diff --git a/lang/hun.l b/lang/hun.l
new file mode 100644
index 000000000..71a9786c0
--- /dev/null
+++ b/lang/hun.l
@@ -0,0 +1,6680 @@
+# Hungarian (magyar) language file.
+#
+# (C) 2003-2008 Anope Team
+# Contact us at info@anope.org
+#
+# Translated by:
+# ==============
+# Janos Kapitany 'Sarkanyka' (chates@freemail.hu)
+# CJB CHAT Magyarország, http://cjbchat.hu
+# Ez a fordítás a CJB Chat megrendelésére készült.
+#
+# 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 us know
+# (dev@anope.org) 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
+# services.conf). 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.
+
+###########################################################
+#
+# A nyelvezet neve
+#
+###########################################################
+
+
+# Angoltól (English) eltéro nyelvek esetén a stringnek a következo
+# formátumban kell lennie:
+# nyelvezet-neve-a-nyelvben (nyelvezet-neve-angolul)
+# Például, "Spanyol (Spanish)" vagy "Francia (French)".
+
+LANG_NAME
+ Magyar (Hungarian)
+
+###########################################################
+#
+# Általános üzenetek
+#
+###########################################################
+
+# strftime() beállitási sorai. 3 strfidõ információ formátumban adható
+# meg a beállitásokban. Rövid, hosszú és teljes verzió:
+# %a = Nap neve (rövid) %H = óra
+# %b = Hónap neve (rövid) %M = perc
+# %d = nap a hónapban %S = másodperc
+# %Y = év %Z = idõ zóne
+
+# ezt a formát használd az strftime() mikor a dátum és idõ
+# együtt szükséges.
+STRFTIME_DATE_TIME_FORMAT
+ %Z %Y %B %d %H:%M:%S
+# ezt a formát használd az strftime() mikor a dátumnak hosszú
+# formátum kell (Angol: a nap neve is).
+STRFTIME_LONG_DATE_FORMAT
+ %Y %B %d %A
+# ezt a formát használd az strftime() mikor a dátumnak elég
+# a rövig forma (Angol:: nap neve is).
+STRFTIME_SHORT_DATE_FORMAT
+ %b %d %Y
+
+# Ez megadja az strftime() által használt hónap és nap neveket. Ha nem
+# használsz %a, %A, %b, vagy %B változót az strftime() stringben feljebb, akkor
+# nyugodtan szabadon hagyhatod. Ha beírsz neveket, akkor azoknak sorban kell lenniük,
+# és csak egy lehet soronként, a listának teljesnek KELL lennie!
+
+# %a
+STRFTIME_DAYS_SHORT
+ Vas
+ Hét
+ Ke
+ Sze
+ Csü
+ Pén
+ Szo
+# %A
+STRFTIME_DAYS_LONG
+ Vasárnap
+ Hétfõ
+ Kedd
+ Szerda
+ Csütörtök
+ Péntek
+ Szombat
+# %b
+STRFTIME_MONTHS_SHORT
+ Jan
+ Feb
+ Márc
+ Ápr
+ Máj
+ Jún
+ Júl
+ Aug
+ Szept
+ Okt
+ Nov
+ Dec
+# %B
+STRFTIME_MONTHS_LONG
+ Január
+ Február
+ Március
+ Április
+ Május
+ Június
+ Július
+ Augusztus
+ Szeptember
+ Október
+ November
+ December
+
+
+
+# Ezt a ChanServ/NickServ INFO megjelenítéseknél használja.
+COMMA_SPACE
+ ,
+
+
+# Különbözõ hiba üzenetek.
+USER_RECORD_NOT_FOUND
+ Belsõ hiba - nem teljesíthetõ kérés.
+UNKNOWN_COMMAND
+ Ismeretlen Parancs %s.
+UNKNOWN_COMMAND_HELP
+ Ismeretlen parancs %s. Írd be: "%R%s HELP".
+SYNTAX_ERROR
+ Szintaktika: %s
+MORE_INFO
+ %R%s HELP %s bõvebb információért.
+NO_HELP_AVAILABLE
+ Nincs ezzel kapcsolatban segítség: %s.
+OBSOLETE_COMMAND
+ Nem használható parancs; használd a %s parancsot helyette.
+
+BAD_USERHOST_MASK
+ A maszknak ilyen formátumúnak kell lennie: user@host.
+BAD_EXPIRY_TIME
+ Érvénytelen elévülési idõ.
+USERHOST_MASK_TOO_WIDE
+ %s túl tág tartományra vonatkozik.
+
+SERVICE_OFFLINE
+ %s jelenleg offline.
+READ_ONLY_MODE
+ Megjegyzés: A Szervíz csak olvasás módban fut!
+PASSWORD_INCORRECT
+ Hibás jelszó.
+INVALID_TARGET
+ "/msg %s" is no longer supported. Use "/msg %s@%s" or "/%s" instead.
+
+# Mi a különbség a "Hozzáférés megtagadva" és az "Engedély letiltva" között?
+# Nagyon kicsi; ha ugyanazt az üzenetet írod mindkettõre, nem igazán veszít
+# a jelentésbõl. Ha különbséget akarsz tenni, akkor a "Hozzáférés megtagadva"
+# általánosabb értelemben használatos, például, ha egy nem oper próbál
+# hozzáférni az OperServhez, akkor azt kapja, hogy "Hozzáférés megtagadva",
+# amikor egy nem Szervíz admin próbálja használni a NickServ SET NOEXPIRE
+# opciót, akkor õ azt kapja, hogy "Endegély letiltva".
+ACCESS_DENIED
+ Hozzáférés megtagadva.
+PERMISSION_DENIED
+ Engedély megtagadva.
+RAW_DISABLED
+ A RAW opcó nem használható. Ha használnod kell, állitsd
+ akkor be a DisableRaw beállitást a Szerviz beállításnál.
+MORE_OBSCURE_PASSWORD
+ Próbálj nehezebb jelszót használni .Jelszavad min. öt
+ karakter legyen, és nem kitalálható legyen, (ne a
+ nickneved/valósneved), ne legyen benne írásjel.
+PASSWORD_TOO_LONG
+ Your password is too long. Please try again with a shorter password.
+NICK_NOT_REGISTERED
+ A neved még nem regisztrált.
+NICK_NOT_REGISTERED_HELP
+ A neved még nem regisztrált. Segítség: %R%s HELP.
+NICK_X_IS_SERVICES
+ A %s nick a Hálózat Szervízének egysége.
+NICK_X_NOT_REGISTERED
+ Ez a nick: %s nem regisztrált.
+NICK_X_IN_USE
+ Ez a nick: %s jelenleg használatban van.
+NICK_X_NOT_IN_USE
+ Ez a nick: %s nincs jelenleg használatban.
+NICK_X_NOT_ON_CHAN
+ %s jelenleg nincs a %s szobában .
+NICK_X_FORBIDDEN
+ %snicket nem lehet regisztrálni vagy használni.
+NICK_X_FORBIDDEN_OPER
+ Ezt a nicket: %s %s forbidolta:
+ %s
+NICK_X_ILLEGAL
+ %snick illegális nicknév vagy nem használható.
+NICK_X_TRUNCATED
+ A nicked %s meg lett csonkítva %d karakter hosszúságúra.
+NICK_X_SUSPENDED
+ Nick %s is currently suspended.
+CHAN_X_NOT_REGISTERED
+ %s szoba nem regisztrált.
+CHAN_X_NOT_IN_USE
+ %scsatorna nem létezik.
+CHAN_X_FORBIDDEN
+ %scsatornát nem lehet regisztrálni vagy használni.
+CHAN_X_FORBIDDEN_OPER
+ %scsatornát %s forbidolta:
+ %s
+CHAN_X_SUSPENDED
+ Felfüggesztve: [%s] %s
+NICK_IDENTIFY_REQUIRED
+ Jelszavas azonositás szükséges ehhez a parancshoz.
+ Próbáld újra miután beírtad: %R%s IDENTIFY jelszó.
+CHAN_IDENTIFY_REQUIRED
+ Jelszavas azonositás szükséges ehhez a parancshoz.
+ Próbáld újra miután beírtad: %R%s IDENTIFY %s jelszó.
+
+MAIL_DISABLED
+ A Szervíz úgy van beállítva, hogy nem küld mailt.
+MAIL_INVALID
+ %sEmail címe nem érvényes.
+MAIL_X_INVALID
+ %s nem érvényes e-mail cím.
+MAIL_LATER
+ Nem lehet most levelet küldeni; próbáld újra késõbb.
+MAIL_DELAYED
+ Kérlek várj %d másodpercet és próbáld újra.
+
+NO_REASON
+ Nincs indok
+UNKNOWN
+ <ismeretlen>
+
+# Duration system
+DURATION_DAY
+ 1 nap
+DURATION_DAYS
+ %d nap
+DURATION_HOUR
+ 1 óra
+DURATION_HOURS
+ %d óra
+DURATION_MINUTE
+ 1 perc
+DURATION_MINUTES
+ %d perc
+DURATION_SECOND
+ 1 másodperc
+DURATION_SECONDS
+ %d másodperc
+
+# Emberi olvasható elévülések
+NO_EXPIRE
+ nem fog elévülni
+EXPIRES_SOON
+ elévül a következõ adatbázis mentésnél
+EXPIRES_M
+ elévül %d perc múlva
+EXPIRES_1M
+ elévül %d perc múlva
+EXPIRES_HM
+ elévül %d óra, %d perc múlva
+EXPIRES_H1M
+ elévül %d óra, %d perc múlva
+EXPIRES_1HM
+ elévül %d óra, %d perc múlva
+EXPIRES_1H1M
+ elévül %d óra, %d perc múlva
+EXPIRES_D
+ elévül %d nap múlva
+EXPIRES_1D
+ elévül %d nap múlva
+
+# Általános lábjegyzet üzenet
+END_OF_ANY_LIST
+ %s lista vége.
+
+##########################################################
+#
+# NickServ üzenetek
+#
+##########################################################
+
+# Automatikus üzenetek
+LIST_INCORRECT_RANGE
+ Incorrect range specified. The correct syntax is #from-to.
+CS_LIST_INCORRECT_RANGE
+ To search for channels starting with #, search for the channel
+ name without the #-sign prepended (anope instead of #anope).
+
+###########################################################################
+#
+# NickServ messages
+#
+###########################################################################
+
+# Automatic messages
+HELP_LIMIT_SERV_OPER
+ Limited to Services Operators.
+HELP_LIMIT_SERV_ADMIN
+ Limited to Services Administrators.
+HELP_LIMIT_SERV_ROOT
+ Limited to Services Roots.
+HELP_LIMIT_IRC_OPER
+ Limited to IRC Operators.
+HELP_LIMIT_HOST_SETTER
+ Limited to Host Setters.
+HELP_LIMIT_HOST_REMOVER
+ Limited to Host Removers.
+
+
+###########################################################################
+#
+# NickServ messages
+#
+###########################################################################
+
+# Automatic messages
+NICK_IS_REGISTERED
+ Ez a nick már regisztrált. Kérlek válassz másikat.
+ Ha ez a te nicked, akkor %R%s IDENTIFY jelszó!
+NICK_IS_SECURE
+ Ez a nick regisztrált és védett. Ha ez a te nicked,
+ akkor %R%s IDENTIFY jelszó!
+ Különben válassz másik nicknevet!
+NICK_MAY_NOT_BE_USED
+ Ez a nicknév nem használható. Kérlek válassz másikat!
+FORCENICKCHANGE_IN_1_MINUTE
+ Ha nem váltasz nevet 1 percen belül, én megváltoztatom.
+FORCENICKCHANGE_IN_20_SECONDS
+ Ha nem váltasz nevet 20 sec.-en belül, én megváltoztatom.
+FORCENICKCHANGE_NOW
+ Ez a nicknév regisztrált; te nem használhatod.
+FORCENICKCHANGE_CHANGING
+ A nickneved most meg lesz változtatva: %s.
+
+# REGISTER válaszok
+NICK_REGISTER_SYNTAX
+ REGISTER jelszó [email]
+NICK_REGISTER_SYNTAX_EMAIL
+ REGISTER jelszó email
+NICK_REGISTRATION_DISABLED
+ Sajnálom, a nickregisztráció jelenleg nem mûködik.
+NICK_REGISTRATION_FAILED
+ Sajnálom, a regisztráció sikertelen.
+NICK_REG_PLEASE_WAIT
+ Várj %d másodpercet mielõtt használnád ezt a parancsot!
+NICK_CANNOT_BE_REGISTERED
+ Ez a nicknév: %s nem regisztrálható.
+NICK_ALREADY_REGISTERED
+ Ez a nicknév: %s már regisztrált!
+NICK_REGISTERED
+ Ez a nicknév: %s számodra lett regisztrálva: %s
+NICK_REGISTERED_NO_MASK
+ Nickname %s registered.
+NICK_PASSWORD_IS
+ Jelszavad: %s - jegyezd meg a késõbbi használathoz!
+NICK_REG_DELAY
+ A nicked regisztrálásához %d másodpercnél régebben kell csatlakozva lenned.
+
+# GROUP válaszok
+NICK_GROUP_SYNTAX
+ GROUP célnick jelszó
+NICK_GROUP_DISABLED
+ Sajnálom, a csoportok használata ideiglenesen le van tiltva.
+NICK_GROUP_FAILED
+ Sajnálom, a group parancs használata sikertelen.
+NICK_GROUP_PLEASE_WAIT
+ Kérlek várj %d másodpercet, mielõtt ismét használod a GROUP parancsot.
+NICK_GROUP_CHANGE_DISABLED
+ A nicked már regisztrált; írd be %R%s DROP elõször.
+NICK_GROUP_SAME
+ Már tagja vagy ennek a csoportnak: %s.
+NICK_GROUP_TOO_MANY
+ Túl sok nick van a %s csoportban; listázd és dropolj párat.
+ Írd: %R%s HELP GLIST és %R%s HELP DROP
+ bõvebb információkért.
+NICK_GROUP_JOINED
+ Mostantól tagja vagy a %scsoportnak.
+
+# IDENTIFY válaszok
+NICK_IDENTIFY_SYNTAX
+ IDENTIFY jelszó
+NICK_IDENTIFY_FAILED
+ Sajnálom, azonosítás sikertelen.
+NICK_IDENTIFY_SUCCEEDED
+ Jelszavad elfogadva - azonosítás sikeres.
+NICK_IDENTIFY_EMAIL_REQUIRED
+ Be kell állítanod egy E-mail címet a nicknevedhez.
+NICK_IDENTIFY_EMAIL_HOWTO
+ Írd be: %R%S SET EMAIL e-mail
+ Az email címed nem lesz kiadva harmadik személynek.
+NICK_ALREADY_IDENTIFIED
+ Már be vagy azonosítva. :-)
+
+# UPDATE válaszok
+NICK_UPDATE_SUCCESS
+ Státusz frissítve (memok, vhost, chmodok, flagek).
+
+# LOGOUT válaszok
+NICK_LOGOUT_SYNTAX
+ LOGOUT
+NICK_LOGOUT_SUCCEEDED
+ A nicked sikeresen kijelentkezett.
+NICK_LOGOUT_X_SUCCEEDED
+ %s nick sikeresen kijelentkezett.
+NICK_LOGOUT_SERVICESADMIN
+ %s nem tud kijelentkezni, mert õ egy services admin.
+
+# DROP válaszok
+NICK_DROP_DISABLED
+ Sajnálom, a nicknevek regisztrációjának törlése szünetel.
+NICK_DROPPED
+ A nickneved dropolva lett,
+NICK_X_DROPPED
+ A %s nicknevet dropoltad.
+
+# SET válaszok
+NICK_SET_SYNTAX
+ SET opció paraméterek
+NICK_SET_SERVADMIN_SYNTAX
+ SET [nick] opció paraméterek
+NICK_SET_DISABLED
+ Sajnálom, a nicknév opció beállítás jelenleg szünetel.
+NICK_SET_UNKNOWN_OPTION
+ Ismeretlen SET opció: %s.
+NICK_SET_OPTION_DISABLED
+ Ez az opció: %snem állítható be ezen a hálózaton.
+
+# SET DISPLAY válaszok
+NICK_SET_DISPLAY_INVALID
+ Az új megjelenítéshez KELL az új becenév és a csoport!
+NICK_SET_DISPLAY_CHANGED
+ Az új megjelenítés: %s.
+
+# SET PASSWORD válaszok
+NICK_SET_PASSWORD_FAILED
+ Sajnálom, a jelszavad nem sikerült megváltoztatni.
+NICK_SET_PASSWORD_CHANGED
+ Jelszavad megváltoztatva.
+NICK_SET_PASSWORD_CHANGED_TO
+ Jelszavad megváltoztatva a következõre: %s.
+
+# SET LANGUAGE válaszok
+NICK_SET_LANGUAGE_SYNTAX
+ SET LANGUAGE szám
+NICK_SET_LANGUAGE_UNKNOWN
+ Ismeretlen nyelvi sorszám %d %R%s HELP SET LANGUAGE
+NICK_SET_LANGUAGE_CHANGED
+ Új nyelvezet: Magyar.
+
+# SET URL válaszok
+NICK_SET_URL_CHANGED
+ URL megváltoztatva: %s.
+NICK_SET_URL_UNSET
+ URL törölve.
+
+# SET EMAIL válaszok
+NICK_SET_EMAIL_CHANGED
+ E-mail cím megváltoztatva: %s.
+NICK_SET_EMAIL_UNSET
+ E-mail cím törölve.
+NICK_SET_EMAIL_UNSET_IMPOSSIBLE
+ Nem törölheted ezen a hálózaton az e-mail címed.
+
+# SET ICQ válaszok
+NICK_SET_ICQ_CHANGED
+ ICQ számod megváltoztatva: %s.
+NICK_SET_ICQ_UNSET
+ ICQ szám törölve.
+NICK_SET_ICQ_INVALID
+ %s nem érvényes szám.
+
+# SET GREET válaszok
+NICK_SET_GREET_CHANGED
+ Köszöntõ üzenet megváltoztatva: %s.
+NICK_SET_GREET_UNSET
+ Köszöntõ üzeneted törölve.
+
+# SET PROTECT válaszok
+NICK_SET_KILL_SYNTAX
+ SET KILL {ON | QUICK | OFF}
+NICK_SET_KILL_IMMED_SYNTAX
+ SET KILL {ON | QUICK | IMMED | OFF}
+NICK_SET_KILL_ON
+ A Kill védelem opció most már ON.
+NICK_SET_KILL_QUICK
+ A Kill védelem opció most már ON, csökkentet idõvel.
+NICK_SET_KILL_IMMED
+ A Kill védelem opció most már ON, késleltetés nélkül.
+NICK_SET_KILL_IMMED_DISABLED
+ Az IMMED opció nem elérhetõ ezen a hálózaton.
+NICK_SET_KILL_OFF
+ A Kill védelem opció most már OFF.
+
+# SET SECURE válaszok
+NICK_SET_SECURE_SYNTAX
+ SET SECURE {ON | OFF}
+NICK_SET_SECURE_ON
+ A Secure opció most már ON.
+NICK_SET_SECURE_OFF
+ A Secure opció most már OFF.
+
+# SET PRIVATE válaszok
+NICK_SET_PRIVATE_SYNTAX
+ SET PRIVATE {ON | OFF}
+NICK_SET_PRIVATE_ON
+ A Private opció most már ON.
+NICK_SET_PRIVATE_OFF
+ A Private opció most már OFF.
+
+# SET HIDE válaszok
+NICK_SET_HIDE_SYNTAX
+ SET HIDE {EMAIL | USERMASK | QUIT} {ON | OFF}
+NICK_SET_HIDE_EMAIL_ON
+ E-mail címed most rejtve lesz a %s INFO kiírásnál.
+NICK_SET_HIDE_EMAIL_OFF
+ E-mail címed most látható lesz a %s INFO kiírásnál.
+NICK_SET_HIDE_MASK_ON
+ Utolsó user@host maszkod rejtve lesz a %s INFO kiírásnál.
+NICK_SET_HIDE_MASK_OFF
+ Utolsó user@host maszkod látható lesz a %s INFO kiírásnál.
+NICK_SET_HIDE_QUIT_ON
+ Utolsó kilépõ üzeneted rejtve lesz a %s INFO kiírásnál
+NICK_SET_HIDE_QUIT_OFF
+ Utolsó kilépõ üzeneted látható lesz a %s INFO kiírásnál.
+NICK_SET_HIDE_STATUS_ON
+ A szervíz hozzáférési státuszod rejtve lesz a %s INFO kiírásnál.
+NICK_SET_HIDE_STATUS_OFF
+ A szervíz hozzáférési státuszod látható lesz a %s INFO kiírásnál.
+
+# SET MSG válaszok
+NICK_SET_MSG_SYNTAX
+ SET MSG {ON | OFF}
+NICK_SET_MSG_ON
+ A szervíz mostantól  privát üzenetekbenválaszol.
+NICK_SET_MSG_OFF
+ A szervíz újra notice-t küld a válaszoknál.
+
+# SET AUTOOP responses
+NICK_SET_AUTOOP_SYNTAX
+ SET AUTOOP {ON | OFF}
+NICK_SET_AUTOOP_ON
+ Services will now autoop you in channels.
+NICK_SET_AUTOOP_OFF
+ Services will no longer autoop you in channels.
+
+# SET NOEXPIRE válaszok
+NICK_SASET_SYNTAX
+ SASET nickname option parameters
+NICK_SASET_DISABLED
+ Sorry, nickname option setting is temporarily disabled.
+NICK_SASET_UNKNOWN_OPTION
+ Unknown SASET option %s.
+NICK_SASET_BAD_NICK
+ Nickname %s not registered.
+NICK_SASET_OPTION_DISABLED
+ Option %s cannot be set on this network.
+
+# SASET DISPLAY responses
+NICK_SASET_DISPLAY_INVALID
+ The new display for %s MUST be a nickname of the nickname group!
+NICK_SASET_DISPLAY_CHANGED
+ The new display is now %s.
+
+# SASET PASSWORD responses
+NICK_SASET_PASSWORD_FAILED
+ Sorry, couldn't change password for %s.
+NICK_SASET_PASSWORD_CHANGED
+ Password for %s changed.
+NICK_SASET_PASSWORD_CHANGED_TO
+ Password for %s changed to %s.
+
+# SASET LANGUAGE responses
+NICK_SASET_URL_CHANGED
+ URL for %s changed to %s.
+NICK_SASET_URL_UNSET
+ URL %s unset.
+
+# SASET EMAIL responses
+NICK_SASET_EMAIL_CHANGED
+ E-mail address for %s changed to %s.
+NICK_SASET_EMAIL_UNSET
+ E-mail address for %s unset.
+NICK_SASET_EMAIL_UNSET_IMPOSSIBLE
+ You cannot unset the e-mail on this network.
+
+# SASET ICQ responses
+NICK_SASET_ICQ_CHANGED
+ ICQ number for %s set to %s.
+NICK_SASET_ICQ_UNSET
+ ICQ number for %s unset.
+NICK_SASET_ICQ_INVALID
+ %s is not a valid number.
+
+# SASET GREET responses
+NICK_SASET_GREET_CHANGED
+ Greet message for %s changed to %s.
+NICK_SASET_GREET_UNSET
+ Greet message for %s unset.
+
+# SASET PROTECT responses
+NICK_SASET_KILL_SYNTAX
+ SASET nickname KILL {ON | QUICK | OFF}
+NICK_SASET_KILL_IMMED_SYNTAX
+ SASET nickname KILL {ON | QUICK | IMMED | OFF}
+NICK_SASET_KILL_ON
+ Protection is now ON for %s.
+NICK_SASET_KILL_QUICK
+ Protection is now ON for %s, with a reduced delay.
+NICK_SASET_KILL_IMMED
+ Protection is now ON for %s, with no delay.
+NICK_SASET_KILL_IMMED_DISABLED
+ The IMMED option is not available on this network.
+NICK_SASET_KILL_OFF
+ Protection is now OFF for %s.
+
+# SASET SECURE responses
+NICK_SASET_SECURE_SYNTAX
+ SASET nickname SECURE {ON | OFF}
+NICK_SASET_SECURE_ON
+ Secure option is now ON for %s.
+NICK_SASET_SECURE_OFF
+ Secure option is now OFF for %s.
+
+# SASET PRIVATE responses
+NICK_SASET_PRIVATE_SYNTAX
+ SASET nickname PRIVATE {ON | OFF}
+NICK_SASET_PRIVATE_ON
+ Private option is now ON for %s.
+NICK_SASET_PRIVATE_OFF
+ Private option is now OFF for %s.
+
+# SASET HIDE responses
+NICK_SASET_HIDE_SYNTAX
+ SET nickname HIDE {EMAIL | USERMASK | QUIT} {ON | OFF}
+NICK_SASET_HIDE_EMAIL_ON
+ The E-mail address of %s will now be hidden from %s INFO displays.
+NICK_SASET_HIDE_EMAIL_OFF
+ The E-mail address of %s will now be shown in %s INFO displays.
+NICK_SASET_HIDE_MASK_ON
+ The last seen user@host mask of %s will now be hidden from %s INFO displays.
+NICK_SASET_HIDE_MASK_OFF
+ The last seen user@host mask of %s will now be shown in %s INFO displays.
+NICK_SASET_HIDE_QUIT_ON
+ The last quit message of %s will now be hidden from %s INFO displays.
+NICK_SASET_HIDE_QUIT_OFF
+ The last quit message of %s will now be shown in %s INFO displays.
+NICK_SASET_HIDE_STATUS_ON
+ The services access status of %s will now be hidden from %s INFO displays.
+NICK_SASET_HIDE_STATUS_OFF
+ The services access status of %s will now be shown in %s INFO displays.
+
+# SASET MSG responses
+NICK_SASET_MSG_SYNTAX
+ SSAET nickname PRIVATE {ON | OFF}
+NICK_SASET_MSG_ON
+ Services will now reply to %s with messages.
+NICK_SASET_MSG_OFF
+ Services will now reply to %s with notices.
+
+# SET NOEXPIRE responses
+NICK_SASET_NOEXPIRE_SYNTAX
+ SASET nickname NOEXPIRE {ON | OFF}
+NICK_SASET_NOEXPIRE_ON
+ Nick %s will not expire.
+NICK_SASET_NOEXPIRE_OFF
+ Nick %s will expire.
+
+# ACCESS responses
+NICK_SASET_AUTOOP_SYNTAX
+ SASET nickname AUTOOP {ON | OFF}
+NICK_SASET_AUTOOP_ON
+ Services will now autoop %s in channels.
+NICK_SASET_AUTOOP_OFF
+ Services will no longer autoop %s in channels.
+
+# SASET LANGUAGE responses
+NICK_SASET_LANGUAGE_SYNTAX
+ SASET nickname LANGUAGE number
+NICK_SASET_LANGUAGE_UNKNOWN
+ Unknown language number %d. Type %R%s HELP SET LANGUAGE for a list of languages.
+NICK_SASET_LANGUAGE_CHANGED
+ Language changed to Hungarian.
+
+
+# ACCESS responses
+NICK_ACCESS_SYNTAX
+ ACCESS {ADD | DEL | LIST} [maszk]
+NICK_ACCESS_ALREADY_PRESENT
+ Ez a maszk: %s már szerepel a hozzáférési listádon.
+NICK_ACCESS_REACHED_LIMIT
+ Neked csak %d bejegyzésed lehet a hozzáférési listán.
+NICK_ACCESS_ADDED
+ %s hozzáadva a hozzáférési listádhoz.
+NICK_ACCESS_NOT_FOUND
+ %s nem található a hozzáférési listádon.
+NICK_ACCESS_DELETED
+ %s törölve a hozzáférési listádról.
+NICK_ACCESS_LIST
+ Hozzáférési lista:
+NICK_ACCESS_LIST_X
+ %s hozzáférési listája:
+NICK_ACCESS_LIST_EMPTY
+ Your access list is empty.
+NICK_ACCESS_LIST_X_EMPTY
+ Access list for %s is empty.
+
+# Status messages
+NICK_STATUS_0
+ STATUS %s 0
+NICK_STATUS_1
+ STATUS %s 1
+NICK_STATUS_2
+ STATUS %s 2
+NICK_STATUS_3
+ STATUS %s 3
+
+# INFO Válaszok
+NICK_INFO_SYNTAX
+ INFO nick [ALL]
+NICK_INFO_REALNAME
+ %s az %s
+NICK_INFO_SERVICES_OPER
+ %s egy szervíz operátor.
+NICK_INFO_SERVICES_ADMIN
+ %s egy szervíz adminisztrátor.
+NICK_INFO_SERVICES_ROOT
+ %s egy szervíz root adminisztrátor.
+NICK_INFO_ADDRESS
+ Utoljára látott cím: %s
+NICK_INFO_ADDRESS_ONLINE
+ Jelenleg online errõl a címrõl: %s
+NICK_INFO_ADDRESS_ONLINE_NOHOST
+ %s jelenleg online.
+NICK_INFO_TIME_REGGED
+ Regisztrálás ideje: %s
+NICK_INFO_LAST_SEEN
+ Utoljára ekkor volt: %s
+NICK_INFO_LAST_QUIT
+ Utolsó kilépõ üzenet: %s
+NICK_INFO_URL
+ URL: %s
+NICK_INFO_EMAIL
+ E-mail cím: %s
+NICK_INFO_VHOST
+ vhost: %s
+NICK_INFO_VHOST2
+ vhost: %s@%s
+NICK_INFO_ICQ
+ ICQ #: %d
+NICK_INFO_GREET
+ Köszöntõ üzenet: %s
+NICK_INFO_OPTIONS
+ Opciók: %s
+NICK_INFO_EXPIRE
+ Expires in: %s
+# Ezek a stringek NEM LEHETNEK üresek
+NICK_INFO_OPT_KILL
+ Kill védelem
+NICK_INFO_OPT_SECURE
+ Biztonság
+NICK_INFO_OPT_PRIVATE
+ Privát
+NICK_INFO_OPT_MSG
+ Üzenet mód
+NICK_INFO_OPT_AUTOOP
+ Auto-op
+NICK_INFO_OPT_NONE
+ Nincs
+NICK_INFO_NO_EXPIRE
+ Ez a nicknév nem fog elévülni.
+NICK_INFO_FOR_MORE
+ Bõvebb információkért, írd be: %R%s INFO %s ALL.
+
+# LIST válaszok
+NICK_INFO_SUSPENDED
+ This nickname is currently suspended, reason: %s
+NICK_INFO_SUSPENDED_NO_REASON
+ This nickname is currently suspended
+
+# LIST responses
+NICK_LIST_SYNTAX
+ LIST pattern
+NICK_LIST_SERVADMIN_SYNTAX
+ LIST pattern [FORBIDDEN] [SUSPENDED] [NOEXPIRE] [UNCONFIRMED]
+NICK_LIST_HEADER
+ Azon bejegyzések listája, melyek egyeznek ezzel, %s:
+NICK_LIST_RESULTS
+ Lista vége - %d / %d találat megjelenítve.
+
+# ALIST válaszok
+NICK_ALIST_SYNTAX
+ ALIST nicknév
+NICK_ALIST_HEADER
+ Azon csatornák, ahol hozzáférésed van:
+ Sorszám Csatorna Szint Meghatározás
+NICK_ALIST_HEADER_X
+ Azon csatornák, ahol %s nicknek hozzáférése van:
+ Sorszám Csatorna Szint Meghatározás
+NICK_ALIST_XOP_FORMAT
+ %3d %c %-20s %-8s %s
+NICK_ALIST_ACCESS_FORMAT
+ %3d %c %-20s %-8d %s
+NICK_ALIST_FOOTER
+ Lista vége - %d / %d csatorna megjelenítve.
+
+# GLIST válaszok
+NICK_GLIST_HEADER
+ A csoportodba tartozó nickek listája:
+NICK_GLIST_HEADER_X
+ %s csoportjába tartozó nickek listája:
+NICK_GLIST_FOOTER
+ %d nicknév van a csoportban.
+NICK_GLIST_REPLY
+ %c%s
+NICK_GLIST_REPLY_ADMIN
+ %c%s (expires in %s)
+
+# RECOVER válaszok
+NICK_RECOVER_SYNTAX
+ RECOVER nicknév [jelszó]
+NICK_NO_RECOVER_SELF
+ Nem használhatod az aktiv nickedre!
+NICK_RECOVERED
+ User claiming your nick has been killed.
+ %R%s RELEASE %s to get it back before %s timeout.
+
+# RELEASE válaszok
+NICK_RELEASE_SYNTAX
+ RELEASE nicknév [jelszó]
+NICK_RELEASE_NOT_HELD
+ Ezt a nicket %s nem fogja a services.
+NICK_RELEASED
+ A Services rendelkezésedre bocsájtotta a nicket.
+
+# GHOST válaszok
+NICK_GHOST_SYNTAX
+ GHOST nicknév [jelszó]
+NICK_NO_GHOST_SELF
+ Nem ghostolhatod ki magad!
+NICK_GHOST_KILLED
+ A befagyott kliens killelve.
+
+# GETPASS válaszok
+NICK_GETPASS_SYNTAX
+ GETPASS nicknév
+NICK_GETPASS_UNAVAILABLE
+ GETPASS nem elérhetõ, amíg az encryption használatban van
+NICK_GETPASS_PASSWORD_IS
+ %s jelszava: %s.
+
+# GETEMAIL válaszok
+NICK_GETEMAIL_SYNTAX
+ GETEMAIL user@email-host Nincs * karakter!!
+NICK_GETEMAIL_EMAILS_ARE
+ Egyezõ emailek %s ehhez: %s.
+NICK_GETEMAIL_NOT_USED
+ Nincs Email listázva ehhez: %s.
+
+# SENDPASS válaszok
+NICK_SENDPASS_SYNTAX
+ SENDPASS nicknév
+NICK_SENDPASS_UNAVAILABLE
+ SENDPASS nem elérhetõ, amíg az encryption használatban van.
+NICK_SENDPASS_SUBJECT
+ Nicknév jelszó (%s)
+NICK_SENDPASS_HEAD
+ Hi,
+NICK_SENDPASS_LINE_1
+ Azt kérted, hogy a %s nicknév jelszavát küldjük el e-mailben.
+NICK_SENDPASS_LINE_2
+ A jelszavad %s Ezt a biztosnág miatt meg kell váltóztatni, miután megkaptad ezt a levelet.
+NICK_SENDPASS_LINE_3
+ Ha nem tudod miért kaptad ezt a levelet, akkor kérlek hagyd figyelmen kivül!
+NICK_SENDPASS_LINE_4
+ ERRE A LEVÉLRE NE VÁLASZOLJ!!!
+NICK_SENDPASS_LINE_5
+ %s adminisztrátorok.
+NICK_SENDPASS_OK
+ %s nick jelszava elküldve.
+
+# FORBID válaszok
+NICK_SUSPEND_SYNTAX
+ SUSPEND nickname reason
+NICK_SUSPEND_SUCCEEDED
+ Nick %s is now suspended.
+NICK_SUSPEND_FAILED
+ Couldn't suspend nick %s!
+
+# UNSUSPEND responses
+NICK_UNSUSPEND_SYNTAX
+ UNSUSPEND nickname
+NICK_UNSUSPEND_SUCCEEDED
+ Nick %s is now released.
+NICK_UNSUSPEND_FAILED
+ Couldn't release nick %s!
+
+# FORBID responses
+NICK_FORBID_SYNTAX
+ FORBID nicknév [indok]
+NICK_FORBID_SYNTAX_REASON
+ FORBID nicknév indok
+NICK_FORBID_SUCCEEDED
+ %s nick most már forbidolt.
+NICK_FORBID_FAILED
+ Nem forbidolható: %s!
+
+# Nick Registraion válaszok
+NICK_REQUESTED
+ Ezt a nicket már kérelmezték, ellenõrizd az e-mail cimed, egy levélben van a kódod.
+NICK_REG_RESENT
+ A kód újra el lett küldve erre a címre: %s.
+NICK_REG_UNABLE
+ Nick NEM regisztrált, próbáld késõbb.
+NICK_IS_PREREG
+ A nick az emailben elküldött kóddal való aktíválásra vár a regisztráció befejezéséhez.
+NICK_ENTER_REG_CODE
+ A kód a %s címre lett küldve, írd be %R%s confirm <kód> a regisztráció befejezéséhez.
+NICK_CONFIRM_NOT_FOUND
+ Regisztráció 1 lépése lehet, hogy elévült, írd be: "%R%s register <jelszó> <email>".
+NICK_CONFIRM_INVALID
+ Érvénytelen kód, ellenõrizze az e-mailben, majd próbálja újra.
+NICK_REG_MAIL_SUBJECT
+ Nicknév Regisztráció (%s)
+NICK_REG_MAIL_HEAD
+ Hi,
+NICK_REG_MAIL_LINE_1
+ Te kérelmeztad a %s nick regisztrálását.
+NICK_REG_MAIL_LINE_2
+ Írd be: " %R%s confirm %s ", hogy befejezd a regisztrációt.
+NICK_REG_MAIL_LINE_3
+ Ha nem tudod miért kaptad a levelet, kérlek hagyd figyelmen kívül!
+NICK_REG_MAIL_LINE_4
+ NE VÁLASZOLJ A LEVÉLRE!
+NICK_REG_MAIL_LINE_5
+ %s adminisztrátorok.
+NICK_GETPASS_PASSCODE_IS
+ Kód a %s nickhez: %s.
+NICK_FORCE_REG
+ A %s nicknév érvényesítve.
+
+###########################################################
+#
+# ChanServ üzenetek
+#
+###########################################################
+
+# Access level leírások
+CHAN_LEVEL_AUTOOP
+ Automatikus operátor (+o) státusz
+CHAN_LEVEL_AUTOVOICE
+ Automatikus voice (+v) státusz (hangadás)
+CHAN_LEVEL_AUTOHALFOP
+ Automatikus halfop (+h) státusz (félop)
+CHAN_LEVEL_AUTOPROTECT
+ Automatikus protect (+a) mód.
+CHAN_LEVEL_AUTODEOP
+ Csatorna operátori státusz tiltása.
+CHAN_LEVEL_NOJOIN
+ Nem léphet a csatornára, ha a RESTRICTED használatban.
+CHAN_LEVEL_INVITE
+ Használhatja az INVITE parancsot.
+CHAN_LEVEL_AKICK
+ Használhatja az AKICK parancsot.
+CHAN_LEVEL_SET
+ Használhatja a SET parancsot (kivéve FOUNDER/PASSWORD).
+CHAN_LEVEL_CLEAR
+ Használhatja a CLEAR parancsot.
+CHAN_LEVEL_UNBAN
+ Használhatja az UNBAN parancsot.
+CHAN_LEVEL_OPDEOP
+ Használhatja az OP/DEOP parancsot.
+CHAN_LEVEL_ACCESS_LIST
+ Megtekintheti a hozzáférési listát.
+CHAN_LEVEL_ACCESS_CHANGE
+ Módosíthatja a hozzáférési listát.
+CHAN_LEVEL_MEMO
+ Írhat/olvashat csatorna memo üzeneteket
+CHAN_LEVEL_ASSIGN
+ Társíthat/eltávolíthat services botot
+CHAN_LEVEL_BADWORDS
+ Használhatja a BADWORDS parancsot
+CHAN_LEVEL_NOKICK
+ Nem lesz kirúgva a bot automatikus funkcióival.
+CHAN_LEVEL_FANTASIA
+ Használhatja a fantasia parancsokat.
+CHAN_LEVEL_SAY
+ Használhatja az ACT és SAY parancsokat.
+CHAN_LEVEL_GREET
+ NickServ-es köszöntõ üzenet megjelenik.
+CHAN_LEVEL_VOICEME
+ Használhatja a (de)voiceme parancsokat
+CHAN_LEVEL_VOICE
+ Használhatja a VOICE/DEVOICE parancsokat.
+CHAN_LEVEL_GETKEY
+ Használhatja a GETKEY parancsot.
+CHAN_LEVEL_OPDEOPME
+ Használhatja a (de)opme parancsot.
+CHAN_LEVEL_HALFOPME
+ Használhatja a (de)halfopme parancsot.
+CHAN_LEVEL_HALFOP
+ Használhatja a HALFOP/DEHALFOP parancsokat
+CHAN_LEVEL_PROTECTME
+ Használhatja a (de)protectme parancsot
+CHAN_LEVEL_PROTECT
+ Használhatja a PROTECT/DEPROTECT parancsokat
+CHAN_LEVEL_KICKME
+ Használhatja a kickme parancsot
+CHAN_LEVEL_KICK
+ Használhatja a KICK parancsot
+CHAN_LEVEL_SIGNKICK
+ Nincs signkick, ha a SIGNKICK LEVEL használatban van.
+CHAN_LEVEL_BANME
+ Használhatja a banme parancsot
+CHAN_LEVEL_BAN
+ Használhatja a BAN parancsot
+CHAN_LEVEL_TOPIC
+ Használhatja a TOPIC parancsot
+CHAN_LEVEL_INFO
+ Használhatja az INFO parancsot az ALL opcióval
+
+# Automatikus válaszok
+CHAN_IS_REGISTERED
+ Ez a szoba a %s adatbázisában regisztrált.
+CHAN_NOT_ALLOWED_OP
+ Nem lehetsz szobaop ezen a csatornán: %s.
+CHAN_MAY_NOT_BE_USED
+ Ez a csatorna nem használható.
+CHAN_NOT_ALLOWED_TO_JOIN
+ Nem tartózkodhatsz ezen a csatornán.
+
+# REGISTER válaszok
+CHAN_X_INVALID
+ Channel %s is not a valid channel.
+
+# REGISTER responses
+CHAN_REGISTER_SYNTAX
+ REGISTER #szoba jelszó leírás
+CHAN_REGISTER_DISABLED
+ Sajnálom, a csatorna regisztráció jelenleg szünetel.
+CHAN_REGISTER_NOT_LOCAL
+ Helyi csatornák nem regisztrálhatók.
+CHAN_MUST_REGISTER_NICK
+ Elõször regisztrálnod kell a nevedet. %R%s help
+CHAN_MUST_IDENTIFY_NICK
+ Kérlek azonosíts a %s-be, használd ezt a parancsot:
+ %R%s IDENTIFY jelszó
+CHAN_MAY_NOT_BE_REGISTERED
+ Ez a csatorna %s nem regisztrálható.
+CHAN_ALREADY_REGISTERED
+ A megadott csatorna %s már regisztrált!
+CHAN_MUST_BE_CHANOP
+ A csatornán operátornak kell lenned, hogy regisztrálhasd.
+CHAN_REACHED_CHANNEL_LIMIT
+ Már elérted a felsõ korlátot (%d) csatornák számában.
+CHAN_EXCEEDED_CHANNEL_LIMIT
+ Már túllépted a felsõ korlátot (%d) a csatornán.
+CHAN_REGISTRATION_FAILED
+ Sajnálom, regisztráció sikertelen.
+CHAN_REGISTERED
+ Regisztráltam a %s csatornát a (%s) nickre.
+CHAN_PASSWORD_IS
+ Csatorna jelszava: %s - Jegyezd fel a késõbbi használathoz.
+CHAN_REGISTER_NONE_CHANNEL
+ You have attempted to register a nonexistent channel %s
+CHAN_SYMBOL_REQUIRED
+ Please use the symbol of # when attempting to register
+
+
+# IDENTIFY válaszok
+CHAN_IDENTIFY_SYNTAX
+ IDENTIFY #szoba jelszó
+CHAN_IDENTIFY_FAILED
+ Sajnálom, azonosítás sikertelen.
+CHAN_IDENTIFY_SUCCEEDED
+ Jelszavad elfogadva - founder szintû a hozzáférésed a %s csatornán.
+
+# LOGOUT válaszok
+CHAN_LOGOUT_SYNTAX
+ LOGOUT #szoba nicknév
+CHAN_LOGOUT_SERVADMIN_SYNTAX
+ LOGOUT #szoba [nicknév]
+CHAN_LOGOUT_SUCCEEDED
+ %s felhasználó kijelentkezett a %s csatornáról.
+CHAN_LOGOUT_ALL_SUCCEEDED
+ Minden felhasználó kijelentkezett a %s csatornáról (except the channel founder).
+CHAN_LOGOUT_FOUNDER_FAILED
+ You may not log out of %s (you are founder).
+
+# DROP válaszok
+CHAN_DROP_SYNTAX
+ DROP #szoba
+CHAN_DROP_DISABLED
+ A csatornák regisztrációjának törlése jelenleg szünetel.
+CHAN_DROPPED
+ %s csatorna regisztrációjának törlése sikerült.
+
+# SET válaszok
+CHAN_SET_SYNTAX
+ SET #szoba opció paraméterek
+CHAN_SET_DISABLED
+ A csatornák opcióinak beállitása jelenleg szünetel.
+CHAN_SET_UNKNOWN_OPTION
+ Ismeretlen SET opció %s.
+
+# SET FOUNDER válaszok
+CHAN_SET_FOUNDER_TOO_MANY_CHANS
+ %s részére túl sok csatorna van regisztrálva.
+CHAN_FOUNDER_CHANGED
+ A megadott csatorna (%s) új foundere: %s.
+
+# SET SUCCESSOR válaszok
+CHAN_SUCCESSOR_CHANGED
+ A megadott csatorna (%s) új successora: %s.
+CHAN_SUCCESSOR_UNSET
+ A megadott csatorna %s successora törölve.
+CHAN_SUCCESSOR_IS_FOUNDER
+ %s nem lehet a %s csatorna successora, mert õ a founder is.
+
+# SET PASSWORD válaszok
+CHAN_SET_PASSWORD_FAILED
+ A jelszó beállítása sikertelen.
+CHAN_PASSWORD_CHANGED
+ %s csatorna jelszava megváltozott.
+CHAN_PASSWORD_CHANGED_TO
+ %s csatorna új jelszava: %s.
+
+# SET DESC válaszok
+CHAN_DESC_CHANGED
+ %s csatorna leírás megváltoztatva: %s.
+
+# SET URL válaszok
+CHAN_URL_CHANGED
+ A megadott csatorna (%s) új URL címe: %s.
+CHAN_URL_UNSET
+ A megadott csatorna %s URL címe törölve.
+
+# SET EMAIL válaszok
+CHAN_EMAIL_CHANGED
+ A megadott csatorna (%s) új E-mail címe: %s.
+CHAN_EMAIL_UNSET
+ A megadott csatorna (%s) E-mail címe törölve.
+
+# SET ENTRYMSG válaszok
+CHAN_ENTRY_MSG_CHANGED
+ %s csatorna belépõ üzenete megváltozott.
+CHAN_ENTRY_MSG_UNSET
+ %s csatorna belépõ üzenete törölve.
+
+# SET BANTYPE válaszok
+CHAN_SET_BANTYPE_INVALID
+ %s nem érvényes ban típus.
+CHAN_SET_BANTYPE_CHANGED
+ A megadott csatorna (%s) új ban típusa: #%d.
+
+# SET MLOCK válaszok
+CHAN_SET_MLOCK_UNKNOWN_CHAR
+ Ismeretlen mód karakter: %c figyelmen kívül hagyva.
+CHAN_SET_MLOCK_IMPOSSIBLE_CHAR
+ %c mód figyelmen kívül hagyva, mert nem rögzítheted.
+CHAN_SET_MLOCK_L_REQUIRED
+ Rögzítened kell a +l módot is, ha a +L módot rögzited.
+CHAN_SET_MLOCK_K_REQUIRED
+ Rögzítened kell a +i módot is, ha a +K módot rögzíted.
+CHAN_MLOCK_CHANGED
+ A megadott csatornán (%s) az új Mode lock: %s.
+
+# SET KEEPTOPIC válaszok
+CHAN_SET_KEEPTOPIC_SYNTAX
+ SET #szoba KEEPTOPIC {ON | OFF}
+CHAN_SET_KEEPTOPIC_ON
+ Topic retention option for %s is now ON.
+CHAN_SET_KEEPTOPIC_OFF
+ Topic retention option for %s is now OFF.
+
+# SET TOPICLOCK válaszok
+CHAN_SET_TOPICLOCK_SYNTAX
+ SET #szoba TOPICLOCK {ON | OFF}
+CHAN_SET_TOPICLOCK_ON
+ Topic lock option for %s is now ON.
+CHAN_SET_TOPICLOCK_OFF
+ Topic lock option for %s is now OFF.
+
+# SET PEACE válaszok
+CHAN_SET_PEACE_SYNTAX
+ SET #szoba PEACE {ON | OFF}
+CHAN_SET_PEACE_ON
+ Peace option for %s is now ON.
+CHAN_SET_PEACE_OFF
+ Peace option for %s is now OFF.
+
+# SET PRIVATE válaszok
+CHAN_SET_PRIVATE_SYNTAX
+ SET #szoba PRIVATE {ON | OFF}
+CHAN_SET_PRIVATE_ON
+ Private option for %s is now ON.
+CHAN_SET_PRIVATE_OFF
+ Private option for %s is now OFF.
+
+# SET SECUREOPS válaszok
+CHAN_SET_SECUREOPS_SYNTAX
+ SET #szoba SECUREOPS {ON | OFF}
+CHAN_SET_SECUREOPS_ON
+ Secure ops option for %s is now ON.
+CHAN_SET_SECUREOPS_OFF
+ Secure ops option for %s is now OFF.
+
+# SET SECUREFOUNDER válaszok
+CHAN_SET_SECUREFOUNDER_SYNTAX
+ SET #szoba SECUREFOUNDER {ON | OFF}
+CHAN_SET_SECUREFOUNDER_ON
+ Secure founder option for %s is now ON.
+CHAN_SET_SECUREFOUNDER_OFF
+ Secure founder option for %s is now OFF.
+
+# SET RESTRICTED válaszok
+CHAN_SET_RESTRICTED_SYNTAX
+ SET #szoba RESTRICTED {ON | OFF}
+CHAN_SET_RESTRICTED_ON
+ Restricted access option for %s is now ON.
+CHAN_SET_RESTRICTED_OFF
+ Restricted access option for %s is now OFF.
+
+# SET SECURE válaszok
+CHAN_SET_SECURE_SYNTAX
+ SET #szoba SECURE {ON | OFF}
+CHAN_SET_SECURE_ON
+ Secure option for %s is now ON.
+CHAN_SET_SECURE_OFF
+ Secure option for %s is now OFF.
+
+# SET SIGNKICK válaszok
+CHAN_SET_SIGNKICK_SYNTAX
+ SET #szoba SIGNKICK {ON | LEVEL | OFF}
+CHAN_SET_SIGNKICK_ON
+ Signed kick option for %s is now ON.
+CHAN_SET_SIGNKICK_LEVEL
+ Signed kick option for %s is now ON, but depends of the
+ level of the user that is using the command.
+CHAN_SET_SIGNKICK_OFF
+ Signed kick option for %s is now OFF.
+
+# SET OPNOTICE válaszok
+CHAN_SET_OPNOTICE_SYNTAX
+ SET #szoba OPNOTICE {ON | OFF}
+CHAN_SET_OPNOTICE_ON
+ Op-notice option for %s is now ON.
+CHAN_SET_OPNOTICE_OFF
+ Op-notice option for %s is now OFF.
+
+# SET XOP válaszok
+CHAN_SET_XOP_SYNTAX
+ SET #szoba XOP {ON | OFF}
+CHAN_SET_XOP_ON
+ xOP lists system for %s is now ON.
+CHAN_SET_XOP_OFF
+ xOP lists system for %s is now OFF.
+
+# SET NOEXPIRE válaszok
+CHAN_SET_NOEXPIRE_SYNTAX
+ SET #szoba NOEXPIRE {ON | OFF}
+CHAN_SET_NOEXPIRE_ON
+ A megadott csatorna (%s) nem fog elévülni.
+CHAN_SET_NOEXPIRE_OFF
+ A megadott csatorna (%s) el fog évülni.
+
+# xOP üzenetek
+CHAN_XOP_REACHED_LIMIT
+ Csak %d számú helyed van a csatorna VOP/AOP/SOP listán.
+CHAN_XOP_LIST_FORMAT
+ %3d %s
+CHAN_XOP_ACCESS
+ Nem használhatod a parancsot. Használd az ACCESS parancsot.
+ Bõvebb információ: %R%s HELP ACCESS
+CHAN_XOP_NOT_AVAILABLE
+ xOP system is not available.
+
+# AOP üzenetek
+CHAN_AOP_SYNTAX
+ AOP #szoba { ADD | DEL | LIST | CLEAR } [ nick | sorszám ]
+CHAN_AOP_DISABLED
+ Csatorna AOP lista módosítás szünetel.
+CHAN_AOP_NICKS_ONLY
+ Csatorna AOP listája csak regisztrált nevet tartalmazhat.
+CHAN_AOP_ADDED
+ %s hozzáadva %s AOP listához.
+CHAN_AOP_MOVED
+ %s áthelyezve a %s AOP listára.
+CHAN_AOP_NO_SUCH_ENTRY
+ Nem található (#%d) a %s AOP listán.
+CHAN_AOP_NOT_FOUND
+ %s nem találatható a %s AOP listán.
+CHAN_AOP_NO_MATCH
+ Nincs ilyen bejegyzés a %s AOP listán.
+CHAN_AOP_DELETED
+ %s törölve lett a %s AOP listáról.
+CHAN_AOP_DELETED_ONE
+ 1 bejegyzés törölve a %s AOP listáról.
+CHAN_AOP_DELETED_SEVERAL
+ %d bejegyzés törölve a %s AOP listáról.
+CHAN_AOP_LIST_EMPTY
+ %s AOP listája üres.
+CHAN_AOP_LIST_HEADER
+ %s AOP listája:
+ Sorszám Nicknév
+
+# HOP üzenetek
+CHAN_AOP_CLEAR
+ Channel %s AOP list has been cleared.
+
+# HOP messages
+CHAN_HOP_SYNTAX
+ HOP #szoba { ADD | DEL | LIST | CLEAR } [ nick | sorszám ]
+CHAN_HOP_DISABLED
+ Csatorna HOP lista módosítás szünetel.
+CHAN_HOP_NICKS_ONLY
+ Csatorna HOP listája csak regisztrált nevet tartalmazhat.
+CHAN_HOP_ADDED
+ %s hozzáadva %s HOP listához.
+CHAN_HOP_MOVED
+ %s áthelyezve a %s HOP listára.
+CHAN_HOP_NO_SUCH_ENTRY
+ Nem található (#%d) a %s HOP listán.
+CHAN_HOP_NOT_FOUND
+ %s nem találatható a %s HOP listán.
+CHAN_HOP_NO_MATCH
+ Nincs ilyen bejegyzés a %s HOP listán.
+CHAN_HOP_DELETED
+ %s törölve lett a %s HOP listáról.
+CHAN_HOP_DELETED_ONE
+ 1 bejegyzés törölve a %s HOP listáról.
+CHAN_HOP_DELETED_SEVERAL
+ %d bejegyzés törölve a %s HOP listáról.
+CHAN_HOP_LIST_EMPTY
+ %s HOP listája üres.
+CHAN_HOP_LIST_HEADER
+ %s HOP listája:
+ Sorszám Nicknév
+
+# SOP üzenetek
+CHAN_HOP_CLEAR
+ Channel %s HOP list has been cleared.
+
+# SOP messages
+CHAN_SOP_SYNTAX
+ SOP #szoba { ADD | DEL | LIST | CLEAR }[ nick | sorszám]
+CHAN_SOP_DISABLED
+ Csatorna SOP lista módosítás szünetel.
+CHAN_SOP_NICKS_ONLY
+ Csatorna SOP listája csak regisztrált nevet tartalmazhat.
+CHAN_SOP_ADDED
+ %s hozzáadva %s SOP listához.
+CHAN_SOP_MOVED
+ %s áthelyezve a %s SOP listára.
+CHAN_SOP_NO_SUCH_ENTRY
+ Nem található (#%d) a %s SOP listán.
+CHAN_SOP_NOT_FOUND
+ %s nem találatható a %s SOP listán.
+CHAN_SOP_NO_MATCH
+ Nincs ilyen bejegyzés a %s SOP listán.
+CHAN_SOP_DELETED
+ %s törölve lett a %s SOP listáról.
+CHAN_SOP_DELETED_ONE
+ 1 bejegyzés törölve a %s SOP listáról.
+CHAN_SOP_DELETED_SEVERAL
+ %d bejegyzés törölve a %s SOP listáról.
+CHAN_SOP_LIST_EMPTY
+ %s SOP listája üres.
+CHAN_SOP_LIST_HEADER
+ %s SOP listája:
+ Sorszám Nicknév
+
+# VOP messages
+CHAN_SOP_CLEAR
+ Channel %s SOP list has been cleared.
+
+# VOP messages
+CHAN_VOP_SYNTAX
+ VOP #csatorna { ADD | DEL | LIST | CLEAR } [ nick | sorszám ]
+CHAN_VOP_DISABLED
+ Csatorna VOP lista módosítás szünetel.
+CHAN_VOP_NICKS_ONLY
+ Csatorna VOP listája csak regisztrált nevet tartalmazhat.
+CHAN_VOP_ADDED
+ %s hozzáadva %s VOP listához.
+CHAN_VOP_MOVED
+ %s áthelyezve a %s VOP listára.
+CHAN_VOP_NO_SUCH_ENTRY
+ Nem található (#%d) a %s VOP listán.
+CHAN_VOP_NOT_FOUND
+ %s nem találatható a %s VOP listán.
+CHAN_VOP_NO_MATCH
+ Nincs ilyen bejegyzés a %s VOP listán.
+CHAN_VOP_DELETED
+ %s törölve lett a %s VOP listáról.
+CHAN_VOP_DELETED_ONE
+ 1 bejegyzés törölve a %s VOP listáról.
+CHAN_VOP_DELETED_SEVERAL
+ %d bejegyzés törölve a %s VOP listáról.
+CHAN_VOP_LIST_EMPTY
+ %s VOP listája üres.
+CHAN_VOP_LIST_HEADER
+ %s VOP listája:
+ Sorszám Nicknév
+
+# ACCESS üzenetek
+CHAN_VOP_CLEAR
+ Channel %s VOP list has been cleared.
+
+# ACCESS messages
+CHAN_ACCESS_SYNTAX
+ ACCESS#szoba{ ADD | DEL | LIST | CLEAR } [ nick [ szint ] | sorszám ]
+CHAN_ACCESS_XOP
+ Nem használhatod ezt a parancsot.
+ Használd az AOP, SOP és VOP parancsokat helyette.
+ Írd be: %R%s HELP parancs bõvebb információért.
+CHAN_ACCESS_XOP_HOP
+ You can't use this command.
+ Use the AOP, SOP, HOP and VOP commands instead.
+ Type %R%s HELP command for more information.
+CHAN_ACCESS_DISABLED
+ A csatorna hozzáférési listájának módosítása szünetel.
+CHAN_ACCESS_LEVEL_NONZERO
+ A hozzáférési szint nem lehet nulla.
+CHAN_ACCESS_LEVEL_RANGE
+ A hozzáférési szintnek %d és %d között kell lennie.
+CHAN_ACCESS_NICKS_ONLY
+ Csatorna listája csak regisztrált nickeket tartalmazhat.
+CHAN_ACCESS_REACHED_LIMIT
+ Neked csak %d helyed van a csatorna listáján.
+CHAN_ACCESS_LEVEL_UNCHANGED
+ %s hozzáférési szintje a (%s) csatornán : %d
+CHAN_ACCESS_LEVEL_CHANGED
+ %s hozzáférése a (%s) csatornán változott: %d.
+CHAN_ACCESS_ADDED
+ %s hozzáadva a %s hozzáférési listájához.
+ A hozzáférési szintje a ChanServ parancsokhoz: %d.
+CHAN_ACCESS_NO_SUCH_ENTRY
+ A bejegyzés (#%d) nem található %s hozzáférési listáján.
+CHAN_ACCESS_NOT_FOUND
+ %s nem található a (%s) csatorna hozzáférési listáján.
+CHAN_ACCESS_NO_MATCH
+ Nincs ilyen bejegyzés a (%s) csatorna hozzáférési listáján.
+CHAN_ACCESS_DELETED
+ %s törölve lett a (%s) csatorna hozzáférési listájáról.
+CHAN_ACCESS_DELETED_ONE
+ 1 bejegyzés törölve a (%s) csatorna hozzáférési listájáról
+CHAN_ACCESS_DELETED_SEVERAL
+ %d bejegyzés törölve (%s) csatorna hozzáférési listájáról.
+CHAN_ACCESS_LIST_EMPTY
+ %s hozzáférési listája üres.
+CHAN_ACCESS_LIST_HEADER
+ %s hozzáférési listája:
+ Sorszám Szint Nick
+CHAN_ACCESS_LIST_FOOTER
+ Hozzáférési lista vége.
+CHAN_ACCESS_LIST_XOP_FORMAT
+ %3d %s %s
+CHAN_ACCESS_LIST_AXS_FORMAT
+ %3d %4d %s
+
+# AKICK válaszok
+CHAN_ACCESS_CLEAR
+ Channel %s access list has been cleared.
+
+# AKICK responses
+CHAN_AKICK_SYNTAX
+ AKICK #szoba {ADD | STICK | UNSTICK | DEL | LIST | VIEW | ENFORCE | CLEAR}[ nick-maszk ] [ indok ]
+CHAN_AKICK_DISABLED
+ Csatorna autokick listájának módosítása szünetel.
+CHAN_AKICK_ALREADY_EXISTS
+ %s már szerepel a (%s) csatorna autokick listáján.
+CHAN_AKICK_REACHED_LIMIT
+ %d bejegyzésnél nem lehet több a listán.
+CHAN_AKICK_ADDED
+ %s hozzáadva a (%s) csatorna autokick listájához
+CHAN_AKICK_NO_SUCH_ENTRY
+ A bejegyzés (#%d) nincs a (%s) csatorna autokick listáján.
+CHAN_AKICK_NOT_FOUND
+ %s nem szerepel a (%s) csatorna autokick listáján.
+CHAN_AKICK_NO_MATCH
+ Nincs ilyen bejegyzés a (%s) csatorna autokick listáján.
+CHAN_AKICK_STUCK
+ %s most már mindig aktív a (%s) csatornán.
+CHAN_AKICK_UNSTUCK
+ %s többé már nem aktív a (%s) csatornán.
+CHAN_AKICK_DELETED
+ %s törölve a (%s) csatorna autokick listájáról.
+CHAN_AKICK_DELETED_ONE
+ 1 bejegyzés törölve a (%s) csatorna autokick listájáról.
+CHAN_AKICK_DELETED_SEVERAL
+ %d bejegyzés törölve a (%s) csatorna autokick listájáról.
+CHAN_AKICK_LIST_EMPTY
+ %s autokick listája üres.
+CHAN_AKICK_LIST_HEADER
+ %s autokick listája:
+CHAN_AKICK_LIST_FORMAT
+ %3d %s (%s)
+CHAN_AKICK_VIEW_FORMAT
+ %3d %s (%s által, ekkor: %s)
+ %s
+CHAN_AKICK_VIEW_FORMAT_STUCK
+ %3d %s (stuck) (%s által, ekkor: %s)
+ %s
+CHAN_AKICK_ENFORCE_DONE
+ Az AKICK ENFORCE a(z) %s csatornán teljesítve;
+ %d user eltávolítva.
+
+# LEVELS válaszok
+CHAN_AKICK_CLEAR
+ Channel %s akick list has been cleared.
+
+# LEVELS responses
+CHAN_LEVELS_SYNTAX
+ LEVELS #szoba{SET | DIS[ABLE] | LIST | RESET }[ opció [szint]]
+CHAN_LEVELS_XOP
+ Ez a parancs használhatatlan ebben a módban. (xOP)
+CHAN_LEVELS_RANGE
+ A szintnek kizárólag %d és %d között kell lennie.
+CHAN_LEVELS_CHANGED
+ %s szintjének új értéke a (%s) csatornán: %d.
+CHAN_LEVELS_UNKNOWN
+ %s beállítás nem ismert. Írd be %R%s HELP LEVELS DESC
+ az érvényes beállítások listájának megtekintéséhez.
+CHAN_LEVELS_DISABLED
+ %s letiltva a (%s) csatornán.
+CHAN_LEVELS_LIST_HEADER
+ %s hozzáférési szintjeinek beállításai:
+CHAN_LEVELS_LIST_DISABLED
+ %-*s (letiltva)
+CHAN_LEVELS_LIST_FOUNDER
+ %-*s (csak foundernek)
+CHAN_LEVELS_LIST_NORMAL
+ %-*s %d
+CHAN_LEVELS_RESET
+ %s szintjei visszaállítva az alapértékekre.
+
+# Status Messages
+CHAN_STATUS_SYNTAX
+ STATUS ERROR Syntax error
+CHAN_STATUS_NOT_REGGED
+ STATUS ERROR Channel %s not registered
+CHAN_STATUS_FORBIDDEN
+ STATUS ERROR Channel %s forbidden
+CHAN_STATUS_NOTONLINE
+ STATUS ERROR Nick %s not online
+CHAN_STATUS_INFO
+ STATUS %s %s %d
+
+# INFO válaszok
+CHAN_INFO_SYNTAX
+ INFO #szoba [ALL]
+CHAN_INFO_HEADER
+ %s információi:
+CHAN_INFO_FOUNDER
+ Tulajdonos: %s (%s)
+CHAN_INFO_NO_FOUNDER
+ Tulajdonos: %s
+CHAN_INFO_SUCCESSOR
+ Jogutód: %s (%s)
+CHAN_INFO_NO_SUCCESSOR
+ Jogutód: %s
+CHAN_INFO_DESCRIPTION
+ Leírás: %s
+CHAN_INFO_ENTRYMSG
+ Köszöntõ üzenet: %s
+CHAN_INFO_TIME_REGGED
+ Regisztrálás ideje: %s
+CHAN_INFO_LAST_USED
+ Utoljára használva: %s
+CHAN_INFO_LAST_TOPIC
+ Utolsó topic: %s
+CHAN_INFO_TOPIC_SET_BY
+ A témát beállította: %s
+CHAN_INFO_URL
+ URL: %s
+CHAN_INFO_EMAIL
+ E-mail cím: %s
+CHAN_INFO_BANTYPE
+ Ban típus: %d
+CHAN_INFO_OPTIONS
+ Opciók: %s
+CHAN_INFO_OPT_KEEPTOPIC
+ Témamegõrzés
+CHAN_INFO_OPT_OPNOTICE
+ Opok értesítése
+CHAN_INFO_OPT_PEACE
+ Békesség
+CHAN_INFO_OPT_PRIVATE
+ Privát
+CHAN_INFO_OPT_RESTRICTED
+ Korlátozott hozzáférés
+CHAN_INFO_OPT_SECURE
+ Secure
+CHAN_INFO_OPT_SECUREOPS
+ Opjog védelme
+CHAN_INFO_OPT_SECUREFOUNDER
+ Founderjog védelme
+CHAN_INFO_OPT_SIGNKICK
+ Signed kicks
+CHAN_INFO_OPT_TOPICLOCK
+ Témaváltás lezárása
+CHAN_INFO_OPT_XOP
+ xOP lista rendszer
+CHAN_INFO_OPT_NONE
+ Nincs
+CHAN_INFO_MODE_LOCK
+ Rögzített módok: %s
+CHAN_INFO_EXPIRE
+ Expires in: %s
+CHAN_INFO_NO_EXPIRE
+ Ez a csatorna nem fog elévülni.
+
+# LIST válaszok
+CHAN_LIST_SYNTAX
+ LIST pattern
+CHAN_LIST_SERVADMIN_SYNTAX
+ LIST pattern [FORBIDDEN] [SUSPENDED] [NOEXPIRE]
+CHAN_LIST_HEADER
+ %s listájának egyezõ bejegyzései
+CHAN_LIST_FORMAT
+ %-20s %s
+CHAN_LIST_END
+ Lista vége - %d/%d találat megjelenítve.
+
+# INVITE válaszok
+CHAN_INVITE_SYNTAX
+ INVITE #szoba
+
+# UNBAN válaszok
+CHAN_UNBAN_SYNTAX
+ UNBAN #szoba
+CHAN_UNBANNED
+ %s csatornán a tiltást levetetted magadról.
+
+# TOPIC válaszok
+CHAN_TOPIC_SYNTAX
+ TOPIC #szoba [topic]
+
+# CLEAR válaszok
+CHAN_CLEAR_SYNTAX
+ CLEAR #szoba mit?
+CHAN_CLEARED_BANS
+ A (%s) csatornáról minden kitiltás levéve.
+CHAN_CLEARED_EXCEPTS
+ A (%s) csatornáról minden kivétel levéve.
+CHAN_CLEARED_MODES
+ A (%s) csatornáról minden mód el levéve.
+CHAN_CLEARED_OPS
+ A (%s) csatornán minden +o mód levéve.
+CHAN_CLEARED_HOPS
+ A (%s) csatornán minden +h mód levéve.
+CHAN_CLEARED_VOICES
+ A (%s) csatornán minden +v mód levéve.
+CHAN_CLEARED_USERS
+ A (%s) csatornáról minden felhasználó ki lett rúgva.
+CHAN_CLEARED_INVITES
+ All invites on channel %s have been removed.
+
+# GETPASS válaszok
+CHAN_GETPASS_SYNTAX
+ GETPASS #szoba
+CHAN_GETPASS_UNAVAILABLE
+ GETPASS elérhetetlen, mig az encryption használatban van.
+CHAN_GETPASS_PASSWORD_IS
+ A (%s) csatorna jelszava: %s.
+
+# SENDPASS válaszok
+CHAN_GETKEY_SYNTAX
+ GETKEY channel
+CHAN_GETKEY_NOKEY
+ The channel %s has no key.
+CHAN_GETKEY_KEY
+ KEY %s %s
+
+# SENDPASS responses
+CHAN_SENDPASS_SYNTAX
+ SENDPASS #szoba
+CHAN_SENDPASS_UNAVAILABLE
+ SENDPASS elérhetetlen, amíg az encryption használatban van
+CHAN_SENDPASS_SUBJECT
+ Csatorna jelszava: (%s)
+CHAN_SENDPASS_HEAD
+ Hi,
+CHAN_SENDPASS_LINE_1
+ Kérted a szoba jelszavának megküldését %s címre.
+CHAN_SENDPASS_LINE_2
+ %s a szobajeszó.Biztonság kedvéért váltóztasd meg olvasás után
+CHAN_SENDPASS_LINE_3
+ Ha nem te kérted a levelet akkor töréld és feljts el
+CHAN_SENDPASS_LINE_4
+ KÉRLEN NE VÁLASZOLJ A LEVÉLRE!
+CHAN_SENDPASS_LINE_5
+ %s administrators.
+CHAN_SENDPASS_OK
+ Jelszó %s elküldve.
+
+# FORBID válaszok
+CHAN_FORBID_SYNTAX
+ FORBID #szoba [indok]
+CHAN_FORBID_SYNTAX_REASON
+ FORBID #szoba indok
+CHAN_FORBID_SUCCEEDED
+ A (%s) szoba letiltva.
+CHAN_FORBID_FAILED
+ %s szobát nem sikerült letiltani!
+CHAN_FORBID_REASON
+ Ez a szoba forbidolva lett.
+
+# SUSPEND válaszok
+CHAN_SUSPEND_SYNTAX
+ SUSPEND #szoba [indok]
+CHAN_SUSPEND_SYNTAX_REASON
+ SUSPEND #szoba indok
+CHAN_SUSPEND_SUCCEEDED
+ (%s) szoba használata felfüggesztve.
+CHAN_SUSPEND_FAILED
+ %s szobát nem sikerült felfüggeszteni!
+CHAN_SUSPEND_REASON
+ A szoba használata felfüggesztve.
+
+# UNSUSPEND válaszok
+CHAN_UNSUSPEND_SYNTAX
+ UNSUSPEND #szoba
+CHAN_UNSUSPEND_ERROR
+ Nincs # a szoba neve elõtt.
+CHAN_UNSUSPEND_SUCCEEDED
+ (%s) szoba újra használható.
+CHAN_UNSUSPEND_FAILED
+ %s szobát nem sikerült használhatóvá tenni!
+
+# Misc válaszok
+CHAN_EXCEPTED
+ %s megegyezik egy kivétellel (%s) nem tiltható, amíg a kivétel él.
+
+###########################################################
+#
+# MemoServ üzenetek
+#
+###########################################################
+
+# Automatikus üzenetek
+MEMO_HAVE_NEW_MEMO
+ Van egy új üzeneted.
+MEMO_HAVE_NEW_MEMOS
+ %d darab új üzeneted van.
+MEMO_TYPE_READ_LAST
+ Használd a %R%s READ LAST parancsot.
+MEMO_TYPE_READ_NUM
+ Használd a %R%s READ %d parancsot.
+MEMO_TYPE_LIST_NEW
+ Használd a: %R%s LIST NEW parancsot
+MEMO_AT_LIMIT
+ Figyelem: Fogadható üzenetek maximális száma (%d).
+ Nem fogadhatsz több üzenetet, amíg nem törölsz néhányat.
+MEMO_OVER_LIMIT
+ Figyelem: Fogadható üzenetek maximális számát (%d).
+ Nem fogadhatsz több üzenetet, amíg törölsz néhányat.
+MEMO_X_MANY_NOTICE
+ Összesen %d üzenet van a %s csatornán.
+MEMO_X_ONE_NOTICE
+ %d üzenete van a %s szobának.
+MEMO_NEW_X_MEMO_ARRIVED
+ Új üzenete érkezett a %s szobának.
+ Ha szeretnéd elolvasni, írd be: %R%s READ %s %d.
+MEMO_NEW_MEMO_ARRIVED
+ %s küldött egy új üzenetet.
+ Ha szeretnéd elolvasni, írd be: %R%s READ %d.
+
+# Multi-use válaszok
+MEMO_HAVE_NO_MEMOS
+ Nincs üzeneted.
+MEMO_X_HAS_NO_MEMOS
+ %s üzenetlistája üres.
+MEMO_DOES_NOT_EXIST
+ A (%d.) számú üzenet nem szerepel az üzenetlistán!
+MEMO_LIST_NOT_FOUND
+ A megadott üzenetek nem szerepelnek az üzenetlistán.
+
+# SEND válaszok
+MEMO_SEND_SYNTAX
+ SEND {nick | #szoba} memo-szöveg
+MEMO_SEND_DISABLED
+ Sajnálom, az üzenetküldés szünetel.
+MEMO_SEND_PLEASE_WAIT
+ Kérlek, várj %d másodpercet mielõtt SEND parancsot újra használod!
+MEMO_X_GETS_NO_MEMOS
+ %s nem fogadhat üzeneteket.
+MEMO_X_HAS_TOO_MANY_MEMOS
+ %s túl sok üzenettel rendelkezik, és nem fogadhat többet.
+MEMO_SENT
+ Üzenet elküldve %s részére.
+MEMO_MASS_SENT
+ Egy massmemo elküldve minden regisztrált felhasználónak.
+
+# CANCEL válaszok
+MEMO_CANCEL_SYNTAX
+ CANCEL {nick | #szoba}
+MEMO_CANCEL_DISABLED
+ Sajnálom, a memo visszavonás jelenleg szünetel.
+MEMO_CANCEL_NONE
+ Nincs visszavont memo üzenet.
+MEMO_CANCELLED
+ %s részére küldött utolsó memo üzenet visszavonva.
+
+# LIST válaszok
+MEMO_LIST_SYNTAX
+ LIST [#szoba] [list | NEW ]
+MEMO_HAVE_NO_NEW_MEMOS
+ Nem kaptál új üzenetet.
+MEMO_X_HAS_NO_NEW_MEMOS
+ %s nem kapott új üzenetet.
+MEMO_LIST_MEMOS
+ %s üzenetei. Olvasáshoz írd be: %R%s READ szám
+MEMO_LIST_NEW_MEMOS
+ Új üzenet %s részére. Olvasáshoz: %R%s READ szám
+MEMO_LIST_CHAN_MEMOS
+ %s üzenetei. Olvasáshoz : %R%s READ %s szám
+MEMO_LIST_CHAN_NEW_MEMOS
+ %s új üzenetei. Olvasáshoz,: %R%s READ %s szám
+MEMO_LIST_HEADER
+ Sorszám Küldõ Dátum/Idõ
+MEMO_LIST_FORMAT
+ %c %3d %-16s %s
+
+# READ válaszok
+MEMO_READ_SYNTAX
+ READ [#szoba] {list | LAST | NEW }
+MEMO_HEADER
+ Üzenet szám: %d; feladó: %s (%s). Törléshez: %R%s DEL %d
+MEMO_CHAN_HEADER
+ Üzenet szám: %d; feladó.: %s (%s). Törléshez: %R%s DEL %s %d
+MEMO_TEXT
+ %s
+
+# DEL válaszok
+MEMO_DEL_SYNTAX
+ DEL [#szoba] { szám | list | ALL}
+MEMO_DELETED_NONE
+ Nem töröltem egy üzenetet sem.
+MEMO_DELETED_ONE
+ A megadott üzenetet (%d) töröltem.
+MEMO_DELETED_SEVERAL
+ A megadott üzeneteket %s töröltem.
+MEMO_DELETED_ALL
+ Minden üzenetet töröltem.
+MEMO_CHAN_DELETED_ALL
+ Minden üzenetet töröltem a %s csatornán.
+
+# SET válaszok
+MEMO_SET_SYNTAX
+ SET opció paraméterek
+MEMO_SET_DISABLED
+ Üzenet opcióinak beállítása szünetel.
+MEMO_SET_UNKNOWN_OPTION
+ Ismeretlen SET opció: %s
+
+# SET NOTIFY válaszok
+MEMO_SET_NOTIFY_SYNTAX
+ SET NOTIFY {ON | LOGON | NEW | OFF}
+MEMO_SET_NOTIFY_ON
+ %s értesíteni fog az üzenetekrõl csatlakozáskor.
+MEMO_SET_NOTIFY_LOGON
+ %s értesít az üzenetekrõl csatlakozáskor/AWAY OFF-kor.
+MEMO_SET_NOTIFY_NEW
+ %s mostmár értesíteni fog, ha új üzeneted érkezik.
+MEMO_SET_NOTIFY_OFF
+ %s mostmár nem fog értestíteni, ha új üzeneted érkezik.
+MEMO_SET_NOTIFY_MAIL
+ Az új memo üzeneteidrõl emailben kapsz értesítést.
+MEMO_SET_NOTIFY_NOMAIL
+ Már nem kapsz értesítést emailben.
+MEMO_SET_NOTIFY_INVALIDMAIL
+ Nincs beállítva email cím a nevedhez.
+
+
+# SET LIMIT válaszok
+MEMO_SET_LIMIT_SYNTAX
+ SET LIMIT [#szoba] limit
+MEMO_SET_LIMIT_SERVADMIN_SYNTAX
+ SET LIMIT [user | #szoba] {limit | NONE} [HARD]
+MEMO_SET_YOUR_LIMIT_FORBIDDEN
+ Nem változtathatod meg a max. fogadható üzenetek számát.
+MEMO_SET_LIMIT_FORBIDDEN
+ Nem változtathatod meg %s üzeneteinek számát.
+MEMO_SET_YOUR_LIMIT_TOO_HIGH
+ A max. bejövõ üzenetek száma nem lehet több, mint %d.
+MEMO_SET_LIMIT_TOO_HIGH
+ %s max. bejövõ üzenetek száma nem lehet több, mint %d.
+MEMO_SET_LIMIT_OVERFLOW
+ Túl nagy érték a max.bejövÕ üzenetnek,%d az új értéke.
+MEMO_SET_YOUR_LIMIT
+ A max. bejövõ üzenetek számanak új értéke: %d.
+MEMO_SET_YOUR_LIMIT_ZERO
+ Ezentúl nem tudsz üzeneteket fogadni.
+MEMO_UNSET_YOUR_LIMIT
+ Ezentúl korlátlan számú üzenetet fogadhatsz.
+MEMO_SET_LIMIT
+ %s maximálisan fogadható üzeneteinek száma: %d.
+MEMO_SET_LIMIT_ZERO
+ %s ezentúl nem fogadhat üzeneteket.
+MEMO_UNSET_LIMIT
+ %s ezentúl korlátlan számú üzenetet fogadhat.
+
+
+# INFO válaszok
+MEMO_INFO_SYNTAX
+ INFO [#szoba]
+MEMO_INFO_SERVADMIN_SYNTAX
+ INFO [nick | #szoba]
+MEMO_INFO_NO_MEMOS
+ Jelenleg nincs üzeneted.
+MEMO_INFO_MEMO
+ Van 1 üzeneted.
+MEMO_INFO_MEMO_UNREAD
+ Van 1 olvasatlan üzeneted.
+MEMO_INFO_MEMOS
+ Van %d üzeneted.
+MEMO_INFO_MEMOS_ONE_UNREAD
+ Van %d üzeneted, ebbõl 1 olvasatlan.
+MEMO_INFO_MEMOS_SOME_UNREAD
+ Van %d üzeneted, ebbõl %d olvasatlan.
+MEMO_INFO_MEMOS_ALL_UNREAD
+ Van %d üzeneted; és mind olvasatlan.
+MEMO_INFO_LIMIT
+ A maximálisan fogadható üzentek száma: %d.
+MEMO_INFO_HARD_LIMIT
+ A max. bejövõ üzentek száma: %d,ez fix érték.
+MEMO_INFO_LIMIT_ZERO
+ A max. bejövõ üzentek száma: 0; és több nem jöhet.
+MEMO_INFO_HARD_LIMIT_ZERO
+ A max. bejövõ üzentek száma: 0; és nem köhet több.
+ Ez nem változtatható meg.
+MEMO_INFO_NO_LIMIT
+ Korlátlan számú üzenetet fogadhatsz.
+MEMO_INFO_NOTIFY_OFF
+ Nem kapsz értesítést az új üzeneteidrõl.
+MEMO_INFO_NOTIFY_ON
+ Értesítést kapsz új üzenetek érkezésérõl csatlakozáskor.
+MEMO_INFO_NOTIFY_RECEIVE
+ Értesítést kapsz új üzenetek érkezésekor.
+MEMO_INFO_NOTIFY_SIGNON
+ Értesítést kapsz az új üzeneteidrõl,ha fellépsz az IRC-re.
+MEMO_INFO_X_NO_MEMOS
+ %s üzenetlistája üres.
+MEMO_INFO_X_MEMO
+ %s listáján van 1 üzenet.
+MEMO_INFO_X_MEMO_UNREAD
+ %s listáján van 1 olvasatlan üzenet.
+MEMO_INFO_X_MEMOS
+ %s számára %d üzenet érkezett.
+MEMO_INFO_X_MEMOS_ONE_UNREAD
+ %s számára %d üzenet érkezett, ebbõl 1 olvasatlan.
+MEMO_INFO_X_MEMOS_SOME_UNREAD
+ %s számára %d üzenet érkezett, ebbõl %d olvasatlan.
+MEMO_INFO_X_MEMOS_ALL_UNREAD
+ %s számára %d üzenet érkezett, és mind olvasatlan.
+MEMO_INFO_X_LIMIT
+ %s maximálisan fogadható üzeneteinek száma: %d.
+MEMO_INFO_X_HARD_LIMIT
+ %s max. fogadható üzenteinek száma: %d, és ez fix érték.
+MEMO_INFO_X_NO_LIMIT
+ %s korlátlan számú üzenetet fogadhat.
+MEMO_INFO_X_NOTIFY_OFF
+ %s nem kért értesítést az üzeneteirõl.
+MEMO_INFO_X_NOTIFY_ON
+ %s értesítést kért csatlakozáskor,és ha új üzenete van,
+MEMO_INFO_X_NOTIFY_RECEIVE
+ %s értesítést kért, ha új üzenete érkezik.
+MEMO_INFO_X_NOTIFY_SIGNON
+ %s kérte, csatlakozáskor értesítést kapjon,üzeneteirõl.
+
+# Memo2Mail válaszok
+MEMO_MAIL_SUBJECT
+ Új memo
+MEMO_MAIL_TEXT1
+ Hi %s
+MEMO_MAIL_TEXT2
+ Kaptál egy új memo üzenetet %s nicktõl. Ez a memo a %d sorszámú.
+MEMO_MAIL_TEXT3
+ Memo Szöveg:
+
+# RSEND válaszok
+MEMO_RSEND_PLEASE_WAIT
+ Kérlek várj %d másodpercet mielõtt újra használod az RSEND parancsot.
+MEMO_RSEND_DISABLED
+ Sajnálom, az RSEND használata le van tiltva ezen a hálózaton.
+MEMO_RSEND_SYNTAX
+ RSEND {nick | #szoba} memo-szöveg
+MEMO_RSEND_NICK_MEMO_TEXT
+ [auto-memo] A memo, amit küldtél meg lett tekintve.
+MEMO_RSEND_CHAN_MEMO_TEXT
+ [auto-memo] A memo, amit %s számára küldtél meg lett tekintve.
+MEMO_RSEND_USER_NOTIFICATION
+ Az értesítõ üzenet %s részére el lett küldve, informálva
+ õt arról, hogy elolvastad a memoját.
+
+# CHECK válaszok
+MEMO_CHECK_SYNTAX
+ CHECK nicknév
+MEMO_CHECK_NOT_READ
+ Az utolsó memo, amit %s részére (%s idõpontban) küldtél még olvasatlan.
+MEMO_CHECK_READ
+ Az utolsó memo, amit %s részére (%s idõpontban) küldtél már olvasott.
+MEMO_CHECK_NO_MEMO
+ %s nickre nem érkezett memo üzenet tõled.
+
+
+###########################################################
+#
+# BotServ üzenetek
+#
+###########################################################
+
+# Standard válaszok
+MEMO_NO_RSEND_SELF
+ You can not request a receipt when sending a memo to yourself.
+
+###########################################################################
+#
+# BotServ messages
+#
+###########################################################################
+
+# Standard responses
+BOT_DOES_NOT_EXIST
+ %s nevû bot nem létezik.
+BOT_NOT_ASSIGNED
+ Társítanod kellene egy botot a csatornára mielõtt használod
+ ezt a parancsot, írd be %R%S HELP ASSIGN bõvebb infókért.
+BOT_NOT_ON_CHANNEL
+ A Bot nincs a %s csatornán.
+
+# Kick válaszok (kell egy sor)
+BOT_REASON_BADWORD
+ Nem használható ez a szó: %s!
+BOT_REASON_BADWORD_GENTLE
+ Figyelj a stílusra kiskomám!
+BOT_REASON_BOLD
+ Nem használható kiemelt betû ezen a csatornán!
+BOT_REASON_CAPS
+ Kapcsold ki a caps lockod!
+BOT_REASON_COLOR
+ Nem szinezhetsz ezen a csatornán!
+BOT_REASON_FLOOD
+ Ne floodolj!
+BOT_REASON_REPEAT
+ Ne ismételd magad!
+BOT_REASON_REVERSE
+ Nem írj visszafelé ezen a csatornán!
+BOT_REASON_UNDERLINE
+ Nem használj aláhúzásokat ezen a csatornán!
+
+# !seen válaszok
+BOT_SEEN_BOT
+ Megtaláltál, %s!
+BOT_SEEN_YOU
+ Magadat kérdezed le %s, eh?
+BOT_SEEN_ON_CHANNEL
+ %s a szobában van!
+BOT_SEEN_ON_CHANNEL_AS
+ %s a szobában van (%s néven) !
+BOT_SEEN_ON
+ %s utoljára %s ideje járt erre.
+BOT_SEEN_NEVER
+ Sosem láttam %s nicket ebben a szobában.
+BOT_SEEN_UNKNOWN
+ Én nem tudom, hogy %s kicsoda.:-(((
+
+# BOT válaszok
+BOT_BOT_SYNTAX
+ BOT ADD nick user hoszt valósnév
+ BOT CHANGE réginickújnick [user [hoszt [valósnév]]]
+ BOT DEL nick
+BOT_BOT_ALREADY_EXISTS
+ %s nevû bot már létezik.
+BOT_BOT_CREATION_FAILED
+ A bot létrehozása sikertelen.
+BOT_BOT_READONLY
+ A bot módosítás ideiglenesen szünetel.
+BOT_BOT_ADDED
+ %s!%s@%s (%s) hozzáadva a bot listához.
+BOT_BOT_ANY_CHANGES
+ A régi info megegyezik az újjal.
+BOT_BOT_CHANGED
+ A %s nevû bot megváltoztatva %s!%s@%s (%s)
+BOT_BOT_DELETED
+ A %s nevû bot törölve.
+
+# BOTLIST válaszok
+BOT_BOTLIST_HEADER
+ Botok listája:
+BOT_BOTLIST_PRIVATE_HEADER
+ Botok melyeket csak IRC operátorok társíthatnak:
+BOT_BOTLIST_FOOTER
+ %d botok rendelkezésre állnak.
+BOT_BOTLIST_EMPTY
+ Nem áll rendelkezésre bot.
+ Kérj meg egy szervíz admint, hogy csináljon!
+
+# ASSIGN válaszok
+BOT_ASSIGN_SYNTAX
+ ASSIGN #szoba nick
+BOT_ASSIGN_READONLY
+ Bot társítás ideiglenesen nem mûködik.
+BOT_ASSIGN_ALREADY
+ A %s nevû bot már társítva van a %s szobához.
+BOT_ASSIGN_ASSIGNED
+ A %s nevû bot társítva a %s szobához.
+
+# UNASSIGN válaszok
+BOT_UNASSIGN_SYNTAX
+ UNASSIGN #szoba
+BOT_UNASSIGN_UNASSIGNED
+ Nincsen bot kijelölve %s szobában többet.
+
+# INFO válaszok
+BOT_INFO_SYNTAX
+ INFO {#szoba | nick}
+BOT_INFO_NOT_FOUND
+ %s nem érvényes bot vagy regisztrált szoba.
+BOT_INFO_BOT_HEADER
+ Információk a %s nevû botról:
+BOT_INFO_BOT_MASK
+ Maszk : %s@%s
+BOT_INFO_BOT_REALNAME
+ Valódi neve: %s
+BOT_INFO_BOT_CREATED
+ Született: %s
+BOT_INFO_BOT_USAGE
+ Használva: %d szobában
+BOT_INFO_BOT_OPTIONS
+ Beállításai: %s
+BOT_INFO_OPT_PRIVATE
+ Privát
+BOT_INFO_CHAN_HEADER
+ Információ a %s szobáról:
+BOT_INFO_CHAN_BOT
+ Bot név: %s
+BOT_INFO_CHAN_BOT_NONE
+ Bot név: nincs társítva még.
+BOT_INFO_CHAN_KICK_BADWORDS
+ Csúnya szavakért kirúgás: %s
+BOT_INFO_CHAN_KICK_BADWORDS_BAN
+ Csúnya szavakért kirúgás: %s (%d kirúgás után kitiltás)
+BOT_INFO_CHAN_KICK_BOLDS
+ Félkövér betûkért kirúgás: %s
+BOT_INFO_CHAN_KICK_BOLDS_BAN
+ Félkövér betûkért kirúgás: %s (%d kirúgás után kitiltás)
+BOT_INFO_CHAN_KICK_CAPS_ON
+ Caps Lockért kirúgás: %s (minimum %d/%d%%)
+BOT_INFO_CHAN_KICK_CAPS_BAN
+ Caps Lockért kirúgás: %s (%d kirúgás után kitiltás; min. %d/%d%%)
+BOT_INFO_CHAN_KICK_CAPS_OFF
+ Caps Lockért kirúgás : %s
+BOT_INFO_CHAN_KICK_COLORS
+ Szinezésért kirúgás: %s
+BOT_INFO_CHAN_KICK_COLORS_BAN
+ Szinezésért kirúgás: %s (%d kirúgás után kitiltás)
+BOT_INFO_CHAN_KICK_FLOOD_ON
+ Floodért kirúgás: %s (%d sor %ds mp alatt)
+BOT_INFO_CHAN_KICK_FLOOD_BAN
+ Floodért kirúgás: %s (%d kirúgás után kitiltás; %d sor %ds mp alatt)
+BOT_INFO_CHAN_KICK_FLOOD_OFF
+ Floodért kirúgás: %s
+BOT_INFO_CHAN_KICK_REPEAT_ON
+ Ismétlésért kirúgás : %s (%d alkalommal)
+BOT_INFO_CHAN_KICK_REPEAT_BAN
+ Ismétlésért kirúgás: %s (%d kirúgás után kitiltás; %d idõre)
+BOT_INFO_CHAN_KICK_REPEAT_OFF
+ Ismétlésért kirúgás: %s
+BOT_INFO_CHAN_KICK_REVERSES
+ Visszafelé írásért kirúgás: %s
+BOT_INFO_CHAN_KICK_REVERSES_BAN
+ Visszafelé írásért kirúgás: %s (%d kirúgás után kitiltás)
+BOT_INFO_CHAN_KICK_UNDERLINES
+ Aláhúzásért kirúgás: %s
+BOT_INFO_CHAN_KICK_UNDERLINES_BAN
+ Aláhúzásért kirúgás: %s (%d kirúgás után kitiltás)
+BOT_INFO_ACTIVE
+ engedélyezve
+BOT_INFO_INACTIVE
+ letiltva
+BOT_INFO_CHAN_OPTIONS
+ Beállítások: %s
+BOT_INFO_OPT_DONTKICKOPS
+ Opok védelme
+BOT_INFO_OPT_DONTKICKVOICES
+ Voices védelme
+BOT_INFO_OPT_FANTASY
+ Fantasy
+BOT_INFO_OPT_GREET
+ Üdvözlés
+BOT_INFO_OPT_NOBOT
+ Nincs bot
+BOT_INFO_OPT_SYMBIOSIS
+ Együttélés
+BOT_INFO_OPT_NONE
+ Nincsen
+
+# SET válaszok
+BOT_SET_SYNTAX
+ SET #szoba opció beállítások
+BOT_SET_DISABLED
+ Bot beállítás idõlegesen szünetel.
+BOT_SET_UNKNOWN
+ Ismeretlen opció: %s.
+ Használd %R%S HELP SET információért.
+
+# SET DONTKICKOPS üzenetek
+BOT_SET_DONTKICKOPS_SYNTAX
+ SET #szoba DONTKICKOPS {ON|OFF}
+BOT_SET_DONTKICKOPS_ON
+ A Bot nem fog opot kirúgni a %s szobából.
+BOT_SET_DONTKICKOPS_OFF
+ A Bot most már opot is kirúg a %s szobából.
+
+# SET DONTKICKVOICES üzenetek
+BOT_SET_DONTKICKVOICES_SYNTAX
+ SET #szoba DONTKICKVOICES {ON|OFF}
+BOT_SET_DONTKICKVOICES_ON
+ A Bot nem fogja a hangadókat kirúgni a %s szobában.
+BOT_SET_DONTKICKVOICES_OFF
+ A Bot most már a hangadókat is kirúgja a %s szobában.
+
+# SET FANTASY üzenetek
+BOT_SET_FANTASY_SYNTAX
+ SET #szoba FANTASY {ON|OFF}
+BOT_SET_FANTASY_ON
+ Fantasy mód most ON a %s csatornán.
+BOT_SET_FANTASY_OFF
+ Fantasy mód most OFF a %s csatornán.
+
+# SET GREET üzenetek
+BOT_SET_GREET_SYNTAX
+ SET szoba GREET {ON|OFF}
+BOT_SET_GREET_ON
+ Üdvözlõ mód most ON a %s szobán.
+BOT_SET_GREET_OFF
+ Üdvözlõ mód most OFF a %s szobán.
+
+# SET NOBOT
+BOT_SET_NOBOT_SYNTAX
+ SET botname NOBOT {ON|OFF}
+BOT_SET_NOBOT_ON
+ Nincs Bot mód most ONa %s szobán.
+BOT_SET_NOBOT_OFF
+ Nincs Bot mód most OFFa %s szobán.
+
+# SET PRIVATE
+BOT_SET_PRIVATE_SYNTAX
+ SET botnév PRIVATE {ON|OFF}
+BOT_SET_PRIVATE_ON
+ Private mód a %s botban most ON.
+BOT_SET_PRIVATE_OFF
+ Private mód a %s botban most OFF.
+
+# SET SYMBIOSIS
+BOT_SET_SYMBIOSIS_SYNTAX
+ SET szoba SYMBIOSIS {ON|OFF}
+BOT_SET_SYMBIOSIS_ON
+ Együttélés mód most ONa %s szobán.
+BOT_SET_SYMBIOSIS_OFF
+ Együttélés mód most OFFa %s szobán.
+
+# KICK válaszok
+BOT_KICK_SYNTAX
+ KICK #szoba opció {ON|OFF} [beállítások]
+BOT_KICK_DISABLED
+ Kirúgás használata ideiglenesen letiltva.
+BOT_KICK_UNKNOWN
+ Ismeretlen opció: %s.
+ További információért írd be: %R%S HELP KICK
+BOT_KICK_BAD_TTB
+ %s nem fogadható el banolási idõnek.
+
+BOT_KICK_BADWORDS_ON
+ Bot kirúgja tiltott szó használatáért. Használd a BADWORDS
+ parancsot hogy hozzáadj vagy törölj tiltott szavakat a listából.
+BOT_KICK_BADWORDS_ON_BAN
+ Bot kirúgja tiltott szó használatáért, és kitiltja
+ %d kirúgás után a usert. Használd a BADWORDS parancsot
+ hogy hozzáadj vagy törölj tiltott szavakat a listából.
+BOT_KICK_BADWORDS_OFF
+ A Bot most már nem fog kirúgni tiltott szó miatt.
+BOT_KICK_BOLDS_ON
+ A Bot kirúgja félkövér betû használat miatt a usert.
+BOT_KICK_BOLDS_ON_BAN
+ A Bot kirúgja félkövér betû használat miatt, és
+ kitiltja %d kirúgás után a usert.
+BOT_KICK_BOLDS_OFF
+ A Bot nem fog kirúgni félkövér betû használat miatt.
+BOT_KICK_CAPS_ON
+ Bot most már kirúgja caps lock miatt a usert (legalább
+ %d karakter és ennek %d%%-a nagybetû).
+BOT_KICK_CAPS_ON_BAN
+ Bot most már kirúgja caps lock miatt, (legalább
+ %d karakter és ennek %d%%-a nagybetû), kitiltja
+ %d kirúgás után a usert.
+BOT_KICK_CAPS_OFF
+ Bot nem fog kirúgni caps lock miatt.
+BOT_KICK_COLORS_ON
+ A Bot kirúgja szines írás miatt a usert.
+BOT_KICK_COLORS_ON_BAN
+ A Bot kirúgja szines írás miatt, és kitiltja
+ %d kirúgás után a usert.
+BOT_KICK_COLORS_OFF
+ Bot nem fog kirúgni szines írás miatt.
+BOT_KICK_FLOOD_ON
+ Bot kirúgja flood miatt a usert. (%d sor %d mp alatt)
+BOT_KICK_FLOOD_ON_BAN
+ A Bot kirúgja flood miatt (%d sor %d mp alatt),
+ és kitiltja %d kirúgás után a usert.
+BOT_KICK_FLOOD_OFF
+ A Bot nem fog kirúgni flood miatt.
+BOT_KICK_REPEAT_ON
+ A Bot kirúgja ismétlés miatt a usert (ha %d alkalommal
+ ismétli ugyanazt a sort).
+BOT_KICK_REPEAT_ON_BAN
+ A Bot kirúgja ismétlés miatt (ha %d alkalommal ismétli
+ ugyanazt a sort), és kitiltja %d kirúgás után a usert.
+BOT_KICK_REPEAT_OFF
+ A Bot nem fog kirúgni ismétlés miatt.
+BOT_KICK_REVERSES_ON
+ A Bot kirúg fordított írás miatt.
+BOT_KICK_REVERSES_ON_BAN
+ A Bot kirúgja fordított írás miatt, és kitiltja %d
+ kirúgás után a usert.
+BOT_KICK_REVERSES_OFF
+ A Bot nem fog rúgni fordított írás miatt.
+BOT_KICK_UNDERLINES_ON
+ A Bot kirúgja aláhúzásos írás miatt a usert.
+BOT_KICK_UNDERLINES_ON_BAN
+ A Bot kirúgja aláhúzásos írás miatt, és kitiltja
+ %d kirúgás után a usert.
+BOT_KICK_UNDERLINES_OFF
+ Bot nem fog kirúgni aláhúzásos írás miatt.
+
+# BADWORDS üzenetek
+BOT_BADWORDS_SYNTAX
+ BADWORDS #szoba{ADD|DEL|LIST|CLEAR}[szó|sorszám]
+ [SINGLE|START|END]
+BOT_BADWORDS_DISABLED
+ Csatornán tiltott szaval listájának változtatása letiltva.
+BOT_BADWORDS_REACHED_LIMIT
+ Csak %d tiltott szó lehet a csatornán.
+BOT_BADWORDS_ALREADY_EXISTS
+ A %s szót már tartalmazza a %s tiltott szavak listája
+BOT_BADWORDS_ADDED
+ A %s szó hozzáadva a %s tiltott szavak listájához.
+BOT_BADWORDS_NO_SUCH_ENTRY
+ Nincs (#%d) ilyen szó a %s tiltott szavak listáján.
+BOT_BADWORDS_NOT_FOUND
+ A %s szó nem található a %s tiltott szavak listáján.
+BOT_BADWORDS_NO_MATCH
+ Nincs ilyen szó %s a tiltott szavak listáján.
+BOT_BADWORDS_DELETED
+ A %s szó törölve %s tiltott szavak listájából.
+BOT_BADWORDS_DELETED_ONE
+ Törölve 1 bejegyzés %s tiltott szavak listájáról.
+BOT_BADWORDS_DELETED_SEVERAL
+ Törölve %d bejegyzés %s tiltott szavak listájáról.
+BOT_BADWORDS_LIST_EMPTY
+ %s tiltott szavak listája üres.
+BOT_BADWORDS_LIST_HEADER
+ %s tiltott szavak listája:
+ Szám szó tipus
+BOT_BADWORDS_LIST_FORMAT
+ %3d %-30s %s
+BOT_BADWORDS_CLEAR
+ Tiltott szó lista üres.
+
+# SAY válaszok
+BOT_SAY_SYNTAX
+ SAY #szoba szöveg
+
+# ACT válaszok
+BOT_ACT_SYNTAX
+ ACT #szoba szöveg
+
+# Hibák
+BOT_EXCEPT
+ Fehasználó társítása szobával kivétel.
+BOT_BAD_NICK
+ Bot Nick csak érvényes karaktereket tartalmazhat.
+BOT_BAD_HOST
+ Bot Hoszt csak érvényes karaktereket tartalmazhat.
+BOT_BAD_IDENT
+ Bot Ident csak érvényes karaktereket tartalmazhat.
+BOT_LONG_IDENT
+ Bot Idents may only contain %d characters.
+BOT_LONG_HOST
+ Bot Hosts may only contain %d characters.
+
+###########################################################
+#
+# OperServ üzenetek
+#
+###########################################################
+
+# Általános üzenetek
+OPER_BOUNCY_MODES
+ Szervíz nem tudja változtatni a módokat.
+ A szervereid jól vannak beállítva?
+OPER_BOUNCY_MODES_U_LINE
+ Szervíz nem tudja változtatni a módokat.
+ A szerverek U:lines beállitása helyes?
+
+# GLOBAL válaszok
+OPER_GLOBAL_SYNTAX
+ GLOBAL üzenet
+
+# STATS válaszok
+OPER_STATS_UNKNOWN_OPTION
+ Ismeretlen STATS opció: %s.
+OPER_STATS_CURRENT_USERS
+ Aktuális felhasználók: %d (%d op)
+OPER_STATS_MAX_USERS
+ Legtöbb felhasználó: %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
+ Szervíz fent van %d nap, %02d:%02d
+OPER_STATS_UPTIME_1DHMS
+ Szervíz fent van %d nap, %02d:%02d
+OPER_STATS_UPTIME_HMS
+ Szervíz fent van %d óra, %d perce
+OPER_STATS_UPTIME_HM1S
+ Szervíz fent van %d óra, %d perce
+OPER_STATS_UPTIME_H1MS
+ Szervíz fent van %d óra, %d perce
+OPER_STATS_UPTIME_H1M1S
+ Szervíz fent van %d óra, %d perce
+OPER_STATS_UPTIME_1HMS
+ Szervíz fent van %d óra, %d perce
+OPER_STATS_UPTIME_1HM1S
+ Szervíz fent van %d óra, %d perce
+OPER_STATS_UPTIME_1H1MS
+ Szervíz fent van %d óra, %d perce
+OPER_STATS_UPTIME_1H1M1S
+ Szervíz fent van %d óra, %d perce
+OPER_STATS_UPTIME_MS
+ Szervíz fent van %d perc, %d másodperce.
+OPER_STATS_UPTIME_M1S
+ Szervíz fent van %d perc, %d másodperce.
+OPER_STATS_UPTIME_1MS
+ Szervíz fent van %d perc, %d másodperce.
+OPER_STATS_UPTIME_1M1S
+ Szervíz fent van %d perc, %d másodperce.
+OPER_STATS_BYTES_READ
+ Olvasott Byteok : %5d kB
+OPER_STATS_BYTES_WRITTEN
+ Írott Byteok : %5d kB
+OPER_STATS_USER_MEM
+ Felhasználó : %6d bejegyzés, %5d kB
+OPER_STATS_CHANNEL_MEM
+ Szoba : %6d bejegyzés, %5d kB
+OPER_STATS_GROUPS_MEM
+ NS Csoport : %6d bejegyzés, %5d kB
+OPER_STATS_ALIASES_MEM
+ NS Aliases : %6d bejegyzés, %5d kB
+OPER_STATS_CHANSERV_MEM
+ ChanServ : %6d bejegyzés, %5d kB
+OPER_STATS_BOTSERV_MEM
+ BotServ : %6d bejegyzés, %5d kB
+OPER_STATS_HOSTSERV_MEM
+ HostServ : %6d records, %5d kB
+OPER_STATS_OPERSERV_MEM
+ OperServ : %6d bejegyzés, %5d kB
+OPER_STATS_SESSIONS_MEM
+ Session : %6d bejegyzés, %5d kB
+OPER_STATS_AKILL_COUNT
+ Aktuális AKILLek száma: %d
+OPER_STATS_AKILL_EXPIRE_DAYS
+ Alap AKILL lejárati idõ: %d nap
+OPER_STATS_AKILL_EXPIRE_DAY
+ Alap AKILL lejárati idõ: 1 nap
+OPER_STATS_AKILL_EXPIRE_HOURS
+ Alap AKILL lejárati idõ: %d óra
+OPER_STATS_AKILL_EXPIRE_HOUR
+ Alap AKILL lejárati idõ: 1 óra
+OPER_STATS_AKILL_EXPIRE_MINS
+ Alap AKILL lejárati idõ: %d perc
+OPER_STATS_AKILL_EXPIRE_MIN
+ Alap AKILL lejárati idõ: 1 perc
+OPER_STATS_AKILL_EXPIRE_NONE
+ Alap AKILL lejárati idõ: Nem elévülõ
+OPER_STATS_SGLINE_COUNT
+ Aktuális SGLINEok száma: %d
+OPER_STATS_SGLINE_EXPIRE_DAYS
+ Alap SGLINE lejárati idõ: %d nap
+OPER_STATS_SGLINE_EXPIRE_DAY
+ Alap SGLINE lejárati idõ: 1 nap
+OPER_STATS_SGLINE_EXPIRE_HOURS
+ Alap SGLINE lejárati idõ: %d óra
+OPER_STATS_SGLINE_EXPIRE_HOUR
+ Alap SGLINE lejárati idõ: 1 óra
+OPER_STATS_SGLINE_EXPIRE_MINS
+ Alap SGLINE lejárati idõ: %d perc
+OPER_STATS_SGLINE_EXPIRE_MIN
+ Alap SGLINE lejárati idõ: 1 perc
+OPER_STATS_SGLINE_EXPIRE_NONE
+ Alap SGLINE lejárati ido: Nem elévülõ
+OPER_STATS_SQLINE_COUNT
+ Aktuális SQLINEok száma : %d
+OPER_STATS_SQLINE_EXPIRE_DAYS
+ Alap SQLINE lejárati idõ: %d nap
+OPER_STATS_SQLINE_EXPIRE_DAY
+ Alap SQLINE lejárati idõ: 1 nap
+OPER_STATS_SQLINE_EXPIRE_HOURS
+ Alap SQLINE lejárati idõ: %d óra
+OPER_STATS_SQLINE_EXPIRE_HOUR
+ Alap SQLINE lejárati idõ: 1 óra
+OPER_STATS_SQLINE_EXPIRE_MINS
+ Alap SQLINE lejárati idõ: %d perc
+OPER_STATS_SQLINE_EXPIRE_MIN
+ Alap SQLINE lejárati idõ: 1 perc
+OPER_STATS_SQLINE_EXPIRE_NONE
+ Alap SQLINE lejárati idõ Nem elévülõ
+OPER_STATS_SZLINE_COUNT
+ Aktuális SZLINEok száma: %d
+OPER_STATS_SZLINE_EXPIRE_DAYS
+ Alap SZLINE lejárati idõ: %d nap
+OPER_STATS_SZLINE_EXPIRE_DAY
+ Alap SZLINE lejárati idõ: 1 nap
+OPER_STATS_SZLINE_EXPIRE_HOURS
+ Alap SZLINE lejárati idõ: %d óra
+OPER_STATS_SZLINE_EXPIRE_HOUR
+ Alap SZLINE lejárati idõ: 1 óra
+OPER_STATS_SZLINE_EXPIRE_MINS
+ Alap SZLINE lejárati idõ: %d perc
+OPER_STATS_SZLINE_EXPIRE_MIN
+ Alap SZLINE lejárati idõ: 1 perc
+OPER_STATS_SZLINE_EXPIRE_NONE
+ Alap SZLINE lejárati idõ: Nem elévülõ
+OPER_STATS_RESET
+ Statisztika nullázva.
+
+# MODE válaszok
+OPER_STATS_UPLINK_SERVER
+ Uplink server: %s
+OPER_STATS_UPLINK_CAPAB
+ Uplink capab: %s
+OPER_STATS_UPLINK_SERVER_COUNT
+ Servers found: %d
+
+# MODE responses
+OPER_MODE_SYNTAX
+ MODE szoba mód
+
+# UMODE reagálások
+OPER_UMODE_SYNTAX
+ UMODE nick mód
+OPER_UMODE_SUCCESS
+ %s usermódjai megváltoztatva.
+OPER_UMODE_CHANGED
+ %s váltóztatott a módodon.
+
+# OLINE válaszok
+OPER_OLINE_SYNTAX
+ OLINE nick flagek
+OPER_OLINE_SUCCESS
+ %s operflagek megadva a %s nicknek.
+OPER_OLINE_IRCOP
+ Most már IRC Operátor vagy!
+
+# CLEARMODES válaszok
+OPER_CLEARMODES_SYNTAX
+ CLEARMODES #szoba [ALL]
+OPER_CLEARMODES_DONE
+ Bináris módok és kitiltások törölve a %s csatornáról.
+OPER_CLEARMODES_ALL_DONE
+ Összes mód törölve a %s csatornáról.
+
+# KICK válaszok
+OPER_KICK_SYNTAX
+ KICK #szoba user indok
+
+# SVSNICK válaszok
+OPER_SVSNICK_SYNTAX
+ SVSNICK nick újnick
+OPER_SVSNICK_NEWNICK
+ A nicked %s meg lett változtatva erre: %s.
+
+# ADMIN válaszok
+OPER_ADMIN_SYNTAX
+ ADMIN {ADD|DEL|LIST|CLEAR} [nick | bejegyzések]
+OPER_ADMIN_SKELETON
+ Szervíz most skeleton módban fut, az ADMIN parancs nem elérhetõ
+OPER_ADMIN_EXISTS
+ %s már szerepel a szervíz admin litában.
+OPER_ADMIN_REACHED_LIMIT
+ Csak %d szervíz admin lehet a listán.
+OPER_ADMIN_ADDED
+ %s hozzáadva szervíz admin listához.
+OPER_ADMIN_NOT_FOUND
+ %s nem található szervíz admin listán.
+OPER_ADMIN_NO_MATCH
+ Nincs ilyen a szervíz admin listán.
+OPER_ADMIN_DELETED
+ %s törölve a szervíz admin listáról.
+OPER_ADMIN_DELETED_ONE
+ Töröltve 1 bejegyzés a szervíz admin listáról.
+OPER_ADMIN_DELETED_SEVERAL
+ Töröltve %d bejegyzés a szervíz admin listáról.
+OPER_ADMIN_LIST_EMPTY
+ Szervíz admin lista üres.
+OPER_ADMIN_LIST_HEADER
+ Szerviz admin lista:
+ Szám Nick
+OPER_ADMIN_LIST_FORMAT
+ %3d %s
+OPER_ADMIN_CLEAR
+ Szervíz admin lista törölve.
+OPER_ADMIN_MOVED
+ %s has been moved to Services Administrators list.
+
+# OPER válaszok
+OPER_OPER_SYNTAX
+ OPER {ADD|DEL|LIST|CLEAR} [nick | bejegyzések]
+OPER_OPER_SKELETON
+ Szervíz most skeleton módban fut, az OPER parancs nem elérhetõ.
+OPER_OPER_EXISTS
+ %s már szerepel a szervíz operátor listán.
+OPER_OPER_REACHED_LIMIT
+ Csak %d szervíz operátor lehet a listán.
+OPER_OPER_ADDED
+ %s hozzáadva a szervíz operátor listához.
+OPER_OPER_NOT_FOUND
+ %s nem található a szervíz operátor listán.
+OPER_OPER_NO_MATCH
+ Nincs ilyen bejegyzés a szervíz operátor listán.
+OPER_OPER_DELETED
+ %s törölve szervíz operátor listáról.
+OPER_OPER_DELETED_ONE
+ Törölve 1 bejegyzés a szervíz operátor listáról.
+OPER_OPER_DELETED_SEVERAL
+ Törölve %d bejegyzés a szervíz operátor listától.
+OPER_OPER_LIST_EMPTY
+ Szervíz operátor lista üres.
+OPER_OPER_LIST_HEADER
+ Szervíz operátor lista:
+ Szám Nick
+OPER_OPER_LIST_FORMAT
+ %3d %s
+OPER_OPER_CLEAR
+ Szervíz operátor lista törölve.
+OPER_OPER_MOVED
+ %s has been moved to Services Operators list.
+
+# AKILL válaszok
+OPER_AKILL_SYNTAX
+ AKILL {ADD | DEL | LIST | VIEW | CLEAR} [[+lejárat] {maszk | sorszám} [indok]]
+OPER_AKILL_EXISTS
+ %s már bekapcsolva az AKILL lista.
+OPER_AKILL_ALREADY_COVERED
+ %s van már %s ilyen bejegyzés.
+OPER_AKILL_REACHED_LIMIT
+ Te csak %d AKILL-t jegyezhetsz.
+OPER_AKILL_NO_NICK
+ Emlékeztetõ: AKILL maszk nem tartalmazhat nicknevet;
+ ellenõrizd, hogy nem tartalmazhat nick részt a maszk.
+OPER_AKILL_ADDED
+ %s hozzáadva az AKILL listához.
+OPER_AKILL_CHANGED
+ Lejárati idõ megváltozott: %s.
+OPER_AKILL_NOT_FOUND
+ %s nem található az AKILL listán.
+OPER_AKILL_NO_MATCH
+ Nincs ilyen bejegyzés az AKILL listán.
+OPER_AKILL_DELETED
+ %s törölve az AKILL listáról.
+OPER_AKILL_DELETED_ONE
+ Törölve 1 bejegyzés az AKILL listáról.
+OPER_AKILL_DELETED_SEVERAL
+ Törölve %d bejegyzés az AKILL listáról.
+OPER_AKILL_LIST_EMPTY
+ AKILL lista üres.
+OPER_AKILL_LIST_HEADER
+ Aktuális AKILL lista:
+ Szám Maszk Indok
+OPER_AKILL_LIST_FORMAT
+ %3d %-32s %s
+OPER_AKILL_VIEW_HEADER
+ Aktuális AKILL lista:
+# szám, mask, set-by, set-idõ, lejárat, indok
+OPER_AKILL_VIEW_FORMAT
+ %3d %s (by %s on %s; %s)
+ %s
+OPER_AKILL_CLEAR
+ Az AKILL lista törölve.
+OPER_CHANKILL_SYNTAX
+ CHANKILL [+lejárat] {#szoba} [indok]
+
+# SGLINE válaszok
+OPER_SGLINE_SYNTAX
+ SGLINE {ADD | DEL | LIST | VIEW | CLEAR} [[ +lejárat] {maszk| sorszám }[:Indok]]
+OPER_SGLINE_UNSUPPORTED
+ SGLINE nem használható ezen a hálózaton.
+OPER_SGLINE_EXISTS
+ %s már szerepel az SGLINE listán.
+OPER_SGLINE_ALREADY_COVERED
+ %s társítva van %s által.
+OPER_SGLINE_REACHED_LIMIT
+ Te csak %d számú SGLINE-t jegyezhetsz.
+OPER_SGLINE_ADDED
+ %s hozzáadva a SGLINE listához.
+OPER_SGLINE_CHANGED
+ Lejárati idõ megváltozott: %s .
+OPER_SGLINE_NOT_FOUND
+ %s nincs a SGLINE listán.
+OPER_SGLINE_NO_MATCH
+ Nincs ilyen bejegyzés az SGLINE listán.
+OPER_SGLINE_DELETED
+ %s törölve az SGLINE listáról.
+OPER_SGLINE_DELETED_ONE
+ Törölve 1 bejegyzés a SGLINE listáról.
+OPER_SGLINE_DELETED_SEVERAL
+ Törölve %d bejegyzés a SGLINE listáról.
+OPER_SGLINE_LIST_EMPTY
+ SGLINE lista üres.
+OPER_SGLINE_LIST_HEADER
+ Aktuális SGLINE lista:
+ Szám Maszk Indok
+OPER_SGLINE_LIST_FORMAT
+ %3d %-32s %s
+OPER_SGLINE_VIEW_HEADER
+ Aktuális SGLINE lista:
+# szám, mask, set-by, set-idõ, lejárat, indok
+OPER_SGLINE_VIEW_FORMAT
+ %3d %s (%s által, ekkor: %s; %s)
+ %s
+OPER_SGLINE_CLEAR
+ Az SGLINE lista törölve.
+
+# SQLINE válaszok
+OPER_SQLINE_SYNTAX
+ SQLINE {ADD|DEL|LIST|VIEW|CLEAR}[ [ +lejárat ] { maszk | sorszám }[ indok ]]
+OPER_SQLINE_CHANNELS_UNSUPPORTED
+ Szoba SQLINE-ok nem támogatottak ezen az IRCd-n,ezért
+ nem tudod használni.
+OPER_SQLINE_EXISTS
+ %s már szerpel az SQLINE listán.
+OPER_SQLINE_ALREADY_COVERED
+ %s társítva van %s által.
+OPER_SQLINE_REACHED_LIMIT
+ Te csak %d SQLINE-t jegyezhetsz.
+OPER_SQLINE_ADDED
+ %s hozzáadva az SQLINE listához.
+OPER_SQLINE_CHANGED
+ Lejárati idõ %s megválzott.
+OPER_SQLINE_NOT_FOUND
+ %s nnem található az SQLINE listán.
+OPER_SQLINE_NO_MATCH
+ Nincs ilyen bejegyzés az SQLINE listán.
+OPER_SQLINE_DELETED
+ %s törölve az SQLINE listáról.
+OPER_SQLINE_DELETED_ONE
+ Törölve 1 bejegyzés az SQLINE listáról.
+OPER_SQLINE_DELETED_SEVERAL
+ Törölve %d bejegyzés az SQLINE listáról.
+OPER_SQLINE_LIST_EMPTY
+ SQLINE lista üres.
+OPER_SQLINE_LIST_HEADER
+ Aktuális SQLINE lista:
+ Szám Mask Indok
+OPER_SQLINE_LIST_FORMAT
+ %3d %-32s %s
+OPER_SQLINE_VIEW_HEADER
+ Aktuális SQLINE lista:
+# Szám, mask, set-by, set-Idõ, lejárat, indok
+OPER_SQLINE_VIEW_FORMAT
+ %3d %s (%s által, ekkor: %s; %s)
+ %s
+OPER_SQLINE_CLEAR
+ Az SQLINE lista törölve.
+
+# SZLINE válaszok
+OPER_SZLINE_SYNTAX
+ SZLINE {ADD | DEL | LIST | VIEW | CLEAR }[[ +lejárat ] { maszk | sorszám } [ indok ]]
+OPER_SZLINE_UNSUPPORTED
+ SZLINE nem használható ezen a hálózaton.
+OPER_SZLINE_EXISTS
+ %s már szerepel az SZLINE listán.
+OPER_SZLINE_ALREADY_COVERED
+ %s társítva %s által.
+OPER_SZLINE_REACHED_LIMIT
+ Te csak %d SZLINE-t jegyezhetsz.
+OPER_SZLINE_ONLY_IPS
+ Emlékeztetõ:Te hozzáadhatsz IP maszkot SZLINE listához.
+OPER_SZLINE_ADDED
+ %s hozzáadva az SZLINE listához.
+OPER_SZLINE_CHANGED
+ Lejárati idõ megváltozott: %s.
+OPER_SZLINE_NOT_FOUND
+ %s nem található az SZLINE listán.
+OPER_SZLINE_NO_MATCH
+ Nincs ilyen bejegyzés az SZLINE listán.
+OPER_SZLINE_DELETED
+ %s törölve az SZLINE listáról.
+OPER_SZLINE_DELETED_ONE
+ Törölve 1 bejegyzés az SZLINE listáról.
+OPER_SZLINE_DELETED_SEVERAL
+ Törölve %d bejegyzés az SZLINE listáról.
+OPER_SZLINE_LIST_EMPTY
+ SZLINE lista üres.
+OPER_SZLINE_LIST_HEADER
+ Aktuális SZLINE lista:
+ Szám Mask Indok
+OPER_SZLINE_LIST_FORMAT
+ %3d %-32s %s
+OPER_SZLINE_VIEW_HEADER
+ Aktuális SZLINE lista:
+# Sszám, maszk, set-by, set-idõ, lejárat,Indok
+OPER_SZLINE_VIEW_FORMAT
+ %3d %s (%s által, ekkor: %s; %s)
+ %s
+OPER_SZLINE_CLEAR
+ Az SZLINE lista törölve
+
+# SET válaszok
+OPER_SET_SYNTAX
+ SET opció beállítás
+OPER_SET_IGNORE_ON
+ Mellõzés kód lessz használva.
+OPER_SET_IGNORE_OFF
+ Mellõzés kód nem lessz használva.
+OPER_SET_IGNORE_ERROR
+ Mellõzés beállitásnak kell lenni ON vagy OFF.
+OPER_SET_READONLY_ON
+ Szervíz most  csak olvas módban.
+OPER_SET_READONLY_OFF
+ Szervíz most olvas ír módban.
+OPER_SET_READONLY_ERROR
+ READONLY beállitáshoz kell lenni ON vagy OFF.
+OPER_SET_LOGCHAN_ON
+ Szervíz most kiegészíti log üzeneteket %s -hoz.
+OPER_SET_LOGCHAN_OFF
+ A Szervíz nem írja ki a napló üzeneteket a csatornára.
+OPER_SET_LOGCHAN_ERROR
+ LOGCHAN beállításához kell ONvagy OFFés
+ LogCsatornát kell beállítani.
+OPER_SET_DEBUG_ON
+ Szervíz most debug módban fut.
+OPER_SET_DEBUG_OFF
+ Szervíz most már nem fut debug módban.
+OPER_SET_DEBUG_LEVEL
+ Szervíz most debug módban (szint: %d).
+OPER_SET_DEBUG_ERROR
+ A DEBUG beállításhoz kell ON,/OFF,/ pozitív szám.
+OPER_SET_NOEXPIRE_ON
+ Szervíz nem elévülõ módban van.
+OPER_SET_NOEXPIRE_OFF
+ Szervíz elévülõ módban van.
+OPER_SET_NOEXPIRE_ERROR
+ Az NOEXPIRE beállításhoz kell ON vagy OFF.
+OPER_SET_UNKNOWN_OPTION
+ Ismeretlen beállítás %s.
+OPER_SET_SQL_ON
+ SQL code will be used.
+OPER_SET_SQL_OFF
+ SQL code will not be used.
+OPER_SET_SQL_ERROR
+ Setting for SQL must be ON or OFF.
+OPER_SET_SQL_ERROR_INIT
+ Error during init of SQL, check your logs to correct.
+OPER_SET_SQL_ERROR_DISABLED
+ SQL is not configured for this network. Please edit the
+ configuration file (services.conf).
+OPER_SET_LIST_OPTION_ON
+ %s is enable
+OPER_SET_LIST_OPTION_OFF
+ %s is disabled
+
+# NOOP válaszok
+OPER_NOOP_SYNTAX
+ NOOP {SET|REVOKE} szerver
+OPER_NOOP_SET
+ Összes O:lines %s módosítva.
+OPER_NOOP_REVOKE
+ Összes O:lines %s újra aktív.
+
+# JUPE válaszok
+OPER_JUPE_SYNTAX
+ JUPE szervernév [leírás]
+OPER_JUPE_HOST_ERROR
+ Kérlek használj érvényes szerver nevet amikor jupolsz!
+
+# RAW válaszok
+OPER_RAW_SYNTAX
+ RAW text
+
+# UPDATE válaszok
+OPER_UPDATING
+ Adatbázis mentve.
+
+# RELOAD válaszok
+OPER_RELOAD
+ Szervíz konfigurációs fájl újratöltve.
+
+# RESTART válaszok
+OPER_CANNOT_RESTART
+ SERVICES_BIN nincs meghatározva; nem tud újraindulni.
+ Térj vissza a \2configure\2 scripthez és kez újra a forgatást.
+ Szervízhez engedélyezd a RESTART parancsot.
+
+# IGNORE válaszok
+OPER_IGNORE_SYNTAX
+ Syntax: IGNORE {ADD|DEL|LIST|CLEAR} [idõ] [nick | mask]
+OPER_IGNORE_VALID_TIME
+ Használj érvényes számot idõnek.
+ (Adj meg érvényes számot az idõhöz.)
+OPER_IGNORE_TIME_DONE
+ %s nick most mellõzte %s nicket.
+OPER_IGNORE_PERM_DONE
+ %s nick most véglegesen mellõzve van.
+OPER_IGNORE_DEL_DONE
+ %s nick most már nics mellõzve.
+OPER_IGNORE_LIST
+ Szervíz mellõzés lista:
+OPER_IGNORE_LIST_NOMATCH
+ %s nick nem található a mellõzöttek listáján.
+OPER_IGNORE_LIST_EMPTY
+ Mellõzöttek lista üres.
+OPER_IGNORE_LIST_CLEARED
+ Mellõzöttek lista törölve.
+
+# KILLCLONES válaszok
+OPER_KILLCLONES_SYNTAX
+ KILLCLONES nick
+OPER_KILLCLONES_UNKNOWN_NICK
+ Nem talált ilyen felhasználót %s.
+
+# CHANLIST válaszok
+OPER_CHANLIST_HEADER
+ Szoba lista:
+ Név User Mód Topic
+OPER_CHANLIST_HEADER_USER
+ %s szoba listája:
+ Név User Mód Topic
+OPER_CHANLIST_RECORD
+ %-20s %4d +%-6s %s
+OPER_CHANLIST_END
+ Vége a szoba listának.
+
+# USERLIST válaszok
+OPER_USERLIST_HEADER
+ Felhasználó lista:
+ Nick Maszk
+OPER_USERLIST_HEADER_CHAN
+ %s felhasználó lista:
+ Nick Maszk
+OPER_USERLIST_RECORD
+ %-20s %s@%s
+OPER_USERLIST_END
+ Vége a felhasználó listának.
+
+# CACHE válaszok
+OPER_SUPER_ADMIN_ON
+ Most már Szuper-Admin vagy
+OPER_SUPER_ADMIN_OFF
+ Te nem vagy már Szuper-Admin
+OPER_SUPER_ADMIN_SYNTAX
+ SET SuperAdmin ON vagy OFF
+ (engedélyezni kell a services.conf-ban)
+OPER_SUPER_ADMIN_WALL_ON
+ %s most már Szuper-Admin
+OPER_SUPER_ADMIN_WALL_OFF
+ %s már nem Szuper-Admin
+OPER_SUPER_ADMIN_ONLY
+ Csak Szuper-Admin használhatja a parancsot.
+OPER_STAFF_LIST_HEADER
+ On Szint Nick
+OPER_STAFF_FORMAT
+ %c %s %s
+OPER_STAFF_AFORMAT
+ %c %s %s [%s]
+
+# DefCon Üzenet
+
+OPER_DEFCON_SYNTAX
+ Syntax: DEFCON [1|2|3|4|5]
+OPER_DEFCON_DENIED
+ Szervíz Defcon módban fut, próbáld késõbb.
+OPER_DEFCON_NO_CONF
+ A Defcon rendszert engedélyezni kell a services.conf-ban
+OPER_DEFCON_CHANGED
+ Szervíz új DEFCON szintje %d
+OPER_DEFCON_WALL
+ %s módosította DEFCON a szintet erre: %d
+DEFCON_GLOBAL
+ A Defcon szint most: %d
+
+# Module szólánc
+OPER_MODULE_LOADED
+ %s modul betöltve
+OPER_MODULE_UNLOADED
+ %s modul kitöltve
+OPER_MODULE_LOAD_FAIL
+ Nem sikerült a betölteni a %s modult
+OPER_MODULE_REMOVE_FAIL
+ Nem sikerült eltávolítani a %s modult
+OPER_MODULE_NO_UNLOAD
+ This module can not be unloaded.
+OPER_MODULE_LOAD_SYNTAX
+ MODLOAD Fájlnév
+OPER_MODULE_UNLOAD_SYNTAX
+ MODUNLOAD Fájlnév
+OPER_MODULE_LIST_HEADER
+ Jelenlegi Modul lista:
+OPER_MODULE_LIST
+ Modul: %s [%s] [%s]
+OPER_MODULE_LIST_FOOTER
+ %d Modul betöltve.
+OPER_MODULE_INFO_LIST
+ Modul: %s Verzió: %s Szerzõ: %s Betöltve: %s
+OPER_MODULE_CMD_LIST
+ Modul parancsai: %R%s %s
+OPER_MODULE_MSG_LIST
+ IRCD kezelés: %s
+OPER_MODULE_NO_LIST
+ Jelenleg nincs modul betöltve.
+OPER_MODULE_NO_INFO
+ Nincs elérhetõ információ a %s modulról
+OPER_MODULE_INFO_SYNTAX
+ MODINFO Fájlnév
+MODULE_HELP_HEADER
+ A következõ parancsokat a modulok tartalmazzák:
+
+###########################################################
+#
+# Session korlátozás és kivétel üzenetek
+#
+###########################################################
+
+# EXCEPTION válaszok
+OPER_EXCEPTION_SYNTAX
+ EXCEPTION {ADD | DEL | MOVE | LIST | VIEW} [paraméterek]
+OPER_EXCEPTION_ADD_SYNTAX
+ EXCEPTION ADD [+elévülés] maszk korlát indok
+OPER_EXCEPTION_DEL_SYNTAX
+ EXCEPTION DEL {maszk | list}
+OPER_EXCEPTION_MOVE_SYNTAX
+ EXCEPTION MOVE Szám helyzet
+OPER_EXCEPTION_DISABLED
+ Session korlátozás tiltva.
+OPER_EXCEPTION_ALREADY_PRESENT
+ Maszk %s már szerepel a kivétel listán.
+OPER_EXCEPTION_TOO_MANY
+ Session-korlát lista megtelt!
+OPER_EXCEPTION_ADDED
+ Session korlát %s részére %d-re állítva.
+OPER_EXCEPTION_MOVED
+ %s kivétel (#%d) áthelyezve a %d pozicíóba.
+OPER_EXCEPTION_NO_SUCH_ENTRY
+ Nincs bejegyezve (#%d) session-korlát a kivétel listán.
+OPER_EXCEPTION_NOT_FOUND
+ %s nem található a session-korlát kivétel listán.
+OPER_EXCEPTION_NO_MATCH
+ Nincs ilyen bejegyzés a session-korlát kivétel listán.
+OPER_EXCEPTION_DELETED
+ %s törölve a session-korlát kivétel listáról.
+OPER_EXCEPTION_DELETED_ONE
+ Törölve 1 bejegyzés a session-korlát kivétel listáról.
+OPER_EXCEPTION_DELETED_SEVERAL
+ Törölve %d bejegyzés a session-korlát kivétel listáról.
+OPER_EXCEPTION_LIST_HEADER
+ Aktuális Session korlát kivétel lista:
+# mask, korlát
+OPER_EXCEPTION_LIST_FORMAT
+ %3d %4d %s
+OPER_EXCEPTION_LIST_COLHEAD
+ Szám Korlát Host
+# maszk, set-by, set-idõ,lejárat, korlát, Indok
+OPER_EXCEPTION_VIEW_FORMAT
+ %3d. %s (%s által, ekkor: %s; %s)
+ Korlát: %-4d - %s
+OPER_EXCEPTION_INVALID_LIMIT
+ Érvénytelen session korlát. Érvényes számnak kell lennie
+ és nagyobbnak vagy egyenlõnek mint zéró és kissebbnek
+ mint %d.
+OPER_EXCEPTION_INVALID_HOSTMASK
+ Érvénytelen hosztmaszk. Csak érvényes hosztmaszk lehet,
+ a kivétel nem lehet nick vagy usernév.
+OPER_EXCEPTION_EXISTS
+ %s already exists on the EXCEPTION list.
+OPER_EXCEPTION_CHANGED
+ Exception for %s has been updated to %d.
+
+# SESSION válaszok
+OPER_SESSION_SYNTAX
+ SESSION {LIST korlát | VIEW hoszt}
+OPER_SESSION_LIST_SYNTAX
+ SESSION LIST korlát
+OPER_SESSION_VIEW_SYNTAX
+ SESSION VIEW hoszt
+OPER_SESSION_DISABLED
+ Session korlátozás tiltva.
+OPER_SESSION_INVALID_THRESHOLD
+ Érvénytelen küszöb érték. 1-nél nagyobb egész számnak
+ kell lennie.
+OPER_SESSION_NOT_FOUND
+ %s nincs a session listán.
+OPER_SESSION_LIST_HEADER
+ Hosztok legalább %d sessionnel:
+OPER_SESSION_LIST_COLHEAD
+ Sessions Host
+# korlát, hoszt
+OPER_SESSION_LIST_FORMAT
+ %6d %s
+# hoszt, sessions, korlát
+OPER_SESSION_VIEW_FORMAT
+ A %s hoszt aktuálisan %d sessiont használ, a határértéke %d.
+
+# EXCEPTION help
+OPER_HELP_EXCEPTION
+ Syntax: EXCEPTION ADD [+lejárat] maszkkorlátindok
+ EXCEPTION DEL {maszk| list}
+ EXCEPTION MOVE szám helyzet
+ EXCEPTION LIST [maszk | lista]
+ EXCEPTION VIEW [maszk | lista]
+
+ Lehetõséget nyújt a szervíz adminnak, hogy karbantartsák
+ azon hostok listáját, amelyeknek korlátozásuk van,
+ engedélyezve bizonyos gépeket,úgymint a shell szervereket,
+ hogy egyidõben felvigyenek klienseket alapértelmezettnél
+ nagyobb számban. Amennyiben a gép eléri a korlátot, minden
+ csatlakozni próbáló kliens killelve lesz.Mielõtt a kill
+ megtörténne, figyelmeztetést kapnak %S /NOTICE üzeneten
+ keresztül. Az üzenet tartalma a konfigurációtól függ.
+
+ EXCEPTION ADD hozzáadja a hostmaszkot a kivétellistához.
+ Vedd figyelembe, hogy a nick!user@host és user@host
+ maszkok érvénytelenek! Csak valós hostmaszkok, mint pl.
+ box.host.dom és *.host.dom, megengedettek, a session
+ korlátozásmaszkja nem vesz fel nicknevet/felhasználónevet.
+ A korlátlegyen egy nullával egyenlõ vagy nagyobb szám.
+ Ez határozza meg, hogy hány sessiont vihet magával a host
+ egyidõben. A nulla azt jelenti, hogy a hostnak korlátlan
+ számú sessionja lehet. Lásd az AKILL helpet a részletek
+ felöl a formáról a szükséges lejárati parameterrõl.
+ EXCEPTION DEL Törli a megadott maszkot a kivétel litáról
+ EXCEPTION MOVE módisítja a kivétel poziciószámát. A
+ kivételek fel-le mozgatja, az üres helyekre is.
+ EXCEPTION LIST és EXCEPTION VIEW Mutatja az összes
+ aktuális kivételt; ha megadsz egy tetszõleges maszkot,
+ korlátozza azokat a kivételeket, melyekre ráillik a maszk.
+ A különbség a két parancs között az, hogy az
+ EXCEPTION VIEW sokkal részletesebb, megjeleníti a
+ kivételt felrakó nevét a session korlátot, indokot,
+ hostmaszkot és a lejárati idõt,éa a kivétel legutolsó
+ "használati" idejét.
+
+ Vedd figyelembe, a csatlakozó kliens a ráillõ kivételek
+ közül mindig az elsõt használja. Hatalmas kivétellisták
+ és széleskörû kivételmaszkok csökkenthetik a Szervíz
+ teljesítményét.
+
+ Korlátozva Szervíz adminnak.
+
+OPER_HELP_SESSION
+ Syntax: SESSION LIST threshold
+ SESSION VIEW host
+
+ Megengedi a Szervíz adminoknak, hogy megtekintsék a
+ session listát.
+
+ SESSION LIST kilistázza azokat a hostokat, amelyeknek
+ legalább határértéksessionjuk van. Érték legyen 1-nél
+ nagyobb szám,hogy megelõzze az egy sessionúak kilistázását
+ SESSION VIEWmegjeleníti a host részletes információit,
+ tartalmazva a jelenlegi session számot, session korlátot.
+ A host értéke nem tartalmazhat maszkkaraktereket.
+
+ Lásd az EXCEPTION helpjét további információért a
+ session-korlátozással és azzal kapcsolatban,hogyan állíts
+ be különleges korlátokat bizonyos hostokra és csoportokra.
+
+
+ Korlátozva Szervíz adminoknak.
+
+OPER_HELP_STAFF
+ Syntax: STAFF
+
+ Kijelzi az összes szervíz résztvevõ nickjét, szintjét és
+ on-line helyzetét.
+
+OPER_HELP_DEFCON
+ Syntax: DEFCON [1|2|3|4|5]
+
+ A defcon rendszer képes használni elõre beállított
+ korlátozást a szervíz használatban egy támadás alkalmával
+ a hálózaton.
+
+OPER_HELP_DEFCON_NO_NEW_CHANNELS
+ * Nem lehet új csatornát regisztrálni.
+OPER_HELP_DEFCON_NO_NEW_NICKS
+ * Nem lehet új nicket regisztrálni.
+OPER_HELP_DEFCON_NO_MLOCK_CHANGE
+ * Nincs MLOCK módosítás
+OPER_HELP_DEFCON_FORCE_CHAN_MODES
+ * Beállítja a következõ módokat: (%s) az összes csatornán.
+OPER_HELP_DEFCON_REDUCE_SESSION
+ * Használva a csökkentett session korlát: %d.
+OPER_HELP_DEFCON_NO_NEW_CLIENTS
+ * Killelve lesz minden új felhasználó csatlakozásnál.
+OPER_HELP_DEFCON_OPER_ONLY
+ * Mellõzve minden nem operátortól jövõ üzenet
+OPER_HELP_DEFCON_SILENT_OPER_ONLY
+ * Csendes mellõzés, csak operátorok
+OPER_HELP_DEFCON_AKILL_NEW_CLIENTS
+ * AKILL minden új kliensre csatlakozáskor.
+OPER_HELP_DEFCON_NO_NEW_MEMOS
+ * Nem lehet új memot küldeni
+OPER_HELP_CHANKILL
+ Syntax: CHANKILL [+lejárat] #szobaindok
+
+ Akillre tesz minden nicket az adott csatornán. Ez a létezo
+ és teljesen valós ident@host maszkot használja, minden
+ nick esetében végrehajtja az AKILLt.
+
+###########################################################################
+#
+# Hír rendszer üzenetek
+#
+###########################################################################
+
+NEWS_LOGON_TEXT
+ [Fellépési Hír] - %s %s
+NEWS_OPER_TEXT
+ [Oper Hír] - %s %s
+NEWS_RANDOM_TEXT
+ [Véletlenszerû Hír] - %s %s
+
+NEWS_LOGON_SYNTAX
+ Syntax: LOGONNEWS { ADD | DEL | LIST } [szöveg|szám]
+NEWS_LOGON_LIST_HEADER
+ Fellépési hírek:
+NEWS_LOGON_LIST_ENTRY
+ %5d (%s %s által)
+ %s
+NEWS_LOGON_LIST_NONE
+ Nincs fellépõ üzenet.
+NEWS_LOGON_ADD_SYNTAX
+ Syntax: LOGONNEWS ADD szöveg
+NEWS_LOGON_ADD_FULL
+ A Hírlista tele!
+NEWS_LOGON_ADDED
+ Hozzáadva az új fellépési hír: (#%d).
+NEWS_LOGON_DEL_SYNTAX
+ Syntax: LOGONNEWS DEL {szám | ALL}
+NEWS_LOGON_DEL_NOT_FOUND
+ Logon news tétel #%d nem található!
+NEWS_LOGON_DELETED
+ Logon news tétel #%d törölve.
+NEWS_LOGON_DEL_NONE
+ Nincs törölhetõ fellépési hír!
+NEWS_LOGON_DELETED_ALL
+ Összes fellépési hír tétel törölve.
+
+NEWS_OPER_SYNTAX
+ Syntax: OPERNEWS { ADD | DEL |LIST } [ szöveg | szám ]
+NEWS_OPER_LIST_HEADER
+ Oper hírek listája:
+NEWS_OPER_LIST_ENTRY
+ %5d (%s %s által)
+ %s
+NEWS_OPER_LIST_NONE
+ Nincs oper news.
+NEWS_OPER_ADD_SYNTAX
+ Syntax: OPERNEWS ADD szöveg
+NEWS_OPER_ADD_FULL
+ Az Oper hírek listája tele van!
+NEWS_OPER_ADDED
+ Hozzáadva az új oper hír:(#%d).
+NEWS_OPER_DEL_SYNTAX
+ Syntax: OPERNEWS DEL {szám | ALL}
+NEWS_OPER_DEL_NOT_FOUND
+ Oper news tétel #%d nem található!
+NEWS_OPER_DELETED
+ Oper news tétel #%d törölve.
+NEWS_OPER_DEL_NONE
+ Nincs törölhetõ opernews tétel!
+NEWS_OPER_DELETED_ALL
+ Összes oper hír törölve.
+
+NEWS_RANDOM_SYNTAX
+ Syntax: RANDOMNEWS { ADD | DEL | LIST } [ szöveg | szám ]
+NEWS_RANDOM_LIST_HEADER
+ Véletlenszerû hírek listája:
+NEWS_RANDOM_LIST_ENTRY
+ %5d (%s %s által)
+ %s
+NEWS_RANDOM_LIST_NONE
+ Nincs véletlenszerû hír.
+NEWS_RANDOM_ADD_SYNTAX
+ Syntax: RANDOMNEWS ADD szöveg
+NEWS_RANDOM_ADD_FULL
+ News lista tele!
+NEWS_RANDOM_ADDED
+ Hozzáadva az új random news tétel (#%d).
+NEWS_RANDOM_DEL_SYNTAX
+ Syntax: RANDOMNEWS DEL {szám | ALL}
+NEWS_RANDOM_DEL_NOT_FOUND
+ Random news tétel #%d nem található!
+NEWS_RANDOM_DELETED
+ Random news tétel #%d törölve.
+NEWS_RANDOM_DEL_NONE
+ Nincs törölhetõ random news tétel!
+NEWS_RANDOM_DELETED_ALL
+ Összes random news tétel törölve.
+
+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 %s messages will be
+ sent in order to avoid flooding the user. If there are
+ more news messages, only the most recent will be sent.)
+ NewsCount can be configured in services.conf.
+
+ 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 %s messages will
+ be sent in order to avoid flooding the user. If there are
+ more news messages, only the most recent will be sent.)
+ NewsCount can be configured in services.conf.
+
+ 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 szöveg
+ RANDOMNEWS DEL {sorszám | ALL}
+ RANDOMNEWS LIST
+
+ Szerkeszti és listázza a random news üzeneteket. Amikor
+ egy felhasználó csatlakozik a hálózathoz, egy (csak egy)
+ random newst fog véletlenszerûen elküldeni részére.
+
+ RANDOMNEWS LIST IRC operátorok,használhatják a parancsot
+ részükre listázza az aktuális oper news üzeneteket. Add és
+ Del -t csak szervíz adminok használhatják
+
+###########################################################
+#
+# HelpSzerv segítség üzenetei
+#
+###########################################################
+
+HELP_HELP
+ %S egy szolgáltatás melynek a feladata, hogy eligazítást
+ adjon a Szervízzel kapcsolatos információkban.
+ A következõ témakörök érhetõk el más Services kliensekrõl:
+
+ %R%s HELP
+ A nicknév regisztrációval kapcsolatos információkról.
+
+ %R%s HELP
+ A szoba regisztrációval és karbantartással
+ kapcsolatos információkról
+
+ %R%s HELP
+ Üzenetek küldése offline (regisztrált) usereknek.
+
+HELP_HELP_BOT
+
+ %R%s HELP
+ Szervíz bot felállításához a csatornádra.
+
+HELP_HELP_HOST
+
+ %R%s HELP
+ Vhost igénylésrõl bõvebb információkért.
+
+###########################################################
+#
+# NickServ segítség üzenetei
+#
+###########################################################
+NICK_HELP_CMD_CONFIRM
+ CONFIRM Confirm a nickserv auth code
+NICK_HELP_CMD_RESEND
+ RESEND Resend a nickserv auth code
+
+NICK_HELP_CMD_REGISTER
+ REGISTER Nicknév regisztráció
+NICK_HELP_CMD_GROUP
+ GROUP Csatlakozás egy csoporthoz
+NICK_HELP_CMD_IDENTIFY
+ IDENTIFY Jelszavas azonosítás
+NICK_HELP_CMD_ACCESS
+ ACCESS A hozzáférési lista módosítása
+NICK_HELP_CMD_SET
+ SET Opciók beállítása, például kill védelem
+NICK_HELP_CMD_SASET
+ SASET Set SET-options on another nickname
+NICK_HELP_CMD_DROP
+ DROP Nicknév regisztrációjának törlése
+NICK_HELP_CMD_RECOVER
+ RECOVER Killeli a nickedet használó usert
+NICK_HELP_CMD_RELEASE
+ RELEASE Visszaadja a neved a RECOVER után
+NICK_HELP_CMD_SENDPASS
+ SENDPASS Elfelejtetted a jelszavad? Próbáld ezt
+NICK_HELP_CMD_GHOST
+ GHOST Disconnects a "ghost" IRC session using your nick
+NICK_HELP_CMD_ALIST
+ ALIST List channels you have access on
+NICK_HELP_CMD_GLIST
+ GLIST Lists all nicknames in your group
+NICK_HELP_CMD_INFO
+ INFO Displays information about a given nickname
+NICK_HELP_CMD_LIST
+ LIST List all registered nicknames that match a given pattern
+NICK_HELP_CMD_LOGOUT
+ LOGOUT Reverses the effect of the IDENTIFY command
+NICK_HELP_CMD_STATUS
+ STATUS Returns the owner status of the given nickname
+NICK_HELP_CMD_UPDATE
+ UPDATE Updates your current status, i.e. it checks for new memos
+NICK_HELP_CMD_GETPASS
+ GETPASS Kiirja a jeszavát a nicknévnek
+ (encryption esetén nem használható)
+NICK_HELP_CMD_GETEMAIL
+ GETEMAIL Kiírja az ilyen e-mail címmel regisztrált
+ felhasználókat
+NICK_HELP_CMD_FORBID
+ FORBID Megelõzi, hogy a nicknév regisztrált legyen
+NICK_HELP_CMD_SUSPEND
+ SUSPEND Suspend a given nick
+NICK_HELP_CMD_UNSUSPEND
+ UNSUSPEND Unsuspend a given nick
+
+NICK_HELP
+ %S lehetõséget nyújt a "register" parancs használatával
+ a nickneved regisztrálására, ezzel megelõzi, hogy más is
+ használhassa a nicked. A NickServ parancsokkal
+ írányítható. Az adott parancs szintaktikáját megkapod, ha
+ beírod, hogy: %R%S parancs, lásd még a
+ %R%S HELP parancs.
+
+NICK_HELP_FOOTER
+ Megjegyzés: Ez a szolgáltatás szeretné biztosítani az
+ IRC felhasználok számára hogy a kilétüket ne lehessen
+ kompromitálni. Egyáltalán NEM azt szolgálja, hogy
+ lehetõséget nyújtson nicknevek "lopására" vagy más
+ erkölcstelen akciókra. A %S segítségével elkövetett
+ visszaélés jutalma minimum az visszaélõ nickjének
+ elvesztése.
+
+NICK_HELP_EXPIRES
+ Ha egy regisztrált nicknevet %d napig nem használnak, akkor
+ a regisztrációja elévül, a nicknevet bárki regisztrálhatja,
+ és használhatja.
+
+NICK_HELP_REGISTER
+ Syntax: REGISTER jelszó [email]
+
+ Regisztrálja a nickneved a %S adatbázisába. Amint a nicked
+ regisztráltad, használhatod a SET és ACCESS parancsokat,
+ hogy konfiguráljad a nicked beállításait. Olyan jelszót
+ válassz, amire emlékezni fogsz, hogy használni tudd a neved
+ és a beállításokat eszközölhesd. Késõbb szükséged lehet a
+ nickeddel kapcsolatos beállítások végrehajtására.
+ (Jegyzet: PROBLÉMÁT OKOZHAT FIDO, Fido, és fido
+ mind különbözõ jelszavak!)
+
+ Útikalaúz jelszó választáshoz:
+
+ A jelszavad ne legyen könnyen kitalálható. Például az
+ általad használt valósnevet megadni jelszónak rossz ötlet.
+ A nickneved használni jelszónak még rosszabb ötlet ;) és
+ a %S nem is engedi. A rövid jelszavak is rosszak a védelem
+ szempontjából, ezért válassz legalább 5 karakter hosszút.
+ Végezetül ne használhatsz szóközt a jelszóban.
+
+ Aze-mail paraméter megadás lehetséges, megadásakor
+ beállítja a nickedhez. Megadása a legtöbb hálózaton
+ szükséges. Az e-mail címed nem kerül harmadik személy
+ tudtára, bizalmasan kezeljük.
+
+ Ez a parancs létrehoz egy új csoportot a nickeddel, ami
+ lehetõvé teszi számodra, hogy másik nickeket regisztrálva
+ megoszthasd a hozzáféréseidet és beállításaidat a nickjeid
+ között. Bõvebb információkért írd be: %R%S HELP GROUP
+
+NICK_HELP_GROUP
+ Syntax: GROUP célnicknév jelszó
+
+ A parancs belépteti a nickneved a célnicknév csoportjába.
+ A jelszó a célnicknév jelszavának kell lennie.
+
+ A csoportba való belépés lehetõvé teszi, hogy megoszd a
+ konfigurációt, memo üzeneteket, szoba hozzáféréseket
+ a nicknevekkel a csoportban, és sok más lehetõséget nyújt!
+
+ A csoport addig létezik, amig használatban van.
+ Ez azt jelenti, ha egy nicknevet dropolnak a csoportból,
+ nem fogod elveszteni a megosztott dolgokat, egészen addig,
+ amig legalább egy nick van a csoportban.
+
+ Akkor is használhatod a parancsot, ha még nem regisztrált
+ a nicked. Ha a nicked regisztrált, akkor elõbb azonosítani
+ kell a jelszavaddal, mielõtt ezt a parancsot használod.
+ Írd be:%R%S HELP IDENTIFY bõvebb információért.
+
+ Ajánlott, hogy inkább nem regisztrált névvel használd
+ ezt a parancsot, mert ezzel automatikusan regisztrálódik.
+ Ha regisztált nickrõl használod (hogy megváltoztasd a
+ csoportod) csak akkor mûködik, ha a network adminok ezt
+ engedélyezik.
+
+ Egyszerre egy csoportban lehetsz.
+
+ Megjegyzés: minden nicknévnek a csoportban ugyanaz
+ a jelszava.
+
+NICK_HELP_IDENTIFY
+ Syntax: IDENTIFY jelszó
+
+ Tudatja a %S-vel, hogy te vagy a tulajdonosa ennek a
+ nicknek. Jelszónak ugyanannak kell lennie amit a
+ regisztrációnál megadtál, vagy amire módosítottad.
+
+NICK_HELP_UPDATE
+ Syntax: UPDATE
+
+ Frissíti a jelenlegi státuszod, vagyis ellenõrzi, hogy
+ jött-e új memo üzenet, beállítja a szükséges szoba
+ módokat, (ModeonID)és frissíti a vhostod, az userflagjeid
+ (utolsó fellépés, stb.)
+
+NICK_HELP_LOGOUT
+ Syntax: LOGOUT
+
+ Ezzel az IDENTIFY parancs hatásának fordítottját éred el.
+ Nem fog a NickServ egy adott nick tulajdonosának tekinteni.
+
+NICK_HELP_DROP
+ Syntax: DROP [nicknév]
+
+ Regisztráció törlése (dropolja) a nickneved a %S
+ adatbázisából. A droppolás után a nicknév már szabadon
+ hsználható bárki által, újra regisztrálható lesz.
+
+ Úgy dropolhatsz nevet a csoportodból, ha megadod a
+ nicknév paramétert.
+
+ Ezen parancs kiadása elõtt, azonositanod kell magad,
+ mint a nick tulajdonosa, használva az IDENTIFY parancsot,
+ írd be: %R%S HELP IDENTIFY bõvebb információért.
+
+NICK_HELP_ACCESS
+ Syntax: ACCESS ADD maszk
+ ACCESS DEL maszk
+ ACCESS LIST
+
+ Módosítja vagy kiirja a hozzáférési listát a nickedhez.
+ Ez azon címeknek a listája, amelyek automatikusan úgy
+ tekintõdnek a %S-ben, hogy engedélyük van a nicket
+ használni. Ha a nicked más címekrõl akarod használni,
+ akkor nem kell IDENTIFY parancsot küldened, hogy úgy
+ legyél tekintve, a %S-ben, mint a nick tulajdonosa.
+
+ Példák:
+
+ ACCESS ADD anyone@*.bepeg.com
+ Hozzáférést engedélyez az anyone identnek bármely
+ géprõl aminek a bepeg.com a domainje.
+
+ ACCESS DEL anyone@*.bepeg.com
+ Törli az elözõ parancsot.
+
+ ACCESS LIST
+ Megmutatja a hozzáférési listát.
+
+NICK_HELP_SET
+ Syntax: SET opció paraméterek
+
+ Beállítható nicknév opciók. Az opció ezek egyike lehet:
+
+ DISPLAY Set the display of your group in Services
+ PASSWORD Set your nickname password
+ LANGUAGE A szervíz nyelvezetének megválasztása
+ URL Egy URL társítása a nicknevedhez
+ EMAIL Egy E-mail cím társítása a nicknevedhez
+ ICQ ICQ szám társítása a nicknevedhez
+ GREET Köszöntõ üzenet társítása a nicknevedhez
+ KILL A kill védelem be-,kikapcsolása
+ SECURE A nickneved védelmének be-,kikapcsolása
+ PRIVATE A nickneved %R%S LIST -ból való elrejtése
+ HIDE A nicknévhez tartozó információk elrejtése
+ MSG Megváltoztatja a szervízzel való kommunikációt
+ AUTOOP Should services op you automatically.
+
+ Ezen parancs kiadása elõtt, azonositanod kell magad, mint
+ a nick tulajdonosa az IDENTIFY parancsot használva, írd
+ be: %R%S HELP IDENTIFY bõvebb információért.
+
+ Írd be: %R%S HELP SET opció bõvebb információért.
+
+
+NICK_HELP_SET_DISPLAY
+ Syntax: SET DISPLAY új-megjelenítés
+
+ Megváltoztatja a nicknév csoportod megjelenítését a
+ szervízben. Az új megjelenítésnek a csoport egyik
+ nickjének KELL lennie.
+
+NICK_HELP_SET_PASSWORD
+ Syntax: SET PASSWORD új-jelszó
+
+ Megváltoztatja a nicknév tulajdonosának jelszavát.
+
+NICK_HELP_SET_LANGUAGE
+ Syntax: SET LANGUAGE sorszám
+
+ Megváltoztatja a SERVICES nyelvezetét, amin az üzenteket
+ írja.(Például: amikor válaszol egy parancsra, amit te
+ adtál ki). A sorszám alapján válaszd ki a nyelvezetet:
+
+NICK_HELP_SET_URL
+ Syntax: SET URL url
+
+ Egy URL társítása a nicknevedhez. Ez az URL szerepelni fog
+ az INFO-idban, amit bárki lekérhet az INFO paranccsal.
+
+NICK_HELP_SET_EMAIL
+ Syntax: SET EMAIL cím
+
+ Egy E-mail cím társítása a nicknevedhez.
+ Ez az E-mail cím szerepelni fog az INFO-id között,
+ amit bárki lekérhet az INFO paranccsal.
+
+NICK_HELP_SET_ICQ
+ Syntax: SET ICQ szám
+
+ Az ICQ számod társítása a nicknevedhez.
+ Ez a szám szerepelni fog az INFO-id között,
+ amit bárki lekérhet az INFO paranccsal.
+
+NICK_HELP_SET_GREET
+ Syntax: SET GREET üzenet
+
+ Ez az opció társít egy üzenetet a nicknevedhez,
+ ami akkor fog megjelenni belépéskor, ha a csatornán
+ a GREET opció engedélyezve van és te rendelkezel a
+ megfelelõ szinttel, ami az üzenet megjelenitéséhez
+ szükséges a csatornán.
+
+NICK_HELP_SET_KILL
+ Syntax: SET KILL {ON | QUICK | IMMED | OFF}
+
+ Be/kikapcsolja az automatikus kill védelmet a nickedhez.
+ A kill védelem bekapcsolásakor, ha más user megpróbálja
+ használni a nicked, kap egy percet mialatt meg kell
+ változtatnia a nickjét, ha letelt az idõ akkor a %S
+ megváltóztatja a nickjét pl: Vendég-000001-re.
+
+ Ha a QUICK -et választod, a user csak 20 másodpercet kap
+ a nickváltásra eltérõen az általános 60 másodperctõl.
+ Ha az IMMED-et választod akkor azonnal megváltóztatja.
+ Figyelmeztetés nélkül,nem kap esélyt a nickváltásra;
+ kérlek ne használd ezt az opciót csak ha nagyon indokolt.
+ A network adminisztrátorok letilthatják ezt.
+
+NICK_HELP_SET_SECURE
+ Syntax: SET SECURE {ON | OFF}
+
+ Be/kikapcsolja a %S a biztonsági beállításokat a nickhez.
+ A SECURE beállítással, be kell írnod a jelszavadat
+ mielõtt a nicknév tulajdonsaként leszel tekintve,
+ kivéve, ha a hosztod szerepel az access listán.
+ Habár, ha az access listán szerepel a hosztod, akkor
+ nem fog automatikusan nevet váltóztatni a %S, hacsak
+ nincs bekapcsolva a KILL opció.
+
+NICK_HELP_SET_PRIVATE
+ Syntax: SET PRIVATE {ON | OFF}
+
+ Be/kikapcsolja a %S a privát opciót a nicknevedhez.
+ A PRIVATE beállítással, beállíthatod azt, hogy
+ a nickneved ne szerepeljen a nicknév listában ami
+ lekérhetõ a %S LIST paranccsal.
+ (Máskülönben, bárki kaphat információt a nicknevedrõl
+ használva az INFO parancsot.)
+
+NICK_HELP_SET_HIDE
+ Syntax: SET HIDE {EMAIL | USERMASK | QUIT} {ON | OFF}
+
+ Lehetõséget nyújt arra, hogy megelõzd néhány adatnak a
+ szerepelését a %S INFO parancs használatakor .
+ Elrejtheted az E-mail címed (EMAIL), az utoljára használt
+ user@host maszkod (USERMASK), és az utolsó kilépõ
+ üzeneted(QUIT). A második paraméter meghatározza, hogy
+ az opció ki legyen kapcsolva(OFF) vagy el legyen rejtve
+ az információ(ON).
+
+NICK_HELP_SET_MSG
+ Syntax: SET MSG {ON | OFF}
+
+ Lehetõséget nyújt arra, hogy megválaszd azt, hogy a szervíz
+ hogyan kommunikáljon veled.
+ Az MSG beállítással, a szervíz, privát üzeneteket fog
+ használni, egyébként pedig noticeokat.
+
+NICK_HELP_SET_AUTOOP
+ Syntax: SET AUTOOP {ON | OFF}
+
+ Sets whether you will be opped automatically. Set to ON to
+ allow ChanServ to op you automatically when entering channels.
+
+NICK_HELP_SASET
+ Syntax: SASET nickname option parameters.
+
+ Sets various nickname options. option can be one of:
+
+ DISPLAY Set the display of the group in Services
+ PASSWORD Set the nickname password
+ URL Associate a URL with the nickname
+ EMAIL Associate an E-mail address with the nickname
+ ICQ Associate an ICQ number with the nickname
+ GREET Associate a greet message with the nickname
+ KILL Turn protection on or off
+ SECURE Turn nickname security on or off
+ PRIVATE Prevent the nickname from appearing in a
+ %R%S LIST
+ HIDE Hide certain pieces of nickname information
+ MSG Change the communication method of Services
+ NOEXPIRE Prevent the nickname from expiring
+ LANGUAGE Set the language Services will use when
+ sending messages to nickname
+
+ Type %R%S HELP SASET option for more information
+ on a specific option. The options will be set on the given
+ nickname.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_DISPLAY
+ Syntax: SASET nickname DISPLAY new-display
+
+ Changes the display used to refer to the nickname group in
+ Services. The new display MUST be a nick of the group.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_PASSWORD
+ Syntax: SASET nickname PASSWORD new-password
+
+ Changes the password used to identify as the nick's owner.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_URL
+ Syntax: SASET nickname URL url
+
+ Associates the given URL with the nickname. This URL
+ will be displayed whenever someone requests information
+ on the nick with the INFO command.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_EMAIL
+ Syntax: SASET nickname EMAIL address
+
+ Associates the given E-mail address with the nickname.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_ICQ
+ Syntax: SASET nickname ICQ number
+
+ Associates the given ICQ number with the nickname. This
+ number will be displayed whenever someone requests
+ information on the nick with the INFO command.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_GREET
+ Syntax: SASET nickname GREET message
+
+ Makes the given message the greet of the nickname, that
+ will be displayed when joining a channel that has GREET
+ option enabled, provided that the user has the necessary
+ access on it.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_KILL
+ Syntax: SASET nickname KILL {ON | QUICK | IMMED | OFF}
+
+ Turns the automatic protection option for the nick
+ on or off. With protection on, if another user
+ tries to take the 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.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_SECURE
+ Syntax: SASET nickname 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.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_PRIVATE
+ Syntax: SASET nickname PRIVATE {ON | OFF}
+
+ Turns %S's privacy option on or off for the nick.
+ With PRIVATE set, the nickname will not appear in
+ nickname lists generated with %S's LIST command.
+ (However, anyone who knows the nickname can still get
+ information on it using the INFO command.)
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_HIDE
+ Syntax: SASET nickname HIDE {EMAIL | STATUS | USERMASK | QUIT} {ON | OFF}
+
+ Allows you to prevent certain pieces of information from
+ being displayed when someone does a %S INFO on the
+ nick. You can hide the E-mail address (EMAIL), last seen
+ user@host mask (USERMASK), the services access status
+ (STATUS) and last quit message (QUIT).
+ The second parameter specifies whether the information should
+ be displayed (OFF) or hidden (ON).
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_MSG
+ Syntax: SASET nickname MSG {ON | OFF}
+
+ Allows you to choose the way Services are communicating with
+ the given user. With MSG set, Services will use messages,
+ else they'll use notices.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_NOEXPIRE
+ Syntax: SASET nickname NOEXPIRE {ON | OFF}
+
+ Sets whether the given nickname will expire. Setting this
+ to ON prevents the nickname from expiring.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_AUTOOP
+ Syntax: SASET nickname AUTOOP {ON | OFF}
+
+ Sets whether the given nickname will be opped automatically.
+ Set to ON to allow ChanServ to op the given nickname
+ automatically when joining channels.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_LANGUAGE
+ Syntax: SASET nickname LANGUAGE number
+
+ Changes the language Services uses when sending messages to
+ nickname (for example, when responding to a command he sends).
+ number should be chosen from a list of supported languages
+ that you can get by typing %R%S HELP SET LANGUAGE.
+
+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
+ remain online for %s to ensure that the other
+ user does not immediately reconnect; after that time, you
+ can reclaim your nick. Alternatively, use the RELEASE
+ command (%R%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. This holds lasts for %s;
+ 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 nickév [jelszó]
+
+ Ezt a parancsot akkor használhatod, ha a nicked beragad,
+ befagy például lefagy a géped vagy a kapcsolatod.
+ A beragadt nicked killelheted, ha ismered a jelszót .
+
+NICK_HELP_INFO
+ Syntax: INFO nicknév [ALL]
+
+ Megmutatja a nicknévvel kapcsolatos információkat, mint a
+ nick tulajdonosa, utoljára látott címe, regisztrálás ideje,
+ a nick opciókat. Ha beazonosítasz egy nickre, akkor minden
+ informaciót megkaphatsz az ALL paraméter használatával
+ és így látni fogod a rejtett információkat is.
+
+NICK_HELP_LIST
+ Syntax: LIST paraméter
+
+ Listázza az összes regisztrált nicknevet, amely
+ megegyezik a mintában kiadott nick!user@host formátummal.
+ Azok a nevek, amelyeken fent van PRIVATE opció beállítás
+ NEM fognak megjelenni a listában.
+
+ Példák:
+
+ LIST joeuser@foo.com
+ Listáz minden regisztrált nicknevet, amelyet utoljára:
+ joeuser@foo.com címrõl használtak.
+
+ LIST *Bot*
+ Listáz minden nicket amelyben szerepelt a Bot
+
+ LIST *@*.bar.org
+ Listáz minden nicket, amit utoljára olyan user használt,
+ akinek a bar.org volt a domain-je.
+
+NICK_HELP_ALIST
+ Syntax: ALIST [szint]
+
+ Listáz minden csatornát, ahol hozzáférésed van.
+ Opcionálisan megadhatod a szintet XOP vagy ACCESS
+ formátumban is. Az eredmény csak azon szobákat fogja
+ megjeleniteni, ahol a megadott hozzáférési szinted van.
+
+ Példák:
+ ALIST Founder
+ Listáz minden csatornát, ahol Founder hozzáférésed van.
+ ALIST AOP
+ Listáz minden csatornát, ahol AOP hozzáférésed
+ vagy magasabb szinted van.
+ ALIST 10
+ Listáz minden csatornát, ahol 10-es hozzáférésed
+ vagy magasabb szinted van.
+
+ Azok a csatornák melyeken a NOEXPIREopció be van állítva,
+ prefixel lesznek megjelölve a listában.
+
+NICK_HELP_GLIST
+ Syntax: GLIST
+
+ Listáz minden nicket a csoportodból.
+
+NICK_HELP_STATUS
+ Syntax: STATUS nicknév...
+
+ A következõket kapod, ha a nicknévre, amit a felhasználó
+ használ azonosította magát, mint tulajdonos.
+ Az eredmény formája a következõ:
+
+ nicknév státusz-kód
+
+ ahol a nicknévaz a nicknév amit küldtél a parancsban, és
+ a státusz-kóda következõ lehet:
+
+ 0 - Nincs ilyen user online vagy a nick nem regisztrált
+ 1 - A felhasználó nem azonosított be, mint a nick tulajdonosa
+ 2 - A felhasználó beazonosított, mint tulajdonos de csak a
+ hozzáférési lista alapján
+ 3 - A felhasználó beazonosított tulajdonosként a jelszavával
+
+ Tizenhat nicknév küldhetõ el parancsonként; a többit
+ figyelmen kívül hagyja. If no nickname is given, your status
+ will be returned.
+
+NICK_HELP_SENDPASS
+ Syntax: SENDPASS nicknév
+
+ Küld számodra egy E-mail üzentet, ami tartalmazza a
+ megadott nicknév jelszavát, arra az E-mail címre, amit
+ a regisztrációnál vagy a set email paranccsal megadtál,
+ vagy amire váltóztattad. Ez igen hasznos, ha elfelejted
+ a jelszavadat.
+
+ Korlátozni lehet IRC operátorokra egyes hálózatokon.
+
+ Parancs nem elérhetõ, ha az encryption használatban van.
+
+NICK_HELP_CONFIRM
+ Syntax: CONFIRM passcodE
+
+ This is the second step of nickname registration process.
+ You must perform this command in order to get your nickname
+ registered with %S. The passcode (or called auth code also)
+ is sent to your e-mail address in the first step of the
+ registration process. For more information about the first
+ stage of the registration process, type: %R%S HELP REGISTER
+
+NICK_HELP_RESEND
+ Syntax: RESEND
+
+ This command will re-send the auth code (also called passcode)
+ to the e-mail address of the user whom is performing it.
+
+NICK_SERVADMIN_HELP
+ Szervíz adminok is droppolhatnak nickeket, akkor ha
+ beazonosíttotak a nicknevükre, és megnézhetik a nickek
+ hozzáférési listáját. (%R%S ACCESS LIST nick)
+
+NICK_SERVADMIN_HELP_LOGOUT
+ Syntax: LOGOUT [nicknév [REVALIDATE]]
+
+ Kilépési paraméter, megfordítja az IDENTIFY parancs
+ hatását, azaz nem leszel beazonosítva a nickedre, mint a
+ valódi tulajdonosa a nickednek.
+
+ A paraméter ugyanezt teszi a megadott nickkel.
+ Ha megadod a REVALIDATE opciót, akkor a nicktõl
+ a szerviz újraazonosítást fog kérni.
+
+ Használat korlátozva Szervíz adminoknak.
+
+NICK_SERVADMIN_HELP_DROP
+ Syntax: DROP [nicknév]
+
+ Paraméter nélkül, droppolja a neved a %S adatbázisból.
+
+ Paraméterrel dropolva a nicknév törlõdik az adatbázisból.
+ Dropolhatsz egy nicket a csoportodban, kivéve, ha van
+ különleges kiváltsága.
+
+ Használat korlátozva Szervíz adminoknak.
+
+NICK_SERVADMIN_HELP_INFO
+
+ Szervíz adminok használhatják az ALL paramétert.
+
+NICK_SERVADMIN_HELP_LIST
+ Syntax: LIST pattern [FORBIDDEN] [SUSPENDED] [NOEXPIRE]
+
+ Listáz minden regisztrált nicknevet, amely vagy nicknév
+ vagy az utoljára látott cím (user@hostformában), amely
+ azonos a megadott sablonnal. Nickek PRIVATE opcióval
+ beállítva csak szervíz adminoknak jelennek meg. A nickek
+ NOEXPIRE opcióval beállítva !prefixel jelennek meg
+ a szervíz adminoknak.
+
+ Ha a FORBIDDEN, SUSPENDED vagy NOEXPIRE opció meg van adva, csak azok
+ a nickek amelyek vagy forbidoltak vagy NOEXPIRE flegjük van
+ fognak megjelenik. Ha mindkét opció meg van adva mindkét
+ tipus megjelenik. Az opciók korlátozva Services adminoknak.
+
+ Példák:
+
+ LIST *!joeuser@foo.com
+ Kiírja a felhasználókat, akiknek a hosztja joeuser@foo.com
+
+ LIST *Bot*!*@*
+ Kiírja az összes regisztrált nicket, melyek nevében
+ szerepel a Bot (betû érzéketlen).
+
+ LIST * NOEXPIRE
+ Listázza az összes felhasználót, akinek a beállítása
+ nem elévülõ.
+
+NICK_SERVADMIN_HELP_ALIST
+ Syntax: ALIST [nicknév] [szint]
+
+ Paraméter nélkül listázza azokat a csatornákat, ahol
+ hozzáférésed van. Egy paraméterrel azokat a szobákat
+ listázza, ahol hozzáférése van a nicknnév-nek. Két
+ paraméterrel azokat a csatornákat listázza, ahol megadott
+ szintû vagy magasabb a hozzáférése a nicknév-nek.
+
+ Ennek a használata korlátozva Szervíz adminra.
+
+NICK_SERVADMIN_HELP_GLIST
+ Syntax: GLIST [nicknév]
+
+ Paraméter nélkül, listázza az összes nicknevet
+ a csoportodban.
+ Paraméterrel listázza az összes nicknevet, abból a
+ csoportból ahol az adott nicknév van.
+
+ Ennek a használata korlátozva Szervíz adminra.
+
+NICK_SERVADMIN_HELP_GETPASS
+ Syntax: GETPASS nicknév
+
+ Visszadja a megadott nicknév jelszavát. Jegyzet Ezt
+ a parancsot amaikor használod, üzenetet küld arról
+ hogy ki használta és kinek a jelszavát kérte le.
+ Naplózva lesz és WALLOPS/GLOBOPS üzenetben is megjelenik.
+
+ Korlátozva Szervíz adminokra.
+
+ A parancs nem elérhetõ, ha az encryption használatban van.
+
+NICK_SERVADMIN_HELP_GETEMAIL
+ Syntax: GETEMAIL user@emailhoszt
+
+ Visszaadja a megadott emaillel regisztrált nickeket.
+ Megjegyzés: használhatsz * karaktert mind a user,
+ mind az emailhost esetében. A parancs kiadásakor a
+ lekért email cím és az azt lekérõ személy naplózva lesz.
+
+ Korlátozva Szervíz adminra.
+
+NICK_SERVADMIN_HELP_FORBID
+ Syntax: FORBID nicknév [indok]
+
+ Nem engedélyezi, hogy bárki regisztrálja a nicknevet
+ Akkor törölhetõ, ha droppolod a nicket.
+
+ Egyes hálózatok indokot igényelnek.
+
+ Korlátozva Szervíz adminra.
+
+###########################################################
+#
+# ChanServ help üzenetek
+#
+###########################################################
+
+NICK_SERVADMIN_HELP_SUSPEND
+ Syntax: SUSPEND nickname reason / UNSUSPEND nickname
+
+ SUSPENDs / UNSUSPENDs a nickname from being identified to
+
+ Limited to Services admins.
+
+###########################################################################
+#
+# ChanServ help messages
+#
+###########################################################################
+
+NICK_SERVADMIN_HELP_UNSUSPEND
+ Syntax: UNSUSPEND nickname
+
+ UNSUSPENDS a nickname from being used.
+
+ Limited to Services admins.
+
+###########################################################################
+#
+# ChanServ help messages
+#
+###########################################################################
+CHAN_HELP_CMD_GETPASS
+ GETPASS Megadja a founder jelszót a csatornán
+CHAN_HELP_CMD_FORBID
+ FORBID Megakadályozza a szoba használatát
+CHAN_HELP_CMD_SUSPEND
+ SUSPEND Felfüggeszti a szoba használatát de
+ megõrzi az adatokat és beállításokat.
+CHAN_HELP_CMD_UNSUSPEND
+ UNSUSPEND Törli a suspendet a csatornáról.
+CHAN_HELP_CMD_STATUS
+ STATUS Kiírja a felhasználó aktuális hozzáférési
+ szintjét a megadott csatornán
+CHAN_HELP_CMD_REGISTER
+ REGISTER Szoba regisztrálása
+CHAN_HELP_CMD_IDENTIFY
+ IDENTIFY Azonosíthatod magad a jelszavaddal
+CHAN_HELP_CMD_SET
+ SET Beállíthatod a csatornád opcióit
+CHAN_HELP_CMD_AOP
+ AOP AutoOperátor lista beállítása
+CHAN_HELP_CMD_SOP
+ SOP SzuperOperátor lista beállítása
+CHAN_HELP_CMD_ACCESS
+ ACCESS A szoba hozzáférési listájának beállítása
+CHAN_HELP_CMD_LEVELS
+ LEVELS Átállíthatod a szoba hozzáférési szintjeit
+CHAN_HELP_CMD_AKICK
+ AKICK AutoKirúgás listára teheted a "rossz" usereket
+CHAN_HELP_CMD_DROP
+ DROP Törölheted a csatornád regisztrációját
+CHAN_HELP_CMD_SENDPASS
+ SENDPASS Elveszett a jelszavad? Jelszó küldés.
+CHAN_HELP_CMD_BAN
+ BAN Bans a selected nick on a channel
+CHAN_HELP_CMD_CLEAR
+ CLEAR Tells ChanServ to clear certain settings on a channel
+CHAN_HELP_CMD_DEVOICE
+ DEVOICE Devoices a selected nick on a channel
+CHAN_HELP_CMD_GETKEY
+ GETKEY Returns the key of the given channel
+CHAN_HELP_CMD_INFO
+ INFO Lists information about the named registered channel
+CHAN_HELP_CMD_INVITE
+ INVITE Tells ChanServ to invite you or a given nick into a channel
+CHAN_HELP_CMD_KICK
+ KICK Kicks a selected nick from a channel
+CHAN_HELP_CMD_LIST
+ LIST Lists all registered channels matching the given pattern
+CHAN_HELP_CMD_LOGOUT
+ LOGOUT This command will logout the selected nickname
+CHAN_HELP_CMD_OP
+ OP Gives Op status to a selected nick on a channel
+CHAN_HELP_CMD_TOPIC
+ TOPIC Manipulate the topic of the specified channel
+CHAN_HELP_CMD_UNBAN
+ UNBAN Remove all bans preventing you from entering a channel
+CHAN_HELP_CMD_VOICE
+ VOICE Voices a selected nick on a channel
+CHAN_HELP_CMD_VOP
+ VOP Maintains the VOP (VOicePeople) list for a channel
+CHAN_HELP_CMD_DEHALFOP
+ DEHALFOP Dehalfops a selected nick on a channel
+CHAN_HELP_CMD_DEOWNER
+ DEOWNER Removes your owner status on a channel
+CHAN_HELP_CMD_DEPROTECT
+ DEPROTECT Deprotects a selected nick on a channel
+CHAN_HELP_CMD_HALFOP
+ HALFOP Halfops a selected nick on a channel
+CHAN_HELP_CMD_HOP
+ HOP Maintains the HOP (HalfOP) list for a channel
+CHAN_HELP_CMD_OWNER
+ OWNER Gives you owner status on channel
+CHAN_HELP_CMD_PROTECT
+ PROTECT Protects a selected nick on a channel
+CHAN_HELP_CMD_ADMIN
+ ADMIN Protects a selected nick on a channel
+CHAN_HELP_CMD_DEADMIN
+ DEADMIN Deprotects a selected nick on a channel
+CHAN_HELP_CMD_DEOP
+ DEOP Deops a selected nick on a channel
+
+CHAN_HELP
+
+ %S lehetõséget ad arra, hogy regisztráld a csatornádat.
+ %S használatával elkerülhetõ a "take over" jelenség,
+ amit az opjoggal visszaélõ userek okozhatnak. Még pedig
+ úgy, hogy meghatározható az, hogy ki kapjon a csatornán
+ operátori kiváltságokat. A parancsok használatához írd be:
+ %R%S parancs, ha több információ kell a paranccsal
+ kapcsolatban, akkor írd be: %R%S HELP parancs.
+
+
+CHAN_HELP_EXPIRES
+
+ Megjegyzés: azok a csatornák, amelyeket nem használnak %d
+ napig, automatikusan elvesztik regisztrációjukat.
+ Automatikusan dropolásra kerülnek.
+
+CHAN_HELP_REGISTER
+ Syntax: REGISTER #szoba jelszó leírás
+
+ A csatornádat regisztrálja a %S adatbázisába.
+ Hogy kiadhasd ezt a paracsot operátornak kell lenned
+ az adott csatornán.
+ A jelszót használhatod az IDENTIFY parancs segitségével
+ azonosításra, mielõtt beállításokat eszközölsz a
+ késöbbiekben az adott csatonán.
+
+ Az utolsó paraméternek, tartalmaznia kell
+ a szoba általános leírását.
+
+ Amikor regisztrálsz egy csatornát, te leszel a "founder".
+ szoba founderjének van lehetõsége a szoba beállításait,
+ a hozzáférési listáját, az autókirúgás listát, az infókat
+ megváltoztatni; a %S automatikusan megadja belépéskor a
+ founder hozzáférési jogot és szoba operátori jogokat.
+ Nézd meg az ACCESS parancsot (%R%S HELP ACCESS),
+ hogy infomálódj a különbözõ szintû kiváltságok adásáról
+ (a szoba többi felhasználója részére).
+
+ Megjegyzés: Ha regisztrálsz egy csatornát, elõször
+ regisztrálnod kell a nickneved és azonosítanod kell
+ magad. (NickServ identify jelszó)
+ Ha még nem nézted meg, akkor lásd még: %R%s HELP.
+
+CHAN_HELP_IDENTIFY
+ Syntax: IDENTIFY #szoba jelszó
+
+ %S a parancs beírása után founder szintet ad a csatornán.
+ Több parancs kiadása elõtt szükséges, hogy használd ezt.
+ A jelszónak egyeznie kell a megadott jelszóval.
+
+CHAN_HELP_LOGOUT
+ Syntax: LOGOUT #szoba nicknév
+
+ Ez a parancs kijelentkezésre birja a nicket, vagyis újra
+ kell azonosítania, hogy újra megkapja a hozzáférést.
+
+ Ha te vagy a szoba founderje, akkor bárkit ki tudsz
+ jelentkeztetni, vagy ki tudsz jelentkezni akár te is.
+
+CHAN_HELP_DROP
+ Syntax: DROP #szoba
+
+ Törli a megnevezett szoba regisztrációját.
+ Csak a szoba founder használhatja, akinek
+ elõbb használnia kell az IDENTIFY parancsot.
+
+CHAN_HELP_SET
+ Syntax: SET #szoba opció paraméterek
+
+ Lehetõséget ad a foundernek, hogy a beállításokat
+ és információkat megváltoztassa.
+
+ Elérhetõ opciók:
+
+ FOUNDER A founder megváltoztatása
+ SUCCESSOR A successor megadása
+ PASSWORD A founder jelszó változtatása
+ DESC A szobameghatározás állítás
+ URL Egy URL társítása a szobához
+ EMAIL Egy E-mail cím társítása a szobához
+ ENTRYMSG A szoba belépo üzenetének
+ állítása
+ BANTYPE A banolás tipusának beállítása
+ MLOCK Szoba módok lezárása (+flag -flag)
+ KEEPTOPIC Topic megtartása ha a szoba nincs használatban
+ OPNOTICE Üzenetet küld az OP/VOICE parancsok használtáról
+ PEACE Szabályozza a kritikus parancsok használatát
+ PRIVATE A szoba elrejtése a listából
+ SECURE Aktiválja a %S biztonsági lehetõségeit
+ SECUREOPS A csatornán az op státusz szigorú kezelése
+ SECUREFOUNDER Csatornán a founder státusz szigorú kezelése
+ SIGNKICK Sign kickek, melyek a KICK paranccsal történnek
+ TOPICLOCK Témaváltás letiltása
+ XOP Xop (Sop, Aop, Hop, Vop) lista rendszer bekapcsolása
+
+ Írd be: %R%S HELP SET opció bõvebb információért az
+ adott opcióról.
+
+CHAN_HELP_SET_FOUNDER
+ Syntax: SET #szoba FOUNDER nick
+
+ Megváltoztatja a szoba founderjét.
+ Az új nicknév regisztrált kell hogy legyen!
+
+CHAN_HELP_SET_SUCCESSOR
+ Syntax: SET #szoba SUCCESSOR nick
+
+ Megváltoztatja a successort a csatornán. Ha a founder neve
+ elévül vagy törlõdik, de a szoba még regisztrált, akkor
+ a successor lesz a szoba új founderje.
+ Ha, a successornak már túl sok regisztrált csatornája van
+ (%d), a csatornának megszûnik a regisztrációja, akkor
+ is ez történik, ha nem volt megadva successor.
+ A nicknek regisztrálnak kell lennie.
+
+CHAN_HELP_SET_PASSWORD
+ Syntax: SET #szoba PASSWORD jelszó
+
+ Beállítja a founder jelszót a csatornára, amivel
+ a founder azonosíthatja magát.
+
+CHAN_HELP_SET_DESC
+ Syntax: SET #szoba DESC leírás
+
+ Beállítható a szoba általános meghatározása, ami látszódni
+ fog a LIST és INFO parancs használata esetén.
+
+CHAN_HELP_SET_URL
+ Syntax: SET #szoba URL [url]
+
+ Egy URL társítása a szobához. Ha van honlapja a szobának,
+ akkor bárki megtudhatja, ha lekérte a szobáról az INFO-t.
+ Ha nincs megadva paraméter, akkor törli a meglévõ URL-t.
+
+CHAN_HELP_SET_EMAIL
+ Syntax: SET #szoba EMAIL [emailcím]
+
+ Egy E-mail cím társítása a szobához. Ha van E-mail címe
+ a szobának; akkor azt bárki megtudhatja, ha lekérte
+ a szobáról az INFO-t. Ha nincs megadva paraméter akkor
+ törli a meglévõ e-mail címet.
+
+CHAN_HELP_SET_ENTRYMSG
+ Syntax: SET #szoba ENTRYMSG [üzenet]
+
+ Beállít egy üzenetet, amit /notice formában fognak
+ a szobába belépõ userek megkapni. Ha nincs paraméter
+ megadva akkor a szoba belépõ üzenete törlõdik.
+
+CHAN_HELP_SET_BANTYPE
+ Syntax: SET #szoba BANTYPE bantípus
+
+ A banolás típusának beállítása, amit a Services akkor fog
+ használni, ha valakit banolni kell a csatornáról.
+
+ A bantípus egy szám 0 és 3 között a jelentése:
+
+ 0: *!user@host formátumú tiltás
+ 1: *!*user@host formátumú tiltás
+ 2: *!*@host formátumú tiltás
+ 3: *!*user@*.domain formátumú tiltás
+
+CHAN_HELP_SET_KEEPTOPIC
+ Syntax: SET #szoba KEEPTOPIC {ON | OFF}
+
+ Engedélyezi vagy letiltja a topic megtartása opciót a
+ szoba részére. Ha a topic megtartása be van állítva,
+ a topicot a %S megjegyzi miután az utolsó user elhagyja a
+ szobát, és visszaállítja a következõ megnyitáskor.
+
+CHAN_HELP_SET_TOPICLOCK
+ Syntax: SET #szoba TOPICLOCK {ON | OFF}
+
+ Engedélyezi vagy letiltja a topic lezárása opciót a
+ csatornán. Ha a topic lezárása be van kapcsolva,a %S nem
+ engedélyezi a csatornán a topic változtatását a TOPIC
+ paranccsal.
+
+CHAN_HELP_SET_MLOCK
+ Syntax: SET #szoba MLOCK módok
+
+ Beállíthatod a mode-lock opciót a csatornán. A %S
+ lehetõséget nyújt arra, hogy meghatározd azokat a módokat
+ amelyek mindig be (vagy ki) lesznek kapcsolva.
+
+ A módok felrakhatóak a /MODE paranccsal is;
+ azok a módok amelyek a + jel után vannak lockolódnak,
+ és azok a módok amelyek a - jel után vannak nem
+ rakhatóak fel a szobára.
+
+ Figyelmeztetés: Ha beállítasz egy mode-lock alatti
+ kulcsot, mint azt a második példában látod, akkor be kell
+ állítanod a RESTRICTED opciót a csatornán (lásd
+ HELP SET RESTRICTED) vagy bárki beléphet a szobába,
+ amikor üres és lehetõsége lesz meglátni a kulcsot!
+
+ Példák:
+
+ SET #szoba MLOCK +nt-ikl
+ Az "n" és a "t" állandóan fent van, és az "i", "k", és
+ "l" állandóan ki lesz kapcsolva. Minden más mód
+ felrakása-levétele szabad.
+
+ SET #szoba MLOCK +knst-ilmp my-key
+ A "k", "n", "s", és "t" állandóan fent van, és az "i",
+ "l", "m", és a "p" ki lesz kapcsolva. A szobába való
+ belépéshez szküséges jelszó: "my-key".
+
+ SET #szoba MLOCK +
+ Eltávolítja az összes lockolt módot.
+ Minden mód szabadon ki/bekapcsolható.
+
+CHAN_HELP_SET_PEACE
+ Syntax: SET #szoba PEACE {ON | OFF}
+
+ Engedélyezi vagy letiltja a peace opciót.
+ Amikor a peace be van állítva, akkor a userek nem,
+ rúghatnak ki, tilthatnak ki olyan usert akinek az övékkel
+ egyenlõ vagy magasabb szintje van a %S parancsokhoz.
+
+CHAN_HELP_SET_PRIVATE
+ Syntax: SET #szoba PRIVATE {ON | OFF}
+
+ Engedélyezi vagy letiltja a private opciót a csatornán.
+ Amikor a private be van kapcsolva, a %R%S LIST
+ parancs által kilistázott csatornák között nem szerepel
+ a szoba.
+
+CHAN_HELP_SET_RESTRICTED
+ Syntax: SET #szoba RESTRICTED {ON | OFF}
+
+ Engedélyezi vagy letiltja a korlátozott hozzáférés
+ opciót a csatornán. Amikor a korlátozott hozzáférés
+ be van kapcsolva, a userek nem kaphatnak szoba
+ operátori jogokat (userek negatív access szinttel,
+ ha a secure opsopció be van kapcsolva, akkor azok a
+ userek, akik nem szerepelnek az access listán) azonnal
+ ki lesznek rúgva és tiltva a szobából belépéskor.
+
+CHAN_HELP_SET_SECURE
+ Syntax: SET #szoba SECURE {ON | OFF}
+
+ Engedélyezi vagy letitlja a %S biztonsági lehetõségeit
+ a szobában. Ha SECURE mûködik, csak azok a felhasználók
+ akik regisztráltak és beazonosítottak a %s-be a
+ jelszavukkal (használván az IDENTIFY parancsot) kaphatnak
+ a szobában jogokat, ha szerepelnek a hozzáférési listán.
+
+CHAN_HELP_SET_SECUREOPS
+ Syntax: SET #szoba SECUREOPS {ON | OFF}
+
+ Bekapcsolja vagy letiltja a secure ops opciót.
+ Amikor a secure ops be van kapcsolva, akkor azok, akik
+ nem szerepelnek a hozzáférési listán nem kaphatnak szoba
+ operátori státuszt.
+
+CHAN_HELP_SET_SECUREFOUNDER
+ Syntax: SET #szoba SECUREFOUNDER {ON | OFF}
+
+ Engedélyezi vagy letiltja a secure founder opciót a
+ csatornán. Amikor a secure founder be van állítva, csak
+ a valódi founder tudja dropolni a csatornát, átírni a
+ szoba jelszavát, founderét, jogutódját, de azok nem,
+ akik csak az IDENTIFY parancsot használták a %S-ben.
+
+CHAN_HELP_SET_SIGNKICK
+ Syntax: SET #szoba SIGNKICK {ON | SZINT | OFF}
+
+ Engedélyezi vagy letiltja a signed kick opciót a csatornán
+ Amikor a SIGNKICK be van állítva, a %S KICK parancsával
+ végrehajtott kirúgásokban az indokban szerepel az op neve.
+
+ Ha használod a LEVEL-t, akkor azok, akiknek a szintje
+ megegyezik vagy magasabb, mint a signkick szintje, azoknak
+ a neve nem fog szerepelni a kick indokjában.
+ Lásd még: %R%S HELP LEVELS bõvebb információkért.
+
+CHAN_HELP_SET_XOP
+ Syntax: SET #szoba XOP {ON | OFF}
+
+ Engedélyezi vagy letiltja az xOP lista rendszert.
+ Ha az XOP be van kapcsolva, akkor AOP/SOP/VOP
+ parancsokkal osztogathatod a csatornán a privilégiumokat
+ a usereknek, máskülönben az ACCESS parancsot használod.
+
+ Az xOP lista rendszerrõl az access lista rendszerre való
+ áttérés nem okoz gondot.
+
+CHAN_HELP_SET_OPNOTICE
+ Syntax: SET #szoba OPNOTICE {ON | OFF}
+
+ Be/kikapcsolja az opnotice opciót a csatornán.
+ Amikor az op-notice be van kapcsolva, a %S megjegyzést
+ fog küldeni a csatornára, amikor a felhasználók használják
+ az OP, VOICE, vagy a hozzájuk kapcsolódó parancsokat a
+ szoban.
+
+CHAN_HELP_AOP
+ Syntax: AOP #szoba ADD nick
+ AOP #szoba DEL {nick | sorszám | lista }
+ AOP #szoba LIST [ maszk | lista ]
+ AOP #szoba CLEAR
+
+ Karbantartja az AOP(AutoOP) listát a csatornán. Az AOP
+ listán szereplõ userek automatikusan megkapják belépéskor
+ az operátor státuszt, unbanhatják magukat, meghívhatják
+ magukat a csatornára,megjelenithetik a köszöntõ üzenetüket
+ stb.
+
+ Az AOP ADD paranccsal hozzáadhatsz egy nickenevet a
+ csatornád AOP listájához.
+
+ Az AOP DEL paranccsal eltávolíthatsz egy megadott
+ nicknevet a csatornád AOP listájáról. Ha sorszámokat
+ intervallumban adunk meg (lásd a listázásnál), akkor a
+ megadott bejegyzések kerülnek törlésre.
+
+ Az AOP LIST parancs megadja az AOP listát.
+ Ha nem vagyunk kiváncsiak a teljes listára akkor a
+ listában szereplõ Aop sorszámát megadva is megtudhatjuk a
+ nevét, megadhatunk intervallumot is.
+
+ Példák:
+
+ AOP #szoba LIST 2-5,7-9
+ Listázza az AOP-okat 2 és 5 között és
+ 7-tol 9-ig.
+
+ Az AOP CLEAR parancs kiüriti a szoba AOP listáját.
+
+ Az AOP ADD és AOP DEL parancsokat csak SOP vagy
+ magasabb szinttel rendelkezo userek használhatják, de az
+ AOP CLEAR parancsot csak a szoba foundere adhatja ki.
+ Habár, minden AOP listán szereplo user használhatja az
+ AOP LIST parancsot.
+
+ Ezt a parancsot letilthatod a csatornádon, és helyette
+ használhatod az access lista rendszert. Nézd meg: %R
+ %S HELP ACCESSbõvebb információért az access listáról, és
+ írd be: %R%S HELP SET XOP hogy megnézd, hogyan tudsz
+ váltani az xOP rendszerrol az access lista rendszerre.
+
+CHAN_HELP_HOP
+ Syntax: HOP #szoba ADD nick
+ HOP #szoba DEL { nick | sorszám | lista}
+ HOP #szoba LIST [ maszk | lista ]
+ HOP #szoba CLEAR
+
+ Karbantartja az HOP (HALFOP) listát a csatornán. A HOP
+ listán szereplõ userek automatikusan megkapják belépéskor
+ a féloperátor státuszt.
+
+ HOP ADD paranccsal hozzáadhatsz egy nickenevet csatornád
+ HOP listájához.
+
+ HOP DEL paranccsal eltávolíthatsz egy megadott nicknevet
+ a csatornád HOP listájáról. Ha sorszámokat intervallumban
+ adunk meg (lásd a listázásnál),akkor a megadott bejegyzések
+ kerülnek törlésre.
+
+ Az HOP LIST parancs megadja az HOP listát. Ha nem vagy
+ kiváncsi a teljes listára akkor a listában szereplõ HOP
+ sorszámát megadva is megtudhatjuk a nevét, megadhatunk
+ intervallumot is.
+
+ Példák:
+
+ HOP #szoba LIST 2-5,7-9
+ Listázza az HOP-okat 2 és 5 között és
+ 7-tol 9-ig.
+
+ Az HOP CLEAR parancs kiüriti a szoba HOP listáját.
+
+ Az HOP ADD és HOP DEL parancsokat csak AOP / magasabb
+ szinttel rendelkezõ userek használhatják,de az HOP CLEAR
+ parancsot csak a szoba foundere adhatja ki.
+ Habár, minden HOP listán szereplo user használhatja az
+ HOP LIST parancsot.
+
+ Ezt a parancsot letilthatod a csatornádon, és helyette
+ használhatod az access lista rendszert. Nézd meg: %R
+ %S HELP ACCESS bõvebb információért az access listáról,
+ és írd be: %R%S HELP SET XOP hogy megnézd, hogyan
+ tudsz váltani az xOP rendszerrõl access lista rendszerre.
+
+CHAN_HELP_SOP
+ Syntax: SOP #szoba ADD nick
+ SOP #szoba DEL { nick | sorszám | lista }
+ SOP #szoba LIST [ maszk | lista ]
+ SOP #szoba CLEAR
+
+ Karbantartja az SOP(SuperOP)listát a csatornán. Az SOP
+ listán szereplo userek automatikusan megkapják ugyanazokat
+ amiket az AOP listán szereplok,és emellett lehetõségük van
+ AKICK listát módosítani, szoba memo üzeneteket olvasni
+ és küldeni, BadWords listát szerkeszteni, stb.
+
+ Az SOP ADD paranccsal hozzáadhatsz egy nickenevet a
+ csatornád SOP listájához.
+
+ Az SOP DEL paranccsal eltávolíthatsz egy megadott
+ nicknevet a csatornád SOP listájáról. Ha sorszámokat
+ intervallumban adunk meg (lásd a listázásnál), akkor a
+ megadott bejegyzések kerülnek törlésre.
+
+ Az SOP LIST parancs megadja az SOP listát. Ha nem
+ vagy kiváncsi a teljes listára akkor a listában szereplõ
+ SOP sorszámát megadva is megtudhatjuk a nevét, megadhatunk
+ intervallumot is.
+
+ Példák:
+
+ SOP #szoba LIST 2-5,7-9
+ Listázza az SOP-okat 2 és 5 között és
+ 7-tõl 9-ig.
+
+ Az SOP CLEAR parancs kiüriti a szoba SOP listáját.
+
+ Az SOP ADD, SOP DEL és SOP CLEAR parancsokat csak a
+ founder szintu userek használhatják. Habár, minden SOP
+ listán szereplo user használhatja az SOP LIST parancsot.
+
+
+
+ Ezt a parancsot letilthatod a csatornádon, és helyette
+ használhatod az access lista rendszert. Nézd meg: %R
+ %S HELP ACCESS bõvebb információért az access listáról,
+ és írd be: %R%S HELP SET XOP hogy megnézd, hogyan
+ tudsz váltani az xOP rendszerrõl access lista rendszerre.
+
+CHAN_HELP_VOP
+ Syntax: VOP #szoba ADD nick
+ VOP #szoba DEL {nick | sorszám| lista}
+ VOP #szoba LIST [maszk | lista]
+ VOP #szoba CLEAR
+
+ Karbantartja az VOP (VoiceOP) listát a csatornán. VOP
+ listán szereplõ userek belépéskor automatikusan hangadói
+ jogot (+v) kapnak, használhatják a voiceme parancsot.
+
+ Az VOP ADD paranccsal hozzáadhatsz egy nickenevet a
+ csatornád VOP listájához.
+
+ A VOP DEL paranccsal eltávolíthatsz egy nicknevet a
+ csatornád VOP listájáról. Ha sorszámokat intervallumban
+ adunk meg (lásd a listázásnál), akkor a megadott
+ bejegyzések kerülnek törlésre.
+
+ Az VOP LIST parancs megadja az VOP listát. Ha nem
+ vagyunk kiváncsiak a teljes listára akkor a listában
+ szereplõ VOP sorszámát megadva is megtudhatjuk a nevét,
+ megadhatunk intervallumot is.
+
+ Példák:
+
+ VOP #szoba LIST 2-5,7-9
+ Listázza az VOP-okat 2 és 5 között és
+ 7-tõl 9-ig.
+
+ Az VOP CLEAR parancs kiüriti a szoba VOP listáját.
+
+ Az VOP ADD, VOP DEL és VOP LIST parancsokat csak az
+ AOP vagy magasabb szintu userek használhatják.
+ A VOP CLEAR parancsot csak a founder használhatja.
+
+ Ezt a parancsot letilthatod a csatornádon, és helyette
+ használhatod az access listát. Nézd meg: %R%S HELP
+ ACCESS bõvebb információért az access listáról, és írd
+ be: %R%S HELP SET XOP hogy megnézd, hogyan tudsz
+ váltani az xOP rendszerrol az access lista rendszerre.
+
+CHAN_HELP_ACCESS
+ Syntax: ACCESS #szoba ADD nick szint
+ ACCESS #szoba DEL {nick | sorszám | lista}
+ ACCESS #szoba LIST [maszk | lista]
+ ACCESS #szoba CLEAR
+
+ Access lista a csatornán. A hozzáférési lista (access)
+ meghatározza, hogy mely userek kaphatnak op státuszt vagy
+ hozzáférést a %S parancsokhoz a csatornán. Különbözõ
+ user szintek lehetõséget adnak arra, hogy eltérõ jogokat
+ kaphassanak; információért %R%S HELP ACCESS LEVELS.
+ A nick, amely nem szerepel az access listán 0-ás szintû.
+
+ Az ACCESS ADD paranccsal hozzáadható a nicknév az
+ access listához a megadott szinttel; ha a nick szerepel
+ a listán,akkor a szintje változik csak meg. A szintamit
+ meghatározol, kisebb kell, hogy legyen a te szintednél és
+ ha a nick már szerepel a listán, akkor a jelenlegi
+ szintjánek a tiédnél alacsonyabbnak kell lennie.
+
+ Az ACCESS DEL törli a nicknevet az access listáról.
+ Ha intervallumot adsz meg, akkor minden benne szereplõ
+ nicknevet törölsz.
+
+ Az ACCESS LIST paranccsal megtekintheto az access lista.
+ Ha intervallumot is megadsz, akkor abban az intervallumban
+ szereplõ nicknevek listázása fog megtörténni.
+
+ ACCESS #szoba LIST 2-5,7-9
+ Listázza azokat a usereket, akik 2 és 5 között illetve
+ 7-tõl 9-ig szerepelnek a listán.
+
+ Az ACCESS CLEAR parancs töröl minden bejegyzés a szoba
+ hozzáférési listájáról.
+
+CHAN_HELP_ACCESS_LEVELS
+ Felhasználói hozzáférési szintek
+
+ Alapból, a következõ hozzáférési szintek érvényesek:
+
+ Founder Teljes hozzáférés a %S funkciókhoz; automatikus
+ opjog a csatornára való belépéskor.
+ Megjegyzés, csak egy embernek lehet founder státusza
+ (nem adható az ACCESS paranccsal).
+  10 Hozzáférés az AKICK parancshoz; automatikus op.
+  5 Automatikus op státusz.
+  3 Automatikus voice státusz.
+  0 Nincs különleges privilégiuma; opolható más
+ opok által(ha a secure-ops ki van kapcsolva).
+  <0 Nem opolható.
+
+ Ezek a szintek változhatnak, vagy újakat adhatsz hozzá, a
+ LEVELS paranccsal; írd be: %R%S HELP LEVELS bõvebb
+ információért.
+
+CHAN_HELP_AKICK
+ Syntax: AKICK #szoba ADD {nick | maszk} [indok]
+ AKICK #szoba STICK maszk
+ AKICK #szoba UNSTICK maszk
+ AKICK #szoba DEL {nick | maszk | entry-num | list}
+ AKICK #szoba LIST [maszk | entry-num | list]
+ AKICK #szoba VIEW [maszk | entry-num | list]
+ AKICK #szoba ENFORCE
+ AKICK #szoba CLEAR
+
+ Karbantarthatod a csatornához tartozó autokirúgás listát
+ Ha egy olyan felhasználó, akinek a maszkja megegyezik egy
+ az akick listán szerepelõ maszkkal megprobál belépni a
+ csatornára, akkor a %S kitiltja és aztán kirúgja.
+
+ Az AKICK ADD parancs hozzáadja a megadott nicket
+ vagy usermaszkot az AutoKick listához. Ha megadsz
+ indokot is a parancsban, akkor ezzel az indokkal
+ fogja kirúgni a ChanServ az illetõt, ha nincs
+ megadva, akkor az alapbeállítás szerinti indok:
+ "You have been banned from the channel".
+
+ Az AKICK STICK paranccsal véglegesen kitiltod az
+ adott maszkot a csatornáról. Ha valaki megpróbálja
+ levenni a bant, a %S automatikusan visszateszi.
+ Ezt nem használhatod regisztrált nevekre.
+
+ Az AKICK UNSTICK parancs törli a hatását az
+ AKICK STICK parancsnak, tehát ismét lehetõséged
+ lesz levenni a tiltást a csatornádról.
+
+ Az AKICK DEL parancs eltávolítja a megadott maszkot az
+ autokirúgás listáról.
+ Ez nem müködik, hacsak nem távolítunk el minden az adott
+ nickre, identre, hostra szoló tiltást, ami az autókirugás
+ listán szerepel; mindegyiket egyenként kell törölni.
+
+ Az AKICK LIST parancs megjeleníti az autókirúgás listát,
+ vagy optionális esetben csak azokat jeleniti meg, amelyek
+ egyeznek a megadott maszkkal.
+
+ Az AKICK VIEW ugyanaz, mint a AKICK LIST, de több
+ részletet jelenít meg.
+
+ AKICK ENFORCE hatására a %S ellenörzi az akick listát
+ és eltávolít minden usert, aki szerepel a listán.
+
+ AKICK CLEAR paranccsal az összes akick lista bejegyzés
+ törölhetõ.
+
+CHAN_HELP_LEVELS
+ Syntax: LEVELS #szoba SET típus szint
+ LEVELS #szoba {DIS | DISABLE} típus
+ LEVELS #szoba LIST
+ LEVELS #szoba RESET
+
+ A LEVELS segítségével a számokkal definiált hozzáférési
+ szintek módosíthatók.
+ Ezzel a paranccsal, definiálhatsz hozzáférési szinteket,
+ melyek szükségesek a %S funkcióihoz.
+ Ezt a parancsot csak a founder használhatja.
+
+ LEVELS SET biztosítja, hogy megváltoztasd a hozzáférési
+ szintjét egy adott funkciónak vagy funkciók csoportjának.
+
+ A LEVELS DISABLE (vagy DIS röviden) letiltja
+ az automatikus lehetõségeket, vagy megtiltja a hozzáférést
+ bizonyos funkciókhoz, ezeket csak a founder változtathatja
+
+ LEVELS LIST kiírja a jelenlegi hozzáférési szintjeit
+ a különbözõ funkcióknak.
+
+ LEVELS RESET visszaállítja az alapértelmezett értékeket.
+ Lásd még: HELP ACCESS LEVELS.
+
+ Ha szeretnéd megnézni a funkciók és lehetõségek listáját.
+ akkor lesd meg a HELP LEVELS DESC leírást is.
+
+CHAN_HELP_LEVELS_DESC
+ A következõ lehetõségek/funkciók elérthetõek.
+ Megjegyzés: az AUTODEOP és NOJOIN esetén maximum szintrõl
+ az összes többi esetén minimum szintrõl van szó.
+
+CHAN_HELP_LEVELS_DESC_FORMAT
+ %-*s %s
+
+CHAN_HELP_INFO
+ Syntax: INFO #szoba [ALL]
+
+ Listázza az összes információt a megnevezett regisztrált
+ csatornáról, pl a foundert, a regisztrálás idõpontját,
+ az utolsó használat idejét, a leírást, az mlock-ot.
+ Ha beazonosítottad magad a szoba founderjének, akkor
+ teljes információt az ALL paraméterrel kaphatsz, az
+ entrymessage, a successor és a rejtett infók is látszódnak
+
+ Alapból az ALL opció csak a foundernek engedélyezett.
+
+CHAN_HELP_LIST
+ Syntax: LIST pattern
+
+ Listázza a regisztrált csatornákat.
+ (Ahol a PRIVATE opció be van kapcsolva nem fog
+ megjelenni a listában.)
+
+CHAN_HELP_OP
+ Syntax: OP [#szoba [nick]]
+
+ Opolja a megadott nicket a megadott csatornán.
+ Ha nem adsz meg nicket, magadat opolod.
+ Ha nem adsz meg csatornát és nicket se, akkor minden
+ csatornán (ahol bent vagy) opolod magad,
+ ahol meg van hozzá a jogod.
+
+ Alap beállítás szerint csak a minimum AOP listán
+ vagy 5-ös accessen szereplo userek használhatják.
+
+CHAN_HELP_DEOP
+ Syntax: DEOP [#szoba [nick]]
+
+ Deopolja a megadott nicket a megadott csatornán.
+ Ha nem adsz meg nicket, magadat deopolod.
+ Ha nem adsz meg csatornát és nicket se, akkor minden
+ csatornán (ahol bent vagy) deopolod magad,
+ ahol meg van hozzá a jogod.
+
+ Alap beállítás szerint csak a minimum AOP listán
+ vagy 5-ös access szinten szereplo userek használhatják.
+
+CHAN_HELP_VOICE
+ Syntax: VOICE [#szoba [nick]]
+
+ Voiceolja a megadott nicket a megadott csatornán.
+ Ha nem adsz meg nicket, magadat voiceolod.
+ Ha nem adsz meg csatornát és nicket se, akkor minden
+ csatornán (ahol bent vagy) voiceolod magad, ahol megvan
+ hozzá a jogod.
+
+ Alap beállítás szerint csak a minimum AOP listán
+ vagy 5-ös accessen szereplo userek használhatják vagy min.
+ a VOP listán vagy 3-as access szinten szereplo userek
+ használhatják saját maguk voiceolására.
+
+CHAN_HELP_DEVOICE
+ Syntax: DEVOICE [#szoba [nick]]
+
+ Elveszi a voiceot a megadott nicktõl a megadott csatornán.
+ Ha nem adsz meg nicket, magadatól veszed el.
+ Ha nem adsz meg csatornát és nicket se, akkor minden
+ csatornán (ahol bent vagy) elveszed magadtól, ahol
+ meg van hozzá a jogod.
+
+ Alap beállítás szerint csak a minimum AOP listán vagy
+ 5-ös accessen szereplõ userek használhatják vagy min.
+ a VOP listán vagy 3-as access szinten szereplo userek
+ használhatják saját maguktól elvenni voiceot.
+
+CHAN_HELP_HALFOP
+ Syntax: HALFOP [#szoba [nick]]
+
+ Félopot ad a megadott nicknek a megadott csatornán.
+ Ha nem adsz meg nicket, magadnak adsz.
+ Ha nem adsz meg csatornát és nicket se, akkor minden
+ csatornán (ahol bent vagy) magadnak adsz félopot, ahol
+ meg van hozzá a jogod.
+
+ Alap beállítás szerint csak a minimum AOP listán vagy
+ 5-ös accessen szereplo userek használhatják vagy min.
+ a HOP listán vagy 4-es access szinten szereplõ userek
+ használhatják saját maguknak félop adására.
+
+CHAN_HELP_DEHALFOP
+ Syntax: DEHALFOP [#szoba [nick]]
+
+ Elveszi a félopot a megadott nicktõl a megadott csatornán.
+ Ha nem adsz meg nicket, magadatól veszed el.
+ Ha nem adsz meg csatornát és nicket se, akkor minden
+ csatornán (ahol bent vagy) elveszed magadtól a félopot,
+ ahol meg van hozzá a jogod.
+
+ Alap beállítás szerint csak a minimum AOP listán vagy
+ 5-ös accessen szereplo userek használhatják vagy min.
+ a HOP listán vagy 4-es access szinten szereplõ userek
+ használhatják, hogy saját maguktól elvegyék a félopot
+
+CHAN_HELP_PROTECT
+ Syntax: PROTECT [#szoba [nick]]
+
+ Protectet ad a megadott nicknek a megadott csatornán.
+ Ha nem adsz meg nicket, magadat protecteled.
+ Ha nem adsz meg csatornát és nicket se, akkor minden
+ csatornán (ahol bent vagy) protectet adsz magadnak,
+ ahol meg van hozzá a jogod.
+
+ Alap beállítás szerint csak a founder tudja használni,
+ vagy minimum a SOP listán vagy 10-es access szinten
+ szereplõ userek használhatják saját maguk protectolására.
+
+CHAN_HELP_DEPROTECT
+ Syntax: DEPROTECT [#szoba [nick]]
+
+ Elveszi a protectet a nicktõl a megadott csatornán.
+ Ha nem adsz meg nicket, magadat deprotecteled.
+ Ha nem adsz meg csatornát és nicket se, akkor minden
+ csatornán (ahol bent vagy) elveszed a protectet magadtól,
+ ahol meg van hozzá a jogod.
+
+ Alap beállítás szerint csak a founder tudja használni,
+ vagy min. az SOP listán vagy 10-es access szinten
+ szereplõ userek használhatják maguk deprotectolására.
+
+CHAN_HELP_OWNER
+ Syntax: OWNER [#szoba]
+
+ Tulajdonosi státuszt ad a csatornán. Ha a szoba nincs
+ megadva, akkor minden csatornán, ahol bent vagy ownert
+ kapsz, ahol meg van ehhez van jogod is.
+
+ Csak founder szintû user használhatja.
+
+CHAN_HELP_DEOWNER
+ Syntax: DEOWNER [#szoba]
+
+ Elveszi a tulajdonosi státuszt a csatornán.Ha a szoba
+ nincs megadva, akkor mindenhol, ahol bent vagy elveszed
+ magadtól az ownert, ahol meg van ehhez van jogod is.
+
+ Csak founder szintu user használhatja.
+
+CHAN_HELP_INVITE
+ Syntax: INVITE #szoba
+
+ Utasítja a %S-et, hogy hívjon meg a megadott csatornára.
+
+ Alapbeállítás szerint, min. AOP vagy 5-ös access szinttel
+ kell rendelkezned a csatornán, hogy használhasd.
+
+CHAN_HELP_UNBAN
+ Syntax: UNBAN #szoba
+
+ A %S leveszi rólad a kitiltást és szabadon
+ beléphetsz a csatonára.
+
+ Alapbeállítás szerint, min. AOP vagy 5-ös access szinttel
+ kell rendelkezned, hogy használhasd.
+
+CHAN_HELP_KICK
+ Syntax: KICK [#szoba [nick [indok]]]
+
+ A ChanServ kirúgja a megadott nicknevet a csatornáról.
+ Ha nem adsz meg nicket, akkor téged fog kirúgni.
+ Ha nem adsz meg szobát és nicket sem, akkor téged
+ fog minden csatornáról, ahol bent vagy kirúgni, ha
+ meg van a parancs használatához a szükséges szinted.
+
+ Alapbeállítás szerint, min. AOP vagy 5-ös access szinttel
+ kell rendelkezned a csatornán, hogy használhasd.
+
+CHAN_HELP_BAN
+ Syntax: BAN [#szoba [nick [indok]]]
+
+ Kitilt egy kiválaszott nicket a csatornáról.
+ Ha nem adsz meg nevet akkor téged tilt ki, ha
+ nem adsz meg csatit és nicket, akkor minden csatornáról
+ ahol bent vagy és van jogod rá, onnan kitilt.
+
+ Alapbeállítás szerint, minimum AOP vagy 5-ös access
+ szinttel kell rendelkezned a csatornán, hogy használhasd.
+
+CHAN_HELP_TOPIC
+ Syntax: TOPIC #szoba [téma]
+
+ A %S megváltoztatja a szoba témáját arra amit
+ megadtál. Ha a téma nincs megadva, akkor egy üres
+ topicot állít be. Ez a parancs hasznos, akkor ha a
+ SET TOPICLOCK be van állítva. Használd a %R%S HELP
+ SET TOPICLOCK parancsot bõvebb információért.
+
+ Alapból a szoba founder szintû userei használhatják
+ csak a csatornán.
+
+CHAN_HELP_CLEAR
+ Syntax: CLEAR #szoba mit?
+
+ A %S eltávolítja a beállításokat a csatornán.
+ A következõ opciók lehetségesek:
+
+ MODES Törli az összes módot ami nem szerepel a szoba
+ mode lockjában.
+ BANS Törli az összes tiltást a csatornán.
+ EXCEPTS Törli az összes kivételt a csatornán.
+ OPS Elvesz minden opot a csatornán
+ HOPS Eltávolít minden félop csatorna státuszt (+h mód)
+ az összes csatornán lévõ féloperátortól, ha támogatott.
+ VOICES Elvesz minden "voice"-t (mode +v) a csatornán.
+ USERS Eltávolít minden usert a csatornáról (kirúgás).
+
+ Alapbeállításban, a founder szintû userek használhatják.
+
+CHAN_HELP_GETKEY
+ Syntax: GETKEY #szoba 
+
+ Megadja a szoba kulcsot. Ez a parancs kimondottan hasznos
+ botok és/vagy scriptek számára, tehát a kimeneti rész
+ a következõképpen néz ki:
+
+ KEY <szoba> <kulcs>
+
+ A kulcs "NO KEY", ha nincs kulcs beállítva.
+
+CHAN_HELP_SENDPASS
+ Syntax: SENDPASS #szoba
+
+ Elküldi E-mailben a csatornádra beállított jelszót. Neked
+ a szoba founderjének kell lenned, hogy használhasd ezt
+ a parancsot és elõször azonosítanod kell magadat.
+
+ Lehet korlátozni IRC operatorok részére a hálózaton.
+
+ A parancs nem használható ha az encryption engedélyezett.
+
+CHAN_SERVADMIN_HELP
+
+ Szervíz adminok tudják droppolni a csatornákat anélkül,
+ hogy a szoba jelszót használnának, és megnézhetika az
+ access, AKICK, és beállitási szint listát a csatornán.
+
+CHAN_SERVADMIN_HELP_LOGOUT
+ Syntax: LOGOUT #szoba [nicknév]
+
+ A parancs naplózza a kijelentekeztetést, neki ójra kell
+ azonosítani magukat,hogy visszakapják a hozzáféréseiket.
+
+ Ha ta vagy a csatörna alpító, képes vagy kijelentkeztetni
+ mást, te képes vagy magad is.
+
+ Ha szervíz admin vagy akkor kijelentekeztethetsz valakit a
+ csatornáról anélkül, hogy te lenneél a founder.Elhagyhatod
+ a nincnév paramétert, és akkor az összes bejelentkezett
+ felhasználót kijelentkezteted a csatornáról.
+
+CHAN_SERVADMIN_HELP_DROP
+ Syntax: DROP #szoba
+
+ Törli a regisztrációt a csatornáról.Csak Services admins
+ droppolhat csatornát,úgy hogy nem használja a szoba
+ jelszavát.
+
+CHAN_SERVADMIN_HELP_SET
+
+ Szervíz admin beállíthatja a csatornát NEMELÉVÜLÕ -re,
+ ekkor a sorban megelõzi az elévülõket. A szervíz
+ adminisztrátor beállíthatja anélkül, hogy szoba
+ jelszót használná.
+
+CHAN_SERVADMIN_HELP_SET_NOEXPIRE
+ Syntax: SET #szoba NOEXPIRE {ON | OFF}
+
+ Beállítja a szoba elévülését. Beállitva az
+ ON paranmétert megelõzi az elévülõ csatornákat.
+
+ Korlátozva Szervíz adminnak.
+
+
+CHAN_SERVADMIN_HELP_INFO
+
+ Szervíz adminok használhatják az ALL paramétert.
+
+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
+ korlátozva szervíz adminnak.
+
+CHAN_SERVADMIN_HELP_GETPASS
+ Syntax: GETPASS #szoba
+
+ Kiirja a szoba jelszavát. Jegyzet bármikor használják a
+ parancsot, egy üzenetet kap aki kiadta a parancsot és a szoba
+ is ahol volt használva küld egy WALLOPS/GLOBOPS üzenetet.
+
+ Korlátozva Szervíz adminnak.
+
+CHAN_SERVADMIN_HELP_FORBID
+ Syntax: FORBID #szoba [indok]
+
+ Letiltja a szoba használatát.
+ Csak droppolás után lehet a csatornát használni.
+
+ Indoklást szükséges egyes hálózatokon.
+
+ Korlátozva Szervíz adminnak.
+
+CHAN_SERVADMIN_HELP_SUSPEND
+ Syntax: SUSPEND #szoba [indok]
+
+ Elutasít minden szobahasználatot. Lehet törölni a
+ UNSUSPEND paranccsal és akkor használható az öüsszes
+ megörzött szoba adat/beállítás.
+
+ Indoklást kér némelyik hálózat.
+
+ Korlátozva Szervíz adminnak.
+
+CHAN_SERVADMIN_HELP_UNSUSPEND
+ Syntax: UNSUSPEND #szoba
+
+ Törli a suspendet a csatornáról. Összes adat és beállítás
+ megõrizve a suspend használat elõttröl.
+
+ Korlátozva Szervíz adminnak.
+
+CHAN_SERVADMIN_HELP_STATUS
+ Syntax: STATUS #szoba nicknév
+
+ Kiirja a nicknév aktuális hozzáférési szintjét a megadott
+ csatornán. Válasz a következõ formában::
+
+ STATUS szoba nicknév access-szint
+
+ Ha hiba történik akkor a válasz a következõ formátunú:
+
+ STATUS ERROR Hiba - üzenet
+
+ Korlátozva Szervíz adminnak.
+
+###########################################################
+#
+# MemoServ help üzenetek
+#
+###########################################################
+MEMO_HELP_CMD_SEND
+ SEND Üzenetet küld egy nicknek vagy csatornára
+MEMO_HELP_CMD_CANCEL
+ CANCEL Visszavonja az utoljára küldött memot
+MEMO_HELP_CMD_LIST
+ LIST Megjeleníti az üzenetek listáját
+MEMO_HELP_CMD_READ
+ READ Elolvassa a megadott üzenete(ke)t
+MEMO_HELP_CMD_DEL
+ DEL Törli a megadott üzenete(ke)t
+MEMO_HELP_CMD_SET
+ SET Üzenetekkel kapcsolatos beállításokat hajt végre
+MEMO_HELP_CMD_INFO
+ INFO Kiírja az üzenetekkel kapcsolatos információkat
+MEMO_HELP_CMD_RSEND
+ RSEND Memo üzenetet küld és olvasási visszaigazolást kér
+MEMO_HELP_CMD_CHECK
+ CHECK Ellenõrzi, hogy a címzett elolvasta-e már az üzit
+MEMO_HELP_CMD_SENDALL
+ SENDALL Memo küldése minden regisztrált felhasználónak.
+MEMO_HELP_CMD_STAFF
+ STAFF Memo küldése minden opernek/adminnak.
+
+MEMO_HELP_HEADER
+ %S lehetõséget nyújt az IRC felhasználókank, hogy rövid
+ üzeneteket küldjenek más IRC felhasználók részére,
+ akkor is, ha a fogadó fél nem online, és csatornákra (*).
+ Ahhoz, hogy üzenetet lehessen küldeni, mind a küldõ és a
+ fogadó fél nicknevének regisztráltnak kell lennie.
+
+ %S parancsok a következõket tartalmazzák:
+
+
+MEMO_HELP_ADMIN
+ not used.
+MEMO_HELP_OPER
+ not used.
+MEMO_HELP_FOOTER
+
+ A parancsokkal kapcsolatos további segítségért
+ írd be: %R%S HELP parancs.
+
+ (*) Alapból, bármelyik user, minimum 10-es szinttel
+ olvashatja a szoba memo üzeneit. Ez megváltoztatható a
+ %s LEVELS paranccsal.
+
+MEMO_HELP_SEND
+ Syntax: SEND { nick | #szoba } memo-szöveg
+
+ Üzenetet küld a megnevezett nicknek vagy csatornára
+ a üzenet-szövegét tartalmazva. Amikor nicknévnek küldesz
+ a címzett kap egy üzenetet az új üzenet érkezésérõl
+ A címzett csatornának vagy nicknévnek regisztráltnak kell
+ lennie.
+
+MEMO_HELP_CANCEL
+ Syntax: CANCEL { nick | #szoba }
+
+ Visszavonja az utolsó memo üzenetet, amit a nicknek
+ vagy csatornának küldtél.
+
+MEMO_HELP_LIST
+ Syntax: LIST [#szoba] [list | NEW]
+
+ Megjelenít egy listát a jelenlegi üzenteteidrol. A NEW
+ opcióval csak az új (olvasatlan) üzenteket listázza.
+ listázza. Az olvasatlan üzeneteket jelöli egy "*" jellel
+ az üzenetszámtól balra. Megadhatsz számlistát is, mint
+ ahogy az alábbi példa mutatja:
+
+ LIST 2-5,7-9
+ Listázza az üzeneteket 2 és 5, illetve 7 és 9 között.
+
+MEMO_HELP_READ
+ Syntax: READ [#szoba] {sorszám| list| LAST | NEW}
+
+ Elküldi a megadott üzenetek tartalmát. A LAST opcióval
+ megjeleníti a legutolsó üzenetet. A NEW opcióval
+ minden új üzenetet. Egyébként a megadott számú üzenetet.
+ Megadhatsz számlistát is, mint a LIST parancsnál.
+
+ Példák:
+
+ READ 2-5,7-9
+ Megjeleníti 2 és 5, a 7 és 9 között a memo üzeneteket
+
+MEMO_HELP_DEL
+ Syntax: DEL [#szoba] {sorszám | list | LAST | ALL}
+
+ Törli a megadott memo üzenete(ke)t.
+ Több számot is megadhatsz, intervallumot is használhatsz,
+ az egyszerû sorszám helyett.
+
+ Ha a LAST meg van adva, az utolsó memo üzenetet törli
+ Ha az ALL van megadve, akkor minden memo üzenetet töröl.
+
+ Példák:
+
+ DEL 1
+ Törli az elsõ memo üzenetet.
+
+ DEL 2-5,7-9
+ Törli a memo üzeneteket 2 és 5, illetve 7 és 9 között.
+
+MEMO_HELP_SET
+ Syntax: SET opció paraméterek
+
+ Beállít különbözo memo opciókat.
+ Az opció lehet az alábbiak egyike:
+
+ NOTIFY Itt állíthatod be, ha figyelmeztetést szeretnél
+ kapni az új üzenetekrol (csak nicknevehez)
+ LIMIT Beállítja a maximális üzenetek számát
+
+ További információért írd be: %R%S HELP SET opció
+
+MEMO_HELP_SET_NOTIFY
+ Syntax: SET NOTIFY {ON | LOGON | NEW | OFF}
+
+ Itt tudod beállítani, ha értesítést szeretnél kapni
+ az új üzenetekrõl:
+
+ ON Értesítést kapsz az új üzenetrõl csatlakozáskor,
+ amikor visszajössz /AWAY-ból, vagy ha küldenek neked.
+ LOGON Értesítést kapsz az új üzenetekrõl csatlakozáskor
+ vagy ha visszajössz /AWAY-ból.
+ NEW Csak akkor kapsz értesítést, ha új üzenet érkezett.
+ OFF Nem kapsz értesítést az üzeneteidrõl.
+
+ Az ON ekvivalens a LOGON és a NEW kombinálásával.
+
+MEMO_HELP_SET_LIMIT
+ Syntax: SET LIMIT [#szoba] limit
+
+ Beállítja, hogy max. hány üzenetet fogadhatsz a nickedre
+ (vagy a csatornára). Ha 0-ra állítod, senki nem
+ küldhet üzenetet a nickedre/csatornára. Mindamellett,
+ nem állíthatod ezt a számot többre, mint %d.
+
+MEMO_HELP_INFO
+ Syntax: INFO [#szoba]
+
+ Információt jelenít meg arról, hogy mennyi üzeneted van,
+ ebbõl mennyi olvasatlan, mennyi üzenetet fogadhatsz,
+ és azt is megmondja, hogy kapsz-e üzenetet az új üzenetek
+ érkezésekor. Paraméter megadása esetén az információt
+ csatornára vonatkozóan jeleníti meg.
+
+MEMO_SERVADMIN_HELP_SET_LIMIT
+ Syntax: SET LIMIT [user | #szoba]{korlát|NONE}[HARD]
+
+ Beállítja egy felhasználó vagy szoba max.fogadható
+ memo üzenetienek számát, ha a limitet 0-ra állitod
+ akkor a felhasználó nem fogadhat üzeneteket.Ha a
+ NONE-vel állítod be akkor annyit fogadhat és tarthat
+ meg amennyit akar.Ha nem adsz meg nicknevet, vagy csatornát
+ akkor a saját korlátaidat állitja.
+
+ HARD-al hozzáadva nem állíthatja a felhasználó a korlát
+ értékét Ha nem adod hozzá a HARD-ot akkor a felhasználó
+ kedve szerint váltóztathatja a korlát értékét (akkor is ha
+ az elõzõ értéket a HARD-al adtad meg)
+
+ SET LIMIT parancs használata korlátozható Szervíz
+ adminokra. Egyéb felhasználók csak saját maguknak és a
+ csatornáknak ahol megfelelõ hozzáférésük van állíthatnak
+ korlátot de nem törölhetik, és nem állíthatnak %d érték
+ felett valamint HARD korlátot.
+
+
+MEMO_SERVADMIN_HELP_INFO
+ Syntax: INFO [nick| #szoba]
+
+ Paraméter nélkül kiirja az információt, hogy hány
+ üzeneted van, ebböl hány olvasatlan, és összesen
+ hány üzenetet fogadhatsz.
+
+ A szoba paraméterrel, a csatornáról kapod meg
+ ezeket az információkat
+
+ A nicknév paraméterrel a megadott nicknévröl jeléeníti
+ meg ezeket az információkat.Enek használat korlátozva
+ Szervíz adminra.
+
+
+MEMO_HELP_STAFF
+ Syntax: STAFF memo-üzenet
+
+ Memo üzenet küldése az opereknek/adminoknak.
+ Megjegyzés: Ha valamelyik nick szerepel az oper
+ és admin listán is, akkor a memot kétszer kapja meg.
+ Hasonló a helyzet a root és más listákkal.
+
+MEMO_HELP_SENDALL
+ Syntax: SENDALL memo-üzenet
+
+ Memo üzenet küldése minden regisztrált felhasználónak.
+
+MEMO_HELP_RSEND
+ Syntax: RSEND {nick | #szoba} memo-üzenet
+
+ Memot küld a megadott névnek, szobának a memo-üzenet
+ tartalmával. Ha nicknévnek küldöd, akkor értesítést fog
+ kapni, hogy új üzenete érkezett. A cél nicknévnek vagy
+ csatornának regisztráltnak kell lennie.
+ Amint a címzett elolvasta a memot, egy automatikus értesítést
+ fog kapni a feladó arról, hogy az üzenetét elolvasták.
+
+MEMO_HELP_CHECK
+ Syntax: CHECK nick
+
+ Ellenõrzi, hogy az _utolsó_ üzenet, amit a nick számára
+ küldtél már olvasott-e vagy még olvasatlan.
+ Megjegyzés, ez csak nickekkel mûködik szobákkal nem.
+
+###########################################################
+#
+# OperServ help üzenetek
+#
+###########################################################
+
+OPER_HELP_CMD_GLOBAL
+ GLOBAL Üzenetet küld összes felhasználónak
+OPER_HELP_CMD_STATS
+ STATS Mutatja a Szervít és hálózat állapotát
+OPER_HELP_CMD_OPER
+ OPER Módosítja a Szervíz operátorok listáját
+OPER_HELP_CMD_ADMIN
+ ADMIN Módosítja a Szervíz admin listát
+OPER_HELP_CMD_STAFF
+ STAFF Kijelzi a szervízt és aktív állapotát
+OPER_HELP_CMD_MODE
+ MODE Váltóztatja a szoba módot
+OPER_HELP_CMD_KICK
+ KICK Kirúgja a felhasználót csatornáról
+OPER_HELP_CMD_CLEARMODES
+ CLEARMODES Törli a szoba módot
+OPER_HELP_CMD_KILLCLONES
+ KILLCLONES Killeli az összes klónt a hosztról
+OPER_HELP_CMD_AKILL
+ AKILL Szerkeszti az AKILL listát
+OPER_HELP_CMD_SGLINE
+ SGLINE Szerkeszti az SGLINE listát
+OPER_HELP_CMD_SQLINE
+ SQLINE Szerkeszti az SQLINE listát
+OPER_HELP_CMD_SZLINE
+ SZLINE Szerkeszti az SZLINE listát
+OPER_HELP_CMD_CHANLIST
+ CHANLIST Listázza az összes csatornát
+OPER_HELP_CMD_USERLIST
+ USERLIST Listázza az összes felhasználót
+OPER_HELP_CMD_LOGONNEWS
+ LOGONNEWS Fellépõ üzenetek beállítása
+OPER_HELP_CMD_RANDOMNEWS
+ RANDOMNEWS Véletlenszerûen megjelenõ üzenetet állít be
+ a felhasználók részére
+OPER_HELP_CMD_OPERNEWS
+ OPERNEWS Operek részére megjelenõ üzenetet állít be
+OPER_HELP_CMD_SESSION
+ SESSION Olvassa a sessionok hoszt listáját
+OPER_HELP_CMD_EXCEPTION
+ EXCEPTION Módosítja a session-korlát/kivétel listát
+OPER_HELP_CMD_NOOP
+ NOOP Ideiglenesen törli az összes O:line-t a szerver
+ távollétében
+OPER_HELP_CMD_JUPE
+ JUPE Létrehoz egy "Jupiter" álszervert.
+OPER_HELP_CMD_IGNORE
+ IGNORE Módosítja a Szervíz mellõzési listáját
+OPER_HELP_CMD_SET
+ SET Beállítja szervíz általános változóit
+OPER_HELP_CMD_RELOAD
+ RELOAD Újratölti a szervíz Konfigurációs fájlját
+OPER_HELP_CMD_UPDATE
+ UPDATE A Szervíz adatbázist frissíti, felülírja
+ lemezre közvetlenül
+OPER_HELP_CMD_RESTART
+ RESTART Menti az adatbázist, és újraindítja a szervízt
+OPER_HELP_CMD_QUIT
+ QUIT Leállítja a szervíz programot mentés nélkül
+OPER_HELP_CMD_SHUTDOWN
+ SHUTDOWN Leállítja a szervíz programot mentéssel
+OPER_HELP_CMD_DEFCON
+ DEFCON Manipulálja a DefCon rendszert
+OPER_HELP_CMD_CHANKILL
+ CHANKILL Kirúgja az összes usert a csatornáról
+OPER_HELP_CMD_OLINE
+ OLINE Operflaget ad a biztos felhasználónak
+OPER_HELP_CMD_UMODE
+ UMODE Felhasználó módok állítása
+OPER_HELP_CMD_SVSNICK
+ SVSNICK Megváltoztatja a felhasználó nicknevét
+OPER_HELP_CMD_MODLOAD
+ MODLOAD Betölti a modult
+OPER_HELP_CMD_MODUNLOAD
+ MODUNLOAD Kitölti a modult
+OPER_HELP_CMD_MODINFO
+ MODINFO Információ a betöltött modulokról
+OPER_HELP_CMD_MODLIST
+ MODLIST Listázza a betöltött modulokat
+
+OPER_HELP
+ %S parancsok:
+
+OPER_HELP_LOGGED
+ Üzenet:Minden %S-nek küldött parancs naplózva van.
+
+OPER_HELP_GLOBAL
+ Syntax: GLOBAL üzenet
+
+ Megengedi, hogy az IRCopok üzenetet küldjenek az összes
+ felhasználónak a hálózaton. Üzenetet a %s nickrõl küldi.
+
+OPER_HELP_STATS
+ Syntax: STATS [AKILL | ALL | RESET]
+
+ Ha választasz valamit, megmutatja az aktuális
+ felhasználók számát, a bejelentkezett IRCopokat (szervizek
+ nélkül), legmagasabb felhasználószámot a szervíz indulása
+ óta, és az idõt amióta fut a szerver.
+
+ Az AKILL beállítással, kijelzi az aktuális maxot az
+ AKILL listán és az aktuális lejárati idõt.
+
+ Az ALL beállítást csak szervíz adminok használhatják és
+ kiírja a szervíz memória használatának információját. Ez a
+ beállítás lefagyaszthatja a szervízt egy rövid idõre nagy
+ hálózat esetén, így nem lehet használni azt.
+
+ A RESET beállítás nullázza az aktuális felhasználók max.
+ számát átírja a jelenlegi felhasználó számra
+
+ UPTIME, a STATS helyett használható.
+
+OPER_HELP_OPER
+ Syntax: OPER ADD nick
+ OPER DEL {nick | sorszám | lista}
+ OPER LIST [maszk | lista]
+ OPER CLEAR
+
+ Megengedi a szervíz root, hogy hozzáadjon/töröljön
+ nicknevet a szervíz operátor listáról. A nick használója
+ aki a szervíz operátor listáján van és be van jelentkezve
+ %s -hoz használni tudja az operátor parancsokat
+
+ Az OPER ADD parancs hozzáad nicknevet a szervíz
+ operátor listához.
+
+ A OPER DEL parancs törli a nicknevet aszervíz operátor
+ listáról. Ha listaszámot ad meg akkor azt a számú
+ felhasználót törli.( lásd a példa listát alul).
+
+ Az OPER LIST kiirja a szervíz operátorok listáját. Ha
+ egy helyettesítõ lej van a maszkban megadva akkor csak
+ az annak megfelelõt írja ki. Ha listaszámot ad meg csak
+ azokat fogja mutatni:példában.
+
+ OPER LIST 2-5,7-9
+ Lista a szervíz operátorokról 2 -töl 5-ig és
+ 7 -tõl 9-ig lévõk.
+
+ Az OPER CLEAR parancs töürli az öszzes nicket a
+ Szervíz operátor listáról.
+
+ Valamennyi IRC operátor használhat OPER LIST parancsot.
+
+OPER_HELP_ADMIN
+ Syntax: ADMIN ADD nick
+ ADMIN DEL { nick | sorszám | lista }
+ ADMIN LIST [ maszk | lista ]
+ ADMIN CLEAR
+
+ Lehetõséget nyújt a Services rootnak, hogy hozzáadjon,
+ töröljön nickneveket a Services adminok listáján. Az
+ a felhasználó, aki szerepel a Szervíz adminok listáján,
+ beazonosított a %s-be hozzáférhet az Admin parancsokhoz.
+
+ ADMIN ADD parancs hozzáad egy felhasználót szervíz
+ admin listához.
+
+ ADMIN DEL parancs törli a felhasználót a szervíz admin
+ listáról. Ha egy sorozatot adsz meg, akkor azok a
+ bejegyzések lesznek törölve. (lásd az alábbiakban)
+
+ ADMIN LIST parancs kiíratja a szervíz adminok listáját.
+ Ha maszk van megadva, csak a megegyezõ maszkot használó
+ bejegyzések lesznek kiírva. Ha a listából bejegyzés
+ sorszámok vannak megadva csak azokat írja ki. Példa:
+
+ ADMIN LIST 2-5,7-9
+ Listázza a szervíz adminokat 2-tõl 5-ig és 7-tõl
+ 9-ig.
+
+ ADMIN CLEAR parancs törli az összes bejegyzész a szervíz
+ adminok listájából.
+
+ Az IRC operátorok használhatják az ADMIN LIST parancsot.
+ Összes egyébb parancs korlátozva Szervíz root részére.
+
+OPER_HELP_IGNORE
+ Syntax: IGNORE {ADD|DEL|LIST|CLEAR} [time] [nick | mask]
+
+ Allows Services Admins to make Services ignore a nick or mask
+ 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.
+ When adding a mask, it should be in the format user@host
+ or nick!user@host, everything else will be considered a nick.
+ Wildcards are permitted.
+
+ Ignores will not be enforced on IRC Operators.
+
+OPER_HELP_MODE
+ Syntax: MODE #szoba módok
+
+ Megengedi a szervíz operátornak, hogy szoba módokat
+ állítson. Parameterek ugyanazok mint a szabvány
+ /MODE parancsnál
+
+ Korlátozva Szervíz operatornak.
+
+OPER_HELP_UMODE
+ Syntax: UMODE user módok
+
+ Megengedi a szervíz adminoknak, hogy egy user felhasználói
+ módjait megváltoztassa. Parameterek ugyanazok mint a
+ szabvány /MODE parancsnál.
+
+ Korlátozva Szuper adminnak.
+
+OPER_HELP_OLINE
+ Syntax: OLINE user flagek
+
+ Lehetõséget ad a szervíz adminnak, hogy egy usernek
+ operflaget adjon. Elõjelként "+" vagy "-" adható meg.
+ Ha csak a "-" paraméter adod meg akkor mindent eltávolít.
+
+ Korlátozva Szuper adminnak.
+
+OPER_HELP_CLEARMODES
+ Syntax: CLEARMODES szoba [ALL]
+
+ Töröl minden módot (i,k,l,m,n,p,s,t)és kitiltást a
+ csatornáról. Ha az ALL-t megadod akkor eltávolítja
+ az op és voice jogokat (+o és +v módot) a csatornán.
+
+ Korlátozva Szervíz operátornak.
+
+OPER_HELP_KICK
+ Syntax: KICK #szoba user indok
+
+ Lehetoséget nyújt az IRCopoknak, hogy bármelyik szobából
+ kirúgjanak egy felhasználót. A paraméterek ugyanazok,
+ mint a szabványos /KICK parancsnál. A kirúgási üzenetben
+ benne lesz a KIK parancsot küldõ IRCop nickneve; például:
+
+ ***xy ki lett rúgva a #csatornáról %S által.(op(csak))
+
+ Korlátozva Szervíz operatornak.
+
+OPER_HELP_SVSNICK
+ Syntax: SVSNICK nick újnick
+
+ Erõszakkal meváltóztatja a user nickevét újnicknévre.
+ Limited to Super Admins.
+
+OPER_HELP_AKILL
+ Syntax: AKILL ADD [ +lejárat] maszk indok
+ AKILL DEL {maszk | sor-szám | list}
+ AKILL LIST [maszk | list]
+ AKILL VIEW [maszk | list]
+ AKILL CLEAR
+
+ Lehetõséget ad a szervíz opoknak, hogy karbantartsák az
+ AKILL listát. Ha egy felhasználó az AKILL maszkkal egyezõ
+ cimrõl próbál csatlakozni , akkor szervíz kiad egy KILL
+ parancsot a nickre, és a támogatott szervertípusokon arra
+ utasít minden szervert, hogy adjon K-linet a maszknak.
+
+ AKILL ADD hozzáadja a megadott user@host/ip maszkot az
+ AKILL listára a megadott indokkal (amit meg kell adnod).
+ Az elévülést egész számmot kovet egy idõparaméter d (nap),
+ h (óra), m (perc).Ezek kombinálása nem lehetséges(1h30m).
+ ha nem adsz meg idõegységet akkor önmagában napot jelent.
+ (+30 az 30 napot jelent).Ha +0-át adsz meg akkor nem
+ elévülõ lesz.Ha a usermaszk + -al kezdõdik akkor elévülést
+ meg kell adni akkor is ha megegyezik az alapértelmezéssel.
+ Az AKILL jelenlegi alapértelmezett elévüólési ideje
+ megnézhetõ a STATS AKILL paranccsal.
+
+ AKILL DEL törli a maszkot az AKILL listáról, ha rajta
+ van. Ha bejegyzés sorszámot adsz meg akkor azok fognak
+ törlõdni.(lásd a példát alább)
+ AKILL LIST kiirja a jelenlegi AKILL listát. Ha egy
+ "*" karakteres maszk van megadva, akkor csak azokat az
+ AKILL-eket listázza, amelyek ráillenek a megadott maszkra.
+ Ha sorszámot adsz meg akkor azok fognak törlõdni. Példa:
+
+ AKILL LIST 2-5,7-9
+ Listázza az AKILL-en lévoket 2-tõl 5-ig és 7-tõl 9-ig
+ az AKILL listából
+
+ AKILL VIEW részletesebb verziója az AKILL LIST-nek,
+ amely megmutatja, hogy ki vette fel az AKILL-t, mikor lett
+ felvéve és mikor jár le, éppúgy, felhasználó@gazdanév
+ maszkot és indokot.
+
+ AKILL CLEAR töröli az összes AKILL bejegyzést.
+
+ Korlátozva Szervíz operatornak.
+
+OPER_HELP_SGLINE
+ Syntax: SGLINE ADD [+lejárat] maszk:indok
+ SGLINE DEL {maszk | sor-szám | list}
+ SGLINE LIST [maszk | list]
+ SGLINE VIEW [maszk | list]
+ SGLINE CLEAR
+
+ Lehetõséget ad a szervíz opoknak, hogy karbantartsák az
+ SGLINE listát. Ha egy felhasználó egy valós névvel akar
+ csatlakozni , ami szerepel az SGLINE listán akkor szervíz
+ nem fogja engedélyezni részére a csatlakozást.
+
+ SGLINE ADD hozzáadja a valósnévmaszkot az SGLINE listára
+ a megadott indokkal (amit meg is kell adni).
+ Az elévülést egész számmot kovet egy idoparaméter d (nap),
+ h (óra), m (perc).Ezek kombinálása nem lehetséges(1h30m).
+ ha nem adsz meg idoegységet akkor önmagában napot jelent.
+ (+30 az 30 napot jelent).Ha +0-át adsz meg akkor nem
+ elévülo lesz.Ha a usermaszk + -al kezdodik akkor elévülést
+ meg kell adni akkor is ha megegyezik az alapértelmezéssel.
+ Az SGLINE jelenlegi alapértelmezett elévülési ideje
+ megnézheto a STATS AKILL paranccsal.
+ Jegyzet: a valósnév maszkja tartalmazhat szóközt ezért
+ közte és az indok között az elválasztó karakter a vesszõ.
+ SGLINE DEL eltávolítja a megadott maszkot az SGLINE listáról,
+ ha jelen van.Ha bejegyzés sorszámot adsz meg akkor azok fognak
+ törlodni. (Lásd a példa alább)
+ SGLINE LIST kiirja az összes SGLINE bejegyzést; ha
+ egy tetszõleges maszk meg van adva, a lista korlátozva lesz
+ azokra a bejegyzésekre, amelyekre ráillik a maszk. Példa:
+
+ SGLINE LIST 2-5,7-9
+ Listázza a SGLINE-okat 2-töl 5-ig és 7-tõl 9-ig az
+ SGLINE listáról
+
+ SGLINE VIEW részletesebb verziója a SGLINE LIST-nek,
+ és megmutatja, ki készítette a SGLINE bejegyzéseket,
+ és mikor jár le, mint a maszkot és az indokot.
+ SGLINE CLEAR törli az SGLINE bejegyzéseket.
+
+ Korlátozva Szervíz operatornak.
+
+OPER_HELP_SQLINE
+ Syntax: SQLINE ADD [+lejárat] maszk indok
+ SQLINE DEL {maszk | sor-szám | list}
+ SQLINE LIST [maszk | list]
+ SQLINE VIEW [maszk | list]
+ SQLINE CLEAR
+
+ Engedélyezi a operátoroknak, hogy karbantartsák az SQLINE
+ listát. Ha egy felhasználó "nick-je" ráillik egy SQLINe
+ maszkra, megpróbál csatlakozni, a szervíz nem fogja engedni
+ az egész irc-n.
+
+ Ha az elsõ karakter a maszkban #, szervíz meg fogja elõzni
+ a használatát Az ilyen csatornáknak (az IRCD-k ezt
+ támogatják).
+
+ SQLINE ADD hozzáadja az adott maszkot az SQLINE listához
+ a megadott indokkal (amit meg kell adni).Az elévülést is,
+ egész számmot követ egy idöparaméter d (nap),h (óra),
+ m (perc).Ezek kombinálása nem lehetséges(1h30m).
+ Ha nem adsz meg idöegységet akkor önmagában napot jelent.
+ (+30 az 30 napot jelent).Ha +0-át adsz meg akkor nem
+ elévülo lesz.Ha a usermaszk + -al kezdodik akkor elévülést
+ meg kell adni akkor is ha megegyezik az alapértelmezéssel.
+ Az SQLINE jelenlegi alapértelmezett elévülési ideje
+ megnézheto a STATS AKILL paranccsal.
+ SQLINE DEL eltávolítja a maszkot az SQLINE listáról,
+ ha jelen van.Ha bejegyzés sorszámot adsz meg akkor azok
+ fognak törlõdni. (Lásd a példa alább)
+ SQLINE LIST kiirja az összes SQLINE bejegyzést; ha
+ egy tetszöleges maszk meg van adva, a lista korlátozva lesz
+ azokra a bejegyzésekre, amelyekre ráillik a maszk. Példa:
+
+ SQINE LIST 2-5,7-9
+ Listázza a SQLINE-okat 2-töl 5-ig és 7-tol 9-ig az
+ SQLINE listáról
+
+ SQLINE VIEW részletesebb verziója a SQLINE LIST-nek,
+ és megmutatja, ki készítette a SGLINE bejegyzéseket,
+ és mikor jár le, mint a maszkot és az indokot.
+ SQLINE CLEAR törli az SQLINE bejegyzéseket.
+
+ Korlátozva Szervíz operatornak.
+
+OPER_HELP_SZLINE
+ Syntax: SZLINE ADD [+lejárat] maszk indok
+ SZLINE DEL {maszk | sorszám | list}
+ SZLINE LIST [maszk | list]
+ SZLINE VIEW [maszk | list]
+ SZLINE CLEAR
+
+ Lehetöséget nyújt az operátoroknak, hogy karbantartsák az
+ SZLINE listát. Ha egy felhasználó, IP címe ráillik egy
+ SZLINE maszkra, csatlakozni akar, a szervíz nem fogaj azt
+ megengedni( és ez lehet IP vagy PTR RR vagy not)
+ SZLINE ADD hozzáadja az adott maszkot az SZLINE listához
+ a megadott indokkal (amit meg kell adni).Az elévülést is,
+ egész számmot követ egy idöparaméter d (nap),h (óra),
+ m (perc).Ezek kombinálása nem lehetséges(1h30m).
+ Ha nem adsz meg idöegységet akkor önmagában napot jelent.
+ (+30 az 30 napot jelent).Ha +0-át adsz meg akkor nem
+ elévülo lesz.Ha a usermaszk + -al kezdodik akkor elévülést
+ meg kell adni akkor is ha megegyezik az alapértelmezéssel.
+ Az SZLINE jelenlegi alapértelmezett elévülési ideje
+ megnézheto a STATS AKILL paranccsal.
+ SZLINE DEL eltávolítja a maszkot az SZLINE listáról,
+ ha jelen van.Ha bejegyzés sorszámot adsz meg akkor azok
+ fognak törlodni. (Lásd a példa alább)
+ SZLINE LIST kiirja az összes SQLINE bejegyzést; ha
+ egy tetszöleges maszk meg van adva, a lista korlátozva lesz
+ azokra a bejegyzésekre, amelyekre ráillik a maszk. Példa:
+
+ SZINE LIST 2-5,7-9
+ Listázza a SZLINE-okat 2-töl 5-ig és 7-tol 9-ig az
+ SZLINE listáról
+
+
+ SZLINE VIEW részletesebb verziója a SZLINE LIST-nek,
+ és megmutatja, ki készítette a SZLINE bejegyzéseket,
+ és mikor jár le, mint az IP-t és az indokot.
+
+ SQLINE CLEAR törli az SQLINE bejegyzéseket.
+
+ Korlátozva Szervíz operatornak.
+
+OPER_HELP_SET
+ Syntax: SET opció beállítás
+
+ Beállítja a Services általános opcióit.
+ A lehetséges opciók:
+ READONLY Csak-olvasás vagy olvasás-írás mód beállítása
+ LOGCHAN Kiírja a naplózott üzeneteket a csatornára
+ DEBUG Bekapcsolja/kikapcsolja a debug módot
+ NOEXPIRE Bekapcsolja/kikapcsolja a nem elévülõ módot
+ SUPERADMIN Bekapcsolja/kikapcsolja a super-admin módot
+ SQL Activate or deactivate sql mode
+ IGNORE Activate or deactivate ignore mode
+ LIST List the options
+
+ Korlátozva Szervíz adminnak.
+
+OPER_HELP_SET_READONLY
+ Syntax: SET READONLY {ON | OFF}
+
+ Csak-olvasás mód aktiválása/kikapcsolása. A csak-olvasás
+ mód, a normal felhasználó részére nem engedi, hogy bármit
+ módosítson a szervízben, beleértve a nicknév, a
+ hozzáférés listát, stb. IRCoperátorok a megfelelõ flaggel
+ módosítani tudja a szervíz akill listát és a droppolhat
+ vagy forbidolhat nickneveket és szobákat, de ez nem fog
+ kerül mentésre, amíg a csak olvasni módot kikapcsolja
+ és restartolja a szervízt.
+
+ Ez a parancs egyenértéku a parancs-sorban kiadott
+ -readonly opcióval.
+
+
+OPER_HELP_SET_LOGCHAN
+ Syntax: SET LOGCHAN {ON | OFF}
+
+ Beállítja, hogy a szervíz a naplózó csatornára küldje el
+ a részletes napló adatokat és persze a naplófájlba.
+ A Naplózó Csatornát (LogChannel) meg kell határozni a
+ szervíz config fáljában, hogy használhasd ezt az opciót.
+
+ This option is equivalent to the command-line option -logchan.
+
+ Jegyzet: súlyos biztonsági gondokat okozhat, ha ez a
+ naplózó szoba nincs kellõen védve.
+
+OPER_HELP_SET_DEBUG
+ Syntax: SET DEBUG {ON | OFF | szám}
+
+ Be vagy kikapcsolja a debug módot. Debug módban, minden a
+ Szervíznek és a szervíz által küldött üzenet és persze még
+ sok más üzenet rögzítésere kerül a naplófájlban. Ha megadsz
+ számot is, akkor a debug mód bekapcsol és a megadott szinten
+ fog muködni.
+
+ Ez az opció megegyezik a parancs-sorban kiadható opcióval:
+ -debug.
+
+OPER_HELP_SET_NOEXPIRE
+ Syntax: SET NOEXPIRE {ON | OFF}
+
+ Bekapcsolja a nem elévülést. A nem elévülõ módban nickek,
+ csatornák, akillek és kivételek rakhatóak nem elévülõre is
+ amíg ezt az opciót nem kapcsolod ki.
+
+ Ez az opció megegyezik a parancs-sorban kiadható opcióval:
+ -noexpire.
+
+OPER_HELP_SET_SUPERADMIN
+ Syntax: SET SUPERADMIN {ON | OFF}
+
+ Ez a beállítás extra jogokat biztosít számodra, például
+ az "összes szoba founderje" stb...
+
+ Ez az opció nem ajánlott, csak akkor használd, ha
+ szükséges és kapcsold ki, ha már nem.
+
+OPER_HELP_SET_SQL
+ Syntax: SET SQL {ON | OFF}
+
+ Setting this will toggle Anope's from usage of SQL, this should
+ be used to disable and enable SQL should your SQL server go down
+ while services are running.
+
+OPER_HELP_SET_IGNORE
+ Syntax: SET IGNORE {ON | OFF}
+
+ Setting this will toggle Anope's usage of the IGNORE system
+ on or off.
+
+OPER_HELP_SET_LIST
+ Syntax: SET LIST
+
+ Display the various %S settings
+
+OPER_HELP_NOOP
+ Syntax: NOOP SET szerver
+ NOOP REVOKE szerver
+
+ NOOP SET levesz minden O:line-t a megadott
+ szerver-en és killel minden IRCopot, aki fent van
+ megelõzvén a szerver rehasholását (mert ez
+ törölné a hatást).
+
+ NOOP REVOKE minden levett O:line-t újra elérhetõvé tesz
+ a megadott szerver-en.
+
+ Jegyzet: A szerver paramétert nem ellenõrzi
+ a Szerviz.
+
+ Korlátozva Szervíz adminoknak.
+
+OPER_HELP_JUPE
+ Syntax: JUPE server [leirás]
+
+ 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.
+
+ Korlátozva Szervíz adminoknak.
+
+OPER_HELP_RAW
+ Syntax: RAW szöveg
+
+ 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!
+
+ Korlátozva Szervíz adminoknak.
+
+OPER_HELP_UPDATE
+ Syntax: UPDATE
+
+ Menti a Szervíz adatbázisát, azonnal amint kiadtad
+ a parancsot.
+
+ Korlátozva Szervíz adminoknak.
+
+OPER_HELP_RELOAD
+ Syntax: RELOAD
+
+ Újratölti a Szervíz konfigurációs fájlját. Jegyzet: néhány
+ direktívának ettõl függetlenül restart kell, hogy hatása
+ életbe lépjen. (Például a Szervíz egységek nicknév váltása
+ vagy session korlátozás aktíválása, stb.)
+
+ Korlátozva Szervíz adminoknak.
+
+OPER_HELP_QUIT
+ Syntax: QUIT
+
+ A Szervíz azonnal leáll; az adatbázist nem menti el.
+ Ez a parancs annak elkerülésére hasznos, hogy a memóriában
+ lévõ adatok másolata bekerüljön az adatbázisba.
+ Normál leállításokhoz használd kérlek a
+ SHUTDOWN parancsot!
+
+ Korlátozva Services adminoknak.
+
+OPER_HELP_SHUTDOWN
+ Syntax: SHUTDOWN
+
+ Menti a Szervíz adatbázisát, majd leállítja a programot.
+
+ Korlátozva Szervíz adminoknak.
+
+OPER_HELP_RESTART
+ Syntax: RESTART
+
+ Menti a Szervíz adatbázisát, majd újraindítja a programot.
+ (Kilép, majd újraindul.)
+
+ Korlátozva Szervíz adminoknak.
+
+OPER_HELP_CHANLIST
+ Syntax: CHANLIST [{pattern | nick} [SECRET]]
+
+ Listáz minden csatornát, ami most aktív az IRC hálózaton
+ attól függetlenül, hogy regisztrált vagy sem.
+
+ Ha a pattern meg van adva, akkor csak az egyezõket
+ listázza. Ha a nicknév van megadva, akkor listázza azokat
+ a csatornákat, ahol az adott user bent van. Ha a SECRET
+ van megadva, akkor listáz minden pattern-nek megfelelõ
+ csatornár, melyen +s vagy +p mód van fent.
+
+ Korlátozva Szervíz adminoknak.
+
+OPER_HELP_USERLIST
+ Syntax: USERLIST [{pattern | #szoba} [INVISIBLE]]
+
+ Listáz minden jelenleg online usert az IRC hálózaton,
+ attól függetlenül, hogy regisztrált vagy sem.
+
+ Ha a pattern meg van adva, akkor csak az egyezõket
+ listázza (formátum: nick!user@host). Ha a #szoba
+ meg van adva, akkor csak az adott csatornán lévõket
+ listázza. Ha az INVISIBLE meg van adva, akkor csak a
+ +i flages usereket listázza.
+
+ Korlátozva Szervíz adminoknak.
+
+OPER_HELP_MODLOAD
+ Syntax: MODLOAD Fájlnév
+
+ Ez a parancs betölti azt modult, a modules könyvtárból,
+ amelyiknek a fájlnevét megadtad.
+
+ Korlátozva Szervíz Rootnak.
+
+OPER_HELP_MODUNLOAD
+ Syntax: MODUNLOAD FileName
+
+ Ez a parancs kitölti a megnevezett fájlnevû msdult a
+ modulok listájából.
+
+ Korlátozva Szervíz Rootnak.
+
+OPER_HELP_MODINFO
+ Syntax: MODINFO Fájlnév
+
+ A parancs részletes információt ad a betöltött modulokról.
+
+ Korlátozva Szervíz Rootnak.
+
+OPER_HELP_MODLIST
+ Syntax: MODLIST [Core|3rd|protocol|encryption|supported|qatested]
+
+ Listázza az összes betöltött aktív modult.
+
+ Korlátozva Szervíz Rootnak.
+
+###########################################################
+#
+# BotServ help üzenetek
+#
+###########################################################
+
+BOT_HELP_CMD_BOTLIST
+ BOTLIST Listázza az elérhetõ botokat
+BOT_HELP_CMD_ASSIGN
+ ASSIGN Társít egy botot a csatornához
+BOT_HELP_CMD_SET
+ SET Konfigurálja a bot opcióit
+BOT_HELP_CMD_KICK
+ KICK Konfigurálja a kirúgásokat
+BOT_HELP_CMD_BADWORDS
+ BADWORDS Szerkeszti a tiltott szavak listáját
+BOT_HELP_CMD_ACT
+ ACT Makes the bot do the equivalent of a "/me" command
+BOT_HELP_CMD_INFO
+ INFO Allows you to see BotServ information about a channel or a bot
+BOT_HELP_CMD_SAY
+ SAY Makes the bot say the given text on the given channel
+BOT_HELP_CMD_UNASSIGN
+ UNASSIGN Unassigns a bot from a channel
+BOT_HELP_CMD_BOT
+ BOT Karbantartja a hálózat botjainak listáját
+
+BOT_HELP
+
+ %S lehetõvé teszi, hogy botod legyen a csatornádon.
+ Ezt olyan felhasználók számára készítették, akik
+ nem tudnak saját botot futtatni, vagy a hálózaton nem
+ engedélyezik ezt. Az elérhetõ parancsok listája alább
+ található; használatukhoz írd be %R%S parancs.
+ Bõvebb információt így kaphatsz az adott parancsról:
+ %R%S HELP parancs.
+
+BOT_HELP_FOOTER
+ A Bot akkor fog belépni a csatornára, ha legalább
+
+ %d felhasználó van bent.
+
+BOT_HELP_BOTLIST
+ Syntax: BOTLIST
+
+ Listázza az összes érvényes botot a hálózatról.
+
+BOT_HELP_ASSIGN
+ Syntax: ASSIGN #szoba nick
+
+ Társítja a megnevezett botot a szobához. Beállíthatod a
+ botodat a csatornád igényeidnek megfelelõen.
+ Kellemes botozást! :-)
+
+BOT_HELP_UNASSIGN
+ Syntax: UNASSIGN #szoba
+
+ Eltávolítja a botot a csatornáról. Ha használod ezt a
+ parancsot, akkor a botod nem fog többet belépni a
+ szobába. A bot konfigurációi megmaradnak.
+ Azaz nem kell újra bekonfigurálnod, ha késõbb vissza
+ akarod hozni a szobádba.
+
+BOT_HELP_INFO
+ Syntax: INFO {#szoba | nick}
+
+ Lehetõvé teszi, hogy megnézd a %S információkat egy
+ csatornával vagy bottal kapcsolatban. Ha a paraméter
+ szobanév, akkor megkapod a szobára vonatkozó bot
+ beállításokat. Ha a paraméter nick, akkor a botról
+ kapsz információkat, például létrehozás ideje, csatornák
+ száma.
+
+BOT_HELP_SET
+ Syntax: SET #szoba opció paraméterek
+
+ Beállítja a bot opcióit. Az opció a következõ lehet:
+
+ DONTKICKOPS Védelem az opoknak bot kirúgás ellen
+ DONTKICKVOICES Védelem a voicesokna bot kirúgás ellen
+ GREET Engedélyezi a köszöntõ üzenetet
+ FANTASY Engedélyezi a fantaisi parancsokat
+ SYMBIOSIS Megengedi, hogy a bot olyan legyen mint
+ az igazi botok
+
+ Írd be %R%S HELP SET opció bõvebb információkért
+ az adott opcióról.
+
+ Megjegyzés: ezekhez a parancsokhoz a hozzáférést a
+ levels-ben lehet állítani.
+
+BOT_HELP_SET_DONTKICKOPS
+ Syntax: SET #szoba DONTKICKOPS {ON|OFF}
+
+ Engedélyezi vagy tiltja opok védelmét a csatornán.
+ Ha engedélyezve van, akkor az opokat nem fogja a bot
+ kirúgni, akkor se, ha nem egyeznek meg a NOKICK szinttel
+
+BOT_HELP_SET_DONTKICKVOICES
+ Syntax: SET #szoba DONTKICKVOICES { ON|OFF }
+
+ Engedélyezi vagy tiltja hangadók védelmét a csatornán.
+ Ha engedélyezve van, akkor a hangadókat nem fogja a bot
+ kirúgni, akkor se, ha nem egyeznek meg a NOKICK szinttel
+
+BOT_HELP_SET_FANTASY
+ Syntax: SET #szoba FANTASY { ON|OFF }
+
+ Engedélyezi vagy tiltja fantasy módot a csatornán.
+ Ha engedélyezve van, akkor a következõ parancsok
+ használhatók a csatornán: !op, !deop, !voice, !devoice,
+ !kick, !kb, !unban, !seen (találd ki hogyan kell
+ használni õket; próbáld meg nick megadásával, a nélkül
+ is)
+
+ Azoknak akik ezeket a parancsokat akarják használni
+ rendelkezniük KELL a szükség szinttel mind a FANTASIA
+ mind pedig az egyéb szintekkel, ami a parancshoz
+ szükséges. (például, az !op használatához, meg kell
+ legyen a megfelelõ szintjük az OPDEOP parancsokhoz.).
+
+BOT_HELP_SET_GREET
+ Syntax: SET #szoba GREET { ON|OFF }
+
+ Engedélyezi vagy tiltja Köszöntõ módot a csatornán.
+ Ha engedélyezve van, akkor a bot megjeleníti azoknak
+ a köszöntõ üzenetét, akiknek a szintjük megfelelõ ehhez.
+
+BOT_HELP_SET_SYMBIOSIS
+ Syntax: SET #szoba SYMBIOSIS { ON|OFF }
+
+ Engedélyezi vagy tiltja symbiosis módot a csatornán.
+ Ha engedélyezve van, akkor a bot fog mindent csinálni,
+ amit egyébként a %s csinálna a csatornán, mint MODE,
+ KICK, és a belépõüzenet kiírása.
+
+BOT_HELP_KICK
+ Syntax: KICK #szobaopcióparaméterek
+
+ Bot kirúgások beállítása. Az opció a következõ lehet:
+
+ BOLDS A bot kirúgja félkövér betûkkel írókat
+ BADWORDS A bot kirúgja a csúnyaszavakat használókat
+ CAPS A bot kirúgja CapsLock használókat
+ COLORS A bot kirúgja szinesen írókat
+ FLOOD A bot kirúgja floodolókat
+ REPEAT A bot kirúgja az önmagukat
+ ismétlõket.
+ REVERSES A bot kirúgja visszafelé írókat
+ UNDERLINES A bot kirúgja aláhúzással írókat
+
+ Írd be %R%S HELP KICK opció az adott opcióval
+ kapcsolatos bõvebb információkért.
+
+ Megjegyzés: A parancshoz való hozzáférést a level SET-ben
+ lehet korlátozni.
+
+BOT_HELP_KICK_BOLDS
+ Syntax: KICK #szoba BOLDS { ON|OFF } [ ttb ]
+
+ Beállítja a félkövér írásért járó kirúgást.
+ Ha engedélyezve van akkor a bot kirúg a félkövér betûkért.
+
+ A ttb a banolás elotti kickek száma.
+ Ha nem adod meg, akkor csak kirúgást eszközöl a bot.
+ Ha megadod a ttb-t, akkor x kirúgás után banol a bot.
+
+BOT_HELP_KICK_COLORS
+ Syntax: KICK #szoba COLORS { ON|OFF } [ ttb ]
+
+ Beállítja a szines írásért járó kirúgást.
+ Ha engedélyezve van akkor a bot kirúgja a színesen írókat.
+
+ A ttb a banolás elõtti kickek száma.
+ Ha nem adod meg, akkor csak kirúgást eszközöl a bot.
+ Ha megadod a ttb-t, akkor x kirúgás után banol a bot.
+
+BOT_HELP_KICK_REVERSES
+ Syntax: KICK #szobaREVERSES { ON|OFF } [ ttb ]
+
+ Beállítja a visszafelé írásért járó kirúgást.
+ Ha engedélyezve van akkor a bot kirúgja a reverse írókat.
+
+ A ttb a banolás elõtti kickek száma.
+ Ha nem adod meg, akkor csak kirúgást eszközöl a bot.
+ Ha megadod a ttb-t, akkor x kirúgás után banol a bot.
+
+BOT_HELP_KICK_UNDERLINES
+ Syntax: KICK #szobaUNDERLINES { ON|OFF } [ ttb ]
+
+ Beállítja az aláhúzott írásért járó kirúgást.
+ Ha engedélyezve van akkor a bot kirúgja az aláhúzva írókat
+
+ A ttb a banolás elõtti kickek száma.
+ Ha nem adod meg, akkor csak kirúgást eszközöl a bot.
+ Ha megadod a ttb-t, akkor x kirúgás után banol a bot.
+
+BOT_HELP_KICK_CAPS
+ Syntax: KICK #szobaCAPS { ON|OFF } [ ttb [ min [ százalék ]]]
+
+ Beállítja a túlzott caps miatt járó kirúgást.
+ Ha engedélyezve van, akkor a bot kirúgja a "kiabálókat".
+
+ A bot csak akkor rúgja ki a usert, ha legalább min számú
+ betû van és ez legalább százaléka%% az összes szövegnek
+ a sorban (ha nincs megadva, akkor 10 karakter a min és
+ annak legalább a 25%-a az alapbeállítás)
+
+ A ttb a banolás elõtti kickek száma.
+ Ha nem adod meg, akkor csak kirúgást eszközöl a bot.
+ Ha megadod a ttb-t, akkor x kirúgás után banol a bot.
+
+BOT_HELP_KICK_FLOOD
+ Syntax: KICK #szoba FLOOD { ON|OFF } [ ttb [ sor [ mp ]]]
+
+ Beállítja a flood miatti kirúgást. Ha engedélyezve van
+ akkor a bot kirúgja a floodoló usereket, ha legalább
+ sor számú sort írtak mp másodpercnyi idõ alatt.
+ (ha nincs megadva, akkor 6 sor és 10 mp alatt).
+
+ A ttb a banolás elõtti kickek száma.
+ Ha nem adod meg, akkor csak kirúgást eszközöl a bot.
+ Ha megadod a ttb-t, akkor x kirúgás után banol a bot.
+
+BOT_HELP_KICK_REPEAT
+ Syntax: KICK #szoba REPEAT { ON|OFF } [ ttb [ szám ]]
+
+ Beállítja az ismétlés miatti kirúgást. Ha engedélyezve
+ van az opció, akkor a bot kirúgja az önmagukat ismétlõ
+ usereket, ha szám alkalommal ismételtek.
+ (Ha nem adsz meg értéket, akkor az érték 3 lesz)
+
+ A ttb a banolás elõtti kickek száma.
+ Ha nem adod meg, akkor csak kirúgást eszközöl a bot.
+ Ha megadod a ttb-t, akkor x kirúgás után banol a bot.
+
+BOT_HELP_KICK_BADWORDS
+ Syntax: KICK #szoba BADWORDS {ON|OFF} [ttb]
+
+ Beállítja a csúnyaszavak miatti kirúgást. Ha engedélyezve
+ van, akkor a bot kirúgja azt, aki kiejt egy olyan szót,
+ ami szerepel a csúnyaszavak listáján.
+
+ A csúnyaszavak listáját a csatornádhoz neked kell megadnod
+ A BADWORDS paranccsal. Írd be %R%S HELP BADWORDS
+ bõvebb információkért.
+
+ A ttb a banolás elotti kickek száma.
+ Ha nem adod meg, akkor csak kirúgást eszközöl a bot.
+ Ha megadod a ttb-t, akkor x kirúgás után banol a bot.
+
+BOT_HELP_BADWORDS
+ Syntax:BADWORDS #szoba ADD szó [SINGLE | START | END]
+ BADWORDS #szoba DEL { szó | sorszám | list}
+ BADWORDS #szoba LIST [ maszk | list]
+ BADWORDS #szoba CLEAR
+
+ Karbantartja a szoba csúnyaszó listáját. A tiltott
+ szavak listája meghatározza, hogy mely szavak kiejtésére
+ rúgja ki a bot a usert, ha a kirúgás engedélyezve van,
+ errõl bõvebb információk: %R%S HELP KICK BADWORDS.
+
+ A BADWORDS ADD parancs hozzáad egy szót a listához.
+ Ha a SINGLE van megadva, akkor lesz kirúgja a user, ha
+ a konkrét szót mondja ki.
+ Ha a START van megadva, akkor a szó elejét figyeli a bot.
+ Ha az END van megadva, akkor a szó végét figyeli a bot.
+ Ha nem adsz meg semmit, akkor a user minden alkalommal
+ kirúgásra kerül, ha kiejti a szót.
+ Ha nem beszél csúnyán, akkor semmi baja nem lesz! :-)
+
+ A BADWORDS DEL parancs eltávolítja a megadott szót
+ a tiltott szavak listájáról. Ha egy sorozatot adsz meg
+ a bejegyzések számával, akkor azok a bejegyzések kerülnek
+ törlésre. (Lásd lentebb a listázást.)
+
+ A BADWORDS LIST parancs megjeleníti a tiltott szavakat.
+ Ha használod a * karaktert, akkor csak az egyezõ
+ bejegyzések kerülnek listázásra. Ha egy sorozatot adsz meg
+ akkor azok a bejegyzések kerülnek megjelenítésre; példa:
+
+ BADWORDS #szoba LIST 2-5,7-9
+ Listázza a csúnyaszavakat 2-tõl 5-ig és a 7-tõl
+ 9-ig.
+
+ BADWORDS CLEAR parancs törli az összes bejegyzést
+ a tiltott szavak listájáról
+
+BOT_HELP_SAY
+ Syntax: SAY #szoba szöveg
+
+ Elküldi a bot a megadott szöveget a csatornára.
+
+BOT_HELP_ACT
+ Syntax: ACT #szoba szöveg
+
+ A bot "/me" akcióval küldi el a megadott szöveget
+ a csatornára.
+
+BOT_SERVADMIN_HELP_BOT
+ Syntax: BOT ADD nick user hoszt valós
+ BOT CHANGE réginick újnick [user [ hoszt [ valós ]]]
+ BOT DEL nick
+
+ Lehetõvé teszi a Services adminoknak, hogy létrehozzanak
+ töröljenek, módosítsanak botokat, amiket a userek
+ használhatnak a csatornáikon.
+
+ BOT ADD hozzáad egy botot a megadott nick, usernév,
+ hostnév és valósnév használatával. Amióta nincs ellenõrzés
+ kérlek óvatósan használd ezt a parancsot.
+ BOT CHANGE megváltoztatja egy bot nickjét, usernevét,
+ hostnevét, valósnevét, anélkül hogy törölni kellene
+ (minden adat, beállítás megmarad benne.)
+ BOT DEL törli a megadott botot a listából.
+
+ Megjegyzés: ha létrehozol egy botot, egy már regisztrált
+ nickkel, akkor a nick dropolva lesz. Akkor is, ha a user
+ éppen használja a nicket; killelve lesz.
+
+BOT_SERVADMIN_HELP_SET
+
+ Ezeket az opciókat csak Szervíz adminok használhatják:
+
+ NOBOT Megelõzi, hogy egy botot társítani lehessen
+ csatornához
+ PRIVATE Megelõzi, hogy egy botot nem IRCop személy
+ társíthasson
+
+BOT_SERVADMIN_HELP_SET_NOBOT
+ Syntax: SET #szoba NOBOT {ON|OFF}
+
+ Ez az opció a botot szobához társíthatatlanná teszi.
+ Ha egy bot már társítva van egy csatornához
+ akkor törlödik onnan, ha ezt az opciót bekapcsolod.
+
+ Korlátozva Szervíz adminoknak.
+
+BOT_SERVADMIN_HELP_SET_PRIVATE
+ Syntax: SET bot-nick PRIVATE {ON|OFF}
+
+ Ez az opció megelõzi, hogy az adott botot a csatornához
+ nem IRC operátor személyek társíthassák.
+
+ Korlátozva Szervíz adminoknak.
+
+###########################################################
+#
+# HostServ üzenetek
+#
+###########################################################
+HOST_EMPTY
+ A vhost lista üres.
+HOST_ENTRY
+ #%d Nick:%s, vhost:%s (%s - %s)
+HOST_IDENT_ENTRY
+ #%d Nick:%s, vhost:%s@%s (%s - %s)
+HOST_SET
+ %s vhostja erre változott: %s.
+HOST_IDENT_SET
+ %s vhostja erre változott: %s@%s.
+HOST_SETALL
+ A %s csoport vhostja %s lett.
+HOST_DELALL
+ A %s csoport vhostja törölve.
+HOST_DELALL_SYNTAX
+ Syntax: DELALL <nick>.
+HOST_IDENT_SETALL
+ A %s csoport vhostja erre változott: %s@%s.
+HOST_SET_ERROR
+ A vhost hosztmaszknak érvényes formátumban kell lennie.
+HOST_SET_IDENT_ERROR
+ A vhost identnek érvényes formátumúnak kell lenni.
+HOST_SET_TOOLONG
+ Hiba! A vhost hoszzú, írj %d karakternél rövidebbet!
+HOST_SET_IDENTTOOLONG
+ Hiba! Az Ident hoszzú, írj %d karakternél rövidebbet!
+HOST_NOREG
+ %s felhasználó nincs a nickserv db fájlban.
+HOST_SET_SYNTAX
+ Syntax %R%s set <nick> <hosztmaszk>.
+HOST_SETALL_SYNTAX
+ Syntax %R%s setall <nick> <hosztmaszk>.
+HOST_DENIED
+ Hozzáférés megtagadva.
+HOST_NOT_ASSIGNED
+ Keress meg egy Operátort és kérj tõle vhostot.
+HOST_ACTIVATED
+ A %s virtuális hosztod aktiválva.
+HOST_IDENT_ACTIVATED
+ A %s@%s virtuális hosztod aktiválva.
+HOST_ID
+ Kérlek azonosíts elõbb a szervízben.
+HOST_NOT_REGED
+ Csak regisztrált nickhez tudsz vhostot társítani.
+HOST_DEL
+ %s vhosztja törölve lett.
+HOST_DEL_SYNTAX
+ Szintaktika: %R%s del <nick>.
+HOST_OFF_UNREAL
+ A vhostod kikapcsolva. Hogy újra használd az alap
+ hosztrejtést írd be /mode %s +%s
+HOST_NO_VIDENT
+ Ön ircdje nem támogatja a videnteket, ha ez nem igaz,
+ akkor kérem jelentse ezt, mint lehetséges hibát.
+HOST_GROUP
+ Az összes user vhosztja a(z) %s csoportba %s lett
+HOST_IDENT_GROUP
+ Az összes user vhosztja a(z) %s csoportba %s@%s lett
+HOST_LIST_FOOTER
+ Kiírja az összes bejegyzést (Számláló: %d)
+HOST_LIST_RANGE_FOOTER
+ Kiírja a bejegyzéseket %d-tól %d-ig
+HOST_LIST_KEY_FOOTER
+ Kiírja azokat a hosztokat melyben a %s szó szerepel.
+ (számláló: %d)
+
+###########################################################
+#
+# HostServ Help üzenetek
+#
+###########################################################
+HOST_HELP_CMD_ON
+ ON Aktiválja a társított vhostot
+HOST_HELP_CMD_OFF
+ OFF Kikapcsolja a társított vhostot
+HOST_HELP_CMD_GROUP
+ GROUP A vhostot a csoport minden tagjára állítja
+HOST_HELP_CMD_SET
+ SET Beállít egy vhosztot a felhasználónak
+HOST_HELP_CMD_SETALL
+ SETALL Beállítja a vhosztot összes nicknek a csoportban
+HOST_HELP_CMD_DEL
+ DEL Törli egy felhasználónak a vhostját
+HOST_HELP_CMD_DELALL
+ DELALL Törli a vhosztot a nickekröl a csoportban
+HOST_HELP_CMD_LIST
+ LIST Kiír egy vagy több vhost bejegyzést
+
+HOST_OPER_HELP
+ not used.
+
+HOST_ADMIN_HELP
+ not used.
+
+HOST_HELP
+ %S parancsok:
+
+HOST_HELP_ON
+ Syntax: ON
+
+ Aktiválja a vhostodat, ami a nickhez lett társítva.
+ Ha valaki csinál egy /whois parancsot a nickeden,
+ akkor a vhostodat fogja látni a valódi IP címed vagy
+ hosztneved helyett.
+
+HOST_HELP_SET
+ Syntax: SET <nick> <hostmask>.
+
+ Beállítja vhostnak a nick részére a hosztmaszkot.
+ Ha az IRCD támogatja a vIdentet használd a SET
+ <nick> <ident>@<hostmask>, beállitja az identet
+ és a hosztot a nick vhosztjaként.
+
+ Korlátozva Hoszt változtatókra.
+
+HOST_HELP_DELALL
+ Syntax: DELALL <nick>.
+
+ Törlõdik a vhost az összes nickrõl a csoportban ahol az
+ adott nick van és ez a vhosztot használta
+
+ Korlátozva Hoszt változtatókra.
+
+HOST_HELP_SETALL
+ Syntax: SETALL <nick> <hosztmaszk>.
+
+ Beállítja a vhosztot összes nick részére aki a csoportban
+ van. Ha az IRCD támogatja a vIdent, akkor használja a
+ settall <nick> <ident>@<hosztnév> parancsot, ez beállítja
+ az adott identet és hosztot az összes tag részére vhosztként.
+
+ *Jegyzet: ez nem fogja frissíteni a vhostot azoknak, akik
+ a nickeket a csoportban a parancs után jegyezték
+
+ Korlátozva Hoszt változtatókra.
+
+HOST_HELP_OFF
+ Syntax: OFF
+
+ Kikapcsolja a vhostodat,ez most társitva van a nickedhez.
+ Ha valaki használ /whois parancsot a nickeden, akkor a
+ valós IP címed vagy hosztod fogja látni.
+
+HOST_HELP_DEL
+ Syntax: DEL <nick>
+
+ A vhost törölve az adott nick adatbázisából.
+
+ Korlátozva Hoszt változtatókra.
+
+HOST_HELP_LIST
+ Syntax: LIST [<kulcs>|<#X-Y>]
+
+ Ez parancs listázza a regisztrált vhostokat az operátornak
+ Ha egy kulcs meg van határozva, akkor csak a feltételnek
+ megfelelõ vhostokat adja ki melyekben vagy a nickben vagy
+ a hosztban szerepel a kulcs. Pl: Rob*
+
+ Ha az #x-y stílust használod, csak a megadott sorozatba
+ tartozó X és Y közötti vhostok fognak megjelenni. Például
+ az #1-3 csak az elsõ 3 vhostot jeleníti meg.
+
+ A lista használja NSListMax értéket, mint tág határértéket
+ amikor megjeleníti a tartalmat az operátornak.
+
+ Korlátozva Szervíz operátorokra.
+
+HOST_HELP_GROUP
+ Syntax: GROUP
+
+ Ez a parancs lehetõvé teszi, hogy a JELENLEGI nick
+ vhostját beállítsuk a csoport minden nickjére.
+
+OPER_SVSNICK_UNSUPPORTED
+ Sorry, SVSNICK is not available on this network.
+
+OPER_SQLINE_UNSUPPORTED
+ Sorry, SQLINE is not available on this network.
+
+OPER_SVSO_UNSUPPORTED
+ Sorry, OLINE is not available on this network.
+
+OPER_UMODE_UNSUPPORTED
+ Sorry, UMODE is not available on this network.
+
+OPER_SUPER_ADMIN_NOT_ENABLED
+ SuperAdmin setting not enabled in services.conf
+
diff --git a/lang/it.l b/lang/it.l
new file mode 100644
index 000000000..7f950cefd
--- /dev/null
+++ b/lang/it.l
@@ -0,0 +1,6741 @@
+# Italian language file.
+#
+# (C) 2003-2008 Anope Team
+# Contact us at info@anope.org
+#
+# Please read COPYING and README for further details.
+#
+# Based on the original code of Epona by Lara.
+# Based on the original code of Services by Andy Church.
+# Based on the translation for Anope 1.6 by Daniele Nicolucci.
+# Translated for Anope 1.8 by Gordon Shumway <hal9000@pimpmylinux.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 us know
+# (dev@anope.org) 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
+# services.conf). 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 (Italian)
+
+###########################################################################
+#
+# 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 - %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
+ 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. "%R%s HELP" per l'aiuto.
+SYNTAX_ERROR
+ Sintassi: %s
+MORE_INFO
+ %R%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.
+INVALID_TARGET
+ "/msg %s" is no longer supported. Use "/msg %s@%s" or "/%s" instead.
+
+# 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_TOO_LONG
+ Your password is too long. Please try again with a shorter password.
+
+NICK_NOT_REGISTERED
+ Il tuo nick non è registrato.
+NICK_NOT_REGISTERED_HELP
+ Il tuo nick non è registrato. Digita %R%s HELP per informazioni sulla registrazione del nick.
+NICK_X_IS_SERVICES
+ Il nick %s fa parte dei servizi di questo network.
+NICK_X_NOT_REGISTERED
+ Il nick %s non è registrato.
+NICK_X_IN_USE
+ Il nick %s è attualmente in uso.
+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
+ Il nick %s è un nickname non autorizzato e non può essere utilizzato.
+NICK_X_TRUNCATED
+ Il nick %s è stato troncato a %d caratteri.
+NICK_X_SUSPENDED
+ Il nick %s è momentaneamente sospeso.
+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 %R%s IDENTIFY password.
+CHAN_IDENTIFY_REQUIRED
+ Autentificazione richiesta per questo comando.
+ Riprova dopo aver digitato %R%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
+LIST_INCORRECT_RANGE
+ Incorrect range specified. The correct syntax is #from-to.
+CS_LIST_INCORRECT_RANGE
+ To search for channels starting with #, search for the channel
+ name without the #-sign prepended (anope instead of #anope).
+
+###########################################################################
+#
+# NickServ messages
+#
+###########################################################################
+
+# Automatic messages
+HELP_LIMIT_SERV_OPER
+ Limited to Services Operators.
+HELP_LIMIT_SERV_ADMIN
+ Limited to Services Administrators.
+HELP_LIMIT_SERV_ROOT
+ Limited to Services Roots.
+HELP_LIMIT_IRC_OPER
+ Limited to IRC Operators.
+HELP_LIMIT_HOST_SETTER
+ Limited to Host Setters.
+HELP_LIMIT_HOST_REMOVER
+ Limited to Host Removers.
+
+
+###########################################################################
+#
+# NickServ messages
+#
+###########################################################################
+
+# Automatic messages
+NICK_IS_REGISTERED
+ Questo nick appartiene a qualcun altro. Per favore scegline un altro.
+ (Se questo è il tuo nick, digita %R%s IDENTIFY password.)
+NICK_IS_SECURE
+ Questo nick è registrato e protetto. Se questo è il tuo
+ nick, digita %R%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_REGISTERED_NO_MASK
+ Nickname %s registrato.
+NICK_PASSWORD_IS
+ La tua password è %s - non dimenticarla!
+NICK_REG_DELAY
+ Devi essere connesso per almeno %d secondi per poter registrare il tuo nick.
+
+# 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 %R%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 %R%s HELP GLIST e %R%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 %R%S SET EMAIL e-mail per inserire la tua e-mail.
+ La tua privacy è rispettata; questa e-mail non sarà data a
+ terzi.
+NICK_ALREADY_IDENTIFIED
+ Sei già identificato.
+
+# UPDATE responses
+NICK_UPDATE_SUCCESS
+ Stato aggiornato (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.
+NICK_LOGOUT_SERVICESADMIN
+ Impossibile deidentificare %s perchè è un 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_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 %R%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.
+NICK_SET_HIDE_STATUS_ON
+ Il tuo stato di accesso ai servizi verrà ora nascosto dalle visualizzazioni %s di INFO.
+NICK_SET_HIDE_STATUS_OFF
+ Il tuo stati di accesso ai servizi verrà ora mostrato nelle visualizzazioni %s di INFO.
+
+# 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 AUTOOP responses
+NICK_SET_AUTOOP_SYNTAX
+ SET AUTOOP {ON | OFF}
+NICK_SET_AUTOOP_ON
+ Services will now autoop you in channels.
+NICK_SET_AUTOOP_OFF
+ Services will no longer autoop you in channels.
+
+# SET NOEXPIRE responses
+NICK_SASET_SYNTAX
+ SASET nickname opzione parametri
+NICK_SASET_DISABLED
+ Spiacente, l'impostazione delle opzioni dei nick è temporaneamente disattivata.
+NICK_SASET_UNKNOWN_OPTION
+ Opzione SASET %s sconosciuta.
+NICK_SASET_BAD_NICK
+ Nickname %s non registrato.
+NICK_SASET_OPTION_DISABLED
+ L'opzione %s non può essere impostata su questo network.
+
+# SASET DISPLAY responses
+NICK_SASET_DISPLAY_INVALID
+ Il nuovo display per %s DEVE essere un nickname del gruppo nickname!
+NICK_SASET_DISPLAY_CHANGED
+ Il nuovo display è ora %s.
+
+# SASET PASSWORD responses
+NICK_SASET_PASSWORD_FAILED
+ Spiacente, impossibile cambiare la password per %s.
+NICK_SASET_PASSWORD_CHANGED
+ Password per %s cambiata.
+NICK_SASET_PASSWORD_CHANGED_TO
+ Password per %s cambiata in %s.
+
+# SASET LANGUAGE responses
+NICK_SASET_URL_CHANGED
+ URL per %s cambiato in %s.
+NICK_SASET_URL_UNSET
+ URL %s rimosso.
+
+# SASET EMAIL responses
+NICK_SASET_EMAIL_CHANGED
+ Indirizzo e-mail per %s cambiato in %s.
+NICK_SASET_EMAIL_UNSET
+ Indirizzo e-mail per %s rimosso.
+NICK_SASET_EMAIL_UNSET_IMPOSSIBLE
+ Non puoi rimuovere l'indirizzo e-mail su questo network.
+
+# SASET ICQ responses
+NICK_SASET_ICQ_CHANGED
+ Numero ICQ per %s impostato a %s.
+NICK_SASET_ICQ_UNSET
+ Numero ICQ per %s rimosso.
+NICK_SASET_ICQ_INVALID
+ %s non è un numero valido.
+
+# SASET GREET responses
+NICK_SASET_GREET_CHANGED
+ Messaggio di saluto per %s cambiato in %s.
+NICK_SASET_GREET_UNSET
+ Messaggio di saluto per %s rimosso.
+
+# SASET PROTECT responses
+NICK_SASET_KILL_SYNTAX
+ SASET nickname KILL {ON | QUICK | OFF}
+NICK_SASET_KILL_IMMED_SYNTAX
+ SASET nickname KILL {ON | QUICK | IMMED | OFF}
+NICK_SASET_KILL_ON
+ Protezione ACCESA per %s.
+NICK_SASET_KILL_QUICK
+ Protezione ACCESA per %s, con un ritardo ridotto.
+NICK_SASET_KILL_IMMED
+ Protezione ACCESA per %s, senza ritardo.
+NICK_SASET_KILL_IMMED_DISABLED
+ L'opzione IMMED non è disponibile su questo network.
+NICK_SASET_KILL_OFF
+ Protezione SPENTA per %s.
+
+# SASET SECURE responses
+NICK_SASET_SECURE_SYNTAX
+ SASET nickname SECURE {ON | OFF}
+NICK_SASET_SECURE_ON
+ Opzione secure ACCESA per %s.
+NICK_SASET_SECURE_OFF
+ Opzione secure SPENTA per %s.
+
+# SASET PRIVATE responses
+NICK_SASET_PRIVATE_SYNTAX
+ SASET nickname PRIVATE {ON | OFF}
+NICK_SASET_PRIVATE_ON
+ Opzione private ACCESA per %s.
+NICK_SASET_PRIVATE_OFF
+ Opzione private SPENTA per %s.
+
+# SASET HIDE responses
+NICK_SASET_HIDE_SYNTAX
+ SET nickname HIDE {EMAIL | USERMASK | QUIT} {ON | OFF}
+NICK_SASET_HIDE_EMAIL_ON
+ L'indirizzo e-mail di %s verrà ora nascosto da %s INFO.
+NICK_SASET_HIDE_EMAIL_OFF
+ L'indirizzo e-mail di %s verrà ora mostrato in %s INFO.
+NICK_SASET_HIDE_MASK_ON
+ L'ultima mask user@host vista di %s verrà ora nascosta da %s INFO.
+NICK_SASET_HIDE_MASK_OFF
+ L'ultima mask user@host vista di %s verrà ora mostrata in %s INFO.
+NICK_SASET_HIDE_QUIT_ON
+ L'ultimo messaggio di quit di %s verrà ora nascosto da %s INFO.
+NICK_SASET_HIDE_QUIT_OFF
+ L'ultimo messaggio di quit di %s verrà ora mostrato in %s INFO.
+NICK_SASET_HIDE_STATUS_ON
+ Lo stato di accesso ai servizi di %s verrà ora nascosto da %s INFO.
+NICK_SASET_HIDE_STATUS_OFF
+ Lo stato di accesso ai servizi di %s verrà ora mostrato in %s INFO.
+
+# SASET MSG responses
+NICK_SASET_MSG_SYNTAX
+ SSAET nickname PRIVATE {ON | OFF}
+NICK_SASET_MSG_ON
+ I servizi risponderanno a %s con "messages".
+NICK_SASET_MSG_OFF
+ I servizi risponderanno a %s con "notices".
+
+# SET NOEXPIRE responses
+NICK_SASET_NOEXPIRE_SYNTAX
+ SASET nickname NOEXPIRE {ON | OFF}
+NICK_SASET_NOEXPIRE_ON
+ Il nick %s non scadrà.
+NICK_SASET_NOEXPIRE_OFF
+ Il nick %s scadrà.
+
+# ACCESS responses
+NICK_SASET_AUTOOP_SYNTAX
+ SASET nickname AUTOOP {ON | OFF}
+NICK_SASET_AUTOOP_ON
+ Services will now autoop %s in channels.
+NICK_SASET_AUTOOP_OFF
+ Services will no longer autoop %s in channels.
+
+# SASET LANGUAGE responses
+NICK_SASET_LANGUAGE_SYNTAX
+ SASET nickname LANGUAGE number
+NICK_SASET_LANGUAGE_UNKNOWN
+ Unknown language number %d. Type %R%s HELP SET LANGUAGE for a list of languages.
+NICK_SASET_LANGUAGE_CHANGED
+ Language changed to Italian.
+
+
+# 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:
+NICK_ACCESS_LIST_EMPTY
+ La tua lista d'accesso è vuota.
+NICK_ACCESS_LIST_X_EMPTY
+ La lista d'accesso per %s è vuota.
+
+# Status messages
+NICK_STATUS_0
+ STATO %s 0
+NICK_STATUS_1
+ STATO %s 1
+NICK_STATUS_2
+ STATO %s 2
+NICK_STATUS_3
+ STATO %s 3
+
+# 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_SERVICES_ROOT
+ %s è un amministratore root dei servizi (services root 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_VHOST2
+ vhost: %s@%s
+NICK_INFO_ICQ
+ Numero ICQ: %d
+NICK_INFO_GREET
+ Messaggio di saluto (greet): %s
+NICK_INFO_OPTIONS
+ Opzioni: %s
+NICK_INFO_EXPIRE
+ Expires in: %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_AUTOOP
+ Auto-op
+NICK_INFO_OPT_NONE
+ Nessuna
+NICK_INFO_NO_EXPIRE
+ Questo nick non scadrà.
+NICK_INFO_FOR_MORE
+ Per ottenere altre informazioni, digita %R%s INFO %s ALL.
+NICK_INFO_SUSPENDED
+ Questo nickname è momentaneamente sospeso, motivo: %s
+NICK_INFO_SUSPENDED_NO_REASON
+ Questo nickname è momentaneamente sospeso
+
+# LIST responses
+NICK_LIST_SYNTAX
+ LIST pattern
+NICK_LIST_SERVADMIN_SYNTAX
+ LIST pattern [FORBIDDEN] [SUSPENDED] [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.
+NICK_GLIST_REPLY
+ %c%s
+NICK_GLIST_REPLY_ADMIN
+ %c%s (scade tra %s)
+
+# 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 %R%s RELEASE %s per usarlo prima che termini il blocco di %s.
+
+# 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.
+
+# GETEMAIL responses
+NICK_GETEMAIL_SYNTAX
+ GETEMAIL user@email-host Niente WildCards!!
+NICK_GETEMAIL_EMAILS_ARE
+ Email corrispondondenti %s a %s.
+NICK_GETEMAIL_NOT_USED
+ Nessuna email in lista per %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.
+
+# SUSPEND responses
+NICK_SUSPEND_SYNTAX
+ SUSPEND nick motivo
+NICK_SUSPEND_SUCCEEDED
+ Il nick %s è ora sospeso.
+NICK_SUSPEND_FAILED
+ Impossibile sospendere il nick %s!
+
+# UNSUSPEND responses
+NICK_UNSUSPEND_SYNTAX
+ UNSUSPEND nickname
+NICK_UNSUSPEND_SUCCEEDED
+ Il nick %s è ora rilasciato.
+NICK_UNSUSPEND_FAILED
+ Impossibile rilasciare il nick %s!
+
+# 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!
+
+# Nick Registraion responses
+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 %R%s CONFIRM <codice> per completare la registrazione.
+NICK_CONFIRM_NOT_FOUND
+ Il primo passo della registrazione potrebbe essere scaduto. Usa %R%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 " %R%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_X_INVALID
+ Channel %s is not a valid channel.
+
+# 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 %R%s HELP per avere informazioni sulla registrazione dei nick.
+CHAN_MUST_IDENTIFY_NICK
+ Devi prima identificarti con %s, usando il comando:
+ %R%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!
+CHAN_REGISTER_NONE_CHANNEL
+ Hai provato a registrare un canale non esistente %s
+CHAN_SYMBOL_REQUIRED
+ Per favore usa il simbolo # provando a registrare
+
+
+# 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 (except the channel founder).
+CHAN_LOGOUT_FOUNDER_FAILED
+ You may not log out of %s (you are founder).
+
+# 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
+ La memorizzazione del topic per %s è ora ATTIVATA.
+CHAN_SET_KEEPTOPIC_OFF
+ La memorizzazione del topic per %s è ora DISATTIVATA.
+
+# SET TOPICLOCK responses
+CHAN_SET_TOPICLOCK_SYNTAX
+ SET canale TOPICLOCK {ON | OFF}
+CHAN_SET_TOPICLOCK_ON
+ Il blocco del topic per %s è ora ATTIVATO.
+CHAN_SET_TOPICLOCK_OFF
+ Il blocco del topic per %s è ora DISATTIVATO.
+
+# SET PEACE responses
+CHAN_SET_PEACE_SYNTAX
+ SET canale PEACE {ON | OFF}
+CHAN_SET_PEACE_ON
+ L'opzione Peace per %s è ora ATTIVATA.
+CHAN_SET_PEACE_OFF
+ L'opzione Peace per %s è ora DISATTIVATA.
+
+# SET PRIVATE responses
+CHAN_SET_PRIVATE_SYNTAX
+ SET canale PRIVATE {ON | OFF}
+CHAN_SET_PRIVATE_ON
+ L'opzione Private per %s è ora ATTIVATA.
+CHAN_SET_PRIVATE_OFF
+ L'opzione Private per %s è ora DISATTIVATA.
+
+# SET SECUREOPS responses
+CHAN_SET_SECUREOPS_SYNTAX
+ SET canale SECUREOPS {ON | OFF}
+CHAN_SET_SECUREOPS_ON
+ L'opzione Secure ops per %s è ora ATTIVATA.
+CHAN_SET_SECUREOPS_OFF
+ L'opzione Secure ops per %s è ora DISATTIVATA.
+
+# SET SECUREFOUNDER responses
+CHAN_SET_SECUREFOUNDER_SYNTAX
+ SET canale SECUREFOUNDER {ON | OFF}
+CHAN_SET_SECUREFOUNDER_ON
+ L'opzione Secure founder per %s è ora ATTIVATA.
+CHAN_SET_SECUREFOUNDER_OFF
+ L'opzione Secure founder per %s è ora DISATTIVATA.
+
+# SET RESTRICTED responses
+CHAN_SET_RESTRICTED_SYNTAX
+ SET canale RESTRICTED {ON | OFF}
+CHAN_SET_RESTRICTED_ON
+ L'opzione Restricted access per %s è ora ATTIVATA.
+CHAN_SET_RESTRICTED_OFF
+ L'opzione Restricted access per %s è ora DISATTIVATA.
+
+# SET SECURE responses
+CHAN_SET_SECURE_SYNTAX
+ SET canale SECURE {ON | OFF}
+CHAN_SET_SECURE_ON
+ L'opzione Secure per %s è ora ATTIVATA.
+CHAN_SET_SECURE_OFF
+ L'opzione Secure per %s è ora DISATTIVATA.
+
+# SET SIGNKICK responses
+CHAN_SET_SIGNKICK_SYNTAX
+ SET canale SIGNKICK {ON | LEVEL | OFF}
+CHAN_SET_SIGNKICK_ON
+ L'opzione Signed kick per %s è ora ATTIVATA.
+CHAN_SET_SIGNKICK_LEVEL
+ L'opzione Signed kick per %s è ora ATTIVATA, ma dipende dal
+ livello dell'utente che utilizza il comando.
+CHAN_SET_SIGNKICK_OFF
+ L'opzione Signed kick per %s è ora DISATTIVATA.
+
+# SET OPNOTICE responses
+CHAN_SET_OPNOTICE_SYNTAX
+ SET canale OPNOTICE {ON | OFF}
+CHAN_SET_OPNOTICE_ON
+ L'opzione Op-notice per %s è ora ATTIVATA.
+CHAN_SET_OPNOTICE_OFF
+ L'opzione Op-notice per %s è ora DISATTIVATA.
+
+# SET XOP responses
+CHAN_SET_XOP_SYNTAX
+ SET canale XOP {ON | OFF}
+CHAN_SET_XOP_ON
+ Il sistema di liste xOP per %s è ora ATTIVATO.
+CHAN_SET_XOP_OFF
+ Il sistema di liste xOP per %s è ora DISATTIVATO.
+
+# 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 %R%s HELP ACCESS per avere maggiori informazioni.
+CHAN_XOP_NOT_AVAILABLE
+ xOP system is not available.
+
+# 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 %s è 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 %s è 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 %s è 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 %s è 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 %R%s HELP comando per ottenere maggiori informazioni.
+CHAN_ACCESS_XOP_HOP
+ You can't use this command.
+ Use the AOP, SOP, HOP and VOP commands instead.
+ Type %R%s HELP command for more information.
+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
+ Fine della lista di accesso.
+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 %s è 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 %s è 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 %R%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.
+
+# Status Messages
+CHAN_STATUS_SYNTAX
+ STATUS ERROR Errore di sintassi
+CHAN_STATUS_NOT_REGGED
+ STATUS ERROR Il canale %s non è registrato
+CHAN_STATUS_FORBIDDEN
+ STATUS ERROR Il canale %s è proibito
+CHAN_STATUS_NOTONLINE
+ STATUS ERROR Il nick %s non è online
+CHAN_STATUS_INFO
+ STATUS %s %s %d
+
+# 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_EXPIRE
+ Expires in: %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_HOPS
+ Il modo +h è stato rimosso dal canale %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.
+CHAN_CLEARED_INVITES
+ Tutti gli invites sono stati rimossi 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_GETKEY_SYNTAX
+ GETKEY canale
+CHAN_GETKEY_NOKEY
+ Il canale %s non ha una key.
+CHAN_GETKEY_KEY
+ KEY %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!
+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
+ Nessun # trovato davanti al nome del canale.
+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 %R%s READ LAST per leggerlo.
+MEMO_TYPE_READ_NUM
+ Digita %R%s READ %d per leggerlo.
+MEMO_TYPE_LIST_NEW
+ Digita %R%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 %R%s READ %s %d per leggerlo.
+MEMO_NEW_MEMO_ARRIVED
+ Hai ricevuto un nuovo memo da %s.
+ Digita %R%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
+ Un memo di massa è stato inviato a tutti gli utenti registrati.
+
+# 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: %R%s READ numero
+MEMO_LIST_NEW_MEMOS
+ Nuovi memo di %s. Per leggerli, digita: %R%s READ numero
+MEMO_LIST_CHAN_MEMOS
+ Memo di %s. Per leggerli, digita: %R%s READ %s numero
+MEMO_LIST_CHAN_NEW_MEMOS
+ Nuovi memo di %s. Per leggerli, digita: %R%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: %R%s DEL %d
+MEMO_CHAN_HEADER
+ Memo %d da %s (%s). Per eliminarlo, digita: %R%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.
+MEMO_CHAN_DELETED_ALL
+ Tutti i memo per il canale %s sono stati cancellati.
+
+# 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.
+MEMO_SET_NOTIFY_MAIL
+ Verrai ora informato su nuovi memo via email.
+MEMO_SET_NOTIFY_NOMAIL
+ Non verrai più informato via email.
+MEMO_SET_NOTIFY_INVALIDMAIL
+ Non c'è un indirizzo email impostato per il tuo nick.
+
+# 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.
+
+# Memo2Mail responses
+MEMO_MAIL_SUBJECT
+ Nuovo memo
+MEMO_MAIL_TEXT1
+ Ciao %s
+MEMO_MAIL_TEXT2
+ Hai appena ricevuto un nuovo memo da %s. Questo è il memo numero %d.
+MEMO_MAIL_TEXT3
+ Testo del memo:
+
+# RSEND responses
+MEMO_RSEND_PLEASE_WAIT
+ Prego attendere %d secondi prima di usare il comando RSEND command nuovamente.
+MEMO_RSEND_DISABLED
+ Spiacente, RSEND è stato disattivato su questo network.
+MEMO_RSEND_SYNTAX
+ RSEND {nick | canale} testo-memo
+MEMO_RSEND_NICK_MEMO_TEXT
+ [auto-memo] Il memo che hai inviato è stato letto.
+MEMO_RSEND_CHAN_MEMO_TEXT
+ [auto-memo] Il memo che hai inviato a %s è stato letto.
+MEMO_RSEND_USER_NOTIFICATION
+ Un memo di notifica è stato mandato a %s informandolo/a che hai
+ letto il suo memo.
+
+# CHECK responses
+MEMO_CHECK_SYNTAX
+ CHECK nickname
+MEMO_CHECK_NOT_READ
+ L'ultimo memo che hai inviato a %s (inviato il %s) non è stato ancora letto.
+MEMO_CHECK_READ
+ L'ultimo memo che hai inviato a %s (inviato il %s) è stato letto.
+MEMO_CHECK_NO_MEMO
+ Il nick %s non ha un tuo memo.
+MEMO_NO_RSEND_SELF
+ Non puoi richiedere una ricevuta se mandi un memo a te stesso.
+
+###########################################################################
+#
+# 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 %R%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_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
+ Il bot %s è già assegnato al canale %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
+ Fantasia
+BOT_INFO_OPT_GREET
+ Saluto
+BOT_INFO_OPT_NOBOT
+ Nessun bot
+BOT_INFO_OPT_SYMBIOSIS
+ Simbiosi
+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 %R%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 %R%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
+
+# Errors
+BOT_EXCEPT
+ L'utente corrisponde a una delle eccezioni del canale.
+BOT_BAD_NICK
+ I nick dei bot possono contenere unicamente caratteri validi.
+BOT_BAD_HOST
+ Gli host dei bot possono contenere unicamente caratteri validi.
+BOT_BAD_IDENT
+ Gli ident dei bot possono contenere unicamente caratteri validi.
+BOT_LONG_IDENT
+ Bot Idents may only contain %d characters.
+BOT_LONG_HOST
+ Bot Hosts may only contain %d 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_HOSTSERV_MEM
+ HostServ : %6d records, %5d kB
+OPER_STATS_OPERSERV_MEM
+ OperServ: %6d records, %5d kB
+OPER_STATS_SESSIONS_MEM
+ Sessioni: %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_STATS_UPLINK_SERVER
+ Uplink server: %s
+OPER_STATS_UPLINK_CAPAB
+ Uplink capab: %s
+OPER_STATS_UPLINK_SERVER_COUNT
+ Servers found: %d
+
+# MODE responses
+OPER_MODE_SYNTAX
+ MODE canale modi
+
+# CLEARMODES responses
+OPER_UMODE_SYNTAX
+ UMODE nick modi
+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
+ Le operflags %s sono state aggiunte a %s.
+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 nuovonick
+OPER_SVSNICK_NEWNICK
+ Il nick %s viene ora cambiato in %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_ADMIN_MOVED
+ %s è stato spostato nella lista dei Services admin.
+
+# 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.
+OPER_OPER_MOVED
+ %s è stato spostato nella lista dei Services oper.
+
+# 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.
+OPER_CHANKILL_SYNTAX
+ CHANKILL [+scadenza] {#canale} [motivo]
+# 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 aggiunto alla lista SGLINE.
+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
+ L'impostazione per LOGCHAN dev'essere ON o OFF e LogChannel dev'essere definito.
+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.
+OPER_SET_SQL_ON
+ Il codice SQL viene utilizzato.
+OPER_SET_SQL_OFF
+ Il codice SQL non viene utilizzato.
+OPER_SET_SQL_ERROR
+ L'impostazione per SQL dev'essere ON o OFF.
+OPER_SET_SQL_ERROR_INIT
+ Errore durante l'inizializzazione di SQL, controlla i tuoi log per correggere.
+OPER_SET_SQL_ERROR_DISABLED
+ SQL non è configurato per questo network. Modifica
+ il file di configurazione (services.conf).
+OPER_SET_LIST_OPTION_ON
+ %s è attivato
+OPER_SET_LIST_OPTION_OFF
+ %s è disattivato
+
+# 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]
+OPER_JUPE_HOST_ERROR
+ Prego utilizzare un nome server valido per jupe
+
+# 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 | mask]
+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 lista canali:
+ 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_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.
+OPER_SUPER_ADMIN_ONLY
+ Solo i SuperAdmin possono usare questo comando.
+OPER_STAFF_LIST_HEADER
+ Su Livello Nick
+OPER_STAFF_FORMAT
+ %c %s %s
+OPER_STAFF_AFORMAT
+ %c %s %s [%s]
+
+# DefCon Messages
+
+OPER_DEFCON_SYNTAX
+ Sintassi: DEFCON [1|2|3|4|5]
+OPER_DEFCON_DENIED
+ I servizi sono in modalità Defcon, prego riprovare più tardi.
+OPER_DEFCON_NO_CONF
+ Il sistema Defcon dev'essere attivato nel file services.conf
+OPER_DEFCON_CHANGED
+ I servizi sono ora in DEFCON %d
+OPER_DEFCON_WALL
+ %s ha cambiato il livello DEFCON a %d
+DEFCON_GLOBAL
+ Il livello Defcon è ora: %d
+
+# Module strings
+
+OPER_MODULE_LOADED
+ Modulo %s caricato
+OPER_MODULE_UNLOADED
+ Modulo %s rimosso
+OPER_MODULE_LOAD_FAIL
+ Impossibile caricare il modulo %s
+OPER_MODULE_REMOVE_FAIL
+ Impossibile rimuovere il modulo %s
+OPER_MODULE_NO_UNLOAD
+ Questo modulo non può essere rimosso.
+OPER_MODULE_LOAD_SYNTAX
+ MODLOAD NomeFile
+OPER_MODULE_UNLOAD_SYNTAX
+ MODUNLOAD NomeFile
+OPER_MODULE_LIST_HEADER
+ Lista moduli attuali:
+OPER_MODULE_LIST
+ Modulo: %s [%s] [%s]
+OPER_MODULE_LIST_FOOTER
+ %d Moduli caricati.
+OPER_MODULE_INFO_LIST
+ Modulo: %s Versione: %s Autore: %s caricato: %s
+OPER_MODULE_CMD_LIST
+ Fornendo il comando: %R%s %s
+OPER_MODULE_MSG_LIST
+ Fornendo l'handler IRCD per: %s
+OPER_MODULE_NO_LIST
+ Nessn modulo attualmente caricato
+OPER_MODULE_NO_INFO
+ Nessun'informazione sul modulo %s è disponibile
+OPER_MODULE_INFO_SYNTAX
+ MODINFO NomeFile
+MODULE_HELP_HEADER
+ I seguenti comandi sono stati caricati da un modulo:
+
+###########################################################################
+#
+# 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).
+OPER_EXCEPTION_EXISTS
+ %s esiste già nella lista EXCEPTION.
+OPER_EXCEPTION_CHANGED
+ Exception per %s è stata aggiornata in %d.
+
+# 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.
+
+OPER_HELP_STAFF
+ Sintassi: STAFF
+
+ Mostra tutti i nick dello staff dei services coi rispettivi
+ livelli e stato on-line.
+
+OPER_HELP_DEFCON
+ Sintassi: DEFCON [1|2|3|4|5]
+
+ Il sistema defcon può essere utilizzato per implementare un insieme
+ di restrizioni dei servizi predefinite, utili durante un tentativo
+ d'attacco sul network.
+
+OPER_HELP_DEFCON_NO_NEW_CHANNELS
+ * Nessuna nuova registrazione di canali
+OPER_HELP_DEFCON_NO_NEW_NICKS
+ * Nessuna nuova registrazione di nick
+OPER_HELP_DEFCON_NO_MLOCK_CHANGE
+ * Nessune modifiche ad MLOCK
+OPER_HELP_DEFCON_FORCE_CHAN_MODES
+ * Forza l'impostazione dei modi canale (%s) su tutti i canali
+OPER_HELP_DEFCON_REDUCE_SESSION
+ * Usa il limite di sessioni ridotto a %d
+OPER_HELP_DEFCON_NO_NEW_CLIENTS
+ * Killa tutti i NUOVI client che si collegano
+OPER_HELP_DEFCON_OPER_ONLY
+ * Ignora tutti i non-opers con messaggio
+OPER_HELP_DEFCON_SILENT_OPER_ONLY
+ * Ignora silenziosamente i non-opers
+OPER_HELP_DEFCON_AKILL_NEW_CLIENTS
+ * AKILL tutti i nuovi client che si collegano
+OPER_HELP_DEFCON_NO_NEW_MEMOS
+ * Niente nuovi memo inviati
+OPER_HELP_CHANKILL
+ Sintassi: CHANKILL [+scadenza] canale motivo
+
+ Imposta un AKILL per tutti i nick presenti nel canale specificato.
+ Utilizza l'intero e completo ident@host per ogni nick,
+ in seguito imposta l'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
+ 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 %s messages will be
+ sent in order to avoid flooding the user. If there are
+ more news messages, only the most recent will be sent.)
+ NewsCount can be configured in services.conf.
+
+ 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 %s messages will
+ be sent in order to avoid flooding the user. If there are
+ more news messages, only the most recent will be sent.)
+ NewsCount can be configured in services.conf.
+
+ 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
+ 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:
+
+ %R%s HELP
+ per informazioni sulla registrazione dei nick
+
+ %R%s HELP
+ per informazioni sulla registrazione e il controllo
+ dei canali
+
+ %R%s HELP
+ per informazioni sull'invio dei messaggi ad utenti
+ non connessi
+
+HELP_HELP_BOT
+
+ %R%s HELP
+ per informazioni sulla configurazione di un bot
+ per il proprio canale
+
+HELP_HELP_HOST
+
+ %R%s HELP
+ per informazioni su come impostare vHosts sui nick
+
+###########################################################################
+#
+# NickServ help messages
+#
+###########################################################################
+
+NICK_HELP_CMD_CONFIRM
+ CONFIRM Conferma un "auth code" di nickserv
+NICK_HELP_CMD_RESEND
+ RESEND Reinvia un "auth code" di nickserv
+NICK_HELP_CMD_REGISTER
+ REGISTER Registra un nick
+NICK_HELP_CMD_GROUP
+ GROUP Entra in un gruppo
+NICK_HELP_CMD_IDENTIFY
+ IDENTIFY Ti identifica per il tuo nick
+NICK_HELP_CMD_ACCESS
+ ACCESS Modifica la lista degli indirizzi autorizzati
+NICK_HELP_CMD_SET
+ SET Imposta le opzioni, inclusa la protezione
+NICK_HELP_CMD_SASET
+ SASET Imposta le opzioni SET su un altro nickname
+NICK_HELP_CMD_DROP
+ DROP Annulla la registrazione del nick
+NICK_HELP_CMD_RECOVER
+ RECOVER Disconnette un altro utente che usa il tuo nick
+NICK_HELP_CMD_RELEASE
+ RELEASE Permette di usare di nuovo il proprio nick dopo un RECOVER
+NICK_HELP_CMD_SENDPASS
+ SENDPASS Invia la password del proprio nick via e-mail
+NICK_HELP_CMD_GHOST
+ GHOST Disconnette un nick fantasma che non è ancora caduto
+NICK_HELP_CMD_ALIST
+ ALIST Mostra i canali in cui si ha accesso
+NICK_HELP_CMD_GLIST
+ GLIST Mostra la lista di tutti i nick nel proprio gruppo
+NICK_HELP_CMD_INFO
+ INFO Mostra le informazioni su un nick
+NICK_HELP_CMD_LIST
+ LIST Mostra l'elenco dei nick registrati
+NICK_HELP_CMD_LOGOUT
+ LOGOUT Deidentifica dal proprio nick
+NICK_HELP_CMD_STATUS
+ STATUS Indica lo stato di identificazione di un nick
+NICK_HELP_CMD_UPDATE
+ UPDATE Aggiorna il tuo stato attuale, ovvero controlla eventuali nuovi memo
+NICK_HELP_CMD_GETPASS
+ GETPASS Recupera la password di un nick
+ (solo se la criptazione è disattivata)
+NICK_HELP_CMD_GETEMAIL
+ GETEMAIL Mostra l'elenco degli utenti registratisi con l'indirizzo email specificato
+NICK_HELP_CMD_FORBID
+ FORBID Blocca un nick in modo che non venga usato
+NICK_HELP_CMD_SUSPEND
+ SUSPEND Sospendi il nick specificato
+NICK_HELP_CMD_UNSUSPEND
+ UNSUSPEND Rilascia il nick specificato
+
+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 %R%S comando.
+ Per maggiori informazioni su un comando specifico,
+ digita %R%S HELP comando.
+
+NICK_HELP_FOOTER
+ 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 [email]
+
+ 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 %R%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
+ %R%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
+ Sintassi: UPDATE
+
+ Aggiorna il tuo stato attuale, ovvero controlla eventuali nuovi memo,
+ imposta i chanmode necessari (ModeonID) e aggiorna il tuo vhost e
+ i tuoi userflags (lastseentime, ecc).
+
+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 %R%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 (%R%S LIST)
+ SECURE Attiva o disattiva la sicurezza
+ URL Associa un URL al tuo nick
+ AUTOOP Should services op you automatically.
+
+ Per usare questo comando, devi prima identificarti con
+ la tua password (digita %R%S HELP IDENTIFY per
+ ottenere maggiori informazioni).
+
+ Digita %R%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_SET_AUTOOP
+ Syntax: SET AUTOOP {ON | OFF}
+
+ Sets whether you will be opped automatically. Set to ON to
+ allow ChanServ to op you automatically when entering channels.
+
+NICK_HELP_SASET
+ Sintassi: SASET nickname opzione parametri.
+
+ Imposta varie opzioni del nick. opzione può essere una delle
+ seguenti:
+
+ DISPLAY Imposta il nome del gruppo
+ PASSWORD Imposta la password del nick
+ URL Associa un URL al nickname
+ EMAIL Associa un indirizzo e-mail al nickname
+ ICQ Associa un numero ICQ al nickname
+ GREET Associa un messaggio di saluto al nickname
+ KILL Attiva o disattiva la protezione
+ SECURE Attiva o disattiva la sicurezza
+ PRIVATE Nasconde il nick dalla lista (%R%S LIST)
+ HIDE Nsconde alcune informazioni sul nick
+ MSG Cambia il metodo di comunicazione usato dai servizi
+ NOEXPIRE Evita che il nickname scada
+ LANGUAGE Set the language Services will use when
+ sending messages to nickname
+
+ Digita %R%S HELP SASET opzione per maggiori informazioni
+ su un'opzione specifica. Le opzioni verranno impostate sul
+ nickname specificato.
+
+ Limitato ai Services admins.
+
+NICK_HELP_SASET_DISPLAY
+ Sintassi: SASET nickname DISPLAY nuovo-display
+
+ Imposta il nome con cui i Services si riferiscono al tuo
+ gruppo. Il nuovo nome DEVE essere un nick del gruppo.
+
+ Limitato ai Services admins.
+
+NICK_HELP_SASET_PASSWORD
+ Sintassi: SASET nickname PASSWORD nuova-password
+
+ Cambia la password utilizzata per identificarsi come
+ proprietario del nick.
+
+ Limitato ai Services admins.
+
+NICK_HELP_SASET_URL
+ Sintassi: SASET nickname URL url
+
+ Associa l'URL indicato al nick. Questo URL
+ sarà mostrato quando qualcuno richiede informazioni
+ sul nick con il comando INFO.
+
+ Limitato ai Services admins.
+
+NICK_HELP_SASET_EMAIL
+ Sintassi: SASET nickname EMAIL indirizzo
+
+ Associa l'indirizzo e-mail specificato al nickname.
+
+ Limitato ai Services admins.
+
+NICK_HELP_SASET_ICQ
+ Sintassi: SASET nickname ICQ numero
+
+ Associa il numero ICQ specificato al nick.
+ Questo indirizzo sarà mostrato quando qualcuno richiede
+ informazioni sul nick con il comando INFO.
+
+ Limitato ai Services admins.
+
+NICK_HELP_SASET_GREET
+ Sintassi: SASET nickname GREET messaggio
+
+ Imposta come saluto del 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.
+
+ Limitato ai Services admins.
+
+NICK_HELP_SASET_KILL
+ Sintassi: SASET nickname KILL {ON | QUICK | IMMED | OFF}
+
+ Attiva o disattiva l'opzione di protezione automatica per
+ il nick. Quando la protezione è attiva, se un altro
+ utente cerca di usare il 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.
+
+ Limitato ai Services admins.
+
+NICK_HELP_SASET_SECURE
+ Sintassi: SASET nickname SECURE {ON | OFF}
+
+ Attiva o disattiva sul nick le funzionalità di sicurezza
+ di %S. Quando SECURE è attivo, l'utente deve identificarsi
+ come proprietario del nick, anche se il suo indirizzo compare
+ nella lista di accesso. Comunque, se è nella lista di
+ accesso, %S non cambierà il suo nick, anche se l'opzione KILL
+ è attiva.
+
+ Limitato ai Services admins.
+
+NICK_HELP_SASET_PRIVATE
+ Sintassi: SASET nickname PRIVATE {ON | OFF}
+
+ Attiva o disattiva l'opzione privacy di %S per il nick.
+ Quando PRIVATE è attivo, il nick non comparirà nelle
+ liste dei nick generate con %S comando LIST. In ogni caso, però,
+ chiunque sappia il nick può leggerne le informazioni con il
+ comando INFO.
+
+ Limitato ai Services admins.
+
+NICK_HELP_SASET_HIDE
+ Sintassi: SASET nickname HIDE {EMAIL | STATUS | USERMASK | QUIT} {ON | OFF}
+
+ Ti permette di nascondere alcune informazioni quando qualcuno
+ effettua un %S INFO sul nick. Puoi nascondere l'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).
+
+ Limitato ai Services admins.
+
+NICK_HELP_SASET_MSG
+ Sintassi: SASET nickname MSG {ON | OFF}
+
+ Ti permette di scegliere il modo in cui i Services comunicano
+ col nick. Se MSG è attivo, i Services usano i messaggi (query),
+ altrimenti usano i notices.
+
+ Limitato ai Services admins.
+
+NICK_HELP_SASET_NOEXPIRE
+ Sintassi: SASET nickname NOEXPIRE {ON | OFF}
+
+ Imposta se il nickname specificato scadrà. Impostandolo su
+ ON eviterà che il nickname scada.
+
+ Limitato ai Services admins.
+
+NICK_HELP_SASET_AUTOOP
+ Syntax: SASET nickname AUTOOP {ON | OFF}
+
+ Sets whether the given nickname will be opped automatically.
+ Set to ON to allow ChanServ to op the given nickname
+ automatically when joining channels.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_LANGUAGE
+ Syntax: SASET nickname LANGUAGE number
+
+ Changes the language Services uses when sending messages to
+ nickname (for example, when responding to a command he sends).
+ number should be chosen from a list of supported languages
+ that you can get by typing %R%S HELP SET LANGUAGE.
+
+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
+ remain online for %s to ensure that the other
+ user does not immediately reconnect; after that time, you
+ can reclaim your nick. Alternatively, use the RELEASE
+ command (%R%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. This holds lasts for %s;
+ 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
+ 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. Se nessun nickname è specificato verrà indicato
+ lo stato del tuo 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_HELP_CONFIRM
+ Syntax: CONFIRM passcode
+
+ This is the second step of nickname registration process.
+ You must perform this command in order to get your nickname
+ registered with %S. The passcode (or called auth code also)
+ is sent to your e-mail address in the first step of the
+ registration process. For more information about the first
+ stage of the registration process, type: %R%S HELP REGISTER
+
+NICK_HELP_RESEND
+ Syntax: RESEND
+
+ This command will re-send the auth code (also called passcode)
+ to the e-mail address of the user whom is performing it.
+
+NICK_SERVADMIN_HELP
+ I Services admin possono inoltre deregistrare qualsiasi nick
+ senza doversi identificare per quel nick, e possono visualizzare
+ le liste di accesso per qualunque nick (%R%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_INFO
+
+ I Services admin possono usare il parametro ALL con tutti i nick.
+
+NICK_SERVADMIN_HELP_LIST
+ Sintassi: LIST pattern [FORBIDDEN] [SUSPENDED] [NOEXPIRE] [UNCONFIRMED]
+
+ 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, SUSPENDED, NOEXPIRE o UNCONFIRMED,
+ unicamente i nick che sono rispettivamente vietati (FORBIDden), SUSPENDED,
+ non confermati (UNCONFIRMED) oppure hanno la flag NOEXPIRE impostata
+ verranno mostrati. Se tutte e tre le opzioni sono specificate, tutti
+ e tre i tipi di nick verranno mostrati. 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
+ Sintassi: GETEMAIL user@emailhost
+
+ Mostra i nick che utilizzano l'email specificato. Nota che
+ non puoi usare "wildcards" (*) né per user, né per emailhost.
+ Questo comando viene loggato.
+
+ Limitato ai Services admin.
+
+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.
+
+NICK_SERVADMIN_HELP_SUSPEND
+ Sintassi: SUSPEND nickname motivo
+
+ Impedisce al nickname di venire utilizzato.
+
+ Limitato ai Services admin.
+
+NICK_SERVADMIN_HELP_UNSUSPEND
+ Sintassi: UNSUSPEND nickname
+
+ Rilascia il nickname sospeso.
+
+ Limitato ai Services admin.
+
+###########################################################################
+#
+# ChanServ help messages
+#
+###########################################################################
+CHAN_HELP_CMD_GETPASS
+ GETPASS Recupera la password di fondatore di un canale
+CHAN_HELP_CMD_FORBID
+ FORBID Blocca un canale in modo che non venga usato
+CHAN_HELP_CMD_SUSPEND
+ SUSPEND Impedisce l'utilizzo di un canale mantenendo
+ i dati e le impostazioni
+CHAN_HELP_CMD_UNSUSPEND
+ UNSUSPEND Rilascia un canale sospeso
+CHAN_HELP_CMD_STATUS
+ STATUS Restituisce il livello di accesso corrente di
+ un utente su un canale
+CHAN_HELP_CMD_REGISTER
+ REGISTER Registra un canale
+CHAN_HELP_CMD_IDENTIFY
+ IDENTIFY Ti identifica come fondatore di un canale
+CHAN_HELP_CMD_SET
+ SET Imposta le opzioni e le informazioni di canale
+CHAN_HELP_CMD_AOP
+ AOP Modifica la lista degli utenti AOP
+CHAN_HELP_CMD_SOP
+ SOP Modifica la lista degli utenti SOP
+CHAN_HELP_CMD_ACCESS
+ ACCESS Modifica la lista degli utenti con privilegi
+CHAN_HELP_CMD_LEVELS
+ LEVELS Ridefinisce i privilegi dei livelli di accesso
+CHAN_HELP_CMD_AKICK
+ AKICK Modifica la lista AutoKick
+CHAN_HELP_CMD_DROP
+ DROP Annulla la registrazione di un canale
+CHAN_HELP_CMD_SENDPASS
+ SENDPASS Invia la password del proprio canale via e-mail
+CHAN_HELP_CMD_BAN
+ BAN Permette di bannare un utente
+CHAN_HELP_CMD_CLEAR
+ CLEAR Annulla varie impostazioni del canale
+CHAN_HELP_CMD_DEVOICE
+ DEVOICE Toglie lo stato di voice a un utente (-v)
+CHAN_HELP_CMD_GETKEY
+ GETKEY Recupera la password (chiave) di un canale
+CHAN_HELP_CMD_INFO
+ INFO Mostra le informazioni su un canale
+CHAN_HELP_CMD_INVITE
+ INVITE Richiede un invito per un canale
+CHAN_HELP_CMD_KICK
+ KICK Espelle un utente da un canale (kick)
+CHAN_HELP_CMD_LIST
+ LIST Mostra la lista dei canali
+CHAN_HELP_CMD_LOGOUT
+ LOGOUT Deidentifica dal canale specificato
+CHAN_HELP_CMD_OP
+ OP Assegna lo stato di operatore a un utente (+o)
+CHAN_HELP_CMD_TOPIC
+ TOPIC Cambia il topic di un canale
+CHAN_HELP_CMD_UNBAN
+ UNBAN Rimuove i ban che impediscono l'accesso a un canale
+CHAN_HELP_CMD_VOICE
+ VOICE Assegna lo stato di voice a un utente (+v)
+CHAN_HELP_CMD_VOP
+ VOP Modifica la lista degli utenti VOP
+CHAN_HELP_CMD_DEHALFOP
+ DEHALFOP Toglie lo stato di mezzo operatore a un utente
+CHAN_HELP_CMD_DEOWNER
+ DEOWNER Toglie lo stato di owner a un utente
+CHAN_HELP_CMD_DEPROTECT
+ DEPROTECT Toglie lo stato di protezione a un utente
+CHAN_HELP_CMD_HALFOP
+ HALFOP Assegna lo stato di mezzo operatore a un utente (+h)
+CHAN_HELP_CMD_HOP
+ HOP Modifica la lista degli utenti HOP
+CHAN_HELP_CMD_OWNER
+ OWNER Assegna lo stato di owner a un utente (+q)
+CHAN_HELP_CMD_PROTECT
+ PROTECT Assegna lo stato di protezione a un utente (+a)
+CHAN_HELP_CMD_ADMIN
+ ADMIN Protegge un nick su un canale
+CHAN_HELP_CMD_DEADMIN
+ DEADMIN Sprotegge un nick su un canale
+CHAN_HELP_CMD_DEOP
+ DEOP Toglie lo stato di operatore a un utente (-o)
+
+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
+ %R%S comando. Per avere maggiori informazioni su
+ un comando specifico, digita %R%S HELP comando.
+
+
+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 (%R%S HELP ACCESS).
+
+ NOTA: Per registrare un canale, devi aver prima
+ registrato il tuo nick. Se non l'hai fatto, digita
+ %R%s HELP per avere informazioni su come farlo.
+
+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 %R%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 %R%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 %R%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 %R%S HELP ACCESS per
+ maggiori informazioni, e %R%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 %R%S HELP ACCESS per
+ maggiori informazioni, e %R%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 %R%S HELP ACCESS per
+ maggiori informazioni, e %R%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 %R%S HELP ACCESS per
+ maggiori informazioni, e %R%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 %R%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
+ %R%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 | entry-num | list}
+ AKICK canale LIST [mask | entry-num | list]
+ AKICK canale VIEW [mask | entry-num | list]
+ 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.
+ When akicking a registered nick the nickserv account
+ will be added to the akick list instead of the mask.
+ All users within that nickgroup will then be akicked.
+
+ 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 %R%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.
+ HOPS Rimuove lo stato di halfoperator (modo +h) da
+ tutti gli halfoperator del canale, se supportato.
+ 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 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.
+
+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.
+
+ Il motivo potrebbe essere richiesto su alcune reti.
+
+ Limitato ai Services admin.
+
+CHAN_SERVADMIN_HELP_SUSPEND
+ Sintassi: SUSPEND canale [motivo]
+
+ Impedisce chiunque dal registrare o utilizzare il canale
+ specificato. Può essere annullato utilizzando il comando
+ UNSUSPEND preservando tutti i dati e le impostazioni precedenti.
+
+ Il motivo potrebbe essere richiesto su alcune reti.
+
+ Limitato ai Services admin.
+
+CHAN_SERVADMIN_HELP_UNSUSPEND
+ Sintassi: UNSUSPEND canale
+
+ Rilascia un canale sospeso. Tutti i dati e le impostazioni
+ sono preservate da prima della sospensione.
+
+ Limitato ai Services admin.
+
+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_CMD_SEND
+ SEND Invia un memo a un nick o a un canale
+MEMO_HELP_CMD_CANCEL
+ CANCEL Annulla l'ultimo memo inviato
+MEMO_HELP_CMD_LIST
+ LIST Mostra la lista dei propri memo
+MEMO_HELP_CMD_READ
+ READ Legge uno o più memo
+MEMO_HELP_CMD_DEL
+ DEL Cancella uno o più memo
+MEMO_HELP_CMD_SET
+ SET Imposta le opzioni relative ai memo
+MEMO_HELP_CMD_INFO
+ INFO Mostra informazioni sui tuoi nuovi memo
+MEMO_HELP_CMD_RSEND
+ RSEND Invia un memo e richiede una notifica di lettura
+MEMO_HELP_CMD_CHECK
+ CHECK Controlla se l'ultimo memo ad un nick è stato letto
+MEMO_HELP_CMD_SENDALL
+ SENDALL Invia un memo a tutti gli utenti registrati
+MEMO_HELP_CMD_STAFF
+ STAFF Invia un memo a tutti gli opers/admins
+
+MEMO_HELP_HEADER
+ %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:
+
+
+MEMO_HELP_ADMIN
+ non utilizzato.
+MEMO_HELP_OPER
+ non utilizzato.
+MEMO_HELP_FOOTER
+
+ Digita %R%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.
+
+ Se viene usato LAST elimina l'ultimo memo.
+ 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 %R%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.
+
+MEMO_HELP_STAFF
+ Sintassi: STAFF testo-memo
+
+ Invia un memo contenenteo testo-memo a tutto lo services staff.
+ Nota: Se hai degli operatori sia nella lista oper che nella
+ lista admin, riceveranno il memo due volte. Lo stesso vale per
+ gli opers che si trovano sia nella lista root che in altre liste.
+
+MEMO_HELP_SENDALL
+ Sintassi: SENDALL testo-memo
+
+ Invia un memo contenente testo-memo a tutti gli utenti registrati.
+
+MEMO_HELP_RSEND
+ Sintassi: RSEND {nick | canale} testo-memo
+
+ Invia un memo contenente memo-text al nick o canale
+ specificato. Se inviato ad un nickname, il destinatario riceverà
+ un notice che gli segnala il nuovo memo. Il nickname o canale
+ dev'essere registrato.
+ Una volta che il memo viene letto dal destinatario, verrà inviata
+ una notifica automatica al mittente, informandolo che il suo memo
+ è stato letto.
+
+MEMO_HELP_CHECK
+ Sintassi: CHECK nick
+
+ Controlla se l'_ultimo_ memo che hai inviato al nick è stato letto
+ oppure no. Nota che questo funziona unicamente coi nick, non coi canali.
+
+###########################################################################
+#
+# OperServ help messages
+#
+###########################################################################
+OPER_HELP_CMD_GLOBAL
+ GLOBAL Invia un messaggio a tutti gli utenti
+OPER_HELP_CMD_STATS
+ STATS Mostra lo stato dei Services e della rete
+OPER_HELP_CMD_OPER
+ OPER Modifica la lista dei Services operator
+OPER_HELP_CMD_ADMIN
+ ADMIN Modifica la lista dei Services admin
+OPER_HELP_CMD_STAFF
+ STAFF Mostra lo staff dei services con stato online
+OPER_HELP_CMD_MODE
+ MODE Cambia dei modi di un canale
+OPER_HELP_CMD_KICK
+ KICK Kicka un utente da un canale
+OPER_HELP_CMD_CLEARMODES
+ CLEARMODES "Pulisce" i modi di un canale
+OPER_HELP_CMD_KILLCLONES
+ KILLCLONES Killa tutti gli utenti da un certo host
+OPER_HELP_CMD_AKILL
+ AKILL Manipola la lista AKILL
+OPER_HELP_CMD_SGLINE
+ SGLINE Manipola la lista SGLINE
+OPER_HELP_CMD_SQLINE
+ SQLINE Manipola la lista SQLINE
+OPER_HELP_CMD_SZLINE
+ SZLINE Manipola la lista SZLINE
+OPER_HELP_CMD_CHANLIST
+ CHANLIST Mostra tutti i canali
+OPER_HELP_CMD_USERLIST
+ USERLIST Mostra tutti gli utenti
+OPER_HELP_CMD_LOGONNEWS
+ LOGONNEWS Definisce i messaggi da mostrare agli utenti
+ quando si connettono
+OPER_HELP_CMD_RANDOMNEWS
+ RANDOMNEWS Definisce i messaggi da mostrare casualmente
+ agli utenti quando si connettono
+OPER_HELP_CMD_OPERNEWS
+ OPERNEWS Definisce i messaggi da mostrare agli operatori
+OPER_HELP_CMD_SESSION
+ SESSION Mostra la lista delle sessioni degli host
+OPER_HELP_CMD_EXCEPTION
+ EXCEPTION Modifica la lista delle eccezioni al limite delle
+ sessioni
+OPER_HELP_CMD_NOOP
+ NOOP Rimuove temporaneamente tutte le O:line di un server
+OPER_HELP_CMD_JUPE
+ JUPE Disabilita ("jupiter") un server
+OPER_HELP_CMD_IGNORE
+ IGNORE Modifica la lista ignore dei Services
+OPER_HELP_CMD_SET
+ SET Imposta varie opzioni globali dei Services
+OPER_HELP_CMD_RELOAD
+ RELOAD Rilegge il file di configurazione dei Services
+OPER_HELP_CMD_UPDATE
+ UPDATE Forza la scrittura su disco immediata dei database
+ dei Services
+OPER_HELP_CMD_RESTART
+ RESTART Salva i database e riavvia i Services
+OPER_HELP_CMD_QUIT
+ QUIT Termina i Services senza salvare i database
+OPER_HELP_CMD_SHUTDOWN
+ SHUTDOWN Termina i Services salvando i database
+OPER_HELP_CMD_DEFCON
+ DEFCON Manipola il sistema DefCon
+OPER_HELP_CMD_CHANKILL
+ CHANKILL Killa tutti gli utenti su di un canale specifico
+OPER_HELP_CMD_OLINE
+ OLINE Imposta le operflag di un utente
+OPER_HELP_CMD_UMODE
+ UMODE Cambia i modi utente di un utente
+OPER_HELP_CMD_SVSNICK
+ SVSNICK Forza il cambio del nickname di un utente
+OPER_HELP_CMD_MODLOAD
+ MODLOAD Carica un modulo
+OPER_HELP_CMD_MODUNLOAD
+ MODUNLOAD Rimuovi un modulo
+OPER_HELP_CMD_MODINFO
+ MODINFO Informazioni su un modulo caricato
+OPER_HELP_CMD_MODLIST
+ MODLIST Elenca i moduli caricati
+
+OPER_HELP
+ Comandi di %S:
+
+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 Root 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.
+
+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
+ Syntax: IGNORE {ADD|DEL|LIST|CLEAR} [time] [nick | mask]
+
+ Allows Services Admins to make Services ignore a nick or mask
+ 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.
+ When adding a mask, it should be in the format user@host
+ or nick!user@host, everything else will be considered a nick.
+ Wildcards are permitted.
+
+ Ignores will not be enforced on IRC Operators.
+
+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 Super Admins di impostare i modi per
+ qualsiasi utente. I parametri sono gli stessi del
+ comando /MODE standard.
+
+OPER_HELP_OLINE
+ Sintassi: OLINE nick flag
+
+ Permette ai Super Admins di impostare le Operflag
+ per qualsiasi utente. Le flag devono essere introdotte
+ da "+" o "-". Per rimuovere tutte le flag, è sufficiente
+ usare "-" senza altri parametri.
+
+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
+ Sintassi: SVSNICK nick nuovonick
+
+ Forza il cambio del nickname di un utente da nick a newnick.
+ Limited to Super 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 Riporta i messaggi di log in un canale
+ DEBUG Attiva o disattiva la modalità di debug
+ NOEXPIRE Attiva o disattiva la modalità no expire
+ SUPERADMIN Attiva o disattiva la modalità SuperAdmin
+ SQL Attiva o disattiva la modalità sql
+ IGNORE Attiva o disattiva la modalità ignore
+ LIST Elenca le opzioni
+
+ 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
+ Sintassi: SET LOGCHAN {ON | OFF}
+
+ Se impostata su on, questa opzione fa scrivere i log dei services
+ in un canale specificato oltre che al log file. LogChannel dev'essere
+ definito nel file di configurazione dei services per permettere a
+ questa opzione di funzionare.
+
+ This option is equivalent to the command-line option -logchan.
+
+ Nota: Potrebbero esserci problemi di sicurezza se il canale non
+ viene impostato con restrizioni adeguate.
+
+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_SET_SQL
+ Sintassi: SET SQL {ON | OFF}
+
+ Questa impostazione abilita o disabilita l'utilizzo di SQL da parte
+ di Anope. Da usare nel caso che il server SQL diventa irraggiungibile
+ mentre i services stanno lavorando.
+
+OPER_HELP_SET_IGNORE
+ Sintassi: SET IGNORE {ON | OFF}
+
+ Questa impostazione abilita o disabilita l'utilizzo del sistema IGNORE
+ da parte di Anope.
+
+OPER_HELP_SET_LIST
+ Sintassi: SET LIST
+
+ Mostra le varie impostazioni di %S
+
+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_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_MODLOAD
+ Sintassi: MODLOAD NomeFile
+
+ Questo comando carica il modulo chiamato NomeFile dalla cartella
+ modules.
+
+ Limitato ai Services Root.
+
+OPER_HELP_MODUNLOAD
+ Sintassi: MODUNLOAD NomeFile
+
+ Questo comando rimuove il modulo chiamato NomeFile dalla cartella
+ modules.
+
+ Limitato ai Services Root.
+
+OPER_HELP_MODINFO
+ Sintassi: MODINFO NomeFile
+
+ Questo comando elenca informazioni sul modulo caricato specificato
+
+ Limitato ai Services Root.
+
+OPER_HELP_MODLIST
+ Sintassi: MODLIST [Core|3rd|protocol|encryption|supported|qatested]
+
+ Elenca tutti i moduli attualmente caricati.
+
+ Limitato ai Services Root.
+
+
+###########################################################################
+#
+# BotServ help messages
+#
+###########################################################################
+
+
+BOT_HELP_CMD_BOTLIST
+ BOTLIST Mostra la lista dei bot disponibili
+BOT_HELP_CMD_ASSIGN
+ ASSIGN Assegna un bot a un canale
+BOT_HELP_CMD_SET
+ SET Imposta le opzioni del bot
+BOT_HELP_CMD_KICK
+ KICK Configura i kick
+BOT_HELP_CMD_BADWORDS
+ BADWORDS Gestisce la lista delle parolacce
+BOT_HELP_CMD_ACT
+ ACT Invia un /me in canale
+BOT_HELP_CMD_INFO
+ INFO Mostra informazioni su un bot o su un canale
+BOT_HELP_CMD_SAY
+ SAY Fa sì che il bot dica qualcosa in canale
+BOT_HELP_CMD_UNASSIGN
+ UNASSIGN Rimuove il bot da un canale
+BOT_HELP_CMD_BOT
+ BOT Gestisce la lista dei bot disponibili
+
+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 %R%S comando.
+ Per maggiori informazioni sull'uso di un comando
+ specifico, digita %R%S HELP comando.
+
+BOT_HELP_FOOTER
+ 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 %R%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 %R%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 %R%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
+ %R%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_BOT
+ Sintassi: BOT ADD nick ident host realname
+ BOT CHANGE vecchionick nuovonick [ident [host [realname]]]
+ BOT DEL nick
+
+ 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.
+
+ 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
+ i vhost per il gruppo %s sono stati rimossi.
+HOST_DELALL_SYNTAX
+ Sintassi: 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
+ L'ident per un vhost dev'essere nel formato di un ident valido
+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: %R%s set <nick> <hostmask>.
+HOST_SETALL_SYNTAX
+ Sintassi: %R%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: %R%s del <nick>.
+HOST_OFF_UNREAL
+ Il tuo vhost è stato rimosso. Per riattivare il mascheramento standard del tuo host o IP, digita /mode %s +%s
+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.
+HOST_GROUP
+ Tutti i vhost nel gruppo %s sono stati impostati a %s
+HOST_IDENT_GROUP
+ Tutti i vhost nel gruppo %s sono stati impostati a %s@%s
+HOST_LIST_FOOTER
+ Mostrato tutti i records (Conteggio: %d)
+HOST_LIST_RANGE_FOOTER
+ Mostrato records da %d a %d
+HOST_LIST_KEY_FOOTER
+ Mostrato records corrispondenti alla chiave %s (Conteggio: %d)
+
+###########################################################################
+#
+# HostServ Help messages
+#
+###########################################################################
+HOST_HELP_CMD_ON
+ ON Attiva il tuo vhost
+HOST_HELP_CMD_OFF
+ OFF Disattiva il tuo vhost
+HOST_HELP_CMD_GROUP
+ GROUP Sincronizza il vhost per tutti i nick nel gruppo
+HOST_HELP_CMD_SET
+ SET Imposta il vhost di un altro utente
+HOST_HELP_CMD_SETALL
+ SETALL Imposta il vhost per tutti i nick di un gruppo
+HOST_HELP_CMD_DEL
+ DEL Rimuove il vhost di un altro utente
+HOST_HELP_CMD_DELALL
+ DELALL Rimuove il vhost da tutti i nick di un gruppo
+HOST_HELP_CMD_LIST
+ LIST Mostra uno o più vhost nel database
+
+HOST_OPER_HELP
+ non utilizzato.
+
+HOST_ADMIN_HELP
+ non utilizzato.
+
+HOST_HELP
+ Comandi di %S:
+
+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
+ Sintassi: DELALL <nick>.
+
+ Rimuove il vhost da tutti i nick dello stesso gruppo del nick
+ specificato.
+
+ Limitato agli 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
+ Sintassi: LIST [<chiave>|<#X-Y>]
+
+ Questo comando elenca i vhost registrati all'operatore.
+ Se una chiave è specificata, verranno mostrati unicamente i
+ vhost corrispondenti a quanto immesso come <chiave>, ad
+ esempio Rob* per tutte le corrispondenze che iniziano con "Rob"
+
+ Se viene usata una lista in stile #X-Y, verranno mostrate unicamente
+ le corrispondenze tra X ed Y, ad es. #1-3 mostrerà unicamente le prime
+ 3 corrispondenze nick/vhost.
+
+ L'elenco utilizza il valore di NSListMax come limite per
+ il numero di elementi da mostrare ad un operatore alla volta.
+
+ Limitato ai Services oper.
+
+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.
+
+OPER_SVSNICK_UNSUPPORTED
+ Spiacente, SVSNICK non è disponibile su questa rete.
+
+OPER_SQLINE_UNSUPPORTED
+ Spiacente, SQLINE non è disponibile su questa rete.
+
+OPER_SVSO_UNSUPPORTED
+ Spiacente, OLINE non è disponibile su questa rete.
+
+OPER_UMODE_UNSUPPORTED
+ Spiacente, UMODE non è disponibile su questa rete.
+
+OPER_SUPER_ADMIN_NOT_ENABLED
+ L'impostazione SuperAdmin non è abilitata in services.conf
+
diff --git a/lang/langcomp.c b/lang/langcomp.c
new file mode 100644
index 000000000..bd9bf2646
--- /dev/null
+++ b/lang/langcomp.c
@@ -0,0 +1,275 @@
+/* Compiler for language definition files.
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+
+/*
+ * 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 */
+
+#ifdef _WIN32
+#define snprintf _snprintf
+#endif
+
+char *anopeStrDup(const char *src);
+
+/*************************************************************************/
+
+/* 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", "rb"))) {
+ 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++] = anopeStrDup(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 *ano_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;
+ }
+}
+
+/*************************************************************************/
+char *anopeStrDup(const char *src) {
+ char *ret=NULL;
+ if(src) {
+ if( (ret = (char *)malloc(strlen(src)+1)) ) {;
+ strcpy(ret,src);
+ }
+ }
+ return ret;
+}
+
+/*************************************************************************/
+int main(int ac, char **av)
+{
+ 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, "rb"))) {
+ perror(filename);
+ return 1;
+ }
+ if (!(out = fopen(outfile, "wb"))) {
+ perror(outfile);
+ return 1;
+ }
+
+ while (maxerr > 0 && (line = ano_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/langtool.c b/lang/langtool.c
new file mode 100644
index 000000000..f97f29b99
--- /dev/null
+++ b/lang/langtool.c
@@ -0,0 +1,74 @@
+/* Language stuff generator for win32.
+ *
+ * (C) 2003-2008 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.
+ *
+ * Written by Dominick Meglio <codemastr@unrealircd.com>
+ *
+ */
+
+#include <string.h>
+#include <stdio.h>
+
+char *strip(char *str)
+{
+ char *c;
+ if ((c = strchr(str,'\n')))
+ *c = 0;
+ if ((c = strchr(str,'\r')))
+ *c = 0;
+ return str;
+}
+
+int main(int argc, char *argv[])
+{
+ if (argc < 2)
+ exit(1);
+
+ /* Build the index file */
+ if (!strcmp(argv[1], "index"))
+ {
+ FILE *fd = fopen("en_us.l", "rb");
+ FILE *fdout = fopen("index", "wb");
+ char buf[1024];
+ if (!fd || !fdout)
+ exit(2);
+
+ while (fgets(buf, 1023, fd))
+ {
+ if (isupper(*buf))
+ fprintf(fdout, "%s", buf);
+ }
+ fclose(fd);
+ fclose(fdout);
+ }
+ /* Build the language.h file */
+ else if (!strcmp(argv[1], "language.h"))
+ {
+ FILE *fd = fopen("index", "r");
+ FILE *fdout = fopen("language.h", "w");
+ char buf[1024];
+ int i = 0;
+
+ if (!fd || !fdout)
+ exit(2);
+
+ fprintf(stderr, "Generating language.h... ");
+
+ while (fgets(buf, 1023, fd)) {
+ fprintf(fdout, "#define %-32s %d\n", strip(buf), i++);
+ }
+
+ fprintf(fdout, "#define NUM_STRINGS %d\n", i);
+ fprintf(stderr, "%d strings\n", i);
+ fclose(fd);
+ fclose(fdout);
+ }
+ return 0;
+
+}
diff --git a/lang/nl.l b/lang/nl.l
new file mode 100644
index 000000000..97cd294c8
--- /dev/null
+++ b/lang/nl.l
@@ -0,0 +1,6702 @@
+# Dutch Language File
+#
+# (C) 2003-2008 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 us know
+# (dev@anope.org) 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
+# services.conf). 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. "%R%s HELP" voor help.
+SYNTAX_ERROR
+ Gebruik: %s
+MORE_INFO
+ %R%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.
+INVALID_TARGET
+ "/msg %s" is no longer supported. Use "/msg %s@%s" or "/%s" instead.
+
+# 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_TOO_LONG
+ Je wachtwoord is te lang. Probeer het opnieuw met een korter wachtwoord.
+
+NICK_NOT_REGISTERED
+ Je nick is niet geregistreerd.
+NICK_NOT_REGISTERED_HELP
+ Je nick is niet geregistreerd. Type %R%s HELP voor informatie over het registreren van je nick.
+NICK_X_IS_SERVICES
+ Nick %s is deel van de Services van dit netwerk.
+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.
+NICK_X_SUSPENDED
+ Nick %s is tijdelijk buiten werking gesteld.
+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 %R%s IDENTIFY wachtwoord.
+CHAN_IDENTIFY_REQUIRED
+ Wachtwoord verificatie is benodigd voor dat commando.
+ Probeer opnieuw na het typen van %R%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
+LIST_INCORRECT_RANGE
+ Ongeldig bereik opgegeven. Het correct gebruik is #van-tot.
+CS_LIST_INCORRECT_RANGE
+ Om te zoeken naar kanalen die met een # beginnen moet gezocht
+ worden naar de kanaalnaam zonder het #-teken ervoor (anope
+ in plaats van #anope).
+
+###########################################################################
+#
+# NickServ messages
+#
+###########################################################################
+
+# Automatic messages
+HELP_LIMIT_SERV_OPER
+
+ Gelimiteerd tot Services Operators.
+HELP_LIMIT_SERV_ADMIN
+
+ Gelimiteerd tot Services Administrators.
+HELP_LIMIT_SERV_ROOT
+
+ Gelimiteerd tot Services Roots.
+HELP_LIMIT_IRC_OPER
+
+ Gelimiteerd tot IRC Operators.
+HELP_LIMIT_HOST_SETTER
+
+ Gelimiteerd tot Host Setters.
+HELP_LIMIT_HOST_REMOVER
+
+ Gelimiteerd tot Host Removers.
+
+
+###########################################################################
+#
+# NickServ messages
+#
+###########################################################################
+
+# Automatic messages
+NICK_IS_REGISTERED
+ Deze nick is eigendom van iemand anders. Kies een andere.
+ (Als dit jouw nick is, type %R%s IDENTIFY wachtwoord.)
+NICK_IS_SECURE
+ Deze nickname is geregistreerd en beschermd. Als het jouw
+ nick is, type %R%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_REGISTERED_NO_MASK
+ Nickname %s is geregistreerd.
+NICK_PASSWORD_IS
+ Je wachtwoord is %s - onthoudt dit voor later gebruik.
+
+# GROUP responses
+NICK_REG_DELAY
+ You have to be connected longer than %d seconds to register your nick.
+
+# 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 %R%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 %R%s HELP GLIST en%R%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 %R%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_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 %R%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
+ Groet 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_HIDE_STATUS_ON
+ Your services access status will now be hidden from %s INFO displays.
+NICK_SET_HIDE_STATUS_OFF
+ Your services access status will now be shown in %s INFO displays.
+
+# 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 AUTOOP responses
+NICK_SET_AUTOOP_SYNTAX
+ SET AUTOOP {ON | OFF}
+NICK_SET_AUTOOP_ON
+ Services will now autoop you in channels.
+NICK_SET_AUTOOP_OFF
+ Services will no longer autoop you in channels.
+
+
+# SET NOEXPIRE responses
+NICK_SASET_SYNTAX
+ SASET nickname option parameters
+NICK_SASET_DISABLED
+ Sorry, nickname option setting is temporarily disabled.
+NICK_SASET_UNKNOWN_OPTION
+ Unknown SASET option %s.
+NICK_SASET_BAD_NICK
+ Nickname %s not registered.
+NICK_SASET_OPTION_DISABLED
+ Option %s cannot be set on this network.
+
+# SASET DISPLAY responses
+NICK_SASET_DISPLAY_INVALID
+ The new display for %s MUST be a nickname of the nickname group!
+NICK_SASET_DISPLAY_CHANGED
+ The new display is now %s.
+
+# SASET PASSWORD responses
+NICK_SASET_PASSWORD_FAILED
+ Sorry, couldn't change password for %s.
+NICK_SASET_PASSWORD_CHANGED
+ Password for %s changed.
+NICK_SASET_PASSWORD_CHANGED_TO
+ Password for %s changed to %s.
+
+# SASET LANGUAGE responses
+NICK_SASET_URL_CHANGED
+ URL for %s changed to %s.
+NICK_SASET_URL_UNSET
+ URL %s unset.
+
+# SASET EMAIL responses
+NICK_SASET_EMAIL_CHANGED
+ E-mail address for %s changed to %s.
+NICK_SASET_EMAIL_UNSET
+ E-mail address for %s unset.
+NICK_SASET_EMAIL_UNSET_IMPOSSIBLE
+ You cannot unset the e-mail on this network.
+
+# SASET ICQ responses
+NICK_SASET_ICQ_CHANGED
+ ICQ number for %s set to %s.
+NICK_SASET_ICQ_UNSET
+ ICQ number for %s unset.
+NICK_SASET_ICQ_INVALID
+ %s is not a valid number.
+
+# SASET GREET responses
+NICK_SASET_GREET_CHANGED
+ Greet message for %s changed to %s.
+NICK_SASET_GREET_UNSET
+ Greet message for %s unset.
+
+# SASET PROTECT responses
+NICK_SASET_KILL_SYNTAX
+ SASET nickname KILL {ON | QUICK | OFF}
+NICK_SASET_KILL_IMMED_SYNTAX
+ SASET nickname KILL {ON | QUICK | IMMED | OFF}
+NICK_SASET_KILL_ON
+ Protection is now ON for %s.
+NICK_SASET_KILL_QUICK
+ Protection is now ON for %s, with a reduced delay.
+NICK_SASET_KILL_IMMED
+ Protection is now ON for %s, with no delay.
+NICK_SASET_KILL_IMMED_DISABLED
+ The IMMED option is not available on this network.
+NICK_SASET_KILL_OFF
+ Protection is now OFF for %s.
+
+# SASET SECURE responses
+NICK_SASET_SECURE_SYNTAX
+ SASET nickname SECURE {ON | OFF}
+NICK_SASET_SECURE_ON
+ Secure option is now ON for %s.
+NICK_SASET_SECURE_OFF
+ Secure option is now OFF for %s.
+
+# SASET PRIVATE responses
+NICK_SASET_PRIVATE_SYNTAX
+ SASET nickname PRIVATE {ON | OFF}
+NICK_SASET_PRIVATE_ON
+ Private option is now ON for %s.
+NICK_SASET_PRIVATE_OFF
+ Private option is now OFF for %s.
+
+# SASET HIDE responses
+NICK_SASET_HIDE_SYNTAX
+ SET nickname HIDE {EMAIL | USERMASK | QUIT} {ON | OFF}
+NICK_SASET_HIDE_EMAIL_ON
+ The E-mail address of %s will now be hidden from %s INFO displays.
+NICK_SASET_HIDE_EMAIL_OFF
+ The E-mail address of %s will now be shown in %s INFO displays.
+NICK_SASET_HIDE_MASK_ON
+ The last seen user@host mask of %s will now be hidden from %s INFO displays.
+NICK_SASET_HIDE_MASK_OFF
+ The last seen user@host mask of %s will now be shown in %s INFO displays.
+NICK_SASET_HIDE_QUIT_ON
+ The last quit message of %s will now be hidden from %s INFO displays.
+NICK_SASET_HIDE_QUIT_OFF
+ The last quit message of %s will now be shown in %s INFO displays.
+NICK_SASET_HIDE_STATUS_ON
+ The services access status of %s will now be hidden from %s INFO displays.
+NICK_SASET_HIDE_STATUS_OFF
+ The services access status of %s will now be shown in %s INFO displays.
+
+# SASET MSG responses
+NICK_SASET_MSG_SYNTAX
+ SSAET nickname PRIVATE {ON | OFF}
+NICK_SASET_MSG_ON
+ Services will now reply to %s with messages.
+NICK_SASET_MSG_OFF
+ Services will now reply to %s with notices.
+
+# SET NOEXPIRE responses
+NICK_SASET_NOEXPIRE_SYNTAX
+ SASET nickname NOEXPIRE {ON | OFF}
+NICK_SASET_NOEXPIRE_ON
+ Nick %s will not expire.
+NICK_SASET_NOEXPIRE_OFF
+ Nick %s will expire.
+
+# ACCESS responses
+NICK_SASET_AUTOOP_SYNTAX
+ SASET nickname AUTOOP {ON | OFF}
+NICK_SASET_AUTOOP_ON
+ Services will now autoop %s in channels.
+NICK_SASET_AUTOOP_OFF
+ Services will no longer autoop %s in channels.
+
+# SASET LANGUAGE responses
+NICK_SASET_LANGUAGE_SYNTAX
+ SASET nickname LANGUAGE number
+NICK_SASET_LANGUAGE_UNKNOWN
+ Unknown language number %d. Type %R%s HELP SET LANGUAGE for a list of languages.
+NICK_SASET_LANGUAGE_CHANGED
+ Language changed to Dutch.
+
+
+# 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:
+NICK_ACCESS_LIST_EMPTY
+ Your access list is empty.
+NICK_ACCESS_LIST_X_EMPTY
+ Access list for %s is empty.
+
+# Status messages
+NICK_STATUS_0
+ STATUS %s 0
+NICK_STATUS_1
+ STATUS %s 1
+NICK_STATUS_2
+ STATUS %s 2
+NICK_STATUS_3
+ STATUS %s 3
+
+# 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_SERVICES_ROOT
+ %s is a services root administrator.
+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_VHOST2
+ vhost: %s@%s
+NICK_INFO_ICQ
+ ICQ #: %d
+NICK_INFO_GREET
+ Groet-bericht: %s
+NICK_INFO_OPTIONS
+ Opties: %s
+NICK_INFO_EXPIRE
+ Expires in: %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_AUTOOP
+ Auto-op
+NICK_INFO_OPT_NONE
+ Geen
+NICK_INFO_NO_EXPIRE
+ Deze nick zal niet verlopen.
+NICK_INFO_FOR_MORE
+ Voor meer informatie, type %R%s INFO %s ALL.
+
+# LIST responses
+NICK_INFO_SUSPENDED
+ Deze nick is tijdelijk buiten werking gesteld, reden: %s
+NICK_INFO_SUSPENDED_NO_REASON
+ Deze nick is tijdelijk buiten werking gesteld
+
+# LIST responses
+NICK_LIST_SYNTAX
+ LIST trefbeeld
+NICK_LIST_SERVADMIN_SYNTAX
+ LIST trefbeeld [FORBIDDEN] [SUSPENDED] [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.
+NICK_GLIST_REPLY
+ %c%s
+NICK_GLIST_REPLY_ADMIN
+ %c%s (expires in %s)
+
+# 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.
+ %R%s RELEASE %s om deze voor de %s 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_SUSPEND_SYNTAX
+ SUSPEND nick reden
+NICK_SUSPEND_SUCCEEDED
+ Nick %s is tijdelijk buiten werking gesteld.
+NICK_SUSPEND_FAILED
+ Kan nick %s niet tijdelijk buiten werking stellen!
+
+# UNSUSPEND responses
+NICK_UNSUSPEND_SYNTAX
+ UNSUSPEND nick
+NICK_UNSUSPEND_SUCCEEDED
+ Nick %s is nu vrijgegeven.
+NICK_UNSUSPEND_FAILED
+ Kan nick %s niet vrijgeven!
+
+# 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
+ Verbieden van nick %s is niet gelukt!
+
+# 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 %R%s confirm <verificatiecode> om de registratie te voltooien.
+NICK_CONFIRM_NOT_FOUND
+ Registratie stap 1 kan verlopen zijn. Gebruik eerst "%R%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 " %R%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_X_INVALID
+ Channel %s is not a valid channel.
+
+# 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 %R%s HELP voor meer informatie over het registreren van nicknames.
+CHAN_MUST_IDENTIFY_NICK
+ Identificeer eerst met %s, door middel van het commando:
+ %R%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.
+CHAN_REGISTER_NONE_CHANNEL
+ Je hebt geprobeerd om niet-bestaand kanaal %s te registeren.
+CHAN_SYMBOL_REQUIRED
+ Gebruik het # symbool wanner je probeert een kanaal te registeren.
+
+
+# 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 (except the channel founder).
+CHAN_LOGOUT_FOUNDER_FAILED
+ You may not log out of %s (you are founder).
+
+# 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 retention option for %s is now ON.
+CHAN_SET_KEEPTOPIC_OFF
+ Topic retention option for %s is now OFF.
+
+# SET TOPICLOCK responses
+CHAN_SET_TOPICLOCK_SYNTAX
+ SET kanaal TOPICLOCK {ON | OFF}
+CHAN_SET_TOPICLOCK_ON
+ Topic lock option for %s is now ON.
+CHAN_SET_TOPICLOCK_OFF
+ Topic lock option for %s is now OFF.
+
+# SET PEACE responses
+CHAN_SET_PEACE_SYNTAX
+ SET kanaal PEACE {ON | OFF}
+CHAN_SET_PEACE_ON
+ Peace option for %s is now ON.
+CHAN_SET_PEACE_OFF
+ Peace option for %s is now OFF.
+
+# SET PRIVATE responses
+CHAN_SET_PRIVATE_SYNTAX
+ SET kanaal PRIVATE {ON | OFF}
+CHAN_SET_PRIVATE_ON
+ Private option for %s is now ON.
+CHAN_SET_PRIVATE_OFF
+ Private option for %s is now OFF.
+
+# SET SECUREOPS responses
+CHAN_SET_SECUREOPS_SYNTAX
+ SET kanaal SECUREOPS {ON | OFF}
+CHAN_SET_SECUREOPS_ON
+ Secure ops option for %s is now ON.
+CHAN_SET_SECUREOPS_OFF
+ Secure ops option for %s is now OFF.
+
+# SET SECUREFOUNDER responses
+CHAN_SET_SECUREFOUNDER_SYNTAX
+ SET kanaal SECUREFOUNDER {ON | OFF}
+CHAN_SET_SECUREFOUNDER_ON
+ Secure founder option for %s is now ON.
+CHAN_SET_SECUREFOUNDER_OFF
+ Secure founder option for %s is now OFF.
+
+# SET RESTRICTED responses
+CHAN_SET_RESTRICTED_SYNTAX
+ SET kanaal RESTRICTED {ON | OFF}
+CHAN_SET_RESTRICTED_ON
+ Restricted access option for %s is now ON.
+CHAN_SET_RESTRICTED_OFF
+ Restricted access option for %s is now OFF.
+
+# SET SECURE responses
+CHAN_SET_SECURE_SYNTAX
+ SET kanaal SECURE {ON | OFF}
+CHAN_SET_SECURE_ON
+ Secure option for %s is now ON.
+CHAN_SET_SECURE_OFF
+ Secure option for %s is now OFF.
+
+# SET SIGNKICK responses
+CHAN_SET_SIGNKICK_SYNTAX
+ SET kanaal SIGNKICK {ON | LEVEL | OFF}
+CHAN_SET_SIGNKICK_ON
+ Signed kick option for %s is now ON.
+CHAN_SET_SIGNKICK_LEVEL
+ Signed kick option for %s is now ON, but depends of the
+ level of the user that is using the command.
+CHAN_SET_SIGNKICK_OFF
+ Signed kick option for %s is now OFF.
+
+# SET OPNOTICE responses
+CHAN_SET_OPNOTICE_SYNTAX
+ SET kanaal OPNOTICE {ON | OFF}
+CHAN_SET_OPNOTICE_ON
+ Op-notice option for %s is now ON.
+CHAN_SET_OPNOTICE_OFF
+ Op-notice option for %s is now OFF.
+
+# SET XOP responses
+CHAN_SET_XOP_SYNTAX
+ SET kanaal XOP {ON | OFF}
+CHAN_SET_XOP_ON
+ xOP lists system for %s is now ON.
+CHAN_SET_XOP_OFF
+ xOP lists system for %s is now OFF.
+
+# 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 %R%s HELP ACCESS voor meer informatie.
+CHAN_XOP_NOT_AVAILABLE
+ xOP system is not available.
+
+# 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 %s 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 %s 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 %s SOP lijst 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 %s 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 %R%s HELP command voor meer informatie.
+CHAN_ACCESS_XOP_HOP
+ You can't use this command.
+ Use the AOP, SOP, HOP and VOP commands instead.
+ Type %R%s HELP command for more information.
+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 %s 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 %s 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 %R%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.
+
+# Status Messages
+CHAN_STATUS_SYNTAX
+ STATUS ERROR Syntax error
+CHAN_STATUS_NOT_REGGED
+ STATUS ERROR Channel %s not registered
+CHAN_STATUS_FORBIDDEN
+ STATUS ERROR Channel %s forbidden
+CHAN_STATUS_NOTONLINE
+ STATUS ERROR Nick %s not online
+CHAN_STATUS_INFO
+ STATUS %s %s %d
+
+# 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_EXPIRE
+ Expires in: %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_HOPS
+ Mode +h 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.
+CHAN_CLEARED_INVITES
+ All invites on channel %s have been removed.
+
+# 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_GETKEY_SYNTAX
+ GETKEY channel
+CHAN_GETKEY_NOKEY
+ The channel %s has no key.
+CHAN_GETKEY_KEY
+ KEY %s %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 %R%s READ LAST om deze te lezen.
+MEMO_TYPE_READ_NUM
+ Type %R%s READ %d om deze te lezen.
+MEMO_TYPE_LIST_NEW
+ Type %R%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 %R%s READ %s %d om deze te lezen.
+MEMO_NEW_MEMO_ARRIVED
+ Je hebt een nieuwe memo van %s.
+ Type %R%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: %R%s READ nr
+MEMO_LIST_NEW_MEMOS
+ Nieuwe memo's voor %s. Om te lezen, type: %R%s READ nr
+MEMO_LIST_CHAN_MEMOS
+ Memo's voor %s. Om te lezen, type: %R%s READ %s nr
+MEMO_LIST_CHAN_NEW_MEMOS
+ Nieuwe memo's voor %s. Om te lezen, type: %R%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: %R%s DEL %d
+MEMO_CHAN_HEADER
+ Memo %d van %s (%s). Om te verwijderen, type: %R%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_NOTIFY_MAIL
+ You will now be informed about new memos via email.
+MEMO_SET_NOTIFY_NOMAIL
+ You will no longer be informed via email.
+MEMO_SET_NOTIFY_INVALIDMAIL
+ There's no email address set for your nick.
+
+# 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
+MEMO_MAIL_SUBJECT
+ Nieuwe memo
+MEMO_MAIL_TEXT1
+ Hoi %s
+MEMO_MAIL_TEXT2
+ Je hebt zojuist een memo ontvangen van %s. Het gaat om memo nummer %d.
+MEMO_MAIL_TEXT3
+ Inhoud van de memo:
+
+###########################################################################
+#
+# BotServ messages
+#
+###########################################################################
+
+# Standard responses
+MEMO_RSEND_PLEASE_WAIT
+ Wacht %d seconden voor je het RSEND commando weer gebruikt.
+MEMO_RSEND_DISABLED
+ Sorry, RSEND is uitgeschakeld op dit netwerk.
+MEMO_RSEND_SYNTAX
+ RSEND {nick | kanaal} memo-tekst
+MEMO_RSEND_NICK_MEMO_TEXT
+ [auto-memo] De memo die je gestuurd hebt is bekeken.
+MEMO_RSEND_CHAN_MEMO_TEXT
+ [auto-memo] De memo die je naar %s gestuurd hebt is bekeken.
+MEMO_RSEND_USER_NOTIFICATION
+ Een notificatie-memo is naar %s verstuurd om hem/haar te
+ informeren dat je zijn/haar memo gelezen hebt.
+
+###########################################################################
+#
+# BotServ messages
+#
+###########################################################################
+
+# Standard responses
+MEMO_CHECK_SYNTAX
+ CHECK nick
+MEMO_CHECK_NOT_READ
+ De laatste memo die je naar %s gestuurd hebt (op %s) is nog niet gelezen.
+MEMO_CHECK_READ
+ De laatste memo die je naar %s gestuurd hebt (op %s) is gelezen.
+MEMO_CHECK_NO_MEMO
+ Nick %s heeft geen memo van jou.
+
+###########################################################################
+#
+# BotServ messages
+#
+###########################################################################
+
+# Standard responses
+MEMO_NO_RSEND_SELF
+ Je kan geen ontvangstbevestiging aanvragen voor een
+ memo die je naar jezelf stuurt.
+
+###########################################################################
+#
+# 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 %R%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_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 %R%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 UIT.
+
+# 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 UIT 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 %R%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 zal 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.
+BOT_LONG_IDENT
+ Bot Idents mogen maximaal %d tekens bevatten.
+BOT_LONG_HOST
+ Bot Hosts mogen maximaal %d 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_HOSTSERV_MEM
+ HostServ : %6d records, %5d kB
+OPER_STATS_OPERSERV_MEM
+ OperServ : %6d records, %5d kB
+OPER_STATS_SESSIONS_MEM
+ Sessies : %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_STATS_UPLINK_SERVER
+ Uplink server: %s
+OPER_STATS_UPLINK_CAPAB
+ Uplink capab: %s
+OPER_STATS_UPLINK_SERVER_COUNT
+ Servers found: %d
+
+# 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_ADMIN_MOVED
+ %s is verplaatst naar de Services admin lijst.
+
+# 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.
+OPER_OPER_MOVED
+ %s is verplaatst naar de Services operator lijst.
+
+# 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
+ De AKILL lijst is leeggemaakt.
+
+# SGLINE responses
+OPER_CHANKILL_SYNTAX
+ CHANKILL [+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
+ Verlooptijd 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.
+OPER_SET_SQL_ON
+ SQL code wordt gebruikt.
+OPER_SET_SQL_OFF
+ SQL code wordt niet gebruikt.
+OPER_SET_SQL_ERROR
+ Instelling voor SQL moet ON of OFF zijn.
+OPER_SET_SQL_ERROR_INIT
+ Fout tijdens het initialiseren van SQL. Controleer de logs om dit op te lossen.
+OPER_SET_SQL_ERROR_DISABLED
+ SQL is not configured for this network. Please edit the
+ configuration file (services.conf).
+OPER_SET_LIST_OPTION_ON
+ %s is ingeschakeld
+OPER_SET_LIST_OPTION_OFF
+ %s is uitgeschakeld
+
+# 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
+ Bijwerken databases.
+
+# 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 | mask]
+OPER_IGNORE_VALID_TIME
+ Je moet een geldig nummer als tijd invoeren.
+OPER_IGNORE_TIME_DONE
+ %s zal nu genegeerd worden voor %s.
+OPER_IGNORE_PERM_DONE
+ %s zal nu permanent genegeerd worden.
+OPER_IGNORE_DEL_DONE
+ %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_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 niveau veranderd naar %d
+DEFCON_GLOBAL
+ Het Defcon niveau staat nu op niveau: %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_NO_UNLOAD
+ This module can not be unloaded.
+OPER_MODULE_LOAD_SYNTAX
+ MODLOAD bestandsnaam
+OPER_MODULE_UNLOAD_SYNTAX
+ MODUNLOAD bestandsnaam
+OPER_MODULE_LIST_HEADER
+ Huidige Module lijst:
+OPER_MODULE_LIST
+ Module: %s [%s] [%s]
+OPER_MODULE_LIST_FOOTER
+ %d Modules geladen.
+OPER_MODULE_INFO_LIST
+ Module: %s Versie: %s Auteur: %s Geladen: %s
+OPER_MODULE_CMD_LIST
+ Stelt het commando: %R%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 bestandsnaame
+
+###########################################################################
+#
+# 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.
+OPER_EXCEPTION_EXISTS
+ %s bestaat al op de uitzonderingenlijst.
+OPER_EXCEPTION_CHANGED
+ Uitzondering voor %s is veranderd in %d.
+
+# 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.
+
+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.
+
+###########################################################################
+#
+# 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 %s berichten worden verstuurd om het flooden van de
+ gebruiker te voorkomen. Als er meer nieuwsberichten
+ zijn worden alleen de meest recente vestuurd.)
+ NewsCount kan geconfigureerd worden in services.conf.
+
+ 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 %s berichten worden verstuurd om het flooden
+ van de gebruiker te voorkomen. Als er meer nieuwsberichten
+ zijn worden alleen de meest recente vestuurd.)
+ NewsCount kan geconfigureerd worden in services.conf.
+
+ 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:
+
+ %R%s HELP
+ voor informatie over nickname registratie
+
+ %R%s HELP
+ voor informatie over kanaal instellingen en registratie
+
+ %R%s HELP
+ voor informatie over berichten naar offline gebruikers
+ sturen
+
+HELP_HELP_BOT
+
+ %R%s HELP
+ voor informatie over een bot in je kanaal instellen
+
+HELP_HELP_HOST
+
+ %R%s HELP
+ for information on setting up nick vHosts
+
+###########################################################################
+#
+# NickServ help messages
+#
+###########################################################################
+NICK_HELP_CMD_CONFIRM
+ CONFIRM Confirm a nickserv auth code
+NICK_HELP_CMD_RESEND
+ RESEND Resend a nickserv auth code
+
+NICK_HELP_CMD_REGISTER
+ REGISTER Registreer een nickname
+NICK_HELP_CMD_GROUP
+ GROUP Bij een groep aanmelden
+NICK_HELP_CMD_IDENTIFY
+ IDENTIFY Jezelf identificeren met je wachtwoord
+NICK_HELP_CMD_ACCESS
+ ACCESS De lijst met toegestane adressen wijzigen
+NICK_HELP_CMD_SET
+ SET Opties instellen, inclusief kill bescherming
+NICK_HELP_CMD_SASET
+ SASET Set SET-options on another nickname
+NICK_HELP_CMD_DROP
+ DROP De registratie van je nickname annuleren
+NICK_HELP_CMD_RECOVER
+ RECOVER Een andere gebruiker killen die je nick gebruikt
+NICK_HELP_CMD_RELEASE
+ RELEASE Je nick terugnemen nadat je RECOVER gebruikt hebt
+NICK_HELP_CMD_SENDPASS
+ SENDPASS Je wachtwoord vergeten? Probeer dit
+NICK_HELP_CMD_GHOST
+ GHOST Disconnects a "ghost" IRC session using your nick
+NICK_HELP_CMD_ALIST
+ ALIST List channels you have access on
+NICK_HELP_CMD_GLIST
+ GLIST Lists all nicknames in your group
+NICK_HELP_CMD_INFO
+ INFO Displays information about a given nickname
+NICK_HELP_CMD_LIST
+ LIST List all registered nicknames that match a given pattern
+NICK_HELP_CMD_LOGOUT
+ LOGOUT Reverses the effect of the IDENTIFY command
+NICK_HELP_CMD_STATUS
+ STATUS Returns the owner status of the given nickname
+NICK_HELP_CMD_UPDATE
+ UPDATE Updates your current status, i.e. it checks for new memos
+NICK_HELP_CMD_GETPASS
+ GETPASS Bekijk het wachtwoord voor een nick
+ (alleen als encryptie is uitgeschakeld)
+NICK_HELP_CMD_GETEMAIL
+ GETEMAIL Matches and returns all users that registered using given email
+NICK_HELP_CMD_FORBID
+ FORBID Voorkom dat een nick gebruikt wordt
+NICK_HELP_CMD_SUSPEND
+ SUSPEND Suspend a given nick
+NICK_HELP_CMD_UNSUSPEND
+ UNSUSPEND Unsuspend a given nick
+
+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 %R%S commando.
+ Voor meer informatie over een specifiek commando, type
+ %R%S HELP commando.
+
+NICK_HELP_FOOTER
+ 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 %R%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
+ %R%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. (%R%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
+ %R%S LIST
+ HIDE Verberg verschillende soorten nick informatie
+ MSG Verander de communicatiemanier van Services
+ AUTOOP Should services op you automatically.
+
+ Om dit commando te gebruiken moet je je eerst identificeren
+ met je wachtwoord (%R%S HELP IDENTIFY voor meer
+ informatie).
+
+ Type %R%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 je nick
+ 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_SET_AUTOOP
+ Syntax: SET AUTOOP {ON | OFF}
+
+ Sets whether you will be opped automatically. Set to ON to
+ allow ChanServ to op you automatically when entering channels.
+
+NICK_HELP_SASET
+ Syntax: SASET nickname option parameters.
+
+ Sets various nickname options. option can be one of:
+
+ DISPLAY Set the display of the group in Services
+ PASSWORD Set the nickname password
+ URL Associate a URL with the nickname
+ EMAIL Associate an E-mail address with the nickname
+ ICQ Associate an ICQ number with the nickname
+ GREET Associate a greet message with the nickname
+ KILL Turn protection on or off
+ SECURE Turn nickname security on or off
+ PRIVATE Prevent the nickname from appearing in a
+ %R%S LIST
+ HIDE Hide certain pieces of nickname information
+ MSG Change the communication method of Services
+ NOEXPIRE Prevent the nickname from expiring
+ LANGUAGE Set the language Services will use when
+ sending messages to nickname
+
+ Type %R%S HELP SASET option for more information
+ on a specific option. The options will be set on the given
+ nickname.
+
+NICK_HELP_SASET_DISPLAY
+ Syntax: SASET nickname DISPLAY new-display
+
+ Changes the display used to refer to the nickname group in
+ Services. The new display MUST be a nick of the group.
+
+NICK_HELP_SASET_PASSWORD
+ Syntax: SASET nickname PASSWORD new-password
+
+ Changes the password used to identify as the nick's owner.
+
+NICK_HELP_SASET_URL
+ Syntax: SASET nickname URL url
+
+ Associates the given URL with the nickname. This URL
+ will be displayed whenever someone requests information
+ on the nick with the INFO command.
+
+NICK_HELP_SASET_EMAIL
+ Syntax: SASET nickname EMAIL address
+
+ Associates the given E-mail address with the nickname.
+
+NICK_HELP_SASET_ICQ
+ Syntax: SASET nickname ICQ number
+
+ Associates the given ICQ number with the nickname. This
+ number will be displayed whenever someone requests
+ information on the nick with the INFO command.
+
+NICK_HELP_SASET_GREET
+ Syntax: SASET nickname GREET message
+
+ Makes the given message the greet of the nickname, that
+ will be displayed when joining a channel that has GREET
+ option enabled, provided that the user has the necessary
+ access on it.
+
+NICK_HELP_SASET_KILL
+ Syntax: SASET nickname KILL {ON | QUICK | IMMED | OFF}
+
+ Turns the automatic protection option for the nick
+ on or off. With protection on, if another user
+ tries to take the 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_SASET_SECURE
+ Syntax: SASET nickname 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_SASET_PRIVATE
+ Syntax: SASET nickname PRIVATE {ON | OFF}
+
+ Turns %S's privacy option on or off for the nick.
+ With PRIVATE set, the nickname will not appear in
+ nickname lists generated with %S's LIST command.
+ (However, anyone who knows the nickname can still get
+ information on it using the INFO command.)
+
+NICK_HELP_SASET_HIDE
+ Syntax: SASET nickname HIDE {EMAIL | STATUS | USERMASK | QUIT} {ON | OFF}
+
+ Allows you to prevent certain pieces of information from
+ being displayed when someone does a %S INFO on the
+ nick. You can hide the E-mail address (EMAIL), last seen
+ user@host mask (USERMASK), the services access status
+ (STATUS) and last quit message (QUIT).
+ The second parameter specifies whether the information should
+ be displayed (OFF) or hidden (ON).
+
+NICK_HELP_SASET_MSG
+ Syntax: SASET nickname MSG {ON | OFF}
+
+ Allows you to choose the way Services are communicating with
+ the given user. With MSG set, Services will use messages,
+ else they'll use notices.
+
+NICK_HELP_SASET_NOEXPIRE
+ Syntax: SASET nickname NOEXPIRE {ON | OFF}
+
+ Sets whether the given nickname will expire. Setting this
+ to ON prevents the nickname from expiring.
+
+NICK_HELP_SASET_AUTOOP
+ Syntax: SASET nickname AUTOOP {ON | OFF}
+
+ Sets whether the given nickname will be opped automatically.
+ Set to ON to allow ChanServ to op the given nickname
+ automatically when joining channels.
+
+NICK_HELP_SASET_LANGUAGE
+ Syntax: SASET nickname LANGUAGE number
+
+ Changes the language Services uses when sending messages to
+ nickname (for example, when responding to a command he sends).
+ number should be chosen from a list of supported languages
+ that you can get by typing %R%S HELP SET LANGUAGE.
+
+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 %s online blijven om ervoor te zorgen
+ dat de gebruiker niet meteen opnieuw verbindt met dezelfde
+ nick. Na deze tijd kan je je nick opnieuw claimen, of je kan
+ tussentijds je nick terugkrijgen mbv het RELEASE commando.
+ (Bekijk %R%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 %s 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. If no nickname is given, your status
+ will be returned.
+
+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_HELP_CONFIRM
+ Syntax: CONFIRM passcode
+
+ This is the second step of nickname registration process.
+ You must perform this command in order to get your nickname
+ registered with %S. The passcode (or called auth code also)
+ is sent to your e-mail address in the first step of the
+ registration process. For more information about the first
+ stage of the registration process, type: %R%S HELP REGISTER
+
+NICK_HELP_RESEND
+ Syntax: RESEND
+
+ This command will re-send the auth code (also called passcode)
+ to the e-mail address of the user whom is performing it.
+
+NICK_SERVADMIN_HELP
+ 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.
+ (%R%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_INFO
+
+ Services admins mogen het ALL parameter met elke nick gebruiken.
+
+NICK_SERVADMIN_HELP_LIST
+ Gebruik: trefbeeld [FORBIDDEN] [SUSPENDED] [NOEXPIRE] [UNCONFIRMED]
+
+ 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.
+
+ If the FORBIDDEN, SUSPENDED, NOEXPIRE or UNCONFIRMED options are given, only
+ nicks which, respectively, are FORBIDDEN, SUSPENDED, UNCONFIRMED or have the
+ NOEXPIRE flag set will be displayed. If multiple options are
+ given, all nicks matching at least one option will be displayed.
+ These options are limited to 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.
+
+ 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.
+
+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.
+
+
+###########################################################################
+#
+# ChanServ help messages
+#
+###########################################################################
+
+NICK_SERVADMIN_HELP_SUSPEND
+ Gebruik: SUSPEND nick reden / UNSUSPEND nick
+
+ Stelt een nick tijdelijk buiten werking. Een nick die buiten werking
+ is gesteld kan niet worden gebruikt: identificatie wordt uitgeschakeld.
+
+###########################################################################
+#
+# ChanServ help messages
+#
+###########################################################################
+
+NICK_SERVADMIN_HELP_UNSUSPEND
+ Syntax: UNSUSPEND nickname
+
+ UNSUSPENDS a nickname from being used.
+
+###########################################################################
+#
+# ChanServ help messages
+#
+###########################################################################
+CHAN_HELP_CMD_GETPASS
+ GETPASS Haal het stichter-wachtwoord voor een kanaal op
+CHAN_HELP_CMD_FORBID
+ FORBID Verbied het gebruik van een kanaal
+CHAN_HELP_CMD_SUSPEND
+ SUSPEND Stel een kanaal tijdelijk buiten werking terwijl de
+ kanaal-data en -instellingen bewaard blijven.
+CHAN_HELP_CMD_UNSUSPEND
+ UNSUSPEND Stelt een tijdelijk buiten werking gesteld kanaal weer
+ in werking
+CHAN_HELP_CMD_STATUS
+ STATUS Geeft het huidige toegangsniveau van een gebruiker
+ op een kanaal weer
+CHAN_HELP_CMD_REGISTER
+ REGISTER Registreer een kanaal
+CHAN_HELP_CMD_IDENTIFY
+ IDENTIFY Identificeer jezelf met je wachtwoord
+CHAN_HELP_CMD_SET
+ SET Stel kanaal opties en informatie in
+CHAN_HELP_CMD_AOP
+ AOP Wijzig de lijst van AOP's
+CHAN_HELP_CMD_SOP
+ SOP Wijzig de lijst van SOP's
+CHAN_HELP_CMD_ACCESS
+ ACCESS Wijzig de lijst van toegestane gebruikers
+CHAN_HELP_CMD_LEVELS
+ LEVELS Verander de betekenissen van toegangsniveaus
+CHAN_HELP_CMD_AKICK
+ AKICK Beheer de AutoKick lijst
+CHAN_HELP_CMD_DROP
+ DROP Annuleer een kanaalregistratie
+CHAN_HELP_CMD_SENDPASS
+ SENDPASS Wachtwoord vergeten?
+CHAN_HELP_CMD_BAN
+ BAN Bans a selected nick on a channel
+CHAN_HELP_CMD_CLEAR
+ CLEAR Tells ChanServ to clear certain settings on a channel
+CHAN_HELP_CMD_DEVOICE
+ DEVOICE Devoices a selected nick on a channel
+CHAN_HELP_CMD_GETKEY
+ GETKEY Returns the key of the given channel
+CHAN_HELP_CMD_INFO
+ INFO Lists information about the named registered channel
+CHAN_HELP_CMD_INVITE
+ INVITE Tells ChanServ to invite you or a given nick into a channel
+CHAN_HELP_CMD_KICK
+ KICK Kicks a selected nick from a channel
+CHAN_HELP_CMD_LIST
+ LIST Lists all registered channels matching the given pattern
+CHAN_HELP_CMD_LOGOUT
+ LOGOUT This command will logout the selected nickname
+CHAN_HELP_CMD_OP
+ OP Gives Op status to a selected nick on a channel
+CHAN_HELP_CMD_TOPIC
+ TOPIC Manipulate the topic of the specified channel
+CHAN_HELP_CMD_UNBAN
+ UNBAN Remove all bans preventing you from entering a channel
+CHAN_HELP_CMD_VOICE
+ VOICE Voices a selected nick on a channel
+CHAN_HELP_CMD_VOP
+ VOP Maintains the VOP (VOicePeople) list for a channel
+CHAN_HELP_CMD_DEHALFOP
+ DEHALFOP Dehalfops a selected nick on a channel
+CHAN_HELP_CMD_DEOWNER
+ DEOWNER Removes your owner status on a channel
+CHAN_HELP_CMD_DEPROTECT
+ DEPROTECT Deprotects a selected nick on a channel
+CHAN_HELP_CMD_HALFOP
+ HALFOP Halfops a selected nick on a channel
+CHAN_HELP_CMD_HOP
+ HOP Maintains the HOP (HalfOP) list for a channel
+CHAN_HELP_CMD_OWNER
+ OWNER Gives you owner status on channel
+CHAN_HELP_CMD_PROTECT
+ PROTECT Protects a selected nick on a channel
+CHAN_HELP_CMD_ADMIN
+ ADMIN Protects a selected nick on a channel
+CHAN_HELP_CMD_DEADMIN
+ DEADMIN Deprotects a selected nick on a channel
+CHAN_HELP_CMD_DEOP
+ DEOP Deops a selected nick on a channel
+
+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 %R%S commando. Voor meer informatie over een
+ specifiek commando type je %R%S HELP commando.
+
+
+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 (%R%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 %R%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 controle van de kanaalop status
+ SECUREFOUNDER Sterkere controle 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 %R%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 %R%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 %R%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
+ %R%S HELP ACCESS voor meer informatie over toegangs-
+ lijsten, en %R%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
+ %R%S HELP ACCESS voor meer informatie over toegangs-
+ lijsten, en %R%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
+ %R%S HELP ACCESS voor meer informatie over toegangs-
+ lijsten, en %R%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
+ %R%S HELP ACCESS voor meer informatie over toegangs-
+ lijsten, en %R%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.
+ %R%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
+ %R%S HELP LEVELS voor meer informatie.
+
+CHAN_HELP_AKICK
+ Gebruik: AKICK channel ADD {nick | mask} [reden]
+ AKICK channel STICK mask
+ AKICK channel UNSTICK mask
+ AKICK channel DEL {nick | mask | entry-num | lijst}
+ AKICK channel LIST [mask | entry-num | lijst]
+ AKICK channel VIEW [mask | entry-num | lijst]
+ 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".
+ Als een geregistreerde nick wordt toegevoegd, wordt de nickserv
+ account toegevoegd in plaats van de mask. Alle gebruikers binnen
+ deze groep zullen automatisch worden gekicked.
+
+ 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 %R%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.
+ HOPS Verwijder kanaal-halfoperator status (mode +h)
+ van alle kanaal-halfoperators, indien deze
+ mode ondersteund wordt.
+ 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
+
+ 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.
+
+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.
+
+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.
+
+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.
+
+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.
+
+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
+
+###########################################################################
+#
+# MemoServ help messages
+#
+###########################################################################
+MEMO_HELP_CMD_SEND
+ SEND Vertstuur een memo naar een nick of kanaal
+MEMO_HELP_CMD_CANCEL
+ CANCEL Annuleer je laatst verzonden memo
+MEMO_HELP_CMD_LIST
+ LIST Geef je memo's weer
+MEMO_HELP_CMD_READ
+ READ Lees een of meerdere memo's
+MEMO_HELP_CMD_DEL
+ DEL Verwijder een of meerdere memo's
+MEMO_HELP_CMD_SET
+ SET Stel opties gerelateerd aan memo's in
+MEMO_HELP_CMD_INFO
+ INFO Toont info over jouw memo's
+MEMO_HELP_CMD_RSEND
+ RSEND Verstuur een memo en verzoek een ontvangstbevestiging
+MEMO_HELP_CMD_CHECK
+ CHECK Kijk of je laatste memo naar iemand is gelezen
+MEMO_HELP_CMD_SENDALL
+ SENDALL Stuur een memo naar alle geregistreerde gebruikers
+MEMO_HELP_CMD_STAFF
+ STAFF Stuur een memo naar alle opers/admin
+
+MEMO_HELP_HEADER
+ %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:
+
+
+MEMO_HELP_ADMIN
+ not used.
+MEMO_HELP_OPER
+ not used.
+MEMO_HELP_FOOTER
+
+ Type %R%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 gespecificeerde 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 eerste 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 %R%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
+#
+###########################################################################
+
+MEMO_HELP_RSEND
+ Gebruik: RSEND {nick | kanaal} memo-tekst
+
+ Stuurt de gegeven nick of kanaal een memo met memo-tekst.
+ Wanneer je een memo naar een nick stuurt zal de ontvanger een
+ notificatie krijgen dat hij/zij een nieuwe memo heeft. Ook moet
+ de gegeven nick/kanaal geregistreerd zijn.
+ Zodra de memo is gelezen door de ontvanger zal er automatisch
+ een memo teruggestuurd worden naar degene die de memo verstuurd
+ heeft om hem/haar te informeren dat de memo gelezen is.
+
+###########################################################################
+#
+# OperServ help messages
+#
+###########################################################################
+
+MEMO_HELP_CHECK
+ Gebruik: CHECK nick
+
+ Controleert of de _laatste_ memo die je naar nick gestuurd
+ hebt isgelezen of niet. Let wel op: dit werkt alleen met nicks,
+ niet met kanalen.
+
+###########################################################################
+#
+# OperServ help messages
+#
+###########################################################################
+
+OPER_HELP_CMD_GLOBAL
+ GLOBAL Stuurt een bericht naar alle gebruikers
+OPER_HELP_CMD_STATS
+ STATS Geeft de status van Services en netwerk weer
+OPER_HELP_CMD_OPER
+ OPER Wijzig de Services operator lijst
+OPER_HELP_CMD_ADMIN
+ ADMIN Wijzig de Services Administrator lijst
+OPER_HELP_CMD_STAFF
+ STAFF Display Services staff and online status
+OPER_HELP_CMD_MODE
+ MODE Verander de modes op een kanaal
+OPER_HELP_CMD_KICK
+ KICK Kick een gebruiker uit een kanaal
+OPER_HELP_CMD_CLEARMODES
+ CLEARMODES Verwijder alle modes van een kanaal
+OPER_HELP_CMD_KILLCLONES
+ KILLCLONES Kill alle gebruikers met een bepaalde hostmask
+OPER_HELP_CMD_AKILL
+ AKILL Beheer de AKILL lijst
+OPER_HELP_CMD_SGLINE
+ SGLINE Beheer de SGLINE lijst
+OPER_HELP_CMD_SQLINE
+ SQLINE Beheer de SQLINE lijst
+OPER_HELP_CMD_SZLINE
+ SZLINE Beheer de SZLINE lijst
+OPER_HELP_CMD_CHANLIST
+ CHANLIST Geef alle kanalen weer
+OPER_HELP_CMD_USERLIST
+ USERLIST Geef alle gebruikers weer
+OPER_HELP_CMD_LOGONNEWS
+ LOGONNEWS Stel de berichten in die gebruikers krijgen als
+ ze inloggen
+OPER_HELP_CMD_RANDOMNEWS
+ RANDOMNEWS Stel de berichten in waarvan gebruikers er willekeurig
+ een te zien krijgen als ze inloggen
+OPER_HELP_CMD_OPERNEWS
+ OPERNEWS Stel de berichten in die gebruikers te zien krijgen
+ die OPER worden
+OPER_HELP_CMD_SESSION
+ SESSION Bekijk de lijst met sessies per host
+OPER_HELP_CMD_EXCEPTION
+ EXCEPTION Beheer de sessie-limiet uitzonderingen lijst
+OPER_HELP_CMD_NOOP
+ NOOP Verwijder tijdelijk alle O:regels van een server
+ op afstand
+
+OPER_HELP_CMD_JUPE
+ JUPE "Jupiter" een server
+OPER_HELP_CMD_IGNORE
+ IGNORE Wijzig de Services negeer-lijst
+OPER_HELP_CMD_SET
+ SET Stel verscheidene globale Services opties in
+OPER_HELP_CMD_RELOAD
+ RELOAD Herlaad Services' configuratie bestand
+OPER_HELP_CMD_UPDATE
+ UPDATE Forceer dat de Services database onmiddelijk
+ op de harde schijf wordt weggeschreven
+OPER_HELP_CMD_RESTART
+ RESTART Sla databases op en herstart Services
+OPER_HELP_CMD_QUIT
+ QUIT Sluit Services af zonder databases op te slaan
+OPER_HELP_CMD_SHUTDOWN
+ SHUTDOWN Sla databases op en sluit Services af
+OPER_HELP_CMD_DEFCON
+ DEFCON Manipulate the DefCon system
+OPER_HELP_CMD_CHANKILL
+ CHANKILL Kill all users on a specific channel
+OPER_HELP_CMD_OLINE
+ OLINE Geef Operflags aan een bepaalde gebruiker
+OPER_HELP_CMD_UMODE
+ UMODE Wijzigt de modus van een gebruiker
+OPER_HELP_CMD_SVSNICK
+ SVSNICK Forcefully change a user's nickname
+OPER_HELP_CMD_MODLOAD
+ MODLOAD Laad een module
+OPER_HELP_CMD_MODUNLOAD
+ MODUNLOAD Ontlaad een module
+OPER_HELP_CMD_MODINFO
+ MODINFO Info over een geladen module
+OPER_HELP_CMD_MODLIST
+ MODLIST Geef geladen modules weer
+
+OPER_HELP
+ %S commando's:
+
+OPER_HELP_LOGGED
+ Waarschuwing: Alle commando's die naar %S gestuurd worden worden gelogd!
+
+OPER_HELP_GLOBAL
+ Gebruik: GLOBAL bericht
+
+ Stelt Administrators 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 Root 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.
+
+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 | mask]
+
+ Stelt Services administrators in staat de Services een nick
+ of mask voor een bepaalde tijd of tot de volgende herstart te
+ laten negeren. Standaard 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 uren
+ en d voor dagen. Combinaties hiervan zijn niet toegestaan.
+ Om Services iemand permanent te laten negeren kun je 0 opgeven als tijd.
+ Als je een mask toevoegd moet deze in volgende format zijn:
+ user@host of nick!user@host, iets anders wordt een nick beschouwd.
+ Wildcards zijn toegestaan.
+
+ IRC Operators zullen niet genegeerd worden, zelfs al komen
+ ze overeen met een mask uit de lijst.
+
+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.
+
+OPER_HELP_UMODE
+ Gebruik: UMODE gebruiker modes
+
+ Stelt Super Admins in staat gebruikersmodes van
+ elke willekeurige gebruiker in te stellen. De paramenters
+ zijn hetzelfde als van een standaard /MODE commando.
+
+OPER_HELP_OLINE
+ Gebruik: OLINE gebruiker flags
+
+ Stelt Super Admins 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.
+
+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.
+
+OPER_HELP_KICK
+ Gebruik: KICK kanaal gebruiker reden
+
+ Stelt de staf 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))
+
+OPER_HELP_SVSNICK
+ Gebruik: SVSNICK nick nieuwe nick
+
+ Veranderd een gebruiker's nick van nick naar nieuwe nick.
+ Gelimiteerd tot Super Admins.
+
+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.
+
+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.
+
+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.
+
+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
+
+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
+ SQL Activate or deactivate sql mode
+ IGNORE Activate or deactivate ignore mode
+ LIST List the options
+
+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.
+
+ Deze optie komt overeen met de commandline-optie -logchan.
+
+ 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_SET_SQL
+ Gebruik: SET SQL {ON | OFF}
+
+ Deze instelling schakelt Anope's SQL gebruik. Zo kan al het SQL
+ verkeer worden uitgezet als de SQL server onbereikbaar wordt
+ terwijl services nog draaien.
+
+OPER_HELP_SET_IGNORE
+ Syntax: SET IGNORE {ON | OFF}
+
+ Setting this will toggle Anope's usage of the IGNORE system
+ on or off.
+
+OPER_HELP_SET_LIST
+ Gebruik: SET LIST
+
+ Geef de verschillende %S instellingen weer.
+
+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.
+
+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.
+
+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!
+
+OPER_HELP_UPDATE
+ Gebruik: UPDATE
+
+ Zorgt ervoor dat Services de database bestanden op de harde
+ schijf bijwerken zodra je dit commando vertsuurt.
+
+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.)
+
+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.
+
+OPER_HELP_SHUTDOWN
+ Gebruik: SHUTDOWN
+
+ Zorgt ervoor dat Services alle databases opslaat en dan
+ afsluit.
+
+OPER_HELP_RESTART
+ Gebruik: RESTART
+
+ Zorgt ervoor dat Services alle databases opslaat en dan
+ opnieuw opstart.
+
+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.
+
+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.
+
+OPER_HELP_MODLOAD
+ Gebruik: MODLOAD bestandsnaam
+
+ Dit commando laadt de module genaamd bestandsnaam uit de
+ modules directory.
+
+OPER_HELP_MODUNLOAD
+ Gebruik: MODUNLOAD bestandsnaam
+
+ Dit commando ontlaadt de module genaamd bestandsnaam uit
+ de modules directory.
+
+OPER_HELP_MODINFO
+ Gebruik: MODINFO bestandsnaam
+
+ Dit command geeft informatie weer over de gespecificeerde
+ geladen module.
+
+OPER_HELP_MODLIST
+ Gebruik: MODLIST [Core|3rd|protocol|encryption|supported|qatested]
+
+ Geeft alle momenteel geladen modules weer.
+
+
+###########################################################################
+#
+# BotServ help messages
+#
+###########################################################################
+
+
+BOT_HELP_CMD_BOTLIST
+ BOTLIST Geef beschikbare bots weer
+BOT_HELP_CMD_ASSIGN
+ ASSIGN Wijs een bot toe aan een kanaal
+BOT_HELP_CMD_SET
+ SET Configureer bot opties
+BOT_HELP_CMD_KICK
+ KICK Configureer kickers
+BOT_HELP_CMD_BADWORDS
+ BADWORDS Beheer slechte-woorden lijst
+BOT_HELP_CMD_ACT
+ ACT Makes the bot do the equivalent of a "/me" command
+BOT_HELP_CMD_INFO
+ INFO Allows you to see BotServ information about a channel or a bot
+BOT_HELP_CMD_SAY
+ SAY Makes the bot say the given text on the given channel
+BOT_HELP_CMD_UNASSIGN
+ UNASSIGN Unassigns a bot from a channel
+BOT_HELP_CMD_BOT
+ BOT Beheer de lijst met bots op het netwerk
+
+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
+ %R%S commando typen. Voor meer informatie over een
+ specifiek commando moet je %R%S HELP command typen.
+
+BOT_HELP_FOOTER
+ 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 %R%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 %R%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 %R%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 %R%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_BOT
+ Gebruik: BOT ADD nick gebruiker host echte naam
+ BOT CHANGE oldnick newnick [gebruiker [host [echte naam]]]
+ BOT DEL nick
+
+ 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.
+
+ 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.
+
+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.
+
+###########################################################################
+#
+# 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 %R%s set <nick> <hostmask>.
+HOST_SETALL_SYNTAX
+ Gebruik %R%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: %R%s del <nick>.
+HOST_OFF_UNREAL
+ Je vhost is verwijderd. Om standaard host verberging weer aan te schakelen, type je /mode %s +%s
+HOST_NO_VIDENT
+ Je IRCD ondersteunt 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 (Aantal: %d)
+HOST_LIST_RANGE_FOOTER
+ Alle records getoond van %d tot %d
+HOST_LIST_KEY_FOOTER
+ Alle records getoond met overeenkomende key %s (Aantal: %d)
+
+###########################################################################
+#
+# HostServ Help messages
+#
+###########################################################################
+HOST_HELP_CMD_ON
+ ON Activeert je toegewezen vhost
+
+HOST_HELP_CMD_OFF
+ OFF Deactiveert je toegewezen vhost
+
+HOST_HELP_CMD_GROUP
+ GROUP Stelt de vhost voor all nicks in een groep gelijk
+
+HOST_HELP_CMD_SET
+ SET Stel de vhost van een andere gebruiker in
+
+HOST_HELP_CMD_SETALL
+ SETALL Stel de vhost voor alle nicks in een groep in
+
+HOST_HELP_CMD_DEL
+ DEL Verwijder de vhost van een andere gebruiker
+
+HOST_HELP_CMD_DELALL
+ DELALL Verwijder de vhost voor alle nicks in een groep
+
+HOST_HELP_CMD_LIST
+ LIST Geeft een of meer vhosts weer.
+
+HOST_OPER_HELP
+ not used.
+
+HOST_ADMIN_HELP
+ not used.
+
+HOST_HELP
+ %S commando'ss:
+
+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.
+
+HOST_HELP_DELALL
+ Syntax: DELALL <nick>.
+
+ Verwijderd de vhost voor alle nick's in dezelfde groep
+ als de gegeven nick.
+
+
+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.
+
+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.
+
+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.
+
+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.
+
+OPER_SVSNICK_UNSUPPORTED
+ Sorry, SVSNICK is niet beschikbaar op dit netwerk.
+
+OPER_SQLINE_UNSUPPORTED
+ Sorry, SQLINE is niet beschikbaar op dit netwerk.
+
+OPER_SVSO_UNSUPPORTED
+ Sorry, OLINE is niet beschikbaar op dit netwerk.
+
+OPER_UMODE_UNSUPPORTED
+ Sorry, UMODE is niet beschikbaar op dit netwerk.
+
+OPER_SUPER_ADMIN_NOT_ENABLED
+ SuperAdmin instelling is niet ingeschakeld in services.conf
+
diff --git a/lang/pl.l b/lang/pl.l
new file mode 100644
index 000000000..ed2d4ac0d
--- /dev/null
+++ b/lang/pl.l
@@ -0,0 +1,7766 @@
+# Polski plik jezykowy/Polish language file.
+# Tlumaczenie/Translation:
+# Armada Jaroslaw <yoplait@yoplait.org>
+# Eskela <eskela@gmail.com>
+# Mierzwiak Bartosz <bartosz@mierzwiak.com>
+# Swierkosz Szymon <szymek@adres.pl>
+# Szczyrzyca Mateusz <annihilator@ircnet.pl>
+# PolNet Team: http://www.ircnet.pl
+#
+# Aktualizacja/Updated: 13/10/2008
+# Wersja serwisow/Anope version: svn-1477
+#
+# This file is encoded using iso-8859-2.
+#
+###########################################################################
+#
+# (C) 2003-2008 Anope Team
+# Contact us at info@anope.org
+#
+# Please read COPYING and README for further 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 us know
+# (dev@anope.org) 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
+# services.conf). 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�l (Spanish)" or "Fran�is (French)".
+LANG_NAME
+ Polski (Polish)
+
+###########################################################################
+#
+# 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 %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
+ Nie
+ Pon
+ Wto
+ ¦ro
+ Czw
+ Pia
+ Sob
+
+# %A
+STRFTIME_DAYS_LONG
+ Niedziela
+ Poniedzia³ek
+ Wtorek
+ ¦roda
+ Czwartek
+ Pi±tek
+ Sobota
+
+# %b
+STRFTIME_MONTHS_SHORT
+ Sty
+ Lut
+ Mar
+ Kwi
+ Maj
+ Cze
+ Lip
+ Sie
+ Wrz
+ Pa¼
+ Lis
+ Gru
+
+# %B
+STRFTIME_MONTHS_LONG
+ Styczeñ
+ Luty
+ Marzec
+ Kwiecieñ
+ Maj
+ Czerwiec
+ Lipiec
+ Sierpieñ
+ Wrzesieñ
+ Pa¼dziernik
+ Listopad
+ Grudzieñ
+
+# This is used in ChanServ/NickServ INFO displays.
+COMMA_SPACE
+ ,
+
+# Various error messages.
+USER_RECORD_NOT_FOUND
+ B³±d wewnêtrzny - nie mogê obs³u¿yæ ¿±dania.
+
+UNKNOWN_COMMAND
+ Nieznana komenda %s.
+
+UNKNOWN_COMMAND_HELP
+ Nieznana komenda %s. Napisz "%R%s HELP" aby uzyskaæ pomoc.
+
+SYNTAX_ERROR
+ Sk³adnia: %s
+
+MORE_INFO
+ Napisz %R%s HELP %s aby uzyskaæ wiêcej informacji.
+
+NO_HELP_AVAILABLE
+ Brak dostêpnej pomocy dla %s.
+
+OBSOLETE_COMMAND
+ Ta komenda jest ju¿ przestarza³a. U¿yj %s.
+
+BAD_USERHOST_MASK
+ Maska musi mieæ format ident@host.
+
+BAD_EXPIRY_TIME
+ Nieprawid³owy czas wygasania.
+
+USERHOST_MASK_TOO_WIDE
+ %s jest za ogólna; u¿yj bardziej szczegó³owej maski.
+
+SERVICE_OFFLINE
+ %s jest obecnie offline.
+
+READ_ONLY_MODE
+ Uwaga: Serwisy s± w trybie tylko do odczytu - zmiany nie bêd± zapisywane!
+
+PASSWORD_INCORRECT
+ Nieprawid³owe has³o.
+
+INVALID_TARGET
+ "/msg %s" nie jest ju¿ obs³ugiwane. U¿yj "/msg %s@%s" lub "/%s".
+
+# 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 SASET NOEXPIRE gets "Permission denied".
+ACCESS_DENIED
+ Odmowa dostêpu.
+
+PERMISSION_DENIED
+ Brak uprawnieñ.
+
+RAW_DISABLED
+ Polecenie RAW zosta³o wy³±czone. Je¶li chcesz go u¿ywaæ,
+ ustaw odpowiednio DisableRaw w konfiguracji serwisów.
+
+MORE_OBSCURE_PASSWORD
+ Proszê spróbowaæ ponownie z trudniejszym has³em.
+ Has³o powinno mieæ minimum 5 znaków oraz powinno
+ zawieraæ cyfry i litery.
+
+PASSWORD_TOO_LONG
+ Twoje has³o jest za d³ugie. Spróbuj ponownie z krótszym has³em.
+
+NICK_NOT_REGISTERED
+ Twój nick nie jest zarejestrowany.
+
+NICK_NOT_REGISTERED_HELP
+ Twój nick jest niezarejestrowany.
+ Napisz %R%s HELP aby uzyskaæ pomoc na temat rejestracji.
+
+NICK_X_IS_SERVICES
+ Nick %s jest serwisem!
+
+NICK_X_NOT_REGISTERED
+ Nick %s nie jest zarejestrowany.
+
+NICK_X_IN_USE
+ Nick %s jest aktualnie w u¿yciu.
+
+NICK_X_NOT_IN_USE
+ Nick %s nie jest aktualnie u¿ywany.
+
+NICK_X_NOT_ON_CHAN
+ %s nie jest aktualnie na kanale %s.
+
+NICK_X_FORBIDDEN
+ Nick %s nie mo¿e byæ rejestrowany ani u¿ywany.
+
+NICK_X_FORBIDDEN_OPER
+ Nick %s zosta³ zablokowany przez %s:
+ %s
+
+NICK_X_ILLEGAL
+ Nick %s jest nieprawid³owy i nie mo¿e byæ u¿ywany.
+
+NICK_X_TRUNCATED
+ Nick %s zosta³ skrócony do %d znaków.
+
+NICK_X_SUSPENDED
+ Nick %s jest obecnie zawieszony.
+
+CHAN_X_NOT_REGISTERED
+ Kana³ %s nie jest zarejestrowany.
+
+CHAN_X_NOT_IN_USE
+ Kana³ %s nie istnieje.
+
+CHAN_X_FORBIDDEN
+ Kana³u %s nie mo¿na rejestrowaæ ani u¿ywaæ.
+
+CHAN_X_FORBIDDEN_OPER
+ Kana³ %s zosta³ zablokowany przez %s:
+ %s
+
+CHAN_X_SUSPENDED
+ Zawieszony: [%s] %s
+
+NICK_IDENTIFY_REQUIRED
+ Aby u¿yæ tej komendy musisz siê zidentyfikowaæ.
+ Napisz %R%s IDENTIFY has³o, a pó¼niej ponów próbê.
+
+CHAN_IDENTIFY_REQUIRED
+ Do u¿ycia tej komendy wymagana jest identyfikacja.
+ Napisz %R%s IDENTIFY %s has³o, a pó¼niej ponów próbê.
+
+
+MAIL_DISABLED
+ Serwisy zosta³y skonfigurowane tak, aby nie wysy³aæ poczty.
+
+MAIL_INVALID
+ Adres e-mail dla %s nie jest prawid³owy.
+
+MAIL_X_INVALID
+ %s nie jest prawid³owym adresem e-mail.
+
+MAIL_LATER
+ Nie mogê wys³aæ teraz maila. Spróbuj za chwilê.
+
+MAIL_DELAYED
+ Proszê odczekaæ %d sekund(y) i ponowiæ próbê.
+
+
+NO_REASON
+ Bez powodu
+
+UNKNOWN
+ <nieznane>
+
+# Duration system
+DURATION_DAY
+ 1 dzieñ
+
+DURATION_DAYS
+ %d dni
+
+DURATION_HOUR
+ 1 godzina
+
+DURATION_HOURS
+ %d godzin(y)
+
+DURATION_MINUTE
+ 1 minuta
+
+DURATION_MINUTES
+ %d minut(y)
+
+DURATION_SECOND
+ 1 sekunda
+
+DURATION_SECONDS
+ %d sekund(y)
+
+# Human readable expiration
+NO_EXPIRE
+ nie wygasa
+
+EXPIRES_SOON
+ wygasa przy nastêpnej aktualizacji baz
+
+EXPIRES_M
+ wygasa za %d minut(y)
+
+EXPIRES_1M
+ wygasa za %d minutê
+
+EXPIRES_HM
+ wygasa za %d godzin(y) i %d minut(y)
+
+EXPIRES_H1M
+ wygasa za %d godzinê i %d minut(y)
+
+EXPIRES_1HM
+ wygasa za %d godzinê i %d minut(y)
+
+EXPIRES_1H1M
+ wygasa za %d godzinê i %d minutê
+
+EXPIRES_D
+ wygasa za %d dni
+
+EXPIRES_1D
+ wygasa za %d dzieñ
+
+# Generic Footer message
+END_OF_ANY_LIST
+ Koniec listy %s.
+
+# Generic List error messages
+LIST_INCORRECT_RANGE
+ Podano nieprawid³owy zakres. Poprawny zapis to #od-do.
+
+CS_LIST_INCORRECT_RANGE
+ Aby wyszukaæ kana³y o nazwach zaczynaj±cych siê znakiem #
+ nale¿y ten znak pomin±æ (anope zamiast #anope).
+
+# Generic help limited to messages
+HELP_LIMIT_SERV_OPER
+
+ Polecenie dostêpne tylko dla operatorów serwisów.
+
+HELP_LIMIT_SERV_ADMIN
+
+ Polecenie dostêpne tylko dla administratorów serwisów.
+
+HELP_LIMIT_SERV_ROOT
+
+ Polecenie dostêpne tylko dla Services Roots.
+
+HELP_LIMIT_IRC_OPER
+
+ Polecenie dostêpne tylko dla IRC operatorów.
+
+HELP_LIMIT_HOST_SETTER
+
+ Polecenie dostêpne tylko dla Host Setters.
+
+HELP_LIMIT_HOST_REMOVER
+
+ Polecenie dostêpne tylko dla Host Removers.
+
+###########################################################################
+#
+# NickServ messages
+#
+###########################################################################
+# Automatic messages
+NICK_IS_REGISTERED
+ Ten nick jest zarejestrowany. Je¶li to Twój nick,
+ wpisz: %R%s IDENTIFY has³o
+
+NICK_IS_SECURE
+ Ten nick jest zarejestrowany i chroniony.
+ Zidentyfikuj siê pisz±c: %R%s IDENTIFY has³o
+ je¶li nick nale¿y do Ciebie, w przeciwnym razie zmieñ go.
+
+NICK_MAY_NOT_BE_USED
+ Ten nick nie mo¿e byæ u¿ywany. Wybierz inny nick.
+
+FORCENICKCHANGE_IN_1_MINUTE
+ Masz jedn± minutê na zmianê nicka, potem zostanie zmieniony si³±.
+
+FORCENICKCHANGE_IN_20_SECONDS
+ Masz 20 sekund na zmianê nicka, potem zostanie zmieniony si³±.
+
+FORCENICKCHANGE_NOW
+ Ten nick zosta³ zarejestrowany i nie mo¿esz go u¿ywaæ.
+
+FORCENICKCHANGE_CHANGING
+ Twój nick zosta³ zmieniony na %s.
+
+# REGISTER responses
+NICK_REGISTER_SYNTAX
+ REGISTER has³o [email]
+
+NICK_REGISTER_SYNTAX_EMAIL
+ REGISTER has³o email
+
+NICK_REGISTRATION_DISABLED
+ Rejestracja nicków jest tymczasowo wy³±czona.
+
+NICK_REGISTRATION_FAILED
+ Rejestracja nicka nie powiod³a siê.
+
+NICK_REG_PLEASE_WAIT
+ Odczekaj %d sekund przed ponownym u¿yciem komendy REGISTER.
+
+NICK_CANNOT_BE_REGISTERED
+ Nick %s nie mo¿e byæ rejestrowany.
+
+NICK_ALREADY_REGISTERED
+ Nick %s jest ju¿ zarejestrowany!
+
+NICK_REGISTERED
+ Nick %s zosta³ zarejestrowany z mask±: %s.
+
+NICK_REGISTERED_NO_MASK
+ Nick %s zosta³ zarejestrowany.
+
+NICK_PASSWORD_IS
+ Twoje has³o do nicka to %s
+
+NICK_REG_DELAY
+ Musisz byæ po³±czony(a) d³u¿ej ni¿ %d sekund(y), aby móc zarejestrowaæ nick.
+
+# GROUP responses
+NICK_GROUP_SYNTAX
+ GROUP nazwa has³o
+
+NICK_GROUP_DISABLED
+ Grupowanie nicków jest tymczasowo wy³±czone.
+
+NICK_GROUP_FAILED
+ Grupowanie nie powiod³o siê.
+
+NICK_GROUP_PLEASE_WAIT
+ Odczekaj %d sekund przed ponownym u¿yciem komendy GROUP.
+
+NICK_GROUP_CHANGE_DISABLED
+ Twój nick jest ju¿ zarejestrowany. Napisz najpierw: %R%s DROP
+
+NICK_GROUP_SAME
+ Nale¿ysz ju¿ do grupy %s.
+
+NICK_GROUP_TOO_MANY
+ W grupie %s jest za du¿o nicków, usuñ kilka.
+ Napisz %R%s HELP GLIST i %R%s HELP DROP,
+ aby uzyskaæ wiêcej informacji.
+
+NICK_GROUP_JOINED
+ Nale¿ysz teraz do grupy %s.
+
+# IDENTIFY responses
+NICK_IDENTIFY_SYNTAX
+ IDENTIFY has³o
+
+NICK_IDENTIFY_FAILED
+ Identyfikacja nie powiod³a siê.
+
+NICK_IDENTIFY_SUCCEEDED
+ Has³o przyjête - jeste¶ zidentyfikowany(a).
+
+NICK_IDENTIFY_EMAIL_REQUIRED
+ Teraz ustaw adres e-mail dla Twojego nicka.
+ Gdy zapomnisz has³a, zostanie ono wys³ane na e-mail.
+
+NICK_IDENTIFY_EMAIL_HOWTO
+ Napisz %R%S SET EMAIL e-mail, aby ustawiæ adres e-mail.
+ Twoja prywatno¶æ bêdzie uszanowana - nie bêdzie podawany osobom trzecim,
+
+NICK_ALREADY_IDENTIFIED
+ Jeste¶ ju¿ zidentyfikowany(a).
+
+# UPDATE responses
+NICK_UPDATE_SUCCESS
+ Status zaktualizowany (wiadomo¶ci, vhosty, flagi).
+
+
+# LOGOUT responses
+NICK_LOGOUT_SYNTAX
+ LOGOUT
+
+NICK_LOGOUT_SUCCEEDED
+ Twój nick zosta³ pomy¶lnie wylogowany.
+
+NICK_LOGOUT_X_SUCCEEDED
+ Nick %s zosta³ wylogowany.
+
+NICK_LOGOUT_SERVICESADMIN
+ Nie mogê wylogowaæ %s, bo to administrator serwisów.
+
+# DROP responses
+NICK_DROP_DISABLED
+ Usuwanie nicków jest tymczasowo wy³±czone.
+
+NICK_DROPPED
+ Twój nick zosta³ odrejestrowany.
+
+NICK_X_DROPPED
+ Nick %s zosta³ odrejestrowany.
+
+# SET responses
+NICK_SET_SYNTAX
+ SET opcja parametry
+
+NICK_SET_SERVADMIN_SYNTAX
+ SET [nick] opcja parametry
+
+NICK_SET_DISABLED
+ Modyfikacja ustawieñ nicka jest tymczasowo wy³±czona.
+
+NICK_SET_UNKNOWN_OPTION
+ Nieznana opcja komendy SET %s.
+
+NICK_SET_OPTION_DISABLED
+ Opcja %s nie jest dostêpna w tej sieci.
+
+# SET DISPLAY responses
+NICK_SET_DISPLAY_INVALID
+ Now± nazw± MUSI byæ jednym z nicków w grupie!
+
+NICK_SET_DISPLAY_CHANGED
+ Now± nazw± jest %s.
+
+# SET PASSWORD responses
+NICK_SET_PASSWORD_FAILED
+ Zmiana has³a nie powiod³a siê.
+
+NICK_SET_PASSWORD_CHANGED
+ Has³o zosta³o zmienione.
+
+NICK_SET_PASSWORD_CHANGED_TO
+ Has³o zosta³o zmienione na %s.
+
+# SET LANGUAGE responses
+NICK_SET_LANGUAGE_SYNTAX
+ SET LANGUAGE numer
+
+NICK_SET_LANGUAGE_UNKNOWN
+ Nieznany numer jêzyka %d.
+ Napisz %R%s HELP SET LANGUAGE, aby uzyskaæ listê dostêpnych jêzyków.
+
+NICK_SET_LANGUAGE_CHANGED
+ Jêzyk zosta³ zmieniony na Polski.
+
+# SET URL responses
+NICK_SET_URL_CHANGED
+ Adres www zosta³ zmieniony na %s.
+
+NICK_SET_URL_UNSET
+ Adres www zosta³ usuniêty.
+
+# SET EMAIL responses
+NICK_SET_EMAIL_CHANGED
+ Adres e-mail zosta³ zmieniony na %s.
+
+NICK_SET_EMAIL_UNSET
+ Adres e-mail zosta³ usuniêty.
+
+NICK_SET_EMAIL_UNSET_IMPOSSIBLE
+ Nie mo¿esz usuwaæ adresu e-mail w tej sieci.
+
+
+# SET ICQ responses
+NICK_SET_ICQ_CHANGED
+ Numer ICQ zosta³ zmieniony na %s.
+
+NICK_SET_ICQ_UNSET
+ Numer ICQ zosta³ usuniêty.
+
+NICK_SET_ICQ_INVALID
+ %s nie jest prawid³owym numerem.
+
+
+# SET GREET responses
+NICK_SET_GREET_CHANGED
+ Wiadomo¶æ powitalna zosta³a zmieniona na:
+ %s.
+
+NICK_SET_GREET_UNSET
+ Wiadomo¶æ powitalna zosta³a usuniêta.
+
+# 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
+ Ochrona jest teraz w³±czona.
+
+NICK_SET_KILL_QUICK
+ Ochrona ze zredukowanym opó¼nieniem jest teraz w³±czona.
+
+NICK_SET_KILL_IMMED
+ Natychmiastowa ochrona jest teraz w³±czona.
+
+NICK_SET_KILL_IMMED_DISABLED
+ Opcja IMMED nie jest jest dostêpna w tej sieci.
+
+NICK_SET_KILL_OFF
+ Ochrona jest teraz wy³±czona.
+
+# SET SECURE responses
+NICK_SET_SECURE_SYNTAX
+ SET SECURE {ON | OFF}
+
+NICK_SET_SECURE_ON
+ Opcja bezpieczeñstwa zosta³a w³±czona.
+
+NICK_SET_SECURE_OFF
+ Opcja bezpieczeñstwa zosta³a wy³±czona.
+
+# SET PRIVATE responses
+NICK_SET_PRIVATE_SYNTAX
+ SET PRIVATE {ON | OFF}
+
+NICK_SET_PRIVATE_ON
+ Opcja prywatno¶ci zosta³a w³±czona.
+
+NICK_SET_PRIVATE_OFF
+ Opcja prywatno¶ci zosta³a wy³±czona.
+
+# SET HIDE responses
+NICK_SET_HIDE_SYNTAX
+ SET HIDE {EMAIL | USERMASK | QUIT} {ON | OFF}
+
+NICK_SET_HIDE_EMAIL_ON
+ Twój adres e-mail bêdzie ukrywany w informacjach %s.
+
+NICK_SET_HIDE_EMAIL_OFF
+ Twój adres e-mail bêdzie pokazywany w informacjach %s.
+
+NICK_SET_HIDE_MASK_ON
+ Twoja ostatnia maska ident@host bêdzie ukrywana w informacjach %s.
+
+NICK_SET_HIDE_MASK_OFF
+ Twoja ostatnia maska ident@host bêdzie pokazywana w informacjach %s.
+
+NICK_SET_HIDE_QUIT_ON
+ Twoja ostatnia wiadomo¶æ QUIT bêdzie ukrywana w informacjach %s.
+
+NICK_SET_HIDE_QUIT_OFF
+ Twoja ostatnia wiadomo¶æ QUIT bêdzie pokazywana w informacjach %s.
+
+NICK_SET_HIDE_STATUS_ON
+ Twój status dostêpu do serwisów bêdzie ukrywany w informacjach %s.
+
+NICK_SET_HIDE_STATUS_OFF
+ Twój status dostêpu do serwisów bêdzie pokazywany w informacjach %s.
+
+
+# SET MSG responses
+NICK_SET_MSG_SYNTAX
+ SET MSG {ON | OFF}
+
+NICK_SET_MSG_ON
+ Serwisy bêd± teraz wysy³aæ wiadomo¶ci.
+
+NICK_SET_MSG_OFF
+ Serwisy bêd± teraz wysy³aæ powiadomienia.
+
+# SET AUTOOP responses
+NICK_SET_AUTOOP_SYNTAX
+ SET AUTOOP {ON | OFF}
+
+NICK_SET_AUTOOP_ON
+ Serwisy bêd± automatycznie nadawa³y Tobie uprawnienia.
+
+NICK_SET_AUTOOP_OFF
+ Serwisy nie bêd± ju¿ automatycznie nadawa³y Tobie uprawnieñ.
+
+# SASET responses
+NICK_SASET_SYNTAX
+ SASET nick opcja parametry
+
+NICK_SASET_DISABLED
+ Modyfikacja ustawieñ nicka jest tymczasowo wy³±czona.
+
+NICK_SASET_UNKNOWN_OPTION
+ Nieznana opcja komendy SASET %s.
+
+NICK_SASET_BAD_NICK
+ Nick %s nie jest zarejestrowany.
+
+NICK_SASET_OPTION_DISABLED
+ Opcja %s nie jest dostêpna w tej sieci.
+
+# SASET DISPLAY responses
+NICK_SASET_DISPLAY_INVALID
+ Nowa nazwa dla %s MUSI byæ jednym z nicków w grupie!
+
+NICK_SASET_DISPLAY_CHANGED
+ Now± nazw± jest %s.
+
+# SASET PASSWORD responses
+NICK_SASET_PASSWORD_FAILED
+ Zmiana has³a dla %s nie powiod³a siê.
+
+NICK_SASET_PASSWORD_CHANGED
+ Has³o dla %s zosta³o zmienione.
+
+NICK_SASET_PASSWORD_CHANGED_TO
+ Has³o dla %s zosta³o zmienione na %s.
+
+# SASET URL responses
+NICK_SASET_URL_CHANGED
+ Adres www osoby %s zosta³ zmieniony na %s.
+
+NICK_SASET_URL_UNSET
+ Adres www osoby %s zosta³ usuniêty.
+
+# SASET EMAIL responses
+NICK_SASET_EMAIL_CHANGED
+ Adres e-mail osoby %s zosta³ zmieniony na %s.
+
+NICK_SASET_EMAIL_UNSET
+ Adres e-mail osoby %s zosta³ usuniêty.
+
+NICK_SASET_EMAIL_UNSET_IMPOSSIBLE
+ Nie mo¿esz usuwaæ adresu e-mail w tej sieci.
+
+
+# SASET ICQ responses
+NICK_SASET_ICQ_CHANGED
+ Numer ICQ osoby %s zosta³ zmieniony na %s.
+
+NICK_SASET_ICQ_UNSET
+ Numer ICQ osoby %s zosta³ usuniêty.
+
+NICK_SASET_ICQ_INVALID
+ %s nie jest prawid³owym numerem.
+
+
+# SASET GREET responses
+NICK_SASET_GREET_CHANGED
+ Wiadomo¶æ powitalna osoby %s zosta³a zmieniona na %s.
+
+NICK_SASET_GREET_UNSET
+ Wiadomo¶æ powitalna osoby %s zosta³a usuniêta.
+
+# SASET PROTECT responses
+NICK_SASET_KILL_SYNTAX
+ SASET nick KILL {ON | QUICK | OFF}
+
+NICK_SASET_KILL_IMMED_SYNTAX
+ SASET nick KILL {ON | QUICK | IMMED | OFF}
+
+NICK_SASET_KILL_ON
+ Ochrona dla %s jest teraz w³±czona.
+
+NICK_SASET_KILL_QUICK
+ Ochrona dla %s ze zredukowanym opó¼nieniem jest teraz w³±czona.
+
+NICK_SASET_KILL_IMMED
+ Natychmiastowa ochrona dla %s jest teraz w³±czona
+
+NICK_SASET_KILL_IMMED_DISABLED
+ Opcja IMMED nie jest dostêpna w tej sieci.
+
+NICK_SASET_KILL_OFF
+ Ochrona dla %s jest teraz wy³±czona.
+
+# SASET SECURE responses
+NICK_SASET_SECURE_SYNTAX
+ SASET nick SECURE {ON | OFF}
+
+NICK_SASET_SECURE_ON
+ Opcja bezpieczeñstwa dla %s zosta³a w³±czona.
+
+NICK_SASET_SECURE_OFF
+ Opcja bezpieczeñstwa dla %s zosta³a wy³±czona.
+
+# SASET PRIVATE responses
+NICK_SASET_PRIVATE_SYNTAX
+ SASET nick PRIVATE {ON | OFF}
+
+NICK_SASET_PRIVATE_ON
+ Opcja prywatno¶ci dla %s zosta³a w³±czona.
+
+NICK_SASET_PRIVATE_OFF
+ Opcja prywatno¶ci dla %s zosta³a wy³±czona.
+
+# SASET HIDE responses
+NICK_SASET_HIDE_SYNTAX
+ SASET nick HIDE {EMAIL | USERMASK | QUIT} {ON | OFF}
+
+NICK_SASET_HIDE_EMAIL_ON
+ Adres e-mail osoby %s bêdzie ukrywany w informacjach %s.
+
+NICK_SASET_HIDE_EMAIL_OFF
+ Adres e-mail osoby %s bêdzie pokazywany w informacjach %s.
+
+NICK_SASET_HIDE_MASK_ON
+ Ostatnia maska ident@host osoby %s bêdzie ukrywana w informacjach %s.
+
+NICK_SASET_HIDE_MASK_OFF
+ Ostatnia maska ident@host osoby %s bêdzie pokazywana w informacjach %s.
+
+NICK_SASET_HIDE_QUIT_ON
+ Ostatnia wiadomo¶æ QUIT osoby %s bêdzie ukrywana w informacjach %s.
+
+NICK_SASET_HIDE_QUIT_OFF
+ Ostatnia wiadomo¶æ QUIT osoby %s bêdzie pokazywana w informacjach %s.
+
+NICK_SASET_HIDE_STATUS_ON
+ Status dostêpu do serwisów osoby %s bêdzie ukrywany w informacjach %s.
+
+NICK_SASET_HIDE_STATUS_OFF
+ Status dostêpu do serwisów osoby %s bêdzie pokazywany w informacjach %s.
+
+
+# SASET MSG responses
+NICK_SASET_MSG_SYNTAX
+ SASAET nick PRIVATE {ON | OFF}
+
+NICK_SASET_MSG_ON
+ Serwisy bêd± teraz wysy³aæ do %s wiadomo¶ci.
+
+NICK_SASET_MSG_OFF
+ Serwisy bêd± teraz wysy³aæ do %s powiadomienia.
+
+# SASET NOEXPIRE responses
+NICK_SASET_NOEXPIRE_SYNTAX
+ SASET nick NOEXPIRE {ON | OFF}
+
+NICK_SASET_NOEXPIRE_ON
+ Nick %s nie wyga¶nie.
+
+NICK_SASET_NOEXPIRE_OFF
+ Nick %s od teraz podlega zasadom wygasania.
+
+# SASET AUTOOP responses
+NICK_SASET_AUTOOP_SYNTAX
+ SASET nick AUTOOP {ON | OFF}
+
+NICK_SASET_AUTOOP_ON
+ Serwisy bêd± automatycznie nadawa³y uprawnienia dla u¿ytkownika %s.
+
+NICK_SASET_AUTOOP_OFF
+ Serwisy nie bêd± ju¿ automatycznie nadawa³y uprawnieñ dla u¿ytkownika %s.
+
+# SASET LANGUAGE responses
+NICK_SASET_LANGUAGE_SYNTAX
+ SASET nick LANGUAGE numer
+
+NICK_SASET_LANGUAGE_UNKNOWN
+ Nieznany numer jêzyka %d.
+ Napisz %R%s HELP SET LANGUAGE, aby uzyskaæ listê dostêpnych jêzyków.
+
+NICK_SASET_LANGUAGE_CHANGED
+ Jêzyk zosta³ zmieniony na Polski.
+
+# ACCESS responses
+NICK_ACCESS_SYNTAX
+ ACCESS {ADD | DEL | LIST} [maska]
+
+NICK_ACCESS_ALREADY_PRESENT
+ Maska %s jest ju¿ w Twojej li¶cie dostêpu.
+
+NICK_ACCESS_REACHED_LIMIT
+ Mo¿esz mieæ tylko %d wpisy(ów) na li¶cie dostêpu.
+
+NICK_ACCESS_ADDED
+ %s dodano do Twojej listy dostêpu.
+
+NICK_ACCESS_NOT_FOUND
+ %s nie znaleziono na Twojej li¶cie dostêpu.
+
+NICK_ACCESS_DELETED
+ %s usuniêto z Twojej listy dostêpu.
+
+NICK_ACCESS_LIST
+ Lista dostêpu:
+
+NICK_ACCESS_LIST_X
+ Lista dostêpu dla %s:
+
+NICK_ACCESS_LIST_EMPTY
+ Twoja lista dostêpu jest pusta.
+
+NICK_ACCESS_LIST_X_EMPTY
+ Lista dostêpu dla %s jest pusta.
+
+# Status messages
+NICK_STATUS_0
+ STATUS %s 0 (nie ma lub nie zarejestrowany)
+
+NICK_STATUS_1
+ STATUS %s 1 (nie jest zidentyfikowany)
+
+NICK_STATUS_2
+ STATUS %s 2 (identyfikacja list± dostêpu)
+
+NICK_STATUS_3
+ STATUS %s 3 (identyfikacja has³em)
+
+# INFO responses
+NICK_INFO_SYNTAX
+ INFO nick [ALL]
+
+NICK_INFO_REALNAME
+ %s to %s
+
+NICK_INFO_SERVICES_OPER
+ %s jest operatorem serwisów.
+
+NICK_INFO_SERVICES_ADMIN
+ %s jest administratorem serwisów.
+
+NICK_INFO_SERVICES_ROOT
+ %s jest g³ównym administratorem serwisów.
+
+NICK_INFO_ADDRESS
+ Ostatni host: %s
+
+NICK_INFO_ADDRESS_ONLINE
+ Jest online z: %s
+
+NICK_INFO_ADDRESS_ONLINE_NOHOST
+ %s jest teraz online.
+
+NICK_INFO_TIME_REGGED
+ Zarejestrowano: %s
+
+NICK_INFO_LAST_SEEN
+ Widziano: %s
+
+NICK_INFO_LAST_QUIT
+ Ostatni QUIT: %s
+
+NICK_INFO_URL
+ Adres www: %s
+
+NICK_INFO_EMAIL
+ Adres e-mail: %s
+
+NICK_INFO_VHOST
+ vhost: %s
+
+NICK_INFO_VHOST2
+ vhost: %s@%s
+
+NICK_INFO_ICQ
+ Numer ICQ: %d
+
+NICK_INFO_GREET
+ Powitanie: %s
+
+NICK_INFO_OPTIONS
+ Opcje: %s
+
+NICK_INFO_EXPIRE
+ Wygasa: %s
+
+# These strings MUST NOT be empty
+NICK_INFO_OPT_KILL
+ KILL
+
+NICK_INFO_OPT_SECURE
+ SECURE
+
+NICK_INFO_OPT_PRIVATE
+ PRIVATE
+
+NICK_INFO_OPT_MSG
+ MSG
+
+NICK_INFO_OPT_AUTOOP
+ AUTOOP
+
+NICK_INFO_OPT_NONE
+ Brak
+
+NICK_INFO_NO_EXPIRE
+ Ten nick nie wyga¶nie.
+
+NICK_INFO_FOR_MORE
+ Aby uzyskaæ wiêcej informacji napisz %R%s INFO %s ALL.
+
+NICK_INFO_SUSPENDED
+ Ten nick jest obecnie zawieszony, powód: %s
+
+NICK_INFO_SUSPENDED_NO_REASON
+ Ten nick jest obecnie zawieszony
+
+# LIST responses
+NICK_LIST_SYNTAX
+ LIST wzorzec
+
+NICK_LIST_SERVADMIN_SYNTAX
+ LIST wzorzec [FORBIDDEN] [SUSPENDED] [NOEXPIRE] [UNCONFIRMED]
+
+NICK_LIST_HEADER
+ Lista pasuj±cych wpisów %s:
+
+NICK_LIST_RESULTS
+ Koniec listy - %d/%d wpisów wy¶wietlono.
+
+# ALIST responses
+NICK_ALIST_SYNTAX
+ ALIST nick
+
+NICK_ALIST_HEADER
+ Kana³y, na których jeste¶ na li¶cie dostêpu:
+ Nr Kana³ Poziom Opis
+
+NICK_ALIST_HEADER_X
+ Kana³y, na których %s jest na li¶cie dostêpu:
+ Nr Kana³ Poziom Opis
+
+NICK_ALIST_XOP_FORMAT
+ %3d %c%-20s %-8s %s
+
+NICK_ALIST_ACCESS_FORMAT
+ %3d %c%-20s %-8d %s
+
+NICK_ALIST_FOOTER
+ Koniec listy - %d/%d kana³ów pokazano.
+
+# GLIST responses
+NICK_GLIST_HEADER
+ Lista nicków w grupie:
+
+NICK_GLIST_HEADER_X
+ Lista nicków grupy %s:
+
+NICK_GLIST_FOOTER
+ %d nicków w grupie.
+
+NICK_GLIST_REPLY
+ %c%s
+
+NICK_GLIST_REPLY_ADMIN
+ %c%s (wygasa za %s)
+
+# RECOVER responses
+NICK_RECOVER_SYNTAX
+ RECOVER nick [has³o]
+
+NICK_NO_RECOVER_SELF
+ Nie mo¿esz odzyskaæ nicka, którego w³a¶nie u¿ywasz!
+
+NICK_RECOVERED
+ Twój nick zosta³ w³a¶nie przejêty przez serwisy.
+ Napisz %R%s RELEASE %s, je¶li nie chcesz czekaæ %s sekund na jego automatyczne zwolnienie.
+
+# RELEASE responses
+NICK_RELEASE_SYNTAX
+ RELEASE nick [has³o]
+
+NICK_RELEASE_NOT_HELD
+ Nick %s nie jest zajêty przez serwisy.
+
+NICK_RELEASED
+ Serwisy w³a¶nie zwolni³y twojego nicka.
+
+# GHOST responses
+NICK_GHOST_SYNTAX
+ GHOST nick [has³o]
+
+NICK_NO_GHOST_SELF
+ Nie mo¿esz usun±æ samego siebie!
+
+NICK_GHOST_KILLED
+ Nick zosta³ usuniêty z sieci.
+
+# GETPASS responses
+NICK_GETPASS_SYNTAX
+ GETPASS nick
+
+NICK_GETPASS_UNAVAILABLE
+ Komenda GETPASS nie dzia³a, bo has³a s± szyfrowane.
+
+NICK_GETPASS_PASSWORD_IS
+ Has³o dla %s to %s.
+
+# GETEMAIL responses
+NICK_GETEMAIL_SYNTAX
+ GETEMAIL user@email-host Bez symboli wieloznacznych!
+
+NICK_GETEMAIL_EMAILS_ARE
+ Adresy e-mail %s pasuj±ce do %s.
+
+NICK_GETEMAIL_NOT_USED
+ Nie ma u¿ytkowników z adresem e-mail %s.
+
+
+# SENDPASS responses
+NICK_SENDPASS_SYNTAX
+ SENDPASS nick
+
+NICK_SENDPASS_UNAVAILABLE
+ Komenda SENDPASS nie dzia³a, bo has³a s± szyfrowane.
+
+NICK_SENDPASS_SUBJECT
+ Has³o do nicka %s
+
+NICK_SENDPASS_HEAD
+ Witaj!
+
+NICK_SENDPASS_LINE_1
+ Za¿±da³e¶(a¶) wys³ania has³a do nicka %s na e-mail.
+
+NICK_SENDPASS_LINE_2
+ Twoje has³o to: %s
+ Dla w³asnego bezpieczeñstwa nale¿y to has³o natychmiast zmieniæ na inne.
+
+NICK_SENDPASS_LINE_3
+ Je¶li nie wiesz dlaczego ta wiadomo¶æ dotar³a do Ciebie zignoruj j±. Je¶li ta sytuacja bêdzie siê powtarzaæ skontaktuj siê z administratorem sieci.
+
+NICK_SENDPASS_LINE_4
+ PROSZÊ NIE ODPOWIADAÆ NA T¡ WIADOMO¦Æ!
+
+NICK_SENDPASS_LINE_5
+ Administratorzy sieci %s.
+
+NICK_SENDPASS_OK
+ Has³o do nicka %s zosta³o wys³ane.
+
+# SUSPEND responses
+NICK_SUSPEND_SYNTAX
+ SUSPEND nick powód
+
+NICK_SUSPEND_SUCCEEDED
+ Nick %s zosta³ zawieszony.
+
+NICK_SUSPEND_FAILED
+ Zawieszenie nicka %s nie powiod³o siê!
+
+# UNSUSPEND responses
+NICK_UNSUSPEND_SYNTAX
+ UNSUSPEND nick
+
+NICK_UNSUSPEND_SUCCEEDED
+ Nick %s zosta³ uwolniony.
+
+NICK_UNSUSPEND_FAILED
+ Nie mogê uwolniæ nicka %s!
+
+# FORBID responses
+NICK_FORBID_SYNTAX
+ FORBID nick [powód]
+
+NICK_FORBID_SYNTAX_REASON
+ FORBID nick powód
+
+NICK_FORBID_SUCCEEDED
+ Nick %s zosta³ zablokowany.
+
+NICK_FORBID_FAILED
+ Nie mogê zablokowaæ nicka %s!
+
+# Nick Registraion responses
+NICK_REQUESTED
+ Ten nick zosta³ ju¿ zarejestrowany. Sprawd¼ swoj± pocztê.
+
+NICK_REG_RESENT
+ Twój kod rejestracyjny zosta³ ponownie wys³any na %s.
+
+NICK_REG_UNABLE
+ Nick nie zosta³ zarejestrowany. Proszê spróbowaæ pó¼niej.
+
+NICK_IS_PREREG
+ Ten nick czeka na e-mail z kodem weryfikacyjnym przed zakoñczeniem rejestracji.
+
+NICK_ENTER_REG_CODE
+ Kod zosta³ wys³any na adres %s.
+ Napisz %R%s CONFIRM <kod>, aby dokoñczyæ procedurê rejestracji.
+
+NICK_CONFIRM_NOT_FOUND
+ Termin wa¿no¶ci kodu rejestracyjnego up³yn±³.
+ Napisz: %R%s REGISTER <has³o> <email>,
+ aby znowu zacz±æ rejestracje.
+
+NICK_CONFIRM_INVALID
+ Podano nieprawid³owy kod, sprawd¼ wiadomo¶æ e-mail i spróbowaæ ponownie.
+
+NICK_REG_MAIL_SUBJECT
+ Rejestracja nicka %s
+
+NICK_REG_MAIL_HEAD
+ Witaj!
+
+NICK_REG_MAIL_LINE_1
+ Chcesz zarejestrowaæ nastêpuj±cy nick: %s.
+
+NICK_REG_MAIL_LINE_2
+ Proszê napisaæ %R%s CONFIRM %s aby dokoñczyæ rejestracjê.
+
+NICK_REG_MAIL_LINE_3
+ Je¶li nie wiesz dlaczego ta wiadomo¶æ dotar³a do Ciebie zignoruj j±. Je¶li sytuacja bêdzie siê powtarzaæ skontaktuj siê z administratorem sieci.
+NICK_REG_MAIL_LINE_4
+ PROSZÊ NIE ODPOWIADAÆ NA T¡ WIADOMO¦Æ!
+
+NICK_REG_MAIL_LINE_5
+ Administratorzy sieci %s.
+
+NICK_GETPASS_PASSCODE_IS
+ Kod rejestracyjny dla %s to %s.
+
+NICK_FORCE_REG
+ Nick %s potwierdzony.
+
+###########################################################################
+#
+# ChanServ messages
+#
+###########################################################################
+# Access level descriptions
+CHAN_LEVEL_AUTOOP
+ Automatyczne nadawanie statusu operatora (+o)
+
+CHAN_LEVEL_AUTOVOICE
+ Automatyczne nadawanie prawa g³osu (+v)
+
+CHAN_LEVEL_AUTOHALFOP
+ Automatyczne nadawanie statusu pó³-operatora (+h)
+
+CHAN_LEVEL_AUTOPROTECT
+ Automatyczne nadawanie ochrony (+a)
+
+CHAN_LEVEL_AUTODEOP
+ Automatyczne odbieranie statusu operatora (-o)
+
+CHAN_LEVEL_NOJOIN
+ Nie pozwala wej¶æ na kana³ w trybie RESTRICTED
+
+CHAN_LEVEL_INVITE
+ Pozwala u¿ywaæ komendy INVITE
+
+CHAN_LEVEL_AKICK
+ Pozwala u¿ywaæ komendy AKICK
+
+CHAN_LEVEL_SET
+ Pozwala modyfikowaæ ustawienia kana³u
+
+CHAN_LEVEL_CLEAR
+ Pozwala u¿ywaæ komendy CLEAR
+
+CHAN_LEVEL_UNBAN
+ Pozwala u¿ywaæ komendy UNBAN
+
+CHAN_LEVEL_OPDEOP
+ Pozwala u¿ywaæ komend OP i DEOP na innych osobach
+
+CHAN_LEVEL_ACCESS_LIST
+ Pozwala przegl±daæ listê dostêpu
+
+CHAN_LEVEL_ACCESS_CHANGE
+ Pozwala modyfikowaæ listê dostêpu
+
+CHAN_LEVEL_MEMO
+ Pozwala listowaæ i czytaæ kana³owe wiadomo¶ci
+
+CHAN_LEVEL_ASSIGN
+ Pozwala przydzielaæ i usuwaæ bota
+
+CHAN_LEVEL_BADWORDS
+ Pozwala u¿ywaæ komendy BADWORDS
+
+CHAN_LEVEL_NOKICK
+ Ochrona przed kopaniem za pomoc± komendy KICK
+
+CHAN_LEVEL_FANTASIA
+ Pozwala u¿ywaæ publicznych komend FANTASY
+
+CHAN_LEVEL_SAY
+ Pozwala u¿ywaæ komend SAY i ACT
+
+CHAN_LEVEL_GREET
+ Wy¶wietla wiadomo¶æ powitaln± (greet)
+
+CHAN_LEVEL_VOICEME
+ Pozwala u¿ywaæ komend VOICE i DEVOICE na sobie
+
+CHAN_LEVEL_VOICE
+ Pozwala u¿ywaæ komend VOICE i DEVOICE na innych osobach
+
+CHAN_LEVEL_GETKEY
+ Pozwala u¿ywaæ komendy GETKEY
+
+CHAN_LEVEL_OPDEOPME
+ Pozwala u¿ywaæ komend OP i DEOP na sobie
+
+CHAN_LEVEL_HALFOPME
+ Pozwala u¿ywaæ komend HALFOP i DEHALFOP na sobie
+
+CHAN_LEVEL_HALFOP
+ Pozwala u¿ywaæ komend HALFOP i DEHALFOP na innych osobach
+
+CHAN_LEVEL_PROTECTME
+ Pozwala u¿ywaæ komend PROTECT i DEPROTECT na sobie
+
+CHAN_LEVEL_PROTECT
+ Pozwala u¿ywaæ komend PROTECT i DEPROTECT na innych osobach
+
+CHAN_LEVEL_KICKME
+ Pozwala u¿ywaæ komendy KICK na sobie
+
+CHAN_LEVEL_KICK
+ Pozwala u¿ywaæ komendy KICK na innych osobach
+
+CHAN_LEVEL_SIGNKICK
+ Nie podpisze kicka, gdy SIGNKICK LEVEL jest u¿ywany
+
+CHAN_LEVEL_BANME
+ Pozwala u¿ywaæ komendy BAN na sobie
+
+CHAN_LEVEL_BAN
+ Pozwala u¿ywaæ komendy BAN na innych osobach
+
+CHAN_LEVEL_TOPIC
+ Pozwala u¿ywaæ komendy TOPIC
+
+CHAN_LEVEL_INFO
+ Pozwala u¿ywaæ opcji ALL w komendzie INFO
+
+# Automatic responses
+CHAN_IS_REGISTERED
+ Ten kana³ zosta³ zarejestrowany z %s.
+
+CHAN_NOT_ALLOWED_OP
+ Nie masz uprawnieñ do statusu operatora na kanale %s.
+
+CHAN_MAY_NOT_BE_USED
+ Ten kana³ nie mo¿e byæ u¿ywany.
+
+CHAN_NOT_ALLOWED_TO_JOIN
+ Nie masz pozwolenia, aby przebywaæ na tym kanale.
+
+CHAN_X_INVALID
+ %s nie jest prawid³owym kana³em.
+
+# REGISTER responses
+CHAN_REGISTER_SYNTAX
+ REGISTER kana³ has³o opis
+
+CHAN_REGISTER_DISABLED
+ Rejestracja kana³ów jest tymczasowo wy³±czona.
+
+CHAN_REGISTER_NOT_LOCAL
+ Lokalne kana³y nie mog± byæ rejestrowane.
+
+CHAN_MUST_REGISTER_NICK
+ Musisz mieæ zarejestrowany nick. Napisz %R%s HELP, aby uzyskaæ wiêcej informacji.
+
+CHAN_MUST_IDENTIFY_NICK
+ Zidentyfikuj siê najpierw u %s komend±:
+ %R%s IDENTIFY has³o
+
+CHAN_MAY_NOT_BE_REGISTERED
+ Kana³u %s nie mo¿na rejestrowaæ.
+
+CHAN_ALREADY_REGISTERED
+ Kana³ %s jest ju¿ zarejestrowany!
+
+CHAN_MUST_BE_CHANOP
+ Aby zarejestrowaæ kana³ musisz byæ jego operatorem.
+
+CHAN_REACHED_CHANNEL_LIMIT
+ B³±d, ju¿ masz osi±gniêty limit %d kana³ów.
+
+CHAN_EXCEEDED_CHANNEL_LIMIT
+ B³±d, ju¿ masz przekroczony limit %d kana³ów.
+
+CHAN_REGISTRATION_FAILED
+ Rejestracja nie powiod³a siê.
+
+CHAN_REGISTERED
+ Kana³ %s zosta³ teraz zarejestrowany.
+ Jako %s jeste¶ od teraz jego w³a¶cicielem.
+
+CHAN_PASSWORD_IS
+ Has³o do Twojego kana³u to %s
+
+CHAN_REGISTER_NONE_CHANNEL
+ Próbujesz rejestrowaæ nieistniej±cy kana³ %s
+
+CHAN_SYMBOL_REQUIRED
+ U¿yj symboli # lub & podczas rejestracji
+
+# IDENTIFY responses
+CHAN_IDENTIFY_SYNTAX
+ IDENTIFY kana³ has³o
+
+CHAN_IDENTIFY_FAILED
+ Identyfikacja nie powiod³a siê.
+
+CHAN_IDENTIFY_SUCCEEDED
+ Has³o przyjête - masz uprawnienia w³a¶ciciela kana³u %s.
+
+# LOGOUT responses
+CHAN_LOGOUT_SYNTAX
+ LOGOUT kana³ nick
+
+CHAN_LOGOUT_SERVADMIN_SYNTAX
+ LOGOUT kana³ [nick]
+
+CHAN_LOGOUT_SUCCEEDED
+ U¿ytkownik %s zosta³ wylogowany z kana³u %s.
+CHAN_LOGOUT_ALL_SUCCEEDED
+ Wylogowano zidentyfikowanych u¿ytkowników z kana³u %s (bez w³a¶ciciela).
+CHAN_LOGOUT_FOUNDER_FAILED
+ Nie mo¿esz siê wylogowaæ z %s (jeste¶ w³a¶cicielem).
+
+# DROP responses
+CHAN_DROP_SYNTAX
+ DROP kana³
+
+CHAN_DROP_DISABLED
+ Usuwanie kana³ów jest tymczasowo wy³±czone.
+
+CHAN_DROPPED
+ Kana³ %s zosta³ odrejestrowany.
+
+# SET responses
+CHAN_SET_SYNTAX
+ SET kana³ opcja parametry
+
+CHAN_SET_DISABLED
+ Modyfikacja ustawieñ kana³u jest tymczasowo wy³±czona.
+
+CHAN_SET_UNKNOWN_OPTION
+ Nieznana opcja komendy SET: %s.
+
+# SET FOUNDER responses
+CHAN_SET_FOUNDER_TOO_MANY_CHANS
+ %s posiada za du¿o zarejestrowanych kana³ów.
+
+CHAN_FOUNDER_CHANGED
+ W³a¶cicielem kana³u %s jest teraz %s.
+
+# SET SUCCESSOR responses
+CHAN_SUCCESSOR_CHANGED
+ Zastêpcê dla kana³u %s zmieniono na %s.
+
+CHAN_SUCCESSOR_UNSET
+ Zastêpcê dla kana³u %s usuniêto.
+
+CHAN_SUCCESSOR_IS_FOUNDER
+ %s nie mo¿e byæ zastêpc± na kanale %s, poniewa¿ jest jego w³a¶cicielem.
+
+# SET PASSWORD responses
+CHAN_SET_PASSWORD_FAILED
+ Zmiana has³a nie powiod³a siê.
+
+CHAN_PASSWORD_CHANGED
+ Has³o do kana³u %s zosta³o zmienione.
+
+CHAN_PASSWORD_CHANGED_TO
+ Has³o do kana³u %s zosta³o zmienione na %s.
+
+# SET DESC responses
+CHAN_DESC_CHANGED
+ Opis kana³u %s zosta³ zmieniony na %s.
+
+# SET URL responses
+CHAN_URL_CHANGED
+ Adres www dla kana³u %s zosta³ zmieniony na %s.
+
+CHAN_URL_UNSET
+ Adres www dla kana³u %s zosta³ usuniêty.
+
+# SET EMAIL responses
+CHAN_EMAIL_CHANGED
+ Adres e-mail kana³u %s zosta³ zmieniony na %s.
+
+CHAN_EMAIL_UNSET
+ Adres e-mail kana³u %s zosta³ usuniêty.
+
+# SET ENTRYMSG responses
+CHAN_ENTRY_MSG_CHANGED
+ Wiadomo¶æ powitalna kana³u %s zosta³a zmieniona.
+
+CHAN_ENTRY_MSG_UNSET
+ Wiadomo¶æ powitalna kana³u %s zosta³a usuniêta.
+
+
+# SET BANTYPE responses
+CHAN_SET_BANTYPE_INVALID
+ %s nie jest prawid³owym rodzajem bana.
+
+CHAN_SET_BANTYPE_CHANGED
+ Rodzajem bana dla kana³u %s jest teraz #%d.
+
+# SET MLOCK responses
+CHAN_SET_MLOCK_UNKNOWN_CHAR
+ Nieznany flaga %c zostaje zignorowana.
+
+CHAN_SET_MLOCK_IMPOSSIBLE_CHAR
+ Flaga %c zosta³a zignorowana, bo nie mo¿na jej blokowaæ.
+
+CHAN_SET_MLOCK_L_REQUIRED
+ Musisz za³o¿yæ +l zanim za³o¿ysz +L.
+
+CHAN_SET_MLOCK_K_REQUIRED
+ Musisz za³o¿yæ +i równie¿, aby móc za³o¿yæ +K.
+
+CHAN_MLOCK_CHANGED
+ Blokada trybów kana³u %s zosta³a zmieniona na: %s
+
+# SET KEEPTOPIC responses
+CHAN_SET_KEEPTOPIC_SYNTAX
+ SET kana³ KEEPTOPIC {ON | OFF}
+
+CHAN_SET_KEEPTOPIC_ON
+ Temat kana³u %s bêdzie teraz utrzymywany.
+
+CHAN_SET_KEEPTOPIC_OFF
+ Temat kana³u %s nie bêdzie ju¿ utrzymywany.
+
+# SET TOPICLOCK responses
+CHAN_SET_TOPICLOCK_SYNTAX
+ SET kana³ TOPICLOCK {ON | OFF}
+
+CHAN_SET_TOPICLOCK_ON
+ Blokada tematu na kanale %s zosta³a w³±czona.
+
+CHAN_SET_TOPICLOCK_OFF
+ Blokada tematu na kanale %s zosta³a wy³±czona.
+
+# SET PEACE responses
+CHAN_SET_PEACE_SYNTAX
+ SET kana³ PEACE {ON | OFF}
+
+CHAN_SET_PEACE_ON
+ Opcja PEACE dla kana³u %s zosta³a w³±czona.
+
+CHAN_SET_PEACE_OFF
+ Opcja PEACE dla kana³u %s zosta³a wy³±czona.
+
+# SET PRIVATE responses
+CHAN_SET_PRIVATE_SYNTAX
+ SET kana³ PRIVATE {ON | OFF}
+
+CHAN_SET_PRIVATE_ON
+ Opcja PRIVATE dla kana³u %s zosta³a w³±czona.
+
+CHAN_SET_PRIVATE_OFF
+ Opcja PRIVATE dla kana³u %s zosta³a wy³±czona.
+
+# SET SECUREOPS responses
+CHAN_SET_SECUREOPS_SYNTAX
+ SET kana³ SECUREOPS {ON | OFF}
+
+CHAN_SET_SECUREOPS_ON
+ Status operatora kana³u %s bêdzie teraz chroniony.
+
+CHAN_SET_SECUREOPS_OFF
+ Status operatora kana³u %s nie bêdzie ju¿ chroniony.
+
+# SET SECUREFOUNDER responses
+CHAN_SET_SECUREFOUNDER_SYNTAX
+ SET kana³ SECUREFOUNDER {ON | OFF}
+
+CHAN_SET_SECUREFOUNDER_ON
+ Status w³a¶ciciela kana³u %s bêdzie teraz chroniony.
+
+CHAN_SET_SECUREFOUNDER_OFF
+ Status w³a¶ciciela kana³u %s nie bêdzie ju¿ chroniony.
+
+# SET RESTRICTED responses
+CHAN_SET_RESTRICTED_SYNTAX
+ SET kana³ RESTRICTED {ON | OFF}
+
+CHAN_SET_RESTRICTED_ON
+ Dostêp do kana³u %s jest teraz ograniczony.
+
+CHAN_SET_RESTRICTED_OFF
+ Dostêp do kana³u %s nie jest ju¿ ograniczony.
+
+# SET SECURE responses
+CHAN_SET_SECURE_SYNTAX
+ SET kana³ SECURE {ON | OFF}
+
+CHAN_SET_SECURE_ON
+ Opcja bezpieczeñstwa dla kana³u %s zosta³a w³±czona.
+
+CHAN_SET_SECURE_OFF
+ Opcja bezpieczeñstwa dla kana³u %s zosta³a wy³±czona.
+
+# SET SIGNKICK responses
+CHAN_SET_SIGNKICK_SYNTAX
+ SET kana³ SIGNKICK {ON | LEVEL | OFF}
+
+CHAN_SET_SIGNKICK_ON
+ Podpisywanie komendy KICK na kanale %s zosta³o w³±czone.
+
+CHAN_SET_SIGNKICK_LEVEL
+ Podpisywanie komendy KICK na kanale %s zosta³o w³±czone, ale
+ bêdzie zale¿a³o od poziomu dostêpu jaki posiada u¿ytkownik.
+
+CHAN_SET_SIGNKICK_OFF
+ Podpisywanie komendy KICK na kanale %s zosta³o wy³±czone.
+
+# SET OPNOTICE responses
+CHAN_SET_OPNOTICE_SYNTAX
+ SET kana³ OPNOTICE {ON | OFF}
+
+CHAN_SET_OPNOTICE_ON
+ Opcja OPNOTICE dla kana³u %s zosta³a w³±czona.
+
+CHAN_SET_OPNOTICE_OFF
+ Opcja OPNOTICE dla kana³u %s zosta³a wy³±czona.
+
+# SET XOP responses
+CHAN_SET_XOP_SYNTAX
+ SET kana³ XOP {ON | OFF}
+
+CHAN_SET_XOP_ON
+ System list xOP na kanale %s zosta³ w³±czony.
+
+CHAN_SET_XOP_OFF
+ System list xOP na kanale %s zosta³ wy³±czony.
+
+# SET NOEXPIRE responses
+CHAN_SET_NOEXPIRE_SYNTAX
+ SET kana³ NOEXPIRE {ON | OFF}
+
+CHAN_SET_NOEXPIRE_ON
+ Kana³ %s nie wyga¶nie.
+
+CHAN_SET_NOEXPIRE_OFF
+ Kana³ %s od teraz podlega prawu wygasania.
+
+# xOP messages
+CHAN_XOP_REACHED_LIMIT
+ Mo¿esz mieæ tylko %d wpisów na listach xOP.
+
+CHAN_XOP_LIST_FORMAT
+ %3d %s
+
+CHAN_XOP_ACCESS
+ Nie mo¿esz u¿yæ tej komendy. U¿yj komendy ACCESS.
+ Napisz %R%s HELP ACCESS, aby uzyskaæ wiêcej informacji.
+
+CHAN_XOP_NOT_AVAILABLE
+ System xOP nie jest dostêpny.
+
+# AOP messages
+CHAN_AOP_SYNTAX
+ AOP kana³ {ADD|DEL|LIST|CLEAR} [nick | pozycja]
+
+CHAN_AOP_DISABLED
+ Modyfikacja listy AOP jest tymczasowo wy³±czona.
+
+CHAN_AOP_NICKS_ONLY
+ Kana³owa lista AOP mo¿e zawieraæ jedynie zarejestrowane nicki.
+
+CHAN_AOP_ADDED
+ %s dodano do listy AOP kana³u %s.
+
+CHAN_AOP_MOVED
+ %s przeniesiono do listy AOP kana³u %s.
+
+CHAN_AOP_NO_SUCH_ENTRY
+ Brak wpisu (#%d) na li¶cie AOP kana³u %s.
+
+CHAN_AOP_NOT_FOUND
+ %s nie znaleziono na li¶cie AOP kana³u %s.
+
+CHAN_AOP_NO_MATCH
+ Nie znaleziono wpisów w li¶cie AOP kana³u %s.
+
+CHAN_AOP_DELETED
+ %s usuniêto z listy AOP kana³u %s.
+
+CHAN_AOP_DELETED_ONE
+ Usuniêto 1 wpis z listy AOP kana³u %s.
+
+CHAN_AOP_DELETED_SEVERAL
+ Usuniêto %d wpisów(y) z listy AOP kana³u %s.
+
+CHAN_AOP_LIST_EMPTY
+ Lista AOP kana³u %s jest pusta.
+
+CHAN_AOP_LIST_HEADER
+ Lista AOP kana³u %s:
+ Nr Nick
+
+CHAN_AOP_CLEAR
+ Lista AOP kana³u %s zosta³a wyczyszczona.
+
+# HOP messages
+CHAN_HOP_SYNTAX
+ HOP kana³ {ADD|DEL|LIST|CLEAR} [nick | pozycja]
+
+CHAN_HOP_DISABLED
+ Modyfikacja listy HOP jest tymczasowo wy³±czona.
+
+CHAN_HOP_NICKS_ONLY
+ Kana³owa lista HOP mo¿e zawieraæ jedynie zarejestrowane nicki.
+
+CHAN_HOP_ADDED
+ %s dodano do listy HOP kana³u %s.
+
+CHAN_HOP_MOVED
+ %s przeniesiono do listy HOP kana³u %s.
+
+CHAN_HOP_NO_SUCH_ENTRY
+ Brak wpisu (#%d) na li¶cie HOP kana³u %s.
+
+CHAN_HOP_NOT_FOUND
+ %s nie znaleziono na li¶cie HOP kana³u %s.
+
+CHAN_HOP_NO_MATCH
+ Nie znaleziono wpisów w li¶cie HOP kana³u %s.
+
+CHAN_HOP_DELETED
+ %s usuniêto z listy HOP kana³u %s.
+
+CHAN_HOP_DELETED_ONE
+ Usuniêto 1 wpis z listy HOP kana³u %s.
+
+CHAN_HOP_DELETED_SEVERAL
+ Usuniêto %d wpisów(y) z listy HOP kana³u %s.
+
+CHAN_HOP_LIST_EMPTY
+ Lista HOP kana³u %s jest pusta.
+
+CHAN_HOP_LIST_HEADER
+ Lista HOP kana³u %s:
+ Nr Nick
+
+CHAN_HOP_CLEAR
+ Lista HOP kana³u %s zosta³a wyczyszczona.
+
+# SOP messages
+CHAN_SOP_SYNTAX
+ SOP kana³ {ADD|DEL|LIST|CLEAR} [nick | pozycja]
+
+CHAN_SOP_DISABLED
+ Modyfikacja listy SOP jest tymczasowo wy³±czona.
+
+CHAN_SOP_NICKS_ONLY
+ Kana³owa lista SOP mo¿e zawieraæ jedynie zarejestrowane nicki.
+
+CHAN_SOP_ADDED
+ %s dodano do listy SOP kana³u %s.
+
+CHAN_SOP_MOVED
+ %s przeniesiono do listy SOP kana³u %s.
+
+CHAN_SOP_NO_SUCH_ENTRY
+ Brak wpisu (#%d) na li¶cie SOP kana³u %s.
+
+CHAN_SOP_NOT_FOUND
+ %s nie znaleziono na li¶cie SOP kana³u %s.
+
+CHAN_SOP_NO_MATCH
+ Nie znaleziono wpisów w li¶cie SOP kana³u %s.
+
+CHAN_SOP_DELETED
+ %s usuniêto z listy SOP kana³u %s.
+
+CHAN_SOP_DELETED_ONE
+ Usuniêto 1 wpis z listy SOP kana³u %s.
+
+CHAN_SOP_DELETED_SEVERAL
+ Usuniêto %d wpisów(y) z listy SOP kana³u %s.
+
+CHAN_SOP_LIST_EMPTY
+ Lista SOP kana³u %s jest pusta.
+
+CHAN_SOP_LIST_HEADER
+ Lista SOP kana³u %s:
+ Nr Nick
+
+CHAN_SOP_CLEAR
+ Lista SOP kana³u %s zosta³a wyczyszczona.
+
+# VOP messages
+CHAN_VOP_SYNTAX
+ VOP kana³ {ADD|DEL|LIST|CLEAR} [nick | pozycja]
+
+CHAN_VOP_DISABLED
+ Modyfikacja listy VOP jest tymczasowo wy³±czona.
+
+CHAN_VOP_NICKS_ONLY
+ Kana³owa lista VOP mo¿e zawieraæ jedynie zarejestrowane nicki.
+
+CHAN_VOP_ADDED
+ %s dodano do listy VOP kana³u %s.
+
+CHAN_VOP_MOVED
+ %s przeniesiono do listy VOP kana³u %s.
+
+CHAN_VOP_NO_SUCH_ENTRY
+ Brak wpisu (#%d) na li¶cie VOP kana³u %s.
+
+CHAN_VOP_NOT_FOUND
+ %s nie znaleziono na li¶cie VOP kana³u %s.
+
+CHAN_VOP_NO_MATCH
+ Nie znaleziono wpisów w li¶cie VOP kana³u %s.
+
+CHAN_VOP_DELETED
+ %s usuniêto z listy VOP kana³u %s.
+
+CHAN_VOP_DELETED_ONE
+ Usuniêto 1 wpis z listy VOP kana³u %s.
+
+CHAN_VOP_DELETED_SEVERAL
+ Usuniêto %d wpisów(y) z listy VOP kana³u %s.
+
+CHAN_VOP_LIST_EMPTY
+ Lista VOP kana³u %s jest pusta.
+
+CHAN_VOP_LIST_HEADER
+ Lista VOP kana³u %s:
+ Nr Nick
+
+CHAN_VOP_CLEAR
+ Lista VOP kana³u %s zosta³a wyczyszczona.
+
+# ACCESS messages
+CHAN_ACCESS_SYNTAX
+ ACCESS kana³ {ADD|DEL|LIST|CLEAR} [nick [poziom] | pozycja]
+
+CHAN_ACCESS_XOP
+ Nie mo¿esz u¿yæ tej komendy.
+ Musisz u¿yæ poleceñ VOP, AOP lub SOP.
+ Napisz %R%s HELP komenda, aby uzyskaæ wiêcej informacji.
+
+CHAN_ACCESS_XOP_HOP
+ Nie mo¿esz u¿yæ tej komendy.
+ Musisz u¿yæ poleceñ VOP, HOP, AOP lub SOP.
+ Napisz %R%s HELP komenda, aby uzyskaæ wiêcej informacji.
+
+CHAN_ACCESS_DISABLED
+ Modyfikacja listy dostêpu jest tymczasowo wy³±czona.
+
+CHAN_ACCESS_LEVEL_NONZERO
+ Poziom dostêpu nie mo¿e byæ zerem.
+
+CHAN_ACCESS_LEVEL_RANGE
+ Poziom dostêpu musi byæ pomiêdzy %d a %d w³±cznie.
+
+CHAN_ACCESS_NICKS_ONLY
+ Kana³owa lista dostêpu mo¿e zawieraæ tylko zarejestrowane nicki.
+
+CHAN_ACCESS_REACHED_LIMIT
+ Mo¿esz mieæ tylko %d wpisów na kana³owej li¶cie dostêpu.
+
+CHAN_ACCESS_LEVEL_UNCHANGED
+ Poziom dostêpu dla %s na kanale %s jest
+ nadany od %d.
+
+CHAN_ACCESS_LEVEL_CHANGED
+ Poziom dostêpu dla %s na kanale %s
+ zmieniono na %d.
+
+CHAN_ACCESS_ADDED
+ %s dodano do listy dostêpu kana³u %s z
+ poziomem %d.
+
+CHAN_ACCESS_NO_SUCH_ENTRY
+ Brak wpisu (#%d) na li¶cie dostêpu kana³u %s.
+
+CHAN_ACCESS_NOT_FOUND
+ %s nie znaleziono na li¶cie dostêpu kana³u %s.
+
+CHAN_ACCESS_NO_MATCH
+ Nie znaleziono wpisów na li¶cie dostêpu kana³u %s.
+
+CHAN_ACCESS_DELETED
+ %s usuniêto z listy dostêpu kana³u %s.
+
+CHAN_ACCESS_DELETED_ONE
+ Usuniêto 1 wpis z listy dostêpu kana³u %s.
+
+CHAN_ACCESS_DELETED_SEVERAL
+ Usuniêto %d wpisów(y) z listy dostêpu kana³u %s.
+
+CHAN_ACCESS_LIST_EMPTY
+ Lista dostêpu kana³u %s jest pusta.
+
+CHAN_ACCESS_LIST_HEADER
+ Lista dostêpu kana³u %s:
+ Nr Poz Nick
+
+CHAN_ACCESS_LIST_FOOTER
+ Koniec listy dostêpu.
+
+CHAN_ACCESS_LIST_XOP_FORMAT
+ %3d %s %s
+
+CHAN_ACCESS_LIST_AXS_FORMAT
+ %3d %4d %s
+
+CHAN_ACCESS_CLEAR
+ Lista dostêpu kana³u %s zosta³a wyczyszczona.
+
+# AKICK responses
+CHAN_AKICK_SYNTAX
+ AKICK kana³ {ADD | STICK | UNSTICK | DEL | LIST | VIEW | ENFORCE | CLEAR} [nick-lub-maska] [powód]
+
+CHAN_AKICK_DISABLED
+ Modyfikacja listy AKICK jest tymczasowo wy³±czona.
+
+CHAN_AKICK_ALREADY_EXISTS
+ %s ju¿ istnieje w li¶cie AKICK kana³u %s.
+
+CHAN_AKICK_REACHED_LIMIT
+ Mo¿esz mieæ jedynie %d wpisów w li¶cie AKICK.
+
+CHAN_AKICK_ADDED
+ %s dodano do listy AKICK kana³u %s.
+
+CHAN_AKICK_NO_SUCH_ENTRY
+ Brak wpisu (#%d) na li¶cie AKICK kana³u %s.
+
+CHAN_AKICK_NOT_FOUND
+ %s nie znaleziono na li¶cie AKICK kana³u %s.
+
+CHAN_AKICK_NO_MATCH
+ Nie znaleziono wpisów na li¶cie AKICK kana³u %s.
+
+CHAN_AKICK_STUCK
+ %s jest od teraz ca³y czas aktywny na %s.
+
+CHAN_AKICK_UNSTUCK
+ %s nie jest ju¿ zawsze aktywny na %s.
+
+CHAN_AKICK_DELETED
+ %s usuniêto z listy AKICK %s.
+
+CHAN_AKICK_DELETED_ONE
+ Usuniêto 1 wpis z listy AKICK kana³u %s.
+
+CHAN_AKICK_DELETED_SEVERAL
+ Usuniêto %d wpisów z listy AKICK kana³u %s.
+
+CHAN_AKICK_LIST_EMPTY
+ Lista AKICK kana³u %s jest pusta.
+
+CHAN_AKICK_LIST_HEADER
+ Lista AKICK dla kana³u %s:
+
+CHAN_AKICK_LIST_FORMAT
+ %3d %s (%s)
+
+CHAN_AKICK_VIEW_FORMAT
+ %3d %s (przez %s na %s)
+ %s
+
+CHAN_AKICK_VIEW_FORMAT_STUCK
+ %3d %s (zablokowany) (przez %s na %s)
+ %s
+
+CHAN_AKICK_ENFORCE_DONE
+ Egzekucja listy AKICK kana³u %s zakoñczona.
+ Dotyczy³a %d u¿ytkowników.
+
+CHAN_AKICK_CLEAR
+ Lista AKICK kana³u %s zosta³a wyczyszczona.
+
+# LEVELS responses
+CHAN_LEVELS_SYNTAX
+ LEVELS kana³ {SET | DIS[ABLE] | LIST | RESET} [element [poziom]]
+
+CHAN_LEVELS_XOP
+ Modyfikowanie poziomów nie jest dostêpne w trybie XOP.
+
+CHAN_LEVELS_RANGE
+ Poziom musi byæ pomiêdzy %d a %d w³±cznie.
+
+CHAN_LEVELS_CHANGED
+ Wymagany poziom dla %s
+ na kanale %s zmieniono teraz na %d.
+
+CHAN_LEVELS_UNKNOWN
+ Nieznane ustawienie %s.
+ Napisz %R%s HELP LEVELS DESC, aby uzyskaæ listê dostêpnych mo¿liwo¶ci.
+
+CHAN_LEVELS_DISABLED
+ %s wy³±czono na kanale %s.
+
+CHAN_LEVELS_LIST_HEADER
+ Ustawienia poziomów dostêpu kana³u %s:
+
+CHAN_LEVELS_LIST_DISABLED
+ %-*s (wy³±czony)
+
+CHAN_LEVELS_LIST_FOUNDER
+ %-*s (tylko w³a¶ciciel)
+
+CHAN_LEVELS_LIST_NORMAL
+ %-*s %d
+
+CHAN_LEVELS_RESET
+ Poziomy dostêpu kana³u %s zosta³y zresetowane do domy¶lnych.
+
+# Status Messages
+CHAN_STATUS_SYNTAX
+ STATUS ERROR B³±d sk³adni
+
+CHAN_STATUS_NOT_REGGED
+ STATUS ERROR Kana³ %s nie jest zarejestrowany
+
+CHAN_STATUS_FORBIDDEN
+ STATUS ERROR Kana³ %s jest zakazany
+
+CHAN_STATUS_NOTONLINE
+ STATUS ERROR Nick %s nie jest online
+
+CHAN_STATUS_INFO
+ STATUS %s %s %d
+
+# INFO responses
+CHAN_INFO_SYNTAX
+ INFO kana³ [ALL]
+
+CHAN_INFO_HEADER
+ Informacje o kanale %s:
+
+CHAN_INFO_FOUNDER
+ W³a¶ciciel: %s (%s)
+
+CHAN_INFO_NO_FOUNDER
+ W³a¶ciciel: %s
+
+CHAN_INFO_SUCCESSOR
+ Zastêpca: %s (%s)
+
+CHAN_INFO_NO_SUCCESSOR
+ Zastêpca: %s
+
+CHAN_INFO_DESCRIPTION
+ Opis: %s
+
+CHAN_INFO_ENTRYMSG
+ Powitanie: %s
+
+CHAN_INFO_TIME_REGGED
+ Zarejestrowano: %s
+
+CHAN_INFO_LAST_USED
+ U¿ywano: %s
+
+CHAN_INFO_LAST_TOPIC
+ Ostatni temat: %s
+
+CHAN_INFO_TOPIC_SET_BY
+ Ustawiony przez: %s
+
+CHAN_INFO_URL
+ Adres www: %s
+
+CHAN_INFO_EMAIL
+ Adres e-mail: %s
+
+CHAN_INFO_BANTYPE
+ Typ bana: %d
+
+CHAN_INFO_OPTIONS
+ Opcje: %s
+
+CHAN_INFO_OPT_KEEPTOPIC
+ KEEPTOPIC
+
+CHAN_INFO_OPT_OPNOTICE
+ OPNOTICE
+
+CHAN_INFO_OPT_PEACE
+ PEACE
+
+CHAN_INFO_OPT_PRIVATE
+ PRIVATE
+
+CHAN_INFO_OPT_RESTRICTED
+ RESTRICTED
+
+CHAN_INFO_OPT_SECURE
+ SECURE
+
+CHAN_INFO_OPT_SECUREOPS
+ SECUREOPS
+
+CHAN_INFO_OPT_SECUREFOUNDER
+ SECUREFOUNDER
+
+CHAN_INFO_OPT_SIGNKICK
+ SIGNKICK
+
+CHAN_INFO_OPT_TOPICLOCK
+ TOPICLOCK
+
+CHAN_INFO_OPT_XOP
+ XOP
+
+CHAN_INFO_OPT_NONE
+ Brak
+
+CHAN_INFO_MODE_LOCK
+ Blokowane tryby: %s
+
+CHAN_INFO_EXPIRE
+ Wygasa: %s
+
+CHAN_INFO_NO_EXPIRE
+ Ten kana³ nie wyga¶nie.
+
+# LIST responses
+CHAN_LIST_SYNTAX
+ LIST wzorzec
+
+CHAN_LIST_SERVADMIN_SYNTAX
+ LIST wzorzec [FORBIDDEN] [SUSPENDED] [NOEXPIRE]
+
+CHAN_LIST_HEADER
+ Lista pasuj±cych wpisów %s:
+
+CHAN_LIST_FORMAT
+ %-20s %s
+
+CHAN_LIST_END
+ Koniec listy - %d/%d wpisów znalezionych.
+
+
+# INVITE responses
+CHAN_INVITE_SYNTAX
+ INVITE kana³
+
+# UNBAN responses
+CHAN_UNBAN_SYNTAX
+ UNBAN kana³
+
+CHAN_UNBANNED
+ Ban na kanale %s zosta³ zdjêty.
+
+# TOPIC responses
+CHAN_TOPIC_SYNTAX
+ TOPIC kana³ [temat]
+
+# CLEAR responses
+CHAN_CLEAR_SYNTAX
+ CLEAR kana³ co
+
+CHAN_CLEARED_BANS
+ Wszystkie bany z kana³u %s zosta³y usuniête.
+
+CHAN_CLEARED_EXCEPTS
+ Wszystkie wyj±tki z kana³u %s zosta³y usuniête.
+
+CHAN_CLEARED_MODES
+ Wszystkie flagi kana³u %s zosta³y zresetowane.
+
+CHAN_CLEARED_OPS
+ Flagi +o zosta³y wyczyszczone na kanale %s.
+
+CHAN_CLEARED_HOPS
+ Flagi +h zosta³y wyczyszczone na kanale %s.
+
+CHAN_CLEARED_VOICES
+ Flagi +v zosta³y wyczyszczone na kanale %s.
+
+CHAN_CLEARED_USERS
+ Wszyscy u¿ytkownicy zostali usuniêci z kana³u %s.
+
+CHAN_CLEARED_INVITES
+ Wszystkie zaproszenia z kana³u %s zosta³y usuniête.
+
+# GETPASS responses
+CHAN_GETPASS_SYNTAX
+ GETPASS kana³
+
+CHAN_GETPASS_UNAVAILABLE
+ Komenda GETPASS nie dzia³a, bo has³a s± szyfrowane.
+
+CHAN_GETPASS_PASSWORD_IS
+ Has³o kana³u %s to %s.
+
+# GETKEY responses
+CHAN_GETKEY_SYNTAX
+ GETKEY kana³
+
+CHAN_GETKEY_NOKEY
+ Kana³ %s nie posiada klucza.
+
+CHAN_GETKEY_KEY
+ KEY %s %s
+
+# SENDPASS responses
+CHAN_SENDPASS_SYNTAX
+ SENDPASS kana³
+
+CHAN_SENDPASS_UNAVAILABLE
+ Komenda SENDPASS nie dzia³a, bo has³a s± szyfrowane.
+
+CHAN_SENDPASS_SUBJECT
+ Has³o do kana³u %s
+
+CHAN_SENDPASS_HEAD
+ Witaj!
+
+CHAN_SENDPASS_LINE_1
+ Za¿±da³e¶(a¶) wys³ania has³a do kana³u %s na e-mail.
+
+CHAN_SENDPASS_LINE_2
+ Twoje has³o to: %s.
+ Dla w³asnego bezpieczeñstwa nale¿y to has³o natychmiast zmieniæ na inne.
+
+CHAN_SENDPASS_LINE_3
+ Je¶li nie wiesz dlaczego ta wiadomo¶æ dotar³a do Ciebie zignoruj j±. Je¶li ta sytuacja bêdzie siê powtarzaæ skontaktuj siê z administratorem sieci.
+
+CHAN_SENDPASS_LINE_4
+ PROSZÊ NIE ODPOWIADAÆ NA T¡ WIADOMO¦Æ!
+
+CHAN_SENDPASS_LINE_5
+ Administratorzy sieci %s.
+
+CHAN_SENDPASS_OK
+ Has³o do kana³u %s zosta³o wys³ane.
+
+# FORBID responses
+CHAN_FORBID_SYNTAX
+ FORBID kana³ [powód]
+
+CHAN_FORBID_SYNTAX_REASON
+ FORBID kana³ powód
+
+CHAN_FORBID_SUCCEEDED
+ Kana³ %s zosta³ zablokowany.
+
+CHAN_FORBID_FAILED
+ Nie mogê zablokowaæ kana³u %s!
+
+CHAN_FORBID_REASON
+ Ten kana³ zosta³ zablokowany.
+
+# SUSPEND responses
+CHAN_SUSPEND_SYNTAX
+ SUSPEND kana³ [powód]
+
+CHAN_SUSPEND_SYNTAX_REASON
+ SUSPEND kana³ powód
+
+CHAN_SUSPEND_SUCCEEDED
+ Kana³ %s zosta³ zawieszony.
+
+CHAN_SUSPEND_FAILED
+ Zawieszenie kana³u %s nie powiod³o siê!
+
+CHAN_SUSPEND_REASON
+ Ten kana³ zosta³ zawieszony.
+
+# UNSUSPEND responses
+CHAN_UNSUSPEND_SYNTAX
+ UNSUSPEND kana³
+
+CHAN_UNSUSPEND_ERROR
+ Nie znaleziono znaku # na pocz±tku nazwy kana³u.
+
+CHAN_UNSUSPEND_SUCCEEDED
+ Kana³ %s zosta³ uwolniony.
+
+CHAN_UNSUSPEND_FAILED
+ Nie mogê uwolniæ kana³u %s!
+
+# Misc responses
+CHAN_EXCEPTED
+ %s posiada wyj±tek na %s i nie mo¿e byæ zbanowany póki nie zostanie usuniêty.
+
+###########################################################################
+#
+# MemoServ messages
+#
+###########################################################################
+# Automatic messages
+MEMO_HAVE_NEW_MEMO
+ Masz jedn± now± wiadomo¶æ.
+
+MEMO_HAVE_NEW_MEMOS
+ Masz %d nowe(ych) wiadomo¶ci.
+
+MEMO_TYPE_READ_LAST
+ Napisz %R%s READ LAST aby przeczytaæ.
+
+MEMO_TYPE_READ_NUM
+ Napisz %R%s READ %d aby przeczytaæ.
+
+MEMO_TYPE_LIST_NEW
+ Napisz %R%s LIST NEW,
+ aby zobaczyæ listê nowych wiadomo¶ci.
+
+MEMO_AT_LIMIT
+ Uwaga: Osi±gniêto ju¿ limit wiadomo¶ci (%d).
+ Nie bêdziesz otrzymywaæ nowych wiadomo¶ci dopóki
+ nie usuniesz kilku starych.
+
+MEMO_OVER_LIMIT
+ Uwaga: Maksymalny limit wiadomo¶ci (%d) zosta³ osi±gniêty.
+ Nie bêdziesz otrzymywaæ nowych wiadomo¶ci je¶li kilku nie usuniesz.
+
+MEMO_X_MANY_NOTICE
+ Jest %d wiadomo¶ci dla kana³u %s.
+
+MEMO_X_ONE_NOTICE
+ Jest %d wiadomo¶æ dla kana³u %s.
+
+MEMO_NEW_X_MEMO_ARRIVED
+ Jest nowa wiadomo¶æ dla kana³u %s.
+ Napisz %R%s READ %s %d aby j± przeczytaæ.
+
+MEMO_NEW_MEMO_ARRIVED
+ Nasz now± wiadomo¶æ od %s.
+ Napisz %R%s READ %d aby j± przeczytaæ.
+
+# Multi-use responses
+MEMO_HAVE_NO_MEMOS
+ Nie masz wiadomo¶ci.
+
+MEMO_X_HAS_NO_MEMOS
+ %s nie ma wiadomo¶ci.
+
+MEMO_DOES_NOT_EXIST
+ Wiadomo¶æ %d nie istnieje!
+
+MEMO_LIST_NOT_FOUND
+ Nie znaleziono pasuj±cych wiadomo¶ci.
+
+# SEND responses
+MEMO_SEND_SYNTAX
+ SEND {nick | kana³} tre¶æ
+
+MEMO_SEND_DISABLED
+ Wysy³anie wiadomo¶ci jest tymczasowo wy³±czone.
+
+MEMO_SEND_PLEASE_WAIT
+ Odczekaj %d sekund(y) przed ponownym u¿yciem komendy SEND.
+
+MEMO_X_GETS_NO_MEMOS
+ %s nie mo¿e odbieraæ wiadomo¶ci.
+
+MEMO_X_HAS_TOO_MANY_MEMOS
+ %s ma zbyt du¿o wiadomo¶ci i nie mo¿e otrzymywaæ nowych.
+
+MEMO_SENT
+ Wiadomo¶æ zosta³a wys³ana do %s.
+
+MEMO_MASS_SENT
+ Wiadomo¶æ zosta³a wys³ana do wszystkich zarejestrowanych u¿ytkowników.
+
+
+# CANCEL responses
+MEMO_CANCEL_SYNTAX
+ CANCEL {nick | kana³}
+
+MEMO_CANCEL_DISABLED
+ Odwo³ywanie wiadomo¶ci jest tymczasowo wy³±czone.
+
+MEMO_CANCEL_NONE
+ Brak wiadomo¶ci do odwo³ania.
+
+MEMO_CANCELLED
+ Ostatnia wiadomo¶æ do %s zosta³a odwo³ana.
+
+# LIST responses
+MEMO_LIST_SYNTAX
+ LIST [kana³] [lista | NEW]
+
+MEMO_HAVE_NO_NEW_MEMOS
+ Nie masz nowych wiadomo¶ci.
+
+MEMO_X_HAS_NO_NEW_MEMOS
+ %s nie ma nowych wiadomo¶ci.
+
+MEMO_LIST_MEMOS
+ Wiadomo¶ci dla %s. Aby przeczytaæ, napisz: %R%s READ numer
+
+MEMO_LIST_NEW_MEMOS
+ Nowe wiadomo¶ci dla %s. Aby przeczytaæ,
+ napisz: %R%s READ numer
+
+MEMO_LIST_CHAN_MEMOS
+ Wiadomo¶ci dla %s. Aby przeczytaæ, napisz: %R%s READ %s numer
+
+MEMO_LIST_CHAN_NEW_MEMOS
+ Nowe wiadomo¶ci dla %s. Aby przeczytaæ,
+ napisz: %R%s READ %s numer
+
+MEMO_LIST_HEADER
+ Nr Nadawca Data/Czas
+
+MEMO_LIST_FORMAT
+ %c%3d %-16s %s
+
+# READ responses
+MEMO_READ_SYNTAX
+ READ [kana³] {lista | LAST | NEW}
+
+MEMO_HEADER
+ Wiadomo¶æ %d od %s (%s). Aby usun±æ, napisz: %R%s DEL %d
+
+MEMO_CHAN_HEADER
+ Wiadomo¶æ %d od %s (%s). Aby usun±æ, napisz: %R%s DEL %s %d
+
+MEMO_TEXT
+ %s
+
+# DEL responses
+MEMO_DEL_SYNTAX
+ DEL [kana³] {numer | list | ALL}
+
+MEMO_DELETED_NONE
+ Nie usuniêto ¿adnych wiadomo¶ci.
+
+MEMO_DELETED_ONE
+ Wiadomo¶æ %d zosta³a usuniêta.
+
+MEMO_DELETED_SEVERAL
+ Wiadomo¶ci %s zosta³y usuniête.
+
+MEMO_DELETED_ALL
+ Wszystkie Twoje wiadomo¶ci zosta³y usuniête.
+
+MEMO_CHAN_DELETED_ALL
+ Wszystkie wiadomo¶ci kana³u %s zosta³y usuniête.
+
+# SET responses
+MEMO_SET_SYNTAX
+ SET opcja parametry
+
+MEMO_SET_DISABLED
+ Ustawianie opcji wiadomo¶ci jest tymczasowo wy³±czone.
+
+MEMO_SET_UNKNOWN_OPTION
+ Nieznana opcja komendy SET %s.
+
+# SET NOTIFY responses
+MEMO_SET_NOTIFY_SYNTAX
+ SET NOTIFY {ON | LOGON | NEW | MAIL | OFF }
+
+MEMO_SET_NOTIFY_ON
+ %s powiadomi Ciê o wiadomo¶ciach podczas logowania i w momencie ich nadej¶cia.
+
+MEMO_SET_NOTIFY_LOGON
+ %s powiadomi Ciê o wiadomo¶ciach podczas logowania oraz po wy³±czeniu /away.
+
+MEMO_SET_NOTIFY_NEW
+ %s bêdzie powiadamia³ Ciê o nowych wiadomo¶ciach w momencie ich nadej¶cia.
+
+MEMO_SET_NOTIFY_OFF
+ %s nie bêdzie powiadamia³ Ciê o nowych wiadomo¶ciach.
+
+MEMO_SET_NOTIFY_MAIL
+ Powiadomienie o nowych wiadomo¶ciach bêd± wysy³ane na adres e-mail.
+
+MEMO_SET_NOTIFY_NOMAIL
+ Powiadomienie o nowych wiadomo¶ciach nie bêd± wysy³ane na adres e-mail.
+
+MEMO_SET_NOTIFY_INVALIDMAIL
+ Twój nick nie ma ustawionego adresu e-mail.
+
+# SET LIMIT responses
+MEMO_SET_LIMIT_SYNTAX
+ SET LIMIT [kana³] limit
+
+MEMO_SET_LIMIT_SERVADMIN_SYNTAX
+ SET LIMIT [nick | kana³] {limit | NONE} [HARD]
+
+MEMO_SET_YOUR_LIMIT_FORBIDDEN
+ Nie mo¿esz zmieniaæ swojego limitu wiadomo¶ci.
+
+MEMO_SET_LIMIT_FORBIDDEN
+ Limit wiadomo¶ci dla %s nie mo¿e byæ zmieniany.
+
+MEMO_SET_YOUR_LIMIT_TOO_HIGH
+ Nie mo¿esz ustawiæ swojego limitu wiadomo¶ci wiêkszego ni¿ %d.
+
+MEMO_SET_LIMIT_TOO_HIGH
+ Nie mo¿esz ustawiæ limitu wiadomo¶ci dla %s wiêkszego ni¿ %d.
+
+MEMO_SET_LIMIT_OVERFLOW
+ Limit wiadomo¶ci jest za du¿y. Limituj do %d.
+
+MEMO_SET_YOUR_LIMIT
+ Twój limit wiadomo¶ci zosta³ zmieniony na %d.
+
+MEMO_SET_YOUR_LIMIT_ZERO
+ Nie bêdziesz ju¿ d³u¿ej odbieraæ wiadomo¶ci.
+
+MEMO_UNSET_YOUR_LIMIT
+ Twój limit wiadomo¶ci zosta³ wy³±czony.
+
+MEMO_SET_LIMIT
+ Limit wiadomo¶ci dla %s zmieniono na %d.
+
+MEMO_SET_LIMIT_ZERO
+ Limit wiadomo¶ci dla %s ustawiono na 0.
+
+MEMO_UNSET_LIMIT
+ Limit wiadomo¶ci dla %s jest wy³±czony.
+
+# INFO responses
+MEMO_INFO_SYNTAX
+ INFO [kana³]
+
+MEMO_INFO_SERVADMIN_SYNTAX
+ INFO [nick | kana³]
+
+MEMO_INFO_NO_MEMOS
+ Aktualnie nie masz wiadomo¶ci.
+
+MEMO_INFO_MEMO
+ Aktualnie masz jedn± wiadomo¶æ.
+
+MEMO_INFO_MEMO_UNREAD
+ Aktualnie masz jedn± wiadomo¶æ i jest ona nieprzeczytana.
+
+MEMO_INFO_MEMOS
+ Aktualnie masz %d wiadomo¶ci.
+
+MEMO_INFO_MEMOS_ONE_UNREAD
+ Aktualnie masz %d wiadomo¶ci, w tym jedn± nieprzeczytan±.
+
+MEMO_INFO_MEMOS_SOME_UNREAD
+ Aktualnie masz %d wiadomo¶ci, z czego %d jest nieprzeczytanych.
+
+MEMO_INFO_MEMOS_ALL_UNREAD
+ Aktualnie masz %d nieprzeczytanych wiadomo¶ci.
+
+MEMO_INFO_LIMIT
+ Twój limit wiadomo¶ci wynosi %d.
+
+MEMO_INFO_HARD_LIMIT
+ Twój limit wiadomo¶ci wynosi %d i nie mo¿e byæ zmieniony.
+
+MEMO_INFO_LIMIT_ZERO
+ Twój limit wiadomo¶ci wynosi 0, nie bêdziesz otrzymywaæ nowych.
+
+MEMO_INFO_HARD_LIMIT_ZERO
+ Twój limit wiadomo¶ci wynosi 0, nie bêdziesz odbieraæ nowych i nie mo¿esz zmieniæ tego limitu.
+MEMO_INFO_NO_LIMIT
+ Nie masz limitu wiadomo¶ci, które mo¿esz trzymaæ.
+
+MEMO_INFO_NOTIFY_OFF
+ Nie bêdziesz otrzymywaæ informacji o nowych wiadomo¶ciach.
+
+MEMO_INFO_NOTIFY_ON
+ Bêdziesz powiadomienie informacje o nowych wiadomo¶ciach
+ podczas logowania i w momencie ich nadej¶cia.
+
+MEMO_INFO_NOTIFY_RECEIVE
+ Bêdziesz otrzymywaæ powiadomienie o nowych wiadomo¶ciach.
+
+MEMO_INFO_NOTIFY_SIGNON
+ Bêdziesz otrzymywaæ powiadomienie o nowych wiadomo¶ciach podczas logowania.
+
+MEMO_INFO_X_NO_MEMOS
+ %s aktualnie nie ma wiadomo¶ci.
+
+MEMO_INFO_X_MEMO
+ %s aktualnie ma jedn± wiadomo¶æ.
+
+MEMO_INFO_X_MEMO_UNREAD
+ %s ma aktualnie jedn± wiadomo¶æ, która jest nieprzeczytana.
+
+MEMO_INFO_X_MEMOS
+ %s ma aktualnie %d wiadomo¶ci.
+
+MEMO_INFO_X_MEMOS_ONE_UNREAD
+ %s ma aktualnie %d wiadomo¶ci, w tym jedn± nieprzeczytan±.
+
+MEMO_INFO_X_MEMOS_SOME_UNREAD
+ %s ma aktualnie %d wiadomo¶ci, z czego %d jest nieprzeczytanych.
+
+MEMO_INFO_X_MEMOS_ALL_UNREAD
+ %s ma aktualnie %d nieprzeczytanych wiadomo¶ci.
+
+MEMO_INFO_X_LIMIT
+ %s ma limit wiadomo¶ci %d.
+
+MEMO_INFO_X_HARD_LIMIT
+ %s ma limit wiadomo¶ci %d i nie mo¿e byæ zmieniony.
+
+MEMO_INFO_X_NO_LIMIT
+ %s nie ma limitu wiadomo¶ci.
+
+MEMO_INFO_X_NOTIFY_OFF
+ %s nie otrzymuje powiadomieñ o nowych wiadomo¶ciach.
+
+MEMO_INFO_X_NOTIFY_ON
+ %s otrzymuje powiadomienia o nowych wiadomo¶ciach
+ podczas logowania i w momencie ich nadej¶cia.
+
+MEMO_INFO_X_NOTIFY_RECEIVE
+ %s otrzymuje powiadomienia o nowych wiadomo¶ciach w momencie ich nadej¶cia.
+
+MEMO_INFO_X_NOTIFY_SIGNON
+ %s otrzymuje powiadomienia o nowych wiadomo¶ciach podczas logowania.
+
+# Memo2Mail responses
+MEMO_MAIL_SUBJECT
+ Nowa wiadomo¶æ
+
+MEMO_MAIL_TEXT1
+ Witaj %s!
+
+MEMO_MAIL_TEXT2
+ W³a¶nie nadesz³a now± wiadomo¶æ od %s, ma numer %d.
+
+MEMO_MAIL_TEXT3
+ Tre¶æ wiadomo¶ci:
+
+# RSEND responses
+MEMO_RSEND_PLEASE_WAIT
+ Odczekaj %d sekund przed ponownym u¿yciem komendy RSEND.
+
+MEMO_RSEND_DISABLED
+ Komenda RSEND nie jest dostêpna w tej sieci.
+
+MEMO_RSEND_SYNTAX
+ RSEND {nick | kana³} tre¶æ
+
+MEMO_RSEND_NICK_MEMO_TEXT
+ [auto-memo] Wys³ana przez Ciebie wiadomo¶æ zosta³a przeczytana.
+
+MEMO_RSEND_CHAN_MEMO_TEXT
+ [auto-memo] Wys³ana przez Ciebie wiadomo¶æ do %s zosta³a przeczytana.
+
+MEMO_RSEND_USER_NOTIFICATION
+ Powiadomienie o przeczytaniu wiadomo¶ci zosta³o wys³ane do %s.
+
+# CHECK responses
+MEMO_CHECK_SYNTAX
+ CHECK nick
+
+MEMO_CHECK_NOT_READ
+ Ostatnia wys³ana przez Ciebie wiadomo¶æ
+ do %s (w %s) jest wci±¿ nieprzeczytana.
+
+MEMO_CHECK_READ
+ Ostatnia wiadomo¶æ wys³ana do %s (w %s) zosta³a przeczytana.
+
+MEMO_CHECK_NO_MEMO
+ %s nie posiada wiadomo¶ci od Ciebie.
+
+MEMO_NO_RSEND_SELF
+ Nie mo¿esz wysy³aæ wiadomo¶ci z potwierdzeniem odbioru do siebie!
+
+###########################################################################
+#
+# BotServ messages
+#
+###########################################################################
+# Standard responses
+BOT_DOES_NOT_EXIST
+ Bot %s nie istnieje.
+
+BOT_NOT_ASSIGNED
+ Musisz najpierw przydzieliæ bota do kana³u.
+ Napisz %R%S HELP ASSIGN, aby uzyskaæ wiêcej informacji.
+
+BOT_NOT_ON_CHANNEL
+ Nie ma bota na kanale %s.
+
+# Kick reasons (must be a single line)
+BOT_REASON_BADWORD
+ Nie u¿ywaj s³owa \"%s\" na tym kanale!
+
+BOT_REASON_BADWORD_GENTLE
+ Uwa¿aj co piszesz!
+
+BOT_REASON_BOLD
+ Nie pogrubiaj tekstu na tym kanale!
+
+BOT_REASON_CAPS
+ Wy³±cz CAPS LOCKa!
+
+BOT_REASON_COLOR
+ Nie u¿ywaj kolorów na tym kanale!
+
+BOT_REASON_FLOOD
+ Przestañ floodowaæ!
+
+BOT_REASON_REPEAT
+ Nie powtarzaj siê!
+
+BOT_REASON_REVERSE
+ Nie u¿ywaj odwracania kolorów!
+
+BOT_REASON_UNDERLINE
+ Nie u¿ywaj podkre¶leñ na tym kanale!
+
+# !seen replies
+BOT_SEEN_BOT
+ Tak! Jestem tutaj %s!
+
+BOT_SEEN_YOU
+ %s? Szukasz siebie?
+
+BOT_SEEN_ON_CHANNEL
+ %s jest teraz na kanale!
+
+BOT_SEEN_ON_CHANNEL_AS
+ %s jest teraz na kanale (jako %s)!
+
+BOT_SEEN_ON
+ Widzia³em %s tutaj %s temu.
+
+BOT_SEEN_NEVER
+ Nigdy nie widzia³em %s na tym kanale.
+
+BOT_SEEN_UNKNOWN
+ Nie wiem kim jest %s.
+
+# BOT responses
+BOT_BOT_SYNTAX
+ BOT ADD nick user host real
+ BOT CHANGE stary-nick nowy-nick [user [host [real]]]
+ BOT DEL nick
+
+BOT_BOT_ALREADY_EXISTS
+ Bot %s ju¿ istnieje.
+
+BOT_BOT_CREATION_FAILED
+ B³±d, nie uda³o siê utworzyæ bota.
+
+BOT_BOT_READONLY
+ Modyfikacja botów jest tymczasowo wy³±czona.
+
+BOT_BOT_ADDED
+ %s!%s@%s (%s) dodano do listy botów.
+
+BOT_BOT_ANY_CHANGES
+ Nic siê nie zmieni³o.
+BOT_BOT_CHANGED
+ Bot %s zosta³ zmieniony na %s!%s@%s (%s)
+
+BOT_BOT_DELETED
+ Bot %s zosta³ usuniêty.
+
+# BOTLIST responses
+BOT_BOTLIST_HEADER
+ Lista botów:
+
+BOT_BOTLIST_PRIVATE_HEADER
+ Boty zarezerwowane dla IRC operatorów:
+
+BOT_BOTLIST_FOOTER
+ %d boty(ów) dostêpnych.
+
+BOT_BOTLIST_EMPTY
+ Obecnie nie ma ¿adnych botów dostêpnych.
+ Popro¶ administratora serwisów o dodanie.
+
+# ASSIGN responses
+BOT_ASSIGN_SYNTAX
+ ASSIGN kana³ nick
+
+BOT_ASSIGN_READONLY
+ Przydzielanie botów jest tymczasowo wy³±czone.
+
+BOT_ASSIGN_ALREADY
+ Bot %s jest ju¿ postawiony na %s.
+
+BOT_ASSIGN_ASSIGNED
+ Bot %s zosta³ przypisany do %s.
+
+# UNASSIGN responses
+BOT_UNASSIGN_SYNTAX
+ UNASSIGN kana³
+
+BOT_UNASSIGN_UNASSIGNED
+ Nie ma ¿adnych botów przydzielonych do %s.
+
+# INFO responses
+BOT_INFO_SYNTAX
+ INFO {kana³ | nick}
+
+BOT_INFO_NOT_FOUND
+ %s nie jest prawid³ow± nazw± bota lub kana³u.
+
+BOT_INFO_BOT_HEADER
+ Informacje o bocie %s:
+
+BOT_INFO_BOT_MASK
+ Maska: %s@%s
+
+BOT_INFO_BOT_REALNAME
+ Nazwa: %s
+
+BOT_INFO_BOT_CREATED
+ Utworzony: %s
+
+BOT_INFO_BOT_USAGE
+ Obecny na: %d kana³ach
+BOT_INFO_BOT_OPTIONS
+ Opcje: %s
+
+BOT_INFO_OPT_PRIVATE
+ PRIVATE
+
+BOT_INFO_CHAN_HEADER
+ Informacje o kanale %s:
+
+BOT_INFO_CHAN_BOT
+ Przydzielony bot: %s
+
+BOT_INFO_CHAN_BOT_NONE
+ Przydzielony bot: (brak)
+
+BOT_INFO_CHAN_KICK_BADWORDS
+ Kopanie za s³owa: %s
+
+BOT_INFO_CHAN_KICK_BADWORDS_BAN
+ Kopanie za s³owa: %s (%d kop(y) do bana)
+
+BOT_INFO_CHAN_KICK_BOLDS
+ Kopanie za pogrubienia: %s
+
+BOT_INFO_CHAN_KICK_BOLDS_BAN
+ Kopanie za pogrubienia: %s (%d kop(y) do bana)
+
+BOT_INFO_CHAN_KICK_CAPS_ON
+ Kopanie za capsa: %s (minimum %d/%d%%)
+
+BOT_INFO_CHAN_KICK_CAPS_BAN
+ Kopanie za capsa: %s (%d kop(y) do bana; minimum %d/%d%%)
+
+BOT_INFO_CHAN_KICK_CAPS_OFF
+ Kopanie za capsa: %s
+
+BOT_INFO_CHAN_KICK_COLORS
+ Kopanie za kolory: %s
+
+BOT_INFO_CHAN_KICK_COLORS_BAN
+ Kopanie za kolory: %s (%d kop(y) do bana)
+
+BOT_INFO_CHAN_KICK_FLOOD_ON
+ Kopanie za flood: %s (%d linii w %ds)
+
+BOT_INFO_CHAN_KICK_FLOOD_BAN
+ Kopanie za flood: %s (%d kop(y) do bana; %d linii w %ds)
+
+BOT_INFO_CHAN_KICK_FLOOD_OFF
+ Kopanie za flood: %s
+
+BOT_INFO_CHAN_KICK_REPEAT_ON
+ Kopanie za powtarzanie: %s (%d czasu)
+
+BOT_INFO_CHAN_KICK_REPEAT_BAN
+ Kopanie za powtarzanie: %s (%d kop(y) do bana; %d czasu)
+
+BOT_INFO_CHAN_KICK_REPEAT_OFF
+ Kopanie za powtarzanie: %s
+
+BOT_INFO_CHAN_KICK_REVERSES
+ Kopanie za odw kolorów: %s
+
+BOT_INFO_CHAN_KICK_REVERSES_BAN
+ Kopanie za odw kolorów: %s (%d kop(y) do bana)
+
+BOT_INFO_CHAN_KICK_UNDERLINES
+ Kopanie za podkre¶lenia: %s
+
+BOT_INFO_CHAN_KICK_UNDERLINES_BAN
+ Kopanie za podkre¶lenia: %s (%d kop(y) do bana)
+
+BOT_INFO_ACTIVE
+ w³±czone
+
+BOT_INFO_INACTIVE
+ wy³±czone
+
+BOT_INFO_CHAN_OPTIONS
+ Inne opcje: %s
+
+BOT_INFO_OPT_DONTKICKOPS
+ DONTKICKOPS
+
+BOT_INFO_OPT_DONTKICKVOICES
+ DONTKICKVOICES
+
+BOT_INFO_OPT_FANTASY
+ FANTASY
+
+BOT_INFO_OPT_GREET
+ GREET
+
+BOT_INFO_OPT_NOBOT
+ NOBOT
+
+BOT_INFO_OPT_SYMBIOSIS
+ SYMBIOSIS
+
+BOT_INFO_OPT_NONE
+ Brak
+
+# SET responses
+BOT_SET_SYNTAX
+ SET (kana³ | bot) opcja ustawienie
+
+BOT_SET_DISABLED
+ Konfigurowanie bota jest tymczasowo wy³±czone.
+
+BOT_SET_UNKNOWN
+ Nieznana opcja %s.
+ Napisz %R%S HELP SET, aby uzyskaæ wiêcej informacji.
+
+# SET DONTKICKOPS messages
+BOT_SET_DONTKICKOPS_SYNTAX
+ SET kana³ DONTKICKOPS {ON|OFF}
+
+BOT_SET_DONTKICKOPS_ON
+ Bot nie bêdzie kopa³ operatorów na kanale %s.
+
+BOT_SET_DONTKICKOPS_OFF
+ Bot bêdzie teraz kopa³ operatorów na kanale %s.
+
+# SET DONTKICKVOICES messages
+BOT_SET_DONTKICKVOICES_SYNTAX
+ SET kana³ DONTKICKVOICES {ON|OFF}
+
+BOT_SET_DONTKICKVOICES_ON
+ Bot nie bêdzie kopa³ voiców na kanale %s.
+
+BOT_SET_DONTKICKVOICES_OFF
+ Bot bêdzie kopa³ voiców na kanale %s.
+
+# SET FANTASY messages
+BOT_SET_FANTASY_SYNTAX
+ SET kana³ FANTASY {ON|OFF}
+
+BOT_SET_FANTASY_ON
+ Komendy fantasy na kanale %s zosta³y w³±czone.
+
+BOT_SET_FANTASY_OFF
+ Komendy fantasy na kanale %s zosta³y wy³±czone.
+
+# SET GREET messages
+BOT_SET_GREET_SYNTAX
+ SET kana³ GREET {ON|OFF}
+
+BOT_SET_GREET_ON
+ Witanie u¿ytkowników na kanale %s zosta³o w³±czone.
+
+BOT_SET_GREET_OFF
+ Witanie u¿ytkowników na kanale %s zosta³o wy³±czone.
+
+# SET NOBOT
+BOT_SET_NOBOT_SYNTAX
+ SET nick-bota NOBOT {ON|OFF}
+
+BOT_SET_NOBOT_ON
+ Opcja NOBOT zosta³a w³±czona na kanale %s.
+
+BOT_SET_NOBOT_OFF
+ Opcja NOBOT zosta³a wy³±czona na kanale %s.
+
+# SET PRIVATE
+BOT_SET_PRIVATE_SYNTAX
+ SET nick-bota PRIVATE {ON|OFF}
+
+BOT_SET_PRIVATE_ON
+ Opcja PRIVATE bota %s zosta³a w³±czona.
+
+BOT_SET_PRIVATE_OFF
+ Opcja PRIVATE bota %s zosta³a wy³±czona.
+
+# SET SYMBIOSIS
+BOT_SET_SYMBIOSIS_SYNTAX
+ SET kana³ SYMBIOSIS {ON|OFF}
+
+BOT_SET_SYMBIOSIS_ON
+ Opcja SYMBIOSIS zosta³a w³±czona na kanale %s.
+
+BOT_SET_SYMBIOSIS_OFF
+ Opcja SYMBIOSIS zosta³a wy³±czona na kanale %s.
+
+# KICK responses
+BOT_KICK_SYNTAX
+ KICK kana³ opcja {ON|OFF} [ustawienia]
+
+BOT_KICK_DISABLED
+ Konfigurowanie kopów jest tymczasowo wy³±czone.
+
+BOT_KICK_UNKNOWN
+ Nieznana opcja %s.
+ Napisz %R%S HELP KICK, aby uzyskaæ wiêcej informacji.
+
+BOT_KICK_BAD_TTB
+ %s nie mo¿e byæ wziêty jako ilo¶æ wykroczeñ do za³o¿enia bana.
+
+BOT_KICK_BADWORDS_ON
+ Bot bêdzie kopa³ za zakazane s³owa.
+ U¿yj komendy BADWORDS, aby modyfikowaæ listê s³ów.
+
+BOT_KICK_BADWORDS_ON_BAN
+ Bot bêdzie kopa³ za zakazane s³owa,
+ po %d kopach dla tego samego u¿ytkownika za³o¿y bana.
+ U¿yj komendy BADWORDS, aby modyfikowaæ listê.
+
+BOT_KICK_BADWORDS_OFF
+ Bot nie bêdzie kopa³ za zakazane s³owa.
+
+BOT_KICK_BOLDS_ON
+ Bot bêdzie kopa³ za pogrubienia.
+
+BOT_KICK_BOLDS_ON_BAN
+ Bot bêdzie kopa³ za pogrubienia,
+ po %d kopach dla tego samego u¿ytkownika za³o¿y bana.
+
+BOT_KICK_BOLDS_OFF
+ Bot nie bêdzie kopa³ za pogrubienia.
+
+BOT_KICK_CAPS_ON
+ Bot bêdzie kopa³ za CAPSa (du¿e litery
+ musz± stanowiæ %d znaków %d%% ca³ej wiadomo¶ci).
+
+BOT_KICK_CAPS_ON_BAN
+ Bot bêdzie kopa³ za CAPSa (du¿e litery
+ musz± stanowiæ %d znaków %d%% ca³ej wiadomo¶ci).
+ po %d kopach dla tego samego u¿ytkownika za³o¿y bana.
+
+BOT_KICK_CAPS_OFF
+ Bot nie bêdzie kopa³ za CAPSa.
+
+BOT_KICK_COLORS_ON
+ Bot bêdzie kopa³ za kolory.
+
+BOT_KICK_COLORS_ON_BAN
+ Bot bêdzie kopa³ za kolory,
+ po %d kopach dla tego samego u¿ytkownika za³o¿y bana.
+
+BOT_KICK_COLORS_OFF
+ Bot nie bêdzie kopa³ za kolory.
+
+BOT_KICK_FLOOD_ON
+ Bot bêdzie kopa³ za flood
+ (%d linii w %d sekund).
+
+BOT_KICK_FLOOD_ON_BAN
+ Bot bêdzie kopa³ za flood (%d linii w %d sekund),
+ po %d kopach dla tego samego u¿ytkownika za³o¿y bana.
+
+BOT_KICK_FLOOD_OFF
+ Bot nie bêdzie kopa³ za flood.
+
+BOT_KICK_REPEAT_ON
+ Bot bêdzie kopa³ za powtórzenia
+ (u¿ytkowników, którzy napisz± %d razy to samo).
+
+BOT_KICK_REPEAT_ON_BAN
+ Bot bêdzie kopa³ za powtórzenia
+ (u¿ytkowników, którzy napisz± %d razy to samo),
+ po %d kopach dla tego samego u¿ytkownika za³o¿y bana.
+
+BOT_KICK_REPEAT_OFF
+ Bot nie bêdzie kopa³ za powtórzenia.
+
+BOT_KICK_REVERSES_ON
+ Bot bêdzie kopa³ za odwracanie kolorów.
+
+BOT_KICK_REVERSES_ON_BAN
+ Bot bêdzie kopa³ za odwracanie kolorów,
+ po %d kopach dla tego samego u¿ytkownika za³o¿y bana.
+
+BOT_KICK_REVERSES_OFF
+ Bot nie bêdzie kopa³ za odwracanie kolorów.
+
+BOT_KICK_UNDERLINES_ON
+ Bot bêdzie kopa³ za podkre¶lenia.
+
+BOT_KICK_UNDERLINES_ON_BAN
+ Bot bêdzie kopa³ za podkre¶lenia,
+ po %d kopach dla tego samego u¿ytkownika za³o¿y bana.
+
+BOT_KICK_UNDERLINES_OFF
+ Bot nie bêdzie kopa³ za podkre¶lenia.
+
+# BADWORDS messages
+BOT_BADWORDS_SYNTAX
+ BADWORDS kana³ {ADD|DEL|LIST|CLEAR} [s³owo | pozycja] [SINGLE|START|END]
+
+BOT_BADWORDS_DISABLED
+ Modyfikacja listy zakazanych s³ów jest tymczasowo wy³±czona.
+
+BOT_BADWORDS_REACHED_LIMIT
+ B³±d, mo¿esz mieæ tylko %d wpisów na li¶cie zakazanych s³ów.
+
+BOT_BADWORDS_ALREADY_EXISTS
+ %s ju¿ istnieje na li¶cie zakazanych s³ów kana³u %s.
+
+BOT_BADWORDS_ADDED
+ %s dodano do listy zakazanych s³ów kana³u %s.
+
+BOT_BADWORDS_NO_SUCH_ENTRY
+ Brak wpisów (#%d) na li¶cie zakazanych s³ów kana³u %s.
+
+BOT_BADWORDS_NOT_FOUND
+ %s nie znaleziono na li¶cie zakazanych s³ów kana³u %s.
+
+BOT_BADWORDS_NO_MATCH
+ Nie znaleziono pasuj±cych wpisów na li¶cie zakazanych s³ów kana³u %s.
+
+BOT_BADWORDS_DELETED
+ %s usuniêto z listy zakazanych s³ów kana³u %s.
+
+BOT_BADWORDS_DELETED_ONE
+ Usuniêto 1 wpis z listy zakazanych s³ów kana³u %s.
+
+BOT_BADWORDS_DELETED_SEVERAL
+ Usuniêto %d wpisów z listy zakazanych s³ów
+ kana³u %s.
+
+BOT_BADWORDS_LIST_EMPTY
+ Lista zakazanych s³ów dla kana³u %s jest pusta.
+
+BOT_BADWORDS_LIST_HEADER
+ Lista zakazanych s³ów dla %s:
+ Nr S³owo Typ
+
+BOT_BADWORDS_LIST_FORMAT
+ %3d %-30s %s
+
+BOT_BADWORDS_CLEAR
+ Lista zakazanych s³ów zosta³a wyczyszczona.
+
+# SAY responses
+BOT_SAY_SYNTAX
+ SAY kana³ tekst
+
+# ACT responses
+BOT_ACT_SYNTAX
+ ACT kana³ tekst
+
+# Errors
+BOT_EXCEPT
+ U¿ytkownik posiada wyj±tek na kanale.
+
+BOT_BAD_NICK
+ Nick bota mo¿e zawieraæ tylko prawid³owe znaki.
+
+BOT_BAD_HOST
+ Host bota mo¿e zawieraæ tylko prawid³owe znaki.
+
+BOT_BAD_IDENT
+ Ident bota mo¿e zawieraæ tylko prawid³owe znaki.
+
+BOT_LONG_IDENT
+ Ident bota mo¿e siê sk³adaæ maksymalnie z %d znaków.
+
+BOT_LONG_HOST
+ Host bota mo¿e siê sk³adaæ maksymalnie z %d znaków.
+
+###########################################################################
+#
+# OperServ messages
+#
+###########################################################################
+# General messages
+OPER_BOUNCY_MODES
+ Serwisy nie mog± zmieniaæ trybów. Czy serwery s± dobrze skonfigurowane?
+
+OPER_BOUNCY_MODES_U_LINE
+ Serwisy nie mog± zmieniaæ trybów. Czy U-linie serwerów s± dobrze skonfigurowane?
+
+# GLOBAL responses
+OPER_GLOBAL_SYNTAX
+ GLOBAL tre¶æ wiadomo¶ci
+
+# STATS responses
+OPER_STATS_UNKNOWN_OPTION
+ Nieznana opcja STATS %s.
+
+OPER_STATS_CURRENT_USERS
+ U¿ytkowników : %d (%d operatorów)
+
+OPER_STATS_MAX_USERS
+ Rekord u¿ytk. : %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
+ Serwisy dzia³aj± %d dni, %02d:%02d
+
+OPER_STATS_UPTIME_1DHMS
+ Serwisy dzia³aj± %d dzieñ, %02d:%02d
+
+OPER_STATS_UPTIME_HMS
+ Serwisy dzia³aj± %d godzin i %d minut(y).
+
+OPER_STATS_UPTIME_HM1S
+ Serwisy dzia³aj± %d godzin(y) i %d minut(y).
+
+OPER_STATS_UPTIME_H1MS
+ Serwisy dzia³aj± %d godzin(y) i %d minutê.
+
+OPER_STATS_UPTIME_H1M1S
+ Serwisy dzia³aj± %d godzin(y) i %d minutê.
+
+OPER_STATS_UPTIME_1HMS
+ Serwisy dzia³aj± %d godzinê i %d minut(y).
+
+OPER_STATS_UPTIME_1HM1S
+ Serwisy dzia³aj± %d godzinê i %d minut(y).
+
+OPER_STATS_UPTIME_1H1MS
+ Serwisy dzia³aj± %d godzinê i %d minutê.
+
+OPER_STATS_UPTIME_1H1M1S
+ Serwisy dzia³aj± %d godzinê i %d minutê.
+
+OPER_STATS_UPTIME_MS
+ Serwisy dzia³aj± %d minut(y) i %d sekund(y).
+
+OPER_STATS_UPTIME_M1S
+ Serwisy dzia³aj± %d minut(y) i %d sekundê.
+
+OPER_STATS_UPTIME_1MS
+ Serwisy dzia³aj± %d minutê i %d sekund(y).
+
+OPER_STATS_UPTIME_1M1S
+ Serwisy dzia³aj± %d minutê i %d sekundê.
+
+OPER_STATS_BYTES_READ
+ Odebrano : %5d kB
+
+OPER_STATS_BYTES_WRITTEN
+ Wys³ano : %5d kB
+
+OPER_STATS_USER_MEM
+ U¿ytkownicy : %6d rekordów, %5d kB
+
+OPER_STATS_CHANNEL_MEM
+ Kana³ : %6d rekordów, %5d kB
+
+OPER_STATS_GROUPS_MEM
+ Grupy NS : %6d rekordów, %5d kB
+
+OPER_STATS_ALIASES_MEM
+ Aliasy NS : %6d rekordów, %5d kB
+
+OPER_STATS_CHANSERV_MEM
+ ChanServ : %6d rekordów, %5d kB
+
+OPER_STATS_BOTSERV_MEM
+ BotServ : %6d rekordów, %5d kB
+
+OPER_STATS_HOSTSERV_MEM
+ HostServ : %6d rekordów, %5d kB
+
+OPER_STATS_OPERSERV_MEM
+ OperServ : %6d rekordów, %5d kB
+
+OPER_STATS_SESSIONS_MEM
+ Sesji : %6d rekordów, %5d kB
+
+OPER_STATS_AKILL_COUNT
+ Aktualna ilo¶æ wpisów AKILL: %d
+
+OPER_STATS_AKILL_EXPIRE_DAYS
+ Domy¶lny czas wygasania AKILL: %d dni
+
+OPER_STATS_AKILL_EXPIRE_DAY
+ Domy¶lny czas wygasania AKILL: 1 dzieñ
+
+OPER_STATS_AKILL_EXPIRE_HOURS
+ Domy¶lny czas wygasania AKILL: %d godzin(y)
+
+OPER_STATS_AKILL_EXPIRE_HOUR
+ Domy¶lny czas wygasania AKILL: 1 godzina
+
+OPER_STATS_AKILL_EXPIRE_MINS
+ Domy¶lny czas wygasania AKILL: %d minut(y)
+
+OPER_STATS_AKILL_EXPIRE_MIN
+ Domy¶lny czas wygasania AKILL: 1 minuta
+
+OPER_STATS_AKILL_EXPIRE_NONE
+ Domy¶lny czas wygasania AKILL: nie wygasa
+
+OPER_STATS_SGLINE_COUNT
+ Aktualna ilo¶æ wpisów SGLINE: %d
+
+OPER_STATS_SGLINE_EXPIRE_DAYS
+ Domy¶lny czas wygasania SGLINE: %d dni
+
+OPER_STATS_SGLINE_EXPIRE_DAY
+ Domy¶lny czas wygasania SGLINE: 1 dzieñ
+
+OPER_STATS_SGLINE_EXPIRE_HOURS
+ Domy¶lny czas wygasania SGLINE: %d godzin(y)
+
+OPER_STATS_SGLINE_EXPIRE_HOUR
+ Domy¶lny czas wygasania SGLINE: 1 godzina
+
+OPER_STATS_SGLINE_EXPIRE_MINS
+ Domy¶lny czas wygasania SGLINE: %d minut(y)
+
+OPER_STATS_SGLINE_EXPIRE_MIN
+ Domy¶lny czas wygasania SGLINE: 1 minuta
+
+OPER_STATS_SGLINE_EXPIRE_NONE
+ Domy¶lny czas wygasania SGLINE: nie wygasa
+
+OPER_STATS_SQLINE_COUNT
+ Aktualna ilo¶æ wpisów SQLINE: %d
+
+OPER_STATS_SQLINE_EXPIRE_DAYS
+ Domy¶lny czas wygasania SQLINE: %d dni
+
+OPER_STATS_SQLINE_EXPIRE_DAY
+ Domy¶lny czas wygasania SQLINE: 1 dzieñ
+
+OPER_STATS_SQLINE_EXPIRE_HOURS
+ Domy¶lny czas wygasania SQLINE: %d godzin(y)
+
+OPER_STATS_SQLINE_EXPIRE_HOUR
+ Domy¶lny czas wygasania SQLINE: 1 godzina
+
+OPER_STATS_SQLINE_EXPIRE_MINS
+ Domy¶lny czas wygasania SQLINE: %d minut(y)
+
+OPER_STATS_SQLINE_EXPIRE_MIN
+ Domy¶lny czas wygasania SQLINE: 1 minuta
+
+OPER_STATS_SQLINE_EXPIRE_NONE
+ Domy¶lny czas wygasania SQLINE: nie wygasa
+
+OPER_STATS_SZLINE_COUNT
+ Aktualna ilo¶æ wpisów SZLINE: %d
+
+OPER_STATS_SZLINE_EXPIRE_DAYS
+ Domy¶lny czas wygasania SZLINE: %d dni
+
+OPER_STATS_SZLINE_EXPIRE_DAY
+ Domy¶lny czas wygasania SZLINE: 1 dzieñ
+
+OPER_STATS_SZLINE_EXPIRE_HOURS
+ Domy¶lny czas wygasania SZLINE: %d godzin(y)
+
+OPER_STATS_SZLINE_EXPIRE_HOUR
+ Domy¶lny czas wygasania SZLINE: 1 godzina
+
+OPER_STATS_SZLINE_EXPIRE_MINS
+ Domy¶lny czas wygasania SZLINE: %d minut(y)
+
+OPER_STATS_SZLINE_EXPIRE_MIN
+ Domy¶lny czas wygasania SZLINE: 1 minuta
+
+OPER_STATS_SZLINE_EXPIRE_NONE
+ Domy¶lny czas wygasania SZLINE: nie wygasa
+
+OPER_STATS_RESET
+ Statystyki zosta³y zresetowane.
+
+OPER_STATS_UPLINK_SERVER
+ Pod³±czony do: %s
+
+OPER_STATS_UPLINK_CAPAB
+ Uplink capab : %s
+
+OPER_STATS_UPLINK_SERVER_COUNT
+ Serwerów : %d
+
+# MODE responses
+OPER_MODE_SYNTAX
+ MODE kana³ flagi
+
+# UMODE respondes
+OPER_UMODE_SYNTAX
+ UMODE nick flagi
+
+OPER_UMODE_SUCCESS
+ Zmieniono flagi u¿ytkownika dla %s.
+
+OPER_UMODE_CHANGED
+ %s zmienia Twoje flagi u¿ytkownika.
+
+# OLINE responses
+OPER_OLINE_SYNTAX
+ OLINE nick flagi
+
+OPER_OLINE_SUCCESS
+ Flagi operatora %s zosta³y przyznane dla %s.
+
+OPER_OLINE_IRCOP
+ Jeste¶ teraz IRC operatorem.
+
+# CLEARMODES responses
+OPER_CLEARMODES_SYNTAX
+ CLEARMODES kana³ [ALL]
+
+OPER_CLEARMODES_DONE
+ Tryby i bany zosta³y wyczyszczone na kanale %s.
+
+OPER_CLEARMODES_ALL_DONE
+ Wszystkie tryby zosta³y wyczyszczone na kanale %s.
+
+# KICK responses
+OPER_KICK_SYNTAX
+ KICK kana³ nick powód
+
+# SVSNICK responses
+OPER_SVSNICK_SYNTAX
+ SVSNICK nick nowy-nick
+
+OPER_SVSNICK_NEWNICK
+ Nick %s zostaje zmieniony na %s.
+
+# ADMIN responses
+OPER_ADMIN_SYNTAX
+ ADMIN {ADD|DEL|LIST|CLEAR} [nick | pozycja]
+
+OPER_ADMIN_SKELETON
+ Serwisy s± w trybie szkieletowym, komenda ADMIN nie jest dostêpna.
+
+OPER_ADMIN_EXISTS
+ %s ju¿ istnieje na li¶cie administratorów serwisów.
+
+OPER_ADMIN_REACHED_LIMIT
+ Mo¿esz mieæ tylko %d administratorów serwisów.
+
+OPER_ADMIN_ADDED
+ %s dodano do listy administratorów serwisów.
+
+OPER_ADMIN_NOT_FOUND
+ %s nie znaleziono na li¶cie administratorów serwisów.
+
+OPER_ADMIN_NO_MATCH
+ Nie znaleziono pasuj±cych wpisów na li¶cie administratorów serwisów.
+
+OPER_ADMIN_DELETED
+ %s usuniêto z listy administratorów serwisów.
+
+OPER_ADMIN_DELETED_ONE
+ Usuniêto 1 wpis z listy administratorów serwisów.
+
+OPER_ADMIN_DELETED_SEVERAL
+ Usuniêto %d wpisy(ów) z listy administratorów serwisów.
+
+OPER_ADMIN_LIST_EMPTY
+ Lista administratorów serwisów jest pusta.
+
+OPER_ADMIN_LIST_HEADER
+ Lista administratorów serwisów:
+ Nr Nick
+
+OPER_ADMIN_LIST_FORMAT
+ %3d %s
+
+OPER_ADMIN_CLEAR
+ Lista administratorów serwisów zosta³a wyczyszczona.
+
+OPER_ADMIN_MOVED
+ %s przeniesiono na listê administratorów serwisów.
+
+# OPER responses
+OPER_OPER_SYNTAX
+ OPER {ADD|DEL|LIST|CLEAR} [nick | pozycja]
+
+OPER_OPER_SKELETON
+ Serwisy s± w trybie szkieletowym, komenda OPER nie jest dostêpna.
+
+OPER_OPER_EXISTS
+ %s ju¿ istnieje na li¶cie operatorów serwisów.
+
+OPER_OPER_REACHED_LIMIT
+ Mo¿esz mieæ tylko %d operatorów serwisów.
+
+OPER_OPER_ADDED
+ %s dodano do listy operatorów serwisów.
+
+OPER_OPER_NOT_FOUND
+ %s nie znaleziono na li¶cie operatorów serwisów.
+
+OPER_OPER_NO_MATCH
+ Nie znaleziono pasuj±cych wpisów na li¶cie operatorów serwisów.
+
+OPER_OPER_DELETED
+ %s usuniêto z listy operatorów serwisów.
+
+OPER_OPER_DELETED_ONE
+ Usuniêto 1 wpis z listy operatorów serwisów.
+
+OPER_OPER_DELETED_SEVERAL
+ Usuniêto %d wpisy(ów) z listy operatorów serwisów.
+
+OPER_OPER_LIST_EMPTY
+ Lista operatorów serwisów jest pusta.
+
+OPER_OPER_LIST_HEADER
+ Lista operatorów serwisów:
+ Nr Nick
+
+OPER_OPER_LIST_FORMAT
+ %3d %s
+
+OPER_OPER_CLEAR
+ Lista operatorów serwisów zosta³a wyczyszczona.
+
+OPER_OPER_MOVED
+ %s przeniesiono na listê operatorów serwisów.
+
+# AKILL responses
+OPER_AKILL_SYNTAX
+ AKILL {ADD | DEL | LIST | VIEW | CLEAR} [[+czas-trwania] {maska | pozycja} [powód]]
+
+OPER_AKILL_EXISTS
+ %s ju¿ istnieje na li¶cie AKILL.
+
+OPER_AKILL_ALREADY_COVERED
+ %s ju¿ jest obejmowane przez %s.
+
+OPER_AKILL_REACHED_LIMIT
+ Mo¿esz mieæ tylko %d wpisów na li¶cie AKILL.
+
+OPER_AKILL_NO_NICK
+ Uwaga: maska AKILL nie mo¿e zawieraæ nicków.
+ Upewnij siê, ¿e nie dodajesz czê¶ci nicka.
+
+OPER_AKILL_ADDED
+ %s dodano do listy AKILL.
+
+OPER_AKILL_CHANGED
+ Zmieniono czas wygasania %s.
+
+OPER_AKILL_NOT_FOUND
+ %s nie znaleziono na li¶cie AKILL.
+
+OPER_AKILL_NO_MATCH
+ Nie znaleziono pasuj±cych wpisów na li¶cie AKILL.
+
+OPER_AKILL_DELETED
+ %s usuniêto z listy AKILL.
+
+OPER_AKILL_DELETED_ONE
+ Usuniêto 1 wpis z listy AKILL.
+
+OPER_AKILL_DELETED_SEVERAL
+ Usuniêto %d wpisy(ów) z listy AKILL.
+
+OPER_AKILL_LIST_EMPTY
+ Lista AKILL jest pusta.
+
+OPER_AKILL_LIST_HEADER
+ Aktualna lista AKILL:
+ Nr Maska Powód
+
+OPER_AKILL_LIST_FORMAT
+ %3d %-32s %s
+
+OPER_AKILL_VIEW_HEADER
+ Aktualna lista AKILL:
+
+# number, mask, set-by, set-time, expires, reason
+OPER_AKILL_VIEW_FORMAT
+ %3d %s (przez %s na %s; %s)
+ %s
+
+OPER_AKILL_CLEAR
+ Lista AKILL zosta³a wyczyszczona.
+
+OPER_CHANKILL_SYNTAX
+ CHANKILL [+czas-trwania] {#kana³} [powód]
+
+# SGLINE responses
+OPER_SGLINE_SYNTAX
+ SGLINE {ADD | DEL | LIST | VIEW | CLEAR} [[+czas-trwania] {maska | pozycja} [powód]]
+
+OPER_SGLINE_UNSUPPORTED
+ Komenda SGLINE nie jest dostêpna w tej sieci.
+
+OPER_SGLINE_EXISTS
+ %s ju¿ istnieje na li¶cie SGLINE.
+
+OPER_SGLINE_ALREADY_COVERED
+ %s ju¿ jest obejmowane przez %s.
+
+OPER_SGLINE_REACHED_LIMIT
+ Mo¿esz mieæ tylko %d wpisów na li¶cie SGLINE.
+
+OPER_SGLINE_ADDED
+ %s dodano do listy SGLINE.
+
+OPER_SGLINE_CHANGED
+ Zmieniono czas wygasania %s.
+
+OPER_SGLINE_NOT_FOUND
+ %s nie znaleziono na li¶cie SGLINE.
+
+OPER_SGLINE_NO_MATCH
+ Nie znaleziono pasuj±cych wpisów na li¶cie SGLINE.
+
+OPER_SGLINE_DELETED
+ %s usuniêto z listy SGLINE.
+
+OPER_SGLINE_DELETED_ONE
+ Usuniêto 1 wpis z listy SGLINE.
+
+OPER_SGLINE_DELETED_SEVERAL
+ Usuniêto %d wpisy(ów) z listy SGLINE.
+
+OPER_SGLINE_LIST_EMPTY
+ Lista SGLINE jest pusta.
+
+OPER_SGLINE_LIST_HEADER
+ Aktualna lista SGLINE:
+ Nr Maska Powód
+
+OPER_SGLINE_LIST_FORMAT
+ %3d %-32s %s
+
+OPER_SGLINE_VIEW_HEADER
+ Aktualna lista SGLINE:
+
+# number, mask, set-by, set-time, expires, reason
+OPER_SGLINE_VIEW_FORMAT
+ %3d %s (przez %s na %s; %s)
+ %s
+
+OPER_SGLINE_CLEAR
+ Lista SGLINE zosta³a wyczyszczona.
+
+# SQLINE responses
+OPER_SQLINE_SYNTAX
+ SQLINE {ADD | DEL | LIST | VIEW | CLEAR} [[+czas-trwania] {maska | pozycja} [powód]]
+
+OPER_SQLINE_CHANNELS_UNSUPPORTED
+ Kana³owe SQLINE nie jest obs³ugiwane przez Twoje ircd.
+
+OPER_SQLINE_EXISTS
+ %s ju¿ istnieje na li¶cie SQLINE.
+
+OPER_SQLINE_ALREADY_COVERED
+ %s ju¿ jest obejmowane przez %s.
+
+OPER_SQLINE_REACHED_LIMIT
+ Mo¿esz mieæ tylko %d wpisów na li¶cie SQLINE.
+
+OPER_SQLINE_ADDED
+ %s dodano do listy SQLINE.
+
+OPER_SQLINE_CHANGED
+ Zmieniono czas wygasania %s.
+
+OPER_SQLINE_NOT_FOUND
+ %s nie znaleziono na li¶cie SQLINE.
+
+OPER_SQLINE_NO_MATCH
+ Nie znaleziono pasuj±cych wpisów na li¶cie SQLINE.
+
+OPER_SQLINE_DELETED
+ %s usuniêto z listy SQLINE.
+
+OPER_SQLINE_DELETED_ONE
+ Usuniêto 1 wpis z listy SQLINE.
+
+OPER_SQLINE_DELETED_SEVERAL
+ Usuniêto %d wpisy(ów) z listy SQLINE.
+
+OPER_SQLINE_LIST_EMPTY
+ Lista SQLINE jest pusta.
+
+OPER_SQLINE_LIST_HEADER
+ Aktualna lista SQLINE:
+ Nr Maska Powód
+
+OPER_SQLINE_LIST_FORMAT
+ %3d %-32s %s
+
+OPER_SQLINE_VIEW_HEADER
+ Aktualna lista SQLINE:
+
+# number, mask, set-by, set-time, expires, reason
+OPER_SQLINE_VIEW_FORMAT
+ %3d %s (przez %s na %s; %s)
+ %s
+
+OPER_SQLINE_CLEAR
+ Lista SQLINE zosta³a wyczyszczona.
+
+# SZLINE responses
+OPER_SZLINE_SYNTAX
+ SZLINE {ADD | DEL | LIST | VIEW | CLEAR} [[+czas-trwania] {maska | pozycja} [powód]]
+
+OPER_SZLINE_UNSUPPORTED
+ Komenda SZLINE nie jest dostêpna w tej sieci.
+
+OPER_SZLINE_EXISTS
+ %s ju¿ istnieje na li¶cie SZLINE.
+
+OPER_SZLINE_ALREADY_COVERED
+ %s ju¿ jest obejmowane przez %s.
+
+OPER_SZLINE_REACHED_LIMIT
+ Mo¿esz mieæ tylko %d wpisów na li¶cie SZLINE.
+
+OPER_SZLINE_ONLY_IPS
+ Uwaga: mo¿esz dodawaæ jedynie maski IP do listy SZLINE.
+
+OPER_SZLINE_ADDED
+ %s dodano do listy SZLINE.
+
+OPER_SZLINE_CHANGED
+ Zmieniono czas wygasania %s.
+
+OPER_SZLINE_NOT_FOUND
+ %s nie znaleziono na li¶cie SZLINE.
+
+OPER_SZLINE_NO_MATCH
+ Nie znaleziono pasuj±cych wpisów na li¶cie SZLINE.
+
+OPER_SZLINE_DELETED
+ %s usuniêto z listy SZLINE.
+
+OPER_SZLINE_DELETED_ONE
+ Usuniêto 1 wpis z listy SZLINE.
+
+OPER_SZLINE_DELETED_SEVERAL
+ Usuniêto %d wpisy(ów) z listy SZLINE.
+
+OPER_SZLINE_LIST_EMPTY
+ Lista SZLINE jest pusta.
+
+OPER_SZLINE_LIST_HEADER
+ Aktualna lista SZLINE:
+ Nr Maska Powód
+
+OPER_SZLINE_LIST_FORMAT
+ %3d %-32s %s
+
+OPER_SZLINE_VIEW_HEADER
+ Aktualna lista SZLINE:
+
+# number, mask, set-by, set-time, expires, reason
+OPER_SZLINE_VIEW_FORMAT
+ %3d %s (przez %s na %s; %s)
+ %s
+
+OPER_SZLINE_CLEAR
+ Lista SZLINE zosta³a wyczyszczona.
+
+# SET responses
+OPER_SET_SYNTAX
+ SET opcja ustawienie
+
+OPER_SET_IGNORE_ON
+ Opcja IGNORE zosta³a w³±czona.
+
+OPER_SET_IGNORE_OFF
+ Opcja IGNORE zosta³a wy³±czona.
+
+OPER_SET_IGNORE_ERROR
+ Parametrem opcji IGNORE musi byæ ON albo OFF.
+
+OPER_SET_READONLY_ON
+ Serwisy s± teraz w trybie tylko-do-odczytu.
+
+OPER_SET_READONLY_OFF
+ Serwisy s± teraz w trybie odczyt-zapis.
+
+OPER_SET_READONLY_ERROR
+ Parametrem opcji READONLY musi byæ ON albo OFF.
+
+OPER_SET_LOGCHAN_ON
+ Serwisy bêd± wysy³aæ wiadomo¶ci na kana³ %s.
+
+OPER_SET_LOGCHAN_OFF
+ Serwisy nie bêd± ju¿ d³u¿ej wysy³aæ wiadomo¶ci na kana³.
+
+OPER_SET_LOGCHAN_ERROR
+ Parametrem dla LOGCHAN musi byæ ON albo OFF.
+ Ponadto kana³ logowania musi byæ zdefiniowany w pliku konfiguracyjnym.
+
+OPER_SET_DEBUG_ON
+ Serwisy s± teraz w trybie debugowania.
+
+OPER_SET_DEBUG_OFF
+ Serwisy nie s± ju¿ w trybie debugowania.
+
+OPER_SET_DEBUG_LEVEL
+ Serwisy s± teraz w trybie debugowania (poziom %d).
+
+OPER_SET_DEBUG_ERROR
+ Parametrem opcji DEBUG musi byæ ON, OFF albo liczba dodatnia.
+
+OPER_SET_NOEXPIRE_ON
+ Serwisy nie s± ju¿ w trybie wygasania.
+
+OPER_SET_NOEXPIRE_OFF
+ Serwisy s± teraz w trybie wygasania.
+
+OPER_SET_NOEXPIRE_ERROR
+ Parametrem opcji NOEXPIRE musi byæ ON albo OFF.
+
+OPER_SET_UNKNOWN_OPTION
+ Nieznana opcja %s.
+
+OPER_SET_SQL_ON
+ Obs³uga SQL zosta³a w³±czona.
+
+OPER_SET_SQL_OFF
+ Obs³uga SQL zosta³a wy³±czona.
+
+OPER_SET_SQL_ERROR
+ Parametrem opcji SQL musi byæ ON albo OFF.
+
+OPER_SET_SQL_ERROR_INIT
+ B³±d podczas inicjacji SQL, sprawd¼ logi.
+
+OPER_SET_SQL_ERROR_DISABLED
+ SQL nie jest skonfigurowany dla tej sieci.
+ Wprowad¼ zmiany w pliku konfiguracyjnym.
+
+OPER_SET_LIST_OPTION_ON
+ %s jest w³±czone
+
+OPER_SET_LIST_OPTION_OFF
+ %s jest wy³±czone
+
+# NOOP responses
+OPER_NOOP_SYNTAX
+ NOOP {SET|REVOKE} serwer
+
+OPER_NOOP_SET
+ Wszystkie O:linie %s zosta³y usuniête.
+
+OPER_NOOP_REVOKE
+ Wszystkie O:linie %s zosta³y zresetowane.
+
+# JUPE responses
+OPER_JUPE_SYNTAX
+ JUPE serwer [powód]
+
+OPER_JUPE_HOST_ERROR
+ Proszê u¿yæ prawid³owej nazwy serwera.
+
+# RAW responses
+OPER_RAW_SYNTAX
+ RAW tekst
+
+# UPDATE responses
+OPER_UPDATING
+ Aktualizacja baz danych.
+
+# RELOAD responses
+OPER_RELOAD
+ Plik konfiguracyjny serwisów zosta³ prze³adowany.
+
+# RESTART responses
+OPER_CANNOT_RESTART
+ Nie zdefiniowano SERVICES_BIN; nie mogê restartowaæ.
+ Uruchom ponownie skrypt configure i przekompiluj serwisy, aby w³±czyæ komendê RESTART.
+
+# IGNORE respondes
+OPER_IGNORE_SYNTAX
+ Sk³adnia: IGNORE {ADD|DEL|LIST|CLEAR} [czas] [nick | maska]
+
+OPER_IGNORE_VALID_TIME
+ Musisz podaæ prawid³ow± liczbê dla czasu.
+
+OPER_IGNORE_TIME_DONE
+ Nick %s bêdzie ignorowany przez %s.
+
+OPER_IGNORE_PERM_DONE
+ Nick %s bêdzie stale ignorowany.
+
+OPER_IGNORE_DEL_DONE
+ Nick %s nie bêdzie ignorowany.
+
+OPER_IGNORE_LIST
+ Lista ignorowanych przez serwisy:
+
+OPER_IGNORE_LIST_NOMATCH
+ %s nie znaleziono na li¶cie ignorowanych.
+
+OPER_IGNORE_LIST_EMPTY
+ Lista ignorowanych jest pusta.
+
+OPER_IGNORE_LIST_CLEARED
+ Lista ignorowanych zosta³a wyczyszczona.
+
+# KILLCLONES responses
+OPER_KILLCLONES_SYNTAX
+ KILLCLONES nick
+
+OPER_KILLCLONES_UNKNOWN_NICK
+ Nie mogê znale¼æ u¿ytkownika %s.
+
+# CHANLIST responses
+OPER_CHANLIST_HEADER
+ Lista kana³ów:
+ Nazwa Tryby u¿yt. Temat
+
+OPER_CHANLIST_HEADER_USER
+ Lista kana³ów %s:
+ Nazwa Tryby u¿yt. Temat
+
+OPER_CHANLIST_RECORD
+ %-20s %4d +%-6s %s
+
+OPER_CHANLIST_END
+ Koniec listy kana³ów.
+
+# USERLIST responses
+OPER_USERLIST_HEADER
+ Lista u¿ytkowników:
+ Nick Maska
+
+OPER_USERLIST_HEADER_CHAN
+ Lista u¿ytkowników %s:
+ Nick Maska
+
+OPER_USERLIST_RECORD
+ %-20s %s@%s
+
+OPER_USERLIST_END
+ Koniec listy u¿ytkowników.
+
+OPER_SUPER_ADMIN_ON
+ Jeste¶ teraz super-administratorem.
+
+OPER_SUPER_ADMIN_OFF
+ Nie jeste¶ ju¿ d³u¿ej super-administratorem.
+
+OPER_SUPER_ADMIN_SYNTAX
+ Parametrem dla opcji SuperAdmin musi byæ ON lub OFF (musi byæ w³±czona w pliku konfiguracyjnym)
+
+OPER_SUPER_ADMIN_WALL_ON
+ %s jest teraz super-administratorem
+
+OPER_SUPER_ADMIN_WALL_OFF
+ %s nie jest ju¿ d³u¿ej super-administratorem
+
+OPER_SUPER_ADMIN_ONLY
+ Tylko super-administratorzy mog± u¿ywaæ tej komendy.
+
+OPER_STAFF_LIST_HEADER
+ Na Poziom Nick
+
+OPER_STAFF_FORMAT
+ %c %s %s
+
+OPER_STAFF_AFORMAT
+ %c %s %s [%s]
+
+# DefCon Messages
+OPER_DEFCON_SYNTAX
+ Sk³adnia: DEFCON [1|2|3|4|5]
+
+OPER_DEFCON_DENIED
+ Serwisy s± w trybie defcon, spróbuj ponownie pó¼niej.
+
+OPER_DEFCON_NO_CONF
+ System defcon musi byæ w³±czony w pliku konfiguracyjnym.
+
+OPER_DEFCON_CHANGED
+ Serwisy s± teraz w systemie DEFCON %d
+
+OPER_DEFCON_WALL
+ %s zmieniono poziom DEFCON na %d
+
+DEFCON_GLOBAL
+ Defcon jest teraz na poziomie: %d
+
+# Module strings
+OPER_MODULE_LOADED
+ Modu³ %s zosta³ za³adowany.
+
+OPER_MODULE_UNLOADED
+ Modu³ %s zosta³ wy³adowany.
+
+OPER_MODULE_LOAD_FAIL
+ Nie mo¿na za³adowaæ modu³u %s
+
+OPER_MODULE_REMOVE_FAIL
+ Nie mo¿na wy³adowaæ modu³u %s
+
+OPER_MODULE_NO_UNLOAD
+ Ten modu³ nie mo¿e zostaæ wy³adowany.
+
+OPER_MODULE_LOAD_SYNTAX
+ MODLOAD nazwa-pliku
+
+OPER_MODULE_UNLOAD_SYNTAX
+ MODUNLOAD nazwa-pliku
+
+OPER_MODULE_LIST_HEADER
+ Aktualna lista modu³ów:
+
+OPER_MODULE_LIST
+ Modu³: %s [%s] [%s]
+
+OPER_MODULE_LIST_FOOTER
+ Za³adowanych modu³ów: %d.
+
+OPER_MODULE_INFO_LIST
+ Modu³: %s Wersja: %s Autor: %s Za³adowano: %s
+
+OPER_MODULE_CMD_LIST
+ Dodane komendy: %R%s %s
+
+OPER_MODULE_MSG_LIST
+ Zapewnia IRCD handler dla : %s
+
+OPER_MODULE_NO_LIST
+ Aktualnie nie ma za³adowanych modu³ów.
+
+OPER_MODULE_NO_INFO
+ Informacje o module %s nie s± dostêpne.
+
+OPER_MODULE_INFO_SYNTAX
+ MODINFO nazwa-pliku
+
+MODULE_HELP_HEADER
+ Nastêpuj±ce komendy zosta³y dodane przez modu³:
+
+###########################################################################
+#
+# Session Limiting and Exception messages
+#
+###########################################################################
+# EXCEPTION responses
+OPER_EXCEPTION_SYNTAX
+ EXCEPTION {ADD | DEL | MOVE | LIST | VIEW} [parametry]
+
+OPER_EXCEPTION_ADD_SYNTAX
+ EXCEPTION ADD [+czas-trwania] maska limit powód
+
+OPER_EXCEPTION_DEL_SYNTAX
+ EXCEPTION DEL {maska | lista}
+
+OPER_EXCEPTION_MOVE_SYNTAX
+ EXCEPTION MOVE numer pozycja
+
+OPER_EXCEPTION_DISABLED
+ Limitowanie sesji jest wy³±czone.
+
+OPER_EXCEPTION_ALREADY_PRESENT
+ Maska %s ju¿ istnieje na li¶cie wyj±tków.
+
+OPER_EXCEPTION_TOO_MANY
+ Lista wyj±tków limitów sesji jest pe³na!
+
+OPER_EXCEPTION_ADDED
+ Limit sesji dla %s zmieniono na %d.
+
+OPER_EXCEPTION_MOVED
+ Wyj±tek dla %s (#%d) przeniesiono na pozycjê %d.
+
+OPER_EXCEPTION_NO_SUCH_ENTRY
+ Nie znaleziono wpisu (#%d) na li¶cie wyj±tków limitów sesji.
+
+OPER_EXCEPTION_NOT_FOUND
+ %s nie znaleziono na li¶cie wyj±tków limitów sesji.
+
+OPER_EXCEPTION_NO_MATCH
+ Nie znaleziono wpisów na li¶cie wyj±tków limitów sesji.
+
+OPER_EXCEPTION_DELETED
+ %s usuniêto z listy wyj±tków limitów sesji.
+
+OPER_EXCEPTION_DELETED_ONE
+ Usuniêto 1 wpis z listy wyj±tków limitów sesji.
+
+OPER_EXCEPTION_DELETED_SEVERAL
+ Usuniêto %d wpisy(ów) z listy wyj±tków limitów sesji.
+
+OPER_EXCEPTION_LIST_HEADER
+ Aktualna lista wyj±tków limitów sesji:
+
+# mask, limit
+OPER_EXCEPTION_LIST_FORMAT
+ %3d %4d %s
+
+OPER_EXCEPTION_LIST_COLHEAD
+ Nr Limit Host
+
+# mask, set-by, set-time, expires, limit, reason
+OPER_EXCEPTION_VIEW_FORMAT
+ %3d. %s (przez %s na %s; %s)
+ Limit: %-4d - %s
+
+OPER_EXCEPTION_INVALID_LIMIT
+ Nieprawid³owy limit sesji. Musi byæ liczb± nieujemn± i mniejsz± ni¿ %d.
+
+OPER_EXCEPTION_INVALID_HOSTMASK
+ Nieprawid³owa maska. Tylko rzeczywiste maski s± prawid³owe jako wyj±tki.
+
+OPER_EXCEPTION_EXISTS
+ %s ju¿ istnieje na li¶cie wyj±tków.
+
+OPER_EXCEPTION_CHANGED
+ Wyj±tek dla %s zosta³ zaktualizowany do %d.
+
+# 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
+ Limitowanie sesji jest wy³±czone.
+
+OPER_SESSION_INVALID_THRESHOLD
+ Nieprawid³owa warto¶æ progu. Musi byæ liczb± ca³kowit± wiêksz± ni¿ 1.
+
+OPER_SESSION_NOT_FOUND
+ %s nie znaleziono na li¶cie sesji.
+
+OPER_SESSION_LIST_HEADER
+ Hosty z przynajmniej %d sesjami:
+
+OPER_SESSION_LIST_COLHEAD
+ Sesje Host
+
+# limit, host
+OPER_SESSION_LIST_FORMAT
+ %6d %s
+
+# host, sessions, limit
+OPER_SESSION_VIEW_FORMAT
+ Host %s aktualnie posiada %d sesji z limitem %d.
+
+# EXCEPTION help
+OPER_HELP_EXCEPTION
+ Sk³adnia: EXCEPTION ADD [+czas-trwania] maska limit powód
+ EXCEPTION DEL {maska | lista}
+ EXCEPTION MOVE numer pozycja
+ EXCEPTION LIST [maska | lista]
+ EXCEPTION VIEW [maska | lista]
+
+ Pozwala administratorom serwisów na zarz±dzanie list± limitów
+ sesji dla poszczególnych hostów - np. serwery shell mog±
+ mieæ wiêksz± liczbê po³±czeñ. Kiedy limit po³±czeñ zostanie
+ osi±gniêty ka¿dy nowy u¿ytkownik z takiego hosta bêdzie
+ roz³±czany z sieci±. Przed roz³±czeniem zostanie wys³ane
+ powiadomienie (jego tre¶æ ustawia siê w pliku konfiguracyjnym).
+
+ EXCEPTION ADD dodaje wskazan± maskê na listê wyj±tków.
+ Maski nick!user@host oraz user@host s± nieprawid³owe,
+ poniewa¿ zawieraj± nick lub ident u¿ytkownika. Dopuszczalne
+ maski to np. box.host.dom lub *.host.dom. Limit musi
+ byæ liczb± nieujemn±. Podanie zera oznacza wy³±czenie limitu.
+ Format czasu jest opisany w pomocy polecenia AKILL.
+ EXCEPTION DEL usuwa wskazane wpisy z listy wyj±tków.
+ EXCEPTION MOVE przenosi wyj±tek o wskazanym numerze na
+ now± pozycjê. Wyj±tki znajduj±ce siê pomiêdzy zostan±
+ odpowiednio przeniesione, aby wype³niæ powsta³± lukê.
+ EXCEPTION LIST oraz EXCEPTION VIEW listuj± wyj±tki.
+ Podanie maski powoduje ograniczenie wy¶wietlanych wpisów.
+ EXCEPTION VIEW zwraca dodatkowo informacje o zak³adaj±cym,
+ limicie, powodzie, masce oraz czasie.
+
+ Nale¿y pamiêtaæ, ¿e pod³±czaj±cy siê klient bêdzie u¿ywa³
+ pierwszego wyj±tku o pasuj±cej masce. Du¿a lista wyj±tków i
+ zbyt ogólne maski powoduj± pogorszenie wydajno¶ci serwisów.
+
+OPER_HELP_SESSION
+ Sk³adnia: SESSION LIST minimum
+ SESSION VIEW host
+
+ Pozwala administratorom serwisów na listowanie sesji.
+
+ SESSION LIST listuje hosty z przynajmniej minimum sesjami.
+ Minimum musi byæ wiêksze od 1, aby zapobiec przypadkowemu
+ listowaniu du¿ej liczby pojedynczych hostów.
+ SESSION VIEW wy¶wietla szczegó³owe informacje na temat
+ podanego hosta - podaj±c aktualny limit oraz ilo¶æ sesji.
+ Parametr host mo¿e zawieraæ symboli wieloznacznych.
+
+ Wiêcej informacji na temat ograniczania liczby sesji
+ znajduje siê w pomocy polecenia EXCEPTION.
+
+OPER_HELP_STAFF
+ Sk³adnia: STAFF
+
+ Wy¶wietla nicki obs³ugi serwisów, poziom i status online.
+
+OPER_HELP_DEFCON
+ Sk³adnia: DEFCON [1|2|3|4|5]
+
+ System defcon umo¿liwia wprowadzanie wcze¶niej
+ zdefiniowanych ograniczeñ dla serwisów podczas
+ próby ataku na sieæ.
+OPER_HELP_DEFCON_NO_NEW_CHANNELS
+ * Wy³±cza rejestrowanie kana³ów
+
+OPER_HELP_DEFCON_NO_NEW_NICKS
+ * Wy³±cza rejestrowanie nicków
+
+OPER_HELP_DEFCON_NO_MLOCK_CHANGE
+ * Flagi kana³ów nie bêd± wymuszane (MLOCK)
+
+OPER_HELP_DEFCON_FORCE_CHAN_MODES
+ * Wymusza ustawienie flag (%s) na wszystkich kana³ach
+
+OPER_HELP_DEFCON_REDUCE_SESSION
+ * U¿ywa zredukowanego limitu sesji: %d
+
+OPER_HELP_DEFCON_NO_NEW_CLIENTS
+ * Killuje wszystkich nowych klientów
+
+OPER_HELP_DEFCON_OPER_ONLY
+ * Ignoruje zwyk³ych u¿ytkowników (informuje ich o tym)
+
+OPER_HELP_DEFCON_SILENT_OPER_ONLY
+ * Cicho ignoruje zwyk³ych u¿ytkowników
+
+OPER_HELP_DEFCON_AKILL_NEW_CLIENTS
+ * AKILLuje wszystkich nowych klientów
+
+OPER_HELP_DEFCON_NO_NEW_MEMOS
+ * Nowe wiadomo¶ci nie bêd± wysy³ane
+
+OPER_HELP_CHANKILL
+ Sk³adnia: CHANKILL [+czas] kana³ powód
+
+ Zak³ada AKILLa na ka¿dy nick na wskazanym kanale.
+ Na listê zostaj± dodane prawdziwe adresy (ident@host),
+ po czym AKILL zostaje wykonany.
+###########################################################################
+#
+# News system messages
+#
+###########################################################################
+NEWS_LOGON_TEXT
+ [Wiadomo¶æ powitalna - %s] %s
+
+NEWS_OPER_TEXT
+ [Wiadomo¶æ dla operatorów - %s] %s
+
+NEWS_RANDOM_TEXT
+ [Losowa wiadomo¶æ - %s] %s
+
+NEWS_LOGON_SYNTAX
+ Sk³adnia: LOGONNEWS {ADD|DEL|LIST} [tekst|numer]
+
+NEWS_LOGON_LIST_HEADER
+ Wiadomo¶ci powitalne:
+
+NEWS_LOGON_LIST_ENTRY
+ %5d (%s przez %s)
+ %s
+
+NEWS_LOGON_LIST_NONE
+ Nie ma wiadomo¶ci powitalnych.
+
+NEWS_LOGON_ADD_SYNTAX
+ Sk³adnia: LOGONNEWS ADD tekst
+
+NEWS_LOGON_ADD_FULL
+ Lista wiadomo¶ci powitalnych jest pe³na!
+
+NEWS_LOGON_ADDED
+ Dodano now± wiadomo¶æ powitaln± (#%d).
+
+NEWS_LOGON_DEL_SYNTAX
+ Sk³adnia: LOGONNEWS DEL {numer | ALL}
+
+NEWS_LOGON_DEL_NOT_FOUND
+ Wiadomo¶æ powitalna #%d nie zosta³a znaleziona!
+
+NEWS_LOGON_DELETED
+ Wiadomo¶æ powitalna #%d zosta³a skasowana.
+
+NEWS_LOGON_DEL_NONE
+ Nie ma wiadomo¶ci powitalnych do skasowania!
+
+NEWS_LOGON_DELETED_ALL
+ Wszystkie wiadomo¶ci powitalne zosta³ skasowane.
+
+NEWS_OPER_SYNTAX
+ Sk³adnia: OPERNEWS {ADD|DEL|LIST} [tekst|numer]
+
+NEWS_OPER_LIST_HEADER
+ Wiadomo¶ci dla operatorów:
+
+NEWS_OPER_LIST_ENTRY
+ %5d (%s przez %s)
+ %s
+
+NEWS_OPER_LIST_NONE
+ Nie ma wiadomo¶ci dla operatorów.
+
+NEWS_OPER_ADD_SYNTAX
+ Sk³adnia: OPERNEWS ADD tekst
+
+NEWS_OPER_ADD_FULL
+ Lista wiadomo¶ci jest pe³na!
+
+NEWS_OPER_ADDED
+ Dodano now± wiadomo¶æ dla operatorów (#%d).
+
+NEWS_OPER_DEL_SYNTAX
+ Sk³adnia: OPERNEWS DEL {numer | ALL}
+
+NEWS_OPER_DEL_NOT_FOUND
+ Wiadomo¶æ dla operatorów #%d nie zosta³a znaleziona!
+
+NEWS_OPER_DELETED
+ Wiadomo¶æ dla operatorów #%d zosta³a skasowana.
+
+NEWS_OPER_DEL_NONE
+ Nie ma wiadomo¶ci dla operatorów do skasowania!
+
+NEWS_OPER_DELETED_ALL
+ Wszystkie wiadomo¶ci dla operatorów zosta³y skasowane.
+
+NEWS_RANDOM_SYNTAX
+ Sk³adnia: RANDOMNEWS {ADD|DEL|LIST} [tekst|numer]
+
+NEWS_RANDOM_LIST_HEADER
+ Losowe wiadomo¶ci:
+
+NEWS_RANDOM_LIST_ENTRY
+ %5d (%s przez %s)
+ %s
+
+NEWS_RANDOM_LIST_NONE
+ Nie ma losowych wiadomo¶ci.
+
+NEWS_RANDOM_ADD_SYNTAX
+ Sk³adnia: RANDOMNEWS ADD tekst
+
+NEWS_RANDOM_ADD_FULL
+ Lista wiadomo¶ci jest pe³na!
+
+NEWS_RANDOM_ADDED
+ Dodano now± losow± wiadomo¶æ (#%d).
+
+NEWS_RANDOM_DEL_SYNTAX
+ Sk³adnia: RANDOMNEWS DEL {numer | ALL}
+
+NEWS_RANDOM_DEL_NOT_FOUND
+ Losowa wiadomo¶æ #%d nie zosta³a znaleziona!
+
+NEWS_RANDOM_DELETED
+ Losowa wiadomo¶æ #%d zosta³a skasowana.
+
+NEWS_RANDOM_DEL_NONE
+ Nie ma losowych wiadomo¶ci do skasowania!
+
+NEWS_RANDOM_DELETED_ALL
+ Wszystkie losowe wiadomo¶ci zosta³y skasowane.
+
+NEWS_HELP_LOGON
+ Sk³adnia: LOGONNEWS ADD tekst
+ LOGONNEWS DEL {numer | ALL}
+ LOGONNEWS LIST
+
+ Edytuje lub wy¶wietla listê wiadomo¶ci wysy³anych po
+ przy³±czeniu u¿ytkownika do sieci. Je¶li zdefniowanych
+ wiadomo¶ci jest wiêcej tylko najnowsze %s zostanie
+ wys³anych (aby zapobiec floodowaniu). Warto¶æ NewsCount
+ mo¿e zostaæ zmieniona w pliku konfiguracyjym serwisów.
+
+ Polecenie LOGONNEWS LIST mo¿e byæ u¿yte przez ka¿dego
+ IRC operatora w celu wylistowania wiadomo¶ci. Polecenia
+ ADD i DEL s± zarezerwowane dla administratorów serwisów.
+
+NEWS_HELP_OPER
+ Sk³adnia: OPERNEWS ADD tekst
+ OPERNEWS DEL {numer | ALL}
+ OPERNEWS LIST
+
+ Edytuje lub wy¶wietla listê wiadomo¶ci wysy³anych po
+ wykonaniu polecenia /OPER. Je¶li zdefiniowanych
+ wiadomo¶ci jest wiêcej tylko najnowsze %s zostanie
+ wys³anych (aby zapobiec floodowaniu). Warto¶æ NewsCount
+ mo¿e zostaæ zmieniona w pliku konfiguracyjym serwisów.
+
+ Polecenie OPERNEWS LIST mo¿e byæ u¿yte przez ka¿dego
+ IRC operatora w celu wylistowania wiadomo¶ci. Polecenia
+ ADD i DEL s± zarezerwowane dla administratorów serwisów.
+
+NEWS_HELP_RANDOM
+ Sk³adnia: RANDOMNEWS ADD tekst
+ RANDOMNEWS DEL {numer | ALL}
+ RANDOMNEWS LIST
+
+ Edytuje lub wy¶wietla listê losowych newsów.
+ Po po³±czeniu z sieci± u¿ytkownik otrzyma dok³adnie
+ jedn± wylosowan± z tej listy wiadomo¶æ.
+
+ Polecenie RANDOMNEWS LIST mo¿e byæ u¿yte przez ka¿dego
+ IRC operatora w celu wylistowania wiadomo¶ci. Polecenia
+ ADD i DEL s± zarezerwowane dla administratorów serwisów.
+
+###########################################################################
+#
+# HelpServ help message
+#
+###########################################################################
+HELP_HELP
+ %S jest serwisem udzielaj±cym informacji
+ na temat innych serwisów. Dostêpne tematy pomocy:
+
+
+ %R%s HELP
+ rejestracja i zarz±dzanie nickami
+
+ %R%s HELP
+ rejestracja i zarz±dzanie kana³ami
+
+ %R%s HELP
+ wysy³anie wiadomo¶ci do u¿ytkowników off-line
+
+HELP_HELP_BOT
+ %R%s HELP
+ stawianie serwisowego bota na kanale
+
+HELP_HELP_HOST
+ %R%s HELP
+ ustawianie vhostów
+
+###########################################################################
+#
+# NickServ help messages
+#
+###########################################################################
+NICK_HELP_CMD_CONFIRM
+ CONFIRM Potwierdza rejestracjê nicka
+
+NICK_HELP_CMD_RESEND
+ RESEND Wysy³a ponownie kod autoryzuj±cy
+
+NICK_HELP_CMD_REGISTER
+ REGISTER Rejestruje nicka
+
+NICK_HELP_CMD_GROUP
+ GROUP Do³±cza nick do wskazanej grupy
+
+NICK_HELP_CMD_IDENTIFY
+ IDENTIFY Identyfikuje w³a¶ciciela nicka
+
+NICK_HELP_CMD_ACCESS
+ ACCESS Zarz±dza list± dostêpu
+
+NICK_HELP_CMD_SET
+ SET Modyfikuje ustawienia nicka
+
+NICK_HELP_CMD_SASET
+ SASET Ustawia opcje wskazanemu nickowi
+
+NICK_HELP_CMD_DROP
+ DROP Usuwa nicka
+
+NICK_HELP_CMD_RECOVER
+ RECOVER Od³±cza u¿ytkownika, który u¿ywa Twojego nicka
+
+NICK_HELP_CMD_RELEASE
+ RELEASE Zwalnia nick po u¿yciu komendy RECOVER
+
+NICK_HELP_CMD_SENDPASS
+ SENDPASS Pomaga odzyskaæ utracone has³o
+
+NICK_HELP_CMD_GHOST
+ GHOST Od³±cza wskazany nick od serwera
+
+NICK_HELP_CMD_ALIST
+ ALIST Listuje kana³y na których masz uprawnienia
+
+NICK_HELP_CMD_GLIST
+ GLIST Wy¶wietla wszystkie nicki w Twojej grupie
+
+NICK_HELP_CMD_INFO
+ INFO Pokazuje informacje o zarejestrowanym nicku
+
+NICK_HELP_CMD_LIST
+ LIST Listuje zarejestrowane nicki pasuj±ce do wzorca
+
+NICK_HELP_CMD_LOGOUT
+ LOGOUT Odwraca dzia³anie komendy IDENTIFY
+
+NICK_HELP_CMD_STATUS
+ STATUS Podaje status w³a¶ciciela podanego nicka
+
+NICK_HELP_CMD_UPDATE
+ UPDATE Aktualizuje twój obecny status np.
+ sprawdza nowe wiadomo¶ci
+
+NICK_HELP_CMD_GETPASS
+ GETPASS Podaje has³o do wskazanego nicka
+
+NICK_HELP_CMD_GETEMAIL
+ GETEMAIL Wy¶wietla u¿ytkowników zarejestrowanych z
+ podanym adresem e-mail
+
+NICK_HELP_CMD_FORBID
+ FORBID Blokuje podany nick
+
+NICK_HELP_CMD_SUSPEND
+ SUSPEND Blokuje podany nick z zachowaniem
+ wszelkich jego danych i ustawieñ
+
+NICK_HELP_CMD_UNSUSPEND
+ UNSUSPEND Uwalnia zawieszonego nicka
+
+NICK_HELP
+ %S umo¿liwia rejestracjê nicka i zapewnia
+ wy³±czno¶æ na jego u¿ywanie. Poni¿sze komendy
+ umo¿liwiaj± zarz±dzanie nickiem, aby ich u¿yæ wpisz:
+ %R%S komenda
+ Aby uzyskaæ szczegó³owy opis polecenia wpisz:
+ %R%S HELP komenda
+
+
+
+NICK_HELP_FOOTER
+
+ UWAGA: Ten serwis ma na celu umo¿liwienie identyfikacji
+ u¿ytkowników. NIE s³u¿y do kradzie¿y nicków czy innych
+ z³o¶liwych akcji. Nadu¿ycia bêd± skutkowa³y co najmniej
+ utrat± zarejestrowanego nicka.
+
+
+NICK_HELP_EXPIRES
+
+ Nicki nieu¿ywane przez d³u¿szy czas s± automatycznie
+ usuwane po %d dniach od ostatniej identyfikacji.
+ Wszelkie ustawienia oraz uprawnienia zostaj± usuniête.
+
+NICK_HELP_REGISTER
+ Sk³adnia: REGISTER has³o [email]
+
+ Rejestruje aktualnie u¿ywany nick w bazie %S.
+ Po rejestracji mo¿esz u¿yæ komend SET i ACCESS
+ do konfiguracji niektórych opcji nicka wedle upodobañ.
+ Upewnij siê, ¿e pamiêtasz has³o rejestracyjne, bo
+ bêdzie ono potrzebne w przysz³o¶ci do zmiany
+ ustawieñ i identyfikacji. Wielko¶æ liter w ha¶le
+ ma znaczenie!!!.
+
+ Jak wybraæ has³o?
+
+ Has³o musi byæ trudne do odgadniêcia. U¿ywanie imion
+ jako hase³ jest niewskazane. Bardzo krótkie has³o
+ mo¿e zostaæ odgadniête metod± prób i b³êdów.
+ Twoje has³o musi mieæ d³ugo¶æ co najmniej 5 znaków.
+ Znak spacji nie mo¿e byæ u¿yty w ha¶le.
+
+ Parametr email jest opcjonalny i od razu przy
+ rejestracji ustawia adres e-mail dla Twojego nicka.
+ Mo¿e siê zdarzyæ, ¿e adres e-mail mo¿e byæ wymagany
+ na niektórych sieciach. Twoja prywatno¶æ jest
+ chroniona - adres nie bêdzie udostêpniany osobom
+ trzecim.
+
+ Wraz z rejestracj± zostaje utworzona grupa.
+ Nicki z tej samej grupy maj± wspólne ustawienia,
+ prawa na kanale oraz ustawienia wiadomo¶ci.
+ Aby uzyskaæ wiêcej informacji napisz:
+ %R%S HELP GROUP.
+
+
+NICK_HELP_GROUP
+ Sk³adnia: GROUP nazwa has³o
+
+ Ta komenda powoduje dodanie Twojego nicka do grupy
+ reprezentowanej przez nick nazwa o ha¶le has³o.
+
+ Grupowanie nicków pozwala na dzielenie siê ustawieniami,
+ wiadomo¶ciami oraz uprawnieniami z innymi nickami z grupy.
+
+ Je¶li jaki¶ nick z grupy zostanie usuniêty nie tracisz
+ ¿adnych ustawieñ czy uprawnieñ, jednak grupa istnieje
+ dopóki jest w niej przynajmniej jeden nick.
+
+ Komenda mo¿e byæ u¿yta nawet wtedy kiedy bie¿±cy nick
+ nie jest zarejestrowany, w przeciwnym wypadku musisz
+ siê zidentyfikowaæ. Aby uzyskaæ wiêcej informacji wpisz:
+ %R%S HELP IDENTIFY
+
+ Mo¿liwe i zalecane jest u¿ywanie tej komendy na nickach,
+ które nie s± zarejestrowane, zostan± one wtedy automatycznie
+ dodane do bazy %S.
+
+ UWAGA: Komendê mo¿na u¿yæ tak¿e na zarejestrowanym nicku,
+ nale¿y jednak wzi±æ pod uwagê to, ¿e je¶li bie¿±cy nick jest
+ ostatni ze swojej grupy, to wszystkie jego ustawienia oraz
+ uprawnienia zostan± usuniête! Z tego powodu najlepiej grupowaæ
+ nowy nick ze starym, a nie na odwrót. Zmiana grupy mo¿e byæ
+ wy³±czona przez administratora w niektórych sieciach.
+
+ Mo¿na byæ tylko w jednej grupie w danej chwili,
+ ³±czenie grup nie jest mo¿liwe.
+
+ Uwaga: wszystkie nicki w grupie maj± to samo has³o.
+
+NICK_HELP_IDENTIFY
+ Sk³adnia: IDENTIFY has³o
+
+ Informuje %S, ¿e nick którego w³a¶nie u¿ywasz
+ nale¿y do Ciebie. Wiele komend wymaga identyfikacji
+ przed ich u¿yciem. Has³em jest to samo has³o,
+ którego u¿yto przy komendzie REGISTER.
+
+NICK_HELP_UPDATE
+ Sk³adnia: UPDATE
+
+ Aktualizuje twój obecny status, np. sprawdza czy s± nowe
+ wiadomo¶ci, ustawia odpowiednie uprawnienia na kana³ach,
+ aktualizuje vhosta oraz flagi u¿ytkownika.
+
+NICK_HELP_LOGOUT
+ Sk³adnia: LOGOUT
+
+ Odwraca dzia³anie komendy IDENTIFY. Po wydaniu
+ tego polecenia nie bêdziesz rozpoznawany jako
+ w³a¶ciciel nicka.
+NICK_HELP_DROP
+ Sk³adnia: DROP [nick]
+
+ Usuwa nick z bazy danych %S. Usuniêty nick
+ mo¿e zostaæ ponownie zarejestrowany przez ka¿dego.
+
+ Mo¿esz usun±æ nick nale¿±cy do Twojej grupy podaj±c
+ go jako dodatkowy parametr nick.
+
+ U¿ycie tej komendy wymaga identyfikacji z u¿yciem
+ has³a. Aby uzyskaæ wiêcej informacji wpisz:
+ %R%S HELP IDENTIFY
+
+NICK_HELP_ACCESS
+ Sk³adnia: ACCESS ADD maska
+ ACCESS DEL maska
+ ACCESS LIST
+
+ Modyfikuje lub wy¶wietla listê dostêpu dla nicka.
+ Lista dostêpu okre¶la hosty u¿ytkowników mog±cych
+ u¿ywaæ twojego nicka. Je¶li chcesz u¿ywaæ nicka z
+ innego hosta musisz siê najpierw zidentyfikowaæ
+ w serwisie %S komend± IDENTIFY.
+
+ Przyk³ady:
+
+ ACCESS ADD userek@ircnet.pl
+ Zezwala na dostêp do nicka ka¿demu
+ ³±cz±cemu siê z domeny ircnet.pl.
+
+ ACCESS DEL userek@ircnet.pl
+ Odwraca efekt poprzedniej komendy.
+
+ ACCESS LIST
+ Wy¶wietla aktualn± listê dostêpu.
+
+NICK_HELP_SET
+ Sk³adnia: SET opcja parametry
+
+ Ustawia ró¿ne opcje nicka. Dostêpne opcje to:
+
+ DISPLAY Ustawia nick reprezentuj±cy grupê nicków
+ PASSWORD Ustawia has³o do nicka
+ LANGUAGE Ustawia jêzyk w którym serwisy bêd±
+ wysy³a³y komunikaty
+ URL Przypisuje adres www do nicka
+ EMAIL Przypisuje adres e-mail do nicka
+ ICQ Przypisuje numer ICQ do nicka
+ GREET Przypisuje komunikat powitalny do nicka
+ KILL W³±cza lub wy³±cza ochronê nicka
+ SECURE W³±cza lub wy³±cza bezpieczeñstwo nicka
+ PRIVATE Zapobiega wy¶wietlaniu nicka po wydaniu
+ polecenia: %R%S LIST
+ HIDE Ukrywa poszczególne informacje o nicku
+ MSG Zmienia sposób komunikacji serwisów
+ AUTOOP W³±cza lub wy³±cza automatyczne opowanie
+
+ Aby u¿yæ tej komendy musisz siê zidentyfikowaæ z u¿yciem
+ Twojego has³a. Aby uzyskaæ wiêcej informacji wpisz:
+ %R%S HELP IDENTIFY
+
+ Aby uzyskaæ wiêcej informacji o danej opcji wpisz:
+ %R%S HELP SET opcja
+
+NICK_HELP_SET_DISPLAY
+ Sk³adnia: SET DISPLAY nowa-nazwa
+
+ Zmienia nazwê reprezentuj±c± Twoj± grupê nicków w
+ serwisach na now±. Nazwa MUSI byæ jednym z nicków
+ nale¿±cych do Twojej grupy.
+
+NICK_HELP_SET_PASSWORD
+ Sk³adnia: SET PASSWORD nowe-has³o
+
+ Zmienia Twoje has³o do nicka.
+
+NICK_HELP_SET_LANGUAGE
+ Sk³adnia: SET LANGUAGE numer
+
+ Zmienia jêzyk jakiego u¿ywaj± serwisy odpowiadaj±c
+ Tobie (czyli przyk³adowo kiedy odpowiadaj± na
+ wys³an± przez Ciebie komendê). Numer mo¿e byæ
+ wybrany z poni¿szej listy obs³ugiwanych jêzyków:
+
+NICK_HELP_SET_URL
+ Sk³adnia: SET URL adres
+
+ Przypisuje podany adres strony www nickowi.
+ Ten adres bêdzie siê pokazywa³ w opisie Twojego
+ nicka dostêpnym po u¿yciu polecenia INFO.
+
+NICK_HELP_SET_EMAIL
+ Sk³adnia: SET EMAIL adres
+
+ Przypisuje adres e-mail Twojemu nickowi. Adres
+ bêdzie wy¶wietlany przy opisie Twojego nicka
+ dostêpnym przy u¿yciu komendy INFO.
+
+NICK_HELP_SET_ICQ
+ Sk³adnia: SET ICQ numer
+
+ Przypisuje numer ICQ Twojemu nickowi, który
+ bêdzie wy¶wietlany przy opisie Twojego nicka
+ dostêpnym przy u¿yciu komendy INFO.
+
+
+NICK_HELP_SET_GREET
+ Sk³adnia: SET GREET wiadomo¶æ
+
+ Ustawia wiadomo¶æ powitaln± dla Twojego nicka.
+ Je¶li kana³ ma przydzielonego bota, w³±czone witanie
+ u¿ytkowników oraz masz odpowiedni poziom dostêpu to
+ wtedy ta wiadomo¶æ bêdzie wysy³ana na kana³ przez bota.
+
+NICK_HELP_SET_KILL
+ Sk³adnia: SET KILL {ON | QUICK | IMMED | OFF}
+
+ W³±cza lub wy³±cza automatyczn± ochronê dla nicka.
+ U¿ytkownicy wchodz±cy na chroniony nick otrzymuj±
+ informacje od %S, ¿e nick jest zarejestrowany i
+ je¶li siê nie zidentyfikuj± lub go nie zmieni±
+ w okre¶lonym czasie to ich nick zostanie zmieniony
+ si³± lub zostan± od³±czeni od sieci.
+
+ Opcja QUICK skraca czas oczekiwania na zmianê
+ z 60 sekund do 20. W przypadku opcji IMMED
+ nick zostanie zmieniony natychmiast bez mo¿liwo¶ci
+ identyfikacji (wstêpna identyfikacja nastêpuje
+ na podstawie listy dostêpu, dlatego t± opcjê
+ nale¿y stosowaæ z rozwag±). Administrator sieci
+ mo¿e wy³±czyæ korzystanie z IMMED.
+NICK_HELP_SET_SECURE
+ Sk³adnia: SET SECURE {ON | OFF}
+
+ W³±cza lub wy³±cza opcjê bezpieczeñstwa dla nicka.
+ W³±czenie SECURE wymusza na u¿ytkowniku podanie
+ has³a zanim ten zostanie rozpoznany jako w³a¶ciciel
+ nicka. %S nie bierze pod uwagê w tym wypadku
+ wystêpowania adresu li¶cie dostêpu. Je¶li adres
+ znajduje siê na li¶cie %S nie skilluje
+ u¿ytkownika niezale¿nie od ustawienia opcji KILL.
+
+NICK_HELP_SET_PRIVATE
+ Sk³adnia: SET PRIVATE {ON | OFF}
+
+ W³±cza lub wy³±cza opcjê PRIVATE dla nicka.
+ Kiedy ta opcja jest w³±czona nick nie bêdzie
+ umieszczany na listach wy¶wietlanych komend±:
+ %R%S LIST
+ Jednak ka¿dy, kto zna nick mo¿e uzyskaæ o nim
+ informacje u¿ywaj±c polecenia INFO.
+
+NICK_HELP_SET_HIDE
+ Sk³adnia: SET HIDE {EMAIL | STATUS | USERMASK | QUIT} {ON | OFF}
+
+ To polecenie pozwala na ukrycie czê¶ci informacji, które
+ s± wy¶wietlane przez polecenie INFO serwisu %s.
+ Pierwszy argument okre¶la ukrywan± informacjê:
+ EMAIL - adres e-mail, USERMASK - ostatnio u¿ywany host,
+ QUIT - ostatnia wiadomo¶æ po¿egnalna, STATUS - status
+ dostêpu do serwisów. Drugi argument okre¶la, czy dana
+ informacja bêdzie pokazywana (OFF), czy ukrywana (ON).
+NICK_HELP_SET_MSG
+ Sk³adnia: SET MSG {ON | OFF}
+
+ Pozwala wybraæ sposób w jaki serwisy bêd± pisaæ do
+ Ciebie. Kiedy ta opcja jest w³±czona serwisy bêd±
+ wysy³aæ wiadomo¶ci prywatne (query), w przeciwnym
+ wypadku bêd± wysy³aæ powiadomienia (notice).
+
+NICK_HELP_SET_AUTOOP
+ Sk³adnia: SET AUTOOP {ON | OFF}
+
+ W³±cza lub wy³±cza automatyczne nadawanie uprawnieñ
+ przy wchodzeniu na kana³.
+
+NICK_HELP_SASET
+ Sk³adnia: SASET nick opcja parametry.
+
+ Ustawia ró¿ne opcje nicka wskazanemu u¿ytkownikowi.
+ Dostêpne opcje to:
+
+ DISPLAY Ustawia nick reprezentuj±cy grupê nicków
+ PASSWORD Ustawia has³o do nicka
+ LANGUAGE Ustawia jêzyk w którym serwisy bêd±
+ wysy³a³y komunikaty
+ URL Przypisuje adres www do nicka
+ EMAIL Przypisuje adres e-mail do nicka
+ ICQ Przypisuje numer ICQ do nicka
+ GREET Przypisuje komunikat powitalny do nicka
+ KILL W³±cza lub wy³±cza ochronê nicka
+ SECURE W³±cza lub wy³±cza bezpieczeñstwo nicka
+ PRIVATE Zapobiega wy¶wietlaniu nicka po wydaniu
+ polecenia: %R%S LIST
+ HIDE Ukrywa poszczególne informacje o nicku
+ MSG Zmienia sposób komunikacji serwisów
+ AUTOOP W³±cza lub wy³±cza automatyczne opowanie
+ NOEXPIRE Zapobiega wyga¶niêciu nicka
+
+ Aby uzyskaæ wiêcej informacji o danej opcji wpisz:
+ %R%S HELP SASET opcja
+
+NICK_HELP_SASET_DISPLAY
+ Sk³adnia: SASET nick DISPLAY nowa-nazwa
+
+ Zmienia nazwê reprezentuj±c± grupê nicków wskazanego
+ u¿ytkownika na now±. Nazwa MUSI byæ jednym z nicków
+ nale¿±cych do tej grupy.
+
+NICK_HELP_SASET_PASSWORD
+ Sk³adnia: SASET nick PASSWORD nowe-has³o
+
+ Zmienia has³o wskazanemu u¿ytkownikowi.
+
+NICK_HELP_SASET_URL
+ Sk³adnia: SASET nick URL url
+
+ Przypisuje podany adres www wskazanemu u¿ytkownikowi.
+ Ten adres bêdzie siê pokazywa³ w opisie jego nicka
+ dostêpnym po u¿yciu polecenia INFO.
+
+NICK_HELP_SASET_EMAIL
+ Sk³adnia: SASET nick EMAIL adres
+
+ Przypisuje wskazanemu u¿ytkownikowi adres e-mail.
+
+NICK_HELP_SASET_ICQ
+ Sk³adnia: SASET nick ICQ numer
+
+ Przypisuje numer ICQ wskazanemu nickowi, który
+ bêdzie wy¶wietlany przy opisie nicka dostêpnym
+ przy u¿yciu komendy INFO.
+NICK_HELP_SASET_GREET
+ Sk³adnia: SASET nick GREET wiadomo¶æ
+
+ Ustawia wiadomo¶æ powitaln± dla wskazanego u¿ytkownika.
+ Je¶li kana³ ma przydzielonego bota, w³±czone witanie
+ oraz u¿ytkownik ma odpowiedni poziom dostêpu to
+ wtedy ta wiadomo¶æ bêdzie wysy³ana na kana³ przez bota.
+
+NICK_HELP_SASET_KILL
+ Sk³adnia: SASET nick KILL {ON | QUICK | IMMED | OFF}
+
+ W³±cza lub wy³±cza automatyczn± ochronê dla nicka.
+ U¿ytkownicy wchodz±cy na chroniony nick otrzymuj±
+ informacje od %S, ¿e nick jest zarejestrowany i
+ je¶li siê nie zidentyfikuj± lub go nie zmieni±
+ w okre¶lonym czasie to ich nick zostanie zmieniony
+ si³± lub zostan± od³±czeni od sieci.
+
+ Opcja QUICK skraca czas oczekiwania na zmianê
+ z 60 sekund do 20. W przypadku opcji IMMED
+ nick zostanie zmieniony natychmiast bez mo¿liwo¶ci
+ identyfikacji (wstêpna identyfikacja nastêpuje
+ na podstawie listy dostêpu, dlatego t± opcjê
+ nale¿y stosowaæ z rozwag±). Administrator sieci
+ mo¿e wy³±czyæ korzystanie z IMMED.
+NICK_HELP_SASET_SECURE
+ Sk³adnia: SASET nick SECURE {ON | OFF}
+
+ W³±cza lub wy³±cza opcjê bezpieczeñstwa dla nicka.
+ W³±czenie SECURE wymusza na u¿ytkowniku podanie
+ has³a zanim ten zostanie rozpoznany jako w³a¶ciciel
+ nicka. %S nie bierze pod uwagê w tym wypadku
+ wystêpowania adresu li¶cie dostêpu. Je¶li adres
+ znajduje siê na li¶cie %S nie skilluje
+ u¿ytkownika niezale¿nie od ustawienia opcji KILL.
+
+NICK_HELP_SASET_PRIVATE
+ Sk³adnia: SASET nick PRIVATE {ON | OFF}
+
+ W³±cza lub wy³±cza opcjê PRIVATE dla nicka.
+ Kiedy ta opcja jest w³±czona nick nie bêdzie
+ umieszczany na listach wy¶wietlanych komend±:
+ %R%S LIST
+ Jednak ka¿dy, kto zna nick mo¿e uzyskaæ o nim
+ informacje u¿ywaj±c polecenia INFO.
+
+NICK_HELP_SASET_HIDE
+ Sk³adnia: SASET nick HIDE {EMAIL | STATUS | USERMASK | QUIT} {ON | OFF}
+
+ To polecenie pozwala na ukrycie czê¶ci informacji, które
+ s± wy¶wietlane przez polecenie INFO serwisu %s.
+ Pierwszy argument okre¶la ukrywan± informacjê:
+ EMAIL - adres e-mail, USERMASK - ostatnio u¿ywany host,
+ QUIT - ostatnia wiadomo¶æ po¿egnalna, STATUS - status
+ dostêpu do serwisów. Drugi argument okre¶la, czy dana
+ informacja bêdzie pokazywana (OFF), czy ukrywana (ON).
+NICK_HELP_SASET_MSG
+ Sk³adnia: SASET nick MSG {ON | OFF}
+
+ Pozwala wybraæ sposób w jaki serwisy bêd± pisaæ do
+ wskazanego u¿ytkownika. Kiedy ta opcja jest
+ w³±czona serwisy bêd± wysy³aæ wiadomo¶ci prywatne
+ w przeciwnym wypadku bêd± wysy³aæ powiadomienia.
+
+NICK_HELP_SASET_NOEXPIRE
+ Sk³adnia: SASET nick NOEXPIRE {ON | OFF}
+
+ W³±cza lub wy³±cza automatyczne usuniêcie nicka,
+ je¶li nie bêdzie on u¿ywany.
+
+NICK_HELP_SASET_AUTOOP
+ Sk³adnia: SASET nick AUTOOP {ON | OFF}
+
+ W³±cza lub wy³±cza automatyczne nadawanie uprawnieñ
+ wskazanemu u¿ytkownikowi przy wchodzeniu na kana³.
+
+NICK_HELP_SASET_LANGUAGE
+ Sk³adnia: SASET nick LANGUAGE numer
+
+ Zmienia jêzyk jakiego u¿ywaj± serwisy komunikuj±c
+ siê ze wskazan± osob±. Numer musi byæ wybrany z
+ listy obs³ugiwanych jêzyków, która jest dostêpna
+ po wydaniu polecenia %R%S HELP SET LANGUAGE.
+
+NICK_HELP_RECOVER
+ Sk³adnia: RECOVER nick [has³o]
+
+ Pozwala na odzyskanie nicka je¶li jest on u¿ywany przez
+ inn± osobê. Wykonuje te same czynno¶ci co %S w
+ przypadku automatycznej ochrony nicka.
+
+ U¿ycie tej komendy powoduje wprowadzenie sztucznego
+ u¿ytkownika przez %S o nicku, który chcesz odzyskaæ.
+ Spowoduje to od³±czenie u¿ytkownika, który go aktualnie
+ u¿ywa. Serwis pozostanie przez minutê online, aby
+ uniemo¿liwiæ natychmiastowe po³±czenie z serwerem
+ na tym samym nicku. Po tym czasie mo¿esz zaj±æ nick.
+ Je¶li nie chcesz czekaæ minuty mo¿esz u¿yæ polecenia
+ RELEASE (%R%S HELP RELEASE).
+
+ Aby u¿yæ polecenia RECOVER musi byæ spe³niony jeden
+ z warunków:
+ 1. twój adres znajduje siê na li¶cie dostêpu,
+ 2. jeste¶ zidentyfikowany w grupie,
+ do której nale¿y wskazany nick,
+ 3. podasz prawid³owe has³o do nicka.
+
+NICK_HELP_RELEASE
+ Sk³adnia: RELEASE nick [has³o]
+
+ Instruuje %S aby zdj±³ wszelkie blokady na³o¿one
+ przez automatyczn± ochronê nicka lub w wyniku u¿ycia
+ polecenia RECOVER. Blokada trwa %s; to polecenie
+ pozwala j± skróciæ.
+
+ Aby u¿yæ polecenia RELEASE musi byæ spe³niony jeden
+ z warunków:
+ 1. twój adres znajduje siê na li¶cie dostêpu,
+ 2. jeste¶ zidentyfikowany w grupie,
+ do której nale¿y wskazany nick,
+ 3. podasz prawid³owe has³o do nicka.
+
+NICK_HELP_GHOST
+ Sk³adnia: GHOST nick [has³o]
+
+ Opcja likwiduje sesjê-ducha o wskazanym nicku.
+ Taka sytuacja najczê¶ciej ma miejsce wtedy, gdy
+ po³±czenie z serwem IRC nie zosta³o zakoñczone w
+ sposób prawid³owy (komputer siê zawiesi³ lub
+ wyst±pi³a awaria ³±cza internetowego). Serwer IRC
+ mo¿e wtedy nie rozpoznaæ zerwania po³±czenia i
+ bêdzie czeka³ okre¶lon± ilo¶æ czasu na odpowied¼
+ od klienta.
+
+ Aby u¿yæ polecenia GHOST musi byæ spe³niony jeden
+ z warunków:
+ 1. twój adres znajduje siê na li¶cie dostêpu,
+ 2. jeste¶ zidentyfikowany w grupie,
+ do której nale¿y wskazany nick,
+ 3. podasz prawid³owe has³o do nicka.
+
+NICK_HELP_INFO
+ Sk³adnia: INFO nick [ALL]
+
+ Wy¶wietla informacje na temat wybranego nicka:
+ w³a¶ciciel, kiedy ostatnio widziano, z jakiego
+ hosta oraz opcje nicka. Je¶li zidentyfikowany
+ u¿ytkownik u¿yje tej komendy na sobie wraz z
+ parametrem ALL otrzyma wszystkie mo¿liwe
+ informacje - nawet je¶li zosta³y one ukryte.
+
+NICK_HELP_LIST
+ Sk³adnia: LIST wzorzec
+
+ Listuje wszystkie zarejestrowane nicki pasuj±ce do
+ podanego wzorca w postaci nick!ident@host. Nicki z
+ w³±czon± opcj± PRIVATE zostan± pominiête.
+
+ Przyk³ady:
+
+ LIST *!adirm@mafia.ru
+ Lista wszystkich nicków pasuj±cych do
+ *!adirm@mafia.ru.
+
+ LIST *Bot*!*@*
+ Lista wszystkich nicków z Bot w nazwie
+ (wielko¶æ liter nie ma znaczenia).
+
+ LIST *!*@*.ircnet.pl
+ Lista wszystkich nicków z mask± domeny
+ ircnet.pl
+
+NICK_HELP_ALIST
+ Sk³adnia: ALIST [poziom]
+
+ Listuje wszystkie kana³y, gdzie masz wpis na li¶cie
+ dostêpu. Aby ograniczyæ listê pokazywanych kana³ów
+ mo¿esz podaæ poziom XOP lub numer
+
+ Przyk³ady:
+ ALIST Founder
+ Listuje kana³y, których jeste¶ w³a¶cicielem
+
+ ALIST AOP
+ Listuje kana³y, na których masz poziom
+ AOP lub wy¿szy.
+
+ ALIST 10
+ Listuje kana³y, na których masz poziom
+ 10. lub wy¿szy.
+
+ Kana³y z opcj± NOEXPIRE bêd± oznaczone wykrzyknikiem.
+NICK_HELP_GLIST
+ Sk³adnia: GLIST
+
+ Listuje wszystkie nicki z Twojej grupy.
+
+NICK_HELP_STATUS
+ Sk³adnia: STATUS nick...
+
+ Zwraca status wskazanych u¿ytkowników (czy s±
+ rozpoznawani jako w³a¶ciciele nicka).
+ Odpowied¼ ma nastêpuj±cy format:
+
+ nick kod
+
+ Gdzie nick jest tym nickiem wys³anym w
+ komendzie, a kod mo¿e oznaczaæ:
+
+ 0 - u¿ytkownik jest offline lub nick niezarejestrowany
+ 1 - u¿ytkownik nie zidentyfikowa³ siê jako w³a¶ciciel nicka
+ 2 - u¿ytkownik rozpoznany na podstawie listy dostêpu
+ 3 - u¿ytkownik rozpoznany na podstawie has³a
+
+ Maksymalnie mo¿na podaæ 16 nicków w jednym poleceniu.
+ Reszta bêdzie ignorowana. Je¶li nie zostanie podany
+ ¿aden nick zostanie zwrócony twój status.
+
+NICK_HELP_SENDPASS
+ Sk³adnia: SENDPASS nick
+
+ Wysy³a has³o do podanego nicka na adres e-mail
+ przypisany do niego. Ta komenda pomaga odzyskaæ
+ zapomniane has³o.
+
+ Ta komenda w niektórych sieciach mo¿e byæ dostêpna
+ jedynie dla osób z uprawnieniami IRC operatora.
+
+ Ta komenda jest niedostêpna kiedy has³a s± szyfrowane.
+
+NICK_HELP_CONFIRM
+ Sk³adnia: CONFIRM kod
+
+ To polecenie umo¿liwia zakoñczenie procesu rejestracji.
+ Aby nick zosta³ zarejestrowany w serwisie %S nale¿y
+ wywo³aæ to polecenie z kodem, który zosta³ wys³any na
+ adres e-mail podany podczas pierwszego kroku rejestracji.
+ Aby siê dowiedzieæ wiêcej wpisz %R%S HELP REGISTER
+
+NICK_HELP_RESEND
+ Sk³adnia: RESEND
+
+ To polecenie powoduje ponowne wys³anie kodu autoryzuj±cego
+ na adres e-mail u¿ytkownika, który wydaje polecenie.
+
+NICK_SERVADMIN_HELP
+
+ Administratorzy serwisów mog± usun±æ ka¿dy nick
+ bez potrzeby identyfikacji jako jego w³a¶ciciele
+ oraz przegl±daæ listê dostêpu do ka¿dego nicka
+ (%R%S ACCESS LIST nick).
+
+NICK_SERVADMIN_HELP_LOGOUT
+ Sk³adnia: LOGOUT [nick [REVALIDATE]]
+
+ Polecenie wydane bez parametrów odwraca dzia³anie
+ komendy IDENTIFY - nie bêdziesz rozpoznawany jako
+ w³a¶ciciel nicka.
+
+ Administrator serwisów mo¿e podaæ jako parametr nick
+ u¿ytkownika, który ma zostaæ wylogowany. Parametr
+ REVALIDATE powoduje informowanie przez serwisy
+ u¿ytkownika o potrzebie ponownej identyfikacji.
+
+NICK_SERVADMIN_HELP_DROP
+ Sk³adnia: DROP [nick]
+
+ Komenda wywo³ana bez parametru spowoduje usuniêcie
+ Twojego nicka z bazy serwisu %S.
+
+ Komenda u¿yta z parametrem usuwa wskazany nick.
+ Ka¿dy u¿ytkownik mo¿e usuwaæ nicki znajduj±ce siê
+ w jego grupie bez specjalnych uprawnieñ. Usuwanie
+ dowolnego nicka jest ograniczone do administratorów.
+
+NICK_SERVADMIN_HELP_INFO
+
+ Administratorzy serwisów mog± u¿ywaæ parametru
+ ALL dla ka¿dego nicka.
+
+NICK_SERVADMIN_HELP_LIST
+ Sk³adnia: LIST wzorzec [FORBIDDEN] [SUSPENDED] [NOEXPIRE] [UNCONFIRMED]
+
+ Listuje wszystkie zarejestrowane nicki pasuj±ce
+ do podanego wzorca w postaci nick!ident@host.
+ Administratorzy serwisów mog± zobaczyæ nicki z
+ ustawion± opcj± PRIVATE, a przy nickach z opcj±
+ NOEXPIRE zobacz± dodany do nich wykrzyknik.
+
+ Administratorzy serwisów mog± tak¿e podaæ parametry:
+ FORBIDDEN, SUSPENDED, NOEXPIRE i UNCONFIRMED, które
+ ogranicz± listê wy¶wietlanych nicków do tych, które
+ spe³niaj± podane warunki. Je¶li zostanie podanych
+ wiêcej warunków, wszystkie nicki spe³niaj±ce choæ
+ jeden z nich zostan± pokazane.
+
+ Przyk³ady:
+
+ LIST *!adirm@mafia.ru
+ Lista wszystkich nicków pasuj±cych do
+ *!adirm@mafia.ru.
+
+ LIST *Bot*!*@*
+ Lista wszystkich nicków z Bot w nazwie
+ (wielko¶æ liter nie ma znaczenia).
+
+ LIST *!*@*.ircnet.pl
+ Lista wszystkich nicków z mask± domeny
+ ircnet.pl
+
+NICK_SERVADMIN_HELP_ALIST
+ Sk³adnia: ALIST [nick] [poziom]
+
+ Listuje wszystkie kana³y na których jeste¶ na li¶cie
+ dostêpu. Opcjonalnie mo¿esz podaæ nick wraz z poziomem,
+ co ograniczy ilo¶æ pokazywanych wpisów.
+
+ Parametr nick jest przeznaczony tylko dla
+ administratorów serwisów.
+
+NICK_SERVADMIN_HELP_GLIST
+ Sk³adnia: GLIST [nick]
+
+ Polecenie wywo³ane bez parametrów listuje wszystkie
+ nicki nale¿±ce do grupy wydaj±cego polecenie.
+
+ Administratorzy serwisów mog± jako parametr podaæ
+ nick osoby, której nicki chc± sprawdziæ.
+
+NICK_SERVADMIN_HELP_GETPASS
+ Sk³adnia: GETPASS nick
+
+ Zwraca has³o w³a¶ciciela dla wskazanego nicka.
+ UWAGA: u¿ycie tej komendy powoduje wys³anie
+ informacji o jej u¿yciu przy pomocy WALLOP/GLOBOP.
+
+ Ta komenda jest niedostêpna kiedy has³a s± szyfrowane.
+
+NICK_SERVADMIN_HELP_GETEMAIL
+ Sk³adnia: GETEMAIL uzytkownik@serwer.com
+
+ Listuje nicki, które maj± ustawiony podany adres e-mail.
+ Uwaga: nie mo¿na u¿ywaæ symboli wieloznacznych (* lub ?).
+ Ka¿dy przypadek u¿ycia tej komendy jest logowany.
+
+NICK_SERVADMIN_HELP_FORBID
+ Sk³adnia: FORBID nick [powód]
+
+ Uniemo¿liwia rejestracjê i korzystanie ze wskazanego
+ nicka. Blokadê mo¿na zdj±æ u¿ywaj±c komendy DROP.
+
+ W niektórych sieciach wymagane jest podanie powodu.
+
+NICK_SERVADMIN_HELP_SUSPEND
+ Sk³adnia: SUSPEND nick powód
+
+ Zawiesza nick uniemo¿liwiaj±c identyfikacjê.
+
+NICK_SERVADMIN_HELP_UNSUSPEND
+ Sk³adnia: UNSUSPEND nick
+
+ Uwalnia zawieszony nick.
+
+###########################################################################
+#
+# ChanServ help messages
+#
+###########################################################################
+CHAN_HELP_CMD_GETPASS
+ GETPASS Podaje has³o w³a¶ciciela wskazanego kana³u
+
+CHAN_HELP_CMD_FORBID
+ FORBID Blokuje podany kana³
+
+CHAN_HELP_CMD_SUSPEND
+ SUSPEND Blokuje podany kana³ z zachowaniem
+ wszelkich jego danych i ustawieñ
+
+CHAN_HELP_CMD_UNSUSPEND
+ UNSUSPEND Uwalnia zawieszony kana³
+
+CHAN_HELP_CMD_STATUS
+ STATUS Zwraca aktualny poziom dostêpu do
+ kana³u wskazanego u¿ytkownika
+
+CHAN_HELP_CMD_REGISTER
+ REGISTER Rejestruje kana³
+
+CHAN_HELP_CMD_IDENTIFY
+ IDENTIFY Identyfikuje w³a¶ciciela kana³u
+
+CHAN_HELP_CMD_SET
+ SET Modyfikuje ustawienia kana³u
+
+CHAN_HELP_CMD_AOP
+ AOP Zarz±dza list± AOP (operatorów)
+
+CHAN_HELP_CMD_SOP
+ SOP Zarz±dza list± SOP (super-operatorów)
+
+CHAN_HELP_CMD_ACCESS
+ ACCESS Zarz±dza list± dostêpu
+
+CHAN_HELP_CMD_LEVELS
+ LEVELS Zarz±dza poziomami dostêpu
+
+CHAN_HELP_CMD_AKICK
+ AKICK Zarz±dza list± AKICK
+
+CHAN_HELP_CMD_DROP
+ DROP Usuwa kana³
+
+CHAN_HELP_CMD_SENDPASS
+ SENDPASS Pomaga odzyskaæ utracone has³o
+
+CHAN_HELP_CMD_BAN
+ BAN Banuje wskazan± osobê na kanale
+
+CHAN_HELP_CMD_CLEAR
+ CLEAR Usuwa wskazane obiekty z kana³u
+
+CHAN_HELP_CMD_DEVOICE
+ DEVOICE Odbiera wskazanej osobie prawo g³osu
+
+CHAN_HELP_CMD_GETKEY
+ GETKEY Podaje klucz do wskazanego kana³u
+
+CHAN_HELP_CMD_INFO
+ INFO Pokazuje informacje o zarejestrowanym kanale
+
+CHAN_HELP_CMD_INVITE
+ INVITE Zaprasza Ciebie lub wskazany nick na kana³
+
+CHAN_HELP_CMD_KICK
+ KICK Wyrzuca wskazany nick z kana³u
+
+CHAN_HELP_CMD_LIST
+ LIST Listuje zarejestrowane kana³y pasuj±ce do wzorca
+
+CHAN_HELP_CMD_LOGOUT
+ LOGOUT Wyloguje wskazan± osobê
+
+CHAN_HELP_CMD_OP
+ OP Nadaje wskazanej osobie uprawnienia operatora
+
+CHAN_HELP_CMD_TOPIC
+ TOPIC Zmienia temat podanego kana³u
+
+CHAN_HELP_CMD_UNBAN
+ UNBAN Usuwa wszystkie bany blokuj±ce wej¶cie na kana³
+
+CHAN_HELP_CMD_VOICE
+ VOICE Nadaje wskazanej osobie prawo g³osu
+
+CHAN_HELP_CMD_VOP
+ VOP Zarz±dza list± VOP (osób z prawem g³osu)
+
+CHAN_HELP_CMD_DEHALFOP
+ DEHALFOP Odbiera wskazanej osobie uprawnienia pó³-operatora
+
+CHAN_HELP_CMD_DEOWNER
+ DEOWNER Usuwa twój status w³a¶ciciela kana³u
+
+CHAN_HELP_CMD_DEPROTECT
+ DEPROTECT Wy³±cza ochronê wskazanej osoby
+
+CHAN_HELP_CMD_HALFOP
+ HALFOP Nadaje wskazanej osobie uprawnienia pó³-operatora
+
+CHAN_HELP_CMD_HOP
+ HOP Zarz±dza list± HOP (pó³-operatorów)
+
+CHAN_HELP_CMD_OWNER
+ OWNER Nadaje Tobie status w³a¶ciciela kana³u
+
+CHAN_HELP_CMD_PROTECT
+ PROTECT Chroni wskazan± osobê
+
+CHAN_HELP_CMD_ADMIN
+ ADMIN Chroni wskazan± osobê
+
+CHAN_HELP_CMD_DEADMIN
+ DEADMIN Wy³±cza ochronê wskazanej osoby
+
+CHAN_HELP_CMD_DEOP
+ DEOP Odbiera wskazanej osobie uprawnienia operatora
+
+CHAN_HELP
+ %S umo¿liwia rejestracjê kana³u, zmianê
+ jego ustawieñ oraz zapobiega przed odebraniem
+ kontroli nad kana³em. Poni¿sze komendy pozwalaj±
+ na zarz±dzanie kana³em, aby ich u¿yæ wpisz:
+ %R%S komenda
+ Aby uzyskaæ szczegó³owy opis polecenia wpisz:
+ %R%S HELP komenda
+
+
+CHAN_HELP_EXPIRES
+
+ Uwaga! Kana³ który nie by³ u¿ywany przez %d dni
+ (np. nie odwiedzi³ go ¿aden u¿ytkownik umieszczony
+ na li¶cie dostêpu kana³u w tym czasie) zostanie
+ automatycznie odrejestrowany.
+
+CHAN_HELP_REGISTER
+ Sk³adnia: REGISTER kana³ has³o opis
+
+ Rejestruje kana³ w bazie danych %S. Aby u¿yæ
+ tej komendy musisz byæ operatorem na kanale, który
+ chcesz zarejestrowaæ. Has³o umo¿liwia pó¼niejsz±
+ identyfikacjê jako w³a¶ciciel kana³u (IDENTIFY).
+ Ostatni parametr, który musi zostaæ podany, okre¶la
+ cel istnienia kana³u.
+
+ Po rejestracji kana³u stajesz siê jego w³a¶cicielem,
+ który mo¿e zmieniaæ wszystkie jego ustawienia.
+ %S automatycznie nadaje uprawnienia operatora
+ w³a¶cicielowi, który wchodzi na kana³. Informacje
+ na temat nadawania uprawnieñ innym u¿ytkownikom
+ znajduj± siê w pomocy polecenia ACCESS
+ (%R%S HELP ACCESS).
+
+ UWAGA: Aby zarejestrowaæ kana³ nale¿y posiadaæ
+ zarejestrowany nick, aby uzyskaæ wiêcej informacji
+ na temat zarz±dzania nickiem wpisz: %R%s HELP
+
+CHAN_HELP_IDENTIFY
+ Sk³adnia: IDENTIFY kana³ has³o
+
+ Autoryzuje u¿ytkownika w serwisie %S jako w³a¶ciciela
+ wskazanego kana³u. Wiele wa¿nych komend wymaga dokonania
+ identyfikacji przed ich u¿yciem. Has³em jest to samo
+ has³o, którego u¿yto przy komendzie REGISTER.
+
+CHAN_HELP_LOGOUT
+ Sk³adnia: LOGOUT kana³ nick
+
+ Pozwala na wylogowanie wskazanego u¿ytkownika z kana³u.
+ W celu odzyskania uprawnieñ u¿ytkownik bêdzie musia³
+ ponownie siê zidentyfikowaæ.
+
+ Ka¿dy mo¿e wylogowaæ siebie, natomiast w³a¶ciciel kana³u
+ mo¿e wylogowaæ ka¿dego.
+
+CHAN_HELP_DROP
+ Sk³adnia: DROP kana³
+
+ Usuwa podany kana³. Komenda mo¿e zostaæ u¿yta
+ jedynie przez w³a¶ciciela kana³u, po wcze¶niejszej
+ IDENTIFYKACJI przy pomocy has³a kana³u.
+
+CHAN_HELP_SET
+ Sk³adnia: SET kana³ opcja parametry
+
+ Pozwala w³a¶cicielowi kana³u na zmianê ro¿nych
+ opcji oraz informacji dotycz±cych kana³u.
+
+ Dostêpne opcje:
+
+ FOUNDER Ustawia nick w³a¶ciciela kana³u
+ SUCCESSOR Ustawia nick spadkobiercy kana³u
+ PASSWORD Ustawia has³o w³a¶ciciela
+ DESC Ustawia opis kana³u
+ URL Przypisuje adres www do kana³u
+ EMAIL Przypisuje adres e-mail do kana³u
+ ENTRYMSG Ustawia wiadomo¶æ, która bêdzie wysy³ana
+ do u¿ytkowników wchodz±cych na kana³
+ BANTYPE Ustawia sposób banowania przez serwisy
+ MLOCK Blokuje zdejmowanie lub zak³adanie flag
+ KEEPTOPIC Zapamiêtuje temat kiedy kana³ jest pusty
+ OPNOTICE Wysy³a powiadomienie kiedy zostaj± u¿yte
+ komendy OP/DEOP
+ PEACE Reguluje u¿ycie krytycznych komend
+ PRIVATE Zapobiega wy¶wietlaniu kana³u po wydaniu
+ polecenia LIST
+ RESTRICTED Ogranicza dostêp do kana³u
+ SECURE W³±cza lub wy³±cza bezpieczeñstwo kana³u
+ SECUREOPS ¦ci¶le kontroluje status operatorów
+ SECUREFOUNDER ¦ci¶le kontroluje status w³a¶ciciela
+ SIGNKICK Podpisuje kicki kiedy u¿yto komendy KICK
+ TOPICLOCK Ogranicza mo¿liwo¶æ zmiany tematu
+ XOP W³±cza system uprawnieñ xOP
+ (u¿ycie komend SOP, AOP, HOP, VOP)
+
+ Aby uzyskaæ wiêcej informacji o danej opcji wpisz:
+ %R%S HELP SET opcja
+
+CHAN_HELP_SET_FOUNDER
+ Sk³adnia: SET kana³ FOUNDER nick
+
+ Zmienia w³a¶ciciela kana³u.
+ Nowy nick musi byæ zarejestrowany.
+
+CHAN_HELP_SET_SUCCESSOR
+ Sk³adnia: SET kana³ SUCCESSOR nick
+
+ Ustawia spadkobiercê kana³u. Je¶li nick w³a¶ciciela
+ wyga¶nie lub zostanie usuniêty kana³ zostaje przekazany
+ spadkobiercy, który staje siê nowym w³a¶cicielem.
+ Je¿eli spadkobierca jest w³a¶cicielem zbyt du¿ej
+ liczby kana³ów (%d) to kana³ zostanie odrejestrowany.
+CHAN_HELP_SET_PASSWORD
+ Sk³adnia: SET kana³ PASSWORD has³o
+
+ Zmienia has³o w³a¶ciciela kana³u.
+
+CHAN_HELP_SET_DESC
+ Sk³adnia: SET kana³ DESC opis
+
+ Ustawia opis kana³u widoczny po wydaniu polecenia LIST oraz INFO.
+
+CHAN_HELP_SET_URL
+ Sk³adnia: SET kana³ URL [url]
+
+ Przypisuje adres strony www do kana³u. Adres bêdzie
+ widoczny po u¿yciu polecenia INFO. Komenda wywo³ana
+ bez parametru usuwa wcze¶niej ustawiony adres.
+
+CHAN_HELP_SET_EMAIL
+ Sk³adnia: SET kana³ EMAIL [adres]
+
+ Przypisuje adres e-mail do kana³u. Adres bêdzie
+ widoczny po u¿yciu polecenia INFO. Komenda wywo³ana
+ bez parametru usuwa wcze¶niej ustawiony adres.
+
+CHAN_HELP_SET_ENTRYMSG
+ Sk³adnia: SET kana³ ENTRYMSG [tre¶æ]
+
+ Ustawia tekst powiadomienia wysy³anego poprzez /notice
+ do u¿ytkowników wchodz±cych na kana³. Komenda wywo³ana
+ bez parametru usuwa wcze¶niej ustawion± wiadomo¶æ.
+
+CHAN_HELP_SET_BANTYPE
+ Sk³adnia: SET kana³ BANTYPE typ
+
+ Ustala typ banów zak³adanych przez serwisy.
+
+ Typ banów oznaczany jest numerami od 0 do 3,
+ poszczególne numery oznaczaj±:
+
+ 0: ban w postaci *!ident@host
+ 1: ban w postaci *!*ident@host
+ 2: ban w postaci *!*@host
+ 3: ban w postaci *!*ident@*.domena
+
+CHAN_HELP_SET_KEEPTOPIC
+ Sk³adnia: SET kana³ KEEPTOPIC {ON | OFF}
+
+ W³±cza lub wy³±cza opcjê zapamiêtywania tematu.
+ Kiedy ta opcja jest w³±czona %S ustawi ostatni
+ temat za ka¿dym razem, gdy na kana³ bêdzie wchodziæ
+ pierwsza osoba.
+
+CHAN_HELP_SET_TOPICLOCK
+ Sk³adnia: SET kana³ TOPICLOCK {ON | OFF}
+
+ W³±cza lub wy³±cza opcjê blokowania tematu kana³u.
+
+ Je¶li ta opcja jest w³±czona, %S pozwoli na
+ zmianê tematu tylko poprzez wydanie komendy TOPIC.
+
+CHAN_HELP_SET_MLOCK
+ Sk³adnia: SET kana³ MLOCK flagi
+
+ Ustawia blokadê flag kana³owych. %S pozwala na
+ definiowanie, które flag kana³owe maj± byæ zawsze
+ w³±czone, wy³±czone lub ustawiane dowolnie przez
+ operatorów kana³u.
+
+ Sk³adnia polecenia jest identyczna jak w komendzie
+ /MODE, tzn. flagi poprzedzone znakiem+
+ zostan± za³o¿one na kana³, natomiast poprzedzone
+ znakiem - bêd± zdejmowane z kana³u. W odró¿nieniu
+ od komendy /MODE, ka¿de u¿ycie SET MLOCK,
+ usunie wszystkie wcze¶niej zdefiniowane mody!
+
+ UWAGA: W przypadku ustawiania klucza dostêpu do
+ kana³u (drugi przyk³ad poni¿ej), powinna równie¿
+ zostaæ aktywowana opcja RESTRICTED (zobacz
+ HELP SET RESTRICTED), w przeciwnym wypadku,
+ u¿ytkownik wchodz±cy na pusty kana³, bêdzie móg³
+ odczytaæ za³o¿ony klucz!
+
+ Przyk³ady:
+
+ SET #kana³ MLOCK +nt-iklps
+ Wymusza w³±czenie flag n oraz t, wy³±czenie flag
+ i, k, l, p, s; flaga m nie jest zmieniana.
+
+ SET #kana³ MLOCK +knst-ilmp my-key
+ Wymusza w³±czenie flag k, n, s, oraz t, wy³±czenie
+ i, l, m, oraz p. Wymusza tak¿e ustawienie klucza
+ na warto¶æ "my-key".
+
+ SET #kana³ MLOCK +
+ Wy³±cza blokowanie flag - mog± byæ zmieniane dowolnie.
+
+CHAN_HELP_SET_PEACE
+ Sk³adnia: SET kana³ PEACE {ON | OFF}
+
+ W³±cza lub wy³±cza opcjê PEACE dla kana³u.
+ W³±czenie tej opcji uniemo¿liwia wykopanie,
+ banowanie lub odebranie uprawnieñ u¿ytkownikowi,
+ który ma poziom uprawnieñ wy¿szy lub równy
+ korzystaj±c z poleceñ serwisu %S.
+
+CHAN_HELP_SET_PRIVATE
+ Sk³adnia: SET kana³ PRIVATE {ON | OFF}
+
+ W³±cza lub wy³±cza opcjê PRIVATE dla kana³u.
+ Kiedy ta opcja jest w³±czona kana³ nie bêdzie
+ umieszczany na listach wy¶wietlanych komend±:
+ %R%S LIST
+
+CHAN_HELP_SET_RESTRICTED
+ Sk³adnia: SET kana³ RESTRICTED {ON | OFF}
+
+ W³±cza lub wy³±cza ograniczenie dostêpu do kana³u.
+ W³±czenie tej opcji powoduje usuwanie z kana³u
+ u¿ytkowników, którzy nie maj± uprawnieñ operatora.
+ Przy w³±czonej opcji secure ops u¿ytkownicy bez
+ zdefiniowanego poziomu dostêpu oraz z ujemnym poziomem
+ tak¿e bêd± usuwani.
+
+CHAN_HELP_SET_SECURE
+ Sk³adnia: SET kana³ SECURE {ON | OFF}
+
+ W³±cza lub wy³±cza opcje bezpieczeñstwa kana³u.
+ Po w³±czeniu tej opcji tylko zarejestrowani
+ u¿ytkownicy, którzy siê zidentyfikowali bêd±
+ otrzymywaæ od serwisu %S uprawnienia
+ wynikaj±ce z wpisów na li¶cie dostêpu.
+
+CHAN_HELP_SET_SECUREOPS
+ Sk³adnia: SET kana³ SECUREOPS {ON | OFF}
+
+ W³±cza lub wy³±cza opcjê SECUREOPS dla kana³u.
+ Kiedy ta opcja jest w³±czona u¿ytkownicy bez wpisu
+ na li¶cie dostêpu kana³u (ACCESS LIST) nie bêd±
+ mogli posiadaæ statusu operatora.
+
+CHAN_HELP_SET_SECUREFOUNDER
+ Sk³adnia: SET kana³ SECUREFOUNDER {ON | OFF}
+
+ W³±cza lub wy³±cza opcjê bezpiecznego w³a¶ciciela.
+ Ustawienie tej opcji powoduje ograniczenie uprawnieñ
+ w³a¶ciciela do osoby, która jest wpisana jako w³a¶ciciel
+ (a nie osób znaj±cych has³o w³a¶ciciela kana³u).
+ Operacje takie jak usuniêcie kana³u, zmiana has³a,
+ w³a¶ciciela oraz zastêpcy bêd± dostêpne tylko
+ dla jednego u¿ytkownika.
+
+CHAN_HELP_SET_SIGNKICK
+ Sk³adnia: SET kana³ SIGNKICK {ON | LEVEL | OFF}
+
+ W³±cza lub wy³±cza podpisywanie komend kick.
+ W³±czenie tej opcji powoduje dodawanie nicka osoby
+ wydaj±cej polecenie do uzasadnienia kicka.
+
+ Je¶li poziomy dostêpu by³y konfigurowane z u¿yciem LEVEL
+ osoby maj±ce poziom wiêkszy lub równy SIGNKICK nie bêd±
+ podpisywane. Aby uzyskaæ wiêcej informacji wpisz:
+ %R%S HELP LEVELS
+
+CHAN_HELP_SET_XOP
+ Sk³adnia: SET kana³ XOP {ON | OFF}
+
+ W³±cza lub wy³±cza system list xOP dla kana³u.
+ Kiedy XOP zostanie w³±czony przyznawanie uprawnieñ
+ odbywa siê przy pomocy poleceñ AOP/ SOP/ VOP.
+ Wy³±czenie funkcji xOP wymusza korzystanie z
+ polecenia ACCESS.
+
+ Uwaga: w momencie w³±czania systemu list XOP
+ wszelkie definicje poziomów dostêpu zostan±
+ trwale zresetowane. Ponowne przej¶cie z XOP na
+ system listy dostêpu nie spowoduje odzyskania
+ poprzedniej konfiguracji!
+
+ Kiedy XOP zostanie w³±czony u¿ytkownikom
+ automatycznie zostaje przypisany odpowiedni poziom
+ dostêpu. Automatyczne przyporz±dkowanie nie zawsze
+ musi byæ poprawne. Nie zaleca siê przej¶cia na
+ system XOP, je¶li definicje poziomów dostêpu dla
+ kana³u zosta³y wcze¶niej zmodyfikowane przy pomocy
+ polecenia LEVELS.
+
+
+CHAN_HELP_SET_OPNOTICE
+ Sk³adnia: SET kana³ OPNOTICE {ON | OFF}
+
+ W³±cza lub wy³±cza opcjê OPNOTICE dla kana³u.
+ Kiedy ta opcja jest w³±czona, %S bêdzie
+ informowa³ u¿ytkowników przebywaj±cych na kanale,
+ kiedy zostanie u¿yta komenda OP lub DEOP.
+
+CHAN_HELP_AOP
+ Sk³adnia: AOP kana³ ADD nick
+ AOP kana³ DEL {nick | numer | lista}
+ AOP kana³ LIST [maska | lista]
+ AOP kana³ CLEAR
+
+ Zarz±dza list± AOP (AutoOP) dla kana³u.
+ U¿ytkownicy wpisani na t± listê bêd± otrzymywaæ
+ automatycznie status operatora, maj± prawo siê
+ odbanowaæ i zaprosiæ je¶li jest taka potrzeba itd.
+
+ Komenda AOP ADD dodaje podany nick do listy AOP.
+
+ Komenda AOP DEL usuwa wskazane wpisy z listy.
+ Jako argument przyjmuje nick, numer wpisu lub
+ listê (przyk³ad poni¿ej dla polecenia LIST).
+
+ Komenda AOP LIST wy¶wietla zawarto¶æ listy AOP.
+ Parametr maska pozwala filtrowaæ wy¶wietlane wpisy
+ (symbol * zastêpuje dowolny ci±g znaków w nicku).
+ Jako parametr mo¿na te¿ podaæ numery wpisów na li¶cie:
+
+ AOP kana³ LIST 2-5,7-9
+ Wy¶wietli wpisy na li¶cie od numeru 2 do 5 oraz
+ od 7 do 9.
+
+ Komenda AOP CLEAR usuwa wszystkie wpisy z listy.
+
+ Komendy AOP ADD oraz AOP DEL s± dostêpne dla
+ u¿ytkowników z uprawnieniami SOP lub wy¿szymi.
+ Komenda AOP CLEAR jest dostêpna dla w³a¶ciciela
+ kana³u. Wszyscy u¿ytkownicy wpisani na listê AOP
+ mog± u¿ywaæ komendy AOP LIST.
+
+ Komenda AOP mo¿e byæ wy³±czona dla Twojego kana³u,
+ w takim przypadku nale¿y u¿ywaæ komendy ACCESS.
+ Aby uzyskaæ informacje o komendzie ACCESS wpisz:
+ %R%S HELP ACCESS
+ Aby dowiedzieæ siê jak w³±czyæ tryb xOP wpisz:
+ %R%S HELP SET XOP
+
+CHAN_HELP_HOP
+ Sk³adnia: HOP kana³ ADD nick
+ HOP kana³ DEL {nick | numer | lista}
+ HOP kana³ LIST [maska | lista]
+ HOP kana³ CLEAR
+
+ Zarz±dza list± HOP (HalfOP) dla kana³u.
+ U¿ytkownicy wpisani na t± listê bêd± otrzymywaæ
+ automatycznie status pó³-operatora.
+
+ Komenda HOP ADD dodaje podany nick do listy HOP.
+
+ Komenda HOP DEL usuwa wskazane wpisy z listy.
+ Jako argument przyjmuje nick, numer wpisu lub
+ listê (przyk³ad poni¿ej dla polecenia LIST).
+
+ Komenda HOP LIST wy¶wietla zawarto¶æ listy HOP.
+ Parametr maska pozwala filtrowaæ wy¶wietlane wpisy
+ (symbol * zastêpuje dowolny ci±g znaków w nicku).
+ Jako parametr mo¿na te¿ podaæ numery wpisów na li¶cie:
+
+ HOP kana³ LIST 2-5,7-9
+ Wy¶wietli wpisy na li¶cie od numeru 2 do 5 oraz
+ od 7 do 9.
+
+ Komenda HOP CLEAR usuwa wszystkie wpisy z listy.
+
+ Komendy HOP ADD, HOP DEL oraz HOP LIST s± dostêpne
+ dla u¿ytkowników z uprawnieniami AOP lub wy¿szymi.
+ Komenda HOP CLEAR jest dostêpna tylko dla
+ w³a¶ciciela kana³u.
+
+ Komenda HOP mo¿e byæ wy³±czona dla Twojego kana³u,
+ w takim przypadku nale¿y u¿ywaæ komendy ACCESS.
+ Aby uzyskaæ informacje o komendzie ACCESS wpisz:
+ %R%S HELP ACCESS
+ Aby dowiedzieæ siê jak w³±czyæ tryb xOP wpisz:
+ %R%S HELP SET XOP
+
+CHAN_HELP_SOP
+ Sk³adnia: SOP kana³ ADD nick
+ SOP kana³ DEL {nick | numer | lista}
+ SOP kana³ LIST [maska | lista]
+ SOP kana³ CLEAR
+
+ Zarz±dza list± SOP (SuperOP) dla kana³u.
+ U¿ytkownicy wpisani na t± listê bêd± otrzymywaæ
+ automatycznie status operatora.
+
+ Komenda SOP ADD dodaje podany nick do listy SOP.
+
+ Komenda SOP DEL usuwa wskazane wpisy z listy.
+ Jako argument przyjmuje nick, numer wpisu lub
+ listê (przyk³ad poni¿ej dla polecenia LIST).
+
+ Komenda SOP LIST wy¶wietla zawarto¶æ listy SOP.
+ Parametr maska pozwala filtrowaæ wy¶wietlane wpisy
+ (symbol * zastêpuje dowolny ci±g znaków w nicku).
+ Jako parametr mo¿na te¿ podaæ numery wpisów na li¶cie:
+
+ SOP kana³ LIST 2-5,7-9
+ Wy¶wietli wpisy na li¶cie od numeru 2 do 5 oraz
+ od 7 do 9.
+
+ Komenda SOP CLEAR usuwa wszystkie wpisy z listy.
+
+ Komendy SOP ADD, SOP DEL oraz SOP CLEAR s±
+ dostêpne tylko dla w³a¶ciciela kana³u.
+ Komenda SOP LIST jest dostêpna dla
+ u¿ytkowników wpisanych na listê AOP.
+
+ Komenda SOP mo¿e byæ wy³±czona dla Twojego kana³u,
+ w takim przypadku nale¿y u¿ywaæ komendy ACCESS.
+ Aby uzyskaæ informacje o komendzie ACCESS wpisz:
+ %R%S HELP ACCESS
+ Aby dowiedzieæ siê jak w³±czyæ tryb xOP wpisz:
+ %R%S HELP SET XOP
+
+CHAN_HELP_VOP
+ Sk³adnia: VOP kana³ ADD nick
+ VOP kana³ DEL {nick | numer | lista}
+ VOP kana³ LIST [maska | lista]
+ VOP kana³ CLEAR
+
+ Zarz±dza list± VOP (VOicePeople) dla kana³u.
+ U¿ytkownicy wpisani na t± listê bêd± otrzymywaæ
+ automatycznie prawo g³osu i bêd± mogli je sobie
+ nadaæ je¶li bêdzie taka potrzeba.
+
+ Komenda VOP ADD dodaje podany nick do listy VOP.
+
+ Komenda VOP DEL usuwa wskazane wpisy z listy.
+ Jako argument przyjmuje nick, numer wpisu lub
+ listê (przyk³ad poni¿ej dla polecenia LIST).
+
+ Komenda VOP LIST wy¶wietla zawarto¶æ listy VOP.
+ Parametr maska pozwala filtrowaæ wy¶wietlane wpisy
+ (symbol * zastêpuje dowolny ci±g znaków w nicku).
+ Jako parametr mo¿na te¿ podaæ numery wpisów na li¶cie:
+
+ VOP kana³ LIST 2-5,7-9
+ Wy¶wietli wpisy na li¶cie od numeru 2 do 5 oraz
+ od 7 do 9.
+
+ Komenda VOP CLEAR usuwa wszystkie wpisy z listy.
+
+ Komendy VOP ADD, VOP DEL oraz VOP LIST s± dostêpne
+ dla u¿ytkowników z uprawnieniami AOP lub wy¿szymi.
+ Komenda VOP CLEAR jest dostêpna tylko dla
+ w³a¶ciciela kana³u.
+
+ Komenda VOP mo¿e byæ wy³±czona dla Twojego kana³u,
+ w takim przypadku nale¿y u¿ywaæ komendy ACCESS.
+ Aby uzyskaæ informacje o komendzie ACCESS wpisz:
+ %R%S HELP ACCESS
+ Aby dowiedzieæ siê jak w³±czyæ tryb xOP wpisz:
+ %R%S HELP SET XOP
+
+CHAN_HELP_ACCESS
+ Sk³adnia: ACCESS kana³ ADD nick level
+ ACCESS kana³ DEL {nick | numer | list}
+ ACCESS kana³ LIST [maska | list]
+ ACCESS kana³ CLEAR
+
+ Polecenie pozwala na zarz±dzanie wpisami w kana³owej
+ li¶cie dostêpu (access list). Ustalony poziom
+ dostêpu okre¶la, którzy u¿ytkownicy mog± pe³niæ
+ funkcje operatorów kana³u, oraz posiadaæ dostêp do
+ komend %S. Ró¿ne poziomy okre¶laj± inne
+ przywileje.
+ Napisz msg %R%S HELP ACCESS LEVELS,
+ aby uzyskaæ wiêcej informacji. Ka¿dy u¿ytkownik,
+ który nie zosta³ wpisany na listê dostêpu, posiada
+ poziom uprawnieñ równy 0.
+
+ Polecenie ACCESS ADD dodaje podany nick do listy z
+ okre¶lonym poziomem dostêpu. Je¶li nick jest ju¿
+ wpisany na li¶cie, jego poziom dostêpu zostanie
+ zmieniony zgodnie z podanym parametrem. Przyznawany
+ poziom dostêpu nie mo¿e byæ wy¿szy ni¿ poziom osoby
+ wydaj±cej komendê ADD.
+
+ Polecenie ACCESS DEL usuwa wskazane wpisy z listy.
+ Jako argument przyjmuje nick, numer wpisu lub
+ listê (przyk³ad poni¿ej dla polecenia LIST).
+
+ Polecenie ACCESS LIST wy¶wietla zawarto¶æ listy.
+ Parametr maska pozwala zawêziæ wynik polecenia
+ do jedynie tych wpisów, których host pasuje do
+ wskazanej w komendzie maski (dozwolone jest u¿ywanie
+ znaku * - zastêpuje on dowolny ci±g znaków).
+ Jako parametr mo¿na podaæ tak¿e numery wpisów na
+ li¶cie, na przyk³ad:
+
+ ACCESS kana³ LIST 2-5,7-9
+ Wy¶wietli wpisy na li¶cie od numeru 2 do 5, oraz
+ od 7 do 9.
+
+ Polecenie ACCESS CLEAR usuwa wszystkie wpisy z listy.
+
+CHAN_HELP_ACCESS_LEVELS
+ Poziomy dostêpu u¿ytkowników:
+
+ Standardowe poziomy dostêpu zosta³y podane poni¿ej:
+ Founder Pe³ny dostêp do poleceñ %S.
+ Automatyczne nadawanie statusu operatora.
+ UWAGA: tylko jedna osoba mo¿e byæ
+ w³a¶cicielem (Founder) kana³u.
+ Nie mo¿na nadaæ tego uprawnienia
+ za pomoc± polecenia ACCESS.
+  10 Dostêp do polecenia AKICK,
+ Automatyczne nadawanie statusu operatora.
+  5 Automatyczne nadawanie statusu operatora.
+  3 Automatyczne nadawanie prawa g³osu.
+  0 Brak specjalnych przywilejów.
+ Inne osoby mog± nadaæ status
+ operatora temu u¿ytkownikowi
+ (je¶li wy³±czono opcjê secure-ops).
+  <0 Brak mo¿liwo¶ci pe³nienia funkcji
+ operatora.
+
+ Standardowe poziomy mog± zostaæ zmienione, mo¿liwe
+ jest tak¿e definiowanie w³asnych poziomów dostêpu.
+ Aby uzyskaæ wiêcej informacji wpisz:
+ %R%S HELP LEVELS
+
+CHAN_HELP_AKICK
+ Sk³adnia: AKICK kana³ ADD {nick | maska} [powód]
+ AKICK kana³ STICK maska
+ AKICK kana³ UNSTICK maska
+ AKICK kana³ DEL {nick | maska | numer-wpisu | lista}
+ AKICK kana³ LIST [maska | numer-wpisu | lista]
+ AKICK kana³ VIEW [maska | numer-wpisu | lista]
+ AKICK kana³ ENFORCE
+ AKICK kana³ CLEAR
+
+ Polecenie zarz±dza list± AutoKick dla kana³u. Je¶li
+ u¿ytkownik znajduj±cy siê na li¶cie AKICK, wejdzie
+ na kana³, %S za³o¿y bana, a nastêpnie wykopie
+ u¿ytkownika z kana³u.
+
+ Polecenie AKICK ADD dodaje podany nick lub maskê
+ hosta do listy AutoKick. Je¶li zostanie podany
+ powód, bêdzie on u¿ywany przy wykopywaniu
+ u¿ytkownika dodanego do listy z kana³u, je¶li nie
+ zostanie podany, u¿ywany bêdzie domy¶lny:
+ You have been banned from channel.
+ Dodawanie zarejestrowanego nicka na listê powoduje
+ wykopywanie wszystkich nicków nale¿±cych do grupy.
+
+ Polecenie AKICK STICK umo¿liwia permanentne
+ dodanie podanej maski do banów na kanale. Za ka¿dym
+ razem gdy kto¶ zdejmie wskazanego bana z kana³u,
+ %S automatycznie za³o¿y go ponownie.
+ Parametrem polecenia nie mo¿e byæ nick a jedynie
+ host.
+
+ Polecenie AKICK UNSTICK niweluje dzia³anie
+ polecenia AKICK STICK - umo¿liwia zdjêcie bana z
+ kana³u.
+
+ AKICK DEL usuwa wskazany nick lub maskê z listy AKICK.
+ Jako argument przyjmuje nick, maskê, numer wpisu lub
+ listê (przyk³ad poni¿ej dla polecenia LIST).
+
+ AKICK LIST wy¶wietla zawarto¶æ listy AKICK. Je¶li
+ zostanie podana maska tylko pasuj±ce wpisy zostan±
+ pokazane.
+
+ AKICK VIEW zwraca wiêcej szczegó³ów ni¿ AKICK LIST.
+
+ Polecenie AKICK ENFORCE powoduje ¿e %S
+ usunie z kana³u wszystkich u¿ytkowników, których
+ hosty pasuj± do wskazanych masek w li¶cie AKICK.
+
+ Polecenie AKICK CLEAR usuwa wszystkie wpisy z listy.
+
+CHAN_HELP_LEVELS
+ Sk³adnia: LEVELS kana³ SET typ poziom
+ LEVELS kana³ {DIS | DISABLE} typ
+ LEVELS kana³ LIST
+ LEVELS kana³ RESET
+
+ Polecenie LEVELS umo¿liwia przypisywanie
+ uprawnieñ poszczególnym poziomom dostepu.
+ Przy u¿yciu tej komendy mo¿esz definiowaæ
+ poziomy dostêpu do wszystkich funkcji %S
+ (SET FOUNDER, SET PASSWORD oraz LEVELS
+ s± dostêpne tylko dla w³a¶ciciela kana³u).
+
+ LEVELS SET pozwala zmieniæ przypisany poziom dla
+ okre¶lonej operacji lub ich grup. LEVELS DISABLE
+ (lub DIS w skrócie) wy³±cza okre¶lon± funkcjê lub
+ zastrzega dostêp do niej dla w³a¶ciciela kana³u.
+ LEVELS LIST wy¶wietla aktualnie ustalone poziomy
+ dla ka¿dej z operacji. LEVELS RESET przywraca
+ standardowe ustawienia poziomów dostêpu - identyczne
+ z tymi jakie ustawiane s± dla kana³u po jego
+ utworzeniu (zobacz HELP ACCESS LEVELS).
+
+ Aby obejrzeæ spis wszystkich funkcji które mog±
+ zostaæ przypisane poziomom dostêpu, zobacz
+ HELP LEVELS DESC.
+
+CHAN_HELP_LEVELS_DESC
+ Poni¿ej znajduje siê lista wszystkich dostêpnych uprawnieñ.
+ Poziomy dla AUTODEOP oraz NOJOIN to poziomy maksymalne,
+ reszta uprawnieñ ma poziomy minimalne.
+
+CHAN_HELP_LEVELS_DESC_FORMAT
+ %-*s %s
+
+CHAN_HELP_INFO
+ Sk³adnia: INFO kana³ [ALL]
+
+ Wy¶wietla informacje o zarejestrowanym kanale:
+ w³a¶ciciel, data za³o¿enia, opis, blokada flag,
+ czas ostatniego u¿ycia. Kiedy zostanie podany parametr
+ ALL zostan± wy¶wietlone tak¿e informacje o spadkobiercy
+ kana³u i wiadomo¶ci powitalnej.
+
+ Domy¶lnie parametr ALL jest dostêpny dla osób z
+ uprawnieniami w³a¶ciciela kana³u.
+
+CHAN_HELP_LIST
+ Sk³adnia: LIST wzorzec
+
+ Listuje kana³y o nazwie pasuj±cej do podanego wzorca
+ (kana³y z opcj± PRIVATE nie bêd± pokazywane).
+ Poprzedzenie znakiem '#' powoduje podawanie zakresu,
+ nazwy kana³ów powinny byæ pisane bez znaku '#'.
+
+CHAN_HELP_OP
+ Sk³adnia: OP [kana³ [nick]]
+
+ Nadaje status operatora wskazanemu u¿ytkownikowi.
+ Je¶li nie zostanie podany nick operacja bêdzie
+ przeprowadzona na osobie wydaj±cej t± komendê.
+ Je¶li tak¿e nie zostanie podany kana³ operacja
+ bêdzie przeprowadzona na wszystkich kana³ach na
+ których przebywa osoba wydaj±ca to polecenie z
+ uwzglêdnieniem posiadanych uprawnieñ.
+
+ Standardowo ta komenda jest dostêpna dla u¿ytkowników
+ wpisanych na listê AOP lub posiadaj±cych poziom
+ dostêpu 5 lub wy¿szy.
+
+CHAN_HELP_DEOP
+ Sk³adnia: DEOP [kana³ [nick]]
+
+ Odbiera status operatora wskazanemu u¿ytkownikowi.
+ Je¶li nie zostanie podany nick operacja bêdzie
+ przeprowadzona na osobie wydaj±cej t± komendê.
+ Je¶li tak¿e nie zostanie podany kana³ operacja
+ bêdzie przeprowadzona na wszystkich kana³ach na
+ których przebywa osoba wydaj±ca to polecenie z
+ uwzglêdnieniem posiadanych uprawnieñ.
+
+ Standardowo ta komenda jest dostêpna dla u¿ytkowników
+ wpisanych na listê AOP lub posiadaj±cych poziom
+ dostêpu 5 lub wy¿szy.
+
+CHAN_HELP_VOICE
+ Sk³adnia: VOICE [kana³ [nick]]
+
+ Nadaje prawo g³osu wskazanemu u¿ytkownikowi.
+ Je¶li nie zostanie podany nick operacja bêdzie
+ przeprowadzona na osobie wydaj±cej t± komendê.
+ Je¶li tak¿e nie zostanie podany kana³ operacja
+ bêdzie przeprowadzona na wszystkich kana³ach na
+ których przebywa osoba wydaj±ca to polecenie z
+ uwzglêdnieniem posiadanych uprawnieñ.
+
+ Standardowo ta komenda jest dostêpna dla u¿ytkowników
+ wpisanych na listê AOP lub posiadaj±cych przynajmniej
+ 5. poziom dostêpu. Osoby wpisane na listê VOP lub
+ posiadaj±ce 3. poziom dostêpu mog± j± wykonywaæ
+ jedynie na sobie.
+
+CHAN_HELP_DEVOICE
+ Sk³adnia: DEVOICE [kana³ [nick]]
+
+ Odbiera prawo g³osu wskazanemu u¿ytkownikowi.
+ Je¶li nie zostanie podany nick operacja bêdzie
+ przeprowadzona na osobie wydaj±cej t± komendê.
+ Je¶li tak¿e nie zostanie podany kana³ operacja
+ bêdzie przeprowadzona na wszystkich kana³ach na
+ których przebywa osoba wydaj±ca to polecenie z
+ uwzglêdnieniem posiadanych uprawnieñ.
+
+ Standardowo ta komenda jest dostêpna dla u¿ytkowników
+ wpisanych na listê AOP lub posiadaj±cych przynajmniej
+ 5. poziom dostêpu. Osoby wpisane na listê VOP lub
+ posiadaj±ce 3. poziom dostêpu mog± j± wykonywaæ
+ jedynie na sobie.
+
+CHAN_HELP_HALFOP
+ Sk³adnia: HALFOP [kana³ [nick]]
+
+ Nadaje status pó³-operatora wskazanemu u¿ytkownikowi.
+ Je¶li nie zostanie podany nick operacja bêdzie
+ przeprowadzona na osobie wydaj±cej t± komendê.
+ Je¶li tak¿e nie zostanie podany kana³ operacja
+ bêdzie przeprowadzona na wszystkich kana³ach na
+ których przebywa osoba wydaj±ca to polecenie z
+ uwzglêdnieniem posiadanych uprawnieñ.
+
+ Standardowo ta komenda jest dostêpna dla u¿ytkowników
+ wpisanych na listê AOP lub posiadaj±cych przynajmniej
+ 5. poziom dostêpu. Osoby wpisane na listê HOP lub
+ posiadaj±ce 4. poziom dostêpu mog± j± wykonywaæ
+ jedynie na sobie.
+
+CHAN_HELP_DEHALFOP
+ Sk³adnia: DEHALFOP [kana³ [nick]]
+
+ Odbiera status pó³-operatora wskazanemu u¿ytkownikowi.
+ Je¶li nie zostanie podany nick operacja bêdzie
+ przeprowadzona na osobie wydaj±cej t± komendê.
+ Je¶li tak¿e nie zostanie podany kana³ operacja
+ bêdzie przeprowadzona na wszystkich kana³ach na
+ których przebywa osoba wydaj±ca to polecenie z
+ uwzglêdnieniem posiadanych uprawnieñ.
+
+ Standardowo ta komenda jest dostêpna dla u¿ytkowników
+ wpisanych na listê AOP lub posiadaj±cych przynajmniej
+ 5. poziom dostêpu. Osoby wpisane na listê HOP lub
+ posiadaj±ce 4. poziom dostêpu mog± j± wykonywaæ
+ jedynie na sobie.
+
+CHAN_HELP_PROTECT
+ Sk³adnia: PROTECT [kana³ [nick]]
+
+ Nadaje ochronê wskazanemu u¿ytkownikowi.
+ Je¶li nie zostanie podany nick operacja bêdzie
+ przeprowadzona na osobie wydaj±cej t± komendê.
+ Je¶li tak¿e nie zostanie podany kana³ operacja
+ bêdzie przeprowadzona na wszystkich kana³ach na
+ których przebywa osoba wydaj±ca to polecenie z
+ uwzglêdnieniem posiadanych uprawnieñ.
+
+ Standardowo ta komenda jest dostêpna dla u¿ytkowników
+ wpisanych na listê SOP lub posiadaj±cych przynajmniej
+ 10. poziom dostêpu.
+
+CHAN_HELP_DEPROTECT
+ Sk³adnia: DEPROTECT [kana³ [nick]]
+
+ Usuwa ochronê wskazanemu u¿ytkownikowi.
+ Je¶li nie zostanie podany nick operacja bêdzie
+ przeprowadzona na osobie wydaj±cej t± komendê.
+ Je¶li tak¿e nie zostanie podany kana³ operacja
+ bêdzie przeprowadzona na wszystkich kana³ach na
+ których przebywa osoba wydaj±ca to polecenie z
+ uwzglêdnieniem posiadanych uprawnieñ.
+
+ Standardowo ta komenda jest dostêpna dla u¿ytkowników
+ wpisanych na listê SOP lub posiadaj±cych przynajmniej
+ 10. poziom dostêpu.
+
+CHAN_HELP_OWNER
+ Sk³adnia: OWNER [kana³]
+
+ Nadaje uprawnienia w³a¶ciciela kana³u.
+ Je¶li nie zostanie podany kana³ operacja bêdzie
+ przeprowadzona na wszystkich kana³ach na których
+ przebywa osoba wydaj±ca to polecenie z
+ uwzglêdnieniem posiadanych uprawnieñ.
+
+ Standardowo ta komenda jest dostêpna tylko dla w³a¶ciciela kana³u.
+
+CHAN_HELP_DEOWNER
+ Sk³adnia: DEOWNER [kana³]
+
+ Odbiera uprawnienia w³a¶ciciela kana³u.
+ Je¶li nie zostanie podany kana³ operacja bêdzie
+ przeprowadzona na wszystkich kana³ach na których
+ przebywa osoba wydaj±ca to polecenie z
+ uwzglêdnieniem posiadanych uprawnieñ.
+
+ Standardowo ta komenda jest dostêpna tylko dla w³a¶ciciela kana³u.
+
+CHAN_HELP_INVITE
+ Sk³adnia: INVITE kana³
+
+ %S wysy³a u¿ytkownikowi zaproszenie do kana³u.
+
+ Standardowo ta komenda jest dostêpna dla u¿ytkowników
+ wpisanych na listê AOP lub posiadaj±cych poziom
+ dostêpu 5 lub wy¿szy.
+
+CHAN_HELP_UNBAN
+ Sk³adnia: UNBAN kana³
+
+ Sprawia, ¿e %S zdejmie wszystkie bany, które
+ uniemo¿liwiaj± wydaj±cemu komendê wej¶cie na
+ wskazany kana³.
+
+ Standardowo ta komenda jest dostêpna dla u¿ytkowników
+ wpisanych na listê AOP lub posiadaj±cych poziom
+ dostêpu 5 lub wy¿szy.
+
+CHAN_HELP_KICK
+ Sk³adnia: KICK [kana³ [nick [powód]]]
+
+ Wykopuje wskazanego u¿ytkownika z kana³u.
+ Pominiêcie nicka powoduje wyrzucenie osoby
+ wydaj±cej polecenie. Dodatkowo pominiêcie
+ nazwy kana³u powoduje wyrzucenie wydaj±cego
+ polecenie ze wszystkich kana³ów, na których
+ przebywa z uwzglêdnieniem uprawnieñ na nich
+ przys³uguj±cych.
+
+ Standardowo ta komenda jest dostêpna dla u¿ytkowników
+ wpisanych na listê AOP lub posiadaj±cych poziom
+ dostêpu 5 lub wy¿szy.
+
+CHAN_HELP_BAN
+ Sk³adnia: BAN [kana³ [nick [powód]]]
+
+ Banuje wskazanego u¿ytkownika na kanale.
+ Pominiêcie nicka powoduje zbanowanie osoby
+ wydaj±cej polecenie. Dodatkowo pominiêcie
+ nazwy kana³u powoduje zbanowanie wydaj±cego
+ polecenie na wszystkich kana³ach, na których
+ przebywa z uwzglêdnieniem uprawnieñ na nich
+ przys³uguj±cych.
+
+ Standardowo ta komenda jest dostêpna dla u¿ytkowników
+ wpisanych na listê AOP lub posiadaj±cych poziom
+ dostêpu 5 lub wy¿szy.
+
+CHAN_HELP_TOPIC
+ Sk³adnia: TOPIC kana³ [temat]
+
+ Wymusza na serwisie %S zmianê tematu na kanale.
+ Pominiêcie tematu powoduje usuniêcie istniej±cego.
+ Ta komenda jest u¿yteczna w po³±czeniu z ustawieniem
+ TOPICLOCK. Aby uzyskaæ wiêcej informacji wpisz
+ %R%S HELP SET TOPICLOCK
+
+ Standardowo ta komenda jest dostêpna dla w³a¶ciciela kana³u.
+
+CHAN_HELP_CLEAR
+ Sk³adnia: CLEAR kana³ opcje
+
+ Umo¿liwia kompleksowe usuniêcie niektórych ustawieñ na
+ kanale poprzez %S. Dostêpne opcje:
+
+ MODES Zdejmuje wszystkie tryby z kana³u
+ BANS Zdejmuje wszystkie bany na kanale
+ EXCEPTS Zdejmuje wyj±tki od banów na kanale
+ OPS Odbiera wszystkim status operatora
+ HOPS Odbiera wszystkim status pó³-operatora
+ VOICES Odbiera wszystkim prawo g³osu
+ USERS Wykopuje wszystkich z kana³u
+
+ Standardowo ta komenda jest dostêpna dla w³a¶ciciela kana³u.
+
+CHAN_HELP_GETKEY
+ Sk³adnia: GETKEY kana³
+
+ Zwraca has³o wstêpu do wskazanego kana³u.
+ Komenda jest g³ównie przeznaczona dla botów,
+ dlatego wynik ma format:
+
+ KEY <kana³> <klucz>
+
+ Je¶li kana³ nie ma klucza zostanie zwrócona
+ warto¶æ "NO KEY".
+
+CHAN_HELP_SENDPASS
+ Sk³adnia: SENDPASS kana³
+
+ Wysy³a has³o do podanego kana³u na adres e-mail
+ przypisany do nicka w³a¶ciciela kana³u. Ta komenda
+ pomaga odzyskaæ zapomniane has³o.
+
+ Ta komenda w niektórych sieciach mo¿e byæ dostêpna
+ jedynie dla osób z uprawnieniami IRC operatora.
+
+ Ta komenda jest niedostêpna kiedy has³a s± szyfrowane.
+
+CHAN_SERVADMIN_HELP
+
+ Administratorzy serwisów mog± usun±æ ka¿dy kana³
+ bez potrzeby identyfikacji jako jego w³a¶ciciele.
+ Mog± przegl±daæ listê dostêpu ka¿dego kana³u,
+ listê AKICK, ustawienia poziomów dostêpu itd.
+
+CHAN_SERVADMIN_HELP_LOGOUT
+ Sk³adnia: LOGOUT kana³ nick
+
+ Pozwala na wylogowanie wskazanego u¿ytkownika z kana³u.
+ W celu odzyskania uprawnieñ u¿ytkownik bêdzie musia³
+ ponownie siê zidentyfikowaæ.
+
+ Ka¿dy mo¿e wylogowaæ siebie, natomiast w³a¶ciciel kana³u
+ mo¿e wylogowaæ ka¿dego.
+
+ Administrator serwisów mo¿e wylogowaæ dowoln± osobê
+ z dowolnego kana³u. Pominiêcie nicka powoduje wylogowanie
+ wszystkich zidentyfikowanych osób.
+
+CHAN_SERVADMIN_HELP_DROP
+ Sk³adnia: DROP kana³
+
+ Usuwa wskazany kana³. Tylko administratorzy serwisów
+ mog± usun±æ kana³, którego nie s± w³a¶cicielami.
+
+CHAN_SERVADMIN_HELP_SET
+
+ Administratorzy serwisów mog± ustawiæ kana³owi
+ opcjê NOEXPIRE, która zapobiega wyga¶niêciu
+ kana³u je¶li nie jest on u¿ywany.
+
+CHAN_SERVADMIN_HELP_SET_NOEXPIRE
+ Sk³adnia: SET kana³ NOEXPIRE {ON | OFF}
+
+ W³±cza lub wy³±cza automatyczne usuniêcie kana³u,
+ je¶li nie bêdzie on u¿ywany.
+
+CHAN_SERVADMIN_HELP_INFO
+
+ Administratorzy serwisów zawsze mog± u¿ywaæ parametru ALL.
+
+CHAN_SERVADMIN_HELP_LIST
+ Sk³adnia: LIST wzorzec [FORBIDDEN] [SUSPENDED] [NOEXPIRE]
+
+ Listuje kana³y o nazwie pasuj±cej do podanego wzorca
+ (kana³y z opcj± PRIVATE bêd± pokazywane jedynie
+ administratorom serwisów). Kana³y z ustawion± opcj±
+ NOEXPIRE bêd± mia³y przy nazwie dodany znak !.
+
+ Administratorzy serwisów mog± tak¿e podaæ parametry:
+ FORBIDDEN, SUSPENDED i NOEXPIRE, które ogranicz± listê
+ wy¶wietlanych kana³ów do tych, które spe³niaj± podane
+ warunki. Je¶li zostanie podane wiêcej warunków
+ wszystkie kana³y spe³niaj±ce choæ jeden z nich
+ zostan± pokazane.
+
+CHAN_SERVADMIN_HELP_GETPASS
+ Sk³adnia: GETPASS kana³
+
+ Zwraca has³o w³a¶ciciela dla wskazanego kana³u.
+ UWAGA: u¿ycie tej komendy powoduje wys³anie
+ informacji o jej u¿yciu przy pomocy WALLOP/GLOBOP.
+
+CHAN_SERVADMIN_HELP_FORBID
+ Sk³adnia: FORBID kana³ [powód]
+
+ Uniemo¿liwia rejestracjê i korzystanie ze wskazanego
+ kana³u. Blokadê mo¿na zdj±æ u¿ywaj±c komendy DROP.
+
+ W niektórych sieciach wymagane jest podanie powodu.
+
+CHAN_SERVADMIN_HELP_SUSPEND
+ Sk³adnia: SUSPEND kana³ [powód]
+
+ Zawiesza dzia³anie wskazanego kana³u.
+ Blokada mo¿e zostaæ zdjêta z zachowaniem
+ wszelkich ustawieñ komend± UNSUSPEND.
+
+ W niektórych sieciach wymagane jest podanie powodu.
+
+CHAN_SERVADMIN_HELP_UNSUSPEND
+ Sk³adnia: UNSUSPEND kana³
+
+ Uwalnia zawieszony kana³. Wszystkie dane i ustawienia
+ s± odtworzone sprzed zawieszenia.
+
+CHAN_SERVADMIN_HELP_STATUS
+ Sk³adnia: STATUS kana³ nick
+
+ Wy¶wietla aktualny poziom dostêpu (access level)
+ wskazanego nicka na kanale. Format odpowiedzi jest
+ nastêpuj±cy:
+
+ STATUS kana³ nick poziom-dostêpu
+
+ W przypadku wyst±pienia b³êdu, format odpowiedzi
+ bêdzie nastêpuj±cy:
+
+ STATUS ERROR informacja-o-b³êdzie
+
+###########################################################################
+#
+# MemoServ help messages
+#
+###########################################################################
+MEMO_HELP_CMD_SEND
+ SEND Wysy³a wiadomo¶æ do u¿ytkownika/kana³u
+
+MEMO_HELP_CMD_CANCEL
+ CANCEL Wycofuje ostatni± wys³an± wiadomo¶æ
+
+MEMO_HELP_CMD_LIST
+ LIST Wy¶wietla wszystkie wiadomo¶ci
+
+MEMO_HELP_CMD_READ
+ READ Wy¶wietla jedn± lub wiêcej wiadomo¶ci
+
+MEMO_HELP_CMD_DEL
+ DEL Kasuje jedn± lub wiêcej wiadomo¶ci
+
+MEMO_HELP_CMD_SET
+ SET Ustawia opcje zwi±zane z wiadomo¶ciami
+
+MEMO_HELP_CMD_INFO
+ INFO Wy¶wietla informacje o wiadomo¶ciach
+
+MEMO_HELP_CMD_RSEND
+ RSEND Wysy³a wiadomo¶æ z ¿±daniem potwierdzenia odbioru
+
+MEMO_HELP_CMD_CHECK
+ CHECK Sprawdza czy ostatnia wiadomo¶æ zosta³a przeczytana
+
+MEMO_HELP_CMD_SENDALL
+ SENDALL Wysy³a wiadomo¶æ do wszystkich
+ zarejestrowanych u¿ytkowników
+
+MEMO_HELP_CMD_STAFF
+ STAFF Wysy³a wiadomo¶æ do wszystkich
+ operatorów/administratorów
+
+MEMO_HELP_HEADER
+ %S umo¿liwia wysy³anie krótkich wiadomo¶ci
+ do innych u¿ytkowników (niezale¿nie od tego czy
+ s± oni w danej chwili na IRCu) lub do kana³ów(*).
+ Aby móc u¿ywaæ tego serwisu nadawca i odbiorca
+ (kana³ lub nick) musz± byæ zarejestrowani.
+ Poni¿sze komendy pozwalaj± na wysy³anie i
+ odbieranie wiadomo¶ci, aby ich u¿yæ wpisz:
+ %R%S komenda
+ Aby uzyskaæ szczegó³owy opis polecenia wpisz:
+ %R%S HELP komenda
+
+MEMO_HELP_ADMIN
+ nie jest u¿ywane.
+
+MEMO_HELP_OPER
+ nie jest u¿ywane.
+
+MEMO_HELP_FOOTER
+
+ Napisz %R%S HELP polecenie aby uzyskaæ pomoc
+ na temat powy¿szych poleceñ.
+
+ (*) Domy¶lnie ka¿dy u¿ytkownik maj±cy przynajmniej 10.
+ poziom dostêpu na kanale mo¿e czytaæ wiadomo¶ci,
+ ale mo¿na to zmieniæ komend± LEVELS serwisu %s.
+
+MEMO_HELP_SEND
+ Sk³adnia: SEND {nick | kana³} tre¶æ-wiadomo¶ci
+
+ Wysy³a wiadomo¶æ wskazanej osobie lub na podany kana³.
+ Po wys³aniu odbiorca otrzyma powiadomienie o nowej
+ wiadomo¶ci (o ile ma w³±czone powiadomienia).
+ Adresatem musi byæ zarejestrowany nick lub kana³.
+
+MEMO_HELP_CANCEL
+ Sk³adnia: CANCEL {nick | kana³}
+
+ Wycofuje ostatni± wys³an± wiadomo¶æ,
+ o ile nie zosta³a przeczytana.
+
+MEMO_HELP_LIST
+ Sk³adnia: LIST [kana³] [lista | NEW]
+
+ Wy¶wietla wszystkie odebrane wiadomo¶ci. Parametr
+ NEW ogranicza listê do nowych wiadomo¶ci, które
+ oznaczane s± symbolem "*" po lewej stronie numeru.
+ Mo¿na tak¿e sprecyzowaæ listê wy¶wietlanych
+ wiadomo¶ci podaj±c ich numery, np:
+
+ LIST 2-5,7-9
+ Wy¶wietli wiadomo¶ci od numeru 2 do 5 oraz od 7 do 9.
+
+MEMO_HELP_READ
+ Sk³adnia: READ [kana³] {numer | lista | LAST | NEW}
+
+ Wy¶wietla tekst wskazanej wiadomo¶ci. Parametr LAST
+ oznacza ostatni± z wiadomo¶ci, NEW wy¶wietla wszystkie
+ nieprzeczytane wiadomo¶ci. Je¶li zostanie podany numer
+ zostanie wy¶wietlona wiadomo¶æ o podanym numerze. Mo¿na
+ tak¿e podawaæ listê wiadomo¶ci np.:
+
+ READ 2-5,7-9
+ Wy¶wietli wiadomo¶ci od numeru 2 do 5 oraz od 7 do 9.
+
+MEMO_HELP_DEL
+ Sk³adnia: DEL [kana³] {numer | lista | LAST | ALL}
+
+ Kasuje jedn± lub wiêcej wiadomo¶ci. Dopuszczalne
+ jest podanie numeru wiadomo¶ci lub listy wiadomo¶ci,
+ przyk³ad poni¿ej.
+
+ Parametr LAST oznacza skasowanie ostatniej wiadomo¶ci.
+ Parametr ALL oznacza skasowanie wszystkich wiadomo¶ci.
+
+ Przyk³ady:
+
+ DEL 1
+ Usuwa pierwsz± wiadomo¶æ.
+
+ DEL 2-5,7-9
+ Kasuje wiadomo¶ci od numeru 2 do 5 oraz od 7 do 9.
+
+MEMO_HELP_SET
+ Sk³adnia: SET opcja parametry
+
+ Ustawia ró¿ne opcje wiadomo¶ci. Dostêpne opcje:
+
+ NOTIFY Ustawia kiedy otrzymasz informacjê
+ o nowej wiadomo¶ci
+ LIMIT Ustawia maksymaln± liczbê wiadomo¶ci
+ jakie mo¿esz odebraæ
+
+ Aby uzyskaæ wiêcej informacji o danej opcji wpisz:
+ %R%S HELP SET opcja
+
+MEMO_HELP_SET_NOTIFY
+ Sk³adnia: SET NOTIFY {ON | LOGON | NEW | OFF}
+
+ Ustala sposób wys³ania powiadomieñ o nowych wiadomo¶ciach:
+
+ ON Powiadomienie zostanie wys³ane po
+ zalogowaniu siê, kiedy nie bêdzie
+ ustawiony tryb /AWAY oraz w momencie
+ otrzymania wiadomo¶ci.
+ LOGON Powiadomienie zostanie wys³ane jedynie
+ po zalogowaniu siê lub po wy³±czeniu
+ trybu /AWAY.
+ NEW Powiadomienie bêdzie wysy³ane jedynie w
+ momencie otrzymania wiadomo¶ci.
+ OFF Powiadomienia nie bêd± wysy³ane.
+
+ Opcja ON jest kombinacj± opcji LOGON oraz NEW.
+
+MEMO_HELP_SET_LIMIT
+ Sk³adnia: SET LIMIT [kana³] limit
+
+ Ustala Twoj± (lub kana³u) maksymaln± liczbê
+ wiadomo¶ci. Je¶li ustalona zostanie ona na 0,
+ przyjmowanie wiadomo¶ci zostanie wy³±czone. Limit
+ nie mo¿e byæ wiêkszy ni¿ %d.
+
+MEMO_HELP_INFO
+ Sk³adnia: INFO [kana³]
+
+ Wy¶wietla ilo¶æ wiadomo¶ci, ile z nich jest
+ nieprzeczytanych oraz limit przyjmowania
+ wiadomo¶ci. Je¶li podany zostanie kana³ wy¶wietlone
+ informacje bêd± odnosi³y siê do wskazanego kana³u.
+
+MEMO_SERVADMIN_HELP_SET_LIMIT
+ Sk³adnia: SET LIMIT [nick | kana³] {limit | NONE} [HARD]
+
+ Ustala maksymaln± ilo¶æ wiadomo¶ci jak± mo¿e
+ posiadaæ u¿ytkownik lub kana³. Ustalenie limitu
+ na 0, wy³±czy przyjmowanie wiadomo¶ci. Parametr
+ NONE pozwoli na nielimitowan± ilo¶æ wiadomo¶ci.
+ Je¶li nie podany zostanie nick lub kana³ zmieniony
+ zostanie limit wydaj±cego polecenie.
+
+ Dodanie parametru HARD uniemo¿liwia zmianê
+ limitu przez u¿ytkownika.
+
+ To u¿ycie polecenia SET LIMIT jest dostêpne dla
+ administratorów serwisów. Pozostali u¿ytkownicy
+ mog± jedynie modyfikowaæ w³asny limit lub kana³u na
+ którym maj± do tego uprawnienia. Nie mog± wy³±czyæ
+ limitu, a tak¿e ustaliæ jego warto¶ci powy¿ej %d
+ oraz u¿yæ parametru HARD.
+
+
+
+MEMO_SERVADMIN_HELP_INFO
+ Sk³adnia: INFO [nick | kana³]
+
+ Polecenie wydane bez parametru wy¶wietla informacje o
+ liczbie odebranych wiadomo¶ci, liczbie nowych wiadomo¶ci
+ oraz limicie wiadomo¶ci.
+
+ Je¶li zostanie wskazany kana³, pokazane zostan± te
+ same informacje w odniesieniu do tego kana³u.
+
+ Administratorzy serwisów mog± obejrzeæ informacje
+ dot. dowolnych u¿ytkowników podaj±c parametr nick.
+
+
+MEMO_HELP_STAFF
+ Sk³adnia: STAFF tre¶æ-wiadomo¶ci
+
+ Wysy³a wiadomo¶æ o podanej tre¶ci do wszystkich
+ operatorów i administratorów serwisów. U¿ytkownicy
+ wpisani jednocze¶nie na kilka list otrzymaj±
+ wiadomo¶ci kilka razy.
+
+MEMO_HELP_SENDALL
+ Sk³adnia: SENDALL tre¶æ-wiadomo¶ci
+
+ Wysy³a wiadomo¶æ do wszystkich zarejestrowanych u¿ytkowników.
+
+MEMO_HELP_RSEND
+ Sk³adnia: RSEND {nick | kana³} tre¶æ-wiadomo¶ci
+
+ Wysy³a wiadomo¶æ wskazanej osobie lub na podany kana³.
+ Po wys³aniu odbiorca otrzyma powiadomienie o nowej
+ wiadomo¶ci (o ile ma w³±czone powiadomienia).
+ Adresatem musi byæ zarejestrowany nick lub kana³.
+ Kiedy wiadomo¶æ zostanie przeczytana przez odbiorcê
+ automatyczne potwierdzenie odbioru zostanie wys³ane
+ do nadawcy.
+MEMO_HELP_CHECK
+ Sk³adnia: CHECK nick
+
+ Sprawdza, czy ostatnia wiadomo¶æ wys³ana do nick
+ zosta³a przeczytana. Ta komenda nie dzia³a dla kana³ów.
+
+###########################################################################
+#
+# OperServ help messages
+#
+###########################################################################
+OPER_HELP_CMD_GLOBAL
+ GLOBAL Wysy³a wiadomo¶æ do wszystkich u¿ytkowników
+
+OPER_HELP_CMD_STATS
+ STATS Pokazuje informacje o serwisach i sieci
+
+OPER_HELP_CMD_OPER
+ OPER Zarz±dza list± operatorów serwisów
+
+OPER_HELP_CMD_ADMIN
+ ADMIN Zarz±dza list± administratorów serwisów
+
+OPER_HELP_CMD_STAFF
+ STAFF Wy¶wietla ekipê serwisów oraz jej status
+
+OPER_HELP_CMD_MODE
+ MODE Zmienia flagi kana³u
+
+OPER_HELP_CMD_KICK
+ KICK Wyrzuca u¿ytkownika z kana³u
+
+OPER_HELP_CMD_CLEARMODES
+ CLEARMODES Usuwa wszystkie flagi z kana³u
+
+OPER_HELP_CMD_KILLCLONES
+ KILLCLONES Od³±cza wszystkich u¿ytkowników o danym ho¶cie
+
+OPER_HELP_CMD_AKILL
+ AKILL Zarz±dza list± AKILL
+
+OPER_HELP_CMD_SGLINE
+ SGLINE Zarz±dza list± SGLINE
+
+OPER_HELP_CMD_SQLINE
+ SQLINE Zarz±dza list± SQLINE
+
+OPER_HELP_CMD_SZLINE
+ SZLINE Zarz±dza list± SZLINE
+
+OPER_HELP_CMD_CHANLIST
+ CHANLIST Listuje wszystkie kana³y
+
+OPER_HELP_CMD_USERLIST
+ USERLIST Listuje wszystkich u¿ytkowników
+
+OPER_HELP_CMD_LOGONNEWS
+ LOGONNEWS Zarz±dza wiadomo¶ciami powitalnymi
+
+OPER_HELP_CMD_RANDOMNEWS
+ RANDOMNEWS Zarz±dza losowymi wiadomo¶ciami
+
+OPER_HELP_CMD_OPERNEWS
+ OPERNEWS Zarz±dza wiadomo¶ciami dla operatorów
+
+OPER_HELP_CMD_SESSION
+ SESSION Wy¶wietla listê sesji
+
+OPER_HELP_CMD_EXCEPTION
+ EXCEPTION Zarz±dza list± wyj±tków dla limitów sesji
+
+OPER_HELP_CMD_NOOP
+ NOOP Tymczasowo usuwa wszystkie O:linie na serwerze
+
+OPER_HELP_CMD_JUPE
+ JUPE Blokuje pod³±czanie podanego serwera
+
+OPER_HELP_CMD_IGNORE
+ IGNORE Zarz±dza list± ignorowanych przez serwisy
+
+OPER_HELP_CMD_SET
+ SET Ustawia ró¿ne globalne opcje serwisów
+
+OPER_HELP_CMD_RELOAD
+ RELOAD £aduje na nowo plik konfiguracyjny
+
+OPER_HELP_CMD_UPDATE
+ UPDATE Wymusza natychmiastowy zapis baz na dysku
+
+OPER_HELP_CMD_RESTART
+ RESTART Zapisuje bazy i restartuje serwisy
+
+OPER_HELP_CMD_QUIT
+ QUIT Wy³±cza serwisy bez zapisywania baz
+
+OPER_HELP_CMD_SHUTDOWN
+ SHUTDOWN Wy³±cza serwisy z zapisaniem baz
+
+OPER_HELP_CMD_DEFCON
+ DEFCON Modyfikuje poziom systemu DefCon
+
+OPER_HELP_CMD_CHANKILL
+ CHANKILL Od³±cza wszystkich u¿ytkowników na kanale
+
+OPER_HELP_CMD_OLINE
+ OLINE Daje flagi operatora wybranemu u¿ytkownikowi
+
+OPER_HELP_CMD_UMODE
+ UMODE Modyfikuje flagi wskazanego u¿ytkownika
+
+OPER_HELP_CMD_SVSNICK
+ SVSNICK Wymusza zmianê nicka danego u¿ytkownika
+
+OPER_HELP_CMD_MODLOAD
+ MODLOAD £aduje modu³
+
+OPER_HELP_CMD_MODUNLOAD
+ MODUNLOAD Wy³adowuje modu³
+
+OPER_HELP_CMD_MODINFO
+ MODINFO Wy¶wietla informacja o podanym module
+
+OPER_HELP_CMD_MODLIST
+ MODLIST Listuje za³adowane modu³y
+
+OPER_HELP
+ Komendy %S:
+
+OPER_HELP_LOGGED
+ Uwaga: Wszystkie komendy odbierane przez %S s± logowane!
+
+OPER_HELP_GLOBAL
+ Sk³adnia: GLOBAL wiadomo¶æ
+
+ Pozwala administratorom wysy³aæ wiadomo¶ci do wszystkich
+ u¿ytkowników. Wiadomo¶æ zostanie wys³ana z nicka %s.
+
+OPER_HELP_STATS
+ Sk³adnia: STATS [AKILL | ALL | RESET | MEMORY | UPLINK]
+
+ Polecenie bez parametrów wy¶wietla bie¿±c± liczbê
+ u¿ytkowników oraz operatorów pod³±czonych do sieci (nie
+ licz±c serwisów), najwiêksz± liczbê u¿ytkowników licz±c od
+ startu serwisów oraz czas pracy serwisów.
+
+ Parametr AKILL wy¶wietla informacje o rozmiarze listy
+ AKILL oraz domy¶lnym czasie wygasania wpisów.
+
+ Parametr RESET resetuje maksymaln± liczbê u¿ytkowników
+ pod³±czonych do sieci.
+
+ Parametr MEMORY wy¶wietla informacje o zu¿yciu pamiêci
+ przez serwisów. U¿ycie tego polecenia mo¿e chwilowo
+ zawiesiæ dzia³anie serwisów na du¿ych sieciach.
+
+ Parametr UPLINK wy¶wietla informacje o serwerze, do
+ którego serwisy s± bezpo¶rednio pod³±czone.
+
+ Parametr ALL wy¶wietla wszystkie dostêpne informacje.
+
+ UPTIME mo¿e byæ u¿ywane jako synonim STATS.
+
+OPER_HELP_OPER
+ Sk³adnia: OPER ADD nick
+ OPER DEL {nick | numer-wpisu | lista}
+ OPER LIST [maska | lista]
+ OPER CLEAR
+
+ Pozwala g³ównym administratorom serwisów na zarz±dzanie
+ list± operatorów serwisów. Osoby na takiej li¶cie po
+ identyfikacji u %s bêd± mog³y korzystaæ z poleceñ
+ zarezerwowanych dla operatorów serwisów.
+
+ OPER ADD dodaje wskazany nick na listê operatorów.
+
+ OPER DEL usuwa wskazane wpisy z listy operatorów.
+ Jako argument przyjmuje nick, numer wpisu lub
+ listê (przyk³ad poni¿ej dla polecenia LIST).
+
+ OPER LIST wy¶wietla listê operatorów serwisów. Je¶li
+ zostanie podana maska tylko pasuj±ce wpisy zostan±
+ pokazane. Mo¿na tak¿e u¿yæ listy, przyk³ad:
+
+ OPER LIST 2-5,7-9
+ Listuje operatorów od 2 do 5 oraz od 7 do 9.
+
+ OPER CLEAR usuwa wszystkie wpisy z listy operatorów.
+
+ Ka¿dy IRC operator mo¿e u¿yæ polecenia OPER LIST.
+
+OPER_HELP_ADMIN
+ Sk³adnia: ADMIN ADD nick
+ ADMIN DEL {nick | numer-wpisu | lista}
+ ADMIN LIST [maska | lista]
+ ADMIN CLEAR
+
+ Pozwala g³ównym administratorom serwisów na zarz±dzanie
+ list± administratorów serwisów. Osoby na takiej li¶cie po
+ identyfikacji u %s bêd± mog³y korzystaæ z poleceñ
+ zarezerwowanych dla administratorów serwisów.
+
+ ADMIN ADD dodaje wskazany nick na listê administratorów.
+
+ ADMIN DEL usuwa wskazane wpisy z listy administratorów.
+ Jako argument przyjmuje nick, numer wpisu lub
+ listê (przyk³ad poni¿ej dla polecenia LIST).
+
+ ADMIN LIST wy¶wietla listê administratorów serwisów. Je¶li
+ zostanie podana maska tylko pasuj±ce wpisy zostan±
+ pokazane. Mo¿na tak¿e u¿yæ listy, przyk³ad:
+
+ ADMIN LIST 2-5,7-9
+ Listuje administratorów od 2 do 5 oraz od 7 do 9.
+
+ ADMIN CLEAR usuwa wszystkie wpisy z listy administratorów.
+
+ Ka¿dy IRC operator mo¿e u¿yæ polecenia ADMIN LIST.
+
+OPER_HELP_IGNORE
+ Sk³adnia: IGNORE {ADD|DEL|LIST|CLEAR} [czas] [nick | maska]
+
+ Pozwala administratorom serwisów na w³±czenie ignorowania
+ osób na podstawie nicka lub maski przez okre¶lony czas lub
+ do najbli¿szego restartu. Podaj±c czas mo¿na stosowaæ
+ jednostki: s dla sekund, m dla minut, h dla godzin
+ oraz d dla dni. Kombinacja tych jednostek nie jest mo¿liwa.
+ Sta³e ignorowanie uzyskuje siêpodaj±c warto¶æ 0.
+ Je¶li maska nie bêdzie w formacie user@host oraz
+ nick!user@host to zostanie potraktowana jako nick.
+ Podaj±c maskê mo¿na korzystaæ z symboli wieloznacznych.
+
+ IRC operatorzy nie bêd± ignorowani.
+
+OPER_HELP_MODE
+ Sk³adnia: MODE kana³ flagi
+
+ Pozwala operatorom serwisów na zmianê flag dla wskazanego
+ kana³u. Parametry s± identyczne jak dla komendy /MODE.
+
+OPER_HELP_UMODE
+ Sk³adnia: UMODE u¿ytkownik flagi
+
+ Pozwala super-administratorom zmieniaæ flagi
+ innym u¿ytkownikom. Parametry s± identyczne jak
+ dla komendy /MODE.
+
+OPER_HELP_OLINE
+ Sk³adnia: OLINE nick flagi
+
+ Pozwala super-administratorom na nadanie wskazanemu
+ u¿ytkownikowi uprawnieñ irc operatora z okre¶lonymi
+ flagami. Flagi powinny byæ poprzedzone znakami "+" lub "-".
+ Aby usun±æ wszystkie flagi wystarczy podaæ "-".
+
+OPER_HELP_CLEARMODES
+ Sk³adnia: CLEARMODES kana³ [ALL]
+
+ Usuwa wszystkie binarne flagi (i,k,l,m,n,p,s,t) oraz bany
+ ustawione na wskazanym kanale. Dodanie parametru ALL
+ odbiera tak¿e uprawnienia (+o, +v).
+
+OPER_HELP_KICK
+ Sk³adnia: KICK kana³ nick powód
+
+ Pozwala administratorom wyrzuciæ u¿ytkownika z
+ dowolnego kana³u. Parametry s± identyczne jak
+ dla komendy /KICK. Do powodu zostaje do³±czony
+ nick operatora, który wydaje polecenie.
+
+ *** SpamMan has been kicked off channel #my_channel by %S (Alcan (Flood))
+
+OPER_HELP_SVSNICK
+ Sk³adnia: SVSNICK nick nowy-nick
+
+ Zmienia nick wskazanemu u¿ytkownikowi.
+
+OPER_HELP_AKILL
+ Sk³adnia: AKILL ADD [+czas-trwania] maska powód
+ AKILL DEL {maska | numer-wpisu | lista}
+ AKILL LIST [maska | lista]
+ AKILL VIEW [maska | lista]
+ AKILL CLEAR
+
+ Pozwala operatorom serwisów na zarz±dzanie list± AKILL.
+ Je¶li u¿ytkownik pasuj±cy do maski na li¶cie pod³±czy siê
+ do sieci serwisy natychmiast go roz³±cz± oraz za³o¿± K-line
+ na jego host.
+
+ AKILL ADD dodaje maskê (w formacie user@host lub ip)
+ oraz powód (który musi zostaæ podany) na listê AKILL.
+ Podaj±c czas mo¿na stosowaæ jednostki: s dla sekund,
+ m dla minut, h dla godzin oraz d dla dni.
+ Kombinacja tych jednostek nie jest mo¿liwa. Domy¶ln±
+ jednostk± s± dni (+30 oznacza 30 dni). Podanie +0
+ oznacza, ¿e wpis nie wyga¶nie. Je¶li maska zaczyna siê
+ znakiem + to podanie czasu jest obowi±zkowe (nawet je¶li
+ jest identyczny z domy¶lnym). Domy¶lny czas wygasania
+ mo¿na sprawdziæ przy pomocy polecenia STATS AKILL.
+
+ AKILL DEL usuwa wskazane wpisy z listy AKILL.
+ Jako argument przyjmuje nick, numer wpisu lub
+ listê (przyk³ad poni¿ej dla polecenia LIST).
+
+ AKILL LIST wy¶wietla zawarto¶æ listy AKILL. Je¶li
+ zostanie podana maska tylko pasuj±ce wpisy zostan±
+ pokazane. Mo¿na tak¿e u¿yæ listy, przyk³ad:
+
+ AKILL LIST 2-5,7-9
+ Listuje wpisy od 2 do 5 oraz od 7 do 9.
+
+ AKILL VIEW zwraca wiêcej szczegó³ów ni¿ AKILL LIST.
+ Wy¶wietla informacje o dodaj±cym AKILL, datê dodania,
+ datê wyga¶niêcia, maskê oraz powód.
+
+ AKILL CLEAR usuwa wszystkie wpisy z listy AKILL.
+
+
+OPER_HELP_SGLINE
+ Sk³adnia: SGLINE ADD [+czas-trwania] maska powód
+ SGLINE DEL {maska | numer-wpisu | lista}
+ SGLINE LIST [maska | lista]
+ SGLINE VIEW [maska | lista]
+ SGLINE CLEAR
+
+ Pozwala operatorom serwisów na zarz±dzanie list± SGLINE.
+ Je¶li u¿ytkownik z realname pasuj±cym do maski na li¶cie
+ pod³±czy siê do sieci serwisy natychmiast go roz³±cz±.
+
+ SGLINE ADD dodaje wskazan± maskê realname oraz
+ powód (który musi zostaæ podany) na listê SGLINE.
+ Podaj±c czas mo¿na stosowaæ jednostki: s dla sekund,
+ m dla minut, h dla godzin oraz d dla dni.
+ Kombinacja tych jednostek nie jest mo¿liwa. Domy¶ln±
+ jednostk± s± dni (+30 oznacza 30 dni). Podanie +0
+ oznacza, ¿e wpis nie wyga¶nie. Je¶li maska zaczyna siê
+ znakiem + to podanie czasu jest obowi±zkowe (nawet je¶li
+ jest identyczny z domy¶lnym). Domy¶lny czas wygasania
+ mo¿na sprawdziæ przy pomocy polecenia STATS AKILL.
+ Uwaga: realname mo¿e zawieraæ spacje, dlatego
+ separatorem pomiêdzy mask± i powodem jest dwukropek.
+
+ SGLINE DEL usuwa wskazane wpisy z listy SGLINE.
+ Jako argument przyjmuje maskê, numer wpisu lub
+ listê (przyk³ad poni¿ej dla polecenia LIST).
+
+ SGLINE LIST wy¶wietla zawarto¶æ listy SGLINE. Je¶li
+ zostanie podana maska tylko pasuj±ce wpisy zostan±
+ pokazane. Mo¿na tak¿e u¿yæ listy, przyk³ad:
+
+ SGLINE LIST 2-5,7-9
+ Listuje wpisy od 2 do 5 oraz od 7 do 9.
+
+ SGLINE VIEW zwraca wiêcej szczegó³ów ni¿ SGLINE LIST.
+ Wy¶wietla informacje o dodaj±cym SGLINE, datê dodania,
+ datê wyga¶niêcia, maskê oraz powód.
+
+ SGLINE CLEAR usuwa wszystkie wpisy z listy.
+
+OPER_HELP_SQLINE
+ Sk³adnia: SQLINE ADD [+czas-trwania] maska powód
+ SQLINE DEL {maska | numer-wpisu | lista}
+ SQLINE LIST [maska | lista]
+ SQLINE VIEW [maska | lista]
+ SQLINE CLEAR
+
+ Pozwala operatorom serwisów na zarz±dzanie list± SQLINE.
+ Je¶li u¿ytkownik z nickiem pasuj±cym do maski na li¶cie
+ pod³±czy siê do sieci serwisy natychmiast go roz³±cz±.
+
+ Je¶li pierwszym znakiem maski jest # serwisy zablokuj±
+ mo¿liwo¶æ korzystania z kana³ów o nazwie pasuj±cej do
+ niej (o ile IRCd obs³uguje taki rodzaj blokady).
+
+ SQLINE ADD dodaje wskazan± maskê oraz powód
+ (który musi zostaæ podany) na listê SQLINE.
+ Podaj±c czas mo¿na stosowaæ jednostki: s dla sekund,
+ m dla minut, h dla godzin oraz d dla dni.
+ Kombinacja tych jednostek nie jest mo¿liwa. Domy¶ln±
+ jednostk± s± dni (+30 oznacza 30 dni). Podanie +0
+ oznacza, ¿e wpis nie wyga¶nie. Je¶li maska zaczyna siê
+ znakiem + to podanie czasu jest obowi±zkowe (nawet je¶li
+ jest identyczny z domy¶lnym). Domy¶lny czas wygasania
+ mo¿na sprawdziæ przy pomocy polecenia STATS AKILL.
+
+ SQLINE DEL usuwa wskazane wpisy z listy SQLINE.
+ Jako argument przyjmuje maskê, numer wpisu lub
+ listê (przyk³ad poni¿ej dla polecenia LIST).
+
+ SQLINE LIST wy¶wietla zawarto¶æ listy SQLINE. Je¶li
+ zostanie podana maska tylko pasuj±ce wpisy zostan±
+ pokazane. Mo¿na tak¿e u¿yæ listy, przyk³ad:
+
+ SQLINE LIST 2-5,7-9
+ Listuje wpisy od 2 do 5 oraz od 7 do 9.
+
+ SQLINE VIEW zwraca wiêcej szczegó³ów ni¿ SQLINE LIST.
+ Wy¶wietla informacje o dodaj±cym SQLINE, datê dodania,
+ datê wyga¶niêcia, maskê oraz powód.
+
+ SQLINE CLEAR usuwa wszystkie wpisy z listy.
+
+OPER_HELP_SZLINE
+ Sk³adnia: SZLINE ADD [+czas-trwania] maska powód
+ SZLINE DEL {maska | numer-wpisu | lista}
+ SZLINE LIST [maska | lista]
+ SZLINE VIEW [maska | lista]
+ SZLINE CLEAR
+
+ Pozwala operatorom serwisów na zarz±dzanie list± SZLINE.
+ Je¶li u¿ytkownik z adresem IP pasuj±cym do maski na li¶cie
+ pod³±czy siê do sieci serwisy natychmiast go roz³±cz±.
+
+ SZLINE ADD dodaje wskazan± maskê oraz powód
+ (który musi zostaæ podany) na listê SZLINE.
+ Podaj±c czas mo¿na stosowaæ jednostki: s dla sekund,
+ m dla minut, h dla godzin oraz d dla dni.
+ Kombinacja tych jednostek nie jest mo¿liwa. Domy¶ln±
+ jednostk± s± dni (+30 oznacza 30 dni). Podanie +0
+ oznacza, ¿e wpis nie wyga¶nie. Je¶li maska zaczyna siê
+ znakiem + to podanie czasu jest obowi±zkowe (nawet je¶li
+ jest identyczny z domy¶lnym). Domy¶lny czas wygasania
+ mo¿na sprawdziæ przy pomocy polecenia STATS AKILL.
+
+ SZLINE DEL usuwa wskazane wpisy z listy SZLINE.
+ Jako argument przyjmuje maskê, numer wpisu lub
+ listê (przyk³ad poni¿ej dla polecenia LIST).
+
+ SZLINE LIST wy¶wietla zawarto¶æ listy SZLINE. Je¶li
+ zostanie podana maska tylko pasuj±ce wpisy zostan±
+ pokazane. Mo¿na tak¿e u¿yæ listy, przyk³ad:
+
+ SZLINE LIST 2-5,7-9
+ Listuje wpisy od 2 do 5 oraz od 7 do 9.
+
+ SZLINE VIEW zwraca wiêcej szczegó³ów ni¿ SZLINE LIST.
+ Wy¶wietla informacje o dodaj±cym SZLINE, datê dodania,
+ datê wyga¶niêcia, maskê oraz powód.
+
+ SZLINE CLEAR usuwa wszystkie wpisy z listy.
+
+OPER_HELP_SET
+ Sk³adnia: SET opcja warto¶æ
+
+ Ustawia ró¿ne globalne ustawienia serwisów.
+ Obecnie zdefiniowane s± nastêpuj±ce ustawienia:
+ READONLY W³±cza tryb tylko-do-odczytu lub odczyt-zapis
+ LOGCHAN W³±cza raportowanie na kana³
+ DEBUG W³±cza lub wy³±cza tryb debugowania
+ NOEXPIRE W³±cza lub wy³±cza tryb noexpire
+ SUPERADMIN W³±cza lub wy³±cza tryb super administratora
+ SQL W³±cza lub wy³±cza obs³ugê SQL
+ IGNORE W³±cza lub wy³±cza tryb ignorowania
+ LIST Listuje aktualne ustawienia
+
+OPER_HELP_SET_READONLY
+ Sk³adnia: SET READONLY {ON | OFF}
+
+ W³±cza lub wy³±cza tryb tylko-do-odczytu. W³±czenie tej
+ opcji powoduje zablokowanie wykonywania zmian w ustawieniach
+ serwisów, dotyczy to list dostêpu kana³u oraz nicka itd.
+ Operatorzy serwisów z odpowiednimi uprawnieniami bêd±
+ mogli modyfikowaæ listê AKILL, usuwaæ lub blokowaæ nicki
+ oraz kana³y, ale ¿adne z tych zmian nie zostan± zapisane
+ dopóki tryb tylko-do-odczytu nie zostanie wy³±czony przed
+ restartem lub wy³±czeniem serwisów.
+
+ Ta opcja ma taki sam efekt jak argument linii poleceñ -readonly.
+
+OPER_HELP_SET_LOGCHAN
+ Sk³adnia: SET LOGCHAN {ON | OFF}
+
+ W³±cza lub wy³±cza wysy³anie wiadomo¶ci na podany kana³, które
+ trafiaj± do logów. Aby mo¿na by³o skorzystaæ z tej opcji nale¿y
+ zdefiniowaæ w pliku konfiguracyjnym nazwê kana³u (LogChannel).
+
+ Ta opcja ma taki sam efekt jak argument linii poleceñ -logchan.
+
+ Uwaga: Ustawiony kana³ musi byæ odpowiednio zabezpieczony,
+ aby chroniæ prywatno¶æ u¿ytkowników.
+OPER_HELP_SET_DEBUG
+ Sk³adnia: SET DEBUG {ON | OFF | poziom}
+
+ W³±cza lub wy³±cza tryb debugowania. W tym trybie wszystkie
+ dane wysy³ane do serwisów i przez nie oraz wiele innych
+ komunikatów zapisywane s± do loga. Je¶li zostanie podany
+ numer poziomu poziom tryb debugowania jest aktywowany
+ ze wskazanym poziomem.
+
+ Ta opcja ma taki sam efekt jak argument linii poleceñ -debug.
+
+OPER_HELP_SET_NOEXPIRE
+ Sk³adnia: SET NOEXPIRE {ON | OFF}
+
+ W³±cza lub wy³±cza tryb wygasania. Je¶li ta opcja
+ zosta³a w³±czona nicki, kana³y, wpisy na listach
+ AKILL oraz wyj±tków nie bêd± automatycznie wygasa³y.
+
+ Ta opcja ma taki sam efekt jak argument linii poleceñ -noexpire.
+
+OPER_HELP_SET_SUPERADMIN
+ Sk³adnia: SET SUPERADMIN {ON | OFF}
+
+ Ustawienie tej opcji nadaje wydaj±cemu polecenie
+ dodatkowe uprawnienia (np. jest w³a¶cicielem
+ wszystkich kana³ów w sieci).
+
+ Ta opcja powinna byæ u¿ywana tylko wtedy, kiedy
+ jest taka potrzeba. Nale¿y j± pó¼niej wy³±czyæ.
+
+OPER_HELP_SET_SQL
+ Sk³adnia: SET SQL {ON | OFF}
+
+ W³±cza lub wy³±cza korzystanie z bazy danych SQL.
+ Komenda ta pozwala na wy³±czenie serwera SQL
+ podczas nieprzerwanej pracy serwisów.
+
+OPER_HELP_SET_IGNORE
+ Sk³adnia: SET IGNORE {ON | OFF}
+
+ To ustawienie pozwala w³±czaæ/wy³±czaæ system ignorowania.
+
+OPER_HELP_SET_LIST
+ Sk³adnia: SET LIST
+
+ Listuje aktualne ustawienia serwisu %S.
+
+OPER_HELP_NOOP
+ Sk³adnia: NOOP SET serwer
+ NOOP REVOKE serwer
+
+ NOOP SET usuwa wszystkie O:linie ze wskazanego
+ serwera oraz killuje wszystkich operatorów, aby
+ zapobiec zrehashowaniu serwera (prze³adowanie pliku
+ konfiguracyjnego usuwa efekt tego polecenia).
+
+ NOOP REVOKE powoduje przywrócenie wszystkich
+ uprawnieñ na wskazanym serwerze.
+
+ Uwaga: Serwisy nie sprawdzaj± warto¶ci serwer.
+
+OPER_HELP_JUPE
+ Sk³adnia: JUPE serwer [powód]
+
+ To polecenie powoduje wprowadzenie przez serwisy do sieci
+ sztucznego serwera, co zapobiega pod³±czaniu prawdziwego
+ serwera o tej samej nazwie. Blokadê mo¿na zdj±æ u¿ywaj±c
+ standardowego polecenia SQUIT. Je¶li zostanie podany
+ powód bêdzie on wy¶wietlany w polu informacyjnym serwera,
+ w przeciwnym wypadku wy¶wietlane bêdzie "Juped by <nick>".
+
+OPER_HELP_RAW
+ Sk³adnia: RAW tekst
+
+ Wysy³a tekst bezpo¶rednio do serwera, do którego s±
+ pod³±czone serwisy. To polecenie ma bardzo ograniczone
+ zastosowanie i mo¿e powodowaæ chaos, kiedy jest u¿ywane
+ w sposób nieprawid³owy. NIE U¯YWAJ TEGO POLECENIA
+ je¶li nie masz pewno¶ci co robisz.
+
+OPER_HELP_UPDATE
+ Sk³adnia: UPDATE
+
+ Wymusza natychmiastowy zapis baz danych na dysku.
+
+OPER_HELP_RELOAD
+ Sk³adnia RELOAD
+
+ Wymusza ponowne za³adowanie pliku konfiguracyjnego.
+ Niektóre opcje wci±¿ wymagaj± restartu serwisów
+ (zmiana nicków serwisów, aktywacja limitów sesji itd.).
+OPER_HELP_QUIT
+ Sk³adnia: QUIT
+
+ Wymusza na serwisach natychmiastowe zakoñczenie pracy bez
+ zapisywania baz. To polecenie powinno byæ u¿yte jedynie,
+ gdy zachodzi podejrzenie uszkodzenia baz, które serwisy
+ przechowuj± w pamiêci. Do normalnego zakoñczenia pracy
+ serwisów nale¿y u¿yæ polecenia SHUTDOWN.
+
+OPER_HELP_SHUTDOWN
+ Sk³adnia: SHUTDOWN
+
+ Wymusza zapisanie baz danych, a nastêpnie wy³±cza serwisy.
+
+OPER_HELP_RESTART
+ Sk³adnia: RESTART
+
+ Wymusza zapisanie baz, a nastêpnie restartuje serwisy.
+
+OPER_HELP_CHANLIST
+ Sk³adnia: CHANLIST [{wzorzec | nick} [SECRET]]
+
+ Listuje wszystkie istniej±ce kana³y w sieci, niezale¿nie od
+ tego czy s± zarejestrowane.
+
+ Podanie wzorca ogranicza listê pokazywanych kana³ów.
+ Podanie nicka wy¶wietla kana³y, na których przebywa
+ wskazany u¿ytkownik. Dodanie parametru SECRET ogranicza
+ listê do kana³ów z flag± +s lub +p.
+
+OPER_HELP_USERLIST
+ Sk³adnia: USERLIST [{wzorzec | kana³} [INVISIBLE]]
+
+ Listuje wszystkich u¿ytkowników w sieci, niezale¿nie od
+ tego czy maj± zarejestrowanego nicka.
+
+ Podanie wzorca ogranicza listê pokazywanych u¿ytkowników.
+ (musi byæ w formacie nick!ident@host). Podanie kana³u
+ listuje u¿ytkowników przebywaj±cych na wskazanym kanale.
+ Dodanie parametru INVISIBLE listuje tylko u¿ytkowników z flag± +i.
+
+OPER_HELP_MODLOAD
+ Sk³adnia: MODLOAD nazwa-pliku
+
+ To polecenie ³aduje wskazany modu³ z katalogu modu³ów.
+
+OPER_HELP_MODUNLOAD
+ Sk³adnia: MODUNLOAD nazwa-pliku
+
+ To polecenie wy³aduje wskazany modu³.
+
+OPER_HELP_MODINFO
+ Sk³adnia: MODINFO nazwa-pliku
+
+ To polecenie wy¶wietla informacje na temat za³adowanego modu³u
+
+OPER_HELP_MODLIST
+ Sk³adnia: MODLIST [Core|3rd|protocol|encryption|supported|qatested]
+
+ Listuje za³adowane modu³y.
+
+###########################################################################
+#
+# BotServ help messages
+#
+###########################################################################
+BOT_HELP_CMD_BOTLIST
+ BOTLIST Listuje dostêpne boty
+
+BOT_HELP_CMD_ASSIGN
+ ASSIGN Przydziela bota na kana³
+
+BOT_HELP_CMD_SET
+ SET Konfiguruje bota
+
+BOT_HELP_CMD_KICK
+ KICK Konfiguruje opcje kopania
+
+BOT_HELP_CMD_BADWORDS
+ BADWORDS Zarz±dza list± zakazanych s³ów
+
+BOT_HELP_CMD_ACT
+ ACT Wyra¿a przez bota akcjê (komenda /me)
+
+BOT_HELP_CMD_INFO
+ INFO Pokazuje informacje i ustawienia BotServa
+ dotycz±ce bota lub kana³u
+
+BOT_HELP_CMD_SAY
+ SAY Wypowiada przez bota tekst na kanale
+
+BOT_HELP_CMD_UNASSIGN
+ UNASSIGN Usuwa bota z kana³u
+
+BOT_HELP_CMD_BOT
+ BOT Zarz±dza sieciow± list± botów
+
+BOT_HELP
+ %S pozwala umie¶ciæ bota na w³asnym kanale.
+ Zosta³ stworzony dla u¿ytkowników, którzy nie mog±
+ hostowaæ w³asnego bota oraz dla tych sieci które
+ nie pozwalaj± na ich u¿ywanie. Poni¿sze komendy
+ umo¿liwiaj± zarz±dzanie botem, aby ich u¿yæ wpisz:
+ %R%S komenda
+ Aby uzyskaæ szczegó³owy opis polecenia wpisz:
+ %R%S HELP komenda
+
+BOT_HELP_FOOTER
+ Bot wejdzie na kana³ je¶li przebywa na nim
+ przynajmniej %d u¿ytkownik(ów).
+
+BOT_HELP_BOTLIST
+ Sk³adnia: BOTLIST
+
+ Listuje dostêpne w sieci boty.
+
+BOT_HELP_ASSIGN
+ Sk³adnia: ASSIGN kana³ nick
+
+ Przydziela bota o wskazanym nicku na kana³.
+
+BOT_HELP_UNASSIGN
+ Sk³adnia: UNASSIGN kana³
+
+ U¿ycie tej komendy usuwa bota z kana³u.
+ Bêdzie mo¿na go ponownie przydzieliæ w ka¿dej
+ chwili, bez potrzeby ponownego konfigurowania.
+
+BOT_HELP_INFO
+ Sk³adnia: INFO {kana³ | nick}
+
+ Wy¶wietla informacje serwisu %S o wskazanym kanale
+ lub bocie. Je¶li parametrem jest nazwa kana³u to
+ zostan± pokazane informacje dotycz±ce kana³u.
+ Je¶li parametrem bêdzie nick bota to zostan±
+ pokazane informacje takie jak: data utworzenia,
+ ilo¶æ obs³ugiwanych kana³ów itp.
+
+BOT_HELP_SET
+ Sk³adnia: SET (kana³ | bot) opcja parametry
+
+ Umo¿liwia konfiguracjê nastêpuj±cych opcji bota:
+
+ DONTKICKOPS Bot nie kopie operatorów
+ DONTKICKVOICES Bot nie kopie osób z prawem g³osu
+ GREET W³±cza wiadomo¶æ powitaln±
+ FANTASY W³±cza publiczne komendy
+ SYMBIOSIS Przejmuje zadania ChanServa
+
+ Aby uzyskaæ wiêcej informacji wpisz:
+ %R%S HELP SET opcja
+
+ Informacja: dostêp do tej komendy jest kontrolowany
+ przez poziom SET.
+BOT_HELP_SET_DONTKICKOPS
+ Sk³adnia: SET kana³ DONTKICKOPS {ON|OFF}
+
+ W³±cza lub wy³±cza opcjê kopania u¿ytkowników
+ posiadaj±cych status operatora nawet je¶li nie
+ przys³uguje im poziom dostêpu NOKICK.
+
+BOT_HELP_SET_DONTKICKVOICES
+ Sk³adnia: SET kana³ DONTKICKVOICES {ON|OFF}
+
+ W³±cza lub wy³±cza opcjê kopania u¿ytkowników
+ posiadaj±cych prawo g³osu nawet je¶li nie
+ przys³uguje im poziom dostêpu NOKICK.
+
+BOT_HELP_SET_FANTASY
+ Sk³adnia: SET kana³ FANTASY {ON|OFF}
+
+ W³±cza lub wy³±cza dostêp do publicznych poleceñ
+ na kanale takich jak: !op, !deop, !voice, !devoice,
+ !kick, !kb, !unban, !seen (cze¶æ komend przyjmuje
+ jako parametry nicki i powody).
+
+ U¿ytkownicy dopuszczeni do u¿ywania komend
+ publicznych musz± mieæ odpowiedni poziom dostêpu
+ do wydania danego polecenia (np. aby u¿ywac !deop
+ trzeba posiadaæ poziom dostêpu OPDEOP).
+
+BOT_HELP_SET_GREET
+ Sk³adnia: SET kana³ GREET {ON|OFF}
+
+ W³±cza lub wy³±cza witanie podczas wej¶cia u¿ytkowników
+ ich w³asn± wiadomo¶ci± powitaln±. U¿ytkownik zostanie
+ powitany, je¶li bêdzie mia³ odpowiedni poziom dostêpu.
+
+BOT_HELP_SET_SYMBIOSIS
+ Sk³adnia: SET kana³ SYMBIOSIS {ON|OFF}
+
+ W³±cza lub wy³±cza opcjê symbiozy na kanale.
+ Gdy ten tryb jest w³±czony wszystkie operacje,
+ które wykonywa³ %s (np. opowanie) bêd±
+ wykonywane przez bota.
+
+BOT_HELP_KICK
+ Sk³adnia: KICK kana³ opcja parametry
+
+ Konfiguruje opcje kopania na kanale:
+
+ BOLDS Kopanie za u¿ywanie pogrubieñ
+ BADWORDS Kopanie za u¿ywanie zakazanych s³ów
+ CAPS Kopanie za pisanie WIELKIMI LITERAMI
+ COLORS Kopanie za stosowanie kolorów
+ FLOOD Kopanie za flood
+ REPEAT Kopanie za wielokrotne powtarzanie
+ REVERSES Kopanie za odwracanie kolorów
+ UNDERLINES Kopanie za u¿ywanie podkre¶leñ
+
+ Aby uzyskaæ wiêcej informacji wpisz:
+ %R%S HELP KICK opcja
+
+BOT_HELP_KICK_BOLDS
+ Sk³adnia: KICK kana³ BOLDS {ON|OFF} [ttb]
+
+ Ustawia kopanie za pogrubianie tekstu.
+
+ ttb to liczba okre¶laj±ca ile razy u¿ytkownik
+ zostanie wykopany zanim bot za³o¿y bana.
+ Pominiêcie parametru ttb wy³±cza banowanie.
+
+BOT_HELP_KICK_COLORS
+ Sk³adnia: KICK kana³ COLORS {ON|OFF} [ttb]
+
+ Ustawia kopanie za u¿ywanie kolorowego tekstu.
+
+ ttb to liczba okre¶laj±ca ile razy u¿ytkownik
+ zostanie wykopany zanim bot za³o¿y bana.
+ Pominiêcie parametru ttb wy³±cza banowanie.
+
+BOT_HELP_KICK_REVERSES
+ Sk³adnia: KICK kana³ REVERSES {ON|OFF} [ttb]
+
+ Ustawia kopanie za odwracanie kolorów tekstu (ctrl+r).
+
+ ttb to liczba okre¶laj±ca ile razy u¿ytkownik
+ zostanie wykopany zanim bot za³o¿y bana.
+ Pominiêcie parametru ttb wy³±cza banowanie.
+
+BOT_HELP_KICK_UNDERLINES
+ Sk³adnia: KICK kana³ UNDERLINES {ON|OFF} [ttb]
+
+ Ustawia kopanie za podkre¶lanie tekstu.
+
+ ttb to liczba okre¶laj±ca ile razy u¿ytkownik
+ zostanie wykopany zanim bot za³o¿y bana.
+ Pominiêcie parametru ttb wy³±cza banowanie.
+
+BOT_HELP_KICK_CAPS
+ Sk³adnia: KICK kana³ CAPS {ON|OFF} [ttb [min [procent]]]
+
+ Ustawia kopanie za u¿ywanie WIELKICH LITER.
+
+ Bot kopie je¶li tekst zawiera przynajmniej min
+ wielkich liter i stanowi przynajmniej procent
+ ca³ego tekstu w linii (w przypadku nie podania tych
+ warto¶ci przyjmowane s± domy¶lne: 10 znaków i 25%).
+
+ ttb to liczba okre¶laj±ca ile razy u¿ytkownik
+ zostanie wykopany zanim bot za³o¿y bana.
+ Pominiêcie parametru ttb wy³±cza banowanie.
+
+BOT_HELP_KICK_FLOOD
+ Sk³adnia: KICK kana³ FLOOD {ON|OFF} [ttb [ln [sek]]]
+
+ Ustawia kopanie za flood. W³±czenie tej opcji
+ powoduje wykopywanie u¿ytkowników wysy³aj±cych na
+ kana³ przynajmniej ln linii tekstu w ci±gu sek
+ sekund (w przypadku nie podania tych warto¶ci przyjmowane
+ s± domy¶lne: 6 linii w ci±gu 10 sekund).
+
+ ttb to liczba okre¶laj±ca ile razy u¿ytkownik
+ zostanie wykopany zanim bot za³o¿y bana.
+ Pominiêcie parametru ttb wy³±cza banowanie.
+
+BOT_HELP_KICK_REPEAT
+ Sk³adnia: KICK kana³ REPEAT {ON|OFF} [ttb [liczba]]
+
+ Ustawia kopanie za powtarzanie tekstu. W³±czenie tej
+ opcji powoduje wykopywanie u¿ytkowników wysy³aj±cych
+ na kana³ przynajmniej liczba razy ten sam tekst
+ (w przypadku nie podania tego parametru jego warto¶æ
+ ustalana jest domy¶lnie na 3).
+
+ ttb to liczba okre¶laj±ca ile razy u¿ytkownik
+ zostanie wykopany zanim bot za³o¿y bana.
+ Pominiêcie parametru ttb wy³±cza banowanie.
+
+BOT_HELP_KICK_BADWORDS
+ Sk³adnia: KICK kana³ BADWORDS {ON|OFF} [ttb]
+
+ Ustawia kopanie za u¿ywanie zakazanych s³ów.
+
+ Aby ustaliæ listê zakazanych u¿yj polecenia BADWORDS.
+ Aby uzyskaæ wiêcej informacji wpisz:
+ %R%S HELP BADWORDS
+
+ ttb to liczba okre¶laj±ca ile razy u¿ytkownik
+ zostanie wykopany zanim bot za³o¿y bana.
+ Pominiêcie parametru ttb wy³±cza banowanie.
+
+BOT_HELP_BADWORDS
+ Sk³adnia: BADWORDS kana³ ADD s³owo [SINGLE | START | END]
+ BADWORDS kana³ DEL {s³owo | numer-wpisu | lista}
+ BADWORDS kana³ LIST [maska | lista]
+ BADWORDS kana³ CLEAR
+
+ Polecenie umo¿liwia zarz±dzanie list± niedozwolonych
+ s³ów. Lista definiuje za jakie s³owa u¿ytkownicy mog±
+ zostaæ wyrzuceni z kana³u. Aby uzyskaæ wiêcej informacji
+ napisz: %R%S HELP KICK BADWORDS
+
+ BADWORDS ADD dodaje wskazane s³owo do listy.
+ Parametr SINGLE powoduje, ¿e u¿ytkownicy bêd± kopani za
+ u¿ywanie wskazanego s³owa w ca³o¶ci.
+ Parametr START powoduje, ¿e u¿ytkownicy bêd± kopani za
+ u¿ywanie wskazanego s³owa na pocz±tku innych wyrazów.
+ Parametr END powoduje, ¿e u¿ytkownicy bêd± kopani za
+ u¿ywanie wskazanego s³owa na koñcu innych wyrazów.
+ Pominiêcie parametru powoduje, ¿e u¿ytkownicy bêd±
+ kopani w ka¿dym z przypadków, kiedy zostanie u¿yte
+ wskazane s³owo.
+
+ BADWORDS DEL usuwa wskazane wpisy z listy s³ów.
+ Jako argument przyjmuje s³owo, numer wpisu lub
+ listê (przyk³ad poni¿ej dla polecenia LIST).
+
+ BADWORDS LIST wy¶wietla zawarto¶æ listy s³ów. Je¶li
+ zostanie podana maska tylko pasuj±ce wpisy zostan±
+ pokazane. Mo¿na tak¿e u¿yæ listy, przyk³ad:
+
+ BADWORDS kana³ LIST 2-5,7-9
+ Listuje wpisy od numeru 2 do 5 oraz od 7 do 9.
+
+ BADWORDS CLEAR usuwa wszystkie wpisy z listy.
+
+BOT_HELP_SAY
+ Sk³adnia: SAY kana³ tekst
+
+ Wypowiada przez bota podany tekst na kanale.
+
+BOT_HELP_ACT
+ Sk³adnia: ACT kana³ tekst
+
+ Sprawia, ¿e bot u¿yje komendy akcji (/me) przy
+ wypowiadaniu podanego tekstu na kanale.
+
+BOT_SERVADMIN_HELP_BOT
+ Sk³adnia: BOT ADD nick ident host nazwa
+ BOT CHANGE starynick nowynick [ident [host [nazwa]]]
+ BOT DEL nick
+
+ Polecenie pozwala administratorom serwisów na
+ tworzenie, modyfikowanie oraz kasowanie botów
+ u¿ywanych przez u¿ytkowników sieci na kana³ach.
+
+ BOT ADD dodaje bota o podanym nicku, idencie,
+ ho¶cie oraz realname.
+ BOT CHANGE pozwala na zmianê nicka, identa,
+ hosta lub realname bota bez jego kasowania.
+ BOT DEL usuwa wskazanego bota.
+
+ UWAGA: Je¶li stworzony zostanie bot o nicku,
+ który jest ju¿ zarejestrowany, nick zostanie
+ odrejestrowany. Podobnie je¶li nick stworzonego
+ bota bêdzie u¿ywany przez innego u¿ytkownika,
+ zostanie on wtedy skillowany.
+
+BOT_SERVADMIN_HELP_SET
+
+ Opcje dostêpne dla administratorów serwisów:
+
+ NOBOT Uniemo¿liwia przypisanie bota do kana³u
+ PRIVATE Zastrzega przypisywanie bota tylko dla IRC
+ Operatorów
+
+BOT_SERVADMIN_HELP_SET_NOBOT
+ Sk³adnia: SET kana³ NOBOT {ON|OFF}
+
+ Polecenie to pozwala okre¶liæ kana³, dla którego
+ nie wolno przypisywaæ botów. Je¶li w danej chwili
+ bot jest przypisany do kana³u, zostanie usuniêty.
+
+BOT_SERVADMIN_HELP_SET_PRIVATE
+ Sk³adnia: SET nick-bota PRIVATE {ON|OFF}
+
+ Polecenie pozwala na ograniczenie przypisywania
+ wskazanego bota dla u¿ytkowników nie bêd±cych
+ IRC operatorami.
+
+###########################################################################
+#
+# HostServ messages
+#
+###########################################################################
+HOST_EMPTY
+ Lista vhostów jest pusta.
+
+HOST_ENTRY
+ #%d Nick:%s, vhost:%s (%s - %s)
+
+HOST_IDENT_ENTRY
+ #%d Nick:%s, vhost:%s@%s (%s - %s)
+
+HOST_SET
+ Vhost dla %s zosta³ zmieniony na %s.
+
+HOST_IDENT_SET
+ Vhost dla %s zosta³ zmieniony na %s@%s.
+
+HOST_SETALL
+ Vhosty dla grupy %s zosta³y zmienione na %s.
+
+HOST_DELALL
+ Vhosty dla grupy %s zosta³y usuniête.
+
+HOST_DELALL_SYNTAX
+ Sk³adnia: DELALL <nick>.
+
+HOST_IDENT_SETALL
+ Vhosty dla grupy %s zosta³y zmienione na %s@%s.
+
+HOST_SET_ERROR
+ Vhost musi mieæ format prawid³owej maski hosta.
+
+HOST_SET_IDENT_ERROR
+ Ident vhosta musi mieæ format prawid³owego identa.
+
+HOST_SET_TOOLONG
+ B³±d! Vhost jest za d³ugi, u¿yj vhosta krótszego ni¿ %d znaków.
+
+HOST_SET_IDENTTOOLONG
+ B³±d! Ident jest za d³ugi, u¿yj identa krótszego ni¿ %d znaków.
+
+HOST_NOREG
+ Nie znaleziono %s w bazie serwisu NickServ.
+
+HOST_SET_SYNTAX
+ Sk³adnia %R%s SET <nick> <maska-hosta>.
+
+HOST_SETALL_SYNTAX
+ Sk³adnia %R%s SETALL <nick> <maska-hosta>.
+
+HOST_DENIED
+ Brak dostêpu.
+
+HOST_NOT_ASSIGNED
+ Skontaktuj siê z operatorem, aby uzyskaæ vhosta na ten nick.
+
+HOST_ACTIVATED
+ Twój vhost %s jest teraz aktywny.
+
+HOST_IDENT_ACTIVATED
+ Twój vhost %s@%s jest teraz aktywny.
+
+HOST_ID
+ Najpierw zidentyfikuj siê u serwisów.
+
+HOST_NOT_REGED
+ Aby uzyskaæ vhosta musisz byæ najpierw zarejestrowany.
+
+HOST_DEL
+ Vhost dla %s zosta³ usuniêty.
+
+HOST_DEL_SYNTAX
+ Sk³adnia: %R%s DEL <nick>.
+
+HOST_OFF_UNREAL
+ Twój vhost zosta³ usuniêty. Aby w³±czyæ standardowe ukrywanie hosta wpisz /mode %s +%s
+
+HOST_NO_VIDENT
+ Twoje IRCD nie obs³uguje vIdentów, je¶li nie jest to prawda zg³o¶ b³±d.
+
+HOST_GROUP
+ Wszystkie vhosty w grupie %s zosta³y zmienione na %s
+
+HOST_IDENT_GROUP
+ Wszystkie vhosty w grupie %s zosta³y zmienione na %s@%s
+
+HOST_LIST_FOOTER
+ Wy¶wietlono wszystkie wpisy (Liczba: %d)
+
+HOST_LIST_RANGE_FOOTER
+ Wy¶wietlono wpisy od %d do %d
+
+HOST_LIST_KEY_FOOTER
+ Wy¶wietlono pasuj±ce wpisy %s (Liczba: %d)
+
+###########################################################################
+#
+# HostServ Help messages
+#
+###########################################################################
+HOST_HELP_CMD_ON
+ ON Aktywuje przypisanego vhosta
+
+HOST_HELP_CMD_OFF
+ OFF Deaktywuje przypisanego vhosta
+
+HOST_HELP_CMD_GROUP
+ GROUP Synchronizuje vhosty wszystkich nicków w grupie
+
+HOST_HELP_CMD_SET
+ SET Zmienia vhost wskazanemu u¿ytkownikowi
+
+HOST_HELP_CMD_SETALL
+ SETALL Zmienia vhosty wszystkich nicków w grupie
+
+HOST_HELP_CMD_DEL
+ DEL Usuwa vhost wskazanego u¿ytkownika
+
+HOST_HELP_CMD_DELALL
+ DELALL Usuwa vhosty wszystkich nicków w grupie
+
+HOST_HELP_CMD_LIST
+ LIST Listuje vhosty
+
+HOST_OPER_HELP
+ nie jest u¿ywane.
+
+HOST_ADMIN_HELP
+ nie jest u¿ywane.
+
+HOST_HELP
+ Komendy %S:
+
+HOST_HELP_ON
+ Sk³adnia: ON
+
+ Aktywuje vhosta aktualnie przypisanego do u¿ywanego nicka.
+ Po u¿yciu tego polecenia Twój prawdziwy adres zostanie
+ zast±piony vhostem.
+
+HOST_HELP_SET
+ Sk³adnia: SET <nick> <vhost>.
+
+ Ustawia wskazanemu u¿ytkownikowi vhosta.
+ Je¶li Twoje IRCD obs³uguje videnty to u¿ywaj±c
+ polecenia SET <nick> <ident>@<vhost>
+ mo¿na zmieniaæ tak¿e ident.
+
+HOST_HELP_DELALL
+ Sk³adnia: DELALL <nick>.
+
+ Usuwa wszystkie vhosty grupy, do której nale¿y wskazany nick.
+
+HOST_HELP_SETALL
+ Sk³adnia: SETALL <nick> <vhost>.
+
+ Ustawia vhosta dla wszystkich nicków w obrêbie grupy.
+ Je¶li IRCD obs³uguje vIdenty wydanie polecenia
+ SETALL <nick> <ident>@<vhost> spowoduje ustawienie
+ tak¿e identów.
+
+ UWAGA: to polecenie nie spowoduje zmiany vhosta
+ dla nicka, który pó¼niej zostanie dodany do grupy.
+
+HOST_HELP_OFF
+ Sk³adnia: OFF
+
+ Deaktywuje vhosta aktualnie przypisanego do u¿ywanego nicka.
+ Po u¿yciu tego polecenia ka¿dy bêdzie móg³ sprawdziæ Twój
+ prawdziwy adres u¿ywaj±c polecenia /WHOIS.
+
+HOST_HELP_DEL
+ Sk³adnia: DEL <nick>
+
+ Usuwa vhosta przypisanego do wskazanego nicka.
+
+HOST_HELP_LIST
+ Sk³adnia: LIST [<wzorzec>|<#X-Y>]
+
+ To polecenie listuje zarejestrowane vhosty operatorowi.
+ Je¶li podano wzorzec tylko wpisy o pasuj±cych nickach
+ lub vhostach zostan± pokazane. Podanie np. Rob*
+ spowoduje wy¶wietlenie wszystkich wpisów zaczynaj±cych
+ siê od Rob.
+
+ Je¶li zostanie u¿yty format #X-Y to tylko wpisy nale¿±ce
+ do przedzia³u od X do Y bêd± pokazane. Podanie #1-3
+ spowoduje wy¶wietlenie pierwszych 3 wpisów wpisów.
+
+ Maksymalna d³ugo¶æ listy wy¶wietlanej operatorowi podczas
+ jednego zapytania jest okre¶lona przez ustawienie NSListMax.
+
+HOST_HELP_GROUP
+ Sk³adnia: GROUP
+
+ To polecenie pozwala ustawiæ vhost bie¿±cego nicka
+ dla wszystkich nicków w grupie.
+
+OPER_SVSNICK_UNSUPPORTED
+ Komenda SVSNICK nie jest dostêpna w tej sieci.
+
+OPER_SQLINE_UNSUPPORTED
+ Komenda SQLINE nie jest dostêpna w tej sieci.
+
+OPER_SVSO_UNSUPPORTED
+ Komenda OLINE nie jest dostêpna w tej sieci.
+
+OPER_UMODE_UNSUPPORTED
+ Komenda UMODE nie jest dostêpna w tej sieci.
+
+OPER_SUPER_ADMIN_NOT_ENABLED
+ Opcja SuperAdmin nie jest w³±czona w pliku konfiguracyjnym.
+
diff --git a/lang/pt.l b/lang/pt.l
new file mode 100644
index 000000000..3bf994432
--- /dev/null
+++ b/lang/pt.l
@@ -0,0 +1,6665 @@
+# Portuguese language file.
+#
+# (C) 2003-2008 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 us know
+# (dev@anope.org) 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
+# services.conf). 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.
+###########################################################
+## Translation fully reviewed/completed/updated
+## by Ricardo at 01/16/2005.
+###
+## Tradução totalmente revista/completada/atualizada
+## por Ricardo em 16/01/2005.
+## Atualizações/Updates:
+## * SVN 564 - 01/31/2005.
+## * SVN 611 - 03/08/2005.
+## * SVN 815 - 05/27/2005.
+###########################################################
+###########################################################################
+#
+# 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
+ Sáb
+# %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. Digite %R%s HELP para ajuda.
+SYNTAX_ERROR
+ Sintaxe: %s
+MORE_INFO
+ Digite %R%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 somente leitura; as mudanças não serão salvas!
+PASSWORD_INCORRECT
+ Senha incorreta.
+INVALID_TARGET
+ "/msg %s" is no longer supported. Use "/msg %s@%s" or "/%s" instead.
+
+# 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 está desabilitada. Se realmente precisar, deve desabilitar a opção DisableRaw na configuração dos Services.
+
+MORE_OBSCURE_PASSWORD
+ Por favor tente novamente com uma senha mais difícil. Não use TAB ou espaços.
+PASSWORD_TOO_LONG
+ Your password is too long. Please try again with a shorter password.
+
+NICK_NOT_REGISTERED
+ Seu nick não está registrado.
+NICK_NOT_REGISTERED_HELP
+ Seu nick não está registrado. Digite %R%s HELP para maiores informações sobre como registrar o nick.
+NICK_X_IS_SERVICES
+ Nick %s é parte dos Services desta Rede.
+NICK_X_NOT_REGISTERED
+ Nick %s não está registrado.
+NICK_X_IN_USE
+ Nick %s está atualmente em uso.
+NICK_X_NOT_IN_USE
+ Nick %s não está sendo usado.
+NICK_X_NOT_ON_CHAN
+ %s não está atualmente no canal %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 é um nick ilegal e não pode ser usado.
+NICK_X_TRUNCATED
+ Nick %s foi truncado para %d caracteres.
+NICK_X_SUSPENDED
+ Nick %s está atualmente suspenso.
+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
+ Suspenso: [%s] %s
+NICK_IDENTIFY_REQUIRED
+ Identificação de senha requerida para usar este comando.
+ Tente novamente após digitar %R%s IDENTIFY senha.
+CHAN_IDENTIFY_REQUIRED
+ Identificação de senha requerida para usar este comando.
+ Tente novamente após digitar %R%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
+ Fim da lista de %s.
+
+###########################################################################
+#
+# NickServ messages
+#
+###########################################################################
+
+# Automatic messages
+LIST_INCORRECT_RANGE
+ Incorrect range specified. The correct syntax is #from-to.
+CS_LIST_INCORRECT_RANGE
+ To search for channels starting with #, search for the channel
+ name without the #-sign prepended (anope instead of #anope).
+
+###########################################################################
+#
+# NickServ messages
+#
+###########################################################################
+
+# Automatic messages
+HELP_LIMIT_SERV_OPER
+ Limited to Services Operators.
+HELP_LIMIT_SERV_ADMIN
+ Limited to Services Administrators.
+HELP_LIMIT_SERV_ROOT
+ Limited to Services Roots.
+HELP_LIMIT_IRC_OPER
+ Limited to IRC Operators.
+HELP_LIMIT_HOST_SETTER
+ Limited to Host Setters.
+HELP_LIMIT_HOST_REMOVER
+ Limited to Host Removers.
+
+
+###########################################################################
+#
+# NickServ messages
+#
+###########################################################################
+
+# Automatic messages
+NICK_IS_REGISTERED
+ Este nick foi registrado por outra pessoa. Por favor escolha outro.
+ (Se este for seu nick, digite %R%s IDENTIFY senha.)
+NICK_IS_SECURE
+ Este nick está registrado e protegido. Se este for seu
+ nick, digite %R%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_REGISTERED_NO_MASK
+ Nick %s registrado.
+NICK_PASSWORD_IS
+ Sua senha é %s - guarde ela para uso posterior.
+NICK_REG_DELAY
+ Você deve estar conectado há mais de %d segundos para registrar seu nick.
+
+# 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 %R%s DROP primeiro.
+NICK_GROUP_SAME
+ Você já é um membro do grupo %s.
+NICK_GROUP_TOO_MANY
+ Existem muitos nicks no grupo de %s; liste-os e remova alguns.
+ Digite %R%s HELP GLIST e %R%s HELP DROP para
+ mais informações.
+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 %R%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
+ Você já está identificado.
+
+# UPDATE responses
+NICK_UPDATE_SUCCESS
+ Status atualizado (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
+ Impossível fazer logout em %s porque ele é um Administrador dos Services.
+
+# 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_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 %R%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 nesta 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 | STATUS | USERMASK | QUIT} {ON | OFF}
+NICK_SET_HIDE_EMAIL_ON
+ Seu e-mail está agora escondido do comando %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.
+NICK_SET_HIDE_STATUS_ON
+ Seu status de acesso nos Services está agora escondido do comando %s INFO.
+NICK_SET_HIDE_STATUS_OFF
+ Seu status de acesso nos Services 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 AUTOOP responses
+NICK_SET_AUTOOP_SYNTAX
+ SET AUTOOP {ON | OFF}
+NICK_SET_AUTOOP_ON
+ Services will now autoop you in channels.
+NICK_SET_AUTOOP_OFF
+ Services will no longer autoop you in channels.
+
+# SET NOEXPIRE responses
+NICK_SASET_SYNTAX
+ SASET nickname option parameters
+NICK_SASET_DISABLED
+ Sorry, nickname option setting is temporarily disabled.
+NICK_SASET_UNKNOWN_OPTION
+ Unknown SASET option %s.
+NICK_SASET_BAD_NICK
+ Nickname %s not registered.
+NICK_SASET_OPTION_DISABLED
+ Option %s cannot be set on this network.
+
+# SASET DISPLAY responses
+NICK_SASET_DISPLAY_INVALID
+ The new display for %s MUST be a nickname of the nickname group!
+NICK_SASET_DISPLAY_CHANGED
+ The new display is now %s.
+
+# SASET PASSWORD responses
+NICK_SASET_PASSWORD_FAILED
+ Sorry, couldn't change password for %s.
+NICK_SASET_PASSWORD_CHANGED
+ Password for %s changed.
+NICK_SASET_PASSWORD_CHANGED_TO
+ Password for %s changed to %s.
+
+# SASET LANGUAGE responses
+NICK_SASET_URL_CHANGED
+ URL for %s changed to %s.
+NICK_SASET_URL_UNSET
+ URL %s unset.
+
+# SASET EMAIL responses
+NICK_SASET_EMAIL_CHANGED
+ E-mail address for %s changed to %s.
+NICK_SASET_EMAIL_UNSET
+ E-mail address for %s unset.
+NICK_SASET_EMAIL_UNSET_IMPOSSIBLE
+ You cannot unset the e-mail on this network.
+
+# SASET ICQ responses
+NICK_SASET_ICQ_CHANGED
+ ICQ number for %s set to %s.
+NICK_SASET_ICQ_UNSET
+ ICQ number for %s unset.
+NICK_SASET_ICQ_INVALID
+ %s is not a valid number.
+
+# SASET GREET responses
+NICK_SASET_GREET_CHANGED
+ Greet message for %s changed to %s.
+NICK_SASET_GREET_UNSET
+ Greet message for %s unset.
+
+# SASET PROTECT responses
+NICK_SASET_KILL_SYNTAX
+ SASET nickname KILL {ON | QUICK | OFF}
+NICK_SASET_KILL_IMMED_SYNTAX
+ SASET nickname KILL {ON | QUICK | IMMED | OFF}
+NICK_SASET_KILL_ON
+ Protection is now ON for %s.
+NICK_SASET_KILL_QUICK
+ Protection is now ON for %s, with a reduced delay.
+NICK_SASET_KILL_IMMED
+ Protection is now ON for %s, with no delay.
+NICK_SASET_KILL_IMMED_DISABLED
+ The IMMED option is not available on this network.
+NICK_SASET_KILL_OFF
+ Protection is now OFF for %s.
+
+# SASET SECURE responses
+NICK_SASET_SECURE_SYNTAX
+ SASET nickname SECURE {ON | OFF}
+NICK_SASET_SECURE_ON
+ Secure option is now ON for %s.
+NICK_SASET_SECURE_OFF
+ Secure option is now OFF for %s.
+
+# SASET PRIVATE responses
+NICK_SASET_PRIVATE_SYNTAX
+ SASET nickname PRIVATE {ON | OFF}
+NICK_SASET_PRIVATE_ON
+ Private option is now ON for %s.
+NICK_SASET_PRIVATE_OFF
+ Private option is now OFF for %s.
+
+# SASET HIDE responses
+NICK_SASET_HIDE_SYNTAX
+ SET nickname HIDE {EMAIL | USERMASK | QUIT} {ON | OFF}
+NICK_SASET_HIDE_EMAIL_ON
+ The E-mail address of %s will now be hidden from %s INFO displays.
+NICK_SASET_HIDE_EMAIL_OFF
+ The E-mail address of %s will now be shown in %s INFO displays.
+NICK_SASET_HIDE_MASK_ON
+ The last seen user@host mask of %s will now be hidden from %s INFO displays.
+NICK_SASET_HIDE_MASK_OFF
+ The last seen user@host mask of %s will now be shown in %s INFO displays.
+NICK_SASET_HIDE_QUIT_ON
+ The last quit message of %s will now be hidden from %s INFO displays.
+NICK_SASET_HIDE_QUIT_OFF
+ The last quit message of %s will now be shown in %s INFO displays.
+NICK_SASET_HIDE_STATUS_ON
+ The services access status of %s will now be hidden from %s INFO displays.
+NICK_SASET_HIDE_STATUS_OFF
+ The services access status of %s will now be shown in %s INFO displays.
+
+# SASET MSG responses
+NICK_SASET_MSG_SYNTAX
+ SSAET nickname PRIVATE {ON | OFF}
+NICK_SASET_MSG_ON
+ Services will now reply to %s with messages.
+NICK_SASET_MSG_OFF
+ Services will now reply to %s with notices.
+
+# SET NOEXPIRE responses
+NICK_SASET_NOEXPIRE_SYNTAX
+ SASET nickname NOEXPIRE {ON | OFF}
+NICK_SASET_NOEXPIRE_ON
+ Nick %s will not expire.
+NICK_SASET_NOEXPIRE_OFF
+ Nick %s will expire.
+
+# ACCESS responses
+NICK_SASET_AUTOOP_SYNTAX
+ SASET nickname AUTOOP {ON | OFF}
+NICK_SASET_AUTOOP_ON
+ Services will now autoop %s in channels.
+NICK_SASET_AUTOOP_OFF
+ Services will no longer autoop %s in channels.
+
+# SASET LANGUAGE responses
+NICK_SASET_LANGUAGE_SYNTAX
+ SASET nickname LANGUAGE number
+NICK_SASET_LANGUAGE_UNKNOWN
+ Unknown language number %d. Type %R%s HELP SET LANGUAGE for a list of languages.
+NICK_SASET_LANGUAGE_CHANGED
+ Language changed to Portuguese.
+
+
+# ACCESS responses
+NICK_ACCESS_SYNTAX
+ ACCESS {ADD | DEL | LIST} [máscara]
+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:
+NICK_ACCESS_LIST_EMPTY
+ Sua lista de acesso está vazia.
+NICK_ACCESS_LIST_X_EMPTY
+ Lista de acesso para %s está vazia.
+
+# Status messages
+NICK_STATUS_0
+ STATUS %s 0
+NICK_STATUS_1
+ STATUS %s 1
+NICK_STATUS_2
+ STATUS %s 2
+NICK_STATUS_3
+ STATUS %s 3
+
+# 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 Administrador dos Services.
+NICK_INFO_SERVICES_ROOT
+ %s é um Services Root Administrator.
+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
+ Último 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_VHOST2
+ vHost: %s@%s
+NICK_INFO_ICQ
+ ICQ: %d
+NICK_INFO_GREET
+ Mensagem de entrada: %s
+NICK_INFO_OPTIONS
+ Opções: %s
+NICK_INFO_EXPIRE
+ Expira em: %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_AUTOOP
+ Auto-op
+NICK_INFO_OPT_NONE
+ Nenhuma
+NICK_INFO_NO_EXPIRE
+ Este nick não irá expirar.
+NICK_INFO_FOR_MORE
+ Para informações mais detalhadas, digite %R%s INFO %s ALL.
+
+# LIST responses
+NICK_INFO_SUSPENDED
+ Este nick está atualmente suspenso, motivo: %s
+NICK_INFO_SUSPENDED_NO_REASON
+ Este nick está atualmente suspenso
+
+# LIST responses
+NICK_LIST_SYNTAX
+ LIST opções
+NICK_LIST_SERVADMIN_SYNTAX
+ LIST opções [FORBIDDEN] [SUSPENDED] [NOEXPIRE] [UNCONFIRMED]
+NICK_LIST_HEADER
+ Lista de entradas com %s:
+NICK_LIST_RESULTS
+ Fim da listagem - %d/%d resultados mostrados.
+
+# ALIST responses
+NICK_ALIST_SYNTAX
+ ALIST nick
+NICK_ALIST_HEADER
+ Canais nos quais você tem acesso:
+ Núm Canal Nível Descrição
+NICK_ALIST_HEADER_X
+ Canais nos quais %s tem acesso:
+ Núm Canal Nível Descrição
+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.
+NICK_GLIST_REPLY
+ %c%s
+NICK_GLIST_REPLY_ADMIN
+ %c%s (expira em %s)
+
+# 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.
+ %R%s RELEASE %s para liberar seu nick antes de %s.
+
+# 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.
+
+# GETEMAIL responses
+NICK_GETEMAIL_SYNTAX
+ GETEMAIL user@emailhost Não use coringas!
+NICK_GETEMAIL_EMAILS_ARE
+ O nick %s usa o E-mail %s.
+NICK_GETEMAIL_NOT_USED
+ Nenhum email listado para %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 souba porque este e-mail lhe foi enviado, por favor ignore-o.
+NICK_SENDPASS_LINE_4
+ NÃO RESPONDA A ESTE E-MAIL!
+NICK_SENDPASS_LINE_5
+ Administradores %s.
+NICK_SENDPASS_OK
+ Senha para %s foi enviada.
+
+# SUSPEND responses
+NICK_SUSPEND_SYNTAX
+ SUSPEND nick motivo
+NICK_SUSPEND_SUCCEEDED
+ Nick %s foi suspendido.
+NICK_SUSPEND_FAILED
+ Impossível suspender o nick %s!
+
+# UNSUSPEND responses
+NICK_UNSUSPEND_SYNTAX
+ UNSUSPEND nick
+NICK_UNSUSPEND_SUCCEEDED
+ Nick %s foi liberado.
+NICK_UNSUSPEND_FAILED
+ Impossível liberar o nick %s!
+
+# 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!
+
+# Nick Registration responses
+NICK_REQUESTED
+ Esse nick já foi solicitado, por favor verifique seu e-mail pelo passcode
+NICK_REG_RESENT
+ Seu passcode foi re-enviado para %s.
+NICK_REG_UNABLE
+ Nick NÃO registrado, por favor tente novamente mais tarde.
+NICK_IS_PREREG
+ Esse nick está aguardando um código de verificação por e-mail antes de completar o registro.
+NICK_ENTER_REG_CODE
+ O passcode foi enviado para %s, por favor digite %R%s confirm <passcode> para completar o registro.
+NICK_CONFIRM_NOT_FOUND
+ O primeiro passo do registro deve ter expirado, por favor use %R%s register <senha> <email> primeiro.
+NICK_CONFIRM_INVALID
+ Um passcode inválido foi digitado, por favor verifique o e-mail e tente novamente
+NICK_REG_MAIL_SUBJECT
+ Registro de nick (%s)
+NICK_REG_MAIL_HEAD
+ Olá,
+NICK_REG_MAIL_LINE_1
+ Você solicitou o registro do seguinte nick: %s.
+NICK_REG_MAIL_LINE_2
+ Por favor digite %R%s confirm %s para completar o registro.
+NICK_REG_MAIL_LINE_3
+ Se você não sabe porque este e-mail lhe foi enviado, por favor ignore-o com sigilo.
+NICK_REG_MAIL_LINE_4
+ POR FAVOR NÃO RESPONDA A ESTE E-MAIL!
+NICK_REG_MAIL_LINE_5
+ Administradores %s.
+NICK_GETPASS_PASSCODE_IS
+ Passcode para %s é %s.
+NICK_FORCE_REG
+ Nick %s confirmado
+
+###########################################################################
+#
+# 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
+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 as opções 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 a/de um canal
+CHAN_LEVEL_BADWORDS
+ Permitido o uso do comando BADWORDS
+CHAN_LEVEL_NOKICK
+ Nunca ser kickado pelos motivos dos Kickers do bot
+CHAN_LEVEL_FANTASIA
+ Permitido o uso do comando FANTASY de bots
+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
+CHAN_LEVEL_BANME
+ Permitido o uso do comando BAN em si mesmo
+CHAN_LEVEL_BAN
+ Permitido o uso do comando BAN
+CHAN_LEVEL_TOPIC
+ Permitido o uso do comando TOPIC
+CHAN_LEVEL_INFO
+ Permitido o uso do comando INFO com a opção ALL
+
+# 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_X_INVALID
+ Channel %s is not a valid channel.
+
+# 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 %R%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:
+ %R%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.
+CHAN_REGISTER_NONE_CHANNEL
+ Você tentou registrar um canal não existente: %s
+CHAN_SYMBOL_REQUIRED
+ Por favor use o símbolo # quando tentar registrar
+
+# 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 (except the channel founder).
+CHAN_LOGOUT_FOUNDER_FAILED
+ You may not log out of %s (you are founder).
+
+# 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
+ Modo %c ignorado porque você não pode travá-lo.
+CHAN_SET_MLOCK_L_REQUIRED
+ Você deve travar o modo +l para poder travar o modo +L.
+CHAN_SET_MLOCK_K_REQUIRED
+ Você deve travar o modo +i para poder travar o modo +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 para %s está agora ATIVADA.
+CHAN_SET_KEEPTOPIC_OFF
+ Retenção de tópico para %s está agora DESATIVADA.
+
+# SET TOPICLOCK responses
+CHAN_SET_TOPICLOCK_SYNTAX
+ SET canal TOPICLOCK {ON | OFF}
+CHAN_SET_TOPICLOCK_ON
+ Trava de tópico para %s está agora ATIVADA.
+CHAN_SET_TOPICLOCK_OFF
+ Trava de tópico para %s está agora DESATIVADA.
+
+# SET PEACE responses
+CHAN_SET_PEACE_SYNTAX
+ SET canal PEACE {ON | OFF}
+CHAN_SET_PEACE_ON
+ Opção Peace para %s está agora ATIVADA.
+CHAN_SET_PEACE_OFF
+ Opção Peace para %s está agora DESATIVADA.
+
+# SET PRIVATE responses
+CHAN_SET_PRIVATE_SYNTAX
+ SET canal PRIVATE {ON | OFF}
+CHAN_SET_PRIVATE_ON
+ Opção Private para %s está agora ATIVADA.
+CHAN_SET_PRIVATE_OFF
+ Opção Private para %s está agora DESATIVADA.
+
+# SET SECUREOPS responses
+CHAN_SET_SECUREOPS_SYNTAX
+ SET canal SECUREOPS {ON | OFF}
+CHAN_SET_SECUREOPS_ON
+ Opção Secure OPs para %s está agora ATIVADA.
+CHAN_SET_SECUREOPS_OFF
+ Opção Secure OPs para %s está agora DESATIVADA.
+
+# SET SECUREFOUNDER responses
+CHAN_SET_SECUREFOUNDER_SYNTAX
+ SET canal SECUREFOUNDER {ON | OFF}
+CHAN_SET_SECUREFOUNDER_ON
+ Opção Secure Founder para %s está agora ATIVADA.
+CHAN_SET_SECUREFOUNDER_OFF
+ Opção Secure Founder para %s está agora DESATIVADA.
+
+# SET RESTRICTED responses
+CHAN_SET_RESTRICTED_SYNTAX
+ SET canal RESTRICTED {ON | OFF}
+CHAN_SET_RESTRICTED_ON
+ Opção de acesso restrito para %s está agora ATIVADA.
+CHAN_SET_RESTRICTED_OFF
+ Opção de acesso restrito para %s está agora DESATIVADA.
+
+# SET SECURE responses
+CHAN_SET_SECURE_SYNTAX
+ SET canal SECURE {ON | OFF}
+CHAN_SET_SECURE_ON
+ Opção Secure para %s está agora ATIVADA.
+CHAN_SET_SECURE_OFF
+ Opção Secure para %s está agora DESATIVADA.
+
+# SET SIGNKICK responses
+CHAN_SET_SIGNKICK_SYNTAX
+ SET canal SIGNKICK {ON | LEVEL | OFF}
+CHAN_SET_SIGNKICK_ON
+ Opção Signed Kicks para %s está agora ATIVADA.
+CHAN_SET_SIGNKICK_LEVEL
+ Opção Signed Kicks para %s está agora ATIVADA, mas depende
+ do nível de acesso do usuário que está usando o comando.
+CHAN_SET_SIGNKICK_OFF
+ Opção Signed Kicks para %s está agora DESATIVADA.
+
+# SET OPNOTICE responses
+CHAN_SET_OPNOTICE_SYNTAX
+ SET canal OPNOTICE {ON | OFF}
+CHAN_SET_OPNOTICE_ON
+ Opção Op-notice para %s está agora ATIVADA.
+CHAN_SET_OPNOTICE_OFF
+ Opção Op-notice para %s está agora DESATIVADA.
+
+# SET XOP responses
+CHAN_SET_XOP_SYNTAX
+ SET canal XOP {ON | OFF}
+CHAN_SET_XOP_ON
+ Sistema de acesso xOP para %s está agora ATIVADO.
+CHAN_SET_XOP_OFF
+ Sistema de acesso xOP para %s está agora DESATIVADO.
+
+# 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
+ Desculpe, você pode ter apenas %d entradas de AOP/SOP/VOP em um canal.
+CHAN_XOP_LIST_FORMAT
+ %3d %s
+CHAN_XOP_ACCESS
+ Você não pode usar este comando. Ao invés, use o comando ACCESS.
+ Digite %R%s HELP ACCESS para mais informação.
+CHAN_XOP_NOT_AVAILABLE
+ xOP system is not available.
+
+# AOP messages
+CHAN_AOP_SYNTAX
+ AOP canal {ADD|DEL|LIST|CLEAR} [nick | entrada]
+CHAN_AOP_DISABLED
+ Desculpe, a modificação da lista de AOP está temporariamente desabilitada.
+CHAN_AOP_NICKS_ONLY
+ Lista de AOP do canal só pode conter nicks registrados.
+CHAN_AOP_ADDED
+ %s adicionado à lista de AOP do %s.
+CHAN_AOP_MOVED
+ %s movido para a lista de AOP do %s.
+CHAN_AOP_NO_SUCH_ENTRY
+ Entrada (#%d) não encontrada na lista de AOP do %s.
+CHAN_AOP_NOT_FOUND
+ Nick %s não encontrado na lista de AOP do %s.
+CHAN_AOP_NO_MATCH
+ Resultado não encontrado na lista de AOP do %s.
+CHAN_AOP_DELETED
+ %s deletado da lista de AOP do %s.
+CHAN_AOP_DELETED_ONE
+ Deletada 1 entrada da lista de AOP do %s.
+CHAN_AOP_DELETED_SEVERAL
+ Deletadas %d entradas da lista de AOP do %s.
+CHAN_AOP_LIST_EMPTY
+ Lista de AOP do canal %s está vazia.
+CHAN_AOP_LIST_HEADER
+ Lista de AOP para %s:
+ Núm Nick
+CHAN_AOP_CLEAR
+ Lista de AOP do canal %s foi limpa.
+
+# HOP messages
+CHAN_HOP_SYNTAX
+ HOP canal {ADD|DEL|LIST|CLEAR} [nick | entrada]
+CHAN_HOP_DISABLED
+ Desculpe, a modificação da lista de HOP está temporariamente desabilitada.
+CHAN_HOP_NICKS_ONLY
+ Lista de HOP do canal só pode conter nicks registrados.
+CHAN_HOP_ADDED
+ %s adicionado à lista de HOP do %s.
+CHAN_HOP_MOVED
+ %s movido para a lista de HOP do %s.
+CHAN_HOP_NO_SUCH_ENTRY
+ Entrada (#%d) não encontrada na lista de HOP do %s.
+CHAN_HOP_NOT_FOUND
+ Nick %s não encontrado na lista de HOP do %s.
+CHAN_HOP_NO_MATCH
+ Resultado não encontrado na lista de HOP do %s.
+CHAN_HOP_DELETED
+ %s deletado da lista de HOP do %s.
+CHAN_HOP_DELETED_ONE
+ Deletada 1 entrada da lista de HOP do %s.
+CHAN_HOP_DELETED_SEVERAL
+ Deletadas %d entradas da lista de HOP do %s.
+CHAN_HOP_LIST_EMPTY
+ Lista de HOP do canal %s está vazia.
+CHAN_HOP_LIST_HEADER
+ Lista de HOP para %s:
+ Núm Nick
+CHAN_HOP_CLEAR
+ Lista de HOP do canal %s foi limpa.
+
+# SOP messages
+CHAN_SOP_SYNTAX
+ SOP canal {ADD|DEL|LIST|CLEAR} [nick | entrada]
+CHAN_SOP_DISABLED
+ Desculpe, a modificação da lista de SOP está temporariamente desabilitada.
+CHAN_SOP_NICKS_ONLY
+ Lista de SOP do canal só pode conter nicks registrados.
+CHAN_SOP_ADDED
+ %s adicionado à lista de SOP do %s.
+CHAN_SOP_MOVED
+ %s movido para a lista de SOP do %s.
+CHAN_SOP_NO_SUCH_ENTRY
+ Entrada (#%d) não encontrada na lista de SOP do %s.
+CHAN_SOP_NOT_FOUND
+ Nick %s não encontrado na lista de SOP do %s.
+CHAN_SOP_NO_MATCH
+ Resultado não encontrado na lista de SOP do %s.
+CHAN_SOP_DELETED
+ %s deletado da lista de SOP do %s.
+CHAN_SOP_DELETED_ONE
+ Deletada 1 entrada da lista de SOP do %s.
+CHAN_SOP_DELETED_SEVERAL
+ Deletadas %d entradas da lista de SOP do %s.
+CHAN_SOP_LIST_EMPTY
+ Lista de SOP do canal %s está vazia.
+CHAN_SOP_LIST_HEADER
+ Lista de SOP para %s:
+ Núm Nick
+CHAN_SOP_CLEAR
+ Lista de SOP do canal %s foi limpa.
+
+# VOP messages
+CHAN_VOP_SYNTAX
+ VOP canal {ADD|DEL|LIST|CLEAR} [nick | entrada]
+CHAN_VOP_DISABLED
+ Desculpe, a modificação da lista de VOP está temporariamente desabilitada.
+CHAN_VOP_NICKS_ONLY
+ Lista de VOP do canal só pode conter nicks registrados.
+CHAN_VOP_ADDED
+ %s adicionado à lista de VOP do %s.
+CHAN_VOP_MOVED
+ %s movido para a lista de VOP do %s.
+CHAN_VOP_NO_SUCH_ENTRY
+ Entrada (#%d) não encontrada na lista de VOP do %s.
+CHAN_VOP_NOT_FOUND
+ Nick %s não encontrado na lista de VOP do %s.
+CHAN_VOP_NO_MATCH
+ Resultado não encontrado na lista de VOP do %s.
+CHAN_VOP_DELETED
+ %s deletado da lista de VOP do %s.
+CHAN_VOP_DELETED_ONE
+ Deletada 1 entrada da lista de VOP do %s.
+CHAN_VOP_DELETED_SEVERAL
+ Deletadas %d entradas da lista de VOP do %s.
+CHAN_VOP_LIST_EMPTY
+ Lista de VOP do canal %s está vazia.
+CHAN_VOP_LIST_HEADER
+ Lista de VOP para %s:
+ Núm Nick
+CHAN_VOP_CLEAR
+ Lista de VOP do canal %s foi limpa.
+
+# ACCESS messages
+CHAN_ACCESS_SYNTAX
+ ACCESS canal {ADD|DEL|LIST|CLEAR} [nick [nível] | lista-entradas]
+CHAN_ACCESS_XOP
+ Você não pode usar este comando.
+ Ao invés, use os comandos VOP, HOP, AOP e SOP.
+ Digite %R%s HELP comando para mais informação.
+CHAN_ACCESS_XOP_HOP
+ You can't use this command.
+ Use the AOP, SOP, HOP and VOP commands instead.
+ Type %R%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 à 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 canal %s está 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 %s apagada.
+
+# AKICK responses
+CHAN_AKICK_SYNTAX
+ AKICK canal {ADD|STICK|UNSTICK|DEL|LIST|VIEW|ENFORCE|CLEAR} [nick-ou-máscara] [motivo]
+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 à 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 está agora sempre ativo no canal %s.
+CHAN_AKICK_UNSTUCK
+ %s não está mais sempre ativo no canal %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) (por %s em %s)
+ %s
+CHAN_AKICK_ENFORCE_DONE
+ AKICK ENFORCE para %s terminado; %d usuários afetados.
+CHAN_AKICK_CLEAR
+ Lista de akick do canal %s foi limpa.
+
+# LEVELS responses
+CHAN_LEVELS_SYNTAX
+ LEVELS canal {SET | DIS[ABLE] | LIST | RESET} [item [nível]]
+CHAN_LEVELS_XOP
+ Este comando não tem utilidade neste modo.
+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 %R%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.
+
+# Status Messages
+CHAN_STATUS_SYNTAX
+ STATUS ERROR Erro de sintaxe. Use a sintaxe STATUS canal nick.
+CHAN_STATUS_NOT_REGGED
+ STATUS ERROR Canal %s não está registrado
+CHAN_STATUS_FORBIDDEN
+ STATUS ERROR Canal %s forbidado
+CHAN_STATUS_NOTONLINE
+ STATUS ERROR Nick %s não está online
+CHAN_STATUS_INFO
+ STATUS %s %s %d
+
+# 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
+ Paz
+CHAN_INFO_OPT_PRIVATE
+ Privado
+CHAN_INFO_OPT_RESTRICTED
+ Acesso restrito
+CHAN_INFO_OPT_SECURE
+ Seguro
+CHAN_INFO_OPT_SECUREOPS
+ OPs Seguros
+CHAN_INFO_OPT_SECUREFOUNDER
+ Founder Seguro
+CHAN_INFO_OPT_SIGNKICK
+ Kicks assinados
+CHAN_INFO_OPT_TOPICLOCK
+ Trava de tópico
+CHAN_INFO_OPT_XOP
+ Sistema de acesso xOP
+CHAN_INFO_OPT_NONE
+ Nenhuma
+CHAN_INFO_MODE_LOCK
+ Trava de modo: %s
+CHAN_INFO_EXPIRE
+ Expira em: %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] [SUSPENDED] [NOEXPIRE]
+CHAN_LIST_HEADER
+ Lista de entradas com %s:
+CHAN_LIST_FORMAT
+ %-20s %s
+CHAN_LIST_END
+ Fim da lista - %d/%d resultados mostrados.
+
+# INVITE responses
+CHAN_INVITE_SYNTAX
+ INVITE canal
+
+# UNBAN responses
+CHAN_UNBAN_SYNTAX
+ UNBAN canal
+CHAN_UNBANNED
+ Você não está mais banido do %s.
+
+# TOPIC responses
+CHAN_TOPIC_SYNTAX
+ TOPIC canal [tópico]
+
+# 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_HOPS
+ Modo +h foi retirado do canal %s.
+CHAN_CLEARED_VOICES
+ Modo +v foi retirado do canal %s.
+CHAN_CLEARED_USERS
+ Todos os usuários foram kickados do canal %s.
+CHAN_CLEARED_INVITES
+ Todos os Invites do canal %s foram removidos.
+
+# 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.
+
+# GETKEY responses
+CHAN_GETKEY_SYNTAX
+ GETKEY canal
+CHAN_GETKEY_NOKEY
+ O canal %s não tem key.
+CHAN_GETKEY_KEY
+ KEY %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
+ Este canal foi forbidado.
+
+# SUSPEND responses
+CHAN_SUSPEND_SYNTAX
+ SUSPEND canal [motivo]
+CHAN_SUSPEND_SYNTAX_REASON
+ SUSPEND canal motivo
+CHAN_SUSPEND_SUCCEEDED
+ Canal %s está agora suspenso.
+CHAN_SUSPEND_FAILED
+ Impossível suspender o canal %s!
+CHAN_SUSPEND_REASON
+ Este canal foi suspenso.
+
+# UNSUSPEND responses
+CHAN_UNSUSPEND_SYNTAX
+ UNSUSPEND canal
+CHAN_UNSUSPEND_ERROR
+ Não foi encontrado "#" em frente ao nome do canal.
+CHAN_UNSUSPEND_SUCCEEDED
+ Canal %s está agora liberado.
+CHAN_UNSUSPEND_FAILED
+ Impossível liberar canal %s!
+
+# Misc responses
+CHAN_EXCEPTED
+ %s combina com uma Except no %s e não pode ser banido até que a Except sejá removida.
+
+###########################################################################
+#
+# 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 %R%s READ LAST para ler.
+MEMO_TYPE_READ_NUM
+ Digite %R%s READ %d para ler.
+MEMO_TYPE_LIST_NEW
+ Digite %R%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
+ Existem %d memos para o canal %s.
+MEMO_X_ONE_NOTICE
+ Existe %d memo para o canal %s.
+MEMO_NEW_X_MEMO_ARRIVED
+ Foi recebido um novo memo para o canal %s.
+ Digite %R%s READ %s %d para ler.
+MEMO_NEW_MEMO_ARRIVED
+ Você recebeu um novo memo de %s.
+ Digite %R%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.
+MEMO_MASS_SENT
+ Uma mensagem global foi enviada a todos os usuários registrados.
+
+# 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: %R%s READ núm
+MEMO_LIST_NEW_MEMOS
+ Novos memos para %s. Para ler, digite: %R%s READ núm
+MEMO_LIST_CHAN_MEMOS
+ Memos para %s. Para ler, digite: %R%s READ %s núm
+MEMO_LIST_CHAN_NEW_MEMOS
+ Novos memos para %s. Para ler, digite: %R%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: %R%s DEL %d
+MEMO_CHAN_HEADER
+ Memo %d de %s (%s). Para apagar, digite: %R%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.
+MEMO_CHAN_DELETED_ALL
+ Todos os memos para o canal %s foram apagados.
+
+# 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, quando eles lhe forem enviados ou quando desativar o /AWAY.
+MEMO_SET_NOTIFY_LOGON
+ %s irá agora notificá-lo de novos memos quando você conectar ou quando 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.
+MEMO_SET_NOTIFY_MAIL
+ Você será notificado sobre novos memos por email.
+MEMO_SET_NOTIFY_NOMAIL
+ Você não será mais notificado por email.
+MEMO_SET_NOTIFY_INVALIDMAIL
+ Não há endereço de email ajustado para o seu nick.
+
+# 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 [canal]
+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.
+
+# Memo2Mail responses
+MEMO_MAIL_SUBJECT
+ Novo memo
+MEMO_MAIL_TEXT1
+ Olá %s
+MEMO_MAIL_TEXT2
+ Você recebeu um novo memo de %s. Este é seu memo número %d.
+MEMO_MAIL_TEXT3
+ Mensagem do memo:
+
+# RSEND responses
+MEMO_RSEND_PLEASE_WAIT
+ Por favor aguarde %d segundos antes de usar o comando RSEND novamente.
+MEMO_RSEND_DISABLED
+ Desculpe, RSEND foi desabilitado nesta rede.
+MEMO_RSEND_SYNTAX
+ RSEND {nick | canal} mensagem
+MEMO_RSEND_NICK_MEMO_TEXT
+ [Auto-Memo] O memo que você enviou foi lido.
+MEMO_RSEND_CHAN_MEMO_TEXT
+ [Auto-Memo] O memo que você enviou para %s foi lido.
+MEMO_RSEND_USER_NOTIFICATION
+ Um memo de notificação foi enviado para %s informando que você leu seu memo.
+
+# CHECK responses
+MEMO_CHECK_SYNTAX
+ CHECK nick
+MEMO_CHECK_NOT_READ
+ O último memo que você enviou para %s (enviado em %s) ainda não foi lido.
+MEMO_CHECK_READ
+ O último memo que você enviou para %s (enviado em %s) foi lido.
+MEMO_CHECK_NO_MEMO
+ O nick %s não possui nenhum memo seu.
+MEMO_NO_RSEND_SELF
+ Você não pode pedir uma notificação ao enviar uma mensagem a si próprio.
+
+###########################################################################
+#
+# 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 %R%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 use 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_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 à lista de bots.
+BOT_BOT_ANY_CHANGES
+ A 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 reservados aos Operadores de IRC:
+BOT_BOTLIST_FOOTER
+ %d bots disponíveis.
+BOT_BOTLIST_EMPTY
+ Não existem bots disponíveis no momento.
+ Peça 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 já está associado ao canal %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
+ RealName: %s
+BOT_INFO_BOT_CREATED
+ Criado: %s
+BOT_INFO_BOT_USAGE
+ Usado em: %d canal(is)
+BOT_INFO_BOT_OPTIONS
+ Opções: %s
+BOT_INFO_OPT_PRIVATE
+ Privado
+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 %R%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 canal PRIVATE {ON|OFF}
+BOT_SET_PRIVATE_ON
+ Modo Privado do bot %s está agora ATIVADO.
+BOT_SET_PRIVATE_OFF
+ Modo Privado do bot %s está agora DESATIVADO.
+
+# 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 %R%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
+
+BOT_EXCEPT
+ Usuário combina com Except do canal.
+
+BOT_BAD_NICK
+ O Nick do bot deve conter apenas caracteres válidos a Nicks.
+BOT_BAD_HOST
+ O Host do bot deve conter apenas caracteres válidos a Hosts.
+BOT_BAD_IDENT
+ A Identd do bot deve conter apenas caracteres válidos.
+BOT_LONG_IDENT
+ Bot Idents may only contain %d characters.
+BOT_LONG_HOST
+ Bot Hosts may only contain %d characters.
+
+###########################################################################
+#
+# OperServ messages
+#
+###########################################################################
+
+# General messages
+OPER_BOUNCY_MODES
+ Os Services não conseguiram alterar os modos. Seus servidores estão configurados corretamente?
+OPER_BOUNCY_MODES_U_LINE
+ Os Services não conseguiram alterar os modos. As U:lines dos seus servidores 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 minuto
+OPER_STATS_UPTIME_H1M1S
+ Services ativos %d horas, %d minuto
+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
+ Canais : %6d registros, %5d kB
+OPER_STATS_GROUPS_MEM
+ Grupos NS : %6d registros, %5d kB
+OPER_STATS_ALIASES_MEM
+ Nicks NS : %6d registros, %5d kB
+OPER_STATS_CHANSERV_MEM
+ ChanServ : %6d registros, %5d kB
+OPER_STATS_BOTSERV_MEM
+ BotServ : %6d registros, %5d kB
+OPER_STATS_HOSTSERV_MEM
+ HostServ : %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_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
+ Número atual de SQLINEs: %d
+OPER_STATS_SQLINE_EXPIRE_DAYS
+ Tempo atual de expiração de SQLINE: %d dias
+OPER_STATS_SQLINE_EXPIRE_DAY
+ Tempo atual de expiração de SQLINE: 1 dia
+OPER_STATS_SQLINE_EXPIRE_HOURS
+ Tempo atual de expiração de SQLINE: %d horas
+OPER_STATS_SQLINE_EXPIRE_HOUR
+ Tempo atual de expiração de SQLINE: 1 hora
+OPER_STATS_SQLINE_EXPIRE_MINS
+ Tempo atual de expiração de SQLINE: %d minutos
+OPER_STATS_SQLINE_EXPIRE_MIN
+ Tempo atual de expiração de SQLINE: 1 minuto
+OPER_STATS_SQLINE_EXPIRE_NONE
+ Tempo atual de expiração de SQLINE: Não expira
+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_STATS_UPLINK_SERVER
+ Uplink server: %s
+OPER_STATS_UPLINK_CAPAB
+ Uplink capab: %s
+OPER_STATS_UPLINK_SERVER_COUNT
+ Servers found: %d
+
+# MODE responses
+OPER_MODE_SYNTAX
+ MODE canal modos
+
+# UMODE respondes
+OPER_UMODE_SYNTAX
+ UMODE nick modos
+OPER_UMODE_SUCCESS
+ Modos do usuário %s alterados.
+OPER_UMODE_CHANGED
+ %s alterou seus modos de usuário.
+
+# OLINE responses
+OPER_OLINE_SYNTAX
+ OLINE nick flags
+OPER_OLINE_SUCCESS
+ As Operflags %s foram adicionadas para %s.
+OPER_OLINE_IRCOP
+ Você agora é um Operador de IRC.
+
+# 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 novonick
+OPER_SVSNICK_NEWNICK
+ O nick %s está sendo alterado para %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 à 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_ADMIN_MOVED
+ %s foi movido para a lista de Administradores dos Services.
+
+# 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 à 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.
+OPER_OPER_MOVED
+ %s foi movido para a lista de Operadores dos Services.
+
+# 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 à 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
+ Lista de AKILL atual:
+ 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.
+OPER_CHANKILL_SYNTAX
+ CHANKILL [+tempo] {#canal} [motivo]
+
+# SGLINE responses
+OPER_SGLINE_SYNTAX
+ SGLINE {ADD | DEL | LIST | VIEW | CLEAR} [[+tempo] {máscara | lista}[:motivo]]
+OPER_SGLINE_UNSUPPORTED
+ Desculpe, SGLINE não está disponível nesta Rede.
+OPER_SGLINE_EXISTS
+ %s já existe 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 à 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
+ Lista de SGLINE atual:
+ Núm Máscara Motivo
+OPER_SGLINE_LIST_FORMAT
+ %3d %-32s %s
+OPER_SGLINE_VIEW_HEADER
+ Lista de SGLINE atual:
+# 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} [[+tempo] {máscara | lista} [motivo]]
+OPER_SQLINE_CHANNELS_UNSUPPORTED
+ SQLINEs de canal não são suportadas por este IRCd, então você não pode usá-las.
+OPER_SQLINE_EXISTS
+ %s já existe na lista de SQLINE.
+OPER_SQLINE_ALREADY_COVERED
+ %s já está coberto por %s.
+OPER_SQLINE_REACHED_LIMIT
+ Desculpe, você pode ter apenas %d SQLINEs.
+OPER_SQLINE_ADDED
+ %s adicionado à lista de SQLINE.
+OPER_SQLINE_CHANGED
+ Tempo de expiração para %s alterado.
+OPER_SQLINE_NOT_FOUND
+ %s não encontrado na lista de SQLINE.
+OPER_SQLINE_NO_MATCH
+ Nenhum resultado equivalente na lista de SQLINE.
+OPER_SQLINE_DELETED
+ %s removido da lista de SQLINE.
+OPER_SQLINE_DELETED_ONE
+ Removida 1 entrada da lista de SQLINE.
+OPER_SQLINE_DELETED_SEVERAL
+ Removidas %d entradas da lista de SQLINE.
+OPER_SQLINE_LIST_EMPTY
+ A lista de SQLINE está vazia.
+OPER_SQLINE_LIST_HEADER
+ Lista de SQLINE atual:
+ Núm Máscara Motivo
+OPER_SQLINE_LIST_FORMAT
+ %3d %-32s %s
+OPER_SQLINE_VIEW_HEADER
+ Lista de SQLINE atual:
+# number, mask, set-by, set-time, expires, reason
+OPER_SQLINE_VIEW_FORMAT
+ %3d %s (por %s em %s; %s)
+ %s
+OPER_SQLINE_CLEAR
+ A lista de SQLINE foi apagada.
+
+# SZLINE responses
+OPER_SZLINE_SYNTAX
+ SZLINE {ADD | DEL | LIST | VIEW | CLEAR} [[+tempo] {máscara | lista} [motivo]]
+OPER_SZLINE_UNSUPPORTED
+ Desculpe, SZLINE não está 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 à 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
+ Lista atual de SZLINE:
+# 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.
+OPER_SET_SQL_ON
+ Código SQL será usado.
+OPER_SET_SQL_OFF
+ Código SQL não será usado.
+OPER_SET_SQL_ERROR
+ Ajuste para SQL deve ser ON ou OFF.
+OPER_SET_SQL_ERROR_INIT
+ Erro durante inicialização de SQL, verifique seus logs para corrigir.
+OPER_SET_SQL_ERROR_DISABLED
+ SQL não está configurada para esta rede. Por favor, edite o
+ arquivo de configuração (services.conf).
+OPER_SET_LIST_OPTION_ON
+ %s está ativada
+OPER_SET_LIST_OPTION_OFF
+ %s está desativada
+
+# 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 servidor [motivo]
+OPER_JUPE_HOST_ERROR
+ Por favor, use um nome de servidor válido quando estiver "jupando".
+
+# 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 recompile os services para habilitar o comando RESTART.
+
+# LISTIGNORE responses
+OPER_IGNORE_SYNTAX
+ Sintaxe: IGNORE {ADD|DEL|LIST|CLEAR} [tempo] [nick | mask]
+OPER_IGNORE_VALID_TIME
+ Você precisa digitar um número válido como tempo.
+OPER_IGNORE_TIME_DONE
+ %s agora será ignorado por %s.
+OPER_IGNORE_PERM_DONE
+ %s agora será permanentemente ignorado.
+OPER_IGNORE_DEL_DONE
+ %s não será mais ignorado.
+OPER_IGNORE_LIST
+ Lista de Ignore dos Services:
+OPER_IGNORE_LIST_NOMATCH
+ %s não encontrado na lista de Ignore.
+OPER_IGNORE_LIST_EMPTY
+ Lista de Ignore dos Services vazia.
+
+# KILLCLONES responses
+OPER_IGNORE_LIST_CLEARED
+ Lista de Ignore foi apagada.
+
+# 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 Usuários Tópico
+OPER_CHANLIST_HEADER_USER
+ Lista de canais do %s:
+ Nome Usuários 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 usuários do %s:
+ Nick Máscara
+OPER_USERLIST_RECORD
+ %-20s %s@%s
+OPER_USERLIST_END
+ Fim da listagem.
+
+OPER_SUPER_ADMIN_ON
+ Você é agora um Super-Admin
+OPER_SUPER_ADMIN_OFF
+ Você não é mais um Super-Admin
+OPER_SUPER_ADMIN_SYNTAX
+ Configuração de SuperAdmin deve ser ON ou OFF (deve estar habilitada no services.conf).
+OPER_SUPER_ADMIN_WALL_ON
+ %s é agora um Super-Admin
+OPER_SUPER_ADMIN_WALL_OFF
+ %s não é mais um Super-Admin
+OPER_SUPER_ADMIN_ONLY
+ Apenas Super-Admins podem usar este comando.
+OPER_STAFF_LIST_HEADER
+ On Nível Nick
+OPER_STAFF_FORMAT
+ %c %s %s
+OPER_STAFF_AFORMAT
+ %c %s %s [%s]
+
+# DefCon Messages
+
+OPER_DEFCON_SYNTAX
+ Sintaxe: DEFCON [1|2|3|4|5]
+OPER_DEFCON_DENIED
+ Este serviço está temporariamente desabilitado, por favor tente novamente mais tarde
+OPER_DEFCON_NO_CONF
+ O sistema Defcon deve estar habilitado no arquivo services.conf
+OPER_DEFCON_CHANGED
+ Services estão agora em DEFCON %d
+OPER_DEFCON_WALL
+ %s alterou o Nível do DEFCON para %d
+DEFCON_GLOBAL
+ O Nível do Defcon está agora no Nível: %d
+
+# Modules strings
+
+OPER_MODULE_LOADED
+ Módulo %s carregado
+OPER_MODULE_UNLOADED
+ Módulo %s descarregado
+OPER_MODULE_LOAD_FAIL
+ Impossível carregar o módulo %s
+OPER_MODULE_REMOVE_FAIL
+ Impossível remover o módulo %s
+OPER_MODULE_NO_UNLOAD
+ This module can not be unloaded.
+OPER_MODULE_LOAD_SYNTAX
+ MODLOAD NomeDoArquivo
+OPER_MODULE_UNLOAD_SYNTAX
+ MODUNLOAD NomeDoArquivo
+OPER_MODULE_LIST_HEADER
+ Lista de Módulos atual:
+OPER_MODULE_LIST
+ Módulo: %s [%s] [%s]
+OPER_MODULE_LIST_FOOTER
+ %d módulos carregados.
+OPER_MODULE_INFO_LIST
+ Módulo: %s Versão: %s Autor: %s Carregado: %s
+OPER_MODULE_CMD_LIST
+ Comando fornecido: /%R%s %s
+OPER_MODULE_MSG_LIST
+ Fornecendo IRCd handler para: %s
+OPER_MODULE_NO_LIST
+ Nenhum módulo carregado atualmente.
+OPER_MODULE_NO_INFO
+ Nenhuma informação sobre o módulo %s está disponível.
+OPER_MODULE_INFO_SYNTAX
+ MODINFO NomeDoArquivo
+
+MODULE_HELP_HEADER
+ Os seguintes comandos foram carregados por um módulo:
+
+###########################################################################
+#
+# 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 Limite 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.
+OPER_EXCEPTION_EXISTS
+ %s já existe na lista de EXCEPTION.
+OPER_EXCEPTION_CHANGED
+ Exceção para %s foi atualizada para %d.
+
+# 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 núm 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 prevenir
+ 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.
+
+OPER_HELP_STAFF
+ Sintaxe: STAFF
+
+ Exibe todos os nicks da Staff dos Services juntamente com seus
+ níveis e status on-line.
+
+OPER_HELP_DEFCON
+ Sintaxe: DEFCON [1|2|3|4|5]
+
+ O sistema Defcon pode ser usado para implementar um conjunto
+ pré-definido de restrições aos Services, útil durante uma
+ tentativa de ataque à Rede.
+
+OPER_HELP_DEFCON_NO_NEW_CHANNELS
+ * Impedido o registro de novos canais
+OPER_HELP_DEFCON_NO_NEW_NICKS
+ * Impedido o registro de novos nicks
+OPER_HELP_DEFCON_NO_MLOCK_CHANGE
+ * Impedida a mudança de MLOCK
+OPER_HELP_DEFCON_FORCE_CHAN_MODES
+ * Força os Modos de Canal (%s) a serem setados em todos os canais
+OPER_HELP_DEFCON_REDUCE_SESSION
+ * Usa o limite de sessões reduzido de %d
+OPER_HELP_DEFCON_NO_NEW_CLIENTS
+ * Killa quaisquer NOVOS clientes conectando
+OPER_HELP_DEFCON_OPER_ONLY
+ * Ignora quaisquer não-opers com mensagem
+OPER_HELP_DEFCON_SILENT_OPER_ONLY
+ * Silenciosamente ignora não-opers
+OPER_HELP_DEFCON_AKILL_NEW_CLIENTS
+ * AKILLA quaisquer novos clientes conectando
+OPER_HELP_DEFCON_NO_NEW_MEMOS
+ * Impede o envio de novos memos
+OPER_HELP_CHANKILL
+ Sintaxe: CHANKILL [+tempo] canal motivo
+
+ Adiciona um AKILL para cada nick no canal especificado. Isso
+ usa por completo todo o host real ident@host para cada nick;
+ em seguida, força o 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
+ LOGONNEWS {ADD|DEL|LIST} [texto|núm]
+NEWS_LOGON_LIST_HEADER
+ Logon News itens:
+NEWS_LOGON_LIST_ENTRY
+ %5d (%s por %s)
+ %s
+NEWS_LOGON_LIST_NONE
+ Não existem logon news.
+NEWS_LOGON_ADD_SYNTAX
+ 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
+ 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
+ OPERNEWS {ADD|DEL|LIST} [texto|núm]
+NEWS_OPER_LIST_HEADER
+ Oper News itens:
+NEWS_OPER_LIST_ENTRY
+ %5d (%s por %s)
+ %s
+NEWS_OPER_LIST_NONE
+ Não existe nenhum oper news.
+NEWS_OPER_ADD_SYNTAX
+ OPERNEWS ADD texto
+NEWS_OPER_ADD_FULL
+ Lista de oper news está cheia!
+NEWS_OPER_ADDED
+ Adicionado novo OperNews (#%d).
+NEWS_OPER_DEL_SYNTAX
+ OPERNEWS DEL {núm | ALL}
+NEWS_OPER_DEL_NOT_FOUND
+ OperNews não encontrado #%d!
+NEWS_OPER_DELETED
+ OperNews removido #%d.
+NEWS_OPER_DEL_NONE
+ Nenhum OperNews para remover!
+NEWS_OPER_DELETED_ALL
+ Todos os OperNews foram removidos.
+
+NEWS_RANDOM_SYNTAX
+ RANDOMNEWS {ADD|DEL|LIST} [texto|núm]
+NEWS_RANDOM_LIST_HEADER
+ Random News itens:
+NEWS_RANDOM_LIST_ENTRY
+ %5d (%s por %s)
+ %s
+NEWS_RANDOM_LIST_NONE
+ Não há RandomNews.
+NEWS_RANDOM_ADD_SYNTAX
+ RANDOMNEWS ADD texto
+NEWS_RANDOM_ADD_FULL
+ A lista de News está cheia!
+NEWS_RANDOM_ADDED
+ Adicionada novo item RandomNews (#%d).
+NEWS_RANDOM_DEL_SYNTAX
+ RANDOMNEWS DEL {núm | ALL}
+NEWS_RANDOM_DEL_NOT_FOUND
+ RandomNews item #%d não encontrado!
+NEWS_RANDOM_DELETED
+ RandomNews item #%d deletado.
+NEWS_RANDOM_DEL_NONE
+ Nenhum item RandomNews para deletar!
+NEWS_RANDOM_DELETED_ALL
+ Todos os itens RandomNews deletados.
+
+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 %s messages will be
+ sent in order to avoid flooding the user. If there are
+ more news messages, only the most recent will be sent.)
+ NewsCount can be configured in services.conf.
+
+ 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 %s messages will
+ be sent in order to avoid flooding the user. If there are
+ more news messages, only the most recent will be sent.)
+ NewsCount can be configured in services.conf.
+
+ 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
+ Sintaxe: RANDOMNEWS ADD texto
+ RANDOMNEWS DEL {núm | ALL}
+ RANDOMNEWS LIST
+
+ Edita ou mostra a lista de random news. Quando um usuário
+ se conecta à rede, uma (apenas uma) das random news será
+ aleatóriamente escolhida e enviada a ele.
+
+ RANDOMNEWS LIST pode ser usado por qualquer Operador
+ para listar as random news. ADD e DEL só podem ser usados
+ pelos Administradores dos Services.
+
+###########################################################################
+#
+# 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:
+
+ %R%s HELP
+ para informações sobre como registrar nicks
+
+ %R%s HELP
+ para informações sobre como registrar e controlar canais
+
+ %R%s HELP
+ para informações sobre como enviar mensagens para
+ usuários que não estejam conectados no momento
+
+HELP_HELP_BOT
+
+ %R%s HELP
+ para informações sobre como colocar um bot em seu canal
+
+HELP_HELP_HOST
+
+ %R%s HELP
+ para informação sobre como ajustar vHosts em nicks
+
+###########################################################################
+#
+# NickServ help messages
+#
+###########################################################################
+NICK_HELP_CMD_CONFIRM
+ CONFIRM Confirma um código de autorização do NickServ
+NICK_HELP_CMD_RESEND
+ RESEND Reenvia um código de autorização do NickServ
+NICK_HELP_CMD_REGISTER
+ REGISTER Registra um nick
+NICK_HELP_CMD_GROUP
+ GROUP Se junta a um grupo
+NICK_HELP_CMD_IDENTIFY
+ IDENTIFY Identifica seu nick com sua senha
+NICK_HELP_CMD_ACCESS
+ ACCESS Modifica a lista de endereços autorizados
+NICK_HELP_CMD_SET
+ SET Ajusta opções, incluindo proteção de kill
+NICK_HELP_CMD_SASET
+ SASET Set SET-options on another nickname
+NICK_HELP_CMD_DROP
+ DROP Cancela o registro de um nick
+NICK_HELP_CMD_RECOVER
+ RECOVER Derruba usuário que esteja usando seu nick
+NICK_HELP_CMD_RELEASE
+ RELEASE Retoma a custódia do seu nick após um RECOVER
+NICK_HELP_CMD_SENDPASS
+ SENDPASS Esqueceu sua senha? Tente isto
+NICK_HELP_CMD_GHOST
+ GHOST Termina uma sessão "fantasma" de IRC que esteja usando seu nick
+NICK_HELP_CMD_ALIST
+ ALIST Lista todos os canais nos quais você tem acesso
+NICK_HELP_CMD_GLIST
+ GLIST Lista todos os nicks do seu grupo
+NICK_HELP_CMD_INFO
+ INFO Mostra informações sobre algum nick registrado
+NICK_HELP_CMD_LIST
+ LIST Lista todos os nicks registrados que combinam com o padrão fornecido
+NICK_HELP_CMD_LOGOUT
+ LOGOUT Reverte o efeito do comando IDENTIFY
+NICK_HELP_CMD_STATUS
+ STATUS Retorna o status do owner de um determinado nick
+NICK_HELP_CMD_UPDATE
+ UPDATE Atualiza seu status atual, ou seja, verifica novos memos
+NICK_HELP_CMD_GETPASS
+ GETPASS Recupera a senha de um determinado nick
+NICK_HELP_CMD_GETEMAIL
+ GETEMAIL Encontra e retorna todos os usuários que se
+ registraram usando o email fornecido
+NICK_HELP_CMD_FORBID
+ FORBID Previne um nick de ser usado ou registrado
+NICK_HELP_CMD_SUSPEND
+ SUSPEND Suspende o nick fornecido
+NICK_HELP_CMD_UNSUSPEND
+ UNSUSPEND Libera o nick fornecido
+
+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
+ %R%S comando. Para mais informações sobre um
+ comando específico, digite %R%S HELP comando.
+
+NICK_HELP_FOOTER
+ NOTA: 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 mau 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, ou seja, 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; este 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. Para maiores informações neste recurso,
+ digite %R%S HELP GROUP.
+
+NICK_HELP_GROUP
+ Sintaxe: GROUP alvo senha
+
+ Este comando faz seu nick entrar no grupo de um nick alvo.
+ A senha é a senha do nick alvo.
+
+ Entrando em um grupo permitirá a você compartilhar suas
+ configurações, memos e privilégios em canais com todos os
+ nicks do grupo.
+
+ Um grupo existe por quanto tempo for necessário. Isso
+ significa que mesmo se um nick do grupo for desregistrado,
+ você não perderá os recursos compartilhados citados acima,
+ durante o tempo em que houver pelo menos um nick restando
+ no grupo.
+
+ Você pode usar este comando mesmo se não ainda não tiver
+ registrado seu nick. Se seu nick já estiver registrado,
+ você precisará identificá-lo antes de usar este comando.
+ Digite %R%S HELP IDENTIFY para mais informação; talvez
+ isso não seja possível em algumas redes.
+
+ É recomendável usar este comando com nicks não-registrados,
+ pois eles serão automaticamente registrados ao usar o comando.
+ Você pode usar isto com um nick registrado (para alterar seu
+ grupo) apenas se for permitido na rede.
+
+ Você só pode estar em um grupo por vez. Mesclar grupos não é
+ possível.
+
+ Atenção: todos os nicks do grupo terão a mesma senha.
+
+NICK_HELP_IDENTIFY
+ Sintaxe: 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
+ Sintaxe: UPDATE
+
+ Atualiza seu status atual, ou seja, checa por novos memos,
+ seta modos de canal necessários (ModeonID) e atualiza seu
+ vHost e suas flags de usuário (Último horário visto etc).
+
+NICK_HELP_LOGOUT
+ Sintaxe: LOGOUT
+
+ Este comando reverte o efeito do comando IDENTIFY, ou seja,
+ faz com que você não seja mais reconhecido como o verdadeiro
+ dono do nick. Note, entretanto, que ele não pedirá que você se
+ identifique novamente.
+
+NICK_HELP_DROP
+ Sintaxe: DROP [nick]
+
+ Sem parâmetros, cancela o registro de seu nick no banco
+ de dados do %S. Um nick que foi desregistrado é livre para
+ qualquer um que queira registrá-lo.
+
+ Você pode também desregistrar um nick de seu grupo
+ especificando-o com o parâmetro nick.
+
+ Para você usar este comando, será necessário que primeiro
+ você se identifique usando sua senha (%R%S HELP IDENTIFY
+ 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 os recursos de segurança para o seu nick
+ PRIVATE Previne seu nick de aparecer em um %R%S LIST
+ HIDE Esconde certas informações sobre seu nick
+ MSG Altera o método de comunicação dos Services
+ AUTOOP Should services op you automatically.
+
+ Para usar este comando, você deve primeiro se identificar
+ com sua senha (%R%S HELP IDENTIFY para maiores
+ informações).
+
+ Digite %R%S HELP SET opçã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). A linguagem Português, assim como outras, pode
+ apresentar algumas diferenças da linguagem Inglês (English),
+ já que Inglês é a linguagem oficial destes Services.
+ 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á
+ forçado pelo %S a trocar de nick, ou será desconectado da
+ rede (esse último não acontece em todas elas).
+
+ 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 | STATUS | 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), seu status de acesso aos Services
+ (STATUS) e sua última mensagem de saída (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_SET_AUTOOP
+ Syntax: SET AUTOOP {ON | OFF}
+
+ Sets whether you will be opped automatically. Set to ON to
+ allow ChanServ to op you automatically when entering channels.
+
+NICK_HELP_SASET
+ Syntax: SASET nickname option parameters.
+
+ Sets various nickname options. option can be one of:
+
+ DISPLAY Set the display of the group in Services
+ PASSWORD Set the nickname password
+ URL Associate a URL with the nickname
+ EMAIL Associate an E-mail address with the nickname
+ ICQ Associate an ICQ number with the nickname
+ GREET Associate a greet message with the nickname
+ KILL Turn protection on or off
+ SECURE Turn nickname security on or off
+ PRIVATE Prevent the nickname from appearing in a
+ %R%S LIST
+ HIDE Hide certain pieces of nickname information
+ MSG Change the communication method of Services
+ NOEXPIRE Prevent the nickname from expiring
+ LANGUAGE Set the language Services will use when
+ sending messages to nickname
+
+ Type %R%S HELP SASET option for more information
+ on a specific option. The options will be set on the given
+ nickname.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_DISPLAY
+ Syntax: SASET nickname DISPLAY new-display
+
+ Changes the display used to refer to the nickname group in
+ Services. The new display MUST be a nick of the group.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_PASSWORD
+ Syntax: SASET nickname PASSWORD new-password
+
+ Changes the password used to identify as the nick's owner.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_URL
+ Syntax: SASET nickname URL url
+
+ Associates the given URL with the nickname. This URL
+ will be displayed whenever someone requests information
+ on the nick with the INFO command.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_EMAIL
+ Syntax: SASET nickname EMAIL address
+
+ Associates the given E-mail address with the nickname.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_ICQ
+ Syntax: SASET nickname ICQ number
+
+ Associates the given ICQ number with the nickname. This
+ number will be displayed whenever someone requests
+ information on the nick with the INFO command.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_GREET
+ Syntax: SASET nickname GREET message
+
+ Makes the given message the greet of the nickname, that
+ will be displayed when joining a channel that has GREET
+ option enabled, provided that the user has the necessary
+ access on it.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_KILL
+ Syntax: SASET nickname KILL {ON | QUICK | IMMED | OFF}
+
+ Turns the automatic protection option for the nick
+ on or off. With protection on, if another user
+ tries to take the 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.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_SECURE
+ Syntax: SASET nickname 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.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_PRIVATE
+ Syntax: SASET nickname PRIVATE {ON | OFF}
+
+ Turns %S's privacy option on or off for the nick.
+ With PRIVATE set, the nickname will not appear in
+ nickname lists generated with %S's LIST command.
+ (However, anyone who knows the nickname can still get
+ information on it using the INFO command.)
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_HIDE
+ Syntax: SASET nickname HIDE {EMAIL | STATUS | USERMASK | QUIT} {ON | OFF}
+
+ Allows you to prevent certain pieces of information from
+ being displayed when someone does a %S INFO on the
+ nick. You can hide the E-mail address (EMAIL), last seen
+ user@host mask (USERMASK), the services access status
+ (STATUS) and last quit message (QUIT).
+ The second parameter specifies whether the information should
+ be displayed (OFF) or hidden (ON).
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_MSG
+ Syntax: SASET nickname MSG {ON | OFF}
+
+ Allows you to choose the way Services are communicating with
+ the given user. With MSG set, Services will use messages,
+ else they'll use notices.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_NOEXPIRE
+ Syntax: SASET nickname NOEXPIRE {ON | OFF}
+
+ Sets whether the given nickname will expire. Setting this
+ to ON prevents the nickname from expiring.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_AUTOOP
+ Syntax: SASET nickname AUTOOP {ON | OFF}
+
+ Sets whether the given nickname will be opped automatically.
+ Set to ON to allow ChanServ to op the given nickname
+ automatically when joining channels.
+
+NICK_HELP_SASET_LANGUAGE
+ Syntax: SASET nickname LANGUAGE number
+
+ Changes the language Services uses when sending messages to
+ nickname (for example, when responding to a command he sends).
+ number should be chosen from a list of supported languages
+ that you can get by typing %R%S HELP SET LANGUAGE.
+
+NICK_HELP_RECOVER
+ Sintaxe: RECOVER nick [senha]
+
+ 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 ficará online por %s para
+ assegurar que o outro usuário não reconecte imediatamente;
+ Durante você pode reivindicar seu nick.
+ Alternativamente, use o comando RELEASE
+ (%R%S HELP RELEASE) para retomar seu nick mais
+ rapidamente.
+
+ Para usar o comando RECOVER em um nick, seu endereço
+ atual como mostrado no /WHOIS deve estar na lista de acesso
+ do nick, você deve estar identificado e estar no grupo daquele
+ 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 %s;
+ este comando libera o seu nick mais cedo.
+
+ Para usar o comando RELEASE em um nick, seu endereço
+ atual como mostrado no /WHOIS deve estar na lista de acesso
+ do nick, você deve estar identificado e estar no grupo daquele
+ nick, ou você deve fornecer a senha correta para o nick.
+
+NICK_HELP_GHOST
+ Sintaxe: GHOST nick [senha]
+
+ Termina 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ê está no IRC.
+
+ Para usar o comando GHOST em um nick, seu endereço
+ atual como mostrado no /WHOIS deve estar na lista de acesso
+ do nick, você deve estar identificado e estar no grupo daquele
+ 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 e horário, e opções. Se você está
+ identificado para o nick que você está obtendo informações
+ e a opção ALL é especificada, será mostrado a você toda
+ informação possível; independente de haver opções para esconder.
+
+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.
+
+ 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
+ idents (insensível a maiúsculas).
+
+ LIST *!*@*.bar.org
+ Lista todos os nicks possuídos por usuários do domínio
+ bar.org
+
+NICK_HELP_ALIST
+ Sintaxe: ALIST [nível]
+
+ Lista todos os canais nos quais você tem acesso. Opcionalmente,
+ você pode especificar um nível no formato XOP ou ACCESS. A lista
+ de resultado inclui apenas os canais nos quais você tem o nível
+ de acesso fornecido.
+
+ Exemplos:
+ ALIST Founder
+ Lista todos os canais nos quais você tem acesso de Founder.
+
+ ALIST AOP
+ Lista todos os canais nos quais você tem acesso AOP ou maior.
+
+ ALIST 10
+ Lista todos os canais nos quais você tem nível 10 de acesso ou maior.
+
+ Canais com a opção NOEXPIRE serão prefixados por uma exclamação.
+
+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:
+
+ nick 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. Se nenhum nick for fornecido, seu status será exibido.
+
+NICK_HELP_SENDPASS
+ Sintaxe: SENDPASS nick
+
+ Envia a senha do nick em questão para o endereço de email
+ ajustado no nick. Esse comando é bem útil em se falando
+ de senhas perdidas.
+
+ Poder ser limitado a Operadores de IRC em algumas redes.
+
+ Este comando não está disponível quando estiver usando encriptação.
+
+NICK_HELP_CONFIRM
+ Syntax: CONFIRM passcode
+
+ This is the second step of nickname registration process.
+ You must perform this command in order to get your nickname
+ registered with %S. The passcode (or called auth code also)
+ is sent to your e-mail address in the first step of the
+ registration process. For more information about the first
+ stage of the registration process, type: %R%S HELP REGISTER
+
+NICK_HELP_RESEND
+ Syntax: RESEND
+
+ This command will re-send the auth code (also called passcode)
+ to the e-mail address of the user whom is performing it.
+
+NICK_SERVADMIN_HELP
+ Os Administradores dos Services podem ainda usar o DROP em qualquer nick
+ sem ser necessário se identificar como dono dele, e podem ver a lista de
+ acesso de qualquer nick (%R%S ACCESS LIST nick).
+
+NICK_SERVADMIN_HELP_LOGOUT
+ Sintaxe: LOGOUT [nick [REVALIDATE]]
+
+ Sem nenhum parâmetro, reverte o efeito do comando IDENTIFY,
+ ou seja, faz com que você não seja mais reconhecido como o
+ verdadeiro dono do nick. Note, entretanto, que ele não pedirá
+ que você se identifique novamente.
+
+ Com um parâmetro, fará o mesmo para o nick determinado. Se você
+ especificar REVALIDATE também, 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 do nick especificado
+ do banco de dados. Você pode desregistrar qualquer nick DE
+ SEU GRUPO sem nenhum privilégio especial, mas desregistrar
+ QUALQUER nick é restrito aos Administradores dos Services.
+
+NICK_SERVADMIN_HELP_INFO
+
+ Administradores de Services podem usar o parâmetro ALL com qualquer nick.
+
+NICK_SERVADMIN_HELP_LIST
+ Sintaxe: LIST padrão [FORBIDDEN] [SUSPENDED] [NOEXPIRE] [UNCONFIRMED]
+
+ 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, SUSPENDED, NOEXPIRE ou UNCONFIRMED são fornecidas, apenas
+ nicks que são, respectivamente, FORBIDDEN, SUSPENDED, UNCONFIRMED ou têm a opção
+ NOEXPIRE ativa, serão exibidos. Se todas as três opções forem fornecidas,
+ todos os três tipos de nicks serão exibidos. Estas opções são limitas 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
+ Sintaxe: ALIST [nick] [nível]
+
+ Sem parâmetros, lista os canais nos quais você tem acesso. Com
+ um parâmetro, lista os canais nos quais nick tem acesso.
+ Com dois parâmetros lista os canais nos quais nick tem
+ no mínimo o nível de acesso especificado.
+
+ Este uso é limitado aos Administradores dos Services.
+
+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 e o nick
+ no qual foi usado serão gravados e enviados para WALLOPS/GLOBOPS.
+
+ Este comando não fica disponível quando a encriptação está habilitada.
+
+ Limitado aos Administradores dos Services.
+
+NICK_SERVADMIN_HELP_GETEMAIL
+ Sintaxe: GETEMAIL usuário@emailhost
+
+ Retorna os nicks que utilizam o email dado. Observe que
+ você não pode usar coringas para usuário nem para emailhost.
+ Sempre que este comando for usado, uma mensagem incluindo a pessoa
+ que emitiu o comando e o email no qual foi usado serão gravados.
+
+ Limitado aos Administradores dos Services.
+
+NICK_SERVADMIN_HELP_FORBID
+ Sintaxe: FORBID nick [motivo]
+
+ Não permite que um nick seja registrado ou usado por
+ ninguém. Pode ser cancelado desregistrando o nick.
+
+ Em algumas redes, um motivo é necessário.
+
+ Limitado aos Administradores dos Services.
+
+NICK_SERVADMIN_HELP_SUSPEND
+ Sintaxe: SUSPEND nick motivo
+
+ SUSPENDE um nick, impedindo-o de ser usado.
+
+ Limitado aos Administradores dos Services.
+
+NICK_SERVADMIN_HELP_UNSUSPEND
+ Sintaxe: UNSUSPEND nick
+
+ LIBERA um nick suspendido, permitindo que seja usado.
+
+ Limitado aos Administradores dos Services.
+
+###########################################################################
+#
+# ChanServ help messages
+#
+###########################################################################
+CHAN_HELP_CMD_GETPASS
+ GETPASS Recupera a senha de um canal
+CHAN_HELP_CMD_FORBID
+ FORBID Previne um canal de ser registrado/usado
+CHAN_HELP_CMD_SUSPEND
+ SUSPEND Previne um canal de ser registrado/usado,
+ preservando os dados do canal e suas configurações
+CHAN_HELP_CMD_UNSUSPEND
+ UNSUSPEND Libera um canal suspenso
+CHAN_HELP_CMD_STATUS
+ STATUS Fornece o atual nível de acesso de um usuário em um canal
+CHAN_HELP_CMD_REGISTER
+ REGISTER Registra um canal
+CHAN_HELP_CMD_IDENTIFY
+ IDENTIFY Identifica seu nick
+CHAN_HELP_CMD_SET
+ SET Ajusta as opções e informações do canal
+CHAN_HELP_CMD_AOP
+ AOP Modifica a lista de AOP (AutoOP) de um canal
+CHAN_HELP_CMD_SOP
+ SOP Modifica a lista de SOP (SuperOP) de um canal
+CHAN_HELP_CMD_ACCESS
+ ACCESS Modifica a lista de usuários privilegiados
+CHAN_HELP_CMD_LEVELS
+ LEVELS Redefine os níveis de acesso
+CHAN_HELP_CMD_AKICK
+ AKICK Faz a manutenção da Lista de Autokick
+CHAN_HELP_CMD_DROP
+ DROP Cancela o registro de um canal
+CHAN_HELP_CMD_SENDPASS
+ SENDPASS Ajuda para recuperar senhas
+CHAN_HELP_CMD_BAN
+ BAN Bane o nick selecionado em um canal
+CHAN_HELP_CMD_CLEAR
+ CLEAR Diz ao ChanServ para remover certos ajustes de um canal
+CHAN_HELP_CMD_DEVOICE
+ DEVOICE Retira o status de Voice de um nick no canal
+CHAN_HELP_CMD_GETKEY
+ GETKEY Retorna a key (do modo +k) do canal fornecido
+CHAN_HELP_CMD_INFO
+ INFO Mostra informações sobre algum canal registrado
+CHAN_HELP_CMD_INVITE
+ INVITE Pede ao ChanServ para convidar você ou um nick fornecido para um canal
+CHAN_HELP_CMD_KICK
+ KICK Kicka (expulsa) um nick de um canal
+CHAN_HELP_CMD_LIST
+ LIST Lista todos os canais registrados que combinam com o padrão fornecido
+CHAN_HELP_CMD_LOGOUT
+ LOGOUT Desconecta um determinado nick
+CHAN_HELP_CMD_OP
+ OP Atribui status de OP a um nick no canal
+CHAN_HELP_CMD_TOPIC
+ TOPIC Modifica o tópico de um canal
+CHAN_HELP_CMD_UNBAN
+ UNBAN Remove todos os bans permitindo que você entre em um canal
+CHAN_HELP_CMD_VOICE
+ VOICE Atribui status de Voice a um nick no canal
+CHAN_HELP_CMD_VOP
+ VOP Modifica a lista de VOP (VOicePeople) de um canal
+CHAN_HELP_CMD_DEHALFOP
+ DEHALFOP Retira o status de HalfOP de um nick no canal
+CHAN_HELP_CMD_DEOWNER
+ DEOWNER Retira seu status de Owner no canal
+CHAN_HELP_CMD_DEPROTECT
+ DEPROTECT Desprotege um determinado nick no canal
+CHAN_HELP_CMD_HALFOP
+ HALFOP Atribui status de HalfOP a um nick no canal
+CHAN_HELP_CMD_HOP
+ HOP Modifica a lista de HOP (HalfOP) de um canal
+CHAN_HELP_CMD_OWNER
+ OWNER Concede-lhe status de Owner no canal
+CHAN_HELP_CMD_PROTECT
+ PROTECT Protege um determinado nick no canal
+CHAN_HELP_CMD_ADMIN
+ ADMIN Protege um determinado nick no canal
+CHAN_HELP_CMD_DEADMIN
+ DEADMIN Desprotege um determinado nick no canal
+CHAN_HELP_CMD_DEOP
+ DEOP Retira o status de OP de um nick no canal
+
+CHAN_HELP
+ %S permite que você registre e controle vários
+ aspectos do canal. %S pode prevenir o "take over"
+ do canal por 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
+ %R%S comando. Para mais informações sobre
+ um comando específico, digite %R%S HELP comando.
+
+
+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 período 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 sob seu nick.
+ Para utilizar este comando, você deve primeiro ser OP
+ do canal que está tentando registrar.
+
+ A senha é usada com o comando IDENTIFY para permitir
+ que outras pessoas façam alterações nas configurações do
+ canal. O último parâmetro, que deve ser incluído, é uma
+ descrição geral da finalidade do canal.
+
+ Quando você registra um canal, você é gravado como "fundador"
+ do mesmo. Ao fundador do canal é permitido alterar todas as
+ configurações do mesmo; %S irá dar automaticamente ao fundador
+ privilégios de Operador de Canal quando ele entrar no canal.
+ Veja o comando ACCESS (%R%S HELP ACCESS) para
+ informação sobre como liberar uma parte dos seus privilégios
+ a outros usuários do canal.
+
+ IMPORTANTE: Para registrar um canal, você deve antes ter
+ registrado seu nick. Se ainda não tiver seu nick registrado,
+ digite %R%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 com que um determinado nick seja des-identificado
+ do canal, fazendo com que seja necessário ele se identificar
+ novamente para recuperar seu acesso.
+
+ Se você for o Founder do canal, pode usar este comando em
+ qualquer usuário e 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.
+
+ Opções disponíveis:
+
+ 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
+ BANTYPE Ajusta como os Services devem fazer o ban
+ MLOCK Liga ou desliga a trava dos modos do canal
+ KEEPTOPIC Mantem o tópico quando o canal não está em uso
+ TOPICLOCK O tópico pode ser mudado apenas com o comando TOPIC
+ PEACE Regula o uso de comandos críticos
+ PRIVATE Esconde o canal do comando LIST
+ RESTRICTED Acesso restrito ao canal
+ SECURE Ativa os recursos de segurança do %S
+ SECUREOPS Controle rigoroso do status de OP
+ SECUREFOUNDER Controle rigoroso do status de Fundador do Canal
+ SIGNKICK Assinatura dos kicks feitos pelo comando KICK
+ OPNOTICE Envia uma notice quando os comandos OP/DEOP são usados
+ XOP Altera o sistema de privilégio de usuário
+
+ Digite %R%S HELP SET opção 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
+
+ Altera o sucessor de um canal. Se o nick do founder expirar
+ ou for 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 [endereço]
+
+ 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-de-ban
+
+ Seleciona o tipo de ban que será usado sempre que os Services
+ precisarem banir alguém do seu canal.
+
+ O tipo-de-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á lembrado pelo %S
+ mesmo depois que os usuários deixarem o canal, e será
+ restaurado na próxima vez que o canal for reutilizado.
+
+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 ativo, desativos ou não travados.
+ Os modos podem ser i, k, l, m, n, p, s, S, t
+ entre outros.
+
+ O parâmetro modos é usado exatamente do mesmo modo
+ que o comando /MODE, ou seja, modos seguidos de + são
+ travados como ativos, e modos seguidos de - são travados
+ como desativos. Note, no entanto, que ao contrário do
+ comando /MODE, cada uso do SET MLOCK irá remover
+ todos os modos anteriormente travados antes de travar
+ os novos.
+
+ 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 entrar 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 ser
+ ativo ou desativo (não travado).
+
+ 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 ativos ou desativos.
+
+CHAN_HELP_SET_PEACE
+ Sintaxe: SET canal PEACE {ON | OFF}
+
+ Ativa ou destiva a opção peace para um canal.
+ Quando peace está ativada, um usuário não poderá kickar,
+ banir ou remover os modos no canal de um usuário que tenha
+ nível superior ou igual ao seu via comandos do %S.
+
+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 %R%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 pertencem à 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 não
+ estiverem na lista de acesso não poderão ter o status de OP.
+
+CHAN_HELP_SET_SECUREFOUNDER
+ Sintaxe: SET canal SECUREFOUNDER {ON | OFF}
+
+ Ativa ou desativa 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 identificados 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 de quem usou o comando
+ no motivo do kick.
+
+ Se você usar LEVEL, aqueles que tiverem um nível igual ou
+ superior ao nível do SIGNKICK não terão o nick aparecendo no
+ motivo. Veja %R%S HELP LEVELS para maiores informações.
+
+CHAN_HELP_SET_XOP
+ Sintaxe: SET canal XOP {ON | OFF}
+
+ Ativa ou desativa o sistema de listas xOP para um canal.
+ Quando XOP está ativado, você deve usar os comandos
+ AOP/SOP/VOP para poder dar privilégios aos usuários
+ do canal, a não ser que você deva usar o comando ACCESS.
+
+ Nota técnica: quando você muda de lista de acesso para
+ o sistema de listas xOP, sua definição de níveis e níveis
+ de usuário serão alteradas, assim, você não encontrará os
+ mesmos valores se você voltar ao sistema de acesso!
+
+ Você também deve verificar se seus usuários ficaram em uma
+ lista xOP correta depois que você mudou de sistema de acesso
+ para listas xOP, porque a conversão nem sempre é perfeita...
+ de fato, não é recomendável usar listas xOP caso tenha alterado
+ suas definições de nível com o comando LEVELS.
+
+ Entretanto, mudar do sistema de listas xOP para sistema de lista
+ de acesso não causa problemas.
+
+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
+ Sintaxe: AOP canal ADD nick
+ AOP canal DEL {nick | entrada | lista-entradas}
+ AOP canal LIST [máscara | lista-entradas]
+ AOP canal CLEAR
+
+ Mantém a lista de AOP (AutoOP) para um canal. A lista
+ de AOP dá a um usuário os direitos de: receber OP
+ automaticamente ao entrar no canal, de se desbanir ou convidar
+ a si próprio se necessário, de ter sua mensagem de entrada
+ exibida ao entrar no canal, e assim por diante.
+
+ O comando AOP ADD adiciona o nick fornecido à lista de AOP.
+
+ O comando AOP DEL remove o nick fornecido da lista de AOP.
+ Se uma lista de números de entrada é fornecida, essas entradas
+ são deletadas. (Veja o exemplo para LIST abaixo.)
+
+ O comando AOP LIST exibe a lista de AOP. Se uma máscara
+ é fornecida, apenas as entradas que combinarem com ela serão
+ mostradas. Se uma lista de números de entrada é fornecida,
+ apenas essas entradas são mostradas; por exemplo:
+
+ AOP #canal LIST 2-5,7-9
+ Lista as entradas de AOP numeradas de 2 a 5 e de
+ 7 a 9.
+
+ O comando AOP CLEAR remove todas as entradas da lista de AOP.
+
+ Os comandos AOP ADD e AOP DEL são limitados aos SOPs
+ ou acima, enquanto o comando AOP CLEAR pode ser usado apenas
+ pelo Fundador do canal. No entanto, qualquer usuário na lista de
+ AOP pode usar o comando AOP LIST.
+
+ Este comando pode ter sido desabilitado para seu canal
+ e, nesse caso, você precisa usar a lista de acesso. Veja
+ %R%S HELP ACCESS para informações sobre a lista
+ de acesso, e %R%S HELP SET XOP para saber como
+ escolher entre a lista de acesso e o sistema de listas xOP.
+
+CHAN_HELP_HOP
+ Sintaxe: HOP canal ADD nick
+ HOP canal DEL {nick | entrada | lista-entradas}
+ HOP canal LIST [máscara | lista-entradas]
+ HOP canal CLEAR
+
+ Mantém a lista de HOP (HalfOP) para um canal. A lista
+ de HOP dá a um usuário o direito de receber HalfOP
+ automaticamente ao entrar no canal.
+
+ O comando HOP ADD adiciona o nick fornecido à lista de HOP.
+
+ O comando HOP DEL remove o nick fornecido da lista de HOP.
+ Se uma lista de números de entrada é fornecida, essas entradas
+ são deletadas. (Veja o exemplo para LIST abaixo.)
+
+ O comando HOP LIST exibe a lista de HOP. Se uma máscara
+ é fornecida, apenas as entradas que combinarem com ela serão
+ mostradas. Se uma lista de números de entrada é fornecida,
+ apenas essas entradas são mostradas; por exemplo:
+
+ HOP #canal LIST 2-5,7-9
+ Lista as entradas de HOP numeradas de 2 a 5 e de
+ 7 a 9.
+
+ O comando HOP CLEAR remove todas as entradas da lista de HOP.
+
+ Os comandos HOP ADD, HOP DEL e HOP LIST são limitados
+ aos AOPs ou acima, enquanto o comando HOP CLEAR pode ser usado
+ apenas pelo Fundador do canal.
+
+ Este comando pode ter sido desabilitado para seu canal
+ e, nesse caso, você precisa usar a lista de acesso. Veja
+ %R%S HELP ACCESS para informações sobre a lista
+ de acesso, e %R%S HELP SET XOP para saber como
+ escolher entre a lista de acesso e o sistema de listas xOP.
+
+CHAN_HELP_SOP
+ Sintaxe: SOP canal ADD nick
+ SOP canal DEL {nick | entrada | lista-entradas}
+ SOP canal LIST [máscara | lista-entradas]
+ SOP canal CLEAR
+
+ Mantém a lista de SOP (SuperOP) para um canal. A lista
+ de SOP dá a um usuário todos os direitos dados pela lista de
+ AOP, e adiciona a isso os direitos de: usar as listas de AutoKick
+ e BadWords, enviar e ler memos do canal, e assim por diante.
+
+ O comando SOP ADD adiciona o nick fornecido à lista de SOP.
+
+ O comando SOP DEL remove o nick fornecido da lista de SOP.
+ Se uma lista de números de entrada é fornecida, essas entradas
+ são deletadas. (Veja o exemplo para LIST abaixo.)
+
+ O comando SOP LIST exibe a lista de SOP. Se uma máscara
+ é fornecida, apenas as entradas que combinarem com ela serão
+ mostradas. Se uma lista de números de entrada é fornecida,
+ apenas essas entradas são mostradas; por exemplo:
+
+ SOP #canal LIST 2-5,7-9
+ Lista as entradas de SOP numeradas de 2 a 5 e de
+ 7 a 9.
+
+ O comando SOP CLEAR remove todas as entradas da lista de SOP.
+
+ Os comandos SOP ADD, SOP DEL e SOP CLEAR são limitados
+ ao Fundador do canal. No entanto, qualquer usuário na lista de AOP
+ pode usar o comando SOP LIST.
+
+ Este comando pode ter sido desabilitado para seu canal
+ e, nesse caso, você precisa usar a lista de acesso. Veja
+ %R%S HELP ACCESS para informações sobre a lista
+ de acesso, e %R%S HELP SET XOP para saber como
+ escolher entre a lista de acesso e o sistema de listas xOP.
+
+CHAN_HELP_VOP
+ Sintaxe: VOP canal ADD nick
+ VOP canal DEL {nick | entrada | lista-entradas}
+ VOP canal LIST [máscara | lista-entradas]
+ VOP canal CLEAR
+
+ Mantém a lista de VOP (VOicePeople) para um canal. A lista
+ de VOP permite a um usuário receber Voice automaticamente
+ ao entrar no canal e dar Voice a si mesmo se não possuir.
+
+ O comando VOP ADD adiciona o nick fornecido à lista de VOP.
+
+ O comando VOP DEL remove o nick fornecido da lista de VOP.
+ Se uma lista de números de entrada é fornecida, essas entradas
+ são deletadas. (Veja o exemplo para LIST abaixo.)
+
+ O comando VOP LIST exibe a lista de VOP. Se uma máscara
+ é fornecida, apenas as entradas que combinarem com ela serão
+ mostradas. Se uma lista de números de entrada é fornecida,
+ apenas essas entradas são mostradas; por exemplo:
+
+ VOP #canal LIST 2-5,7-9
+ Lista as entradas de VOP numeradas de 2 a 5 e de
+ 7 a 9.
+
+ O comando VOP CLEAR remove todas as entradas da lista de VOP.
+
+ Os comandos VOP ADD, VOP DEL e VOP LIST são limitados
+ aos AOPs ou acima, enquanto o comando VOP CLEAR pode ser usado
+ apenas pelo Fundador do canal.
+
+ Este comando pode ter sido desabilitado para seu canal
+ e, nesse caso, você precisa usar a lista de acesso. Veja
+ %R%S HELP ACCESS para informações sobre a lista
+ de acesso, e %R%S HELP SET XOP para saber como
+ escolher entre a lista de acesso e o sistema de listas xOP.
+
+CHAN_HELP_ACCESS
+ Sintaxe: ACCESS canal ADD nick nível
+ ACCESS canal DEL {nick | entrada | lista-entradas}
+ ACCESS canal LIST [máscara | lista-entradas]
+ ACCESS canal CLEAR
+
+ Faz manutenção da lista de acesso de um canal. A lista
+ de acesso especifica que usuários tem permissão para
+ 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; %R%S HELP
+ ACCESS LEVELS para mais informações específicas. Por
+ padrão, qualquer nick não presente na lista de acesso
+ possui nível 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 nível
+ especificado deve ser menor do que o do usuário que emitiu o
+ comando, e se o nick já estiver na lista de acesso, o
+ nível de acesso atual desse nick deve ser menor que o nível
+ de acesso do 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 de 7 a 9.
+
+ O comando ACCESS CLEAR limpa todas as entradas da lista
+ de acesso.
+
+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 às funções do %S; OP automático
+ quando entrar no canal. Note que 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 %R%S HELP LEVELS para informações.
+
+CHAN_HELP_AKICK
+ Sintaxe: AKICK canal ADD {nick | máscara} [razão]
+ AKICK canal STICK máscara
+ AKICK canal UNSTICK máscara
+ AKICK canal DEL {nick | máscara | entry-num | list}
+ AKICK canal LIST [máscara | entry-num | list]
+ AKICK canal VIEW [máscara | entry-num | list]
+ AKICK canal ENFORCE
+ AKICK canal CLEAR
+
+ 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".
+ When akicking a registered nick the nickserv account
+ will be added to the akick list instead of the mask.
+ All users within that nickgroup will then be akicked.
+
+ O comando AKICK STICK bane permanentemente no canal
+ a máscara fornecida. Se alguém tentar remover o ban,
+ %S irá automaticamente colocá-lo de volta. Você
+ não pode usar isto para nicks registrados.
+
+ O comando AKICK UNSTICK cancela o efeito do comando
+ AKICK STICK, assim você poderá remover o ban no canal.
+
+ O comando AKICK DEL remove um nick ou máscara da lista
+ de AutoKick. Isso, entretanto, não remove nenhum 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 VIEW é uma versão mais completa do
+ comando AKICK LIST.
+
+ O comando AKICK ENFORCE obriga o %S a verificar
+ a lista de AutoKicks para banir os usuários que sejam
+ compatíveis com alguma máscara da lista de AutoKick.
+
+ O comando AKICK CLEAR limpa todas as entradas da lista
+ de AutoKick.
+
+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 dos níveis de acesso numéricos 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 seja alterado. LEVELS DISABLE (ou DIS
+ para encurtar) desabilita um recurso automático ou não permite
+ o acesso a funções para qualquer um 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 recém-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
+ Os seguintes nomes de recursos/funções são entendidos.
+ Note que os 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 as informações 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ão mostradas.
+
+CHAN_HELP_LIST
+ Sintaxe: LIST padrão
+
+ Lista todos os canais registrados que combinam com o padrão
+ fornecido. (Canais com opção PRIVATE ativada não serão listados).
+
+CHAN_HELP_OP
+ Sintaxe: OP #canal nick
+
+ Atribui status de Operador ao nick dado em um determinado
+ canal. Se não for fornecido um nick, o status será atribuído
+ a você mesmo. Se nem canal nem nick forem fornecidos, o
+ status será atribuído a você mesmo em todos os canais onde
+ estiver, caso tenha nível suficiente para usar o comando em
+ cada um.
+
+ Por padrão, é limitado aos AOPs ou àqueles que possuem
+ nível de acesso 5 ou superior no canal.
+
+CHAN_HELP_DEOP
+ Sintaxe: DEOP #canal nick
+
+ Remove o status de Operador do nick dado em um determinado
+ canal. Se não for fornecido um nick, o status será removido
+ de você mesmo. Se nem canal nem nick forem fornecidos, o
+ status será removido de você mesmo em todos os canais onde
+ estiver, caso tenha nível suficiente para usar o comando em
+ cada um.
+
+ Por padrão, é limitado aos AOPs ou àqueles que possuem
+ nível de acesso 5 ou superior no canal.
+
+CHAN_HELP_VOICE
+ Sintaxe: VOICE [#canal [nick]]
+
+ Atribui status de Voice ao nick dado em um determinado
+ canal. Se não for fornecido um nick, o status será atribuído
+ a você mesmo. Se nem canal nem nick forem fornecidos, o
+ status será atribuído a você mesmo em todos os canais onde
+ estiver, caso tenha nível suficiente para usar o comando em
+ cada um.
+
+ Por padrão, é limitado aos AOPs ou àqueles que possuem
+ nível de acesso 5 ou superior no canal; ou aos VOPs ou
+ àqueles que possuem nível de acesso 3 ou superior, para
+ atribuírem o status a eles mesmos.
+
+CHAN_HELP_DEVOICE
+ Sintaxe: DEVOICE [#canal [nick]]
+
+ Remove o status de Voice do nick dado em um determinado
+ canal. Se não for fornecido um nick, o status será removido
+ de você mesmo. Se nem canal nem nick forem fornecidos, o
+ status será removido de você mesmo em todos os canais onde
+ estiver, caso tenha nível suficiente para usar o comando em
+ cada um.
+
+ Por padrão, é limitado aos AOPs ou àqueles que possuem
+ nível de acesso 5 ou superior no canal; ou aos VOPs ou
+ àqueles que possuem nível de acesso 3 ou superior, para
+ atribuírem o status a eles mesmos.
+
+CHAN_HELP_HALFOP
+ Sintaxe: HALFOP [#canal [nick]]
+
+ Atribui status de HalfOP ao nick dado em um determinado
+ canal. Se não for fornecido um nick, o status será atribuído
+ a você mesmo. Se nem canal nem nick forem fornecidos, o
+ status será atribuído a você mesmo em todos os canais onde
+ estiver, caso tenha nível suficiente para usar o comando em
+ cada um.
+
+ Por padrão, é limitado aos AOPs ou àqueles que possuem
+ nível de acesso 5 ou superior no canal; ou aos HOPs ou
+ àqueles que possuem nível de acesso 4 ou superior, para
+ atribuírem o status a eles mesmos.
+
+CHAN_HELP_DEHALFOP
+ Sintaxe: DEHALFOP [#canal [nick]]
+
+ Remove o status de HalfOP do nick dado em um determinado
+ canal. Se não for fornecido um nick, o status será removido
+ de você mesmo. Se nem canal nem nick forem fornecidos, o
+ status será removido de você mesmo em todos os canais onde
+ estiver, caso tenha nível suficiente para usar o comando em
+ cada um.
+
+ Por padrão, é limitado aos AOPs ou àqueles que possuem
+ nível de acesso 5 ou superior no canal; ou aos HOPs ou
+ àqueles que possuem nível de acesso 4 ou superior, para
+ atribuírem o status a eles mesmos.
+
+CHAN_HELP_PROTECT
+ Sintaxe: PROTECT [#canal [nick]]
+
+ Protege um determinado nick no canal. Se nick não for
+ fornecido, isso irá lhe proteger. Sem nem canal nem nick
+ forem fornecidos, irá lhe proteger em todos os canais em que
+ você estiver, caso você tenha nível suficiente para usar o
+ comando em cada um.
+
+ Por padrão, limitado ao Founder, a SOPs ou àqueles com nível
+ 10 ou superior no canal para se auto-protegerem.
+
+CHAN_HELP_DEPROTECT
+ Sintaxe: DEPROTECT [#canal [nick]]
+
+ Desprotege um determinado nick no canal. Se nick não for
+ fornecido, isso irá lhe desproteger. Sem nem canal nem nick
+ forem fornecidos, irá lhe desproteger em todos os canais em que
+ você estiver, caso você tenha nível suficiente para usar o
+ comando em cada um.
+
+ Por padrão, limitado ao Founder, a SOPs ou àqueles com nível
+ 10 ou superior no canal para se auto-desprotegerem.
+
+CHAN_HELP_OWNER
+ Sintaxe: OWNER [#canal]
+
+ Te concede status de owner no canal. Isso irá lhe
+ proteger inclusive daqueles que possuem status "Protect".
+ Se canal não for fornecido, irá lhe dar status de owner
+ em todos os canais em que você estiver, caso você tenha
+ nível suficiente para usar o comando em cada um.
+
+ Limitado àqueles que possuem acesso de Founder no canal.
+
+CHAN_HELP_DEOWNER
+ Sintaxe: DEOWNER [#canal]
+
+ Remove seu status de owner no canal. Se canal não
+ for fornecido, irá remover seu status de owner em todos os
+ canais em que você estiver, caso você tenha nível suficiente
+ para usar o comando em cada um.
+
+ Limitado àqueles que possuem acesso de Founder no canal.
+
+CHAN_HELP_INVITE
+ Sintaxe: INVITE #canal
+
+ Manda o %S dar um invite em você para o canal dado.
+
+ Por padrão, é limitado aos AOPs ou àqueles que possuem
+ nível de acesso 5 ou superior no canal.
+
+CHAN_HELP_UNBAN
+ Sintaxe: UNBAN #canal
+
+ Diz ao %S para remover todos os bans permitindo que
+ você entre em um canal.
+
+ Por padrão, é limitado aos AOPs ou àqueles que possuem
+ nível de acesso 5 ou superior no canal.
+
+CHAN_HELP_KICK
+ Sintaxe: KICK [#canal [nick [motivo]]]
+
+ Kicka (expulsa) um nick dado em um determinado canal.
+ Se não for fornecido um nick, você mesmo será kickado.
+ Se nem canal nem nick forem fornecidos, você mesmo será
+ kickado em todos os canais onde estiver, caso tenha nível
+ suficiente para usar o comando em cada um.
+
+ Por padrão, é limitado aos AOPs ou àqueles que possuem
+ nível de acesso 5 ou superior no canal.
+
+CHAN_HELP_BAN
+ Sintaxe: BAN [#canal [nick [motivo]]]
+
+ Bane o nick selecionado em um canal. Se o nick não é fornecido,
+ irá banir você. Se nem canal nem nick forem fornecidos,
+ irá banir você em todos os canais onde você estiver, supondo que
+ você tem acesso para isso em cada canal.
+
+ Por padrão, limitado a AOPs ou àqueles com nível de acesso 5 ou
+ superior no canal.
+
+CHAN_HELP_TOPIC
+ Sintaxe: TOPIC canal [tópico]
+
+ Manda %S ajustar o tópico do canal para o que foi especificado.
+ Se tópico não é fornecido, então um tópico vazio será
+ ajustado. Este comando é mais útil se usado junto com a opção
+ SET TOPICLOCK. Veja %R%S HELP SET TOPICLOCK
+ para mais informação.
+
+ Por padrão, limitado àqueles que possuem acesso de Founder no canal.
+
+CHAN_HELP_CLEAR
+ Sintaxe: CLEAR canal opção
+
+ Diz ao %S para remover certos ajustes de um canal.
+ A opção pode ser uma das seguintes:
+
+ MODES Recoloca todos os modos do canal, isto é, remove
+ os modos i,k,l,m,n,p,s,t e recoloca os que estão
+ travados com MLOCK.
+ BANS Remove todos os bans do canal.
+ EXCEPTS Remove todos os excepts do canal.
+ OPS Remove o status de Operador de canal (modo +o)
+ de todos os Operadores do canal.
+ HOPS Remove o status de Half-Operador de canal (modo +h)
+ de todos os Half-Operadores do canal, se suportado.
+ VOICES Remove o status "voice" (modo +v) de qualquer
+ pessoa que tenha esse modo.
+ USERS Remove (kicka) todos os usuários do canal.
+
+ Por padrão, limitado àqueles que possuem acesso de Founder no canal.
+
+CHAN_HELP_GETKEY
+ Sintaxe: GETKEY canal
+
+ Retorna a key (do modo +k) de um determinado canal. Este comando é
+ geralmente usado por bots e/ou scripts, da seguinte forma:
+
+ KEY <canal> <key>
+
+ key é "NENHUMA KEY" se nenhuma key estiver gravada.
+
+CHAN_HELP_SENDPASS
+ Sintaxe: SENDPASS canal
+
+ Envia a senha de um determinado canal para o fundador
+ do mesmo, usando o e-mail gravado no nick dele. Este
+ comando é realmente útil quando se trata de senhas
+ perdidas.
+
+ Pode estar limitado aos Operadores de IRC em
+ algumas Redes.
+
+ Este comando só funciona se o modo de encriptação
+ não estiver ligado.
+
+CHAN_SERVADMIN_HELP
+
+ Os Administradores dos Services podem também usar o comando
+ DROP mesmo sem se identificarem como donos do canal, e podem
+ também ver as listas de acesso, AKICK, e níveis de qualquer
+ canal.
+
+CHAN_SERVADMIN_HELP_LOGOUT
+ Sintaxe: LOGOUT canal [nick]
+
+ Este comando faz com que um determinado nick seja des-identificado
+ do canal, fazendo com que seja necessário ele se identificar
+ novamente para recuperar seu acesso.
+
+ Se você for o Founder do canal, pode usar este comando em
+ qualquer usuário e em si mesmo.
+
+ Se você for um Administrador dos Services, poderá
+ desconectar qualquer um de qualquer canal sem precisar
+ ser o Founder dos mesmos. Além disso, você pode omitir
+ o parâmetro nick; com isso, irá des-identificar todos
+ os usuários registrados do canal.
+
+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 podem ajustar a opção
+ NOEXPIRE, fazendo com que canais sejam impedidos de ter
+ seu registro expirado. Services Root Administrators 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 padrão [FORBIDDEN] [SUSPENDED] [NOEXPIRE]
+
+ 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. Canais com a opção NOEXPIRE ativada
+ terão um ! preposto ao nome do canal na lista quando for a pedido
+ de um Administrador dos Services.
+
+ Se as opções FORBIDDEN, SUSPENDED ou NOEXPIRE são fornecidas, apenas
+ canais que são, respectivamente, forbidados, suspendidos ou têm a opção
+ NOEXPIRE ativa, serão exibidos. Se todas as três opções forem fornecidas,
+ todos os três tipos de canais serão exibidos. Estas opções são limitas
+ aos Administradores dos Services.
+
+CHAN_SERVADMIN_HELP_GETPASS
+ Sintaxe: GETPASS canal
+
+ Retorna a senha do canal fornecido. Observe que sempre
+ que 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_FORBID
+ Sintaxe: FORBID canal [motivo]
+
+ Proibe que qualquer pessoa registre e utilize o canal
+ dado. Pode ser cancelado com o desregistro do canal.
+
+ Um motivo pode ser necessário em algumas redes.
+
+ Limitado aos Administradores dos Services.
+
+CHAN_SERVADMIN_HELP_SUSPEND
+ Sintaxe: SUSPEND canal [motivo]
+
+ Proibe qualquer um de registrar ou usar o canal dado.
+ Pode ser cancelado usando o comando UNSUSPEND para
+ preservar todos os dados/configurações anteriores do canal.
+
+ Um motivo pode ser necessário em algumas redes.
+
+ Limitado aos Administradores dos Services.
+
+CHAN_SERVADMIN_HELP_UNSUSPEND
+ Sintaxe: UNSUSPEND canal
+
+ Libera um canal suspenso. Todos os dados e configurações
+ são preservados de antes da suspensão.
+
+ Limitado aos Administradores dos Services.
+
+CHAN_SERVADMIN_HELP_STATUS
+ Sintaxe: STATUS canal nick
+
+ 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_CMD_SEND
+ SEND Envia uma mensagem para um nick ou para um canal
+MEMO_HELP_CMD_CANCEL
+ CANCEL Cancela o último memo enviado por você
+MEMO_HELP_CMD_LIST
+ LIST Lista suas mensagens
+MEMO_HELP_CMD_READ
+ READ Lê a(s) mensagem(ns)
+MEMO_HELP_CMD_DEL
+ DEL Apaga a(s) mensagem(ns)
+MEMO_HELP_CMD_SET
+ SET Ajusta opções relacionadas às mensagens
+MEMO_HELP_CMD_INFO
+ INFO Exibe informações sobre suas mensagens
+MEMO_HELP_CMD_RSEND
+ RSEND Envia um memo e pede uma confirmação de leitura
+MEMO_HELP_CMD_CHECK
+ CHECK Verifica se o último memo enviado para um nick foi lido
+MEMO_HELP_CMD_SENDALL
+ SENDALL Envia um memo para todos os usuários registrados
+MEMO_HELP_CMD_STAFF
+ STAFF Envia um memo para todos os opers/admins
+
+MEMO_HELP_HEADER
+ %S é um serviço que permite aos usuários de IRC
+ enviar curtas mensagens a outros usuários, mesmo
+ que eles estejam conectados no momento ou não; ou
+ a canais(*). Ambos, destinatários e remetentes,
+ devem possuir seus nicks (ou canais) registrados para
+ que possam enviar uma mensagem (memo).
+ Os comandos do %S são:
+
+
+MEMO_HELP_ADMIN
+ Não usado.
+MEMO_HELP_OPER
+ Não usado.
+MEMO_HELP_FOOTER
+
+ Digite %R%S HELP comando para ajuda em qualquer um
+ dos comandos acima.
+
+ (*) Por padrão, qualquer usuário com pelo menos nível 10 de acesso
+ em um canal pode ler os memos do canal. Isso pode ser mudado
+ com o comando %s LEVELS.
+
+MEMO_HELP_SEND
+ Sintaxe: SEND {nick | canal} mensagem
+
+ Envia um memo ao nick ou ao canal determinado contendo
+ a mensagem. Quando enviada para o destinatário, este
+ receberá um aviso que possui uma nova mensagem. O nick/canal
+ de destino deverá estar registrado.
+
+MEMO_HELP_CANCEL
+ Sintaxe: CANCEL {nick | canal}
+
+ Cancela a última mensagem enviada para um determinado nick ou
+ canal, caso ela ainda não tenha sido lida no momento em que este
+ comando for usado.
+
+MEMO_HELP_LIST
+ Sintaxe: LIST [canal] [list | NEW]
+
+ Lista quaisquer mensagens que você tiver. Com NEW, lista apenas
+ as novas mensagens (não lidas). Mensagens não lidas são marcadas
+ com "*" à esquerda do número. Você também pode especificar uma
+ lista de números, como no exemplo abaixo:
+
+ LIST 2-5,7-9
+ Lista mensagens numeradas de 2 a 5 e de 7 a 9.
+
+MEMO_HELP_READ
+ Sintaxe: READ [canal] {núm | list | LAST | NEW}
+
+ Mostra as mensagens especificadas. Se LAST é fornecido, envia
+ a você a mensagem recebida mais recentemente. Se NEW é fornecido,
+ envia a você todas as suas novas mensagens. Caso contrário, envia
+ a você a mensagem de número núm. Você também pode fornecer uma
+ lista de números, como neste exemplo:
+
+ READ 2-5,7-9
+ Mostra as mensagens numeradas de 2 a 5 e de 7 a 9.
+
+MEMO_HELP_DEL
+ Sintaxe: DEL [canal] {num | list | LAST | ALL}
+
+ Apaga a(s) mensagem(ns) especificada(s). Você pode fornecer
+ vários números de mensagens ou seqüências de números ao invés
+ de um único número, como no segundo exemplo abaixo.
+
+ Se LAST é fornecido, a última mensagem será apagada.
+ Se ALL é fornecido, todas as suas mensagens serão apagadas.
+
+ 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 opção parâmetros
+
+ Ajusta várias opções de mensagens. A opção pode ser uma dessas:
+
+ NOTIFY Altera quando você será notificado sobre novas
+ mensagens (só para nicks)
+ LIMIT Ajusta o número máximo de mensagens que você
+ pode receber.
+
+ Digite %R%S HELP SET opção, para mais informações sobre
+ uma opção específica.
+
+MEMO_HELP_SET_NOTIFY
+ Sintaxe: SET NOTIFY {ON | LOGON | NEW | OFF}
+
+ Altera quando você será notificado sobre novas mensagens:
+
+ ON Você será notificado sobre mensagens quando você
+ conectar, quando voltar de um /AWAY e quando
+ são enviadas a você.
+ LOGON Você só será notificado sobre mensagens quando você
+ conectar ou quando voltar de um /AWAY.
+ NEW Você só será notificado sobre mensagens quando elas
+ forem enviadas a você.
+ OFF Você não receberá nenhuma notificação sobre mensagens.
+
+ ON é essencialmente a combinação de LOGON e NEW.
+
+MEMO_HELP_SET_LIMIT
+ Sintaxe: SET LIMIT [canal] limite
+
+ Ajusta o número máximo de mensagens que você (ou o canal fornecido)
+ podem ter. Se você ajustar para 0, ninguém será capaz de enviar
+ mensagens para você. Entretanto, você não pode ajustar este
+ limite para mais que %d.
+
+MEMO_HELP_INFO
+ Sintaxe: INFO [canal]
+
+ Informa o número de mensagens que você tem, quantas
+ mensagens não foram lidas, e quantas mensagens no total
+ você pode receber. Com o parâmetro, mostra a mesma
+ informação para o canal fornecido.
+
+MEMO_SERVADMIN_HELP_SET_LIMIT
+ Sintaxe: SET LIMIT [usuário | canal] {limite | NONE} [HARD]
+
+ Ajusta o número máximo de mensagens que um usuário ou canal podem
+ ter. Ajustando o limite para 0, previne o usuário de receber
+ qualquer mensagem; ajustando o limite em NONE permite que o
+ usuário receba e mantenha quantas mensagens quiser. Se você
+ não fornecer o nick ou canal, seu próprio limite será ajustado.
+
+ Adicionando HARD previne que o usuário mude o limite.
+ Não adicionando HARD tem o efeito contrário, permitindo
+ que o usuário mude o limite (mesmo se um limite anterior
+ foi ajustado com HARD).
+
+ Este uso do comando SET LIMIT é limitado aos Administradores
+ dos Services. Outros usuários somente ajustarão seus
+ próprios limites ou de um canal onde tenham privilégios
+ para isso, não podem remover seu próprio limite, não
+ podem ajustar o limite acima de %d, e não podem ajustar
+ um limite máximo (HARD).
+
+MEMO_SERVADMIN_HELP_INFO
+ Sintaxe: INFO [nick | canal]
+
+ Sem um parâmetro, informa o número de mensagens que você
+ tem, quantas mensagens ainda não foram lidas, e quantas
+ mensagens no total você pode receber.
+
+ Com o parâmetro do canal, mostra a mesma informação para
+ o canal fornecido.
+
+ Com o parâmetro de nick, mostra a mesma informação para
+ o nick fornecido. Esta derivação do comando é limitada aos
+ Administradores dos Services.
+
+MEMO_HELP_STAFF
+ Sintaxe: STAFF mensagem
+
+ Envia um memo a todos os membros da Staff dos Services
+ contendo uma mensagem.
+ Nota: Se você tem acesso em ambas as listas de Oper e Admin
+ irá receber o mesmo memo duas vezes. O mesmo se aplica a
+ Operadores que estejam na lista de Root como em outra(s) também.
+
+MEMO_HELP_SENDALL
+ Sintaxe: SENDALL mensagem
+
+ Envia um memo para todos os usuários registrados
+ contendo uma mensagem.
+
+MEMO_HELP_RSEND
+ Sintaxe: RSEND {nick | canal} mensagem
+
+ Envia para um nick ou canal um memo contendo uma
+ mensagem. Quando enviar a um nick, o destinatário receberá
+ um aviso de que ele tem um novo memo. O destino (nick/canal)
+ deve ser registrado.
+ Uma vez que o memo for lido pelo destinatário, uma notificação
+ automática será enviada ao remetente informando-o que o memo
+ foi lido.
+
+MEMO_HELP_CHECK
+ Sintaxe: CHECK nick
+
+ Verifica se o último memo que você enviou para nick
+ foi lido ou não. Observe que isso só funciona com nicks,
+ nunca com canais.
+
+###########################################################################
+#
+# OperServ help messages
+#
+###########################################################################
+
+OPER_HELP_CMD_GLOBAL
+ GLOBAL Envia uma mensagem para todos usuários
+OPER_HELP_CMD_STATS
+ STATS Mostra estatísticas dos Services e da Rede
+OPER_HELP_CMD_OPER
+ OPER Modifica a lista de Operadores dos Services
+OPER_HELP_CMD_ADMIN
+ ADMIN Modifica lista de Administradores dos Services
+OPER_HELP_CMD_STAFF
+ STAFF Exibe os membros da Staff dos Services e seu status online
+OPER_HELP_CMD_MODE
+ MODE Muda o modo de um canal
+OPER_HELP_CMD_KICK
+ KICK Kicka um usuário de um canal
+OPER_HELP_CMD_CLEARMODES
+ CLEARMODES Limpa os modos de um canal
+OPER_HELP_CMD_KILLCLONES
+ KILLCLONES Derruba todos os usuários de um mesmo host
+OPER_HELP_CMD_AKILL
+ AKILL Manipula a lista de AKILL
+OPER_HELP_CMD_SGLINE
+ SGLINE Manipula a lista de SGLINE
+OPER_HELP_CMD_SQLINE
+ SQLINE Manipula a lista de SQLINE
+OPER_HELP_CMD_SZLINE
+ SZLINE Manipula a lista de SZLINE
+OPER_HELP_CMD_CHANLIST
+ CHANLIST Lista todos os canais em uso na Rede
+OPER_HELP_CMD_USERLIST
+ USERLIST Lista todos os usuários online na Rede
+OPER_HELP_CMD_LOGONNEWS
+ LOGONNEWS Define mensagens a serem mostradas na conexão
+OPER_HELP_CMD_RANDOMNEWS
+ RANDOMNEWS Define mensagens a serem mostradas ao azar na conexão
+OPER_HELP_CMD_OPERNEWS
+ OPERNEWS Define mensagens a serem mostradas a quem pega Oper
+OPER_HELP_CMD_SESSION
+ SESSION Mostra a lista de sessões de host
+OPER_HELP_CMD_EXCEPTION
+ EXCEPTION Modifica a lista de limite de sessões
+OPER_HELP_CMD_NOOP
+ NOOP Remove temporariamente todas as O:lines de um
+ servidor remotamente
+OPER_HELP_CMD_JUPE
+ JUPE Jupa um servidor
+OPER_HELP_CMD_IGNORE
+ IGNORE Modifica a lista de ignorados dos Services
+OPER_HELP_CMD_SET
+ SET Configura várias opções globais dos Services
+OPER_HELP_CMD_RELOAD
+ RELOAD Recarrega o arquivo de configuração dos Services
+OPER_HELP_CMD_UPDATE
+ UPDATE Salva os dados atuais dos Services
+OPER_HELP_CMD_RESTART
+ RESTART Salva os dados e reinicia os Services
+OPER_HELP_CMD_QUIT
+ QUIT Termina os Services sem salvar os dados
+OPER_HELP_CMD_SHUTDOWN
+ SHUTDOWN Termina os Services salvando os dados
+OPER_HELP_CMD_DEFCON
+ DEFCON Manipula o sistema DefCon
+OPER_HELP_CMD_CHANKILL
+ CHANKILL Derruba todos os usuários de um canal específico
+OPER_HELP_CMD_OLINE
+ OLINE Dá flags de Operador a um determinado usuário
+OPER_HELP_CMD_UMODE
+ UMODE Altera os modos de um usuário
+OPER_HELP_CMD_SVSNICK
+ SVSNICK Força a mudança do nick de um usuário
+OPER_HELP_CMD_MODLOAD
+ MODLOAD Carrega um módulo
+OPER_HELP_CMD_MODUNLOAD
+ MODUNLOAD Descarrega um módulo
+OPER_HELP_CMD_MODINFO
+ MODINFO Informação sobre um módulo carregado
+OPER_HELP_CMD_MODLIST
+ MODLIST Lista os módulos carregados
+
+OPER_HELP
+ Comandos do %S:
+
+OPER_HELP_LOGGED
+ Aviso: Todos os comandos enviados para o %S são gravados!
+
+OPER_HELP_GLOBAL
+ Sintaxe: GLOBAL mensagens
+
+ Permite que os IRCops enviem mensagens para todos os usuários
+ da Rede. A mensagem será enviada pelo nick %s.
+
+OPER_HELP_STATS
+ Sintaxe: STATS [AKILL | ALL | RESET]
+
+ Sem nenhuma opção, mostra o número atual de usuários e
+ IRCops online (excluindo Services), o número máximo de
+ usuários online conectados simultaneamente desde que os
+ Services foram iniciados na rede, e o tempo pelo qual os
+ Services estão rodando sem interrupções.
+
+ Com a opção AKILL, será mostrado o tamanho atual da
+ listas de AKILL e SQLINE e o tempo padrão para um AKILL
+ ou SQLINE expirar.
+
+ A opção ALL está disponível apenas para os Administradores
+ dos Services, e mostra informações sobre o consumo de memória
+ dos Services. O uso deste comando pode congelar os Services
+ por um curto período de tempo em redes grandes, então não
+ abuse deste comando!
+
+ A opção RESET reinicia a contagem do máximo de usuários
+ para o número de usuários atualmente conectados na rede.
+
+ UPTIME pode ser usado como um sinônimo para STATS.
+
+OPER_HELP_OPER
+ Sintaxe: OPER ADD nick
+ OPER DEL {nick | entrada | lista-entradas}
+ OPER LIST [máscara | lista-entradas]
+ OPER CLEAR
+
+ Permite aos Root dos Services adicionar ou remover
+ nicks da lista de Operadores dos Services. O usuário que
+ tem o nick na lista de Operadores dos Services e que está
+ identificado no %s é capaz de acessar os comandos de
+ Operador dos Services.
+
+ O comando OPER ADD adiciona o nick fornecido na lista
+ de Operadores dos Services.
+
+ O comando OPER DEL remove o nick especificado da lista
+ de Operadores dos Services. Se uma lista de números de entrada
+ é fornecida, essas entradas são apagadas. (Veja o exemplo
+ para LIST abaixo.)
+
+ O comando OPER LIST mostra a lista de Operadores dos
+ Services. 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 de entrada
+ é fornecida, somente essas entradas serão mostradas;
+ por exemplo:
+
+ OPER LIST 2-5,7-9
+ Lista as entradas de Operadores dos Services numeradas
+ de 2 a 5 e de 7 a 9.
+
+ O comando OPER CLEAR limpa todas as entradas da lista
+ de Operadores dos Services.
+
+ Qualquer Operador de IRC pode usar o OPER LIST.
+
+OPER_HELP_ADMIN
+ Sintaxe: ADMIN ADD nick
+ ADMIN DEL {nick | entrada | lista-entradas}
+ ADMIN LIST [máscara | lista-entradas]
+ ADMIN CLEAR
+
+ Permite aos Service Root Administrators adicionar ou remover
+ nicks da lista de Administradores dos Services. O usuário que
+ tem o nick na lista de Administradores dos Services e que está
+ identificado no %s é capaz de acessar os comandos de
+ Administradores dos Services.
+
+ O comando ADMIN ADD adiciona o nick fornecido na lista
+ de Administradores dos Services.
+
+ O comando ADMIN DEL remove o nick especificado da lista
+ de Administradores dos Services. Se uma lista de números de
+ entrada é fornecida, essas entradas são apagadas.
+ (Veja o exemplo para LIST abaixo.)
+
+ O comando ADMIN LIST mostra a lista de Administradores
+ dos Services. 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 de entrada é fornecida,
+ somente essas entradas serão mostradas; por exemplo:
+
+ ADMIN LIST 2-5,7-9
+ Lista as entradas de Administradores dos Services numeradas
+ de 2 a 5 e de 7 a 9.
+
+ O comando ADMIN CLEAR limpa todas as entradas da lista
+ de Administradores dos Services.
+
+ Qualquer Operador de IRC pode usar o ADMIN LIST.
+ Todos os outros usos do comando são limitados aos
+ Service Root Administrators.
+
+OPER_HELP_IGNORE
+ Syntax: IGNORE {ADD|DEL|LIST|CLEAR} [time] [nick | mask]
+
+ Allows Services Admins to make Services ignore a nick or mask
+ 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.
+ When adding a mask, it should be in the format user@host
+ or nick!user@host, everything else will be considered a nick.
+ Wildcards are permitted.
+
+ Ignores will not be enforced on IRC Operators.
+
+OPER_HELP_MODE
+ Sintaxe: MODE canal modos
+
+ Permite que os Operadores dos Services ajustem os modos de
+ qualquer canal. Os parâmetros são os mesmos do comando
+ /MODE padrão.
+
+ Limitado aos Operadores dos Services.
+
+OPER_HELP_UMODE
+ Sintaxe: UMODE usuário modos
+
+ Permite aos Super Admins ajustar os
+ modos de usuário para qualquer usuário. Os parâmetros
+ são os mesmos do comando /MODE padrão.
+
+OPER_HELP_OLINE
+ Sintaxe: OLINE usuário flags
+
+ Permite aos Super Admins dar flags de Oper
+ a qualquer usuário. Flags devem ser prefixadas com "+" ou
+ "-". Para remover todas as flags apenas digite um "-" em
+ vez de usar alguma flag.
+
+OPER_HELP_CLEARMODES
+ Sintaxe: CLEARMODES canal [ALL]
+
+ Limpa todos os modos binários (i,k,l,m,n,p,s,t) e bans de um
+ canal. Se ALL é fornecido, limpa também todos os OPs e
+ voices (modos +o e +v) de um canal.
+
+ Limitado aos Operadores dos Services.
+
+OPER_HELP_KICK
+ Sintaxe: KICK canal usuário motivo
+
+ Permite IRCops kickar um usuário de um canal.
+ Os parâmetros são os mesmos do comando /KICK padrão.
+ A mensagem do kick tem o nick do IRCop que enviou o
+ comando KICK, por exemplo:
+
+ *** Spam foi kickado do canal #canal pelo %S (Operador (Flood))
+
+ Limitado aos Operadores dos Services.
+
+OPER_HELP_SVSNICK
+ Sintaxe: SVSNICK nick novo-nick
+
+ Força a mudança do nick de um usuário, de nick a novo-nick.
+ Limitado aos Super-Admins.
+
+OPER_HELP_AKILL
+ Sintaxe: AKILL ADD [+tempo] máscara motivo
+ AKILL DEL {máscara | entrada | lista-entradas}
+ AKILL LIST [máscara | lista-entradas]
+ AKILL VIEW [máscara | lista-entradas]
+ AKILL CLEAR
+
+ Permite que Operadores dos Services manipulem a lista de
+ AKILL. Se um usuário que tenta conectar possui uma máscara
+ prevista na lista de AKILL, os Services emitem um KILL para
+ aquele usuário, em servidores que suportam, e instrui todos
+ os servidores da rede a adicionar um ban (K-line) para a
+ máscara do usuário encontrado.
+
+ AKILL ADD adiciona uma máscara ident@host na lista de AKILL
+ para um dado motivo (deve ser fornecido).
+ Opcionalmente, um tempo para o akill expirar pode ser
+ fornecido. O tempo precede a máscara ident@host, e é
+ especificado como um número inteiro seguido por uma das
+ seguintes unidades: d (dias), h (horas) ou m (minutos).
+ Combinações (como 1h30m) não são permitidas. Se uma unidade
+ específica não é incluída, o padrão é em dias (assim, +30
+ significa 30 dias). Para adicionar um AKILL que não expira,
+ use +0. Se a máscara a ser adicionada começar com um +,
+ o tempo do AKILL deve ser fornecido, mesmo se esse tempo for igual
+ ao padrão. O tempo atual de expiração de AKILLs pode ser encontrado
+ com o comando STATS AKILL.
+
+ AKILL DEL remove uma dada máscara da lista de AKILL, se ela
+ estiver presente. Se uma lista de números de entrada for fornecida,
+ essas entradas serão apagadas. (Veja o exemplo para LIST abaixo.)
+
+ AKILL LIST mostra a lista de AKILL atual.
+ Se uma máscara for fornecida, apenas as entradas que combinarem
+ com a máscara serão exibidas. Se uma lista de números de entrada
+ for fornecida, apenas essas entradas serão exibidas; por exemplo:
+
+ AKILL LIST 2-5,7-9
+ Lista as entradas de AKILL numeradas de 2 a 5 e de 7 a 9.
+
+ AKILL VIEW é uma versão mais detalhada do AKILL LIST,
+ e mostrará quem adicionou o AKILL, a data em que foi adicionado,
+ e quando irá expirar, como também a máscara (ident@host) e o motivo.
+
+ AKILL CLEAR apaga todas as entradas da lista de AKILL.
+
+ Limitado aos Operadores dos Services.
+
+OPER_HELP_SGLINE
+ Sintaxe: SGLINE ADD [+tempo] máscara:motivo
+ SGLINE DEL {máscara | entrada | lista-entradas}
+ SGLINE LIST [máscara | lista-entradas]
+ SGLINE VIEW [máscara | lista-entradas]
+ SGLINE CLEAR
+
+ Permite que Operadores dos Services manipulem a lista de
+ SGLINE. Se um usuário que tenta conectar possui um realname
+ previsto na lista de SGLINE, os Services não permitirão que
+ ele continue sua sessão de IRC.
+
+ SGLINE ADD adiciona uma máscara realname na lista de SGLINE
+ para um dado motivo (deve ser fornecido).
+ Opcionalmente, um tempo pode ser fornecido. O tempo precede a
+ máscara e é especificado como um número inteiro seguido por uma das
+ seguintes unidades: d (dias), h (horas) ou m (minutos).
+ Combinações (como 1h30m) não são permitidas. Se uma unidade
+ específica não é incluída, o padrão é em dias (assim, +30
+ significa 30 dias). Para adicionar um SGLINE que não expira,
+ use +0. Se a máscara de realname a ser adicionada começar com
+ um +, o tempo do SGLINE deve ser fornecido, mesmo se esse tempo
+ for igual ao padrão. O tempo atual de expiração de SGLINE pode ser
+ encontrado com o comando STATS AKILL.
+ Nota: devido ao fato da máscara de realname poder conter espaços,
+ o separador entre ela e o motivo é um sinal de dois-pontos.
+
+ SGLINE DEL remove uma dada máscara da lista de SGLINE, se ela
+ estiver presente. Se uma lista de números de entrada for fornecida,
+ essas entradas serão apagadas. (Veja o exemplo para LIST abaixo.)
+
+ SGLINE LIST mostra a lista de SGLINE atual.
+ Se uma máscara for fornecida, apenas as entradas que combinarem
+ com a máscara serão exibidas. Se uma lista de números de entrada
+ for fornecida, apenas essas entradas serão exibidas; por exemplo:
+
+ SGLINE LIST 2-5,7-9
+ Lista as entradas de SGLINE numeradas de 2 a 5 e de 7 a 9.
+
+ SGLINE VIEW é uma versão mais detalhada do SGLINE LIST,
+ e mostrará quem adicionou o SGLINE, a data em que foi adicionado,
+ e quando irá expirar, como também a máscara realname e o motivo.
+
+ SGLINE CLEAR apaga todas as entradas da lista de SGLINE.
+
+ Limitado aos Operadores dos Services.
+
+OPER_HELP_SQLINE
+ Sintaxe: SQLINE ADD [+tempo] máscara motivo
+ SQLINE DEL {máscara | entrada | lista-entradas}
+ SQLINE LIST [máscara | lista-entradas]
+ SQLINE VIEW [máscara | lista-entradas]
+ SQLINE CLEAR
+
+ Permite que Operadores dos Services manipulem a lista de
+ SQLINE. Se um usuário que tenta conectar possui um nick
+ previsto na lista de SQLINE, os Services não permitirão que
+ ele continue sua sessão de IRC.
+
+ SQLINE ADD adiciona uma máscara na lista de SQLINE
+ para um dado motivo (deve ser fornecido).
+ Opcionalmente, um tempo pode ser fornecido. O tempo precede a
+ máscara e é especificado como um número inteiro seguido por uma das
+ seguintes unidades: d (dias), h (horas) ou m (minutos).
+ Combinações (como 1h30m) não são permitidas. Se uma unidade
+ específica não é incluída, o padrão é em dias (assim, +30
+ significa 30 dias). Para adicionar um SQLINE que não expira,
+ use +0. Se a máscara a ser adicionada começar com um +,
+ o tempo do SQLINE deve ser fornecido, mesmo se esse tempo for
+ igual ao padrão. O tempo atual de expiração de SQLINE pode ser
+ encontrado com o comando STATS AKILL.
+
+ SQLINE DEL remove uma dada máscara da lista de SQLINE, se ela
+ estiver presente. Se uma lista de números de entrada for fornecida,
+ essas entradas serão apagadas. (Veja o exemplo para LIST abaixo.)
+
+ SQLINE LIST mostra a lista de SQLINE atual.
+ Se uma máscara for fornecida, apenas as entradas que combinarem
+ com a máscara serão exibidas. Se uma lista de números de entrada
+ for fornecida, apenas essas entradas serão exibidas; por exemplo:
+
+ SQLINE LIST 2-5,7-9
+ Lista as entradas de SQLINE numeradas de 2 a 5 e de 7 a 9.
+
+ SQLINE VIEW é uma versão mais detalhada do SQLINE LIST,
+ e mostrará quem adicionou o SQLINE, a data em que foi adicionado,
+ e quando irá expirar, como também a máscara e o motivo.
+
+ SQLINE CLEAR apaga todas as entradas da lista de SQLINE.
+
+ Limitado aos Operadores dos Services.
+
+OPER_HELP_SZLINE
+ Sintaxe: SZLINE ADD [+tempo] máscara motivo
+ SZLINE DEL {máscara | entrada | lista-entradas}
+ SZLINE LIST [máscara | lista-entradas]
+ SZLINE VIEW [máscara | lista-entradas]
+ SZLINE CLEAR
+
+ Permite que Operadores dos Services manipulem a lista de
+ SZLINE. Se um usuário que tenta conectar possui um IP
+ previsto na lista de SZLINE, os Services não permitirão que
+ ele continue sua sessão de IRC (e isso, mesmo se o IP possuir
+ ou não um PTR RR).
+
+ SZLINE ADD adiciona uma máscara de IP na lista de SZLINE
+ para um dado motivo (deve ser fornecido).
+ Opcionalmente, um tempo pode ser fornecido. O tempo precede a
+ máscara e é especificado como um número inteiro seguido por uma das
+ seguintes unidades: d (dias), h (horas) ou m (minutos).
+ Combinações (como 1h30m) não são permitidas. Se uma unidade
+ específica não é incluída, o padrão é em dias (assim, +30
+ significa 30 dias). Para adicionar um SZLINE que não expira,
+ use +0. Se a máscara a ser adicionada começar com um +,
+ o tempo do SZLINE deve ser fornecido, mesmo se esse tempo for
+ igual ao padrão. O tempo atual de expiração de SZLINE pode ser
+ encontrado com o comando STATS AKILL.
+
+ SZLINE DEL remove uma dada máscara da lista de SZLINE, se ela
+ estiver presente. Se uma lista de números de entrada for fornecida,
+ essas entradas serão apagadas. (Veja o exemplo para LIST abaixo.)
+
+ SZLINE LIST mostra a lista de SZLINE atual.
+ Se uma máscara for fornecida, apenas as entradas que combinarem
+ com a máscara serão exibidas. Se uma lista de números de entrada
+ for fornecida, apenas essas entradas serão exibidas; por exemplo:
+
+ SZLINE LIST 2-5,7-9
+ Lista as entradas de SZLINE numeradas de 2 a 5 e de 7 a 9.
+
+ SZLINE VIEW é uma versão mais detalhada do SZLINE LIST,
+ e mostrará quem adicionou o SZLINE, a data em que foi adicionado,
+ e quando irá expirar, como também a máscara IP e o motivo.
+
+ SZLINE CLEAR apaga todas as entradas da lista de SZLINE.
+
+ Limitado aos Operadores dos Services.
+
+OPER_HELP_SET
+ Sintaxe: SET opção seleção
+
+ Ajusta várias opções globais dos Services. Os nomes de opção
+ atualmente definidas são:
+ READONLY Ativa o modo read-only ou read-write
+ LOGCHAN Ativa ou desativa envio de log a um canal
+ DEBUG Ativa ou desativa o modo de depuração (debug)
+ NOEXPIRE Ativa ou desativa o modo não-expira
+ SUPERADMIN Ativa ou desativa o modo Super-Admin
+ SQL Ativa ou desativa o modo SQL
+ IGNORE Ativa ou desativa o modo Ignore
+ LIST Lista as opções atuais
+
+ Limitado aos Administradores dos Services.
+
+OPER_HELP_SET_READONLY
+ Sintaxe: SET READONLY {ON | OFF}
+
+ Ativa ou desativa o modo read-only (somente leitura).
+ No modo read-only, usuários normais não serão capazes de
+ modificar nenhum dado nos Services, incluindo lista de acesso
+ de canais e nicks etc. IRCops com privilégios suficientes
+ nos Services serão capazes de modificar a lista de AKILL
+ e de proibir ou cancelar o registro de canais ou nicks,
+ embora quaisquer mudanças não serão salvas no banco de
+ dados a menos que o modo read-only seja desativado antes
+ dos Services serem terminados ou reiniciados.
+
+ Esta opção é equivalente à opção da linha de comando
+ -readonly.
+
+OPER_HELP_SET_LOGCHAN
+ Sintaxe: SET LOGCHAN {ON | OFF}
+
+ Com esta opção ativada, os Services enviarão seus logs
+ para um canal especificado. LogChannel deve estar definido
+ na configuração dos Services para esta opção poder ser usada.
+
+ This option is equivalent to the command-line option -logchan.
+
+ Nota: Pode haver graves implicações de segurança se o canal
+ de log não estive devidamente seguro.
+
+OPER_HELP_SET_DEBUG
+ Sintaxe: SET DEBUG {ON | OFF | número}
+
+ Ativa ou desativa o modo de depuração (debug). No modo de
+ depuração, todos os dados enviados para os Services e vindos
+ deles, assim como um número de outras mensagens de depuração
+ são enviadas a um arquivo de log. Se número é fornecido,
+ o modo de depuração é ativado, com nível de depuração ajustado
+ para número.
+
+ Esta opção é equivalente à opção 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 exceções não irão expirar enquanto a
+ opção não for desativada.
+
+ Esta opção é equivalente à opção da linha de comando
+ -noexpire.
+
+OPER_HELP_SET_SUPERADMIN
+ Sintaxe: SET SUPERADMIN {ON | OFF}
+
+ Ativando esta opção, lhe serão concedidos privilégios extras como a
+ habilidade de ser "founder" em todos os canais etc.
+
+ Esta opção não é permanente, e deve ser usada somente quando
+ necessária, e desativada quando não for mais necessária.
+
+OPER_HELP_SET_SQL
+ Sintaxe: SET SQL {ON | OFF}
+
+ Ajustando esta opção, fará os Services usarem ou não SQL. Isso deve
+ ser usado para ativar ou desativar SQL caso seu servidor SQL caia
+ enquanto os Services estiverem rodando.
+
+OPER_HELP_SET_IGNORE
+ Sintaxe: SET IGNORE {ON | OFF}
+
+ Ajustando esta opção, fará os Services usarem ou não o sistema
+ de IGNORE.
+
+OPER_HELP_SET_LIST
+ Sintaxe: SET LIST
+
+ Exibe as várias configurações do %S.
+
+OPER_HELP_NOOP
+ Sintaxe: NOOP SET servidor
+ NOOP REVOKE servidor
+
+ NOOP SET remove todas as O:lines do servidor
+ especificado e killa todos os IRCops atualmente nele
+ para prevenir que eles dêem rehash no servidor (pois
+ isto simplesmente cancela o efeito).
+
+ NOOP REVOKE torna todas as O:lines removidas
+ novamente disponíveis no servidor especificado.
+
+ Nota: O servidor não é checado como um todo
+ pelos Services.
+
+ Limitado aos Administradores dos Services.
+
+OPER_HELP_JUPE
+ Sintaxe: JUPE servidor [motivo]
+
+ Diz aos Services para "jupar" um servidor -- isto é, 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 SQUIT padrão. Se um motivo
+ é dado, ele é colocado no campo de informação do servidor;
+ caso contrário, o campo de informação do servidor irá conter
+ o texto "Jupado por <nick>", mostrando o nick de quem mascarou
+ o servidor.
+
+ Limitado aos Administradores dos Services.
+
+OPER_HELP_RAW
+ Sintaxe: RAW texto
+
+ Envia uma série de texto diretamente ao servidor onde os
+ Services estão conectados. Este comando tem várias
+ limitações de uso, e pode criar destruição e problemas na
+ rede se for usado inadequadamente. NÃO USE ESTE COMANDO
+ a menos que você tenha absoluta certeza do que está fazendo!
+
+ Limitado aos Administradores dos Services.
+
+OPER_HELP_UPDATE
+ Sintaxe: UPDATE
+
+ Faz com que os Services atualizem o banco de dados logo que
+ você envia este comando.
+
+ Limitado aos Administradores dos Services.
+
+OPER_HELP_RELOAD
+ Sintaxe: RELOAD
+
+ Faz com que os Services recarreguem seu arquivo de configuração.
+ Repare que, para algumas mudanças terem efeito, será necessário
+ que os Services sejam reiniciados.
+
+ Limitado aos Administradores dos Services.
+
+OPER_HELP_QUIT
+ Sintaxe: QUIT
+
+ Faz com que desligue os Services imediatamente; o banco de
+ dados não é salvo. Este comando não deve ser usado a menos
+ que haja um dano da cópia do banco de dados na memória e por
+ isso eles não devam 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 executável).
+
+ 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.
+
+ Se um padrão é fornecido, listará apenas canais que combinem com
+ ele. Se um nick é fornecido, listará apenas canais que o usuário
+ estiver usando. Se SECRET é especificado, listará apenas canais
+ combinando com o padrão e que tenham modo +s ou +p.
+
+ Limitado aos Administradores dos Services.
+
+OPER_HELP_USERLIST
+ Sintaxe: USERLIST [{padrão | canal} [INVISIBLE]]
+
+ Lista todos os usuários online na Rede, tenham eles nicks
+ registrados ou não.
+
+ Se um padrão é fornecido, listará apenas usuários que combinem
+ com ele (deve estar no formato nick!ident@host). Se um canal é
+ fornecido, listará apenas usuários que estão no canal dado.
+ estiver usando. Se INVISIBLE é especificado, listará apenas usuários
+ que tenham o modo +i.
+
+ Limitado aos Administradores dos Services.
+
+OPER_HELP_MODLOAD
+ Sintaxe: MODLOAD NomeDoArquivo
+
+ Este comando carrega o módulo chamado NomeDoArquivo
+ do diretório de módulos.
+
+ Limitado aos Service Root Administrators.
+
+OPER_HELP_MODUNLOAD
+ Sintaxe: MODUNLOAD NomeDoArquivo
+
+ Este comando descarrega o módulo chamado NomeDoArquivo
+ do diretório de módulos.
+
+ Limitado aos Service Root Administrators.
+
+OPER_HELP_MODINFO
+ Sintaxe: MODINFO NomeDoArquivo
+
+ Este comando lista informações sobre um módulo carregado.
+
+ Limitado aos Service Root Administrators.
+
+OPER_HELP_MODLIST
+ Sintaxe: MODLIST [Core|3rd|protocol|encryption|supported|qatested]
+
+ Lista todos os módulos atualmente carregados.
+
+ Limitado aos Service Root Administrators.
+
+
+###########################################################################
+#
+# BotServ help messages
+#
+###########################################################################
+BOT_HELP_CMD_BOTLIST
+ BOTLIST Lista os bots disponíveis
+BOT_HELP_CMD_ASSIGN
+ ASSIGN Associa um bot ao canal
+BOT_HELP_CMD_SET
+ SET Configura as opções do bot
+BOT_HELP_CMD_KICK
+ KICK Configura os kickers
+BOT_HELP_CMD_BADWORDS
+ BADWORDS Configura os palavrões
+BOT_HELP_CMD_ACT
+ ACT Faz com que o bot faça o mesmo que o comando "/me"
+BOT_HELP_CMD_INFO
+ INFO Permite que você veja informações do BotServ sobre um canal ou bot
+BOT_HELP_CMD_SAY
+ SAY Faz com que o bot diga determinado texto no canal dado
+BOT_HELP_CMD_UNASSIGN
+ UNASSIGN Desassocia um bot de um canal
+BOT_HELP_CMD_BOT
+ BOT Mantém a lista de bots da Rede
+
+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
+ aos usuários terem um bot. Os comandos disponíveis
+ estão listados abaixo; para usá-los, digite
+ %R%S comando. Para informações mais específicas
+ sobre um comando, digite %R%S HELP comando.
+
+BOT_HELP_FOOTER
+ 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
+
+ Associa um bot escolhido pelo nick 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á mantida
+ a configuração do bot para aquele canal, para que você possa
+ sempre poder associá-lo àquele canal mais tarde sem ter que
+ configurar tudo novamente.
+
+BOT_HELP_INFO
+ Sintaxe: INFO {canal | nick}
+
+ Permite que você veja 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 de canais onde ele está.
+
+BOT_HELP_SET
+ Sintaxe: SET canal opção parâmetros
+
+ Configura as opções do bot. A 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 %R%S HELP SET opção para maiores informações
+ sobre uma opção específica.
+
+ Aviso: o acesso a este comando é controlado pelo ajuste
+ dos níveis de acesso do canal.
+
+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,
+ mesmo se eles não se enquadram no nível de NOKICK.
+
+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,
+ mesmo se eles não se enquadram no nível de NOKICK.
+
+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. Em algumas
+ redes, mais comandos podem estar disponíveis, tais
+ como: !owner, !deowner, !protect, !deprotect,
+ !halfop, !dehalfop.
+
+ Note que os usuários que quiserem usar esses
+ comandos DEVEM ter um nível suficiente tanto para
+ o nível FANTASIA quanto para outro, 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
+ entrada dos usuários quando eles entrarem no
+ canal, caso tenham nível de acesso suficiente.
+
+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. A opção pode ser uma dessas:
+
+ BOLDS Selecione para o bot kickar por negrito
+ BADWORDS Selecione para o bot kickar por palavrões
+ CAPS Selecione para o bot kickar por caps
+ COLORS Selecione para o bot kickar por cores
+ FLOOD Selecione para o bot kickar por flood
+ REPEAT Selecione para o bot kickar por repetição
+ REVERSES Selecione para o bot kickar por reversos
+ UNDERLINES Selecione para o bot kickar por sublinhado
+
+ Digite %R%S HELP KICK opção para maiores informações
+ sobre uma opção específica.
+
+ Nota: o acesso a esse comando é controlado pelo ajuste
+ dos níveis de acesso do canal.
+
+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. Não forneça ttb para desabilitar
+ o sistema de ban que foi uma vez ativado.
+
+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. Não forneça ttb para desabilitar
+ o sistema de ban que foi uma vez ativado.
+
+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. Não forneça ttb para desabilitar
+ o sistema de ban que foi uma vez ativado.
+
+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. Não forneça ttb para desabilitar
+ o sistema de ban que foi uma vez ativado.
+
+BOT_HELP_KICK_CAPS
+ Sintaxe: KICK canal CAPS {ON|OFF} [ttb [mínimo [porcentagem]]]
+
+ Ativa ou desativa o kick por caps. Quando ativado
+ o bot irá kickar os usuários que usarem CAPS (maiúsculas).
+
+ O bot irá kickar apenas se usarem pelo menos um mínimo de
+ caps e eles constituírem pelo menos porcentagem%% 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. Não forneça ttb para desabilitar
+ o sistema de ban que foi uma vez ativado.
+
+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. Não forneça ttb para desabilitar
+ o sistema de ban que foi uma vez ativado.
+
+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 fizerem repetições (onde
+ núm é o número de repetições para kick; se não for fornecido,
+ o padrão é 3).
+
+ ttb é o número de vezes que o usuário será kickado
+ antes de ser banido. Não forneça ttb para desabilitar
+ o sistema de ban que foi uma vez ativado.
+
+BOT_HELP_KICK_BADWORDS
+ Sintaxe: KICK canal BADWORDS {ON|OFF} [ttb]
+
+ Ativa ou desativa o kick por palavrões. Quando ativado
+ o bot irá kickar usuários que disserem determinadas
+ palavras no canal.
+
+ Você pode definir os palavrões para um canal usando o
+ comando BADWORDS. Digite %R%S HELP BADWORDS para
+ maiores informações.
+
+ ttb é o número de vezes que o usuário será kickado
+ antes de ser banido. Não forneça ttb para desabilitar
+ o sistema de ban que foi uma vez ativado.
+
+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 palavras que deverão
+ ser motivo de kick em um canal quando a opção BADWORDS
+ estiver ativada. Para maiores informações, digite
+ %R%S HELP KICK BADWORDS.
+
+ O comando BADWORDS ADD adiciona a palavra na lista
+ de palavrões. A opção SINGLE, quando especificada, só
+ kicka o usuário se ele escrever a palavra inteira.
+ A opção START, quando especificada, irá kickar o usuário
+ que escrever uma palavra que comece com a palavra.
+ A opção END se tiver sido especificada 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. Se uma lista de números
+ de entrada for fornecida, essas entradas serão apagadas
+ (veja o exemplo para LIST abaixo).
+
+ O comando BADWORDS LIST mostra a lista de palavrões.
+ Se forem usados coringas, 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 de 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 canal dado.
+
+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_BOT
+ Sintaxe: BOT ADD nick user host real
+ BOT CHANGE NickAntigo NickNovo [user [host [real]]]
+ BOT DEL nick
+
+ 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.
+
+ Nota: você não pode criar um bot que use um nick que já
+ seja registrado. Se um usuário não registrado está atualmente
+ usando o nick, ele 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
+ PRIVATE Previne um bot de ser associado por
+ quem não é Operador de IRC.
+
+BOT_SERVADMIN_HELP_SET_NOBOT
+ Sintaxe: SET canal NOBOT {ON|OFF}
+
+ Este comando faz com que um determinado bot não possa ser
+ associado a um canal. 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
+ Sintaxe: SET nick PRIVATE {ON|OFF}
+
+ Esta opção previne um bot de ser associado a um canal
+ por usuários que não sejam Operadores de IRC.
+
+ Limitado aos Administradores dos Services.
+
+###########################################################################
+#
+# HostServ messages
+#
+###########################################################################
+HOST_EMPTY
+ A lista de vHost está limpa.
+HOST_ENTRY
+ #%d Nick:%s, vHost:%s (%s - %s)
+HOST_IDENT_ENTRY
+ #%d Nick:%s, vHost:%s@%s (%s - %s)
+HOST_SET
+ vhost de %s ajustado para %s.
+HOST_IDENT_SET
+ vhost de %s ajustado para %s@%s.
+HOST_SETALL
+ vhost do grupo %s ajustado para %s.
+HOST_DELALL
+ vhosts do grupo %s foi removido.
+HOST_DELALL_SYNTAX
+ Sintaxe: DELALL <nick>.
+HOST_IDENT_SETALL
+ vhost do grupo %s ajustado para %s@%s.
+HOST_SET_ERROR
+ Erro! Um vhost pode conter apenas A-Z, a-z, 0-9, '.' e '-'.
+HOST_SET_IDENT_ERROR
+ O Ident de um vhost deve estar no formato de um Ident válido.
+HOST_SET_TOOLONG
+ Erro! O host é muito comprido, por favor use um host de até %d caracteres.
+HOST_SET_IDENTTOOLONG
+ Erro! O Ident é muito comprido, por favor use um Ident de até %d caracteres.
+HOST_NOREG
+ Usuário %s não encontrado na DB do NickServ.
+HOST_SET_SYNTAX
+ Sintaxe: %R%s set <nick> <hostmask>.
+HOST_SETALL_SYNTAX
+ Sintaxe: %R%s setall <nick> <hostmask>.
+HOST_DENIED
+ Acesso Negado.
+HOST_NOT_ASSIGNED
+ Por favor contacte algum Operator para receber um vhost associado a este nick.
+HOST_ACTIVATED
+ Seu vhost %s está agora ativado.
+HOST_IDENT_ACTIVATED
+ Seu vhost %s@%s está agora ativado.
+HOST_ID
+ Por favor, identifique-se aos Services primeiro.
+HOST_NOT_REGED
+ Primeiro você precisa registrar seu nick senão um vhost não pode ser associado a você.
+HOST_DEL
+ vhost para %s removido.
+HOST_DEL_SYNTAX
+ Sintaxe: %R%s del <nick>.
+HOST_OFF_UNREAL
+ Seu vhost foi removido. Para reabilitar a encriptação padrão de host, digite /mode %s +%s
+HOST_NO_VIDENT
+ Seu IRCD não suporta vIdent's, se isto não está certo, por favor reporte isso como um possível bug.
+HOST_GROUP
+ Todos os vhost's no grupo %s foram ajustados para %s
+HOST_IDENT_GROUP
+ Todos os vhost's no grupo %s foram ajustados para %s@%s
+HOST_LIST_FOOTER
+ Exibidos todos os registros (Contador: %d)
+HOST_LIST_RANGE_FOOTER
+ Exibidos registros de %d até %d
+HOST_LIST_KEY_FOOTER
+ Exibidos registros coincidindo com a chave %s (Contador: %d)
+
+###########################################################################
+#
+# HostServ Help messages
+#
+###########################################################################
+HOST_HELP_CMD_ON
+ ON Ativa seu vHost associado
+HOST_HELP_CMD_OFF
+ OFF Desativa seu vHost associado
+HOST_HELP_CMD_GROUP
+ GROUP Sincroniza um mesmo vHost para todos os nicks de um grupo
+HOST_HELP_CMD_SET
+ SET Ajusta o vHost de outro usuário
+HOST_HELP_CMD_SETALL
+ SETALL Ajusta o vHost de todos os nicks de um grupo
+HOST_HELP_CMD_DEL
+ DEL Deleta o vHost de outro usuário
+HOST_HELP_CMD_DELALL
+ DELALL Deleta o vHost de todos os nicks de um grupo
+HOST_HELP_CMD_LIST
+ LIST Exibe uma ou mais entradas de vHost
+
+HOST_OPER_HELP
+ not used.
+
+HOST_ADMIN_HELP
+ not used.
+
+HOST_HELP
+ Comandos do %S:
+
+HOST_HELP_ON
+ Sintaxe: ON
+
+ Ativa o vhost atualmente associado ao nick em uso.
+ Quando você usa este comando, qualquer usuário que faça um /whois
+ em você irá ver o vhost em vez do seu endereço IP real/encriptado.
+
+HOST_HELP_SET
+ Sintaxe: SET <nick> <hostmask>.
+
+ Ajusta o vhost para o nick dado com a hostmask fornecida.
+ Caso seu IRCd suporte vIdents, então usando
+ SET <nick> <ident>@<hostmask> ajustará idents para
+ usuários, assim como vhosts.
+
+ Limitado a Host Setters/Operadores dos Services.
+
+HOST_HELP_DELALL
+ Sintaxe: DELALL <nick>.
+
+ Deleta o vhost para todos os nicks no mesmo grupo do
+ nick fornecido.
+
+ Limitado a Host Removers/Operadores dos Servicess.
+
+HOST_HELP_SETALL
+ Sintaxe: SETALL <nick> <hostmask>.
+
+ Ajusta o vhost para todos os nicks no mesmo grupo do
+ nick fornecido. Caso seu IRCd suporte vIdents, então
+ usando SETALL <nick> <ident>@<hostmask> ajustará idents
+ para usuários, assim como vhosts.
+
+ * NOTA: isto não irá atualizar o vhost de nenhum nick
+ adicionado ao grupo depois que o comando foi usado.
+
+ Limitado a Host Setters/Operadores dos Services.
+
+HOST_HELP_OFF
+ Sintaxe: OFF
+
+ Desativa o vhost atualmente associado ao nick em uso.
+ Quando você usa este comando, qualquer usuário que faça um /whois
+ em você irá ver seu endereço IP real/encriptado.
+
+HOST_HELP_DEL
+ Sintaxe: DEL <nick>
+
+ Deleta o vhost associado ao nick dado.
+
+ Limitado a Host Removers/Operadores dos Services.
+
+HOST_HELP_LIST
+ Sintaxe: LIST [<key>|<#X-Y>]
+
+ Este comando lista ao Operador os vhosts registrados.
+ Se uma Key é especificada, apenas entradas cujo nick ou vhost
+ combinem com o padrão fornecido em <key> serão exibidas.
+ Ex.: Rob* mostra todas as entradas começando com "Rob"
+
+ Se o estilo #X-Y for usado, apenas entradas entre o alvo X
+ e Y serão exibidas. Ex.: #1-3 irá mostrar as 3 primeiras
+ entradas de nick/vhost.
+
+ A lista usa o valor de NSListMax como limite do número de
+ itens para exibir a um Operator de uma vez só.
+
+ Limitado aos Operadores dos Services.
+
+HOST_HELP_GROUP
+ Sintaxe: GROUP
+
+ Este comando permite aos usuários ajustar o vhost do seu
+ nick ATUAL para ser o vhost de todos os nicks no mesmo grupo.
+
+OPER_SVSNICK_UNSUPPORTED
+ Desculpe, SVSNICK não está disponível nesta rede.
+
+OPER_SQLINE_UNSUPPORTED
+ Desculpe, SQLINE não está disponível nesta rede.
+
+OPER_SVSO_UNSUPPORTED
+ Desculpe, OLINE não está disponível nesta rede.
+
+OPER_UMODE_UNSUPPORTED
+ Desculpe, UMODE não está disponível nesta rede.
+
+OPER_SUPER_ADMIN_NOT_ENABLED
+ Opção SuperAdmin não habilitada no arquivo services.conf
+
diff --git a/lang/ru.l b/lang/ru.l
new file mode 100644
index 000000000..2367c3b12
--- /dev/null
+++ b/lang/ru.l
@@ -0,0 +1,6807 @@
+# Russian language file for Anope
+#
+# (C) 2003-2008 Anope Team
+# Contact us at info@anope.org
+#
+# Please read COPYING and README for further details.
+#
+# Based on the original code of Epona by Lara.
+# Based on the original code of Services by Andy Church.
+#
+# Translated by Kein <kein-of@yandex.ru>
+#
+# Translated: 17.10.2008
+# Revision: 18
+# Charaster set: 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 us know
+# (dev@anope.org) 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
+# services.conf). 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 = äåíü íåäåëè (ñîêð.) %H = ÷àñû
+# %b = ìåñÿö (ñîêð.) %M = ìèíóòû
+# %d = ÷èñëî %S = ñåêóíäû
+# %Y = ãîä %Z = âðåìåííàÿ çîíà
+
+# 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. Ñïèñîê êîìàíä äîñòóïåí ïî %R%s HELP
+SYNTAX_ERROR
+ Ñèíòàêñèñ: %s
+MORE_INFO
+ %R%s HELP %s äëÿ áîëåå ïîäðîáíîé èíôîðìàöèè.
+NO_HELP_AVAILABLE
+ Ñïðàâî÷íàÿ èíôîðìàöèÿ ïî %s îòñóòñòâóåò.
+OBSOLETE_COMMAND
+ Äàííàÿ êîìàíäà óñòàðåëà, âìåñòî íåå èñïîëüçóéòå %s
+
+BAD_USERHOST_MASK
+ Ìàñêà äîëæíà áûòü ñòðîãî â ôîðìàòå èäåíò@õîñò.
+BAD_EXPIRY_TIME
+ Óêàçàíî íåâåðíîå çíà÷åíèå ñðîêà èñòå÷åíèÿ.
+USERHOST_MASK_TOO_WIDE
+ Ãðàíèöû ìàñêè %s ñëèøêîì øèðîêè, ïîæàëóéñòà, óòî÷íèòå ìàñêó.
+
+SERVICE_OFFLINE
+ %s íà äàííûé ìîìåíò íåàêòèâåí (skeleton-ðåæèì).
+READ_ONLY_MODE
+ Ïðèìå÷àíèå: ñåé÷àñ ñåðâèñû ðàáîòàþò â ðåæèìå read-only (òîëüêî-÷òåíèå), íèêàêèå èçìåíåíèÿ ñîõðàíåíû ÍÅ áóäóò!
+PASSWORD_INCORRECT
+ Âû óêàçàëè íåâåðíûé ïàðîëü.
+INVALID_TARGET
+ Àäðåñàöèÿ âèäà "/msg %s" áîëüøå íå ïîääåðæèâàåòñÿ. Èñïîëüçóéòå "/msg %s@%s" èëè "/%s".
+
+# 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_TOO_LONG
+ Âû óêàçàëè ñëèøêîì äëèííûé ïàðîëü, ïîïðîáóéòå åùå ðàç ñ áîëåå êîðîòêèì.
+
+NICK_NOT_REGISTERED
+ Âàø íèê íåçàðåãèñòðèðîâàí.
+NICK_NOT_REGISTERED_HELP
+ Âàø íèê íåçàðåãèñòðèðîâàí. Äëÿ áîëåå ïîäðîáíîé èíôðìàöèè î ðåãèñòðàöèè íèêà ñì. %R%s HELP
+NICK_X_IS_SERVICES
+ Íèê %s ÿâëÿåòñÿ íèêîì îäíîãî èç ñåðâèñíûõ ïñåâäîêëèåíòîâ äàííîé ñåòè.
+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 ñèìâîëîâ.
+NICK_X_SUSPENDED
+ Íèê %s íàõîäèòñÿ â ðåæèìå ñàñïåíäà.
+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
+ Äëÿ âûïîëíåíèÿ äàííîé êîìàíäû âû äîëæíû èäåíòèôèöèðîâàòüñÿ.
+ Ïîïðîáóéòå ñíîâà ïîñëå òîãî, êàê èñïîëüçóåòå êîìàíäó %R%s IDENTIFY ïàðîëü.
+CHAN_IDENTIFY_REQUIRED
+ Äëÿ âûïîëíåíèÿ äàííîé êîìàíäû âû äîëæíû èäåíòèôèöèðîâàòüñÿ.
+ Ïîïðîáóéòå ñíîâà ïîñëå òîãî, êàê èñïîëüçóåòå êîìàíäó %R%s IDENTIFY %s ïàðîëü.
+
+MAIL_DISABLED
+ Íàñòðîéêè mail-ôóíêöèé ñåðâèñîâ íåêîððåêòíû èëè îòêëþ÷åíû, âîçìîæíîñòü îòïðàâêè email íåäîñòóïíà.
+MAIL_INVALID
+ Email-àäðåñ äëÿ %s íåêîððåêòåí.
+MAIL_X_INVALID
+ Email-àäðåñ âèäà %s íå ÿâëÿåòñÿ ïðàâèëüíûì ýëåêòðîííîé ïî÷òû.
+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.
+
+# Generic List error messages
+LIST_INCORRECT_RANGE
+ Çàäàí íåâåðíûé äèàïàçîí. Ñèíòàêñèñ: #îòêóäà-äîêóäà.
+CS_LIST_INCORRECT_RANGE
+ ×òî áû íàéòè êàíàë, íà÷èíàþùèéñÿ ñ ñèìâîëà #, ïðîñòî óêàæèòå åãî
+ íàçâàíèå áåç #. Íàïðèìåð anope âìåñòî #anope.
+
+# Generic help limited to messages
+HELP_LIMIT_SERV_OPER
+
+ Äëÿ èñïîëüçîâàíèÿ ýòîé êîìàíäû íåîáõîäèìû ïðàâà Îïåðàòîðà ñåðâèñîâ.
+HELP_LIMIT_SERV_ADMIN
+
+ Äëÿ èñïîëüçîâàíèÿ ýòîé êîìàíäû íåîáõîäèìû ïðàâà Àäìèíèñòðàòîðà ñåðâèñîâ.
+HELP_LIMIT_SERV_ROOT
+
+ Äëÿ èñïîëüçîâàíèÿ ýòîé êîìàíäû íåîáõîäèìû ïðàâà Ðóòà ñåðâèñîâ.
+HELP_LIMIT_IRC_OPER
+
+ Äëÿ èñïîëüçîâàíèÿ ýòîé êîìàíäû íåîáõîäèìû ïðàâà IRC-îïåðàòîðà.
+HELP_LIMIT_HOST_SETTER
+
+ Äëÿ èñïîëüçîâàíèÿ ýòîé êîìàíäû íåîáõîäèìû ïðàâà Îïåðàòîðà õîñòîâ.
+HELP_LIMIT_HOST_REMOVER
+
+ Äëÿ èñïîëüçîâàíèÿ ýòîé êîìàíäû íåîáõîäèìû ïðàâà Îïåðàòîðà õîñòîâ.
+
+###########################################################################
+#
+# NickServ messages
+#
+###########################################################################
+
+# Automatic messages
+NICK_IS_REGISTERED
+ Íèê, êîòîðûé âû ñåé÷àñ èñïîëüçóåòå, çàðåãèñòðèðîâàí íà ñåðâèñàõ ñåòè.
+ Åñëè ýòî âàø íèê, èäåíòèôèöèðóéòåñü êîìàíäîé %R%s IDENTIFY ïàðîëü
+  ïðîòèâíîì ñëó÷àå - âûáåðèòå äðóãîé íèê.
+NICK_IS_SECURE
+ Íèê, êîòîðûé âû ñåé÷àñ èñïîëüçóåòå, çàðåãèñòðèðîâàí è çàùèùåí.
+ Åñëè ýòî âàø íèê, èäåíòèôèöèðóéòåñü êîìàíäîé %R%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 ñåêóíä ïåðåä ïîâòîðíûì èñïîëüçîâàíèåì êîìàíäû REGISTER.
+NICK_CANNOT_BE_REGISTERED
+ Íèê %s íå ìîæåò áûòü çàðåãèñòðèðîâàí.
+NICK_ALREADY_REGISTERED
+ Íèê %s óæå çàðåãèñòðèðîâàí!
+NICK_REGISTERED
+ Íèê %s óñïåøíî çàðåãèñòðèðîâàí, â ACCESS-ñïèñîê äîáàâëåíà õîñòìàñêà: %s
+NICK_REGISTERED_NO_MASK
+ Íèê %s óñïåøíî çàðåãèñòðèðîâàí.
+NICK_PASSWORD_IS
+ Ïàðîëü äëÿ âàøåãî íèêà - %s - çàïîìíèòå åãî, îí ïðèãîäèòñÿ âàì â äàëüíåéøåì!
+NICK_REG_DELAY
+ ×òîáû íà÷àòü ðåãèñòðàöèþ âàøåãî òåêóùåãî íèêà, âû äîëæíû èñïîëüçîâàòü åãî íå ìåíåå %d ñåêóíä
+
+# GROUP responses
+NICK_GROUP_SYNTAX
+ GROUP ãëàâíûé_íèê ïàðîëü
+NICK_GROUP_DISABLED
+ Èçâèíèòå, íî âîçìîæíîñòü ãðóïïèðîâêè íèêîâ âðåìåííî íåäîñòóïíà.
+NICK_GROUP_FAILED
+ Èçâèíèòå, íî ñãðóïïèðîâàòü íèêè íå óäàëîñü.
+NICK_GROUP_PLEASE_WAIT
+ Ïîäîæäèòå %d ñåêóíä ïåðåä ïîâòîðíûì èñïîëüçîâàíèåì êîìàíäû GROUP.
+NICK_GROUP_CHANGE_DISABLED
+ Ïåðåä âíåñåíèåì íèêà â ãðóïïó, âû äîëæíû óäàëèòü åãî êîìàíäîé %R%s DROP.
+NICK_GROUP_SAME
+ Âû óæå ñîñòîèòå â ãðóïïå %s.
+NICK_GROUP_TOO_MANY
+ Ñëèøêîì ìíîãî íèêîâ â ãðóïïå %s. Ïðîâåðüòå ñïèñîê è óäàëèòå íåíóæíûå.
+ Äëÿ áîëåå ïîäðîáíîé èíôîðìàöèè ñì. %R%s HELP GLIST è %R%s HELP DROP
+NICK_GROUP_JOINED
+ Âû óñïåøíî âíåñåíû â ãðóïïó %s.
+
+# IDENTIFY responses
+NICK_IDENTIFY_SYNTAX
+ IDENTIFY ïàðîëü
+NICK_IDENTIFY_FAILED
+ Èçâèíèòå, íî èäåíòèôèöèðîâàòü íèê íå óäàëîñü.
+NICK_IDENTIFY_SUCCEEDED
+ Ïàðîëü ïðèíÿò - âû ïðèçíàíû êàê âëàäåëåö íèêà.
+NICK_IDENTIFY_EMAIL_REQUIRED
+ Ñíà÷àëà âû äîëæíû óñòàíîâèòü email-àäðåñ äëÿ âàøåãî íèêà. Ðåàëüíûé email-àäðåñ
+ ïîçâîëèò âàì èñïîëüçîâàòü ôóíêöèþ âîññòàíîâëåíèÿ ïàðîëÿ, åñëè âû åãî çàáóäåòå.
+NICK_IDENTIFY_EMAIL_HOWTO
+ Èñïîëüçóéòå êîìàíäó %R%S SET EMAIL email-àäðåñ ÷òîáû óñòàíîâèòü email-àäðåñ.
+ Íå âîëíóéòåñü, äàííûé email-àäðåñ çíàòü áóäåòå ëèøü âû è Àäìèíèñòðàöèÿ ñåòè.
+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 îïöèÿ ïàðàìåòðû
+NICK_SET_SERVADMIN_SYNTAX
+ SET [íèê] îïöèÿ ïàðàìåòðû
+NICK_SET_DISABLED
+ Èçâèíèòå, íî âîçìîæíîñòü íàñòðîéêè îïöèé íèêà âðåìåííî íåäîñòóïíà.
+NICK_SET_UNKNOWN_OPTION
+ Íåèçâåñòíàÿ 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 íå ñóùåñòâóåò. Ñïèñîê äîñòóïíûõ ÿçûêîâ: %R%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
+ Email-àäðåñ äëÿ âàøåãî íèêà èçìåíåí íà: %s.
+NICK_SET_EMAIL_UNSET
+ Email-àäðåñ äëÿ âàøåãî íèêà óäàëåí.
+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 íå ÿâëÿåòñÿ ïðàâèëüíûì ICQ-íîìåðîì.
+
+# 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
+ Çàùèòà íèêà àêòèâèðîâàíà, ëèìèò âðåìåíè íà ââîä ïàðîëÿ: 60 ñåêóíä.
+NICK_SET_KILL_QUICK
+ Çàùèòà íèêà àêòèâèðîâàíà, ëèìèò âðåìåíè íà ââîä ïàðîëÿ: 20 ñåêóíä.
+NICK_SET_KILL_IMMED
+ Çàùèòà íèêà àêòèâèðîâàíà, ëèìèò âðåìåíè íà ââîä ïàðîëÿ: 0 ñåêóíä.
+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
+ Òåïåðü âàøà ìàñêà âèäà èäåíò@õîñò áóäåò ñêðûòà èç èíôîðìàöèè ïî %s INFO
+NICK_SET_HIDE_MASK_OFF
+ Òåïåðü âàøà ìàñêà âèäà èäåíò@õîñò áóäåò ïîêàçûâàòüñÿ â èíôîðìàöèè ïî %s INFO
+NICK_SET_HIDE_QUIT_ON
+ Ñ ýòîãî ìîìåíòà, âàøå ïîñëåäíåå quit-ñîîáùåíèå áóäåò ñêðûòî èç èíôîðìàöèè ïî %s INFO
+NICK_SET_HIDE_QUIT_OFF
+ Òåïåðü âàøå ïîñëåäíåå quit-ñîîáùåíèå áóäåò ïîêàçûâàòüñÿ â èíôîðìàöèè ïî %s INFO
+NICK_SET_HIDE_STATUS_ON
+ Ñ ýòîãî ìîìåíòà, âàø óðîâåíü äîñòóïà ê ñåðâèñàì áóäåò ñêðûò èç èíôîðìàöèè ïî %s INFO
+NICK_SET_HIDE_STATUS_OFF
+ Òåïåðü âàø óðîâåíü äîñòóïà ê ñåðâèñàì ïîêàçûâàòüñÿ â èíôîðìàöèè ïî %s INFO
+
+# SET MSG responses
+NICK_SET_MSG_SYNTAX
+ SET MSG {ON | OFF}
+NICK_SET_MSG_ON
+ Ðåæèì ïðèâàòíûõ ñîîáùåíèé àêòèâèðîâàí, òåïåðü ñåðâèñû áóäóò îòâå÷àòü âàì â ïðèâàò.
+NICK_SET_MSG_OFF
+ Ðåæèì ïðèâàòíûõ ñîîáùåíèé îòêëþ÷åí, ñåðâèñû áóäóò îòâå÷àòü âàì ïîñðåäñòâîì íîòèñîâ.
+
+# SET AUTOOP responses
+NICK_SET_AUTOOP_SYNTAX
+ SET AUTOOP {ON | OFF}
+NICK_SET_AUTOOP_ON
+ Ðåæèì àâòîñòàòóñà àêòèâèðîâàí.
+NICK_SET_AUTOOP_OFF
+ Ðåæèì àâòîñòàòóñà îòêëþ÷åí.
+
+# SET NOEXPIRE responses
+NICK_SASET_SYNTAX
+ SASET íèê îïöèÿ ïàðàìåòðû
+NICK_SASET_DISABLED
+ Èçâèíèòå, íî âîçìîæíîñòü óñòàíîâêè ïàðàìåòðîâ íèêà âðåìåííî íåäîñòóïíà.
+NICK_SASET_UNKNOWN_OPTION
+ Íåèçâåñòíàÿ SASET-îïöèÿ %s.
+NICK_SASET_BAD_NICK
+ Íèê %s íå çàðåãèñòðèðîâàí.
+NICK_SASET_OPTION_DISABLED
+ Âîçìîæíîñòü íàñòðîéêè îïöèè %s â âàøåé IRC-ñåòè íåäîñòóïíà.
+
+# SASET DISPLAY responses
+NICK_SASET_DISPLAY_INVALID
+ Íîâûé ãëàâíûé íèê äëÿ %s äîëæåí áûòü çàðåãèñòðèðîâàííûì íèêîì è ñîñòîÿòü â åãî ãðóïïå!
+NICK_SASET_DISPLAY_CHANGED
+ Íîâûé ãëàâíûé íèê òåïåðü: %s.
+
+# SASET PASSWORD responses
+NICK_SASET_PASSWORD_FAILED
+ Èçâèíèòå, íî èçìåíèòü ïàðîëü äëÿ %s íåóäàëîñü.
+NICK_SASET_PASSWORD_CHANGED
+ Ïàðîëü äëÿ %s óñïåøíî èçìåíåí.
+NICK_SASET_PASSWORD_CHANGED_TO
+ Ïàðîëü äëÿ %s èçìåíåí íà %s.
+
+# SASET URL responses
+NICK_SASET_URL_CHANGED
+ URL-àäðåñ äëÿ %s èçìåíåí íà %s.
+NICK_SASET_URL_UNSET
+ URL-àäðåñ äëÿ %s óäàëåí.
+
+# SASET EMAIL responses
+NICK_SASET_EMAIL_CHANGED
+ Email-àäðåñ äëÿ %s èçìåíåí íà %s.
+NICK_SASET_EMAIL_UNSET
+ Email-àäðåñ äëÿ %s óäàëåí.
+NICK_SASET_EMAIL_UNSET_IMPOSSIBLE
+ Âîçìîæíîñòü óäàëåíèÿ email-àäðåñà â âàøåé IRC-ñåòè íåäîñòóïíà.
+
+# SASET ICQ responses
+NICK_SASET_ICQ_CHANGED
+ ICQ-íîìåð äëÿ %s óñòàíîâëåí íà %s.
+NICK_SASET_ICQ_UNSET
+ ICQ-íîìåð äëÿ %s óäàëåí.
+NICK_SASET_ICQ_INVALID
+ Çíà÷åíèå %s íå ÿâëÿåòñÿ ïðàâèëüíûì ICQ-íîìåðîì.
+
+# SASET GREET responses
+NICK_SASET_GREET_CHANGED
+ Ïðèâåòñòâèå äëÿ %s èçìåíåíî íà %s.
+NICK_SASET_GREET_UNSET
+ Ïðèâåòñòâèå äëÿ %s óäàëåíî.
+
+# SASET PROTECT responses
+NICK_SASET_KILL_SYNTAX
+ SASET íèê KILL {ON | QUICK | OFF}
+NICK_SASET_KILL_IMMED_SYNTAX
+ SASET íèê KILL {ON | QUICK | IMMED | OFF}
+NICK_SASET_KILL_ON
+ Çàùèòà íèêà %s àêòèâèðîâàíà, ëèìèò âðåìåíè íà ââîä ïàðîëÿ: 60 ñåêóíä.
+NICK_SASET_KILL_QUICK
+ Çàùèòà íèêà %s àêòèâèðîâàíà,ëèìèò âðåìåíè íà ââîä ïàðîëÿ: 20 ñåêóíä.
+NICK_SASET_KILL_IMMED
+ Çàùèòà íèêà %s àêòèâèðîâàíà, ëèìèò âðåìåíè íà ââîä ïàðîëÿ: 0 ñåêóíä.
+NICK_SASET_KILL_IMMED_DISABLED
+ Âîçìîæíîñòü óñòàíîâêè ðåæèìà IMMED â âàøåé IRC-ñåòè íåäîñòóïíà.
+NICK_SASET_KILL_OFF
+ Çàùèòà íèêà %s îòêëþ÷åíà.
+
+# SASET SECURE responses
+NICK_SASET_SECURE_SYNTAX
+ SASET íèê SECURE {ON | OFF}
+NICK_SASET_SECURE_ON
+ Ðåæèì áåçîïàñíîñòè äëÿ %s àêòèâèðîâàí.
+NICK_SASET_SECURE_OFF
+ Ðåæèì áåçîïàñíîñòè äëÿ %s îòêëþ÷åí.
+
+# SASET PRIVATE responses
+NICK_SASET_PRIVATE_SYNTAX
+ SASET íèê PRIVATE {ON | OFF}
+NICK_SASET_PRIVATE_ON
+ Ðåæèì ïðèâàòíîñòè äëÿ %s àêòèâèðîâàí.
+NICK_SASET_PRIVATE_OFF
+ Ðåæèì ïðèâàòíîñòè äëÿ %s îòêëþ÷åí.
+
+# SASET HIDE responses
+NICK_SASET_HIDE_SYNTAX
+ SET íèê HIDE {EMAIL | USERMASK | QUIT} {ON | OFF}
+NICK_SASET_HIDE_EMAIL_ON
+ Ñ ýòîãî ìîìåíòà, email-àäðåñ íèêà %s áóäåò ñêðûò èç èíôîðìàöèè ïî %s INFO.
+NICK_SASET_HIDE_EMAIL_OFF
+ Òåïåðü, email-àäðåñ íèêà %s áóäåò ïîêàçûâàòüñÿ â èíôîðìàöèè ïî %s INFO.
+NICK_SASET_HIDE_MASK_ON
+ Ïîñëåäíÿÿ ìàñêà (èäåíò@õîñò) äëÿ %s òåïåðü áóäåò ñêðûòà èç èíôîðìàöèè ïî %s INFO.
+NICK_SASET_HIDE_MASK_OFF
+ Ïîñëåäíÿÿ ìàñêà (èäåíò@õîñò) äëÿ %s òåïåðü áóäåò ïîêàçûâàòüñÿ â èíôîðìàöèè ïî %s INFO.
+NICK_SASET_HIDE_QUIT_ON
+ Ïîñëåäíåå quit-ñîîáùåíèå äëÿ %s òåïåðü áóäåò ñêðûòî èç èíôîðìàöèè ïî %s INFO.
+NICK_SASET_HIDE_QUIT_OFF
+ Ïîñëåäíåå quit-ñîîáùåíèå äëÿ %s òåïåðü áóäåò ïîêàçûâàòüñÿ â èíôîðìàöèè ïî %s INFO.
+NICK_SASET_HIDE_STATUS_ON
+ Óðîâåíü äîñòóïà ê ñåðâèñàì äëÿ %s òåïåðü áóäåò ñêðûò èç èíôîðìàöèè ïî %s INFO.
+NICK_SASET_HIDE_STATUS_OFF
+ Óðîâåíü äîñòóïà ê ñåðâèñàì äëÿ %s òåïåðü áóäåò ïîêàçûâàòüñÿ â èíôîðìàöèè ïî %s INFO.
+
+# SASET MSG responses
+NICK_SASET_MSG_SYNTAX
+ SASET íèê MSG {ON | OFF}
+NICK_SASET_MSG_ON
+ Ðåæèì ïðèâàòíûõ ñîîáùåíèé äëÿ %s àêòèâèðîâàí, òåïåðü ñåðâèñû áóäóò îòâå÷àòü åìó â ïðèâàò.
+NICK_SASET_MSG_OFF
+ Ðåæèì ïðèâàòíûõ ñîîáùåíèé äëÿ %s îòêëþ÷åí, ñåðâèñû áóäóò îòâå÷àòü åìó ïîñðåäñòâîì íîòèñîâ.
+
+# SET NOEXPIRE responses
+NICK_SASET_NOEXPIRE_SYNTAX
+ SASET íèê NOEXPIRE {ON | OFF}
+NICK_SASET_NOEXPIRE_ON
+ Ñ ýòîãî ìîìåíòà ðåãèñòðàöèÿ íèêà %s íèêîãäà íå èñòå÷åò.
+NICK_SASET_NOEXPIRE_OFF
+ C ýòîãî ìîìåíòà íèê %s ñíîâà â ðåæèìå èñòå÷åíèÿ.
+
+# SASET AUTOOP responses
+NICK_SASET_AUTOOP_SYNTAX
+ SASET íèê AUTOOP {ON | OFF}
+NICK_SASET_AUTOOP_ON
+ Ðåæèì àâòîñòàòóñà äëÿ %s àêòèâèðîâàí
+NICK_SASET_AUTOOP_OFF
+ Ðåæèì àâòîñòàòóñà äëÿ %s îòêëþ÷åí
+
+# SASET LANGUAGE responses
+NICK_SASET_LANGUAGE_SYNTAX
+ SASET íèê LANGUAGE íîìåð
+NICK_SASET_LANGUAGE_UNKNOWN
+ ßçûêà ïîä íîìåðîì %d íå ñóùåñòâóåò. Ñïèñîê äîñòóïíûõ ÿçûêîâ: %R%s HELP SET LANGUAGE.
+NICK_SASET_LANGUAGE_CHANGED
+ ßçûê äëÿ óêàçàííîãî íèêà èçìåíåí íà Ðóññêèé.
+
+# ACCESS responses
+NICK_ACCESS_SYNTAX
+ ACCESS {ADD | DEL | LIST} [ìàñêà]
+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:
+NICK_ACCESS_LIST_EMPTY
+ Âàø ñïèñîê äîñòóïà ïóñò.
+NICK_ACCESS_LIST_X_EMPTY
+ Ñïèñîê äîñòóïà äëÿ %s ïóñò.
+
+# Status messages
+NICK_STATUS_0
+ STATUS %s 0 (íèê íåçàðåãèñòðèðîâàí èëè åãî íåò â ñåòè)
+NICK_STATUS_1
+ STATUS %s 1 (íèê çàðåãèñòðèðîâàí è â ñåòè, íî ïîëüçîâàòåëü íå èäåíòèôèöèðîâàëñÿ ê íåìó)
+NICK_STATUS_2
+ STATUS %s 2 (íèê çàðåãèñòðèðîâàí è â ñåòè, ïîëüçîâàòåëü èäåíòèôèöèðîâàí ê íåìó ÷åðåç ñïèñîê ìàñîê)
+NICK_STATUS_3
+ STATUS %s 3 (ïîëüçîâàòåëü èäåíòèôèöèðîâàí êàê âëàäåëåö íèêà ÷åðåç èäåíòèôèêàöèþ ïàðîëåì)
+
+# INFO responses
+NICK_INFO_SYNTAX
+ INFO íèê [ALL]
+NICK_INFO_REALNAME
+ %s ýòî %s
+NICK_INFO_SERVICES_OPER
+ %s èìååò ïðèâèëåãèè Îïåðàòîðà ñåðâèñîâ.
+NICK_INFO_SERVICES_ADMIN
+ %s èìååò ïðèâèëåãèè Àäìèíèñòðàòîðà ñåðâèñîâ.
+NICK_INFO_SERVICES_ROOT
+ %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
+ Ïîñëåäíåå quit-ñîîáùåíèå: %s
+NICK_INFO_URL
+ URL-àäðåñ...............: %s
+NICK_INFO_EMAIL
+ Email-àäðåñ.............: %s
+NICK_INFO_VHOST
+ Âèðòóàëüíûé õîñò........: %s
+NICK_INFO_VHOST2
+ Âèðòóàëüíûé õîñò........: %s@%s
+NICK_INFO_ICQ
+ ICQ-íîìåð...............: %d
+NICK_INFO_GREET
+ Òåêñò ïðèâåòñòâèÿ.......: %s
+NICK_INFO_OPTIONS
+ Àêòèâèðîâàííûå îïöèè....: %s
+NICK_INFO_EXPIRE
+ Ðåãèñòðàöèÿ èñòåêàåò....: %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_AUTOOP
+ Àâòîñòàòóñ
+NICK_INFO_OPT_NONE
+ îòñóòñòâóþò
+NICK_INFO_NO_EXPIRE
+ Äîïîëíèòåëüíî: ðåãèñòðàöèÿ ýòîãî íèêà íèêîãäà íå èñòå÷åò.
+NICK_INFO_FOR_MORE
+ Äëÿ áîëåå ïîäðîáíîé èíôîðìàöèè ñì. %R%s INFO %s ALL.
+NICK_INFO_SUSPENDED
+ Äîïîëíèòåëüíî: ýòîò íèê íàõîäèòñÿ â ðåæèìå ñàñïåíäà ïî ïðè÷èíå: %s
+NICK_INFO_SUSPENDED_NO_REASON
+ Äîïîëíèòåëüíî: ýòîò íèê íàõîäèòñÿ â ðåæèìå ñàñïåíäà (çàìîðîæåí).
+
+# LIST responses
+NICK_LIST_SYNTAX
+ LIST ìàñêà
+NICK_LIST_SERVADMIN_SYNTAX
+ LIST ìàñêà [FORBIDDEN] [SUSPENDED] [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
+NICK_GLIST_REPLY
+ %c%s
+NICK_GLIST_REPLY_ADMIN
+ %c%s (èñòåêàåò %s)
+
+# RECOVER responses
+NICK_RECOVER_SYNTAX
+ RECOVER íèê [ïàðîëü]
+NICK_NO_RECOVER_SELF
+ Ýýý... âû íå ìîæåòå èñïîëüçîâàòü êîìàíäó RECOVER îòíîñèòåëüíî ñàìîãî ñåáÿ.
+NICK_RECOVERED
+ Âàø íèê óñïåøíî îñâîáîæäåí îò èñïîëüçîâàíèÿ åãî äðóãèì ïîëüçîâàòåëåì ñåòè.
+ ×òîáû îñâîáîäèòü âàø íèê îò óäåðæàíèÿ åãî ñåðâèñàìè, èñïîëüçóéòå êîìàíäó
+ %R%s RELEASE %s èëè ïðîñòî íåìíîãî ïîäîæäèòå (âðåìÿ îæèäàíèÿ: %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 íèê
+NICK_GETPASS_UNAVAILABLE
+ Êîìàíäà GETPASS íåäîñòóïíà, òàê êàê âêëþ÷åíî øèôðîâàíèå ïàðîëåé.
+NICK_GETPASS_PASSWORD_IS
+ Ïàðîëü äëÿ íèêà %s - %s
+
+# GETEMAIL responses
+NICK_GETEMAIL_SYNTAX
+ GETEMAIL ëîãèí@email-õîñò.tld (ñèìâîëüíûå ìàñêè çàïðåùåíû!!)
+NICK_GETEMAIL_EMAILS_ARE
+ Íàéäåíî ñîîòâåòñòâèå äëÿ íèêà %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
+ Äîáðîãî âðåìåíè ñóòîê, ìíîãîóâàæàåìûé/àÿ!
+NICK_SENDPASS_LINE_1
+ Áûë ïîëó÷åí çàïðîñ íà âîññòàíîâëåíèå ïàðîëÿ îò âàøåãî íèêà %s
+NICK_SENDPASS_LINE_2
+ Âàø ïàðîëü %s * Äëÿ áîëüøåé áåçîïàñíîñòè, ðåêîìåíäóåòñÿ èçìåíèòü åãî êàê ìîæíî ñêîðåå.
+NICK_SENDPASS_LINE_3
+ Åñëè âû íå çàïðàøèâàëè ýòî ïèñüìî, ïðîñòî ïðîèãíîðèðóéòå åãî.
+NICK_SENDPASS_LINE_4
+ ÏÎÆÀËÓÉÑÒÀ, ÍÅ ÎÒÂÅ×ÀÉÒÅ ÍÀ ÝÒÎ ÏÈÑÜÌÎ!
+NICK_SENDPASS_LINE_5
+ Àäìèíèñòðàöèÿ ñåòè %s.
+NICK_SENDPASS_OK
+ Ïàðîëü äëÿ íèêà %s áûë âûñëàí íà åãî email-àäðåñ.
+
+# SUSPEND responses
+NICK_SUSPEND_SYNTAX
+ SUSPEND íèê ïðè÷èíà
+NICK_SUSPEND_SUCCEEDED
+ Ñ ýòîãî ìîìåíòà íèê %s íàõîäèòñÿ ðåæèìå ñàñïåíäà.
+NICK_SUSPEND_FAILED
+ Èçâèíèòå, íî óñòàíîâèòü ðåæèì ñàñïåíäà íà íèê %s íåóäàëîñü.
+
+# UNSUSPEND responses
+NICK_UNSUSPEND_SYNTAX
+ UNSUSPEND íèê
+NICK_UNSUSPEND_SUCCEEDED
+ Ðåæèì ñàñïåíäà ñ íèêà %s óñïåøíî ñíÿò.
+NICK_UNSUSPEND_FAILED
+ Èçâèíèòå, íî ñíÿòü ðåæèì ñàñïåíäà ñ íèêà %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 íà ïðåäìåò ïîëó÷åíèÿ auth-êîäà.
+NICK_REG_RESENT
+ Âàø êîä àóòåíôèêàöèè áûë çàíîâî âûñëàí íà %s.
+NICK_REG_UNABLE
+ Íèê ÍÅ çàðåãèñòðèðîâàí, ïîïðîáóéòå, ïîæàëóéñòà, ïîçæå.
+NICK_IS_PREREG
+ Ýòîò íèê îæèäàåò ïîäòâåðæäåíèÿ ÷åðåç e-mail ïåðåä çàâåðøåíèåì ðåãèñòðàöèè.
+NICK_ENTER_REG_CODE
+ Auth-êîä áûë âûñëàí íà %s, äëÿ çàâåðøåíèÿ ðåãèñòðàöèè èñïîëüçóéòå êîìàíäó %R%s confirm auth-êîä
+NICK_CONFIRM_NOT_FOUND
+ Âðåìÿ ïåðâîé ÷àñòè ðåãèñòðàöèè èñòåêëî, âîñïîëüçóéòåñü êîìàíäîé "%R%s register <ïàðîëü> <email>"
+NICK_CONFIRM_INVALID
+ Áûë ââåäåí íåâåðíûé auth-êîä, ïîæàëóéñòà, ïðîâåðüòå âàø e-mail ñíîâà è ïîïðîáóéòå åùå ðàç.
+NICK_REG_MAIL_SUBJECT
+ Ðåãèñòðàöèÿ íèêà %s
+NICK_REG_MAIL_HEAD
+ Äîáðîãî âðåìåíè ñóòîê, ìíîãîóâàæàåìûé/àÿ!
+NICK_REG_MAIL_LINE_1
+ Âû çàïðîñèëè ðåãèñòðàöèþ íèêà %s
+NICK_REG_MAIL_LINE_2
+ Äëÿ çàâåðøåíèÿ ïðîöåññà ðåãèñòðàöèè íèêà, âîñïîëüçóéòåñü êîìàíäîé %R%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
+ Óðîâåíü äîñòóïà ê àâòîñòàòóñó îïåðàòîðà (+o)
+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
+ Óðîâåíü äîñòóïà ê êîìàíäå ACCESS LIST
+CHAN_LEVEL_ACCESS_CHANGE
+ Óðîâåíü äîñòóïà ê êîìàíäàì ìîäèôèêàöèè ACCESS-ñïèñêà êàíàëà
+CHAN_LEVEL_MEMO
+ Óðîâåíü äîñòóïà ê ÷òåíèþ ìåìî-ñîîáùåíèé êàíàëà
+CHAN_LEVEL_ASSIGN
+ Äîñòóï ê êîìàíäàì ASSIGN/UNASSIGN
+CHAN_LEVEL_BADWORDS
+ Óðîâåíü äîñòóïà ê êîìàíäå BADWORDS
+CHAN_LEVEL_NOKICK
+ Óðîâåíü äîñòóïà, èñêëþ÷àþùèé îáëàäàòåëÿ èç óñëîâèé êèêîâ áîòà
+CHAN_LEVEL_FANTASIA
+ Óðîâåíü äîñòóïà ê êîìàíäàì FANTASY-ðåæèìà
+CHAN_LEVEL_SAY
+ Óðîâåíü äîñòóïà ê êîìàíäàì SAY è ACT
+CHAN_LEVEL_GREET
+ Óðîâåíü äîñòóïà ê èñïîëüçîâàíèþ ïðèâåòñòâåííîãî ñîîáùåíèÿ
+CHAN_LEVEL_VOICEME
+ Óðîâåíü äîñòóïà ê êîìàíäàì VOICE/DEVOICE îòíîñèòåëüíî ñåáÿ
+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
+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
+ Âàì íå ðàçðåøåíî íàõîäèòüñÿ íà ýòîì êàíàëå.
+CHAN_X_INVALID
+ Óêàçàíî íåäîïóñòèìîå èìÿ êàíàëà: %s
+
+# REGISTER responses
+CHAN_REGISTER_SYNTAX
+ REGISTER #êàíàë ïàðîëü îïèñàíèå
+CHAN_REGISTER_DISABLED
+ Èçâèíèòå, ðåãèñòðàöèÿ êàíàëîâ âðåìåííî ïðèîñòàíîâëåíà.
+CHAN_REGISTER_NOT_LOCAL
+ Ëîêàëüíûå êàíàëû íå ìîãóò áûòü çàðåãèñòðèðîâàíû.
+CHAN_MUST_REGISTER_NICK
+ Ñíà÷àëà âû äîëæíû çàðåãèñòðèðîâàòü ñâîé íèê. Íàïèøèòå %R%s HELP äëÿ ïîëó÷åíèÿ èíôîðìàöèè î ðåãèñòðàöèè íèêà.
+CHAN_MUST_IDENTIFY_NICK
+ Ñíà÷àëà âû äîëæíû èäåíòèôèöèðîâàòü ñâîé íèê íà %s, èñïîëüçóÿ êîìàíäó:
+ %R%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 - çàïîìíèòå åãî äëÿ äàëüíåéøåãî èñïîëüçîâàíèÿ.
+CHAN_REGISTER_NONE_CHANNEL
+ Âû ïûòàåòåñü çàðåãèñòðèðîâàòü íåñóùåñòâóþùèé êàíàë %s
+CHAN_SYMBOL_REQUIRED
+ Âû äîëæíû óêàçàòü ñèìâîë # ïåðåä íàçâàíèåì êàíàëà.
+
+
+# IDENTIFY responses
+CHAN_IDENTIFY_SYNTAX
+ IDENTIFY #êàíàë ïàðîëü
+CHAN_IDENTIFY_FAILED
+ Èçâèíèòå, íî ïðîèçâåñòè èäåíòèôèêàöèþ íåóäàëîñü.
+CHAN_IDENTIFY_SUCCEEDED
+ Ïàðîëü ïðèíÿò, òåïåðü âàø óðîâåíü äîñòóïà íà êàíàëå %s - âëàäåëåö.
+CHAN_LOGOUT_FOUNDER_FAILED
+ Âû íå ìîæåòå äåèäåíòèôèöèðîâàòü ñåáÿ îòíîñòèòåëüíî êàíàëà %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
+ Email-àäðåñ äëÿ êàíàëà %s èçìåíåí íà %s.
+CHAN_EMAIL_UNSET
+ Email-àäðåñ äëÿ êàíàëà %s óäàëåí.
+
+# SET ENTRYMSG responses
+CHAN_ENTRY_MSG_CHANGED
+ Ñîîáùåíèå ïðè âõîäå íà êàíàë %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
+ Ïåðåä áëîêèðîâêîé ðåæèìà +K, âû ñïåðâà äîëæíû çàáëîêèðîâàòü ðåæèì +i.
+CHAN_MLOCK_CHANGED
+ Áëîêèðóåìûå ðåæèìû íà êàíàëå %s èçìåíåíû íà %s.
+
+# SET KEEPTOPIC responses
+CHAN_SET_KEEPTOPIC_SYNTAX
+ SET #êàíàë KEEPTOPIC {ON | OFF}
+CHAN_SET_KEEPTOPIC_ON
+ Ðåæèì õðàíåíèÿ òîïèêà äëÿ êàíàëà %s àêòèâèðîâàí.
+CHAN_SET_KEEPTOPIC_OFF
+ Ðåæèì õðàíåíèÿ òîïèêà äëÿ êàíàëà %s îòêëþ÷åí.
+
+# SET TOPICLOCK responses
+CHAN_SET_TOPICLOCK_SYNTAX
+ SET #êàíàë TOPICLOCK {ON | OFF}
+CHAN_SET_TOPICLOCK_ON
+ Ðåæèì áëîêèðîâêè òîïèêà äëÿ êàíàëà %s àêòèâèðîâàí.
+CHAN_SET_TOPICLOCK_OFF
+ Ðåæèì áëîêèðîâêè òîïèêà äëÿ êàíàëà %s îòêëþ÷åí.
+
+# SET PEACE responses
+CHAN_SET_PEACE_SYNTAX
+ SET #êàíàë PEACE {ON | OFF}
+CHAN_SET_PEACE_ON
+ Ðåæèì ñïîêîéñòâèÿ äëÿ êàíàëà %s àêòèâèðîâàí.
+CHAN_SET_PEACE_OFF
+ Ðåæèì ñïîêîéñòâèÿ äëÿ êàíàëà %s îòêëþ÷åí.
+
+# SET PRIVATE responses
+CHAN_SET_PRIVATE_SYNTAX
+ SET #êàíàë PRIVATE {ON | OFF}
+CHAN_SET_PRIVATE_ON
+ Ðåæèì ïðèâàòíîñòè êàíàëà %s àêòèâèðîâàí.
+CHAN_SET_PRIVATE_OFF
+ Ðåæèì ïðèâàòíîñòè êàíàëà %s îòêëþ÷åí.
+
+# SET SECUREOPS responses
+CHAN_SET_SECUREOPS_SYNTAX
+ SET #êàíàë SECUREOPS {ON | OFF}
+CHAN_SET_SECUREOPS_ON
+ Ðåæèì êîíòðîëÿ çà ñòàòóñîì îïåðàòîðà äëÿ êàíàëà %s àêòèâèðîâàí.
+CHAN_SET_SECUREOPS_OFF
+ Ðåæèì êîíòðîëÿ çà ñòàòóñîì îïåðàòîðà äëÿ êàíàëà %s îòêëþ÷åí.
+
+# SET SECUREFOUNDER responses
+CHAN_SET_SECUREFOUNDER_SYNTAX
+ SET #êàíàë SECUREFOUNDER {ON | OFF}
+CHAN_SET_SECUREFOUNDER_ON
+ Ðåæèì áåçîïàñíîñòè âëàäåëüöà äëÿ êàíàëà %s àêòèâèðîâàí.
+CHAN_SET_SECUREFOUNDER_OFF
+ Ðåæèì áåçîïàñíîñòè âëàäåëüöà äëÿ êàíàëà %s îòêëþ÷åí.
+
+# SET RESTRICTED responses
+CHAN_SET_RESTRICTED_SYNTAX
+ SET #êàíàë RESTRICTED {ON | OFF}
+CHAN_SET_RESTRICTED_ON
+ Ðåæèì îãðàíè÷åííîãî äîñòóïà íà êàíàë %s àêòèâèðîâàí.
+CHAN_SET_RESTRICTED_OFF
+ Ðåæèì îãðàíè÷åííîãî äîñòóïà íà êàíàë %s îòêëþ÷åí.
+
+# SET SECURE responses
+CHAN_SET_SECURE_SYNTAX
+ SET #êàíàë SECURE {ON | OFF}
+CHAN_SET_SECURE_ON
+ Ðåæèì áåçîïàñíîñòè äëÿ êàíàëà %s àêòèâèðîâàí.
+CHAN_SET_SECURE_OFF
+ Ðåæèì áåçîïàñíîñòè äëÿ êàíàëà %s îòêëþ÷åí.
+
+# SET SIGNKICK responses
+CHAN_SET_SIGNKICK_SYNTAX
+ SET #êàíàë SIGNKICK {ON | LEVEL | OFF}
+CHAN_SET_SIGNKICK_ON
+ Ðåæèì ïîäïèñàííûõ êèêîâ äëÿ êàíàëà %s àêòèâèðîâàí.
+CHAN_SET_SIGNKICK_LEVEL
+ Ðåæèì ïîäïèñàííûõ êèêîâ äëÿ êàíàëà %s àêòèâèðîâàí,
+ íî áóäåò ðàáîòàòü â çàâèñèìîñòè îò íàñòðîåê óðîâíåé äîñòóïà.
+CHAN_SET_SIGNKICK_OFF
+ Ðåæèì ïîäïèñàííûõ êèêîâ äëÿ êàíàëà %s îòêëþ÷åí.
+
+# SET OPNOTICE responses
+CHAN_SET_OPNOTICE_SYNTAX
+ SET #êàíàë OPNOTICE {ON | OFF}
+CHAN_SET_OPNOTICE_ON
+ Ðåæèì OP-óâåäîìëåíèé äëÿ êàíàëà %s àêòèâèðîâàí.
+CHAN_SET_OPNOTICE_OFF
+ Ðåæèì OP-óâåäîìëåíèé äëÿ êàíàëà %s îòêëþ÷åí.
+
+# SET XOP responses
+CHAN_SET_XOP_SYNTAX
+ SET #êàíàë XOP {ON | OFF}
+CHAN_SET_XOP_ON
+ Ñèñòåìà ïðèâåëåãèé xOP äëÿ êàíàëà %s àêòèâèðîâàíà.
+CHAN_SET_XOP_OFF
+ Ñèñòåìà ïðèâåëåãèé xOP äëÿ êàíàëà %s îòêëþ÷åíà.
+
+# 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
+ Èçâèíèòå, íî êîëè÷åñòâî VOP/HOP/AOP/SOP-çàïèñåé íå ìîæåò ïåðâûøàòü %d
+CHAN_XOP_LIST_FORMAT
+ %3d %s
+CHAN_XOP_ACCESS
+ Âû íå ìîæåòå èñïîëüçîâàòü ýòó êîìàíäó, âìåñòî íåå èñïîëüçóéòå ACCESS.
+ Äëÿ áîëåå ïîäðîáíîé èíôîðìàöèè ñì. %R%s HELP ACCESS
+CHAN_XOP_NOT_AVAILABLE
+ Ñèñòåìà ïðèâåëåãèé xOP íåäîñòóïíà.
+
+# 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'îâ êàíàëà %s áûë ïîëíîñòüþ î÷èùåí.
+
+# 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'îâ êàíàëà %s áûë ïîëíîñòüþ î÷èùåí.
+
+# 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'îâ êàíàëà %s áûë ïîëíîñòüþ î÷èùåí.
+
+# 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'îâ êàíàëà %s áûë ïîëíîñòüþ î÷èùåí.
+
+# ACCESS messages
+CHAN_ACCESS_SYNTAX
+ ACCESS #êàíàë {ADD|DEL|LIST|CLEAR} [íèê [óðîâåíü] | íîìåð_çàïèñè]
+CHAN_ACCESS_XOP
+ Âû íå ìîæåòå èñïîëüçîâàòü ýòó êîìàíäó òàê êàê âêëþ÷åíà ñèñòåìà ïðèâèëåãèé xOP.
+ Äëÿ ìîäèôèêàöèè ñïèñêà äîñòóïà èñïîëüçóéòå êîìàíäû VOP, AOP è SOP.
+ Áîëåå ïîäðîáíàÿ èíôîðìàöèÿ äîñòóïíà ïî %R%s HELP êîìàíäà
+CHAN_ACCESS_XOP_HOP
+ Âû íå ìîæåòå èñïîëüçîâàòü ýòó êîìàíäó òàê êàê âêëþ÷åíà ñèñòåìà ïðèâèëåãèé xOP.
+ Äëÿ ìîäèôèêàöèè ñïèñêà äîñòóïà èñïîëüçóéòå êîìàíäû VOP, HOP, AOP è SOP.
+ Áîëåå ïîäðîáíàÿ èíôîðìàöèÿ äîñòóïíà ïî %R%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
+ Ñïèñîê äîñòóïà êàíàëà %s áûë ïîëíîñòüþ î÷èùåí.
+
+# 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 (îò %s â %s)
+ %s
+CHAN_AKICK_VIEW_FORMAT_STUCK
+ %3d %s (çàáëîêèðîâàí) (îò %s â %s)
+ %s
+CHAN_AKICK_ENFORCE_DONE
+ AKICK ENFORCE íà êàíàëå %s çàâåðøåí, ïîëüçîâàòåëåé çàáàíåíî: %d
+CHAN_AKICK_CLEAR
+ Ñïèñîê AKICK'îâ íà êàíàëå %s áûë ïîëíîñòüþ î÷èùåí.
+
+# LEVELS responses
+CHAN_LEVELS_SYNTAX
+ LEVELS #êàíàë {SET | DIS[ABLE] | LIST | RESET} [ïóíêò [óðîâåíü]]
+CHAN_LEVELS_XOP
+ Ñèñòåìà óðîâíåé íå äîñòóïíà, òàê êàê èñïîëüçóåòñÿ ñèñòåìà ïðèâèëåãèé xOP.
+CHAN_LEVELS_RANGE
+ Óðîâåíü äîëæåí áûòü ÷èñëîì ìåæäó %d è %d âêëþ÷èòåëüíî.
+CHAN_LEVELS_CHANGED
+ Óðîâåíü äîñòóïà ê %s íà êàíàëå %s èçìåíåí íà %d.
+CHAN_LEVELS_UNKNOWN
+ Íåèçâåñòíûé ïóíêò %s. Äëÿ ïîëó÷åíèÿ ñïèñêà âñåõ äîñòóïíûõ çíà÷åíèé ñì. %R%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 ñáðîøåíû íà çíà÷åíèÿ ïî-óìîë÷àíèþ.
+
+# Status Messages
+CHAN_STATUS_SYNTAX
+ STATUS ERROR Îøèáêà ñèíòàêñèñà
+CHAN_STATUS_NOT_REGGED
+ STATUS ERROR Êàíàë %s íåçàðåãèñòðèðîâàí
+CHAN_STATUS_FORBIDDEN
+ STATUS ERROR Êàíàë %s çàïðåùåí ê èñïîëüçîâàíèþ
+CHAN_STATUS_NOTONLINE
+ STATUS ERROR Íèê %s â ñåòè îòñóòñòâóåò.
+CHAN_STATUS_INFO
+ STATUS %s %s %d
+
+# 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
+ Email-àäðåñ...............: %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_EXPIRE
+ Ðåãèñòðàöèÿ èñòåêàåò......: %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_HOPS
+ Âñå õîïû (+h) êàíàëà %s ëèøåíû ñâîåãî ñòàòóñà.
+CHAN_CLEARED_VOICES
+ Âñå âîéñû (+v) êàíàëà %s ëèøåíû ñâîåãî ñòàòóñà.
+CHAN_CLEARED_USERS
+ Âñå ïîëüçîâàòåëè êàíàëà %s êèêíóòû.
+CHAN_CLEARED_INVITES
+ Âñå èñêëþ÷åíèÿ íà ïðèãëàøåíèå êàíàëà %s óäàëåíû.
+
+# GETPASS responses
+CHAN_GETPASS_SYNTAX
+ GETPASS #êàíàë
+CHAN_GETPASS_UNAVAILABLE
+ Êîìàíäà GETPASS íåäîñòóïíà, òàê êàê èñïîëüçóåòñÿ øèôðîâàíèå ïàðîëåé.
+CHAN_GETPASS_PASSWORD_IS
+ Ïàðîëü êàíàëà %s - %s.
+
+# GETKEY responses
+CHAN_GETKEY_SYNTAX
+ GETKEY #êàíàë
+CHAN_GETKEY_NOKEY
+ Êàíàë %s íå èìååò êëþ÷à (no key).
+CHAN_GETKEY_KEY
+ KEY %s %s
+
+# SENDPASS responses
+CHAN_SENDPASS_SYNTAX
+ SENDPASS #êàíàë
+CHAN_SENDPASS_UNAVAILABLE
+ Êîìàíäà SENDPASS íåäîñòóïíà, òàê êàê èñïîëüçóåòñÿ øèôðîâàíèå ïàðîëåé.
+CHAN_SENDPASS_SUBJECT
+ Ïàðîëü îò êàíàëà %s
+CHAN_SENDPASS_HEAD
+ Äîáðîãî âðåìåíè ñóòîê, ìíîãîóâàæàåìûé/àÿ!
+CHAN_SENDPASS_LINE_1
+ Áûë ïîëó÷åí çàïðîñ íà âîññòàíîâëåíèå ïàðîëÿ îò âàøåãî êàíàëà %s
+CHAN_SENDPASS_LINE_2
+ Òåêóùèé ïàðîëü: %s * Äëÿ áîëüøåé áåçîïàñíîñòè, ðåêîìåíäóåòñÿ èçìåíèòü åãî êàê ìîæíî ñêîðåå.
+CHAN_SENDPASS_LINE_3
+ Åñëè âû íå çàïðàøèâàëè ýòî ïèñüìî, ïðîñòî ïðîèãíîðèðóéòå åãî.
+CHAN_SENDPASS_LINE_4
+ ÏÎÆÀËÓÉÑÒÀ, ÍÅ ÎÒÂÅ×ÀÉÒÅ ÍÀ ÝÒÎ ÏÈÑÜÌÎ!
+CHAN_SENDPASS_LINE_5
+ Àäìèíèñòðàöèÿ ñåòè %s.
+CHAN_SENDPASS_OK
+ Ïàðîëü îò êàíàëà %s áûë âûñëàí íà email-àäðåñ åãî âëàäåëüöà.
+
+# 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. ×òî áû çàáàíèòü åãî, âû äîëæíû óäàëèòü èñêëþ÷åíèÿ.
+
+###########################################################################
+#
+# MemoServ messages
+#
+###########################################################################
+
+# Automatic messages
+MEMO_HAVE_NEW_MEMO
+ Âàì ïðèøëî 1 íîâîå ñîîáùåíèå.
+MEMO_HAVE_NEW_MEMOS
+ Âàì ïðèøëî %d íîâûõ ñîîáùåíèé.
+MEMO_TYPE_READ_LAST
+ Íàïèøèòå %R%s READ LAST ÷òîáû ïðî÷èòàòü åãî.
+MEMO_TYPE_READ_NUM
+ Íàïèøèòå %R%s READ %d ÷òîáû ïðî÷èòàòü åãî.
+MEMO_TYPE_LIST_NEW
+ Íàïèøèòå %R%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 ïðèøëî íîâîå ñîîáùåíèå.
+ Íàïèøèòå %R%s READ %s %d ÷òîáû ïðî÷èòàòü åãî.
+MEMO_NEW_MEMO_ARRIVED
+ Âàì ïðèøëî íîâîå ñîîáùåíèå îò %s.
+ Íàïèøèòå %R%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 [#êàíàë] [ñïèñîê_çàïèñåé | NEW]
+MEMO_HAVE_NO_NEW_MEMOS
+ Ó âàñ íåò íîâûõ ñîîáùåíèé.
+MEMO_X_HAS_NO_NEW_MEMOS
+ Íîâûõ ñîîáùåíèé äëÿ %s íå îáíàðóæåíî.
+MEMO_LIST_MEMOS
+ Ñïèñîê ñîîáùåíèé äëÿ %s. ×òîáû ïðî÷åñòü èõ, íàïèøèòå: %R%s READ íîìåð
+MEMO_LIST_NEW_MEMOS
+ Íîâûå ñîîáùåíèÿ äëÿ %s. ×òîáû ïðî÷åñòü èõ, íàïèøèòå: %R%s READ íîìåð
+MEMO_LIST_CHAN_MEMOS
+ Ñîîáùåíèÿ êàíàëà %s. ×òîáû ïðî÷åñòü èõ, íàïèøèòå: %R%s READ %s íîìåð
+MEMO_LIST_CHAN_NEW_MEMOS
+ Íîâûå ñîîáùåíèÿ íà êàíàëå %s. ×òîáû ïðî÷åñòü èõ, íàïèøèòå: %R%s READ %s íîìåð
+MEMO_LIST_HEADER
+ No. Ïîñëàë Äàòà/Âðåìÿ
+MEMO_LIST_FORMAT
+ %c%3d %-16s %s
+
+# READ responses
+MEMO_READ_SYNTAX
+ READ [#êàíàë] {ñïèñîê_çàïèñåé | LAST | NEW}
+MEMO_HEADER
+ Ñîîáùåíèå %d îò %s (%s). ×òîáû óäàëèòü åãî, íàïèøèòå êîìàíäó: %R%s DEL %d
+MEMO_CHAN_HEADER
+ Ñîîáùåíèå %d îò %s (%s). ×òîáû óäàëèòü åãî, íàïèøèòå êîìàíäó: %R%s DEL %s %d
+MEMO_TEXT
+ %s
+
+# DEL responses
+MEMO_DEL_SYNTAX
+ DEL [#êàíàë] {íîìåð_ñîîáùåíèÿ | ñïèñîê_çàïèñåé | 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 íå áóäåò óâåäîìëÿòü âàñ î íîâûõ ñîîáùåíèÿõ.
+MEMO_SET_NOTIFY_MAIL
+ Ñ ýòîãî ìîìåíòà, âû áóäåòå ïîëó÷àòü óâåäîìëåíèÿ î íîâûõ ñîîáùåíèÿõ ïî email.
+MEMO_SET_NOTIFY_NOMAIL
+ Îïîâåùåíèå î íîâûõ ñîîáùåíèÿõ ïîñðåäñòâîì email îòêëþ÷åíî
+MEMO_SET_NOTIFY_INVALIDMAIL
+ Äëÿ âàøåãî íèêà íå óñòàíîâëåí email-àäðåñ.
+
+# 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
+ Ëèìèò ñîîáùåíèé óñòàíîâëåí íà 0, âîçìîæíîñòü èõ ïîëó÷åíèÿ îòêëþ÷åíà.
+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 óâåäîìëÿåòñÿ î íîâûõ ñîîáùåíèÿõ ñðàçó ïîñëå èäåíòèôèêàöèè ê íèêó.
+
+# Memo2Mail responses
+MEMO_MAIL_SUBJECT
+ Íîâîå ìåìî-ñîîáùåíèå
+MEMO_MAIL_TEXT1
+ Çäðàñòâóéòå %s.
+MEMO_MAIL_TEXT2
+ Âû ïîëó÷èëè íîâîå ìåìî-ñîîáùåíèå îò %s. Íîìåð ñîîáùåíèÿ: %d.
+MEMO_MAIL_TEXT3
+ Òåêñò ñîîáùåíèÿ:
+
+# RSEND responses
+MEMO_RSEND_PLEASE_WAIT
+ Ïîæàëóéñòà, ïîäîæäèòå %d ñåêóíä ïåðåä ïîâòîðíûì èñïîëüçîâàíèåì êîìàíäû RSEND.
+MEMO_RSEND_DISABLED
+ Èçâèíèòå, íî âîçìîæíîñòü èñïîëüçîâàíèÿ êîìàíäû RSEND â âàøåé IRC-ñåòè íåäîñòóïíà.
+MEMO_RSEND_SYNTAX
+ RSEND {íèê | #êàíàë} òåêñò
+MEMO_RSEND_NICK_MEMO_TEXT
+ [àâòî-ñîîáùåíèå] Ìåìî-ñîîáùåíèå, êîòîðûå âû ïîñûëàëè, áûëî ïðî÷èòàíî.
+MEMO_RSEND_CHAN_MEMO_TEXT
+ [àâòî-ñîîáùåíèå] Ìåìî-ñîîáùåíèå, êîòîðûå âû ïîñûëàëè %s, áûëî ïðî÷èòàíî.
+MEMO_RSEND_USER_NOTIFICATION
+ Ìåìî-èçâåùåíèå áûëî àâòîìàòè÷åñêè ïîñëàíî äëÿ %s, èíôîðìèðóþùåå îòïðàâèòåëÿ î òîì, ÷òî âû ïðî÷èòàëè åãî/åå ñîîáùåíèå.
+
+# CHECK responses
+MEMO_CHECK_SYNTAX
+ CHECK íèê
+MEMO_CHECK_NOT_READ
+ Ïîñëåäíåå ñîîáùåíèå, êîòîðîå âû ïîñûëàëè äëÿ %s (à áûëî ýòî %s) åùå íå ïðî÷èòàíî.
+MEMO_CHECK_READ
+ Ïîñëåäíåå ñîîáùåíèå, êîòîðîå âû ïîñûëàëè äëÿ %s (à áûëî ýòî %s) óæå ïðî÷èòàíî.
+MEMO_CHECK_NO_MEMO
+ Íèê %s íå ïîëó÷àë îò âàñ íèêàêèõ ñîîáùåíèé.
+MEMO_NO_RSEND_SELF
+ Âû íå ìîæåòå çàïðîñèòü èíôîðìàöèþ î ïîëó÷åíèè, êîãäà ïîñûëàåòå ñîîáùåíèå ñåáå.
+
+###########################################################################
+#
+# BotServ messages
+#
+###########################################################################
+
+# Standard responses
+BOT_DOES_NOT_EXIST
+ Áîòà %s íå ñóùåñòâóåò.
+BOT_NOT_ASSIGNED
+ Ïåðåä òåì, êàê èñïîëüçîâàòü ýòó êîìàíäó, âû äîëæíû íàçíà÷èòü áîòà íà
+ êàíàë. Äëÿ áîëåå ïîäðîáíîé èíôîðìàöèè ñì. %R%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_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 #êàíàë íèê
+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
+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
+ 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.
+ Íàïèøèòå %R%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
+ FANTASY-ðåæèì äëÿ êàíàëà %s àêòèâèðîâàí.
+BOT_SET_FANTASY_OFF
+ FANTASY-ðåæèì äëÿ êàíàëà %s îòêëþ÷åí.
+
+# SET GREET messages
+BOT_SET_GREET_SYNTAX
+ SET #êàíàë GREET {ON|OFF}
+BOT_SET_GREET_ON
+ Ðåæèì ïðèâåòñòâèé äëÿ êàíàëà %s àêòèâèðîâàí.
+BOT_SET_GREET_OFF
+ Ðåæèì ïðèâåòñòâèé äëÿ êàíàëà %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 óñïåøíî ïîìå÷åí êàê ïðèâàòíûé.
+BOT_SET_PRIVATE_OFF
+ Ðåæèì ïðèâàòíûé óñïåøíî ñíÿò ñ áîòà ïîä íèêîì %s
+
+# 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.
+ Èñïîëüçóéòå %R%S HELP KICK äëÿ ïîëó÷åíèÿ áîëåå ïîëíîé èíôîðìàöèè.
+BOT_KICK_BAD_TTB
+ Çíà÷åíèå âèäà %s íå ìîæåò áûòü èñïîëüçîâàíî êàê êîë-âî êèêîâ äî áàíà.
+
+BOT_KICK_BADWORDS_ON
+ Ðåæèì êèêà çà ïëîõèå ñëîâà àêòèâèðîâàí.
+ Äëÿ ìîäèôèêàöèè ñïèñêà "ïëîõèõ" ñëîâ âîñïîëüçóéòåñü êîìàíäîé BADWORDS.
+BOT_KICK_BADWORDS_ON_BAN
+ C ýòîãî ìîìåíòà, áîò áóäåò êèêàòü çà "ïëîõèå" ñëîâà è ñòàâèòü áàí
+ íàðóøèòåëþ ïîñëå %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:
+ No. Ñëîâî Òèï
+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
+ Óêàçàííûé äëÿ áîòà èäåíò ñîäåðæèò íåäîïóñòèìûå ñèìâîëû.
+BOT_LONG_IDENT
+ Èäåíò áîòà íå äîëæåí ïðåâûøàòü %d ñèìâîëîâ.
+BOT_LONG_HOST
+ Õîñò áîòà íå äîëæåí ïðåâûøàòü %d ñèìâîëîâ.
+
+###########################################################################
+#
+# OperServ messages
+#
+###########################################################################
+
+# General messages
+OPER_BOUNCY_MODES
+ Âîçìîæíîñòü èçìåíÿòü ðåæèìû ñåðâèñàì íåäîñòóïíà. Âû âîîáùå óâåðåíû, ÷òî íàñòðîéêè âàøèõ ñåðâåðîâ êîððåêòíû?
+OPER_BOUNCY_MODES_U_LINE
+ Âîçìîæíîñòü èçìåíÿòü ðåæèìû ñåðâèñàì íåäîñòóïíà. Âû âîîáùå óâåðåíû, ÷òî U:line-çàïèñè âàøèõ ñåðâåðîâ êîððåêòíû?
+# GLOBAL responses
+OPER_GLOBAL_SYNTAX
+ GLOBAL ñîîáùåíèå
+
+# STATS responses
+OPER_STATS_UNKNOWN_OPTION
+ Íåèçâåñòíûé STATS-ïàðàìåòð %s.
+OPER_STATS_CURRENT_USERS
+ Òåêóùåå êîë-âî ïîëüçîâàòåëåé: %d, IRC-îïåðàòîðîâ: %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
+ NS-ãðóïï : %6d çàïèñåé, %5d kB
+OPER_STATS_ALIASES_MEM
+ NS-àëèàñîâ : %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_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
+ Òåêóùåå êîëè÷åñòâî SGLINE'îâ : %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
+ Ñòàòèñòè÷åñêèå äàííûå ñáðîøåíû.
+OPER_STATS_UPLINK_SERVER
+ Uplink-ñåðâåð: %s
+OPER_STATS_UPLINK_CAPAB
+ Uplink capab: %s
+OPER_STATS_UPLINK_SERVER_COUNT
+ Òåêóùåå êîë-âî ñåðâåðîâ: %d
+
+# 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
+ OLINE-ôëàãè %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
+ Ñïèñîê Àäìèíèñòðàòîðîâ ñåðâèñîâ:
+ No. Íèê
+OPER_ADMIN_LIST_FORMAT
+ %3d %s
+OPER_ADMIN_CLEAR
+ Ñïèñîê Àäìèíèñòðàòîðîâ ñåðâèñîâ ïîëíîñòüþ î÷èùåí.
+OPER_ADMIN_MOVED
+ Ïîëüçîâàòåëü %s óñïåøíî ïåðåìåùåí â ñïèñîê Àäìèíèñòðàòîðîâ ñåðâèñîâ.
+
+# 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
+ Ñïèñîê Îïåðàòîðîâ ñåðâèñîâ:
+ No. Íèê
+OPER_OPER_LIST_FORMAT
+ %3d %s
+OPER_OPER_CLEAR
+ Ñïèñîê Îïåðàòîðîâ ñåðâèñîâ ïîëíîñòüþ î÷èùåí.
+OPER_OPER_MOVED
+ %s áûë ïåðåìåùåí â ñïèñîê Îïåðàòîðîâ Ñåðâèñîâ.
+
+# AKILL responses
+OPER_AKILL_SYNTAX
+ AKILL {ADD|DEL|LIST|VIEW|CLEAR} [[+âðåìÿ_èñòå÷åíèÿ] {ìàñêà | íîìåð_çàïèñè} [ïðè÷èíà]]
+OPER_AKILL_EXISTS
+ Çàïèñü âèäà %s óæå ïðèñóòñòâóåò â ñïèñêå AKILL'îâ.
+OPER_AKILL_ALREADY_COVERED
+ Óêàçàííàÿ ìàñêà âèäà %s ñîâïàäàåò ñ îäíîé èç ìàñîê â ñïèñêå AKILL'îâ: %s.
+OPER_AKILL_REACHED_LIMIT
+ Êîëè÷åñòâî çàïèñåé â AKILL-ñïèñêå íå ìîæåò ïðåâûøàòü %d.
+OPER_AKILL_NO_NICK
+ Ïîìíèòå: AKILL-çàïèñü áàçèðóåòñÿ íà ìàñêå âèäà èäåíò@õîñò, èñïîëüçîâàíèå íèêà â êà÷åñòâå ìàñêè íåäîïóñòèìî!
+OPER_AKILL_ADDED
+ Çàïèñü âèäà %s óñïåøíî äîáàâëåíà â ñïèñîê AKILL'îâ.
+OPER_AKILL_CHANGED
+ Ñðîê èñòå÷åíèÿ çàïèñè %s óñïåøíî èçìåíåí.
+OPER_AKILL_NOT_FOUND
+ Çàïèñü âèäà %s â ñïèñêå AKILL'îâ íå îáíàðóæåíà.
+OPER_AKILL_NO_MATCH
+ Ñîâïàäàþùèõ çàïèñåé íå îáíàðóæåíî.
+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'îâ:
+ No. Ìàñêà Ïðè÷èíà
+OPER_AKILL_LIST_FORMAT
+ %3d %-32s %s
+OPER_AKILL_VIEW_HEADER
+ Òåêóùèé ñïèñîê AKILL'îâ:
+# íîìåð, ìàñêà, ñîçäàòåëü, êîãäà, èñòåêàåò, ïðè÷èíà
+OPER_AKILL_VIEW_FORMAT
+ %3d %s (îò %s â %s; %s)
+ %s
+OPER_AKILL_CLEAR
+ Ñïèñîê AKILL'îâ ïîëíîñòüþ î÷èùåí.
+OPER_CHANKILL_SYNTAX
+ CHANKILL [+ñðîê_èñòå÷åíèÿ] {#êàíàë} [ïðè÷èíà]
+# 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 ñîâïàäàåò ñ îäíîé èç ìàñîê â ñïèñêå SGLINE'îâ: %s.
+OPER_SGLINE_REACHED_LIMIT
+ Êîëè÷åñòâî çàïèñåé â SGLINE-ñïèñêå íå ìîæåò ïðåâûøàòü %d.
+OPER_SGLINE_ADDED
+ Çàïèñü âèäà %s óñïåøíî äîáàâëåíà â ñïèñîê SGLINE'îâ.
+OPER_SGLINE_CHANGED
+ Ñðîê èñòå÷åíèÿ çàïèñè %s óñïåøíî èçìåíåí.
+OPER_SGLINE_NOT_FOUND
+ Çàïèñü âèäà %s â ñïèñêå SGLINE'îâ íå îáíàðóæåíà.
+OPER_SGLINE_NO_MATCH
+ Ñîâïàäàþùèõ çàïèñåé íå îáíàðóæåíî.
+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'îâ:
+ No. Ìàñêà Ïðè÷èíà
+OPER_SGLINE_LIST_FORMAT
+ %3d %-32s %s
+OPER_SGLINE_VIEW_HEADER
+ Òåêóùèé ñïèñîê SGLINE'îâ:
+# íîìåð, ìàñêà, ñîçäàòåëü, êîãäà, èñòåêàåò, ïðè÷èíà
+OPER_SGLINE_VIEW_FORMAT
+ %3d %s (îò %s â %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 ñîâïàäàåò ñ îäíîé èç ìàñîê â ñïèñêå SQLINE'îâ: %s.
+OPER_SQLINE_REACHED_LIMIT
+ Êîëè÷åñòâî çàïèñåé â SQLINE-ñïèñêå íå ìîæåò ïðåâûøàòü %d.
+OPER_SQLINE_ADDED
+ Çàïèñü âèäà %s óñïåøíî äîáàâëåíà â ñïèñîê SQLINE'îâ.
+OPER_SQLINE_CHANGED
+ Ñðîê èñòå÷åíèÿ çàïèñè %s óñïåøíî èçìåíåí.
+OPER_SQLINE_NOT_FOUND
+ Çàïèñü âèäà %s â ñïèñêå SQLINE'îâ íå îáíàðóæåíà.
+OPER_SQLINE_NO_MATCH
+ Ñîâïàäàþùèõ çàïèñåé íå îáíàðóæåíî.
+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'îâ:
+ No. Ìàñêà Ïðè÷èíà
+OPER_SQLINE_LIST_FORMAT
+ %3d %-32s %s
+OPER_SQLINE_VIEW_HEADER
+ Òåêóùèé ñïèñîê SQLINE'îâ:
+# íîìåð, ìàñêà, ñîçäàòåëü, êîãäà, èñòåêàåò, ïðè÷èíà
+OPER_SQLINE_VIEW_FORMAT
+ %3d %s (îò %s â %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 ñîâïàäàåò ñ îäíîé èç ìàñîê â ñïèñêå SZLINE'îâ: %s.
+OPER_SZLINE_REACHED_LIMIT
+ Êîëè÷åñòâî çàïèñåé â SZLINE-ñïèñêå íå ìîæåò ïðåâûøàòü %d.
+OPER_SZLINE_ONLY_IPS
+ Ïîìíèòå: ñïèñîê SZLINE'îâ ìîæåò ñîäåðæàòü òîëüêî IP-ìàñêè!
+OPER_SZLINE_ADDED
+ Çàïèñü âèäà %s óñïåøíî äîáàâëåíà â ñïèñîê SZLINE'îâ.
+OPER_SZLINE_CHANGED
+ Ñðîê èñòå÷åíèÿ çàïèñè %s óñïåøíî èçìåíåí.
+OPER_SZLINE_NOT_FOUND
+ Çàïèñü âèäà %s â ñïèñêå SZLINE'îâ íå îáíàðóæåíà.
+OPER_SZLINE_NO_MATCH
+ Ñîâïàäàþùèõ çàïèñåé íå îáíàðóæåíî.
+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'îâ:
+ No. Ìàñêà Ïðè÷èíà
+OPER_SZLINE_LIST_FORMAT
+ %3d %-32s %s
+OPER_SZLINE_VIEW_HEADER
+ Òåêóùèé ñïèñîê SZLINE'îâ:
+# íîìåð, ìàñêà, ñîçäàòåëü, êîãäà, èñòåêàåò, ïðè÷èíà
+OPER_SZLINE_VIEW_FORMAT
+ %3d %s (îò %s â %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
+ Ñåðâèñû ïåðåøëè â ðåæèì read-only (òîëüêî ÷òåíèå).
+OPER_SET_READONLY_OFF
+ Ñåðâèñû ïåðåøëè â ðåæèì read-write (÷òåíèå-çàïèñü).
+OPER_SET_READONLY_ERROR
+  êà÷åñòâå ïàðàìåòðà äëÿ îïöèè READONLY âû äîëæíû óêàçàòü ëèáî ON, ëèáî OFF.
+OPER_SET_LOGCHAN_ON
+ Ðåæèì ëîãèðîâàíèÿ ñîîáùåíèé íà ñåðâèñíûé êàíàë %s àêòèâèðîâàí.
+OPER_SET_LOGCHAN_OFF
+ Ðåæèì ëîãèðîâàíèÿ ñîîáùåíèé íà ñåðâèñíûé êàíàë îòêëþ÷åí.
+OPER_SET_LOGCHAN_ERROR
+  êà÷åñòâå ïàðàìåòðà äëÿ îïöèè LOGCHAN âû äîëæíû óêàçàòü ëèáî ON, ëèáî OFF.
+OPER_SET_DEBUG_ON
+ Ðåæèì ðàáîòû ñåðâèñîâ èçìåíåí: àêòèâèðîâàí DEBUG-ðåæèì (îòëàäêà).
+OPER_SET_DEBUG_OFF
+ Ðåæèì ðàáîòû ñåðâèñîâ èçìåíåí: DEBUG-ðåæèì äåàêòèâèðîâàí.
+OPER_SET_DEBUG_LEVEL
+ Ðåæèì ðàáîòû ñåðâèñîâ èçìåíåí: àêòèâèðîâàí DEBUG-ðåæèì (óðîâåíü %d).
+OPER_SET_DEBUG_ERROR
+  êà÷åñòâå ïàðàìåòðà äëÿ îïöèè DEBUG âû äîëæíû óêàçàòü ON, OFF, ëèáî ïîëîæèòåëüíîå ÷èñëî.
+OPER_SET_NOEXPIRE_ON
+ Ðåæèì ðàáîòû ñåðâèñîâ èçìåíåí: àêòèâèðîâàí NOEXPIRE-ðåæèì (ðåæèì 'íå-èñòå÷åíèÿ').
+OPER_SET_NOEXPIRE_OFF
+ Ðåæèì ðàáîòû ñåðâèñîâ èçìåíåí: NOEXPIRE-ðåæèì äåàêòèâèðîâàí.
+OPER_SET_NOEXPIRE_ERROR
+  êà÷åñòâå ïàðàìåòðà äëÿ îïöèè NOEXPIRE âû äîëæíû óêàçàòü ëèáî ON, ëèáî OFF.
+OPER_SET_UNKNOWN_OPTION
+ Íåèçâåñòíàÿ îïöèÿ %s.
+OPER_SET_SQL_ON
+ Ðåæèì ðàáîòû ñåðâèñîâ èçìåíåí: àêòèâèðîâàí SQL-ðåæèì (èñïîëüçîâàíèå SQL DB).
+OPER_SET_SQL_OFF
+ Ðåæèì ðàáîòû ñåðâèñîâ èçìåíåí: SQL-ðåæèì äåàêòèâèðîâàí.
+OPER_SET_SQL_ERROR
+  êà÷åñòâå ïàðàìåòðà äëÿ îïöèè SQL âû äîëæíû óêàçàòü ëèáî ON, ëèáî OFF.
+OPER_SET_SQL_ERROR_INIT
+ Îøèáêà èíèöèàëèçàöèè SQL, îáðàòèòåñü ê ëîãàì äëÿ áîëåå ïîäðîáíîé èíôîðìàöèè.
+OPER_SET_SQL_ERROR_DISABLED
+ SQL-ôóíêöèè íå íàñòðîåíû èëè íàñòðîåíû íåêîððåêòíî. Âíåñèòå íåîáõîäèìûå
+ èçìåíåíèÿ â êîíôèãóðàöèîííûé ôàéë ñåðâèñîâ (services.conf).
+OPER_SET_LIST_OPTION_ON
+ Ðåæèì %s: âêëþ÷åí.
+OPER_SET_LIST_OPTION_OFF
+ Ðåæèì %s: îòêëþ÷åí.
+
+# NOOP responses
+OPER_NOOP_SYNTAX
+ NOOP {SET|REVOKE} ñåðâåð
+OPER_NOOP_SET
+ Âñå OLINE-çàïèñè íà ñåðâåðå %s áûëè óäàëåíû.
+OPER_NOOP_REVOKE
+ Âñå OLINE-çàïèñè íà ñåðâåðå %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
+ Êîíåö ñïèñêà ïîëüçîâàòåëåé.
+
+OPER_SUPER_ADMIN_ON
+ Ðåæèì Ñóïåð-Àäìèíèñòðàòîðà àêòèâèðîâàí.
+OPER_SUPER_ADMIN_OFF
+ Ðåæèì Ñóïåð-Àäìèíèñòðàòîðà äåàêòèâèðîâàí.
+OPER_SUPER_ADMIN_SYNTAX
+  êà÷åñòâå ïàðàìåòðà äëÿ îïöèè SuperAdmin âû äîëæíû óêàçàòü ëèáî ON, ëèáî OFF.
+OPER_SUPER_ADMIN_WALL_ON
+ Âñòðå÷àåì íîâîãî Ñóïåð-Àäìèíèñòðàòîðà - %s
+OPER_SUPER_ADMIN_WALL_OFF
+ %s ñíÿë ñ ñåáÿ ðåæèì Ñóïåð-Àäìèíèñòðàòîðà.
+OPER_SUPER_ADMIN_ONLY
+ Òîëüêî Ñóïåð-Àäìèíèñòðàòîðû ìîãóò èñïîëüçîâàòü ýòó êîìàíäó.
+OPER_STAFF_LIST_HEADER
+ Ñòàòóñ Óðîâåíü Íèê
+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-ðåæèìà íåâîçìîæíî, òàê êàê îí íå âêëþ÷åí â êîíôèãå ñåðâèñîâ.
+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_NO_UNLOAD
+ Ýòîò ìîäóëü íå ìîæåò áûòü âûãðóæåí.
+OPER_MODULE_LOAD_SYNTAX
+ MODLOAD èìÿ_ôàéëà
+OPER_MODULE_UNLOAD_SYNTAX
+ MODUNLOAD èìÿ_ôàéëà
+OPER_MODULE_LIST_HEADER
+ Òåêóùèé ñïèñîê ìîäóëåé:
+OPER_MODULE_LIST
+ Ìîäóëü: %s [%s] [%s]
+OPER_MODULE_LIST_FOOTER
+ Êîëè÷åñòâî çàãðóæåííûõ ìîäóëåé: %d
+OPER_MODULE_INFO_LIST
+ Ìîäóëü: %s Âåðñèÿ: %s Àâòîð: %s Çàãðóæåí: %s
+OPER_MODULE_CMD_LIST
+ Ïðåäîñòàâëÿåìàÿ êîìàíäà: %R%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 {ìàñêà | ñïèñîê_çàïèñåé}
+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
+ Óêàçàíà íåêîððåêòíàÿ õîñòìàñêà. Òîëüêî ðåàëüíûé õîñò, íå ñîäåðæàùèé íèêîâ è èäåíòîâ ïîëüçîâàòåëåé, ìîæåò áûòü äîáàâëåí â ñïèñîê èñêëþ÷åíèÿ.
+OPER_EXCEPTION_EXISTS
+ Çàïèñü âèäà %s óæå ïðèñóòñòâóåò â ñïèñêå èñêëþ÷åíèé èç ëèìèòà ñåññèé.
+OPER_EXCEPTION_CHANGED
+ Ëèìèò ñåññèé äëÿ çàïèñè âèäà %s áûë èçìåíåí íà %d.
+
+# 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
+# õîñò, ñåññèè, ëèìèò
+OPER_SESSION_VIEW_FORMAT
+ Êîëè÷åñòâî ñåññèé ñ õîñòà %s: %d, äîïóñòèìûé ìàêñèìóì äëÿ äàííîãî õîñòà: %d
+
+# EXCEPTION help
+
+OPER_HELP_EXCEPTION
+ Ñèíòàêñèñ: EXCEPTION ADD [+ñðîê_èñòå÷åíèÿ] ìàñêà ëèìèò ïðè÷èíà
+ EXCEPTION DEL {ìàñêà | ñïèñîê_çàïèñåé}
+ EXCEPTION MOVE íîìåð ïîçèöèÿ
+ EXCEPTION LIST [ìàñêà | ñïèñîê_çàïèñåé]
+ EXCEPTION VIEW [ìàñêà | ñïèñîê_çàïèñåé]
+
+ Ïîçâîëÿåò Àäìèíèñòðàòîðàì ñåðâèñîâ óïðàâëÿòü ñïèñêîì õîñòîâ, êîòîðûå
+ áóäóò èìåòü îòäåëüíî óêàçàííûå îãðàíè÷åíèÿ íà êîëè÷åñòâî ñåññèé.
+ Âîçìîæíîñòè ñïèñêà èñêëþ÷åíèé ïîçâîëÿþò ðàçðåøèòü îïðåäåëåííûì õîñòàì
+ (øåëëîâ èëè BNC) èìåòü áîëüøåå êîëè÷åñòâî êëèåíòîâ îäíîâðåìåííî,
+ íåæåëè ðàçðåøåíî ïî-óìîë÷àíèþ. Êàê òîëüêî êîëè÷åñòâî ñåññèé ñ õîñòà
+ äîñòèãíåò óñòàíîâëåííîãî ëèìèòà, âñå ïîñëåäóþùèå êëèåíòû, ïûòàþùèåñÿ
+ ïîäêëþ÷èòüñÿ ñ äàííîãî õîñòà, áóäóò àâòîìàòè÷åñêè îòêëþ÷àòüñÿ.
+ Ïåðåä îòêëþ÷åíèåì, ïîëüçîâàòåëü ïîëó÷èò óâåäîìëåíèå îò %S
+ î òîì, ÷òî ñ åãî õîñòà ïðåâûøåí ëèìèò ïîäêëþ÷åíèé. Òåêò ñîîáùåíèÿ
+ ìîæíî èçìåíèòü â êîíôèãóðàöèîííîì ôàéëå ñåðâèñîâ.
+
+ Êîìàíäà EXCEPTION ADD ïîçâîëÿåò äîáàâèòü óêàçàííóþ ìàñêó â ñïèñîê
+ èñêëþ÷åíèé. Ó÷òèòå, ÷òî îáùèå õîñòìàñòêè âèäà íèê!èäåíò@õîñò èëè
+ èäåíò@õîñò íåäîïóñòèìû! Âû äîëæíû óêàçûâàòü òîëüêî ðåàëüíûå õîñòû
+ âèäà box.host.dom è *.host.dom, òàê êàê îãðàíè÷åíèå ñåññèé íå
+ èñïîëüçóåò ïðè ïðîâåðêå íèêè è/èëè èäåíòû. Çíà÷åíèå ëèìèòà äîëæíî
+ áûòü öåëûì ÷èñëîì, áîëüøå èëè ðàâíûì íóëþ. Äàííûé ïàðàìåòð îïðåäåëÿåò,
+ êàê ìíîãî ñåññèé äàííûé õîñò ìîæåò èñïîëüçîâàòü îäíîâðåìåííî.
+ Óñòàíîâêà ýòîãî çíà÷åíèÿ ðàâíûì 0 ïîçâîëèò õîñòó èìåòü íåîãðàíè÷åííîå
+ ÷èñëî ñåññèé. Äëÿ áîëåå ïîäðîáíîé èíôîðìàöèè î ñðîêå èñòå÷åíèÿ ñì.
+ ñïðàâêó ïî êîìàíäå AKILL.
+
+ Êîìàíäà EXCEPTION DEL ïîçâîëÿåò óäàëèòü óêàçàííóþ ìàñêó (èëè
+ äèàïàçîí çàïèñåé) èç ñïèñêà èñêëþ÷åíèé.
+
+ Êîìàíäà EXCEPTION MOVE ïîçâîëÿåò ïåðåìåñòèòü óêàçàííîå èñêëþ÷åíèå
+ ïîä óêàçàííûì íîìåðîì íà óêàçàííóþ ïîçèöèþ. Ñîîòâåòñòâåííî, n-îå
+ êîëè÷åñòâî çàïèñåé ñïèñêà èñêëþ÷åíèé áóäåò ñäâèíóòî âûøå èëè íèæå,
+ ÷òîáû çàïîëíèòü îáðàçîâàâøèéñÿ ïðîìåæóòîê.
+
+ Êîìàíäû EXCEPTION LIST è EXCEPTION VIEW ïîçâîëÿþò ïîëó÷èòü òåêóùèé
+ ñïèñîê èñêëþ÷åíèé. Åñëè â êà÷åñòâå ïàðàìåòðà óêàçàíà ìàñêà, áóäóò
+ îòîáðàæåíû òîëüêî ñîâïàäàþùèå ñ íåé çàïèñè.
+
+ Êîìàíäà EXCEPTION VIEW ïîçâîëÿåò ïîëó÷èòü áîëåå ïîäðîáíóþ èíôîðìàöèþ
+ îá èñêëþ÷åíèè: íèê äîáàâèâøåãî çàïèñü, óñòàíîâëåííûé ëèìèò, óêàçàííóþ
+ ïðè óñòàíîâêå ïðè÷èíó, ñàì õîñò, ñðîê èñòå÷åíèÿ çàïèñè è äàòó åå
+ ñîçäàíèÿ.
+
+ Ñòîèò çàìåòèòü, ÷òî ñåðâèñû áóäóò èñïîëüçîâàòü çíà÷åíèÿ ïåðâîé æå
+ ñîâïàäàþùåé çàïèñè èç ñïèñêà èñêëþ÷åíèé äëÿ ïîïàäàþùåãî ïîä óñëîâèÿ
+ õîñòà. Ñëèøêîì áîëüøîé ñïèñîê èñêëþ÷åíèé ñ øèðîêèìè ìàñêàìè â
+ äîñòàòî÷íîé ìåðå âëèÿåò íà ïðîèçâîäèòåëüíîñòü ñåðâèñîâ.
+
+OPER_HELP_SESSION
+ Ñèíòàêñèñ: SESSION LIST ïîðîã
+ SESSION VIEW õîñò
+
+ Ïîçâîëÿåò Àäìèíèñòðàòîðàì ñåðâèñîâ ïðîñìàòðèâàòü ñïèñîê ñåññèé.
+
+ Êîìàíäà SESSION LIST ïîçâîëÿåò ïîëó÷èòü ñïèñîê õîñòîâ ñ êîëè÷åñòâîì
+ ñåññèé áîëüøèì èëè ðàâíûì ïîðîãó. Çíà÷åíèå ïîðîãà äîëæíî áûòü
+ öåëûì ÷èñëîì è áîëüøå 1. Ýòî ïîçâîëèò èçáåæàòü ñëèøêîì áîëüøîãî ñïèñêà
+ õîñòîâ ñ åäèíè÷íûì êîëè÷åñòâîì ñåññèé.
+
+ Êîìàíäà SESSION VIEW ïîêàæåò äåòàëüíóþ èíôîðìàöèþ îá óêàçàííîì
+ õîñòå - òåêóùåå êîëè÷åñòîâ ñåññèé è îãðàíè÷åíèå äëÿ óêàçàííîãî õîñòà.
+ Ïîìíèòå, ÷òî óêàçàííûé õîñò íå äîëæåí âêëþ÷àòü â ñåáÿ ïîäñòàíîâî÷íûå
+ ñèìâîëû âèäà '*' è '?'.
+
+ Ñì. 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-ñïèñîê âñåõ ïîëüçîâàòåëåé óêàçàííîãî êàíàëà ñ
+ óêàçàííîé ïðè÷èíîé íà óêàçàííûé ïðîìåæóòîê âðåìåíè.  êà÷åñòâå ìàñêè
+ 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 îò %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
+ Ñïèñîê íîâîñòåé äëÿ IRC-îïåðàòîðîâ:
+NEWS_OPER_LIST_ENTRY
+ %5d (%s îò %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 îò %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
+
+ Ïîçâîëÿåò óïðàâëÿòü ñïèñêîì íîâîñòåé, êîòîðûå áóäóò àâòîìàòè÷åñêè
+ âûäàâàòüñÿ ïîëüçîâàòåëþ ñðàçó æå, êàê òîëüêî îí ïîäêëþ÷èòñÿ ê ñåòè.
+ Ñòîèò çàìåòèòü, ÷òî âî èçáåæàíèå ôëóäà ïîëüçîâàòåëü ïîëó÷èò òîëüêî
+ %s íîâîñòü(è), òàê ÷òî åñëè ó âàñ â ñïèñêå èõ áîëüøå - ïîêàçàíû
+ áóäóò òîëüêî ïîñëåäíèå èç íèõ. Çíà÷åíèå NewsCount, îòâå÷àþùåå çà
+ îäíîâðåìåííî ïîñûëàåìîå êîë-âî íîâîñòåé, óêàçûâàåòñÿ â services.conf
+
+ Êîìàíäà LOGONNEWS ADD ïîçâîëÿåò äîáàâèòü íîâîñòü â ñïèñîê.
+
+ Êîìàíäà LOGONNEWS DEL ïîçâîëÿåò óäàëèòü íîâîñòü èç ñïèñêà. Â
+ êà÷åñòâå ïàðàìåòðà âû ìîæåòå óêàçàòü íîìåð íîâîñòè - ÷òî áû óäàëèòü
+ îäíó íîâîñòü, èëè ALL - ÷òî áû î÷èñòèòü ñïèñîê íîâîñòåé ïîëíîñòüþ.
+
+ Êîìàíäà LOGONNEWS LIST âûâîäèò ñïèñîê òåêóùèõ íîâîñòåé è ìîæåò áûòü
+ èñïîëüçîâàíà ëþáûì IRC-îïåðàòîðîì. Êîìàíäû ADD è DEL äîñòóïíû òîëüêî
+ Àäìèíèñòðàòîðàì ñåðâèñîâ.
+
+NEWS_HELP_OPER
+ Ñèíòàêñèñ: OPERNEWS ADD òåêñò
+ OPERNEWS DEL {íîìåð | ALL}
+ OPERNEWS LIST
+
+ Ïîçâîëÿåò óïðàâëÿòü ñïèñêîì íîâîñòåé äëÿ IRC-Îïåðàòîðîâ. Êàê òîëüêî
+ ïîëüçîâàòåëü ïîëó÷èò ñòàòóñ IRC-îïåðàòîðà (èñïîëüçîâàâ êîìàíäó /OPER),
+ äàííûå ñîîáùåíèÿ áóäóò åìó îòïðàâëåíû àâòîìàòè÷åñêè.
+ Ñòîèò çàìåòèòü, ÷òî âî èçáåæàíèå ôëóäà ïîëüçîâàòåëü ïîëó÷èò òîëüêî
+ %s íîâîñòü(è), òàê ÷òî åñëè ó âàñ â ñïèñêå èõ áîëüøå - ïîêàçàíû
+ áóäóò òîëüêî ïîñëåäíèå èç íèõ. Çíà÷åíèå NewsCount, îòâå÷àþùåå çà
+ îäíîâðåìåííî ïîñûëàåìîå êîë-âî íîâîñòåé, óêàçûâàåòñÿ â services.conf
+
+ Êîìàíäà OPERNEWS ADD ïîçâîëÿåò äîáàâèòü íîâîñòü â ñïèñîê.
+
+ Êîìàíäà OPERNEWS DEL ïîçâîëÿåò óäàëèòü íîâîñòü èç ñïèñêà. Â
+ êà÷åñòâå ïàðàìåòðà âû ìîæåòå óêàçàòü íîìåð íîâîñòè - ÷òî áû óäàëèòü
+ îäíó íîâîñòü, èëè ALL - ÷òî áû î÷èñòèòü ñïèñîê íîâîñòåé ïîëíîñòüþ.
+
+ Êîìàíäà OPERNEWS LIST âûâîäèò ñïèñîê òåêóùèõ íîâîñòåé è ìîæåò áûòü
+ èñïîëüçîâàíà ëþáûì IRC-îïåðàòîðîì. Êîìàíäû ADD è DEL äîñòóïíû òîëüêî
+ Àäìèíèñòðàòîðàì ñåðâèñîâ.
+
+NEWS_HELP_RANDOM
+ Ñèíòàêñèñ: RANDOMNEWS ADD òåêñò
+ RANDOMNEWS DEL {òåêñò | ALL}
+ RANDOMNEWS LIST
+
+ Ïîçâîëÿåò óïðàâëÿòü ñïèñêîì ñëó÷àéíûõ íîâîñòåé.
+ Êàê òîëüêî ïîëüçîâàòåëü óñïåøíî ïîäêëþ÷èòñÿ ê IRC-ñåòè, îäíà (è
+ òîëüêî îäíà) èç ñëó÷àéíûõ íîâîñòåé áóäåò âûáðàíà ñåðâèñàìè íàóãàä è
+ îòïðàâëåíà åìó.
+
+ Êîìàíäà RANDOMNEWS ADD ïîçâîëÿåò äîáàâèòü íîâîñòü â ñïèñîê.
+
+ Êîìàíäà RANDOMNEWS DEL ïîçâîëÿåò óäàëèòü íîâîñòü èç ñïèñêà. Â
+ êà÷åñòâå ïàðàìåòðà âû ìîæåòå óêàçàòü íîìåð íîâîñòè - ÷òî áû óäàëèòü
+ îäíó íîâîñòü, èëè ALL - ÷òî áû î÷èñòèòü ñïèñîê íîâîñòåé ïîëíîñòüþ.
+
+ Êîìàíäà RANDOMNEWS LIST âûâîäèò ñïèñîê òåêóùèõ íîâîñòåé è ìîæåò
+ áûòü èñïîëüçîâàíà ëþáûì IRC-Îïåðàòîðîì. Êîìàíäû ADD è DEL äîñòóïíû
+ òîëüêî Àäìèíèñòðàòîðàì ñåðâèñîâ.
+
+###########################################################################
+#
+# HelpServ help message
+#
+###########################################################################
+
+HELP_HELP
+ %S - ýòî ñïðàâî÷íûé ñåðâèñ, ïðèçâàííûé ñîîáùèòü âàì èíôîðìàöèþ îáî
+ âñåõ îñíîâíûõ ñåðâèñàõ ñåòè. Âñÿ ñïðàâî÷íàÿ èíôîðìàöèÿ äîñòóïíà ÷åðåç
+ êîìàíäó HELP:
+ Îñíîâíûå ñåðâèñû ñåòè:
+
+ %R%s HELP
+ ñïðàâî÷íàÿ èíôîðìàöèÿ î òîì, êàê ðåãèñòðèðîâàòü íèêè è
+ íàñòðàèâàòü óæå çàðåãèñòðèðîâàííûå.
+
+ %R%s HELP
+ ñïðàâî÷íàÿ èíôîðìàöèÿ î òîì, êàê ðåãèñòðèðîâàòü êàíàëû è
+ óïðàâëÿòü óæå çàðåãèñòðèðîâàííûìè.
+
+ %R%s HELP
+ ñïðàâî÷íàÿ èíôîðìàöèÿ î òîì, êàê îòïðàâëÿòü è ÷èòàòü
+ ìåìî-ñîîáùåíèÿ.
+
+HELP_HELP_BOT
+ Äîïîëíèòåëüíûå ñåðâèñû ñåòè:
+
+ %R%s HELP
+ ñïðàâî÷íàÿ èíôîðìàöèÿ î òîì, êàê ïðèãëàñèòü ñåðâèñíîãî áîòà íà
+ ñâîé êàíàë è ïðàâèëüíî åãî íàñòðîèòü.
+
+HELP_HELP_HOST
+
+ %R%s HELP
+ ñïðàâî÷íàÿ èíôîðìàöèÿ îá óñòàíîâêå/óäàëåíèè vHost'îâ
+ (âèðòóàëüíûõ õîñòîâ).
+
+###########################################################################
+#
+# NickServ help messages
+#
+###########################################################################
+
+NICK_HELP_CMD_CONFIRM
+ CONFIRM Ïîäòâåðæäåíèå ðåãèñòðàöèè êîäîì àóòåíôèêàöèè
+NICK_HELP_CMD_RESEND
+ RESEND Ïîâòîðíûé çàïðîñ auth-êîäà íà email
+NICK_HELP_CMD_REGISTER
+ REGISTER Ðåãèñòðàöèÿ íèêà
+NICK_HELP_CMD_GROUP
+ GROUP Îáúåäèíåíèå íèêîâ â ãðóïïû
+NICK_HELP_CMD_IDENTIFY
+ IDENTIFY Èäåíòèôèêàöèÿ ê íèêó â êà÷åñòâå âëàäåëüöà
+NICK_HELP_CMD_ACCESS
+ ACCESS Óïðàâëåíèå ACCESS-ñïèñêîì íèêà (ñïèñêîì õîñòìàñîê)
+NICK_HELP_CMD_SET
+ SET Íàñòðîéêà îïöèé íèêà, âêëþ÷àÿ çàùèòó KILL'îì
+NICK_HELP_CMD_SASET
+ SASET Óñòàíîâêà ðàçëè÷íûõ îïöèé êàêîãî-ëèáî íèêà
+NICK_HELP_CMD_DROP
+ DROP Îòìåíà ðåãèñòðàöèè íèêà (óäàëåíèå)
+NICK_HELP_CMD_RECOVER
+ RECOVER Îñâîáîæäåíèå âàøåãî íèêà îò èñïîëüçîâàíèÿ åãî êåì-òî äðóãèì
+NICK_HELP_CMD_RELEASE
+ RELEASE Ñíÿòèå çàùèòû ñåðâèñîâ ñ âàøåãî íèêà ïîñëå êîìàíäû RECOVER
+NICK_HELP_CMD_SENDPASS
+ SENDPASS Çàïðîñ ïàðîëÿ îò íèêà íà email-àäðåñ
+NICK_HELP_CMD_GHOST
+ GHOST Îòêëþ÷åíèå "ìåðòâîé" IRC-ñåññèé ñ âàøèì íèêîì
+NICK_HELP_CMD_ALIST
+ ALIST Âûâîä ñïèñêà êàíàëîâ, íà êîòîðûõ ó âàñ åñòü äîñòóï
+NICK_HELP_CMD_GLIST
+ GLIST Ñïèñîê âñåõ íèêîâ â âàøåé ãðóïïå
+NICK_HELP_CMD_INFO
+ INFO Èíôîðìàöèÿ î êàêîì-ëèáî íèêå
+NICK_HELP_CMD_LIST
+ LIST Ñïèñîê âñåõ çàðåãèñòðèðîâàííûõ íèêîâ ïî ìàñêå
+NICK_HELP_CMD_LOGOUT
+ LOGOUT Äåèäåíòèôèêàöèÿ îò èñïîëüçóåìîãî íà äàííûé ìîìåíò íèêà
+NICK_HELP_CMD_STATUS
+ STATUS Çàïðîñ ñòàòóñà èäåíòèôèêàöèè óêàçàííîãî íèêà íà ñåðâèñàõ
+NICK_HELP_CMD_UPDATE
+ UPDATE Îáíîâëåíèå âàøåãî òåêóùåãî ñòàòóñà íà ñåðâèñàõ
+NICK_HELP_CMD_GETPASS
+ GETPASS Çàïðîñ ïàðîëÿ óêàçàííîãî íèêà
+NICK_HELP_CMD_GETEMAIL
+ GETEMAIL Çàïðîñ ñïèñêà âñåõ íèêîâ ñ óêàçàííûì email
+NICK_HELP_CMD_FORBID
+ FORBID Óñòàíîâêà çàïðåòà íà èñïîëüçîâàíèå/ðåãèñòðàöèþ íèêà
+NICK_HELP_CMD_SUSPEND
+ SUSPEND Óñòàíîâêà ðåæèìà ñàñïåíäà ("çàìîðîçêè") íà íèê
+NICK_HELP_CMD_UNSUSPEND
+ UNSUSPEND Ñíÿòèå ðåæèìà ñàñïåíäà ñ íèêà
+
+NICK_HELP
+ %S - ýòî ñåðâèñ, ïðåäíàçíà÷åííûé äëÿ "ðåãèñòðàöèè" âàøåãî
+ íèêà è çàùèòû åãî îò èñïîëüçîâàíèÿ åùå êåì-ëèáî êðîìå âàñ. Íèæå
+ ïðåäñòàâëåí ñïèñîê êîìàíä, ïîçâîëÿþùèõ îñóùåñòâëÿòü ðåãèñòðàöèþ è
+ íàñòðîéêó íèêîâ. ×òîáû èñïîëüçîâàòü êîìàíäó, ïîøëèòå çàïðîñ âèäà
+ %R%S êîìàíäà.
+ Äëÿ áîëåå ïîäðîáíîé èíôîðìàöèè ïî êàêîé-ëèáî êîìàíäå èñïîëüçóéòå:
+ %R%S HELP êîìàíäà.
+
+
+NICK_HELP_FOOTER
+
+ Ïðèìå÷àíèå: ãëàâíîå è îñíîâíîå ïðåäíàçíà÷åíèå %S - ãàðàíòèÿ
+ ïîäëèííîñòè òîãî èëè èíîãî ïîëüçîâàòåëÿ IRC-ñåòè è çàùèòà åãî íèêà
+ îò èñïîëüçîâàíèÿ ïîñòîðîííèì ëèöîì. Ëþáûå ïîïûòêè çëîóïîòðåáëåíèÿ
+ %S, òàêèå êàê: âîðîâñòâî íèêîâ, çàõâàò áîëüøîãî êîëè÷åñòâà
+ íèêîâ è äðóãèå çëîíàìåðåííûå äåéñòâèÿ - ïðèâåäóò, êàê ìèíèìóì, ê
+ óíè÷òîæåíèþ ýòèõ ñàìûõ íèêîâ.
+
+NICK_HELP_EXPIRES
+
+ Ïîìíèòå, ÷òî íåèñïîëüçóåìûå â òå÷åíèå äëèòåëüíîãî ïåðèîäà íèêè
+ àâòîìàòè÷åñêè óäàëÿþòñÿ èç áàçû äàííûõ. Ñðîê ñóùåñòâîâàíèÿ íåàêòèâíûõ
+ íèêîâ: %d äíåé.
+
+NICK_HELP_REGISTER
+ Ñèíòàêñèñ: REGISTER ïàðîëü [email]
+
+ Ïîçâîëÿåò çàðåãèñòðèðîâàòü âàø òåêóùèé íèê â áàçå äàííûõ %S.
+ Ïîñëå óñïåøíîé åãî ðåãèñòðàöèè, âû ìîæåòå èñïîëüçîâàòü êîìàíäû
+ SET è ACCESS ÷òî áû ñêîíôèãóðèðîâàòü ïàðàìåòðû íèêà òàê, êàê
+ âàì áóäåò óãîäíî. Ïîñòàðàéòåñü íå çàáûòü óêàçàííûé ïðè ðåãèñòðàöèè
+ ïàðîëü - îí ïîíàäîáèòñÿ âàì äëÿ äàëüíåéøåãî èñïîëüçîâàíèÿ íèêà!
+
+ Ïðèíöèïû âûáîðà ïàðîëÿ:
+ Ïàðîëè íå äîëæíû áûòü ëåãêî óãàäûâàåìû. Íàïðèìåð, èñïîëüçîâàíèå
+ âàøåãî ðåàëüíîãî èìåíè â êà÷åñòâå ïàðîëÿ - ïëîõàÿ èäåÿ.
+ Èñïîëüçîâàíèå âàøåãî íèêà â êà÷åñòâå ïàðîëÿ - ñîâñåì ïëîõàÿ èäåÿ,
+ %S ïðîñòî-íàïðîñòî íå äîïóñòèò ýòîãî. Òàêæå, êîðîòêèå ïàðîëè
+ î÷åíü ëåãêî ïîäáèðàþòñÿ ïðîñòûì ïåðåáîðîì, ïîýòîìó äëèíà ïàðîëÿ
+ äîëæíà áûòü áîëüøå 5 ñèìâîëîâ. Ïðîáåëû è çíàêè òàáóëÿöèè â ïàðîëå
+ íåäîïóñòèìû, âû ìîæåòå èñïîëüçîâàòü òîëüêî ëàòèíñêèå áóêâû è öèôðû.
+ Ïðèìå÷àíèå: âñå ïàðîëè ÷óâñòâèòåëüíû ê ðåãèñòðó! MYPASSWORD,
+ MyPassword, è mypassword - ýòî ðàçíûå ïàðîëè!
+
+ Óêàçàííûé â êà÷åñòâå äîïîëíèòåëüíîãî ïàðàìåòðà email áóäåò
+ àâòîìàòè÷åñêè àññîöèèðîâàí ñ ðåãèñòðèðóåìûì íèêîì. Äàííûé ïàðàìåòð
+ ìîæåò áûòü êàê îïöèîíàëüíûì, òàê è îáÿçàòåëüíûì - ýòî çàâèñèò îò
+ òðåáîâàíèé è íàñòðîåê IRC-ñåòè.
+ Âû ìîæåòå íå áåñïîêîèòüñÿ î ïðèâàòíîñòè âàøåãî email-àäðåñà - íèêòî
+ èç ïîñòîðîííèõ ëèö åãî íå ïîëó÷èò.
+
+ Òàê æå, ðåãèñòðàöèÿ íîâîãî íèêà àâòîìàòè÷åñêè ñîçäàåò äëÿ íåãî íîâóþ
+ ãðóïïó. Âîçìîæíîñòè ãðóïï íèêîâ ïîçâîëÿþò âàì èìåòü íåñêîëüêî íèêîâ
+ ñ îáùåé äëÿ íèõ èíôîðìàöèåé, íàñòðîéêàìè, ñïèñêîì äîñòóïà. Äëÿ áîëåå
+ ïîäðîáíîé èíôîðìàöèè ñì. %R%S HELP GROUP
+
+NICK_HELP_GROUP
+ Ñèíòàêñèñ: GROUP ãëàâíûé_íèê ïàðîëü
+
+ Äàííàÿ êîìàíäà ïîçâîëÿåò âàì ïðèñîåäèíèòü âàø òåêóùèé íèê ê ãðóïïå
+ ãëàâíîãî_íèêà.  êà÷åñòâå ïàðîëÿ âàì íåîáõîäèìî óêàçàòü ïàðîëü
+ ãëàâíîãî íèêà.
+
+ Èñïîëüçîâàíèå ãðóïï äàåò âàì âîçìîæíîñòü îáúåäèíèòü íåñêîëüêî íèêîâ
+ â îäíó ãðóïïó ñ åäèíûìè íàñòðîéêàìè è ïðèâèëåãèÿìè íà êàíàëàõ,
+ åäèíûìè àññîöèèðîâàííûìè äàííûìè è ïàðîëåì, åäèíûì ñïèñêîì ñîîáùåíèé.
+ Ãðóïïà ñóùåñòâóåò è àêòèâíà ïîêà èñïîëüçóåòñÿ. Äàæå åñëè âû óäàëèòå
+ îäèí èç íèêîâ ãðóïïû, âñå âûøåîïèñàííûå äàííûå (íó è ñàìà ðåãèñòðàöèÿ)
+ áóäóò ñóùåñòâîâàòü äî òåõ ïîð, ïîêà â ãðóïïå åñòü õîòÿ áû 1 íèê.
+
+ Âû ìîæåòå èñïîëüçîâàòü ýòó êîìàíäó äàæå åñëè âàø òåêóùèé íèê âñå åùå
+ íåçàðåãèñòðèðîâàí.  ïðîòèâíîì ñëó÷àå, äëÿ èñïîëüçîâàíèÿ îïèñûâàåìîé
+ êîìàíäû âàì íåîáõîäèìî áóäåò èäåíòèôèöèðîâàòüñÿ ê ãðóïïèðóåìîìó íèêó.
+ Ñì. %R%S HELP IDENTIFY äëÿ áîëåå ïîäðîáíîé èíôîðìàöèè.
+ Ïðèìå÷àíèå: âîçìîæíîñòü ãðóïïèðîâêè óæå çàðåãèñòðèðîâàííûõ íèêîâ
+ ìîæåò áûòü íåäîñòóïíà â âàøåé IRC-ñåòè.
+
+ Îïòèìàëüíûì âàðèàíòîì áóäåò îáúåäèíåíèå åùå íå çàðåãèñòðèðîâàííûõ
+ íèêîâ ñ óæå çàðåãèñòðèðîâàííûì (îíè óêàçûâàþòñÿ êàê ãëàâíûé íèê).
+  ïðîòèâíîì ñëó÷àå, âñå äàííûå ãðóïïèðóåìîãî íèêà áóäóò óíè÷òîæåíû
+ â ïðîöåññå îáúåäèíåíèÿ äâóõ íèêîâ. Èìåííî ïîýòîìó, ñëèÿíèå ãðóïï -
+ íåâîçìîæíî. Îäèí çàðåãèñòðèðîâàííûé íèê, íå ñîñòîÿùèé íè â îäíîé
+ ãðóïïå - óæå îáðàçóåò ãðóïïó. È íàõîäèòñÿ â äâóõ ãðóïïàõ ýòîò íèê
+ íèêàê íåìîæåò.
+ Ïðèìå÷àíèå 2: ó âñåõ íèêîâ â ãðóïïå - åäèíûé ïàðîëü.
+
+NICK_HELP_IDENTIFY
+ Ñèíòàêñèñ: IDENTIFY ïàðîëü
+
+ Ïîçâîëÿåò âàì èäåíòèôèöèðîâàòüñÿ íà %S ê çàðåãèñòðèðîâàííîìó
+ ðàíåå íèêó. Áîëüøèíñòâî ñåðâèñíûõ êîìàíä, òàêèå êàê SET, OP, BAN
+ è ò. ä., òðåáóþò èäåíòèôèêàöèè ïåðåä èñïîëüçîâàíèåì.  êà÷åñòâå
+ ïàðîëÿ âû äîëæíû óêàçàòü òîò ñàìûé ïàðîëü, êîòîðûé óêàçûâàëè ïðè
+ ðåãèñòðàöèè âàøåãî íèêà.
+
+NICK_HELP_UPDATE
+ Ñèíòàêñèñ: UPDATE
+
+ Îáíîâëÿåò âàø òåêóùèé ñòàòóñ íà ñåðâèñàõ, â ÷àñòíîñòè, ïðîâåðÿåò íà
+ íàëè÷èå íîâûõ ìåìî-ñîîáùåíèé, óñòàíàâëèâàåò íåîáõîäèìûå ðåæèìû íà
+ âñåõ êàíàëàõ, ãäå ó âàñ åñòü ñòàòóñ (ModeonID), îáíîâëÿåò âàøè
+ âèðòóàëüíûå õîñòû è íàñòðîéêè (äàòà ïîñëåäíåãî ïîñåùåíèÿ IRC, è ò.ä.).
+
+NICK_HELP_LOGOUT
+ Ñèíòàêñèñ: LOGOUT
+
+ Äàííàÿ êîìàíäà èìååò ýôôåêò, îáðàòíûé ýôôåêòó êîìàíäû IDENTIFY,
+ òî åñòü: ñíèìàåò ñ âàñ ñòàòóñ âëàäåëüöà íèêà (äåèäåíòèôèöèðóåò).
+ Ïðèìå÷àíèå: òåì íå ìåíåå, ïîñëå èñïîëüçîâàíèÿ äàííîé êîìàíäû,
+ ñåðâèñû íå ïîøëþò âàì çàïðîñ î íåîáõîäèìîñòè èäåíòèôèêàöèè ê íèêó.
+
+NICK_HELP_DROP
+ Ñèíòàêñèñ: DROP [íèê]
+
+ Óäàëÿåò âàø íèê èç áàçû äàííûõ %S. Óäàëåííûé òàêèì îáðàçîì íèê
+ ñíîâà ñòàíîâèòñÿ ñâîáîäíûì äëÿ ðåãèñòðàöèè.
+
+ Èñïîëüçîâàíèå íèêà â êà÷åñòâå äîïîëíèòåëüíîãî ïàðàìåòðà
+ ïîçâîëÿåò âàì óäàëÿòü íèê â ïðåäåëàõ âàøåé ãðóïïû.
+
+ ×òîáû èñïîëüçîâàòü äàííóþ êîìàíäó, âû äîëæíû áûòü èäåíòèôèöèðîâàíû
+ ê óäàëÿåìîñó íèêó (èëè ãðóïïå íèêîâ). Äëÿ áîëåå ïîäðîáíîé èíôîðìàöèè
+ ñì. %R%S HELP IDENTIFY
+
+NICK_HELP_ACCESS
+ Ñèíòàêñèñ: ACCESS ADD ìàñêà
+ ACCESS DEL ìàñêà
+ ACCESS LIST
+
+ Ïîçâîëÿåò ïðîñìàòðèâàòü/èçìåíÿòü ñïèñîê ìàñîê äîñòóïà íà âàø íèê.
+ Èìååòñÿ ââèäó ñïèñîê õîñòìàñîê âèäà èäåíò@õîñò, ñ êîòîðûõ %S
+ ïîçâîëèò èñïîëüçîâàòü âàø íèê äàæå áåç è äåíòèôèêàöèè ê íåìó.
+  ïðîòèâíîì ñëó÷àå, ÷òîáû èñïîëüçîâàòü íèê ñ õîñòìàñêè êîòîðàÿ íå
+ ïðèñóòñòâóåò â ñïèñîêå äîñòóïà, âàì íåîáõîäèìî áóäåò èñïîëüçîâàòü
+ êîìàíäó IDENTIFY äëÿ èäåíòèôèêàöèè íà %S.
+
+ Ïðèìåðû:
+
+ ACCESS ADD anyone@*.set.ru
+ ïîçâîëÿåò èñïîëüçîâàòü íèê âñåì, êòî èìååò èäåíò anyone
+ è ÷åé õîñò ïîïàäàåò ïîä ìàñêó *.set.ru.
+ ACCESS DEL anyone@*.set.ru
+ àíòîíèì ïðåäûäóùåé êîìàíäû - óäàëÿåò ìàñêó èç ñïèñêà.
+ ACCESS LIST
+ âûâîäèò òåêóùèé ñïèñîê "äîâåðåííûõ" õîñòìàñîê.
+
+NICK_HELP_SET
+ Ñèíòàêñèñ: SET îïöèÿ ïàðàìåòðû
+
+ Êîìàíäà SET ïîçâîëÿåò âàì íàñòðîèòü ðàçëè÷íûå îïöèè íèêà.
+ Ñïèñîê îïöèé:
+
+ DISPLAY óñòàíîâêà ãëàâíîãî íèêà ãðóïïû
+ PASSWORD èçìåíåíèå òåêóùåãî ïàðîëÿ íà íèê
+ LANGUAGE âûáîð ÿçûêà, ïîñðåäñòâîì êîòîðîãî
+ ñåðâèñû áóäóò ñ âàìè îáùàòüñÿ
+ URL óñòàíîâêà URL-àäðåñà íà íèê
+ EMAIL óñòàíîâêà email-àäðåñà íà íèê
+ ICQ óñòàíîâêà ICQ-íîìåðà íà íèê
+ GREET óñòàíîâêà ïðèâåòñòâåííîãî ñîîáùåíèÿ
+ KILL àêòèâèðîâàíèå/äåàêòèâèðîâàíèå ðåæèìà çàùèòû
+ SECURE àêòèâèðîâàíèå/äåàêòèâèðîâàíèå ðåæèìà áåçîïàñíîñòè
+ PRIVATE ñêðûòèå âàøåãî íèêà â ñïèñêå íèêîâ ïî %R%S LIST
+ HIDE ñêðûòèå ðàçëè÷íîé èíôîðìàöèè î âàøåì íèêå
+ MSG âûáîð ìåòîäà îáùåíèÿ ñåðâèñîâ ñ âàìè
+ AUTOOP àêòèâèðîâàíèå/äåàêòèâèðîâàíèå àâòîñòàòóñà
+
+ ×òîáû ïîëó÷èòü ñïðàâî÷íóþ èíôîðìàöèþ ïî îòäåëüíî âçÿòîé îïöèè
+ âîñïîëüçóéòåñü êîìàíäîé %R%S HELP SET îïöèÿ
+
+ Ïðèìå÷àíèå: ïåðåä óñòàíîâêîé êàêîé-ëèáî îïöèè, âàì íåîáõîäèìî
+ èäåíòèôèöèðîâàòüñÿ ê íèêó â êà÷åñòâå åãî âëàäåëüöà. Äëÿ áîëåå
+ ïîäðîáíîé èíôîðìàöèè ñì. %R%S HELP IDENTIFY
+
+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 àäðåñ@email
+
+ Àññîöèèðóåò email-àäðåñ ñ âàøèì íèêîì. Äàííûé email áóäåò ïîêàçàí
+ â èíôîðìàöèè î âàøåì íèêå, ïðåäîñòàâëÿåìîé ïî êîìàíäå INFO.
+
+NICK_HELP_SET_ICQ
+ Ñèíòàêñèñ: SET ICQ ICQ-íîìåð
+
+ Àññîöèèðóåò ICQ-íîìåð ñ âàøèì íèêîì. Äàííûé ICQ-íîìåð áóäåò ïîêàçàí
+ â èíôîðìàöèè î âàøåì íèêå, ïðåäîñòàâëÿåìîé ïî êîìàíäå INFO.
+
+NICK_HELP_SET_GREET
+ Ñèíòàêñèñ: SET GREET ñîîáùåíèå
+
+ Ïîçâîëÿåò íàçíà÷èòü ïðèâåòñòâåííîå ñîîáùåíèå, êîòîðîå ñåðâèñíûé
+ áîò áóäåò ãîâîðèòü êàæäûé ðàç, êîãäà âû çàõîäèòå íà êàíàë. Ó÷òèòå,
+ ÷òî äëÿ îòîáðàæåíèÿ ïðèâåòñòâèÿ, íà êàíàëå äîëæíà áûòü àêòèâèðîâàíà
+ îïöèÿ GREET è âû äîëæíû èìåòü ñîîòâåòñòâóþùèé óðîâåíü äîñòóïà.
+
+NICK_HELP_SET_KILL
+ Ñèíòàêñèñ: SET KILL {ON | QUICK | IMMED | OFF}
+
+ Àêòèâèðóåò/äåàêòèâèðóåò àâòîìàòè÷åñêóþ çàùèòó äëÿ âàøåãî íèêà.
+ Àêòèâèðîâàíèå çàùèòû íèêà ïîçâîëÿåò âàì ëèìèòèðîâàòü ïåðèîä âðåìåíè
+ íà ââîä ïàðîëÿ äëÿ èäåíòèôèêàöèè. ON âûñòàâëÿåò ïåðèîä â 60 ñåêóíä,
+ ïî èñòå÷åíèè êîòîðîãî ñåðâèñû ïðèíóäèòåëüíî ñìåíÿò íèê ëæå-âëàäåëüöà
+ (èëè âàø, åñëè âû íå óñïåëè ââåñòè ïàðîëü âîâðåìÿ).
+
+ Ïàðàìåòð QUICK ïîçâîëÿåò íàçíà÷èòü 20-ñåêóíäíûé ïåðèîä.
+
+ Ïàðàìåòð IMMED ïîçâîëÿåò îòêëþ÷èòü ýòîò ïåðèîä âîîáùå. Ïîìíèòå,
+ ÷òî àêòèâèðîâàíèå ýòîé îïöèè ìîæåò ïðèâåñòè ê ïîòåðå âàøåãî íèêà!
+ Íå èñïîëüçóéòå ýòó îïöèþ áåç êðàéíåé íà òî íåîáõîäèìîñòè, à ïåðåä åå
+ âêëþ÷åíèåì, óáåäèòåñü, ÷òî ACCESS-ñïèñîê âàøåãî íèêà ñîäåðæèò õîòÿ
+ áû îäíó èç õîñòìàñîê, êîòîðàÿ ñîâïàäàåò ñ âàøåé òåêóùåé.
+ Ïðèìå÷àíèå: âîçìîæíîñòü óñòàíîâêè ìåòîäà çàùèòû IMMED ìîæåò áûòü
+ îòêëþ÷åíà â âàøåé IRC-ñåòè.
+
+NICK_HELP_SET_SECURE
+ Ñèíòàêñèñ: SET SECURE {ON | OFF}
+
+ Àêòèâèðóåò/äåàêòèâèðóåò ðåæèì áåçîïàñíîñòè äëÿ âàøåãî íèêà. Ïðè
+ âêëþ÷åííîé îïöèè SECURE âû äîëæíû èäåíòèôèöèðîâàòüñÿ íà %S
+ ñ ïîìîùüþ ïàðîëÿ, ÷òîáû ïîäòâåðäèòü ÷òî èìåííî âû âëàäåëåö òåêóùåãî
+ èñïîëüçóåìîãî âàìè íèêà. Ïðè ýòîì íà ñïèñîê õîñòìàñîê íèêà ñåðâèñû
+ âíèìàíèÿ íå îáðàùàþò.
+ Îòêëþ÷åíèå ýòîé îïöèè ïîçâîëèò âàì èäåíòèôèöèðîâàòüñÿ íà %S
+ ÷åðåç ñïèñîê ìàñîê íèêà, îäíàêî, ìàêñèìàëüíî äîïóñòèìûé ñòàòóñ â
+ äàííîì ñëó÷àå áóäåò ðàâíÿòüñÿ 2.
+
+ Ñòîèò òàêæå çàìåòèòü, ÷òî ñåðâèñû íå áóäóò ïðèíóäèòåëüíî ìåíÿòü âàø
+ íèê, åñëè â ACCESS-ñïèñêå çàðåãèñòðèðîâàííîãî íèêà åñòü õîòÿ áû îäíà
+ õîñòìàñêà, ñîâïàäàþùàÿ ñ âàøåé òåêóùåé. Ðåæèì îïöèè KILL ïðè ýòîì
+ çíà÷åíèÿ íå èìååò.
+
+NICK_HELP_SET_PRIVATE
+ Ñèíòàêñèñ: SET PRIVATE {ON | OFF}
+
+ Àêòèâèðóåò\äåàêòèâèðóåò îïöèþ ïðèâàòíîñòè âàøåãî íèêà íà %S.
+ Âêëþ÷åííàÿ òàêèì îáðàçîì PRIVATE ñêðûâàåò âàø íèê èç èíôîðìàöèè
+ ïî %S LIST.
+ Ïðèìå÷àíèå: òåì íå ìåíåå, ëþáîé, êòî çíàåò âàø íèê, èìååò âîçìîæíîñòü
+ ïîëó÷èòü èíôîðìàöèþ î âàñ èñïîëüçóÿ êîìàíäó INFO.
+
+NICK_HELP_SET_HIDE
+ Ñèíòàêñèñ: SET HIDE {EMAIL | USERMASK | QUIT} {ON | OFF}
+
+ Äàííàÿ îïöèÿ ïîçâîëÿåò âàì ñêðûòü ÷àñòü èíôîðìàöèè î âàøåì íèêå,
+ êîòîðàÿ ìîæåò çàïðîøåíà ó %S ñ ïîìîùüþ êîìàíäû INFO
+
+  êà÷åñòâå âòîðîãî ïàðàìåòðà âû äîëæíû óêàçàòü ÷òî èìåííî áóäåò
+ ñêðûòî:
+ USERMASK - äëÿ ñêðûòèÿ âàøåé ïîñëåäíåé õîñòìàñêè âèäà èäåíò@õîñò
+ STATUS - äëÿ ñêðûòèÿ âàøåãî óðîâíÿ äîñòóïà ê ñåðâèñàì
+ EMAIL - äëÿ ñêðûòèÿ àññîöèèðîâàííîãî email-àäðåñà.
+ QUIT - äëÿ ñêðûòèÿ âàøåãî ïîñëåäíåãî quit-ñîîáùåíèÿ
+
+  êà÷åñòâå òðåòüåãî ïàðàìåòðà âû äîëæíû óêàçàòü ëèáî ON ëèáî OFF.
+ Ïåðâûé àêòèâèðóåò ñêðûòèå, âòîðîé, ñîîòâåòñòâåííî, äåàêòèâèðóåò.
+
+NICK_HELP_SET_MSG
+ Ñèíòàêñèñ: SET MSG {ON | OFF}
+
+ Ïîçâîëÿåò âàì âûáðàòü ñïîñîá îáùåíèÿ ñåðâèñîâ ñ âàìè. Óêàæèòå ON,
+ ÷òî áû àêòèâèðîâàòü ðåæèì ïðèâàòíûõ ñîîáùåíèé - â ýòîì ñëó÷àå âñå
+ ñîîáùåíèÿ îò ñåðâèñîâ áóäóò ïðèõîäèòü âàì â ïðèâàò. Ïàðàìåòð OFF
+ çàñòàâèò ñåðâèñû èñïîëüçîâàòü ðåæèì óâåäîìëåíèé (notice, íîòèñû).
+ Ïðèìå÷àíèå: íàñòðîéêà äàííîé îïöèè ìîæåò áûòü çàáëîêèðîâàíà.
+
+NICK_HELP_SET_AUTOOP
+ Ñèíòàêñèñ: SET AUTOOP {ON | OFF}
+
+ Àêòèâèðóåò/äåàêòèâèðóåò ðåæèì âòîìàòè÷åñêîãî ïîëó÷åíèÿ ñòàòóñà.
+ Óêàæèòå ON, åñëè õîòèòå ÷òî áû ñåðâèñû àâòîìàòè÷åñêè äàâàëè âàì
+ ñòàòóñ ïðè âõîäå íà êàíàë. Ñîîòâåòñòâåííî OFF - äëÿ îòêëþ÷åíèÿ.
+
+NICK_HELP_SASET
+ Ñèíòàêñèñ: SASET íèê îïöèÿ ïàðàìåòðû.
+
+ Ïîçâîëÿåò Àäìèíèñòðàòîðàì ñåðâèñîâ íàñòðàèâàòü êàêèå-ëèáî îïöèè äëÿ
+ óêàçàííîãî íèêà áåç èäåíòèôèêàöèè ê íåìó. Ñïèñîê îïöèè:
+
+ DISPLAY óñòàíîâêà ãëàâíîãî íèêà ãðóïïû
+ PASSWORD èçìåíåíèå òåêóùåãî ïàðîëÿ íà íèê
+ URL óñòàíîâêà URL-àäðåñà íà íèê
+ EMAIL óñòàíîâêà email-àäðåñà íà íèê
+ ICQ óñòàíîâêà ICQ-íîìåðà íà íèê
+ GREET óñòàíîâêà ïðèâåòñòâåííîãî ñîîáùåíèÿ
+ KILL àêòèâèðîâàíèå/äåàêòèâèðîâàíèå ðåæèìà çàùèòû
+ SECURE àêòèâèðîâàíèå/äåàêòèâèðîâàíèå ðåæèìà áåçîïàñíîñòè
+ PRIVATE ñêðûòèå íèêà â ñïèñêå íèêîâ ïî %R%S LIST
+ HIDE ñêðûòèå ðàçëè÷íîé èíôîðìàöèè î íèêå
+ MSG âûáîð ìåòîäà îáùåíèÿ ñåðâèñîâ ñ íèêîì
+ NOEXPIRE óñòàíîâêà íà íèê ò.í. ðåæèìà 'íå-èñòå÷åíèÿ'
+ AUTOOP àêòèâèðîâàíèå/äåàêòèâèðîâàíèå ðåæèìà àâòîñòàòóñà
+ LANGUAGE âûáîð ÿçûêà, ïîñðåäñòâîì êîòîðîãî ñåðâèñû áóäóò ñ
+ óêàçàííûì íèêîì.
+
+ ×òîáû ïîëó÷èòü ñïðàâî÷íóþ èíôîðìàöèþ ïî îòäåëüíî âçÿòîé îïöèè
+ âîñïîëüçóéòåñü êîìàíäîé %R%S HELP SASET îïöèÿ
+ Ïîìíèòå, âû äîëæíû óêàçàòü íèê, îïöèè êîòîðîãî âû õîòèòå èçìåíèòü.
+
+NICK_HELP_SASET_DISPLAY
+ Ñèíòàêñèñ: SASET íèê DISPLAY íîâûé_íèê
+
+ Ïîçâîëÿåò ïåðåíàçíà÷èòü ãëàâíûé íèê ãðóïïû óêàçàííîãî íèêà. Èìåííî
+ ýòîò íèê áóäåò îòîáðàæàòüñÿ â ñïèñêå äîñòóïà êàíàëîâ, ãäå íèê
+ ïðîïèñàí.
+ Ïðèìå÷àíèå: íîâûé ãëàâíûé íèê äîëæåí ñîñòîÿòü â ãðóïïå íèêà.
+
+NICK_HELP_SASET_PASSWORD
+ Ñèíòàêñèñ: SASET íèê PASSWORD íîâûé_ïàðîëü
+
+ Ïîçâîëÿåò èçìåíèòü ïàðîëü íèêà, èñïîëüçóåìûé äëÿ èäåíòèôèêàöèè
+ â êà÷åñòâå âëàäåëüöà íèêà.
+
+NICK_HELP_SASET_URL
+ Ñèíòàêñèñ: SASET íèê URL url-àäðåñ
+
+ Àññîöèèðóåò URL-àäðåñ ñ óêàçàííûì íèêîì. Äàííûé URL áóäåò ïîêàçàí
+ â èíôîðìàöèè îá óêàçàííîì íèêå, ïðåäîñòàâëÿåìîé ïî êîìàíäå INFO.
+
+NICK_HELP_SASET_EMAIL
+ Ñèíòàêñèñ: SASET íèê EMAIL àäðåñ@email
+
+ Àññîöèèðóåò email-àäðåñ ñ óêàçàííûì íèêîì. Äàííûé email áóäåò ïîêàçàí
+ â èíôîðìàöèè îá óêàçàííîì íèêå, ïðåäîñòàâëÿåìîé ïî êîìàíäå INFO.
+
+NICK_HELP_SASET_ICQ
+ Ñèíòàêñèñ: SASET íèê ICQ ICQ-íîìåð
+
+ Àññîöèèðóåò ICQ-íîìåð ñ óêàçàííûì íèêîì. Äàííûé íîìåð áóäåò ïîêàçàí
+ â èíôîðìàöèè îá óêàçàííîì íèêå, ïðåäîñòàâëÿåìîé ïî êîìàíäå INFO.
+
+NICK_HELP_SASET_GREET
+ Ñèíòàêñèñ: SASET íèê GREET òåêñò
+
+ Ïîçâîëÿåò íàçíà÷èòü ïðèâåòñòâåííîå ñîîáùåíèå, êîòîðîå ñåðâèñíûé
+ áîò áóäåò ãîâîðèòü êàæäûé ðàç, êîãäà íèê çàéäåò íà êàíàë. Ó÷òèòå,
+ ÷òî äëÿ îòîáðàæåíèÿ ïðèâåòñâèÿ, íà êàíàëå äîëæíà áûòü àêòèâèðîâàíà
+ îïöèÿ GREET è íèê äîëæåí èìåòü ñîîòâåòñòâóþùèé óðîâåíü äîñòóïà.
+
+NICK_HELP_SASET_KILL
+ Ñèíòàêñèñ: SASET íèê KILL {ON | QUICK | IMMED | OFF}
+
+ Àêòèâèðóåò/äåàêòèâèðóåò àâòîìàòè÷åñêóþ çàùèòó äëÿ óêàçàííîãî íèêà.
+ Àêòèâèðîâàíèå çàùèòû íèêà ïîçâîëÿåò âàì ëèìèòèðîâàòü ïåðèîä âðåìåíè
+ íà ââîä ïàðîëÿ èäåíòèôèêàöèè. ON âûñòàâëÿåò ïåðèîä â 60 ñåêóíä,
+ ïî èñòå÷åíèè êîòîðîãî %S ïðèíóäèòåëüíî ñìåíèò íèê ëæå-âëàäåëüöà,
+ ïîïûòàâøåãîñÿ âçÿòü óêàçàííûé íèê.
+
+ Ïàðàìåòð QUICK ïîçâîëÿåò íàçíà÷èòü 20-ñåêóíäíûé ïåðèîä.
+ Ïàðàìåòð IMMED ïîçâîëÿåò îòêëþ÷èòü ýòîò ïåðèîä âîîáùå. Ïîìíèòå,
+ ÷òî àêòèâèðîâàíèå äàííîé îïöèè ìîæåò ïðèâåñòè ê òîìó, ÷òî óêàçàííûé
+ íèê íå ñìîæåò âçÿòü íèêòî! Íå èñïîëüçóéòå ýòó îïöèþ áåç êðàéíåé
+ íåîáõîäèìîñòè, à ïåðåä åå âêëþ÷åíèåì óáåäèòåñü, ÷òî ACCESS-ñïèñîê
+ óêàçàííîãî íèêà ñîäåðæèò õîòÿ áû îäíó èç õîñòìàñîê, ñ êîòîðîé åãî
+ âëàäåëåö çàõîäèò â IRC.
+ Ïðèìå÷àíèå: âîçìîæíîñòü óñòàíîâêè ìåòîäà çàùèòû IMMED ìîæåò áûòü
+ îòêëþ÷åíà â âàøåé IRC-ñåòè.
+
+NICK_HELP_SASET_SECURE
+ Ñèíòàêñèñ: SASET íèê SECURE {ON | OFF}
+
+ Àêòèâèðóåò/äåàêòèâèðóåò ðåæèì áåçîïàñíîñòè äëÿ óêàçàííîãî íèêà. Ïðè
+ âêëþ÷åííîé îïöèè SECURE âëàäåëåö íèêà äîëæåí èäåíòèôèöèðîâàòüñÿ
+ íà %S ñ ïîìîùüþ ïàðîëÿ, ÷òî áû ïîäòâåðäèòü ÷òî èìåííî îí âëàäåëåö
+ òåêóùåãî èñïîëüçóåìîãî èì íèêà. Ïðè ýòîì íà ñïèñîê õîñòìàñîê íèêà
+ ñåðâèñû âíèìàíèÿ îáðàùàòü íå áóäóò.
+ Îòêëþ÷åíèå ýòîé îïöèè ïîçâîëèò âëàäåëüöó èäåíòèôèöèðîâàòüñÿ íà %S
+ ÷åðåç ñïèñîê ìàñîê íèêà, îäíàêî ìàêñèìàëüíî äîïóñòèìûé ñòàòóñ â
+ äàííîì ñëó÷àå áóäåò ðàâíÿòüñÿ 2.
+
+ Ñòîèò òàê æå çàìåòèòü, ÷òî ñåðâèñû íå áóäóò ïðèíóäèòåëüíî ìåíÿòü íèê
+ âëàäåëüöà åñëè â ACCESS-ñïèñêå çàðåãèñòðèðîâàííîãî íèêà åñòü õîòÿ
+ áû îäíà õîñòìàñêà, ñîâïàäàþùàÿ ñ òåêóùåé õîñòìàñêîé ïîëüçîâàòåëÿ,
+ âçÿâøåãî íèê. Ðåæèì îïöèè KILL ïðè ýòîì çíà÷åíèÿ íå èìååò.
+
+NICK_HELP_SASET_PRIVATE
+ Ñèíòàêñèñ: SASET íèê PRIVATE {ON | OFF}
+
+ Àêòèâèðóåò\äåàêòèâèðóåò îïöèþ ïðèâàòíîñòè óêàçàííîãî íèêà.
+ Âêëþ÷åííàÿ òàêèì îáðàçîì PRIVATE ñêðûâàåò îòîáðàæåíèå íèêà â
+ ñïèñêàõ ïî %S LIST.
+ Ïðèìå÷àíèå: òåì íå ìåíåå ëþáîé, êòî çíàåò òî÷íîå íàïèñàíèå íèêà,
+ èìååò âîçìîæíîñòü ïîëó÷èòü èíôîðìàöèþ î íåì èñïîëüçóÿ êîìàíäó INFO.
+
+NICK_HELP_SASET_HIDE
+ Ñèíòàêñèñ: SASET íèê HIDE {EMAIL|STATUS|USERMASK|QUIT} {ON|OFF}
+
+ Äàííàÿ îïöèÿ ïîçâîëÿåò âàì ñêðûòü ÷àñòü èíôîðìàöèè îá óêàçàííîì
+ íèêå, êîòîðàÿ ìîæåò çàïðîøåíà ó %S ñ ïîìîùüþ êîìàíäû INFO
+
+  êà÷åñòâå âòîðîãî ïàðàìåòðà âû äîëæíû óêàçàòü ÷òî èìåííî áóäåò
+ ñêðûòî:
+ QUIT - äëÿ ñêðûòèÿ ïîñëåäíåãî quit-ñîîáùåíèÿ âëàäåëüöà
+ EMAIL - äëÿ ñêðûòèÿ àññîöèèðîâàííîãî email-àäðåñà âëàäåëüöà
+ STATUS - äëÿ ñêðûòèÿ óðîâíÿ äîñòóïà ê ñåðâèñàì
+ USERMASK - äëÿ ñêðûòèÿ ïîñëåäíåé õîñòìàñêè âëàäåëüöà (èäåíò@õîñò)
+
+  êà÷åñòâå òðåòüåãî ïàðàìåòðà âû äîëæíû óêàçàòü ëèáî ON ëèáî OFF.
+ Ïåðâûé àêòèâèðóåò ñêðûòèå, âòîðîé, ñîîòâåòñòâåííî, äåàêòèâèðóåò.
+
+NICK_HELP_SASET_MSG
+ Ñèíòàêñèñ: SASET íèê MSG {ON | OFF}
+
+ Ïîçâîëÿåò âàì âûáðàòü ñïîñîá îáùåíèÿ ñåðâèñîâ ñ óêàçàííûì íèêîì.
+ Óêàæèòå ON, ÷òî áû àêòèâèðîâàòü ðåæèì ïðèâàòíûõ ñîîáùåíèé - â
+ ýòîì ñëó÷àå âñå ñîîáùåíèÿ îò ñåðâèñîâ áóäóò ïðèõîäèòü âëàäåëüöó â
+ ïðèâàò. Ïàðàìåòð OFF çàñòàâèò ñåðâèñû èñïîëüçîâàòü ðåæèì
+ óâåäîìëåíèé (notice, íîòèñû).
+ Ïðèìå÷àíèå: íàñòðîéêà äàííîé îïöèè ìîæåò áûòü çàáëîêèðîâàíà.
+
+NICK_HELP_SASET_NOEXPIRE
+ Ñèíòàêñèñ: SASET íèê NOEXPIRE {ON | OFF}
+
+ Ïîçâîëÿåò èñêëþ÷èòü óêàçàííûé íèê èç óñëîâèé èñòå÷åíèÿ ðåãèñòðàöèè
+ ïî âðåìåíè. Óêàæèòå ON, ÷òî áû àêòèâèðîâàòü òàê íàçûâàåìûé ðåæèì
+ 'íå-èñòå÷åíèÿ'. Ïàðàìåòð OFF ñíîâà âîçâðàùàåò íèê â ðåæèì èñòå÷åíèÿ.
+
+NICK_HELP_SASET_AUTOOP
+ Ñèíòàêñèñ: SASET íèê AUTOOP {ON | OFF}
+
+ Àêòèâèðóåò/äåàêòèâèðóåò ðåæèì àâòîìàòè÷åñêîãî ïîëó÷åíèÿ ñòàòóñà.
+ Óêàæèòå ON, åñëè õîòèòå ÷òî áû ñåðâèñû àâòîìàòè÷åñêè äàâàëè
+ âëàäåëüöó íèêà ñòàòóñ ïðè âõîäå íà êàíàë. Ñîîòâåòñòâåííî OFF -
+ äëÿ îòêëþ÷åíèÿ.
+
+NICK_HELP_SASET_LANGUAGE
+ Ñèíòàêñèñ: SASET íèê LANGUAGE íîìåð
+
+ Èçìåíÿåò ÿçûê, íà êîòîðîì ñåðâèñû áóäóò ïîñûëàòü ñîîáùåíèÿ óêàçàííîìó
+ íèêó (íàïðèìåð, òåêñò ñïðàâî÷íîé ñèñòåìû, êîòîðûé âû ñåé÷àñ è
+ ÷èòàåòå).
+  êà÷åñòâå íîìåðà âû äîëæíû óêàçàòü êîíêðåòíûé íîìåð ÿçûêà èç
+ ñïèñêà ïîääåðæèâàåìûõ ÿçûêîâ: %R%S HELP SET LANGUAGE.
+
+NICK_HELP_RECOVER
+ Ñèíòàêñèñ: RECOVER íèê [ïàðîëü]
+
+ Êîìàíäà RECOVER ïîçâîëÿåò âàì âåðíóòü âàø çàðåãèñòðèðîâàííûé íèê
+ â òîì ñëó÷àå åñëè åãî âçÿë è èñïîëüçóåò êòî-òî äðóãîé. Âû ìîæåòå
+ èçáåæàòü ïîäîáíûõ ñèòóàöèé - äëÿ ýòîãî äîñòàòî÷íî íàñòðîèòü çàùèòó
+ âàøåãî íèêà. Ïîäðîáíåå î ðåæèìå çàùèòû âû ìîæåòå óçíàòü èç ñïðàâî÷íîé
+ èíôîðìàöèè ïî SET KILL.
+
+ Êàê òîëüêî âû ïîøëåòå RECOVER-çàïðîñ, ñåðâèñû ñåòè òóò æå ñîçäàäóò
+ ïñåâäîïîëüçîâàòåëÿ ñ âàøèì çàðåãèñòðèðîâàííûì íèêîì, ÷òî çàñòàâèò
+ IRC-ñåðâåð îòêëþ÷èòü çàõâàò÷èêà îò ñåòè. Ýôôåêò êîìàíäû ðàçíèòñÿ â
+ çàâèñèìîñòè îò òîãî, êàêîé IRCd èñïîëüçóåòñÿ â âàøåé ñåòè: åñëè âàø
+ ñåðâåð íå ïîääåðæèâàåò SVSNICK, òî çàõâàò÷èê áóäåò îòêëþ÷åí, êàê ïðè
+ GHOST, à åñëè ïîääåðæèâàåò, òî íèê çàõâàò÷èêà áóäåò èçìåíåí íà
+ ñëó÷àéíûé, íàïðèìåð íà Guest31526. Îïÿòü æå, ïðåôèêñ ñëó÷àéíîãî
+ íèêà íàñòðàèâàåòñÿ â êîíôèãå ñåðâèñîâ è ìîæåò ìåíÿòüñÿ îò ñåòè ê ñåòè.
+ Íî è ýòî åùå íå âñå. Â çàâèñèìîñòè îò òèïà IRCd âàøåé ñåòè, ñåðâèñû
+ áóäóò ëèáî ñîçäàâàòü ïñåâäîïîëüçîâàòåëÿ, ëèáî óñòàíàâëèâàòü âðåìåííûé
+ çàïðåò â âèäå Q:LINE íà âàø íèê. Ýòîò çàïðåò (áóäü òî ïñåâäîêëèåíò
+ èëè Q:LINE) áóäåò çàïðåùàòü êîìó-ëèáî âçÿòü âîññòàíîâëåííûé íèê â
+ òå÷åíèå îïðåäåëåííîãî ïðîìåæóòêà âðåìåíè, óêàçàííîãî â êîíôèãå
+ ñåðâèñîâ (ïî-óìîë÷àíèþ, ýòî %s).
+
+ Êàê òîëüêî ýòîò ïðîìåæóòîê âðåìåíè èñòå÷åò - âû ñìîæåòå èñïîëüçîâàòü
+ ñâîé íèê ñíîâà. Åñëè âû íå õîòèòå æäàòü - âîñïîëüçóéòåñü êîìàíäîé
+ RELEASE ÷òîáû ñíÿòü çàùèòó ñåðâèñîâ ñ âàøåãî íèêà íåìåäëåííî. Äëÿ
+ áîëåå ïîäðîáíîé èíôîðìàöèè ñì. %R%S HELP RELEASE.
+
+ ×òîáû èñïîëüçîâàòü äàííóþ êîìàíäó, âû äîëæíû óêàçàòü ïàðîëü äëÿ
+ èçìåíÿåìîãî íèêà, ëèáî æå, âû äîëæíû áûòü èäåíòèôèöèðîâàíû ê ãðóïïå
+ èçìåíÿåìîãî íèêà. Äîïóñòèìî èñïîëüçîâàíèå äàííîé êîìàíäû äàæå ïðè
+ èäåíòèôèêàöèè ê íèêó âñåãî ëèøü ÷åðåç ñïèñîê õîñòìàñîê.
+
+NICK_HELP_RELEASE
+ Ñèíòàêñèñ: RELEASE íèê [ïàðîëü]
+
+ Ïîçâîëÿåò âðó÷íóþ îñâîáîäèòü âàø çàðåãèñòðèðîâàííûé íèê îò óäåðæàíèÿ
+ åãî ñåðâèñàìè. Îáû÷íî ýòî ïðîèñõîäèò â òîì ñëó÷àå, åñëè ó âàøåãî íèêà
+ àêòèâèðîâàí ðåæèì çàùèòû è ïîëüçîâàòåëü, êîòîðûé ïûòàëñÿ âàø íèê
+ èñïîëüçîâàòü, íå óñïåë ââåñòè âåðíûé ïàðîëü èëè íå ââîäèë åãî âîâñå.
+ Ýôôåêò ðåæèìà çàùèòû àíàëîãè÷åí ýôôåêòó êîìàíäû RECOVER (ñì. ñïðàâêó
+ ïî %R%S HELP RECOVER äëÿ áîëåå ïîäðîáíîé èíôîðìàöèè). Óäåðæàíèå íèêà
+ ïðîäîëæàåòñÿ â òå÷åíèè îïðåäåëåííîãî ïðîìåæóòêà âðåìåíè, óêàçàííîãî â
+ êîíôèãå ñåðâèñîâ (ïî-óìîë÷àíèþ, ýòî %s).
+
+ ×òîáû èñïîëüçîâàòü äàííóþ êîìàíäó, âû äîëæíû óêàçàòü ïàðîëü äëÿ
+ óäåðæèâàåìîãî íèêà, ëèáî æå, âû äîëæíû áûòü èäåíòèôèöèðîâàíû ê ãðóïïå
+ óäåðæèâàåìîãî íèêà. Äîïóñòèìî èñïîëüçîâàíèå äàííîé êîìàíäû äàæå ïðè
+ èäåíòèôèêàöèè ê íèêó âñåãî ëèøü ÷åðåç ñïèñîê õîñòìàñîê.
+
+NICK_HELP_GHOST
+ Ñèíòàêñèñ: GHOST íèê [ïàðîëü]
+
+ Óíè÷òîæàåò "ìåðòâóþ" IRC-ñåññèþ, èñïîëüçóþùóþ Âàø íèê. "Ìåðòâàÿ"
+ ñåññèÿ - ýòî êîãäà ðåàëüíî åå íå ñóùåñòâóåò, íî IRC-ñåðâåð äóìàåò
+ ÷òî êëèåíò âñå åùå â ñåòè. ×àùå âñåãî ýòî ïðîèñõîäèò ïðè âíåçàïíîì
+ îáðûâå ñâÿçè ñ ñåðâåðîì, êîãäà IRC-êëèåíò íå óñïåâàåò ïîñëàòü îíîìó
+ óâåäîìëåíèå îá îòêëþ÷åíèè (íàïðèìåð, êîãäà âàø êîìïüþòåð âíåçàïíî
+ ïåðåçàãðóçèëñÿ èëè ó âàñ íå ìåíåå âíåçàïíî îòêëþ÷èëè ýëåêòðè÷åñòâî).
+
+ ×òîáû èñïîëüçîâàòü äàííóþ êîìàíäó, âû äîëæíû óêàçàòü ïàðîëü äëÿ
+ îòêëþ÷àåìîãî íèêà, ëèáî æå, âû äîëæíû áûòü èäåíòèôèöèðîâàíû ê ãðóïïå
+ îòêëþ÷àåìîãî íèêà. Äîïóñòèìî èñïîëüçîâàíèå äàííîé êîìàíäû äàæå ïðè
+ èäåíòèôèêàöèè ê íèêó âñåãî ëèøü ÷åðåç ñïèñîê õîñòìàñîê.
+
+NICK_HELP_INFO
+ Ñèíòàêñèñ: INFO íèê [ALL]
+
+ Çàïðàøèâàåò ó ñåðâèñîâ èíôîðìàöèþ îá óêàçàííîì íèêå.  ÷àñòíîñòè
+ áóäóò ïîêàçàíû: ðåàëüíîå èìÿ âëàäåëüöà (realname), åãî ïîñëåäíÿÿ
+ õîñòìàñêà, êîãäà îí ïîñëåäíèé ðàç áûë â IRC ïîä ýòèì íèêîì. Åñëè âû
+ çàïðàøèâàåòå èíôîðìàöèþ îòíîñèòåëüíî ñâîåãî íèêà, âû ìîæåòå óêàçàòü
+ ïàðàìåòð ALL, ÷òîáû ïîëó÷èòü âñþ äîñòóïíóþ èíôîðìàöèþ, â òîì ÷èñëå
+ è òó, êîòîðàÿ ñêðûòà.
+
+NICK_HELP_LIST
+ Ñèíòàêñèñ: LIST ìàñêà
+
+ Âûâîäèò ñïèñîê âñåõ çàðåãèñòðèðîâàííûõ íèêîâ, êîòîðûå ñîâïàäàþò ñ
+ óêàçàííîé ìàñêîé âèäà íèê!èäåíò@õîñò.
+ Íèêè ñ àêòèâèðîâàííîé îïöèåé PRIVATE ïîêàçàíû íå áóäóò.
+
+ Ïðèìåðû:
+
+ LIST *!joeuser@foo.com
+ ïîêàæåò âñå íèêè, ìàñêà êîòîðûõ ñîâïàäàåò ñ joeuser@foo.com
+ LIST *Bot*!*@*
+ ïîêàæåò âñå çàðåãèñòðèðîâàííûå íèêè, êîòîðûå ñîäåðæàò
+ ïîäñòðîêó âèäà Bot (ðåãèñòð íå èìååò çíà÷åíèÿ).
+ LIST *!*@*.bar.org
+ Ïîêàæåò âñå íèêè, ïðèíàäëåæàùèå ïîëüçîâàòåëÿì
+ â äîìåíå bar.org.
+
+NICK_HELP_ALIST
+ Ñèíòàêñèñ: ALIST [óðîâåíü]
+
+ Ïîêàæåò âñå êàíàëû, â ñïèñêàõ äîñòóïà êîòîðûõ âû ÷èñëèòåñü.
+ Îïöèîíàëüíî, âû ìîæåòå âûáðàòü îïðåäåëåííûé óðîâåíü â ôîðìàòå xOP
+ èëè LEVELS. Ðåçóëüòèðóþùèé ñïèñîê áóäåò ñîäåðæàòü êàíàëû, íà êîòîðûõ
+ ó âàñ åñòü ñîîòâåòñòâóþùèé óðîâåíü äîñòóïà.
+
+ Ïðèìåðû:
+ ALIST Founder
+ âûâåäåò ñïèñîê êàíàëîâ, âëàäåëüöåì êîòîðûõ âû ÿâëÿåòåñü.
+ ALIST AOP
+ âûâåäåò ñïèñîê êàíàëîâ, íà êîòîðûõ ó âàñ åñòü ñòàòóñ AOP
+ èëè âûøå.
+ ALIST 10
+ âûâåäåò ñïèñîê êàíàëîâ, íà êîòîðûõ âàø óðîâåíü ðàâåí 10
+ èëè âûøå.
+
+ Ïðèìå÷àíèå: åñëè âû âèäèòå ìåòêó "!" ïåðåä èìåíåì êàíàëà, ýòî
+ çíà÷èò ÷òî îí íàõîäèòñÿ â ðåæèìå NOEXPIRE.
+
+NICK_HELP_GLIST
+ Ñèíòàêñèñ: GLIST
+
+ Âûâîäèò ñïèñîê íèêîâ â âàøåé ãðóïïå.
+
+NICK_HELP_STATUS
+ Ñèíòàêñèñ: STATUS íèê1 íèê2 íèê3...
+
+ Çàïðàøèâàåò èíôîðìàöèþ î ñòàòóñå íèêà íà ñåðâèñàõ - èäåíòèôèöèðîâàëñÿ
+ ëè èñïîëüçóþùèé åãî êàê âëàäåëåö. Îòâåò âûâîäèòñÿ â ôîðìàòå:
+
+ íèê êîä-ñòàòóñà
+
+ ãäå íèê - ýòî íèê, ñòàòóñ êîòîðîãî âû çàïðîñèëè, à êîä-ñòàòóñà
+ ìîæåò áûòü îäíèì èç:
+
+ 0 - òàêîãî ïîëüçîâàòåëÿ íåò â îíëàéíå èëè ýòîò íèê íå çàðåãèñòðèðîâàí
+ 1 - ïîëüçîâàòåëü íå èäåíòèôèöèðîâàí êàê âëàäåëåö íèêà
+ 2 - ïîëüçîâàòåëü èäåíòèôèöèðîâàí êàê âëàäåëåö íèêà ÷åðåç ñïèñîê õîñòìàñîê
+ 3 - ïîëüçîâàòåëü èäåíòèôèöèðîâàí êàê âëàäåëåö íèêà ÷åðåç èäåíòèôèêàöèþ ïàðîëåì
+
+ Âû ìîæåòå çàïðîñèòü ñòàòóñ ñðàçó ó 16 íèêîâ (ðàçäåëÿÿ èõ ïðîáåëîì),
+ âñå ëèøíèå áóäó ïðîèãíîðèðîâàíû. Åñëè ïàðàìåòð íå óêàçàí - êîìàíäà
+ âåðíåò âàø òåêóùèé ñòàòóñ íà ñåðâèñàõ.
+
+NICK_HELP_SENDPASS
+ Ñèíòàêñèñ: SENDPASS íèê
+
+ Îòïðàâëÿåò ïàðîëü íèêà íà email-àäðåñ, óêàçàííûé ïðè ðåãèñòðàöèè
+ ýòîãî ñàìîãî íèêà. Äàííàÿ êîìàíäà âåñüìà ïîëåçíà â ñëó÷àå "óòåðè"
+ ïàðîëÿ.
+
+ Ïðèìå÷àíèå: SENDPASS ìîæåò áûòü îãðàíè÷åí äëÿ èñïîëüçîâàíèÿ òîëüêî
+ IRC-îïåðàòîðàìè äàííîé ñåòè.
+ Ïðèìå÷àíèå 2: ïðè âêëþ÷åííîì øèôðîâàíèè ïàðîëåé ýòà êîìàíäà íåäîñòóïíà.
+
+NICK_HELP_CONFIRM
+ Ñèíòàêñèñ: CONFIRM auth-êîä
+
+ Äàííàÿ êîìàíäà íåîáõîäèìà, ÷òî áû çàâåðøèòü âòîðîé øàã ðåãèñòðàöèè
+ íèêà - ïîäòâåðæäåíèå. Ïîñëå âûïîëíåíèÿ äàííîãî òåðáîâàíèÿ, âàø íèê
+ áóäåò çàðåãèñòðèðîâàí íà %S.
+ Êîäîâàÿ ôðàçà, êîòîðàÿ óêàçûâàåòñÿ â êà÷åñòâå ïàðàìåòðà, âûñûëàåòñÿ
+ íà âàø e-mail â ïåðâîé ÷àñòè ïðîöåññà ðåãèñòðàöèè íèêà. Äëÿ áîëåå
+ ïîäðîáíîé èíôîðìàöèè ñì. %R%S HELP REGISTER
+
+NICK_HELP_RESEND
+ Ñèíòàêñèñ: RESEND
+
+ Êîìàíäà RESEND ïîçâîëÿåò çàíîâî âûñëàòü íîâûé auth-êîä (êîäîâóþ
+ ôðàçó) íà email-àäðåñ ïîëüçîâàòåëÿ, èñïîëüçóþùåãî ýòó êîìàíäó.
+
+NICK_SERVADMIN_HELP
+
+ Àäìèíèñòðàòîðû ñåðâèñîâ ìîãóò óäàëèòü ëþáîé íèê áåç èäåíòèôèêàöèè
+ ê íåìó, à òàê æå, ìîãóò ñìîòðåòü ñïèñîê äîñòóïà ëþáîãî íèêà
+ (áîëåå ïîäðîáíî ñì. %R%S ACCESS LIST íèê).
+
+NICK_SERVADMIN_HELP_LOGOUT
+ Ñèíòàêñèñ: LOGOUT [íèê [REVALIDATE]]
+
+ Èñïîëüçîâàííàÿ áåç ïàðàìåòðîâ, êîìàíäà LOGOUT ïðîèçâîäèò ýôôåêò,
+ îáðàòíûé ýôôåêòó êîìàíäû IDENTIFY, òî åñòü - äåèäåíòèôèöèðóåò âàñ
+ îò èñïîëüçóåìîãî íà äàííûé ìîìåíò íèêà. Òåì íå ìåíåå, ñåðâèñû íå
+ ïîøëþò ïîâòîðíûé çàïðîñ íà èäåíòèôèêàöèþ.
+
+ Åñëè â êà÷åñòâå ïàðàìåòðà âû óêàæåòå íèê - äåèäåíòèôèöèðóåò óêàçàííûé
+ íèê. Äîïîëíèòåëüíî óêàçàííûé ïàðàìåòð REVALIDATE çàñòàâèò ñåðâèñû
+ ïîñëàòü äåíäèíòèôèöèðîâàííîìó íèêó çàïðîñ íà ïåðåàâòîðèçàöèþ.
+ Èñïîëüçîâàòü ïàðàìåòðû íèê è REVALIDATE ìîãóò ëèøü Àäìèíèñòðàòîðû
+ ñåðâèñîâ.
+
+NICK_SERVADMIN_HELP_DROP
+ Ñèíòàêñèñ: DROP [íèê]
+
+ Áåç ïàðàìåòðîâ, óäàëÿåò Âàø íèê èç áàçû äàííûõ %S.
+
+ Ñ ïàðàìåòðîì, óäàëÿåò óêàçàííûé íèê èç áàçû äàííûõ. Âû ìîæåòå óäàëèòü
+ ëþáîé íèê èç âàøåé ãðóïïû, íå èìåÿ êàêèõ-ëèáî îñîáûõ ïðèâèëåãèé.
+ Óäàëèòü àáñîëþòíî ëþáîé íèê ìîãóò òîëüêî Àäìèíèñòðàòîðû ñåðâèñîâ.
+
+NICK_SERVADMIN_HELP_INFO
+
+ Àäìèíèñòðàòîðû ñåðâèñîâ ìîãó èñïîëüçîâàòü ïàðàìåòð ALL äëÿ ëþáîãî
+ íèêà.
+
+NICK_SERVADMIN_HELP_LIST
+ Ñèíòàêñèñ: LIST ìàñêà [FORBIDDEN] [SUSPENDED] [NOEXPIRE] [UNCONFIRMED]
+
+ Ïîêàçûâàåò ñïèñîê âñåõ çàðåãèñòðèðîâàííûõ íèêîâ, êîòîðûå ñîâïàäàþò
+ ñ óêàçàííîé â êà÷åñòâå îñíîâíîãî ïàðàìåòðà ìàñêîé. Ôîðìàò ìàñêè:
+ íèê!èäåíò@õîñò äîïóñòèìî èñïîëüçîâàíèå ïîäñòàíîâî÷íûõ ñèìâîëîâ.
+ Íèêè, ó êîòîðûõ âêëþ÷åíà îïöèÿ PRIVATE, áóäóò ïîêàçàíû òîëüêî
+ Àäìèíèñòðàòîðàì ñåðâèñîâ. Íèêè ñ âêëþ÷åííûì ïàðàìåòðîì NOEXPIRE
+ áóäóò ïîêàçàíû ñ ïðåôèêñîì !.
+
+  êà÷åñòâå äîïîëíèòåëüíûõ îïöèé êîìàíäû LIST âû ìîæåòå óêàçàòü
+ FORBIDDEN, SUSPENDED, NOEXPIRE èëè UNCONFIRMED. Ýòî ïîçâîëèò âàì
+ ïîëó÷èòü ñïèñîê íèêîâ, îòâå÷àþùèõ îïðåäåëåííûì êðèòåðèÿì, òàêèì êàê:
+ FORBIDDEN - íèêè, çàïðåùåííûå ê èñïîëüçîâàíèþ, SUSPENDED - íèêè,
+ "çàìîðîæåííûå" äî ïîðû äî âðåìåíè, UNCONFIRMED - íèêè, ðåãèñòðàöèÿ
+ êîòîðûõ âñå åùå íå ïîäòâåðæäåíà, è NOEXPIRE - íèêè, íàõîäÿùèåñÿ â
+ ðåæèìå "íå-èñòå÷åíèÿ". Åñëè óêàçàíû âñå ÷åòûðå îïöèè, òî âñå 4 òèïà
+ íèêîâ áóäóò ïåðå÷èñëåíû â ñïèñêå.
+
+ Ïðèìåðû:
+
+ LIST *!joeuser@foo.com
+ ïîêàæåò âñå íèêè, ìàñêà êîòîðûõ ñîâïàäàåò ñ joeuser@foo.com
+
+ LIST *Bot*!*@*
+ ïîêàæåò âñå çàðåãèñòðèðîâàííûå íèêè, êîòîðûå ñîäåðæàò ñëîâî
+ Bot (âíå çàâèñèìîñòè îò ðåãèñòðà).
+
+ LIST * NOEXPIRE
+ Ïîêàæåò âñå çàðåãèñòðèðîâàííûå íèêè ó êîòîðûõ âêëþ÷åíà îïöèÿ
+ NOEXPIRE.
+
+NICK_SERVADMIN_HELP_ALIST
+ Ñèíòàêñèñ: ALIST [íèê] [óðîâåíü]
+
+ Áåç ïàðàìåòðîâ, ïîêàæåò ñïèñîê êàíàëîâ, íà êîòîðûõ Âû ïðîïèñàíû.
+ Ñ ïåðâûì ïàðàìåòðîì, ïîêàæåò êàíàëû, íà êîòîðûõ ïðîïèñàí óêàçàííûé
+ íèê. Ñ îáîèìè ïàðàìåòðàìè, ïîêàæåò êàíàëû, ãäå ïðîïèñàí óêàçàííûé
+ íèê ñ óêàçàííûì óðîâíåì èëè âûøå.
+
+ Äëÿ èñïîëüçîâàíèÿ ýòîé êîìàíäû íåîáõîäèìû ïðàâà Àäìèíèñòðàòîðà ñåðâèñîâ.
+
+NICK_SERVADMIN_HELP_GLIST
+ Ñèíòàêñèñ: GLIST [íèê]
+
+ Áåç ïàðàìåòðîâ, ïîêàæåò ñïèñîê íèêîâ â âàøåé ãðóïïå. Ñ ïàðàìåòðîì,
+ ïîêàæåò âñå íèêè íàõîäÿùèåñÿ â ãðóïïå óêàçàííîãî íèêà.
+
+ Äëÿ èñïîëüçîâàíèÿ ýòîé êîìàíäû íåîáõîäèìû ïðàâà Àäìèíèñòðàòîðà ñåðâèñîâ.
+
+NICK_SERVADMIN_HELP_GETPASS
+ Ñèíòàêñèñ: GETPASS íèê
+
+ Ïîçâîëÿåò ïîëó÷èòü ïàðîëü óêàçàííîãî íèêà.
+ Ïðèìå÷àíèå: ñðàçó ïî èñïîëüçîâàíèè äàííîé êîìàíäû, ñåðâèñû ïîøëþò
+ ïî WALLOPS/GLOBOPS ñîîáùåíèå, ñîäåðæàùèå íèê èñïîëüçîâàâøåãî êîìàíäó,
+ è íèê, îòíîñèòåëüíî êîòîðîãî áûëà èñïîëüçîâàíà äàííàÿ êîìàíäà.
+ Îäíîâðåìåííî ñ ýòèì, ñîáûòèå áóäåò çàïèñàíî â ëîã-ôàéë.
+
+ Ïðèìå÷àíèå 2: êîìàíäà íåäîñòóïíà, åñëè âêëþ÷åíî øèôðîâàíèå ïàðîëåé.
+
+NICK_SERVADMIN_HELP_GETEMAIL
+ Ñèíòàêñèñ: GETEMAIL user@emailhost
+
+ Âûâîäèò ñïèñîê íèêîâ, â íàñòðîéêàõ ó êîòîðûõ ñòîèò óêàçàííûé email.
+ Ïðèìå÷àíèå: âû íå ìîæåòå èñïîëüçîâàòü ñèìâîëüíûå ìàñêè íè äëÿ user,
+ íè äëÿ emailhost. Êàæäûé ðàç, ïðè èñïîëüçîâàíèè äàííîé êîìàíäû,
+ ñîîáùåíèå, âêëþ÷àþùåå íèê âûçâàâøåãî êîìàíäó è óêàçàííûé email,
+ áóäåò çàïèñàíî â ëîã-ôàéë ñåðâèñîâ.
+
+NICK_SERVADMIN_HELP_FORBID
+ Ñèíòàêñèñ: FORBID íèê [ïðè÷èíà]
+
+ Çàïðåùàåò ðåãèñòðèðîâàòü è/èëè èñïîëüçîâàòü óêàçàííûé íèê. Ýôôåêò
+ çàïðåòà ìîäåò áûòü ñíÿò ïóòåì óäàëåíèÿ íèêà (DROP).
+
+  íåêîòîðûõ ñåòÿõ, ïðè÷èíà ÿâëÿåòñÿ îáÿçàòåëüíûì ïàðàìåòðîì.
+
+NICK_SERVADMIN_HELP_SUSPEND
+ Ñèíòàêñèñ: SUSPEND íèê ïðè÷èíà
+
+ Óñòàíàâëèâàåò ðåæèì ñàñïåíäà ("çàìîðîçêè") íà íèê, ïðåäîòâðàùàÿ òåì
+ ñàìûì âîçìîæíîñòü èäåíòèôèêàöèè ê íåìó èëè èñïîëüçîâàíèÿ.
+ Ïðèìå÷àíèå: â ðåæèìå ñàñïåíäà íèê èñêëþ÷åí èç óñëîâèé èñòå÷åíèÿ ïî
+ âðåìåíè.
+
+NICK_SERVADMIN_HELP_UNSUSPEND
+ Syntax: UNSUSPEND íèê
+
+ Îñâîáîæäàåò íèê èç ðåæèìà ñàñïåíäà (çàìîðîçêè).
+
+###########################################################################
+#
+# ChanServ help messages
+#
+###########################################################################
+
+CHAN_HELP_CMD_GETPASS
+ GETPASS Çàïðîñ ïàðîëÿ îò êàíàëà
+CHAN_HELP_CMD_FORBID
+ FORBID Óñòàíîâêà çàïðåòà íà èñïîëüçîâàíèå/ðåãèñòðàöèþ êàíàëà
+CHAN_HELP_CMD_SUSPEND
+ SUSPEND Ïðèîñòàíîâêà ðàáîòû êàíàëà, ñ ñîõðàíåíèåì âñåõ äàííûõ
+ è íàñòðîåê êàíàëà
+CHAN_HELP_CMD_UNSUSPEND
+ UNSUSPEND Ñíÿòèå ðåæèìà ñàñïåíäà ñ êàíàëà (âîññòàíîâëåíèå)
+CHAN_HELP_CMD_STATUS
+ STATUS Âîçâðàùàåò òåêóùèé óðîâåíü äîñòóïà äëÿ óêàçàííîãî
+ ïîëüçîâàòåëÿ íà óêàçàííîì êàíàëå
+CHAN_HELP_CMD_REGISTER
+ REGISTER Ðåãèñòðàöèÿ êàíàëà
+CHAN_HELP_CMD_IDENTIFY
+ IDENTIFY Èäåíòèôèöèêàöèÿ ê êàíàëó â êà÷åñòâå âëàäåëüöà
+CHAN_HELP_CMD_SET
+ SET Íàñòðîéêà ðàçëè÷íûõ îïöèé êàíàëà
+CHAN_HELP_CMD_AOP
+ AOP Óïðàâëåíèå ñïèñêîì AOP'îâ êàíàëà
+CHAN_HELP_CMD_SOP
+ SOP Óïðàâëåíèå ñïèñêîì SOP'îâ êàíàëà
+CHAN_HELP_CMD_ACCESS
+ ACCESS Óïðàâëåíèå ACCESS-ñïèñêîì ïðèâèëåãèé êàíàëà
+CHAN_HELP_CMD_LEVELS
+ LEVELS Ïåðåóñòàíîâêà çíà÷åíèÿ óðîâíåé äîñòóïà êàíàëà
+CHAN_HELP_CMD_AKICK
+ AKICK Óïðàâëåíèå ñïèñêîì àâòîêèêîâ êàíàëà
+CHAN_HELP_CMD_DROP
+ DROP Óäàëåíèå êàíàëà èç áàçû äàííûõ ñåðâèñîâ
+CHAN_HELP_CMD_SENDPASS
+ SENDPASS Âîññòàíîâëåíèå 'çàáûòîãî' ïàðîëÿ îò êàíàëà
+CHAN_HELP_CMD_BAN
+ BAN Óñòàíîâêà áàíà íà êàíàëå
+CHAN_HELP_CMD_CLEAR
+ CLEAR Î÷èñòêà îïðåäåëåííûõ ðåæèìîâ êàíàëà
+CHAN_HELP_CMD_DEVOICE
+ DEVOICE Ñíÿòèå ðåæèìà âîéñà (-v) ñ óêàçàííîãî íèêà íà êàíàëå
+CHAN_HELP_CMD_GETKEY
+ GETKEY Çàïðîñ óñòàíîâëåííîãî íà êàíàëå êëþ÷à (+k)
+CHAN_HELP_CMD_INFO
+ INFO Çàïðîñ èíôîðìàöèè îá óêàçàííîì êàíàëå
+CHAN_HELP_CMD_INVITE
+ INVITE Çàñòàâëÿåò ñåðâèñû ïðèãëàñèòü âàñ íà óêàçàííûé êàíàë.
+CHAN_HELP_CMD_KICK
+ KICK Âûêèäûâàåò óêàçàííîãî ïîëüçîâàòåëÿ ñ êàíàëà
+CHAN_HELP_CMD_LIST
+ LIST Çàïðîñ ñïèñêà âñåõ çàðåãèñòðèðîâàííûõ êàíàëîâ
+CHAN_HELP_CMD_LOGOUT
+ LOGOUT Äåèäåíòèôèêàöèÿ óêàçàííîãî ïîëüçîâàòåëÿ îò êàíàëà
+CHAN_HELP_CMD_OP
+ OP Óñòàíîâêà ñòàòóñà îïåðàòîðà (+o) óêàçàííîìó íèêó íà êàíàëå
+CHAN_HELP_CMD_TOPIC
+ TOPIC Óñòàíîâêà òîïèêà íà êàíàëå ïîñðåäñòâîì ñåðâèñîâ
+CHAN_HELP_CMD_UNBAN
+ UNBAN Óäàëåíèå íà êàíàëå âñåõ áàíîâ, êîòîðûå íå ïîçâîëÿþò âàì âîéòè
+CHAN_HELP_CMD_VOICE
+ VOICE Óñòàíîâêà ñòàòóñà âîéñà (+v) óêàçàííîìó íèêó íà êàíàëå
+CHAN_HELP_CMD_VOP
+ VOP Óïðàâëåíèå ñïèñêîì VOP'îâ êàíàëà
+CHAN_HELP_CMD_DEHALFOP
+ DEHALFOP Ñíÿòèå ðåæèìà ïîëóîïåðàòîðà (-h) ñ óêàçàííîãî íèêà íà êàíàëå
+CHAN_HELP_CMD_DEOWNER
+ DEOWNER Ñíèìàåò ñ âàñ ñòàòóñ âëàäåëüöà êàíàëà
+CHAN_HELP_CMD_DEPROTECT
+ DEPROTECT Ñíÿòèå ðåæèìà çàùèòû (+a) ñ óêàçàííîãî íèêà íà êàíàëå
+CHAN_HELP_CMD_HALFOP
+ HALFOP Óñòàíîâêà ñòàòóñà ïîëóîïåðàòîðà (+h) óêàçàííîìó íèêó íà êàíàëå
+CHAN_HELP_CMD_HOP
+ HOP Óïðàâëåíèå ñïèñêîì HOP'îâ êàíàëå
+CHAN_HELP_CMD_OWNER
+ OWNER Çàïðîñ ñòàòóñà âëàäåëüöà íà êàíàëå
+CHAN_HELP_CMD_PROTECT
+ PROTECT Óñòàíîâêà ðåæèìà çàùèòû (+a) óêàçàííîìó íèêó íà êàíàëå
+CHAN_HELP_CMD_ADMIN
+ ADMIN Óñòàíîâêà ñòàòóñà àäìèíèñòðàòîðà (+a) óêàçàííîìó íèêó íà êàíàëå
+CHAN_HELP_CMD_DEADMIN
+ DEADMIN Ñíÿòèå ðåæèìà àäìèíèñòðàòîðà (-a) ñ óêàçàííîãî íèêà íà êàíàëå
+CHAN_HELP_CMD_DEOP
+ DEOP Ñíÿòèå ðåæèìà îïåðàòîðà (-o) ñ óêàçàííîãî íèêà íà êàíàëå
+
+CHAN_HELP
+ %S ïîçâîëÿåò âàì ðåãèñòðèðîâàòü êàíàë è óïðàâëÿòü åãî ðàçëè÷íûìè
+ íàñòðîéêàìè. Òàêæå, %S ïîìîæåò âàì îáåçîïàñèòü âàø êàíàë îò
+ çëîíàìåðåííûõ ïîëüçîâàòåëåé, æåëàþùèõ åãî "çàõâàòèòü", èñïîëüçóÿ
+ îãðàíè÷åíèå âîçìîæíîñòè ïîëó÷åíèÿ ñòàòóñà îïà íà êàíàëå è äðóãèå
+ íàñòðîéêè áåçîïàñíîñòè. Ñïèñîê äîñòóïíûõ êîìàíä ïðåäñòàâëåí íèæå,
+ ÷òîáû èñïîëüçîâàòü èõ, ïîøëèòå çàïðîñ âèäà
+ %R%S êîìàíäà
+ Äëÿ áîëåå ïîäðîáíîé èíôîðìàöèè î êîíêðåòíîé êîìàíäå, âîñïîëüçóéòåñü:
+ %R%S HELP êîìàíäà
+
+
+CHAN_HELP_EXPIRES
+
+ Ïîìíèòå, ÷òî ëþáîé êàíàë, íå èñïîëüçóþùèéñÿ â òå÷åíèå %d äíåé
+ (ò.å. íè îäèí ïîëüçîâàòåëü, ïðîïèñàííûé â ñïèñêå äîñòóïà êàíàëà,
+ íå ïîñåòèò êàíàë â òå÷åíèè äàííîãî âðåìåíè), áóäåò àâòîìàòè÷åñêè
+ óäàëåí èç áàçû äàííûõ ñåðâèñîâ.
+
+CHAN_HELP_REGISTER
+ Ñèíòàêñèñ: REGISTER #êàíàë ïàðîëü îïèñàíèå
+
+ Ðåãèñòðèðóåò êàíàë â áàçå äàííûõ %S. ×òîáû èñïîëüçîâàòü ýòó
+ êîìàíäó, âû äîëæíû áûòü îïåðàòîðîì òîãî êàíàëà, êîòîðûé âû ïûòàåòåñü
+ çàðåãèñòðèðîâàòü. Óêàçàííûé ïðè ðåãèñòðàöèè ïàðîëü ìîæíî èñïîëüçîâàòü
+ (êîìàíäîé IDENTIFY) äëÿ ïîëó÷åíèÿ äîñòóïà ê êàíàëó è åãî ðàçëè÷íûì
+ íàñòðîéêàì.
+ Ïîñëåäíèé ïàðàìåòð îïèñàíèå, êîòîðûé îáÿçàòåëüíî äîëæåí áûòü
+ óêàçàí, ÿâëÿåòñÿ îïèñàíèåì êàíàëà è/èëè, âîçìîæíî, åãî òåìàòèêîé.
+
+ Ñðàçó ïîñëå ðåãèñòðàöèè êàíàëà, âû áóäåòå àâòîìàòè÷åñêè âíåñåíû â
+ ñïèñîê äîñòóïà ñ óðîâåíåì founder (îñíîâàòåëü, âëàäåëåö). Âëàäåëåö
+ êàíàëà èìååò âîçìîæíîñòü èçìåíÿòü ëþáûå åãî íàñòðîéêè, à òàê æå,
+ àâòîìàòè÷åñêè ïîëó÷àòü ñòàòóñ îïïåðàòîðà îò %S ïðè çàõîäå
+ íà êàíàë.
+ Ïîìèìî âñåãî ýòîãî, êàê âëàäåëåö, âû ìîæåòå âîñïîëüçîâàòüñÿ êîìàíäîé
+ ACCESS, ÷òî áû íàçíà÷èòü äîïîëíèòåëüíûõ îïåðàòîðîâ êàíàëà, ò. í.
+ àäìèíèñòðàöèþ. Áîëåå ïîäðîáíóþ èíôîðìàöèþ î ñèñòåìå ïðèâåëåãèé âû
+ ìîæåòå ïîëó÷èòü ïî êîìàíäå %R%S HELP ACCESS
+
+ Ïðèìå÷àíèå: ó÷òèòå, ÷òî ïåðåä òåì êàê ðåãèñòðèðîâàòü ñâîé êàíàë, âû
+ äîëæíû ñïåðâà çàðåãèñòðèðîâàòü ñâîé íèê. Áîëåå ïîäðîáíàÿ èíôîðìàöèÿ
+ î òîì, êàê ðåãèñòðèðîâàòü íèê, äîñòóïíà ïî %R%s HELP
+
+CHAN_HELP_IDENTIFY
+ Ñèíòàêñèñ: IDENTIFY #êàíàë ïàðîëü
+
+ Ïîçâîëÿåò èäåíòèôèöèðîâàòüñÿ íà %S â êà÷åñòâå âëàäåëüöà
+ óêàçàííîãî êàíàëà. Ìíîãèå êîìàíäû ïî óïðàâëåíèþ êàíàëîì íåäîñòóïíû
+ äî òåõ ïîð, ïîêà âû íå èäåíòèôèöèðóåòåñü ê êàíàëó.  êà÷åñòâå ïàðîëÿ
+ íåîáõîäèìî óêàçûâàòü òîò ñàìûé ïàðîëü, êîòîðûé âû óêàçûâàëè ïðè
+ ðåãèñòðàöèè âàøåãî êàíàëà.
+ Ïðèìå÷àíèå: âàì íåîáÿçàòåëüíî èäåíòèôèöèðîâàòüñÿ ê êàíàëó, åñëè âû
+ åãî ðåàëüíûé âëàäåëåö, äîñòàòî÷íî ïðîñòî èäåíòèôèöèðîâàòüñÿ ê íèêó.
+
+CHAN_HELP_LOGOUT
+ Ñèíòàêñèñ: LOGOUT #êàíàë íèê
+
+ Äàííàÿ êîìàíäà ïîçâîëÿåò äåèäåíòèôèöèðîâàòü ëþáîé íèê, êîòîðûé
+ ñ ïîìîùüþ ïàðîëÿ èäåíòèôèöèðîâàëñÿ ê êàíàëó â êà÷åñòâå âëàäåëåöà.
+
+ Åñëè âû ÿâëÿåòåñü ðåàëüíûì âëàäåëüöåì êàíàëà, ó âàñ åñòü âîçìîæíîñòü
+ äåèäåíòèôèöèðîâàòü êîãî óãîäíî, â èíîì ñëó÷àå - òîëüêî ñåáÿ.
+
+CHAN_HELP_DROP
+ Ñèíòàêñèñ: DROP #êàíàë
+
+ Óäàëÿåò óêàçàííûé êàíàë èç áàçû äàííûõ ñåðâèñîâ. Èñïîëüçîâàòü DROP
+ ìîæåò ëèøü âëàäåëåö êàíàëà, ïðåäâàðèòåëüíî ïðîèäåíòèôèöèðîâàâøèñü
+ ê íåìó ñ ïîìîùüþ êîìàíäû IDENTIFY.
+
+CHAN_HELP_SET
+ Ñèíòàêñèñ: SET #êàíàë îïöèÿ ïàðàìåòð
+
+ Ïîçâîëÿåò âëàäåëüöó êàíàëà ìåíÿòü ðàçëè÷íûå íàñòðîéêè êàíàëà.
+ Äîñòóïíûå îïöèè:
+
+ FOUNDER ñìåíà âëàäåëüöà êàíàëà
+ SUCCESSOR óñòàíîâêà íàñëåäíèêà êàíàëà
+ PASSWORD ñìåíà ïàðîëÿ êàíàëà
+ DESC èçìåíåíèå îïèñàíèÿ êàíàëà
+ URL óñòàíîâêà URL-àäðåñà êàíàëà
+ EMAIL óñòàíîâêà Email-àäðåñà êàíàëà
+ ENTRYMSG óñòàíîâêà àâòîñîîáùåíèÿ ïðè âõîäå íà êàíàë
+ BANTYPE óñòàíîâêà òèïà áàíà ñåðâèñàìè íà êàíàëå
+ MLOCK áëîêèðîâêà îïðåäåëåííûõ ðåæèìîâ êàíàëà
+ KEEPTOPIC àêòèâèðîâàíèå àâòîñîõðàíåíèÿ òîïèêà êàíàëà
+ OPNOTICE àêòèâèðîâàíèå óâåäîìëåíèé îá èñïîëüçîâàíèè
+ êîìàíä OP/DEOP
+ PEACE àêòèâèðîâàíèå ðåæèìà "ñïîêîéñòâèÿ" íà êàíàëå
+ PRIVATE ñêðûòèå êàíàëà â ñïèñêå êàíàëîâ âûâîäèìûõ ïî LIST
+ RESTRICTED îãðàíè÷åíèå óðîâíÿ äîñòóïà íà êàíàë äî ïðîïèñàííûõ
+ SECURE äîïîëíèòåëüíûå âîçìîæíîñòè %S'à ïî áåçîïàñíîñòè
+ SECUREOPS êîíòðîëü çà ïîëó÷åíèåì ñòàòóñà îïåðàòîðà êàíàëà
+ SECUREFOUNDER îãðàíè÷åíèå íà ïîëó÷åíèå ñòàòóñà âëàäåëüöà êàíàëà
+ SIGNKICK íàñòðîéêà ðåæèìà "ïîäïèñàííûõ êèêîâ"
+ TOPICLOCK áëîêèðîâêà òîïèêà êàíàëà îò èçìåíåíèé åãî êåì-ëèáî
+ XOP íàñòðîéêà ñèñòåìû ïðèâèëåãèé êàíàëà
+
+ Äëÿ áîëåå ïîäðîáíîé èíôîðìàöèè î êàêîé-ëèáî êîíêðåòíîé îïöèè, ñì.
+ ñïðàâêó ïî %R%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 [àäðåñ]
+
+ Ïîçâîëÿåò óñòàíîâèòü URL-àäðåñ êàíàëà. Äàííûé URL áóäåò ïîêàçàí
+ òîãäà, êîãäà êòî-ëèáî çàïðîñèò èíôîðìàöèþ î êàíàëå ñ ïîìîùüþ
+ êîìàíäû INFO. ×òîáû óäàëèòü óñòàíîâëåííûé URL-àäðåñ, èñïîëüçóéòå
+ äàííóþ êîìàíäó áåç ïàðàìåòðà.
+
+CHAN_HELP_SET_EMAIL
+ Ñèíòàêñèñ: SET #êàíàë EMAIL [àäðåñ@ïî÷òû]
+
+ Ïîçâîëÿåò óñòàíîâèòü àäðåñ ýëåêòðîííîé ïî÷òû êàíàëà. Ýòîò àäðåñ
+ áóäåò ïîêàçàí òîãäà, êîãäà êòî-ëèáî çàïðîñèò èíôîðìàöèþ î êàíàëå
+ ñ ïîìîùüþ êîìàíäû INFO. ×òîáû óäàëèòü óñòàíîâëåííûé email-àäðåñ,
+ èñïîëüçóéòå äàííóþ êîìàíäó áåç ïàðàìåòðà.
+
+CHAN_HELP_SET_ENTRYMSG
+ Ñèíòàêñèñ: SET #êàíàë ENTRYMSG [òåêñò]
+
+ Ïîçâîëÿåò óñòàíîâèòü "ñîîáùåíèå ïðè âõîäå", êîòîðîå áóäåò
+ îòïðàâëåíî íîòèñîì (notice) êàæäîìó âîøåäøåìó íà êàíàë ïîëüçîâàòåëþ.
+ Åñëè èñïîëüçîâàòü êîìàíäó áåç ïàðàìåòðîâ - òåêóùåå óñòàíîâëåííîå
+ ñîîáùåíèå áóäåò óäàëåíî.
+
+CHAN_HELP_SET_BANTYPE
+ Ñèíòàêñèñ: SET #êàíàë BANTYPE òèï_áàíà
+
+ Ïîçâîëÿåò óñòàíîâèòü øàáëîí áàíìàñêè, ïî êîòîðîé áóäåò çàáàíåí
+ ïîëüçîâàòåëü êàíàëà, îòíîñèòåëüíî êîòîðîãî ïðèìåíÿåòñÿ ñåðâèñíàÿ
+ êîìàíäà BAN.
+
+ Çíà÷åíèå òèïà áàíà äîëæíî áûòü êîêðåòíûì ÷èñëîì, îò 0 äî 3
+ âêëþ÷èòåëüíî. Äîïóñòèìûå çíà÷åíèÿ ïðåäñòàâëåíû íèæå:
+
+ 0 - áàí âèäà *!èäåíò@õîñò
+ 1 - áàí âèäà *!*èäåíò@õîñò
+ 2 - áàí âèäà *!*@õîñò
+ 3 - áàí âèäà *!*èäåíò@*.äîìåí
+
+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 ðåæèìû
+
+ MLOCK ïîçâîëÿåò âàì óñòàíîâèòü è çàáëîêèðîâàòü îïðåäåëåííûå ðåæèìû
+ êàíàëà. Âû ìîæåòå çàáëîêèðîâàòü îò ñíÿòèÿ/óñòàíîâêè ëþáûå ðåæèìû,
+ êàêèå òîëüêî çàõîòèòå - %S íèêîìó íå ïîçâîëèò èçìåíèòü èõ.
+
+  êà÷åñòâå ïàðàìåòðà êîìàíäû, âû äîëæíû óêàçàòü ðåæèìû â òîì æå
+ ôîðìàòå, â êîòîðîì óêàçûâàåòå ïðè ðó÷íîé óñòàíîâêå, ñ ïîìîùüþ
+ êîìàíäû /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'à êàê BAN,
+ OP, DEOP, KICK è ò. ä. îòíîñèòåëüíî òåõ, êòî âûøå èëè ðàâåí ïî
+ ñòàòóñó îòíîñèòåëüíî èñïîëüçóþùåãî.
+ Ïðèìå÷àíèå: òåì íå ìåíåå ëþáîé, èìåþùèé äîñòóï ê ýòèì êîìàíäàì,
+ ñìîæåò èñïîëüçîâàòü èõ îòíîñèòåëüíî ñåáÿ.
+
+CHAN_HELP_SET_PRIVATE
+ Ñèíòàêñèñ: SET #êàíàë PRIVATE {ON | OFF}
+
+ Àêòèâèðóåò/äåàêòèâèðóåò îïöèþ ïðèâàòíîñòè êàíàëà. Äàííûé ðåæèì
+ ïîçâîëÿåò ñêðûòü âàø êàíàë â ñïèñêå êàíàëîâ ïî %R%S LIST.
+
+CHAN_HELP_SET_RESTRICTED
+ Ñèíòàêñèñ: SET #êàíàë RESTRICTED {ON | OFF}
+
+ Àêòèâèðóåò/äåàêòèâèðóåò îãðàíè÷åííûé äîñòóï íà êàíàë. Äàííûé ðåæèì
+ ïîçâîëÿåò çàïðåòèòü äîñòóï íà êàíàë âñåì òåì ïîëüçîâàòåëÿì, êîòîðûå
+ íå ÷èñëÿòñÿ â ñïèñêå äîñòóïà êàíàëà.
+
+CHAN_HELP_SET_SECURE
+ Ñèíòàêñèñ: SET #êàíàë SECURE {ON | OFF}
+
+ Àêòèâèðóåò/äåàêòèâèðóåò ðåæèì áåçîïàñíîñòè äëÿ êàíàëà.
+ Êîãäà SECURE âêëþ÷åíî, òîëüêî ïîëüçîâàòåëè ñ çàðåãèñòðèðîâàííûìè
+ íèêàìè, ïðîèäåíòèôèöèðîâàâøèåñÿ ê íèì ÷åðåç ïàðîëü è âêëþ÷åííûå â
+ ñïèñîê äîñòóïà êàíàëà, ñìîãóò çàïðîñèòü ñòàòóñ íà êàíàëå ñ ïîìîùüþ
+ %S.
+ Åñëè áåçîïàñíîñòü îòêëþ÷åíà, ïîëüçîâàòåëè, ïðîïèñàííûå íà êàíàëå,
+ ñìîãóò çàïðîñèòü ñòàòóñ äàæå åñëè èìåþò àâòîðèçàöèþ ê ñâîåìó íèêó
+ âñåãî ëèøü ÷åðåç ñïèñîê ìàñîê íà %s.
+
+CHAN_HELP_SET_SECUREOPS
+ Ñèíòàêñèñ: SET #êàíàë SECUREOPS {ON | OFF}
+
+ Àêòèâèðóåò/äåàêòèâèðóåò ðåæèì îãðàíè÷åíèÿ íà ïîëó÷åíèå ñòàòóñà
+ îïåðàòîðà êàíàëà. Äàííûé ðåæèì ïîçâîëÿåò çàïðåòèòü âîçìîæíîñòü
+ ïîëó÷åíèÿ ñòàòóñà îïà òåì ïîëüçîâàòåëÿì, êîòîðûå íå ïðèñóòñòâóþò
+ â ñïèñêå äîñòóïà êàíàëà èëè ïðàâà êîòîðûõ íå ñîîòâåòñòâóþò
+ ïîëó÷àåìîìó ñòàòóñó.
+
+CHAN_HELP_SET_SECUREFOUNDER
+ Ñèíòàêñèñ: SET #êàíàë SECUREFOUNDER {ON | OFF}
+
+ Àêòèâèðóåò/äåàêòèâèðóåò ðåæèì áåçîïàñíîñòè âëàäåëüöà íà êàíàëå.
+ Àêòèâèðîâàíèå SECUREFOUNDER ïîçâîëÿåò âàì îãðàíè÷èòü âîçìîæíîñòü
+ óäàëåíèÿ êàíàëà, èçìåíåíèÿ åãî ïàðîëÿ, âëàäåëüöà èëè íàñëåäíèêà äî
+ ðåàëüíîãî âëàäåëüöà, ïðîïèñàííîãî â ãðàôå Founder (Âëàäåëåö êàíàëà).
+ (è íå âàæíî, êòî òàì èäåíòèôèöèðîâàëñÿ ê êàíàëó ÷åðåç %S ID).
+
+CHAN_HELP_SET_SIGNKICK
+ Ñèíòàêñèñ: SET #êàíàë SIGNKICK {ON | LEVEL | OFF}
+
+ Âêëþ÷àåò èëè âûêëþ÷àåò îïöèþ "ïîäïèñàííûõ êèêîâ" íà êàíàëå.
+ Àêòèâèðîâàíèå ðåæèìà SIGNKICK çàñòàâèò %S àâòîìàòè÷åñêè
+ äîáàâëÿòü ê ïðè÷èíå êèêà íèê òîãî, êòî èñïîëüçîâàë êîìàíäó KICK.
+
+  êà÷åñòâå äîïîëíèòåëüíîãî ïàðàìåòðà äëÿ îïöèè SIGNKICK âû ìîæåòå
+ óêàçàòü çíà÷åíèå LEVEL. Ýòî ïîçâîëèò áîëåå òîíêî ëèìèòèðîâàòü
+ äåéñòâèå äàííîãî ðåæèìà, ïðè óñëîâèè êîíå÷íî, ÷òî âû èñïîëüçóåòå
+ ñèñòåìó LEVELS íà êàíàëå (ñì. %R%S HELP LEVELS äëÿ
+ áîëåå ïîäðîáíîé èíôîðìàöèè).
+
+CHAN_HELP_SET_XOP
+ Ñèíòàêñèñ: SET #êàíàë XOP {ON | OFF}
+
+ Ïîçâîëÿåò àêòèâèðîâàòü/äåàêòèâèðîâàòü ñèñòåìó ïðèâåëåãèé xOP íà
+ âàøåì êàíàëå. Îñîáåííîñòè äàííîé ñèñòåìû ñîñòîÿò â òîì, ÷òî âñå
+ ìàíèïóëÿöèè ñî ñïèñêîì äîñòóïà êàíàëà ïðîèçâîäÿòñÿ ïîñðåäñòâîì
+ èñïîëüçîâàíèÿ ãîòîâûõ øàáëîíîâ: SOP, AOP, HOP è VOP. ×òîáû
+ âíåñòè êàêèå-ëèáî èçìåíåíèÿ â ñïèñîê äîñòóïà, âàì äîñòàòî÷íî
+ èñïîëüçîâàòü îäíîèìåííûå êîìàíäû, âìåñòî òîãî, ÷òî áû ðàçáèðàòüñÿ
+ â ìíîãîóðîâíåâîé ñèñòåìå LEVELS.
+
+ Ïðèìå÷àíèå: êîãäà âû ïåðåêëþ÷èòåñü ñ ñèñòåìû ACCESS íà ñèñòåìó
+ ïðèâèëåãèé xOP, âñå âàøè ïðåäûäóùèå óñòàíîâêè óðîâíåé äëÿ êàíàëà
+ è óðîâíè äîñòóïà ïîëüçîâàòåëåé áóäóò èçìåíåíû íà ñòàíäàðòíûå è âû
+ íèêàê íå ñìîæåòå âåðíóòü ýòè çíà÷åíèÿ, ïåðåêëþ÷èâøèñü îáðàòíî íà
+ ñèñòåìó ïðèâèëåãèé ACCESS!
+
+ Ïîñëå ïåðåõîäà ñ ñèñòåìû ACCESS íà ñèñòåìó xOP, óäîñòîâåðüòåñü, ÷òî
+ ó âñåõ âàøèõ ïîëüçîâàòåëåé, ïðîïèñàííûõ íà êàíàëå, âûñòàâëåí íóæíûé
+ óðîâåíü äîñòóïà, èáî ïåðåõîä èç ACCESS â xOP íå âñåãäà ïðîèñõîäèò
+ òàê, êàê íóæíî. Áîëåå òîãî, åñëè âû óæå íàñòðîèëè îïðåäåëåííûå
+ çíà÷åíèÿ LEVELS äëÿ âàøåãî êàíàëà, èçìåíÿòü ñèñòåìó ïðèâèëåãèé íà
+ xOP-ñîâìåñòèìóþ íå ðåêîìåíäóåòñÿ.
+
+ Ïåðåêëþ÷åíèå èç ñèñòåìû xOP â ñèñòåìó ACCESS îáû÷íî ïðîõîäèò áåç
+ êàêèõ-ëèáî ïðîáëåì.
+
+CHAN_HELP_SET_OPNOTICE
+ Ñèíòàêñèñ: SET #êàíàë OPNOTICE {ON | OFF}
+
+ Âêëþ÷àåò èëè âûêëþ÷àåò îïöèþ OP-óâåäîìëåíèÿ íà âàøåì êàíàëå.
+ Êîãäà îï-óâåäîìëåíèå âêëþ÷åíî, %S áóäåò ïîñûëàòü íîòèñ
+ íà êàíàë êàæäûé ðàç, êîãäà êòî-ëèáî èñïîëüçóåò êîìàíäû OP/DEOP.
+
+CHAN_HELP_AOP
+ Ñèíòàêñèñ: AOP #êàíàë ADD íèê
+ AOP #êàíàë DEL {íèê | íîìåð_çàïèñè | ñïèñîê_çàïèñåé}
+ AOP #êàíàë LIST [ìàñêà | ñïèñîê_çàïèñåé]
+ AOP #êàíàë CLEAR
+
+ Ïîçâîëÿåò óïðàâëÿòü ñïèñêîì AOP'îâ (àâòîïåðàòîðîâ) âàøåãî êàíàëà.
+ Ïðèâèëåãèè AOP'à äàþò ïîëüçîâàòåëþ âîçìîæíîñòü ïîëó÷èòü ñòàòóñ îïà
+ ñðàçó ïðè âõîäå íà êàíàë, âîçìîæíîñòü óñòàíàâëèâàòü/ñíèìàòü áàíû
+ ïîñðåäñòâîì ñåðâèñîâ, ïðèãëàøàòü ñåáÿ íà êàíàë, çàïðàøèâàòü êëþ÷
+ êàíàëà è ìíîãîå äðóãîå.
+
+ Êîìàíäà AOP ADD äîáàâëÿåò óêàçàííûé íèê â ñïèñîê AOP'îâ.
+
+ Êîìàíäà AOP DEL óäàëÿåò óêàçàííûé íèê èç ñïèñêà AOP'îâ.  êà÷åñòâå
+ ïàðàìåòðà âû ìîæåòå óêàçàòü íå òîëüêî íèê, íî è êîíêðåòíûé íîìåð
+ çàïèñè èëè ñïèñîê çàïèñåé (ñì. ïðèìåðû èñïîëüçîâàíèÿ LIST íèæå).
+
+ Êîìàíäà AOP LIST âûâîäèò òåêóùèé ñïèñîê AOP'îâ êàíàëà.  êà÷åñòâå
+ äîïîëíèòåëüíîãî ïàðàìåòðà âû ìîæåòå óêàçàòü ñèìâîëüíóþ ìàñêó, ÷òî
+ ïîçâîëèò âàì ïîëó÷èòü ñïèñîê ñ êîíêðåòíûìè íèêàìè, ïîïàäàþùèìè ïîä
+ ýòó ìàñêó, èëè æå, âû ìîæåòå óêàçàòü ñïèñîê çàïèñåé.
+
+ Íàïðèìåð:
+
+ AOP #êàíàë LIST 2-5,7-9
+ îòîáðàçèò âñå çàïèñè ñî 2-îé ïî 5-óþ, è ñ 7-îé ïî 9-þ.
+
+ AOP #êàíàë LIST *vas*
+ îòîáðàçèò âñå çàïèñè, êîòîðûå ñîäåðæàò ïîäñòðîêó "vas"
+
+ Êîìàíäà AOP CLEAR ïîçâîëÿåò ïîëíîñòüþ î÷èñòèòü ñïèñîê AOP'îâ.
+
+ Êîìàíäû AOP ADD è AOP DEL ìîãóò èñïîëüçîâàòü òîëüêî SOP'û êàíàëà
+ èëè âëàäåëåö, êîìàíäó AOP CLEAR ìîæåò èñïîëüçîâàòü òîëüêî âëàäåëåö.
+ Êîìàíäà AOP LIST äîñòóïíà ëþáîìó ïîëüçîâàòåëþ èç ñïèñêà AOP'îâ.
+
+ Ïîìíèòå, ÷òî äàííàÿ êîìàíäà ðàáîòàåò òîëüêî â ñëó÷àå èñïîëüçîâàíèÿ
+ ñèñòåìû ïðèâèëåãèé xOP. Åñëè âû èñïîëüçóåòå ñèñòåìó LEVELS, âñå
+ èçìåíåíèÿ ñïèñêà äîñòóïà êàíàëà äîëæíû ïðîèçâîäèòñÿ ïîñðåäñòâîì
+ êîìàíäû ACCESS. Äëÿ áîëåå ïîäðîáíîé èíôîðìàöèè ïî èñïîëüçîâàíèþ
+ êîìàíäû ACCESS è ñèñòåìû ïðèâèëåãèé xOP ñì. ñïðàâî÷íóþ èíôîðìàöèþ
+ ïî %R%S HELP ACCESS è %R%S HELP SET XOP.
+
+CHAN_HELP_HOP
+ Ñèíòàêñèñ: HOP #êàíàë ADD íèê
+ HOP #êàíàë DEL {íèê | íîìåð_çàïèñè | ñïèñîê_çàïèñåé}
+ HOP #êàíàë LIST [ìàñêà | ñïèñîê_çàïèñåé]
+ HOP #êàíàë CLEAR
+
+ Ïîçâîëÿåò óïðàâëÿòü ñïèñêîì HOP'îâ (ïîëóîïåðàòîðîâ) âàøåãî êàíàëà.
+ Ïðèâèëåãèè HOP'à äàþò ïîëüçîâàòåëþ âîçìîæíîñòü ïîëó÷èòü ñòàòóñ õîïà
+ ñðàçó ïðè âõîäå íà êàíàë, èëè çàïðîñèòü åãî âðó÷íóþ, ÷åðåç ñåðâèñû.
+
+ Êîìàíäà HOP ADD äîáàâëÿåò óêàçàííûé íèê â ñïèñîê HOP'îâ.
+
+ Êîìàíäà HOP DEL óäàëÿåò óêàçàííûé íèê èç ñïèñêà HOP'îâ.  êà÷åñòâå
+ ïàðàìåòðà âû ìîæåòå óêàçàòü íå òîëüêî íèê, íî è êîíêðåòíûé íîìåð
+ çàïèñè èëè ñïèñîê çàïèñåé (ñì. ïðèìåðû èñïîëüçîâàíèÿ LIST íèæå).
+
+ Êîìàíäà HOP LIST âûâîäèò òåêóùèé ñïèñîê HOP'îâ êàíàëà.  êà÷åñòâå
+ äîïîëíèòåëüíîãî ïàðàìåòðà, âû ìîæåòå óêàçàòü ñèìâîëüíóþ ìàñêó, ÷òî
+ ïîçâîëèò âàì ïîëó÷èòü ñïèñîê ñ êîíêðåòíûìè íèêàìè, ïîïàäàþùèìè ïîä
+ ýòó ìàñêó, èëè æå, âû ìîæåòå óêàçàòü ñïèñîê çàïèñåé.
+
+ Íàïðèìåð:
+
+ HOP #êàíàë LIST 2-5,7-9
+ îòîáðàçèò âñå çàïèñè ñî 2-îé ïî 5-óþ, è ñ 7-îé ïî 9-þ.
+
+ HOP #êàíàë LIST *vas*
+ îòîáðàçèò âñå çàïèñè, êîòîðûå ñîäåðæàò ïîäñòðîêó "vas"
+
+ Êîìàíäà HOP CLEAR ïîçâîëÿåò ïîëíîñòüþ î÷èñòèòü ñïèñîê HOP'îâ.
+
+ Êîìàíäû HOP ADD, HOP DEL è HOP LIST ìîãóò èñïîëüçîâàòü AOP'û
+ êàíàëà èëè âûøå, êîìàíäó HOP CLEAR ìîæåò èñïîëüçîâàòü òîëüêî
+ âëàäåëåö êàíàëà.
+
+ Ïîìíèòå, ÷òî äàííàÿ êîìàíäà ðàáîòàåò òîëüêî â ñëó÷àå èñïîëüçîâàíèÿ
+ ñèñòåìû ïðèâèëåãèé xOP. Åñëè âû èñïîëüçóåòå ñèñòåìó LEVELS, âñå
+ èçìåíåíèÿ ñïèñêà äîñòóïà êàíàëà äîëæíû ïðîèçâîäèòñÿ ïîñðåäñòâîì
+ êîìàíäû ACCESS. Äëÿ áîëåå ïîäðîáíîé èíôîðìàöèè ïî èñïîëüçîâàíèþ
+ êîìàíäû ACCESS è ñèñòåìû ïðèâèëåãèé xOP ñì. ñïðàâî÷íóþ èíôîðìàöèþ
+ ïî %R%S HELP ACCESS è %R%S HELP SET XOP.
+
+CHAN_HELP_SOP
+ Ñèíòàêñèñ: SOP #êàíàë ADD íèê
+ SOP #êàíàë DEL {íèê | íîìåð çàïèñè | ñïèñîê_çàïèñåé}
+ SOP #êàíàë LIST [ìàñêà | ñïèñîê_çàïèñåé]
+ SOP #êàíàë CLEAR
+
+ Ïîçâîëÿåò óïðàâëÿòü ñïèñêîì SOP'îâ (ñóïåðîïåðàòîðîâ) âàøåãî êàíàëà.
+ Ïðèâèëåãèè SOP'à âêëþ÷àþò â ñåáÿ íå òîëüêî âñå ïðèâèëåãèè AOP'à, íî
+ è âîçìîæíîñòü óïðàâëÿòü ñïèñêîì äîñòóïà êàíàëà, ñïèñêîì àâòîêèêîâ,
+ ñïèñêîì "ïëîõèõ ñëîâ" è ñïèñêîì ìåìî-ñîîáùåíèé.
+
+ Êîìàíäà SOP ADD äîáàâëÿåò óêàçàííûé íèê â ñïèñîê SOP'îâ.
+
+ Êîìàíäà SOP DEL óäàëÿåò óêàçàííûé íèê èç ñïèñêà SOP'îâ.  êà÷åñòâå
+ ïàðàìåòðà âû ìîæåòå óêàçàòü íå òîëüêî íèê, íî è êîíêðåòíûé íîìåð
+ çàïèñè èëè ñïèñîê çàïèñåé (ñì. ïðèìåðû èñïîëüçîâàíèÿ LIST íèæå).
+
+ Êîìàíäà SOP LIST âûâîäèò òåêóùèé ñïèñîê SOP'îâ êàíàëà.  êà÷åñòâå
+ äîïîëíèòåëüíîãî ïàðàìåòðà âû ìîæåòå óêàçàòü ñèìâîëüíóþ ìàñêó, ÷òî
+ ïîçâîëèò âàì ïîëó÷èòü ñïèñîê ñ êîíêðåòíûìè íèêàìè, ïîïàäàþùèìè ïîä
+ ýòó ìàñêó, èëè æå, âû ìîæåòå óêàçàòü ñïèñîê çàïèñåé.
+
+ Íàïðèìåð:
+
+ SOP #êàíàë LIST 2-5,7-9
+ îòîáðàçèò âñå çàïèñè ñî 2-îé ïî 5-óþ, è ñ 7-îé ïî 9-þ.
+
+ SOP #êàíàë LIST *vas*
+ îòîáðàçèò âñå çàïèñè, êîòîðûå ñîäåðæàò ïîäñòðîêó 'vas'
+
+ Êîìàíäà SOP CLEAR ïîçâîëÿåò ïîëíîñòüþ î÷èñòèòü ñïèñîê SOP'îâ.
+
+ Êîìàíäû SOP ADD, SOP DEL è SOP CLEAR ìîæåò èñïîëüçîâàòü òîëüêî
+ âëàäåëåö êàíàëà, êîìàíäà SOP LIST äîñòóïíà âñåì ïîëüçîâàòåëÿì ñ
+ ïðèâèëåãèÿìè AOP'à è âûøå.
+
+ Ïîìíèòå, ÷òî äàííàÿ êîìàíäà ðàáîòàåò òîëüêî â ñëó÷àå èñïîëüçîâàíèÿ
+ ñèñòåìû ïðèâèëåãèé xOP. Åñëè âû èñïîëüçóåòå ñèñòåìó LEVELS, âñå
+ èçìåíåíèÿ ñïèñêà äîñòóïà êàíàëà äîëæíû ïðîèçâîäèòñÿ ïîñðåäñòâîì
+ êîìàíäû ACCESS. Äëÿ áîëåå ïîäðîáíîé èíôîðìàöèè ïî èñïîëüçîâàíèþ
+ êîìàíäû ACCESS è ñèñòåìû ïðèâèëåãèé xOP ñì. ñïðàâî÷íóþ èíôîðìàöèþ
+ ïî %R%S HELP ACCESS è %R%S HELP SET XOP.
+
+CHAN_HELP_VOP
+ Ñèíòàêñèñ: VOP #êàíàë ADD íèê
+ VOP #êàíàë DEL {íèê | íîìåð_çàïèñè | ñïèñîê_çàïèñåé}
+ VOP #êàíàë LIST [ìàñêà | ñïèñîê_çàïèñåé]
+ VOP #êàíàë CLEAR
+
+ Ïîçâîëÿåò óïðàâëÿòü ñïèñêîì VOP'îâ (àâòîâîéñîâ) âàøåãî êàíàëà.
+ Ïðèâèëåãèè VOP'à äàþò ïîëüçîâàòåëþ âîçìîæíîñòü ïîëó÷èòü ñòàòóñ âîéñà
+ ñðàçó ïðè âõîäå íà êàíàë, èëè çàïðîñèòü åãî âðó÷íóþ, ÷åðåç ñåðâèñû.
+
+ Êîìàíäà VOP ADD äîáàâëÿåò óêàçàííûé íèê â ñïèñîê HOP'îâ.
+
+ Êîìàíäà VOP DEL óäàëÿåò óêàçàííûé íèê èç ñïèñêà VOP'îâ.  êà÷åñòâå
+ ïàðàìåòðà âû ìîæåòå óêàçàòü íå òîëüêî íèê, íî è êîíêðåòíûé íîìåð
+ çàïèñè èëè ñïèñîê çàïèñåé (ñì. ïðèìåðû èñïîëüçîâàíèÿ LIST íèæå).
+
+ Êîìàíäà VOP LIST âûâîäèò òåêóùèé ñïèñîê VOP'îâ êàíàëà.  êà÷åñòâå
+ äîïîëíèòåëüíîãî ïàðàìåòðà, âû ìîæåòå óêàçàòü ñèìâîëüíóþ ìàñêó, ÷òî
+ ïîçâîëèò âàì ïîëó÷èòü ñïèñîê ñ êîíêðåòíûìè íèêàìè, ïîïàäàþùèìè ïîä
+ ýòó ìàñêó, èëè æå, âû ìîæåòå óêàçàòü ñïèñîê çàïèñåé.
+
+ Íàïðèìåð:
+
+ VOP #êàíàë LIST 2-5,7-9
+ îòîáðàçèò âñå çàïèñè ñî 2-îé ïî 5-óþ, è ñ 7-îé ïî 9-þ.
+
+ VOP #êàíàë LIST *vas*
+ îòîáðàçèò âñå çàïèñè, êîòîðûå ñîäåðæàò ïîäñòðîêó 'vas'
+
+ Êîìàíäà VOP CLEAR ïîçâîëÿåò ïîëíîñòüþ î÷èñòèòü ñïèñîê VOP'îâ.
+
+ Êîìàíäû VOP ADD, VOP DEL è VOP LIST ìîãóò èñïîëüçîâàòü AOP'û
+ êàíàëà èëè âûøå, êîìàíäó VOP CLEAR ìîæåò èñïîëüçîâàòü òîëüêî
+ âëàäåëåö êàíàëà.
+
+ Ïîìíèòå, ÷òî äàííàÿ êîìàíäà ðàáîòàåò òîëüêî â ñëó÷àå èñïîëüçîâàíèÿ
+ ñèñòåìû ïðèâèëåãèé xOP. Åñëè âû èñïîëüçóåòå ñèñòåìó LEVELS, âñå
+ èçìåíåíèÿ ñïèñêà äîñòóïà êàíàëà äîëæíû ïðîèçâîäèòñÿ ïîñðåäñòâîì
+ êîìàíäû ACCESS. Äëÿ áîëåå ïîäðîáíîé èíôîðìàöèè ïî èñïîëüçîâàíèþ
+ êîìàíäû ACCESS è ñèñòåìû ïðèâèëåãèé xOP ñì. ñïðàâî÷íóþ èíôîðìàöèþ
+ ïî %R%S HELP ACCESS è %R%S HELP SET XOP.
+
+CHAN_HELP_ACCESS
+ Ñèíòàêñèñ: ACCESS #êàíàë ADD íèê óðîâåíü
+ ACCESS #êàíàë DEL {íèê | íîìåð_çàïèñè | ñïèñîê_çàïèñåé}
+ ACCESS #êàíàë LIST [ìàñêà | ñïèñîê_çàïèñåé]
+ ACCESS #êàíàë CLEAR
+
+ Ïîçâîëÿåò óïðàâëÿòü ñïèñêîì äîñòóïà (ACCESS-ñïèñêîì) êàíàëà.
+ Äàííûé ñïèñîê âêëþ÷àåò â ñåáÿ âñåõ ïîëüçîâàòåëåé, êîòîðûå èìåþò òå
+ èëè èíûå ïðèâèëåãèè íà êàíàëå, íàïðèìåð: äîñòóï ê ñòàòóñó îïåðàòîðà,
+ äîñòóï ê óïðàâëåíèþ ñïèñêîì AKICK'îâ, äîñòóï ê òàêèì êîìàíäàì êàê
+ KICK, BAN, VOICE, INVITE è ò. ä.
+ Ðàçëè÷íûå óðîâíè äîñòóïà îïðåäåëÿþò ðàçëè÷íûå ïðèâèëåãèè íà êàíàëå.
+ Äëÿ áîëåå ïîäðîáíîé èíôîðìàöèè î ñòàíäàðòíûõ óðîâíÿõ äîñòóïà êàíàëà
+ ñì. %R%S HELP ACCESS LEVELS
+ Ïðèìå÷àíèå: ëþáîé, íå âêëþ÷åííûé â ñïèñîê äîñòóïà ïîëüçîâàòåëü,
+ ñ÷èòàåòñÿ ïîëüçîâàòåëåì ñ óðîâíåì äîñòóïà 0.
+
+ Êîìàíäà ACCESS ADD äîáàâëÿåò óêàçàííûé íèê â ñïèñîê äîñòóïà
+ êàíàëà ñ óêàçàííûì óðîâíåì. Åñëè ýòîò íèê óæå ÷èñëèòñÿ â ñïèñêå,
+ åãî óðîâåíü áóäåò èçìåíåí íà òîò, êîòîðûé áûë óêàçàí. Çíà÷åíèå
+ óðîâíÿ äîëæíî áûòü ìåíüøå, ÷åì óðîâåíü ïîëüçîâàòåëÿ, èñïîëüçóþùåãî
+ êîìàíäó 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 âû ìîæåòå ïåðåíàçíà÷èòü óðîâíè äîñòóïà
+ ïî ñâîåìó âêóñó. Äëÿ áîëåå ïîäðîáíîé èíôîðìàöèè î íàñòðîéêå óðîâíåé
+ äîñòóïà ñì. %R%S HELP LEVELS.
+
+CHAN_HELP_AKICK
+ Ñèíòàêñèñ: AKICK #êàíàë ADD {íèê | ìàñêà} [ïðè÷èíà]
+ AKICK #êàíàë STICK ìàñêà
+ AKICK #êàíàë UNSTICK ìàñêà
+ AKICK #êàíàë DEL {íèê | ìàñêà | íîìåð_çàïèñè | ñïèñîê_çàïèñåé}
+ AKICK #êàíàë LIST {ìàñêà | íîìåð_çàïèñè | ñïèñîê çàïèñåé}
+ AKICK #êàíàë VIEW {ìàñêà | íîìåð_çàïèñè | ñïèñîê çàïèñåé}
+ AKICK #êàíàë ENFORCE
+ AKICK #êàíàë CLEAR
+
+ Ïîçâîëÿåò óïðàâëÿòü AKICK-ñïèñêîì êàíàëà. Ëþáîé ïîëüçîâàòåëü, ÷üÿ
+ õîñòìàñêà ñîâïàäåò ñ îäíîé èç çàïèñåé â AKICK-ñïèñêå, áóäåò
+ íåìåäëåííî çàáàíåí è âûêèíóò ñ êàíàëà ïðè ïîïûòêå íà íåãî çàéòè.
+ Âñå ñïèñêè àâòîêèêîâ õðàíÿòñÿ íà %S, äëÿ êàæäîãî êàíàëà -
+ ñâîé ñïèñîê.
+
+ Êîìàíäà AKICK ADD äîáàâëÿåò íèê èëè ìàñêó â ñïèñîê àâòîêèêîâ.
+ Äîïîëíèòåëüíî, âû ìîæåòå óêàçàòü ïðè÷èíó - ýòîò òåêñò áóäåò
+ èñïîëüçîâàí ïðè êèêå ïîëüçîâàòåëÿ ñ êàíàëà. Åñëè ïðè÷èíà íå
+ óêàçàíà - áóäåò èñïîëüçîâàí ñòàíäàðòíûé òåêñò èç êîíôèãóðàöèîííîãî
+ ôàéëà ñåðâèñîâ (User has been banned from the channel).
+
+ Êîìàíäà AKICK STICK ïîçâîëÿåò ñîçäàòü ïîñòîÿííûé áàí äëÿ óêàçàííîé
+ ìàñêè èç ñïèñêà àâòîêèêîâ. Äàííûé áàí âñåãäà áóäåò ïðèñóòñâîâàòü íà
+ êàíàëå, %S íèêîìó íå ïîçâîëèò ñíÿòü åãî.
+ Ïðèìå÷àíèå: óñòàíîâêà stick-çàïèñè íà çàðåãèñòðèðîâàííûé íèê -
+ íåâîçìîæíà.
+
+ Êîìàíäà AKICK UNSTICK ïîçâîëÿåò óäàëèòü stick-çàïèñü, îäíàêî áàí
+ êàíàëà âû äîëæíû óäàëèòü âðó÷íóþ.
+
+ Êîìàíäà AKICK DEL óäàëÿåò óêàçàííûé íèê èëè ìàñêó èç ñïèñêà
+ àâòîêèêîâ.  êà÷åñòâå äîïîëíèòåëüíîãî ïàðàìåòðà, âû ìîæåòå óêàçàòü
+ íîìåð çàïèñè èëè ñïèñîê çàïèñåé.
+ Ïðèìå÷àíèå: óäàëåíèå çàïèñè èç AKICK-ñïèñêà íå óäàëÿåò áàí íà
+ êàíàëå, âû äîëæíû áóäåòå ñíÿòü åãî âðó÷íóþ.
+
+ Êîìàíäà AKICK LIST ïîêàçûâàåò òåêóùèé ñïèñîê àâòîêèêîâ êàíàëà.
+  êà÷åñòâå äîïîëíèòåëüíîãî ïàðàìåòðà âû ìîæåòå óêàçàòü ìàñêó, ÷òîáû
+ ïîëó÷èòü òîëüêî ñîâïàäàþùèå çàïèñè, èëè íîìåð/ñïèñîê çàïèñåé, ÷òîáû
+ ïðîñìîòðåòü òîëüêî ýòè çàïèñè.
+
+ Êîìàíäà AKICK VIEW ÿâëÿåòñÿ áîëåå ïîäðîáíûì àíàëîãîì êîìàíäû
+ AKICK LIST (äîïîëíèòåëüíî ïîêàçûâàåòñÿ âðåìÿ óñòàíîâêè AKICK'à è
+ åãî ïðè÷èíà).
+
+ Êîìàíäà AKICK ENFORCE ïîñûëàåò %S çàïðîñ íà íåìåäëåííóþ ïåðåïðîâåðêó
+ AKICK-ñïèñêà êàíàëà.
+
+ Êîìàíäà 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
+ Íèæå ïðåäñòàâëåí ñïèñîê âñåõ äîñòóïíûõ êîìàíä/ôóíêöèé è èõ îïèñàíèå.
+ Îáðàòèòå âíèìàíèå íà ôóíêöèè NOJOIN è AUTODEOP - â îòëè÷èå îò âñåõ
+ äðóãèõ ôóíêöèé, èõ óðîâåíü ÿâëÿåòñÿ ìàêñèìàëüíûì. Óðîâíè âñåõ äðóãèõ
+ êîìàíä/ôóíêöèé ðàñöåíèâàþòñÿ êàê ìèíèìàëüíûå (ìèíèìàëüíî íåîáõîäèìûé
+ óðîâåíü äëÿ èñïîëüçîâàíèÿ).
+
+
+CHAN_HELP_LEVELS_DESC_FORMAT
+ %-*s %s
+
+CHAN_HELP_INFO
+ Ñèíòàêñèñ: INFO #êàíàë [ALL]
+
+ Ïîçâîëÿåò ïîëó÷èòü ïîäðîáíóþ èíôîðìàöèþ î çàðåãèñòðèðîâàíîì êàíàëå,
+ â ÷àñòíîñòè òàêóþ êàê: íèê âëàäåëüöà, âðåìÿ ðåãèñòðàöèè êàíàëà, äàòó
+ åãî ïîñëåäíåãî èñïîëüçîâàíèÿ è îïèñàíèå. Ñ ïàðàìåòðîì ALL áóäóò
+ òàê æå ïîêàçàíû çàáëîêèðîâàííûå ðåæèìû, îïöèè êàíàëà è åãî íàñëåäíèê.
+ Ïðèìå÷àíèå: ïî-óìîë÷àíèþ, èñïîëüçîâàòü êîìàíäó ñ ïàðàìåòðîì ALL
+ ìîæåò òîëüêî âëàäåëåö êàíàëà.
+
+CHAN_HELP_LIST
+ Ñèíòàêñèñ: LIST ìàñêà
+
+ Âûâîäèò ñïèñîê âñåõ çàðåãèñòðèðîâàííûõ êàíàëîâ, íàçâàíèå êîòîðûõ
+ ñîâïàäàåò ñ óêàçàííîé ìàñêîé. Ïîìèìî ìàñêè âû ìîæåòå óêàçàòü ñïèñîê
+ çàïèñåé, íàïðèìåð çàïðîñ #1-5 ïîêàæåò âñå êàíàëû ñ 1-ãî ïî 5-ûé
+ (êàíàëû ñ âêëþ÷åííîé îïöèåé 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 [#êàíàë [íèê]]
+
+ Ïîçâîëÿåò óñòàíîâèòü ñòàòóñ çàùèòû (àäìèíèñòðàòîðà) êàíàëà óêàçàííîìó
+ íèêó íà óêàçàííîì êàíàëå. Åñëè íèê íå óêàçàí, ñòàòóñ çàùèòû áóäåò
+ âûäàí èñïîëüçóþùåìó êîìàíäó. Åñëè íå óêàçàíû íè êàíàë íè íèê -
+ óñòàíîâèò ñòàòóñ çàùèòû èñïîëüçóþùåìó êîìàíäó íà âñåõ êàíàëàõ, ãäå îí
+ èìååò ñîîòâåòñòâóþùèé óðîâåíü äîñòóïà.
+
+ Ïî-óìîë÷àíèþ, äàííàÿ êîìàíäà ìîæåò áûòü èñïîëüçîâàíà âëàäåëüöåì èëè
+ ëèöàìè ñ óðîâíåì äîñòóïà 10 (SOP) è âûøå (â ïîñëåäíåì ñëó÷àå - òîëüêî
+ îòíîñèòåëüíî ñåáÿ).
+
+CHAN_HELP_DEPROTECT
+ Ñèíòàêñèñ: DEPROTECT [#êàíàë [íèê]]
+
+ Ñíèìàåò ñòàòóñ çàùèòû (àäìèíèñòðàòîðà) ñ óêàçàííîãî íèêà íà óêàçàííîì
+ êàíàëå. Åñëè íèê íå óêàçàí, ñíèìàåò ñòàòóñ çàùèòû ñ èñïîëüçóþùåãî
+ êîìàíäó. Åñëè íè êàíàë íè íèê íå óêàçàíû - ñíèìàåò ñòàòóñ çàùèòû
+ ñ èñïîëüçóþùåãî êîìàíäó íà âñåõ êàíàëàõ, íà êîòîðûõ ó íåãî åñòü
+ ñîîòâåòñòâóþùèé óðîâåíü äîñòóïà.
+
+ Ïî-óìîë÷àíèþ, äàííàÿ êîìàíäà ìîæåò áûòü èñïîëüçîâàíà âëàäåëüöåì èëè
+ ëèöàìè ñ óðîâíåì äîñòóïà 10 (SOP) è âûøå (â ïîñëåäíåì ñëó÷àå - òîëüêî
+ îòíîñèòåëüíî ñåáÿ).
+
+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 [#êàíàë [íèê [ïðè÷èíà]]]
+
+ Áàíèò óêàçàííîãî ïîëüçîâàòåëÿ íà óêàçàííîì êàíàëå. Øàáëîí áàíìàñêè
+ áóäåò âçÿò èç óñòàíîâêè BANTYPE. Åñëè íèê íå óêàçàí - ñåðâèñû
+ çàáàíÿò âàñ. Åñëè êàíàë è íèê íå óêàçàíû - ñåðâèñû çàáàíÿò âàñ íà
+ âñåõ êàíàëàõ, ãäå ó âàñ åñòü ñîîòâåòñòâóþùèé óðîâåíü äîñòóïà.
+
+ Ïî-óìîë÷àíèþ, äàííàÿ êîìàíäà ìîæåò áûòü èñïîëüçîâàíà AOP'àìè èëè
+ ëèöàìè ñ óðîâíåì äîñòóïà 5 è âûøå.
+
+CHAN_HELP_TOPIC
+ Ñèíòàêñèñ: TOPIC #êàíàë [òåêñò]
+
+ Ïîçâîëÿåò èçìåíèòü òîïèê êàíàëà ïîñðåäñòâîì %S. Åñëè òåêñò
+ òîïèêà íå óêàçàí - òîïèê êàíàëà áóäåò ïîëíîñòüþ óäàëåí. ×àùå âñåãî,
+ ïðèìåíÿòü äàííóþ êîìàíäó èìååò ñìûñë ïðè àêòèâèðîâàííîì ðåæèìå
+ áëîêèðîâêè òîïèêà, êîãäà èçìåíèòü òîïèê êàíàëà îáû÷íûì ñïîñîáîì
+ íå ïðåäñòàâëÿåòñÿ âîçìîæíûì. Äëÿ áîëåå ïîäðîáíîé èíôîðìàöèè ñì.
+ ñïðàâêó ïî %R%S HELP SET TOPICLOCK.
+
+ Ïî-óìîë÷àíèþ, äàííàÿ êîìàíäà ìîæåò áûòü èñïîëüçîâàíà òîëüêî
+ âëàäåëüöåì êàíàëà.
+
+CHAN_HELP_CLEAR
+ Ñèíòàêñèñ: CLEAR #êàíàë ÷òî_èìåííî
+
+ Ïîñûëàåò %S çàïðîñ íà î÷èñòêó îïðåäåëåíûõ ðåæèìîâ êàíàëà.
+ Âàëèäíûå çíà÷åíèÿ:
+
+ MODES ñáðîñ âñåõ ðåæèìîâ êàíàëà (i,k,l,m,n,p,s,t è ò. ä.)
+ BANS óäàëåíèå âñåõ áàíîâ êàíàëà
+ EXCEPTS óäàëåíèå âñåõ èñêëþ÷åíèé èç áàíà
+ INVITES óäàëåíèå âñåõ èñêëþ÷åíèé íà ïðèãëàøåíèå
+ OPS ñíÿòèå ñòàòóñà îïåðàòîðà ñî âñåõ îïåðàòîðîâ êàíàëà
+ HOPS ñíÿòèå ñòàòóñà ïîëóîïåðàòîðà ñî âñåõ õîïîâ êàíàëà
+ VOICES ñíÿòèå ñòàòóñà âîéñà ñî âñåõ âîéñîâ êàíàëà
+ USERS ìàññîâûé êèê âñåõ ïîñåòèòåëåé êàíàëà
+
+ Ïî-óìîë÷àíèþ, äàííàÿ êîìàíäà ìîæåò áûòü èñïîëüçîâàíà òîëüêî
+ âëàäåëüöåì êàíàëà.
+
+CHAN_HELP_GETKEY
+ Ñèíòàêñèñ: GETKEY #êàíàë
+
+ Ïîçâîëÿåò çàïðîñèòü ó ñåðâèñîâ êëþ÷-ïàðîëü êàíàëà. Äàííàÿ êîìàíäà
+ îáû÷íî èñïîëüçóåòñÿ áîòàìè è/èëè ñêðèïòàìè è âîçâðàùàåò ñòðîêó âèäà:
+ KEY #êàíàë êëþ÷
+
+ Åñëè ñåêðåòíûé êëþ÷ ïîêàçàí êàê "NO KEY" - ïàðîëü íà âõîä íà êàíàëå
+ íå óñòàíîâëåí.
+
+ Ïî-óìîë÷àíèþ, äàííàÿ êîìàíäà ìîæåò áûòü èñïîëüçîâàíà AOP'àìè èëè
+ ëèöàìè ñ óðîâíåì äîñòóïà 5 è âûøå.
+
+CHAN_HELP_SENDPASS
+ Ñèíòàêñèñ: SENDPASS #êàíàë
+
+ Îòïðàâëÿåò ïàðîëü îò êàíàëà íà email-àäðåñ åãî ðåàëüíîãî âëàäåëüöà,
+ ïðîïèñàííîãî â ãðàôå Founder (âëàäåëåö).
+
+ Ïðèìå÷àíèå: â çàâèñèìîñòè îò íàñòðîåê ñåòè, äîñòóï ê äàííîé êîìàíäå
+ ìîæåò áûòü îãðàíè÷åí äî IRC-îïåðàòîðîâ.
+ Ïðèìå÷àíèå 2: êîìàíäà íåäîñòóïíà ïðè âêëþ÷åííîì øèôðîâàíèè ïàðîëåé.
+
+CHAN_SERVADMIN_HELP
+
+ Àäìèíèñòðàòîðû ñåðâèñîâ ìîãóò óäàëèòü ëþáîé êàíàë áåç èäåíòèôèêàöèè
+ ê íåìó â êà÷åñòâå âëàäåëüöà, ìîãóò ïðîñìàòðèâàòü ñïèñêè äîñòóïà
+ êàíàëîâ, à òàê æå, ñïèñêè àêèêîâ è óñòàíîâêè óðîâíåé äîñòóïà êàíàëîâ.
+
+CHAN_SERVADMIN_HELP_LOGOUT
+ Ñèíòàêñèñ: LOGOUT #êàíàë [íèê]
+
+ Äåèäåíòèôèöèðóåò óêàçàííûé íèê îò êàíàëà, ñíèìàÿ òåì ñàìûì ñ íåãî
+ ñòàòóñ âëàäåëüöà. Åñëè âû ðåàëüíûé âëàäåëåö êàíàëà, âû ìîæåòå
+ äåèäåíòèôèöèðîâàòü ëþáîãî, â ïðîòèâíîì ñëó÷àå - òîëüêî ñåáÿ.
+ Ïðèìå÷àíèå: äåèäåíòèôèöèðóþòñÿ òîëüêî òå ïîëüçîâàòåëè, êîòîðûå
+ èäåíòèôèöèðîâàëèñü ê êàíàëó ïîñðåäñòâîì êîìàíäû IDENTIFY.
+
+ Êàê Àäìèíèñòðàòîð ñåðâèñîâ, âû ìîæåòå äåèäåíòèôèöèðîâàòü ëþáîãî
+ ïîëüçîâàòåëÿ îò ëþáîãî êàíàëà, áåç êàêîé-ëèáî äîïîëíèòåëüíîé
+ èäåíòèôèêàöèè ê êàíàëó. Åñëè âû íå óêàæåòå íèê, òî äåèäåíòèôèöðîâàíû
+ áóäóò âñå ïîëüçîâàòåëè êàíàëà.
+
+CHAN_SERVADMIN_HELP_DROP
+ Ñèíòàêñèñ: DROP #êàíàë
+
+ Óäàëÿåò óêàçàííûé êàíàë èç áàçû äàííûõ ñåðâèñîâ. Âû ì îæåòå óäàëèòü
+ òîëüêî òå êàíàëû, êîòîðûìè âû âëàäååòå.
+ Êàê Àäìèíèñòðàòîð ñåðâèñîâ, âû ìîæåòå óäàëèòü ëþáîé çàðåãèñòðèðîâàííûé
+ êàíàë ñåòè áåç êàêîé-ëèáî èäåíòèôèêàöèè ê íåìó.
+
+CHAN_SERVADMIN_HELP_SET
+
+ Àäìèíèñòðàòîðàì ñåðâèñîâ äîñòóïíà âîçìîæíîñòü èçìåíÿòü íàñòðîéêè
+ ëþáîãî çàðåãèñòðèðîâàííîãî êàíàëà ñåòè. Òàêæå, èì äîñòóïíà
+ óñòàíîâêà ñêðûòîé îïöèè NOEXPIRE (èñêëþ÷àåò êàíàë èç óñëîâèé
+ èñòå÷åíèÿ ðåãèñòðàöèè ïî âðåìåíè).
+
+CHAN_SERVADMIN_HELP_SET_NOEXPIRE
+ Ñèíòàêñèñ: SET #êàíàë NOEXPIRE {ON | OFF}
+
+ Ïîçâîëÿåò óñòàíîâèòü ðåæèì íå-èñòå÷åíèÿ äëÿ óêàçàííîãî êàíàëà.
+ Àêòèâèðîâàíèå ýòîé îïöèè àâòîìàòè÷åñêè èñêëþ÷èò êàíàë èç óñëîâèé
+ èñòå÷åíèÿ åãî ðåãèñòðàöèè ïî âðåìåíè. Ñîîòâåòñòâåííî äåàêòèâèðîâàíèå
+ ðåæèìà âåðíåò âñå íà êðóãè ñâîÿ.
+
+CHAN_SERVADMIN_HELP_INFO
+
+ Àäìèíèñòðàòîðû ñåðâèñîâ ìîãóò èñïîëüçîâàòü ïàðàìåòð ALL
+ îòíîñèòåëüíî ëþáîãî êàíàëà ñåòè.
+
+CHAN_SERVADMIN_HELP_LIST
+ Ñèíòàêñèñ: LIST ìàñêà [FORBIDDEN] [SUSPENDED] [NOEXPIRE]
+
+ Âûâîäèò ñïèñîê âñåõ çàðåãèñòðèðîâàííûõ êàíàëîâ ïî óêàçàííîé ìàñêå.
+ Êàíàëû ñ ïàðàìåòðîì PRIVATE áóäóò ïîêàçàíû òîëüêî Àäìèíèñòðàòîðàì
+ ñåðâèñîâ. Êàíàëû ñ ïàðàìåòðîì NOEXPIRE áóäóò ïîêàçàíû ñ ïðåôèêñîì
+ ! ïåðåä èìåíåì êàíàëà.
+
+  êà÷åñòâå äîïîëíèòåëüíûõ îïöèé êîìàíäû LIST âû ìîæåòå óêàçàòü
+ FORBIDDEN, SUSPENDED èëè NOEXPIRE. Ýòî ïîçâîëèò âàì ïîëó÷èòü ñïèñîê
+ êàíàëîâ, îòâå÷àþùèõ îïðåäåëåííûì êðèòåðèÿì, â ÷àñòíîñòè òàêèì êàê:
+ FORBIDDEN - êàíàëû, çàïðåùåííûå ê èñïîëüçîâàíèþ; SUSPENDED - êàíàëû,
+ "çàìîðîæåííûå" äî ïîðû äî âðåìåíè; NOEXPIRE - êàíàëû, íàõîäÿùèåñÿ â
+ ðåæèìå "íå-èñòå÷åíèÿ". Åñëè óêàçàíû âñå ÷åòûðå îïöèè, òî âñå 3 òèïà
+ êàíàëîâ áóäóò ïåðå÷èñëåíû â ñïèñêå.
+
+CHAN_SERVADMIN_HELP_GETPASS
+ Ñèíòàêñèñ: GETPASS #êàíàë
+
+ Ïîçâîëÿåò ïîëó÷èòü ïàðîëü îò óêàçàííîãî êàíàëà.
+
+ Ïðèìå÷àíèå: ñðàçó ïî èñïîëüçîâàíèè äàííîé êîìàíäû, ñåðâèñû ïîøëþò
+ ïî WALLOPS/GLOBOPS ñîîáùåíèå, ñîäåðæàùèå íèê èñïîëüçîâàâøåãî êîìàíäó,
+ è íèê, îòíîñèòåëüíî êîòîðîãî áûëà èñïîëüçîâàíà êîìàíäà. Îäíîâðåìåííî
+ ñ ýòèì, ñîáûòèå áóäåò çàïèñàíî â ëîã-ôàéë.
+ Ïðèìå÷àíèå 2: êîìàíäà íåäîñòóïíà, åñëè âêëþ÷åíî øèôðîâàíèå ïàðîëåé.
+
+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_CMD_SEND
+ SEND Îòïðàâêà ìåìî-ñîîáùåíèÿ óêàçàííîìó íèêó èëè êàíàëó
+MEMO_HELP_CMD_CANCEL
+ CANCEL Îòìåíà ïîñëåäíåãî îòïðàâëåííîãî âàìè ìåìî-ñîîáùåíèÿ
+MEMO_HELP_CMD_LIST
+ LIST Ñïèñîê âàøèõ ìåìî-ñîîáùåíèé
+MEMO_HELP_CMD_READ
+ READ ×òåíèå êàêîãî-ëèáî ñîîáùåíèÿ, ãðóïïû ñîîáùåíèé
+MEMO_HELP_CMD_DEL
+ DEL Óäàëåíèå ìåìî-ñîîáùåíèé
+MEMO_HELP_CMD_SET
+ SET Óñòàíîâêà îïöèé äëÿ ìåìî-ñîîáùåíèé
+MEMO_HELP_CMD_INFO
+ INFO Èíôîðìàöèÿ î êîë-âå ñîîáùåíèé è íàñòðîéêàõ îïîâåùåíèÿ
+MEMO_HELP_CMD_RSEND
+ RSEND Îòïðàâêà ìåìî-ñîîáùåíèÿ ñ óñëîâèåì ïîäòâåðæäåíèÿ î ïðî÷òåíèè
+MEMO_HELP_CMD_CHECK
+ CHECK Ïðîâåðêà íà òî, áûëî ëè ïðî÷èòàíî ïîñëåäíåå ïîñëàííîå âàìè ñîîáùåíèå
+MEMO_HELP_CMD_SENDALL
+ SENDALL Îòïðàâêà ìàññîâîãî ìåìî-ñîîáùåíèÿ âñåì ïîëüçîâàòåëÿì ñåòè
+MEMO_HELP_CMD_STAFF
+ STAFF Îòïðàâêà ìåìî-ñîîáùåíèÿ âñåì îïåðàòîðàì/àäìèíèñòðàòîðàì ñåòè
+
+MEMO_HELP_HEADER
+
+ Îñíîâíîå ïðåäíàçíà÷åíèå %S - ýòî äàòü çàðåãèñòðèðîâàííûì
+ ïîëüçîâàòåëÿì âîçìîæíîñòü ïîñûëàòü äðóã-äðóãó êîðîòêèå "çàïèñêè",
+ íàçûâàåìûå òàê æå ìåìî-ñîîáùåíèÿìè. Äàííûé ñåðâèñ îñîáåííî óäîáåí,
+ êîãäà âàì íåîáõîäèìî ÷òî-òî ñîîáùèòü èíòåðåñóþùåìó âàñ ÷åëîâåêó, à
+ îí íà äàííûé ìîìåíò âíå ñåòè (offline).
+  êà÷åñòâå îòïðàâèòåëÿ âû ìîæåòå óêàçàòü êàê íèê, òàê è èìÿ êàíàëà*.
+ Ïîìíèòå, ÷òî îòïðàâêà ñîîáùåíèÿ âîçìîæíà ëèøü çàðåãèñòðèðîâàííîìó
+ íà ñåðâèñàõ àäðåñàòó!
+
+ Ñïèñîê êîìàíä %S:
+
+
+MEMO_HELP_ADMIN
+ íå èñïîëüçóåòñÿ.
+MEMO_HELP_OPER
+ íå èñïîëüçóåòñÿ.
+
+MEMO_HELP_FOOTER
+
+ Äëÿ áîëåå ïîäðîáíîé èíôîðìàöèè ñì. %R%S HELP êîìàíäà
+
+ * Ïî-óìîë÷àíèþ, ëþáîé ïîëüçîâàòåëü, ñ óðîâíåì äîñòóïà íà êàíàëå
+ íå ìåíåå 10, ìîæåò ÷èòàòü ìåìî-ñîîáùåíèÿ îòïðàâëåííûå êàíàëó.
+ Èçìåíèòü ýòè óñëîâèÿ âû ìîæåòå ñ ïîìîùüþ òîíêîé íàñòðîéêè ÷åðåç
+ %s LEVELS.
+
+MEMO_HELP_SEND
+ Ñèíòàêñèñ: SEND {íèê | #êàíàë} òåêñò_ñîîáùåíèÿ
+
+ Îòïðàâëÿåò ñîîáùåíèå äëÿ íèêà èëè äëÿ #êàíàëà, ñîäåðæàùåå
+ òåêñò_ñîîáùåíèÿ. Åñëè â êà÷åñòâå ïîëó÷àòåëÿ óêàçàí íèê, òî îí
+ áóäåò óâåäîìëåí î òîì, ÷òî âû îòïðàâèëè åìó ìåìî-ñîáùåíèå.
+ Ïðèìå÷àíèå: ïîëó÷àòåëü, áóäü òî íèê èëè êàíàë, äîëæåí áûòü
+ çàðåãèñòðèðîâàí, äëÿ âîçìîæíîñòè îòïðàâêè/ïîëó÷åíèÿ ìåìî-ñîîáùåíèé.
+
+MEMO_HELP_CANCEL
+ Ñèíòàêñèñ: CANCEL {íèê | #êàíàë}
+
+ Îòìåíÿåò ïîñëåäíåå ñîîáùåíèå, îòïðàâëåííîå âàìè óêàçàííîìó íèêó
+ èëè êàíàëó, òåì ñàìûì ïðåäîõðàíÿÿ åãî îò ïðî÷òåíèÿ àäðåñàòîì.
+
+MEMO_HELP_LIST
+ Ñèíòàêñèñ: LIST [#êàíàë] [ñïèñîê_çàïèñåé | NEW]
+
+ Âûâîäèò òåêóùèé ñïèñîê ñîîáùåíèé. Ñ ïàðàìåòðîì NEW, ïîêàæåò òîëüêî
+ íîâûå (íåïðî÷èòàííûå) ñîîáùåíèÿ, îíè áóäóò ïîìå÷åíû çíà÷êîì "*"
+ ñëåâà îò íîìåðà ñîîáùåíèÿ.
+ Ïîìèìî ýòîãî, âû ìîæåòå óêàçàòü ñïèñîê çàïèñåé èëè íîìåð çàïèñè,
+ íàïðèìåð:
+
+ LIST 2-5,7-9
+ ïîêàæåò ñîîáùåíèÿ ñ 2-ãî ïî 5-îå è ñ 7-ãî ïî 9-îå.
+
+MEMO_HELP_READ
+ Ñèíòàêñèñ: READ [#êàíàë] {íîìåð | ñïèñîê_çàïèñåé | LAST | NEW}
+
+ Ïîçâîëÿåò ïðî÷åñòü óêàçàííûå ñîîáùåíèÿ. Ñ ïàðàìåòðîì LAST - âûâåäåò
+ òåêñò ïîñëåäíåãî ïîëó÷åííîãî âàìè ñîîáùåíèÿ, ñ ïàðàìåòðîì NEW -
+ îòîáðàçèò âñå íåïðî÷èòàííûå âàìè ñîîáùåíèÿ.
+ Ïîìèìî ýòîãî, âû ìîæåòå óêàçàòü ñïèñîê çàïèñåé èëè íîìåð çàïèñè,
+ íàïðèìåð:
+
+ READ 2-5,7-9
+ âûâåäåò òåêñò âñåõ ñîîáùåíèé ñ 2-ãî ïî 5-îå è ñ 7-ãî ïî 9-îå.
+
+MEMO_HELP_DEL
+ Ñèíòàêñèñ: DEL [#êàíàë] {íîìåð | ñïèñîê_çàïèñåé | LAST | ALL}
+
+ Ïîçâîëÿåò óäàëèòü óêàçàííîå ñîîáùåíèå. Â çàâèñèìîñòè îò óêàçàííîãî
+ ïàðàìåòðà, âû ìîæåòå óäàëèòü ñðàçó íåñêîëüêî ñîîáùåíèé èëè öåëûé
+ äèàïàçîí ñîîáùåíèé (ñì. ïðèìåð íèæå).
+
+ Ïàðàìåòð LAST ïîçâîëÿåò óäàëèòü ïîñëåäíåå ïîëó÷åííîå ñîîáùåíèå.
+ Ïàðàìåòð ALL ïîçâîëÿåò ïîëíîñòüþ î÷èñòèòü ñïèñîê ñîîáùåíèé.
+
+ Ïðèìåðû:
+
+ DEL 1
+ óäàëèò ñîîáùåíèå ïîä íîìåðîì 1.
+
+ DEL 2-5,7-9
+ óäàëèò âñå ñîîáùåíèÿ ñ 2-ãî ïî 5-îå è ñ 7-ãî ïî 9-îå.
+
+MEMO_HELP_SET
+ Ñèíòàêñèñ: SET îïöèÿ ïàðàìåòðû
+
+ Ïîçâîëÿåò íàñòðîèòü âàøè ëè÷íûå îïöèè ñëóæáû ñîîáùåíèé.
+ Âàëèäíûå îïöèè:
+
+ NOTIFY âûáîð ñïîñîáà óâåäîìëåíèÿ î íîâûõ ñîáùåíèÿõ
+ LIMIT óñòàíîâêà âàøåãî ìàêñèìàëüíîãî ëèìèòà ñîîáùåíèé
+
+ Äëÿ áîëåå ïîäðîáíîé èíôîðìàöèè î êîíêðåòíîé îïöèè âîñïîëüçóéòåñü
+ êîìàíäîé %R%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 [#êàíàë] ïðåäåë
+
+ Ïîçâîëÿåò îãðàíè÷èòü ìàêñèìàëüíîå êîëè÷åñòâî ñîîáùåíèé, êîòîðîå âû
+ (èëè êàíàë) ìîæåòå ïðèíÿòü. Óñòàíîâêà çíà÷åíèÿ â 0 ïîëíîñòüþ îòêëþ÷èò
+ âîçìîæíîñòü ïðèíÿòèÿ ñîîáùåíèé.
+ Ìàêñèìàëüíî äîïóñòèìîå çíà÷åíèå: %d.
+
+MEMO_HELP_INFO
+ Ñèíòàêñèñ: INFO [#êàíàë]
+
+ Ïîêàçûâàåò èíôîðìàöèþ î êîëè÷åñòâå è ñòàòóñå âàøèõ ñîîáùåíèé, â
+ ÷àñòíîñòè ñêîëüêî èç íèõ íåïðî÷èòàíî, è ñêîëüêî âñåãî ñîîáùåíèé
+ âû ìîæåòå ïðèíÿòü. Åñëè âû óêàæåòå â êà÷åñòâå ïàðàìåòðà êàíàë -
+ âûâåäåò àíàëîãè÷íóþ èíôîðìàöèþ îá óêàçàííîì êàíàëå.
+
+MEMO_SERVADMIN_HELP_SET_LIMIT
+ Ñèíòàêñèñ: SET LIMIT [ïîëüçîâàòåëü | #êàíàë] {ïðåäåë | NONE} [HARD]
+
+ Óñòàíàâëèâàåò ëèìèò íà ìàêñèìàëüíîå êîëè÷åñòâî ñîîáùåíèé, êîòîðîå
+ ïîëüçîâàòåëü (èëè êàíàë) ñìîãóò ïðèíèìàòü. Óñòàíîâêà ëèìèòà ðàâíûì
+ 0 îòêëþ÷èò âîçìîæíîñòü ïðèíÿòèÿ ñîîáùåíèÿ âîîáùå, óñòàíîâêà â NONE
+ ðàçðåøàåò ïîëüçîâàòåëþ ïðèíèìàòü è ñîõðàíÿòü ñòîëüêî ñîîáùåíèé,
+ ñêîëüêî îí ïîæåëàåò. Åñëè âû íå óêàæåòå ïîëüçîâàòåëÿ èëè êàíàë,
+ íàñòðîéêè áóäó ïðèìåíåíû îòíîñèòåëüíî âàñ.
+
+ Äîïîëíèòåëüíûé ïàðàìåòð HARD çàïðåòèò óêàçàííîìó ïîëüçîâàòåëþ
+ èçìåíÿòü ñâîé ëèìèò ñîîáùåíèé. Ñîîòâåòñòâåííî óñòàíîâêà ëèìèòà áåç
+ ïàðàìåòðà HARD îòìåíÿåò ýôôåêò çàïðåòà è ðàçðåøàåò ïîëüçîâàòåëþ
+ íàñòðàèâàòü ñâîé ëèìèò ñîîáùåíèé.
+
+ Ðàñøèðåííîå èñïîëüçîâàíèå êîìàíäû SET LIMIT äîñòóïíî òîëüêî äëÿ
+ Àäìèíèñòðàòîðîâ ñåðâèñîâ. Îáû÷íûå ïîëüçîâàòåëè ìîãóòü ìåíÿòü ëèìèò
+ òîëüêî äëÿ ñåáÿ èëè äëÿ êàíàëà, íà êîòîðîì ó íèõ åñòü ñîîòâåòñòâóþùèå
+ ïðèâèëåãèè. Îíè íå ìîãóò óäàëèòü ñâîé ëèìèò, íå ìîãóò óñòàíîâèòü
+ ëèìèò âûøå %d, è íå ìîãóò èñïîëüçîâàòü îïöèþ HARD.
+
+MEMO_SERVADMIN_HELP_INFO
+ Ñèíòàêñèñ: INFO [íèê | #êàíàë]
+
+ Áåç ïàðàìåòðîâ, ïîêàæåò îáùåå êîëè÷åñòâî ñîîáùåíèé, êîòîðîå âû
+ èìååòå, ñêîëüêî èç íèõ íåïðî÷èòàíî, è ñêîëüêî âñåãî ñîîáùåíèé âû
+ ìîæåòå ïðèíèìàòü.
+
+ Åñëè óêàçàòü êàíàë, ïîêàæåò òó æå èíôîðìàöèþ îá óêàçàííîì êàíàëå.
+
+ Åñëè óêàçàòü â êà÷åñòâå ïàðàìåòðà íèê, ïîêàæåò òó æå èíôîðìàöèþ îá
+ óêàçàííîì íèêå.
+ Äàííûé ïàðàìåòð ìîãóò èñïîëüçîâàòü òîëüêî Àäìèíèñòðàòîðû ñåðâèñîâ.
+
+MEMO_HELP_STAFF
+ Ñèíòàêñèñ: STAFF òåêñò_ñîîáùåíèÿ
+
+ Ïîçâîëÿåò îòïðàâèòü ìåìî-ñîîáùåíèå âñåì îïåðàòîðàì/àäìèíèñòðàòîðàì
+ ñåðâèñîâ ñåòè.
+ Ïðèìå÷àíèå: ïîëüçîâàòåëè, çíà÷àùèåñÿ êàê â ñïèñêå îïåðàòîðîâ, òàê
+ è â ñïèñêå àäìèíèñòðàòîðîâ ñåðâèñîâ - ïîëó÷àò äàííîå ñîîáùåíèå äâàæäû.
+ Àíàëîãè÷íî è ïî îòíîøåíèþ ê ðóòàì ñåðâèñîâ.
+
+MEMO_HELP_SENDALL
+ Ñèíòàêñèñ: SENDALL òåêñò_ñîîáùåíèÿ
+
+ Îòïðàâëÿåò ìàññîâîå ìåìî-ñîîáùåíèå âñåì çàðåãèñòðèðîâàííûì
+ ïîëüçîâàòåëÿì ñåòè.
+
+MEMO_HELP_RSEND
+ Ñèíòàêñèñ: RSEND {íèê | #êàíàë} òåêñò_ñîîáùåíèÿ
+
+ Äàííàÿ êîìàíäà àíàëîãè÷íà êîìàíäå SEND è ïîçâîëÿåò ïîñëàòü
+ ñîîáùåíèå äëÿ óêàçàííîãî íèêà èëè êàíàëà. Îòëè÷èòåëüíîé åå
+ îñîáåííîñòüþ ÿâëÿåòñÿ òî, ÷òî ñðàçó ïîñëå ïðî÷òåíèÿ àäðåñàòîì
+ ñîîáùåíèÿ, îòïðàâèòåëü àâòîìàòè÷åñêè ïîëó÷èò èçâåùåíèå î ïðî÷òåíèè.
+ Ñàìî ñîáîé ðàçóìååòñÿ, ÷òî íèê/êàíàë îòïðàâèòåëÿ/ïîëó÷àòåëÿ äîëæíû
+ áûòü çàðåãèñòðèðîâàíû.
+
+MEMO_HELP_CHECK
+ Ñèíòàêñèñ: CHECK íèê
+
+ Ïðîâåðÿåò, áûëî ëè ïðî÷èòàíî ïîñëåäíåå ïîñëàííîå âàìè ñîîáùåíèÿ
+ óêàçàííûì íèêîì.
+ Ïðèìå÷àíèå: êîìàíäà ðàáîòàåò òîëüêî äëÿ íèêîâ, íå äëÿ êàíàëîâ.
+
+###########################################################################
+#
+# OperServ help messages
+#
+###########################################################################
+OPER_HELP_CMD_GLOBAL
+ GLOBAL Îòïðàâêà ãëîáàëüíîãî ñîîáùåíèÿ âñåì ïîëüçîâàòåëÿì ñåòè
+OPER_HELP_CMD_STATS
+ STATS Çàïðîñ èíôîðìàöè î ñòàòóñå ñåðâèñîâ è ñåòè
+OPER_HELP_CMD_OPER
+ OPER Óïðàâëåíèå ñïèñêîì Îïåðàòîðîâ ñåðâèñîâ
+OPER_HELP_CMD_ADMIN
+ ADMIN Óïðàâëåíèå ñïèñêîì Àäìèíèñòðàòîðîâ ñåðâèñîâ
+OPER_HELP_CMD_STAFF
+ STAFF Ñïèñîê âñåõ ïðîïèñàííûõ íà ñåðâèñàõ è èõ îíëàéí-ñòàòóñ
+OPER_HELP_CMD_MODE
+ MODE Èçìåíåíèå êàêîãî-ëèáî ðåæèìà íà óêàçàííîì êàíàëà
+OPER_HELP_CMD_KICK
+ KICK Êèêíóòü ïîëüçîâàòåëÿ ñ êàíàëà ïîñðåäñòâîì ñåðâèñîâ
+OPER_HELP_CMD_CLEARMODES
+ CLEARMODES Î÷èñòêà âñåõ ðåæèìîâ óêàçàííîãî êàíàëà
+OPER_HELP_CMD_KILLCLONES
+ KILLCLONES Îòêëþ÷èòü âñåõ ïîëüçîâàòåëåé ñ îïðåäåëåííîãî õîñòà
+OPER_HELP_CMD_AKILL
+ AKILL Óïðàâëåíèå ñïèñêîì AKILL'îâ
+OPER_HELP_CMD_SGLINE
+ SGLINE Óïðàâëåíèå ñïèñêîì SGLINE'îâ
+OPER_HELP_CMD_SQLINE
+ SQLINE Óïðàâëåíèå ñïèñêîì SQLINE'îâ
+OPER_HELP_CMD_SZLINE
+ SZLINE Óïðàâëåíèå ñïèñêîì SZLINE'îâ
+OPER_HELP_CMD_CHANLIST
+ CHANLIST Ñïèñîê òåêóùèõ àêòèâíûõ êàíàëîâ ñåòè
+OPER_HELP_CMD_USERLIST
+ USERLIST Ñïèñîê òåêóùèõ ïîëüçîâàòåëåé ñåòè
+OPER_HELP_CMD_LOGONNEWS
+ LOGONNEWS Óïðàâëåíèå ñïèñêîì íîâîñòåé ïðè ïîäêëþ÷åíèè
+OPER_HELP_CMD_RANDOMNEWS
+ RANDOMNEWS Óïðàâëåíèå ñïèñêîì ñëó÷àéíûõ íîâîñòåé
+OPER_HELP_CMD_OPERNEWS
+ OPERNEWS Óïðàâëåíèå ñïèñêîì îïåð-íîâîñòåé
+OPER_HELP_CMD_SESSION
+ SESSION Ïðîñìîòð êîëè÷åñòâà ñåññèé ñ óêàçàííîãî õîñòà
+OPER_HELP_CMD_EXCEPTION
+ EXCEPTION Óïðàâëåíèå ñïèñêîì èñêëþ÷åíèé èç ëèìèòà ñåññèé
+OPER_HELP_CMD_NOOP
+ NOOP Âðåìåííîå óäàëåíèå âñåõ O:line'îâ ñ óêàçàííîãî
+ ñåðâåðà ñåòè
+OPER_HELP_CMD_JUPE
+ JUPE "Äæóï" óêàçàííîãî ñåðâåðà ñåòè
+OPER_HELP_CMD_IGNORE
+ IGNORE Óïðàâëåíèå èãíîð-ñïèñêîì ñåðâèñîâ
+OPER_HELP_CMD_SET
+ SET Íàñòðîéêà ðàçëè÷íûõ îïöèé ñåðâèñîâ
+OPER_HELP_CMD_RELOAD
+ RELOAD Ïåðåçàãðóçêà êîíôèãóðàöèîííîãî ôàéëà ñåðâèñîâ
+OPER_HELP_CMD_UPDATE
+ UPDATE Îáíîâëåíèå áàç äàííûõ ñåðâèñîâ (ñîõðàíåíèå íà äèñê)
+OPER_HELP_CMD_RESTART
+ RESTART Ñîõðàíèòü áàçû äàííûõ è ïåðåçàïóñòèòü ñåðâèñû
+OPER_HELP_CMD_QUIT
+ QUIT Çàâåðøèòü ðàáîòó ñåðâèñîâ áåç ñîõðàíåíèÿ áàçû äàííûõ
+OPER_HELP_CMD_SHUTDOWN
+ SHUTDOWN Çàâåðøèòü ðàáîòó ñåðâèñîâ ñ ñîõðàíåíèåì áàçû äàííûõ
+OPER_HELP_CMD_DEFCON
+ DEFCON Óïðàâëåíèå ñèñòåìîé DefCon (çàùèòíûõ êîíòðìåð)
+OPER_HELP_CMD_CHANKILL
+ CHANKILL "Ïðèáèòü" âñåõ ïîëüçîâàòåëåé íà óêàçàííîì êàíàëå
+OPER_HELP_CMD_OLINE
+ OLINE Óñòàíîâêà îïåðôëàãîâ óêàçàííîìó ïîëüçîâàòåëþ ñåòè
+OPER_HELP_CMD_UMODE
+ UMODE Èçìåíåíèå ðåæèìîâ êàêîãî-ëèáî ïîëüçîâàòåëÿ ñåòè
+OPER_HELP_CMD_SVSNICK
+ SVSNICK Ïðèíóäèòåëüíîå èçìåíåíèå íèêà ïîëüçîâàòåëÿ ñåòè
+OPER_HELP_CMD_MODLOAD
+ MODLOAD Çàãðóçèòü ìîäóëü
+OPER_HELP_CMD_MODUNLOAD
+ MODUNLOAD Âûãðóçèòü ìîäóëü
+OPER_HELP_CMD_MODINFO
+ MODINFO Èíôîðìàöèÿ î çàãðóæåííîì ìîäóëå
+OPER_HELP_CMD_MODLIST
+ MODLIST Ñïèñîê çàãðóæåííûõ ìîäóëåé
+
+OPER_HELP
+ Ñïèñîê êîìàíä %S:
+
+OPER_HELP_LOGGED
+ Ïðèìå÷àíèå: âñå êîìàíäû %S'ó çàïèñûâàþòñÿ â ëîã!
+
+OPER_HELP_GLOBAL
+ Ñèíòàêñèñ: GLOBAL ñîîáùåíèå
+
+ Ïîçâîëÿåò Àäìèíèñòðàòîðàì ñåðâèñîâ îòïðàâëÿòü ãëîáàëüíûå ñîîáùåíèÿ
+ âñåì ïîëüçîâàòåëÿì ñåòè.  êà÷åñòâå íèêà îòïðàâèòåëÿ áóäåò óêàçàí
+ %s.
+
+OPER_HELP_STATS
+ Ñèíòàêñèñ: STATS [AKILL | ALL | RESET | MEMORY | UPLINK]
+
+ Èñïîëüçîâàííàÿ áåç ïàðàìåòðîâ, êîìàíäà ïîêàæåò òåêóùåå êîëè÷åñòâî
+ ïîëüçîâàòåëåé ñåòè, òåêóùåå êîë-âî IRC-îïåðàòîðîâ (çà èñêëþ÷åíèåì
+ ñàìèõ ñåðâèñîâ), ìàêñèìàëüíî çàôèêñèðîâàííîå ÷èñëî ïîëüçîâàòåëåé
+ è âðåìÿ ðàáîòû ñåðâèñîâ â ñåòè.
+
+ Ñ ïàðàìåòðîì AKILL, ïîêàæåò òåêóùèé ðàçìåð ñïèñêà AKILL'îâ è âðåìÿ
+ èñòå÷åíèÿ AKILL'îâ ïî-óìîë÷àíèþ (AKILL, SZLINE, ZGLINE, ZQLINE).
+
+ Ïàðàìåòð RESET ñáðàñûâàåò ñ÷åò÷èê çàôèêñèðîâàííîãî ìàêñèìóìà
+ ïîëüçîâàòåëåé ñåòè.
+
+ Ïàðàìåòð MEMORY âûâåäåò èíôîðìàöèþ îá èñïîëüçîâàíèè ñåðâèñàìè
+ îïåðàòèâíîé ïàìÿòè. Çàïðîñû ïîäîáíîé ñòàòèñòèêè ìîãó çàòîðìîçèòü
+ ðàáîòó ñåðâèñîâ íà îïðåäåëåííûé ïðîìåæóòîê âðåìåíè, ïîýòîìó, íå
+ ðåêîìåíäóåòñÿ èñïîëüçîâàòü ïàðàìåòð MEMORY ñëèøêîì ÷àñòî.
+
+ Ïàðàìåòð UPLINK ïîêàæåò èíôîðìàöèþ î ñåðâåðå, ê êîòîðîìó
+ ïðèëèíêîâàíû ñåðâèñû ñåòè.
+
+ Ïàðàìåòð ALL âûâåäåò îáùóþ ñòàòèñòèêó â êîìáèíàöèè ñ äàííûìè èç
+ MEMORY è UPLINK.
+
+ Êîìàíäà UPTIME ÿâëÿåòñÿ àëèàñîì êîìàíäû STATS.
+
+OPER_HELP_OPER
+ Ñèíòàêñèñ: OPER ADD íèê
+ OPER DEL {íèê | íîìåð_çàïèñè | ñïèñîê_çàïèñåé}
+ OPER LIST [ìàñêà | ñïèñîê_çàïèñåé]
+ OPER CLEAR
+
+ Ïîçâîëÿåò Ðóòàì ñåðâèñîâ óïðàâëÿòü ñïèñêîì îïåðàòîðîâ ñåðâèñîâ.
+ Îïåðàòîðû ñåðâèñîâ íå èìåþò âîçìîæíîñòè àäìèíèñòðèðîâàòü íèêè è
+ êàíàëû ñåòè, îäíàêî, îíè èìåþò äîñòóï ê íåêîòîðûì êîìàíäàì/ôóíêöèÿì
+ îïåðàòîðñêîãî ñåðâèñà ñåòè. Äëÿ èñïîëüçîâàíèÿ ñâîèõ ïðèâèëåãèé îíè
+ äîëæíû èìåòü ñòàòóñ IRC-îïåðàòîðà è áûòü ïðîèäåíòèôèöèðîâàíû ê íèêó
+ íà %s.
+
+ Êîìàíäà OPER ADD ïîçâîëÿåò äîáàâèòü óêàçàííûé íèê â ñïèñîê
+ Îïåðàòîðîâ ñåðâèñîâ.
+
+ Êîìàíäà OPER DEL óäàëÿåò óêàçàííûé íèê èç ñïèñêà Îïåðàòîðîâ
+ ñåðâèñîâ.  êà÷åñòâå ïàðàìåòðà âû ìîæåòå óêàçàòü íå òîëüêî íèê, íî
+ è êîíêðåòíûé íîìåð çàïèñè èëè ñïèñîê çàïèñåé (ñì. ïðèìåðû
+ èñïîëüçîâàíèÿ êîìàíäû LIST íèæå).
+
+ Êîìàíäà OPER LIST âûâîäèò ñïèñîê Îïåðàòîðîâ ñåðâèñîâ.  êà÷åñòâå
+ äîïîëíèòåëüíîãî ïàðàìåòðà, âû ìîæåòå óêàçàòü ñèìâîëüíóþ ìàñêó, ÷òî
+ ïîçâîëèò âàì ïîëó÷èòü ñïèñîê ñ êîíêðåòíûìè íèêàìè, ïîïàäàþùèìè ïîä
+ ýòó ìàñêó, èëè æå, âû ìîæåòå óêàçàòü ñïèñîê çàïèñåé. Íàïðèìåð:
+
+ OPER LIST 2-5,7-9
+ îòîáðàçèò âñå çàïèñè ñ 2-îé ïî 5-þ è ñ 7-îé ïî 9-þ.
+
+ Êîìàíäà OPER CLEAR ïîçâîëÿåò ïîëíîñòüþ î÷èñòèòü ñïèñîê Îïåðàòîðîâ
+ ñåðâèñîâ.
+
+ Èñïîëüçîâàòü êîìàíäó OPER LIST ìîæåò ëþáîé ïîëüçîâàòåëü ñ ïðàâàìè
+ IRC-îïåðàòîðà, îñòàëüíûå êîìàíäû îãðàíè÷åíû äî Ðóòà ñåðâèñîâ.
+
+OPER_HELP_ADMIN
+ Ñèíòàêñèñ: ADMIN ADD íèê
+ ADMIN DEL {íèê | íîìåð_çàïèñè | ñïèñîê_çàïèñåé}
+ ADMIN LIST [ìàñêà | ñïèñîê_çàïèñåé]
+ ADMIN CLEAR
+
+ Ïîçâîëÿåò Ðóòàì ñåðâèñîâ óïðàâëÿòü ñïèñêîì Àäìèíèñòðàòîðîâ ñåðâèñîâ.
+ Ïîìèìî âñåõ ïðèâèëåãèé Îïåðàòîðâî ñåðâèñîâ, Àäìèíèñòðàòîðû ñåðâèñîâ
+ îáëàäàþò äîïîëíèòåëüíûìè âîçìîæíîñòÿìè ïî àäìèíñòðèðîâàíèþ íèêîâ è
+ êàíàëîâ ñåòè. Èì äîñòóïíû ïðàêòè÷åñêè âñå ôóíêöèè îïåðàòîðñêîãî
+ ñåðâèñà ñåòè.
+ Äëÿ èñïîëüçîâàíèÿ ñâîèõ ïðèâèëåãèé, îíè äîëæíû èìåòü ñòàòóñ
+ IRC-îïåðàòîðà ñåòè è áûòü ïðîèäåíòèôèöèðîâàíû ê íèêó íà %s.
+
+ Êîìàíäà ADMIN ADD ïîçâîëÿåò äîáàâèòü óêàçàííûé íèê â ñïèñîê
+ Àäìèíèñòðàòîðîâ ñåðâèñîâ.
+
+ Êîìàíäà ADMIN DEL óäàëÿåò óêàçàííûé íèê èç ñïèñêà Àäìèíèñòðàòîðîâ
+ ñåðâèñîâ.  êà÷åñòâå ïàðàìåòðà âû ìîæåòå óêàçàòü íå òîëüêî íèê, íî
+ è êîíêðåòíûé íîìåð çàïèñè èëè ñïèñîê çàïèñåé (ñì. ïðèìåðû
+ èñïîëüçîâàíèÿ êîìàíäû LIST íèæå).
+
+ Êîìàíäà ADMIN LIST âûâîäèò ñïèñîê Àäìèíèñòðàòîðîâ ñåðâèñîâ. Â
+ êà÷åñòâå äîïîëíèòåëüíîãî ïàðàìåòðà, âû ìîæåòå óêàçàòü ñèìâîëüíóþ
+ ìàñêó, ÷òî ïîçâîëèò âàì ïîëó÷èòü ñïèñîê ñ êîíêðåòíûìè íèêàìè,
+ ïîïàäàþùèìè ïîä ýòó ìàñêó, èëè æå, âû ìîæåòå óêàçàòü ñïèñîê çàïèñåé.
+ Íàïðèìåð:
+
+ ADMIN LIST 2-5,7-9
+ îòîáðàçèò âñå çàïèñè ñ 2-îé ïî 5-þ è ñ 7-îé ïî 9-þ.
+
+ Êîìàíäà ADMIN CLEAR ïîçâîëÿåò ïîëíîñòüþ î÷èñòèòü ñïèñîê
+ Àäìèíèñòðàòîðîâ ñåðâèñîâ.
+
+ Èñïîëüçîâàòü êîìàíäó ADMIN LIST ìîæåò ëþáîé ïîëüçîâàòåëü ñ ïðàâàìè
+ IRC-îïåðàòîðà, îñòàëüíûå êîìàíäû îãðàíè÷åíû äî Ðóòà ñåðâèñîâ.
+
+OPER_HELP_IGNORE
+ Ñèíòàêñèñ: IGNORE {ADD|DEL|LIST|CLEAR} [âðåìÿ] [íèê|ìàñêà]
+
+ Ïîçâîëÿåò Àäìèíèñòðàòîðàì ñåðâèñîâ óïðàâëÿòü ñïèñêîì èãíîðèðóåìûõ
+ ñåðâèñàìè ïîëüçîâàòåëåé.
+ Ïî-óìîë÷àíèþ, ïàðàìåòð [âðåìÿ] ÿâëÿåòñÿ ñåêóíäàìè. Îäíàêî, âû ìîæåòå
+ óêàçàòü è èíûå åäèíèöû èçìåðåíèÿ, èñïîëüçóÿ: s äëÿ ñåêóíä, m äëÿ
+ ìèíóò, h äëÿ ÷àñîâ è d äëÿ äíåé. Êîìáèíàöèè ýòèõ åäèíèö èçìåðåíèÿ
+ íåäîïóñòèìû. Óñòàíîâêà âðåìåíè èãíîðà â 0 ñäåëàåò åãî ïîñòîÿííûì.
+  êà÷åñòâå ïîñëåäíåãî çíà÷åíèÿ âû äîëæíû óêàçàòü âàëèäíûé íèê èëè
+ ìàñêó âèäà íèê!èäåíò@õîñò èëè èäåíò@õîñò. Ëþáûå äðóãèå çíà÷åíèÿ áóäóò
+ ðàñöåíèâàòüñÿ â êà÷åñòâå íèêà.
+
+ Ïîëüçîâàòåëè ñî ñòàòóñîì IRC-îïåðàòîðà èãíîðèðîâàòüñÿ ñåðâèñàìè íå
+ áóäóò, äàæå åñëè îíè ïðèñóòñòâóþò â ñïèñêå èãíîðà.
+
+OPER_HELP_MODE
+ Ñèíòàêñèñ: MODE #êàíàë ðåæèìû
+
+ Ïîçâîëÿåò Îïåðàòîðàì ñåðâèñîâ èçìåíÿòü ðåæèìû íà êàêîì-ëèáî êàíàëå.
+  êà÷åñòâå âòîðîãî ïàðàìåòðà êîìàíäû, âû äîëæíû óêàçàòü ðåæèìû â
+ òîì æå ôîðìàòå, â êîòîðîì óêàçûâàåòå ïðè ðó÷íîé óñòàíîâêå, ñ ïîìîùüþ
+ êîìàíäû /MODE.
+
+OPER_HELP_UMODE
+ Ñèíòàêñèñ: UMODE íèê ðåæèìû
+
+ Ïîçâîëÿåò Àäìèíèñòðàòîðàì ñåðâèñîâ èçìåíÿòü ïîëüçîâàòåëüñêèå ðåæèìû
+ (usermodes) ëþáîãî ïîñåòèòåëÿ ñåòè.  êà÷åñòâå âòîðîãî ïàðàìåòðà
+ êîìàíäû, âû äîëæíû óêàçàòü ðåæèìû â òîì æå ôîðìàòå, â êîòîðîì
+ óêàçûâàåòå ïðè ðó÷íîé óñòàíîâêå, ñ ïîìîùüþ êîìàíäû /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 #êàíàë íèê ïðè÷èíà
+
+ Ïîçâîëÿåò Îïåðàòîðàì ñåðâèñîâ âûêèíóòü êàêîãî-ëèáî ïîëüçîâàòåëÿ ñ
+ óêàçàííîãî êàíàëà ñåòè.
+ Ïàðàìåòðû äàííîé êîìàíäû àíàëîãè÷íû ïàðàìåòðàì ñòàíäàðòíîé êîìàíäû
+ /KICK. Ïðè÷èíà êèêà áóäåò âêëþ÷àòü â ñåáÿ íèê Îïåðàòîðà ñåðâèñîâ,
+ êîòîðûé èñïîëüçîâàë äàííóþ êîìàíäó, íàïðèìåð:
+
+ *** SpamMan was kicked by %S (Alcan (Flood))
+
+OPER_HELP_SVSNICK
+ Ñèíòàêñèñ: SVSNICK íèê íîâûé_íèê
+
+ Ïîçâîëÿåò ïðèíóäèòåëüíî èçìåíèòü óêàçàííûé íèê íà íîâûé_íèê.
+
+OPER_HELP_AKILL
+ Ñèíòàêñèñ: AKILL ADD [+ñðîê_èñòå÷åíèÿ] ìàñêà ïðè÷èíà
+ AKILL DEL {ìàñêà | íîìåð_çàïèñè | ñïèñîê_çàïèñåé}
+ AKILL LIST [ìàñêà | ñïèñîê_çàïèñåé]
+ AKILL VIEW [ìàñêà | ñïèñîê_çàïèñåé]
+ AKILL CLEAR
+
+ Ïîçâîëÿåò Îïåðàòîðàì ñåðâèñîâ óïðàâëÿòü ñïèñêîì ñåðâèñíûõ AKILL'îâ.
+ Ëþáîé ïîëüçîâàòåëü, ïîäïàäàþùèé ïîä ìàñêó AKILL'à, áóäåò íåìåäëåííî
+ îòêëþ÷åí îò ñåòè ïîñðåäñòâîì ñåðâèñíîãî KILL'à ñ óêàçàííîé ïðè÷èíîé,
+ è íå âàæíî, íà êàêîì ñåðâåðå îí ñèäèò èëè ê êàêîìó ïîäêëþ÷àåòñÿ.
+ Ïîìèìî ýòîãî, åñëè IRCd âàøåé ñåòè ýòî ïîääåðæèâàåò, ñåðâèñû
+ óñòàíîâÿò KLINE/GLINE íà âñåõ ñåðâåðàõ âàøåé ñåòè, â êà÷åñòâå ìàñêè
+ áàíà áóäåò èñïîëüçîâàíà ñîîòâåòñòâóþùàÿ çàïèñü AKILL'à.
+
+ Êîìàíäà AKILL ADD äîáàâëÿåò ìàñêó âèäà èäåíò@õîñò/ip ñ óêàçàííîé
+ ïðè÷èíîé â ñïèñîê AKILL'îâ (íàëè÷èå ïðè÷èíû - îáÿçàòåëüíî).
+ Çíà÷åíèå ñðîêà èñòå÷åíèÿ - ýòî öåëîå ÷èñëî, êîòîðîå ìîæåò áûòü
+ îäíèì èç: d (äíåé), h (÷àñîâ), èëè m (ìèíóò). Òàêèå ñî÷åòàíèÿ
+ êàê 1h30m - íåäîïóñòèìû. Åñëè åäèíèöà èçìåðåíèÿ íå óêàçàíà, òî
+ ïî-óìîë÷àíèþ, îíà áóäåò ïðèíÿòà çà "d" - "äíè" (òàêèì îáðàçîì,
+ +30 áóäåò îçíà÷àòü 30 äíåé). ×òîáû äîáàâèòü ïîñòîÿííûé AKILL,
+ èñïîëüçóéòå âðåìÿ èñòå÷åíèÿ ðàâíûì +0. Ïîìíèòå, ÷òî åñëè â êà÷åñòâå
+ ïåðâîãî ñèìâîëà âòîðîãî ïàðàìåòðà óêàçàí çíàê "+" - âû äîëæíû
+ îáîçíà÷èòü ñðîêè èñòå÷åíèÿ çàïèñè, äàæå åñëè ýòî áóäåò çíà÷åíèå
+ ïî-óìî÷àíèþ.
+ Òåêóùåå âðåìÿ èñòå÷åíèÿ AKILL'à ïî-óìîë÷àíèþ, ìîæíî óçíàòü ñ ïîìîùüþ
+ êîìàíäû STATS AKILL.
+
+ Êîìàíäà AKILL DEL óäàëÿåò óêàçàííóþ ìàñêó èç ñïèñêà AKILL'îâ.
+  êà÷åñòâå ïàðàìåòðà âû ìîæåòå óêàçàòü íå òîëüêî ìàñêó AKILL'à, íî
+ è êîíêðåòíûé íîìåð çàïèñè èëè ñïèñîê çàïèñåé (ñì. ïðèìåðû
+ èñïîëüçîâàíèÿ êîìàíäû LIST íèæå).
+
+ Êîìàíäà AKILL LIST ïîêàçûâàåò òåêóùèé ñïèñîê AKILL'îâ.
+  êà÷åñòâå äîïîëíèòåëüíîãî ïàðàìåòðà, âû ìîæåòå óêàçàòü ñèìâîëüíóþ
+ ìàñêó, ÷òî ïîçâîëèò âàì ïîëó÷èòü ñïèñîê ñ êîíêðåòíûìè çàïèñÿìè,
+ ïîïàäàþùèìè ïîä ýòó ìàñêó, èëè æå, âû ìîæåòå óêàçàòü ñïèñîê çàïèñåé.
+ Íàïðèìåð:
+
+ AKILL LIST 2-5,7-9
+ îòîáðàçèò âñå çàïèñè ñ 2-îé ïî 5-þ è ñ 7-îé ïî 9-þ.
+
+ AKILL VIEW áîëåå ïîäðîáíàÿ âåðñèÿ AKILL LIST, îíà ïîêàæåò âàì
+ êòî äîáàâèë AKILL, âðåìÿ óñòàíîâêè AKILL'à, êîãäà îí èñòåêàåò, íó
+ è, êîíå÷íî æå, ìàñêó âèäà èäåíò@õîñò/ip è ïðè÷èíó AKILL'à.
+
+ AKILL CLEAR ïîçâîëÿåò ïîëíîñòüþ î÷èñòèòü ñïèñîê AKILL'îâ.
+
+OPER_HELP_SGLINE
+ Ñèíòàêñèñ: SGLINE ADD [+ñðîê_èñòå÷åíèÿ] ìàñêà:ïðè÷èíà
+ SGLINE DEL {ìàñêà | íîìåð_çàïèñè | ñïèñîê_çàïèñåé}
+ SGLINE LIST [ìàñêà | ñïèñîê_çàïèñåé]
+ SGLINE VIEW [ìàñêà | ñïèñîê_çàïèñåé]
+ SGLINE CLEAR
+
+ Ïîçâîëÿåò Îïåðàòîðàì ñåðâèñîâ óïðàâëÿòü ñïèñêîì ñåðâèñíûõ SGLINE'îâ.
+ SGLINE-çàïèñü ïîçâîëÿåò âàì ïîñòàâèòü ãëîáàëüíûé áàí íà îïðåäåëåííûé
+ RealName aka GECOS. Ëþáîé ïîëüçîâàòåëü, ðåàëüíîå èìÿ êîòîðîãî
+ ïîïàäåò ïîä ìàñêó êàêîé-ëèáî çàïèñè â SGLINE-ñïèñêå, áóäåò ñðàçó æå
+ îòêëþ÷åí îò ñåòè è â äàëüíåéøåì, ñåðâèñû íå ïîçâîëÿò åìó ïîäêëþ÷èòñÿ.
+
+ Êîìàíäà SGLINE ADD äîáàâëÿåò ìàñêó ðåàëüíîãî èìåíè ñ óêàçàííîé
+ ïðè÷èíîé â ñïèñîê SGLINE'îâ (íàëè÷èå ïðè÷èíû - îáÿçàòåëüíî).
+ Çíà÷åíèå ñðîêà èñòå÷åíèÿ - ýòî öåëîå ÷èñëî, êîòîðîå ìîæåò áûòü
+ îäíèì èç: d (äíåé), h (÷àñîâ), èëè m (ìèíóò). Òàêèå ñî÷åòàíèÿ
+ êàê 1h30m - íåäîïóñòèìû. Åñëè åäèíèöà èçìåðåíèÿ íå óêàçàíà, òî
+ ïî-óìîë÷àíèþ, îíà áóäåò ïðèíÿòà çà "d" - "äíè" (òàêèì îáðàçîì,
+ +30 áóäåò îçíà÷àòü 30 äíåé). ×òîáû äîáàâèòü ïîñòîÿííûé SGLINE,
+ èñïîëüçóéòå âðåìÿ èñòå÷åíèÿ ðàâíûì +0. Ïîìíèòå, ÷òî åñëè â êà÷åñòâå
+ ïåðâîãî ñèìâîëà âòîðîãî ïàðàìåòðà óêàçàí çíàê "+" - âû äîëæíû
+ îáîçíà÷èòü ñðîêè èñòå÷åíèÿ çàïèñè, äàæå åñëè ýòî áóäåò çíà÷åíèå
+ ïî-óìî÷àíèþ.
+ Òåêóùåå âðåìÿ èñòå÷åíèÿ SGLINE'à ïî-óìîë÷àíèþ, ìîæíî óçíàòü ñ ïîìîùüþ
+ êîìàíäû STATS AKILL.
+ Ïðèìå÷àíèå: òàê êàê ñòðîêè ðåàëüíûõ èìåí ìîãóò ñîäåðæàòü ïðîáåëû,
+ ðàçäåëèòåëåì ìåæäó ìàñêîé ðåàëüíîãî èìåíè è ïðè÷èíîé áóäåò äâîåòî÷èå.
+
+ Êîìàíäà SGLINE DEL óäàëÿåò óêàçàííóþ ìàñêó èç ñïèñêà SGLINE'îâ.
+  êà÷åñòâå ïàðàìåòðà âû ìîæåòå óêàçàòü íå òîëüêî ìàñêó SGLINE'à, íî
+ è êîíêðåòíûé íîìåð çàïèñè èëè ñïèñîê çàïèñåé (ñì. ïðèìåðû
+ èñïîëüçîâàíèÿ êîìàíäû LIST íèæå).
+
+ Êîìàíäà SGLINE LIST ïîêàçûâàåò òåêóùèé ñïèñîê SGLINE'îâ.
+  êà÷åñòâå äîïîëíèòåëüíîãî ïàðàìåòðà, âû ìîæåòå óêàçàòü ñèìâîëüíóþ
+ ìàñêó, ÷òî ïîçâîëèò âàì ïîëó÷èòü ñïèñîê ñ êîíêðåòíûìè çàïèñÿìè,
+ ïîïàäàþùèìè ïîä ýòó ìàñêó, èëè æå, âû ìîæåòå óêàçàòü ñïèñîê çàïèñåé.
+ Íàïðèìåð:
+
+ SGLINE LIST 2-5,7-9
+ îòîáðàçèò âñå çàïèñè ñ 2-îé ïî 5-þ è ñ 7-îé ïî 9-þ.
+
+ SGLINE VIEW áîëåå ïîäðîáíàÿ âåðñèÿ SGLINE LIST, îíà ïîêàæåò êòî
+ äîáàâèë SGLINE, âðåìÿ óñòàíîâêè SGLINE'à, êîãäà îí èñòåêàåò, íó è,
+ êîíå÷íî æå, ìàñêó ðåàëüíîãî èìåíè è ïðè÷èíó SGLINE'à.
+
+ SGLINE CLEAR ïîçâîëÿåò ïîëíîñòüþ î÷èñòèòü ñïèñîê SGLINE'îâ.
+
+OPER_HELP_SQLINE
+ Ñèíòàêñèñ: SQLINE ADD [+ñðîê_èñòå÷åíèÿ] ìàñêà ïðè÷èíà
+ SQLINE DEL {ìàñêà | íîìåð_çàïèñè | ñïèñîê_çàïèñåé}
+ SQLINE LIST [ìàñêà | ñïèñîê_çàïèñåé]
+ SQLINE VIEW [ìàñêà | ñïèñîê_çàïèñåé]
+ SQLINE CLEAR
+
+ Ïîçâîëÿåò Îïåðàòîðàì ñåðâèñîâ óïðàâëÿòü ñïèñêîì ñåðâèñíûõ SQLINE'îâ.
+ SQLINE-çàïèñü ïîçâîëÿåò âàì ïîñòàâèòü ãëîáàëüíûé áàí íà îïðåäåëåííûé
+ íèê èëè ìàñêó íèêà. Ëþáîé ïîëüçîâàòåëü, íèê êîòîðîãî ïîïàäåò ïîä
+ ìàñêó êàêîé-ëèáî çàïèñè â SQLINE-ñïèñêå, áóäåò ñðàçó æå îòêëþ÷åí îò
+ ñåòè è â äàëüíåéøåì, ñåðâèñû íå ïîçâîëÿò åìó ïîäêëþ÷èòñÿ ñ ýòèì íèêîì.
+
+ Åñëè IRCd âàøåé ñåòè ïîääåðæèâàåò óñòàíîâêó QLINE íå òîëüêî íà íèêè,
+ íî è íà êàíàëû - âû ìîæåòå óêàçàòü â êà÷åñòâå ïåðâîãî ñèìâîëà ìàñêè
+ '#' - ÷òîáû çàïðåòèòü ê èñïîëüçîâàíèþ óêàçàííûé êàíàë.
+
+ Êîìàíäà SQLINE ADD äîáàâëÿåò óêàçàííûé íèê èëè êàíàë ñ óêàçàííîé
+ ïðè÷èíîé â ñïèñîê SQLINE'îâ (íàëè÷èå ïðè÷èíû - îáÿçàòåëüíî).
+ Çíà÷åíèå ñðîêà èñòå÷åíèÿ - ýòî öåëîå ÷èñëî, êîòîðîå ìîæåò áûòü
+ îäíèì èç: d (äíåé), h (÷àñîâ), èëè m (ìèíóò). Òàêèå ñî÷åòàíèÿ
+ êàê 1h30m - íåäîïóñòèìû. Åñëè åäèíèöà èçìåðåíèÿ íå óêàçàíà, òî
+ ïî-óìîë÷àíèþ, îíà áóäåò ïðèíÿòà çà "d" - "äíè" (òàêèì îáðàçîì,
+ +30 áóäåò îçíà÷àòü 30 äíåé). ×òîáû äîáàâèòü ïîñòîÿííûé SQLINE,
+ èñïîëüçóéòå âðåìÿ èñòå÷åíèÿ ðàâíûì +0. Ïîìíèòå, ÷òî åñëè â êà÷åñòâå
+ ïåðâîãî ñèìâîëà âòîðîãî ïàðàìåòðà óêàçàí çíàê "+" - âû äîëæíû
+ îáîçíà÷èòü ñðîêè èñòå÷åíèÿ çàïèñè, äàæå åñëè ýòî áóäåò çíà÷åíèå
+ ïî-óìî÷àíèþ.
+ Òåêóùåå âðåìÿ èñòå÷åíèÿ SQLINE'à ïî-óìîë÷àíèþ, ìîæíî óçíàòü ñ ïîìîùüþ
+ êîìàíäû STATS AKILL.
+
+ Êîìàíäà SQLINE DEL óäàëÿåò óêàçàííóþ ìàñêó èç ñïèñêà SQLINE'îâ.
+  êà÷åñòâå ïàðàìåòðà âû ìîæåòå óêàçàòü íå òîëüêî ìàñêó SQLINE'à, íî
+ è êîíêðåòíûé íîìåð çàïèñè èëè ñïèñîê çàïèñåé (ñì. ïðèìåðû
+ èñïîëüçîâàíèÿ êîìàíäû LIST íèæå).
+
+ Êîìàíäà SQLINE LIST ïîêàçûâàåò òåêóùèé ñïèñîê SQLINE'îâ.
+  êà÷åñòâå äîïîëíèòåëüíîãî ïàðàìåòðà, âû ìîæåòå óêàçàòü ñèìâîëüíóþ
+ ìàñêó, ÷òî ïîçâîëèò âàì ïîëó÷èòü ñïèñîê ñ êîíêðåòíûìè çàïèñÿìè,
+ ïîïàäàþùèìè ïîä ýòó ìàñêó, èëè æå, âû ìîæåòå óêàçàòü ñïèñîê çàïèñåé.
+ Íàïðèìåð:
+
+ SQLINE LIST 2-5,7-9
+ îòîáðàçèò âñå çàïèñè ñ 2-îé ïî 5-þ è ñ 7-îé ïî 9-þ.
+
+ SQLINE VIEW áîëåå ïîäðîáíàÿ âåðñèÿ SQLINE LIST, îíà ïîêàæåò âàì
+ êòî äîáàâèë SQLINE, âðåìÿ óñòàíîâêè SQLINE'à, êîãäà îí èñòåêàåò, íó
+ è, êîíå÷íî æå, ìàñêó íèêà èëè êàíàëà è ïðè÷èíó óñòàíâîêè SQLINE'à.
+
+ SQLINE CLEAR ïîçâîëÿåò ïîëíîñòüþ î÷èñòèòü ñïèñîê SQLINE'îâ.
+
+OPER_HELP_SZLINE
+ Ñèíòàêñèñ: SZLINE ADD [+ñðîê_èñòå÷åíèÿ] ip-ìàñêà ïðè÷èíà
+ SZLINE DEL {ìàñêà | íîìåð_çàïèñè | ñïèñîê_çàïèñåé}
+ SZLINE LIST [ìàñêà | ñïèñîê_çàïèñåé]
+ SZLINE VIEW [ìàñêà | ñïèñîê_çàïèñåé]
+ SZLINE CLEAR
+
+ Ïîçâîëÿåò Îïåðàòîðàì ñåðâèñîâ óïðàâëÿòü ñïèñêîì ñåðâèñíûõ SZLINE'îâ.
+ SZLINE-çàïèñü ïîçâîëÿåò âàì ïîñòàâèòü ãëîáàëüíûé áàí íà îïðåäåëåííûé
+ IP-àäðåñ. Ëþáîé ïîëüçîâàòåëü, ip-àäðåñ êîòîðîãî ïîïàäåò ïîä
+ ìàñêó êàêîé-ëèáî çàïèñè â SZLINE-ñïèñêå, áóäåò ñðàçó æå îòêëþ÷åí îò
+ ñåòè è â äàëüíåéøåì, ñåðâèñû íå ïîçâîëÿò åìó ïîäêëþ÷èòñÿ ñ ýòèì IP.
+ Íàëè÷èå èëè îòñóòñòâèå PTR RR çàïèñè äëÿ äàííîãî IP - ðîëè íå èãðàåò.
+
+ Êîìàíäà SZLINE ADD äîáàâëÿåò óêàçàííóþ ìàñêó IP-àäðåñà óêàçàííîé
+ ïðè÷èíîé â ñïèñîê SZLINE'îâ (íàëè÷èå ïðè÷èíû - îáÿçàòåëüíî).
+ Çíà÷åíèå ñðîêà èñòå÷åíèÿ - ýòî öåëîå ÷èñëî, êîòîðîå ìîæåò áûòü
+ îäíèì èç: d (äíåé), h (÷àñîâ), èëè m (ìèíóò). Òàêèå ñî÷åòàíèÿ
+ êàê 1h30m - íåäîïóñòèìû. Åñëè åäèíèöà èçìåðåíèÿ íå óêàçàíà, òî
+ ïî-óìîë÷àíèþ, îíà áóäåò ïðèíÿòà çà "d" - "äíè" (òàêèì îáðàçîì,
+ +30 áóäåò îçíà÷àòü 30 äíåé). ×òîáû äîáàâèòü ïîñòîÿííûé SZLINE,
+ èñïîëüçóéòå âðåìÿ èñòå÷åíèÿ ðàâíûì +0. Ïîìíèòå, ÷òî åñëè â êà÷åñòâå
+ ïåðâîãî ñèìâîëà âòîðîãî ïàðàìåòðà óêàçàí çíàê "+" - âû äîëæíû
+ îáîçíà÷èòü ñðîêè èñòå÷åíèÿ çàïèñè, äàæå åñëè ýòî áóäåò çíà÷åíèå
+ ïî-óìî÷àíèþ.
+ Òåêóùåå âðåìÿ èñòå÷åíèÿ SZLINE'à ïî-óìîë÷àíèþ, ìîæíî óçíàòü ñ ïîìîùüþ
+ êîìàíäû STATS AKILL.
+
+ Êîìàíäà SZLINE DEL óäàëÿåò óêàçàííóþ ìàñêó èç ñïèñêà SZLINE'îâ.
+  êà÷åñòâå ïàðàìåòðà âû ìîæåòå óêàçàòü íå òîëüêî ìàñêó SZLINE'à, íî
+ è êîíêðåòíûé íîìåð çàïèñè èëè ñïèñîê çàïèñåé (ñì. ïðèìåðû
+ èñïîëüçîâàíèÿ êîìàíäû LIST íèæå).
+
+ Êîìàíäà SZLINE LIST ïîêàçûâàåò òåêóùèé ñïèñîê SZLINE'îâ.
+  êà÷åñòâå äîïîëíèòåëüíîãî ïàðàìåòðà, âû ìîæåòå óêàçàòü ñèìâîëüíóþ
+ ìàñêó, ÷òî ïîçâîëèò âàì ïîëó÷èòü ñïèñîê ñ êîíêðåòíûìè çàïèñÿìè,
+ ïîïàäàþùèìè ïîä ýòó ìàñêó, èëè æå, âû ìîæåòå óêàçàòü ñïèñîê çàïèñåé.
+ Íàïðèìåð:
+
+ SZLINE LIST 2-5,7-9
+ îòîáðàçèò âñå çàïèñè ñ 2-îé ïî 5-þ è ñ 7-îé ïî 9-þ.
+
+ SZLINE VIEW áîëåå ïîäðîáíàÿ âåðñèÿ SZLINE LIST, îíà ïîêàæåò âàì
+ êòî äîáàâèë SZLINE, âðåìÿ óñòàíîâêè SZLINE'à, êîãäà îí èñòåêàåò, íó
+ è, êîíå÷íî æå, ìàñêó IP-àäðåñà è ïðè÷èíó óñòàíîâêè SZLINE'à.
+
+ SZLINE CLEAR ïîçâîëÿåò ïîëíîñòüþ î÷èñòèòü ñïèñîê SZLINE'îâ.
+
+OPER_HELP_SET
+ Ñèíòàêñèñ: SET îïöèÿ ïàðàìåòð
+
+ Ïîçâîëÿåò íàñòðîèòü ðàçëè÷íûå ãëîáàëüíûå îïöèè ñåðâèñîâ.
+ Äîñòóïíûå îïöèè:
+
+ READONLY àêòèâàöèÿ/äåàêòèâàöèÿ ðåæèìà read-only (òîëüêî-÷òåíèå)
+ LOGCHAN àêòèâàöèÿ/äåàêòèâàöèÿ ëîãèðîâàíèÿ ñîáûòèé íà ñåðâèñíûé êàíàë
+ DEBUG àêòèâàöèÿ/äåàêòèâàöèÿ ðåæèì îòëàäêè (debug mode)
+ NOEXPIRE àêòèâàöèÿ/äåàêòèâàöèÿ ðåæèìà íå-èñòå÷åíèÿ
+ SQL àêòèâàöèÿ/äåàêòèâàöèÿ SQL-ðåæèìà
+ IGNORE àêòèâàöèÿ/äåàêòèâàöèÿ îáðàáîòêè ñïèñêà èãíîðà
+ LIST ïðîñìîòð ñòàòóñà âñåõ âûøåïåðå÷èñëåííûõ îïöèé
+ SUPERADMIN àêòèâàöèÿ/äåàêòèâàöèÿ ðåæèìà Ñóïåð-Àäìèíèñòðàòîðà
+ (îòíîñèòåëüíî èñïîëüçóþùåãî êîìàíäó)
+
+OPER_HELP_SET_READONLY
+ Ñèíòàêñèñ: SET READONLY {ON | OFF}
+
+ Âêëþ÷àåò èëè âûêëþ÷àåò ãëîáàëüíûé ðåæèì READONLY - òîëüêî-÷òåíèå.
+ Ðàáîòà ñåðâèñîâ â äàííîì ðåæèìå çàïðåùàåò îáû÷íûì ïîëüçîâàòåëÿì
+ èçìåíÿòü êàêèå-ëèáî ñåðâèñíûå äàííûå, íàïðèìåð - ñïèñêè äîñòóïà äëÿ
+ íèêîâ èëè êàíàëîâ, èõ íàñòðîéêè è ò. ä. Òåì íå ìåíåå, IRC-îïåðàòîðû
+ ñ äîñòàòî÷íûìè ïðèâèëåãèÿìè íà ñåðâèñàõ ñìîãóò ìîäèôèöèðîâàòü ñïèñîê
+ AKILL'îâ è óäàëÿòü èëè çàïðåùàòü íèêè è êàíàëû, íî âñå ýòè èçìåíåíèÿ
+ íå áóäóò ñîõðàíåíû äî òåõ ïîð, ïîêà ðåæèì READONLY àêòèâåí. ×òî áû
+ ñîõðàíèòü âñå èçìåíåíèÿ, ñäåëàííûå âî âðåìÿ ðàáîòû ñåðâèñîâ â ýòîì
+ ðåæèìå, âû äîëæíû äåàêòèâèðîâàòü ðåæèì òîëüêî-÷òåíèÿ ïðåæäå, ÷åì
+ ðàáîòà ñåðâèñîâ áóäåò çàâåðøåíà èëè îíè áóäóò ïåðåçàïóùåíû.
+
+ Àêòèâèðîâàíèå äàííîé îïöèè ýêâèâàëåíòíî çàïóñêó ñåðâèñîâ ñ êëþ÷îì
+ -readonly.
+
+OPER_HELP_SET_LOGCHAN
+ Ñèíòàêñèñ: SET LOGCHAN {ON | OFF}
+
+ Ïîçâîëÿåò àêòèâèðîâàòü ëîãèðîâàíèå ñåðâèñíûõ ñîáûòèé íà ñïåöèàëüíûé
+ ñåðâèñíûé êàíàë, óêàçàíûé â êîíôèãóðàöèîííîì ôàéëå ñåðâèñîâ. Åñëè
+ äàííàÿ äèðåêòèâà â êîíôèãå íå óêàçàíà, âîçìîæíîñòü íàñòðîéêè îïöèè
+ áóäåò çàáëîêèðîâàíà.
+ Ïðèìå÷àíèå: èç ñîîáðàæåíèé áåçîïàñíîñòè, ðåêîìåíäóåòñÿ îáðàòèòü
+ îñîáîå âíèìàíèå íà îãðàíè÷åíèå äîñòóïà íà ýòîò êàíàë.
+
+ Àêòèâèðîâàíèå äàííîé îïöèè ýêâèâàëåíòíî çàïóñêó ñåðâèñîâ ñ êëþ÷îì
+ -logchan.
+
+OPER_HELP_SET_DEBUG
+ Ñèíòàêñèñ: SET DEBUG {ON | OFF | óðîâåíü}
+
+ Âêëþ÷àåò èëè âûêëþ÷àåò îòëàäî÷íûé ðåæèì ðàáîòû ñåðâèñîâ. Àêòèâàöèÿ
+ äàííîãî ðåæèìà ïîçâîëèò áîëåå äåòàëüíî ëîãèðîâàòü ðàáîòó ñåðâèñîâ,
+ â ÷àñòíîñòè - çàïèñûâàòü â ëîã âñå ïîñëàííûå è ïðèíÿòûå ñåðâèñàìè
+ äàííûå, è îïåðàöèè ñ ýòèìè ñàìûìè äàííûìè.  êà÷åñòâå ïàðàìåòðà âû
+ ìîæååò óêàçàòü óðîâåíü äåòàëüíîñòü îòëàäî÷íîãî ðåæèìà, ÷åì âûøå
+ óðîâåíü - òåì áîëåå äåòàëüíûìè (è îáüåìíûìè, õåõ) áóäóò ëîãè.
+
+ Àêòèâèðîâàíèå äàííîé îïöèè ýêâèâàëåíòíî çàïóñêó ñåðâèñîâ ñ êëþ÷îì
+ -debug.
+
+OPER_HELP_SET_NOEXPIRE
+ Ñèíòàêñèñ: SET NOEXPIRE {ON | OFF}
+
+ Âêëþ÷àåò èëè âûêëþ÷àåò ðåæèì ãëîáàëüíîãî "íå-èñòå÷åíèÿ".  ýòîì
+ ðåæèìå, âñå íèêè, êàíàëû, AKILL'û è èñêëþ÷åíèÿ èç ëèìèòà ñåññèé -
+ íèêîãäà íå èñòåêóò, ïî êðàéíåé ìåðå äî òåõ ïîð, ïîêà ýòà îïöèÿ íå
+ áóäåò îòêëþ÷åíà.
+
+ Àêòèâèðîâàíèå äàííîé îïöèè ýêâèâàëåíòíî çàïóñêó ñåðâèñîâ ñ êëþ÷îì
+ -noexpire.
+
+OPER_HELP_SET_SUPERADMIN
+ Ñèíòàêñèñ: SET SUPERADMIN {ON | OFF}
+
+ Ðåæèì Ñóïåð-Àäìèíèñòðàòîðà íå âëèÿåò íà ñàìó ðàáîòó ñåðâèñîâ êàê
+ òàêîâóþ, îäíàêî åãî àêòèâèðîâàíèå âëèÿåò íà óñëîâèÿ ïðîâåðêè óðîâíÿ
+ äîñòóïà ïîëüçîâàòåëÿ ê òåì èëè èíûì ôóíêöèÿì.  ÷àñòíîñòè, äàííûé
+ ðåæèì ïðåäîñòàâëÿåò èñïîëüçîâàâøåìó åãî Ðóòó ñåðâèñîâ íåîãðàíè÷åííûå
+ ïðèâèëåãèè íà ñåðâèñàõ, íàïðèìåð òàêèå, êàê ñòàòóñ âëàäåëüöà íà âñåõ
+ êàíàëàõ ñåòè, è ò. ï.
+
+ Ýòà îïöèÿ íå ïîñòîÿííàÿ è äîëæíà èñïîëüçîâàòüñÿ òîëüêî ïðè êðàéíåé
+ íåîáõîäèìîñòè. Îòêëþ÷èòå åå ñðàçó, êàê òîëüêî ïåðåñòàíåòå íóæäàòüñÿ
+ â íåé.
+
+OPER_HELP_SET_SQL
+ Ñèíòàêñèñ: SET SQL {ON | OFF}
+
+ Äàííàÿ îïöèÿ ïîçâîëÿåò âàì "íà ëåòó" âêëþ÷àòü èëè âûêëþ÷àòü SQL-ðåæèì
+ ñåðâèñîâ. Âåñüìà ïîëåçíî, íàïðèìåð, êîãäà MySQL ñåðâåð âðåìåííî
+ íåäîñòóïåí.
+
+OPER_HELP_SET_IGNORE
+ Ñèíòàêñèñ: SET IGNORE {ON | OFF}
+
+ Ïîçâîëÿåò àêòèâèðîâàòü/äåàêòèâèðîâàòü îáðàáîòêó ñåðâèñíîãî ñïèñêà
+ èãíîðèðóåìûõ íèêîâ. Âêëþ÷èòå äàííûé ðåæèì, åñëè õîòèòå ÷òî áû
+ ñåðâèñû èãíîðèðîâàëè çàïðîñû îò íèêîâ ÷èñëÿùèõñÿ â ñïèñêå èãíîðà.
+
+OPER_HELP_SET_LIST
+ Ñèíòàêñèñ: SET LIST
+
+ Îòîáðàæàåò ñòàòóñ ðàçëè÷íûõ ñåðâèñíûõ íàñòðîåê (âêë/âûêë).
+
+OPER_HELP_NOOP
+ Ñèíòàêñèñ: NOOP SET ñåðâåð
+ NOOP REVOKE ñåðâåð
+
+ Êîìàíäà NOOP SET ïîçâîëÿåò óäàëèòü âñå àêòèâíûå O:lines íà óêàçàííîì
+ ñåðâåðå è îäíîâðåìåííî ñ ýòèì ïðèáèòü âñåõ åãî IRC-îïåðàòîðîâ, äàáû
+ èñêëþ÷èòü âîçìîæíîñòü /REHASH'à ñåðâåðà, êîòîðûé âîññòàíîâèò O:line
+ çàïèñè.
+
+ NOOP REVOKE îòìåíÿåò ýôôåêò êîìàíäû NOOP SET è âîçâðàùàåò âñå
+ O:lines óêàçàííîãî ñåðâåðà.
+
+ Ïðèìå÷àíèå: íàëè÷èå ñåðâåðà â ñåòè ñåðâèñàìè íå ïðîâåðÿåòñÿ.
+
+OPER_HELP_JUPE
+ Ñèíòàêñèñ: JUPE ñåðâåð [ïðè÷èíà]
+
+ Ïîçâîëÿåò "äæóïíóòü" óêàçàííûé ñåðâåð ñ óêàçàííîé ïðè÷èíîé.
+  äàííîì ñëó÷àå ýôôåêò äæóïà ñîñòîèò â ñëåäóþùåì: ñåðâèñû ïîñûëàþò
+ SQUIT óêàçàííîìó ñåðâåðó, òåì ñàìûì îòêëþ÷àÿ åãî îò ñåòè, à çàòåì
+ òóò æå ñîçäàþò âèðòóàëüíûé ñåðâåð ñ òåì æå èìåíåì, è ïðè÷èíîé â
+ êà÷åñòâå îïèñàíèÿ ñåðâåðà (server description). Äàííûé ôàëüøèâûé
+ ñåðâåð íå ïîçâîëèò ïðèñîåäèíèòüñÿ ê ñåòè ðåàëüíîìó, äæóïíóòîìó
+ ñåðâåðó. Îòìåíèòü ýôôåêò âû ìîæåòå ïóòåì SQUIT'à âèðòóàëüíîé êîïèè
+ äæóïíóòîãî ñåðâåðà.
+ Ïðèìå÷àíèå: ïàðàìåòð ïðè÷èíà ÿâëÿåòñÿ íå îáÿçàòåëüíûì, åñëè âû åãî
+ íå óêàæåòå, áóäåò èñïîëüçîâàíà ñòàíäàðòíàÿ, âèäà: "Juped by <íèê>".
+
+OPER_HELP_RAW
+ Ñèíòàêñèñ: RAW òåêñò
+
+ Ïîçâîëÿåò îòïðàâèòü óêàçàííóþ òåêñòîâóþ ñòðîêó íàïðÿìóþ íà IRC-ñåðâåð,
+ ê êîòîðîìó ïðèëèíêîâàíû ñåðâèñû. Ó÷òèòå, ÷òî äàííûå îòïðàâëÿþòñÿ
+ "as is", â ñûðîì âèäå, è íèêàêèõ ïðîâåðîê íå îñóùåñòâëÿåòñÿ! À ýòî
+ çíà÷èò, ÷òî íåâåðíûé ôîðìàò äàííûõ ìîæåò âûçâàòü ó IRCd-ñåðâåðà
+ îøèáêó èíòåðïðåòàöèè è ïðèâåñòè ê åãî çàâèñàíèþ è/èëè îòêëþ÷åíèþ.
+
+ ÍÅ ÈÑÏÎËÜÇÓÉÒÅ ÝÒÓ ÊÎÌÀÍÄÓ ÁÅÇ ÀÁÑÎËÞÒÍÎÉ ÓÂÅÐÅÍÍÎÑÒÈ Â ÒÎÌ, ×ÒÎ ÂÛ ÄÅËÀÅÒÅ!
+
+OPER_HELP_UPDATE
+ Ñèíòàêñèñ: UPDATE
+
+ Çàñòàâëÿåò ñåðâèñû íåìåäëåííî ñîõðàíèòü âñå áàçû äàííûõ íà äèñê.
+
+OPER_HELP_RELOAD
+ Ñèíòàêñèñ: RELOAD
+
+ Çàñòàâëÿåò ñåðâèñû ïåðå÷èòàòü êîíôèãóðàöèîííûé ôàéë services.conf.
+ Ïðèìå÷àíèå: àêòèâàöèÿ íåêîòîðûõ íîâûõ/èçìåíåííûõ äèðåêòèâ êîíôèãà
+ òðåáóåò ïîëíîãî ïåðåçàïóñêà ñåðâèñîâ (íàïðèìåð: èçìåíåíèå íèêîâ
+ ñåðâèñîâ, àêòèâàöèÿ ëèìèòèðîâàíèÿ ñåññèé, è ò.ä.)
+
+OPER_HELP_QUIT
+ Ñèíòàêñèñ: QUIT
+
+ Çàñòàâëÿåò ñåðâèñû íåìåäëåííî çàâåðøèòü ñâîþ ðàáîòó. Âñå äàííûå,
+ íàêîïëåííûå ñ ìîìåíòà ïîñëåäíåãî îáíîâëåíèÿ áàç äàííûõ, ñîõðàíåíû
+ íå áóäóò! Ýòà êîìàíäà äîëæíà èñïîëüçîâàòüñÿ òîëüêî â òåõ ñëó÷àÿõ,
+ êîãäà òåêóùàÿ çàãðóæåííàÿ â ïàìÿòü áàçà äàííûõ ñîäåðæèò êàêèå-ëèáî
+ îøèáêè, ñîõðàíåíèÿ êîòîðûõ íóæíî èçáåæàòü.
+ Äëÿ íîðìàëüíîãî çàâåðøåíèÿ ðàáîòû ñåðâèñîâ èñïîëüçóéòå êîìàíäó SHUTDOWN.
+
+OPER_HELP_SHUTDOWN
+ Ñèíòàêñèñ: SHUTDOWN
+
+ Çàñòàâëÿåò ñåðâèñû ñîõðàíèòü âñå áàçû äàííûõ è çàâåðøèòü ñâîþ ðàáîòó.
+
+OPER_HELP_RESTART
+ Ñèíòàêñèñ: RESTART
+
+ Çàñòàâëÿåò ñåðâèñû ñîõðàíèòü âñå áàçû äàííûõ è òóò æå ïåðåçàïóñòèòüñÿ.
+
+OPER_HELP_CHANLIST
+ Ñèíòàêñèñ: CHANLIST [{ìàñêà | íèê} [SECRET]]
+
+ Âûâîäèò ñïèñîê âñåõ àêòèâíûõ (íà äàííûé ìîìåíò) êàíàëîâ ñåòè, âíå
+ çàâèñèìîñòè îò òîãî, çàðåãèñòðèðîâàíû îíè èëè íåò.
+
+  êà÷åñòâå ïàðàìåòðà âû ìîæåòå óêàçàòü ìàñêó èìåíè êàíàëà, ÷òî áû
+ ïîëó÷èòü òîëüêî êîíêðåòíûå, ñîâïàäàþùèå çàïèñè. Åñëè æå âû óêàæèòå
+ íèê, áóäåò âûâåäåí ñïèñîê âñåõ êàíàëîâ, íà êîòîðûõ íàõîäèòñÿ ýòîò
+ ïîëüçîâàòåëü.
+ Äîïîëíèòåëüíûé ïàðàìåòð SECRET ïîçâîëÿåò ïîëó÷èòü ñïèñîê êàíàëîâ
+ ñ ðåæèìàìè +s/+p, ñîâïàäàþùèõ ñ óêàçàííîé ñèìâîëüíîé ìàñêîé.
+
+OPER_HELP_USERLIST
+ Ñèíòàêñèñ: USERLIST [{õîñòìàñêà | #êàíàë} [INVISIBLE]]
+
+ Âûâîäèò ñïèñîê âñåõ ïîëüçîâàòåëåé, íàõîäÿùèõñÿ â äàííûé ìîìåíò â ñåòè.
+ Çàðåãèñòðèðîâàí èõ íèê èëè íåò - ðîëè íå èãðàåò.
+
+  êà÷åñòâå ïàðàìåòðà, âû ìîæåòå óêàçàòü ïîëüçîâàòåëüñêóþ õîñòìàñêó
+ âèäà íèê!èäåíò@õîñò - ýòî ïîçâîëèò ïîëó÷èòü òîëüêî êîíêðåòíûå,
+ ñîâïàäàþùèå ñ ìàñêîé çàïèñè. Åñëè æå âû óêàæèòå #êàíàë, áóäåò
+ âûâåäåí ñïèñîê âñåõ ïîñåòèòåëåé óêàçàííîãî êàíàëà.
+ Äîïîëíèòåëüíûé ïàðàìåòð INVISIBLE ïîçâîëÿåò ïîëó÷èòü ñïèñîê íèêîâ
+ ñ ðåæèìîì +i, äàííûå êîòîðûõ ñîâïàäàþò ñ óêàçàííîé â êà÷åñòâå âòîðîãî
+ ïàðàìåòðà õîñòìàñêîé.
+
+OPER_HELP_MODLOAD
+ Ñèíòàêñèñ: MODLOAD èìÿ_ôàéëà
+
+ Ïîçâîëÿåò çàãðóçèòü êàêîé-ëèáî äîïîëíèòåëüíûé ìîäóëü èç äèðåêòîðèè
+ ñ ìîäóëÿìè (modules/).
+
+OPER_HELP_MODUNLOAD
+ Ñèíòàêñèñ: MODUNLOAD èìÿ_ôàéëà
+
+ Âûãðóæàåò óêàçàííûé ìîäóëü (åñëè ìîäóëü çàãðóæåí è åñëè óñëîâèÿ
+ ïîçâîëÿþò åãî âûãðóçèòü).
+
+OPER_HELP_MODINFO
+ Ñèíòàêñèñ: MODINFO èìÿ_ôàéëà
+
+ Âûâîäèò ïîäðîáíóþ èíôîðìàöèþ î êîíêðåòíîì çàãðóæåííîì ìîäóëå.
+
+OPER_HELP_MODLIST
+ Ñèíòàêñèñ: MODLIST [Core|3rd|protocol|encryption|supported|qatested]
+
+ Âûâîäèò ñïèñîê âñåõ çàãðóæåííûõ ìîäóëåé.  êà÷åñòâå äîïîëíèòåëüíîãî
+ ïàðàìåòðà âû ìîæåòå óêàçàòü òèï ìîäóëÿ - ýòî ïîçâîëèò ïîëó÷èòü ñïèñîê,
+ îòâå÷àþùèé óêàçàííûì òðåáîâàíèÿì.
+
+###########################################################################
+#
+# BotServ help messages
+#
+###########################################################################
+BOT_HELP_CMD_BOTLIST
+ BOTLIST Ñïèñîê äîñòóïíûõ äëÿ óñòàíîâêè áîòîâ
+BOT_HELP_CMD_ASSIGN
+ ASSIGN Óñòàíîâêà áîòà íà óêàçàííûé êàíàë
+BOT_HELP_CMD_SET
+ SET Íàñòðîéêà ðàçëè÷íûõ îïöèé áîòà
+BOT_HELP_CMD_KICK
+ KICK Íàñòðîéêà óñëîâèé KICK'à
+BOT_HELP_CMD_BADWORDS
+ BADWORDS Óïðàâëåíèå ñïèñêîì "ïëîõèõ" ñëîâ
+BOT_HELP_CMD_ACT
+ ACT Âûïîëíèòü äåéñòâèå îò ëèöà áîòà íà óêàçàííîì êàíàëå
+BOT_HELP_CMD_INFO
+ INFO Çàïðîñ èíôîðìàöèè î áîòå è åãî íàñòðîéêàõ íà êàíàëå
+BOT_HELP_CMD_SAY
+ SAY Ïîñëàòü íà óêàçàííûé êàíàë òåêñò îò ëèöà áîòà
+BOT_HELP_CMD_UNASSIGN
+ UNASSIGN Ñíÿòü áîòà ñ óêàçàííîãî êàíàëà
+BOT_HELP_CMD_BOT
+ BOT Óïðàâëåíèå ñåðâèñíûìè áîòàìè
+
+BOT_HELP
+ %S ïîçâîëÿåò Âàì óñòàíîâèòü áîòà íà ñâîé êàíàë.
+ Äàíûé ñåðâèñ ñäåëàí äëÿ òåõ ïîëüçîâàòåëåé, êîòîðûå
+ íå ìîãóò èíà÷å óñòàíîâèòü èëè íàñòðîèòü áîòà, èëè æå,
+ èñïîëüçîâàíèå áîòîâ çàïðåùåíî â IRC ñåòè. Äîñòóïíûå
+ êîìàíäû ïåðå÷èñëåíû íèæå, ÷òîáû èñïîëüçîâàòü èõ, íàïèøèòå
+ %R%S êîìàíäà. Äëÿ ïîëó÷åíèÿ áîëåå ïîäðîáíîé
+ èíôîðìàöèè ïî êîíêðåòíîé êîìàíäå, íàïèøèòå
+ %R %S HELP êîìàíäà.
+
+BOT_HELP_FOOTER
+ Áîò àâòîìàòè÷åñêè ïðèñîåäèíèòñÿ ê êàíàëó ñðàçó æå ïîñëå òîãî, êàê
+ íà íåì (íà êàíàëå, à íå íà áîòå) îêàæåòñÿ íå ìåíåå %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 Àêòèâèðîâàòü/äåàêòèâèðîâàòü FANTASY-ðåæèì
+ SYMBIOSIS Àêòèâèðîâàòü/äåàêòèâèðîâàòü ðåæèì Ñèìáèîçà ñ
+ ñåðâèñîì ñåòè ïî óïðàâëåíèþ êàíàëàìè.
+
+ Äëÿ áîëåå ïîäðîáíîé èíôîðìàöèè î êîíêðåòíîé îïöèè âîñïîëüçóéòåñü
+ êîìàíäîé %R%S HELP SET îïöèÿ.
+
+ Ïðèìå÷àíèå: äîñòóï ê ýòîé êîìàíäå îïðåäåëÿåòñÿ óðîâíåì äîñòóïà ê
+ êîìàíäå SET (ñèñòåìà LEVELS).
+
+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}
+
+ Àêòèâèðóåò/äåàêòèâèðóåò FANTASY-ðåæèì áîòà äëÿ óêàçàííîãî êàíàëà.
+ Îí ïîçâîëÿåò ïîñåòèòåëÿì êàíàëà èñïîëüçîâàòü óäîáíûå àíàëîãè àíàëîãè
+ ñòàíäàðòíûõ êîìàíä ïðÿìî íà êàíàëå, íàïðèìåð:
+
+ !protect, !deprotect - óñòàíîâêà ñòàòóñà çàùèòû (àäìèíèñòðàòîðà)
+ íà ñåáÿ (áåç ïàðàìåðîâ) èëè óêàçàííîìó íèêó.
+ !halfop, !dehalfop - çàïðîñ ñòàòóñà ïîëóîïåðàòîðà êàíàëà, â
+ êà÷åñòâå ïàðàìåòðà âû ìîæåòå óêàçàòü íèê
+ ïîñåòèòåëÿ êàíàëà.
+ !owner, !deowner - çàïðîñ ñòàòóñà âëàäåëüöà êàíàëà (êîìàíäà
+ äîñòóïíà ëèøü âëàäåëüöó êàíàëà).
+ !voice, !devoice - çàïðîñ ñòàòóñà âîéñà êàíàëà, â êà÷åñòâå
+ ïàðàìåòðà âû ìîæåòå óêàçàòü íèê ïîñåòèòåëÿ
+ êàíàëà.
+ !op, !deop - çàïðîñ ñòàòóñà îïåðàòîðà êàíàëà, â êà÷åñòâå
+ ïàðàìåòðà âû ìîæåòå óêàçàòü íèê ïîñåòèòåëÿ
+ êàíàëà.
+ !kick, !kb - êèêíóòü èëè êèêíóòü è çàáàíèòü óêàçàííîãî
+ ïîñåòèòåëÿ êàíàëà ñ óêàçàííîé ïðè÷èíîé
+ (íàïðèìåð: !kick Vasya ïøåë âîí îòñþäà!).
+ !seen - çàïðîñ èíôîðìàöèè î òîì, êîãäà óêàçàííûé
+ íèê ïîñëåäíèé ðàç áûë â ñåòè.
+
+ Ïðèìå÷àíèå: äëÿ èñïîëüçîâàíèÿ êîìàíä FANTASY-ðåæèìà, âû äîëæíû
+ èìåòü ñîîòâåòñòâóþùèé óðîâåíü äîñòóïà íà êàíàëå (îí îïðåäåëÿåòñÿ
+ çíà÷åíèåì íàñòðîéêè FANTASIA, ïî-óìîë÷àíèþ ýòî 3 èëè VOP).
+ Ïîìèìî ýòîãî, âàø óðîâåíü äîñòóïà äîëæåí ñîîòâåòñâîâàòü òðåáîâàíèÿì
+ êîìàíäû, íàïðèìåð, âû íå ñìîæåòå èñïîëüçîâàòü êîìàíäó !op, åñëè
+ âàø óðîâåíü äîñòóïà íå ñîîòâåòñòâóåò çíà÷åíèþ äëÿ OP/DEOP (èëè âû
+ íå AOP/SOP êàíàëà).
+
+ Ïðèìå÷àíèå 2: òàêèå êîìàíäû, êàê: !halfop, !dehalfop, !protect,
+ !deprotect, !owner è !deowner - ìîãóò áûòü íåäîñòóïíû â âàøåé
+ ñåòè.
+
+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 íàñòðîéêà óñëîâèé êèêà çà ÷ðåçìåðíîå èñïîëüçîâàíèå
+ 04ö06â09å11ò12í05î08ã07î òåêñòà
+ FLOOD íàñòðîéêà óñëîâèé êèêà çà ôëóä
+ REPEAT íàñòðîéêà óñëîâèé êèêà çà ïîâòîðÿþùèåñÿ ñîîáùåíèÿ
+ REVERSES íàñòðîéêà óñëîâèÿ êèêà çà ÷ðåçìåðíîå èñïîëüçîâàíèå
+ èíâåðñíîãî òåêñòà
+ UNDERLINES íàñòðîéêà óñëîâèÿ êèêà çà ÷ðåçìåðíîå èñïîëüçîâàíèå
+ ïîä÷åðêèâàíèé
+
+ Äëÿ áîëåå ïîäðîáíîé èíôîðìàöèè î êîíêðåòíîé îïöèè âîñïîëüçóéòåñü
+ êîìàíäîé %R%S HELP KICK îïöèÿ.
+
+ Ïðèìå÷àíèå: äîñòóï ê ýòîé êîìàíäå îïðåäåëÿåòñÿ óðîâíåì äîñòóïà ê
+ êîìàíäå SET (ñèñòåìà LEVELS).
+
+BOT_HELP_KICK_BOLDS
+ Ñèíòàêñèñ: KICK #êàíàë BOLDS {ON|OFF} [ttb]
+
+ Àêòèâèðóéòå äàííóþ îïöèþ ñ íóæíûìè âàì çíà÷åíèÿìè, åñëè õîòèòå
+ ÷òîáû áîò êèêàë ïîñåòèòåëåé çà ÷ðåçìåðíîå èñïîëüçîâàíèå æèðíîãî
+ òåêñòà.
+
+ Ïàðàìåòð ttb - ýòî êîëè÷åñòâî êèêîâ, ïî ïðåâûøåíèþ êîòîðîãî áîò
+ ïîñòàâèò áàí. Óêàæèòå âìåñòî ïîëîæèòåëüíîãî ÷èñëà çíà÷åíèå "0" èëè
+ "-" åñëè íå õîòèòå ÷òîáû áîò áàíèë íàðóøèòåëÿ.
+
+BOT_HELP_KICK_COLORS
+ Ñèíòàêñèñ: KICK #êàíàë COLORS {ON|OFF} [ttb]
+
+ Àêòèâèðóéòå äàííóþ îïöèþ ñ íóæíûìè âàì çíà÷åíèÿìè, åñëè õîòèòå
+ ÷òîáû áîò êèêàë ïîñåòèòåëåé çà ÷ðåçìåðíîå èñïîëüçîâàíèå öâåòíîãî
+ òåêñòà.
+
+ Ïàðàìåòð ttb - ýòî êîëè÷åñòâî êèêîâ, ïî ïðåâûøåíèþ êîòîðîãî áîò
+ ïîñòàâèò áàí. Óêàæèòå âìåñòî ïîëîæèòåëüíîãî ÷èñëà çíà÷åíèå "0" èëè
+ "-" åñëè íå õîòèòå ÷òîáû áîò áàíèë íàðóøèòåëÿ.
+
+BOT_HELP_KICK_REVERSES
+ Ñèíòàêñèñ: KICK #êàíàë REVERSES {ON|OFF} [ttb]
+
+ Àêòèâèðóéòå äàííóþ îïöèþ ñ íóæíûìè âàì çíà÷åíèÿìè, åñëè õîòèòå
+ ÷òîáû áîò êèêàë ïîñåòèòåëåé çà ÷ðåçìåðíîå èñïîëüçîâàíèå èíâåðñíîãî
+ òåêñòà.
+
+ Ïàðàìåòð ttb - ýòî êîëè÷åñòâî êèêîâ, ïî ïðåâûøåíèþ êîòîðîãî áîò
+ ïîñòàâèò áàí. Óêàæèòå âìåñòî ïîëîæèòåëüíîãî ÷èñëà çíà÷åíèå "0" èëè
+ "-" åñëè íå õîòèòå ÷òîáû áîò áàíèë íàðóøèòåëÿ.
+
+BOT_HELP_KICK_UNDERLINES
+ Ñèíòàêñèñ: KICK #êàíàë UNDERLINES {ON|OFF} [ttb]
+
+ Àêòèâèðóéòå äàííóþ îïöèþ ñ íóæíûìè âàì çíà÷åíèÿìè, åñëè õîòèòå
+ ÷òîáû áîò êèêàë ïîñåòèòåëåé çà ÷ðåçìåðíîå èñïîëüçîâàíèå ïîä÷åðêèâàíèé.
+
+ Ïàðàìåòð ttb - ýòî êîëè÷åñòâî êèêîâ, ïî ïðåâûøåíèþ êîòîðîãî áîò
+ ïîñòàâèò áàí. Óêàæèòå âìåñòî ïîëîæèòåëüíîãî ÷èñëà çíà÷åíèå "0" èëè
+ "-" åñëè íå õîòèòå ÷òîáû áîò áàíèë íàðóøèòåëÿ.
+
+BOT_HELP_KICK_CAPS
+ Ñèíòàêñèñ: KICK #êàíàë CAPS {ON|OFF} [ttb [ìèíèìóì [ïðîöåíòû]]]
+
+ Àêòèâèðóéòå äàííóþ îïöèþ ñ íóæíûìè âàì çíà÷åíèÿìè, åñëè õîòèòå
+ ÷òîáû áîò êèêàë ïîñåòèòåëåé çà ÷ðåçìåðíîå èñïîëüçîâàíèå CapsLOCK.
+
+ Óñëîâèÿ íàêàçàíèÿ ðàññ÷èòûâàþòñÿ ñëåäóþùèì îáðàçîì: ñòðîêà, êîòîðóþ
+ ïîñëàë ïîñåòèòåëü, äîëæíà ñîäåðæàòü X áîëüøèõ áóêâ, îïðåäåëåííûõ
+ ìèíèìóìîì, è êîëè÷åñòâî ýòèõ çàãëàâíûõ áóêâ äîëæíî ñîñòàâëÿòü êàê
+ ìèíèìóì X ïðîöåíòîâ%% îò ÷èñëà áóêâ âñåé ñòðîêè.
+ Íàïðèìåð: ïðåäïîëîæèì, ÷òî íàñòðîéêè ó íàñ ñòîÿò êàê 10 è 25,
+ òîãäà ñòðîêà âèäà:
+
+ BLABLABLAB BLABLABLAB BLABLABlab blablablab blablablab blablablab
+ blablablab blablablab blablablab blablablab
+
+ áóäåò ïîïàäàòü ïîä ñëåäóþùåå óñëîâèå: êîëè÷åñòâî çàãëàâíûõ áóêâ
+ áîëüøå 10 è è ïðîöåíòàæ åãî îòíîñèòåëüíî îáùåãî êîë-âà áóêâ > 25%.
+ Êàê âèäèòå, âûñòàâëåííîå íàìè óñëîâèå â äàííîì ñëó÷àå ñðàáîòàåò è
+ ïîëüçîâàòåëü áóäåò êèêíóò ñ ñîîòâåòñòâóþùåé ïðè÷èíîé.
+
+ Åñëè âû íå óêàæåòå ïàðàìåòðû ðåæèìà, áóäóò èñïîëüçîâàíû çíà÷åíèÿ
+ ïî-óìîë÷àíèþ: 10 äëÿ ìèíèìóìà áóêâ è 25% äëÿ ïðîöåíòàæà.
+
+ Ïàðàìåòð ttb - ýòî êîëè÷åñòâî êèêîâ, ïî ïðåâûøåíèþ êîòîðîãî áîò
+ ïîñòàâèò áàí. Óêàæèòå âìåñòî ïîëîæèòåëüíîãî ÷èñëà çíà÷åíèå "0" èëè
+ "-" åñëè íå õîòèòå ÷òîáû áîò áàíèë íàðóøèòåëÿ.
+
+BOT_HELP_KICK_FLOOD
+ Ñèíòàêñèñ: KICK #êàíàë FLOOD {ON|OFF} [ttb [ëèíèé [ñåêóíäû]]]
+
+ Àêòèâèðóéòå äàííóþ îïöèþ ñ íóæíûìè âàì çíà÷åíèÿìè, åñëè õîòèòå
+ ÷òîáû áîò êèêàë ïîñåòèòåëåé çà ôëóä.
+
+ Óñëîâèÿ íàêàçàíèÿ ðàññ÷èòûâàþòñÿ ñëåäóþùèì îáðàçîì: ïîëüçîâàòåëü
+ äîëæåí ïîñëàòü íà êàíàë êîëè÷åñòâî ñîîáùåíèé, ïðåâûùàþùåå ïàðàìåòð
+ ëèíèé, è, åñëè ýòî ïðîèçîøëî â óêàçàííûé ïðîìåæóòîê ñåêóíäû -
+ áîò êèêíåò åãî ñ ñîîòâåòñòâóþùåé ïðè÷èíîé.
+
+ Åñëè âû íå óêàæåòå ïàðàìåòðû ðåæèìà, áóäóò èñïîëüçîâàíû çíà÷åíèÿ
+ ïî-óìîë÷àíèþ: 6 ñòðîê çà 10 ñåêóíä.
+
+ Ïàðàìåòð ttb - ýòî êîëè÷åñòâî êèêîâ, ïî ïðåâûøåíèþ êîòîðîãî áîò
+ ïîñòàâèò áàí. Óêàæèòå âìåñòî ïîëîæèòåëüíîãî ÷èñëà çíà÷åíèå "0" èëè
+ "-" åñëè íå õîòèòå ÷òîáû áîò áàíèë íàðóøèòåëÿ.
+
+BOT_HELP_KICK_REPEAT
+ Ñèíòàêñèñ: KICK #êàíàë REPEAT {ON|OFF} [ttb [÷èñëî_ïîâòîðîâ]]
+
+ Àêòèâèðóéòå äàííóþ îïöèþ ñ íóæíûìè âàì çíà÷åíèÿìè, åñëè õîòèòå
+ ÷òîáû áîò êèêàë ïîñåòèòåëåé çà ïîâòîðû.
+
+ Óñëîâèÿ íàêàçàíèÿ ðàññ÷èòûâàþòñÿ ñëåäóþùèì îáðàçîì: ïîëüçîâàòåëü
+ äîëæåí X ðàç ïîäðÿä ïîñëàòü íà êàíàë îäèíàêîâîå ñîîáùåíèå, ïðè ýòîì
+ ñîîáùåíèÿ äðóãèõ ïîëüçîâàòåëåé, ïîñëàííûå â ýòî æå âðåìÿ, íèêîèì
+ îáðàçîì íåñáðàñûâàþò ñ÷åò÷èê ÷èñëà_ïîâòîðîâ ýòîãî ïîëüçîâàòåëÿ.
+
+ Åñëè âû íå óêàæåòå ïàðàìåòðû ðåæèìà, áóäóò èñïîëüçîâàíû çíà÷åíèÿ
+ ïî-óìîë÷àíèþ: 3 ïîâòîðà ïîäðÿä.
+
+ Ïàðàìåòð ttb - ýòî êîëè÷åñòâî êèêîâ, ïî ïðåâûøåíèþ êîòîðîãî áîò
+ ïîñòàâèò áàí. Óêàæèòå âìåñòî ïîëîæèòåëüíîãî ÷èñëà çíà÷åíèå "0" èëè
+ "-" åñëè íå õîòèòå ÷òîáû áîò áàíèë íàðóøèòåëÿ.
+
+BOT_HELP_KICK_BADWORDS
+ Ñèíòàêñèñ: KICK #êàíàë BADWORDS {ON|OFF} [ttb]
+
+ Àêòèâèðóéòå äàííóþ îïöèþ ñ íóæíûìè âàì çíà÷åíèÿìè, åñëè õîòèòå
+ ÷òîáû áîò êèêàë ïîñåòèòåëåé çà èñïîëüçîâàíèå íà êàíàëå "ïëîõèõ" ñëîâ.
+
+ Áàçà "ïëîõèõ" ñëîâ êàíàëà ìîäèôèöèðóåòñÿ ïîñðåäñòâîì äîïîëíèòåëüíîé
+ êîìàíäû BADWORDS. Äëÿ áîëåå ïîäðîáíîé èíôîðìàöèè ñìîòðèòå ñïðàâêó
+ ïî %R%S HELP BADWORDS.
+
+ Ïàðàìåòð ttb - ýòî êîëè÷åñòâî êèêîâ, ïî ïðåâûøåíèþ êîòîðîãî áîò
+ ïîñòàâèò áàí. Óêàæèòå âìåñòî ïîëîæèòåëüíîãî ÷èñëà çíà÷åíèå "0" èëè
+ "-" åñëè íå õîòèòå ÷òîáû áîò áàíèë íàðóøèòåëÿ.
+
+BOT_HELP_BADWORDS
+ Ñèíòàêñèñ: BADWORDS #êàíàë ADD ñëîâî [SINGLE | START | END]
+ BADWORDS #êàíàë DEL {ñëîâî | íîìåð_çàïèñè | ñïèñîê_çàïèñåé}
+ BADWORDS #êàíàë LIST [ìàñêà | ñïèñîê_çàïèñåé]
+ BADWORDS #êàíàë CLEAR
+
+ Äàííàÿ êîìàíäà ïîçâîëÿåò ìîäèôèöèðîâàòü ñïèñîê "ïëîõèõ" ñëîâ êàíàëà.
+ Ýòîò ñïèñîê îïðåäåëÿåò, çà èñïîëüçîâàíèå êàêèõ ñëîâ ïîëüçîâàòåëü
+ áóäåò êèêíóò áîòîì, ïðè óñëîâèè, êîíå÷íî, ÷òî äàííàÿ âîçìîæíîñòü
+ àêòèâèðîâàíà.
+ Äëÿ áîëåå ïîäðîáíîé èíôîðìàöèè ïî àêòèâàöèè äàííîãî ðåæèìà ñìîòðèòå
+ %R%S HELP KICK BADWORDS.
+
+ Êîìàíäà BADWORDS ADD äîáàâëÿåò íîâîå ñëîâî â ñïèñîê "ïëîõèõ" ñëîâ.
+ Âû ìîæåòå óêàçàòü äîïîëíèòåëüíûå óñëîâèÿ îáðàáîòêè äëÿ äîáàâëÿåìîãî
+ ñëîâà, íàïðèìåð: îïöèîíàëüíûé ïàðàìåòð SINGLE çàñòàâèò áîòà
+ ó÷èòûâàòü òîëüêî ôàêò ïîëíîãî óïîòðåáëåíèÿ äàííîãî ñëîâà, ïàðàìåòð
+ START çàñòàâèò áîòà ó÷èòûâàòü ôàêò ñîâïàäåíèÿ ïî ìàñêå "ñëîâî*"
+ (òî åñòü, ñîâïàäåíèå êàêîé-ëèáî START-çàïèñè èç ñïèñêà ñ íà÷àëîì
+ ñêàçàííîãî ñëîâà), íó è ïîñëåäíèé ïàðàìåòð END áóäåò ñðàáàòûâàòü
+ ïðè óïîòðåáëåíèè "*ñëîâà". Åñëè âû íå óêàæåòå íè îäèí èç ýòèõ
+ ïàðàìåòðîâ äëÿ äîáàâëÿåìîãî ñëîâà, áóäåò èñïîëüçîâàòüñÿ ñîâïàäåíèå
+ ïî "*ñëîâó*".
+ Ïðèìåðû:
+
+ BADWORDS #chuvaki ADD ïåñ
+ -> äîáàâèò ñëîâî "ïåñ" â ñïèñîê ïëîõèõ ñëîâ è çàñòàâèò áîòà êèêàòü
+ íå òîëüêî çà óïîòðåáëåíèå ñàìîãî ýòîãî ñëîâà, íî è ëþáûõ åãî
+ ñëîâîôîðì, ñîäåðæàùèõ â ñåáå îðèãèí (íàïðèìåð: ïåñ, ïåñîê è ò.ä.)
+
+ BADWORDS #chuvaki ADD ïåñ SINGLE
+ -> äîáàâèò ñëîâî "ïåñ" â ñïèñîê ïëîõèõ ñëîâ è çàñòàâèò áîòà êèêàòü
+ òîëüêî çà óïîòðåáëåíèå ñàìîãî ýòîãî ñëîâà, è íèêàê èíà÷å.
+
+ Êîìàíäà BADWORDS DEL óäàëÿåò óêàçàííîå ñëîâî èç ñïèñêà ïëîõèõ ñëîâ.
+  êà÷åñòâå ïàðàìåòðà âû ìîæåòå óêàçàòü íå òîëüêî êîíêðåòíóþ çàïèñü,
+ íî è íîìåð çàïèñè èëè ñïèñîê çàïèñåé (ñì. ïðèìåðû èñïîëüçîâàíèÿ
+ êîìàíäû LIST íèæå).
+
+ Êîìàíäà BADWORDS LIST ïîêàæåò òåêóùèé ñïèñîê ïëîõèõ ñëîâ.
+  êà÷åñòâå äîïîëíèòåëüíîãî ïàðàìåòðà, âû ìîæåòå óêàçàòü ñèìâîëüíóþ
+ ìàñêó, ÷òî ïîçâîëèò âàì ïîëó÷èòü ñïèñîê ñ êîíêðåòíûìè çàïèñÿìè,
+ ïîïàäàþùèìè ïîä ýòó ìàñêó, èëè æå, âû ìîæåòå óêàçàòü ñïèñîê çàïèñåé.
+ Íàïðèìåð:
+
+ BADWORDS #êàíàë LIST 2-5,7-9
+ âûâåäåò ñïèñîê çàïèñåé ñî 2-îé ïî 5-þ è ñ 7-îé ïî 9-þ.
+
+ Êîìàíäà BADWORDS CLEAR ïîçâîëÿåò ïîëíîñòüþ î÷èñòèòü ñïèñîê ñëîâ.
+
+BOT_HELP_SAY
+ Ñèíòàêñèñ: SAY #êàíàë òåêñò
+
+ Çàñòàâëÿåò áîòà ïîñëàòü óêàçàííûé òåêñò íà óêàçàííûé #êàíàë.
+
+BOT_HELP_ACT
+ Ñèíòàêñèñ: ACT #êàíàë òåêñò
+
+ Çàñòàâëÿåò áîòà âûïîëíèòü êîìàíäó, ýêâèâàëåíòíóþ êîìàíäå "/me"
+ â IRC-êëèåíòå mIRC. Âû äîëæíû óêàçàòü îáà ïàðàìåòðà: òåêñò äåéñòâèÿ
+ è #êàíàë.
+
+BOT_SERVADMIN_HELP_BOT
+ Ñèíòàêñèñ: BOT ADD íèê èäåíò õîñò ðåàëüíîå_èìÿ
+ BOT CHANGE ñòàðûé íèê íîâûé_íèê [èäåíò [õîñò [ðåàëüíîå_èìÿ]]]
+ BOT DEL íèê
+
+ Ïîçâîëÿåò Àäìèíèñòðàòîðàì ñåðâèñîâ ñîçäàâàòü, èçìåíÿòü èëè óäàëÿòü
+ áîòîâ, êîòîðûå â äàëüíåéøåì ìîãóò áûòü èñïîëüçîâàíû ïîëüçîâàòåëÿìè
+ ñåòè íà ñâîèõ êàíàëàõ.
+
+ Êîìàíäà BOT ADD äîáàâëÿåò áîòà ñ óêàçàííûì íèêîì, èäåíòîì, õîñòîì
+ è ðåàëüíûì èìåíåì. Òàê êàê êîððåêòíîñòü ýòèõ çíà÷åíèé íå ïðîâåðÿåòñÿ,
+ áóäüòå êðàéíå âíèìàòåëüíû ïðè äîáàâëåíèè/èçìåíåíèè õààðêòåðèñòèê áîòà.
+
+ Êîìàíäà BOT CHANGE ïîçâîëÿåò èçìåíèòü íèê, èäåíò, õîñò èëè ðåàëüíîå
+ èìÿ áîòà áåç íåîáõîäèìîñòè åãî óäàëåíèÿ.
+
+ Êîìàíäà BOT DEL óäàëÿåò óêàçàííîãî áîòà èç ñïèñêà áîòîâ.
+
+ Ïðèìå÷àíèå: âû íå ìîæåòå ñîçäàòü áîòà ñ íèêîì, êîòîðûé óæå êåì-òî
+ çàðåãèñòðèðîâàí. Åñëè æå âû ñîçäàåòå áîòà ñ íåçàðåãèñòðèðîâàííûì íèêîì,
+ ëþáîé, êòî èñïîëüçóåò ýòîò íèê íà ìîìåíò ñîçäàíèÿ áîòà - áóäåò òóò
+ æå îòêëþ÷åí îò ñåòè.
+
+BOT_SERVADMIN_HELP_SET
+
+ Ñïèñîê îïöèé, êîòîðûå ìîãóò íàñòðàèâàòü òîëüêî Àäìèíèñòðàòîðû ñåðâèñîâ:
+
+ NOBOT çàïðåòèòü èñïîëüçîâàòü áîòîâ íà êàêîì-ëèáî êàíàëå.
+ PRIVATE îãðàíè÷èòü óêàçàííîãî áîòà äî èñïîëüçîâàíèÿ åãî
+ òîëüêî àäìèíèñòðàöèåé ñåòè.
+
+BOT_SERVADMIN_HELP_SET_NOBOT
+ Ñèíòàêñèñ: SET #êàíàë NOBOT {ON|OFF}
+
+ Àêòèâèðóåò/äåàêòèâèðóåò ðåæèì NOBOT äëÿ óêàçàííîãî êàíàëà. Âêëþ÷åíèå
+ äàííîãî ðåæèìà çàïðåòèò àäìèíèñòàðöèè êàíàëà èñïîëüçîâàòü áîòà íà
+ ñâîåì êàíàëå.
+ Åñëè áîò óæå óñòàíîâëåí íà êàíàëå, îí áóäåò àâòîìàòè÷åñêè óäàëåí ñ
+ íåãî ñðàçó æå ïîñëå âêëþ÷åíèÿ äàííîé îïöèè.
+
+BOT_SERVADMIN_HELP_SET_PRIVATE
+ Ñèíòàêñèñ: SET íèê_áîòà PRIVATE {ON|OFF}
+
+ Óñòàíîâèòå äàííóþ îïöèþ íà óêàçàííîãî áîòà, åñëè õîòèòå çàïðåòèòü
+ îáû÷íûì ïîëüçîâàòåëÿì èñïîëüçîâàòü åãî. Äîñòóï ê íåìó áóäåò òîëüêî
+ ó àäìèíèñòðàöèè ñåòè.
+
+###########################################################################
+#
+# 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 íå íàéäåí â ñåðâèñíîé áàçå äàííûõ íèêîâ.
+HOST_SET_SYNTAX
+ Ñèòàêñèñ: %R%s SET <íèê> <õîñòìàñêà>.
+HOST_SETALL_SYNTAX
+ Ñèíòàêñèñ %R%s SETALL <íèê> <õîñòìàñêà>.
+HOST_DENIED
+ Äîñòóï çàïðåùåí.
+HOST_NOT_ASSIGNED
+ Âèðòóàëüíûé õîñò äëÿ âàøåãî íèêà îòñóòñòâóåò.
+HOST_ACTIVATED
+ Âàø âèðòóàëüíûé õîñò %s àêòèâèðîâàí.
+HOST_IDENT_ACTIVATED
+ Âàø âèðòóàëüíûé õîñò %s@%s àêòèâèðîâàí.
+HOST_ID
+ Èäåíòèôèöèðóéòåñü ê ñâîåìó íèêó è ïîâòîðèòå çàïðîñ íà àêòèâàöèþ.
+HOST_NOT_REGED
+ Êàêîé âèðòóàëüíûé õîñò, âàø íèê äàæå íå çàðåãèñòðèðîâàí...
+HOST_DEL
+ Âèðòóàëüíûé õîñò äëÿ %s óäàëåí.
+HOST_DEL_SYNTAX
+ Ñèíòàêñèñ: %R%s del <íèê>.
+HOST_OFF_UNREAL
+ Âàø âèðòóàëüíûé õîñò äåàêòèâèðîâàí. Äëÿ ðå-àêòèâàöèè èñïîëüçóéòå: /MODE %s +%s
+HOST_NO_VIDENT
+ IRCd âàøåé ñåòè íå ïîääåðæèâàåò âèðòóàëüíûå èäåíòû. Åñëè ýòî íå òàê, ñîîáùèòå íàì (ðàçðàáîò÷êàì) î äàííîì ôàêòå.
+HOST_GROUP
+ Âñå âèðòóàëüíûå õîñòû äëÿ íèêîâ ãðóïïû %s óñòàíîâëåíû íà %s
+HOST_IDENT_GROUP
+ Âñå âèðòóàëüíûå õîñòû äëÿ íèêîâ ãðóïïû %s óñòàíîâëåíû íà %s@%s
+HOST_LIST_FOOTER
+ Êîíåö ñïèñêà õîñòîâ, çàïèñåé íàñ÷èòàíî: %d
+HOST_LIST_RANGE_FOOTER
+ Êîíåö ñïèñêà çàïèñåé ñ %d ïî %d
+HOST_LIST_KEY_FOOTER
+ Êîíåö ñïèñêà õîñòîâ ïî ìàñêå %s, çàïèñåé íàñ÷èòàíî: %d
+
+###########################################################################
+#
+# HostServ Help messages
+#
+###########################################################################
+HOST_HELP_CMD_ON
+ ON Àêòèâèðóåò íàçíà÷åííûé âàì âèðòóàëüíûé õîñò
+
+HOST_HELP_CMD_OFF
+ OFF Äåàêòèâèðóåò âàø òåêóùèé âèðòóàëüíûé õîñò
+
+HOST_HELP_CMD_GROUP
+ GROUP Ñèíõðîíèçèðóåò âèðòóàëüíûé õîñò äëÿ âñåõ íèêîâ ãðóïïû
+
+HOST_HELP_CMD_SET
+ SET Óñòàíîâêà âèðòóàëüíîãî õîñòà óêàçàííîìó ïîëüçîâàòåëþ
+
+HOST_HELP_CMD_SETALL
+ SETALL Óñòàíîâêà âèðò. õîñòà äëÿ âñåõ íèêîâ óêàçàííîé ãðóïïû
+
+HOST_HELP_CMD_DEL
+ DEL Óäàëåíèå âèðòóàëüíîãî õîñòà
+
+HOST_HELP_CMD_DELALL
+ DELALL Óäàëåíèå âèðò. õîñòà ó âñåõ íèêîâ óêàçàííîé ãðóïïû
+
+HOST_HELP_CMD_LIST
+ LIST Âûâîä ñïèñêà âñåõ âèðòóàëüíûõ õîñòîâ
+
+HOST_OPER_HELP
+ íå èñïîëüçóåòñÿ.
+
+HOST_ADMIN_HELP
+ íå èñïîëüçóåòñÿ.
+
+HOST_HELP
+ Ñïèñîê êîìàíä %S:
+
+HOST_HELP_ON
+ Ñèíòàêñèñ: ON
+
+ Àêòèâèðóåò âàø âèðòóàëüíûé õîñò, ïðè óñëîâèè, êîíå÷íî, ÷òî îí ó âàñ
+ óñòàíîâëåí. Ñðàçó ïîñëå àêòèâàöèè, âàø ðåàëüíûé õîñò/IP-àäðåñ áóäåò
+ çàìåíåí íà âèðòóàëüíûé, è, ñîîòâåòñòâåííî, îí è áóäåò ïîêàçàí â
+ /WHOIS-èíôîðìàöèè âàøåãî íèêà.
+
+HOST_HELP_SET
+ Ñèíòàêñèñ: SET <íèê> <õîñòìàñêà>.
+
+ Óñòàíàâëèâàåò óêàçàííûé âèðòóàëüíûé õîñò äëÿ óêàçàííîãî íèêà. Åñëè
+ IRCd âàøåé ñåòè ïîäåðæèâàåò âèðòóàëüíûå èäåíòû, ìîæíî èñïîëüçîâàòü
+ ôîðìàò SET <íèê> <èäåíò>@<õîñòìàñêà> äëÿ óñòàíîâêè âèðòóàëüíûõ
+ èäåíòà è õîñòà îäíîâðåìåííî.
+
+HOST_HELP_DELALL
+ Ñèíòàêñèñ: DELALL <íèê>.
+
+ Óäàëÿåò âèðòóàëüíûå õîñòû ó âñåõ íèêîâ óêàçàííîé ãðóïïû.
+
+HOST_HELP_SETALL
+ Ñèíòàêñèñ: SETALL <íèê> <õîñòìàñêà>.
+
+ Óñòàíàâëèâàåò âèðòóàëüíûé õîñò äëÿ âñåõ íèêîâ óêàçàííîé ãðóïïû.Åñëè
+ IRCd âàøåé ñåòè ïîäåðæèâàåò âèðòóàëüíûå èäåíòû, ìîæíî èñïîëüçîâàòü
+ ôîðìàò SETALL <íèê> <èäåíò>@<õîñòìàñêà> äëÿ óñòàíîâêè âèðòóàëüíûõ
+ èäåíòà è õîñòà îäíîâðåìåííî.
+
+ Ïðèìå÷àíèå: âèðòóàëüíûé õîñò óñòàíàâëèâàåòñÿ äëÿ âñåõ òåêóùèõ
+ íèêîâ óêàçàííîé ãðóïïû è íå áóäåò àâòîìàòè÷åñêè îáíîâëåí äëÿ íîâîãî
+ íèêà, âíåñåííîãî â ãðóïïó óæå ïîñëå óñòàíîâêè âèðòóàëüíîãî õîñòà.
+
+HOST_HELP_OFF
+ Ñèíòàêñèñ: OFF
+
+ Äåàêòèâèðóåò âàø òåêóùèé âèðòóàëüíûé õîñò, ïðè óñëîâèè, êîíå÷íî,
+ ÷òî òàêîâîé óñòàíîâëåí íà ìîìåíò èñïîëüçîâàíèÿ êîìàíäû.
+
+HOST_HELP_DEL
+ Ñèíòàêñèñ: DEL <íèê>
+
+ Óäàëÿåò âèðòóàëüíûé õîñò íàçíà÷åííûé óêàçàííîìó íèêó.
+
+HOST_HELP_LIST
+ Ñèíòàêñèñ: LIST [<ìàñêà>|<#X-Y>]
+
+ Âûâîäèò ñïèñîê âñåõ âèðòóàëüíûõ õîñòîâ è íèêîâ, íà êîòîðûå ýòè õîñòû
+ óñòàíîâëåíû.
+
+  êà÷åñòâå äîïîëíèòåëüíîãî ïàðàìåòðà, âû ìîæåòå óêàçàòü ìàñêó ïîèñêà,
+ ÷òî ïîçâîëèò âàì ïîëó÷èòü òîëüêî ñîâïàäàþùèå ïî ñèìâîëüíîé ìàñêå
+ çàïèñè. Ïîìèìî ýòîãî, âû, òàê æå, ìîæåòå óêàçàòü ñïèñêîê çàïèñåé â
+ ôîðìàòå #X-Y, ãäå X - íîìåð ñòàðòîâîé çàïèñü, à Y - êîíå÷íîé.
+
+ Íàïðèìåð:
+
+ LIST *invis*
+ âûâåäåò ñïèñîê çàïèñåé, íèê èëè âèðò. õîñò êîòîðûõ ñîäåðæèò
+ ïîäñòðîêó *invis* (invisible, covinis è ò. ä.)
+
+ LIST #2-5
+ âûâåäåò ñïèñîê çàïèñåé ñî 2-îé ïî 5-þ.
+
+ Ëèìèò îäíîâðåìåííî ïîêàçûâàåìûõ çàïèñåé îãðàíè÷åí ÷èñëîì, óêàçàííûì
+ â êîíôèãóðàöèîííîì ôàéëå ñåðâèñîâ äèðåêòèâîé NSListMax.
+
+HOST_HELP_GROUP
+ Ñèíòàêñèñ: GROUP
+
+ Ýòà êîìàíäà ïîçâîëÿåò ïîëüçîâàòåëÿì óñòàíîâèòü âèðòóàëüíûé õîñò
+ ñ èõ ÒÅÊÓÙÅÃÎ íèêà íà âñå íèêè ãðóïïû.
+
+OPER_SVSNICK_UNSUPPORTED
+ IRCd âàøåé ñåòè íå ïîääåðæèâàåò âîçìîæíîñòè êîìàíäû SVSNICK.
+
+OPER_SQLINE_UNSUPPORTED
+ IRCd âàøåé ñåòè íå ïîääåðæèâàåò âîçìîæíîñòè êîìàíäû SQLINE.
+
+OPER_SVSO_UNSUPPORTED
+ IRCd âàøåé ñåòè íå ïîääåðæèâàåò âîçìîæíîñòè êîìàíäû OLINE.
+
+OPER_UMODE_UNSUPPORTED
+ IRCd âàøåé ñåòè íå ïîääåðæèâàåò âîçìîæíîñòè êîìàíäû UMODE.
+
+OPER_SUPER_ADMIN_NOT_ENABLED
+ Äèðåêòèâà SuperAdmin îòêëþ÷åíà â êîíôèãóðàöèîííîì ôàéëå ñåðâèñîâ. \ No newline at end of file
diff --git a/lang/tr.l b/lang/tr.l
new file mode 100644
index 000000000..19d4e9071
--- /dev/null
+++ b/lang/tr.l
@@ -0,0 +1,6713 @@
+# Turkish language file.
+#
+# (C) 2003-2008 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 us know
+# (dev@anope.org) 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
+# services.conf). 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 "%R%s HELP" yazýnýz.
+SYNTAX_ERROR
+ Kullanýmý: %s
+MORE_INFO
+ Daha fazla bilgi için %R%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.
+INVALID_TARGET
+ "/msg %s" is no longer supported. Use "/msg %s@%s" or "/%s" instead.
+
+# 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_TOO_LONG
+ Your password is too long. Please try again with a shorter password.
+
+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 %R%s HELP yazýn.
+NICK_X_IS_SERVICES
+ Nick %s is part of this Network's Services.
+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.
+NICK_X_SUSPENDED
+ Nick %s is currently suspended.
+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.
+ %R%s IDENTIFY þifreniz yazarak yeniden deneyiniz.
+CHAN_IDENTIFY_REQUIRED
+ Bu komutu kullanabilmek için þifrenizi girmelisiniz.
+ %R%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
+LIST_INCORRECT_RANGE
+ Incorrect range specified. The correct syntax is #from-to.
+CS_LIST_INCORRECT_RANGE
+ To search for channels starting with #, search for the channel
+ name without the #-sign prepended (anope instead of #anope).
+
+###########################################################################
+#
+# NickServ messages
+#
+###########################################################################
+
+# Automatic messages
+HELP_LIMIT_SERV_OPER
+ Limited to Services Operators.
+HELP_LIMIT_SERV_ADMIN
+ Limited to Services Administrators.
+HELP_LIMIT_SERV_ROOT
+ Limited to Services Roots.
+HELP_LIMIT_IRC_OPER
+ Limited to IRC Operators.
+HELP_LIMIT_HOST_SETTER
+ Limited to Host Setters.
+HELP_LIMIT_HOST_REMOVER
+ Limited to Host Removers.
+
+
+###########################################################################
+#
+# 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, %R%s IDENTIFY þifreniz yazýnýz.)
+NICK_IS_SECURE
+ Bu nick kayýtlý ve korumalýdýr. Eðer bu sizin nickiniz ise,
+ %R%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_REGISTERED_NO_MASK
+ Nickname %s registered.
+NICK_PASSWORD_IS
+ Nick Þifreniz %s - Ýlerde kullanacaðýnýz için unutmayýnýz ve kimseye söylemeyiniz.
+
+# GROUP responses
+NICK_REG_DELAY
+ You have to be connected longer than %d seconds to register your nick.
+
+# 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 %R%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 %R%s HELP GLIST ve %R%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 %R%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.
+
+# 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 %R%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_HIDE_STATUS_ON
+ Your services access status will now be hidden from %s INFO displays.
+NICK_SET_HIDE_STATUS_OFF
+ Your services access status 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 AUTOOP responses
+NICK_SET_AUTOOP_SYNTAX
+ SET AUTOOP {ON | OFF}
+NICK_SET_AUTOOP_ON
+ Services will now autoop you in channels.
+NICK_SET_AUTOOP_OFF
+ Services will no longer autoop you in channels.
+
+
+# SET NOEXPIRE responses
+NICK_SASET_SYNTAX
+ SASET nickname option parameters
+NICK_SASET_DISABLED
+ Sorry, nickname option setting is temporarily disabled.
+NICK_SASET_UNKNOWN_OPTION
+ Unknown SASET option %s.
+NICK_SASET_BAD_NICK
+ Nickname %s not registered.
+NICK_SASET_OPTION_DISABLED
+ Option %s cannot be set on this network.
+
+# SASET DISPLAY responses
+NICK_SASET_DISPLAY_INVALID
+ The new display for %s MUST be a nickname of the nickname group!
+NICK_SASET_DISPLAY_CHANGED
+ The new display is now %s.
+
+# SASET PASSWORD responses
+NICK_SASET_PASSWORD_FAILED
+ Sorry, couldn't change password for %s.
+NICK_SASET_PASSWORD_CHANGED
+ Password for %s changed.
+NICK_SASET_PASSWORD_CHANGED_TO
+ Password for %s changed to %s.
+
+# SASET LANGUAGE responses
+NICK_SASET_URL_CHANGED
+ URL for %s changed to %s.
+NICK_SASET_URL_UNSET
+ URL %s unset.
+
+# SASET EMAIL responses
+NICK_SASET_EMAIL_CHANGED
+ E-mail address for %s changed to %s.
+NICK_SASET_EMAIL_UNSET
+ E-mail address for %s unset.
+NICK_SASET_EMAIL_UNSET_IMPOSSIBLE
+ You cannot unset the e-mail on this network.
+
+# SASET ICQ responses
+NICK_SASET_ICQ_CHANGED
+ ICQ number for %s set to %s.
+NICK_SASET_ICQ_UNSET
+ ICQ number for %s unset.
+NICK_SASET_ICQ_INVALID
+ %s is not a valid number.
+
+# SASET GREET responses
+NICK_SASET_GREET_CHANGED
+ Greet message for %s changed to %s.
+NICK_SASET_GREET_UNSET
+ Greet message for %s unset.
+
+# SASET PROTECT responses
+NICK_SASET_KILL_SYNTAX
+ SASET nickname KILL {ON | QUICK | OFF}
+NICK_SASET_KILL_IMMED_SYNTAX
+ SASET nickname KILL {ON | QUICK | IMMED | OFF}
+NICK_SASET_KILL_ON
+ Protection is now ON for %s.
+NICK_SASET_KILL_QUICK
+ Protection is now ON for %s, with a reduced delay.
+NICK_SASET_KILL_IMMED
+ Protection is now ON for %s, with no delay.
+NICK_SASET_KILL_IMMED_DISABLED
+ The IMMED option is not available on this network.
+NICK_SASET_KILL_OFF
+ Protection is now OFF for %s.
+
+# SASET SECURE responses
+NICK_SASET_SECURE_SYNTAX
+ SASET nickname SECURE {ON | OFF}
+NICK_SASET_SECURE_ON
+ Secure option is now ON for %s.
+NICK_SASET_SECURE_OFF
+ Secure option is now OFF for %s.
+
+# SASET PRIVATE responses
+NICK_SASET_PRIVATE_SYNTAX
+ SASET nickname PRIVATE {ON | OFF}
+NICK_SASET_PRIVATE_ON
+ Private option is now ON for %s.
+NICK_SASET_PRIVATE_OFF
+ Private option is now OFF for %s.
+
+# SASET HIDE responses
+NICK_SASET_HIDE_SYNTAX
+ SET nickname HIDE {EMAIL | USERMASK | QUIT} {ON | OFF}
+NICK_SASET_HIDE_EMAIL_ON
+ The E-mail address of %s will now be hidden from %s INFO displays.
+NICK_SASET_HIDE_EMAIL_OFF
+ The E-mail address of %s will now be shown in %s INFO displays.
+NICK_SASET_HIDE_MASK_ON
+ The last seen user@host mask of %s will now be hidden from %s INFO displays.
+NICK_SASET_HIDE_MASK_OFF
+ The last seen user@host mask of %s will now be shown in %s INFO displays.
+NICK_SASET_HIDE_QUIT_ON
+ The last quit message of %s will now be hidden from %s INFO displays.
+NICK_SASET_HIDE_QUIT_OFF
+ The last quit message of %s will now be shown in %s INFO displays.
+NICK_SASET_HIDE_STATUS_ON
+ The services access status of %s will now be hidden from %s INFO displays.
+NICK_SASET_HIDE_STATUS_OFF
+ The services access status of %s will now be shown in %s INFO displays.
+
+# SASET MSG responses
+NICK_SASET_MSG_SYNTAX
+ SSAET nickname PRIVATE {ON | OFF}
+NICK_SASET_MSG_ON
+ Services will now reply to %s with messages.
+NICK_SASET_MSG_OFF
+ Services will now reply to %s with notices.
+
+# SET NOEXPIRE responses
+NICK_SASET_NOEXPIRE_SYNTAX
+ SASET nickname NOEXPIRE {ON | OFF}
+NICK_SASET_NOEXPIRE_ON
+ Nick %s will not expire.
+NICK_SASET_NOEXPIRE_OFF
+ Nick %s will expire.
+
+# ACCESS responses
+NICK_SASET_AUTOOP_SYNTAX
+ SASET nickname AUTOOP {ON | OFF}
+NICK_SASET_AUTOOP_ON
+ Services will now autoop %s in channels.
+NICK_SASET_AUTOOP_OFF
+ Services will no longer autoop %s in channels.
+
+# SASET LANGUAGE responses
+NICK_SASET_LANGUAGE_SYNTAX
+ SASET nickname LANGUAGE number
+NICK_SASET_LANGUAGE_UNKNOWN
+ Unknown language number %d. Type %R%s HELP SET LANGUAGE for a list of languages.
+NICK_SASET_LANGUAGE_CHANGED
+ Language changed to Turkish.
+
+
+# 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:
+NICK_ACCESS_LIST_EMPTY
+ Your access list is empty.
+NICK_ACCESS_LIST_X_EMPTY
+ Access list for %s is empty.
+
+# Status messages
+NICK_STATUS_0
+ STATUS %s 0
+NICK_STATUS_1
+ STATUS %s 1
+NICK_STATUS_2
+ STATUS %s 2
+NICK_STATUS_3
+ STATUS %s 3
+
+# 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_SERVICES_ROOT
+ %s is a services root administrator.
+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_VHOST2
+ vhost: %s@%s
+NICK_INFO_ICQ
+ ICQ #: %d
+NICK_INFO_GREET
+ Karþýlama mesajý: %s
+NICK_INFO_OPTIONS
+ Özellikler: %s
+NICK_INFO_EXPIRE
+ Expires in: %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_AUTOOP
+ Auto-op
+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, %R%s INFO %s ALL yazýn.
+
+# LIST responses
+NICK_INFO_SUSPENDED
+ This nickname is currently suspended, reason: %s
+NICK_INFO_SUSPENDED_NO_REASON
+ This nickname is currently suspended
+
+# LIST responses
+NICK_LIST_SYNTAX
+ LIST model
+NICK_LIST_SERVADMIN_SYNTAX
+ LIST model [FORBIDDEN] [SUSPENDED] [NOEXPIRE] [UNCONFIRMED]
+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.
+NICK_GLIST_REPLY
+ %c%s
+NICK_GLIST_REPLY_ADMIN
+ %c%s (expires in %s)
+
+# RECOVER responses
+NICK_RECOVER_SYNTAX
+ RECOVER nick [þifre]
+NICK_NO_RECOVER_SELF
+ Kendizi recover edemezsiniz!
+NICK_RECOVERED
+ User claiming your nick has been killed.
+ %R%s RELEASE %s to get it back before %s timeout.
+
+# 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_SUSPEND_SYNTAX
+ SUSPEND nickname reason
+NICK_SUSPEND_SUCCEEDED
+ Nick %s is now suspended.
+NICK_SUSPEND_FAILED
+ Couldn't suspend nick %s!
+
+# UNSUSPEND responses
+NICK_UNSUSPEND_SYNTAX
+ UNSUSPEND nickname
+NICK_UNSUSPEND_SUCCEEDED
+ Nick %s is now released.
+NICK_UNSUSPEND_FAILED
+ Couldn't release nick %s!
+
+# 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 %R%s confirm <passcode> to complete registration
+NICK_CONFIRM_NOT_FOUND
+ Registration step 1 may have expired, please use "%R%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 " %R%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_X_INVALID
+ Channel %s is not a valid channel.
+
+# 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 %R%s HELP yazýnýz.
+CHAN_MUST_IDENTIFY_NICK
+ Lütfen önce %s ile bu komutu kullanarak nickinizi tanýtýn:
+ %R%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.
+CHAN_REGISTER_NONE_CHANNEL
+ You have attempted to register a nonexistent channel %s
+CHAN_SYMBOL_REQUIRED
+ Please use the symbol of # when attempting to register
+
+
+# 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 (Except the channel founder).
+CHAN_LOGOUT_FOUNDER_FAILED
+ You may not log out of %s (you are founder).
+
+# 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 retention option for %s is now ON.
+CHAN_SET_KEEPTOPIC_OFF
+ Topic retention option for %s is now OFF.
+
+# SET TOPICLOCK responses
+CHAN_SET_TOPICLOCK_SYNTAX
+ SET kanaladý TOPICLOCK {ON | OFF}
+CHAN_SET_TOPICLOCK_ON
+ Topic lock option for %s is now ON.
+CHAN_SET_TOPICLOCK_OFF
+ Topic lock option for %s is now OFF.
+
+# SET PEACE responses
+CHAN_SET_PEACE_SYNTAX
+ SET kanaladi PEACE {ON | OFF}
+CHAN_SET_PEACE_ON
+ Peace option for %s is now ON.
+CHAN_SET_PEACE_OFF
+ Peace option for %s is now OFF.
+
+# SET PRIVATE responses
+CHAN_SET_PRIVATE_SYNTAX
+ SET kanaladý PRIVATE {ON | OFF}
+CHAN_SET_PRIVATE_ON
+ Private option for %s is now ON.
+CHAN_SET_PRIVATE_OFF
+ Private option for %s is now OFF.
+
+# SET SECUREOPS responses
+CHAN_SET_SECUREOPS_SYNTAX
+ SET kanaladý SECUREOPS {ON | OFF}
+CHAN_SET_SECUREOPS_ON
+ Secure ops option for %s is now ON.
+CHAN_SET_SECUREOPS_OFF
+ Secure ops option for %s is now OFF.
+
+# SET SECUREFOUNDER responses
+CHAN_SET_SECUREFOUNDER_SYNTAX
+ SET kanaladý SECUREFOUNDER {ON | OFF}
+CHAN_SET_SECUREFOUNDER_ON
+ Secure founder option for %s is now ON.
+CHAN_SET_SECUREFOUNDER_OFF
+ Secure founder option for %s is now OFF.
+
+# SET RESTRICTED responses
+CHAN_SET_RESTRICTED_SYNTAX
+ SET kanaladý RESTRICTED {ON | OFF}
+CHAN_SET_RESTRICTED_ON
+ Restricted access option for %s is now ON.
+CHAN_SET_RESTRICTED_OFF
+ Restricted access option for %s is now OFF.
+
+# SET SECURE responses
+CHAN_SET_SECURE_SYNTAX
+ SET kanal SECURE {ON | OFF}
+CHAN_SET_SECURE_ON
+ Secure option for %s is now ON.
+CHAN_SET_SECURE_OFF
+ Secure option for %s is now OFF.
+
+# SET SIGNKICK responses
+CHAN_SET_SIGNKICK_SYNTAX
+ SET kanaladý SIGNKICK {ON | LEVEL | OFF}
+CHAN_SET_SIGNKICK_ON
+ Signed kick option for %s is now ON.
+CHAN_SET_SIGNKICK_LEVEL
+ Signed kick option for %s is now ON, but depends of the
+ level of the user that is using the command.
+CHAN_SET_SIGNKICK_OFF
+ Signed kick option for %s is now OFF.
+
+# SET OPNOTICE responses
+CHAN_SET_OPNOTICE_SYNTAX
+ SET kanaladý OPNOTICE {ON | OFF}
+CHAN_SET_OPNOTICE_ON
+ Op-notice option for %s is now ON.
+CHAN_SET_OPNOTICE_OFF
+ Op-notice option for %s is now OFF.
+
+# SET XOP responses
+CHAN_SET_XOP_SYNTAX
+ SET kanaladi XOP {ON | OFF}
+CHAN_SET_XOP_ON
+ xOP lists system for %s is now ON.
+CHAN_SET_XOP_OFF
+ xOP lists system for %s is now OFF.
+
+# 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 %R%s HELP ACCESS yazin.
+CHAN_XOP_NOT_AVAILABLE
+ xOP system is not available.
+
+# 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 %s 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 %s 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 %s 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 %s 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 %R%s HELP komut yazin.
+CHAN_ACCESS_XOP_HOP
+ You can't use this command.
+ Use the AOP, SOP, HOP and VOP commands instead.
+ Type %R%s HELP command for more information.
+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 %s 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 %s 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 %R%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.
+
+# Status Messages
+CHAN_STATUS_SYNTAX
+ STATUS ERROR Syntax error
+CHAN_STATUS_NOT_REGGED
+ STATUS ERROR Channel %s not registered
+CHAN_STATUS_FORBIDDEN
+ STATUS ERROR Channel %s forbidden
+CHAN_STATUS_NOTONLINE
+ STATUS ERROR Nick %s not online
+CHAN_STATUS_INFO
+ STATUS %s %s %d
+
+# 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_EXPIRE
+ Expires in: %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_HOPS
+ Mode +h has been cleared from channel %s.
+CHAN_CLEARED_VOICES
+ Mod +v %s kanalýnda temizlendi.
+CHAN_CLEARED_USERS
+ %s kanalýndaki tüm kullanýcýlar atýldý.
+CHAN_CLEARED_INVITES
+ All invites on channel %s have been removed.
+
+# 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_GETKEY_SYNTAX
+ GETKEY channel
+CHAN_GETKEY_NOKEY
+ The channel %s has no key.
+CHAN_GETKEY_KEY
+ KEY %s %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 %R%s READ LAST yazýn.
+MEMO_TYPE_READ_NUM
+ Okumak için %R%s READ %d yazýn.
+MEMO_TYPE_LIST_NEW
+ Listelemek için %R%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 %R%s READ %s %d to read it.
+MEMO_NEW_MEMO_ARRIVED
+ %s nickinden yeni mesajýnýz var.
+ Okumak için %R%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: %R%s READ num yazýn.
+MEMO_LIST_NEW_MEMOS
+ %s nicki için yeni mesajlar. Okumak için: %R%s READ num yazýn.
+MEMO_LIST_CHAN_MEMOS
+ %s kanali için mesajlar. Okumak için: %R%s READ %s num yazýn.
+MEMO_LIST_CHAN_NEW_MEMOS
+ %s kanali için yeni mesajlar. Okumak için: %R%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: %R%s DEL %d yazýn.
+MEMO_CHAN_HEADER
+ %d nolu mesaj %s nickinden (%s). Silmek için: %R%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_NOTIFY_MAIL
+ You will now be informed about new memos via email.
+MEMO_SET_NOTIFY_NOMAIL
+ You will no longer be informed via email.
+MEMO_SET_NOTIFY_INVALIDMAIL
+ There's no email address set for your nick.
+
+# 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
+MEMO_MAIL_SUBJECT
+ New memo
+MEMO_MAIL_TEXT1
+ Hi %s
+MEMO_MAIL_TEXT2
+ You've just received a new memo from %s. This is memo number %d.
+MEMO_MAIL_TEXT3
+ Memo Text:
+
+###########################################################################
+#
+# BotServ messages
+#
+###########################################################################
+
+# Standard responses
+MEMO_RSEND_PLEASE_WAIT
+ Please wait %d seconds before using the RSEND command again.
+MEMO_RSEND_DISABLED
+ Sorry, RSEND has been disabled on this network.
+MEMO_RSEND_SYNTAX
+ RSEND {nick | channel} memo-text
+MEMO_RSEND_NICK_MEMO_TEXT
+ [auto-memo] The memo you sent has been viewed.
+MEMO_RSEND_CHAN_MEMO_TEXT
+ [auto-memo] The memo you sent to %s has been viewed.
+MEMO_RSEND_USER_NOTIFICATION
+ A notification memo has been sent to %s informing him/her you have
+ read his/her memo.
+
+###########################################################################
+#
+# BotServ messages
+#
+###########################################################################
+
+# Standard responses
+MEMO_CHECK_SYNTAX
+ CHECK nickname
+MEMO_CHECK_NOT_READ
+ The last memo you sent to %s (sent on %s) has not yet been read.
+MEMO_CHECK_READ
+ The last memo you sent to %s (sent on %s) has been read.
+MEMO_CHECK_NO_MEMO
+ Nick %s doesn't have a memo from you.
+
+###########################################################################
+#
+# BotServ messages
+#
+###########################################################################
+
+# Standard responses
+MEMO_NO_RSEND_SELF
+ You can not request a receipt when sending a memo to yourself.
+
+###########################################################################
+#
+# 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 %R%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_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 %R%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 %R%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.
+BOT_LONG_IDENT
+ Bot Idents may only contain %d characters.
+BOT_LONG_HOST
+ Bot Hosts may only contain %d 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_HOSTSERV_MEM
+ HostServ : %6d records, %5d kB
+OPER_STATS_OPERSERV_MEM
+ OperServ : %6d kayýt, %5d kB
+OPER_STATS_SESSIONS_MEM
+ Oturumlar : %6d kayýt, %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_STATS_UPLINK_SERVER
+ Uplink server: %s
+OPER_STATS_UPLINK_CAPAB
+ Uplink capab: %s
+OPER_STATS_UPLINK_SERVER_COUNT
+ Servers found: %d
+
+# 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_ADMIN_MOVED
+ %s has been moved to Services Administrators list.
+
+# 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.
+OPER_OPER_MOVED
+ %s has been moved to Services Operators list.
+
+# 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
+ CHANKILL [+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.
+OPER_SET_SQL_ON
+ SQL code will be used.
+OPER_SET_SQL_OFF
+ SQL code will not be used.
+OPER_SET_SQL_ERROR
+ Setting for SQL must be ON or OFF.
+OPER_SET_SQL_ERROR_INIT
+ Error during init of SQL, check your logs to correct.
+OPER_SET_SQL_ERROR_DISABLED
+ SQL is not configured for this network. Please edit the
+ configuration file (services.conf).
+OPER_SET_LIST_OPTION_ON
+ %s is enable
+OPER_SET_LIST_OPTION_OFF
+ %s is disabled
+
+# 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 | mask]
+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_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_NO_UNLOAD
+ This module can not be unloaded.
+OPER_MODULE_LOAD_SYNTAX
+ MODLOAD FileName
+OPER_MODULE_UNLOAD_SYNTAX
+ MODUNLOAD FileName
+OPER_MODULE_LIST_HEADER
+ Current Module list:
+OPER_MODULE_LIST
+ Module: %s [%s] [%s]
+OPER_MODULE_LIST_FOOTER
+ %d Modules loaded.
+OPER_MODULE_INFO_LIST
+ Module: %s Version: %s Author: %s loaded: %s
+OPER_MODULE_CMD_LIST
+ Providing command: %R%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.
+OPER_EXCEPTION_EXISTS
+ %s already exists on the EXCEPTION list.
+OPER_EXCEPTION_CHANGED
+ Exception for %s has been updated to %d.
+
+# 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
+ 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 %s messages will be
+ sent in order to avoid flooding the user. If there are
+ more news messages, only the most recent will be sent.)
+ NewsCount can be configured in services.conf.
+
+ 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 %s messages will
+ be sent in order to avoid flooding the user. If there are
+ more news messages, only the most recent will be sent.)
+ NewsCount can be configured in services.conf.
+
+ 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
+ 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.
+
+ %R%s HELP
+ nick kayýt hakkýnda bilgiler içerir.
+
+ %R%s HELP
+ kanal kayýdý ve kontrolü hakkýnda bilgi içerir.
+
+ %R%s HELP
+ kullanýcýlara internette olmasalar bile mesaj göndermek
+ için gerekli bilgileri içerir.
+
+HELP_HELP_BOT
+
+ %R%s HELP
+ kanallara bot sokulmasý ve ayarlarý hakkýnda bilgi içerir.
+
+HELP_HELP_HOST
+
+ %R%s HELP
+ for information on setting up nick vHosts
+
+###########################################################################
+#
+# NickServ help messages
+#
+###########################################################################
+NICK_HELP_CMD_CONFIRM
+ CONFIRM Confirm a nickserv auth code
+NICK_HELP_CMD_RESEND
+ RESEND Resend a nickserv auth code
+
+NICK_HELP_CMD_REGISTER
+ REGISTER Nickinizi kaydeder
+NICK_HELP_CMD_GROUP
+ GROUP Bir gruba dahil eder
+NICK_HELP_CMD_IDENTIFY
+ IDENTIFY Þifrenizle nickinizi tanýtýr
+NICK_HELP_CMD_ACCESS
+ ACCESS Ýzinli adreslerin listesini düzenler
+NICK_HELP_CMD_SET
+ SET Ayarlar, kill korumasýný içerir
+NICK_HELP_CMD_SASET
+ SASET Set SET-options on another nickname
+NICK_HELP_CMD_DROP
+ DROP Nickin kaydýný siler
+NICK_HELP_CMD_RECOVER
+ RECOVER Nickinizi kullanan birini kill ler
+NICK_HELP_CMD_RELEASE
+ RELEASE RECOVER komutundan sonra nickinizi serbest
+ býrakýr
+NICK_HELP_CMD_SENDPASS
+ SENDPASS Þifrenizimi unuttunuz? Bunu deneyin
+NICK_HELP_CMD_GHOST
+ GHOST Disconnects a "ghost" IRC session using your nick
+NICK_HELP_CMD_ALIST
+ ALIST List channels you have access on
+NICK_HELP_CMD_GLIST
+ GLIST Lists all nicknames in your group
+NICK_HELP_CMD_INFO
+ INFO Displays information about a given nickname
+NICK_HELP_CMD_LIST
+ LIST List all registered nicknames that match a given pattern
+NICK_HELP_CMD_LOGOUT
+ LOGOUT Reverses the effect of the IDENTIFY command
+NICK_HELP_CMD_STATUS
+ STATUS Returns the owner status of the given nickname
+NICK_HELP_CMD_UPDATE
+ UPDATE Updates your current status, i.e. it checks for new memos
+NICK_HELP_CMD_GETPASS
+ GETPASS Bir nickin þifresini öðrenmek içindir
+ (Sadece þifreleme(encryption) devre dýþýysa)
+NICK_HELP_CMD_GETEMAIL
+ GETEMAIL Matches and returns all users that registered using given email
+NICK_HELP_CMD_FORBID
+ FORBID Bir nickin kullanýlmasýný yasaklar
+NICK_HELP_CMD_SUSPEND
+ SUSPEND Suspend a given nick
+NICK_HELP_CMD_UNSUSPEND
+ UNSUSPEND Unsuspend a given nick
+
+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,
+ %R%S komut yazýn. Belirli bir komut hakkýnda daha
+ fazla bilgi için, %R%S HELP komut yazýn.
+
+NICK_HELP_FOOTER
+ 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,
+ %R%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
+ %R%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 %R%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 %R%S LIST yazýldýðýnda görünmesini
+ engeller
+ HIDE Nickinizle ilgili bazý bilgileri saklar
+ AUTOOP Should services op you automatically.
+
+ Bu komutu kullanabilmek için önce, þifrenizle
+ kendinizi tanýtmanýz gerekir (Daha fazla bilgi için
+ %R%S HELP IDENTIFY yazýn).
+
+ Belirli bir özellik(option) hakkýnda bilgi almak için
+ %R%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_SET_AUTOOP
+ Syntax: SET AUTOOP {ON | OFF}
+
+ Sets whether you will be opped automatically. Set to ON to
+ allow ChanServ to op you automatically when entering channels.
+
+NICK_HELP_SASET
+ Syntax: SASET nickname option parameters.
+
+ Sets various nickname options. option can be one of:
+
+ DISPLAY Set the display of the group in Services
+ PASSWORD Set the nickname password
+ URL Associate a URL with the nickname
+ EMAIL Associate an E-mail address with the nickname
+ ICQ Associate an ICQ number with the nickname
+ GREET Associate a greet message with the nickname
+ KILL Turn protection on or off
+ SECURE Turn nickname security on or off
+ PRIVATE Prevent the nickname from appearing in a
+ %R%S LIST
+ HIDE Hide certain pieces of nickname information
+ MSG Change the communication method of Services
+ NOEXPIRE Prevent the nickname from expiring
+ LANGUAGE Set the language Services will use when
+ sending messages to nickname
+
+ Type %R%S HELP SASET option for more information
+ on a specific option. The options will be set on the given
+ nickname.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_DISPLAY
+ Syntax: SASET nickname DISPLAY new-display
+
+ Changes the display used to refer to the nickname group in
+ Services. The new display MUST be a nick of the group.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_PASSWORD
+ Syntax: SASET nickname PASSWORD new-password
+
+ Changes the password used to identify as the nick's owner.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_URL
+ Syntax: SASET nickname URL url
+
+ Associates the given URL with the nickname. This URL
+ will be displayed whenever someone requests information
+ on the nick with the INFO command.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_EMAIL
+ Syntax: SASET nickname EMAIL address
+
+ Associates the given E-mail address with the nickname.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_ICQ
+ Syntax: SASET nickname ICQ number
+
+ Associates the given ICQ number with the nickname. This
+ number will be displayed whenever someone requests
+ information on the nick with the INFO command.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_GREET
+ Syntax: SASET nickname GREET message
+
+ Makes the given message the greet of the nickname, that
+ will be displayed when joining a channel that has GREET
+ option enabled, provided that the user has the necessary
+ access on it.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_KILL
+ Syntax: SASET nickname KILL {ON | QUICK | IMMED | OFF}
+
+ Turns the automatic protection option for the nick
+ on or off. With protection on, if another user
+ tries to take the 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.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_SECURE
+ Syntax: SASET nickname 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.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_PRIVATE
+ Syntax: SASET nickname PRIVATE {ON | OFF}
+
+ Turns %S's privacy option on or off for the nick.
+ With PRIVATE set, the nickname will not appear in
+ nickname lists generated with %S's LIST command.
+ (However, anyone who knows the nickname can still get
+ information on it using the INFO command.)
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_HIDE
+ Syntax: SASET nickname HIDE {EMAIL | STATUS | USERMASK | QUIT} {ON | OFF}
+
+ Allows you to prevent certain pieces of information from
+ being displayed when someone does a %S INFO on the
+ nick. You can hide the E-mail address (EMAIL), last seen
+ user@host mask (USERMASK), the services access status
+ (STATUS) and last quit message (QUIT).
+ The second parameter specifies whether the information should
+ be displayed (OFF) or hidden (ON).
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_MSG
+ Syntax: SASET nickname MSG {ON | OFF}
+
+ Allows you to choose the way Services are communicating with
+ the given user. With MSG set, Services will use messages,
+ else they'll use notices.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_NOEXPIRE
+ Syntax: SASET nickname NOEXPIRE {ON | OFF}
+
+ Sets whether the given nickname will expire. Setting this
+ to ON prevents the nickname from expiring.
+
+ Limited to Services admins.
+
+NICK_HELP_SASET_AUTOOP
+ Syntax: SASET nickname AUTOOP {ON | OFF}
+
+ Sets whether the given nickname will be opped automatically.
+ Set to ON to allow ChanServ to op the given nickname
+ automatically when joining channels.
+
+NICK_HELP_SASET_LANGUAGE
+ Syntax: SASET nickname LANGUAGE number
+
+ Changes the language Services uses when sending messages to
+ nickname (for example, when responding to a command he sends).
+ number should be chosen from a list of supported languages
+ that you can get by typing %R%S HELP SET LANGUAGE.
+
+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
+ remain online for %s to ensure that the other
+ user does not immediately reconnect; after that time, you
+ can reclaim your nick. Alternatively, use the RELEASE
+ command (%R%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. This holds lasts for %s;
+ 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
+ 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. If no nickname is given, your status
+ will be returned.
+
+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_HELP_CONFIRM
+ Syntax: CONFIRM passcode
+
+ This is the second step of nickname registration process.
+ You must perform this command in order to get your nickname
+ registered with %S. The passcode (or called auth code also)
+ is sent to your e-mail address in the first step of the
+ registration process. For more information about the first
+ stage of the registration process, type: %R%S HELP REGISTER
+
+NICK_HELP_RESEND
+ Syntax: RESEND
+
+ This command will re-send the auth code (also called passcode)
+ to the e-mail address of the user whom is performing it.
+
+NICK_SERVADMIN_HELP
+ Servis adminleri herhangi bir nickin tanýtmasýna gerek olmadan
+ kaydýný silebilir(drop) ve herhangi bir nickin access listesini
+ görüntüleyebilir. (%R%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_INFO
+
+ Servis adminleri ALL parametresini herhangi bir nick için
+ kullanabilirler.
+
+NICK_SERVADMIN_HELP_LIST
+ Kullanýmý: LIST model [FORBIDDEN] [SUSPENDED] [NOEXPIRE] [UNCONFIRMED]
+
+ 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.
+
+ If the FORBIDDEN, SUSPENDED, NOEXPIRE or UNCONFIRMED options are given, only
+ nicks which, respectively, are FORBIDDEN, SUSPENDED, UNCONFIRMED or have the
+ NOEXPIRE flag set will be displayed. If multiple options are
+ given, all nicks matching at least one option will be displayed.
+ These options are limited to Services admins.
+
+ Ö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
+#
+###########################################################################
+
+NICK_SERVADMIN_HELP_SUSPEND
+ Syntax: SUSPEND nickname reason / UNSUSPEND nickname
+
+ SUSPENDs / UNSUSPENDs a nickname from being identified to
+
+ Limited to Services admins.
+
+###########################################################################
+#
+# ChanServ help messages
+#
+###########################################################################
+
+NICK_SERVADMIN_HELP_UNSUSPEND
+ Syntax: UNSUSPEND nickname
+
+ UNSUSPENDS a nickname from being used.
+
+ Limited to Services admins.
+
+###########################################################################
+#
+# ChanServ help messages
+#
+###########################################################################
+CHAN_HELP_CMD_GETPASS
+ GETPASS Bir kanalýn founder þifresini ister
+CHAN_HELP_CMD_FORBID
+ FORBID Kanalý kullanýma kapatýr
+CHAN_HELP_CMD_SUSPEND
+ SUSPEND Prevent a channel from being used preserving
+ channel data and settings
+CHAN_HELP_CMD_UNSUSPEND
+ UNSUSPEND Releases a suspended channel
+CHAN_HELP_CMD_STATUS
+ STATUS Kullanýcýnýn kanaldaki access seviyesini söyler
+CHAN_HELP_CMD_REGISTER
+ REGISTER Kanalý kaydeder
+CHAN_HELP_CMD_IDENTIFY
+ IDENTIFY Þifreyle sizi kanalýn sahibi olarak tanýmlar
+CHAN_HELP_CMD_SET
+ SET Kanal özelliklerini ve bilgisini ayarlar
+CHAN_HELP_CMD_AOP
+ AOP AOP listesini düzenler
+CHAN_HELP_CMD_SOP
+ SOP SOP listesini düzenler
+CHAN_HELP_CMD_ACCESS
+ ACCESS Ayrýcalýklý kullanýcýlarý belirler deðiþtirir
+CHAN_HELP_CMD_LEVELS
+ LEVELS Access seviyelerini isteðinize göre düzenler
+CHAN_HELP_CMD_AKICK
+ AKICK Autokick listesini düzenler
+CHAN_HELP_CMD_DROP
+ DROP Kanal kaydýný siler
+CHAN_HELP_CMD_SENDPASS
+ SENDPASS Kayýp þifrelerinizi söyler
+CHAN_HELP_CMD_BAN
+ BAN Bans a selected nick on a channel
+CHAN_HELP_CMD_CLEAR
+ CLEAR Tells ChanServ to clear certain settings on a channel
+CHAN_HELP_CMD_DEVOICE
+ DEVOICE Devoices a selected nick on a channel
+CHAN_HELP_CMD_GETKEY
+ GETKEY Returns the key of the given channel
+CHAN_HELP_CMD_INFO
+ INFO Lists information about the named registered channel
+CHAN_HELP_CMD_INVITE
+ INVITE Tells ChanServ to invite you or a given nick into a channel
+CHAN_HELP_CMD_KICK
+ KICK Kicks a selected nick from a channel
+CHAN_HELP_CMD_LIST
+ LIST Lists all registered channels matching the given pattern
+CHAN_HELP_CMD_LOGOUT
+ LOGOUT This command will logout the selected nickname
+CHAN_HELP_CMD_OP
+ OP Gives Op status to a selected nick on a channel
+CHAN_HELP_CMD_TOPIC
+ TOPIC Manipulate the topic of the specified channel
+CHAN_HELP_CMD_UNBAN
+ UNBAN Remove all bans preventing you from entering a channel
+CHAN_HELP_CMD_VOICE
+ VOICE Voices a selected nick on a channel
+CHAN_HELP_CMD_VOP
+ VOP Maintains the VOP (VOicePeople) list for a channel
+CHAN_HELP_CMD_DEHALFOP
+ DEHALFOP Dehalfops a selected nick on a channel
+CHAN_HELP_CMD_DEOWNER
+ DEOWNER Removes your owner status on a channel
+CHAN_HELP_CMD_DEPROTECT
+ DEPROTECT Deprotects a selected nick on a channel
+CHAN_HELP_CMD_HALFOP
+ HALFOP Halfops a selected nick on a channel
+CHAN_HELP_CMD_HOP
+ HOP Maintains the HOP (HalfOP) list for a channel
+CHAN_HELP_CMD_OWNER
+ OWNER Gives you owner status on channel
+CHAN_HELP_CMD_PROTECT
+ PROTECT Protects a selected nick on a channel
+CHAN_HELP_CMD_ADMIN
+ ADMIN Protects a selected nick on a channel
+CHAN_HELP_CMD_DEADMIN
+ DEADMIN Deprotects a selected nick on a channel
+CHAN_HELP_CMD_DEOP
+ DEOP Deops a selected nick on a channel
+
+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 %R%S komut
+ yazýn. Belirli bir komut hakkýnda daha fazla bilgi için,
+ %R%S HELP komut yazýn.
+
+
+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 (%R%S HELP ACCESS).
+
+ NOT: Bir kanalý kaydedebilmek için, önce nickinizi kaydetmelisiniz.
+ Eðer kaydetmediyseniz %R%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
+ %R%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, %R%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 %R%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 %R%S HELP ACCESS yazin.
+ Access ile xOP arasinda geçis yapabilmek için gerekli bilgilere
+ %R%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 %R%S HELP ACCESS yazin.
+ Access ile xOP arasinda geçis yapabilmek için gerekli bilgilere
+ %R%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 %R%S HELP ACCESS yazin.
+ Access ile xOP arasinda geçis yapabilmek için gerekli bilgilere
+ %R%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 %R%S HELP ACCESS yazin.
+ Access ile xOP arasinda geçis yapabilmek için gerekli bilgilere
+ %R%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 %R%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 %R%S HELP LEVELS
+ yazýn.
+
+CHAN_HELP_AKICK
+ Kullanýmý: AKICK channel ADD {nick | mask} [reason]
+ AKICK channel STICK mask
+ AKICK channel UNSTICK mask
+ AKICK channel DEL {nick | mask | entry-num | list}
+ AKICK channel LIST [mask | entry-num | list]
+ AKICK channel VIEW [mask | entry-num | list]
+ 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 %R%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.
+ HOPS Removes channel-halfoperator status (mode +h) from
+ all channel halfoperators, if supported.
+ 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
+
+ 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_CMD_SEND
+ SEND Nicke veya kanala mesaj gönderir
+MEMO_HELP_CMD_CANCEL
+ CANCEL Son gönderilen mesajý iptal eder
+MEMO_HELP_CMD_LIST
+ LIST Mesajlarýnýzý listeler
+MEMO_HELP_CMD_READ
+ READ Mesajlarý okumanýzý saðlar
+MEMO_HELP_CMD_DEL
+ DEL Mesajlarý silmenizi saðlar
+MEMO_HELP_CMD_SET
+ SET Mesajlarla ilgili ayarlarý yapar
+MEMO_HELP_CMD_INFO
+ INFO Displays information about your memos
+MEMO_HELP_CMD_RSEND
+ RSEND Sends a memo and requests a read receipt
+MEMO_HELP_CMD_CHECK
+ CHECK Checks if last memo to a nick was read
+MEMO_HELP_CMD_SENDALL
+ SENDALL Send a memo to all registered users
+MEMO_HELP_CMD_STAFF
+ STAFF Send a memo to all opers/admins
+
+MEMO_HELP_HEADER
+ %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ý:
+
+
+MEMO_HELP_ADMIN
+ not used.
+MEMO_HELP_OPER
+ not used.
+MEMO_HELP_FOOTER
+
+ Yukardaki herhangi bir komut hakkýnda yardým için
+ %R%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,
+ %R%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
+#
+###########################################################################
+
+MEMO_HELP_RSEND
+ Syntax: RSEND {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.
+ Once the memo is read by its recepient, an automatic notification
+ memo will be sent to the sender informing him/her that the memo
+ has been read.
+
+###########################################################################
+#
+# OperServ help messages
+#
+###########################################################################
+
+MEMO_HELP_CHECK
+ Syntax: CHECK nick
+
+ Checks whether the _last_ memo you sent to nick has been read
+ or not. Note that this does only work with nicks, not with chans.
+
+###########################################################################
+#
+# OperServ help messages
+#
+###########################################################################
+
+OPER_HELP_CMD_GLOBAL
+ GLOBAL Tüm kullanýcýlara mesaj gönderir
+OPER_HELP_CMD_STATS
+ STATS Servislerin ve networkun durumunu gösterir
+OPER_HELP_CMD_OPER
+ OPER Servis operatör listesini düzenler
+OPER_HELP_CMD_ADMIN
+ ADMIN Servis adminleri listesini düzenler
+OPER_HELP_CMD_STAFF
+ STAFF Display Services staff and online status
+OPER_HELP_CMD_MODE
+ MODE Bir kanalýn modlarýný deðiþtirir
+OPER_HELP_CMD_KICK
+ KICK Bir kullanýcýyý kanaldan atar
+OPER_HELP_CMD_CLEARMODES
+ CLEARMODES Bir kanalýn modlarýný temizler
+OPER_HELP_CMD_KILLCLONES
+ KILLCLONES Ayni ip'deki tum kullanicilari kill'ler.
+OPER_HELP_CMD_AKILL
+ AKILL AKILL listesini düzenler
+OPER_HELP_CMD_SGLINE
+ SGLINE SGLINE listesini düzenler
+OPER_HELP_CMD_SQLINE
+ SQLINE SQLINE listesini düzenler
+OPER_HELP_CMD_SZLINE
+ SZLINE SZLINE listesini düzenler
+OPER_HELP_CMD_CHANLIST
+ CHANLIST Tüm kanal kayýtlarýný listeler
+OPER_HELP_CMD_USERLIST
+ USERLIST Tüm kullanýcý kayýtlarýný listeler
+OPER_HELP_CMD_LOGONNEWS
+ LOGONNEWS Baðlantý sýrasýnda kullanýcýnýn göreceði mesajý
+ belirler
+OPER_HELP_CMD_RANDOMNEWS
+ RANDOMNEWS Baglanti sirasina kullaniciya gönderilen karisik
+ mesajlari belirler
+OPER_HELP_CMD_OPERNEWS
+ OPERNEWS Oper olan kullanýcýlarýn görüntüleyeceði mesajý
+ belirler
+OPER_HELP_CMD_SESSION
+ SESSION Host session(oturum) larýn listesini gösterir
+OPER_HELP_CMD_EXCEPTION
+ EXCEPTION Session-limit exception listesini düzenler
+OPER_HELP_CMD_NOOP
+ NOOP Geçici olarak tüm O:line larý kaldýrýr
+OPER_HELP_CMD_JUPE
+ JUPE Bir server'ý "Kullanýlmaz" yapar
+OPER_HELP_CMD_IGNORE
+ IGNORE Modify the Services ignore list
+OPER_HELP_CMD_SET
+ SET Çeþitli global servis özelliklerini ayarlar
+OPER_HELP_CMD_RELOAD
+ RELOAD Servislerin conf dosyasýný yeniden yükler
+OPER_HELP_CMD_UPDATE
+ UPDATE Diskteki Servis veritabanýnýn hemen
+ güncellenmesini saðlar
+
+OPER_HELP_CMD_RESTART
+ RESTART Veritabanýný kaydeder ve servisleri yeniden
+ baþlatýr
+
+OPER_HELP_CMD_QUIT
+ QUIT Servis programýný kapatýr
+OPER_HELP_CMD_SHUTDOWN
+ SHUTDOWN Servisler programýný kayýt ederek kapatýr
+OPER_HELP_CMD_DEFCON
+ DEFCON Manipulate the DefCon system
+OPER_HELP_CMD_CHANKILL
+ CHANKILL Kill all users on a specific channel
+OPER_HELP_CMD_OLINE
+ OLINE Give Operflags to a certain user
+OPER_HELP_CMD_UMODE
+ UMODE Change a user's modes
+OPER_HELP_CMD_SVSNICK
+ SVSNICK Forcefully change a user's nickname
+OPER_HELP_CMD_MODLOAD
+ MODLOAD Load a module
+OPER_HELP_CMD_MODUNLOAD
+ MODUNLOAD Un-Load a module
+OPER_HELP_CMD_MODINFO
+ MODINFO Info about a loaded module
+OPER_HELP_CMD_MODLIST
+ MODLIST List loaded modules
+
+OPER_HELP
+ %S commands:
+
+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 Root 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.
+
+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|CLEAR} [time] [nick | mask]
+
+ Allows Services Admins to make Services ignore a nick or mask
+ 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.
+ When adding a mask, it should be in the format user@host
+ or nick!user@host, everything else will be considered a nick.
+ Wildcards are permitted.
+
+ Ignores will not be enforced on IRC Operators.
+
+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 Super Admins to set user modes for any user.
+ Parameters are the same as for the standard /MODE
+ command.
+
+OPER_HELP_OLINE
+ Syntax: OLINE user flags
+
+ Allows Super 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.
+
+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 Super 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
+ SUPERADMIN Activate or deactivate super-admin mode
+ SQL Activate or deactivate sql mode
+ IGNORE Activate or deactivate ignore mode
+ LIST List the options
+
+ 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.
+
+ This option is equivalent to the command-line option -logchan.
+
+ 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_SET_SQL
+ Syntax: SET SQL {ON | OFF}
+
+ Setting this will toggle Anope's from usage of SQL, this should
+ be used to disable and enable SQL should your SQL server go down
+ while services are running.
+
+OPER_HELP_SET_IGNORE
+ Syntax: SET IGNORE {ON | OFF}
+
+ Setting this will toggle Anope's usage of the IGNORE system
+ on or off.
+
+OPER_HELP_SET_LIST
+ Syntax: SET LIST
+
+ Display the various %S settings
+
+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_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_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 [Core|3rd|protocol|encryption|supported|qatested]
+
+ Lists all currently loaded modules.
+
+ Limited to Services Roots.
+
+
+###########################################################################
+#
+# BotServ help messages
+#
+###########################################################################
+
+
+BOT_HELP_CMD_BOTLIST
+ BOTLIST Mevcut botlarý listeler
+BOT_HELP_CMD_ASSIGN
+ ASSIGN Kanala bot sokar
+BOT_HELP_CMD_SET
+ SET Bot özelliklerini ayarlar
+BOT_HELP_CMD_KICK
+ KICK Atma özelliklerini ayarlar
+BOT_HELP_CMD_BADWORDS
+ BADWORDS Küfür listesi oluþturur
+BOT_HELP_CMD_ACT
+ ACT Makes the bot do the equivalent of a "/me" command
+BOT_HELP_CMD_INFO
+ INFO Allows you to see BotServ information about a channel or a bot
+BOT_HELP_CMD_SAY
+ SAY Makes the bot say the given text on the given channel
+BOT_HELP_CMD_UNASSIGN
+ UNASSIGN Unassigns a bot from a channel
+BOT_HELP_CMD_BOT
+ BOT Networkün bot listesini düzenler
+
+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
+ %R%S command yazýn. Belirli bir komut hakkýnda
+ daha fazla bilgi için, %R%S HELP komut
+ yazýn.
+
+BOT_HELP_FOOTER
+ 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
+ %R%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
+ %R%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 %R%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
+ %R%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_BOT
+ Kullanýmý: BOT ADD nick user host gerçekismi
+ BOT CHANGE eskinick yeninick [user [host [gerçekismi]]]
+ BOT DEL nick
+
+ 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.
+
+ 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 %R%s set <nick> <hostmask>.
+HOST_SETALL_SYNTAX
+ Syntax %R%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: %R%s del <nick>.
+
+###########################################################################
+#
+# HostServ Help messages
+#
+###########################################################################
+HOST_OFF_UNREAL
+ Your vhost was removed. To re-enable the standard host cloaking, type /mode %s +%s
+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_CMD_ON
+ ON Activates your assigned vhost
+HOST_HELP_CMD_OFF
+ OFF Deactivates your assigned vhost
+HOST_HELP_CMD_GROUP
+ GROUP Syncs the vhost for all nicks in a group
+HOST_HELP_CMD_SET
+ SET Set the vhost of another user
+HOST_HELP_CMD_SETALL
+ SETALL Set the vhost for all nicks in a group
+HOST_HELP_CMD_DEL
+ DEL Delete the vhost of another user
+HOST_HELP_CMD_DELALL
+ DELALL Delete the vhost for all nicks in a group
+HOST_HELP_CMD_LIST
+ LIST Displays one or more vhost entries.
+HOST_OPER_HELP
+ n/a
+HOST_ADMIN_HELP
+ n/a
+
+HOST_HELP
+ %S commands:
+
+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.
+
+OPER_SVSNICK_UNSUPPORTED
+ Sorry, SVSNICK is not available on this network.
+
+OPER_SQLINE_UNSUPPORTED
+ Sorry, SQLINE is not available on this network.
+
+OPER_SVSO_UNSUPPORTED
+ Sorry, OLINE is not available on this network.
+
+OPER_UMODE_UNSUPPORTED
+ Sorry, UMODE is not available on this network.
+
+OPER_SUPER_ADMIN_NOT_ENABLED
+ SuperAdmin setting not enabled in services.conf
+
diff --git a/makefile.inc.win32 b/makefile.inc.win32
new file mode 100644
index 000000000..62448d015
--- /dev/null
+++ b/makefile.inc.win32
@@ -0,0 +1,99 @@
+#
+# Anope IRC Services 1.7.9 for Windows
+#
+# Contact us at info@anope.org
+#
+# Please read COPYING and README for further details.
+#
+# Based on the original code of Epona by Lara.
+# Based on the original code of Services by Andy Church.
+#
+
+# Please read and edit the configurations options below.
+
+
+# Set this to 1 to enable MySQL support
+USE_MYSQL=0
+# Set this to the path where the MySQL includes can be found
+#MYSQL_INC="c:\\mysql\\include\\"
+# Set this to the path where the MySQL libraries can be found
+#MYSQL_LIB="c:\\mysql\\lib\\opt\\"
+
+# Set this to 1 to enable database encryption
+DB_ENCRYPTION=0
+
+# If you want to change the names/locations of files/folders, you
+# can do that here.
+PROGRAM=anope.exe
+DATDEST=data
+
+# If you are compiling using VC6, or get __ftol2 errors, please uncomment
+# the following line:
+#VC6=/QIfist
+
+# If you are getting errors such as 'Cannot find wsock32.lib', then change
+# the following line to the path where the library files can be found.
+#
+# Eg: LIBPATH=C:\\Program Files\\Microsoft Visual Studio .NET 2003\\Vc7\\lib
+#
+LIBPATH=
+
+# If you edited the line above, uncomment the next line.
+#LFLAGS=/LIBPATH:"$(LIBPATH)"
+
+
+###############################################################
+#Don't touch anything below unless you know what you are doing#
+###############################################################
+
+
+CC=cl
+RC=rc
+MAKE=nmake -f Makefile.win32
+BASE_CFLAGS=/O2 /MD
+LIBS=wsock32.lib advapi32.lib /NODEFAULTLIB:libcmtd.lib
+ELIBS=
+MLIBS=
+
+!IF $(USE_MYSQL) == 1
+!IF $(MYSQL_LIB) != ""
+LIBS=$(LIBS) /LIBPATH:$(MYSQL_LIB)
+MYSQL_LIB_PATH=/LIBPATH:$(MYSQL_LIB)
+!ENDIF
+!IF $(MYSQL_INC) != ""
+BASE_CFLAGS=$(BASE_CFLAGS) /I $(MYSQL_INC)
+MYSQL_INC_PATH=/I $(MYSQL_INC)
+!ENDIF
+RDB_C=rdb.c
+RDB_O=rdb.obj
+
+MYSQL_C=mysql.c
+MYSQL_O=mysql.obj
+BASE_CFLAGS=/D USE_MYSQL /D USE_RDB $(BASE_CFLAGS) /D HAVE_MYSQL_MYSQL_H
+
+MYPASQL_BUILD=$(CC) /LD $(MYSQL_INC_PATH) src\mypasql.c /link $(MYSQL_LIB_PATH) $(LFLAGS) \
+/DEF:src\mypasql.def libmysql.lib zlib.lib ws2_32.lib advapi32.lib /NODEFAULTLIB:LIBCMTD.lib
+
+LIBS=$(LIBS) libmysql.lib zlib.lib
+!ENDIF
+
+!IF $(DB_ENCRYPTION) == 1
+BASE_CFLAGS=/D USE_ENCRYPTION /D ENCRYPT_MD5 $(BASE_CFLAGS)
+!ENDIF
+
+# 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 = /I"../include"
+CFLAGS = /nologo $(VC6) $(CDEFS) $(BASE_CFLAGS) $(MORE_CFLAGS)
diff --git a/src/Makefile b/src/Makefile
new file mode 100644
index 000000000..739c91814
--- /dev/null
+++ b/src/Makefile
@@ -0,0 +1,138 @@
+MYSQL_OBJ = $(MYSQL:.c=.o)
+RDB_OBJ = $(RDB:.c=.o)
+OBJS = actions.o base64.o botserv.o channels.o chanserv.o commands.o compat.o \
+ config.o datafiles.o encrypt.o events.o helpserv.o hostserv.o init.o ircd.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 send.o servers.o sessions.o slist.o sockutil.o timeout.o users.o \
+ $(RDB_OBJ) $(MYSQL_OBJ)
+SRCS = actions.c base64.c botserv.c channels.c chanserv.c commands.c compat.c \
+ config.c datafiles.c encrypt.c events.c helpserv.c hostserv.c init.c ircd.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 send.c servers.c sessions.c slist.c sockutil.c timeout.c users.c \
+ $(RDB) $(MYSQL)
+
+INCLUDES = ../include/commands.h ../include/defs.h ../include/language.h \
+ ../include/pseudo.h ../include/sysconf.h ../include/config.h \
+ ../include/encrypt.h ../include/messages.h ../include/services.h \
+ ../include/timeout.h ../include/datafiles.h ../include/extern.h \
+ ../include/modules.h ../include/slist.h
+
+MAKEARGS = 'CFLAGS=${CFLAGS}' 'CC=${CC}' 'ANOPELIBS=${ANOPELIBS}' \
+ 'LDFLAGS=${LDFLAGS}' 'BINDEST=${BINDEST}' 'INSTALL=${INSTALL}' \
+ 'INCLUDEDIR=${INCLUDEDIR}' 'RM=${RM}' 'CP=${CP}' \
+ 'TOUCH=${TOUCH}' 'SHELL=${SHELL}' 'DATDEST=${DATDEST}' \
+ 'RUNGROUP=${RUNGROUP}' 'MODULE_PATH=${MODULE_PATH}' 'MYSQL=${MYSQL}'\
+ 'RDB=${RDB}' 'SHARED=${SHARED}' 'MODULEFLAGS=${MODULEFLAGS}'
+
+.c.o:
+ $(CC) $(CFLAGS) -I../include/ -c $<
+
+all: services
+
+distclean: spotless
+distclean_modules: clean_modules spotless
+
+services: $(OBJS) mod_version
+ $(CC) $(CFLAGS) $(OBJS) $(ANOPELIBS) $(MLIBS) -o $@ $(LDFLAGS)
+
+$(OBJS): Makefile
+actions.o: actions.c $(INCLUDES)
+base64.o: base64.c $(INCLUDES)
+botserv.o: botserv.c $(INCLUDES)
+channels.o: channels.c $(INCLUDES)
+chanserv.o: chanserv.c $(INCLUDES)
+commands.o: commands.c $(INCLUDES)
+compat.o: compat.c $(INCLUDES)
+config.o: config.c $(INCLUDES)
+datafiles.o: datafiles.c $(INCLUDES)
+encrypt.o: encrypt.c $(INCLUDES)
+events.o: events.c $(INCLUDES)
+init.o: init.c $(INCLUDES)
+ircd.o: ircd.c $(INCLUDES)
+helpserv.o: helpserv.c $(INCLUDES)
+hostserv.o: hostserv.c $(INCLUDES)
+language.o: language.c $(INCLUDES)
+list.o: list.c $(INCLUDES)
+log.o: log.c $(INCLUDES)
+mail.o: mail.c $(INCLUDES)
+main.o: main.c $(INCLUDES)
+memory.o: memory.c $(INCLUDES)
+memoserv.o: memoserv.c $(INCLUDES)
+messages.o: messages.c $(INCLUDES)
+modules.o: modules.c $(INCLUDES)
+misc.o: misc.c $(INCLUDES)
+news.o: news.c $(INCLUDES)
+nickserv.o: nickserv.c $(INCLUDES)
+operserv.o: operserv.c $(INCLUDES)
+process.o: process.c $(INCLUDES)
+send.o: send.c $(INCLUDES)
+servers.o: servers.c $(INCLUDES)
+sessions.o: sessions.c $(INCLUDES)
+slist.o: slist.c $(INCLUDES)
+sockutil.o: sockutil.c $(INCLUDES)
+timeout.o: timeout.c $(INCLUDES)
+users.o: users.c $(INCLUDES)
+vsnprintf.o: vsnprintf.c $(INCLUDES)
+mysql.o: mysql.c $(INCLUDES)
+rdb.o: rdb.c $(INCLUDES)
+
+mod_version: mod_version.c $(INCLUDES)
+ $(CC) $(CDEFS) $(CFLAGS) $(MODULEFLAGS) -I../include/ -c mod_version.c
+
+
+modules: DUMMY
+ (cd modules ; ./configure ; ${MAKE} ${MAKEARGS} all)
+
+protocols: DUMMY
+ (cd protocol ; ./configure ; ${MAKE} ${MAKEARGS} all)
+core: DUMMY
+ (cd core ; ./configure ; ${MAKE} ${MAKEARGS} all)
+
+clean: clean_modules clean_protocols clean_core
+ rm -f *.o services a.out
+clean_modules:
+ @touch modules/Makefile.inc # Horribly ugly...
+ (cd modules ; ${MAKE} clean)
+
+clean_protocols:
+ @touch protocol/Makefile.inc
+ (cd protocol ; ${MAKE} clean)
+
+clean_core:
+ @touch core/Makefile.inc
+ (cd core ; ${MAKE} clean)
+
+spotless:
+ (cd modules ; ${MAKE} distclean)
+ (cd protocol ; ${MAKE} distclean)
+ (cd core ; ${MAKE} distclean)
+
+install: services
+ test -d ${BINDEST} || mkdir ${BINDEST}
+ $(INSTALL) services $(BINDEST)/services
+ $(INSTALL) bin/anoperc $(BINDEST)/anoperc
+ rm -f $(BINDEST)/listnicks $(BINDEST)/listchans
+ ln $(BINDEST)/services $(BINDEST)/listnicks
+ ln $(BINDEST)/services $(BINDEST)/listchans
+ (cd ../lang ; $(MAKE) install)
+ $(CP) ../data/* $(DATDEST)
+ $(INSTALL) bin/mydbgen $(DATDEST)/mydbgen
+ test -d $(DATDEST)/backups || mkdir $(DATDEST)/backups
+ test -d $(DATDEST)/logs || mkdir $(DATDEST)/logs
+ @if [ "$(MODULE_PATH)" ] ; then \
+ test -d ${MODULE_PATH} || mkdir ${MODULE_PATH} ; \
+ test -d ${MODULE_PATH}/runtime || mkdir ${MODULE_PATH}/runtime ; \
+ (cd modules ; $(MAKE) install) ; \
+ (cd protocol ; ${MAKE} install) ; \
+ (cd core ; ${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
+
+DUMMY:
diff --git a/src/actions.c b/src/actions.c
new file mode 100644
index 000000000..46617643b
--- /dev/null
+++ b/src/actions.c
@@ -0,0 +1,270 @@
+/* Various routines to perform simple actions.
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+
+#include "services.h"
+
+/*************************************************************************/
+
+/**
+ * Note a bad password attempt for the given user. If they've used up
+ * their limit, toss them off.
+ * @param u the User to check
+ * @return void
+ */
+void bad_password(User * u)
+{
+ time_t now = time(NULL);
+
+ if (!u || !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) {
+ kill_user(NULL, u->nick, "Too many invalid passwords");
+ }
+}
+
+/*************************************************************************/
+
+/**
+ * Remove a user from the IRC network.
+ * @param source is the nick which should generate the kill, or NULL for a server-generated kill.
+ * @param user to remove
+ * @param reason for the kill
+ * @return void
+ */
+void kill_user(char *source, char *user, char *reason)
+{
+ char buf[BUFSIZE];
+
+ if (!user || !*user) {
+ return;
+ }
+ if (!source || !*source) {
+ source = ServerName;
+ }
+ if (!reason) {
+ reason = "";
+ }
+
+ snprintf(buf, sizeof(buf), "%s (%s)", source, reason);
+
+ anope_cmd_svskill(source, user, buf);
+
+ if (!ircd->quitonkill && finduser(user)) {
+ do_kill(user, buf);
+ }
+}
+
+/*************************************************************************/
+
+/**
+ * Check and enforce SQlines
+ * @param mask of the sqline
+ * @param reason for the sqline
+ * @return void
+ */
+void sqline(char *mask, char *reason)
+{
+ int i;
+ Channel *c, *next;
+ char *av[3];
+ struct c_userlist *cu, *cunext;
+
+ if (ircd->chansqline) {
+ if (*mask == '#') {
+ anope_cmd_sqline(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;
+ anope_cmd_kick(s_OperServ, av[0], av[1],
+ "Q-Lined: %s", av[2]);
+ do_kick(s_ChanServ, 3, av);
+ }
+ }
+ }
+ } else {
+ anope_cmd_sqline(mask, reason);
+ }
+ } else {
+ anope_cmd_sqline(mask, reason);
+ }
+}
+
+/*************************************************************************/
+
+/**
+ * Unban the nick from a channel
+ * @param ci channel info for the channel
+ * @param nick to remove the ban for
+ * @return void
+ */
+void common_unban(ChannelInfo * ci, char *nick)
+{
+ char *av[4];
+ char *host = NULL;
+ char buf[BUFSIZE];
+ int ac;
+ uint32 ip = 0;
+ User *u;
+ Entry *ban, *next;
+
+ if (!ci || !ci->c || !nick) {
+ return;
+ }
+
+ if (!(u = finduser(nick))) {
+ return;
+ }
+
+ if (!ci->c->bans || (ci->c->bans->count == 0))
+ return;
+
+ if (u->hostip == NULL) {
+ host = host_resolve(u->host);
+ /* we store the just resolved hostname so we don't
+ * need to do this again */
+ if (host) {
+ u->hostip = sstrdup(host);
+ }
+ } else {
+ host = sstrdup(u->hostip);
+ }
+ /* Convert the host to an IP.. */
+ if (host)
+ ip = str_is_ip(host);
+
+ if (ircd->svsmode_unban) {
+ anope_cmd_unban(ci->name, nick);
+ } else {
+ if (ircdcap->tsmode) {
+ snprintf(buf, BUFSIZE - 1, "%ld", (long int) time(NULL));
+ av[0] = ci->name;
+ av[1] = buf;
+ av[2] = sstrdup("-b");
+ ac = 4;
+ } else {
+ av[0] = ci->name;
+ av[1] = sstrdup("-b");
+ ac = 3;
+ }
+
+ for (ban = ci->c->bans->entries; ban; ban = next) {
+ next = ban->next;
+ if (entry_match(ban, u->nick, u->username, u->host, ip) ||
+ entry_match(ban, u->nick, u->username, u->vhost, ip)) {
+ anope_cmd_mode(whosends(ci), ci->name, "-b %s", ban->mask);
+ if (ircdcap->tsmode)
+ av[3] = ban->mask;
+ else
+ av[2] = ban->mask;
+
+ do_cmode(whosends(ci), ac, av);
+ }
+ }
+
+ if (ircdcap->tsmode)
+ free(av[2]);
+ else
+ free(av[1]);
+ }
+ /* host_resolve() sstrdup us this info so we gotta free it */
+ if (host) {
+ free(host);
+ }
+}
+
+/*************************************************************************/
+
+/**
+ * Prepare to set SVSMODE and update internal user modes
+ * @param u user to apply modes to
+ * @param modes the modes to set on the user
+ * @param arg the arguments for the user modes
+ * @return void
+ */
+void common_svsmode(User * u, char *modes, char *arg)
+{
+ int ac = 1;
+ char *av[2];
+
+ av[0] = modes;
+ if (arg) {
+ av[1] = arg;
+ ac++;
+ }
+
+ anope_cmd_svsmode(u, ac, av);
+ anope_set_umode(u, ac, av);
+}
+
+/*************************************************************************/
+
+/**
+ * Get the vhost for the user, if set else return the host, on ircds without
+ * vhost this returns the host
+ * @param u user to get the vhost for
+ * @return vhost
+ */
+char *common_get_vhost(User * u)
+{
+ if (!u)
+ return NULL;
+
+ if (ircd->vhostmode && (u->mode & ircd->vhostmode))
+ return u->vhost;
+ else if (ircd->vhost && u->vhost)
+ return u->vhost;
+ else
+ return u->host;
+}
+
+/*************************************************************************/
+
+/**
+ * Get the vident for the user, if set else return the ident, on ircds without
+ * vident this returns the ident
+ * @param u user to get info the vident for
+ * @return vident
+ */
+char *common_get_vident(User * u)
+{
+ if (!u)
+ return NULL;
+
+ if (ircd->vhostmode && (u->mode & ircd->vhostmode))
+ return u->vident;
+ else if (ircd->vident && u->vident)
+ return u->vident;
+ else
+ return u->username;
+}
diff --git a/src/anope-icon.ico b/src/anope-icon.ico
new file mode 100644
index 000000000..be735614a
--- /dev/null
+++ b/src/anope-icon.ico
Binary files differ
diff --git a/src/base64.c b/src/base64.c
new file mode 100644
index 000000000..10b2f0254
--- /dev/null
+++ b/src/base64.c
@@ -0,0 +1,410 @@
+/* base64 routines.
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ *
+ */
+
+/*
+ This is borrowed from Unreal
+*/
+
+#include "services.h"
+
+static char *int_to_base64(long);
+static long base64_to_int(char *);
+
+char *base64enc(long i)
+{
+ if (i < 0)
+ return ("0");
+ return int_to_base64(i);
+}
+
+long base64dec(char *b64)
+{
+ if (b64)
+ return base64_to_int(b64);
+ else
+ return 0;
+}
+
+
+static const char Base64[] =
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+static const char Pad64 = '=';
+
+/* (From RFC1521 and draft-ietf-dnssec-secext-03.txt)
+ The following encoding technique is taken from RFC 1521 by Borenstein
+ and Freed. It is reproduced here in a slightly edited form for
+ convenience.
+
+ A 65-character subset of US-ASCII is used, enabling 6 bits to be
+ represented per printable character. (The extra 65th character, "=",
+ is used to signify a special processing function.)
+
+ The encoding process represents 24-bit groups of input bits as output
+ strings of 4 encoded characters. Proceeding from left to right, a
+ 24-bit input group is formed by concatenating 3 8-bit input groups.
+ These 24 bits are then treated as 4 concatenated 6-bit groups, each
+ of which is translated into a single digit in the base64 alphabet.
+
+ Each 6-bit group is used as an index into an array of 64 printable
+ characters. The character referenced by the index is placed in the
+ output string.
+
+ Table 1: The Base64 Alphabet
+
+ Value Encoding Value Encoding Value Encoding Value Encoding
+ 0 A 17 R 34 i 51 z
+ 1 B 18 S 35 j 52 0
+ 2 C 19 T 36 k 53 1
+ 3 D 20 U 37 l 54 2
+ 4 E 21 V 38 m 55 3
+ 5 F 22 W 39 n 56 4
+ 6 G 23 X 40 o 57 5
+ 7 H 24 Y 41 p 58 6
+ 8 I 25 Z 42 q 59 7
+ 9 J 26 a 43 r 60 8
+ 10 K 27 b 44 s 61 9
+ 11 L 28 c 45 t 62 +
+ 12 M 29 d 46 u 63 /
+ 13 N 30 e 47 v
+ 14 O 31 f 48 w (pad) =
+ 15 P 32 g 49 x
+ 16 Q 33 h 50 y
+
+ Special processing is performed if fewer than 24 bits are available
+ at the end of the data being encoded. A full encoding quantum is
+ always completed at the end of a quantity. When fewer than 24 input
+ bits are available in an input group, zero bits are added (on the
+ right) to form an integral number of 6-bit groups. Padding at the
+ end of the data is performed using the '=' character.
+
+ Since all base64 input is an integral number of octets, only the
+ -------------------------------------------------
+ following cases can arise:
+
+ (1) the final quantum of encoding input is an integral
+ multiple of 24 bits; here, the final unit of encoded
+ output will be an integral multiple of 4 characters
+ with no "=" padding,
+ (2) the final quantum of encoding input is exactly 8 bits;
+ here, the final unit of encoded output will be two
+ characters followed by two "=" padding characters, or
+ (3) the final quantum of encoding input is exactly 16 bits;
+ here, the final unit of encoded output will be three
+ characters followed by one "=" padding character.
+ */
+
+int b64_encode(char *src, size_t srclength, char *target, size_t targsize)
+{
+ size_t datalength = 0;
+ unsigned char input[3];
+ unsigned char output[4];
+ size_t i;
+
+ while (2 < srclength) {
+ input[0] = *src++;
+ input[1] = *src++;
+ input[2] = *src++;
+ srclength -= 3;
+
+ output[0] = input[0] >> 2;
+ output[1] = ((input[0] & 0x03) << 4) + (input[1] >> 4);
+ output[2] = ((input[1] & 0x0f) << 2) + (input[2] >> 6);
+ output[3] = input[2] & 0x3f;
+
+ if (datalength + 4 > targsize)
+ return (-1);
+ target[datalength++] = Base64[output[0]];
+ target[datalength++] = Base64[output[1]];
+ target[datalength++] = Base64[output[2]];
+ target[datalength++] = Base64[output[3]];
+ }
+
+ /* Now we worry about padding. */
+ if (0 != srclength) {
+ /* Get what's left. */
+ input[0] = input[1] = input[2] = '\0';
+ for (i = 0; i < srclength; i++)
+ input[i] = *src++;
+
+ output[0] = input[0] >> 2;
+ output[1] = ((input[0] & 0x03) << 4) + (input[1] >> 4);
+ output[2] = ((input[1] & 0x0f) << 2) + (input[2] >> 6);
+
+ if (datalength + 4 > targsize)
+ return (-1);
+ target[datalength++] = Base64[output[0]];
+ target[datalength++] = Base64[output[1]];
+ if (srclength == 1)
+ target[datalength++] = Pad64;
+ else
+ target[datalength++] = Base64[output[2]];
+ target[datalength++] = Pad64;
+ }
+ if (datalength >= targsize)
+ return (-1);
+ target[datalength] = '\0'; /* Returned value doesn't count \0. */
+ return (datalength);
+}
+
+/* skips all whitespace anywhere.
+ converts characters, four at a time, starting at (or after)
+ src from base - 64 numbers into three 8 bit bytes in the target area.
+ it returns the number of data bytes stored at the target, or -1 on error.
+ */
+
+int b64_decode(char *src, char *target, size_t targsize)
+{
+ int tarindex, state, ch;
+ char *pos;
+
+ state = 0;
+ tarindex = 0;
+
+ while ((ch = *src++) != '\0') {
+ if (isspace(ch)) /* Skip whitespace anywhere. */
+ continue;
+
+ if (ch == Pad64)
+ break;
+
+ pos = strchr(Base64, ch);
+ if (pos == 0) /* A non-base64 character. */
+ return (-1);
+
+ switch (state) {
+ case 0:
+ if (target) {
+ if ((size_t) tarindex >= targsize)
+ return (-1);
+ target[tarindex] = (pos - Base64) << 2;
+ }
+ state = 1;
+ break;
+ case 1:
+ if (target) {
+ if ((size_t) tarindex + 1 >= targsize)
+ return (-1);
+ target[tarindex] |= (pos - Base64) >> 4;
+ target[tarindex + 1] = ((pos - Base64) & 0x0f)
+ << 4;
+ }
+ tarindex++;
+ state = 2;
+ break;
+ case 2:
+ if (target) {
+ if ((size_t) tarindex + 1 >= targsize)
+ return (-1);
+ target[tarindex] |= (pos - Base64) >> 2;
+ target[tarindex + 1] = ((pos - Base64) & 0x03)
+ << 6;
+ }
+ tarindex++;
+ state = 3;
+ break;
+ case 3:
+ if (target) {
+ if ((size_t) tarindex >= targsize)
+ return (-1);
+ target[tarindex] |= (pos - Base64);
+ }
+ tarindex++;
+ state = 0;
+ break;
+ default:
+ abort();
+ }
+ }
+
+ /*
+ * We are done decoding Base-64 chars. Let's see if we ended
+ * on a byte boundary, and/or with erroneous trailing characters.
+ */
+
+ if (ch == Pad64) { /* We got a pad char. */
+ ch = *src++; /* Skip it, get next. */
+ switch (state) {
+ case 0: /* Invalid = in first position */
+ case 1: /* Invalid = in second position */
+ return (-1);
+
+ case 2: /* Valid, means one byte of info */
+ /* Skip any number of spaces. */
+ for ((void) NULL; ch != '\0'; ch = *src++)
+ if (!isspace(ch))
+ break;
+ /* Make sure there is another trailing = sign. */
+ if (ch != Pad64)
+ return (-1);
+ ch = *src++; /* Skip the = */
+ /* Fall through to "single trailing =" case. */
+ /* FALLTHROUGH */
+
+ case 3: /* Valid, means two bytes of info */
+ /*
+ * We know this char is an =. Is there anything but
+ * whitespace after it?
+ */
+ for ((void) NULL; ch != '\0'; ch = *src++)
+ if (!isspace(ch))
+ return (-1);
+
+ /*
+ * Now make sure for cases 2 and 3 that the "extra"
+ * bits that slopped past the last full byte were
+ * zeros. If we don't check them, they become a
+ * subliminal channel.
+ */
+ if (target && target[tarindex] != 0)
+ return (-1);
+ }
+ } else {
+ /*
+ * We ended by seeing the end of the string. Make sure we
+ * have no partial bytes lying around.
+ */
+ if (state != 0)
+ return (-1);
+ }
+
+ return (tarindex);
+}
+
+char *encode_ip(unsigned char *ip)
+{
+ static char buf[25];
+ unsigned char *cp;
+ struct in_addr ia; /* For IPv4 */
+ char *s_ip; /* Signed ip string */
+
+ if (!ip)
+ return "*";
+
+ if (strchr((char *) ip, ':')) {
+ return NULL;
+ } else {
+ s_ip = str_signed(ip);
+ ia.s_addr = inet_addr(s_ip);
+ cp = (unsigned char *) ia.s_addr;
+ b64_encode((char *) &cp, sizeof(struct in_addr), buf, 25);
+ }
+ return buf;
+}
+
+int decode_ip(char *buf)
+{
+ int len = strlen(buf);
+ char targ[25];
+ struct in_addr ia;
+
+ b64_decode(buf, targ, 25);
+ ia = *(struct in_addr *) targ;
+ if (len == 24) { /* IPv6 */
+ return 0;
+ } else if (len == 8) /* IPv4 */
+ return ia.s_addr;
+ else /* Error?? */
+ return 0;
+}
+
+/* ':' and '#' and '&' and '+' and '@' must never be in this table. */
+/* these tables must NEVER CHANGE! >) */
+char int6_to_base64_map[] = {
+ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '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',
+ '{', '}'
+};
+
+char base64_to_int6_map[] = {
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1,
+ -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
+ 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1,
+ -1, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
+ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, -1, 63, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+};
+
+static char *int_to_base64(long val)
+{
+ /* 32/6 == max 6 bytes for representation,
+ * +1 for the null, +1 for byte boundaries
+ */
+ static char base64buf[8];
+ long i = 7;
+
+ base64buf[i] = '\0';
+
+ /* Temporary debugging code.. remove before 2038 ;p.
+ * This might happen in case of 64bit longs (opteron/ia64),
+ * if the value is then too large it can easily lead to
+ * a buffer underflow and thus to a crash. -- Syzop
+ */
+ if (val > 2147483647L) {
+ abort();
+ }
+
+ do {
+ base64buf[--i] = int6_to_base64_map[val & 63];
+ }
+ while (val >>= 6);
+
+ return base64buf + i;
+}
+
+static long base64_to_int(char *b64)
+{
+ int v = base64_to_int6_map[(unsigned char) *b64++];
+
+ if (!b64)
+ return 0;
+
+ while (*b64) {
+ v <<= 6;
+ v += base64_to_int6_map[(unsigned char) *b64++];
+ }
+
+ return v;
+}
+
+long base64dects(char *ts)
+{
+ char *token;
+ long value;
+
+ if (!ts) {
+ return 0;
+ }
+ token = myStrGetToken(ts, '!', 1);
+
+ if (!token) {
+ return strtoul(ts, NULL, 10);
+ }
+ value = base64dec(token);
+ Anope_Free(token);
+ return value;
+}
diff --git a/src/bin/am b/src/bin/am
new file mode 100755
index 000000000..df9a71a14
--- /dev/null
+++ b/src/bin/am
@@ -0,0 +1,499 @@
+#!/usr/bin/env perl
+
+# ====================================================================
+# anomgr: Anope Manager. Used to manage anope revision on SubVersion.
+#
+# For usage, see the usage subroutine or run the script with no
+# command line arguments.
+#
+# $Id$
+#
+# ====================================================================
+require 5.6.0;
+use strict;
+use Getopt::Std;
+use Net::FTP;
+use Cwd;
+
+######################################################################
+# Configuration section.
+my $myver="1.0";
+my $svnrev="http://www.zero.org/anosvn.php";
+my $fhint="version.log";
+
+# Default values, change or use environment variables instead.
+my $copy="anope";
+my $svnuser="evil_closet_monkey";
+my $svnpath="/usr/bin";
+my $svnroot="svn://svn.anope.org/$copy";
+my $editor="/usr/bin/mcedit";
+
+# Environment variables SVNBINDIR and SVNROOT override the above
+# hardcoded values.
+$svnuser="$ENV{SVNUSER}" if ($ENV{SVNUSER});
+$svnpath="$ENV{SVNBINDIR}" if ($ENV{SVNBINDIR});
+$svnroot="$ENV{SVNROOT}" if ($ENV{SVNROOT});
+$editor="$ENV{EDITOR}" if ($ENV{EDITOR});
+
+# Svnlook path.
+my $svnlook = "$svnpath/svnlook";
+
+# Svn path.
+my $svn = "$svnpath/svn";
+
+# wget path. Need to change to a perl module instead...
+my $wget = "$svnpath/wget";
+
+my (
+ $rev,
+ $branch,
+ $proto,
+ $tag,
+ $ftp,
+ $dst,
+ $ver_major,
+ $ver_minor,
+ $ver_patch,
+ $ver_build,
+ $ver_revision,
+ $ver_comment,
+ $svn_comment,
+ $cver,
+ $nver,
+ $ctrlfile,
+ $tmpfile,
+ @source,
+ %opt
+);
+
+{
+ my $ok = 1;
+ foreach my $program ($svnlook, $svn, $editor)
+ {
+ if (-e $program)
+ {
+ unless (-x $program)
+ {
+ warn "$0: required program `$program' is not executable, ",
+ "edit $0.\n";
+ $ok = 0;
+ }
+ }
+ else
+ {
+ warn "$0: required program `$program' does not exist, edit $0.\n";
+ $ok = 0;
+ }
+ }
+ exit 1 unless $ok;
+}
+
+sub usage()
+{
+ # More features to add:
+ # --diff N:M to produce a diff between revisions
+ # --bugs CLI method to add bug number to the commit message
+ # --mesg CLI methos to add the commit message
+ # --create-branch to create a branch
+ # --create-tag to create a tag
+ # --switch to switch between branches/tags
+ print "Usage: $0 <-g | -p | -f | -l> [-r revision | -b branch | -t tag | -P proto] <destination>\n";
+ print " Operations:\n";
+ print " -g Get Operation\n";
+ print " -p Put Operation\n";
+ print " -f[tar|diff] FTP Operation, retrieve latest tar or diff\n";
+ print " -l List Operation, for valid selector options\n";
+ print " Selector:\n";
+ print " -r revision Retrieve by revision number\n";
+ print " -b branch Retrieve by branch name\n";
+ print " -t tag Retrieve by tag name\n";
+ print " -P proto Retrieve by prototype name\n";
+ print " Destination:\n";
+ print " The working copy to perform the operation in or to. The script will \n";
+ print " try to guess where that is, unless you provide a specific path.\n";
+ exit;
+}
+
+sub banner() {
+
+ print "Anope Source Managemnt Utility - Version $myver\n\n";
+
+}
+
+sub getans {
+ my $ans;
+ while (! (($ans =~ /y/) || ($ans =~ /n/))) {
+ print "*** Ready to continue? (y/n): ";
+ $ans = <STDIN>;
+ chomp($ans);
+ $ans = lc($ans);
+ # $ans = &getans();
+ }
+
+ # return $ans;
+ return ($ans eq "y") ? 1 : 0
+}
+
+sub find_conflict() {
+
+ my $filename=shift;
+ my $retval=0;
+ open (IN2, "$filename") || die "Can't open $filename\n";
+ while (<IN2>) {
+ if (/^<<<<<<</) {
+ $retval=1;
+ }
+ }
+ close(IN2);
+
+ return $retval;
+}
+
+sub do_lst() {
+ my $out;
+ print "*** BRANCHES:\n";
+ print "trunk (DEFAULT)\n";
+ open (IN, "$svn list $svnroot/branches|");
+ while (<IN>) {
+ if (! /proto/) {
+ $out="$_";
+ $out =~ s/\/$//;
+ print "$out";
+ }
+ }
+ close(IN);
+
+ print "\n*** PROTOTYPES:\n";
+ open (IN, "$svn list $svnroot/branches/proto|");
+ while (<IN>) {
+ $out="$_";
+ $out =~ s/\/$//;
+ chomp($out);
+ if (/bahamut18/) {
+ $out .= "\t(OBSOLETE)";
+ } elsif (/capab/) {
+ $out .= "\t(OBSOLETE)";
+ }
+ print "$out\n";
+ }
+ close(IN);
+
+ print "\n*** TAGS:\n";
+ open (IN, "$svn list $svnroot/tags|");
+ while (<IN>) {
+ $out="$_";
+ $out =~ s/\/$//;
+ print "$out";
+ }
+ close(IN);
+ print "\n";
+
+}
+
+sub do_ftp() {
+
+ my $ftpc;
+ $ftpc = Net::FTP->new("ftp.zero.org");
+ $ftpc->login("ftp","-anonymou@");
+ $ftpc->cwd("/incoming");
+
+ if ( lc($ftp) eq "tar" ) {
+ print "Retrieving latest tar ball...\n";
+ $ftpc->get("anope.tgz");
+ } elsif ( lc($ftp) eq "diff" ) {
+ print "Retrieving latest patch file...\n";
+ $ftpc->get("anope.diff");
+ } else {
+ print "Unknown type $ftp, aborting...\n";
+ }
+ $ftpc->quit();
+}
+
+sub do_get() {
+
+ my $options = "" ; # Options to be passed to the svn command
+ my $selector = "" ; # Selector to be passed to the svn command
+
+ if ($rev) {
+ $options .= "-r $rev";
+ $selector = "trunk";
+ $copy = $copy . "-$rev";
+ } elsif ($tag) {
+ $selector = "tags/$tag";
+ $copy = "$tag";
+ } elsif ($branch) {
+ $selector = "branches/$branch";
+ $copy = $copy . "-$branch";
+ } elsif ($proto) {
+ $selector = "branches/proto/$proto";
+ $copy = "$proto";
+ } else {
+ $selector = "trunk";
+ }
+
+ if ($dst eq undef) {
+ my $cwd = &Cwd::cwd();
+ if (-f "$cwd/$fhint") {
+ system("$svn update $options $cwd");
+ } elsif (-f "$cwd/$copy/$fhint") {
+ system("$svn update $options $cwd/$copy");
+ } else {
+ system("$svn checkout $svnroot/$selector $options $cwd/$copy");
+ }
+ } else {
+ $dst = &Cwd::cwd() if ($dst eq "\.") ;
+ if (-f "$dst/$fhint") {
+ system("$svn update $options $dst");
+ } else {
+ system("$svn checkout $svnroot/$selector $options $dst");
+ }
+ }
+}
+
+sub do_put() {
+
+ if ($dst eq undef) {
+ my $cwd = &Cwd::cwd();
+ if (-f "$cwd/$fhint") {
+ $dst = "$cwd";
+ } elsif (-f "$cwd/$copy/$fhint") {
+ $dst .= "$cwd/$copy";
+ } else {
+ print "Error: Unable to determine your working copy location.\n";
+ exit;
+ }
+ } else {
+ $dst = &Cwd::cwd() if ($dst eq "\.") ;
+ if (! -f "$dst/$fhint") {
+ print "Error: Unable to determine your working copy location.\n";
+ exit;
+ }
+ }
+
+ # Check to see if we need to update our working copy first.
+ my $nupdate;
+ open (IN, "$svn status --show-updates --verbose $dst|");
+ while (<IN>) {
+ if (/\*/) {
+ $nupdate .= "$_";
+ }
+ }
+ close(IN);
+
+ if ($nupdate ne undef) {
+ print "*** Warning: There are files modified in the repository that need\n";
+ print "*** to be merged back to your working copy before the commit can\n";
+ print "*** take place. These files are:\n";
+ print $nupdate;
+ print "Please use: $0 -g $dst\n";
+ exit;
+ }
+
+ # Get a prelim diff of the changes...
+ my $dcount=0;
+ my $conflict;
+ # open (IN, "$svn diff $dst|");
+ open (IN, "$svn status $dst|");
+ while (<IN>) {
+ if (!/^\?/) {
+ $dcount++;
+ }
+
+ if (/^C/) {
+ $_ =~ s/^C\s+//;
+ chomp($_);
+ # I don't want to use grep. But my find_conflict sub
+ # does not seem to work :( Too bad
+ if (`grep "^<<<<<<<" $_`) {
+ $conflict .= "$_\n" ;
+ } else {
+ system("$svn resolved $_");
+ }
+ }
+ }
+ close(IN);
+
+ if ($dcount == 0) {
+ print "*** Warning: There are no modified files to be commited. Are you\n";
+ print "*** sure you are in the right working copy? Verify changes with:\n";
+ print "*** $svn diff $dst\n";
+ exit;
+ }
+
+ if ($conflict ne undef) {
+ print "*** Warning: There are merge conflicts to be resolved! Please take\n";
+ print "*** a look at the following files and resolve them manually:\n\n";
+ print "$conflict\n";
+ exit;
+ }
+
+ $ctrlfile = "$dst/$fhint";
+ # Grab the current revision number. Clunky way, I know!
+# $ver_revision=`$wget -qO - $svnrev`;
+ $ver_revision=`svnversion . | sed "s/.*:\\\(.*\\\)/\\1/" | cut -d 'M' -f 1 | cut -d 'S' -f 1`;
+ chomp($ver_revision);
+
+ unless ($ver_revision =~ /^\d+/ and $ver_revision > 0)
+ {
+ print "*** Error: Got bogus result $ver_revision from $svnrev.\n";
+ exit;
+ }
+
+ $ver_revision++;
+ open (REV, "$ctrlfile") || die "Can't open $ctrlfile\n";
+ while (<REV>) {
+ push (@source, $_);
+ $ver_major = $_ if (/VERSION_MAJOR/);
+ $ver_minor = $_ if (/VERSION_MINOR/);
+ $ver_patch = $_ if (/VERSION_PATCH/);
+ $ver_build = $_ if (/VERSION_BUILD/);
+ }
+ close(REV);
+
+ my $junk;
+ ($junk, $ver_major) = split('"', $ver_major);
+ ($junk, $ver_minor) = split('"', $ver_minor);
+ ($junk, $ver_patch) = split('"', $ver_patch);
+ ($junk, $ver_build) = split('"', $ver_build);
+
+ $cver = "$ver_major.$ver_minor.$ver_patch ($ver_build)";
+ $nver = "$ver_major.$ver_minor.$ver_patch ($ver_revision)";
+
+ # Greet the developer
+ banner();
+
+
+ # Check to see if we need to update our working copy first.
+ my $svnrepo;
+ open (IN, "$svn info|");
+ while (<IN>) {
+ if (/URL/) {
+ $svnrepo = "$_";
+ $svnrepo =~ s/URL: //;
+ }
+ }
+ close(IN);
+
+ print "*** Repository : $svnroot \n";
+ print "*** Working copy : $dst \n" ;
+ print "*** Current ver. : $cver \n";
+ print "*** Updated ver. : $nver \n";
+ print "*** Files Changed: $dcount (before indent and version change)\n";
+ die ("Aborting...\n") unless &getans();
+
+ # Need to add a clause for -c "comment" and -b "buglist"
+
+ # Get developers input for commit
+ $tmpfile=".commit";
+ open (OUT, ">$tmpfile") or die ("*** Error! Unable to open $tmpfile file\n");
+ print OUT "# Anope commit utility. Please use this template for your commits.
+# Add Bugzilla bugs separated by spaces. The note part is free form.
+BUILD : $nver
+BUGS :
+NOTES : ";
+ close(OUT);
+
+ system("$editor $tmpfile");
+
+ my $tmp_comment="";
+ $ver_comment="#\n";
+ $svn_comment="";
+ open (IN, "$tmpfile") or die ("*** Error! Unable to open $tmpfile file\n");
+ while (<IN>) {
+ if ( !/^#/) {
+ $tmp_comment.="$_";
+ chomp($_);
+ $_ =~ s/\t/ /g;
+ $ver_comment.="# $_\n";
+ $svn_comment.="$_ ";
+ }
+ }
+ close(IN);
+
+ $svn_comment =~ s/\s\s+/ /g;
+ # Confirm the commit one last time...
+ print "*** Ready to commit, please verify:\n";
+ print "\n$tmp_comment\n";
+
+ die ("Aborting...\n") unless &getans();
+
+ print "*** Running Indent...\n";
+ my $prefix=".";
+ if (-d "src") {
+ $prefix="src";
+ }
+ system("indent -kr -nut $prefix/*.c");
+ system("rm -f $prefix/*~");
+# if (-d "src/core") {
+# system("indent -kr -nut src/core/*.c");
+# system("rm -f src/core/*~");
+# }
+# if (-d "src/protocol") {
+# system("indent -kr -nut src/protocol/*.c");
+# system("rm -f src/protocol/*~");
+# }
+
+ print "*** Bumping the revision number...\n";
+ # Re-write the control file
+ open(OUT, ">$ctrlfile") or die ("*** Error! Unable to open $ctrlfile ... aborting");
+ foreach (@source) {
+ if (/^VERSION_BUILD/) {
+ $_ =~ s/\"\d+\"/\"$ver_revision\"/;
+ } elsif (/# \$Log\$/) {
+ $_ .= "$ver_comment";
+ }
+ print OUT $_;
+ }
+ close(OUT);
+
+ print "*** Starting the upload...\n\n";
+ my $rval=system("$svn commit $dst --username='$svnuser' --message '$svn_comment'");
+ if ( $rval ) {
+ print "*** Error: Unable to complete commit. Rolling back....\n\n";
+ system("$svn revert $ctrlfile");
+ }
+
+}
+
+{
+ usage() if (! @ARGV);
+
+ my $opt = 'hgplf:r:b:t:P:';
+ getopts ("$opt", \%opt) or usage();
+ usage() if $opt{h};
+
+ usage() if ($opt{g} && $opt{p});
+ usage() if ($opt{g} && $opt{f});
+ usage() if ($opt{g} && $opt{l});
+ usage() if ($opt{p} && $opt{f});
+ usage() if ($opt{p} && $opt{l});
+ usage() if ($opt{f} && $opt{l});
+ usage() if ($opt{r} && $opt{b});
+ usage() if ($opt{r} && $opt{t});
+ usage() if ($opt{b} && $opt{t});
+ usage() if ($opt{b} && $opt{P});
+
+ $rev = $opt{r} ;
+ $branch = $opt{b} ;
+ $tag = $opt{t} ;
+ $ftp = $opt{f} ;
+ $proto = $opt{P} ;
+ $dst = shift;
+
+ if ($rev ne undef) {
+ unless ($rev =~ /^\d+/ and $rev > 0)
+ {
+ print "*** Error: Revision number '$rev' must be an integer > 0.\n";
+ exit;
+ }
+ }
+
+ do_lst() if $opt{l};
+ do_ftp() if $opt{f};
+ do_get() if $opt{g};
+ do_put() if $opt{p};
+ print "*** Done!\n";
+
+}
+
+
diff --git a/src/bin/anoperc.in b/src/bin/anoperc.in
new file mode 100644
index 000000000..4f4961c9c
--- /dev/null
+++ b/src/bin/anoperc.in
@@ -0,0 +1,141 @@
+#!/bin/sh
+#
+# Configuration script for Services
+#
+# (C) 2003-2008 Anope Team
+# Contact us at info@anope.org
+#
+# Please read COPYING and README for further details.
+#
+# Based on the original code of Epona by Lara.
+# Based on the original code of Services by Andy Church.
+#
+# $Id$
+#
+
+
+
+ANOPEPID="@DATDEST@/services.pid"
+ANOPROG="@BINDEST@/services"
+LOG="@DATDEST@/logs/"
+ARCVERSION="1.2"
+
+isAnopeRunning () {
+if [ ! -f $ANOPEPID ] ; then
+ echo "Warning: Anope is not currently running"
+ exit 1
+fi
+
+PID=`cat $ANOPEPID`
+
+if [ ! `ps auxw | grep $ANOPROG | grep $PID | grep -v -c grep` ] ; then
+ echo "Warning: Anope is not currently running"
+ exit 1
+fi
+}
+
+if [ ! -f $ANOPROG ] ; then
+ echo "Error: $ANOPROG cannot be accessed"
+ exit 1
+fi
+
+
+if [ "$UID" = "0" ] ; then
+ echo "######################################";
+ echo "# Warning: Do NOT run Anope as root! #";
+ echo "######################################";
+ exit 1
+fi
+
+if [ "$1" = "start" ] ; then
+
+if [ -f $ANOPEPID ] ; then
+ PID=`cat $ANOPEPID`
+ if [ `ps auxw | grep $ANOPROG | grep $PID | grep -v -c grep` = 1 ] ; then
+ echo "Warning! Anope is already running"
+ exit 1
+ fi
+fi
+ echo "Starting Anope"
+ shift
+ $ANOPROG $*
+ sleep 1
+ if [ ! -f $ANOPEPID ] ; then
+ echo "Unfortunately it seems Anope did not start successfully"
+ echo "This error has been logged in your Anope Log file"
+ echo "Located in "$LOG""
+ echo "This may help you diagnose the problem"
+ echo "Further help may be available from http://www.anope.org/"
+ exit 1
+ fi
+ PID=`cat $ANOPEPID`
+ if [ ! `ps auxw | grep $ANOPROG | grep $PID | grep -v -c grep` ] ; then
+ echo "Unfortunately it seems Anope did not start successfully"
+ echo "This error has been logged in your Anope Log file"
+ echo "Located in "$LOG""
+ echo "This may help you diagnose the problem"
+ echo "Further help may be available from http://www.anope.org/"
+ exit 1
+ fi
+
+elif [ "$1" = "stop" ] ; then
+ isAnopeRunning
+ echo "Terminating Anope"
+ kill -15 `cat $ANOPEPID`
+
+elif [ "$1" = "status" ] ; then
+ if [ -f $ANOPEPID ] ; then
+ PID=`cat $ANOPEPID`
+ if [ `ps auxw | grep $PID | grep -v -c grep` = 1 ] ; then
+ echo "Anope is currently running"
+ exit 1
+ fi
+ fi
+
+ echo "Anope is not currently running"
+
+## :/ SIGUSR2 is ignored after the first restart so we stop / start Anope for now ##
+elif [ "$1" = "restart" ] ; then
+ isAnopeRunning
+ echo "Restarting Anope"
+ kill -15 `cat $ANOPEPID`
+ sleep 1
+ shift
+ $ANOPROG $*
+
+elif [ "$1" = "rehash" ] ; then
+ isAnopeRunning
+ echo "Saving Databases and Rehashing Configuration"
+ kill -12 `cat $ANOPEPID`
+
+elif [ "$1" = "version" ] ; then
+ $ANOPROG -version
+
+elif [ "$1" = "help" ] ; then
+ if [ "$2" = "paramlist" ] ; then
+ $ANOPROG -help
+ else
+ echo "AnopeRC is a remote control script for easy"
+ echo "controlling of Anope from the command console"
+ echo "$0 start Start Anope"
+ echo " Additional parameters may be passed"
+ echo " (e.g. $0 start -nofork)"
+ echo " For a list type $0 $1 paramlist"
+ echo "$0 stop Shutdown Anope"
+ echo "$0 status Show Anope's Status"
+ echo "$0 restart Restart Anope (Databases will be saved)"
+ echo " Additional parameters may be passed"
+ echo " (e.g. $0 restart -logchan)"
+ echo " For a list type $0 $1 paramlist"
+ echo "$0 rehash Rehash Configuration and Save Databases"
+ echo "$0 version Return Anope Version and Build Information"
+ echo "$0 help Show this help menu"
+ echo "If you need further help please check the /docs/"
+ echo "folder or make use of our extensive online support at"
+ echo "http://www.anope.org/"
+ fi
+
+else
+ echo "Anope Remote Control ($ARCVERSION)"
+ echo "Usage: $0 [start|stop|status|restart|rehash|version|help]"
+fi
diff --git a/src/bin/cp-recursive b/src/bin/cp-recursive
new file mode 100755
index 000000000..e51230db7
--- /dev/null
+++ b/src/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/src/bin/langtool b/src/bin/langtool
new file mode 100755
index 000000000..c1072760c
--- /dev/null
+++ b/src/bin/langtool
@@ -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/src/bin/mydbgen b/src/bin/mydbgen
new file mode 100755
index 000000000..e513a4917
--- /dev/null
+++ b/src/bin/mydbgen
@@ -0,0 +1,222 @@
+#!/bin/sh
+#
+# $Id$
+
+# Location of the .sql file with the schema
+DBSQL="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
+
+# Fix for bug 10
+for try in HOME/services anope/data ../data data .. .
+do
+ if [ -f "$try/$DBSQL" ]; then
+ DBFILE="$try/$DBSQL"
+ fi
+done
+
+if [ ! -f "./$DBFILE" ] ; then
+ echo "Error: Required file $DBSQL was not found!";
+ 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
+SQLPASS_PREFIX=""
+if [ ! -z "$cc" ] ; then
+ SQLPASS_PREFIX="-p"
+ SQLPASS=$cc
+fi
+stty $OLD_TTY
+
+mysqlshow -h$SQLHOST -u$SQLUSER $SQLPASS_PREFIX$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
+
+MYSQLDUMP="mysqldump -h$SQLHOST -u$SQLUSER $SQLPASS_PREFIX$SQLPASS $SQLDB"
+MYSQLSHOW="mysqlshow -h$SQLHOST -u$SQLUSER $SQLPASS_PREFIX$SQLPASS $SQLDB"
+MYSQL="mysql -h$SQLHOST -u$SQLUSER $SQLPASS_PREFIX$SQLPASS $SQLDB"
+
+echo ""
+
+$MYSQLSHOW | grep -q $SQLDB
+if test "$?" = "1" ; then
+ echo -n "Unable to find databse, creating... "
+ mysql -h$SQLHOST -u$SQLUSER $SQLPASS_PREFIX$SQLPASS -Bs -e "create database $SQLDB" >/dev/null 2>&1
+ if test "$?" = "0" ; then
+ echo "done!"
+ else
+ echo "failed!"
+ FAILED="$FAILED 'database creation'"
+ fi
+fi
+
+$MYSQL -Bs -e "show tables like 'anope_os_core'" | grep -q anope_os_core
+if test "$?" = "1" ; then
+ echo -n "Unable to find Anope schema, creating... "
+ $MYSQL < $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
+ $MYSQL -Bs -e "show tables like 'anope_info'" | grep -q anope_info
+ if test "$?" = "1" ; 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 $SQLPASS_PREFIX$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
+ $MYSQL -Bs -e "describe anope_cs_info memomax" 2> /dev/null | grep -q memomax
+ if test "$?" = "1" ; 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 $SQLPASS_PREFIX$SQLPASS $SQLDB < $TFILE >/dev/null 2>&1
+ if test "$?" = "0" ; then
+ echo "done!"
+
+ else
+ echo "failed!"
+ FAILED="$FAILED 'anope_cs_info.memomax alter'"
+ fi
+ fi
+
+ # Introduced on Anope 1.5.14.5 -> anope_cs_info.ttb
+ $MYSQL -Bs -e "describe anope_cs_info ttb" 2> /dev/null | grep -q ttb
+ if test "$?" = "1" ; 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 $SQLPASS_PREFIX$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.7.7 -> status smallint to inst unsigned.
+ echo "Blindly altering status for bigger capacity... "
+ echo "ALTER TABLE anope_ns_alias CHANGE status status int(11) unsigned NOT NULL default 0" > $TFILE
+ mysql -h$SQLHOST -u$SQLUSER $SQLPASS_PREFIX$SQLPASS $SQLDB < $TFILE >/dev/null 2>&1
+
+ # Introduced on Anope 1.7.8 (620) proxy scanner removed.
+ echo "Removing proxy scanner cache... "
+ echo "DROP TABLE IF EXISTS anope_os_cache" > $TFILE
+ mysql -h$SQLHOST -u$SQLUSER $SQLPASS_PREFIX$SQLPASS $SQLDB < $TFILE >/dev/null 2>&1
+
+ echo "done!"
+
+fi
+
+echo ""
+
+# 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/src/bin/register b/src/bin/register
new file mode 100755
index 000000000..1c236fbe4
--- /dev/null
+++ b/src/bin/register
@@ -0,0 +1,101 @@
+#!/bin/sh
+
+###############################################
+# Set Variables
+###############################################
+
+# CONFIGURATION CACHE (e.g. ../config.cache)
+CACHEFILE="../../config.cache"
+
+# REGISTRATION INFORMATION CACHE FILE (no need to alter this)
+REGCACHE="register.cache"
+
+# SENDMAIL PATH
+SENDMAIL="/usr/sbin/sendmail"
+
+# SCRIPT VERSION NUMBER (DO NOT ALTER)
+REGISTERVERSION="1.3"
+
+# DO NOT CHANGE IF YOU WANT TO REGISTER WITH ANOPE
+REGISTRYADDRESS="register@anope.org"
+
+################################################
+# END OF CONFIGURATION
+# YOU ARE NOT REQUIRED TO CHANGE ANYTHING BELOW
+################################################
+
+if [ $0 != "./register" ] ; then
+ echo "Warning: Run this file while in the /src/bin/ directory (e.g. ./register)"
+ exit 1
+fi
+
+if [ ! -f $CACHEFILE ] ; then
+ echo "Warning: Configuration cache file missing. Run ./Config first"
+ exit 1
+fi
+
+if [ ! -f $SENDMAIL ] ; then
+ echo "Warning: Sendmail cannot be found. Please open this file and set variable correctly"
+ exit 1;
+fi
+
+clear
+
+if [ -f $REGCACHE ] ; then
+ echo "Previous registration cache file found. Removing..."
+ rm $REGCACHE
+fi
+
+ echo "##################################################"
+ echo "Anope registration script (v$REGISTERVERSION)"
+ echo "##################################################"
+ echo "This script allows you to register your network"
+ echo "with the Anope central registry. This gives us"
+ echo "an idea of how many networks use Anope and what options"
+ echo "they compile with so we can spend more time developing"
+ echo "options that are more widely used. Note: The options"
+ echo "you selected in ./Config will be sent."
+ echo "You will be asked a series of questions, if you wish"
+ echo "to be listed in the public network database all the"
+ echo "information will be required."
+ echo "NOTE: NO PRIVATE OR SENSITIVE INFORMATION WILL BE SENT"
+ echo "##################################################"
+ echo "Would you like to register? [Type YES to continue]"
+ read answer
+
+if [ $answer = "YES" ] || [ $answer = "yes" ] || [ $answer = "Yes" ] ; then
+
+ echo "Beginning registration..."
+ echo "1. What is your network name? (e.g. Anope IRC Network)"
+ read NETWORKNAME
+ echo CONNECTADDRESS=\"$NETWORKNAME\" >> $REGCACHE
+ echo "2. What is your network's connection address (e.g. irc.anope.org)"
+ read CONNECTADDRESS
+ echo CONNECTADDRESS=\"$CONNECTADDRESS\" >> $REGCACHE
+ echo "3. Primary contact email address? (e.g. irc-admin@anope.org)"
+ read CONTACTEMAIL
+ echo CONTACTEMAIL=\"$CONTACTEMAIL\" >> $REGCACHE
+ echo "4. What is your network's website address (e.g. http://www.anope.org)"
+ read WEBSITEADDRESS
+ echo WEBSITEADDRESS=\"$WEBSITEADDRESS\" >> $REGCACHE
+ echo "5. Would you like your network to be listed in a public database?"
+ echo "[Please type YES if you would like to be listed]"
+ read LISTED
+ echo LISTED=\"$LISTED\" >> $REGCACHE
+ echo "6. (Bonus Devel-Only Question) Why did the chicken cross the road?!"
+ read BONUS
+ echo BONUS=\"$BONUS\" >> $REGCACHE
+ echo >> $REGCACHE
+ echo "Processing registration..."
+ cat $CACHEFILE >> $REGCACHE
+ $SENDMAIL $REGISTRYADDRESS < $REGCACHE
+ if [ -f $REGCACHE ] ; then
+ echo "Cleaning up..."
+ rm $REGCACHE
+ fi
+ echo "Registration Completed. Thank you for registering Anope."
+ exit 0;
+
+fi
+
+echo "Registration Cancelled"
diff --git a/src/botserv.c b/src/botserv.c
new file mode 100644
index 000000000..ed5af558d
--- /dev/null
+++ b/src/botserv.c
@@ -0,0 +1,1171 @@
+/* BotServ functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+
+/*************************************************************************/
+
+#include "services.h"
+#include "pseudo.h"
+
+
+/*************************************************************************/
+
+BotInfo *botlists[256]; /* Hash list of bots */
+int nbots = 0;
+
+/*************************************************************************/
+
+static UserData *get_user_data(Channel * c, User * u);
+
+static void check_ban(ChannelInfo * ci, User * u, int ttbtype);
+static void bot_kick(ChannelInfo * ci, User * u, int message, ...);
+
+E void moduleAddBotServCmds(void);
+
+/*************************************************************************/
+/* *INDENT-OFF* */
+void moduleAddBotServCmds(void) {
+ modules_core_init(BotServCoreNumber, BotServCoreModules);
+}
+/* *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)
+{
+ if (s_BotServ) {
+ moduleAddBotServCmds();
+ }
+}
+
+/*************************************************************************/
+
+/* 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 = "";
+ }
+ anope_cmd_ctcp(s_BotServ, u->nick, "PING %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 = "";
+ }
+ anope_cmd_ctcp(bi->nick, u->nick, "PING %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 || !buf || !ci) {
+ return;
+ }
+
+ /* Answer to ping if needed, without breaking the buffer. */
+ if (!strnicmp(buf, "\1PING", 5)) {
+ anope_cmd_ctcp(ci->bi->nick, u->nick, "PING %s", 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) &&
+ (!(ci->botflags & BS_DONTKICKOPS)
+ || !(cstatus & (CUS_HALFOP | CUS_OP | CUS_OWNER | CUS_PROTECT)))
+
+ && (!(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;
+ int l = 0;
+ char *s = buf;
+
+ do {
+ if (isupper(*s))
+ i++;
+ else if (islower(*s))
+ l++;
+ } while (*s++);
+
+ /* i counts uppercase chars, l counts lowercase chars. Only
+ * alphabetic chars (so islower || isupper) qualify for the
+ * percentage of caps to kick for; the rest is ignored. -GD
+ */
+
+ if (i >= ci->capsmin && i * 100 / (i + l) >= 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;
+ char *nbuf;
+ BadWord *bw;
+
+ /* Normalize the buffer */
+ nbuf = normalizeBuffer(buf);
+
+ for (i = 0, bw = ci->badwords; i < ci->bwcount; i++, bw++) {
+ if (!bw->in_use)
+ continue;
+
+ if (bw->type == BW_ANY
+ && ((BSCaseSensitive && strstr(nbuf, bw->word))
+ || (!BSCaseSensitive && stristr(nbuf, bw->word)))) {
+ mustkick = 1;
+ } else if (bw->type == BW_SINGLE) {
+ int len = strlen(bw->word);
+
+ if ((BSCaseSensitive && !strcmp(nbuf, bw->word))
+ || (!BSCaseSensitive
+ && (!stricmp(nbuf, bw->word)))) {
+ mustkick = 1;
+ /* two next if are quite odd isn't it? =) */
+ } else if ((strchr(nbuf, ' ') == nbuf + len)
+ &&
+ ((BSCaseSensitive
+ && !strcmp(nbuf, bw->word))
+ || (!BSCaseSensitive
+ && (stristr(nbuf, bw->word) ==
+ nbuf)))) {
+ mustkick = 1;
+ } else {
+ if ((strrchr(nbuf, ' ') ==
+ nbuf + strlen(nbuf) - len - 1)
+ &&
+ ((BSCaseSensitive
+ && (strstr(nbuf, bw->word) ==
+ nbuf + strlen(nbuf) - len))
+ || (!BSCaseSensitive
+ && (stristr(nbuf, bw->word) ==
+ nbuf + strlen(nbuf) - 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 ((BSCaseSensitive
+ && (strstr(nbuf, wordbuf)))
+ || (!BSCaseSensitive
+ && (stristr(nbuf, wordbuf)))) {
+ mustkick = 1;
+ }
+
+ /* free previous (sc)allocated memory (#850) */
+ free(wordbuf);
+ }
+ }
+ } else if (bw->type == BW_START) {
+ int len = strlen(bw->word);
+
+ if ((BSCaseSensitive
+ && (!strncmp(nbuf, bw->word, len)))
+ || (!BSCaseSensitive
+ && (!strnicmp(nbuf, 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 ((BSCaseSensitive && (strstr(nbuf, wordbuf)))
+ || (!BSCaseSensitive
+ && (stristr(nbuf, wordbuf))))
+ mustkick = 1;
+
+ free(wordbuf);
+ }
+ } else if (bw->type == BW_END) {
+ int len = strlen(bw->word);
+
+ if ((BSCaseSensitive
+ &&
+ (!strncmp
+ (nbuf + strlen(nbuf) - len, bw->word, len)))
+ || (!BSCaseSensitive
+ &&
+ (!strnicmp
+ (nbuf + strlen(nbuf) - 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 ((BSCaseSensitive && (strstr(nbuf, wordbuf)))
+ || (!BSCaseSensitive
+ && (stristr(nbuf, 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);
+
+ /* free the normalized buffer before return (#850) */
+ Anope_Free(nbuf);
+
+ return;
+ }
+ }
+
+ /* Free the normalized buffer */
+ Anope_Free(nbuf);
+ }
+
+ /* 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 == *BSFantasyCharacter) {
+ cmd = strtok(buf, " ");
+
+ if (cmd && (cmd[0] == *BSFantasyCharacter)) {
+ char *params = strtok(NULL, "");
+ char *event_name = EVENT_BOT_FANTASY_NO_ACCESS;
+
+ /* Strip off the fantasy character */
+ cmd++;
+
+ if (check_access(u, ci, CA_FANTASIA))
+ event_name = EVENT_BOT_FANTASY;
+
+ if (params)
+ send_event(event_name, 4, cmd, u->nick, ci->name, params);
+ else
+ send_event(event_name, 3, cmd, u->nick, ci->name);
+ }
+ }
+}
+
+/*************************************************************************/
+
+/* 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;
+ uint16 tmp16;
+ uint32 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) { \
+ anope_cmd_global(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;
+
+ if (rdb_tag_table("anope_bs_core") == 0) {
+ alog("Unable to tag table 'anope_bs_core' - BotServ RDB save failed.");
+ rdb_close();
+ return;
+ }
+
+ for (i = 0; i < 256; i++) {
+ for (bi = botlists[i]; bi; bi = bi->next) {
+ if (rdb_save_bs_core(bi) == 0) {
+ alog("Unable to save BotInfo for %s - BotServ RDB save failed.", bi->nick);
+ rdb_close();
+ return;
+ }
+ }
+ }
+
+ if (rdb_clean_table("anope_bs_core") == 0)
+ alog("Unable to clean table 'anope_bs_core' - BotServ RDB save failed.");
+
+ rdb_close();
+#endif
+}
+
+/*************************************************************************/
+
+/* Inserts a bot in the bot list. I can't be much explicit mh? */
+
+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;
+}
+
+/*************************************************************************/
+
+BotInfo *makebot(char *nick)
+{
+ BotInfo *bi;
+
+ if (!nick) {
+ if (debug) {
+ alog("debug: makebot called with NULL values");
+ }
+ return NULL;
+ }
+
+ bi = scalloc(sizeof(BotInfo), 1);
+ bi->nick = sstrdup(nick);
+ bi->lastmsg = time(NULL);
+ insert_bot(bi);
+ nbots++;
+ return bi;
+}
+
+/*************************************************************************/
+
+
+/*************************************************************************/
+
+
+/*************************************************************************/
+
+BotInfo *findbot(char *nick)
+{
+ BotInfo *bi;
+ Uid *ud;
+
+ /* to keep make strict happy */
+ ud = NULL;
+
+ if (!nick || !*nick)
+ return NULL;
+
+ for (bi = botlists[tolower(*nick)]; bi; bi = bi->next) {
+ if (UseTS6 && ircd->ts6) {
+ ud = find_nickuid(nick);
+ }
+ if (!stricmp(nick, bi->nick)) {
+ return bi;
+ }
+ if (ud && UseTS6 && ircd->ts6) {
+ if (!stricmp(ud->nick, bi->nick)) {
+ return bi;
+ }
+ }
+ }
+
+ return NULL;
+}
+
+/*************************************************************************/
+
+/* Unassign a bot from a channel. Assumes u, ci and ci->bi are not NULL */
+
+void unassign(User * u, ChannelInfo * ci)
+{
+ send_event(EVENT_BOT_UNASSIGN, 2, ci->name, ci->bi->nick);
+
+ if (ci->c && ci->c->usercount >= BSMinUsers) {
+ anope_cmd_part(ci->bi->nick, ci->name, "UNASSIGN from %s",
+ 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,
+ common_get_vhost(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)
+{
+ if (!ci || !ci->c || !ci->bi)
+ return;
+
+ if (BSSmartJoin) {
+ /* We check for bans */
+ if (ci->c->bans && ci->c->bans->count) {
+ char buf[BUFSIZE];
+ char *av[4];
+ Entry *ban, *next;
+ int ac;
+
+ if (ircdcap->tsmode) {
+ snprintf(buf, BUFSIZE - 1, "%ld", (long int) time(NULL));
+ av[0] = ci->c->name;
+ av[1] = buf;
+ av[2] = sstrdup("-b");
+ ac = 4;
+ } else {
+ av[0] = ci->c->name;
+ av[1] = sstrdup("-b");
+ ac = 3;
+ }
+
+ for (ban = ci->c->bans->entries; ban; ban = next) {
+ next = ban->next;
+ if (entry_match
+ (ban, ci->bi->nick, ci->bi->user, ci->bi->host, 0)) {
+ anope_cmd_mode(whosends(ci), ci->name, "-b %s",
+ ban->mask);
+ if (ircdcap->tsmode)
+ av[3] = ban->mask;
+ else
+ av[2] = ban->mask;
+
+ do_cmode(whosends(ci), ac, av);
+ }
+ }
+
+ if (ircdcap->tsmode)
+ free(av[2]);
+ else
+ free(av[1]);
+ }
+
+ /* Should we be invited? */
+ if ((ci->c->mode & anope_get_invite_mode())
+ || (ci->c->limit && ci->c->usercount >= ci->c->limit))
+ anope_cmd_notice_ops(NULL, ci->c->name,
+ "%s invited %s into the channel.",
+ ci->bi->nick, ci->bi->nick);
+ }
+ anope_cmd_join(ci->bi->nick, ci->c->name, ci->c->creation_time);
+ anope_cmd_bot_chan_mode(ci->bi->nick, ci->c->name);
+ send_event(EVENT_BOT_JOIN, 2, ci->name, ci->bi->nick);
+}
+
+/*************************************************************************/
+
+/* 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[4];
+ int ac;
+ char mask[BUFSIZE];
+ char buf[BUFSIZE];
+
+ bd->ttb[ttbtype] = 0;
+
+ get_idealban(ci, u, mask, sizeof(mask));
+
+ if (ircdcap->tsmode) {
+ snprintf(buf, BUFSIZE - 1, "%ld", (long int) time(NULL));
+ av[0] = ci->name;
+ av[1] = buf;
+ av[2] = sstrdup("+b");
+ av[3] = mask;
+ ac = 4;
+ } else {
+ av[0] = ci->name;
+ av[1] = sstrdup("+b");
+ av[2] = mask;
+ ac = 3;
+ }
+
+ anope_cmd_mode(ci->bi->nick, ci->name, "+b %s", mask);
+ do_cmode(ci->bi->nick, ac, av);
+ send_event(EVENT_BOT_BAN, 3, u->nick, ci->name, mask);
+ if (ircdcap->tsmode)
+ free(av[2]);
+ else
+ 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);
+ va_end(args);
+
+ av[0] = ci->name;
+ av[1] = u->nick;
+ av[2] = buf;
+ anope_cmd_kick(ci->bi->nick, av[0], av[1], "%s", av[2]);
+ do_kick(ci->bi->nick, 3, av);
+ send_event(EVENT_BOT_KICK, 3, u->nick, ci->name, buf);
+}
+
+/*************************************************************************/
+
+/* Makes a simple ban and kicks the target */
+
+void bot_raw_ban(User * requester, ChannelInfo * ci, char *nick,
+ char *reason)
+{
+ int ac;
+ char *av[4];
+ char mask[BUFSIZE];
+ char buf[BUFSIZE];
+ User *u = finduser(nick);
+
+ if (!u)
+ return;
+
+ if (ircd->protectedumode) {
+ if (is_protected(u) && (requester != u)) {
+ anope_cmd_privmsg(ci->bi->nick, ci->name, "%s",
+ getstring2(NULL, PERMISSION_DENIED));
+ return;
+ }
+ }
+
+ if ((ci->flags & CI_PEACE) && stricmp(requester->nick, nick)
+ && (get_access(u, ci) >= get_access(requester, ci)))
+ return;
+
+ if (ircd->except) {
+ if (is_excepted(ci, u) == 1) {
+ anope_cmd_privmsg(ci->bi->nick, ci->name, "%s",
+ getstring2(NULL, BOT_EXCEPT));
+ return;
+ }
+ }
+
+ get_idealban(ci, u, mask, sizeof(mask));
+
+ if (ircdcap->tsmode) {
+ snprintf(buf, BUFSIZE - 1, "%ld", (long int) time(NULL));
+ av[0] = ci->name;
+ av[1] = buf;
+ av[2] = sstrdup("+b");
+ av[3] = mask;
+ ac = 4;
+ } else {
+ av[0] = ci->name;
+ av[1] = sstrdup("+b");
+ av[2] = mask;
+ ac = 3;
+ }
+
+ anope_cmd_mode(ci->bi->nick, ci->name, "+b %s", mask);
+ do_cmode(ci->bi->nick, ac, av);
+
+ /* We need to free our sstrdup'd "+b" -GD */
+ if (ircdcap->tsmode)
+ free(av[2]);
+ else
+ 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;
+ }
+
+ /* Check if we need to do a signkick or not -GD */
+ if ((ci->flags & CI_SIGNKICK)
+ || ((ci->flags & CI_SIGNKICK_LEVEL)
+ && !check_access(requester, ci, CA_SIGNKICK)))
+ anope_cmd_kick(ci->bi->nick, av[0], av[1], "%s (%s)", av[2],
+ requester->nick);
+ else
+ anope_cmd_kick(ci->bi->nick, av[0], av[1], "%s", av[2]);
+
+ do_kick(ci->bi->nick, 3, av);
+ send_event(EVENT_BOT_KICK, 3, av[1], av[0], av[2]);
+}
+
+/*************************************************************************/
+
+/* Makes a kick with a "dynamic" reason ;) */
+
+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 (ircd->protectedumode) {
+ if (is_protected(u) && (requester != u)) {
+ anope_cmd_privmsg(ci->bi->nick, ci->name, "%s",
+ getstring2(NULL, PERMISSION_DENIED));
+ return;
+ }
+ }
+
+ 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;
+ }
+
+ if ((ci->flags & CI_SIGNKICK)
+ || ((ci->flags & CI_SIGNKICK_LEVEL)
+ && !check_access(requester, ci, CA_SIGNKICK)))
+ anope_cmd_kick(ci->bi->nick, av[0], av[1], "%s (%s)", av[2],
+ requester->nick);
+ else
+ anope_cmd_kick(ci->bi->nick, av[0], av[1], "%s", av[2]);
+ do_kick(ci->bi->nick, 3, av);
+ send_event(EVENT_BOT_KICK, 3, av[1], av[0], av[2]);
+}
+
+/*************************************************************************/
+
+/* Makes a mode operation on a channel for a nick */
+
+void bot_raw_mode(User * requester, ChannelInfo * ci, char *mode,
+ char *nick)
+{
+ char *av[4];
+ int ac;
+ char buf[BUFSIZE];
+ User *u;
+
+ *buf = '\0';
+ u = finduser(nick);
+
+ if (!u || !is_on_chan(ci->c, u))
+ return;
+
+ snprintf(buf, BUFSIZE - 1, "%ld", (long int) time(NULL));
+
+ if (ircd->protectedumode) {
+ if (is_protected(u) && *mode == '-' && (requester != u)) {
+ anope_cmd_privmsg(ci->bi->nick, ci->name, "%s",
+ getstring2(NULL, PERMISSION_DENIED));
+ return;
+ }
+ }
+
+ if (*mode == '-' && (ci->flags & CI_PEACE)
+ && stricmp(requester->nick, nick)
+ && (get_access(u, ci) >= get_access(requester, ci)))
+ return;
+
+ if (ircdcap->tsmode) {
+ av[0] = ci->name;
+ av[1] = buf;
+ av[2] = mode;
+ av[3] = nick;
+ ac = 4;
+ anope_cmd_mode(ci->bi->nick, av[0], "%s %s", av[2], av[3]);
+ } else {
+ av[0] = ci->name;
+ av[1] = mode;
+ av[2] = nick;
+ ac = 3;
+ anope_cmd_mode(ci->bi->nick, av[0], "%s %s", av[1], av[2]);
+ }
+
+ do_cmode(ci->bi->nick, ac, av);
+}
+
+/*************************************************************************/
+/**
+ * Normalize buffer stripping control characters and colors
+ * @param A string to be parsed for control and color codes
+ * @return A string stripped of control and color codes
+ */
+char *normalizeBuffer(char *buf)
+{
+ char *newbuf;
+ int i, len, j = 0;
+
+ len = strlen(buf);
+ newbuf = (char *) smalloc(sizeof(char) * len + 1);
+
+ for (i = 0; i < len; i++) {
+ switch (buf[i]) {
+ /* ctrl char */
+ case 1:
+ break;
+ /* Bold ctrl char */
+ case 2:
+ break;
+ /* Color ctrl char */
+ case 3:
+ /* If the next character is a digit, its also removed */
+ if (isdigit(buf[i + 1])) {
+ i++;
+
+ /* not the best way to remove colors
+ * which are two digit but no worse then
+ * how the Unreal does with +S - TSL
+ */
+ if (isdigit(buf[i + 1])) {
+ i++;
+ }
+
+ /* Check for background color code
+ * and remove it as well
+ */
+ if (buf[i + 1] == ',') {
+ i++;
+
+ if (isdigit(buf[i + 1])) {
+ i++;
+ }
+ /* not the best way to remove colors
+ * which are two digit but no worse then
+ * how the Unreal does with +S - TSL
+ */
+ if (isdigit(buf[i + 1])) {
+ i++;
+ }
+ }
+ }
+
+ break;
+ /* line feed char */
+ case 10:
+ break;
+ /* carriage returns char */
+ case 13:
+ break;
+ /* Reverse ctrl char */
+ case 22:
+ break;
+ /* Underline ctrl char */
+ case 31:
+ break;
+ /* A valid char gets copied into the new buffer */
+ default:
+ newbuf[j] = buf[i];
+ j++;
+ }
+ }
+
+ /* Terminate the string */
+ newbuf[j] = 0;
+
+ return (newbuf);
+}
diff --git a/src/channels.c b/src/channels.c
new file mode 100644
index 000000000..8ce8a0c51
--- /dev/null
+++ b/src/channels.c
@@ -0,0 +1,2322 @@
+/* Channel-handling routines.
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+
+#include "services.h"
+#include "language.h"
+
+Channel *chanlist[1024];
+
+#define HASH(chan) ((chan)[1] ? ((chan)[1]&31)<<5 | ((chan)[2]&31) : 0)
+
+/**************************** 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) {
+ anope_cmd_part(c->ci->bi->nick, c->name, NULL);
+ }
+
+ 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) {
+ if (debug) {
+ alog("debug: chan_has_user_status wanted %d the user is %d", status, uc->status);
+ }
+ 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;
+
+ if (debug >= 2)
+ alog("debug: removing user status (%d) from %s for %s", status,
+ user->nick, chan->name);
+
+ 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;
+ char *modes = av[0], mode;
+ CBMode *cbm;
+ CMMode *cmm;
+ CUMode *cum;
+ unsigned char botmode = 0;
+ BotInfo *bi;
+ User *u, *user;
+ int i, real_ac = ac;
+ char **real_av = av;
+
+ if (debug)
+ alog("debug: Changing modes for %s to %s", chan->name,
+ merge_args(ac, av));
+
+ u = finduser(source);
+ if (u && (chan_get_user_status(chan, u) & CUS_DEOPPED)) {
+ char *s;
+
+ if (debug)
+ alog("debug: Removing instead of setting due to DEOPPED flag");
+
+ /* Swap adding and removing of the modes */
+ for (s = av[0]; *s; s++) {
+ if (*s == '+')
+ *s = '-';
+ else if (*s == '-')
+ *s = '+';
+ }
+
+ /* Set the resulting mode buffer */
+ anope_cmd_mode(whosends(chan->ci), chan->name, merge_args(ac, av));
+
+ return;
+ }
+
+ 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) {
+ 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) {
+ if ((bi = findbot(*av))) {
+ if (!botmode || botmode != mode) {
+ anope_cmd_mode(bi->nick, chan->name, "+%c %s",
+ mode, bi->nick);
+ botmode = mode;
+ continue;
+ } else {
+ botmode = mode;
+ continue;
+ }
+ }
+ } else {
+ if ((bi = findbot(*av))) {
+ continue;
+ }
+ }
+
+ if (!(user = finduser(*av))
+ && !(UseTS6 && ircd->ts6 && (user = find_byuid(*av)))) {
+ if (debug) {
+ alog("debug: 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) {
+ chan_set_user_status(chan, user, cum->status);
+ /* If this does +o, remove any DEOPPED flag */
+ if (cum->status & CUS_OP)
+ chan_remove_user_status(chan, user, CUS_DEOPPED);
+ } else {
+ chan_remove_user_status(chan, user, cum->status);
+ }
+
+ } else if ((cbm = &cbmodes[(int) mode])->flag != 0) {
+ if (check >= 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);
+ }
+
+ if (check < 0) {
+ if (add)
+ chan->mode |= cbm->flag;
+ else
+ chan->mode &= ~cbm->flag;
+ }
+ } 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++;
+ if (add)
+ cmm->addmask(chan, *av);
+ else
+ cmm->delmask(chan, *av);
+ }
+ }
+
+ if (check > 0) {
+ check_modes(chan);
+
+ if (check < 2) {
+ /* Walk through all users we've set modes for and see if they are
+ * valid. Invalid modes (like +o with SECUREOPS on) will be removed
+ */
+ real_ac--;
+ real_av++;
+ for (i = 0; i < real_ac; i++) {
+ if ((user = finduser(*real_av)) && is_on_chan(chan, user))
+ chan_set_correct_modes(user, chan, 0);
+ real_av++;
+ }
+ }
+ }
+}
+
+/*************************************************************************/
+
+/* 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 (debug >= 2)
+ alog("debug: setting user status (%d) on %s for %s", status,
+ user->nick, chan->name);
+
+ if (HelpChannel && ircd->supporthelper && (status & CUS_OP)
+ && (stricmp(chan->name, HelpChannel) == 0)
+ && (!chan->ci || check_access(user, chan->ci, CA_AUTOOP))) {
+ if (debug) {
+ alog("debug: %s being given +h for having %d status in %s",
+ user->nick, status, chan->name);
+ }
+ common_svsmode(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 (!chan || !*chan) {
+ if (debug) {
+ alog("debug: findchan() called with NULL values");
+ }
+ return NULL;
+ }
+
+ if (debug >= 3)
+ alog("debug: findchan(%p)", chan);
+ c = chanlist[HASH(chan)];
+ while (c) {
+ if (stricmp(c->name, chan) == 0) {
+ if (debug >= 3)
+ alog("debug: findchan(%s) -> %p", chan, (void *) c);
+ return c;
+ }
+ c = c->next;
+ }
+ if (debug >= 3)
+ alog("debug: findchan(%s) -> %p", chan, (void *) 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;
+
+ 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;
+ if (ircd->fmode) {
+ if (chan->flood)
+ mem += strlen(chan->flood) + 1;
+ }
+ if (ircd->Lmode) {
+ if (chan->redirect)
+ mem += strlen(chan->redirect) + 1;
+ }
+ mem += get_memuse(chan->bans);
+ if (ircd->except) {
+ mem += get_memuse(chan->excepts);
+ }
+ if (ircd->invitemode) {
+ mem += get_memuse(chan->invites);
+ }
+ 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;
+ Channel *chan;
+ char *s, *t;
+ struct u_chanlist *c, *nextc;
+ char *channame;
+ time_t ts = time(NULL);
+
+ if (UseTS6 && ircd->ts6) {
+ user = find_byuid(source);
+ if (!user)
+ user = finduser(source);
+ } else {
+ user = finduser(source);
+ }
+ if (!user) {
+ if (debug) {
+ alog("debug: 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 (*s == '0') {
+ c = user->chans;
+ while (c) {
+ nextc = c->next;
+ channame = sstrdup(c->chan->name);
+ send_event(EVENT_PART_CHANNEL, 3, EVENT_START, user->nick,
+ channame);
+ chan_deluser(user, c->chan);
+ send_event(EVENT_PART_CHANNEL, 3, EVENT_STOP, user->nick,
+ channame);
+ free(channame);
+ free(c);
+ c = nextc;
+ }
+ user->chans = NULL;
+ continue;
+ }
+
+ /* how about not triggering the JOIN event on an actual /part :) -certus */
+ send_event(EVENT_JOIN_CHANNEL, 3, EVENT_START, source, s);
+
+ /* Make sure check_kick comes before chan_adduser, so banned users
+ * don't get to see things like channel keys. */
+ /* If channel already exists, check_kick() will use correct TS.
+ * Otherwise, we lose. */
+ if (check_kick(user, s, ts))
+ continue;
+
+ if (ac == 2) {
+ ts = strtoul(av[1], NULL, 10);
+ if (debug) {
+ alog("debug: recieved a new TS for JOIN: %ld",
+ (long int) ts);
+ }
+ }
+
+ chan = findchan(s);
+ chan = join_user_update(user, chan, s, ts);
+ chan_set_correct_modes(user, chan, 1);
+
+ send_event(EVENT_JOIN_CHANNEL, 3, EVENT_STOP, source, 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;
+ }
+
+ if (UseTS6 && ircd->ts6) {
+ user = find_byuid(s);
+ if (!user) {
+ user = finduser(s);
+ }
+ } else {
+ user = finduser(s);
+ }
+ if (!user) {
+ if (debug) {
+ alog("debug: 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", user->nick, av[0]);
+ }
+ for (c = user->chans; c && stricmp(av[0], c->chan->name) != 0;
+ c = c->next);
+ if (c) {
+ send_event(EVENT_CHAN_KICK, 2, user->nick, av[0]);
+ 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;
+ char *channame;
+
+ if (UseTS6 && ircd->ts6) {
+ user = find_byuid(source);
+ if (!user)
+ user = finduser(source);
+ } else {
+ user = finduser(source);
+ }
+ if (!user) {
+ if (debug) {
+ alog("debug: 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;
+ }
+ channame = sstrdup(c->chan->name);
+ send_event(EVENT_PART_CHANNEL, (ac >= 2 ? 4 : 3), EVENT_START,
+ user->nick, channame, (ac >= 2 ? av[1] : ""));
+
+ 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);
+
+ send_event(EVENT_PART_CHANNEL, (ac >= 2 ? 4 : 3), EVENT_STOP,
+ user->nick, channame, (ac >= 2 ? av[1] : ""));
+ free(channame);
+ }
+ }
+}
+
+/*************************************************************************/
+
+/* 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
+
+ ============================================================
+
+ Unreal SJOIN
+
+ On Services connect there is
+ SJOIN !11LkOb #ircops +nt :@Trystan &*!*@*.aol.com "*@*.home.com
+
+ av[0] = time stamp (base64)
+ av[1] = channel
+ av[2] = modes
+ av[3] = users + bans + exceptions
+
+ On Channel Creation or a User joins an existing
+ Luna.NomadIrc.Net SJOIN !11LkW9 #akill :@Trystan
+ Luna.NomadIrc.Net SJOIN !11LkW9 #akill :Trystan`
+
+ av[0] = time stamp (base64)
+ av[1] = channel
+ av[2] = users
+
+*/
+
+void do_sjoin(const char *source, int ac, char **av)
+{
+ Channel *c;
+ User *user;
+ Server *serv;
+ struct c_userlist *cu;
+ char *s = NULL;
+ char *end, cubuf[7], *end2, *cumodes[6];
+ int is_sqlined = 0;
+ int ts = 0;
+ int is_created = 0;
+ int keep_their_modes = 1;
+
+ serv = findserver(servlist, source);
+
+ if (ircd->sjb64) {
+ ts = base64dects(av[0]);
+ } else {
+ ts = strtoul(av[0], NULL, 10);
+ }
+ c = findchan(av[1]);
+ if (c != NULL) {
+ if (c->creation_time == 0 || ts == 0)
+ c->creation_time = 0;
+ else if (c->creation_time > ts) {
+ c->creation_time = ts;
+ for (cu = c->users; cu; cu = cu->next) {
+ /* XXX */
+ cumodes[0] = "-ov";
+ cumodes[1] = cu->user->nick;
+ cumodes[2] = cu->user->nick;
+ chan_set_modes(source, c, 3, cumodes, 2);
+ }
+ if (c->ci && c->ci->bi) {
+ /* This is ugly, but it always works */
+ anope_cmd_part(c->ci->bi->nick, c->name, "TS reop");
+ bot_join(c->ci);
+ }
+ /* XXX simple modes and bans */
+ } else if (c->creation_time < ts)
+ keep_their_modes = 0;
+ } else
+ is_created = 1;
+
+ /* Double check to avoid unknown modes that need parameters */
+ if (ac >= 4) {
+ if (ircd->chansqline) {
+ if (!c)
+ is_sqlined = check_chan_sqline(av[1]);
+ }
+
+ 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;
+
+
+ if (ircd->sjoinbanchar) {
+ if (*s == ircd->sjoinbanchar && keep_their_modes) {
+ add_ban(c, myStrGetToken(s, ircd->sjoinbanchar, 1));
+ if (!end)
+ break;
+ s = end + 1;
+ continue;
+ }
+ }
+ if (ircd->sjoinexchar) {
+ if (*s == ircd->sjoinexchar && keep_their_modes) {
+ add_exception(c,
+ myStrGetToken(s, ircd->sjoinexchar, 1));
+ if (!end)
+ break;
+ s = end + 1;
+ continue;
+ }
+ }
+
+ if (ircd->sjoininvchar) {
+ if (*s == ircd->sjoininvchar && keep_their_modes) {
+ add_invite(c, myStrGetToken(s, ircd->sjoininvchar, 1));
+ if (!end)
+ break;
+ s = end + 1;
+ continue;
+ }
+ }
+
+ while (csmodes[(int) *s] != 0)
+ *end2++ = csmodes[(int) *s++];
+ *end2 = 0;
+
+
+ if (UseTS6 && ircd->ts6) {
+ user = find_byuid(s);
+ if (!user)
+ user = finduser(s);
+ } else {
+ user = finduser(s);
+ }
+
+ if (!user) {
+ if (debug) {
+ alog("debug: SJOIN for nonexistent user %s on %s", s,
+ av[1]);
+ }
+ return;
+ }
+
+ if (is_sqlined && !is_oper(user)) {
+ anope_cmd_kick(s_OperServ, av[1], s, "Q-Lined");
+ } else {
+ if (!check_kick(user, av[1], ts)) {
+ send_event(EVENT_JOIN_CHANNEL, 3, EVENT_START,
+ user->nick, 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], ts);
+
+ /* We update user mode on the channel */
+ if (end2 - cubuf > 1 && keep_their_modes) {
+ int i;
+
+ for (i = 1; i < end2 - cubuf; i++)
+ cumodes[i] = user->nick;
+ chan_set_modes(source, c, 1 + (end2 - cubuf - 1),
+ cumodes, 2);
+ }
+
+ if (c->ci && (!serv || is_sync(serv))
+ && !c->topic_sync)
+ restore_topic(c->name);
+ chan_set_correct_modes(user, c, 1);
+
+ send_event(EVENT_JOIN_CHANNEL, 3, EVENT_STOP,
+ user->nick, av[1]);
+ }
+ }
+
+ if (!end)
+ break;
+ s = end + 1;
+ }
+
+ if (c && keep_their_modes) {
+ /* We now update the channel mode. */
+ chan_set_modes(source, c, ac - 3, &av[2], 2);
+ }
+
+ /* Unreal just had to be different */
+ } else if (ac == 3 && !ircd->ts6) {
+ if (ircd->chansqline) {
+ if (!c)
+ is_sqlined = check_chan_sqline(av[1]);
+ }
+
+ cubuf[0] = '+';
+ cumodes[0] = cubuf;
+
+ /* We make all the users join */
+ s = av[2]; /* 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;
+
+ if (UseTS6 && ircd->ts6) {
+ user = find_byuid(s);
+ if (!user)
+ user = finduser(s);
+ } else {
+ user = finduser(s);
+ }
+
+ if (!user) {
+ if (debug) {
+ alog("debug: SJOIN for nonexistent user %s on %s", s,
+ av[1]);
+ }
+ return;
+ }
+
+ if (is_sqlined && !is_oper(user)) {
+ anope_cmd_kick(s_OperServ, av[1], s, "Q-Lined");
+ } else {
+ if (!check_kick(user, av[1], ts)) {
+ send_event(EVENT_JOIN_CHANNEL, 3, EVENT_START,
+ user->nick, 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], ts);
+
+ /* We update user mode on the channel */
+ if (end2 - cubuf > 1 && keep_their_modes) {
+ int i;
+
+ for (i = 1; i < end2 - cubuf; i++)
+ cumodes[i] = user->nick;
+ chan_set_modes(source, c, 1 + (end2 - cubuf - 1),
+ cumodes, 2);
+ }
+
+ chan_set_correct_modes(user, c, 1);
+
+ send_event(EVENT_JOIN_CHANNEL, 3, EVENT_STOP,
+ user->nick, av[1]);
+ }
+ }
+
+ if (!end)
+ break;
+ s = end + 1;
+ }
+ } else if (ac == 3 && ircd->ts6) {
+ if (ircd->chansqline) {
+ if (!c)
+ is_sqlined = check_chan_sqline(av[1]);
+ }
+
+ cubuf[0] = '+';
+ cumodes[0] = cubuf;
+
+ /* We make all the users join */
+ s = sstrdup(source); /* 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;
+
+ if (UseTS6 && ircd->ts6) {
+ user = find_byuid(s);
+ if (!user)
+ user = finduser(s);
+ } else {
+ user = finduser(s);
+ }
+ if (!user) {
+ if (debug) {
+ alog("debug: SJOIN for nonexistent user %s on %s", s,
+ av[1]);
+ }
+ free(s);
+ return;
+ }
+
+ if (is_sqlined && !is_oper(user)) {
+ anope_cmd_kick(s_OperServ, av[1], s, "Q-Lined");
+ } else {
+ if (!check_kick(user, av[1], ts)) {
+ send_event(EVENT_JOIN_CHANNEL, 3, EVENT_START,
+ user->nick, 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], ts);
+
+ /* We update user mode on the channel */
+ if (end2 - cubuf > 1 && keep_their_modes) {
+ int i;
+
+ for (i = 1; i < end2 - cubuf; i++)
+ cumodes[i] = user->nick;
+ chan_set_modes(source, c, 1 + (end2 - cubuf - 1),
+ cumodes, 2);
+ }
+
+ chan_set_correct_modes(user, c, 1);
+
+ send_event(EVENT_JOIN_CHANNEL, 3, EVENT_STOP,
+ user->nick, av[1]);
+ }
+ }
+
+ if (!end)
+ break;
+ s = end + 1;
+ }
+ free(s);
+ } else if (ac == 2) {
+ if (UseTS6 && ircd->ts6) {
+ user = find_byuid(source);
+ if (!user)
+ user = finduser(source);
+ } else {
+ user = finduser(source);
+ }
+ if (!user) {
+ if (debug) {
+ alog("debug: SJOIN for nonexistent user %s on %s", source,
+ av[1]);
+ }
+ return;
+ }
+
+ if (check_kick(user, av[1], ts))
+ return;
+
+ if (ircd->chansqline) {
+ if (!c)
+ is_sqlined = check_chan_sqline(av[1]);
+ }
+
+ if (is_sqlined && !is_oper(user)) {
+ anope_cmd_kick(s_OperServ, av[1], user->nick, "Q-Lined");
+ } else {
+ send_event(EVENT_JOIN_CHANNEL, 3, EVENT_START, user->nick,
+ av[1]);
+
+ c = join_user_update(user, c, av[1], ts);
+ if (is_created && c->ci)
+ restore_topic(c->name);
+ chan_set_correct_modes(user, c, 1);
+
+ send_event(EVENT_JOIN_CHANNEL, 3, EVENT_STOP, user->nick,
+ av[1]);
+ }
+ }
+}
+
+
+/*************************************************************************/
+
+/* Handle a channel MODE command. */
+
+void do_cmode(const char *source, int ac, char **av)
+{
+ Channel *chan;
+ ChannelInfo *ci = NULL;
+ int i;
+ char *t;
+
+ if (ircdcap->tsmode) {
+ /* TSMODE for bahamut - leave this code out to break MODEs. -GD */
+ /* if they don't send it in CAPAB check if we just want to enable it */
+ if (uplink_capab & ircdcap->tsmode || UseTSMODE) {
+ for (i = 0; i < strlen(av[1]); i++) {
+ if (!isdigit(av[1][i]))
+ break;
+ }
+ if (av[1][i] == '\0') {
+ /* We have a valid TS field in av[1] now, so we can strip it off */
+ /* After we swap av[0] and av[1] ofcourse to not break stuff! :) */
+ t = av[0];
+ av[0] = av[1];
+ av[1] = t;
+ ac--;
+ av++;
+ } else {
+ alog("TSMODE enabled but MODE has no valid TS");
+ }
+ }
+ }
+
+ /* :42XAAAAAO TMODE 1106409026 #ircops +b *!*@*.aol.com */
+ if (UseTS6 && ircd->ts6) {
+ if (isdigit(av[0][0])) {
+ ac--;
+ av++;
+ }
+ }
+
+ chan = findchan(av[0]);
+ if (!chan) {
+ if (debug) {
+ ci = cs_findchan(av[0]);
+ if (!(ci && (ci->flags & CI_VERBOTEN)))
+ alog("debug: 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]);
+ ChannelInfo *ci;
+ int ts;
+ time_t topic_time;
+ char *topicsetter;
+
+ if (ircd->sjb64) {
+ ts = base64dects(av[2]);
+ if (debug) {
+ alog("debug: encoded TOPIC TS %s converted to %d", av[2], ts);
+ }
+ } else {
+ ts = strtoul(av[2], NULL, 10);
+ }
+
+ topic_time = ts;
+
+ if (!c) {
+ if (debug) {
+ alog("debug: TOPIC %s for nonexistent channel %s",
+ merge_args(ac - 1, av + 1), av[0]);
+ }
+ return;
+ }
+
+ /* We can be sure that the topic will be in sync here -GD */
+ c->topic_sync = 1;
+
+ ci = c->ci;
+
+ /* For Unreal, cut off the ! and any futher part of the topic setter.
+ * This way, nick!ident@host setters will only show the nick. -GD
+ */
+ topicsetter = myStrGetToken(av[1], '!', 0);
+
+ /* If the current topic we have matches the last known topic for this
+ * channel exactly, there's no need to update anything and we can as
+ * well just return silently without updating anything. -GD
+ */
+ if ((ac > 3) && *av[3] && ci && ci->last_topic
+ && (strcmp(av[3], ci->last_topic) == 0)
+ && (strcmp(topicsetter, ci->last_topic_setter) == 0)) {
+ free(topicsetter);
+ return;
+ }
+
+ if (check_topiclock(c, topic_time)) {
+ free(topicsetter);
+ return;
+ }
+
+ if (c->topic) {
+ free(c->topic);
+ c->topic = NULL;
+ }
+ if (ac > 3 && *av[3]) {
+ c->topic = sstrdup(av[3]);
+ }
+
+ strscpy(c->topic_setter, topicsetter, sizeof(c->topic_setter));
+ c->topic_time = topic_time;
+ free(topicsetter);
+
+ record_topic(av[0]);
+
+ if (ci && ci->last_topic) {
+ send_event(EVENT_TOPIC_UPDATED, 2, av[0], ci->last_topic);
+ } else {
+ send_event(EVENT_TOPIC_UPDATED, 2, av[0], "");
+ }
+}
+
+/*************************************************************************/
+/**************************** Internal Calls *****************************/
+/*************************************************************************/
+
+void add_ban(Channel * chan, char *mask)
+{
+ Entry *ban;
+ /* check for NULL values otherwise we will segfault */
+ if (!chan || !mask) {
+ if (debug) {
+ alog("debug: add_ban called with NULL values");
+ }
+ return;
+ }
+
+ /* Check if the list already exists, if not create it.
+ * Create a new ban and add it to the list.. ~ Viper */
+ if (!chan->bans)
+ chan->bans = list_create();
+ ban = entry_add(chan->bans, mask);
+
+ if (!ban)
+ fatal("Creating new ban entry failed");
+
+ /* Check whether it matches a botserv bot after adding internally
+ * and parsing it through cidr support. ~ Viper */
+ if (s_BotServ && BSSmartJoin && chan->ci && chan->ci->bi
+ && chan->usercount >= BSMinUsers) {
+ BotInfo *bi = chan->ci->bi;
+
+ if (entry_match(ban, bi->nick, bi->user, bi->host, 0)) {
+ anope_cmd_mode(bi->nick, chan->name, "-b %s", mask);
+ entry_delete(chan->bans, ban);
+ return;
+ }
+ }
+
+ if (debug)
+ alog("debug: Added ban %s to channel %s", mask, chan->name);
+}
+
+/*************************************************************************/
+
+void add_exception(Channel * chan, char *mask)
+{
+ Entry *exception;
+
+ if (!chan || !mask) {
+ if (debug)
+ alog("debug: add_exception called with NULL values");
+ return;
+ }
+
+ /* Check if the list already exists, if not create it.
+ * Create a new exception and add it to the list.. ~ Viper */
+ if (!chan->excepts)
+ chan->excepts = list_create();
+ exception = entry_add(chan->excepts, mask);
+
+ if (!exception)
+ fatal("Creating new exception entry failed");
+
+ if (debug)
+ alog("debug: Added except %s to channel %s", mask, chan->name);
+}
+
+/*************************************************************************/
+
+void add_invite(Channel * chan, char *mask)
+{
+ Entry *invite;
+
+ if (!chan || !mask) {
+ if (debug)
+ alog("debug: add_invite called with NULL values");
+ return;
+ }
+
+ /* Check if the list already exists, if not create it.
+ * Create a new invite and add it to the list.. ~ Viper */
+ if (!chan->invites)
+ chan->invites = list_create();
+ invite = entry_add(chan->invites, mask);
+
+ if (!invite)
+ fatal("Creating new exception entry failed");
+
+ if (debug)
+ alog("debug: Added invite %s to channel %s", mask, chan->name);
+}
+
+/*************************************************************************/
+
+/**
+ * Set the correct modes, or remove the ones granted without permission,
+ * for the specified user on ths specified channel. This doesn't give
+ * modes to ignored users, but does remove them if needed.
+ * @param user The user to give/remove modes to/from
+ * @param c The channel to give/remove modes on
+ * @param give_modes Set to 1 to give modes, 0 to not give modes
+ * @return void
+ **/
+void chan_set_correct_modes(User * user, Channel * c, int give_modes)
+{
+ char *tmp;
+ char modebuf[BUFSIZE];
+ char userbuf[BUFSIZE];
+ int status;
+ int add_modes = 0;
+ int rem_modes = 0;
+ ChannelInfo *ci;
+
+ if (!c || !(ci = c->ci))
+ return;
+
+ if ((ci->flags & CI_VERBOTEN) || (*(c->name) == '+'))
+ return;
+
+ status = chan_get_user_status(c, user);
+
+ if (debug)
+ alog("debug: Setting correct user modes for %s on %s (current status: %d, %sgiving modes)", user->nick, c->name, status, (give_modes ? "" : "not "));
+
+ /* Changed the second line of this if a bit, to make sure unregistered
+ * users can always get modes (IE: they always have autoop enabled). Before
+ * this change, you were required to have a registered nick to be able
+ * to receive modes. I wonder who added that... *looks at Rob* ;) -GD
+ */
+ if (give_modes && (get_ignore(user->nick) == NULL)
+ && (!user->na || !(user->na->nc->flags & NI_AUTOOP))) {
+ if (ircd->owner && is_founder(user, ci))
+ add_modes |= CUS_OWNER;
+ else if ((ircd->protect || ircd->admin)
+ && check_access(user, ci, CA_AUTOPROTECT))
+ add_modes |= CUS_PROTECT;
+ if (check_access(user, ci, CA_AUTOOP))
+ add_modes |= CUS_OP;
+ else if (ircd->halfop && check_access(user, ci, CA_AUTOHALFOP))
+ add_modes |= CUS_HALFOP;
+ else if (check_access(user, ci, CA_AUTOVOICE))
+ add_modes |= CUS_VOICE;
+ }
+
+ /* We check if every mode they have is legally acquired here, and remove
+ * the modes that they're not allowed to have. But only if SECUREOPS is
+ * on, because else every mode is legal. -GD
+ * Unless the channel has just been created. -heinz
+ * Or the user matches CA_AUTODEOP... -GD
+ */
+ if (((ci->flags & CI_SECUREOPS) || (c->usercount == 1)
+ || check_access(user, ci, CA_AUTODEOP))
+ && !is_ulined(user->server->name)) {
+ if (ircd->owner && (status & CUS_OWNER) && !is_founder(user, ci))
+ rem_modes |= CUS_OWNER;
+ if ((ircd->protect || ircd->admin) && (status & CUS_PROTECT)
+ && !check_access(user, ci, CA_AUTOPROTECT)
+ && !check_access(user, ci, CA_PROTECTME))
+ rem_modes |= CUS_PROTECT;
+ if ((status & CUS_OP) && !check_access(user, ci, CA_AUTOOP)
+ && !check_access(user, ci, CA_OPDEOPME))
+ rem_modes |= CUS_OP;
+ if (ircd->halfop && (status & CUS_HALFOP)
+ && !check_access(user, ci, CA_AUTOHALFOP)
+ && !check_access(user, ci, CA_HALFOPME))
+ rem_modes |= CUS_HALFOP;
+ }
+
+ /* No modes to add or remove, exit function -GD */
+ if (!add_modes && !rem_modes)
+ return;
+
+ /* No need for strn* functions for modebuf, as every possible string
+ * will always fit in. -GD
+ */
+ strcpy(modebuf, "");
+ strcpy(userbuf, "");
+ if (add_modes > 0) {
+ strcat(modebuf, "+");
+ if ((add_modes & CUS_OWNER) && !(status & CUS_OWNER)) {
+ tmp = stripModePrefix(ircd->ownerset);
+ strcat(modebuf, tmp);
+ free(tmp);
+ strcat(userbuf, " ");
+ strcat(userbuf, user->nick);
+ } else {
+ add_modes &= ~CUS_OWNER;
+ }
+ if ((add_modes & CUS_PROTECT) && !(status & CUS_PROTECT)) {
+ tmp = stripModePrefix(ircd->adminset);
+ strcat(modebuf, tmp);
+ free(tmp);
+ strcat(userbuf, " ");
+ strcat(userbuf, user->nick);
+ } else {
+ add_modes &= ~CUS_PROTECT;
+ }
+ if ((add_modes & CUS_OP) && !(status & CUS_OP)) {
+ strcat(modebuf, "o");
+ strcat(userbuf, " ");
+ strcat(userbuf, user->nick);
+ rem_modes |= CUS_DEOPPED;
+ } else {
+ add_modes &= ~CUS_OP;
+ }
+ if ((add_modes & CUS_HALFOP) && !(status & CUS_HALFOP)) {
+ strcat(modebuf, "h");
+ strcat(userbuf, " ");
+ strcat(userbuf, user->nick);
+ } else {
+ add_modes &= ~CUS_HALFOP;
+ }
+ if ((add_modes & CUS_VOICE) && !(status & CUS_VOICE)) {
+ strcat(modebuf, "v");
+ strcat(userbuf, " ");
+ strcat(userbuf, user->nick);
+ } else {
+ add_modes &= ~CUS_VOICE;
+ }
+ }
+ if (rem_modes > 0) {
+ strcat(modebuf, "-");
+ if (rem_modes & CUS_OWNER) {
+ tmp = stripModePrefix(ircd->ownerset);
+ strcat(modebuf, tmp);
+ free(tmp);
+ strcat(userbuf, " ");
+ strcat(userbuf, user->nick);
+ }
+ if (rem_modes & CUS_PROTECT) {
+ tmp = stripModePrefix(ircd->adminset);
+ strcat(modebuf, tmp);
+ free(tmp);
+ strcat(userbuf, " ");
+ strcat(userbuf, user->nick);
+ }
+ if (rem_modes & CUS_OP) {
+ strcat(modebuf, "o");
+ strcat(userbuf, " ");
+ strcat(userbuf, user->nick);
+ add_modes |= CUS_DEOPPED;
+ }
+ if (rem_modes & CUS_HALFOP) {
+ strcat(modebuf, "h");
+ strcat(userbuf, " ");
+ strcat(userbuf, user->nick);
+ }
+ }
+
+ /* Here, both can be empty again due to the "isn't it set already?"
+ * checks above. -GD
+ */
+ if (!add_modes && !rem_modes)
+ return;
+
+ anope_cmd_mode(whosends(ci), c->name, "%s%s", modebuf, userbuf);
+ if (add_modes > 0)
+ chan_set_user_status(c, user, add_modes);
+ if (rem_modes > 0)
+ chan_remove_user_status(c, user, rem_modes);
+}
+
+/*************************************************************************/
+
+/* 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.
+ */
+
+void chan_adduser2(User * user, Channel * c)
+{
+ struct c_userlist *u;
+
+ 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);
+ }
+ }
+ /* Added channelname to entrymsg - 30.03.2004, Certus */
+ /* Also, don't send the entrymsg when bursting -GD */
+ if (c->ci && c->ci->entry_message && is_sync(user->server))
+ notice_user(whosends(c->ci), user, "[%s] %s", c->name,
+ c->ci->entry_message);
+ }
+
+ /**
+ * We let the bot join even if it was an ignored user, as if we don't,
+ * and the ignored user dosnt just leave, the bot will never
+ * make it into the channel, leaving the channel botless even for
+ * legit users - Rob
+ **/
+ 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)) {
+ /* Only display the greet if the main uplink we're connected
+ * to has synced, or we'll get greet-floods when the net
+ * recovers from a netsplit. -GD
+ */
+ if (is_sync(user->server)) {
+ anope_cmd_privmsg(c->ci->bi->nick, c->name, "[%s] %s",
+ 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). */
+
+Channel *chan_create(char *chan, time_t ts)
+{
+ 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 = ts;
+ /* 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);
+ stick_all(c->ci);
+ }
+
+ if (serv_uplink && is_sync(serv_uplink) && (!(c->topic_sync))) {
+ restore_topic(chan);
+ }
+
+ return c;
+}
+
+/*************************************************************************/
+
+/* This destroys the channel structure, freeing everything in it. */
+
+void chan_delete(Channel * c)
+{
+ BanData *bd, *next;
+
+ 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);
+ if (ircd->fmode) {
+ if (c->flood)
+ free(c->flood);
+ }
+ if (ircd->Lmode) {
+ if (c->redirect)
+ free(c->redirect);
+ }
+
+ if (c->bans && c->bans->count) {
+ while (c->bans->entries) {
+ entry_delete(c->bans, c->bans->entries);
+ }
+ }
+
+ if (ircd->except) {
+ if (c->excepts && c->excepts->count) {
+ while (c->excepts->entries) {
+ entry_delete(c->excepts, c->excepts->entries);
+ }
+ }
+ }
+
+ if (ircd->invitemode) {
+ if (c->invites && c->invites->count) {
+ while (c->invites->entries) {
+ entry_delete(c->invites, c->invites->entries);
+ }
+ }
+ }
+
+ 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);
+}
+
+/*************************************************************************/
+
+void del_ban(Channel * chan, char *mask)
+{
+ AutoKick *akick;
+ Entry *ban;
+
+ /* Sanity check as it seems some IRCD will just send -b without a mask */
+ if (!mask || !chan->bans || (chan->bans->count == 0))
+ return;
+
+ ban = elist_find_mask(chan->bans, mask);
+
+ if (ban) {
+ entry_delete(chan->bans, ban);
+
+ 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);
+}
+
+/*************************************************************************/
+
+void del_exception(Channel * chan, char *mask)
+{
+ Entry *exception;
+
+ /* Sanity check as it seems some IRCD will just send -e without a mask */
+ if (!mask || !chan->excepts || (chan->excepts->count == 0))
+ return;
+
+ exception = elist_find_mask(chan->excepts, mask);
+
+ if (exception) {
+ entry_delete(chan->excepts, exception);
+
+ if (debug)
+ alog("debug: Deleted except %s to channel %s", mask,
+ chan->name);
+ }
+}
+
+/*************************************************************************/
+
+void del_invite(Channel * chan, char *mask)
+{
+ Entry *invite;
+
+ /* Sanity check as it seems some IRCD will just send -I without a mask */
+ if (!mask || !chan->invites || (chan->invites->count == 0)) {
+ return;
+ }
+
+ invite = elist_find_mask(chan->invites, mask);
+
+ if (invite) {
+ entry_delete(chan->invites, invite);
+
+ if (debug)
+ alog("debug: Deleted invite %s to channel %s", mask,
+ chan->name);
+ }
+}
+
+
+/*************************************************************************/
+
+char *get_flood(Channel * chan)
+{
+ return chan->flood;
+}
+
+/*************************************************************************/
+
+char *get_key(Channel * chan)
+{
+ return chan->key;
+}
+
+/*************************************************************************/
+
+char *get_limit(Channel * chan)
+{
+ static char limit[16];
+
+ if (chan->limit == 0)
+ return NULL;
+
+ snprintf(limit, sizeof(limit), "%lu", (unsigned long int) chan->limit);
+ return limit;
+}
+
+/*************************************************************************/
+
+char *get_redirect(Channel * chan)
+{
+ return chan->redirect;
+}
+
+/*************************************************************************/
+
+Channel *join_user_update(User * user, Channel * chan, char *name,
+ time_t chants)
+{
+ struct u_chanlist *c;
+
+ /* If it's a new channel, so we need to create it first. */
+ if (!chan)
+ chan = chan_create(name, chants);
+
+ 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;
+}
+
+/*************************************************************************/
+
+void set_flood(Channel * chan, char *value)
+{
+ if (chan->flood)
+ free(chan->flood);
+ chan->flood = value ? sstrdup(value) : NULL;
+
+ if (debug)
+ alog("debug: Flood mode for channel %s set to %s", chan->name,
+ chan->flood ? chan->flood : "no flood settings");
+}
+
+/*************************************************************************/
+
+void chan_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");
+}
+
+/*************************************************************************/
+
+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);
+}
+
+/*************************************************************************/
+
+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");
+}
+
+void do_mass_mode(char *modes)
+{
+ int ac;
+ 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 (c = firstchan(); c; c = nextchan()) {
+ if (c->bouncy_modes) {
+ free(av);
+ free(myModes);
+ return;
+ } else {
+ anope_cmd_mode(s_OperServ, c->name, "%s", modes);
+ chan_set_modes(s_OperServ, c, ac, av, 1);
+ }
+ }
+ free(av);
+ free(myModes);
+}
+
+/*************************************************************************/
+
+void restore_unsynced_topics(void)
+{
+ Channel *c;
+
+ for (c = firstchan(); c; c = nextchan()) {
+ if (!(c->topic_sync))
+ restore_topic(c->name);
+ }
+}
+
+/*************************************************************************/
+
+/**
+ * This handles creating a new Entry.
+ * This function destroys and free's the given mask as a side effect.
+ * @param mask Host/IP/CIDR mask to convert to an entry
+ * @return Entry struct for the given mask, NULL if creation failed
+ */
+Entry *entry_create(char *mask)
+{
+ Entry *entry;
+ char *nick = NULL, *user, *host, *cidrhost;
+ uint32 ip, cidr;
+
+ entry = scalloc(1, sizeof(Entry));
+ entry->type = ENTRYTYPE_NONE;
+ entry->prev = NULL;
+ entry->next = NULL;
+ entry->nick = NULL;
+ entry->user = NULL;
+ entry->host = NULL;
+ entry->mask = sstrdup(mask);
+
+ host = strchr(mask, '@');
+ if (host) {
+ *host++ = '\0';
+ /* If the user is purely a wildcard, ignore it */
+ if (str_is_pure_wildcard(mask))
+ user = NULL;
+ else {
+
+ /* There might be a nick too */
+ user = strchr(mask, '!');
+ if (user) {
+ *user++ = '\0';
+ /* If the nick is purely a wildcard, ignore it */
+ if (str_is_pure_wildcard(mask))
+ nick = NULL;
+ else
+ nick = mask;
+ } else {
+ nick = NULL;
+ user = mask;
+ }
+ }
+ } else {
+ /* It is possibly an extended ban/invite mask, but we do
+ * not support these at this point.. ~ Viper */
+ /* If there's no user in the mask, assume a pure wildcard */
+ user = NULL;
+ host = mask;
+ }
+
+ if (nick) {
+ entry->nick = sstrdup(nick);
+ /* Check if we have a wildcard user */
+ if (str_is_wildcard(nick))
+ entry->type |= ENTRYTYPE_NICK_WILD;
+ else
+ entry->type |= ENTRYTYPE_NICK;
+ }
+
+ if (user) {
+ entry->user = sstrdup(user);
+ /* Check if we have a wildcard user */
+ if (str_is_wildcard(user))
+ entry->type |= ENTRYTYPE_USER_WILD;
+ else
+ entry->type |= ENTRYTYPE_USER;
+ }
+
+ /* Only check the host if it's not a pure wildcard */
+ if (*host && !str_is_pure_wildcard(host)) {
+ if (ircd->cidrchanbei && str_is_cidr(host, &ip, &cidr, &cidrhost)) {
+ entry->cidr_ip = ip;
+ entry->cidr_mask = cidr;
+ entry->type |= ENTRYTYPE_CIDR4;
+ host = cidrhost;
+ } else if (ircd->cidrchanbei && strchr(host, '/')) {
+ /* Most IRCd's don't enforce sane bans therefore it is not
+ * so unlikely we will encounter this.
+ * Currently we only support strict CIDR without taking into
+ * account quirks of every single ircd (nef) that ignore everything
+ * after the first /cidr. To add this, sanitaze before sending to
+ * str_is_cidr() as this expects a standard cidr.
+ * Add it to the internal list (so it is included in for example clear)
+ * but do not use if during matching.. ~ Viper */
+ entry->type = ENTRYTYPE_NONE;
+ } else {
+ entry->host = sstrdup(host);
+ if (str_is_wildcard(host))
+ entry->type |= ENTRYTYPE_HOST_WILD;
+ else
+ entry->type |= ENTRYTYPE_HOST;
+ }
+ }
+ free(mask);
+
+ return entry;
+}
+
+
+/**
+ * Create an entry and add it at the beginning of given list.
+ * @param list The List the mask should be added to
+ * @param mask The mask to parse and add to the list
+ * @return Pointer to newly added entry. NULL if it fails.
+ */
+Entry *entry_add(EList * list, char *mask)
+{
+ Entry *e;
+ char *hostmask;
+
+ hostmask = sstrdup(mask);
+ e = entry_create(hostmask);
+
+ if (!e)
+ return NULL;
+
+ e->next = list->entries;
+ e->prev = NULL;
+
+ if (list->entries)
+ list->entries->prev = e;
+ list->entries = e;
+ list->count++;
+
+ return e;
+}
+
+
+/**
+ * Delete the given entry from a given list.
+ * @param list Linked list from which entry needs to be removed.
+ * @param e The entry to be deleted, must be member of list.
+ */
+void entry_delete(EList * list, Entry * e)
+{
+ if (!list || !e)
+ return;
+
+ if (e->next)
+ e->next->prev = e->prev;
+ if (e->prev)
+ e->prev->next = e->next;
+
+ if (list->entries == e)
+ list->entries = e->next;
+
+ if (e->nick)
+ free(e->nick);
+ if (e->user)
+ free(e->user);
+ if (e->host)
+ free(e->host);
+ free(e->mask);
+ free(e);
+
+ list->count--;
+}
+
+
+/**
+ * Create and initialize a new entrylist
+ * @return Pointer to the created EList object
+ **/
+EList *list_create()
+{
+ EList *list;
+
+ list = scalloc(1, sizeof(EList));
+ list->entries = NULL;
+ list->count = 0;
+
+ return list;
+}
+
+
+/**
+ * Match the given Entry to the given user/host and optional IP addy
+ * @param e Entry struct to match against
+ * @param nick Nick to match against
+ * @param user User to match against
+ * @param host Host to match against
+ * @param ip IP to match against, set to 0 to not match this
+ * @return 1 for a match, 0 for no match
+ */
+int entry_match(Entry * e, char *nick, char *user, char *host, uint32 ip)
+{
+ /* If we don't get an entry, or it s an invalid one, no match ~ Viper */
+ if (!e || e->type == ENTRYTYPE_NONE)
+ return 0;
+
+ if (ircd->cidrchanbei && (e->type & ENTRYTYPE_CIDR4) &&
+ (!ip || (ip && ((ip & e->cidr_mask) != e->cidr_ip))))
+ return 0;
+ if ((e->type & ENTRYTYPE_NICK)
+ && (!nick || stricmp(e->nick, nick) != 0))
+ return 0;
+ if ((e->type & ENTRYTYPE_USER)
+ && (!user || stricmp(e->user, user) != 0))
+ return 0;
+ if ((e->type & ENTRYTYPE_HOST)
+ && (!user || stricmp(e->host, host) != 0))
+ return 0;
+ if ((e->type & ENTRYTYPE_NICK_WILD)
+ && !match_wild_nocase(e->nick, nick))
+ return 0;
+ if ((e->type & ENTRYTYPE_USER_WILD)
+ && !match_wild_nocase(e->user, user))
+ return 0;
+ if ((e->type & ENTRYTYPE_HOST_WILD)
+ && !match_wild_nocase(e->host, host))
+ return 0;
+
+ return 1;
+}
+
+/**
+ * Match the given Entry to the given hostmask and optional IP addy.
+ * @param e Entry struct to match against
+ * @param mask Hostmask to match against
+ * @param ip IP to match against, set to 0 to not match this
+ * @return 1 for a match, 0 for no match
+ */
+int entry_match_mask(Entry * e, char *mask, uint32 ip)
+{
+ char *hostmask, *nick, *user, *host;
+ int res;
+
+ hostmask = sstrdup(mask);
+
+ host = strchr(hostmask, '@');
+ if (host) {
+ *host++ = '\0';
+ user = strchr(hostmask, '!');
+ if (user) {
+ *user++ = '\0';
+ nick = hostmask;
+ } else {
+ nick = NULL;
+ user = hostmask;
+ }
+ } else {
+ nick = NULL;
+ user = NULL;
+ host = hostmask;
+ }
+
+ res = entry_match(e, nick, user, host, ip);
+
+ /* Free the destroyed mask. */
+ free(hostmask);
+
+ return res;
+}
+
+/**
+ * Match a nick, user, host, and ip to a list entry
+ * @param e List that should be matched against
+ * @param nick The nick to match
+ * @param user The user to match
+ * @param host The host to match
+ * @param ip The ip to match
+ * @return Returns the first matching entry, if none, NULL is returned.
+ */
+Entry *elist_match(EList * list, char *nick, char *user, char *host,
+ uint32 ip)
+{
+ Entry *e;
+
+ if (!list || !list->entries)
+ return NULL;
+
+ for (e = list->entries; e; e = e->next) {
+ if (entry_match(e, nick, user, host, ip))
+ return e;
+ }
+
+ /* We matched none */
+ return NULL;
+}
+
+/**
+ * Match a mask and ip to a list.
+ * @param list EntryList that should be matched against
+ * @param mask The nick!user@host mask to match
+ * @param ip The ip to match
+ * @return Returns the first matching entry, if none, NULL is returned.
+ */
+Entry *elist_match_mask(EList * list, char *mask, uint32 ip)
+{
+ char *hostmask, *nick, *user, *host;
+ Entry *res;
+
+ if (!list || !list->entries || !mask)
+ return NULL;
+
+ hostmask = sstrdup(mask);
+
+ host = strchr(hostmask, '@');
+ if (host) {
+ *host++ = '\0';
+ user = strchr(hostmask, '!');
+ if (user) {
+ *user++ = '\0';
+ nick = hostmask;
+ } else {
+ nick = NULL;
+ user = hostmask;
+ }
+ } else {
+ nick = NULL;
+ user = NULL;
+ host = hostmask;
+ }
+
+ res = elist_match(list, nick, user, host, ip);
+
+ /* Free the destroyed mask. */
+ free(hostmask);
+
+ return res;
+}
+
+/**
+ * Check if a user matches an entry on a list.
+ * @param list EntryList that should be matched against
+ * @param user The user to match against the entries
+ * @return Returns the first matching entry, if none, NULL is returned.
+ */
+Entry *elist_match_user(EList * list, User * u)
+{
+ Entry *res;
+ char *host;
+ uint32 ip = 0;
+
+ if (!list || !list->entries || !u)
+ return NULL;
+
+ if (u->hostip == NULL) {
+ host = host_resolve(u->host);
+ /* we store the just resolved hostname so we don't
+ * need to do this again */
+ if (host) {
+ u->hostip = sstrdup(host);
+ }
+ } else {
+ host = sstrdup(u->hostip);
+ }
+
+ /* Convert the host to an IP.. */
+ if (host)
+ ip = str_is_ip(host);
+
+ /* Match what we ve got against the lists.. */
+ res = elist_match(list, u->nick, u->username, u->host, ip);
+ if (!res)
+ elist_match(list, u->nick, u->username, u->vhost, ip);
+
+ if (host)
+ free(host);
+
+ return res;
+}
+
+/**
+ * Find a entry identical to the given mask..
+ * @param list EntryList that should be matched against
+ * @param mask The *!*@* mask to match
+ * @return Returns the first matching entry, if none, NULL is returned.
+ */
+Entry *elist_find_mask(EList * list, char *mask)
+{
+ Entry *e;
+
+ if (!list || !list->entries || !mask)
+ return NULL;
+
+ for (e = list->entries; e; e = e->next) {
+ if (!stricmp(e->mask, mask))
+ return e;
+ }
+
+ return NULL;
+}
+
+/**
+ * Gets the total memory use of an entrylit.
+ * @param list The list we should estimate the mem use of.
+ * @return Returns the memory useage of the given list.
+ */
+long get_memuse(EList * list)
+{
+ Entry *e;
+ long mem = 0;
+
+ if (!list)
+ return 0;
+
+ mem += sizeof(EList *);
+ mem += sizeof(Entry *) * list->count;
+ if (list->entries) {
+ for (e = list->entries; e; e = e->next) {
+ if (e->nick)
+ mem += strlen(e->nick) + 1;
+ if (e->user)
+ mem += strlen(e->user) + 1;
+ if (e->host)
+ mem += strlen(e->host) + 1;
+ if (e->mask)
+ mem += strlen(e->mask) + 1;
+ }
+ }
+
+ return mem;
+}
+
+/*************************************************************************/
diff --git a/src/chanserv.c b/src/chanserv.c
new file mode 100644
index 000000000..98f3b9391
--- /dev/null
+++ b/src/chanserv.c
@@ -0,0 +1,2674 @@
+/* ChanServ functions.
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+
+/*************************************************************************/
+
+#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 }
+};
+
+
+LevelInfo levelinfo[] = {
+ { CA_AUTODEOP, "AUTODEOP", CHAN_LEVEL_AUTODEOP },
+ { CA_AUTOHALFOP, "AUTOHALFOP", CHAN_LEVEL_AUTOHALFOP },
+ { CA_AUTOOP, "AUTOOP", CHAN_LEVEL_AUTOOP },
+ { CA_AUTOPROTECT, "", CHAN_LEVEL_AUTOPROTECT },
+ { 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 },
+ { CA_HALFOP, "HALFOP", CHAN_LEVEL_HALFOP },
+ { CA_HALFOPME, "HALFOPME", CHAN_LEVEL_HALFOPME },
+ { 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 },
+ { CA_PROTECT, "", CHAN_LEVEL_PROTECT },
+ { CA_PROTECTME, "", CHAN_LEVEL_PROTECTME },
+ { 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 }
+};
+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 },
+ { "DEHALFOP", "dehalfop", "-h", 0, CA_HALFOP, CA_HALFOPME },
+ { "HALFOP", "halfop", "+h", 0, CA_HALFOP, CA_HALFOPME },
+ { "DEPROTECT", "", "", 0, CA_PROTECT, CA_PROTECTME },
+ { "PROTECT", "", "", 0, CA_PROTECT, CA_PROTECTME },
+ { NULL }
+};
+
+/*************************************************************************/
+
+void moduleAddChanServCmds(void) {
+ modules_core_init(ChanServCoreNumber, ChanServCoreModules);
+}
+
+/* *INDENT-ON* */
+/*************************************************************************/
+/*************************************************************************/
+
+/* Returns modes for mlock in a nice way. */
+
+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));
+ }
+ if (ci->flags & CI_SUSPENDED) {
+ printf
+ ("This nickname is currently suspended by %s, reason: %s\n",
+ ci->forbidby,
+ (ci->forbidreason ? ci->forbidreason : "No reason"));
+ }
+ }
+
+ } 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->flags & CI_SUSPENDED ?
+ "Disallowed (SUSPENDED)" :
+ 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;
+ if (ircd->fmode) {
+ if (ci->mlock_flood)
+ mem += strlen(ci->mlock_flood) + 1;
+ }
+ if (ircd->Lmode) {
+ if (ci->mlock_redirect)
+ mem += strlen(ci->mlock_redirect) + 1;
+ }
+ 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)
+{
+ moduleAddChanServCmds();
+}
+
+/*************************************************************************/
+
+/* 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 = "";
+ }
+ anope_cmd_ctcp(s_ChanServ, u->nick, "PING %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++) {
+ uint16 tmp16;
+ uint32 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));
+
+ /* 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++) {
+ SAFE(read_int16(&tmp16, f));
+ if (j < CA_SIZE)
+ ci->levels[j] = (int16) tmp16;
+ }
+ /* 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(&tmp16, f));
+ ci->access[j].level = (int16) tmp16;
+ 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) {
+ if (ircd->fmode) {
+ SAFE(read_string(&ci->mlock_flood, f));
+ } else {
+ SAFE(read_string(&s, f));
+ if (s)
+ free(s);
+ }
+ if (ircd->Lmode) {
+ SAFE(read_string(&ci->mlock_redirect, f));
+ } else {
+ SAFE(read_string(&s, f));
+ if (s)
+ free(s);
+ }
+ }
+
+ SAFE(read_int16(&tmp16, f));
+ ci->memos.memocount = (int16) tmp16;
+ SAFE(read_int16(&tmp16, f));
+ ci->memos.memomax = (int16) tmp16;
+ 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));
+ memos->moduleData = NULL;
+ }
+ }
+
+ 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++) {
+ SAFE(read_int16(&tmp16, f));
+ if (j < TTB_SIZE)
+ ci->ttb[j] = (int16) tmp16;
+ }
+ 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) { \
+ anope_cmd_global(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));
+ if (ircd->fmode) {
+ SAFE(write_string(ci->mlock_flood, f));
+ } else {
+ SAFE(write_string(NULL, f));
+ }
+ if (ircd->Lmode) {
+ SAFE(write_string(ci->mlock_redirect, f));
+ } else {
+ SAFE(write_string(NULL, f));
+ }
+ 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;
+
+ if (rdb_tag_table("anope_cs_info") == 0) {
+ alog("Unable to tag table 'anope_cs_info' - ChanServ RDB save failed.");
+ rdb_close();
+ return;
+ }
+ if (rdb_tag_table("anope_cs_access") == 0) {
+ alog("Unable to tag table 'anope_cs_access' - ChanServ RDB save failed.");
+ rdb_close();
+ return;
+ }
+ if (rdb_tag_table("anope_cs_levels") == 0) {
+ alog("Unable to tag table 'anope_cs_levels' - ChanServ RDB save failed.");
+ rdb_close();
+ return;
+ }
+ if (rdb_tag_table("anope_cs_akicks") == 0) {
+ alog("Unable to tag table 'anope_cs_akicks' - ChanServ RDB save failed.");
+ rdb_close();
+ return;
+ }
+ if (rdb_tag_table("anope_cs_badwords") == 0) {
+ alog("Unable to tag table 'anope_cs_badwords' - ChanServ RDB save failed.");
+ rdb_close();
+ return;
+ }
+ if (rdb_tag_table("anope_cs_ttb") == 0) {
+ alog("Unable to tag table 'anope_cs_ttb' - ChanServ RDB save failed.");
+ rdb_close();
+ return;
+ }
+ if (rdb_tag_table_where("anope_ms_info", "serv='CHAN'") == 0) {
+ alog("Unable to tag table 'anope_ms_info' - ChanServ RDB save failed.");
+ rdb_close();
+ return;
+ }
+
+ for (i = 0; i < 256; i++) {
+ for (ci = chanlists[i]; ci; ci = ci->next) {
+ if (rdb_save_cs_info(ci) == 0) {
+ alog("Unable to save ChanInfo for %s - ChanServ RDB save failed.", ci->name);
+ rdb_close();
+ return;
+ }
+ } /* for (chanlists[i]) */
+ } /* for (i) */
+
+ if (rdb_clean_table("anope_cs_info") == 0) {
+ alog("Unable to clean table 'anope_cs_info' - ChanServ RDB save failed.");
+ rdb_close();
+ return;
+ }
+ if (rdb_clean_table("anope_cs_access") == 0) {
+ alog("Unable to clean table 'anope_cs_access' - ChanServ RDB save failed.");
+ rdb_close();
+ return;
+ }
+ if (rdb_clean_table("anope_cs_levels") == 0) {
+ alog("Unable to clean table 'anope_cs_levels' - ChanServ RDB save failed.");
+ rdb_close();
+ return;
+ }
+ if (rdb_clean_table("anope_cs_akicks") == 0) {
+ alog("Unable to clean table 'anope_cs_akicks' - ChanServ RDB save failed.");
+ rdb_close();
+ return;
+ }
+ if (rdb_clean_table("anope_cs_badwords") == 0) {
+ alog("Unable to clean table 'anope_cs_badwords' - ChanServ RDB save failed.");
+ rdb_close();
+ return;
+ }
+ if (rdb_clean_table("anope_cs_ttb") == 0) {
+ alog("Unable to clean table 'anope_cs_ttb' - ChanServ RDB save failed.");
+ rdb_close();
+ return;
+ }
+ if (rdb_clean_table_where("anope_ms_info", "serv='CHAN'") == 0)
+ alog("Unable to clean table 'anope_ms_info' - ChanServ RDB save failed.");
+
+ rdb_close();
+#endif
+}
+
+/*************************************************************************/
+
+/* Check the current modes on a channel; if they conflict with a mode lock,
+ * fix them.
+ *
+ * Also check to make sure that every mode set or unset is allowed by the
+ * defcon mlock settings. This is more important than any normal channel
+ * mlock'd mode. --gdex (21-04-07)
+ */
+
+void check_modes(Channel * c)
+{
+ char modebuf[64], argbuf[BUFSIZE], *end = modebuf, *end2 = argbuf;
+ uint32 modes;
+ ChannelInfo *ci;
+ CBModeInfo *cbmi;
+ CBMode *cbm;
+
+ if (!c) {
+ if (debug) {
+ alog("debug: check_modes called with NULL values");
+ }
+ return;
+ }
+
+ if (c->bouncy_modes)
+ return;
+
+ /* Check for mode bouncing */
+ if (c->server_modecount >= 3 && c->chanserv_modecount >= 3) {
+ anope_cmd_global(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++;
+
+ /* Check if the channel is registered; if not remove mode -r */
+ if (!(ci = c->ci)) {
+ if (ircd->regmode) {
+ if (c->mode & ircd->regmode) {
+ c->mode &= ~ircd->regmode;
+ anope_cmd_mode(whosends(ci), c->name, "-r");
+ }
+ }
+ return;
+ }
+
+ /* Initialize te modes-var to set all modes not set yet but which should
+ * be set as by mlock and defcon.
+ */
+ modes = ~c->mode & ci->mlock_on;
+ if (DefConModesSet)
+ modes |= (~c->mode & DefConModesOn);
+
+ /* Initialize the buffers */
+ *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;
+ /* Check if it's a defcon or mlock mode */
+ if (DefConModesOn & cbmi->flag)
+ value = cbmi->csgetvalue(&DefConModesCI);
+ else
+ 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)
+ || (DefConModesOn & cbmi->flag))
+ && (c->mode & cbmi->flag)) {
+ char *value = cbmi->getvalue(c);
+ char *csvalue;
+
+ /* Check if it's a defcon or mlock mode */
+ if (DefConModesOn & cbmi->flag)
+ csvalue = cbmi->csgetvalue(&DefConModesCI);
+ else
+ 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 (DefConModesSet)
+ modes |= (~c->mode & DefConModesOff);
+
+ 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;
+
+ anope_cmd_mode(whosends(ci), c->name, "%s%s", modebuf,
+ (end2 == argbuf ? "" : argbuf));
+}
+
+/*************************************************************************/
+
+int check_valid_admin(User * user, Channel * chan, int servermode)
+{
+ if (!chan || !chan->ci)
+ return 1;
+
+ if (!ircd->admin) {
+ return 0;
+ }
+
+ /* 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);
+ anope_cmd_mode(whosends(chan->ci), chan->name, "%s %s",
+ ircd->adminunset, user->nick);
+ return 0;
+ }
+
+ if (check_access(user, chan->ci, CA_AUTODEOP)) {
+ anope_cmd_mode(whosends(chan->ci), chan->name, "%s %s",
+ ircd->adminunset, user->nick);
+ return 0;
+ }
+
+ return 1;
+}
+
+/*************************************************************************/
+
+/* 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)
+{
+ char *tmp;
+ if (!chan || !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);
+ if (ircd->halfop) {
+ if (ircd->owner && ircd->protect) {
+ if (check_access(user, chan->ci, CA_AUTOHALFOP)) {
+ tmp = stripModePrefix(ircd->ownerunset);
+ anope_cmd_mode(whosends(chan->ci), chan->name,
+ "%so%s %s %s %s", ircd->adminunset,
+ tmp, user->nick,
+ user->nick, user->nick);
+ free(tmp);
+ } else {
+ tmp = stripModePrefix(ircd->ownerunset);
+ anope_cmd_mode(whosends(chan->ci), chan->name,
+ "%sho%s %s %s %s %s",
+ ircd->adminunset, tmp,
+ user->nick, user->nick, user->nick,
+ user->nick);
+ free(tmp);
+ }
+ } else if (!ircd->owner && ircd->protect) {
+ if (check_access(user, chan->ci, CA_AUTOHALFOP)) {
+ anope_cmd_mode(whosends(chan->ci), chan->name,
+ "%so %s %s", ircd->adminunset,
+ user->nick, user->nick);
+ } else {
+ anope_cmd_mode(whosends(chan->ci), chan->name,
+ "%soh %s %s %s", ircd->adminunset,
+ user->nick, user->nick, user->nick);
+ }
+ } else {
+ if (check_access(user, chan->ci, CA_AUTOHALFOP)) {
+ anope_cmd_mode(whosends(chan->ci), chan->name, "-o %s",
+ user->nick);
+ } else {
+ anope_cmd_mode(whosends(chan->ci), chan->name,
+ "-ho %s %s", user->nick, user->nick);
+ }
+ }
+ } else {
+ anope_cmd_mode(whosends(chan->ci), chan->name, "-o %s",
+ user->nick);
+ }
+ return 0;
+ }
+
+ if (check_access(user, chan->ci, CA_AUTODEOP)) {
+ if (ircd->halfop) {
+ if (ircd->owner && ircd->protect) {
+ tmp = stripModePrefix(ircd->ownerunset);
+ anope_cmd_mode(whosends(chan->ci), chan->name,
+ "%sho%s %s %s %s %s", ircd->adminunset,
+ tmp, user->nick, user->nick,
+ user->nick, user->nick);
+ free(tmp);
+ } else {
+ anope_cmd_mode(whosends(chan->ci), chan->name, "-ho %s %s",
+ user->nick, user->nick);
+ }
+ } else {
+ anope_cmd_mode(whosends(chan->ci), chan->name, "-o %s",
+ user->nick);
+ }
+ 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, 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)) {
+ anope_cmd_mode(whosends(ci), chan, "+o %s", 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, 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)) {
+ anope_cmd_mode(whosends(ci), chan, "+v %s", user->nick);
+ return 1;
+ }
+
+ return 0;
+}
+
+/*************************************************************************/
+
+int check_should_halfop(User * user, char *chan)
+{
+ ChannelInfo *ci = cs_findchan(chan);
+
+ if (!ci || (ci->flags & CI_VERBOTEN) || *chan == '+')
+ return 0;
+
+ if (check_access(user, ci, CA_AUTOHALFOP)) {
+ anope_cmd_mode(whosends(ci), chan, "+h %s", user->nick);
+ return 1;
+ }
+
+ return 0;
+}
+
+/*************************************************************************/
+
+int check_should_owner(User * user, char *chan)
+{
+ char *tmp;
+ 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))) {
+ tmp = stripModePrefix(ircd->ownerset);
+ anope_cmd_mode(whosends(ci), chan, "+o%s %s %s", tmp, user->nick,
+ user->nick);
+ free(tmp);
+ return 1;
+ }
+
+ return 0;
+}
+
+/*************************************************************************/
+
+int check_should_protect(User * user, char *chan)
+{
+ char *tmp;
+ ChannelInfo *ci = cs_findchan(chan);
+
+ if (!ci || (ci->flags & CI_VERBOTEN) || *chan == '+')
+ return 0;
+
+ if (check_access(user, ci, CA_AUTOPROTECT)) {
+ tmp = stripModePrefix(ircd->adminset);
+ anope_cmd_mode(whosends(ci), chan, "+o%s %s %s", tmp, user->nick,
+ user->nick);
+ free(tmp);
+ return 1;
+ }
+
+ return 0;
+}
+
+/*************************************************************************/
+
+/* 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;
+
+ anope_cmd_part(s_ChanServ, chan, NULL);
+ 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). The channel TS must be given for a new channel.
+ */
+
+int check_kick(User * user, char *chan, time_t chants)
+{
+ ChannelInfo *ci = cs_findchan(chan);
+ Channel *c;
+ AutoKick *akick;
+ int i, set_modes = 0;
+ NickCore *nc;
+ char *av[4];
+ int ac;
+ char buf[BUFSIZE];
+ char mask[BUFSIZE];
+ const char *reason;
+ Timeout *t;
+
+ if (!ci)
+ return 0;
+
+ if (user->isSuperAdmin == 1)
+ 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);
+ set_modes = 1;
+ 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);
+ set_modes = 1;
+ goto kick;
+ }
+
+ if (nick_recognized(user))
+ nc = user->na->nc;
+ else
+ nc = NULL;
+
+ /*
+ * 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 (ircd->except && is_excepted(ci, user) == 1) {
+ return 0;
+ }
+
+ 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 (is_ulined(user->server->name)) {
+ return 0;
+ }
+
+ 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, user->host, 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)) {
+ anope_cmd_join(s_ChanServ, chan, (c ? c->creation_time : chants));
+ /* Lets hide the channel from /list just incase someone does /list
+ * while we are here. - katsklaw
+ * We don't want to block users from joining a legit chan though.. - Viper
+ */
+ if (set_modes)
+ anope_cmd_mode(s_ChanServ, chan, "+ntsi");
+ t = add_timeout(CSInhabit, timeout_leave, 0);
+ t->data = sstrdup(chan);
+ ci->flags |= CI_INHABIT;
+ }
+
+ if (c) {
+ if (ircdcap->tsmode) {
+ snprintf(buf, BUFSIZE - 1, "%ld", (long int) time(NULL));
+ av[0] = chan;
+ av[1] = buf;
+ av[2] = sstrdup("+b");
+ av[3] = mask;
+ ac = 4;
+ } else {
+ av[0] = chan;
+ av[1] = sstrdup("+b");
+ av[2] = mask;
+ ac = 3;
+ }
+
+ do_cmode(whosends(ci), ac, av);
+
+ if (ircdcap->tsmode)
+ free(av[2]);
+ else
+ free(av[1]);
+ }
+
+ anope_cmd_mode(whosends(ci), chan, "+b %s", mask);
+ anope_cmd_kick(whosends(ci), chan, user->nick, "%s", 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(char *chan)
+{
+ Channel *c = findchan(chan);
+ ChannelInfo *ci;
+
+ if (!c || !(ci = c->ci))
+ return;
+ /* We can be sure that the topic will be in sync when we return -GD */
+ c->topic_sync = 1;
+ if (!(ci->flags & CI_KEEPTOPIC)) {
+ /* We need to reset the topic here, since it's currently empty and
+ * should be updated with a TOPIC from the IRCd soon. -GD
+ */
+ ci->last_topic = NULL;
+ strscpy(ci->last_topic_setter, whosends(ci), NICKMAX);
+ ci->last_topic_time = time(NULL);
+ 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, whosends(ci), NICKMAX);
+ }
+ if (ircd->join2set) {
+ if (whosends(ci) == s_ChanServ) {
+ anope_cmd_join(s_ChanServ, chan, c->creation_time);
+ anope_cmd_mode(NULL, chan, "+o %s", s_ChanServ);
+ }
+ }
+ anope_cmd_topic(whosends(ci), c->name, c->topic_setter,
+ c->topic ? c->topic : "", c->topic_time);
+ if (ircd->join2set) {
+ if (whosends(ci) == s_ChanServ) {
+ anope_cmd_part(s_ChanServ, c->name, NULL);
+ }
+ }
+}
+
+/*************************************************************************/
+
+/* 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 (!c) {
+ if (debug) {
+ alog("debug: check_topiclock called with NULL values");
+ }
+ return 0;
+ }
+
+ 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);
+ strscpy(c->topic_setter, ci->last_topic_setter, NICKMAX);
+ } else {
+ c->topic = NULL;
+ /* Bot assigned & Symbiosis ON?, the bot will set the topic - doc */
+ /* Altough whosends() also checks for BSMinUsers -GD */
+ strscpy(c->topic_setter, whosends(ci), NICKMAX);
+ }
+
+ if (ircd->topictsforward) {
+ /* Because older timestamps are rejected */
+ /* Some how the topic_time from do_topic is 0 set it to current + 1 */
+ if (!topic_time) {
+ c->topic_time = time(NULL) + 1;
+ } else {
+ c->topic_time = topic_time + 1;
+ }
+ } else {
+ /* If no last topic, we can't use last topic time! - doc */
+ if (ci->last_topic)
+ c->topic_time = ci->last_topic_time;
+ else
+ c->topic_time = time(NULL) + 1;
+ }
+
+ if (ircd->join2set) {
+ if (whosends(ci) == s_ChanServ) {
+ anope_cmd_join(s_ChanServ, c->name, c->creation_time);
+ anope_cmd_mode(NULL, c->name, "+o %s", s_ChanServ);
+ }
+ }
+
+ anope_cmd_topic(whosends(ci), c->name, c->topic_setter,
+ c->topic ? c->topic : "", c->topic_time);
+
+ if (ircd->join2set) {
+ if (whosends(ci) == s_ChanServ) {
+ anope_cmd_part(s_ChanServ, c->ci->name, NULL);
+ }
+ }
+ 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 | CI_SUSPENDED)))
+ {
+ send_event(EVENT_CHAN_EXPIRE, 1, ci->name);
+ 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, k;
+ 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++;
+ }
+ } else {
+ alog("%s: Deleting channel %s owned by deleted nick %s", s_ChanServ, ci->name, nc->display);
+ if (ircd->regmode) {
+ /* Maybe move this to delchan() ? */
+ if ((ci->c) && (ci->c->mode & ircd->regmode)) {
+ ci->c->mode &= ~ircd->regmode;
+ anope_cmd_mode(whosends(ci), ci->name, "-r");
+ }
+ }
+
+ 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 = 0; j < ci->akickcount; 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->addtime = 0;
+ akick->u.nc = NULL;
+
+ /* Only one occurance can exist in every akick list.. ~ Viper */
+ break;
+ }
+ }
+
+ /* Are there any akicks behind us?
+ * If so, move all following akicks.. ~ Viper */
+ if (j < ci->akickcount - 1) {
+ for (k = j + 1; k < ci->akickcount; j++, k++) {
+ if (ci->akick[k].flags & AK_USED) {
+ /* Move the akick one place ahead and clear the original */
+ if (ci->akick[k].flags & AK_ISNICK) {
+ ci->akick[j].u.nc = ci->akick[k].u.nc;
+ ci->akick[k].u.nc = NULL;
+ } else {
+ ci->akick[j].u.mask = sstrdup(ci->akick[k].u.mask);
+ free(ci->akick[k].u.mask);
+ ci->akick[k].u.mask = NULL;
+ }
+
+ if (ci->akick[k].reason) {
+ ci->akick[j].reason = sstrdup(ci->akick[k].reason);
+ free(ci->akick[k].reason);
+ ci->akick[k].reason = NULL;
+ } else
+ ci->akick[j].reason = NULL;
+
+ ci->akick[j].creator = sstrdup(ci->akick[k].creator);
+ free(ci->akick[k].creator);
+ ci->akick[k].creator = NULL;
+
+ ci->akick[j].flags = ci->akick[k].flags;
+ ci->akick[k].flags = 0;
+
+ ci->akick[j].addtime = ci->akick[k].addtime;
+ ci->akick[k].addtime = 0;
+ }
+ }
+ }
+
+ /* After moving only the last entry should still be empty.
+ * Free the place no longer in use... ~ Viper */
+ ci->akickcount = j;
+ ci->akick = srealloc(ci->akick,sizeof(AutoKick) * ci->akickcount);
+ }
+ }
+}
+
+/*************************************************************************/
+
+/* 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;
+
+ if (!chan || !*chan) {
+ if (debug) {
+ alog("debug: cs_findchan() called with NULL values");
+ }
+ return NULL;
+ }
+
+ for (ci = chanlists[(unsigned char) 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;
+ int limit;
+
+ if (!user || !ci) {
+ return 0;
+ }
+
+ level = get_access(user, ci);
+ 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. */
+
+void alpha_insert_chan(ChannelInfo * ci)
+{
+ ChannelInfo *ptr, *prev;
+ char *chan;
+
+ if (!ci) {
+ if (debug) {
+ alog("debug: alpha_insert_chan called with NULL values");
+ }
+ return;
+ }
+
+ chan = ci->name;
+
+ for (prev = NULL, ptr = chanlists[(unsigned char) tolower(chan[1])];
+ ptr != NULL && stricmp(ptr->name, chan) < 0;
+ prev = ptr, ptr = ptr->next);
+ ci->prev = prev;
+ ci->next = ptr;
+ if (!prev)
+ chanlists[(unsigned char) 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. */
+
+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. */
+
+int delchan(ChannelInfo * ci)
+{
+ int i;
+ NickCore *nc;
+ User *u;
+ struct u_chaninfolist *cilist, *cilist_next;
+
+ if (!ci) {
+ if (debug) {
+ alog("debug: delchan called with NULL values");
+ }
+ return 0;
+ }
+
+ nc = ci->founder;
+
+ if (debug >= 2) {
+ alog("debug: delchan removing %s", ci->name);
+ }
+
+ if (ci->bi) {
+ ci->bi->chancount--;
+ }
+
+ if (debug >= 2) {
+ alog("debug: delchan top of removing the bot");
+ }
+ if (ci->c) {
+ if (ci->bi && ci->c->usercount >= BSMinUsers) {
+ anope_cmd_part(ci->bi->nick, ci->c->name, NULL);
+ }
+ ci->c->ci = NULL;
+ }
+ if (debug >= 2) {
+ alog("debug: delchan() Bot has been removed moving on");
+ }
+
+ if (debug >= 2) {
+ alog("debug: delchan() founder cleanup");
+ }
+ for (i = 0; i < 1024; i++) {
+ for (u = userlist[i]; u; u = u->next) {
+ cilist = u->founder_chans;
+ while (cilist) {
+ cilist_next = cilist->next;
+ if (cilist->chan == ci) {
+ if (debug)
+ alog("debug: Dropping founder login of %s for %s",
+ u->nick, ci->name);
+ if (cilist->next)
+ cilist->next->prev = cilist->prev;
+ if (cilist->prev)
+ cilist->prev->next = cilist->next;
+ else
+ u->founder_chans = cilist->next;
+ free(cilist);
+ }
+ cilist = cilist_next;
+ }
+ }
+ }
+ if (debug >= 2) {
+ alog("debug: delchan() founder cleanup done");
+ }
+
+ if (ci->next)
+ ci->next->prev = ci->prev;
+ if (ci->prev)
+ ci->prev->next = ci->next;
+ else
+ chanlists[(unsigned char) tolower(ci->name[1])] = ci->next;
+ if (ci->desc)
+ free(ci->desc);
+ if (ci->url)
+ free(ci->url);
+ if (ci->email)
+ free(ci->email);
+ if (ci->entry_message)
+ free(ci->entry_message);
+
+ if (ci->mlock_key)
+ free(ci->mlock_key);
+ if (ircd->fmode) {
+ if (ci->mlock_flood)
+ free(ci->mlock_flood);
+ }
+ if (ircd->Lmode) {
+ if (ci->mlock_redirect)
+ free(ci->mlock_redirect);
+ }
+ 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);
+ if (debug >= 2) {
+ alog("debug: delchan() top of the akick list");
+ }
+ 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 (debug >= 2) {
+ alog("debug: delchan() done with the akick list");
+ }
+ if (ci->akick)
+ free(ci->akick);
+ if (ci->levels)
+ free(ci->levels);
+ if (debug >= 2) {
+ alog("debug: delchan() top of the memo list");
+ }
+ if (ci->memos.memos) {
+ for (i = 0; i < ci->memos.memocount; i++) {
+ if (ci->memos.memos[i].text)
+ free(ci->memos.memos[i].text);
+ moduleCleanStruct(&ci->memos.memos[i].moduleData);
+ }
+ free(ci->memos.memos);
+ }
+ if (debug >= 2) {
+ alog("debug: delchan() done with the memo list");
+ }
+ if (ci->ttb)
+ free(ci->ttb);
+
+ if (debug >= 2) {
+ alog("debug: delchan() top of the badword list");
+ }
+ for (i = 0; i < ci->bwcount; i++) {
+ if (ci->badwords[i].word)
+ free(ci->badwords[i].word);
+ }
+ if (ci->badwords)
+ free(ci->badwords);
+ if (debug >= 2) {
+ alog("debug: delchan() done with the badword list");
+ }
+
+
+ if (debug >= 2) {
+ alog("debug: delchan() calling on moduleCleanStruct()");
+ }
+ moduleCleanStruct(&ci->moduleData);
+
+ free(ci);
+ if (nc)
+ nc->channelcount--;
+
+ if (debug >= 2) {
+ alog("debug: delchan() all done");
+ }
+ return 1;
+}
+
+/*************************************************************************/
+
+/* Reset channel access level values to their default state. */
+
+void reset_levels(ChannelInfo * ci)
+{
+ int i;
+
+ if (!ci) {
+ if (debug) {
+ alog("debug: reset_levels called with NULL values");
+ }
+ return;
+ }
+
+ 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 || !ci) {
+ return 0;
+ }
+
+ 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;
+}
+
+/*************************************************************************/
+
+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? */
+
+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;
+
+ if (!ci || !nc) {
+ return NULL;
+ }
+
+ 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 || !user)
+ return 0;
+
+ /* SuperAdmin always has highest level */
+ if (user->isSuperAdmin)
+ return ACCESS_SUPERADMIN;
+
+ 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;
+
+ if (nick_identified(user))
+ return 0;
+
+ return 0;
+}
+
+/*************************************************************************/
+
+void update_cs_lastseen(User * user, ChannelInfo * ci)
+{
+ ChanAccess *access;
+
+ if (!ci || !user || !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", common_get_vident(u),
+ common_get_vhost(u));
+ return 1;
+ case 1:
+ snprintf(ret, retlen, "*!%s%s@%s",
+ (strlen(common_get_vident(u)) <
+ (*(common_get_vident(u)) ==
+ '~' ? USERMAX + 1 : USERMAX) ? "*" : ""),
+ (*(common_get_vident(u)) ==
+ '~' ? common_get_vident(u) + 1 : common_get_vident(u)),
+ common_get_vhost(u));
+ return 1;
+ case 2:
+ snprintf(ret, retlen, "*!*@%s", common_get_vhost(u));
+ return 1;
+ case 3:
+ mask = create_mask(u);
+ snprintf(ret, retlen, "*!%s", mask);
+ free(mask);
+ return 1;
+
+ default:
+ return 0;
+ }
+}
+
+/*************************************************************************/
+
+char *cs_get_flood(ChannelInfo * ci)
+{
+ if (!ci) {
+ return NULL;
+ } else {
+ return ci->mlock_flood;
+ }
+}
+
+/*************************************************************************/
+
+char *cs_get_key(ChannelInfo * ci)
+{
+ if (!ci) {
+ return NULL;
+ } else {
+ return ci->mlock_key;
+ }
+}
+
+/*************************************************************************/
+
+char *cs_get_limit(ChannelInfo * ci)
+{
+ static char limit[16];
+
+ if (!ci) {
+ return NULL;
+ }
+
+ if (ci->mlock_limit == 0)
+ return NULL;
+
+ snprintf(limit, sizeof(limit), "%lu",
+ (unsigned long int) ci->mlock_limit);
+ return limit;
+}
+
+/*************************************************************************/
+
+char *cs_get_redirect(ChannelInfo * ci)
+{
+ if (!ci) {
+ return NULL;
+ } else {
+ return ci->mlock_redirect;
+ }
+}
+
+/*************************************************************************/
+
+void cs_set_flood(ChannelInfo * ci, char *value)
+{
+ if (!ci) {
+ return;
+ }
+
+ if (ci->mlock_flood)
+ free(ci->mlock_flood);
+
+ /* This looks ugly, but it works ;) */
+ if (anope_flood_mode_check(value)) {
+ ci->mlock_flood = sstrdup(value);
+ } else {
+ ci->mlock_on &= ~ircd->chan_fmode;
+ ci->mlock_flood = NULL;
+ }
+}
+
+/*************************************************************************/
+
+void cs_set_key(ChannelInfo * ci, char *value)
+{
+ if (!ci) {
+ return;
+ }
+
+ 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 &= ~anope_get_key_mode();
+ ci->mlock_key = NULL;
+ }
+}
+
+/*************************************************************************/
+
+void cs_set_limit(ChannelInfo * ci, char *value)
+{
+ if (!ci) {
+ return;
+ }
+
+ ci->mlock_limit = value ? strtoul(value, NULL, 10) : 0;
+
+ if (ci->mlock_limit <= 0)
+ ci->mlock_on &= ~anope_get_limit_mode();
+}
+
+/*************************************************************************/
+
+void cs_set_redirect(ChannelInfo * ci, char *value)
+{
+ if (!ci) {
+ return;
+ }
+
+ 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 &= ~ircd->chan_lmode;
+ ci->mlock_redirect = NULL;
+ }
+}
+
+int get_access_level(ChannelInfo * ci, NickAlias * na)
+{
+ ChanAccess *access;
+ int num;
+
+ if (!ci || !na) {
+ return 0;
+ }
+
+ if (na->nc == ci->founder) {
+ return ACCESS_FOUNDER;
+ }
+
+ for (num = 0; num < ci->accesscount; num++) {
+
+ access = &ci->access[num];
+
+ if (access->nc && access->nc == na->nc && access->in_use) {
+ return access->level;
+ }
+
+ }
+
+ return 0;
+
+}
+
+const char *get_xop_level(int level)
+{
+ if (level < ACCESS_VOP) {
+ return "Err";
+ } else if (ircd->halfop && level < ACCESS_HOP) {
+ return "VOP";
+ } else if (!ircd->halfop && level < ACCESS_AOP) {
+ return "VOP";
+ } else if (ircd->halfop && level < ACCESS_AOP) {
+ return "HOP";
+ } else if (level < ACCESS_SOP) {
+ return "AOP";
+ } else if (level < ACCESS_FOUNDER) {
+ return "SOP";
+ } else {
+ return "Founder";
+ }
+
+}
+
+/*************************************************************************/
+/*********************** ChanServ command routines ***********************/
+/*************************************************************************/
+
+/*************************************************************************/
+
+
+/*************************************************************************/
+
+/* `last' is set to the last index this routine was called with
+ * `perm' is incremented whenever a permission-denied error occurs
+ */
+
+
+/*************************************************************************/
+
+/* Is the mask stuck? */
+
+AutoKick *is_stuck(ChannelInfo * ci, char *mask)
+{
+ int i;
+ AutoKick *akick;
+
+ if (!ci) {
+ return NULL;
+ }
+
+ 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 = *!*@*.anope.org */
+ if (match_wild_nocase(mask, akick->u.mask))
+ return akick;
+ if (ircd->reversekickcheck) {
+ /* Example: mask = *!*@irc.anope.org and akick->u.mask = *!*@*.anope.org */
+ if (match_wild_nocase(akick->u.mask, mask))
+ return akick;
+ }
+ }
+
+ return NULL;
+}
+
+/* Ban the stuck mask in a safe manner. */
+
+void stick_mask(ChannelInfo * ci, AutoKick * akick)
+{
+ char *av[2];
+ Entry *ban;
+
+ if (!ci) {
+ return;
+ }
+
+ if (ci->c->bans && ci->c->bans->entries != 0) {
+ for (ban = ci->c->bans->entries; ban; ban = ban->next) {
+ /* If akick is already covered by a wider ban.
+ Example: c->bans[i] = *!*@*.org and akick->u.mask = *!*@*.epona.org */
+ if (entry_match_mask(ban, sstrdup(akick->u.mask), 0))
+ return;
+
+ if (ircd->reversekickcheck) {
+ /* 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, ban->mask))
+ return;
+ }
+ }
+ }
+
+ /* Falling there means set the ban */
+ av[0] = sstrdup("+b");
+ av[1] = akick->u.mask;
+ anope_cmd_mode(whosends(ci), ci->c->name, "+b %s", 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;
+
+ if (!ci) {
+ return;
+ }
+
+ 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;
+ anope_cmd_mode(whosends(ci), ci->c->name, "+b %s", akick->u.mask);
+ chan_set_modes(s_ChanServ, ci->c, 2, av, 1);
+ free(av[0]);
+ }
+}
diff --git a/src/commands.c b/src/commands.c
new file mode 100644
index 000000000..4c827458d
--- /dev/null
+++ b/src/commands.c
@@ -0,0 +1,271 @@
+/* Routines for looking up commands in a *Serv command list.
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+
+#include "services.h"
+#include "commands.h"
+#include "language.h"
+
+/*************************************************************************/
+
+/**
+ * Return the Command corresponding to the given name, or NULL if no such
+ * command exists.
+ * @param list Command struct
+ * @param cmd Command to look up
+ * @return Command Struct for the given cmd
+ */
+Command *lookup_cmd(Command * list, 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.
+ * @param services Services Client
+ * @param u User Struct
+ * @param list Command struct
+ * @param cmd Command
+ * @return void
+ */
+void run_cmd(char *service, User * u, Command * list, char *cmd)
+{
+ Command *c = lookup_cmd(list, cmd);
+ do_run_cmd(service, u, c, cmd);
+}
+
+/*************************************************************************/
+
+/**
+ * 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.
+ * @param services Services Client
+ * @param u User Struct
+ * @param Command Hash Table
+ * @param cmd Command
+ * @return void
+ */
+void mod_run_cmd(char *service, User * u, CommandHash * cmdTable[],
+ const char *cmd)
+{
+ Command *c = findCommand(cmdTable, cmd);
+ do_run_cmd(service, u, c, cmd);
+}
+
+
+/*************************************************************************/
+
+/**
+ * Run the given command
+ * @param services Services Client
+ * @param u User Struct
+ * @param c Command Struct
+ * @param cmd Command
+ * @return void
+ */
+void do_run_cmd(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 {
+ mod_current_module_name = c->mod_name;
+ mod_current_module = NULL;
+ if ((c->has_priv == NULL) || c->has_priv(u)) {
+ 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 = current->mod_name;
+ mod_current_module = NULL;
+ 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);
+ }
+ mod_current_module_name = NULL;
+ }
+ } else {
+ if ((!checkDefCon(DEFCON_SILENT_OPER_ONLY)) || is_oper(u)) {
+ notice_lang(service, u, UNKNOWN_COMMAND_HELP, cmd, service);
+ }
+ }
+}
+
+/*************************************************************************/
+
+/**
+ * Output the 'Limited to' line for the given command
+ * @param service Services Client
+ * @param u User Struct
+ * @param c Command Struct
+ * @return void
+ */
+void do_help_limited(char *service, User * u, Command * c)
+{
+ if (c->has_priv == is_services_oper)
+ notice_lang(service, u, HELP_LIMIT_SERV_OPER);
+ else if (c->has_priv == is_services_admin)
+ notice_lang(service, u, HELP_LIMIT_SERV_ADMIN);
+ else if (c->has_priv == is_services_root)
+ notice_lang(service, u, HELP_LIMIT_SERV_ROOT);
+ else if (c->has_priv == is_oper)
+ notice_lang(service, u, HELP_LIMIT_IRC_OPER);
+ else if (c->has_priv == is_host_setter)
+ notice_lang(service, u, HELP_LIMIT_HOST_SETTER);
+ else if (c->has_priv == is_host_remover)
+ notice_lang(service, u, HELP_LIMIT_HOST_REMOVER);
+}
+
+/*************************************************************************/
+
+/**
+ * Print a help message for the given command.
+ * @param services Services Client
+ * @param u User Struct
+ * @param c Command Struct
+ * @param cmd Command
+ * @return void
+ */
+void do_help_cmd(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;
+ Module *calling_module = mod_current_module;
+ char *calling_module_name = mod_current_module_name;
+
+ for (current = c; (current) && (cont == MOD_CONT);
+ current = current->next) {
+ mod_current_module_name = current->mod_name;
+ if (mod_current_module_name)
+ mod_current_module = findModule(mod_current_module_name);
+ else
+ mod_current_module = NULL;
+
+ 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);
+ } else {
+ do_help_limited(service, u, c);
+ }
+
+ mod_current_module = calling_module;
+ mod_current_module_name = calling_module_name;
+}
+
+/*************************************************************************/
+
+/**
+ * Find the Help Command
+ * @param services Services Client
+ * @param u User Struct
+ * @param c Command Struct
+ * @param cmd Command
+ * @return void
+ */
+void help_cmd(char *service, User * u, Command * list, char *cmd)
+{
+ Command *c = lookup_cmd(list, cmd);
+ do_help_cmd(service, u, c, cmd);
+}
+
+/*************************************************************************/
+
+/**
+ * Find the Help Command
+ * @param services Services Client
+ * @param u User Struct
+ * @param Command Hash Table
+ * @param cmd Command
+ * @return void
+ */
+void mod_help_cmd(char *service, User * u, CommandHash * cmdTable[],
+ const char *cmd)
+{
+ Command *c = findCommand(cmdTable, cmd);
+ do_help_cmd(service, u, c, cmd);
+}
+
+/*************************************************************************/
diff --git a/src/compat.c b/src/compat.c
new file mode 100644
index 000000000..ec0856f46
--- /dev/null
+++ b/src/compat.c
@@ -0,0 +1,228 @@
+/* Compatibility routines.
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+
+#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;
+ vsnprintf(buf, len, fmt, args);
+ buf[len - 1] = 0;
+ return strlen(buf);
+}
+#endif /* BAD_SNPRINTF */
+
+int snprintf(char *buf, size_t len, const char *fmt, ...)
+{
+ va_list args;
+ int ret = 0;
+
+ va_start(args, fmt);
+ ret = vsnprintf(buf, len, fmt, args);
+ va_end(args);
+ return ret;
+}
+
+#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
+/* Windows only supports 6 signals:
+ * SIGINT, SIGILL, SIGABRT, SIGFPE, SIGSEGV, SIGTERM
+ * -- codemastr
+ */
+char *strsignal(int signum)
+{
+ static char buf[32];
+ switch (signum) {
+#ifndef _WIN32
+ case SIGHUP:
+ strscpy(buf, "Hangup", sizeof(buf));
+ break;
+#endif
+ case SIGINT:
+ strscpy(buf, "Interrupt", sizeof(buf));
+ break;
+#ifndef _WIN32
+ case SIGQUIT:
+ strscpy(buf, "Quit", sizeof(buf));
+ break;
+#endif
+#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;
+#ifndef _WIN32
+ case SIGKILL:
+ strscpy(buf, "Killed", sizeof(buf));
+ break;
+ case SIGUSR1:
+ strscpy(buf, "User signal 1", sizeof(buf));
+ break;
+#endif
+ case SIGSEGV:
+ strscpy(buf, "Segmentation fault", sizeof(buf));
+ break;
+#ifndef _WIN32
+ 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;
+#endif
+ case SIGTERM:
+ strscpy(buf, "Terminated", sizeof(buf));
+ break;
+#ifndef _WIN32
+ 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;
+#endif
+ default:
+ snprintf(buf, sizeof(buf), "Signal %d\n", signum);
+ break;
+ }
+ return buf;
+}
+#endif
+
+
+/*************************************************************************/
diff --git a/src/config.c b/src/config.c
new file mode 100644
index 000000000..b4ff90b28
--- /dev/null
+++ b/src/config.c
@@ -0,0 +1,1420 @@
+/* Configuration file handling.
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+
+#include "services.h"
+
+/*************************************************************************/
+
+/* Configurable variables: */
+
+char *IRCDModule;
+char *EncModule;
+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 *NetworkName;
+int NickLen;
+
+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 UseStrictPrivMsg;
+int DumpCore;
+int LogUsers;
+int NickRegDelay;
+int UseSVSHOLD;
+int UseTokens;
+int UseSVS2MODE;
+int NewsCount;
+
+int UseMail;
+char *SendMailPath;
+char *SendFrom;
+int RestrictMail;
+int MailDelay;
+int DontQuoteAddresses;
+
+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 NSDefAutoop;
+int NSRegDelay;
+int NSResendDelay;
+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 NSNickTracking;
+int NSAddAccessOnReg;
+
+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 MSMemoReceipt;
+
+int BSDefDontKickOps;
+int BSDefDontKickVoices;
+int BSDefFantasy;
+int BSDefGreet;
+int BSDefSymbiosis;
+int BSDefFlags;
+int BSKeepData;
+int BSMinUsers;
+int BSBadWordsMax;
+int BSSmartJoin;
+int BSGentleBWReason;
+int BSCaseSensitive;
+char *BSFantasyCharacter;
+
+int HideStatsO;
+int GlobalOnCycle;
+int AnonymousGlobal;
+int RestrictOperNicks;
+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 KillonSGline;
+int KillonSQline;
+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 AddAkiller;
+
+int LimitSessions;
+int DefSessionLimit;
+int ExceptionExpiry;
+int MaxSessionKill;
+int MaxSessionLimit;
+int SessionAutoKillExpiry;
+char *ExceptionDBName;
+char *SessionLimitExceeded;
+char *SessionLimitDetailsLoc;
+
+int OSOpersOnly;
+
+char *Modules;
+char *ModulesDelayed;
+char **ModulesAutoload;
+int ModulesNumber;
+int ModulesDelayedNumber;
+char **ModulesDelayedAutoload;
+
+/**
+ * Core Module Stuff
+ **/
+char *HostCoreModules;
+char **HostServCoreModules;
+int HostServCoreNumber;
+
+char *MemoCoreModules;
+char **MemoServCoreModules;
+int MemoServCoreNumber;
+
+char *HelpCoreModules;
+char **HelpServCoreModules;
+int HelpServCoreNumber;
+
+char *BotCoreModules;
+char **BotServCoreModules;
+int BotServCoreNumber;
+
+char *OperCoreModules;
+char **OperServCoreModules;
+int OperServCoreNumber;
+
+char *NickCoreModules;
+char **NickServCoreModules;
+int NickServCoreNumber;
+
+char *ChanCoreModules;
+char **ChanServCoreModules;
+int ChanServCoreNumber;
+
+
+char *MysqlHost;
+char *MysqlUser;
+char *MysqlPass;
+char *MysqlName;
+int MysqlPort;
+char *MysqlSecure;
+char *MysqlSock;
+int MysqlRetries = 0;
+int MysqlRetryGap = 0;
+int UseRDB = 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;
+
+long unsigned int UserKey1;
+long unsigned int UserKey2;
+long unsigned int UserKey3;
+
+char *Numeric;
+
+int UnRestrictSAdmin;
+
+char *UlineServers;
+char **Ulines;
+int NumUlines;
+
+int UseTS6;
+
+
+/*************************************************************************/
+
+/* Deprecated directive (dep_) and value checking (chk_) functions: */
+
+/* Hey, there are no left! -GD */
+
+/*************************************************************************/
+
+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}}},
+ {"BotCoreModules", {{PARAM_STRING, PARAM_RELOAD, &BotCoreModules}}},
+ {"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}}},
+ {"BSCaseSensitive", {{PARAM_SET, PARAM_RELOAD, &BSCaseSensitive}}},
+ {"BSFantasyCharacter",
+ {{PARAM_STRING, PARAM_RELOAD, &BSFantasyCharacter}}},
+ {"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}}},
+ {"ChanCoreModules", {{PARAM_STRING, PARAM_RELOAD, &ChanCoreModules}}},
+ {"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}}},
+ {"CSAccessMax", {{PARAM_POSINT, PARAM_RELOAD, &CSAccessMax}}},
+ {"CSAutokickMax", {{PARAM_POSINT, PARAM_RELOAD, &CSAutokickMax}}},
+ {"CSAutokickReason",
+ {{PARAM_STRING, PARAM_RELOAD, &CSAutokickReason}}},
+ {"CSDefBantype", {{PARAM_INT, 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}}},
+ {"EncModule", {{PARAM_STRING, 0, &EncModule}}},
+ {"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}}},
+ {"HelpCoreModules", {{PARAM_STRING, PARAM_RELOAD, &HelpCoreModules}}},
+ {"HelpChannel", {{PARAM_STRING, PARAM_RELOAD, &HelpChannel}}},
+ {"HostCoreModules", {{PARAM_STRING, PARAM_RELOAD, &HostCoreModules}}},
+ {"HostServAlias", {{PARAM_STRING, 0, &s_HostServAlias},
+ {PARAM_STRING, 0, &desc_HostServAlias}}},
+ {"HostSetters", {{PARAM_STRING, PARAM_RELOAD, &HostSetter}}},
+ {"IRCDModule", {{PARAM_STRING, 0, &IRCDModule}}},
+ {"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_INT, PARAM_RELOAD, &KeepBackups}}},
+ {"KeepLogs", {{PARAM_INT, PARAM_RELOAD, &KeepLogs}}},
+ {"KillonSGline", {{PARAM_SET, PARAM_RELOAD, &KillonSGline}}},
+ {"KillonSQline", {{PARAM_SET, PARAM_RELOAD, &KillonSQline}}},
+ {"AddAkiller", {{PARAM_SET, PARAM_RELOAD, &AddAkiller}}},
+ {"LimitSessions", {{PARAM_SET, PARAM_FULLONLY, &LimitSessions}}},
+ {"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_INT, PARAM_RELOAD, &MaxSessionKill}}},
+ {"MaxSessionLimit", {{PARAM_POSINT, PARAM_RELOAD, &MaxSessionLimit}}},
+ {"MemoCoreModules", {{PARAM_STRING, PARAM_RELOAD, &MemoCoreModules}}},
+ {"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}}},
+ {"UseRDB", {{PARAM_SET, PARAM_RELOAD, &UseRDB}}},
+ {"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}}},
+ {"MSMemoReceipt", {{PARAM_POSINT, PARAM_RELOAD, &MSMemoReceipt}}},
+ {"NetworkName", {{PARAM_STRING, PARAM_RELOAD, &NetworkName}}},
+ {"NewsCount", {{PARAM_POSINT, PARAM_RELOAD, &NewsCount}}},
+ {"NewsDB", {{PARAM_STRING, PARAM_RELOAD, &NewsDBName}}},
+ {"NickLen", {{PARAM_POSINT, 0, &NickLen}}},
+ {"NickservDB", {{PARAM_STRING, PARAM_RELOAD, &NickDBName}}},
+ {"Numeric", {{PARAM_STRING, PARAM_RELOAD, &Numeric}}},
+ {"PreNickServDB", {{PARAM_STRING, PARAM_RELOAD, &PreNickDBName}}},
+ {"NSEmailReg", {{PARAM_SET, PARAM_RELOAD, &NSEmailReg}}},
+ {"NickCoreModules", {{PARAM_STRING, PARAM_RELOAD, &NickCoreModules}}},
+ {"NickRegDelay", {{PARAM_POSINT, PARAM_RELOAD, &NickRegDelay}}},
+ {"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}}},
+ {"NSDefAutoop", {{PARAM_SET, PARAM_RELOAD, &NSDefAutoop}}},
+ {"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_INT, PARAM_RELOAD, &NSMaxAliases}}},
+ {"NSNoGroupChange", {{PARAM_SET, PARAM_RELOAD, &NSNoGroupChange}}},
+ {"NSRegDelay", {{PARAM_TIME, PARAM_RELOAD, &NSRegDelay}}},
+ {"NSResendDelay", {{PARAM_TIME, PARAM_RELOAD, &NSResendDelay}}},
+ {"NSReleaseTimeout", {{PARAM_TIME, PARAM_RELOAD, &NSReleaseTimeout}}},
+ {"NSSecureAdmins", {{PARAM_SET, PARAM_RELOAD, &NSSecureAdmins}}},
+ {"NSStrictPrivileges",
+ {{PARAM_SET, PARAM_RELOAD, &NSStrictPrivileges}}},
+ {"NSRestrictGetPass", {{PARAM_SET, PARAM_RELOAD, &NSRestrictGetPass}}},
+ {"NSNickTracking", {{PARAM_SET, PARAM_RELOAD, &NSNickTracking}}},
+ {"NSAddAccessOnReg", {{PARAM_SET, PARAM_RELOAD, &NSAddAccessOnReg}}},
+ {"OperCoreModules", {{PARAM_STRING, PARAM_RELOAD, &OperCoreModules}}},
+ {"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}}},
+ {"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}}},
+ {"RestrictOperNicks", {{PARAM_SET, PARAM_RELOAD, &RestrictOperNicks}}},
+ {"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}}},
+ {"OSOpersOnly", {{PARAM_SET, PARAM_RELOAD, &OSOpersOnly}}},
+ {"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}}},
+ {"UseStrictPrivMsg", {{PARAM_SET, PARAM_RELOAD, &UseStrictPrivMsg}}},
+ {"UserKey1", {{PARAM_POSINT, PARAM_RELOAD, &UserKey1}}},
+ {"UserKey2", {{PARAM_POSINT, PARAM_RELOAD, &UserKey2}}},
+ {"UserKey3", {{PARAM_POSINT, PARAM_RELOAD, &UserKey3}}},
+ {"UseSVSHOLD", {{PARAM_SET, PARAM_RELOAD, &UseSVSHOLD}}},
+ {"UseSVS2MODE", {{PARAM_SET, PARAM_RELOAD, &UseSVS2MODE}}},
+ {"UseTokens", {{PARAM_SET, 0, &UseTokens}}},
+ {"UseTS6", {{PARAM_SET, 0, &UseTS6}}},
+ {"UnRestrictSAdmin", {{PARAM_SET, PARAM_RELOAD, &UnRestrictSAdmin}}},
+ {"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}}},
+ {"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}}},
+ {"UlineServers", {{PARAM_STRING, PARAM_RELOAD, &UlineServers}}},
+};
+
+/*************************************************************************/
+
+/* Print an error message to the log (and the console, if open). */
+
+void error(int linenum, const char *message, ...)
+{
+ char buf[4096];
+ va_list args;
+
+ va_start(args, message);
+ vsnprintf(buf, sizeof(buf), message, args);
+ va_end(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_directive(Directive * d, char *dir, int ac, char *av[MAXPARAMS],
+ int linenum, int reload, char *s)
+{
+ int retval = 1;
+ int i;
+ long val;
+ int optind;
+
+ if (stricmp(dir, d->name) != 0)
+ return 1;
+ 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
+
+ /* Should we remove PARAM_DEPRECATED because it's
+ * useless right now? -GD */
+ 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;
+ }
+ if (errno == ERANGE && val == LONG_MAX) {
+ /* well the true top off is 2,147,483,647 but lets not give them the real top */
+ error(linenum,
+ "%s: paramter %d is to large, reduce this value (0 to 2,147,483,646)",
+ d->name, optind);
+ }
+ *(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 = sstrdup(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);
+ retval = 0; /* don't bother continuing--something's bizarre */
+ break;
+ }
+ }
+ return retval;;
+}
+
+
+int parse(char *buf, int linenum, int reload)
+{
+ char *s, *t, *dir;
+ int n;
+ 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];
+ retval = parse_directive(d, dir, ac, av, linenum, reload, s);
+ if (!retval) {
+ break;
+ }
+ }
+
+ 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 (RemoteServer3)
+ CHECK(RemoteServer2);
+
+ if (LocalHost && RemoteServer) {
+ if ((!stricmp(LocalHost, RemoteServer))
+ && LocalPort == RemotePort) {
+ printf
+ ("\n*** LocalAddress and RemoteServer are set to use the same IP address\n"
+ "*** (%s) and port (%d). This would have resulted in errors.\n"
+ "*** Change the LocalAddress to bind to another port.\n",
+ RemoteServer, LocalPort);
+ retval = 0;
+ }
+ }
+
+ if (NickLen == 0) {
+ alog("You have not defined the NickLen configuration directive. It is strongly");
+ alog("advised that you do configure this correctly in your services.conf");
+ NickLen = NICKMAX - 1;
+ } else if ((NickLen < 1) || (NickLen >= NICKMAX)) {
+ alog("NickLen has an invalid value; setting to %d",
+ (NICKMAX - 1));
+ NickLen = NICKMAX - 1;
+ }
+ }
+
+ CHECK(IRCDModule);
+ CHECK(EncModule);
+
+ 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);
+ }
+
+ if (s_ChanServAlias) {
+ if (!stricmp(s_ChanServ, s_ChanServAlias)) {
+ printf
+ ("\n*** ChanServ and ChanServ Alias are the same, this will cause errors\n");
+ retval = 0;
+ }
+ }
+
+ if (s_NickServAlias) {
+ if (!stricmp(s_NickServ, s_NickServAlias)) {
+ printf
+ ("\n*** NickServ and NickServ Alias are the same, this will cause errors\n");
+ retval = 0;
+ }
+ }
+
+ if (s_OperServAlias) {
+ if (!stricmp(s_OperServ, s_OperServAlias)) {
+ printf
+ ("\n*** OperServ and OperServ Alias are the same, this will cause errors\n");
+ retval = 0;
+ }
+ }
+
+ if (s_MemoServAlias) {
+ if (!stricmp(s_MemoServ, s_MemoServAlias)) {
+ printf
+ ("\n*** MemoServ and MemoServ Alias are the same, this will cause errors\n");
+ retval = 0;
+ }
+ }
+
+ if (s_HelpServAlias) {
+ if (!stricmp(s_HelpServ, s_HelpServAlias)) {
+ printf
+ ("\n*** HelpServ and HelpServ Alias are the same, this will cause errors\n");
+ retval = 0;
+ }
+ }
+
+ if (s_GlobalNoticerAlias) {
+ if (!stricmp(s_GlobalNoticer, s_GlobalNoticerAlias)) {
+ printf
+ ("\n*** GlobalNoticer and GlobalNoticer Alias are the same, this will cause errors\n");
+ retval = 0;
+ }
+ }
+
+
+ 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_nsuserhost;
+ 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) {
+ if (!UsePrivmsg)
+ alog("NSDefMsg can only be used when UsePrivmsg is set - unsetting NSDefMsg");
+ else
+ 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;
+ if (!NSDefAutoop)
+ NSDefFlags |= NI_AUTOOP;
+ }
+
+ if (!ServicesRoot) {
+ error(0,
+ "You must define the 'ServicesRoot' configuration directive");
+ error(0,
+ "in your services.conf file. This is a required setting that");
+ error(0,
+ "defines the main Administrative nick(s) Anope will obey.");
+ retval = 0;
+ }
+
+ CHECK(NSGuestNickPrefix); /* Add safety check */
+ if (NSGuestNickPrefix && (strlen(NSGuestNickPrefix) > 21)) {
+ error(0, "Value of NSGuestNickPrefix must be between 1 and 21");
+ retval = 0;
+ }
+
+ 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 (!NewsCount) {
+ NewsCount = 3;
+ }
+
+ 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 {
+ if (s) {
+ RootNumber++;
+ ServicesRoots =
+ realloc(ServicesRoots, sizeof(char *) * RootNumber);
+ ServicesRoots[RootNumber - 1] = sstrdup(s);
+ }
+ } while ((s = strtok(NULL, " ")));
+ }
+
+ if (!RootNumber) {
+ error(0, "No ServicesRoot defined");
+ retval = 0;
+ }
+
+ /* Ulines */
+
+ if (UlineServers) {
+ NumUlines = 0;
+
+ s = strtok(UlineServers, " ");
+ do {
+ if (s) {
+ NumUlines++;
+ Ulines = realloc(Ulines, sizeof(char *) * NumUlines);
+ Ulines[NumUlines - 1] = sstrdup(s);
+ }
+ } while ((s = strtok(NULL, " ")));
+ }
+
+ /* Host Setters building... :P */
+ HostSetters = buildStringList(HostSetter, &HostNumber);
+
+ /* Modules Autoload building... :P */
+ ModulesAutoload = buildStringList(Modules, &ModulesNumber);
+ ModulesDelayedAutoload =
+ buildStringList(ModulesDelayed, &ModulesDelayedNumber);
+ HostServCoreModules =
+ buildStringList(HostCoreModules, &HostServCoreNumber);
+ MemoServCoreModules =
+ buildStringList(MemoCoreModules, &MemoServCoreNumber);
+ HelpServCoreModules =
+ buildStringList(HelpCoreModules, &HelpServCoreNumber);
+
+ BotServCoreModules =
+ buildStringList(BotCoreModules, &BotServCoreNumber);
+
+ OperServCoreModules =
+ buildStringList(OperCoreModules, &OperServCoreNumber);
+
+ ChanServCoreModules =
+ buildStringList(ChanCoreModules, &ChanServCoreNumber);
+
+ NickServCoreModules =
+ buildStringList(NickCoreModules, &NickServCoreNumber);
+
+
+ if (LimitSessions) {
+ CHECK(DefSessionLimit);
+ CHECK(MaxSessionLimit);
+ CHECK(ExceptionExpiry);
+
+ if (MaxSessionKill && !SessionAutoKillExpiry)
+ SessionAutoKillExpiry = 30 * 60; /* 30 minutes */
+ }
+
+ if (s_BotServ) {
+ CHEK2(BotDBName, BotServDB);
+ CHECK(BSBadWordsMax);
+ CHECK(BSMinUsers);
+ CHECK(BSKeepData);
+ if (s_BotServAlias) {
+ if (!stricmp(s_BotServ, s_BotServAlias)) {
+ printf
+ ("\n*** BotServ and BotServ Alias are the same, this will cause errors\n");
+ retval = 0;
+ }
+ }
+ if (!BSFantasyCharacter)
+ BSFantasyCharacter = sstrdup("!");
+ if (BSFantasyCharacter && (strlen(BSFantasyCharacter) > 1)) {
+ printf
+ ("*** BSFantasyCharacter is more than 1 character long. Only the first\n"
+ "*** character ('%c') will be used. The others will be ignored.\n",
+ *BSFantasyCharacter);
+ }
+ }
+
+ if (s_HostServ) {
+ CHEK2(s_HostServ, HostServName);
+ CHEK2(HostDBName, HostServDB);
+
+ if (s_HostServAlias) {
+ if (!stricmp(s_HostServ, s_HostServAlias)) {
+ printf
+ ("\n*** HostServ and HostServ Alias are the same, this will cause errors\n");
+ retval = 0;
+ }
+ }
+ }
+
+ if (UseMail) {
+ CHECK(SendMailPath);
+ CHECK(SendFrom);
+ }
+
+ if (GlobalOnCycle) {
+ if (!GlobalOnCycleMessage && !GlobalOnCycleUP) {
+ alog("GlobalOnCycleMessage and GlobalOnCycleUP are not defined; disabling GlobalOnCycle");
+ GlobalOnCycle = 0;
+ }
+ }
+
+ /* Check the user keys */
+ if ((UserKey1 == UserKey2) || (UserKey1 == UserKey3)
+ || (UserKey3 == UserKey2))
+ alog("Every UserKey must be different. It's for YOUR safety! Remember that!");
+
+ /**
+ * 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;
+ }
+
+ if (!retval) {
+ printf
+ ("\n*** Support resources: Read through the services.conf self-contained \n*** documentation. Read the documentation files found in the 'docs' \n*** folder. Visit our portal located at http://www.anope.org/. Join \n*** our support channel on /server irc.anope.org channel #anope.\n\n");
+ }
+
+ return retval;
+}
+
+
+/*************************************************************************/
diff --git a/src/core/Makefile b/src/core/Makefile
new file mode 100644
index 000000000..4ec275430
--- /dev/null
+++ b/src/core/Makefile
@@ -0,0 +1,45 @@
+include ./Makefile.inc
+
+MAKEARGS = 'CFLAGS=${CFLAGS}' 'CC=${CC}' 'ANOPELIBS=${ANOPELIBS}' \
+ 'LDFLAGS=${LDFLAGS}' 'BINDEST=${BINDEST}' 'INSTALL=${INSTALL}' \
+ 'INCLUDEDIR=${INCLUDEDIR}' 'RM=${RM}' 'CP=${CP}' \
+ 'TOUCH=${TOUCH}' 'SHELL=${SHELL}' 'DATDEST=${DATDEST}' \
+ 'RUNGROUP=${RUNGROUP}' 'MODULE_PATH=${MODULE_PATH}' \
+ 'PROFILE=${PROFILE}' 'SHARED=${SHARED}' 'MODULEFLAGS=${MODULEFLAGS}'
+
+OBJECTS= $(SRCS:.c=.o)
+SO_FILES=$(OBJECTS:.o=.s)
+CDEFS= -rdynamic -Wall
+
+all: modules subs
+
+modules: $(OBJECTS) $(SO_FILES)
+
+install:
+ $(CP) ./*.so $(MODULE_PATH)
+
+distclean: spotless
+
+.c.o:
+ $(CC) ${CFLAGS} ${CDEFS} ${MODULEFLAGS} -I../${INCLUDEDIR} -c $<
+
+.o.s:
+ $(CC) ${SHARED} ../mod_version.o $< -o $*.so ${PROFILE}
+ @$(TOUCH) $*.s
+
+subs:
+ @for i in $(SUBS); do \
+ echo "make all in $$i..."; \
+ (cd $$i; $(MAKE) $(MAKEARGS) all); done
+
+subs_clean:
+ @for i in $(SUBS); do \
+ echo "cleaning in $$i..."; \
+ (cd $$i; $(MAKE) clean); done
+
+clean: subs_clean
+ rm -f *.o *.s *.so *.c~ core
+
+spotless: subs_clean
+ rm -f *.o *.s *.so *.c~ core Makefile.inc
+
diff --git a/src/core/Makefile.sub b/src/core/Makefile.sub
new file mode 100644
index 000000000..9fbadf3b0
--- /dev/null
+++ b/src/core/Makefile.sub
@@ -0,0 +1,29 @@
+MAKEARGS = 'CFLAGS=${CFLAGS}' 'CC=${CC}' 'ANOPELIBS=${ANOPELIBS}' \
+ 'LDFLAGS=${LDFLAGS}' 'BINDEST=${BINDEST}' 'INSTALL=${INSTALL}' \
+ 'INCLUDEDIR=${INCLUDEDIR}' 'RM=${RM}' 'CP=${CP}' \
+ 'TOUCH=${TOUCH}' 'SHELL=${SHELL}' 'DATDEST=${DATDEST}' \
+ 'RUNGROUP=${RUNGROUP}' 'MODULE_PATH=${MODULE_PATH}' \
+ 'PROFILE=${PROFILE}' 'SHARED=${SHARED}' 'MODULEFLAGS=${MODULEFLAGS}'
+
+OBJECTS= $(SRCS:.c=.o)
+SO_FILES=$(OBJECTS:.o=.s)
+CDEFS= -rdynamic -Wall
+
+all: module
+
+module: $(OBJECTS) so
+
+distclean: spotless
+
+.c.o:
+ $(CC) $(CC) ${CFLAGS} ${CDEFS} ${MODULEFLAGS} -I../ -I../../${INCLUDEDIR} -c $<
+
+so:
+ $(CC) ${SHARED} $(OBJECTS) -o ../$(TARGET).so ${PROFILE}
+
+clean:
+ rm -f *.o *.so *.c~ core
+
+spotless: clean
+ rm -f *~ *.o *.so *.c~ core
+
diff --git a/src/core/Makefile.win32 b/src/core/Makefile.win32
new file mode 100644
index 000000000..1c05bb42b
--- /dev/null
+++ b/src/core/Makefile.win32
@@ -0,0 +1,24 @@
+include ../../Makefile.inc.win32
+
+SRCS=bs_act.c bs_assign.c bs_badwords.c bs_bot.c bs_botlist.c bs_fantasy.c bs_fantasy_kick.c bs_fantasy_kickban.c bs_fantasy_owner.c bs_fantasy_seen.c bs_help.c bs_info.c bs_kick.c bs_say.c bs_set.c bs_unassign.c cs_access.c cs_akick.c cs_ban.c cs_clear.c cs_drop.c cs_forbid.c cs_getkey.c cs_getpass.c cs_help.c cs_identify.c cs_info.c cs_invite.c cs_kick.c cs_list.c cs_logout.c cs_modes.c cs_register.c cs_sendpass.c cs_set.c cs_status.c cs_suspend.c cs_topic.c cs_xop.c enc_none.c enc_md5.c enc_old.c enc_sha1.c he_help.c hs_del.c hs_delall.c hs_group.c hs_help.c hs_list.c hs_off.c hs_on.c hs_set.c hs_setall.c ms_cancel.c ms_check.c ms_del.c ms_help.c ms_info.c ms_list.c ms_read.c ms_rsend.c ms_send.c ms_sendall.c ms_set.c ms_staff.c ns_access.c ns_alist.c ns_drop.c ns_forbid.c ns_getemail.c ns_getpass.c ns_ghost.c ns_group.c ns_help.c ns_identify.c ns_info.c ns_list.c ns_logout.c ns_recover.c ns_register.c ns_release.c ns_sendpass.c ns_set.c ns_saset.c ns_status.c ns_suspend.c ns_update.c os_admin.c os_akill.c os_chankill.c os_chanlist.c os_clearmodes.c os_defcon.c os_global.c os_help.c os_ignore.c os_jupe.c os_kick.c os_logonnews.c os_mode.c os_modinfo.c os_modlist.c os_modload.c os_modunload.c os_noop.c os_oline.c os_oper.c os_opernews.c os_quit.c os_randomnews.c os_raw.c os_reload.c os_restart.c os_session.c os_set.c os_sgline.c os_shutdown.c os_sqline.c os_staff.c os_stats.c os_svsnick.c os_szline.c os_umode.c os_update.c os_userlist.c
+OBJECTS= $(SRCS:.c=.dll)
+CFLAGS=/LD /MD /D MODULE_COMPILE $(CFLAGS) /I"../../include"
+LFLAGS=/link ../anope.lib wsock32.lib $(LIBS) $(LFLAGS) $(MYSQL_LIB_PATH) /export:AnopeInit /export:AnopeFini /VERSION:$(VERSION)
+
+all: $(OBJECTS)
+
+distclean: clean spotless
+
+.c.dll:
+ $(CC) $(CFLAGS) $< ..\mod_version.c $(LFLAGS)
+
+clean:
+ -@del *.obj
+
+spotless: clean
+ -@del *.dll *.lib *.exp *.manifest
+
+install:
+ -@mkdir ..\..\$(DATDEST)\modules
+ -@mkdir ..\..\$(DATDEST)\modules\runtime
+ -@copy *.dll ..\..\$(DATDEST)\modules
diff --git a/src/core/bs_act.c b/src/core/bs_act.c
new file mode 100644
index 000000000..1f92b7e42
--- /dev/null
+++ b/src/core/bs_act.c
@@ -0,0 +1,92 @@
+/* BotServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_act(User * u);
+void myBotServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+ c = createCommand("ACT", do_act, NULL, BOT_HELP_ACT, -1, -1, -1, -1);
+ moduleAddCommand(BOTSERV, c, MOD_UNIQUE);
+
+ moduleSetBotHelp(myBotServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+/**
+ * Add the help response to Anopes /bs help output.
+ * @param u The user who is requesting help
+ **/
+void myBotServHelp(User * u)
+{
+ notice_lang(s_BotServ, u, BOT_HELP_CMD_ACT);
+}
+
+/**
+ * The /bs act command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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 {
+ strnrepl(text, BUFSIZE, "\001", "");
+ anope_cmd_action(ci->bi->nick, ci->name, "%s", text);
+ ci->bi->lastmsg = time(NULL);
+ if (LogBot && LogChannel && logchan && !debug && findchan(LogChannel))
+ anope_cmd_privmsg(ci->bi->nick, LogChannel, "ACT %s %s %s",
+ u->nick, ci->name, text);
+ }
+ return MOD_CONT;
+}
diff --git a/src/core/bs_assign.c b/src/core/bs_assign.c
new file mode 100644
index 000000000..e34ca7d81
--- /dev/null
+++ b/src/core/bs_assign.c
@@ -0,0 +1,102 @@
+/* BotServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_assign(User * u);
+void myBotServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+ c = createCommand("ASSIGN", do_assign, NULL, BOT_HELP_ASSIGN, -1, -1,
+ -1, -1);
+ moduleAddCommand(BOTSERV, c, MOD_UNIQUE);
+
+ moduleSetBotHelp(myBotServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+/**
+ * Add the help response to Anopes /bs help output.
+ * @param u The user who is requesting help
+ **/
+void myBotServHelp(User * u)
+{
+ notice_lang(s_BotServ, u, BOT_HELP_CMD_ASSIGN);
+}
+
+/**
+ * The /bs assign command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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);
+ send_event(EVENT_BOT_ASSIGN, 2, ci->name, bi->nick);
+ }
+ return MOD_CONT;
+}
diff --git a/src/core/bs_badwords.c b/src/core/bs_badwords.c
new file mode 100644
index 000000000..3b5733f42
--- /dev/null
+++ b/src/core/bs_badwords.c
@@ -0,0 +1,326 @@
+/* BotServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_badwords(User * u);
+void myBotServHelp(User * u);
+int badwords_del_callback(User * u, int num, va_list args);
+int badwords_list(User * u, int index, ChannelInfo * ci, int *sent_header);
+int badwords_list_callback(User * u, int num, va_list args);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("BADWORDS", do_badwords, NULL, BOT_HELP_BADWORDS, -1,
+ -1, -1, -1);
+ moduleAddCommand(BOTSERV, c, MOD_UNIQUE);
+
+ moduleSetBotHelp(myBotServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to Anopes /bs help output.
+ * @param u The user who is requesting help
+ **/
+void myBotServHelp(User * u)
+{
+ notice_lang(s_BotServ, u, BOT_HELP_CMD_BADWORDS);
+}
+
+/**
+ * The /bs badwords command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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 && ((BSCaseSensitive && (!strcmp(bw->word, word)))
+ || (!BSCaseSensitive
+ && (!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) {
+ int deleted = 0, a, b;
+
+ 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, 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;
+ deleted = 1;
+ }
+
+ if (deleted) {
+ /* Reordering - DrStein */
+ for (b = 0; b < ci->bwcount; b++) {
+ if (ci->badwords[b].in_use) {
+ for (a = 0; a < ci->bwcount; a++) {
+ if (a > b)
+ break;
+ if (!(ci->badwords[a].in_use)) {
+ ci->badwords[a].in_use = ci->badwords[b].in_use;
+ ci->badwords[a].type = ci->badwords[b].type;
+ if (ci->badwords[b].word) {
+ ci->badwords[a].word = sstrdup(ci->badwords[b].word);
+ free(ci->badwords[b].word);
+ }
+ ci->badwords[b].word = NULL;
+ ci->badwords[b].in_use = 0;
+ break;
+ }
+ }
+ }
+ }
+ /* After reordering only the entries at the end could still be empty.
+ * We ll free the places no longer in use... - Viper */
+ for (i = ci->bwcount - 1; i >= 0; i--) {
+ if (ci->badwords[i].in_use)
+ break;
+ ci->bwcount--;
+ }
+ ci->badwords =
+ srealloc(ci->badwords,sizeof(BadWord) * ci->bwcount);
+ }
+
+ } 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;
+}
+
+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 *);
+
+ *last = num;
+
+ if (num < 1 || num > ci->bwcount)
+ return 0;
+
+ bw = &ci->badwords[num - 1];
+ if (bw->word)
+ free(bw->word);
+ bw->word = NULL;
+ bw->in_use = 0;
+
+ return 1;
+}
+
+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;
+}
+
+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);
+}
diff --git a/src/core/bs_bot.c b/src/core/bs_bot.c
new file mode 100644
index 000000000..f35e55152
--- /dev/null
+++ b/src/core/bs_bot.c
@@ -0,0 +1,378 @@
+/* BotServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_bot(User * u);
+int delbot(BotInfo * bi);
+void myBotServHelp(User * u);
+void change_bot_nick(BotInfo * bi, char *newnick);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("BOT", do_bot, is_services_admin, -1, -1, -1,
+ BOT_SERVADMIN_HELP_BOT, BOT_SERVADMIN_HELP_BOT);
+ moduleAddCommand(BOTSERV, c, MOD_UNIQUE);
+
+ moduleSetBotHelp(myBotServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to Anopes /bs help output.
+ * @param u The user who is requesting help
+ **/
+void myBotServHelp(User * u)
+{
+ if (is_services_admin(u)) {
+ notice_lang(s_BotServ, u, BOT_HELP_CMD_BOT);
+ }
+}
+
+/**
+ * The /bs bot command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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 if (strlen(nick) > NickLen)
+ notice_lang(s_BotServ, u, BOT_BAD_NICK);
+ else if (strlen(user) >= USERMAX)
+ notice_lang(s_BotServ, u, BOT_LONG_IDENT, USERMAX - 1);
+ else if (strlen(user) > HOSTMAX)
+ notice_lang(s_BotServ, u, BOT_LONG_HOST, HOSTMAX);
+ else {
+ 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;
+ }
+ }
+
+ /* check for hardcored ircd forbidden nicks */
+ if (!anope_valid_nick(nick)) {
+ 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_LONG_IDENT, USERMAX - 1);
+ 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 */
+ /* use nickIsServices reduce the total number lines of code - TSL */
+
+ if (nickIsServices(nick, 0)) {
+ notice_lang(s_BotServ, u, BOT_BOT_CREATION_FAILED);
+ return MOD_CONT;
+ }
+
+ /* We check whether the nick is registered, and inform the user
+ * if so. You need to drop the nick manually before you can use
+ * it as a bot nick from now on -GD
+ */
+ if ((na = findnick(nick))) {
+ notice_lang(s_BotServ, u, NICK_ALREADY_REGISTERED, nick);
+ return MOD_CONT;
+ }
+
+ 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 */
+ EnforceQlinedNick(nick, s_BotServ);
+
+ /* We make the bot online, ready to serve */
+ anope_cmd_bot_nick(bi->nick, bi->user, bi->host, bi->real,
+ ircd->botserv_bot_mode);
+
+ notice_lang(s_BotServ, u, BOT_BOT_ADDED, bi->nick, bi->user,
+ bi->host, bi->real);
+
+ send_event(EVENT_BOT_CREATE, 1, bi->nick);
+ }
+ } 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 if (strlen(nick) > NickLen)
+ notice_lang(s_BotServ, u, BOT_BAD_NICK);
+ else if (user && strlen(user) >= USERMAX)
+ notice_lang(s_BotServ, u, BOT_LONG_IDENT, USERMAX - 1);
+ else if (host && strlen(host) > HOSTMAX)
+ notice_lang(s_BotServ, u, BOT_LONG_HOST, HOSTMAX);
+ else {
+ 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 */
+ /* use nickIsServices() to reduce the number of lines of code - TSL */
+ if (nickIsServices(nick, 0)) {
+ 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;
+ }
+ }
+
+ /* check for hardcored ircd forbidden nicks */
+ if (!anope_valid_nick(nick)) {
+ notice_lang(s_BotServ, u, BOT_BAD_NICK);
+ return MOD_CONT;
+ }
+
+ if (host && !isValidHost(host, 3)) {
+ notice_lang(s_BotServ, u, BOT_BAD_HOST);
+ return MOD_CONT;
+ }
+
+ if (user) {
+ for (ch = user; *ch && (ch - user) < USERMAX; ch++) {
+ if (!isalnum(*ch)) {
+ notice_lang(s_BotServ, u, BOT_LONG_IDENT, USERMAX - 1);
+ 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)) {
+ /* We check whether the nick is registered, and inform the user
+ * if so. You need to drop the nick manually before you can use
+ * it as a bot nick from now on -GD
+ */
+ if ((na = findnick(nick))) {
+ notice_lang(s_BotServ, u, NICK_ALREADY_REGISTERED,
+ nick);
+ return MOD_CONT;
+ }
+
+ /* The new nick is really different, so we remove the Q line for
+ the old nick. */
+ if (ircd->sqline) {
+ anope_cmd_unsqline(bi->nick);
+ }
+
+ /* We check whether user with this nick is online, and kill it if so */
+ EnforceQlinedNick(nick, s_BotServ);
+ }
+
+ 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. We must not forget to set
+ the Q:Line either (it's otherwise set in anope_cmd_bot_nick) */
+ if (!user) {
+ anope_cmd_chg_nick(oldnick, bi->nick);
+ anope_cmd_sqline(bi->nick, "Reserved for services");
+ } else {
+ anope_cmd_quit(oldnick, "Quit: Be right back");
+
+ anope_cmd_bot_nick(bi->nick, bi->user, bi->host, bi->real,
+ ircd->botserv_bot_mode);
+ bot_rejoin_all(bi);
+ }
+
+ notice_lang(s_BotServ, u, BOT_BOT_CHANGED, oldnick, bi->nick,
+ bi->user, bi->host, bi->real);
+
+ send_event(EVENT_BOT_CHANGE, 1, bi->nick);
+ }
+ } 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_event(EVENT_BOT_DEL, 1, bi->nick);
+ anope_cmd_quit(bi->nick,
+ "Quit: Help! I'm being deleted by %s!",
+ u->nick);
+ if (ircd->sqline) {
+ anope_cmd_unsqline(bi->nick);
+ }
+ delbot(bi);
+
+ notice_lang(s_BotServ, u, BOT_BOT_DELETED, nick);
+ }
+ } else
+ syntax_error(s_BotServ, u, "BOT", BOT_BOT_SYNTAX);
+
+ return MOD_CONT;
+}
+
+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;
+}
+
+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);
+}
diff --git a/src/core/bs_botlist.c b/src/core/bs_botlist.c
new file mode 100644
index 000000000..9e0fb9d45
--- /dev/null
+++ b/src/core/bs_botlist.c
@@ -0,0 +1,108 @@
+/* BotServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_botlist(User * u);
+void myBotServHelp(User * u);
+
+/**
+ * Create the botlist command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+ c = createCommand("BOTLIST", do_botlist, NULL, BOT_HELP_BOTLIST, -1,
+ -1, -1, -1);
+ moduleAddCommand(BOTSERV, c, MOD_UNIQUE);
+
+ moduleSetBotHelp(myBotServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to Anopes /bs help output.
+ * @param u The user who is requesting help
+ **/
+void myBotServHelp(User * u)
+{
+ notice_lang(s_BotServ, u, BOT_HELP_CMD_BOTLIST);
+}
+
+/**
+ * The /bs botlist command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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;
+}
diff --git a/src/core/bs_fantasy.c b/src/core/bs_fantasy.c
new file mode 100644
index 000000000..c63d139b1
--- /dev/null
+++ b/src/core/bs_fantasy.c
@@ -0,0 +1,89 @@
+/* BotServ core fantasy functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_fantasy(int argc, char **argv);
+
+/**
+ * Create the hook, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ EvtHook *hook;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+ hook = createEventHook(EVENT_BOT_FANTASY, do_fantasy);
+ moduleAddEventHook(hook);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+/**
+ * Handle all csmodeutils fantasy commands.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT or MOD_STOP
+ **/
+int do_fantasy(int argc, char **argv)
+{
+ User *u;
+ ChannelInfo *ci;
+ CSModeUtil *util = csmodeutils;
+ char *target;
+
+ if (argc < 3)
+ return MOD_CONT;
+
+ do {
+ if (stricmp(argv[0], util->bsname) == 0) {
+ /* This could have been moved to its own module
+ however it would require more coding to handle the pass holders
+ similar to how PROTECT is done
+ */
+ if (!ircd->halfop) {
+ if (!stricmp(argv[0], "halfop") || !stricmp(argv[0], "dehalfop")) {
+ return MOD_CONT;
+ }
+ }
+ u = finduser(argv[1]);
+ ci = cs_findchan(argv[2]);
+ if (!u || !ci)
+ return MOD_CONT;
+
+ target = ((argc == 4) ? argv[3] : 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);
+
+ return MOD_CONT;
+}
diff --git a/src/core/bs_fantasy_kick.c b/src/core/bs_fantasy_kick.c
new file mode 100644
index 000000000..d8f272e8a
--- /dev/null
+++ b/src/core/bs_fantasy_kick.c
@@ -0,0 +1,98 @@
+/* BotServ core fantasy functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_fantasy(int argc, char **argv);
+
+/**
+ * Create the hook, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ EvtHook *hook;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion
+ ("$Id$");
+ moduleSetType(CORE);
+
+ hook = createEventHook(EVENT_BOT_FANTASY, do_fantasy);
+ moduleAddEventHook(hook);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+/**
+ * Handle kick/k fantasy commands.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT or MOD_STOP
+ **/
+int do_fantasy(int argc, char **argv)
+{
+ User *u, *u2;
+ ChannelInfo *ci;
+ char *target = NULL;
+ char *reason = NULL;
+
+ if (argc < 3)
+ return MOD_CONT;
+
+ if ((stricmp(argv[0], "kick") == 0) || (stricmp(argv[0], "k") == 0)) {
+ u = finduser(argv[1]);
+ ci = cs_findchan(argv[2]);
+ if (!u || !ci)
+ return MOD_CONT;
+
+ if (argc >= 4) {
+ target = myStrGetToken(argv[3], ' ', 0);
+ reason = myStrGetTokenRemainder(argv[3], ' ', 1);
+ }
+ 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 {
+ u2 = finduser(target);
+ if (u2 && ci->c && is_on_chan(ci->c, u2)) {
+ if (!reason && !is_protected(u2))
+ bot_raw_kick(u, ci, target, "Requested");
+ else if (!is_protected(u2))
+ bot_raw_kick(u, ci, target, reason);
+ }
+ }
+ }
+ }
+
+ if (target)
+ free(target);
+ if (reason)
+ free(reason);
+
+ return MOD_CONT;
+}
diff --git a/src/core/bs_fantasy_kickban.c b/src/core/bs_fantasy_kickban.c
new file mode 100644
index 000000000..4cb64f116
--- /dev/null
+++ b/src/core/bs_fantasy_kickban.c
@@ -0,0 +1,99 @@
+/* BotServ core fantasy functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_fantasy(int argc, char **argv);
+
+/**
+ * Create the hook, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ EvtHook *hook;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion
+ ("$Id$");
+ moduleSetType(CORE);
+
+ hook = createEventHook(EVENT_BOT_FANTASY, do_fantasy);
+ moduleAddEventHook(hook);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+/**
+ * Handle kickban/kb fantasy commands.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT or MOD_STOP
+ **/
+int do_fantasy(int argc, char **argv)
+{
+ User *u, *u2;
+ ChannelInfo *ci;
+ char *target = NULL;
+ char *reason = NULL;
+
+ if (argc < 3)
+ return MOD_CONT;
+
+ if ((stricmp(argv[0], "kickban") == 0)
+ || (stricmp(argv[0], "kb") == 0)) {
+ u = finduser(argv[1]);
+ ci = cs_findchan(argv[2]);
+ if (!u || !ci)
+ return MOD_CONT;
+
+ if (argc >= 4) {
+ target = myStrGetToken(argv[3], ' ', 0);
+ reason = myStrGetTokenRemainder(argv[3], ' ', 1);
+ }
+ 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) == 0) {
+ bot_raw_ban(u, ci, u->nick, "Oops!");
+ } else {
+ u2 = finduser(target);
+ if (u2 && ci->c && is_on_chan(ci->c, u2)) {
+ if (!reason && !is_protected(u2))
+ bot_raw_ban(u, ci, target, "Requested");
+ else if (!is_protected(u2))
+ bot_raw_ban(u, ci, target, reason);
+ }
+ }
+ }
+ }
+
+ if (target)
+ free(target);
+ if (reason)
+ free(reason);
+
+ return MOD_CONT;
+}
diff --git a/src/core/bs_fantasy_owner.c b/src/core/bs_fantasy_owner.c
new file mode 100644
index 000000000..934d3ccca
--- /dev/null
+++ b/src/core/bs_fantasy_owner.c
@@ -0,0 +1,88 @@
+/* BotServ core fantasy functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_fantasy(int argc, char **argv);
+
+/**
+ * Create the hook, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ EvtHook *hook;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion
+ ("$Id$");
+ moduleSetType(CORE);
+
+ /* No need to load of we don't support owner */
+ if (!ircd->owner) {
+ alog("Your ircd doesn't support the owner channelmode; bs_fantasy_owner won't be loaded");
+ return MOD_STOP;
+ }
+
+ hook = createEventHook(EVENT_BOT_FANTASY, do_fantasy);
+ moduleAddEventHook(hook);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+/**
+ * Handle owner/deowner fantasy commands.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT or MOD_STOP
+ **/
+int do_fantasy(int argc, char **argv)
+{
+ User *u;
+ ChannelInfo *ci;
+
+ if (argc < 3)
+ return MOD_CONT;
+
+ if (stricmp(argv[0], "deowner") == 0) {
+ u = finduser(argv[1]);
+ ci = cs_findchan(argv[2]);
+ if (!u || !ci)
+ return MOD_CONT;
+
+ if (is_founder(u, ci))
+ bot_raw_mode(u, ci, ircd->ownerunset, u->nick);
+ } else if (stricmp(argv[0], "owner") == 0) {
+ u = finduser(argv[1]);
+ ci = cs_findchan(argv[2]);
+ if (!u || !ci)
+ return MOD_CONT;
+
+ if (is_founder(u, ci))
+ bot_raw_mode(u, ci, ircd->ownerset, u->nick);
+ }
+
+ return MOD_CONT;
+}
diff --git a/src/core/bs_fantasy_seen.c b/src/core/bs_fantasy_seen.c
new file mode 100644
index 000000000..75abdd26b
--- /dev/null
+++ b/src/core/bs_fantasy_seen.c
@@ -0,0 +1,139 @@
+/* BotServ core fantasy functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_fantasy(int argc, char **argv);
+
+/**
+ * Create the hook, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ EvtHook *hook;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion
+ ("$Id$");
+ moduleSetType(CORE);
+
+ hook = createEventHook(EVENT_BOT_FANTASY, do_fantasy);
+ moduleAddEventHook(hook);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+/**
+ * Handle seen fantasy command.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT or MOD_STOP
+ **/
+int do_fantasy(int argc, char **argv)
+{
+ User *u;
+ ChannelInfo *ci;
+ User *u2;
+ NickAlias *na;
+ ChanAccess *access;
+ char buf[BUFSIZE];
+ char *target = NULL;
+
+ if (argc < 4)
+ return MOD_CONT;
+
+ if (stricmp(argv[0], "seen") == 0) {
+ u = finduser(argv[1]);
+ ci = cs_findchan(argv[2]);
+ if (!u || !ci)
+ return MOD_CONT;
+
+ target = myStrGetToken(argv[3], ' ', 0);
+
+ if (stricmp(ci->bi->nick, target) == 0) {
+ /* If we look for the bot */
+ snprintf(buf, sizeof(buf), getstring(u->na, BOT_SEEN_BOT),
+ u->nick);
+ anope_cmd_privmsg(ci->bi->nick, ci->name, "%s", 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);
+ anope_cmd_privmsg(ci->bi->nick, ci->name, "%s", 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);
+
+ anope_cmd_privmsg(ci->bi->nick, ci->name, "%s", 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);
+ }
+ anope_cmd_privmsg(ci->bi->nick, ci->name, "%s", buf);
+ } else if (na->nc == ci->founder) {
+ /* User is the founder of the channel */
+ char durastr[192];
+ duration(u->na, durastr, sizeof(durastr),
+ time(NULL) - na->last_seen);
+ snprintf(buf, sizeof(buf), getstring(u->na, BOT_SEEN_ON),
+ target, durastr);
+ anope_cmd_privmsg(ci->bi->nick, ci->name, "%s", buf);
+ } else {
+ /* All other cases */
+ snprintf(buf, sizeof(buf), getstring(u->na, BOT_SEEN_UNKNOWN),
+ target);
+ anope_cmd_privmsg(ci->bi->nick, ci->name, "%s", buf);
+ }
+ /* free myStrGetToken(ed) variable target (#851) */
+ Anope_Free(target);
+ }
+
+ return MOD_CONT;
+}
diff --git a/src/core/bs_help.c b/src/core/bs_help.c
new file mode 100644
index 000000000..7d34ef705
--- /dev/null
+++ b/src/core/bs_help.c
@@ -0,0 +1,67 @@
+/* BotServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_help(User * u);
+
+/**
+ * Create the help command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+ c = createCommand("HELP", do_help, NULL, -1, -1, -1, -1, -1);
+ moduleAddCommand(BOTSERV, c, MOD_UNIQUE);
+
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * The /bs help command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+int do_help(User * u)
+{
+ char *cmd = strtok(NULL, "");
+
+ if (!cmd) {
+ notice_help(s_BotServ, u, BOT_HELP);
+ moduleDisplayHelp(4, u);
+ notice_help(s_BotServ, u, BOT_HELP_FOOTER, BSMinUsers);
+ } else {
+ mod_help_cmd(s_BotServ, u, BOTSERV, cmd);
+ }
+ return MOD_CONT;
+}
diff --git a/src/core/bs_info.c b/src/core/bs_info.c
new file mode 100644
index 000000000..281ba0055
--- /dev/null
+++ b/src/core/bs_info.c
@@ -0,0 +1,282 @@
+/* BotServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_info(User * u);
+void send_bot_channels(User * u, BotInfo * bi);
+void myBotServHelp(User * u);
+
+/**
+ * Create the info command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+ c = createCommand("INFO", do_info, NULL, BOT_HELP_INFO, -1, -1, -1,
+ -1);
+ moduleAddCommand(BOTSERV, c, MOD_UNIQUE);
+
+ moduleSetBotHelp(myBotServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to Anopes /bs help output.
+ * @param u The user who is requesting help
+ **/
+void myBotServHelp(User * u)
+{
+ notice_lang(s_BotServ, u, BOT_HELP_CMD_INFO);
+}
+
+/**
+ * The /bs info command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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;
+ }
+ if (ci->flags & CI_VERBOTEN) {
+ notice_lang(s_BotServ, u, CHAN_X_FORBIDDEN, query);
+ 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;
+}
+
+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, "%s", buf);
+ *buf = 0;
+ end = buf;
+ }
+ end +=
+ snprintf(end, sizeof(buf) - (end - buf), " %s ",
+ ci->name);
+ }
+ }
+ }
+
+ if (*buf)
+ notice_user(s_BotServ, u, "%s", buf);
+ return;
+}
diff --git a/src/core/bs_kick.c b/src/core/bs_kick.c
new file mode 100644
index 000000000..22a1e72c9
--- /dev/null
+++ b/src/core/bs_kick.c
@@ -0,0 +1,379 @@
+/* BotServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_kickcmd(User * u);
+
+void myBotServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+ c = createCommand("KICK", do_kickcmd, NULL, BOT_HELP_KICK, -1, -1, -1,
+ -1);
+ moduleAddCommand(BOTSERV, c, MOD_UNIQUE);
+ c = createCommand("KICK BADWORDS", NULL, NULL, BOT_HELP_KICK_BADWORDS,
+ -1, -1, -1, -1);
+ moduleAddCommand(BOTSERV, c, MOD_UNIQUE);
+ c = createCommand("KICK BOLDS", NULL, NULL, BOT_HELP_KICK_BOLDS, -1,
+ -1, -1, -1);
+ moduleAddCommand(BOTSERV, c, MOD_UNIQUE);
+ c = createCommand("KICK CAPS", NULL, NULL, BOT_HELP_KICK_CAPS, -1, -1,
+ -1, -1);
+ moduleAddCommand(BOTSERV, c, MOD_UNIQUE);
+ c = createCommand("KICK COLORS", NULL, NULL, BOT_HELP_KICK_COLORS, -1,
+ -1, -1, -1);
+ moduleAddCommand(BOTSERV, c, MOD_UNIQUE);
+ c = createCommand("KICK FLOOD", NULL, NULL, BOT_HELP_KICK_FLOOD, -1,
+ -1, -1, -1);
+ moduleAddCommand(BOTSERV, c, MOD_UNIQUE);
+ c = createCommand("KICK REPEAT", NULL, NULL, BOT_HELP_KICK_REPEAT, -1,
+ -1, -1, -1);
+ moduleAddCommand(BOTSERV, c, MOD_UNIQUE);
+ c = createCommand("KICK REVERSES", NULL, NULL, BOT_HELP_KICK_REVERSES,
+ -1, -1, -1, -1);
+ moduleAddCommand(BOTSERV, c, MOD_UNIQUE);
+ c = createCommand("KICK UNDERLINES", NULL, NULL,
+ BOT_HELP_KICK_UNDERLINES, -1, -1, -1, -1);
+ moduleAddCommand(BOTSERV, c, MOD_UNIQUE);
+
+
+ moduleSetBotHelp(myBotServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to Anopes /bs help output.
+ * @param u The user who is requesting help
+ **/
+void myBotServHelp(User * u)
+{
+ notice_lang(s_BotServ, u, BOT_HELP_CMD_KICK);
+}
+
+/**
+ * The /bs kick command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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 (!ci->bi)
+ notice_help(s_BotServ, u, BOT_NOT_ASSIGNED);
+ else {
+ if (!stricmp(option, "BADWORDS")) {
+ if (!stricmp(value, "ON")) {
+ if (ttb) {
+ ci->ttb[TTB_BADWORDS] =
+ strtol(ttb, (char **) NULL, 10);
+ /* Only error if errno returns ERANGE or EINVAL or we are less then 0 - TSL */
+ if (errno == ERANGE || errno == EINVAL
+ || ci->ttb[TTB_BADWORDS] < 0) {
+ /* leaving the debug behind since we might want to know what these are */
+ if (debug) {
+ alog("debug: errno is %d ERANGE %d EINVAL %d ttb %d", errno, ERANGE, EINVAL, ci->ttb[TTB_BADWORDS]);
+ }
+ /* reset the value back to 0 - TSL */
+ 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] = strtol(ttb, (char **) NULL, 10);
+ if (errno == ERANGE || errno == EINVAL
+ || ci->ttb[TTB_BOLDS] < 0) {
+ if (debug) {
+ alog("debug: errno is %d ERANGE %d EINVAL %d ttb %d", errno, ERANGE, EINVAL, ci->ttb[TTB_BOLDS]);
+ }
+ 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] = strtol(ttb, (char **) NULL, 10);
+ if (errno == ERANGE || errno == EINVAL
+ || ci->ttb[TTB_CAPS] < 0) {
+ if (debug) {
+ alog("debug: errno is %d ERANGE %d EINVAL %d ttb %d", errno, ERANGE, EINVAL, ci->ttb[TTB_CAPS]);
+ }
+ 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] = strtol(ttb, (char **) NULL, 10);
+ if (errno == ERANGE || errno == EINVAL
+ || ci->ttb[TTB_COLORS] < 0) {
+ if (debug) {
+ alog("debug: errno is %d ERANGE %d EINVAL %d ttb %d", errno, ERANGE, EINVAL, ci->ttb[TTB_COLORS]);
+ }
+ 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] = strtol(ttb, (char **) NULL, 10);
+ if (errno == ERANGE || errno == EINVAL
+ || ci->ttb[TTB_FLOOD] < 0) {
+ if (debug) {
+ alog("debug: errno is %d ERANGE %d EINVAL %d ttb %d", errno, ERANGE, EINVAL, ci->ttb[TTB_FLOOD]);
+ }
+ 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] = strtol(ttb, (char **) NULL, 10);
+ if (errno == ERANGE || errno == EINVAL
+ || ci->ttb[TTB_REPEAT] < 0) {
+ if (debug) {
+ alog("debug: errno is %d ERANGE %d EINVAL %d ttb %d", errno, ERANGE, EINVAL, ci->ttb[TTB_REPEAT]);
+ }
+ 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] =
+ strtol(ttb, (char **) NULL, 10);
+ if (errno == ERANGE || errno == EINVAL
+ || ci->ttb[TTB_REVERSES] < 0) {
+ if (debug) {
+ alog("debug: errno is %d ERANGE %d EINVAL %d ttb %d", errno, ERANGE, EINVAL, ci->ttb[TTB_REVERSES]);
+ }
+ 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] =
+ strtol(ttb, (char **) NULL, 10);
+ if (errno == ERANGE || errno == EINVAL
+ || ci->ttb[TTB_UNDERLINES] < 0) {
+ if (debug) {
+ alog("debug: errno is %d ERANGE %d EINVAL %d ttb %d", errno, ERANGE, EINVAL, ci->ttb[TTB_UNDERLINES]);
+ }
+ 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;
+}
diff --git a/src/core/bs_say.c b/src/core/bs_say.c
new file mode 100644
index 000000000..508efe320
--- /dev/null
+++ b/src/core/bs_say.c
@@ -0,0 +1,97 @@
+/* BotServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_say(User * u);
+void myBotServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+ c = createCommand("SAY", do_say, NULL, BOT_HELP_SAY, -1, -1, -1, -1);
+ moduleAddCommand(BOTSERV, c, MOD_UNIQUE);
+
+ moduleSetBotHelp(myBotServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to Anopes /bs help output.
+ * @param u The user who is requesting help
+ **/
+void myBotServHelp(User * u)
+{
+ notice_lang(s_BotServ, u, BOT_HELP_CMD_SAY);
+}
+
+/**
+ * The /bs say command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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') {
+ anope_cmd_privmsg(ci->bi->nick, ci->name, "%s", text);
+ ci->bi->lastmsg = time(NULL);
+ if (LogBot && LogChannel && logchan && !debug && findchan(LogChannel))
+ anope_cmd_privmsg(ci->bi->nick, LogChannel,
+ "SAY %s %s %s", u->nick, ci->name, text);
+ } else {
+ syntax_error(s_BotServ, u, "SAY", BOT_SAY_SYNTAX);
+ }
+ }
+ return MOD_CONT;
+}
diff --git a/src/core/bs_set.c b/src/core/bs_set.c
new file mode 100644
index 000000000..4126603d4
--- /dev/null
+++ b/src/core/bs_set.c
@@ -0,0 +1,208 @@
+/* BotServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_set(User * u);
+void myBotServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("SET", do_set, NULL, BOT_HELP_SET, -1, -1,
+ BOT_SERVADMIN_HELP_SET, BOT_SERVADMIN_HELP_SET);
+ moduleAddCommand(BOTSERV, c, MOD_UNIQUE);
+ c = createCommand("SET DONTKICKOPS", NULL, NULL,
+ BOT_HELP_SET_DONTKICKOPS, -1, -1, -1, -1);
+ moduleAddCommand(BOTSERV, c, MOD_UNIQUE);
+ c = createCommand("SET DONTKICKVOICES", NULL, NULL,
+ BOT_HELP_SET_DONTKICKVOICES, -1, -1, -1, -1);
+ moduleAddCommand(BOTSERV, c, MOD_UNIQUE);
+ c = createCommand("SET FANTASY", NULL, NULL, BOT_HELP_SET_FANTASY, -1,
+ -1, -1, -1);
+ moduleAddCommand(BOTSERV, c, MOD_UNIQUE);
+ c = createCommand("SET GREET", NULL, NULL, BOT_HELP_SET_GREET, -1, -1,
+ -1, -1);
+ moduleAddCommand(BOTSERV, c, MOD_UNIQUE);
+ c = createCommand("SET SYMBIOSIS", NULL, NULL, BOT_HELP_SET_SYMBIOSIS,
+ -1, -1, -1, -1);
+ c->help_param1 = s_ChanServ;
+ moduleAddCommand(BOTSERV, c, MOD_UNIQUE);
+ c = createCommand("SET NOBOT", NULL, NULL, -1, -1, -1,
+ BOT_SERVADMIN_HELP_SET_NOBOT,
+ BOT_SERVADMIN_HELP_SET_NOBOT);
+ moduleAddCommand(BOTSERV, c, MOD_UNIQUE);
+ c = createCommand("SET PRIVATE", NULL, NULL, -1, -1, -1,
+ BOT_SERVADMIN_HELP_SET_PRIVATE,
+ BOT_SERVADMIN_HELP_SET_PRIVATE);
+ moduleAddCommand(BOTSERV, c, MOD_UNIQUE);
+
+
+ moduleSetBotHelp(myBotServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to Anopes /bs help output.
+ * @param u The user who is requesting help
+ **/
+void myBotServHelp(User * u)
+{
+ notice_lang(s_BotServ, u, BOT_HELP_CMD_SET);
+}
+
+/**
+ * The /bs set command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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;
+}
diff --git a/src/core/bs_unassign.c b/src/core/bs_unassign.c
new file mode 100644
index 000000000..a5e0af6bb
--- /dev/null
+++ b/src/core/bs_unassign.c
@@ -0,0 +1,89 @@
+/* BotServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_unassign(User * u);
+void myBotServHelp(User * u);
+
+/**
+ * Create the unassign command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+ c = createCommand("UNASSIGN", do_unassign, NULL, BOT_HELP_UNASSIGN, -1,
+ -1, -1, -1);
+ moduleAddCommand(BOTSERV, c, MOD_UNIQUE);
+
+ moduleSetBotHelp(myBotServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to Anopes /bs help output.
+ * @param u The user who is requesting help
+ **/
+void myBotServHelp(User * u)
+{
+ notice_lang(s_BotServ, u, BOT_HELP_CMD_UNASSIGN);
+}
+
+/**
+ * The /bs unassign command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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)
+ notice_help(s_BotServ, u, BOT_NOT_ASSIGNED);
+ else {
+ unassign(u, ci);
+ notice_lang(s_BotServ, u, BOT_UNASSIGN_UNASSIGNED, ci->name);
+ }
+ return MOD_CONT;
+}
diff --git a/src/core/configure b/src/core/configure
new file mode 100755
index 000000000..68d2b7713
--- /dev/null
+++ b/src/core/configure
@@ -0,0 +1,53 @@
+#!/bin/sh
+
+echo2 () {
+ $ECHO2 "$*$ECHO2SUF" # these are defined later
+}
+
+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
+
+
+echo2 "SRCS=" > ./Makefile.inc
+FIRST=1
+for oldfile in *.c
+do
+ if [ "$FIRST" = 1 ] ; then
+ echo2 " "$oldfile >> ./Makefile.inc
+ else
+ echo "\\" >> ./Makefile.inc
+ echo2 " " $oldfile >> ./Makefile.inc
+ fi
+ FIRST=0
+done
+echo "" >> ./Makefile.inc
+
+echo2 "SUBS=" >> ./Makefile.inc
+FIRST=1
+for dir in *
+do
+ if [ -d $dir ] ; then
+ if [ -f $dir/Makefile ] ; then
+ if [ "$FIRST" = 1 ] ; then
+ echo2 " "$dir >> ./Makefile.inc
+ else
+ echo "\\" >> ./Makefile.inc
+ echo2 " " $dir >> ./Makefile.inc
+ fi
+ FIRST=0
+ fi
+ fi
+done
+
+exit 0
+
diff --git a/src/core/cs_access.c b/src/core/cs_access.c
new file mode 100644
index 000000000..f36dda0a0
--- /dev/null
+++ b/src/core/cs_access.c
@@ -0,0 +1,543 @@
+/* ChanServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+
+int do_access(User * u);
+int do_levels(User * u);
+
+void myChanServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion
+ ("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("ACCESS", do_access, NULL, CHAN_HELP_ACCESS, -1, -1,
+ -1, -1);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+ c = createCommand("ACCESS LEVELS", NULL, NULL, CHAN_HELP_ACCESS_LEVELS,
+ -1, -1, -1, -1);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+ c = createCommand("LEVELS", do_levels, NULL, CHAN_HELP_LEVELS, -1, -1,
+ -1, -1);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+ moduleSetChanHelp(myChanServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to anopes /cs help output.
+ * @param u The user who is requesting help
+ **/
+void myChanServHelp(User * u)
+{
+ notice_lang(s_ChanServ, u, CHAN_HELP_CMD_ACCESS);
+ notice_lang(s_ChanServ, u, CHAN_HELP_CMD_LEVELS);
+}
+
+
+static int access_del(User * u, ChannelInfo *ci, ChanAccess * access, int *perm, int uacc)
+{
+ char *nick;
+ if (!access->in_use)
+ return 0;
+ if (!is_services_admin(u) && uacc <= access->level) {
+ (*perm)++;
+ return 0;
+ }
+ nick = access->nc->display;
+ access->nc = NULL;
+ access->in_use = 0;
+ send_event(EVENT_ACCESS_DEL, 3, ci->name, u->nick, nick);
+ 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, &ci->access[num - 1], perm, uacc);
+}
+
+
+static int access_list(User * u, int index, ChannelInfo * ci,
+ int *sent_header)
+{
+ ChanAccess *access = &ci->access[index];
+ const 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);
+}
+
+
+/**
+ * The /cs access command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+int do_access(User * u)
+{
+ char *chan = strtok(NULL, " ");
+ char *cmd = strtok(NULL, " ");
+ char *nick = strtok(NULL, " ");
+ char *s = strtok(NULL, " ");
+ char event_access[BUFSIZE];
+
+ ChannelInfo *ci;
+ NickAlias *na = NULL;
+ NickCore *nc;
+ ChanAccess *access;
+
+ int i;
+ int 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) {
+ if (ircd->halfop)
+ notice_lang(s_ChanServ, u, CHAN_ACCESS_XOP_HOP, s_ChanServ);
+ else
+ 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;
+ snprintf(event_access, BUFSIZE, "%d", access->level);
+ send_event(EVENT_ACCESS_CHANGE, 4, ci->name, u->nick,
+ na->nick, event_access);
+ alog("%s: %s!%s@%s (level %d) set access level %d to %s (group %s) on channel %s", s_ChanServ, u->nick, u->username, u->host, 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;
+ }
+ }
+
+ /* All entries should be in use so we no longer need
+ * to go over the entire list..
+ for (i = 0; i < ci->accesscount; i++) {
+ if (!ci->access[i].in_use)
+ break;
+ }
+ */
+
+ 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;
+
+ snprintf(event_access, BUFSIZE, "%d", access->level);
+ send_event(EVENT_ACCESS_ADD, 4, ci->name, u->nick, na->nick,
+ event_access);
+ alog("%s: %s!%s@%s (level %d) set access level %d to %s (group %s) on channel %s", s_ChanServ, u->nick, u->username, u->host, 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) {
+ int deleted, a, b;
+ 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, 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) {
+ deleted = 0;
+ 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, u->host, get_access(u, ci), na->nick, access->nc->display, chan);
+ access->nc = NULL;
+ access->in_use = 0;
+ deleted = 1;
+ }
+ }
+
+ if (deleted) {
+ /* Reordering - DrStein */
+ for (b = 0; b < ci->accesscount; b++) {
+ if (ci->access[b].in_use) {
+ for (a = 0; a < ci->accesscount; a++) {
+ if (a > b)
+ break;
+ if (!ci->access[a].in_use) {
+ ci->access[a].in_use = 1;
+ ci->access[a].level = ci->access[b].level;
+ ci->access[a].nc = ci->access[b].nc;
+ ci->access[a].last_seen =
+ ci->access[b].last_seen;
+ ci->access[b].nc = NULL;
+ ci->access[b].in_use = 0;
+ break;
+ }
+ }
+ }
+ }
+
+ /* After reordering only the entries at the end could still be empty.
+ * We ll free the places no longer in use... */
+ for (i = ci->accesscount - 1; i >= 0; i--) {
+ if (ci->access[i].in_use == 1)
+ break;
+
+ ci->accesscount--;
+ }
+ ci->access =
+ srealloc(ci->access,sizeof(ChanAccess) * ci->accesscount);
+
+ /* We don't know the nick if someone used numbers, so we trigger the event without
+ * nick param. We just do this once, even if someone enters a range. -Certus */
+ if (na)
+ send_event(EVENT_ACCESS_DEL, 3, ci->name, u->nick, na->nick);
+ else
+ send_event(EVENT_ACCESS_DEL, 2, ci->name, u->nick);
+ }
+ } 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;
+
+ send_event(EVENT_ACCESS_CLEAR, 2, ci->name, u->nick);
+
+ notice_lang(s_ChanServ, u, CHAN_ACCESS_CLEAR, ci->name);
+ alog("%s: %s!%s@%s (level %d) cleared access list on %s",
+ s_ChanServ, u->nick, u->username, u->host,
+ get_access(u, ci), chan);
+
+ } else {
+ syntax_error(s_ChanServ, u, "ACCESS", CHAN_ACCESS_SYNTAX);
+ }
+ return MOD_CONT;
+}
+
+
+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;
+ int 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, u->host,
+ 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, u->host,
+ 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, u->host, ci->name);
+ notice_lang(s_ChanServ, u, CHAN_LEVELS_RESET, chan);
+ } else {
+ syntax_error(s_ChanServ, u, "LEVELS", CHAN_LEVELS_SYNTAX);
+ }
+ return MOD_CONT;
+}
diff --git a/src/core/cs_akick.c b/src/core/cs_akick.c
new file mode 100644
index 000000000..14014e054
--- /dev/null
+++ b/src/core/cs_akick.c
@@ -0,0 +1,668 @@
+/* ChanServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+
+int do_akick(User * u);
+void myChanServHelp(User * u);
+int get_access_nc(NickCore *nc, ChannelInfo *ci);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("AKICK", do_akick, NULL, CHAN_HELP_AKICK, -1, -1, -1,
+ -1);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+
+ moduleSetChanHelp(myChanServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to anopes /cs help output.
+ * @param u The user who is requesting help
+ **/
+void myChanServHelp(User * u)
+{
+ notice_lang(s_ChanServ, u, CHAN_HELP_CMD_AKICK);
+}
+
+/**
+ * The /cs akick command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+ /* `last' is set to the last index this routine was called with */
+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;
+}
+
+int akick_del_callback(User * u, int num, va_list args)
+{
+ ChannelInfo *ci = va_arg(args, ChannelInfo *);
+ int *last = va_arg(args, int *);
+
+ *last = num;
+
+ if (num < 1 || num > ci->akickcount)
+ return 0;
+
+ return akick_del(u, &ci->akick[num - 1]);
+}
+
+
+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;
+}
+
+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);
+}
+
+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;
+}
+
+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);
+}
+
+
+
+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;
+ Channel *c;
+ struct c_userlist *cu = NULL;
+ struct c_userlist *next;
+ User *u2;
+ char *argv[3];
+ int count = 0;
+
+ 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), *na2;
+ NickCore *nc = NULL;
+ char *nick, *user, *host;
+ int freemask = 0;
+
+ 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);
+ freemask = 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 (ircd->except) {
+ if (is_excepted_mask(ci, mask) == 1) {
+ notice_lang(s_ChanServ, u, CHAN_EXCEPTED, mask, chan);
+ if (freemask)
+ free(mask);
+ return MOD_CONT;
+ }
+ }
+
+ /* Check whether target nick has equal/higher access
+ * or whether the mask matches a user with higher/equal access - Viper */
+ if ((ci->flags & CI_PEACE) && nc) {
+ if ((nc == ci->founder) || (get_access_nc(nc, ci) >= get_access(u, ci))) {
+ notice_lang(s_ChanServ, u, PERMISSION_DENIED);
+ if (freemask)
+ free(mask);
+ return MOD_CONT;
+ }
+ } else if ((ci->flags & CI_PEACE)) {
+ char buf[BUFSIZE];
+ /* Match against all currently online users with equal or
+ * higher access. - Viper */
+ for (i = 0; i < 1024; i++) {
+ for (u2 = userlist[i]; u2; u2 = u2->next) {
+ if (is_founder(u2, ci) || (get_access(u2, ci) >= get_access(u, ci))) {
+ if (match_usermask(mask, u2)) {
+ notice_lang(s_ChanServ, u, PERMISSION_DENIED);
+ free(mask);
+ return MOD_CONT;
+ }
+ }
+ }
+ }
+
+ /* Match against the lastusermask of all nickalias's with equal
+ * or higher access. - Viper */
+ for (i = 0; i < 1024; i++) {
+ for (na2 = nalists[i]; na2; na2 = na2->next) {
+ if (na2->status & NS_VERBOTEN)
+ continue;
+
+ if (na2->nc && ((na2->nc == ci->founder) || (get_access_nc(na2->nc, ci)
+ >= get_access(u, ci)))) {
+ snprintf(buf, BUFSIZE, "%s!%s", na2->nick, na2->last_usermask);
+ if (match_wild_nocase(mask, buf)) {
+ notice_lang(s_ChanServ, u, PERMISSION_DENIED);
+ free(mask);
+ return MOD_CONT;
+ }
+ }
+ }
+ }
+ }
+
+ 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);
+ if (freemask)
+ free(mask);
+ return MOD_CONT;
+ }
+ }
+
+ /* All entries should be in use so we don't have to go over
+ * the entire list. We simply add new entries at the end. */
+ if (ci->akickcount >= CSAutokickMax) {
+ notice_lang(s_ChanServ, u, CHAN_AKICK_REACHED_LIMIT, CSAutokickMax);
+ if (freemask)
+ free(mask);
+ 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 = sstrdup(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;
+ }
+
+ /* Auto ENFORCE #63 */
+ c = findchan(ci->name);
+ if (c) {
+ cu = c->users;
+ while (cu) {
+ next = cu->next;
+ if (check_kick(cu->user, c->name, c->creation_time)) {
+ argv[0] = sstrdup(c->name);
+ argv[1] = sstrdup(cu->user->nick);
+ if (akick->reason)
+ argv[2] = sstrdup(akick->reason);
+ else
+ argv[2] = sstrdup("none");
+
+ 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_ADDED, mask, chan);
+
+ if (count)
+ notice_lang(s_ChanServ, u, CHAN_AKICK_ENFORCE_DONE, chan,
+ count);
+
+ if (freemask)
+ free(mask);
+
+ } 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) {
+ int deleted, a, b;
+
+ 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, 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);
+ deleted = 1;
+ }
+ if (deleted) {
+ /* Reordering - DrStein */
+ for (b = 0; b < ci->akickcount; b++) {
+ if (ci->akick[b].flags & AK_USED) {
+ for (a = 0; a < ci->akickcount; a++) {
+ if (a > b)
+ break;
+ if (!(ci->akick[a].flags & AK_USED)) {
+ ci->akick[a].flags = ci->akick[b].flags;
+ if (ci->akick[b].flags & AK_ISNICK) {
+ ci->akick[a].u.nc = ci->akick[b].u.nc;
+ } else {
+ ci->akick[a].u.mask =
+ sstrdup(ci->akick[b].u.mask);
+ }
+ /* maybe we should first check whether there
+ is a reason before we sstdrup it -Certus */
+ if (ci->akick[b].reason)
+ ci->akick[a].reason =
+ sstrdup(ci->akick[b].reason);
+ else
+ ci->akick[a].reason = NULL;
+ ci->akick[a].creator =
+ sstrdup(ci->akick[b].creator);
+ ci->akick[a].addtime = ci->akick[b].addtime;
+
+ akick_del(u, &ci->akick[b]);
+ break;
+ }
+ }
+ }
+ }
+ /* After reordering only the entries at the end could still be empty.
+ * We ll free the places no longer in use... - Viper */
+ for (i = ci->akickcount - 1; i >= 0; i--) {
+ if (ci->akick[i].flags & AK_USED)
+ break;
+
+ ci->akickcount--;
+ }
+ ci->akick =
+ srealloc(ci->akick,sizeof(AutoKick) * ci->akickcount);
+ }
+ } 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, c->creation_time)) {
+ 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, ci->name);
+
+ } else {
+ syntax_error(s_ChanServ, u, "AKICK", CHAN_AKICK_SYNTAX);
+ }
+ return MOD_CONT;
+}
+
+
+int get_access_nc(NickCore *nc, ChannelInfo *ci)
+{
+ ChanAccess *access;
+ if (!ci || !nc)
+ return 0;
+
+ if ((access = get_access_entry(nc, ci)))
+ return access->level;
+ return 0;
+}
+
+/* EOF */
diff --git a/src/core/cs_ban.c b/src/core/cs_ban.c
new file mode 100644
index 000000000..658fa8809
--- /dev/null
+++ b/src/core/cs_ban.c
@@ -0,0 +1,227 @@
+/* ChanServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_unban(User * u);
+int do_ban(User * u);
+void myChanServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("BAN", do_ban, NULL, CHAN_HELP_BAN, -1, -1, -1, -1);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+ c = createCommand("UNBAN", do_unban, NULL, CHAN_HELP_UNBAN, -1, -1, -1,
+ -1);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+
+ moduleSetChanHelp(myChanServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to anopes /cs help output.
+ * @param u The user who is requesting help
+ **/
+void myChanServHelp(User * u)
+{
+ notice_lang(s_ChanServ, u, CHAN_HELP_CMD_BAN);
+ notice_lang(s_ChanServ, u, CHAN_HELP_CMD_UNBAN);
+}
+
+/**
+ * The /cs ban command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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];
+
+ /*
+ * Dont ban/kick the user on channels where he is excepted
+ * to prevent services <-> server wars.
+ */
+ if (ircd->except) {
+ if (is_excepted(ci, u))
+ notice_lang(s_ChanServ, u, CHAN_EXCEPTED,
+ u->nick, ci->name);
+ continue;
+ }
+ if (is_protected(u)) {
+ notice_lang(s_ChanServ, u, PERMISSION_DENIED);
+ continue;
+ }
+
+ av[0] = sstrdup("+b");
+ get_idealban(ci, u, mask, sizeof(mask));
+ av[1] = mask;
+ anope_cmd_mode(whosends(ci), uc->chan->name, "+b %s",
+ 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)))
+ anope_cmd_kick(whosends(ci), ci->name, u->nick,
+ "%s (%s)", reason, u->nick);
+ else
+ anope_cmd_kick(whosends(ci), ci->name, u->nick, "%s",
+ 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);
+ /*
+ * Dont ban/kick the user on channels where he is excepted
+ * to prevent services <-> server wars.
+ */
+ } else if (ircd->except && is_excepted(ci, u2)) {
+ notice_lang(s_ChanServ, u, CHAN_EXCEPTED, u2->nick, ci->name);
+ } else if (ircd->protectedumode && is_protected(u2)) {
+ notice_lang(s_ChanServ, u, PERMISSION_DENIED);
+ } else {
+ char *av[3];
+ char mask[BUFSIZE];
+
+ av[0] = sstrdup("+b");
+ get_idealban(ci, u2, mask, sizeof(mask));
+ av[1] = mask;
+ anope_cmd_mode(whosends(ci), c->name, "+b %s", 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)))
+ anope_cmd_kick(whosends(ci), ci->name, params, "%s (%s)",
+ reason, u->nick);
+ else
+ anope_cmd_kick(whosends(ci), ci->name, params, "%s", reason);
+
+ av[0] = ci->name;
+ av[1] = params;
+ av[2] = reason;
+ do_kick(s_ChanServ, 3, av);
+ }
+ return MOD_CONT;
+}
+
+/**
+ * The /cs unban command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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 {
+ common_unban(ci, u->nick);
+ notice_lang(s_ChanServ, u, CHAN_UNBANNED, chan);
+ }
+ return MOD_CONT;
+}
diff --git a/src/core/cs_clear.c b/src/core/cs_clear.c
new file mode 100644
index 000000000..04f5df803
--- /dev/null
+++ b/src/core/cs_clear.c
@@ -0,0 +1,402 @@
+/* ChanServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_clear(User * u);
+void myChanServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("CLEAR", do_clear, NULL, CHAN_HELP_CLEAR, -1, -1, -1,
+ -1);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+
+ moduleSetChanHelp(myChanServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to anopes /cs help output.
+ * @param u The user who is requesting help
+ **/
+void myChanServHelp(User * u)
+{
+ notice_lang(s_ChanServ, u, CHAN_HELP_CMD_CLEAR);
+}
+
+/**
+ * The /cs clear command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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[2];
+ Entry *ban, *next;
+
+ if (c->bans && c->bans->count) {
+ for (ban = c->bans->entries; ban; ban = next) {
+ next = ban->next;
+ av[0] = sstrdup("-b");
+ av[1] = sstrdup(ban->mask);
+ anope_cmd_mode(whosends(ci), chan, "-b %s", ban->mask);
+ chan_set_modes(whosends(ci), c, 2, av, 0);
+ free(av[0]);
+ free(av[1]);
+ }
+ }
+
+ notice_lang(s_ChanServ, u, CHAN_CLEARED_BANS, chan);
+ } else if (ircd->except && stricmp(what, "excepts") == 0) {
+ char *av[2];
+ Entry *except, *next;
+
+ if (c->excepts && c->excepts->count) {
+ for (except = c->excepts->entries; except; except = next) {
+ next = except->next;
+ av[0] = sstrdup("-e");
+ av[1] = sstrdup(except->mask);
+ anope_cmd_mode(whosends(ci), chan, "-e %s", except->mask);
+ chan_set_modes(whosends(ci), c, 2, av, 0);
+ free(av[0]);
+ free(av[1]);
+ }
+ }
+ notice_lang(s_ChanServ, u, CHAN_CLEARED_EXCEPTS, chan);
+
+ } else if (ircd->invitemode && stricmp(what, "invites") == 0) {
+ char *av[2];
+ Entry *invite, *next;
+
+ if (c->invites && c->invites->count) {
+ for (invite = c->invites->entries; invite; invite = next) {
+ next = invite->next;
+ av[0] = sstrdup("-I");
+ av[1] = sstrdup(invite->mask);
+ anope_cmd_mode(whosends(ci), chan, "-I %s", invite->mask);
+ chan_set_modes(whosends(ci), c, 2, av, 0);
+ free(av[0]);
+ free(av[1]);
+ }
+ }
+ notice_lang(s_ChanServ, u, CHAN_CLEARED_INVITES, chan);
+
+ } else if (stricmp(what, "modes") == 0) {
+ char *argv[2];
+
+ if (c->mode) {
+ /* Clear modes the bulk of the modes */
+ anope_cmd_mode(whosends(ci), c->name, "%s",
+ ircd->modestoremove);
+ argv[0] = sstrdup(ircd->modestoremove);
+ chan_set_modes(whosends(ci), c, 1, argv, 0);
+ free(argv[0]);
+
+ /* to prevent the internals from complaining send -k, -L, -f by themselves if we need
+ to send them - TSL */
+ if (c->key) {
+ anope_cmd_mode(whosends(ci), c->name, "-k %s", c->key);
+ argv[0] = sstrdup("-k");
+ argv[1] = c->key;
+ chan_set_modes(whosends(ci), c, 2, argv, 0);
+ free(argv[0]);
+ }
+ if (ircd->Lmode && c->redirect) {
+ anope_cmd_mode(whosends(ci), c->name, "-L %s",
+ c->redirect);
+ argv[0] = sstrdup("-L");
+ argv[1] = c->redirect;
+ chan_set_modes(whosends(ci), c, 2, argv, 0);
+ free(argv[0]);
+ }
+ if (ircd->fmode && c->flood) {
+ if (flood_mode_char_remove) {
+ anope_cmd_mode(whosends(ci), c->name, "%s %s",
+ flood_mode_char_remove, c->flood);
+ argv[0] = sstrdup(flood_mode_char_remove);
+ argv[1] = c->flood;
+ chan_set_modes(whosends(ci), c, 2, argv, 0);
+ free(argv[0]);
+ } else {
+ if (debug) {
+ alog("debug: flood_mode_char_remove was not set unable to remove flood/throttle modes");
+ }
+ }
+ }
+ check_modes(c);
+ }
+
+ notice_lang(s_ChanServ, u, CHAN_CLEARED_MODES, chan);
+ } else if (stricmp(what, "ops") == 0) {
+ char *av[6]; /* The max we have to hold: chan, ts, modes(max3), nick, nick, nick */
+ int ac, isop, isadmin, isown, count, i;
+ char buf[BUFSIZE], tmp[BUFSIZE], tmp2[BUFSIZE];
+ struct c_userlist *cu, *next;
+
+ if (ircd->svsmode_ucmode) {
+ av[0] = chan;
+ anope_cmd_svsmode_chan(av[0], "-o", NULL);
+ if (ircd->owner) {
+ anope_cmd_svsmode_chan(av[0], ircd->ownerunset, NULL);
+ }
+ if (ircd->protect || ircd->admin) {
+ anope_cmd_svsmode_chan(av[0], ircd->adminunset, NULL);
+ }
+ for (cu = c->users; cu; cu = next) {
+ next = cu->next;
+ isop = chan_has_user_status(c, cu->user, CUS_OP);
+ isadmin = chan_has_user_status(c, cu->user, CUS_PROTECT);
+ isown = chan_has_user_status(c, cu->user, CUS_OWNER);
+ count = (isop ? 1 : 0) + (isadmin ? 1 : 0) + (isown ? 1 : 0);
+
+ if (!isop && !isadmin && !isown)
+ continue;
+
+ snprintf(tmp, BUFSIZE, "-%s%s%s", (isop ? "o" : ""), (isadmin ?
+ ircd->adminunset+1 : ""), (isown ? ircd->ownerunset+1 : ""));
+
+ if (ircdcap->tsmode) {
+ snprintf(buf, BUFSIZE - 1, "%ld", (long int) time(NULL));
+ av[1] = buf;
+ av[2] = tmp;
+ /* We have to give as much nicks as modes.. - Viper */
+ for (i = 0; i < count; i++)
+ av[i+3] = cu->user->nick;
+ ac = 3 + i;
+ } else {
+ av[1] = tmp;
+ /* We have to give as much nicks as modes.. - Viper */
+ for (i = 0; i < count; i++)
+ av[i+2] = cu->user->nick;
+ ac = 2 + i;
+ }
+
+ do_cmode(s_ChanServ, ac, av);
+ }
+ } else {
+ av[0] = chan;
+ for (cu = c->users; cu; cu = next) {
+ next = cu->next;
+ isop = chan_has_user_status(c, cu->user, CUS_OP);
+ isadmin = chan_has_user_status(c, cu->user, CUS_PROTECT);
+ isown = chan_has_user_status(c, cu->user, CUS_OWNER);
+ count = (isop ? 1 : 0) + (isadmin ? 1 : 0) + (isown ? 1 : 0);
+
+ if (!isop && !isadmin && !isown)
+ continue;
+
+ snprintf(tmp, BUFSIZE, "-%s%s%s", (isop ? "o" : ""), (isadmin ?
+ ircd->adminunset+1 : ""), (isown ? ircd->ownerunset+1 : ""));
+ /* We need to send the IRCd a nick for every mode.. - Viper */
+ snprintf(tmp2, BUFSIZE, "%s %s %s", (isop ? cu->user->nick : ""),
+ (isadmin ? cu->user->nick : ""), (isown ? cu->user->nick : ""));
+
+ if (ircdcap->tsmode) {
+ snprintf(buf, BUFSIZE - 1, "%ld", (long int) time(NULL));
+ av[1] = buf;
+ av[2] = tmp;
+ /* We have to give as much nicks as modes.. - Viper */
+ for (i = 0; i < count; i++)
+ av[i+3] = cu->user->nick;
+ ac = 3 + i;
+
+ anope_cmd_mode(whosends(ci), av[0], "%s %s", av[2], tmp2);
+ } else {
+ av[1] = tmp;
+ /* We have to give as much nicks as modes.. - Viper */
+ for (i = 0; i < count; i++)
+ av[i+2] = cu->user->nick;
+ ac = 2 + i;
+
+ anope_cmd_mode(whosends(ci), av[0], "%s %s", av[1], tmp2);
+ }
+
+ do_cmode(s_ChanServ, ac, av);
+ }
+ }
+ notice_lang(s_ChanServ, u, CHAN_CLEARED_OPS, chan);
+ } else if (ircd->halfop && stricmp(what, "hops") == 0) {
+ char *av[4];
+ int ac;
+ char buf[BUFSIZE];
+ struct c_userlist *cu, *next;
+
+ for (cu = c->users; cu; cu = next) {
+ next = cu->next;
+ if (!chan_has_user_status(c, cu->user, CUS_HALFOP))
+ continue;
+
+ if (ircdcap->tsmode) {
+ snprintf(buf, BUFSIZE - 1, "%ld", (long int) time(NULL));
+ av[0] = sstrdup(chan);
+ av[1] = buf;
+ av[2] = sstrdup("-h");
+ av[3] = sstrdup(cu->user->nick);
+ ac = 4;
+ } else {
+ av[0] = sstrdup(chan);
+ av[1] = sstrdup("-h");
+ av[2] = sstrdup(cu->user->nick);
+ ac = 3;
+ }
+
+ if (ircd->svsmode_ucmode) {
+ if (ircdcap->tsmode)
+ anope_cmd_svsmode_chan(av[0], av[2], NULL);
+ else
+ anope_cmd_svsmode_chan(av[0], av[1], NULL);
+
+ do_cmode(s_ChanServ, ac, av);
+ break;
+ } else {
+ if (ircdcap->tsmode)
+ anope_cmd_mode(whosends(ci), av[0], "%s %s", av[2],
+ av[3]);
+ else
+ anope_cmd_mode(whosends(ci), av[0], "%s %s", av[1],
+ av[2]);
+ }
+ do_cmode(s_ChanServ, ac, av);
+
+ if (ircdcap->tsmode) {
+ free(av[3]);
+ free(av[2]);
+ free(av[0]);
+ } else {
+ free(av[2]);
+ free(av[1]);
+ free(av[0]);
+ }
+ }
+ notice_lang(s_ChanServ, u, CHAN_CLEARED_HOPS, chan);
+ } else if (stricmp(what, "voices") == 0) {
+ char *av[4];
+ int ac;
+ char buf[BUFSIZE];
+ 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;
+
+ if (ircdcap->tsmode) {
+ snprintf(buf, BUFSIZE - 1, "%ld", (long int) time(NULL));
+ av[0] = sstrdup(chan);
+ av[1] = buf;
+ av[2] = sstrdup("-v");
+ av[3] = sstrdup(cu->user->nick);
+ ac = 4;
+ } else {
+ av[0] = sstrdup(chan);
+ av[1] = sstrdup("-v");
+ av[2] = sstrdup(cu->user->nick);
+ ac = 3;
+ }
+
+ if (ircd->svsmode_ucmode) {
+ if (ircdcap->tsmode)
+ anope_cmd_svsmode_chan(av[0], av[2], NULL);
+ else
+ anope_cmd_svsmode_chan(av[0], av[1], NULL);
+
+ do_cmode(s_ChanServ, ac, av);
+ break;
+ } else {
+ if (ircdcap->tsmode) {
+ anope_cmd_mode(whosends(ci), av[0], "%s %s", av[2],
+ av[3]);
+ } else {
+ anope_cmd_mode(whosends(ci), av[0], "%s %s", av[1],
+ av[2]);
+ }
+ }
+ do_cmode(s_ChanServ, ac, av);
+
+ if (ircdcap->tsmode) {
+ free(av[3]);
+ free(av[2]);
+ free(av[0]);
+ } else {
+ 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);
+ anope_cmd_kick(whosends(ci), 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;
+}
diff --git a/src/core/cs_drop.c b/src/core/cs_drop.c
new file mode 100644
index 000000000..dff5992e9
--- /dev/null
+++ b/src/core/cs_drop.c
@@ -0,0 +1,128 @@
+/* ChanServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_drop(User * u);
+void myChanServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("DROP", do_drop, NULL, -1, CHAN_HELP_DROP, -1,
+ CHAN_SERVADMIN_HELP_DROP, CHAN_SERVADMIN_HELP_DROP);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+
+ moduleSetChanHelp(myChanServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to anopes /cs help output.
+ * @param u The user who is requesting help
+ **/
+void myChanServHelp(User * u)
+{
+ notice_lang(s_ChanServ, u, CHAN_HELP_CMD_DROP);
+}
+
+/**
+ * The /cs command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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);
+
+ if (ci->c) {
+ if (ircd->regmode) {
+ ci->c->mode &= ~ircd->regmode;
+ anope_cmd_mode(whosends(ci), ci->name, "-r");
+ }
+ }
+
+ if (ircd->chansqline && (ci->flags & CI_VERBOTEN)) {
+ anope_cmd_unsqline(ci->name);
+ }
+
+ alog("%s: Channel %s dropped by %s!%s@%s (founder: %s)",
+ s_ChanServ, ci->name, u->nick, u->username,
+ u->host, (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)
+ anope_cmd_global(s_ChanServ,
+ "\2%s\2 used DROP on channel \2%s\2", u->nick,
+ chan);
+
+ notice_lang(s_ChanServ, u, CHAN_DROPPED, chan);
+ send_event(EVENT_CHAN_DROP, 1, chan);
+ }
+ return MOD_CONT;
+}
diff --git a/src/core/cs_forbid.c b/src/core/cs_forbid.c
new file mode 100644
index 000000000..cd7a0e584
--- /dev/null
+++ b/src/core/cs_forbid.c
@@ -0,0 +1,139 @@
+/* ChanServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_forbid(User * u);
+void myChanServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("FORBID", do_forbid, is_services_admin, -1, -1, -1,
+ CHAN_SERVADMIN_HELP_FORBID,
+ CHAN_SERVADMIN_HELP_FORBID);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+
+ moduleSetChanHelp(myChanServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+/**
+ * Add the help response to anopes /cs help output.
+ * @param u The user who is requesting help
+ **/
+void myChanServHelp(User * u)
+{
+ if (is_services_admin(u)) {
+ notice_lang(s_ChanServ, u, CHAN_HELP_CMD_FORBID);
+ }
+}
+
+/**
+ * The /cs forbid command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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 (*chan != '#') {
+ notice_lang(s_ChanServ, u, CHAN_SYMBOL_REQUIRED);
+ return MOD_CONT;
+ } else if (!anope_valid_chan(chan)) {
+ notice_lang(s_ChanServ, u, CHAN_X_INVALID, chan);
+ 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";
+ anope_cmd_kick(s_ChanServ, av[0], av[1], av[2]);
+ do_kick(s_ChanServ, 3, av);
+ }
+ }
+
+ if (WallForbid)
+ anope_cmd_global(s_ChanServ,
+ "\2%s\2 used FORBID on channel \2%s\2",
+ u->nick, ci->name);
+
+ if (ircd->chansqline) {
+ anope_cmd_sqline(ci->name, ((reason) ? reason : "Forbidden"));
+ }
+
+ alog("%s: %s set FORBID for channel %s", s_ChanServ, u->nick,
+ ci->name);
+ notice_lang(s_ChanServ, u, CHAN_FORBID_SUCCEEDED, chan);
+ send_event(EVENT_CHAN_FORBIDDEN, 1, 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;
+}
diff --git a/src/core/cs_getkey.c b/src/core/cs_getkey.c
new file mode 100644
index 000000000..e869e795e
--- /dev/null
+++ b/src/core/cs_getkey.c
@@ -0,0 +1,88 @@
+/* ChanServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_getkey(User * u);
+void myChanServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("GETKEY", do_getkey, NULL, CHAN_HELP_GETKEY, -1, -1,
+ -1, -1);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+
+ moduleSetChanHelp(myChanServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to anopes /cs help output.
+ * @param u The user who is requesting help
+ **/
+void myChanServHelp(User * u)
+{
+ notice_lang(s_ChanServ, u, CHAN_HELP_CMD_GETKEY);
+}
+
+/**
+ * The /cs getkey command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+int do_getkey(User * u)
+{
+ char *chan = strtok(NULL, " ");
+ ChannelInfo *ci;
+
+ if (!chan) {
+ syntax_error(s_ChanServ, u, "GETKEY", CHAN_GETKEY_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_GETKEY)) {
+ notice_lang(s_ChanServ, u, ACCESS_DENIED);
+ } else if (!ci->c || !ci->c->key) {
+ notice_lang(s_ChanServ, u, CHAN_GETKEY_NOKEY, chan);
+ } else {
+ notice_lang(s_ChanServ, u, CHAN_GETKEY_KEY, chan, ci->c->key);
+ }
+
+ return MOD_CONT;
+}
diff --git a/src/core/cs_getpass.c b/src/core/cs_getpass.c
new file mode 100644
index 000000000..458488cf0
--- /dev/null
+++ b/src/core/cs_getpass.c
@@ -0,0 +1,102 @@
+/* ChanServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_getpass(User * u);
+void myChanServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("GETPASS", do_getpass, is_services_admin, -1, -1, -1,
+ CHAN_SERVADMIN_HELP_GETPASS,
+ CHAN_SERVADMIN_HELP_GETPASS);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+
+ moduleSetChanHelp(myChanServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to anopes /cs help output.
+ * @param u The user who is requesting help
+ **/
+void myChanServHelp(User * u)
+{
+ if (is_services_admin(u)) {
+ notice_lang(s_ChanServ, u, CHAN_HELP_CMD_GETPASS);
+ }
+}
+
+/**
+ * The /cs getpass command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+
+int do_getpass(User * u)
+{
+ char *chan = strtok(NULL, " ");
+ char tmp_pass[PASSMAX];
+ ChannelInfo *ci;
+
+ 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 {
+ if(enc_decrypt(ci->founderpass, tmp_pass, PASSMAX - 1)==1) {
+ alog("%s: %s!%s@%s used GETPASS on %s",
+ s_ChanServ, u->nick, u->username, u->host, ci->name);
+ if (WallGetpass) {
+ anope_cmd_global(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, tmp_pass);
+ } else {
+ notice_lang(s_ChanServ, u, CHAN_GETPASS_UNAVAILABLE);
+ }
+ }
+ return MOD_CONT;
+}
diff --git a/src/core/cs_help.c b/src/core/cs_help.c
new file mode 100644
index 000000000..208009038
--- /dev/null
+++ b/src/core/cs_help.c
@@ -0,0 +1,84 @@
+/* ChanServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_help(User * u);
+
+/**
+ * Create the off command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("HELP", do_help, NULL, -1, -1, -1, -1, -1);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+/**
+ * The /cs help command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+int do_help(User * u)
+{
+ char *cmd = strtok(NULL, "");
+
+ if (!cmd) {
+ notice_help(s_ChanServ, u, CHAN_HELP);
+ moduleDisplayHelp(2, u);
+ 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);
+ } 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;
+}
diff --git a/src/core/cs_identify.c b/src/core/cs_identify.c
new file mode 100644
index 000000000..bde224a4a
--- /dev/null
+++ b/src/core/cs_identify.c
@@ -0,0 +1,117 @@
+/* ChanServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_identify(User * u);
+void myChanServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("IDENTIFY", do_identify, NULL, CHAN_HELP_IDENTIFY,
+ -1, -1, -1, -1);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+
+ c = createCommand("ID", do_identify, NULL, CHAN_HELP_IDENTIFY, -1, -1,
+ -1, -1);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+
+ moduleSetChanHelp(myChanServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to anopes /cs help output.
+ * @param u The user who is requesting help
+ **/
+void myChanServHelp(User * u)
+{
+ notice_lang(s_ChanServ, u, CHAN_HELP_CMD_IDENTIFY);
+}
+
+/**
+ * The /cs command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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 = enc_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, u->host, 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, u->host);
+ notice_lang(s_ChanServ, u, PASSWORD_INCORRECT);
+ bad_password(u);
+ }
+
+ }
+ return MOD_CONT;
+}
diff --git a/src/core/cs_info.c b/src/core/cs_info.c
new file mode 100644
index 000000000..0be9a8854
--- /dev/null
+++ b/src/core/cs_info.c
@@ -0,0 +1,249 @@
+/* ChanServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_info(User * u);
+void myChanServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("INFO", do_info, NULL, CHAN_HELP_INFO, -1,
+ CHAN_SERVADMIN_HELP_INFO, CHAN_SERVADMIN_HELP_INFO,
+ CHAN_SERVADMIN_HELP_INFO);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+
+ moduleSetChanHelp(myChanServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to anopes /cs help output.
+ * @param u The user who is requesting help
+ **/
+void myChanServHelp(User * u)
+{
+ notice_lang(s_ChanServ, u, CHAN_HELP_CMD_INFO);
+}
+
+/**
+ * The /cs info command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+int do_info(User * u)
+{
+/* 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)
+ */
+ 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;
+ time_t expt;
+
+ 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 & anope_get_secret_mode())
+ && (!ci->c
+ || !(ci->c->
+ mode & anope_get_secret_mode()))))) {
+ 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 (show_all) {
+ if (ci->flags & CI_NO_EXPIRE) {
+ notice_lang(s_ChanServ, u, CHAN_INFO_NO_EXPIRE);
+ } else {
+ if (is_servadmin) {
+ expt = ci->last_used + CSExpire;
+ tm = localtime(&expt);
+ strftime_lang(buf, sizeof(buf), u,
+ STRFTIME_DATE_TIME_FORMAT, tm);
+ notice_lang(s_ChanServ, u, CHAN_INFO_EXPIRE, buf);
+ }
+ }
+ }
+ 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;
+}
diff --git a/src/core/cs_invite.c b/src/core/cs_invite.c
new file mode 100644
index 000000000..a5b76fce2
--- /dev/null
+++ b/src/core/cs_invite.c
@@ -0,0 +1,90 @@
+/* ChanServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+void myChanServHelp(User * u);
+int do_invite(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("INVITE", do_invite, NULL, CHAN_HELP_INVITE, -1, -1,
+ -1, -1);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+
+ moduleSetChanHelp(myChanServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to anopes /cs help output.
+ * @param u The user who is requesting help
+ **/
+void myChanServHelp(User * u)
+{
+ notice_lang(s_ChanServ, u, CHAN_HELP_CMD_INVITE);
+}
+
+/**
+ * The /cs invite command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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 (ci->flags & CI_SUSPENDED) {
+ 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 {
+ anope_cmd_invite(whosends(ci), chan, u->nick);
+ }
+ return MOD_CONT;
+}
diff --git a/src/core/cs_kick.c b/src/core/cs_kick.c
new file mode 100644
index 000000000..25ce396ff
--- /dev/null
+++ b/src/core/cs_kick.c
@@ -0,0 +1,152 @@
+/* ChanServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_cs_kick(User * u);
+void myChanServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("KICK", do_cs_kick, NULL, CHAN_HELP_KICK, -1, -1, -1,
+ -1);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+
+ moduleSetChanHelp(myChanServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+/**
+ * Add the help response to anopes /cs help output.
+ * @param u The user who is requesting help
+ **/
+void myChanServHelp(User * u)
+{
+ notice_lang(s_ChanServ, u, CHAN_HELP_CMD_KICK);
+}
+
+/**
+ * The /cs kick command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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)))
+ anope_cmd_kick(whosends(ci), ci->name, u->nick,
+ "%s (%s)", reason, u->nick);
+ else
+ anope_cmd_kick(whosends(ci), ci->name, u->nick, "%s",
+ 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);
+ } else if (is_protected(u2)) {
+ notice_lang(s_ChanServ, u, PERMISSION_DENIED);
+ } else {
+ char *av[3];
+
+ if ((ci->flags & CI_SIGNKICK)
+ || ((ci->flags & CI_SIGNKICK_LEVEL)
+ && !check_access(u, ci, CA_SIGNKICK)))
+ anope_cmd_kick(whosends(ci), ci->name, params, "%s (%s)",
+ reason, u->nick);
+ else
+ anope_cmd_kick(whosends(ci), ci->name, params, "%s", reason);
+ av[0] = ci->name;
+ av[1] = params;
+ av[2] = reason;
+ do_kick(s_ChanServ, 3, av);
+ }
+ return MOD_CONT;
+}
diff --git a/src/core/cs_list.c b/src/core/cs_list.c
new file mode 100644
index 000000000..0dcda53dc
--- /dev/null
+++ b/src/core/cs_list.c
@@ -0,0 +1,199 @@
+/* ChanServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_list(User * u);
+void myChanServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("LIST", do_list, NULL, -1, CHAN_HELP_LIST,
+ CHAN_SERVADMIN_HELP_LIST,
+ CHAN_SERVADMIN_HELP_LIST, CHAN_SERVADMIN_HELP_LIST);
+
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+
+ moduleSetChanHelp(myChanServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to anopes /cs help output.
+ * @param u The user who is requesting help
+ **/
+void myChanServHelp(User * u)
+{
+ if (!CSListOpersOnly || (is_oper(u))) {
+ notice_lang(s_ChanServ, u, CHAN_HELP_CMD_LIST);
+ }
+}
+
+/**
+ * The /cs list command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+int do_list(User * u)
+{
+ char *pattern = strtok(NULL, " ");
+ int spattern_size;
+ char *spattern;
+ ChannelInfo *ci;
+ int nchans, i;
+ char buf[BUFSIZE];
+ int is_servadmin = is_services_admin(u);
+ int count = 0, from = 0, to = 0, tofree = 0;
+ char *tmp = NULL;
+ char *s = NULL;
+ char *keyword;
+ int32 matchflags = 0;
+
+ if (!(!CSListOpersOnly || (is_oper(u)))) {
+ notice_lang(s_ChanServ, u, ACCESS_DENIED);
+ return MOD_STOP;
+ }
+
+ 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) {
+ notice_lang(s_ChanServ, u, LIST_INCORRECT_RANGE);
+ notice_lang(s_ChanServ, u, CS_LIST_INCORRECT_RANGE);
+ return MOD_CONT;
+ }
+ for (s = tmp; *s; s++) {
+ if (!isdigit(*s)) {
+ free(tmp);
+ notice_lang(s_ChanServ, u, LIST_INCORRECT_RANGE);
+ notice_lang(s_ChanServ, u, CS_LIST_INCORRECT_RANGE);
+ return MOD_CONT;
+ }
+ }
+ from = atoi(tmp);
+ free(tmp);
+ tmp = myStrGetTokenRemainder(pattern, '-', 1); /* Read TO out */
+ if (!tmp) {
+ notice_lang(s_ChanServ, u, LIST_INCORRECT_RANGE);
+ notice_lang(s_ChanServ, u, CS_LIST_INCORRECT_RANGE);
+ return MOD_CONT;
+ }
+ for (s = tmp; *s; s++) {
+ if (!isdigit(*s)) {
+ free(tmp);
+ notice_lang(s_ChanServ, u, LIST_INCORRECT_RANGE);
+ notice_lang(s_ChanServ, u, CS_LIST_INCORRECT_RANGE);
+ return MOD_CONT;
+ }
+ }
+ to = atoi(tmp);
+ free(tmp);
+ pattern = sstrdup("*");
+ tofree = 1;
+ }
+ }
+
+ 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;
+ }
+
+ spattern_size = (strlen(pattern) + 2) * sizeof(char);
+ spattern = smalloc(spattern_size);
+ snprintf(spattern, spattern_size, "#%s", pattern);
+
+
+ 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)
+ || (stricmp(spattern, ci->name) == 0)
+ || match_wild_nocase(pattern, ci->name)
+ || match_wild_nocase(spattern, 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);
+ free(spattern);
+ }
+ if (tofree)
+ free(pattern);
+ return MOD_CONT;
+
+}
diff --git a/src/core/cs_logout.c b/src/core/cs_logout.c
new file mode 100644
index 000000000..2d963065c
--- /dev/null
+++ b/src/core/cs_logout.c
@@ -0,0 +1,131 @@
+/* ChanServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_logout(User * u);
+void myChanServHelp(User * u);
+void make_unidentified(User * u, ChannelInfo * ci);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("LOGOUT", do_logout, NULL, -1, CHAN_HELP_LOGOUT, -1,
+ CHAN_SERVADMIN_HELP_LOGOUT,
+ CHAN_SERVADMIN_HELP_LOGOUT);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+
+ moduleSetChanHelp(myChanServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to anopes /cs help output.
+ * @param u The user who is requesting help
+ **/
+void myChanServHelp(User * u)
+{
+ notice_lang(s_ChanServ, u, CHAN_HELP_CMD_LOGOUT);
+}
+
+/**
+ * The /cs command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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);
+ /* Since founders can not logout we should tell them -katsklaw */
+ } else if (u2 == u && is_real_founder(u, ci)) {
+ notice_lang(s_ChanServ, u, CHAN_LOGOUT_FOUNDER_FAILED, chan);
+ } else {
+ if (u2) {
+ make_unidentified(u2, ci);
+ notice_lang(s_ChanServ, u, CHAN_LOGOUT_SUCCEEDED, nick, chan);
+ alog("%s: User %s!%s@%s has been logged out of channel %s.",
+ s_ChanServ, u2->nick, u2->username, u2->host, 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);
+ alog("%s: All users identified have been logged out of channel %s.", s_ChanServ, chan);
+ }
+
+ }
+ return MOD_CONT;
+}
+
+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;
+ }
+ }
+}
diff --git a/src/core/cs_modes.c b/src/core/cs_modes.c
new file mode 100644
index 000000000..824764941
--- /dev/null
+++ b/src/core/cs_modes.c
@@ -0,0 +1,392 @@
+/* ChanServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+void myChanServHelp(User * u);
+int do_util(User * u, CSModeUtil * util);
+int do_op(User * u);
+int do_deop(User * u);
+int do_voice(User * u);
+int do_devoice(User * u);
+int do_halfop(User * u);
+int do_dehalfop(User * u);
+int do_protect(User * u);
+int do_deprotect(User * u);
+int do_owner(User * u);
+int do_deowner(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("OP", do_op, NULL, CHAN_HELP_OP, -1, -1, -1, -1);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+ c = createCommand("DEOP", do_deop, NULL, CHAN_HELP_DEOP, -1, -1, -1,
+ -1);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+ c = createCommand("VOICE", do_voice, NULL, CHAN_HELP_VOICE, -1, -1, -1,
+ -1);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+ c = createCommand("DEVOICE", do_devoice, NULL, CHAN_HELP_DEVOICE, -1,
+ -1, -1, -1);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+ if (ircd->halfop) {
+ c = createCommand("HALFOP", do_halfop, NULL, CHAN_HELP_HALFOP, -1,
+ -1, -1, -1);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+ c = createCommand("DEHALFOP", do_dehalfop, NULL,
+ CHAN_HELP_DEHALFOP, -1, -1, -1, -1);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+ }
+ if (ircd->protect) {
+ c = createCommand("PROTECT", do_protect, NULL, CHAN_HELP_PROTECT,
+ -1, -1, -1, -1);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+ c = createCommand("DEPROTECT", do_deprotect, NULL,
+ CHAN_HELP_DEPROTECT, -1, -1, -1, -1);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+ }
+ if (ircd->owner) {
+ c = createCommand("OWNER", do_owner, NULL, CHAN_HELP_OWNER, -1, -1,
+ -1, -1);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+ c = createCommand("DEOWNER", do_deowner, NULL, CHAN_HELP_DEOWNER,
+ -1, -1, -1, -1);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+ }
+ if (ircd->admin) {
+ c = createCommand("ADMIN", do_protect, NULL, CHAN_HELP_PROTECT, -1,
+ -1, -1, -1);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+ c = createCommand("DEADMIN", do_deprotect, NULL,
+ CHAN_HELP_DEPROTECT, -1, -1, -1, -1);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+ }
+
+ moduleSetChanHelp(myChanServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+/**
+ * Add the help response to anopes /cs help output.
+ * @param u The user who is requesting help
+ **/
+void myChanServHelp(User * u)
+{
+ if (ircd->owner) {
+ notice_lang(s_ChanServ, u, CHAN_HELP_CMD_OWNER);
+ notice_lang(s_ChanServ, u, CHAN_HELP_CMD_DEOWNER);
+ }
+ if (ircd->protect) {
+ notice_lang(s_ChanServ, u, CHAN_HELP_CMD_PROTECT);
+ notice_lang(s_ChanServ, u, CHAN_HELP_CMD_DEPROTECT);
+ } else if (ircd->admin) {
+ notice_lang(s_ChanServ, u, CHAN_HELP_CMD_ADMIN);
+ notice_lang(s_ChanServ, u, CHAN_HELP_CMD_DEADMIN);
+ }
+
+ notice_lang(s_ChanServ, u, CHAN_HELP_CMD_OP);
+ notice_lang(s_ChanServ, u, CHAN_HELP_CMD_DEOP);
+ if (ircd->halfop) {
+ notice_lang(s_ChanServ, u, CHAN_HELP_CMD_HALFOP);
+ notice_lang(s_ChanServ, u, CHAN_HELP_CMD_DEHALFOP);
+ }
+ notice_lang(s_ChanServ, u, CHAN_HELP_CMD_VOICE);
+ notice_lang(s_ChanServ, u, CHAN_HELP_CMD_DEVOICE);
+}
+
+/**
+ * The /cs op/deop/voice/devoice etc.. commands.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+
+int do_op(User * u)
+{
+ return do_util(u, &csmodeutils[MUT_OP]);
+}
+
+/*************************************************************************/
+
+int do_deop(User * u)
+{
+ return do_util(u, &csmodeutils[MUT_DEOP]);
+}
+
+/*************************************************************************/
+
+int do_voice(User * u)
+{
+ return do_util(u, &csmodeutils[MUT_VOICE]);
+}
+
+/*************************************************************************/
+
+int do_devoice(User * u)
+{
+ return do_util(u, &csmodeutils[MUT_DEVOICE]);
+}
+
+/*************************************************************************/
+
+int do_halfop(User * u)
+{
+ if (ircd->halfop) {
+ return do_util(u, &csmodeutils[MUT_HALFOP]);
+ } else {
+ return MOD_CONT;
+ }
+}
+
+/*************************************************************************/
+
+int do_dehalfop(User * u)
+{
+ if (ircd->halfop) {
+ return do_util(u, &csmodeutils[MUT_DEHALFOP]);
+ } else {
+ return MOD_CONT;
+ }
+}
+
+/*************************************************************************/
+
+int do_protect(User * u)
+{
+ if (ircd->protect || ircd->admin) {
+ return do_util(u, &csmodeutils[MUT_PROTECT]);
+ } else {
+ return MOD_CONT;
+ }
+}
+
+/*************************************************************************/
+
+int do_deprotect(User * u)
+{
+ if (ircd->protect || ircd->admin) {
+ return do_util(u, &csmodeutils[MUT_DEPROTECT]);
+ } else {
+ return MOD_CONT;
+ }
+}
+
+/*************************************************************************/
+
+int do_owner(User * u)
+{
+ char *av[2];
+ char *chan = strtok(NULL, " ");
+
+ Channel *c;
+ ChannelInfo *ci;
+ struct u_chanlist *uc;
+
+ if (!ircd->owner) {
+ return MOD_CONT;
+ }
+
+ if (!chan) {
+ av[0] = sstrdup(ircd->ownerset);
+ 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)) {
+ anope_cmd_mode(whosends(ci), uc->chan->name, "%s %s",
+ 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 {
+ anope_cmd_mode(whosends(ci), c->name, "%s %s", ircd->ownerset,
+ u->nick);
+
+ av[0] = sstrdup(ircd->ownerset);
+ av[1] = u->nick;
+ chan_set_modes(s_ChanServ, c, 2, av, 1);
+ free(av[0]);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+int do_deowner(User * u)
+{
+ char *av[2];
+ char *chan = strtok(NULL, " ");
+
+ Channel *c;
+ ChannelInfo *ci;
+ struct u_chanlist *uc;
+
+ if (!ircd->owner) {
+ return MOD_CONT;
+ }
+
+ if (!chan) {
+ av[0] = sstrdup(ircd->ownerunset);
+ 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)) {
+ anope_cmd_mode(whosends(ci), uc->chan->name, "%s %s",
+ 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 {
+ anope_cmd_mode(whosends(ci), c->name, "%s %s", ircd->ownerunset,
+ u->nick);
+
+ av[0] = sstrdup(ircd->ownerunset);
+ av[1] = u->nick;
+ chan_set_modes(s_ChanServ, c, 2, av, 1);
+ free(av[0]);
+ }
+ return MOD_CONT;
+}
+
+/* do_util: not a command, but does the job of other */
+
+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)) {
+ anope_cmd_mode(whosends(ci), uc->chan->name, "%s %s",
+ util->mode, u->nick);
+ chan_set_modes(s_ChanServ, uc->chan, 2, av, 2);
+
+ if (util->notice && ci->flags & util->notice)
+ notice(whosends(ci), uc->chan->name,
+ "%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);
+ } else if (*util->mode == '-' && is_protected(u2) && !is_same) {
+ notice_lang(s_ChanServ, u, PERMISSION_DENIED);
+ } else {
+ anope_cmd_mode(whosends(ci), c->name, "%s %s", util->mode,
+ u2->nick);
+
+ av[0] = util->mode;
+ av[1] = u2->nick;
+ chan_set_modes(s_ChanServ, c, 2, av, 2);
+
+ 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;
+}
diff --git a/src/core/cs_register.c b/src/core/cs_register.c
new file mode 100644
index 000000000..d8cf4e817
--- /dev/null
+++ b/src/core/cs_register.c
@@ -0,0 +1,192 @@
+/* ChanServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_register(User * u);
+void myChanServHelp(User * u);
+
+/**
+ * Create the off command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("REGISTER", do_register, NULL, CHAN_HELP_REGISTER,
+ -1, -1, -1, -1);
+ c->help_param1 = s_NickServ;
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+
+ moduleSetChanHelp(myChanServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to anopes /cs help output.
+ * @param u The user who is requesting help
+ **/
+void myChanServHelp(User * u)
+{
+ notice_lang(s_ChanServ, u, CHAN_HELP_CMD_REGISTER);
+}
+
+/**
+ * The /cs register command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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);
+ char founderpass[PASSMAX];
+ char tmp_pass[PASSMAX];
+
+ 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 (*chan != '#') {
+ notice_lang(s_ChanServ, u, CHAN_SYMBOL_REQUIRED);
+ } else if (!anope_valid_chan(chan)) {
+ notice_lang(s_ChanServ, u, CHAN_X_INVALID, chan);
+ } 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 (!(c = findchan(chan))) {
+ notice_lang(s_ChanServ, u, CHAN_REGISTER_NONE_CHANNEL, chan);
+ } 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, u->host);
+ 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 (!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 (stricmp(u->nick, pass) == 0
+ || (StrictPasswords && strlen(pass) < 5)) {
+ notice_lang(s_ChanServ, u, MORE_OBSCURE_PASSWORD);
+ } else if(enc_encrypt_check_len(strlen(pass), PASSMAX - 1)) {
+ notice_lang(s_ChanServ, u, PASSWORD_TOO_LONG);
+ } else if (!(ci = makechan(chan))) {
+ alog("%s: makechan() failed for REGISTER %s", s_ChanServ, chan);
+ notice_lang(s_ChanServ, u, CHAN_REGISTRATION_FAILED);
+
+ } else if (strscpy(founderpass, pass, PASSMAX),
+ enc_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);
+ } else {
+ c->ci = ci;
+ ci->c = c;
+ ci->bantype = CSDefBantype;
+ ci->flags = CSDefFlags;
+ ci->mlock_on = ircd->defmlock;
+ ci->memos.memomax = MSMaxMemos;
+ ci->last_used = ci->time_registered;
+ ci->founder = nc;
+
+ memset(pass, 0, strlen(pass));
+ memcpy(ci->founderpass, founderpass, PASSMAX);
+ 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;
+ } else {
+ /* Set this to something, otherwise it will maliform the topic */
+ strscpy(ci->last_topic_setter, s_ChanServ, NICKMAX);
+ }
+ 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, u->host);
+ notice_lang(s_ChanServ, u, CHAN_REGISTERED, chan, u->nick);
+
+ if(enc_decrypt(ci->founderpass,tmp_pass,PASSMAX - 1) == 1) {
+ notice_lang(s_ChanServ, u, CHAN_PASSWORD_IS, tmp_pass);
+ }
+
+ 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);
+ /* On most ircds you do not receive the admin/owner mode till its registered */
+ if (ircd->admin) {
+ anope_cmd_mode(s_ChanServ, chan, "%s %s", ircd->adminset,
+ u->nick);
+ }
+ if (ircd->owner && ircd->ownerset) {
+ anope_cmd_mode(s_ChanServ, chan, "%s %s", ircd->ownerset,
+ u->nick);
+ }
+ send_event(EVENT_CHAN_REGISTERED, 1, chan);
+ }
+ return MOD_CONT;
+}
diff --git a/src/core/cs_sendpass.c b/src/core/cs_sendpass.c
new file mode 100644
index 000000000..ff3bb1cff
--- /dev/null
+++ b/src/core/cs_sendpass.c
@@ -0,0 +1,125 @@
+/* ChanServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_sendpass(User * u);
+void myChanServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("SENDPASS", do_sendpass, NULL, CHAN_HELP_SENDPASS,
+ -1, -1, -1, -1);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+
+ moduleSetChanHelp(myChanServHelp);
+
+ if (UseMail) {
+ return MOD_CONT;
+ } else {
+ return MOD_STOP;
+ }
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to anopes /cs help output.
+ * @param u The user who is requesting help
+ **/
+void myChanServHelp(User * u)
+{
+ notice_lang(s_ChanServ, u, CHAN_HELP_CMD_SENDPASS);
+}
+
+/**
+ * The /cs sendpass command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+int do_sendpass(User * u)
+{
+
+ char *chan = strtok(NULL, " ");
+ ChannelInfo *ci;
+ NickCore *founder;
+
+ if (!chan) {
+ syntax_error(s_ChanServ, u, "SENDPASS", CHAN_SENDPASS_SYNTAX);
+ } else if (RestrictMail && !is_services_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];
+ char tmp_pass[PASSMAX];
+ if(enc_decrypt(ci->founderpass,tmp_pass,PASSMAX - 1)==1) {
+ 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),
+ tmp_pass);
+ 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, u->host, chan);
+ notice_lang(s_ChanServ, u, CHAN_SENDPASS_OK, chan);
+ } else {
+ notice_lang(s_ChanServ, u, CHAN_SENDPASS_UNAVAILABLE);
+ }
+ }
+ return MOD_CONT;
+}
diff --git a/src/core/cs_set.c b/src/core/cs_set.c
new file mode 100644
index 000000000..ccdf1e9bb
--- /dev/null
+++ b/src/core/cs_set.c
@@ -0,0 +1,837 @@
+/* ChanServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+#include "encrypt.h"
+
+int do_set(User * u);
+int do_set_founder(User * u, ChannelInfo * ci, char *param);
+int do_set_successor(User * u, ChannelInfo * ci, char *param);
+int do_set_password(User * u, ChannelInfo * ci, char *param);
+int do_set_desc(User * u, ChannelInfo * ci, char *param);
+int do_set_url(User * u, ChannelInfo * ci, char *param);
+int do_set_email(User * u, ChannelInfo * ci, char *param);
+int do_set_entrymsg(User * u, ChannelInfo * ci, char *param);
+int do_set_bantype(User * u, ChannelInfo * ci, char *param);
+int do_set_mlock(User * u, ChannelInfo * ci, char *param);
+int do_set_keeptopic(User * u, ChannelInfo * ci, char *param);
+int do_set_topiclock(User * u, ChannelInfo * ci, char *param);
+int do_set_private(User * u, ChannelInfo * ci, char *param);
+int do_set_secureops(User * u, ChannelInfo * ci, char *param);
+int do_set_securefounder(User * u, ChannelInfo * ci, char *param);
+int do_set_restricted(User * u, ChannelInfo * ci, char *param);
+int do_set_secure(User * u, ChannelInfo * ci, char *param);
+int do_set_signkick(User * u, ChannelInfo * ci, char *param);
+int do_set_opnotice(User * u, ChannelInfo * ci, char *param);
+int do_set_xop(User * u, ChannelInfo * ci, char *param);
+int do_set_peace(User * u, ChannelInfo * ci, char *param);
+int do_set_noexpire(User * u, ChannelInfo * ci, char *param);
+void myChanServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("SET", do_set, NULL, CHAN_HELP_SET, -1, -1,
+ CHAN_SERVADMIN_HELP_SET, CHAN_SERVADMIN_HELP_SET);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+ c = createCommand("SET FOUNDER", NULL, NULL, CHAN_HELP_SET_FOUNDER, -1,
+ -1, -1, -1);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+ c = createCommand("SET SUCCESSOR", NULL, NULL, CHAN_HELP_SET_SUCCESSOR,
+ -1, -1, -1, -1);
+ c->help_param1 = (char *) (long) CSMaxReg;
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+ c = createCommand("SET PASSWORD", NULL, NULL, CHAN_HELP_SET_PASSWORD,
+ -1, -1, -1, -1);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+ c = createCommand("SET DESC", NULL, NULL, CHAN_HELP_SET_DESC, -1, -1,
+ -1, -1);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+ c = createCommand("SET URL", NULL, NULL, CHAN_HELP_SET_URL, -1, -1, -1,
+ -1);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+ c = createCommand("SET EMAIL", NULL, NULL, CHAN_HELP_SET_EMAIL, -1, -1,
+ -1, -1);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+ c = createCommand("SET ENTRYMSG", NULL, NULL, CHAN_HELP_SET_ENTRYMSG,
+ -1, -1, -1, -1);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+ c = createCommand("SET BANTYPE", NULL, NULL, CHAN_HELP_SET_BANTYPE, -1,
+ -1, -1, -1);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+ c = createCommand("SET PRIVATE", NULL, NULL, CHAN_HELP_SET_PRIVATE, -1,
+ -1, -1, -1);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+ c = createCommand("SET KEEPTOPIC", NULL, NULL, CHAN_HELP_SET_KEEPTOPIC,
+ -1, -1, -1, -1);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+ c = createCommand("SET TOPICLOCK", NULL, NULL, CHAN_HELP_SET_TOPICLOCK,
+ -1, -1, -1, -1);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+ c = createCommand("SET MLOCK", NULL, NULL, CHAN_HELP_SET_MLOCK, -1, -1,
+ -1, -1);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+ c = createCommand("SET RESTRICTED", NULL, NULL,
+ CHAN_HELP_SET_RESTRICTED, -1, -1, -1, -1);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+ c = createCommand("SET SECURE", NULL, NULL, CHAN_HELP_SET_SECURE, -1,
+ -1, -1, -1);
+ c->help_param1 = s_NickServ;
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+ c = createCommand("SET SECUREOPS", NULL, NULL, CHAN_HELP_SET_SECUREOPS,
+ -1, -1, -1, -1);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+ c = createCommand("SET SECUREFOUNDER", NULL, NULL,
+ CHAN_HELP_SET_SECUREFOUNDER, -1, -1, -1, -1);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+ c = createCommand("SET SIGNKICK", NULL, NULL, CHAN_HELP_SET_SIGNKICK,
+ -1, -1, -1, -1);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+ c = createCommand("SET OPNOTICE", NULL, NULL, CHAN_HELP_SET_OPNOTICE,
+ -1, -1, -1, -1);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+ c = createCommand("SET XOP", NULL, NULL, CHAN_HELP_SET_XOP, -1, -1, -1,
+ -1);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+ c = createCommand("SET PEACE", NULL, NULL, CHAN_HELP_SET_PEACE, -1, -1,
+ -1, -1);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+ c = createCommand("SET NOEXPIRE", NULL, NULL, -1, -1, -1,
+ CHAN_SERVADMIN_HELP_SET_NOEXPIRE,
+ CHAN_SERVADMIN_HELP_SET_NOEXPIRE);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+
+ moduleSetChanHelp(myChanServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+/**
+ * Add the help response to anopes /cs help output.
+ * @param u The user who is requesting help
+ **/
+void myChanServHelp(User * u)
+{
+ notice_lang(s_ChanServ, u, CHAN_HELP_CMD_SET);
+}
+
+/**
+ * The /cs set command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+
+/* 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).
+ */
+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) {
+ if (!(findModule("cs_xop"))) {
+ notice_lang(s_ChanServ, u, CHAN_XOP_NOT_AVAILABLE, cmd);
+ } else {
+ 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;
+}
+
+/*************************************************************************/
+
+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, u->host);
+
+ /* 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;
+}
+
+/*************************************************************************/
+
+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, u->host);
+
+ 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;
+}
+
+/*************************************************************************/
+
+int do_set_password(User * u, ChannelInfo * ci, char *param)
+{
+ int len = strlen(param);
+
+ if (stricmp(u->nick, param) == 0 || (StrictPasswords && len < 5)) {
+ notice_lang(s_ChanServ, u, MORE_OBSCURE_PASSWORD);
+ return MOD_CONT;
+ }
+
+ if (enc_encrypt_check_len(len ,PASSMAX - 1)) {
+ notice_lang(s_ChanServ, u, PASSWORD_TOO_LONG);
+ return MOD_CONT;
+ }
+
+ if (enc_encrypt(param, len, ci->founderpass, PASSMAX -1) < 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);
+
+ 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, u->host, ci->name);
+ if (WallSetpass)
+ anope_cmd_global(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, u->host,
+ ci->name, ci->founder->display);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+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;
+}
+
+/*************************************************************************/
+
+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;
+}
+
+/*************************************************************************/
+
+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;
+}
+
+/*************************************************************************/
+
+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;
+}
+
+/*************************************************************************/
+
+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 */
+ if (ircd->chanreg) {
+ ci->mlock_on = ircd->regmode;
+ } else {
+ ci->mlock_on = 0;
+ }
+ ci->mlock_off = ci->mlock_limit = 0;
+ ci->mlock_key = NULL;
+ if (ircd->fmode) {
+ ci->mlock_flood = NULL;
+ }
+ if (ircd->Lmode) {
+ ci->mlock_redirect = NULL;
+ }
+
+ 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) */
+
+ if (ircd->Lmode) {
+ /* We can't mlock +L if +l is not mlocked as well. */
+ if ((ci->mlock_on & ircd->chan_lmode)
+ && !(ci->mlock_on & anope_get_limit_mode())) {
+ ci->mlock_on &= ~ircd->chan_lmode;
+ free(ci->mlock_redirect);
+ notice_lang(s_ChanServ, u, CHAN_SET_MLOCK_L_REQUIRED);
+ }
+ }
+
+ /* Some ircd we can't set NOKNOCK without INVITE */
+ /* So check if we need there is a NOKNOCK MODE and that we need INVITEONLY */
+ if (ircd->noknock && ircd->knock_needs_i) {
+ if ((ci->mlock_on & ircd->noknock)
+ && !(ci->mlock_on & anope_get_invite_mode())) {
+ ci->mlock_on &= ~ircd->noknock;
+ notice_lang(s_ChanServ, u, CHAN_SET_MLOCK_K_REQUIRED);
+ }
+ }
+
+ /* Since we always enforce mode r there is no way to have no
+ * mode lock at all.
+ */
+ if (get_mlock_modes(ci, 0)) {
+ 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;
+}
+
+/*************************************************************************/
+
+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;
+}
+
+/*************************************************************************/
+
+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, ci->name);
+ } else if (stricmp(param, "OFF") == 0) {
+ ci->flags &= ~CI_KEEPTOPIC;
+ notice_lang(s_ChanServ, u, CHAN_SET_KEEPTOPIC_OFF, ci->name);
+ } else {
+ syntax_error(s_ChanServ, u, "SET KEEPTOPIC",
+ CHAN_SET_KEEPTOPIC_SYNTAX);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+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, ci->name);
+ } else if (stricmp(param, "OFF") == 0) {
+ ci->flags &= ~CI_TOPICLOCK;
+ notice_lang(s_ChanServ, u, CHAN_SET_TOPICLOCK_OFF, ci->name);
+ } else {
+ syntax_error(s_ChanServ, u, "SET TOPICLOCK",
+ CHAN_SET_TOPICLOCK_SYNTAX);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+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, ci->name);
+ } else if (stricmp(param, "OFF") == 0) {
+ ci->flags &= ~CI_PRIVATE;
+ notice_lang(s_ChanServ, u, CHAN_SET_PRIVATE_OFF, ci->name);
+ } else {
+ syntax_error(s_ChanServ, u, "SET PRIVATE",
+ CHAN_SET_PRIVATE_SYNTAX);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+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, ci->name);
+ } else if (stricmp(param, "OFF") == 0) {
+ ci->flags &= ~CI_SECUREOPS;
+ notice_lang(s_ChanServ, u, CHAN_SET_SECUREOPS_OFF, ci->name);
+ } else {
+ syntax_error(s_ChanServ, u, "SET SECUREOPS",
+ CHAN_SET_SECUREOPS_SYNTAX);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+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, ci->name);
+ } else if (stricmp(param, "OFF") == 0) {
+ ci->flags &= ~CI_SECUREFOUNDER;
+ notice_lang(s_ChanServ, u, CHAN_SET_SECUREFOUNDER_OFF, ci->name);
+ } else {
+ syntax_error(s_ChanServ, u, "SET SECUREFOUNDER",
+ CHAN_SET_SECUREFOUNDER_SYNTAX);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+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, ci->name);
+ } 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, ci->name);
+ } else {
+ syntax_error(s_ChanServ, u, "SET RESTRICTED",
+ CHAN_SET_RESTRICTED_SYNTAX);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+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, ci->name);
+ } else if (stricmp(param, "OFF") == 0) {
+ ci->flags &= ~CI_SECURE;
+ notice_lang(s_ChanServ, u, CHAN_SET_SECURE_OFF, ci->name);
+ } else {
+ syntax_error(s_ChanServ, u, "SET SECURE", CHAN_SET_SECURE_SYNTAX);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+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, ci->name);
+ } else if (stricmp(param, "LEVEL") == 0) {
+ ci->flags |= CI_SIGNKICK_LEVEL;
+ ci->flags &= ~CI_SIGNKICK;
+ notice_lang(s_ChanServ, u, CHAN_SET_SIGNKICK_LEVEL, ci->name);
+ } else if (stricmp(param, "OFF") == 0) {
+ ci->flags &= ~(CI_SIGNKICK | CI_SIGNKICK_LEVEL);
+ notice_lang(s_ChanServ, u, CHAN_SET_SIGNKICK_OFF, ci->name);
+ } else {
+ syntax_error(s_ChanServ, u, "SET SIGNKICK",
+ CHAN_SET_SIGNKICK_SYNTAX);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+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, ci->name);
+ } else if (stricmp(param, "OFF") == 0) {
+ ci->flags &= ~CI_OPNOTICE;
+ notice_lang(s_ChanServ, u, CHAN_SET_OPNOTICE_OFF, ci->name);
+ } 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)]))
+
+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;
+ } else if (ircd->halfop) {
+ if (CHECKLEV(CA_AUTOHALFOP) || CHECKLEV(CA_HALFOP)
+ || CHECKLEV(CA_HALFOPME)) {
+ access->level = ACCESS_HOP;
+ }
+ } 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, u->host, ci->name);
+ notice_lang(s_ChanServ, u, CHAN_SET_XOP_ON, ci->name);
+ } 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, u->host, ci->name);
+ notice_lang(s_ChanServ, u, CHAN_SET_XOP_OFF, ci->name);
+ } else {
+ syntax_error(s_ChanServ, u, "SET XOP", CHAN_SET_XOP_SYNTAX);
+ }
+ return MOD_CONT;
+}
+
+#undef CHECKLEV
+
+/*************************************************************************/
+
+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, ci->name);
+ } else if (stricmp(param, "OFF") == 0) {
+ ci->flags &= ~CI_PEACE;
+ notice_lang(s_ChanServ, u, CHAN_SET_PEACE_OFF, ci->name);
+ } else {
+ syntax_error(s_ChanServ, u, "SET PEACE", CHAN_SET_PEACE_SYNTAX);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+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;
+}
diff --git a/src/core/cs_status.c b/src/core/cs_status.c
new file mode 100644
index 000000000..b52efbcdb
--- /dev/null
+++ b/src/core/cs_status.c
@@ -0,0 +1,102 @@
+/* ChanServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_status(User * u);
+void myChanServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("STATUS", do_status, is_services_admin, -1, -1, -1,
+ CHAN_SERVADMIN_HELP_STATUS,
+ CHAN_SERVADMIN_HELP_STATUS);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+
+ moduleSetChanHelp(myChanServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to anopes /cs help output.
+ * @param u The user who is requesting help
+ **/
+void myChanServHelp(User * u)
+{
+ if (is_services_admin(u)) {
+ notice_lang(s_ChanServ, u, CHAN_HELP_CMD_STATUS);
+ }
+}
+
+/**
+ * The /cs status command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+int do_status(User * u)
+{
+ ChannelInfo *ci;
+ User *u2;
+ char *nick, *chan;
+ char *temp = NULL;
+
+ chan = strtok(NULL, " ");
+ nick = strtok(NULL, " ");
+ if (!nick || strtok(NULL, " ")) {
+ notice_lang(s_ChanServ, u, CHAN_STATUS_SYNTAX);
+ return MOD_CONT;
+ }
+ if (!(ci = cs_findchan(chan))) {
+ temp = chan;
+ chan = nick;
+ nick = temp;
+ ci = cs_findchan(chan);
+ }
+ if (!ci) {
+ notice_lang(s_ChanServ, u, CHAN_STATUS_NOT_REGGED, temp);
+ } else if (ci->flags & CI_VERBOTEN) {
+ notice_lang(s_ChanServ, u, CHAN_STATUS_FORBIDDEN, chan);
+ return MOD_CONT;
+ } else if ((u2 = finduser(nick)) != NULL) {
+ notice_lang(s_ChanServ, u, CHAN_STATUS_INFO, chan, nick,
+ get_access(u2, ci));
+ } else { /* !u2 */
+ notice_lang(s_ChanServ, u, CHAN_STATUS_NOTONLINE, nick);
+ }
+ return MOD_CONT;
+}
diff --git a/src/core/cs_suspend.c b/src/core/cs_suspend.c
new file mode 100644
index 000000000..674861578
--- /dev/null
+++ b/src/core/cs_suspend.c
@@ -0,0 +1,211 @@
+/* ChanServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_suspend(User * u);
+int do_unsuspend(User * u);
+void myChanServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("SUSPEND", do_suspend, is_services_oper, -1, -1, -1,
+ CHAN_SERVADMIN_HELP_SUSPEND,
+ CHAN_SERVADMIN_HELP_SUSPEND);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+ c = createCommand("UNSUSPEND", do_unsuspend, is_services_oper, -1, -1,
+ -1, CHAN_SERVADMIN_HELP_UNSUSPEND,
+ CHAN_SERVADMIN_HELP_UNSUSPEND);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+
+ moduleSetChanHelp(myChanServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+/**
+ * Add the help response to anopes /cs help output.
+ * @param u The user who is requesting help
+ **/
+void myChanServHelp(User * u)
+{
+ if (is_services_oper(u)) {
+ notice_lang(s_ChanServ, u, CHAN_HELP_CMD_SUSPEND);
+ notice_lang(s_ChanServ, u, CHAN_HELP_CMD_UNSUSPEND);
+ }
+}
+
+/**
+ * The /cs (un)suspend command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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 (chan[0] != '#') {
+ notice_lang(s_ChanServ, u, CHAN_UNSUSPEND_ERROR);
+ return MOD_CONT;
+ }
+
+ /* Only SUSPEND existing channels, otherwise use FORBID (bug #54) */
+ if ((ci = cs_findchan(chan)) == NULL) {
+ notice_lang(s_ChanServ, u, CHAN_X_NOT_REGISTERED, chan);
+ return MOD_CONT;
+ }
+
+ /* You should not SUSPEND a FORBIDEN channel */
+ if (ci->flags & CI_VERBOTEN) {
+ notice_lang(s_ChanServ, u, CHAN_MAY_NOT_BE_REGISTERED, chan);
+ return MOD_CONT;
+ }
+
+ if (readonly)
+ notice_lang(s_ChanServ, u, READ_ONLY_MODE);
+
+ 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";
+ anope_cmd_kick(s_ChanServ, av[0], av[1], av[2]);
+ do_kick(s_ChanServ, 3, av);
+ }
+ }
+
+ if (WallForbid)
+ anope_cmd_global(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);
+ send_event(EVENT_CHAN_SUSPENDED, 1, 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;
+}
+
+/*************************************************************************/
+
+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);
+
+ /* Only UNSUSPEND already suspended channels */
+ if ((ci = cs_findchan(chan)) == NULL) {
+ notice_lang(s_ChanServ, u, CHAN_X_NOT_REGISTERED, chan);
+ return MOD_CONT;
+ }
+
+ if (!(ci->flags & CI_SUSPENDED))
+ {
+ notice_lang(s_ChanServ, u, CHAN_UNSUSPEND_FAILED, chan);
+ return MOD_CONT;
+ }
+
+ if (ci) {
+ ci->flags &= ~CI_SUSPENDED;
+ if (ci->forbidreason)
+ {
+ free(ci->forbidreason);
+ ci->forbidreason = NULL;
+ }
+ if (ci->forbidby)
+ {
+ free(ci->forbidby);
+ ci->forbidby = NULL;
+ }
+
+ if (WallForbid)
+ anope_cmd_global(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);
+ send_event(EVENT_CHAN_UNSUSPEND, 1, 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;
+}
diff --git a/src/core/cs_topic.c b/src/core/cs_topic.c
new file mode 100644
index 000000000..dd5a15cb8
--- /dev/null
+++ b/src/core/cs_topic.c
@@ -0,0 +1,119 @@
+/* ChanServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_cs_topic(User * u);
+void myChanServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("TOPIC", do_cs_topic, NULL, CHAN_HELP_TOPIC, -1, -1,
+ -1, -1);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+
+ moduleSetChanHelp(myChanServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+/**
+ * Add the help response to anopes /cs help output.
+ * @param u The user who is requesting help
+ **/
+void myChanServHelp(User * u)
+{
+ notice_lang(s_ChanServ, u, CHAN_HELP_CMD_TOPIC);
+}
+
+/**
+ * The /cs topic command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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 (ircd->topictsbackward) {
+ c->topic_time = c->topic_time - 1;
+ } else {
+ c->topic_time = ci->last_topic_time;
+ }
+
+ if (is_services_admin(u) && !check_access(u, ci, CA_TOPIC))
+ alog("%s: %s!%s@%s changed topic of %s as services admin.",
+ s_ChanServ, u->nick, u->username, u->host, c->name);
+ if (ircd->join2set) {
+ if (whosends(ci) == s_ChanServ) {
+ anope_cmd_join(s_ChanServ, c->name, c->creation_time);
+ anope_cmd_mode(NULL, c->name, "+o %s", s_ChanServ);
+ }
+ }
+ anope_cmd_topic(whosends(ci), c->name, u->nick, topic ? topic : "",
+ c->topic_time);
+ if (ircd->join2set) {
+ if (whosends(ci) == s_ChanServ) {
+ anope_cmd_part(s_ChanServ, c->name, NULL);
+ }
+ }
+ }
+ return MOD_CONT;
+}
diff --git a/src/core/cs_xop.c b/src/core/cs_xop.c
new file mode 100644
index 000000000..37d3711fd
--- /dev/null
+++ b/src/core/cs_xop.c
@@ -0,0 +1,509 @@
+/* ChanServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_xop(User * u, char *xname, int xlev, int *xmsgs);
+int do_aop(User * u);
+int do_hop(User * u);
+int do_sop(User * u);
+int do_vop(User * u);
+
+void myChanServHelp(User * u);
+
+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}
+};
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("AOP", do_aop, NULL, CHAN_HELP_AOP, -1, -1, -1, -1);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+ if (ircd->halfop) {
+ c = createCommand("HOP", do_hop, NULL, CHAN_HELP_HOP, -1, -1, -1,
+ -1);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+ }
+ c = createCommand("SOP", do_sop, NULL, CHAN_HELP_SOP, -1, -1, -1, -1);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+ c = createCommand("VOP", do_vop, NULL, CHAN_HELP_VOP, -1, -1, -1, -1);
+ moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
+
+ moduleSetChanHelp(myChanServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to anopes /cs help output.
+ * @param u The user who is requesting help
+ **/
+void myChanServHelp(User * u)
+{
+ notice_lang(s_ChanServ, u, CHAN_HELP_CMD_SOP);
+ notice_lang(s_ChanServ, u, CHAN_HELP_CMD_AOP);
+ if (ircd->halfop) {
+ notice_lang(s_ChanServ, u, CHAN_HELP_CMD_HOP);
+ }
+ notice_lang(s_ChanServ, u, CHAN_HELP_CMD_VOP);
+}
+
+/**
+ * The /cs xop command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+int do_aop(User * u)
+{
+ return do_xop(u, "AOP", ACCESS_AOP, xop_msgs[0]);
+}
+
+/*************************************************************************/
+
+int do_hop(User * u)
+{
+ return do_xop(u, "HOP", ACCESS_HOP, xop_msgs[3]);
+}
+
+/*************************************************************************/
+
+int do_sop(User * u)
+{
+ return do_xop(u, "SOP", ACCESS_SOP, xop_msgs[1]);
+}
+
+/*************************************************************************/
+
+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
+ */
+
+int xop_del(User * u, ChannelInfo * ci, ChanAccess * access, int *perm, int uacc, int xlev)
+{
+ char *nick = access->nc->display;
+ 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;
+ send_event(EVENT_ACCESS_DEL, 3, ci->name, u->nick, nick);
+ return 1;
+}
+
+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, &ci->access[num - 1], perm, uacc, xlev);
+}
+
+
+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;
+}
+
+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);
+}
+
+
+int do_xop(User * u, char *xname, int xlev, int *xmsgs)
+{
+ char *chan = strtok(NULL, " ");
+ char *cmd = strtok(NULL, " ");
+ char *nick = strtok(NULL, " ");
+ char event_access[BUFSIZE];
+
+ 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 ((xlev >= ulev || ulev < ACCESS_AOP) && !is_servadmin) {
+ 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) && (!is_servadmin)) {
+ notice_lang(s_ChanServ, u, PERMISSION_DENIED);
+ return MOD_CONT;
+ }
+ change++;
+ break;
+ }
+ }
+
+ if (!change) {
+ /* All entries should be in use so we no longer need
+ * to go over the entire list..
+ for (i = 0; i < ci->accesscount; i++)
+ if (!ci->access[i].in_use)
+ break;
+ */
+
+ 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, u->host, ulev, change ? "changed" : "set", access->level, na->nick, nc->display, ci->name);
+
+ snprintf(event_access, BUFSIZE, "%d", access->level);
+
+ if (!change) {
+ send_event(EVENT_ACCESS_ADD, 4, ci->name, u->nick, na->nick,
+ event_access);
+ notice_lang(s_ChanServ, u, xmsgs[3], access->nc->display,
+ ci->name);
+ } else {
+ send_event(EVENT_ACCESS_CHANGE, 4, ci->name, u->nick, na->nick,
+ event_access);
+ notice_lang(s_ChanServ, u, xmsgs[4], access->nc->display,
+ ci->name);
+ }
+
+ } else if (stricmp(cmd, "DEL") == 0) {
+ int deleted, a, b;
+ 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);
+
+ if ((xlev >= ulev || ulev < ACCESS_AOP) && !is_servadmin) {
+ notice_lang(s_ChanServ, u, PERMISSION_DENIED);
+ 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, 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) {
+ deleted = 0;
+ 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;
+ send_event(EVENT_ACCESS_DEL, 3, ci->name, u->nick,
+ na->nick);
+ deleted = 1;
+ }
+ }
+ if (deleted) {
+ /* Reordering - DrStein */
+ for (b = 0; b < ci->accesscount; b++) {
+ if (ci->access[b].in_use) {
+ for (a = 0; a < ci->accesscount; a++) {
+ if (a > b)
+ break;
+ if (!ci->access[a].in_use) {
+ ci->access[a].in_use = 1;
+ ci->access[a].level = ci->access[b].level;
+ ci->access[a].nc = ci->access[b].nc;
+ ci->access[a].last_seen =
+ ci->access[b].last_seen;
+ ci->access[b].nc = NULL;
+ ci->access[b].in_use = 0;
+ break;
+ }
+ }
+ }
+ }
+
+ /* If the patch provided in bug #706 is applied, this should be placed
+ * before sending the events! */
+ /* After reordering only the entries at the end could still be empty.
+ * We ll free the places no longer in use... */
+ for (i = ci->accesscount - 1; i >= 0; i--) {
+ if (ci->access[i].in_use == 1)
+ break;
+
+ ci->accesscount--;
+ }
+ ci->access =
+ srealloc(ci->access,sizeof(ChanAccess) * ci->accesscount);
+ }
+ } 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;
+ }
+ }
+
+ send_event(EVENT_ACCESS_CLEAR, 2, ci->name, u->nick);
+
+ notice_lang(s_ChanServ, u, xmsgs[13], ci->name);
+ } else {
+ syntax_error(s_ChanServ, u, xname, xmsgs[0]);
+ }
+ return MOD_CONT;
+}
diff --git a/src/core/dummy/Makefile b/src/core/dummy/Makefile
new file mode 100644
index 000000000..ec93af36d
--- /dev/null
+++ b/src/core/dummy/Makefile
@@ -0,0 +1,6 @@
+all: DUMMY
+
+DUMMY:
+clean:
+distclean:
+install:
diff --git a/src/core/enc_md5.c b/src/core/enc_md5.c
new file mode 100644
index 000000000..69344d7e6
--- /dev/null
+++ b/src/core/enc_md5.c
@@ -0,0 +1,427 @@
+/* Module for encryption using MD5.
+ *
+ * Modified for Anope.
+ * (C) 2003-2008 Anope Team
+ * Contact us at dev@anope.org
+ *
+ * Taken from IRC Services and is copyright (c) 1996-2002 Andrew Church.
+ * E-mail: <achurch@achurch.org>
+ * Parts written by Andrew Kempe and others.
+ * This program is free but copyrighted software; see the file COPYING for
+ * details.
+ */
+
+#include "module.h"
+
+
+/*************************************************************************/
+
+/* 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
+
+void MD5Transform (UINT4 [4], unsigned char [64]);
+void Encode (unsigned char *, UINT4 *, unsigned int);
+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.
+ */
+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.
+ */
+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.
+ */
+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.
+ */
+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.
+ */
+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.
+ */
+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);
+}
+
+/*************************************************************************/
+
+/* Our own high-level routines. See encrypt.h for documentation. */
+
+#define XTOI(c) ((c)>9 ? (c)-'A'+10 : (c)-'0')
+
+int md5_encrypt(const char *src, int len, char *dest, int size)
+{
+ MD5_CTX context;
+ char tmp[33];
+
+ if (size < 16)
+ return -1;
+
+ MD5Init(&context);
+ MD5Update(&context, src, len);
+ MD5Final(dest, &context);
+
+ if(debug) {
+ memset(tmp,0,33);
+ binary_to_hex(dest,tmp,16);
+ /* Dont log source if we were encrypting in place :) */
+ if (memcmp(src, dest, 16) != 0) {
+ alog("enc_md5: hashed from [%s] to [%s]",src,tmp);
+ } else {
+ alog("enc_md5: hashed password to [%s]",tmp);
+ }
+ }
+
+ return 0;
+}
+
+
+int md5_encrypt_in_place(char *buf, int size)
+{
+ return md5_encrypt(buf, strlen(buf), buf, size);
+}
+
+
+int md5_encrypt_check_len(int passlen, int bufsize)
+{
+ if (bufsize < 16)
+ fatal("enc_md5: md5_check_len(): buffer too small (%d)", bufsize);
+ return 0;
+}
+
+
+int md5_decrypt(const char *src, char *dest, int size)
+{
+ return 0;
+}
+
+
+int md5_check_password(const char *plaintext, const char *password)
+{
+ char buf[BUFSIZE];
+
+ if (md5_encrypt(plaintext, strlen(plaintext), buf, sizeof(buf)) < 0)
+ return -1;
+ if (memcmp(buf, password, 16) == 0)
+ return 1;
+ return 0;
+}
+
+/*************************************************************************/
+
+/* Module stuff. */
+
+int AnopeInit(int argc, char **argv) {
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(ENCRYPTION);
+
+ encmodule_encrypt(md5_encrypt);
+ encmodule_encrypt_in_place(md5_encrypt_in_place);
+ encmodule_encrypt_check_len(md5_encrypt_check_len);
+ encmodule_decrypt(md5_decrypt);
+ encmodule_check_password(md5_check_password);
+
+ return MOD_CONT;
+}
+
+void AnopeFini(void) {
+ encmodule_encrypt(NULL);
+ encmodule_encrypt_in_place(NULL);
+ encmodule_encrypt_check_len(NULL);
+ encmodule_decrypt(NULL);
+ encmodule_check_password(NULL);
+}
+
+
+
+
+/*************************************************************************/
+
diff --git a/src/core/enc_none.c b/src/core/enc_none.c
new file mode 100644
index 000000000..871a85620
--- /dev/null
+++ b/src/core/enc_none.c
@@ -0,0 +1,78 @@
+/* Module for encryption using MD5.
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at dev@anope.org
+ *
+ * This program is free but copyrighted software; see the file COPYING for
+ * details.
+ */
+
+#include "module.h"
+
+int plain_encrypt(const char *src,int len,char *dest,int size);
+int plain_encrypt_in_place(char *buf, int size);
+int plain_encrypt_check_len(int passlen, int bufsize);
+int plain_decrypt(const char *src, char *dest, int size);
+int plain_check_password(const char *plaintext, const char *password);
+
+
+int AnopeInit(int argc, char **argv) {
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(ENCRYPTION);
+
+ encmodule_encrypt(plain_encrypt);
+ encmodule_encrypt_in_place(plain_encrypt_in_place);
+ encmodule_encrypt_check_len(plain_encrypt_check_len);
+ encmodule_decrypt(plain_decrypt);
+ encmodule_check_password(plain_check_password);
+
+ return MOD_CONT;
+}
+
+void AnopeFini(void) {
+ encmodule_encrypt(NULL);
+ encmodule_encrypt_in_place(NULL);
+ encmodule_encrypt_check_len(NULL);
+ encmodule_decrypt(NULL);
+ encmodule_check_password(NULL);
+}
+
+int plain_encrypt(const char *src,int len,char *dest,int size) {
+ if(size>=len) {
+ memset(dest,0,size);
+ strncpy(dest,src,len);
+ dest[len] = '\0';
+ return 0;
+ }
+ return -1;
+}
+
+int plain_encrypt_in_place(char *buf, int size) {
+ return 0;
+}
+
+int plain_encrypt_check_len(int passlen, int bufsize) {
+ if(bufsize>=passlen) {
+ return 0;
+ }
+ return bufsize;
+}
+
+int plain_decrypt(const char *src, char *dest, int size) {
+ memset(dest,0,size);
+ strncpy(dest,src,size);
+ dest[size] = '\0';
+ return 1;
+}
+
+int plain_check_password(const char *plaintext, const char *password) {
+ if(strcmp(plaintext,password)==0) {
+ return 1;
+ }
+ return 0;
+}
+
+/* EOF */
+
diff --git a/src/core/enc_old.c b/src/core/enc_old.c
new file mode 100644
index 000000000..8c7d88e8e
--- /dev/null
+++ b/src/core/enc_old.c
@@ -0,0 +1,451 @@
+/* Include file for high-level encryption routines.
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+
+#include "module.h"
+
+void binary_to_hex(unsigned char *bin, char *hex, int length)
+{
+ static const char trans[] = "0123456789ABCDEF";
+ int i;
+
+ for(i = 0; i < length; i++)
+ {
+ hex[i << 1] = trans[bin[i] >> 4];
+ hex[(i << 1) + 1] = trans[bin[i] & 0xf];
+ }
+
+ hex[i << 1] = '\0';
+}
+
+
+/*************************************************************************/
+
+/******** Code specific to the type of encryption. ********/
+
+
+/* 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 MD5_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) += MD5_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);
+}
+
+/*************************************************************************/
+
+/******** 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 old_encrypt(const char *src, int len, char *dest, int size)
+{
+
+ MD5_CTX context;
+ char digest[33];
+ char tmp[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]);
+
+ if(debug) {
+ memset(tmp,0,33);
+ binary_to_hex(dest,tmp,16);
+ alog("enc_old: Converted [%s] to [%s]",src,tmp);
+ }
+
+ return 0;
+
+}
+
+
+/* Shortcut for encrypting a null-terminated string in place. */
+int old_encrypt_in_place(char *buf, int size)
+{
+ return old_encrypt(buf, strlen(buf), buf, size);
+}
+
+int old_encrypt_check_len(int passlen, int bufsize)
+{
+ if (bufsize < 16)
+ fatal("enc_old: old_check_len(): buffer too small (%d)", bufsize);
+ return 0;
+}
+
+
+/* Compare a plaintext string against an encrypted password. Return 1 if
+ * they match, 0 if not, and -1 if something went wrong. */
+
+int old_check_password(const char *plaintext, const char *password)
+{
+ char buf[BUFSIZE];
+
+ if (old_encrypt(plaintext, strlen(plaintext), buf, sizeof(buf)) < 0)
+ return -1;
+ if (memcmp(buf, password, 16) == 0)
+ return 1;
+ else
+ return 0;
+}
+
+int old_decrypt(const char *src, char *dest, int size)
+{
+ return 0;
+}
+
+int AnopeInit(int argc, char **argv) {
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(ENCRYPTION);
+
+ encmodule_encrypt(old_encrypt);
+ encmodule_encrypt_in_place(old_encrypt_in_place);
+ encmodule_encrypt_check_len(old_encrypt_check_len);
+ encmodule_decrypt(old_decrypt);
+ encmodule_check_password(old_check_password);
+
+ return MOD_CONT;
+}
+
+void AnopeFini(void) {
+ encmodule_encrypt(NULL);
+ encmodule_encrypt_in_place(NULL);
+ encmodule_encrypt_check_len(NULL);
+ encmodule_decrypt(NULL);
+ encmodule_check_password(NULL);
+}
+
+/*************************************************************************/
+
diff --git a/src/core/enc_sha1.c b/src/core/enc_sha1.c
new file mode 100644
index 000000000..6a2f22860
--- /dev/null
+++ b/src/core/enc_sha1.c
@@ -0,0 +1,275 @@
+/*
+SHA-1 in C
+By Steve Reid <steve@edmweb.com>
+100% Public Domain
+
+Test Vectors (from FIPS PUB 180-1)
+"abc"
+ A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D
+"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
+ 84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1
+A million repetitions of "a"
+ 34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F
+*/
+
+/* #define LITTLE_ENDIAN * This should be #define'd if true. */
+/* #define SHA1HANDSOFF * Copies data before messing with it. */
+
+#include "module.h"
+#include <stdio.h>
+#include <string.h>
+
+typedef struct {
+ uint32 state[5];
+ uint32 count[2];
+ unsigned char buffer[64];
+} SHA1_CTX;
+
+void SHA1Transform(uint32 state[5], unsigned char const buffer[64]);
+void SHA1Init(SHA1_CTX* context);
+void SHA1Update(SHA1_CTX* context, unsigned char const * data, uint32 len);
+void SHA1Final(unsigned char digest[20], SHA1_CTX* context);
+
+#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
+
+/* blk0() and blk() perform the initial expand. */
+/* I got the idea of expanding during the round function from SSLeay */
+#ifdef LITTLE_ENDIAN
+#define blk0(i) (block->l[i] = (rol(block->l[i],24)&0xFF00FF00) \
+ |(rol(block->l[i],8)&0x00FF00FF))
+#else
+#define blk0(i) block->l[i]
+#endif
+#define blk(i) (block->l[i&15] = rol(block->l[(i+13)&15]^block->l[(i+8)&15] \
+ ^block->l[(i+2)&15]^block->l[i&15],1))
+
+/* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */
+#define R0(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk0(i)+0x5A827999+rol(v,5);w=rol(w,30);
+#define R1(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk(i)+0x5A827999+rol(v,5);w=rol(w,30);
+#define R2(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0x6ED9EBA1+rol(v,5);w=rol(w,30);
+#define R3(v,w,x,y,z,i) z+=(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30);
+#define R4(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=rol(w,30);
+
+
+/* Hash a single 512-bit block. This is the core of the algorithm. */
+
+void SHA1Transform(uint32 state[5], unsigned char const buffer[64])
+{
+uint32 a, b, c, d, e;
+typedef union {
+ unsigned char c[64];
+ uint32 l[16];
+} CHAR64LONG16;
+CHAR64LONG16* block;
+#ifdef SHA1HANDSOFF
+static unsigned char workspace[64];
+ block = (CHAR64LONG16*)workspace;
+ memcpy(block, buffer, 64);
+#else
+ block = (CHAR64LONG16*)buffer;
+#endif
+ /* Copy context->state[] to working vars */
+ a = state[0];
+ b = state[1];
+ c = state[2];
+ d = state[3];
+ e = state[4];
+ /* 4 rounds of 20 operations each. Loop unrolled. */
+ R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3);
+ R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7);
+ R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11);
+ R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15);
+ R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19);
+ R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23);
+ R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27);
+ R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31);
+ R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35);
+ R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39);
+ R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43);
+ R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47);
+ R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51);
+ R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55);
+ R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59);
+ R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63);
+ R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67);
+ R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71);
+ R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75);
+ R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79);
+ /* Add the working vars back into context.state[] */
+ state[0] += a;
+ state[1] += b;
+ state[2] += c;
+ state[3] += d;
+ state[4] += e;
+ /* Wipe variables */
+ a = b = c = d = e = 0;
+}
+
+
+/* SHA1Init - Initialize new context */
+
+void SHA1Init(SHA1_CTX* context)
+{
+ /* SHA1 initialization constants */
+ context->state[0] = 0x67452301;
+ context->state[1] = 0xEFCDAB89;
+ context->state[2] = 0x98BADCFE;
+ context->state[3] = 0x10325476;
+ context->state[4] = 0xC3D2E1F0;
+ context->count[0] = context->count[1] = 0;
+}
+
+
+/* Run your data through this. */
+
+void SHA1Update(SHA1_CTX* context, unsigned char const * data, uint32 len)
+{
+ uint32 i, j;
+
+ j = (context->count[0] >> 3) & 63;
+ if ((context->count[0] += len << 3) < (len << 3)) context->count[1]++;
+ context->count[1] += (len >> 29);
+ if ((j + len) > 63) {
+ memcpy(&context->buffer[j], data, (i = 64-j));
+ SHA1Transform(context->state, context->buffer);
+ for ( ; i + 63 < len; i += 64) {
+ SHA1Transform(context->state, &data[i]);
+ }
+ j = 0;
+ }
+ else i = 0;
+ memcpy(&context->buffer[j], &data[i], len - i);
+}
+
+
+/* Add padding and return the message digest. */
+
+void SHA1Final(unsigned char digest[20], SHA1_CTX* context)
+{
+ uint32 i;
+ unsigned char finalcount[8];
+
+ for (i = 0; i < 8; i++) {
+ finalcount[i] = (unsigned char)((context->count[(i >= 4 ? 0 : 1)]
+ >> ((3-(i & 3)) * 8) ) & 255); /* Endian independent */
+ }
+ SHA1Update(context, (unsigned char *)"\200", 1);
+ while ((context->count[0] & 504) != 448) {
+ SHA1Update(context, (unsigned char *)"\0", 1);
+ }
+ SHA1Update(context, finalcount, 8); /* Should cause a SHA1Transform() */
+ for (i = 0; i < 20; i++) {
+ digest[i] = (unsigned char)
+ ((context->state[i>>2] >> ((3-(i & 3)) * 8) ) & 255);
+ }
+ /* Wipe variables */
+ i = 0;
+ memset(context->buffer, 0, 64);
+ memset(context->state, 0, 20);
+ memset(context->count, 0, 8);
+ memset(&finalcount, 0, 8);
+#ifdef SHA1HANDSOFF /* make SHA1Transform overwrite it's own static vars */
+ SHA1Transform(context->state, context->buffer);
+#endif
+}
+
+/*****************************************************************************/
+
+int sha1_encrypt(const char *src, int len, char *dest, int size)
+{
+ SHA1_CTX context;
+ unsigned char tmp[41];
+
+ if (size < 20)
+ return -1;
+
+ memset(dest,0,size);
+
+ SHA1Init(&context);
+ SHA1Update(&context, src, len);
+ SHA1Final(dest, &context);
+
+ if(debug) {
+ memset(tmp,0,41);
+ binary_to_hex(dest,tmp,20);
+ /* Dont log source if we were encrypting in place :) */
+ if (memcmp(src, dest, 20) != 0) {
+ alog("enc_sha1: hashed from [%s] to [%s]",src,tmp);
+ } else {
+ alog("enc_sha1: hashed password to [%s]",tmp);
+ }
+ }
+
+ return 0;
+}
+
+
+int sha1_encrypt_in_place(char *buf, int size)
+{
+ char tmp[41];
+
+ memset(tmp,0,41);
+ if(sha1_encrypt(buf, strlen(buf), tmp, size)==0) {
+ memcpy(buf, tmp, size);
+ } else {
+ return -1;
+ }
+ return 0;
+}
+
+
+int sha1_encrypt_check_len(int passlen, int bufsize)
+{
+ if (bufsize < 20)
+ fatal("enc_sha1: sha1_check_len(): buffer too small (%d)", bufsize);
+ return 0;
+}
+
+
+int sha1_decrypt(const char *src, char *dest, int size)
+{
+ return 0;
+}
+
+
+int sha1_check_password(const char *plaintext, const char *password)
+{
+ char buf[BUFSIZE];
+
+ if (sha1_encrypt(plaintext, strlen(plaintext), buf, sizeof(buf)) < 0)
+ return -1;
+ if (memcmp(buf, password, 20) == 0)
+ return 1;
+
+ return 0;
+}
+
+/*************************************************************************/
+
+/* Module stuff. */
+
+int AnopeInit(int argc, char **argv) {
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(ENCRYPTION);
+
+ encmodule_encrypt(sha1_encrypt);
+ encmodule_encrypt_in_place(sha1_encrypt_in_place);
+ encmodule_encrypt_check_len(sha1_encrypt_check_len);
+ encmodule_decrypt(sha1_decrypt);
+ encmodule_check_password(sha1_check_password);
+
+ return MOD_CONT;
+}
+
+void AnopeFini(void) {
+ encmodule_encrypt(NULL);
+ encmodule_encrypt_in_place(NULL);
+ encmodule_encrypt_check_len(NULL);
+ encmodule_decrypt(NULL);
+ encmodule_check_password(NULL);
+}
+
+/* EOF */
+
diff --git a/src/core/he_help.c b/src/core/he_help.c
new file mode 100644
index 000000000..220df6455
--- /dev/null
+++ b/src/core/he_help.c
@@ -0,0 +1,76 @@
+/* HelpServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_help(User * u);
+
+/**
+ * Create the help command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("HELP", do_help, NULL, -1, -1, -1, -1, -1);
+ moduleAddCommand(HELPSERV, c, MOD_UNIQUE);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * 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.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ */
+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/src/core/hs_del.c b/src/core/hs_del.c
new file mode 100644
index 000000000..73af8cc22
--- /dev/null
+++ b/src/core/hs_del.c
@@ -0,0 +1,91 @@
+/* HostServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_del(User * u);
+void myHostServHelp(User * u);
+
+/**
+ * Create the off command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("DEL", do_del, is_host_remover, HOST_HELP_DEL, -1,
+ -1, -1, -1);
+ moduleAddCommand(HOSTSERV, c, MOD_UNIQUE);
+
+ moduleSetHostHelp(myHostServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to anopes /hs help output.
+ * @param u The user who is requesting help
+ **/
+void myHostServHelp(User * u)
+{
+ if (is_host_remover(u)) {
+ notice_lang(s_HostServ, u, HOST_HELP_CMD_DEL);
+ }
+}
+
+/**
+ * The /hs del command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+int do_del(User * u)
+{
+ NickAlias *na;
+ char *nick = strtok(NULL, " ");
+ if (nick) {
+ if ((na = findnick(nick))) {
+ if (na->status & NS_VERBOTEN) {
+ notice_lang(s_HostServ, u, NICK_X_FORBIDDEN, nick);
+ return MOD_CONT;
+ }
+ 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;
+}
diff --git a/src/core/hs_delall.c b/src/core/hs_delall.c
new file mode 100644
index 000000000..bc26a9032
--- /dev/null
+++ b/src/core/hs_delall.c
@@ -0,0 +1,96 @@
+/* HostServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_delall(User * u);
+void myHostServHelp(User * u);
+
+/**
+ * Create the off command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("DELALL", do_delall, is_host_remover,
+ HOST_HELP_DELALL, -1, -1, -1, -1);
+ moduleAddCommand(HOSTSERV, c, MOD_UNIQUE);
+
+ moduleSetHostHelp(myHostServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to anopes /hs help output.
+ * @param u The user who is requesting help
+ **/
+void myHostServHelp(User * u)
+{
+ if (is_host_remover(u)) {
+ notice_lang(s_HostServ, u, HOST_HELP_CMD_DELALL);
+ }
+}
+
+/**
+ * The /hs delall command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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))) {
+ if (na->status & NS_VERBOTEN) {
+ notice_lang(s_HostServ, u, NICK_X_FORBIDDEN, nick);
+ return MOD_CONT;
+ }
+ 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;
+}
diff --git a/src/core/hs_group.c b/src/core/hs_group.c
new file mode 100644
index 000000000..a88d772e3
--- /dev/null
+++ b/src/core/hs_group.c
@@ -0,0 +1,124 @@
+/* HostServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_group(User * u);
+void myHostServHelp(User * u);
+extern int do_hs_sync(NickCore * nc, char *vIdent, char *hostmask,
+ char *creator, time_t time);
+
+
+/**
+ * Create the off command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("GROUP", do_group, NULL, HOST_HELP_GROUP, -1, -1, -1,
+ -1);
+ moduleAddCommand(HOSTSERV, c, MOD_UNIQUE);
+
+ moduleSetHostHelp(myHostServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to anopes /hs help output.
+ * @param u The user who is requesting help
+ **/
+void myHostServHelp(User * u)
+{
+ notice_lang(s_HostServ, u, HOST_HELP_CMD_GROUP);
+}
+
+/**
+ * The /hs group command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+int do_group(User * u)
+{
+ NickAlias *na;
+ HostCore *tmp;
+ char *vHost = NULL;
+ char *vIdent = NULL;
+ char *creator = NULL;
+ HostCore *head = NULL;
+ time_t time;
+ boolean found = false;
+
+ head = hostCoreListHead();
+
+ 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;
+}
diff --git a/src/core/hs_help.c b/src/core/hs_help.c
new file mode 100644
index 000000000..f237016de
--- /dev/null
+++ b/src/core/hs_help.c
@@ -0,0 +1,66 @@
+/* HostServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_help(User * u);
+
+/**
+ * Create the help command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("HELP", do_help, NULL, -1, -1, -1, -1, -1);
+ moduleAddCommand(HOSTSERV, c, MOD_UNIQUE);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * The /hs help command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+int do_help(User * u)
+{
+ char *cmd = strtok(NULL, "");
+
+ if (!cmd) {
+ notice_help(s_HostServ, u, HOST_HELP, s_HostServ);
+ moduleDisplayHelp(6, u);
+ } else {
+ mod_help_cmd(s_HostServ, u, HOSTSERV, cmd);
+ }
+ return MOD_CONT;
+}
diff --git a/src/core/hs_list.c b/src/core/hs_list.c
new file mode 100644
index 000000000..59a7fd8ae
--- /dev/null
+++ b/src/core/hs_list.c
@@ -0,0 +1,187 @@
+/* HostServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int listOut(User * u);
+void myHostServHelp(User * u);
+
+/**
+ * Create the off command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("LIST", listOut, is_services_oper, -1, -1,
+ HOST_HELP_LIST, HOST_HELP_LIST, HOST_HELP_LIST);
+ moduleAddCommand(HOSTSERV, c, MOD_UNIQUE);
+ moduleSetHostHelp(myHostServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to anopes /hs help output.
+ * @param u The user who is requesting help
+ **/
+void myHostServHelp(User * u)
+{
+ if (is_services_oper(u)) {
+ notice_lang(s_HostServ, u, HOST_HELP_CMD_LIST);
+ }
+}
+
+/**
+ * The /hs list command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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 *head = NULL;
+ HostCore *current;
+
+ head = hostCoreListHead();
+
+ 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) {
+ notice_lang(s_ChanServ, u, LIST_INCORRECT_RANGE);
+ return MOD_CONT;
+ }
+ for (s = tmp; *s; s++) {
+ if (!isdigit(*s)) {
+ free(tmp);
+ notice_lang(s_ChanServ, u, LIST_INCORRECT_RANGE);
+ return MOD_CONT;
+ }
+ }
+ from = atoi(tmp);
+ free(tmp);
+ tmp = myStrGetTokenRemainder(key, '-', 1); /* Read TO out */
+ if (!tmp) {
+ notice_lang(s_ChanServ, u, LIST_INCORRECT_RANGE);
+ return MOD_CONT;
+ }
+ for (s = tmp; *s; s++) {
+ if (!isdigit(*s)) {
+ free(tmp);
+ notice_lang(s_ChanServ, u, LIST_INCORRECT_RANGE);
+ return MOD_CONT;
+ }
+ }
+ to = atoi(tmp);
+ free(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_lang(buf, sizeof(buf), u,
+ 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_lang(buf, sizeof(buf), u,
+ 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;
+}
diff --git a/src/core/hs_off.c b/src/core/hs_off.c
new file mode 100644
index 000000000..c2ce6c498
--- /dev/null
+++ b/src/core/hs_off.c
@@ -0,0 +1,87 @@
+/* HostServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_off(User * u);
+void myHostServHelp(User * u);
+
+/**
+ * Create the off command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("OFF", do_off, NULL, HOST_HELP_OFF, -1, -1, -1, -1);
+ moduleAddCommand(HOSTSERV, c, MOD_UNIQUE);
+
+ moduleSetHostHelp(myHostServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to anopes /hs help output.
+ * @param u The user who is requesting help
+ **/
+void myHostServHelp(User * u)
+{
+ notice_lang(s_HostServ, u, HOST_HELP_CMD_OFF);
+}
+
+/**
+ * The /hs off command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+int do_off(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 && vident == NULL)
+ notice_lang(s_HostServ, u, HOST_NOT_ASSIGNED);
+ else
+ anope_cmd_vhost_off(u);
+ } else {
+ notice_lang(s_HostServ, u, HOST_ID);
+ }
+ } else {
+ notice_lang(s_HostServ, u, HOST_NOT_REGED);
+ }
+ return MOD_CONT;
+}
diff --git a/src/core/hs_on.c b/src/core/hs_on.c
new file mode 100644
index 000000000..9ce692377
--- /dev/null
+++ b/src/core/hs_on.c
@@ -0,0 +1,102 @@
+/* HostServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_on(User * u);
+void myHostServHelp(User * u);
+
+/**
+ * Create the off command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("ON", do_on, NULL, HOST_HELP_ON, -1, -1, -1, -1);
+ moduleAddCommand(HOSTSERV, c, MOD_UNIQUE);
+
+ moduleSetHostHelp(myHostServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to anopes /hs help output.
+ * @param u The user who is requesting help
+ **/
+void myHostServHelp(User * u)
+{
+ notice_lang(s_HostServ, u, HOST_HELP_CMD_ON);
+}
+
+/**
+ * The /hs on command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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);
+ }
+ anope_cmd_vhost_on(u->nick, vIdent, vHost);
+ if (ircd->vhost) {
+ u->vhost = sstrdup(vHost);
+ }
+ if (ircd->vident) {
+ if (vIdent)
+ u->vident = sstrdup(vIdent);
+ }
+ set_lastmask(u);
+ }
+ } else {
+ notice_lang(s_HostServ, u, HOST_ID);
+ }
+ } else {
+ notice_lang(s_HostServ, u, HOST_NOT_REGED);
+ }
+ return MOD_CONT;
+}
diff --git a/src/core/hs_set.c b/src/core/hs_set.c
new file mode 100644
index 000000000..d236830d0
--- /dev/null
+++ b/src/core/hs_set.c
@@ -0,0 +1,178 @@
+/* HostServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int myDoSet(User * u);
+void myHostServHelp(User * u);
+
+/**
+ * Create the off command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("SET", myDoSet, is_host_setter, HOST_HELP_SET, -1,
+ -1, -1, -1);
+ moduleAddCommand(HOSTSERV, c, MOD_UNIQUE);
+
+ moduleSetHostHelp(myHostServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to anopes /hs help output.
+ * @param u The user who is requesting help
+ **/
+void myHostServHelp(User * u)
+{
+ if (is_host_setter(u)) {
+ notice_lang(s_HostServ, u, HOST_HELP_CMD_SET);
+ }
+}
+
+/**
+ * The /hs set command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+int myDoSet(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);
+ free(hostmask);
+ 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);
+ free(vIdent);
+ free(hostmask);
+ return MOD_CONT;
+ }
+ if (strlen(vIdent) > USERMAX - 1) {
+ notice_lang(s_HostServ, u, HOST_SET_IDENTTOOLONG, USERMAX);
+ free(vIdent);
+ free(rawhostmask);
+ free(hostmask);
+ return MOD_CONT;
+ } else {
+ for (s = vIdent; *s; s++) {
+ if (!isvalidchar(*s)) {
+ notice_lang(s_HostServ, u, HOST_SET_IDENT_ERROR);
+ free(vIdent);
+ free(rawhostmask);
+ free(hostmask);
+ return MOD_CONT;
+ }
+ }
+ }
+ if (!ircd->vident) {
+ notice_lang(s_HostServ, u, HOST_NO_VIDENT);
+ free(vIdent);
+ free(rawhostmask);
+ free(hostmask);
+ return MOD_CONT;
+ }
+ }
+ if (strlen(rawhostmask) < HOSTMAX - 1)
+ snprintf(hostmask, HOSTMAX - 1, "%s", rawhostmask);
+ else {
+ notice_lang(s_HostServ, u, HOST_SET_TOOLONG, HOSTMAX);
+ if (vIdent) {
+ free(vIdent);
+ free(rawhostmask);
+ }
+ free(hostmask);
+ return MOD_CONT;
+ }
+
+ if (!isValidHost(hostmask, 3)) {
+ notice_lang(s_HostServ, u, HOST_SET_ERROR);
+ if (vIdent) {
+ free(vIdent);
+ free(rawhostmask);
+ }
+ free(hostmask);
+ return MOD_CONT;
+ }
+
+
+ tmp_time = time(NULL);
+
+ if ((na = findnick(nick))) {
+ if (na->status & NS_VERBOTEN) {
+ notice_lang(s_HostServ, u, NICK_X_FORBIDDEN, nick);
+ if (vIdent) {
+ free(vIdent);
+ free(rawhostmask);
+ }
+ free(hostmask);
+ return MOD_CONT;
+ }
+ if (vIdent && ircd->vident) {
+ alog("vHost for user \002%s\002 set to \002%s@%s\002 by oper \002%s\002", nick, vIdent, hostmask, u->nick);
+ } else {
+ 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);
+ if (vIdent) {
+ free(vIdent);
+ free(rawhostmask);
+ }
+ return MOD_CONT;
+}
diff --git a/src/core/hs_setall.c b/src/core/hs_setall.c
new file mode 100644
index 000000000..9f355b1f7
--- /dev/null
+++ b/src/core/hs_setall.c
@@ -0,0 +1,180 @@
+/* HostServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_setall(User * u);
+void myHostServHelp(User * u);
+extern int do_hs_sync(NickCore * nc, char *vIdent, char *hostmask,
+ char *creator, time_t time);
+
+/**
+ * Create the off command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("SETALL", do_setall, is_host_setter,
+ HOST_HELP_SETALL, -1, -1, -1, -1);
+ moduleAddCommand(HOSTSERV, c, MOD_UNIQUE);
+ moduleSetHostHelp(myHostServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to anopes /hs help output.
+ * @param u The user who is requesting help
+ **/
+void myHostServHelp(User * u)
+{
+ if (is_host_setter(u)) {
+ notice_lang(s_HostServ, u, HOST_HELP_CMD_SETALL);
+ }
+}
+
+/**
+ * The /hs setall command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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);
+ free(hostmask);
+ 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);
+ free(vIdent);
+ free(hostmask);
+ return MOD_CONT;
+ }
+ if (strlen(vIdent) > USERMAX - 1) {
+ notice_lang(s_HostServ, u, HOST_SET_IDENTTOOLONG, USERMAX);
+ free(vIdent);
+ free(rawhostmask);
+ free(hostmask);
+ return MOD_CONT;
+ } else {
+ for (s = vIdent; *s; s++) {
+ if (!isvalidchar(*s)) {
+ notice_lang(s_HostServ, u, HOST_SET_IDENT_ERROR);
+ free(vIdent);
+ free(rawhostmask);
+ free(hostmask);
+ return MOD_CONT;
+ }
+ }
+ }
+ if (!ircd->vident) {
+ notice_lang(s_HostServ, u, HOST_NO_VIDENT);
+ free(vIdent);
+ free(rawhostmask);
+ free(hostmask);
+ return MOD_CONT;
+ }
+ }
+
+ if (strlen(rawhostmask) < HOSTMAX - 1)
+ snprintf(hostmask, HOSTMAX - 1, "%s", rawhostmask);
+ else {
+ notice_lang(s_HostServ, u, HOST_SET_TOOLONG, HOSTMAX);
+ if (vIdent) {
+ free(vIdent);
+ free(rawhostmask);
+ }
+ free(hostmask);
+ return MOD_CONT;
+ }
+
+ if (!isValidHost(hostmask, 3)) {
+ notice_lang(s_HostServ, u, HOST_SET_ERROR);
+ if (vIdent) {
+ free(vIdent);
+ free(rawhostmask);
+ }
+ free(hostmask);
+ return MOD_CONT;
+ }
+
+ tmp_time = time(NULL);
+
+ if ((na = findnick(nick))) {
+ if (na->status & NS_VERBOTEN) {
+ notice_lang(s_HostServ, u, NICK_X_FORBIDDEN, nick);
+ if (vIdent) {
+ free(vIdent);
+ free(rawhostmask);
+ }
+ free(hostmask);
+ return MOD_CONT;
+ }
+ if (vIdent && ircd->vident) {
+ alog("vHost for all nicks in group \002%s\002 set to \002%s@%s\002 by oper \002%s\002", nick, vIdent, hostmask, u->nick);
+ } else {
+ 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);
+ }
+ if (vIdent) {
+ free(vIdent);
+ free(rawhostmask);
+ }
+ free(hostmask);
+ return MOD_CONT;
+}
diff --git a/src/core/ms_cancel.c b/src/core/ms_cancel.c
new file mode 100644
index 000000000..568a05310
--- /dev/null
+++ b/src/core/ms_cancel.c
@@ -0,0 +1,105 @@
+/* MemoServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_cancel(User * u);
+void myMemoServHelp(User * u);
+
+/**
+ * Create the cancel command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+ c = createCommand("CANCEL", do_cancel, NULL, MEMO_HELP_CANCEL, -1, -1,
+ -1, -1);
+ moduleAddCommand(MEMOSERV, c, MOD_UNIQUE);
+ moduleSetMemoHelp(myMemoServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to anopes /ms help output.
+ * @param u The user who is requesting help
+ **/
+void myMemoServHelp(User * u)
+{
+ notice_lang(s_MemoServ, u, MEMO_HELP_CMD_CANCEL);
+}
+
+/**
+ * The /ms cancel command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+int do_cancel(User * u)
+{
+ int ischan;
+ int isforbid;
+ 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, &isforbid))) {
+ if (isforbid) {
+ notice_lang(s_MemoServ, u,
+ ischan ? CHAN_X_FORBIDDEN :
+ NICK_X_FORBIDDEN, name);
+ } else {
+ 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)
+ && (!(mi->memos[i].flags & MF_NOTIFYS))) {
+ 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;
+}
diff --git a/src/core/ms_check.c b/src/core/ms_check.c
new file mode 100644
index 000000000..661a5c1ab
--- /dev/null
+++ b/src/core/ms_check.c
@@ -0,0 +1,118 @@
+/* MemoServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_memocheck(User * u);
+void myMemoServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+ c = createCommand("CHECK", do_memocheck, NULL, MEMO_HELP_CHECK, -1, -1,
+ -1, -1);
+ moduleAddCommand(MEMOSERV, c, MOD_UNIQUE);
+ moduleSetMemoHelp(myMemoServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to anopes /ms help output.
+ * @param u The user who is requesting help
+ **/
+void myMemoServHelp(User * u)
+{
+ notice_lang(s_MemoServ, u, MEMO_HELP_CMD_CHECK);
+}
+
+/**
+ * The /ms check command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+int do_memocheck(User * u)
+{
+ NickAlias *na = NULL;
+ MemoInfo *mi = NULL;
+ int i, found = 0;
+ char *recipient = strtok(NULL, "");
+ struct tm *tm;
+ char timebuf[64];
+
+ if (!recipient) {
+ syntax_error(s_MemoServ, u, "CHECK", MEMO_CHECK_SYNTAX);
+ return MOD_CONT;
+ } else if (!nick_recognized(u)) {
+ notice_lang(s_MemoServ, u, NICK_IDENTIFY_REQUIRED, s_NickServ);
+ return MOD_CONT;
+ } else if (!(na = findnick(recipient))) {
+ notice_lang(s_MemoServ, u, NICK_X_NOT_REGISTERED, recipient);
+ return MOD_CONT;
+ }
+
+ if ((na->status & NS_VERBOTEN)) {
+ notice_lang(s_MemoServ, u, NICK_X_FORBIDDEN, recipient);
+ return MOD_CONT;
+ }
+
+ mi = &na->nc->memos;
+
+/* Okay, I know this looks strange but we wanna get the LAST memo, so we
+ have to loop backwards */
+
+ for (i = (mi->memocount - 1); i >= 0; i--) {
+ if (!stricmp(mi->memos[i].sender, u->na->nc->display)) {
+ found = 1; /* Yes, we've found the memo */
+
+ tm = localtime(&mi->memos[i].time);
+ strftime_lang(timebuf, sizeof(timebuf), u,
+ STRFTIME_DATE_TIME_FORMAT, tm);
+
+ if (mi->memos[i].flags & MF_UNREAD)
+ notice_lang(s_MemoServ, u, MEMO_CHECK_NOT_READ, na->nick,
+ timebuf);
+ else
+ notice_lang(s_MemoServ, u, MEMO_CHECK_READ, na->nick,
+ timebuf);
+ break;
+ }
+ }
+
+ if (!found)
+ notice_lang(s_MemoServ, u, MEMO_CHECK_NO_MEMO, na->nick);
+
+ return MOD_CONT;
+}
diff --git a/src/core/ms_del.c b/src/core/ms_del.c
new file mode 100644
index 000000000..f8a294f3e
--- /dev/null
+++ b/src/core/ms_del.c
@@ -0,0 +1,202 @@
+/* MemoServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_del(User * u);
+int del_memo_callback(User * u, int num, va_list args);
+void myMemoServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+ c = createCommand("DEL", do_del, NULL, MEMO_HELP_DEL, -1, -1, -1, -1);
+ moduleAddCommand(MEMOSERV, c, MOD_UNIQUE);
+ moduleSetMemoHelp(myMemoServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to anopes /ms help output.
+ * @param u The user who is requesting help
+ **/
+void myMemoServHelp(User * u)
+{
+ notice_lang(s_MemoServ, u, MEMO_HELP_CMD_DEL);
+}
+
+/**
+ * The /ms del command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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 (readonly) {
+ notice_lang(s_MemoServ, u, READ_ONLY_MODE);
+ 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);
+ moduleCleanStruct(&mi->memos[i].moduleData);
+ }
+ 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;
+}
+
+/**
+ * Delete a single memo from a MemoInfo. callback function
+ * @param u User Struct
+ * @param int Number
+ * @param va_list Variable Arguemtns
+ * @return 1 if successful, 0 if it fails
+ */
+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;
+ }
+}
diff --git a/src/core/ms_help.c b/src/core/ms_help.c
new file mode 100644
index 000000000..7b49aa43c
--- /dev/null
+++ b/src/core/ms_help.c
@@ -0,0 +1,66 @@
+/* MemoServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_help(User * u);
+
+/**
+ * Create the help command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+ c = createCommand("HELP", do_help, NULL, -1, -1, -1, -1, -1);
+ moduleAddCommand(MEMOSERV, c, MOD_UNIQUE);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * The /ms help command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+int do_help(User * u)
+{
+ char *cmd = strtok(NULL, "");
+
+ if (!cmd) {
+ notice_help(s_MemoServ, u, MEMO_HELP_HEADER);
+ 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;
+}
diff --git a/src/core/ms_info.c b/src/core/ms_info.c
new file mode 100644
index 000000000..2e4e91b46
--- /dev/null
+++ b/src/core/ms_info.c
@@ -0,0 +1,231 @@
+/* MemoServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_info(User * u);
+void myMemoServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+ c = createCommand("INFO", do_info, NULL, -1, MEMO_HELP_INFO, -1,
+ MEMO_SERVADMIN_HELP_INFO, MEMO_SERVADMIN_HELP_INFO);
+ moduleAddCommand(MEMOSERV, c, MOD_UNIQUE);
+ moduleSetMemoHelp(myMemoServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to anopes /ms help output.
+ * @param u The user who is requesting help
+ **/
+void myMemoServHelp(User * u)
+{
+ notice_lang(s_MemoServ, u, MEMO_HELP_CMD_INFO);
+}
+
+/**
+ * The /ms info command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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;
+ } else if (na->status & NS_VERBOTEN) {
+ notice_lang(s_MemoServ, u, NICK_X_FORBIDDEN, 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 == 1)
+ 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 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)) */
+}
diff --git a/src/core/ms_list.c b/src/core/ms_list.c
new file mode 100644
index 000000000..b0a203afd
--- /dev/null
+++ b/src/core/ms_list.c
@@ -0,0 +1,197 @@
+/* MemoServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+int do_list(User * u);
+int list_memo_callback(User * u, int num, va_list args);
+int list_memo(User * u, int index, MemoInfo * mi, int *sent_header,
+ int new, const char *chan);
+void myMemoServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+ c = createCommand("LIST", do_list, NULL, MEMO_HELP_LIST, -1, -1, -1,
+ -1);
+ moduleAddCommand(MEMOSERV, c, MOD_UNIQUE);
+ moduleSetMemoHelp(myMemoServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to anopes /ms help output.
+ * @param u The user who is requesting help
+ **/
+void myMemoServHelp(User * u)
+{
+ notice_lang(s_MemoServ, u, MEMO_HELP_CMD_LIST);
+}
+
+/**
+ * List the memos (if any) for the source nick or given channel.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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;
+}
+
+/**
+ * list memno callback function
+ * @param u User Struct
+ * @param int Memo number
+ * @param va_list List of arguements
+ * @return result form list_memo()
+ */
+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);
+}
+
+/**
+ * Display a single memo entry, possibly printing the header first.
+ * @param u User Struct
+ * @param int Memo index
+ * @param mi MemoInfo Struct
+ * @param send_header If we are to send the headers
+ * @param new If we are listing new memos
+ * @param chan Channel name
+ * @return MOD_CONT
+ */
+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;
+}
diff --git a/src/core/ms_read.c b/src/core/ms_read.c
new file mode 100644
index 000000000..3588ac9f0
--- /dev/null
+++ b/src/core/ms_read.c
@@ -0,0 +1,203 @@
+/* MemoServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_read(User * u);
+int read_memo_callback(User * u, int num, va_list args);
+int read_memo(User * u, int index, MemoInfo * mi, const char *chan);
+void myMemoServHelp(User * u);
+extern void rsend_notify(User * u, Memo * m, const char *chan);
+
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+ c = createCommand("READ", do_read, NULL, MEMO_HELP_READ, -1, -1, -1,
+ -1);
+ moduleAddCommand(MEMOSERV, c, MOD_UNIQUE);
+ moduleSetMemoHelp(myMemoServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to anopes /ms help output.
+ * @param u The user who is requesting help
+ **/
+void myMemoServHelp(User * u)
+{
+ notice_lang(s_MemoServ, u, MEMO_HELP_CMD_READ);
+}
+
+/**
+ * The /ms read command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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;
+}
+
+/**
+ * Read a memo callback function
+ * @param u User Struct
+ * @param int Index number
+ * @param va_list variable arguements
+ * @return result of read_memo()
+ */
+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 a memo
+ * @param u User Struct
+ * @param int Index number
+ * @param mi MemoInfo struct
+ * @param chan Channel Name
+ * @return 1 on success, 0 if failed
+ */
+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;
+
+ /* Check if a receipt notification was requested */
+ if (m->flags & MF_RECEIPT) {
+ rsend_notify(u, m, chan);
+ }
+
+ return 1;
+}
diff --git a/src/core/ms_rsend.c b/src/core/ms_rsend.c
new file mode 100644
index 000000000..4baf81c00
--- /dev/null
+++ b/src/core/ms_rsend.c
@@ -0,0 +1,120 @@
+/* MemoServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_rsend(User * u);
+void myMemoServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion
+ ("$Id$");
+ moduleSetType(CORE);
+ c = createCommand("RSEND", do_rsend, NULL, MEMO_HELP_RSEND, -1, -1, -1,
+ -1);
+ moduleAddCommand(MEMOSERV, c, MOD_UNIQUE);
+ moduleSetMemoHelp(myMemoServHelp);
+
+ if (!MSMemoReceipt) {
+ return MOD_STOP;
+ }
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+/**
+ * Add the help response to anopes /ms help output.
+ * @param u The user who is requesting help
+ **/
+void myMemoServHelp(User * u)
+{
+ if (((MSMemoReceipt == 1) && (is_services_oper(u)))
+ || (MSMemoReceipt == 2)) {
+ notice_lang(s_MemoServ, u, MEMO_HELP_CMD_RSEND);
+ }
+}
+
+/**
+ * The /ms rsend command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+int do_rsend(User * u)
+{
+ char *name = strtok(NULL, " ");
+ char *text = strtok(NULL, "");
+ NickAlias *na = NULL;
+ int z = 3;
+
+
+
+ /* check if the variables are here */
+ if (!name || !text) {
+ notice_lang(s_MemoServ, u, MEMO_RSEND_SYNTAX);
+ return MOD_CONT;
+ }
+
+ /* prevent user from rsend to themselves */
+ if ((na = findnick(name))) {
+ if (u->na) {
+ if (stricmp(na->nc->display, u->na->nc->display) == 0) {
+ notice_lang(s_MemoServ, u, MEMO_NO_RSEND_SELF);
+ return MOD_CONT;
+ }
+ } else {
+ notice_lang(s_MemoServ, u, NICK_X_NOT_REGISTERED, name);
+ return MOD_CONT;
+ }
+ }
+
+ if (MSMemoReceipt == 1) {
+ /* Services opers and above can use rsend */
+ if (is_services_oper(u)) {
+ memo_send(u, name, text, z);
+ } else {
+ notice_lang(s_MemoServ, u, ACCESS_DENIED);
+ }
+ } else if (MSMemoReceipt == 2) {
+ /* Everybody can use rsend */
+ memo_send(u, name, text, z);
+ } else {
+ /* rsend has been disabled */
+ if (debug) {
+ alog("debug: MSMemoReceipt is set misconfigured to %d",
+ MSMemoReceipt);
+ }
+ notice_lang(s_MemoServ, u, MEMO_RSEND_DISABLED);
+ }
+
+ return MOD_CONT;
+}
diff --git a/src/core/ms_send.c b/src/core/ms_send.c
new file mode 100644
index 000000000..3ea195262
--- /dev/null
+++ b/src/core/ms_send.c
@@ -0,0 +1,74 @@
+/* MemoServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_send(User * u);
+void myMemoServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion
+ ("$Id$");
+ moduleSetType(CORE);
+ c = createCommand("SEND", do_send, NULL, MEMO_HELP_SEND, -1, -1, -1,
+ -1);
+ moduleAddCommand(MEMOSERV, c, MOD_UNIQUE);
+ moduleSetMemoHelp(myMemoServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to anopes /ms help output.
+ * @param u The user who is requesting help
+ **/
+void myMemoServHelp(User * u)
+{
+ notice_lang(s_MemoServ, u, MEMO_HELP_CMD_SEND);
+}
+
+/**
+ * The /ms send command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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;
+}
diff --git a/src/core/ms_sendall.c b/src/core/ms_sendall.c
new file mode 100644
index 000000000..fd0e32454
--- /dev/null
+++ b/src/core/ms_sendall.c
@@ -0,0 +1,96 @@
+/* MemoServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_sendall(User * u);
+void myMemoServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion
+ ("$Id$");
+ moduleSetType(CORE);
+ c = createCommand("SENDALL", do_sendall, is_services_admin, -1, -1, -1,
+ MEMO_HELP_SENDALL, MEMO_HELP_SENDALL);
+ moduleAddCommand(MEMOSERV, c, MOD_UNIQUE);
+ moduleSetMemoHelp(myMemoServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to anopes /ms help output.
+ * @param u The user who is requesting help
+ **/
+void myMemoServHelp(User * u)
+{
+ if (is_services_admin(u)) {
+ notice_lang(s_MemoServ, u, MEMO_HELP_CMD_SENDALL);
+ }
+}
+
+/**
+ * The /ms sendall command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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/src/core/ms_set.c b/src/core/ms_set.c
new file mode 100644
index 000000000..699a949c7
--- /dev/null
+++ b/src/core/ms_set.c
@@ -0,0 +1,266 @@
+/* MemoServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_set(User * u);
+int do_set_notify(User * u, MemoInfo * mi, char *param);
+int do_set_limit(User * u, MemoInfo * mi, char *param);
+void myMemoServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("SET", do_set, NULL, MEMO_HELP_SET, -1, -1, -1, -1);
+ moduleAddCommand(MEMOSERV, c, MOD_UNIQUE);
+
+ c = createCommand("SET NOTIFY", NULL, NULL, MEMO_HELP_SET_NOTIFY, -1,
+ -1, -1, -1);
+ moduleAddCommand(MEMOSERV, c, MOD_UNIQUE);
+
+ 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);
+ c->help_param1 = (char *) (long) MSMaxMemos;
+ moduleAddCommand(MEMOSERV, c, MOD_UNIQUE);
+
+ moduleSetMemoHelp(myMemoServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to anopes /hs help output.
+ * @param u The user who is requesting help
+ **/
+void myMemoServHelp(User * u)
+{
+ notice_lang(s_MemoServ, u, MEMO_HELP_CMD_SET);
+}
+
+/**
+ * The /ms set command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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;
+}
+
+/**
+ * The /ms set notify command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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, "MAIL") == 0) {
+ if (u->na->nc->email) {
+ u->na->nc->flags |= NI_MEMO_MAIL;
+ notice_lang(s_MemoServ, u, MEMO_SET_NOTIFY_MAIL);
+ } else {
+ notice_lang(s_MemoServ, u, MEMO_SET_NOTIFY_INVALIDMAIL);
+ }
+ } else if (stricmp(param, "NOMAIL") == 0) {
+ u->na->nc->flags &= ~NI_MEMO_MAIL;
+ notice_lang(s_MemoServ, u, MEMO_SET_NOTIFY_NOMAIL);
+ } 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;
+}
+
+/**
+ * The /ms set limit command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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;
+}
diff --git a/src/core/ms_staff.c b/src/core/ms_staff.c
new file mode 100644
index 000000000..e6462c975
--- /dev/null
+++ b/src/core/ms_staff.c
@@ -0,0 +1,93 @@
+/* MemoServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_staff(User * u);
+void myMemoServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion
+ ("$Id$");
+ moduleSetType(CORE);
+ c = createCommand("STAFF", do_staff, is_services_oper, -1, -1,
+ MEMO_HELP_STAFF, MEMO_HELP_STAFF, MEMO_HELP_STAFF);
+ moduleAddCommand(MEMOSERV, c, MOD_UNIQUE);
+ moduleSetMemoHelp(myMemoServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to anopes /ms help output.
+ * @param u The user who is requesting help
+ **/
+void myMemoServHelp(User * u)
+{
+ if (is_services_oper(u)) {
+ notice_lang(s_MemoServ, u, MEMO_HELP_CMD_STAFF);
+ }
+}
+
+/**
+ * The /ms staff command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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;
+}
diff --git a/src/core/ns_access.c b/src/core/ns_access.c
new file mode 100644
index 000000000..40e925012
--- /dev/null
+++ b/src/core/ns_access.c
@@ -0,0 +1,189 @@
+/* NickServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_access(User * u);
+void myNickServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("ACCESS", do_access, NULL, NICK_HELP_ACCESS, -1, -1,
+ -1, -1);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+
+ moduleSetNickHelp(myNickServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to anopes /ns help output.
+ * @param u The user who is requesting help
+ **/
+void myNickServHelp(User * u)
+{
+ notice_lang(s_NickServ, u, NICK_HELP_CMD_ACCESS);
+}
+
+/**
+ * The /ns access command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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->nc->accesscount == 0) {
+ notice_lang(s_NickServ, u, NICK_ACCESS_LIST_X_EMPTY, na->nick);
+ return MOD_CONT;
+ }
+
+ if (na->status & NS_VERBOTEN) {
+ notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, na->nick);
+ return MOD_CONT;
+ }
+
+ if (na->nc->flags & NI_SUSPENDED) {
+ notice_lang(s_NickServ, u, NICK_X_SUSPENDED, 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 (na->nc->flags & NI_SUSPENDED) {
+ notice_lang(s_NickServ, u, NICK_X_SUSPENDED, 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) {
+ if (na->nc->accesscount == 0) {
+ notice_lang(s_NickServ, u, NICK_ACCESS_LIST_EMPTY, u->nick);
+ return MOD_CONT;
+ }
+
+ 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;
+}
diff --git a/src/core/ns_alist.c b/src/core/ns_alist.c
new file mode 100644
index 000000000..8090531d2
--- /dev/null
+++ b/src/core/ns_alist.c
@@ -0,0 +1,186 @@
+/* NickServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_alist(User * u);
+void myNickServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("ALIST", do_alist, NULL, -1, NICK_HELP_ALIST, -1,
+ NICK_SERVADMIN_HELP_ALIST,
+ NICK_SERVADMIN_HELP_ALIST);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+
+ moduleSetNickHelp(myNickServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to anopes /ns help output.
+ * @param u The user who is requesting help
+ **/
+void myNickServHelp(User * u)
+{
+ notice_lang(s_NickServ, u, NICK_HELP_CMD_ALIST);
+}
+
+/**
+ * The /ns alist command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+int do_alist(User * u)
+{
+
+/*
+ * List the channels that the given nickname has access on
+ *
+ * /ns ALIST [level]
+ * /ns ALIST [nickname] [level]
+ *
+ * -jester
+ */
+
+ char *nick = NULL;
+ char *lev = NULL;
+
+ NickAlias *na;
+
+ int min_level = 0;
+ int is_servadmin = is_services_admin(u);
+
+ if (!is_servadmin) {
+ /* Non service admins can only see their own levels */
+ na = u->na;
+ } else {
+ /* Services admins can request ALIST on nicks.
+ * The first argument for service admins must
+ * always be a nickname.
+ */
+ nick = strtok(NULL, " ");
+
+ /* If an argument was passed, use it as the nick to see levels
+ * for, else check levels for the user calling the command */
+ if (nick) {
+ na = findnick(nick);
+ } else {
+ na = u->na;
+ }
+ }
+
+ /* If available, get level from arguments */
+ lev = strtok(NULL, " ");
+
+ /* 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;
+ } else if (stricmp(lev, "HOP") == 0) {
+ min_level = ACCESS_HOP;
+ } else if (stricmp(lev, "VOP") == 0) {
+ min_level = ACCESS_VOP;
+ } else {
+ min_level = atoi(lev);
+ }
+ }
+
+ if (!nick_identified(u)) {
+ notice_lang(s_NickServ, u, NICK_IDENTIFY_REQUIRED, s_NickServ);
+ } else if (is_servadmin && nick && !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 (min_level <= ACCESS_INVALID || min_level > ACCESS_FOUNDER) {
+ notice_lang(s_NickServ, u, CHAN_ACCESS_LEVEL_RANGE,
+ ACCESS_INVALID + 1, ACCESS_FOUNDER - 1);
+ } 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)) {
+ const 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;
+}
diff --git a/src/core/ns_drop.c b/src/core/ns_drop.c
new file mode 100644
index 000000000..e0434d7e0
--- /dev/null
+++ b/src/core/ns_drop.c
@@ -0,0 +1,156 @@
+/* NickServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_drop(User * u);
+int do_unlink(User * u);
+void myNickServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("DROP", do_drop, NULL, -1, NICK_HELP_DROP, -1,
+ NICK_SERVADMIN_HELP_DROP, NICK_SERVADMIN_HELP_DROP);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+ c = createCommand("UNLINK", do_unlink, NULL, -1, -1, -1, -1, -1);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+
+ moduleSetNickHelp(myNickServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to anopes /ns help output.
+ * @param u The user who is requesting help
+ **/
+void myNickServHelp(User * u)
+{
+ notice_lang(s_NickServ, u, NICK_HELP_CMD_DROP);
+}
+
+/**
+ * The /ns drop command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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? */
+ char *my_nick = NULL;
+
+ 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)
+ anope_cmd_global(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, u->host,
+ 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)
+ my_nick = sstrdup(na->nick);
+
+ 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);
+
+ if (ircd->sqline && (na->status & NS_VERBOTEN)) {
+ anope_cmd_unsqline(na->nick);
+ }
+
+ alog("%s: %s!%s@%s dropped nickname %s (group %s) (e-mail: %s)",
+ s_NickServ, u->nick, u->username, u->host,
+ na->nick, na->nc->display,
+ (na->nc->email ? na->nc->email : "none"));
+ delnick(na);
+ send_event(EVENT_NICK_DROPPED, 1, (my_nick ? my_nick : nick));
+
+ if (!is_mine) {
+ if (WallDrop)
+ anope_cmd_global(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);
+ if (my_nick) {
+ free(my_nick);
+ }
+ }
+ }
+ return MOD_CONT;
+}
+
+
+int do_unlink(User * u)
+{
+ notice_lang(s_NickServ, u, OBSOLETE_COMMAND, "DROP");
+ return MOD_CONT;
+}
diff --git a/src/core/ns_forbid.c b/src/core/ns_forbid.c
new file mode 100644
index 000000000..b3ecc5531
--- /dev/null
+++ b/src/core/ns_forbid.c
@@ -0,0 +1,155 @@
+/* NickServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_forbid(User * u);
+void myNickServHelp(User * u);
+NickAlias *makenick(const char *nick);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("FORBID", do_forbid, is_services_admin, -1, -1, -1,
+ NICK_SERVADMIN_HELP_FORBID,
+ NICK_SERVADMIN_HELP_FORBID);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+
+ moduleSetNickHelp(myNickServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to anopes /ns help output.
+ * @param u The user who is requesting help
+ **/
+void myNickServHelp(User * u)
+{
+ if (is_services_admin(u)) {
+ notice_lang(s_NickServ, u, NICK_HELP_CMD_FORBID);
+ }
+}
+
+/**
+ * The /ns forbid command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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 (!anope_valid_nick(nick)) {
+ notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, nick);
+ return MOD_CONT;
+ }
+ 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 (ircd->sqline) {
+ anope_cmd_sqline(na->nick, ((reason) ? reason : "Forbidden"));
+ }
+
+ if (WallForbid)
+ anope_cmd_global(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);
+ send_event(EVENT_NICK_FORBIDDEN, 1, 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;
+}
+
+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;
+}
diff --git a/src/core/ns_getemail.c b/src/core/ns_getemail.c
new file mode 100644
index 000000000..5dc8b08bc
--- /dev/null
+++ b/src/core/ns_getemail.c
@@ -0,0 +1,102 @@
+/* NickServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_getemail(User * u);
+void myNickServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("GETEMAIL", do_getemail, is_services_admin, -1, -1,
+ -1, NICK_SERVADMIN_HELP_GETEMAIL,
+ NICK_SERVADMIN_HELP_GETEMAIL);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+
+ moduleSetNickHelp(myNickServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+/**
+ * Add the help response to anopes /ns help output.
+ * @param u The user who is requesting help
+ **/
+void myNickServHelp(User * u)
+{
+ if (is_services_admin(u)) {
+ notice_lang(s_NickServ, u, NICK_HELP_CMD_GETEMAIL);
+ }
+}
+
+/**
+ * The /ns getemail command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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, u->host, 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;
+}
diff --git a/src/core/ns_getpass.c b/src/core/ns_getpass.c
new file mode 100644
index 000000000..946102389
--- /dev/null
+++ b/src/core/ns_getpass.c
@@ -0,0 +1,112 @@
+/* NickServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_getpass(User * u);
+void myNickServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("GETPASS", do_getpass, is_services_admin, -1, -1, -1,
+ NICK_SERVADMIN_HELP_GETPASS,
+ NICK_SERVADMIN_HELP_GETPASS);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+
+ moduleSetNickHelp(myNickServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+/**
+ * Add the help response to anopes /ns help output.
+ * @param u The user who is requesting help
+ **/
+void myNickServHelp(User * u)
+{
+ if (is_services_admin(u)) {
+ notice_lang(s_NickServ, u, NICK_HELP_CMD_GETPASS);
+ }
+}
+
+/**
+ * The /ns getpass command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+int do_getpass(User * u)
+{
+ char *nick = strtok(NULL, " ");
+ char tmp_pass[PASSMAX];
+ NickAlias *na;
+ NickRequest *nr = NULL;
+
+ 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, u->host, nick);
+ if (WallGetpass)
+ anope_cmd_global(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 {
+ if(enc_decrypt(na->nc->pass,tmp_pass,PASSMAX - 1)==1) {
+ alog("%s: %s!%s@%s used GETPASS on %s", s_NickServ, u->nick,
+ u->username, u->host, nick);
+ if (WallGetpass)
+ anope_cmd_global(s_NickServ, "\2%s\2 used GETPASS on \2%s\2",
+ u->nick, nick);
+ notice_lang(s_NickServ, u, NICK_GETPASS_PASSWORD_IS, nick,
+ tmp_pass);
+ } else {
+ notice_lang(s_NickServ, u, NICK_GETPASS_UNAVAILABLE);
+ }
+ }
+ return MOD_CONT;
+}
diff --git a/src/core/ns_ghost.c b/src/core/ns_ghost.c
new file mode 100644
index 000000000..07736bec7
--- /dev/null
+++ b/src/core/ns_ghost.c
@@ -0,0 +1,118 @@
+/* NickServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_ghost(User * u);
+void myNickServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("GHOST", do_ghost, NULL, NICK_HELP_GHOST, -1, -1, -1,
+ -1);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+
+ moduleSetNickHelp(myNickServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to anopes /ns help output.
+ * @param u The user who is requesting help
+ **/
+void myNickServHelp(User * u)
+{
+ notice_lang(s_NickServ, u, NICK_HELP_CMD_GHOST);
+}
+
+/**
+ * The /ns ghost command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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 (na->nc->flags & NI_SUSPENDED) {
+ notice_lang(s_NickServ, u, NICK_X_SUSPENDED, na->nick);
+ } else if (stricmp(nick, u->nick) == 0) {
+ notice_lang(s_NickServ, u, NICK_NO_GHOST_SELF);
+ } else if (pass) {
+ int res = enc_check_password(pass, na->nc->pass);
+ if (res == 1) {
+ char buf[NICKMAX + 32];
+ snprintf(buf, sizeof(buf), "GHOST command used by %s",
+ u->nick);
+
+ kill_user(s_NickServ, nick, buf);
+ 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, u->host);
+ 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);
+
+ kill_user(s_NickServ, nick, buf);
+ notice_lang(s_NickServ, u, NICK_GHOST_KILLED, nick);
+ } else {
+ notice_lang(s_NickServ, u, ACCESS_DENIED);
+ }
+ }
+ return MOD_CONT;
+}
diff --git a/src/core/ns_group.c b/src/core/ns_group.c
new file mode 100644
index 000000000..926d062f0
--- /dev/null
+++ b/src/core/ns_group.c
@@ -0,0 +1,337 @@
+/* NickServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_group(User * u);
+void myNickServHelp(User * u);
+int do_glist(User * u);
+int do_listlinks(User * u);
+
+NickAlias *makealias(const char *nick, NickCore * nc);
+
+/* Obsolete commands */
+int do_link(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("GROUP", do_group, NULL, NICK_HELP_GROUP, -1, -1, -1,
+ -1);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+
+ c = createCommand("LINK", do_link, NULL, -1, -1, -1, -1, -1);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+
+ c = createCommand("GLIST", do_glist, NULL, -1, NICK_HELP_GLIST, -1,
+ NICK_SERVADMIN_HELP_GLIST,
+ NICK_SERVADMIN_HELP_GLIST);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+
+ c = createCommand("LISTLINKS", do_listlinks, NULL, -1, -1, -1, -1, -1);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+
+ moduleSetNickHelp(myNickServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to anopes /ns help output.
+ * @param u The user who is requesting help
+ **/
+void myNickServHelp(User * u)
+{
+ notice_lang(s_NickServ, u, NICK_HELP_CMD_GROUP);
+ notice_lang(s_NickServ, u, NICK_HELP_CMD_GLIST);
+}
+
+/**
+ * The /ns group command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+/* Register a nick in a specified group. */
+
+int do_group(User * u)
+{
+ NickAlias *na, *target;
+ NickCore *nc;
+ char *nick = strtok(NULL, " ");
+ char *pass = strtok(NULL, " ");
+ int i;
+ char tsbuf[16];
+ char modes[512];
+ int len;
+
+ 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 (RestrictOperNicks) {
+ for (i = 0; i < RootNumber; i++) {
+ if (stristr(u->nick, ServicesRoots[i]) && !is_oper(u)) {
+ notice_lang(s_NickServ, u, NICK_CANNOT_BE_REGISTERED,
+ u->nick);
+ return MOD_CONT;
+ }
+ }
+ for (i = 0; i < servadmins.count && (nc = servadmins.list[i]); i++) {
+ if (stristr(u->nick, nc->display) && !is_oper(u)) {
+ notice_lang(s_NickServ, u, NICK_CANNOT_BE_REGISTERED,
+ u->nick);
+ return MOD_CONT;
+ }
+ }
+ for (i = 0; i < servopers.count && (nc = servopers.list[i]); i++) {
+ if (stristr(u->nick, nc->display) && !is_oper(u)) {
+ notice_lang(s_NickServ, u, NICK_CANNOT_BE_REGISTERED,
+ u->nick);
+ return MOD_CONT;
+ }
+ }
+ }
+
+ if (!nick || !pass) {
+ syntax_error(s_NickServ, u, "GROUP", NICK_GROUP_SYNTAX);
+ } else if (!(target = findnick(nick))) {
+ notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, nick);
+ } 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, u->host, u->nick);
+ notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, u->nick);
+ } else if (u->na && (u->na->nc->flags & NI_SUSPENDED)) {
+ alog("%s: %s!%s@%s tried to use GROUP from SUSPENDED nick %s",
+ s_NickServ, u->nick, u->username, u->host, target->nick);
+ notice_lang(s_NickServ, u, NICK_X_SUSPENDED, 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 && (target->nc->flags & NI_SUSPENDED)) {
+ alog("%s: %s!%s@%s tried to use GROUP from SUSPENDED nick %s",
+ s_NickServ, u->nick, u->username, u->host, target->nick);
+ notice_lang(s_NickServ, u, NICK_X_SUSPENDED, target->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 (enc_check_password(pass, target->nc->pass) != 1) {
+ alog("%s: Failed GROUP for %s!%s@%s (invalid password)",
+ s_NickServ, u->nick, u->username, u->host);
+ 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(common_get_vident(u)) +
+ strlen(common_get_vhost(u)) + 2, 1);
+ sprintf(na->last_usermask, "%s@%s", common_get_vident(u),
+ common_get_vhost(u));
+ na->last_realname = sstrdup(u->realname);
+ na->time_registered = na->last_seen = time(NULL);
+ na->status = (int16) (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
+ send_event(EVENT_GROUP, 1, u->nick);
+ alog("%s: %s!%s@%s makes %s join group of %s (%s) (e-mail: %s)", s_NickServ, u->nick, u->username, u->host, 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);
+ snprintf(tsbuf, sizeof(tsbuf), "%lu",
+ (unsigned long int) u->timestamp);
+ if (ircd->modeonreg) {
+ len = strlen(ircd->modeonreg);
+ strncpy(modes,ircd->modeonreg,512);
+ if(ircd->rootmodeonid && is_services_root(u)) {
+ strncat(modes,ircd->rootmodeonid,512-len);
+ } else if(ircd->adminmodeonid && is_services_admin(u)) {
+ strncat(modes,ircd->adminmodeonid,512-len);
+ } else if(ircd->opermodeonid && is_services_oper(u)) {
+ strncat(modes,ircd->opermodeonid,512-len);
+ }
+ if (ircd->tsonmode) {
+ common_svsmode(u, modes, tsbuf);
+ } else {
+ common_svsmode(u, modes, NULL);
+ }
+ }
+
+ check_memos(u);
+ } else {
+ alog("%s: makealias(%s) failed", s_NickServ, u->nick);
+ notice_lang(s_NickServ, u, NICK_GROUP_FAILED);
+ }
+ }
+ return MOD_CONT;
+}
+
+
+/* Creates a new alias in NickServ database. */
+
+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;
+}
+
+
+int do_link(User * u)
+{
+ notice_lang(s_NickServ, u, OBSOLETE_COMMAND, "GROUP");
+ return MOD_CONT;
+}
+
+int do_glist(User * u)
+{
+ char *nick = strtok(NULL, " ");
+
+ NickAlias *na, *na2;
+ int is_servadmin = is_services_admin(u);
+ int nick_ided = nick_identified(u);
+ int i;
+
+ if ((nick ? (stricmp(nick, u->nick) ? !is_servadmin : !nick_ided)
+ : !nick_ided)) {
+ notice_lang(s_NickServ, u,
+ (nick_ided ? ACCESS_DENIED :
+ NICK_IDENTIFY_REQUIRED), s_NickServ);
+ } 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 {
+ time_t expt;
+ struct tm *tm;
+ char buf[BUFSIZE];
+ int wont_expire;
+
+ 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) {
+ if (!(wont_expire = na2->status & NS_NO_EXPIRE)) {
+ expt = na2->last_seen + NSExpire;
+ tm = localtime(&expt);
+ strftime_lang(buf, sizeof(buf), na2->u,
+ STRFTIME_DATE_TIME_FORMAT, tm);
+ }
+ notice_lang(s_NickServ, u,
+ ((is_services_admin(u) && !wont_expire)
+ ? NICK_GLIST_REPLY_ADMIN : NICK_GLIST_REPLY),
+ (wont_expire ? '!' : ' '), na2->nick, buf);
+ }
+ }
+ notice_lang(s_NickServ, u, NICK_GLIST_FOOTER,
+ na->nc->aliases.count);
+ }
+ return MOD_CONT;
+}
+
+
+int do_listlinks(User * u)
+{
+ notice_lang(s_NickServ, u, OBSOLETE_COMMAND, "GLIST");
+ return MOD_CONT;
+}
diff --git a/src/core/ns_help.c b/src/core/ns_help.c
new file mode 100644
index 000000000..e65d9dbf5
--- /dev/null
+++ b/src/core/ns_help.c
@@ -0,0 +1,79 @@
+/* NickServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_help(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("HELP", do_help, NULL, -1, -1, -1, -1, -1);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+/**
+ * The /ns help command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+int do_help(User * u)
+{
+ char *cmd = strtok(NULL, "");
+
+ if (!cmd) {
+ notice_help(s_NickServ, u, NICK_HELP);
+ moduleDisplayHelp(1, u);
+ if (is_services_admin(u)) {
+ notice_help(s_NickServ, u, NICK_SERVADMIN_HELP);
+ }
+ if (NSExpire >= 86400)
+ notice_help(s_NickServ, u, NICK_HELP_EXPIRES,
+ NSExpire / 86400);
+ notice_help(s_NickServ, u, NICK_HELP_FOOTER);
+ } 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;
+}
+
+/* EOF */
diff --git a/src/core/ns_identify.c b/src/core/ns_identify.c
new file mode 100644
index 000000000..cbeb7705e
--- /dev/null
+++ b/src/core/ns_identify.c
@@ -0,0 +1,171 @@
+/* NickServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+#define TO_COLLIDE 0 /* Collide the user with this nick */
+#define TO_RELEASE 1 /* Release a collided nick */
+
+int do_identify(User * u);
+void myNickServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("ID", do_identify, NULL, NICK_HELP_IDENTIFY, -1, -1,
+ -1, -1);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+ c = createCommand("IDENTIFY", do_identify, NULL, NICK_HELP_IDENTIFY,
+ -1, -1, -1, -1);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+ c = createCommand("SIDENTIFY", do_identify, NULL, -1, -1, -1, -1, -1);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+
+
+ moduleSetNickHelp(myNickServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+/**
+ * Add the help response to anopes /ns help output.
+ * @param u The user who is requesting help
+ **/
+void myNickServHelp(User * u)
+{
+ notice_lang(s_NickServ, u, NICK_HELP_CMD_IDENTIFY);
+}
+
+/**
+ * The /ns identify command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+int do_identify(User * u)
+{
+ char *pass = strtok(NULL, " ");
+ NickAlias *na;
+ NickRequest *nr;
+ int res;
+ char tsbuf[16];
+ char modes[512];
+ int len;
+
+ 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 (na->nc->flags & NI_SUSPENDED) {
+ notice_lang(s_NickServ, u, NICK_X_SUSPENDED, na->nick);
+ } else if (nick_identified(u)) {
+ notice_lang(s_NickServ, u, NICK_ALREADY_IDENTIFIED);
+ } else if (!(res = enc_check_password(pass, na->nc->pass))) {
+ alog("%s: Failed IDENTIFY for %s!%s@%s", s_NickServ, u->nick,
+ u->username, u->host);
+ notice_lang(s_NickServ, u, PASSWORD_INCORRECT);
+ bad_password(u);
+ } else if (res == -1) {
+ notice_lang(s_NickServ, u, NICK_IDENTIFY_FAILED);
+ } else {
+ if (!(na->status & NS_IDENTIFIED) && !(na->status & NS_RECOGNIZED)) {
+ if (na->last_usermask)
+ free(na->last_usermask);
+ na->last_usermask =
+ scalloc(strlen(common_get_vident(u)) +
+ strlen(common_get_vhost(u)) + 2, 1);
+ sprintf(na->last_usermask, "%s@%s", common_get_vident(u),
+ common_get_vhost(u));
+ if (na->last_realname)
+ free(na->last_realname);
+ na->last_realname = sstrdup(u->realname);
+ }
+
+ na->status |= NS_IDENTIFIED;
+ na->last_seen = time(NULL);
+ snprintf(tsbuf, sizeof(tsbuf), "%lu",
+ (unsigned long int) u->timestamp);
+
+ if (ircd->modeonreg) {
+ len = strlen(ircd->modeonreg);
+ strncpy(modes,ircd->modeonreg,512);
+ if(ircd->rootmodeonid && is_services_root(u)) {
+ strncat(modes,ircd->rootmodeonid,512-len);
+ } else if(ircd->adminmodeonid && is_services_admin(u)) {
+ strncat(modes,ircd->adminmodeonid,512-len);
+ } else if(ircd->opermodeonid && is_services_oper(u)) {
+ strncat(modes,ircd->opermodeonid,512-len);
+ }
+ if (ircd->tsonmode) {
+ common_svsmode(u, modes, tsbuf);
+ } else {
+ common_svsmode(u, modes, "");
+ }
+ }
+ send_event(EVENT_NICK_IDENTIFY, 1, u->nick);
+ alog("%s: %s!%s@%s identified for nick %s", s_NickServ, u->nick,
+ u->username, u->host, u->nick);
+ notice_lang(s_NickServ, u, NICK_IDENTIFY_SUCCEEDED);
+ if (ircd->vhost) {
+ 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);
+
+ /* Enable nick tracking if enabled */
+ if (NSNickTracking)
+ nsStartNickTracking(u);
+
+ /* Clear any timers */
+ if (na->nc->flags & NI_KILLPROTECT) {
+ del_ns_timeout(na, TO_COLLIDE);
+ }
+
+ }
+ return MOD_CONT;
+}
diff --git a/src/core/ns_info.c b/src/core/ns_info.c
new file mode 100644
index 000000000..ecc2b3bb8
--- /dev/null
+++ b/src/core/ns_info.c
@@ -0,0 +1,284 @@
+/* NickServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+static int do_info(User * u);
+void myNickServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion
+ ("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("INFO", do_info, NULL, NICK_HELP_INFO, -1,
+ NICK_HELP_INFO, NICK_SERVADMIN_HELP_INFO,
+ NICK_SERVADMIN_HELP_INFO);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+
+ moduleSetNickHelp(myNickServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to anopes /ns help output.
+ * @param u The user who is requesting help
+ **/
+void myNickServHelp(User * u)
+{
+ notice_lang(s_NickServ, u, NICK_HELP_CMD_INFO);
+}
+
+/**
+ * The /ns info command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+int do_info(User * u)
+{
+
+/* 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)
+ */
+
+ char *nick = strtok(NULL, " ");
+ char *param = strtok(NULL, " ");
+
+ NickAlias *na;
+ NickRequest *nr = NULL;
+ /* Being an oper is enough from now on -GD */
+ int is_servadmin = is_services_oper(u);
+
+ 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 if (nickIsServices(nick, 1)) {
+ notice_lang(s_NickServ, u, NICK_X_IS_SERVICES, 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;
+ time_t expt;
+
+ /* 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_identified(u) && (na->nc == u->na->nc)) || is_servadmin) {
+
+ if (nick_is_services_root(na->nc))
+ notice_lang(s_NickServ, u, NICK_INFO_SERVICES_ROOT,
+ na->nick);
+ else if (nick_is_services_admin(na->nc))
+ 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);
+
+ } else {
+
+ if (nick_is_services_root(na->nc)
+ && !(na->nc->flags & NI_HIDE_STATUS))
+ notice_lang(s_NickServ, u, NICK_INFO_SERVICES_ROOT,
+ na->nick);
+ else if (nick_is_services_admin(na->nc)
+ && !(na->nc->flags & NI_HIDE_STATUS))
+ notice_lang(s_NickServ, u, NICK_INFO_SERVICES_ADMIN,
+ na->nick);
+ else if (nick_is_services_oper(na->nc)
+ && !(na->nc->flags & NI_HIDE_STATUS))
+ 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) {
+ if (s_HostServ && ircd->vhost) {
+ if (getvHost(na->nick) != NULL) {
+ if (ircd->vident && getvIdent(na->nick) != NULL) {
+ notice_lang(s_NickServ, u, NICK_INFO_VHOST2,
+ getvIdent(na->nick),
+ getvHost(na->nick));
+ } else {
+ notice_lang(s_NickServ, u, NICK_INFO_VHOST,
+ getvHost(na->nick));
+ }
+ }
+ }
+ 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;
+ }
+ if (!(na->nc->flags & NI_AUTOOP)) {
+ end += snprintf(end, sizeof(buf) - (end - buf), "%s%s",
+ need_comma ? commastr : "",
+ getstring(u->na, NICK_INFO_OPT_AUTOOP));
+ need_comma = 1;
+ }
+
+ notice_lang(s_NickServ, u, NICK_INFO_OPTIONS,
+ *buf ? buf : getstring(u->na, NICK_INFO_OPT_NONE));
+
+ if (na->nc->flags & NI_SUSPENDED) {
+ if (na->last_quit) {
+ notice_lang(s_NickServ, u, NICK_INFO_SUSPENDED,
+ na->last_quit);
+ } else {
+ notice_lang(s_NickServ, u,
+ NICK_INFO_SUSPENDED_NO_REASON);
+ }
+ }
+
+ if (na->status & NS_NO_EXPIRE) {
+ notice_lang(s_NickServ, u, NICK_INFO_NO_EXPIRE);
+ } else {
+ if (is_services_admin(u)) {
+ expt = na->last_seen + NSExpire;
+ tm = localtime(&expt);
+ strftime_lang(buf, sizeof(buf), na->u,
+ STRFTIME_DATE_TIME_FORMAT, tm);
+ notice_lang(s_NickServ, u, NICK_INFO_EXPIRE, buf);
+ }
+ }
+ }
+
+ 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;
+}
diff --git a/src/core/ns_list.c b/src/core/ns_list.c
new file mode 100644
index 000000000..6c6639f66
--- /dev/null
+++ b/src/core/ns_list.c
@@ -0,0 +1,247 @@
+/* NickServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_list(User * u);
+void myNickServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("LIST", do_list, NULL, -1, NICK_HELP_LIST, -1,
+ NICK_SERVADMIN_HELP_LIST, NICK_SERVADMIN_HELP_LIST);
+
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+
+ moduleSetNickHelp(myNickServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to anopes /ns help output.
+ * @param u The user who is requesting help
+ **/
+void myNickServHelp(User * u)
+{
+ if (!NSListOpersOnly || (is_oper(u))) {
+ notice_lang(s_NickServ, u, NICK_HELP_CMD_LIST);
+ }
+}
+
+/**
+ * The /ns list command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+int do_list(User * u)
+{
+
+/* 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
+ *
+ * UPDATE: SUSPENDED keyword is now accepted as well.
+ */
+
+
+ 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;
+ int susp_keyword = 0;
+ char noexpire_char = ' ';
+ int count = 0, from = 0, to = 0, tofree = 0;
+ char *tmp = NULL;
+ char *s = NULL;
+
+ if (!(!NSListOpersOnly || (is_oper(u)))) { /* reverse the help logic */
+ notice_lang(s_NickServ, u, ACCESS_DENIED);
+ return MOD_STOP;
+ }
+
+ 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) {
+ notice_lang(s_ChanServ, u, LIST_INCORRECT_RANGE);
+ return MOD_CONT;
+ }
+ for (s = tmp; *s; s++) {
+ if (!isdigit(*s)) {
+ free(tmp);
+ notice_lang(s_ChanServ, u, LIST_INCORRECT_RANGE);
+ return MOD_CONT;
+ }
+ }
+ from = atoi(tmp);
+ free(tmp);
+ tmp = myStrGetTokenRemainder(pattern, '-', 1); /* Read TO out */
+ if (!tmp) {
+ notice_lang(s_ChanServ, u, LIST_INCORRECT_RANGE);
+ return MOD_CONT;
+ }
+ for (s = tmp; *s; s++) {
+ if (!isdigit(*s)) {
+ free(tmp);
+ notice_lang(s_ChanServ, u, LIST_INCORRECT_RANGE);
+ return MOD_CONT;
+ }
+ }
+ to = atoi(tmp);
+ free(tmp);
+ pattern = sstrdup("*");
+ tofree = 1;
+ }
+ }
+
+ 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, "SUSPENDED") == 0)
+ susp_keyword = 1;
+ 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) && (susp_keyword == 0))
+ continue;
+ else if ((susp_keyword == 1) && !(na->nc->flags & NI_SUSPENDED))
+ 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 if (na->nc->flags & NI_SUSPENDED) {
+ snprintf(buf, sizeof(buf),
+ "%-20s [Suspended]", 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);
+ }
+ if (tofree)
+ free(pattern);
+ return MOD_CONT;
+}
diff --git a/src/core/ns_logout.c b/src/core/ns_logout.c
new file mode 100644
index 000000000..d2691132a
--- /dev/null
+++ b/src/core/ns_logout.c
@@ -0,0 +1,128 @@
+/* NickServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+#define TO_COLLIDE 0 /* Collide the user with this nick */
+#define TO_RELEASE 1 /* Release a collided nick */
+
+int do_logout(User * u);
+void myNickServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("LOGOUT", do_logout, NULL, -1, NICK_HELP_LOGOUT, -1,
+ NICK_SERVADMIN_HELP_LOGOUT,
+ NICK_SERVADMIN_HELP_LOGOUT);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+
+ moduleSetNickHelp(myNickServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to anopes /ns help output.
+ * @param u The user who is requesting help
+ **/
+void myNickServHelp(User * u)
+{
+ notice_lang(s_NickServ, u, NICK_HELP_CMD_LOGOUT);
+}
+
+/**
+ * The /ns logout command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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);
+ }
+
+ if (ircd->modeonreg) {
+ common_svsmode(u2, ircd->modeonunreg, "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, u->host, u2->nick);
+
+ if (nick)
+ notice_lang(s_NickServ, u, NICK_LOGOUT_X_SUCCEEDED, nick);
+ else
+ notice_lang(s_NickServ, u, NICK_LOGOUT_SUCCEEDED);
+
+ /* Stop nick tracking if enabled */
+ if (NSNickTracking)
+ /* Shouldn't this be u2? -GD */
+ nsStopNickTracking(u);
+
+ /* Clear any timers again */
+ if (u->na->nc->flags & NI_KILLPROTECT) {
+ del_ns_timeout(u->na, TO_COLLIDE);
+ }
+
+ /* Send out an event */
+ send_event(EVENT_NICK_LOGOUT, 1, u2->nick);
+ }
+ return MOD_CONT;
+}
diff --git a/src/core/ns_recover.c b/src/core/ns_recover.c
new file mode 100644
index 000000000..71aa2b893
--- /dev/null
+++ b/src/core/ns_recover.c
@@ -0,0 +1,137 @@
+/* NickServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+Command *c;
+
+int do_recover(User * u);
+void myNickServHelp(User * u);
+int myHelpResonse(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("RECOVER", do_recover, NULL, -1, -1, -1, -1, -1);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+ moduleAddHelp(c, myHelpResonse);
+
+ moduleSetNickHelp(myNickServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+/**
+ * Add the help response to anopes /ns help output.
+ * @param u The user who is requesting help
+ **/
+void myNickServHelp(User * u)
+{
+ notice_lang(s_NickServ, u, NICK_HELP_CMD_RECOVER);
+}
+
+/**
+ * Show the extended help on the RECOVER command.
+ * @param u The user who is requesting help
+ **/
+int myHelpResonse(User * u)
+{
+ char relstr[192];
+
+ /* Convert NSReleaseTimeout seconds to string format */
+ duration(u->na, relstr, sizeof(relstr), NSReleaseTimeout);
+
+ notice_help(s_NickServ, u, NICK_HELP_RECOVER, relstr);
+ do_help_limited(s_NickServ, u, c);
+
+ return MOD_CONT;
+}
+
+/**
+ * The /ns recover command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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 (na->nc->flags & NI_SUSPENDED) {
+ notice_lang(s_NickServ, u, NICK_X_SUSPENDED, na->nick);
+ } else if (stricmp(nick, u->nick) == 0) {
+ notice_lang(s_NickServ, u, NICK_NO_RECOVER_SELF);
+ } else if (pass) {
+ int res = enc_check_password(pass, na->nc->pass);
+
+ if (res == 1) {
+ char relstr[192];
+
+ notice_lang(s_NickServ, u2, FORCENICKCHANGE_NOW);
+ collide(na, 0);
+
+ /* Convert NSReleaseTimeout seconds to string format */
+ duration(u2->na, relstr, sizeof(relstr), NSReleaseTimeout);
+
+ notice_lang(s_NickServ, u, NICK_RECOVERED, s_NickServ, nick, relstr);
+ } 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, u->host);
+ 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;
+}
+
+/* EOF */
diff --git a/src/core/ns_register.c b/src/core/ns_register.c
new file mode 100644
index 000000000..6e33e8e08
--- /dev/null
+++ b/src/core/ns_register.c
@@ -0,0 +1,490 @@
+/* NickServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+#include "encrypt.h"
+
+int do_confirm(User * u);
+int do_register(User * u);
+int do_resend(User * u);
+void myNickServHelp(User * u);
+NickRequest *makerequest(const char *nick);
+NickAlias *makenick(const char *nick);
+int do_sendregmail(User * u, NickRequest * nr);
+int ns_do_register(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("REGISTER", do_register, NULL, NICK_HELP_REGISTER,
+ -1, -1, -1, -1);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+
+ c = createCommand("CONFIRM", do_confirm, NULL, NICK_HELP_CONFIRM, -1, -1, -1, -1);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+
+ c = createCommand("RESEND", do_resend, NULL, NICK_HELP_RESEND, -1, -1, -1, -1);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+
+
+ moduleSetNickHelp(myNickServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to anopes /ns help output.
+ * @param u The user who is requesting help
+ **/
+void myNickServHelp(User * u)
+{
+ notice_lang(s_NickServ, u, NICK_HELP_CMD_REGISTER);
+ if (NSEmailReg) {
+ notice_lang(s_NickServ, u, NICK_HELP_CMD_CONFIRM);
+ notice_lang(s_NickServ, u, NICK_HELP_CMD_RESEND);
+ }
+}
+
+/**
+ * The /ns register command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+int do_register(User * u)
+{
+ NickRequest *nr = NULL, *anr = NULL;
+ NickCore *nc = 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, i = 0;
+ 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 (!is_oper(u) && NickRegDelay
+ && ((time(NULL) - u->my_signon) < NickRegDelay)) {
+ notice_lang(s_NickServ, u, NICK_REG_DELAY, NickRegDelay);
+ 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 (!anope_valid_nick(u->nick)) {
+ notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, u->nick);
+ return MOD_CONT;
+ }
+
+ if (RestrictOperNicks) {
+ for (i = 0; i < RootNumber; i++) {
+ if (stristr(u->nick, ServicesRoots[i]) && !is_oper(u)) {
+ notice_lang(s_NickServ, u, NICK_CANNOT_BE_REGISTERED,
+ u->nick);
+ return MOD_CONT;
+ }
+ }
+ for (i = 0; i < servadmins.count && (nc = servadmins.list[i]); i++) {
+ if (stristr(u->nick, nc->display) && !is_oper(u)) {
+ notice_lang(s_NickServ, u, NICK_CANNOT_BE_REGISTERED,
+ u->nick);
+ return MOD_CONT;
+ }
+ }
+ for (i = 0; i < servopers.count && (nc = servopers.list[i]); i++) {
+ if (stristr(u->nick, nc->display) && !is_oper(u)) {
+ notice_lang(s_NickServ, u, NICK_CANNOT_BE_REGISTERED,
+ u->nick);
+ return MOD_CONT;
+ }
+ }
+ }
+
+ if (!pass) {
+ if (NSForceEmail) {
+ syntax_error(s_NickServ, u, "REGISTER",
+ NICK_REGISTER_SYNTAX_EMAIL);
+ } else {
+ syntax_error(s_NickServ, u, "REGISTER", NICK_REGISTER_SYNTAX);
+ }
+ } else if (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, u->host, 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 (enc_encrypt_check_len(strlen(pass), PASSMAX - 1)) {
+ notice_lang(s_NickServ, u, PASSWORD_TOO_LONG);
+ } else if (email && !MailValidate(email)) {
+ notice_lang(s_NickServ, u, MAIL_X_INVALID, email);
+ } else {
+ for (idx = 0; idx < 9; idx++) {
+ passcode[idx] =
+ chars[(1 +
+ (int) (((float) (max - min)) * getrandom16() /
+ (65535 + 1.0)) + min)];
+ } passcode[idx] = '\0';
+ nr = makerequest(u->nick);
+ nr->passcode = sstrdup(passcode);
+ strscpy(nr->password, pass, PASSMAX);
+ memset(pass, 0, strlen(pass));
+ /* We are paranoid about keeping a plain text pass in memory, yet we would write
+ * it to a database.. - Viper */
+ enc_encrypt_in_place(nr->password, PASSMAX);
+ 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;
+}
+
+/*************************************************************************/
+
+int ns_do_register(User * u)
+{
+ return do_register(u);
+}
+
+
+int do_confirm(User * u)
+{
+
+ NickRequest *nr = NULL;
+ NickAlias *na = NULL;
+ char *passcode = strtok(NULL, " ");
+ char *email = NULL;
+ int forced = 0;
+ User *utmp = NULL;
+ char modes[512];
+ int len;
+
+ 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, their 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;
+ }
+
+ if (nr->email) {
+ email = sstrdup(nr->email);
+ }
+ na = makenick(nr->nick);
+
+ if (na) {
+ int i;
+ char tsbuf[16];
+ char tmp_pass[PASSMAX];
+
+ memcpy(na->nc->pass, nr->password, PASSMAX);
+ na->status = (int16) (NS_IDENTIFIED | NS_RECOGNIZED);
+/* na->nc->flags |= NI_ENCRYPTEDPW; */
+
+ 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(common_get_vident(u)) +
+ strlen(common_get_vhost(u)) + 2, 1);
+ sprintf(na->last_usermask, "%s@%s", common_get_vident(u),
+ common_get_vhost(u));
+ na->last_realname = sstrdup(u->realname);
+ }
+ na->time_registered = na->last_seen = time(NULL);
+ if (NSAddAccessOnReg) {
+ na->nc->accesscount = 1;
+ na->nc->access = scalloc(sizeof(char *), 1);
+ na->nc->access[0] = create_mask(u);
+ } else {
+ na->nc->accesscount = 0;
+ na->nc->access = NULL;
+ }
+ 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, u->host, (email ? email : "none"));
+ if (NSAddAccessOnReg)
+ notice_lang(s_NickServ, u, NICK_REGISTERED, u->nick,
+ na->nc->access[0]);
+ else
+ notice_lang(s_NickServ, u, NICK_REGISTERED_NO_MASK,
+ u->nick);
+ send_event(EVENT_NICK_REGISTERED, 1, u->nick);
+
+ if(enc_decrypt(na->nc->pass, tmp_pass, PASSMAX - 1)==1)
+ notice_lang(s_NickServ, u, NICK_PASSWORD_IS, tmp_pass);
+
+ u->lastnickreg = time(NULL);
+ if (ircd->modeonreg) {
+ len = strlen(ircd->modeonreg);
+ strncpy(modes,ircd->modeonreg,512);
+ if(ircd->rootmodeonid && is_services_root(u)) {
+ strncat(modes,ircd->rootmodeonid,512-len);
+ } else if(ircd->adminmodeonid && is_services_admin(u)) {
+ strncat(modes,ircd->adminmodeonid,512-len);
+ } else if(ircd->opermodeonid && is_services_oper(u)) {
+ strncat(modes,ircd->opermodeonid,512-len);
+ }
+
+ if (ircd->tsonmode) {
+ snprintf(tsbuf, sizeof(tsbuf), "%lu",
+ (unsigned long int) u->timestamp);
+ common_svsmode(u, modes, tsbuf);
+ } else {
+ common_svsmode(u, modes, NULL);
+ }
+ }
+
+ } 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);
+ }
+
+ /* Enable nick tracking if enabled */
+ if (NSNickTracking)
+ nsStartNickTracking(u);
+
+ return MOD_CONT;
+}
+
+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. */
+
+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;
+}
+
+/* Register a nick. */
+
+int do_resend(User * u)
+{
+ NickRequest *nr = NULL;
+ if (NSEmailReg) {
+ if ((nr = findrequestnick(u->nick))) {
+ if (time(NULL) < nr->lastmail + NSResendDelay) {
+ notice_lang(s_NickServ, u, MAIL_LATER);
+ return MOD_CONT;
+ }
+ if (do_sendregmail(u, nr) == 0) {
+ nr->lastmail = time(NULL);
+ 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;
+}
+
+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;
+}
+
diff --git a/src/core/ns_release.c b/src/core/ns_release.c
new file mode 100644
index 000000000..e2820b0e9
--- /dev/null
+++ b/src/core/ns_release.c
@@ -0,0 +1,127 @@
+/* NickServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+Command *c;
+
+int do_release(User * u);
+void myNickServHelp(User * u);
+int myHelpResonse(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("RELEASE", do_release, NULL, -1, -1, -1, -1, -1);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+ moduleAddHelp(c, myHelpResonse);
+
+ moduleSetNickHelp(myNickServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to anopes /ns help output.
+ * @param u The user who is requesting help
+ **/
+void myNickServHelp(User * u)
+{
+ notice_lang(s_NickServ, u, NICK_HELP_CMD_RELEASE);
+}
+
+/**
+ * Show the extended help on the RELEASE command.
+ * @param u The user who is requesting help
+ **/
+int myHelpResonse(User * u)
+{
+ char relstr[192];
+
+ /* Convert NSReleaseTimeout seconds to string format */
+ duration(u->na, relstr, sizeof(relstr), NSReleaseTimeout);
+
+ notice_help(s_NickServ, u, NICK_HELP_RELEASE, relstr);
+ do_help_limited(s_NickServ, u, c);
+
+ return MOD_CONT;
+}
+
+/**
+ * The /ns release command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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->nc->flags & NI_SUSPENDED) {
+ notice_lang(s_NickServ, u, NICK_X_SUSPENDED, na->nick);
+ } else if (!(na->status & NS_KILL_HELD)) {
+ notice_lang(s_NickServ, u, NICK_RELEASE_NOT_HELD, nick);
+ } else if (pass) {
+ int res = enc_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, u->host);
+ 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;
+}
+
+/* EOF */
diff --git a/src/core/ns_saset.c b/src/core/ns_saset.c
new file mode 100644
index 000000000..133fb098d
--- /dev/null
+++ b/src/core/ns_saset.c
@@ -0,0 +1,533 @@
+/* NickServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+#include "encrypt.h"
+
+int do_saset(User * u);
+int do_saset_display(User * u, NickCore * nc, char *param);
+int do_saset_password(User * u, NickCore * nc, char *param);
+int do_saset_url(User * u, NickCore * nc, char *param);
+int do_saset_email(User * u, NickCore * nc, char *param);
+int do_saset_greet(User * u, NickCore * nc, char *param);
+int do_saset_icq(User * u, NickCore * nc, char *param);
+int do_saset_kill(User * u, NickCore * nc, char *param);
+int do_saset_secure(User * u, NickCore * nc, char *param);
+int do_saset_private(User * u, NickCore * nc, char *param);
+int do_saset_msg(User * u, NickCore * nc, char *param);
+int do_saset_hide(User * u, NickCore * nc, char *param);
+int do_saset_noexpire(User * u, NickAlias * nc, char *param);
+int do_saset_autoop(User * u, NickCore * nc, char *param);
+int do_saset_language(User * u, NickCore * nc, char *param);
+void myNickServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("SASET", do_saset, is_services_oper, -1, -1, -1,
+ NICK_HELP_SASET, NICK_HELP_SASET);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+ c = createCommand("SASET DISPLAY", NULL, is_services_oper,
+ NICK_HELP_SASET_DISPLAY, -1, -1, -1, -1);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+ c = createCommand("SASET PASSWORD", NULL, is_services_oper,
+ NICK_HELP_SASET_PASSWORD, -1, -1, -1, -1);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+ c = createCommand("SASET URL", NULL, is_services_oper,
+ NICK_HELP_SASET_URL, -1, -1, -1, -1);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+ c = createCommand("SASET EMAIL", NULL, is_services_oper,
+ NICK_HELP_SASET_EMAIL, -1, -1, -1, -1);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+ c = createCommand("SASET ICQ", NULL, is_services_oper,
+ NICK_HELP_SASET_ICQ, -1, -1, -1, -1);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+ c = createCommand("SASET GREET", NULL, is_services_oper,
+ NICK_HELP_SASET_GREET, -1, -1, -1, -1);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+ c = createCommand("SASET KILL", NULL, is_services_oper,
+ NICK_HELP_SASET_KILL, -1, -1, -1, -1);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+ c = createCommand("SASET SECURE", NULL, is_services_oper,
+ NICK_HELP_SASET_SECURE, -1, -1, -1, -1);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+ c = createCommand("SASET PRIVATE", NULL, is_services_oper,
+ NICK_HELP_SASET_PRIVATE, -1, -1, -1, -1);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+ c = createCommand("SASET MSG", NULL, is_services_oper,
+ NICK_HELP_SASET_MSG, -1, -1, -1, -1);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+ c = createCommand("SASET HIDE", NULL, is_services_oper,
+ NICK_HELP_SASET_HIDE, -1, -1, -1, -1);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+ c = createCommand("SASET NOEXPIRE", NULL, is_services_oper, -1, -1,
+ -1, NICK_HELP_SASET_NOEXPIRE,
+ NICK_HELP_SASET_NOEXPIRE);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+ c = createCommand("SASET AUTOOP", NULL, is_services_oper, -1, -1,
+ -1, NICK_HELP_SASET_AUTOOP,
+ NICK_HELP_SASET_AUTOOP);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+ c = createCommand("SASET LANGUAGE", NULL, is_services_oper,
+ -1, -1, -1, -1, NICK_HELP_SASET_LANGUAGE);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+
+ moduleSetNickHelp(myNickServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to anopes /ns help output.
+ * @param u The user who is requesting help
+ **/
+void myNickServHelp(User * u)
+{
+ if (is_services_oper(u))
+ notice_lang(s_NickServ, u, NICK_HELP_CMD_SASET);
+}
+
+/**
+ * The /ns saset command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+int do_saset(User * u)
+{
+ char *nick = strtok(NULL, " ");
+ char *cmd = strtok(NULL, " ");
+ char *param = strtok(NULL, " ");
+
+ NickAlias *na;
+
+ if (readonly) {
+ notice_lang(s_NickServ, u, NICK_SASET_DISABLED);
+ return MOD_CONT;
+ }
+ if (!nick) {
+ syntax_error(s_NickServ, u, "SASET", NICK_SASET_SYNTAX);
+ return MOD_CONT;
+ }
+ if (!(na = findnick(nick))) {
+ notice_lang(s_NickServ, u, NICK_SASET_BAD_NICK, nick);
+ return MOD_CONT;
+ }
+
+ if (!param
+ && (!cmd
+ || (stricmp(cmd, "URL") != 0 && stricmp(cmd, "EMAIL") != 0
+ && stricmp(cmd, "GREET") != 0
+ && stricmp(cmd, "ICQ") != 0))) {
+ syntax_error(s_NickServ, u, "SASET", NICK_SASET_SYNTAX);
+ } else if (!na) {
+ notice_lang(s_NickServ, u, NICK_NOT_REGISTERED, nick);
+ } else if (na->status & NS_VERBOTEN) {
+ notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, na->nick);
+ } else if (na->nc->flags & NI_SUSPENDED) {
+ notice_lang(s_NickServ, u, NICK_X_SUSPENDED, na->nick);
+ } else if (stricmp(cmd, "DISPLAY") == 0) {
+ do_saset_display(u, na->nc, param);
+ } else if (stricmp(cmd, "PASSWORD") == 0) {
+ do_saset_password(u, na->nc, param);
+ } else if (stricmp(cmd, "URL") == 0) {
+ do_saset_url(u, na->nc, param);
+ } else if (stricmp(cmd, "EMAIL") == 0) {
+ do_saset_email(u, na->nc, param);
+ } else if (stricmp(cmd, "ICQ") == 0) {
+ do_saset_icq(u, na->nc, param);
+ } else if (stricmp(cmd, "GREET") == 0) {
+ do_saset_greet(u, na->nc, param);
+ } else if (stricmp(cmd, "KILL") == 0) {
+ do_saset_kill(u, na->nc, param);
+ } else if (stricmp(cmd, "SECURE") == 0) {
+ do_saset_secure(u, na->nc, param);
+ } else if (stricmp(cmd, "PRIVATE") == 0) {
+ do_saset_private(u, na->nc, param);
+ } else if (stricmp(cmd, "MSG") == 0) {
+ do_saset_msg(u, na->nc, param);
+ } else if (stricmp(cmd, "HIDE") == 0) {
+ do_saset_hide(u, na->nc, param);
+ } else if (stricmp(cmd, "NOEXPIRE") == 0) {
+ do_saset_noexpire(u, na, param);
+ } else if (stricmp(cmd, "AUTOOP") == 0) {
+ do_saset_autoop(u, na->nc, param);
+ } else if (stricmp(cmd, "LANGUAGE") == 0) {
+ do_saset_language(u, na->nc, param);
+ } else {
+ notice_lang(s_NickServ, u, NICK_SASET_UNKNOWN_OPTION, cmd);
+ }
+ return MOD_CONT;
+}
+
+int do_saset_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) == 0) {
+ param = na->nick; /* Because case may differ */
+ break;
+ }
+ }
+
+ if (i == nc->aliases.count) {
+ notice_lang(s_NickServ, u, NICK_SASET_DISPLAY_INVALID,
+ nc->display);
+ return MOD_CONT;
+ }
+
+ change_core_display(nc, param);
+ notice_lang(s_NickServ, u, NICK_SASET_DISPLAY_CHANGED, nc->display);
+
+ /* Enable nick tracking if enabled */
+ if (NSNickTracking)
+ nsStartNickTracking(u);
+
+ return MOD_CONT;
+}
+
+int do_saset_password(User * u, NickCore * nc, char *param)
+{
+ int len = strlen(param);
+ char tmp_pass[PASSMAX];
+
+ 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;
+ } else if (enc_encrypt_check_len(len ,PASSMAX - 1)) {
+ notice_lang(s_NickServ, u, PASSWORD_TOO_LONG);
+ return MOD_CONT;
+ }
+
+ if (enc_encrypt(param, len, nc->pass, PASSMAX - 1) < 0) {
+ memset(param, 0, len);
+ alog("%s: Failed to encrypt password for %s (set)", s_NickServ,
+ nc->display);
+ notice_lang(s_NickServ, u, NICK_SASET_PASSWORD_FAILED,
+ nc->display);
+ return MOD_CONT;
+ }
+ memset(param, 0, len);
+
+ if(enc_decrypt(nc->pass,tmp_pass,PASSMAX - 1)==1) {
+ notice_lang(s_NickServ, u, NICK_SASET_PASSWORD_CHANGED_TO, nc->display,
+ tmp_pass);
+ } else {
+ notice_lang(s_NickServ, u, NICK_SASET_PASSWORD_CHANGED, nc->display);
+ }
+
+ alog("%s: %s!%s@%s used SASET PASSWORD on %s (e-mail: %s)", s_NickServ,
+ u->nick, u->username, u->host, nc->display,
+ (nc->email ? nc->email : "none"));
+ if (WallSetpass)
+ anope_cmd_global(s_NickServ,
+ "\2%s\2 used SASET PASSWORD on \2%s\2",
+ u->nick, nc->display);
+ return MOD_CONT;
+}
+
+int do_saset_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_SASET_URL_CHANGED, nc->display,
+ param);
+ } else {
+ nc->url = NULL;
+ notice_lang(s_NickServ, u, NICK_SASET_URL_UNSET, nc->display);
+ }
+ return MOD_CONT;
+}
+
+int do_saset_email(User * u, NickCore * nc, char *param)
+{
+ if (!param && NSForceEmail) {
+ notice_lang(s_NickServ, u, NICK_SASET_EMAIL_UNSET_IMPOSSIBLE);
+ return MOD_CONT;
+ } else 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 (param && !MailValidate(param)) {
+ notice_lang(s_NickServ, u, MAIL_X_INVALID, param);
+ return MOD_CONT;
+ }
+
+ alog("%s: %s!%s@%s used SASET EMAIL on %s (e-mail: %s)", s_NickServ,
+ u->nick, u->username, u->host, nc->display,
+ (nc->email ? nc->email : "none"));
+
+ if (nc->email)
+ free(nc->email);
+
+ if (param) {
+ nc->email = sstrdup(param);
+ notice_lang(s_NickServ, u, NICK_SASET_EMAIL_CHANGED, nc->display,
+ param);
+ } else {
+ nc->email = NULL;
+ notice_lang(s_NickServ, u, NICK_SASET_EMAIL_UNSET, nc->display);
+ }
+ return MOD_CONT;
+}
+
+int do_saset_icq(User * u, NickCore * nc, char *param)
+{
+ if (param) {
+ int32 tmp = atol(param);
+ if (tmp == 0) {
+ notice_lang(s_NickServ, u, NICK_SASET_ICQ_INVALID, param);
+ } else {
+ nc->icq = tmp;
+ notice_lang(s_NickServ, u, NICK_SASET_ICQ_CHANGED, nc->display,
+ param);
+ }
+ } else {
+ nc->icq = 0;
+ notice_lang(s_NickServ, u, NICK_SASET_ICQ_UNSET, nc->display);
+ }
+ return MOD_CONT;
+}
+
+int do_saset_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_SASET_GREET_CHANGED, nc->display,
+ buf);
+ } else {
+ nc->greet = NULL;
+ notice_lang(s_NickServ, u, NICK_SASET_GREET_UNSET, nc->display);
+ }
+ return MOD_CONT;
+}
+
+int do_saset_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_SASET_KILL_ON, nc->display);
+ } else if (stricmp(param, "QUICK") == 0) {
+ nc->flags |= NI_KILLPROTECT | NI_KILL_QUICK;
+ nc->flags &= ~NI_KILL_IMMED;
+ notice_lang(s_NickServ, u, NICK_SASET_KILL_QUICK, nc->display);
+ } 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_SASET_KILL_IMMED, nc->display);
+ } else {
+ notice_lang(s_NickServ, u, NICK_SASET_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_SASET_KILL_OFF, nc->display);
+ } else {
+ syntax_error(s_NickServ, u, "SASET KILL",
+ NSAllowKillImmed ? NICK_SASET_KILL_IMMED_SYNTAX :
+ NICK_SASET_KILL_SYNTAX);
+ }
+ return MOD_CONT;
+}
+
+int do_saset_secure(User * u, NickCore * nc, char *param)
+{
+ if (stricmp(param, "ON") == 0) {
+ nc->flags |= NI_SECURE;
+ notice_lang(s_NickServ, u, NICK_SASET_SECURE_ON, nc->display);
+ } else if (stricmp(param, "OFF") == 0) {
+ nc->flags &= ~NI_SECURE;
+ notice_lang(s_NickServ, u, NICK_SASET_SECURE_OFF, nc->display);
+ } else {
+ syntax_error(s_NickServ, u, "SASET SECURE",
+ NICK_SASET_SECURE_SYNTAX);
+ }
+ return MOD_CONT;
+}
+
+int do_saset_private(User * u, NickCore * nc, char *param)
+{
+ if (stricmp(param, "ON") == 0) {
+ nc->flags |= NI_PRIVATE;
+ notice_lang(s_NickServ, u, NICK_SASET_PRIVATE_ON, nc->display);
+ } else if (stricmp(param, "OFF") == 0) {
+ nc->flags &= ~NI_PRIVATE;
+ notice_lang(s_NickServ, u, NICK_SASET_PRIVATE_OFF, nc->display);
+ } else {
+ syntax_error(s_NickServ, u, "SASET PRIVATE",
+ NICK_SASET_PRIVATE_SYNTAX);
+ }
+ return MOD_CONT;
+}
+
+int do_saset_msg(User * u, NickCore * nc, char *param)
+{
+ if (!UsePrivmsg) {
+ notice_lang(s_NickServ, u, NICK_SASET_OPTION_DISABLED, "MSG");
+ return MOD_CONT;
+ }
+
+ if (stricmp(param, "ON") == 0) {
+ nc->flags |= NI_MSG;
+ notice_lang(s_NickServ, u, NICK_SASET_MSG_ON, nc->display);
+ } else if (stricmp(param, "OFF") == 0) {
+ nc->flags &= ~NI_MSG;
+ notice_lang(s_NickServ, u, NICK_SASET_MSG_OFF, nc->display);
+ } else {
+ syntax_error(s_NickServ, u, "SASET MSG", NICK_SASET_MSG_SYNTAX);
+ }
+ return MOD_CONT;
+}
+
+int do_saset_hide(User * u, NickCore * nc, char *param)
+{
+ int flag, onmsg, offmsg;
+
+ if (stricmp(param, "EMAIL") == 0) {
+ flag = NI_HIDE_EMAIL;
+ onmsg = NICK_SASET_HIDE_EMAIL_ON;
+ offmsg = NICK_SASET_HIDE_EMAIL_OFF;
+ } else if (stricmp(param, "USERMASK") == 0) {
+ flag = NI_HIDE_MASK;
+ onmsg = NICK_SASET_HIDE_MASK_ON;
+ offmsg = NICK_SASET_HIDE_MASK_OFF;
+ } else if (stricmp(param, "STATUS") == 0) {
+ flag = NI_HIDE_STATUS;
+ onmsg = NICK_SASET_HIDE_STATUS_ON;
+ offmsg = NICK_SASET_HIDE_STATUS_OFF;
+ } else if (stricmp(param, "QUIT") == 0) {
+ flag = NI_HIDE_QUIT;
+ onmsg = NICK_SASET_HIDE_QUIT_ON;
+ offmsg = NICK_SASET_HIDE_QUIT_OFF;
+ } else {
+ syntax_error(s_NickServ, u, "SASET HIDE", NICK_SASET_HIDE_SYNTAX);
+ return MOD_CONT;
+ }
+
+ param = strtok(NULL, " ");
+ if (!param) {
+ syntax_error(s_NickServ, u, "SASET HIDE", NICK_SASET_HIDE_SYNTAX);
+ } else if (stricmp(param, "ON") == 0) {
+ nc->flags |= flag;
+ notice_lang(s_NickServ, u, onmsg, nc->display, s_NickServ);
+ } else if (stricmp(param, "OFF") == 0) {
+ nc->flags &= ~flag;
+ notice_lang(s_NickServ, u, offmsg, nc->display, s_NickServ);
+ } else {
+ syntax_error(s_NickServ, u, "SASET HIDE", NICK_SASET_HIDE_SYNTAX);
+ }
+ return MOD_CONT;
+}
+
+int do_saset_noexpire(User * u, NickAlias * na, char *param)
+{
+ if (!param) {
+ syntax_error(s_NickServ, u, "SASET NOEXPIRE",
+ NICK_SASET_NOEXPIRE_SYNTAX);
+ return MOD_CONT;
+ }
+ if (stricmp(param, "ON") == 0) {
+ na->status |= NS_NO_EXPIRE;
+ notice_lang(s_NickServ, u, NICK_SASET_NOEXPIRE_ON, na->nick);
+ } else if (stricmp(param, "OFF") == 0) {
+ na->status &= ~NS_NO_EXPIRE;
+ notice_lang(s_NickServ, u, NICK_SASET_NOEXPIRE_OFF, na->nick);
+ } else {
+ syntax_error(s_NickServ, u, "SASET NOEXPIRE",
+ NICK_SASET_NOEXPIRE_SYNTAX);
+ }
+ return MOD_CONT;
+}
+
+int do_saset_autoop(User * u, NickCore * nc, char *param)
+{
+ if (stricmp(param, "ON") == 0) {
+ nc->flags &= ~NI_AUTOOP;
+ notice_lang(s_NickServ, u, NICK_SASET_AUTOOP_ON, nc->display);
+ } else if (stricmp(param, "OFF") == 0) {
+ nc->flags |= NI_AUTOOP;
+ notice_lang(s_NickServ, u, NICK_SASET_AUTOOP_OFF, nc->display);
+ } else {
+ syntax_error(s_NickServ, u, "SET AUTOOP", NICK_SASET_AUTOOP_SYNTAX);
+ }
+
+ return MOD_CONT;
+}
+
+int do_saset_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, "SASET LANGUAGE",
+ NICK_SASET_LANGUAGE_SYNTAX);
+ return MOD_CONT;
+ }
+ langnum = atoi(param) - 1;
+ if (langnum < 0 || langnum >= NUM_LANGS || langlist[langnum] < 0) {
+ notice_lang(s_NickServ, u, NICK_SASET_LANGUAGE_UNKNOWN, langnum + 1,
+ s_NickServ);
+ return MOD_CONT;
+ }
+ nc->language = langlist[langnum];
+ notice_lang(s_NickServ, u, NICK_SASET_LANGUAGE_CHANGED);
+
+ return MOD_CONT;
+}
+
+/* EOF */
diff --git a/src/core/ns_sendpass.c b/src/core/ns_sendpass.c
new file mode 100644
index 000000000..ce1834167
--- /dev/null
+++ b/src/core/ns_sendpass.c
@@ -0,0 +1,122 @@
+/* NickServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_sendpass(User * u);
+
+void myNickServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("SENDPASS", do_sendpass, NULL, NICK_HELP_SENDPASS,
+ -1, -1, -1, -1);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+
+ moduleSetNickHelp(myNickServHelp);
+ if (!UseMail) {
+ return MOD_STOP;
+ }
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+/**
+ * Add the help response to anopes /ns help output.
+ * @param u The user who is requesting help
+ **/
+void myNickServHelp(User * u)
+{
+ notice_lang(s_NickServ, u, NICK_HELP_CMD_SENDPASS);
+}
+
+/**
+ * The /ns sendpass command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+int do_sendpass(User * u)
+{
+
+ char *nick = strtok(NULL, " ");
+ NickAlias *na;
+
+ if (!nick) {
+ syntax_error(s_NickServ, u, "SENDPASS", NICK_SENDPASS_SYNTAX);
+ } else if (RestrictMail && !is_services_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];
+ char tmp_pass[PASSMAX];
+ if(enc_decrypt(na->nc->pass,tmp_pass,PASSMAX - 1)==1) {
+ 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),
+ tmp_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, u->host, nick);
+ notice_lang(s_NickServ, u, NICK_SENDPASS_OK, nick);
+ } else {
+ notice_lang(s_NickServ, u, NICK_SENDPASS_UNAVAILABLE);
+ }
+ }
+
+ return MOD_CONT;
+}
diff --git a/src/core/ns_set.c b/src/core/ns_set.c
new file mode 100644
index 000000000..09f78560d
--- /dev/null
+++ b/src/core/ns_set.c
@@ -0,0 +1,475 @@
+/* NickServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+#include "encrypt.h"
+
+int do_set(User * u);
+int do_set_display(User * u, NickCore * nc, char *param);
+int do_set_password(User * u, NickCore * nc, char *param);
+int do_set_language(User * u, NickCore * nc, char *param);
+int do_set_url(User * u, NickCore * nc, char *param);
+int do_set_email(User * u, NickCore * nc, char *param);
+int do_set_greet(User * u, NickCore * nc, char *param);
+int do_set_icq(User * u, NickCore * nc, char *param);
+int do_set_kill(User * u, NickCore * nc, char *param);
+int do_set_secure(User * u, NickCore * nc, char *param);
+int do_set_private(User * u, NickCore * nc, char *param);
+int do_set_msg(User * u, NickCore * nc, char *param);
+int do_set_hide(User * u, NickCore * nc, char *param);
+int do_set_autoop(User *u, NickCore *nc, char *param);
+void myNickServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("SET", do_set, NULL, NICK_HELP_SET, -1, -1, -1, -1);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+ c = createCommand("SET DISPLAY", NULL, NULL, NICK_HELP_SET_DISPLAY, -1,
+ -1, -1, -1);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+ c = createCommand("SET PASSWORD", NULL, NULL, NICK_HELP_SET_PASSWORD,
+ -1, -1, -1, -1);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+ c = createCommand("SET URL", NULL, NULL, NICK_HELP_SET_URL, -1, -1, -1,
+ -1);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+ c = createCommand("SET EMAIL", NULL, NULL, NICK_HELP_SET_EMAIL, -1, -1,
+ -1, -1);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+ c = createCommand("SET ICQ", NULL, NULL, NICK_HELP_SET_ICQ, -1, -1, -1,
+ -1);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+ c = createCommand("SET GREET", NULL, NULL, NICK_HELP_SET_GREET, -1, -1,
+ -1, -1);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+ c = createCommand("SET KILL", NULL, NULL, NICK_HELP_SET_KILL, -1, -1,
+ -1, -1);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+ c = createCommand("SET SECURE", NULL, NULL, NICK_HELP_SET_SECURE, -1,
+ -1, -1, -1);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+ c = createCommand("SET PRIVATE", NULL, NULL, NICK_HELP_SET_PRIVATE, -1,
+ -1, -1, -1);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+ c = createCommand("SET MSG", NULL, NULL, NICK_HELP_SET_MSG, -1, -1, -1,
+ -1);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+ c = createCommand("SET HIDE", NULL, NULL, NICK_HELP_SET_HIDE, -1, -1,
+ -1, -1);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+ c = createCommand("SET AUTOOP", NULL, NULL, NICK_HELP_SET_AUTOOP, -1, -1,
+ -1, -1);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+
+ moduleSetNickHelp(myNickServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to anopes /ns help output.
+ * @param u The user who is requesting help
+ **/
+void myNickServHelp(User * u)
+{
+ notice_lang(s_NickServ, u, NICK_HELP_CMD_SET);
+}
+
+/**
+ * The /ns set command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+int do_set(User * u)
+{
+ char *cmd = strtok(NULL, " ");
+ char *param = strtok(NULL, " ");
+ NickAlias *na = u->na;
+
+ if (readonly) {
+ notice_lang(s_NickServ, u, NICK_SET_DISABLED);
+ return MOD_CONT;
+ }
+
+ if (!param
+ && (!cmd
+ || (stricmp(cmd, "URL") != 0 && stricmp(cmd, "EMAIL") != 0
+ && stricmp(cmd, "GREET") != 0
+ && stricmp(cmd, "ICQ") != 0))) {
+ 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 (na->nc->flags & NI_SUSPENDED) {
+ notice_lang(s_NickServ, u, NICK_X_SUSPENDED, na->nick);
+ } else if (!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, "AUTOOP") == 0) {
+ do_set_autoop(u, na->nc, param);
+ } else {
+ notice_lang(s_NickServ, u, NICK_SET_UNKNOWN_OPTION, cmd);
+ }
+ return MOD_CONT;
+}
+
+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);
+
+ /* Enable nick tracking if enabled */
+ if (NSNickTracking)
+ nsStartNickTracking(u);
+
+ return MOD_CONT;
+}
+
+int do_set_password(User * u, NickCore * nc, char *param)
+{
+ int len = strlen(param);
+ char tmp_pass[PASSMAX];
+
+ if (stricmp(nc->display, param) == 0 || (StrictPasswords && len < 5)) {
+ notice_lang(s_NickServ, u, MORE_OBSCURE_PASSWORD);
+ return MOD_CONT;
+ } else if (enc_encrypt_check_len(len ,PASSMAX - 1)) {
+ notice_lang(s_NickServ, u, PASSWORD_TOO_LONG);
+ return MOD_CONT;
+ }
+
+ if (enc_encrypt(param, len, nc->pass, PASSMAX - 1) < 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);
+
+ if(enc_decrypt(nc->pass,tmp_pass,PASSMAX - 1)==1) {
+ notice_lang(s_NickServ, u, NICK_SET_PASSWORD_CHANGED_TO, tmp_pass);
+ } else {
+ notice_lang(s_NickServ, u, NICK_SET_PASSWORD_CHANGED);
+ }
+
+ alog("%s: %s!%s@%s (e-mail: %s) changed its password.", s_NickServ,
+ u->nick, u->username, u->host, (nc->email ? nc->email : "none"));
+
+ return MOD_CONT;
+}
+
+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;
+}
+
+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;
+}
+
+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, u->host,
+ (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;
+}
+
+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;
+}
+
+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;
+}
+
+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;
+}
+
+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;
+}
+
+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;
+}
+
+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;
+}
+
+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, "STATUS") == 0) {
+ flag = NI_HIDE_STATUS;
+ onmsg = NICK_SET_HIDE_STATUS_ON;
+ offmsg = NICK_SET_HIDE_STATUS_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;
+}
+
+int do_set_autoop(User *u, NickCore *nc, char *param) {
+
+ /**
+ * This works the other way around, the absence of this flag denotes ON
+ * This is so when people upgrade, and dont have the flag
+ * the default is on
+ **/
+ if (stricmp(param, "ON") == 0) {
+ nc->flags &= ~NI_AUTOOP;
+ notice_lang(s_NickServ, u, NICK_SET_AUTOOP_ON);
+ } else if (stricmp(param, "OFF") == 0) {
+ nc->flags |= NI_AUTOOP;
+ notice_lang(s_NickServ, u, NICK_SET_AUTOOP_OFF);
+ } else {
+ syntax_error(s_NickServ, u, "SET AUTOOP", NICK_SET_AUTOOP_SYNTAX);
+ }
+
+ return MOD_CONT;
+}
+
+
+/* EOF */
diff --git a/src/core/ns_status.c b/src/core/ns_status.c
new file mode 100644
index 000000000..86963b4a3
--- /dev/null
+++ b/src/core/ns_status.c
@@ -0,0 +1,94 @@
+/* NickServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_status(User * u);
+void myNickServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("STATUS", do_status, NULL, NICK_HELP_STATUS, -1, -1,
+ -1, -1);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+
+ moduleSetNickHelp(myNickServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+/**
+ * Add the help response to anopes /ns help output.
+ * @param u The user who is requesting help
+ **/
+void myNickServHelp(User * u)
+{
+ notice_lang(s_NickServ, u, NICK_HELP_CMD_STATUS);
+}
+
+/**
+ * The /ns status command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+int do_status(User * u)
+{
+ User *u2;
+ NickAlias *na = NULL;
+ int i = 0;
+ char *nick = strtok(NULL, " ");
+
+ /* If no nickname is given, we assume that the user
+ * is asking for himself */
+ if (!nick)
+ nick = u->nick;
+
+ while (nick && (i++ < 16)) {
+ if (!(u2 = finduser(nick))) /* Nick is not online */
+ notice_lang(s_NickServ, u, NICK_STATUS_0, nick);
+ else if (nick_identified(u2)) /* Nick is identified */
+ notice_lang(s_NickServ, u, NICK_STATUS_3, nick);
+ else if (nick_recognized(u2)) /* Nick is recognised, but NOT identified */
+ notice_lang(s_NickServ, u, NICK_STATUS_2, nick);
+ else if ((na = findnick(nick)) == NULL) /* Nick is online, but NOT a registered */
+ notice_lang(s_NickServ, u, NICK_STATUS_0, nick);
+ else
+ notice_lang(s_NickServ, u, NICK_STATUS_1, nick);
+
+ /* Get the next nickname */
+ nick = strtok(NULL, " ");
+ }
+ return MOD_CONT;
+}
diff --git a/src/core/ns_suspend.c b/src/core/ns_suspend.c
new file mode 100644
index 000000000..a2961e060
--- /dev/null
+++ b/src/core/ns_suspend.c
@@ -0,0 +1,193 @@
+/* NickServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_suspend(User * u);
+int do_unsuspend(User * u);
+void myNickServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("SUSPEND", do_suspend, is_services_oper, -1, -1, -1,
+ NICK_SERVADMIN_HELP_SUSPEND,
+ NICK_SERVADMIN_HELP_SUSPEND);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+ c = createCommand("UNSUSPEND", do_unsuspend, is_services_oper, -1, -1,
+ -1, NICK_SERVADMIN_HELP_UNSUSPEND,
+ NICK_SERVADMIN_HELP_UNSUSPEND);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+
+ moduleSetNickHelp(myNickServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+/**
+ * Add the help response to anopes /ns help output.
+ * @param u The user who is requesting help
+ **/
+void myNickServHelp(User * u)
+{
+ if (is_services_oper(u)) {
+ notice_lang(s_NickServ, u, NICK_HELP_CMD_SUSPEND);
+ notice_lang(s_NickServ, u, NICK_HELP_CMD_UNSUSPEND);
+ }
+}
+
+/**
+ * The /ns suspend command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+int do_suspend(User * u)
+{
+ NickAlias *na, *na2;
+ char *nick = strtok(NULL, " ");
+ char *reason = strtok(NULL, "");
+ int i;
+
+ if (!nick || !reason) {
+ syntax_error(s_NickServ, u, "SUSPEND", NICK_SUSPEND_SYNTAX);
+ return MOD_CONT;
+ }
+
+ if (readonly) {
+ notice_lang(s_NickServ, u, READ_ONLY_MODE);
+ return MOD_CONT;
+ }
+
+ if ((na = findnick(nick)) == NULL) {
+ notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, nick);
+ return MOD_CONT;
+ }
+
+ if (na->status & NS_VERBOTEN) {
+ notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, na->nick);
+ return MOD_CONT;
+ }
+
+ if (NSSecureAdmins && nick_is_services_admin(na->nc)
+ && !is_services_root(u)) {
+ notice_lang(s_NickServ, u, PERMISSION_DENIED);
+ return MOD_CONT;
+ }
+
+ if (na) {
+ na->nc->flags |= NI_SUSPENDED;
+ na->nc->flags |= NI_SECURE;
+ na->nc->flags &= ~(NI_KILLPROTECT | NI_KILL_QUICK | NI_KILL_IMMED);
+
+ for (i = 0; i < na->nc->aliases.count; i++) {
+ na2 = na->nc->aliases.list[i];
+ if (na2->nc == na->nc) {
+ na2->status &= ~(NS_IDENTIFIED | NS_RECOGNIZED);
+ na2->last_quit = sstrdup(reason);
+ }
+ }
+
+ if (WallForbid)
+ anope_cmd_global(s_NickServ, "\2%s\2 used SUSPEND on \2%s\2",
+ u->nick, nick);
+
+ alog("%s: %s set SUSPEND for nick %s", s_NickServ, u->nick, nick);
+ notice_lang(s_NickServ, u, NICK_SUSPEND_SUCCEEDED, nick);
+ send_event(EVENT_NICK_SUSPENDED, 1, nick);
+
+ } else {
+
+ alog("%s: Valid SUSPEND for %s by %s failed", s_NickServ, nick,
+ u->nick);
+ notice_lang(s_NickServ, u, NICK_SUSPEND_FAILED, nick);
+
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+int do_unsuspend(User * u)
+{
+ NickAlias *na;
+ char *nick = strtok(NULL, " ");
+
+ if (!nick) {
+ syntax_error(s_NickServ, u, "UNSUSPEND", NICK_UNSUSPEND_SYNTAX);
+ return MOD_CONT;
+ }
+
+ if (readonly) {
+ notice_lang(s_NickServ, u, READ_ONLY_MODE);
+ return MOD_CONT;
+ }
+
+ if ((na = findnick(nick)) == NULL) {
+ notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, nick);
+ return MOD_CONT;
+ }
+
+ if (na->status & NS_VERBOTEN) {
+ notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, na->nick);
+ return MOD_CONT;
+ }
+ if (NSSecureAdmins && nick_is_services_admin(na->nc)
+ && !is_services_root(u)) {
+ notice_lang(s_NickServ, u, PERMISSION_DENIED);
+ return MOD_CONT;
+ }
+
+ if (na) {
+ na->nc->flags &= ~NI_SUSPENDED;
+
+ if (WallForbid)
+ anope_cmd_global(s_NickServ, "\2%s\2 used UNSUSPEND on \2%s\2",
+ u->nick, nick);
+
+ alog("%s: %s set UNSUSPEND for nick %s", s_NickServ, u->nick,
+ nick);
+ notice_lang(s_NickServ, u, NICK_UNSUSPEND_SUCCEEDED, nick);
+ send_event(EVENT_NICK_UNSUSPEND, 1, nick);
+
+ } else {
+
+ alog("%s: Valid UNSUSPEND for %s by %s failed", s_NickServ, nick,
+ u->nick);
+ notice_lang(s_NickServ, u, NICK_UNSUSPEND_FAILED, nick);
+
+ }
+
+ return MOD_CONT;
+
+}
diff --git a/src/core/ns_update.c b/src/core/ns_update.c
new file mode 100644
index 000000000..140b2ed7f
--- /dev/null
+++ b/src/core/ns_update.c
@@ -0,0 +1,90 @@
+/* NickServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_nickupdate(User * u);
+void myNickServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("UPDATE", do_nickupdate, NULL, NICK_HELP_UPDATE, -1,
+ -1, -1, -1);
+ moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
+
+ moduleSetNickHelp(myNickServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to anopes /ns help output.
+ * @param u The user who is requesting help
+ **/
+void myNickServHelp(User * u)
+{
+ notice_lang(s_NickServ, u, NICK_HELP_CMD_UPDATE);
+}
+
+/**
+ * The /ns update command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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);
+ if (ircd->vhost) {
+ do_on_id(u);
+ }
+ notice_lang(s_NickServ, u, NICK_UPDATE_SUCCESS, s_NickServ);
+ }
+ return MOD_CONT;
+}
diff --git a/src/core/os_admin.c b/src/core/os_admin.c
new file mode 100644
index 000000000..4df67ccd7
--- /dev/null
+++ b/src/core/os_admin.c
@@ -0,0 +1,249 @@
+/* OperServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_admin(User * u);
+int admin_list_callback(SList * slist, int number, void *item,
+ va_list args);
+int admin_list(int number, NickCore * nc, User * u, int *sent_header);
+void myOperServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("ADMIN", do_admin, NULL, OPER_HELP_ADMIN, -1, -1,
+ -1, -1);
+ c->help_param1 = s_NickServ;
+ moduleAddCommand(OPERSERV, c, MOD_UNIQUE);
+
+ moduleSetOperHelp(myOperServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to anopes /os help output.
+ * @param u The user who is requesting help
+ **/
+void myOperServHelp(User * u)
+{
+ notice_lang(s_OperServ, u, OPER_HELP_CMD_ADMIN);
+}
+
+/**
+ * The /os admin command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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 {
+ if (na->nc->flags & NI_SERVICES_OPER
+ && (res = slist_indexof(&servopers, na->nc)) != -1) {
+ slist_delete(&servopers, res);
+ na->nc->flags |= NI_SERVICES_ADMIN;
+ notice_lang(s_OperServ, u, OPER_ADMIN_MOVED, nick);
+ } 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;
+}
+
+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);
+}
+
+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;
+}
diff --git a/src/core/os_akill.c b/src/core/os_akill.c
new file mode 100644
index 000000000..8233eec93
--- /dev/null
+++ b/src/core/os_akill.c
@@ -0,0 +1,386 @@
+/* OperServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_akill(User * u);
+int akill_view_callback(SList * slist, int number, void *item,
+ va_list args);
+int akill_view(int number, Akill * ak, User * u, int *sent_header);
+int akill_list_callback(SList * slist, int number, void *item,
+ va_list args);
+int akill_list(int number, Akill * ak, User * u, int *sent_header);
+void myOperServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion
+ ("$Id$");
+ moduleSetType(CORE);
+ c = createCommand("AKILL", do_akill, is_services_oper, OPER_HELP_AKILL,
+ -1, -1, -1, -1);
+ moduleAddCommand(OPERSERV, c, MOD_UNIQUE);
+
+ moduleSetOperHelp(myOperServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to anopes /os help output.
+ * @param u The user who is requesting help
+ **/
+void myOperServHelp(User * u)
+{
+ if (is_services_oper(u)) {
+ notice_lang(s_OperServ, u, OPER_HELP_CMD_AKILL);
+ }
+}
+
+/**
+ * The /os command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+/* Manage the AKILL list. */
+
+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) {
+ if (AddAkiller) {
+ free(reason);
+ }
+ 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");
+ }
+
+ anope_cmd_global(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);
+ }
+ if (AddAkiller) {
+ free(reason);
+ }
+ } 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;
+}
+
+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;
+}
+
+/* Lists an AKILL entry, prefixing it with the header if needed */
+
+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);
+}
+
+/* Callback for enumeration purposes */
+
+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);
+}
+
+/* Lists an AKILL entry, prefixing it with the header if needed */
+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;
+}
diff --git a/src/core/os_chankill.c b/src/core/os_chankill.c
new file mode 100644
index 000000000..805c7d57f
--- /dev/null
+++ b/src/core/os_chankill.c
@@ -0,0 +1,134 @@
+/* OperServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_chankill(User * u);
+void myOperServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion
+ ("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("CHANKILL", do_chankill, is_services_admin,
+ OPER_HELP_CHANKILL, -1, -1, -1, -1);
+ moduleAddCommand(OPERSERV, c, MOD_UNIQUE);
+
+ moduleSetOperHelp(myOperServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * Add the help response to anopes /os help output.
+ * @param u The user who is requesting help
+ **/
+void myOperServHelp(User * u)
+{
+ if (is_services_admin(u)) {
+ notice_lang(s_OperServ, u, OPER_HELP_CMD_CHANKILL);
+ }
+}
+
+/**
+ * ChanKill - Akill an entire channel (got botnet?)
+ *
+ * /msg OperServ ChanKill +expire #channel reason
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ *
+ **/
+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;
+ }
+ (void) 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) {
+ anope_cmd_global(s_OperServ, "%s used CHANKILL on %s (%s)",
+ u->nick, channel, reason);
+ }
+ } else {
+ notice_lang(s_OperServ, u, CHAN_X_NOT_IN_USE, channel);
+ }
+ if (AddAkiller) {
+ free(reason);
+ }
+ } else {
+ syntax_error(s_OperServ, u, "CHANKILL", OPER_CHANKILL_SYNTAX);
+ }
+ return MOD_CONT;
+}
diff --git a/src/core/os_chanlist.c b/src/core/os_chanlist.c
new file mode 100644
index 000000000..96285b827
--- /dev/null
+++ b/src/core/os_chanlist.c
@@ -0,0 +1,116 @@
+/* OperServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_chanlist(User * u);
+void myOperServHelp(User * u);
+#ifdef _WIN32
+extern MDE int anope_get_private_mode();
+#endif
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("CHANLIST", do_chanlist, is_services_oper,
+ OPER_HELP_CHANLIST, -1, -1, -1, -1);
+ moduleAddCommand(OPERSERV, c, MOD_UNIQUE);
+
+ moduleSetOperHelp(myOperServHelp);
+
+ return MOD_CONT;
+}
+
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+/**
+ * Add the help response to anopes /os help output.
+ * @param u The user who is requesting help
+ **/
+void myOperServHelp(User * u)
+{
+ notice_lang(s_OperServ, u, OPER_HELP_CMD_CHANLIST);
+}
+
+/**
+ * The /os chanlist command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+int do_chanlist(User * u)
+{
+ char *pattern = strtok(NULL, " ");
+ char *opt = strtok(NULL, " ");
+
+ int modes = 0;
+ User *u2;
+
+ if (opt && !stricmp(opt, "SECRET"))
+ modes |= (anope_get_secret_mode() | anope_get_private_mode());
+
+ 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;
+}
diff --git a/src/core/os_clearmodes.c b/src/core/os_clearmodes.c
new file mode 100644
index 000000000..d6a896166
--- /dev/null
+++ b/src/core/os_clearmodes.c
@@ -0,0 +1,328 @@
+/* OperServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_clearmodes(User * u);
+void myOperServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion
+ ("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("CLEARMODES", do_clearmodes, is_services_oper,
+ OPER_HELP_CLEARMODES, -1, -1, -1, -1);
+ moduleAddCommand(OPERSERV, c, MOD_UNIQUE);
+
+ moduleSetOperHelp(myOperServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+/**
+ * Add the help response to anopes /os help output.
+ * @param u The user who is requesting help
+ **/
+void myOperServHelp(User * u)
+{
+ if (is_services_oper(u)) {
+ notice_lang(s_OperServ, u, OPER_HELP_CMD_CLEARMODES);
+ }
+}
+
+/**
+ * The /os clearmodes command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+int do_clearmodes(User * u)
+{
+ char *s;
+ char *argv[2];
+ char *chan = strtok(NULL, " ");
+ Channel *c;
+ int all = 0;
+ struct c_userlist *cu, *next;
+ Entry *entry, *nexte;
+
+ if (!chan) {
+ syntax_error(s_OperServ, u, "CLEARMODES", OPER_CLEARMODES_SYNTAX);
+ return MOD_CONT;
+ } else if (!(c = findchan(chan))) {
+ notice_lang(s_OperServ, u, CHAN_X_NOT_IN_USE, chan);
+ return MOD_CONT;
+ } 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) {
+ anope_cmd_global(s_OperServ, "%s used CLEARMODES%s on %s",
+ u->nick, all ? " ALL" : "", chan);
+ }
+ if (all) {
+ /* Clear mode +o */
+ if (ircd->svsmode_ucmode) {
+ anope_cmd_svsmode_chan(c->name, "-o", NULL);
+ 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;
+ chan_set_modes(s_OperServ, c, 2, argv, 0);
+ free(argv[0]);
+ }
+ } else {
+ 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;
+ anope_cmd_mode(s_OperServ, c->name, "-o %s",
+ cu->user->nick);
+ chan_set_modes(s_OperServ, c, 2, argv, 0);
+ free(argv[0]);
+ }
+ }
+
+ if (ircd->svsmode_ucmode) {
+ anope_cmd_svsmode_chan(c->name, "-v", NULL);
+ 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] = cu->user->nick;
+ chan_set_modes(s_OperServ, c, 2, argv, 0);
+ free(argv[0]);
+ }
+ } else {
+ /* 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] = cu->user->nick;
+ anope_cmd_mode(s_OperServ, c->name, "-v %s",
+ cu->user->nick);
+ chan_set_modes(s_OperServ, c, 2, argv, 0);
+ free(argv[0]);
+ }
+ }
+
+ /* Clear mode +h */
+ if (ircd->svsmode_ucmode && ircd->halfop) {
+ anope_cmd_svsmode_chan(c->name, "-h", NULL);
+ 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] = cu->user->nick;
+ chan_set_modes(s_OperServ, c, 2, argv, 0);
+ free(argv[0]);
+ }
+ } else {
+ 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] = cu->user->nick;
+ anope_cmd_mode(s_OperServ, c->name, "-h %s",
+ cu->user->nick);
+ chan_set_modes(s_OperServ, c, 2, argv, 0);
+ free(argv[0]);
+ }
+ }
+ /* Clear mode Owners */
+ if (ircd->svsmode_ucmode && ircd->owner) {
+ anope_cmd_svsmode_chan(c->name, ircd->ownerunset, NULL);
+ for (cu = c->users; cu; cu = next) {
+ next = cu->next;
+ if (!chan_has_user_status(c, cu->user, CUS_HALFOP)) {
+ continue;
+ }
+ argv[0] = sstrdup(ircd->ownerunset);
+ argv[1] = cu->user->nick;
+ chan_set_modes(s_OperServ, c, 2, argv, 0);
+ free(argv[0]);
+ }
+ } else {
+ for (cu = c->users; cu; cu = next) {
+ next = cu->next;
+ if (!chan_has_user_status(c, cu->user, CUS_OWNER))
+ continue;
+ argv[0] = sstrdup(ircd->ownerunset);
+ argv[1] = cu->user->nick;
+ anope_cmd_mode(s_OperServ, c->name, "%s %s",
+ ircd->ownerunset, cu->user->nick);
+ chan_set_modes(s_OperServ, c, 2, argv, 0);
+ free(argv[0]);
+ }
+ }
+ /* Clear mode protected or admins */
+ if (ircd->svsmode_ucmode && (ircd->protect || ircd->admin)) {
+
+ anope_cmd_svsmode_chan(c->name, ircd->adminunset, NULL);
+ for (cu = c->users; cu; cu = next) {
+ next = cu->next;
+ if (!chan_has_user_status(c, cu->user, CUS_HALFOP)) {
+ continue;
+ }
+ argv[0] = sstrdup(ircd->adminunset);
+ argv[1] = cu->user->nick;
+ chan_set_modes(s_OperServ, c, 2, argv, 0);
+ free(argv[0]);
+ }
+ } else {
+ for (cu = c->users; cu; cu = next) {
+ next = cu->next;
+ if (!chan_has_user_status(c, cu->user, CUS_PROTECT))
+ continue;
+ argv[0] = sstrdup(ircd->adminunset);
+ argv[1] = cu->user->nick;
+ anope_cmd_mode(s_OperServ, c->name, "%s %s",
+ ircd->adminunset, cu->user->nick);
+ chan_set_modes(s_OperServ, c, 2, argv, 0);
+ free(argv[0]);
+ }
+ }
+
+
+ }
+
+ if (c->mode) {
+ /* Clear modes the bulk of the modes */
+ anope_cmd_mode(s_OperServ, c->name, "%s", ircd->modestoremove);
+ argv[0] = sstrdup(ircd->modestoremove);
+ chan_set_modes(s_OperServ, c, 1, argv, 0);
+ free(argv[0]);
+
+ /* to prevent the internals from complaining send -k, -L, -f by themselves if we need
+ to send them - TSL */
+ if (c->key) {
+ anope_cmd_mode(s_OperServ, c->name, "-k %s", c->key);
+ argv[0] = sstrdup("-k");
+ argv[1] = c->key;
+ chan_set_modes(s_OperServ, c, 2, argv, 0);
+ free(argv[0]);
+ }
+ if (ircd->Lmode && c->redirect) {
+ anope_cmd_mode(s_OperServ, c->name, "-L %s", c->redirect);
+ argv[0] = sstrdup("-L");
+ argv[1] = c->redirect;
+ chan_set_modes(s_OperServ, c, 2, argv, 0);
+ free(argv[0]);
+ }
+ if (ircd->fmode && c->flood) {
+ if (flood_mode_char_remove) {
+ anope_cmd_mode(s_OperServ, c->name, "%s %s",
+ flood_mode_char_remove, c->flood);
+ argv[0] = sstrdup(flood_mode_char_remove);
+ argv[1] = c->flood;
+ chan_set_modes(s_OperServ, c, 2, argv, 0);
+ free(argv[0]);
+ } else {
+ if (debug) {
+ alog("debug: flood_mode_char_remove was not set unable to remove flood/throttle modes");
+ }
+ }
+ }
+ }
+
+ /* Clear bans */
+ if (c->bans && c->bans->count) {
+ for (entry = c->bans->entries; entry; entry = nexte) {
+ nexte = entry->next;
+ argv[0] = sstrdup("-b");
+ argv[1] = sstrdup(entry->mask);
+ anope_cmd_mode(s_OperServ, c->name, "-b %s", entry->mask);
+ chan_set_modes(s_OperServ, c, 2, argv, 0);
+ free(argv[0]);
+ free(argv[1]);
+ }
+ }
+
+ /* Clear excepts */
+ if (ircd->except && c->excepts && c->excepts->count) {
+ for (entry = c->excepts->entries; entry; entry = nexte) {
+ nexte = entry->next;
+ argv[0] = sstrdup("-e");
+ argv[1] = sstrdup(entry->mask);
+ anope_cmd_mode(s_OperServ, c->name, "-e %s", entry->mask);
+ chan_set_modes(s_OperServ, c, 2, argv, 0);
+ free(argv[0]);
+ free(argv[1]);
+ }
+ }
+
+ /* Clear invites */
+ if (ircd->invitemode && c->invites && c->invites->count) {
+ for (entry = c->invites->entries; entry; entry = nexte) {
+ nexte = entry->next;
+ argv[0] = sstrdup("-I");
+ argv[1] = sstrdup(entry->mask);
+ anope_cmd_mode(s_OperServ, c->name, "-I %s", entry->mask);
+ chan_set_modes(s_OperServ, c, 2, argv, 0);
+ free(argv[0]);
+ free(argv[1]);
+ }
+ }
+ }
+
+ if (all) {
+ notice_lang(s_OperServ, u, OPER_CLEARMODES_ALL_DONE, chan);
+ } else {
+ notice_lang(s_OperServ, u, OPER_CLEARMODES_DONE, chan);
+ }
+ return MOD_CONT;
+}
diff --git a/src/core/os_defcon.c b/src/core/os_defcon.c
new file mode 100644
index 000000000..1f926e720
--- /dev/null
+++ b/src/core/os_defcon.c
@@ -0,0 +1,169 @@
+/* OperServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+#ifdef _WIN32
+extern MDE time_t DefContimer;
+extern MDE void runDefCon(void);
+#endif
+int do_defcon(User * u);
+void defcon_sendlvls(User * u);
+
+void myOperServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("DEFCON", do_defcon, is_services_admin,
+ OPER_HELP_DEFCON, -1, -1, -1, -1);
+ moduleAddCommand(OPERSERV, c, MOD_UNIQUE);
+
+ moduleSetOperHelp(myOperServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+/**
+ * Add the help response to anopes /os help output.
+ * @param u The user who is requesting help
+ **/
+void myOperServHelp(User * u)
+{
+ if (is_services_admin(u)) {
+ notice_lang(s_OperServ, u, OPER_HELP_CMD_DEFCON);
+ }
+}
+
+/**
+ * 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]
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ *
+ **/
+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;
+ send_event(EVENT_DEFCON_LEVEL, 1, lvl);
+ 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);
+ anope_cmd_global(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, "%s", DefConOffMessage);
+ } else {
+ oper_global(NULL, langglobal, DefConLevel);
+ }
+ }
+ if (GlobalOnDefconMore) {
+ if ((DefConOffMessage) && DefConLevel == 5) {
+ } else {
+ oper_global(NULL, "%s", DefconMessage);
+ }
+ }
+ /* Run any defcon functions, e.g. FORCE CHAN MODE */
+ runDefCon();
+ return MOD_CONT;
+}
+
+
+
+/**
+ * Send a message to the oper about which precautions are "active" for this level
+ **/
+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);
+ }
+}
diff --git a/src/core/os_global.c b/src/core/os_global.c
new file mode 100644
index 000000000..ccbabebb9
--- /dev/null
+++ b/src/core/os_global.c
@@ -0,0 +1,82 @@
+/* OperServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_global(User * u);
+void myOperServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("GLOBAL", do_global, is_services_admin,
+ OPER_HELP_GLOBAL, -1, -1, -1, -1);
+ c->help_param1 = s_GlobalNoticer;
+ moduleAddCommand(OPERSERV, c, MOD_UNIQUE);
+ moduleSetOperHelp(myOperServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+/**
+ * Add the help response to anopes /os help output.
+ * @param u The user who is requesting help
+ **/
+void myOperServHelp(User * u)
+{
+ if (is_services_admin(u)) {
+ notice_lang(s_OperServ, u, OPER_HELP_CMD_GLOBAL);
+ }
+}
+
+/**
+ * The /os global command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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)
+ anope_cmd_global(s_OperServ, "\2%s\2 just used GLOBAL command.",
+ u->nick);
+ oper_global(u->nick, "%s", msg);
+ return MOD_CONT;
+}
diff --git a/src/core/os_help.c b/src/core/os_help.c
new file mode 100644
index 000000000..822d1dcd0
--- /dev/null
+++ b/src/core/os_help.c
@@ -0,0 +1,66 @@
+/* OperServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_help(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+ c = createCommand("HELP", do_help, NULL, -1, -1, -1, -1, -1);
+ moduleAddCommand(OPERSERV, c, MOD_UNIQUE);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+
+/**
+ * The /os help command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+int do_help(User * u)
+{
+ const char *cmd = strtok(NULL, "");
+
+ if (!cmd) {
+ notice_help(s_OperServ, u, OPER_HELP);
+ moduleDisplayHelp(5, u);
+ notice_help(s_OperServ, u, OPER_HELP_LOGGED);
+ } else {
+ mod_help_cmd(s_OperServ, u, OPERSERV, cmd);
+ }
+ return MOD_CONT;
+}
diff --git a/src/core/os_ignore.c b/src/core/os_ignore.c
new file mode 100644
index 000000000..a5fb07d1c
--- /dev/null
+++ b/src/core/os_ignore.c
@@ -0,0 +1,146 @@
+/* OperServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_ignorelist(User * u);
+void myOperServHelp(User * u);
+int do_ignoreuser(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+ c = createCommand("IGNORE", do_ignoreuser, is_services_admin,
+ OPER_HELP_IGNORE, -1, -1, -1, -1);
+ moduleAddCommand(OPERSERV, c, MOD_UNIQUE);
+
+ moduleSetOperHelp(myOperServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+/**
+ * Add the help response to anopes /os help output.
+ * @param u The user who is requesting help
+ **/
+void myOperServHelp(User * u)
+{
+ if (is_services_admin(u)) {
+ notice_lang(s_OperServ, u, OPER_HELP_CMD_IGNORE);
+ }
+}
+
+/**
+ * The /os ignore command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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) {
+ 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 (delete_ignore(nick)) {
+ notice_lang(s_OperServ, u, OPER_IGNORE_DEL_DONE, nick);
+ return MOD_CONT;
+ }
+ notice_lang(s_OperServ, u, OPER_IGNORE_LIST_NOMATCH, nick);
+ }
+ } else if (!stricmp(cmd, "CLEAR")) {
+ clear_ignores();
+ notice_lang(s_OperServ, u, OPER_IGNORE_LIST_CLEARED);
+ return MOD_CONT;
+ } else
+ notice_lang(s_OperServ, u, OPER_IGNORE_SYNTAX);
+
+ return MOD_CONT;
+}
+
+/* shows the Services ignore list */
+int do_ignorelist(User * u)
+{
+ IgnoreData *id;
+
+ if (!ignore) {
+ notice_lang(s_OperServ, u, OPER_IGNORE_LIST_EMPTY);
+ return MOD_CONT;
+ }
+
+ notice_lang(s_OperServ, u, OPER_IGNORE_LIST);
+ for (id = ignore; id; id = id->next)
+ notice_user(s_OperServ, u, "%s", id->mask);
+
+ return MOD_CONT;
+}
+
+/* EOF */
diff --git a/src/core/os_jupe.c b/src/core/os_jupe.c
new file mode 100644
index 000000000..5a3ff8a94
--- /dev/null
+++ b/src/core/os_jupe.c
@@ -0,0 +1,88 @@
+/* OperServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_jupe(User * u);
+void myOperServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("JUPE", do_jupe, is_services_admin, OPER_HELP_JUPE,
+ -1, -1, -1, -1);
+ moduleAddCommand(OPERSERV, c, MOD_UNIQUE);
+
+ moduleSetOperHelp(myOperServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+/**
+ * Add the help response to anopes /os help output.
+ * @param u The user who is requesting help
+ **/
+void myOperServHelp(User * u)
+{
+ if (is_services_admin(u)) {
+ notice_lang(s_OperServ, u, OPER_HELP_CMD_JUPE);
+ }
+}
+
+/**
+ * The /os jupe command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+int do_jupe(User * u)
+{
+ char *jserver = strtok(NULL, " ");
+ char *reason = strtok(NULL, "");
+
+ 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 {
+ anope_cmd_jupe(jserver, u->nick, reason);
+
+ if (WallOSJupe)
+ anope_cmd_global(s_OperServ, "\2%s\2 used JUPE on \2%s\2",
+ u->nick, jserver);
+ }
+ }
+ return MOD_CONT;
+}
diff --git a/src/core/os_kick.c b/src/core/os_kick.c
new file mode 100644
index 000000000..facab5fc5
--- /dev/null
+++ b/src/core/os_kick.c
@@ -0,0 +1,100 @@
+/* OperServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_os_kick(User * u);
+void myOperServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("KICK", do_os_kick, is_services_oper, OPER_HELP_KICK,
+ -1, -1, -1, -1);
+ moduleAddCommand(OPERSERV, c, MOD_UNIQUE);
+
+ moduleSetOperHelp(myOperServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+/**
+ * Add the help response to anopes /os help output.
+ * @param u The user who is requesting help
+ **/
+void myOperServHelp(User * u)
+{
+ if (is_services_oper(u)) {
+ notice_lang(s_OperServ, u, OPER_HELP_CMD_KICK);
+ }
+}
+
+/**
+ * The /os kick command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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;
+ }
+ anope_cmd_kick(s_OperServ, chan, nick, "%s (%s)", u->nick, s);
+ if (WallOSKick)
+ anope_cmd_global(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;
+}
diff --git a/src/core/os_logonnews.c b/src/core/os_logonnews.c
new file mode 100644
index 000000000..20516c473
--- /dev/null
+++ b/src/core/os_logonnews.c
@@ -0,0 +1,98 @@
+/* OperServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+Command *c;
+
+void myOperServHelp(User * u);
+int load_config(void);
+int reload_config(int argc, char **argv);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ EvtHook *hook;
+ char buf[BUFSIZE];
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ /**
+ * For some unknown reason, do_logonnews is actaully defined in news.c
+ * we can look at moving it here later
+ **/
+ c = createCommand("LOGONNEWS", do_logonnews, is_services_admin,
+ NEWS_HELP_LOGON, -1, -1, -1, -1);
+ snprintf(buf, BUFSIZE, "%d", NewsCount),
+ c->help_param1 = sstrdup(buf);
+ moduleAddCommand(OPERSERV, c, MOD_UNIQUE);
+
+ moduleSetOperHelp(myOperServHelp);
+
+ hook = createEventHook(EVENT_RELOAD, reload_config);
+ if (moduleAddEventHook(hook) != MOD_ERR_OK) {
+ alog("[\002os_logonnews\002] Can't hook to EVENT_RELOAD event");
+ return MOD_STOP;
+ }
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+ free(c->help_param1);
+}
+
+
+/**
+ * Add the help response to anopes /os help output.
+ * @param u The user who is requesting help
+ **/
+void myOperServHelp(User * u)
+{
+ if (is_services_admin(u)) {
+ notice_lang(s_OperServ, u, OPER_HELP_CMD_LOGONNEWS);
+ }
+}
+
+
+/**
+ * Upon /os reload refresh the count
+ **/
+int reload_config(int argc, char **argv) {
+ char buf[BUFSIZE];
+
+ if (argc >= 1) {
+ if (!stricmp(argv[0], EVENT_START)) {
+ free(c->help_param1);
+ snprintf(buf, BUFSIZE, "%d", NewsCount),
+ c->help_param1 = sstrdup(buf);
+ }
+ }
+
+ return MOD_CONT;
+}
+
+/* EOF */
diff --git a/src/core/os_mode.c b/src/core/os_mode.c
new file mode 100644
index 000000000..c3d5c6624
--- /dev/null
+++ b/src/core/os_mode.c
@@ -0,0 +1,102 @@
+/* OperServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_os_mode(User * u);
+void myOperServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("MODE", do_os_mode, is_services_oper, OPER_HELP_MODE,
+ -1, -1, -1, -1);
+ moduleAddCommand(OPERSERV, c, MOD_UNIQUE);
+
+ moduleSetOperHelp(myOperServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+/**
+ * Add the help response to anopes /os help output.
+ * @param u The user who is requesting help
+ **/
+void myOperServHelp(User * u)
+{
+ if (is_services_oper(u)) {
+ notice_lang(s_OperServ, u, OPER_HELP_CMD_MODE);
+ }
+}
+
+/**
+ * The /os mode command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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;
+ } else if ((ircd->adminmode) && (!is_services_admin(u))
+ && (c->mode & ircd->adminmode)) {
+ notice_lang(s_OperServ, u, PERMISSION_DENIED);
+ return MOD_CONT;
+ } else {
+ anope_cmd_mode(s_OperServ, chan, "%s", modes);
+
+ ac = split_buf(modes, &av, 1);
+ chan_set_modes(s_OperServ, c, ac, av, -1);
+ free(av);
+
+ if (WallOSMode)
+ anope_cmd_global(s_OperServ, "%s used MODE %s on %s", u->nick,
+ modes, chan);
+ }
+ return MOD_CONT;
+}
diff --git a/src/core/os_modinfo.c b/src/core/os_modinfo.c
new file mode 100644
index 000000000..fde25f0a2
--- /dev/null
+++ b/src/core/os_modinfo.c
@@ -0,0 +1,139 @@
+/* OperServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_modinfo(User * u);
+void myOperServHelp(User * u);
+int showModuleMsgLoaded(MessageHash * msgList, char *mod_name, User * u);
+int showModuleCmdLoaded(CommandHash * cmdList, char *mod_name, User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+ c = createCommand("MODINFO", do_modinfo, NULL, -1, -1, -1, -1,
+ OPER_HELP_MODINFO);
+ moduleAddCommand(OPERSERV, c, MOD_UNIQUE);
+
+ moduleSetOperHelp(myOperServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+/**
+ * Add the help response to anopes /os help output.
+ * @param u The user who is requesting help
+ **/
+void myOperServHelp(User * u)
+{
+ notice_lang(s_OperServ, u, OPER_HELP_CMD_MODINFO);
+}
+
+/**
+ * The /os command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+int do_modinfo(User * u)
+{
+ char *file;
+ struct tm tm;
+ char timebuf[64];
+ Module *m;
+ int idx = 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++) {
+ showModuleCmdLoaded(HOSTSERV[idx], m->name, u);
+ showModuleCmdLoaded(OPERSERV[idx], m->name, u);
+ showModuleCmdLoaded(NICKSERV[idx], m->name, u);
+ showModuleCmdLoaded(CHANSERV[idx], m->name, u);
+ showModuleCmdLoaded(BOTSERV[idx], m->name, u);
+ showModuleCmdLoaded(MEMOSERV[idx], m->name, u);
+ showModuleCmdLoaded(HELPSERV[idx], m->name, u);
+ showModuleMsgLoaded(IRCD[idx], m->name, u);
+
+ }
+ } else {
+ notice_lang(s_OperServ, u, OPER_MODULE_NO_INFO, file);
+ }
+ return MOD_CONT;
+}
+
+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;
+}
+
+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;
+}
diff --git a/src/core/os_modlist.c b/src/core/os_modlist.c
new file mode 100644
index 000000000..8feddbea6
--- /dev/null
+++ b/src/core/os_modlist.c
@@ -0,0 +1,195 @@
+/* OperServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_modlist(User * u);
+void myOperServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("MODLIST", do_modlist, NULL, -1, -1, -1, -1,
+ OPER_HELP_MODLIST);
+ moduleAddCommand(OPERSERV, c, MOD_UNIQUE);
+
+ moduleSetOperHelp(myOperServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+/**
+ * Add the help response to anopes /os help output.
+ * @param u The user who is requesting help
+ **/
+void myOperServHelp(User * u)
+{
+ notice_lang(s_OperServ, u, OPER_HELP_CMD_MODLIST);
+}
+
+/**
+ * The /os modlist command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+int do_modlist(User * u)
+{
+ int idx;
+ int count = 0;
+ int showCore = 0;
+ int showThird = 1;
+ int showProto = 1;
+ int showEnc = 1;
+ int showSupported = 1;
+ int showQA = 1;
+
+ char *param;
+ ModuleHash *current = NULL;
+
+ char core[] = "Core";
+ char third[] = "3rd";
+ char proto[] = "Protocol";
+ char enc[] = "Encryption";
+ char supported[] = "Supported";
+ char qa[] = "QATested";
+
+ param = strtok(NULL, "");
+ if (param) {
+ if (stricmp(param, core) == 0) {
+ showCore = 1;
+ showThird = 0;
+ showProto = 0;
+ showEnc = 0;
+ showSupported = 0;
+ showQA = 0;
+ } else if (stricmp(param, third) == 0) {
+ showCore = 0;
+ showThird = 1;
+ showSupported = 0;
+ showQA = 0;
+ showProto = 0;
+ showEnc = 0;
+ } else if (stricmp(param, proto) == 0) {
+ showCore = 0;
+ showThird = 0;
+ showProto = 1;
+ showEnc = 0;
+ showSupported = 0;
+ showQA = 0;
+ } else if (stricmp(param, supported) == 0) {
+ showCore = 0;
+ showThird = 0;
+ showProto = 0;
+ showSupported = 1;
+ showEnc = 0;
+ showQA = 0;
+ } else if (stricmp(param, qa) == 0) {
+ showCore = 0;
+ showThird = 0;
+ showProto = 0;
+ showSupported = 0;
+ showEnc = 0;
+ showQA = 1;
+ } else if (stricmp(param, enc) == 0) {
+ showCore = 0;
+ showThird = 0;
+ showProto = 0;
+ showSupported = 0;
+ showEnc = 1;
+ showQA = 0;
+ }
+ }
+
+ notice_lang(s_OperServ, u, OPER_MODULE_LIST_HEADER);
+
+ for (idx = 0; idx != MAX_CMD_HASH; idx++) {
+ for (current = MODULE_HASH[idx]; current; current = current->next) {
+ switch (current->m->type) {
+ case CORE:
+ if (showCore) {
+ notice_lang(s_OperServ, u, OPER_MODULE_LIST,
+ current->name, current->m->version, core);
+ count++;
+ }
+ break;
+ case THIRD:
+ if (showThird) {
+ notice_lang(s_OperServ, u, OPER_MODULE_LIST,
+ current->name, current->m->version, third);
+ count++;
+ }
+ break;
+ case PROTOCOL:
+ if (showProto) {
+ notice_lang(s_OperServ, u, OPER_MODULE_LIST,
+ current->name, current->m->version, proto);
+ count++;
+ }
+ break;
+ case SUPPORTED:
+ if (showSupported) {
+ notice_lang(s_OperServ, u, OPER_MODULE_LIST,
+ current->name, current->m->version,
+ supported);
+ count++;
+ }
+ break;
+ case QATESTED:
+ if (showQA) {
+ notice_lang(s_OperServ, u, OPER_MODULE_LIST,
+ current->name, current->m->version, qa);
+ count++;
+ }
+ break;
+ case ENCRYPTION:
+ if (showEnc) {
+ notice_lang(s_OperServ, u, OPER_MODULE_LIST,
+ current->name, current->m->version, enc);
+ count++;
+ }
+ break;
+
+ }
+
+ }
+ }
+ if (count == 0) {
+ notice_lang(s_OperServ, u, OPER_MODULE_NO_LIST);
+ } else {
+ notice_lang(s_OperServ, u, OPER_MODULE_LIST_FOOTER, count);
+ }
+
+ return MOD_CONT;
+}
diff --git a/src/core/os_modload.c b/src/core/os_modload.c
new file mode 100644
index 000000000..bcb70c551
--- /dev/null
+++ b/src/core/os_modload.c
@@ -0,0 +1,83 @@
+/* OperServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_modload(User * u);
+void myOperServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion
+ ("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("MODLOAD", do_modload, is_services_root, -1, -1, -1,
+ -1, OPER_HELP_MODLOAD);
+ moduleAddCommand(OPERSERV, c, MOD_UNIQUE);
+
+ moduleSetOperHelp(myOperServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+/**
+ * Add the help response to anopes /os help output.
+ * @param u The user who is requesting help
+ **/
+void myOperServHelp(User * u)
+{
+ if (is_services_root(u)) {
+ notice_lang(s_OperServ, u, OPER_HELP_CMD_MODLOAD);
+ }
+}
+
+/**
+ * The /os modload command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+int do_modload(User * u)
+{
+ char *name;
+
+ name = strtok(NULL, "");
+ if (!name) {
+ syntax_error(s_OperServ, u, "MODLOAD", OPER_MODULE_LOAD_SYNTAX);
+ return MOD_CONT;
+ }
+ if (!queueModuleLoad(name, u))
+ notice_lang(s_OperServ, u, OPER_MODULE_LOAD_FAIL, name);
+
+ return MOD_CONT;
+}
diff --git a/src/core/os_modunload.c b/src/core/os_modunload.c
new file mode 100644
index 000000000..a27c5ba6a
--- /dev/null
+++ b/src/core/os_modunload.c
@@ -0,0 +1,85 @@
+/* OperServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_modunload(User * u);
+
+void myOperServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion
+ ("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("MODUNLOAD", do_modunload, is_services_root, -1, -1,
+ -1, -1, OPER_HELP_MODUNLOAD);
+ moduleAddCommand(OPERSERV, c, MOD_UNIQUE);
+
+ moduleSetOperHelp(myOperServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+/**
+ * Add the help response to anopes /os help output.
+ * @param u The user who is requesting help
+ **/
+void myOperServHelp(User * u)
+{
+ if (is_services_root(u)) {
+ notice_lang(s_OperServ, u, OPER_HELP_CMD_MODUNLOAD);
+ }
+}
+
+/**
+ * The /os modunload command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+int do_modunload(User * u)
+{
+ char *name;
+
+ name = strtok(NULL, "");
+ if (!name) {
+ syntax_error(s_OperServ, u, "MODUNLOAD",
+ OPER_MODULE_UNLOAD_SYNTAX);
+ return MOD_CONT;
+ }
+ if (!queueModuleUnload(name, u))
+ notice_lang(s_OperServ, u, OPER_MODULE_REMOVE_FAIL, name);
+
+ return MOD_CONT;
+}
diff --git a/src/core/os_noop.c b/src/core/os_noop.c
new file mode 100644
index 000000000..1d2b19d0e
--- /dev/null
+++ b/src/core/os_noop.c
@@ -0,0 +1,106 @@
+/* OperServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_noop(User * u);
+void myOperServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("NOOP", do_noop, is_services_admin, OPER_HELP_NOOP,
+ -1, -1, -1, -1);
+ moduleAddCommand(OPERSERV, c, MOD_UNIQUE);
+
+ moduleSetOperHelp(myOperServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+/**
+ * Add the help response to anopes /os help output.
+ * @param u The user who is requesting help
+ **/
+void myOperServHelp(User * u)
+{
+ if (is_services_admin(u)) {
+ notice_lang(s_OperServ, u, OPER_HELP_CMD_NOOP);
+ }
+}
+
+/**
+ * The /os noop command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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 */
+ anope_cmd_svsnoop(server, 1);
+
+ snprintf(reason, sizeof(reason), "NOOP command used by %s",
+ u->nick);
+ if (WallOSNoOp)
+ anope_cmd_global(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->name)
+ && match_wild(server, u2->server->name)) {
+ kill_user(s_OperServ, u2->nick, reason);
+ }
+ }
+ } else if (!stricmp(cmd, "REVOKE")) {
+ anope_cmd_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;
+}
diff --git a/src/core/os_oline.c b/src/core/os_oline.c
new file mode 100644
index 000000000..8e8b18730
--- /dev/null
+++ b/src/core/os_oline.c
@@ -0,0 +1,108 @@
+/* OperServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+int do_operoline(User * u);
+
+void myOperServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("OLINE", do_operoline, is_services_root,
+ OPER_HELP_OLINE, -1, -1, -1, -1);
+ moduleAddCommand(OPERSERV, c, MOD_UNIQUE);
+
+ moduleSetOperHelp(myOperServHelp);
+
+ if (!ircd->omode) {
+ return MOD_STOP;
+ }
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+/**
+ * Add the help response to anopes /os help output.
+ * @param u The user who is requesting help
+ **/
+void myOperServHelp(User * u)
+{
+ if (is_services_admin(u) && u->isSuperAdmin) {
+ notice_lang(s_OperServ, u, OPER_HELP_CMD_OLINE);
+ }
+}
+
+/**
+ * The /os oline command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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 {
+ /* let's check whether the user is online */
+ if (!(u2 = finduser(nick))) {
+ notice_lang(s_OperServ, u, NICK_X_NOT_IN_USE, nick);
+ } else if (u2 && flags[0] == '+') {
+ anope_cmd_svso(s_OperServ, nick, flags);
+ anope_cmd_mode(s_OperServ, nick, "+o");
+ common_svsmode(u2, "+o", NULL);
+ notice_lang(s_OperServ, u2, OPER_OLINE_IRCOP);
+ notice_lang(s_OperServ, u, OPER_OLINE_SUCCESS, flags, nick);
+ anope_cmd_global(s_OperServ, "\2%s\2 used OLINE for %s",
+ u->nick, nick);
+ } else if (u2 && flags[0] == '-') {
+ anope_cmd_svso(s_OperServ, nick, flags);
+ notice_lang(s_OperServ, u, OPER_OLINE_SUCCESS, flags, nick);
+ anope_cmd_global(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;
+}
diff --git a/src/core/os_oper.c b/src/core/os_oper.c
new file mode 100644
index 000000000..a0ab70919
--- /dev/null
+++ b/src/core/os_oper.c
@@ -0,0 +1,252 @@
+/* OperServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_oper(User * u);
+int oper_list_callback(SList * slist, int number, void *item,
+ va_list args);
+int oper_list(int number, NickCore * nc, User * u, int *sent_header);
+void myOperServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+ c = createCommand("OPER", do_oper, NULL, OPER_HELP_OPER, -1, -1, -1,
+ -1);
+ c->help_param1 = s_NickServ;
+ moduleAddCommand(OPERSERV, c, MOD_UNIQUE);
+
+ moduleSetOperHelp(myOperServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+/**
+ * Add the help response to anopes /os help output.
+ * @param u The user who is requesting help
+ **/
+void myOperServHelp(User * u)
+{
+ notice_lang(s_OperServ, u, OPER_HELP_CMD_OPER);
+}
+
+/**
+ * The /os oper command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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_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_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 {
+ if (na->nc->flags & NI_SERVICES_ADMIN
+ && (res = slist_indexof(&servadmins, na->nc)) != -1) {
+ if (!is_services_root(u)) {
+ notice_lang(s_OperServ, u, PERMISSION_DENIED);
+ return MOD_CONT;
+ }
+ slist_delete(&servadmins, res);
+ na->nc->flags |= NI_SERVICES_OPER;
+ notice_lang(s_OperServ, u, OPER_OPER_MOVED, nick);
+ } 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_root(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 (!is_oper(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;
+ }
+
+ 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_root(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;
+}
+
+/* Lists an oper entry, prefixing it with the header if needed */
+
+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 */
+
+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);
+}
diff --git a/src/core/os_opernews.c b/src/core/os_opernews.c
new file mode 100644
index 000000000..dc9b3006a
--- /dev/null
+++ b/src/core/os_opernews.c
@@ -0,0 +1,97 @@
+/* OperServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+Command *c;
+
+void myOperServHelp(User * u);
+int load_config(void);
+int reload_config(int argc, char **argv);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ EvtHook *hook;
+ char buf[BUFSIZE];
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ /**
+ * For some unknown reason, do_opernews is actaully defined in news.c
+ * we can look at moving it here later
+ **/
+ c = createCommand("OPERNEWS", do_opernews, is_services_admin,
+ NEWS_HELP_OPER, -1, -1, -1, -1);
+ snprintf(buf, BUFSIZE, "%d", NewsCount),
+ c->help_param1 = sstrdup(buf);
+ moduleAddCommand(OPERSERV, c, MOD_UNIQUE);
+
+ moduleSetOperHelp(myOperServHelp);
+
+ hook = createEventHook(EVENT_RELOAD, reload_config);
+ if (moduleAddEventHook(hook) != MOD_ERR_OK) {
+ alog("[\002os_opernews\002] Can't hook to EVENT_RELOAD event");
+ return MOD_STOP;
+ }
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+ free(c->help_param1);
+}
+
+
+/**
+ * Add the help response to anopes /os help output.
+ * @param u The user who is requesting help
+ **/
+void myOperServHelp(User * u)
+{
+ if (is_services_admin(u)) {
+ notice_lang(s_OperServ, u, OPER_HELP_CMD_OPERNEWS);
+ }
+}
+
+/**
+ * Upon /os reload refresh the count
+ **/
+int reload_config(int argc, char **argv) {
+ char buf[BUFSIZE];
+
+ if (argc >= 1) {
+ if (!stricmp(argv[0], EVENT_START)) {
+ free(c->help_param1);
+ snprintf(buf, BUFSIZE, "%d", NewsCount),
+ c->help_param1 = sstrdup(buf);
+ }
+ }
+
+ return MOD_CONT;
+}
+
+/* EOF */
diff --git a/src/core/os_quit.c b/src/core/os_quit.c
new file mode 100644
index 000000000..65fd31123
--- /dev/null
+++ b/src/core/os_quit.c
@@ -0,0 +1,82 @@
+/* OperServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_os_quit(User * u);
+void myOperServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("QUIT", do_os_quit, is_services_root,
+ OPER_HELP_QUIT, -1, -1, -1, -1);
+ moduleAddCommand(OPERSERV, c, MOD_UNIQUE);
+
+ moduleSetOperHelp(myOperServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+/**
+ * Add the help response to anopes /os help output.
+ * @param u The user who is requesting help
+ **/
+void myOperServHelp(User * u)
+{
+ if (is_services_root(u)) {
+ notice_lang(s_OperServ, u, OPER_HELP_CMD_QUIT);
+ }
+}
+
+/**
+ * The /os quit command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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, "%s", GlobalOnCycleMessage);
+ }
+ quitting = 1;
+ return MOD_CONT;
+}
diff --git a/src/core/os_randomnews.c b/src/core/os_randomnews.c
new file mode 100644
index 000000000..e29cfc796
--- /dev/null
+++ b/src/core/os_randomnews.c
@@ -0,0 +1,66 @@
+/* OperServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+void myOperServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion
+ ("$Id$");
+ moduleSetType(CORE);
+
+ /**
+ * For some unknown reason, do_randomnews is actaully defined in news.c
+ * we can look at moving it here later
+ **/
+ c = createCommand("RANDOMNEWS", do_randomnews, is_services_admin,
+ NEWS_HELP_RANDOM, -1, -1, -1, -1);
+ moduleAddCommand(OPERSERV, c, MOD_UNIQUE);
+
+ moduleSetOperHelp(myOperServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+/**
+ * Add the help response to anopes /os help output.
+ * @param u The user who is requesting help
+ **/
+void myOperServHelp(User * u)
+{
+ if (is_services_admin(u)) {
+ notice_lang(s_OperServ, u, OPER_HELP_CMD_RANDOMNEWS);
+ }
+}
diff --git a/src/core/os_raw.c b/src/core/os_raw.c
new file mode 100644
index 000000000..9832225dd
--- /dev/null
+++ b/src/core/os_raw.c
@@ -0,0 +1,78 @@
+/* OperServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_raw(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(THIRD);
+
+ c = createCommand("RAW", do_raw, is_services_root, OPER_HELP_RAW, -1,
+ -1, -1, -1);
+ moduleAddCommand(OPERSERV, c, MOD_UNIQUE);
+
+ if (DisableRaw) {
+ alog("[os_raw] Unloading because DisableRaw is enabled");
+ return MOD_STOP;
+ }
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+/**
+ * The /os raw command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+int do_raw(User * u)
+{
+ 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, " ");
+ anope_cmd_global(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);
+ }
+ return MOD_CONT;
+}
diff --git a/src/core/os_reload.c b/src/core/os_reload.c
new file mode 100644
index 000000000..6f2a4a406
--- /dev/null
+++ b/src/core/os_reload.c
@@ -0,0 +1,84 @@
+/* OperServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_reload(User * u);
+void myOperServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("RELOAD", do_reload, is_services_root,
+ OPER_HELP_RELOAD, -1, -1, -1, -1);
+ moduleAddCommand(OPERSERV, c, MOD_UNIQUE);
+
+ moduleSetOperHelp(myOperServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+/**
+ * Add the help response to anopes /os help output.
+ * @param u The user who is requesting help
+ **/
+void myOperServHelp(User * u)
+{
+ if (is_services_root(u)) {
+ notice_lang(s_OperServ, u, OPER_HELP_CMD_RELOAD);
+ }
+}
+
+/**
+ * The /os relaod command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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;
+ }
+ send_event(EVENT_RELOAD, 1, EVENT_START);
+ notice_lang(s_OperServ, u, OPER_RELOAD);
+ return MOD_CONT;
+}
diff --git a/src/core/os_restart.c b/src/core/os_restart.c
new file mode 100644
index 000000000..d1beec8b1
--- /dev/null
+++ b/src/core/os_restart.c
@@ -0,0 +1,91 @@
+/* OperServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+#ifdef _WIN32
+/* OperServ restart needs access to this if were gonna avoid sending ourself a signal */
+extern MDE void do_restart_services(void);
+#endif
+
+int do_restart(User * u);
+void myOperServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+ c = createCommand("RESTART", do_restart, is_services_root,
+ OPER_HELP_RESTART, -1, -1, -1, -1);
+ moduleAddCommand(OPERSERV, c, MOD_UNIQUE);
+
+ moduleSetOperHelp(myOperServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+/**
+ * Add the help response to anopes /os help output.
+ * @param u The user who is requesting help
+ **/
+void myOperServHelp(User * u)
+{
+ if (is_services_root(u)) {
+ notice_lang(s_OperServ, u, OPER_HELP_CMD_RESTART);
+ }
+}
+
+/**
+ * The /os restart command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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, "%s", GlobalOnCycleMessage);
+ }
+ /* raise(SIGHUP); */
+ do_restart_services();
+#else
+ notice_lang(s_OperServ, u, OPER_CANNOT_RESTART);
+#endif
+ return MOD_CONT;
+}
diff --git a/src/core/os_session.c b/src/core/os_session.c
new file mode 100644
index 000000000..9c9498a15
--- /dev/null
+++ b/src/core/os_session.c
@@ -0,0 +1,68 @@
+/* OperServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+void myOperServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ /**
+ * do_session/do_exception are exported from sessions.c - we just want to provide an interface.
+ **/
+ c = createCommand("SESSION", do_session, is_services_oper,
+ OPER_HELP_SESSION, -1, -1, -1, -1);
+ moduleAddCommand(OPERSERV, c, MOD_UNIQUE);
+ c = createCommand("EXCEPTION", do_exception, is_services_oper,
+ OPER_HELP_EXCEPTION, -1, -1, -1, -1);
+ moduleAddCommand(OPERSERV, c, MOD_UNIQUE);
+
+ moduleSetOperHelp(myOperServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+/**
+ * Add the help response to anopes /os help output.
+ * @param u The user who is requesting help
+ **/
+void myOperServHelp(User * u)
+{
+ if (is_services_oper(u)) {
+ notice_lang(s_OperServ, u, OPER_HELP_CMD_SESSION);
+ notice_lang(s_OperServ, u, OPER_HELP_CMD_EXCEPTION);
+ }
+}
diff --git a/src/core/os_set.c b/src/core/os_set.c
new file mode 100644
index 000000000..7b533b8f0
--- /dev/null
+++ b/src/core/os_set.c
@@ -0,0 +1,264 @@
+/* OperServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_set(User * u);
+void myOperServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("SET", do_set, is_services_root, OPER_HELP_SET, -1,
+ -1, -1, -1);
+ moduleAddCommand(OPERSERV, c, MOD_UNIQUE);
+ c = createCommand("SET LIST", NULL, NULL, OPER_HELP_SET_LIST, -1, -1,
+ -1, -1);
+ moduleAddCommand(OPERSERV, c, MOD_UNIQUE);
+ c = createCommand("SET READONLY", NULL, NULL, OPER_HELP_SET_READONLY,
+ -1, -1, -1, -1);
+ moduleAddCommand(OPERSERV, c, MOD_UNIQUE);
+ c = createCommand("SET LOGCHAN", NULL, NULL, OPER_HELP_SET_LOGCHAN, -1,
+ -1, -1, -1);
+ moduleAddCommand(OPERSERV, c, MOD_UNIQUE);
+ c = createCommand("SET DEBUG", NULL, NULL, OPER_HELP_SET_DEBUG, -1, -1,
+ -1, -1);
+ moduleAddCommand(OPERSERV, c, MOD_UNIQUE);
+ c = createCommand("SET NOEXPIRE", NULL, NULL, OPER_HELP_SET_NOEXPIRE,
+ -1, -1, -1, -1);
+ moduleAddCommand(OPERSERV, c, MOD_UNIQUE);
+ c = createCommand("SET IGNORE", NULL, NULL, OPER_HELP_SET_IGNORE, -1,
+ -1, -1, -1);
+ moduleAddCommand(OPERSERV, c, MOD_UNIQUE);
+ c = createCommand("SET SUPERADMIN", NULL, NULL,
+ OPER_HELP_SET_SUPERADMIN, -1, -1, -1, -1);
+ moduleAddCommand(OPERSERV, c, MOD_UNIQUE);
+#ifdef USE_MYSQL
+ c = createCommand("SET SQL", NULL, NULL, OPER_HELP_SET_SQL, -1, -1, -1,
+ -1);
+ moduleAddCommand(OPERSERV, c, MOD_UNIQUE);
+#endif
+
+ moduleSetOperHelp(myOperServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+/**
+ * Add the help response to anopes /os help output.
+ * @param u The user who is requesting help
+ **/
+void myOperServHelp(User * u)
+{
+ if (is_services_root(u)) {
+ notice_lang(s_OperServ, u, OPER_HELP_CMD_SET);
+ }
+}
+
+/**
+ * The /os set command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+int do_set(User * u)
+{
+ char *option = strtok(NULL, " ");
+ char *setting = strtok(NULL, " ");
+ int index;
+ Channel *c;
+
+ if (!option) {
+ syntax_error(s_OperServ, u, "SET", OPER_SET_SYNTAX);
+ } else if (stricmp(option, "LIST") == 0) {
+ index =
+ (allow_ignore ? OPER_SET_LIST_OPTION_ON :
+ OPER_SET_LIST_OPTION_OFF);
+ notice_lang(s_OperServ, u, index, "IGNORE");
+ index =
+ (readonly ? OPER_SET_LIST_OPTION_ON :
+ OPER_SET_LIST_OPTION_OFF);
+ notice_lang(s_OperServ, u, index, "READONLY");
+ index =
+ (logchan ? OPER_SET_LIST_OPTION_ON : OPER_SET_LIST_OPTION_OFF);
+ notice_lang(s_OperServ, u, index, "LOGCHAN");
+ index =
+ (debug ? OPER_SET_LIST_OPTION_ON : OPER_SET_LIST_OPTION_OFF);
+ notice_lang(s_OperServ, u, index, "DEBUG");
+ index =
+ (noexpire ? OPER_SET_LIST_OPTION_ON :
+ OPER_SET_LIST_OPTION_OFF);
+ notice_lang(s_OperServ, u, index, "NOEXPIRE");
+#ifdef USE_MYSQL
+ index =
+ (do_mysql ? OPER_SET_LIST_OPTION_ON :
+ OPER_SET_LIST_OPTION_OFF);
+ notice_lang(s_OperServ, u, index, "SQL");
+#endif
+ } else if (!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);
+ }
+#ifdef USE_MYSQL
+ } else if (stricmp(option, "SQL") == 0) {
+ if (stricmp(setting, "on") == 0) {
+ if (!MysqlHost) {
+ notice_lang(s_OperServ, u, OPER_SET_SQL_ERROR_DISABLED);
+ } else {
+ if (rdb_init()) {
+ notice_lang(s_OperServ, u, OPER_SET_SQL_ON);
+ } else {
+ notice_lang(s_OperServ, u, OPER_SET_SQL_ERROR_INIT);
+ }
+ }
+ } else if (stricmp(setting, "off") == 0) {
+ if (!MysqlHost) {
+ notice_lang(s_OperServ, u, OPER_SET_SQL_ERROR_DISABLED);
+ } else {
+ /* could call rdb_close() but that does nothing - TSL */
+ do_mysql = 0;
+ notice_lang(s_OperServ, u, OPER_SET_SQL_OFF);
+ }
+ } else {
+ notice_lang(s_OperServ, u, OPER_SET_SQL_ERROR);
+ }
+#endif
+ } 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)) {
+ if (ircd->join2msg) {
+ c = findchan(LogChannel);
+ anope_cmd_join(s_GlobalNoticer, LogChannel, c ? c->creation_time : time(NULL));
+ }
+ 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)) {
+ alog("No longer sending log messages to a channel");
+ if (ircd->join2msg) {
+ anope_cmd_part(s_GlobalNoticer, LogChannel, NULL);
+ }
+ logchan = 0;
+ 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) {
+ notice_lang(s_OperServ, u, OPER_SUPER_ADMIN_NOT_ENABLED);
+ } else if (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);
+ anope_cmd_global(s_OperServ,
+ getstring2(NULL, OPER_SUPER_ADMIN_WALL_ON),
+ u->nick);
+ } else if (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);
+ anope_cmd_global(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;
+}
diff --git a/src/core/os_sgline.c b/src/core/os_sgline.c
new file mode 100644
index 000000000..da28cf178
--- /dev/null
+++ b/src/core/os_sgline.c
@@ -0,0 +1,362 @@
+/* OperServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int sgline_view_callback(SList * slist, int number, void *item,
+ va_list args);
+int sgline_view(int number, SXLine * sx, User * u, int *sent_header);
+int sgline_list_callback(SList * slist, int number, void *item,
+ va_list args);
+int sgline_list(int number, SXLine * sx, User * u, int *sent_header);
+int do_sgline(User * u);
+
+void myOperServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("SGLINE", do_sgline, is_services_oper,
+ OPER_HELP_SGLINE, -1, -1, -1, -1);
+ moduleAddCommand(OPERSERV, c, MOD_UNIQUE);
+
+ moduleSetOperHelp(myOperServHelp);
+
+ if (!ircd->sgline) {
+ return MOD_STOP;
+ }
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+/**
+ * Add the help response to anopes /os help output.
+ * @param u The user who is requesting help
+ **/
+void myOperServHelp(User * u)
+{
+ if (is_services_oper(u)) {
+ notice_lang(s_OperServ, u, OPER_HELP_CMD_SGLINE);
+ }
+}
+
+/**
+ * The /os sgline command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+int do_sgline(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 = 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, ""))) {
+ /* Clean up the last character of the mask if it is a space
+ * See bug #761
+ */
+ size_t masklen = strlen(mask);
+ if (mask[masklen - 1] == ' ')
+ mask[masklen - 1] = '\0';
+
+ /* 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");
+ }
+
+ anope_cmd_global(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);
+ }
+ return MOD_CONT;
+}
+
+/* Lists an SGLINE entry, prefixing it with the header if needed */
+
+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 */
+
+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);
+}
+
+/* Lists an SGLINE entry, prefixing it with the header if needed */
+
+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 */
+
+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);
+}
diff --git a/src/core/os_shutdown.c b/src/core/os_shutdown.c
new file mode 100644
index 000000000..2031462b8
--- /dev/null
+++ b/src/core/os_shutdown.c
@@ -0,0 +1,83 @@
+/* OperServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_shutdown(User * u);
+void myOperServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("SHUTDOWN", do_shutdown, is_services_root,
+ OPER_HELP_SHUTDOWN, -1, -1, -1, -1);
+ moduleAddCommand(OPERSERV, c, MOD_UNIQUE);
+
+ moduleSetOperHelp(myOperServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+/**
+ * Add the help response to anopes /os help output.
+ * @param u The user who is requesting help
+ **/
+void myOperServHelp(User * u)
+{
+ if (is_services_root(u)) {
+ notice_lang(s_OperServ, u, OPER_HELP_CMD_SHUTDOWN);
+ }
+}
+
+/**
+ * The /os shutdown command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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, "%s", GlobalOnCycleMessage);
+ }
+ save_data = 1;
+ delayed_quit = 1;
+ return MOD_CONT;
+}
diff --git a/src/core/os_sqline.c b/src/core/os_sqline.c
new file mode 100644
index 000000000..57d91f679
--- /dev/null
+++ b/src/core/os_sqline.c
@@ -0,0 +1,355 @@
+/* OperServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_sqline(User * u);
+int sqline_view_callback(SList * slist, int number, void *item,
+ va_list args);
+int sqline_view(int number, SXLine * sx, User * u, int *sent_header);
+int sqline_list_callback(SList * slist, int number, void *item,
+ va_list args);
+int sqline_list(int number, SXLine * sx, User * u, int *sent_header);
+
+void myOperServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("SQLINE", do_sqline, is_services_oper,
+ OPER_HELP_SQLINE, -1, -1, -1, -1);
+ moduleAddCommand(OPERSERV, c, MOD_UNIQUE);
+
+ moduleSetOperHelp(myOperServHelp);
+ if (!ircd->sqline) {
+ return MOD_STOP;
+ }
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+/**
+ * Add the help response to anopes /os help output.
+ * @param u The user who is requesting help
+ **/
+void myOperServHelp(User * u)
+{
+ if (is_services_oper(u)) {
+ notice_lang(s_OperServ, u, OPER_HELP_CMD_SQLINE);
+ }
+}
+
+/**
+ * The /os sqline command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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;
+ }
+
+ /* Channel SQLINEs are only supported on Bahamut servers */
+ if (*mask == '#' && !ircd->chansqline) {
+ notice_lang(s_OperServ, u,
+ OPER_SQLINE_CHANNELS_UNSUPPORTED);
+ return MOD_CONT;
+ }
+
+ 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");
+ }
+
+ anope_cmd_global(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;
+}
+
+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 */
+
+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);
+}
+
+/* Lists an SQLINE entry, prefixing it with the header if needed */
+
+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 */
+
+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);
+}
diff --git a/src/core/os_staff.c b/src/core/os_staff.c
new file mode 100644
index 000000000..ae9e6d66c
--- /dev/null
+++ b/src/core/os_staff.c
@@ -0,0 +1,156 @@
+/* OperServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_staff(User * u);
+void myOperServHelp(User * u);
+int opers_list_callback(SList * slist, int number, void *item,
+ va_list args);
+int opers_list(int number, NickCore * nc, User * u, char *level);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("STAFF", do_staff, NULL, OPER_HELP_STAFF, -1, -1,
+ -1, -1);
+ moduleAddCommand(OPERSERV, c, MOD_UNIQUE);
+
+ moduleSetOperHelp(myOperServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+/**
+ * Add the help response to anopes /os help output.
+ * @param u The user who is requesting help
+ **/
+void myOperServHelp(User * u)
+{
+ notice_lang(s_OperServ, u, OPER_HELP_CMD_STAFF);
+}
+
+/**
+ * The /os staff command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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;
+}
+
+/**
+ * Function for the enumerator to call
+ **/
+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 an Opers list Entry
+ **/
+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;
+}
diff --git a/src/core/os_stats.c b/src/core/os_stats.c
new file mode 100644
index 000000000..e88ac3da1
--- /dev/null
+++ b/src/core/os_stats.c
@@ -0,0 +1,453 @@
+/* OperServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+
+
+int do_stats(User * u);
+void get_operserv_stats(long *nrec, long *memuse);
+void myOperServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("STATS", do_stats, NULL, OPER_HELP_STATS,
+ -1, -1, -1, -1);
+ moduleAddCommand(OPERSERV, c, MOD_UNIQUE);
+ c = createCommand("UPTIME", do_stats, NULL,
+ OPER_HELP_STATS, -1, -1, -1, -1);
+ moduleAddCommand(OPERSERV, c, MOD_UNIQUE);
+
+ moduleSetOperHelp(myOperServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+/**
+ * Add the help response to anopes /os help output.
+ * @param u The user who is requesting help
+ **/
+void myOperServHelp(User * u)
+{
+ notice_lang(s_OperServ, u, OPER_HELP_CMD_STATS);
+}
+
+/**
+ * Count servers connected to server s
+ * @param s The server to start counting from
+ * @return Amount of servers connected to server s
+ **/
+int stats_count_servers(Server * s)
+{
+ int count = 0;
+
+ while (s) {
+ count++;
+ if (s->links)
+ count += stats_count_servers(s->links);
+ s = s->next;
+ }
+
+ return count;
+}
+
+/**
+ * The /os stats command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+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];
+ char buf[512];
+ int buflen;
+ int i;
+
+ 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);
+ if (ircd->sgline) {
+ /* 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);
+ }
+ if (ircd->sqline) {
+ /* 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);
+ }
+ if (ircd->szline) {
+ /* 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);
+ }
+ 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 if (stricmp(extra, "MEMORY") && stricmp(extra, "UPLINK")) {
+ notice_lang(s_OperServ, u, OPER_STATS_UNKNOWN_OPTION, extra);
+ }
+ }
+
+ if (!extra || ((stricmp(extra, "MEMORY") != 0)
+ && (stricmp(extra, "UPLINK") != 0))) {
+ 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)
+ || (stricmp(extra, "UPLINK") == 0))
+ && is_services_admin(u)) {
+ buf[0] = '\0';
+ buflen = 511; /* How confusing, this is the amount of space left! */
+ for (i = 0; capab_info[i].token; i++) {
+ if (uplink_capab & capab_info[i].flag) {
+ strncat(buf, " ", buflen);
+ buflen--;
+ strncat(buf, capab_info[i].token, buflen);
+ buflen -= strlen(capab_info[i].token);
+ /* Special cases */
+ if (capab_info[i].flag == CAPAB_CHANMODE) {
+ strncat(buf, "=", buflen);
+ buflen--;
+ strncat(buf, ircd->chanmodes, buflen);
+ buflen -= strlen(ircd->chanmodes);
+ }
+ if (capab_info[i].flag == CAPAB_NICKCHARS) {
+ strncat(buf, "=", buflen);
+ buflen--;
+ if (ircd->nickchars) {
+ strncat(buf, ircd->nickchars, buflen);
+ buflen -= strlen(ircd->nickchars);
+ } /* leave blank if it was null */
+ }
+ }
+ }
+ notice_lang(s_OperServ, u, OPER_STATS_UPLINK_SERVER,
+ serv_uplink->name);
+ notice_lang(s_OperServ, u, OPER_STATS_UPLINK_CAPAB, buf);
+ notice_lang(s_OperServ, u, OPER_STATS_UPLINK_SERVER_COUNT,
+ stats_count_servers(serv_uplink));
+ }
+
+ if (extra && ((stricmp(extra, "ALL") == 0)
+ || (stricmp(extra, "MEMORY") == 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);
+ if (s_BotServ) {
+ get_botserv_stats(&count, &mem);
+ notice_lang(s_OperServ, u, OPER_STATS_BOTSERV_MEM, count,
+ (mem + 512) / 1024);
+ }
+ if (s_HostServ) {
+ get_hostserv_stats(&count, &mem);
+ notice_lang(s_OperServ, u, OPER_STATS_HOSTSERV_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);
+ }
+ return MOD_CONT;
+}
+
+void get_operserv_stats(long *nrec, long *memuse)
+{
+ int i;
+ long mem = 0, count = 0, mem2 = 0, count2 = 0;
+ Akill *ak;
+ SXLine *sx;
+
+ count += akills.count;
+ mem += akills.capacity;
+ 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;
+ }
+
+ if (ircd->sgline) {
+ count += sglines.count;
+ mem += sglines.capacity;
+ 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;
+ }
+ }
+ if (ircd->sqline) {
+ count += sqlines.count;
+ mem += sqlines.capacity;
+ 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;
+ }
+ }
+ if (ircd->szline) {
+ count += szlines.count;
+ mem += szlines.capacity;
+ 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;
+ }
+ }
+
+
+ get_news_stats(&count2, &mem2);
+ count += count2;
+ mem += mem2;
+ get_exception_stats(&count2, &mem2);
+ count += count2;
+ mem += mem2;
+
+ *nrec = count;
+ *memuse = mem;
+}
diff --git a/src/core/os_svsnick.c b/src/core/os_svsnick.c
new file mode 100644
index 000000000..c579d7588
--- /dev/null
+++ b/src/core/os_svsnick.c
@@ -0,0 +1,125 @@
+/* OperServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_svsnick(User * u);
+void myOperServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("SVSNICK", do_svsnick, is_services_root,
+ OPER_HELP_SVSNICK, -1, -1, -1, -1);
+ moduleAddCommand(OPERSERV, c, MOD_UNIQUE);
+
+ moduleSetOperHelp(myOperServHelp);
+ if (!ircd->svsnick) {
+ return MOD_STOP;
+ }
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+/**
+ * Add the help response to anopes /os help output.
+ * @param u The user who is requesting help
+ **/
+void myOperServHelp(User * u)
+{
+ if (is_services_admin(u) && u->isSuperAdmin) {
+ notice_lang(s_OperServ, u, OPER_HELP_CMD_SVSNICK);
+ }
+}
+
+/**
+ * The /os svsnick command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+/* Forcefully change a user's nickname */
+
+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_OperServ, 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;
+ }
+ for (c = newnick; *c && (c - newnick) < NICKMAX; c++) {
+ if (!isvalidnick(*c)) {
+ notice_lang(s_OperServ, u, NICK_X_ILLEGAL, newnick);
+ 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_OperServ, u, NICK_X_IN_USE, newnick);
+ } else if ((na = findnick(newnick)) && (na->status & NS_VERBOTEN)) {
+ notice_lang(s_OperServ, u, NICK_X_FORBIDDEN, newnick);
+ } else {
+ notice_lang(s_OperServ, u, OPER_SVSNICK_NEWNICK, nick, newnick);
+ anope_cmd_global(s_OperServ, "%s used SVSNICK to change %s to %s",
+ u->nick, nick, newnick);
+ anope_cmd_svsnick(nick, newnick, time(NULL));
+ }
+ return MOD_CONT;
+}
diff --git a/src/core/os_szline.c b/src/core/os_szline.c
new file mode 100644
index 000000000..5c5e9a466
--- /dev/null
+++ b/src/core/os_szline.c
@@ -0,0 +1,350 @@
+/* OperServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_szline(User * u);
+void myOperServHelp(User * u);
+int szline_view_callback(SList * slist, int number, void *item,
+ va_list args);
+int szline_list_callback(SList * slist, int number, void *item,
+ va_list args);
+int szline_view(int number, SXLine * sx, User * u, int *sent_header);
+int szline_list(int number, SXLine * sx, User * u, int *sent_header);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("SZLINE", do_szline, is_services_oper,
+ OPER_HELP_SZLINE, -1, -1, -1, -1);
+ moduleAddCommand(OPERSERV, c, MOD_UNIQUE);
+
+ moduleSetOperHelp(myOperServHelp);
+ if (!ircd->szline) {
+ return MOD_STOP;
+ }
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+/**
+ * Add the help response to anopes /os help output.
+ * @param u The user who is requesting help
+ **/
+void myOperServHelp(User * u)
+{
+ if (is_services_oper(u)) {
+ notice_lang(s_OperServ, u, OPER_HELP_CMD_SZLINE);
+ }
+}
+
+/**
+ * The /os szline command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+int do_szline(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) : 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");
+ }
+
+ anope_cmd_global(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);
+ }
+ return MOD_CONT;
+}
+
+
+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 */
+
+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);
+}
+
+/* Callback for enumeration purposes */
+
+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 */
+
+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;
+}
diff --git a/src/core/os_umode.c b/src/core/os_umode.c
new file mode 100644
index 000000000..f81f49151
--- /dev/null
+++ b/src/core/os_umode.c
@@ -0,0 +1,116 @@
+/* OperServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_operumodes(User * u);
+void myOperServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("UMODE", do_operumodes, is_services_root,
+ OPER_HELP_UMODE, -1, -1, -1, -1);
+ moduleAddCommand(OPERSERV, c, MOD_UNIQUE);
+
+ moduleSetOperHelp(myOperServHelp);
+
+ if (!ircd->umode) {
+ return MOD_STOP;
+ }
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+/**
+ * Add the help response to anopes /os help output.
+ * @param u The user who is requesting help
+ **/
+void myOperServHelp(User * u)
+{
+ if (is_services_admin(u) && u->isSuperAdmin) {
+ notice_lang(s_OperServ, u, OPER_HELP_CMD_UMODE);
+ }
+}
+
+/**
+ * Change any user's UMODES
+ *
+ * modified to be part of the SuperAdmin directive -jester
+ * check user flag for SuperAdmin -rob
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ */
+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 {
+ anope_cmd_mode(s_OperServ, nick, "%s", modes);
+
+ common_svsmode(u2, modes, NULL);
+
+ notice_lang(s_OperServ, u, OPER_UMODE_SUCCESS, nick);
+ notice_lang(s_OperServ, u2, OPER_UMODE_CHANGED, u->nick);
+
+ if (WallOSMode)
+ anope_cmd_global(s_OperServ, "\2%s\2 used UMODE on %s",
+ u->nick, nick);
+ }
+ return MOD_CONT;
+}
diff --git a/src/core/os_update.c b/src/core/os_update.c
new file mode 100644
index 000000000..5b15dbb93
--- /dev/null
+++ b/src/core/os_update.c
@@ -0,0 +1,74 @@
+/* OperServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_update(User * u);
+void myOperServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("UPDATE", do_update, is_services_root,
+ OPER_HELP_UPDATE, -1, -1, -1, -1);
+ moduleAddCommand(OPERSERV, c, MOD_UNIQUE);
+
+ moduleSetOperHelp(myOperServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+/**
+ * Add the help response to anopes /os help output.
+ * @param u The user who is requesting help
+ **/
+void myOperServHelp(User * u)
+{
+ if (is_services_root(u)) {
+ notice_lang(s_OperServ, u, OPER_HELP_CMD_UPDATE);
+ }
+}
+
+/**
+ * The /os update command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+int do_update(User * u)
+{
+ notice_lang(s_OperServ, u, OPER_UPDATING);
+ save_data = 1;
+ return MOD_CONT;
+}
diff --git a/src/core/os_userlist.c b/src/core/os_userlist.c
new file mode 100644
index 000000000..d0ca57a33
--- /dev/null
+++ b/src/core/os_userlist.c
@@ -0,0 +1,121 @@
+/* OperServ core functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+#ifdef _WIN32
+extern MDE int anope_get_invite_mode();
+extern MDE int anope_get_invis_mode();
+#endif
+
+int do_userlist(User * u);
+void myOperServHelp(User * u);
+
+/**
+ * Create the command, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(CORE);
+
+ c = createCommand("USERLIST", do_userlist, NULL,
+ OPER_HELP_USERLIST, -1, -1, -1, -1);
+ moduleAddCommand(OPERSERV, c, MOD_UNIQUE);
+
+ moduleSetOperHelp(myOperServHelp);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+
+/**
+ * Add the help response to anopes /os help output.
+ * @param u The user who is requesting help
+ **/
+void myOperServHelp(User * u)
+{
+ notice_lang(s_OperServ, u, OPER_HELP_CMD_USERLIST);
+}
+
+/**
+ * The /os userlist command.
+ * @param u The user who issued the command
+ * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing.
+ **/
+
+int do_userlist(User * u)
+{
+ char *pattern = strtok(NULL, " ");
+ char *opt = strtok(NULL, " ");
+
+ Channel *c;
+ int modes = 0;
+
+ if (opt && !stricmp(opt, "INVISIBLE"))
+ modes |= anope_get_invis_mode();
+
+ 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, common_get_vident(cu->user),
+ common_get_vhost(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,
+ common_get_vident(u2), common_get_vhost(u2));
+ if (!match_wild_nocase(pattern, mask))
+ continue;
+ if (modes && !(u2->mode & modes))
+ continue;
+ }
+ notice_lang(s_OperServ, u, OPER_USERLIST_RECORD, u2->nick,
+ common_get_vident(u2), common_get_vhost(u2));
+ }
+ }
+ }
+
+ notice_lang(s_OperServ, u, OPER_USERLIST_END);
+ return MOD_CONT;
+}
diff --git a/src/datafiles.c b/src/datafiles.c
new file mode 100644
index 000000000..3af10b1d4
--- /dev/null
+++ b/src/datafiles.c
@@ -0,0 +1,788 @@
+/* Database file handling routines.
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+
+#include "services.h"
+#include "datafiles.h"
+#include <fcntl.h>
+
+static int curday = 0;
+static time_t lastwarn = 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).
+ * @param f dbFile Struct Member
+ * @return int 0 if failure, 1 > is the version number
+ */
+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.
+ * @param f dbFile Struct Member
+ * @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;
+}
+
+/*************************************************************************/
+
+/**
+ * Open the database for reading
+ * @param service If error whom to return the error as
+ * @param filename File to open as the database
+ * @return dbFile struct
+ */
+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);
+ if (time(NULL) - lastwarn > WarningTimeout) {
+ anope_cmd_global(NULL,
+ "Write error on %s: Memory allocation failed",
+ filename);
+ lastwarn = time(NULL);
+ }
+#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 not read %s database %s", service,
+ f->filename);
+ if (time(NULL) - lastwarn > WarningTimeout) {
+ anope_cmd_global(NULL, "Write error on %s: %s", f->filename,
+ strerror(errno));
+ lastwarn = time(NULL);
+ }
+#endif
+ free(f);
+ errno = errno_save;
+ return NULL;
+ }
+ f->fp = fp;
+ f->backupfp = NULL;
+ return f;
+}
+
+/*************************************************************************/
+
+/**
+ * Open the database for writting
+ * @param service If error whom to return the error as
+ * @param filename File to open as the database
+ * @param version Database Version
+ * @return dbFile struct
+ */
+static dbFILE *open_db_write(const char *service, const char *filename,
+ uint32 version)
+{
+ dbFILE *f;
+ int fd;
+#ifdef _WIN32
+ char buffer[_MAX_PATH];
+ char win32filename[MAXPATHLEN];
+
+ /* Get the current working directory: */
+ if (_getcwd(buffer, _MAX_PATH) == NULL) {
+ alog("Warning: Unable to set Current working directory");
+ }
+#endif
+
+ f = scalloc(sizeof(*f), 1);
+ if (!f) {
+#ifndef NOT_MAIN
+ log_perror("Can not read %s database %s", service, filename);
+#else
+ alog("Can not read %s database %s", service, filename);
+#endif
+ return NULL;
+ }
+ strscpy(f->filename, filename, sizeof(f->filename));
+#ifndef _WIN32
+ filename = f->filename;
+#else
+ snprintf(win32filename, sizeof(win32filename), "%s\\%s", buffer,
+ f->filename);
+ filename = win32filename;
+#endif
+ 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;
+ }
+#ifndef _WIN32
+ unlink(filename);
+#else
+ DeleteFile(filename);
+#endif
+ f->backupfp = fopen(filename, "rb");
+#ifdef _WIN32
+ if (!MoveFileExA(filename, f->backupname, MOVEFILE_COPY_ALLOWED)
+ && GetLastError() != ENOENT) {
+ int errno_save = GetLastError();
+#else
+ if (rename(filename, f->backupname) < 0 && errno != ENOENT) {
+ int errno_save = errno;
+#endif
+#ifndef NOT_MAIN
+ static int walloped = 0;
+ if (!walloped) {
+ walloped++;
+ anope_cmd_global(NULL, "Can not back up %s database %s",
+ service, filename);
+ }
+#ifdef _WIN32
+ if (debug) {
+ if (errno == ENOENT) {
+ alog("debug: Error %d (ENOENT) : the file or directory does not exist", errno, filename);
+ } else if (errno == EACCES) {
+ alog("debug: Error %d (EACCES) : error while attempting to access file", errno);
+ } else {
+ alog("debug: Error %d", errno);
+ }
+ }
+#else
+ if (debug) {
+ alog("debug: Error %d", errno);
+ }
+#endif
+ errno = errno_save;
+ log_perror("Can not 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;
+ }
+#ifndef _WIN32
+ unlink(filename);
+#else
+ DeleteFile(filename);
+#endif
+ /* Use open() to avoid people sneaking a new file in under us */
+#ifndef _WIN32
+ fd = open(filename, O_WRONLY | O_CREAT | O_EXCL, 0666);
+#else
+ fd = open(filename, O_WRONLY | O_CREAT | O_EXCL | _O_BINARY, 0666);
+#endif
+ 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++;
+ anope_cmd_global(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);
+#ifndef _WIN32
+ unlink(filename);
+#else
+ DeleteFile(filename);
+#endif
+ }
+ if (*f->backupname && rename(f->backupname, filename) < 0)
+#ifndef NOT_MAIN
+ log_perror("Cannot restore backup copy of %s", filename);
+#else
+ ;
+#endif
+ /* Then the Lord said unto Moses, thou shalt free what thou hast malloced
+ * -- codemastr */
+ free(f);
+ 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.
+ * @param service If error whom to return the error as
+ * @param filename File to open as the database
+ * @param mode Mode for writting or reading
+ * @param version Database Version
+ * @return dbFile struct
+ */
+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.
+ * @param dbFile struct
+ * @return void
+ */
+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)
+#ifndef _WIN32
+ unlink(f->backupname);
+#else
+ DeleteFile(f->backupname);
+#endif
+ }
+ 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.
+ * @param dbFile struct
+ * @return void
+ */
+void close_db(dbFILE * f)
+{
+ if (f->mode == 'w' && *f->backupname
+ && strcmp(f->backupname, f->filename) != 0) {
+ if (f->backupfp)
+ fclose(f->backupfp);
+#ifndef _WIN32
+ unlink(f->backupname);
+#else
+ DeleteFile(f->backupname);
+#endif
+ }
+ 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.
+ *
+ * @param ret 16bit integer to write
+ * @param dbFile struct
+ * @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;
+}
+
+/*************************************************************************/
+
+/**
+ * Write a 16bit integer
+ *
+ * @param ret 16bit integer to write
+ * @param dbFile struct
+ * @return -1 on error, 0 otherwise.
+ */
+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;
+}
+
+/*************************************************************************/
+
+/**
+ * Read a unsigned 32bit integer
+ *
+ * @param ret unsigned 32bit integer to read
+ * @param dbFile struct
+ * @return -1 on error, 0 otherwise.
+ */
+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;
+}
+
+/*************************************************************************/
+
+/**
+ * Write a unsigned 32bit integer
+ *
+ * @param ret unsigned 32bit integer to write
+ * @param dbFile struct
+ * @return -1 on error, 0 otherwise.
+ */
+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;
+}
+
+/*************************************************************************/
+
+/**
+ * Read Pointer
+ *
+ * @param ret pointer to read
+ * @param dbFile struct
+ * @return -1 on error, 0 otherwise.
+ */
+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;
+}
+
+/*************************************************************************/
+
+/**
+ * Write Pointer
+ *
+ * @param ret pointer to write
+ * @param dbFile struct
+ * @return -1 on error, 0 otherwise.
+ */
+int write_ptr(const void *ptr, dbFILE * f)
+{
+ if (fputc(ptr ? 1 : 0, f->fp) == EOF)
+ return -1;
+ return 0;
+}
+
+/*************************************************************************/
+
+/**
+ * Read String
+ *
+ * @param ret string
+ * @param dbFile struct
+ * @return -1 on error, 0 otherwise.
+ */
+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;
+}
+
+/*************************************************************************/
+
+/**
+ * Write String
+ *
+ * @param ret string
+ * @param dbFile struct
+ * @return -1 on error, 0 otherwise.
+ */
+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
+ *
+ * @param name Database to name
+ * @param ext Extention
+ * @return void
+ */
+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);
+ anope_cmd_global(s_OperServ, "WARNING! Backup of %s failed.",
+ name);
+ }
+}
+
+/*************************************************************************/
+
+/**
+ * Removes old databases
+ *
+ * @return void
+ */
+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);
+#ifndef _WIN32
+ unlink(path);
+#else
+ DeleteFile(path);
+#endif
+ snprintf(path, sizeof(path), "backups/%s.%s", ChanDBName, ext);
+#ifndef _WIN32
+ unlink(path);
+#else
+ DeleteFile(path);
+#endif
+ snprintf(path, sizeof(path), "backups/%s.%s", OperDBName, ext);
+#ifndef _WIN32
+ unlink(path);
+#else
+ DeleteFile(path);
+#endif
+ snprintf(path, sizeof(path), "backups/%s.%s", NewsDBName, ext);
+#ifndef _WIN32
+ unlink(path);
+#else
+ DeleteFile(path);
+#endif
+ snprintf(path, sizeof(path), "backups/%s.%s", ExceptionDBName, ext);
+#ifndef _WIN32
+ unlink(path);
+#else
+ DeleteFile(path);
+#endif
+
+ if (s_BotServ) {
+ snprintf(path, sizeof(path), "backups/%s.%s", BotDBName, ext);
+#ifndef _WIN32
+ unlink(path);
+#else
+ DeleteFile(path);
+#endif
+ }
+ if (s_HostServ) {
+ snprintf(path, sizeof(path), "backups/%s.%s", HostDBName, ext);
+#ifndef _WIN32
+ unlink(path);
+#else
+ DeleteFile(path);
+#endif
+ }
+ if (NSEmailReg) {
+ snprintf(path, sizeof(path), "backups/%s.%s", PreNickDBName, ext);
+#ifndef _WIN32
+ unlink(path);
+#else
+ DeleteFile(path);
+#endif
+ }
+}
+
+/*************************************************************************/
+
+/**
+ * Handles database backups.
+ *
+ * @return void
+ */
+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];
+
+ send_event(EVENT_DB_BACKUP, 1, EVENT_START);
+ 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);
+ }
+ if (NSEmailReg) {
+ rename_database(PreNickDBName, ext);
+ }
+ }
+
+ rename_database(OperDBName, ext);
+ rename_database(NewsDBName, ext);
+ rename_database(ExceptionDBName, ext);
+ send_event(EVENT_DB_BACKUP, 1, EVENT_STOP);
+ }
+}
+
+/*************************************************************************/
+
+void ModuleDatabaseBackup(char *dbname)
+{
+
+ 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];
+
+ if (debug) {
+ alog("Module Database Backing up %s", dbname);
+ }
+ ModuleRemoveBackups(dbname);
+ curday = tm.tm_yday;
+ strftime(ext, sizeof(ext), "%Y%m%d", &tm);
+ rename_database(dbname, ext);
+ }
+}
+
+/*************************************************************************/
+
+void ModuleRemoveBackups(char *dbname)
+{
+ 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", dbname, ext);
+#ifndef _WIN32
+ unlink(path);
+#else
+ DeleteFile(path);
+#endif
+}
+
+/*************************************************************************/
diff --git a/src/encrypt.c b/src/encrypt.c
new file mode 100644
index 000000000..9b68ca9d7
--- /dev/null
+++ b/src/encrypt.c
@@ -0,0 +1,122 @@
+/* Include file for high-level encryption routines.
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+
+#include "services.h"
+#include "encrypt.h"
+
+Encryption encryption;
+
+/******************************************************************************/
+void encmodule_encrypt(int (*func)
+ (const char *src, int len, char *dest, int size))
+{
+ encryption.encrypt = func;
+}
+
+void encmodule_encrypt_in_place(int (*func) (char *buf, int size))
+{
+ encryption.encrypt_in_place = func;
+}
+
+void encmodule_encrypt_check_len(int (*func) (int passlen, int bufsize))
+{
+ encryption.encrypt_check_len = func;
+}
+
+void encmodule_decrypt(int (*func) (const char *src, char *dest, int size))
+{
+ encryption.decrypt = func;
+}
+
+void encmodule_check_password(int (*func)
+ (const char *plaintext,
+ const char *password))
+{
+ encryption.check_password = func;
+}
+
+/******************************************************************************/
+
+
+/**
+ * Encrypt string `src' of length `len', placing the result in buffer
+ * `dest' of size `size'. Returns 0 on success, -1 on error.
+ **/
+int enc_encrypt(const char *src, int len, char *dest, int size)
+{
+ if (encryption.encrypt) {
+ return encryption.encrypt(src, len, dest, size);
+ }
+ return -1;
+}
+
+/**
+ * Encrypt null-terminated string stored in buffer `buf' of size `size',
+ * placing the result in the same buffer. Returns 0 on success, -1 on
+ * error.
+ **/
+int enc_encrypt_in_place(char *buf, int size)
+{
+ if (encryption.encrypt_in_place) {
+ return encryption.encrypt_in_place(buf, size);
+ }
+ return -1;
+}
+
+/**
+ * Check whether the result of encrypting a password of length `passlen'
+ * will fit in a buffer of size `bufsize'. Returns 0 if the encrypted
+ * password would fit in the buffer, otherwise returns the maximum length
+ * password that would fit (this value will be smaller than `passlen').
+ * If the result of encrypting even a 1-byte password would exceed the
+ * specified buffer size, generates a fatal error.
+ **/
+int enc_encrypt_check_len(int passlen, int bufsize)
+{
+ if (encryption.encrypt_check_len) {
+ return encryption.encrypt_check_len(passlen, bufsize);
+ }
+ return -1;
+}
+
+/**
+ * Decrypt encrypted string `src' into buffer `dest' of length `len'.
+ * Returns 1 (not 0) on success, 0 if the encryption algorithm does not
+ * allow decryption, and -1 if another failure occurred (e.g. destination
+ * buffer too small).
+ **/
+int enc_decrypt(const char *src, char *dest, int size)
+{
+ if (encryption.decrypt) {
+ return encryption.decrypt(src, dest, size);
+ }
+ return -1;
+}
+
+/**
+ * Check an input password `plaintext' against a stored, encrypted password
+ * `password'. Return value is:
+ * 1 if the password matches
+ * 0 if the password does not match
+ * -1 if an error occurred while checking
+ **/
+int enc_check_password(const char *plaintext, const char *password)
+{
+ if (encryption.check_password) {
+ return encryption.check_password(plaintext, password);
+ }
+ return -1;
+}
+
+/* EOF */
diff --git a/src/events.c b/src/events.c
new file mode 100644
index 000000000..1df4dfe2d
--- /dev/null
+++ b/src/events.c
@@ -0,0 +1,787 @@
+/* Events functions.
+ *
+ * (C) 2004-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ *
+ */
+
+#include "modules.h"
+#include "language.h"
+#include "version.h"
+
+char *mod_current_evtbuffer = NULL;
+
+EvtMessageHash *EVENT[MAX_CMD_HASH];
+EvtHookHash *EVENTHOOKS[MAX_CMD_HASH];
+
+EvtMessage *find_event(const char *name)
+{
+ EvtMessage *m;
+ m = findEventHandler(EVENT, name);
+ return m;
+}
+
+EvtHook *find_eventhook(const char *name)
+{
+ EvtHook *m;
+ m = findEventHook(EVENTHOOKS, name);
+ return m;
+}
+
+void send_event(const char *name, int argc, ...)
+{
+ va_list va;
+ char *a;
+ int idx = 0;
+ char **argv;
+
+ argv = (char **) malloc(sizeof(char *) * argc);
+ va_start(va, argc);
+ for (idx = 0; idx < argc; idx++) {
+ a = va_arg(va, char *);
+ argv[idx] = sstrdup(a);
+ }
+ va_end(va);
+
+ if (debug)
+ alog("debug: Emitting event \"%s\" (%d args)", name, argc);
+
+ event_process_hook(name, argc, argv);
+
+ /**
+ * Now that the events have seen the message, free it up
+ **/
+ for (idx = 0; idx < argc; idx++) {
+ free(argv[idx]);
+ }
+ free(argv);
+}
+
+void eventprintf(char *fmt, ...)
+{
+ va_list args;
+ char buf[16384]; /* Really huge, to try and avoid truncation */
+ char *event;
+
+ va_start(args, fmt);
+ vsnprintf(buf, sizeof(buf), fmt, args);
+ event = sstrdup(buf);
+ event_message_process(event);
+ va_end(args);
+ if (event) {
+ free(event);
+ }
+ return;
+}
+
+void event_message_process(char *eventbuf)
+{
+ int retVal = 0;
+ EvtMessage *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;
+ EvtMessage *evm;
+
+ /* zero out the buffers before we do much else */
+ *buf = '\0';
+ *source = '\0';
+ *cmd = '\0';
+
+ strscpy(buf, eventbuf, 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);
+
+ /* Do something with the message. */
+ evm = find_event(cmd);
+ if (evm) {
+ if (evm->func) {
+ mod_current_module_name = evm->mod_name;
+ retVal = evm->func(source, ac, av);
+ mod_current_module_name = NULL;
+ if (retVal == MOD_CONT) {
+ current = evm->next;
+ while (current && current->func && retVal == MOD_CONT) {
+ mod_current_module_name = current->mod_name;
+ retVal = current->func(source, ac, av);
+ mod_current_module_name = NULL;
+ current = current->next;
+ }
+ }
+ }
+ }
+ /* Free argument list we created */
+ free(av);
+}
+
+void event_process_hook(const char *name, int argc, char **argv)
+{
+ int retVal = 0;
+ EvtHook *current = NULL;
+ EvtHook *evh;
+ if (mod_current_evtbuffer) {
+ free(mod_current_evtbuffer);
+ }
+ /* Do something with the message. */
+ evh = find_eventhook(name);
+ if (evh) {
+ if (evh->func) {
+ mod_current_module_name = evh->mod_name;
+ retVal = evh->func(argc, argv);
+ mod_current_module_name = NULL;
+ if (retVal == MOD_CONT) {
+ current = evh->next;
+ while (current && current->func && retVal == MOD_CONT) {
+ mod_current_module_name = current->mod_name;
+ retVal = current->func(argc, argv);
+ mod_current_module_name = NULL;
+ current = current->next;
+ }
+ }
+ }
+ }
+}
+
+/**
+ * Displays a message list for a given message.
+ * Again this is of little use other than debugging.
+ * @param m the message to display
+ * @return 0 is returned and has no meaning
+ */
+int displayEventMessage(EvtMessage * evm)
+{
+ EvtMessage *msg = NULL;
+ int i = 0;
+ alog("Displaying message list for %s", evm->name);
+ for (msg = evm; msg; msg = msg->next) {
+ alog("%d: 0x%p", ++i, (void *) msg);
+ }
+ alog("end");
+ return 0;
+}
+
+/**
+ * Displays a message list for a given message.
+ * Again this is of little use other than debugging.
+ * @param m the message to display
+ * @return 0 is returned and has no meaning
+ */
+int displayEventHook(EvtHook * evh)
+{
+ EvtHook *msg = NULL;
+ int i = 0;
+ alog("Displaying message list for %s", evh->name);
+ for (msg = evh; msg; msg = msg->next) {
+ alog("%d: 0x%p", ++i, (void *) msg);
+ }
+ alog("end");
+ return 0;
+}
+
+/**
+ * Display the message call stak.
+ * Prints the call stack for a message based on the message name, again useful for debugging and little lese :)
+ * @param name the name of the message to print info for
+ * @return the return int has no relevence atm :)
+ */
+int displayHookFromHash(char *name)
+{
+ EvtHookHash *current = NULL;
+ int index = 0;
+ index = CMD_HASH(name);
+ if (debug > 1) {
+ alog("debug: trying to display message %s", name);
+ }
+ for (current = EVENTHOOKS[index]; current; current = current->next) {
+ if (stricmp(name, current->name) == 0) {
+ displayEventHook(current->evh);
+ }
+ }
+ if (debug > 1) {
+ alog("debug: done displaying message %s", name);
+ }
+ return 0;
+}
+
+/**
+ * Display the message call stak.
+ * Prints the call stack for a message based on the message name, again useful for debugging and little lese :)
+ * @param name the name of the message to print info for
+ * @return the return int has no relevence atm :)
+ */
+int displayEvtMessageFromHash(char *name)
+{
+ EvtMessageHash *current = NULL;
+ int index = 0;
+ index = CMD_HASH(name);
+ if (debug > 1) {
+ alog("debug: trying to display message %s", name);
+ }
+ for (current = EVENT[index]; current; current = current->next) {
+ if (stricmp(name, current->name) == 0) {
+ displayEventMessage(current->evm);
+ }
+ }
+ if (debug > 1) {
+ alog("debug: done displaying message %s", name);
+ }
+ return 0;
+}
+
+/*******************************************************************************
+ * Message Functions
+ *******************************************************************************/
+
+ /**
+ * Create a new Message struct.
+ * @param name the name of the message
+ * @param func a pointer to the function to call when we recive this message
+ * @return a new Message object
+ **/
+EvtMessage *createEventHandler(char *name,
+ int (*func) (char *source, int ac,
+ char **av))
+{
+ EvtMessage *evm = NULL;
+ if (!func) {
+ return NULL;
+ }
+ if ((evm = malloc(sizeof(EvtMessage))) == NULL) {
+ fatal("Out of memory!");
+ }
+ evm->name = sstrdup(name);
+ evm->func = func;
+ evm->mod_name = NULL;
+ evm->next = NULL;
+ return evm;
+}
+
+ /**
+ * Create a new Message struct.
+ * @param name the name of the message
+ * @param func a pointer to the function to call when we recive this message
+ * @return a new Message object
+ **/
+EvtHook *createEventHook(char *name, int (*func) (int argc, char **argv))
+{
+ EvtHook *evh = NULL;
+ if (!func) {
+ return NULL;
+ }
+ if ((evh = malloc(sizeof(EvtHook))) == NULL) {
+ fatal("Out of memory!");
+ }
+ evh->name = sstrdup(name);
+ evh->func = func;
+ evh->mod_name = NULL;
+ evh->next = NULL;
+ return evh;
+}
+
+/**
+ * find a message in the given table.
+ * Looks up the message <name> in the MessageHash given
+ * @param MessageHash the message table to search for this command, will almost always be IRCD
+ * @param name the name of the command were looking for
+ * @return NULL if we cant find it, or a pointer to the Message if we can
+ **/
+EvtMessage *findEventHandler(EvtMessageHash * msgEvtTable[],
+ const char *name)
+{
+ int idx;
+ EvtMessageHash *current = NULL;
+ if (!msgEvtTable || !name) {
+ return NULL;
+ }
+ idx = CMD_HASH(name);
+
+ for (current = msgEvtTable[idx]; current; current = current->next) {
+ if (stricmp(name, current->name) == 0) {
+ return current->evm;
+ }
+ }
+ return NULL;
+}
+
+/**
+ * find a message in the given table.
+ * Looks up the message <name> in the MessageHash given
+ * @param MessageHash the message table to search for this command, will almost always be IRCD
+ * @param name the name of the command were looking for
+ * @return NULL if we cant find it, or a pointer to the Message if we can
+ **/
+EvtHook *findEventHook(EvtHookHash * hookEvtTable[], const char *name)
+{
+ int idx;
+ EvtHookHash *current = NULL;
+ if (!hookEvtTable || !name) {
+ return NULL;
+ }
+ idx = CMD_HASH(name);
+
+ for (current = hookEvtTable[idx]; current; current = current->next) {
+ if (stricmp(name, current->name) == 0) {
+ return current->evh;
+ }
+ }
+ return NULL;
+}
+
+/**
+ * Add the given message (m) to the MessageHash marking it as a core command
+ * @param msgTable the MessageHash we want to add to
+ * @param m the Message we are adding
+ * @return MOD_ERR_OK on a successful add.
+ **/
+int addCoreEventHandler(EvtMessageHash * msgEvtTable[], EvtMessage * evm)
+{
+ if (!msgEvtTable || !evm) {
+ return MOD_ERR_PARAMS;
+ }
+ evm->core = 1;
+ return addEventHandler(msgEvtTable, evm);
+}
+
+/**
+ * Add a message to the MessageHash.
+ * @param msgTable the MessageHash we want to add a message to
+ * @param m the Message we want to add
+ * @return MOD_ERR_OK on a successful add.
+ **/
+int addEventHandler(EvtMessageHash * msgEvtTable[], EvtMessage * evm)
+{
+ /* We can assume both param's have been checked by this point.. */
+ int index = 0;
+ EvtMessageHash *current = NULL;
+ EvtMessageHash *newHash = NULL;
+ EvtMessageHash *lastHash = NULL;
+
+ if (!msgEvtTable || !evm) {
+ return MOD_ERR_PARAMS;
+ }
+
+ index = CMD_HASH(evm->name);
+
+ for (current = msgEvtTable[index]; current; current = current->next) {
+ if (stricmp(evm->name, current->name) == 0) { /* the msg exist's we are a addHead */
+ evm->next = current->evm;
+ current->evm = evm;
+ if (debug)
+ alog("debug: existing msg: (0x%p), new msg (0x%p)",
+ (void *) evm->next, (void *) evm);
+ return MOD_ERR_OK;
+ }
+ lastHash = current;
+ }
+
+ if ((newHash = malloc(sizeof(EvtMessageHash))) == NULL) {
+ fatal("Out of memory");
+ }
+ newHash->next = NULL;
+ newHash->name = sstrdup(evm->name);
+ newHash->evm = evm;
+
+ if (lastHash == NULL)
+ msgEvtTable[index] = newHash;
+ else
+ lastHash->next = newHash;
+ return MOD_ERR_OK;
+}
+
+/**
+ * Add a message to the MessageHash.
+ * @param msgTable the MessageHash we want to add a message to
+ * @param m the Message we want to add
+ * @return MOD_ERR_OK on a successful add.
+ **/
+int addEventHook(EvtHookHash * hookEvtTable[], EvtHook * evh)
+{
+ /* We can assume both param's have been checked by this point.. */
+ int index = 0;
+ EvtHookHash *current = NULL;
+ EvtHookHash *newHash = NULL;
+ EvtHookHash *lastHash = NULL;
+
+ if (!hookEvtTable || !evh) {
+ return MOD_ERR_PARAMS;
+ }
+
+ index = CMD_HASH(evh->name);
+
+ for (current = hookEvtTable[index]; current; current = current->next) {
+ if (stricmp(evh->name, current->name) == 0) { /* the msg exist's we are a addHead */
+ evh->next = current->evh;
+ current->evh = evh;
+ if (debug)
+ alog("debug: existing msg: (0x%p), new msg (0x%p)",
+ (void *) evh->next, (void *) evh);
+ return MOD_ERR_OK;
+ }
+ lastHash = current;
+ }
+
+ if ((newHash = malloc(sizeof(EvtHookHash))) == NULL) {
+ fatal("Out of memory");
+ }
+ newHash->next = NULL;
+ newHash->name = sstrdup(evh->name);
+ newHash->evh = evh;
+
+ if (lastHash == NULL)
+ hookEvtTable[index] = newHash;
+ else
+ lastHash->next = newHash;
+ return MOD_ERR_OK;
+}
+
+/**
+ * Add the given message (m) to the MessageHash marking it as a core command
+ * @param msgTable the MessageHash we want to add to
+ * @param m the Message we are adding
+ * @return MOD_ERR_OK on a successful add.
+ **/
+int addCoreEventHook(EvtHookHash * hookEvtTable[], EvtHook * evh)
+{
+ if (!hookEvtTable || !evh) {
+ return MOD_ERR_PARAMS;
+ }
+ evh->core = 1;
+ return addEventHook(hookEvtTable, evh);
+}
+
+/**
+ * Add a module message to the IRCD message hash
+ * @param m the Message to add
+ * @param pos the Position to add the message to, e.g. MOD_HEAD, MOD_TAIL, MOD_UNIQUE
+ * @return MOD_ERR_OK on success, althing else on fail.
+ **/
+int moduleAddEventHandler(EvtMessage * evm)
+{
+ int status;
+
+ if (!evm) {
+ return MOD_ERR_PARAMS;
+ }
+
+ /* ok, this appears to be a module adding a message from outside of AnopeInit, try to look up its module struct for it */
+ if ((mod_current_module_name) && (!mod_current_module)) {
+ mod_current_module = findModule(mod_current_module_name);
+ }
+
+ if (!mod_current_module) {
+ return MOD_ERR_UNKNOWN;
+ } /* shouldnt happen */
+ evm->core = 0;
+ if (!evm->mod_name) {
+ evm->mod_name = sstrdup(mod_current_module->name);
+ }
+
+ status = addEventHandler(EVENT, evm);
+ if (debug) {
+ displayEvtMessageFromHash(evm->name);
+ }
+ return status;
+}
+
+/**
+ * Add a module message to the IRCD message hash
+ * @param m the Message to add
+ * @param pos the Position to add the message to, e.g. MOD_HEAD, MOD_TAIL, MOD_UNIQUE
+ * @return MOD_ERR_OK on success, althing else on fail.
+ **/
+int moduleAddEventHook(EvtHook * evh)
+{
+ int status;
+
+ if (!evh) {
+ return MOD_ERR_PARAMS;
+ }
+
+ if ((mod_current_module_name) && (!mod_current_module)) {
+ mod_current_module = findModule(mod_current_module_name);
+ }
+
+ if (!mod_current_module) {
+ return MOD_ERR_UNKNOWN;
+ } /* shouldnt happen */
+ evh->core = 0;
+ if (!evh->mod_name) {
+ evh->mod_name = sstrdup(mod_current_module->name);
+ }
+
+ status = addEventHook(EVENTHOOKS, evh);
+ if (debug) {
+ displayHookFromHash(evh->name);
+ }
+ return status;
+}
+
+/**
+ * remove the given message from the IRCD message hash
+ * @param name the name of the message to remove
+ * @return MOD_ERR_OK on success, althing else on fail.
+ **/
+int moduleEventDelHandler(char *name)
+{
+ EvtMessage *evm;
+ int status;
+
+ if (!mod_current_module) {
+ return MOD_ERR_UNKNOWN;
+ }
+ evm = findEventHandler(EVENT, name);
+ if (!evm) {
+ return MOD_ERR_NOEXIST;
+ }
+
+ status = delEventHandler(EVENT, evm, mod_current_module->name);
+ if (debug) {
+ displayEvtMessageFromHash(evm->name);
+ }
+ return status;
+}
+
+/**
+ * remove the given message from the IRCD message hash
+ * @param name the name of the message to remove
+ * @return MOD_ERR_OK on success, althing else on fail.
+ **/
+int moduleEventDelHook(const char *name)
+{
+ EvtHook *evh;
+ int status;
+
+ if (!mod_current_module) {
+ return MOD_ERR_UNKNOWN;
+ }
+ evh = findEventHook(EVENTHOOKS, name);
+ if (!evh) {
+ return MOD_ERR_NOEXIST;
+ }
+
+ status = delEventHook(EVENTHOOKS, evh, mod_current_module->name);
+ if (debug) {
+ displayHookFromHash(evh->name);
+ }
+ return status;
+}
+
+/**
+ * remove the given message from the given message hash, for the given module
+ * @param msgTable which MessageHash we are removing from
+ * @param m the Message we want to remove
+ * @mod_name the name of the module we are removing
+ * @return MOD_ERR_OK on success, althing else on fail.
+ **/
+int delEventHandler(EvtMessageHash * msgEvtTable[], EvtMessage * evm,
+ char *mod_name)
+{
+ int index = 0;
+ EvtMessageHash *current = NULL;
+ EvtMessageHash *lastHash = NULL;
+ EvtMessage *tail = NULL, *last = NULL;
+
+ if (!evm || !msgEvtTable) {
+ return MOD_ERR_PARAMS;
+ }
+
+ index = CMD_HASH(evm->name);
+
+ for (current = msgEvtTable[index]; current; current = current->next) {
+ if (stricmp(evm->name, current->name) == 0) {
+ if (!lastHash) {
+ tail = current->evm;
+ 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->evm = tail->next;
+ }
+ return MOD_ERR_OK;
+ }
+ last = tail;
+ tail = tail->next;
+ }
+ } else {
+ msgEvtTable[index] = current->next;
+ free(current->name);
+ return MOD_ERR_OK;
+ }
+ } else {
+ tail = current->evm;
+ 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->evm = 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;
+}
+
+
+/**
+ * remove the given message from the given message hash, for the given module
+ * @param msgTable which MessageHash we are removing from
+ * @param m the Message we want to remove
+ * @mod_name the name of the module we are removing
+ * @return MOD_ERR_OK on success, althing else on fail.
+ **/
+int delEventHook(EvtHookHash * hookEvtTable[], EvtHook * evh,
+ char *mod_name)
+{
+ int index = 0;
+ EvtHookHash *current = NULL;
+ EvtHookHash *lastHash = NULL;
+ EvtHook *tail = NULL, *last = NULL;
+
+ if (!evh || !hookEvtTable) {
+ return MOD_ERR_PARAMS;
+ }
+
+ index = CMD_HASH(evh->name);
+
+ for (current = hookEvtTable[index]; current; current = current->next) {
+ if (stricmp(evh->name, current->name) == 0) {
+ if (!lastHash) {
+ tail = current->evh;
+ 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->evh = tail->next;
+ }
+ return MOD_ERR_OK;
+ }
+ last = tail;
+ tail = tail->next;
+ }
+ } else {
+ hookEvtTable[index] = current->next;
+ free(current->name);
+ return MOD_ERR_OK;
+ }
+ } else {
+ tail = current->evh;
+ 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->evh = 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;
+}
+
+
+/**
+ * Destory a message, freeing its memory.
+ * @param m the message to be destroyed
+ * @return MOD_ERR_SUCCESS on success
+ **/
+int destroyEventHandler(EvtMessage * evm)
+{
+ if (!evm) {
+ return MOD_ERR_PARAMS;
+ }
+ if (evm->name) {
+ free(evm->name);
+ }
+ evm->func = NULL;
+ if (evm->mod_name) {
+ free(evm->mod_name);
+ }
+ evm->next = NULL;
+ return MOD_ERR_OK;
+}
+
+/**
+ * Destory a message, freeing its memory.
+ * @param m the message to be destroyed
+ * @return MOD_ERR_SUCCESS on success
+ **/
+int destroyEventHook(EvtHook * evh)
+{
+ if (!evh) {
+ return MOD_ERR_PARAMS;
+ }
+ if (evh->name) {
+ free(evh->name);
+ }
+ evh->func = NULL;
+ if (evh->mod_name) {
+ free(evh->mod_name);
+ }
+ evh->next = NULL;
+ return MOD_ERR_OK;
+}
diff --git a/src/helpserv.c b/src/helpserv.c
new file mode 100644
index 000000000..eaadf1566
--- /dev/null
+++ b/src/helpserv.c
@@ -0,0 +1,69 @@
+/* HelpServ functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+
+/*************************************************************************/
+#include "services.h"
+#include "pseudo.h"
+
+void moduleAddHelpServCmds(void);
+
+/*************************************************************************/
+
+/**
+ * Setup the commands for HelpServ
+ * @return void
+ */
+void moduleAddHelpServCmds(void)
+{
+ modules_core_init(HelpServCoreNumber, HelpServCoreModules);
+}
+
+/*************************************************************************/
+
+/**
+ * HelpServ initialization.
+ * @return void
+ */
+void helpserv_init(void)
+{
+ moduleAddHelpServCmds();
+}
+
+/*************************************************************************/
+
+/**
+ * Main HelpServ routine.
+ * @param u User Struct of the user sending the PRIVMSG
+ * @param buf Buffer containing the PRIVMSG data
+ * @return void
+ */
+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 = "";
+ }
+ anope_cmd_ctcp(s_HelpServ, u->nick, "PING %s", s);
+ } else {
+ mod_run_cmd(s_HelpServ, u, HELPSERV, cmd);
+ }
+}
+
+/*************************************************************************/
diff --git a/src/hostserv.c b/src/hostserv.c
new file mode 100644
index 000000000..bdb6dbba3
--- /dev/null
+++ b/src/hostserv.c
@@ -0,0 +1,655 @@
+/* HostServ functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+
+/*************************************************************************/
+#include "services.h"
+#include "pseudo.h"
+
+#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);
+
+HostCore *head = NULL; /* head of the HostCore list */
+
+E int do_hs_sync(NickCore * nc, char *vIdent, char *hostmask,
+ char *creator, time_t time);
+
+E void moduleAddHostServCmds(void);
+
+/*************************************************************************/
+
+void moduleAddHostServCmds(void)
+{
+ modules_core_init(HostServCoreNumber, HostServCoreModules);
+}
+
+/*************************************************************************/
+
+/**
+ * Return information on memory use.
+ * Assumes pointers are valid.
+ **/
+
+void get_hostserv_stats(long *nrec, long *memuse)
+{
+ long count = 0, mem = 0;
+ int i;
+ HostCore *hc;
+
+ for (hc = head; hc; hc = hc->next) {
+ count++;
+ mem += sizeof(*hc);
+ if (hc->nick)
+ mem += strlen(hc->nick) + 1;
+ if (hc->vIdent)
+ mem += strlen(hc->vIdent) + 1;
+ if (hc->vHost)
+ mem += strlen(hc->vHost) + 1;
+ if (hc->creator)
+ mem += strlen(hc->creator) + 1;
+ }
+
+ *nrec = count;
+ *memuse = mem;
+}
+
+/*************************************************************************/
+
+/**
+ * HostServ initialization.
+ * @return void
+ */
+void hostserv_init(void)
+{
+ if (s_HostServ) {
+ moduleAddHostServCmds();
+ }
+}
+
+/*************************************************************************/
+
+/**
+ * Main HostServ routine.
+ * @param u User Struct
+ * @param buf Buffer holding the message
+ * @return void
+ */
+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 = "";
+ }
+ anope_cmd_ctcp(s_HostServ, u->nick, "PING %s", s);
+ } else if (skeleton) {
+ notice_lang(s_HostServ, u, SERVICE_OFFLINE, s_HostServ);
+ } else {
+ if (ircd->vhost) {
+ mod_run_cmd(s_HostServ, u, HOSTSERV, cmd);
+ } else {
+ notice_lang(s_HostServ, u, SERVICE_OFFLINE, s_HostServ);
+ }
+ }
+}
+
+/*************************************************************************/
+/* Start of Linked List routines */
+/*************************************************************************/
+
+HostCore *hostCoreListHead()
+{
+ return head;
+}
+
+/**
+ * Create HostCore list member
+ * @param next HostCore next slot
+ * @param nick Nick to add
+ * @param vIdent Virtual Ident
+ * @param vHost Virtual Host
+ * @param creator Person whom set the vhost
+ * @param time Time the vhost was Set
+ * @return HostCore
+ */
+HostCore *createHostCorelist(HostCore * next, char *nick, char *vIdent,
+ char *vHost, char *creator, int32 tmp_time)
+{
+
+ next = malloc(sizeof(HostCore));
+ if (next == NULL) {
+ anope_cmd_global(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)) {
+ anope_cmd_global(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)) {
+ anope_cmd_global(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..
+ * @param head HostCore head
+ * @param nick Nick to find
+ * @param found If found
+ * @return HostCore
+ */
+HostCore *findHostCore(HostCore * head, char *nick, boolean * found)
+{
+ HostCore *previous, *current;
+
+ *found = false;
+ current = head;
+ previous = current;
+
+ if (!nick) {
+ return NULL;
+ }
+
+ 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;
+
+ if (!nick || !vHost || !creator) {
+ return NULL;
+ }
+
+ newCore = malloc(sizeof(HostCore));
+ if (newCore == NULL) {
+ anope_cmd_global(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)) {
+ anope_cmd_global(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)) {
+ anope_cmd_global(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;
+}
+
+/*************************************************************************/
+void delHostCore(char *nick)
+{
+#ifdef USE_RDB
+ static char clause[128];
+ char *q_nick;
+#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()) {
+ q_nick = rdb_quote(nick);
+ snprintf(clause, sizeof(clause), "nick='%s'", q_nick);
+ if (rdb_scrub_table("anope_hs_core", clause) == 0)
+ alog("Unable to scrub table 'anope_hs_core' - HostServ RDB update failed.");
+ rdb_close();
+ free(q_nick);
+ }
+#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);
+
+ 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;
+ uint32 time;
+
+ 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;
+ uint32 time;
+
+ 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) { \
+ anope_cmd_global(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;
+
+ if (rdb_tag_table("anope_hs_core") == 0) {
+ alog("Unable to tag table 'anope_hs_core' - HostServ RDB save failed.");
+ rdb_close();
+ return;
+ }
+
+ current = head;
+ while (current != NULL) {
+ if (rdb_save_hs_core(current) == 0) {
+ alog("Unable to save HostCore for %s - HostServ RDB save failed.", current->nick);
+ rdb_close();
+ return;
+ }
+ current = current->next;
+ }
+
+ if (rdb_clean_table("anope_hs_core") == 0)
+ alog("Unable to clean table 'anope_hs_core' - HostServ RDB save failed.");
+
+ rdb_close();
+#endif
+}
+
+/*************************************************************************/
+/* End of Load/Save Functions */
+/*************************************************************************/
+/*************************************************************************/
+/* Start of Generic Functions */
+/*************************************************************************/
+
+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;
+}
+
+/*************************************************************************/
+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);
+ }
+ anope_cmd_vhost_on(u->nick, vIdent, vHost);
+ if (ircd->vhost) {
+ u->vhost = sstrdup(vHost);
+ }
+ if (ircd->vident) {
+ if (vIdent)
+ u->vident = sstrdup(vIdent);
+ }
+ set_lastmask(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(common_get_vident(u)) +
+ strlen(common_get_vhost(u)) + 2);
+ sprintf(u->na->last_usermask, "%s@%s", common_get_vident(u),
+ common_get_vhost(u));
+
+}
diff --git a/src/init.c b/src/init.c
new file mode 100644
index 000000000..527df792a
--- /dev/null
+++ b/src/init.c
@@ -0,0 +1,789 @@
+/* Initalization and related routines.
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+
+#include "services.h"
+#include "pseudo.h"
+int servernum = 0;
+
+extern void moduleAddMsgs(void);
+extern void moduleAddIRCDMsgs(void);
+
+/*************************************************************************/
+
+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
+
+ /* Introduce OperServ first because on some IRCd's send
+ * we send data from OperServ before introduction completes.
+ * Patch fixing ratbox RESV support provided by Jobe. */
+ if (!user || stricmp(user, s_OperServ) == 0) {
+ anope_cmd_nick(s_OperServ, desc_OperServ, ircd->operservmode);
+ }
+
+ /* NickServ */
+ if (!user || stricmp(user, s_NickServ) == 0) {
+ anope_cmd_nick(s_NickServ, desc_NickServ, ircd->nickservmode);
+ }
+
+ /* ChanServ */
+ if (!user || stricmp(user, s_ChanServ) == 0) {
+ anope_cmd_nick(s_ChanServ, desc_ChanServ, ircd->chanservmode);
+ }
+ if (s_HostServ && ircd->vhost
+ && (!user || stricmp(user, s_HostServ) == 0)) {
+ anope_cmd_nick(s_HostServ, desc_HostServ, ircd->hostservmode);
+ }
+
+ if (!user || stricmp(user, s_MemoServ) == 0) {
+ anope_cmd_nick(s_MemoServ, desc_MemoServ, ircd->memoservmode);
+ }
+
+ if (s_BotServ && (!user || stricmp(user, s_BotServ) == 0)) {
+ anope_cmd_nick(s_BotServ, desc_BotServ, ircd->botservmode);
+ }
+
+ if (!user || stricmp(user, s_HelpServ) == 0) {
+ anope_cmd_nick(s_HelpServ, desc_HelpServ, ircd->helpservmode);
+ }
+
+ if (s_DevNull && (!user || stricmp(user, s_DevNull) == 0)) {
+ anope_cmd_nick(s_DevNull, desc_DevNull, ircd->devnullmode);
+ }
+
+ if (!user || stricmp(user, s_GlobalNoticer) == 0) {
+ anope_cmd_nick(s_GlobalNoticer, desc_GlobalNoticer,
+ ircd->globalmode);
+ }
+
+ /* We make aliases go online */
+ if (s_NickServAlias && (!user || stricmp(user, s_NickServAlias) == 0)) {
+ anope_cmd_nick(s_NickServAlias, desc_NickServAlias,
+ ircd->nickservaliasmode);
+ }
+
+ if (s_ChanServAlias && (!user || stricmp(user, s_ChanServAlias) == 0)) {
+ anope_cmd_nick(s_ChanServAlias, desc_ChanServAlias,
+ ircd->chanservaliasmode);
+ }
+
+ if (s_MemoServAlias && (!user || stricmp(user, s_MemoServAlias) == 0)) {
+ anope_cmd_nick(s_MemoServAlias, desc_MemoServAlias,
+ ircd->memoservaliasmode);
+ }
+
+ if (s_BotServAlias && (!user || stricmp(user, s_BotServAlias) == 0)) {
+ anope_cmd_nick(s_BotServAlias, desc_BotServAlias,
+ ircd->botservaliasmode);
+ }
+
+ if (s_HelpServAlias && (!user || stricmp(user, s_HelpServAlias) == 0)) {
+ anope_cmd_nick(s_HelpServAlias, desc_HelpServAlias,
+ ircd->helpservaliasmode);
+ }
+
+ if (s_OperServAlias && (!user || stricmp(user, s_OperServAlias) == 0)) {
+ anope_cmd_nick(s_OperServAlias, desc_OperServAlias,
+ ircd->operservaliasmode);
+ }
+
+ if (s_DevNullAlias && (!user || stricmp(user, s_DevNullAlias) == 0)) {
+ anope_cmd_nick(s_DevNullAlias, desc_DevNullAlias,
+ ircd->devnullvaliasmode);
+ }
+ if (s_HostServAlias && ircd->vhost
+ && (!user || stricmp(user, s_HostServAlias) == 0)) {
+ anope_cmd_nick(s_HostServAlias, desc_HostServAlias,
+ ircd->hostservaliasmode);
+ }
+ if (s_GlobalNoticerAlias
+ && (!user || stricmp(user, s_GlobalNoticerAlias) == 0)) {
+ anope_cmd_nick(s_GlobalNoticerAlias, desc_GlobalNoticerAlias,
+ ircd->globalaliasmode);
+ }
+
+ /* 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))
+ anope_cmd_bot_nick(bi->nick, bi->user, bi->host,
+ bi->real, ircd->botserv_bot_mode);
+ }
+ }
+}
+
+/*************************************************************************/
+
+/* 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];
+ } else if (strcmp(s, "version") == 0) {
+ fprintf(stdout, "Anope-%s %s -- %s\n", version_number,
+ version_flags, version_build);
+ exit(EXIT_SUCCESS);
+ }
+ }
+ }
+ 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) {
+ int portnum;
+ *t++ = 0;
+ portnum = atoi(t);
+ if ((portnum > 0) && (portnum < 65535))
+ RemotePort = portnum;
+ else {
+ fprintf(stderr,
+ "-remote: Port numbers must be in the range 1..65535. Using default.\n");
+ 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) {
+ int portnum;
+ *t++ = 0;
+ portnum = atoi(t);
+ if ((portnum >= 0) && (portnum < 65535))
+ LocalPort = portnum;
+ else {
+ fprintf(stderr,
+ "-local: Port numbers must be in the range 1..65535 or 0. Using default.\n");
+ 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\n");
+ 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) {
+ if (!LogChannel) {
+ fprintf(stderr,
+ "-logchan: LogChannel must be defined in services.conf\n");
+ } else { /* LogChannel */
+
+ logchan = 1;
+ }
+ } else if (strcmp(s, "forceload") == 0) {
+ forceload = 1;
+ } else if (strcmp(s, "nothird") == 0) {
+ nothird = 1;
+ } else if (strcmp(s, "protocoldebug") == 0) {
+ protocoldebug = 1;
+ } else if (strcmp(s, "support") == 0) {
+ nofork = 1;
+ debug++;
+ nothird = 1;
+ } else if (!strcmp(s, "noexpire")) {
+ noexpire = 1;
+ } else if (!strcmp(s, "help")) {
+ fprintf(stdout, "Anope-%s %s -- %s\n", version_number,
+ version_flags, version_build);
+ fprintf(stdout,
+ "Anope IRC Services (http://www.anope.org)\n");
+ fprintf(stdout, "Usage ./services [options] ...\n");
+ fprintf(stdout,
+ "-remote -remote hostname[:port]\n");
+ fprintf(stdout, "-local -local hostname[:port]\n");
+ fprintf(stdout, "-name -name servername\n");
+ fprintf(stdout, "-desc -desc serverdesc\n");
+ fprintf(stdout, "-user -user serviceuser\n");
+ fprintf(stdout, "-host -host servicehost\n");
+ fprintf(stdout,
+ "-update -update updatetime(secs)\n");
+ fprintf(stdout,
+ "-expire -expire expiretime(secs)\n");
+ fprintf(stdout, "-debug -debug\n");
+ fprintf(stdout, "-nofork -nofork\n");
+ fprintf(stdout, "-logchan -logchan channelname\n");
+ fprintf(stdout, "-skeleton -skeleton\n");
+ fprintf(stdout, "-forceload -forceload\n");
+ fprintf(stdout, "-nothird -nothird\n");
+ fprintf(stdout, "-support -support\n");
+ fprintf(stdout, "-readonly -readonly\n");
+ fprintf(stdout, "-noexpire -noexpire\n");
+ fprintf(stdout, "-version -version\n");
+ fprintf(stdout, "-help -help\n");
+ fprintf(stdout, "-log -log logfilename\n");
+ fprintf(stdout,
+ "-dir -dir servicesdirectory\n\n");
+ fprintf(stdout,
+ "Further support is available from http://www.anope.org\n");
+ fprintf(stdout,
+ "Or visit US on IRC at irc.anope.org #anope\n");
+ exit(EXIT_SUCCESS);
+ } 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 routines. Return 0 on success, -1 on failure. */
+
+int openlog_failed = 0, openlog_errno = 0;
+
+int init_primary(int ac, char **av)
+{
+ int started_from_term = isatty(0) && isatty(1) && isatty(2);
+
+ /* 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 and -version options. */
+ 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 IRCD Protocol Module; exit if there are errors */
+ if (protocol_module_init()) {
+ return -1;
+ }
+
+ /* Add Encryption Module; exit if there are errors */
+ if (encryption_module_init()) {
+ return -1;
+ }
+ return 0;
+}
+
+int init_secondary(int ac, char **av)
+{
+ int i;
+ int started_from_term = isatty(0) && isatty(1) && isatty(2);
+
+ /* Add Core MSG handles */
+ moduleAddMsgs();
+
+ /* Parse all remaining command-line options. */
+ parse_options(ac, av);
+
+ /* Parse the defcon mode string if needed */
+ if (DefConLevel) {
+ if (!defconParseModeString(DefConChanModes)) {
+ fprintf(stderr,
+ "services.conf: The given DefConChanModes mode string was incorrect (see log for exact errors)\n");
+ return -1;
+ }
+ }
+#ifndef _WIN32
+ 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;
+ }
+ }
+#else
+ /* Initialize winsocks -- codemastr */
+ {
+ WSADATA wsa;
+ if (WSAStartup(MAKEWORD(1, 1), &wsa)) {
+ alog("Failed to initialized WinSock library");
+ return -1;
+ }
+ }
+ if (!SupportedWindowsVersion()) {
+
+ char *winver = GetWindowsVersion();
+
+ alog("%s is not a supported version of Windows", winver);
+
+ free(winver);
+
+ return -1;
+
+ }
+ if (!nofork) {
+ alog("Launching Anope into the background");
+ FreeConsole();
+ }
+#endif
+
+ /* Write our PID to the PID file. */
+ write_pidfile();
+
+ /* Announce ourselves to the logfile. */
+ if (debug || readonly || skeleton) {
+ alog("Anope %s (ircd protocol: %s) starting up (options:%s%s%s)",
+ version_number, version_protocol,
+ debug ? " debug" : "", readonly ? " readonly" : "",
+ skeleton ? " skeleton" : "");
+ } else {
+ alog("Anope %s (ircd protocol: %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.
+ */
+
+#ifndef _WIN32
+#if defined(NSIG)
+ for (i = 1; i <= NSIG - 1; i++) {
+#else
+ for (i = 1; i <= 31; i++) {
+#endif
+ signal(i, SIG_IGN);
+ }
+#else
+ /* work around to bug #527 */
+ signal(SIGILL, SIG_IGN);
+ signal(SIGBREAK, SIG_IGN);
+ signal(SIGABRT, SIG_IGN);
+#endif
+
+ signal(SIGINT, sighandler);
+ signal(SIGTERM, sighandler);
+#ifndef _WIN32
+ signal(SIGQUIT, sighandler);
+#endif
+ if (!DumpCore) {
+ signal(SIGSEGV, sighandler);
+#ifndef _WIN32
+ signal(SIGBUS, sighandler);
+ signal(SIGTRAP, sighandler);
+#endif
+ } else {
+ signal(SIGSEGV, SIG_DFL);
+#ifndef _WIN32
+ signal(SIGBUS, sighandler);
+ signal(SIGTRAP, sighandler);
+#endif
+ }
+#ifndef _WIN32
+ signal(SIGQUIT, sighandler);
+ signal(SIGHUP, sighandler);
+ signal(SIGUSR2, sighandler);
+#endif
+
+#ifdef SIGIOT
+ signal(SIGIOT, sighandler);
+#endif
+ signal(SIGFPE, sighandler);
+
+#ifndef _WIN32
+ 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
+ if (!rdb_init()) {
+ if (UseRDB) {
+ UseRDB = 0;
+ alog("Error: Disabling UseRDB due to errors with SQL");
+ }
+ } else {
+ if (MysqlSecure && UseRDB) {
+ UseRDB = 0;
+ alog("Error: MySQL password are encrypted using method in MysqlSecure disabling UseRDB");
+ }
+ }
+#endif
+
+ /* load any custom modules */
+ modules_init();
+
+ /* Initialize random number generator */
+ rand_init();
+ add_entropy_userkeys();
+
+ /* Load up databases */
+#ifdef USE_RDB
+ if (UseRDB)
+ rdb_load_dbases();
+ /* Need a better way to handle this -dane */
+ if (!UseRDB) {
+#endif
+ if (!skeleton) {
+ load_ns_dbase();
+ if (debug)
+ alog("debug: Loaded %s database (1/%d)", s_NickServ,
+ (PreNickDBName ? 8 : 7));
+ if (s_HostServ) {
+ load_hs_dbase();
+ if (debug)
+ alog("debug: Loaded %s database (2/%d)", s_HostServ,
+ (PreNickDBName ? 8 : 7));
+ } else if (debug) {
+ alog("debug: HostServ database (2/%d) not loaded because HostServ is disabled", (PreNickDBName ? 8 : 7));
+ }
+ if (s_BotServ) {
+ load_bs_dbase();
+ if (debug)
+ alog("debug: Loaded %s database (3/%d)", s_BotServ,
+ (PreNickDBName ? 8 : 7));
+ } else if (debug) {
+ alog("debug: BotServ database (3/%d) not loaded because BotServ is disabled", (PreNickDBName ? 8 : 7));
+ }
+ load_cs_dbase();
+ if (debug)
+ alog("debug: Loaded %s database (4/%d)", s_ChanServ,
+ (PreNickDBName ? 8 : 7));
+ }
+ load_os_dbase();
+ if (debug)
+ alog("debug: Loaded %s database (5/%d)", s_OperServ,
+ (PreNickDBName ? 8 : 7));
+ load_news();
+ if (debug)
+ alog("debug: Loaded news database (6/%d)",
+ (PreNickDBName ? 8 : 7));
+ load_exceptions();
+ if (debug)
+ alog("debug: Loaded exception database (7/%d)",
+ (PreNickDBName ? 8 : 7));
+ if (PreNickDBName) {
+ load_ns_req_db();
+ if (debug)
+ alog("debug: Loaded PreNick database (8/8)");
+ }
+#ifdef USE_RDB
+ }
+#endif
+ alog("Databases loaded");
+
+ /* Save the databases back to file/mysql to reflect any changes */
+#ifdef USE_RDB
+ if (!UseRDB) { /* Only save if we are not using remote databases
+ * to avoid floods. As a side effects our nice
+ * FFF databases won't get overwritten if the
+ * mysql db is broken (empty etc.) */
+#endif
+ alog("Info: Reflecting database records.");
+ save_databases();
+#ifdef USE_RDB
+ } else {
+ alog("Info: Not reflecting database records.");
+ }
+#endif
+ send_event(EVENT_CONNECT, 1, EVENT_START);
+
+ /* 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);
+ }
+
+ anope_cmd_connect(servernum);
+ send_event(EVENT_CONNECT, 1, EVENT_STOP);
+
+ 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) {
+ anope_cmd_global(NULL, "Warning: couldn't open logfile: %s",
+ strerror(openlog_errno));
+ }
+
+ /* Bring in our pseudo-clients */
+ introduce_user(NULL);
+
+ /* And hybrid needs Global joined in the logchan */
+ if (logchan && ircd->join2msg) {
+ /* XXX might desync */
+ anope_cmd_join(s_GlobalNoticer, LogChannel, time(NULL));
+ }
+
+ anope_cmd_eob();
+
+ /**
+ * 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();
+
+ /* Success! */
+ return 0;
+}
+
+/*************************************************************************/
diff --git a/src/ircd.c b/src/ircd.c
new file mode 100644
index 000000000..b6dda769c
--- /dev/null
+++ b/src/ircd.c
@@ -0,0 +1,1215 @@
+/* Main ircd functions.
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+
+#include "services.h"
+#include "extern.h"
+
+IRCDProto ircdproto;
+IRCDModes ircd_modes;
+
+/**
+ * Globals we want from the protocol file
+ **/
+IRCDVar *ircd;
+IRCDCAPAB *ircdcap;
+char *version_protocol;
+CBModeInfo *cbmodeinfos;
+CUMode cumodes[128];
+char *flood_mode_char_set;
+char *flood_mode_char_remove;
+CBMode cbmodes[128];
+CMMode cmmodes[128];
+char csmodes[128];
+int UseTSMODE;
+
+/**
+ * Initiate a protocol struct ready for use
+ **/
+void initIrcdProto()
+{
+ ircdproto.ircd_set_mod_current_buffer = NULL;
+ ircdproto.ircd_set_umode = NULL;
+ ircdproto.ircd_cmd_svsnoop = NULL;
+ ircdproto.ircd_cmd_remove_akill = NULL;
+ ircdproto.ircd_cmd_topic = NULL;
+ ircdproto.ircd_cmd_vhost_off = NULL;
+ ircdproto.ircd_cmd_akill = NULL;
+ ircdproto.ircd_cmd_svskill = NULL;
+ ircdproto.ircd_cmd_svsmode = NULL;
+ ircdproto.ircd_cmd_372 = NULL;
+ ircdproto.ircd_cmd_372_error = NULL;
+ ircdproto.ircd_cmd_375 = NULL;
+ ircdproto.ircd_cmd_376 = NULL;
+ ircdproto.ircd_cmd_nick = NULL;
+ ircdproto.ircd_cmd_guest_nick = NULL;
+ ircdproto.ircd_cmd_mode = NULL;
+ ircdproto.ircd_cmd_bot_nick = NULL;
+ ircdproto.ircd_cmd_kick = NULL;
+ ircdproto.ircd_cmd_notice_ops = NULL;
+ ircdproto.ircd_cmd_notice = NULL;
+ ircdproto.ircd_cmd_notice2 = NULL;
+ ircdproto.ircd_cmd_privmsg = NULL;
+ ircdproto.ircd_cmd_privmsg2 = NULL;
+ ircdproto.ircd_cmd_serv_notice = NULL;
+ ircdproto.ircd_cmd_serv_privmsg = NULL;
+ ircdproto.ircd_cmd_bot_chan_mode = NULL;
+ ircdproto.ircd_cmd_351 = NULL;
+ ircdproto.ircd_cmd_quit = NULL;
+ ircdproto.ircd_cmd_pong = NULL;
+ ircdproto.ircd_cmd_join = NULL;
+ ircdproto.ircd_cmd_unsqline = NULL;
+ ircdproto.ircd_cmd_invite = NULL;
+ ircdproto.ircd_cmd_part = NULL;
+ ircdproto.ircd_cmd_391 = NULL;
+ ircdproto.ircd_cmd_250 = NULL;
+ ircdproto.ircd_cmd_307 = NULL;
+ ircdproto.ircd_cmd_311 = NULL;
+ ircdproto.ircd_cmd_312 = NULL;
+ ircdproto.ircd_cmd_317 = NULL;
+ ircdproto.ircd_cmd_219 = NULL;
+ ircdproto.ircd_cmd_401 = NULL;
+ ircdproto.ircd_cmd_318 = NULL;
+ ircdproto.ircd_cmd_242 = NULL;
+ ircdproto.ircd_cmd_243 = NULL;
+ ircdproto.ircd_cmd_211 = NULL;
+ ircdproto.ircd_cmd_global = NULL;
+ ircdproto.ircd_cmd_global_legacy = NULL;
+ ircdproto.ircd_cmd_sqline = NULL;
+ ircdproto.ircd_cmd_squit = NULL;
+ ircdproto.ircd_cmd_svso = NULL;
+ ircdproto.ircd_cmd_chg_nick = NULL;
+ ircdproto.ircd_cmd_svsnick = NULL;
+ ircdproto.ircd_cmd_vhost_on = NULL;
+ ircdproto.ircd_cmd_connect = NULL;
+ ircdproto.ircd_cmd_svshold = NULL;
+ ircdproto.ircd_cmd_release_svshold = NULL;
+ ircdproto.ircd_cmd_unsgline = NULL;
+ ircdproto.ircd_cmd_unszline = NULL;
+ ircdproto.ircd_cmd_szline = NULL;
+ ircdproto.ircd_cmd_sgline = NULL;
+ ircdproto.ircd_cmd_unban = NULL;
+ ircdproto.ircd_cmd_svsmode_chan = NULL;
+ ircdproto.ircd_cmd_svid_umode = NULL;
+ ircdproto.ircd_cmd_nc_change = NULL;
+ ircdproto.ircd_cmd_svid_umode2 = NULL;
+ ircdproto.ircd_cmd_svid_umode3 = NULL;
+ ircdproto.ircd_cmd_svsjoin = NULL;
+ ircdproto.ircd_cmd_svspart = NULL;
+ ircdproto.ircd_cmd_swhois = NULL;
+ ircdproto.ircd_cmd_eob = NULL;
+ ircdproto.ircd_flood_mode_check = NULL;
+ ircdproto.ircd_cmd_jupe = NULL;
+ ircdproto.ircd_valid_nick = NULL;
+ ircdproto.ircd_valid_chan = NULL;
+ ircdproto.ircd_cmd_ctcp = NULL;
+}
+
+/* Special function, returns 1 if executed, 0 if not */
+int anope_set_mod_current_buffer(int ac, char **av)
+{
+ if (ircdproto.ircd_set_mod_current_buffer) {
+ ircdproto.ircd_set_mod_current_buffer(ac, av);
+ return 1;
+ }
+
+ return 0;
+}
+
+void anope_set_umode(User * user, int ac, char **av)
+{
+ ircdproto.ircd_set_umode(user, ac, av);
+}
+
+void anope_cmd_svsnoop(char *server, int set)
+{
+ ircdproto.ircd_cmd_svsnoop(server, set);
+}
+
+void anope_cmd_remove_akill(char *user, char *host)
+{
+ ircdproto.ircd_cmd_remove_akill(user, host);
+}
+
+void anope_cmd_topic(char *whosets, char *chan, char *whosetit,
+ char *topic, time_t when)
+{
+ ircdproto.ircd_cmd_topic(whosets, chan, whosetit, topic, when);
+}
+
+void anope_cmd_vhost_off(User * u)
+{
+ ircdproto.ircd_cmd_vhost_off(u);
+}
+
+void anope_cmd_akill(char *user, char *host, char *who, time_t when,
+ time_t expires, char *reason)
+{
+ ircdproto.ircd_cmd_akill(user, host, who, when, expires, reason);
+}
+
+void anope_cmd_svskill(char *source, char *user, const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ *buf = '\0';
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+ ircdproto.ircd_cmd_svskill(source, user, buf);
+}
+
+void anope_cmd_svsmode(User * u, int ac, char **av)
+{
+ ircdproto.ircd_cmd_svsmode(u, ac, av);
+}
+
+void anope_cmd_372(char *source, char *msg)
+{
+ ircdproto.ircd_cmd_372(source, msg);
+}
+
+void anope_cmd_372_error(char *source)
+{
+ ircdproto.ircd_cmd_372_error(source);
+}
+
+void anope_cmd_375(char *source)
+{
+ ircdproto.ircd_cmd_375(source);
+}
+
+void anope_cmd_376(char *source)
+{
+ ircdproto.ircd_cmd_376(source);
+}
+
+void anope_cmd_nick(char *nick, char *name, char *modes)
+{
+ ircdproto.ircd_cmd_nick(nick, name, modes);
+}
+
+void anope_cmd_guest_nick(char *nick, char *user, char *host, char *real,
+ char *modes)
+{
+ ircdproto.ircd_cmd_guest_nick(nick, user, host, real, modes);
+}
+
+void anope_cmd_mode(char *source, char *dest, const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ *buf = '\0';
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+ ircdproto.ircd_cmd_mode(source, dest, buf);
+}
+
+void anope_cmd_bot_nick(char *nick, char *user, char *host, char *real,
+ char *modes)
+{
+ ircdproto.ircd_cmd_bot_nick(nick, user, host, real, modes);
+}
+
+void anope_cmd_kick(char *source, char *chan, char *user, const char *fmt,
+ ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ *buf = '\0';
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+ ircdproto.ircd_cmd_kick(source, chan, user, buf);
+}
+
+void anope_cmd_notice_ops(char *source, char *dest, const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ *buf = '\0';
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+ ircdproto.ircd_cmd_notice_ops(source, dest, buf);
+}
+
+void anope_cmd_notice(char *source, char *dest, const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ *buf = '\0';
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+ ircdproto.ircd_cmd_notice(source, dest, buf);
+}
+
+void anope_cmd_notice2(char *source, char *dest, char *msg)
+{
+ ircdproto.ircd_cmd_notice2(source, dest, msg);
+}
+
+void anope_cmd_action(char *source, char *dest, const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ char actionbuf[BUFSIZE];
+ *buf = '\0';
+ *actionbuf = '\0';
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ } else {
+ return;
+ }
+ if (!buf) {
+ return;
+ }
+ snprintf(actionbuf, BUFSIZE - 1, "%cACTION %s %c", 1, buf, 1);
+ ircdproto.ircd_cmd_privmsg(source, dest, actionbuf);
+ }
+ void anope_cmd_privmsg(char *source, char *dest, const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ *buf = '\0';
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+ ircdproto.ircd_cmd_privmsg(source, dest, buf);
+}
+
+void anope_cmd_privmsg2(char *source, char *dest, char *msg)
+{
+ ircdproto.ircd_cmd_privmsg2(source, dest, msg);
+}
+
+void anope_cmd_serv_notice(char *source, char *dest, char *msg)
+{
+ ircdproto.ircd_cmd_serv_notice(source, dest, msg);
+}
+
+void anope_cmd_serv_privmsg(char *source, char *dest, char *msg)
+{
+ ircdproto.ircd_cmd_serv_privmsg(source, dest, msg);
+}
+
+void anope_cmd_bot_chan_mode(char *nick, char *chan)
+{
+ ircdproto.ircd_cmd_bot_chan_mode(nick, chan);
+}
+
+void anope_cmd_351(char *source)
+{
+ ircdproto.ircd_cmd_351(source);
+}
+
+void anope_cmd_quit(char *source, const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ *buf = '\0';
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+ ircdproto.ircd_cmd_quit(source, buf);
+}
+
+void anope_cmd_pong(char *servname, char *who)
+{
+ ircdproto.ircd_cmd_pong(servname, who);
+}
+
+void anope_cmd_join(char *user, char *channel, time_t chantime)
+{
+ ircdproto.ircd_cmd_join(user, channel, chantime);
+}
+
+void anope_cmd_unsqline(char *user)
+{
+ ircdproto.ircd_cmd_unsqline(user);
+}
+
+void anope_cmd_invite(char *source, char *chan, char *nick)
+{
+ ircdproto.ircd_cmd_invite(source, chan, nick);
+}
+
+void anope_cmd_part(char *nick, char *chan, const char *fmt, ...)
+{
+ if (fmt) {
+ va_list args;
+ char buf[BUFSIZE];
+ *buf = '\0';
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ ircdproto.ircd_cmd_part(nick, chan, buf);
+ } else {
+ ircdproto.ircd_cmd_part(nick, chan, NULL);
+ }
+}
+
+void anope_cmd_391(char *source, char *timestr)
+{
+ ircdproto.ircd_cmd_391(source, timestr);
+}
+
+void anope_cmd_250(const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ *buf = '\0';
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+ ircdproto.ircd_cmd_250(buf);
+}
+
+void anope_cmd_307(const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ *buf = '\0';
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+ ircdproto.ircd_cmd_307(buf);
+}
+
+void anope_cmd_311(const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ *buf = '\0';
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+ ircdproto.ircd_cmd_311(buf);
+}
+
+void anope_cmd_312(const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ *buf = '\0';
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+ ircdproto.ircd_cmd_312(buf);
+}
+
+void anope_cmd_317(const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ *buf = '\0';
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+ ircdproto.ircd_cmd_317(buf);
+}
+
+void anope_cmd_219(char *source, char *letter)
+{
+ ircdproto.ircd_cmd_219(source, letter);
+}
+
+void anope_cmd_401(char *source, char *who)
+{
+ ircdproto.ircd_cmd_401(source, who);
+}
+
+void anope_cmd_318(char *source, char *who)
+{
+ ircdproto.ircd_cmd_318(source, who);
+}
+
+void anope_cmd_242(const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ *buf = '\0';
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+ ircdproto.ircd_cmd_242(buf);
+}
+
+void anope_cmd_243(const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ *buf = '\0';
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+ ircdproto.ircd_cmd_243(buf);
+}
+
+void anope_cmd_211(const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ *buf = '\0';
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+ ircdproto.ircd_cmd_211(buf);
+}
+
+void anope_cmd_global(char *source, const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ *buf = '\0';
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+ ircdproto.ircd_cmd_global(source, buf);
+}
+
+void anope_cmd_global_legacy(char *source, char *fmt)
+{
+ ircdproto.ircd_cmd_global_legacy(source, fmt);
+}
+
+void anope_cmd_sqline(char *mask, char *reason)
+{
+ ircdproto.ircd_cmd_sqline(mask, reason);
+}
+
+void anope_cmd_squit(char *servname, char *message)
+{
+ ircdproto.ircd_cmd_squit(servname, message);
+}
+
+void anope_cmd_svso(char *source, char *nick, char *flag)
+{
+ ircdproto.ircd_cmd_svso(source, nick, flag);
+}
+
+void anope_cmd_chg_nick(char *oldnick, char *newnick)
+{
+ ircdproto.ircd_cmd_chg_nick(oldnick, newnick);
+}
+
+void anope_cmd_svsnick(char *source, char *guest, time_t when)
+{
+ ircdproto.ircd_cmd_svsnick(source, guest, when);
+}
+
+void anope_cmd_vhost_on(char *nick, char *vIdent, char *vhost)
+{
+ ircdproto.ircd_cmd_vhost_on(nick, vIdent, vhost);
+}
+
+void anope_cmd_connect(int servernum)
+{
+ ircdproto.ircd_cmd_connect(servernum);
+}
+
+void anope_cmd_svshold(char *nick)
+{
+ ircdproto.ircd_cmd_svshold(nick);
+}
+
+void anope_cmd_release_svshold(char *nick)
+{
+ ircdproto.ircd_cmd_release_svshold(nick);
+}
+
+void anope_cmd_unsgline(char *mask)
+{
+ ircdproto.ircd_cmd_unsgline(mask);
+}
+
+void anope_cmd_unszline(char *mask)
+{
+ ircdproto.ircd_cmd_unszline(mask);
+}
+
+void anope_cmd_szline(char *mask, char *reason, char *whom)
+{
+ ircdproto.ircd_cmd_szline(mask, reason, whom);
+}
+
+void anope_cmd_sgline(char *mask, char *reason)
+{
+ ircdproto.ircd_cmd_sgline(mask, reason);
+}
+
+void anope_cmd_unban(char *name, char *nick)
+{
+ ircdproto.ircd_cmd_unban(name, nick);
+}
+
+void anope_cmd_svsmode_chan(char *name, char *mode, char *nick)
+{
+ ircdproto.ircd_cmd_svsmode_chan(name, mode, nick);
+}
+
+void anope_cmd_svid_umode(char *nick, time_t ts)
+{
+ ircdproto.ircd_cmd_svid_umode(nick, ts);
+}
+
+void anope_cmd_nc_change(User * u)
+{
+ ircdproto.ircd_cmd_nc_change(u);
+}
+
+void anope_cmd_svid_umode2(User * u, char *ts)
+{
+ ircdproto.ircd_cmd_svid_umode2(u, ts);
+}
+
+void anope_cmd_svid_umode3(User * u, char *ts)
+{
+ ircdproto.ircd_cmd_svid_umode3(u, ts);
+}
+
+void anope_cmd_svsjoin(char *source, char *nick, char *chan, char *param)
+{
+ ircdproto.ircd_cmd_svsjoin(source, nick, chan, param);
+}
+
+void anope_cmd_svspart(char *source, char *nick, char *chan)
+{
+ ircdproto.ircd_cmd_svspart(source, nick, chan);
+}
+
+void anope_cmd_swhois(char *source, char *who, char *mask)
+{
+ ircdproto.ircd_cmd_swhois(source, who, mask);
+}
+
+void anope_cmd_eob()
+{
+ ircdproto.ircd_cmd_eob();
+}
+
+int anope_flood_mode_check(char *value)
+{
+ return ircdproto.ircd_flood_mode_check(value);
+}
+
+void anope_cmd_jupe(char *jserver, char *who, char *reason)
+{
+ ircdproto.ircd_cmd_jupe(jserver, who, reason);
+}
+
+int anope_valid_nick(char *nick)
+{
+ return ircdproto.ircd_valid_nick(nick);
+}
+
+int anope_valid_chan(char *chan)
+{
+ return ircdproto.ircd_valid_chan(chan);
+}
+
+
+void anope_cmd_ctcp(char *source, char *dest, const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ *buf = '\0';
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+ ircdproto.ircd_cmd_ctcp(source, dest, buf);
+}
+
+
+
+/**
+ * Set routines for modules to set the prefered function for dealing with things.
+ **/
+
+void pmodule_set_mod_current_buffer(void (*func) (int ac, char **av))
+{
+ ircdproto.ircd_set_mod_current_buffer = func;
+}
+
+void pmodule_cmd_svsnoop(void (*func) (char *server, int set))
+{
+ ircdproto.ircd_cmd_svsnoop = func;
+}
+
+void pmodule_cmd_remove_akill(void (*func) (char *user, char *host))
+{
+ ircdproto.ircd_cmd_remove_akill = func;
+}
+
+void pmodule_cmd_topic(void (*func)
+ (char *whosets, char *chan, char *whosetit,
+ char *topic, time_t when))
+{
+ ircdproto.ircd_cmd_topic = func;
+}
+
+void pmodule_cmd_vhost_off(void (*func) (User * u))
+{
+ ircdproto.ircd_cmd_vhost_off = func;
+}
+
+void pmodule_cmd_akill(void (*func)
+ (char *user, char *host, char *who, time_t when,
+ time_t expires, char *reason))
+{
+ ircdproto.ircd_cmd_akill = func;
+}
+
+void
+pmodule_cmd_svskill(void (*func) (char *source, char *user, char *buf))
+{
+ ircdproto.ircd_cmd_svskill = func;
+}
+
+void pmodule_cmd_svsmode(void (*func) (User * u, int ac, char **av))
+{
+ ircdproto.ircd_cmd_svsmode = func;
+}
+
+void pmodule_cmd_372(void (*func) (char *source, char *msg))
+{
+ ircdproto.ircd_cmd_372 = func;
+}
+
+void pmodule_cmd_372_error(void (*func) (char *source))
+{
+ ircdproto.ircd_cmd_372_error = func;
+}
+
+void pmodule_cmd_375(void (*func) (char *source))
+{
+ ircdproto.ircd_cmd_375 = func;
+}
+
+void pmodule_cmd_376(void (*func) (char *source))
+{
+ ircdproto.ircd_cmd_376 = func;
+}
+
+void pmodule_cmd_nick(void (*func) (char *nick, char *name, char *modes))
+{
+ ircdproto.ircd_cmd_nick = func;
+}
+
+void pmodule_cmd_guest_nick(void (*func)
+ (char *nick, char *user, char *host,
+ char *real, char *modes))
+{
+ ircdproto.ircd_cmd_guest_nick = func;
+}
+
+void pmodule_cmd_mode(void (*func) (char *source, char *dest, char *buf))
+{
+ ircdproto.ircd_cmd_mode = func;
+}
+
+void pmodule_cmd_bot_nick(void (*func)
+ (char *nick, char *user, char *host, char *real,
+ char *modes))
+{
+ ircdproto.ircd_cmd_bot_nick = func;
+}
+
+void pmodule_cmd_kick(void (*func)
+ (char *source, char *chan, char *user, char *buf))
+{
+ ircdproto.ircd_cmd_kick = func;
+}
+
+void
+pmodule_cmd_notice_ops(void (*func) (char *source, char *dest, char *buf))
+{
+ ircdproto.ircd_cmd_notice_ops = func;
+}
+
+void pmodule_cmd_notice(void (*func) (char *source, char *dest, char *buf))
+{
+ ircdproto.ircd_cmd_notice = func;
+}
+
+void
+pmodule_cmd_notice2(void (*func) (char *source, char *dest, char *msg))
+{
+ ircdproto.ircd_cmd_notice2 = func;
+}
+
+void
+pmodule_cmd_privmsg(void (*func) (char *source, char *dest, char *buf))
+{
+ ircdproto.ircd_cmd_privmsg = func;
+}
+
+void
+pmodule_cmd_privmsg2(void (*func) (char *source, char *dest, char *msg))
+{
+ ircdproto.ircd_cmd_privmsg2 = func;
+}
+
+void
+pmodule_cmd_serv_notice(void (*func) (char *source, char *dest, char *msg))
+{
+ ircdproto.ircd_cmd_serv_notice = func;
+}
+
+void pmodule_cmd_serv_privmsg(void (*func)
+ (char *source, char *dest, char *msg))
+{
+ ircdproto.ircd_cmd_serv_privmsg = func;
+}
+
+void pmodule_cmd_bot_chan_mode(void (*func) (char *nick, char *chan))
+{
+ ircdproto.ircd_cmd_bot_chan_mode = func;
+}
+
+void pmodule_cmd_351(void (*func) (char *source))
+{
+ ircdproto.ircd_cmd_351 = func;
+}
+
+void pmodule_cmd_quit(void (*func) (char *source, char *buf))
+{
+ ircdproto.ircd_cmd_quit = func;
+}
+
+void pmodule_cmd_pong(void (*func) (char *servname, char *who))
+{
+ ircdproto.ircd_cmd_pong = func;
+}
+
+void
+pmodule_cmd_join(void (*func) (char *user, char *channel, time_t chantime))
+{
+ ircdproto.ircd_cmd_join = func;
+}
+
+void pmodule_cmd_unsqline(void (*func) (char *user))
+{
+ ircdproto.ircd_cmd_unsqline = func;
+}
+
+void
+pmodule_cmd_invite(void (*func) (char *source, char *chan, char *nick))
+{
+ ircdproto.ircd_cmd_invite = func;
+}
+
+void pmodule_cmd_part(void (*func) (char *nick, char *chan, char *buf))
+{
+ ircdproto.ircd_cmd_part = func;
+}
+
+void pmodule_cmd_391(void (*func) (char *source, char *timestr))
+{
+ ircdproto.ircd_cmd_391 = func;
+}
+
+void pmodule_cmd_250(void (*func) (char *buf))
+{
+ ircdproto.ircd_cmd_250 = func;
+}
+
+void pmodule_cmd_307(void (*func) (char *buf))
+{
+ ircdproto.ircd_cmd_307 = func;
+}
+
+void pmodule_cmd_311(void (*func) (char *buf))
+{
+ ircdproto.ircd_cmd_311 = func;
+}
+
+void pmodule_cmd_312(void (*func) (char *buf))
+{
+ ircdproto.ircd_cmd_312 = func;
+}
+
+void pmodule_cmd_317(void (*func) (char *buf))
+{
+ ircdproto.ircd_cmd_317 = func;
+}
+
+void pmodule_cmd_219(void (*func) (char *source, char *letter))
+{
+ ircdproto.ircd_cmd_219 = func;
+}
+
+void pmodule_cmd_401(void (*func) (char *source, char *who))
+{
+ ircdproto.ircd_cmd_401 = func;
+}
+
+void pmodule_cmd_318(void (*func) (char *source, char *who))
+{
+ ircdproto.ircd_cmd_318 = func;
+}
+
+void pmodule_cmd_242(void (*func) (char *buf))
+{
+ ircdproto.ircd_cmd_242 = func;
+}
+
+void pmodule_cmd_243(void (*func) (char *buf))
+{
+ ircdproto.ircd_cmd_243 = func;
+}
+
+void pmodule_cmd_211(void (*func) (char *buf))
+{
+ ircdproto.ircd_cmd_211 = func;
+}
+
+void pmodule_cmd_global(void (*func) (char *source, char *buf))
+{
+ ircdproto.ircd_cmd_global = func;
+}
+
+void pmodule_cmd_global_legacy(void (*func) (char *source, char *fmt))
+{
+ ircdproto.ircd_cmd_global_legacy = func;
+}
+
+void pmodule_cmd_sqline(void (*func) (char *mask, char *reason))
+{
+ ircdproto.ircd_cmd_sqline = func;
+}
+
+void pmodule_cmd_squit(void (*func) (char *servname, char *message))
+{
+ ircdproto.ircd_cmd_squit = func;
+}
+
+void pmodule_cmd_svso(void (*func) (char *source, char *nick, char *flag))
+{
+ ircdproto.ircd_cmd_svso = func;
+}
+
+void pmodule_cmd_chg_nick(void (*func) (char *oldnick, char *newnick))
+{
+ ircdproto.ircd_cmd_chg_nick = func;
+}
+
+void
+pmodule_cmd_svsnick(void (*func) (char *source, char *guest, time_t when))
+{
+ ircdproto.ircd_cmd_svsnick = func;
+}
+
+void
+pmodule_cmd_vhost_on(void (*func) (char *nick, char *vIdent, char *vhost))
+{
+ ircdproto.ircd_cmd_vhost_on = func;
+}
+
+void pmodule_cmd_connect(void (*func) (int servernum))
+{
+ ircdproto.ircd_cmd_connect = func;
+}
+
+void pmodule_cmd_svshold(void (*func) (char *nick))
+{
+ ircdproto.ircd_cmd_svshold = func;
+}
+
+void pmodule_cmd_release_svshold(void (*func) (char *nick))
+{
+ ircdproto.ircd_cmd_release_svshold = func;
+}
+
+void pmodule_cmd_unsgline(void (*func) (char *mask))
+{
+ ircdproto.ircd_cmd_unsgline = func;
+}
+
+void pmodule_cmd_unszline(void (*func) (char *mask))
+{
+ ircdproto.ircd_cmd_unszline = func;
+}
+
+void
+pmodule_cmd_szline(void (*func) (char *mask, char *reason, char *whom))
+{
+ ircdproto.ircd_cmd_szline = func;
+}
+
+void pmodule_cmd_sgline(void (*func) (char *mask, char *reason))
+{
+ ircdproto.ircd_cmd_sgline = func;
+}
+
+void pmodule_cmd_unban(void (*func) (char *name, char *nick))
+{
+ ircdproto.ircd_cmd_unban = func;
+}
+
+void
+pmodule_cmd_svsmode_chan(void (*func) (char *name, char *mode, char *nick))
+{
+ ircdproto.ircd_cmd_svsmode_chan = func;
+}
+
+void pmodule_cmd_svid_umode(void (*func) (char *nick, time_t ts))
+{
+ ircdproto.ircd_cmd_svid_umode = func;
+}
+
+void pmodule_cmd_nc_change(void (*func) (User * u))
+{
+ ircdproto.ircd_cmd_nc_change = func;
+}
+
+void pmodule_cmd_svid_umode2(void (*func) (User * u, char *ts))
+{
+ ircdproto.ircd_cmd_svid_umode2 = func;
+}
+
+void pmodule_cmd_svid_umode3(void (*func) (User * u, char *ts))
+{
+ ircdproto.ircd_cmd_svid_umode3 = func;
+}
+
+void pmodule_cmd_ctcp(void (*func) (char *source, char *dest, char *buf))
+{
+ ircdproto.ircd_cmd_ctcp = func;
+}
+
+void pmodule_cmd_svsjoin(void (*func)
+ (char *source, char *nick, char *chan,
+ char *param))
+{
+ ircdproto.ircd_cmd_svsjoin = func;
+}
+
+void
+pmodule_cmd_svspart(void (*func) (char *source, char *nick, char *chan))
+{
+ ircdproto.ircd_cmd_svspart = func;
+}
+
+void pmodule_cmd_swhois(void (*func) (char *source, char *who, char *mask))
+{
+ ircdproto.ircd_cmd_swhois = func;
+}
+
+void pmodule_cmd_eob(void (*func) ())
+{
+ ircdproto.ircd_cmd_eob = func;
+}
+
+void
+pmodule_cmd_jupe(void (*func) (char *jserver, char *who, char *reason))
+{
+ ircdproto.ircd_cmd_jupe = func;
+}
+
+void pmodule_set_umode(void (*func) (User * user, int ac, char **av))
+{
+ ircdproto.ircd_set_umode = func;
+}
+
+void pmodule_valid_nick(int (*func) (char *nick))
+{
+ ircdproto.ircd_valid_nick = func;
+}
+
+void pmodule_valid_chan(int (*func) (char *chan))
+{
+ ircdproto.ircd_valid_chan = func;
+}
+
+void pmodule_flood_mode_check(int (*func) (char *value))
+{
+ ircdproto.ircd_flood_mode_check = func;
+}
+
+void pmodule_ircd_var(IRCDVar * ircdvar)
+{
+ ircd = ircdvar;
+}
+
+void pmodule_ircd_cap(IRCDCAPAB * cap)
+{
+ ircdcap = cap;
+}
+
+void pmodule_ircd_version(char *version)
+{
+ version_protocol = sstrdup(version);
+}
+
+void pmodule_ircd_cbmodeinfos(CBModeInfo * modeinfos)
+{
+ cbmodeinfos = modeinfos;
+}
+
+void pmodule_ircd_cumodes(CUMode modes[128])
+{
+ int i = 0;
+ for (i = 0; i < 128; i++) {
+ cumodes[i] = modes[i];
+ }
+}
+
+void pmodule_ircd_flood_mode_char_set(char *mode)
+{
+ flood_mode_char_set = sstrdup(mode);
+}
+
+void pmodule_ircd_flood_mode_char_remove(char *mode)
+{
+ flood_mode_char_remove = sstrdup(mode);
+}
+
+void pmodule_ircd_cbmodes(CBMode modes[128])
+{
+ int i = 0;
+ for (i = 0; i < 128; i++) {
+ cbmodes[i] = modes[i];
+ }
+}
+
+void pmodule_ircd_cmmodes(CMMode modes[128])
+{
+ int i = 0;
+ for (i = 0; i < 128; i++) {
+ cmmodes[i] = modes[i];
+ }
+}
+
+void pmodule_ircd_csmodes(char mode[128])
+{
+ int i = 0;
+ for (i = 0; i < 128; i++) {
+ csmodes[i] = mode[i];
+ }
+}
+
+void pmodule_ircd_useTSMode(int use)
+{
+ UseTSMODE = use;
+}
+
+/** mode stuff */
+
+void pmodule_invis_umode(int mode)
+{
+ ircd_modes.user_invis = mode;
+}
+
+void pmodule_oper_umode(int mode)
+{
+ ircd_modes.user_oper = mode;
+}
+
+void pmodule_invite_cmode(int mode)
+{
+ ircd_modes.chan_invite = mode;
+}
+
+void pmodule_secret_cmode(int mode)
+{
+ ircd_modes.chan_secret = mode;
+}
+
+void pmodule_private_cmode(int mode)
+{
+ ircd_modes.chan_private = mode;
+}
+
+void pmodule_key_mode(int mode)
+{
+ ircd_modes.chan_key = mode;
+}
+
+void pmodule_limit_mode(int mode)
+{
+ ircd_modes.chan_limit = mode;
+}
+
+int anope_get_invis_mode()
+{
+ return ircd_modes.user_invis;
+}
+
+int anope_get_oper_mode()
+{
+ return ircd_modes.user_oper;
+}
+
+int anope_get_invite_mode()
+{
+ return ircd_modes.chan_invite;
+}
+
+int anope_get_secret_mode()
+{
+ return ircd_modes.chan_secret;
+}
+
+int anope_get_private_mode()
+{
+ return ircd_modes.chan_private;
+}
+
+int anope_get_key_mode()
+{
+ return ircd_modes.chan_key;
+}
+
+int anope_get_limit_mode()
+{
+ return ircd_modes.chan_limit;
+}
diff --git a/src/language.c b/src/language.c
new file mode 100644
index 000000000..1c29b1ec9
--- /dev/null
+++ b/src/language.c
@@ -0,0 +1,309 @@
+/* Multi-language support.
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+
+#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 */
+ LANG_HUN, /* Hungarian */
+ LANG_PL, /* Polish */
+};
+
+/*************************************************************************/
+
+/* 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;
+ int32 num, i;
+
+ if (debug) {
+ alog("debug: Loading language %d from file `languages/%s'",
+ index, filename);
+ }
+ snprintf(buf, sizeof(buf), "languages/%s", filename);
+#ifndef _WIN32
+ if (!(f = fopen(buf, "r"))) {
+#else
+ if (!(f = fopen(buf, "rb"))) {
+#endif
+ 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);
+}
+
+/*************************************************************************/
+
+/* Replace all %M's with "/msg " or "/" */
+void lang_sanitize()
+{
+ int i = 0, j = 0;
+ int len = 0;
+ char tmp[2000];
+ char *newstr = NULL;
+ for (i = 0; i < NUM_LANGS; i++) {
+ for (j = 0; j < NUM_STRINGS; j++) {
+ if (strstr(langtexts[i][j], "%R")) {
+ len = strlen(langtexts[i][j]);
+ strscpy(tmp, langtexts[i][j], sizeof(tmp));
+ if (UseStrictPrivMsg) {
+ strnrepl(tmp, sizeof(tmp), "%R", "/");
+ } else {
+ strnrepl(tmp, sizeof(tmp), "%R", "/msg ");
+ }
+ newstr = sstrdup(tmp);
+ free(langtexts[i][j]);
+ langtexts[i][j] = newstr;
+ }
+ }
+ }
+}
+
+
+/* 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");
+ load_lang(LANG_HUN, "hun");
+ load_lang(LANG_PL, "pl");
+
+ 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];
+ }
+ lang_sanitize();
+}
+
+/*************************************************************************/
+/*************************************************************************/
+
+/* 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;
+
+ if (!tm) {
+ return 0;
+ }
+
+ 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(char *service, User * u, const char *command, int msgnum)
+{
+ const char *str;
+
+ if (!u) {
+ return;
+ }
+
+ str = getstring(u->na, msgnum);
+ notice_lang(service, u, SYNTAX_ERROR, str);
+ notice_lang(service, u, MORE_INFO, service, command);
+}
+
+/*************************************************************************/
diff --git a/src/list.c b/src/list.c
new file mode 100644
index 000000000..c59bf9f5e
--- /dev/null
+++ b/src/list.c
@@ -0,0 +1,196 @@
+/* Routines to handle `listnicks' and `listchans' invocations.
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+
+#include "services.h"
+
+/*************************************************************************/
+
+/**
+ * List all register nicks
+ * @param ac Number of Arguments
+ * @param av Array if Arguments
+ * @return void
+ */
+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));
+ ModuleRunTimeDirCleanUp();
+ exit(1);
+ }
+ if (!read_config(0)) {
+ ModuleRunTimeDirCleanUp();
+ 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);
+}
+
+/*************************************************************************/
+
+/**
+ * List all register channels
+ * @param ac Number of Arguments
+ * @param av Array if Arguments
+ * @return void
+ */
+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));
+ ModuleRunTimeDirCleanUp();
+ exit(1);
+ }
+ if (!read_config(0)) {
+ ModuleRunTimeDirCleanUp();
+ 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/src/log.c b/src/log.c
new file mode 100644
index 000000000..a4f354993
--- /dev/null
+++ b/src/log.c
@@ -0,0 +1,336 @@
+/* Logging routines.
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+
+#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];
+ time_t t;
+
+
+ if (!tm) {
+ time(&t);
+ tm = localtime(&t);
+ }
+
+ /* fix bug 577 */
+ strftime(timestamp, sizeof(timestamp), "%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);
+
+ /* removed if from here cause get_logchan is always 1 */
+ get_logname(name, sizeof(name), &tm);
+#ifndef _WIN32
+ unlink(name);
+#else
+ DeleteFile(name);
+#endif
+}
+
+/*************************************************************************/
+
+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 removed again.. get_logname is always 1 */
+ get_logname(name, sizeof(name), NULL);
+ 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;
+}
+
+/*************************************************************************/
+
+/* added cause this is used over and over in the code */
+char *log_gettimestamp(void)
+{
+ time_t t;
+ struct tm tm;
+ static char tbuf[256];
+
+ time(&t);
+ tm = *localtime(&t);
+#if HAVE_GETTIMEOFDAY
+ if (debug) {
+ char *s;
+ struct timeval tv;
+ gettimeofday(&tv, NULL);
+ strftime(tbuf, sizeof(tbuf) - 1, "[%b %d %H:%M:%S", &tm);
+ s = tbuf + strlen(tbuf);
+ s += snprintf(s, sizeof(tbuf) - (s - tbuf), ".%06d",
+ (int) tv.tv_usec);
+ strftime(s, sizeof(tbuf) - (s - tbuf) - 1, " %Y]", &tm);
+ } else {
+#endif
+ strftime(tbuf, sizeof(tbuf) - 1, "[%b %d %H:%M:%S %Y]", &tm);
+#if HAVE_GETTIMEOFDAY
+ }
+#endif
+ return tbuf;
+}
+
+/*************************************************************************/
+
+/* 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;
+ char *buf;
+ int errno_save = errno;
+ char str[BUFSIZE];
+
+ checkday();
+
+ if (!fmt) {
+ return;
+ }
+
+ va_start(args, fmt);
+ vsnprintf(str, sizeof(str), fmt, args);
+ va_end(args);
+
+ buf = log_gettimestamp();
+
+ if (logfile) {
+ fprintf(logfile, "%s %s\n", buf, str);
+ }
+ if (nofork) {
+ fprintf(stderr, "%s %s\n", buf, str);
+ }
+ if (LogChannel && logchan && !debug && findchan(LogChannel)) {
+ privmsg(s_GlobalNoticer, LogChannel, "%s", 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;
+ char *buf;
+ int errno_save = errno;
+ char str[BUFSIZE];
+
+ checkday();
+
+ if (!fmt) {
+ return;
+ }
+
+ va_start(args, fmt);
+ vsnprintf(str, sizeof(str), fmt, args);
+ va_end(args);
+
+ buf = log_gettimestamp();
+
+ if (logfile) {
+ fprintf(logfile, "%s %s : %s\n", buf, str, strerror(errno_save));
+ }
+ if (nofork) {
+ fprintf(stderr, "%s %s : %s\n", buf, str, 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;
+ char *buf;
+ char buf2[4096];
+
+ checkday();
+
+ if (!fmt) {
+ return;
+ }
+
+ va_start(args, fmt);
+ vsnprintf(buf2, sizeof(buf2), fmt, args);
+ va_end(args);
+
+ buf = log_gettimestamp();
+
+ if (logfile)
+ fprintf(logfile, "%s FATAL: %s\n", buf, buf2);
+ if (nofork)
+ fprintf(stderr, "%s FATAL: %s\n", buf, buf2);
+ if (servsock >= 0)
+ anope_cmd_global(NULL, "FATAL ERROR! %s", buf2);
+
+ /* one of the many places this needs to be called from */
+ ModuleRunTimeDirCleanUp();
+
+ exit(1);
+}
+
+/*************************************************************************/
+
+/* Same thing, but do it like perror(). */
+
+void fatal_perror(const char *fmt, ...)
+{
+ va_list args;
+ char *buf;
+ char buf2[4096];
+ int errno_save = errno;
+
+ checkday();
+
+ if (!fmt) {
+ return;
+ }
+
+ va_start(args, fmt);
+ vsnprintf(buf2, sizeof(buf2), fmt, args);
+ va_end(args);
+
+ buf = log_gettimestamp();
+
+ if (logfile)
+ fprintf(logfile, "%s FATAL: %s: %s\n", buf, buf2,
+ strerror(errno_save));
+ if (nofork)
+ fprintf(stderr, "%s FATAL: %s: %s\n", buf, buf2,
+ strerror(errno_save));
+ if (servsock >= 0)
+ anope_cmd_global(NULL, "FATAL ERROR! %s: %s", buf2,
+ strerror(errno_save));
+
+ /* one of the many places this needs to be called from */
+ ModuleRunTimeDirCleanUp();
+
+ exit(1);
+}
+
+/*************************************************************************/
+
+/* Same thing, but do it like perror().
+ * This is for socket errors. On *nix, it works just like fatal_perror,
+ * on Win32, it uses the socket error code and formatting functions.
+ */
+
+void fatal_sockerror(const char *fmt, ...)
+{
+ va_list args;
+ char *buf;
+ char buf2[4096];
+ int errno_save = ano_sockgeterr();
+
+ if (!fmt) {
+ return;
+ }
+
+ checkday();
+
+ /* this will fix 581 */
+ va_start(args, fmt);
+ vsnprintf(buf2, sizeof(buf2), fmt, args);
+ va_end(args);
+
+ buf = log_gettimestamp();
+
+ if (logfile)
+ fprintf(logfile, "%s FATAL: %s: %s\n", buf, buf2,
+ ano_sockstrerror(errno_save));
+ if (stderr)
+ fprintf(stderr, "%s FATAL: %s: %s\n", buf, buf2,
+ ano_sockstrerror(errno_save));
+ if (servsock >= 0)
+ anope_cmd_global(NULL, "FATAL ERROR! %s: %s", buf2,
+ strerror(errno_save));
+
+ /* one of the many places this needs to be called from */
+ ModuleRunTimeDirCleanUp();
+
+ exit(1);
+}
diff --git a/src/mail.c b/src/mail.c
new file mode 100644
index 000000000..096191935
--- /dev/null
+++ b/src/mail.c
@@ -0,0 +1,285 @@
+/* Mail utility routines.
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+
+#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.
+ * @param u the User struct
+ * @param nr NickReqest Struct
+ * @param subject Subject of the email
+ * @param service Service to respond with
+ * @return MailInfo struct
+ */
+MailInfo *MailRegBegin(User * u, NickRequest * nr, char *subject,
+ char *service)
+{
+ int timeToWait = 0;
+ if (!u || !nr || !subject || !service) {
+ return NULL;
+ }
+
+ if (!UseMail) {
+ notice_lang(service, u, MAIL_DISABLED);
+ } else if ((time(NULL) - u->lastmail < MailDelay)) {
+ timeToWait = MailDelay - (time(NULL) - u->lastmail);
+ notice_lang(service, u, MAIL_DELAYED, timeToWait);
+ } 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.
+ * @param u the User struct
+ * @param nc NickCore Struct
+ * @param subject Subject of the email
+ * @param service Service to respond with
+ * @return MailInfo struct
+ */
+MailInfo *MailBegin(User * u, NickCore * nc, char *subject, char *service)
+{
+ if (!u || !nc || !subject || !service) {
+ 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;
+}
+
+/*************************************************************************/
+
+/**
+ * new function to send memo mails
+ * @param nc NickCore Struct
+ * @return MailInfo struct
+ */
+MailInfo *MailMemoBegin(NickCore * nc)
+{
+
+ if (!nc)
+ return NULL;
+
+ if (!UseMail || !nc->email) {
+ return NULL;
+
+ } else {
+ MailInfo *mail;
+
+ mail = scalloc(sizeof(MailInfo), 1);
+ mail->sender = NULL;
+ mail->recipient = nc;
+ mail->recip = NULL;
+
+ if (!(mail->pipe = popen(SendMailPath, "w"))) {
+ free(mail);
+ 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",
+ getstring2(NULL, MEMO_MAIL_SUBJECT));
+ return mail;
+ }
+ return NULL;
+}
+
+/*************************************************************************/
+
+/**
+ * Finish to send the mail. Cleanup everything.
+ * @param mail MailInfo Struct
+ * @return void
+ */
+void MailEnd(MailInfo * mail)
+{
+ /* - param checking modified because we don't
+ have an user sending this mail.
+ Certus, 02.04.2004 */
+
+ if (!mail || !mail->pipe) { /* removed sender check */
+ return;
+ }
+
+ if (!mail->recipient && !mail->recip) {
+ return;
+ }
+
+ pclose(mail->pipe);
+
+ if (mail->sender) /* added sender check */
+ 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.
+ * @param u the User struct
+ * @param nc NickCore Struct
+ * @return void
+ */
+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.
+ * @param email Email to Validate
+ * @return int
+ */
+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/src/main.c b/src/main.c
new file mode 100644
index 000000000..3cece40b3
--- /dev/null
+++ b/src/main.c
@@ -0,0 +1,752 @@
+/* Services -- main source file.
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further 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$
+ *
+ */
+
+#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 nothird = 0; /* -nothrid */
+int noexpire = 0; /* -noexpire */
+int protocoldebug = 0; /* -protocoldebug */
+
+#ifdef _WIN32
+char *binary_dir; /* Used to store base path for win32 restart */
+#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;
+
+/* Moved here from version.h */
+const char version_number[] = VERSION_STRING;
+const char version_number_dotted[] = VERSION_STRING_DOTTED;
+const char version_build[] =
+ "build #" BUILD ", compiled " __DATE__ " " __TIME__;
+/* the space is needed cause if you build with nothing it will complain */
+const char version_flags[] = " " VER_DEBUG VER_OS VER_MYSQL VER_MODULE;
+
+extern char *mod_current_buffer;
+
+/******** 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 */
+
+extern void expire_all(void)
+{
+ waiting = -30;
+ send_event(EVENT_DB_EXPIRE, 1, EVENT_START);
+ 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();
+ if (ircd->sgline) {
+ waiting = -26;
+ expire_sglines();
+ }
+ if (ircd->sqline) {
+ waiting = -28;
+ expire_sqlines();
+ }
+ if (ircd->szline) {
+ waiting = -27;
+ expire_szlines();
+ }
+ waiting = -29;
+ expire_exceptions();
+ waiting = -31;
+ send_event(EVENT_DB_EXPIRE, 1, EVENT_STOP);
+}
+
+/*************************************************************************/
+
+void save_databases(void)
+{
+ waiting = -19;
+ send_event(EVENT_DB_SAVING, 1, EVENT_START);
+ 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();
+ /* We send these PONG's when we're not syncing to avoid timeouts.
+ * If we send them during the sync, we fuck something up there and
+ * break the syncing process, resulting in lost (literally lost)
+ * data. -GD
+ * This used is_sync(serv_uplink) to check for sync states. There's
+ * only a minor error with this: serv_uplink doesn't exist during
+ * the first save. So now we check for serv_uplink only; if it
+ * exists we're safe. -GD
+ */
+ if (serv_uplink)
+ anope_cmd_pong(ServerName, ServerName);
+ waiting = -12;
+ save_cs_rdb_dbase();
+ if (serv_uplink)
+ anope_cmd_pong(ServerName, ServerName);
+ if (PreNickDBName) {
+ save_ns_req_rdb_dbase();
+ if (serv_uplink)
+ anope_cmd_pong(ServerName, ServerName);
+ waiting = -13;
+ }
+ if (s_BotServ) {
+ waiting = -14;
+ save_bs_rdb_dbase();
+ if (serv_uplink)
+ anope_cmd_pong(ServerName, ServerName);
+ }
+ if (s_HostServ) {
+ waiting = -15;
+ save_hs_rdb_dbase();
+ if (serv_uplink)
+ anope_cmd_pong(ServerName, ServerName);
+ }
+ waiting = -16;
+ save_os_rdb_dbase();
+ if (serv_uplink)
+ anope_cmd_pong(ServerName, ServerName);
+ waiting = -17;
+ save_rdb_news();
+ if (serv_uplink)
+ anope_cmd_pong(ServerName, ServerName);
+ waiting = -18;
+ save_rdb_exceptions();
+ if (serv_uplink)
+ anope_cmd_pong(ServerName, ServerName);
+
+ } else {
+ alog("!WARNING! Both MySQL and SKELETON are enabled, however SKELETON mode overrides MySQL dumping so databases will NOT be saved to MySQL. Keep this in mind next time you start Anope with UseRDB!");
+ }
+ }
+#endif
+ waiting = -20;
+ send_event(EVENT_DB_SAVING, 1, EVENT_STOP);
+}
+
+/*************************************************************************/
+
+/* Restarts services */
+
+static void services_restart(void)
+{
+ alog("Restarting");
+ send_event(EVENT_RESTART, 1, EVENT_START);
+ if (!quitmsg)
+ quitmsg = "Restarting";
+ anope_cmd_squit(ServerName, quitmsg);
+ disconn(servsock);
+ close_log();
+ /* First don't unload protocol module, then do so */
+ modules_unload_all(true, false);
+ modules_unload_all(true, true);
+#ifdef _WIN32
+ /* This fixes bug #589 - change to binary directory for restart */
+ /* -- heinz */
+ if (binary_dir)
+ chdir(binary_dir);
+#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)
+{
+ if (!readonly) {
+ expire_all();
+ save_databases();
+ }
+ services_restart();
+ exit(1);
+}
+
+/*************************************************************************/
+
+/* Terminates services */
+
+static void services_shutdown(void)
+{
+ User *u, *next;
+
+ send_event(EVENT_SHUTDOWN, 1, EVENT_START);
+
+ if (!quitmsg)
+ quitmsg = "Terminating, reason unknown";
+ alog("%s", quitmsg);
+ if (started) {
+ anope_cmd_squit(ServerName, quitmsg);
+ Anope_Free(uplink);
+ Anope_Free(mod_current_buffer);
+ if (ircd->chanmodes) {
+ Anope_Free(ircd->chanmodes);
+ }
+ u = firstuser();
+ while (u) {
+ next = nextuser();
+ delete_user(u);
+ u = next;
+ }
+ }
+ send_event(EVENT_SHUTDOWN, 1, EVENT_STOP);
+ disconn(servsock);
+ /* First don't unload protocol module, then do so */
+ modules_unload_all(true, false);
+ modules_unload_all(true, true);
+ /* just in case they weren't all removed at least run once */
+ ModuleRunTimeDirCleanUp();
+}
+
+/*************************************************************************/
+
+/* If we get a weird signal, come here. */
+
+void sighandler(int signum)
+{
+ /* We set the quit message to something default, just to be sure it is
+ * always set when we need it. It seems some signals slip through to the
+ * QUIT code without having a valid quitmsg. -GD
+ */
+ quitmsg = sstrdup("Signal Received");
+ if (started) {
+#ifndef _WIN32
+ if (signum == SIGHUP) { /* SIGHUP = save databases and restart */
+ signal(SIGHUP, SIG_IGN);
+ signal(SIGUSR2, 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 == SIGQUIT) {
+ /* had to move it to here to make win32 happy */
+ } else if (signum == SIGUSR2) {
+
+ alog("Received SIGUSR2: Saving Databases & Rehash Configuration");
+
+ expire_all();
+ save_databases();
+
+ if (!read_config(1)) {
+ sprintf(quitmsg,
+ "Error Reading Configuration File (Received SIGUSR2)");
+ quitting = 1;
+ }
+ send_event(EVENT_RELOAD, 1, EVENT_START);
+ return;
+
+ } else
+#endif
+ if (signum == SIGTERM) {
+ signal(SIGTERM, SIG_IGN);
+#ifndef _WIN32
+ signal(SIGHUP, SIG_IGN);
+#endif
+
+ alog("Received SIGTERM, exiting.");
+
+ expire_all();
+ save_databases();
+ quitmsg = "Shutting down on SIGTERM";
+ services_shutdown();
+ exit(0);
+ } else if (signum == SIGINT) {
+ if (nofork) {
+ signal(SIGINT, SIG_IGN);
+ alog("Received SIGINT, exiting.");
+ expire_all();
+ save_databases();
+ quitmsg = "Shutting down on SIGINT";
+ services_shutdown();
+ exit(0);
+ }
+ } 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);
+ modules_unload_all(false, true);
+ } 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 -19:
+ snprintf(buf, sizeof(buf), "Sending event %s %s",
+ EVENT_DB_SAVING, EVENT_START);
+ break;
+ case -20:
+ snprintf(buf, sizeof(buf), "Sending event %s %s",
+ EVENT_DB_SAVING, EVENT_STOP);
+ 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;
+ case -26:
+ snprintf(buf, sizeof(buf), "expiring SGLINEs");
+ break;
+ case -27:
+ snprintf(buf, sizeof(buf), "expiring SZLINEs");
+ break;
+ case -28:
+ snprintf(buf, sizeof(buf), "expiring SQLINEs");
+ break;
+ case -29:
+ snprintf(buf, sizeof(buf), "expiring Exceptions");
+ break;
+ case -30:
+ snprintf(buf, sizeof(buf), "Sending event %s %s",
+ EVENT_DB_EXPIRE, EVENT_START);
+ break;
+ case -31:
+ snprintf(buf, sizeof(buf), "Sending event %s %s",
+ EVENT_DB_EXPIRE, EVENT_STOP);
+ break;
+ default:
+ snprintf(buf, sizeof(buf), "waiting=%d", waiting);
+ }
+ wallops(NULL, "PANIC! %s (%s)", buf, strsignal(signum));
+ alog("PANIC! %s (%s)", buf, strsignal(signum));
+ modules_unload_all(false, true);
+ }
+ }
+
+ if (
+#ifndef _WIN32
+ 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 (signum == SIGSEGV) {
+ do_backtrace(1);
+ modules_unload_all(false, true); /* probably cant do this, but might as well try, we have nothing left to loose */
+ }
+ /* Should we send the signum here as well? -GD */
+ send_event(EVENT_SIGNAL, 1, quitmsg);
+
+ if (started) {
+ services_shutdown();
+ exit(0);
+ } else {
+ if (isatty(2)) {
+ fprintf(stderr, "%s\n", quitmsg);
+ } else {
+ alog("%s", 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;
+
+#ifndef _WIN32
+ /* If we're root, issue a warning now */
+ if ((getuid() == 0) && (getgid() == 0)) {
+ fprintf(stderr,
+ "WARNING: You are currently running Anope as the root superuser. Anope does not\n");
+ fprintf(stderr,
+ " require root privileges to run, and it is discouraged that you run Anope\n");
+ fprintf(stderr, " as the root superuser.\n");
+ }
+#else
+ /*
+ * We need to know which directory we're in for when restart is called.
+ * This only affects Windows as a full path is not specified in services_dir.
+ * This fixes bug #589.
+ * -- heinz
+ */
+ binary_dir = smalloc(MAX_PATH);
+ if (!getcwd(binary_dir, MAX_PATH)) {
+ fprintf(stderr, "error: getcwd() error\n");
+ return -1;
+ }
+#endif
+
+ /* General initialization first */
+ if ((i = init_primary(ac, av)) != 0)
+ return i;
+
+ /* Find program name. */
+ if ((progname = strrchr(av[0], '/')) != NULL)
+ progname++;
+ else
+ progname = av[0];
+
+#ifdef _WIN32
+ if (strcmp(progname, "listnicks.exe") == 0)
+#else
+ if (strcmp(progname, "listnicks") == 0)
+#endif
+ {
+ do_listnicks(ac, av);
+ modules_unload_all(1, 0);
+ modules_unload_all(1, 1);
+ ModuleRunTimeDirCleanUp();
+ return 0;
+ }
+#ifdef _WIN32
+ else if (strcmp(progname, "listchans.exe") == 0)
+#else
+ else if (strcmp(progname, "listchans") == 0)
+#endif
+ {
+ do_listchans(ac, av);
+ modules_unload_all(1, 0);
+ modules_unload_all(1, 1);
+ ModuleRunTimeDirCleanUp();
+ return 0;
+ }
+
+ /* Initialization stuff. */
+ if ((i = init_secondary(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)
+ anope_cmd_global(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;
+ /* this is a nasty nasty typecast. we need to rewrite the
+ socket stuff -Certus */
+ i = (int) (long) sgets2(inbuf, sizeof(inbuf), servsock);
+ waiting = 0;
+ if ((i > 0) || (i < (-1))) {
+ process();
+ } else if (i == 0) {
+ int errno_save = errno;
+ quitmsg = scalloc(BUFSIZE, 1);
+ if (quitmsg) {
+ snprintf(quitmsg, BUFSIZE,
+ "Read error from server: %s (error num: %d)",
+ strerror(errno_save), errno_save);
+ } else {
+ quitmsg = "Read error from server";
+ }
+ quitting = 1;
+
+ /* Save the databases */
+ if (!readonly)
+ save_databases();
+ }
+ waiting = -4;
+ }
+
+
+ /* Check for restart instead of exit */
+ if (save_data == -2) {
+#ifdef SERVICES_BIN
+ alog("Restarting");
+ if (!quitmsg)
+ quitmsg = "Restarting";
+ anope_cmd_squit(ServerName, quitmsg);
+ disconn(servsock);
+ close_log();
+#ifdef _WIN32
+ /* This fixes bug #589 - change to binary directory for restart */
+ /* -- heinz */
+ if (binary_dir)
+ chdir(binary_dir);
+#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();
+
+#ifdef _WIN32
+ if (binary_dir)
+ free(binary_dir);
+#endif
+
+ return 0;
+}
+
+/*************************************************************************/
+
+void do_backtrace(int show_segheader)
+{
+#ifndef _WIN32
+#ifdef HAVE_BACKTRACE
+ void *array[50];
+ size_t size;
+ char **strings;
+ int i;
+
+ if (show_segheader) {
+ alog("Backtrace: Segmentation fault detected");
+ alog("Backtrace: report the following lines");
+ }
+ alog("Backtrace: Anope version %s %s %s", version_number,
+ version_build, version_flags);
+ size = backtrace(array, 10);
+ strings = backtrace_symbols(array, size);
+ for (i = 0; i < size; i++) {
+ alog("Backtrace(%d): %s", i, strings[i]);
+ }
+ free(strings);
+ alog("Backtrace: complete");
+#else
+ alog("Backtrace: not available on this platform");
+#endif
+#else
+ char *winver;
+ winver = GetWindowsVersion();
+ alog("Backtrace: not available on Windows");
+ alog("Running %S", winver);
+ free(winver);
+#endif
+}
diff --git a/src/makefile.win32 b/src/makefile.win32
new file mode 100644
index 000000000..a6b90b708
--- /dev/null
+++ b/src/makefile.win32
@@ -0,0 +1,109 @@
+# Make file for Win32
+#
+# (C) 2003-2008 Anope Team
+# Contact us at info@anope.org
+#
+# Please read COPYING and README for further details.
+#
+# Based on the original code of Epona by Lara.
+# Based on the original code of Services by Andy Church.
+#
+# $Id$
+#
+
+# Source Makefile
+
+include ../Makefile.inc.win32
+
+###########################################################################
+
+OBJS = actions.obj base64.obj botserv.obj channels.obj chanserv.obj commands.obj compat.obj \
+ config.obj datafiles.obj encrypt.obj events.obj helpserv.obj hostserv.obj \
+ init.obj ircd.obj language.obj list.obj log.obj mail.obj main.obj memory.obj \
+ memoserv.obj messages.obj misc.obj modules.obj mod_version.obj news.obj nickserv.obj operserv.obj \
+ process.obj send.obj servers.obj sessions.obj slist.obj sockutil.obj \
+ timeout.obj users.obj $(RDB_O) $(MYSQL_O)
+
+SRCS = actions.c base64.c botserv.c channels.c chanserv.c commands.c compat.c \
+ config.c datafiles.c encrypt.c events.c helpserv.c hostserv.c init.c ircd.c \
+ language.c list.c log.c mail.c main.c memory.c memoserv.c messages.c misc.c \
+ modules.c mod_version.c news.c nickserv.c operserv.c process.c send.c servers.obj sessions.c \
+ slist.c sockutil.c timeout.c users.c $(RDB_C) $(MYSQL_C)
+
+###########################################################################
+
+.c.obj:
+ $(CC) $(CFLAGS) -c $<
+
+all: $(PROGRAM)
+
+$(PROGRAM): $(OBJS) win32.res
+ $(CC) $(OBJS) win32.res /link /out:$(PROGRAM) /implib:anope.lib $(LIBS) $(LFLAGS) $(MLIBS) $(ELIBS)
+
+spotless:
+ -@erase *.obj *.exe *.exp *.lib tools\*.exe *.res win32.rc *.manifest
+
+install:
+ -@copy anope.exe ..\anope.exe
+ -@mkdir ..\$(DATDEST)\bin
+ -@copy bin\* ..\$(DATDEST)\bin
+ -@copy anope.exe.manifest ..\anope.exe.manifest
+
+win32.res: win32.rc
+ $(RC) /l 0x409 $(RC_FLAGS) /fowin32.res win32.rc
+
+
+###########################################################################
+
+# Catch any changes in compilation options at the top of this file
+$(OBJS):
+
+actions.obj: actions.c ..\include\services.h
+base64.obj: base64.c ..\include\services.h
+botserv.obj: botserv.c ..\include\services.h ..\include\pseudo.h ..\include\language.h
+channels.obj: channels.c ..\include\services.h
+chanserv.obj: chanserv.c ..\include\services.h ..\include\pseudo.h
+commands.obj: commands.c ..\include\services.h ..\include\commands.h ..\include\language.h
+compat.obj: compat.c ..\include\services.h
+config.obj: config.c ..\include\services.h
+datafiles.obj: datafiles.c ..\include\services.h ..\include\datafiles.h
+encrypt.obj: encrypt.c ..\include\encrypt.h ..\include\sysconf.h
+events.obj: events.c ..\include\modules.h ..\include\language.h ..\include\version.h
+init.obj: init.c ..\include\services.h
+ircd.obj: ircd.c ..\include\services.h
+hostserv.obj: hostserv.c ..\include\services.h ..\include\pseudo.h
+language.obj: language.c ..\include\services.h ..\include\language.h
+list.obj: list.c ..\include\services.h
+log.obj: log.c ..\include\services.h ..\include\pseudo.h
+mail.obj: mail.c ..\include\services.h ..\include\language.h
+main.obj: main.c ..\include\services.h ..\include\timeout.h ..\include\version.h
+memory.obj: memory.c ..\include\services.h
+memoserv.obj: memoserv.c ..\include\services.h ..\include\pseudo.h
+messages.obj: messages.c ..\include\services.h ..\include\messages.h ..\include\language.h
+modules.obj: modules.c ..\include\modules.h ..\include\language.h ..\include\version.h
+mod_version.obj: mod_version.c ..\include\modules.h ..\include\version.h
+misc.obj: misc.c ..\include\services.h ..\include\language.h
+news.obj: news.c ..\include\services.h ..\include\pseudo.h
+nickserv.obj: nickserv.c ..\include\services.h ..\include\pseudo.h
+operserv.obj: operserv.c ..\include\services.h ..\include\pseudo.h
+process.obj: process.c ..\include\services.h ..\include\messages.h
+send.obj: send.c ..\include\services.h
+servers.obj: servers.c ..\include\services.h
+sessions.obj: sessions.c ..\include\services.h ..\include\pseudo.h
+slist.obj: slist.c ..\include\services.h ..\include\slist.h
+sockutil.obj: sockutil.c ..\include\services.h
+timeout.obj: timeout.c ..\include\services.h ..\include\timeout.h
+users.obj: users.c ..\include\services.h
+vsnprintf.obj: vsnprintf.c
+
+###########################################################################
+
+..\include\services.h: ..\include\sysconf.h ..\include\config.h ..\include\extern.h
+
+..\include\extern.h: ..\include\slist.h
+
+..\include\pseudo.h: ..\include\commands.h ..\include\language.h ..\include\timeout.h ..\include\encrypt.h ..\include\datafiles.h ..\include\slist.h
+
+###########################################################################
+
+FRC:
diff --git a/src/memory.c b/src/memory.c
new file mode 100644
index 000000000..056a29a76
--- /dev/null
+++ b/src/memory.c
@@ -0,0 +1,138 @@
+/* Memory management routines.
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+
+#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.)
+ */
+
+/*************************************************************************/
+
+/**
+ * malloc, replacement so we can trap for "out of memory"
+ * @param size to allocate
+ * @return void
+ */
+void *smalloc(long size)
+{
+ void *buf;
+
+ if (!size) {
+ size = 1;
+ }
+ buf = malloc(size);
+ if (!buf)
+#ifndef _WIN32
+ raise(SIGUSR1);
+#else
+ abort();
+#endif
+ return buf;
+}
+
+/*************************************************************************/
+
+/**
+ * calloc, replacement so we can trap for "out of memory"
+ * @param elsize to allocate
+ * @param els size of members
+ * @return void
+ */
+void *scalloc(long elsize, long els)
+{
+ void *buf;
+
+ if (!elsize || !els) {
+ elsize = els = 1;
+ }
+ buf = calloc(elsize, els);
+ if (!buf)
+#ifndef _WIN32
+ raise(SIGUSR1);
+#else
+ abort();
+#endif
+ return buf;
+}
+
+/*************************************************************************/
+
+/**
+ * realloc, replacement so we can trap for "out of memory"
+ * @param oldptr Old Pointer
+ * @param newsize Size of new pointer
+ * @return void
+ */
+void *srealloc(void *oldptr, long newsize)
+{
+ void *buf;
+
+ if (!newsize) {
+ newsize = 1;
+ }
+ buf = realloc(oldptr, newsize);
+ if (!buf)
+#ifndef _WIN32
+ raise(SIGUSR1);
+#else
+ abort();
+#endif
+ return buf;
+}
+
+/*************************************************************************/
+
+/**
+ * strdup, replacement so we can trap for "out of memory"
+ * @param oldptr Old Pointer
+ * @param newsize Size of new pointer
+ * @return void
+ */
+char *sstrdup(const char *src)
+{
+ char *ret = NULL;
+ if (src) {
+#ifdef __STRICT_ANSI__
+ if ((ret = (char *) malloc(strlen(src) + 1))) {;
+ strcpy(ret, src);
+ }
+#else
+ ret = strdup(src);
+#endif
+ if (!ret)
+#ifndef _WIN32
+ raise(SIGUSR1);
+#else
+ abort();
+#endif
+ } else {
+ alog("sstrdup() called with NULL-arg");
+ if (debug)
+ do_backtrace(0);
+ }
+
+ return ret;
+}
+
+/*************************************************************************/
+/*************************************************************************/
+
+/* In the future: malloc() replacements that tell us if we're leaking and
+ * maybe do sanity checks too... */
+
+/*************************************************************************/
diff --git a/src/memoserv.c b/src/memoserv.c
new file mode 100644
index 000000000..c55f9633f
--- /dev/null
+++ b/src/memoserv.c
@@ -0,0 +1,445 @@
+/* MemoServ functions.
+*
+* (C) 2003-2008 Anope Team
+* Contact us at info@anope.org
+*
+* Please read COPYING and README for further details.
+*
+* Based on the original code of Epona by Lara.
+* Based on the original code of Services by Andy Church.
+*
+* $Id$
+*
+*/
+
+#include "services.h"
+#include "pseudo.h"
+
+/*************************************************************************/
+/* *INDENT-OFF* */
+
+NickCore *nclists[1024];
+E void moduleAddMemoServCmds(void);
+static void new_memo_mail(NickCore *nc, Memo *m);
+E void rsend_notify(User *u, Memo *m, const char *chan);
+
+/*************************************************************************/
+
+void moduleAddMemoServCmds(void) {
+ modules_core_init(MemoServCoreNumber, MemoServCoreModules);
+}
+
+/*************************************************************************/
+/*************************************************************************/
+/* *INDENT-ON* */
+
+/**
+ * MemoServ initialization.
+ * @return void
+ */
+void ms_init(void)
+{
+ moduleAddMemoServCmds();
+}
+
+/*************************************************************************/
+
+/**
+ * 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.
+ * @param u User Struct
+ * @param buf Buffer containing the privmsg
+ * @return void
+ */
+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 = "";
+ }
+ anope_cmd_ctcp(s_MemoServ, u->nick, "PING %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).
+ * @param u User Struct
+ * @return void
+ */
+void check_memos(User * u)
+{
+ NickCore *nc;
+ int i, newcnt = 0;
+
+ if (!u) {
+ if (debug) {
+ alog("debug: check_memos called with NULL values");
+ }
+ return;
+ }
+
+ 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.
+ * @param name Name to check
+ * @param ischan - the result its a channel will be stored in here
+ * @param isforbid - the result if its forbidden will be stored in here
+ * @return `ischan' 1 if the name was a channel name, else 0.
+ * @return `isforbid' 1 if the name is forbidden, else 0.
+ */
+MemoInfo *getmemoinfo(const char *name, int *ischan, int *isforbid)
+{
+ if (*name == '#') {
+ ChannelInfo *ci;
+ if (ischan)
+ *ischan = 1;
+ ci = cs_findchan(name);
+ if (ci) {
+ if (!(ci->flags & CI_VERBOTEN)) {
+ *isforbid = 0;
+ return &ci->memos;
+ } else {
+ *isforbid = 1;
+ return NULL;
+ }
+ } else {
+ *isforbid = 0;
+ return NULL;
+ }
+ } else {
+ NickAlias *na;
+ if (ischan)
+ *ischan = 0;
+ na = findnick(name);
+ if (na) {
+ if (!(na->status & NS_VERBOTEN)) {
+ *isforbid = 0;
+ return &na->nc->memos;
+ } else {
+ *isforbid = 1;
+ return NULL;
+ }
+ } else {
+ *isforbid = 0;
+ return NULL;
+ }
+ }
+}
+
+/*************************************************************************/
+
+/**
+ * Split from do_send, this way we can easily send a memo from any point
+ * @param u User Struct
+ * @param name Target of the memo
+ * @param text Memo Text
+ * @param z type see info
+ * 0 - reply to user
+ * 1 - silent
+ * 2 - silent with no delay timer
+ * 3 - reply to user and request read receipt
+ * @return void
+ */
+void memo_send(User * u, char *name, char *text, int z)
+{
+ int ischan;
+ int isforbid;
+ Memo *m;
+ MemoInfo *mi;
+ time_t now = time(NULL);
+ char *source = u->na->nc->display;
+ int is_servoper = is_services_oper(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);
+
+ if (z == 3)
+ syntax_error(s_MemoServ, u, "RSEND", MEMO_RSEND_SYNTAX);
+
+ } else if (!nick_recognized(u)) {
+ if (z == 0 || z == 3)
+ notice_lang(s_MemoServ, u, NICK_IDENTIFY_REQUIRED, s_NickServ);
+
+ } else if (!(mi = getmemoinfo(name, &ischan, &isforbid))) {
+ if (z == 0 || z == 3) {
+ if (isforbid) {
+ notice_lang(s_MemoServ, u,
+ ischan ? CHAN_X_FORBIDDEN :
+ NICK_X_FORBIDDEN, name);
+ } else {
+ 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_servoper) {
+ u->lastmemosend = now;
+ if (z == 0)
+ notice_lang(s_MemoServ, u, MEMO_SEND_PLEASE_WAIT, MSSendDelay);
+
+ if (z == 3)
+ notice_lang(s_MemoServ, u, MEMO_RSEND_PLEASE_WAIT,
+ MSSendDelay);
+
+ } else if (mi->memomax == 0 && !is_servoper) {
+ if (z == 0 || z == 3)
+ notice_lang(s_MemoServ, u, MEMO_X_GETS_NO_MEMOS, name);
+
+ } else if (mi->memomax > 0 && mi->memocount >= mi->memomax
+ && !is_servoper) {
+ if (z == 0 || z == 3)
+ 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);
+ m->moduleData = NULL;
+ 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;
+ /* Set notify sent flag - DrStein */
+ if (z == 2) {
+ m->flags |= MF_NOTIFYS;
+ }
+ /* Set receipt request flag */
+ if (z == 3)
+ m->flags |= MF_RECEIPT;
+ if (z == 0 || z == 3)
+ 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)
+ && (nc->flags & NI_MEMO_RECEIVE))
+ notice_lang(s_MemoServ, u, MEMO_NEW_MEMO_ARRIVED,
+ source, s_MemoServ, m->number);
+ } /* if (flags & MEMO_RECEIVE) */
+ }
+ /* if (MSNotifyAll) */
+ /* let's get out the mail if set in the nickcore - certus */
+ if (nc->flags & NI_MEMO_MAIL)
+ new_memo_mail(nc, m);
+ } 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 */
+}
+
+/*************************************************************************/
+/**
+ * Delete a memo by number.
+ * @param mi Memoinfo struct
+ * @param num Memo number to delete
+ * @return int 1 if the memo was found, else 0.
+ */
+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) {
+ moduleCleanStruct(&mi->memos[i].moduleData);
+ 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;
+ }
+}
+
+/*************************************************************************/
+
+static void new_memo_mail(NickCore * nc, Memo * m)
+{
+ MailInfo *mail = NULL;
+
+ if (!nc || !m)
+ return;
+
+ mail = MailMemoBegin(nc);
+ if (!mail) {
+ return;
+ }
+ fprintf(mail->pipe, getstring2(NULL, MEMO_MAIL_TEXT1), nc->display);
+ fprintf(mail->pipe, "\n");
+ fprintf(mail->pipe, getstring2(NULL, MEMO_MAIL_TEXT2), m->sender,
+ m->number);
+ fprintf(mail->pipe, "\n\n");
+ fprintf(mail->pipe, getstring2(NULL, MEMO_MAIL_TEXT3));
+ fprintf(mail->pipe, "\n\n");
+ fprintf(mail->pipe, "%s", m->text);
+ fprintf(mail->pipe, "\n");
+ MailEnd(mail);
+ return;
+}
+
+
+/*************************************************************************/
+/* Send receipt notification to sender. */
+
+void rsend_notify(User * u, Memo * m, const char *chan)
+{
+ NickAlias *na;
+ NickCore *nc;
+ char text[256];
+ const char *fmt;
+
+ /* Only send receipt if memos are allowed */
+ if ((!readonly) && (!checkDefCon(DEFCON_NO_NEW_MEMOS))) {
+
+ /* Get nick alias for sender */
+ na = findnick(m->sender);
+
+ if (!na) {
+ return;
+ }
+
+ /* Get nick core for sender */
+ nc = na->nc;
+
+ if (!nc) {
+ return;
+ }
+
+ /* Text of the memo varies if the recepient was a
+ nick or channel */
+ if (chan) {
+ fmt = getstring(na, MEMO_RSEND_CHAN_MEMO_TEXT);
+ sprintf(text, fmt, chan);
+ } else {
+ fmt = getstring(na, MEMO_RSEND_NICK_MEMO_TEXT);
+ sprintf(text, fmt);
+ }
+
+ /* Send notification */
+ memo_send(u, m->sender, text, 2);
+
+ /* Notify recepient of the memo that a notification has
+ been sent to the sender */
+ notice_lang(s_MemoServ, u, MEMO_RSEND_USER_NOTIFICATION,
+ nc->display);
+ }
+
+ /* Remove receipt flag from the original memo */
+ m->flags &= ~MF_RECEIPT;
+
+ return;
+}
diff --git a/src/messages.c b/src/messages.c
new file mode 100644
index 000000000..33dd54619
--- /dev/null
+++ b/src/messages.c
@@ -0,0 +1,415 @@
+/* Definitions of IRC message functions and list of messages.
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+
+#include "services.h"
+#include "messages.h"
+#include "language.h"
+
+int servernum;
+
+/*************************************************************************/
+
+int m_nickcoll(char *user)
+{
+ if (!skeleton && !readonly)
+ introduce_user(user);
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+int m_away(char *source, char *msg)
+{
+ User *u;
+
+ u = finduser(source);
+
+ if (u && msg == 0) /* un-away */
+ check_memos(u);
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+int m_kill(char *nick, char *msg)
+{
+ BotInfo *bi;
+
+ /* Recover if someone kills us. */
+ /* use nickIsServices() to reduce the number of lines of code - TSL */
+ if (nickIsServices(nick, 0)) {
+ if (!readonly && !skeleton)
+ introduce_user(nick);
+ } else if (s_BotServ && (bi = findbot(nick))) {
+ if (!readonly && !skeleton) {
+ introduce_user(nick);
+ bot_rejoin_all(bi);
+ }
+ } else {
+ do_kill(nick, msg);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+int m_time(char *source, int ac, char **av)
+{
+ time_t t;
+ struct tm *tm;
+ char buf[64];
+
+ if (!source) {
+ return MOD_CONT;
+ }
+
+ time(&t);
+ tm = localtime(&t);
+ strftime(buf, sizeof(buf), "%a %b %d %H:%M:%S %Y %Z", tm);
+ anope_cmd_391(source, buf);
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+int m_motd(char *source)
+{
+ FILE *f;
+ char buf[BUFSIZE];
+
+ if (!source) {
+ return MOD_CONT;
+ }
+
+ f = fopen(MOTDFilename, "r");
+ if (f) {
+ anope_cmd_375(source);
+ while (fgets(buf, sizeof(buf), f)) {
+ buf[strlen(buf) - 1] = 0;
+ anope_cmd_372(source, buf);
+ }
+ fclose(f);
+ anope_cmd_376(source);
+ } else {
+ anope_cmd_372_error(source);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+int m_privmsg(char *source, char *receiver, char *msg)
+{
+ char *s;
+ time_t starttime, stoptime; /* When processing started and finished */
+
+ BotInfo *bi;
+ ChannelInfo *ci;
+ User *u;
+
+ if (!source || !*source || !*receiver || !receiver || !msg) {
+ return MOD_CONT;
+ }
+
+ u = finduser(source);
+
+ if (!u) {
+ alog("%s: user record for %s not found", msg, source);
+ anope_cmd_notice(receiver, source,
+ getstring(NULL, USER_RECORD_NOT_FOUND));
+ return MOD_CONT;
+ }
+
+ if (*receiver == '#') {
+ if (s_BotServ && (ci = cs_findchan(receiver))) {
+ /* Some paranoia checks */
+ if (!(ci->flags & CI_VERBOTEN) && ci->c && ci->bi) {
+ botchanmsgs(u, ci, msg);
+ }
+ }
+ } else {
+ /* Check if we should ignore. Operators always get through. */
+ if (allow_ignore && !is_oper(u)) {
+ IgnoreData *ign = get_ignore(source);
+ if (ign) {
+ 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(receiver, '@');
+ if (s) {
+ *s++ = 0;
+ if (stricmp(s, ServerName) != 0)
+ return MOD_CONT;
+ } else if (UseStrictPrivMsg) {
+ if (debug) {
+ alog("Ignored PRIVMSG without @ from %s", source);
+ }
+ notice_lang(receiver, u, INVALID_TARGET, receiver, receiver,
+ ServerName, receiver);
+ return MOD_CONT;
+ }
+
+ starttime = time(NULL);
+
+ if ((stricmp(receiver, s_OperServ) == 0)
+ || (s_OperServAlias
+ && (stricmp(receiver, s_OperServAlias) == 0))) {
+ if (!is_oper(u) && OSOpersOnly) {
+ notice_lang(s_OperServ, u, ACCESS_DENIED);
+ if (WallBadOS)
+ anope_cmd_global(s_OperServ,
+ "Denied access to %s from %s!%s@%s (non-oper)",
+ s_OperServ, u->nick, u->username,
+ u->host);
+ } else {
+ operserv(u, msg);
+ }
+ } else if ((stricmp(receiver, s_NickServ) == 0)
+ || (s_NickServAlias
+ && (stricmp(receiver, s_NickServAlias) == 0))) {
+ nickserv(u, msg);
+ } else if ((stricmp(receiver, s_ChanServ) == 0)
+ || (s_ChanServAlias
+ && (stricmp(receiver, s_ChanServAlias) == 0))) {
+ if (!is_oper(u) && CSOpersOnly)
+ notice_lang(s_ChanServ, u, ACCESS_DENIED);
+ else
+ chanserv(u, msg);
+ } else if ((stricmp(receiver, s_MemoServ) == 0)
+ || (s_MemoServAlias
+ && (stricmp(receiver, s_MemoServAlias) == 0))) {
+ memoserv(u, msg);
+ } else if (s_HostServ && ((stricmp(receiver, s_HostServ) == 0)
+ || (s_HostServAlias
+ &&
+ (stricmp(receiver, s_HostServAlias)
+ == 0)))) {
+ hostserv(u, msg);
+ } else if (s_HelpServ && ((stricmp(receiver, s_HelpServ) == 0)
+ || (s_HelpServAlias
+ &&
+ (stricmp(receiver, s_HelpServAlias)
+ == 0)))) {
+ helpserv(u, msg);
+ } else if (s_BotServ && ((stricmp(receiver, s_BotServ) == 0)
+ || (s_BotServAlias
+ && (stricmp(receiver, s_BotServAlias)
+ == 0)))) {
+ botserv(u, msg);
+ } else if (s_BotServ && (bi = findbot(receiver))) {
+ botmsgs(u, bi, msg);
+ }
+
+ /* 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;
+}
+
+/*************************************************************************/
+
+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) {
+ anope_cmd_211
+ ("%s Server SendBuf SentBytes SentMsgs RecvBuf "
+ "RecvBytes RecvMsgs ConnTime", source);
+ anope_cmd_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) {
+ anope_cmd_211
+ ("%s Server SendBuf SentBytes SentMsgs RecvBuf "
+ "RecvBytes RecvMsgs ConnTime", source);
+ anope_cmd_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) {
+ anope_cmd_211
+ ("%s Server SendBuf SentBytes SentMsgs RecvBuf "
+ "RecvBytes RecvMsgs ConnTime", source);
+ anope_cmd_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);
+ }
+ }
+
+ anope_cmd_219(source, av[0]);
+ break;
+ case 'o':
+ case 'O':
+/* Check whether the user is an operator */
+ u = finduser(source);
+ if (u && !is_oper(u) && HideStatsO) {
+ anope_cmd_219(source, av[0]);
+ } else {
+ for (i = 0; i < RootNumber; i++)
+ anope_cmd_243("%s O * * %s Root 0", source,
+ ServicesRoots[i]);
+ for (i = 0; i < servadmins.count && (nc = servadmins.list[i]);
+ i++)
+ anope_cmd_243("%s O * * %s Admin 0", source, nc->display);
+ for (i = 0; i < servopers.count && (nc = servopers.list[i]);
+ i++)
+ anope_cmd_243("%s O * * %s Oper 0", source, nc->display);
+
+ anope_cmd_219(source, av[0]);
+ }
+
+ break;
+
+ case 'u':{
+ int uptime = time(NULL) - start_time;
+ anope_cmd_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);
+ anope_cmd_250("%s :Current users: %d (%d ops); maximum %d",
+ source, usercnt, opcnt, maxusercnt);
+ anope_cmd_219(source, av[0]);
+ break;
+ } /* case 'u' */
+
+ default:
+ anope_cmd_219(source, av[0]);
+ break;
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+int m_version(char *source, int ac, char **av)
+{
+ if (source) {
+ anope_cmd_351(source);
+ }
+ return MOD_CONT;
+}
+
+
+/*************************************************************************/
+
+int m_whois(char *source, char *who)
+{
+ BotInfo *bi;
+ NickAlias *na;
+ const char *clientdesc;
+
+ if (source && who) {
+ if (stricmp(who, s_NickServ) == 0)
+ clientdesc = desc_NickServ;
+ else if (stricmp(who, s_ChanServ) == 0)
+ clientdesc = desc_ChanServ;
+ else if (stricmp(who, s_MemoServ) == 0)
+ clientdesc = desc_MemoServ;
+ else if (s_BotServ && stricmp(who, s_BotServ) == 0)
+ clientdesc = desc_BotServ;
+ else if (s_HostServ && stricmp(who, s_HostServ) == 0)
+ clientdesc = desc_HostServ;
+ else if (stricmp(who, s_HelpServ) == 0)
+ clientdesc = desc_HelpServ;
+ else if (stricmp(who, s_OperServ) == 0)
+ clientdesc = desc_OperServ;
+ else if (stricmp(who, s_GlobalNoticer) == 0)
+ clientdesc = desc_GlobalNoticer;
+ else if (s_DevNull && stricmp(who, s_DevNull) == 0)
+ clientdesc = desc_DevNull;
+ else if (s_BotServ && (bi = findbot(who))) {
+ /* Bots are handled separately */
+ anope_cmd_311("%s %s %s %s * :%s", source, bi->nick,
+ bi->user, bi->host, bi->real);
+ anope_cmd_307("%s %s :is a registered nick", source, bi->nick);
+ anope_cmd_312("%s %s %s :%s", source, bi->nick, ServerName,
+ ServerDesc);
+ anope_cmd_317("%s %s %ld %ld :seconds idle, signon time",
+ source, bi->nick, time(NULL) - bi->lastmsg,
+ start_time);
+ anope_cmd_318(source, bi->nick);
+ return MOD_CONT;
+ } else if (!(ircd->svshold && UseSVSHOLD) && (na = findnick(who))
+ && (na->status & NS_KILL_HELD)) {
+ /* We have a nick enforcer client here that we need to respond to.
+ * We can't just say it doesn't exist here, even tho it does for
+ * other servers :) -GD
+ */
+ anope_cmd_311("%s %s %s %s * :Services Enforcer", source,
+ na->nick, NSEnforcerUser, NSEnforcerHost);
+ anope_cmd_312("%s %s %s :%s", source, na->nick, ServerName,
+ ServerDesc);
+ anope_cmd_318(source, na->nick);
+ return MOD_CONT;
+ } else {
+ anope_cmd_401(source, who);
+ return MOD_CONT;
+ }
+ anope_cmd_311("%s %s %s %s * :%s", source, who,
+ ServiceUser, ServiceHost, clientdesc);
+ anope_cmd_312("%s %s %s :%s", source, who, ServerName, ServerDesc);
+ anope_cmd_317("%s %s %ld %ld :seconds idle, signon time", source,
+ who, time(NULL) - start_time, start_time);
+ anope_cmd_318(source, who);
+ }
+ return MOD_CONT;
+}
+
+/* NULL route messages */
+int anope_event_null(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+/* *INDENT-OFF* */
+void moduleAddMsgs(void) {
+ Message *m;
+ m = createMessage("STATS", m_stats); addCoreMessage(IRCD,m);
+ m = createMessage("TIME", m_time); addCoreMessage(IRCD,m);
+ m = createMessage("VERSION", m_version); addCoreMessage(IRCD,m);
+}
+
+/*************************************************************************/
+
+Message *find_message(const char *name)
+{
+ Message *m;
+ m = findMessage(IRCD, name);
+ return m;
+}
+
+/*************************************************************************/
diff --git a/src/misc.c b/src/misc.c
new file mode 100644
index 000000000..68c470192
--- /dev/null
+++ b/src/misc.c
@@ -0,0 +1,1663 @@
+
+/* Miscellaneous routines.
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+
+#include "services.h"
+#include "language.h"
+
+/* Cheaper than isspace() or isblank() */
+#define issp(c) ((c) == 32)
+
+struct arc4_stream {
+ u_int8_t i;
+ u_int8_t j;
+ u_int8_t s[256];
+} rs;
+
+/*************************************************************************/
+
+/**
+ * toupper: Like the ANSI functions, but make sure we return an
+ * int instead of a (signed) char.
+ * @param c Char
+ * @return int
+ */
+int toupper(char c)
+{
+ if (islower(c)) {
+ return (unsigned char) c - ('a' - 'A');
+ } else {
+ return (unsigned char) c;
+ }
+}
+
+/*************************************************************************/
+
+/**
+ * tolower: Like the ANSI functions, but make sure we return an
+ * int instead of a (signed) char.
+ * @param c Char
+ * @return int
+ */
+int tolower(char c)
+{
+ if (isupper(c)) {
+ return (unsigned char) c + ('a' - 'A');
+ } else {
+ return (unsigned char) c;
+ }
+}
+
+/*************************************************************************/
+
+/**
+ * Simple function to convert binary data to hex.
+ * Taken from hybrid-ircd ( http://ircd-hybrid.com/ )
+ */
+void binary_to_hex(unsigned char *bin, char *hex, int length)
+{
+ static const char trans[] = "0123456789ABCDEF";
+ int i;
+
+ for (i = 0; i < length; i++) {
+ hex[i << 1] = trans[bin[i] >> 4];
+ hex[(i << 1) + 1] = trans[bin[i] & 0xf];
+ }
+
+ hex[i << 1] = '\0';
+}
+
+
+/*************************************************************************/
+
+/**
+ * strscpy: Copy at most len-1 characters from a string to a buffer, and
+ * add a null terminator after the last character copied.
+ * @param d Buffer to copy into
+ * @param s Data to copy int
+ * @param len Length of data
+ * @return updated buffer
+ */
+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.
+ * @param s1 String 1
+ * @param s2 String 2
+ * @return first occurrence of s2
+ */
+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.
+ * @param s String
+ * @param size size of s
+ * @param old character to replace
+ * @param new character to replace with
+ * @return updated s
+ */
+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 - oldlen);
+ 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.
+ * @param int Number of Args
+ * @param argv Array
+ * @return string of the merged array
+ */
+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;
+}
+
+/*************************************************************************/
+
+/**
+ * do_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.
+ * @param pattern To be matched
+ * @param str String in which the pattern is to be matched
+ * @param docase Case In/Senstive
+ * @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;
+
+ if (!str || !*str || !pattern || !*pattern) {
+ return 0;
+ }
+
+ /* 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 */
+ }
+}
+
+/*************************************************************************/
+
+/**
+ * match_wild: Case Senstive wild card search
+ * @param pattern To be matched
+ * @param str String in which the pattern is to be matched
+ * @return 1 if the string matches the pattern, 0 if not.
+ */
+int match_wild(const char *pattern, const char *str)
+{
+ return do_match_wild(pattern, str, 1);
+}
+
+/*************************************************************************/
+
+/**
+ * match_wild: Case Insenstive wild card search
+ * @param pattern To be matched
+ * @param str String in which the pattern is to be matched
+ * @return 1 if the string matches the pattern, 0 if not.
+ */
+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)
+ * @param numstr
+ * @param count_ret
+ * @param callback Call back function
+ * @param u User Struct
+ * @param ... various args
+ * @return int
+ */
+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, preserve;
+
+ if (!numstr || !*numstr) {
+ return -1;
+ }
+
+ 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++) {
+ VA_COPY(preserve, args);
+ res = callback(u, i, preserve);
+ va_end(preserve);
+ 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;
+
+ va_end(args);
+
+ 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).
+ * @param s String to convert
+ * @return int
+ */
+int dotime(const char *s)
+{
+ int amount;
+
+ if (!s || !*s) {
+ return -1;
+ }
+
+ 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).
+ * @param na Nick Alias
+ * @param buf buffer to store result into
+ * @param bufsize Size of the buffer
+ * @param seconds time in seconds
+ * @return buffer
+ */
+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 ..."
+ * @param na Nick Alias
+ * @param buf buffer to store result into
+ * @param bufsize Size of the buffer
+ * @param seconds time in seconds
+ * @return buffer
+ */
+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;
+}
+
+
+/*************************************************************************/
+
+/**
+ * Validate the host
+ * shortname = ( letter / digit ) *( letter / digit / "-" ) *( letter / digit )
+ * hostname = shortname *( "." shortname )
+ * ip4addr = 1*3digit "." 1*3digit "." 1*3digit "." 1*3digit
+ * @param host = string to check
+ * @param type = format, 1 = ip4addr, 2 = hostname
+ * @return 1 if a host is valid, 0 if it isnt.
+ */
+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;
+}
+
+/*************************************************************************/
+
+/**
+ * Front end to doValidHost
+ * @param host = string to check
+ * @param type = format, 1 = ip4addr, 2 = hostname
+ * @return 1 if a host is valid, 0 if it isnt.
+ */
+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;
+}
+
+/*************************************************************************/
+
+/**
+ * Valid character check
+ * @param c Character to check
+ * @return 1 if a host is valid, 0 if it isnt.
+ */
+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;
+}
+
+
+/*************************************************************************/
+
+/**
+ * Get the token
+ * @param str String to search in
+ * @param dilim Character to search for
+ * @param token_number the token number
+ * @return token
+ */
+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;
+}
+
+/*************************************************************************/
+
+/**
+ * Get the token only
+ * @param str String to search in
+ * @param dilim Character to search for
+ * @param token_number the token number
+ * @return token
+ */
+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;
+}
+
+/*************************************************************************/
+
+/**
+ * Get the Remaining tokens
+ * @param str String to search in
+ * @param dilim Character to search for
+ * @param token_number the token number
+ * @return token
+ */
+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;
+}
+
+/*************************************************************************/
+
+/**
+ * Get the string between point A and point B
+ * @param str String to search in
+ * @param start Point A
+ * @param end Point B
+ * @return the string in between
+ */
+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 protocol_debug(char *source, char *cmd, int argc, char **argv)
+{
+ int i;
+
+ if (protocoldebug) {
+ if (source)
+ alog("debug: Source %s", source);
+ if (cmd)
+ alog("debug: Token %s", cmd);
+ if (argc) {
+ for (i = 0; i < argc; i++) {
+ alog("debug: av[%d] = %s", i, argv[i]);
+ }
+ } else {
+ alog("debug: av[0] = NULL");
+ }
+ }
+ return;
+}
+
+/*************************************************************************/
+
+/**
+ * Clean up the buffer for extra spaces
+ * @param str to clean up
+ * @return void
+ */
+void doCleanBuffer(char *str)
+{
+ char *in, *out;
+ char ch;
+
+ if (!str) {
+ return;
+ }
+
+ in = str;
+ out = str;
+
+ 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' */
+}
+
+/*************************************************************************/
+
+/**
+ * Kill the user to enforce the sqline
+ * @param nick to kill
+ * @param killer whom is doing the killing
+ * @return void
+ */
+void EnforceQlinedNick(char *nick, char *killer)
+{
+ User *u2;
+
+ if ((u2 = finduser(nick))) {
+ alog("Killed Q-lined nick: %s!%s@%s", u2->nick, u2->username,
+ u2->host);
+ kill_user(killer, u2->nick,
+ "This nick is reserved for Services. Please use a non Q-Lined nick.");
+ }
+}
+
+/*************************************************************************/
+
+/**
+ * Is the given nick a network service
+ * @param nick to check
+ * @param int Check if botserv bots
+ * @return int
+ */
+int nickIsServices(char *tempnick, int bot)
+{
+ int found = 0;
+ char *s, *nick;
+
+ if (!tempnick) {
+ return found;
+ }
+
+ nick = sstrdup(tempnick);
+
+ s = strchr(nick, '@');
+ if (s) {
+ *s++ = 0;
+ if (stricmp(s, ServerName) != 0) {
+ free(nick);
+ return found;
+ }
+ }
+
+ if (s_NickServ && (stricmp(nick, s_NickServ) == 0))
+ found++;
+ else if (s_ChanServ && (stricmp(nick, s_ChanServ) == 0))
+ found++;
+ else if (s_HostServ && (stricmp(nick, s_HostServ) == 0))
+ found++;
+ else if (s_MemoServ && (stricmp(nick, s_MemoServ) == 0))
+ found++;
+ else if (s_BotServ && (stricmp(nick, s_BotServ) == 0))
+ found++;
+ else if (s_HelpServ && (stricmp(nick, s_HelpServ) == 0))
+ found++;
+ else if (s_OperServ && (stricmp(nick, s_OperServ) == 0))
+ found++;
+ else if (s_DevNull && (stricmp(nick, s_DevNull) == 0))
+ found++;
+ else if (s_GlobalNoticer && (stricmp(nick, s_GlobalNoticer) == 0))
+ found++;
+ else if (s_NickServAlias && (stricmp(nick, s_NickServAlias) == 0))
+ found++;
+ else if (s_ChanServAlias && (stricmp(nick, s_ChanServAlias) == 0))
+ found++;
+ else if (s_MemoServAlias && (stricmp(nick, s_MemoServAlias) == 0))
+ found++;
+ else if (s_BotServAlias && (stricmp(nick, s_BotServAlias) == 0))
+ found++;
+ else if (s_HelpServAlias && (stricmp(nick, s_HelpServAlias) == 0))
+ found++;
+ else if (s_OperServAlias && (stricmp(nick, s_OperServAlias) == 0))
+ found++;
+ else if (s_DevNullAlias && (stricmp(nick, s_DevNullAlias) == 0))
+ found++;
+ else if (s_HostServAlias && (stricmp(nick, s_HostServAlias) == 0))
+ found++;
+ else if (s_GlobalNoticerAlias
+ && (stricmp(nick, s_GlobalNoticerAlias) == 0))
+ found++;
+ else if (s_BotServ && bot) {
+ BotInfo *bi;
+ int i;
+ for (i = 0; i < 256; i++) {
+ for (bi = botlists[i]; bi; bi = bi->next) {
+ if (stricmp(nick, bi->nick) == 0) {
+ found++;
+ continue;
+ }
+ }
+ }
+ }
+
+ /* Somehow, something tells me we should free this :) -GD */
+ free(nick);
+
+ return found;
+}
+
+/*************************************************************************/
+
+/**
+ * arc4 init
+ * @return void
+ */
+static void arc4_init(void)
+{
+ int n;
+ for (n = 0; n < 256; n++)
+ rs.s[n] = n;
+ rs.i = 0;
+ rs.j = 0;
+}
+
+/*************************************************************************/
+
+/**
+ * arc4 addrandom
+ * @param data
+ * @param dalen Data Length
+ * @return void
+ */
+static void arc4_addrandom(void *dat, int datlen)
+{
+ int n;
+ u_int8_t si;
+
+ rs.i--;
+ for (n = 0; n < 256; n++) {
+ rs.i = (rs.i + 1);
+ si = rs.s[rs.i];
+ rs.j = (rs.j + si + ((unsigned char *) dat)[n % datlen]);
+ rs.s[rs.i] = rs.s[rs.j];
+ rs.s[rs.j] = si;
+ }
+}
+
+/*************************************************************************/
+
+/**
+ * random init
+ * @return void
+ */
+void rand_init(void)
+{
+ int n;
+#ifndef _WIN32
+ int fd;
+#endif
+ struct {
+#ifdef USE_MYSQL
+ int sqlrand;
+#endif
+#ifndef _WIN32
+ struct timeval nowt; /* time */
+ char rnd[32]; /* /dev/urandom */
+#else
+ MEMORYSTATUS mstat; /* memory status */
+ struct _timeb nowt; /* time */
+#endif
+ } rdat;
+
+ arc4_init();
+
+ /* Grab "random" MYSQL data */
+#ifdef USE_MYSQL
+ rdat.sqlrand = mysql_rand();
+#endif
+
+ /* Grab OS specific "random" data */
+#ifndef _WIN32
+ /* unix/bsd: time */
+ gettimeofday(&rdat.nowt, NULL);
+ /* unix/bsd: /dev/urandom */
+ fd = open("/dev/urandom", O_RDONLY);
+ if (fd) {
+ n = read(fd, &rdat.rnd, sizeof(rdat.rnd));
+ close(fd);
+ }
+#else
+ /* win32: time */
+ _ftime(&rdat.nowt);
+ /* win32: memory status */
+ GlobalMemoryStatus(&rdat.mstat);
+#endif
+
+ arc4_addrandom(&rdat, sizeof(rdat));
+}
+
+/*************************************************************************/
+
+/**
+ * Setup the random numbers
+ * @return void
+ */
+void add_entropy_userkeys(void)
+{
+ arc4_addrandom(&UserKey1, sizeof(UserKey1));
+ arc4_addrandom(&UserKey2, sizeof(UserKey2));
+ arc4_addrandom(&UserKey3, sizeof(UserKey3));
+ /* UserKey3 is also used in mysql_rand() */
+}
+
+/*************************************************************************/
+
+/**
+ * Get the random numbers 8 byte deep
+ * @return char
+ */
+unsigned char getrandom8(void)
+{
+ unsigned char si, sj;
+
+ rs.i = (rs.i + 1);
+ si = rs.s[rs.i];
+ rs.j = (rs.j + si);
+ sj = rs.s[rs.j];
+ rs.s[rs.i] = sj;
+ rs.s[rs.j] = si;
+ return (rs.s[(si + sj) & 0xff]);
+}
+
+/*************************************************************************/
+
+/**
+ * Get the random numbers 16 byte deep
+ * @return char
+ */
+u_int16_t getrandom16(void)
+{
+ u_int16_t val;
+
+ val = getrandom8() << 8;
+ val |= getrandom8();
+ return val;
+}
+
+/*************************************************************************/
+
+/**
+ * Get the random numbers 32 byte deep
+ * @return char
+ */
+u_int32_t getrandom32(void)
+{
+ u_int32_t val;
+
+ val = getrandom8() << 24;
+ val |= getrandom8() << 16;
+ val |= getrandom8() << 8;
+ val |= getrandom8();
+ return val;
+}
+
+/*************************************************************************/
+
+/**
+ * Determine if we need to send the TOKEN
+ * @param token1
+ * @param token2
+ * @return token to send
+ */
+char *send_token(char *token1, char *token2)
+{
+ if (UseTokens && ircd->token && ircdcap->token) {
+ return token2;
+ } else {
+ return token1;
+ }
+}
+
+/*************************************************************************/
+
+/**
+ * Number of tokens in a string
+ * @param str String
+ * @param dilim Dilimiter
+ * @return number of tokens
+ */
+int myNumToken(const char *str, const char dilim)
+{
+ int len, idx, counter = 0, start_pos = 0;
+ if (!str) {
+ return 0;
+ }
+ len = strlen(str);
+ for (idx = 0; idx <= len; idx++) {
+ if ((str[idx] == dilim) || (idx == len)) {
+ start_pos = idx + 1;
+ counter++;
+ }
+ }
+ return counter;
+}
+
+/*************************************************************************/
+
+/**
+ * Resolve a host to an IP
+ * @param host to convert
+ * @return ip address
+ */
+char *host_resolve(char *host)
+{
+ struct hostent *hentp = NULL;
+ uint32 ip = INADDR_NONE;
+ char ipbuf[16];
+ char *ipreturn;
+ struct in_addr addr;
+
+ ipreturn = NULL;
+
+ hentp = gethostbyname(host);
+
+ if (hentp) {
+ memcpy(&ip, hentp->h_addr, sizeof(hentp->h_length));
+ addr.s_addr = ip;
+ ntoa(addr, ipbuf, sizeof(ipbuf));
+ ipreturn = sstrdup(ipbuf);
+ if (debug) {
+ alog("debug: resolved %s to %s", host, ipbuf);
+ }
+ return ipreturn;
+ } else {
+ return ipreturn;
+ }
+}
+
+/*************************************************************************/
+
+/**
+ * Change an unsigned string to a signed string, overwriting the original
+ * string.
+ * @param input string
+ * @return output string, same as input string.
+ */
+
+char *str_signed(unsigned char *str)
+{
+ char *nstr;
+
+ nstr = (char *) str;
+ while (*str) {
+ *nstr = (char) *str;
+ str++;
+ nstr++;
+ }
+
+ return nstr;
+}
+
+/**
+ * Strip the mode prefix from the given string.
+ * Useful for using the modes stored in things like ircd->ownerset etc..
+ **/
+
+char *stripModePrefix(const char *str)
+{
+ if (str && ((*str == '+') || (*str == '-'))) {
+ return sstrdup(str + 1);
+ }
+ return NULL;
+}
+
+/* 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]);
+}
+
+/**
+ * Build a string list from a given source string.
+ * This is usually used for parsing out values from the config file, but could
+ * be used for other things.
+ * NOTE: this function uses strtok(), be aware it will break any buffer you think you have in there ;)
+ **/
+char **buildStringList(char *src, int *number)
+{
+ char *s;
+ int i = 0;
+ char **list = NULL;
+
+ if (src) {
+ s = strtok(src, " ");
+ do {
+ if (s) {
+ i++;
+ list = realloc(list, sizeof(char *) * i);
+ list[i - 1] = sstrdup(s);
+ }
+ } while ((s = strtok(NULL, " ")));
+ }
+ *number = i; /* always zero it, even if we have no setters */
+ return list;
+}
+
+/*
+* strlcat and strlcpy were ripped from openssh 2.5.1p2
+* They had the following Copyright info:
+*
+*
+* Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions
+* are met:
+* 1. Redistributions of source code must retain the above copyright
+* notice, this list of conditions and the following disclaimer.
+* 2. Redistributions in binary form must reproduce the above copyright
+* notice, this list of conditions and the following disclaimer in the
+* documentation and/or other materials provided with the distribution.
+* 3. The name of the author may not be used to endorse or promote products
+* derived from this software without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED `AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#ifndef HAVE_STRLCAT
+size_t strlcat(char *dst, const char *src, size_t siz)
+{
+ char *d = dst;
+ const char *s = src;
+ size_t n = siz, dlen;
+
+ while (n-- != 0 && *d != '\0')
+ d++;
+
+ dlen = d - dst;
+ n = siz - dlen;
+
+ if (n == 0)
+ return (dlen + strlen(s));
+
+ while (*s != '\0') {
+ if (n != 1) {
+ *d++ = *s;
+ n--;
+ }
+
+ s++;
+ }
+
+ *d = '\0';
+ return dlen + (s - src); /* count does not include NUL */
+}
+#endif
+
+#ifndef HAVE_STRLCPY
+size_t strlcpy(char *dst, const char *src, size_t siz)
+{
+ char *d = dst;
+ const char *s = src;
+ size_t n = siz;
+
+ /* Copy as many bytes as will fit */
+ if (n != 0 && --n != 0) {
+ do {
+ if ((*d++ = *s++) == 0)
+ break;
+ }
+ while (--n != 0);
+ }
+
+ /* Not enough room in dst, add NUL and traverse rest of src */
+ if (n == 0) {
+ if (siz != 0)
+ *d = '\0'; /* NUL-terminate dst */
+ while (*s++);
+ }
+
+ return s - src - 1; /* count does not include NUL */
+}
+#endif
+
+
+
+
+#ifdef _WIN32
+char *GetWindowsVersion(void)
+{
+ OSVERSIONINFOEX osvi;
+ BOOL bOsVersionInfoEx;
+ char buf[BUFSIZE];
+ char *extra;
+ char *cputype;
+ SYSTEM_INFO si;
+
+ ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
+ ZeroMemory(&si, sizeof(SYSTEM_INFO));
+ osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
+
+ if (!(bOsVersionInfoEx = GetVersionEx((OSVERSIONINFO *) & osvi))) {
+ osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+ if (!GetVersionEx((OSVERSIONINFO *) & osvi)) {
+ return sstrdup("");
+ }
+ }
+ GetSystemInfo(&si);
+
+ /* Determine CPU type 32 or 64 */
+ if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64 ) {
+ cputype = sstrdup(" 64-bit");
+ } else if (si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_INTEL ) {
+ cputype = sstrdup(" 32-bit");
+ } else if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_IA64 ) {
+ cputype = sstrdup(" Itanium 64-bit");
+ } else {
+ cputype = sstrdup(" ");
+ }
+
+ switch (osvi.dwPlatformId) {
+ /* test for the Windows NT product family. */
+ case VER_PLATFORM_WIN32_NT:
+ /* Windows Vista or Windows Server 2008 */
+ if (osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 0) {
+ if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE) {
+ extra = sstrdup("Enterprise Edition");
+ } else if (osvi.wSuiteMask & VER_SUITE_DATACENTER) {
+ extra = sstrdup("Datacenter Edition");
+ } else if (osvi.wSuiteMask & VER_SUITE_PERSONAL) {
+ extra = sstrdup("Home Premium/Basic");
+ } else {
+ extra = sstrdup(" ");
+ }
+ if (osvi.wProductType & VER_NT_WORKSTATION) {
+ snprintf(buf, sizeof(buf), "Microsoft Windows Vista %s%s",
+ cputype, extra);
+ } else {
+ snprintf(buf, sizeof(buf), "Microsoft Windows Server 2008 %s%s",
+ cputype, extra);
+ }
+ free(extra);
+ }
+ /* Windows 2003 or Windows XP Pro 64 */
+ if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2) {
+ if (osvi.wSuiteMask & VER_SUITE_DATACENTER) {
+ extra = sstrdup("Datacenter Edition");
+ } else if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE) {
+ extra = sstrdup("Enterprise Edition");
+ } else if (osvi.wSuiteMask & VER_SUITE_COMPUTE_SERVER) {
+ extra = sstrdup("Compute Cluster Edition");
+ } else if (osvi.wSuiteMask == VER_SUITE_BLADE) {
+ extra = sstrdup("Web Edition");
+ } else {
+ extra = sstrdup("Standard Edition");
+ }
+ if ( osvi.wProductType & VER_NT_WORKSTATION && si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) {
+ snprintf(buf, sizeof(buf), "Windows XP Professional x64 Edition %s",
+ extra);
+ } else {
+ snprintf(buf, sizeof(buf),
+ "Microsoft Windows Server 2003 Family %s%s", cputype, extra);
+ }
+ free(extra);
+ }
+ if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1) {
+ if (osvi.wSuiteMask & VER_SUITE_EMBEDDEDNT) {
+ extra = sstrdup("Embedded");
+ } else if (osvi.wSuiteMask & VER_SUITE_PERSONAL) {
+ extra = sstrdup("Home Edition");
+ } else {
+ extra = sstrdup(" ");
+ }
+ snprintf(buf, sizeof(buf), "Microsoft Windows XP %s", extra);
+ free(extra);
+ }
+ if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0) {
+ if (osvi.wSuiteMask & VER_SUITE_DATACENTER) {
+ extra = sstrdup("Datacenter Server");
+ } else if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE) {
+ extra = sstrdup("Advanced Server");
+ } else {
+ extra = sstrdup("Server");
+ }
+ snprintf(buf, sizeof(buf), "Microsoft Windows 2000 %s", extra);
+ free(extra);
+ }
+ if (osvi.dwMajorVersion <= 4) {
+ if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE) {
+ extra = sstrdup("Server 4.0, Enterprise Edition");
+ } else {
+ extra = sstrdup("Server 4.0");
+ }
+ snprintf(buf, sizeof(buf), "Microsoft Windows NT %s", extra);
+ free(extra);
+ }
+ case VER_PLATFORM_WIN32_WINDOWS:
+ if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0) {
+ if (osvi.szCSDVersion[1] == 'C' || osvi.szCSDVersion[1] == 'B') {
+ extra = sstrdup("OSR2");
+ } else {
+ extra = sstrdup(" ");
+ }
+ snprintf(buf, sizeof(buf), "Microsoft Windows 95 %s", extra);
+ free(extra);
+ }
+ if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10) {
+ if (osvi.szCSDVersion[1] == 'A') {
+ extra = sstrdup("SE");
+ } else {
+ extra = sstrdup(" ");
+ }
+ snprintf(buf, sizeof(buf), "Microsoft Windows 98 %s", extra);
+ free(extra);
+ }
+ if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90) {
+ snprintf(buf, sizeof(buf),
+ "Microsoft Windows Millennium Edition");
+ }
+ }
+ free(cputype);
+ return sstrdup(buf);
+}
+
+int SupportedWindowsVersion(void)
+{
+ OSVERSIONINFOEX osvi;
+ BOOL bOsVersionInfoEx;
+
+ ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
+ osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
+
+ if (!(bOsVersionInfoEx = GetVersionEx((OSVERSIONINFO *) & osvi))) {
+ osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+ if (!GetVersionEx((OSVERSIONINFO *) & osvi)) {
+ return 0;
+ }
+ }
+
+ switch (osvi.dwPlatformId) {
+ /* test for the Windows NT product family. */
+ case VER_PLATFORM_WIN32_NT:
+ /* win nt4 */
+ if (osvi.dwMajorVersion <= 4) {
+ return 0;
+ }
+ /* the rest */
+ return 1;
+ /* win95 win98 winME */
+ case VER_PLATFORM_WIN32_WINDOWS:
+ return 0;
+ }
+ return 0;
+}
+
+#endif
+
+
+/*************************************************************************/
+/* This 2 functions were originally found in Bahamut */
+
+/**
+ * Turn a cidr value into a netmask
+ * @param cidr CIDR value
+ * @return Netmask value
+ */
+uint32 cidr_to_netmask(uint16 cidr)
+{
+ if (cidr == 0)
+ return 0;
+
+ return (0xFFFFFFFF - (1 << (32 - cidr)) + 1);
+}
+
+/**
+ * Turn a netmask into a cidr value
+ * @param mask Netmask
+ * @return CIDR value
+ */
+uint16 netmask_to_cidr(uint32 mask)
+{
+ int tmp = 0;
+
+ while (!(mask & (1 << tmp)) && (tmp < 32))
+ tmp++;
+
+ return (32 - tmp);
+}
+
+/*************************************************************************/
+
+/**
+ * Check if the given string is some sort of wildcard
+ * @param str String to check
+ * @return 1 for wildcard, 0 for anything else
+ */
+int str_is_wildcard(const char *str)
+{
+ while (*str) {
+ if ((*str == '*') || (*str == '?'))
+ return 1;
+ str++;
+ }
+
+ return 0;
+}
+
+/**
+ * Check if the given string is a pure wildcard
+ * @param str String to check
+ * @return 1 for pure wildcard, 0 for anything else
+ */
+int str_is_pure_wildcard(const char *str)
+{
+ while (*str) {
+ if (*str != '*')
+ return 0;
+ str++;
+ }
+
+ return 1;
+}
+
+/*************************************************************************/
+
+/**
+ * Check if the given string is an IP, and return the IP.
+ * @param str String to check
+ * @return The IP, if one found. 0 if none.
+ */
+uint32 str_is_ip(char *str)
+{
+ int i;
+ int octets[4] = { -1, -1, -1, -1 };
+ char *s = str;
+ uint32 ip;
+
+ for (i = 0; i < 4; i++) {
+ octets[i] = strtol(s, &s, 10);
+ /* Bail out if the octet is invalid or wrongly terminated */
+ if ((octets[i] < 0) || (octets[i] > 255)
+ || ((i < 3) && (*s != '.')))
+ return 0;
+ if (i < 3)
+ s++;
+ }
+
+ /* Fill the IP - the dirty way */
+ ip = octets[3];
+ ip += octets[2] * 256;
+ ip += octets[1] * 65536;
+ ip += octets[0] * 16777216;
+
+ return ip;
+}
+
+/*************************************************************************/
+
+/**
+ * Check if the given string is an IP or CIDR mask, and fill the given
+ * ip/cidr params if so.
+ * @param str String to check
+ * @param ip The ipmask to fill when a CIDR is found
+ * @param mask The CIDR mask to fill when a CIDR is found
+ * @param host Displayed host
+ * @return 1 for IP/CIDR, 0 for anything else
+ */
+int str_is_cidr(char *str, uint32 * ip, uint32 * mask, char **host)
+{
+ int i;
+ int octets[4] = { -1, -1, -1, -1 };
+ char *s = str;
+ char buf[512];
+ uint16 cidr;
+
+ for (i = 0; i < 4; i++) {
+ octets[i] = strtol(s, &s, 10);
+ /* Bail out if the octet is invalid or wrongly terminated */
+ if ((octets[i] < 0) || (octets[i] > 255)
+ || ((i < 3) && (*s != '.')))
+ return 0;
+ if (i < 3)
+ s++;
+ }
+
+ /* Fill the IP - the dirty way */
+ *ip = octets[3];
+ *ip += octets[2] * 256;
+ *ip += octets[1] * 65536;
+ *ip += octets[0] * 16777216;
+
+ if (*s == '/') {
+ s++;
+ /* There's a CIDR mask here! */
+ cidr = strtol(s, &s, 10);
+ /* Bail out if the CIDR is invalid or the string isn't done yet */
+ if ((cidr > 32) || (*s))
+ return 0;
+ } else {
+ /* No CIDR mask here - use 32 so the whole ip will be matched */
+ cidr = 32;
+ }
+
+ *mask = cidr_to_netmask(cidr);
+ /* Apply the mask to avoid 255.255.255.255/8 bans */
+ *ip &= *mask;
+
+ /* Refill the octets to fill the host */
+ octets[0] = (*ip & 0xFF000000) / 16777216;
+ octets[1] = (*ip & 0x00FF0000) / 65536;
+ octets[2] = (*ip & 0x0000FF00) / 256;
+ octets[3] = (*ip & 0x000000FF);
+
+ if (cidr == 32)
+ snprintf(buf, 512, "%d.%d.%d.%d", octets[0], octets[1], octets[2],
+ octets[3]);
+ else
+ snprintf(buf, 512, "%d.%d.%d.%d/%d", octets[0], octets[1],
+ octets[2], octets[3], cidr);
+
+ *host = sstrdup(buf);
+
+ return 1;
+}
+
+/* EOF */
diff --git a/src/mod_version.c b/src/mod_version.c
new file mode 100644
index 000000000..e314b8b42
--- /dev/null
+++ b/src/mod_version.c
@@ -0,0 +1,36 @@
+#include "version.h"
+
+#ifndef _WIN32
+#define E extern
+#define I extern
+#else
+#ifndef MODULE_COMPILE
+#define E extern __declspec(dllexport)
+#define I extern __declspec(dllimport)
+#else
+#define E extern __declspec(dllimport)
+#define I extern __declspec(dllexport)
+#endif
+#endif
+
+E int getAnopeBuildVersion();
+E int getAnopeMajorVersion();
+E int getAnopeMinorVersion();
+E int getAnopePatchVersion();
+
+int getAnopeBuildVersion() {
+ return VERSION_BUILD;
+}
+
+int getAnopeMajorVersion() {
+ return VERSION_MAJOR;
+}
+
+int getAnopeMinorVersion() {
+ return VERSION_MINOR;
+}
+
+int getAnopePatchVersion() {
+ return VERSION_PATCH;
+}
+
diff --git a/src/modules.c b/src/modules.c
new file mode 100644
index 000000000..99974d2ef
--- /dev/null
+++ b/src/modules.c
@@ -0,0 +1,2874 @@
+
+/* Modular support
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+#include "modules.h"
+#include "language.h"
+#include "version.h"
+
+#if defined(USE_MODULES) && !defined(_WIN32)
+#include <dlfcn.h>
+/* Define these for systems without them */
+#ifndef RTLD_NOW
+#define RTLD_NOW 0
+#endif
+#ifndef RTLD_LAZY
+#define RTLD_LAZY RTLD_NOW
+#endif
+#ifndef RTLD_GLOBAL
+#define RTLD_GLOBAL 0
+#endif
+#ifndef RTLD_LOCAL
+#define RTLD_LOCAL 0
+#endif
+#endif
+
+#ifdef _WIN32
+const char *ano_moderr(void);
+#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;
+User *mod_current_user;
+ModuleCallBack *moduleCallBackHead = NULL;
+ModuleQueue *mod_operation_queue = NULL;
+
+int displayCommand(Command * c);
+int displayCommandFromHash(CommandHash * cmdTable[], char *name);
+int displayMessageFromHash(char *name);
+int displayMessage(Message * m);
+char *ModuleGetErrStr(int status);
+
+char *ModuleGetErrStr(int status)
+{
+ const char *module_err_str[] = {
+ "Module, Okay - No Error", /* MOD_ERR_OK */
+ "Module Error, Allocating memory", /* MOD_ERR_MEMORY */
+ "Module Error, Not enough parameters", /* MOD_ERR_PARAMS */
+ "Module Error, Already loaded", /* MOD_ERR_EXISTS */
+ "Module Error, File does not exist", /* MOD_ERR_NOEXIST */
+ "Module Error, No User", /* MOD_ERR_NOUSER */
+ "Module Error, Error during load time or module returned MOD_STOP", /* MOD_ERR_NOLOAD */
+ "Module Error, Unable to unload", /* MOD_ERR_NOUNLOAD */
+ "Module Error, Incorrect syntax", /* MOD_ERR_SYNTAX */
+ "Module Error, Unable to delete", /* MOD_ERR_NODELETE */
+ "Module Error, Unknown Error occuried", /* MOD_ERR_UNKOWN */
+ "Module Error, File I/O Error", /* MOD_ERR_FILE_IO */
+ "Module Error, No Service found for request", /* MOD_ERR_NOSERVICE */
+ "Module Error, No module name for request" /* MOD_ERR_NO_MOD_NAME */
+ };
+ return (char *) module_err_str[status];
+}
+
+/**
+ * Automaticaly load modules at startup.
+ * This will load modules at startup before the IRCD link is attempted, this
+ * allows admins to have a module relating to ircd support load
+ */
+void modules_init(void)
+{
+#ifdef USE_MODULES
+ int idx;
+ int ret;
+ Module *m;
+
+ if(nothird) {
+ return;
+ }
+
+ 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);
+ ret = loadModule(mod_current_module, NULL);
+ alog("status: [%d][%s]", ret, ModuleGetErrStr(ret));
+ if (ret != MOD_ERR_OK)
+ destroyModule(m);
+ mod_current_module = NULL;
+ mod_current_user = NULL;
+ }
+ }
+#endif
+}
+
+/**
+ * Load up a list of core modules from the conf.
+ * @param number The number of modules to load
+ * @param list The list of modules to load
+ **/
+void modules_core_init(int number, char **list)
+{
+ int idx;
+ Module *m;
+ int status = 0;
+ for (idx = 0; idx < number; idx++) {
+ m = findModule(list[idx]);
+ if (!m) {
+ m = createModule(list[idx]);
+ mod_current_module = m;
+ mod_current_user = NULL;
+ status = loadModule(mod_current_module, NULL);
+ if (debug || status) {
+ alog("debug: trying to load core module [%s]",
+ mod_current_module->name);
+ alog("debug: status: [%d][%s]", status, ModuleGetErrStr(status));
+ if (status != MOD_ERR_OK)
+ destroyModule(mod_current_module);
+ }
+ mod_current_module = NULL;
+ mod_current_user = NULL;
+ }
+ }
+}
+/**
+ *
+ **/
+int encryption_module_init(void) {
+ int ret = 0;
+ Module *m;
+
+ m = createModule(EncModule);
+ mod_current_module = m;
+ mod_current_user = NULL;
+ alog("Loading Encryption Module: [%s]", mod_current_module->name);
+ ret = loadModule(mod_current_module, NULL);
+ moduleSetType(ENCRYPTION);
+ alog("status: [%d][%s]", ret, ModuleGetErrStr(ret));
+ mod_current_module = NULL;
+ if (ret != MOD_ERR_OK) {
+ destroyModule(m);
+ }
+ return ret;
+}
+
+/**
+ * Load the ircd protocol module up
+ **/
+int protocol_module_init(void)
+{
+ int ret = 0;
+ Module *m;
+
+ m = createModule(IRCDModule);
+ mod_current_module = m;
+ mod_current_user = NULL;
+ alog("Loading IRCD Protocol Module: [%s]", mod_current_module->name);
+ ret = loadModule(mod_current_module, NULL);
+ moduleSetType(PROTOCOL);
+ alog("status: [%d][%s]", ret, ModuleGetErrStr(ret));
+ mod_current_module = NULL;
+
+ if (ret == MOD_ERR_OK) {
+ /* This is really NOT the correct place to do config checks, but
+ * as we only have the ircd struct filled here, we have to over
+ * here. -GD
+ */
+ if (UseTokens && !(ircd->token)) {
+ alog("Anope does not support TOKENS for this ircd setting; unsetting UseToken");
+ UseTokens = 0;
+ }
+
+ if (UseTS6 && !(ircd->ts6)) {
+ alog("Chosen IRCd does not support TS6, unsetting UseTS6");
+ UseTS6 = 0;
+ }
+
+ /* We can assume the ircd supports TS6 here */
+ if (UseTS6 && !Numeric) {
+ alog("UseTS6 requires the setting of Numeric to be enabled.");
+ ret = -1;
+ }
+ } else {
+ destroyModule(m);
+ }
+
+ return ret;
+}
+
+/**
+ * Automaticaly load modules at startup, delayed.
+ * This function waits until the IRCD link has been made, and then attempts
+ * to load the specified modules.
+ */
+void modules_delayed_init(void)
+{
+#ifdef USE_MODULES
+ int idx;
+ int ret;
+ Module *m;
+
+ if(nothird) {
+ return;
+ }
+
+ 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);
+ ret = loadModule(mod_current_module, NULL);
+ alog("status: [%d][%s]", ret, ModuleGetErrStr(ret));
+ mod_current_module = NULL;
+ mod_current_user = NULL;
+ if (ret != MOD_ERR_OK)
+ destroyModule(m);
+ }
+ }
+#endif
+}
+
+/**
+ * Unload ALL loaded modules, no matter what kind of module it is.
+ * Do NEVER EVER, and i mean NEVER (and if that isn't clear enough
+ * yet, i mean: NEVER AT ALL) call this unless we're shutting down,
+ * or we'll fuck up Anope badly (protocol handling won't work for
+ * example). If anyone calls this function without a justified need
+ * for it, i reserve the right to break their legs in a painful way.
+ * And if that isn't enough discouragement, you'll wake up with your
+ * both legs broken tomorrow ;) -GD
+ */
+void modules_unload_all(boolean fini, boolean unload_proto)
+{
+#ifdef USE_MODULES
+ int idx;
+ ModuleHash *mh, *next;
+ void (*func) (void);
+
+ for (idx = 0; idx < MAX_CMD_HASH; idx++) {
+ mh = MODULE_HASH[idx];
+ while (mh) {
+ next = mh->next;
+ if (unload_proto || (mh->m->type != PROTOCOL)) {
+ mod_current_module = mh->m;
+ if(fini) {
+ func = (void (*)(void))ano_modsym(mh->m->handle, "AnopeFini");
+ if (func) {
+ mod_current_module_name = mh->m->name;
+ func(); /* exec AnopeFini */
+ mod_current_module_name = NULL;
+ }
+
+ if (prepForUnload(mh->m) != MOD_ERR_OK) {
+ mh = next;
+ continue;
+ }
+
+ if ((ano_modclose(mh->m->handle)) != 0)
+ alog(ano_moderr());
+ else
+ delModule(mh->m);
+ } else {
+ delModule(mh->m);
+ }
+ }
+ mh = next;
+ }
+ }
+#endif
+}
+
+/**
+ * Create a new module, setting up the default values as needed.
+ * @param filename the filename of the new module
+ * @return a newly created module struct
+ */
+Module *createModule(char *filename)
+{
+ Module *m;
+ int i = 0;
+ 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;
+
+ m->type = THIRD;
+ for (i = 0; i < NUM_LANGS; i++) {
+ m->lang[i].argc = 0;
+ }
+ return m; /* return a nice new module */
+}
+
+/**
+ * Destory the module.
+ * free up all memory used by our module struct.
+ * @param m the module to free
+ * @return MOD_ERR_OK on success, anything else on fail
+ */
+int destroyModule(Module * m)
+{
+ int i = 0;
+ if (!m) {
+ return MOD_ERR_PARAMS;
+ }
+
+ mod_current_module = m;
+ for (i = 0; i < NUM_LANGS; i++) {
+ moduleDeleteLanguage(i);
+ }
+
+ 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;
+}
+
+/**
+ * Add the module to the list of currently loaded modules.
+ * @param m the currently loaded module
+ * @return MOD_ERR_OK on success, anything else on fail
+ */
+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 (stricmp(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;
+}
+
+/**
+ * Remove the module from the list of loaded modules.
+ * @param m module to remove
+ * @return MOD_ERR_OK on success anything else on fail
+ */
+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 (stricmp(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;
+}
+
+/**
+ * Search the list of loaded modules for the given name.
+ * @param name the name of the module to find
+ * @return a pointer to the module found, or NULL
+ */
+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;
+
+}
+
+/**
+ * Search all loaded modules looking for a protocol module.
+ * @return 1 if one is found.
+ **/
+int protocolModuleLoaded()
+{
+ int idx = 0;
+ ModuleHash *current = NULL;
+
+ for (idx = 0; idx != MAX_CMD_HASH; idx++) {
+ for (current = MODULE_HASH[idx]; current; current = current->next) {
+ if (current->m->type == PROTOCOL) {
+ return 1;
+ }
+ }
+ }
+ return 0;
+}
+
+/**
+ * Search all loaded modules looking for an encryption module.
+ * @ return 1 if one is loaded
+ **/
+int encryptionModuleLoaded()
+{
+ int idx = 0;
+ ModuleHash *current = NULL;
+
+ for (idx = 0; idx != MAX_CMD_HASH; idx++) {
+ for (current = MODULE_HASH[idx]; current; current = current->next) {
+ if (current->m->type == ENCRYPTION) {
+ return 1;
+ }
+ }
+ }
+ return 0;
+}
+
+/**
+ * Copy the module from the modules folder to the runtime folder.
+ * This will prevent module updates while the modules is loaded from
+ * triggering a segfault, as the actaul file in use will be in the
+ * runtime folder.
+ * @param name the name of the module to copy
+ * @param output the destination to copy the module to
+ * @return MOD_ERR_OK on success
+ */
+int moduleCopyFile(char *name, char *output)
+{
+#ifdef USE_MODULES
+ int ch;
+ FILE *source, *target;
+ int srcfp;
+ char input[4096];
+ int len;
+
+ strncpy(input, MODULE_PATH, 4095); /* Get full path with module extension */
+ len = strlen(input);
+ strncat(input, name, 4095 - len);
+ len = strlen(output);
+ strncat(input, MODULE_EXT, 4095 - len);
+
+#ifndef _WIN32
+ if ((srcfp = mkstemp(output)) == -1)
+ return MOD_ERR_FILE_IO;
+#else
+ if (!mktemp(output))
+ return MOD_ERR_FILE_IO;
+#endif
+
+ if (debug)
+ alog("Runtime module location: %s", output);
+
+ /* Linux/UNIX should ignore the b param, why do we still have seperate
+ * calls for it here? -GD
+ */
+#ifndef _WIN32
+ if ((source = fopen(input, "r")) == NULL) {
+#else
+ if ((source = fopen(input, "rb")) == NULL) {
+#endif
+ return MOD_ERR_NOEXIST;
+ }
+#ifndef _WIN32
+ if ((target = fdopen(srcfp, "w")) == NULL) {
+#else
+ if ((target = fopen(output, "wb")) == NULL) {
+#endif
+ 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;
+}
+
+/**
+ * Loads a given module.
+ * @param m the module to load
+ * @param u the user who loaded it, NULL for auto-load
+ * @return MOD_ERR_OK on success, anything else on fail
+ */
+int loadModule(Module * m, User * u)
+{
+#ifdef USE_MODULES
+ char buf[4096];
+ int len;
+ const char *err;
+ int (*func) (int, char **);
+ int (*version)();
+ int ret = 0;
+ char *argv[1];
+ int argc = 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;
+ }
+
+ /* Generate the filename for the temporary copy of the module */
+ strncpy(buf, MODULE_PATH, 4095); /* Get full path with module extension */
+ len = strlen(buf);
+#ifndef _WIN32
+ strncat(buf, "runtime/", 4095 - len);
+#else
+ strncat(buf, "runtime\\", 4095 - len);
+#endif
+ len = strlen(buf);
+ strncat(buf, m->name, 4095 - len);
+ len = strlen(buf);
+ strncat(buf, MODULE_EXT, 4095 - len);
+ len = strlen(buf);
+ strncat(buf, ".", 4095 - len);
+ len = strlen(buf);
+ strncat(buf, "XXXXXX", 4095 - len);
+ buf[4095] = '\0';
+ /* Don't skip return value checking! -GD */
+ if ((ret = moduleCopyFile(m->name, buf)) != MOD_ERR_OK) {
+ m->filename = sstrdup(buf);
+ return ret;
+ }
+
+ m->filename = sstrdup(buf);
+ ano_modclearerr();
+ m->handle = ano_modopen(m->filename);
+ if ( m->handle == NULL && (err = ano_moderr()) != NULL) {
+ alog(err);
+ return MOD_ERR_NOLOAD;
+ }
+ ano_modclearerr();
+ func = (int (*)(int, char **))ano_modsym(m->handle, "AnopeInit");
+ if ( func == NULL && (err = ano_moderr()) != NULL) {
+ ano_modclose(m->handle); /* If no AnopeInit - it isnt an Anope Module, close it */
+ return MOD_ERR_NOLOAD;
+ }
+ if (func) {
+ version = (int (*)())ano_modsym(m->handle,"getAnopeBuildVersion");
+ if (version) {
+ if (version() >= VERSION_BUILD ) {
+ if(debug) {
+ alog("Module %s compiled against current or newer anope revision %d, this is %d",m->name,version(),VERSION_BUILD);
+ }
+ } else {
+ alog("Module %s is compiled against an old version of anope (%d) current is %d", m->name, version(), VERSION_BUILD);
+ alog("Rebuild module %s against the current version to resolve this error", m->name);
+ ano_modclose(m->handle);
+ ano_modclearerr();
+ return MOD_ERR_NOLOAD;
+ }
+ } else {
+ ano_modclose(m->handle);
+ ano_modclearerr();
+ alog("Module %s is compiled against an older version of anope (unknown)", m->name);
+ alog("Rebuild module %s against the current version to resolve this error", m->name);
+ return MOD_ERR_NOLOAD;
+ }
+ /* TODO */
+ mod_current_module_name = m->name;
+ /* argv[0] is the user if there was one, or NULL if not */
+ if (u) {
+ argv[0] = sstrdup(u->nick);
+ } else {
+ argv[0] = NULL;
+ }
+ argc++;
+
+ ret = func(argc, argv); /* exec AnopeInit */
+ if (u) {
+ free(argv[0]);
+ }
+ if (m->type == PROTOCOL && protocolModuleLoaded()) {
+ alog("You cannot load two protocol modules");
+ ret = MOD_STOP;
+ } else if (m->type == ENCRYPTION && encryptionModuleLoaded()) {
+ alog("You cannot load two encryption modules");
+ ret = MOD_STOP;
+ }
+ 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) {
+ anope_cmd_global(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
+}
+
+/**
+ * Unload the given module.
+ * @param m the module to unload
+ * @param u the user who unloaded it
+ * @return MOD_ERR_OK on success, anything else on fail
+ */
+int unloadModule(Module * m, User * u)
+{
+#ifdef USE_MODULES
+ void (*func) (void);
+
+ if (!m || !m->handle) {
+ if (u) {
+ notice_lang(s_OperServ, u, OPER_MODULE_REMOVE_FAIL, m->name);
+ }
+ return MOD_ERR_PARAMS;
+ }
+
+ if (m->type == PROTOCOL) {
+ if (u) {
+ notice_lang(s_OperServ, u, OPER_MODULE_NO_UNLOAD);
+ }
+ return MOD_ERR_NOUNLOAD;
+ } else if(m->type == ENCRYPTION) {
+ if (u) {
+ notice_lang(s_OperServ, u, OPER_MODULE_NO_UNLOAD);
+ }
+ return MOD_ERR_NOUNLOAD;
+ }
+
+ func = (void (*)(void))ano_modsym(m->handle, "AnopeFini");
+ if (func) {
+ mod_current_module_name = m->name;
+ func(); /* exec AnopeFini */
+ mod_current_module_name = NULL;
+ }
+
+ if (prepForUnload(m) != MOD_ERR_OK) {
+ return MOD_ERR_UNKNOWN;
+ }
+
+ if ((ano_modclose(m->handle)) != 0) {
+ alog(ano_moderr());
+ if (u) {
+ notice_lang(s_OperServ, u, OPER_MODULE_REMOVE_FAIL, m->name);
+ }
+ return MOD_ERR_NOUNLOAD;
+ } else {
+ if (u) {
+ anope_cmd_global(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
+}
+
+/**
+ * Module setType()
+ * Lets the module set a type, CORE,PROTOCOL,3RD etc..
+ **/
+void moduleSetType(MODType type)
+{
+ if ((mod_current_module_name) && (!mod_current_module)) {
+ mod_current_module = findModule(mod_current_module_name);
+ }
+ mod_current_module->type = type;
+}
+
+/**
+ * Prepare a module to be unloaded.
+ * Remove all commands and messages this module is providing, and delete
+ * any callbacks which are still pending.
+ * @param m the module to prepare for unload
+ * @return MOD_ERR_OK on success
+ */
+int prepForUnload(Module * m)
+{
+ int idx;
+ CommandHash *current = NULL;
+ MessageHash *mcurrent = NULL;
+ EvtMessageHash *ecurrent = NULL;
+ EvtHookHash *ehcurrent = NULL;
+
+ Command *c;
+ Message *msg;
+ EvtMessage *eMsg;
+ EvtHook *eHook;
+ int status = 0;
+
+ if (!m) {
+ return MOD_ERR_PARAMS;
+ }
+
+ /* Kill any active callbacks this module has */
+ moduleCallBackPrepForUnload(m->name);
+
+ /* Remove any stored data this module has */
+ moduleDelAllDataMod(m);
+
+ /**
+ * 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);
+ }
+ }
+ }
+
+ for (ecurrent = EVENT[idx]; ecurrent; ecurrent = ecurrent->next) {
+ for (eMsg = ecurrent->evm; eMsg; eMsg = eMsg->next) {
+ if ((eMsg->mod_name)
+ && (stricmp(eMsg->mod_name, m->name) == 0)) {
+ status = delEventHandler(EVENT, eMsg, m->name);
+ }
+ }
+ }
+ for (ehcurrent = EVENTHOOKS[idx]; ehcurrent;
+ ehcurrent = ehcurrent->next) {
+ for (eHook = ehcurrent->evh; eHook; eHook = eHook->next) {
+ if ((eHook->mod_name)
+ && (stricmp(eHook->mod_name, m->name) == 0)) {
+ status = delEventHook(EVENTHOOKS, eHook, m->name);
+ }
+ }
+ }
+
+ }
+ return MOD_ERR_OK;
+}
+
+/*******************************************************************************
+ * Command Functions
+ *******************************************************************************/
+/**
+ * Create a Command struct ready for use in anope.
+ * @param name the name of the command
+ * @param func pointer to the function to execute when command is given
+ * @param has_priv pointer to function to check user priv's
+ * @param help_all help file index for all users
+ * @param help_reg help file index for all regustered users
+ * @param help_oper help file index for all opers
+ * @param help_admin help file index for all admins
+ * @param help_root help file indenx for all services roots
+ * @return a "ready to use" Command struct will be returned
+ */
+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 (!name || !*name) {
+ return NULL;
+ }
+
+ 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;
+}
+
+/**
+ * Destroy a command struct freeing any memory.
+ * @param c Command to destroy
+ * @return MOD_ERR_OK on success, anything else on fail
+ */
+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;
+}
+
+/**
+ * Add a CORE command ot the given command hash
+ * @param cmdTable the command table to add the command to
+ * @param c the command to add
+ * @return MOD_ERR_OK on success
+ */
+int addCoreCommand(CommandHash * cmdTable[], Command * c)
+{
+ if (!cmdTable || !c) {
+ return MOD_ERR_PARAMS;
+ }
+ c->core = 1;
+ c->next = NULL;
+ return addCommand(cmdTable, c, 0);
+}
+
+/**
+ * Add a module provided command to the given service.
+ * e.g. moduleAddCommand(NICKSERV,c,MOD_HEAD);
+ * @param cmdTable the services to add the command to
+ * @param c the command to add
+ * @param pos the position to add to, MOD_HEAD, MOD_TAIL, MOD_UNIQUE
+ * @see createCommand
+ * @return MOD_ERR_OK on successfully adding the command
+ */
+int moduleAddCommand(CommandHash * cmdTable[], Command * c, int pos)
+{
+ int status;
+
+ if (!cmdTable || !c) {
+ return MOD_ERR_PARAMS;
+ }
+ /* ok, this appears to be a module adding a command from outside of AnopeInit, try to look up its module struct for it */
+ if ((mod_current_module_name) && (!mod_current_module)) {
+ mod_current_module = findModule(mod_current_module_name);
+ }
+
+ if (!mod_current_module) {
+ return MOD_ERR_UNKNOWN;
+ } /* shouldnt happen */
+ c->core = 0;
+ if (!c->mod_name) {
+ c->mod_name = sstrdup(mod_current_module->name);
+ }
+
+
+ if (cmdTable == HOSTSERV) {
+ if (s_HostServ) {
+ c->service = sstrdup(s_HostServ);
+ } else {
+ return MOD_ERR_NOSERVICE;
+ }
+ } else if (cmdTable == BOTSERV) {
+ if (s_BotServ) {
+ c->service = sstrdup(s_BotServ);
+ } else {
+ return MOD_ERR_NOSERVICE;
+ }
+ } else if (cmdTable == MEMOSERV) {
+ if (s_MemoServ) {
+ c->service = sstrdup(s_MemoServ);
+ } else {
+ return MOD_ERR_NOSERVICE;
+ }
+ } else if (cmdTable == CHANSERV) {
+ if (s_ChanServ) {
+ c->service = sstrdup(s_ChanServ);
+ } else {
+ return MOD_ERR_NOSERVICE;
+ }
+ } else if (cmdTable == NICKSERV) {
+ if (s_NickServ) {
+ c->service = sstrdup(s_NickServ);
+ } else {
+ return MOD_ERR_NOSERVICE;
+ }
+ } else if (cmdTable == HELPSERV) {
+ if (s_HelpServ) {
+ c->service = sstrdup(s_HelpServ);
+ } else {
+ return MOD_ERR_NOSERVICE;
+ }
+ } else if (cmdTable == OPERSERV) {
+ if (s_OperServ) {
+ c->service = sstrdup(s_OperServ);
+ } else {
+ return MOD_ERR_NOSERVICE;
+ }
+ } else
+ c->service = sstrdup("Unknown");
+
+ if (debug >= 2)
+ displayCommandFromHash(cmdTable, c->name);
+ status = addCommand(cmdTable, c, pos);
+ if (debug >= 2)
+ displayCommandFromHash(cmdTable, c->name);
+ if (status != MOD_ERR_OK) {
+ alog("ERROR! [%d]", status);
+ }
+ return status;
+}
+
+/**
+ * Delete a command from the service given.
+ * @param cmdTable the cmdTable for the services to remove the command from
+ * @param name the name of the command to delete from the service
+ * @return returns MOD_ERR_OK on success
+ */
+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
+ && stricmp(cmd->mod_name, mod_current_module->name) == 0) {
+ if (debug >= 2) {
+ displayCommandFromHash(cmdTable, name);
+ }
+ status = delCommand(cmdTable, cmd, mod_current_module->name);
+ if (debug >= 2) {
+ displayCommandFromHash(cmdTable, name);
+ }
+ }
+ }
+ return status;
+}
+
+/**
+ * Output the command stack into the log files.
+ * This will print the call-stack for a given command into the log files, very useful for debugging.
+ * @param cmdTable the command table to read from
+ * @param name the name of the command to print
+ * @return 0 is returned, it has no relevence yet :)
+ */
+int displayCommandFromHash(CommandHash * cmdTable[], char *name)
+{
+ CommandHash *current = NULL;
+ int index = 0;
+ index = CMD_HASH(name);
+ if (debug > 1) {
+ alog("debug: trying to display command %s", name);
+ }
+ for (current = cmdTable[index]; current; current = current->next) {
+ if (stricmp(name, current->name) == 0) {
+ displayCommand(current->c);
+ }
+ }
+ if (debug > 1) {
+ alog("debug: done displaying command %s", name);
+ }
+ return 0;
+}
+
+/**
+ * Output the command stack into the log files.
+ * This will print the call-stack for a given command into the log files, very useful for debugging.
+ * @param c the command struct to print
+ * @return 0 is returned, it has no relevence yet :)
+ */
+
+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: 0x%p", ++i, (void *) cmd);
+ }
+ alog("end");
+ return 0;
+}
+
+/**
+ * Display the message call stak.
+ * Prints the call stack for a message based on the message name, again useful for debugging and little lese :)
+ * @param name the name of the message to print info for
+ * @return the return int has no relevence atm :)
+ */
+int displayMessageFromHash(char *name)
+{
+ MessageHash *current = NULL;
+ int index = 0;
+ index = CMD_HASH(name);
+ if (debug > 1) {
+ alog("debug: trying to display message %s", name);
+ }
+ for (current = IRCD[index]; current; current = current->next) {
+ if (stricmp(name, current->name) == 0) {
+ displayMessage(current->m);
+ }
+ }
+ if (debug > 1) {
+ alog("debug: done displaying message %s", name);
+ }
+ return 0;
+}
+
+/**
+ * Displays a message list for a given message.
+ * Again this is of little use other than debugging.
+ * @param m the message to display
+ * @return 0 is returned and has no meaning
+ */
+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: 0x%p", ++i, (void *) 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
+ * @param cmdTable the table to add the command to
+ * @param c the command to add
+ * @param pos the position in the cmd call stack to add the command
+ * @return MOD_ERR_OK will be returned on success.
+ */
+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;
+ }
+
+ if (mod_current_module_name && !c->mod_name)
+ return MOD_ERR_NO_MOD_NAME;
+
+ 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 ((stricmp(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("debug: existing cmd: (0x%p), new cmd (0x%p)",
+ (void *) c->next, (void *) c);
+ return MOD_ERR_OK;
+ } else if (pos == 2) {
+
+ tail = current->c;
+ while (tail->next)
+ tail = tail->next;
+ if (debug)
+ alog("debug: existing cmd: (0x%p), new cmd (0x%p)",
+ (void *) tail, (void *) 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;
+}
+
+/**
+ * Remove a command from the command hash.
+ * @param cmdTable the command table to remove the command from
+ * @param c the command to remove
+ * @param mod_name the name of the module who owns the command
+ * @return MOD_ERR_OK will be returned on success
+ */
+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 (stricmp(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;
+}
+
+/**
+ * Search the command table gieven for a command.
+ * @param cmdTable the name of the command table to search
+ * @param name the name of the command to look for
+ * @return returns a pointer to the found command struct, or NULL
+ */
+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
+ *******************************************************************************/
+
+ /**
+ * Create a new Message struct.
+ * @param name the name of the message
+ * @param func a pointer to the function to call when we recive this message
+ * @return a new Message object
+ **/
+Message *createMessage(const 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;
+}
+
+/**
+ * find a message in the given table.
+ * Looks up the message <name> in the MessageHash given
+ * @param MessageHash the message table to search for this command, will almost always be IRCD
+ * @param name the name of the command were looking for
+ * @return NULL if we cant find it, or a pointer to the Message if we can
+ **/
+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 (UseTokens) {
+ if (ircd->tokencaseless) {
+ if (stricmp(name, current->name) == 0) {
+ return current->m;
+ }
+ } else {
+ if (strcmp(name, current->name) == 0) {
+ return current->m;
+ }
+ }
+ } else {
+ if (stricmp(name, current->name) == 0) {
+ return current->m;
+ }
+ }
+ }
+ return NULL;
+}
+
+/**
+ * Add a message to the MessageHash.
+ * @param msgTable the MessageHash we want to add a message to
+ * @param m the Message we want to add
+ * @param pos the position we want to add the message to, E.G. MOD_HEAD, MOD_TAIL, MOD_UNIQUE
+ * @return MOD_ERR_OK on a successful add.
+ **/
+
+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;
+ int match = 0;
+
+ 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 ((UseTokens) && (!ircd->tokencaseless)) {
+ match = strcmp(m->name, current->name);
+ } else {
+ match = stricmp(m->name, current->name);
+ }
+ if (match == 0) { /* the msg exist's we are a addHead */
+ if (pos == 1) {
+ m->next = current->m;
+ current->m = m;
+ if (debug)
+ alog("debug: existing msg: (0x%p), new msg (0x%p)",
+ (void *) m->next, (void *) m);
+ return MOD_ERR_OK;
+ } else if (pos == 2) {
+ tail = current->m;
+ while (tail->next)
+ tail = tail->next;
+ if (debug)
+ alog("debug: existing msg: (0x%p), new msg (0x%p)",
+ (void *) tail, (void *) 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;
+}
+
+/**
+ * Add the given message (m) to the MessageHash marking it as a core command
+ * @param msgTable the MessageHash we want to add to
+ * @param m the Message we are adding
+ * @return MOD_ERR_OK on a successful add.
+ **/
+int addCoreMessage(MessageHash * msgTable[], Message * m)
+{
+ if (!msgTable || !m) {
+ return MOD_ERR_PARAMS;
+ }
+ m->core = 1;
+ return addMessage(msgTable, m, 0);
+}
+
+/**
+ * Add a module message to the IRCD message hash
+ * @param m the Message to add
+ * @param pos the Position to add the message to, e.g. MOD_HEAD, MOD_TAIL, MOD_UNIQUE
+ * @return MOD_ERR_OK on success, althing else on fail.
+ **/
+int moduleAddMessage(Message * m, int pos)
+{
+ int status;
+
+ if (!m) {
+ return MOD_ERR_PARAMS;
+ }
+
+ /* ok, this appears to be a module adding a message from outside of AnopeInit, try to look up its module struct for it */
+ if ((mod_current_module_name) && (!mod_current_module)) {
+ mod_current_module = findModule(mod_current_module_name);
+ }
+
+ if (!mod_current_module) {
+ return MOD_ERR_UNKNOWN;
+ } /* shouldnt happen */
+ m->core = 0;
+ if (!m->mod_name) {
+ m->mod_name = sstrdup(mod_current_module->name);
+ }
+
+ status = addMessage(IRCD, m, pos);
+ if (debug) {
+ displayMessageFromHash(m->name);
+ }
+ return status;
+}
+
+/**
+ * remove the given message from the IRCD message hash
+ * @param name the name of the message to remove
+ * @return MOD_ERR_OK on success, althing else on fail.
+ **/
+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;
+}
+
+/**
+ * remove the given message from the given message hash, for the given module
+ * @param msgTable which MessageHash we are removing from
+ * @param m the Message we want to remove
+ * @mod_name the name of the module we are removing
+ * @return MOD_ERR_OK on success, althing else on fail.
+ **/
+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 (stricmp(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;
+}
+
+/**
+ * Destory a message, freeing its memory.
+ * @param m the message to be destroyed
+ * @return MOD_ERR_SUCCESS on success
+ **/
+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;
+}
+
+/**
+ * Add the modules version info.
+ * @param version the version of the current module
+ **/
+void moduleAddVersion(const char *version)
+{
+ if (mod_current_module && version) {
+ mod_current_module->version = sstrdup(version);
+ }
+}
+
+/**
+ * Add the modules author info
+ * @param author the author of the module
+ **/
+void moduleAddAuthor(const char *author)
+{
+ if (mod_current_module && author) {
+ mod_current_module->author = sstrdup(author);
+ }
+}
+
+/*******************************************************************************
+ * Module Callback Functions
+ *******************************************************************************/
+ /**
+ * Adds a timed callback for the current module.
+ * This allows modules to request that anope executes one of there functions at a time in the future, without an event to trigger it
+ * @param name the name of the callback, this is used for refrence mostly, but is needed it you want to delete this particular callback later on
+ * @param when when should the function be executed, this is a time in the future, seconds since 00:00:00 1970-01-01 UTC
+ * @param func the function to be executed when the callback is ran, its format MUST be int func(int argc, char **argv);
+ * @param argc the argument count for the argv paramter
+ * @param atgv a argument list to be passed to the called function.
+ * @return MOD_ERR_OK on success, anything else on fail.
+ * @see moduleDelCallBack
+ **/
+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("debug: added module CallBack: [%s] due to execute at %ld",
+ new->name ? new->name : "?", (long int) new->when);
+ return MOD_ERR_OK;
+}
+
+/**
+ * Execute a stored call back
+ **/
+void moduleCallBackRun(void)
+{
+ ModuleCallBack *tmp;
+
+ while ((tmp = moduleCallBackHead) && (tmp->when <= time(NULL))) {
+ if (debug)
+ alog("debug: executing callback: %s", tmp->name ? tmp->name : "<unknown>");
+ if (tmp->func) {
+ mod_current_module_name = tmp->owner_name;
+ tmp->func(tmp->argc, tmp->argv);
+ mod_current_module = NULL;
+ moduleCallBackDeleteEntry(NULL);
+ }
+ }
+}
+
+/**
+ * Removes a entry from the modules callback list
+ * @param prev a pointer to the previous entry in the list, NULL for the head
+ **/
+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);
+}
+
+/**
+ * Search the module callback list for a given module
+ * @param mod_name the name of the module were looking for
+ * @param found have we found it?
+ * @return a pointer to the ModuleCallBack struct or NULL - dont forget to check the found paramter!
+ **/
+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;
+ }
+}
+
+/**
+ * Allow module coders to delete a callback by name.
+ * @param name the name of the callback they wish to delete
+ **/
+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("debug: 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;
+ }
+ }
+}
+
+/**
+ * Remove all outstanding module callbacks for the given module.
+ * When a module is unloaded, any callbacks it had outstanding must be removed, else when they attempt to execute the func pointer will no longer be valid, and we'll seg.
+ * @param mod_name the name of the module we are preping for unload
+ **/
+void moduleCallBackPrepForUnload(char *mod_name)
+{
+ boolean found = false;
+ ModuleCallBack *tmp = NULL;
+
+ tmp = moduleCallBackFindEntry(mod_name, &found);
+ while (found) {
+ if (debug) {
+ alog("debug: removing CallBack for module %s", mod_name);
+ }
+ moduleCallBackDeleteEntry(tmp);
+ tmp = moduleCallBackFindEntry(mod_name, &found);
+ }
+}
+
+/**
+ * Return a copy of the complete last buffer.
+ * This is needed for modules who cant trust the strtok() buffer, as we dont know who will have already messed about with it.
+ * @reutrn a pointer to a copy of the last buffer - DONT mess with this, copy if first if you must do things to it.
+ **/
+char *moduleGetLastBuffer(void)
+{
+ char *tmp = NULL;
+ if (mod_current_buffer) {
+ tmp = strchr(mod_current_buffer, ' ');
+ if (tmp) {
+ tmp++;
+ }
+ }
+ return tmp;
+}
+
+/*******************************************************************************
+ * Module HELP Functions
+ *******************************************************************************/
+ /**
+ * Add help for Root admins.
+ * @param c the Command to add help for
+ * @param func the function to run when this help is asked for
+ **/
+int moduleAddRootHelp(Command * c, int (*func) (User * u))
+{
+ if (c) {
+ c->root_help = func;
+ return MOD_STOP;
+ }
+ return MOD_CONT;
+}
+
+ /**
+ * Add help for Admins.
+ * @param c the Command to add help for
+ * @param func the function to run when this help is asked for
+ **/
+int moduleAddAdminHelp(Command * c, int (*func) (User * u))
+{
+ if (c) {
+ c->admin_help = func;
+ return MOD_STOP;
+ }
+ return MOD_CONT;
+}
+
+ /**
+ * Add help for opers..
+ * @param c the Command to add help for
+ * @param func the function to run when this help is asked for
+ **/
+int moduleAddOperHelp(Command * c, int (*func) (User * u))
+{
+ if (c) {
+ c->oper_help = func;
+ return MOD_STOP;
+ }
+ return MOD_CONT;
+}
+
+/**
+ * Add help for registered users
+ * @param c the Command to add help for
+ * @param func the function to run when this help is asked for
+ **/
+int moduleAddRegHelp(Command * c, int (*func) (User * u))
+{
+ if (c) {
+ c->regular_help = func;
+ return MOD_STOP;
+ }
+ return MOD_CONT;
+}
+
+/**
+ * Add help for all users
+ * @param c the Command to add help for
+ * @param func the function to run when this help is asked for
+ **/
+int moduleAddHelp(Command * c, int (*func) (User * u))
+{
+ if (c) {
+ c->all_help = func;
+ return MOD_STOP;
+ }
+ return MOD_CONT;
+}
+
+/**
+ * Add output to nickserv help.
+ * when doing a /msg nickserv help, your function will be called to allow it to send out a notice() with the code you wish to dispaly
+ * @param func a pointer to the function which will display the code
+ **/
+void moduleSetNickHelp(void (*func) (User * u))
+{
+ if (mod_current_module) {
+ mod_current_module->nickHelp = func;
+ }
+}
+
+/**
+ * Add output to chanserv help.
+ * when doing a /msg chanserv help, your function will be called to allow it to send out a notice() with the code you wish to dispaly
+ * @param func a pointer to the function which will display the code
+ **/
+void moduleSetChanHelp(void (*func) (User * u))
+{
+ if (mod_current_module) {
+ mod_current_module->chanHelp = func;
+ }
+}
+
+/**
+ * Add output to memoserv help.
+ * when doing a /msg memoserv help, your function will be called to allow it to send out a notice() with the code you wish to dispaly
+ * @param func a pointer to the function which will display the code
+ **/
+void moduleSetMemoHelp(void (*func) (User * u))
+{
+ if (mod_current_module) {
+ mod_current_module->memoHelp = func;
+ }
+}
+
+/**
+ * Add output to botserv help.
+ * when doing a /msg botserv help, your function will be called to allow it to send out a notice() with the code you wish to dispaly
+ * @param func a pointer to the function which will display the code
+ **/
+void moduleSetBotHelp(void (*func) (User * u))
+{
+ if (mod_current_module) {
+ mod_current_module->botHelp = func;
+ }
+}
+
+/**
+ * Add output to operserv help.
+ * when doing a /msg operserv help, your function will be called to allow it to send out a notice() with the code you wish to dispaly
+ * @param func a pointer to the function which will display the code
+ **/
+void moduleSetOperHelp(void (*func) (User * u))
+{
+ if (mod_current_module) {
+ mod_current_module->operHelp = func;
+ }
+}
+
+/**
+ * Add output to hostserv help.
+ * when doing a /msg hostserv help, your function will be called to allow it to send out a notice() with the code you wish to dispaly
+ * @param func a pointer to the function which will display the code
+ **/
+void moduleSetHostHelp(void (*func) (User * u))
+{
+ if (mod_current_module) {
+ mod_current_module->hostHelp = func;
+ }
+}
+
+/**
+ * Add output to helpserv help.
+ * when doing a /msg helpserv help, your function will be called to allow it to send out a notice() with the code you wish to dispaly
+ * @param func a pointer to the function which will display the code
+ **/
+void moduleSetHelpHelp(void (*func) (User * u))
+{
+ if (mod_current_module) {
+ mod_current_module->helpHelp = func;
+ }
+}
+
+/**
+ * Display any extra module help for the given service.
+ * @param services which services is help being dispalyed for?
+ * @param u which user is requesting the help
+ **/
+void moduleDisplayHelp(int service, User * u)
+{
+#ifdef USE_MODULES
+ int idx;
+ ModuleHash *current = NULL;
+ Module *calling_module = mod_current_module;
+ char *calling_module_name = mod_current_module_name;
+
+ for (idx = 0; idx != MAX_CMD_HASH; idx++) {
+ for (current = MODULE_HASH[idx]; current; current = current->next) {
+ mod_current_module_name = current->name;
+ mod_current_module = current->m;
+
+ if ((service == 1) && current->m->nickHelp) {
+ current->m->nickHelp(u);
+ } else if ((service == 2) && current->m->chanHelp) {
+ current->m->chanHelp(u);
+ } else if ((service == 3) && current->m->memoHelp) {
+ current->m->memoHelp(u);
+ } else if ((service == 4) && current->m->botHelp) {
+ current->m->botHelp(u);
+ } else if ((service == 5) && current->m->operHelp) {
+ current->m->operHelp(u);
+ } else if ((service == 6) && current->m->hostHelp) {
+ current->m->hostHelp(u);
+ } else if ((service == 7) && current->m->helpHelp) {
+ current->m->helpHelp(u);
+ }
+ }
+ }
+
+ mod_current_module = calling_module;
+ mod_current_module_name = calling_module_name;
+#endif
+}
+
+/**
+ * Output module data information into the log file.
+ * This is a vwey "debug only" function to dump the whole contents
+ * of a moduleData struct into the log files.
+ * @param md The module data for the struct to be used
+ * @return 0 is always returned;
+ **/
+int moduleDataDebug(ModuleData ** md)
+{
+ ModuleData *current = NULL;
+ alog("Dumping module data....");
+ for (current = *md; current; current = current->next) {
+ alog("Module: [%s]", current->moduleName);
+ alog(" Key [%s]\tValue [%s]", current->key, current->value);
+ }
+ alog("End of module data dump");
+ return 0;
+}
+
+/**
+ * Add module data to a struct.
+ * This allows module coders to add data to an existing struct
+ * @param md The module data for the struct to be used
+ * @param key The Key for the key/value pair
+ * @param value The value for the key/value pair, this is what will be stored for you
+ * @return MOD_ERR_OK will be returned on success
+ **/
+int moduleAddData(ModuleData ** md, char *key, char *value)
+{
+ ModuleData *newData = NULL;
+
+ if (mod_current_module_name == NULL) {
+ alog("moduleAddData() called with mod_current_module_name being NULL");
+ if (debug)
+ do_backtrace(0);
+ }
+
+ if (!key || !value) {
+ alog("A module (%s) tried to use ModuleAddData() with one or more NULL arguments... returning", mod_current_module_name);
+ return MOD_ERR_PARAMS;
+ }
+
+ moduleDelData(md, key); /* Remove any existing module data for this module with the same key */
+
+ newData = malloc(sizeof(ModuleData));
+ if (!newData) {
+ return MOD_ERR_MEMORY;
+ }
+
+ newData->moduleName = sstrdup(mod_current_module_name);
+ newData->key = sstrdup(key);
+ newData->value = sstrdup(value);
+ newData->next = *md;
+ *md = newData;
+
+ if (debug) {
+ moduleDataDebug(md);
+ }
+ return MOD_ERR_OK;
+}
+
+/**
+ * Returns the value from a key/value pair set.
+ * This allows module coders to retrive any data they have previuosly stored in any given struct
+ * @param md The module data for the struct to be used
+ * @param key The key to find the data for
+ * @return the value paired to the given key will be returned, or NULL
+ **/
+char *moduleGetData(ModuleData ** md, char *key)
+{
+ /* See comment in moduleAddData... -GD */
+ char *mod_name = sstrdup(mod_current_module_name);
+ ModuleData *current = *md;
+
+ if (mod_current_module_name == NULL) {
+ alog("moduleGetData() called with mod_current_module_name being NULL");
+ if (debug)
+ do_backtrace(0);
+ }
+
+ if (debug) {
+ alog("debug: moduleGetData %p : key %s", (void *) md, key);
+ alog("debug: Current Module %s", mod_name);
+ }
+
+ while (current) {
+ if ((stricmp(current->moduleName, mod_name) == 0)
+ && (stricmp(current->key, key) == 0)) {
+ free(mod_name);
+ return sstrdup(current->value);
+ }
+ current = current->next;
+ }
+ free(mod_name);
+ return NULL;
+}
+
+/**
+ * Delete the key/value pair indicated by "key" for the current module.
+ * This allows module coders to remove a previously stored key/value pair.
+ * @param md The module data for the struct to be used
+ * @param key The key to delete the key/value pair for
+ **/
+void moduleDelData(ModuleData ** md, char *key)
+{
+ /* See comment in moduleAddData... -GD */
+ char *mod_name = sstrdup(mod_current_module_name);
+ ModuleData *current = *md;
+ ModuleData *prev = NULL;
+ ModuleData *next = NULL;
+
+ if (mod_current_module_name == NULL) {
+ alog("moduleDelData() called with mod_current_module_name being NULL");
+ if (debug)
+ do_backtrace(0);
+ }
+
+ if (key) {
+ while (current) {
+ next = current->next;
+ if ((stricmp(current->moduleName, mod_name) == 0)
+ && (stricmp(current->key, key) == 0)) {
+ if (prev) {
+ prev->next = current->next;
+ } else {
+ *md = current->next;
+ }
+ free(current->moduleName);
+ free(current->key);
+ free(current->value);
+ current->next = NULL;
+ free(current);
+ } else {
+ prev = current;
+ }
+ current = next;
+ }
+ }
+ free(mod_name);
+}
+
+/**
+ * This will remove all data for a particular module from existing structs.
+ * Its primary use is modulePrepForUnload() however, based on past expericance with module coders wanting to
+ * do just about anything and everything, its safe to use from inside the module.
+ * @param md The module data for the struct to be used
+ **/
+void moduleDelAllData(ModuleData ** md)
+{
+ /* See comment in moduleAddData... -GD */
+ char *mod_name = sstrdup(mod_current_module_name);
+ ModuleData *current = *md;
+ ModuleData *prev = NULL;
+ ModuleData *next = NULL;
+
+ if (mod_current_module_name == NULL) {
+ alog("moduleDelAllData() called with mod_current_module_name being NULL");
+ if (debug)
+ do_backtrace(0);
+ }
+
+ while (current) {
+ next = current->next;
+ if ((stricmp(current->moduleName, mod_name) == 0)) {
+ if (prev) {
+ prev->next = current->next;
+ } else {
+ *md = current->next;
+ }
+ free(current->moduleName);
+ free(current->key);
+ free(current->value);
+ current->next = NULL;
+ free(current);
+ } else {
+ prev = current;
+ }
+ current = next;
+ }
+ free(mod_name);
+}
+
+/**
+ * This will delete all module data used in any struct by module m.
+ * @param m The module to clear all data for
+ **/
+void moduleDelAllDataMod(Module * m)
+{
+ boolean freeme = false;
+ int i, j;
+ User *user;
+ NickAlias *na;
+ NickCore *nc;
+ ChannelInfo *ci;
+
+ if (!mod_current_module_name) {
+ mod_current_module_name = sstrdup(m->name);
+ freeme = true;
+ }
+
+ for (i = 0; i < 1024; i++) {
+ /* Remove the users */
+ for (user = userlist[i]; user; user = user->next) {
+ moduleDelAllData(&user->moduleData);
+ }
+ /* Remove the nick Cores */
+ for (nc = nclists[i]; nc; nc = nc->next) {
+ moduleDelAllData(&nc->moduleData);
+ /* Remove any memo data for this nick core */
+ for (j = 0; j < nc->memos.memocount; j++) {
+ moduleCleanStruct(&nc->memos.memos[j].moduleData);
+ }
+ }
+ /* Remove the nick Aliases */
+ for (na = nalists[i]; na; na = na->next) {
+ moduleDelAllData(&na->moduleData);
+ }
+ }
+
+ for (i = 0; i < 256; i++) {
+ /* Remove any chan info data */
+ for (ci = chanlists[i]; ci; ci = ci->next) {
+ moduleDelAllData(&ci->moduleData);
+ /* Remove any memo data for this nick core */
+ for (j = 0; j < ci->memos.memocount; j++) {
+ moduleCleanStruct(&ci->memos.memos[j].moduleData);
+ }
+ }
+ }
+
+ if (freeme) {
+ free(mod_current_module_name);
+ mod_current_module_name = NULL;
+ }
+}
+
+/**
+ * Remove any data from any module used in the given struct.
+ * Useful for cleaning up when a User leave's the net, a NickCore is deleted, etc...
+ * @param moduleData the moduleData struct to "clean"
+ **/
+void moduleCleanStruct(ModuleData ** moduleData)
+{
+ ModuleData *current = *moduleData;
+ ModuleData *next = NULL;
+
+ while (current) {
+ next = current->next;
+ free(current->moduleName);
+ free(current->key);
+ free(current->value);
+ current->next = NULL;
+ free(current);
+ current = next;
+ }
+ *moduleData = NULL;
+}
+
+/**
+ * Check the current version of anope against a given version number
+ * Specifiying -1 for minor,patch or build
+ * @param major The major version of anope, the first part of the verison number
+ * @param minor The minor version of anope, the second part of the version number
+ * @param patch The patch version of anope, the third part of the version number
+ * @param build The build revision of anope from SVN
+ * @return True if the version newer than the version specified.
+ **/
+boolean moduleMinVersion(int major, int minor, int patch, int build)
+{
+ boolean ret = false;
+ if (VERSION_MAJOR > major) { /* Def. new */
+ ret = true;
+ } else if (VERSION_MAJOR == major) { /* Might be newer */
+ if (minor == -1) {
+ return true;
+ } /* They dont care about minor */
+ if (VERSION_MINOR > minor) { /* Def. newer */
+ ret = true;
+ } else if (VERSION_MINOR == minor) { /* Might be newer */
+ if (patch == -1) {
+ return true;
+ } /* They dont care about patch */
+ if (VERSION_PATCH > patch) {
+ ret = true;
+ } else if (VERSION_PATCH == patch) {
+ if (build == -1) {
+ return true;
+ } /* They dont care about build */
+ if (VERSION_BUILD >= build) {
+ ret = true;
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+#ifdef _WIN32
+const char *ano_moderr(void)
+{
+ static char errbuf[513];
+ DWORD err = GetLastError();
+ if (err == 0)
+ return NULL;
+ FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM |
+ FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err, 0, errbuf, 512,
+ NULL);
+ return errbuf;
+}
+#endif
+
+/**
+ * Allow ircd protocol files to update the protect level info tables.
+ **/
+void updateProtectDetails(char *level_info_protect_word,
+ char *level_info_protectme_word,
+ char *fant_protect_add, char *fant_protect_del,
+ char *level_protect_word, char *protect_set_mode,
+ char *protect_unset_mode)
+{
+ int i = 0;
+ CSModeUtil ptr;
+ LevelInfo l_ptr;
+
+ ptr = csmodeutils[i];
+ while (ptr.name) {
+ if (strcmp(ptr.name, "PROTECT") == 0) {
+ csmodeutils[i].bsname = sstrdup(fant_protect_add);
+ csmodeutils[i].mode = sstrdup(protect_set_mode);
+ } else if (strcmp(ptr.name, "DEPROTECT") == 0) {
+ csmodeutils[i].bsname = sstrdup(fant_protect_del);
+ csmodeutils[i].mode = sstrdup(protect_unset_mode);
+ }
+ ptr = csmodeutils[++i];
+ }
+
+ i = 0;
+ l_ptr = levelinfo[i];
+ while (l_ptr.what != -1) {
+ if (l_ptr.what == CA_PROTECT) {
+ levelinfo[i].name = sstrdup(level_info_protect_word);
+ } else if (l_ptr.what == CA_PROTECTME) {
+ levelinfo[i].name = sstrdup(level_info_protectme_word);
+ } else if (l_ptr.what == CA_AUTOPROTECT) {
+ levelinfo[i].name = sstrdup(level_protect_word);
+ }
+ l_ptr = levelinfo[++i];
+ }
+}
+
+/**
+ * Deal with modules who want to lookup config directives!
+ * @param h The Directive to lookup in the config file
+ * @return 1 on success, 0 on error
+ **/
+int moduleGetConfigDirective(Directive * d)
+{
+ FILE *config;
+ char *dir = NULL;
+ char buf[1024];
+ char *directive;
+ int linenum = 0;
+ int ac = 0;
+ char *av[MAXPARAMS];
+ char *str = NULL;
+ char *s = NULL;
+ char *t = NULL;
+ int retval = 1;
+
+ config = fopen(SERVICES_CONF, "r");
+ if (!config) {
+ alog("Can't open %s", SERVICES_CONF);
+ return 0;
+ }
+ while (fgets(buf, sizeof(buf), config)) {
+ linenum++;
+ if (*buf == '#' || *buf == '\r' || *buf == '\n') {
+ continue;
+ }
+ dir = myStrGetOnlyToken(buf, '\t', 0);
+ if (dir) {
+ str = myStrGetTokenRemainder(buf, '\t', 1);
+ } else {
+ dir = myStrGetOnlyToken(buf, ' ', 0);
+ if (dir || (dir = myStrGetOnlyToken(buf, '\n', 0))) {
+ str = myStrGetTokenRemainder(buf, ' ', 1);
+ } else {
+ continue;
+ }
+ }
+ if (dir) {
+ directive = normalizeBuffer(dir);
+ } else {
+ continue;
+ }
+
+ if (stricmp(directive, d->name) == 0) {
+ if (str) {
+ s = str;
+ while (isspace(*s))
+ s++;
+ while (*s) {
+ if (ac >= MAXPARAMS) {
+ alog("module error: too many config. params");
+ break;
+ }
+ t = s;
+ if (*s == '"') {
+ t++;
+ s++;
+ while (*s && *s != '"') {
+ if (*s == '\\' && s[1] != 0)
+ s++;
+ s++;
+ }
+ if (!*s)
+ alog("module error: 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++;
+ }
+ }
+ retval = parse_directive(d, directive, ac, av, linenum, 0, s);
+ }
+ if (directive) {
+ free(directive);
+ }
+ }
+ if (dir)
+ free(dir);
+ if (str)
+ free(str);
+ fclose(config);
+ return retval;
+}
+
+/**
+ * Allow a module to add a set of language strings to anope
+ * @param langNumber the language number for the strings
+ * @param ac The language count for the strings
+ * @param av The language sring list.
+ **/
+void moduleInsertLanguage(int langNumber, int ac, char **av)
+{
+ int i;
+
+ if ((mod_current_module_name) && (!mod_current_module || strcmp(mod_current_module_name, mod_current_module->name))) {
+ mod_current_module = findModule(mod_current_module_name);
+ }
+
+ if (debug)
+ alog("debug: %s Adding %d texts for language %d", mod_current_module->name, ac, langNumber);
+
+ if (mod_current_module->lang[langNumber].argc > 0) {
+ moduleDeleteLanguage(langNumber);
+ }
+
+ mod_current_module->lang[langNumber].argc = ac;
+ mod_current_module->lang[langNumber].argv =
+ malloc(sizeof(char *) * ac);
+ for (i = 0; i < ac; i++) {
+ mod_current_module->lang[langNumber].argv[i] = sstrdup(av[i]);
+ }
+}
+
+/**
+ * Send a notice to the user in the correct language, or english.
+ * @param source Who sends the notice
+ * @param u The user to send the message to
+ * @param number The message number
+ * @param ... The argument list
+ **/
+void moduleNoticeLang(char *source, User * u, int number, ...)
+{
+ va_list va;
+ char buffer[4096], outbuf[4096];
+ char *fmt = NULL;
+ int lang = NSDefLanguage;
+ char *s, *t, *buf;
+
+ if ((mod_current_module_name) && (!mod_current_module || strcmp(mod_current_module_name, mod_current_module->name))) {
+ mod_current_module = findModule(mod_current_module_name);
+ }
+
+ /* Find the users lang, and use it if we can */
+ if (u && u->na && u->na->nc) {
+ lang = u->na->nc->language;
+ }
+
+ /* If the users lang isnt supported, drop back to English */
+ if (mod_current_module->lang[lang].argc == 0) {
+ lang = LANG_EN_US;
+ }
+
+ /* If the requested lang string exists for the language */
+ if (mod_current_module->lang[lang].argc > number) {
+ fmt = mod_current_module->lang[lang].argv[number];
+
+ buf = sstrdup(fmt);
+ va_start(va, number);
+ vsnprintf(buffer, 4095, buf, va);
+ va_end(va);
+ s = buffer;
+ while (*s) {
+ t = s;
+ s += strcspn(s, "\n");
+ if (*s)
+ *s++ = '\0';
+ strscpy(outbuf, t, sizeof(outbuf));
+ notice_user(source, u, "%s", outbuf);
+ }
+ free(buf);
+ } else {
+ alog("%s: INVALID language string call, language: [%d], String [%d]", mod_current_module->name, lang, number);
+ }
+}
+
+/**
+ * Get the text of the given lanugage string in the corrent language, or
+ * in english.
+ * @param u The user to send the message to
+ * @param number The message number
+ **/
+char *moduleGetLangString(User * u, int number)
+{
+ int lang = NSDefLanguage;
+
+ if ((mod_current_module_name) && (!mod_current_module || strcmp(mod_current_module_name, mod_current_module->name)))
+ mod_current_module = findModule(mod_current_module_name);
+
+ /* Find the users lang, and use it if we can */
+ if (u && u->na && u->na->nc)
+ lang = u->na->nc->language;
+
+ /* If the users lang isnt supported, drop back to English */
+ if (mod_current_module->lang[lang].argc == 0)
+ lang = LANG_EN_US;
+
+ /* If the requested lang string exists for the language */
+ if (mod_current_module->lang[lang].argc > number) {
+ return mod_current_module->lang[lang].argv[number];
+ /* Return an empty string otherwise, because we might be used without
+ * the return value being checked. If we would return NULL, bad things
+ * would happen!
+ */
+ } else {
+ alog("%s: INVALID language string call, language: [%d], String [%d]", mod_current_module->name, lang, number);
+ return "";
+ }
+}
+
+/**
+ * Delete a language from a module
+ * @param langNumber the language Number to delete
+ **/
+void moduleDeleteLanguage(int langNumber)
+{
+ int idx = 0;
+ if ((mod_current_module_name) && (!mod_current_module || strcmp(mod_current_module_name, mod_current_module->name))) {
+ mod_current_module = findModule(mod_current_module_name);
+ }
+ for (idx = 0; idx > mod_current_module->lang[langNumber].argc; idx++) {
+ free(mod_current_module->lang[langNumber].argv[idx]);
+ }
+ mod_current_module->lang[langNumber].argc = 0;
+}
+
+/**
+ * Enqueue a module operation (load/unload/reload)
+ * @param m Module to perform the operation on
+ * @param op Operation to perform on the module
+ * @param u User who requested the operation
+ **/
+void queueModuleOperation(Module *m, ModuleOperation op, User *u)
+{
+ ModuleQueue *qm;
+
+ qm = scalloc(1, sizeof(ModuleQueue));
+ qm->m = m;
+ qm->op = op;
+ qm->u = u;
+ qm->next = mod_operation_queue;
+ mod_operation_queue = qm;
+}
+
+/**
+ * Enqueue a module to load
+ * @param name Name of the module to load
+ * @param u User who requested the load
+ * @return 1 on success, 0 on error
+ **/
+int queueModuleLoad(char *name, User *u)
+{
+ Module *m;
+
+ if (!name || !u)
+ return 0;
+
+ if (findModule(name))
+ return 0;
+ m = createModule(name);
+ queueModuleOperation(m, MOD_OP_LOAD, u);
+
+ return 1;
+}
+
+/**
+ * Enqueue a module to unload
+ * @param name Name of the module to unload
+ * @param u User who requested the unload
+ * @return 1 on success, 0 on error
+ **/
+int queueModuleUnload(char *name, User *u)
+{
+ Module *m;
+
+ if (!name || !u)
+ return 0;
+
+ m = findModule(name);
+ if (!m)
+ return 0;
+ queueModuleOperation(m, MOD_OP_UNLOAD, u);
+
+ return 1;
+}
+
+/**
+ * Execute all queued module operations
+ **/
+void handleModuleOperationQueue(void)
+{
+ ModuleQueue *next;
+ int status;
+
+ if (!mod_operation_queue)
+ return;
+
+ while (mod_operation_queue) {
+ next = mod_operation_queue->next;
+
+ mod_current_module = mod_operation_queue->m;
+ mod_current_user = mod_operation_queue->u;
+
+ if (mod_operation_queue->op == MOD_OP_LOAD) {
+ alog("Trying to load module [%s]", mod_operation_queue->m->name);
+ status = loadModule(mod_operation_queue->m, mod_operation_queue->u);
+ alog("Module loading status: %d (%s)", status, ModuleGetErrStr(status));
+ if (status != MOD_ERR_OK) {
+ if(mod_current_user) {
+ notice_lang(s_OperServ, mod_current_user, OPER_MODULE_LOAD_FAIL,mod_operation_queue->m->name);
+ }
+ destroyModule(mod_operation_queue->m);
+ }
+ } else if (mod_operation_queue->op == MOD_OP_UNLOAD) {
+ alog("Trying to unload module [%s]", mod_operation_queue->m->name);
+ status = unloadModule(mod_operation_queue->m, mod_operation_queue->u);
+ alog("Module unloading status: %d (%s)", status, ModuleGetErrStr(status));
+ }
+
+ /* Remove the ModuleQueue from memory */
+ free(mod_operation_queue);
+
+ mod_operation_queue = next;
+ }
+
+ mod_current_module = NULL;
+ mod_current_user = NULL;
+}
+
+void ModuleRunTimeDirCleanUp(void)
+{
+#ifndef _WIN32
+ DIR *dirp;
+ struct dirent *dp;
+#else
+ BOOL fFinished;
+ HANDLE hList;
+ TCHAR szDir[MAX_PATH + 1];
+ TCHAR szSubDir[MAX_PATH + 1];
+ WIN32_FIND_DATA FileData;
+ char buffer[_MAX_PATH];
+#endif
+ char dirbuf[BUFSIZE];
+ char filebuf[BUFSIZE];
+
+
+#ifndef _WIN32
+ snprintf(dirbuf, BUFSIZE, "%s/modules/runtime", services_dir);
+#else
+ snprintf(dirbuf, BUFSIZE, "\\%s", "modules/runtime");
+#endif
+
+ if (debug) {
+ alog("debug: Cleaning out Module run time directory (%s) - this may take a moment please wait", dirbuf);
+ }
+
+#ifndef _WIN32
+ if ((dirp = opendir(dirbuf)) == NULL) {
+ if (debug) {
+ alog("debug: cannot open directory (%s)", dirbuf);
+ }
+ return;
+ }
+ while ((dp = readdir(dirp)) != NULL) {
+ if (dp->d_ino == 0) {
+ continue;
+ }
+ if (!stricmp(dp->d_name, ".") || !stricmp(dp->d_name, "..")) {
+ continue;
+ }
+ snprintf(filebuf, BUFSIZE, "%s/%s", dirbuf, dp->d_name);
+ unlink(filebuf);
+ }
+ closedir(dirp);
+#else
+ /* Get the current working directory: */
+ if (_getcwd(buffer, _MAX_PATH) == NULL) {
+ if (debug) {
+ alog("debug: Unable to set Current working directory");
+ }
+ }
+ snprintf(szDir, sizeof(szDir), "%s\\%s\\*", buffer, dirbuf);
+
+ hList = FindFirstFile(szDir, &FileData);
+ if (hList != INVALID_HANDLE_VALUE) {
+ fFinished = FALSE;
+ while (!fFinished) {
+ if (!(FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {
+ snprintf(filebuf, BUFSIZE, "%s/%s", dirbuf, FileData.cFileName);
+ DeleteFile(filebuf);
+ }
+ if (!FindNextFile(hList, &FileData)) {
+ if (GetLastError() == ERROR_NO_MORE_FILES) {
+ fFinished = TRUE;
+ }
+ }
+ }
+ } else {
+ if (debug) {
+ alog("debug: Invalid File Handle. GetLastError reports %d\n", GetLastError());
+ }
+ }
+ FindClose(hList);
+#endif
+ if (debug) {
+ alog("debug: Module run time directory has been cleaned out");
+ }
+}
+
+/* EOF */
diff --git a/src/modules/Makefile b/src/modules/Makefile
new file mode 100644
index 000000000..cafbe451c
--- /dev/null
+++ b/src/modules/Makefile
@@ -0,0 +1,48 @@
+include ./Makefile.inc
+
+MAKEARGS = 'CFLAGS=${CFLAGS}' 'CC=${CC}' 'ANOPELIBS=${ANOPELIBS}' \
+ 'LDFLAGS=${LDFLAGS}' 'BINDEST=${BINDEST}' 'INSTALL=${INSTALL}' \
+ 'INCLUDEDIR=${INCLUDEDIR}' 'RM=${RM}' 'CP=${CP}' \
+ 'TOUCH=${TOUCH}' 'SHELL=${SHELL}' 'DATDEST=${DATDEST}' \
+ 'RUNGROUP=${RUNGROUP}' 'MODULE_PATH=${MODULE_PATH}' \
+ 'PROFILE=${PROFILE}' 'SHARED=${SHARED}' 'MODULEFLAGS=${MODULEFLAGS}'
+
+OBJECTS= $(SRCS:.c=.o)
+SO_FILES=$(OBJECTS:.o=.s)
+CDEFS= -rdynamic -Wall
+
+all: modules subs
+
+modules: $(OBJECTS) $(SO_FILES)
+
+install:
+ $(CP) ./*.so $(MODULE_PATH)
+ @for i in $(SUBS); do \
+ echo "make install in $$i..."; \
+ (cd $$i; $(MAKE) $(MAKEARGS) install);done
+
+distclean: spotless
+
+.c.o:
+ $(CC) ${CFLAGS} ${CDEFS} ${MODULEFLAGS} -I../${INCLUDEDIR} -c $<
+
+.o.s:
+ $(CC) ${SHARED} ../mod_version.o $< -o $*.so ${PROFILE}
+ @$(TOUCH) $*.s
+
+subs:
+ @for i in $(SUBS); do \
+ echo "make all in $$i..."; \
+ (cd $$i; $(MAKE) $(MAKEARGS) all); done
+
+subs_clean:
+ @for i in $(SUBS); do \
+ echo "cleaning in $$i..."; \
+ (cd $$i; $(MAKE) $(MAKEARGS) clean); done
+
+clean: subs_clean
+ rm -f *.o *.s *.so *.c~ core
+
+spotless:
+ rm -f *.o *.s *.so *.c~ core *.so Makefile.inc
+
diff --git a/src/modules/Makefile.sub b/src/modules/Makefile.sub
new file mode 100644
index 000000000..7697249bf
--- /dev/null
+++ b/src/modules/Makefile.sub
@@ -0,0 +1,28 @@
+MAKEARGS = 'CFLAGS=${CFLAGS}' 'CC=${CC}' 'ANOPELIBS=${ANOPELIBS}' \
+ 'LDFLAGS=${LDFLAGS}' 'BINDEST=${BINDEST}' 'INSTALL=${INSTALL}' \
+ 'INCLUDEDIR=${INCLUDEDIR}' 'RM=${RM}' 'CP=${CP}' \
+ 'TOUCH=${TOUCH}' 'SHELL=${SHELL}' 'DATDEST=${DATDEST}' \
+ 'RUNGROUP=${RUNGROUP}' 'MODULE_PATH=${MODULE_PATH}' \
+ 'PROFILE=${PROFILE}' 'SHARED=${SHARED}' 'MODULEFLAGS=${MODULEFLAGS}'
+
+OBJECTS= $(SRCS:.c=.o)
+SO_FILES=$(OBJECTS:.o=.s)
+CDEFS= -rdynamic -Wall
+
+all: module
+
+module: $(OBJECTS) so
+
+distclean: spotless
+
+.c.o:
+ $(CC) ${CFLAGS} ${CDEFS} ${MODULEFLAGS} -I../ -I../../${INCLUDEDIR} -c $<
+
+so:
+ $(CC) ${SHARED} ../../mod_version.o $(OBJECTS) -o ../$(TARGET).so ${PROFILE}
+
+clean:
+ rm -f *.o *.so *.c~ core
+
+spotless:
+ rm -f *~ *.o *.so *.c~ core
diff --git a/src/modules/README b/src/modules/README
new file mode 100644
index 000000000..6aee0ac47
--- /dev/null
+++ b/src/modules/README
@@ -0,0 +1 @@
+Please read the "MODULES" file located on the "docs" directory.
diff --git a/src/modules/bs_fantasy_unban.c b/src/modules/bs_fantasy_unban.c
new file mode 100644
index 000000000..a17e06551
--- /dev/null
+++ b/src/modules/bs_fantasy_unban.c
@@ -0,0 +1,82 @@
+/* BotServ core fantasy functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+int do_fantasy(int argc, char **argv);
+
+/**
+ * Create the hook, and tell anope about it.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ EvtHook *hook;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion
+ ("$Id$");
+ moduleSetType(CORE);
+
+ hook = createEventHook(EVENT_BOT_FANTASY, do_fantasy);
+ moduleAddEventHook(hook);
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+
+}
+
+/**
+ * Handle unban fantasy command.
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT or MOD_STOP
+ **/
+int do_fantasy(int argc, char **argv)
+{
+ User *u;
+ ChannelInfo *ci;
+ char *target = NULL;
+
+ if (argc < 3)
+ return MOD_CONT;
+
+ if (stricmp(argv[0], "unban") == 0) {
+ u = finduser(argv[1]);
+ ci = cs_findchan(argv[2]);
+ if (!u || !ci || !check_access(u, ci, CA_UNBAN))
+ return MOD_CONT;
+
+ if (argc >= 4)
+ target = myStrGetToken(argv[3], ' ', 0);
+ if (!target)
+ common_unban(ci, u->nick);
+ else
+ common_unban(ci, target);
+
+ /* free target if needed (#852) */
+ Anope_Free(target);
+ }
+
+ return MOD_CONT;
+}
diff --git a/src/modules/configure b/src/modules/configure
new file mode 100755
index 000000000..cf2158d66
--- /dev/null
+++ b/src/modules/configure
@@ -0,0 +1,58 @@
+#!/bin/sh
+
+echo2 () {
+ $ECHO2 "$*$ECHO2SUF" # these are defined later
+}
+
+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
+
+
+echo2 "SRCS=" > ./Makefile.inc
+FIRST=1
+for oldfile in *.c
+do
+ if [ "$FIRST" = 1 ] ; then
+ echo2 " "$oldfile >> ./Makefile.inc
+ else
+ echo "\\" >> ./Makefile.inc
+ echo2 " " $oldfile >> ./Makefile.inc
+ fi
+ FIRST=0
+done
+echo "" >> ./Makefile.inc
+
+echo2 "SUBS=" >> ./Makefile.inc
+FIRST=1
+for dir in *
+do
+ if [ -d $dir ] ; then
+ if [ -f $dir/configure ] ; then
+ cd $dir
+ ./configure
+ cd ..
+ fi
+ if [ -f $dir/Makefile ] ; then
+ if [ "$FIRST" = 1 ] ; then
+ echo2 " "$dir >> ./Makefile.inc
+ else
+ echo "\\" >> ./Makefile.inc
+ echo2 " " $dir >> ./Makefile.inc
+ fi
+ FIRST=0
+ fi
+ fi
+done
+
+exit 0
+
diff --git a/src/modules/cs_appendtopic.c b/src/modules/cs_appendtopic.c
new file mode 100644
index 000000000..7e0d27bb4
--- /dev/null
+++ b/src/modules/cs_appendtopic.c
@@ -0,0 +1,247 @@
+/* cs_appendtopic.c - Add text to a channels topic
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Based on the original module by SGR <Alex_SGR@ntlworld.com>
+ * Included in the Anope module pack since Anope 1.7.9
+ * Anope Coder: GeniusDex <geniusdex@anope.org>
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Send bug reports to the Anope Coder instead of the module
+ * author, because any changes since the inclusion into anope
+ * are not supported by the original author.
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+#define AUTHOR "SGR"
+#define VERSION "$Id$"
+
+ /* ------------------------------------------------------------
+ * Name: cs_appendtopic
+ * Author: SGR <Alex_SGR@ntlworld.com>
+ * Date: 31/08/2003
+ * ------------------------------------------------------------
+ *
+ * This module has no configurable options. For information on
+ * this module, load it and refer to /ChanServ APPENDTOPIC HELP
+ *
+ * Thanks to dengel, Rob and Certus for all there support.
+ * Especially Rob, who always manages to show me where I have
+ * not allocated any memory. Even if it takes a few weeks of
+ * pestering to get him to look at it.
+ *
+ * ------------------------------------------------------------
+ */
+
+/* ---------------------------------------------------------------------- */
+/* DO NOT EDIT BELOW THIS LINE UNLESS YOU KNOW WHAT YOU ARE DOING */
+/* ---------------------------------------------------------------------- */
+
+#define LNG_NUM_STRINGS 3
+
+#define LNG_CHAN_HELP 0
+#define LNG_CHAN_HELP_APPENDTOPIC 1
+#define LNG_APPENDTOPIC_SYNTAX 2
+
+int my_cs_appendtopic(User * u);
+void my_cs_help(User * u);
+int my_cs_help_appendtopic(User * u);
+void my_add_languages(void);
+
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+ int status;
+
+ moduleAddAuthor(AUTHOR);
+ moduleAddVersion(VERSION);
+ moduleSetType(SUPPORTED);
+
+ c = createCommand("APPENDTOPIC", my_cs_appendtopic, NULL, -1, -1, -1,
+ -1, -1);
+ if ((status = moduleAddCommand(CHANSERV, c, MOD_HEAD))) {
+ alog("[cs_appendtopic] Unable to create APPENDTOPIC command: %d",
+ status);
+ return MOD_STOP;
+ }
+ moduleAddHelp(c, my_cs_help_appendtopic);
+ moduleSetChanHelp(my_cs_help);
+
+ my_add_languages();
+
+ alog("[cs_appendtopic] Loaded successfully");
+
+ return MOD_CONT;
+}
+
+void AnopeFini(void)
+{
+ alog("[cs_appendtopic] Unloaded successfully");
+}
+
+void my_cs_help(User * u)
+{
+ moduleNoticeLang(s_ChanServ, u, LNG_CHAN_HELP);
+}
+
+int my_cs_help_appendtopic(User * u)
+{
+ moduleNoticeLang(s_ChanServ, u, LNG_APPENDTOPIC_SYNTAX);
+ notice(s_ChanServ, u->nick, " ");
+ moduleNoticeLang(s_ChanServ, u, LNG_CHAN_HELP_APPENDTOPIC);
+ return MOD_STOP;
+}
+
+int my_cs_appendtopic(User * u)
+{
+ char *cur_buffer;
+ char *chan;
+ char *newtopic;
+ char topic[1024];
+ Channel *c;
+ ChannelInfo *ci;
+
+ cur_buffer = moduleGetLastBuffer();
+ chan = myStrGetToken(cur_buffer, ' ', 0);
+ newtopic = myStrGetTokenRemainder(cur_buffer, ' ', 1);
+
+ if (!chan || !newtopic) {
+ moduleNoticeLang(s_ChanServ, u, LNG_APPENDTOPIC_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) {
+ snprintf(topic, sizeof(topic), "%s %s", ci->last_topic,
+ newtopic);
+ free(ci->last_topic);
+ } else {
+ strscpy(topic, newtopic, sizeof(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 (ircd->topictsbackward)
+ c->topic_time = c->topic_time - 1;
+ else
+ c->topic_time = ci->last_topic_time;
+
+ if (is_services_admin(u) && !check_access(u, ci, CA_TOPIC))
+ alog("%s: %s!%s@%s changed topic of %s as services admin.",
+ s_ChanServ, u->nick, u->username, u->host, c->name);
+ if (ircd->join2set) {
+ if (whosends(ci) == s_ChanServ) {
+ anope_cmd_join(s_ChanServ, c->name, c->creation_time);
+ anope_cmd_mode(NULL, c->name, "+o %s", s_ChanServ);
+ }
+ }
+ anope_cmd_topic(whosends(ci), c->name, u->nick, topic, c->topic_time);
+ if (ircd->join2set) {
+ if (whosends(ci) == s_ChanServ) {
+ anope_cmd_part(s_ChanServ, c->name, NULL);
+ }
+ }
+ }
+ return MOD_CONT;
+}
+
+void my_add_languages(void)
+{
+ /* English (US) */
+ char *langtable_en_us[] = {
+ /* LNG_CHAN_HELP */
+ " APPENDTOPIC Add text to a channels topic",
+ /* LNG_CHAN_HELP_APPENDTOPIC */
+ "This command allows users to append text to a currently set\n"
+ "channel topic. When TOPICLOCK is on, the topic is updated and\n"
+ "the new, updated topic is locked.",
+ /* LNG_APPENDTOPIC_SYNTAX */
+ "Syntax: APPENDTOPIC channel text\n"
+ };
+
+ /* Dutch (NL) */
+ char *langtable_nl[] = {
+ /* LNG_CHAN_HELP */
+ " APPENDTOPIC Voeg tekst aan een kanaal onderwerp toe",
+ /* LNG_CHAN_HELP_APPENDTOPIC */
+ "Dit command stelt gebruikers in staat om text toe te voegen\n"
+ "achter het huidige onderwerp van een kanaal. Als TOPICLOCK aan\n"
+ "staat, zal het onderwerp worden bijgewerkt en zal het nieuwe,\n"
+ "bijgewerkte topic worden geforceerd.",
+ /* LNG_APPENDTOPIC_SYNTAX */
+ "Gebruik: APPENDTOPIC kanaal tekst\n"
+ };
+
+ /* German (DE) */
+ char *langtable_de[] = {
+ /* LNG_CHAN_HELP */
+ " APPENDTOPIC Fügt einen Text zu einem Channel-Topic hinzu.",
+ /* LNG_CHAN_HELP_APPENDTOPIC */
+ "Dieser Befehl erlaubt Benutzern, einen Text zu dem vorhandenen Channel-Topic\n"
+ "hinzuzufügen. Wenn TOPICLOCK gesetzt ist, wird das Topic aktualisiert\n"
+ "und das neue, aktualisierte Topic wird gesperrt.",
+ /* LNG_APPENDTOPIC_SYNTAX */
+ "Syntax: APPENDTOPIC Channel Text\n"
+ };
+
+ /* Portuguese (PT) */
+ char *langtable_pt[] = {
+ /* LNG_CHAN_HELP */
+ " APPENDTOPIC Adiciona texto ao tópico de um canal",
+ /* LNG_CHAN_HELP_APPENDTOPIC */
+ "Este comando permite aos usuários anexar texto a um tópico de canal\n"
+ "já definido. Quando TOPICLOCK está ativado, o tópico é atualizado e\n"
+ "o novo tópico é travado.",
+ /* LNG_APPENDTOPIC_SYNTAX */
+ "Sintaxe: APPENDTOPIC canal texto\n"
+ };
+
+ /* Russian (RU) */
+ char *langtable_ru[] = {
+ /* LNG_CHAN_HELP */
+ " APPENDTOPIC Äîáàâëÿåò òåêñò ê òîïèêó êàíàëà",
+ /* LNG_CHAN_HELP_APPENDTOPIC */
+ "Äàííàÿ êîìàíäà ïîçâîëÿåò äîáàâèòü òåêñò ê òîïèêó, êîòîðûé óñòàíîâëåí íà óêàçàííîì\n"
+ "êàíàëå. Åñëè àêòèâèðîâàí ðåæèì TOPICLOCK, òîïèê áóäåò îáíîâëåí è çàáëîêèðîâàí.\n"
+ "Ïðèìå÷àíèå: òåêñò áóäåò ÄÎÁÀÂËÅÍ ê òîïèêó, òî åñòü ñòàðûé òîïèê óäàëåí ÍÅ ÁÓÄÅÒ.\n",
+ /* LNG_APPENDTOPIC_SYNTAX */
+ "Ñèíòàêñèñ: APPENDTOPIC #êàíàë òåêñò\n"
+ };
+
+ /* Italian (IT) */
+ char *langtable_it[] = {
+ /* LNG_CHAN_HELP */
+ " APPENDTOPIC Aggiunge del testo al topic di un canale",
+ /* LNG_CHAN_HELP_APPENDTOPIC */
+ "Questo comando permette agli utenti di aggiungere del testo ad un topic di un canale\n"
+ "già impostato. Se TOPICLOCK è attivato, il topic viene aggiornato e il nuovo topic\n"
+ "viene bloccato.",
+ /* LNG_APPENDTOPIC_SYNTAX */
+ "Sintassi: APPENDTOPIC canale testo\n"
+ };
+
+ moduleInsertLanguage(LANG_EN_US, LNG_NUM_STRINGS, langtable_en_us);
+ moduleInsertLanguage(LANG_NL, LNG_NUM_STRINGS, langtable_nl);
+ moduleInsertLanguage(LANG_DE, LNG_NUM_STRINGS, langtable_de);
+ moduleInsertLanguage(LANG_PT, LNG_NUM_STRINGS, langtable_pt);
+ moduleInsertLanguage(LANG_RU, LNG_NUM_STRINGS, langtable_ru);
+ moduleInsertLanguage(LANG_IT, LNG_NUM_STRINGS, langtable_it);
+}
+
+/* EOF */
diff --git a/src/modules/cs_enforce.c b/src/modules/cs_enforce.c
new file mode 100644
index 000000000..a9beec419
--- /dev/null
+++ b/src/modules/cs_enforce.c
@@ -0,0 +1,479 @@
+/* cs_enforce - Add a /cs ENFORCE command to enforce various set
+ * options and channelmodes on a channel.
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Included in the Anope module pack since Anope 1.7.9
+ * Anope Coder: GeniusDex <geniusdex@anope.org>
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Send any bug reports to the Anope Coder, as he will be able
+ * to deal with it best.
+ */
+
+#include "module.h"
+
+#define AUTHOR "Anope"
+#define VERSION "$Id$"
+
+int my_cs_enforce(User * u);
+void my_cs_help(User * u);
+int my_cs_help_enforce(User * u);
+void my_add_languages(void);
+
+#define LNG_NUM_STRINGS 6
+
+#define LNG_CHAN_HELP 0
+#define LNG_ENFORCE_SYNTAX 1
+#define LNG_CHAN_HELP_ENFORCE 2
+#define LNG_CHAN_HELP_ENFORCE_R_ENABLED 3
+#define LNG_CHAN_HELP_ENFORCE_R_DISABLED 4
+#define LNG_CHAN_RESPONSE 5
+
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+ int status;
+
+ moduleAddAuthor(AUTHOR);
+ moduleAddVersion(VERSION);
+ moduleSetType(SUPPORTED);
+
+ c = createCommand("ENFORCE", my_cs_enforce, NULL, -1, -1, -1, -1, -1);
+ if ((status = moduleAddCommand(CHANSERV, c, MOD_HEAD))) {
+ alog("[cs_enforce] Unable to create ENFORCE command: %d", status);
+ return MOD_STOP;
+ }
+
+ moduleAddHelp(c, my_cs_help_enforce);
+ moduleSetChanHelp(my_cs_help);
+
+ my_add_languages();
+
+ return MOD_CONT;
+}
+
+void AnopeFini(void)
+{
+ /* Nothing to clean up */
+}
+
+/* Enforcing functions */
+void do_enforce_secureops(Channel * c)
+{
+ struct c_userlist *user;
+ struct c_userlist *next;
+ ChannelInfo *ci;
+ uint32 flags;
+
+ if (!(ci = c->ci))
+ return;
+
+ if (debug)
+ alog("debug: cs_enforce: Enforcing SECUREOPS on %s", c->name);
+
+ /* Dirty hack to allow chan_set_correct_modes to work ok.
+ * We pretend like SECUREOPS is on so it doesn't ignore that
+ * part of the code. This way we can enforce SECUREOPS even
+ * if it's off.
+ */
+ flags = ci->flags;
+ ci->flags |= CI_SECUREOPS;
+
+ user = c->users;
+ do {
+ next = user->next;
+ chan_set_correct_modes(user->user, c, 0);
+ user = next;
+ } while (user);
+
+ ci->flags = flags;
+}
+
+void do_enforce_restricted(Channel * c)
+{
+ struct c_userlist *user;
+ struct c_userlist *next;
+ ChannelInfo *ci;
+ int16 old_nojoin_level;
+ char mask[BUFSIZE];
+ char *reason;
+ char *av[3];
+ User *u;
+
+ if (!(ci = c->ci))
+ return;
+
+ if (debug)
+ alog("debug: cs_enforce: Enforcing RESTRICTED on %s", c->name);
+
+ old_nojoin_level = ci->levels[CA_NOJOIN];
+ if (ci->levels[CA_NOJOIN] < 0)
+ ci->levels[CA_NOJOIN] = 0;
+
+ user = c->users;
+ do {
+ next = user->next;
+ u = user->user;
+ if (check_access(u, c->ci, CA_NOJOIN)) {
+ get_idealban(ci, u, mask, sizeof(mask));
+ reason = getstring(u->na, CHAN_NOT_ALLOWED_TO_JOIN);
+ anope_cmd_mode(whosends(ci), ci->name, "+b %s %lu", mask,
+ time(NULL));
+ anope_cmd_kick(whosends(ci), ci->name, u->nick, "%s", reason);
+ av[0] = ci->name;
+ av[1] = u->nick;
+ av[2] = reason;
+ do_kick(s_ChanServ, 3, av);
+ }
+ user = next;
+ } while (user);
+
+ ci->levels[CA_NOJOIN] = old_nojoin_level;
+}
+
+void do_enforce_cmode_R(Channel * c)
+{
+ struct c_userlist *user;
+ struct c_userlist *next;
+ ChannelInfo *ci;
+ char mask[BUFSIZE];
+ char *reason;
+ char *av[3];
+ User *u;
+ CBMode *cbm;
+
+ if (!(ci = c->ci))
+ return;
+
+ if (debug)
+ alog("debug: cs_enforce: Enforcing mode +R on %s", c->name);
+
+ user = c->users;
+ do {
+ next = user->next;
+ u = user->user;
+ if (!nick_identified(u)) {
+ get_idealban(ci, u, mask, sizeof(mask));
+ reason = getstring(u->na, CHAN_NOT_ALLOWED_TO_JOIN);
+ if (((cbm = &cbmodes['R'])->flag == 0)
+ || !(c->mode & cbm->flag))
+ anope_cmd_mode(whosends(ci), ci->name, "+b %s %lu", mask,
+ time(NULL));
+ anope_cmd_kick(whosends(ci), ci->name, u->nick, "%s", reason);
+ av[0] = ci->name;
+ av[1] = u->nick;
+ av[2] = reason;
+ do_kick(s_ChanServ, 3, av);
+ }
+ user = next;
+ } while (user);
+}
+
+/* Enforcing Group Functions */
+void do_enforce_set(Channel * c)
+{
+ ChannelInfo *ci;
+
+ if (!(ci = c->ci))
+ return;
+
+ if (ci->flags & CI_SECUREOPS)
+ do_enforce_secureops(c);
+ if (ci->flags & CI_RESTRICTED)
+ do_enforce_restricted(c);
+}
+
+void do_enforce_modes(Channel * c)
+{
+ CBMode *cbm;
+
+ if (((cbm = &cbmodes['R'])->flag != 0) && (c->mode & cbm->flag))
+ do_enforce_cmode_R(c);
+}
+
+/* End of enforcing functions */
+
+int my_cs_enforce(User * u)
+{
+ char *cur_buffer;
+ char *chan=NULL;
+ char *what=NULL;
+ Channel *c;
+ ChannelInfo *ci;
+
+ cur_buffer = moduleGetLastBuffer();
+ chan = myStrGetToken(cur_buffer, ' ', 0);
+
+ if (!chan) {
+ moduleNoticeLang(s_ChanServ, u, LNG_ENFORCE_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, ci->name);
+ } else if (!is_services_admin(u) && !check_access(u, ci, CA_AKICK)) {
+ notice_lang(s_ChanServ, u, PERMISSION_DENIED);
+ } else {
+ what = myStrGetToken(cur_buffer, ' ', 1);
+ if (!what || (stricmp(what, "SET") == 0)) {
+ do_enforce_set(c);
+ moduleNoticeLang(s_ChanServ,u,LNG_CHAN_RESPONSE,what);
+ } else if (stricmp(what, "MODES") == 0) {
+ do_enforce_modes(c);
+ moduleNoticeLang(s_ChanServ,u,LNG_CHAN_RESPONSE,what);
+ } else if (stricmp(what, "SECUREOPS") == 0) {
+ do_enforce_secureops(c);
+ moduleNoticeLang(s_ChanServ,u,LNG_CHAN_RESPONSE,what);
+ } else if (stricmp(what, "RESTRICTED") == 0) {
+ do_enforce_restricted(c);
+ moduleNoticeLang(s_ChanServ,u,LNG_CHAN_RESPONSE,what);
+ } else if (stricmp(what, "+R") == 0) {
+ do_enforce_cmode_R(c);
+ moduleNoticeLang(s_ChanServ,u,LNG_CHAN_RESPONSE,what);
+ } else {
+ moduleNoticeLang(s_ChanServ, u, LNG_ENFORCE_SYNTAX);
+ }
+ }
+
+ if(chan) free(chan);
+ if(what) free(what);
+
+ return MOD_CONT;
+}
+
+/* Language and response stuff */
+void my_cs_help(User * u)
+{
+ moduleNoticeLang(s_ChanServ, u, LNG_CHAN_HELP);
+}
+
+int my_cs_help_enforce(User * u)
+{
+ moduleNoticeLang(s_ChanServ, u, LNG_ENFORCE_SYNTAX);
+ notice(s_ChanServ, u->nick, " ");
+ moduleNoticeLang(s_ChanServ, u, LNG_CHAN_HELP_ENFORCE);
+ notice(s_ChanServ, u->nick, " ");
+ if (cbmodes['R'].flag != 0)
+ moduleNoticeLang(s_ChanServ, u, LNG_CHAN_HELP_ENFORCE_R_ENABLED);
+ else
+ moduleNoticeLang(s_ChanServ, u, LNG_CHAN_HELP_ENFORCE_R_DISABLED);
+
+ return MOD_STOP;
+}
+
+void my_add_languages(void)
+{
+ /* English (US) */
+ char *langtable_en_us[] = {
+ /* LNG_CHAN_HELP */
+ " ENFORCE Enforce various channel modes and set options",
+ /* LNG_ENFORCE_SYNTAX */
+ "Syntax: \002ENFORCE \037channel\037 [\037what\037]\002",
+ /* LNG_CHAN_HELP_ENFORCE */
+ "Enforce various channel modes and set options. The \037channel\037\n"
+ "option indicates what channel to enforce the modes and options\n"
+ "on. The \037what\037 option indicates what modes and options to\n"
+ "enforce, and can be any of SET, SECUREOPS, RESTRICTED, MODES,\n"
+ "or +R. When left out, it defaults to SET.\n"
+ " \n"
+ "If \037what\037 is SET, it will enforce SECUREOPS and RESTRICTED\n"
+ "on the users currently in the channel, if they are set. Give\n"
+ "SECUREOPS to enforce the SECUREOPS option, even if it is not\n"
+ "enabled. Use RESTRICTED to enfore the RESTRICTED option, also\n"
+ "if it's not enabled.",
+ /* LNG_CHAN_HELP_ENFORCE_R_ENABLED */
+ "If \037what\037 is MODES, it will enforce channelmode +R if it is\n"
+ "set. If +R is specified for \037what\037, the +R channelmode will\n"
+ "also be enforced, but even if it is not set. If it is not set,\n"
+ "users will be banned to ensure they don't just rejoin.",
+ /* LNG_CHAN_HELP_ENFORCE_R_DISABLED */
+ "If \037what\037 is MODES, nothing will be enforced, since it would\n"
+ "enforce modes that the current ircd does not support. If +R is\n"
+ "specified for \037what\037, an equalivant of channelmode +R on\n"
+ "other ircds will be enforced. All users that are in the channel\n"
+ "but have not identified for their nickname will be kicked and\n"
+ "banned from the channel.",
+ /* LNG_CHAN_RESPONSE */
+ "Enforced %s"
+ };
+
+ /* Dutch (NL) */
+ char *langtable_nl[] = {
+ /* LNG_CHAN_HELP */
+ " ENFORCE Forceer enkele kanaalmodes en set-opties",
+ /* LNG_ENFORCE_SYNTAX */
+ "Syntax: \002ENFORCE \037kanaal\037 [\037wat\037]\002",
+ /* LNG_CHAN_HELP_ENFORCE */
+ "Forceer enkele kannalmodes en set-opties. De \037kanaal\037 optie\n"
+ "geeft aan op welk kanaal de modes en opties geforceerd moeten\n"
+ "worden. De \037wat\037 optie geeft aan welke modes en opties\n"
+ "geforceerd moeten worden; dit kan SET, SECUREOPS, RESTRICTED,\n"
+ "MODES, of +R zijn. Indien weggelaten is dit standaard SET.\n"
+ " \n"
+ "Als er voor \037wat\037 SET wordt ingevuld, zullen SECUREOPS en\n"
+ "RESTRICTED geforceerd worden op de gebruikers in het kanaal,\n"
+ "maar alleen als die opties aangezet zijn voor het kanaal. Als\n"
+ "SECUREOPS of RESTRICTED wordt gegeven voor \037wat\037 zal die optie\n"
+ "altijd geforceerd worden, ook als die niet is aangezet.",
+ /* LNG_CHAN_HELP_ENFORCE_R_ENABLED */
+ "Als er voor \037wat\037 MODES wordt ingevuld, zal kanaalmode +R worden\n"
+ "geforceerd, als die op het kanaal aan staat. Als +R wordt ingevuld,\n"
+ "zal kanaalmode +R worden geforceerd, maar ook als die niet aan"
+ "staat voor het kanaal. Als +R niet aan staat, zullen alle ook\n"
+ "gebanned worden om te zorgen dat ze niet opnieuw het kanaal binnen\n"
+ "kunnen komen.",
+ /* LNG_CHAN_HELP_ENFORCE_R_DISABLED */
+ "Als er voor \037wat\037 MODES wordt ingevuld, zal er niks gebeuren.\n"
+ "Normaal gesproken wordt er een kanaalmode geforceerd die op deze\n"
+ "server niet ondersteund wordt. Als +R wordt ingevuld voor \037wat\037\n"
+ "zullen alle gebruikers die in het kanaal zitten maar zich niet\n"
+ "hebben geidentificeerd voor hun nick uit het kanaal gekicked en\n"
+ "verbannen worden.",
+ /* LNG_CHAN_RESPONSE */
+ "Enforced %s"
+ };
+
+ /* German (DE) */
+ char *langtable_de[] = {
+ /* LNG_CHAN_HELP */
+ " ENFORCE Erzwingt verschieden Modes und SET Optionen",
+ /* LNG_ENFORCE_SYNTAX */
+ "Syntax: \002ENFORCE \037Channel\037 [\037was\037]\002",
+ /* LNG_CHAN_HELP_ENFORCE */
+ "Erzwingt verschieden Modes und SET Optionen. Die \037Channel\037\n"
+ "Option zeigt dir den Channel an, indem Modes und Optionen\n"
+ "zu erzwingen sind. Die \037was\037 Option zeigt dir welche Modes\n"
+ "und Optionen zu erzwingen sind. Die können nur SET, SECUREOPS,\n"
+ "RESTRICTED, MODES oder +R sein.Default ist SET.\n"
+ " \n"
+ "Wenn \037was\037 SET ist, wird SECUREOPS und RESTRICTED\n"
+ "auf die User die z.Z.in Channel sind erzwungen, wenn sie AN sind.\n"
+ "Benutze SECUREOPS oder RESTRICTED , um die Optionen einzeln\n"
+ "zu erzwingen, also wenn sie nicht eingeschaltet sind.",
+ /* LNG_CHAN_HELP_ENFORCE_R_ENABLED */
+ "Wenn \037was\037 MODES ist, wird das ChannelMode +R erzwungen\n"
+ "falls an. Wenn \037was\037 +R ist, wird +R erzwungen aber eben\n"
+ "wenn noch nicht als Channel-Mode ist. Wenn +R noch nicht als\n"
+ "Channel-Mode war werden alle User aus den Channel gebannt um\n"
+ "sicher zu sein das sie nicht rejoinen.",
+ /* LNG_CHAN_HELP_ENFORCE_R_DISABLED */
+ "Wenn \037was\037 MODES ist, wird nichts erzwungen weil es MODES seine\n"
+ "können die dein IRCD nicht unterstützt. Wenn \037was\037 +R ist\n"
+ "oder ein Modes was auf ein anderen IRCD gleich +R ist, wird es\n"
+ "erzwungen. Alle User die nicht für deren Nicknamen identifiziert\n"
+ "sind werden aus den Channel gekickt und gebannt.",
+ /* LNG_CHAN_RESPONSE */
+ "Erzwungen %s"
+ };
+
+ /* Portuguese (PT) */
+ char *langtable_pt[] = {
+ /* LNG_CHAN_HELP */
+ " ENFORCE Verifica o cumprimento de vários modos de canal e opções ajustadas",
+ /* LNG_ENFORCE_SYNTAX */
+ "Sintaxe: \002ENFORCE \037canal\037 [\037opção\037]\002",
+ /* LNG_CHAN_HELP_ENFORCE */
+ "Verifica o cumprimento de vários modos de canal e opções ajustadas.\n"
+ "O campo \037canal\037 indica qual canal deve ter os modos e opções verificadas\n"
+ "O campo \037opção\037 indica quais modos e opções devem ser verificadas,\n"
+ "e pode ser: SET, SECUREOPS, RESTRICTED, MODES ou +R\n"
+ "Quando deixado em branco, o padrão é SET.\n"
+ " \n"
+ "Se \037opção\037 for SET, serão verificadas as opções SECUREOPS e RESTRICTED\n"
+ "para usuários que estiverem no canal, caso elas estejam ativadas. Use\n"
+ "SECUREOPS para verificar a opção SECUREOPS, mesmo que ela não esteja ativada\n"
+ "Use RESTRICTED para verificar a opção RESTRICTED, mesmo que ela não esteja\n"
+ "ativada.",
+ /* LNG_CHAN_HELP_ENFORCE_R_ENABLED */
+ "Se \037opção\037 for MODES, será verificado o modo de canal +R caso ele\n"
+ "esteja ativado. Se +R for especificado para \037opção\037, o modo de canal\n"
+ "+R também será verificado, mesmo que ele não esteja ativado. Se ele não\n"
+ "estiver ativado, os usuários serão banidos para evitar que reentrem no canal.",
+ /* LNG_CHAN_HELP_ENFORCE_R_DISABLED */
+ "Se \037opção\037 for MODES, nada será verificado, visto que isto poderia\n"
+ "verificar modos que o IRCd atual não suporta. Se +R for especificado\n"
+ "para \037opção\037, um equivalente ao modo de canal +R em outros IRCds\n"
+ "será verificado. Todos os usuários que estão no canal, mas não estejam\n"
+ "identificados para seus nicks serão kickados e banidos do canal.",
+ /* LNG_CHAN_RESPONSE */
+ "Verificado %s"
+ };
+
+ /* Russian (RU) */
+ char *langtable_ru[] = {
+ /* LNG_CHAN_HELP */
+ " ENFORCE Ïåðåïðîâåðêà è óñòàíîâêà ðàçëè÷íûõ ðåæèìîâ è îïöèé êàíàëà",
+ /* LNG_ENFORCE_SYNTAX */
+ "Ñèíòàêñèñ: \002ENFORCE \037#êàíàë\037 \037ïàðàìåòð\037\002",
+ /* LNG_CHAN_HELP_ENFORCE */
+ "Ïåðåïðîâåðêà è óñòàíîâêà ðàçëè÷íûõ ðåæèìîâ è îïöèé êàíàëà.\n"
+ "\037Ïàðàìåòð\037 óêàçûâàåò êàêèå îïöèè èëè ðåæèìû êàíàëà äîëæíû áûòü\n"
+ "ïåðåïðîâåðåíû.  êà÷åñòâå ïàðàìåòðà ìîãóò áûòü óêàçàíû: SET, SECUREOPS,\n"
+ "RESTRICTED, MODES, èëè +R. Åñëè ïàðàìåòð íå óêàçàí, ïî-óìîë÷àíèþ áóäåò SET.\n"
+ " \n"
+ "Åñëè â êà÷åñòâå \037ïàðàìåòðà\037 óêàçàíî SET, áóäóò ïåðåïðîâåðåíû îïöèè\n"
+ "SECUREOPS è RESTRICTED îòíîñèòåëüíî ïîëüçîâàòåëåé íà óêàçàííîì êàíàëå\n"
+ "(ïðè óñëîâèè, ÷òî îïöèè âêëþ÷åíû). Îòäåëüíî óêàçàííûé ïàðàìåòð SECUREOPS\n"
+ "ïðèìåíèò îïöèþ SECUREOPS (äàæå åñëè îíà \037ÍÅ\037 óñòàíîâëåíà). Ïàðàìåòð\n"
+ "RESTRICTED ïðèìåíèò îïöèþ RESTRICTED (äàæå åñëè îíà \037ÍÅ\037 óñòàíîâëåíà)",
+ /* LNG_CHAN_HELP_ENFORCE_R_ENABLED */
+ "Åñëè â êà÷åñòâå \037ïàðàìåòðà\037 óêàçàíî MODES, áóäåò ïåðåïðîâåðåí ðåæèì +R\n"
+ "(åñëè îí óñòàíîâëåí). Îòäåëüíî óêàçàííûé ïàðàìåòð \037+R\037 ïðèìåíèò\n"
+ "êàíàëüíûé ðåæèì +R, äàæå åñëè îí íå óñòàíîâëåí, è çàáàíèò âñåõ ïîëüçîâàòåëåé,\n"
+ "êîòîðûå íå èäåíòèôèöèðîâàëèñü ê ñâîåìó íèêó èëè íå èìåþò çàðåãèñòðèðîâàííîãî íèêà.",
+ /* LNG_CHAN_HELP_ENFORCE_R_DISABLED */
+ "Åñëè â êà÷åñòâå \037ïàðàìåòðà\037 óêàçàíî MODES, ïåðåïðîâåðêà îñóùåñòâëåíà\n"
+ "ÍÅ ÁÓÄÅÒ, òàê êàê òåêóùèé IRCD íå ïîääåðæèâàåò íåîáõîäèìûå ðåæèìû.\n"
+ "Îòäåëüíî óêàçàííûé ïàðàìåòð \037+R\037 ïðèìåíèò êàíàëüíûé ðåæèì, ýêâèâàëåíòíûé\n"
+ "ðåæèìó +R è çàáàíèò âñåõ ïîëüçîâàòåëåé, êîòîðûå íå èäåíòèôèöèðîâàëèñü ê ñâîåìó\n"
+ "íèêó èëè íå èìåþò çàðåãèñòðèðîâàííîãî íèêà.",
+ /* LNG_CHAN_RESPONSE */
+ "Ïåðåïðîâåðåíî: %s"
+ };
+
+ /* Italian (IT) */
+ char *langtable_it[] = {
+ /* LNG_CHAN_HELP */
+ " ENFORCE Forza diversi modi di canale ed opzioni SET",
+ /* LNG_ENFORCE_SYNTAX */
+ "Sintassi: \002ENFORCE \037canale\037 [\037cosa\037]\002",
+ /* LNG_CHAN_HELP_ENFORCE */
+ "Forza diversi modi di canale ed opzioni SET. Il parametro \037canale\037\n"
+ "indica il canale sul quale forzare i modi e le opzioni. Il parametro\n"
+ "\037cosa\037 indica i modi e le opzioni da forzare, e possono essere\n"
+ "qualsiasi delle opzioni SET, SECUREOPS, RESTRICTED, MODES, o +R.\n"
+ "Se non specificato, viene sottointeso SET.\n"
+ " \n"
+ "Se \037cosa\037 è SET, forzerà SECUREOPS e RESTRICTED sugli utenti\n"
+ "attualmente nel canale, se sono impostati. Specifica SECUREOPS per\n"
+ "forzare l'opzione SECUREOPS, anche se non è attivata. Specifica\n"
+ "RESTRICTED per forzare l'opzione RESTRICTED, anche se non è\n"
+ "attivata.",
+ /* LNG_CHAN_HELP_ENFORCE_R_ENABLED */
+ "Se \037cosa\037 è MODES, forzerà il modo del canale +R se è impostato.\n"
+ "Se +R è specificato per \037cosa\037, il modo del canale +R verrà\n"
+ "forzato, anche se non è impostato. Se non è impostato, gli utenti\n"
+ "verranno bannati per assicurare che non rientrino semplicemente.",
+ /* LNG_CHAN_HELP_ENFORCE_R_DISABLED */
+ "Se \037cosa\037 è MODES, niente verrà forzato, siccome forzerebbe\n"
+ "dei modi che l'ircd in uso non supporterebbe. Se +R è specificato\n"
+ "per \037cosa\037, un modo equivalente a +R sui altri ircd verrà\n"
+ "forzato. Tutti gli utenti presenti nel canale ma non identificati\n"
+ "per il loro nickname verranno bannati ed espulsi dal canale.\n",
+ /* LNG_CHAN_RESPONSE */
+ "Forzato %s"
+ };
+
+ moduleInsertLanguage(LANG_EN_US, LNG_NUM_STRINGS, langtable_en_us);
+ moduleInsertLanguage(LANG_NL, LNG_NUM_STRINGS, langtable_nl);
+ moduleInsertLanguage(LANG_DE, LNG_NUM_STRINGS, langtable_de);
+ moduleInsertLanguage(LANG_PT, LNG_NUM_STRINGS, langtable_pt);
+ moduleInsertLanguage(LANG_RU, LNG_NUM_STRINGS, langtable_ru);
+ moduleInsertLanguage(LANG_IT, LNG_NUM_STRINGS, langtable_it);
+}
+
+/* EOF */
diff --git a/src/modules/cs_tban.c b/src/modules/cs_tban.c
new file mode 100644
index 000000000..9558c92fd
--- /dev/null
+++ b/src/modules/cs_tban.c
@@ -0,0 +1,253 @@
+/* cs_tban.c - Bans the user for a given length of time
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Based on the original module by Rob <rob@anope.org>
+ * Included in the Anope module pack since Anope 1.7.8
+ * Anope Coder: Rob <rob@anope.org>
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Send bug reports to the Anope Coder instead of the module
+ * author, because any changes since the inclusion into anope
+ * are not supported by the original author.
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+#define AUTHOR "Rob"
+#define VERSION "$Id$"
+
+void myHelp(User * u);
+void myFullHelpSyntax(User * u);
+int myFullHelp(User * u);
+void mySendResponse(User * u, char *channel, char *mask, char *time);
+
+int do_tban(User * u);
+void addBan(Channel * c, time_t timeout, char *banmask);
+int delBan(int argc, char **argv);
+int canBanUser(Channel * c, User * u, User * u2);
+
+void mAddLanguages(void);
+
+#define LANG_NUM_STRINGS 4
+#define TBAN_HELP 0
+#define TBAN_SYNTAX 1
+#define TBAN_HELP_DETAIL 2
+#define TBAN_RESPONSE 3
+
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+ int status = 0;
+
+ moduleSetChanHelp(myHelp);
+ c = createCommand("TBAN", do_tban, NULL, -1, -1, -1, -1, -1);
+ moduleAddHelp(c, myFullHelp);
+ status = moduleAddCommand(CHANSERV, c, MOD_HEAD);
+
+ mAddLanguages();
+
+ moduleAddAuthor(AUTHOR);
+ moduleAddVersion(VERSION);
+ moduleSetType(SUPPORTED);
+
+ if (status != MOD_ERR_OK) {
+ return MOD_STOP;
+ }
+ return MOD_CONT;
+}
+
+void AnopeFini(void)
+{
+ /* module is unloading */
+}
+
+void myHelp(User * u)
+{
+ moduleNoticeLang(s_ChanServ, u, TBAN_HELP);
+}
+
+void myFullHelpSyntax(User * u)
+{
+ moduleNoticeLang(s_ChanServ, u, TBAN_SYNTAX);
+}
+
+int myFullHelp(User * u)
+{
+ myFullHelpSyntax(u);
+ notice(s_ChanServ, u->nick, "");
+ moduleNoticeLang(s_ChanServ, u, TBAN_HELP_DETAIL);
+ return MOD_CONT;
+}
+
+void mySendResponse(User * u, char *channel, char *mask, char *time)
+{
+ moduleNoticeLang(s_ChanServ, u, TBAN_RESPONSE, mask, channel, time);
+}
+
+int do_tban(User * u)
+{
+ char mask[BUFSIZE];
+ Channel *c;
+ User *u2 = NULL;
+
+ char *buffer = moduleGetLastBuffer();
+ char *chan;
+ char *nick;
+ char *time;
+
+ chan = myStrGetToken(buffer, ' ', 0);
+ nick = myStrGetToken(buffer, ' ', 1);
+ time = myStrGetToken(buffer, ' ', 2);
+
+ if (time && chan && nick) {
+
+ if (!(c = findchan(chan))) {
+ notice_lang(s_ChanServ, u, CHAN_X_NOT_IN_USE, chan);
+ } else if (!(u2 = finduser(nick))) {
+ notice_lang(s_ChanServ, u, NICK_X_NOT_IN_USE, nick);
+ } else {
+ if (canBanUser(c, u, u2)) {
+ get_idealban(c->ci, u2, mask, sizeof(mask));
+ addBan(c, dotime(time), mask);
+ mySendResponse(u, chan, mask, time);
+ }
+ }
+ } else {
+ myFullHelpSyntax(u);
+ }
+ if (time)
+ free(time);
+ if (nick)
+ free(nick);
+ if (chan)
+ free(chan);
+
+ return MOD_CONT;
+}
+
+void addBan(Channel * c, time_t timeout, char *banmask)
+{
+ char *av[3];
+ char *cb[2];
+
+ cb[0] = c->name;
+ cb[1] = banmask;
+
+ av[0] = sstrdup("+b");
+ av[1] = banmask;
+
+ anope_cmd_mode(whosends(c->ci), c->name, "+b %s", av[1]);
+ chan_set_modes(s_ChanServ, c, 2, av, 1);
+
+ free(av[0]);
+ moduleAddCallback("tban", time(NULL) + timeout, delBan, 2, cb);
+}
+
+int delBan(int argc, char **argv)
+{
+ char *av[3];
+ Channel *c;
+
+ av[0] = sstrdup("-b");
+ av[1] = argv[1];
+
+ if ((c = findchan(argv[0])) && c->ci) {
+ anope_cmd_mode(whosends(c->ci), c->name, "-b %s", av[1]);
+ chan_set_modes(s_ChanServ, c, 2, av, 1);
+ }
+
+ free(av[0]);
+
+ return MOD_CONT;
+}
+
+int canBanUser(Channel * c, User * u, User * u2)
+{
+ ChannelInfo *ci;
+ int ok = 0;
+ 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, c->name);
+ } else if (!check_access(u, ci, CA_BAN)) {
+ notice_lang(s_ChanServ, u, ACCESS_DENIED);
+ } else if (ircd->except && is_excepted(ci, u2)) {
+ notice_lang(s_ChanServ, u, CHAN_EXCEPTED, u2->nick, ci->name);
+ } else if (ircd->protectedumode && is_protected(u2)) {
+ notice_lang(s_ChanServ, u, PERMISSION_DENIED);
+ } else {
+ ok = 1;
+ }
+
+ return ok;
+}
+
+
+void mAddLanguages(void)
+{
+ char *langtable_en_us[] = {
+ " TBAN Bans the user for a given length of time",
+ "Syntax: TBAN channel nick time",
+ "Bans the given user from a channel for a specified length of\n"
+ "time. If the ban is removed before by hand, it will NOT be replaced.",
+ "%s banned from %s, will auto-expire in %s"
+ };
+
+ char *langtable_nl[] = {
+ " TBAN Verban een gebruiker voor een bepaalde tijd",
+ "Syntax: TBAN kanaal nick tijd",
+ "Verbant de gegeven gebruiken van het gegeven kanaal voor de\n"
+ "gegeven tijdsduur. Als de verbanning eerder wordt verwijderd,\n"
+ "zal deze NIET worden vervangen.",
+ "%s verbannen van %s, zal verlopen in %s"
+ };
+
+ char *langtable_de[] = {
+ " TBAN Bant ein User für eine bestimmte Zeit aus ein Channel",
+ "Syntax: TBAN Channel Nickname Zeit",
+ "Bant ein User für eine bestimmte Zeit aus ein Channel\n"
+ "Wenn der Ban manuell entfernt wird, wird es NICHT ersetzt.",
+ "%s gebannt von %s, wird auto-auslaufen in %s"
+ };
+
+ char *langtable_pt[] = {
+ " TBAN Bane o usuário por um determinado período de tempo",
+ "Sintaxe: TBAN canal nick tempo",
+ "Bane de um canal o usuário especificado por um determinado período de\n"
+ "tempo. Se o ban for removido manualmente antes do tempo, ele não será recolocado.",
+ "%s foi banido do %s, irá auto-expirar em %s"
+ };
+
+ char *langtable_ru[] = {
+ " TBAN Áàíèò ïîëüçîâàòåëÿ íà óêàçàííûé ïðîìåæóòîê âðåìåíè",
+ "Ñèíòàêñèñ: TBAN #êàíàë íèê âðåìÿ",
+ "Áàíèò ïîëüçîâàòåëÿ íà óêàçàííûé ïðîìåæóòîê âðåìåíè â ñåêóíäàõ\n"
+ "Ïðèìå÷àíèå: óäàëåííûé âðó÷íóþ (äî ñâîåãî èñòå÷åíèÿ) áàí ÍÅ ÁÓÄÅÒ\n"
+ "ïåðåóñòàíîâëåí ñåðâèñàìè àâòîìàòè÷åñêè!",
+ "Óñòàíîâëåííûé áàí %s íà êàíàëå %s èñòå÷åò ÷åðåç %s ñåêóíä"
+ };
+
+ char *langtable_it[] = {
+ " TBAN Banna l'utente per un periodo di tempo specificato",
+ "Sintassi: TBAN canale nick tempo",
+ "Banna l'utente specificato da un canale per un periodo di tempo\n"
+ "specificato. Se il ban viene rimosso a mano prima della scadenza, NON verrà rimpiazzato.",
+ "%s bannato da %s, scadrà automaticamente tra %s"
+ };
+
+ moduleInsertLanguage(LANG_EN_US, LANG_NUM_STRINGS, langtable_en_us);
+ moduleInsertLanguage(LANG_NL, LANG_NUM_STRINGS, langtable_nl);
+ moduleInsertLanguage(LANG_DE, LANG_NUM_STRINGS, langtable_de);
+ moduleInsertLanguage(LANG_PT, LANG_NUM_STRINGS, langtable_pt);
+ moduleInsertLanguage(LANG_RU, LANG_NUM_STRINGS, langtable_ru);
+ moduleInsertLanguage(LANG_IT, LANG_NUM_STRINGS, langtable_it);
+
+}
+
+
+/* EOF */
diff --git a/src/modules/demos/catserv/Makefile b/src/modules/demos/catserv/Makefile
new file mode 100644
index 000000000..5b2f4efa3
--- /dev/null
+++ b/src/modules/demos/catserv/Makefile
@@ -0,0 +1,9 @@
+SRCS= ircd_catserv.c \
+ catserv_messages.c \
+ meow.c \
+ purr.c
+
+TARGET=ircd_catserv
+
+include ../Makefile.sub
+
diff --git a/src/modules/demos/catserv/README b/src/modules/demos/catserv/README
new file mode 100644
index 000000000..c3d3f7084
--- /dev/null
+++ b/src/modules/demos/catserv/README
@@ -0,0 +1,4 @@
+This is an EXAMPLE module, it serves no real purpose.
+
+This module was broken down into multiple files to demonstrate how multiple files can be used.
+
diff --git a/src/modules/demos/catserv/catserv_extern.h b/src/modules/demos/catserv/catserv_extern.h
new file mode 100644
index 000000000..02c21addb
--- /dev/null
+++ b/src/modules/demos/catserv/catserv_extern.h
@@ -0,0 +1,11 @@
+#ifndef CATSERV_DEFS_H
+#define CATSERV_DEFS_H
+
+#ifdef _WIN32
+extern __declspec(dllexport) char *s_CatServ;
+#else
+E char *s_CatServ;
+#endif
+
+#endif
+
diff --git a/src/modules/demos/catserv/catserv_messages.c b/src/modules/demos/catserv/catserv_messages.c
new file mode 100644
index 000000000..e11235b4e
--- /dev/null
+++ b/src/modules/demos/catserv/catserv_messages.c
@@ -0,0 +1,14 @@
+#include "catserv_messages.h"
+#include "module.h"
+#include "meow.h"
+#include "purr.h"
+
+void addMessageList(void)
+{
+ Command *c;
+ c = createCommand("meow", do_meow, NULL, -1, -1, -1, -1, -1);
+ moduleAddCommand(Catserv_cmdTable, c, MOD_UNIQUE);
+ c = createCommand("purr", do_purr, NULL, -1, -1, -1, -1, -1);
+ moduleAddCommand(Catserv_cmdTable, c, MOD_UNIQUE);
+}
+
diff --git a/src/modules/demos/catserv/catserv_messages.h b/src/modules/demos/catserv/catserv_messages.h
new file mode 100644
index 000000000..bb3f82dd0
--- /dev/null
+++ b/src/modules/demos/catserv/catserv_messages.h
@@ -0,0 +1,10 @@
+#ifndef CATSERV_MESSAGES_H
+#define CATSERV_MESSAGES_H
+
+#include "module.h"
+
+CommandHash *Catserv_cmdTable[MAX_CMD_HASH];
+void addMessageList(void);
+
+#endif
+
diff --git a/src/modules/demos/catserv/ircd_catserv.c b/src/modules/demos/catserv/ircd_catserv.c
new file mode 100644
index 000000000..ae34d6161
--- /dev/null
+++ b/src/modules/demos/catserv/ircd_catserv.c
@@ -0,0 +1,112 @@
+/**
+ * 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"
+#include "catserv_messages.h"
+
+#define AUTHOR "Anope"
+#define VERSION "$Id$"
+
+int my_privmsg(char *source, int ac, char **av);
+
+void addClient(char *nick, char *realname);
+void delClient(void);
+void catserv(User * u, char *buf);
+
+char *s_CatServ = "CatServ";
+
+int AnopeInit(int argc, char **argv)
+{
+ Message *msg = NULL;
+ int status;
+#ifdef IRC_UNREAL32
+ if (UseTokens) {
+ msg = createMessage("!", my_privmsg);
+ } else {
+ msg = createMessage("PRIVMSG", my_privmsg);
+ }
+#else
+ msg = createMessage("PRIVMSG", my_privmsg);
+#endif
+ 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)
+{
+ anope_cmd_bot_nick(nick, "catserv", "meow.meow.land", realname, "+");
+}
+
+void delClient(void)
+{
+ anope_cmd_quit(s_CatServ, "QUIT :Module Unloaded!");
+}
+
+/*****************************************************************************/
+/* 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);
+ }
+}
+
diff --git a/src/modules/demos/catserv/makefile.win32 b/src/modules/demos/catserv/makefile.win32
new file mode 100644
index 000000000..638704440
--- /dev/null
+++ b/src/modules/demos/catserv/makefile.win32
@@ -0,0 +1,4 @@
+SRCS=ircd_catserv.c purr.c catserv_messages.c meow.c
+TARGET=ircd_catserv.dll
+
+include ..\Makefile.sub.win32
diff --git a/src/modules/demos/catserv/meow.c b/src/modules/demos/catserv/meow.c
new file mode 100644
index 000000000..9279eec0b
--- /dev/null
+++ b/src/modules/demos/catserv/meow.c
@@ -0,0 +1,9 @@
+#include "meow.h"
+
+#include "catserv_extern.h"
+
+int do_meow(User * u) {
+ notice(s_CatServ, u->nick, "MEOW!");
+ return MOD_STOP;
+}
+
diff --git a/src/modules/demos/catserv/meow.h b/src/modules/demos/catserv/meow.h
new file mode 100644
index 000000000..0f28673a0
--- /dev/null
+++ b/src/modules/demos/catserv/meow.h
@@ -0,0 +1,9 @@
+#ifndef CATSERV_MEOW_H
+#define CATSERV_MEOW_H
+
+#include "module.h"
+
+int do_meow(User * u);
+
+#endif
+
diff --git a/src/modules/demos/catserv/purr.c b/src/modules/demos/catserv/purr.c
new file mode 100644
index 000000000..5a39dc26e
--- /dev/null
+++ b/src/modules/demos/catserv/purr.c
@@ -0,0 +1,8 @@
+#include "purr.h"
+#include "catserv_extern.h"
+
+int do_purr(User * u)
+{
+ notice(s_CatServ, u->nick, "PURR!");
+ return MOD_STOP;
+}
diff --git a/src/modules/demos/catserv/purr.h b/src/modules/demos/catserv/purr.h
new file mode 100644
index 000000000..a92e421f6
--- /dev/null
+++ b/src/modules/demos/catserv/purr.h
@@ -0,0 +1,9 @@
+#ifndef CATSERV_PURR_H
+#define CATSERV_PURR_H
+
+#include "module.h"
+
+int do_purr(User * u);
+
+#endif
+
diff --git a/src/modules/demos/events.c b/src/modules/demos/events.c
new file mode 100644
index 000000000..dad0fd0e6
--- /dev/null
+++ b/src/modules/demos/events.c
@@ -0,0 +1,82 @@
+/**
+ * Simple module to show the usage of event messages and hooks
+ * 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 "$Id$"
+
+int my_nick(char *source, int ac, char **av);
+int my_save(int argc, char **argv);
+int do_moo(int argc, char **argv);
+
+int AnopeInit(int argc, char **argv)
+{
+ EvtMessage *msg = NULL;
+ EvtHook *hook = NULL;
+ int status;
+ msg = createEventHandler("NICK", my_nick);
+ status = moduleAddEventHandler(msg);
+
+ hook = createEventHook(EVENT_DB_SAVING, my_save);
+ status = moduleAddEventHook(hook);
+
+
+ hook = createEventHook(EVENT_BOT_FANTASY, do_moo);
+ status = moduleAddEventHook(hook);
+
+ moduleAddAuthor(AUTHOR);
+ moduleAddVersion(VERSION);
+ return MOD_CONT;
+}
+
+void AnopeFini(void)
+{
+ /* unloading */
+}
+
+int my_nick(char *source, int ac, char **av)
+{
+ alog("Internal Event - nick is %s",av[0]);
+ return MOD_CONT;
+}
+
+int my_save(int argc, char **argv)
+{
+ if(argc>=1) {
+ if (!stricmp(argv[0], EVENT_START)) {
+ alog("Saving the databases! has started");
+ } else {
+ alog("Saving the databases is complete");
+ }
+ }
+ return MOD_CONT;
+}
+
+/**
+ * command to be called when a EVENT_BOT_FANTASY event is recived.
+ * @param argc The paramater count for this event.
+ * @param argv[0] The cmd used.
+ * @param argv[1] The nick of the command user.
+ * @param argv[2] The channel name the command was used in.
+ * @param argv[3] The rest of the text after the command.
+ * @return MOD_CONT or MOD_STOP
+ **/
+int do_moo(int argc, char **argv) {
+ ChannelInfo *ci;
+ if(argc>=3) { /* We need at least 3 arguments */
+ if(stricmp(argv[0],"moo")==0) { /* is it meant for us? */
+ if((ci = cs_findchan(argv[2]))) { /* channel should always exist */
+ anope_cmd_privmsg(ci->bi->nick, ci->name, "%cACTION moo's at %s %c",1,argv[1],1);
+ return MOD_STOP; /* We've dealt with it, dont let others */
+ }
+ }
+ }
+ return MOD_CONT; /* guess it wasnt for us, pass it on */
+}
+
diff --git a/src/modules/demos/hs_conf.c b/src/modules/demos/hs_conf.c
new file mode 100644
index 000000000..45b4bb330
--- /dev/null
+++ b/src/modules/demos/hs_conf.c
@@ -0,0 +1,74 @@
+#include "module.h"
+
+#define AUTHOR "Anope"
+#define VERSION "1"
+
+/**
+ * Default setting to be used if no confing value is found
+ **/
+#define DEFAULT_SETTING "moo"
+
+int mShowSetting(User *u);
+int mReadConfig(int argc, char **argv);
+
+char *setting;
+
+int AnopeInit(int argc, char **argv) {
+ Command *c;
+ EvtHook *hook;
+ int status = 0;
+
+ setting = NULL;
+
+ mReadConfig(0,NULL);
+
+ c = createCommand("SHOW",mShowSetting,NULL,-1,-1,-1,-1,-1);
+ status = moduleAddCommand(HOSTSERV, c, MOD_HEAD);
+
+ hook = createEventHook(EVENT_RELOAD, mReadConfig);
+ status = moduleAddEventHook(hook);
+
+ if(status!=MOD_ERR_OK) {
+ return MOD_STOP;
+ }
+ return MOD_CONT;
+}
+
+/**
+ * free the globals when we close
+ **/
+void AnopeFini(void) {
+ if(setting)
+ free(setting);
+}
+
+/**
+ * Simple function to show the user the current config setting
+ **/
+int mShowSetting(User *u) {
+ notice(s_HostServ,u->nick,"Setting in use is [%s]",setting);
+ return MOD_CONT;
+}
+
+/**
+ * Load the config setting up, this will be called whenever
+ * the EVENT_RELOAD event is recived.
+ **/
+int mReadConfig(int argc, char **argv) {
+ char *tmp=NULL;
+ Directive d[] = {{"HSConfigSetting", {{PARAM_STRING, PARAM_RELOAD, &tmp}}}};
+ moduleGetConfigDirective(d);
+
+ if(setting) {
+ free(setting);
+ }
+ if(tmp) {
+ setting = tmp;
+ } else {
+ setting = sstrdup(DEFAULT_SETTING);
+ }
+ return MOD_CONT;
+}
+
+
+/* EOF */
diff --git a/src/modules/demos/hs_moo.c b/src/modules/demos/hs_moo.c
new file mode 100644
index 000000000..b65e83bb6
--- /dev/null
+++ b/src/modules/demos/hs_moo.c
@@ -0,0 +1,119 @@
+/**
+ * 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 "$Id$" /* 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 */
+ int status = 0; /* the status of our new 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 */
+
+ status = moduleAddCommand(HOSTSERV, c, MOD_HEAD); /* Add the command to the HOSTSERV cmd table */
+
+ /* Check if we have any argv's */
+ if(argc>0) {
+ /* we do, the first will be the nick of the person modload'ing us */
+ /* or NULL if we were auto-loaded */
+ if(argv[0]) {
+ alog("hs_moo was modloaded by: [%s]",argv[0]);
+ } else {
+ alog("hs_moo was automatically loaded by anope");
+ }
+ }
+ alog("hs_moo.so: Add Command 'moo' Status: %d",status); /* Log the command being added */
+
+ 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 */
+
+ if(status!=MOD_ERR_OK) {
+ return MOD_STOP;
+ }
+ 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;
+}
+
+void AnopeFini(void)
+{
+ /* module is unloading */
+}
+
+/***************************************************************************************************************************************/
+/* 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/src/modules/dummy/Makefile b/src/modules/dummy/Makefile
new file mode 100644
index 000000000..ec93af36d
--- /dev/null
+++ b/src/modules/dummy/Makefile
@@ -0,0 +1,6 @@
+all: DUMMY
+
+DUMMY:
+clean:
+distclean:
+install:
diff --git a/src/modules/hs_request.c b/src/modules/hs_request.c
new file mode 100644
index 000000000..dde94070c
--- /dev/null
+++ b/src/modules/hs_request.c
@@ -0,0 +1,986 @@
+/* hs_request.c - Add request and activate functionality to HostServ,
+ * along with adding +req as optional param to HostServ list.
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Based on the original module by Rob <rob@anope.org>
+ * Included in the Anope module pack since Anope 1.7.11
+ * Anope Coder: GeniusDex <geniusdex@anope.org>
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Send bug reports to the Anope Coder instead of the module
+ * author, because any changes since the inclusion into anope
+ * are not supported by the original author.
+ */
+
+#include "module.h"
+
+#define AUTHOR "Rob"
+#define VERSION "$Id$"
+
+/* Configuration variables */
+int HSRequestMemoUser = 0;
+int HSRequestMemoOper = 0;
+int HSRequestMemoSetters = 0;
+char *HSRequestDBName = NULL;
+
+#define HSREQ_DEFAULT_DBNAME "hs_request.db"
+
+/* Language defines */
+#define LNG_NUM_STRINGS 21
+
+#define LNG_REQUEST_SYNTAX 0
+#define LNG_REQUESTED 1
+#define LNG_REQUEST_WAIT 2
+#define LNG_REQUEST_MEMO 3
+#define LNG_ACTIVATE_SYNTAX 4
+#define LNG_ACTIVATED 5
+#define LNG_ACTIVATE_MEMO 6
+#define LNG_REJECT_SYNTAX 7
+#define LNG_REJECTED 8
+#define LNG_REJECT_MEMO 9
+#define LNG_REJECT_MEMO_REASON 10
+#define LNG_NO_REQUEST 11
+#define LNG_HELP 12
+#define LNG_HELP_SETTER 13
+#define LNG_HELP_REQUEST 14
+#define LNG_HELP_ACTIVATE 15
+#define LNG_HELP_ACTIVATE_MEMO 16
+#define LNG_HELP_REJECT 17
+#define LNG_HELP_REJECT_MEMO 18
+#define LNG_WAITING_SYNTAX 19
+#define LNG_HELP_WAITING 20
+
+int hs_do_request(User * u);
+int hs_do_activate(User * u);
+int hs_do_reject(User * u);
+int hs_do_list_out(User * u);
+
+int hs_help_request(User * u);
+int hs_help_activate(User * u);
+int hs_help_reject(User * u);
+int hs_help_waiting(User * u);
+void hs_help(User * u);
+
+void my_add_host_request(char *nick, char *vIdent, char *vhost,
+ char *creator, int32 tmp_time);
+int my_isvalidchar(const char c);
+void my_memo_lang(User * u, char *name, int z, int number, ...);
+void req_send_memos(User * u, char *vHost);
+void show_list(User * u);
+int hs_do_waiting(User * u);
+int ns_do_drop(User * u);
+
+void hsreq_save_db(void);
+void hsreq_load_db(void);
+int hsreqevt_db_saving(int argc, char **argv);
+int hsreqevt_db_backup(int argc, char **argv);
+
+void my_load_config(void);
+void my_add_languages(void);
+
+HostCore *hs_request_head;
+
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+ EvtHook *hook;
+
+ c = createCommand("request", hs_do_request, nick_identified, -1, -1,
+ -1, -1, -1);
+ moduleAddHelp(c, hs_help_request);
+ moduleAddCommand(HOSTSERV, c, MOD_HEAD);
+
+ c = createCommand("activate", hs_do_activate, is_host_setter, -1, -1,
+ -1, -1, -1);
+ moduleAddHelp(c, hs_help_activate);
+ moduleAddCommand(HOSTSERV, c, MOD_HEAD);
+
+ c = createCommand("reject", hs_do_reject, is_host_setter, -1, -1, -1,
+ -1, -1);
+ moduleAddHelp(c, hs_help_reject);
+ moduleAddCommand(HOSTSERV, c, MOD_HEAD);
+
+ c = createCommand("waiting", hs_do_waiting, is_host_setter, -1, -1, -1,
+ -1, -1);
+ moduleAddHelp(c, hs_help_waiting);
+ moduleAddCommand(HOSTSERV, c, MOD_HEAD);
+
+ c = createCommand("list", hs_do_list_out, is_services_oper, -1, -1, -1,
+ -1, -1);
+ moduleAddCommand(HOSTSERV, c, MOD_HEAD);
+
+ c = createCommand("drop", ns_do_drop, NULL, -1, -1, -1, -1, -1);
+ moduleAddCommand(NICKSERV, c, MOD_HEAD);
+
+ hook = createEventHook(EVENT_DB_SAVING, hsreqevt_db_saving);
+ moduleAddEventHook(hook);
+
+ hook = createEventHook(EVENT_DB_BACKUP, hsreqevt_db_backup);
+ moduleAddEventHook(hook);
+
+ moduleSetHostHelp(hs_help);
+ moduleAddAuthor(AUTHOR);
+ moduleAddVersion(VERSION);
+ moduleSetType(SUPPORTED);
+
+ my_load_config();
+ my_add_languages();
+ hs_request_head = NULL;
+
+ if (debug)
+ alog("[hs_request] Loading database...");
+ hsreq_load_db();
+ alog("hs_request loaded");
+ return MOD_CONT;
+}
+
+void AnopeFini(void)
+{
+ if (debug)
+ alog("[hs_request] Saving database...");
+ hsreq_save_db();
+
+ /* Clean up all open host requests */
+ while (hs_request_head)
+ hs_request_head = deleteHostCore(hs_request_head, NULL);
+
+ free(HSRequestDBName);
+ alog("hs_request un-loaded");
+}
+
+int hs_do_request(User * u)
+{
+ char *cur_buffer;
+ char *nick;
+ char *rawhostmask;
+ char hostmask[HOSTMAX];
+ NickAlias *na;
+ int32 tmp_time;
+ char *s;
+ char *vIdent = NULL;
+ time_t now = time(NULL);
+
+ cur_buffer = moduleGetLastBuffer();
+ nick = u->nick;
+ rawhostmask = myStrGetToken(cur_buffer, ' ', 0);
+
+ if (!nick || !rawhostmask) {
+ if (rawhostmask)
+ free(rawhostmask);
+ moduleNoticeLang(s_HostServ, u, LNG_REQUEST_SYNTAX);
+ 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) {
+ moduleNoticeLang(s_HostServ, u, LNG_REQUEST_SYNTAX);
+ free(vIdent);
+ return MOD_CONT;
+ }
+ if (strlen(vIdent) > USERMAX - 1) {
+ notice_lang(s_HostServ, u, HOST_SET_IDENTTOOLONG, USERMAX);
+ free(vIdent);
+ free(rawhostmask);
+ return MOD_CONT;
+ } else {
+ for (s = vIdent; *s; s++) {
+ if (!my_isvalidchar(*s)) {
+ notice_lang(s_HostServ, u, HOST_SET_IDENT_ERROR);
+ free(vIdent);
+ free(rawhostmask);
+ return MOD_CONT;
+ }
+ }
+ }
+ if (!ircd->vident) {
+ notice_lang(s_HostServ, u, HOST_NO_VIDENT);
+ free(vIdent);
+ free(rawhostmask);
+ return MOD_CONT;
+ }
+ }
+ if (strlen(rawhostmask) < HOSTMAX - 1) {
+ snprintf(hostmask, HOSTMAX, "%s", rawhostmask);
+ } else {
+ notice_lang(s_HostServ, u, HOST_SET_TOOLONG, HOSTMAX);
+ if (vIdent)
+ free(vIdent);
+ free(rawhostmask);
+ return MOD_CONT;
+ }
+
+ if (!isValidHost(hostmask, 3)) {
+ notice_lang(s_HostServ, u, HOST_SET_ERROR);
+ if (vIdent)
+ free(vIdent);
+ free(rawhostmask);
+ return MOD_CONT;
+ }
+
+ tmp_time = time(NULL);
+ if ((na = findnick(nick))) {
+ if (HSRequestMemoOper || HSRequestMemoSetters) {
+ if (MSSendDelay > 0 && u
+ && u->lastmemosend + MSSendDelay > now) {
+ moduleNoticeLang(s_HostServ, u, LNG_REQUEST_WAIT,
+ MSSendDelay);
+ u->lastmemosend = now;
+ if (vIdent)
+ free(vIdent);
+ free(rawhostmask);
+ return MOD_CONT;
+ }
+ }
+ my_add_host_request(nick, vIdent, hostmask, u->nick, tmp_time);
+
+ moduleNoticeLang(s_HostServ, u, LNG_REQUESTED);
+ req_send_memos(u, hostmask);
+ alog("New vHost Requested by %s", nick);
+ } else {
+ notice_lang(s_HostServ, u, HOST_NOREG, nick);
+ }
+
+ if (vIdent)
+ free(vIdent);
+ free(rawhostmask);
+
+ return MOD_CONT;
+}
+
+void my_memo_lang(User * u, char *name, int z, int number, ...)
+{
+ va_list va;
+ char buffer[4096], outbuf[4096];
+ char *fmt = NULL;
+ int lang = LANG_EN_US;
+ char *s, *t, *buf;
+ User *u2;
+
+ if ((mod_current_module_name)
+ && (!mod_current_module
+ || strcmp(mod_current_module_name, mod_current_module->name)))
+ mod_current_module = findModule(mod_current_module_name);
+
+ u2 = finduser(name);
+ /* Find the users lang, and use it if we cant */
+ if (u2 && u2->na && u2->na->nc)
+ lang = u2->na->nc->language;
+
+ /* If the users lang isnt supported, drop back to enlgish */
+ if (mod_current_module->lang[lang].argc == 0)
+ lang = LANG_EN_US;
+
+ /* If the requested lang string exists for the language */
+ if (mod_current_module->lang[lang].argc > number) {
+ fmt = mod_current_module->lang[lang].argv[number];
+
+ buf = sstrdup(fmt);
+ s = buf;
+ while (*s) {
+ t = s;
+ s += strcspn(s, "\n");
+ if (*s)
+ *s++ = '\0';
+ strscpy(outbuf, t, sizeof(outbuf));
+
+ va_start(va, number);
+ vsnprintf(buffer, 4095, outbuf, va);
+ va_end(va);
+ memo_send(u, name, buffer, z);
+ }
+ free(buf);
+ } else {
+ alog("%s: INVALID language string call, language: [%d], String [%d]", mod_current_module->name, lang, number);
+ }
+}
+
+
+void req_send_memos(User * u, char *vHost)
+{
+ int i;
+ int z = 2;
+
+ if (checkDefCon(DEFCON_NO_NEW_MEMOS))
+ return;
+
+ if (HSRequestMemoOper == 1) {
+ for (i = 0; i < servopers.count; i++) {
+ my_memo_lang(u, (((NickCore *) servopers.list[i])->display), z,
+ LNG_REQUEST_MEMO, vHost);
+ }
+ for (i = 0; i < servadmins.count; i++) {
+ my_memo_lang(u, (((NickCore *) servadmins.list[i])->display),
+ z, LNG_REQUEST_MEMO, vHost);
+ }
+ for (i = 0; i < RootNumber; i++) {
+ my_memo_lang(u, ServicesRoots[i], z, LNG_REQUEST_MEMO, vHost);
+ }
+ }
+ if (HSRequestMemoSetters == 1) {
+ for (i = 0; i < HostNumber; i++) {
+ my_memo_lang(u, HostSetters[i], z, LNG_REQUEST_MEMO, vHost);
+ }
+ }
+}
+
+int ns_do_drop(User * u)
+{
+ HostCore *tmp;
+ boolean found = false;
+ NickAlias *na;
+
+ na = findnick(u->nick);
+ tmp = findHostCore(hs_request_head, u->nick, &found);
+
+ if (found && na)
+ hs_request_head = deleteHostCore(hs_request_head, tmp);
+
+ return MOD_CONT;
+}
+
+int hs_do_reject(User * u)
+{
+ char *cur_buffer;
+ char *nick;
+ char *reason;
+ HostCore *tmp, *hc;
+ boolean found = false;
+
+ cur_buffer = moduleGetLastBuffer();
+ nick = myStrGetToken(cur_buffer, ' ', 0);
+ reason = myStrGetTokenRemainder(cur_buffer, ' ', 1);
+
+ if (!nick) {
+ moduleNoticeLang(s_HostServ, u, LNG_REJECT_SYNTAX);
+ if (reason)
+ free(reason);
+ return MOD_CONT;
+ }
+
+ tmp = findHostCore(hs_request_head, nick, &found);
+ if (found) {
+ if (!tmp)
+ hc = hs_request_head;
+ else
+ hc = tmp->next;
+
+ if (HSRequestMemoUser) {
+ if (reason)
+ my_memo_lang(u, hc->nick, 2, LNG_REJECT_MEMO_REASON,
+ reason);
+ else
+ my_memo_lang(u, hc->nick, 2, LNG_REJECT_MEMO);
+ }
+
+ hs_request_head = deleteHostCore(hs_request_head, tmp);
+ moduleNoticeLang(s_HostServ, u, LNG_REJECTED, nick);
+ alog("Host Request for %s rejected by %s (%s)", nick, u->nick,
+ reason ? reason : "");
+ } else {
+ moduleNoticeLang(s_HostServ, u, LNG_NO_REQUEST, nick);
+ }
+
+ free(nick);
+ if (reason)
+ free(reason);
+
+ return MOD_CONT;
+}
+
+int hs_do_activate(User * u)
+{
+ char *cur_buffer;
+ char *nick;
+ NickAlias *na;
+ HostCore *tmp, *hc;
+ boolean found = false;
+
+ cur_buffer = moduleGetLastBuffer();
+ nick = myStrGetToken(cur_buffer, ' ', 0);
+
+ if (!nick) {
+ moduleNoticeLang(s_HostServ, u, LNG_ACTIVATE_SYNTAX);
+ return MOD_CONT;
+ }
+
+ if ((na = findnick(nick))) {
+ tmp = findHostCore(hs_request_head, nick, &found);
+ if (found) {
+ if (!tmp)
+ hc = hs_request_head;
+ else
+ hc = tmp->next;
+
+ addHostCore(hc->nick, hc->vIdent, hc->vHost, u->nick,
+ time(NULL));
+
+ if (HSRequestMemoUser)
+ my_memo_lang(u, hc->nick, 2, LNG_ACTIVATE_MEMO);
+
+ hs_request_head = deleteHostCore(hs_request_head, tmp);
+ moduleNoticeLang(s_HostServ, u, LNG_ACTIVATED, nick);
+ alog("Host Request for %s activated by %s", nick, u->nick);
+ } else {
+ moduleNoticeLang(s_HostServ, u, LNG_NO_REQUEST, nick);
+ }
+ } else {
+ notice_lang(s_HostServ, u, NICK_X_NOT_REGISTERED, nick);
+ }
+
+ free(nick);
+ return MOD_CONT;
+}
+
+
+void my_add_host_request(char *nick, char *vIdent, char *vhost,
+ char *creator, int32 tmp_time)
+{
+ HostCore *tmp;
+ boolean found = false;
+
+ if (!hs_request_head) {
+ hs_request_head =
+ createHostCorelist(hs_request_head, nick, vIdent, vhost,
+ creator, tmp_time);
+ } else {
+ tmp = findHostCore(hs_request_head, nick, &found);
+ if (!found) {
+ hs_request_head =
+ insertHostCore(hs_request_head, tmp, nick, vIdent, vhost,
+ creator, tmp_time);
+ } else {
+ hs_request_head = deleteHostCore(hs_request_head, tmp); /* delete the old entry */
+ my_add_host_request(nick, vIdent, vhost, creator, tmp_time); /* recursive call to add new entry */
+ }
+ }
+}
+
+int my_isvalidchar(const char c)
+{
+ if (((c >= 'A') && (c <= 'Z')) || ((c >= 'a') && (c <= 'z'))
+ || ((c >= '0') && (c <= '9')) || (c == '.') || (c == '-'))
+ return 1;
+ else
+ return 0;
+}
+
+int hs_do_list_out(User * u)
+{
+ char *key;
+
+ key = moduleGetLastBuffer();
+ if (!key)
+ return MOD_CONT;
+
+ if (stricmp(key, "+req") != 0)
+ return MOD_CONT;
+
+ show_list(u);
+
+ return MOD_CONT;
+}
+
+int hs_do_waiting(User * u)
+{
+ show_list(u);
+
+ return MOD_CONT;
+}
+
+void show_list(User * u)
+{
+ struct tm *tm;
+ char buf[BUFSIZE];
+ int counter = 1;
+ int from = 0, to = 0;
+ int display_counter = 0;
+ HostCore *current;
+
+ current = hs_request_head;
+ while (current) {
+ 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;
+ }
+ notice_lang(s_HostServ, u, HOST_LIST_FOOTER, display_counter);
+}
+
+int hs_help_request(User * u)
+{
+ moduleNoticeLang(s_HostServ, u, LNG_REQUEST_SYNTAX);
+ notice(s_HostServ, u->nick, " ");
+ moduleNoticeLang(s_HostServ, u, LNG_HELP_REQUEST);
+
+ return MOD_CONT;
+}
+
+int hs_help_activate(User * u)
+{
+ if (is_host_setter(u)) {
+ moduleNoticeLang(s_HostServ, u, LNG_ACTIVATE_SYNTAX);
+ notice(s_HostServ, u->nick, " ");
+ moduleNoticeLang(s_HostServ, u, LNG_HELP_ACTIVATE);
+ if (HSRequestMemoUser)
+ moduleNoticeLang(s_HostServ, u, LNG_HELP_ACTIVATE_MEMO);
+ } else {
+ notice_lang(s_HostServ, u, NO_HELP_AVAILABLE, "ACTIVATE");
+ }
+
+ return MOD_CONT;
+}
+
+int hs_help_reject(User * u)
+{
+ if (is_host_setter(u)) {
+ moduleNoticeLang(s_HostServ, u, LNG_REJECT_SYNTAX);
+ notice(s_HostServ, u->nick, " ");
+ moduleNoticeLang(s_HostServ, u, LNG_HELP_REJECT);
+ if (HSRequestMemoUser)
+ moduleNoticeLang(s_HostServ, u, LNG_HELP_REJECT_MEMO);
+ } else {
+ notice_lang(s_HostServ, u, NO_HELP_AVAILABLE, "REJECT");
+ }
+
+ return MOD_CONT;
+}
+
+int hs_help_waiting(User * u)
+{
+ if (is_host_setter(u)) {
+ moduleNoticeLang(s_HostServ, u, LNG_WAITING_SYNTAX);
+ notice(s_HostServ, u->nick, " ");
+ moduleNoticeLang(s_HostServ, u, LNG_HELP_WAITING);
+ } else {
+ notice_lang(s_HostServ, u, NO_HELP_AVAILABLE, "WAITING");
+ }
+
+ return MOD_CONT;
+}
+
+void hs_help(User * u)
+{
+ moduleNoticeLang(s_HostServ, u, LNG_HELP);
+ if (is_host_setter(u))
+ moduleNoticeLang(s_HostServ, u, LNG_HELP_SETTER);
+}
+void hsreq_load_db(void)
+{
+ FILE *fp;
+ char *filename;
+ char readbuf[1024];
+ char *nick, *vident, *vhost, *creator, *tmp;
+ int32 tmp_time;
+ char *buf;
+
+ if (HSRequestDBName)
+ filename = HSRequestDBName;
+ else
+ filename = HSREQ_DEFAULT_DBNAME;
+
+ fp = fopen(filename, "r");
+ if (!fp) {
+ alog("[hs_request] Unable to open database ('%s') for reading",
+ filename);
+ return;
+ }
+
+ while (fgets(readbuf, 1024, fp)) {
+ buf = normalizeBuffer(readbuf);
+ if (buf || *buf) {
+ nick = myStrGetToken(buf, ':', 0);
+ vident = myStrGetToken(buf, ':', 1);
+ vhost = myStrGetToken(buf, ':', 2);
+ tmp = myStrGetToken(buf, ':', 3);
+ if (tmp) {
+ tmp_time = strtol(tmp, (char **) NULL, 16);
+ free(tmp);
+ } else {
+ tmp_time = 0;
+ }
+ creator = myStrGetToken(buf, ':', 4);
+ if (!nick || !vident || !vhost || !creator) {
+ alog("[hs_request] Error while reading database, skipping record");
+ continue;
+ }
+ if (stricmp(vident, "(null)") == 0) {
+ free(vident);
+ vident = NULL;
+ }
+ my_add_host_request(nick, vident, vhost, creator, tmp_time);
+ free(nick);
+ free(vhost);
+ free(creator);
+ if (vident)
+ free(vident);
+ }
+ free(buf);
+ }
+
+ fclose(fp);
+
+ if (debug)
+ alog("[hs_request] Succesfully loaded database");
+}
+
+void hsreq_save_db(void)
+{
+ FILE *fp;
+ char *filename;
+ char *vident;
+ HostCore *current;
+
+ if (HSRequestDBName)
+ filename = HSRequestDBName;
+ else
+ filename = HSREQ_DEFAULT_DBNAME;
+
+ fp = fopen(filename, "w");
+ if (!fp) {
+ alog("[hs_request] Unable to open database ('%s') for writing",
+ filename);
+ return;
+ }
+
+ current = hs_request_head;
+ while (current) {
+ vident = (current->vIdent ? current->vIdent : "(null)");
+ fprintf(fp, "%s:%s:%s:%X:%s\n", current->nick, vident,
+ current->vHost, (uint32) current->time, current->creator);
+ current = current->next;
+ }
+
+ fclose(fp);
+
+ if (debug)
+ alog("[hs_request] Succesfully saved database");
+}
+
+int hsreqevt_db_saving(int argc, char **argv)
+{
+ if ((argc >= 1) && (stricmp(argv[0], EVENT_START) == 0))
+ hsreq_save_db();
+
+ return MOD_CONT;
+}
+
+int hsreqevt_db_backup(int argc, char **argv)
+{
+ if ((argc >= 1) && (stricmp(argv[0], EVENT_START) == 0)) {
+ if (HSRequestDBName)
+ ModuleDatabaseBackup(HSRequestDBName);
+ else
+ ModuleDatabaseBackup(HSREQ_DEFAULT_DBNAME);
+ }
+
+ return MOD_CONT;
+}
+
+void my_load_config(void)
+{
+ int i;
+ char *tmp = NULL;
+
+ Directive confvalues[][1] = {
+ {{"HSRequestMemoUser",
+ {{PARAM_SET, PARAM_RELOAD, &HSRequestMemoUser}}}},
+ {{"HSRequestMemoOper",
+ {{PARAM_SET, PARAM_RELOAD, &HSRequestMemoOper}}}},
+ {{"HSRequestMemoSetters",
+ {{PARAM_SET, PARAM_RELOAD, &HSRequestMemoSetters}}}},
+ {{"HSRequestDBName", {{PARAM_STRING, PARAM_RELOAD, &tmp}}}}
+ };
+
+ for (i = 0; i < 4; i++)
+ moduleGetConfigDirective(confvalues[i]);
+
+ if (tmp) {
+ if (HSRequestDBName)
+ free(HSRequestDBName);
+ HSRequestDBName = sstrdup(tmp);
+ } else {
+ HSRequestDBName = sstrdup(HSREQ_DEFAULT_DBNAME);
+ }
+
+ if (debug)
+ alog("debug: [hs_request] Set config vars: MemoUser=%d MemoOper=%d MemoSetters=%d DBName='%s'", HSRequestMemoUser, HSRequestMemoOper, HSRequestMemoSetters, HSRequestDBName);
+}
+
+void my_add_languages(void)
+{
+ char *langtable_en_us[] = {
+ /* LNG_REQUEST_SYNTAX */
+ "Syntax: \002REQUEST \037vhost\037\002",
+ /* LNG_REQUESTED */
+ "Your vHost has been requested",
+ /* LNG_REQUEST_WAIT */
+ "Please wait %d seconds before requesting a new vHost",
+ /* LNG_REQUEST_MEMO */
+ "[auto memo] vHost \002%s\002 has been requested.",
+ /* LNG_ACTIVATE_SYNTAX */
+ "Syntax: \002ACTIVATE \037nick\037\002",
+ /* LNG_ACTIVATED */
+ "vHost for %s has been activated",
+ /* LNG_ACTIVATE_MEMO */
+ "[auto memo] Your requested vHost has been approved.",
+ /* LNG_REJECT_SYNTAX */
+ "Syntax: \002REJECT \037nick\037\002",
+ /* LNG_REJECTED */
+ "vHost for %s has been rejected",
+ /* LNG_REJECT_MEMO */
+ "[auto memo] Your requested vHost has been rejected.",
+ /* LNG_REJECT_MEMO_REASON */
+ "[auto memo] Your requested vHost has been rejected. Reason: %s",
+ /* LNG_NO_REQUEST */
+ "No request for nick %s found.",
+ /* LNG_HELP */
+ " REQUEST Request a vHost for your nick",
+ /* LNG_HELP_SETTER */
+ " ACTIVATE Approve the requested vHost of a user\n"
+ " REJECT Reject the requested vHost of a user\n"
+ " WAITING Convenience command for LIST +req",
+ /* LNG_HELP_REQUEST */
+ "Request the given vHost to be actived for your nick by the\n"
+ "network administrators. Please be patient while your request\n"
+ "is being considered.",
+ /* LNG_HELP_ACTIVATE */
+ "Activate the requested vHost for the given nick.",
+ /* LNG_HELP_ACTIVATE_MEMO */
+ "A memo informing the user will also be sent.",
+ /* LNG_HELP_REJECT */
+ "Reject the requested vHost for the given nick.",
+ /* LNG_HELP_REJECT_MEMO */
+ "A memo informing the user will also be sent.",
+ /* LNG_WAITING_SYNTAX */
+ "Syntax: \002WAITING\002",
+ /* LNG_HELP_WAITING */
+ "This command is provided for convenience. It is essentially\n"
+ "the same as performing a LIST +req ."
+ };
+
+ char *langtable_nl[] = {
+ /* LNG_REQUEST_SYNTAX */
+ "Gebruik: \002REQUEST \037vhost\037\002",
+ /* LNG_REQUESTED */
+ "Je vHost is aangevraagd",
+ /* LNG_REQUEST_WAIT */
+ "Wacht %d seconden voor je een nieuwe vHost aanvraagt",
+ /* LNG_REQUEST_MEMO */
+ "[auto memo] vHost \002%s\002 is aangevraagd.",
+ /* LNG_ACTIVATE_SYNTAX */
+ "Gebruik: \002ACTIVATE \037nick\037\002",
+ /* LNG_ACTIVATED */
+ "vHost voor %s is geactiveerd",
+ /* LNG_ACTIVATE_MEMO */
+ "[auto memo] Je aangevraagde vHost is geaccepteerd.",
+ /* LNG_REJECT_SYNTAX */
+ "Gebruik: \002REJECT \037nick\037\002",
+ /* LNG_REJECTED */
+ "vHost voor %s is afgekeurd",
+ /* LNG_REJECT_MEMO */
+ "[auto memo] Je aangevraagde vHost is afgekeurd.",
+ /* LNG_REJECT_MEMO_REASON */
+ "[auto memo] Je aangevraagde vHost is afgekeurd. Reden: %s",
+ /* LNG_NO_REQUEST */
+ "Geen aanvraag voor nick %s gevonden.",
+ /* LNG_HELP */
+ " REQUEST Vraag een vHost aan voor je nick",
+ /* LNG_HELP_SETTER */
+ " ACTIVATE Activeer de aangevraagde vHost voor een gebruiker\n"
+ " REJECT Keur de aangevraagde vHost voor een gebruiker af\n"
+ " WAITING Snelkoppeling naar LIST +req",
+ /* LNG_HELP_REQUEST */
+ "Verzoek de gegeven vHost te activeren voor jouw nick bij de\n"
+ "netwerk beheerders. Het kan even duren voordat je aanvraag\n"
+ "afgehandeld wordt.",
+ /* LNG_HELP_ACTIVATE */
+ "Activeer de aangevraagde vHost voor de gegeven nick.",
+ /* LNG_HELP_ACTIVATE_MEMO */
+ "Een memo die de gebruiker op de hoogste stelt zal ook worden verstuurd.",
+ /* LNG_HELP_REJECT */
+ "Keur de aangevraagde vHost voor de gegeven nick af.",
+ /* LNG_HELP_REJECT_MEMO */
+ "Een memo die de gebruiker op de hoogste stelt zal ook worden verstuurd.",
+ /* LNG_WAITING_SYNTAX */
+ "Gebruik: \002WAITING\002",
+ /* LNG_HELP_WAITING */
+ "Dit commando is beschikbaar als handigheid. Het is simpelweg\n"
+ "hetzelfde als LIST +req ."
+ };
+
+ char *langtable_pt[] = {
+ /* LNG_REQUEST_SYNTAX */
+ "Sintaxe: \002REQUEST \037vhost\037\002",
+ /* LNG_REQUESTED */
+ "Seu pedido de vHost foi encaminhado",
+ /* LNG_REQUEST_WAIT */
+ "Por favor, espere %d segundos antes de fazer um novo pedido de vHost",
+ /* LNG_REQUEST_MEMO */
+ "[Auto Memo] O vHost \002%s\002 foi solicitado.",
+ /* LNG_ACTIVATE_SYNTAX */
+ "Sintaxe: \002ACTIVATE \037nick\037\002",
+ /* LNG_ACTIVATED */
+ "O vHost para %s foi ativado",
+ /* LNG_ACTIVATE_MEMO */
+ "[Auto Memo] Seu pedido de vHost foi aprovado.",
+ /* LNG_REJECT_SYNTAX */
+ "Sintaxe: \002REJECT \037nick\037\002",
+ /* LNG_REJECTED */
+ "O vHost de %s foi recusado",
+ /* LNG_REJECT_MEMO */
+ "[Auto Memo] Seu pedido de vHost foi recusado.",
+ /* LNG_REJECT_MEMO_REASON */
+ "[Auto Memo] Seu pedido de vHost foi recusado. Motivo: %s",
+ /* LNG_NO_REQUEST */
+ "Nenhum pedido encontrado para o nick %s.",
+ /* LNG_HELP */
+ " REQUEST Request a vHost for your nick",
+ /* LNG_HELP_SETTER */
+ " ACTIVATE Aprova o pedido de vHost de um usuário\n"
+ " REJECT Recusa o pedido de vHost de um usuário\n"
+ " WAITING Comando para LISTAR +req",
+ /* LNG_HELP_REQUEST */
+ "Solicita a ativação do vHost fornecido em seu nick pelos\n"
+ "administradores da rede. Por favor, tenha paciência\n"
+ "enquanto seu pedido é analisado.",
+ /* LNG_HELP_ACTIVATE */
+ "Ativa o vHost solicitado para o nick fornecido.",
+ /* LNG_HELP_ACTIVATE_MEMO */
+ "Um memo informando o usuário também será enviado.",
+ /* LNG_HELP_REJECT */
+ "Recusa o pedido de vHost para o nick fornecido.",
+ /* LNG_HELP_REJECT_MEMO */
+ "Um memo informando o usuário também será enviado.",
+ /* LNG_WAITING_SYNTAX */
+ "Sintaxe: \002WAITING\002",
+ /* LNG_HELP_WAITING */
+ "Este comando é usado por conveniência. É essencialmente\n"
+ "o mesmo que fazer um LIST +req"
+ };
+
+ char *langtable_ru[] = {
+ /* LNG_REQUEST_SYNTAX */
+ "Ñèíòàêñèñ: \002REQUEST \037vHost\037\002",
+ /* LNG_REQUESTED */
+ "Âàø çàïðîñ íà vHost îòïðàâëåí.",
+ /* LNG_REQUEST_WAIT */
+ "Ïîæàëóéñòà, ïîäîæäèòå %d ñåêóíä, ïðåæäå ÷åì çàïðàøèâàòü íîâûé vHost",
+ /* LNG_REQUEST_MEMO */
+ "[àâòî-ñîîáùåíèå] Áûë çàïðîøåí vHost \002%s\002",
+ /* LNG_ACTIVATE_SYNTAX */
+ "Ñèíòàêñèñ: \002ACTIVATE \037íèê\037\002",
+ /* LNG_ACTIVATED */
+ "vHost äëÿ %s óñïåøíî àêòèâèðîâàí",
+ /* LNG_ACTIVATE_MEMO */
+ "[àâòî-ñîîáùåíèå] Çàïðàøèâàåìûé âàìè vHost óòâåðæäåí è àêòèâèðîâàí.",
+ /* LNG_REJECT_SYNTAX */
+ "Ñèíòàêñèñ: \002REJECT \037íèê\037\002",
+ /* LNG_REJECTED */
+ "vHost äëÿ %s îòêëîíåí.",
+ /* LNG_REJECT_MEMO */
+ "[àâòî-ñîîáùåíèå] Çàïðàøèâàåìûé âàìè vHost îòêëîíåí.",
+ /* LNG_REJECT_MEMO_REASON */
+ "[àâòî-ñîîáùåíèå] Çàïðàøèâàåìûé âàìè vHost îòêëîíåí. Ïðè÷èíà: %s",
+ /* LNG_NO_REQUEST */
+ "Çàïðîñ íà vHost äëÿ íèêà %s íå íàéäåí.",
+ /* LNG_HELP */
+ " REQUEST Çàïðîñ íà vHost äëÿ âàøåãî òåêóùåãî íèêà",
+ /* LNG_HELP_SETTER */
+ " ACTIVATE Óòâåðäèòü çàïðàøèâàåìûé ïîëüçîâàòåëåì vHost\n"
+ " REJECT Îòêëîíèòü çàïðàøèâàåìûé ïîëüçîâàòåëåì vHost\n"
+ " WAITING Ñïèñîê çàïðîñîâ îæèäàþùèõ îáðàáîòêè (àíàëîã LIST +req)",
+ /* LNG_HELP_REQUEST */
+ "Îòïðàâëÿåò çàïðîñ íà àêòèâàöèþ vHost, êîòîðûé áóäåò ðàññìîòðåí îäíèì èç\n"
+ "àäìèíèñòðàòîðîâ ñåòè. Ïðîñüáà ïðîÿâèòü òåðïåíèå, ïîêà çàïðîñ\n"
+ "ðàññìàòðèâàåòñÿ àäìèíèñòðàöèåé.",
+ /* LNG_HELP_ACTIVATE */
+ "Óòâåðäèòü çàïðàøèâàåìûé vHost äëÿ óêàçàííîãî íèêà.",
+ /* LNG_HELP_ACTIVATE_MEMO */
+ "Ïîëüçîâàòåëþ áóäåò ïîñëàíî àâòî-óâåäîìëåíèå îá àêòèâàöèè åãî çàïðîñà.",
+ /* LNG_HELP_REJECT */
+ "Îòêëîíèòü çàïðàøèâàåìûé vHost äëÿ óêàçàííîãî íèêà.",
+ /* LNG_HELP_REJECT_MEMO */
+ "Ïîëüçîâàòåëþ áóäåò ïîñëàíî àâòî-óâåäîìëåíèå îá îòêëîíåíèè åãî çàïðîñà.",
+ /* LNG_WAITING_SYNTAX */
+ "Ñèíòàêñèñ: \002WAITING\002",
+ /* LNG_HELP_WAITING */
+ "Äàííàÿ êîìàíäà ñîçäàíà äëÿ óäîáñòâà èñïîëüçîâàíèÿ è âûâîäèò ñïèñîê çàïðîñîâ,\n"
+ "îæèäàþùèõ îáðàáîòêè. Àíàëîãè÷íàÿ êîìàíäà: LIST +req ."
+ };
+
+ char *langtable_it[] = {
+ /* LNG_REQUEST_SYNTAX */
+ "Sintassi: \002REQUEST \037vhost\037\002",
+ /* LNG_REQUESTED */
+ "Il tuo vHost è stato richiesto",
+ /* LNG_REQUEST_WAIT */
+ "Prego attendere %d secondi prima di richiedere un nuovo vHost",
+ /* LNG_REQUEST_MEMO */
+ "[auto memo] è stato richiesto il vHost \002%s\002.",
+ /* LNG_ACTIVATE_SYNTAX */
+ "Sintassi: \002ACTIVATE \037nick\037\002",
+ /* LNG_ACTIVATED */
+ "Il vHost per %s è stato attivato",
+ /* LNG_ACTIVATE_MEMO */
+ "[auto memo] Il vHost da te richiesto è stato approvato.",
+ /* LNG_REJECT_SYNTAX */
+ "Sintassi: \002REJECT \037nick\037\002",
+ /* LNG_REJECTED */
+ "Il vHost per %s è stato rifiutato",
+ /* LNG_REJECT_MEMO */
+ "[auto memo] Il vHost da te richiesto è stato rifiutato.",
+ /* LNG_REJECT_MEMO_REASON */
+ "[auto memo] Il vHost da te richiesto è stato rifiutato. Motivo: %s",
+ /* LNG_NO_REQUEST */
+ "Nessuna richiesta trovata per il nick %s.",
+ /* LNG_HELP */
+ " REQUEST Richiede un vHost per il tuo nick",
+ /* LNG_HELP_SETTER */
+ " ACTIVATE Approva il vHost richiesto di un utente\n"
+ " REJECT Rifiuta il vHost richiesto di un utente\n"
+ " WAITING Comando per LIST +req",
+ /* LNG_HELP_REQUEST */
+ "Richiede l'attivazione del vHost specificato per il tuo nick da parte\n"
+ "degli amministratori di rete. Sei pregato di pazientare finchè la tua\n"
+ "richiesta viene elaborata.",
+ /* LNG_HELP_ACTIVATE */
+ "Attiva il vHost richiesto per il nick specificato.",
+ /* LNG_HELP_ACTIVATE_MEMO */
+ "Viene inviato un memo per informare l'utente.",
+ /* LNG_HELP_REJECT */
+ "Rifiuta il vHost richiesto per il nick specificato.",
+ /* LNG_HELP_REJECT_MEMO */
+ "Viene inviato un memo per informare l'utente.",
+ /* LNG_WAITING_SYNTAX */
+ "Sintassi: \002WAITING\002",
+ /* LNG_HELP_WAITING */
+ "Questo comando è per comodità. Praticamente è la stessa cosa che\n"
+ "eseguire un LIST +req ."
+ };
+ moduleInsertLanguage(LANG_EN_US, LNG_NUM_STRINGS, langtable_en_us);
+ moduleInsertLanguage(LANG_NL, LNG_NUM_STRINGS, langtable_nl);
+ moduleInsertLanguage(LANG_PT, LNG_NUM_STRINGS, langtable_pt);
+ moduleInsertLanguage(LANG_RU, LNG_NUM_STRINGS, langtable_ru);
+ moduleInsertLanguage(LANG_IT, LNG_NUM_STRINGS, langtable_it);
+}
+
+/* EOF */
diff --git a/src/modules/makefile.inc.win32 b/src/modules/makefile.inc.win32
new file mode 100644
index 000000000..f6a646329
--- /dev/null
+++ b/src/modules/makefile.inc.win32
@@ -0,0 +1,2 @@
+SRCS=cs_appendtopic.c cs_enforce.c cs_tban.c ns_maxemail.c hs_request.c os_info.c bs_fantasy_unban.c
+SUBS=test
diff --git a/src/modules/makefile.sub.win32 b/src/modules/makefile.sub.win32
new file mode 100644
index 000000000..4a811622e
--- /dev/null
+++ b/src/modules/makefile.sub.win32
@@ -0,0 +1,19 @@
+include ../../../Makefile.inc.win32
+
+OBJECTS= $(SRCS:.c=.obj)
+CFLAGS=/nologo /LD /MD /D MODULE_COMPILE $(CFLAGS) /I"../../../include" /I "../"
+LFLAGS=/nologo ../../anope.lib wsock32.lib $(LIBS) $(LFLAGS) $(MYSQL_LIB_PATH) /export:AnopeInit /export:AnopeFini /OUT:$(TARGET)
+
+all:
+ $(CC) $(SRCS) $(CFLAGS) ..\..\mod_version.c /link $(LFLAGS)
+
+distclean: clean spotless
+
+clean:
+ -@del *.obj
+
+spotless: clean
+ -@del *.dll *.lib *.exp *.manifest
+
+install:
+ -@copy *.dll ..\..\..\$(DATDEST)\modules
diff --git a/src/modules/makefile.win32 b/src/modules/makefile.win32
new file mode 100644
index 000000000..038ff25ba
--- /dev/null
+++ b/src/modules/makefile.win32
@@ -0,0 +1,41 @@
+include ../../Makefile.inc.win32
+include ./Makefile.inc.win32
+
+OBJECTS= $(SRCS:.c=.dll)
+CFLAGS=/LD /MD /D MODULE_COMPILE $(CFLAGS) /I"../../include"
+LFLAGS=/link ../anope.lib wsock32.lib $(LIBS) $(LFLAGS) $(MYSQL_LIB_PATH) /export:AnopeInit /export:AnopeFini
+
+all: $(OBJECTS) subs
+
+distclean: clean spotless
+
+.c.dll:
+ $(CC) $(CFLAGS) $(IRCTYPE) $< ..\mod_version.c $(LFLAGS)
+
+subs:
+ @for %i in ( $(SUBS) ); do \
+ @if exist %i; @cd %i && $(MAKE) $(MAKEARGS) && cd ..
+
+clean: subs-clean
+ -@del *.obj
+
+subs-clean:
+ @for %i in ( $(SUBS) ); do \
+ @if exist %i; @cd %i && $(MAKE) $(MAKEARGS) clean && cd ..
+
+spotless: clean subs-spotless
+ -@del *.dll *.lib *.exp *.manifest
+
+subs-spotless:
+ @for %i in ( $(SUBS) ); do \
+ @if exist %i; @cd %i && $(MAKE) $(MAKEARGS) spotless && cd ..
+
+install:
+ -@mkdir ..\..\$(DATDEST)\modules
+ -@mkdir ..\..\$(DATDEST)\modules\runtime
+ -@copy *.dll ..\..\$(DATDEST)\modules
+
+subs-install: install
+ @for %i in ( $(SUBS) ); do \
+ @if exist %i; @cd %i && $(MAKE) $(MAKEARGS) install && cd ..
+
diff --git a/src/modules/ns_maxemail.c b/src/modules/ns_maxemail.c
new file mode 100644
index 000000000..04747ff5a
--- /dev/null
+++ b/src/modules/ns_maxemail.c
@@ -0,0 +1,228 @@
+/* ns_maxemail.c - Limit the amount of times an email address
+ * can be used for a NickServ account.
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Included in the Anope module pack since Anope 1.7.9
+ * Anope Coder: GeniusDex <geniusdex@anope.org>
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Send any bug reports to the Anope Coder, as he will be able
+ * to deal with it best.
+ */
+
+#include "module.h"
+
+#define AUTHOR "Anope"
+#define VERSION "$Id$"
+
+void my_load_config(void);
+void my_add_languages(void);
+int my_ns_register(User * u);
+int my_ns_set(User * u);
+int my_event_reload(int argc, char **argv);
+
+int NSEmailMax = 0;
+
+#define LNG_NUM_STRINGS 2
+#define LNG_NSEMAILMAX_REACHED 0
+#define LNG_NSEMAILMAX_REACHED_ONE 1
+
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+ EvtHook *evt;
+ int status;
+
+ moduleAddAuthor(AUTHOR);
+ moduleAddVersion(VERSION);
+ moduleSetType(SUPPORTED);
+
+ c = createCommand("REGISTER", my_ns_register, NULL, -1, -1, -1, -1,
+ -1);
+ if ((status = moduleAddCommand(NICKSERV, c, MOD_HEAD))) {
+ alog("[ns_maxemail] Unable to create REGISTER command: %d",
+ status);
+ return MOD_STOP;
+ }
+
+ c = createCommand("SET", my_ns_set, NULL, -1, -1, -1, -1, -1);
+ if ((status = moduleAddCommand(NICKSERV, c, MOD_HEAD))) {
+ alog("[ns_maxemail] Unable to create SET command: %d", status);
+ return MOD_STOP;
+ }
+
+ evt = createEventHook(EVENT_RELOAD, my_event_reload);
+ if ((status = moduleAddEventHook(evt))) {
+ alog("[ns_maxemail] Unable to hook to EVENT_RELOAD: %d", status);
+ return MOD_STOP;
+ }
+
+ my_load_config();
+ my_add_languages();
+
+ return MOD_CONT;
+}
+
+void AnopeFini(void)
+{
+ /* Nothing to do while unloading */
+}
+
+int count_email_in_use(char *email, User * u)
+{
+ NickCore *nc;
+ int i;
+ int count = 0;
+
+ if (!email)
+ return 0;
+
+ for (i = 0; i < 1024; i++) {
+ for (nc = nclists[i]; nc; nc = nc->next) {
+ if (!(u->na && u->na->nc && (u->na->nc == nc)) && nc->email && (stricmp(nc->email, email) == 0))
+ count++;
+ }
+ }
+
+ return count;
+}
+
+int check_email_limit_reached(char *email, User * u)
+{
+ if ((NSEmailMax < 1) || !email || is_services_admin(u))
+ return MOD_CONT;
+
+ if (count_email_in_use(email, u) < NSEmailMax)
+ return MOD_CONT;
+
+ if (NSEmailMax == 1)
+ moduleNoticeLang(s_NickServ, u, LNG_NSEMAILMAX_REACHED_ONE);
+ else
+ moduleNoticeLang(s_NickServ, u, LNG_NSEMAILMAX_REACHED,
+ NSEmailMax);
+
+ return MOD_STOP;
+}
+
+int my_ns_register(User * u)
+{
+ char *cur_buffer;
+ char *email;
+ int ret;
+
+ cur_buffer = moduleGetLastBuffer();
+ email = myStrGetToken(cur_buffer, ' ', 1);
+ if (!email)
+ return MOD_CONT;
+
+ ret = check_email_limit_reached(email, u);
+ free(email);
+
+ return ret;
+}
+
+int my_ns_set(User * u)
+{
+ char *cur_buffer;
+ char *set;
+ char *email;
+ int ret;
+
+ cur_buffer = moduleGetLastBuffer();
+ set = myStrGetToken(cur_buffer, ' ', 0);
+
+ if (!set)
+ return MOD_CONT;
+
+ if (stricmp(set, "email") != 0) {
+ free(set);
+ return MOD_CONT;
+ }
+
+ free(set);
+ email = myStrGetToken(cur_buffer, ' ', 1);
+ if (!email)
+ return MOD_CONT;
+
+ ret = check_email_limit_reached(email, u);
+ free(email);
+
+ return ret;
+}
+
+int my_event_reload(int argc, char **argv)
+{
+ if ((argc > 0) && (stricmp(argv[0], EVENT_START) == 0))
+ my_load_config();
+
+ return MOD_CONT;
+}
+
+void my_load_config(void)
+{
+ Directive confvalues[] = {
+ {"NSEmailMax", {{PARAM_INT, PARAM_RELOAD, &NSEmailMax}}}
+ };
+
+ moduleGetConfigDirective(confvalues);
+
+ if (debug)
+ alog("debug: [ns_maxemail] NSEmailMax set to %d", NSEmailMax);
+}
+
+void my_add_languages(void)
+{
+ char *langtable_en_us[] = {
+ /* LNG_NSEMAILMAX_REACHED */
+ "The given email address has reached it's usage limit of %d users.",
+ /* LNG_NSEMAILMAX_REACHED_ONE */
+ "The given email address has reached it's usage limit of 1 user."
+ };
+
+ char *langtable_nl[] = {
+ /* LNG_NSEMAILMAX_REACHED */
+ "Het gegeven email adres heeft de limiet van %d gebruikers bereikt.",
+ /* LNG_NSEMAILMAX_REACHED_ONE */
+ "Het gegeven email adres heeft de limiet van 1 gebruiker bereikt."
+ };
+
+ char *langtable_de[] = {
+ /* LNG_NSEMAILMAX_REACHED */
+ "Die angegebene eMail hat die limit Begrenzung von %d User erreicht.",
+ /* LNG_NSEMAILMAX_REACHED_ONE */
+ "Die angegebene eMail hat die limit Begrenzung von 1 User erreicht."
+ };
+
+ char *langtable_pt[] = {
+ /* LNG_NSEMAILMAX_REACHED */
+ "O endereço de email fornecido alcançou seu limite de uso de %d usuários.",
+ /* LNG_NSEMAILMAX_REACHED_ONE */
+ "O endereço de email fornecido alcançou seu limite de uso de 1 usuário."
+ };
+
+ char *langtable_ru[] = {
+ /* LNG_NSEMAILMAX_REACHED */
+ "Óêàçàííûé âàìè email-àäðåñ èñïîëüçóåòñÿ ìàêñèìàëüíî äîïóñòèìîå êîë-âî ðàç: %d",
+ /* LNG_NSEMAILMAX_REACHED_ONE */
+ "Óêàçàííûé âàìè email-àäðåñ óæå êåì-òî èñïîëüçóåòñÿ."
+ };
+
+ char *langtable_it[] = {
+ /* LNG_NSEMAILMAX_REACHED */
+ "L'indirizzo email specificato ha raggiunto il suo limite d'utilizzo di %d utenti.",
+ /* LNG_NSEMAILMAX_REACHED_ONE */
+ "L'indirizzo email specificato ha raggiunto il suo limite d'utilizzo di 1 utente."
+ };
+
+ moduleInsertLanguage(LANG_EN_US, LNG_NUM_STRINGS, langtable_en_us);
+ moduleInsertLanguage(LANG_NL, LNG_NUM_STRINGS, langtable_nl);
+ moduleInsertLanguage(LANG_DE, LNG_NUM_STRINGS, langtable_de);
+ moduleInsertLanguage(LANG_PT, LNG_NUM_STRINGS, langtable_pt);
+ moduleInsertLanguage(LANG_RU, LNG_NUM_STRINGS, langtable_ru);
+ moduleInsertLanguage(LANG_IT, LNG_NUM_STRINGS, langtable_it);
+}
+
+/* EOF */
diff --git a/src/modules/ns_noop_convert.c b/src/modules/ns_noop_convert.c
new file mode 100644
index 000000000..2858bef1e
--- /dev/null
+++ b/src/modules/ns_noop_convert.c
@@ -0,0 +1,173 @@
+/* ns_noop.c - Allows users to optionaly set autoop to off
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Based on the original module by Rob <rob@anope.org>
+ * Included in the Anope module pack since Anope 1.7.9
+ * Anope Coder: DrStein <drstein@anope.org>
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Send bug reports to the Anope Coder instead of the module
+ * author, because any changes since the inclusion into anope
+ * are not supported by the original author.
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+#define AUTHOR "Rob"
+#define VERSION "$Id$"
+
+/* The name of the default database to save info to */
+#define DEFAULT_DB_NAME "autoop.db"
+
+/* Multi-language stuff */
+#define LANG_NUM_STRINGS 8
+
+#define AUTOOP_SYNTAX 0
+#define AUTOOP_STATUS_ON 1
+#define AUTOOP_STATUS_OFF 2
+#define AUTOOP_NO_NICK 3
+#define AUTOOP_ON 4
+#define AUTOOP_OFF 5
+#define AUTOOP_DESC 6
+#define AUTOOP_HELP 7
+
+/*************************************************************************/
+
+User *currentUser;
+int m_isIRCop = 0;
+
+char *NSAutoOPDBName;
+
+int myNickServAutoOpHelp(User * u);
+void myNickServHelp(User * u);
+
+int noop(User * u);
+int mEventJoin(int argc, char **argv);
+int setAutoOp(User * u);
+int UnsetAutoOp(User * u);
+
+int mLoadData(void);
+int mSaveData(int argc, char **argv);
+int mLoadConfig(int argc, char **argv);
+
+void m_AddLanguages(void);
+
+/*************************************************************************/
+
+/**
+ * AnopeInit is called when the module is loaded
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ NSAutoOPDBName = NULL;
+
+ moduleAddAuthor(AUTHOR);
+ moduleAddVersion(VERSION);
+ moduleSetType(SUPPORTED);
+
+ if (mLoadConfig(0, NULL))
+ return MOD_STOP;
+
+ mLoadData();
+
+ alog("ns_noop_convert: Your auto-op database has been converted and this module will now");
+ alog("ns_noop_convert: unload itself. You can now remove this module from your config");
+
+ return MOD_STOP;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+ if (NSAutoOPDBName)
+ free(NSAutoOPDBName);
+}
+
+/*************************************************************************/
+
+/**
+ * Load data from the db file, and populate the autoop setting
+ * @return 0 for success
+ **/
+int mLoadData(void)
+{
+ int ret = 0;
+ int len = 0;
+
+ char *name = NULL;
+
+ NickAlias *na = NULL;
+ FILE *in;
+
+ /* will _never_ be this big thanks to the 512 limit of a message */
+ char buffer[2000];
+ if ((in = fopen(NSAutoOPDBName, "r")) == NULL) {
+ alog("ns_noop: WARNING: Can not open database file! (it might not exist, this is not fatal)");
+ ret = 1;
+ } else {
+ while (fgets(buffer, 1500, in)) {
+ name = myStrGetToken(buffer, ' ', 0);
+ if (name) {
+ len = strlen(name);
+ /* Take the \n from the end of the line */
+ name[len - 1] = '\0';
+ if ((na = findnick(name))) {
+ na->nc->flags |= NI_AUTOOP;
+ }
+ free(name);
+ }
+ }
+ }
+ return ret;
+}
+
+/*************************************************************************/
+
+/**
+ * Load the configuration directives from Services configuration file.
+ * @return 0 for success
+ **/
+int mLoadConfig(int argc, char **argv)
+{
+ char *tmp = NULL;
+
+ Directive d[] = {
+ {"NSAutoOPDBName", {{PARAM_STRING, PARAM_RELOAD, &tmp}}},
+ };
+
+ moduleGetConfigDirective(d);
+
+ if (NSAutoOPDBName)
+ free(NSAutoOPDBName);
+
+ if (tmp) {
+ NSAutoOPDBName = tmp;
+ } else {
+ NSAutoOPDBName = sstrdup(DEFAULT_DB_NAME);
+ alog("ns_noop: NSAutoOPDBName is not defined in Services configuration file, using default %s", NSAutoOPDBName);
+ }
+
+ if (!NSAutoOPDBName) {
+ alog("ns_noop: FATAL: Can't read required configuration directives!");
+ return MOD_STOP;
+ } else {
+ alog("ns_noop: Directive NSAutoOPDBName loaded (%s)...",
+ NSAutoOPDBName);
+ }
+
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+/* EOF */
diff --git a/src/modules/os_ignore_db.c b/src/modules/os_ignore_db.c
new file mode 100644
index 000000000..474959068
--- /dev/null
+++ b/src/modules/os_ignore_db.c
@@ -0,0 +1,545 @@
+/* os_ignore_db.c - Provides a database backend for OS IGNORE.
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Included in the Anope module pack since Anope 1.7.23
+ * Anope Coder: Viper <viper@anope.org>
+ *
+ * Please read COPYING and README for further details.
+ *
+ */
+/* ------------------------------------------------------------------------------- */
+
+#include "module.h"
+
+#define AUTHOR "Viper"
+#define VERSION "$Id$"
+
+/* Default database name */
+#define DefIgnoreDB "os_ignore.db"
+#define IGNOREDBVERSION 1
+
+/* Database seperators */
+#define SEPARATOR '^' /* End of a key, seperates keys from values */
+#define BLOCKEND '\n' /* End of a block, e.g. a whole ignore */
+#define VALUEEND '\000' /* End of a value */
+#define SUBSTART '\010' /* Beginning of a new subblock, closed by a BLOCKEND */
+
+/* Database reading return values */
+#define DB_READ_SUCCESS 0
+#define DB_READ_ERROR 1
+#define DB_EOF_ERROR 2
+#define DB_VERSION_ERROR 3
+#define DB_READ_BLOCKEND 4
+#define DB_READ_SUBSTART 5
+
+#define DB_WRITE_SUCCESS 0
+#define DB_WRITE_ERROR 1
+#define DB_WRITE_NOVAL 2
+
+/* Database Key, Value max length */
+#define MAXKEYLEN 128
+#define MAXVALLEN 1024
+
+/* Structs */
+typedef struct db_file_ DBFile;
+
+struct db_file_ {
+ FILE *fptr; /* Pointer to the opened file */
+ int db_version; /* The db version of the datafiles (only needed for reading) */
+ int core_db_version; /* The current db version of this anope source */
+ char service[256]; /* StatServ/etc. */
+ char filename[256]; /* Filename of the database */
+ char temp_name[262]; /* Temp filename of the database */
+};
+
+
+/* Variables */
+char *IgnoreDB;
+
+/* Functions */
+int new_open_db_read(DBFile *dbptr, char **key, char **value);
+int new_open_db_write(DBFile *dbptr);
+void new_close_db(FILE *fptr, char **key, char **value);
+int new_read_db_entry(char **key, char **value, FILE * fptr);
+int new_write_db_entry(const char *key, DBFile *dbptr, const char *fmt, ...);
+int new_write_db_endofblock(DBFile *dbptr);
+void fill_db_ptr(DBFile *dbptr, int version, int core_version, char service[256], char filename[256]);
+
+int save_ignoredb(int argc, char **argv);
+int backup_ignoredb(int argc, char **argv);
+void load_ignore_db(void);
+void save_ignore_db(void);
+void load_config(void);
+int reload_config(int argc, char **argv);
+
+/* ------------------------------------------------------------------------------- */
+
+/**
+ * AnopeInit is called when the module is loaded
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv) {
+ EvtHook *hook;
+ IgnoreDB = NULL;
+
+ moduleAddAuthor(AUTHOR);
+ moduleAddVersion(VERSION);
+ moduleSetType(SUPPORTED);
+
+ hook = createEventHook(EVENT_RELOAD, reload_config);
+ if (moduleAddEventHook(hook) != MOD_ERR_OK) {
+ alog("[\002os_ignore_db\002] Can't hook to EVENT_RELOAD event");
+ return MOD_STOP;
+ }
+
+ hook = createEventHook(EVENT_DB_SAVING, save_ignoredb);
+ if (moduleAddEventHook(hook) != MOD_ERR_OK) {
+ alog("[\002os_ignore_db\002] Can't hook to EVENT_DB_SAVING event");
+ return MOD_STOP;
+ }
+
+ hook = createEventHook(EVENT_DB_BACKUP, backup_ignoredb);
+ if (moduleAddEventHook(hook) != MOD_ERR_OK) {
+ alog("[\002os_ignore_db\002] Can't hook to EVENT_DB_BACKUP event");
+ return MOD_STOP;
+ }
+
+ load_config();
+ /* Load the ignore database and re-add them to anopes ignorelist. */
+ load_ignore_db();
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void) {
+ /* Save the ignore database before bailing out.. */
+ save_ignore_db();
+
+ if (IgnoreDB)
+ free(IgnoreDB);
+}
+
+/* ------------------------------------------------------------------------------- */
+
+void load_config(void) {
+ int i;
+
+ Directive confvalues[][1] = {
+ {{"OSIgnoreDBName", {{PARAM_STRING, PARAM_RELOAD, &IgnoreDB}}}},
+ };
+
+ if (IgnoreDB)
+ free(IgnoreDB);
+ IgnoreDB = NULL;
+
+ for (i = 0; i < 1; i++)
+ moduleGetConfigDirective(confvalues[i]);
+
+ if (!IgnoreDB)
+ IgnoreDB = sstrdup(DefIgnoreDB);
+
+ if (debug)
+ alog("[os_ignore_db] debug: Set config vars: OSIgnoreDBName='%s'", IgnoreDB);
+}
+
+/**
+ * Upon /os reload call the routines for reloading the configuration directives
+ **/
+int reload_config(int argc, char **argv) {
+ if (argc >= 1) {
+ if (!stricmp(argv[0], EVENT_START)) {
+ load_config();
+ }
+ }
+ return MOD_CONT;
+}
+
+/**
+ * When anope saves her databases, we do the same.
+ **/
+int save_ignoredb(int argc, char **argv) {
+ if ((argc >= 1) && (!stricmp(argv[0], EVENT_STOP)))
+ save_ignore_db();
+
+ return MOD_CONT;
+}
+
+
+/**
+ * When anope backs her databases up, we do the same.
+ **/
+int backup_ignoredb(int argc, char **argv) {
+ if ((argc >= 1) && (!stricmp(argv[0], EVENT_STOP))) {
+ if (debug)
+ alog("[os_ignore_db] debug: Backing up %s database...", IgnoreDB);
+ ModuleDatabaseBackup(IgnoreDB);
+ }
+ return MOD_CONT;
+}
+
+/* ------------------------------------------------------------------------------- */
+
+/**************************************************************************
+ * DataBase Handling
+ **************************************************************************/
+
+void load_ignore_db(void) {
+ DBFile *dbptr = scalloc(1, sizeof(DBFile));
+ char *key, *value, *mask = NULL;
+ int retval = 0;
+ time_t expiry_time;
+ IgnoreData *ign;
+
+ expiry_time = time(NULL);
+ fill_db_ptr(dbptr, 0, IGNOREDBVERSION, s_OperServ, IgnoreDB);
+
+ /* let's remove existing temp files here, because we only load dbs on startup */
+ remove(dbptr->temp_name);
+
+ /* Open the db, fill the rest of dbptr and allocate memory for key and value */
+ if (new_open_db_read(dbptr, &key, &value)) {
+ free(dbptr);
+ return; /* Bang, an error occurred */
+ }
+
+ while (1) {
+ /* read a new entry and fill key and value with it -Certus */
+ retval = new_read_db_entry(&key, &value, dbptr->fptr);
+
+ if (retval == DB_READ_ERROR) {
+ new_close_db(dbptr->fptr, &key, &value);
+ free(dbptr);
+ return;
+
+ } else if (retval == DB_EOF_ERROR) {
+ new_close_db(dbptr->fptr, &key, &value);
+ free(dbptr);
+ return;
+ } else if (retval == DB_READ_BLOCKEND) { /* DB_READ_BLOCKEND */
+ /* Check if we have everything to add the ignore..
+ * We shouldn't bother with already expired ignores either.. */
+ if (mask && (expiry_time > time(NULL) || expiry_time == 0)) {
+ /* We should check for double entries.. */
+ for (ign = ignore; ign; ign = ign->next)
+ if (!stricmp(ign->mask, mask))
+ break;
+
+ if (!ign) {
+ /* Create a fresh entry.. */
+ ign = scalloc(sizeof(*ign), 1);
+ ign->mask = sstrdup(mask);
+ ign->time = expiry_time;
+ ign->prev = NULL;
+ ign->next = ignore;
+ if (ignore)
+ ignore->prev = ign;
+ ignore = ign;
+ if (debug)
+ alog("[os_ignore_db] debug: Added new ignore entry for %s", mask);
+ } else {
+ /* Update time on existing entry.
+ * The longest expiry time survives.. */
+ if (expiry_time == 0 || ign->time == 0)
+ ign->time = 0;
+ else if (expiry_time > ign->time)
+ ign->time = expiry_time;
+ }
+ }
+
+ if (mask) free(mask);
+ mask = NULL;
+ expiry_time = time(NULL);
+ } else { /* DB_READ_SUCCESS */
+ if (!*key || !*value)
+ continue;
+
+ /* mask */
+ if (!stricmp(key, "m")) {
+ if (mask)
+ free(mask);
+ mask = sstrdup(value);
+
+ /* expiry time */
+ } else if (!stricmp(key, "t")) {
+ expiry_time = atoi(value);
+
+ } else if (!stricmp(key, "IGNORE_DB_VERSION")) {
+ if ((int)atoi(value) != IGNOREDBVERSION) {
+ alog("[\002os_ignore_db\002] Database version does not match any database versions supported by this module.");
+ alog("[\002os_ignore_db\002] Continuing with clean database...");
+ break;
+ }
+ }
+ } /* else */
+ } /* while */
+
+ free(dbptr);
+}
+
+
+void save_ignore_db(void) {
+ DBFile *dbptr = scalloc(1, sizeof(DBFile));
+ time_t now;
+ IgnoreData *ign, *next;
+
+ now = time(NULL);
+ fill_db_ptr(dbptr, 0, IGNOREDBVERSION, s_OperServ, IgnoreDB);
+
+ /* time to backup the old db */
+ rename(IgnoreDB, dbptr->temp_name);
+
+ if (new_open_db_write(dbptr)) {
+ rename(dbptr->temp_name, IgnoreDB);
+ free(dbptr);
+ return; /* Bang, an error occurred */
+ }
+
+ /* Store the version of the DB in the DB as well...
+ * This will make stuff a lot easier if the database scheme needs to modified. */
+ new_write_db_entry("IGNORE_DB_VERSION", dbptr, "%d", IGNOREDBVERSION);
+ new_write_db_endofblock(dbptr);
+
+ /* Go over the entire ignorelist, check whether each entry is still valid
+ * and write it to the database if it is.*/
+ for (ign = ignore; ign; ign = next) {
+ next = ign->next;
+
+ if (ign->time != 0 && ign->time <= now) {
+ if (debug)
+ alog("[os_ignore_db] debug: Expiring ignore entry %s", ign->mask);
+ if (ign->prev)
+ ign->prev->next = ign->next;
+ else if (ignore == ign)
+ ignore = ign->next;
+ if (ign->next)
+ ign->next->prev = ign->prev;
+ free(ign->mask);
+ free(ign);
+ ign = NULL;
+ } else {
+ new_write_db_entry("m", dbptr, "%s", ign->mask);
+ new_write_db_entry("t", dbptr, "%d", ign->time);
+ new_write_db_endofblock(dbptr);
+ }
+ }
+
+ if (dbptr) {
+ new_close_db(dbptr->fptr, NULL, NULL); /* close file */
+ remove(dbptr->temp_name); /* saved successfully, no need to keep the old one */
+ free(dbptr); /* free the db struct */
+ }
+}
+
+
+/* ------------------------------------------------------------------------------- */
+
+/**************************************************************************
+ * Generic DataBase Functions (Borrowed this from Trystan :-) )
+ **************************************************************************/
+
+
+int new_open_db_read(DBFile *dbptr, char **key, char **value) {
+ *key = malloc(MAXKEYLEN);
+ *value = malloc(MAXVALLEN);
+
+ if (!(dbptr->fptr = fopen(dbptr->filename, "rb"))) {
+ if (debug) {
+ alog("debug: Can't read %s database %s : errno(%d)", dbptr->service,
+ dbptr->filename, errno);
+ }
+ free(*key);
+ *key = NULL;
+ free(*value);
+ *value = NULL;
+ return DB_READ_ERROR;
+ }
+ dbptr->db_version = fgetc(dbptr->fptr) << 24 | fgetc(dbptr->fptr) << 16
+ | fgetc(dbptr->fptr) << 8 | fgetc(dbptr->fptr);
+
+ if (ferror(dbptr->fptr)) {
+ if (debug) {
+ alog("debug: Error reading version number on %s", dbptr->filename);
+ }
+ free(*key);
+ *key = NULL;
+ free(*value);
+ *value = NULL;
+ return DB_READ_ERROR;
+ } else if (feof(dbptr->fptr)) {
+ if (debug) {
+ alog("debug: Error reading version number on %s: End of file detected",
+ dbptr->filename);
+ }
+ free(*key);
+ *key = NULL;
+ free(*value);
+ *value = NULL;
+ return DB_EOF_ERROR;
+ } else if (dbptr->db_version < 1) {
+ if (debug) {
+ alog("debug: Invalid version number (%d) on %s", dbptr->db_version, dbptr->filename);
+ }
+ free(*key);
+ *key = NULL;
+ free(*value);
+ *value = NULL;
+ return DB_VERSION_ERROR;
+ }
+ return DB_READ_SUCCESS;
+}
+
+
+int new_open_db_write(DBFile *dbptr) {
+ if (!(dbptr->fptr = fopen(dbptr->filename, "wb"))) {
+ if (debug) {
+ alog("debug: %s Can't open %s database for writing", dbptr->service, dbptr->filename);
+ }
+ return DB_WRITE_ERROR;
+ }
+
+ if (fputc(dbptr->core_db_version >> 24 & 0xFF, dbptr->fptr) < 0 ||
+ fputc(dbptr->core_db_version >> 16 & 0xFF, dbptr->fptr) < 0 ||
+ fputc(dbptr->core_db_version >> 8 & 0xFF, dbptr->fptr) < 0 ||
+ fputc(dbptr->core_db_version & 0xFF, dbptr->fptr) < 0) {
+ if (debug) {
+ alog("debug: Error writing version number on %s", dbptr->filename);
+ }
+ return DB_WRITE_ERROR;
+ }
+ return DB_WRITE_SUCCESS;
+}
+
+
+void new_close_db(FILE *fptr, char **key, char **value) {
+ if (key && *key) {
+ free(*key);
+ *key = NULL;
+ }
+ if (value && *value) {
+ free(*value);
+ *value = NULL;
+ }
+
+ if (fptr) {
+ fclose(fptr);
+ }
+}
+
+
+int new_read_db_entry(char **key, char **value, FILE *fptr) {
+ char *string = *key;
+ int character;
+ int i = 0;
+
+ **key = '\0';
+ **value = '\0';
+
+ while (1) {
+ if ((character = fgetc(fptr)) == EOF) { /* a problem occurred reading the file */
+ if (ferror(fptr)) {
+ return DB_READ_ERROR; /* error! */
+ }
+ return DB_EOF_ERROR; /* end of file */
+ } else if (character == BLOCKEND) { /* END OF BLOCK */
+ return DB_READ_BLOCKEND;
+ } else if (character == VALUEEND) { /* END OF VALUE */
+ string[i] = '\0'; /* end of value */
+ return DB_READ_SUCCESS;
+ } else if (character == SEPARATOR) { /* END OF KEY */
+ string[i] = '\0'; /* end of key */
+ string = *value; /* beginning of value */
+ i = 0; /* start with the first character of our value */
+ } else {
+ if ((i == (MAXKEYLEN - 1)) && (string == *key)) { /* max key length reached, continuing with value */
+ string[i] = '\0'; /* end of key */
+ string = *value; /* beginning of value */
+ i = 0; /* start with the first character of our value */
+ } else if ((i == (MAXVALLEN - 1)) && (string == *value)) { /* max value length reached, returning */
+ string[i] = '\0';
+ return DB_READ_SUCCESS;
+ } else {
+ string[i] = character; /* read string (key or value) */
+ i++;
+ }
+ }
+ }
+}
+
+
+int new_write_db_entry(const char *key, DBFile *dbptr, const char *fmt, ...) {
+ char string[MAXKEYLEN + MAXVALLEN + 2], value[MAXVALLEN]; /* safety byte :P */
+ va_list ap;
+ unsigned int length;
+
+ if (!dbptr) {
+ return DB_WRITE_ERROR;
+ }
+
+ va_start(ap, fmt);
+ vsnprintf(value, MAXVALLEN, fmt, ap);
+ va_end(ap);
+
+ if (!stricmp(value, "(null)")) {
+ return DB_WRITE_NOVAL;
+ }
+ snprintf(string, MAXKEYLEN + MAXVALLEN + 1, "%s%c%s", key, SEPARATOR, value);
+ length = strlen(string);
+ string[length] = VALUEEND;
+ length++;
+
+ if (fwrite(string, 1, length, dbptr->fptr) < length) {
+ if (debug) {
+ alog("debug: Error writing to %s", dbptr->filename);
+ }
+ new_close_db(dbptr->fptr, NULL, NULL);
+ if (debug) {
+ alog("debug: Restoring backup.");
+ }
+ remove(dbptr->filename);
+ rename(dbptr->temp_name, dbptr->filename);
+ free(dbptr);
+ dbptr = NULL;
+ return DB_WRITE_ERROR;
+ }
+ return DB_WRITE_SUCCESS;
+}
+
+
+int new_write_db_endofblock(DBFile *dbptr) {
+ if (!dbptr) {
+ return DB_WRITE_ERROR;
+ }
+ if (fputc(BLOCKEND, dbptr->fptr) == EOF) {
+ if (debug) {
+ alog("debug: Error writing to %s", dbptr->filename);
+ }
+ new_close_db(dbptr->fptr, NULL, NULL);
+ return DB_WRITE_ERROR;
+ }
+ return DB_WRITE_SUCCESS;
+}
+
+
+
+void fill_db_ptr(DBFile *dbptr, int version, int core_version,
+ char service[256], char filename[256]) {
+ dbptr->db_version = version;
+ dbptr->core_db_version = core_version;
+ if (!service)
+ strcpy(dbptr->service, service);
+ else
+ strcpy(dbptr->service, "");
+
+ strcpy(dbptr->filename, filename);
+ snprintf(dbptr->temp_name, 261, "%s.temp", filename);
+ return;
+}
+
+/* EOF */
diff --git a/src/modules/os_info.c b/src/modules/os_info.c
new file mode 100644
index 000000000..0343f957e
--- /dev/null
+++ b/src/modules/os_info.c
@@ -0,0 +1,780 @@
+/* os_info.c - Adds oper information lines to nicks/channels
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Based on the original module by Rob <rob@anope.org>
+ * Included in the Anope module pack since Anope 1.7.9
+ * Anope Coder: DrStein <drstein@anope.org>
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Send bug reports to the Anope Coder instead of the module
+ * author, because any changes since the inclusion into anope
+ * are not supported by the original author.
+ *
+ */
+/*************************************************************************/
+
+#include "module.h"
+
+#define AUTHOR "Rob"
+#define VERSION "$Id$"
+
+/* Default database name */
+#define DEFAULT_DB_NAME "os_info.db"
+
+/* Multi-language stuff */
+#define LANG_NUM_STRINGS 10
+
+#define OINFO_SYNTAX 0
+#define OINFO_ADD_SUCCESS 1
+#define OINFO_DEL_SUCCESS 2
+#define OCINFO_SYNTAX 3
+#define OCINFO_ADD_SUCCESS 4
+#define OCINFO_DEL_SUCCESS 5
+#define OINFO_HELP 6
+#define OCINFO_HELP 7
+#define OINFO_HELP_CMD 8
+#define OCINFO_HELP_CMD 9
+
+/*************************************************************************/
+
+char *OSInfoDBName = NULL;
+
+int myAddNickInfo(User * u);
+int myAddChanInfo(User * u);
+int myNickInfo(User * u);
+int myChanInfo(User * u);
+
+int mNickHelp(User * u);
+int mChanHelp(User * u);
+void mMainChanHelp(User * u);
+void mMainNickHelp(User * u);
+void m_AddLanguages(void);
+
+int mLoadData(void);
+int mSaveData(int argc, char **argv);
+int mBackupData(int argc, char **argv);
+int mLoadConfig();
+int mEventReload(int argc, char **argv);
+
+/*************************************************************************/
+
+/**
+ * AnopeInit is called when the module is loaded
+ * @param argc Argument count
+ * @param argv Argument list
+ * @return MOD_CONT to allow the module, MOD_STOP to stop it
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ Command *c;
+ EvtHook *hook = NULL;
+
+ int status;
+
+ moduleAddAuthor(AUTHOR);
+ moduleAddVersion(VERSION);
+ moduleSetType(SUPPORTED);
+
+ alog("os_info: Loading configuration directives...");
+ if (mLoadConfig()) {
+ return MOD_STOP;
+ }
+
+ c = createCommand("oInfo", myAddNickInfo, is_oper, -1, -1, -1, -1, -1);
+ moduleAddHelp(c, mNickHelp);
+ status = moduleAddCommand(NICKSERV, c, MOD_HEAD);
+
+ c = createCommand("Info", myNickInfo, NULL, -1, -1, -1, -1, -1);
+ status = moduleAddCommand(NICKSERV, c, MOD_TAIL);
+
+ c = createCommand("oInfo", myAddChanInfo, is_oper, -1, -1, -1, -1, -1);
+ moduleAddHelp(c, mChanHelp);
+ status = moduleAddCommand(CHANSERV, c, MOD_HEAD);
+
+ c = createCommand("Info", myChanInfo, NULL, -1, -1, -1, -1, -1);
+ status = moduleAddCommand(CHANSERV, c, MOD_TAIL);
+
+ hook = createEventHook(EVENT_DB_SAVING, mSaveData);
+ status = moduleAddEventHook(hook);
+
+ hook = createEventHook(EVENT_DB_BACKUP, mBackupData);
+ status = moduleAddEventHook(hook);
+
+ hook = createEventHook(EVENT_RELOAD, mEventReload);
+ status = moduleAddEventHook(hook);
+
+ moduleSetNickHelp(mMainNickHelp);
+ moduleSetChanHelp(mMainChanHelp);
+
+ mLoadData();
+ m_AddLanguages();
+
+ return MOD_CONT;
+}
+
+/**
+ * Unload the module
+ **/
+void AnopeFini(void)
+{
+ char *av[1];
+
+ av[0] = sstrdup(EVENT_START);
+ mSaveData(1, av);
+ free(av[0]);
+
+ if (OSInfoDBName)
+ free(OSInfoDBName);
+}
+
+/*************************************************************************/
+
+/**
+ * Provide the user interface to add/remove/update oper information
+ * about a nick.
+ * We are going to assume that anyone who gets this far is an oper;
+ * the createCommand should have handled this checking for us and its
+ * tedious / a waste to do it twice.
+ * @param u The user who executed this command
+ * @return MOD_CONT if we want to process other commands in this command
+ * stack, MOD_STOP if we dont
+ **/
+int myAddNickInfo(User * u)
+{
+ char *text = NULL;
+ char *cmd = NULL;
+ char *nick = NULL;
+ char *info = NULL;
+ NickAlias *na = NULL;
+
+ /* Get the last buffer anope recived */
+ text = moduleGetLastBuffer();
+ if (text) {
+ cmd = myStrGetToken(text, ' ', 0);
+ nick = myStrGetToken(text, ' ', 1);
+ info = myStrGetTokenRemainder(text, ' ', 2);
+ if (cmd && nick) {
+ if (strcasecmp(cmd, "ADD") == 0) {
+ /* Syntax error, again! */
+ if (info) {
+ /* ok we've found the user */
+ if ((na = findnick(nick))) {
+ /* Add the module data to the user */
+ moduleAddData(&na->nc->moduleData, "info", info);
+ moduleNoticeLang(s_NickServ, u,
+ OINFO_ADD_SUCCESS, nick);
+ /* NickCore not found! */
+ } else {
+ notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED,
+ nick);
+ }
+ free(info);
+ }
+ } else if (strcasecmp(cmd, "DEL") == 0) {
+ /* ok we've found the user */
+ if ((na = findnick(nick))) {
+ moduleDelData(&na->nc->moduleData, "info");
+ moduleNoticeLang(s_NickServ, u,
+ OINFO_DEL_SUCCESS, nick);
+ /* NickCore not found! */
+ } else {
+ notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED,
+ nick);
+ }
+ /* another syntax error! */
+ } else {
+ moduleNoticeLang(s_NickServ, u, OINFO_SYNTAX);
+ }
+ free(cmd);
+ free(nick);
+ /* Syntax error */
+ } else if (cmd) {
+ moduleNoticeLang(s_NickServ, u, OINFO_SYNTAX);
+ free(cmd);
+ /* Syntax error */
+ } else {
+ moduleNoticeLang(s_NickServ, u, OINFO_SYNTAX);
+ }
+ }
+ return MOD_CONT;
+}
+
+/**
+ * Provide the user interface to add/remove/update oper information
+ * about a channel.
+ * We are going to assume that anyone who gets this far is an oper;
+ * the createCommand should have handled this checking for us and
+ * its tedious / a waste to do it twice.
+ * @param u The user who executed this command
+ * @return MOD_CONT if we want to process other commands in this command
+ * stack, MOD_STOP if we dont
+ **/
+int myAddChanInfo(User * u)
+{
+ char *text = NULL;
+ char *cmd = NULL;
+ char *chan = NULL;
+ char *info = NULL;
+ ChannelInfo *ci = NULL;
+
+ /* Get the last buffer anope recived */
+ text = moduleGetLastBuffer();
+ if (text) {
+ cmd = myStrGetToken(text, ' ', 0);
+ chan = myStrGetToken(text, ' ', 1);
+ info = myStrGetTokenRemainder(text, ' ', 2);
+ if (cmd && chan) {
+ if (strcasecmp(cmd, "ADD") == 0) {
+ if (info) {
+ if ((ci = cs_findchan(chan))) {
+ /* Add the module data to the channel */
+ moduleAddData(&ci->moduleData, "info", info);
+ moduleNoticeLang(s_ChanServ, u,
+ OCINFO_ADD_SUCCESS, chan);
+ /* ChanInfo */
+ } else {
+ notice_lang(s_ChanServ, u, CHAN_X_NOT_REGISTERED,
+ chan);
+ }
+ free(info);
+ }
+ } else if (strcasecmp(cmd, "DEL") == 0) {
+ if ((ci = cs_findchan(chan))) {
+ /* Del the module data from the channel */
+ moduleDelData(&ci->moduleData, "info");
+ moduleNoticeLang(s_ChanServ, u,
+ OCINFO_DEL_SUCCESS, chan);
+ /* ChanInfo */
+ } else {
+ notice_lang(s_ChanServ, u, CHAN_X_NOT_REGISTERED,
+ chan);
+ }
+ /* another syntax error! */
+ } else {
+ moduleNoticeLang(s_ChanServ, u, OCINFO_SYNTAX);
+ }
+ free(cmd);
+ free(chan);
+ /* Syntax error */
+ } else if (cmd) {
+ moduleNoticeLang(s_ChanServ, u, OCINFO_SYNTAX);
+ free(cmd);
+ /* Syntax error */
+ } else {
+ moduleNoticeLang(s_ChanServ, u, OCINFO_SYNTAX);
+ }
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+/**
+ * Called after a user does a /msg nickserv info [nick]
+ * @param u The user who requested info
+ * @return MOD_CONT to continue processing commands or MOD_STOP to stop
+ **/
+int myNickInfo(User * u)
+{
+ char *text = NULL;
+ char *nick = NULL;
+ char *info = NULL;
+ NickAlias *na = NULL;
+
+ /* Only show our goodies to opers */
+ if (is_oper(u)) {
+ /* Get the last buffer anope recived */
+ text = moduleGetLastBuffer();
+ if (text) {
+ nick = myStrGetToken(text, ' ', 0);
+ if (nick) {
+ /* ok we've found the user */
+ if ((na = findnick(nick))) {
+ /* If we have any info on this user */
+ if ((info = moduleGetData(&na->nc->moduleData, "info"))) {
+ notice_user(s_NickServ, u, " OperInfo: %s", info);
+ free(info);
+ }
+ /* NickCore not found! */
+ } else {
+ /* we dont care! */
+ }
+ free(nick);
+ }
+ }
+ }
+ return MOD_CONT;
+}
+
+/**
+ * Called after a user does a /msg chanserv info chan
+ * @param u The user who requested info
+ * @return MOD_CONT to continue processing commands or MOD_STOP to stop
+ **/
+int myChanInfo(User * u)
+{
+ char *text = NULL;
+ char *chan = NULL;
+ char *info = NULL;
+ ChannelInfo *ci = NULL;
+
+ /* Only show our goodies to opers */
+ if (is_oper(u)) {
+ /* Get the last buffer anope recived */
+ text = moduleGetLastBuffer();
+ if (text) {
+ chan = myStrGetToken(text, ' ', 0);
+ if (chan) {
+ if ((ci = cs_findchan(chan))) {
+ /* If we have any info on this channel */
+ if ((info = moduleGetData(&ci->moduleData, "info"))) {
+ notice_user(s_ChanServ, u, " OperInfo: %s", info);
+ free(info);
+ }
+ }
+ free(chan);
+ }
+ }
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+/**
+ * Load data from the db file, and populate our OperInfo lines
+ * @return 0 for success
+ **/
+int mLoadData(void)
+{
+ int ret = 0;
+ FILE *in;
+
+ char *type = NULL;
+ char *name = NULL;
+ char *info = NULL;
+ int len = 0;
+
+ ChannelInfo *ci = NULL;
+ NickAlias *na = NULL;
+
+ /* will _never_ be this big thanks to the 512 limit of a message */
+ char buffer[2000];
+ if ((in = fopen(OSInfoDBName, "r")) == NULL) {
+ alog("os_info: WARNING: can not open the database file! (it might not exist, this is not fatal)");
+ ret = 1;
+ } else {
+ while (fgets(buffer, 1500, in)) {
+ type = myStrGetToken(buffer, ' ', 0);
+ name = myStrGetToken(buffer, ' ', 1);
+ info = myStrGetTokenRemainder(buffer, ' ', 2);
+ if (type) {
+ if (name) {
+ if (info) {
+ len = strlen(info);
+ /* Take the \n from the end of the line */
+ info[len - 1] = '\0';
+ if (stricmp(type, "C") == 0) {
+ if ((ci = cs_findchan(name))) {
+ moduleAddData(&ci->moduleData, "info",
+ info);
+ }
+ } else if (stricmp(type, "N") == 0) {
+ if ((na = findnick(name))) {
+ moduleAddData(&na->nc->moduleData, "info",
+ info);
+ }
+ }
+ free(info);
+ }
+ free(name);
+ }
+ free(type);
+ }
+ }
+ }
+ return ret;
+}
+
+/**
+ * Save all our data to our db file
+ * First walk through the nick CORE list, and any nick core which has
+ * oper info attached to it, write to the file.
+ * Next do the same again for ChannelInfos
+ * @return 0 for success
+ **/
+int mSaveData(int argc, char **argv)
+{
+ ChannelInfo *ci = NULL;
+ NickCore *nc = NULL;
+ int i = 0;
+ int ret = 0;
+ FILE *out;
+ char *info = NULL;
+
+ if (argc >= 1) {
+ if (!stricmp(argv[0], EVENT_START)) {
+ if ((out = fopen(OSInfoDBName, "w")) == NULL) {
+ alog("os_info: ERROR: can not open the database file!");
+ anope_cmd_global(s_OperServ,
+ "os_info: ERROR: can not open the database file!");
+ ret = 1;
+ } else {
+ for (i = 0; i < 1024; i++) {
+ for (nc = nclists[i]; nc; nc = nc->next) {
+ /* If we have any info on this user */
+ if ((info = moduleGetData(&nc->moduleData, "info"))) {
+ fprintf(out, "N %s %s\n", nc->display, info);
+ free(info);
+ }
+ }
+ }
+
+
+ for (i = 0; i < 256; i++) {
+ for (ci = chanlists[i]; ci; ci = ci->next) {
+ /* If we have any info on this channel */
+ if ((info = moduleGetData(&ci->moduleData, "info"))) {
+ fprintf(out, "C %s %s\n", ci->name, info);
+ free(info);
+ }
+ }
+ }
+ fclose(out);
+ }
+ } else {
+ ret = 0;
+ }
+ }
+
+ return ret;
+}
+
+/**
+ * Backup our databases using the commands provided by Anope
+ * @return MOD_CONT
+ **/
+int mBackupData(int argc, char **argv)
+{
+ ModuleDatabaseBackup(OSInfoDBName);
+
+ return MOD_CONT;
+}
+
+/**
+ * Load the configuration directives from Services configuration file.
+ * @return 0 for success
+ **/
+int mLoadConfig(void)
+{
+ char *tmp = NULL;
+
+ Directive directivas[] = {
+ {"OSInfoDBName", {{PARAM_STRING, PARAM_RELOAD, &tmp}}},
+ };
+
+ Directive *d = &directivas[0];
+ moduleGetConfigDirective(d);
+
+ if (OSInfoDBName)
+ free(OSInfoDBName);
+
+ if (tmp) {
+ OSInfoDBName = tmp;
+ } else {
+ OSInfoDBName = sstrdup(DEFAULT_DB_NAME);
+ alog("os_info: OSInfoDBName is not defined in Services configuration file, using default %s", OSInfoDBName);
+ }
+
+ alog("os_info: Directive OSInfoDBName loaded (%s)...", OSInfoDBName);
+
+ return 0;
+}
+
+/**
+ * Manage the RELOAD EVENT
+ * @return MOD_CONT
+ **/
+int mEventReload(int argc, char **argv)
+{
+ int ret = 0;
+ if (argc >= 1) {
+ if (!stricmp(argv[0], EVENT_START)) {
+ alog("os_info: Reloading configuration directives...");
+ ret = mLoadConfig();
+ } else {
+ /* Nothing for now */
+ }
+ }
+
+ if (ret)
+ alog("os_info.c: ERROR: An error has occured while reloading the configuration file");
+
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+/**
+ * manages the multilanguage stuff
+ **/
+void m_AddLanguages(void)
+{
+ char *langtable_en_us[] = {
+ /* OINFO_SYNTAX */
+ "Syntax: OINFO [ADD|DEL] nick <info>",
+ /* OINFO_ADD_SUCCESS */
+ "OperInfo line has been added to nick %s",
+ /* OINFO_DEL_SUCCESS */
+ "OperInfo line has been removed from nick %s",
+ /* OCINFO_SYNTAX */
+ "Syntax: OINFO [ADD|DEL] chan <info>",
+ /* OCINFO_ADD_SUCCESS */
+ "OperInfo line has been added to channel %s",
+ /* OCINFO_DEL_SUCCESS */
+ "OperInfo line has been removed from channel %s",
+ /* OINFO_HELP */
+ "Syntax: OINFO [ADD|DEL] nick <info>\n"
+ "Add or Delete Oper information for the given nick\n"
+ "This will show up when any oper /ns info nick's the user.\n"
+ "and can be used for 'tagging' users etc....",
+ /* OCINFO_HELP */
+ "Syntax: OINFO [ADD|DEL] chan <info>\n"
+ "Add or Delete Oper information for the given channel\n"
+ "This will show up when any oper /cs info's the channel.\n"
+ "and can be used for 'tagging' channels etc....",
+ /* OINFO_HELP_CMD */
+ " OINFO Add / Del an OperInfo line to a nick",
+ /* OCINFO_HELP_CMD */
+ " OINFO Add / Del an OperInfo line to a channel"
+ };
+
+ char *langtable_es[] = {
+ /* OINFO_SYNTAX */
+ "Sintaxis: OINFO [ADD|DEL] nick <info>",
+ /* OINFO_ADD_SUCCESS */
+ "Una linea OperInfo ha sido agregada al nick %s",
+ /* OINFO_DEL_SUCCESS */
+ "La linea OperInfo ha sido removida del nick %s",
+ /* OCINFO_SYNTAX */
+ "Sintaxis: OINFO [ADD|DEL] chan <info>",
+ /* OCINFO_ADD_SUCCESS */
+ "Linea OperInfo ha sido agregada al canal %s",
+ /* OCINFO_DEL_SUCCESS */
+ "La linea OperInfo ha sido removida del canal %s",
+ /* OINFO_HELP */
+ "Sintaxis: OINFO [ADD|DEL] nick <info>\n"
+ "Agrega o elimina informacion para Operadores al nick dado\n"
+ "Esto se mostrara cuando cualquier operador haga /ns info nick\n"
+ "y puede ser usado para 'marcado' de usuarios, etc....",
+ /* OCINFO_HELP */
+ "Sintaxis: OINFO [ADD|DEL] chan <info>\n"
+ "Agrega o elimina informacion para Operadores al canal dado\n"
+ "Esto se mostrara cuando cualquier operador haga /cs info canal\n"
+ "y puede ser usado para 'marcado' de canales, etc....",
+ /* OINFO_HELP_CMD */
+ " OINFO Agrega / Elimina una linea OperInfo al nick",
+ /* OCINFO_HELP_CMD */
+ " OINFO Agrega / Elimina una linea OperInfo al canal"
+ };
+
+ char *langtable_nl[] = {
+ /* OINFO_SYNTAX */
+ "Gebruik: OINFO [ADD|DEL] nick <info>",
+ /* OINFO_ADD_SUCCESS */
+ "OperInfo regel is toegevoegd aan nick %s",
+ /* OINFO_DEL_SUCCESS */
+ "OperInfo regel is weggehaald van nick %s",
+ /* OCINFO_SYNTAX */
+ "Gebruik: OINFO [ADD|DEL] kanaal <info>",
+ /* OCINFO_ADD_SUCCESS */
+ "OperInfo regel is toegevoegd aan kanaal %s",
+ /* OCINFO_DEL_SUCCESS */
+ "OperInfo regel is weggehaald van kanaal %s",
+ /* OINFO_HELP */
+ "Gebruik: OINFO [ADD|DEL] nick <info>\n"
+ "Voeg een Oper informatie regel toe aan de gegeven nick, of\n"
+ "verwijder deze. Deze regel zal worden weergegeven wanneer\n"
+ "een oper /ns info nick doet voor deze gebruiker, en kan worden\n"
+ "gebruikt om een gebruiker te 'markeren' etc...",
+ /* OCINFO_HELP */
+ "Gebruik: OINFO [ADD|DEL] kanaal <info>\n"
+ "Voeg een Oper informatie regel toe aan de gegeven kanaal, of\n"
+ "verwijder deze. Deze regel zal worden weergegeven wanneer\n"
+ "een oper /cs info kanaal doet voor dit kanaal, en kan worden\n"
+ "gebruikt om een kanaal te 'markeren' etc...",
+ /* OINFO_HELP_CMD */
+ " OINFO Voeg een OperInfo regel toe aan een nick of verwijder deze",
+ /* OCINFO_HELP_CMD */
+ " OINFO Voeg een OperInfo regel toe aan een kanaal of verwijder deze"
+ };
+
+ char *langtable_de[] = {
+ /* OINFO_SYNTAX */
+ "Syntax: OINFO [ADD|DEL] Nickname <Information>",
+ /* OINFO_ADD_SUCCESS */
+ "Eine OperInfo Linie wurde zu den Nicknamen %s hinzugefügt",
+ /* OINFO_DEL_SUCCESS */
+ "Die OperInfo Linie wurde von den Nicknamen %s enfernt",
+ /* OCINFO_SYNTAX */
+ "Syntax: OINFO [ADD|DEL] Channel <Information>",
+ /* OCINFO_ADD_SUCCESS */
+ "Eine OperInfo Linie wurde zu den Channel %s hinzugefügt",
+ /* OCINFO_DEL_SUCCESS */
+ "Die OperInfo Linie wurde von den Channel %s enfernt",
+ /* OINFO_HELP */
+ "Syntax: OINFO [ADD|DEL] Nickname <Information>\n"
+ "Addiert oder löscht eine OperInfo Linie zu den angegebenen\n"
+ "Nicknamen.Sie wird angezeigt wenn ein Oper mit /ns info sich\n"
+ "über den Nicknamen informiert.",
+ /* OCINFO_HELP */
+ "Syntax: OINFO [ADD|DEL] chan <info>\n"
+ "Addiert oder löscht eine OperInfo Linie zu den angegebenen\n"
+ "Channel.Sie wird angezeigt wenn ein Oper mit /cs info sich\n"
+ "über den Channel informiert.",
+ /* OINFO_HELP_CMD */
+ " OINFO Addiert / Löscht eine OperInfo Linie zu / von einen Nicknamen",
+ /* OCINFO_HELP_CMD */
+ " OINFO Addiert / Löscht eine OperInfo Linie zu / von einen Channel"
+ };
+
+ char *langtable_pt[] = {
+ /* OINFO_SYNTAX */
+ "Sintaxe: OINFO [ADD|DEL] nick <informação>",
+ /* OINFO_ADD_SUCCESS */
+ "A linha OperInfo foi adicionada ao nick %s",
+ /* OINFO_DEL_SUCCESS */
+ "A linha OperInfo foi removida do nick %s",
+ /* OCINFO_SYNTAX */
+ "Sintaxe: OINFO [ADD|DEL] canal <informação>",
+ /* OCINFO_ADD_SUCCESS */
+ "A linha OperInfo foi adicionada ao canal %s",
+ /* OCINFO_DEL_SUCCESS */
+ "A linha OperInfo foi removida do canal %s",
+ /* OINFO_HELP */
+ "Sintaxe: OINFO [ADD|DEL] nick <informação>\n"
+ "Adiciona ou apaga informação para Operadores ao nick fornecido\n"
+ "Isto será mostrado quando qualquer Operador usar /ns info nick\n"
+ "e pode ser usado para 'etiquetar' usuários etc...",
+ /* OCINFO_HELP */
+ "Sintaxe: OINFO [ADD|DEL] canal <informação>\n"
+ "Adiciona ou apaga informação para Operadores ao canal fornecido\n"
+ "Isto será mostrado quando qualquer Operador usar /cs info canal\n"
+ "e pode ser usado para 'etiquetar' canais etc...",
+ /* OINFO_HELP_CMD */
+ " OINFO Adiciona ou Apaga a linha OperInfo para um nick",
+ /* OCINFO_HELP_CMD */
+ " OINFO Adiciona ou Apaga a linha OperInfo para um canal"
+ };
+
+ char *langtable_ru[] = {
+ /* OINFO_SYNTAX */
+ "Ñèíòàêñèñ: OINFO ADD|DEL íèê òåñò",
+ /* OINFO_ADD_SUCCESS */
+ "Îïåð-Èíôîðìàöèÿ äëÿ íèêà %s äîáàâëåíà",
+ /* OINFO_DEL_SUCCESS */
+ "Îïåð-Èíôîðìàöèÿ äëÿ íèêà %s áûëà óäàëåíà",
+ /* OCINFO_SYNTAX */
+ "Ñèíòàêñèñ: OINFO ADD|DEL #êàíàë òåêñò",
+ /* OCINFO_ADD_SUCCESS */
+ "Îïåð-Èíôîðìàöèÿ äëÿ êàíàëà %s óñïåøíî óñòàíîâëåíà",
+ /* OCINFO_DEL_SUCCESS */
+ "Îïåð-Èíôîðìàöèÿ äëÿ êàíàëà %s áûëà óäàëåíà",
+ /* OINFO_HELP */
+ "Ñèíòàêñèñ: OINFO ADD|DEL íèê òåêñò\n"
+ "Óñòàíàâëèâàåò èëè óäàëÿåò Îïåð-Èíôîðìàöèþ äëÿ óêàçàííîãî íèêà,\n"
+ "êîòîðàÿ áóäåò ïîêàçàíà ëþáîìó îïåðàòîðó, çàïðàøèâàþùåìó INFO íèêà.\n"
+ "Ìîæåò áûòü èñïîëüçîâàíà äëÿ 'ïîìåòêè' ïîëüçîâàòåëåé è ò. ä...",
+ /* OCINFO_HELP */
+ "Ñèíòàêñèñ: OINFO ADD|DEL #êàíàë òåêñò\n"
+ "Óñòàíàâëèâàåò èëè óäàëÿåò Îïåð-Èíôîðìàöèþ äëÿ óêàçàííîãî êàíàëà,\n"
+ "êîòîðàÿ áóäåò ïîêàçàíà ëþáîìó îïåðàòîðó, çàïðàøèâàþùåìó INFO êàíàëà.\n"
+ "Ìîæåò áûòü èñïîëüçîâàíà äëÿ 'ïîìåòêè' êàíàëîâ è ò. ä...",
+ /* OINFO_HELP_CMD */
+ " OINFO Äîáàâëÿåò/Óäàëÿåò îïåð-èíôî äëÿ íèêà",
+ /* OCINFO_HELP_CMD */
+ " OINFO Äîáàâëÿåò/Óäàëÿåò îïåð-èíôî äëÿ êàíàëà"
+ };
+
+ char *langtable_it[] = {
+ /* OINFO_SYNTAX */
+ "Sintassi: OINFO [ADD|DEL] nick <info>",
+ /* OINFO_ADD_SUCCESS */
+ "Linea OperInfo aggiunta al nick %s",
+ /* OINFO_DEL_SUCCESS */
+ "Linea OperInfo rimossa dal nick %s",
+ /* OCINFO_SYNTAX */
+ "Sintassi: OINFO [ADD|DEL] chan <info>",
+ /* OCINFO_ADD_SUCCESS */
+ "Linea OperInfo aggiunta al canale %s",
+ /* OCINFO_DEL_SUCCESS */
+ "Linea OperInfo rimossa dal canale %s",
+ /* OINFO_HELP */
+ "Sintassi: OINFO [ADD|DEL] nick <info>\n"
+ "Aggiunge o rimuove informazioni Oper per il nick specificato\n"
+ "Queste vengono mostrate quando un oper esegue il comando /ns info <nick>\n"
+ "e possono essere utilizzate per 'marchiare' gli utenti ecc...",
+ /* OCINFO_HELP */
+ "Sintassi: OINFO [ADD|DEL] chan <info>\n"
+ "Aggiunge o rimuove informazioni Oper per il canale specificato\n"
+ "Queste vengono mostrate quando un oper esegue il comando /cs info <canale>\n"
+ "e possono essere utilizzate per 'marchiare' i canali ecc...",
+ /* OINFO_HELP_CMD */
+ " OINFO Aggiunge/Rimuove una linea OperInfo ad/da un nick",
+ /* OCINFO_HELP_CMD */
+ " OINFO Aggiunge/Rimuove una linea OperInfo ad/da un canale"
+ };
+
+ moduleInsertLanguage(LANG_EN_US, LANG_NUM_STRINGS, langtable_en_us);
+ moduleInsertLanguage(LANG_ES, LANG_NUM_STRINGS, langtable_es);
+ moduleInsertLanguage(LANG_NL, LANG_NUM_STRINGS, langtable_nl);
+ moduleInsertLanguage(LANG_DE, LANG_NUM_STRINGS, langtable_de);
+ moduleInsertLanguage(LANG_PT, LANG_NUM_STRINGS, langtable_pt);
+ moduleInsertLanguage(LANG_RU, LANG_NUM_STRINGS, langtable_ru);
+ moduleInsertLanguage(LANG_IT, LANG_NUM_STRINGS, langtable_it);
+}
+
+/*************************************************************************/
+
+int mNickHelp(User * u)
+{
+ if (is_oper(u)) {
+ moduleNoticeLang(s_NickServ, u, OINFO_HELP);
+ } else {
+ notice_lang(s_NickServ, u, NO_HELP_AVAILABLE, "OINFO");
+ }
+ return MOD_CONT;
+}
+
+int mChanHelp(User * u)
+{
+ if (is_oper(u)) {
+ moduleNoticeLang(s_ChanServ, u, OCINFO_HELP);
+ } else {
+ notice_lang(s_ChanServ, u, NO_HELP_AVAILABLE, "OINFO");
+ }
+ return MOD_CONT;
+}
+
+/* This help will be added to the main NickServ list */
+void mMainNickHelp(User * u)
+{
+ if (is_oper(u)) {
+ moduleNoticeLang(s_NickServ, u, OINFO_HELP_CMD);
+ }
+}
+
+/* This help will be added to the main NickServ list */
+void mMainChanHelp(User * u)
+{
+ if (is_oper(u)) {
+ moduleNoticeLang(s_ChanServ, u, OCINFO_HELP_CMD);
+ }
+}
+
+/*************************************************************************/
+
+/* EOF */
diff --git a/src/mypasql.c b/src/mypasql.c
new file mode 100644
index 000000000..a66850c84
--- /dev/null
+++ b/src/mypasql.c
@@ -0,0 +1,122 @@
+#include <winsock.h>
+#include <stdio.h>
+#include <mysql.h>
+
+MYSQL *mysql;
+MYSQL_RES *result = NULL;
+MYSQL_ROW row;
+
+int __stdcall mysql_Connect(char *server, char *user, char *pass)
+{
+ mysql = mysql_init(NULL);
+ return (int) mysql_real_connect(mysql, server, user, pass, NULL, 0,
+ NULL, 0);
+}
+
+int __stdcall mysql_SelectDb(char *db)
+{
+ return (int) mysql_select_db(mysql, db);
+}
+
+const char *__stdcall mysql_Error()
+{
+ return mysql_error(mysql);
+}
+
+int __stdcall mysql_Query(char *query)
+{
+ if (result) {
+ mysql_free_result(result);
+ result = NULL;
+ }
+ return (int) mysql_real_query(mysql, query, strlen(query));
+}
+
+int __stdcall mysql_NumRows()
+{
+ if (!result)
+ result = mysql_store_result(mysql);
+ return mysql_num_rows(result);
+}
+
+char *strip(char *str)
+{
+ char *c;
+ if ((c = strrchr(str, '\n')))
+ *c = 0;
+ if ((c = strrchr(str, '\r')))
+ *c = 0;
+ return str;
+}
+
+void add_line(char **buf, char *line)
+{
+ int oldlen;
+ char *tmp;
+
+ if (*buf != NULL) {
+ oldlen = strlen(*buf);
+ tmp = malloc(oldlen + 1);
+ strcpy(tmp, *buf);
+ *buf = realloc(*buf, oldlen + strlen(line) + 1);
+ strcpy(*buf, tmp);
+ strcat(*buf, line);
+ free(tmp);
+ } else
+ *buf = strdup(line);
+}
+
+int __stdcall mysql_LoadFromFile(char *file)
+{
+ FILE *fd = fopen(file, "r");
+ char line[1024];
+ char *query = NULL;
+
+
+ if (!fd)
+ return 0;
+ while (fgets(line, 1024, fd)) {
+ int len;
+ strip(line);
+ len = strlen(line);
+ if (!*line || (*line == '-' && *(line + 1) == '-'))
+ continue;
+ else if (line[len - 1] == ';') { /* End of a query */
+ line[len - 1] = 0;
+ add_line(&query, line);
+ if (mysql_real_query(mysql, query, strlen(query))) {
+ free(query);
+ return 0;
+ }
+ free(query);
+ query = NULL;
+ }
+
+ else
+ add_line(&query, line);
+ }
+ return 1;
+}
+
+int __stdcall mysql_NumFields()
+{
+ if (!result)
+ result = mysql_store_result(mysql);
+ return mysql_num_fields(result);
+}
+
+int __stdcall mysql_FetchRow()
+{
+ if (!result)
+ result = mysql_store_result(mysql);
+ row = mysql_fetch_row(result);
+ return (int) row;
+}
+
+char *__stdcall mysql_FetchField(int i)
+{
+ if (i >= mysql_num_fields(result))
+ return NULL;
+ else
+ return row[i];
+}
diff --git a/src/mypasql.def b/src/mypasql.def
new file mode 100644
index 000000000..f04df9556
--- /dev/null
+++ b/src/mypasql.def
@@ -0,0 +1,10 @@
+EXPORTS
+mysql_Connect
+mysql_Error
+mysql_SelectDb
+mysql_Query
+mysql_NumRows
+mysql_NumFields
+mysql_LoadFromFile
+mysql_FetchRow
+mysql_FetchField
diff --git a/src/mysql.c b/src/mysql.c
new file mode 100644
index 000000000..c4db94252
--- /dev/null
+++ b/src/mysql.c
@@ -0,0 +1,2058 @@
+
+/* MySQL functions.
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+#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 */
+
+int mysql_is_connected = 0; /* Are we currently connected? */
+
+/*************************************************************************/
+
+/* Throw a mysql error into the logs. If severity is MYSQL_ERROR, we
+ * also exit Anope...
+ */
+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);
+ }
+
+}
+
+/*************************************************************************/
+
+/* Initialize the MySQL code */
+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.");
+ return 0;
+ } else {
+ do_mysql = 1;
+ alog("MySQL: has been enabled.");
+ alog("MySQL: client version %s.", mysql_get_client_info());
+ }
+
+ /* The following configuration options are required.
+ * If missing disable MySQL to avoid any problems.
+ */
+
+ if ((do_mysql) && (!MysqlName || !MysqlUser)) {
+ do_mysql = 0;
+ alog("MySQL Error: Set all required configuration options.");
+ return 0;
+ }
+
+ if (!db_mysql_open()) {
+ do_mysql = 0;
+ return 0;
+ }
+
+ return 1;
+}
+
+/*************************************************************************/
+
+/* Open a connection to the mysql database. Return 0 on failure, or
+ * 1 on success. If this succeeds, we're guaranteed of a working
+ * mysql connection (unless something unexpected happens ofcourse...)
+ */
+int db_mysql_open()
+{
+ /* If MySQL is disabled, return 0 */
+ if (!do_mysql)
+ return 0;
+
+ /* If we are reported to be connected, ping MySQL to see if we really are
+ * still connected. (yes mysql_ping() returns 0 on success)
+ */
+ if (mysql_is_connected && !mysql_ping(mysql))
+ return 1;
+
+ mysql_is_connected = 0;
+
+ mysql = mysql_init(NULL);
+ if (mysql == NULL) {
+ db_mysql_error(MYSQL_WARNING, "Unable to create mysql object");
+ return 0;
+ }
+
+ if (!MysqlPort)
+ MysqlPort = MYSQL_DEFAULT_PORT;
+
+ if (!mysql_real_connect(mysql, MysqlHost, MysqlUser, MysqlPass, MysqlName, MysqlPort, MysqlSock, 0)) {
+ log_perror("MySQL Error: Cant connect to MySQL: %s\n", mysql_error(mysql));
+ return 0;
+ }
+
+ mysql_is_connected = 1;
+
+ return 1;
+
+}
+
+
+/*************************************************************************/
+
+/* Perform a MySQL query. Return 1 if the query succeeded and 0 if the
+ * query failed. Before returning failure, re-try the query a few times
+ * and die if it still fails.
+ */
+int db_mysql_query(char *sql)
+{
+ int lcv;
+
+ if (!do_mysql)
+ return 0;
+
+ if (debug)
+ alog("debug: MySQL: %s", sql);
+
+ /* Try as many times as configured in MysqlRetries */
+ for (lcv = 0; lcv < MysqlRetries; lcv++) {
+ if (db_mysql_open() && (mysql_query(mysql, sql) == 0))
+ return 1;
+
+ /* If we get here, we could not run the query */
+ log_perror("Unable to run query: %s\n", mysql_error(mysql));
+
+ /* Wait for MysqlRetryGap seconds and try again */
+ sleep(MysqlRetryGap);
+ }
+
+ /* Unable to run the query even after MysqlRetries tries */
+ db_mysql_error(MYSQL_WARNING, "query");
+
+ return 0;
+
+}
+
+/*************************************************************************/
+
+/* Quote a string to be safely included in a query. The result of this
+ * function is allocated; it MUST be freed by the caller.
+ */
+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;
+
+}
+
+/**
+ * Quote a buffer to be safely included in a query.
+ * The result is allocated and needs to be freed by caller.
+ **/
+char *db_mysql_quote_buffer(char *sql, int size)
+{
+ char *ret;
+ ret = scalloc((1 + 2 * size), sizeof(char));
+
+ mysql_real_escape_string(mysql, ret, sql, size);
+
+ return ret;
+}
+
+/*************************************************************************/
+
+/* Close the MySQL database connection. */
+int db_mysql_close()
+{
+ mysql_close(mysql);
+
+ mysql_is_connected = 0;
+
+ return 1;
+}
+
+/*************************************************************************/
+
+/* Try to execute a query and issue a warning when failed. Return 1 on
+ * success and 0 on failure.
+ */
+int db_mysql_try(const char *fmt, ...)
+{
+ va_list args;
+ static char sql[MAX_SQL_BUF];
+
+ va_start(args, fmt);
+ vsnprintf(sql, MAX_SQL_BUF, fmt, args);
+ va_end(args);
+
+ if (!db_mysql_query(sql)) {
+ log_perror("Can't create sql query: %s", sql);
+ db_mysql_error(MYSQL_WARNING, "query");
+ return 0;
+ }
+
+ return 1;
+}
+
+/*************************************************************************/
+
+/**
+ * Returns a string (buffer) to insert into a SQL query.
+ * The string will, once evaluated by MySQL, result in the given pass
+ * encoded in the encryption type selected for MysqlSecure
+ *
+ * This should be removed since Rob properly did encryption modules... -GD
+ *
+ * @param dest Destination buffer to store the password/ encryption string in. Needs to be at least size+14.
+ * @param pass The buffer containing the password to secure.
+ * @param bufsize The size of the destination buffer.
+ * @param size The size of the password-to-secure buffer.
+ * @return Returns -1 on failure, 1 if the result needs to be made MySQL safe (hash), 0 if it s ready.
+ **/
+int db_mysql_secure(char *dest, char *pass, int bufsize, int size)
+{
+ char tmp_pass[PASSMAX];
+
+ if (bufsize < size+14)
+ return -1;
+
+ /* Initialize the buffer. Bug #86 */
+ memset(tmp_pass, 0, PASSMAX);
+ memset(dest, 0, bufsize);
+
+ /* Return all zeros if no pass is set. */
+ if (!pass)
+ return 1;
+
+ /* We couldnt decrypt the pass... */
+ if (enc_decrypt(pass, tmp_pass, PASSMAX - 1) != 1) {
+ memcpy(dest, pass, size);
+ return 1;
+ } else { /* if we could decrypt the pass */
+ if ((!MysqlSecure) || (strcmp(MysqlSecure, "") == 0)) {
+ snprintf(dest, bufsize, "'%s'", tmp_pass);
+ } else if (strcmp(MysqlSecure, "des") == 0) {
+ snprintf(dest, bufsize, "ENCRYPT('%s')", tmp_pass);
+ } else if (strcmp(MysqlSecure, "md5") == 0) {
+ snprintf(dest, bufsize, "MD5('%s')", tmp_pass);
+ } else if (strcmp(MysqlSecure, "sha") == 0) {
+ snprintf(dest, bufsize, "SHA('%s')", tmp_pass);
+ } else {
+ snprintf(dest, bufsize, "ENCODE('%s','%s')", tmp_pass,
+ MysqlSecure);
+ }
+ }
+
+ return 0;
+}
+
+/*************************************************************************/
+
+/*
+ * NickServ Specific Secion
+ */
+
+/*************************************************************************/
+
+/* Save the given NickRequest into the database
+ * Return 1 on success, 0 on failure
+ * These tables are tagged and will be cleaned:
+ * - anope_ns_request
+ */
+int db_mysql_save_ns_req(NickRequest * nr)
+{
+ int ret;
+ char *q_nick, *q_passcode, *q_password, *q_email;
+
+ q_nick = db_mysql_quote(nr->nick);
+ q_passcode = db_mysql_quote(nr->passcode);
+ q_password = db_mysql_quote_buffer(nr->password, PASSMAX);
+ q_email = db_mysql_quote(nr->email);
+
+ ret = db_mysql_try("UPDATE anope_ns_request "
+ "SET passcode = '%s', password = '%s', email = '%s', requested = %d, active = 1 "
+ "WHERE nick = '%s'",
+ q_passcode, q_password, q_email, (int) nr->requested,
+ q_nick);
+
+ if (ret && (mysql_affected_rows(mysql) == 0)) {
+ ret = db_mysql_try("INSERT DELAYED INTO anope_ns_request "
+ "(nick, passcode, password, email, requested, active) "
+ "VALUES ('%s', '%s', '%s', '%s', %d, 1)",
+ q_nick, q_passcode, q_password, q_email,
+ (int) nr->requested);
+ }
+
+ free(q_nick);
+ free(q_passcode);
+ free(q_password);
+ free(q_email);
+
+ return ret;
+}
+
+/*************************************************************************/
+
+/* Save the given NickCore into the database
+ * Also save the access list and memo's for this user
+ * Return 1 on success, 0 on failure
+ * These tables are tagged and will be cleaned:
+ * - anope_ns_core
+ * - anope_ns_alias
+ * - anope_ns_access
+ * - anope_ms_info (serv='NICK')
+ */
+int db_mysql_save_ns_core(NickCore * nc)
+{
+ int ret, res;
+ int i;
+ char epass[PASSMAX+15];
+ char *q_display, *q_pass = NULL, *q_email, *q_greet, *q_url,
+ *q_access, *q_sender, *q_text;
+
+ q_display = db_mysql_quote(nc->display);
+ q_email = db_mysql_quote(nc->email);
+ q_greet = db_mysql_quote(nc->greet);
+ q_url = db_mysql_quote(nc->url);
+
+ /* First secure the pass, then make it MySQL safe.. - Viper */
+ res = db_mysql_secure(epass, nc->pass, PASSMAX+15, PASSMAX);
+ if (res < 0)
+ fatal("Unable to encrypt password for MySQL");
+ else if (res)
+ q_pass = db_mysql_quote_buffer(epass, PASSMAX+15);
+ else {
+ q_pass = scalloc(PASSMAX+15,sizeof(char));
+ memcpy(q_pass, epass, PASSMAX+15);
+ }
+
+ /* If it has been made MySQL safe, it still needs the 's.
+ * I know it s an ugly solution, but it works without breaking anything.. - Viper */
+ /* Let's take care of the core itself */
+ /* Update the existing records */
+ if (res)
+ ret = db_mysql_try("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'",
+ q_pass, q_email, q_greet, nc->icq, q_url, nc->flags,
+ nc->language, nc->accesscount, nc->memos.memocount,
+ nc->memos.memomax, nc->channelcount, nc->channelmax,
+ q_display);
+ else
+ ret = db_mysql_try("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'",
+ q_pass, q_email, q_greet, nc->icq, q_url, nc->flags,
+ nc->language, nc->accesscount, nc->memos.memocount,
+ nc->memos.memomax, nc->channelcount, nc->channelmax,
+ q_display);
+
+ /* Our previous UPDATE affected no rows, therefore this is a new record */
+ if (ret && (mysql_affected_rows(mysql) == 0)) {
+ if (res)
+ ret = db_mysql_try("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)",
+ q_display, q_pass, q_email, q_greet, nc->icq, q_url,
+ nc->flags, nc->language, nc->accesscount,
+ nc->memos.memocount, nc->memos.memomax,
+ nc->channelcount, nc->channelmax);
+ else
+ ret = db_mysql_try("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)",
+ q_display, q_pass, q_email, q_greet, nc->icq, q_url,
+ nc->flags, nc->language, nc->accesscount,
+ nc->memos.memocount, nc->memos.memomax,
+ nc->channelcount, nc->channelmax);
+ }
+
+ /* Now let's do the access */
+ for (i = 0; ret && (i < nc->accesscount); i++) {
+ q_access = db_mysql_quote(nc->access[i]);
+/**
+ ret = db_mysql_try("UPDATE anope_ns_access "
+ "SET access = '%s' "
+ "WHERE display = '%s'",
+ q_access, q_display);
+
+ if (ret && (mysql_affected_rows(mysql) == 0)) {**/
+
+ ret = db_mysql_try("INSERT DELAYED INTO anope_ns_access "
+ "(display, access) "
+ "VALUES ('%s','%s')",
+ q_display, q_access);
+/* } */
+
+ free(q_access);
+ }
+
+ /* Memos */
+ for (i = 0; ret && (i < nc->memos.memocount); i++) {
+ q_sender = db_mysql_quote(nc->memos.memos[i].sender);
+ q_text = db_mysql_quote(nc->memos.memos[i].text);
+
+ ret = db_mysql_try("UPDATE anope_ms_info "
+ "SET receiver = '%s', number = %d, flags = %d, time = %d, sender = '%s', text = '%s', active = 1 "
+ "WHERE nm_id = %d AND serv = 'NICK'",
+ q_display, nc->memos.memos[i].number,
+ nc->memos.memos[i].flags,
+ (int) nc->memos.memos[i].time, q_sender, q_text,
+ nc->memos.memos[i].id);
+
+ if (ret && (mysql_affected_rows(mysql) == 0)) {
+ ret = db_mysql_try("INSERT INTO anope_ms_info "
+ "(receiver, number, flags, time, sender, text, serv, active) "
+ "VALUES ('%s', %d, %d, %d, '%s', '%s', 'NICK', 1)",
+ q_display, nc->memos.memos[i].number,
+ nc->memos.memos[i].flags,
+ (int) nc->memos.memos[i].time, q_sender,
+ q_text);
+
+ /* This is to make sure we can UPDATE memos instead of TRUNCATE
+ * the table each time and then INSERT them all again. Ideally
+ * everything in core would have it's dbase-id stored, but that's
+ * something for phase 3. -GD
+ */
+ if (ret)
+ nc->memos.memos[i].id = mysql_insert_id(mysql);
+ }
+
+ free(q_sender);
+ free(q_text);
+ }
+
+ free(q_display);
+ free(q_pass);
+ free(q_email);
+ free(q_greet);
+ free(q_url);
+
+ return ret;
+}
+
+
+/*************************************************************************/
+
+/* Save the given NickAlias into the database
+ * Return 1 on success, 0 on failure
+ * These tables are tagged and will be cleaned:
+ * - anope_ns_core
+ * - anope_ns_alias
+ * - anope_ns_access
+ * - anope_ms_info (serv='NICK')
+ */
+int db_mysql_save_ns_alias(NickAlias * na)
+{
+ int ret;
+ char *q_nick, *q_lastmask, *q_lastrname, *q_lastquit, *q_display;
+
+ q_nick = db_mysql_quote(na->nick);
+ q_lastmask = db_mysql_quote(na->last_usermask);
+ q_lastrname = db_mysql_quote(na->last_realname);
+ q_lastquit = db_mysql_quote(na->last_quit);
+ q_display = db_mysql_quote(na->nc->display);
+
+ ret = db_mysql_try("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'",
+ q_lastmask, q_lastrname, q_lastquit,
+ (int) na->time_registered, (int) na->last_seen,
+ (int) na->status, q_display, q_nick);
+
+ /* Our previous UPDATE affected no rows, therefore this is a new record */
+ if (ret && (mysql_affected_rows(mysql) == 0)) {
+ ret = db_mysql_try("INSERT DELAYED 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)",
+ q_nick, q_lastmask, q_lastrname, q_lastquit,
+ (int) na->time_registered, (int) na->last_seen,
+ (int) na->status, q_display);
+ }
+
+ free(q_nick);
+ free(q_lastmask);
+ free(q_lastrname);
+ free(q_lastquit);
+ free(q_display);
+
+ return ret;
+}
+
+/*************************************************************************/
+
+/*
+ * ChanServ Specific Secion
+ */
+
+/*************************************************************************/
+
+/* Save the given ChannelInfo into the database
+ * Also save the access list, levels, akicks, badwords, ttb, and memo's for this channel
+ * Return 1 on success, 0 on failure
+ * These tables are tagged and will be cleaned:
+ * - anope_cs_info
+ * - anope_cs_access
+ * - anope_cs_levels
+ * - anope_cs_akicks
+ * - anope_cs_badwords
+ * - anope_cs_ttb
+ * - anope_ms_info (serv='CHAN')
+ */
+int db_mysql_save_cs_info(ChannelInfo * ci)
+{
+ int ret, res, i;
+ char epass[PASSMAX+15];
+ char *q_name;
+ char *q_founder;
+ char *q_successor;
+ char *q_pass = NULL;
+ char *q_desc;
+ char *q_url;
+ char *q_email;
+ char *q_lasttopic;
+ char *q_lasttopicsetter;
+ char *q_forbidby;
+ char *q_forbidreason;
+ char *q_mlock_key;
+ char *q_mlock_flood;
+ char *q_mlock_redirect;
+ char *q_entrymsg;
+ char *q_botnick;
+ char *q_sender;
+ char *q_text;
+ char *q_accessdisp;
+ char *q_akickdisp;
+ char *q_akickreason;
+ char *q_akickcreator;
+ char *q_badwords;
+
+ q_name = db_mysql_quote(ci->name);
+ if (ci->founder) {
+ q_founder = db_mysql_quote(ci->founder->display);
+ } else {
+ q_founder = db_mysql_quote("");
+ }
+ if (ci->successor) {
+ q_successor = db_mysql_quote(ci->successor->display);
+ } else {
+ q_successor = db_mysql_quote("");
+ }
+ q_desc = db_mysql_quote(ci->desc);
+ q_url = db_mysql_quote(ci->url);
+ q_email = db_mysql_quote(ci->email);
+ q_lasttopic = db_mysql_quote(ci->last_topic);
+ q_lasttopicsetter = db_mysql_quote(ci->last_topic_setter);
+ q_forbidby = db_mysql_quote(ci->forbidby);
+ q_forbidreason = db_mysql_quote(ci->forbidreason);
+ q_mlock_key = db_mysql_quote(ci->mlock_key);
+ q_mlock_flood = db_mysql_quote(ci->mlock_flood);
+ q_mlock_redirect = db_mysql_quote(ci->mlock_redirect);
+ q_entrymsg = db_mysql_quote(ci->entry_message);
+ if (ci->bi) {
+ q_botnick = db_mysql_quote(ci->bi->nick);
+ } else {
+ q_botnick = db_mysql_quote("");
+ }
+
+ /* First secure the pass, then make it MySQL safe.. - Viper */
+ res = db_mysql_secure(epass, ci->founderpass, PASSMAX+15, PASSMAX);
+ if (res < 0)
+ fatal("Unable to encrypt password for MySQL");
+ else if (res)
+ q_pass = db_mysql_quote_buffer(epass, PASSMAX+15);
+ else {
+ q_pass = scalloc(PASSMAX+15,sizeof(char));
+ memcpy(q_pass, epass, PASSMAX+15);
+ }
+
+ /* If it has been made MySQL safe, it still needs the 's.
+ * I know it s an ugly solution, but it works without breaking anything.. - Viper */
+ /* Let's take care of the core itself */
+ if (res)
+ ret = db_mysql_try("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, "
+ " bwcount = %d, capsmin = %d, capspercent = %d, floodlines = %d, floodsecs = %d, repeattimes = %d, active = 1 "
+ "WHERE name = '%s'",
+ q_founder, q_successor, q_pass, q_desc, q_url, q_email,
+ (int) ci->time_registered, (int) ci->last_used,
+ q_lasttopic, q_lasttopicsetter,
+ (int) ci->last_topic_time, (int) ci->flags, q_forbidby,
+ q_forbidreason, (int) ci->bantype,
+ (int) ci->accesscount, (int) ci->akickcount,
+ (int) ci->mlock_on, (int) ci->mlock_off,
+ (int) ci->mlock_limit, q_mlock_key, q_mlock_flood,
+ q_mlock_redirect, q_entrymsg, (int) ci->memos.memomax,
+ q_botnick, (int) ci->botflags, (int) ci->bwcount,
+ (int) ci->capsmin, (int) ci->capspercent,
+ (int) ci->floodlines, (int) ci->floodsecs,
+ (int) ci->repeattimes, q_name);
+ else
+ ret = db_mysql_try("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, "
+ " bwcount = %d, capsmin = %d, capspercent = %d, floodlines = %d, floodsecs = %d, repeattimes = %d, active = 1 "
+ "WHERE name = '%s'",
+ q_founder, q_successor, q_pass, q_desc, q_url, q_email,
+ (int) ci->time_registered, (int) ci->last_used,
+ q_lasttopic, q_lasttopicsetter,
+ (int) ci->last_topic_time, (int) ci->flags, q_forbidby,
+ q_forbidreason, (int) ci->bantype,
+ (int) ci->accesscount, (int) ci->akickcount,
+ (int) ci->mlock_on, (int) ci->mlock_off,
+ (int) ci->mlock_limit, q_mlock_key, q_mlock_flood,
+ q_mlock_redirect, q_entrymsg, (int) ci->memos.memomax,
+ q_botnick, (int) ci->botflags, (int) ci->bwcount,
+ (int) ci->capsmin, (int) ci->capspercent,
+ (int) ci->floodlines, (int) ci->floodsecs,
+ (int) ci->repeattimes, q_name);
+
+ /* Our previous UPDATE affected no rows, therefore this is a new record */
+ if (ret && (mysql_affected_rows(mysql) == 0)) {
+ if (res)
+ ret = db_mysql_try("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)",
+ q_name, q_founder, q_successor, q_pass, q_desc,
+ q_url, q_email, (int) ci->time_registered,
+ (int) ci->last_used, q_lasttopic,
+ q_lasttopicsetter, (int) ci->last_topic_time,
+ (int) ci->flags, q_forbidby, q_forbidreason,
+ (int) ci->bantype, (int) ci->accesscount,
+ (int) ci->akickcount, (int) ci->mlock_on,
+ (int) ci->mlock_off, (int) ci->mlock_limit,
+ q_mlock_key, q_mlock_flood, q_mlock_redirect,
+ q_entrymsg, q_botnick, (int) ci->botflags,
+ (int) ci->bwcount, (int) ci->capsmin,
+ (int) ci->capspercent, (int) ci->floodlines,
+ (int) ci->floodsecs, (int) ci->repeattimes);
+ else
+ ret = db_mysql_try("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)",
+ q_name, q_founder, q_successor, q_pass, q_desc,
+ q_url, q_email, (int) ci->time_registered,
+ (int) ci->last_used, q_lasttopic,
+ q_lasttopicsetter, (int) ci->last_topic_time,
+ (int) ci->flags, q_forbidby, q_forbidreason,
+ (int) ci->bantype, (int) ci->accesscount,
+ (int) ci->akickcount, (int) ci->mlock_on,
+ (int) ci->mlock_off, (int) ci->mlock_limit,
+ q_mlock_key, q_mlock_flood, q_mlock_redirect,
+ q_entrymsg, q_botnick, (int) ci->botflags,
+ (int) ci->bwcount, (int) ci->capsmin,
+ (int) ci->capspercent, (int) ci->floodlines,
+ (int) ci->floodsecs, (int) ci->repeattimes);
+ }
+
+ /* Memos */
+ for (i = 0; ret && (i < ci->memos.memocount); i++) {
+ q_sender = db_mysql_quote(ci->memos.memos[i].sender);
+ q_text = db_mysql_quote(ci->memos.memos[i].text);
+
+ ret = db_mysql_try("UPDATE anope_ms_info "
+ "SET receiver = '%s', number = %d, flags = %d, time = %d, sender = '%s', text = '%s', active = 1 "
+ "WHERE nm_id = %d AND serv = 'CHAN'",
+ q_name, ci->memos.memos[i].number,
+ ci->memos.memos[i].flags,
+ (int) ci->memos.memos[i].time, q_sender, q_text,
+ ci->memos.memos[i].id);
+
+ if (ret && (mysql_affected_rows(mysql) == 0)) {
+ ret = db_mysql_try("INSERT INTO anope_ms_info "
+ "(receiver, number,flags, time, sender, text, serv, active) "
+ "VALUES ('%s', %d, %d, %d, '%s', '%s', 'CHAN', 1)",
+ q_name, ci->memos.memos[i].number,
+ ci->memos.memos[i].flags,
+ (int) ci->memos.memos[i].time, q_sender,
+ q_text);
+
+ /* See comment at db_mysql_save_ns_core */
+ if (ret)
+ ci->memos.memos[i].id = mysql_insert_id(mysql);
+ }
+
+ free(q_sender);
+ free(q_text);
+ }
+
+ /* Access */
+ for (i = 0; ret && (i < ci->accesscount); i++) {
+ if (ci->access[i].in_use) {
+ q_accessdisp = db_mysql_quote(ci->access[i].nc->display);
+
+ ret = db_mysql_try("UPDATE anope_cs_access "
+ "SET in_use = %d, level = %d, last_seen = %d, active = 1 "
+ "WHERE channel = '%s' AND display = '%s'",
+ (int) ci->access[i].in_use,
+ (int) ci->access[i].level,
+ (int) ci->access[i].last_seen,
+ q_name, q_accessdisp);
+
+ if (ret && (mysql_affected_rows(mysql) == 0)) {
+ ret = db_mysql_try("INSERT DELAYED INTO anope_cs_access "
+ "(channel, display, in_use, level, last_seen, active) "
+ "VALUES ('%s', '%s', %d, %d, %d, 1)",
+ q_name, q_accessdisp,
+ (int) ci->access[i].in_use,
+ (int) ci->access[i].level,
+ (int) ci->access[i].last_seen);
+ }
+
+ free(q_accessdisp);
+ }
+ }
+
+ /* Levels */
+ for (i = 0; ret && (i < CA_SIZE); i++) {
+ ret = db_mysql_try("UPDATE anope_cs_levels "
+ "SET level = %d, active = 1 "
+ "WHERE channel = '%s' AND position = %d",
+ (int) ci->levels[i], q_name, i);
+
+ if (ret && (mysql_affected_rows(mysql) == 0)) {
+ ret = db_mysql_try("INSERT DELAYED INTO anope_cs_levels "
+ "(channel, position, level, active) "
+ "VALUES ('%s', %d, %d, 1)",
+ q_name, i, (int) ci->levels[i]);
+ }
+ }
+
+ /* Akicks */
+ for (i = 0; ret && (i < ci->akickcount); i++) {
+ if (ci->akick[i].flags & AK_USED) {
+ if (ci->akick[i].flags & AK_ISNICK)
+ q_akickdisp = db_mysql_quote(ci->akick[i].u.nc->display);
+ else
+ q_akickdisp = db_mysql_quote(ci->akick[i].u.mask);
+
+ q_akickreason = db_mysql_quote(ci->akick[i].reason);
+ q_akickcreator = db_mysql_quote(ci->akick[i].creator);
+ } else {
+ q_akickdisp = "";
+ q_akickreason = "";
+ q_akickcreator = "";
+ }
+
+ ret = db_mysql_try("UPDATE anope_cs_akicks "
+ "SET flags = %d, reason = '%s', creator = '%s', addtime = %d, active = 1 "
+ "WHERE channel = '%s' AND dmask = '%s'",
+ (int) ci->akick[i].flags, q_akickreason,
+ q_akickcreator, (ci->akick[i].flags & AK_USED ?
+ (int) ci->akick[i].addtime : 0),
+ q_name, q_akickdisp);
+
+ if (ret && (mysql_affected_rows(mysql) == 0)) {
+ ret = db_mysql_try("INSERT DELAYED INTO anope_cs_akicks "
+ "(channel, dmask, flags, reason, creator, addtime, active) "
+ "VALUES ('%s', '%s', %d, '%s', '%s', %d, 1)",
+ q_name, q_akickdisp, (int) ci->akick[i].flags,
+ q_akickreason, q_akickcreator,
+ (ci->akick[i].flags & AK_USED ?
+ (int) ci->akick[i].addtime : 0));
+ }
+
+ if (ci->akick[i].flags & AK_USED) {
+ free(q_akickdisp);
+ free(q_akickreason);
+ free(q_akickcreator);
+ }
+ }
+
+ /* Bad Words */
+ for (i = 0; ret && (i < ci->bwcount); i++) {
+ if (ci->badwords[i].in_use) {
+ q_badwords = db_mysql_quote(ci->badwords[i].word);
+
+ ret = db_mysql_try("UPDATE anope_cs_badwords "
+ "SET type = %d, active = 1 "
+ "WHERE channel = '%s' AND word = '%s'",
+ (int) ci->badwords[i].type, q_name,
+ q_badwords);
+
+ if (ret && (mysql_affected_rows(mysql) == 0)) {
+ ret = db_mysql_try("INSERT DELAYED INTO anope_cs_badwords "
+ "(channel, word, type, active) "
+ "VALUES ('%s', '%s', %d, 1)",
+ q_name, q_badwords,
+ (int) ci->badwords[i].type);
+ }
+
+ free(q_badwords);
+ }
+ }
+
+ /* TTB's */
+ for (i = 0; ret && (i < TTB_SIZE); i++) {
+ ret = db_mysql_try("UPDATE anope_cs_ttb "
+ "SET value = %d, active = 1 "
+ "WHERE channel = '%s' AND ttb_id = %d",
+ ci->ttb[i], q_name, i);
+
+ if (ret && (mysql_affected_rows(mysql) == 0)) {
+ ret = db_mysql_try("INSERT DELAYED INTO anope_cs_ttb "
+ "(channel, ttb_id, value, active) "
+ "VALUES ('%s', %d, %d, 1)",
+ q_name, i, ci->ttb[i]);
+ }
+ }
+
+ free(q_name);
+ free(q_founder);
+ free(q_successor);
+ free(q_pass);
+ free(q_desc);
+ free(q_url);
+ free(q_email);
+ free(q_lasttopic);
+ free(q_lasttopicsetter);
+ free(q_mlock_key);
+ free(q_mlock_flood);
+ free(q_mlock_redirect);
+ free(q_entrymsg);
+ free(q_botnick);
+ free(q_forbidby);
+ free(q_forbidreason);
+
+ return ret;
+}
+
+/*************************************************************************/
+
+
+/*
+ * OperServ Specific Section
+ */
+
+/*************************************************************************/
+
+/* Save the OperServ database into MySQL
+ * Return 1 on success, 0 on failure
+ * These tables are tagged and will be cleaned:
+ * - anope_os_akills
+ * - anope_os_sglines
+ * - anope_os_sqlines
+ * - anope_os_szlines
+ * These tables are emptied:
+ * - anope_os_core
+ */
+
+int db_mysql_save_os_db(unsigned int maxucnt, unsigned int maxutime,
+ SList * ak, SList * sgl, SList * sql, SList * szl)
+{
+ int ret;
+ int i;
+ Akill *akl;
+ SXLine *sl;
+ char *q_user;
+ char *q_host;
+ char *q_mask;
+ char *q_by;
+ char *q_reason;
+
+
+ /* First save the core info */
+ ret = db_mysql_try("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);
+
+ /* Next save all AKILLs */
+ for (i = 0; ret && (i < ak->count); i++) {
+ akl = ak->list[i];
+ q_user = db_mysql_quote(akl->user);
+ q_host = db_mysql_quote(akl->host);
+ q_by = db_mysql_quote(akl->by);
+ q_reason = db_mysql_quote(akl->reason);
+
+ ret = db_mysql_try("UPDATE anope_os_akills "
+ "SET xby = '%s', reason = '%s', seton = %d, expire = %d, active = 1 "
+ "WHERE user = '%s' AND host = '%s'",
+ q_by, q_reason, (int) akl->seton,
+ (int) akl->expires, q_user, q_host);
+
+ if (ret && (mysql_affected_rows(mysql) == 0)) {
+ ret = db_mysql_try("INSERT DELAYED INTO anope_os_akills "
+ "(user, host, xby, reason, seton, expire, active) "
+ "VALUES ('%s', '%s', '%s', '%s', %d, %d, 1)",
+ q_user, q_host, q_by, q_reason,
+ (int) akl->seton, (int) akl->expires);
+ }
+
+ free(q_user);
+ free(q_host);
+ free(q_by);
+ free(q_reason);
+ }
+
+ /* Time to save the SGLINEs */
+ for (i = 0; ret && (i < sgl->count); i++) {
+ sl = sgl->list[i];
+ q_mask = db_mysql_quote(sl->mask);
+ q_by = db_mysql_quote(sl->by);
+ q_reason = db_mysql_quote(sl->reason);
+
+ ret = db_mysql_try("UPDATE anope_os_sglines "
+ "SET xby = '%s', reason = '%s', seton = %d, expire = %d, active = 1 "
+ "WHERE mask = '%s'",
+ q_by, q_reason, (int) sl->seton, (int) sl->expires,
+ q_mask);
+
+ if (ret && (mysql_affected_rows(mysql) == 0)) {
+ ret = db_mysql_try("INSERT DELAYED INTO anope_os_sglines "
+ "(mask, xby, reason, seton, expire, active) "
+ "VALUES ('%s', '%s', '%s', %d, %d, 1)",
+ q_mask, q_by, q_reason, (int) sl->seton,
+ (int) sl->expires);
+ }
+
+ free(q_mask);
+ free(q_by);
+ free(q_reason);
+ }
+
+ /* Save the SQLINEs */
+ for (i = 0; ret && (i < sql->count); i++) {
+ sl = sql->list[i];
+
+ q_mask = db_mysql_quote(sl->mask);
+ q_by = db_mysql_quote(sl->by);
+ q_reason = db_mysql_quote(sl->reason);
+
+ ret = db_mysql_try("UPDATE anope_os_sqlines "
+ "SET xby = '%s', reason = '%s', seton = %d, expire = %d, active = 1 "
+ "WHERE mask = '%s'",
+ q_by, q_reason, (int) sl->seton, (int) sl->expires,
+ q_mask);
+
+ if (ret && (mysql_affected_rows(mysql) == 0)) {
+ ret = db_mysql_try("INSERT DELAYED INTO anope_os_sqlines "
+ "(mask, xby, reason, seton, expire, active) "
+ "VALUES ('%s', '%s', '%s', %d, %d, 1)",
+ q_mask, q_by, q_reason, (int) sl->seton,
+ (int) sl->expires);
+ }
+
+ free(q_mask);
+ free(q_by);
+ free(q_reason);
+ }
+
+ /* Now save the SZLINEs */
+ for (i = 0; ret && (i < szl->count); i++) {
+ sl = szl->list[i];
+
+ q_mask = db_mysql_quote(sl->mask);
+ q_by = db_mysql_quote(sl->by);
+ q_reason = db_mysql_quote(sl->reason);
+
+ ret = db_mysql_try("UPDATE anope_os_szlines "
+ "SET xby = '%s', reason = '%s', seton = %d, expire = %d, active = 1 "
+ "WHERE mask = '%s'",
+ q_by, q_reason, (int) sl->seton, (int) sl->expires,
+ q_mask);
+
+ if (ret && (mysql_affected_rows(mysql) == 0)) {
+ ret = db_mysql_try("INSERT DELAYED INTO anope_os_szlines "
+ "(mask, xby, reason, seton, expire, active) "
+ "VALUES ('%s', '%s', '%s', %d, %d, 1)",
+ q_mask, q_by, q_reason, (int) sl->seton,
+ (int) sl->expires);
+ }
+
+ free(q_mask);
+ free(q_by);
+ free(q_reason);
+ }
+
+ return ret;
+}
+
+/*************************************************************************/
+
+/* Save the given NewsItem
+ * These tables are tagged and will be cleaned:
+ * - anope_os_news
+ */
+int db_mysql_save_news(NewsItem * ni)
+{
+ int ret;
+ char *q_text;
+ char *q_who;
+
+ q_text = db_mysql_quote(ni->text);
+ q_who = db_mysql_quote(ni->who);
+
+ ret = db_mysql_try("UPDATE anope_os_news "
+ "SET ntext = '%s', who = '%s', active = 1 "
+ "WHERE type = %d AND num = %d AND `time` = %d",
+ q_text, q_who, ni->type, ni->num, (int) ni->time);
+
+ if (ret && (mysql_affected_rows(mysql) == 0)) {
+ ret = db_mysql_try("INSERT DELAYED INTO anope_os_news "
+ "(type, num, ntext, who, `time`, active) "
+ "VALUES (%d, %d, '%s', '%s', %d, 1)",
+ ni->type, ni->num, q_text, q_who, (int) ni->time);
+ }
+
+ free(q_text);
+ free(q_who);
+
+ return ret;
+}
+
+/*************************************************************************/
+
+/* Save the given Exception
+ * These tables are tagged and will be cleaned:
+ * - anope_os_exceptions
+ */
+
+int db_mysql_save_exceptions(Exception * e)
+{
+ int ret;
+ char *q_mask;
+ char *q_who;
+ char *q_reason;
+
+ q_mask = db_mysql_quote(e->mask);
+ q_who = db_mysql_quote(e->who);
+ q_reason = db_mysql_quote(e->reason);
+
+ ret = db_mysql_try("UPDATE anope_os_exceptions "
+ "SET lim = %d, who = '%s', reason = '%s', `time` = %d, expires = %d, active = 1 "
+ "WHERE mask = '%s'",
+ e->limit, q_who, q_reason, (int) e->time,
+ (int) e->expires, q_mask);
+
+ if (ret && (mysql_affected_rows(mysql)) == 0) {
+ ret = db_mysql_try("INSERT DELAYED INTO anope_os_exceptions "
+ "(mask, lim, who, reason, `time`, expires, active) "
+ "VALUES ('%s', %d, '%s', '%s', %d, %d, 1)",
+ q_mask, e->limit, q_who, q_reason, (int) e->time,
+ (int) e->expires);
+ }
+
+ free(q_mask);
+ free(q_who);
+ free(q_reason);
+
+ return ret;
+}
+
+/*************************************************************************/
+
+
+/*
+ * HostServ Specific Section
+ */
+
+/*************************************************************************/
+
+/* Save the given HostCore
+ * These tables are tagged and will be cleaned:
+ * - anope_hs_core
+ */
+
+int db_mysql_save_hs_core(HostCore * hc)
+{
+ int ret;
+ char *q_nick;
+ char *q_ident;
+ char *q_host;
+ char *q_creator;
+
+ q_nick = db_mysql_quote(hc->nick);
+ q_ident = db_mysql_quote(hc->vIdent);
+ q_host = db_mysql_quote(hc->vHost);
+ q_creator = db_mysql_quote(hc->creator);
+
+ ret = db_mysql_try("UPDATE anope_hs_core "
+ "SET vident = '%s', vhost = '%s', creator = '%s', `time` = %d, active = 1 "
+ "WHERE nick = '%s'",
+ q_ident, q_host, q_creator, (int) hc->time, q_nick);
+
+ if (ret && (mysql_affected_rows(mysql) == 0)) {
+ ret = db_mysql_try("INSERT DELAYED INTO anope_hs_core "
+ "(nick, vident, vhost, creator, `time`, active) "
+ "VALUES ('%s', '%s', '%s', '%s', %d, 1)",
+ q_nick, q_ident, q_host, q_creator,
+ (int) hc->time);
+ }
+
+ free(q_nick);
+ free(q_ident);
+ free(q_host);
+ free(q_creator);
+
+ return ret;
+}
+
+/*************************************************************************/
+
+/*
+ * BotServ Specific Section
+ */
+
+/*************************************************************************/
+
+int db_mysql_save_bs_core(BotInfo * bi)
+{
+ int ret;
+ char *q_nick;
+ char *q_user;
+ char *q_host;
+ char *q_real;
+
+ q_nick = db_mysql_quote(bi->nick);
+ q_user = db_mysql_quote(bi->user);
+ q_host = db_mysql_quote(bi->host);
+ q_real = db_mysql_quote(bi->real);
+
+ ret = db_mysql_try("UPDATE anope_bs_core "
+ "SET user = '%s', host = '%s', rname = '%s', flags = %d, created = %d, chancount = %d, active = 1 "
+ "WHERE nick = '%s'",
+ q_user, q_host, q_real, bi->flags, (int) bi->created,
+ bi->chancount, q_nick);
+
+ if (ret && (mysql_affected_rows(mysql) == 0)) {
+ ret = db_mysql_try("INSERT DELAYED INTO anope_bs_core "
+ "(nick, user, host, rname, flags, created, chancount, active) "
+ "VALUES ('%s', '%s', '%s', '%s', %d, %d, %d, 1)",
+ q_nick, q_user, q_host, q_real, bi->flags,
+ (int) bi->created, bi->chancount);
+ }
+
+ free(q_nick);
+ free(q_user);
+ free(q_host);
+ free(q_real);
+
+ return ret;
+}
+
+/*************************************************************************/
+/*************************************************************************/
+
+/* Some loading code! */
+
+/*************************************************************************/
+/*************************************************************************/
+
+int db_mysql_load_bs_dbase(void)
+{
+ int ret;
+ BotInfo *bi;
+
+ if (!do_mysql)
+ return 0;
+
+ ret = db_mysql_try("SELECT nick, user, host, rname, flags, created, chancount "
+ "FROM anope_bs_core "
+ "WHERE active = 1");
+
+ if (!ret)
+ return 0;
+
+ mysql_res = mysql_use_result(mysql);
+
+ while ((mysql_row = mysql_fetch_row(mysql_res))) {
+ bi = makebot(mysql_row[0]);
+ bi->user = sstrdup(mysql_row[1]);
+ bi->host = sstrdup(mysql_row[2]);
+ bi->real = sstrdup(mysql_row[3]);
+ bi->flags = strtol(mysql_row[4], (char **) NULL, 10);
+ bi->created = strtol(mysql_row[5], (char **) NULL, 10);
+ bi->chancount = strtol(mysql_row[6], (char **) NULL, 10);
+ }
+
+ mysql_free_result(mysql_res);
+
+ return 1;
+}
+
+int db_mysql_load_hs_dbase(void)
+{
+ int ret;
+ int32 time;
+
+ if (!do_mysql)
+ return 0;
+
+ ret = db_mysql_try("SELECT nick, vident, vhost, creator, `time` "
+ "FROM anope_hs_core "
+ "WHERE active = 1");
+
+ if (!ret)
+ return 0;
+
+ mysql_res = mysql_use_result(mysql);
+
+ while ((mysql_row = mysql_fetch_row(mysql_res))) {
+ time = strtol(mysql_row[4], (char **) NULL, 10);
+ addHostCore(mysql_row[0], mysql_row[1], mysql_row[2], mysql_row[3],
+ time);
+ }
+
+ mysql_free_result(mysql_res);
+
+ return 1;
+}
+
+int db_mysql_load_news(void)
+{
+ int ret;
+ int i;
+
+ if (!do_mysql)
+ return 0;
+
+ ret = db_mysql_try("SELECT type, num, ntext, who, `time` "
+ "FROM anope_os_news "
+ "WHERE active = 1");
+
+ if (!ret)
+ return 0;
+
+ mysql_res = mysql_store_result(mysql);
+
+ nnews = mysql_num_rows(mysql_res);
+ if (nnews < 8) /* 2^3 */
+ news_size = 16; /* 2^4 */
+ else if (nnews >= 16384) /* 2^14 */
+ news_size = 32767; /* 2^15 - 1 */
+ else
+ news_size = 2 * nnews;
+
+ news = scalloc(news_size, sizeof(*news));
+
+ i = 0;
+ while ((mysql_row = mysql_fetch_row(mysql_res))) {
+ news[i].type = strtol(mysql_row[0], (char **) NULL, 10);
+ news[i].num = strtol(mysql_row[1], (char **) NULL, 10);
+ news[i].text = sstrdup(mysql_row[2]);
+ snprintf(news[i].who, NICKMAX, "%s", mysql_row[3]);
+ news[i].time = strtol(mysql_row[4], (char **) NULL, 10);
+ i++;
+ }
+
+ mysql_free_result(mysql_res);
+
+ return 1;
+}
+
+int db_mysql_load_exceptions(void)
+{
+ int ret;
+ int i;
+
+ if (!do_mysql)
+ return 0;
+
+ ret = db_mysql_try("SELECT mask, lim, who, reason, `time`, expires "
+ "FROM anope_os_exceptions "
+ "WHERE active = 1");
+
+ if (!ret)
+ return 0;
+
+ mysql_res = mysql_store_result(mysql);
+ nexceptions = mysql_num_rows(mysql_res);
+ exceptions = scalloc(nexceptions, sizeof(Exception));
+
+ i = 0;
+ while ((mysql_row = mysql_fetch_row(mysql_res))) {
+ exceptions[i].mask = sstrdup(mysql_row[0]);
+ exceptions[i].limit = strtol(mysql_row[1], (char **) NULL, 10);
+ snprintf(exceptions[i].who, NICKMAX, "%s", mysql_row[2]);
+ exceptions[i].reason = sstrdup(mysql_row[3]);
+ exceptions[i].time = strtol(mysql_row[4], (char **) NULL, 10);
+ exceptions[i].expires = strtol(mysql_row[5], (char **) NULL, 10);
+ i++;
+ }
+
+ mysql_free_result(mysql_res);
+
+ return 1;
+}
+
+int db_mysql_load_os_dbase(void)
+{
+ int ret;
+ Akill *ak;
+ SXLine *sl;
+ int akc, sglc, sqlc, szlc;
+
+ if (!do_mysql)
+ return 0;
+
+ ret = db_mysql_try("SELECT maxusercnt, maxusertime, akills_count, sglines_count, sqlines_count, szlines_count "
+ "FROM anope_os_core");
+
+ if (!ret)
+ return 0;
+
+ mysql_res = mysql_use_result(mysql);
+
+ if ((mysql_row = mysql_fetch_row(mysql_res))) {
+ maxusercnt = strtol(mysql_row[0], (char **) NULL, 10);
+ maxusertime = strtol(mysql_row[1], (char **) NULL, 10);
+ /* I'm not too happy with the idea of storing thse counts in a field
+ * instead of just using mysql_num_rows on the actual tables when
+ * filling the data. For now this will do, but it's bound to give
+ * problems sooner or later... (it probably does if you are looking
+ * at this) -GD
+ */
+ akc = strtol(mysql_row[2], (char **) NULL, 10);
+ sglc = strtol(mysql_row[3], (char **) NULL, 10);
+ sqlc = strtol(mysql_row[4], (char **) NULL, 10);
+ szlc = strtol(mysql_row[5], (char **) NULL, 10);
+ } else {
+ maxusercnt = 0;
+ maxusertime = time(NULL);
+ akc = 0;
+ sglc = 0;
+ sqlc = 0;
+ szlc = 0;
+ }
+
+ mysql_free_result(mysql_res);
+
+
+ /* Load the AKILLs */
+
+ ret = db_mysql_try("SELECT user, host, xby, reason, seton, expire "
+ "FROM anope_os_akills "
+ "WHERE active = 1");
+
+ if (!ret)
+ return 0;
+
+ mysql_res = mysql_use_result(mysql);
+ slist_setcapacity(&akills, akc);
+
+ while ((mysql_row = mysql_fetch_row(mysql_res))) {
+ ak = scalloc(1, sizeof(Akill));
+ ak->user = sstrdup(mysql_row[0]);
+ ak->host = sstrdup(mysql_row[1]);
+ ak->by = sstrdup(mysql_row[2]);
+ ak->reason = sstrdup(mysql_row[3]);
+ ak->seton = strtol(mysql_row[4], (char **) NULL, 10);
+ ak->expires = strtol(mysql_row[5], (char **) NULL, 10);
+ slist_add(&akills, ak);
+ }
+
+ mysql_free_result(mysql_res);
+
+
+ /* Load the SGLINEs */
+
+ ret = db_mysql_try("SELECT mask, xby, reason, seton, expire "
+ "FROM anope_os_sglines "
+ "WHERE active = 1");
+
+ if (!ret)
+ return 0;
+
+ mysql_res = mysql_use_result(mysql);
+ slist_setcapacity(&sglines, sglc);
+
+ while ((mysql_row = mysql_fetch_row(mysql_res))) {
+ sl = scalloc(1, sizeof(SXLine));
+ sl->mask = sstrdup(mysql_row[0]);
+ sl->by = sstrdup(mysql_row[1]);
+ sl->reason = sstrdup(mysql_row[2]);
+ sl->seton = strtol(mysql_row[3], (char **) NULL, 10);
+ sl->expires = strtol(mysql_row[4], (char **) NULL, 10);
+ slist_add(&sglines, sl);
+ }
+
+ mysql_free_result(mysql_res);
+
+
+ /* Load the SQLINEs */
+
+ ret = db_mysql_try("SELECT mask, xby, reason, seton, expire "
+ "FROM anope_os_sqlines "
+ "WHERE active = 1");
+
+ if (!ret)
+ return 0;
+
+ mysql_res = mysql_use_result(mysql);
+ slist_setcapacity(&sqlines, sqlc);
+
+ while ((mysql_row = mysql_fetch_row(mysql_res))) {
+ sl = scalloc(1, sizeof(SXLine));
+ sl->mask = sstrdup(mysql_row[0]);
+ sl->by = sstrdup(mysql_row[1]);
+ sl->reason = sstrdup(mysql_row[2]);
+ sl->seton = strtol(mysql_row[3], (char **) NULL, 10);
+ sl->expires = strtol(mysql_row[4], (char **) NULL, 10);
+ slist_add(&sqlines, sl);
+ }
+
+ mysql_free_result(mysql_res);
+
+
+ /* Load the SZLINEs */
+
+ ret = db_mysql_try("SELECT mask, xby, reason, seton, expire "
+ "FROM anope_os_szlines "
+ "WHERE active = 1");
+
+ if (!ret)
+ return 0;
+
+ mysql_res = mysql_use_result(mysql);
+ slist_setcapacity(&szlines, szlc);
+
+ while ((mysql_row = mysql_fetch_row(mysql_res))) {
+ sl = scalloc(1, sizeof(SXLine));
+ sl->mask = sstrdup(mysql_row[0]);
+ sl->by = sstrdup(mysql_row[1]);
+ sl->reason = sstrdup(mysql_row[2]);
+ sl->seton = strtol(mysql_row[3], (char **) NULL, 10);
+ sl->expires = strtol(mysql_row[4], (char **) NULL, 10);
+ slist_add(&szlines, sl);
+ }
+
+ mysql_free_result(mysql_res);
+
+ return 1;
+}
+
+int db_mysql_load_cs_dbase(void)
+{
+ int ret;
+ char *q_name;
+ ChannelInfo *ci;
+ int i;
+ MYSQL_RES *res;
+ MYSQL_ROW row;
+ unsigned long *lengths;
+
+ if (!do_mysql)
+ return 0;
+
+ ret = db_mysql_try("SELECT 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, memomax, botnick, botflags, bwcount, capsmin, capspercent, floodlines, "
+ " floodsecs, repeattimes "
+ "FROM anope_cs_info "
+ "WHERE active = 1");
+
+ if (!ret)
+ return 0;
+
+ /* I'd really like to use mysql_use_result here, but it'd tie up with
+ * all the queries being run inside each iteration... -GD
+ */
+ mysql_res = mysql_store_result(mysql);
+
+ while (ret && (mysql_row = mysql_fetch_row(mysql_res))) {
+ /* We need to get the length of the password.. - Viper */
+ lengths = mysql_fetch_lengths(mysql_res);
+ ci = scalloc(1, sizeof(ChannelInfo));
+
+ /* Name, founder, successor, password */
+ snprintf(ci->name, CHANMAX, "%s", mysql_row[0]);
+ ci->founder = findcore(mysql_row[1]);
+ if (mysql_row[2] && *(mysql_row[2]))
+ ci->successor = findcore(mysql_row[2]);
+ else
+ ci->successor = NULL;
+
+ /* Copy the password from what we got back from the DB and
+ * keep in mind that lengths may vary. We should never
+ * use more than we have. - Viper */
+ memset(ci->founderpass, 0, PASSMAX);
+ if (lengths[3] >= PASSMAX)
+ memcpy(ci->founderpass, mysql_row[3], PASSMAX - 1);
+ else
+ memcpy(ci->founderpass, mysql_row[3], lengths[3]);
+
+ /* Description, URL, email -- scalloc() initializes to 0/NULL */
+ ci->desc = sstrdup(mysql_row[4]);
+ if (mysql_row[5] && *(mysql_row[5]))
+ ci->url = sstrdup(mysql_row[5]);
+ if (mysql_row[6] && *(mysql_row[6]))
+ ci->email = sstrdup(mysql_row[6]);
+
+ /* Time registered, last used, last topic, last topic setter + time */
+ ci->time_registered = strtol(mysql_row[7], (char **) NULL, 10);
+ ci->last_used = strtol(mysql_row[8], (char **) NULL, 10);
+ if (mysql_row[9] && *(mysql_row[9])) {
+ ci->last_topic = sstrdup(mysql_row[9]);
+ snprintf(ci->last_topic_setter, NICKMAX, "%s", mysql_row[10]);
+ ci->last_topic_time = strtol(mysql_row[11], (char **) NULL, 10);
+ }
+
+ /* Flags, forbidden by, forbid reason, bantype
+ * NOTE: CI_INHABIT will be disabled in flags!!
+ */
+ ci->flags =
+ strtol(mysql_row[12], (char **) NULL, 10) & ~CI_INHABIT;
+
+ if (mysql_row[13] && *(mysql_row[13])) {
+ ci->forbidby = sstrdup(mysql_row[13]);
+ if (mysql_row[14] && *(mysql_row[14]))
+ ci->forbidreason = sstrdup(mysql_row[14]);
+ }
+
+ ci->bantype = strtol(mysql_row[15], (char **) NULL, 10);
+
+ /* Accesscount, akickcount */
+ ci->accesscount = strtol(mysql_row[16], (char **) NULL, 10);
+ ci->akickcount = strtol(mysql_row[17], (char **) NULL, 10);
+
+ /* Mlock: on, off, limit, key, flood, redirect */
+ ci->mlock_on = strtol(mysql_row[18], (char **) NULL, 10);
+ ci->mlock_off = strtol(mysql_row[19], (char **) NULL, 10);
+ ci->mlock_limit = strtol(mysql_row[20], (char **) NULL, 10);
+ if (mysql_row[21] && *(mysql_row[21])) {
+ ci->mlock_key = sstrdup(mysql_row[21]);
+ if (mysql_row[22] && *(mysql_row[22])) {
+ ci->mlock_flood = sstrdup(mysql_row[22]);
+ }
+ if (mysql_row[23] && *(mysql_row[23])) {
+ ci->mlock_redirect = sstrdup(mysql_row[23]);
+ }
+ }
+
+ /* MemoMax, entrymessage, botinfo, botflags, badwordcount */
+ ci->memos.memomax = strtol(mysql_row[25], (char **) NULL, 10);
+ if (mysql_row[24] && *(mysql_row[24]))
+ ci->entry_message = sstrdup(mysql_row[24]);
+ ci->bi = findbot(mysql_row[26]);
+ ci->botflags = strtol(mysql_row[27], (char **) NULL, 10);
+ ci->bwcount = strtol(mysql_row[28], (char **) NULL, 10);
+
+ /* Capsmin, capspercent, floodlines, floodsecs, repeattimes */
+ ci->capsmin = strtol(mysql_row[29], (char **) NULL, 10);
+ ci->capspercent = strtol(mysql_row[30], (char **) NULL, 10);
+ ci->floodlines = strtol(mysql_row[31], (char **) NULL, 10);
+ ci->floodsecs = strtol(mysql_row[32], (char **) NULL, 10);
+ ci->repeattimes = strtol(mysql_row[33], (char **) NULL, 10);
+
+
+ /* Get info from other tables; we'll need the channel name */
+ q_name = db_mysql_quote(ci->name);
+
+ /* Get the LEVELS list */
+ ret = db_mysql_try("SELECT position, level "
+ "FROM anope_cs_levels "
+ "WHERE channel = '%s' AND active = 1",
+ q_name);
+
+ if (ret) {
+ res = mysql_use_result(mysql);
+ ci->levels = scalloc(CA_SIZE, sizeof(*ci->levels));
+ reset_levels(ci);
+
+ while ((row = mysql_fetch_row(res))) {
+ i = strtol(row[0], (char **) NULL, 10);
+ ci->levels[i] = strtol(row[1], (char **) NULL, 10);
+ }
+
+ mysql_free_result(res);
+ }
+
+ /* Get the channel ACCESS list */
+ if (ret && (ci->accesscount > 0)) {
+ ci->access = scalloc(ci->accesscount, sizeof(ChanAccess));
+
+ ret = db_mysql_try("SELECT level, display, last_seen "
+ "FROM anope_cs_access "
+ "WHERE channel = '%s' AND in_use = 1 AND active = 1",
+ q_name);
+
+ if (ret) {
+ res = mysql_store_result(mysql);
+
+ i = 0;
+ while ((row = mysql_fetch_row(res))) {
+ ci->access[i].in_use = 1;
+ ci->access[i].level = strtol(row[0], (char **) NULL, 10);
+ ci->access[i].nc = findcore(row[1]);
+ if (!(ci->access[i].nc))
+ ci->access[i].in_use = 0;
+ ci->access[i].last_seen =
+ strtol(row[2], (char **) NULL, 10);
+ i++;
+ }
+
+ mysql_free_result(res);
+ }
+ }
+
+ /* Get the channel AKICK list */
+ if (ret && (ci->akickcount > 0)) {
+ ci->akick = scalloc(ci->akickcount, sizeof(AutoKick));
+
+ ret = db_mysql_try("SELECT flags, dmask, reason, creator, addtime "
+ "FROM anope_cs_akicks "
+ "WHERE channel = '%s' AND active = 1 AND (flags & %d) <> 0",
+ q_name, AK_USED);
+
+ if (ret) {
+ res = mysql_use_result(mysql);
+
+ i = 0;
+ while ((row = mysql_fetch_row(res))) {
+ ci->akick[i].flags = strtol(row[0], (char **) NULL, 10);
+ if (ci->akick[i].flags & AK_ISNICK) {
+ ci->akick[i].u.nc = findcore(row[1]);
+ if (!(ci->akick[i].u.nc))
+ ci->akick[i].flags &= ~AK_USED;
+ } else {
+ ci->akick[i].u.mask = sstrdup(row[1]);
+ }
+ if (row[2] && *(row[2])) {
+ ci->akick[i].reason = sstrdup(row[2]);
+ }
+ ci->akick[i].creator = sstrdup(row[3]);
+ ci->akick[i].addtime = strtol(row[4], (char **) NULL, 10);
+ i++;
+ }
+
+ mysql_free_result(res);
+ }
+ }
+
+ if (ret) {
+ /* Get the channel memos */
+ ret = db_mysql_try("SELECT nm_id, number, flags, time, sender, text "
+ "FROM anope_ms_info "
+ "WHERE receiver = '%s' AND serv = 'CHAN' AND active = 1",
+ q_name);
+
+ if (ret) {
+ res = mysql_store_result(mysql);
+ ci->memos.memocount = mysql_num_rows(res);
+
+ if (ci->memos.memocount > 0) {
+ Memo *memos;
+
+ memos = scalloc(ci->memos.memocount, sizeof(Memo));
+ ci->memos.memos = memos;
+
+ i = 0;
+ while ((row = mysql_fetch_row(res))) {
+ memos[i].id = strtol(row[0], (char **) NULL, 10);
+ memos[i].number = strtol(row[1], (char **) NULL, 10);
+ memos[i].flags = strtol(row[2], (char **) NULL, 10);
+ memos[i].time = strtol(row[3], (char **) NULL, 10);
+ snprintf(memos[i].sender, NICKMAX, "%s", row[4]);
+ memos[i].text = sstrdup(row[5]);
+ i++;
+ }
+ }
+
+ mysql_free_result(res);
+ }
+ }
+
+ /* Get the TTB data */
+ if (ret) {
+ ci->ttb = scalloc(TTB_SIZE, sizeof(*ci->ttb));
+
+ ret = db_mysql_try("SELECT ttb_id, value "
+ "FROM anope_cs_ttb "
+ "WHERE channel = '%s' AND active = 1",
+ q_name);
+
+ if (ret) {
+ res = mysql_use_result(mysql);
+
+ while ((row = mysql_fetch_row(res))) {
+ i = strtol(row[0], (char **) NULL, 10);
+ /* Should we do a sanity check on the value of i? -GD */
+ ci->ttb[i] = strtol(row[1], (char **) NULL, 10);
+ }
+
+ mysql_free_result(res);
+ }
+ }
+
+ /* Get the badwords */
+ if (ret && (ci->bwcount > 0)) {
+ ci->badwords = scalloc(ci->bwcount, sizeof(BadWord));
+
+ ret = db_mysql_try("SELECT word, type "
+ "FROM anope_cs_badwords "
+ "WHERE channel = '%s' AND active = 1",
+ q_name);
+
+ if (ret) {
+ res = mysql_use_result(mysql);
+
+ i = 0;
+ while ((row = mysql_fetch_row(res))) {
+ ci->badwords[i].in_use = 1;
+ ci->badwords[i].word = sstrdup(row[0]);
+ ci->badwords[i].type = strtol(row[1], (char **) NULL, 10);
+ i++;
+ }
+
+ mysql_free_result(res);
+ }
+ }
+
+ /* YAY! all done; free q_name and insert the channel */
+ free(q_name);
+ alpha_insert_chan(ci);
+ }
+
+ mysql_free_result(mysql_res);
+
+ /* Check to be sure that all channels still have a founder. If not,
+ * delete them. This code seems to be required in the old mysql code
+ * so i'll leave it in just to be sure. I also wonder why they didn't
+ * do that check up above immediately when it was known there was no
+ * founder... -GD
+ */
+ 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);
+ }
+ }
+ }
+
+ return ret;
+}
+
+int db_mysql_load_ns_req_dbase(void)
+{
+ int ret;
+ NickRequest *nr;
+ unsigned long *lengths;
+
+ if (!do_mysql)
+ return 0;
+
+ ret = db_mysql_try("SELECT nick, passcode, password, email, requested "
+ "FROM anope_ns_request "
+ "WHERE active = 1");
+
+ if (ret) {
+ mysql_res = mysql_use_result(mysql);
+
+ while ((mysql_row = mysql_fetch_row(mysql_res))) {
+ /* We need to get the length of the password.. - Viper */
+ lengths = mysql_fetch_lengths(mysql_res);
+ nr = scalloc(1, sizeof(NickRequest));
+
+ nr->nick = sstrdup(mysql_row[0]);
+ nr->passcode = sstrdup(mysql_row[1]);
+ nr->email = sstrdup(mysql_row[3]);
+ nr->requested = strtol(mysql_row[4], (char **) NULL, 10);
+
+ /* Copy the password from what we got back from the DB and
+ * keep in mind that lengths may vary. We should never
+ * use more than we have. - Viper */
+ memset(nr->password, 0, PASSMAX);
+ if (lengths[2] >= PASSMAX)
+ memcpy(nr->password, mysql_row[2], PASSMAX - 1);
+ else
+ memcpy(nr->password, mysql_row[2], lengths[2]);
+
+
+ insert_requestnick(nr);
+ }
+
+ mysql_free_result(mysql_res);
+ }
+
+ return ret;
+}
+
+int db_mysql_load_ns_dbase(void)
+{
+ int ret;
+ char *q_display;
+ NickCore *nc;
+ NickAlias *na;
+ MYSQL_RES *res;
+ MYSQL_ROW row;
+ int i;
+ unsigned long *lengths;
+
+
+ if (!do_mysql)
+ return 0;
+
+ ret = db_mysql_try("SELECT display, pass, email, icq, url, flags, language, accesscount, memocount, memomax, channelcount, channelmax, greet "
+ "FROM anope_ns_core "
+ "WHERE active = 1");
+
+ if (!ret)
+ return 0;
+
+ /* I'd really like to use mysql_use_result here, but it'd tie up with
+ * all the queries being run inside each iteration... -GD
+ */
+ mysql_res = mysql_store_result(mysql);
+
+ while (ret && (mysql_row = mysql_fetch_row(mysql_res))) {
+ /* We need to get the length of the password.. - Viper */
+ lengths = mysql_fetch_lengths(mysql_res);
+
+ nc = scalloc(1, sizeof(NickCore));
+
+ /* Display, password, email, ICQ, URL, flags */
+ nc->display = sstrdup(mysql_row[0]);
+ if (mysql_row[2] && *(mysql_row[2])) {
+ nc->email = sstrdup(mysql_row[2]);
+ }
+ nc->icq = strtol(mysql_row[3], (char **) NULL, 10);
+ if (mysql_row[4] && *(mysql_row[4])) {
+ nc->url = sstrdup(mysql_row[4]);
+ }
+ nc->flags = strtol(mysql_row[5], (char **) NULL, 10);
+
+ /* Copy the password from what we got back from the DB and
+ * keep in mind that lengths may vary. We should never
+ * use more than we have. - Viper */
+ memset(nc->pass, 0, PASSMAX);
+ if (lengths[1] >= PASSMAX)
+ memcpy(nc->pass, mysql_row[1], PASSMAX - 1);
+ else
+ memcpy(nc->pass, mysql_row[1], lengths[1]);
+
+ /* Language, accesscount, memocount, memomax */
+ nc->language = strtol(mysql_row[6], (char **) NULL, 10);
+ nc->accesscount = strtol(mysql_row[7], (char **) NULL, 10);
+ nc->memos.memocount = strtol(mysql_row[8], (char **) NULL, 10);
+ nc->memos.memomax = strtol(mysql_row[9], (char **) NULL, 10);
+
+ /* Channelcount, channelmax, greet */
+ nc->channelcount = strtol(mysql_row[10], (char **) NULL, 10);
+ nc->channelmax = strtol(mysql_row[11], (char **) NULL, 10);
+ if (mysql_row[12] && *(mysql_row[12]))
+ nc->greet = sstrdup(mysql_row[12]);
+
+ /* Don't allow KILL_IMMED if the config doesn't allow it */
+ if (!NSAllowKillImmed)
+ nc->flags &= ~NI_KILL_IMMED;
+
+ /* Check if the current user is important enough to be added to
+ * services admin or services oper lists
+ */
+ if (nc->flags & NI_SERVICES_ADMIN)
+ slist_add(&servadmins, nc);
+ if (nc->flags & NI_SERVICES_OPER)
+ slist_add(&servopers, nc);
+
+ /* Unset the SERVICES_ROOT flag; we will set it again later if this
+ * user is really a services root (checked per NickAlias) -GD
+ */
+ nc->flags &= ~NI_SERVICES_ROOT;
+
+ /* Get info from other tables; we'll need the display */
+ q_display = db_mysql_quote(nc->display);
+
+ /* Fill the accesslist */
+ if (ret && (nc->accesscount > 0)) {
+ nc->access = scalloc(nc->accesscount, sizeof(char *));
+
+ ret = db_mysql_try("SELECT access "
+ "FROM anope_ns_access "
+ "WHERE display = '%s' AND active = 1",
+ q_display);
+
+ if (ret) {
+ res = mysql_use_result(mysql);
+
+ i = 0;
+ while ((row = mysql_fetch_row(res))) {
+ if (row[0] && *(row[0])) {
+ nc->access[i] = sstrdup(row[0]);
+ i++;
+ }
+ }
+
+ mysql_free_result(res);
+ }
+ }
+
+ /* Load the memos */
+ if (ret && (nc->memos.memocount > 0)) {
+ nc->memos.memos = scalloc(nc->memos.memocount, sizeof(Memo));
+
+ ret = db_mysql_try("SELECT nm_id, number, flags, time, sender, text "
+ "FROM anope_ms_info "
+ "WHERE receiver = '%s' AND active = 1 AND serv = 'NICK' "
+ "ORDER BY number ASC",
+ q_display);
+
+ if (ret) {
+ res = mysql_use_result(mysql);
+
+ i = 0;
+ while ((row = mysql_fetch_row(res))) {
+ nc->memos.memos[i].id = strtol(row[0], (char **) NULL, 10);
+ nc->memos.memos[i].number = strtol(row[1], (char **) NULL, 10);
+ nc->memos.memos[i].flags = strtol(row[2], (char **) NULL, 10);
+ nc->memos.memos[i].time = strtol(row[3], (char **) NULL, 10);
+ snprintf(nc->memos.memos[i].sender, NICKMAX, "%s", row[4]);
+ nc->memos.memos[i].text = sstrdup(row[5]);
+
+ i++;
+ }
+
+ mysql_free_result(res);
+ }
+ }
+
+ /* Done with the core; insert it */
+ insert_core(nc);
+ }
+
+ mysql_free_result(mysql_res);
+
+ if (!ret)
+ return 0;
+
+ /* Load the nickaliases */
+ ret = db_mysql_try("SELECT nick, display, time_registered, last_seen, status, last_usermask, last_realname, last_quit "
+ "FROM anope_ns_alias "
+ "WHERE active = 1");
+
+ if (!ret)
+ return 0;
+
+ mysql_res = mysql_use_result(mysql);
+
+ while ((mysql_row = mysql_fetch_row(mysql_res))) {
+ /* First make sure this NickAlias has a NickCore; else we don't even
+ * bother adding it to the aliases at all...
+ */
+ NickCore *nc;
+
+ if (!(nc = findcore(mysql_row[1])))
+ continue;
+
+ na = scalloc(1, sizeof(NickAlias));
+
+ /* nick, time_registered, last_seen, status
+ * NOTE: remove NS_TEMPORARY from status on load
+ */
+ na->nick = sstrdup(mysql_row[0]);
+ na->nc = nc;
+ na->time_registered = strtol(mysql_row[2], (char **) NULL, 10);
+ na->last_seen = strtol(mysql_row[3], (char **) NULL, 10);
+ na->status =
+ strtol(mysql_row[4], (char **) NULL, 10) & ~NS_TEMPORARY;
+
+ /* last_usermask, last_realname, last_quit */
+ na->last_usermask = sstrdup(mysql_row[5]);
+ na->last_realname = sstrdup(mysql_row[6]);
+
+ if (mysql_row[7] && *(mysql_row[7])) {
+ na->last_quit = sstrdup(mysql_row[7]);
+ }
+
+ /* Assign to the nickcore aliases */
+ slist_add(&na->nc->aliases, na);
+
+ /* Check if this user is a services root */
+ for (i = 0; i < RootNumber; i++) {
+ if (stricmp(ServicesRoots[i], na->nick) == 0)
+ na->nc->flags |= NI_SERVICES_ROOT;
+ }
+
+ /* Last, but not least: insert the alias! */
+ alpha_insert_alias(na);
+ }
+
+ mysql_free_result(mysql_res);
+
+ return ret;
+}
+
+/* get random mysql number for the generator */
+unsigned int mysql_rand(void)
+{
+ unsigned int num = 0;
+
+ if (!do_mysql)
+ return 0;
+
+ db_mysql_try("SELECT RAND()");
+
+ mysql_res = mysql_store_result(mysql);
+
+ if (!(mysql_row = mysql_fetch_row(mysql_res))) {
+ mysql_free_result(mysql_res);
+ return 0;
+ }
+
+ num = UserKey3 * strtol(mysql_row[0], (char **) NULL, 10);
+
+ mysql_free_result(mysql_res);
+
+ return num;
+}
diff --git a/src/news.c b/src/news.c
new file mode 100644
index 000000000..45dbbd6b3
--- /dev/null
+++ b/src/news.c
@@ -0,0 +1,554 @@
+
+/* News functions.
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+
+#include "services.h"
+#include "pseudo.h"
+
+/*************************************************************************/
+
+int32 nnews = 0;
+int32 news_size = 0;
+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];
+};
+
+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}
+ }
+};
+
+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;
+ uint16 n;
+ uint32 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) { \
+ anope_cmd_global(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;
+
+ if (rdb_tag_table("anope_os_news") == 0) {
+ alog("Unable to tag table 'anope_os_news' - News RDB save failed.");
+ return;
+ }
+
+ for (i = 0; i < nnews; i++) {
+ ni = &news[i];
+ if (rdb_save_news(ni) == 0) {
+ alog("Unable to save NewsItem %d - News RDB save failed.", ni->num);
+ return;
+ }
+ }
+
+ if (rdb_clean_table("anope_os_news") == 0) {
+ alog("Unable to clean table 'anope_os_news' - News RDB save failed.");
+ return;
+ }
+
+ 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;
+
+ for (i = nnews - 1; i >= 0; i--) {
+ if (count >= NewsCount)
+ 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, "");
+ int n;
+
+ if (!text) {
+ char buf[32];
+ snprintf(buf, sizeof(buf), "%sNEWS", typename);
+ syntax_error(s_OperServ, u, buf, msgs[MSG_ADD_SYNTAX]);
+ } else {
+ if (readonly) {
+ notice_lang(s_OperServ, u, READ_ONLY_MODE);
+ return;
+ }
+ 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);
+ }
+}
+
+
+/* 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, num;
+
+ if (!text) {
+ char buf[32];
+ snprintf(buf, sizeof(buf), "%sNEWS", typename);
+ syntax_error(s_OperServ, u, buf, msgs[MSG_DEL_SYNTAX]);
+ } else {
+ if (readonly) {
+ notice_lang(s_OperServ, u, READ_ONLY_MODE);
+ return;
+ }
+ if (stricmp(text, "ALL") != 0) {
+ 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++) {
+ if ((news[i].type == type) && (news[i].num > num))
+ news[i].num--;
+ }
+ } 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]);
+ }
+ }
+}
+
+
+/* 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/src/nickserv.c b/src/nickserv.c
new file mode 100644
index 000000000..a14877b8b
--- /dev/null
+++ b/src/nickserv.c
@@ -0,0 +1,1995 @@
+
+/* NickServ functions.
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+
+#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];
+
+unsigned int guestnum; /* Current guest number */
+
+#define TO_COLLIDE 0 /* Collide the user with this nick */
+#define TO_RELEASE 1 /* Release a collided nick */
+
+/*************************************************************************/
+
+static void add_ns_timeout(NickAlias * na, int type, time_t delay);
+
+/*************************************************************************/
+/* *INDENT-OFF* */
+void moduleAddNickServCmds(void) {
+ modules_core_init(NickServCoreNumber, NickServCoreModules);
+}
+/* *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(end, sizeof(buf) - (end - buf), "%sSecurity",
+ need_comma ? commastr : "");
+ need_comma = 1;
+ }
+ if (na->nc->flags & NI_PRIVATE) {
+ end += snprintf(end, sizeof(buf) - (end - buf), "%sPrivate",
+ need_comma ? commastr : "");
+ need_comma = 1;
+ }
+ if (na->status & NS_NO_EXPIRE) {
+ end += snprintf(end, sizeof(buf) - (end - buf), "%sNo Expire",
+ need_comma ? commastr : "");
+ need_comma = 1;
+ }
+ printf(" Options: %s\n", *buf ? buf : "None");
+
+ if (na->nc->flags & NI_SUSPENDED) {
+ if (na->last_quit) {
+ printf
+ ("This nickname is currently suspended, reason: %s\n",
+ na->last_quit);
+ } else {
+ printf("This nickname is currently suspended.\n");
+ }
+ }
+
+
+ } 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->nc->
+ flags & NI_SUSPENDED ?
+ "Disallowed (SUSPENDED)" :
+ 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 = "";
+ }
+ anope_cmd_ctcp(s_NickServ, u->nick, "PING %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;
+
+ uint16 tmp16;
+ uint32 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;
+
+ 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)
+ memcpy(nc->pass, bufp, PASSMAX);
+ else
+ memset(nc->pass, 0, PASSMAX); /* 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(&tmp16, f));
+ nc->memos.memocount = (int16) tmp16;
+ SAFE(read_int16(&tmp16, f));
+ nc->memos.memomax = (int16) tmp16;
+ 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));
+ memos->moduleData = NULL;
+ }
+ }
+
+ /* 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;
+ uint32 tmp32;
+ int failed = 0, len;
+ char *pass;
+
+ 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));
+ if (ver < 2) {
+ SAFE(read_string(&pass, f));
+ len = strlen(pass);
+ enc_encrypt(pass, len, nr->password, PASSMAX);
+ memset(pass, 0, len);
+ free(pass);
+ } else
+ SAFE(read_buffer(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;
+ uint16 tmp16;
+ uint32 tmp32;
+ char *s, *pass;
+
+ 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));
+ if (ver < 14) {
+ SAFE(read_string(&pass, f));
+ if (pass) {
+ memset(nc->pass, 0, PASSMAX);
+ memcpy(nc->pass, pass, strlen(pass));
+ } else
+ memset(nc->pass, 0, PASSMAX);
+ } else
+ SAFE(read_buffer(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;
+ 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(&tmp16, f));
+ nc->memos.memocount = (int16) tmp16;
+ SAFE(read_int16(&tmp16, f));
+ nc->memos.memomax = (int16) tmp16;
+ 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));
+ memos->moduleData = NULL;
+ }
+ }
+
+ 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) { \
+ anope_cmd_global(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_buffer(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_buffer(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;
+
+ if (rdb_tag_table("anope_ns_core") == 0) {
+ alog("Unable to tag 'anope_ns_core' - NickServ RDB save failed.");
+ rdb_close();
+ return;
+ }
+ if (rdb_tag_table("anope_ns_alias") == 0) {
+ alog("Unable to tag 'anope_ns_alias' - NickServ RDB save failed.");
+ rdb_close();
+ return;
+ }
+ if (rdb_tag_table("anope_ns_access") == 0) {
+ alog("Unable to tag 'anope_ns_access' - NickServ RDB save failed.");
+ rdb_close();
+ return;
+ }
+ if (rdb_tag_table_where("anope_ms_info", "serv='NICK'") == 0) {
+ alog("Unable to tag 'anope_ms_info' - NickServ RDB save failed.");
+ rdb_close();
+ return;
+ }
+
+ for (i = 0; i < 1024; i++) {
+ for (nc = nclists[i]; nc; nc = nc->next) {
+ if (rdb_save_ns_core(nc) == 0) {
+ alog("Unable to save NickCore for '%s' - NickServ RDB save failed.", nc->display);
+ rdb_close();
+ return;
+ }
+ } /* for (nc) */
+ } /* for (i) */
+
+ for (i = 0; i < 1024; i++) {
+ for (na = nalists[i]; na; na = na->next) {
+ if (rdb_save_ns_alias(na) == 0) {
+ alog("Unable to save NickAlias for '%s' - NickServ RDB save failed.", na->nick);
+ rdb_close();
+ return;
+ }
+ } /* for (na) */
+ } /* for (i) */
+
+ if (rdb_clean_table("anope_ns_core") == 0) {
+ alog("Unable to clean table 'anope_ns_core' - NickServ RDB save failed.");
+ rdb_close();
+ return;
+ }
+ if (rdb_clean_table("anope_ns_alias") == 0) {
+ alog("Unable to clean table 'anope_ns_alias' - NickServ RDB save failed.");
+ rdb_close();
+ return;
+ }
+ if (rdb_clean_table("anope_ns_access") == 0) {
+ alog("Unable to clean table 'anope_ns_access' - NickServ RDB save failed.");
+ rdb_close();
+ return;
+ }
+ if (rdb_clean_table_where("anope_ms_info", "serv='NICK'") == 0)
+ alog("Unable to clean table 'anope_ms_info' - NickServ RDB save failed.");
+
+ rdb_close();
+#endif
+}
+
+void save_ns_req_rdb_dbase(void)
+{
+#ifdef USE_RDB
+ int i;
+ NickRequest *nr;
+
+ if (!rdb_open())
+ return;
+
+ if (rdb_tag_table("anope_ns_request") == 0) {
+ alog("Unable to tag table 'anope_ns_request' - NickServ Request RDB save failed.");
+ rdb_close();
+ return;
+ }
+
+ for (i = 0; i < 1024; i++) {
+ for (nr = nrlists[i]; nr; nr = nr->next) {
+ if (rdb_save_ns_req(nr) == 0) {
+ /* Something went wrong - abort saving */
+ alog("Unable to save NickRequest (nick '%s') - NickServ Request RDB save failed.", nr->nick);
+ rdb_close();
+ return;
+ }
+ }
+ }
+
+ if (rdb_clean_table("anope_ns_request") == 0)
+ alog("Unable to clean table 'anope_ns_request' - NickServ Request RDB save failed.");
+
+ 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;
+ }
+
+ if (na->nc->flags & NI_SUSPENDED) {
+ notice_lang(s_NickServ, u, NICK_X_SUSPENDED, u->nick);
+ 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(common_get_vident(u)) +
+ strlen(common_get_vhost(u)) + 2, 1);
+ sprintf(na->last_usermask, "%s@%s", common_get_vident(u),
+ common_get_vhost(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) {
+ if (ircd->svshold) {
+ if (UseSVSHOLD) {
+ anope_cmd_svshold(na->nick);
+ } else {
+ if (ircd->svsnick) {
+ anope_cmd_guest_nick(u->nick, NSEnforcerUser,
+ NSEnforcerHost,
+ "Services Enforcer", "+");
+ add_ns_timeout(na, TO_RELEASE, NSReleaseTimeout);
+ } else {
+ anope_cmd_svskill(s_NickServ, u->nick,
+ "Killing to enforce nick");
+ }
+ }
+ } else {
+ if (ircd->svsnick) {
+ anope_cmd_guest_nick(u->nick, NSEnforcerUser,
+ NSEnforcerHost,
+ "Services Enforcer", "+");
+ add_ns_timeout(na, TO_RELEASE, NSReleaseTimeout);
+ } else {
+ anope_cmd_svskill(s_NickServ, u->nick,
+ "Killing to enforce nick");
+ }
+ }
+ 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)
+{
+ if (u) {
+ if (u->na) {
+ if (u->na->status) {
+ return (u->na->status & NS_IDENTIFIED);
+ } else {
+ return 0;
+ }
+ } else {
+ return 0;
+ }
+ }
+ return 0;
+}
+
+/*************************************************************************/
+
+/* Return whether a user is recognized for their nickname. */
+
+int nick_recognized(User * u)
+{
+ if (u) {
+ if (u->na) {
+ if (u->na->status) {
+ return (u->na->status & (NS_IDENTIFIED | NS_RECOGNIZED));
+ } else {
+ return 0;
+ }
+ } else {
+ return 0;
+ }
+ }
+ return 0;
+}
+
+/*************************************************************************/
+
+/* Returns whether a user is identified AND in the group nc */
+
+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);
+ char *tmpnick;
+
+ 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))
+ && !(na->nc->flags & (NI_SUSPENDED))) {
+ alog("Expiring nickname %s (group: %s) (e-mail: %s)",
+ na->nick, na->nc->display,
+ (na->nc->email ? na->nc->email : "none"));
+ tmpnick = sstrdup(na->nick);
+ delnick(na);
+ send_event(EVENT_NICK_EXPIRE, 1, tmpnick);
+ free(tmpnick);
+ }
+ }
+ }
+}
+
+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 || !nick) {
+ if (debug) {
+ alog("debug: findrequestnick() called with NULL values");
+ }
+ 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;
+
+ if (!nick || !*nick) {
+ if (debug) {
+ alog("debug: findnick() called with NULL values");
+ }
+ return NULL;
+ }
+
+ 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;
+
+ if (!nick || !*nick) {
+ if (debug) {
+ alog("debug: findcore() called with NULL values");
+ }
+ return NULL;
+ }
+
+ 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. */
+
+int is_on_access(User * u, NickCore * nc)
+{
+ int i;
+ char *buf;
+ char *buf2 = NULL;
+
+ if (nc->accesscount == 0)
+ return 0;
+
+ buf = scalloc(strlen(u->username) + strlen(u->host) + 2, 1);
+ sprintf(buf, "%s@%s", u->username, u->host);
+ if (ircd->vhost) {
+ if (u->vhost) {
+ buf2 = scalloc(strlen(u->username) + strlen(u->vhost) + 2, 1);
+ sprintf(buf2, "%s@%s", u->username, u->vhost);
+ }
+ }
+
+ for (i = 0; i < nc->accesscount; i++) {
+ if (match_wild_nocase(nc->access[i], buf)
+ || (ircd->vhost ? match_wild_nocase(nc->access[i], buf2) : 0)) {
+ free(buf);
+ if (ircd->vhost) {
+ if (u->vhost) {
+ free(buf2);
+ }
+ }
+ return 1;
+ }
+ }
+ free(buf);
+ if (ircd->vhost) {
+ free(buf2);
+ }
+ return 0;
+}
+
+/*************************************************************************/
+
+/* Insert a nick alias alphabetically into the database. */
+
+void alpha_insert_alias(NickAlias * na)
+{
+ NickAlias *ptr, *prev;
+ char *nick;
+ int index;
+
+ if (!na) {
+ if (debug) {
+ alog("debug: alpha_insert_alias called with NULL values");
+ }
+ return;
+ }
+
+ nick = na->nick;
+ 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. */
+
+void insert_core(NickCore * nc)
+{
+ int index;
+
+ if (!nc) {
+ if (debug) {
+ alog("debug: insert_core called with NULL values");
+ }
+ return;
+ }
+
+ index = HASH(nc->display);
+
+ nc->prev = NULL;
+ nc->next = nclists[index];
+ if (nc->next)
+ nc->next->prev = nc;
+ nclists[index] = nc;
+}
+
+/*************************************************************************/
+void insert_requestnick(NickRequest * nr)
+{
+ int index = HASH(nr->nick);
+ if (!nr) {
+ if (debug) {
+ alog("debug: insert_requestnick called with NULL values");
+ }
+ return;
+ }
+
+
+ nr->prev = NULL;
+ nr->next = nrlists[index];
+ if (nr->next)
+ nr->next->prev = nr;
+ nrlists[index] = nr;
+}
+
+/*************************************************************************/
+
+/* Sets nc->display to newdisplay. If newdisplay is NULL, it will change
+ * it to the first alias in the list.
+ */
+
+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()) {
+ if (rdb_ns_set_display(newdisplay, nc->display) == 0) {
+ alog("Unable to update display for %s - Nick Display RDB update failed.", 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];
+ char *q_display;
+#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()) {
+ q_display = rdb_quote(nc->display);
+ snprintf(clause, sizeof(clause), "display='%s'", q_display);
+ if (rdb_scrub_table("anope_ns_access", clause) == 0)
+ alog("Unable to scrub table 'anope_ns_access' - RDB update failed.");
+ else if (rdb_scrub_table("anope_ns_core", clause) == 0)
+ alog("Unable to scrub table 'anope_ns_core' - RDB update failed.");
+ else if (rdb_scrub_table("anope_cs_access", clause) == 0)
+ alog("Unable to scrub table 'anope_cs_access' - RDB update failed.");
+ else {
+ /* 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'", q_display);
+ if (rdb_scrub_table("anope_ms_info", clause) == 0)
+ alog("Unable to scrub table 'anope_ms_info' - RDB update failed.");
+ }
+ rdb_close();
+ free(q_display);
+ }
+#endif
+
+ /* Now we can safely free it. */
+ free(nc->display);
+
+ 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);
+ moduleCleanStruct(&nc->memos.memos[i].moduleData);
+ }
+ free(nc->memos.memos);
+ }
+
+ moduleCleanStruct(&nc->moduleData);
+
+ 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->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];
+ char *q_nick;
+#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;
+
+ if (ircd->modeonunreg)
+ common_svsmode(na->u, ircd->modeonunreg, "1");
+
+ }
+
+ 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()) {
+ q_nick = rdb_quote(na->nick);
+ snprintf(clause, sizeof(clause), "nick='%s'", q_nick);
+ if (rdb_scrub_table("anope_ns_alias", clause) == 0)
+ alog("Unable to scrub table 'anope_ns_alias' - RDB update failed");
+ rdb_close();
+ free(q_nick);
+ }
+#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);
+
+ moduleCleanStruct(&na->moduleData);
+
+ 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
+ */
+
+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
+ */
+ /* So you should check the length of NSGuestNickPrefix, eh Lara?
+ * --Certus
+ */
+
+ if (ircd->svsnick) {
+ /* We need to make sure the guestnick is free -- heinz */
+ do {
+ snprintf(guestnick, sizeof(guestnick), "%s%d",
+ NSGuestNickPrefix, getrandom16());
+ } while (finduser(guestnick));
+ notice_lang(s_NickServ, na->u, FORCENICKCHANGE_CHANGING,
+ guestnick);
+ anope_cmd_svsnick(na->nick, guestnick, time(NULL));
+ na->status |= NS_GUESTED;
+ } else {
+ kill_user(s_NickServ, na->nick, "Services nickname-enforcer kill");
+ }
+}
+
+/*************************************************************************/
+
+/* Release hold on a nick. */
+
+void release(NickAlias * na, int from_timeout)
+{
+ if (!from_timeout)
+ del_ns_timeout(na, TO_RELEASE);
+ if (ircd->svshold) {
+ if (UseSVSHOLD) {
+ anope_cmd_release_svshold(na->nick);
+ } else {
+ anope_cmd_quit(na->nick, NULL);
+ }
+ } else {
+ anope_cmd_quit(na->nick, NULL);
+ }
+ 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. */
+
+static 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=0x%p (%s), delay=%ld",
+ type, (void *) na, na->nick, (long int) 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. */
+
+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("debug: %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 ***********************/
+/*************************************************************************/
+
+
+/* We don't use this function but we keep it for module coders -certus */
+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;
+ }
+ if (status & CUS_HALFOP) {
+ return 0;
+ }
+ if (status & CUS_VOICE) {
+ return 0;
+ }
+ return 1;
+ break;
+ case CUS_HALFOP:
+ if (status & CUS_OP) {
+ return 0;
+ }
+ if (status & CUS_HALFOP) {
+ return 0;
+ }
+ return 1;
+ break;
+ case CUS_OWNER:
+ if (ircd->owner) {
+ if (status & CUS_OWNER) {
+ return 0;
+ }
+ }
+ break;
+ case CUS_PROTECT:
+ if (ircd->protect) {
+ if (status & CUS_PROTECT) {
+ return 0;
+ }
+ }
+ break;
+ }
+ return 1;
+}
+
+/*************************************************************************/
+
+int do_setmodes(User * u)
+{
+ struct u_chanlist *uc;
+ Channel *c;
+
+ /* Walk users current channels */
+ for (uc = u->chans; uc; uc = uc->next) {
+ if ((c = uc->chan))
+ chan_set_correct_modes(u, c, 1);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+/*
+ * Nick tracking
+ */
+
+/**
+ * Start Nick tracking and store the nick core display under the user struct.
+ * @param u The user to track nicks for
+ **/
+void nsStartNickTracking(User * u)
+{
+ NickCore *nc;
+
+ /* We only track identified users */
+ if (nick_identified(u)) {
+ nc = u->na->nc;
+
+ /* Release memory if needed */
+ if (u->nickTrack)
+ free(u->nickTrack);
+
+ /* Copy the nick core displayed nick to
+ the user structure for further checks */
+ u->nickTrack = sstrdup(nc->display);
+ }
+}
+
+/**
+ * Stop Nick tracking and remove the nick core display under the user struct.
+ * @param u The user to stop tracking for
+ **/
+void nsStopNickTracking(User * u)
+{
+ /* Simple enough. If its there, release it */
+ if (u->nickTrack) {
+ free(u->nickTrack);
+ u->nickTrack = NULL;
+ }
+}
+
+/**
+ * Boolean function to check if the user requesting a nick has the tracking
+ * signature of that core in its structure.
+ * @param u The user whom to check tracking for
+ **/
+int nsCheckNickTracking(User * u)
+{
+ NickCore *nc;
+ NickAlias *na;
+ char *nick;
+
+ /* No nick alias or nick return false by default */
+ if ((!(na = u->na)) || (!(nick = na->nick))) {
+ return 0;
+ }
+
+ /* nick is forbidden best return 0 */
+ if (na->status & NS_VERBOTEN) {
+ return 0;
+ }
+
+ /* Get the core for the requested nick */
+ nc = na->nc;
+
+ /* If the core and the tracking displayed nick are there,
+ * and they match, return true
+ */
+ if (nc && u->nickTrack && (strcmp(nc->display, u->nickTrack) == 0))
+ return 1;
+ else
+ return 0;
+}
diff --git a/src/operserv.c b/src/operserv.c
new file mode 100644
index 000000000..ded9069eb
--- /dev/null
+++ b/src/operserv.c
@@ -0,0 +1,1774 @@
+/* OperServ functions.
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+
+#include "services.h"
+#include "pseudo.h"
+
+/*************************************************************************/
+
+/* List of Services administrators */
+SList servadmins;
+/* List of Services operators */
+SList servopers;
+/* AKILL, SGLINE, SQLINE and SZLINE lists */
+SList akills, sglines, sqlines, szlines;
+
+/*************************************************************************/
+
+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);
+static int is_sgline_entry_equal(SList * slist, void *item1, void *item2);
+static void free_sgline_entry(SList * slist, void *item);
+static int is_sqline_entry_equal(SList * slist, void *item1, void *item2);
+static void free_sqline_entry(SList * slist, void *item);
+static int is_szline_entry_equal(SList * slist, void *item1, void *item2);
+static void free_szline_entry(SList * slist, void *item);
+
+time_t DefContimer;
+int DefConModesSet = 0;
+char *defconReverseModes(const char *modes);
+
+uint32 DefConModesOn; /* Modes to be enabled during DefCon */
+uint32 DefConModesOff; /* Modes to be disabled during DefCon */
+ChannelInfo DefConModesCI; /* ChannelInfo containg params for locked modes
+ * during DefCon; I would've done this nicer if i
+ * could, but all damn mode functions require a
+ * ChannelInfo struct! --gdex
+ */
+
+
+#ifdef DEBUG_COMMANDS
+static int do_matchwild(User * u);
+#endif
+
+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
+};
+
+SListOpts sgopts = { 0, NULL, &is_sgline_entry_equal, &free_sgline_entry };
+SListOpts soopts =
+ { SLISTF_SORT, &compare_operlist_entries, NULL, &free_operlist_entry };
+SListOpts sqopts =
+ { SLISTF_SORT, NULL, &is_sqline_entry_equal, &free_sqline_entry };
+SListOpts szopts = { 0, NULL, &is_szline_entry_equal, &free_szline_entry };
+
+/*************************************************************************/
+/* *INDENT-OFF* */
+void moduleAddOperServCmds(void) {
+#ifdef DEBUG_COMMANDS
+ Command *c;
+#endif
+
+ modules_core_init(OperServCoreNumber, OperServCoreModules);
+
+#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);
+#endif
+}
+
+/* *INDENT-ON* */
+/*************************************************************************/
+/*************************************************************************/
+
+/* OperServ initialization. */
+
+void os_init(void)
+{
+ moduleAddOperServCmds();
+
+ /* Initialization of the lists */
+ slist_init(&servadmins);
+ servadmins.opts = &saopts;
+ slist_init(&servopers);
+ servopers.opts = &soopts;
+
+ slist_init(&akills);
+ akills.opts = &akopts;
+
+ if (ircd->sgline) {
+ slist_init(&sglines);
+ sglines.opts = &sgopts;
+ }
+ if (ircd->sqline) {
+ slist_init(&sqlines);
+ sqlines.opts = &sqopts;
+ }
+ if (ircd->szline) {
+ slist_init(&szlines);
+ szlines.opts = &szopts;
+ }
+}
+
+/*************************************************************************/
+
+/* 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 = "";
+ }
+ anope_cmd_ctcp(s_OperServ, u->nick, "PING %s", s);
+ } else {
+ mod_run_cmd(s_OperServ, u, OPERSERV, cmd);
+ }
+}
+
+/*************************************************************************/
+/**************************** 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;
+ uint16 tmp16;
+ uint32 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, '!')) {
+ anope_cmd_remove_akill(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)) {
+ anope_cmd_remove_akill(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, ver;
+ uint16 tmp16, n;
+ uint32 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) {
+ uint32 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);
+ }
+ }
+
+ 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) { \
+ anope_cmd_global(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;
+
+ 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));
+ }
+
+ close_db(f);
+
+}
+
+#undef SAFE
+
+/*************************************************************************/
+
+void save_os_rdb_dbase(void)
+{
+#ifdef USE_RDB
+ if (!rdb_open())
+ return;
+
+ if (rdb_tag_table("anope_os_akills") == 0) {
+ alog("Unable to tag table 'anope_os_akills' - OperServ RDB save failed.");
+ rdb_close();
+ return;
+ }
+ if (rdb_tag_table("anope_os_sglines") == 0) {
+ alog("Unable to tag table 'anope_os_sglines' - OperServ RDB save failed.");
+ rdb_close();
+ return;
+ }
+ if (rdb_tag_table("anope_os_sqlines") == 0) {
+ alog("Unable to tag table 'anope_os_sqlines' - OperServ RDB save failed.");
+ rdb_close();
+ return;
+ }
+ if (rdb_tag_table("anope_os_szlines") == 0) {
+ alog("Unable to tag table 'anope_os_szlines' - OperServ RDB save failed.");
+ rdb_close();
+ return;
+ }
+ /* We empty anope_os_core as required */
+ if (rdb_empty_table("anope_os_core") == 0) {
+ alog("Unable to empty table 'anope_os_core' - OperServ RDB save failed");
+ rdb_close();
+ return;
+ }
+
+ if (rdb_save_os_db
+ (maxusercnt, maxusertime, &akills, &sglines, &sqlines,
+ &szlines) == 0) {
+ alog("Unable to save OperServ data - OperServ RDB save failed");
+ rdb_close();
+ return;
+ }
+
+ if (rdb_clean_table("anope_os_akills") == 0) {
+ alog("Unable to clean table 'anope_os_akills' - OperServ RDB save failed.");
+ rdb_close();
+ return;
+ }
+ if (rdb_clean_table("anope_os_sglines") == 0) {
+ alog("Unable to clean table 'anope_os_sglines' - OperServ RDB save failed.");
+ rdb_close();
+ return;
+ }
+ if (rdb_clean_table("anope_os_sqlines") == 0) {
+ alog("Unable to clean table 'anope_os_sqlines' - OperServ RDB save failed.");
+ rdb_close();
+ return;
+ }
+ if (rdb_clean_table("anope_os_szlines") == 0)
+ alog("Unable to clean table 'anope_os_szlines' - OperServ RDB save failed.");
+
+ 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 root nick? */
+
+int nick_is_services_root(NickCore * nc)
+{
+ if (nc) {
+ if (nc->flags & (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) {
+ 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) {
+ if (nc->
+ flags & (NI_SERVICES_OPER | NI_SERVICES_ADMIN |
+ NI_SERVICES_ROOT))
+ return 1;
+ }
+ return 0;
+}
+
+
+/*************************************************************************/
+/*********************** OperServ command functions **********************/
+/*************************************************************************/
+
+/*************************************************************************/
+
+
+Server *server_global(Server * s, char *msg)
+{
+ Server *sl;
+
+ while (s) {
+ /* Do not send the notice to ourselves our juped servers */
+ if (!(s->flags & (SERVER_ISME | SERVER_JUPED)))
+ notice_server(s_GlobalNoticer, s, "%s", msg);
+
+ if (s->links) {
+ sl = server_global(s->links, msg);
+ if (sl)
+ s = sl;
+ else
+ s = s->next;
+ } else {
+ s = s->next;
+ }
+ }
+ return s;
+
+}
+
+void oper_global(char *nick, char *fmt, ...)
+{
+ va_list args;
+ char msg[2048]; /* largest valid message is 512, this should cover any global */
+ char dmsg[2048]; /* largest valid message is 512, this should cover any global */
+
+ va_start(args, fmt);
+ vsnprintf(msg, sizeof(msg), fmt, args);
+ va_end(args);
+
+ /* I don't like the way this is coded... */
+ if ((nick) && (!AnonymousGlobal)) {
+ snprintf(dmsg, sizeof(dmsg), "[%s] %s", nick, msg);
+ server_global(servlist, dmsg);
+ } else {
+ server_global(servlist, msg);
+ }
+
+}
+
+/**************************************************************************/
+
+
+/************************************************************************/
+/*************************************************************************/
+
+/* 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;
+
+ if (!mask) {
+ return -1;
+ }
+
+ /* 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) {
+ free(mask2);
+ return -1;
+ }
+
+ user = mask2;
+ *host = 0;
+ host++;
+
+ entry = scalloc(sizeof(Akill), 1);
+
+ if (!entry) {
+ free(mask2);
+ 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)
+ anope_cmd_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(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)) {
+ anope_cmd_akill(ak->user, ak->host, ak->by, ak->seton,
+ ak->expires, ak->reason);
+ return 1;
+ }
+ if (ircd->vhost) {
+ if (vhost) {
+ if (match_wild_nocase(ak->user, username)
+ && match_wild_nocase(ak->host, vhost)) {
+ anope_cmd_akill(ak->user, ak->host, ak->by, ak->seton,
+ ak->expires, ak->reason);
+ return 1;
+ }
+ }
+ }
+ if (ircd->nickip) {
+ if (ip) {
+ if (match_wild_nocase(ak->user, username)
+ && match_wild_nocase(ak->host, ip)) {
+ anope_cmd_akill(ak->user, ak->host, ak->by, ak->seton,
+ ak->expires, ak->reason);
+ return 1;
+ }
+ }
+ }
+
+ }
+
+ 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)
+ anope_cmd_global(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 */
+ anope_cmd_remove_akill(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;
+}
+
+
+/*************************************************************************/
+
+/* 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;
+ User *u2, *next;
+ char buf[BUFSIZE];
+ *buf = '\0';
+
+ /* 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 (!mask) {
+ return -1;
+ }
+
+ 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);
+
+ anope_cmd_sgline(entry->mask, entry->reason);
+
+ if (KillonSGline && !ircd->sglineenforce) {
+ snprintf(buf, (BUFSIZE - 1), "G-Lined: %s", entry->reason);
+ u2 = firstuser();
+ while (u2) {
+ next = nextuser();
+ if (!is_oper(u2)) {
+ if (match_wild_nocase(entry->mask, u2->realname)) {
+ kill_user(ServerName, u2->nick, buf);
+ }
+ }
+ u2 = next;
+ }
+ }
+ return deleted;
+}
+
+/* Does the user match any SGLINEs? */
+
+int check_sgline(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)) {
+ anope_cmd_sgline(sx->mask, sx->reason);
+ /* We kill nick since s_sgline can't */
+ anope_cmd_svskill(ServerName, nick, "G-Lined: %s", 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)
+ anope_cmd_global(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 */
+ anope_cmd_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;
+}
+
+/*************************************************************************/
+
+/* 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;
+ User *u2, *next;
+ SXLine *entry;
+ char buf[BUFSIZE];
+ *buf = '\0';
+
+ /* 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 (!mask) {
+ return -1;
+ }
+
+ 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);
+
+ sqline(entry->mask, entry->reason);
+
+ if (KillonSQline) {
+ snprintf(buf, (BUFSIZE - 1), "Q-Lined: %s", entry->reason);
+ u2 = firstuser();
+ while (u2) {
+ next = nextuser();
+ if (!is_oper(u2)) {
+ if (match_wild_nocase(entry->mask, u2->nick)) {
+ kill_user(ServerName, u2->nick, buf);
+ }
+ }
+ u2 = next;
+ }
+ }
+
+ return deleted;
+}
+
+/* Does the user match any SQLINEs? */
+
+int check_sqline(char *nick, int nick_change)
+{
+ int i;
+ SXLine *sx;
+ char reason[300];
+
+ if (sqlines.count == 0)
+ return 0;
+
+ for (i = 0; i < sqlines.count; i++) {
+ sx = sqlines.list[i];
+ if (!sx)
+ continue;
+
+ if (ircd->chansqline) {
+ if (*sx->mask == '#')
+ continue;
+ }
+
+ if (match_wild_nocase(sx->mask, nick)) {
+ sqline(sx->mask, sx->reason);
+ /* We kill nick since s_sqline can't */
+ snprintf(reason, sizeof(reason), "Q-Lined: %s", sx->reason);
+ kill_user(s_OperServ, nick, reason);
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+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)) {
+ sqline(sx->mask, sx->reason);
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+/* 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)
+ anope_cmd_global(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 */
+ anope_cmd_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;
+}
+
+/*************************************************************************/
+
+/* 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;
+
+ if (!mask) {
+ return -1;
+ }
+
+ /* 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);
+ anope_cmd_szline(entry->mask, entry->reason, entry->by);
+
+ return deleted;
+}
+
+/* Check and enforce any Zlines that we have */
+int check_szline(char *nick, char *ip)
+{
+ int i;
+ SXLine *sx;
+
+ if (szlines.count == 0) {
+ return 0;
+ }
+
+ if (!ip) {
+ return 0;
+ }
+
+ for (i = 0; i < szlines.count; i++) {
+ sx = szlines.list[i];
+ if (!sx) {
+ continue;
+ }
+
+ if (match_wild_nocase(sx->mask, ip)) {
+ anope_cmd_szline(sx->mask, sx->reason, sx->by);
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+
+/* 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)
+ anope_cmd_global(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 */
+ anope_cmd_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;
+}
+
+/*************************************************************************/
+
+/* 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;
+}
+
+/*************************************************************************/
+
+/* 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;
+}
+
+/*************************************************************************/
+
+#ifdef DEBUG_COMMANDS
+
+static int do_matchwild(User * u)
+{
+ char *pat = strtok(NULL, " ");
+ char *str = strtok(NULL, " ");
+ if (pat && str)
+ notice_user(s_OperServ, u, "%d", match_wild(pat, str));
+ else
+ notice_user(s_OperServ, u, "Syntax error.");
+ return MOD_CONT;
+}
+
+#endif /* DEBUG_COMMANDS */
+
+/*************************************************************************/
+/**
+ * Returns 1 if the passed level is part of the CURRENT defcon, else 0 is returned
+ **/
+int checkDefCon(int level)
+{
+ return DefCon[DefConLevel] & level;
+}
+
+/**
+ * Automaticaly re-set the DefCon level if the time limit has expired.
+ **/
+void resetDefCon(int level)
+{
+ char strLevel[5];
+ snprintf(strLevel, 4, "%d", level);
+ if (DefConLevel != level) {
+ if ((DefContimer)
+ && (time(NULL) - DefContimer >= dotime(DefConTimeOut))) {
+ DefConLevel = level;
+ send_event(EVENT_DEFCON_LEVEL, 1, strLevel);
+ alog("Defcon level timeout, returning to lvl %d", level);
+ anope_cmd_global(s_OperServ,
+ getstring2(NULL, OPER_DEFCON_WALL),
+ s_OperServ, level);
+ if (GlobalOnDefcon) {
+ if (DefConOffMessage) {
+ oper_global(NULL, "%s", DefConOffMessage);
+ } else {
+ oper_global(NULL, getstring(NULL, DEFCON_GLOBAL),
+ DefConLevel);
+ }
+ }
+ if (GlobalOnDefconMore && !DefConOffMessage) {
+ oper_global(NULL, "%s", DefconMessage);
+ }
+ runDefCon();
+ }
+ }
+}
+
+/**
+ * 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] == '-') {
+ DefConModesSet = 0;
+ if ((newmodes = defconReverseModes(DefConChanModes))) {
+ alog("DEFCON: setting %s on all chan's", newmodes);
+ do_mass_mode(newmodes);
+ free(newmodes);
+ }
+ }
+ }
+ }
+}
+
+/**
+ * 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;
+}
+
+/* Parse the defcon mlock mode string and set the correct global vars.
+ *
+ * @param str mode string to parse
+ * @return 1 if accepted, 0 if failed
+ */
+int defconParseModeString(const char *str)
+{
+ int add = -1; /* 1 if adding, 0 if deleting, -1 if neither */
+ unsigned char mode;
+ CBMode *cbm;
+ char *str_copy = sstrdup(str); /* We need this copy as str is const -GD */
+ char *param; /* Store parameters during mode parsing */
+
+ /* Reinitialize everything */
+ DefConModesOn = 0;
+ DefConModesOff = 0;
+ DefConModesCI.mlock_limit = 0;
+ DefConModesCI.mlock_key = NULL;
+ DefConModesCI.mlock_flood = NULL;
+ DefConModesCI.mlock_redirect = NULL;
+
+ /* Initialize strtok() internal buffer */
+ strtok(str_copy, " ");
+
+ /* Loop while there are modes to set */
+ while ((mode = *str++) && (mode != ' ')) {
+ 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) {
+ alog("DefConChanModes mode character '%c' cannot be locked", mode);
+ free(str_copy);
+ return 0;
+ } else if (add) {
+ DefConModesOn |= cbm->flag;
+ DefConModesOff &= ~cbm->flag;
+ if (cbm->cssetvalue) {
+ if (!(param = strtok(NULL, " "))) {
+ alog("DefConChanModes mode character '%c' has no parameter while one is expected", mode);
+ free(str_copy);
+ return 0;
+ }
+ cbm->cssetvalue(&DefConModesCI, param);
+ }
+ } else {
+ DefConModesOff |= cbm->flag;
+ if (DefConModesOn & cbm->flag) {
+ DefConModesOn &= ~cbm->flag;
+ if (cbm->cssetvalue) {
+ cbm->cssetvalue(&DefConModesCI, NULL);
+ }
+ }
+ }
+ } else {
+ alog("DefConChanModes unknown mode character '%c'", mode);
+ free(str_copy);
+ return 0;
+ }
+ } /* while (*param) */
+
+ free(str_copy);
+
+ if (ircd->Lmode) {
+ /* We can't mlock +L if +l is not mlocked as well. */
+ if ((DefConModesOn & ircd->chan_lmode)
+ && !(DefConModesOn & anope_get_limit_mode())) {
+ DefConModesOn &= ~ircd->chan_lmode;
+ free(DefConModesCI.mlock_redirect);
+ DefConModesCI.mlock_redirect = NULL;
+ alog("DefConChanModes must lock mode +l as well to lock mode +L");
+ return 0;
+ }
+ }
+
+ /* Some ircd we can't set NOKNOCK without INVITE */
+ /* So check if we need there is a NOKNOCK MODE and that we need INVITEONLY */
+ if (ircd->noknock && ircd->knock_needs_i) {
+ if ((DefConModesOn & ircd->noknock)
+ && !(DefConModesOn & anope_get_invite_mode())) {
+ DefConModesOn &= ~ircd->noknock;
+ alog("DefConChanModes must lock mode +i as well to lock mode +K");
+ return 0;
+ }
+ }
+
+ /* Everything is set fine, return 1 */
+ return 1;
+}
+
+/*************************************************************************/
diff --git a/src/process.c b/src/process.c
new file mode 100644
index 000000000..9f94f4ff8
--- /dev/null
+++ b/src/process.c
@@ -0,0 +1,417 @@
+/* Main processing code for Services.
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+
+#include "services.h"
+#include "messages.h"
+#include "modules.h"
+
+/*************************************************************************/
+
+/* Use ignore code? */
+int allow_ignore = 1;
+
+/* Masks to ignore. */
+IgnoreData *ignore;
+
+/*************************************************************************/
+
+/**
+ * Add a mask/nick to the ignorelits for delta seconds.
+ * @param nick Nick or (nick!)user@host to add to the ignorelist.
+ * @param delta Seconds untill new entry is set to expire. 0 for permanent.
+ */
+void add_ignore(const char *nick, time_t delta)
+{
+ IgnoreData *ign;
+ char tmp[BUFSIZE];
+ char *mask, *user, *host;
+ User *u;
+ time_t now;
+ if (!nick)
+ return;
+ now = time(NULL);
+
+ /* If it s an existing user, we ignore the hostmask. */
+ if ((u = finduser(nick))) {
+ snprintf(tmp, sizeof(tmp), "*!*@%s", u->host);
+ mask = sstrdup(tmp);
+
+ /* Determine whether we get a nick or a mask. */
+ } else if ((host = strchr(nick, '@'))) {
+ /* Check whether we have a nick too.. */
+ if ((user = strchr(nick, '!'))) {
+ /* this should never happen */
+ if (user > host)
+ return;
+ mask = sstrdup(nick);
+ } else {
+ /* We have user@host. Add nick wildcard. */
+ snprintf(tmp, sizeof(tmp), "*!%s", nick);
+ mask = sstrdup(tmp);
+ }
+
+ /* We only got a nick.. */
+ } else {
+ snprintf(tmp, sizeof(tmp), "%s!*@*", nick);
+ mask = sstrdup(tmp);
+ }
+
+ /* Check if we already got an identical entry. */
+ for (ign = ignore; ign; ign = ign->next)
+ if (stricmp(ign->mask, mask) == 0)
+ break;
+
+ /* Found one.. */
+ if (ign) {
+ if (delta == 0)
+ ign->time = 0;
+ else if (ign->time < now + delta)
+ ign->time = now + delta;
+
+ /* Create new entry.. */
+ } else {
+ ign = scalloc(sizeof(*ign), 1);
+ ign->mask = mask;
+ ign->time = (delta == 0 ? 0 : now + delta);
+ ign->prev = NULL;
+ ign->next = ignore;
+ if (ignore)
+ ignore->prev = ign;
+ ignore = ign;
+ if (debug)
+ alog("debug: Added new ignore entry for %s", mask);
+ }
+}
+
+/*************************************************************************/
+
+/**
+ * Retrieve an ignorance record for a nick or mask.
+ * If the nick isn't being ignored, we return NULL and if necesary
+ * flush the record from the ignore list (i.e. ignore timed out).
+ * @param nick Nick or (nick!)user@host to look for on the ignorelist.
+ * @return Pointer to the ignore record, NULL if none was found.
+ */
+IgnoreData *get_ignore(const char *nick)
+{
+ IgnoreData *ign;
+ char tmp[BUFSIZE];
+ char *user, *host;
+ time_t now;
+ User *u;
+ if (!nick)
+ return NULL;
+
+ /* User has disabled the IGNORE system */
+ if (!allow_ignore)
+ return NULL;
+ now = time(NULL);
+ u = finduser(nick);
+
+ /* If we find a real user, match his mask against the ignorelist. */
+ if (u) {
+ /* Opers are not ignored, even if a matching entry may be present. */
+ if (is_oper(u))
+ return NULL;
+ for (ign = ignore; ign; ign = ign->next)
+ if (match_usermask(ign->mask, u))
+ break;
+ } else {
+ /* We didn't get a user.. generate a valid mask. */
+ if ((host = strchr(nick, '@'))) {
+ if ((user = strchr(nick, '!'))) {
+ /* this should never happen */
+ if (user > host)
+ return NULL;
+ snprintf(tmp, sizeof(tmp), "%s", nick);
+ } else {
+ /* We have user@host. Add nick wildcard. */
+ snprintf(tmp, sizeof(tmp), "*!%s", nick);
+ }
+
+ /* We only got a nick.. */
+ } else
+ snprintf(tmp, sizeof(tmp), "%s!*@*", nick);
+ for (ign = ignore; ign; ign = ign->next)
+ if (match_wild_nocase(ign->mask, tmp))
+ break;
+ }
+
+ /* Check whether the entry has timed out */
+ if (ign && ign->time != 0 && ign->time <= now) {
+ if (debug)
+ alog("debug: Expiring ignore entry %s", ign->mask);
+ if (ign->prev)
+ ign->prev->next = ign->next;
+ else if (ignore == ign)
+ ignore = ign->next;
+ if (ign->next)
+ ign->next->prev = ign->prev;
+ free(ign->mask);
+ free(ign);
+ ign = NULL;
+ }
+ if (ign && debug)
+ alog("debug: Found ignore entry (%s) for %s", ign->mask, nick);
+ return ign;
+}
+
+
+/*************************************************************************/
+
+/**
+ * Deletes a given nick/mask from the ignorelist.
+ * @param nick Nick or (nick!)user@host to delete from the ignorelist.
+ * @return Returns 1 on success, 0 if no entry is found.
+ */
+int delete_ignore(const char *nick)
+{
+ IgnoreData *ign;
+ char tmp[BUFSIZE];
+ char *user, *host;
+ User *u;
+ if (!nick)
+ return 0;
+
+ /* If it s an existing user, we ignore the hostmask. */
+ if ((u = finduser(nick))) {
+ snprintf(tmp, sizeof(tmp), "*!*@%s", u->host);
+
+ /* Determine whether we get a nick or a mask. */
+ } else if ((host = strchr(nick, '@'))) {
+ /* Check whether we have a nick too.. */
+ if ((user = strchr(nick, '!'))) {
+ /* this should never happen */
+ if (user > host)
+ return 0;
+ snprintf(tmp, sizeof(tmp), "%s", nick);
+ } else {
+ /* We have user@host. Add nick wildcard. */
+ snprintf(tmp, sizeof(tmp), "*!%s", nick);
+ }
+
+ /* We only got a nick.. */
+ } else
+ snprintf(tmp, sizeof(tmp), "%s!*@*", nick);
+
+ for (ign = ignore; ign; ign = ign->next)
+ if (stricmp(ign->mask, tmp) == 0)
+ break;
+
+ /* No matching ignore found. */
+ if (!ign)
+ return 0;
+ if (debug)
+ alog("Deleting ignore entry %s", ign->mask);
+
+ /* Delete the entry and all references to it. */
+ if (ign->prev)
+ ign->prev->next = ign->next;
+ else if (ignore == ign)
+ ignore = ign->next;
+ if (ign->next)
+ ign->next->prev = ign->prev;
+ free(ign->mask);
+ free(ign);
+ ign = NULL;
+ return 1;
+ }
+
+
+/*************************************************************************/
+
+/**
+ * Clear the ignorelist.
+ * @return The number of entries deleted.
+ */
+int clear_ignores()
+{
+ IgnoreData *ign, *next;
+ int i = 0;
+ if (!ignore)
+ return 0;
+ for (ign = ignore; ign; ign = next) {
+ next = ign->next;
+ if (debug)
+ alog("Deleting ignore entry %s", ign->mask);
+ free(ign->mask);
+ free(ign);
+ i++;
+ }
+ ignore = NULL;
+ return i;
+ }
+
+
+/*************************************************************************/
+/* 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;
+
+ /* zero out the buffers before we do much else */
+ *buf = '\0';
+ *source = '\0';
+ *cmd = '\0';
+
+ /* 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 (protocoldebug) {
+ protocol_debug(source, cmd, ac, av);
+ }
+ if (mod_current_buffer) {
+ free(mod_current_buffer);
+ }
+ /* fix to moduleGetLastBuffer() bug 296 */
+ /* old logic was that since its meant for PRIVMSG that we would get
+ the NICK as AV[0] and the rest would be in av[1], however on Bahamut
+ based systems when you do /cs it assumes we will translate the command
+ to the NICK and thus AV[0] is the message. The new logic is to check
+ av[0] to see if its a service nick if so assign mod_current_buffer the
+ value from AV[1] else just assign av[0] - TSL */
+ /* First check if the ircd proto module overrides this -GD */
+ /* fix to moduleGetLastBuffer() bug 476:
+ fixed in part by adding {} to nickIsServices()
+ however if you have a pseudo they could not use moduleGetLastBuffer()
+ cause they are not part of nickIsServices, even those the ac count is 2
+ that was ignored and only the first param was passed on which is fine for
+ Bahmut ircd aliases but not for pseudo clients on. So additional logic is
+ that if the ac is greater then 1 copy av[1] else copy av[0]
+ I also changed from if statments, cause attempting to access a array member
+ that is not set can lead to odd things - TSL (3/12/06) */
+ if (!anope_set_mod_current_buffer(ac, av)) {
+ if (ac >= 1) {
+ if (nickIsServices(av[0], 1)) {
+ mod_current_buffer =
+ (ac > 1 ? sstrdup(av[1]) : sstrdup(av[0]));
+ } else {
+ mod_current_buffer =
+ (ac > 1 ? sstrdup(av[1]) : sstrdup(av[0]));
+ }
+ } 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 = current->mod_name;
+ retVal = current->func(source, ac, av);
+ mod_current_module_name = NULL;
+ current = current->next;
+ }
+ }
+ }
+ } else {
+ if (debug)
+ alog("debug: unknown message from server (%s)", inbuf);
+ }
+
+ /* Load/unload modules if needed */
+ handleModuleOperationQueue();
+
+ /* Free argument list we created */
+ free(av);
+}
+
+/*************************************************************************/
diff --git a/src/protocol/Makefile b/src/protocol/Makefile
new file mode 100644
index 000000000..ab837e459
--- /dev/null
+++ b/src/protocol/Makefile
@@ -0,0 +1,45 @@
+include ./Makefile.inc
+
+MAKEARGS = 'CFLAGS=${CFLAGS}' 'CC=${CC}' 'ANOPELIBS=${ANOPELIBS}' \
+ 'LDFLAGS=${LDFLAGS}' 'BINDEST=${BINDEST}' 'INSTALL=${INSTALL}' \
+ 'INCLUDEDIR=${INCLUDEDIR}' 'RM=${RM}' 'CP=${CP}' \
+ 'TOUCH=${TOUCH}' 'SHELL=${SHELL}' 'DATDEST=${DATDEST}' \
+ 'RUNGROUP=${RUNGROUP}' 'MODULE_PATH=${MODULE_PATH}' \
+ 'PROFILE=${PROFILE}' 'SHARED=${SHARED}' 'MODULEFLAGS=${MODULEFLAGS}'
+
+OBJECTS= $(SRCS:.c=.o)
+SO_FILES=$(OBJECTS:.o=.s)
+CDEFS= -rdynamic -Wall
+
+all: modules subs
+
+modules: $(OBJECTS) $(SO_FILES)
+
+install:
+ $(CP) ./*.so $(MODULE_PATH)
+
+distclean: clean spotless
+
+.c.o:
+ $(CC) ${CFLAGS} ${CDEFS} ${MODULEFLAGS} -I../${INCLUDEDIR} -c $<
+
+.o.s:
+ $(CC) ${SHARED} ../mod_version.o $< -o $*.so ${PROFILE}
+ @$(TOUCH) $*.s
+
+subs:
+ @for i in $(SUBS); do \
+ echo "make all in $$i..."; \
+ (cd $$i; $(MAKE) $(MAKEARGS) all); done
+
+subs_clean:
+ @for i in $(SUBS); do \
+ echo "cleaning in $$i..."; \
+ (cd $$i; $(MAKE) clean); done
+
+clean: subs_clean
+ rm -f *.o *.s *.so *.c~ core
+
+spotless: subs_clean
+ rm -f *.o *.s *.so *.c~ core *.so Makefile.inc
+
diff --git a/src/protocol/Makefile.sub b/src/protocol/Makefile.sub
new file mode 100644
index 000000000..a2d6a414a
--- /dev/null
+++ b/src/protocol/Makefile.sub
@@ -0,0 +1,29 @@
+MAKEARGS = 'CFLAGS=${CFLAGS}' 'CC=${CC}' 'ANOPELIBS=${ANOPELIBS}' \
+ 'LDFLAGS=${LDFLAGS}' 'BINDEST=${BINDEST}' 'INSTALL=${INSTALL}' \
+ 'INCLUDEDIR=${INCLUDEDIR}' 'RM=${RM}' 'CP=${CP}' \
+ 'TOUCH=${TOUCH}' 'SHELL=${SHELL}' 'DATDEST=${DATDEST}' \
+ 'RUNGROUP=${RUNGROUP}' 'MODULE_PATH=${MODULE_PATH}' \
+ 'PROFILE=${PROFILE}' 'SHARED=${SHARED}' 'MODULEFLAGS=${MODULEFLAGS}'
+
+OBJECTS= $(SRCS:.c=.o)
+SO_FILES=$(OBJECTS:.o=.s)
+CDEFS= -rdynamic -Wall
+
+all: module
+
+module: $(OBJECTS) so
+
+distclean: spotless
+
+.c.o:
+ $(CC) ${CFLAGS} ${CDEFS} ${MODULEFLAGS} -I../ -I../../${INCLUDEDIR} -c $<
+
+so:
+ $(CC) ${SHARED} $(OBJECTS) -o ../$(TARGET).so ${PROFILE}
+
+clean:
+ rm -f *.o *.so *.c~ core
+
+spotless: clean
+ rm -f *~ *.o *.so *.c~ core
+
diff --git a/src/protocol/Makefile.win32 b/src/protocol/Makefile.win32
new file mode 100644
index 000000000..32e3ae1d5
--- /dev/null
+++ b/src/protocol/Makefile.win32
@@ -0,0 +1,26 @@
+include ../../Makefile.inc.win32
+
+SRCS=bahamut.c charybdis.c dreamforge.c hybrid.c inspircd10.c inspircd11.c plexus2.c plexus3.c ptlink.c rageircd.c \
+ ratbox.c shadowircd.c solidircd.c ultimate2.c ultimate3.c unreal31.c unreal32.c viagra.c
+
+OBJECTS= $(SRCS:.c=.dll)
+CFLAGS=/LD /MD /D MODULE_COMPILE $(CFLAGS) /I"../../include"
+LFLAGS=/link ../anope.lib wsock32.lib $(LIBS) $(LFLAGS) $(MYSQL_LIB_PATH) /export:AnopeInit /VERSION:$(VERSION)
+
+all: $(OBJECTS)
+
+distclean: clean spotless
+
+.c.dll:
+ $(CC) $(CFLAGS) $< ..\mod_version.c $(LFLAGS)
+
+clean:
+ -@del *.obj
+
+spotless: clean
+ -@del *.dll *.lib *.exp *.manifest
+
+install:
+ -@mkdir ..\..\$(DATDEST)\modules
+ -@mkdir ..\..\$(DATDEST)\modules\runtime
+ -@copy *.dll ..\..\$(DATDEST)\modules
diff --git a/src/protocol/bahamut.c b/src/protocol/bahamut.c
new file mode 100644
index 000000000..e00fa2a45
--- /dev/null
+++ b/src/protocol/bahamut.c
@@ -0,0 +1,1680 @@
+/* Bahamut functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ *
+ */
+
+/*************************************************************************/
+
+#include "services.h"
+#include "pseudo.h"
+#include "bahamut.h"
+
+IRCDVar myIrcd[] = {
+ {"BahamutIRCd 1.4.*/1.8.*", /* ircd name */
+ "+o", /* nickserv mode */
+ "+o", /* chanserv mode */
+ "+o", /* memoserv mode */
+ "+", /* hostserv mode */
+ "+io", /* operserv mode */
+ "+o", /* botserv mode */
+ "+h", /* helpserv mode */
+ "+i", /* Dev/Null mode */
+ "+io", /* Global mode */
+ "+o", /* nickserv alias mode */
+ "+o", /* chanserv alias mode */
+ "+o", /* memoserv alias mode */
+ "+", /* hostserv alias mode */
+ "+io", /* operserv alias mode */
+ "+o", /* botserv alias mode */
+ "+h", /* helpserv alias mode */
+ "+i", /* Dev/Null alias mode */
+ "+io", /* Global alias mode */
+ "+", /* Used by BotServ Bots */
+ 2, /* Chan Max Symbols */
+ "-cilmnpstOR", /* Modes to Remove */
+ "+o", /* Channel Umode used by Botserv bots */
+ 1, /* SVSNICK */
+ 0, /* Vhost */
+ 0, /* Has Owner */
+ NULL, /* Mode to set for an owner */
+ NULL, /* Mode to unset for an owner */
+ NULL, /* Mode to set for channel admin */
+ NULL, /* Mode to unset for channel admin */
+ "+rd", /* Mode On Reg */
+ NULL, /* Mode on ID for Roots */
+ NULL, /* Mode on ID for Admins */
+ NULL, /* Mode on ID for Opers */
+ "-r+d", /* Mode on UnReg */
+ "+d", /* Mode on Nick Change */
+ 1, /* Supports SGlines */
+ 1, /* Supports SQlines */
+ 1, /* Supports SZlines */
+ 0, /* Supports Halfop +h */
+ 3, /* Number of server args */
+ 0, /* Join 2 Set */
+ 0, /* Join 2 Message */
+ 1, /* Has exceptions +e */
+ 0, /* TS Topic Forward */
+ 0, /* TS Topci Backward */
+ 0, /* Protected Umode */
+ 0, /* Has Admin */
+ 1, /* Chan SQlines */
+ 1, /* Quit on Kill */
+ 1, /* SVSMODE unban */
+ 0, /* Has Protect */
+ 0, /* Reverse */
+ 1, /* Chan Reg */
+ CMODE_r, /* Channel Mode */
+ 0, /* vidents */
+ 1, /* svshold */
+ 1, /* time stamp on mode */
+ 1, /* NICKIP */
+ 0, /* O:LINE */
+ 1, /* UMODE */
+ 0, /* VHOST ON NICK */
+ 0, /* Change RealName */
+ 0, /* No Knock */
+ 0, /* Admin Only */
+ DEFAULT_MLOCK, /* Default MLOCK */
+ 0, /* Vhost Mode */
+ 1, /* +f */
+ 0, /* +L */
+ CMODE_j, /* Mode */
+ 0, /* Mode */
+ 1,
+ 1, /* No Knock requires +i */
+ NULL, /* CAPAB Chan Modes */
+ 0, /* We support TOKENS */
+ 1, /* TOKENS are CASE inSensitive */
+ 0, /* TIME STAMPS are BASE64 */
+ 1, /* +I support */
+ 0, /* SJOIN ban char */
+ 0, /* SJOIN except char */
+ 0, /* SJOIN invite char */
+ 0, /* Can remove User Channel Modes with SVSMODE */
+ 0, /* Sglines are not enforced until user reconnects */
+ NULL, /* vhost char */
+ 0, /* ts6 */
+ 1, /* support helper umode */
+ 0, /* p10 */
+ NULL, /* character set */
+ 1, /* reports sync state */
+ 0, /* CIDR channelbans */
+ }
+ ,
+ {NULL}
+};
+
+IRCDCAPAB myIrcdcap[] = {
+ {
+ CAPAB_NOQUIT, /* NOQUIT */
+ CAPAB_TSMODE, /* TSMODE */
+ CAPAB_UNCONNECT, /* UNCONNECT */
+ 0, /* NICKIP */
+ 0, /* SJOIN */
+ 0, /* ZIP */
+ CAPAB_BURST, /* BURST */
+ 0, /* TS5 */
+ 0, /* TS3 */
+ CAPAB_DKEY, /* DKEY */
+ 0, /* PT4 */
+ 0, /* SCS */
+ 0, /* QS */
+ 0, /* UID */
+ 0, /* KNOCK */
+ 0, /* CLIENT */
+ 0, /* IPV6 */
+ 0, /* SSJ5 */
+ 0, /* SN2 */
+ 0, /* TOKEN */
+ 0, /* VHOST */
+ 0, /* SSJ3 */
+ 0, /* NICK2 */
+ 0, /* UMODE2 */
+ 0, /* VL */
+ 0, /* TLKEXT */
+ 0, /* DODKEY */
+ CAPAB_DOZIP, /* DOZIP */
+ 0, 0, 0}
+};
+
+
+void bahamut_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) {
+
+ /* This looks better, much better than "add ? (do_add) : (do_remove)".
+ * At least this is readable without paying much attention :) -GD
+ */
+ if (add)
+ user->mode |= umodes[(int) *modes];
+ else
+ user->mode &= ~umodes[(int) *modes];
+
+ switch (*modes++) {
+ case '+':
+ add = 1;
+ break;
+ case '-':
+ add = 0;
+ break;
+ case 'a':
+ if (UnRestrictSAdmin) {
+ break;
+ }
+ if (add && !is_services_admin(user)) {
+ common_svsmode(user, "-a", NULL);
+ user->mode &= ~UMODE_a;
+ }
+ break;
+ case 'd':
+ if (ac == 0) {
+ alog("user: umode +d with no parameter (?) for user %s",
+ user->nick);
+ break;
+ }
+
+ ac--;
+ av++;
+ user->svid = strtoul(*av, NULL, 0);
+ break;
+ case 'o':
+ if (add) {
+ opcnt++;
+
+ if (WallOper)
+ anope_cmd_global(s_OperServ,
+ "\2%s\2 is now an IRC operator.",
+ user->nick);
+ display_news(user, NEWS_OPER);
+
+ } else {
+ opcnt--;
+ }
+ break;
+ case 'r':
+ if (add && !nick_identified(user)) {
+ common_svsmode(user, "-r", NULL);
+ user->mode &= ~UMODE_r;
+ }
+ break;
+ }
+ }
+}
+
+
+unsigned long umodes[128] = {
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused, Unused, Horzontal Tab */
+ 0, 0, 0, /* Line Feed, Unused, Unused */
+ 0, 0, 0, /* Carriage Return, Unused, Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused, Unused, Space */
+ 0, 0, 0, /* ! " # */
+ 0, 0, 0, /* $ % & */
+ 0, 0, 0, /* ! ( ) */
+ 0, 0, 0, /* * + , */
+ 0, 0, 0, /* - . / */
+ 0, 0, /* 0 1 */
+ 0, 0, /* 2 3 */
+ 0, 0, /* 4 5 */
+ 0, 0, /* 6 7 */
+ 0, 0, /* 8 9 */
+ 0, 0, /* : ; */
+ 0, 0, 0, /* < = > */
+ 0, 0, /* ? @ */
+ UMODE_A, 0, 0, /* A B C */
+ UMODE_D, 0, UMODE_F, /* D E F */
+ 0, 0, UMODE_I, /* G H I */
+ 0, UMODE_K, 0, /* J K L */
+ 0, 0, UMODE_O, /* M N O */
+ 0, 0, UMODE_R, /* P Q R */
+ 0, 0, 0, /* S T U */
+ 0, 0, UMODE_X, /* V W X */
+ 0, /* Y */
+ 0, /* Z */
+ 0, 0, 0, /* [ \ ] */
+ 0, 0, 0, /* ^ _ ` */
+ UMODE_a, UMODE_b, UMODE_c, /* a b c */
+ UMODE_d, UMODE_e, UMODE_f, /* d e f */
+ UMODE_g, UMODE_h, UMODE_i, /* g h i */
+ UMODE_j, UMODE_k, 0, /* j k l */
+ UMODE_m, UMODE_n, UMODE_o, /* m n o */
+ 0, 0, UMODE_r, /* p q r */
+ UMODE_s, 0, 0, /* s t u */
+ 0, UMODE_w, UMODE_x, /* v w x */
+ UMODE_y, /* y */
+ 0, /* z */
+ 0, 0, 0, /* { | } */
+ 0, 0 /* ~ � */
+};
+
+char myCsmodes[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,
+
+ '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
+};
+
+
+CMMode myCmmodes[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}, /* BCD */
+ {NULL}, {NULL}, {NULL}, /* EFG */
+ {NULL}, /* H */
+ {add_invite, del_invite}, /* I */
+ {NULL}, /* J */
+ {NULL}, {NULL}, {NULL}, /* KLM */
+ {NULL}, {NULL}, {NULL}, /* NOP */
+ {NULL}, {NULL}, {NULL}, /* QRS */
+ {NULL}, {NULL}, {NULL}, /* TUV */
+ {NULL}, {NULL}, {NULL}, /* WXY */
+ {NULL}, /* Z */
+ {NULL}, {NULL}, /* (char 91 - 92) */
+ {NULL}, {NULL}, {NULL}, /* (char 93 - 95) */
+ {NULL}, /* ` (char 96) */
+ {NULL}, /* a (char 97) */
+ {add_ban, del_ban}, /* b */
+ {NULL}, {NULL}, /* cd */
+ {add_exception, del_exception},
+ {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}
+};
+
+CBMode myCbmodes[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}, /* A */
+ {0}, /* B */
+ {0}, /* C */
+ {0}, /* D */
+ {0}, /* E */
+ {0}, /* F */
+ {0}, /* G */
+ {0}, /* H */
+ {0}, /* I */
+ {0}, /* J */
+ {0}, /* K */
+ {0}, /* L */
+ {CMODE_M, 0, NULL, NULL}, /* M */
+ {0}, /* N */
+ {CMODE_O, CBM_NO_USER_MLOCK, NULL, NULL},
+ {0}, /* P */
+ {0}, /* Q */
+ {CMODE_R, 0, NULL, NULL}, /* R */
+ {0}, /* S */
+ {0}, /* T */
+ {0}, /* U */
+ {0}, /* V */
+ {0}, /* W */
+ {0}, /* X */
+ {0}, /* Y */
+ {0}, /* Z */
+ {0}, {0}, {0}, {0}, {0}, {0},
+ {0}, /* a */
+ {0}, /* b */
+ {CMODE_c, 0, NULL, NULL},
+ {0}, /* d */
+ {0}, /* e */
+ {0}, /* f */
+ {0}, /* g */
+ {0}, /* h */
+ {CMODE_i, 0, NULL, NULL},
+ {CMODE_j, 0, set_flood, cs_set_flood}, /* j */
+ {CMODE_k, 0, chan_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},
+ {0}, /* q */
+ {CMODE_r, CBM_NO_MLOCK, NULL, NULL},
+ {CMODE_s, 0, NULL, NULL},
+ {CMODE_t, 0, NULL, NULL},
+ {0},
+ {0}, /* v */
+ {0}, /* w */
+ {0}, /* x */
+ {0}, /* y */
+ {0}, /* z */
+ {0}, {0}, {0}, {0}
+};
+
+CBModeInfo myCbmodeinfos[] = {
+ {'c', CMODE_c, 0, NULL, NULL},
+ {'i', CMODE_i, 0, NULL, NULL},
+ {'j', CMODE_j, 0, get_flood, cs_get_flood},
+ {'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},
+ {'r', CMODE_r, 0, NULL, NULL},
+ {'s', CMODE_s, 0, NULL, NULL},
+ {'t', CMODE_t, 0, NULL, NULL},
+ {'M', CMODE_M, 0, NULL, NULL},
+ {'O', CMODE_O, 0, NULL, NULL},
+ {'R', CMODE_R, 0, NULL, NULL},
+ {0}
+};
+
+CUMode myCumodes[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},
+ {0}, /* a */
+ {0}, /* b */
+ {0}, /* c */
+ {0}, /* d */
+ {0}, /* e */
+ {0}, /* f */
+ {0}, /* g */
+ {0}, /* h */
+ {0}, /* i */
+ {0}, /* j */
+ {0}, /* k */
+ {0}, /* l */
+ {0}, /* m */
+ {0}, /* n */
+ {CUS_OP, CUF_PROTECT_BOTSERV, check_valid_op},
+ {0}, /* p */
+ {0}, /* q */
+ {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}
+};
+
+
+
+void bahamut_cmd_mode(char *source, char *dest, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ if (ircdcap->tsmode) {
+ if (uplink_capab & ircdcap->tsmode) {
+ send_cmd(source, "MODE %s 0 %s", dest, buf);
+ } else {
+ send_cmd(source, "MODE %s %s", dest, buf);
+ }
+ } else {
+ send_cmd(source, "MODE %s %s", dest, buf);
+ }
+}
+
+/* SVSHOLD - set */
+void bahamut_cmd_svshold(char *nick)
+{
+ send_cmd(ServerName, "SVSHOLD %s %d :%s", nick, NSReleaseTimeout,
+ "Being held for registered user");
+}
+
+/* SVSHOLD - release */
+void bahamut_cmd_release_svshold(char *nick)
+{
+ send_cmd(ServerName, "SVSHOLD %s 0", nick);
+}
+
+/* SVSMODE -b */
+void bahamut_cmd_unban(char *name, char *nick)
+{
+ bahamut_cmd_svsmode_chan(name, "-b", nick);
+}
+
+
+/* SVSMODE channel modes */
+
+void bahamut_cmd_svsmode_chan(char *name, char *mode, char *nick)
+{
+ if (nick) {
+ send_cmd(ServerName, "SVSMODE %s %s %s", name, mode, nick);
+ } else {
+ send_cmd(ServerName, "SVSMODE %s %s", name, mode);
+ }
+}
+
+void bahamut_cmd_bot_chan_mode(char *nick, char *chan)
+{
+ anope_cmd_mode(nick, chan, "%s %s", ircd->botchanumode, nick);
+}
+
+/* EVENT: SJOIN */
+int anope_event_sjoin(char *source, int ac, char **av)
+{
+ do_sjoin(source, ac, av);
+ return MOD_CONT;
+}
+
+/*
+** NICK - new
+** source = NULL
+** parv[0] = nickname
+** parv[1] = hopcount
+** parv[2] = timestamp
+** parv[3] = modes
+** parv[4] = username
+** parv[5] = hostname
+** parv[6] = server
+** parv[7] = servicestamp
+** parv[8] = IP
+** parv[9] = info
+** NICK - change
+** source = oldnick
+** parv[0] = new nickname
+** parv[1] = hopcount
+*/
+int anope_event_nick(char *source, int ac, char **av)
+{
+ User *user;
+
+ if (ac != 2) {
+ 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), NULL, NULL);
+ if (user) {
+ anope_set_umode(user, 1, &av[3]);
+ }
+ } else {
+ do_nick(source, av[0], NULL, NULL, NULL, NULL,
+ strtoul(av[1], NULL, 10), 0, 0, NULL, NULL);
+ }
+ return MOD_CONT;
+}
+
+/* EVENT : CAPAB */
+int anope_event_capab(char *source, int ac, char **av)
+{
+ capab_parse(ac, av);
+ return MOD_CONT;
+}
+
+/* EVENT : OS */
+int anope_event_os(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+ m_privmsg(source, s_OperServ, av[0]);
+ return MOD_CONT;
+}
+
+/* EVENT : NS */
+int anope_event_ns(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+ m_privmsg(source, s_NickServ, av[0]);
+ return MOD_CONT;
+}
+
+/* EVENT : MS */
+int anope_event_ms(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+ m_privmsg(source, s_MemoServ, av[0]);
+ return MOD_CONT;
+}
+
+/* EVENT : HS */
+int anope_event_hs(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+ m_privmsg(source, s_HostServ, av[0]);
+ return MOD_CONT;
+}
+
+/* EVENT : CS */
+int anope_event_cs(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+ m_privmsg(source, s_ChanServ, av[0]);
+ return MOD_CONT;
+}
+
+int anope_event_436(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+
+ m_nickcoll(av[0]);
+ return MOD_CONT;
+}
+
+/* *INDENT-OFF* */
+void moduleAddIRCDMsgs(void) {
+ Message *m;
+
+
+ /* first update the cs protect info about this ircd */
+ updateProtectDetails("PROTECT","PROTECTME","protect","deprotect","AUTOPROTECT","+","-");
+
+ /* now add the commands */
+ m = createMessage("401", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("402", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("436", anope_event_436); addCoreMessage(IRCD,m);
+ m = createMessage("AWAY", anope_event_away); addCoreMessage(IRCD,m);
+ m = createMessage("INVITE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("JOIN", anope_event_join); addCoreMessage(IRCD,m);
+ m = createMessage("KICK", anope_event_kick); addCoreMessage(IRCD,m);
+ m = createMessage("KILL", anope_event_kill); addCoreMessage(IRCD,m);
+ m = createMessage("MODE", anope_event_mode); addCoreMessage(IRCD,m);
+ m = createMessage("MOTD", anope_event_motd); addCoreMessage(IRCD,m);
+ m = createMessage("NICK", anope_event_nick); addCoreMessage(IRCD,m);
+ m = createMessage("NOTICE", anope_event_notice); addCoreMessage(IRCD,m);
+ m = createMessage("PART", anope_event_part); addCoreMessage(IRCD,m);
+ m = createMessage("PASS", anope_event_pass); addCoreMessage(IRCD,m);
+ m = createMessage("PING", anope_event_ping); addCoreMessage(IRCD,m);
+ m = createMessage("PRIVMSG", anope_event_privmsg); addCoreMessage(IRCD,m);
+ m = createMessage("QUIT", anope_event_quit); addCoreMessage(IRCD,m);
+ m = createMessage("SERVER", anope_event_server); addCoreMessage(IRCD,m);
+ m = createMessage("SQUIT", anope_event_squit); addCoreMessage(IRCD,m);
+ m = createMessage("TOPIC", anope_event_topic); addCoreMessage(IRCD,m);
+ m = createMessage("USER", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("WALLOPS", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("WHOIS", anope_event_whois); addCoreMessage(IRCD,m);
+ m = createMessage("AKILL", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("GLOBOPS", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("GNOTICE", anope_event_gnotice); addCoreMessage(IRCD,m);
+ m = createMessage("GOPER", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("RAKILL", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SILENCE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SVSKILL", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SVSMODE", anope_event_mode); addCoreMessage(IRCD,m);
+ m = createMessage("SVSNICK", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SVSNOOP", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SQLINE", anope_event_sqline); addCoreMessage(IRCD,m);
+ m = createMessage("UNSQLINE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("CAPAB", anope_event_capab); addCoreMessage(IRCD,m);
+ m = createMessage("CS", anope_event_cs); addCoreMessage(IRCD,m);
+ m = createMessage("HS", anope_event_hs); addCoreMessage(IRCD,m);
+ m = createMessage("MS", anope_event_ms); addCoreMessage(IRCD,m);
+ m = createMessage("NS", anope_event_ns); addCoreMessage(IRCD,m);
+ m = createMessage("OS", anope_event_os); addCoreMessage(IRCD,m);
+ m = createMessage("RS", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SGLINE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SJOIN", anope_event_sjoin); addCoreMessage(IRCD,m);
+ m = createMessage("SS", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SVINFO", anope_event_svinfo); addCoreMessage(IRCD,m);
+ m = createMessage("SZLINE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("UNSGLINE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("UNSZLINE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("ERROR", anope_event_error); addCoreMessage(IRCD,m);
+ m = createMessage("LUSERSLOCK",anope_event_luserslock); addCoreMessage(IRCD,m);
+ m = createMessage("BURST", anope_event_burst); addCoreMessage(IRCD,m);
+ m = createMessage("ADMIN", anope_event_admin); addCoreMessage(IRCD,m);
+
+}
+
+/* *INDENT-ON* */
+
+/* SQLINE */
+void bahamut_cmd_sqline(char *mask, char *reason)
+{
+ if (!mask || !reason) {
+ return;
+ }
+
+ send_cmd(NULL, "SQLINE %s :%s", mask, reason);
+}
+
+/* UNSGLINE */
+void bahamut_cmd_unsgline(char *mask)
+{
+ send_cmd(NULL, "UNSGLINE 0 :%s", mask);
+}
+
+/* UNSZLINE */
+void bahamut_cmd_unszline(char *mask)
+{
+ /* this will likely fail so its only here for legacy */
+ send_cmd(NULL, "UNSZLINE 0 %s", mask);
+ /* this is how we are supposed to deal with it */
+ send_cmd(NULL, "RAKILL %s *", mask);
+}
+
+/* SZLINE */
+void bahamut_cmd_szline(char *mask, char *reason, char *whom)
+{
+ /* this will likely fail so its only here for legacy */
+ send_cmd(NULL, "SZLINE %s :%s", mask, reason);
+ /* this is how we are supposed to deal with it */
+ send_cmd(NULL, "AKILL %s * %d %s %ld :%s", mask, 86400 * 2, whom,
+ (long int) time(NULL), reason);
+}
+
+/* SVSNOOP */
+void bahamut_cmd_svsnoop(char *server, int set)
+{
+ send_cmd(NULL, "SVSNOOP %s %s", server, (set ? "+" : "-"));
+}
+
+void bahamut_cmd_svsadmin(char *server, int set)
+{
+ bahamut_cmd_svsnoop(server, set);
+}
+
+/* SGLINE */
+void bahamut_cmd_sgline(char *mask, char *reason)
+{
+ send_cmd(NULL, "SGLINE %d :%s:%s", (int)strlen(mask), mask, reason);
+}
+
+/* RAKILL */
+void bahamut_cmd_remove_akill(char *user, char *host)
+{
+ send_cmd(NULL, "RAKILL %s %s", host, user);
+}
+
+/* PART */
+void bahamut_cmd_part(char *nick, char *chan, char *buf)
+{
+ if (!nick || !chan) {
+ return;
+ }
+
+ if (buf) {
+ send_cmd(nick, "PART %s :%s", chan, buf);
+ } else {
+ send_cmd(nick, "PART %s", chan);
+ }
+}
+
+/* TOPIC */
+void bahamut_cmd_topic(char *whosets, char *chan, char *whosetit,
+ char *topic, time_t when)
+{
+ send_cmd(whosets, "TOPIC %s %s %lu :%s", chan, whosetit,
+ (unsigned long int) when, topic);
+}
+
+/* UNSQLINE */
+void bahamut_cmd_unsqline(char *user)
+{
+ send_cmd(NULL, "UNSQLINE %s", user);
+}
+
+/* JOIN - SJOIN */
+void bahamut_cmd_join(char *user, char *channel, time_t chantime)
+{
+ send_cmd(user, "SJOIN %ld %s", (long int) chantime, channel);
+}
+
+void bahamut_cmd_burst()
+{
+ send_cmd(NULL, "BURST");
+}
+
+/* AKILL */
+/* parv[1]=host
+ * parv[2]=user
+ * parv[3]=length
+ * parv[4]=akiller
+ * parv[5]=time set
+ * parv[6]=reason
+ */
+void bahamut_cmd_akill(char *user, char *host, char *who, time_t when,
+ time_t expires, char *reason)
+{
+ send_cmd(NULL, "AKILL %s %s %d %s %ld :%s", host, user, 86400 * 2, who,
+ (long int) time(NULL), reason);
+}
+
+/* SVSKILL */
+/* parv[0] = servername
+ * parv[1] = client
+ * parv[2] = nick stamp
+ * parv[3] = kill message
+ */
+/*
+ Note: if the stamp is null 0, the below usage is correct of Bahamut
+*/
+void bahamut_cmd_svskill(char *source, char *user, char *buf)
+{
+
+ if (!source || !user || !buf) {
+ return;
+ }
+
+ send_cmd(source, "SVSKILL %s :%s", user, buf);
+}
+
+/* SVSMODE */
+/* parv[0] - sender
+ * parv[1] - nick
+ * parv[2] - TS (or mode, depending on svs version)
+ * parv[3] - mode (or services id if old svs version)
+ * parv[4] - optional arguement (services id)
+ */
+void bahamut_cmd_svsmode(User * u, int ac, char **av)
+{
+ send_cmd(ServerName, "SVSMODE %s %ld %s%s%s", u->nick,
+ (long int) u->timestamp, av[0], (ac == 2 ? " " : ""),
+ (ac == 2 ? av[1] : ""));
+}
+
+/* SQUIT */
+/*
+ * parv[0] = sender prefix
+ * parv[1] = server name
+ * parv[2] = comment
+*/
+void bahamut_cmd_squit(char *servname, char *message)
+{
+ send_cmd(NULL, "SQUIT %s :%s", servname, message);
+}
+
+/* PONG */
+void bahamut_cmd_pong(char *servname, char *who)
+{
+ send_cmd(servname, "PONG %s", who);
+}
+
+/*
+ * SVINFO
+ * parv[0] = sender prefix
+ * parv[1] = TS_CURRENT for the server
+ * parv[2] = TS_MIN for the server
+ * parv[3] = server is standalone or connected to non-TS only
+ * parv[4] = server's idea of UTC time
+ */
+void bahamut_cmd_svinfo()
+{
+ send_cmd(NULL, "SVINFO 3 1 0 :%ld", (long int) time(NULL));
+}
+
+/* PASS */
+void bahamut_cmd_pass(char *pass)
+{
+ send_cmd(NULL, "PASS %s :TS", pass);
+}
+
+/* SERVER */
+void bahamut_cmd_server(char *servname, int hop, char *descript)
+{
+ send_cmd(NULL, "SERVER %s %d :%s", servname, hop, descript);
+}
+
+/* CAPAB */
+void bahamut_cmd_capab()
+{
+ send_cmd(NULL,
+ "CAPAB SSJOIN NOQUIT BURST UNCONNECT NICKIP TSMODE TS3");
+}
+
+void bahamut_cmd_connect(int servernum)
+{
+ me_server =
+ new_server(NULL, ServerName, ServerDesc, SERVER_ISME, NULL);
+
+ if (servernum == 1) {
+ bahamut_cmd_pass(RemotePassword);
+ } else if (servernum == 2) {
+ bahamut_cmd_pass(RemotePassword2);
+ } else if (servernum == 3) {
+ bahamut_cmd_pass(RemotePassword3);
+ }
+ bahamut_cmd_capab();
+ bahamut_cmd_server(ServerName, 1, ServerDesc);
+ bahamut_cmd_svinfo();
+ bahamut_cmd_burst();
+}
+
+
+
+
+
+/* EVENT : SERVER */
+int anope_event_server(char *source, int ac, char **av)
+{
+ if (!stricmp(av[1], "1")) {
+ uplink = sstrdup(av[0]);
+ }
+
+ do_server(source, av[0], av[1], av[2], NULL);
+ return MOD_CONT;
+}
+
+/* EVENT : PRIVMSG */
+int anope_event_privmsg(char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+ m_privmsg(source, av[0], av[1]);
+ return MOD_CONT;
+}
+
+/* EVENT : SVINFO */
+/*
+ * parv[0] = sender prefix
+ * parv[1] = TS_CURRENT for the server
+ * parv[2] = TS_MIN for the server
+ * parv[3] = server is standalone or connected to non-TS only
+ * parv[4] = server's idea of UTC time
+ */
+int anope_event_svinfo(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+
+int anope_event_part(char *source, int ac, char **av)
+{
+ if (ac < 1 || ac > 2)
+ return MOD_CONT;
+ do_part(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_whois(char *source, int ac, char **av)
+{
+ if (source && ac >= 1) {
+ m_whois(source, av[0]);
+ }
+ return MOD_CONT;
+}
+
+int anope_event_topic(char *source, int ac, char **av)
+{
+ if (ac != 4)
+ return MOD_CONT;
+ do_topic(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_squit(char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+ do_squit(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_quit(char *source, int ac, char **av)
+{
+ if (ac != 1)
+ return MOD_CONT;
+ do_quit(source, ac, av);
+ return MOD_CONT;
+}
+
+/* EVENT: MODE */
+int anope_event_mode(char *source, int ac, char **av)
+{
+ if (ac < 2)
+ return MOD_CONT;
+
+ if (*av[0] == '#' || *av[0] == '&') {
+ do_cmode(source, ac, av);
+ } else {
+ do_umode(source, ac, av);
+ }
+ return MOD_CONT;
+}
+
+/* EVENT: KILL */
+int anope_event_kill(char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+
+ m_kill(av[0], av[1]);
+ return MOD_CONT;
+}
+
+/* EVENT: KICK */
+int anope_event_kick(char *source, int ac, char **av)
+{
+ if (ac != 3)
+ return MOD_CONT;
+ do_kick(source, ac, av);
+ return MOD_CONT;
+}
+
+/* EVENT: JOIN */
+int anope_event_join(char *source, int ac, char **av)
+{
+ if (ac != 1)
+ return MOD_CONT;
+ do_join(source, ac, av);
+ return MOD_CONT;
+}
+
+/* EVENT: MOTD */
+int anope_event_motd(char *source, int ac, char **av)
+{
+ if (!source) {
+ return MOD_CONT;
+ }
+
+ m_motd(source);
+ return MOD_CONT;
+}
+
+void bahamut_cmd_notice_ops(char *source, char *dest, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+ send_cmd(NULL, "NOTICE @%s :%s", dest, buf);
+}
+
+/* NOTICE */
+void bahamut_cmd_notice(char *source, char *dest, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ if (NSDefFlags & NI_MSG) {
+ bahamut_cmd_privmsg2(source, dest, buf);
+ } else {
+ send_cmd(source, "NOTICE %s :%s", dest, buf);
+ }
+}
+
+void bahamut_cmd_notice2(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "NOTICE %s :%s", dest, msg);
+}
+
+void bahamut_cmd_privmsg(char *source, char *dest, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(source, "PRIVMSG %s :%s", dest, buf);
+}
+
+void bahamut_cmd_privmsg2(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "PRIVMSG %s :%s", dest, msg);
+}
+
+void bahamut_cmd_serv_notice(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "NOTICE $%s :%s", dest, msg);
+}
+
+void bahamut_cmd_serv_privmsg(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "PRIVMSG $%s :%s", dest, msg);
+}
+
+/* GLOBOPS */
+void bahamut_cmd_global(char *source, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(source ? source : ServerName, "GLOBOPS :%s", buf);
+}
+
+/* 391 */
+void bahamut_cmd_391(char *source, char *timestr)
+{
+ if (!timestr) {
+ return;
+ }
+ send_cmd(NULL, "391 :%s %s :%s", source, ServerName, timestr);
+}
+
+/* 250 */
+void bahamut_cmd_250(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "250 %s", buf);
+}
+
+/* 307 */
+void bahamut_cmd_307(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "307 %s", buf);
+}
+
+/* 311 */
+void bahamut_cmd_311(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "311 %s", buf);
+}
+
+/* 312 */
+void bahamut_cmd_312(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "312 %s", buf);
+}
+
+/* 317 */
+void bahamut_cmd_317(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "317 %s", buf);
+}
+
+/* 219 */
+void bahamut_cmd_219(char *source, char *letter)
+{
+ if (!source) {
+ return;
+ }
+
+ if (letter) {
+ send_cmd(NULL, "219 %s %c :End of /STATS report.", source,
+ *letter);
+ } else {
+ send_cmd(NULL, "219 %s l :End of /STATS report.", source);
+ }
+}
+
+/* 401 */
+void bahamut_cmd_401(char *source, char *who)
+{
+ if (!source || !who) {
+ return;
+ }
+ send_cmd(ServerName, "401 %s %s :No such service.", source, who);
+}
+
+/* 318 */
+void bahamut_cmd_318(char *source, char *who)
+{
+ if (!source || !who) {
+ return;
+ }
+
+ send_cmd(ServerName, "318 %s %s :End of /WHOIS list.", source, who);
+}
+
+/* 242 */
+void bahamut_cmd_242(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "242 %s", buf);
+}
+
+/* 243 */
+void bahamut_cmd_243(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "243 %s", buf);
+}
+
+/* 211 */
+void bahamut_cmd_211(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "211 %s", buf);
+}
+
+void bahamut_cmd_nick(char *nick, char *name, char *modes)
+{
+ EnforceQlinedNick(nick, NULL);
+ send_cmd(NULL, "NICK %s 1 %ld %s %s %s %s 0 0 :%s", nick,
+ (long int) time(NULL), modes, ServiceUser, ServiceHost,
+ ServerName, name);
+ bahamut_cmd_sqline(nick, "Reserved for services");
+}
+
+void bahamut_cmd_kick(char *source, char *chan, char *user, char *buf)
+{
+ if (buf) {
+ send_cmd(source, "KICK %s %s :%s", chan, user, buf);
+ } else {
+ send_cmd(source, "KICK %s %s", chan, user);
+ }
+}
+
+void bahamut_cmd_372(char *source, char *msg)
+{
+ send_cmd(ServerName, "372 %s :- %s", source, msg);
+}
+
+void bahamut_cmd_372_error(char *source)
+{
+ send_cmd(ServerName, "422 %s :- MOTD file not found! Please "
+ "contact your IRC administrator.", source);
+}
+
+void bahamut_cmd_375(char *source)
+{
+ send_cmd(ServerName, "375 %s :- %s Message of the Day",
+ source, ServerName);
+}
+
+void bahamut_cmd_376(char *source)
+{
+ send_cmd(ServerName, "376 %s :End of /MOTD command.", source);
+}
+
+/* INVITE */
+void bahamut_cmd_invite(char *source, char *chan, char *nick)
+{
+ if (!source || !chan || !nick) {
+ return;
+ }
+
+ send_cmd(source, "INVITE %s %s", nick, chan);
+}
+
+/* QUIT */
+void bahamut_cmd_quit(char *source, char *buf)
+{
+ if (buf) {
+ send_cmd(source, "QUIT :%s", buf);
+ } else {
+ send_cmd(source, "QUIT");
+ }
+}
+
+int anope_event_away(char *source, int ac, char **av)
+{
+ if (!source) {
+ return MOD_CONT;
+ }
+ m_away(source, (ac ? av[0] : NULL));
+ return MOD_CONT;
+}
+
+int anope_event_ping(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+ bahamut_cmd_pong(ac > 1 ? av[1] : ServerName, av[0]);
+ return MOD_CONT;
+}
+
+void bahamut_cmd_351(char *source)
+{
+ send_cmd(ServerName, "351 %s Anope-%s %s :%s - %s (%s) -- %s",
+ source, version_number, ServerName, ircd->name, version_flags,
+ EncModule, version_build);
+
+}
+
+void bahamut_cmd_bot_nick(char *nick, char *user, char *host, char *real,
+ char *modes)
+{
+ EnforceQlinedNick(nick, s_BotServ);
+ send_cmd(NULL, "NICK %s 1 %ld %s %s %s %s 0 0 :%s", nick,
+ (long int) time(NULL), modes, user, host, ServerName, real);
+ bahamut_cmd_sqline(nick, "Reserved for services");
+}
+
+/* SVSNICK */
+/* parv[0] = sender
+ * parv[1] = old nickname
+ * parv[2] = new nickname
+ * parv[3] = timestamp
+ */
+void bahamut_cmd_svsnick(char *source, char *guest, time_t when)
+{
+ if (!source || !guest) {
+ return;
+ }
+ send_cmd(NULL, "SVSNICK %s %s :%ld", source, guest, (long int) when);
+}
+
+void bahamut_cmd_guest_nick(char *nick, char *user, char *host, char *real,
+ char *modes)
+{
+ send_cmd(NULL, "NICK %s 1 %ld %s %s %s %s 0 0 :%s", nick,
+ (long int) time(NULL), modes, user, host, ServerName, real);
+}
+
+void bahamut_cmd_svso(char *source, char *nick, char *flag)
+{
+ /* Not Supported by this IRCD */
+}
+
+void bahamut_cmd_vhost_on(char *nick, char *vIdent, char *vhost)
+{
+ /* Not Supported by this IRCD */
+}
+
+void bahamut_cmd_vhost_off(User * u)
+{
+ /* Not Supported by this IRCD */
+}
+
+/* SVSMODE +d */
+/* sent if svid is something weird */
+void bahamut_cmd_svid_umode(char *nick, time_t ts)
+{
+ send_cmd(ServerName, "SVSMODE %s %lu +d 1", nick,
+ (unsigned long int) ts);
+}
+
+
+/* SVSMODE +d */
+/* nc_change was = 1, and there is no na->status */
+void bahamut_cmd_nc_change(User * u)
+{
+ common_svsmode(u, "+d", "1");
+}
+
+/* SVSMODE +d */
+void bahamut_cmd_svid_umode2(User * u, char *ts)
+{
+ /* not used by bahamut ircds */
+}
+
+
+void bahamut_cmd_svid_umode3(User * u, char *ts)
+{
+ if (u->svid != u->timestamp) {
+ common_svsmode(u, "+rd", ts);
+ } else {
+ common_svsmode(u, "+r", NULL);
+ }
+}
+
+/* NICK <newnick> */
+void bahamut_cmd_chg_nick(char *oldnick, char *newnick)
+{
+ if (!oldnick || !newnick) {
+ return;
+ }
+
+ send_cmd(oldnick, "NICK %s", newnick);
+}
+
+int anope_event_error(char *source, int ac, char **av)
+{
+ if (ac >= 1) {
+ if (debug) {
+ alog("debug: %s", av[0]);
+ }
+ }
+ return MOD_CONT;
+}
+
+int anope_event_notice(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_sqline(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+
+int anope_event_gnotice(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_pass(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+void bahamut_cmd_svsjoin(char *source, char *nick, char *chan, char *param)
+{
+ /* Can not find any reference to these in Bahamut */
+}
+
+void bahamut_cmd_svspart(char *source, char *nick, char *chan)
+{
+ /* Can not find any reference to these in Bahamut */
+}
+
+void bahamut_cmd_swhois(char *source, char *who, char *mask)
+{
+ /* not supported */
+}
+
+
+void bahamut_cmd_eob()
+{
+ send_cmd(NULL, "BURST 0");
+}
+
+int anope_event_burst(char *source, int ac, char **av)
+{
+ Server *s;
+ s = findserver(servlist, source);
+ if (!ac) {
+ /* for future use - start burst */
+ } else {
+ /* If we found a server with the given source, that one just
+ * finished bursting. If there was no source, then our uplink
+ * server finished bursting. -GD
+ */
+ if (!s && serv_uplink)
+ s = serv_uplink;
+ finish_sync(s, 1);
+ }
+ return MOD_CONT;
+}
+
+int anope_event_luserslock(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_rehash(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_credits(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_admin(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int bahamut_flood_mode_check(char *value)
+{
+ char *dp, *end;
+
+ if (value && *value != ':'
+ && (strtoul((*value == '*' ? value + 1 : value), &dp, 10) > 0)
+ && (*dp == ':') && (*(++dp) != 0) && (strtoul(dp, &end, 10) > 0)
+ && (*end == 0)) {
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
+void bahamut_cmd_jupe(char *jserver, char *who, char *reason)
+{
+ char rbuf[256];
+
+ snprintf(rbuf, sizeof(rbuf), "Juped by %s%s%s", who,
+ reason ? ": " : "", reason ? reason : "");
+
+ if (findserver(servlist, jserver))
+ bahamut_cmd_squit(jserver, rbuf);
+ bahamut_cmd_server(jserver, 2, rbuf);
+ new_server(me_server, jserver, rbuf, SERVER_JUPED, NULL);
+}
+
+/* GLOBOPS - to handle old WALLOPS */
+void bahamut_cmd_global_legacy(char *source, char *fmt)
+{
+ send_cmd(source ? source : ServerName, "GLOBOPS :%s", fmt);
+}
+
+/*
+ 1 = valid nick
+ 0 = nick is in valid
+*/
+int bahamut_valid_nick(char *nick)
+{
+ /* no hard coded invalid nicks */
+ return 1;
+}
+
+/*
+ 1 = valid chan
+ 0 = nick is in chan
+*/
+int bahamut_valid_chan(char *chan)
+{
+ /* no silly invalid chans */
+ return 1;
+}
+
+void bahamut_cmd_ctcp(char *source, char *dest, char *buf)
+{
+ char *s;
+ if (!buf) {
+ return;
+ } else {
+ s = normalizeBuffer(buf);
+ }
+
+ send_cmd(source, "NOTICE %s :\1%s \1", dest, s);
+ free(s);
+}
+
+/* this avoids "undefined symbol" messages of those whom try to load mods that
+ call on this function */
+void bahamut_cmd_chghost(char *nick, char *vhost)
+{
+ if (debug) {
+ alog("debug: This IRCD does not support vhosting");
+ }
+}
+
+/**
+ * Tell anope which function we want to perform each task inside of anope.
+ * These prototypes must match what anope expects.
+ **/
+void moduleAddAnopeCmds()
+{
+ pmodule_cmd_svsnoop(bahamut_cmd_svsnoop);
+ pmodule_cmd_remove_akill(bahamut_cmd_remove_akill);
+ pmodule_cmd_topic(bahamut_cmd_topic);
+ pmodule_cmd_vhost_off(bahamut_cmd_vhost_off);
+ pmodule_cmd_akill(bahamut_cmd_akill);
+ pmodule_cmd_svskill(bahamut_cmd_svskill);
+ pmodule_cmd_svsmode(bahamut_cmd_svsmode);
+ pmodule_cmd_372(bahamut_cmd_372);
+ pmodule_cmd_372_error(bahamut_cmd_372_error);
+ pmodule_cmd_375(bahamut_cmd_375);
+ pmodule_cmd_376(bahamut_cmd_376);
+ pmodule_cmd_nick(bahamut_cmd_nick);
+ pmodule_cmd_guest_nick(bahamut_cmd_guest_nick);
+ pmodule_cmd_mode(bahamut_cmd_mode);
+ pmodule_cmd_bot_nick(bahamut_cmd_bot_nick);
+ pmodule_cmd_kick(bahamut_cmd_kick);
+ pmodule_cmd_notice_ops(bahamut_cmd_notice_ops);
+ pmodule_cmd_notice(bahamut_cmd_notice);
+ pmodule_cmd_notice2(bahamut_cmd_notice2);
+ pmodule_cmd_privmsg(bahamut_cmd_privmsg);
+ pmodule_cmd_privmsg2(bahamut_cmd_privmsg2);
+ pmodule_cmd_serv_notice(bahamut_cmd_serv_notice);
+ pmodule_cmd_serv_privmsg(bahamut_cmd_serv_privmsg);
+ pmodule_cmd_bot_chan_mode(bahamut_cmd_bot_chan_mode);
+ pmodule_cmd_351(bahamut_cmd_351);
+ pmodule_cmd_quit(bahamut_cmd_quit);
+ pmodule_cmd_pong(bahamut_cmd_pong);
+ pmodule_cmd_join(bahamut_cmd_join);
+ pmodule_cmd_unsqline(bahamut_cmd_unsqline);
+ pmodule_cmd_invite(bahamut_cmd_invite);
+ pmodule_cmd_part(bahamut_cmd_part);
+ pmodule_cmd_391(bahamut_cmd_391);
+ pmodule_cmd_250(bahamut_cmd_250);
+ pmodule_cmd_307(bahamut_cmd_307);
+ pmodule_cmd_311(bahamut_cmd_311);
+ pmodule_cmd_312(bahamut_cmd_312);
+ pmodule_cmd_317(bahamut_cmd_317);
+ pmodule_cmd_219(bahamut_cmd_219);
+ pmodule_cmd_401(bahamut_cmd_401);
+ pmodule_cmd_318(bahamut_cmd_318);
+ pmodule_cmd_242(bahamut_cmd_242);
+ pmodule_cmd_243(bahamut_cmd_243);
+ pmodule_cmd_211(bahamut_cmd_211);
+ pmodule_cmd_global(bahamut_cmd_global);
+ pmodule_cmd_global_legacy(bahamut_cmd_global_legacy);
+ pmodule_cmd_sqline(bahamut_cmd_sqline);
+ pmodule_cmd_squit(bahamut_cmd_squit);
+ pmodule_cmd_svso(bahamut_cmd_svso);
+ pmodule_cmd_chg_nick(bahamut_cmd_chg_nick);
+ pmodule_cmd_svsnick(bahamut_cmd_svsnick);
+ pmodule_cmd_vhost_on(bahamut_cmd_vhost_on);
+ pmodule_cmd_connect(bahamut_cmd_connect);
+ pmodule_cmd_svshold(bahamut_cmd_svshold);
+ pmodule_cmd_release_svshold(bahamut_cmd_release_svshold);
+ pmodule_cmd_unsgline(bahamut_cmd_unsgline);
+ pmodule_cmd_unszline(bahamut_cmd_unszline);
+ pmodule_cmd_szline(bahamut_cmd_szline);
+ pmodule_cmd_sgline(bahamut_cmd_sgline);
+ pmodule_cmd_unban(bahamut_cmd_unban);
+ pmodule_cmd_svsmode_chan(bahamut_cmd_svsmode_chan);
+ pmodule_cmd_svid_umode(bahamut_cmd_svid_umode);
+ pmodule_cmd_nc_change(bahamut_cmd_nc_change);
+ pmodule_cmd_svid_umode2(bahamut_cmd_svid_umode2);
+ pmodule_cmd_svid_umode3(bahamut_cmd_svid_umode3);
+ pmodule_cmd_svsjoin(bahamut_cmd_svsjoin);
+ pmodule_cmd_svspart(bahamut_cmd_svspart);
+ pmodule_cmd_swhois(bahamut_cmd_swhois);
+ pmodule_cmd_eob(bahamut_cmd_eob);
+ pmodule_flood_mode_check(bahamut_flood_mode_check);
+ pmodule_cmd_jupe(bahamut_cmd_jupe);
+ pmodule_valid_nick(bahamut_valid_nick);
+ pmodule_valid_chan(bahamut_valid_chan);
+ pmodule_cmd_ctcp(bahamut_cmd_ctcp);
+ pmodule_set_umode(bahamut_set_umode);
+}
+
+/**
+ * Now tell anope how to use us.
+ **/
+int AnopeInit(int argc, char **argv)
+{
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion
+ ("$Id$");
+ moduleSetType(PROTOCOL);
+
+ pmodule_ircd_version("BahamutIRCd 1.4.*/1.8.*");
+ pmodule_ircd_cap(myIrcdcap);
+ pmodule_ircd_var(myIrcd);
+ pmodule_ircd_cbmodeinfos(myCbmodeinfos);
+ pmodule_ircd_cumodes(myCumodes);
+ pmodule_ircd_flood_mode_char_set("+j");
+ pmodule_ircd_flood_mode_char_remove("-j");
+ pmodule_ircd_cbmodes(myCbmodes);
+ pmodule_ircd_cmmodes(myCmmodes);
+ pmodule_ircd_csmodes(myCsmodes);
+ pmodule_ircd_useTSMode(0);
+
+ /** Deal with modes anope _needs_ to know **/
+ pmodule_invis_umode(UMODE_i);
+ pmodule_oper_umode(UMODE_o);
+ pmodule_invite_cmode(CMODE_i);
+ pmodule_secret_cmode(CMODE_s);
+ pmodule_private_cmode(CMODE_p);
+ pmodule_key_mode(CMODE_k);
+ pmodule_limit_mode(CMODE_l);
+
+ moduleAddAnopeCmds();
+ moduleAddIRCDMsgs();
+
+ return MOD_CONT;
+}
diff --git a/src/protocol/bahamut.h b/src/protocol/bahamut.h
new file mode 100644
index 000000000..1b60733a9
--- /dev/null
+++ b/src/protocol/bahamut.h
@@ -0,0 +1,131 @@
+/* Bahamut functions
+ *
+ * (C) 2003-2008 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.
+ *
+ *
+ */
+
+/*************************************************************************/
+
+#define UMODE_a 0x00000001 /* umode +a - Services Admin */
+#define UMODE_h 0x00000002 /* umode +h - Helper */
+#define UMODE_i 0x00000004 /* umode +i - Invisible */
+#define UMODE_o 0x00000008 /* umode +o - Oper */
+#define UMODE_r 0x00000010 /* umode +r - registered nick */
+#define UMODE_w 0x00000020 /* umode +w - Get wallops */
+#define UMODE_A 0x00000040 /* umode +A - Server Admin */
+#define UMODE_x 0x00000080 /* umode +x - Squelch with notice */
+#define UMODE_X 0x00000100 /* umode +X - Squelch without notice */
+#define UMODE_F 0x00000200 /* umode +F - no cptr->since message rate throttle */
+#define UMODE_j 0x00000400 /* umode +j - client rejection notices */
+#define UMODE_K 0x00000800 /* umode +K - U: lined server kill messages */
+#define UMODE_O 0x00001000 /* umode +O - Local Oper */
+#define UMODE_s 0x00002000 /* umode +s - Server notices */
+#define UMODE_c 0x00004000 /* umode +c - Client connections/exits */
+#define UMODE_k 0x00008000 /* umode +k - Server kill messages */
+#define UMODE_f 0x00010000 /* umode +f - Server flood messages */
+#define UMODE_y 0x00020000 /* umode +y - Stats/links */
+#define UMODE_d 0x00040000 /* umode +d - Debug info */
+#define UMODE_g 0x00080000 /* umode +g - Globops */
+#define UMODE_b 0x00100000 /* umode +b - Chatops */
+#define UMODE_n 0x00200000 /* umode +n - Routing Notices */
+#define UMODE_m 0x00400000 /* umode +m - spambot notices */
+#define UMODE_e 0x00800000 /* umode +e - oper notices for the above +D */
+#define UMODE_D 0x01000000 /* umode +D - Hidden dccallow umode */
+#define UMODE_I 0x02000000 /* umode +I - invisible oper (masked) */
+#define UMODE_R 0x80000000 /* unmode +R - No non registered msgs */
+
+#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
+#define CMODE_R 0x00000100 /* Only identified users can join */
+#define CMODE_r 0x00000200 /* Set for all registered channels */
+#define CMODE_c 0x00000400 /* Colors can't be used */
+#define CMODE_M 0x00000800 /* Non-regged nicks can't send messages */
+#define CMODE_j 0x00001000 /* join throttle */
+#define CMODE_O 0x00008000 /* Only opers can join */
+
+#define DEFAULT_MLOCK CMODE_n | CMODE_t | CMODE_r
+
+void bahamut_set_umode(User * user, int ac, char **av);
+void bahamut_cmd_svsnoop(char *server, int set);
+void bahamut_cmd_remove_akill(char *user, char *host);
+void bahamut_cmd_topic(char *whosets, char *chan, char *whosetit, char *topic, time_t when);
+void bahamut_cmd_vhost_off(User * u);
+void bahamut_cmd_akill(char *user, char *host, char *who, time_t when,time_t expires, char *reason);
+void bahamut_cmd_svskill(char *source, char *user, char *buf);
+void bahamut_cmd_svsmode(User * u, int ac, char **av);
+void bahamut_cmd_372(char *source, char *msg);
+void bahamut_cmd_372_error(char *source);
+void bahamut_cmd_375(char *source);
+void bahamut_cmd_376(char *source);
+void bahamut_cmd_nick(char *nick, char *name, char *modes);
+void bahamut_cmd_guest_nick(char *nick, char *user, char *host, char *real, char *modes);
+void bahamut_cmd_mode(char *source, char *dest, char *buf);
+void bahamut_cmd_bot_nick(char *nick, char *user, char *host, char *real, char *modes);
+void bahamut_cmd_kick(char *source, char *chan, char *user, char *buf);
+void bahamut_cmd_notice_ops(char *source, char *dest, char *buf);
+void bahamut_cmd_notice(char *source, char *dest, char *buf);
+void bahamut_cmd_notice2(char *source, char *dest, char *msg);
+void bahamut_cmd_privmsg(char *source, char *dest, char *buf);
+void bahamut_cmd_privmsg2(char *source, char *dest, char *msg);
+void bahamut_cmd_serv_notice(char *source, char *dest, char *msg);
+void bahamut_cmd_serv_privmsg(char *source, char *dest, char *msg);
+void bahamut_cmd_bot_chan_mode(char *nick, char *chan);
+void bahamut_cmd_351(char *source);
+void bahamut_cmd_quit(char *source, char *buf);
+void bahamut_cmd_pong(char *servname, char *who);
+void bahamut_cmd_join(char *user, char *channel, time_t chantime);
+void bahamut_cmd_unsqline(char *user);
+void bahamut_cmd_invite(char *source, char *chan, char *nick);
+void bahamut_cmd_part(char *nick, char *chan, char *buf);
+void bahamut_cmd_391(char *source, char *timestr);
+void bahamut_cmd_250(char *buf);
+void bahamut_cmd_307(char *buf);
+void bahamut_cmd_311(char *buf);
+void bahamut_cmd_312(char *buf);
+void bahamut_cmd_317(char *buf);
+void bahamut_cmd_219(char *source, char *letter);
+void bahamut_cmd_401(char *source, char *who);
+void bahamut_cmd_318(char *source, char *who);
+void bahamut_cmd_242(char *buf);
+void bahamut_cmd_243(char *buf);
+void bahamut_cmd_211(char *buf);
+void bahamut_cmd_global(char *source, char *buf);
+void bahamut_cmd_global_legacy(char *source, char *fmt);
+void bahamut_cmd_sqline(char *mask, char *reason);
+void bahamut_cmd_squit(char *servname, char *message);
+void bahamut_cmd_svso(char *source, char *nick, char *flag);
+void bahamut_cmd_chg_nick(char *oldnick, char *newnick);
+void bahamut_cmd_svsnick(char *source, char *guest, time_t when);
+void bahamut_cmd_vhost_on(char *nick, char *vIdent, char *vhost);
+void bahamut_cmd_connect(int servernum);
+void bahamut_cmd_svshold(char *nick);
+void bahamut_cmd_release_svshold(char *nick);
+void bahamut_cmd_unsgline(char *mask);
+void bahamut_cmd_unszline(char *mask);
+void bahamut_cmd_szline(char *mask, char *reason, char *whom);
+void bahamut_cmd_sgline(char *mask, char *reason);
+void bahamut_cmd_unban(char *name, char *nick);
+void bahamut_cmd_svsmode_chan(char *name, char *mode, char *nick);
+void bahamut_cmd_svid_umode(char *nick, time_t ts);
+void bahamut_cmd_nc_change(User * u);
+void bahamut_cmd_svid_umode2(User * u, char *ts);
+void bahamut_cmd_svid_umode3(User * u, char *ts);
+void bahamut_cmd_eob();
+int bahamut_flood_mode_check(char *value);
+void bahamut_cmd_jupe(char *jserver, char *who, char *reason);
+int bahamut_valid_nick(char *nick);
+void bahamut_cmd_ctcp(char *source, char *dest, char *buf);
+
diff --git a/src/protocol/charybdis.c b/src/protocol/charybdis.c
new file mode 100644
index 000000000..c5bd8a740
--- /dev/null
+++ b/src/protocol/charybdis.c
@@ -0,0 +1,2008 @@
+/* Charybdis IRCD functions
+ *
+ * (C) 2006 William Pitcock <nenolod -at- charybdis.be>
+ * (C) 2003-2008 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.
+ */
+
+#include "services.h"
+#include "pseudo.h"
+#include "charybdis.h"
+
+IRCDVar myIrcd[] = {
+ {"Charybdis 1.0+", /* ircd name */
+ "+oiS", /* nickserv mode */
+ "+oiS", /* chanserv mode */
+ "+oiS", /* memoserv mode */
+ "+oiS", /* hostserv mode */
+ "+oaiS", /* operserv mode */
+ "+oiS", /* botserv mode */
+ "+oiS", /* helpserv mode */
+ "+oiS", /* Dev/Null mode */
+ "+oiS", /* Global mode */
+ "+oiS", /* nickserv alias mode */
+ "+oiS", /* chanserv alias mode */
+ "+oiS", /* memoserv alias mode */
+ "+oiS", /* hostserv alias mode */
+ "+oaiS", /* operserv alias mode */
+ "+oiS", /* botserv alias mode */
+ "+oiS", /* helpserv alias mode */
+ "+oiS", /* Dev/Null alias mode */
+ "+oiS", /* Global alias mode */
+ "+oiS", /* Used by BotServ Bots */
+ 2, /* Chan Max Symbols */
+ "-cilmnpstrgzQF", /* Modes to Remove */
+ "+o", /* Channel Umode used by Botserv bots */
+ 1, /* SVSNICK */
+ 1, /* Vhost */
+ 0, /* Has Owner */
+ NULL, /* Mode to set for an owner */
+ NULL, /* Mode to unset for an owner */
+ NULL, /* Mode to set for chan admin */
+ NULL, /* Mode to unset for chan admin */
+ NULL, /* Mode On Reg */
+ NULL, /* Mode on ID for Roots */
+ NULL, /* Mode on ID for Admins */
+ NULL, /* Mode on ID for Opers */
+ NULL, /* Mode on UnReg */
+ NULL, /* Mode on Nick Change */
+ 1, /* Supports SGlines */
+ 1, /* Supports SQlines */
+ 1, /* Supports SZlines */
+ 0, /* Supports Halfop +h */
+ 3, /* Number of server args */
+ 1, /* Join 2 Set */
+ 1, /* Join 2 Message */
+ 1, /* Has exceptions +e */
+ 0, /* TS Topic Forward */
+ 0, /* TS Topci Backward */
+ 0, /* Protected Umode */
+ 0, /* Has Admin */
+ 1, /* Chan SQlines */
+ 0, /* Quit on Kill */
+ 0, /* SVSMODE unban */
+ 0, /* Has Protect */
+ 0, /* Reverse */
+ 0, /* Chan Reg */
+ 0, /* Channel Mode */
+ 0, /* vidents */
+ 1, /* svshold */
+ 0, /* time stamp on mode */
+ 0, /* NICKIP */
+ 0, /* UMODE */
+ 0, /* O:LINE */
+ 1, /* VHOST ON NICK */
+ 0, /* Change RealName */
+ CMODE_p, /* No Knock */
+ 0, /* Admin Only */
+ DEFAULT_MLOCK, /* Default MLOCK */
+ 0, /* Vhost Mode */
+ 1, /* +f */
+ 1, /* +L */
+ CMODE_j, /* +f Mode */
+ CMODE_f, /* +L Mode (+f <target>) */
+ 1, /* On nick change check if they could be identified */
+ 0, /* No Knock requires +i */
+ NULL, /* CAPAB Chan Modes */
+ 0, /* We support TOKENS */
+ 1, /* TOKENS are CASE inSensitive */
+ 0, /* TIME STAMPS are BASE64 */
+ 1, /* +I support */
+ 0, /* SJOIN ban char */
+ 0, /* SJOIN except char */
+ 0, /* SJOIN invite char */
+ 0, /* Can remove User Channel Modes with SVSMODE */
+ 0, /* Sglines are not enforced until user reconnects */
+ NULL, /* vhost char */
+ 1, /* ts6 */
+ 0, /* support helper umode */
+ 0, /* p10 */
+ NULL, /* character set */
+ 0, /* reports sync state */
+ 1, /* CIDR channelbans */
+ }
+ ,
+ {NULL}
+};
+
+IRCDCAPAB myIrcdcap[] = {
+ {
+ 0, /* NOQUIT */
+ 0, /* TSMODE */
+ 0, /* UNCONNECT */
+ 0, /* NICKIP */
+ 0, /* SJOIN */
+ CAPAB_ZIP, /* ZIP */
+ 0, /* BURST */
+ CAPAB_TS5, /* TS5 */
+ 0, /* TS3 */
+ 0, /* DKEY */
+ 0, /* PT4 */
+ 0, /* SCS */
+ CAPAB_QS, /* QS */
+ CAPAB_UID, /* UID */
+ CAPAB_KNOCK, /* KNOCK */
+ 0, /* CLIENT */
+ 0, /* IPV6 */
+ 0, /* SSJ5 */
+ 0, /* SN2 */
+ 0, /* TOKEN */
+ 0, /* VHOST */
+ 0, /* SSJ3 */
+ 0, /* NICK2 */
+ 0, /* UMODE2 */
+ 0, /* VL */
+ 0, /* TLKEXT */
+ 0, /* DODKEY */
+ 0, /* DOZIP */
+ 0, 0, 0}
+};
+
+/*******************************************************************/
+
+void charybdis_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) {
+
+ /* This looks better, much better than "add ? (do_add) : (do_remove)".
+ * At least this is readable without paying much attention :) -GD
+ */
+ if (add)
+ user->mode |= umodes[(int) *modes];
+ else
+ user->mode &= ~umodes[(int) *modes];
+
+ switch (*modes++) {
+ case '+':
+ add = 1;
+ break;
+ case '-':
+ add = 0;
+ break;
+ case 'o':
+ if (add) {
+ opcnt++;
+
+ if (WallOper)
+ anope_cmd_global(s_OperServ,
+ "\2%s\2 is now an IRC operator.",
+ user->nick);
+ display_news(user, NEWS_OPER);
+
+ } else {
+ opcnt--;
+ }
+ break;
+ }
+ }
+}
+
+unsigned long umodes[128] = {
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused, Unused, Horzontal Tab */
+ 0, 0, 0, /* Line Feed, Unused, Unused */
+ 0, 0, 0, /* Carriage Return, Unused, Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused, Unused, Space */
+ 0, 0, 0, /* ! " # */
+ 0, 0, 0, /* $ % & */
+ 0, 0, 0, /* ! ( ) */
+ 0, 0, 0, /* * + , */
+ 0, 0, 0, /* - . / */
+ 0, 0, /* 0 1 */
+ 0, 0, /* 2 3 */
+ 0, 0, /* 4 5 */
+ 0, 0, /* 6 7 */
+ 0, 0, /* 8 9 */
+ 0, 0, /* : ; */
+ 0, 0, 0, /* < = > */
+ 0, 0, /* ? @ */
+ 0, 0, 0, /* A B C */
+ 0, 0, 0, /* D E F */
+ 0, 0, 0, /* G H I */
+ 0, 0, 0, /* J K L */
+ 0, 0, 0, /* M N O */
+ 0, UMODE_Q, UMODE_R, /* P Q R */
+ UMODE_S, 0, 0, /* S T U */
+ 0, 0, 0, /* V W X */
+ 0, /* Y */
+ 0, /* Z */
+ 0, 0, 0, /* [ \ ] */
+ 0, 0, 0, /* ^ _ ` */
+ UMODE_a, 0, 0, /* a b c */
+ 0, 0, 0, /* d e f */
+ UMODE_g, 0, UMODE_i, /* g h i */
+ 0, 0, UMODE_l, /* j k l */
+ 0, 0, UMODE_o, /* m n o */
+ 0, 0, 0, /* p q r */
+ UMODE_s, 0, 0, /* s t u */
+ 0, UMODE_w, 0, /* v w x */
+ 0, /* y */
+ UMODE_z, /* z */
+ 0, 0, 0, /* { | } */
+ 0, 0 /* ~ � */
+};
+
+
+char myCsmodes[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,
+
+ '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
+};
+
+CMMode myCmmodes[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}, /* BCD */
+ {NULL}, {NULL}, {NULL}, /* EFG */
+ {NULL}, /* H */
+ {add_invite, del_invite},
+ {NULL}, /* J */
+ {NULL}, {NULL}, {NULL}, /* KLM */
+ {NULL}, {NULL}, {NULL}, /* NOP */
+ {NULL}, {NULL}, {NULL}, /* QRS */
+ {NULL}, {NULL}, {NULL}, /* TUV */
+ {NULL}, {NULL}, {NULL}, /* WXY */
+ {NULL}, /* Z */
+ {NULL}, {NULL}, /* (char 91 - 92) */
+ {NULL}, {NULL}, {NULL}, /* (char 93 - 95) */
+ {NULL}, /* ` (char 96) */
+ {NULL}, /* a (char 97) */
+ {add_ban, del_ban},
+ {NULL},
+ {NULL},
+ {add_exception, del_exception},
+ {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}
+};
+
+
+CBMode myCbmodes[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}, /* A */
+ {0}, /* B */
+ {0}, /* C */
+ {0}, /* D */
+ {0}, /* E */
+ {CMODE_F, 0, NULL, NULL}, /* F */
+ {0}, /* G */
+ {0}, /* H */
+ {0}, /* I */
+ {0}, /* J */
+ {0}, /* K */
+ {CMODE_L, CBM_NO_USER_MLOCK, NULL, NULL}, /* L */
+ {0}, /* M */
+ {0}, /* N */
+ {0}, /* O */
+ {CMODE_P, CBM_NO_USER_MLOCK, NULL, NULL}, /* P */
+ {CMODE_Q, 0, NULL, NULL}, /* Q */
+ {0}, /* R */
+ {0}, /* S */
+ {0}, /* T */
+ {0}, /* U */
+ {0}, /* V */
+ {0}, /* W */
+ {0}, /* X */
+ {0}, /* Y */
+ {0}, /* Z */
+ {0}, {0}, {0}, {0}, {0}, {0},
+ {0},
+ {0}, /* b */
+ {CMODE_c, 0, NULL, NULL}, /* c */
+ {0}, /* d */
+ {0}, /* e */
+ {CMODE_f, 0, set_redirect, cs_set_redirect}, /* f */
+ {CMODE_g, 0, NULL, NULL}, /* g */
+ {0}, /* h */
+ {CMODE_i, 0, NULL, NULL},
+ {CMODE_j, 0, set_flood, cs_set_flood}, /* j */
+ {CMODE_k, 0, chan_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},
+ {0}, /* q */
+ {CMODE_r, 0, NULL, NULL},
+ {CMODE_s, 0, NULL, NULL},
+ {CMODE_t, 0, NULL, NULL},
+ {0},
+ {0}, /* v */
+ {0}, /* w */
+ {0}, /* x */
+ {0}, /* y */
+ {CMODE_z, 0, NULL, NULL}, /* z */
+ {0}, {0}, {0}, {0}
+};
+
+CBModeInfo myCbmodeinfos[] = {
+ {'c', CMODE_c, 0, NULL, NULL},
+ {'f', CMODE_f, CBM_MINUS_NO_ARG, get_redirect, cs_get_redirect},
+ {'g', CMODE_g, 0, NULL, NULL},
+ {'i', CMODE_i, 0, NULL, NULL},
+ {'j', CMODE_j, CBM_MINUS_NO_ARG, get_flood, cs_get_flood},
+ {'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},
+ {'r', CMODE_r, 0, NULL, NULL},
+ {'s', CMODE_s, 0, NULL, NULL},
+ {'t', CMODE_t, 0, NULL, NULL},
+ {'z', CMODE_z, 0, NULL, NULL},
+ {'F', CMODE_F, 0, NULL, NULL},
+ {'L', CMODE_L, 0, NULL, NULL},
+ {'P', CMODE_P, 0, NULL, NULL},
+ {'Q', CMODE_Q, 0, NULL, NULL},
+ {0}
+};
+
+
+CUMode myCumodes[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},
+
+ {0}, /* a */
+ {0}, /* b */
+ {0}, /* c */
+ {0}, /* d */
+ {0}, /* e */
+ {0}, /* f */
+ {0}, /* g */
+ {0},
+ {0}, /* i */
+ {0}, /* j */
+ {0}, /* k */
+ {0}, /* l */
+ {0}, /* m */
+ {0}, /* n */
+ {CUS_OP, CUF_PROTECT_BOTSERV, check_valid_op},
+ {0}, /* p */
+ {0}, /* q */
+ {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}
+};
+
+
+
+void charybdis_cmd_notice(char *source, char *dest, char *buf)
+{
+ Uid *ud;
+ User *u;
+
+ if (!buf) {
+ return;
+ }
+
+ if (NSDefFlags & NI_MSG) {
+ charybdis_cmd_privmsg2(source, dest, buf);
+ } else {
+ ud = find_uid(source);
+ u = finduser(dest);
+ send_cmd((UseTS6 ? (ud ? ud->uid : source) : source),
+ "NOTICE %s :%s", (UseTS6 ? (u ? u->uid : dest) : dest),
+ buf);
+ }
+}
+
+void charybdis_cmd_notice2(char *source, char *dest, char *msg)
+{
+ Uid *ud;
+ User *u;
+
+ ud = find_uid(source);
+ u = finduser(dest);
+ send_cmd((UseTS6 ? (ud ? ud->uid : source) : source), "NOTICE %s :%s",
+ (UseTS6 ? (u ? u->uid : dest) : dest), msg);
+}
+
+void charybdis_cmd_privmsg(char *source, char *dest, char *buf)
+{
+ Uid *ud, *ud2;
+
+ if (!buf) {
+ return;
+ }
+ ud = find_uid(source);
+ ud2 = find_uid(dest);
+
+ send_cmd((UseTS6 ? (ud ? ud->uid : source) : source), "PRIVMSG %s :%s",
+ (UseTS6 ? (ud2 ? ud2->uid : dest) : dest), buf);
+}
+
+void charybdis_cmd_privmsg2(char *source, char *dest, char *msg)
+{
+ Uid *ud, *ud2;
+
+ ud = find_uid(source);
+ ud2 = find_uid(dest);
+
+ send_cmd((UseTS6 ? (ud ? ud->uid : source) : source), "PRIVMSG %s :%s",
+ (UseTS6 ? (ud2 ? ud2->uid : dest) : dest), msg);
+}
+
+void charybdis_cmd_serv_notice(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "NOTICE $$%s :%s", dest, msg);
+}
+
+void charybdis_cmd_serv_privmsg(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "PRIVMSG $$%s :%s", dest, msg);
+}
+
+
+void charybdis_cmd_global(char *source, char *buf)
+{
+ Uid *u;
+
+ if (!buf) {
+ return;
+ }
+
+ if (source) {
+ u = find_uid(source);
+ if (u) {
+ send_cmd((UseTS6 ? u->uid : source), "OPERWALL :%s", buf);
+ } else {
+ send_cmd((UseTS6 ? TS6SID : ServerName), "WALLOPS :%s", buf);
+ }
+ } else {
+ send_cmd((UseTS6 ? TS6SID : ServerName), "WALLOPS :%s", buf);
+ }
+}
+
+/* GLOBOPS - to handle old WALLOPS */
+void charybdis_cmd_global_legacy(char *source, char *fmt)
+{
+ Uid *u;
+
+ if (source) {
+ u = find_uid(source);
+ if (u) {
+ send_cmd((UseTS6 ? u->uid : source), "OPERWALL :%s", fmt);
+ } else {
+ send_cmd((UseTS6 ? TS6SID : ServerName), "WALLOPS :%s", fmt);
+ }
+ } else {
+ send_cmd((UseTS6 ? TS6SID : ServerName), "WALLOPS :%s", fmt);
+ }
+
+ send_cmd(source ? source : ServerName, "OPERWALL :%s", fmt);
+}
+
+int anope_event_sjoin(char *source, int ac, char **av)
+{
+ do_sjoin(source, ac, av);
+ return MOD_CONT;
+}
+
+/*
+ Non TS6
+
+ av[0] = nick
+ av[1] = hop
+ av[2] = ts
+ av[3] = modes
+ av[4] = user
+ av[5] = host
+ av[6] = server
+ av[7] = info
+
+ TS6
+ av[0] = nick
+ av[1] = hop
+ av[2] = ts
+ av[3] = modes
+ av[4] = user
+ av[5] = host
+ av[6] = IP
+ av[7] = UID
+ av[8] = info
+
+*/
+int anope_event_nick(char *source, int ac, char **av)
+{
+ Server *s;
+ User *user;
+
+ if (UseTS6 && ac == 9) {
+ s = findserver_uid(servlist, source);
+ /* Source is always the server */
+ *source = '\0';
+ user = do_nick(source, av[0], av[4], av[5], s->name, av[8],
+ strtoul(av[2], NULL, 10), 0, 0, NULL, av[7]);
+ if (user) {
+ anope_set_umode(user, 1, &av[3]);
+ }
+ } else {
+ if (ac != 2) {
+ user = do_nick(source, av[0], av[4], av[5], av[6], av[7],
+ strtoul(av[2], NULL, 10), 0, 0, NULL, NULL);
+ if (user)
+ anope_set_umode(user, 1, &av[3]);
+ } else {
+ do_nick(source, av[0], NULL, NULL, NULL, NULL,
+ strtoul(av[1], NULL, 10), 0, 0, NULL, NULL);
+ }
+ }
+ return MOD_CONT;
+}
+
+/*
+ TS6
+ av[0] = nick
+ av[1] = hop
+ av[2] = ts
+ av[3] = modes
+ av[4] = user
+ av[5] = vhost
+ av[6] = IP
+ av[7] = UID
+ ac[8] = host or *
+ ac[9] = services login
+ av[10] = info
+
+*/
+int anope_event_euid(char *source, int ac, char **av)
+{
+ Server *s;
+ User *user;
+ time_t ts;
+
+ if (UseTS6 && ac == 11) {
+ s = findserver_uid(servlist, source);
+ /* Source is always the server */
+ *source = '\0';
+ ts = strtoul(av[2], NULL, 10);
+ user = do_nick(source, av[0], av[4], !strcmp(av[8], "*") ? av[5] : av[8], s->name, av[10],
+ ts, !stricmp(av[0], av[9]) ? ts : 0, 0, av[5], av[7]);
+ if (user) {
+ anope_set_umode(user, 1, &av[3]);
+ }
+ }
+ return MOD_CONT;
+}
+
+int anope_event_topic(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac == 4) {
+ do_topic(source, ac, av);
+ } else {
+ Channel *c = findchan(av[0]);
+ time_t topic_time = time(NULL);
+
+ if (!c) {
+ if (debug) {
+ alog("debug: 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]);
+
+ if (UseTS6) {
+ u = find_byuid(source);
+ if (u) {
+ strscpy(c->topic_setter, u->nick, sizeof(c->topic_setter));
+ } else {
+ strscpy(c->topic_setter, source, sizeof(c->topic_setter));
+ }
+ } else {
+ strscpy(c->topic_setter, source, sizeof(c->topic_setter));
+ }
+ c->topic_time = topic_time;
+
+ record_topic(av[0]);
+
+ if (ac > 1 && *av[1])
+ send_event(EVENT_TOPIC_UPDATED, 2, av[0], av[1]);
+ else
+ send_event(EVENT_TOPIC_UPDATED, 2, av[0], "");
+ }
+ return MOD_CONT;
+}
+
+int anope_event_tburst(char *source, int ac, char **av)
+{
+ char *setter;
+ Channel *c;
+ time_t topic_time;
+
+ if (ac != 4) {
+ return MOD_CONT;
+ }
+
+ setter = myStrGetToken(av[2], '!', 0);
+
+ c = findchan(av[0]);
+ topic_time = strtol(av[1], NULL, 10);
+
+ if (!c) {
+ if (debug) {
+ alog("debug: TOPIC %s for nonexistent channel %s",
+ merge_args(ac - 1, av + 1), av[0]);
+ }
+ if (setter)
+ free(setter);
+ return MOD_CONT;
+ }
+
+ if (check_topiclock(c, topic_time)) {
+ if (setter)
+ free(setter);
+ return MOD_CONT;
+ }
+
+ if (c->topic) {
+ free(c->topic);
+ c->topic = NULL;
+ }
+ if (ac > 1 && *av[3])
+ c->topic = sstrdup(av[3]);
+
+ strscpy(c->topic_setter, setter, sizeof(c->topic_setter));
+ c->topic_time = topic_time;
+
+ record_topic(av[0]);
+
+ if (ac > 1 && *av[3])
+ send_event(EVENT_TOPIC_UPDATED, 2, av[0], av[3]);
+ else
+ send_event(EVENT_TOPIC_UPDATED, 2, av[0], "");
+
+ if (setter)
+ free(setter);
+
+ return MOD_CONT;
+}
+
+int anope_event_436(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+
+ m_nickcoll(av[0]);
+ return MOD_CONT;
+}
+
+
+/* *INDENT-OFF* */
+void moduleAddIRCDMsgs(void)
+{
+ Message *m;
+
+ updateProtectDetails("PROTECT","PROTECTME","protect","deprotect","AUTOPROTECT","+","-");
+
+ if (UseTS6) {
+ TS6SID = sstrdup(Numeric);
+ }
+
+ m = createMessage("401", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("402", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("436", anope_event_436); addCoreMessage(IRCD,m);
+ m = createMessage("AWAY", anope_event_away); addCoreMessage(IRCD,m);
+ m = createMessage("INVITE", anope_event_invite); addCoreMessage(IRCD,m);
+ m = createMessage("JOIN", anope_event_join); addCoreMessage(IRCD,m);
+ m = createMessage("KICK", anope_event_kick); addCoreMessage(IRCD,m);
+ m = createMessage("KILL", anope_event_kill); addCoreMessage(IRCD,m);
+ m = createMessage("MODE", anope_event_mode); addCoreMessage(IRCD,m);
+ m = createMessage("TMODE", anope_event_tmode); addCoreMessage(IRCD,m);
+ m = createMessage("MOTD", anope_event_motd); addCoreMessage(IRCD,m);
+ m = createMessage("NICK", anope_event_nick); addCoreMessage(IRCD,m);
+ m = createMessage("BMASK", anope_event_bmask); addCoreMessage(IRCD,m);
+ m = createMessage("UID", anope_event_nick); addCoreMessage(IRCD,m);
+ m = createMessage("NOTICE", anope_event_notice); addCoreMessage(IRCD,m);
+ m = createMessage("PART", anope_event_part); addCoreMessage(IRCD,m);
+ m = createMessage("PASS", anope_event_pass); addCoreMessage(IRCD,m);
+ m = createMessage("PING", anope_event_ping); addCoreMessage(IRCD,m);
+ m = createMessage("PRIVMSG", anope_event_privmsg); addCoreMessage(IRCD,m);
+ m = createMessage("QUIT", anope_event_quit); addCoreMessage(IRCD,m);
+ m = createMessage("SERVER", anope_event_server); addCoreMessage(IRCD,m);
+ m = createMessage("SQUIT", anope_event_squit); addCoreMessage(IRCD,m);
+ m = createMessage("TOPIC", anope_event_topic); addCoreMessage(IRCD,m);
+ m = createMessage("TB", anope_event_tburst); addCoreMessage(IRCD,m);
+ m = createMessage("USER", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("WALLOPS", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("WHOIS", anope_event_whois); addCoreMessage(IRCD,m);
+ m = createMessage("SVSMODE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SVSNICK", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("CAPAB", anope_event_capab); addCoreMessage(IRCD,m);
+ m = createMessage("SJOIN", anope_event_sjoin); addCoreMessage(IRCD,m);
+ m = createMessage("SVINFO", anope_event_svinfo); addCoreMessage(IRCD,m);
+ m = createMessage("ADMIN", anope_event_admin); addCoreMessage(IRCD,m);
+ m = createMessage("ERROR", anope_event_error); addCoreMessage(IRCD,m);
+ m = createMessage("421", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("ENCAP", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SID", anope_event_sid); addCoreMessage(IRCD,m);
+ m = createMessage("EUID", anope_event_euid); addCoreMessage(IRCD,m);
+}
+
+/* *INDENT-ON* */
+
+
+void charybdis_cmd_sqline(char *mask, char *reason)
+{
+ Uid *ud;
+
+ ud = find_uid(s_OperServ);
+ send_cmd((UseTS6 ? (ud ? ud->uid : s_OperServ) : s_OperServ),
+ "RESV * %s :%s", mask, reason);
+}
+
+void charybdis_cmd_unsgline(char *mask)
+{
+ Uid *ud;
+
+ ud = find_uid(s_OperServ);
+ send_cmd((UseTS6 ? (ud ? ud->uid : s_OperServ) : s_OperServ),
+ "UNXLINE * %s", mask);
+}
+
+void charybdis_cmd_unszline(char *mask)
+{
+ /* not supported */
+}
+
+void charybdis_cmd_szline(char *mask, char *reason, char *whom)
+{
+ /* not supported */
+}
+
+void charybdis_cmd_svsnoop(char *server, int set)
+{
+ /* does not support */
+}
+
+void charybdis_cmd_svsadmin(char *server, int set)
+{
+ charybdis_cmd_svsnoop(server, set);
+}
+
+void charybdis_cmd_sgline(char *mask, char *reason)
+{
+ Uid *ud;
+
+ ud = find_uid(s_OperServ);
+ send_cmd((UseTS6 ? (ud ? ud->uid : s_OperServ) : s_OperServ),
+ "XLINE * %s 0 :%s", mask, reason);
+}
+
+void charybdis_cmd_remove_akill(char *user, char *host)
+{
+ Uid *ud;
+
+ ud = find_uid(s_OperServ);
+ send_cmd((UseTS6 ? (ud ? ud->uid : s_OperServ) : s_OperServ),
+ "UNKLINE * %s %s", user, host);
+}
+
+void charybdis_cmd_topic(char *whosets, char *chan, char *whosetit,
+ char *topic, time_t when)
+{
+ Uid *ud;
+
+ ud = find_uid(whosets);
+ send_cmd((UseTS6 ? (ud ? ud->uid : whosets) : whosets), "TOPIC %s :%s",
+ chan, topic);
+}
+
+void charybdis_cmd_vhost_off(User * u)
+{
+ send_cmd((UseTS6 ? TS6SID : ServerName), "ENCAP * CHGHOST %s :%s",
+ u->nick, u->host);
+}
+
+void charybdis_cmd_vhost_on(char *nick, char *vIdent, char *vhost)
+{
+ send_cmd((UseTS6 ? TS6SID : ServerName), "ENCAP * CHGHOST %s :%s",
+ nick, vhost);
+}
+
+void charybdis_cmd_unsqline(char *user)
+{
+ Uid *ud;
+
+ ud = find_uid(s_OperServ);
+ send_cmd((UseTS6 ? (ud ? ud->uid : s_OperServ) : s_OperServ),
+ "UNRESV * %s", user);
+}
+
+void charybdis_cmd_join(char *user, char *channel, time_t chantime)
+{
+ Uid *ud;
+
+ ud = find_uid(user);
+ send_cmd(NULL, "SJOIN %ld %s + :%s", (long int) chantime,
+ channel, (UseTS6 ? (ud ? ud->uid : user) : user));
+}
+
+/*
+oper: the nick of the oper performing the kline
+target.server: the server(s) this kline is destined for
+duration: the duration if a tkline, 0 if permanent.
+user: the 'user' portion of the kline
+host: the 'host' portion of the kline
+reason: the reason for the kline.
+*/
+
+void charybdis_cmd_akill(char *user, char *host, char *who, time_t when,
+ time_t expires, char *reason)
+{
+ Uid *ud;
+
+ ud = find_uid(s_OperServ);
+
+ send_cmd((UseTS6 ? (ud ? ud->uid : s_OperServ) : s_OperServ),
+ "KLINE * %ld %s %s :%s",
+ (long int) (expires - (long) time(NULL)), user, host, reason);
+}
+
+void charybdis_cmd_svskill(char *source, char *user, char *buf)
+{
+ Uid *ud, *ud2;
+
+ if (!buf) {
+ return;
+ }
+
+ if (!source || !user) {
+ return;
+ }
+
+ ud = find_uid(source);
+ ud2 = find_uid(user);
+ send_cmd((UseTS6 ? (ud ? ud->uid : source) : source), "KILL %s :%s",
+ (UseTS6 ? (ud2 ? ud2->uid : user) : user), buf);
+}
+
+void charybdis_cmd_svsmode(User * u, int ac, char **av)
+{
+ send_cmd((UseTS6 ? TS6SID : ServerName), "SVSMODE %s %s", u->nick,
+ av[0]);
+}
+
+/*
+ * SVINFO
+ * parv[0] = sender prefix
+ * parv[1] = TS_CURRENT for the server
+ * parv[2] = TS_MIN for the server
+ * parv[3] = server is standalone or connected to non-TS only
+ * parv[4] = server's idea of UTC time
+ */
+void charybdis_cmd_svinfo()
+{
+ send_cmd(NULL, "SVINFO 6 3 0 :%ld", (long int) time(NULL));
+}
+
+void charybdis_cmd_svsinfo()
+{
+
+}
+
+/* CAPAB */
+/*
+ QS - Can handle quit storm removal
+ EX - Can do channel +e exemptions
+ CHW - Can do channel wall @#
+ LL - Can do lazy links
+ IE - Can do invite exceptions
+ EOB - Can do EOB message
+ KLN - Can do KLINE message
+ GLN - Can do GLINE message
+ HUB - This server is a HUB
+ UID - Can do UIDs
+ ZIP - Can do ZIPlinks
+ ENC - Can do ENCrypted links
+ KNOCK - supports KNOCK
+ TBURST - supports TBURST
+ PARA - supports invite broadcasting for +p
+ ENCAP - supports message encapsulation
+ SERVICES - supports services-oriented TS6 extensions
+ EUID - supports EUID and non-ENCAP CHGHOST
+*/
+void charybdis_cmd_capab()
+{
+ send_cmd(NULL,
+ "CAPAB :QS EX CHW IE KLN GLN KNOCK TB UNKLN CLUSTER ENCAP SERVICES EUID");
+}
+
+/* PASS */
+void charybdis_cmd_pass(char *pass)
+{
+ if (UseTS6) {
+ send_cmd(NULL, "PASS %s TS 6 :%s", pass, TS6SID);
+ } else {
+ send_cmd(NULL, "PASS %s :TS", pass);
+ }
+}
+
+/* SERVER name hop descript */
+void charybdis_cmd_server(char *servname, int hop, char *descript)
+{
+ send_cmd(NULL, "SERVER %s %d :%s", servname, hop, descript);
+}
+
+void charybdis_cmd_connect(int servernum)
+{
+ /* Make myself known to myself in the serverlist */
+ if (UseTS6) {
+ me_server =
+ new_server(NULL, ServerName, ServerDesc, SERVER_ISME, TS6SID);
+ } else {
+ me_server =
+ new_server(NULL, ServerName, ServerDesc, SERVER_ISME, NULL);
+ }
+ if (servernum == 1)
+ charybdis_cmd_pass(RemotePassword);
+ else if (servernum == 2)
+ charybdis_cmd_pass(RemotePassword2);
+ else if (servernum == 3)
+ charybdis_cmd_pass(RemotePassword3);
+
+ charybdis_cmd_capab();
+ charybdis_cmd_server(ServerName, 1, ServerDesc);
+ charybdis_cmd_svinfo();
+}
+
+void charybdis_cmd_bot_nick(char *nick, char *user, char *host, char *real,
+ char *modes)
+{
+ EnforceQlinedNick(nick, NULL);
+ if (UseTS6) {
+ char *uidbuf = ts6_uid_retrieve();
+ send_cmd(TS6SID, "UID %s 1 %ld %s %s %s 0 %s :%s", nick,
+ (long int) time(NULL), modes, user, host, uidbuf,
+ real);
+ new_uid(nick, uidbuf);
+ } else {
+ send_cmd(NULL, "NICK %s 1 %ld %s %s %s %s :%s", nick,
+ (long int) time(NULL), modes, user, host, ServerName,
+ real);
+ }
+ charybdis_cmd_sqline(nick, "Reserved for services");
+}
+
+void charybdis_cmd_part(char *nick, char *chan, char *buf)
+{
+ Uid *ud;
+
+ ud = find_uid(nick);
+
+ if (buf) {
+ send_cmd((UseTS6 ? ud->uid : nick), "PART %s :%s", chan, buf);
+ } else {
+ send_cmd((UseTS6 ? ud->uid : nick), "PART %s", chan);
+ }
+}
+
+int anope_event_ping(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+ charybdis_cmd_pong(ac > 1 ? av[1] : ServerName, av[0]);
+ return MOD_CONT;
+}
+
+int anope_event_away(char *source, int ac, char **av)
+{
+ User *u = NULL;
+
+ if (UseTS6) {
+ u = find_byuid(source);
+ }
+
+ m_away((UseTS6 ? (u ? u->nick : source) : source),
+ (ac ? av[0] : NULL));
+ return MOD_CONT;
+}
+
+int anope_event_kill(char *source, int ac, char **av)
+{
+ User *u = NULL;
+
+ if (ac != 2)
+ return MOD_CONT;
+
+ if (UseTS6) {
+ u = find_byuid(av[0]);
+ }
+
+ m_kill(u ? u->nick : av[0], av[1]);
+ return MOD_CONT;
+}
+
+int anope_event_kick(char *source, int ac, char **av)
+{
+ if (ac != 3)
+ return MOD_CONT;
+ do_kick(source, ac, av);
+ return MOD_CONT;
+}
+
+void charybdis_cmd_eob()
+{
+ /* doesn't support EOB */
+}
+
+int anope_event_join(char *source, int ac, char **av)
+{
+ if (ac != 1) {
+ /* ignore cmodes in JOIN as per TS6 v8 */
+ do_sjoin(source, ac > 2 ? 2 : ac, av);
+ return MOD_CONT;
+ } else {
+ do_join(source, ac, av);
+ }
+ return MOD_CONT;
+}
+
+int anope_event_motd(char *source, int ac, char **av)
+{
+ if (!source) {
+ return MOD_CONT;
+ }
+
+ m_motd(source);
+ return MOD_CONT;
+}
+
+int anope_event_privmsg(char *source, int ac, char **av)
+{
+ User *u;
+ Uid *ud;
+
+ if (ac != 2) {
+ return MOD_CONT;
+ }
+
+ u = find_byuid(source);
+ ud = find_nickuid(av[0]);
+ m_privmsg((UseTS6 ? (u ? u->nick : source) : source),
+ (UseTS6 ? (ud ? ud->nick : av[0]) : av[0]), av[1]);
+ return MOD_CONT;
+}
+
+int anope_event_part(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac < 1 || ac > 2) {
+ return MOD_CONT;
+ }
+
+ u = find_byuid(source);
+ do_part((UseTS6 ? (u ? u->nick : source) : source), ac, av);
+
+ return MOD_CONT;
+}
+
+int anope_event_whois(char *source, int ac, char **av)
+{
+ Uid *ud;
+
+ if (source && ac >= 1) {
+ ud = find_nickuid(av[0]);
+ m_whois(source, (UseTS6 ? (ud ? ud->nick : av[0]) : av[0]));
+ }
+ return MOD_CONT;
+}
+
+/* EVENT: SERVER */
+int anope_event_server(char *source, int ac, char **av)
+{
+ if (!stricmp(av[1], "1")) {
+ uplink = sstrdup(av[0]);
+ if (UseTS6 && TS6UPLINK) {
+ do_server(source, av[0], av[1], av[2], TS6UPLINK);
+ } else {
+ do_server(source, av[0], av[1], av[2], NULL);
+ }
+ } else {
+ do_server(source, av[0], av[1], av[2], NULL);
+ }
+ return MOD_CONT;
+}
+
+int anope_event_sid(char *source, int ac, char **av)
+{
+ Server *s;
+
+ /* :42X SID trystan.nomadirc.net 2 43X :ircd-charybdis test server */
+
+ s = findserver_uid(servlist, source);
+
+ do_server(s->name, av[0], av[1], av[3], av[2]);
+ return MOD_CONT;
+}
+
+int anope_event_squit(char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+ do_squit(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_quit(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 1) {
+ return MOD_CONT;
+ }
+
+ u = find_byuid(source);
+
+ do_quit((UseTS6 ? (u ? u->nick : source) : source), ac, av);
+ return MOD_CONT;
+}
+
+void charybdis_cmd_372(char *source, char *msg)
+{
+ send_cmd((UseTS6 ? TS6SID : ServerName), "372 %s :- %s", source, msg);
+}
+
+void charybdis_cmd_372_error(char *source)
+{
+ send_cmd((UseTS6 ? TS6SID : ServerName),
+ "422 %s :- MOTD file not found! Please "
+ "contact your IRC administrator.", source);
+}
+
+void charybdis_cmd_375(char *source)
+{
+ send_cmd((UseTS6 ? TS6SID : ServerName),
+ "375 %s :- %s Message of the Day", source, ServerName);
+}
+
+void charybdis_cmd_376(char *source)
+{
+ send_cmd((UseTS6 ? TS6SID : ServerName),
+ "376 %s :End of /MOTD command.", source);
+}
+
+/* 391 */
+void charybdis_cmd_391(char *source, char *timestr)
+{
+ if (!timestr) {
+ return;
+ }
+ send_cmd(NULL, "391 :%s %s :%s", source, ServerName, timestr);
+}
+
+/* 250 */
+void charybdis_cmd_250(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "250 %s", buf);
+}
+
+/* 307 */
+void charybdis_cmd_307(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd((UseTS6 ? TS6SID : ServerName), "307 %s", buf);
+}
+
+/* 311 */
+void charybdis_cmd_311(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd((UseTS6 ? TS6SID : ServerName), "311 %s", buf);
+}
+
+/* 312 */
+void charybdis_cmd_312(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd((UseTS6 ? TS6SID : ServerName), "312 %s", buf);
+}
+
+/* 317 */
+void charybdis_cmd_317(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd((UseTS6 ? TS6SID : ServerName), "317 %s", buf);
+}
+
+/* 219 */
+void charybdis_cmd_219(char *source, char *letter)
+{
+ if (!source) {
+ return;
+ }
+
+ if (letter) {
+ send_cmd(NULL, "219 %s %c :End of /STATS report.", source,
+ *letter);
+ } else {
+ send_cmd(NULL, "219 %s l :End of /STATS report.", source);
+ }
+}
+
+/* 401 */
+void charybdis_cmd_401(char *source, char *who)
+{
+ if (!source || !who) {
+ return;
+ }
+ send_cmd((UseTS6 ? TS6SID : ServerName), "401 %s %s :No such service.",
+ source, who);
+}
+
+/* 318 */
+void charybdis_cmd_318(char *source, char *who)
+{
+ if (!source || !who) {
+ return;
+ }
+
+ send_cmd((UseTS6 ? TS6SID : ServerName),
+ "318 %s %s :End of /WHOIS list.", source, who);
+}
+
+/* 242 */
+void charybdis_cmd_242(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "242 %s", buf);
+}
+
+/* 243 */
+void charybdis_cmd_243(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "243 %s", buf);
+}
+
+/* 211 */
+void charybdis_cmd_211(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "211 %s", buf);
+}
+
+void charybdis_cmd_mode(char *source, char *dest, char *buf)
+{
+ Uid *ud;
+ if (!buf) {
+ return;
+ }
+
+ if (source) {
+ ud = find_uid(source);
+ send_cmd((UseTS6 ? (ud ? ud->uid : source) : source), "MODE %s %s",
+ dest, buf);
+ } else {
+ send_cmd(source, "MODE %s %s", dest, buf);
+ }
+}
+
+void charybdis_cmd_tmode(char *source, char *dest, const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ *buf = '\0';
+
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+ if (!*buf) {
+ return;
+ }
+
+ send_cmd(NULL, "MODE %s %s", dest, buf);
+}
+
+void charybdis_cmd_nick(char *nick, char *name, char *mode)
+{
+ EnforceQlinedNick(nick, NULL);
+ if (UseTS6) {
+ char *uidbuf = ts6_uid_retrieve();
+ send_cmd(TS6SID, "UID %s 1 %ld %s %s %s 0 %s :%s", nick,
+ (long int) time(NULL), mode, ServiceUser, ServiceHost,
+ uidbuf, name);
+ new_uid(nick, uidbuf);
+ } else {
+ send_cmd(NULL, "NICK %s 1 %ld %s %s %s %s :%s", nick,
+ (long int) time(NULL), mode, ServiceUser, ServiceHost,
+ ServerName, name);
+ }
+ charybdis_cmd_sqline(nick, "Reserved for services");
+}
+
+void charybdis_cmd_kick(char *source, char *chan, char *user, char *buf)
+{
+ Uid *ud;
+ User *u;
+
+ ud = find_uid(source);
+ u = finduser(user);
+
+ if (buf) {
+ send_cmd((UseTS6 ? (ud ? ud->uid : source) : source),
+ "KICK %s %s :%s", chan,
+ (UseTS6 ? (u ? u->uid : user) : user), buf);
+ } else {
+ send_cmd((UseTS6 ? (ud ? ud->uid : source) : source), "KICK %s %s",
+ chan, (UseTS6 ? (u ? u->uid : user) : user));
+ }
+}
+
+void charybdis_cmd_notice_ops(char *source, char *dest, char *buf)
+{
+ Uid *ud;
+ ud = find_uid(source);
+
+ if (!buf) {
+ return;
+ }
+
+ send_cmd((UseTS6 ? (ud ? ud->uid : source) : source), "NOTICE @%s :%s", dest, buf);
+}
+
+void charybdis_cmd_bot_chan_mode(char *nick, char *chan)
+{
+ Uid *u;
+
+ if (UseTS6) {
+ u = find_uid(nick);
+ charybdis_cmd_tmode(nick, chan, "%s %s", ircd->botchanumode,
+ (u ? u->uid : nick));
+ } else {
+ anope_cmd_mode(ServerName, chan, "%s %s", ircd->botchanumode, nick);
+ }
+}
+
+/* QUIT */
+void charybdis_cmd_quit(char *source, char *buf)
+{
+ Uid *ud;
+ ud = find_uid(source);
+
+ if (buf) {
+ send_cmd((UseTS6 ? (ud ? ud->uid : source) : source), "QUIT :%s",
+ buf);
+ } else {
+ send_cmd((UseTS6 ? (ud ? ud->uid : source) : source), "QUIT");
+ }
+}
+
+/* PONG */
+void charybdis_cmd_pong(char *servname, char *who)
+{
+ if (UseTS6) {
+ /* deliberately no SID in the first parameter -- jilles */
+ send_cmd(TS6SID, "PONG %s :%s", servname, who);
+ } else {
+ send_cmd(servname, "PONG %s :%s", servname, who);
+ }
+}
+
+/* INVITE */
+void charybdis_cmd_invite(char *source, char *chan, char *nick)
+{
+ Uid *ud;
+ User *u;
+
+ if (!source || !chan || !nick) {
+ return;
+ }
+
+ ud = find_uid(source);
+ u = finduser(nick);
+
+ send_cmd((UseTS6 ? (ud ? ud->uid : source) : source), "INVITE %s %s",
+ (UseTS6 ? (u ? u->uid : nick) : nick), chan);
+}
+
+/* SQUIT */
+void charybdis_cmd_squit(char *servname, char *message)
+{
+ if (!servname || !message) {
+ return;
+ }
+
+ send_cmd(NULL, "SQUIT %s :%s", servname, message);
+}
+
+int anope_event_mode(char *source, int ac, char **av)
+{
+ User *u, *u2;
+
+ if (ac < 2) {
+ return MOD_CONT;
+ }
+
+ if (*av[0] == '#' || *av[0] == '&') {
+ do_cmode(source, ac, av);
+ } else {
+ if (UseTS6) {
+ u = find_byuid(source);
+ u2 = find_byuid(av[0]);
+ av[0] = u2->nick;
+ do_umode(u->nick, ac, av);
+ } else {
+ do_umode(source, ac, av);
+ }
+ }
+ return MOD_CONT;
+}
+
+int anope_event_tmode(char *source, int ac, char **av)
+{
+ if (ac > 2 && (*av[1] == '#' || *av[1] == '&')) {
+ do_cmode(source, ac, av);
+ }
+ return MOD_CONT;
+}
+
+void charybdis_cmd_351(char *source)
+{
+ send_cmd((UseTS6 ? TS6SID : ServerName),
+ "351 %s Anope-%s %s :%s - %s (%s) -- %s", source, version_number,
+ ServerName, ircd->name, version_flags, EncModule, version_build);
+}
+
+/* Event: PROTOCTL */
+int anope_event_capab(char *source, int ac, char **av)
+{
+ int argvsize = 8;
+ int argc;
+ char **argv;
+ char *str;
+
+ if (ac < 1)
+ return MOD_CONT;
+
+ /* We get the params as one arg, we should split it for capab_parse */
+ argv = scalloc(argvsize, sizeof(char *));
+ argc = 0;
+ while ((str = myStrGetToken(av[0], ' ', argc))) {
+ if (argc == argvsize) {
+ argvsize += 8;
+ argv = srealloc(argv, argvsize * sizeof(char *));
+ }
+ argv[argc] = str;
+ argc++;
+ }
+
+ capab_parse(argc, argv);
+
+ /* Free our built ac/av */
+ for (argvsize = 0; argvsize < argc; argvsize++) {
+ free(argv[argvsize]);
+ }
+ free(argv);
+
+ return MOD_CONT;
+}
+
+/* SVSHOLD - set */
+void charybdis_cmd_svshold(char *nick)
+{
+ send_cmd(NULL, "ENCAP * NICKDELAY 300 %s", nick);
+}
+
+/* SVSHOLD - release */
+void charybdis_cmd_release_svshold(char *nick)
+{
+ send_cmd(NULL, "ENCAP * NICKDELAY 0 %s", nick);
+}
+
+/* SVSNICK */
+void charybdis_cmd_svsnick(char *nick, char *newnick, time_t when)
+{
+ User *u;
+
+ if (!nick || !newnick) {
+ return;
+ }
+
+ u = finduser(nick);
+ if (!u)
+ return;
+ send_cmd(NULL, "ENCAP %s RSFNC %s %s %ld %ld", u->server->name,
+ u->nick, newnick, (long int)when, (long int)u->timestamp);
+}
+
+void charybdis_cmd_guest_nick(char *nick, char *user, char *host, char *real,
+ char *modes)
+{
+ /* not supported */
+}
+
+void charybdis_cmd_svso(char *source, char *nick, char *flag)
+{
+ /* Not Supported by this IRCD */
+}
+
+void charybdis_cmd_unban(char *name, char *nick)
+{
+ /* Not Supported by this IRCD */
+}
+
+/* SVSMODE channel modes */
+
+void charybdis_cmd_svsmode_chan(char *name, char *mode, char *nick)
+{
+ /* Not Supported by this IRCD */
+}
+
+/* SVSMODE +d */
+/* sent if svid is something weird */
+void charybdis_cmd_svid_umode(char *nick, time_t ts)
+{
+ /* not supported */
+}
+
+/* SVSMODE +d */
+/* nc_change was = 1, and there is no na->status */
+void charybdis_cmd_nc_change(User * u)
+{
+ /* not supported */
+}
+
+/* SVSMODE +d */
+void charybdis_cmd_svid_umode2(User * u, char *ts)
+{
+ /* not supported */
+}
+
+void charybdis_cmd_svid_umode3(User * u, char *ts)
+{
+ /* not used */
+}
+
+/* NICK <newnick> */
+void charybdis_cmd_chg_nick(char *oldnick, char *newnick)
+{
+ if (!oldnick || !newnick) {
+ return;
+ }
+
+ send_cmd(oldnick, "NICK %s", newnick);
+}
+
+/*
+ * SVINFO
+ * parv[0] = sender prefix
+ * parv[1] = TS_CURRENT for the server
+ * parv[2] = TS_MIN for the server
+ * parv[3] = server is standalone or connected to non-TS only
+ * parv[4] = server's idea of UTC time
+ */
+int anope_event_svinfo(char *source, int ac, char **av)
+{
+ /* currently not used but removes the message : unknown message from server */
+ return MOD_CONT;
+}
+
+int anope_event_pass(char *source, int ac, char **av)
+{
+ if (UseTS6) {
+ TS6UPLINK = sstrdup(av[3]);
+ }
+ return MOD_CONT;
+}
+
+void charybdis_cmd_svsjoin(char *source, char *nick, char *chan, char *param)
+{
+ /* Not Supported by this IRCD */
+}
+
+void charybdis_cmd_svspart(char *source, char *nick, char *chan)
+{
+ /* Not Supported by this IRCD */
+}
+
+void charybdis_cmd_swhois(char *source, char *who, char *mask)
+{
+ /* not supported */
+}
+
+int anope_event_notice(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_admin(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_invite(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_bmask(char *source, int ac, char **av)
+{
+ Channel *c;
+ char *bans;
+ char *b;
+ int count, i;
+
+ /* :42X BMASK 1106409026 #ircops b :*!*@*.aol.com */
+ /* 0 1 2 3 */
+ c = findchan(av[1]);
+
+ if (c) {
+ bans = sstrdup(av[3]);
+ count = myNumToken(bans, ' ');
+ for (i = 0; i <= count - 1; i++) {
+ b = myStrGetToken(bans, ' ', i);
+ if (!stricmp(av[2], "b")) {
+ add_ban(c, b);
+ }
+ if (!stricmp(av[2], "e")) {
+ add_exception(c, b);
+ }
+ if (!stricmp(av[2], "I")) {
+ add_invite(c, b);
+ }
+ if (b)
+ free(b);
+ }
+ free(bans);
+ }
+ return MOD_CONT;
+}
+
+int charybdis_flood_mode_check(char *value)
+{
+ char *dp, *end;
+
+ if (value && *value != ':'
+ && (strtoul((*value == '*' ? value + 1 : value), &dp, 10) > 0)
+ && (*dp == ':') && (*(++dp) != 0) && (strtoul(dp, &end, 10) > 0)
+ && (*end == 0)) {
+ return 1;
+ } else {
+ return 0;
+ }
+
+ return 0;
+}
+
+int anope_event_error(char *source, int ac, char **av)
+{
+ if (ac >= 1) {
+ if (debug) {
+ alog("debug: %s", av[0]);
+ }
+ }
+ return MOD_CONT;
+}
+
+void charybdis_cmd_jupe(char *jserver, char *who, char *reason)
+{
+ char rbuf[256];
+
+ snprintf(rbuf, sizeof(rbuf), "Juped by %s%s%s", who,
+ reason ? ": " : "", reason ? reason : "");
+
+ if (findserver(servlist, jserver))
+ charybdis_cmd_squit(jserver, rbuf);
+ charybdis_cmd_server(jserver, 2, rbuf);
+ new_server(me_server, jserver, rbuf, SERVER_JUPED, NULL);
+}
+
+/*
+ 1 = valid nick
+ 0 = nick is in valid
+*/
+int charybdis_valid_nick(char *nick)
+{
+ /* TS6 Save extension -Certus */
+ if (isdigit(*nick))
+ return 0;
+ return 1;
+}
+
+/*
+ 1 = valid chan
+ 0 = chan is invalid
+*/
+int charybdis_valid_chan(char *chan)
+{
+ /* no hard coded invalid chan */
+ return 1;
+}
+
+
+void charybdis_cmd_ctcp(char *source, char *dest, char *buf)
+{
+ char *s;
+
+ if (!buf) {
+ return;
+ } else {
+ s = normalizeBuffer(buf);
+ }
+
+ send_cmd(source, "NOTICE %s :\1%s \1", dest, s);
+ free(s);
+}
+
+int charybdis_send_account(int argc, char **argv)
+{
+ send_cmd((UseTS6 ? TS6SID : ServerName), "ENCAP * SU %s :%s",
+ argv[0], argv[0]);
+
+ return MOD_CONT;
+}
+
+/* XXX: We need a hook on /ns logout before this is useful! --nenolod */
+/* We have one now! -GD */
+int charybdis_send_deaccount(int argc, char **argv)
+{
+ send_cmd((UseTS6 ? TS6SID : ServerName), "ENCAP * SU %s",
+ argv[0]);
+
+ return MOD_CONT;
+}
+
+/**
+ * Tell anope which function we want to perform each task inside of anope.
+ * These prototypes must match what anope expects.
+ **/
+void moduleAddAnopeCmds()
+{
+ pmodule_cmd_svsnoop(charybdis_cmd_svsnoop);
+ pmodule_cmd_remove_akill(charybdis_cmd_remove_akill);
+ pmodule_cmd_topic(charybdis_cmd_topic);
+ pmodule_cmd_vhost_off(charybdis_cmd_vhost_off);
+ pmodule_cmd_akill(charybdis_cmd_akill);
+ pmodule_cmd_svskill(charybdis_cmd_svskill);
+ pmodule_cmd_svsmode(charybdis_cmd_svsmode);
+ pmodule_cmd_372(charybdis_cmd_372);
+ pmodule_cmd_372_error(charybdis_cmd_372_error);
+ pmodule_cmd_375(charybdis_cmd_375);
+ pmodule_cmd_376(charybdis_cmd_376);
+ pmodule_cmd_nick(charybdis_cmd_nick);
+ pmodule_cmd_guest_nick(charybdis_cmd_guest_nick);
+ pmodule_cmd_mode(charybdis_cmd_mode);
+ pmodule_cmd_bot_nick(charybdis_cmd_bot_nick);
+ pmodule_cmd_kick(charybdis_cmd_kick);
+ pmodule_cmd_notice_ops(charybdis_cmd_notice_ops);
+ pmodule_cmd_notice(charybdis_cmd_notice);
+ pmodule_cmd_notice2(charybdis_cmd_notice2);
+ pmodule_cmd_privmsg(charybdis_cmd_privmsg);
+ pmodule_cmd_privmsg2(charybdis_cmd_privmsg2);
+ pmodule_cmd_serv_notice(charybdis_cmd_serv_notice);
+ pmodule_cmd_serv_privmsg(charybdis_cmd_serv_privmsg);
+ pmodule_cmd_bot_chan_mode(charybdis_cmd_bot_chan_mode);
+ pmodule_cmd_351(charybdis_cmd_351);
+ pmodule_cmd_quit(charybdis_cmd_quit);
+ pmodule_cmd_pong(charybdis_cmd_pong);
+ pmodule_cmd_join(charybdis_cmd_join);
+ pmodule_cmd_unsqline(charybdis_cmd_unsqline);
+ pmodule_cmd_invite(charybdis_cmd_invite);
+ pmodule_cmd_part(charybdis_cmd_part);
+ pmodule_cmd_391(charybdis_cmd_391);
+ pmodule_cmd_250(charybdis_cmd_250);
+ pmodule_cmd_307(charybdis_cmd_307);
+ pmodule_cmd_311(charybdis_cmd_311);
+ pmodule_cmd_312(charybdis_cmd_312);
+ pmodule_cmd_317(charybdis_cmd_317);
+ pmodule_cmd_219(charybdis_cmd_219);
+ pmodule_cmd_401(charybdis_cmd_401);
+ pmodule_cmd_318(charybdis_cmd_318);
+ pmodule_cmd_242(charybdis_cmd_242);
+ pmodule_cmd_243(charybdis_cmd_243);
+ pmodule_cmd_211(charybdis_cmd_211);
+ pmodule_cmd_global(charybdis_cmd_global);
+ pmodule_cmd_global_legacy(charybdis_cmd_global_legacy);
+ pmodule_cmd_sqline(charybdis_cmd_sqline);
+ pmodule_cmd_squit(charybdis_cmd_squit);
+ pmodule_cmd_svso(charybdis_cmd_svso);
+ pmodule_cmd_chg_nick(charybdis_cmd_chg_nick);
+ pmodule_cmd_svsnick(charybdis_cmd_svsnick);
+ pmodule_cmd_vhost_on(charybdis_cmd_vhost_on);
+ pmodule_cmd_connect(charybdis_cmd_connect);
+ pmodule_cmd_svshold(charybdis_cmd_svshold);
+ pmodule_cmd_release_svshold(charybdis_cmd_release_svshold);
+ pmodule_cmd_unsgline(charybdis_cmd_unsgline);
+ pmodule_cmd_unszline(charybdis_cmd_unszline);
+ pmodule_cmd_szline(charybdis_cmd_szline);
+ pmodule_cmd_sgline(charybdis_cmd_sgline);
+ pmodule_cmd_unban(charybdis_cmd_unban);
+ pmodule_cmd_svsmode_chan(charybdis_cmd_svsmode_chan);
+ pmodule_cmd_svid_umode(charybdis_cmd_svid_umode);
+ pmodule_cmd_nc_change(charybdis_cmd_nc_change);
+ pmodule_cmd_svid_umode2(charybdis_cmd_svid_umode2);
+ pmodule_cmd_svid_umode3(charybdis_cmd_svid_umode3);
+ pmodule_cmd_svsjoin(charybdis_cmd_svsjoin);
+ pmodule_cmd_svspart(charybdis_cmd_svspart);
+ pmodule_cmd_swhois(charybdis_cmd_swhois);
+ pmodule_cmd_eob(charybdis_cmd_eob);
+ pmodule_flood_mode_check(charybdis_flood_mode_check);
+ pmodule_cmd_jupe(charybdis_cmd_jupe);
+ pmodule_valid_nick(charybdis_valid_nick);
+ pmodule_valid_chan(charybdis_valid_chan);
+ pmodule_cmd_ctcp(charybdis_cmd_ctcp);
+ pmodule_set_umode(charybdis_set_umode);
+}
+
+/**
+ * Now tell anope how to use us.
+ **/
+int AnopeInit(int argc, char **argv)
+{
+ EvtHook *hk;
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(PROTOCOL);
+
+ pmodule_ircd_version("Charybdis 1.0/1.1+");
+ pmodule_ircd_cap(myIrcdcap);
+ pmodule_ircd_var(myIrcd);
+ pmodule_ircd_cbmodeinfos(myCbmodeinfos);
+ pmodule_ircd_cumodes(myCumodes);
+ pmodule_ircd_flood_mode_char_set("");
+ pmodule_ircd_flood_mode_char_remove("");
+ pmodule_ircd_cbmodes(myCbmodes);
+ pmodule_ircd_cmmodes(myCmmodes);
+ pmodule_ircd_csmodes(myCsmodes);
+ pmodule_ircd_useTSMode(0);
+
+ /** Deal with modes anope _needs_ to know **/
+ pmodule_invis_umode(UMODE_i);
+ pmodule_oper_umode(UMODE_o);
+ pmodule_invite_cmode(CMODE_i);
+ pmodule_secret_cmode(CMODE_s);
+ pmodule_private_cmode(CMODE_p);
+ pmodule_key_mode(CMODE_k);
+ pmodule_limit_mode(CMODE_l);
+
+ moduleAddAnopeCmds();
+ moduleAddIRCDMsgs();
+
+ hk = createEventHook(EVENT_NICK_IDENTIFY, charybdis_send_account);
+ moduleAddEventHook(hk);
+
+ hk = createEventHook(EVENT_NICK_REGISTERED, charybdis_send_account);
+ moduleAddEventHook(hk);
+
+ /* XXX: It'd be nice if we could have an event like this, but it's not there yet :( */
+ /* It's there now! Trystan said so! -GD */
+ hk = createEventHook(EVENT_NICK_LOGOUT, charybdis_send_deaccount);
+ moduleAddEventHook(hk);
+
+ return MOD_CONT;
+}
+
+/* Clean up allocated things in here */
+void AnopeFini(void)
+{
+ if (UseTS6)
+ free(TS6SID);
+}
+
+/* EOF */
diff --git a/src/protocol/charybdis.h b/src/protocol/charybdis.h
new file mode 100644
index 000000000..4208c4d43
--- /dev/null
+++ b/src/protocol/charybdis.h
@@ -0,0 +1,120 @@
+/* Ratbox IRCD functions
+ *
+ * (C) 2003-2008 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.
+ *
+ *
+ */
+
+#define UMODE_a 0x00000001 /* umode a - admin */
+#define UMODE_g 0x00000002 /* umode g - caller ID */
+#define UMODE_i 0x00000004 /* umode i - invisible */
+#define UMODE_o 0x00000008 /* umode o - operator */
+#define UMODE_z 0x00000010 /* umode u - operwall */
+#define UMODE_w 0x00000020 /* umode w - wallops */
+#define UMODE_s 0x00000040 /* umode s - server notices */
+#define UMODE_Q 0x00000080 /* umode Q - block forwarding */
+#define UMODE_R 0x00000200 /* umode R - reject messages from unauthenticated users */
+#define UMODE_S 0x00000400 /* umode S - network service */
+#define UMODE_l 0x00020000 /* umode l - locops */
+
+
+#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
+#define CMODE_l 0x00000080
+#define CMODE_f 0x00000100
+#define CMODE_c 0x00000200
+#define CMODE_r 0x00000400
+#define CMODE_P 0x00000800
+#define CMODE_g 0x00001000
+#define CMODE_z 0x00002000
+#define CMODE_j 0x00004000
+#define CMODE_F 0x00008000
+#define CMODE_L 0x00010000
+#define CMODE_Q 0x00020000
+
+#define DEFAULT_MLOCK CMODE_n | CMODE_t
+
+
+void charybdis_set_umode(User * user, int ac, char **av);
+void charybdis_cmd_svsnoop(char *server, int set);
+void charybdis_cmd_remove_akill(char *user, char *host);
+void charybdis_cmd_topic(char *whosets, char *chan, char *whosetit, char *topic, time_t when);
+void charybdis_cmd_vhost_off(User * u);
+void charybdis_cmd_akill(char *user, char *host, char *who, time_t when,time_t expires, char *reason);
+void charybdis_cmd_svskill(char *source, char *user, char *buf);
+void charybdis_cmd_svsmode(User * u, int ac, char **av);
+void charybdis_cmd_372(char *source, char *msg);
+void charybdis_cmd_372_error(char *source);
+void charybdis_cmd_375(char *source);
+void charybdis_cmd_376(char *source);
+void charybdis_cmd_nick(char *nick, char *name, char *modes);
+void charybdis_cmd_guest_nick(char *nick, char *user, char *host, char *real, char *modes);
+void charybdis_cmd_mode(char *source, char *dest, char *buf);
+void charybdis_cmd_bot_nick(char *nick, char *user, char *host, char *real, char *modes);
+void charybdis_cmd_kick(char *source, char *chan, char *user, char *buf);
+void charybdis_cmd_notice_ops(char *source, char *dest, char *buf);
+void charybdis_cmd_notice(char *source, char *dest, char *buf);
+void charybdis_cmd_notice2(char *source, char *dest, char *msg);
+void charybdis_cmd_privmsg(char *source, char *dest, char *buf);
+void charybdis_cmd_privmsg2(char *source, char *dest, char *msg);
+void charybdis_cmd_serv_notice(char *source, char *dest, char *msg);
+void charybdis_cmd_serv_privmsg(char *source, char *dest, char *msg);
+void charybdis_cmd_bot_chan_mode(char *nick, char *chan);
+void charybdis_cmd_351(char *source);
+void charybdis_cmd_quit(char *source, char *buf);
+void charybdis_cmd_pong(char *servname, char *who);
+void charybdis_cmd_join(char *user, char *channel, time_t chantime);
+void charybdis_cmd_unsqline(char *user);
+void charybdis_cmd_invite(char *source, char *chan, char *nick);
+void charybdis_cmd_part(char *nick, char *chan, char *buf);
+void charybdis_cmd_391(char *source, char *timestr);
+void charybdis_cmd_250(char *buf);
+void charybdis_cmd_307(char *buf);
+void charybdis_cmd_311(char *buf);
+void charybdis_cmd_312(char *buf);
+void charybdis_cmd_317(char *buf);
+void charybdis_cmd_219(char *source, char *letter);
+void charybdis_cmd_401(char *source, char *who);
+void charybdis_cmd_318(char *source, char *who);
+void charybdis_cmd_242(char *buf);
+void charybdis_cmd_243(char *buf);
+void charybdis_cmd_211(char *buf);
+void charybdis_cmd_global(char *source, char *buf);
+void charybdis_cmd_global_legacy(char *source, char *fmt);
+void charybdis_cmd_sqline(char *mask, char *reason);
+void charybdis_cmd_squit(char *servname, char *message);
+void charybdis_cmd_svso(char *source, char *nick, char *flag);
+void charybdis_cmd_chg_nick(char *oldnick, char *newnick);
+void charybdis_cmd_svsnick(char *source, char *guest, time_t when);
+void charybdis_cmd_vhost_on(char *nick, char *vIdent, char *vhost);
+void charybdis_cmd_connect(int servernum);
+void charybdis_cmd_svshold(char *nick);
+void charybdis_cmd_release_svshold(char *nick);
+void charybdis_cmd_unsgline(char *mask);
+void charybdis_cmd_unszline(char *mask);
+void charybdis_cmd_szline(char *mask, char *reason, char *whom);
+void charybdis_cmd_sgline(char *mask, char *reason);
+void charybdis_cmd_unban(char *name, char *nick);
+void charybdis_cmd_svsmode_chan(char *name, char *mode, char *nick);
+void charybdis_cmd_svid_umode(char *nick, time_t ts);
+void charybdis_cmd_nc_change(User * u);
+void charybdis_cmd_svid_umode2(User * u, char *ts);
+void charybdis_cmd_svid_umode3(User * u, char *ts);
+void charybdis_cmd_eob();
+int charybdis_flood_mode_check(char *value);
+void charybdis_cmd_jupe(char *jserver, char *who, char *reason);
+int charybdis_valid_nick(char *nick);
+void charybdis_cmd_ctcp(char *source, char *dest, char *buf);
+
+
diff --git a/src/protocol/configure b/src/protocol/configure
new file mode 100755
index 000000000..68d2b7713
--- /dev/null
+++ b/src/protocol/configure
@@ -0,0 +1,53 @@
+#!/bin/sh
+
+echo2 () {
+ $ECHO2 "$*$ECHO2SUF" # these are defined later
+}
+
+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
+
+
+echo2 "SRCS=" > ./Makefile.inc
+FIRST=1
+for oldfile in *.c
+do
+ if [ "$FIRST" = 1 ] ; then
+ echo2 " "$oldfile >> ./Makefile.inc
+ else
+ echo "\\" >> ./Makefile.inc
+ echo2 " " $oldfile >> ./Makefile.inc
+ fi
+ FIRST=0
+done
+echo "" >> ./Makefile.inc
+
+echo2 "SUBS=" >> ./Makefile.inc
+FIRST=1
+for dir in *
+do
+ if [ -d $dir ] ; then
+ if [ -f $dir/Makefile ] ; then
+ if [ "$FIRST" = 1 ] ; then
+ echo2 " "$dir >> ./Makefile.inc
+ else
+ echo "\\" >> ./Makefile.inc
+ echo2 " " $dir >> ./Makefile.inc
+ fi
+ FIRST=0
+ fi
+ fi
+done
+
+exit 0
+
diff --git a/src/protocol/dreamforge.c b/src/protocol/dreamforge.c
new file mode 100644
index 000000000..3809f3bd7
--- /dev/null
+++ b/src/protocol/dreamforge.c
@@ -0,0 +1,1384 @@
+/* DreamForge IRCD functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ *
+ */
+
+#include "services.h"
+#include "pseudo.h"
+#include "dreamforge.h"
+
+IRCDVar myIrcd[] = {
+ {"DreamForge 4.6.7", /* ircd name */
+ "+o", /* nickserv mode */
+ "+o", /* chanserv mode */
+ "+o", /* memoserv mode */
+ "+", /* hostserv mode */
+ "+io", /* operserv mode */
+ "+o", /* botserv mode */
+ "+h", /* helpserv mode */
+ "+i", /* Dev/Null mode */
+ "+io", /* Global mode */
+ "+o", /* nickserv alias mode */
+ "+o", /* chanserv alias mode */
+ "+o", /* memoserv alias mode */
+ "+", /* hostserv alias mode */
+ "+io", /* operserv alias mode */
+ "+o", /* botserv alias mode */
+ "+h", /* helpserv alias mode */
+ "+i", /* Dev/Null alias mode */
+ "+io", /* Global alias mode */
+ "+", /* Used by BotServ Bots */
+ 2, /* Chan Max Symbols */
+ "-iklmnpstR", /* Modes to Remove */
+ "+o", /* Channel Umode used by Botserv bots */
+ 1, /* SVSNICK */
+ 0, /* Vhost */
+ 0, /* Has Owner */
+ NULL, /* Mode to set for an owner */
+ NULL, /* Mode to unset for an owner */
+ NULL, /* Mode to set for chan admin */
+ NULL, /* Mode to unset for chan admin */
+ "+rd", /* Mode On Reg */
+ NULL, /* Mode on ID for Roots */
+ NULL, /* Mode on ID for Admins */
+ NULL, /* Mode on ID for Opers */
+ "-r+d", /* Mode on UnReg */
+ "+d", /* Mode on Nick Change */
+ 0, /* Supports SGlines */
+ 1, /* Supports SQlines */
+ 0, /* Supports SZlines */
+ 0, /* Supports Halfop +h */
+ 3, /* Number of server args */
+ 0, /* Join 2 Set */
+ 0, /* Join 2 Message */
+ 0, /* Has exceptions +e */
+ 0, /* TS Topic Forward */
+ 1, /* TS Topci Backward */
+ 0, /* Protected Umode */
+ 0, /* Has Admin */
+ 0, /* Chan SQlines */
+ 0, /* Quit on Kill */
+ 0, /* SVSMODE unban */
+ 0, /* Has Protect */
+ 1, /* Reverse */
+ 1, /* Chan Reg */
+ CMODE_r, /* Channel Mode */
+ 0, /* vidents */
+ 0, /* svshold */
+ 1, /* time stamp on mode */
+ 0, /* NICKIP */
+ 0, /* O:LINE */
+ 1, /* UMODE */
+ 0, /* VHOST ON NICK */
+ 0, /* Change RealName */
+ 0, /* No Knock */
+ 0, /* Admin Only */
+ DEFAULT_MLOCK, /* Default MLOCK */
+ 0, /* Vhost Mode */
+ 0, /* +f */
+ 0, /* +L */
+ 0, /* Mode */
+ 0, /* Mode */
+ 0,
+ 1, /* No Knock requires +i */
+ NULL, /* CAPAB Chan Modes */
+ 0, /* We support TOKENS */
+ 1, /* TOKENS are CASE inSensitive */
+ 0, /* TIME STAMPS are BASE64 */
+ 0, /* +I support */
+ 0, /* SJOIN ban char */
+ 0, /* SJOIN except char */
+ 0, /* SJOIN invite char */
+ 0, /* Can remove User Channel Modes with SVSMODE */
+ 0, /* Sglines are not enforced until user reconnects */
+ NULL, /* vhost char */
+ 0, /* ts6 */
+ 1, /* support helper umode */
+ 0, /* p10 */
+ NULL, /* character set */
+ 0, /* reports sync state */
+ 0, /* CIDR channelbans */
+ }
+ ,
+ {NULL}
+};
+
+IRCDCAPAB myIrcdcap[] = {
+ {
+ CAPAB_NOQUIT, /* NOQUIT */
+ 0, /* TSMODE */
+ 0, /* UNCONNECT */
+ 0, /* NICKIP */
+ 0, /* SJOIN */
+ 0, /* ZIP */
+ 0, /* BURST */
+ 0, /* TS5 */
+ 0, /* TS3 */
+ 0, /* DKEY */
+ 0, /* PT4 */
+ 0, /* SCS */
+ 0, /* QS */
+ 0, /* UID */
+ 0, /* KNOCK */
+ 0, /* CLIENT */
+ 0, /* IPV6 */
+ 0, /* SSJ5 */
+ 0, /* SN2 */
+ CAPAB_TOKEN, /* TOKEN */
+ 0, /* VHOST */
+ 0, /* SSJ3 */
+ 0, /* NICK2 */
+ 0, /* UMODE2 */
+ 0, /* VL */
+ 0, /* TLKEXT */
+ 0, /* DODKEY */
+ 0, /* DOZIP */
+ 0, 0, 0}
+};
+
+void dreamforge_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) {
+
+ /* This looks better, much better than "add ? (do_add) : (do_remove)".
+ * At least this is readable without paying much attention :) -GD
+ */
+ if (add)
+ user->mode |= umodes[(int) *modes];
+ else
+ user->mode &= ~umodes[(int) *modes];
+
+ switch (*modes++) {
+ case '+':
+ add = 1;
+ break;
+ case '-':
+ add = 0;
+ break;
+ case 'd':
+ if (ac == 0) {
+ alog("user: umode +d with no parameter (?) for user %s",
+ user->nick);
+ break;
+ }
+
+ ac--;
+ av++;
+ user->svid = strtoul(*av, NULL, 0);
+ break;
+ case 'o':
+ if (add) {
+ opcnt++;
+
+ if (WallOper)
+ anope_cmd_global(s_OperServ,
+ "\2%s\2 is now an IRC operator.",
+ user->nick);
+ display_news(user, NEWS_OPER);
+
+ } else {
+ opcnt--;
+ }
+ break;
+ case 'r':
+ if (add && !nick_identified(user)) {
+ common_svsmode(user, "-r", NULL);
+ user->mode &= ~UMODE_r;
+ }
+ break;
+ }
+ }
+}
+
+
+unsigned long umodes[128] = {
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused, Unused, Horzontal Tab */
+ 0, 0, 0, /* Line Feed, Unused, Unused */
+ 0, 0, 0, /* Carriage Return, Unused, Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused, Unused, Space */
+ 0, 0, 0, /* ! " # */
+ 0, 0, 0, /* $ % & */
+ 0, 0, 0, /* ! ( ) */
+ 0, 0, 0, /* * + , */
+ 0, 0, 0, /* - . / */
+ 0, 0, /* 0 1 */
+ 0, 0, /* 2 3 */
+ 0, 0, /* 4 5 */
+ 0, 0, /* 6 7 */
+ 0, 0, /* 8 9 */
+ 0, 0, /* : ; */
+ 0, 0, 0, /* < = > */
+ 0, 0, /* ? @ */
+ UMODE_A, 0, 0, /* A B C */
+ 0, 0, 0, /* D E F */
+ 0, 0, 0, /* G H I */
+ 0, 0, 0, /* J K L */
+ 0, 0, UMODE_O, /* M N O */
+ 0, 0, 0, /* P Q R */
+ 0, 0, 0, /* S T U */
+ 0, 0, 0, /* V W X */
+ 0, /* Y */
+ 0, /* Z */
+ 0, 0, 0, /* [ \ ] */
+ 0, 0, 0, /* ^ _ ` */
+ UMODE_a, 0, UMODE_c, /* a b c */
+ 0, 0, UMODE_f, /* d e f */
+ UMODE_g, UMODE_h, UMODE_i, /* g h i */
+ 0, UMODE_k, 0, /* j k l */
+ 0, 0, UMODE_o, /* m n o */
+ 0, 0, UMODE_r, /* p q r */
+ UMODE_s, 0, 0, /* s t u */
+ 0, UMODE_w, 0, /* v w x */
+ 0, /* y */
+ 0, /* z */
+ 0, 0, 0, /* { | } */
+ 0, 0 /* ~ � */
+};
+
+char myCsmodes[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,
+
+ '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
+};
+
+
+CMMode myCmmodes[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},
+ {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}
+};
+
+
+CBMode myCbmodes[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}, /* A */
+ {0}, /* B */
+ {0}, /* C */
+ {0}, /* D */
+ {0}, /* E */
+ {0}, /* F */
+ {0}, /* G */
+ {0}, /* H */
+ {0}, /* I */
+ {0}, /* J */
+ {0}, /* K */
+ {0}, /* L */
+ {0}, /* M */
+ {0}, /* N */
+ {0}, /* O */
+ {0}, /* P */
+ {0}, /* Q */
+ {CMODE_R, 0, NULL, NULL}, /* R */
+ {0}, /* S */
+ {0}, /* T */
+ {0}, /* U */
+ {0}, /* V */
+ {0}, /* W */
+ {0}, /* X */
+ {0}, /* Y */
+ {0}, /* Z */
+ {0}, {0}, {0}, {0}, {0}, {0},
+ {0}, /* a */
+ {0}, /* b */
+ {0}, /* c */
+ {0}, /* d */
+ {0}, /* e */
+ {0}, /* f */
+ {0}, /* g */
+ {0}, /* h */
+ {CMODE_i, 0, NULL, NULL},
+ {0}, /* j */
+ {CMODE_k, 0, chan_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},
+ {0}, /* q */
+ {CMODE_r, CBM_NO_MLOCK, NULL, NULL},
+ {CMODE_s, 0, NULL, NULL},
+ {CMODE_t, 0, NULL, NULL},
+ {0},
+ {0}, /* v */
+ {0}, /* w */
+ {0}, /* x */
+ {0}, /* y */
+ {0}, /* z */
+ {0}, {0}, {0}, {0}
+};
+
+CBModeInfo myCbmodeinfos[] = {
+ {'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},
+ {'r', CMODE_r, 0, NULL, NULL},
+ {'s', CMODE_s, 0, NULL, NULL},
+ {'t', CMODE_t, 0, NULL, NULL},
+ {'R', CMODE_R, 0, NULL, NULL},
+ {0}
+};
+
+CUMode myCumodes[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},
+ {0}, /* a */
+ {0}, /* b */
+ {0}, /* c */
+ {0}, /* d */
+ {0}, /* e */
+ {0}, /* f */
+ {0}, /* g */
+ {0}, /* h */
+ {0}, /* i */
+ {0}, /* j */
+ {0}, /* k */
+ {0}, /* l */
+ {0}, /* m */
+ {0}, /* n */
+ {CUS_OP, CUF_PROTECT_BOTSERV, check_valid_op},
+ {0}, /* p */
+ {0}, /* q */
+ {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}
+};
+
+
+
+int anope_event_nick(char *source, int ac, char **av)
+{
+ if (ac != 2) {
+ do_nick(source, av[0], av[3], av[4], av[5], av[7],
+ strtoul(av[2], NULL, 10), strtoul(av[6], NULL, 0), 0, NULL,
+ NULL);
+ } else {
+ do_nick(source, av[0], NULL, NULL, NULL, NULL,
+ strtoul(av[1], NULL, 10), 0, 0, NULL, NULL);
+ }
+ return MOD_CONT;
+}
+
+int anope_event_436(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+
+ m_nickcoll(av[0]);
+ return MOD_CONT;
+}
+
+
+/* *INDENT-OFF* */
+void moduleAddIRCDMsgs(void) {
+
+ Message *m;
+
+ updateProtectDetails("PROTECT","PROTECTME","protect","deprotect","AUTOPROTECT","+","-");
+
+ m = createMessage("401", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("402", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("436", anope_event_436); addCoreMessage(IRCD,m);
+ m = createMessage("AWAY", anope_event_away); addCoreMessage(IRCD,m);
+ m = createMessage("INVITE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("JOIN", anope_event_join); addCoreMessage(IRCD,m);
+ m = createMessage("KICK", anope_event_kick); addCoreMessage(IRCD,m);
+ m = createMessage("KILL", anope_event_kill); addCoreMessage(IRCD,m);
+ m = createMessage("MODE", anope_event_mode); addCoreMessage(IRCD,m);
+ m = createMessage("MOTD", anope_event_motd); addCoreMessage(IRCD,m);
+ m = createMessage("NICK", anope_event_nick); addCoreMessage(IRCD,m);
+ m = createMessage("NOTICE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("PART", anope_event_part); addCoreMessage(IRCD,m);
+ m = createMessage("PASS", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("PING", anope_event_ping); addCoreMessage(IRCD,m);
+ m = createMessage("PRIVMSG", anope_event_privmsg); addCoreMessage(IRCD,m);
+ m = createMessage("QUIT", anope_event_quit); addCoreMessage(IRCD,m);
+ m = createMessage("SERVER", anope_event_server); addCoreMessage(IRCD,m);
+ m = createMessage("SQUIT", anope_event_squit); addCoreMessage(IRCD,m);
+ m = createMessage("TOPIC", anope_event_topic); addCoreMessage(IRCD,m);
+ m = createMessage("USER", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("WALLOPS", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("WHOIS", anope_event_whois); addCoreMessage(IRCD,m);
+ m = createMessage("AKILL", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("GLOBOPS", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("GNOTICE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("GOPER", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("RAKILL", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SILENCE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SVSKILL", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SVSMODE", anope_event_mode); addCoreMessage(IRCD,m);
+ m = createMessage("SVSNICK", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SVSNOOP", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SQLINE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("UNSQLINE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("PROTOCTL", anope_event_capab); addCoreMessage(IRCD,m);
+ m = createMessage("REHASH", anope_event_rehash); addCoreMessage(IRCD,m);
+ m = createMessage("ADMIN", anope_event_admin); addCoreMessage(IRCD,m);
+ m = createMessage("CREDITS", anope_event_credits); addCoreMessage(IRCD,m);
+
+
+}
+
+/* *INDENT-ON* */
+
+/* Event: PROTOCTL */
+int anope_event_capab(char *source, int ac, char **av)
+{
+ capab_parse(ac, av);
+ return MOD_CONT;
+}
+
+void dreamforge_cmd_sqline(char *mask, char *reason)
+{
+ send_cmd(NULL, "SQLINE %s :%s", mask, reason);
+}
+
+void dreamforge_cmd_svsnoop(char *server, int set)
+{
+ send_cmd(NULL, "SVSNOOP %s %s", server, (set ? "+" : "-"));
+}
+
+void dreamforge_cmd_svsadmin(char *server, int set)
+{
+ dreamforge_cmd_svsnoop(server, set);
+}
+
+void dreamforge_cmd_remove_akill(char *user, char *host)
+{
+ send_cmd(NULL, "RAKILL %s %s", host, user);
+}
+
+void dreamforge_cmd_topic(char *whosets, char *chan, char *whosetit,
+ char *topic, time_t when)
+{
+ send_cmd(whosets, "TOPIC %s %s %lu :%s", chan, whosetit,
+ (unsigned long int) when, topic);
+}
+
+/* PART */
+void dreamforge_cmd_part(char *nick, char *chan, char *buf)
+{
+ if (!nick || !chan) {
+ return;
+ }
+
+ if (buf) {
+ send_cmd(nick, "PART %s :%s", chan, buf);
+ } else {
+ send_cmd(nick, "PART %s", chan);
+ }
+}
+
+
+void dreamforge_cmd_unsqline(char *user)
+{
+ send_cmd(NULL, "UNSQLINE %s", user);
+}
+
+void dreamforge_cmd_join(char *user, char *channel, time_t chantime)
+{
+ send_cmd(user, "JOIN %s", channel);
+}
+
+void dreamforge_cmd_akill(char *user, char *host, char *who, time_t when,
+ time_t expires, char *reason)
+{
+ send_cmd(NULL, "AKILL %s %s :%s", host, user, reason);
+}
+
+
+void dreamforge_cmd_svskill(char *source, char *user, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ if (!source || !user) {
+ return;
+ }
+
+ send_cmd(source, "KILL %s :%s", user, buf);
+}
+
+void dreamforge_cmd_svsmode(User * u, int ac, char **av)
+{
+ send_cmd(ServerName, "SVSMODE %s %s%s%s", u->nick, av[0],
+ (ac == 2 ? " " : ""), (ac == 2 ? av[1] : ""));
+}
+
+
+void dreamforge_cmd_squit(char *servname, char *message)
+{
+ send_cmd(NULL, "SQUIT %s :%s", servname, message);
+}
+
+void anope_pong(char *servname)
+{
+ send_cmd(servname, "PONG %s", servname);
+}
+
+/* PASS */
+void dreamforge_cmd_pass(char *pass)
+{
+ send_cmd(NULL, "PASS :%s", pass);
+}
+
+void dreamforge_cmd_capab()
+{
+ send_cmd(NULL, "PROTOCTL NOQUIT");
+}
+
+/* SERVER name hop descript */
+void dreamforge_cmd_server(char *servname, int hop, char *descript)
+{
+ send_cmd(NULL, "SERVER %s %d :%s", servname, hop, descript);
+}
+
+void dreamforge_cmd_connect(int servernum)
+{
+ me_server =
+ new_server(NULL, ServerName, ServerDesc, SERVER_ISME, NULL);
+
+ dreamforge_cmd_capab();
+ if (servernum == 1)
+ dreamforge_cmd_pass(RemotePassword);
+ if (servernum == 2)
+ dreamforge_cmd_pass(RemotePassword2);
+ if (servernum == 3)
+ dreamforge_cmd_pass(RemotePassword3);
+ dreamforge_cmd_server(ServerName, 1, ServerDesc);
+}
+
+void dreamforge_cmd_bot_chan_mode(char *nick, char *chan)
+{
+ anope_cmd_mode(nick, chan, "%s %s %s", ircd->botchanumode, nick, nick);
+}
+
+
+
+/* GLOBOPS */
+void dreamforge_cmd_global(char *source, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(source ? source : ServerName, "GLOBOPS :%s", buf);
+}
+
+int anope_event_away(char *source, int ac, char **av)
+{
+ if (!source) {
+ return MOD_CONT;
+ }
+ m_away(source, (ac ? av[0] : NULL));
+ return MOD_CONT;
+}
+
+int anope_event_topic(char *source, int ac, char **av)
+{
+ if (ac != 4)
+ return MOD_CONT;
+ do_topic(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_squit(char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+ do_squit(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_quit(char *source, int ac, char **av)
+{
+ if (ac != 1)
+ return MOD_CONT;
+ do_quit(source, ac, av);
+ return MOD_CONT;
+}
+
+
+int anope_event_mode(char *source, int ac, char **av)
+{
+ if (ac < 2)
+ return MOD_CONT;
+
+ if (*av[0] == '#' || *av[0] == '&') {
+ do_cmode(source, ac, av);
+ } else {
+ do_umode(source, ac, av);
+ }
+ return MOD_CONT;
+}
+
+
+int anope_event_kill(char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+
+ m_kill(av[0], av[1]);
+ return MOD_CONT;
+}
+
+int anope_event_kick(char *source, int ac, char **av)
+{
+ if (ac != 3)
+ return MOD_CONT;
+ do_kick(source, ac, av);
+ return MOD_CONT;
+}
+
+
+int anope_event_join(char *source, int ac, char **av)
+{
+ if (ac != 1)
+ return MOD_CONT;
+ do_join(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_motd(char *source, int ac, char **av)
+{
+ if (!source) {
+ return MOD_CONT;
+ }
+
+ m_motd(source);
+ return MOD_CONT;
+}
+
+void dreamforge_cmd_mode(char *source, char *dest, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(source, "MODE %s %s", dest, buf);
+}
+
+void dreamforge_cmd_notice_ops(char *source, char *dest, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "NOTICE @%s :%s", dest, buf);
+}
+
+
+void dreamforge_cmd_notice(char *source, char *dest, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ if (NSDefFlags & NI_MSG) {
+ dreamforge_cmd_privmsg2(source, dest, buf);
+ } else {
+ send_cmd(source, "NOTICE %s :%s", dest, buf);
+ }
+}
+
+void dreamforge_cmd_notice2(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "NOTICE %s :%s", dest, msg);
+}
+
+void dreamforge_cmd_privmsg(char *source, char *dest, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(source, "PRIVMSG %s :%s", dest, buf);
+}
+
+void dreamforge_cmd_privmsg2(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "PRIVMSG %s :%s", dest, msg);
+}
+
+void dreamforge_cmd_serv_notice(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "NOTICE $%s :%s", dest, msg);
+}
+
+void dreamforge_cmd_serv_privmsg(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "PRIVMSG $%s :%s", dest, msg);
+}
+
+void dreamforge_cmd_351(char *source)
+{
+ send_cmd(ServerName, "351 %s Anope-%s %s :%s - %s (%s) -- %s",
+ source, version_number, ServerName, ircd->name, version_flags,
+ EncModule, version_build);
+
+}
+
+/* QUIT */
+void dreamforge_cmd_quit(char *source, char *buf)
+{
+ if (buf) {
+ send_cmd(source, "QUIT :%s", buf);
+ } else {
+ send_cmd(source, "QUIT");
+ }
+}
+
+/* 391 */
+void dreamforge_cmd_391(char *source, char *timestr)
+{
+ if (!timestr) {
+ return;
+ }
+ send_cmd(NULL, "391 :%s %s :%s", source, ServerName, timestr);
+}
+
+/* 250 */
+void dreamforge_cmd_250(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "250 %s", buf);
+}
+
+/* 307 */
+void dreamforge_cmd_307(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "307 %s", buf);
+}
+
+/* 311 */
+void dreamforge_cmd_311(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "311 %s", buf);
+}
+
+/* 312 */
+void dreamforge_cmd_312(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "312 %s", buf);
+}
+
+/* 317 */
+void dreamforge_cmd_317(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "317 %s", buf);
+}
+
+/* 219 */
+void dreamforge_cmd_219(char *source, char *letter)
+{
+ if (!source) {
+ return;
+ }
+
+ if (letter) {
+ send_cmd(NULL, "219 %s %c :End of /STATS report.", source,
+ *letter);
+ } else {
+ send_cmd(NULL, "219 %s l :End of /STATS report.", source);
+ }
+}
+
+/* 401 */
+void dreamforge_cmd_401(char *source, char *who)
+{
+ if (!source || !who) {
+ return;
+ }
+ send_cmd(ServerName, "401 %s %s :No such service.", source, who);
+}
+
+/* 318 */
+void dreamforge_cmd_318(char *source, char *who)
+{
+ if (!source || !who) {
+ return;
+ }
+
+ send_cmd(ServerName, "318 %s %s :End of /WHOIS list.", source, who);
+}
+
+/* 242 */
+void dreamforge_cmd_242(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "242 %s", buf);
+}
+
+/* 243 */
+void dreamforge_cmd_243(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "243 %s", buf);
+}
+
+/* 211 */
+void dreamforge_cmd_211(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "211 %s", buf);
+}
+
+void dreamforge_cmd_nick(char *nick, char *name, char *modes)
+{
+ EnforceQlinedNick(nick, NULL);
+ send_cmd(NULL, "NICK %s 1 %ld %s %s %s 0 :%s", nick,
+ (long int) time(NULL), ServiceUser, ServiceHost, ServerName,
+ name);
+ anope_cmd_mode(nick, nick, "%s", modes);
+ dreamforge_cmd_sqline(nick, "Reserved for services");
+}
+
+void dreamforge_cmd_kick(char *source, char *chan, char *user, char *buf)
+{
+ if (buf) {
+ send_cmd(source, "KICK %s %s :%s", chan, user, buf);
+ } else {
+ send_cmd(source, "KICK %s %s", chan, user);
+ }
+}
+
+/* EVENT: SERVER */
+int anope_event_server(char *source, int ac, char **av)
+{
+ if (!stricmp(av[1], "1")) {
+ uplink = sstrdup(av[0]);
+ }
+ do_server(source, av[0], av[1], av[2], NULL);
+ return MOD_CONT;
+}
+
+
+int anope_event_privmsg(char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+ m_privmsg(source, av[0], av[1]);
+ return MOD_CONT;
+}
+
+int anope_event_part(char *source, int ac, char **av)
+{
+ if (ac < 1 || ac > 2)
+ return MOD_CONT;
+ do_part(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_whois(char *source, int ac, char **av)
+{
+ if (source && ac >= 1) {
+ m_whois(source, av[0]);
+ }
+ return MOD_CONT;
+}
+
+int anope_event_ping(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+ dreamforge_cmd_pong(ac > 1 ? av[1] : ServerName, av[0]);
+ return MOD_CONT;
+}
+
+void dreamforge_cmd_372(char *source, char *msg)
+{
+ send_cmd(ServerName, "372 %s :- %s", source, msg);
+}
+
+void dreamforge_cmd_372_error(char *source)
+{
+ send_cmd(ServerName, "422 %s :- MOTD file not found! Please "
+ "contact your IRC administrator.", source);
+}
+
+void dreamforge_cmd_375(char *source)
+{
+ send_cmd(ServerName, "375 %s :- %s Message of the Day",
+ source, ServerName);
+}
+
+void dreamforge_cmd_376(char *source)
+{
+ send_cmd(ServerName, "376 %s :End of /MOTD command.", source);
+}
+
+/* INVITE */
+void dreamforge_cmd_invite(char *source, char *chan, char *nick)
+{
+ if (!source || !chan || !nick) {
+ return;
+ }
+
+ send_cmd(source, "INVITE %s %s", nick, chan);
+}
+
+/* PONG */
+void dreamforge_cmd_pong(char *servname, char *who)
+{
+ send_cmd(servname, "PONG %s", who);
+}
+
+void dreamforge_cmd_bot_nick(char *nick, char *user, char *host,
+ char *real, char *modes)
+{
+ EnforceQlinedNick(nick, s_BotServ);
+ send_cmd(NULL, "NICK %s 1 %ld %s %s %s 0 :%s", nick,
+ (long int) time(NULL), user, host, ServerName, real);
+ anope_cmd_mode(nick, nick, "MODE %s", modes);
+ dreamforge_cmd_sqline(nick, "Reserved for services");
+}
+
+/* SVSHOLD - set */
+void dreamforge_cmd_svshold(char *nick)
+{
+ /* Not supported by this IRCD */
+}
+
+/* SVSHOLD - release */
+void dreamforge_cmd_release_svshold(char *nick)
+{
+ /* Not Supported by this IRCD */
+}
+
+/* UNSGLINE */
+void dreamforge_cmd_unsgline(char *mask)
+{
+ /* Not Supported by this IRCD */
+}
+
+/* UNSZLINE */
+void dreamforge_cmd_unszline(char *mask)
+{
+ /* Not Supported by this IRCD */
+}
+
+/* SZLINE */
+void dreamforge_cmd_szline(char *mask, char *reason, char *whom)
+{
+ /* Not Supported by this IRCD */
+}
+
+/* SGLINE */
+void dreamforge_cmd_sgline(char *mask, char *reason)
+{
+ /* Not Supported by this IRCD */
+}
+
+/* SVSNICK */
+void dreamforge_cmd_svsnick(char *source, char *guest, time_t when)
+{
+ if (!source || !guest) {
+ return;
+ }
+ send_cmd(NULL, "SVSNICK %s %s :%ld", source, guest, (long int) when);
+}
+
+void dreamforge_cmd_guest_nick(char *nick, char *user, char *host,
+ char *real, char *modes)
+{
+ send_cmd(NULL, "NICK %s 1 %ld %s %s %s 0 :%s", nick,
+ (long int) time(NULL), user, host, ServerName, real);
+ anope_cmd_mode(nick, nick, "MODE %s", modes);
+}
+
+void dreamforge_cmd_svso(char *source, char *nick, char *flag)
+{
+ /* Not Supported by this IRCD */
+}
+
+void dreamforge_cmd_vhost_on(char *nick, char *vIdent, char *vhost)
+{
+ /* Not Supported by this IRCD */
+}
+
+void dreamforge_cmd_unban(char *name, char *nick)
+{
+ /* Not Supported by this IRCD */
+}
+
+/* SVSMODE channel modes */
+
+void dreamforge_cmd_svsmode_chan(char *name, char *mode, char *nick)
+{
+ /* Not Supported by this IRCD */
+}
+
+void dreamforge_cmd_vhost_off(User * u)
+{
+ /* Not Supported by this IRCD */
+}
+
+/* SVSMODE +d */
+/* sent if svid is something weird */
+void dreamforge_cmd_svid_umode(char *nick, time_t ts)
+{
+ send_cmd(ServerName, "SVSMODE %s +d 1", nick);
+}
+
+/* SVSMODE +d */
+/* nc_change was = 1, and there is no na->status */
+void dreamforge_cmd_nc_change(User * u)
+{
+ common_svsmode(u, "-r+d", "1");
+}
+
+/* SVSMODE +r */
+void dreamforge_cmd_svid_umode2(User * u, char *ts)
+{
+ if (u->svid != u->timestamp) {
+ common_svsmode(u, "+rd", ts);
+ } else {
+ common_svsmode(u, "+r", NULL);
+ }
+}
+
+void dreamforge_cmd_svid_umode3(User * u, char *ts)
+{
+ /* not used */
+}
+
+/* NICK <newnick> */
+void dreamforge_cmd_chg_nick(char *oldnick, char *newnick)
+{
+ if (!oldnick || !newnick) {
+ return;
+ }
+
+ send_cmd(oldnick, "NICK %s", newnick);
+}
+
+void dreamforge_cmd_svsjoin(char *source, char *nick, char *chan, char *param)
+{
+ /* Not Supported by this IRCD */
+}
+
+void dreamforge_cmd_svspart(char *source, char *nick, char *chan)
+{
+ /* Not Supported by this IRCD */
+}
+
+void dreamforge_cmd_swhois(char *source, char *who, char *mask)
+{
+ /* not supported */
+}
+
+int anope_event_rehash(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_credits(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_admin(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int dreamforge_flood_mode_check(char *value)
+{
+ return 0;
+}
+
+void dreamforge_cmd_eob()
+{
+ /* Not supported */
+}
+
+void dreamforge_cmd_jupe(char *jserver, char *who, char *reason)
+{
+ char rbuf[256];
+
+ snprintf(rbuf, sizeof(rbuf), "Juped by %s%s%s", who,
+ reason ? ": " : "", reason ? reason : "");
+
+ if (findserver(servlist, jserver))
+ dreamforge_cmd_squit(jserver, rbuf);
+ dreamforge_cmd_server(jserver, 2, rbuf);
+ new_server(me_server, jserver, rbuf, SERVER_JUPED, NULL);
+}
+
+/* GLOBOPS - to handle old WALLOPS */
+void dreamforge_cmd_global_legacy(char *source, char *fmt)
+{
+ send_cmd(source ? source : ServerName, "GLOBOPS :%s", fmt);
+}
+
+/*
+ 1 = valid nick
+ 0 = nick is in valid
+*/
+int dreamforge_valid_nick(char *nick)
+{
+ /* no hard coded invalid nicks */
+ return 1;
+}
+
+/*
+ 1 = valid chan
+ 0 = chan is in valid
+*/
+int dreamforge_valid_chan(char *chan)
+{
+ /* no hard coded invalid chan */
+ return 1;
+}
+
+
+void dreamforge_cmd_ctcp(char *source, char *dest, char *buf)
+{
+
+ char *s;
+ if (!buf) {
+ return;
+ } else {
+ s = normalizeBuffer(buf);
+ }
+
+ send_cmd(source, "NOTICE %s :\1%s \1", dest, s);
+ free(s);
+}
+
+
+/**
+ * Tell anope which function we want to perform each task inside of anope.
+ * These prototypes must match what anope expects.
+ **/
+void moduleAddAnopeCmds()
+{
+ pmodule_cmd_svsnoop(dreamforge_cmd_svsnoop);
+ pmodule_cmd_remove_akill(dreamforge_cmd_remove_akill);
+ pmodule_cmd_topic(dreamforge_cmd_topic);
+ pmodule_cmd_vhost_off(dreamforge_cmd_vhost_off);
+ pmodule_cmd_akill(dreamforge_cmd_akill);
+ pmodule_cmd_svskill(dreamforge_cmd_svskill);
+ pmodule_cmd_svsmode(dreamforge_cmd_svsmode);
+ pmodule_cmd_372(dreamforge_cmd_372);
+ pmodule_cmd_372_error(dreamforge_cmd_372_error);
+ pmodule_cmd_375(dreamforge_cmd_375);
+ pmodule_cmd_376(dreamforge_cmd_376);
+ pmodule_cmd_nick(dreamforge_cmd_nick);
+ pmodule_cmd_guest_nick(dreamforge_cmd_guest_nick);
+ pmodule_cmd_mode(dreamforge_cmd_mode);
+ pmodule_cmd_bot_nick(dreamforge_cmd_bot_nick);
+ pmodule_cmd_kick(dreamforge_cmd_kick);
+ pmodule_cmd_notice_ops(dreamforge_cmd_notice_ops);
+ pmodule_cmd_notice(dreamforge_cmd_notice);
+ pmodule_cmd_notice2(dreamforge_cmd_notice2);
+ pmodule_cmd_privmsg(dreamforge_cmd_privmsg);
+ pmodule_cmd_privmsg2(dreamforge_cmd_privmsg2);
+ pmodule_cmd_serv_notice(dreamforge_cmd_serv_notice);
+ pmodule_cmd_serv_privmsg(dreamforge_cmd_serv_privmsg);
+ pmodule_cmd_bot_chan_mode(dreamforge_cmd_bot_chan_mode);
+ pmodule_cmd_351(dreamforge_cmd_351);
+ pmodule_cmd_quit(dreamforge_cmd_quit);
+ pmodule_cmd_pong(dreamforge_cmd_pong);
+ pmodule_cmd_join(dreamforge_cmd_join);
+ pmodule_cmd_unsqline(dreamforge_cmd_unsqline);
+ pmodule_cmd_invite(dreamforge_cmd_invite);
+ pmodule_cmd_part(dreamforge_cmd_part);
+ pmodule_cmd_391(dreamforge_cmd_391);
+ pmodule_cmd_250(dreamforge_cmd_250);
+ pmodule_cmd_307(dreamforge_cmd_307);
+ pmodule_cmd_311(dreamforge_cmd_311);
+ pmodule_cmd_312(dreamforge_cmd_312);
+ pmodule_cmd_317(dreamforge_cmd_317);
+ pmodule_cmd_219(dreamforge_cmd_219);
+ pmodule_cmd_401(dreamforge_cmd_401);
+ pmodule_cmd_318(dreamforge_cmd_318);
+ pmodule_cmd_242(dreamforge_cmd_242);
+ pmodule_cmd_243(dreamforge_cmd_243);
+ pmodule_cmd_211(dreamforge_cmd_211);
+ pmodule_cmd_global(dreamforge_cmd_global);
+ pmodule_cmd_global_legacy(dreamforge_cmd_global_legacy);
+ pmodule_cmd_sqline(dreamforge_cmd_sqline);
+ pmodule_cmd_squit(dreamforge_cmd_squit);
+ pmodule_cmd_svso(dreamforge_cmd_svso);
+ pmodule_cmd_chg_nick(dreamforge_cmd_chg_nick);
+ pmodule_cmd_svsnick(dreamforge_cmd_svsnick);
+ pmodule_cmd_vhost_on(dreamforge_cmd_vhost_on);
+ pmodule_cmd_connect(dreamforge_cmd_connect);
+ pmodule_cmd_svshold(dreamforge_cmd_svshold);
+ pmodule_cmd_release_svshold(dreamforge_cmd_release_svshold);
+ pmodule_cmd_unsgline(dreamforge_cmd_unsgline);
+ pmodule_cmd_unszline(dreamforge_cmd_unszline);
+ pmodule_cmd_szline(dreamforge_cmd_szline);
+ pmodule_cmd_sgline(dreamforge_cmd_sgline);
+ pmodule_cmd_unban(dreamforge_cmd_unban);
+ pmodule_cmd_svsmode_chan(dreamforge_cmd_svsmode_chan);
+ pmodule_cmd_svid_umode(dreamforge_cmd_svid_umode);
+ pmodule_cmd_nc_change(dreamforge_cmd_nc_change);
+ pmodule_cmd_svid_umode2(dreamforge_cmd_svid_umode2);
+ pmodule_cmd_svid_umode3(dreamforge_cmd_svid_umode3);
+ pmodule_cmd_svsjoin(dreamforge_cmd_svsjoin);
+ pmodule_cmd_svspart(dreamforge_cmd_svspart);
+ pmodule_cmd_swhois(dreamforge_cmd_swhois);
+ pmodule_cmd_eob(dreamforge_cmd_eob);
+ pmodule_flood_mode_check(dreamforge_flood_mode_check);
+ pmodule_cmd_jupe(dreamforge_cmd_jupe);
+ pmodule_valid_nick(dreamforge_valid_nick);
+ pmodule_valid_chan(dreamforge_valid_chan);
+ pmodule_cmd_ctcp(dreamforge_cmd_ctcp);
+ pmodule_set_umode(dreamforge_set_umode);
+}
+
+/**
+ * Now tell anope how to use us.
+ **/
+int AnopeInit(int argc, char **argv)
+{
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(PROTOCOL);
+
+ pmodule_ircd_version("DreamForge 4.6.7");
+ pmodule_ircd_cap(myIrcdcap);
+ pmodule_ircd_var(myIrcd);
+ pmodule_ircd_cbmodeinfos(myCbmodeinfos);
+ pmodule_ircd_cumodes(myCumodes);
+ pmodule_ircd_flood_mode_char_set("");
+ pmodule_ircd_flood_mode_char_remove("");
+ pmodule_ircd_cbmodes(myCbmodes);
+ pmodule_ircd_cmmodes(myCmmodes);
+ pmodule_ircd_csmodes(myCsmodes);
+ pmodule_ircd_useTSMode(0);
+
+ /** Deal with modes anope _needs_ to know **/
+ pmodule_invis_umode(UMODE_i);
+ pmodule_oper_umode(UMODE_o);
+ pmodule_invite_cmode(CMODE_i);
+ pmodule_secret_cmode(CMODE_s);
+ pmodule_private_cmode(CMODE_p);
+ pmodule_key_mode(CMODE_k);
+ pmodule_limit_mode(CMODE_l);
+
+ moduleAddAnopeCmds();
+ moduleAddIRCDMsgs();
+
+ return MOD_CONT;
+}
diff --git a/src/protocol/dreamforge.h b/src/protocol/dreamforge.h
new file mode 100644
index 000000000..057ea3b91
--- /dev/null
+++ b/src/protocol/dreamforge.h
@@ -0,0 +1,111 @@
+/* DreamForge IRCD functions
+ *
+ * (C) 2003-2008 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.
+ *
+ *
+ */
+
+#define UMODE_a 0x00000001 /* Services Admin */
+#define UMODE_h 0x00000002 /* Help system operator */
+#define UMODE_i 0x00000004 /* makes user invisible */
+#define UMODE_o 0x00000008 /* Operator */
+#define UMODE_r 0x00000010 /* Nick set by services as registered */
+#define UMODE_w 0x00000020 /* send wallops to them */
+#define UMODE_A 0x00000040 /* Admin */
+#define UMODE_O 0x00000080 /* Local operator */
+#define UMODE_s 0x00000100 /* server notices such as kill */
+#define UMODE_k 0x00000200 /* Show server-kills... */
+#define UMODE_c 0x00000400 /* Show client information */
+#define UMODE_f 0x00000800 /* Receive flood warnings */
+#define UMODE_g 0x80000000 /* Shows some global messages */
+
+#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
+#define CMODE_R 0x00000100 /* Only identified users can join */
+#define CMODE_r 0x00000200 /* Set for all registered channels */
+
+#define DEFAULT_MLOCK CMODE_n | CMODE_t | CMODE_r
+
+void dreamforge_set_umode(User * user, int ac, char **av);
+void dreamforge_cmd_svsnoop(char *server, int set);
+void dreamforge_cmd_remove_akill(char *user, char *host);
+void dreamforge_cmd_topic(char *whosets, char *chan, char *whosetit, char *topic, time_t when);
+void dreamforge_cmd_vhost_off(User * u);
+void dreamforge_cmd_akill(char *user, char *host, char *who, time_t when,time_t expires, char *reason);
+void dreamforge_cmd_svskill(char *source, char *user, char *buf);
+void dreamforge_cmd_svsmode(User * u, int ac, char **av);
+void dreamforge_cmd_372(char *source, char *msg);
+void dreamforge_cmd_372_error(char *source);
+void dreamforge_cmd_375(char *source);
+void dreamforge_cmd_376(char *source);
+void dreamforge_cmd_nick(char *nick, char *name, char *modes);
+void dreamforge_cmd_guest_nick(char *nick, char *user, char *host, char *real, char *modes);
+void dreamforge_cmd_mode(char *source, char *dest, char *buf);
+void dreamforge_cmd_bot_nick(char *nick, char *user, char *host, char *real, char *modes);
+void dreamforge_cmd_kick(char *source, char *chan, char *user, char *buf);
+void dreamforge_cmd_notice_ops(char *source, char *dest, char *buf);
+void dreamforge_cmd_notice(char *source, char *dest, char *buf);
+void dreamforge_cmd_notice2(char *source, char *dest, char *msg);
+void dreamforge_cmd_privmsg(char *source, char *dest, char *buf);
+void dreamforge_cmd_privmsg2(char *source, char *dest, char *msg);
+void dreamforge_cmd_serv_notice(char *source, char *dest, char *msg);
+void dreamforge_cmd_serv_privmsg(char *source, char *dest, char *msg);
+void dreamforge_cmd_bot_chan_mode(char *nick, char *chan);
+void dreamforge_cmd_351(char *source);
+void dreamforge_cmd_quit(char *source, char *buf);
+void dreamforge_cmd_pong(char *servname, char *who);
+void dreamforge_cmd_join(char *user, char *channel, time_t chantime);
+void dreamforge_cmd_unsqline(char *user);
+void dreamforge_cmd_invite(char *source, char *chan, char *nick);
+void dreamforge_cmd_part(char *nick, char *chan, char *buf);
+void dreamforge_cmd_391(char *source, char *timestr);
+void dreamforge_cmd_250(char *buf);
+void dreamforge_cmd_307(char *buf);
+void dreamforge_cmd_311(char *buf);
+void dreamforge_cmd_312(char *buf);
+void dreamforge_cmd_317(char *buf);
+void dreamforge_cmd_219(char *source, char *letter);
+void dreamforge_cmd_401(char *source, char *who);
+void dreamforge_cmd_318(char *source, char *who);
+void dreamforge_cmd_242(char *buf);
+void dreamforge_cmd_243(char *buf);
+void dreamforge_cmd_211(char *buf);
+void dreamforge_cmd_global(char *source, char *buf);
+void dreamforge_cmd_global_legacy(char *source, char *fmt);
+void dreamforge_cmd_sqline(char *mask, char *reason);
+void dreamforge_cmd_squit(char *servname, char *message);
+void dreamforge_cmd_svso(char *source, char *nick, char *flag);
+void dreamforge_cmd_chg_nick(char *oldnick, char *newnick);
+void dreamforge_cmd_svsnick(char *source, char *guest, time_t when);
+void dreamforge_cmd_vhost_on(char *nick, char *vIdent, char *vhost);
+void dreamforge_cmd_connect(int servernum);
+void dreamforge_cmd_svshold(char *nick);
+void dreamforge_cmd_release_svshold(char *nick);
+void dreamforge_cmd_unsgline(char *mask);
+void dreamforge_cmd_unszline(char *mask);
+void dreamforge_cmd_szline(char *mask, char *reason, char *whom);
+void dreamforge_cmd_sgline(char *mask, char *reason);
+void dreamforge_cmd_unban(char *name, char *nick);
+void dreamforge_cmd_svsmode_chan(char *name, char *mode, char *nick);
+void dreamforge_cmd_svid_umode(char *nick, time_t ts);
+void dreamforge_cmd_nc_change(User * u);
+void dreamforge_cmd_svid_umode2(User * u, char *ts);
+void dreamforge_cmd_svid_umode3(User * u, char *ts);
+void dreamforge_cmd_eob();
+int dreamforge_flood_mode_check(char *value);
+void dreamforge_cmd_jupe(char *jserver, char *who, char *reason);
+int dreamforge_valid_nick(char *nick);
+void dreamforge_cmd_ctcp(char *source, char *dest, char *buf);
+
diff --git a/src/protocol/dummy/Makefile b/src/protocol/dummy/Makefile
new file mode 100644
index 000000000..ec93af36d
--- /dev/null
+++ b/src/protocol/dummy/Makefile
@@ -0,0 +1,6 @@
+all: DUMMY
+
+DUMMY:
+clean:
+distclean:
+install:
diff --git a/src/protocol/hybrid.c b/src/protocol/hybrid.c
new file mode 100644
index 000000000..454913517
--- /dev/null
+++ b/src/protocol/hybrid.c
@@ -0,0 +1,1573 @@
+/* Hybrid IRCD functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ *
+ */
+
+#include "services.h"
+#include "pseudo.h"
+#include "hybrid.h"
+
+IRCDVar myIrcd[] = {
+ {"HybridIRCd 7.*", /* ircd name */
+ "+o", /* nickserv mode */
+ "+o", /* chanserv mode */
+ "+o", /* memoserv mode */
+ NULL, /* hostserv mode */
+ "+aio", /* operserv mode */
+ "+o", /* botserv mode */
+ "+h", /* helpserv mode */
+ "+i", /* Dev/Null mode */
+ "+io", /* Global mode */
+ "+o", /* nickserv alias mode */
+ "+o", /* chanserv alias mode */
+ "+o", /* memoserv alias mode */
+ NULL, /* hostserv alias mode */
+ "+aio", /* operserv alias mode */
+ "+o", /* botserv alias mode */
+ "+h", /* helpserv alias mode */
+ "+i", /* Dev/Null alias mode */
+ "+io", /* Global alias mode */
+ "+", /* Used by BotServ Bots */
+ 3, /* Chan Max Symbols */
+ "-ailmnpst", /* Modes to Remove */
+ "+o", /* Channel Umode used by Botserv bots */
+ 0, /* SVSNICK */
+ 0, /* Vhost */
+ 0, /* Has Owner */
+ NULL, /* Mode to set for an owner */
+ NULL, /* Mode to unset for an owner */
+ NULL, /* Mode to set for admin */
+ NULL, /* Mode to unset for admin */
+ NULL, /* Mode On Reg */
+ NULL, /* Mode on ID for Roots */
+ NULL, /* Mode on ID for Admins */
+ NULL, /* Mode on ID for Opers */
+ NULL, /* Mode on UnReg */
+ NULL, /* Mode on Nick Change */
+ 1, /* Supports SGlines */
+ 1, /* Supports SQlines */
+ 0, /* Supports SZlines */
+ 1, /* Supports Halfop +h */
+ 3, /* Number of server args */
+ 1, /* Join 2 Set */
+ 1, /* Join 2 Message */
+ 1, /* Has exceptions +e */
+ 0, /* TS Topic Forward */
+ 0, /* TS Topci Backward */
+ 0, /* Protected Umode */
+ 0, /* Has Admin */
+ 0, /* Chan SQlines */
+ 0, /* Quit on Kill */
+ 0, /* SVSMODE unban */
+ 0, /* Has Protect */
+ 0, /* Reverse */
+ 0, /* Chan Reg */
+ 0, /* Channel Mode */
+ 0, /* vidents */
+ 0, /* svshold */
+ 0, /* time stamp on mode */
+ 0, /* NICKIP */
+ 0, /* UMODE */
+ 0, /* O:LINE */
+ 0, /* VHOST ON NICK */
+ 0, /* Change RealName */
+ CMODE_p, /* No Knock */
+ 0, /* Admin Only */
+ DEFAULT_MLOCK, /* Default MLOCK */
+ 0, /* Vhost Mode */
+ 0, /* +f */
+ 0, /* +L */
+ 0, /* +f Mode */
+ 0, /* +L Mode */
+ 0, /* On nick change check if they could be identified */
+ 0, /* No Knock requires +i */
+ NULL, /* CAPAB Chan Modes */
+ 0, /* We support TOKENS */
+ 1, /* TOKENS are CASE inSensitive */
+ 0, /* TIME STAMPS are BASE64 */
+ 0, /* +I support */
+ 0, /* SJOIN ban char */
+ 0, /* SJOIN except char */
+ 0, /* SJOIN invite char */
+ 0, /* Can remove User Channel Modes with SVSMODE */
+ 0, /* Sglines are not enforced until user reconnects */
+ NULL, /* vhost char */
+ 0, /* ts6 */
+ 0, /* support helper umode */
+ 0, /* p10 */
+ NULL, /* character set */
+ 0, /* reports sync state */
+ 0, /* CIDR channelbans */
+ }
+ ,
+ {NULL}
+};
+
+IRCDCAPAB myIrcdcap[] = {
+ {
+ CAPAB_NOQUIT, /* NOQUIT */
+ 0, /* TSMODE */
+ 0, /* UNCONNECT */
+ 0, /* NICKIP */
+ 0, /* SJOIN */
+ CAPAB_ZIP, /* ZIP */
+ 0, /* BURST */
+ CAPAB_TS5, /* TS5 */
+ 0, /* TS3 */
+ 0, /* DKEY */
+ 0, /* PT4 */
+ 0, /* SCS */
+ CAPAB_QS, /* QS */
+ CAPAB_UID, /* UID */
+ CAPAB_KNOCK, /* KNOCK */
+ 0, /* CLIENT */
+ 0, /* IPV6 */
+ 0, /* SSJ5 */
+ 0, /* SN2 */
+ 0, /* TOKEN */
+ 0, /* VHOST */
+ 0, /* SSJ3 */
+ 0, /* NICK2 */
+ 0, /* UMODE2 */
+ 0, /* VL */
+ 0, /* TLKEXT */
+ 0, /* DODKEY */
+ 0, /* DOZIP */
+ 0, 0, 0}
+};
+
+
+
+void hybrid_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) {
+
+ /* This looks better, much better than "add ? (do_add) : (do_remove)".
+ * At least this is readable without paying much attention :) -GD
+ */
+ if (add)
+ user->mode |= umodes[(int) *modes];
+ else
+ user->mode &= ~umodes[(int) *modes];
+
+ switch (*modes++) {
+ case '+':
+ add = 1;
+ break;
+ case '-':
+ add = 0;
+ break;
+ case 'd':
+ if (ac == 0) {
+ alog("user: umode +d with no parameter (?) for user %s",
+ user->nick);
+ break;
+ }
+
+ ac--;
+ av++;
+ user->svid = strtoul(*av, NULL, 0);
+ break;
+ case 'o':
+ if (add) {
+ opcnt++;
+
+ if (WallOper)
+ anope_cmd_global(s_OperServ,
+ "\2%s\2 is now an IRC operator.",
+ user->nick);
+ display_news(user, NEWS_OPER);
+
+ } else {
+ opcnt--;
+ }
+ break;
+ case 'r':
+ if (add && !nick_identified(user)) {
+ send_cmd(ServerName, "SVSMODE %s -r", user->nick);
+ user->mode &= ~UMODE_r;
+ }
+ break;
+
+ }
+ }
+}
+
+unsigned long umodes[128] = {
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused, Unused, Horzontal Tab */
+ 0, 0, 0, /* Line Feed, Unused, Unused */
+ 0, 0, 0, /* Carriage Return, Unused, Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused, Unused, Space */
+ 0, 0, 0, /* ! " # */
+ 0, 0, 0, /* $ % & */
+ 0, 0, 0, /* ! ( ) */
+ 0, 0, 0, /* * + , */
+ 0, 0, 0, /* - . / */
+ 0, 0, /* 0 1 */
+ 0, 0, /* 2 3 */
+ 0, 0, /* 4 5 */
+ 0, 0, /* 6 7 */
+ 0, 0, /* 8 9 */
+ 0, 0, /* : ; */
+ 0, 0, 0, /* < = > */
+ 0, 0, /* ? @ */
+ 0, 0, 0, /* A B C */
+ 0, 0, 0, /* D E F */
+ 0, 0, 0, /* G H I */
+ 0, 0, 0, /* J K L */
+ 0, 0, 0, /* M N O */
+ 0, 0, 0, /* P Q R */
+ 0, 0, 0, /* S T U */
+ 0, 0, 0, /* V W X */
+ 0, /* Y */
+ 0, /* Z */
+ 0, 0, 0, /* [ \ ] */
+ 0, 0, 0, /* ^ _ ` */
+ UMODE_a, UMODE_b, UMODE_c, /* a b c */
+ UMODE_d, 0, UMODE_f, /* d e f */
+ UMODE_g, 0, UMODE_i, /* g h i */
+ 0, UMODE_k, UMODE_l, /* j k l */
+ 0, UMODE_n, UMODE_o, /* m n o */
+ 0, 0, UMODE_r, /* p q r */
+ UMODE_s, 0, UMODE_u, /* s t u */
+ 0, UMODE_w, UMODE_x, /* v w x */
+ UMODE_y, /* y */
+ UMODE_z, /* z */
+ 0, 0, 0, /* { | } */
+ 0, 0 /* ~ � */
+};
+
+
+char myCsmodes[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,
+ 'a', /* (33) ! */
+ 0, 0, 0,
+ 'h',
+ 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
+};
+
+CMMode myCmmodes[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}, /* BCD */
+ {NULL}, {NULL}, {NULL}, /* EFG */
+ {NULL}, /* H */
+ {add_invite, del_invite},
+ {NULL}, /* J */
+ {NULL}, {NULL}, {NULL}, /* KLM */
+ {NULL}, {NULL}, {NULL}, /* NOP */
+ {NULL}, {NULL}, {NULL}, /* QRS */
+ {NULL}, {NULL}, {NULL}, /* TUV */
+ {NULL}, {NULL}, {NULL}, /* WXY */
+ {NULL}, /* Z */
+ {NULL}, {NULL}, /* (char 91 - 92) */
+ {NULL}, {NULL}, {NULL}, /* (char 93 - 95) */
+ {NULL}, /* ` (char 96) */
+ {NULL}, /* a (char 97) */
+ {add_ban, del_ban},
+ {NULL},
+ {NULL},
+ {add_exception, del_exception},
+ {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}
+};
+
+
+CBMode myCbmodes[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}, /* A */
+ {0}, /* B */
+ {0}, /* C */
+ {0}, /* D */
+ {0}, /* E */
+ {0}, /* F */
+ {0}, /* G */
+ {0}, /* H */
+ {0}, /* I */
+ {0}, /* J */
+ {0}, /* K */
+ {0}, /* L */
+ {0}, /* M */
+ {0}, /* N */
+ {0}, /* O */
+ {0}, /* P */
+ {0}, /* Q */
+ {0},
+ {0}, /* S */
+ {0}, /* T */
+ {0}, /* U */
+ {0}, /* V */
+ {0}, /* W */
+ {0}, /* X */
+ {0}, /* Y */
+ {0}, /* Z */
+ {0}, {0}, {0}, {0}, {0}, {0},
+ {CMODE_a, 0, NULL, NULL},
+ {0}, /* b */
+ {0}, /* c */
+ {0}, /* d */
+ {0}, /* e */
+ {0}, /* f */
+ {0}, /* g */
+ {0}, /* h */
+ {CMODE_i, 0, NULL, NULL},
+ {0}, /* j */
+ {CMODE_k, 0, chan_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},
+ {0}, /* q */
+ {0},
+ {CMODE_s, 0, NULL, NULL},
+ {CMODE_t, 0, NULL, NULL},
+ {0},
+ {0}, /* v */
+ {0}, /* w */
+ {0}, /* x */
+ {0}, /* y */
+ {0}, /* z */
+ {0}, {0}, {0}, {0}
+};
+
+CBModeInfo myCbmodeinfos[] = {
+ {'a', CMODE_a, 0, NULL, NULL},
+ {'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},
+ {'s', CMODE_s, 0, NULL, NULL},
+ {'t', CMODE_t, 0, NULL, NULL},
+ {0}
+};
+
+
+CUMode myCumodes[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},
+
+ {0}, /* a */
+ {0}, /* b */
+ {0}, /* c */
+ {0}, /* d */
+ {0}, /* e */
+ {0}, /* f */
+ {0}, /* g */
+ {CUS_HALFOP, 0, check_valid_op},
+ {0}, /* i */
+ {0}, /* j */
+ {0}, /* k */
+ {0}, /* l */
+ {0}, /* m */
+ {0}, /* n */
+ {CUS_OP, CUF_PROTECT_BOTSERV, check_valid_op},
+ {0}, /* p */
+ {0}, /* q */
+ {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}
+};
+
+
+
+void hybrid_cmd_notice(char *source, char *dest, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ if (NSDefFlags & NI_MSG) {
+ hybrid_cmd_privmsg2(source, dest, buf);
+ } else {
+ send_cmd(source, "NOTICE %s :%s", dest, buf);
+ }
+}
+
+void hybrid_cmd_notice2(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "NOTICE %s :%s", dest, msg);
+}
+
+void hybrid_cmd_privmsg(char *source, char *dest, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(source, "PRIVMSG %s :%s", dest, buf);
+}
+
+void hybrid_cmd_privmsg2(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "PRIVMSG %s :%s", dest, msg);
+}
+
+void hybrid_cmd_serv_notice(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "NOTICE $$%s :%s", dest, msg);
+}
+
+void hybrid_cmd_serv_privmsg(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "PRIVMSG $$%s :%s", dest, msg);
+}
+
+
+void hybrid_cmd_global(char *source, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(source ? source : ServerName, "OPERWALL :%s", buf);
+}
+
+/* GLOBOPS - to handle old WALLOPS */
+void hybrid_cmd_global_legacy(char *source, char *fmt)
+{
+ send_cmd(source ? source : ServerName, "OPERWALL :%s", fmt);
+}
+
+int anope_event_sjoin(char *source, int ac, char **av)
+{
+ do_sjoin(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_nick(char *source, int ac, char **av)
+{
+ if (ac != 2) {
+ User *user = do_nick(source, av[0], av[4], av[5], av[6], av[7],
+ strtoul(av[2], NULL, 10), 0, 0, NULL, NULL);
+ if (user)
+ anope_set_umode(user, 1, &av[3]);
+ } else {
+ do_nick(source, av[0], NULL, NULL, NULL, NULL,
+ strtoul(av[1], NULL, 10), 0, 0, NULL, NULL);
+ }
+ return MOD_CONT;
+}
+
+int anope_event_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) {
+ if (debug) {
+ alog("debug: 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]);
+
+ if (ac > 1 && *av[1])
+ send_event(EVENT_TOPIC_UPDATED, 2, av[0], av[1]);
+ else
+ send_event(EVENT_TOPIC_UPDATED, 2, av[0], "");
+ }
+ return MOD_CONT;
+}
+
+int anope_event_tburst(char *source, int ac, char **av)
+{
+ if (ac != 5)
+ return MOD_CONT;
+
+ av[0] = av[1];
+ av[1] = av[3];
+ av[3] = av[4];
+ do_topic(source, 4, av);
+ return MOD_CONT;
+}
+
+int anope_event_436(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+
+ m_nickcoll(av[0]);
+ return MOD_CONT;
+}
+
+
+/* *INDENT-OFF* */
+void moduleAddIRCDMsgs(void) {
+ Message *m;
+
+ updateProtectDetails("PROTECT","PROTECTME","protect","deprotect","AUTOPROTECT","+","-");
+
+ m = createMessage("401", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("402", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("436", anope_event_436); addCoreMessage(IRCD,m);
+ m = createMessage("AWAY", anope_event_away); addCoreMessage(IRCD,m);
+ m = createMessage("INVITE", anope_event_invite); addCoreMessage(IRCD,m);
+ m = createMessage("JOIN", anope_event_join); addCoreMessage(IRCD,m);
+ m = createMessage("KICK", anope_event_kick); addCoreMessage(IRCD,m);
+ m = createMessage("KILL", anope_event_kill); addCoreMessage(IRCD,m);
+ m = createMessage("MODE", anope_event_mode); addCoreMessage(IRCD,m);
+ m = createMessage("MOTD", anope_event_motd); addCoreMessage(IRCD,m);
+ m = createMessage("NICK", anope_event_nick); addCoreMessage(IRCD,m);
+ m = createMessage("NOTICE", anope_event_notice); addCoreMessage(IRCD,m);
+ m = createMessage("PART", anope_event_part); addCoreMessage(IRCD,m);
+ m = createMessage("PASS", anope_event_pass); addCoreMessage(IRCD,m);
+ m = createMessage("PING", anope_event_ping); addCoreMessage(IRCD,m);
+ m = createMessage("PRIVMSG", anope_event_privmsg); addCoreMessage(IRCD,m);
+ m = createMessage("QUIT", anope_event_quit); addCoreMessage(IRCD,m);
+ m = createMessage("SERVER", anope_event_server); addCoreMessage(IRCD,m);
+ m = createMessage("SQUIT", anope_event_squit); addCoreMessage(IRCD,m);
+ m = createMessage("TOPIC", anope_event_topic); addCoreMessage(IRCD,m);
+ m = createMessage("TBURST", anope_event_tburst); addCoreMessage(IRCD,m);
+ m = createMessage("USER", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("WALLOPS", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("WHOIS", anope_event_whois); addCoreMessage(IRCD,m);
+ m = createMessage("AKILL", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("GLOBOPS", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("GNOTICE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("GOPER", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("RAKILL", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SILENCE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SVSKILL", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SVSMODE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SVSNICK", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SVSNOOP", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SQLINE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("UNSQLINE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("CAPAB", anope_event_capab); addCoreMessage(IRCD,m);
+ m = createMessage("SJOIN", anope_event_sjoin); addCoreMessage(IRCD,m);
+ m = createMessage("SVINFO", anope_event_svinfo); addCoreMessage(IRCD,m);
+/* m = createMessage("EOB", anope_event_eob); addCoreMessage(IRCD,m); */
+ m = createMessage("ADMIN", anope_event_admin); addCoreMessage(IRCD,m);
+ m = createMessage("ERROR", anope_event_error); addCoreMessage(IRCD,m);
+}
+
+/* *INDENT-ON* */
+
+
+void hybrid_cmd_sqline(char *mask, char *reason)
+{
+ if (!mask || !reason) {
+ return;
+ }
+
+ send_cmd(ServerName, "RESV * %s :%s", mask, reason);
+}
+void hybrid_cmd_unsgline(char *mask)
+{
+ if (!mask) {
+ return;
+ }
+
+ send_cmd(ServerName, "UNXLINE * %s", mask);
+}
+
+void hybrid_cmd_unszline(char *mask)
+{
+ /* Does not support */
+}
+void hybrid_cmd_szline(char *mask, char *reason, char *whom)
+{
+ /* Does not support */
+}
+
+void hybrid_cmd_svsnoop(char *server, int set)
+{
+ /* does not support */
+}
+
+void hybrid_cmd_svsadmin(char *server, int set)
+{
+ hybrid_cmd_svsnoop(server, set);
+}
+
+void hybrid_cmd_sgline(char *mask, char *reason)
+{
+ if (!mask || !reason) {
+ return;
+ }
+
+ send_cmd(ServerName, "XLINE * %s 0 :%s", mask, reason);
+}
+
+void hybrid_cmd_remove_akill(char *user, char *host)
+{
+ /* hybrid seems to support UNKLINE -Certus */
+ send_cmd(s_OperServ, "UNKLINE * %s %s", user, host);
+}
+
+void hybrid_cmd_topic(char *whosets, char *chan, char *whosetit,
+ char *topic, time_t when)
+{
+ send_cmd(whosets, "TOPIC %s :%s", chan, topic);
+}
+
+void hybrid_cmd_vhost_off(User * u)
+{
+ /* does not support vhosting */
+}
+
+void hybrid_cmd_vhost_on(char *nick, char *vIdent, char *vhost)
+{
+ /* does not support vhosting */
+}
+
+void hybrid_cmd_unsqline(char *user)
+{
+ if (!user) {
+ return;
+ }
+
+ send_cmd(ServerName, "UNRESV * %s", user);
+}
+
+void hybrid_cmd_join(char *user, char *channel, time_t chantime)
+{
+ send_cmd(NULL, "SJOIN %ld %s + :%s", (long int) chantime, channel,
+ user);
+}
+
+/*
+oper: the nick of the oper performing the kline
+target.server: the server(s) this kline is destined for
+duration: the duration if a tkline, 0 if permanent.
+user: the 'user' portion of the kline
+host: the 'host' portion of the kline
+reason: the reason for the kline.
+*/
+
+void hybrid_cmd_akill(char *user, char *host, char *who, time_t when,
+ time_t expires, char *reason)
+{
+ send_cmd(s_OperServ, "KLINE * %ld %s %s :%s",
+ (long int) (expires - (long) time(NULL)), user, host, reason);
+}
+
+void hybrid_cmd_svskill(char *source, char *user, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ if (!source || !user) {
+ return;
+ }
+
+ send_cmd(source, "KILL %s :%s", user, buf);
+}
+
+
+void hybrid_cmd_svsmode(User * u, int ac, char **av)
+{
+ /* Hybrid does not support SVSMODE */
+}
+
+/*
+ * SVINFO
+ * parv[0] = sender prefix
+ * parv[1] = TS_CURRENT for the server
+ * parv[2] = TS_MIN for the server
+ * parv[3] = server is standalone or connected to non-TS only
+ * parv[4] = server's idea of UTC time
+ */
+void hybrid_cmd_svinfo()
+{
+ send_cmd(NULL, "SVINFO 5 5 0 :%ld", (long int) time(NULL));
+}
+
+/* CAPAB */
+/*
+ QS - Can handle quit storm removal
+ EX - Can do channel +e exemptions
+ CHW - Can do channel wall @#
+ LL - Can do lazy links
+ IE - Can do invite exceptions
+ EOB - Can do EOB message
+ KLN - Can do KLINE message
+ GLN - Can do GLINE message
+ HOPS - can do half ops (+h)
+ HUB - This server is a HUB
+ AOPS - Can do anon ops (+a)
+ UID - Can do UIDs
+ ZIP - Can do ZIPlinks
+ ENC - Can do ENCrypted links
+ KNOCK - supports KNOCK
+ TBURST - supports TBURST
+ PARA - supports invite broadcasting for +p
+ ENCAP - ?
+*/
+void hybrid_cmd_capab()
+{
+ send_cmd(NULL,
+ "CAPAB :QS EX CHW IE KLN GLN HOPS HUB AOPS KNOCK TBURST PARA");
+}
+
+/* PASS */
+void hybrid_cmd_pass(char *pass)
+{
+ send_cmd(NULL, "PASS %s :TS", pass);
+}
+
+/* SERVER name hop descript */
+void hybrid_cmd_server(char *servname, int hop, char *descript)
+{
+ send_cmd(NULL, "SERVER %s %d :%s", servname, hop, descript);
+}
+void hybrid_cmd_connect(int servernum)
+{
+ me_server =
+ new_server(NULL, ServerName, ServerDesc, SERVER_ISME, NULL);
+
+ if (servernum == 1)
+ hybrid_cmd_pass(RemotePassword);
+ else if (servernum == 2)
+ hybrid_cmd_pass(RemotePassword2);
+ else if (servernum == 3)
+ hybrid_cmd_pass(RemotePassword3);
+
+ hybrid_cmd_capab();
+ hybrid_cmd_server(ServerName, 1, ServerDesc);
+ hybrid_cmd_svinfo();
+}
+
+void hybrid_cmd_svsinfo()
+{
+ /* not used */
+}
+
+
+
+void hybrid_cmd_bot_nick(char *nick, char *user, char *host, char *real,
+ char *modes)
+{
+ EnforceQlinedNick(nick, s_BotServ);
+ send_cmd(NULL, "NICK %s 1 %ld %s %s %s %s :%s", nick,
+ (long int) time(NULL), modes, user, host, ServerName, real);
+
+}
+
+void hybrid_cmd_part(char *nick, char *chan, char *buf)
+{
+ if (buf) {
+ send_cmd(nick, "PART %s :%s", chan, buf);
+ } else {
+ send_cmd(nick, "PART %s", chan);
+ }
+}
+
+int anope_event_ping(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+ hybrid_cmd_pong(ac > 1 ? av[1] : ServerName, av[0]);
+ return MOD_CONT;
+}
+
+int anope_event_away(char *source, int ac, char **av)
+{
+ if (!source) {
+ return MOD_CONT;
+ }
+ m_away(source, (ac ? av[0] : NULL));
+ return MOD_CONT;
+}
+
+int anope_event_kill(char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+
+ m_kill(av[0], av[1]);
+ return MOD_CONT;
+}
+
+int anope_event_kick(char *source, int ac, char **av)
+{
+ if (ac != 3)
+ return MOD_CONT;
+ do_kick(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_eob(char *source, int ac, char **av)
+{
+ Server *s;
+ s = findserver(servlist, source);
+ /* If we found a server with the given source, that one just
+ * finished bursting. If there was no source, then our uplink
+ * server finished bursting. -GD
+ */
+ if (!s && serv_uplink)
+ s = serv_uplink;
+ finish_sync(s, 1);
+
+ return MOD_CONT;
+}
+
+void hybrid_cmd_eob()
+{
+/* send_cmd(ServerName, "EOB"); */
+}
+
+
+int anope_event_join(char *source, int ac, char **av)
+{
+ if (ac != 1)
+ return MOD_CONT;
+ do_join(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_motd(char *source, int ac, char **av)
+{
+ if (!source) {
+ return MOD_CONT;
+ }
+
+ m_motd(source);
+ return MOD_CONT;
+}
+
+int anope_event_privmsg(char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+ m_privmsg(source, av[0], av[1]);
+ return MOD_CONT;
+}
+
+int anope_event_part(char *source, int ac, char **av)
+{
+ if (ac < 1 || ac > 2)
+ return MOD_CONT;
+ do_part(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_whois(char *source, int ac, char **av)
+{
+ if (source && ac >= 1) {
+ m_whois(source, av[0]);
+ }
+ return MOD_CONT;
+}
+
+/* EVENT: SERVER */
+int anope_event_server(char *source, int ac, char **av)
+{
+ if (!stricmp(av[1], "1")) {
+ uplink = sstrdup(av[0]);
+ }
+ do_server(source, av[0], av[1], av[2], NULL);
+ return MOD_CONT;
+}
+
+int anope_event_squit(char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+ do_squit(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_quit(char *source, int ac, char **av)
+{
+ if (ac != 1)
+ return MOD_CONT;
+ do_quit(source, ac, av);
+ return MOD_CONT;
+}
+
+void hybrid_cmd_372(char *source, char *msg)
+{
+ send_cmd(ServerName, "372 %s :- %s", source, msg);
+}
+
+void hybrid_cmd_372_error(char *source)
+{
+ send_cmd(ServerName, "422 %s :- MOTD file not found! Please "
+ "contact your IRC administrator.", source);
+}
+
+void hybrid_cmd_375(char *source)
+{
+ send_cmd(ServerName, "375 %s :- %s Message of the Day",
+ source, ServerName);
+}
+
+void hybrid_cmd_376(char *source)
+{
+ send_cmd(ServerName, "376 %s :End of /MOTD command.", source);
+}
+
+/* 391 */
+void hybrid_cmd_391(char *source, char *timestr)
+{
+ if (!timestr) {
+ return;
+ }
+ send_cmd(NULL, "391 :%s %s :%s", source, ServerName, timestr);
+}
+
+/* 250 */
+void hybrid_cmd_250(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "250 %s", buf);
+}
+
+/* 307 */
+void hybrid_cmd_307(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "307 %s", buf);
+}
+
+/* 311 */
+void hybrid_cmd_311(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "311 %s", buf);
+}
+
+/* 312 */
+void hybrid_cmd_312(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "312 %s", buf);
+}
+
+/* 317 */
+void hybrid_cmd_317(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "317 %s", buf);
+}
+
+/* 219 */
+void hybrid_cmd_219(char *source, char *letter)
+{
+ if (!source) {
+ return;
+ }
+
+ if (letter) {
+ send_cmd(NULL, "219 %s %c :End of /STATS report.", source,
+ *letter);
+ } else {
+ send_cmd(NULL, "219 %s l :End of /STATS report.", source);
+ }
+}
+
+/* 401 */
+void hybrid_cmd_401(char *source, char *who)
+{
+ if (!source || !who) {
+ return;
+ }
+ send_cmd(ServerName, "401 %s %s :No such service.", source, who);
+}
+
+/* 318 */
+void hybrid_cmd_318(char *source, char *who)
+{
+ if (!source || !who) {
+ return;
+ }
+
+ send_cmd(ServerName, "318 %s %s :End of /WHOIS list.", source, who);
+}
+
+/* 242 */
+void hybrid_cmd_242(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "242 %s", buf);
+}
+
+/* 243 */
+void hybrid_cmd_243(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "243 %s", buf);
+}
+
+/* 211 */
+void hybrid_cmd_211(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "211 %s", buf);
+}
+
+void hybrid_cmd_mode(char *source, char *dest, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(source, "MODE %s %s", dest, buf);
+}
+
+void hybrid_cmd_nick(char *nick, char *name, char *mode)
+{
+ EnforceQlinedNick(nick, NULL);
+ send_cmd(NULL, "NICK %s 1 %ld %s %s %s %s :%s", nick,
+ (long int) time(NULL), mode, ServiceUser, ServiceHost,
+ ServerName, (name));
+}
+
+void hybrid_cmd_kick(char *source, char *chan, char *user, char *buf)
+{
+ if (buf) {
+ send_cmd(source, "KICK %s %s :%s", chan, user, buf);
+ } else {
+ send_cmd(source, "KICK %s %s", chan, user);
+ }
+}
+
+void hybrid_cmd_notice_ops(char *source, char *dest, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "NOTICE @%s :%s", dest, buf);
+}
+
+void hybrid_cmd_bot_chan_mode(char *nick, char *chan)
+{
+ anope_cmd_mode(nick, chan, "%s %s", ircd->botchanumode, nick);
+}
+
+/* QUIT */
+void hybrid_cmd_quit(char *source, char *buf)
+{
+ if (buf) {
+ send_cmd(source, "QUIT :%s", buf);
+ } else {
+ send_cmd(source, "QUIT");
+ }
+}
+
+/* PONG */
+void hybrid_cmd_pong(char *servname, char *who)
+{
+ send_cmd(servname, "PONG %s", who);
+}
+
+/* INVITE */
+void hybrid_cmd_invite(char *source, char *chan, char *nick)
+{
+ if (!source || !chan || !nick) {
+ return;
+ }
+
+ send_cmd(source, "INVITE %s %s", nick, chan);
+}
+
+/* SQUIT */
+void hybrid_cmd_squit(char *servname, char *message)
+{
+ if (!servname || !message) {
+ return;
+ }
+
+ send_cmd(NULL, "SQUIT %s :%s", servname, message);
+}
+
+int anope_event_mode(char *source, int ac, char **av)
+{
+ if (ac < 2)
+ return MOD_CONT;
+
+ if (*av[0] == '#' || *av[0] == '&') {
+ do_cmode(source, ac, av);
+ } else {
+ do_umode(source, ac, av);
+ }
+ return MOD_CONT;
+}
+
+void hybrid_cmd_351(char *source)
+{
+ send_cmd(ServerName, "351 %s Anope-%s %s :%s - %s (%s) -- %s",
+ source, version_number, ServerName, ircd->name, version_flags,
+ EncModule, version_build);
+}
+
+/* Event: PROTOCTL */
+int anope_event_capab(char *source, int ac, char **av)
+{
+ int argvsize = 8;
+ int argc;
+ char **argv;
+ char *str;
+
+ if (ac < 1)
+ return MOD_CONT;
+
+ /* We get the params as one arg, we should split it for capab_parse */
+ argv = scalloc(argvsize, sizeof(char *));
+ argc = 0;
+ while ((str = myStrGetToken(av[0], ' ', argc))) {
+ if (argc == argvsize) {
+ argvsize += 8;
+ argv = srealloc(argv, argvsize * sizeof(char *));
+ }
+ argv[argc] = str;
+ argc++;
+ }
+
+ capab_parse(argc, argv);
+
+ /* Free our built ac/av */
+ for (argvsize = 0; argvsize < argc; argvsize++) {
+ free(argv[argvsize]);
+ }
+ free(argv);
+
+ return MOD_CONT;
+}
+
+/* SVSHOLD - set */
+void hybrid_cmd_svshold(char *nick)
+{
+ /* Not supported by this IRCD */
+}
+
+/* SVSHOLD - release */
+void hybrid_cmd_release_svshold(char *nick)
+{
+ /* Not Supported by this IRCD */
+}
+
+/* SVSNICK */
+void hybrid_cmd_svsnick(char *nick, char *newnick, time_t when)
+{
+ /* Not Supported by this IRCD */
+}
+
+void hybrid_cmd_guest_nick(char *nick, char *user, char *host, char *real,
+ char *modes)
+{
+ send_cmd(NULL, "NICK %s 1 %ld %s %s %s %s :%s", nick,
+ (long int) time(NULL), modes, user, host, ServerName, real);
+}
+
+void hybrid_cmd_svso(char *source, char *nick, char *flag)
+{
+ /* Not Supported by this IRCD */
+}
+
+void hybrid_cmd_unban(char *name, char *nick)
+{
+ /* Not Supported by this IRCD */
+}
+
+/* SVSMODE channel modes */
+
+void hybrid_cmd_svsmode_chan(char *name, char *mode, char *nick)
+{
+ /* Not Supported by this IRCD */
+}
+
+/* SVSMODE +d */
+/* sent if svid is something weird */
+void hybrid_cmd_svid_umode(char *nick, time_t ts)
+{
+ send_cmd(ServerName, "SVSMODE %s +d 1", nick);
+}
+
+/* SVSMODE +d */
+/* nc_change was = 1, and there is no na->status */
+void hybrid_cmd_nc_change(User * u)
+{
+ /* not used */
+}
+
+/* SVSMODE +d */
+void hybrid_cmd_svid_umode2(User * u, char *ts)
+{
+ /* not used */
+}
+
+
+void hybrid_cmd_svid_umode3(User * u, char *ts)
+{
+ /* not used */
+}
+
+/* NICK <newnick> */
+void hybrid_cmd_chg_nick(char *oldnick, char *newnick)
+{
+ if (!oldnick || !newnick) {
+ return;
+ }
+
+ send_cmd(oldnick, "NICK %s", newnick);
+}
+
+/*
+ * SVINFO
+ * parv[0] = sender prefix
+ * parv[1] = TS_CURRENT for the server
+ * parv[2] = TS_MIN for the server
+ * parv[3] = server is standalone or connected to non-TS only
+ * parv[4] = server's idea of UTC time
+ */
+int anope_event_svinfo(char *source, int ac, char **av)
+{
+ /* currently not used but removes the message : unknown message from server */
+ return MOD_CONT;
+}
+
+int anope_event_pass(char *source, int ac, char **av)
+{
+ /* currently not used but removes the message : unknown message from server */
+ return MOD_CONT;
+}
+
+void hybrid_cmd_svsjoin(char *source, char *nick, char *chan, char *param)
+{
+ /* Not Supported by this IRCD */
+}
+
+void hybrid_cmd_svspart(char *source, char *nick, char *chan)
+{
+ /* Not Supported by this IRCD */
+}
+
+void hybrid_cmd_swhois(char *source, char *who, char *mask)
+{
+ /* not supported */
+}
+
+int anope_event_notice(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_admin(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_invite(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int hybrid_flood_mode_check(char *value)
+{
+ return 0;
+}
+
+int anope_event_error(char *source, int ac, char **av)
+{
+ if (ac >= 1) {
+ if (debug) {
+ alog("debug: %s", av[0]);
+ }
+ }
+ return MOD_CONT;
+}
+
+void hybrid_cmd_jupe(char *jserver, char *who, char *reason)
+{
+ char rbuf[256];
+
+ snprintf(rbuf, sizeof(rbuf), "Juped by %s%s%s", who,
+ reason ? ": " : "", reason ? reason : "");
+
+ if (findserver(servlist, jserver))
+ hybrid_cmd_squit(jserver, rbuf);
+ hybrid_cmd_server(jserver, 2, rbuf);
+ new_server(me_server, jserver, rbuf, SERVER_JUPED, NULL);
+}
+
+/*
+ 1 = valid nick
+ 0 = nick is in valid
+*/
+int hybrid_valid_nick(char *nick)
+{
+ /* no hard coded invalid nicks */
+ return 1;
+}
+
+/*
+ 1 = valid chan
+ 0 = chan is in valid
+*/
+int hybrid_valid_chan(char *chan)
+{
+ /* no hard coded invalid chans */
+ return 1;
+}
+
+
+void hybrid_cmd_ctcp(char *source, char *dest, char *buf)
+{
+ char *s;
+
+ if (!buf) {
+ return;
+ } else {
+ s = normalizeBuffer(buf);
+ }
+
+ send_cmd(source, "NOTICE %s :\1%s \1", dest, s);
+ free(s);
+}
+
+
+/**
+ * Tell anope which function we want to perform each task inside of anope.
+ * These prototypes must match what anope expects.
+ **/
+void moduleAddAnopeCmds()
+{
+ pmodule_cmd_svsnoop(hybrid_cmd_svsnoop);
+ pmodule_cmd_remove_akill(hybrid_cmd_remove_akill);
+ pmodule_cmd_topic(hybrid_cmd_topic);
+ pmodule_cmd_vhost_off(hybrid_cmd_vhost_off);
+ pmodule_cmd_akill(hybrid_cmd_akill);
+ pmodule_cmd_svskill(hybrid_cmd_svskill);
+ pmodule_cmd_svsmode(hybrid_cmd_svsmode);
+ pmodule_cmd_372(hybrid_cmd_372);
+ pmodule_cmd_372_error(hybrid_cmd_372_error);
+ pmodule_cmd_375(hybrid_cmd_375);
+ pmodule_cmd_376(hybrid_cmd_376);
+ pmodule_cmd_nick(hybrid_cmd_nick);
+ pmodule_cmd_guest_nick(hybrid_cmd_guest_nick);
+ pmodule_cmd_mode(hybrid_cmd_mode);
+ pmodule_cmd_bot_nick(hybrid_cmd_bot_nick);
+ pmodule_cmd_kick(hybrid_cmd_kick);
+ pmodule_cmd_notice_ops(hybrid_cmd_notice_ops);
+ pmodule_cmd_notice(hybrid_cmd_notice);
+ pmodule_cmd_notice2(hybrid_cmd_notice2);
+ pmodule_cmd_privmsg(hybrid_cmd_privmsg);
+ pmodule_cmd_privmsg2(hybrid_cmd_privmsg2);
+ pmodule_cmd_serv_notice(hybrid_cmd_serv_notice);
+ pmodule_cmd_serv_privmsg(hybrid_cmd_serv_privmsg);
+ pmodule_cmd_bot_chan_mode(hybrid_cmd_bot_chan_mode);
+ pmodule_cmd_351(hybrid_cmd_351);
+ pmodule_cmd_quit(hybrid_cmd_quit);
+ pmodule_cmd_pong(hybrid_cmd_pong);
+ pmodule_cmd_join(hybrid_cmd_join);
+ pmodule_cmd_unsqline(hybrid_cmd_unsqline);
+ pmodule_cmd_invite(hybrid_cmd_invite);
+ pmodule_cmd_part(hybrid_cmd_part);
+ pmodule_cmd_391(hybrid_cmd_391);
+ pmodule_cmd_250(hybrid_cmd_250);
+ pmodule_cmd_307(hybrid_cmd_307);
+ pmodule_cmd_311(hybrid_cmd_311);
+ pmodule_cmd_312(hybrid_cmd_312);
+ pmodule_cmd_317(hybrid_cmd_317);
+ pmodule_cmd_219(hybrid_cmd_219);
+ pmodule_cmd_401(hybrid_cmd_401);
+ pmodule_cmd_318(hybrid_cmd_318);
+ pmodule_cmd_242(hybrid_cmd_242);
+ pmodule_cmd_243(hybrid_cmd_243);
+ pmodule_cmd_211(hybrid_cmd_211);
+ pmodule_cmd_global(hybrid_cmd_global);
+ pmodule_cmd_global_legacy(hybrid_cmd_global_legacy);
+ pmodule_cmd_sqline(hybrid_cmd_sqline);
+ pmodule_cmd_squit(hybrid_cmd_squit);
+ pmodule_cmd_svso(hybrid_cmd_svso);
+ pmodule_cmd_chg_nick(hybrid_cmd_chg_nick);
+ pmodule_cmd_svsnick(hybrid_cmd_svsnick);
+ pmodule_cmd_vhost_on(hybrid_cmd_vhost_on);
+ pmodule_cmd_connect(hybrid_cmd_connect);
+ pmodule_cmd_svshold(hybrid_cmd_svshold);
+ pmodule_cmd_release_svshold(hybrid_cmd_release_svshold);
+ pmodule_cmd_unsgline(hybrid_cmd_unsgline);
+ pmodule_cmd_unszline(hybrid_cmd_unszline);
+ pmodule_cmd_szline(hybrid_cmd_szline);
+ pmodule_cmd_sgline(hybrid_cmd_sgline);
+ pmodule_cmd_unban(hybrid_cmd_unban);
+ pmodule_cmd_svsmode_chan(hybrid_cmd_svsmode_chan);
+ pmodule_cmd_svid_umode(hybrid_cmd_svid_umode);
+ pmodule_cmd_nc_change(hybrid_cmd_nc_change);
+ pmodule_cmd_svid_umode2(hybrid_cmd_svid_umode2);
+ pmodule_cmd_svid_umode3(hybrid_cmd_svid_umode3);
+ pmodule_cmd_svsjoin(hybrid_cmd_svsjoin);
+ pmodule_cmd_svspart(hybrid_cmd_svspart);
+ pmodule_cmd_swhois(hybrid_cmd_swhois);
+ pmodule_cmd_eob(hybrid_cmd_eob);
+ pmodule_flood_mode_check(hybrid_flood_mode_check);
+ pmodule_cmd_jupe(hybrid_cmd_jupe);
+ pmodule_valid_nick(hybrid_valid_nick);
+ pmodule_valid_chan(hybrid_valid_chan);
+ pmodule_cmd_ctcp(hybrid_cmd_ctcp);
+ pmodule_set_umode(hybrid_set_umode);
+}
+
+/**
+ * Now tell anope how to use us.
+ **/
+int AnopeInit(int argc, char **argv)
+{
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(PROTOCOL);
+
+ pmodule_ircd_version("Hybrid IRCd 7.0");
+ pmodule_ircd_cap(myIrcdcap);
+ pmodule_ircd_var(myIrcd);
+ pmodule_ircd_cbmodeinfos(myCbmodeinfos);
+ pmodule_ircd_cumodes(myCumodes);
+ pmodule_ircd_flood_mode_char_set("");
+ pmodule_ircd_flood_mode_char_remove("");
+ pmodule_ircd_cbmodes(myCbmodes);
+ pmodule_ircd_cmmodes(myCmmodes);
+ pmodule_ircd_csmodes(myCsmodes);
+ pmodule_ircd_useTSMode(0);
+
+ /** Deal with modes anope _needs_ to know **/
+ pmodule_invis_umode(UMODE_i);
+ pmodule_oper_umode(UMODE_o);
+ pmodule_invite_cmode(CMODE_i);
+ pmodule_secret_cmode(CMODE_s);
+ pmodule_private_cmode(CMODE_p);
+ pmodule_key_mode(CMODE_k);
+ pmodule_limit_mode(CMODE_l);
+
+ moduleAddAnopeCmds();
+ moduleAddIRCDMsgs();
+
+ return MOD_CONT;
+}
diff --git a/src/protocol/hybrid.h b/src/protocol/hybrid.h
new file mode 100644
index 000000000..b4437888c
--- /dev/null
+++ b/src/protocol/hybrid.h
@@ -0,0 +1,115 @@
+/* Hybrid IRCD functions
+ *
+ * (C) 2003-2008 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.
+ *
+ *
+ */
+
+#define UMODE_a 0x00000001 /* Admin status */
+#define UMODE_b 0x00000080 /* See bot and drone flooding notices */
+#define UMODE_c 0x00000100 /* Client connection/quit notices */
+#define UMODE_d 0x00000200 /* See debugging notices */
+#define UMODE_f 0x00000400 /* See I: line full notices */
+#define UMODE_g 0x00000800 /* Server Side Ignore */
+#define UMODE_i 0x00000004 /* Not shown in NAMES or WHO unless you share a channel */
+#define UMODE_k 0x00001000 /* See server generated KILL messages */
+#define UMODE_l 0x00002000 /* See LOCOPS messages */
+#define UMODE_n 0x00004000 /* See client nick changes */
+#define UMODE_o 0x00000008 /* Operator status */
+#define UMODE_r 0x00000010 /* See rejected client notices */
+#define UMODE_s 0x00008000 /* See general server notices */
+#define UMODE_u 0x00010000 /* See unauthorized client notices */
+#define UMODE_w 0x00000020 /* See server generated WALLOPS */
+#define UMODE_x 0x00020000 /* See remote server connection and split notices */
+#define UMODE_y 0x00040000 /* See LINKS, STATS (if configured), TRACE notices */
+#define UMODE_z 0x00080000 /* See oper generated WALLOPS */
+
+#define CMODE_i 0x00000001 /* Invite only */
+#define CMODE_m 0x00000002 /* Users without +v/h/o cannot send text to the channel */
+#define CMODE_n 0x00000004 /* Users must be in the channel to send text to it */
+#define CMODE_p 0x00000008 /* Private is obsolete, this now restricts KNOCK */
+#define CMODE_s 0x00000010 /* The channel does not show up on NAMES or LIST */
+#define CMODE_t 0x00000020 /* Only chanops can change the topic */
+#define CMODE_k 0x00000040 /* Key/password for the channel. */
+#define CMODE_l 0x00000080 /* Limit the number of users in a channel */
+#define CMODE_a 0x00000400 /* Anonymous ops, chanops are hidden */
+
+
+#define DEFAULT_MLOCK CMODE_n | CMODE_t
+
+void hybrid_set_umode(User * user, int ac, char **av);
+void hybrid_cmd_svsnoop(char *server, int set);
+void hybrid_cmd_remove_akill(char *user, char *host);
+void hybrid_cmd_topic(char *whosets, char *chan, char *whosetit, char *topic, time_t when);
+void hybrid_cmd_vhost_off(User * u);
+void hybrid_cmd_akill(char *user, char *host, char *who, time_t when,time_t expires, char *reason);
+void hybrid_cmd_svskill(char *source, char *user, char *buf);
+void hybrid_cmd_svsmode(User * u, int ac, char **av);
+void hybrid_cmd_372(char *source, char *msg);
+void hybrid_cmd_372_error(char *source);
+void hybrid_cmd_375(char *source);
+void hybrid_cmd_376(char *source);
+void hybrid_cmd_nick(char *nick, char *name, char *modes);
+void hybrid_cmd_guest_nick(char *nick, char *user, char *host, char *real, char *modes);
+void hybrid_cmd_mode(char *source, char *dest, char *buf);
+void hybrid_cmd_bot_nick(char *nick, char *user, char *host, char *real, char *modes);
+void hybrid_cmd_kick(char *source, char *chan, char *user, char *buf);
+void hybrid_cmd_notice_ops(char *source, char *dest, char *buf);
+void hybrid_cmd_notice(char *source, char *dest, char *buf);
+void hybrid_cmd_notice2(char *source, char *dest, char *msg);
+void hybrid_cmd_privmsg(char *source, char *dest, char *buf);
+void hybrid_cmd_privmsg2(char *source, char *dest, char *msg);
+void hybrid_cmd_serv_notice(char *source, char *dest, char *msg);
+void hybrid_cmd_serv_privmsg(char *source, char *dest, char *msg);
+void hybrid_cmd_bot_chan_mode(char *nick, char *chan);
+void hybrid_cmd_351(char *source);
+void hybrid_cmd_quit(char *source, char *buf);
+void hybrid_cmd_pong(char *servname, char *who);
+void hybrid_cmd_join(char *user, char *channel, time_t chantime);
+void hybrid_cmd_unsqline(char *user);
+void hybrid_cmd_invite(char *source, char *chan, char *nick);
+void hybrid_cmd_part(char *nick, char *chan, char *buf);
+void hybrid_cmd_391(char *source, char *timestr);
+void hybrid_cmd_250(char *buf);
+void hybrid_cmd_307(char *buf);
+void hybrid_cmd_311(char *buf);
+void hybrid_cmd_312(char *buf);
+void hybrid_cmd_317(char *buf);
+void hybrid_cmd_219(char *source, char *letter);
+void hybrid_cmd_401(char *source, char *who);
+void hybrid_cmd_318(char *source, char *who);
+void hybrid_cmd_242(char *buf);
+void hybrid_cmd_243(char *buf);
+void hybrid_cmd_211(char *buf);
+void hybrid_cmd_global(char *source, char *buf);
+void hybrid_cmd_global_legacy(char *source, char *fmt);
+void hybrid_cmd_sqline(char *mask, char *reason);
+void hybrid_cmd_squit(char *servname, char *message);
+void hybrid_cmd_svso(char *source, char *nick, char *flag);
+void hybrid_cmd_chg_nick(char *oldnick, char *newnick);
+void hybrid_cmd_svsnick(char *source, char *guest, time_t when);
+void hybrid_cmd_vhost_on(char *nick, char *vIdent, char *vhost);
+void hybrid_cmd_connect(int servernum);
+void hybrid_cmd_svshold(char *nick);
+void hybrid_cmd_release_svshold(char *nick);
+void hybrid_cmd_unsgline(char *mask);
+void hybrid_cmd_unszline(char *mask);
+void hybrid_cmd_szline(char *mask, char *reason, char *whom);
+void hybrid_cmd_sgline(char *mask, char *reason);
+void hybrid_cmd_unban(char *name, char *nick);
+void hybrid_cmd_svsmode_chan(char *name, char *mode, char *nick);
+void hybrid_cmd_svid_umode(char *nick, time_t ts);
+void hybrid_cmd_nc_change(User * u);
+void hybrid_cmd_svid_umode2(User * u, char *ts);
+void hybrid_cmd_svid_umode3(User * u, char *ts);
+void hybrid_cmd_eob();
+int hybrid_flood_mode_check(char *value);
+void hybrid_cmd_jupe(char *jserver, char *who, char *reason);
+int hybrid_valid_nick(char *nick);
+void hybrid_cmd_ctcp(char *source, char *dest, char *buf);
diff --git a/src/protocol/inspircd10.c b/src/protocol/inspircd10.c
new file mode 100644
index 000000000..30ced466d
--- /dev/null
+++ b/src/protocol/inspircd10.c
@@ -0,0 +1,1713 @@
+/* inspircd beta 6+ functions
+ *
+ * (C) 2005 Craig Edwards <brain@inspircd.org>
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ *
+ */
+
+/*************************************************************************/
+
+#include "services.h"
+#include "pseudo.h"
+#include "inspircd10.h"
+
+#ifndef _WIN32
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#endif
+
+#ifdef _WIN32
+#include "winsock.h"
+int inet_aton (const char *name, struct in_addr *addr)
+{
+ uint32 a = inet_addr (name);
+ addr->s_addr = a;
+ return a != (uint32)-1;
+}
+#endif
+
+IRCDVar myIrcd[] = {
+ {"InspIRCd 1.0", /* ircd name */
+ "+o", /* nickserv mode */
+ "+o", /* chanserv mode */
+ "+o", /* memoserv mode */
+ "+o", /* hostserv mode */
+ "+io", /* operserv mode */
+ "+o", /* botserv mode */
+ "+o", /* helpserv mode */
+ "+i", /* Dev/Null mode */
+ "+io", /* Global mode */
+ "+o", /* nickserv alias mode */
+ "+o", /* chanserv alias mode */
+ "+o", /* memoserv alias mode */
+ "+io", /* hostserv alias mode */
+ "+io", /* operserv alias mode */
+ "+o", /* botserv alias mode */
+ "+o", /* helpserv alias mode */
+ "+i", /* Dev/Null alias mode */
+ "+io", /* Global alias mode */
+ "+s", /* Used by BotServ Bots */
+ 5, /* Chan Max Symbols */
+ "-cilmnpstuzACGHKNOQRSV", /* Modes to Remove */
+ "+ao", /* Channel Umode used by Botserv bots */
+ 1, /* SVSNICK */
+ 1, /* Vhost */
+ 1, /* Has Owner */
+ "+q", /* Mode to set for an owner */
+ "-q", /* Mode to unset for an owner */
+ "+a", /* Mode to set for channel admin */
+ "-a", /* Mode to unset for channel admin */
+ "+r", /* Mode On Reg */
+ NULL, /* Mode on ID for Roots */
+ NULL, /* Mode on ID for Admins */
+ NULL, /* Mode on ID for Opers */
+ "-r", /* Mode on UnReg */
+ "-r", /* Mode on Nick Change */
+ 1, /* Supports SGlines */
+ 1, /* Supports SQlines */
+ 1, /* Supports SZlines */
+ 1, /* Supports Halfop +h */
+ 4, /* Number of server args */
+ 0, /* Join 2 Set */
+ 1, /* Join 2 Message */
+ 0, /* Has exceptions +e */
+ 1, /* TS Topic Forward */
+ 0, /* TS Topci Backward */
+ 0, /* Protected Umode */
+ 0, /* Has Admin */
+ 0, /* Chan SQlines */
+ 0, /* Quit on Kill */
+ 0, /* SVSMODE unban */
+ 1, /* Has Protect */
+ 1, /* Reverse */
+ 1, /* Chan Reg */
+ CMODE_r, /* Channel Mode */
+ 0, /* vidents */
+ 0, /* svshold */
+ 0, /* time stamp on mode */
+ 0, /* NICKIP */
+ 1, /* O:LINE */
+ 0, /* UMODE */
+ 1, /* VHOST ON NICK */
+ 0, /* Change RealName */
+ CMODE_K, /* No Knock */
+ 0, /* Admin Only */
+ DEFAULT_MLOCK, /* Default MLOCK */
+ UMODE_x, /* Vhost Mode */
+ 0, /* +f */
+ 1, /* +L */
+ CMODE_f,
+ CMODE_L,
+ 0,
+ 1, /* No Knock requires +i */
+ NULL, /* CAPAB Chan Modes */
+ 0, /* We support inspircd TOKENS */
+ 1, /* TOKENS are CASE inSensitive */
+ 0, /* TIME STAMPS are BASE64 */
+ 0, /* +I support */
+ 0, /* SJOIN ban char */
+ 0, /* SJOIN except char */
+ 0, /* SJOIN invite char */
+ 0, /* Can remove User Channel Modes with SVSMODE */
+ 0, /* Sglines are not enforced until user reconnects */
+ "x", /* vhost char */
+ 0, /* ts6 */
+ 1, /* support helper umode */
+ 0, /* p10 */
+ NULL, /* character set */
+ 0, /* reports sync state */
+ 0, /* CIDR channelbans */
+ }
+ ,
+ {NULL}
+};
+
+
+IRCDCAPAB myIrcdcap[] = {
+ {
+ CAPAB_NOQUIT, /* NOQUIT */
+ 0, /* TSMODE */
+ 0, /* UNCONNECT */
+ 0, /* NICKIP */
+ 0, /* SJOIN */
+ 0, /* ZIP */
+ 0, /* BURST */
+ 0, /* TS5 */
+ 0, /* TS3 */
+ 0, /* DKEY */
+ 0, /* PT4 */
+ 0, /* SCS */
+ 0, /* QS */
+ 0, /* UID */
+ 0, /* KNOCK */
+ 0, /* CLIENT */
+ 0, /* IPV6 */
+ 0, /* SSJ5 */
+ 0, /* SN2 */
+ 0, /* TOKEN */
+ 0, /* VHOST */
+ CAPAB_SSJ3, /* SSJ3 */
+ CAPAB_NICK2, /* NICK2 */
+ 0, /* UMODE2 */
+ CAPAB_VL, /* VL */
+ CAPAB_TLKEXT, /* TLKEXT */
+ 0, /* DODKEY */
+ 0, /* DOZIP */
+ 0,
+ 0, 0}
+};
+
+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,
+ 0,
+ 0,
+ 0,
+ 0, 0, 0, 0, 0, 0, 0,
+ 0,
+ 0, 0, 0, 0, 0,
+ 0, UMODE_a, 0, 0, 0, 0, 0,
+ UMODE_g,
+ UMODE_h, UMODE_i, 0, 0, 0, 0, 0, UMODE_o,
+ 0,
+ 0, UMODE_r, 0, 0, 0, 0, UMODE_w,
+ UMODE_x,
+ 0,
+ 0,
+ 0, 0, 0, 0, 0
+};
+
+
+char myCsmodes[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,
+ 'h', /* (37) % Channel halfops */
+ 0,
+ 0, 0, 0,
+ 'q',
+
+ '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, 'a', 0
+};
+
+CMMode myCmmodes[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},
+ {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}
+};
+
+
+
+CBMode myCbmodes[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},
+ {CMODE_A, CBM_NO_USER_MLOCK, NULL, NULL},
+ {0}, /* B */
+ {CMODE_C, 0, NULL, NULL}, /* C */
+ {0}, /* D */
+ {0}, /* E */
+ {0}, /* F */
+ {CMODE_G, 0, NULL, NULL}, /* G */
+ {CMODE_H, CBM_NO_USER_MLOCK, NULL, NULL},
+ {0}, /* I */
+ {0}, /* J */
+ {CMODE_K, 0, NULL, NULL}, /* K */
+ {CMODE_L, 0, set_redirect, cs_set_redirect},
+ {0}, /* M */
+ {CMODE_N, 0, NULL, NULL}, /* N */
+ {CMODE_O, CBM_NO_USER_MLOCK, NULL, NULL},
+ {0}, /* P */
+ {CMODE_Q, 0, NULL, NULL}, /* Q */
+ {CMODE_R, 0, NULL, NULL}, /* R */
+ {CMODE_S, 0, NULL, NULL}, /* S */
+ {0}, /* T */
+ {0}, /* U */
+ {CMODE_V, 0, NULL, NULL}, /* V */
+ {0}, /* W */
+ {0}, /* X */
+ {0}, /* Y */
+ {0}, /* Z */
+ {0}, {0}, {0}, {0}, {0}, {0},
+ {0}, /* a */
+ {0}, /* b */
+ {CMODE_c, 0, NULL, NULL},
+ {0}, /* d */
+ {0}, /* e */
+ {CMODE_f, 0, set_flood, cs_set_flood},
+ {0}, /* g */
+ {0}, /* h */
+ {CMODE_i, 0, NULL, NULL},
+ {0}, /* j */
+ {CMODE_k, 0, chan_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},
+ {0}, /* q */
+ {CMODE_r, CBM_NO_MLOCK, NULL, NULL},
+ {CMODE_s, 0, NULL, NULL},
+ {CMODE_t, 0, NULL, NULL},
+ {CMODE_u, 0, NULL, NULL},
+ {0}, /* v */
+ {0}, /* w */
+ {0}, /* x */
+ {0}, /* y */
+ {CMODE_z, 0, NULL, NULL},
+ {0}, {0}, {0}, {0}
+};
+
+CBModeInfo myCbmodeinfos[] = {
+ {'c', CMODE_c, 0, NULL, NULL},
+ {'f', CMODE_f, 0, get_flood, cs_get_flood},
+ {'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},
+ {'r', CMODE_r, 0, NULL, NULL},
+ {'s', CMODE_s, 0, NULL, NULL},
+ {'t', CMODE_t, 0, NULL, NULL},
+ {'u', CMODE_u, 0, NULL, NULL},
+ {'z', CMODE_z, 0, NULL, NULL},
+ {'A', CMODE_A, 0, NULL, NULL},
+ {'C', CMODE_C, 0, NULL, NULL},
+ {'G', CMODE_G, 0, NULL, NULL},
+ {'H', CMODE_H, 0, NULL, NULL},
+ {'K', CMODE_K, 0, NULL, NULL},
+ {'L', CMODE_L, 0, get_redirect, cs_get_redirect},
+ {'N', CMODE_N, 0, NULL, NULL},
+ {'O', CMODE_O, 0, NULL, NULL},
+ {'Q', CMODE_Q, 0, NULL, NULL},
+ {'R', CMODE_R, 0, NULL, NULL},
+ {'S', CMODE_S, 0, NULL, NULL},
+ {'V', CMODE_V, 0, NULL, NULL},
+ {0}
+};
+
+CUMode myCumodes[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},
+
+ {CUS_PROTECT, CUF_PROTECT_BOTSERV, check_valid_op},
+ {0}, /* b */
+ {0}, /* c */
+ {0}, /* d */
+ {0}, /* e */
+ {0}, /* f */
+ {0}, /* g */
+ {CUS_HALFOP, 0, check_valid_op},
+ {0}, /* i */
+ {0}, /* j */
+ {0}, /* k */
+ {0}, /* l */
+ {0}, /* m */
+ {0}, /* n */
+ {CUS_OP, CUF_PROTECT_BOTSERV, check_valid_op},
+ {0}, /* p */
+ {CUS_OWNER, 0, check_valid_op},
+ {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}
+};
+
+
+void inspircd_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) {
+
+ /* This looks better, much better than "add ? (do_add) : (do_remove)".
+ * At least this is readable without paying much attention :) -GD
+ */
+ if (add)
+ user->mode |= umodes[(int) *modes];
+ else
+ user->mode &= ~umodes[(int) *modes];
+
+ switch (*modes++) {
+ case '+':
+ add = 1;
+ break;
+ case '-':
+ add = 0;
+ break;
+ case 'd':
+ if (ac == 0) {
+ break;
+ }
+
+ ac--;
+ av++;
+ user->svid = strtoul(*av, NULL, 0);
+ break;
+ case 'o':
+ if (add) {
+ opcnt++;
+ if (WallOper) {
+ anope_cmd_global(s_OperServ,
+ "\2%s\2 is now an IRC operator.",
+ user->nick);
+ }
+ display_news(user, NEWS_OPER);
+ } else {
+ opcnt--;
+ }
+ break;
+ case 'r':
+ if (add && !nick_identified(user)) {
+ common_svsmode(user, "-r", NULL);
+ user->mode &= ~UMODE_r;
+ }
+ break;
+ case 'x':
+ update_host(user);
+ break;
+ }
+ }
+}
+
+
+/* *INDENT-OFF* */
+void moduleAddIRCDMsgs(void) {
+ Message *m;
+
+ updateProtectDetails("PROTECT","PROTECTME","!protect","!deprotect","AUTOPROTECT","+a","-a");
+
+ m = createMessage("436", anope_event_436); addCoreMessage(IRCD,m);
+ m = createMessage("AWAY", anope_event_away); addCoreMessage(IRCD,m);
+ m = createMessage("INVITE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("JOIN", anope_event_join); addCoreMessage(IRCD,m);
+ m = createMessage("KICK", anope_event_kick); addCoreMessage(IRCD,m);
+ m = createMessage("KILL", anope_event_kill); addCoreMessage(IRCD,m);
+ m = createMessage("MODE", anope_event_mode); addCoreMessage(IRCD,m);
+ m = createMessage("MOTD", anope_event_motd); addCoreMessage(IRCD,m);
+ m = createMessage("NICK", anope_event_nick); addCoreMessage(IRCD,m);
+ m = createMessage("NOTICE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("CAPAB", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("PART", anope_event_part); addCoreMessage(IRCD,m);
+ m = createMessage("PING", anope_event_ping); addCoreMessage(IRCD,m);
+ m = createMessage("PRIVMSG", anope_event_privmsg); addCoreMessage(IRCD,m);
+ m = createMessage("QUIT", anope_event_quit); addCoreMessage(IRCD,m);
+ m = createMessage("SERVER", anope_event_server); addCoreMessage(IRCD,m);
+ m = createMessage("SQUIT", anope_event_squit); addCoreMessage(IRCD,m);
+ m = createMessage("TOPIC", anope_event_topic); addCoreMessage(IRCD,m);
+ m = createMessage("WALLOPS", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("WHOIS", anope_event_whois); addCoreMessage(IRCD,m);
+ m = createMessage("GLOBOPS", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SILENCE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SAMODE", anope_event_samode); addCoreMessage(IRCD,m);
+ m = createMessage("SANICK", anope_event_sanick); addCoreMessage(IRCD,m);
+ m = createMessage("SAJOIN", anope_event_sajoin); addCoreMessage(IRCD,m);
+ m = createMessage("SAPART", anope_event_sapart); addCoreMessage(IRCD,m);
+ m = createMessage("SVSMODE", anope_event_mode) ;addCoreMessage(IRCD,m);
+ m = createMessage("QLINE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("GLINE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("ELINE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("ZLINE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("ADDLINE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("FHOST", anope_event_chghost); addCoreMessage(IRCD,m);
+ m = createMessage("CHGIDENT", anope_event_chgident); addCoreMessage(IRCD,m);
+ m = createMessage("FNAME", anope_event_chgname); addCoreMessage(IRCD,m);
+ m = createMessage("METADATA", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SETHOST", anope_event_sethost); addCoreMessage(IRCD,m);
+ m = createMessage("SETIDENT", anope_event_setident); addCoreMessage(IRCD,m);
+ m = createMessage("SETNAME", anope_event_setname); addCoreMessage(IRCD,m);
+ m = createMessage("REHASH", anope_event_rehash); addCoreMessage(IRCD,m);
+ m = createMessage("ADMIN", anope_event_admin); addCoreMessage(IRCD,m);
+ m = createMessage("CREDITS", anope_event_credits); addCoreMessage(IRCD,m);
+ m = createMessage("FJOIN", anope_event_fjoin); addCoreMessage(IRCD,m);
+ m = createMessage("FMODE", anope_event_fmode); addCoreMessage(IRCD,m);
+ m = createMessage("FTOPIC", anope_event_ftopic); addCoreMessage(IRCD,m);
+ m = createMessage("VERSION", anope_event_version); addCoreMessage(IRCD,m);
+ m = createMessage("OPERTYPE", anope_event_opertype); addCoreMessage(IRCD,m);
+ m = createMessage("IDLE", anope_event_idle); addCoreMessage(IRCD,m);
+}
+
+/* *INDENT-ON* */
+
+void inspircd_cmd_svsnoop(char *server, int set)
+{
+ /* Not Supported by this IRCD */
+}
+
+void inspircd_cmd_svsadmin(char *server, int set)
+{
+ /* Not Supported by this IRCD */
+}
+
+void inspircd_cmd_remove_akill(char *user, char *host)
+{
+ send_cmd(s_OperServ, "GLINE %s@%s", user, host);
+}
+
+void inspircd_cmd_topic(char *whosets, char *chan, char *whosetit,
+ char *topic, time_t when)
+{
+ send_cmd(whosets, "FTOPIC %s %lu %s :%s", chan, (unsigned long int) when, whosetit, topic);
+}
+
+void inspircd_cmd_vhost_off(User * u)
+{
+ send_cmd(s_HostServ, "MODE %s -x", u->nick);
+}
+
+void inspircd_cmd_akill(char *user, char *host, char *who, time_t when,
+ time_t expires, char *reason)
+{
+ send_cmd(ServerName, "ADDLINE G %s@%s %s %ld %ld :%s", user, host, who, (long int) when, (long int) 86400 * 2, reason);
+}
+
+void inspircd_cmd_svskill(char *source, char *user, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ if (!source || !user) {
+ return;
+ }
+
+ send_cmd(source, "KILL %s :%s", user, buf);
+}
+
+void inspircd_cmd_svsmode(User * u, int ac, char **av)
+{
+ send_cmd(s_NickServ, "MODE %s %s%s%s", u->nick, av[0], (ac == 2 ? " " : ""), (ac == 2 ? av[1] : ""));
+}
+
+
+void inspircd_cmd_372(char *source, char *msg)
+{
+ send_cmd(ServerName, "372 %s :- %s", source, msg);
+}
+
+void inspircd_cmd_372_error(char *source)
+{
+ send_cmd(ServerName, "422 %s :- MOTD file not found! Please "
+ "contact your IRC administrator.", source);
+}
+
+void inspircd_cmd_375(char *source)
+{
+ send_cmd(ServerName, "375 %s :- %s Message of the Day",
+ source, ServerName);
+}
+
+void inspircd_cmd_376(char *source)
+{
+ send_cmd(ServerName, "376 %s :End of /MOTD command.", source);
+}
+
+void inspircd_cmd_nick(char *nick, char *name, char *modes)
+{
+ /* :test.chatspike.net NICK 1133519355 Brain synapse.brainbox.winbot.co.uk netadmin.chatspike.net ~brain +xwsioS 10.0.0.2 :Craig Edwards */
+ send_cmd(ServerName, "NICK %ld %s %s %s %s +%s 0.0.0.0 :%s",(long int) time(NULL),nick,ServiceHost,ServiceHost,ServiceUser,modes,name);
+ send_cmd(ServerName, "OPERTYPE Service");
+}
+
+void inspircd_cmd_guest_nick(char *nick, char *user, char *host, char *real,
+ char *modes)
+{
+ send_cmd(ServerName, "NICK %ld %s %s %s %s +%s 0.0.0.0 :%s",(long int) time(NULL),nick,host,host,user,modes,real);
+}
+
+void inspircd_cmd_mode(char *source, char *dest, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+ send_cmd(source ? source : s_OperServ, "MODE %s %s", dest, buf);
+}
+
+int anope_event_version(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_idle(char *source, int ac, char **av)
+{
+ if (ac == 1)
+ {
+ send_cmd(av[0],"IDLE %s %ld 0",source,(long int) time(NULL));
+ }
+ return MOD_CONT;
+}
+
+int anope_event_ftopic(char *source, int ac, char **av)
+{
+ /* :source FTOPIC channel ts setby :topic */
+ char* temp;
+ if (ac < 4)
+ return MOD_CONT;
+ temp = av[1]; /* temp now holds ts */
+ av[1] = av[2]; /* av[1] now holds set by */
+ av[2] = temp; /* av[2] now holds ts */
+ do_topic(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_opertype(char* source, int ac, char**av)
+{
+ /* opertype is equivalent to mode +o because servers
+ dont do this directly */
+ User* u;
+ u = finduser(source);
+ if (u && !is_oper(u)) {
+ char* newav[2];
+ newav[0] = source;
+ newav[1] = "+o";
+ return anope_event_mode(source, 2, newav);
+ }
+ else return MOD_CONT;
+}
+
+int anope_event_fmode(char *source, int ac, char **av)
+{
+ /* :source FMODE #test +nt */
+ if (ac != 2)
+ return MOD_CONT;
+ return anope_event_mode(source, ac, av);
+}
+
+int anope_event_samode(char *source, int ac, char **av)
+{
+ /* :source SAMODE targets modes */
+ if (ac < 2)
+ return MOD_CONT;
+ return anope_event_mode(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_sanick(char *source, int ac, char **av)
+{
+ /* :source SANICK old new */
+ if (ac != 2)
+ return MOD_CONT;
+ do_nick(av[0], av[1], NULL, NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
+ return MOD_CONT;
+}
+
+int anope_event_sajoin(char *source, int ac, char **av)
+{
+ char* newav[1];
+ if (ac != 2)
+ return MOD_CONT;
+ newav[0] = av[1];
+ do_join(av[0], 1, newav);
+ return MOD_CONT;
+}
+
+int anope_event_sapart(char *source, int ac, char **av)
+{
+ char* newav[1];
+ if (ac < 2)
+ return MOD_CONT;
+ newav[0] = av[1];
+ do_part(av[0], 1, newav);
+ return MOD_CONT;
+}
+
+int anope_event_fjoin(char *source, int ac, char **av)
+{
+ char* newav[127];
+ char people[1024];
+ int i = 0;
+
+ if (ac < 3)
+ return MOD_CONT;
+
+ newav[0] = av[1];
+ newav[1] = av[0];
+ newav[2] = "+";
+ newav[3] = people;
+
+ *people = '\0';
+
+ for (i = 2; i < ac; i++)
+ {
+ if (i > 2)
+ strncat(people," ",1023);
+ strncat(people,av[i],1023);
+ }
+ do_sjoin(source, 4, newav);
+ return MOD_CONT;
+}
+
+void inspircd_cmd_bot_nick(char *nick, char *user, char *host, char *real,
+ char *modes)
+{
+ send_cmd(ServerName, "NICK %ld %s %s %s %s +%s 0.0.0.0 :%s",(long int) time(NULL),nick,host,host,user,modes,real);
+ send_cmd(ServerName, "OPERTYPE Bot");
+}
+
+void inspircd_cmd_kick(char *source, char *chan, char *user, char *buf)
+{
+ if (buf) {
+ send_cmd(source, "KICK %s %s :%s", chan, user, buf);
+ } else {
+ send_cmd(source, "KICK %s %s :%s", chan, user, user);
+ }
+}
+
+void inspircd_cmd_notice_ops(char *source, char *dest, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "NOTICE @%s :%s", dest, buf);
+}
+
+
+void inspircd_cmd_notice(char *source, char *dest, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ if (NSDefFlags & NI_MSG) {
+ inspircd_cmd_privmsg2(source, dest, buf);
+ } else {
+ send_cmd(source, "NOTICE %s :%s", dest, buf);
+ }
+}
+
+void inspircd_cmd_notice2(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "NOTICE %s :%s", dest, msg);
+}
+
+void inspircd_cmd_privmsg(char *source, char *dest, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(source, "PRIVMSG %s :%s", dest, buf);
+}
+
+void inspircd_cmd_privmsg2(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "PRIVMSG %s :%s", dest, msg);
+}
+
+void inspircd_cmd_serv_notice(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "NOTICE $%s :%s", dest, msg);
+}
+
+void inspircd_cmd_serv_privmsg(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "PRIVMSG $%s :%s", dest, msg);
+}
+
+
+void inspircd_cmd_bot_chan_mode(char *nick, char *chan)
+{
+ anope_cmd_mode(nick, chan, "%s %s %s", ircd->botchanumode, nick, nick);
+}
+
+void inspircd_cmd_351(char *source)
+{
+ send_cmd(ServerName, "351 %s Anope-%s %s :%s - %s (%s) -- %s",
+ source, version_number, ServerName, ircd->name, version_flags,
+ EncModule, version_build);
+}
+
+/* QUIT */
+void inspircd_cmd_quit(char *source, char *buf)
+{
+ if (buf) {
+ send_cmd(source, "QUIT :%s", buf);
+ } else {
+ send_cmd(source, "QUIT :Exiting");
+ }
+}
+
+/* PROTOCTL */
+void inspircd_cmd_protoctl()
+{
+}
+
+static char currentpass[1024];
+
+/* PASS */
+void inspircd_cmd_pass(char *pass)
+{
+ strncpy(currentpass,pass,1024);
+}
+
+/* SERVER services-dev.chatspike.net password 0 :Description here */
+void inspircd_cmd_server(char *servname, int hop, char *descript)
+{
+ send_cmd(ServerName, "SERVER %s %s %d :%s", servname, currentpass, hop, descript);
+}
+
+/* PONG */
+void inspircd_cmd_pong(char *servname, char *who)
+{
+ send_cmd(servname, "PONG %s", who);
+}
+
+/* JOIN */
+/* Althought inspircd 3.2 does not need the timestamp others do so
+ we get it in the common function call */
+void inspircd_cmd_join(char *user, char *channel, time_t chantime)
+{
+ send_cmd(user, "JOIN %s", channel);
+}
+
+/* UNSQLINE */
+void inspircd_cmd_unsqline(char *user)
+{
+ if (!user) {
+ return;
+ }
+ send_cmd(s_OperServ, "QLINE %s", user);
+}
+
+/* CHGHOST */
+void inspircd_cmd_chghost(char *nick, char *vhost)
+{
+ if (!nick || !vhost) {
+ return;
+ }
+ send_cmd(s_OperServ,"CHGHOST %s %s", nick, vhost);
+}
+
+/* CHGIDENT */
+void inspircd_cmd_chgident(char *nick, char *vIdent)
+{
+ if (!nick || !vIdent) {
+ return;
+ }
+ send_cmd(s_OperServ, "CHGIDENT %s %s", nick, vIdent);
+}
+
+/* INVITE */
+void inspircd_cmd_invite(char *source, char *chan, char *nick)
+{
+ if (!source || !chan || !nick) {
+ return;
+ }
+
+ send_cmd(source, "INVITE %s %s", nick, chan);
+}
+
+/* PART */
+void inspircd_cmd_part(char *nick, char *chan, char *buf)
+{
+ if (!nick || !chan) {
+ return;
+ }
+
+ if (buf) {
+ send_cmd(nick, "PART %s :%s", chan, buf);
+ } else {
+ send_cmd(nick, "PART %s :Leaving", chan);
+ }
+}
+
+/* 391 */
+void inspircd_cmd_391(char *source, char *timestr)
+{
+ if (!timestr) {
+ return;
+ }
+ send_cmd(NULL, "391 :%s %s :%s", source, ServerName, timestr);
+}
+
+/* 250 */
+void inspircd_cmd_250(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "250 %s", buf);
+}
+
+/* 307 */
+void inspircd_cmd_307(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "307 %s", buf);
+}
+
+/* 311 */
+void inspircd_cmd_311(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "311 %s", buf);
+}
+
+/* 312 */
+void inspircd_cmd_312(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "312 %s", buf);
+}
+
+/* 317 */
+void inspircd_cmd_317(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "317 %s", buf);
+}
+
+/* 219 */
+void inspircd_cmd_219(char *source, char *letter)
+{
+ if (!source) {
+ return;
+ }
+
+ if (letter) {
+ send_cmd(NULL, "219 %s %c :End of /STATS report.", source,
+ *letter);
+ } else {
+ send_cmd(NULL, "219 %s l :End of /STATS report.", source);
+ }
+}
+
+/* 401 */
+void inspircd_cmd_401(char *source, char *who)
+{
+ if (!source || !who) {
+ return;
+ }
+ send_cmd(ServerName, "401 %s %s :No such service.", source, who);
+}
+
+/* 318 */
+void inspircd_cmd_318(char *source, char *who)
+{
+ if (!source || !who) {
+ return;
+ }
+
+ send_cmd(ServerName, "318 %s %s :End of /WHOIS list.", source, who);
+}
+
+/* 242 */
+void inspircd_cmd_242(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "242 %s", buf);
+}
+
+/* 243 */
+void inspircd_cmd_243(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "243 %s", buf);
+}
+
+/* 211 */
+void inspircd_cmd_211(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "211 %s", buf);
+}
+
+/* GLOBOPS */
+void inspircd_cmd_global(char *source, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(source ? source : ServerName, "GLOBOPS :%s", buf);
+}
+
+/* SQLINE */
+void inspircd_cmd_sqline(char *mask, char *reason)
+{
+ if (!mask || !reason) {
+ return;
+ }
+
+ send_cmd(ServerName, "ADDLINE Q %s %s %ld 0 :%s", mask, s_OperServ, (long int) time(NULL), reason);
+}
+
+/* SQUIT */
+void inspircd_cmd_squit(char *servname, char *message)
+{
+ if (!servname || !message) {
+ return;
+ }
+
+ send_cmd(ServerName, "SQUIT %s :%s", servname, message);
+}
+
+/* SVSO */
+void inspircd_cmd_svso(char *source, char *nick, char *flag)
+{
+}
+
+/* NICK <newnick> */
+void inspircd_cmd_chg_nick(char *oldnick, char *newnick)
+{
+ if (!oldnick || !newnick) {
+ return;
+ }
+
+ send_cmd(oldnick, "NICK %s", newnick);
+}
+
+/* SVSNICK */
+void inspircd_cmd_svsnick(char *source, char *guest, time_t when)
+{
+ if (!source || !guest) {
+ return;
+ }
+ /* Please note that inspircd will now echo back a nickchange for this SVSNICK */
+ send_cmd(ServerName, "SVSNICK %s %s :%lu", source, guest, (unsigned long)when);
+}
+
+/* Functions that use serval cmd functions */
+
+void inspircd_cmd_vhost_on(char *nick, char *vIdent, char *vhost)
+{
+ if (!nick) {
+ return;
+ }
+ if (vIdent) {
+ inspircd_cmd_chgident(nick, vIdent);
+ }
+ inspircd_cmd_chghost(nick, vhost);
+}
+
+void inspircd_cmd_connect(int servernum)
+{
+ if (servernum == 1) {
+ inspircd_cmd_pass(RemotePassword);
+ }
+ if (servernum == 2) {
+ inspircd_cmd_pass(RemotePassword2);
+ }
+ if (servernum == 3) {
+ inspircd_cmd_pass(RemotePassword3);
+ }
+ inspircd_cmd_server(ServerName, 0, ServerDesc);
+ send_cmd(NULL,"BURST");
+ send_cmd(ServerName, "VERSION :Anope-%s %s :%s - %s -- %s", version_number, ServerName, ircd->name, version_flags, version_build);
+
+ me_server =
+ new_server(NULL, ServerName, ServerDesc, SERVER_ISME, NULL);
+}
+
+/* Events */
+
+int anope_event_ping(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+ /* ((ac > 1) ? av[1] : ServerName) */
+ inspircd_cmd_pong(ServerName, av[0]);
+ return MOD_CONT;
+}
+
+int anope_event_436(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+
+ m_nickcoll(av[0]);
+ return MOD_CONT;
+}
+
+int anope_event_away(char *source, int ac, char **av)
+{
+ if (!source) {
+ return MOD_CONT;
+ }
+ m_away(source, (ac ? av[0] : NULL));
+ return MOD_CONT;
+}
+
+/* Taken from hybrid.c, topic syntax is identical */
+
+int anope_event_topic(char *source, int ac, char **av)
+{
+ Channel *c = findchan(av[0]);
+ time_t topic_time = time(NULL);
+
+ if (!c) {
+ if (debug) {
+ alog("debug: 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]);
+
+ if (ac > 1 && *av[1])
+ send_event(EVENT_TOPIC_UPDATED, 2, av[0], av[1]);
+ else
+ send_event(EVENT_TOPIC_UPDATED, 2, av[0], "");
+
+ return MOD_CONT;
+}
+
+int anope_event_squit(char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+ do_squit(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_quit(char *source, int ac, char **av)
+{
+ if (ac != 1)
+ return MOD_CONT;
+ do_quit(source, ac, av);
+ return MOD_CONT;
+}
+
+
+int anope_event_mode(char *source, int ac, char **av)
+{
+ if (ac < 2)
+ return MOD_CONT;
+
+ if (*av[0] == '#' || *av[0] == '&') {
+ do_cmode(source, ac, av);
+ } else {
+ /* InspIRCd lets opers change another
+ users modes, we have to kludge this
+ as it slightly breaks RFC1459
+ */
+ if (!strcasecmp(source,av[0]))
+ {
+ do_umode(source, ac, av);
+ }
+ else
+ {
+ do_umode(av[0], ac, av);
+ }
+ }
+ return MOD_CONT;
+}
+
+
+int anope_event_kill(char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+
+ m_kill(av[0], av[1]);
+ return MOD_CONT;
+}
+
+int anope_event_kick(char *source, int ac, char **av)
+{
+ if (ac != 3)
+ return MOD_CONT;
+ do_kick(source, ac, av);
+ return MOD_CONT;
+}
+
+
+int anope_event_join(char *source, int ac, char **av)
+{
+ if (ac != 1)
+ return MOD_CONT;
+ do_join(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_motd(char *source, int ac, char **av)
+{
+ if (!source) {
+ return MOD_CONT;
+ }
+
+ m_motd(source);
+ return MOD_CONT;
+}
+
+int anope_event_setname(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 1)
+ return MOD_CONT;
+
+ u = finduser(source);
+ if (!u) {
+ if (debug) {
+ alog("debug: SETNAME for nonexistent user %s", source);
+ }
+ return MOD_CONT;
+ }
+
+ change_user_realname(u, av[0]);
+ return MOD_CONT;
+}
+
+int anope_event_chgname(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 2)
+ return MOD_CONT;
+
+ u = finduser(source);
+ if (!u) {
+ if (debug) {
+ alog("debug: FNAME for nonexistent user %s", source);
+ }
+ return MOD_CONT;
+ }
+
+ change_user_realname(u, av[0]);
+ return MOD_CONT;
+}
+
+int anope_event_setident(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 1)
+ return MOD_CONT;
+
+ u = finduser(source);
+ if (!u) {
+ if (debug) {
+ alog("debug: SETIDENT for nonexistent user %s", source);
+ }
+ return MOD_CONT;
+ }
+
+ change_user_username(u, av[0]);
+ return MOD_CONT;
+}
+int anope_event_chgident(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 2)
+ return MOD_CONT;
+
+ u = finduser(av[0]);
+ if (!u) {
+ if (debug) {
+ alog("debug: CHGIDENT for nonexistent user %s", av[0]);
+ }
+ return MOD_CONT;
+ }
+
+ change_user_username(u, av[1]);
+ return MOD_CONT;
+}
+
+int anope_event_sethost(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 1)
+ return MOD_CONT;
+
+ u = finduser(source);
+ if (!u) {
+ if (debug) {
+ alog("debug: SETHOST for nonexistent user %s", source);
+ }
+ return MOD_CONT;
+ }
+
+ change_user_host(u, av[0]);
+ return MOD_CONT;
+}
+
+
+int anope_event_nick(char *source, int ac, char **av)
+{
+ User *user;
+ struct in_addr addy;
+ uint32* ad = (uint32*)&addy;
+
+ if (ac != 1) {
+ if (ac == 8) {
+ inet_aton(av[6],&addy);
+ user = do_nick("", av[1], /* nick */
+ av[4], /* username */
+ av[2], /* realhost */
+ source, /* server */
+ av[7], /* realname */
+ strtoul(av[0], NULL, 10),
+ 0,
+ htonl(*ad),
+ av[3],
+ NULL);
+ if (user)
+ anope_set_umode(user, 1, &av[5]);
+ }
+ } else {
+ do_nick(source, av[0], NULL, NULL, NULL, NULL,
+ 0, 0, 0, NULL, NULL);
+ }
+ return MOD_CONT;
+}
+
+
+int anope_event_chghost(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 2)
+ return MOD_CONT;
+
+ u = finduser(source);
+ if (!u) {
+ if (debug) {
+ alog("debug: FHOST for nonexistent user %s", source);
+ }
+ return MOD_CONT;
+ }
+
+ change_user_host(u, av[0]);
+ return MOD_CONT;
+}
+
+/* EVENT: SERVER */
+int anope_event_server(char *source, int ac, char **av)
+{
+ if (!stricmp(av[1], "1")) {
+ uplink = sstrdup(av[0]);
+ }
+ do_server(source, av[0], av[1], av[2], NULL);
+ return MOD_CONT;
+}
+
+
+int anope_event_privmsg(char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+ m_privmsg(source, av[0], av[1]);
+ return MOD_CONT;
+}
+
+int anope_event_part(char *source, int ac, char **av)
+{
+ if (ac < 1 || ac > 2)
+ return MOD_CONT;
+ do_part(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_whois(char *source, int ac, char **av)
+{
+ if (source && ac >= 1) {
+ m_whois(source, av[0]);
+ }
+ return MOD_CONT;
+}
+
+/* SVSHOLD - set */
+void inspircd_cmd_svshold(char *nick)
+{
+ /* Not supported by this IRCD */
+}
+
+/* SVSHOLD - release */
+void inspircd_cmd_release_svshold(char *nick)
+{
+ /* Not Supported by this IRCD */
+}
+
+/* UNSGLINE */
+void inspircd_cmd_unsgline(char *mask)
+{
+ /* Not Supported by this IRCD */
+}
+
+/* UNSZLINE */
+void inspircd_cmd_unszline(char *mask)
+{
+ send_cmd(s_OperServ, "ZLINE %s", mask);
+}
+
+/* SZLINE */
+void inspircd_cmd_szline(char *mask, char *reason, char *whom)
+{
+ send_cmd(ServerName, "ADDLINE Z %s %s %ld 0 :%s", mask, whom, (long int) time(NULL), reason);
+}
+
+/* SGLINE */
+void inspircd_cmd_sgline(char *mask, char *reason)
+{
+ /* Not Supported by this IRCD */
+}
+
+void inspircd_cmd_unban(char *name, char *nick)
+{
+ /* Not Supported by this IRCD */
+}
+
+/* SVSMODE channel modes */
+
+void inspircd_cmd_svsmode_chan(char *name, char *mode, char *nick)
+{
+ /* Not Supported by this IRCD */
+}
+
+
+/* SVSMODE +d */
+/* sent if svid is something weird */
+void inspircd_cmd_svid_umode(char *nick, time_t ts)
+{
+ if (debug)
+ alog("debug: common_svsmode(0)");
+}
+
+/* SVSMODE +d */
+/* nc_change was = 1, and there is no na->status */
+void inspircd_cmd_nc_change(User * u)
+{
+ if (debug)
+ alog("debug: common_svsmode(1)");
+ common_svsmode(u, "-r", NULL);
+}
+
+/* SVSMODE +r */
+void inspircd_cmd_svid_umode2(User * u, char *ts)
+{
+ if (debug)
+ alog("debug: common_svsmode(2)");
+ common_svsmode(u, "+r", NULL);
+}
+
+void inspircd_cmd_svid_umode3(User * u, char *ts)
+{
+ /* not used */
+}
+
+void inspircd_cmd_svsjoin(char *source, char *nick, char *chan, char *param)
+{
+ send_cmd(source, "SAJOIN %s %s", nick, chan);
+}
+
+void inspircd_cmd_svspart(char *source, char *nick, char *chan)
+{
+ send_cmd(source, "SAPART %s %s", nick, chan);
+}
+
+void inspircd_cmd_swhois(char *source, char *who, char *mask)
+{
+}
+
+void inspircd_cmd_eob()
+{
+ send_cmd(NULL,"ENDBURST");
+}
+
+
+int anope_event_rehash(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_credits(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_admin(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int inspircd_flood_mode_check(char *value)
+{
+ char *dp, *end;
+
+ if (value && *value != ':'
+ && (strtoul((*value == '*' ? value + 1 : value), &dp, 10) > 0)
+ && (*dp == ':') && (*(++dp) != 0) && (strtoul(dp, &end, 10) > 0)
+ && (*end == 0)) {
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
+void inspircd_cmd_jupe(char *jserver, char *who, char *reason)
+{
+ char rbuf[256];
+
+ snprintf(rbuf, sizeof(rbuf), "Juped by %s%s%s", who,
+ reason ? ": " : "", reason ? reason : "");
+
+ if (findserver(servlist, jserver))
+ inspircd_cmd_squit(jserver, rbuf);
+ inspircd_cmd_server(jserver, 1, rbuf);
+ new_server(me_server, jserver, rbuf, SERVER_JUPED, NULL);
+}
+
+/* GLOBOPS - to handle old WALLOPS */
+void inspircd_cmd_global_legacy(char *source, char *fmt)
+{
+ send_cmd(source ? source : s_OperServ, "GLOBOPS :%s", fmt);
+}
+
+int inspircd_valid_nick(char *nick)
+{
+ return 1;
+}
+
+int inspircd_valid_chan(char *chan)
+{
+ return 1;
+}
+
+
+void inspircd_cmd_ctcp(char *source, char *dest, char *buf)
+{
+ char *s;
+
+ if (!buf) {
+ return;
+ } else {
+ s = normalizeBuffer(buf);
+ }
+
+ send_cmd(source, "NOTICE %s :\1%s\1", dest, s);
+ free(s);
+}
+
+
+/**
+ * Tell anope which function we want to perform each task inside of anope.
+ * These prototypes must match what anope expects.
+ **/
+void moduleAddAnopeCmds()
+{
+ pmodule_cmd_svsnoop(inspircd_cmd_svsnoop);
+ pmodule_cmd_remove_akill(inspircd_cmd_remove_akill);
+ pmodule_cmd_topic(inspircd_cmd_topic);
+ pmodule_cmd_vhost_off(inspircd_cmd_vhost_off);
+ pmodule_cmd_akill(inspircd_cmd_akill);
+ pmodule_cmd_svskill(inspircd_cmd_svskill);
+ pmodule_cmd_svsmode(inspircd_cmd_svsmode);
+ pmodule_cmd_372(inspircd_cmd_372);
+ pmodule_cmd_372_error(inspircd_cmd_372_error);
+ pmodule_cmd_375(inspircd_cmd_375);
+ pmodule_cmd_376(inspircd_cmd_376);
+ pmodule_cmd_nick(inspircd_cmd_nick);
+ pmodule_cmd_guest_nick(inspircd_cmd_guest_nick);
+ pmodule_cmd_mode(inspircd_cmd_mode);
+ pmodule_cmd_bot_nick(inspircd_cmd_bot_nick);
+ pmodule_cmd_kick(inspircd_cmd_kick);
+ pmodule_cmd_notice_ops(inspircd_cmd_notice_ops);
+ pmodule_cmd_notice(inspircd_cmd_notice);
+ pmodule_cmd_notice2(inspircd_cmd_notice2);
+ pmodule_cmd_privmsg(inspircd_cmd_privmsg);
+ pmodule_cmd_privmsg2(inspircd_cmd_privmsg2);
+ pmodule_cmd_serv_notice(inspircd_cmd_serv_notice);
+ pmodule_cmd_serv_privmsg(inspircd_cmd_serv_privmsg);
+ pmodule_cmd_bot_chan_mode(inspircd_cmd_bot_chan_mode);
+ pmodule_cmd_351(inspircd_cmd_351);
+ pmodule_cmd_quit(inspircd_cmd_quit);
+ pmodule_cmd_pong(inspircd_cmd_pong);
+ pmodule_cmd_join(inspircd_cmd_join);
+ pmodule_cmd_unsqline(inspircd_cmd_unsqline);
+ pmodule_cmd_invite(inspircd_cmd_invite);
+ pmodule_cmd_part(inspircd_cmd_part);
+ pmodule_cmd_391(inspircd_cmd_391);
+ pmodule_cmd_250(inspircd_cmd_250);
+ pmodule_cmd_307(inspircd_cmd_307);
+ pmodule_cmd_311(inspircd_cmd_311);
+ pmodule_cmd_312(inspircd_cmd_312);
+ pmodule_cmd_317(inspircd_cmd_317);
+ pmodule_cmd_219(inspircd_cmd_219);
+ pmodule_cmd_401(inspircd_cmd_401);
+ pmodule_cmd_318(inspircd_cmd_318);
+ pmodule_cmd_242(inspircd_cmd_242);
+ pmodule_cmd_243(inspircd_cmd_243);
+ pmodule_cmd_211(inspircd_cmd_211);
+ pmodule_cmd_global(inspircd_cmd_global);
+ pmodule_cmd_global_legacy(inspircd_cmd_global_legacy);
+ pmodule_cmd_sqline(inspircd_cmd_sqline);
+ pmodule_cmd_squit(inspircd_cmd_squit);
+ pmodule_cmd_svso(inspircd_cmd_svso);
+ pmodule_cmd_chg_nick(inspircd_cmd_chg_nick);
+ pmodule_cmd_svsnick(inspircd_cmd_svsnick);
+ pmodule_cmd_vhost_on(inspircd_cmd_vhost_on);
+ pmodule_cmd_connect(inspircd_cmd_connect);
+ pmodule_cmd_svshold(inspircd_cmd_svshold);
+ pmodule_cmd_release_svshold(inspircd_cmd_release_svshold);
+ pmodule_cmd_unsgline(inspircd_cmd_unsqline);
+ pmodule_cmd_unszline(inspircd_cmd_unszline);
+ pmodule_cmd_szline(inspircd_cmd_szline);
+ pmodule_cmd_sgline(inspircd_cmd_sgline);
+ pmodule_cmd_unban(inspircd_cmd_unban);
+ pmodule_cmd_svsmode_chan(inspircd_cmd_svsmode_chan);
+ pmodule_cmd_svid_umode(inspircd_cmd_svid_umode);
+ pmodule_cmd_nc_change(inspircd_cmd_nc_change);
+ pmodule_cmd_svid_umode2(inspircd_cmd_svid_umode2);
+ pmodule_cmd_svid_umode3(inspircd_cmd_svid_umode3);
+ pmodule_cmd_svsjoin(inspircd_cmd_svsjoin);
+ pmodule_cmd_svspart(inspircd_cmd_svspart);
+ pmodule_cmd_swhois(inspircd_cmd_swhois);
+ pmodule_cmd_eob(inspircd_cmd_eob);
+ pmodule_flood_mode_check(inspircd_flood_mode_check);
+ pmodule_cmd_jupe(inspircd_cmd_jupe);
+ pmodule_valid_nick(inspircd_valid_nick);
+ pmodule_valid_chan(inspircd_valid_chan);
+ pmodule_cmd_ctcp(inspircd_cmd_ctcp);
+ pmodule_set_umode(inspircd_set_umode);
+}
+
+/**
+ * Now tell anope how to use us.
+ **/
+int AnopeInit(int argc, char **argv)
+{
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(PROTOCOL);
+
+ pmodule_ircd_version("inspircdIRCd 1.0");
+ pmodule_ircd_cap(myIrcdcap);
+ pmodule_ircd_var(myIrcd);
+ pmodule_ircd_cbmodeinfos(myCbmodeinfos);
+ pmodule_ircd_cumodes(myCumodes);
+ pmodule_ircd_flood_mode_char_set("+f");
+ pmodule_ircd_flood_mode_char_remove("-f");
+ pmodule_ircd_cbmodes(myCbmodes);
+ pmodule_ircd_cmmodes(myCmmodes);
+ pmodule_ircd_csmodes(myCsmodes);
+ pmodule_ircd_useTSMode(0);
+
+ /** Deal with modes anope _needs_ to know **/
+ pmodule_invis_umode(UMODE_i);
+ pmodule_oper_umode(UMODE_o);
+ pmodule_invite_cmode(CMODE_i);
+ pmodule_secret_cmode(CMODE_s);
+ pmodule_private_cmode(CMODE_p);
+ pmodule_key_mode(CMODE_k);
+ pmodule_limit_mode(CMODE_l);
+
+ moduleAddAnopeCmds();
+ moduleAddIRCDMsgs();
+
+ return MOD_CONT;
+}
diff --git a/src/protocol/inspircd10.h b/src/protocol/inspircd10.h
new file mode 100644
index 000000000..d23876029
--- /dev/null
+++ b/src/protocol/inspircd10.h
@@ -0,0 +1,133 @@
+/* inspircd beta 6 functions
+ *
+ * (C) 2003-2008 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.
+ *
+ *
+ */
+
+/*************************************************************************/
+
+#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
+#define UMODE_g 0x80000000
+#define UMODE_x 0x40000000
+
+#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
+#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
+#define CMODE_R 0x00000100 /* Only identified users can join */
+#define CMODE_r 0x00000200 /* Set for all registered channels */
+
+#define DEFAULT_MLOCK CMODE_n | CMODE_t | CMODE_r
+
+void inspircd_set_umode(User * user, int ac, char **av);
+void inspircd_cmd_svsnoop(char *server, int set);
+void inspircd_cmd_remove_akill(char *user, char *host);
+void inspircd_cmd_topic(char *whosets, char *chan, char *whosetit, char *topic, time_t when);
+void inspircd_cmd_vhost_off(User * u);
+void inspircd_cmd_akill(char *user, char *host, char *who, time_t when,time_t expires, char *reason);
+void inspircd_cmd_svskill(char *source, char *user, char *buf);
+void inspircd_cmd_svsmode(User * u, int ac, char **av);
+void inspircd_cmd_372(char *source, char *msg);
+void inspircd_cmd_372_error(char *source);
+void inspircd_cmd_375(char *source);
+void inspircd_cmd_376(char *source);
+void inspircd_cmd_nick(char *nick, char *name, char *modes);
+void inspircd_cmd_guest_nick(char *nick, char *user, char *host, char *real, char *modes);
+void inspircd_cmd_mode(char *source, char *dest, char *buf);
+void inspircd_cmd_bot_nick(char *nick, char *user, char *host, char *real, char *modes);
+void inspircd_cmd_kick(char *source, char *chan, char *user, char *buf);
+void inspircd_cmd_notice_ops(char *source, char *dest, char *buf);
+void inspircd_cmd_notice(char *source, char *dest, char *buf);
+void inspircd_cmd_notice2(char *source, char *dest, char *msg);
+void inspircd_cmd_privmsg(char *source, char *dest, char *buf);
+void inspircd_cmd_privmsg2(char *source, char *dest, char *msg);
+void inspircd_cmd_serv_notice(char *source, char *dest, char *msg);
+void inspircd_cmd_serv_privmsg(char *source, char *dest, char *msg);
+void inspircd_cmd_bot_chan_mode(char *nick, char *chan);
+void inspircd_cmd_351(char *source);
+void inspircd_cmd_quit(char *source, char *buf);
+void inspircd_cmd_pong(char *servname, char *who);
+void inspircd_cmd_join(char *user, char *channel, time_t chantime);
+void inspircd_cmd_unsqline(char *user);
+void inspircd_cmd_invite(char *source, char *chan, char *nick);
+void inspircd_cmd_part(char *nick, char *chan, char *buf);
+void inspircd_cmd_391(char *source, char *timestr);
+void inspircd_cmd_250(char *buf);
+void inspircd_cmd_307(char *buf);
+void inspircd_cmd_311(char *buf);
+void inspircd_cmd_312(char *buf);
+void inspircd_cmd_317(char *buf);
+void inspircd_cmd_219(char *source, char *letter);
+void inspircd_cmd_401(char *source, char *who);
+void inspircd_cmd_318(char *source, char *who);
+void inspircd_cmd_242(char *buf);
+void inspircd_cmd_243(char *buf);
+void inspircd_cmd_211(char *buf);
+void inspircd_cmd_global(char *source, char *buf);
+void inspircd_cmd_global_legacy(char *source, char *fmt);
+void inspircd_cmd_sqline(char *mask, char *reason);
+void inspircd_cmd_squit(char *servname, char *message);
+void inspircd_cmd_svso(char *source, char *nick, char *flag);
+void inspircd_cmd_chg_nick(char *oldnick, char *newnick);
+void inspircd_cmd_svsnick(char *source, char *guest, time_t when);
+void inspircd_cmd_vhost_on(char *nick, char *vIdent, char *vhost);
+void inspircd_cmd_connect(int servernum);
+void inspircd_cmd_svshold(char *nick);
+void inspircd_cmd_release_svshold(char *nick);
+void inspircd_cmd_unsgline(char *mask);
+void inspircd_cmd_unszline(char *mask);
+void inspircd_cmd_szline(char *mask, char *reason, char *whom);
+void inspircd_cmd_sgline(char *mask, char *reason);
+void inspircd_cmd_unban(char *name, char *nick);
+void inspircd_cmd_svsmode_chan(char *name, char *mode, char *nick);
+void inspircd_cmd_svid_umode(char *nick, time_t ts);
+void inspircd_cmd_nc_change(User * u);
+void inspircd_cmd_svid_umode2(User * u, char *ts);
+void inspircd_cmd_svid_umode3(User * u, char *ts);
+void inspircd_cmd_eob();
+int inspircd_flood_mode_check(char *value);
+void inspircd_cmd_jupe(char *jserver, char *who, char *reason);
+int inspircd_valid_nick(char *nick);
+void inspircd_cmd_ctcp(char *source, char *dest, char *buf);
+int anope_event_fjoin(char *source, int ac, char **av);
+int anope_event_fmode(char *source, int ac, char **av);
+int anope_event_ftopic(char *source, int ac, char **av);
+int anope_event_sanick(char *source, int ac, char **av);
+int anope_event_samode(char *source, int ac, char **av);
+int anope_event_sajoin(char *source, int ac, char **av);
+int anope_event_sapart(char *source, int ac, char **av);
+int anope_event_version(char *source, int ac, char **av);
+int anope_event_opertype(char *source, int ac, char **av);
+int anope_event_idle(char* source, int ac, char **av);
diff --git a/src/protocol/inspircd11.c b/src/protocol/inspircd11.c
new file mode 100644
index 000000000..eb2b3c4a2
--- /dev/null
+++ b/src/protocol/inspircd11.c
@@ -0,0 +1,1928 @@
+/* inspircd 1.1 beta 6+ functions
+ *
+ * (C) 2005-2007 Craig Edwards <brain@inspircd.org>
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ *
+ */
+
+/*************************************************************************/
+
+#include "services.h"
+#include "pseudo.h"
+#include "inspircd11.h"
+
+#ifndef _WIN32
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#endif
+
+#ifdef _WIN32
+#include "winsock.h"
+int inet_aton(const char *name, struct in_addr *addr)
+{
+ uint32 a = inet_addr(name);
+ addr->s_addr = a;
+ return a != (uint32) - 1;
+}
+#endif
+
+IRCDVar myIrcd[] = {
+ {"InspIRCd 1.1", /* ircd name */
+ "+oI", /* nickserv mode */
+ "+oI", /* chanserv mode */
+ "+oI", /* memoserv mode */
+ "+oI", /* hostserv mode */
+ "+ioI", /* operserv mode */
+ "+oI", /* botserv mode */
+ "+oI", /* helpserv mode */
+ "+iI", /* Dev/Null mode */
+ "+ioI", /* Global mode */
+ "+oI", /* nickserv alias mode */
+ "+oI", /* chanserv alias mode */
+ "+oI", /* memoserv alias mode */
+ "+ioI", /* hostserv alias mode */
+ "+ioI", /* operserv alias mode */
+ "+oI", /* botserv alias mode */
+ "+oI", /* helpserv alias mode */
+ "+iI", /* Dev/Null alias mode */
+ "+ioI", /* Global alias mode */
+ "+sI", /* Used by BotServ Bots */
+ 5, /* Chan Max Symbols */
+ "-cilmnpstuzACGHKNOQRSV", /* Modes to Remove */
+ "+ao", /* Channel Umode used by Botserv bots */
+ 1, /* SVSNICK */
+ 1, /* Vhost */
+ 1, /* Has Owner */
+ "+q", /* Mode to set for an owner */
+ "-q", /* Mode to unset for an owner */
+ "+a", /* Mode to set for channel admin */
+ "-a", /* Mode to unset for channel admin */
+ "+r", /* Mode On Reg */
+ NULL, /* Mode on ID for Roots */
+ NULL, /* Mode on ID for Admins */
+ NULL, /* Mode on ID for Opers */
+ "-r", /* Mode on UnReg */
+ "-r", /* Mode on Nick Change */
+ 1, /* Supports SGlines */
+ 1, /* Supports SQlines */
+ 1, /* Supports SZlines */
+ 1, /* Supports Halfop +h */
+ 4, /* Number of server args */
+ 0, /* Join 2 Set */
+ 1, /* Join 2 Message */
+ 0, /* Has exceptions +e */
+ 1, /* TS Topic Forward */
+ 0, /* TS Topci Backward */
+ 0, /* Protected Umode */
+ 0, /* Has Admin */
+ 0, /* Chan SQlines */
+ 0, /* Quit on Kill */
+ 0, /* SVSMODE unban */
+ 1, /* Has Protect */
+ 1, /* Reverse */
+ 1, /* Chan Reg */
+ CMODE_r, /* Channel Mode */
+ 1, /* vidents */
+ 0, /* svshold */
+ 0, /* time stamp on mode */
+ 0, /* NICKIP */
+ 1, /* O:LINE */
+ 1, /* UMODE */
+ 1, /* VHOST ON NICK */
+ 0, /* Change RealName */
+ CMODE_K, /* No Knock */
+ 0, /* Admin Only */
+ DEFAULT_MLOCK, /* Default MLOCK */
+ UMODE_x, /* Vhost Mode */
+ 0, /* +f */
+ 1, /* +L */
+ CMODE_f,
+ CMODE_L,
+ 0,
+ 1, /* No Knock requires +i */
+ NULL, /* CAPAB Chan Modes */
+ 0, /* We support inspircd TOKENS */
+ 1, /* TOKENS are CASE inSensitive */
+ 0, /* TIME STAMPS are BASE64 */
+ 0, /* +I support */
+ 0, /* SJOIN ban char */
+ 0, /* SJOIN except char */
+ 0, /* SJOIN invite char */
+ 0, /* Can remove User Channel Modes with SVSMODE */
+ 0, /* Sglines are not enforced until user reconnects */
+ "x", /* vhost char */
+ 0, /* ts6 */
+ 1, /* support helper umode */
+ 0, /* p10 */
+ NULL, /* character set */
+ 0, /* reports sync state */
+ 1, /* CIDR channelbans */
+ }
+ ,
+ {NULL}
+};
+
+
+IRCDCAPAB myIrcdcap[] = {
+ {
+ CAPAB_NOQUIT, /* NOQUIT */
+ 0, /* TSMODE */
+ 1, /* UNCONNECT */
+ 0, /* NICKIP */
+ 0, /* SJOIN */
+ 0, /* ZIP */
+ 0, /* BURST */
+ 0, /* TS5 */
+ 0, /* TS3 */
+ 0, /* DKEY */
+ 0, /* PT4 */
+ 0, /* SCS */
+ 0, /* QS */
+ 0, /* UID */
+ 0, /* KNOCK */
+ 0, /* CLIENT */
+ 0, /* IPV6 */
+ 0, /* SSJ5 */
+ 0, /* SN2 */
+ 0, /* TOKEN */
+ 0, /* VHOST */
+ CAPAB_SSJ3, /* SSJ3 */
+ CAPAB_NICK2, /* NICK2 */
+ 0, /* UMODE2 */
+ CAPAB_VL, /* VL */
+ CAPAB_TLKEXT, /* TLKEXT */
+ 0, /* DODKEY */
+ 0, /* DOZIP */
+ 0,
+ 0, 0}
+};
+
+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,
+ 0,
+ 0,
+ 0,
+ 0, 0, 0, 0, 0, 0, 0,
+ 0,
+ 0, 0, 0, 0, 0,
+ 0, UMODE_a, 0, 0, 0, 0, 0,
+ UMODE_g,
+ UMODE_h, UMODE_i, 0, 0, 0, 0, 0, UMODE_o,
+ 0,
+ 0, UMODE_r, 0, 0, 0, 0, UMODE_w,
+ UMODE_x,
+ 0,
+ 0,
+ 0, 0, 0, 0, 0
+};
+
+
+char myCsmodes[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,
+ 'h', /* (37) % Channel halfops */
+ 'a',
+ 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, 'q', 0
+};
+
+CMMode myCmmodes[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},
+ {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}
+};
+
+
+
+CBMode myCbmodes[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},
+ {CMODE_A, CBM_NO_USER_MLOCK, NULL, NULL},
+ {0}, /* B */
+ {CMODE_C, 0, NULL, NULL}, /* C */
+ {0}, /* D */
+ {0}, /* E */
+ {0}, /* F */
+ {CMODE_G, 0, NULL, NULL}, /* G */
+ {CMODE_H, CBM_NO_USER_MLOCK, NULL, NULL},
+ {0}, /* I */
+ {0}, /* J */
+ {CMODE_K, 0, NULL, NULL}, /* K */
+ {CMODE_L, 0, set_redirect, cs_set_redirect},
+ {0}, /* M */
+ {CMODE_N, 0, NULL, NULL}, /* N */
+ {CMODE_O, CBM_NO_USER_MLOCK, NULL, NULL},
+ {0}, /* P */
+ {CMODE_Q, 0, NULL, NULL}, /* Q */
+ {CMODE_R, 0, NULL, NULL}, /* R */
+ {CMODE_S, 0, NULL, NULL}, /* S */
+ {0}, /* T */
+ {0}, /* U */
+ {CMODE_V, 0, NULL, NULL}, /* V */
+ {0}, /* W */
+ {0}, /* X */
+ {0}, /* Y */
+ {0}, /* Z */
+ {0}, {0}, {0}, {0}, {0}, {0},
+ {0}, /* a */
+ {0}, /* b */
+ {CMODE_c, 0, NULL, NULL},
+ {0}, /* d */
+ {0}, /* e */
+ {0}, /* f */
+ {0}, /* g */
+ {0}, /* h */
+ {CMODE_i, 0, NULL, NULL},
+ {0}, /* j */
+ {CMODE_k, 0, chan_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},
+ {0}, /* q */
+ {CMODE_r, CBM_NO_MLOCK, NULL, NULL},
+ {CMODE_s, 0, NULL, NULL},
+ {CMODE_t, 0, NULL, NULL},
+ {CMODE_u, 0, NULL, NULL},
+ {0}, /* v */
+ {0}, /* w */
+ {0}, /* x */
+ {0}, /* y */
+ {CMODE_z, 0, NULL, NULL},
+ {0}, {0}, {0}, {0}
+};
+
+CBModeInfo myCbmodeinfos[] = {
+ {'f', CMODE_f, 0, NULL, NULL},
+ {'c', CMODE_c, 0, NULL, NULL},
+ {'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},
+ {'r', CMODE_r, 0, NULL, NULL},
+ {'s', CMODE_s, 0, NULL, NULL},
+ {'t', CMODE_t, 0, NULL, NULL},
+ {'u', CMODE_u, 0, NULL, NULL},
+ {'z', CMODE_z, 0, NULL, NULL},
+ {'A', CMODE_A, 0, NULL, NULL},
+ {'C', CMODE_C, 0, NULL, NULL},
+ {'G', CMODE_G, 0, NULL, NULL},
+ {'H', CMODE_H, 0, NULL, NULL},
+ {'K', CMODE_K, 0, NULL, NULL},
+ {'L', CMODE_L, 0, get_redirect, cs_get_redirect},
+ {'N', CMODE_N, 0, NULL, NULL},
+ {'O', CMODE_O, 0, NULL, NULL},
+ {'Q', CMODE_Q, 0, NULL, NULL},
+ {'R', CMODE_R, 0, NULL, NULL},
+ {'S', CMODE_S, 0, NULL, NULL},
+ {'V', CMODE_V, 0, NULL, NULL},
+ {0}
+};
+
+CUMode myCumodes[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},
+
+ {CUS_PROTECT, CUF_PROTECT_BOTSERV, check_valid_op},
+ {0}, /* b */
+ {0}, /* c */
+ {0}, /* d */
+ {0}, /* e */
+ {0}, /* f */
+ {0}, /* g */
+ {CUS_HALFOP, 0, check_valid_op},
+ {0}, /* i */
+ {0}, /* j */
+ {0}, /* k */
+ {0}, /* l */
+ {0}, /* m */
+ {0}, /* n */
+ {CUS_OP, CUF_PROTECT_BOTSERV, check_valid_op},
+ {0}, /* p */
+ {CUS_OWNER, 0, check_valid_op},
+ {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}
+};
+
+static int has_servicesmod = 0;
+static int has_globopsmod = 0;
+
+/* These are sanity checks to insure we are supported.
+ The ircd tends to /squit us if we issue unsupported cmds.
+ - katsklaw */
+static int has_svsholdmod = 0;
+static int has_chghostmod = 0;
+static int has_chgidentmod = 0;
+static int has_messagefloodmod = 0;
+static int has_banexceptionmod = 0;
+static int has_inviteexceptionmod = 0;
+
+void inspircd_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) {
+
+ /* This looks better, much better than "add ? (do_add) : (do_remove)".
+ * At least this is readable without paying much attention :) -GD
+ */
+ if (add)
+ user->mode |= umodes[(int) *modes];
+ else
+ user->mode &= ~umodes[(int) *modes];
+
+ switch (*modes++) {
+ case '+':
+ add = 1;
+ break;
+ case '-':
+ add = 0;
+ break;
+ case 'd':
+ if (ac == 0) {
+ break;
+ }
+
+ ac--;
+ av++;
+ user->svid = strtoul(*av, NULL, 0);
+ break;
+ case 'o':
+ if (add) {
+ opcnt++;
+ if (WallOper) {
+ anope_cmd_global(s_OperServ,
+ "\2%s\2 is now an IRC operator.",
+ user->nick);
+ }
+ display_news(user, NEWS_OPER);
+ } else {
+ opcnt--;
+ }
+ break;
+ case 'a':
+ if (UnRestrictSAdmin) {
+ break;
+ }
+ if (add && !is_services_admin(user)) {
+ common_svsmode(user, "-a", NULL);
+ user->mode &= ~UMODE_a;
+ }
+ break;
+ case 'r':
+ user->svid = (add ? user->timestamp : 0);
+ if (add && !nick_identified(user)) {
+ common_svsmode(user, "-r", NULL);
+ user->mode &= ~UMODE_r;
+ }
+ break;
+ case 'x':
+ update_host(user);
+ break;
+ }
+ }
+}
+
+
+/* *INDENT-OFF* */
+void moduleAddIRCDMsgs(void) {
+ Message *m;
+
+ updateProtectDetails("PROTECT","PROTECTME","protect","deprotect","AUTOPROTECT","+a","-a");
+
+ m = createMessage("436", anope_event_436); addCoreMessage(IRCD,m);
+ m = createMessage("AWAY", anope_event_away); addCoreMessage(IRCD,m);
+ m = createMessage("INVITE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("JOIN", anope_event_join); addCoreMessage(IRCD,m);
+ m = createMessage("KICK", anope_event_kick); addCoreMessage(IRCD,m);
+ m = createMessage("KILL", anope_event_kill); addCoreMessage(IRCD,m);
+ m = createMessage("MODE", anope_event_mode); addCoreMessage(IRCD,m);
+ m = createMessage("MOTD", anope_event_motd); addCoreMessage(IRCD,m);
+ m = createMessage("NICK", anope_event_nick); addCoreMessage(IRCD,m);
+ m = createMessage("NOTICE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("BURST", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("ENDBURST", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("CAPAB", anope_event_capab); addCoreMessage(IRCD,m);
+ m = createMessage("PART", anope_event_part); addCoreMessage(IRCD,m);
+ m = createMessage("PING", anope_event_ping); addCoreMessage(IRCD,m);
+ m = createMessage("PRIVMSG", anope_event_privmsg); addCoreMessage(IRCD,m);
+ m = createMessage("QUIT", anope_event_quit); addCoreMessage(IRCD,m);
+ m = createMessage("SERVER", anope_event_server); addCoreMessage(IRCD,m);
+ m = createMessage("SQUIT", anope_event_squit); addCoreMessage(IRCD,m);
+ m = createMessage("RSQUIT", anope_event_rsquit); addCoreMessage(IRCD,m);
+ m = createMessage("TOPIC", anope_event_topic); addCoreMessage(IRCD,m);
+ m = createMessage("WALLOPS", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("WHOIS", anope_event_whois); addCoreMessage(IRCD,m);
+ m = createMessage("GLOBOPS", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SILENCE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SVSMODE", anope_event_mode) ;addCoreMessage(IRCD,m);
+ m = createMessage("QLINE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("GLINE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("ELINE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("ZLINE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("ADDLINE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("FHOST", anope_event_chghost); addCoreMessage(IRCD,m);
+ m = createMessage("CHGIDENT", anope_event_chgident); addCoreMessage(IRCD,m);
+ m = createMessage("FNAME", anope_event_chgname); addCoreMessage(IRCD,m);
+ m = createMessage("METADATA", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SETHOST", anope_event_sethost); addCoreMessage(IRCD,m);
+ m = createMessage("SETIDENT", anope_event_setident); addCoreMessage(IRCD,m);
+ m = createMessage("SETNAME", anope_event_setname); addCoreMessage(IRCD,m);
+ m = createMessage("REHASH", anope_event_rehash); addCoreMessage(IRCD,m);
+ m = createMessage("ADMIN", anope_event_admin); addCoreMessage(IRCD,m);
+ m = createMessage("CREDITS", anope_event_credits); addCoreMessage(IRCD,m);
+ m = createMessage("FJOIN", anope_event_fjoin); addCoreMessage(IRCD,m);
+ m = createMessage("FMODE", anope_event_fmode); addCoreMessage(IRCD,m);
+ m = createMessage("FTOPIC", anope_event_ftopic); addCoreMessage(IRCD,m);
+ m = createMessage("VERSION", anope_event_version); addCoreMessage(IRCD,m);
+ m = createMessage("OPERTYPE", anope_event_opertype); addCoreMessage(IRCD,m);
+ m = createMessage("IDLE", anope_event_idle); addCoreMessage(IRCD,m);
+}
+
+/* *INDENT-ON* */
+
+void inspircd_cmd_svsnoop(char *server, int set)
+{
+ /* Not Supported by this IRCD */
+}
+
+void inspircd_cmd_svsadmin(char *server, int set)
+{
+ /* Not Supported by this IRCD */
+}
+
+void inspircd_cmd_remove_akill(char *user, char *host)
+{
+ send_cmd(s_OperServ, "GLINE %s@%s", user, host);
+}
+
+void
+inspircd_cmd_topic(char *whosets, char *chan, char *whosetit,
+ char *topic, time_t when)
+{
+ send_cmd(whosets, "FTOPIC %s %lu %s :%s", chan,
+ (unsigned long int) when, whosetit, topic);
+}
+
+void inspircd_cmd_vhost_off(User * u)
+{
+ send_cmd(s_HostServ, "MODE %s -x", u->nick);
+}
+
+void
+inspircd_cmd_akill(char *user, char *host, char *who, time_t when,
+ time_t expires, char *reason)
+{
+ send_cmd(ServerName, "ADDLINE G %s@%s %s %ld %ld :%s", user, host, who,
+ (long int) when, (long int) 86400 * 2, reason);
+}
+
+void inspircd_cmd_svskill(char *source, char *user, char *buf)
+{
+ if (!buf || !source || !user)
+ return;
+
+ send_cmd(source, "KILL %s :%s", user, buf);
+}
+
+void inspircd_cmd_svsmode(User * u, int ac, char **av)
+{
+ /* This was originally done using this:
+ send_cmd(s_NickServ, "MODE %s %s%s%s", u->nick, av[0], (ac == 2 ? " " : ""), (ac == 2 ? av[1] : ""));
+ * but that's the dirty way of doing things...
+ */
+ send_cmd(s_NickServ, "MODE %s %s", u->nick, merge_args(ac, av));
+}
+
+
+void inspircd_cmd_372(char *source, char *msg)
+{
+ send_cmd(ServerName, "372 %s :- %s", source, msg);
+}
+
+void inspircd_cmd_372_error(char *source)
+{
+ send_cmd(ServerName, "422 %s :- MOTD file not found! Please "
+ "contact your IRC administrator.", source);
+}
+
+void inspircd_cmd_375(char *source)
+{
+ send_cmd(ServerName, "375 %s :- %s Message of the Day",
+ source, ServerName);
+}
+
+void inspircd_cmd_376(char *source)
+{
+ send_cmd(ServerName, "376 %s :End of /MOTD command.", source);
+}
+
+void inspircd_cmd_nick(char *nick, char *name, char *modes)
+{
+ /* :test.chatspike.net NICK 1133519355 Brain synapse.brainbox.winbot.co.uk netadmin.chatspike.net ~brain +xwsioS 10.0.0.2 :Craig Edwards */
+ send_cmd(ServerName, "NICK %ld %s %s %s %s +%s 0.0.0.0 :%s",
+ (long int) time(NULL), nick, ServiceHost, ServiceHost,
+ ServiceUser, modes, name);
+ /* Don't send ServerName as the source here... -GD */
+ send_cmd(nick, "OPERTYPE Service");
+}
+
+void
+inspircd_cmd_guest_nick(char *nick, char *user, char *host,
+ char *real, char *modes)
+{
+ send_cmd(ServerName, "NICK %ld %s %s %s %s +%s 0.0.0.0 :%s",
+ (long int) time(NULL), nick, host, host, user, modes, real);
+}
+
+void inspircd_cmd_mode(char *source, char *dest, char *buf)
+{
+ Channel *c;
+ if (!buf) {
+ return;
+ }
+
+ c = findchan(dest);
+ send_cmd(source ? source : s_OperServ, "FMODE %s %u %s", dest, (unsigned int)((c) ? c->creation_time : time(NULL)), buf);
+}
+
+int anope_event_version(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_idle(char *source, int ac, char **av)
+{
+ if (ac == 1) {
+ send_cmd(av[0], "IDLE %s %ld 0", source, (long int) time(NULL));
+ }
+ return MOD_CONT;
+}
+
+int anope_event_ftopic(char *source, int ac, char **av)
+{
+ /* :source FTOPIC channel ts setby :topic */
+ char *temp;
+ if (ac < 4)
+ return MOD_CONT;
+ temp = av[1]; /* temp now holds ts */
+ av[1] = av[2]; /* av[1] now holds set by */
+ av[2] = temp; /* av[2] now holds ts */
+ do_topic(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_opertype(char *source, int ac, char **av)
+{
+ /* opertype is equivalent to mode +o because servers
+ dont do this directly */
+ User *u;
+ u = finduser(source);
+ if (u && !is_oper(u)) {
+ char *newav[2];
+ newav[0] = source;
+ newav[1] = "+o";
+ return anope_event_mode(source, 2, newav);
+ } else
+ return MOD_CONT;
+}
+
+int anope_event_fmode(char *source, int ac, char **av)
+{
+ char *newav[25];
+ int n, o;
+ Channel *c;
+
+ /* :source FMODE #test 12345678 +nto foo */
+ if (ac < 3)
+ return MOD_CONT;
+
+ /* Checking the TS for validity to avoid desyncs */
+ if ((c = findchan(av[0]))) {
+ if (c->creation_time > strtol(av[1], NULL, 10)) {
+ /* Our TS is bigger, we should lower it */
+ c->creation_time = strtol(av[1], NULL, 10);
+ } else if (c->creation_time < strtol(av[1], NULL, 10)) {
+ /* The TS we got is bigger, we should ignore this message. */
+ return MOD_CONT;
+ }
+ } else {
+ /* Got FMODE for a non-existing channel */
+ return MOD_CONT;
+ }
+
+ /* TS's are equal now, so we can proceed with parsing */
+ n = o = 0;
+ while (n < ac) {
+ if (n != 1) {
+ newav[o] = av[n];
+ o++;
+ if (debug)
+ alog("Param: %s", newav[o - 1]);
+ }
+ n++;
+ }
+
+ return anope_event_mode(source, ac - 1, newav);
+}
+
+int anope_event_fjoin(char *source, int ac, char **av)
+{
+ char *newav[10];
+
+ /* value used for myStrGetToken */
+ int curtoken = 0;
+
+ /* storing the current nick */
+ char *curnick;
+
+ /* these are used to generate the final string that is passed to ircservices' core */
+ int nlen = 0;
+ char nicklist[514];
+
+ /* temporary buffer */
+ char prefixandnick[60];
+
+ *nicklist = '\0';
+ *prefixandnick = '\0';
+
+ if (ac < 3)
+ return MOD_CONT;
+
+ curnick = myStrGetToken(av[2], ' ', curtoken);
+ while (curnick != NULL) {
+ for (; *curnick; curnick++) {
+ /* I bet theres a better way to do this... */
+ if ((*curnick == '&') ||
+ (*curnick == '~') || (*curnick == '@') || (*curnick == '%')
+ || (*curnick == '+')) {
+ prefixandnick[nlen++] = *curnick;
+ continue;
+ } else {
+ if (*curnick == ',') {
+ curnick++;
+ strncpy(prefixandnick + nlen, curnick,
+ sizeof(prefixandnick) - nlen);
+ break;
+ } else {
+ alog("fjoin: unrecognised prefix: %c", *curnick);
+ }
+ }
+ }
+ strncat(nicklist, prefixandnick, 513);
+ strncat(nicklist, " ", 513);
+ curtoken++;
+ curnick = myStrGetToken(av[2], ' ', curtoken);
+ nlen = 0;
+ }
+
+ newav[0] = av[1]; /* timestamp */
+ newav[1] = av[0]; /* channel name */
+ newav[2] = "+"; /* channel modes */
+ newav[3] = nicklist;
+ do_sjoin(source, 4, newav);
+
+ return MOD_CONT;
+}
+
+void
+inspircd_cmd_bot_nick(char *nick, char *user, char *host, char *real,
+ char *modes)
+{
+ send_cmd(ServerName, "NICK %ld %s %s %s %s +%s 0.0.0.0 :%s",
+ (long int) time(NULL), nick, host, host, user, modes, real);
+ send_cmd(nick, "OPERTYPE Bot");
+}
+
+void inspircd_cmd_kick(char *source, char *chan, char *user, char *buf)
+{
+ if (buf) {
+ send_cmd(source, "KICK %s %s :%s", chan, user, buf);
+ } else {
+ send_cmd(source, "KICK %s %s :%s", chan, user, user);
+ }
+}
+
+void inspircd_cmd_notice_ops(char *source, char *dest, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "NOTICE @%s :%s", dest, buf);
+}
+
+
+void inspircd_cmd_notice(char *source, char *dest, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ if (NSDefFlags & NI_MSG) {
+ inspircd_cmd_privmsg2(source, dest, buf);
+ } else {
+ send_cmd(source, "NOTICE %s :%s", dest, buf);
+ }
+}
+
+void inspircd_cmd_notice2(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "NOTICE %s :%s", dest, msg);
+}
+
+void inspircd_cmd_privmsg(char *source, char *dest, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(source, "PRIVMSG %s :%s", dest, buf);
+}
+
+void inspircd_cmd_privmsg2(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "PRIVMSG %s :%s", dest, msg);
+}
+
+void inspircd_cmd_serv_notice(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "NOTICE $%s :%s", dest, msg);
+}
+
+void inspircd_cmd_serv_privmsg(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "PRIVMSG $%s :%s", dest, msg);
+}
+
+
+void inspircd_cmd_bot_chan_mode(char *nick, char *chan)
+{
+ anope_cmd_mode(nick, chan, "%s %s %s", ircd->botchanumode, nick, nick);
+}
+
+void inspircd_cmd_351(char *source)
+{
+ send_cmd(ServerName, "351 %s Anope-%s %s :%s - %s (%s) -- %s",
+ source, version_number, ServerName, ircd->name, version_flags,
+ EncModule, version_build);
+}
+
+/* QUIT */
+void inspircd_cmd_quit(char *source, char *buf)
+{
+ if (buf) {
+ send_cmd(source, "QUIT :%s", buf);
+ } else {
+ send_cmd(source, "QUIT :Exiting");
+ }
+}
+
+/* PROTOCTL */
+void inspircd_cmd_protoctl()
+{
+}
+
+static char currentpass[1024];
+
+/* PASS */
+void inspircd_cmd_pass(char *pass)
+{
+ strncpy(currentpass, pass, 1024);
+}
+
+/* SERVER services-dev.chatspike.net password 0 :Description here */
+void inspircd_cmd_server(char *servname, int hop, char *descript)
+{
+ send_cmd(ServerName, "SERVER %s %s %d :%s", servname, currentpass, hop,
+ descript);
+}
+
+/* PONG */
+void inspircd_cmd_pong(char *servname, char *who)
+{
+ send_cmd(servname, "PONG %s", who);
+}
+
+/* JOIN */
+void inspircd_cmd_join(char *user, char *channel, time_t chantime)
+{
+ send_cmd(user, "JOIN %s", channel);
+}
+
+/* UNSQLINE */
+void inspircd_cmd_unsqline(char *user)
+{
+ if (!user) {
+ return;
+ }
+ send_cmd(s_OperServ, "QLINE %s", user);
+}
+
+/* CHGHOST */
+void inspircd_cmd_chghost(char *nick, char *vhost)
+{
+ if (has_chghostmod == 1) {
+ if (!nick || !vhost) {
+ return;
+ }
+ send_cmd(s_OperServ, "CHGHOST %s %s", nick, vhost);
+ } else {
+ anope_cmd_global(s_OperServ, "CHGHOST not loaded!");
+ }
+}
+
+/* CHGIDENT */
+void inspircd_cmd_chgident(char *nick, char *vIdent)
+{
+ if (has_chgidentmod == 1) {
+ if (!nick || !vIdent || !*vIdent) {
+ return;
+ }
+ send_cmd(s_OperServ, "CHGIDENT %s %s", nick, vIdent);
+ } else {
+ anope_cmd_global(s_OperServ, "CHGIDENT not loaded!");
+ }
+}
+
+/* INVITE */
+void inspircd_cmd_invite(char *source, char *chan, char *nick)
+{
+ if (!source || !chan || !nick) {
+ return;
+ }
+
+ send_cmd(source, "INVITE %s %s", nick, chan);
+}
+
+/* PART */
+void inspircd_cmd_part(char *nick, char *chan, char *buf)
+{
+ if (!nick || !chan) {
+ return;
+ }
+
+ if (buf) {
+ send_cmd(nick, "PART %s :%s", chan, buf);
+ } else {
+ send_cmd(nick, "PART %s :Leaving", chan);
+ }
+}
+
+/* 391 */
+void inspircd_cmd_391(char *source, char *timestr)
+{
+ if (!timestr) {
+ return;
+ }
+ send_cmd(NULL, "391 :%s %s :%s", source, ServerName, timestr);
+}
+
+/* 250 */
+void inspircd_cmd_250(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "250 %s", buf);
+}
+
+/* 307 */
+void inspircd_cmd_307(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "307 %s", buf);
+}
+
+/* 311 */
+void inspircd_cmd_311(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "311 %s", buf);
+}
+
+/* 312 */
+void inspircd_cmd_312(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "312 %s", buf);
+}
+
+/* 317 */
+void inspircd_cmd_317(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "317 %s", buf);
+}
+
+/* 219 */
+void inspircd_cmd_219(char *source, char *letter)
+{
+ if (!source) {
+ return;
+ }
+
+ if (letter) {
+ send_cmd(NULL, "219 %s %c :End of /STATS report.", source,
+ *letter);
+ } else {
+ send_cmd(NULL, "219 %s l :End of /STATS report.", source);
+ }
+}
+
+/* 401 */
+void inspircd_cmd_401(char *source, char *who)
+{
+ if (!source || !who) {
+ return;
+ }
+ send_cmd(ServerName, "401 %s %s :No such service.", source, who);
+}
+
+/* 318 */
+void inspircd_cmd_318(char *source, char *who)
+{
+ if (!source || !who) {
+ return;
+ }
+
+ send_cmd(ServerName, "318 %s %s :End of /WHOIS list.", source, who);
+}
+
+/* 242 */
+void inspircd_cmd_242(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "242 %s", buf);
+}
+
+/* 243 */
+void inspircd_cmd_243(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "243 %s", buf);
+}
+
+/* 211 */
+void inspircd_cmd_211(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "211 %s", buf);
+}
+
+/* GLOBOPS */
+void inspircd_cmd_global(char *source, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(source ? source : ServerName, "GLOBOPS :%s", buf);
+}
+
+/* SQLINE */
+void inspircd_cmd_sqline(char *mask, char *reason)
+{
+ if (!mask || !reason) {
+ return;
+ }
+
+ send_cmd(ServerName, "ADDLINE Q %s %s %ld 0 :%s", mask, s_OperServ,
+ (long int) time(NULL), reason);
+}
+
+/* SQUIT */
+void inspircd_cmd_squit(char *servname, char *message)
+{
+ if (!servname || !message) {
+ return;
+ }
+
+ send_cmd(ServerName, "SQUIT %s :%s", servname, message);
+}
+
+/* SVSO */
+void inspircd_cmd_svso(char *source, char *nick, char *flag)
+{
+}
+
+/* NICK <newnick> */
+void inspircd_cmd_chg_nick(char *oldnick, char *newnick)
+{
+ if (!oldnick || !newnick) {
+ return;
+ }
+
+ send_cmd(oldnick, "NICK %s", newnick);
+}
+
+/* SVSNICK */
+void inspircd_cmd_svsnick(char *source, char *guest, time_t when)
+{
+ if (!source || !guest) {
+ return;
+ }
+ /* Please note that inspircd will now echo back a nickchange for this SVSNICK */
+ send_cmd(ServerName, "SVSNICK %s %s :%lu", source, guest,
+ (unsigned long) when);
+}
+
+/* Functions that use serval cmd functions */
+
+void inspircd_cmd_vhost_on(char *nick, char *vIdent, char *vhost)
+{
+ if (!nick) {
+ return;
+ }
+ if (vIdent) {
+ inspircd_cmd_chgident(nick, vIdent);
+ }
+ inspircd_cmd_chghost(nick, vhost);
+}
+
+void inspircd_cmd_connect(int servernum)
+{
+ if (servernum == 1) {
+ inspircd_cmd_pass(RemotePassword);
+ }
+ if (servernum == 2) {
+ inspircd_cmd_pass(RemotePassword2);
+ }
+ if (servernum == 3) {
+ inspircd_cmd_pass(RemotePassword3);
+ }
+ inspircd_cmd_server(ServerName, 0, ServerDesc);
+ send_cmd(NULL, "BURST");
+ send_cmd(ServerName, "VERSION :Anope-%s %s :%s - %s (%s) -- %s",
+ version_number, ServerName, ircd->name, version_flags,
+ EncModule, version_build);
+
+ me_server =
+ new_server(NULL, ServerName, ServerDesc, SERVER_ISME, NULL);
+}
+
+/* Events */
+
+int anope_event_ping(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+ /* ((ac > 1) ? av[1] : ServerName) */
+ inspircd_cmd_pong(ServerName, av[0]);
+ return MOD_CONT;
+}
+
+int anope_event_436(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+
+ m_nickcoll(av[0]);
+ return MOD_CONT;
+}
+
+int anope_event_away(char *source, int ac, char **av)
+{
+ if (!source) {
+ return MOD_CONT;
+ }
+ m_away(source, (ac ? av[0] : NULL));
+ return MOD_CONT;
+}
+
+/* Taken from hybrid.c, topic syntax is identical */
+
+int anope_event_topic(char *source, int ac, char **av)
+{
+ Channel *c = findchan(av[0]);
+ time_t topic_time = time(NULL);
+
+ if (!c) {
+ if (debug) {
+ alog("debug: 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]);
+
+ if (ac > 1 && *av[1])
+ send_event(EVENT_TOPIC_UPDATED, 2, av[0], av[1]);
+ else
+ send_event(EVENT_TOPIC_UPDATED, 2, av[0], "");
+
+ return MOD_CONT;
+}
+
+int anope_event_squit(char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+ do_squit(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_rsquit(char *source, int ac, char **av)
+{
+ if (ac < 1 || ac > 3)
+ return MOD_CONT;
+
+ /* Horrible workaround to an insp bug (#) in how RSQUITs are sent - mark */
+ if (ac > 1 && strcmp(ServerName, av[0]) == 0)
+ do_squit(source, ac - 1, av + 1);
+ else
+ do_squit(source, ac, av);
+
+ return MOD_CONT;
+}
+
+int anope_event_quit(char *source, int ac, char **av)
+{
+ if (ac != 1)
+ return MOD_CONT;
+ do_quit(source, ac, av);
+ return MOD_CONT;
+}
+
+
+int anope_event_mode(char *source, int ac, char **av)
+{
+ if (ac < 2)
+ return MOD_CONT;
+
+ if (*av[0] == '#' || *av[0] == '&') {
+ do_cmode(source, ac, av);
+ } else {
+ /* InspIRCd lets opers change another
+ users modes, we have to kludge this
+ as it slightly breaks RFC1459
+ */
+ if (!strcasecmp(source, av[0])) {
+ do_umode(source, ac, av);
+ } else {
+ do_umode(av[0], ac, av);
+ }
+ }
+ return MOD_CONT;
+}
+
+
+int anope_event_kill(char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+
+ m_kill(av[0], av[1]);
+ return MOD_CONT;
+}
+
+int anope_event_kick(char *source, int ac, char **av)
+{
+ if (ac != 3)
+ return MOD_CONT;
+ do_kick(source, ac, av);
+ return MOD_CONT;
+}
+
+
+int anope_event_join(char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+ do_join(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_motd(char *source, int ac, char **av)
+{
+ if (!source) {
+ return MOD_CONT;
+ }
+
+ m_motd(source);
+ return MOD_CONT;
+}
+
+int anope_event_setname(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 1)
+ return MOD_CONT;
+
+ u = finduser(source);
+ if (!u) {
+ if (debug) {
+ alog("debug: SETNAME for nonexistent user %s", source);
+ }
+ return MOD_CONT;
+ }
+
+ change_user_realname(u, av[0]);
+ return MOD_CONT;
+}
+
+int anope_event_chgname(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 2)
+ return MOD_CONT;
+
+ u = finduser(source);
+ if (!u) {
+ if (debug) {
+ alog("debug: FNAME for nonexistent user %s", source);
+ }
+ return MOD_CONT;
+ }
+
+ change_user_realname(u, av[0]);
+ return MOD_CONT;
+}
+
+int anope_event_setident(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 1)
+ return MOD_CONT;
+
+ u = finduser(source);
+ if (!u) {
+ if (debug) {
+ alog("debug: SETIDENT for nonexistent user %s", source);
+ }
+ return MOD_CONT;
+ }
+
+ change_user_username(u, av[0]);
+ return MOD_CONT;
+}
+
+int anope_event_chgident(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 2)
+ return MOD_CONT;
+
+ u = finduser(av[0]);
+ if (!u) {
+ if (debug) {
+ alog("debug: CHGIDENT for nonexistent user %s", av[0]);
+ }
+ return MOD_CONT;
+ }
+
+ change_user_username(u, av[1]);
+ return MOD_CONT;
+}
+
+int anope_event_sethost(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 1)
+ return MOD_CONT;
+
+ u = finduser(source);
+ if (!u) {
+ if (debug) {
+ alog("debug: SETHOST for nonexistent user %s", source);
+ }
+ return MOD_CONT;
+ }
+
+ change_user_host(u, av[0]);
+ return MOD_CONT;
+}
+
+
+int anope_event_nick(char *source, int ac, char **av)
+{
+ User *user;
+ struct in_addr addy;
+ uint32 *ad = (uint32 *) & addy;
+
+ if (ac != 1) {
+ if (ac == 8) {
+ int svid = 0;
+ int ts = strtoul(av[0], NULL, 10);
+
+ if (strchr(av[5], 'r') != NULL)
+ svid = ts;
+
+ inet_aton(av[6], &addy);
+ user = do_nick("", av[1], /* nick */
+ av[4], /* username */
+ av[2], /* realhost */
+ source, /* server */
+ av[7], /* realname */
+ ts, svid, htonl(*ad), av[3], NULL);
+ if (user)
+ anope_set_umode(user, 1, &av[5]);
+ }
+ } else {
+ do_nick(source, av[0], NULL, NULL, NULL, NULL, 0, 0, 0, NULL,
+ NULL);
+ }
+ return MOD_CONT;
+}
+
+
+int anope_event_chghost(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 1)
+ return MOD_CONT;
+
+ u = finduser(source);
+ if (!u) {
+ if (debug) {
+ alog("debug: FHOST for nonexistent user %s", source);
+ }
+ return MOD_CONT;
+ }
+
+ change_user_host(u, av[0]);
+ return MOD_CONT;
+}
+
+/* EVENT: SERVER */
+int anope_event_server(char *source, int ac, char **av)
+{
+ if (!stricmp(av[1], "1")) {
+ uplink = sstrdup(av[0]);
+ }
+ do_server(source, av[0], av[1], av[2], NULL);
+ return MOD_CONT;
+}
+
+
+int anope_event_privmsg(char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+ m_privmsg(source, av[0], av[1]);
+ return MOD_CONT;
+}
+
+int anope_event_part(char *source, int ac, char **av)
+{
+ if (ac < 1 || ac > 2)
+ return MOD_CONT;
+ do_part(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_whois(char *source, int ac, char **av)
+{
+ if (source && ac >= 1) {
+ m_whois(source, av[0]);
+ }
+ return MOD_CONT;
+}
+
+int anope_event_capab(char *source, int ac, char **av)
+{
+ int argc;
+ char **argv;
+ CBModeInfo *cbmi;
+
+ if (strcasecmp(av[0], "START") == 0) {
+ /* reset CAPAB */
+ has_servicesmod = 0;
+ has_globopsmod = 0;
+ has_svsholdmod = 0;
+ has_chghostmod = 0;
+ has_chgidentmod = 0;
+
+ } else if (strcasecmp(av[0], "MODULES") == 0) {
+ if (strstr(av[1], "m_globops.so")) {
+ has_globopsmod = 1;
+ }
+ if (strstr(av[1], "m_services.so")) {
+ has_servicesmod = 1;
+ }
+ if (strstr(av[1], "m_svshold.so")) {
+ has_svsholdmod = 1;
+ }
+ if (strstr(av[1], "m_chghost.so")) {
+ has_chghostmod = 1;
+ }
+ if (strstr(av[1], "m_chgident.so")) {
+ has_chgidentmod = 1;
+ }
+ if (strstr(av[1], "m_messageflood.so")) {
+ has_messagefloodmod = 1;
+ }
+ if (strstr(av[1], "m_banexception.so")) {
+ has_banexceptionmod = 1;
+ }
+ if (strstr(av[1], "m_inviteexception.so")) {
+ has_inviteexceptionmod = 1;
+ }
+ } else if (strcasecmp(av[0], "END") == 0) {
+ if (!has_globopsmod) {
+ send_cmd(NULL,
+ "ERROR :m_globops is not loaded. This is required by Anope");
+ quitmsg = "Remote server does not have the m_globops module loaded, and this is required.";
+ quitting = 1;
+ return MOD_STOP;
+ }
+ if (!has_servicesmod) {
+ send_cmd(NULL,
+ "ERROR :m_services is not loaded. This is required by Anope");
+ quitmsg = "Remote server does not have the m_services module loaded, and this is required.";
+ quitting = 1;
+ return MOD_STOP;
+ }
+ if (!has_svsholdmod) {
+ anope_cmd_global(s_OperServ, "SVSHOLD missing, Usage disabled until module is loaded.");
+ }
+ if (!has_chghostmod) {
+ anope_cmd_global(s_OperServ, "CHGHOST missing, Usage disabled until module is loaded.");
+ }
+ if (!has_chgidentmod) {
+ anope_cmd_global(s_OperServ, "CHGIDENT missing, Usage disabled until module is loaded.");
+ }
+ if (has_messagefloodmod) {
+ cbmi = myCbmodeinfos;
+
+ /* Find 'f' in myCbmodeinfos and add the relevant bits to myCbmodes and myCbmodeinfos
+ * to enable +f support if found. This is needed because we're really not set up to
+ * handle modular ircds which can have modes enabled/disabled as they please :( - mark
+ */
+ while ((cbmi->mode != 'f')) {
+ cbmi++;
+ }
+ if (cbmi) {
+ cbmi->getvalue = get_flood;
+ cbmi->csgetvalue = cs_get_flood;
+
+ myCbmodes['f'].flag = CMODE_f;
+ myCbmodes['f'].flags = 0;
+ myCbmodes['f'].setvalue = set_flood;
+ myCbmodes['f'].cssetvalue = cs_set_flood;
+
+ pmodule_ircd_cbmodeinfos(myCbmodeinfos);
+ pmodule_ircd_cbmodes(myCbmodes);
+
+ ircd->fmode = 1;
+ }
+ else {
+ alog("Support for channelmode +f can not be enabled");
+ if (debug) {
+ alog("debug: 'f' missing from myCbmodeinfos");
+ }
+ }
+ }
+ if (has_banexceptionmod) {
+ myCmmodes['e'].addmask = add_exception;
+ myCmmodes['e'].delmask = del_exception;
+ ircd->except = 1;
+ }
+ if (has_inviteexceptionmod) {
+ myCmmodes['I'].addmask = add_invite;
+ myCmmodes['I'].delmask = del_invite;
+ ircd->invitemode = 1;
+ }
+ ircd->svshold = has_svsholdmod;
+
+ if (has_banexceptionmod || has_inviteexceptionmod) {
+ pmodule_ircd_cmmodes(myCmmodes);
+ }
+
+ /* Generate a fake capabs parsing call so things like NOQUIT work
+ * fine. It's ugly, but it works....
+ */
+ argc = 6;
+ argv = scalloc(argc, sizeof(char *));
+ argv[0] = "NOQUIT";
+ argv[1] = "SSJ3";
+ argv[2] = "NICK2";
+ argv[3] = "VL";
+ argv[4] = "TLKEXT";
+ argv[5] = "UNCONNECT";
+
+ capab_parse(argc, argv);
+ }
+ return MOD_CONT;
+}
+
+/* SVSHOLD - set */
+void inspircd_cmd_svshold(char *nick)
+{
+ send_cmd(s_OperServ, "SVSHOLD %s %ds :%s", nick, NSReleaseTimeout,
+ "Being held for registered user");
+}
+
+/* SVSHOLD - release */
+void inspircd_cmd_release_svshold(char *nick)
+{
+ send_cmd(s_OperServ, "SVSHOLD %s", nick);
+}
+
+/* UNSGLINE */
+void inspircd_cmd_unsgline(char *mask)
+{
+ /* Not Supported by this IRCD */
+}
+
+/* UNSZLINE */
+void inspircd_cmd_unszline(char *mask)
+{
+ send_cmd(s_OperServ, "ZLINE %s", mask);
+}
+
+/* SZLINE */
+void inspircd_cmd_szline(char *mask, char *reason, char *whom)
+{
+ send_cmd(ServerName, "ADDLINE Z %s %s %ld 0 :%s", mask, whom,
+ (long int) time(NULL), reason);
+}
+
+/* SGLINE */
+void inspircd_cmd_sgline(char *mask, char *reason)
+{
+ /* Not Supported by this IRCD */
+}
+
+void inspircd_cmd_unban(char *name, char *nick)
+{
+ /* Not Supported by this IRCD */
+}
+
+/* SVSMODE channel modes */
+
+void inspircd_cmd_svsmode_chan(char *name, char *mode, char *nick)
+{
+ /* Not Supported by this IRCD */
+}
+
+
+/* SVSMODE +d */
+/* sent if svid is something weird */
+void inspircd_cmd_svid_umode(char *nick, time_t ts)
+{
+ if (debug)
+ alog("debug: common_svsmode(0)");
+}
+
+/* SVSMODE +d */
+/* nc_change was = 1, and there is no na->status */
+void inspircd_cmd_nc_change(User * u)
+{
+ if (debug)
+ alog("debug: common_svsmode(1)");
+ common_svsmode(u, "-r", NULL);
+}
+
+/* SVSMODE +r */
+void inspircd_cmd_svid_umode2(User * u, char *ts)
+{
+ if (debug)
+ alog("debug: common_svsmode(2)");
+ common_svsmode(u, "+r", NULL);
+}
+
+void inspircd_cmd_svid_umode3(User * u, char *ts)
+{
+ /* not used */
+}
+
+void inspircd_cmd_svsjoin(char *source, char *nick, char *chan, char *param)
+{
+ send_cmd(source, "SVSJOIN %s %s", nick, chan);
+}
+
+void inspircd_cmd_svspart(char *source, char *nick, char *chan)
+{
+ send_cmd(source, "SVSPART %s %s", nick, chan);
+}
+
+void inspircd_cmd_swhois(char *source, char *who, char *mask)
+{
+ /* Not used currently */
+}
+
+void inspircd_cmd_eob()
+{
+ send_cmd(NULL, "ENDBURST");
+}
+
+
+int anope_event_rehash(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_credits(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_admin(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int inspircd_flood_mode_check(char *value)
+{
+ char *dp, *end;
+
+ if (value && *value != ':'
+ && (strtoul((*value == '*' ? value + 1 : value), &dp, 10) > 0)
+ && (*dp == ':') && (*(++dp) != 0) && (strtoul(dp, &end, 10) > 0)
+ && (*end == 0)) {
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
+void inspircd_cmd_jupe(char *jserver, char *who, char *reason)
+{
+ char rbuf[256];
+
+ snprintf(rbuf, sizeof(rbuf), "Juped by %s%s%s", who,
+ reason ? ": " : "", reason ? reason : "");
+
+ if (findserver(servlist, jserver))
+ inspircd_cmd_squit(jserver, rbuf);
+ inspircd_cmd_server(jserver, 1, rbuf);
+ new_server(me_server, jserver, rbuf, SERVER_JUPED, NULL);
+}
+
+/* GLOBOPS - to handle old WALLOPS */
+void inspircd_cmd_global_legacy(char *source, char *fmt)
+{
+ send_cmd(source ? source : s_OperServ, "GLOBOPS :%s", fmt);
+}
+
+int inspircd_valid_nick(char *nick)
+{
+ return 1;
+}
+
+int inspircd_valid_chan(char *chan)
+{
+ return 1;
+}
+
+
+void inspircd_cmd_ctcp(char *source, char *dest, char *buf)
+{
+ char *s;
+
+ if (!buf) {
+ return;
+ } else {
+ s = normalizeBuffer(buf);
+ }
+
+ send_cmd(source, "NOTICE %s :\1%s\1", dest, s);
+ free(s);
+}
+
+
+/**
+ * Tell anope which function we want to perform each task inside of anope.
+ * These prototypes must match what anope expects.
+ **/
+void moduleAddAnopeCmds()
+{
+ pmodule_cmd_svsnoop(inspircd_cmd_svsnoop);
+ pmodule_cmd_remove_akill(inspircd_cmd_remove_akill);
+ pmodule_cmd_topic(inspircd_cmd_topic);
+ pmodule_cmd_vhost_off(inspircd_cmd_vhost_off);
+ pmodule_cmd_akill(inspircd_cmd_akill);
+ pmodule_cmd_svskill(inspircd_cmd_svskill);
+ pmodule_cmd_svsmode(inspircd_cmd_svsmode);
+ pmodule_cmd_372(inspircd_cmd_372);
+ pmodule_cmd_372_error(inspircd_cmd_372_error);
+ pmodule_cmd_375(inspircd_cmd_375);
+ pmodule_cmd_376(inspircd_cmd_376);
+ pmodule_cmd_nick(inspircd_cmd_nick);
+ pmodule_cmd_guest_nick(inspircd_cmd_guest_nick);
+ pmodule_cmd_mode(inspircd_cmd_mode);
+ pmodule_cmd_bot_nick(inspircd_cmd_bot_nick);
+ pmodule_cmd_kick(inspircd_cmd_kick);
+ pmodule_cmd_notice_ops(inspircd_cmd_notice_ops);
+ pmodule_cmd_notice(inspircd_cmd_notice);
+ pmodule_cmd_notice2(inspircd_cmd_notice2);
+ pmodule_cmd_privmsg(inspircd_cmd_privmsg);
+ pmodule_cmd_privmsg2(inspircd_cmd_privmsg2);
+ pmodule_cmd_serv_notice(inspircd_cmd_serv_notice);
+ pmodule_cmd_serv_privmsg(inspircd_cmd_serv_privmsg);
+ pmodule_cmd_bot_chan_mode(inspircd_cmd_bot_chan_mode);
+ pmodule_cmd_351(inspircd_cmd_351);
+ pmodule_cmd_quit(inspircd_cmd_quit);
+ pmodule_cmd_pong(inspircd_cmd_pong);
+ pmodule_cmd_join(inspircd_cmd_join);
+ pmodule_cmd_unsqline(inspircd_cmd_unsqline);
+ pmodule_cmd_invite(inspircd_cmd_invite);
+ pmodule_cmd_part(inspircd_cmd_part);
+ pmodule_cmd_391(inspircd_cmd_391);
+ pmodule_cmd_250(inspircd_cmd_250);
+ pmodule_cmd_307(inspircd_cmd_307);
+ pmodule_cmd_311(inspircd_cmd_311);
+ pmodule_cmd_312(inspircd_cmd_312);
+ pmodule_cmd_317(inspircd_cmd_317);
+ pmodule_cmd_219(inspircd_cmd_219);
+ pmodule_cmd_401(inspircd_cmd_401);
+ pmodule_cmd_318(inspircd_cmd_318);
+ pmodule_cmd_242(inspircd_cmd_242);
+ pmodule_cmd_243(inspircd_cmd_243);
+ pmodule_cmd_211(inspircd_cmd_211);
+ pmodule_cmd_global(inspircd_cmd_global);
+ pmodule_cmd_global_legacy(inspircd_cmd_global_legacy);
+ pmodule_cmd_sqline(inspircd_cmd_sqline);
+ pmodule_cmd_squit(inspircd_cmd_squit);
+ pmodule_cmd_svso(inspircd_cmd_svso);
+ pmodule_cmd_chg_nick(inspircd_cmd_chg_nick);
+ pmodule_cmd_svsnick(inspircd_cmd_svsnick);
+ pmodule_cmd_vhost_on(inspircd_cmd_vhost_on);
+ pmodule_cmd_connect(inspircd_cmd_connect);
+ pmodule_cmd_svshold(inspircd_cmd_svshold);
+ pmodule_cmd_release_svshold(inspircd_cmd_release_svshold);
+ pmodule_cmd_unsgline(inspircd_cmd_unsqline);
+ pmodule_cmd_unszline(inspircd_cmd_unszline);
+ pmodule_cmd_szline(inspircd_cmd_szline);
+ pmodule_cmd_sgline(inspircd_cmd_sgline);
+ pmodule_cmd_unban(inspircd_cmd_unban);
+ pmodule_cmd_svsmode_chan(inspircd_cmd_svsmode_chan);
+ pmodule_cmd_svid_umode(inspircd_cmd_svid_umode);
+ pmodule_cmd_nc_change(inspircd_cmd_nc_change);
+ pmodule_cmd_svid_umode2(inspircd_cmd_svid_umode2);
+ pmodule_cmd_svid_umode3(inspircd_cmd_svid_umode3);
+ pmodule_cmd_svsjoin(inspircd_cmd_svsjoin);
+ pmodule_cmd_svspart(inspircd_cmd_svspart);
+ pmodule_cmd_swhois(inspircd_cmd_swhois);
+ pmodule_cmd_eob(inspircd_cmd_eob);
+ pmodule_flood_mode_check(inspircd_flood_mode_check);
+ pmodule_cmd_jupe(inspircd_cmd_jupe);
+ pmodule_valid_nick(inspircd_valid_nick);
+ pmodule_valid_chan(inspircd_valid_chan);
+ pmodule_cmd_ctcp(inspircd_cmd_ctcp);
+ pmodule_set_umode(inspircd_set_umode);
+}
+
+/**
+ * Now tell anope how to use us.
+ **/
+int AnopeInit(int argc, char **argv)
+{
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion
+ ("$Id$");
+ moduleSetType(PROTOCOL);
+
+ pmodule_ircd_version("inspircdIRCd 1.1");
+ pmodule_ircd_cap(myIrcdcap);
+ pmodule_ircd_var(myIrcd);
+ pmodule_ircd_cbmodeinfos(myCbmodeinfos);
+ pmodule_ircd_cumodes(myCumodes);
+ pmodule_ircd_flood_mode_char_set("+f");
+ pmodule_ircd_flood_mode_char_remove("-f");
+ pmodule_ircd_cbmodes(myCbmodes);
+ pmodule_ircd_cmmodes(myCmmodes);
+ pmodule_ircd_csmodes(myCsmodes);
+ pmodule_ircd_useTSMode(0);
+
+ /** Deal with modes anope _needs_ to know **/
+ pmodule_invis_umode(UMODE_i);
+ pmodule_oper_umode(UMODE_o);
+ pmodule_invite_cmode(CMODE_i);
+ pmodule_secret_cmode(CMODE_s);
+ pmodule_private_cmode(CMODE_p);
+ pmodule_key_mode(CMODE_k);
+ pmodule_limit_mode(CMODE_l);
+
+ moduleAddAnopeCmds();
+ moduleAddIRCDMsgs();
+
+ return MOD_CONT;
+}
+
diff --git a/src/protocol/inspircd11.h b/src/protocol/inspircd11.h
new file mode 100755
index 000000000..d079b2c97
--- /dev/null
+++ b/src/protocol/inspircd11.h
@@ -0,0 +1,134 @@
+/* inspircd beta 6 functions
+ *
+ * (C) 2003-2008 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.
+ *
+ *
+ */
+
+/*************************************************************************/
+
+#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
+#define UMODE_g 0x80000000
+#define UMODE_x 0x40000000
+
+#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
+#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
+#define CMODE_R 0x00000100 /* Only identified users can join */
+#define CMODE_r 0x00000200 /* Set for all registered channels */
+
+#define DEFAULT_MLOCK CMODE_n | CMODE_t | CMODE_r
+
+void inspircd_set_umode(User * user, int ac, char **av);
+void inspircd_cmd_svsnoop(char *server, int set);
+void inspircd_cmd_remove_akill(char *user, char *host);
+void inspircd_cmd_topic(char *whosets, char *chan, char *whosetit, char *topic, time_t when);
+void inspircd_cmd_vhost_off(User * u);
+void inspircd_cmd_akill(char *user, char *host, char *who, time_t when,time_t expires, char *reason);
+void inspircd_cmd_svskill(char *source, char *user, char *buf);
+void inspircd_cmd_svsmode(User * u, int ac, char **av);
+void inspircd_cmd_372(char *source, char *msg);
+void inspircd_cmd_372_error(char *source);
+void inspircd_cmd_375(char *source);
+void inspircd_cmd_376(char *source);
+void inspircd_cmd_nick(char *nick, char *name, char *modes);
+void inspircd_cmd_guest_nick(char *nick, char *user, char *host, char *real, char *modes);
+void inspircd_cmd_mode(char *source, char *dest, char *buf);
+void inspircd_cmd_bot_nick(char *nick, char *user, char *host, char *real, char *modes);
+void inspircd_cmd_kick(char *source, char *chan, char *user, char *buf);
+void inspircd_cmd_notice_ops(char *source, char *dest, char *buf);
+void inspircd_cmd_notice(char *source, char *dest, char *buf);
+void inspircd_cmd_notice2(char *source, char *dest, char *msg);
+void inspircd_cmd_privmsg(char *source, char *dest, char *buf);
+void inspircd_cmd_privmsg2(char *source, char *dest, char *msg);
+void inspircd_cmd_serv_notice(char *source, char *dest, char *msg);
+void inspircd_cmd_serv_privmsg(char *source, char *dest, char *msg);
+void inspircd_cmd_bot_chan_mode(char *nick, char *chan);
+void inspircd_cmd_351(char *source);
+void inspircd_cmd_quit(char *source, char *buf);
+void inspircd_cmd_pong(char *servname, char *who);
+void inspircd_cmd_join(char *user, char *channel, time_t chantime);
+void inspircd_cmd_unsqline(char *user);
+void inspircd_cmd_invite(char *source, char *chan, char *nick);
+void inspircd_cmd_part(char *nick, char *chan, char *buf);
+void inspircd_cmd_391(char *source, char *timestr);
+void inspircd_cmd_250(char *buf);
+void inspircd_cmd_307(char *buf);
+void inspircd_cmd_311(char *buf);
+void inspircd_cmd_312(char *buf);
+void inspircd_cmd_317(char *buf);
+void inspircd_cmd_219(char *source, char *letter);
+void inspircd_cmd_401(char *source, char *who);
+void inspircd_cmd_318(char *source, char *who);
+void inspircd_cmd_242(char *buf);
+void inspircd_cmd_243(char *buf);
+void inspircd_cmd_211(char *buf);
+void inspircd_cmd_global(char *source, char *buf);
+void inspircd_cmd_global_legacy(char *source, char *fmt);
+void inspircd_cmd_sqline(char *mask, char *reason);
+void inspircd_cmd_squit(char *servname, char *message);
+void inspircd_cmd_svso(char *source, char *nick, char *flag);
+void inspircd_cmd_chg_nick(char *oldnick, char *newnick);
+void inspircd_cmd_svsnick(char *source, char *guest, time_t when);
+void inspircd_cmd_vhost_on(char *nick, char *vIdent, char *vhost);
+void inspircd_cmd_connect(int servernum);
+void inspircd_cmd_svshold(char *nick);
+void inspircd_cmd_release_svshold(char *nick);
+void inspircd_cmd_unsgline(char *mask);
+void inspircd_cmd_unszline(char *mask);
+void inspircd_cmd_szline(char *mask, char *reason, char *whom);
+void inspircd_cmd_sgline(char *mask, char *reason);
+void inspircd_cmd_unban(char *name, char *nick);
+void inspircd_cmd_svsmode_chan(char *name, char *mode, char *nick);
+void inspircd_cmd_svid_umode(char *nick, time_t ts);
+void inspircd_cmd_nc_change(User * u);
+void inspircd_cmd_svid_umode2(User * u, char *ts);
+void inspircd_cmd_svid_umode3(User * u, char *ts);
+void inspircd_cmd_eob();
+int inspircd_flood_mode_check(char *value);
+void inspircd_cmd_jupe(char *jserver, char *who, char *reason);
+int inspircd_valid_nick(char *nick);
+void inspircd_cmd_ctcp(char *source, char *dest, char *buf);
+int anope_event_fjoin(char *source, int ac, char **av);
+int anope_event_fmode(char *source, int ac, char **av);
+int anope_event_ftopic(char *source, int ac, char **av);
+int anope_event_sanick(char *source, int ac, char **av);
+int anope_event_samode(char *source, int ac, char **av);
+int anope_event_sajoin(char *source, int ac, char **av);
+int anope_event_sapart(char *source, int ac, char **av);
+int anope_event_version(char *source, int ac, char **av);
+int anope_event_opertype(char *source, int ac, char **av);
+int anope_event_idle(char* source, int ac, char **av);
+int anope_event_rsquit(char *source, int ac, char **av);
diff --git a/src/protocol/plexus2.c b/src/protocol/plexus2.c
new file mode 100644
index 000000000..0a91194f4
--- /dev/null
+++ b/src/protocol/plexus2.c
@@ -0,0 +1,1880 @@
+/* PlexusIRCD IRCD functions
+ *
+ * (C) 2003-2008 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.
+ */
+
+#include "services.h"
+#include "pseudo.h"
+#include "plexus2.h"
+
+IRCDVar myIrcd[] = {
+ {"PleXusIRCd 2.0+", /* ircd name */
+ "+oiSR", /* nickserv mode */
+ "+oiSR", /* chanserv mode */
+ "+oiSR", /* memoserv mode */
+ "+oiSR", /* hostserv mode */
+ "+oaiSR", /* operserv mode */
+ "+oiSR", /* botserv mode */
+ "+oiSR", /* helpserv mode */
+ "+oiSR", /* Dev/Null mode */
+ "+oiSR", /* Global mode */
+ "+oiSR", /* nickserv alias mode */
+ "+oiSR", /* chanserv alias mode */
+ "+oiSR", /* memoserv alias mode */
+ "+oiSR", /* hostserv alias mode */
+ "+oaiSR", /* operserv alias mode */
+ "+oiSR", /* botserv alias mode */
+ "+oiSR", /* helpserv alias mode */
+ "+oiSR", /* Dev/Null alias mode */
+ "+oiSR", /* Global alias mode */
+ "+iSR", /* Used by BotServ Bots */
+ 3, /* Chan Max Symbols */
+ "-acilmnpstMNORZ", /* Modes to Remove */
+ "+o", /* Channel Umode used by Botserv bots */
+ 1, /* SVSNICK */
+ 1, /* Vhost */
+ 0, /* Has Owner */
+ NULL, /* Mode to set for an owner */
+ NULL, /* Mode to unset for an owner */
+ NULL, /* Mode to set for chan admin */
+ NULL, /* Mode to unset for chan admin */
+ "+R", /* Mode On Reg */
+ NULL, /* Mode on ID for Roots */
+ NULL, /* Mode on ID for Admins */
+ NULL, /* Mode on ID for Opers */
+ "-R", /* Mode on UnReg */
+ "-R", /* Mode on Nick Change */
+ 1, /* Supports SGlines */
+ 1, /* Supports SQlines */
+ 0, /* Supports SZlines */
+ 1, /* Supports Halfop +h */
+ 3, /* Number of server args */
+ 0, /* Join 2 Set */
+ 0, /* Join 2 Message */
+ 1, /* Has exceptions +e */
+ 0, /* TS Topic Forward */
+ 0, /* TS Topci Backward */
+ 0, /* Protected Umode */
+ 0, /* Has Admin */
+ 1, /* Chan SQlines */
+ 0, /* Quit on Kill */
+ 0, /* SVSMODE unban */
+ 0, /* Has Protect */
+ 0, /* Reverse */
+ 0, /* Chan Reg */
+ 0, /* Channel Mode */
+ 0, /* vidents */
+ 0, /* svshold */
+ 1, /* time stamp on mode */
+ 0, /* NICKIP */
+ 0, /* O:LINE */
+ 1, /* UMODE */
+ 1, /* VHOST ON NICK */
+ 0, /* Change RealName */
+ CMODE_p, /* No Knock */
+ 0, /* Admin Only */
+ DEFAULT_MLOCK, /* Default MLOCK */
+ UMODE_h, /* Vhost Mode */
+ 0, /* +f */
+ 0, /* +L */
+ 0, /* +f Mode */
+ 0, /* +L Mode */
+ 0, /* On nick change check if they could be identified */
+ 0, /* No Knock requires +i */
+ NULL, /* CAPAB Chan Modes */
+ 0, /* We support TOKENS */
+ 1, /* TOKENS are CASE inSensitive */
+ 0, /* TIME STAMPS are BASE64 */
+ 1, /* +I support */
+ 0, /* SJOIN ban char */
+ 0, /* SJOIN except char */
+ 0, /* SJOIN invite char */
+ 0, /* Can remove User Channel Modes with SVSMODE */
+ 0, /* Sglines are not enforced until user reconnects */
+ "h", /* vhost char */
+ 0, /* ts6 */
+ 0, /* support helper umode */
+ 0, /* p10 */
+ NULL, /* character set */
+ 1, /* reports sync state */
+ 0, /* CIDR channelbans */
+ }
+ ,
+ {NULL}
+};
+
+IRCDCAPAB myIrcdcap[] = {
+ {
+ 0, /* NOQUIT */
+ 0, /* TSMODE */
+ 0, /* UNCONNECT */
+ 0, /* NICKIP */
+ 0, /* SJOIN */
+ CAPAB_ZIP, /* ZIP */
+ 0, /* BURST */
+ CAPAB_TS5, /* TS5 */
+ 0, /* TS3 */
+ 0, /* DKEY */
+ 0, /* PT4 */
+ 0, /* SCS */
+ CAPAB_QS, /* QS */
+ CAPAB_UID, /* UID */
+ CAPAB_KNOCK, /* KNOCK */
+ 0, /* CLIENT */
+ 0, /* IPV6 */
+ 0, /* SSJ5 */
+ 0, /* SN2 */
+ 0, /* TOKEN */
+ 0, /* VHOST */
+ 0, /* SSJ3 */
+ 0, /* NICK2 */
+ 0, /* UMODE2 */
+ 0, /* VL */
+ 0, /* TLKEXT */
+ 0, /* DODKEY */
+ 0, /* DOZIP */
+ 0, 0, 0}
+};
+
+
+
+void
+plexus_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)
+ {
+
+ /* This looks better, much better than "add ? (do_add) : (do_remove)".
+ * At least this is readable without paying much attention :) -GD
+ */
+ if (add)
+ user->mode |= umodes[(int) *modes];
+ else
+ user->mode &= ~umodes[(int) *modes];
+
+ switch (*modes++)
+ {
+ case '+':
+ add = 1;
+ break;
+ case '-':
+ add = 0;
+ break;
+ case 'h':
+ update_host (user);
+ break;
+ case 'o':
+ if (add)
+ {
+ opcnt++;
+
+ if (WallOper)
+ anope_cmd_global (s_OperServ,
+ "\2%s\2 is now an IRC operator.",
+ user->nick);
+ display_news (user, NEWS_OPER);
+
+ }
+ else
+ {
+ opcnt--;
+ }
+ break;
+ case 'R':
+ if (add && !nick_identified (user))
+ {
+ common_svsmode (user, "-R", NULL);
+ user->mode &= ~UMODE_R;
+ }
+ break;
+
+ }
+ }
+}
+
+/*
+ * Local valid_op, and valid_halfop overrides.
+ * These are nessecary due to the way hybrid-based ircds handle halfops.
+ * hybrid-based ircds treat a -o as a -h as well. So if a user is set -o,
+ * the ircd will also set them -h if they have that mode. This breaks
+ * is_valid_op, as it always sends a -o. Breaking up the routines corrects this problem. - ThaPrince
+ */
+
+int
+plexus_check_valid_halfop (User * user, Channel * chan, int servermode)
+{
+ if (!chan || !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_AUTOHALFOP))
+ {
+ notice_lang (s_ChanServ, user, CHAN_IS_REGISTERED, s_ChanServ);
+ anope_cmd_mode (whosends (chan->ci), chan->name, "-h %s", user->nick);
+ return 0;
+ }
+
+ if (check_access (user, chan->ci, CA_AUTODEOP))
+ {
+ anope_cmd_mode (whosends (chan->ci), chan->name, "-h %s", user->nick);
+ return 0;
+ }
+
+ return 1;
+}
+
+int
+plexus_check_valid_op (User * user, Channel * chan, int servermode)
+{
+ if (!chan || !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);
+ if (check_access (user, chan->ci, CA_AUTOHALFOP))
+ {
+ anope_cmd_mode (whosends (chan->ci), chan->name,
+ "-o+h %s %s", user->nick, user->nick);
+ }
+ else
+ {
+ anope_cmd_mode (whosends (chan->ci), chan->name, "-o %s",
+ user->nick);
+ }
+ return 0;
+ }
+
+ if (check_access (user, chan->ci, CA_AUTODEOP))
+ {
+ anope_cmd_mode (whosends (chan->ci), chan->name, "-o %s", user->nick);
+ return 0;
+ }
+
+ return 1;
+}
+
+unsigned long umodes[128] = {
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused, Unused, Horzontal Tab */
+ 0, 0, 0, /* Line Feed, Unused, Unused */
+ 0, 0, 0, /* Carriage Return, Unused, Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused, Unused, Space */
+ 0, 0, 0, /* ! " # */
+ 0, 0, 0, /* $ % & */
+ 0, 0, 0, /* ! ( ) */
+ 0, 0, 0, /* * + , */
+ 0, 0, 0, /* - . / */
+ 0, 0, /* 0 1 */
+ 0, 0, /* 2 3 */
+ 0, 0, /* 4 5 */
+ 0, 0, /* 6 7 */
+ 0, 0, /* 8 9 */
+ 0, 0, /* : ; */
+ 0, 0, 0, /* < = > */
+ 0, 0, /* ? @ */
+ 0, 0, 0, /* A B C */
+ 0, 0, 0, /* D E F */
+ 0, 0, 0, /* G H I */
+ 0, 0, 0, /* J K L */
+ 0, 0, 0, /* M N O */
+ 0, 0, UMODE_R, /* P Q R */
+ UMODE_S, 0, 0, /* S T U */
+ 0, 0, 0, /* V W X */
+ 0, /* Y */
+ 0, /* Z */
+ 0, 0, 0, /* [ \ ] */
+ 0, 0, 0, /* ^ _ ` */
+ UMODE_a, UMODE_b, 0, /* a b c */
+ UMODE_d, 0, 0, /* d e f */
+ 0, UMODE_h, UMODE_i, /* g h i */
+ 0, 0, UMODE_l, /* j k l */
+ UMODE_g, UMODE_n, UMODE_o, /* m n o */
+ 0, 0, 0, /* p q r */
+ 0, 0, UMODE_u, /* s t u */
+ 0, UMODE_w, UMODE_x, /* v w x */
+ 0, /* y */
+ 0, /* z */
+ 0, 0, 0, /* { | } */
+ 0, 0 /* ~ � */
+};
+
+
+char myCsmodes[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,
+ 'h',
+ 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
+};
+
+CMMode myCmmodes[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}, /* BCD */
+ {NULL}, {NULL}, {NULL}, /* EFG */
+ {NULL}, /* H */
+ {add_invite, del_invite},
+ {NULL}, /* J */
+ {NULL}, {NULL}, {NULL}, /* KLM */
+ {NULL}, {NULL}, {NULL}, /* NOP */
+ {NULL}, {NULL}, {NULL}, /* QRS */
+ {NULL}, {NULL}, {NULL}, /* TUV */
+ {NULL}, {NULL}, {NULL}, /* WXY */
+ {NULL}, /* Z */
+ {NULL}, {NULL}, /* (char 91 - 92) */
+ {NULL}, {NULL}, {NULL}, /* (char 93 - 95) */
+ {NULL}, /* ` (char 96) */
+ {NULL}, /* a (char 97) */
+ {add_ban, del_ban},
+ {NULL},
+ {NULL},
+ {add_exception, del_exception},
+ {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}
+};
+
+
+CBMode myCbmodes[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}, /* A */
+ {0}, /* B */
+ {0}, /* C */
+ {0}, /* D */
+ {0}, /* E */
+ {0}, /* F */
+ {0}, /* G */
+ {0}, /* H */
+ {0}, /* I */
+ {0}, /* J */
+ {0}, /* K */
+ {0}, /* L */
+ {CMODE_M, 0, NULL, NULL}, /* M */
+ {CMODE_N, 0, NULL, NULL}, /* N */
+ {CMODE_O, CBM_NO_USER_MLOCK, NULL, NULL}, /* O */
+ {0}, /* P */
+ {0}, /* Q */
+ {CMODE_R, 0, NULL, NULL}, /* R */
+ {0}, /* S */
+ {0}, /* T */
+ {0}, /* U */
+ {0}, /* V */
+ {0}, /* W */
+ {0}, /* X */
+ {0}, /* Y */
+ {CMODE_Z, 0, NULL, NULL}, /* Z */
+ {0}, {0}, {0}, {0}, {0}, {0},
+ {CMODE_a, 0, NULL, NULL},
+ {0}, /* b */
+ {CMODE_c, 0, NULL, NULL}, /* c */
+ {0}, /* d */
+ {0}, /* e */
+ {0}, /* f */
+ {0}, /* g */
+ {0}, /* h */
+ {CMODE_i, 0, NULL, NULL},
+ {0}, /* j */
+ {CMODE_k, 0, chan_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},
+ {0}, /* q */
+ {0},
+ {CMODE_s, 0, NULL, NULL},
+ {CMODE_t, 0, NULL, NULL},
+ {0},
+ {0}, /* v */
+ {0}, /* w */
+ {0}, /* x */
+ {0}, /* y */
+ {0}, /* z */
+ {0}, {0}, {0}, {0}
+};
+
+CBModeInfo myCbmodeinfos[] = {
+ {'a', CMODE_a, 0, NULL, NULL},
+ {'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},
+ {'s', CMODE_s, 0, NULL, NULL},
+ {'t', CMODE_t, 0, NULL, NULL},
+ {'M', CMODE_M, 0, NULL, NULL},
+ {'N', CMODE_N, 0, NULL, NULL},
+ {'O', CMODE_O, 0, NULL, NULL},
+ {'R', CMODE_R, 0, NULL, NULL},
+ {'Z', CMODE_Z, 0, NULL, NULL},
+ {0}
+};
+
+
+CUMode myCumodes[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},
+
+ {0}, /* a */
+ {0}, /* b */
+ {0}, /* c */
+ {0}, /* d */
+ {0}, /* e */
+ {0}, /* f */
+ {0}, /* g */
+ {CUS_HALFOP, 0, plexus_check_valid_halfop},
+ {0}, /* i */
+ {0}, /* j */
+ {0}, /* k */
+ {0}, /* l */
+ {0}, /* m */
+ {0}, /* n */
+ {CUS_OP, CUF_PROTECT_BOTSERV, plexus_check_valid_op},
+ {0}, /* p */
+ {0}, /* q */
+ {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}
+};
+
+
+
+void
+plexus_cmd_notice (char *source, char *dest, char *buf)
+{
+ if (!buf)
+ {
+ return;
+ }
+
+ if (NSDefFlags & NI_MSG)
+ {
+ plexus_cmd_privmsg2 (source, dest, buf);
+ }
+ else
+ {
+ send_cmd (source, "NOTICE %s :%s", dest, buf);
+ }
+}
+
+void
+plexus_cmd_notice2 (char *source, char *dest, char *msg)
+{
+ send_cmd (source, "NOTICE %s :%s", dest, msg);
+}
+
+void
+plexus_cmd_privmsg (char *source, char *dest, char *buf)
+{
+ if (!buf)
+ {
+ return;
+ }
+
+ send_cmd (source, "PRIVMSG %s :%s", dest, buf);
+}
+
+void
+plexus_cmd_privmsg2 (char *source, char *dest, char *msg)
+{
+ send_cmd (source, "PRIVMSG %s :%s", dest, msg);
+}
+
+void
+plexus_cmd_serv_notice (char *source, char *dest, char *msg)
+{
+ send_cmd (source, "NOTICE $$%s :%s", dest, msg);
+}
+
+void
+plexus_cmd_serv_privmsg (char *source, char *dest, char *msg)
+{
+ send_cmd (source, "PRIVMSG $$%s :%s", dest, msg);
+}
+
+
+void
+plexus_cmd_global (char *source, char *buf)
+{
+ if (!buf)
+ {
+ return;
+ }
+
+ send_cmd (source ? source : ServerName, "OPERWALL :%s", buf);
+}
+
+/* GLOBOPS - to handle old WALLOPS */
+void
+plexus_cmd_global_legacy (char *source, char *fmt)
+{
+ send_cmd (source ? source : ServerName, "OPERWALL :%s", fmt);
+}
+
+int
+anope_event_sjoin (char *source, int ac, char **av)
+{
+ do_sjoin (source, ac, av);
+ return MOD_CONT;
+}
+
+int
+anope_event_nick (char *source, int ac, char **av)
+{
+ if (ac != 2)
+ {
+ User *user = do_nick (source, av[0], av[4], av[5], av[7], av[9],
+ strtoul (av[2], NULL, 10),
+ strtoul (av[8], NULL, 0), 0, av[6], NULL);
+ if (user)
+ anope_set_umode (user, 1, &av[3]);
+ }
+ else
+ {
+ do_nick (source, av[0], NULL, NULL, NULL, NULL,
+ strtoul (av[1], NULL, 10), 0, 0, NULL, NULL);
+ }
+ return MOD_CONT;
+}
+
+int
+anope_event_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)
+ {
+ if (debug)
+ {
+ alog ("debug: 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]);
+
+ if (ac > 1 && *av[1])
+ send_event(EVENT_TOPIC_UPDATED, 2, av[0], av[1]);
+ else
+ send_event(EVENT_TOPIC_UPDATED, 2, av[0], "");
+
+ }
+ return MOD_CONT;
+}
+
+int
+anope_event_tburst (char *source, int ac, char **av)
+{
+ if (ac != 5)
+ return MOD_CONT;
+
+ av[0] = av[1];
+ av[1] = av[3];
+ av[3] = av[4];
+ do_topic (source, 4, av);
+ return MOD_CONT;
+}
+
+int
+anope_event_436 (char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+
+ m_nickcoll (av[0]);
+ return MOD_CONT;
+}
+
+
+void
+moduleAddIRCDMsgs (void)
+{
+ Message *m;
+
+ updateProtectDetails ("PROTECT", "PROTECTME", "protect", "deprotect",
+ "AUTOPROTECT", "+", "-");
+
+ m = createMessage ("401", anope_event_null);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("402", anope_event_null);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("436", anope_event_436);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("AWAY", anope_event_away);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("INVITE", anope_event_invite);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("JOIN", anope_event_join);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("KICK", anope_event_kick);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("KILL", anope_event_kill);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("MODE", anope_event_mode);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("MOTD", anope_event_motd);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("NICK", anope_event_nick);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("NOTICE", anope_event_notice);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("PART", anope_event_part);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("PASS", anope_event_pass);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("PING", anope_event_ping);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("PRIVMSG", anope_event_privmsg);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("QUIT", anope_event_quit);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("SERVER", anope_event_server);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("SQUIT", anope_event_squit);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("TOPIC", anope_event_topic);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("TBURST", anope_event_tburst);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("USER", anope_event_null);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("WALLOPS", anope_event_null);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("WHOIS", anope_event_whois);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("SVSMODE", anope_event_mode);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("SVSNICK", anope_event_null);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("CAPAB", anope_event_capab);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("SJOIN", anope_event_sjoin);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("SVINFO", anope_event_svinfo);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("EOB", anope_event_eob);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("ADMIN", anope_event_admin);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("ERROR", anope_event_error);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("SETHOST", anope_event_sethost);
+ addCoreMessage (IRCD, m);
+}
+
+void
+plexus_cmd_sqline (char *mask, char *reason)
+{
+ send_cmd (s_OperServ, "RESV * %s :%s", mask, reason);
+}
+
+void
+plexus_cmd_unsgline (char *mask)
+{
+ send_cmd (s_OperServ, "UNXLINE * %s", mask);
+}
+
+void
+plexus_cmd_unszline (char *mask)
+{
+ /* Does not support */
+}
+
+void
+plexus_cmd_szline (char *mask, char *reason, char *whom)
+{
+ /* Does not support */
+}
+
+void
+plexus_cmd_svsnoop (char *server, int set)
+{
+ /* does not support */
+}
+
+void
+plexus_cmd_svsadmin (char *server, int set)
+{
+ plexus_cmd_svsnoop (server, set);
+}
+
+void
+plexus_cmd_sgline (char *mask, char *reason)
+{
+ send_cmd (s_OperServ, "XLINE * %s :%s", mask, reason);
+}
+
+void
+plexus_cmd_remove_akill (char *user, char *host)
+{
+ send_cmd (s_OperServ, "UNKLINE * %s %s", user, host);
+}
+
+void
+plexus_cmd_topic (char *whosets, char *chan, char *whosetit,
+ char *topic, time_t when)
+{
+ send_cmd (whosets, "SVSTOPIC %s %s %lu :%s", chan, whosetit,
+ (unsigned long int) when, topic);
+}
+
+void
+plexus_cmd_vhost_off (User * u)
+{
+ send_cmd (ServerName, "SVSMODE %s -h", u->nick);
+}
+
+void
+plexus_cmd_vhost_on (char *nick, char *vIdent, char *vhost)
+{
+ User *u;
+
+ if (!nick)
+ {
+ return;
+ }
+
+ u = finduser (nick);
+
+ if (u)
+ {
+ send_cmd (ServerName, "SVSHOST %s %s", nick, vhost);
+ u->mode |= UMODE_h;
+ }
+}
+
+void
+plexus_cmd_unsqline (char *user)
+{
+ send_cmd (s_OperServ, "UNRESV * %s", user);
+}
+
+void
+plexus_cmd_join (char *user, char *channel, time_t chantime)
+{
+ send_cmd (ServerName, "SJOIN %ld %s + :%s", (long int) chantime, channel,
+ user);
+}
+
+/*
+oper: the nick of the oper performing the kline
+target.server: the server(s) this kline is destined for
+duration: the duration if a tkline, 0 if permanent.
+user: the 'user' portion of the kline
+host: the 'host' portion of the kline
+reason: the reason for the kline.
+*/
+
+void
+plexus_cmd_akill (char *user, char *host, char *who, time_t when,
+ time_t expires, char *reason)
+{
+ send_cmd (s_OperServ, "KLINE * %ld %s %s :%s",
+ (long int) (expires - (long) time (NULL)), user, host, reason);
+}
+
+void
+plexus_cmd_svskill (char *source, char *user, char *buf)
+{
+ if (!buf)
+ {
+ return;
+ }
+
+ if (!source || !user)
+ {
+ return;
+ }
+
+ send_cmd (source, "KILL %s :%s", user, buf);
+}
+
+void
+plexus_cmd_svsmode (User * u, int ac, char **av)
+{
+ send_cmd (ServerName, "SVSMODE %s %s", u->nick, av[0]);
+
+ if ((ac == 2) && isdigit (*av[1]))
+ send_cmd (ServerName, "SVSID %s %s", u->nick, av[1]);
+}
+
+/*
+ * SVINFO
+ * parv[0] = sender prefix
+ * parv[1] = TS_CURRENT for the server
+ * parv[2] = TS_MIN for the server
+ * parv[3] = server is standalone or connected to non-TS only
+ * parv[4] = server's idea of UTC time
+ */
+void
+plexus_cmd_svinfo ()
+{
+ send_cmd (NULL, "SVINFO 5 5 0 :%ld", (long int) time (NULL));
+}
+
+/* CAPAB */
+/*
+ QS - Can handle quit storm removal
+ EX - Can do channel +e exemptions
+ CHW - Can do channel wall @#
+ LL - Can do lazy links
+ IE - Can do invite exceptions
+ EOB - Can do EOB message
+ KLN - Can do KLINE message
+ GLN - Can do GLINE message
+ HOPS - can do half ops (+h)
+ HUB - This server is a HUB
+ AOPS - Can do anon ops (+a)
+ UID - Can do UIDs
+ ZIP - Can do ZIPlinks
+ ENC - Can do ENCrypted links
+ KNOCK - supports KNOCK
+ TBURST - supports TBURST
+ PARA - supports invite broadcasting for +p
+ ENCAP - ?
+*/
+void
+plexus_cmd_capab ()
+{
+ send_cmd (NULL,
+ "CAPAB :QS EX CHW IE EOB KLN GLN HOPS HUB KNOCK TBURST PARA");
+}
+
+/* PASS */
+void
+plexus_cmd_pass (char *pass)
+{
+ send_cmd (NULL, "PASS %s :TS", pass);
+}
+
+/* SERVER name hop descript */
+void
+plexus_cmd_server (char *servname, int hop, char *descript)
+{
+ send_cmd (NULL, "SERVER %s %d :%s", servname, hop, descript);
+}
+
+void
+plexus_cmd_connect (int servernum)
+{
+ me_server = new_server (NULL, ServerName, ServerDesc, SERVER_ISME, NULL);
+
+ if (servernum == 1)
+ plexus_cmd_pass (RemotePassword);
+ else if (servernum == 2)
+ plexus_cmd_pass (RemotePassword2);
+ else if (servernum == 3)
+ plexus_cmd_pass (RemotePassword3);
+
+ plexus_cmd_capab ();
+ plexus_cmd_server (ServerName, 1, ServerDesc);
+ plexus_cmd_svinfo ();
+}
+
+void
+plexus_cmd_svsinfo ()
+{
+ /* not used */
+}
+
+
+
+void
+plexus_cmd_bot_nick (char *nick, char *user, char *host, char *real,
+ char *modes)
+{
+ EnforceQlinedNick (nick, NULL);
+ send_cmd (ServerName, "NICK %s 1 %ld %s %s %s %s %s 0 :%s", nick,
+ (long int) time (NULL), modes, user, host, "*", ServerName, real);
+ plexus_cmd_sqline (nick, "Reserved for services");
+
+}
+
+void
+plexus_cmd_part (char *nick, char *chan, char *buf)
+{
+ if (buf)
+ {
+ send_cmd (nick, "PART %s :%s", chan, buf);
+ }
+ else
+ {
+ send_cmd (nick, "PART %s", chan);
+ }
+}
+
+int
+anope_event_sethost (char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 2)
+ return MOD_CONT;
+
+ u = finduser (av[0]);
+ if (!u)
+ {
+ if (debug)
+ {
+ alog ("debug: SETHOST for nonexistent user %s", source);
+ }
+ return MOD_CONT;
+ }
+
+ change_user_host (u, av[1]);
+ return MOD_CONT;
+}
+
+int
+anope_event_ping (char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+ plexus_cmd_pong (ac > 1 ? av[1] : ServerName, av[0]);
+ return MOD_CONT;
+}
+
+int
+anope_event_away (char *source, int ac, char **av)
+{
+ if (!source)
+ {
+ return MOD_CONT;
+ }
+ m_away (source, (ac ? av[0] : NULL));
+ return MOD_CONT;
+}
+
+int
+anope_event_kill (char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+
+ m_kill (av[0], av[1]);
+ return MOD_CONT;
+}
+
+int
+anope_event_kick (char *source, int ac, char **av)
+{
+ if (ac != 3)
+ return MOD_CONT;
+ do_kick (source, ac, av);
+ return MOD_CONT;
+}
+
+int
+anope_event_eob (char *source, int ac, char **av)
+{
+ Server *s;
+ s = findserver (servlist, source);
+ /* If we found a server with the given source, that one just
+ * finished bursting. If there was no source, then our uplink
+ * server finished bursting. -GD
+ */
+ if (!s && serv_uplink)
+ s = serv_uplink;
+ finish_sync (s, 1);
+
+ return MOD_CONT;
+}
+
+void
+plexus_cmd_eob ()
+{
+ send_cmd (ServerName, "EOB");
+}
+
+
+int
+anope_event_join (char *source, int ac, char **av)
+{
+ if (ac != 1)
+ return MOD_CONT;
+ do_join (source, ac, av);
+ return MOD_CONT;
+}
+
+int
+anope_event_motd (char *source, int ac, char **av)
+{
+ if (!source)
+ {
+ return MOD_CONT;
+ }
+
+ m_motd (source);
+ return MOD_CONT;
+}
+
+int
+anope_event_privmsg (char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+ m_privmsg (source, av[0], av[1]);
+ return MOD_CONT;
+}
+
+int
+anope_event_part (char *source, int ac, char **av)
+{
+ if (ac < 1 || ac > 2)
+ return MOD_CONT;
+ do_part (source, ac, av);
+ return MOD_CONT;
+}
+
+int
+anope_event_whois (char *source, int ac, char **av)
+{
+ if (source && ac >= 1)
+ {
+ m_whois (source, av[0]);
+ }
+ return MOD_CONT;
+}
+
+/* EVENT: SERVER */
+int
+anope_event_server (char *source, int ac, char **av)
+{
+ if (!stricmp (av[1], "1"))
+ {
+ uplink = sstrdup (av[0]);
+ }
+ do_server (source, av[0], av[1], av[2], NULL);
+ return MOD_CONT;
+}
+
+int
+anope_event_squit (char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+ do_squit (source, ac, av);
+ return MOD_CONT;
+}
+
+int
+anope_event_quit (char *source, int ac, char **av)
+{
+ if (ac != 1)
+ return MOD_CONT;
+ do_quit (source, ac, av);
+ return MOD_CONT;
+}
+
+void
+plexus_cmd_372 (char *source, char *msg)
+{
+ send_cmd (ServerName, "372 %s :- %s", source, msg);
+}
+
+void
+plexus_cmd_372_error (char *source)
+{
+ send_cmd (ServerName, "422 %s :- MOTD file not found! Please "
+ "contact your IRC administrator.", source);
+}
+
+void
+plexus_cmd_375 (char *source)
+{
+ send_cmd (ServerName, "375 %s :- %s Message of the Day",
+ source, ServerName);
+}
+
+void
+plexus_cmd_376 (char *source)
+{
+ send_cmd (ServerName, "376 %s :End of /MOTD command.", source);
+}
+
+/* 391 */
+void
+plexus_cmd_391 (char *source, char *timestr)
+{
+ if (!timestr)
+ {
+ return;
+ }
+ send_cmd (ServerName, "391 :%s %s :%s", source, ServerName, timestr);
+}
+
+/* 250 */
+void
+plexus_cmd_250 (char *buf)
+{
+ if (!buf)
+ {
+ return;
+ }
+
+ send_cmd (ServerName, "250 %s", buf);
+}
+
+/* 307 */
+void
+plexus_cmd_307 (char *buf)
+{
+ if (!buf)
+ {
+ return;
+ }
+
+ send_cmd (ServerName, "307 %s", buf);
+}
+
+/* 311 */
+void
+plexus_cmd_311 (char *buf)
+{
+ if (!buf)
+ {
+ return;
+ }
+
+ send_cmd (ServerName, "311 %s", buf);
+}
+
+/* 312 */
+void
+plexus_cmd_312 (char *buf)
+{
+ if (!buf)
+ {
+ return;
+ }
+
+ send_cmd (ServerName, "312 %s", buf);
+}
+
+/* 317 */
+void
+plexus_cmd_317 (char *buf)
+{
+ if (!buf)
+ {
+ return;
+ }
+
+ send_cmd (ServerName, "317 %s", buf);
+}
+
+/* 219 */
+void
+plexus_cmd_219 (char *source, char *letter)
+{
+ if (!source)
+ {
+ return;
+ }
+
+ if (letter)
+ {
+ send_cmd (ServerName, "219 %s %c :End of /STATS report.", source, *letter);
+ }
+ else
+ {
+ send_cmd (ServerName, "219 %s l :End of /STATS report.", source);
+ }
+}
+
+/* 401 */
+void
+plexus_cmd_401 (char *source, char *who)
+{
+ if (!source || !who)
+ {
+ return;
+ }
+ send_cmd (ServerName, "401 %s %s :No such service.", source, who);
+}
+
+/* 318 */
+void
+plexus_cmd_318 (char *source, char *who)
+{
+ if (!source || !who)
+ {
+ return;
+ }
+
+ send_cmd (ServerName, "318 %s %s :End of /WHOIS list.", source, who);
+}
+
+/* 242 */
+void
+plexus_cmd_242 (char *buf)
+{
+ if (!buf)
+ {
+ return;
+ }
+
+ send_cmd (ServerName, "242 %s", buf);
+}
+
+/* 243 */
+void
+plexus_cmd_243 (char *buf)
+{
+ if (!buf)
+ {
+ return;
+ }
+
+ send_cmd (ServerName, "243 %s", buf);
+}
+
+/* 211 */
+void
+plexus_cmd_211 (char *buf)
+{
+ if (!buf)
+ {
+ return;
+ }
+
+ send_cmd (ServerName, "211 %s", buf);
+}
+
+void
+plexus_cmd_mode (char *source, char *dest, char *buf)
+{
+ if (!buf)
+ {
+ return;
+ }
+
+ send_cmd (source, "MODE %s %s", dest, buf);
+}
+
+void
+plexus_cmd_nick (char *nick, char *name, char *mode)
+{
+ EnforceQlinedNick (nick, NULL);
+ send_cmd (ServerName, "NICK %s 1 %ld %s %s %s %s %s 0 :%s", nick,
+ (long int) time (NULL), mode, ServiceUser, ServiceHost,
+ "*", ServerName, (name));
+ send_cmd (nick, "RESV * %s :%s", nick, "Reserved for services");
+}
+
+void
+plexus_cmd_kick (char *source, char *chan, char *user, char *buf)
+{
+ if (buf)
+ {
+ send_cmd (source, "KICK %s %s :%s", chan, user, buf);
+ }
+ else
+ {
+ send_cmd (source, "KICK %s %s", chan, user);
+ }
+}
+
+void
+plexus_cmd_notice_ops (char *source, char *dest, char *buf)
+{
+ if (!buf)
+ {
+ return;
+ }
+
+ send_cmd (ServerName, "NOTICE @%s :%s", dest, buf);
+}
+
+void
+plexus_cmd_bot_chan_mode (char *nick, char *chan)
+{
+ anope_cmd_mode (nick, chan, "%s %s", ircd->botchanumode, nick);
+}
+
+/* QUIT */
+void
+plexus_cmd_quit (char *source, char *buf)
+{
+ if (buf)
+ {
+ send_cmd (source, "QUIT :%s", buf);
+ }
+ else
+ {
+ send_cmd (source, "QUIT");
+ }
+}
+
+/* PONG */
+void
+plexus_cmd_pong (char *servname, char *who)
+{
+ send_cmd (servname, "PONG %s", who);
+}
+
+/* INVITE */
+void
+plexus_cmd_invite (char *source, char *chan, char *nick)
+{
+ if (!source || !chan || !nick)
+ {
+ return;
+ }
+
+ send_cmd (source, "INVITE %s %s", nick, chan);
+}
+
+/* SQUIT */
+void
+plexus_cmd_squit (char *servname, char *message)
+{
+ if (!servname || !message)
+ {
+ return;
+ }
+
+ send_cmd (ServerName, "SQUIT %s :%s", servname, message);
+}
+
+int
+anope_event_mode (char *source, int ac, char **av)
+{
+ if (ac < 2)
+ return MOD_CONT;
+
+ if (*av[0] == '#' || *av[0] == '&')
+ {
+ do_cmode (source, ac, av);
+ }
+ else
+ {
+ Server *s;
+ s = findserver (servlist, source);
+
+ if (s && *av[0])
+ {
+ do_umode (av[0], ac, av);
+ }
+ else
+ {
+ do_umode (source, ac, av);
+ }
+ }
+ return MOD_CONT;
+}
+
+void
+plexus_cmd_351 (char *source)
+{
+ send_cmd (ServerName, "351 %s Anope-%s %s :%s - %s (%s) -- %s",
+ source, version_number, ServerName, ircd->name, version_flags,
+ EncModule, version_build);
+}
+
+/* Event: PROTOCTL */
+int
+anope_event_capab (char *source, int ac, char **av)
+{
+ int argvsize = 8;
+ int argc;
+ char **argv;
+ char *str;
+
+ if (ac < 1)
+ return MOD_CONT;
+
+ /* We get the params as one arg, we should split it for capab_parse */
+ argv = scalloc(argvsize, sizeof(char *));
+ argc = 0;
+ while ((str = myStrGetToken(av[0], ' ', argc))) {
+ if (argc == argvsize) {
+ argvsize += 8;
+ argv = srealloc(argv, argvsize * sizeof(char *));
+ }
+ argv[argc] = str;
+ argc++;
+ }
+
+ capab_parse(argc, argv);
+
+ /* Free our built ac/av */
+ for (argvsize = 0; argvsize < argc; argvsize++) {
+ free(argv[argvsize]);
+ }
+ free(argv);
+
+ return MOD_CONT;
+}
+
+/* SVSHOLD - set */
+void
+plexus_cmd_svshold (char *nick)
+{
+ /* Not supported by this IRCD */
+}
+
+/* SVSHOLD - release */
+void
+plexus_cmd_release_svshold (char *nick)
+{
+ /* Not Supported by this IRCD */
+}
+
+/* SVSNICK */
+void
+plexus_cmd_svsnick (char *nick, char *newnick, time_t when)
+{
+ if (!nick || !newnick)
+ {
+ return;
+ }
+ send_cmd (ServerName, "SVSNICK %s %s", nick, newnick);
+}
+
+void
+plexus_cmd_guest_nick (char *nick, char *user, char *host, char *real,
+ char *modes)
+{
+ send_cmd (ServerName, "NICK %s 1 %ld %s %s %s %s %s 0 :%s", nick,
+ (long int) time (NULL), modes, user, host, "*", ServerName, real);
+}
+
+void
+plexus_cmd_svso (char *source, char *nick, char *flag)
+{
+ /* Not Supported by this IRCD */
+}
+
+void
+plexus_cmd_unban (char *name, char *nick)
+{
+ /* Not Supported by this IRCD */
+}
+
+/* SVSMODE channel modes */
+
+void
+plexus_cmd_svsmode_chan (char *name, char *mode, char *nick)
+{
+ /* Not Supported by this IRCD */
+}
+
+/* SVSMODE +d */
+/* sent if svid is something weird */
+void
+plexus_cmd_svid_umode (char *nick, time_t ts)
+{
+ send_cmd (ServerName, "SVSID %s 1", nick);
+}
+
+/* SVSMODE +d */
+/* nc_change was = 1, and there is no na->status */
+void
+plexus_cmd_nc_change (User * u)
+{
+ common_svsmode (u, "-R", "1");
+}
+
+/* SVSMODE +d */
+void
+plexus_cmd_svid_umode2 (User * u, char *ts)
+{
+ if (u->svid != u->timestamp)
+ {
+ common_svsmode (u, "+R", ts);
+ }
+ else
+ {
+ common_svsmode (u, "+R", NULL);
+ }
+}
+
+void
+plexus_cmd_svid_umode3 (User * u, char *ts)
+{
+ /* not used */
+}
+
+/* NICK <newnick> */
+void
+plexus_cmd_chg_nick (char *oldnick, char *newnick)
+{
+ if (!oldnick || !newnick)
+ {
+ return;
+ }
+
+ send_cmd (oldnick, "NICK %s", newnick);
+}
+
+/*
+ * SVINFO
+ * parv[0] = sender prefix
+ * parv[1] = TS_CURRENT for the server
+ * parv[2] = TS_MIN for the server
+ * parv[3] = server is standalone or connected to non-TS only
+ * parv[4] = server's idea of UTC time
+ */
+int
+anope_event_svinfo (char *source, int ac, char **av)
+{
+ /* currently not used but removes the message : unknown message from server */
+ return MOD_CONT;
+}
+
+int
+anope_event_pass (char *source, int ac, char **av)
+{
+ /* currently not used but removes the message : unknown message from server */
+ return MOD_CONT;
+}
+
+void
+plexus_cmd_svsjoin (char *source, char *nick, char *chan, char *param)
+{
+ /* Not Supported by this IRCD */
+}
+
+void
+plexus_cmd_svspart (char *source, char *nick, char *chan)
+{
+ /* Not Supported by this IRCD */
+}
+
+void
+plexus_cmd_swhois (char *source, char *who, char *mask)
+{
+ /* not supported */
+}
+
+int
+anope_event_notice (char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int
+anope_event_admin (char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int
+anope_event_invite (char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int
+plexus_flood_mode_check (char *value)
+{
+ return 0;
+}
+
+int
+anope_event_error (char *source, int ac, char **av)
+{
+ if (ac >= 1)
+ {
+ if (debug)
+ {
+ alog ("debug: %s", av[0]);
+ }
+ }
+ return MOD_CONT;
+}
+
+void
+plexus_cmd_jupe (char *jserver, char *who, char *reason)
+{
+ char rbuf[256];
+
+ snprintf (rbuf, sizeof (rbuf), "Juped by %s%s%s", who,
+ reason ? ": " : "", reason ? reason : "");
+
+ if (findserver(servlist, jserver))
+ plexus_cmd_squit (jserver, rbuf);
+ plexus_cmd_server (jserver, 2, rbuf);
+ new_server (me_server, jserver, rbuf, SERVER_JUPED, NULL);
+}
+
+/*
+ 1 = valid nick
+ 0 = nick is in valid
+*/
+int
+plexus_valid_nick (char *nick)
+{
+ /* no hard coded invalid nicks */
+ return 1;
+}
+
+/*
+ 1 = valid chan
+ 0 = chan is in valid
+*/
+int
+plexus_valid_chan (char *chan)
+{
+ /* no hard coded invalid chan */
+ return 1;
+}
+
+
+void
+plexus_cmd_ctcp (char *source, char *dest, char *buf)
+{
+ char *s;
+
+ if (!buf)
+ {
+ return;
+ }
+ else
+ {
+ s = normalizeBuffer (buf);
+ }
+
+ send_cmd (source, "NOTICE %s :\1%s \1", dest, s);
+ free (s);
+}
+
+
+/**
+ * Tell anope which function we want to perform each task inside of anope.
+ * These prototypes must match what anope expects.
+ **/
+void
+moduleAddAnopeCmds ()
+{
+ pmodule_cmd_svsnoop (plexus_cmd_svsnoop);
+ pmodule_cmd_remove_akill (plexus_cmd_remove_akill);
+ pmodule_cmd_topic (plexus_cmd_topic);
+ pmodule_cmd_vhost_off (plexus_cmd_vhost_off);
+ pmodule_cmd_akill (plexus_cmd_akill);
+ pmodule_cmd_svskill (plexus_cmd_svskill);
+ pmodule_cmd_svsmode (plexus_cmd_svsmode);
+ pmodule_cmd_372 (plexus_cmd_372);
+ pmodule_cmd_372_error (plexus_cmd_372_error);
+ pmodule_cmd_375 (plexus_cmd_375);
+ pmodule_cmd_376 (plexus_cmd_376);
+ pmodule_cmd_nick (plexus_cmd_nick);
+ pmodule_cmd_guest_nick (plexus_cmd_guest_nick);
+ pmodule_cmd_mode (plexus_cmd_mode);
+ pmodule_cmd_bot_nick (plexus_cmd_bot_nick);
+ pmodule_cmd_kick (plexus_cmd_kick);
+ pmodule_cmd_notice_ops (plexus_cmd_notice_ops);
+ pmodule_cmd_notice (plexus_cmd_notice);
+ pmodule_cmd_notice2 (plexus_cmd_notice2);
+ pmodule_cmd_privmsg (plexus_cmd_privmsg);
+ pmodule_cmd_privmsg2 (plexus_cmd_privmsg2);
+ pmodule_cmd_serv_notice (plexus_cmd_serv_notice);
+ pmodule_cmd_serv_privmsg (plexus_cmd_serv_privmsg);
+ pmodule_cmd_bot_chan_mode (plexus_cmd_bot_chan_mode);
+ pmodule_cmd_351 (plexus_cmd_351);
+ pmodule_cmd_quit (plexus_cmd_quit);
+ pmodule_cmd_pong (plexus_cmd_pong);
+ pmodule_cmd_join (plexus_cmd_join);
+ pmodule_cmd_unsqline (plexus_cmd_unsqline);
+ pmodule_cmd_invite (plexus_cmd_invite);
+ pmodule_cmd_part (plexus_cmd_part);
+ pmodule_cmd_391 (plexus_cmd_391);
+ pmodule_cmd_250 (plexus_cmd_250);
+ pmodule_cmd_307 (plexus_cmd_307);
+ pmodule_cmd_311 (plexus_cmd_311);
+ pmodule_cmd_312 (plexus_cmd_312);
+ pmodule_cmd_317 (plexus_cmd_317);
+ pmodule_cmd_219 (plexus_cmd_219);
+ pmodule_cmd_401 (plexus_cmd_401);
+ pmodule_cmd_318 (plexus_cmd_318);
+ pmodule_cmd_242 (plexus_cmd_242);
+ pmodule_cmd_243 (plexus_cmd_243);
+ pmodule_cmd_211 (plexus_cmd_211);
+ pmodule_cmd_global (plexus_cmd_global);
+ pmodule_cmd_global_legacy (plexus_cmd_global_legacy);
+ pmodule_cmd_sqline (plexus_cmd_sqline);
+ pmodule_cmd_squit (plexus_cmd_squit);
+ pmodule_cmd_svso (plexus_cmd_svso);
+ pmodule_cmd_chg_nick (plexus_cmd_chg_nick);
+ pmodule_cmd_svsnick (plexus_cmd_svsnick);
+ pmodule_cmd_vhost_on (plexus_cmd_vhost_on);
+ pmodule_cmd_connect (plexus_cmd_connect);
+ pmodule_cmd_svshold (plexus_cmd_svshold);
+ pmodule_cmd_release_svshold (plexus_cmd_release_svshold);
+ pmodule_cmd_unsgline (plexus_cmd_unsgline);
+ pmodule_cmd_unszline (plexus_cmd_unszline);
+ pmodule_cmd_szline (plexus_cmd_szline);
+ pmodule_cmd_sgline (plexus_cmd_sgline);
+ pmodule_cmd_unban (plexus_cmd_unban);
+ pmodule_cmd_svsmode_chan (plexus_cmd_svsmode_chan);
+ pmodule_cmd_svid_umode (plexus_cmd_svid_umode);
+ pmodule_cmd_nc_change (plexus_cmd_nc_change);
+ pmodule_cmd_svid_umode2 (plexus_cmd_svid_umode2);
+ pmodule_cmd_svid_umode3 (plexus_cmd_svid_umode3);
+ pmodule_cmd_svsjoin (plexus_cmd_svsjoin);
+ pmodule_cmd_svspart (plexus_cmd_svspart);
+ pmodule_cmd_swhois (plexus_cmd_swhois);
+ pmodule_cmd_eob (plexus_cmd_eob);
+ pmodule_flood_mode_check (plexus_flood_mode_check);
+ pmodule_cmd_jupe (plexus_cmd_jupe);
+ pmodule_valid_nick (plexus_valid_nick);
+ pmodule_valid_chan (plexus_valid_chan);
+ pmodule_cmd_ctcp (plexus_cmd_ctcp);
+ pmodule_set_umode (plexus_set_umode);
+}
+
+/**
+ * Now tell anope how to use us.
+ **/
+int
+AnopeInit (int argc, char **argv)
+{
+
+ moduleAddAuthor ("Anope");
+ moduleAddVersion ("$Id$");
+ moduleSetType (PROTOCOL);
+
+ pmodule_ircd_version ("PleXusIRCd 2.0+");
+ pmodule_ircd_cap (myIrcdcap);
+ pmodule_ircd_var (myIrcd);
+ pmodule_ircd_cbmodeinfos (myCbmodeinfos);
+ pmodule_ircd_cumodes (myCumodes);
+ pmodule_ircd_flood_mode_char_set ("");
+ pmodule_ircd_flood_mode_char_remove ("");
+ pmodule_ircd_cbmodes (myCbmodes);
+ pmodule_ircd_cmmodes (myCmmodes);
+ pmodule_ircd_csmodes (myCsmodes);
+ pmodule_ircd_useTSMode (0);
+
+ /** Deal with modes anope _needs_ to know **/
+ pmodule_invis_umode (UMODE_i);
+ pmodule_oper_umode (UMODE_o);
+ pmodule_invite_cmode (CMODE_i);
+ pmodule_secret_cmode (CMODE_s);
+ pmodule_private_cmode (CMODE_p);
+ pmodule_key_mode (CMODE_k);
+ pmodule_limit_mode (CMODE_l);
+
+ moduleAddAnopeCmds ();
+ moduleAddIRCDMsgs ();
+
+ return MOD_CONT;
+}
+
+/* EOF */
diff --git a/src/protocol/plexus2.h b/src/protocol/plexus2.h
new file mode 100644
index 000000000..366909b2b
--- /dev/null
+++ b/src/protocol/plexus2.h
@@ -0,0 +1,126 @@
+/* PlexusIRCD IRCD functions
+ *
+ * (C) 2003-2008 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.
+ *
+ *
+ */
+
+#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_s 0x00000040
+#define UMODE_c 0x00000080
+#define UMODE_r 0x00000100
+#define UMODE_k 0x00000200
+#define UMODE_f 0x00000400
+#define UMODE_y 0x00000800
+#define UMODE_d 0x00001000
+#define UMODE_n 0x00002000
+#define UMODE_x 0x00004000
+#define UMODE_u 0x00008000
+#define UMODE_b 0x00010000
+#define UMODE_l 0x00020000
+#define UMODE_g 0x00040000
+#define UMODE_S 0x00080000
+
+
+#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
+#define CMODE_a 0x00000400
+#define CMODE_Z 0x00000800
+#define CMODE_M 0x00001000
+#define CMODE_c 0x00002000
+#define CMODE_O 0x00004000
+#define CMODE_R 0x00008000
+#define CMODE_N 0x00010000
+
+
+#define DEFAULT_MLOCK CMODE_n | CMODE_t
+
+void plexus_set_umode(User * user, int ac, char **av);
+void plexus_cmd_svsnoop(char *server, int set);
+void plexus_cmd_remove_akill(char *user, char *host);
+void plexus_cmd_topic(char *whosets, char *chan, char *whosetit, char *topic, time_t when);
+void plexus_cmd_vhost_off(User * u);
+void plexus_cmd_akill(char *user, char *host, char *who, time_t when,time_t expires, char *reason);
+void plexus_cmd_svskill(char *source, char *user, char *buf);
+void plexus_cmd_svsmode(User * u, int ac, char **av);
+void plexus_cmd_372(char *source, char *msg);
+void plexus_cmd_372_error(char *source);
+void plexus_cmd_375(char *source);
+void plexus_cmd_376(char *source);
+void plexus_cmd_nick(char *nick, char *name, char *modes);
+void plexus_cmd_guest_nick(char *nick, char *user, char *host, char *real, char *modes);
+void plexus_cmd_mode(char *source, char *dest, char *buf);
+void plexus_cmd_bot_nick(char *nick, char *user, char *host, char *real, char *modes);
+void plexus_cmd_kick(char *source, char *chan, char *user, char *buf);
+void plexus_cmd_notice_ops(char *source, char *dest, char *buf);
+void plexus_cmd_notice(char *source, char *dest, char *buf);
+void plexus_cmd_notice2(char *source, char *dest, char *msg);
+void plexus_cmd_privmsg(char *source, char *dest, char *buf);
+void plexus_cmd_privmsg2(char *source, char *dest, char *msg);
+void plexus_cmd_serv_notice(char *source, char *dest, char *msg);
+void plexus_cmd_serv_privmsg(char *source, char *dest, char *msg);
+void plexus_cmd_bot_chan_mode(char *nick, char *chan);
+void plexus_cmd_351(char *source);
+void plexus_cmd_quit(char *source, char *buf);
+void plexus_cmd_pong(char *servname, char *who);
+void plexus_cmd_join(char *user, char *channel, time_t chantime);
+void plexus_cmd_unsqline(char *user);
+void plexus_cmd_invite(char *source, char *chan, char *nick);
+void plexus_cmd_part(char *nick, char *chan, char *buf);
+void plexus_cmd_391(char *source, char *timestr);
+void plexus_cmd_250(char *buf);
+void plexus_cmd_307(char *buf);
+void plexus_cmd_311(char *buf);
+void plexus_cmd_312(char *buf);
+void plexus_cmd_317(char *buf);
+void plexus_cmd_219(char *source, char *letter);
+void plexus_cmd_401(char *source, char *who);
+void plexus_cmd_318(char *source, char *who);
+void plexus_cmd_242(char *buf);
+void plexus_cmd_243(char *buf);
+void plexus_cmd_211(char *buf);
+void plexus_cmd_global(char *source, char *buf);
+void plexus_cmd_global_legacy(char *source, char *fmt);
+void plexus_cmd_sqline(char *mask, char *reason);
+void plexus_cmd_squit(char *servname, char *message);
+void plexus_cmd_svso(char *source, char *nick, char *flag);
+void plexus_cmd_chg_nick(char *oldnick, char *newnick);
+void plexus_cmd_svsnick(char *source, char *guest, time_t when);
+void plexus_cmd_vhost_on(char *nick, char *vIdent, char *vhost);
+void plexus_cmd_connect(int servernum);
+void plexus_cmd_svshold(char *nick);
+void plexus_cmd_release_svshold(char *nick);
+void plexus_cmd_unsgline(char *mask);
+void plexus_cmd_unszline(char *mask);
+void plexus_cmd_szline(char *mask, char *reason, char *whom);
+void plexus_cmd_sgline(char *mask, char *reason);
+void plexus_cmd_unban(char *name, char *nick);
+void plexus_cmd_svsmode_chan(char *name, char *mode, char *nick);
+void plexus_cmd_svid_umode(char *nick, time_t ts);
+void plexus_cmd_nc_change(User * u);
+void plexus_cmd_svid_umode2(User * u, char *ts);
+void plexus_cmd_svid_umode3(User * u, char *ts);
+void plexus_cmd_eob();
+int plexus_flood_mode_check(char *value);
+void plexus_cmd_jupe(char *jserver, char *who, char *reason);
+int plexus_valid_nick(char *nick);
+void plexus_cmd_ctcp(char *source, char *dest, char *buf);
+
+
diff --git a/src/protocol/plexus3.c b/src/protocol/plexus3.c
new file mode 100644
index 000000000..2265e66b8
--- /dev/null
+++ b/src/protocol/plexus3.c
@@ -0,0 +1,1857 @@
+/* PlexusIRCD IRCD functions
+ *
+ * (C) 2003-2008 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.
+ */
+
+#include "services.h"
+#include "pseudo.h"
+#include "plexus3.h"
+
+IRCDVar myIrcd[] = {
+ {"hybrid-7.2.1+plexus-3.0.0+",/* ircd name */
+ "+i", /* nickserv mode */
+ "+i", /* chanserv mode */
+ "+i", /* memoserv mode */
+ "+i", /* hostserv mode */
+ "+oai", /* operserv mode */
+ "+i", /* botserv mode */
+ "+i", /* helpserv mode */
+ "+i", /* Dev/Null mode */
+ "+i", /* Global mode */
+ "+i", /* nickserv alias mode */
+ "+i", /* chanserv alias mode */
+ "+i", /* memoserv alias mode */
+ "+i", /* hostserv alias mode */
+ "+oai", /* operserv alias mode */
+ "+i", /* botserv alias mode */
+ "+i", /* helpserv alias mode */
+ "+i", /* Dev/Null alias mode */
+ "+i", /* Global alias mode */
+ "+i", /* Used by BotServ Bots */
+ 5, /* Chan Max Symbols */
+ "-cilmnpstBMNORS", /* Modes to Remove */
+ "+ao", /* Channel Umode used by Botserv bots */
+ 1, /* SVSNICK */
+ 1, /* Vhost */
+ 1, /* Has Owner */
+ "+q", /* Mode to set for an owner */
+ "-q", /* Mode to unset for an owner */
+ "+a", /* Mode to set for chan admin */
+ "-a", /* Mode to unset for chan admin */
+ "+rd", /* Mode On Reg */
+ "N", /* Mode on ID for Roots */
+ NULL, /* Mode on ID for Admins */
+ NULL, /* Mode on ID for Opers */
+ "-r+d", /* Mode on UnReg */
+ "+d", /* Mode on Nick Change */
+ 1, /* Supports SGlines */
+ 1, /* Supports SQlines */
+ 0, /* Supports SZlines */
+ 1, /* Supports Halfop +h */
+ 3, /* Number of server args */
+ 0, /* Join 2 Set */
+ 0, /* Join 2 Message */
+ 1, /* Has exceptions +e */
+ 0, /* TS Topic Forward */
+ 0, /* TS Topci Backward */
+ UMODE_N, /* Protected Umode */
+ 0, /* Has Admin */
+ 1, /* Chan SQlines */
+ 0, /* Quit on Kill */
+ 0, /* SVSMODE unban */
+ 1, /* Has Protect */
+ 0, /* Reverse */
+ 0, /* Chan Reg */
+ 0, /* Channel Mode */
+ 0, /* vidents */
+ 1, /* svshold */
+ 1, /* time stamp on mode */
+ 0, /* NICKIP */
+ 0, /* O:LINE */
+ 1, /* UMODE */
+ 1, /* VHOST ON NICK */
+ 0, /* Change RealName */
+ CMODE_p, /* No Knock */
+ 0, /* Admin Only */
+ DEFAULT_MLOCK, /* Default MLOCK */
+ UMODE_x, /* Vhost Mode */
+ 0, /* +f */
+ 0, /* +L */
+ 0, /* +f Mode */
+ 0, /* +L Mode */
+ 1, /* On nick change check if they could be identified */
+ 0, /* No Knock requires +i */
+ NULL, /* CAPAB Chan Modes */
+ 0, /* We support TOKENS */
+ 1, /* TOKENS are CASE inSensitive */
+ 0, /* TIME STAMPS are BASE64 */
+ 1, /* +I support */
+ 0, /* SJOIN ban char */
+ 0, /* SJOIN except char */
+ 0, /* SJOIN invite char */
+ 0, /* Can remove User Channel Modes with SVSMODE */
+ 0, /* Sglines are not enforced until user reconnects */
+ "x", /* vhost char */
+ 0, /* ts6 */
+ 0, /* support helper umode */
+ 0, /* p10 */
+ NULL, /* character set */
+ 1, /* reports sync state */
+ 0, /* CIDR channelbans */
+ }
+ ,
+ {NULL}
+};
+
+IRCDCAPAB myIrcdcap[] = {
+ {
+ 0, /* NOQUIT */
+ 0, /* TSMODE */
+ 0, /* UNCONNECT */
+ 0, /* NICKIP */
+ 0, /* SJOIN */
+ CAPAB_ZIP, /* ZIP */
+ 0, /* BURST */
+ CAPAB_TS5, /* TS5 */
+ 0, /* TS3 */
+ 0, /* DKEY */
+ 0, /* PT4 */
+ 0, /* SCS */
+ CAPAB_QS, /* QS */
+ CAPAB_UID, /* UID */
+ CAPAB_KNOCK, /* KNOCK */
+ 0, /* CLIENT */
+ 0, /* IPV6 */
+ 0, /* SSJ5 */
+ 0, /* SN2 */
+ 0, /* TOKEN */
+ 0, /* VHOST */
+ 0, /* SSJ3 */
+ 0, /* NICK2 */
+ 0, /* UMODE2 */
+ 0, /* VL */
+ 0, /* TLKEXT */
+ 0, /* DODKEY */
+ 0, /* DOZIP */
+ 0, 0, 0}
+};
+
+
+
+void
+plexus_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)
+ {
+
+ /* This looks better, much better than "add ? (do_add) : (do_remove)".
+ * At least this is readable without paying much attention :) -GD
+ */
+ if (add)
+ user->mode |= umodes[(int) *modes];
+ else
+ user->mode &= ~umodes[(int) *modes];
+
+ switch (*modes++)
+ {
+ case '+':
+ add = 1;
+ break;
+ case '-':
+ add = 0;
+ break;
+ case 'd':
+ if (ac == 0)
+ {
+ alog ("user: umode +d with no parameter (?) for user %s",
+ user->nick);
+ break;
+ }
+
+ ac--;
+ av++;
+ user->svid = strtoul (*av, NULL, 0);
+ break;
+ case 'x':
+ update_host (user);
+ break;
+ case 'o':
+ if (add)
+ {
+ opcnt++;
+
+ if (WallOper)
+ anope_cmd_global (s_OperServ,
+ "\2%s\2 is now an IRC operator.",
+ user->nick);
+ display_news (user, NEWS_OPER);
+
+ }
+ else
+ {
+ opcnt--;
+ }
+ break;
+ case 'r':
+ if (add && !nick_identified (user))
+ {
+ common_svsmode (user, "-r", NULL);
+ user->mode &= ~UMODE_r;
+ }
+ break;
+ }
+ }
+}
+
+unsigned long umodes[128] = {
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused, Unused, Horzontal Tab */
+ 0, 0, 0, /* Line Feed, Unused, Unused */
+ 0, 0, 0, /* Carriage Return, Unused, Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused, Unused, Space */
+ 0, 0, 0, /* ! " # */
+ 0, 0, 0, /* $ % & */
+ 0, 0, 0, /* ! ( ) */
+ 0, 0, 0, /* * + , */
+ 0, 0, 0, /* - . / */
+ 0, 0, /* 0 1 */
+ 0, 0, /* 2 3 */
+ 0, 0, /* 4 5 */
+ 0, 0, /* 6 7 */
+ 0, 0, /* 8 9 */
+ 0, 0, /* : ; */
+ 0, 0, 0, /* < = > */
+ 0, 0, /* ? @ */
+ 0, 0, 0, /* A B C */
+ 0, 0, 0, /* D E F */
+ 0, 0, 0, /* G H I */
+ 0, 0, 0, /* J K L */
+ 0, UMODE_N, 0, /* M N O */
+ 0, 0, UMODE_R, /* P Q R */
+ UMODE_S, 0, 0, /* S T U */
+ 0, 0, 0, /* V W X */
+ 0, /* Y */
+ 0, /* Z */
+ 0, 0, 0, /* [ \ ] */
+ 0, 0, 0, /* ^ _ ` */
+ UMODE_a, 0, 0, /* a b c */
+ 0, 0, 0, /* d e f */
+ 0, 0, UMODE_i, /* g h i */
+ 0, 0, 0, /* j k l */
+ 0, 0, UMODE_o, /* m n o */
+ 0, 0, UMODE_r, /* p q r */
+ 0, 0, 0, /* s t u */
+ 0, UMODE_w, UMODE_x, /* v w x */
+ 0, /* y */
+ 0, /* z */
+ 0, 0, 0, /* { | } */
+ 0, 0 /* ~ � */
+};
+
+
+char myCsmodes[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,
+ 'h', /* (37) % Channel halfops */
+ 'a',
+ 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, 'q', 0
+};
+
+CMMode myCmmodes[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}, /* BCD */
+ {NULL}, {NULL}, {NULL}, /* EFG */
+ {NULL}, /* H */
+ {add_invite, del_invite},
+ {NULL}, /* J */
+ {NULL}, {NULL}, {NULL}, /* KLM */
+ {NULL}, {NULL}, {NULL}, /* NOP */
+ {NULL}, {NULL}, {NULL}, /* QRS */
+ {NULL}, {NULL}, {NULL}, /* TUV */
+ {NULL}, {NULL}, {NULL}, /* WXY */
+ {NULL}, /* Z */
+ {NULL}, {NULL}, /* (char 91 - 92) */
+ {NULL}, {NULL}, {NULL}, /* (char 93 - 95) */
+ {NULL}, /* ` (char 96) */
+ {NULL}, /* a (char 97) */
+ {add_ban, del_ban},
+ {NULL},
+ {NULL},
+ {add_exception, del_exception},
+ {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}
+};
+
+
+CBMode myCbmodes[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}, /* A */
+ {CMODE_B, CBM_NO_USER_MLOCK, NULL, NULL}, /* B */
+ {0}, /* C */
+ {0}, /* D */
+ {0}, /* E */
+ {0}, /* F */
+ {0}, /* G */
+ {0}, /* H */
+ {0}, /* I */
+ {0}, /* J */
+ {0}, /* K */
+ {0}, /* L */
+ {CMODE_M, 0, NULL, NULL}, /* M */
+ {CMODE_N, 0, NULL, NULL}, /* N */
+ {CMODE_O, CBM_NO_USER_MLOCK, NULL, NULL}, /* O */
+ {0}, /* P */
+ {0}, /* Q */
+ {CMODE_R, 0, NULL, NULL}, /* R */
+ {CMODE_S, 0, NULL, NULL}, /* S */
+ {0}, /* T */
+ {0}, /* U */
+ {0}, /* V */
+ {0}, /* W */
+ {0}, /* X */
+ {0}, /* Y */
+ {0}, /* Z */
+ {0}, {0}, {0}, {0}, {0}, {0},
+ {0}, /* a */
+ {0}, /* b */
+ {CMODE_c, 0, NULL, NULL}, /* c */
+ {0}, /* d */
+ {0}, /* e */
+ {0}, /* f */
+ {0}, /* g */
+ {0}, /* h */
+ {CMODE_i, 0, NULL, NULL},
+ {0}, /* j */
+ {CMODE_k, 0, chan_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},
+ {0}, /* q */
+ {0},
+ {CMODE_s, 0, NULL, NULL},
+ {CMODE_t, 0, NULL, NULL},
+ {0},
+ {0}, /* v */
+ {0}, /* w */
+ {0}, /* x */
+ {0}, /* y */
+ {0}, /* z */
+ {0}, {0}, {0}, {0}
+};
+
+CBModeInfo myCbmodeinfos[] = {
+ {'c', CMODE_c, 0, NULL, NULL},
+ {'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},
+ {'s', CMODE_s, 0, NULL, NULL},
+ {'t', CMODE_t, 0, NULL, NULL},
+ {'B', CMODE_B, 0, NULL, NULL},
+ {'M', CMODE_M, 0, NULL, NULL},
+ {'N', CMODE_N, 0, NULL, NULL},
+ {'O', CMODE_O, 0, NULL, NULL},
+ {'R', CMODE_R, 0, NULL, NULL},
+ {'S', CMODE_S, 0, NULL, NULL},
+ {0}
+};
+
+
+CUMode myCumodes[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},
+
+ {CUS_PROTECT, CUF_PROTECT_BOTSERV, check_valid_op},
+ {0}, /* b */
+ {0}, /* c */
+ {0}, /* d */
+ {0}, /* e */
+ {0}, /* f */
+ {0}, /* g */
+ {CUS_HALFOP, 0, check_valid_op},
+ {0}, /* i */
+ {0}, /* j */
+ {0}, /* k */
+ {0}, /* l */
+ {0}, /* m */
+ {0}, /* n */
+ {CUS_OP, CUF_PROTECT_BOTSERV, check_valid_op},
+ {0}, /* p */
+ {CUS_OWNER, 0, check_valid_op}, /* q */
+ {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}
+};
+
+
+
+void
+plexus_cmd_notice (char *source, char *dest, char *buf)
+{
+ if (!buf)
+ {
+ return;
+ }
+
+ if (NSDefFlags & NI_MSG)
+ {
+ plexus_cmd_privmsg2 (source, dest, buf);
+ }
+ else
+ {
+ send_cmd (source, "NOTICE %s :%s", dest, buf);
+ }
+}
+
+void
+plexus_cmd_notice2 (char *source, char *dest, char *msg)
+{
+ send_cmd (source, "NOTICE %s :%s", dest, msg);
+}
+
+void
+plexus_cmd_privmsg (char *source, char *dest, char *buf)
+{
+ if (!buf)
+ {
+ return;
+ }
+
+ send_cmd (source, "PRIVMSG %s :%s", dest, buf);
+}
+
+void
+plexus_cmd_privmsg2 (char *source, char *dest, char *msg)
+{
+ send_cmd (source, "PRIVMSG %s :%s", dest, msg);
+}
+
+void
+plexus_cmd_serv_notice (char *source, char *dest, char *msg)
+{
+ send_cmd (source, "NOTICE $$%s :%s", dest, msg);
+}
+
+void
+plexus_cmd_serv_privmsg (char *source, char *dest, char *msg)
+{
+ send_cmd (source, "PRIVMSG $$%s :%s", dest, msg);
+}
+
+
+void
+plexus_cmd_global (char *source, char *buf)
+{
+ if (!buf)
+ {
+ return;
+ }
+
+ send_cmd (source ? source : ServerName, "OPERWALL :%s", buf);
+}
+
+/* GLOBOPS - to handle old WALLOPS */
+void
+plexus_cmd_global_legacy (char *source, char *fmt)
+{
+ send_cmd (source ? source : ServerName, "OPERWALL :%s", fmt);
+}
+
+int
+anope_event_sjoin (char *source, int ac, char **av)
+{
+ do_sjoin (source, ac, av);
+ return MOD_CONT;
+}
+
+int
+anope_event_nick (char *source, int ac, char **av)
+{
+ if (ac != 2)
+ {
+ User *user = do_nick (source, av[0], av[4], av[8], av[6], av[9],
+ strtoul (av[2], NULL, 10),
+ strtoul (av[7], NULL, 0), 0, av[5], NULL);
+ if (user)
+ anope_set_umode (user, 1, &av[3]);
+ }
+ else
+ {
+ do_nick (source, av[0], NULL, NULL, NULL, NULL,
+ strtoul (av[1], NULL, 10), 0, 0, NULL, NULL);
+ }
+ return MOD_CONT;
+}
+
+int
+anope_event_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)
+ {
+ if (debug)
+ {
+ alog ("debug: 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]);
+
+ if (ac > 1 && *av[1])
+ send_event(EVENT_TOPIC_UPDATED, 2, av[0], av[1]);
+ else
+ send_event(EVENT_TOPIC_UPDATED, 2, av[0], "");
+
+ }
+ return MOD_CONT;
+}
+
+int
+anope_event_tburst (char *source, int ac, char **av)
+{
+ if (ac != 5)
+ return MOD_CONT;
+
+ av[0] = av[1];
+ av[1] = av[3];
+ av[3] = av[4];
+ do_topic (source, 4, av);
+ return MOD_CONT;
+}
+
+/*
+ * ENCAP handler
+ * av[0] = servermask (not used)
+ * av[1] = command
+ * av[2] and beyond are dynamic.
+ */
+int
+anope_event_encap (char *source, int ac, char **av)
+{
+ if (ac < 2)
+ return MOD_CONT;
+
+ if (!stricmp (av[1], "CHGHOST"))
+ {
+ User *u;
+
+ if (ac != 4)
+ return MOD_CONT;
+
+ u = finduser (av[2]);
+ if (!u)
+ {
+ if (debug)
+ {
+ alog ("debug: CHGHOST for nonexistent user %s", av[2]);
+ }
+ return MOD_CONT;
+ }
+
+ change_user_host (u, av[3]);
+ return MOD_CONT;
+ }
+ return MOD_CONT;
+}
+
+int
+anope_event_436 (char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+
+ m_nickcoll (av[0]);
+ return MOD_CONT;
+}
+
+
+void
+moduleAddIRCDMsgs (void)
+{
+ Message *m;
+
+ updateProtectDetails("PROTECT","PROTECTME","protect","deprotect","AUTOPROTECT","+a","-a");
+
+ m = createMessage ("401", anope_event_null);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("402", anope_event_null);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("436", anope_event_436);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("AWAY", anope_event_away);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("INVITE", anope_event_invite);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("JOIN", anope_event_join);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("KICK", anope_event_kick);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("KILL", anope_event_kill);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("MODE", anope_event_mode);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("MOTD", anope_event_motd);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("NICK", anope_event_nick);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("NOTICE", anope_event_notice);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("PART", anope_event_part);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("PASS", anope_event_pass);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("PING", anope_event_ping);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("PRIVMSG", anope_event_privmsg);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("QUIT", anope_event_quit);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("SERVER", anope_event_server);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("SQUIT", anope_event_squit);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("TOPIC", anope_event_topic);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("TBURST", anope_event_tburst);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("USER", anope_event_null);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("WALLOPS", anope_event_null);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("WHOIS", anope_event_whois);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("CAPAB", anope_event_capab);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("SJOIN", anope_event_sjoin);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("SVINFO", anope_event_svinfo);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("EOB", anope_event_eob);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("ADMIN", anope_event_admin);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("ERROR", anope_event_error);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("ENCAP", anope_event_encap);
+ addCoreMessage (IRCD, m);
+ m = createMessage ("SVSMODE", anope_event_mode);
+ addCoreMessage (IRCD, m);
+}
+
+void
+plexus_cmd_sqline (char *mask, char *reason)
+{
+ send_cmd (s_OperServ, "RESV * %s :%s", mask, reason);
+}
+
+void
+plexus_cmd_unsgline (char *mask)
+{
+ send_cmd (s_OperServ, "UNXLINE * %s", mask);
+}
+
+void
+plexus_cmd_unszline (char *mask)
+{
+ /* Does not support */
+}
+
+void
+plexus_cmd_szline (char *mask, char *reason, char *whom)
+{
+ /* Does not support */
+}
+
+void
+plexus_cmd_svsnoop (char *server, int set)
+{
+ send_cmd(ServerName, "ENCAP %s SVSNOOP %s",
+ server, (set ? "+" : "-"));
+}
+
+void
+plexus_cmd_svsadmin (char *server, int set)
+{
+ plexus_cmd_svsnoop (server, set);
+}
+
+void
+plexus_cmd_sgline (char *mask, char *reason)
+{
+ send_cmd (s_OperServ, "XLINE * %s 0 :%s", mask, reason);
+}
+
+void
+plexus_cmd_remove_akill (char *user, char *host)
+{
+ send_cmd (s_OperServ, "UNKLINE * %s %s", user, host);
+}
+
+void
+plexus_cmd_topic (char *whosets, char *chan, char *whosetit,
+ char *topic, time_t when)
+{
+ send_cmd (whosets, "ENCAP * TOPIC %s %s %lu :%s", chan, whosetit,
+ (unsigned long int) when, topic);
+}
+
+void
+plexus_cmd_vhost_off (User * u)
+{
+ common_svsmode (u, "-x", NULL);
+}
+
+void
+plexus_cmd_vhost_on (char *nick, char *vIdent, char *vhost)
+{
+ User *u;
+
+ if (!nick)
+ {
+ return;
+ }
+
+ u = finduser (nick);
+
+ if (u)
+ {
+ send_cmd (ServerName, "ENCAP * CHGHOST %s %s", u->nick, vhost);
+ common_svsmode (u, "+x", NULL);
+ u->mode |= UMODE_x;
+ }
+}
+
+void
+plexus_cmd_unsqline (char *user)
+{
+ send_cmd (s_OperServ, "UNRESV * %s", user);
+}
+
+void
+plexus_cmd_join (char *user, char *channel, time_t chantime)
+{
+ send_cmd (ServerName, "SJOIN %ld %s + :%s", (long int) chantime, channel,
+ user);
+}
+
+/*
+oper: the nick of the oper performing the kline
+target.server: the server(s) this kline is destined for
+duration: the duration if a tkline, 0 if permanent.
+user: the 'user' portion of the kline
+host: the 'host' portion of the kline
+reason: the reason for the kline.
+*/
+
+void
+plexus_cmd_akill (char *user, char *host, char *who, time_t when,
+ time_t expires, char *reason)
+{
+ send_cmd (s_OperServ, "KLINE * %ld %s %s :%s",
+ (long int) (expires - (long) time (NULL)), user, host, reason);
+}
+
+void
+plexus_cmd_svskill (char *source, char *user, char *buf)
+{
+ if (!buf)
+ {
+ return;
+ }
+
+ if (!source || !user)
+ {
+ return;
+ }
+
+ send_cmd (source, "KILL %s :%s", user, buf);
+}
+
+void
+plexus_cmd_svsmode (User * u, int ac, char **av)
+{
+ send_cmd (ServerName, "ENCAP * SVSMODE %s %ld %s%s%s", u->nick,
+ (long int) u->timestamp, av[0], (ac == 2 ? " " : ""),
+ (ac == 2 ? av[1] : ""));
+}
+
+/*
+ * SVINFO
+ * parv[0] = sender prefix
+ * parv[1] = TS_CURRENT for the server
+ * parv[2] = TS_MIN for the server
+ * parv[3] = server is standalone or connected to non-TS only
+ * parv[4] = server's idea of UTC time
+ */
+void
+plexus_cmd_svinfo ()
+{
+ send_cmd (NULL, "SVINFO 5 5 0 :%ld", (long int) time (NULL));
+}
+
+/* CAPAB */
+/*
+ QS - Can handle quit storm removal
+ EX - Can do channel +e exemptions
+ CHW - Can do channel wall @#
+ LL - Can do lazy links
+ IE - Can do invite exceptions
+ EOB - Can do EOB message
+ KLN - Can do KLINE message
+ GLN - Can do GLINE message
+ HOPS - can do half ops (+h)
+ HUB - This server is a HUB
+ AOPS - Can do anon ops (+a)
+ UID - Can do UIDs
+ ZIP - Can do ZIPlinks
+ ENC - Can do ENCrypted links
+ KNOCK - supports KNOCK
+ TBURST - supports TBURST
+ PARA - supports invite broadcasting for +p
+ ENCAP - supports encapsulization of protocol messages
+ SVS - supports services protocol extensions
+*/
+void
+plexus_cmd_capab ()
+{
+ send_cmd (NULL,
+ "CAPAB :QS EX CHW IE EOB KLN UNKLN GLN HUB KNOCK TBURST PARA ENCAP SVS");
+}
+
+/* PASS */
+void
+plexus_cmd_pass (char *pass)
+{
+ send_cmd (NULL, "PASS %s :TS", pass);
+}
+
+/* SERVER name hop descript */
+void
+plexus_cmd_server (char *servname, int hop, char *descript)
+{
+ send_cmd (NULL, "SERVER %s %d :%s", servname, hop, descript);
+}
+
+void
+plexus_cmd_connect (int servernum)
+{
+ me_server = new_server (NULL, ServerName, ServerDesc, SERVER_ISME, NULL);
+
+ if (servernum == 1)
+ plexus_cmd_pass (RemotePassword);
+ else if (servernum == 2)
+ plexus_cmd_pass (RemotePassword2);
+ else if (servernum == 3)
+ plexus_cmd_pass (RemotePassword3);
+
+ plexus_cmd_capab ();
+ plexus_cmd_server (ServerName, 1, ServerDesc);
+ plexus_cmd_svinfo ();
+}
+
+void
+plexus_cmd_svsinfo ()
+{
+ /* not used */
+}
+
+
+
+void
+plexus_cmd_bot_nick (char *nick, char *user, char *host, char *real,
+ char *modes)
+{
+ EnforceQlinedNick (nick, NULL);
+ send_cmd (ServerName, "NICK %s 1 %ld %s %s %s %s 0 %s :%s", nick,
+ (long int) time (NULL), modes, user, host, ServerName, host,
+ real);
+ plexus_cmd_sqline (nick, "Reserved for services");
+
+}
+
+void
+plexus_cmd_part (char *nick, char *chan, char *buf)
+{
+ if (buf)
+ {
+ send_cmd (nick, "PART %s :%s", chan, buf);
+ }
+ else
+ {
+ send_cmd (nick, "PART %s", chan);
+ }
+}
+
+int
+anope_event_ping (char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+ plexus_cmd_pong (ac > 1 ? av[1] : ServerName, av[0]);
+ return MOD_CONT;
+}
+
+int
+anope_event_away (char *source, int ac, char **av)
+{
+ if (!source)
+ {
+ return MOD_CONT;
+ }
+ m_away (source, (ac ? av[0] : NULL));
+ return MOD_CONT;
+}
+
+int
+anope_event_kill (char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+
+ m_kill (av[0], av[1]);
+ return MOD_CONT;
+}
+
+int
+anope_event_kick (char *source, int ac, char **av)
+{
+ if (ac != 3)
+ return MOD_CONT;
+ do_kick (source, ac, av);
+ return MOD_CONT;
+}
+
+int
+anope_event_eob (char *source, int ac, char **av)
+{
+ Server *s;
+ s = findserver (servlist, source);
+ /* If we found a server with the given source, that one just
+ * finished bursting. If there was no source, then our uplink
+ * server finished bursting. -GD
+ */
+ if (!s && serv_uplink)
+ s = serv_uplink;
+ finish_sync (s, 1);
+
+ return MOD_CONT;
+}
+
+void
+plexus_cmd_eob ()
+{
+ send_cmd (ServerName, "EOB");
+}
+
+
+int
+anope_event_join (char *source, int ac, char **av)
+{
+ if (ac != 1)
+ return MOD_CONT;
+ do_join (source, ac, av);
+ return MOD_CONT;
+}
+
+int
+anope_event_motd (char *source, int ac, char **av)
+{
+ if (!source)
+ {
+ return MOD_CONT;
+ }
+
+ m_motd (source);
+ return MOD_CONT;
+}
+
+int
+anope_event_privmsg (char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+ m_privmsg (source, av[0], av[1]);
+ return MOD_CONT;
+}
+
+int
+anope_event_part (char *source, int ac, char **av)
+{
+ if (ac < 1 || ac > 2)
+ return MOD_CONT;
+ do_part (source, ac, av);
+ return MOD_CONT;
+}
+
+int
+anope_event_whois (char *source, int ac, char **av)
+{
+ if (source && ac >= 1)
+ {
+ m_whois (source, av[0]);
+ }
+ return MOD_CONT;
+}
+
+/* EVENT: SERVER */
+int
+anope_event_server (char *source, int ac, char **av)
+{
+ if (!stricmp (av[1], "1"))
+ {
+ uplink = sstrdup (av[0]);
+ }
+ do_server (source, av[0], av[1], av[2], NULL);
+ return MOD_CONT;
+}
+
+int
+anope_event_squit (char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+ do_squit (source, ac, av);
+ return MOD_CONT;
+}
+
+int
+anope_event_quit (char *source, int ac, char **av)
+{
+ if (ac != 1)
+ return MOD_CONT;
+ do_quit (source, ac, av);
+ return MOD_CONT;
+}
+
+void
+plexus_cmd_372 (char *source, char *msg)
+{
+ send_cmd (ServerName, "372 %s :- %s", source, msg);
+}
+
+void
+plexus_cmd_372_error (char *source)
+{
+ send_cmd (ServerName, "422 %s :- MOTD file not found! Please "
+ "contact your IRC administrator.", source);
+}
+
+void
+plexus_cmd_375 (char *source)
+{
+ send_cmd (ServerName, "375 %s :- %s Message of the Day",
+ source, ServerName);
+}
+
+void
+plexus_cmd_376 (char *source)
+{
+ send_cmd (ServerName, "376 %s :End of /MOTD command.", source);
+}
+
+/* 391 */
+void
+plexus_cmd_391 (char *source, char *timestr)
+{
+ if (!timestr)
+ {
+ return;
+ }
+ send_cmd (ServerName, "391 :%s %s :%s", source, ServerName, timestr);
+}
+
+/* 250 */
+void
+plexus_cmd_250 (char *buf)
+{
+ if (!buf)
+ {
+ return;
+ }
+
+ send_cmd (ServerName, "250 %s", buf);
+}
+
+/* 307 */
+void
+plexus_cmd_307 (char *buf)
+{
+ if (!buf)
+ {
+ return;
+ }
+
+ send_cmd (ServerName, "307 %s", buf);
+}
+
+/* 311 */
+void
+plexus_cmd_311 (char *buf)
+{
+ if (!buf)
+ {
+ return;
+ }
+
+ send_cmd (ServerName, "311 %s", buf);
+}
+
+/* 312 */
+void
+plexus_cmd_312 (char *buf)
+{
+ if (!buf)
+ {
+ return;
+ }
+
+ send_cmd (ServerName, "312 %s", buf);
+}
+
+/* 317 */
+void
+plexus_cmd_317 (char *buf)
+{
+ if (!buf)
+ {
+ return;
+ }
+
+ send_cmd (ServerName, "317 %s", buf);
+}
+
+/* 219 */
+void
+plexus_cmd_219 (char *source, char *letter)
+{
+ if (!source)
+ {
+ return;
+ }
+
+ if (letter)
+ {
+ send_cmd (ServerName, "219 %s %c :End of /STATS report.", source,
+ *letter);
+ }
+ else
+ {
+ send_cmd (ServerName, "219 %s l :End of /STATS report.", source);
+ }
+}
+
+/* 401 */
+void
+plexus_cmd_401 (char *source, char *who)
+{
+ if (!source || !who)
+ {
+ return;
+ }
+ send_cmd (ServerName, "401 %s %s :No such service.", source, who);
+}
+
+/* 318 */
+void
+plexus_cmd_318 (char *source, char *who)
+{
+ if (!source || !who)
+ {
+ return;
+ }
+
+ send_cmd (ServerName, "318 %s %s :End of /WHOIS list.", source, who);
+}
+
+/* 242 */
+void
+plexus_cmd_242 (char *buf)
+{
+ if (!buf)
+ {
+ return;
+ }
+
+ send_cmd (ServerName, "242 %s", buf);
+}
+
+/* 243 */
+void
+plexus_cmd_243 (char *buf)
+{
+ if (!buf)
+ {
+ return;
+ }
+
+ send_cmd (ServerName, "243 %s", buf);
+}
+
+/* 211 */
+void
+plexus_cmd_211 (char *buf)
+{
+ if (!buf)
+ {
+ return;
+ }
+
+ send_cmd (ServerName, "211 %s", buf);
+}
+
+void
+plexus_cmd_mode (char *source, char *dest, char *buf)
+{
+ if (!buf)
+ {
+ return;
+ }
+
+ send_cmd (source, "MODE %s %s", dest, buf);
+}
+
+void
+plexus_cmd_nick (char *nick, char *name, char *mode)
+{
+ EnforceQlinedNick (nick, NULL);
+ send_cmd (ServerName, "NICK %s 1 %ld %s %s %s %s 0 %s :%s", nick,
+ (long int) time (NULL), mode, ServiceUser, ServiceHost,
+ ServerName, ServiceHost, (name));
+ send_cmd (nick, "RESV * %s :%s", nick, "Reserved for services");
+}
+
+void
+plexus_cmd_kick (char *source, char *chan, char *user, char *buf)
+{
+ if (buf)
+ {
+ send_cmd (source, "KICK %s %s :%s", chan, user, buf);
+ }
+ else
+ {
+ send_cmd (source, "KICK %s %s", chan, user);
+ }
+}
+
+void
+plexus_cmd_notice_ops (char *source, char *dest, char *buf)
+{
+ if (!buf)
+ {
+ return;
+ }
+
+ send_cmd (ServerName, "NOTICE @%s :%s", dest, buf);
+}
+
+void
+plexus_cmd_bot_chan_mode (char *nick, char *chan)
+{
+ anope_cmd_mode (nick, chan, "%s %s %s", myIrcd->botchanumode, nick, nick);
+}
+
+/* QUIT */
+void
+plexus_cmd_quit (char *source, char *buf)
+{
+ if (buf)
+ {
+ send_cmd (source, "QUIT :%s", buf);
+ }
+ else
+ {
+ send_cmd (source, "QUIT");
+ }
+}
+
+/* PONG */
+void
+plexus_cmd_pong (char *servname, char *who)
+{
+ send_cmd (servname, "PONG %s", who);
+}
+
+/* INVITE */
+void
+plexus_cmd_invite (char *source, char *chan, char *nick)
+{
+ if (!source || !chan || !nick)
+ {
+ return;
+ }
+
+ send_cmd (source, "INVITE %s %s", nick, chan);
+}
+
+/* SQUIT */
+void
+plexus_cmd_squit (char *servname, char *message)
+{
+ if (!servname || !message)
+ {
+ return;
+ }
+
+ send_cmd (ServerName, "SQUIT %s :%s", servname, message);
+}
+
+int
+anope_event_mode (char *source, int ac, char **av)
+{
+ if (ac < 2)
+ return MOD_CONT;
+
+ if (*av[0] == '#' || *av[0] == '&')
+ {
+ do_cmode (source, ac, av);
+ }
+ else
+ {
+ Server *s;
+ s = findserver (servlist, source);
+
+ if (s && *av[0])
+ {
+ do_umode (av[0], ac, av);
+ }
+ else
+ {
+ do_umode (source, ac, av);
+ }
+ }
+ return MOD_CONT;
+}
+
+void
+plexus_cmd_351 (char *source)
+{
+ send_cmd (ServerName, "351 %s Anope-%s %s :%s - %s (%s) -- %s",
+ source, version_number, ServerName, ircd->name, version_flags,
+ EncModule, version_build);
+}
+
+/* Event: PROTOCTL */
+int
+anope_event_capab (char *source, int ac, char **av)
+{
+ int argvsize = 8;
+ int argc;
+ char **argv;
+ char *str;
+
+ if (ac < 1)
+ return MOD_CONT;
+
+ /* We get the params as one arg, we should split it for capab_parse */
+ argv = scalloc (argvsize, sizeof (char *));
+ argc = 0;
+ while ((str = myStrGetToken (av[0], ' ', argc)))
+ {
+ if (argc == argvsize)
+ {
+ argvsize += 8;
+ argv = srealloc (argv, argvsize * sizeof (char *));
+ }
+ argv[argc] = str;
+ argc++;
+ }
+
+ capab_parse (argc, argv);
+
+ /* Free our built ac/av */
+ for (argvsize = 0; argvsize < argc; argvsize++)
+ {
+ free (argv[argvsize]);
+ }
+ free (argv);
+
+ return MOD_CONT;
+}
+
+/* SVSHOLD - set */
+void
+plexus_cmd_svshold (char *nick)
+{
+ send_cmd (s_OperServ, "ENCAP * RESV %d %s 0 :%s", NSReleaseTimeout, nick,
+ "This nick is being held for a registered user. "
+ "For help with regaining nicknames please see /nickserv help release");
+}
+
+/* SVSHOLD - release */
+void
+plexus_cmd_release_svshold (char *nick)
+{
+ send_cmd (s_OperServ, "UNRESV * %s", nick);
+}
+
+/* SVSNICK */
+void
+plexus_cmd_svsnick (char *nick, char *newnick, time_t when)
+{
+ User *u;
+
+ if (!nick || !newnick)
+ return;
+
+ if( (u = finduser (nick))) {
+ send_cmd (ServerName, "ENCAP * SVSNICK %s %ld %s %ld",
+ u->nick, (long int) u->timestamp, newnick, (long int) when);
+ }
+}
+
+void
+plexus_cmd_guest_nick (char *nick, char *user, char *host, char *real,
+ char *modes)
+{
+ send_cmd (ServerName, "NICK %s 1 %ld %s %s %s %s 0 %s :%s", nick,
+ (long int) time (NULL), modes, user, host, ServerName, host,
+ real);
+}
+
+void
+plexus_cmd_svso (char *source, char *nick, char *flag)
+{
+ /* Not Supported by this IRCD */
+}
+
+void
+plexus_cmd_unban (char *name, char *nick)
+{
+ /* Not Supported by this IRCD */
+}
+
+/* SVSMODE channel modes */
+
+void
+plexus_cmd_svsmode_chan (char *name, char *mode, char *nick)
+{
+ /* Not Supported by this IRCD */
+}
+
+/* SVSMODE +d */
+/* sent if svid is something weird */
+void
+plexus_cmd_svid_umode (char *nick, time_t ts)
+{
+ send_cmd (ServerName, "ENCAP * SVSMODE %s %lu +d 1", nick,
+ (unsigned long int) ts);
+}
+
+/* SVSMODE +d */
+/* nc_change was = 1, and there is no na->status */
+void
+plexus_cmd_nc_change (User * u)
+{
+ common_svsmode (u, "+d", "1");
+}
+
+/* SVSMODE +d */
+void
+plexus_cmd_svid_umode2 (User * u, char *ts)
+{
+ /* not used */
+}
+
+void
+plexus_cmd_svid_umode3 (User * u, char *ts)
+{
+ char modes[512];
+
+ strlcpy(modes, "+r", sizeof(modes));
+
+ if(ircd->rootmodeonid && is_services_root(u)) {
+ strlcat(modes, ircd->rootmodeonid, sizeof(modes));
+ } else if(ircd->adminmodeonid && is_services_admin(u)) {
+ strlcat(modes, ircd->adminmodeonid, sizeof(modes));
+ } else if(ircd->opermodeonid && is_services_oper(u)) {
+ strlcat(modes, ircd->opermodeonid, sizeof(modes));
+ }
+ if (u->svid != u->timestamp) {
+ strlcat(modes, "d", sizeof(modes));
+ common_svsmode (u, modes, ts);
+ } else {
+ common_svsmode (u, modes, NULL);
+ }
+}
+
+/* NICK <newnick> */
+void
+plexus_cmd_chg_nick (char *oldnick, char *newnick)
+{
+ if (!oldnick || !newnick)
+ {
+ return;
+ }
+
+ send_cmd (oldnick, "NICK %s", newnick);
+}
+
+/*
+ * SVINFO
+ * parv[0] = sender prefix
+ * parv[1] = TS_CURRENT for the server
+ * parv[2] = TS_MIN for the server
+ * parv[3] = server is standalone or connected to non-TS only
+ * parv[4] = server's idea of UTC time
+ */
+int
+anope_event_svinfo (char *source, int ac, char **av)
+{
+ /* currently not used but removes the message : unknown message from server */
+ return MOD_CONT;
+}
+
+int
+anope_event_pass (char *source, int ac, char **av)
+{
+ /* currently not used but removes the message : unknown message from server */
+ return MOD_CONT;
+}
+
+void
+plexus_cmd_svsjoin (char *source, char *nick, char *chan, char *param)
+{
+ send_cmd(ServerName, "ENCAP * SVSJOIN %s %s", nick, chan);
+}
+
+void
+plexus_cmd_svspart (char *source, char *nick, char *chan)
+{
+ send_cmd(ServerName, "ENCAP * SVSPART %s %s", nick, chan);
+}
+
+void
+plexus_cmd_swhois (char *source, char *who, char *mask)
+{
+ /* not supported */
+}
+
+int
+anope_event_notice (char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int
+anope_event_admin (char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int
+anope_event_invite (char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int
+plexus_flood_mode_check (char *value)
+{
+ return 0;
+}
+
+int
+anope_event_error (char *source, int ac, char **av)
+{
+ if (ac >= 1)
+ {
+ if (debug)
+ {
+ alog ("debug: %s", av[0]);
+ }
+ }
+ return MOD_CONT;
+}
+
+void
+plexus_cmd_jupe (char *jserver, char *who, char *reason)
+{
+ char rbuf[256];
+
+ snprintf (rbuf, sizeof (rbuf), "(H) Juped by %s%s%s", who,
+ reason ? ": " : "", reason ? reason : "");
+
+ if (findserver(servlist, jserver))
+ plexus_cmd_squit (jserver, rbuf);
+ plexus_cmd_server (jserver, 2, rbuf);
+ new_server (me_server, jserver, rbuf, SERVER_JUPED, NULL);
+}
+
+/*
+ 1 = valid nick
+ 0 = nick is in valid
+*/
+int
+plexus_valid_nick (char *nick)
+{
+ /* no hard coded invalid nicks */
+ return 1;
+}
+
+/*
+ 1 = valid chan
+ 0 = chan is in valid
+*/
+int
+plexus_valid_chan (char *chan)
+{
+ /* no hard coded invalid chan */
+ return 1;
+}
+
+
+void
+plexus_cmd_ctcp (char *source, char *dest, char *buf)
+{
+ char *s;
+
+ if (!buf)
+ {
+ return;
+ }
+ else
+ {
+ s = normalizeBuffer (buf);
+ }
+
+ send_cmd (source, "NOTICE %s :\1%s \1", dest, s);
+ free (s);
+}
+
+
+/**
+ * Tell anope which function we want to perform each task inside of anope.
+ * These prototypes must match what anope expects.
+ **/
+void
+moduleAddAnopeCmds ()
+{
+ pmodule_cmd_svsnoop (plexus_cmd_svsnoop);
+ pmodule_cmd_remove_akill (plexus_cmd_remove_akill);
+ pmodule_cmd_topic (plexus_cmd_topic);
+ pmodule_cmd_vhost_off (plexus_cmd_vhost_off);
+ pmodule_cmd_akill (plexus_cmd_akill);
+ pmodule_cmd_svskill (plexus_cmd_svskill);
+ pmodule_cmd_svsmode (plexus_cmd_svsmode);
+ pmodule_cmd_372 (plexus_cmd_372);
+ pmodule_cmd_372_error (plexus_cmd_372_error);
+ pmodule_cmd_375 (plexus_cmd_375);
+ pmodule_cmd_376 (plexus_cmd_376);
+ pmodule_cmd_nick (plexus_cmd_nick);
+ pmodule_cmd_guest_nick (plexus_cmd_guest_nick);
+ pmodule_cmd_mode (plexus_cmd_mode);
+ pmodule_cmd_bot_nick (plexus_cmd_bot_nick);
+ pmodule_cmd_kick (plexus_cmd_kick);
+ pmodule_cmd_notice_ops (plexus_cmd_notice_ops);
+ pmodule_cmd_notice (plexus_cmd_notice);
+ pmodule_cmd_notice2 (plexus_cmd_notice2);
+ pmodule_cmd_privmsg (plexus_cmd_privmsg);
+ pmodule_cmd_privmsg2 (plexus_cmd_privmsg2);
+ pmodule_cmd_serv_notice (plexus_cmd_serv_notice);
+ pmodule_cmd_serv_privmsg (plexus_cmd_serv_privmsg);
+ pmodule_cmd_bot_chan_mode (plexus_cmd_bot_chan_mode);
+ pmodule_cmd_351 (plexus_cmd_351);
+ pmodule_cmd_quit (plexus_cmd_quit);
+ pmodule_cmd_pong (plexus_cmd_pong);
+ pmodule_cmd_join (plexus_cmd_join);
+ pmodule_cmd_unsqline (plexus_cmd_unsqline);
+ pmodule_cmd_invite (plexus_cmd_invite);
+ pmodule_cmd_part (plexus_cmd_part);
+ pmodule_cmd_391 (plexus_cmd_391);
+ pmodule_cmd_250 (plexus_cmd_250);
+ pmodule_cmd_307 (plexus_cmd_307);
+ pmodule_cmd_311 (plexus_cmd_311);
+ pmodule_cmd_312 (plexus_cmd_312);
+ pmodule_cmd_317 (plexus_cmd_317);
+ pmodule_cmd_219 (plexus_cmd_219);
+ pmodule_cmd_401 (plexus_cmd_401);
+ pmodule_cmd_318 (plexus_cmd_318);
+ pmodule_cmd_242 (plexus_cmd_242);
+ pmodule_cmd_243 (plexus_cmd_243);
+ pmodule_cmd_211 (plexus_cmd_211);
+ pmodule_cmd_global (plexus_cmd_global);
+ pmodule_cmd_global_legacy (plexus_cmd_global_legacy);
+ pmodule_cmd_sqline (plexus_cmd_sqline);
+ pmodule_cmd_squit (plexus_cmd_squit);
+ pmodule_cmd_svso (plexus_cmd_svso);
+ pmodule_cmd_chg_nick (plexus_cmd_chg_nick);
+ pmodule_cmd_svsnick (plexus_cmd_svsnick);
+ pmodule_cmd_vhost_on (plexus_cmd_vhost_on);
+ pmodule_cmd_connect (plexus_cmd_connect);
+ pmodule_cmd_svshold (plexus_cmd_svshold);
+ pmodule_cmd_release_svshold (plexus_cmd_release_svshold);
+ pmodule_cmd_unsgline (plexus_cmd_unsgline);
+ pmodule_cmd_unszline (plexus_cmd_unszline);
+ pmodule_cmd_szline (plexus_cmd_szline);
+ pmodule_cmd_sgline (plexus_cmd_sgline);
+ pmodule_cmd_unban (plexus_cmd_unban);
+ pmodule_cmd_svsmode_chan (plexus_cmd_svsmode_chan);
+ pmodule_cmd_svid_umode (plexus_cmd_svid_umode);
+ pmodule_cmd_nc_change (plexus_cmd_nc_change);
+ pmodule_cmd_svid_umode2 (plexus_cmd_svid_umode2);
+ pmodule_cmd_svid_umode3 (plexus_cmd_svid_umode3);
+ pmodule_cmd_svsjoin (plexus_cmd_svsjoin);
+ pmodule_cmd_svspart (plexus_cmd_svspart);
+ pmodule_cmd_swhois (plexus_cmd_swhois);
+ pmodule_cmd_eob (plexus_cmd_eob);
+ pmodule_flood_mode_check (plexus_flood_mode_check);
+ pmodule_cmd_jupe (plexus_cmd_jupe);
+ pmodule_valid_nick (plexus_valid_nick);
+ pmodule_valid_chan (plexus_valid_chan);
+ pmodule_cmd_ctcp (plexus_cmd_ctcp);
+ pmodule_set_umode (plexus_set_umode);
+}
+
+/**
+ * Now tell anope how to use us.
+ **/
+int
+AnopeInit (int argc, char **argv)
+{
+
+ moduleAddAuthor ("Anope");
+ moduleAddVersion ("$Id$");
+ moduleSetType (PROTOCOL);
+
+ pmodule_ircd_version ("hybrid-7.2.1+plexus-3.0.0+");
+ pmodule_ircd_cap (myIrcdcap);
+ pmodule_ircd_var (myIrcd);
+ pmodule_ircd_cbmodeinfos (myCbmodeinfos);
+ pmodule_ircd_cumodes (myCumodes);
+ pmodule_ircd_flood_mode_char_set ("");
+ pmodule_ircd_flood_mode_char_remove ("");
+ pmodule_ircd_cbmodes (myCbmodes);
+ pmodule_ircd_cmmodes (myCmmodes);
+ pmodule_ircd_csmodes (myCsmodes);
+ pmodule_ircd_useTSMode (0);
+
+ /** Deal with modes anope _needs_ to know **/
+ pmodule_invis_umode (UMODE_i);
+ pmodule_oper_umode (UMODE_o);
+ pmodule_invite_cmode (CMODE_i);
+ pmodule_secret_cmode (CMODE_s);
+ pmodule_private_cmode (CMODE_p);
+ pmodule_key_mode (CMODE_k);
+ pmodule_limit_mode (CMODE_l);
+
+ moduleAddAnopeCmds ();
+ moduleAddIRCDMsgs ();
+
+ return MOD_CONT;
+}
+
+/* EOF */
diff --git a/src/protocol/plexus3.h b/src/protocol/plexus3.h
new file mode 100644
index 000000000..eedd4a572
--- /dev/null
+++ b/src/protocol/plexus3.h
@@ -0,0 +1,113 @@
+/* PlexusIRCD IRCD functions
+ *
+ * (C) 2003-2008 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.
+ *
+ *
+ */
+
+#define UMODE_i 0x00000001
+#define UMODE_o 0x00000002
+#define UMODE_w 0x00000004
+#define UMODE_a 0x00000008
+#define UMODE_x 0x00000010
+#define UMODE_S 0x00000020
+#define UMODE_r 0x00000040
+#define UMODE_R 0x00000080
+#define UMODE_N 0x00000100
+
+#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
+#define CMODE_M 0x00001000
+#define CMODE_c 0x00002000
+#define CMODE_O 0x00004000
+#define CMODE_R 0x00008000
+#define CMODE_N 0x00010000
+#define CMODE_B 0x00020000
+#define CMODE_S 0x00040000
+
+#define DEFAULT_MLOCK CMODE_n | CMODE_t
+
+void plexus_set_umode(User * user, int ac, char **av);
+void plexus_cmd_svsnoop(char *server, int set);
+void plexus_cmd_remove_akill(char *user, char *host);
+void plexus_cmd_topic(char *whosets, char *chan, char *whosetit, char *topic, time_t when);
+void plexus_cmd_vhost_off(User * u);
+void plexus_cmd_akill(char *user, char *host, char *who, time_t when,time_t expires, char *reason);
+void plexus_cmd_svskill(char *source, char *user, char *buf);
+void plexus_cmd_svsmode(User * u, int ac, char **av);
+void plexus_cmd_372(char *source, char *msg);
+void plexus_cmd_372_error(char *source);
+void plexus_cmd_375(char *source);
+void plexus_cmd_376(char *source);
+void plexus_cmd_nick(char *nick, char *name, char *modes);
+void plexus_cmd_guest_nick(char *nick, char *user, char *host, char *real, char *modes);
+void plexus_cmd_mode(char *source, char *dest, char *buf);
+void plexus_cmd_bot_nick(char *nick, char *user, char *host, char *real, char *modes);
+void plexus_cmd_kick(char *source, char *chan, char *user, char *buf);
+void plexus_cmd_notice_ops(char *source, char *dest, char *buf);
+void plexus_cmd_notice(char *source, char *dest, char *buf);
+void plexus_cmd_notice2(char *source, char *dest, char *msg);
+void plexus_cmd_privmsg(char *source, char *dest, char *buf);
+void plexus_cmd_privmsg2(char *source, char *dest, char *msg);
+void plexus_cmd_serv_notice(char *source, char *dest, char *msg);
+void plexus_cmd_serv_privmsg(char *source, char *dest, char *msg);
+void plexus_cmd_bot_chan_mode(char *nick, char *chan);
+void plexus_cmd_351(char *source);
+void plexus_cmd_quit(char *source, char *buf);
+void plexus_cmd_pong(char *servname, char *who);
+void plexus_cmd_join(char *user, char *channel, time_t chantime);
+void plexus_cmd_unsqline(char *user);
+void plexus_cmd_invite(char *source, char *chan, char *nick);
+void plexus_cmd_part(char *nick, char *chan, char *buf);
+void plexus_cmd_391(char *source, char *timestr);
+void plexus_cmd_250(char *buf);
+void plexus_cmd_307(char *buf);
+void plexus_cmd_311(char *buf);
+void plexus_cmd_312(char *buf);
+void plexus_cmd_317(char *buf);
+void plexus_cmd_219(char *source, char *letter);
+void plexus_cmd_401(char *source, char *who);
+void plexus_cmd_318(char *source, char *who);
+void plexus_cmd_242(char *buf);
+void plexus_cmd_243(char *buf);
+void plexus_cmd_211(char *buf);
+void plexus_cmd_global(char *source, char *buf);
+void plexus_cmd_global_legacy(char *source, char *fmt);
+void plexus_cmd_sqline(char *mask, char *reason);
+void plexus_cmd_squit(char *servname, char *message);
+void plexus_cmd_svso(char *source, char *nick, char *flag);
+void plexus_cmd_chg_nick(char *oldnick, char *newnick);
+void plexus_cmd_svsnick(char *source, char *guest, time_t when);
+void plexus_cmd_vhost_on(char *nick, char *vIdent, char *vhost);
+void plexus_cmd_connect(int servernum);
+void plexus_cmd_svshold(char *nick);
+void plexus_cmd_release_svshold(char *nick);
+void plexus_cmd_unsgline(char *mask);
+void plexus_cmd_unszline(char *mask);
+void plexus_cmd_szline(char *mask, char *reason, char *whom);
+void plexus_cmd_sgline(char *mask, char *reason);
+void plexus_cmd_unban(char *name, char *nick);
+void plexus_cmd_svsmode_chan(char *name, char *mode, char *nick);
+void plexus_cmd_svid_umode(char *nick, time_t ts);
+void plexus_cmd_nc_change(User * u);
+void plexus_cmd_svid_umode2(User * u, char *ts);
+void plexus_cmd_svid_umode3(User * u, char *ts);
+void plexus_cmd_eob();
+int plexus_flood_mode_check(char *value);
+void plexus_cmd_jupe(char *jserver, char *who, char *reason);
+int plexus_valid_nick(char *nick);
+void plexus_cmd_ctcp(char *source, char *dest, char *buf);
+
+
diff --git a/src/protocol/ptlink.c b/src/protocol/ptlink.c
new file mode 100644
index 000000000..9e6eb08b1
--- /dev/null
+++ b/src/protocol/ptlink.c
@@ -0,0 +1,1800 @@
+/* PTLink IRCD functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ *
+ */
+
+#include "services.h"
+#include "pseudo.h"
+#include "ptlink.h"
+
+IRCDVar myIrcd[] = {
+ {"PTlink 6.15.*+", /* ircd name */
+ "+o", /* nickserv mode */
+ "+o", /* chanserv mode */
+ "+o", /* memoserv mode */
+ "+o", /* hostserv mode */
+ "+io", /* operserv mode */
+ "+o", /* botserv mode */
+ "+h", /* helpserv mode */
+ "+i", /* Dev/Null mode */
+ "+io", /* Global mode */
+ "+o", /* nickserv alias mode */
+ "+o", /* chanserv alias mode */
+ "+o", /* memoserv alias mode */
+ "+io", /* hostserv alias mode */
+ "+io", /* operserv alias mode */
+ "+o", /* botserv alias mode */
+ "+h", /* helpserv alias mode */
+ "+i", /* Dev/Null alias mode */
+ "+io", /* Global alias mode */
+ "+", /* Used by BotServ Bots */
+ 2, /* Chan Max Symbols */
+ "-inpsmtCRKOASdcqBNl", /* Modes to Remove */
+ "+ao", /* Channel Umode used by Botserv bots */
+ 1, /* SVSNICK */
+ 1, /* Vhost */
+ 0, /* Has Owner */
+ NULL, /* Mode to set for an owner */
+ NULL, /* Mode to unset for an owner */
+ "+a", /* Mode to set for chan admin */
+ "-a", /* Mode to unset for chan admin */
+ "+r", /* Mode On Reg */
+ NULL, /* Mode on ID for Roots */
+ NULL, /* Mode on ID for Admins */
+ NULL, /* Mode on ID for Opers */
+ "-r", /* Mode on UnReg */
+ NULL, /* Mode on Nick Change */
+ 1, /* Supports SGlines */
+ 1, /* Supports SQlines */
+ 1, /* Supports SZlines */
+ 0, /* Supports Halfop +h */
+ 4, /* Number of server args */
+ 0, /* Join 2 Set */
+ 0, /* Join 2 Message */
+ 1, /* Has exceptions +e */
+ 0, /* TS Topic Forward */
+ 0, /* TS Topci Backward */
+ 0, /* Protected Umode */
+ 0, /* Has Admin */
+ 0, /* Chan SQlines */
+ 0, /* Quit on Kill */
+ 0, /* SVSMODE unban */
+ 1, /* Has Protect */
+ 0, /* Reverse */
+ 1, /* Chan Reg */
+ CMODE_r, /* Channel Mode */
+ 1, /* vidents */
+ 0, /* svshold */
+ 0, /* time stamp on mode */
+ 0, /* NICKIP */
+ 0, /* O:LINE */
+ 1, /* UMODE */
+ 1, /* VHOST ON NICK */
+ 0, /* Change RealName */
+ CMODE_K, /* No Knock */
+ CMODE_A, /* Admin Only */
+ DEFAULT_MLOCK, /* Default MLOCK */
+ UMODE_VH, /* Vhost Mode */
+ 1, /* +f */
+ 0, /* +L */
+ CMODE_f,
+ 0,
+ 1,
+ 1, /* No Knock requires +i */
+ NULL, /* CAPAB Chan Modes */
+ 0, /* We support TOKENS */
+ 1, /* TOKENS are CASE inSensitive */
+ 0, /* TIME STAMPS are BASE64 */
+ 0, /* +I support */
+ 0, /* SJOIN ban char */
+ 0, /* SJOIN except char */
+ 0, /* SJOIN invite char */
+ 0, /* Can remove User Channel Modes with SVSMODE */
+ 0, /* Sglines are not enforced until user reconnects */
+ NULL, /* vhost char */
+ 0, /* ts6 */
+ 1, /* support helper umode */
+ 0, /* p10 */
+ NULL, /* character set */
+ 0, /* reports sync state */
+ 0, /* CIDR channelbans */
+ }
+ ,
+ {NULL}
+};
+
+IRCDCAPAB myIrcdcap[] = {
+ {
+ 0, /* NOQUIT */
+ 0, /* TSMODE */
+ 0, /* UNCONNECT */
+ 0, /* NICKIP */
+ 0, /* SJOIN */
+ CAPAB_ZIP, /* ZIP */
+ 0, /* BURST */
+ 0, /* TS5 */
+ 0, /* TS3 */
+ 0, /* DKEY */
+ CAPAB_PT4, /* PT4 */
+ CAPAB_SCS, /* SCS */
+ CAPAB_QS, /* QS */
+ 0, /* UID */
+ 0, /* KNOCK */
+ 0, /* CLIENT */
+ 0, /* IPV6 */
+ 0, /* SSJ5 */
+ 0, /* SN2 */
+ 0, /* TOKEN */
+ 0, /* VHOST */
+ 0, /* SSJ3 */
+ 0, /* NICK2 */
+ 0, /* UMODE2 */
+ 0, /* VL */
+ 0, /* TLKEXT */
+ 0, /* DODKEY */
+ 0, /* DOZIP */
+ 0, 0, 0}
+};
+
+
+unsigned long umodes[128] = {
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused, Unused, Horzontal Tab */
+ 0, 0, 0, /* Line Feed, Unused, Unused */
+ 0, 0, 0, /* Carriage Return, Unused, Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused, Unused, Space */
+ 0, 0, 0, /* ! " # */
+ 0, 0, 0, /* $ % & */
+ 0, 0, 0, /* ! ( ) */
+ 0, 0, 0, /* * + , */
+ 0, 0, 0, /* - . / */
+ 0, 0, /* 0 1 */
+ 0, 0, /* 2 3 */
+ 0, 0, /* 4 5 */
+ 0, 0, /* 6 7 */
+ 0, 0, /* 8 9 */
+ 0, 0, /* : ; */
+ 0, 0, 0, /* < = > */
+ 0, 0, /* ? @ */
+ UMODE_A, UMODE_B, 0, /* A B C */
+ 0, 0, 0, /* D E F */
+ 0, UMODE_H, 0, /* G H I */
+ 0, 0, 0, /* J K L */
+ 0, UMODE_N, UMODE_O, /* M N O */
+ 0, 0, UMODE_R, /* P Q R */
+ UMODE_S, UMODE_T, 0, /* S T U */
+ 0, 0, 0, /* V W X */
+ 0, /* Y */
+ 0, /* Z */
+ 0, 0, 0, /* [ \ ] */
+ 0, 0, 0, /* ^ _ ` */
+ UMODE_a, 0, 0, /* a b c */
+ 0, 0, 0, /* d e f */
+ 0, UMODE_h, UMODE_i, /* g h i */
+ 0, 0, 0, /* j k l */
+ 0, 0, UMODE_o, /* m n o */
+ UMODE_p, 0, UMODE_r, /* p q r */
+ UMODE_s, 0, 0, /* s t u */
+ UMODE_v, UMODE_w, 0, /* v w x */
+ UMODE_y, /* y */
+ UMODE_z, /* z */
+ 0, 0, 0, /* { | } */
+ 0, 0 /* ~ � */
+};
+
+char myCsmodes[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,
+
+ 'v', 0, 0, 'a', 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
+};
+
+
+CMMode myCmmodes[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},
+ {add_exception, del_exception},
+ {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}
+};
+
+
+CBMode myCbmodes[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},
+ {CMODE_A, 0, NULL, NULL}, /* A */
+ {CMODE_B, 0, NULL, NULL}, /* B */
+ {CMODE_C, 0, NULL, NULL}, /* C */
+ {0}, /* D */
+ {0}, /* E */
+ {0}, /* F */
+ {0}, /* G */
+ {0}, /* H */
+ {0}, /* I */
+ {0}, /* J */
+ {CMODE_K, 0, NULL, NULL}, /* K */
+ {0}, /* L */
+ {0}, /* M */
+ {CMODE_N, 0, NULL, NULL}, /* N */
+ {CMODE_O, 0, NULL, NULL}, /* O */
+ {0}, /* P */
+ {0}, /* Q */
+ {CMODE_R, 0, NULL, NULL}, /* R */
+ {CMODE_S, 0, NULL, NULL}, /* S */
+ {0}, /* T */
+ {0}, /* U */
+ {0}, /* V */
+ {0}, /* W */
+ {0}, /* X */
+ {0}, /* Y */
+ {0}, /* Z */
+ {0}, {0}, {0}, {0}, {0}, {0},
+ {0}, /* a */
+ {0}, /* b */
+ {CMODE_c, 0, NULL, NULL},
+ {CMODE_d, 0, NULL, NULL},
+ {0}, /* e */
+ {CMODE_f, 0, set_flood, cs_set_flood},
+ {0}, /* g */
+ {0}, /* h */
+ {CMODE_i, 0, NULL, NULL},
+ {0}, /* j */
+ {CMODE_k, 0, chan_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},
+ {CMODE_q, 0, NULL, NULL},
+ {CMODE_r, CBM_NO_MLOCK, NULL, NULL},
+ {CMODE_s, 0, NULL, NULL},
+ {CMODE_t, 0, NULL, NULL},
+ {0},
+ {0}, /* v */
+ {0}, /* w */
+ {0}, /* x */
+ {0}, /* y */
+ {0}, /* z */
+ {0}, {0}, {0}, {0}
+};
+
+CBModeInfo myCbmodeinfos[] = {
+ {'c', CMODE_c, 0, NULL, NULL},
+ {'d', CMODE_d, 0, NULL, NULL},
+ {'f', CMODE_f, 0, get_flood, cs_get_flood},
+ {'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},
+ {'q', CMODE_q, 0, NULL, NULL},
+ {'r', CMODE_r, 0, NULL, NULL},
+ {'s', CMODE_s, 0, NULL, NULL},
+ {'t', CMODE_t, 0, NULL, NULL},
+ {'A', CMODE_A, 0, NULL, NULL},
+ {'B', CMODE_B, 0, NULL, NULL},
+ {'C', CMODE_C, 0, NULL, NULL},
+ {'K', CMODE_K, 0, NULL, NULL},
+ {'N', CMODE_N, 0, NULL, NULL},
+ {'O', CMODE_O, 0, NULL, NULL},
+ {'R', CMODE_R, 0, NULL, NULL},
+ {'S', CMODE_S, 0, NULL, NULL},
+ {0}
+};
+
+CUMode myCumodes[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},
+
+ {0}, /* a */
+ {0}, /* b */
+ {0}, /* c */
+ {0}, /* d */
+ {0}, /* e */
+ {0}, /* f */
+ {0}, /* g */
+ {0}, /* h */
+ {0}, /* i */
+ {0}, /* j */
+ {0}, /* k */
+ {0}, /* l */
+ {0}, /* m */
+ {0}, /* n */
+ {CUS_OP, CUF_PROTECT_BOTSERV, check_valid_op},
+ {0}, /* p */
+ {0}, /* q */
+ {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}
+};
+
+
+
+void ptlink_cmd_bot_chan_mode(char *nick, char *chan)
+{
+ anope_cmd_mode(s_ChanServ, chan, "%s %s %s", ircd->botchanumode, nick,
+ nick);
+}
+
+/*
+ :%s SJOIN %lu %s %s %s :%s
+ parv[0] = sender
+ parv[1] = channel TS (channel creation time)
+ parv[2] = channel
+ parv[3] = modes + n arguments (key and/or limit)
+ ... [n] = if(key and/or limit) mode arguments
+ parv[4+n] = flags+nick list (all in one parameter)
+ NOTE: ignore channel modes if we already have the channel with a gr
+*/
+int anope_event_sjoin(char *source, int ac, char **av)
+{
+ do_sjoin(source, ac, av);
+ return MOD_CONT;
+}
+
+/*
+ * 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.
+ */
+/*
+ :%s NEWMASK %s
+ parv[0] = sender
+ parv[1] = new mask (if no '@', hostname is assumed)
+*/
+int anope_event_newmask(char *source, int ac, char **av)
+{
+ User *u;
+ char *newhost = NULL, *newuser = NULL;
+ int tofree = 0;
+
+ if (ac != 1)
+ return MOD_CONT;
+ u = finduser(source);
+
+ if (!u) {
+ if (debug) {
+ alog("debug: NEWMASK for nonexistent user %s", av[0]);
+ }
+ return MOD_CONT;
+ }
+
+ if ((u->mode & (UMODE_NM | UMODE_VH)) == (UMODE_NM | UMODE_VH)) {
+ /* This NEWMASK should be discarded because it's sent due to a +r by
+ * someone with a ptlink-masked host. PTlink has our correct host, so
+ * we can just ignore this :) Or we'll get ptlink's old host which is
+ * not what we want. -GD
+ */
+ u->mode &= ~UMODE_NM;
+ if (debug)
+ alog("debug: Ignoring NEWMASK because it's send because of SVSMODE +r");
+ return MOD_CONT;
+ }
+
+ newuser = myStrGetOnlyToken(av[0], '@', 0);
+ if (newuser) {
+ newhost = myStrGetTokenRemainder(av[0], '@', 1);
+ tofree = 1;
+ change_user_username(u, newuser);
+ free(newuser);
+ } else {
+ newhost = av[0];
+ }
+
+ if (newhost && *newhost == '@')
+ newhost++;
+
+ u->mode |= UMODE_VH;
+
+ if (newhost)
+ change_user_host(u, newhost);
+
+ if (tofree)
+ free(newhost);
+
+ return MOD_CONT;
+}
+
+/*
+ NICK %s %d %lu %s %s %s %s %s :%s
+ parv[0] = nickname
+ parv[1] = hopcount
+ parv[2] = nick TS (nick introduction time)
+ parv[3] = umodes
+ parv[4] = username
+ parv[5] = hostname
+ parv[6] = spoofed hostname
+ parv[7] = server
+ parv[8] = nick info
+*/
+/*
+ Change NICK
+ parv[0] = old nick
+ parv[1] = new nick
+ parv[2] = TS (timestamp from user's server when nick changed was received)
+*/
+/*
+ NICK xpto 2 561264 +rw irc num.myisp.pt mask.myisp.pt uc.ptlink.net :Just me
+ 0 1 2 3 4 5 6 7 8
+
+*/
+int anope_event_nick(char *source, int ac, char **av)
+{
+ User *user;
+
+ if (ac != 2) {
+ user = do_nick(source, av[0], av[4], av[5], av[7], av[8],
+ strtoul(av[2], NULL, 10), 0, 0, av[6], NULL);
+ if (user)
+ anope_set_umode(user, 1, &av[3]);
+ } else {
+ do_nick(source, av[0], NULL, NULL, NULL, NULL,
+ strtoul(av[1], NULL, 10), 0, 0, NULL, NULL);
+ }
+ return MOD_CONT;
+}
+
+/*
+ :%s SERVER %s %d %s :%s
+ parv[0] = server from where the server was introduced to us
+ parv[1] = server name
+ parv[2] = hop count (1 wen are directly connected)
+ parv[3] = server version
+ parv[4] = server description
+*/
+int anope_event_server(char *source, int ac, char **av)
+{
+ if (!stricmp(av[1], "1")) {
+ uplink = sstrdup(av[0]);
+ }
+ do_server(source, av[0], av[1], av[3], NULL);
+ return MOD_CONT;
+}
+
+int anope_event_436(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+
+ m_nickcoll(av[0]);
+ return MOD_CONT;
+}
+
+
+void moduleAddIRCDMsgs(void)
+{
+ Message *m;
+
+ updateProtectDetails("PROTECT", "PROTECTME", "protect", "deprotect",
+ "AUTOPROTECT", "+a", "-a");
+
+ m = createMessage("401", anope_event_null);
+ addCoreMessage(IRCD, m);
+ m = createMessage("402", anope_event_null);
+ addCoreMessage(IRCD, m);
+ m = createMessage("436", anope_event_436);
+ addCoreMessage(IRCD, m);
+ m = createMessage("461", anope_event_null);
+ addCoreMessage(IRCD, m);
+ m = createMessage("AWAY", anope_event_away);
+ addCoreMessage(IRCD, m);
+ m = createMessage("INVITE", anope_event_invite);
+ addCoreMessage(IRCD, m);
+ m = createMessage("JOIN", anope_event_join);
+ addCoreMessage(IRCD, m);
+ m = createMessage("KICK", anope_event_kick);
+ addCoreMessage(IRCD, m);
+ m = createMessage("KILL", anope_event_kill);
+ addCoreMessage(IRCD, m);
+ m = createMessage("MODE", anope_event_mode);
+ addCoreMessage(IRCD, m);
+ m = createMessage("MOTD", anope_event_motd);
+ addCoreMessage(IRCD, m);
+ m = createMessage("NICK", anope_event_nick);
+ addCoreMessage(IRCD, m);
+ m = createMessage("NOTICE", anope_event_notice);
+ addCoreMessage(IRCD, m);
+ m = createMessage("PART", anope_event_part);
+ addCoreMessage(IRCD, m);
+ m = createMessage("PASS", anope_event_pass);
+ addCoreMessage(IRCD, m);
+ m = createMessage("PING", anope_event_ping);
+ addCoreMessage(IRCD, m);
+ m = createMessage("PRIVMSG", anope_event_privmsg);
+ addCoreMessage(IRCD, m);
+ m = createMessage("QUIT", anope_event_quit);
+ addCoreMessage(IRCD, m);
+ m = createMessage("SERVER", anope_event_server);
+ addCoreMessage(IRCD, m);
+ m = createMessage("SQUIT", anope_event_squit);
+ addCoreMessage(IRCD, m);
+ m = createMessage("TOPIC", anope_event_topic);
+ addCoreMessage(IRCD, m);
+ m = createMessage("USER", anope_event_null);
+ addCoreMessage(IRCD, m);
+ m = createMessage("WALLOPS", anope_event_null);
+ addCoreMessage(IRCD, m);
+ m = createMessage("WHOIS", anope_event_whois);
+ addCoreMessage(IRCD, m);
+ m = createMessage("AKILL", anope_event_null);
+ addCoreMessage(IRCD, m);
+ m = createMessage("GLOBOPS", anope_event_null);
+ addCoreMessage(IRCD, m);
+ m = createMessage("GNOTICE", anope_event_null);
+ addCoreMessage(IRCD, m);
+ m = createMessage("GOPER", anope_event_null);
+ addCoreMessage(IRCD, m);
+ m = createMessage("RAKILL", anope_event_null);
+ addCoreMessage(IRCD, m);
+ m = createMessage("SILENCE", anope_event_null);
+ addCoreMessage(IRCD, m);
+ m = createMessage("SVSKILL", anope_event_null);
+ addCoreMessage(IRCD, m);
+ m = createMessage("SVSMODE", anope_event_null);
+ addCoreMessage(IRCD, m);
+ m = createMessage("SVSNICK", anope_event_null);
+ addCoreMessage(IRCD, m);
+ m = createMessage("SVSNOOP", anope_event_null);
+ addCoreMessage(IRCD, m);
+ m = createMessage("SQLINE", anope_event_null);
+ addCoreMessage(IRCD, m);
+ m = createMessage("UNSQLINE", anope_event_null);
+ addCoreMessage(IRCD, m);
+ m = createMessage("NEWMASK", anope_event_newmask);
+ addCoreMessage(IRCD, m);
+ m = createMessage("CAPAB", anope_event_capab);
+ addCoreMessage(IRCD, m);
+ m = createMessage("SVINFO", anope_event_svinfo);
+ addCoreMessage(IRCD, m);
+ m = createMessage("SVSINFO", anope_event_svsinfo);
+ addCoreMessage(IRCD, m);
+ m = createMessage("SJOIN", anope_event_sjoin);
+ addCoreMessage(IRCD, m);
+ m = createMessage("REHASH", anope_event_rehash);
+ addCoreMessage(IRCD, m);
+ m = createMessage("ADMIN", anope_event_admin);
+ addCoreMessage(IRCD, m);
+ m = createMessage("CREDITS", anope_event_credits);
+ addCoreMessage(IRCD, m);
+ m = createMessage("ERROR", anope_event_error);
+ addCoreMessage(IRCD, m);
+ m = createMessage("NJOIN", anope_event_sjoin);
+ addCoreMessage(IRCD, m);
+ m = createMessage("NNICK", anope_event_nick);
+ addCoreMessage(IRCD, m);
+ m = createMessage("ZLINE", anope_event_null);
+ addCoreMessage(IRCD, m);
+ m = createMessage("UNZLINE", anope_event_null);
+ addCoreMessage(IRCD, m);
+}
+
+int anope_event_svsinfo(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_svinfo(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+/* Event: PROTOCTL */
+int anope_event_capab(char *source, int ac, char **av)
+{
+ capab_parse(ac, av);
+ return MOD_CONT;
+}
+
+/*
+ :%s SQLINE %s :%s
+ parv[0] = sender
+ parv[1] = sqlined nick/mask
+ parv[2] = reason
+*/
+void ptlink_cmd_sqline(char *mask, char *reason)
+{
+ send_cmd(ServerName, "SQLINE %s :%s", mask, reason);
+}
+
+/*
+ :%s SVSADMIN %s :%s
+ parv[0] = sender (services client)
+ parv[1] = target server
+ parv[2] = operation
+ operations:
+ noopers - remove existing opers and disable o:lines
+*/
+void ptlink_cmd_svsnoop(char *server, int set)
+{
+ send_cmd(NULL, "SVSADMIN %s :%s", server, set ? "noopers" : "rehash");
+}
+
+void ptlink_cmd_svsadmin(char *server, int set)
+{
+ ptlink_cmd_svsnoop(server, set);
+}
+
+/*
+ :%s UNGLINE %s
+ parv[0] = sender (server if on network synchronization)
+ parv[1] = glined usert@host mask or ALL to remove all glines
+*/
+void ptlink_cmd_remove_akill(char *user, char *host)
+{
+ send_cmd(NULL, "UNGLINE %s@%s", user, host);
+}
+
+
+void anope_part(char *nick, char *chan)
+{
+ send_cmd(nick, "PART %s", chan);
+}
+void anope_topic(char *whosets, char *chan, char *whosetit, char *topic,
+ time_t when)
+{
+ send_cmd(whosets, "TOPIC %s %s %lu :%s", chan, whosetit,
+ (unsigned long int) when, topic);
+}
+
+/*
+ :%s UNSQLINE %s
+ parv[0] = sender
+ parv[1] = sqlined nick/mask
+*/
+void ptlink_cmd_unsqline(char *user)
+{
+ send_cmd(NULL, "UNSQLINE %s", user);
+}
+
+void ptlink_cmd_join(char *user, char *channel, time_t chantime)
+{
+ send_cmd(ServerName, "SJOIN %ld %s + :%s", (long int) chantime,
+ channel, user);
+}
+
+/*
+ :%s GLINE %s %lu %s %s
+ parv[0] = sender (server if on network synchronization)
+ parv[1] = glined usert@host mask
+ parv[2] = gline duration time (seconds)
+ parv[3] = who added the gline
+ parv[4] = reason
+*/
+void ptlink_cmd_akill(char *user, char *host, char *who, time_t when,
+ time_t expires, char *reason)
+{
+ send_cmd(ServerName, "GLINE %s@%s %i %s :%s", user, host, 86400 * 2,
+ who, reason);
+}
+
+
+void ptlink_cmd_svskill(char *source, char *user, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ if (!source || !user) {
+ return;
+ }
+
+ send_cmd(source, "KILL %s :%s", user, buf);
+}
+
+/*
+ :%s SVSMODE %s %s :%s
+ parv[0] = sender (services client)
+ parv[1] = target client nick
+ parv[2] = mode changes
+ parv[3] = extra parameter ( if news setting mode(+n) )
+ e.g.: :NickServ SVSMODE Lamego +rn 1991234
+*/
+void ptlink_cmd_svsmode(User * u, int ac, char **av)
+{
+ send_cmd(ServerName, "SVSMODE %s %s%s%s", u->nick, av[0],
+ (ac == 2 ? " " : ""), (ac == 2 ? av[1] : ""));
+
+ /* If we set +r on someone +NRah (1 or more of those modes), PTlink will
+ * send us a NEWMASK with their ptlink-masked-host. If we want HostServ
+ * to work for them, we will need to send our NEWMASK after we receive
+ * theirs. Thus we make a hack and store in moduleData that we need to
+ * look out for that.
+ */
+ if ((strchr(av[0], 'r')
+ && ((u->mode & UMODE_N) || (u->mode & UMODE_R)
+ || (u->mode & UMODE_a) || (u->mode & UMODE_h))))
+ u->mode |= UMODE_NM;
+}
+
+int anope_event_error(char *source, int ac, char **av)
+{
+ if (ac >= 1) {
+ if (debug) {
+ alog("debug: %s", av[0]);
+ }
+ }
+ return MOD_CONT;
+}
+
+void ptlink_cmd_squit(char *servname, char *message)
+{
+ send_cmd(NULL, "SQUIT %s :%s", servname, message);
+}
+
+/* PONG */
+void ptlink_cmd_pong(char *servname, char *who)
+{
+ send_cmd(servname, "PONG %s", who);
+}
+
+/*
+ SVINFO %d %d
+ parv[0] = server name
+ parv[1] = current supported protocol version
+ parv[2] = minimum supported protocol version
+
+ See the ptlink.h for information on PTLINK_TS_CURRENT, and
+ PTLINK_TS_MIN
+*/
+void ptlink_cmd_svinfo()
+{
+#if defined(PTLINK_TS_CURRENT) && defined(PTLINK_TS_MIN)
+ send_cmd(NULL, "SVINFO %d %d %lu", PTLINK_TS_CURRENT, PTLINK_TS_MIN,
+ (unsigned long int) time(NULL));
+#else
+ /* hardwired if the defs some how go missing */
+ send_cmd(NULL, "SVINFO 6 3 %lu", (unsigned long int) time(NULL));
+#endif
+}
+
+/*
+ SVSINFO %lu %d
+ parv[0] = sender (server name)
+ parv[1] = local services data TS
+ parv[1] = max global users
+*/
+void ptlink_cmd_svsinfo()
+{
+ send_cmd(NULL, "SVSINFO %lu %d", (unsigned long int) time(NULL),
+ maxusercnt);
+}
+
+/*
+ PASS %s :TS
+ parv[1] = connection password
+ (TS indicates this is server uses TS protocol and SVINFO will be sent
+ for protocol compatibility checking)
+*/
+void ptlink_cmd_pass(char *pass)
+{
+ send_cmd(NULL, "PASS %s :TS", pass);
+}
+
+/*
+ CAPAB :%s
+ parv[1] = capability list
+*/
+void ptlink_cmd_capab()
+{
+ send_cmd(NULL, "CAPAB :QS PTS4");
+}
+
+
+void ptlink_cmd_server(char *servname, int hop, char *descript)
+{
+ send_cmd(NULL, "SERVER %s %d Anope.Services%s :%s", servname, hop,
+ version_number_dotted, descript);
+}
+void ptlink_cmd_connect(int servernum)
+{
+ me_server =
+ new_server(NULL, ServerName, ServerDesc, SERVER_ISME, NULL);
+
+ if (servernum == 1)
+ ptlink_cmd_pass(RemotePassword);
+ else if (servernum == 2)
+ ptlink_cmd_pass(RemotePassword2);
+ else if (servernum == 3)
+ ptlink_cmd_pass(RemotePassword3);
+
+ ptlink_cmd_capab();
+ ptlink_cmd_server(ServerName, 1, ServerDesc);
+ ptlink_cmd_svinfo();
+ ptlink_cmd_svsinfo();
+}
+
+
+
+int anope_event_privmsg(char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+ m_privmsg(source, av[0], av[1]);
+ return MOD_CONT;
+}
+
+int anope_event_part(char *source, int ac, char **av)
+{
+ if (ac < 1 || ac > 2)
+ return MOD_CONT;
+ do_part(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_whois(char *source, int ac, char **av)
+{
+ if (source && ac >= 1) {
+ m_whois(source, av[0]);
+ }
+ return MOD_CONT;
+}
+
+/*
+ :%s TOPIC %s %s %lu :%s
+ parv[0] = sender prefix
+ parv[1] = channel
+ parv[2] = topic nick
+ parv[3] = topic time
+ parv[4] = topic text
+*/
+int anope_event_topic(char *source, int ac, char **av)
+{
+ if (ac != 4)
+ return MOD_CONT;
+ do_topic(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_squit(char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+ do_squit(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_quit(char *source, int ac, char **av)
+{
+ if (ac != 1)
+ return MOD_CONT;
+ do_quit(source, ac, av);
+ return MOD_CONT;
+}
+
+/*
+ :%s MODE %s :%s
+ parv[0] = sender
+ parv[1] = target nick (==sender)
+ parv[2] = mode change string
+*/
+int anope_event_mode(char *source, int ac, char **av)
+{
+ if (ac < 2)
+ return MOD_CONT;
+
+ if (*av[0] == '#' || *av[0] == '&') {
+ do_cmode(source, ac, av);
+ } else {
+ do_umode(source, ac, av);
+ }
+ return MOD_CONT;
+}
+
+
+int anope_event_kill(char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+
+ m_kill(av[0], av[1]);
+ return MOD_CONT;
+}
+
+int anope_event_kick(char *source, int ac, char **av)
+{
+ if (ac != 3)
+ return MOD_CONT;
+ do_kick(source, ac, av);
+ return MOD_CONT;
+}
+
+
+int anope_event_join(char *source, int ac, char **av)
+{
+ if (ac != 1)
+ return MOD_CONT;
+ do_join(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_motd(char *source, int ac, char **av)
+{
+ if (!source) {
+ return MOD_CONT;
+ }
+
+ m_motd(source);
+ return MOD_CONT;
+}
+
+void ptlink_cmd_notice_ops(char *source, char *dest, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "NOTICE @%s :%s", dest, buf);
+}
+
+
+void ptlink_cmd_notice(char *source, char *dest, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ if (NSDefFlags & NI_MSG) {
+ ptlink_cmd_privmsg2(source, dest, buf);
+ } else {
+ send_cmd(source, "NOTICE %s :%s", dest, buf);
+ }
+}
+
+void ptlink_cmd_notice2(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "NOTICE %s :%s", dest, msg);
+}
+
+void ptlink_cmd_privmsg(char *source, char *dest, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(source, "PRIVMSG %s :%s", dest, buf);
+}
+
+void ptlink_cmd_privmsg2(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "PRIVMSG %s :%s", dest, msg);
+}
+
+void ptlink_cmd_serv_notice(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "NOTICE $%s :%s", dest, msg);
+}
+
+void ptlink_cmd_serv_privmsg(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "PRIVMSG $%s :%s", dest, msg);
+}
+
+/* GLOBOPS */
+void ptlink_cmd_global(char *source, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(source ? source : ServerName, "GLOBOPS :%s", buf);
+}
+
+/* 391 */
+void ptlink_cmd_391(char *source, char *timestr)
+{
+ if (!timestr) {
+ return;
+ }
+ send_cmd(NULL, "391 :%s %s :%s", source, ServerName, timestr);
+}
+
+/* 250 */
+void ptlink_cmd_250(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "250 %s", buf);
+}
+
+/* 307 */
+void ptlink_cmd_307(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "307 %s", buf);
+}
+
+/* 311 */
+void ptlink_cmd_311(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "311 %s", buf);
+}
+
+/* 312 */
+void ptlink_cmd_312(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "312 %s", buf);
+}
+
+/* 317 */
+void ptlink_cmd_317(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "317 %s", buf);
+}
+
+/* 219 */
+void ptlink_cmd_219(char *source, char *letter)
+{
+ if (!source) {
+ return;
+ }
+
+ if (letter) {
+ send_cmd(NULL, "219 %s %c :End of /STATS report.", source,
+ *letter);
+ } else {
+ send_cmd(NULL, "219 %s l :End of /STATS report.", source);
+ }
+}
+
+/* 401 */
+void ptlink_cmd_401(char *source, char *who)
+{
+ if (!source || !who) {
+ return;
+ }
+ send_cmd(ServerName, "401 %s %s :No such service.", source, who);
+}
+
+/* 318 */
+void ptlink_cmd_318(char *source, char *who)
+{
+ if (!source || !who) {
+ return;
+ }
+
+ send_cmd(ServerName, "318 %s %s :End of /WHOIS list.", source, who);
+}
+
+/* 242 */
+void ptlink_cmd_242(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "242 %s", buf);
+}
+
+/* 243 */
+void ptlink_cmd_243(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "243 %s", buf);
+}
+
+/* 211 */
+void ptlink_cmd_211(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "211 %s", buf);
+}
+
+void ptlink_cmd_mode(char *source, char *dest, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(source, "MODE %s %s", dest, buf);
+}
+
+/*
+ NICK %s %d %lu %s %s %s %s %s :%s
+ parv[1] = nickname
+ parv[2] = hopcount
+ parv[3] = nick TS (nick introduction time)
+ parv[4] = umodes
+ parv[5] = username
+ parv[6] = hostname
+ parv[7] = spoofed hostname
+ parv[8] = server
+ parv[9] = nick info
+*/
+void ptlink_cmd_nick(char *nick, char *name, char *mode)
+{
+ EnforceQlinedNick(nick, NULL);
+ send_cmd(NULL, "NICK %s 1 %lu %s %s %s %s %s :%s", nick,
+ (unsigned long int) time(NULL), mode, ServiceUser,
+ ServiceHost, ServiceHost, ServerName, name);
+ ptlink_cmd_sqline(nick, "Reserved for services");
+}
+
+void ptlink_cmd_kick(char *source, char *chan, char *user, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ if (buf) {
+ send_cmd(source, "KICK %s %s :%s", chan, user, buf);
+ } else {
+ send_cmd(source, "KICK %s %s", chan, user);
+ }
+}
+
+/* QUIT */
+void ptlink_cmd_quit(char *source, char *buf)
+{
+ if (buf) {
+ send_cmd(source, "QUIT :%s", buf);
+ } else {
+ send_cmd(source, "QUIT");
+ }
+}
+
+void ptlink_cmd_part(char *nick, char *chan, char *buf)
+{
+ if (buf) {
+ send_cmd(nick, "PART %s :%s", chan, buf);
+ } else {
+ send_cmd(nick, "PART %s", chan);
+ }
+}
+
+/*
+ :%s TOPIC %s %s %lu :%s
+ parv[0] = sender prefix
+ parv[1] = channel
+ parv[2] = topic nick
+ parv[3] = topic time
+ parv[4] = topic text
+*/
+void ptlink_cmd_topic(char *whosets, char *chan, char *whosetit,
+ char *topic, time_t when)
+{
+ send_cmd(whosets, "TOPIC %s %s %lu :%s", chan, whosetit,
+ (long int) time(NULL), topic);
+}
+
+void ptlink_cmd_vhost_off(User * u)
+{
+ /* does not support vhosting */
+}
+
+void ptlink_cmd_vhost_on(char *nick, char *vIdent, char *vhost)
+{
+ User *u;
+
+ if (vIdent) {
+ send_cmd(s_HostServ, "NEWMASK %s@%s %s", vIdent, vhost, nick);
+ } else {
+ send_cmd(s_HostServ, "NEWMASK %s %s", vhost, nick);
+ }
+
+ if ((u = finduser(nick)))
+ u->mode |= UMODE_VH;
+}
+
+/* INVITE */
+void ptlink_cmd_invite(char *source, char *chan, char *nick)
+{
+ if (!source || !chan || !nick) {
+ return;
+ }
+
+ send_cmd(source, "INVITE %s %s", nick, chan);
+}
+
+void ptlink_cmd_372(char *source, char *msg)
+{
+ send_cmd(ServerName, "372 %s :- %s", source, msg);
+}
+
+void ptlink_cmd_372_error(char *source)
+{
+ send_cmd(ServerName, "422 %s :- MOTD file not found! Please "
+ "contact your IRC administrator.", source);
+}
+
+void ptlink_cmd_375(char *source)
+{
+ send_cmd(ServerName, "375 %s :- %s Message of the Day",
+ source, ServerName);
+}
+
+void ptlink_cmd_376(char *source)
+{
+ send_cmd(ServerName, "376 %s :End of /MOTD command.", source);
+}
+
+
+void ptlink_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) {
+
+ /* This looks better, much better than "add ? (do_add) : (do_remove)".
+ * At least this is readable without paying much attention :) -GD
+ */
+ if (add)
+ user->mode |= umodes[(int) *modes];
+ else
+ user->mode &= ~umodes[(int) *modes];
+
+ switch (*modes++) {
+ case '+':
+ add = 1;
+ break;
+ case '-':
+ add = 0;
+ break;
+ case 'o':
+ if (add) {
+ opcnt++;
+
+ if (WallOper)
+ anope_cmd_global(s_OperServ,
+ "\2%s\2 is now an IRC operator.",
+ user->nick);
+ display_news(user, NEWS_OPER);
+ if (is_services_admin(user)) {
+ common_svsmode(user, "+a", NULL);
+ user->mode |= UMODE_a;
+ }
+
+ } else {
+ opcnt--;
+ }
+ break;
+ case 'r':
+ if (add && !nick_identified(user)) {
+ common_svsmode(user, "-r", NULL);
+ user->mode &= ~UMODE_r;
+ }
+ break;
+ }
+ }
+}
+
+int anope_event_ping(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+ ptlink_cmd_pong(ac > 1 ? av[1] : ServerName, av[0]);
+ return MOD_CONT;
+}
+
+int anope_event_away(char *source, int ac, char **av)
+{
+ if (!source) {
+ return MOD_CONT;
+ }
+ m_away(source, (ac ? av[0] : NULL));
+ return MOD_CONT;
+}
+
+void ptlink_cmd_bot_nick(char *nick, char *user, char *host, char *real,
+ char *modes)
+{
+ EnforceQlinedNick(nick, s_BotServ);
+ send_cmd(NULL, "NICK %s 1 %lu %s %s %s %s %s :%s", nick,
+ (unsigned long int) time(NULL), modes, user, host, host,
+ ServerName, real);
+ ptlink_cmd_sqline(nick, "Reserved for services");
+
+}
+
+void ptlink_cmd_351(char *source)
+{
+ send_cmd(ServerName, "351 %s Anope-%s %s :%s - %s (%s) -- %s",
+ source, version_number, ServerName, ircd->name, version_flags,
+ EncModule, version_build);
+
+
+}
+
+/* SVSHOLD - set */
+void ptlink_cmd_svshold(char *nick)
+{
+ /* Not supported by this IRCD */
+}
+
+/* SVSHOLD - release */
+void ptlink_cmd_release_svshold(char *nick)
+{
+ /* Not Supported by this IRCD */
+}
+
+/*
+:%s UNZLINE %s
+ parv[0] = sender
+ parv[1] = zlined host
+*/
+void ptlink_cmd_unszline(char *mask)
+{
+ send_cmd(s_OperServ, "UNZLINE %s", mask);
+}
+
+/*
+:%s ZLINE %s :%s
+ parv[0] = sender
+ parv[1] = zlined host
+ parv[2] = time
+ parv[3] = reason
+*/
+void ptlink_cmd_szline(char *mask, char *reason, char *whom)
+{
+ send_cmd(s_OperServ, "ZLINE %s %ld :%s", mask,
+ (long int) time(NULL) + 86400 * 2, reason);
+}
+
+/*
+:%s UNSXLINE %s
+ parv[0] = sender
+ parv[1] = info ban mask
+*/
+void ptlink_cmd_unsgline(char *mask)
+{
+ send_cmd(ServerName, "UNSXLINE :%s", mask);
+}
+
+
+/*
+ * sxline - add info ban line
+ *
+ * parv[0] = sender prefix
+ * parv[1] = mask length
+ * parv[2] = real name banned mask:reason
+ */
+void ptlink_cmd_sgline(char *mask, char *reason)
+{
+ send_cmd(ServerName, "SXLINE %d :%s:%s", (int) strlen(mask), mask,
+ reason);
+}
+
+/* SVSNICK */
+/*
+ :%s SVSNICK %s %s
+ parv[0] = sender (services client)
+ parv[1] = target client nick
+ parv[2] = new nick
+ e.g.: :NickServ SVSNICK Smiler 67455223 _Smiler-
+*/
+void ptlink_cmd_svsnick(char *source, char *guest, time_t when)
+{
+ if (!source || !guest) {
+ return;
+ }
+ send_cmd(NULL, "SVSNICK %s %s :%ld", source, guest, (long int) when);
+}
+
+void ptlink_cmd_guest_nick(char *nick, char *user, char *host, char *real,
+ char *modes)
+{
+ send_cmd(NULL, "NICK %s 1 %lu %s %s %s %s %s :%s", nick,
+ (unsigned long int) time(NULL), modes, user, host, host,
+ ServerName, real);
+}
+
+
+void ptlink_cmd_unban(char *name, char *nick)
+{
+ /* Not Supported by this IRCD */
+}
+
+/* SVSMODE channel modes */
+
+void ptlink_cmd_svsmode_chan(char *name, char *mode, char *nick)
+{
+ /* Not Supported by this IRCD */
+}
+
+void ptlink_cmd_svso(char *source, char *nick, char *flag)
+{
+ /* Not Supported by this IRCD */
+}
+
+
+/* SVSMODE +d */
+/* sent if svid is something weird */
+void ptlink_cmd_svid_umode(char *nick, time_t ts)
+{
+ /* Not Supported by this ircd */
+}
+
+/* SVSMODE +d */
+/* nc_change was = 1, and there is no na->status */
+void ptlink_cmd_nc_change(User * u)
+{
+ /* Not Supported by this ircd */
+}
+
+/* SVSMODE +d */
+/* sent if svid is something weird */
+void ptlink_cmd_svid_umode2(User * u, char *ts)
+{
+ common_svsmode(u, "+r", NULL);
+}
+
+void ptlink_cmd_svid_umode3(User * u, char *ts)
+{
+ /* Bahamuts have this extra one, since they can check on even nick changes */
+}
+
+/* NICK <newnick> */
+/*
+ :%s NICK %s %lu
+ parv[0] = old nick
+ parv[1] = new nick
+ parv[2] = TS (timestamp from user's server when nick changed was received)
+*/
+void ptlink_cmd_chg_nick(char *oldnick, char *newnick)
+{
+ if (!oldnick || !newnick) {
+ return;
+ }
+
+ send_cmd(oldnick, "NICK %s %ld", newnick, (long int) time(NULL));
+}
+
+/*
+ :%s SVSJOIN %s :%s
+ parv[0] = sender (services client)
+ parv[1] = target client nick
+ parv[2] = channels list
+ :OperServ SVSJOIN Trystan #Admin
+*/
+void ptlink_cmd_svsjoin(char *source, char *nick, char *chan, char *param)
+{
+ send_cmd(source, "SVSJOIN %s %s", nick, chan);
+}
+
+/*
+ :%s SVSPART %s :%s
+ parv[0] = sender (services client)
+ parv[1] = target client nick
+ parv[2] = channels list
+ e.g.: :ChanServ SVSPART mynick 4163321 #Chan1,#Chan2
+*/
+void ptlink_cmd_svspart(char *source, char *nick, char *chan)
+{
+ send_cmd(source, "SVSPART %s :%s", nick, chan);
+}
+
+void ptlink_cmd_swhois(char *source, char *who, char *mask)
+{
+ /* not supported */
+}
+
+int anope_event_notice(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_pass(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_rehash(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_credits(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_admin(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_invite(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int ptlink_flood_mode_check(char *value)
+{
+ char *dp, *end;
+
+ if (value && *value != ':'
+ && (strtoul((*value == '*' ? value + 1 : value), &dp, 10) > 0)
+ && (*dp == ':') && (*(++dp) != 0) && (strtoul(dp, &end, 10) > 0)
+ && (*end == 0)) {
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
+void ptlink_cmd_eob()
+{
+ /* not supported */
+}
+
+void ptlink_cmd_jupe(char *jserver, char *who, char *reason)
+{
+ char rbuf[256];
+
+ snprintf(rbuf, sizeof(rbuf), "Juped by %s%s%s", who,
+ reason ? ": " : "", reason ? reason : "");
+
+ if (findserver(servlist, jserver))
+ ptlink_cmd_squit(jserver, rbuf);
+ ptlink_cmd_server(jserver, 1, rbuf);
+ new_server(me_server, jserver, rbuf, SERVER_JUPED, NULL);
+}
+
+/* GLOBOPS - to handle old WALLOPS */
+void ptlink_cmd_global_legacy(char *source, char *fmt)
+{
+ send_cmd(source ? source : ServerName, "GLOBOPS :%s", fmt);
+}
+
+/*
+ 1 = valid nick
+ 0 = nick is in valid
+*/
+int ptlink_valid_nick(char *nick)
+{
+ /* no hard coded invalid nicks */
+ return 1;
+}
+
+/*
+ 1 = valid chan
+ 0 = chan is in valid
+*/
+int ptlink_valid_chan(char *cahn)
+{
+ /* no hard coded invalid chan */
+ return 1;
+}
+
+
+void ptlink_cmd_ctcp(char *source, char *dest, char *buf)
+{
+ char *s;
+
+ if (!buf) {
+ return;
+ } else {
+ s = normalizeBuffer(buf);
+ }
+
+ send_cmd(source, "NOTICE %s :\1%s \1", dest, s);
+ free(s);
+}
+
+
+/**
+ * Tell anope which function we want to perform each task inside of anope.
+ * These prototypes must match what anope expects.
+ **/
+void moduleAddAnopeCmds()
+{
+ pmodule_cmd_svsnoop(ptlink_cmd_svsnoop);
+ pmodule_cmd_remove_akill(ptlink_cmd_remove_akill);
+ pmodule_cmd_topic(ptlink_cmd_topic);
+ pmodule_cmd_vhost_off(ptlink_cmd_vhost_off);
+ pmodule_cmd_akill(ptlink_cmd_akill);
+ pmodule_cmd_svskill(ptlink_cmd_svskill);
+ pmodule_cmd_svsmode(ptlink_cmd_svsmode);
+ pmodule_cmd_372(ptlink_cmd_372);
+ pmodule_cmd_372_error(ptlink_cmd_372_error);
+ pmodule_cmd_375(ptlink_cmd_375);
+ pmodule_cmd_376(ptlink_cmd_376);
+ pmodule_cmd_nick(ptlink_cmd_nick);
+ pmodule_cmd_guest_nick(ptlink_cmd_guest_nick);
+ pmodule_cmd_mode(ptlink_cmd_mode);
+ pmodule_cmd_bot_nick(ptlink_cmd_bot_nick);
+ pmodule_cmd_kick(ptlink_cmd_kick);
+ pmodule_cmd_notice_ops(ptlink_cmd_notice_ops);
+ pmodule_cmd_notice(ptlink_cmd_notice);
+ pmodule_cmd_notice2(ptlink_cmd_notice2);
+ pmodule_cmd_privmsg(ptlink_cmd_privmsg);
+ pmodule_cmd_privmsg2(ptlink_cmd_privmsg2);
+ pmodule_cmd_serv_notice(ptlink_cmd_serv_notice);
+ pmodule_cmd_serv_privmsg(ptlink_cmd_serv_privmsg);
+ pmodule_cmd_bot_chan_mode(ptlink_cmd_bot_chan_mode);
+ pmodule_cmd_351(ptlink_cmd_351);
+ pmodule_cmd_quit(ptlink_cmd_quit);
+ pmodule_cmd_pong(ptlink_cmd_pong);
+ pmodule_cmd_join(ptlink_cmd_join);
+ pmodule_cmd_unsqline(ptlink_cmd_unsqline);
+ pmodule_cmd_invite(ptlink_cmd_invite);
+ pmodule_cmd_part(ptlink_cmd_part);
+ pmodule_cmd_391(ptlink_cmd_391);
+ pmodule_cmd_250(ptlink_cmd_250);
+ pmodule_cmd_307(ptlink_cmd_307);
+ pmodule_cmd_311(ptlink_cmd_311);
+ pmodule_cmd_312(ptlink_cmd_312);
+ pmodule_cmd_317(ptlink_cmd_317);
+ pmodule_cmd_219(ptlink_cmd_219);
+ pmodule_cmd_401(ptlink_cmd_401);
+ pmodule_cmd_318(ptlink_cmd_318);
+ pmodule_cmd_242(ptlink_cmd_242);
+ pmodule_cmd_243(ptlink_cmd_243);
+ pmodule_cmd_211(ptlink_cmd_211);
+ pmodule_cmd_global(ptlink_cmd_global);
+ pmodule_cmd_global_legacy(ptlink_cmd_global_legacy);
+ pmodule_cmd_sqline(ptlink_cmd_sqline);
+ pmodule_cmd_squit(ptlink_cmd_squit);
+ pmodule_cmd_svso(ptlink_cmd_svso);
+ pmodule_cmd_chg_nick(ptlink_cmd_chg_nick);
+ pmodule_cmd_svsnick(ptlink_cmd_svsnick);
+ pmodule_cmd_vhost_on(ptlink_cmd_vhost_on);
+ pmodule_cmd_connect(ptlink_cmd_connect);
+ pmodule_cmd_svshold(ptlink_cmd_svshold);
+ pmodule_cmd_release_svshold(ptlink_cmd_release_svshold);
+ pmodule_cmd_unsgline(ptlink_cmd_unsgline);
+ pmodule_cmd_unszline(ptlink_cmd_unszline);
+ pmodule_cmd_szline(ptlink_cmd_szline);
+ pmodule_cmd_sgline(ptlink_cmd_sgline);
+ pmodule_cmd_unban(ptlink_cmd_unban);
+ pmodule_cmd_svsmode_chan(ptlink_cmd_svsmode_chan);
+ pmodule_cmd_svid_umode(ptlink_cmd_svid_umode);
+ pmodule_cmd_nc_change(ptlink_cmd_nc_change);
+ pmodule_cmd_svid_umode2(ptlink_cmd_svid_umode2);
+ pmodule_cmd_svid_umode3(ptlink_cmd_svid_umode3);
+ pmodule_cmd_svsjoin(ptlink_cmd_svsjoin);
+ pmodule_cmd_svspart(ptlink_cmd_svspart);
+ pmodule_cmd_swhois(ptlink_cmd_swhois);
+ pmodule_cmd_eob(ptlink_cmd_eob);
+ pmodule_flood_mode_check(ptlink_flood_mode_check);
+ pmodule_cmd_jupe(ptlink_cmd_jupe);
+ pmodule_valid_nick(ptlink_valid_nick);
+ pmodule_valid_chan(ptlink_valid_chan);
+ pmodule_cmd_ctcp(ptlink_cmd_ctcp);
+ pmodule_set_umode(ptlink_set_umode);
+}
+
+/**
+ * Now tell anope how to use us.
+ **/
+int AnopeInit(int argc, char **argv)
+{
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion
+ ("$Id$");
+ moduleSetType(PROTOCOL);
+
+
+ pmodule_ircd_version("PTlink 6.15.*+");
+ pmodule_ircd_cap(myIrcdcap);
+ pmodule_ircd_var(myIrcd);
+ pmodule_ircd_cbmodeinfos(myCbmodeinfos);
+ pmodule_ircd_cumodes(myCumodes);
+ pmodule_ircd_flood_mode_char_set("+f");
+ pmodule_ircd_flood_mode_char_remove("-f");
+ pmodule_ircd_cbmodes(myCbmodes);
+ pmodule_ircd_cmmodes(myCmmodes);
+ pmodule_ircd_csmodes(myCsmodes);
+ pmodule_ircd_useTSMode(0);
+
+ /** Deal with modes anope _needs_ to know **/
+ pmodule_invis_umode(UMODE_i);
+ pmodule_oper_umode(UMODE_o);
+ pmodule_invite_cmode(CMODE_i);
+ pmodule_secret_cmode(CMODE_s);
+ pmodule_private_cmode(CMODE_p);
+ pmodule_key_mode(CMODE_k);
+ pmodule_limit_mode(CMODE_l);
+
+ moduleAddAnopeCmds();
+ moduleAddIRCDMsgs();
+
+ return MOD_CONT;
+}
+
+/* EOF */
diff --git a/src/protocol/ptlink.h b/src/protocol/ptlink.h
new file mode 100644
index 000000000..a7c1d2c3f
--- /dev/null
+++ b/src/protocol/ptlink.h
@@ -0,0 +1,152 @@
+/* PTLink IRCD functions
+ *
+ * (C) 2003-2008 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.
+ *
+ *
+ */
+
+#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
+#define UMODE_B 0x00000080
+#define UMODE_H 0x00000100
+#define UMODE_N 0x00000200
+#define UMODE_O 0x00000400
+#define UMODE_p 0x00000800
+#define UMODE_R 0x00001000
+#define UMODE_s 0x00002000
+#define UMODE_S 0x00004000
+#define UMODE_T 0x00008000
+#define UMODE_v 0x00001000
+#define UMODE_y 0x00002000
+#define UMODE_z 0x00004000
+
+#define UMODE_VH 0x00008000 /* Fake umode used for internal vhost things */
+#define UMODE_NM 0x00010000 /* Fake umode used for internal NEWMASK things */
+/* Let's hope for a better vhost-system with PTlink7 ;) */
+
+
+#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
+#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
+#define CMODE_R 0x00000100 /* Only identified users can join */
+#define CMODE_r 0x00000200 /* Set for all registered channels */
+#define CMODE_C 0x00100000
+
+#define DEFAULT_MLOCK CMODE_n | CMODE_t | CMODE_r
+
+/*
+ The following variables are set to define the TS protocol version
+ that we support.
+
+ PTLink 6.14 to 6.17 TS CURRENT is 6 and MIN is 3
+ PTlink 6.18 TS CURRENT is 9 and MIN is 3
+ PTLink 6.19 TS CURRENT is 10 and MIN is 9
+
+ If you are running 6.18 or 6.19 do not touch these values as they will
+ allow you to connect
+
+ If you are running an older version of PTLink, first think about updating
+ your ircd, or changing the TS_CURRENT to 6 to allow services to connect
+*/
+
+#define PTLINK_TS_CURRENT 9
+#define PTLINK_TS_MIN 3
+
+void ptlink_set_umode(User * user, int ac, char **av);
+void ptlink_cmd_svsnoop(char *server, int set);
+void ptlink_cmd_remove_akill(char *user, char *host);
+void ptlink_cmd_topic(char *whosets, char *chan, char *whosetit, char *topic, time_t when);
+void ptlink_cmd_vhost_off(User * u);
+void ptlink_cmd_akill(char *user, char *host, char *who, time_t when,time_t expires, char *reason);
+void ptlink_cmd_svskill(char *source, char *user, char *buf);
+void ptlink_cmd_svsmode(User * u, int ac, char **av);
+void ptlink_cmd_372(char *source, char *msg);
+void ptlink_cmd_372_error(char *source);
+void ptlink_cmd_375(char *source);
+void ptlink_cmd_376(char *source);
+void ptlink_cmd_nick(char *nick, char *name, char *modes);
+void ptlink_cmd_guest_nick(char *nick, char *user, char *host, char *real, char *modes);
+void ptlink_cmd_mode(char *source, char *dest, char *buf);
+void ptlink_cmd_bot_nick(char *nick, char *user, char *host, char *real, char *modes);
+void ptlink_cmd_kick(char *source, char *chan, char *user, char *buf);
+void ptlink_cmd_notice_ops(char *source, char *dest, char *buf);
+void ptlink_cmd_notice(char *source, char *dest, char *buf);
+void ptlink_cmd_notice2(char *source, char *dest, char *msg);
+void ptlink_cmd_privmsg(char *source, char *dest, char *buf);
+void ptlink_cmd_privmsg2(char *source, char *dest, char *msg);
+void ptlink_cmd_serv_notice(char *source, char *dest, char *msg);
+void ptlink_cmd_serv_privmsg(char *source, char *dest, char *msg);
+void ptlink_cmd_bot_chan_mode(char *nick, char *chan);
+void ptlink_cmd_351(char *source);
+void ptlink_cmd_quit(char *source, char *buf);
+void ptlink_cmd_pong(char *servname, char *who);
+void ptlink_cmd_join(char *user, char *channel, time_t chantime);
+void ptlink_cmd_unsqline(char *user);
+void ptlink_cmd_invite(char *source, char *chan, char *nick);
+void ptlink_cmd_part(char *nick, char *chan, char *buf);
+void ptlink_cmd_391(char *source, char *timestr);
+void ptlink_cmd_250(char *buf);
+void ptlink_cmd_307(char *buf);
+void ptlink_cmd_311(char *buf);
+void ptlink_cmd_312(char *buf);
+void ptlink_cmd_317(char *buf);
+void ptlink_cmd_219(char *source, char *letter);
+void ptlink_cmd_401(char *source, char *who);
+void ptlink_cmd_318(char *source, char *who);
+void ptlink_cmd_242(char *buf);
+void ptlink_cmd_243(char *buf);
+void ptlink_cmd_211(char *buf);
+void ptlink_cmd_global(char *source, char *buf);
+void ptlink_cmd_global_legacy(char *source, char *fmt);
+void ptlink_cmd_sqline(char *mask, char *reason);
+void ptlink_cmd_squit(char *servname, char *message);
+void ptlink_cmd_svso(char *source, char *nick, char *flag);
+void ptlink_cmd_chg_nick(char *oldnick, char *newnick);
+void ptlink_cmd_svsnick(char *source, char *guest, time_t when);
+void ptlink_cmd_vhost_on(char *nick, char *vIdent, char *vhost);
+void ptlink_cmd_connect(int servernum);
+void ptlink_cmd_svshold(char *nick);
+void ptlink_cmd_release_svshold(char *nick);
+void ptlink_cmd_unsgline(char *mask);
+void ptlink_cmd_unszline(char *mask);
+void ptlink_cmd_szline(char *mask, char *reason, char *whom);
+void ptlink_cmd_sgline(char *mask, char *reason);
+void ptlink_cmd_unban(char *name, char *nick);
+void ptlink_cmd_svsmode_chan(char *name, char *mode, char *nick);
+void ptlink_cmd_svid_umode(char *nick, time_t ts);
+void ptlink_cmd_nc_change(User * u);
+void ptlink_cmd_svid_umode2(User * u, char *ts);
+void ptlink_cmd_svid_umode3(User * u, char *ts);
+void ptlink_cmd_eob();
+int ptlink_flood_mode_check(char *value);
+void ptlink_cmd_jupe(char *jserver, char *who, char *reason);
+int ptlink_valid_nick(char *nick);
+void ptlink_cmd_ctcp(char *source, char *dest, char *buf);
+
+
diff --git a/src/protocol/rageircd.c b/src/protocol/rageircd.c
new file mode 100644
index 000000000..94fc7824e
--- /dev/null
+++ b/src/protocol/rageircd.c
@@ -0,0 +1,1679 @@
+/* Rage IRCD functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ *
+ */
+
+#include "services.h"
+#include "pseudo.h"
+#include "rageircd.h"
+
+IRCDVar myIrcd[] = {
+ {"RageIRCd 2.0.*", /* ircd name */
+ "+d", /* nickserv mode */
+ "+d", /* chanserv mode */
+ "+d", /* memoserv mode */
+ "+d", /* hostserv mode */
+ "+di", /* operserv mode */
+ "+d", /* botserv mode */
+ "+dh", /* helpserv mode */
+ "+di", /* Dev/Null mode */
+ "+di", /* Global mode */
+ "+o", /* nickserv alias mode */
+ "+o", /* chanserv alias mode */
+ "+o", /* memoserv alias mode */
+ "+io", /* hostserv alias mode */
+ "+io", /* operserv alias mode */
+ "+o", /* botserv alias mode */
+ "+o", /* helpserv alias mode */
+ "+i", /* Dev/Null alias mode */
+ "+io", /* Global alias mode */
+ "+", /* Used by BotServ Bots */
+ 3, /* Chan Max Symbols */
+ "-ilmnpRstcOACNM", /* Modes to Remove */
+ "+o", /* Channel Umode used by Botserv bots */
+ 1, /* SVSNICK */
+ 1, /* Vhost */
+ 0, /* Has Owner */
+ NULL, /* Mode to set for an owner */
+ NULL, /* Mode to unset for an owner */
+ "+a", /* Mode to set for channel admin */
+ "-a", /* Mode to unset for channel admin */
+ "+rd", /* Mode On Reg */
+ NULL, /* Mode on ID for Roots */
+ NULL, /* Mode on ID for Admins */
+ NULL, /* Mode on ID for Opers */
+ "-rd", /* Mode on UnReg */
+ "-r+d", /* Mode on Nick Change */
+ 1, /* Supports SGlines */
+ 1, /* Supports SQlines */
+ 0, /* Supports SZlines */
+ 1, /* Supports Halfop +h */
+ 3, /* Number of server args */
+ 0, /* Join 2 Set */
+ 0, /* Join 2 Message */
+ 1, /* Has exceptions +e */
+ 0, /* TS Topic Forward */
+ 0, /* TS Topic Backward */
+ 0, /* Protected Umode */
+ 1, /* Has Admin */
+ 1, /* Chan SQlines */
+ 1, /* Quit on Kill */
+ 0, /* SVSMODE unban */
+ 0, /* Has Protect */
+ 0, /* Reverse */
+ 1, /* Chan Reg */
+ CMODE_r, /* Channel Mode */
+ 0, /* vidents */
+ 1, /* svshold */
+ 1, /* time stamp on mode */
+ 1, /* NICKIP */
+ 0, /* O:LINE */
+ 1, /* UMODE */
+ 1, /* VHOST ON NICK */
+ 0, /* Change RealName */
+ CMODE_p, /* No Knock */
+ CMODE_A, /* Admin Only */
+ DEFAULT_MLOCK, /* Default MLOCK */
+ UMODE_x, /* Vhost Mode */
+ 0, /* +f */
+ 0, /* +L */
+ 0,
+ 0,
+ 1,
+ 0, /* No Knock requires +i */
+ NULL, /* CAPAB Chan Modes */
+ 0, /* We support TOKENS */
+ 1, /* TOKENS are CASE inSensitive */
+ 0, /* TIME STAMPS are BASE64 */
+ 1, /* +I support */
+ 0, /* SJOIN ban char */
+ 0, /* SJOIN except char */
+ 0, /* SJOIN invite char */
+ 0, /* Can remove User Channel Modes with SVSMODE */
+ 0, /* Sglines are not enforced until user reconnects */
+ "x", /* vhost char */
+ 0, /* ts6 */
+ 1, /* support helper umode */
+ 0, /* p10 */
+ NULL, /* character set */
+ 1, /* reports sync state */
+ 0, /* CIDR channelbans */
+ }
+ ,
+ {NULL}
+};
+
+IRCDCAPAB myIrcdcap[] = {
+ {
+ CAPAB_NOQUIT, /* NOQUIT */
+ CAPAB_TSMODE, /* TSMODE */
+ CAPAB_UNCONNECT, /* UNCONNECT */
+ 0, /* NICKIP */
+ 0, /* SJOIN */
+ CAPAB_ZIP, /* ZIP */
+ CAPAB_BURST, /* BURST */
+ 0, /* TS5 */
+ 0, /* TS3 */
+ CAPAB_DKEY, /* DKEY */
+ 0, /* PT4 */
+ 0, /* SCS */
+ 0, /* QS */
+ CAPAB_UID, /* UID */
+ 0, /* KNOCK */
+ 0, /* CLIENT */
+ 0, /* IPV6 */
+ 0, /* SSJ5 */
+ CAPAB_SN2, /* SN2 */
+ CAPAB_TOKEN, /* TOKEN */
+ CAPAB_VHOST, /* VHOST */
+ CAPAB_SSJ3, /* SSJ3 */
+ 0, /* NICK2 */
+ 0, /* UMODE2 */
+ 0, /* VL */
+ 0, /* TLKEXT */
+ 0, /* DODKEY */
+ 0, /* DOZIP */
+ 0, 0, 0}
+};
+
+
+unsigned long umodes[128] = {
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused, Unused, Horzontal Tab */
+ 0, 0, 0, /* Line Feed, Unused, Unused */
+ 0, 0, 0, /* Carriage Return, Unused, Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused, Unused, Space */
+ 0, 0, 0, /* ! " # */
+ 0, 0, 0, /* $ % & */
+ 0, 0, 0, /* ! ( ) */
+ 0, 0, 0, /* * + , */
+ 0, 0, 0, /* - . / */
+ 0, 0, /* 0 1 */
+ 0, 0, /* 2 3 */
+ 0, 0, /* 4 5 */
+ 0, 0, /* 6 7 */
+ 0, 0, /* 8 9 */
+ 0, 0, /* : ; */
+ 0, 0, 0, /* < = > */
+ 0, 0, /* ? @ */
+ UMODE_A, 0, 0, /* A B C */
+ 0, 0, 0, /* D E F */
+ 0, 0, 0, /* G H I */
+ 0, 0, 0, /* J K L */
+ 0, 0, 0, /* M N O */
+ 0, 0, UMODE_R, /* P Q R */
+ 0, 0, 0, /* S T U */
+ 0, 0, 0, /* V W X */
+ 0, /* Y */
+ 0, /* Z */
+ 0, 0, 0, /* [ \ ] */
+ 0, 0, 0, /* ^ _ ` */
+ UMODE_a, 0, 0, /* a b c */
+ 0, 0, 0, /* d e f */
+ 0, UMODE_h, UMODE_i, /* g h i */
+ 0, 0, 0, /* j k l */
+ 0, 0, UMODE_o, /* m n o */
+ 0, 0, UMODE_r, /* p q r */
+ 0, 0, 0, /* s t u */
+ 0, UMODE_w, 0, /* v w x */
+ 0, /* y */
+ 0, /* z */
+ 0, 0, 0, /* { | } */
+ 0, 0 /* ~ � */
+};
+
+char myCsmodes[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,
+ 'h', /* (37) % Channel halfops */
+ 0, 0, 0, 0,
+ 'a', /* * Channel Admins */
+
+ '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
+};
+
+
+CMMode myCmmodes[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}, /* BCD */
+ {NULL}, {NULL}, {NULL}, /* EFG */
+ {NULL}, /* H */
+ {add_invite, del_invite},
+ {NULL}, /* J */
+ {NULL}, {NULL}, {NULL}, /* KLM */
+ {NULL}, {NULL}, {NULL}, /* NOP */
+ {NULL}, {NULL}, {NULL}, /* QRS */
+ {NULL}, {NULL}, {NULL}, /* TUV */
+ {NULL}, {NULL}, {NULL}, /* WXY */
+ {NULL}, /* Z */
+ {NULL}, {NULL}, /* (char 91 - 92) */
+ {NULL}, {NULL}, {NULL}, /* (char 93 - 95) */
+ {NULL}, /* ` (char 96) */
+ {NULL}, /* a (char 97) */
+ {add_ban, del_ban},
+ {NULL},
+ {NULL},
+ {add_exception, del_exception},
+ {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}
+};
+
+
+CBMode myCbmodes[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},
+ {CMODE_A, CBM_NO_USER_MLOCK, NULL, NULL},
+ {0}, /* B */
+ {CMODE_C, 0, NULL, NULL},
+ {0}, /* D */
+ {0}, /* E */
+ {0}, /* F */
+ {0}, /* G */
+ {0}, /* H */
+ {0}, /* I */
+ {0}, /* J */
+ {0}, /* K */
+ {0}, /* L */
+ {CMODE_M, 0, NULL, NULL}, /* M */
+ {CMODE_N, 0, NULL, NULL}, /* N */
+ {CMODE_O, CBM_NO_USER_MLOCK, NULL, NULL},
+ {0}, /* P */
+ {0}, /* Q */
+ {CMODE_R, 0, NULL, NULL}, /* R */
+ {CMODE_S, 0, NULL, NULL}, /* S */
+ {0}, /* T */
+ {0}, /* U */
+ {0}, /* V */
+ {0}, /* W */
+ {0}, /* X */
+ {0}, /* Y */
+ {0}, /* Z */
+ {0}, {0}, {0}, {0}, {0}, {0},
+ {0}, /* a */
+ {0}, /* b */
+ {CMODE_c, 0, NULL, NULL},
+ {0}, /* d */
+ {0}, /* e */
+ {0}, /* f */
+ {0}, /* g */
+ {0}, /* h */
+ {CMODE_i, 0, NULL, NULL},
+ {0}, /* j */
+ {CMODE_k, 0, chan_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},
+ {0}, /* q */
+ {CMODE_r, CBM_NO_MLOCK, NULL, NULL},
+ {CMODE_s, 0, NULL, NULL},
+ {CMODE_t, 0, NULL, NULL},
+ {0},
+ {0}, /* v */
+ {0}, /* w */
+ {0}, /* x */
+ {0}, /* y */
+ {0}, /* z */
+ {0}, {0}, {0}, {0}
+};
+
+CBModeInfo myCbmodeinfos[] = {
+ {'c', CMODE_c, 0, NULL, NULL},
+ {'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},
+ {'r', CMODE_r, 0, NULL, NULL},
+ {'s', CMODE_s, 0, NULL, NULL},
+ {'t', CMODE_t, 0, NULL, NULL},
+ {'A', CMODE_A, 0, NULL, NULL},
+ {'C', CMODE_C, 0, NULL, NULL},
+ {'M', CMODE_M, 0, NULL, NULL},
+ {'N', CMODE_N, 0, NULL, NULL},
+ {'O', CMODE_O, 0, NULL, NULL},
+ {'R', CMODE_R, 0, NULL, NULL},
+ {0}
+};
+
+CUMode myCumodes[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},
+ {CUS_PROTECT, CUF_PROTECT_BOTSERV, check_valid_admin},
+ {0}, /* b */
+ {0}, /* c */
+ {0}, /* d */
+ {0}, /* e */
+ {0}, /* f */
+ {0}, /* g */
+ {CUS_HALFOP, 0, check_valid_op},
+ {0}, /* i */
+ {0}, /* j */
+ {0}, /* k */
+ {0}, /* l */
+ {0}, /* m */
+ {0}, /* n */
+ {CUS_OP, CUF_PROTECT_BOTSERV, check_valid_op},
+ {0}, /* p */
+ {0}, /* q */
+ {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}
+};
+
+
+
+void rageircd_cmd_bot_unban(ChannelInfo * ci, char *nick)
+{
+ send_cmd(ServerName, "SVSMODE %s -b %s", ci->name, nick);
+}
+
+int anope_event_sjoin(char *source, int ac, char **av)
+{
+ do_sjoin(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_nick(char *source, int ac, char **av)
+{
+ User *user;
+
+ if (ac != 2) {
+ 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), "*", NULL);
+ if (user)
+ anope_set_umode(user, 1, &av[3]);
+ } else {
+ do_nick(source, av[0], NULL, NULL, NULL, NULL,
+ strtoul(av[1], NULL, 10), 0, 0, NULL, NULL);
+ }
+ return MOD_CONT;
+}
+
+/* Event: PROTOCTL */
+int anope_event_capab(char *source, int ac, char **av)
+{
+ capab_parse(ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_vhost(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 2)
+ return MOD_CONT;
+
+ u = finduser(av[0]);
+ if (!u) {
+ if (debug) {
+ alog("debug: VHOST for nonexistent user %s", av[0]);
+ }
+ return MOD_CONT;
+ }
+
+ change_user_host(u, av[1]);
+ return MOD_CONT;
+}
+
+/*
+** SNICK
+** source = NULL
+** parv[0] = nickname Trystan
+** parv[1] = timestamp 1090113640
+** parv[2] = hops 1
+** parv[3] = username Trystan
+** parv[4] = host c-24-2-101-227.client.comcast.net
+** parv[5] = IP 402810339
+** parv[6] = vhost mynet-27CCA80D.client.comcast.net
+** parv[7] = server rage2.nomadirc.net
+** parv[8] = servicestamp 0
+** parv[9] = modes +ix
+** parv[10] = info Dreams are answers to questions not yet asked
+*/
+
+int anope_event_snick(char *source, int ac, char **av)
+{
+ User *user;
+
+ if (ac != 2) {
+ user = do_nick(source, av[0], av[3], av[4], av[7], av[10],
+ strtoul(av[1], NULL, 10), strtoul(av[8], NULL, 0),
+ strtoul(av[5], NULL, 0), av[6], NULL);
+ if (user) {
+ anope_set_umode(user, 1, &av[9]);
+ }
+ }
+ return MOD_CONT;
+}
+
+int anope_event_436(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+
+ m_nickcoll(av[0]);
+ return MOD_CONT;
+}
+
+
+/* *INDENT-OFF* */
+void moduleAddIRCDMsgs(void) {
+ Message *m;
+
+ updateProtectDetails("ADMIN","ADMINME","admin","deadmin","AUTOADMIN","+a","-a");
+
+ m = createMessage("401", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("402", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("436", anope_event_436); addCoreMessage(IRCD,m);
+ m = createMessage("482", anope_event_482); addCoreMessage(IRCD,m);
+ m = createMessage("461", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("AWAY", anope_event_away); addCoreMessage(IRCD,m);
+ m = createMessage("INVITE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("JOIN", anope_event_join); addCoreMessage(IRCD,m);
+ m = createMessage("KICK", anope_event_kick); addCoreMessage(IRCD,m);
+ m = createMessage("KILL", anope_event_kill); addCoreMessage(IRCD,m);
+ m = createMessage("MODE", anope_event_mode); addCoreMessage(IRCD,m);
+ m = createMessage("MOTD", anope_event_motd); addCoreMessage(IRCD,m);
+ m = createMessage("NICK", anope_event_nick); addCoreMessage(IRCD,m);
+ m = createMessage("NOTICE", anope_event_notice); addCoreMessage(IRCD,m);
+ m = createMessage("PART", anope_event_part); addCoreMessage(IRCD,m);
+ m = createMessage("PASS", anope_event_pass); addCoreMessage(IRCD,m);
+ m = createMessage("PING", anope_event_ping); addCoreMessage(IRCD,m);
+ m = createMessage("PRIVMSG", anope_event_privmsg); addCoreMessage(IRCD,m);
+ m = createMessage("QUIT", anope_event_quit); addCoreMessage(IRCD,m);
+ m = createMessage("SERVER", anope_event_server); addCoreMessage(IRCD,m);
+ m = createMessage("SQUIT", anope_event_squit); addCoreMessage(IRCD,m);
+ m = createMessage("TOPIC", anope_event_topic); addCoreMessage(IRCD,m);
+ m = createMessage("USER", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("WALLOPS", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("WHOIS", anope_event_whois); addCoreMessage(IRCD,m);
+ m = createMessage("AKILL", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("GLOBOPS", anope_event_globops); addCoreMessage(IRCD,m);
+ m = createMessage("GOPER", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("RAKILL", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SILENCE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SVSKILL", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SVSMODE", anope_event_mode); addCoreMessage(IRCD,m);
+ m = createMessage("SVSNICK", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SVSNOOP", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SQLINE", anope_event_sqline); addCoreMessage(IRCD,m);
+ m = createMessage("UNSQLINE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("CAPAB", anope_event_capab); addCoreMessage(IRCD,m);
+ m = createMessage("CS", anope_event_cs); addCoreMessage(IRCD,m);
+ m = createMessage("HS", anope_event_hs); addCoreMessage(IRCD,m);
+ m = createMessage("MS", anope_event_ms); addCoreMessage(IRCD,m);
+ m = createMessage("NS", anope_event_ns); addCoreMessage(IRCD,m);
+ m = createMessage("OS", anope_event_os); addCoreMessage(IRCD,m);
+ m = createMessage("RS", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SGLINE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SJOIN", anope_event_sjoin); addCoreMessage(IRCD,m);
+ m = createMessage("SS", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SVINFO", anope_event_svinfo); addCoreMessage(IRCD,m);
+ m = createMessage("SZLINE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("UNSGLINE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("UNSZLINE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SNICK", anope_event_snick); addCoreMessage(IRCD,m);
+ m = createMessage("VHOST", anope_event_vhost); addCoreMessage(IRCD,m);
+ m = createMessage("MYID", anope_event_myid); addCoreMessage(IRCD,m);
+ m = createMessage("GNOTICE", anope_event_notice); addCoreMessage(IRCD,m);
+ m = createMessage("ERROR", anope_event_error); addCoreMessage(IRCD,m);
+ m = createMessage("BURST", anope_event_burst); addCoreMessage(IRCD,m);
+ m = createMessage("REHASH", anope_event_rehash); addCoreMessage(IRCD,m);
+ m = createMessage("ADMIN", anope_event_admin); addCoreMessage(IRCD,m);
+ m = createMessage("CREDITS", anope_event_credits); addCoreMessage(IRCD,m);
+}
+
+/* *INDENT-ON* */
+int anope_event_error(char *source, int ac, char **av)
+{
+ if (ac >= 1) {
+ if (debug) {
+ alog("debug: %s", av[0]);
+ }
+ }
+ return MOD_CONT;
+}
+
+
+int anope_event_burst(char *source, int ac, char **av)
+{
+ Server *s;
+ s = findserver(servlist, source);
+ if (ac > 1) {
+ /* for future use - start burst */
+} else {
+
+ /* If we found a server with the given source, that one just
+ * finished bursting. If there was no source, then our uplink
+ * server finished bursting. -GD
+ */
+ if (!s && serv_uplink)
+ s = serv_uplink;
+ finish_sync(s, 1);
+}
+
+return MOD_CONT;
+}
+
+void rageircd_cmd_sqline(char *mask, char *reason)
+{
+ if (!mask || !reason) {
+ return;
+ }
+
+ send_cmd(NULL, "SQLINE %s :%s", mask, reason);
+}
+
+void rageircd_cmd_unsgline(char *mask)
+{
+ send_cmd(NULL, "UNSGLINE 0 :%s", mask);
+}
+
+void rageircd_cmd_unszline(char *mask)
+{
+ send_cmd(NULL, "UNSZLINE 0 %s", mask);
+}
+
+void rageircd_cmd_szline(char *mask, char *reason, char *whom)
+{
+ send_cmd(NULL, "SZLINE %s :%s", mask, reason);
+}
+
+void rageircd_cmd_svsnoop(char *server, int set)
+{
+ send_cmd(NULL, "SVSNOOP %s %s", server, (set ? "+" : "-"));
+}
+
+void rageircd_cmd_svsadmin(char *server, int set)
+{
+ rageircd_cmd_svsnoop(server, set);
+}
+
+void rageircd_cmd_sgline(char *mask, char *reason)
+{
+ send_cmd(NULL, "SGLINE %d :%s:%s", (int)strlen(mask), mask, reason);
+
+}
+
+void rageircd_cmd_remove_akill(char *user, char *host)
+{
+ send_cmd(NULL, "RAKILL %s %s", host, user);
+}
+
+
+/* PART */
+void rageircd_cmd_part(char *nick, char *chan, char *buf)
+{
+ if (!nick || !chan) {
+ return;
+ }
+
+ if (buf) {
+ send_cmd(nick, "PART %s :%s", chan, buf);
+ } else {
+ send_cmd(nick, "PART %s", chan);
+ }
+}
+
+void rageircd_cmd_topic(char *whosets, char *chan, char *whosetit,
+ char *topic, time_t when)
+{
+ send_cmd(whosets, "TOPIC %s %s %lu :%s", chan, whosetit,
+ (unsigned long int) when, topic);
+}
+
+void rageircd_cmd_vhost_off(User * u)
+{
+ send_cmd(s_HostServ, "SVSMODE %s -x", u->nick);
+ notice_lang(s_HostServ, u, HOST_OFF_UNREAL, u->nick, ircd->vhostchar);
+}
+
+void rageircd_cmd_chghost(char *nick, char *vhost)
+{
+ if (!nick || !vhost) {
+ return;
+ }
+ send_cmd(ServerName, "VHOST %s %s", nick, vhost);
+}
+
+void rageircd_cmd_vhost_on(char *nick, char *vIdent, char *vhost)
+{
+ send_cmd(s_HostServ, "SVSMODE %s +x", nick);
+ rageircd_cmd_chghost(nick, vhost);
+}
+
+void rageircd_cmd_unsqline(char *user)
+{
+ send_cmd(NULL, "UNSQLINE %s", user);
+}
+
+void rageircd_cmd_join(char *user, char *channel, time_t chantime)
+{
+ send_cmd(user, "SJOIN %ld %s", (long int) chantime, channel);
+}
+
+void rageircd_cmd_akill(char *user, char *host, char *who, time_t when,
+ time_t expires, char *reason)
+{
+ send_cmd(NULL, "AKILL %s %s %d %s %ld :%s", host, user, 86400 * 2, who,
+ (long int) time(NULL), reason);
+}
+
+void rageircd_cmd_svskill(char *source, char *user, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ if (!source || !user) {
+ return;
+ }
+
+ send_cmd(source, "SVSKILL %s :%s", user, buf);
+}
+
+void rageircd_cmd_svsmode(User * u, int ac, char **av)
+{
+ send_cmd(ServerName, "SVSMODE %s %ld %s%s%s", u->nick,
+ (long int) u->timestamp, av[0], (ac == 2 ? " " : ""),
+ (ac == 2 ? av[1] : ""));
+}
+
+void rageircd_cmd_squit(char *servname, char *message)
+{
+ send_cmd(NULL, "SQUIT %s :%s", servname, message);
+}
+
+/* PONG */
+void rageircd_cmd_pong(char *servname, char *who)
+{
+ send_cmd(servname, "PONG %s", who);
+}
+
+void rageircd_cmd_svinfo()
+{
+ send_cmd(NULL, "SVINFO 5 3 0 %ld bluemoon 0", (long int) time(NULL));
+}
+
+void rageircd_cmd_capab()
+{
+ /* CAPAB BURST UNCONNECT ZIP SSJ3 SN2 VHOST SUID TOK1 TSMODE */
+ send_cmd(NULL, "CAPAB BURST UNCONNECT SSJ3 SN2 VHOST TSMODE");
+}
+
+void rageircd_cmd_server(char *servname, int hop, char *descript)
+{
+ send_cmd(NULL, "SERVER %s %d :%s", servname, hop, descript);
+}
+
+/* PASS */
+void rageircd_cmd_pass(char *pass)
+{
+ send_cmd(NULL, "PASS %s :TS", pass);
+}
+
+void rageircd_cmd_burst()
+{
+ send_cmd(NULL, "BURST");
+}
+
+void rageircd_cmd_connect(int servernum)
+{
+ if (Numeric) {
+ me_server =
+ new_server(NULL, ServerName, ServerDesc, SERVER_ISME, Numeric);
+ } else {
+ me_server =
+ new_server(NULL, ServerName, ServerDesc, SERVER_ISME, NULL);
+ }
+
+ if (servernum == 1)
+ rageircd_cmd_pass(RemotePassword);
+ else if (servernum == 2)
+ rageircd_cmd_pass(RemotePassword2);
+ else if (servernum == 3)
+ rageircd_cmd_pass(RemotePassword3);
+ rageircd_cmd_capab();
+ if (Numeric) {
+ send_cmd(NULL, "MYID !%s", Numeric);
+ }
+ rageircd_cmd_server(ServerName, 1, ServerDesc);
+ rageircd_cmd_svinfo();
+ rageircd_cmd_burst();
+}
+
+void rageircd_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) {
+
+ /* This looks better, much better than "add ? (do_add) : (do_remove)".
+ * At least this is readable without paying much attention :) -GD
+ */
+ if (add)
+ user->mode |= umodes[(int) *modes];
+ else
+ user->mode &= ~umodes[(int) *modes];
+
+ switch (*modes++) {
+ case '+':
+ add = 1;
+ break;
+ case '-':
+ add = 0;
+ break;
+ case 'd':
+ if (ac == 0) {
+ alog("user: umode +d with no parameter (?) for user %s",
+ user->nick);
+ break;
+ }
+
+ ac--;
+ av++;
+ user->svid = strtoul(*av, NULL, 0);
+ break;
+ case 'o':
+ if (add) {
+ opcnt++;
+
+ if (WallOper)
+ anope_cmd_global(s_OperServ,
+ "\2%s\2 is now an IRC operator.",
+ user->nick);
+ display_news(user, NEWS_OPER);
+ if (is_services_oper(user)) {
+ common_svsmode(user, "+a", NULL);
+ user->mode |= UMODE_a;
+ }
+ } else {
+ opcnt--;
+ }
+ break;
+ case 'r':
+ if (add && !nick_identified(user)) {
+ common_svsmode(user, "-r", NULL);
+ user->mode &= ~UMODE_r;
+ }
+ break;
+ case 'x':
+ update_host(user);
+ break;
+ }
+ }
+}
+
+/* GLOBOPS */
+void rageircd_cmd_global(char *source, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(source ? source : ServerName, "GLOBOPS :%s", buf);
+}
+
+void rageircd_cmd_notice_ops(char *source, char *dest, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "NOTICE @%s :%s", dest, buf);
+}
+
+
+void rageircd_cmd_notice(char *source, char *dest, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ if (NSDefFlags & NI_MSG) {
+ rageircd_cmd_privmsg2(source, dest, buf);
+ } else {
+ send_cmd(source, "NOTICE %s :%s", dest, buf);
+ }
+}
+
+void rageircd_cmd_notice2(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "NOTICE %s :%s", dest, msg);
+}
+
+void rageircd_cmd_privmsg(char *source, char *dest, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(source, "PRIVMSG %s :%s", dest, buf);
+}
+
+void rageircd_cmd_privmsg2(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "PRIVMSG %s :%s", dest, msg);
+}
+
+void rageircd_cmd_serv_notice(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "NOTICE $%s :%s", dest, msg);
+}
+
+void rageircd_cmd_serv_privmsg(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "PRIVMSG $%s :%s", dest, msg);
+}
+
+int anope_event_away(char *source, int ac, char **av)
+{
+ if (!source) {
+ return MOD_CONT;
+ }
+ m_away(source, (ac ? av[0] : NULL));
+ return MOD_CONT;
+}
+
+int anope_event_ping(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+ rageircd_cmd_pong(ac > 1 ? av[1] : ServerName, av[0]);
+ return MOD_CONT;
+}
+
+void rageircd_cmd_351(char *source)
+{
+ send_cmd(ServerName, "351 %s Anope-%s %s :%s - %s (%s) -- %s",
+ source, version_number, ServerName, ircd->name, version_flags,
+ EncModule, version_build);
+}
+
+void rageircd_cmd_mode(char *source, char *dest, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ if (ircdcap->tsmode) {
+ if (uplink_capab & ircdcap->tsmode || UseTSMODE) {
+ send_cmd(source, "MODE %s 0 %s", dest, buf);
+ } else {
+ send_cmd(source, "MODE %s %s", dest, buf);
+ }
+ } else {
+ send_cmd(source, "MODE %s %s", dest, buf);
+ }
+}
+
+
+void rageircd_cmd_kick(char *source, char *chan, char *user, char *buf)
+{
+ if (buf) {
+ send_cmd(source, "KICK %s %s :%s", chan, user, buf);
+ } else {
+ send_cmd(source, "KICK %s %s", chan, user);
+ }
+}
+
+void rageircd_cmd_372(char *source, char *msg)
+{
+ send_cmd(ServerName, "372 %s :- %s", source, msg);
+}
+
+void rageircd_cmd_372_error(char *source)
+{
+ send_cmd(ServerName, "422 %s :- MOTD file not found! Please "
+ "contact your IRC administrator.", source);
+}
+
+void rageircd_cmd_375(char *source)
+{
+ send_cmd(ServerName, "375 %s :- %s Message of the Day",
+ source, ServerName);
+}
+
+void rageircd_cmd_376(char *source)
+{
+ send_cmd(ServerName, "376 %s :End of /MOTD command.", source);
+}
+
+/* INVITE */
+void rageircd_cmd_invite(char *source, char *chan, char *nick)
+{
+ if (!source || !chan || !nick) {
+ return;
+ }
+
+ send_cmd(source, "INVITE %s %s", nick, chan);
+}
+
+/* 391 */
+void rageircd_cmd_391(char *source, char *timestr)
+{
+ if (!timestr) {
+ return;
+ }
+ send_cmd(NULL, "391 :%s %s :%s", source, ServerName, timestr);
+}
+
+/* 250 */
+void rageircd_cmd_250(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "250 %s", buf);
+}
+
+/* 307 */
+void rageircd_cmd_307(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "307 %s", buf);
+}
+
+/* 311 */
+void rageircd_cmd_311(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "311 %s", buf);
+}
+
+/* 312 */
+void rageircd_cmd_312(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "312 %s", buf);
+}
+
+/* 317 */
+void rageircd_cmd_317(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "317 %s", buf);
+}
+
+/* 219 */
+void rageircd_cmd_219(char *source, char *letter)
+{
+ if (!source) {
+ return;
+ }
+
+ if (letter) {
+ send_cmd(NULL, "219 %s %c :End of /STATS report.", source,
+ *letter);
+ } else {
+ send_cmd(NULL, "219 %s l :End of /STATS report.", source);
+ }
+}
+
+/* 401 */
+void rageircd_cmd_401(char *source, char *who)
+{
+ if (!source || !who) {
+ return;
+ }
+ send_cmd(ServerName, "401 %s %s :No such service.", source, who);
+}
+
+/* 318 */
+void rageircd_cmd_318(char *source, char *who)
+{
+ if (!source || !who) {
+ return;
+ }
+
+ send_cmd(ServerName, "318 %s %s :End of /WHOIS list.", source, who);
+}
+
+/* 242 */
+void rageircd_cmd_242(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "242 %s", buf);
+}
+
+/* 243 */
+void rageircd_cmd_243(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "243 %s", buf);
+}
+
+/* 211 */
+void rageircd_cmd_211(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "211 %s", buf);
+}
+
+void rageircd_cmd_nick(char *nick, char *name, char *modes)
+{
+ EnforceQlinedNick(nick, NULL);
+ send_cmd(NULL, "SNICK %s %ld 1 %s %s 0 * %s 0 %s :%s", nick,
+ (long int) time(NULL), ServiceUser, ServiceHost, ServerName,
+ modes, name);
+ rageircd_cmd_sqline(nick, "Reserved for services");
+}
+
+/* EVENT : OS */
+int anope_event_os(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+ m_privmsg(source, s_OperServ, av[0]);
+ return MOD_CONT;
+}
+
+/* EVENT : NS */
+int anope_event_ns(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+ m_privmsg(source, s_NickServ, av[0]);
+ return MOD_CONT;
+}
+
+/* EVENT : MS */
+int anope_event_ms(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+ m_privmsg(source, s_MemoServ, av[0]);
+ return MOD_CONT;
+}
+
+/* EVENT : HS */
+int anope_event_hs(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+ m_privmsg(source, s_HostServ, av[0]);
+ return MOD_CONT;
+}
+
+/* EVENT : CS */
+int anope_event_cs(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+ m_privmsg(source, s_ChanServ, av[0]);
+ return MOD_CONT;
+}
+
+/* QUIT */
+void rageircd_cmd_quit(char *source, char *buf)
+{
+ if (buf) {
+ send_cmd(source, "QUIT :%s", buf);
+ } else {
+ send_cmd(source, "QUIT");
+ }
+}
+
+void rageircd_cmd_bot_nick(char *nick, char *user, char *host, char *real,
+ char *modes)
+{
+ EnforceQlinedNick(nick, s_BotServ);
+ send_cmd(NULL, "SNICK %s %ld 1 %s %s 0 * %s 0 %s :%s", nick,
+ (long int) time(NULL), user, host, ServerName, modes, real);
+ rageircd_cmd_sqline(nick, "Reserved for services");
+}
+
+/* SVSMODE -b */
+void rageircd_cmd_unban(char *name, char *nick)
+{
+ rageircd_cmd_svsmode_chan(name, "-b", nick);
+}
+
+
+/* SVSMODE channel modes */
+
+void rageircd_cmd_svsmode_chan(char *name, char *mode, char *nick)
+{
+ if (nick) {
+ send_cmd(ServerName, "SVSMODE %s %s %s", name, mode, nick);
+ } else {
+ send_cmd(ServerName, "SVSMODE %s %s", name, mode);
+ }
+}
+
+void rageircd_cmd_bot_chan_mode(char *nick, char *chan)
+{
+ anope_cmd_mode(nick, chan, "%s %s", ircd->botchanumode, nick);
+}
+
+int anope_event_server(char *source, int ac, char **av)
+{
+ if (!stricmp(av[1], "1")) {
+ uplink = sstrdup(av[0]);
+ }
+ do_server(source, av[0], av[1], av[2], NULL);
+ return MOD_CONT;
+}
+
+
+int anope_event_privmsg(char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+ m_privmsg(source, av[0], av[1]);
+ return MOD_CONT;
+}
+
+int anope_event_part(char *source, int ac, char **av)
+{
+ if (ac < 1 || ac > 2)
+ return MOD_CONT;
+ do_part(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_whois(char *source, int ac, char **av)
+{
+ if (source && ac >= 1) {
+ m_whois(source, av[0]);
+ }
+ return MOD_CONT;
+}
+
+
+int anope_event_482(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_topic(char *source, int ac, char **av)
+{
+ if (ac != 4)
+ return MOD_CONT;
+ do_topic(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_squit(char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+ do_squit(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_quit(char *source, int ac, char **av)
+{
+ if (ac != 1)
+ return MOD_CONT;
+ do_quit(source, ac, av);
+ return MOD_CONT;
+}
+
+
+int anope_event_mode(char *source, int ac, char **av)
+{
+ if (ac < 2)
+ return MOD_CONT;
+
+ if (*av[0] == '#' || *av[0] == '&') {
+ do_cmode(source, ac, av);
+ } else {
+ do_umode(source, ac, av);
+ }
+ return MOD_CONT;
+}
+
+
+int anope_event_kill(char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+
+ m_kill(av[0], av[1]);
+ return MOD_CONT;
+}
+
+int anope_event_kick(char *source, int ac, char **av)
+{
+ if (ac != 3)
+ return MOD_CONT;
+ do_kick(source, ac, av);
+ return MOD_CONT;
+}
+
+
+int anope_event_join(char *source, int ac, char **av)
+{
+ if (ac != 1)
+ return MOD_CONT;
+ do_join(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_motd(char *source, int ac, char **av)
+{
+ if (!source) {
+ return MOD_CONT;
+ }
+
+ m_motd(source);
+ return MOD_CONT;
+}
+
+/* SVSHOLD - set */
+void rageircd_cmd_svshold(char *nick)
+{
+ send_cmd(ServerName, "SVSHOLD %s %d :%s", nick, NSReleaseTimeout,
+ "Being held for registered user");
+}
+
+/* SVSHOLD - release */
+void rageircd_cmd_release_svshold(char *nick)
+{
+ send_cmd(ServerName, "SVSHOLD %s 0", nick);
+}
+
+void rageircd_cmd_svsnick(char *source, char *guest, time_t when)
+{
+ if (!source || !guest) {
+ return;
+ }
+ send_cmd(NULL, "SVSNICK %s %s :%ld", source, guest, (long int) when);
+}
+
+void rageircd_cmd_guest_nick(char *nick, char *user, char *host,
+ char *real, char *modes)
+{
+ send_cmd(NULL, "SNICK %s %ld 1 %s %s 0 * %s 0 %s :%s", nick,
+ (long int) time(NULL), user, host, ServerName, modes, real);
+}
+
+
+void rageircd_cmd_svso(char *source, char *nick, char *flag)
+{
+ /* Not Supported by this IRCD */
+}
+
+
+/* SVSMODE +d */
+/* sent if svid is something weird */
+void rageircd_cmd_svid_umode(char *nick, time_t ts)
+{
+ send_cmd(ServerName, "SVSMODE %s %lu +d 1", nick,
+ (unsigned long int) ts);
+}
+
+/* SVSMODE +d */
+/* nc_change was = 1, and there is no na->status */
+void rageircd_cmd_nc_change(User * u)
+{
+ common_svsmode(u, "+d", "1");
+}
+
+/* SVSMODE +d */
+void rageircd_cmd_svid_umode2(User * u, char *ts)
+{
+ /* not used by bahamut ircds */
+}
+
+void rageircd_cmd_svid_umode3(User * u, char *ts)
+{
+ if (u->svid != u->timestamp) {
+ common_svsmode(u, "+rd", ts);
+ } else {
+ common_svsmode(u, "+r", NULL);
+ }
+}
+
+/* NICK <newnick> */
+void rageircd_cmd_chg_nick(char *oldnick, char *newnick)
+{
+ if (!oldnick || !newnick) {
+ return;
+ }
+
+ send_cmd(oldnick, "NICK %s", newnick);
+}
+
+int anope_event_myid(char *source, int ac, char **av)
+{
+ /* currently not used but removes the message : unknown message from server */
+ return MOD_CONT;
+}
+
+int anope_event_pass(char *source, int ac, char **av)
+{
+ /* currently not used but removes the message : unknown message from server */
+ return MOD_CONT;
+}
+
+/*
+ * SVINFO
+ * parv[0] = sender prefix
+ *
+ * if (parc == 2)
+ * parv[1] = ZIP (compression initialisation)
+ *
+ * if (parc > 2)
+ * parv[1] = TS_CURRENT
+ * parv[2] = TS_MIN
+ * parv[3] = standalone or connected to non-TS (unused)
+ * parv[4] = UTC time
+ * parv[5] = ircd codename
+ * parv[6] = masking keys
+ */
+int anope_event_svinfo(char *source, int ac, char **av)
+{
+ /* currently not used but removes the message : unknown message from server */
+ return MOD_CONT;
+}
+
+int anope_event_gnotice(char *source, int ac, char **av)
+{
+ /* currently not used but removes the message : unknown message from server */
+ return MOD_CONT;
+}
+
+int anope_event_notice(char *source, int ac, char **av)
+{
+ /* currently not used but removes the message : unknown message from server */
+ return MOD_CONT;
+}
+
+int anope_event_sqline(char *source, int ac, char **av)
+{
+ /* currently not used but removes the message : unknown message from server */
+ return MOD_CONT;
+}
+
+void rageircd_cmd_svsjoin(char *source, char *nick, char *chan, char *param)
+{
+ /* Find no reference to it in the code and docs */
+}
+
+void rageircd_cmd_svspart(char *source, char *nick, char *chan)
+{
+ /* Find no reference to it in the code and docs */
+}
+
+void rageircd_cmd_swhois(char *source, char *who, char *mask)
+{
+ /* not supported */
+}
+
+int anope_event_rehash(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_credits(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_admin(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_globops(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int rageircd_flood_mode_check(char *value)
+{
+ return 0;
+}
+
+void rageircd_cmd_eob()
+{
+ send_cmd(NULL, "BURST 0");
+}
+
+void rageircd_cmd_jupe(char *jserver, char *who, char *reason)
+{
+ char rbuf[256];
+
+ snprintf(rbuf, sizeof(rbuf), "Juped by %s%s%s", who,
+ reason ? ": " : "", reason ? reason : "");
+
+ if (findserver(servlist, jserver))
+ rageircd_cmd_squit(jserver, rbuf);
+ rageircd_cmd_server(jserver, 2, rbuf);
+ new_server(me_server, jserver, rbuf, SERVER_JUPED, NULL);
+}
+
+/* GLOBOPS - to handle old WALLOPS */
+void rageircd_cmd_global_legacy(char *source, char *fmt)
+{
+ send_cmd(source ? source : ServerName, "GLOBOPS :%s", fmt);
+}
+
+/*
+ 1 = valid nick
+ 0 = nick is in valid
+*/
+int rageircd_valid_nick(char *nick)
+{
+ /* no hard coded invalid nicks */
+ return 1;
+}
+
+/*
+ 1 = valid chan
+ 0 = chan is in valid
+*/
+int rageircd_valid_chan(char *chan)
+{
+ /* no hard coded invalid nicks */
+ return 1;
+}
+
+
+void rageircd_cmd_ctcp(char *source, char *dest, char *buf)
+{
+ char *s;
+
+ if (!buf) {
+ return;
+ } else {
+ s = normalizeBuffer(buf);
+ }
+
+ send_cmd(source, "NOTICE %s :\1%s \1", dest, s);
+ free(s);
+}
+
+
+/**
+ * Tell anope which function we want to perform each task inside of anope.
+ * These prototypes must match what anope expects.
+ **/
+void moduleAddAnopeCmds()
+{
+ pmodule_cmd_svsnoop(rageircd_cmd_svsnoop);
+ pmodule_cmd_remove_akill(rageircd_cmd_remove_akill);
+ pmodule_cmd_topic(rageircd_cmd_topic);
+ pmodule_cmd_vhost_off(rageircd_cmd_vhost_off);
+ pmodule_cmd_akill(rageircd_cmd_akill);
+ pmodule_cmd_svskill(rageircd_cmd_svskill);
+ pmodule_cmd_svsmode(rageircd_cmd_svsmode);
+ pmodule_cmd_372(rageircd_cmd_372);
+ pmodule_cmd_372_error(rageircd_cmd_372_error);
+ pmodule_cmd_375(rageircd_cmd_375);
+ pmodule_cmd_376(rageircd_cmd_376);
+ pmodule_cmd_nick(rageircd_cmd_nick);
+ pmodule_cmd_guest_nick(rageircd_cmd_guest_nick);
+ pmodule_cmd_mode(rageircd_cmd_mode);
+ pmodule_cmd_bot_nick(rageircd_cmd_bot_nick);
+ pmodule_cmd_kick(rageircd_cmd_kick);
+ pmodule_cmd_notice_ops(rageircd_cmd_notice_ops);
+ pmodule_cmd_notice(rageircd_cmd_notice);
+ pmodule_cmd_notice2(rageircd_cmd_notice2);
+ pmodule_cmd_privmsg(rageircd_cmd_privmsg);
+ pmodule_cmd_privmsg2(rageircd_cmd_privmsg2);
+ pmodule_cmd_serv_notice(rageircd_cmd_serv_notice);
+ pmodule_cmd_serv_privmsg(rageircd_cmd_serv_privmsg);
+ pmodule_cmd_bot_chan_mode(rageircd_cmd_bot_chan_mode);
+ pmodule_cmd_351(rageircd_cmd_351);
+ pmodule_cmd_quit(rageircd_cmd_quit);
+ pmodule_cmd_pong(rageircd_cmd_pong);
+ pmodule_cmd_join(rageircd_cmd_join);
+ pmodule_cmd_unsqline(rageircd_cmd_unsqline);
+ pmodule_cmd_invite(rageircd_cmd_invite);
+ pmodule_cmd_part(rageircd_cmd_part);
+ pmodule_cmd_391(rageircd_cmd_391);
+ pmodule_cmd_250(rageircd_cmd_250);
+ pmodule_cmd_307(rageircd_cmd_307);
+ pmodule_cmd_311(rageircd_cmd_311);
+ pmodule_cmd_312(rageircd_cmd_312);
+ pmodule_cmd_317(rageircd_cmd_317);
+ pmodule_cmd_219(rageircd_cmd_219);
+ pmodule_cmd_401(rageircd_cmd_401);
+ pmodule_cmd_318(rageircd_cmd_318);
+ pmodule_cmd_242(rageircd_cmd_242);
+ pmodule_cmd_243(rageircd_cmd_243);
+ pmodule_cmd_211(rageircd_cmd_211);
+ pmodule_cmd_global(rageircd_cmd_global);
+ pmodule_cmd_global_legacy(rageircd_cmd_global_legacy);
+ pmodule_cmd_sqline(rageircd_cmd_sqline);
+ pmodule_cmd_squit(rageircd_cmd_squit);
+ pmodule_cmd_svso(rageircd_cmd_svso);
+ pmodule_cmd_chg_nick(rageircd_cmd_chg_nick);
+ pmodule_cmd_svsnick(rageircd_cmd_svsnick);
+ pmodule_cmd_vhost_on(rageircd_cmd_vhost_on);
+ pmodule_cmd_connect(rageircd_cmd_connect);
+ pmodule_cmd_svshold(rageircd_cmd_svshold);
+ pmodule_cmd_release_svshold(rageircd_cmd_release_svshold);
+ pmodule_cmd_unsgline(rageircd_cmd_unsgline);
+ pmodule_cmd_unszline(rageircd_cmd_unszline);
+ pmodule_cmd_szline(rageircd_cmd_szline);
+ pmodule_cmd_sgline(rageircd_cmd_sgline);
+ pmodule_cmd_unban(rageircd_cmd_unban);
+ pmodule_cmd_svsmode_chan(rageircd_cmd_svsmode_chan);
+ pmodule_cmd_svid_umode(rageircd_cmd_svid_umode);
+ pmodule_cmd_nc_change(rageircd_cmd_nc_change);
+ pmodule_cmd_svid_umode2(rageircd_cmd_svid_umode2);
+ pmodule_cmd_svid_umode3(rageircd_cmd_svid_umode3);
+ pmodule_cmd_svsjoin(rageircd_cmd_svsjoin);
+ pmodule_cmd_svspart(rageircd_cmd_svspart);
+ pmodule_cmd_swhois(rageircd_cmd_swhois);
+ pmodule_cmd_eob(rageircd_cmd_eob);
+ pmodule_flood_mode_check(rageircd_flood_mode_check);
+ pmodule_cmd_jupe(rageircd_cmd_jupe);
+ pmodule_valid_nick(rageircd_valid_nick);
+ pmodule_valid_chan(rageircd_valid_chan);
+ pmodule_cmd_ctcp(rageircd_cmd_ctcp);
+ pmodule_set_umode(rageircd_set_umode);
+}
+
+/**
+ * Now tell anope how to use us.
+ **/
+int AnopeInit(int argc, char **argv)
+{
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion
+ ("$Id$");
+ moduleSetType(PROTOCOL);
+
+ pmodule_ircd_version("RageIRCd 2.0.x");
+ pmodule_ircd_cap(myIrcdcap);
+ pmodule_ircd_var(myIrcd);
+ pmodule_ircd_cbmodeinfos(myCbmodeinfos);
+ pmodule_ircd_cumodes(myCumodes);
+ pmodule_ircd_flood_mode_char_set("");
+ pmodule_ircd_flood_mode_char_remove("");
+ pmodule_ircd_cbmodes(myCbmodes);
+ pmodule_ircd_cmmodes(myCmmodes);
+ pmodule_ircd_csmodes(myCsmodes);
+ pmodule_ircd_useTSMode(1);
+
+ /** Deal with modes anope _needs_ to know **/
+ pmodule_invis_umode(UMODE_i);
+ pmodule_oper_umode(UMODE_o);
+ pmodule_invite_cmode(CMODE_i);
+ pmodule_secret_cmode(CMODE_s);
+ pmodule_private_cmode(CMODE_p);
+ pmodule_key_mode(CMODE_k);
+ pmodule_limit_mode(CMODE_l);
+
+ moduleAddAnopeCmds();
+ moduleAddIRCDMsgs();
+
+ return MOD_CONT;
+}
+
+/* EOF */
diff --git a/src/protocol/rageircd.h b/src/protocol/rageircd.h
new file mode 100644
index 000000000..c997a8f1c
--- /dev/null
+++ b/src/protocol/rageircd.h
@@ -0,0 +1,113 @@
+/* Rage IRCD functions
+ *
+ * (C) 2003-2008 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.
+ *
+ *
+ */
+
+#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
+#define UMODE_R 0x80000000
+#define UMODE_x 0x40000000
+
+#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
+#define CMODE_R 0x00000100 /* Only identified users can join */
+#define CMODE_r 0x00000200 /* Set for all registered channels */
+#define CMODE_c 0x00000400 /* Colors can't be used */
+#define CMODE_M 0x00000800 /* Non-regged nicks can't send messages */
+#define CMODE_N 0x00001000
+#define CMODE_S 0x00002000
+#define CMODE_C 0x00004000
+#define CMODE_A 0x00008000
+#define CMODE_O 0x00010000 /* Only opers can join */
+
+#define DEFAULT_MLOCK CMODE_n | CMODE_t | CMODE_r
+
+void rageircd_set_umode(User * user, int ac, char **av);
+void rageircd_cmd_svsnoop(char *server, int set);
+void rageircd_cmd_remove_akill(char *user, char *host);
+void rageircd_cmd_topic(char *whosets, char *chan, char *whosetit, char *topic, time_t when);
+void rageircd_cmd_vhost_off(User * u);
+void rageircd_cmd_akill(char *user, char *host, char *who, time_t when,time_t expires, char *reason);
+void rageircd_cmd_svskill(char *source, char *user, char *buf);
+void rageircd_cmd_svsmode(User * u, int ac, char **av);
+void rageircd_cmd_372(char *source, char *msg);
+void rageircd_cmd_372_error(char *source);
+void rageircd_cmd_375(char *source);
+void rageircd_cmd_376(char *source);
+void rageircd_cmd_nick(char *nick, char *name, char *modes);
+void rageircd_cmd_guest_nick(char *nick, char *user, char *host, char *real, char *modes);
+void rageircd_cmd_mode(char *source, char *dest, char *buf);
+void rageircd_cmd_bot_nick(char *nick, char *user, char *host, char *real, char *modes);
+void rageircd_cmd_kick(char *source, char *chan, char *user, char *buf);
+void rageircd_cmd_notice_ops(char *source, char *dest, char *buf);
+void rageircd_cmd_notice(char *source, char *dest, char *buf);
+void rageircd_cmd_notice2(char *source, char *dest, char *msg);
+void rageircd_cmd_privmsg(char *source, char *dest, char *buf);
+void rageircd_cmd_privmsg2(char *source, char *dest, char *msg);
+void rageircd_cmd_serv_notice(char *source, char *dest, char *msg);
+void rageircd_cmd_serv_privmsg(char *source, char *dest, char *msg);
+void rageircd_cmd_bot_chan_mode(char *nick, char *chan);
+void rageircd_cmd_351(char *source);
+void rageircd_cmd_quit(char *source, char *buf);
+void rageircd_cmd_pong(char *servname, char *who);
+void rageircd_cmd_join(char *user, char *channel, time_t chantime);
+void rageircd_cmd_unsqline(char *user);
+void rageircd_cmd_invite(char *source, char *chan, char *nick);
+void rageircd_cmd_part(char *nick, char *chan, char *buf);
+void rageircd_cmd_391(char *source, char *timestr);
+void rageircd_cmd_250(char *buf);
+void rageircd_cmd_307(char *buf);
+void rageircd_cmd_311(char *buf);
+void rageircd_cmd_312(char *buf);
+void rageircd_cmd_317(char *buf);
+void rageircd_cmd_219(char *source, char *letter);
+void rageircd_cmd_401(char *source, char *who);
+void rageircd_cmd_318(char *source, char *who);
+void rageircd_cmd_242(char *buf);
+void rageircd_cmd_243(char *buf);
+void rageircd_cmd_211(char *buf);
+void rageircd_cmd_global(char *source, char *buf);
+void rageircd_cmd_global_legacy(char *source, char *fmt);
+void rageircd_cmd_sqline(char *mask, char *reason);
+void rageircd_cmd_squit(char *servname, char *message);
+void rageircd_cmd_svso(char *source, char *nick, char *flag);
+void rageircd_cmd_chg_nick(char *oldnick, char *newnick);
+void rageircd_cmd_svsnick(char *source, char *guest, time_t when);
+void rageircd_cmd_vhost_on(char *nick, char *vIdent, char *vhost);
+void rageircd_cmd_connect(int servernum);
+void rageircd_cmd_svshold(char *nick);
+void rageircd_cmd_release_svshold(char *nick);
+void rageircd_cmd_unsgline(char *mask);
+void rageircd_cmd_unszline(char *mask);
+void rageircd_cmd_szline(char *mask, char *reason, char *whom);
+void rageircd_cmd_sgline(char *mask, char *reason);
+void rageircd_cmd_unban(char *name, char *nick);
+void rageircd_cmd_svsmode_chan(char *name, char *mode, char *nick);
+void rageircd_cmd_svid_umode(char *nick, time_t ts);
+void rageircd_cmd_nc_change(User * u);
+void rageircd_cmd_svid_umode2(User * u, char *ts);
+void rageircd_cmd_svid_umode3(User * u, char *ts);
+void rageircd_cmd_eob();
+int rageircd_flood_mode_check(char *value);
+void rageircd_cmd_jupe(char *jserver, char *who, char *reason);
+int rageircd_valid_nick(char *nick);
+void rageircd_cmd_ctcp(char *source, char *dest, char *buf);
diff --git a/src/protocol/ratbox.c b/src/protocol/ratbox.c
new file mode 100644
index 000000000..d8c33b4a3
--- /dev/null
+++ b/src/protocol/ratbox.c
@@ -0,0 +1,1882 @@
+/* Ratbox IRCD functions
+ *
+ * (C) 2003-2008 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.
+ *
+ *
+ */
+
+#include "services.h"
+#include "pseudo.h"
+#include "ratbox.h"
+
+IRCDVar myIrcd[] = {
+ {"Ratbox 2.0+", /* ircd name */
+ "+oi", /* nickserv mode */
+ "+oi", /* chanserv mode */
+ "+oi", /* memoserv mode */
+ "+oi", /* hostserv mode */
+ "+oai", /* operserv mode */
+ "+oi", /* botserv mode */
+ "+oi", /* helpserv mode */
+ "+oi", /* Dev/Null mode */
+ "+oi", /* Global mode */
+ "+oi", /* nickserv alias mode */
+ "+oi", /* chanserv alias mode */
+ "+oi", /* memoserv alias mode */
+ "+oi", /* hostserv alias mode */
+ "+oai", /* operserv alias mode */
+ "+oi", /* botserv alias mode */
+ "+oi", /* helpserv alias mode */
+ "+oi", /* Dev/Null alias mode */
+ "+oi", /* Global alias mode */
+ "+oi", /* Used by BotServ Bots */
+ 2, /* Chan Max Symbols */
+ "-acilmnpst", /* Modes to Remove */
+ "+o", /* Channel Umode used by Botserv bots */
+ 0, /* SVSNICK */
+ 0, /* Vhost */
+ 0, /* Has Owner */
+ NULL, /* Mode to set for an owner */
+ NULL, /* Mode to unset for an owner */
+ NULL, /* Mode to set for chan admin */
+ NULL, /* Mode to unset for chan admin */
+ NULL, /* Mode On Reg */
+ NULL, /* Mode on ID for Roots */
+ NULL, /* Mode on ID for Admins */
+ NULL, /* Mode on ID for Opers */
+ NULL, /* Mode on UnReg */
+ NULL, /* Mode on Nick Change */
+ 1, /* Supports SGlines */
+ 1, /* Supports SQlines */
+ 0, /* Supports SZlines */
+ 0, /* Supports Halfop +h */
+ 3, /* Number of server args */
+ 1, /* Join 2 Set */
+ 1, /* Join 2 Message */
+ 1, /* Has exceptions +e */
+ 0, /* TS Topic Forward */
+ 0, /* TS Topci Backward */
+ 0, /* Protected Umode */
+ 0, /* Has Admin */
+ 1, /* Chan SQlines */
+ 0, /* Quit on Kill */
+ 0, /* SVSMODE unban */
+ 0, /* Has Protect */
+ 0, /* Reverse */
+ 0, /* Chan Reg */
+ 0, /* Channel Mode */
+ 0, /* vidents */
+ 0, /* svshold */
+ 0, /* time stamp on mode */
+ 0, /* NICKIP */
+ 0, /* UMODE */
+ 0, /* O:LINE */
+ 0, /* VHOST ON NICK */
+ 0, /* Change RealName */
+ CMODE_p, /* No Knock */
+ 0, /* Admin Only */
+ DEFAULT_MLOCK, /* Default MLOCK */
+ 0, /* Vhost Mode */
+ 0, /* +f */
+ 0, /* +L */
+ 0, /* +f Mode */
+ 0, /* +L Mode */
+ 0, /* On nick change check if they could be identified */
+ 0, /* No Knock requires +i */
+ NULL, /* CAPAB Chan Modes */
+ 0, /* We support TOKENS */
+ 1, /* TOKENS are CASE inSensitive */
+ 0, /* TIME STAMPS are BASE64 */
+ 1, /* +I support */
+ 0, /* SJOIN ban char */
+ 0, /* SJOIN except char */
+ 0, /* SJOIN invite char */
+ 0, /* Can remove User Channel Modes with SVSMODE */
+ 0, /* Sglines are not enforced until user reconnects */
+ NULL, /* vhost char */
+ 1, /* ts6 */
+ 0, /* support helper umode */
+ 0, /* p10 */
+ NULL, /* character set */
+ 0, /* reports sync state */
+ 0, /* CIDR channelbans */
+ }
+ ,
+ {NULL}
+};
+
+IRCDCAPAB myIrcdcap[] = {
+ {
+ 0, /* NOQUIT */
+ 0, /* TSMODE */
+ 0, /* UNCONNECT */
+ 0, /* NICKIP */
+ 0, /* SJOIN */
+ CAPAB_ZIP, /* ZIP */
+ 0, /* BURST */
+ CAPAB_TS5, /* TS5 */
+ 0, /* TS3 */
+ 0, /* DKEY */
+ 0, /* PT4 */
+ 0, /* SCS */
+ CAPAB_QS, /* QS */
+ CAPAB_UID, /* UID */
+ CAPAB_KNOCK, /* KNOCK */
+ 0, /* CLIENT */
+ 0, /* IPV6 */
+ 0, /* SSJ5 */
+ 0, /* SN2 */
+ 0, /* TOKEN */
+ 0, /* VHOST */
+ 0, /* SSJ3 */
+ 0, /* NICK2 */
+ 0, /* UMODE2 */
+ 0, /* VL */
+ 0, /* TLKEXT */
+ 0, /* DODKEY */
+ 0, /* DOZIP */
+ 0, 0, 0}
+};
+
+void ratbox_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) {
+
+ /* This looks better, much better than "add ? (do_add) : (do_remove)".
+ * At least this is readable without paying much attention :) -GD
+ */
+ if (add)
+ user->mode |= umodes[(int) *modes];
+ else
+ user->mode &= ~umodes[(int) *modes];
+
+ switch (*modes++) {
+ case '+':
+ add = 1;
+ break;
+ case '-':
+ add = 0;
+ break;
+ case 'o':
+ if (add) {
+ opcnt++;
+
+ if (WallOper)
+ anope_cmd_global(s_OperServ,
+ "\2%s\2 is now an IRC operator.",
+ user->nick);
+ display_news(user, NEWS_OPER);
+
+ } else {
+ opcnt--;
+ }
+ break;
+ }
+ }
+}
+
+unsigned long umodes[128] = {
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused, Unused, Horzontal Tab */
+ 0, 0, 0, /* Line Feed, Unused, Unused */
+ 0, 0, 0, /* Carriage Return, Unused, Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused, Unused, Space */
+ 0, 0, 0, /* ! " # */
+ 0, 0, 0, /* $ % & */
+ 0, 0, 0, /* ! ( ) */
+ 0, 0, 0, /* * + , */
+ 0, 0, 0, /* - . / */
+ 0, 0, /* 0 1 */
+ 0, 0, /* 2 3 */
+ 0, 0, /* 4 5 */
+ 0, 0, /* 6 7 */
+ 0, 0, /* 8 9 */
+ 0, 0, /* : ; */
+ 0, 0, 0, /* < = > */
+ 0, 0, /* ? @ */
+ 0, 0, 0, /* A B C */
+ 0, 0, 0, /* D E F */
+ 0, 0, 0, /* G H I */
+ 0, 0, 0, /* J K L */
+ 0, 0, 0, /* M N O */
+ 0, 0, 0, /* P Q R */
+ 0, 0, 0, /* S T U */
+ 0, 0, 0, /* V W X */
+ 0, /* Y */
+ 0, /* Z */
+ 0, 0, 0, /* [ \ ] */
+ 0, 0, 0, /* ^ _ ` */
+ UMODE_a, UMODE_b, 0, /* a b c */
+ UMODE_d, 0, 0, /* d e f */
+ UMODE_g, 0, UMODE_i, /* g h i */
+ 0, 0, UMODE_l, /* j k l */
+ 0, UMODE_n, UMODE_o, /* m n o */
+ 0, 0, 0, /* p q r */
+ 0, 0, UMODE_u, /* s t u */
+ 0, UMODE_w, UMODE_x, /* v w x */
+ 0, /* y */
+ 0, /* z */
+ 0, 0, 0, /* { | } */
+ 0, 0 /* ~ � */
+};
+
+
+char myCsmodes[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,
+
+ '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
+};
+
+CMMode myCmmodes[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}, /* BCD */
+ {NULL}, {NULL}, {NULL}, /* EFG */
+ {NULL}, /* H */
+ {add_invite, del_invite},
+ {NULL}, /* J */
+ {NULL}, {NULL}, {NULL}, /* KLM */
+ {NULL}, {NULL}, {NULL}, /* NOP */
+ {NULL}, {NULL}, {NULL}, /* QRS */
+ {NULL}, {NULL}, {NULL}, /* TUV */
+ {NULL}, {NULL}, {NULL}, /* WXY */
+ {NULL}, /* Z */
+ {NULL}, {NULL}, /* (char 91 - 92) */
+ {NULL}, {NULL}, {NULL}, /* (char 93 - 95) */
+ {NULL}, /* ` (char 96) */
+ {NULL}, /* a (char 97) */
+ {add_ban, del_ban},
+ {NULL},
+ {NULL},
+ {add_exception, del_exception},
+ {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}
+};
+
+
+CBMode myCbmodes[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}, /* A */
+ {0}, /* B */
+ {0}, /* C */
+ {0}, /* D */
+ {0}, /* E */
+ {0}, /* F */
+ {0}, /* G */
+ {0}, /* H */
+ {0}, /* I */
+ {0}, /* J */
+ {0}, /* K */
+ {0}, /* L */
+ {0}, /* M */
+ {0}, /* N */
+ {0}, /* O */
+ {0}, /* P */
+ {0}, /* Q */
+ {0}, /* R */
+ {0}, /* S */
+ {0}, /* T */
+ {0}, /* U */
+ {0}, /* V */
+ {0}, /* W */
+ {0}, /* X */
+ {0}, /* Y */
+ {0}, /* Z */
+ {0}, {0}, {0}, {0}, {0}, {0},
+ {0},
+ {0}, /* b */
+ {0}, /* c */
+ {0}, /* d */
+ {0}, /* e */
+ {0}, /* f */
+ {0}, /* g */
+ {0}, /* h */
+ {CMODE_i, 0, NULL, NULL},
+ {0}, /* j */
+ {CMODE_k, 0, chan_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},
+ {0}, /* q */
+ {0},
+ {CMODE_s, 0, NULL, NULL},
+ {CMODE_t, 0, NULL, NULL},
+ {0},
+ {0}, /* v */
+ {0}, /* w */
+ {0}, /* x */
+ {0}, /* y */
+ {0}, /* z */
+ {0}, {0}, {0}, {0}
+};
+
+CBModeInfo myCbmodeinfos[] = {
+ {'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},
+ {'s', CMODE_s, 0, NULL, NULL},
+ {'t', CMODE_t, 0, NULL, NULL},
+ {0}
+};
+
+
+CUMode myCumodes[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},
+
+ {0}, /* a */
+ {0}, /* b */
+ {0}, /* c */
+ {0}, /* d */
+ {0}, /* e */
+ {0}, /* f */
+ {0}, /* g */
+ {0},
+ {0}, /* i */
+ {0}, /* j */
+ {0}, /* k */
+ {0}, /* l */
+ {0}, /* m */
+ {0}, /* n */
+ {CUS_OP, CUF_PROTECT_BOTSERV, check_valid_op},
+ {0}, /* p */
+ {0}, /* q */
+ {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}
+};
+
+
+
+void ratbox_cmd_notice(char *source, char *dest, char *buf)
+{
+ Uid *ud;
+ User *u;
+
+ if (!buf) {
+ return;
+ }
+
+ if (NSDefFlags & NI_MSG) {
+ ratbox_cmd_privmsg2(source, dest, buf);
+ } else {
+ ud = find_uid(source);
+ u = finduser(dest);
+ send_cmd((UseTS6 ? (ud ? ud->uid : source) : source),
+ "NOTICE %s :%s", (UseTS6 ? (u ? u->uid : dest) : dest),
+ buf);
+ }
+}
+
+void ratbox_cmd_notice2(char *source, char *dest, char *msg)
+{
+ Uid *ud;
+ User *u;
+
+ ud = find_uid(source);
+ u = finduser(dest);
+ send_cmd((UseTS6 ? (ud ? ud->uid : source) : source), "NOTICE %s :%s",
+ (UseTS6 ? (u ? u->uid : dest) : dest), msg);
+}
+
+void ratbox_cmd_privmsg(char *source, char *dest, char *buf)
+{
+ Uid *ud, *ud2;
+
+ if (!buf) {
+ return;
+ }
+ ud = find_uid(source);
+ ud2 = find_uid(dest);
+
+ send_cmd((UseTS6 ? (ud ? ud->uid : source) : source), "PRIVMSG %s :%s",
+ (UseTS6 ? (ud2 ? ud2->uid : dest) : dest), buf);
+}
+
+void ratbox_cmd_privmsg2(char *source, char *dest, char *msg)
+{
+ Uid *ud, *ud2;
+
+ ud = find_uid(source);
+ ud2 = find_uid(dest);
+
+ send_cmd((UseTS6 ? (ud ? ud->uid : source) : source), "PRIVMSG %s :%s",
+ (UseTS6 ? (ud2 ? ud2->uid : dest) : dest), msg);
+}
+
+void ratbox_cmd_serv_notice(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "NOTICE $$%s :%s", dest, msg);
+}
+
+void ratbox_cmd_serv_privmsg(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "PRIVMSG $$%s :%s", dest, msg);
+}
+
+
+void ratbox_cmd_global(char *source, char *buf)
+{
+ Uid *u;
+
+ if (!buf) {
+ return;
+ }
+
+ if (source) {
+ u = find_uid(source);
+ if (u) {
+ send_cmd((UseTS6 ? u->uid : source), "OPERWALL :%s", buf);
+ } else {
+ send_cmd((UseTS6 ? TS6SID : ServerName), "OPERWALL :%s", buf);
+ }
+ } else {
+ send_cmd((UseTS6 ? TS6SID : ServerName), "OPERWALL :%s", buf);
+ }
+}
+
+/* GLOBOPS - to handle old WALLOPS */
+void ratbox_cmd_global_legacy(char *source, char *fmt)
+{
+ Uid *u;
+
+ if (source) {
+ u = find_uid(source);
+ if (u) {
+ send_cmd((UseTS6 ? u->uid : source), "OPERWALL :%s", fmt);
+ } else {
+ send_cmd((UseTS6 ? TS6SID : ServerName), "OPERWALL :%s", fmt);
+ }
+ } else {
+ send_cmd((UseTS6 ? TS6SID : ServerName), "OPERWALL :%s", fmt);
+ }
+
+ send_cmd(source ? source : ServerName, "OPERWALL :%s", fmt);
+}
+
+int anope_event_sjoin(char *source, int ac, char **av)
+{
+ do_sjoin(source, ac, av);
+ return MOD_CONT;
+}
+
+/*
+ Non TS6
+
+ av[0] = nick
+ av[1] = hop
+ av[2] = ts
+ av[3] = modes
+ av[4] = user
+ av[5] = host
+ av[6] = server
+ av[7] = info
+
+ TS6
+ av[0] = nick
+ av[1] = hop
+ av[2] = ts
+ av[3] = modes
+ av[4] = user
+ av[5] = host
+ av[6] = IP
+ av[7] = UID
+ av[8] = info
+
+*/
+int anope_event_nick(char *source, int ac, char **av)
+{
+ Server *s;
+ User *user;
+
+ if (UseTS6 && ac == 9) {
+ s = findserver_uid(servlist, source);
+ /* Source is always the server */
+ *source = '\0';
+ user = do_nick(source, av[0], av[4], av[5], s->name, av[8],
+ strtoul(av[2], NULL, 10), 0, 0, "*", av[7]);
+ if (user) {
+ anope_set_umode(user, 1, &av[3]);
+ }
+ } else {
+ if (ac != 2) {
+ user = do_nick(source, av[0], av[4], av[5], av[6], av[7],
+ strtoul(av[2], NULL, 10), 0, 0, "*", NULL);
+ if (user)
+ anope_set_umode(user, 1, &av[3]);
+ } else {
+ do_nick(source, av[0], NULL, NULL, NULL, NULL,
+ strtoul(av[1], NULL, 10), 0, 0, NULL, NULL);
+ }
+ }
+ return MOD_CONT;
+}
+
+int anope_event_topic(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac == 4) {
+ do_topic(source, ac, av);
+ } else {
+ Channel *c = findchan(av[0]);
+ time_t topic_time = time(NULL);
+
+ if (!c) {
+ if (debug) {
+ alog("debug: 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]);
+
+ if (UseTS6) {
+ u = find_byuid(source);
+ if (u) {
+ strscpy(c->topic_setter, u->nick, sizeof(c->topic_setter));
+ } else {
+ strscpy(c->topic_setter, source, sizeof(c->topic_setter));
+ }
+ } else {
+ strscpy(c->topic_setter, source, sizeof(c->topic_setter));
+ }
+ c->topic_time = topic_time;
+
+ record_topic(av[0]);
+
+ if (ac > 1 && *av[1])
+ send_event(EVENT_TOPIC_UPDATED, 2, av[0], av[1]);
+ else
+ send_event(EVENT_TOPIC_UPDATED, 2, av[0], "");
+ }
+ return MOD_CONT;
+}
+
+int anope_event_tburst(char *source, int ac, char **av)
+{
+ char *setter;
+ Channel *c;
+ time_t topic_time;
+
+ if (ac != 4) {
+ return MOD_CONT;
+ }
+
+ setter = myStrGetToken(av[2], '!', 0);
+
+ c = findchan(av[0]);
+ topic_time = strtol(av[1], NULL, 10);
+
+ if (!c) {
+ if (debug) {
+ alog("debug: TOPIC %s for nonexistent channel %s",
+ merge_args(ac - 1, av + 1), av[0]);
+ }
+ if (setter)
+ free(setter);
+ return MOD_CONT;
+ }
+
+ if (check_topiclock(c, topic_time)) {
+ if (setter)
+ free(setter);
+ return MOD_CONT;
+ }
+
+ if (c->topic) {
+ free(c->topic);
+ c->topic = NULL;
+ }
+ if (ac > 1 && *av[3])
+ c->topic = sstrdup(av[3]);
+
+ strscpy(c->topic_setter, setter, sizeof(c->topic_setter));
+ c->topic_time = topic_time;
+
+ record_topic(av[0]);
+ if (setter)
+ free(setter);
+ return MOD_CONT;
+}
+
+int anope_event_436(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+
+ m_nickcoll(av[0]);
+ return MOD_CONT;
+}
+
+
+/* *INDENT-OFF* */
+void moduleAddIRCDMsgs(void)
+{
+ Message *m;
+
+ updateProtectDetails("PROTECT","PROTECTME","protect","deprotect","AUTOPROTECT","+","-");
+
+ if (UseTS6) {
+ TS6SID = sstrdup(Numeric);
+ UseTSMODE = 1; /* TMODE */
+ }
+
+ m = createMessage("401", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("402", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("436", anope_event_436); addCoreMessage(IRCD,m);
+ m = createMessage("AWAY", anope_event_away); addCoreMessage(IRCD,m);
+ m = createMessage("INVITE", anope_event_invite); addCoreMessage(IRCD,m);
+ m = createMessage("JOIN", anope_event_join); addCoreMessage(IRCD,m);
+ m = createMessage("KICK", anope_event_kick); addCoreMessage(IRCD,m);
+ m = createMessage("KILL", anope_event_kill); addCoreMessage(IRCD,m);
+ m = createMessage("MODE", anope_event_mode); addCoreMessage(IRCD,m);
+ m = createMessage("TMODE", anope_event_tmode); addCoreMessage(IRCD,m);
+ m = createMessage("MOTD", anope_event_motd); addCoreMessage(IRCD,m);
+ m = createMessage("NICK", anope_event_nick); addCoreMessage(IRCD,m);
+ m = createMessage("BMASK", anope_event_bmask); addCoreMessage(IRCD,m);
+ m = createMessage("UID", anope_event_nick); addCoreMessage(IRCD,m);
+ m = createMessage("NOTICE", anope_event_notice); addCoreMessage(IRCD,m);
+ m = createMessage("PART", anope_event_part); addCoreMessage(IRCD,m);
+ m = createMessage("PASS", anope_event_pass); addCoreMessage(IRCD,m);
+ m = createMessage("PING", anope_event_ping); addCoreMessage(IRCD,m);
+ m = createMessage("PRIVMSG", anope_event_privmsg); addCoreMessage(IRCD,m);
+ m = createMessage("QUIT", anope_event_quit); addCoreMessage(IRCD,m);
+ m = createMessage("SERVER", anope_event_server); addCoreMessage(IRCD,m);
+ m = createMessage("SQUIT", anope_event_squit); addCoreMessage(IRCD,m);
+ m = createMessage("TOPIC", anope_event_topic); addCoreMessage(IRCD,m);
+ m = createMessage("TB", anope_event_tburst); addCoreMessage(IRCD,m);
+ m = createMessage("USER", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("WALLOPS", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("WHOIS", anope_event_whois); addCoreMessage(IRCD,m);
+ m = createMessage("SVSMODE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SVSNICK", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("CAPAB", anope_event_capab); addCoreMessage(IRCD,m);
+ m = createMessage("SJOIN", anope_event_sjoin); addCoreMessage(IRCD,m);
+ m = createMessage("SVINFO", anope_event_svinfo); addCoreMessage(IRCD,m);
+ m = createMessage("ADMIN", anope_event_admin); addCoreMessage(IRCD,m);
+ m = createMessage("ERROR", anope_event_error); addCoreMessage(IRCD,m);
+ m = createMessage("421", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("ENCAP", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SID", anope_event_sid); addCoreMessage(IRCD,m);
+}
+
+/* *INDENT-ON* */
+
+
+void ratbox_cmd_sqline(char *mask, char *reason)
+{
+ Uid *ud;
+
+ ud = find_uid(s_OperServ);
+ send_cmd((UseTS6 ? (ud ? ud->uid : s_OperServ) : s_OperServ),
+ "RESV * %s :%s", mask, reason);
+}
+
+void ratbox_cmd_unsgline(char *mask)
+{
+ Uid *ud;
+
+ ud = find_uid(s_OperServ);
+ send_cmd((UseTS6 ? (ud ? ud->uid : s_OperServ) : s_OperServ),
+ "UNXLINE * %s", mask);
+}
+
+void ratbox_cmd_unszline(char *mask)
+{
+ /* Does not support */
+}
+
+void ratbox_cmd_szline(char *mask, char *reason, char *whom)
+{
+ /* Does not support */
+}
+
+void ratbox_cmd_svsnoop(char *server, int set)
+{
+ /* does not support */
+}
+
+void ratbox_cmd_svsadmin(char *server, int set)
+{
+ ratbox_cmd_svsnoop(server, set);
+}
+
+void ratbox_cmd_sgline(char *mask, char *reason)
+{
+ Uid *ud;
+
+ ud = find_uid(s_OperServ);
+ send_cmd((UseTS6 ? (ud ? ud->uid : s_OperServ) : s_OperServ),
+ "XLINE * %s 0 :%s", mask, reason);
+}
+
+void ratbox_cmd_remove_akill(char *user, char *host)
+{
+ Uid *ud;
+
+ ud = find_uid(s_OperServ);
+ send_cmd((UseTS6 ? (ud ? ud->uid : s_OperServ) : s_OperServ),
+ "UNKLINE * %s %s", user, host);
+}
+
+void ratbox_cmd_topic(char *whosets, char *chan, char *whosetit,
+ char *topic, time_t when)
+{
+ Uid *ud;
+
+ ud = find_uid(whosets);
+ send_cmd((UseTS6 ? (ud ? ud->uid : whosets) : whosets), "TOPIC %s :%s",
+ chan, topic);
+}
+
+void ratbox_cmd_vhost_off(User * u)
+{
+ /* not supported */
+}
+
+void ratbox_cmd_vhost_on(char *nick, char *vIdent, char *vhost)
+{
+ /* not supported */
+}
+
+void ratbox_cmd_unsqline(char *user)
+{
+ Uid *ud;
+
+ ud = find_uid(s_OperServ);
+ send_cmd((UseTS6 ? (ud ? ud->uid : s_OperServ) : s_OperServ),
+ "UNRESV * %s", user);
+}
+
+void ratbox_cmd_join(char *user, char *channel, time_t chantime)
+{
+ Uid *ud;
+
+ ud = find_uid(user);
+ send_cmd(NULL, "SJOIN %ld %s + :%s", (long int) chantime,
+ channel, (UseTS6 ? (ud ? ud->uid : user) : user));
+}
+
+/*
+oper: the nick of the oper performing the kline
+target.server: the server(s) this kline is destined for
+duration: the duration if a tkline, 0 if permanent.
+user: the 'user' portion of the kline
+host: the 'host' portion of the kline
+reason: the reason for the kline.
+*/
+
+void ratbox_cmd_akill(char *user, char *host, char *who, time_t when,
+ time_t expires, char *reason)
+{
+ Uid *ud;
+
+ ud = find_uid(s_OperServ);
+
+ send_cmd((UseTS6 ? (ud ? ud->uid : s_OperServ) : s_OperServ),
+ "KLINE * %ld %s %s :%s",
+ (long int) (expires - (long) time(NULL)), user, host, reason);
+}
+
+void ratbox_cmd_svskill(char *source, char *user, char *buf)
+{
+ Uid *ud, *ud2;
+
+ if (!buf) {
+ return;
+ }
+
+ if (!source || !user) {
+ return;
+ }
+
+ ud = find_uid(source);
+ ud2 = find_uid(user);
+ send_cmd((UseTS6 ? (ud ? ud->uid : source) : source), "KILL %s :%s",
+ (UseTS6 ? (ud2 ? ud2->uid : user) : user), buf);
+}
+
+void ratbox_cmd_svsmode(User * u, int ac, char **av)
+{
+ send_cmd((UseTS6 ? TS6SID : ServerName), "SVSMODE %s %s", u->nick,
+ av[0]);
+}
+
+/*
+ * SVINFO
+ * parv[0] = sender prefix
+ * parv[1] = TS_CURRENT for the server
+ * parv[2] = TS_MIN for the server
+ * parv[3] = server is standalone or connected to non-TS only
+ * parv[4] = server's idea of UTC time
+ */
+void ratbox_cmd_svinfo()
+{
+ send_cmd(NULL, "SVINFO 6 3 0 :%ld", (long int) time(NULL));
+}
+
+void ratbox_cmd_svsinfo()
+{
+
+}
+
+/* CAPAB */
+/*
+ QS - Can handle quit storm removal
+ EX - Can do channel +e exemptions
+ CHW - Can do channel wall @#
+ LL - Can do lazy links
+ IE - Can do invite exceptions
+ EOB - Can do EOB message
+ KLN - Can do KLINE message
+ GLN - Can do GLINE message
+ HUB - This server is a HUB
+ UID - Can do UIDs
+ ZIP - Can do ZIPlinks
+ ENC - Can do ENCrypted links
+ KNOCK - supports KNOCK
+ TBURST - supports TBURST
+ PARA - supports invite broadcasting for +p
+ ENCAP - ?
+*/
+void ratbox_cmd_capab()
+{
+ send_cmd(NULL,
+ "CAPAB :QS EX CHW IE KLN GLN KNOCK TB UNKLN CLUSTER ENCAP");
+}
+
+/* PASS */
+void ratbox_cmd_pass(char *pass)
+{
+ if (UseTS6) {
+ send_cmd(NULL, "PASS %s TS 6 :%s", pass, TS6SID);
+ } else {
+ send_cmd(NULL, "PASS %s :TS", pass);
+ }
+}
+
+/* SERVER name hop descript */
+void ratbox_cmd_server(char *servname, int hop, char *descript)
+{
+ send_cmd(NULL, "SERVER %s %d :%s", servname, hop, descript);
+}
+
+void ratbox_cmd_connect(int servernum)
+{
+ /* Make myself known to myself in the serverlist */
+ if (UseTS6) {
+ me_server =
+ new_server(NULL, ServerName, ServerDesc, SERVER_ISME, TS6SID);
+ } else {
+ me_server =
+ new_server(NULL, ServerName, ServerDesc, SERVER_ISME, NULL);
+ }
+ if (servernum == 1)
+ ratbox_cmd_pass(RemotePassword);
+ else if (servernum == 2)
+ ratbox_cmd_pass(RemotePassword2);
+ else if (servernum == 3)
+ ratbox_cmd_pass(RemotePassword3);
+
+ ratbox_cmd_capab();
+ ratbox_cmd_server(ServerName, 1, ServerDesc);
+ ratbox_cmd_svinfo();
+}
+
+void ratbox_cmd_bot_nick(char *nick, char *user, char *host, char *real,
+ char *modes)
+{
+ EnforceQlinedNick(nick, NULL);
+ if (UseTS6) {
+ char *uidbuf = ts6_uid_retrieve();
+ send_cmd(TS6SID, "UID %s 1 %ld %s %s %s 0 %s :%s", nick,
+ (long int) time(NULL), modes, user, host, uidbuf,
+ real);
+ new_uid(nick, uidbuf);
+ } else {
+ send_cmd(NULL, "NICK %s 1 %ld %s %s %s %s :%s", nick,
+ (long int) time(NULL), modes, user, host, ServerName,
+ real);
+ }
+ ratbox_cmd_sqline(nick, "Reserved for services");
+}
+
+void ratbox_cmd_part(char *nick, char *chan, char *buf)
+{
+ Uid *ud;
+
+ ud = find_uid(nick);
+
+ if (buf) {
+ send_cmd((UseTS6 ? ud->uid : nick), "PART %s :%s", chan, buf);
+ } else {
+ send_cmd((UseTS6 ? ud->uid : nick), "PART %s", chan);
+ }
+}
+
+int anope_event_ping(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+ ratbox_cmd_pong(ac > 1 ? av[1] : ServerName, av[0]);
+ return MOD_CONT;
+}
+
+int anope_event_away(char *source, int ac, char **av)
+{
+ User *u = NULL;
+
+ if (UseTS6) {
+ u = find_byuid(source);
+ }
+
+ m_away((UseTS6 ? (u ? u->nick : source) : source),
+ (ac ? av[0] : NULL));
+ return MOD_CONT;
+}
+
+int anope_event_kill(char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+
+ m_kill(av[0], av[1]);
+ return MOD_CONT;
+}
+
+int anope_event_kick(char *source, int ac, char **av)
+{
+ if (ac != 3)
+ return MOD_CONT;
+ do_kick(source, ac, av);
+ return MOD_CONT;
+}
+
+void ratbox_cmd_eob()
+{
+ /* doesn't support EOB */
+}
+
+int anope_event_join(char *source, int ac, char **av)
+{
+ if (ac != 1) {
+ do_sjoin(source, ac, av);
+ return MOD_CONT;
+ } else {
+ do_join(source, ac, av);
+ }
+ return MOD_CONT;
+}
+
+int anope_event_motd(char *source, int ac, char **av)
+{
+ if (!source) {
+ return MOD_CONT;
+ }
+
+ m_motd(source);
+ return MOD_CONT;
+}
+
+int anope_event_privmsg(char *source, int ac, char **av)
+{
+ User *u;
+ Uid *ud;
+
+ if (ac != 2) {
+ return MOD_CONT;
+ }
+
+ u = find_byuid(source);
+ ud = find_nickuid(av[0]);
+ m_privmsg((UseTS6 ? (u ? u->nick : source) : source),
+ (UseTS6 ? (ud ? ud->nick : av[0]) : av[0]), av[1]);
+ return MOD_CONT;
+}
+
+int anope_event_part(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac < 1 || ac > 2) {
+ return MOD_CONT;
+ }
+
+ u = find_byuid(source);
+ do_part((UseTS6 ? (u ? u->nick : source) : source), ac, av);
+
+ return MOD_CONT;
+}
+
+int anope_event_whois(char *source, int ac, char **av)
+{
+ Uid *ud;
+
+ if (source && ac >= 1) {
+ ud = find_nickuid(av[0]);
+ m_whois(source, (UseTS6 ? (ud ? ud->nick : av[0]) : av[0]));
+ }
+ return MOD_CONT;
+}
+
+/* EVENT: SERVER */
+int anope_event_server(char *source, int ac, char **av)
+{
+ if (!stricmp(av[1], "1")) {
+ uplink = sstrdup(av[0]);
+ if (UseTS6 && TS6UPLINK) {
+ do_server(source, av[0], av[1], av[2], TS6UPLINK);
+ } else {
+ do_server(source, av[0], av[1], av[2], NULL);
+ }
+ } else {
+ do_server(source, av[0], av[1], av[2], NULL);
+ }
+ return MOD_CONT;
+}
+
+int anope_event_sid(char *source, int ac, char **av)
+{
+ Server *s;
+
+ /* :42X SID trystan.nomadirc.net 2 43X :ircd-ratbox test server */
+
+ s = findserver_uid(servlist, source);
+
+ do_server(s->name, av[0], av[1], av[3], av[2]);
+ return MOD_CONT;
+}
+
+int anope_event_squit(char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+ do_squit(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_quit(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 1) {
+ return MOD_CONT;
+ }
+
+ u = find_byuid(source);
+
+ do_quit((UseTS6 ? (u ? u->nick : source) : source), ac, av);
+ return MOD_CONT;
+}
+
+void ratbox_cmd_372(char *source, char *msg)
+{
+ send_cmd((UseTS6 ? TS6SID : ServerName), "372 %s :- %s", source, msg);
+}
+
+void ratbox_cmd_372_error(char *source)
+{
+ send_cmd((UseTS6 ? TS6SID : ServerName),
+ "422 %s :- MOTD file not found! Please "
+ "contact your IRC administrator.", source);
+}
+
+void ratbox_cmd_375(char *source)
+{
+ send_cmd((UseTS6 ? TS6SID : ServerName),
+ "375 %s :- %s Message of the Day", source, ServerName);
+}
+
+void ratbox_cmd_376(char *source)
+{
+ send_cmd((UseTS6 ? TS6SID : ServerName),
+ "376 %s :End of /MOTD command.", source);
+}
+
+/* 391 */
+void ratbox_cmd_391(char *source, char *timestr)
+{
+ if (!timestr) {
+ return;
+ }
+ send_cmd(NULL, "391 :%s %s :%s", source, ServerName, timestr);
+}
+
+/* 250 */
+void ratbox_cmd_250(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "250 %s", buf);
+}
+
+/* 307 */
+void ratbox_cmd_307(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd((UseTS6 ? TS6SID : ServerName), "307 %s", buf);
+}
+
+/* 311 */
+void ratbox_cmd_311(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd((UseTS6 ? TS6SID : ServerName), "311 %s", buf);
+}
+
+/* 312 */
+void ratbox_cmd_312(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd((UseTS6 ? TS6SID : ServerName), "312 %s", buf);
+}
+
+/* 317 */
+void ratbox_cmd_317(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd((UseTS6 ? TS6SID : ServerName), "317 %s", buf);
+}
+
+/* 219 */
+void ratbox_cmd_219(char *source, char *letter)
+{
+ if (!source) {
+ return;
+ }
+
+ if (letter) {
+ send_cmd(NULL, "219 %s %c :End of /STATS report.", source,
+ *letter);
+ } else {
+ send_cmd(NULL, "219 %s l :End of /STATS report.", source);
+ }
+}
+
+/* 401 */
+void ratbox_cmd_401(char *source, char *who)
+{
+ if (!source || !who) {
+ return;
+ }
+ send_cmd((UseTS6 ? TS6SID : ServerName), "401 %s %s :No such service.",
+ source, who);
+}
+
+/* 318 */
+void ratbox_cmd_318(char *source, char *who)
+{
+ if (!source || !who) {
+ return;
+ }
+
+ send_cmd((UseTS6 ? TS6SID : ServerName),
+ "318 %s %s :End of /WHOIS list.", source, who);
+}
+
+/* 242 */
+void ratbox_cmd_242(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "242 %s", buf);
+}
+
+/* 243 */
+void ratbox_cmd_243(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "243 %s", buf);
+}
+
+/* 211 */
+void ratbox_cmd_211(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "211 %s", buf);
+}
+
+void ratbox_cmd_mode(char *source, char *dest, char *buf)
+{
+ Uid *ud;
+ if (!buf) {
+ return;
+ }
+
+ if (source) {
+ ud = find_uid(source);
+ send_cmd((UseTS6 ? (ud ? ud->uid : source) : source), "MODE %s %s",
+ dest, buf);
+ } else {
+ send_cmd(source, "MODE %s %s", dest, buf);
+ }
+}
+
+void ratbox_cmd_tmode(char *source, char *dest, const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ *buf = '\0';
+
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+ if (!*buf) {
+ return;
+ }
+
+ send_cmd(NULL, "MODE %s %s", dest, buf);
+}
+
+void ratbox_cmd_nick(char *nick, char *name, char *mode)
+{
+ EnforceQlinedNick(nick, NULL);
+ if (UseTS6) {
+ char *uidbuf = ts6_uid_retrieve();
+ send_cmd(TS6SID, "UID %s 1 %ld %s %s %s 0 %s :%s", nick,
+ (long int) time(NULL), mode, ServiceUser, ServiceHost,
+ uidbuf, name);
+ new_uid(nick, uidbuf);
+ } else {
+ send_cmd(NULL, "NICK %s 1 %ld %s %s %s %s :%s", nick,
+ (long int) time(NULL), mode, ServiceUser, ServiceHost,
+ ServerName, name);
+ }
+ ratbox_cmd_sqline(nick, "Reserved for services");
+}
+
+void ratbox_cmd_kick(char *source, char *chan, char *user, char *buf)
+{
+ Uid *ud;
+ User *u;
+
+ ud = find_uid(source);
+ u = finduser(user);
+
+ if (buf) {
+ send_cmd((UseTS6 ? (ud ? ud->uid : source) : source),
+ "KICK %s %s :%s", chan,
+ (UseTS6 ? (u ? u->uid : user) : user), buf);
+ } else {
+ send_cmd((UseTS6 ? (ud ? ud->uid : source) : source), "KICK %s %s",
+ chan, (UseTS6 ? (u ? u->uid : user) : user));
+ }
+}
+
+void ratbox_cmd_notice_ops(char *source, char *dest, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "NOTICE @%s :%s", dest, buf);
+}
+
+void ratbox_cmd_bot_chan_mode(char *nick, char *chan)
+{
+ Uid *u;
+
+ if (UseTS6) {
+ u = find_uid(nick);
+ ratbox_cmd_tmode(nick, chan, "%s %s", ircd->botchanumode,
+ (u ? u->uid : nick));
+ } else {
+ anope_cmd_mode(nick, chan, "%s %s", ircd->botchanumode, nick);
+ }
+}
+
+/* QUIT */
+void ratbox_cmd_quit(char *source, char *buf)
+{
+ Uid *ud;
+ ud = find_uid(source);
+
+ if (buf) {
+ send_cmd((UseTS6 ? (ud ? ud->uid : source) : source), "QUIT :%s",
+ buf);
+ } else {
+ send_cmd((UseTS6 ? (ud ? ud->uid : source) : source), "QUIT");
+ }
+}
+
+/* PONG */
+void ratbox_cmd_pong(char *servname, char *who)
+{
+ if (UseTS6) {
+ send_cmd(TS6SID, "PONG %s", who);
+ } else {
+ send_cmd(servname, "PONG %s", who);
+ }
+}
+
+/* INVITE */
+void ratbox_cmd_invite(char *source, char *chan, char *nick)
+{
+ Uid *ud;
+ User *u;
+
+ if (!source || !chan || !nick) {
+ return;
+ }
+
+ ud = find_uid(source);
+ u = finduser(nick);
+
+ send_cmd((UseTS6 ? (ud ? ud->uid : source) : source), "INVITE %s %s",
+ (UseTS6 ? (u ? u->uid : nick) : nick), chan);
+}
+
+/* SQUIT */
+void ratbox_cmd_squit(char *servname, char *message)
+{
+ if (!servname || !message) {
+ return;
+ }
+
+ send_cmd(NULL, "SQUIT %s :%s", servname, message);
+}
+
+int anope_event_mode(char *source, int ac, char **av)
+{
+ User *u, *u2;
+
+ if (ac < 2) {
+ return MOD_CONT;
+ }
+
+ if (*av[0] == '#' || *av[0] == '&') {
+ do_cmode(source, ac, av);
+ } else {
+ if (UseTS6) {
+ u = find_byuid(source);
+ u2 = find_byuid(av[0]);
+ av[0] = u2->nick;
+ do_umode(u->nick, ac, av);
+ } else {
+ do_umode(source, ac, av);
+ }
+ }
+ return MOD_CONT;
+}
+
+int anope_event_tmode(char *source, int ac, char **av)
+{
+ if (*av[1] == '#' || *av[1] == '&') {
+ do_cmode(source, ac, av);
+ }
+ return MOD_CONT;
+}
+
+void ratbox_cmd_351(char *source)
+{
+ send_cmd((UseTS6 ? TS6SID : ServerName),
+ "351 %s Anope-%s %s :%s - %s (%s) -- %s", source, version_number,
+ ServerName, ircd->name, version_flags, EncModule, version_build);
+
+}
+
+/* Event: PROTOCTL */
+int anope_event_capab(char *source, int ac, char **av)
+{
+ int argvsize = 8;
+ int argc;
+ char **argv;
+ char *str;
+
+ if (ac < 1)
+ return MOD_CONT;
+
+ /* We get the params as one arg, we should split it for capab_parse */
+ argv = scalloc(argvsize, sizeof(char *));
+ argc = 0;
+ while ((str = myStrGetToken(av[0], ' ', argc))) {
+ if (argc == argvsize) {
+ argvsize += 8;
+ argv = srealloc(argv, argvsize * sizeof(char *));
+ }
+ argv[argc] = str;
+ argc++;
+ }
+
+ capab_parse(argc, argv);
+
+ /* Free our built ac/av */
+ for (argvsize = 0; argvsize < argc; argvsize++) {
+ free(argv[argvsize]);
+ }
+ free(argv);
+
+ return MOD_CONT;
+}
+
+/* SVSHOLD - set */
+void ratbox_cmd_svshold(char *nick)
+{
+ /* Not supported by this IRCD */
+}
+
+/* SVSHOLD - release */
+void ratbox_cmd_release_svshold(char *nick)
+{
+ /* Not Supported by this IRCD */
+}
+
+/* SVSNICK */
+void ratbox_cmd_svsnick(char *nick, char *newnick, time_t when)
+{
+ /* not supported */
+}
+
+void ratbox_cmd_guest_nick(char *nick, char *user, char *host, char *real,
+ char *modes)
+{
+ /* not supported */
+}
+
+void ratbox_cmd_svso(char *source, char *nick, char *flag)
+{
+ /* Not Supported by this IRCD */
+}
+
+void ratbox_cmd_unban(char *name, char *nick)
+{
+ /* Not Supported by this IRCD */
+}
+
+/* SVSMODE channel modes */
+
+void ratbox_cmd_svsmode_chan(char *name, char *mode, char *nick)
+{
+ /* Not Supported by this IRCD */
+}
+
+/* SVSMODE +d */
+/* sent if svid is something weird */
+void ratbox_cmd_svid_umode(char *nick, time_t ts)
+{
+ /* not supported */
+}
+
+/* SVSMODE +d */
+/* nc_change was = 1, and there is no na->status */
+void ratbox_cmd_nc_change(User * u)
+{
+ /* not supported */
+}
+
+/* SVSMODE +d */
+void ratbox_cmd_svid_umode2(User * u, char *ts)
+{
+ /* not supported */
+}
+
+void ratbox_cmd_svid_umode3(User * u, char *ts)
+{
+ /* not used */
+}
+
+/* NICK <newnick> */
+void ratbox_cmd_chg_nick(char *oldnick, char *newnick)
+{
+ if (!oldnick || !newnick) {
+ return;
+ }
+
+ send_cmd(oldnick, "NICK %s", newnick);
+}
+
+/*
+ * SVINFO
+ * parv[0] = sender prefix
+ * parv[1] = TS_CURRENT for the server
+ * parv[2] = TS_MIN for the server
+ * parv[3] = server is standalone or connected to non-TS only
+ * parv[4] = server's idea of UTC time
+ */
+int anope_event_svinfo(char *source, int ac, char **av)
+{
+ /* currently not used but removes the message : unknown message from server */
+ return MOD_CONT;
+}
+
+int anope_event_pass(char *source, int ac, char **av)
+{
+ if (UseTS6) {
+ TS6UPLINK = sstrdup(av[3]);
+ }
+ return MOD_CONT;
+}
+
+void ratbox_cmd_svsjoin(char *source, char *nick, char *chan, char *param)
+{
+ /* Not Supported by this IRCD */
+}
+
+void ratbox_cmd_svspart(char *source, char *nick, char *chan)
+{
+ /* Not Supported by this IRCD */
+}
+
+void ratbox_cmd_swhois(char *source, char *who, char *mask)
+{
+ /* not supported */
+}
+
+int anope_event_notice(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_admin(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_invite(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_bmask(char *source, int ac, char **av)
+{
+ Channel *c;
+ char *bans;
+ char *b;
+ int count, i;
+
+ /* :42X BMASK 1106409026 #ircops b :*!*@*.aol.com */
+ /* 0 1 2 3 */
+ c = findchan(av[1]);
+
+ if (c) {
+ bans = sstrdup(av[3]);
+ count = myNumToken(bans, ' ');
+ for (i = 0; i <= count - 1; i++) {
+ b = myStrGetToken(bans, ' ', i);
+ if (!stricmp(av[2], "b")) {
+ add_ban(c, b);
+ }
+ if (!stricmp(av[2], "e")) {
+ add_exception(c, b);
+ }
+ if (!stricmp(av[2], "I")) {
+ add_invite(c, b);
+ }
+ if (b)
+ free(b);
+ }
+ free(bans);
+ }
+ return MOD_CONT;
+}
+
+int ratbox_flood_mode_check(char *value)
+{
+ return 0;
+}
+
+int anope_event_error(char *source, int ac, char **av)
+{
+ if (ac >= 1) {
+ if (debug) {
+ alog("debug: %s", av[0]);
+ }
+ }
+ return MOD_CONT;
+}
+
+void ratbox_cmd_jupe(char *jserver, char *who, char *reason)
+{
+ char rbuf[256];
+
+ snprintf(rbuf, sizeof(rbuf), "Juped by %s%s%s", who,
+ reason ? ": " : "", reason ? reason : "");
+
+ if (findserver(servlist, jserver))
+ ratbox_cmd_squit(jserver, rbuf);
+ ratbox_cmd_server(jserver, 2, rbuf);
+ new_server(me_server, jserver, rbuf, SERVER_JUPED, NULL);
+}
+
+/*
+ 1 = valid nick
+ 0 = nick is in valid
+*/
+int ratbox_valid_nick(char *nick)
+{
+ /* TS6 Save extension -Certus */
+ if (isdigit(*nick))
+ return 0;
+ return 1;
+}
+
+/*
+ 1 = valid chan
+ 0 = chan is in valid
+*/
+int ratbox_valid_chan(char *chan)
+{
+ /* no hard coded invalid chans */
+ return 1;
+}
+
+
+void ratbox_cmd_ctcp(char *source, char *dest, char *buf)
+{
+ char *s;
+
+ if (!buf) {
+ return;
+ } else {
+ s = normalizeBuffer(buf);
+ }
+
+ send_cmd(source, "NOTICE %s :\1%s \1", dest, s);
+ free(s);
+}
+
+
+/**
+ * Tell anope which function we want to perform each task inside of anope.
+ * These prototypes must match what anope expects.
+ **/
+void moduleAddAnopeCmds()
+{
+ pmodule_cmd_svsnoop(ratbox_cmd_svsnoop);
+ pmodule_cmd_remove_akill(ratbox_cmd_remove_akill);
+ pmodule_cmd_topic(ratbox_cmd_topic);
+ pmodule_cmd_vhost_off(ratbox_cmd_vhost_off);
+ pmodule_cmd_akill(ratbox_cmd_akill);
+ pmodule_cmd_svskill(ratbox_cmd_svskill);
+ pmodule_cmd_svsmode(ratbox_cmd_svsmode);
+ pmodule_cmd_372(ratbox_cmd_372);
+ pmodule_cmd_372_error(ratbox_cmd_372_error);
+ pmodule_cmd_375(ratbox_cmd_375);
+ pmodule_cmd_376(ratbox_cmd_376);
+ pmodule_cmd_nick(ratbox_cmd_nick);
+ pmodule_cmd_guest_nick(ratbox_cmd_guest_nick);
+ pmodule_cmd_mode(ratbox_cmd_mode);
+ pmodule_cmd_bot_nick(ratbox_cmd_bot_nick);
+ pmodule_cmd_kick(ratbox_cmd_kick);
+ pmodule_cmd_notice_ops(ratbox_cmd_notice_ops);
+ pmodule_cmd_notice(ratbox_cmd_notice);
+ pmodule_cmd_notice2(ratbox_cmd_notice2);
+ pmodule_cmd_privmsg(ratbox_cmd_privmsg);
+ pmodule_cmd_privmsg2(ratbox_cmd_privmsg2);
+ pmodule_cmd_serv_notice(ratbox_cmd_serv_notice);
+ pmodule_cmd_serv_privmsg(ratbox_cmd_serv_privmsg);
+ pmodule_cmd_bot_chan_mode(ratbox_cmd_bot_chan_mode);
+ pmodule_cmd_351(ratbox_cmd_351);
+ pmodule_cmd_quit(ratbox_cmd_quit);
+ pmodule_cmd_pong(ratbox_cmd_pong);
+ pmodule_cmd_join(ratbox_cmd_join);
+ pmodule_cmd_unsqline(ratbox_cmd_unsqline);
+ pmodule_cmd_invite(ratbox_cmd_invite);
+ pmodule_cmd_part(ratbox_cmd_part);
+ pmodule_cmd_391(ratbox_cmd_391);
+ pmodule_cmd_250(ratbox_cmd_250);
+ pmodule_cmd_307(ratbox_cmd_307);
+ pmodule_cmd_311(ratbox_cmd_311);
+ pmodule_cmd_312(ratbox_cmd_312);
+ pmodule_cmd_317(ratbox_cmd_317);
+ pmodule_cmd_219(ratbox_cmd_219);
+ pmodule_cmd_401(ratbox_cmd_401);
+ pmodule_cmd_318(ratbox_cmd_318);
+ pmodule_cmd_242(ratbox_cmd_242);
+ pmodule_cmd_243(ratbox_cmd_243);
+ pmodule_cmd_211(ratbox_cmd_211);
+ pmodule_cmd_global(ratbox_cmd_global);
+ pmodule_cmd_global_legacy(ratbox_cmd_global_legacy);
+ pmodule_cmd_sqline(ratbox_cmd_sqline);
+ pmodule_cmd_squit(ratbox_cmd_squit);
+ pmodule_cmd_svso(ratbox_cmd_svso);
+ pmodule_cmd_chg_nick(ratbox_cmd_chg_nick);
+ pmodule_cmd_svsnick(ratbox_cmd_svsnick);
+ pmodule_cmd_vhost_on(ratbox_cmd_vhost_on);
+ pmodule_cmd_connect(ratbox_cmd_connect);
+ pmodule_cmd_svshold(ratbox_cmd_svshold);
+ pmodule_cmd_release_svshold(ratbox_cmd_release_svshold);
+ pmodule_cmd_unsgline(ratbox_cmd_unsgline);
+ pmodule_cmd_unszline(ratbox_cmd_unszline);
+ pmodule_cmd_szline(ratbox_cmd_szline);
+ pmodule_cmd_sgline(ratbox_cmd_sgline);
+ pmodule_cmd_unban(ratbox_cmd_unban);
+ pmodule_cmd_svsmode_chan(ratbox_cmd_svsmode_chan);
+ pmodule_cmd_svid_umode(ratbox_cmd_svid_umode);
+ pmodule_cmd_nc_change(ratbox_cmd_nc_change);
+ pmodule_cmd_svid_umode2(ratbox_cmd_svid_umode2);
+ pmodule_cmd_svid_umode3(ratbox_cmd_svid_umode3);
+ pmodule_cmd_svsjoin(ratbox_cmd_svsjoin);
+ pmodule_cmd_svspart(ratbox_cmd_svspart);
+ pmodule_cmd_swhois(ratbox_cmd_swhois);
+ pmodule_cmd_eob(ratbox_cmd_eob);
+ pmodule_flood_mode_check(ratbox_flood_mode_check);
+ pmodule_cmd_jupe(ratbox_cmd_jupe);
+ pmodule_valid_nick(ratbox_valid_nick);
+ pmodule_valid_chan(ratbox_valid_chan);
+ pmodule_cmd_ctcp(ratbox_cmd_ctcp);
+ pmodule_set_umode(ratbox_set_umode);
+}
+
+/**
+ * Now tell anope how to use us.
+ **/
+int AnopeInit(int argc, char **argv)
+{
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(PROTOCOL);
+
+ pmodule_ircd_version("Ratbox IRCD 2.0+");
+ pmodule_ircd_cap(myIrcdcap);
+ pmodule_ircd_var(myIrcd);
+ pmodule_ircd_cbmodeinfos(myCbmodeinfos);
+ pmodule_ircd_cumodes(myCumodes);
+ pmodule_ircd_flood_mode_char_set("");
+ pmodule_ircd_flood_mode_char_remove("");
+ pmodule_ircd_cbmodes(myCbmodes);
+ pmodule_ircd_cmmodes(myCmmodes);
+ pmodule_ircd_csmodes(myCsmodes);
+ pmodule_ircd_useTSMode(1);
+
+ /** Deal with modes anope _needs_ to know **/
+ pmodule_invis_umode(UMODE_i);
+ pmodule_oper_umode(UMODE_o);
+ pmodule_invite_cmode(CMODE_i);
+ pmodule_secret_cmode(CMODE_s);
+ pmodule_private_cmode(CMODE_p);
+ pmodule_key_mode(CMODE_k);
+ pmodule_limit_mode(CMODE_l);
+
+ moduleAddAnopeCmds();
+ moduleAddIRCDMsgs();
+
+ return MOD_CONT;
+}
diff --git a/src/protocol/ratbox.h b/src/protocol/ratbox.h
new file mode 100644
index 000000000..4088bd7be
--- /dev/null
+++ b/src/protocol/ratbox.h
@@ -0,0 +1,119 @@
+/* Ratbox IRCD functions
+ *
+ * (C) 2003-2008 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.
+ *
+ *
+ */
+
+#define UMODE_a 0x00000001
+#define UMODE_C 0x00000002
+#define UMODE_i 0x00000004
+#define UMODE_o 0x00000008
+#define UMODE_z 0x00000010
+#define UMODE_w 0x00000020
+#define UMODE_s 0x00000040
+#define UMODE_c 0x00000080
+#define UMODE_r 0x00000100
+#define UMODE_k 0x00000200
+#define UMODE_f 0x00000400
+#define UMODE_y 0x00000800
+#define UMODE_d 0x00001000
+#define UMODE_n 0x00002000
+#define UMODE_x 0x00004000
+#define UMODE_u 0x00008000
+#define UMODE_b 0x00010000
+#define UMODE_l 0x00020000
+#define UMODE_g 0x00040000
+#define UMODE_Z 0x00080000
+
+#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
+#define CMODE_l 0x00000080
+
+
+#define DEFAULT_MLOCK CMODE_n | CMODE_t
+
+
+void ratbox_set_umode(User * user, int ac, char **av);
+void ratbox_cmd_svsnoop(char *server, int set);
+void ratbox_cmd_remove_akill(char *user, char *host);
+void ratbox_cmd_topic(char *whosets, char *chan, char *whosetit, char *topic, time_t when);
+void ratbox_cmd_vhost_off(User * u);
+void ratbox_cmd_akill(char *user, char *host, char *who, time_t when,time_t expires, char *reason);
+void ratbox_cmd_svskill(char *source, char *user, char *buf);
+void ratbox_cmd_svsmode(User * u, int ac, char **av);
+void ratbox_cmd_372(char *source, char *msg);
+void ratbox_cmd_372_error(char *source);
+void ratbox_cmd_375(char *source);
+void ratbox_cmd_376(char *source);
+void ratbox_cmd_nick(char *nick, char *name, char *modes);
+void ratbox_cmd_guest_nick(char *nick, char *user, char *host, char *real, char *modes);
+void ratbox_cmd_mode(char *source, char *dest, char *buf);
+void ratbox_cmd_bot_nick(char *nick, char *user, char *host, char *real, char *modes);
+void ratbox_cmd_kick(char *source, char *chan, char *user, char *buf);
+void ratbox_cmd_notice_ops(char *source, char *dest, char *buf);
+void ratbox_cmd_notice(char *source, char *dest, char *buf);
+void ratbox_cmd_notice2(char *source, char *dest, char *msg);
+void ratbox_cmd_privmsg(char *source, char *dest, char *buf);
+void ratbox_cmd_privmsg2(char *source, char *dest, char *msg);
+void ratbox_cmd_serv_notice(char *source, char *dest, char *msg);
+void ratbox_cmd_serv_privmsg(char *source, char *dest, char *msg);
+void ratbox_cmd_bot_chan_mode(char *nick, char *chan);
+void ratbox_cmd_351(char *source);
+void ratbox_cmd_quit(char *source, char *buf);
+void ratbox_cmd_pong(char *servname, char *who);
+void ratbox_cmd_join(char *user, char *channel, time_t chantime);
+void ratbox_cmd_unsqline(char *user);
+void ratbox_cmd_invite(char *source, char *chan, char *nick);
+void ratbox_cmd_part(char *nick, char *chan, char *buf);
+void ratbox_cmd_391(char *source, char *timestr);
+void ratbox_cmd_250(char *buf);
+void ratbox_cmd_307(char *buf);
+void ratbox_cmd_311(char *buf);
+void ratbox_cmd_312(char *buf);
+void ratbox_cmd_317(char *buf);
+void ratbox_cmd_219(char *source, char *letter);
+void ratbox_cmd_401(char *source, char *who);
+void ratbox_cmd_318(char *source, char *who);
+void ratbox_cmd_242(char *buf);
+void ratbox_cmd_243(char *buf);
+void ratbox_cmd_211(char *buf);
+void ratbox_cmd_global(char *source, char *buf);
+void ratbox_cmd_global_legacy(char *source, char *fmt);
+void ratbox_cmd_sqline(char *mask, char *reason);
+void ratbox_cmd_squit(char *servname, char *message);
+void ratbox_cmd_svso(char *source, char *nick, char *flag);
+void ratbox_cmd_chg_nick(char *oldnick, char *newnick);
+void ratbox_cmd_svsnick(char *source, char *guest, time_t when);
+void ratbox_cmd_vhost_on(char *nick, char *vIdent, char *vhost);
+void ratbox_cmd_connect(int servernum);
+void ratbox_cmd_svshold(char *nick);
+void ratbox_cmd_release_svshold(char *nick);
+void ratbox_cmd_unsgline(char *mask);
+void ratbox_cmd_unszline(char *mask);
+void ratbox_cmd_szline(char *mask, char *reason, char *whom);
+void ratbox_cmd_sgline(char *mask, char *reason);
+void ratbox_cmd_unban(char *name, char *nick);
+void ratbox_cmd_svsmode_chan(char *name, char *mode, char *nick);
+void ratbox_cmd_svid_umode(char *nick, time_t ts);
+void ratbox_cmd_nc_change(User * u);
+void ratbox_cmd_svid_umode2(User * u, char *ts);
+void ratbox_cmd_svid_umode3(User * u, char *ts);
+void ratbox_cmd_eob();
+int ratbox_flood_mode_check(char *value);
+void ratbox_cmd_jupe(char *jserver, char *who, char *reason);
+int ratbox_valid_nick(char *nick);
+void ratbox_cmd_ctcp(char *source, char *dest, char *buf);
+
+
diff --git a/src/protocol/shadowircd.c b/src/protocol/shadowircd.c
new file mode 100644
index 000000000..0061a538b
--- /dev/null
+++ b/src/protocol/shadowircd.c
@@ -0,0 +1,1833 @@
+/* ShadowIRCd functions
+ *
+ * (C) 2003-2008 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.
+ *
+ * Provided by the ShadowIRCd development group. See
+ * http://www.shadowircd.net for details.
+ */
+
+#include "services.h"
+#include "pseudo.h"
+#include "shadowircd.h"
+
+IRCDVar myIrcd[] = {
+ {"ShadowIRCd 4.0+", /* ircd name */
+ "+oiqSK", /* nickserv mode */
+ "+oiqSK", /* chanserv mode */
+ "+oiqSK", /* memoserv mode */
+ "+oiqSK", /* hostserv mode */
+ "+oiqSK", /* operserv mode */
+ "+oiqSK", /* botserv mode */
+ "+oiqSK", /* helpserv mode */
+ "+oiqSK", /* Dev/Null mode */
+ "+oiqSK", /* Global mode */
+ "+oiqSK", /* nickserv alias mode */
+ "+oiqSK", /* chanserv alias mode */
+ "+oiqSK", /* memoserv alias mode */
+ "+oiqSK", /* hostserv alias mode */
+ "+oiqSK", /* operserv alias mode */
+ "+oiqSK", /* botserv alias mode */
+ "+oiqSK", /* helpserv alias mode */
+ "+oiqSK", /* Dev/Null alias mode */
+ "+oiqSK", /* Global alias mode */
+ "+oiqSK", /* Used by BotServ Bots */
+ 4, /* Chan Max Symbols */
+ "-cimnprstvzAEFGKLNOPRSTV", /* Modes to Remove */
+ "+o", /* Channel Umode used by Botserv bots */
+ 1, /* SVSNICK */
+ 1, /* Vhost */
+ 0, /* Has Owner */
+ NULL, /* Mode to set for an owner */
+ NULL, /* Mode to unset for an owner */
+ "+a", /* Mode to set for channel admin */
+ "-a", /* Mode to unset for channel admin */
+ "+e", /* Mode On Reg */
+ NULL, /* Mode on ID for Roots */
+ NULL, /* Mode on ID for Admins */
+ NULL, /* Mode on ID for Opers */
+ "-e", /* Mode on UnReg */
+ "-e", /* Mode on Nick Change */
+ 0, /* Supports SGlines */
+ 1, /* Supports SQlines */
+ 0, /* Supports SZlines */
+ 1, /* Supports Halfop +h */
+ 4, /* Number of server args */
+ 0, /* Join 2 Set */
+ 0, /* Join 2 Message */
+ 1, /* Has exceptions +e */
+ 0, /* TS Topic Forward */
+ 0, /* TS Topci Backward */
+ 0, /* Protected Umode */
+ 1, /* Has Admin */
+ 1, /* Chan SQlines */
+ 1, /* Quit on Kill */
+ 0, /* SVSMODE unban */
+ 0, /* Has Protect */
+ 0, /* Reverse */
+ 1, /* Chan Reg */
+ 1, /* Channel Mode */
+ 1, /* vidents */
+ 0, /* svshold */
+ 0, /* time stamp on mode */
+ 0, /* NICKIP */
+ 1, /* UMODE */
+ 0, /* O:LINE */
+ 1, /* VHOST ON NICK */
+ 1, /* Change RealName */
+ CMODE_K, /* No Knock */
+ CMODE_A, /* Admin Only */
+ DEFAULT_MLOCK, /* Default MLOCK */
+ UMODE_v, /* Vhost Mode */
+ 0, /* +f */
+ 0, /* +L */
+ 0, /* +f Mode */
+ 0, /* +L Mode */
+ 1, /* On nick change check if they could be identified */
+ 0, /* No Knock requires +i */
+ NULL, /* CAPAB Chan Modes */
+ 0, /* We support TOKENS */
+ 1, /* TOKENS are CASE inSensitive */
+ 0, /* TIME STAMPS are BASE64 */
+ 1, /* +I support */
+ 0, /* SJOIN ban char */
+ 0, /* SJOIN except char */
+ 0, /* SJOIN invite char */
+ 0, /* Can remove User Channel Modes with SVSMODE */
+ 0, /* Sglines are not enforced until user reconnects */
+ "v", /* vhost char */
+ 1, /* ts6 */
+ 0, /* support helper umode */
+ 0, /* p10 */
+ NULL, /* character set */
+ 1, /* reports sync state */
+ 0, /* CIDR channelbans */
+ }
+ ,
+ {NULL}
+};
+
+/* ShadowIRCd does not use CAPAB */
+IRCDCAPAB myIrcdcap[] = {
+ {
+ 0, /* NOQUIT */
+ 0, /* TSMODE */
+ 0, /* UNCONNECT */
+ 0, /* NICKIP */
+ 0, /* SJOIN */
+ 0, /* ZIP */
+ 0, /* BURST */
+ 0, /* TS5 */
+ 0, /* TS3 */
+ 0, /* DKEY */
+ 0, /* PT4 */
+ 0, /* SCS */
+ 0, /* QS */
+ 0, /* UID */
+ 0, /* KNOCK */
+ 0, /* CLIENT */
+ 0, /* IPV6 */
+ 0, /* SSJ5 */
+ 0, /* SN2 */
+ 0, /* TOKEN */
+ 0, /* VHOST */
+ 0, /* SSJ3 */
+ 0, /* NICK2 */
+ 0, /* UMODE2 */
+ 0, /* VL */
+ 0, /* TLKEXT */
+ 0, /* DODKEY */
+ 0, /* DOZIP */
+ 0, 0, 0}
+};
+
+void shadowircd_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) {
+
+ /* This looks better, much better than "add ? (do_add) : (do_remove)".
+ * At least this is readable without paying much attention :) -GD
+ */
+ if (add)
+ user->mode |= umodes[(int) *modes];
+ else
+ user->mode &= ~umodes[(int) *modes];
+
+ switch (*modes++) {
+ case '+':
+ add = 1;
+ break;
+ case '-':
+ add = 0;
+ break;
+ case 'o':
+ if (add) {
+ opcnt++;
+
+ if (WallOper)
+ anope_cmd_global(s_OperServ,
+ "\2%s\2 is now an IRC operator.",
+ user->nick);
+ display_news(user, NEWS_OPER);
+
+ } else {
+ opcnt--;
+ }
+ break;
+ }
+ }
+}
+
+unsigned long umodes[128] = {
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused, Unused, Horzontal Tab */
+ 0, 0, 0, /* Line Feed, Unused, Unused */
+ 0, 0, 0, /* Carriage Return, Unused, Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused, Unused, Space */
+ 0, 0, 0, /* ! " # */
+ 0, 0, 0, /* $ % & */
+ 0, 0, 0, /* ! ( ) */
+ 0, 0, 0, /* * + , */
+ 0, 0, 0, /* - . / */
+ 0, 0, /* 0 1 */
+ 0, 0, /* 2 3 */
+ 0, 0, /* 4 5 */
+ 0, 0, /* 6 7 */
+ 0, 0, /* 8 9 */
+ 0, 0, /* : ; */
+ 0, 0, 0, /* < = > */
+ 0, 0, /* ? @ */
+ UMODE_A, 0, 0, /* A B C */
+ 0, UMODE_E, 0, /* D E F */
+ UMODE_G, 0, 0, /* G H I */
+ 0, 0, 0, /* J K L */
+ 0, 0, UMODE_O, /* M N O */
+ 0, 0, UMODE_R, /* P Q R */
+ 0, 0, 0, /* S T U */
+ 0, 0, 0, /* V W X */
+ 0, /* Y */
+ 0, /* Z */
+ 0, 0, 0, /* [ \ ] */
+ 0, 0, 0, /* ^ _ ` */
+ UMODE_a, UMODE_b, 0, /* a b c */
+ UMODE_d, UMODE_e, 0, /* d e f */
+ UMODE_g, 0, UMODE_i, /* g h i */
+ 0, 0, UMODE_l, /* j k l */
+ 0, UMODE_n, UMODE_o, /* m n o */
+ 0, 0, 0, /* p q r */
+ 0, 0, UMODE_u, /* s t u */
+ UMODE_v, UMODE_w, UMODE_x, /* v w x */
+ 0, /* y */
+ 0, /* z */
+ 0, 0, 0, /* { | } */
+ 0, 0 /* ~ � */
+};
+
+
+char myCsmodes[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,
+ 'a',
+ 0, 0, 0,
+ 'h',
+ 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
+};
+
+CMMode myCmmodes[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}, /* BCD */
+ {NULL}, {NULL}, {NULL}, /* EFG */
+ {NULL}, /* H */
+ {add_invite, del_invite},
+ {NULL}, /* J */
+ {NULL}, {NULL}, {NULL}, /* KLM */
+ {NULL}, {NULL}, {NULL}, /* NOP */
+ {NULL}, {NULL}, {NULL}, /* QRS */
+ {NULL}, {NULL}, {NULL}, /* TUV */
+ {NULL}, {NULL}, {NULL}, /* WXY */
+ {NULL}, /* Z */
+ {NULL}, {NULL}, /* (char 91 - 92) */
+ {NULL}, {NULL}, {NULL}, /* (char 93 - 95) */
+ {NULL}, /* ` (char 96) */
+ {NULL}, /* a (char 97) */
+ {add_ban, del_ban},
+ {NULL},
+ {NULL},
+ {add_exception, del_exception},
+ {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}
+};
+
+
+CBMode myCbmodes[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},
+ {CMODE_A, 0, NULL, NULL}, /* A */
+ {0}, /* B */
+ {0}, /* C */
+ {0}, /* D */
+ {CMODE_E, 0, NULL, NULL}, /* E */
+ {CMODE_F, 0, NULL, NULL}, /* F */
+ {CMODE_G, 0, NULL, NULL}, /* G */
+ {0}, /* H */
+ {0}, /* I */
+ {0}, /* J */
+ {CMODE_K, 0, NULL, NULL}, /* K */
+ {CMODE_L, 0, NULL, NULL}, /* L */
+ {0}, /* M */
+ {CMODE_N, 0, NULL, NULL}, /* N */
+ {CMODE_O, 0, NULL, NULL}, /* O */
+ {CMODE_P, 0, NULL, NULL}, /* P */
+ {0}, /* Q */
+ {CMODE_R, 0, NULL, NULL}, /* R */
+ {CMODE_S, 0, NULL, NULL}, /* S */
+ {CMODE_T, 0, NULL, NULL}, /* T */
+ {0}, /* U */
+ {CMODE_V, 0, NULL, NULL}, /* V */
+ {0}, /* W */
+ {0}, /* X */
+ {0}, /* Y */
+ {0}, /* Z */
+ {0}, {0}, {0}, {0}, {0}, {0},
+ {0},
+ {0}, /* b */
+ {CMODE_c, 0, NULL, NULL},
+ {0}, /* d */
+ {0}, /* e */
+ {0}, /* f */
+ {0}, /* g */
+ {0}, /* h */
+ {CMODE_i, 0, NULL, NULL},
+ {0}, /* j */
+ {CMODE_k, 0, chan_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},
+ {0}, /* q */
+ {CMODE_r, 0, NULL, NULL},
+ {CMODE_s, 0, NULL, NULL},
+ {CMODE_t, 0, NULL, NULL},
+ {0},
+ {0}, /* v */
+ {0}, /* w */
+ {0}, /* x */
+ {0}, /* y */
+ {CMODE_z, 0, NULL, NULL}, /* z */
+ {0}, {0}, {0}, {0}
+};
+
+CBModeInfo myCbmodeinfos[] = {
+ {'c', CMODE_c, 0, NULL, NULL},
+ {'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},
+ {'r', CMODE_r, 0, NULL, NULL},
+ {'s', CMODE_s, 0, NULL, NULL},
+ {'t', CMODE_t, 0, NULL, NULL},
+ {'z', CMODE_z, 0, NULL, NULL},
+ {'A', CMODE_A, 0, NULL, NULL},
+ {'E', CMODE_E, 0, NULL, NULL},
+ {'F', CMODE_F, 0, NULL, NULL},
+ {'G', CMODE_G, 0, NULL, NULL},
+ {'K', CMODE_K, 0, NULL, NULL},
+ {'L', CMODE_L, 0, NULL, NULL},
+ {'N', CMODE_N, 0, NULL, NULL},
+ {'O', CMODE_O, 0, NULL, NULL},
+ {'P', CMODE_P, 0, NULL, NULL},
+ {'S', CMODE_S, 0, NULL, NULL},
+ {'T', CMODE_T, 0, NULL, NULL},
+ {'V', CMODE_V, 0, NULL, NULL},
+ {0}
+};
+
+
+CUMode myCumodes[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},
+
+ {CUS_PROTECT, CUF_PROTECT_BOTSERV, check_valid_admin}, /* a */
+ {0}, /* b */
+ {0}, /* c */
+ {0}, /* d */
+ {0}, /* e */
+ {0}, /* f */
+ {0}, /* g */
+ {CUS_HALFOP, 0, check_valid_op},
+ {0}, /* i */
+ {0}, /* j */
+ {0}, /* k */
+ {0}, /* l */
+ {0}, /* m */
+ {0}, /* n */
+ {CUS_OP, CUF_PROTECT_BOTSERV, check_valid_op},
+ {0}, /* p */
+ {0}, /* q */
+ {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}
+};
+
+
+
+void shadowircd_cmd_notice(char *source, char *dest, char *buf)
+{
+ Uid *ud;
+ User *u;
+
+ if (!buf) {
+ return;
+ }
+
+ if (NSDefFlags & NI_MSG) {
+ shadowircd_cmd_privmsg2(source, dest, buf);
+ } else {
+ ud = find_uid(source);
+ u = finduser(dest);
+ send_cmd((ud ? ud->uid : source), "NOTICE %s :%s",
+ (u ? u->uid : dest), buf);
+ }
+}
+
+void shadowircd_cmd_notice2(char *source, char *dest, char *msg)
+{
+ Uid *ud;
+ User *u;
+
+ ud = find_uid(source);
+ u = finduser(dest);
+ send_cmd((ud ? ud->uid : source), "NOTICE %s :%s", (u ? u->uid : dest),
+ msg);
+}
+
+void shadowircd_cmd_privmsg(char *source, char *dest, char *buf)
+{
+ Uid *ud, *ud2;
+
+ if (!buf) {
+ return;
+ }
+ ud = find_uid(source);
+ ud2 = find_uid(dest);
+
+ send_cmd((ud ? ud->uid : source), "PRIVMSG %s :%s",
+ (ud2 ? ud2->uid : dest), buf);
+}
+
+void shadowircd_cmd_privmsg2(char *source, char *dest, char *msg)
+{
+ Uid *ud, *ud2;
+
+ ud = find_uid(source);
+ ud2 = find_uid(dest);
+
+ send_cmd((ud ? ud->uid : source), "PRIVMSG %s :%s",
+ (ud2 ? ud2->uid : dest), msg);
+}
+
+void shadowircd_cmd_serv_notice(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "NOTICE $$%s :%s", dest, msg);
+}
+
+void shadowircd_cmd_serv_privmsg(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "PRIVMSG $$%s :%s", dest, msg);
+}
+
+
+void shadowircd_cmd_global(char *source, char *buf)
+{
+ Uid *u;
+
+ if (!buf) {
+ return;
+ }
+
+ if (source) {
+ u = find_uid(source);
+ if (u) {
+ send_cmd((u ? u->uid : source), "OPERWALL :%s", buf);
+ } else {
+ send_cmd(TS6SID, "OPERWALL :%s", buf);
+ }
+ } else {
+ send_cmd(TS6SID, "OPERWALL :%s", buf);
+ }
+}
+
+/* GLOBOPS - to handle old WALLOPS */
+void shadowircd_cmd_global_legacy(char *source, char *fmt)
+{
+ Uid *u;
+
+ if (source) {
+ u = find_uid(source);
+ if (u) {
+ send_cmd((u ? u->uid : source), "OPERWALL :%s", fmt);
+ } else {
+ send_cmd(TS6SID, "OPERWALL :%s", fmt);
+ }
+ } else {
+ send_cmd(TS6SID, "OPERWALL :%s", fmt);
+ }
+
+ send_cmd(source ? source : ServerName, "OPERWALL :%s", fmt);
+}
+
+int anope_event_sjoin(char *source, int ac, char **av)
+{
+ do_sjoin(source, ac, av);
+ return MOD_CONT;
+}
+
+/*
+ Non TS6
+
+ av[0] = nick
+ av[1] = hop
+ av[2] = ts
+ av[3] = modes
+ av[4] = user
+ av[5] = host
+ av[6] = server
+ av[7] = info
+
+ TS6
+ av[0] = nick
+ av[1] = hop
+ av[2] = ts
+ av[3] = modes
+ av[4] = user
+ av[5] = host
+ av[6] = IP
+ av[7] = UID
+ av[8] = vhost
+ av[9] = info
+
+*/
+int anope_event_nick(char *source, int ac, char **av)
+{
+ Server *s = NULL;
+ User *user, *u2;
+
+ if (ac == 10) {
+ s = findserver_uid(servlist, source);
+ /* Source is always the server */
+ *source = '\0';
+ user = do_nick(source, av[0], av[4], av[5], s->name, av[9],
+ strtoul(av[2], NULL, 10), 0, 0, av[8], av[7]);
+ if (user) {
+ anope_set_umode(user, 1, &av[3]);
+ }
+ } else if (ac == 8) {
+ /* Changed use of s->name to av[6], as s will be NULL
+ * if i can believe the above comments, this should be fine
+ * if anyone from shadowircd see's this, and its wrong, let
+ * me know? :)
+ */
+ user = do_nick(source, av[0], av[4], av[5], av[6], av[7],
+ strtoul(av[2], NULL, 10), 0, 0, NULL, NULL);
+ if (user) {
+ anope_set_umode(user, 1, &av[3]);
+ }
+ } else {
+ u2 = find_byuid(source);
+ do_nick((u2 ? u2->nick : source), av[0], NULL, NULL, NULL, NULL,
+ strtoul(av[1], NULL, 10), 0, 0, NULL, NULL);
+ }
+ return MOD_CONT;
+}
+
+
+int anope_event_chghost(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 2)
+ return MOD_CONT;
+
+ u = find_byuid(av[0]);
+ if (!u) {
+ if (debug) {
+ alog("debug: CHGHOST for nonexistent user %s", av[0]);
+ }
+ return MOD_CONT;
+ }
+
+ change_user_host(u, av[1]);
+ return MOD_CONT;
+}
+
+int anope_event_topic(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac == 4) {
+ do_topic(source, ac, av);
+ } else {
+ Channel *c = findchan(av[0]);
+ time_t topic_time = time(NULL);
+
+ if (!c) {
+ if (debug) {
+ alog("debug: 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]);
+
+ u = find_byuid(source);
+ if (u) {
+ strscpy(c->topic_setter, u->nick, sizeof(c->topic_setter));
+ } else {
+ strscpy(c->topic_setter, source, sizeof(c->topic_setter));
+ }
+ c->topic_time = topic_time;
+
+ record_topic(av[0]);
+
+ if (ac > 1 && *av[1])
+ send_event(EVENT_TOPIC_UPDATED, 2, av[0], av[1]);
+ else
+ send_event(EVENT_TOPIC_UPDATED, 2, av[0], "");
+ }
+ return MOD_CONT;
+}
+
+int anope_event_tburst(char *source, int ac, char **av)
+{
+ char *setter;
+ Channel *c;
+ time_t topic_time;
+
+ if (ac != 4) {
+ return MOD_CONT;
+ }
+
+ setter = myStrGetToken(av[2], '!', 0);
+
+ c = findchan(av[0]);
+ topic_time = strtol(av[1], NULL, 10);
+
+ if (!c) {
+ if (debug) {
+ alog("debug: TOPIC %s for nonexistent channel %s",
+ merge_args(ac - 1, av + 1), av[0]);
+ }
+ if (setter)
+ free(setter);
+ return MOD_CONT;
+ }
+
+ if (check_topiclock(c, topic_time)) {
+ if (setter)
+ free(setter);
+ return MOD_CONT;
+ }
+
+ if (c->topic) {
+ free(c->topic);
+ c->topic = NULL;
+ }
+ if (ac > 1 && *av[3])
+ c->topic = sstrdup(av[3]);
+
+ strscpy(c->topic_setter, setter, sizeof(c->topic_setter));
+ c->topic_time = topic_time;
+
+ record_topic(av[0]);
+
+ if (ac > 1 && *av[3])
+ send_event(EVENT_TOPIC_UPDATED, 2, av[0], av[3]);
+ else
+ send_event(EVENT_TOPIC_UPDATED, 2, av[0], "");
+
+ if (setter)
+ free(setter);
+
+ return MOD_CONT;
+}
+
+int anope_event_436(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+
+ m_nickcoll(av[0]);
+ return MOD_CONT;
+}
+
+
+/* *INDENT-OFF* */
+void moduleAddIRCDMsgs(void)
+{
+ Message *m;
+
+ updateProtectDetails("PROTECT","PROTECTME","protect","deprotect","AUTOPROTECT","+a","-a");
+
+ TS6SID = sstrdup(Numeric);
+ UseTS6 = 1;
+
+ m = createMessage("401", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("402", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("436", anope_event_436); addCoreMessage(IRCD,m);
+ m = createMessage("AWAY", anope_event_away); addCoreMessage(IRCD,m);
+ m = createMessage("INVITE", anope_event_invite); addCoreMessage(IRCD,m);
+ m = createMessage("JOIN", anope_event_join); addCoreMessage(IRCD,m);
+ m = createMessage("KICK", anope_event_kick); addCoreMessage(IRCD,m);
+ m = createMessage("KILL", anope_event_kill); addCoreMessage(IRCD,m);
+ m = createMessage("SVSKILL", anope_event_kill); addCoreMessage(IRCD,m);
+ m = createMessage("MODE", anope_event_mode); addCoreMessage(IRCD,m);
+ m = createMessage("TMODE", anope_event_tmode); addCoreMessage(IRCD,m);
+ m = createMessage("MOTD", anope_event_motd); addCoreMessage(IRCD,m);
+ m = createMessage("NICK", anope_event_nick); addCoreMessage(IRCD,m);
+ m = createMessage("BMASK", anope_event_bmask); addCoreMessage(IRCD,m);
+ m = createMessage("UID", anope_event_nick); addCoreMessage(IRCD,m);
+ m = createMessage("NOTICE", anope_event_notice); addCoreMessage(IRCD,m);
+ m = createMessage("PART", anope_event_part); addCoreMessage(IRCD,m);
+ m = createMessage("PASS", anope_event_pass); addCoreMessage(IRCD,m);
+ m = createMessage("PING", anope_event_ping); addCoreMessage(IRCD,m);
+ m = createMessage("PRIVMSG", anope_event_privmsg); addCoreMessage(IRCD,m);
+ m = createMessage("QUIT", anope_event_quit); addCoreMessage(IRCD,m);
+ m = createMessage("SERVER", anope_event_server); addCoreMessage(IRCD,m);
+ m = createMessage("SQUIT", anope_event_squit); addCoreMessage(IRCD,m);
+ m = createMessage("TOPIC", anope_event_topic); addCoreMessage(IRCD,m);
+ m = createMessage("TBURST", anope_event_tburst); addCoreMessage(IRCD,m);
+ m = createMessage("USER", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("WALLOPS", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("WHOIS", anope_event_whois); addCoreMessage(IRCD,m);
+ m = createMessage("SVSMODE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SVSNICK", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("CAPAB", anope_event_capab); addCoreMessage(IRCD,m);
+ m = createMessage("SJOIN", anope_event_sjoin); addCoreMessage(IRCD,m);
+ m = createMessage("SVINFO", anope_event_svinfo); addCoreMessage(IRCD,m);
+ m = createMessage("ADMIN", anope_event_admin); addCoreMessage(IRCD,m);
+ m = createMessage("ERROR", anope_event_error); addCoreMessage(IRCD,m);
+ m = createMessage("421", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("ENCAP", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SID", anope_event_sid); addCoreMessage(IRCD,m);
+ m = createMessage("EOB", anope_event_eos); addCoreMessage(IRCD,m);
+ m = createMessage("TSSYNC", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SVSCLOAK", anope_event_chghost); addCoreMessage(IRCD,m);
+
+}
+
+/* *INDENT-ON* */
+
+
+void shadowircd_cmd_sqline(char *mask, char *reason)
+{
+ send_cmd(NULL, "RESV * %s :%s", mask, reason);
+}
+
+void shadowircd_cmd_unsgline(char *mask)
+{
+ /* Does not support */
+}
+
+void shadowircd_cmd_unszline(char *mask)
+{
+ /* Does not support */
+}
+
+void shadowircd_cmd_szline(char *mask, char *reason, char *whom)
+{
+ /* Does not support */
+}
+
+void shadowircd_cmd_svsnoop(char *server, int set)
+{
+ /* does not support */
+}
+
+void shadowircd_cmd_svsadmin(char *server, int set)
+{
+ shadowircd_cmd_svsnoop(server, set);
+}
+
+void shadowircd_cmd_sgline(char *mask, char *reason)
+{
+ /* does not support */
+}
+
+void shadowircd_cmd_remove_akill(char *user, char *host)
+{
+ Uid *ud;
+
+ ud = find_uid(s_OperServ);
+ send_cmd((ud ? ud->uid : s_OperServ), "UNKLINE * %s %s", user, host);
+}
+
+void shadowircd_cmd_topic(char *whosets, char *chan, char *whosetit,
+ char *topic, time_t when)
+{
+ Uid *ud;
+
+ ud = find_uid(whosets);
+ send_cmd((ud ? ud->uid : whosets), "TOPIC %s %s %ld :%s", chan,
+ whosetit, (long int) when, topic);
+}
+
+void shadowircd_cmd_vhost_off(User * u)
+{
+ send_cmd(NULL, "MODE %s -v", (u->uid ? u->uid : u->nick));
+}
+
+void shadowircd_cmd_vhost_on(char *nick, char *vIdent, char *vhost)
+{
+ send_cmd(NULL, "SVSCLOAK %s %s", nick, vhost);
+
+ if (vIdent)
+ send_cmd(NULL, "SVSIDENT %s %s", nick, vIdent);
+}
+
+void shadowircd_cmd_unsqline(char *user)
+{
+ send_cmd(NULL, "UNRESV * %s", user);
+}
+
+void shadowircd_cmd_join(char *user, char *channel, time_t chantime)
+{
+ Uid *ud;
+
+ ud = find_uid(user);
+ send_cmd(NULL, "SJOIN %ld %s + :%s", (long int) chantime,
+ channel, (ud ? ud->uid : user));
+}
+
+/*
+oper: the nick of the oper performing the kline
+target.server: the server(s) this kline is destined for
+duration: the duration if a tkline, 0 if permanent.
+user: the 'user' portion of the kline
+host: the 'host' portion of the kline
+reason: the reason for the kline.
+*/
+
+void shadowircd_cmd_akill(char *user, char *host, char *who, time_t when,
+ time_t expires, char *reason)
+{
+ Uid *ud;
+
+ ud = find_uid(s_OperServ);
+
+ send_cmd((ud ? ud->uid : s_OperServ), "KLINE * %ld %s %s :%s",
+ (long int) (expires - (long) time(NULL)), user, host, reason);
+}
+
+void shadowircd_cmd_svskill(char *source, char *user, char *buf)
+{
+ Uid *ud;
+
+ if (!buf) {
+ return;
+ }
+
+ if (!source || !user) {
+ return;
+ }
+
+ ud = find_uid(user);
+ send_cmd(NULL, "SVSKILL %s :%s", (ud ? ud->uid : user), buf);
+}
+
+void shadowircd_cmd_svsmode(User * u, int ac, char **av)
+{
+ send_cmd(TS6SID, "MODE %s %s", u->uid, av[0]);
+}
+
+void shadowircd_cmd_svsinfo()
+{
+ /* not used */
+}
+
+/*
+ * SVINFO
+ * parv[0] = sender prefix
+ * parv[1] = TS_CURRENT for the server
+ * parv[2] = TS_MIN for the server
+ * parv[3] = server is standalone or connected to non-TS only
+ * parv[4] = server's idea of UTC time
+ */
+void shadowircd_cmd_svinfo()
+{
+ send_cmd(NULL, "SVINFO 6 3 0 :%ld", (long int) time(NULL));
+}
+
+void shadowircd_cmd_capab()
+{
+ /* ShadowIRCd does not use CAPAB */
+}
+
+/* PASS */
+void shadowircd_cmd_pass(char *pass)
+{
+ send_cmd(NULL, "PASS %s TS 6 %s", pass, TS6SID);
+}
+
+/* SERVER name protocol hop descript */
+void shadowircd_cmd_server(char *servname, int hop, char *descript)
+{
+ send_cmd(NULL, "SERVER %s %d %d :%s", servname, hop, PROTOCOL_REVISION,
+ descript);
+}
+
+
+void shadowircd_cmd_connect(int servernum)
+{
+ me_server =
+ new_server(NULL, ServerName, ServerDesc, SERVER_ISME, TS6SID);
+ if (servernum == 1)
+ shadowircd_cmd_pass(RemotePassword);
+ else if (servernum == 2)
+ shadowircd_cmd_pass(RemotePassword2);
+ else if (servernum == 3)
+ shadowircd_cmd_pass(RemotePassword3);
+
+ shadowircd_cmd_capab();
+ shadowircd_cmd_server(ServerName, 1, ServerDesc);
+ shadowircd_cmd_svinfo();
+}
+
+void shadowircd_cmd_bot_nick(char *nick, char *user, char *host,
+ char *real, char *modes)
+{
+ char *uidbuf = ts6_uid_retrieve();
+
+ EnforceQlinedNick(nick, NULL);
+ send_cmd(TS6SID, "UID %s 1 %ld %s %s %s 0.0.0.0 %s %s :%s", nick,
+ (long int) time(NULL), modes, user, host, uidbuf, host,
+ real);
+ new_uid(nick, uidbuf);
+ shadowircd_cmd_sqline(nick, "Reserved for services");
+}
+
+void shadowircd_cmd_part(char *nick, char *chan, char *buf)
+{
+ Uid *ud;
+
+ ud = find_uid(nick);
+
+ if (buf) {
+ send_cmd((ud ? ud->uid : nick), "PART %s :%s", chan, buf);
+ } else {
+ send_cmd((ud ? ud->uid : nick), "PART %s", chan);
+ }
+}
+
+int anope_event_ping(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+ shadowircd_cmd_pong(ac > 1 ? av[1] : ServerName, av[0]);
+ return MOD_CONT;
+}
+
+int anope_event_away(char *source, int ac, char **av)
+{
+ User *u = NULL;
+
+ u = find_byuid(source);
+
+ m_away(u->nick, (ac ? av[0] : NULL));
+ return MOD_CONT;
+}
+
+int anope_event_kill(char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+
+ m_kill(av[0], av[1]);
+ return MOD_CONT;
+}
+
+int anope_event_kick(char *source, int ac, char **av)
+{
+ if (ac != 3)
+ return MOD_CONT;
+ do_kick(source, ac, av);
+ return MOD_CONT;
+}
+
+void shadowircd_cmd_eob()
+{
+ send_cmd(TS6SID, "EOB");
+}
+
+int anope_event_join(char *source, int ac, char **av)
+{
+ if (ac != 1) {
+ do_sjoin(source, ac, av);
+ return MOD_CONT;
+ } else {
+ do_join(source, ac, av);
+ }
+ return MOD_CONT;
+}
+
+int anope_event_motd(char *source, int ac, char **av)
+{
+ if (!source) {
+ return MOD_CONT;
+ }
+
+ m_motd(source);
+ return MOD_CONT;
+}
+
+int anope_event_privmsg(char *source, int ac, char **av)
+{
+ User *u;
+ Uid *ud;
+
+ if (ac != 2) {
+ return MOD_CONT;
+ }
+
+ u = find_byuid(source);
+ ud = find_nickuid(av[0]);
+
+ m_privmsg((u ? u->nick : source), (ud ? ud->nick : av[0]), av[1]);
+ return MOD_CONT;
+}
+
+int anope_event_part(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac < 1 || ac > 2) {
+ return MOD_CONT;
+ }
+
+ u = find_byuid(source);
+ do_part(u->nick, ac, av);
+
+ return MOD_CONT;
+}
+
+int anope_event_whois(char *source, int ac, char **av)
+{
+ Uid *ud;
+
+ if (source && ac >= 1) {
+ ud = find_nickuid(av[0]);
+ m_whois(source, (ud ? ud->nick : source));
+ }
+ return MOD_CONT;
+}
+
+/* EVENT: SERVER */
+int anope_event_server(char *source, int ac, char **av)
+{
+ if (!stricmp(av[1], "1")) {
+ uplink = sstrdup(av[0]);
+ if (TS6UPLINK) {
+ do_server(source, av[0], av[1], av[2], TS6UPLINK);
+ } else {
+ do_server(source, av[0], av[1], av[2], NULL);
+ }
+ } else {
+ do_server(source, av[0], av[1], av[2], NULL);
+ }
+ return MOD_CONT;
+}
+
+int anope_event_sid(char *source, int ac, char **av)
+{
+ Server *s;
+
+ /* :42X SID trystan.nomadirc.net 2 43X :ircd-ratbox test server */
+
+ s = findserver_uid(servlist, source);
+ do_server(s->name, av[0], av[1], av[3], av[2]);
+ return MOD_CONT;
+}
+
+int anope_event_eos(char *source, int ac, char **av)
+{
+ Server *s;
+ s = findserver_uid(servlist, source);
+ /* If we found a server with the given source, that one just
+ * finished bursting. If there was no source, then our uplink
+ * server finished bursting. -GD
+ */
+ if (!s && serv_uplink)
+ s = serv_uplink;
+ finish_sync(s, 1);
+
+ return MOD_CONT;
+}
+
+int anope_event_squit(char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+ do_squit(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_quit(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 1) {
+ return MOD_CONT;
+ }
+
+ u = find_byuid(source);
+
+ do_quit(u->nick, ac, av);
+ return MOD_CONT;
+}
+
+void shadowircd_cmd_372(char *source, char *msg)
+{
+ send_cmd(TS6SID, "372 %s :- %s", source, msg);
+}
+
+void shadowircd_cmd_372_error(char *source)
+{
+ send_cmd(TS6SID,
+ "422 %s :- MOTD file not found! Please "
+ "contact your IRC administrator.", source);
+}
+
+void shadowircd_cmd_375(char *source)
+{
+ send_cmd(TS6SID,
+ "375 %s :- %s Message of the Day", source, ServerName);
+}
+
+void shadowircd_cmd_376(char *source)
+{
+ send_cmd(TS6SID, "376 %s :End of /MOTD command.", source);
+}
+
+/* 391 */
+void shadowircd_cmd_391(char *source, char *timestr)
+{
+ if (!timestr) {
+ return;
+ }
+ send_cmd(NULL, "391 :%s %s :%s", source, ServerName, timestr);
+}
+
+/* 250 */
+void shadowircd_cmd_250(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "250 %s", buf);
+}
+
+/* 307 */
+void shadowircd_cmd_307(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(TS6SID, "307 %s", buf);
+}
+
+/* 311 */
+void shadowircd_cmd_311(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(TS6SID, "311 %s", buf);
+}
+
+/* 312 */
+void shadowircd_cmd_312(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(TS6SID, "312 %s", buf);
+}
+
+/* 317 */
+void shadowircd_cmd_317(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(TS6SID, "317 %s", buf);
+}
+
+/* 219 */
+void shadowircd_cmd_219(char *source, char *letter)
+{
+ if (!source) {
+ return;
+ }
+
+ if (letter) {
+ send_cmd(NULL, "219 %s %c :End of /STATS report.", source,
+ *letter);
+ } else {
+ send_cmd(NULL, "219 %s l :End of /STATS report.", source);
+ }
+}
+
+/* 401 */
+void shadowircd_cmd_401(char *source, char *who)
+{
+ if (!source || !who) {
+ return;
+ }
+ send_cmd(TS6SID, "401 %s %s :No such service.", source, who);
+}
+
+/* 318 */
+void shadowircd_cmd_318(char *source, char *who)
+{
+ if (!source || !who) {
+ return;
+ }
+
+ send_cmd(TS6SID, "318 %s %s :End of /WHOIS list.", source, who);
+}
+
+/* 242 */
+void shadowircd_cmd_242(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "242 %s", buf);
+}
+
+/* 243 */
+void shadowircd_cmd_243(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "243 %s", buf);
+}
+
+/* 211 */
+void shadowircd_cmd_211(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "211 %s", buf);
+}
+
+void shadowircd_cmd_mode(char *source, char *dest, char *buf)
+{
+ Uid *ud;
+ if (!buf) {
+ return;
+ }
+
+ if (source) {
+ ud = find_uid(source);
+ send_cmd((ud ? ud->uid : source), "MODE %s %s", dest, buf);
+ } else {
+ send_cmd(source, "MODE %s %s", dest, buf);
+ }
+}
+
+void shadowircd_cmd_tmode(char *source, char *dest, char *buf)
+{
+
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "MODE %s %s", dest, buf);
+}
+
+void shadowircd_cmd_nick(char *nick, char *name, char *mode)
+{
+ char *uidbuf = ts6_uid_retrieve();
+
+ EnforceQlinedNick(nick, NULL);
+ send_cmd(TS6SID, "UID %s 1 %ld %s %s %s 0.0.0.0 %s %s :%s", nick,
+ (long int) time(NULL), mode, ServiceUser, ServiceHost,
+ uidbuf, ServiceHost, name);
+ new_uid(nick, uidbuf);
+ shadowircd_cmd_sqline(nick, "Reserved for services");
+}
+
+void shadowircd_cmd_kick(char *source, char *chan, char *user, char *buf)
+{
+ Uid *ud;
+ User *u;
+
+ ud = find_uid(source);
+ u = finduser(user);
+
+ if (buf) {
+ send_cmd((ud ? ud->uid : source), "KICK %s %s :%s", chan,
+ (u ? u->uid : user), buf);
+ } else {
+ send_cmd((ud ? ud->uid : source), "KICK %s %s", chan,
+ (u ? u->uid : user));
+ }
+}
+
+void shadowircd_cmd_notice_ops(char *source, char *dest, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "NOTICE @%s :%s", dest, buf);
+}
+
+void shadowircd_cmd_bot_chan_mode(char *nick, char *chan)
+{
+ Uid *u;
+
+ u = find_uid(nick);
+ anope_cmd_mode(nick, chan, "%s %s", ircd->botchanumode,
+ (u ? u->uid : nick));
+}
+
+/* QUIT */
+void shadowircd_cmd_quit(char *source, char *buf)
+{
+ Uid *ud;
+
+ ud = find_uid(source);
+
+ if (buf) {
+ send_cmd((ud ? ud->uid : source), "QUIT :%s", buf);
+ } else {
+ send_cmd((ud ? ud->uid : source), "QUIT");
+ }
+}
+
+/* PONG */
+void shadowircd_cmd_pong(char *servname, char *who)
+{
+ send_cmd(TS6SID, "PONG %s", who);
+}
+
+/* INVITE */
+void shadowircd_cmd_invite(char *source, char *chan, char *nick)
+{
+ Uid *ud;
+ User *u;
+
+ if (!source || !chan || !nick) {
+ return;
+ }
+
+ ud = find_uid(source);
+ u = finduser(nick);
+
+ send_cmd((ud ? ud->uid : source), "INVITE %s %s",
+ (u ? u->uid : nick), chan);
+}
+
+/* SQUIT */
+void shadowircd_cmd_squit(char *servname, char *message)
+{
+ if (!servname || !message) {
+ return;
+ }
+
+ send_cmd(NULL, "SQUIT %s :%s", servname, message);
+}
+
+int anope_event_mode(char *source, int ac, char **av)
+{
+ User *u, *u2;
+
+ if (ac < 2 || *av[0] == '&') {
+ return MOD_CONT;
+ }
+
+ if (*av[0] == '#') {
+ do_cmode(source, ac, av);
+ } else {
+ u = find_byuid(source);
+ u2 = find_byuid(av[0]);
+ av[0] = u2->nick;
+ do_umode2((u ? u->nick : source), ac, av);
+ }
+ return MOD_CONT;
+}
+
+int anope_event_tmode(char *source, int ac, char **av)
+{
+ if (*av[1] == '#' || *av[1] == '&') {
+ do_cmode(source, ac, av);
+ }
+ return MOD_CONT;
+}
+
+void shadowircd_cmd_351(char *source)
+{
+ send_cmd(TS6SID,
+ "351 %s Anope-%s %s :%s (ShadowProtocol %d) - %s (%s) -- %s",
+ source, version_number, ServerName, ircd->name,
+ PROTOCOL_REVISION, version_flags, EncModule, version_build);
+}
+
+/* Event: PROTOCTL */
+int anope_event_capab(char *source, int ac, char **av)
+{
+ /* Not supported by ShadowIRCd. */
+ return MOD_CONT;
+}
+
+/* SVSHOLD - set */
+void shadowircd_cmd_svshold(char *nick)
+{
+ /* Not supported by this IRCD */
+}
+
+/* SVSHOLD - release */
+void shadowircd_cmd_release_svshold(char *nick)
+{
+ /* Not Supported by this IRCD */
+}
+
+/* SVSNICK */
+void shadowircd_cmd_svsnick(char *nick, char *newnick, time_t when)
+{
+ if (!nick || !newnick) {
+ return;
+ }
+ send_cmd(NULL, "SVSNICK %s %s %ld", nick, newnick, (long int) when);
+}
+
+void shadowircd_cmd_guest_nick(char *nick, char *user, char *host,
+ char *real, char *modes)
+{
+ /* not supported */
+}
+
+void shadowircd_cmd_svso(char *source, char *nick, char *flag)
+{
+ /* Not Supported by this IRCD */
+}
+
+void shadowircd_cmd_unban(char *name, char *nick)
+{
+ /* Not Supported by this IRCD */
+}
+
+/* SVSMODE channel modes */
+
+void shadowircd_cmd_svsmode_chan(char *name, char *mode, char *nick)
+{
+ /* Not Supported by this IRCD */
+}
+
+/* SVSMODE +d */
+/* sent if svid is something weird */
+void shadowircd_cmd_svid_umode(char *nick, time_t ts)
+{
+ /* not supported */
+}
+
+/* SVSMODE +d */
+/* nc_change was = 1, and there is no na->status */
+void shadowircd_cmd_nc_change(User * u)
+{
+ /* not supported */
+}
+
+/* SVSMODE +d */
+void shadowircd_cmd_svid_umode2(User * u, char *ts)
+{
+ /* not supported */
+}
+
+void shadowircd_cmd_svid_umode3(User * u, char *ts)
+{
+ /* not used */
+}
+
+/* NICK <newnick> */
+void shadowircd_cmd_chg_nick(char *oldnick, char *newnick)
+{
+ if (!oldnick || !newnick) {
+ return;
+ }
+
+ send_cmd(oldnick, "NICK %s", newnick);
+}
+
+/*
+ * SVINFO
+ * parv[0] = sender prefix
+ * parv[1] = TS_CURRENT for the server
+ * parv[2] = TS_MIN for the server
+ * parv[3] = server is standalone or connected to non-TS only
+ * parv[4] = server's idea of UTC time
+ */
+int anope_event_svinfo(char *source, int ac, char **av)
+{
+ /* currently not used but removes the message : unknown message from server */
+ return MOD_CONT;
+}
+
+int anope_event_pass(char *source, int ac, char **av)
+{
+ TS6UPLINK = sstrdup(av[3]);
+ return MOD_CONT;
+}
+
+void shadowircd_cmd_svsjoin(char *source, char *nick, char *chan, char *param)
+{
+ /* Not Supported by this IRCD */
+}
+
+void shadowircd_cmd_svspart(char *source, char *nick, char *chan)
+{
+ /* Not Supported by this IRCD */
+}
+
+void shadowircd_cmd_swhois(char *source, char *who, char *mask)
+{
+ /* not supported */
+}
+
+int anope_event_notice(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_admin(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_invite(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_bmask(char *source, int ac, char **av)
+{
+ Channel *c;
+ char *bans;
+ char *b;
+ int count, i;
+
+ /* :42X BMASK 1106409026 #ircops b :*!*@*.aol.com */
+ /* 0 1 2 3 */
+ c = findchan(av[1]);
+
+ if (c) {
+ bans = sstrdup(av[3]);
+ count = myNumToken(bans, ' ');
+ for (i = 0; i <= count - 1; i++) {
+ b = myStrGetToken(bans, ' ', i);
+ if (!stricmp(av[2], "b")) {
+ add_ban(c, b);
+ }
+ if (!stricmp(av[2], "e")) {
+ add_exception(c, b);
+ }
+ if (!stricmp(av[2], "I")) {
+ add_invite(c, b);
+ }
+ if (b)
+ free(b);
+ }
+ free(bans);
+ }
+ return MOD_CONT;
+}
+
+int shadowircd_flood_mode_check(char *value)
+{
+ return 0;
+}
+
+int anope_event_error(char *source, int ac, char **av)
+{
+ if (ac >= 1) {
+ if (debug) {
+ alog("debug: %s", av[0]);
+ }
+ }
+ return MOD_CONT;
+}
+
+void shadowircd_cmd_jupe(char *jserver, char *who, char *reason)
+{
+ char rbuf[256];
+
+ snprintf(rbuf, sizeof(rbuf), "Juped by %s%s%s", who,
+ reason ? ": " : "", reason ? reason : "");
+
+ if (findserver(servlist, jserver))
+ shadowircd_cmd_squit(jserver, rbuf);
+ shadowircd_cmd_server(jserver, 2, rbuf);
+ new_server(me_server, jserver, rbuf, SERVER_JUPED, NULL);
+}
+
+/*
+ 1 = valid nick
+ 0 = nick is in valid
+*/
+int shadowircd_valid_nick(char *nick)
+{
+ /* TS6 Save extension -Certus */
+ if (isdigit(*nick))
+ return 0;
+ return 1;
+}
+
+/*
+ 1 = valid chan
+ 0 = chan is in valid
+*/
+int shadowircd_valid_chan(char *chan)
+{
+ /* no hard coded invalid chan */
+ return 1;
+}
+
+
+void shadowircd_cmd_ctcp(char *source, char *dest, char *buf)
+{
+ char *s;
+
+ if (!buf) {
+ return;
+ } else {
+ s = normalizeBuffer(buf);
+ }
+
+ send_cmd(source, "NOTICE %s :\1%s \1", dest, s);
+ free(s);
+}
+
+/**
+ * Tell anope which function we want to perform each task inside of anope.
+ * These prototypes must match what anope expects.
+ **/
+void moduleAddAnopeCmds()
+{
+ pmodule_cmd_svsnoop(shadowircd_cmd_svsnoop);
+ pmodule_cmd_remove_akill(shadowircd_cmd_remove_akill);
+ pmodule_cmd_topic(shadowircd_cmd_topic);
+ pmodule_cmd_vhost_off(shadowircd_cmd_vhost_off);
+ pmodule_cmd_akill(shadowircd_cmd_akill);
+ pmodule_cmd_svskill(shadowircd_cmd_svskill);
+ pmodule_cmd_svsmode(shadowircd_cmd_svsmode);
+ pmodule_cmd_372(shadowircd_cmd_372);
+ pmodule_cmd_372_error(shadowircd_cmd_372_error);
+ pmodule_cmd_375(shadowircd_cmd_375);
+ pmodule_cmd_376(shadowircd_cmd_376);
+ pmodule_cmd_nick(shadowircd_cmd_nick);
+ pmodule_cmd_guest_nick(shadowircd_cmd_guest_nick);
+ pmodule_cmd_mode(shadowircd_cmd_mode);
+ pmodule_cmd_bot_nick(shadowircd_cmd_bot_nick);
+ pmodule_cmd_kick(shadowircd_cmd_kick);
+ pmodule_cmd_notice_ops(shadowircd_cmd_notice_ops);
+ pmodule_cmd_notice(shadowircd_cmd_notice);
+ pmodule_cmd_notice2(shadowircd_cmd_notice2);
+ pmodule_cmd_privmsg(shadowircd_cmd_privmsg);
+ pmodule_cmd_privmsg2(shadowircd_cmd_privmsg2);
+ pmodule_cmd_serv_notice(shadowircd_cmd_serv_notice);
+ pmodule_cmd_serv_privmsg(shadowircd_cmd_serv_privmsg);
+ pmodule_cmd_bot_chan_mode(shadowircd_cmd_bot_chan_mode);
+ pmodule_cmd_351(shadowircd_cmd_351);
+ pmodule_cmd_quit(shadowircd_cmd_quit);
+ pmodule_cmd_pong(shadowircd_cmd_pong);
+ pmodule_cmd_join(shadowircd_cmd_join);
+ pmodule_cmd_unsqline(shadowircd_cmd_unsqline);
+ pmodule_cmd_invite(shadowircd_cmd_invite);
+ pmodule_cmd_part(shadowircd_cmd_part);
+ pmodule_cmd_391(shadowircd_cmd_391);
+ pmodule_cmd_250(shadowircd_cmd_250);
+ pmodule_cmd_307(shadowircd_cmd_307);
+ pmodule_cmd_311(shadowircd_cmd_311);
+ pmodule_cmd_312(shadowircd_cmd_312);
+ pmodule_cmd_317(shadowircd_cmd_317);
+ pmodule_cmd_219(shadowircd_cmd_219);
+ pmodule_cmd_401(shadowircd_cmd_401);
+ pmodule_cmd_318(shadowircd_cmd_318);
+ pmodule_cmd_242(shadowircd_cmd_242);
+ pmodule_cmd_243(shadowircd_cmd_243);
+ pmodule_cmd_211(shadowircd_cmd_211);
+ pmodule_cmd_global(shadowircd_cmd_global);
+ pmodule_cmd_global_legacy(shadowircd_cmd_global_legacy);
+ pmodule_cmd_sqline(shadowircd_cmd_sqline);
+ pmodule_cmd_squit(shadowircd_cmd_squit);
+ pmodule_cmd_svso(shadowircd_cmd_svso);
+ pmodule_cmd_chg_nick(shadowircd_cmd_chg_nick);
+ pmodule_cmd_svsnick(shadowircd_cmd_svsnick);
+ pmodule_cmd_vhost_on(shadowircd_cmd_vhost_on);
+ pmodule_cmd_connect(shadowircd_cmd_connect);
+ pmodule_cmd_svshold(shadowircd_cmd_svshold);
+ pmodule_cmd_release_svshold(shadowircd_cmd_release_svshold);
+ pmodule_cmd_unsgline(shadowircd_cmd_unsgline);
+ pmodule_cmd_unszline(shadowircd_cmd_unszline);
+ pmodule_cmd_szline(shadowircd_cmd_szline);
+ pmodule_cmd_sgline(shadowircd_cmd_sgline);
+ pmodule_cmd_unban(shadowircd_cmd_unban);
+ pmodule_cmd_svsmode_chan(shadowircd_cmd_svsmode_chan);
+ pmodule_cmd_svid_umode(shadowircd_cmd_svid_umode);
+ pmodule_cmd_nc_change(shadowircd_cmd_nc_change);
+ pmodule_cmd_svid_umode2(shadowircd_cmd_svid_umode2);
+ pmodule_cmd_svid_umode3(shadowircd_cmd_svid_umode3);
+ pmodule_cmd_svsjoin(shadowircd_cmd_svsjoin);
+ pmodule_cmd_svspart(shadowircd_cmd_svspart);
+ pmodule_cmd_swhois(shadowircd_cmd_swhois);
+ pmodule_cmd_eob(shadowircd_cmd_eob);
+ pmodule_flood_mode_check(shadowircd_flood_mode_check);
+ pmodule_cmd_jupe(shadowircd_cmd_jupe);
+ pmodule_valid_nick(shadowircd_valid_nick);
+ pmodule_valid_chan(shadowircd_valid_chan);
+ pmodule_cmd_ctcp(shadowircd_cmd_ctcp);
+ pmodule_set_umode(shadowircd_set_umode);
+}
+
+/**
+ * Now tell anope how to use us.
+ **/
+int AnopeInit(int argc, char **argv)
+{
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(PROTOCOL);
+
+ pmodule_ircd_version("ShadowIRCd 4.0+");
+ pmodule_ircd_cap(myIrcdcap);
+ pmodule_ircd_var(myIrcd);
+ pmodule_ircd_cbmodeinfos(myCbmodeinfos);
+ pmodule_ircd_cumodes(myCumodes);
+ pmodule_ircd_flood_mode_char_set("");
+ pmodule_ircd_flood_mode_char_remove("");
+ pmodule_ircd_cbmodes(myCbmodes);
+ pmodule_ircd_cmmodes(myCmmodes);
+ pmodule_ircd_csmodes(myCsmodes);
+ pmodule_ircd_useTSMode(1);
+
+ /** Deal with modes anope _needs_ to know **/
+ pmodule_invis_umode(UMODE_i);
+ pmodule_oper_umode(UMODE_o);
+ pmodule_invite_cmode(CMODE_i);
+ pmodule_secret_cmode(CMODE_s);
+ pmodule_private_cmode(CMODE_p);
+ pmodule_key_mode(CMODE_k);
+ pmodule_limit_mode(CMODE_l);
+
+ moduleAddAnopeCmds();
+ moduleAddIRCDMsgs();
+
+ return MOD_CONT;
+}
diff --git a/src/protocol/shadowircd.h b/src/protocol/shadowircd.h
new file mode 100644
index 000000000..67f5188fd
--- /dev/null
+++ b/src/protocol/shadowircd.h
@@ -0,0 +1,142 @@
+/* ShadowIRCD functions
+ *
+ * (C) 2003-2008 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.
+ *
+ *
+ */
+
+/* The protocol revision. */
+#define PROTOCOL_REVISION 3402
+
+
+#define UMODE_a 0x00000001
+#define UMODE_C 0x00000002
+#define UMODE_i 0x00000004
+#define UMODE_o 0x00000008
+#define UMODE_z 0x00000010
+#define UMODE_w 0x00000020
+#define UMODE_s 0x00000040
+#define UMODE_c 0x00000080
+#define UMODE_r 0x00000100
+#define UMODE_k 0x00000200
+#define UMODE_f 0x00000400
+#define UMODE_y 0x00000800
+#define UMODE_d 0x00001000
+#define UMODE_n 0x00002000
+#define UMODE_x 0x00004000
+#define UMODE_u 0x00008000
+#define UMODE_b 0x00010000
+#define UMODE_l 0x00020000
+#define UMODE_g 0x00040000
+#define UMODE_v 0x00080000
+#define UMODE_A 0x00100000
+#define UMODE_E 0x00200000
+#define UMODE_G 0x00400000
+#define UMODE_R 0x00800000
+#define UMODE_e 0x01000000
+#define UMODE_O 0x02000000
+#define UMODE_H 0x04000000
+
+#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
+#define CMODE_l 0x00000080
+#define CMODE_K 0x00000100
+#define CMODE_A 0x00000200
+#define CMODE_r 0x00000400
+#define CMODE_z 0x00000800
+#define CMODE_S 0x00001000
+#define CMODE_c 0x00002000
+#define CMODE_E 0x00004000
+#define CMODE_F 0x00008000
+#define CMODE_G 0x00010000
+#define CMODE_L 0x00020000
+#define CMODE_N 0x00040000
+#define CMODE_O 0x00080000
+#define CMODE_P 0x00100000
+#define CMODE_R 0x00200000
+#define CMODE_T 0x00400000
+#define CMODE_V 0x00800000
+
+#define DEFAULT_MLOCK CMODE_n | CMODE_t | CMODE_r
+
+void shadowircd_set_umode(User * user, int ac, char **av);
+void shadowircd_cmd_svsnoop(char *server, int set);
+void shadowircd_cmd_remove_akill(char *user, char *host);
+void shadowircd_cmd_topic(char *whosets, char *chan, char *whosetit, char *topic, time_t when);
+void shadowircd_cmd_vhost_off(User * u);
+void shadowircd_cmd_akill(char *user, char *host, char *who, time_t when,time_t expires, char *reason);
+void shadowircd_cmd_svskill(char *source, char *user, char *buf);
+void shadowircd_cmd_svsmode(User * u, int ac, char **av);
+void shadowircd_cmd_372(char *source, char *msg);
+void shadowircd_cmd_372_error(char *source);
+void shadowircd_cmd_375(char *source);
+void shadowircd_cmd_376(char *source);
+void shadowircd_cmd_nick(char *nick, char *name, char *modes);
+void shadowircd_cmd_guest_nick(char *nick, char *user, char *host, char *real, char *modes);
+void shadowircd_cmd_mode(char *source, char *dest, char *buf);
+void shadowircd_cmd_bot_nick(char *nick, char *user, char *host, char *real, char *modes);
+void shadowircd_cmd_kick(char *source, char *chan, char *user, char *buf);
+void shadowircd_cmd_notice_ops(char *source, char *dest, char *buf);
+void shadowircd_cmd_notice(char *source, char *dest, char *buf);
+void shadowircd_cmd_notice2(char *source, char *dest, char *msg);
+void shadowircd_cmd_privmsg(char *source, char *dest, char *buf);
+void shadowircd_cmd_privmsg2(char *source, char *dest, char *msg);
+void shadowircd_cmd_serv_notice(char *source, char *dest, char *msg);
+void shadowircd_cmd_serv_privmsg(char *source, char *dest, char *msg);
+void shadowircd_cmd_bot_chan_mode(char *nick, char *chan);
+void shadowircd_cmd_351(char *source);
+void shadowircd_cmd_quit(char *source, char *buf);
+void shadowircd_cmd_pong(char *servname, char *who);
+void shadowircd_cmd_join(char *user, char *channel, time_t chantime);
+void shadowircd_cmd_unsqline(char *user);
+void shadowircd_cmd_invite(char *source, char *chan, char *nick);
+void shadowircd_cmd_part(char *nick, char *chan, char *buf);
+void shadowircd_cmd_391(char *source, char *timestr);
+void shadowircd_cmd_250(char *buf);
+void shadowircd_cmd_307(char *buf);
+void shadowircd_cmd_311(char *buf);
+void shadowircd_cmd_312(char *buf);
+void shadowircd_cmd_317(char *buf);
+void shadowircd_cmd_219(char *source, char *letter);
+void shadowircd_cmd_401(char *source, char *who);
+void shadowircd_cmd_318(char *source, char *who);
+void shadowircd_cmd_242(char *buf);
+void shadowircd_cmd_243(char *buf);
+void shadowircd_cmd_211(char *buf);
+void shadowircd_cmd_global(char *source, char *buf);
+void shadowircd_cmd_global_legacy(char *source, char *fmt);
+void shadowircd_cmd_sqline(char *mask, char *reason);
+void shadowircd_cmd_squit(char *servname, char *message);
+void shadowircd_cmd_svso(char *source, char *nick, char *flag);
+void shadowircd_cmd_chg_nick(char *oldnick, char *newnick);
+void shadowircd_cmd_svsnick(char *source, char *guest, time_t when);
+void shadowircd_cmd_vhost_on(char *nick, char *vIdent, char *vhost);
+void shadowircd_cmd_connect(int servernum);
+void shadowircd_cmd_svshold(char *nick);
+void shadowircd_cmd_release_svshold(char *nick);
+void shadowircd_cmd_unsgline(char *mask);
+void shadowircd_cmd_unszline(char *mask);
+void shadowircd_cmd_szline(char *mask, char *reason, char *whom);
+void shadowircd_cmd_sgline(char *mask, char *reason);
+void shadowircd_cmd_unban(char *name, char *nick);
+void shadowircd_cmd_svsmode_chan(char *name, char *mode, char *nick);
+void shadowircd_cmd_svid_umode(char *nick, time_t ts);
+void shadowircd_cmd_nc_change(User * u);
+void shadowircd_cmd_svid_umode2(User * u, char *ts);
+void shadowircd_cmd_svid_umode3(User * u, char *ts);
+void shadowircd_cmd_eob();
+int shadowircd_flood_mode_check(char *value);
+void shadowircd_cmd_jupe(char *jserver, char *who, char *reason);
+int shadowircd_valid_nick(char *nick);
+void shadowircd_cmd_ctcp(char *source, char *dest, char *buf);
diff --git a/src/protocol/solidircd.c b/src/protocol/solidircd.c
new file mode 100644
index 000000000..b0f948794
--- /dev/null
+++ b/src/protocol/solidircd.c
@@ -0,0 +1,1710 @@
+/* Solid-IRCD functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ *
+ */
+
+/*************************************************************************/
+
+#include "services.h"
+#include "pseudo.h"
+#include "solidircd.h"
+
+IRCDVar myIrcd[] = {
+ {"Solid-IRCd 3.4.*", /* ircd name */
+ "+o", /* nickserv mode */
+ "+o", /* chanserv mode */
+ "+o", /* memoserv mode */
+ "+o", /* hostserv mode */
+ "+io", /* operserv mode */
+ "+o", /* botserv mode */
+ "+h", /* helpserv mode */
+ "+i", /* Dev/Null mode */
+ "+io", /* Global mode */
+ "+o", /* nickserv alias mode */
+ "+o", /* chanserv alias mode */
+ "+o", /* memoserv alias mode */
+ "+io", /* hostserv alias mode */
+ "+io", /* operserv alias mode */
+ "+o", /* botserv alias mode */
+ "+h", /* helpserv alias mode */
+ "+i", /* Dev/Null alias mode */
+ "+io", /* Global alias mode */
+ "+", /* Used by BotServ Bots */
+ 2, /* Chan Max Symbols */
+ "-cilmnpstOR", /* Modes to Remove */
+ "+o", /* Channel Umode used by Botserv bots */
+ 1, /* SVSNICK */
+ 1, /* Vhost */
+ 0, /* Has Owner */
+ NULL, /* Mode to set for an owner */
+ NULL, /* Mode to unset for an owner */
+ NULL, /* Mode to set for chan admin */
+ NULL, /* Mode to unset for chan admin */
+ "+rd", /* Mode On Reg */
+ NULL, /* Mode on ID for Roots */
+ NULL, /* Mode on ID for Admins */
+ NULL, /* Mode on ID for Opers */
+ "-r+d", /* Mode on UnReg */
+ "+d", /* Mode on Nick Change */
+ 1, /* Supports SGlines */
+ 1, /* Supports SQlines */
+ 1, /* Supports SZlines */
+ 1, /* Supports Halfop +h */
+ 3, /* Number of server args */
+ 0, /* Join 2 Set */
+ 0, /* Join 2 Message */
+ 1, /* Has exceptions +e */
+ 0, /* TS Topic Forward */
+ 0, /* TS Topci Backward */
+ 0, /* Protected Umode */
+ 0, /* Has Admin */
+ 1, /* Chan SQlines */
+ 1, /* Quit on Kill */
+ 1, /* SVSMODE unban */
+ 0, /* Has Protect */
+ 0, /* Reverse */
+ 1, /* Chan Reg */
+ CMODE_r, /* Channel Mode */
+ 0, /* vidents */
+ 1, /* svshold */
+ 1, /* time stamp on mode */
+ 1, /* NICKIP */
+ 0, /* O:LINE */
+ 1, /* UMODE */
+ 0, /* VHOST ON NICK */
+ 0, /* Change RealName */
+ 0, /* No Knock */
+ 0, /* Admin Only */
+ DEFAULT_MLOCK, /* Default MLOCK */
+ UMODE_v, /* Vhost Mode */
+ 1, /* +f */
+ 0, /* +L */
+ CMODE_j, /* Mode */
+ 0, /* Mode */
+ 1,
+ 1, /* No Knock requires +i */
+ NULL, /* CAPAB Chan Modes */
+ 0, /* We support TOKENS */
+ 1, /* TOKENS are CASE inSensitive */
+ 0, /* TIME STAMPS are BASE64 */
+ 1, /* +I support */
+ 0, /* SJOIN ban char */
+ 0, /* SJOIN except char */
+ 0, /* SJOIN invite char */
+ 0, /* Can remove User Channel Modes with SVSMODE */
+ 0, /* Sglines are not enforced until user reconnects */
+ "v", /* vhost char */
+ 0, /* ts6 */
+ 1, /* support helper umode */
+ 0, /* p10 */
+ NULL, /* character set */
+ 1, /* reports sync state */
+ 0, /* CIDR channelbans */
+ }
+ ,
+ {NULL}
+};
+
+IRCDCAPAB myIrcdcap[] = {
+ {
+ CAPAB_NOQUIT, /* NOQUIT */
+ CAPAB_TSMODE, /* TSMODE */
+ CAPAB_UNCONNECT, /* UNCONNECT */
+ 0, /* NICKIP */
+ 0, /* SJOIN */
+ 0, /* ZIP */
+ CAPAB_BURST, /* BURST */
+ 0, /* TS5 */
+ 0, /* TS3 */
+ CAPAB_DKEY, /* DKEY */
+ 0, /* PT4 */
+ 0, /* SCS */
+ 0, /* QS */
+ 0, /* UID */
+ 0, /* KNOCK */
+ 0, /* CLIENT */
+ 0, /* IPV6 */
+ 0, /* SSJ5 */
+ 0, /* SN2 */
+ 0, /* TOKEN */
+ 0, /* VHOST */
+ 0, /* SSJ3 */
+ 0, /* NICK2 */
+ 0, /* UMODE2 */
+ 0, /* VL */
+ 0, /* TLKEXT */
+ 0, /* DODKEY */
+ CAPAB_DOZIP, /* DOZIP */
+ 0, 0, 0}
+};
+
+
+void solidircd_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) {
+
+ /* This looks better, much better than "add ? (do_add) : (do_remove)".
+ * At least this is readable without paying much attention :) -GD
+ */
+ if (add)
+ user->mode |= umodes[(int) *modes];
+ else
+ user->mode &= ~umodes[(int) *modes];
+
+ switch (*modes++) {
+ case '+':
+ add = 1;
+ break;
+ case '-':
+ add = 0;
+ break;
+ case 'a':
+ if (UnRestrictSAdmin) {
+ break;
+ }
+ if (add && !is_services_admin(user)) {
+ common_svsmode(user, "-a", NULL);
+ user->mode &= ~UMODE_a;
+ }
+ break;
+ case 'd':
+ if (ac == 0) {
+ alog("user: umode +d with no parameter (?) for user %s",
+ user->nick);
+ break;
+ }
+
+ ac--;
+ av++;
+ user->svid = strtoul(*av, NULL, 0);
+ break;
+ case 'o':
+ if (add) {
+ opcnt++;
+
+ if (WallOper)
+ anope_cmd_global(s_OperServ,
+ "\2%s\2 is now an IRC operator.",
+ user->nick);
+ display_news(user, NEWS_OPER);
+
+ } else {
+ opcnt--;
+ }
+ break;
+ case 'r':
+ if (add && !nick_identified(user)) {
+ common_svsmode(user, "-r", NULL);
+ user->mode &= ~UMODE_r;
+ }
+ break;
+ case 'v':
+ update_host(user);
+ break;
+ }
+ }
+}
+
+
+unsigned long umodes[128] = {
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused, Unused, Horzontal Tab */
+ 0, 0, 0, /* Line Feed, Unused, Unused */
+ 0, 0, 0, /* Carriage Return, Unused, Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused, Unused, Space */
+ 0, 0, 0, /* ! " # */
+ 0, 0, 0, /* $ % & */
+ 0, 0, 0, /* ! ( ) */
+ 0, 0, 0, /* * + , */
+ 0, 0, 0, /* - . / */
+ 0, 0, /* 0 1 */
+ 0, 0, /* 2 3 */
+ 0, 0, /* 4 5 */
+ 0, 0, /* 6 7 */
+ 0, 0, /* 8 9 */
+ 0, 0, /* : ; */
+ 0, 0, 0, /* < = > */
+ 0, 0, /* ? @ */
+ UMODE_A, 0, UMODE_C, /* A B C */
+ UMODE_D, 0, UMODE_F, /* D E F */
+ 0, UMODE_H, UMODE_I, /* G H I */
+ 0, UMODE_K, 0, /* J K L */
+ 0, 0, UMODE_O, /* M N O */
+ 0, 0, UMODE_R, /* P Q R */
+ 0, 0, 0, /* S T U */
+ 0, 0, UMODE_X, /* V W X */
+ 0, /* Y */
+ 0, /* Z */
+ 0, 0, 0, /* [ \ ] */
+ 0, 0, 0, /* ^ _ ` */
+ UMODE_a, UMODE_b, UMODE_c, /* a b c */
+ UMODE_d, UMODE_e, UMODE_f, /* d e f */
+ UMODE_g, UMODE_h, UMODE_i, /* g h i */
+ UMODE_j, UMODE_k, 0, /* j k l */
+ UMODE_m, UMODE_n, UMODE_o, /* m n o */
+ 0, 0, UMODE_r, /* p q r */
+ UMODE_s, 0, 0, /* s t u */
+ UMODE_v, UMODE_w, UMODE_x, /* v w x */
+ UMODE_y, /* y */
+ UMODE_z, /* z */
+ 0, 0, 0, /* { | } */
+ 0, 0 /* ~ � */
+};
+
+char myCsmodes[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,
+ 'h',
+ 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
+};
+
+
+CMMode myCmmodes[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}, /* BCD */
+ {NULL}, {NULL}, {NULL}, /* EFG */
+ {NULL}, /* H */
+ {add_invite, del_invite},
+ {NULL}, /* J */
+ {NULL}, {NULL}, {NULL}, /* KLM */
+ {NULL}, {NULL}, {NULL}, /* NOP */
+ {NULL}, {NULL}, {NULL}, /* QRS */
+ {NULL}, {NULL}, {NULL}, /* TUV */
+ {NULL}, {NULL}, {NULL}, /* WXY */
+ {NULL}, /* Z */
+ {NULL}, {NULL}, /* (char 91 - 92) */
+ {NULL}, {NULL}, {NULL}, /* (char 93 - 95) */
+ {NULL}, /* ` (char 96) */
+ {NULL}, /* a (char 97) */
+ {add_ban, del_ban},
+ {NULL},
+ {NULL},
+ {add_exception, del_exception},
+ {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}
+};
+
+
+
+CBMode myCbmodes[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}, /* A */
+ {0}, /* B */
+ {0}, /* C */
+ {0}, /* D */
+ {0}, /* E */
+ {0}, /* F */
+ {0}, /* G */
+ {0}, /* H */
+ {0}, /* I */
+ {0}, /* J */
+ {0}, /* K */
+ {0}, /* L */
+ {CMODE_M, 0, NULL, NULL}, /* M */
+ {CMODE_N, 0, NULL, NULL}, /* N */
+ {CMODE_O, CBM_NO_USER_MLOCK, NULL, NULL},
+ {0}, /* P */
+ {0}, /* Q */
+ {CMODE_R, 0, NULL, NULL}, /* R */
+ {CMODE_S, 0, NULL, NULL}, /* S */
+ {0}, /* T */
+ {0}, /* U */
+ {0}, /* V */
+ {0}, /* W */
+ {0}, /* X */
+ {0}, /* Y */
+ {0}, /* Z */
+ {0}, {0}, {0}, {0}, {0}, {0},
+ {0}, /* a */
+ {0}, /* b */
+ {CMODE_c, 0, NULL, NULL},
+ {0}, /* d */
+ {0}, /* e */
+ {0}, /* f */
+ {0}, /* g */
+ {0}, /* h */
+ {CMODE_i, 0, NULL, NULL},
+ {CMODE_j, 0, set_flood, cs_set_flood}, /* j */
+ {CMODE_k, 0, chan_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},
+ {0}, /* q */
+ {CMODE_r, CBM_NO_MLOCK, NULL, NULL},
+ {CMODE_s, 0, NULL, NULL},
+ {CMODE_t, 0, NULL, NULL},
+ {0},
+ {0}, /* v */
+ {0}, /* w */
+ {0}, /* x */
+ {0}, /* y */
+ {0}, /* z */
+ {0}, {0}, {0}, {0}
+};
+
+CBModeInfo myCbmodeinfos[] = {
+ {'c', CMODE_c, 0, NULL, NULL},
+ {'i', CMODE_i, 0, NULL, NULL},
+ {'j', CMODE_j, 0, get_flood, cs_get_flood},
+ {'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},
+ {'r', CMODE_r, 0, NULL, NULL},
+ {'s', CMODE_s, 0, NULL, NULL},
+ {'t', CMODE_t, 0, NULL, NULL},
+ {'M', CMODE_M, 0, NULL, NULL},
+ {'O', CMODE_O, 0, NULL, NULL},
+ {'R', CMODE_R, 0, NULL, NULL},
+ {'N', CMODE_N, 0, NULL, NULL},
+ {'S', CMODE_S, 0, NULL, NULL},
+ {0}
+};
+
+
+CUMode myCumodes[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},
+
+ {0}, /* a */
+ {0}, /* b */
+ {0}, /* c */
+ {0}, /* d */
+ {0}, /* e */
+ {0}, /* f */
+ {0}, /* g */
+ {CUS_HALFOP, 0, check_valid_op},
+ {0}, /* i */
+ {0}, /* j */
+ {0}, /* k */
+ {0}, /* l */
+ {0}, /* m */
+ {0}, /* n */
+ {CUS_OP, CUF_PROTECT_BOTSERV, check_valid_op},
+ {0}, /* p */
+ {0}, /* q */
+ {0}, /* r */
+ {0}, /* s */
+ {0}, /* t */
+ {0}, /* u */
+ {CUS_VOICE, 0, NULL}, /* v */
+ {0}, /* w */
+ {0}, /* x */
+ {0}, /* y */
+ {0}, /* z */
+ {0}, {0}, {0}, {0}, {0}
+};
+
+void solidircd_cmd_mode(char *source, char *dest, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ if (ircdcap->tsmode) {
+ if (uplink_capab & ircdcap->tsmode) {
+ send_cmd(source, "MODE %s 0 %s", dest, buf);
+ } else {
+ send_cmd(source, "MODE %s %s", dest, buf);
+ }
+ } else {
+ send_cmd(source, "MODE %s %s", dest, buf);
+ }
+}
+
+/* SVSHOLD - set */
+void solidircd_cmd_svshold(char *nick)
+{
+ send_cmd(ServerName, "SVSHOLD %s %d :%s", nick, NSReleaseTimeout,
+ "Being held for registered user");
+}
+
+/* SVSHOLD - release */
+void solidircd_cmd_release_svshold(char *nick)
+{
+ send_cmd(ServerName, "SVSHOLD %s 0", nick);
+}
+
+/* SVSMODE -b */
+void solidircd_cmd_unban(char *name, char *nick)
+{
+ solidircd_cmd_svsmode_chan(name, "-b", nick);
+}
+
+
+/* SVSMODE channel modes */
+
+void solidircd_cmd_svsmode_chan(char *name, char *mode, char *nick)
+{
+ if (nick) {
+ send_cmd(ServerName, "SVSMODE %s %s %s", name, mode, nick);
+ } else {
+ send_cmd(ServerName, "SVSMODE %s %s", name, mode);
+ }
+}
+
+void solidircd_cmd_bot_chan_mode(char *nick, char *chan)
+{
+ anope_cmd_mode(nick, chan, "%s %s", ircd->botchanumode, nick);
+}
+
+/* EVENT: SJOIN */
+int anope_event_sjoin(char *source, int ac, char **av)
+{
+ do_sjoin(source, ac, av);
+ return MOD_CONT;
+}
+
+/*
+** NICK - new
+** source = NULL
+** parv[0] = nickname
+** parv[1] = hopcount
+** parv[2] = timestamp
+** parv[3] = modes
+** parv[4] = username
+** parv[5] = hostname
+** parv[6] = server
+** parv[7] = servicestamp
+** parv[8] = IP
+** parv[9] = info
+** NICK - change
+** source = oldnick
+** parv[0] = new nickname
+** parv[1] = hopcount
+*/
+int anope_event_nick(char *source, int ac, char **av)
+{
+ User *user;
+
+ if (ac != 2) {
+ 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), NULL, NULL);
+ if (user) {
+ anope_set_umode(user, 1, &av[3]);
+ }
+ } else {
+ do_nick(source, av[0], NULL, NULL, NULL, NULL,
+ strtoul(av[1], NULL, 10), 0, 0, NULL, NULL);
+ }
+ return MOD_CONT;
+}
+
+/* EVENT : CAPAB */
+int anope_event_capab(char *source, int ac, char **av)
+{
+ capab_parse(ac, av);
+ return MOD_CONT;
+}
+
+/* EVENT : OS */
+int anope_event_os(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+ m_privmsg(source, s_OperServ, av[0]);
+ return MOD_CONT;
+}
+
+/* EVENT : NS */
+int anope_event_ns(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+ m_privmsg(source, s_NickServ, av[0]);
+ return MOD_CONT;
+}
+
+/* EVENT : MS */
+int anope_event_ms(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+ m_privmsg(source, s_MemoServ, av[0]);
+ return MOD_CONT;
+}
+
+/* EVENT : HS */
+int anope_event_hs(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+ m_privmsg(source, s_HostServ, av[0]);
+ return MOD_CONT;
+}
+
+/* EVENT : CS */
+int anope_event_cs(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+ m_privmsg(source, s_ChanServ, av[0]);
+ return MOD_CONT;
+}
+
+int anope_event_436(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+
+ m_nickcoll(av[0]);
+ return MOD_CONT;
+}
+
+/* *INDENT-OFF* */
+void moduleAddIRCDMsgs(void) {
+ Message *m;
+
+ updateProtectDetails("PROTECT","PROTECTME","protect","deprotect","AUTOPROTECT","+","-");
+
+ m = createMessage("401", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("402", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("436", anope_event_436); addCoreMessage(IRCD,m);
+ m = createMessage("AWAY", anope_event_away); addCoreMessage(IRCD,m);
+ m = createMessage("INVITE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("JOIN", anope_event_join); addCoreMessage(IRCD,m);
+ m = createMessage("KICK", anope_event_kick); addCoreMessage(IRCD,m);
+ m = createMessage("KILL", anope_event_kill); addCoreMessage(IRCD,m);
+ m = createMessage("MODE", anope_event_mode); addCoreMessage(IRCD,m);
+ m = createMessage("MOTD", anope_event_motd); addCoreMessage(IRCD,m);
+ m = createMessage("NICK", anope_event_nick); addCoreMessage(IRCD,m);
+ m = createMessage("NOTICE", anope_event_notice); addCoreMessage(IRCD,m);
+ m = createMessage("PART", anope_event_part); addCoreMessage(IRCD,m);
+ m = createMessage("PASS", anope_event_pass); addCoreMessage(IRCD,m);
+ m = createMessage("PING", anope_event_ping); addCoreMessage(IRCD,m);
+ m = createMessage("PRIVMSG", anope_event_privmsg); addCoreMessage(IRCD,m);
+ m = createMessage("QUIT", anope_event_quit); addCoreMessage(IRCD,m);
+ m = createMessage("SERVER", anope_event_server); addCoreMessage(IRCD,m);
+ m = createMessage("SQUIT", anope_event_squit); addCoreMessage(IRCD,m);
+ m = createMessage("TOPIC", anope_event_topic); addCoreMessage(IRCD,m);
+ m = createMessage("USER", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("WALLOPS", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("WHOIS", anope_event_whois); addCoreMessage(IRCD,m);
+ m = createMessage("AKILL", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("GLOBOPS", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("GNOTICE", anope_event_gnotice); addCoreMessage(IRCD,m);
+ m = createMessage("GOPER", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("RAKILL", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SILENCE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SVSKILL", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SVSMODE", anope_event_mode); addCoreMessage(IRCD,m);
+ m = createMessage("SVSNICK", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SVSNOOP", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SQLINE", anope_event_sqline); addCoreMessage(IRCD,m);
+ m = createMessage("UNSQLINE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("CAPAB", anope_event_capab); addCoreMessage(IRCD,m);
+ m = createMessage("CS", anope_event_cs); addCoreMessage(IRCD,m);
+ m = createMessage("HS", anope_event_hs); addCoreMessage(IRCD,m);
+ m = createMessage("MS", anope_event_ms); addCoreMessage(IRCD,m);
+ m = createMessage("NS", anope_event_ns); addCoreMessage(IRCD,m);
+ m = createMessage("OS", anope_event_os); addCoreMessage(IRCD,m);
+ m = createMessage("RS", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SGLINE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SJOIN", anope_event_sjoin); addCoreMessage(IRCD,m);
+ m = createMessage("SS", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SVINFO", anope_event_svinfo); addCoreMessage(IRCD,m);
+ m = createMessage("SZLINE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("UNSGLINE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("UNSZLINE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("ERROR", anope_event_error); addCoreMessage(IRCD,m);
+ m = createMessage("LUSERSLOCK",anope_event_luserslock); addCoreMessage(IRCD,m);
+ m = createMessage("BURST", anope_event_burst); addCoreMessage(IRCD,m);
+ m = createMessage("ADMIN", anope_event_admin); addCoreMessage(IRCD,m);
+ m = createMessage("SVHOST", anope_event_vs); addCoreMessage(IRCD,m);
+ m = createMessage("ELMER", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SILLY", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SHUN", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("NORMAL", anope_event_null); addCoreMessage(IRCD,m);
+}
+
+/* *INDENT-ON* */
+
+
+int anope_event_vs(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 2)
+ return MOD_CONT;
+
+ u = finduser(av[0]);
+ if (!u) {
+ if (debug) {
+ alog("debug: SVHOST for nonexistent user %s", av[0]);
+ }
+ return MOD_CONT;
+ }
+
+ change_user_host(u, av[1]);
+ return MOD_CONT;
+
+}
+
+/* SQLINE */
+void solidircd_cmd_sqline(char *mask, char *reason)
+{
+ if (!mask || !reason) {
+ return;
+ }
+
+ send_cmd(NULL, "SQLINE %s :%s", mask, reason);
+}
+
+/* UNSGLINE */
+void solidircd_cmd_unsgline(char *mask)
+{
+ send_cmd(NULL, "UNSGLINE 0 :%s", mask);
+}
+
+/* UNSZLINE */
+void solidircd_cmd_unszline(char *mask)
+{
+ send_cmd(NULL, "UNSZLINE 0 %s", mask);
+}
+
+/* SZLINE */
+void solidircd_cmd_szline(char *mask, char *reason, char *whom)
+{
+ send_cmd(NULL, "SZLINE %s :%s", mask, reason);
+}
+
+/* SVSNOOP */
+void solidircd_cmd_svsnoop(char *server, int set)
+{
+ send_cmd(NULL, "SVSNOOP %s %s", server, (set ? "+" : "-"));
+}
+
+void solidircd_cmd_svsadmin(char *server, int set)
+{
+ solidircd_cmd_svsnoop(server, set);
+}
+
+/* SGLINE */
+void solidircd_cmd_sgline(char *mask, char *reason)
+{
+ send_cmd(NULL, "SGLINE %d :%s:%s", (int)strlen(mask), mask, reason);
+}
+
+/* RAKILL */
+void solidircd_cmd_remove_akill(char *user, char *host)
+{
+ send_cmd(NULL, "RAKILL %s %s", host, user);
+}
+
+/* PART */
+void solidircd_cmd_part(char *nick, char *chan, char *buf)
+{
+ if (!nick || !chan) {
+ return;
+ }
+
+ if (buf) {
+ send_cmd(nick, "PART %s :%s", chan, buf);
+ } else {
+ send_cmd(nick, "PART %s", chan);
+ }
+}
+
+/* TOPIC */
+void solidircd_cmd_topic(char *whosets, char *chan, char *whosetit,
+ char *topic, time_t when)
+{
+ send_cmd(whosets, "TOPIC %s %s %lu :%s", chan, whosetit,
+ (unsigned long int) when, topic);
+}
+
+/* UNSQLINE */
+void solidircd_cmd_unsqline(char *user)
+{
+ send_cmd(NULL, "UNSQLINE %s", user);
+}
+
+/* JOIN - SJOIN */
+void solidircd_cmd_join(char *user, char *channel, time_t chantime)
+{
+ send_cmd(user, "SJOIN %ld %s", (long int) chantime, channel);
+}
+
+/* AKILL */
+/* parv[1]=host
+ * parv[2]=user
+ * parv[3]=length
+ * parv[4]=akiller
+ * parv[5]=time set
+ * parv[6]=reason
+ */
+void solidircd_cmd_akill(char *user, char *host, char *who, time_t when,
+ time_t expires, char *reason)
+{
+ send_cmd(NULL, "AKILL %s %s %d %s %ld :%s", host, user, 86400 * 2, who,
+ (long int) time(NULL), reason);
+}
+
+/* SVSKILL */
+/* parv[0] = servername
+ * parv[1] = client
+ * parv[2] = nick stamp
+ * parv[3] = kill message
+ */
+/*
+ Note: if the stamp is null 0, the below usage is correct of Bahamut
+*/
+void solidircd_cmd_svskill(char *source, char *user, char *buf)
+{
+
+ if (!source || !user || !buf) {
+ return;
+ }
+
+ send_cmd(source, "SVSKILL %s :%s", user, buf);
+}
+
+/* SVSMODE */
+/* parv[0] - sender
+ * parv[1] - nick
+ * parv[2] - TS (or mode, depending on svs version)
+ * parv[3] - mode (or services id if old svs version)
+ * parv[4] - optional arguement (services id)
+ */
+void solidircd_cmd_svsmode(User * u, int ac, char **av)
+{
+ send_cmd(ServerName, "SVSMODE %s %ld %s%s%s", u->nick,
+ (long int) u->timestamp, av[0], (ac == 2 ? " " : ""),
+ (ac == 2 ? av[1] : ""));
+}
+
+/* SQUIT */
+/*
+ * parv[0] = sender prefix
+ * parv[1] = server name
+ * parv[2] = comment
+*/
+void solidircd_cmd_squit(char *servname, char *message)
+{
+ send_cmd(NULL, "SQUIT %s :%s", servname, message);
+}
+
+/* PONG */
+void solidircd_cmd_pong(char *servname, char *who)
+{
+ send_cmd(servname, "PONG %s", who);
+}
+
+void solidircd_cmd_burst()
+{
+ send_cmd(NULL, "BURST");
+}
+
+
+/*
+ * SVINFO
+ * parv[0] = sender prefix
+ * parv[1] = TS_CURRENT for the server
+ * parv[2] = TS_MIN for the server
+ * parv[3] = server is standalone or connected to non-TS only
+ * parv[4] = server's idea of UTC time
+ */
+void solidircd_cmd_svinfo()
+{
+ send_cmd(NULL, "SVINFO 5 3 0 :%ld", (long int) time(NULL));
+}
+
+/* PASS */
+void solidircd_cmd_pass(char *pass)
+{
+ send_cmd(NULL, "PASS %s :TS", pass);
+}
+
+/* SERVER */
+void solidircd_cmd_server(char *servname, int hop, char *descript)
+{
+ send_cmd(NULL, "SERVER %s %d :%s", servname, hop, ServerDesc);
+}
+
+/* CAPAB */
+void solidircd_cmd_capab()
+{
+ /* CAPAB SSJOIN NOQUIT BURST UNCONNECT ZIP NICKIP TSMODE */
+ send_cmd(NULL, "CAPAB SSJOIN NOQUIT BURST UNCONNECT NICKIP TSMODE");
+}
+
+void solidircd_cmd_connect(int servernum)
+{
+ me_server =
+ new_server(NULL, ServerName, ServerDesc, SERVER_ISME, NULL);
+
+ if (servernum == 1) {
+ solidircd_cmd_pass(RemotePassword);
+ } else if (servernum == 2) {
+ solidircd_cmd_pass(RemotePassword2);
+ } else if (servernum == 3) {
+ solidircd_cmd_pass(RemotePassword3);
+ }
+ solidircd_cmd_capab();
+ solidircd_cmd_server(ServerName, 1, ServerDesc);
+ solidircd_cmd_svinfo();
+ solidircd_cmd_burst();
+}
+
+/* EVENT : SERVER */
+int anope_event_server(char *source, int ac, char **av)
+{
+ char *uplink;
+
+ if (!stricmp(av[1], "1")) {
+ uplink = sstrdup(av[0]);
+ }
+
+ do_server(source, av[0], av[1], av[2], NULL);
+ return MOD_CONT;
+}
+
+/* EVENT : PRIVMSG */
+int anope_event_privmsg(char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+ m_privmsg(source, av[0], av[1]);
+ return MOD_CONT;
+}
+
+/* EVENT : SVINFO */
+/*
+ * parv[0] = sender prefix
+ * parv[1] = TS_CURRENT for the server
+ * parv[2] = TS_MIN for the server
+ * parv[3] = server is standalone or connected to non-TS only
+ * parv[4] = server's idea of UTC time
+ */
+int anope_event_svinfo(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+
+int anope_event_part(char *source, int ac, char **av)
+{
+ if (ac < 1 || ac > 2)
+ return MOD_CONT;
+ do_part(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_whois(char *source, int ac, char **av)
+{
+ if (source && ac >= 1) {
+ m_whois(source, av[0]);
+ }
+ return MOD_CONT;
+}
+
+int anope_event_topic(char *source, int ac, char **av)
+{
+ if (ac != 4)
+ return MOD_CONT;
+ do_topic(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_squit(char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+ do_squit(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_quit(char *source, int ac, char **av)
+{
+ if (ac != 1)
+ return MOD_CONT;
+ do_quit(source, ac, av);
+ return MOD_CONT;
+}
+
+/* EVENT: MODE */
+int anope_event_mode(char *source, int ac, char **av)
+{
+ if (ac < 2)
+ return MOD_CONT;
+
+ if (*av[0] == '#' || *av[0] == '&') {
+ do_cmode(source, ac, av);
+ } else {
+ do_umode(source, ac, av);
+ }
+ return MOD_CONT;
+}
+
+/* EVENT: KILL */
+int anope_event_kill(char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+
+ m_kill(av[0], av[1]);
+ return MOD_CONT;
+}
+
+/* EVENT: KICK */
+int anope_event_kick(char *source, int ac, char **av)
+{
+ if (ac != 3)
+ return MOD_CONT;
+ do_kick(source, ac, av);
+ return MOD_CONT;
+}
+
+/* EVENT: JOIN */
+int anope_event_join(char *source, int ac, char **av)
+{
+ if (ac != 1)
+ return MOD_CONT;
+ do_join(source, ac, av);
+ return MOD_CONT;
+}
+
+/* EVENT: MOTD */
+int anope_event_motd(char *source, int ac, char **av)
+{
+ if (!source) {
+ return MOD_CONT;
+ }
+
+ m_motd(source);
+ return MOD_CONT;
+}
+
+void solidircd_cmd_notice_ops(char *source, char *dest, char *buf)
+{
+
+ if (!buf) {
+ return;
+ }
+ send_cmd(NULL, "NOTICE @%s :%s", dest, buf);
+}
+
+/* NOTICE */
+void solidircd_cmd_notice(char *source, char *dest, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ if (NSDefFlags & NI_MSG) {
+ solidircd_cmd_privmsg2(source, dest, buf);
+ } else {
+ send_cmd(source, "NOTICE %s :%s", dest, buf);
+ }
+}
+
+void solidircd_cmd_notice2(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "NOTICE %s :%s", dest, msg);
+}
+
+void solidircd_cmd_privmsg(char *source, char *dest, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(source, "PRIVMSG %s :%s", dest, buf);
+}
+
+void solidircd_cmd_privmsg2(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "PRIVMSG %s :%s", dest, msg);
+}
+
+void solidircd_cmd_serv_notice(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "NOTICE $%s :%s", dest, msg);
+}
+
+void solidircd_cmd_serv_privmsg(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "PRIVMSG $%s :%s", dest, msg);
+}
+
+/* GLOBOPS */
+void solidircd_cmd_global(char *source, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(source ? source : ServerName, "GLOBOPS :%s", buf);
+}
+
+/* 391 */
+void solidircd_cmd_391(char *source, char *timestr)
+{
+ if (!timestr) {
+ return;
+ }
+ send_cmd(NULL, "391 :%s %s :%s", source, ServerName, timestr);
+}
+
+/* 250 */
+void solidircd_cmd_250(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "250 %s", buf);
+}
+
+/* 307 */
+void solidircd_cmd_307(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "307 %s", buf);
+}
+
+/* 311 */
+void solidircd_cmd_311(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "311 %s", buf);
+}
+
+/* 312 */
+void solidircd_cmd_312(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "312 %s", buf);
+}
+
+/* 317 */
+void solidircd_cmd_317(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "317 %s", buf);
+}
+
+/* 219 */
+void solidircd_cmd_219(char *source, char *letter)
+{
+ if (!source) {
+ return;
+ }
+
+ if (letter) {
+ send_cmd(NULL, "219 %s %c :End of /STATS report.", source,
+ *letter);
+ } else {
+ send_cmd(NULL, "219 %s l :End of /STATS report.", source);
+ }
+}
+
+/* 401 */
+void solidircd_cmd_401(char *source, char *who)
+{
+ if (!source || !who) {
+ return;
+ }
+ send_cmd(ServerName, "401 %s %s :No such service.", source, who);
+}
+
+/* 318 */
+void solidircd_cmd_318(char *source, char *who)
+{
+ if (!source || !who) {
+ return;
+ }
+
+ send_cmd(ServerName, "318 %s %s :End of /WHOIS list.", source, who);
+}
+
+/* 242 */
+void solidircd_cmd_242(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "242 %s", buf);
+}
+
+/* 243 */
+void solidircd_cmd_243(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "243 %s", buf);
+}
+
+/* 211 */
+void solidircd_cmd_211(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "211 %s", buf);
+}
+
+void solidircd_cmd_nick(char *nick, char *name, char *modes)
+{
+ EnforceQlinedNick(nick, NULL);
+ send_cmd(NULL, "NICK %s 1 %ld %s %s %s %s 0 0 :%s", nick,
+ (long int) time(NULL), modes, ServiceUser, ServiceHost,
+ ServerName, name);
+ solidircd_cmd_sqline(nick, "Reserved for services");
+}
+
+void solidircd_cmd_kick(char *source, char *chan, char *user, char *buf)
+{
+ if (buf) {
+ send_cmd(source, "KICK %s %s :%s", chan, user, buf);
+ } else {
+ send_cmd(source, "KICK %s %s", chan, user);
+ }
+}
+
+void solidircd_cmd_372(char *source, char *msg)
+{
+ send_cmd(ServerName, "372 %s :- %s", source, msg);
+}
+
+void solidircd_cmd_372_error(char *source)
+{
+ send_cmd(ServerName, "422 %s :- MOTD file not found! Please "
+ "contact your IRC administrator.", source);
+}
+
+void solidircd_cmd_375(char *source)
+{
+ send_cmd(ServerName, "375 %s :- %s Message of the Day",
+ source, ServerName);
+}
+
+void solidircd_cmd_376(char *source)
+{
+ send_cmd(ServerName, "376 %s :End of /MOTD command.", source);
+}
+
+/* INVITE */
+void solidircd_cmd_invite(char *source, char *chan, char *nick)
+{
+ if (!source || !chan || !nick) {
+ return;
+ }
+
+ send_cmd(source, "INVITE %s %s", nick, chan);
+}
+
+/* QUIT */
+void solidircd_cmd_quit(char *source, char *buf)
+{
+
+ if (buf) {
+ send_cmd(source, "QUIT :%s", buf);
+ } else {
+ send_cmd(source, "QUIT");
+ }
+}
+
+int anope_event_away(char *source, int ac, char **av)
+{
+ if (!source) {
+ return MOD_CONT;
+ }
+ m_away(source, (ac ? av[0] : NULL));
+ return MOD_CONT;
+}
+
+int anope_event_ping(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+ solidircd_cmd_pong(ac > 1 ? av[1] : ServerName, av[0]);
+ return MOD_CONT;
+}
+
+void solidircd_cmd_351(char *source)
+{
+ send_cmd(ServerName, "351 %s Anope-%s %s :%s - %s (%s)-- %s",
+ source, version_number, ServerName, ircd->name, version_flags,
+ EncModule, version_build);
+
+
+}
+
+void solidircd_cmd_bot_nick(char *nick, char *user, char *host, char *real,
+ char *modes)
+{
+ EnforceQlinedNick(nick, s_BotServ);
+ send_cmd(NULL, "NICK %s 1 %ld %s %s %s %s 0 0 :%s", nick,
+ (long int) time(NULL), modes, user, host, ServerName, real);
+ solidircd_cmd_sqline(nick, "Reserved for services");
+}
+
+/* SVSNICK */
+/* parv[0] = sender
+ * parv[1] = old nickname
+ * parv[2] = new nickname
+ * parv[3] = timestamp
+ */
+void solidircd_cmd_svsnick(char *source, char *guest, time_t when)
+{
+ if (!source || !guest) {
+ return;
+ }
+ send_cmd(NULL, "SVSNICK %s %s :%ld", source, guest, (long int) when);
+}
+
+void solidircd_cmd_guest_nick(char *nick, char *user, char *host,
+ char *real, char *modes)
+{
+ send_cmd(NULL, "NICK %s 1 %ld %s %s %s %s 0 0 :%s", nick,
+ (long int) time(NULL), modes, user, host, ServerName, real);
+}
+
+void solidircd_cmd_svso(char *source, char *nick, char *flag)
+{
+ /* Not Supported by this IRCD */
+}
+
+void solidircd_cmd_chghost(char *nick, char *vhost)
+{
+ if (!nick || !vhost) {
+ return;
+ }
+ send_cmd(ServerName, "SVHOST %s %s", nick, vhost);
+}
+
+
+void solidircd_cmd_vhost_on(char *nick, char *vIdent, char *vhost)
+{
+ send_cmd(s_HostServ, "SVSMODE %s +v", nick);
+ solidircd_cmd_chghost(nick, vhost);
+}
+
+void solidircd_cmd_vhost_off(User * u)
+{
+ send_cmd(s_HostServ, "SVSMODE %s -v", u->nick);
+ notice_lang(s_HostServ, u, HOST_OFF_UNREAL, u->nick, ircd->vhostchar);
+}
+
+/* SVSMODE +d */
+/* sent if svid is something weird */
+void solidircd_cmd_svid_umode(char *nick, time_t ts)
+{
+ send_cmd(ServerName, "SVSMODE %s %lu +d 1", nick,
+ (unsigned long int) ts);
+}
+
+
+/* SVSMODE +d */
+/* nc_change was = 1, and there is no na->status */
+void solidircd_cmd_nc_change(User * u)
+{
+ common_svsmode(u, "+d", "1");
+}
+
+/* SVSMODE +d */
+void solidircd_cmd_svid_umode2(User * u, char *ts)
+{
+ /* not used by bahamut ircds */
+}
+
+
+void solidircd_cmd_svid_umode3(User * u, char *ts)
+{
+ if (u->svid != u->timestamp) {
+ common_svsmode(u, "+rd", ts);
+ } else {
+ common_svsmode(u, "+r", NULL);
+ }
+}
+
+/* NICK <newnick> */
+void solidircd_cmd_chg_nick(char *oldnick, char *newnick)
+{
+ if (!oldnick || !newnick) {
+ return;
+ }
+
+ send_cmd(oldnick, "NICK %s :%ld", newnick, (long int) time(NULL));
+}
+
+int anope_event_error(char *source, int ac, char **av)
+{
+ if (ac >= 1) {
+ if (debug) {
+ alog("debug: %s", av[0]);
+ }
+ }
+ return MOD_CONT;
+}
+
+int anope_event_notice(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_sqline(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+
+int anope_event_gnotice(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_pass(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+void solidircd_cmd_svsjoin(char *source, char *nick, char *chan, char *param)
+{
+ /* Can not find any reference to these in Bahamut */
+}
+
+void solidircd_cmd_svspart(char *source, char *nick, char *chan)
+{
+ /* Can not find any reference to these in Bahamut */
+}
+
+void solidircd_cmd_swhois(char *source, char *who, char *mask)
+{
+ /* not supported */
+}
+
+void solidircd_cmd_eob()
+{
+ send_cmd(NULL, "BURST 0");
+}
+
+int anope_event_burst(char *source, int ac, char **av)
+{
+ Server *s;
+ s = findserver(servlist, source);
+ if (!ac) {
+ /* for future use - start burst */
+ } else {
+ /* If we found a server with the given source, that one just
+ * finished bursting. If there was no source, then our uplink
+ * server finished bursting. -GD
+ */
+ if (!s && serv_uplink)
+ s = serv_uplink;
+ finish_sync(s, 1);
+ }
+ return MOD_CONT;
+}
+
+int anope_event_luserslock(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_rehash(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_credits(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_admin(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int solidircd_flood_mode_check(char *value)
+{
+ char *dp, *end;
+
+ if (value && *value != ':'
+ && (strtoul((*value == '*' ? value + 1 : value), &dp, 10) > 0)
+ && (*dp == ':') && (*(++dp) != 0) && (strtoul(dp, &end, 10) > 0)
+ && (*end == 0)) {
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
+void solidircd_cmd_jupe(char *jserver, char *who, char *reason)
+{
+ char rbuf[256];
+
+ snprintf(rbuf, sizeof(rbuf), "Juped by %s%s%s", who,
+ reason ? ": " : "", reason ? reason : "");
+
+ if (findserver(servlist, jserver))
+ solidircd_cmd_squit(jserver, rbuf);
+ solidircd_cmd_server(jserver, 2, rbuf);
+ new_server(me_server, jserver, rbuf, SERVER_JUPED, NULL);
+}
+
+/* GLOBOPS - to handle old WALLOPS */
+void solidircd_cmd_global_legacy(char *source, char *fmt)
+{
+ send_cmd(source ? source : ServerName, "GLOBOPS :%s", fmt);
+}
+
+/*
+ 1 = valid nick
+ 0 = nick is in valid
+*/
+int solidircd_valid_nick(char *nick)
+{
+ /* no hard coded invalid nicks */
+ return 1;
+}
+
+/*
+ 1 = valid chan
+ 0 = chan is in valid
+*/
+int solidircd_valid_chan(char *chan)
+{
+ /* no hard coded invalid chan*/
+ return 1;
+}
+
+
+void solidircd_cmd_ctcp(char *source, char *dest, char *buf)
+{
+ char *s;
+
+ if (!buf) {
+ return;
+ } else {
+ s = normalizeBuffer(buf);
+ }
+
+ send_cmd(source, "%s NOTICE :\1%s \1", dest, s);
+ free(s);
+}
+
+
+/**
+ * Tell anope which function we want to perform each task inside of anope.
+ * These prototypes must match what anope expects.
+ **/
+void moduleAddAnopeCmds()
+{
+ pmodule_cmd_svsnoop(solidircd_cmd_svsnoop);
+ pmodule_cmd_remove_akill(solidircd_cmd_remove_akill);
+ pmodule_cmd_topic(solidircd_cmd_topic);
+ pmodule_cmd_vhost_off(solidircd_cmd_vhost_off);
+ pmodule_cmd_akill(solidircd_cmd_akill);
+ pmodule_cmd_svskill(solidircd_cmd_svskill);
+ pmodule_cmd_svsmode(solidircd_cmd_svsmode);
+ pmodule_cmd_372(solidircd_cmd_372);
+ pmodule_cmd_372_error(solidircd_cmd_372_error);
+ pmodule_cmd_375(solidircd_cmd_375);
+ pmodule_cmd_376(solidircd_cmd_376);
+ pmodule_cmd_nick(solidircd_cmd_nick);
+ pmodule_cmd_guest_nick(solidircd_cmd_guest_nick);
+ pmodule_cmd_mode(solidircd_cmd_mode);
+ pmodule_cmd_bot_nick(solidircd_cmd_bot_nick);
+ pmodule_cmd_kick(solidircd_cmd_kick);
+ pmodule_cmd_notice_ops(solidircd_cmd_notice_ops);
+ pmodule_cmd_notice(solidircd_cmd_notice);
+ pmodule_cmd_notice2(solidircd_cmd_notice2);
+ pmodule_cmd_privmsg(solidircd_cmd_privmsg);
+ pmodule_cmd_privmsg2(solidircd_cmd_privmsg2);
+ pmodule_cmd_serv_notice(solidircd_cmd_serv_notice);
+ pmodule_cmd_serv_privmsg(solidircd_cmd_serv_privmsg);
+ pmodule_cmd_bot_chan_mode(solidircd_cmd_bot_chan_mode);
+ pmodule_cmd_351(solidircd_cmd_351);
+ pmodule_cmd_quit(solidircd_cmd_quit);
+ pmodule_cmd_pong(solidircd_cmd_pong);
+ pmodule_cmd_join(solidircd_cmd_join);
+ pmodule_cmd_unsqline(solidircd_cmd_unsqline);
+ pmodule_cmd_invite(solidircd_cmd_invite);
+ pmodule_cmd_part(solidircd_cmd_part);
+ pmodule_cmd_391(solidircd_cmd_391);
+ pmodule_cmd_250(solidircd_cmd_250);
+ pmodule_cmd_307(solidircd_cmd_307);
+ pmodule_cmd_311(solidircd_cmd_311);
+ pmodule_cmd_312(solidircd_cmd_312);
+ pmodule_cmd_317(solidircd_cmd_317);
+ pmodule_cmd_219(solidircd_cmd_219);
+ pmodule_cmd_401(solidircd_cmd_401);
+ pmodule_cmd_318(solidircd_cmd_318);
+ pmodule_cmd_242(solidircd_cmd_242);
+ pmodule_cmd_243(solidircd_cmd_243);
+ pmodule_cmd_211(solidircd_cmd_211);
+ pmodule_cmd_global(solidircd_cmd_global);
+ pmodule_cmd_global_legacy(solidircd_cmd_global_legacy);
+ pmodule_cmd_sqline(solidircd_cmd_sqline);
+ pmodule_cmd_squit(solidircd_cmd_squit);
+ pmodule_cmd_svso(solidircd_cmd_svso);
+ pmodule_cmd_chg_nick(solidircd_cmd_chg_nick);
+ pmodule_cmd_svsnick(solidircd_cmd_svsnick);
+ pmodule_cmd_vhost_on(solidircd_cmd_vhost_on);
+ pmodule_cmd_connect(solidircd_cmd_connect);
+ pmodule_cmd_svshold(solidircd_cmd_svshold);
+ pmodule_cmd_release_svshold(solidircd_cmd_release_svshold);
+ pmodule_cmd_unsgline(solidircd_cmd_unsgline);
+ pmodule_cmd_unszline(solidircd_cmd_unszline);
+ pmodule_cmd_szline(solidircd_cmd_szline);
+ pmodule_cmd_sgline(solidircd_cmd_sgline);
+ pmodule_cmd_unban(solidircd_cmd_unban);
+ pmodule_cmd_svsmode_chan(solidircd_cmd_svsmode_chan);
+ pmodule_cmd_svid_umode(solidircd_cmd_svid_umode);
+ pmodule_cmd_nc_change(solidircd_cmd_nc_change);
+ pmodule_cmd_svid_umode2(solidircd_cmd_svid_umode2);
+ pmodule_cmd_svid_umode3(solidircd_cmd_svid_umode3);
+ pmodule_cmd_svsjoin(solidircd_cmd_svsjoin);
+ pmodule_cmd_svspart(solidircd_cmd_svspart);
+ pmodule_cmd_swhois(solidircd_cmd_swhois);
+ pmodule_cmd_eob(solidircd_cmd_eob);
+ pmodule_flood_mode_check(solidircd_flood_mode_check);
+ pmodule_cmd_jupe(solidircd_cmd_jupe);
+ pmodule_valid_nick(solidircd_valid_nick);
+ pmodule_valid_chan(solidircd_valid_chan);
+ pmodule_cmd_ctcp(solidircd_cmd_ctcp);
+ pmodule_set_umode(solidircd_set_umode);
+}
+
+/**
+ * Now tell anope how to use us.
+ **/
+int AnopeInit(int argc, char **argv)
+{
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion
+ ("$Id$");
+ moduleSetType(PROTOCOL);
+
+ pmodule_ircd_version("Solid-IRCd 3.4.*");
+ pmodule_ircd_cap(myIrcdcap);
+ pmodule_ircd_var(myIrcd);
+ pmodule_ircd_cbmodeinfos(myCbmodeinfos);
+ pmodule_ircd_cumodes(myCumodes);
+ pmodule_ircd_flood_mode_char_set("+j");
+ pmodule_ircd_flood_mode_char_remove("-j");
+ pmodule_ircd_cbmodes(myCbmodes);
+ pmodule_ircd_cmmodes(myCmmodes);
+ pmodule_ircd_csmodes(myCsmodes);
+ pmodule_ircd_useTSMode(0);
+
+ /** Deal with modes anope _needs_ to know **/
+ pmodule_invis_umode(UMODE_i);
+ pmodule_oper_umode(UMODE_o);
+ pmodule_invite_cmode(CMODE_i);
+ pmodule_secret_cmode(CMODE_s);
+ pmodule_private_cmode(CMODE_p);
+ pmodule_key_mode(CMODE_k);
+ pmodule_limit_mode(CMODE_l);
+
+ moduleAddAnopeCmds();
+ moduleAddIRCDMsgs();
+
+ return MOD_CONT;
+}
diff --git a/src/protocol/solidircd.h b/src/protocol/solidircd.h
new file mode 100644
index 000000000..9bf5d3b02
--- /dev/null
+++ b/src/protocol/solidircd.h
@@ -0,0 +1,137 @@
+/* SolidIRCD functions
+ *
+ * (C) 2003-2008 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.
+ *
+ *
+ */
+
+/*************************************************************************/
+
+#define UMODE_a 0x00000001 /* umode +a - Services Admin */
+#define UMODE_h 0x00000002 /* umode +h - Helper */
+#define UMODE_i 0x00000004 /* umode +i - Invisible */
+#define UMODE_o 0x00000008 /* umode +o - Oper */
+#define UMODE_r 0x00000010 /* umode +r - registered nick */
+#define UMODE_w 0x00000020 /* umode +w - Get wallops */
+#define UMODE_A 0x00000040 /* umode +A - Server Admin */
+#define UMODE_x 0x00000080 /* umode +x - Squelch with notice */
+#define UMODE_X 0x00000100 /* umode +X - Squelch without notice */
+#define UMODE_F 0x00000200 /* umode +F - no cptr->since message rate throttle */
+#define UMODE_j 0x00000400 /* umode +j - client rejection notices */
+#define UMODE_K 0x00000800 /* umode +K - U: lined server kill messages */
+#define UMODE_O 0x00001000 /* umode +O - Local Oper */
+#define UMODE_s 0x00002000 /* umode +s - Server notices */
+#define UMODE_c 0x00004000 /* umode +c - Client connections/exits */
+#define UMODE_k 0x00008000 /* umode +k - Server kill messages */
+#define UMODE_f 0x00010000 /* umode +f - Server flood messages */
+#define UMODE_y 0x00020000 /* umode +y - Stats/links */
+#define UMODE_d 0x00040000 /* umode +d - Debug info */
+#define UMODE_g 0x00080000 /* umode +g - Globops */
+#define UMODE_b 0x00100000 /* umode +b - Chatops */
+#define UMODE_n 0x00200000 /* umode +n - Routing Notices */
+#define UMODE_m 0x00400000 /* umode +m - spambot notices */
+#define UMODE_e 0x00800000 /* umode +e - oper notices for the above +D */
+#define UMODE_D 0x01000000 /* umode +D - Hidden dccallow umode */
+#define UMODE_I 0x02000000 /* umode +I - invisible oper (masked) */
+#define UMODE_C 0x04000000 /* umode +C - conops */
+#define UMODE_v 0x10000000 /* umode +v - hostmasking */
+#define UMODE_H 0x20000000 /* umode +H - Oper Hiding */
+#define UMODE_z 0x40000000 /* umode +z - SSL */
+#define UMODE_R 0x80000000 /* umode +R - No non registered msgs */
+
+#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
+#define CMODE_R 0x00000100 /* Only identified users can join */
+#define CMODE_r 0x00000200 /* Set for all registered channels */
+#define CMODE_c 0x00000400 /* Colors can't be used */
+#define CMODE_M 0x00000800 /* Non-regged nicks can't send messages */
+#define CMODE_j 0x00001000 /* join throttle */
+#define CMODE_S 0x00002000 /* SSL only */
+#define CMODE_N 0x00004000 /* No Nickname change */
+#define CMODE_O 0x00008000 /* Only opers can join */
+
+
+#define DEFAULT_MLOCK CMODE_n | CMODE_t | CMODE_r
+
+void solidircd_set_umode(User * user, int ac, char **av);
+void solidircd_cmd_svsnoop(char *server, int set);
+void solidircd_cmd_remove_akill(char *user, char *host);
+void solidircd_cmd_topic(char *whosets, char *chan, char *whosetit, char *topic, time_t when);
+void solidircd_cmd_vhost_off(User * u);
+void solidircd_cmd_akill(char *user, char *host, char *who, time_t when,time_t expires, char *reason);
+void solidircd_cmd_svskill(char *source, char *user, char *buf);
+void solidircd_cmd_svsmode(User * u, int ac, char **av);
+void solidircd_cmd_372(char *source, char *msg);
+void solidircd_cmd_372_error(char *source);
+void solidircd_cmd_375(char *source);
+void solidircd_cmd_376(char *source);
+void solidircd_cmd_nick(char *nick, char *name, char *modes);
+void solidircd_cmd_guest_nick(char *nick, char *user, char *host, char *real, char *modes);
+void solidircd_cmd_mode(char *source, char *dest, char *buf);
+void solidircd_cmd_bot_nick(char *nick, char *user, char *host, char *real, char *modes);
+void solidircd_cmd_kick(char *source, char *chan, char *user, char *buf);
+void solidircd_cmd_notice_ops(char *source, char *dest, char *buf);
+void solidircd_cmd_notice(char *source, char *dest, char *buf);
+void solidircd_cmd_notice2(char *source, char *dest, char *msg);
+void solidircd_cmd_privmsg(char *source, char *dest, char *buf);
+void solidircd_cmd_privmsg2(char *source, char *dest, char *msg);
+void solidircd_cmd_serv_notice(char *source, char *dest, char *msg);
+void solidircd_cmd_serv_privmsg(char *source, char *dest, char *msg);
+void solidircd_cmd_bot_chan_mode(char *nick, char *chan);
+void solidircd_cmd_351(char *source);
+void solidircd_cmd_quit(char *source, char *buf);
+void solidircd_cmd_pong(char *servname, char *who);
+void solidircd_cmd_join(char *user, char *channel, time_t chantime);
+void solidircd_cmd_unsqline(char *user);
+void solidircd_cmd_invite(char *source, char *chan, char *nick);
+void solidircd_cmd_part(char *nick, char *chan, char *buf);
+void solidircd_cmd_391(char *source, char *timestr);
+void solidircd_cmd_250(char *buf);
+void solidircd_cmd_307(char *buf);
+void solidircd_cmd_311(char *buf);
+void solidircd_cmd_312(char *buf);
+void solidircd_cmd_317(char *buf);
+void solidircd_cmd_219(char *source, char *letter);
+void solidircd_cmd_401(char *source, char *who);
+void solidircd_cmd_318(char *source, char *who);
+void solidircd_cmd_242(char *buf);
+void solidircd_cmd_243(char *buf);
+void solidircd_cmd_211(char *buf);
+void solidircd_cmd_global(char *source, char *buf);
+void solidircd_cmd_global_legacy(char *source, char *fmt);
+void solidircd_cmd_sqline(char *mask, char *reason);
+void solidircd_cmd_squit(char *servname, char *message);
+void solidircd_cmd_svso(char *source, char *nick, char *flag);
+void solidircd_cmd_chg_nick(char *oldnick, char *newnick);
+void solidircd_cmd_svsnick(char *source, char *guest, time_t when);
+void solidircd_cmd_vhost_on(char *nick, char *vIdent, char *vhost);
+void solidircd_cmd_connect(int servernum);
+void solidircd_cmd_svshold(char *nick);
+void solidircd_cmd_release_svshold(char *nick);
+void solidircd_cmd_unsgline(char *mask);
+void solidircd_cmd_unszline(char *mask);
+void solidircd_cmd_szline(char *mask, char *reason, char *whom);
+void solidircd_cmd_sgline(char *mask, char *reason);
+void solidircd_cmd_unban(char *name, char *nick);
+void solidircd_cmd_svsmode_chan(char *name, char *mode, char *nick);
+void solidircd_cmd_svid_umode(char *nick, time_t ts);
+void solidircd_cmd_nc_change(User * u);
+void solidircd_cmd_svid_umode2(User * u, char *ts);
+void solidircd_cmd_svid_umode3(User * u, char *ts);
+void solidircd_cmd_eob();
+int solidircd_flood_mode_check(char *value);
+void solidircd_cmd_jupe(char *jserver, char *who, char *reason);
+int solidircd_valid_nick(char *nick);
+void solidircd_cmd_ctcp(char *source, char *dest, char *buf);
diff --git a/src/protocol/ultimate2.c b/src/protocol/ultimate2.c
new file mode 100644
index 000000000..2e6125861
--- /dev/null
+++ b/src/protocol/ultimate2.c
@@ -0,0 +1,1734 @@
+/* Ultimate IRCD 2 functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ *
+ */
+
+#include "services.h"
+#include "pseudo.h"
+#include "ultimate2.h"
+
+IRCDVar myIrcd[] = {
+ {"UltimateIRCd 2.8.*", /* ircd name */
+ "+S", /* nickserv mode */
+ "+S", /* chanserv mode */
+ "+S", /* memoserv mode */
+ "+oS", /* hostserv mode */
+ "+iS", /* operserv mode */
+ "+S", /* botserv mode */
+ "+Sh", /* helpserv mode */
+ "+iS", /* Dev/Null mode */
+ "+iS", /* Global mode */
+ "+oS", /* nickserv alias mode */
+ "+oS", /* chanserv alias mode */
+ "+oS", /* memoserv alias mode */
+ "+ioS", /* hostserv alias mode */
+ "+ioS", /* operserv alias mode */
+ "+oS", /* botserv alias mode */
+ "+oS", /* helpserv alias mode */
+ "+iS", /* Dev/Null alias mode */
+ "+ioS", /* Global alias mode */
+ "+pS", /* Used by BotServ Bots */
+ 3, /* Chan Max Symbols */
+ "-ilmnpstxAIKORS", /* Modes to Remove */
+ "+ao", /* Channel Umode used by Botserv bots */
+ 1, /* SVSNICK */
+ 1, /* Vhost */
+ 0, /* Has Owner */
+ NULL, /* Mode to set for an owner */
+ NULL, /* Mode to unset for an owner */
+ NULL, /* Mode to set for chan admin */
+ NULL, /* Mode to remove for chan admin */
+ "+rd", /* Mode On Reg */
+ NULL, /* Mode on ID for Roots */
+ NULL, /* Mode on ID for Admins */
+ NULL, /* Mode on ID for Opers */
+ "-r+d", /* Mode on UnReg */
+ "-r+d", /* Mode on Nick Change */
+ 0, /* Supports SGlines */
+ 1, /* Supports SQlines */
+ 0, /* Supports SZlines */
+ 1, /* Supports Halfop +h */
+ 3, /* Number of server args */
+ 0, /* Join 2 Set */
+ 0, /* Join 2 Message */
+ 1, /* Has exceptions +e */
+ 0, /* TS Topic Forward */
+ 0, /* TS Topci Backward */
+ UMODE_p, /* Protected Umode */
+ 0, /* Has Admin */
+ 0, /* Chan SQlines */
+ 0, /* Quit on Kill */
+ 0, /* SVSMODE unban */
+ 0, /* Has Protect */
+ 1, /* Reverse */
+ 1, /* Chan Reg */
+ CMODE_r, /* Channel Mode */
+ 1, /* vidents */
+ 0, /* svshold */
+ 1, /* time stamp on mode */
+ 0, /* NICKIP */
+ 0, /* O:LINE */
+ 1, /* UMODE */
+ 0, /* VHOST ON NICK */
+ 1, /* Change RealName */
+ CMODE_K, /* No Knock */
+ CMODE_A, /* Admin Only */
+ DEFAULT_MLOCK, /* Default MLOCK */
+ UMODE_x, /* Vhost Mode */
+ 1, /* +f */
+ 1, /* +L */
+ CMODE_f,
+ CMODE_L,
+ 0,
+ 1, /* No Knock requires +i */
+ NULL, /* CAPAB Chan Modes */
+ 1, /* We support TOKENS */
+ 0, /* TOKENS are CASE inSensitive */
+ 0, /* TIME STAMPS are BASE64 */
+ 0, /* +I support */
+ 0, /* SJOIN ban char */
+ 0, /* SJOIN except char */
+ 0, /* SJOIN invite char */
+ 0, /* Can remove User Channel Modes with SVSMODE */
+ 0, /* Sglines are not enforced until user reconnects */
+ "x", /* vhost char */
+ 0, /* ts6 */
+ 1, /* support helper umode */
+ 0, /* p10 */
+ NULL, /* character set */
+ 0, /* reports sync state */
+ 0, /* CIDR channelbans */
+ }
+ ,
+ {NULL}
+};
+
+
+IRCDCAPAB myIrcdcap[] = {
+ {
+ CAPAB_NOQUIT, /* NOQUIT */
+ 0, /* TSMODE */
+ 0, /* UNCONNECT */
+ 0, /* NICKIP */
+ 0, /* SJOIN */
+ 0, /* ZIP */
+ 0, /* BURST */
+ 0, /* TS5 */
+ 0, /* TS3 */
+ 0, /* DKEY */
+ 0, /* PT4 */
+ 0, /* SCS */
+ 0, /* QS */
+ 0, /* UID */
+ CAPAB_KNOCK, /* KNOCK */
+ 0, /* CLIENT */
+ 0, /* IPV6 */
+ 0, /* SSJ5 */
+ 0, /* SN2 */
+ CAPAB_TOKEN, /* TOKEN */
+ 0, /* VHOST */
+ 0, /* SSJ3 */
+ 0, /* NICK2 */
+ 0, /* UMODE2 */
+ 0, /* VL */
+ 0, /* TLKEXT */
+ 0, /* DODKEY */
+ 0, /* DOZIP */
+ CAPAB_CHANMODE, /* CHANMODE */
+ 0, 0}
+};
+
+void ultiamte2_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) {
+
+ /* This looks better, much better than "add ? (do_add) : (do_remove)".
+ * At least this is readable without paying much attention :) -GD
+ */
+ if (add)
+ user->mode |= umodes[(int) *modes];
+ else
+ user->mode &= ~umodes[(int) *modes];
+
+ switch (*modes++) {
+ case '+':
+ add = 1;
+ break;
+ case '-':
+ add = 0;
+ break;
+ case 'a':
+ if (add && !is_services_oper(user)) {
+ common_svsmode(user, "-a", NULL);
+ user->mode &= ~UMODE_a;
+ }
+ break;
+ case 'P':
+ if (add && !is_services_admin(user)) {
+ common_svsmode(user, "-P", NULL);
+ user->mode &= ~UMODE_P;
+ }
+ break;
+ case 'R':
+ if (add && !is_services_root(user)) {
+ common_svsmode(user, "-R", NULL);
+ user->mode &= ~UMODE_R;
+ }
+ break;
+ case 'd':
+ if (ac == 0) {
+ break;
+ }
+
+ ac--;
+ av++;
+ user->svid = strtoul(*av, NULL, 0);
+ break;
+ case 'o':
+ if (add) {
+ opcnt++;
+ if (WallOper) {
+ anope_cmd_global(s_OperServ,
+ "\2%s\2 is now an IRC operator.",
+ user->nick);
+ }
+ display_news(user, NEWS_OPER);
+ if (is_services_oper(user)) {
+ common_svsmode(user, "+a", NULL);
+ user->mode |= UMODE_a;
+ }
+ if (is_services_admin(user)) {
+ common_svsmode(user, "+P", NULL);
+ user->mode |= UMODE_P;
+ }
+ if (is_services_root(user)) {
+ common_svsmode(user, "+R", NULL);
+ user->mode |= UMODE_R;
+ }
+ } else {
+ opcnt--;
+ }
+ break;
+ case 'r':
+ if (add && !nick_identified(user)) {
+ common_svsmode(user, "-r", NULL);
+ user->mode &= ~UMODE_r;
+ }
+ break;
+ case 'x':
+ update_host(user);
+ break;
+ }
+ }
+}
+
+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,
+ UMODE_P,
+ 0,
+ UMODE_R,
+ 0, 0, 0, 0, 0, 0, 0,
+ 0,
+ 0, 0, 0, 0, 0,
+ 0, UMODE_a, 0, 0, 0, 0, 0,
+ UMODE_g,
+ UMODE_h, UMODE_i, 0, 0, 0, 0, 0, UMODE_o,
+ UMODE_p,
+ 0, UMODE_r, 0, 0, 0, 0, UMODE_w,
+ UMODE_x,
+ 0,
+ 0,
+ 0, 0, 0, 0, 0
+};
+
+char myCsmodes[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,
+
+ '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
+};
+
+CMMode myCmmodes[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},
+ {add_exception, del_exception},
+ {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}
+};
+
+
+CBMode myCbmodes[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},
+ {CMODE_A, CBM_NO_USER_MLOCK, NULL, NULL},
+ {0}, /* B */
+ {0}, /* C */
+ {0}, /* D */
+ {0}, /* E */
+ {0}, /* F */
+ {0}, /* G */
+ {0}, /* H */
+ {CMODE_I, 0, NULL, NULL}, /* I */
+ {0}, /* J */
+ {CMODE_K, 0, NULL, NULL}, /* K */
+ {CMODE_L, 0, set_redirect, cs_set_redirect},
+ {0}, /* M */
+ {0}, /* N */
+ {CMODE_O, CBM_NO_USER_MLOCK, NULL, NULL},
+ {0}, /* P */
+ {0}, /* Q */
+ {CMODE_R, 0, NULL, NULL}, /* R */
+ {CMODE_S, 0, NULL, NULL}, /* S */
+ {0}, /* T */
+ {0}, /* U */
+ {0}, /* V */
+ {0}, /* W */
+ {0}, /* X */
+ {0}, /* Y */
+ {0}, /* Z */
+ {0}, {0}, {0}, {0}, {0}, {0},
+ {0}, /* a */
+ {0}, /* b */
+ {0}, /* c */
+ {0}, /* d */
+ {0}, /* e */
+ {CMODE_f, 0, set_flood, cs_set_flood},
+ {0}, /* g */
+ {0}, /* h */
+ {CMODE_i, 0, NULL, NULL}, /* i */
+ {0}, /* j */
+ {CMODE_k, 0, chan_set_key, cs_set_key},
+ {CMODE_l, CBM_MINUS_NO_ARG, set_limit, cs_set_limit},
+ {CMODE_m, 0, NULL, NULL}, /* m */
+ {CMODE_n, 0, NULL, NULL}, /* n */
+ {0}, /* o */
+ {CMODE_p, 0, NULL, NULL}, /* p */
+ {0}, /* q */
+ {CMODE_r, CBM_NO_MLOCK, NULL, NULL},
+ {CMODE_s, 0, NULL, NULL}, /* s */
+ {CMODE_t, 0, NULL, NULL}, /* t */
+ {0}, /* u */
+ {0}, /* v */
+ {0}, /* w */
+ {CMODE_x, 0, NULL, NULL}, /* x */
+ {0}, /* y */
+ {0}, /* z */
+ {0}, {0}, {0}, {0}
+};
+
+CBModeInfo myCbmodeinfos[] = {
+ {'f', CMODE_f, 0, get_flood, cs_get_flood},
+ {'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},
+ {'r', CMODE_r, 0, NULL, NULL},
+ {'s', CMODE_s, 0, NULL, NULL},
+ {'t', CMODE_t, 0, NULL, NULL},
+ {'x', CMODE_x, 0, NULL, NULL},
+ {'A', CMODE_A, 0, NULL, NULL},
+ {'I', CMODE_I, 0, NULL, NULL},
+ {'K', CMODE_K, 0, NULL, NULL},
+ {'L', CMODE_L, 0, get_redirect, cs_get_redirect},
+ {'O', CMODE_O, 0, NULL, NULL},
+ {'R', CMODE_R, 0, NULL, NULL},
+ {'S', CMODE_S, 0, NULL, NULL},
+ {0}
+};
+
+CUMode myCumodes[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},
+
+ {0}, /* a */
+ {0}, /* b */
+ {0}, /* c */
+ {0}, /* d */
+ {0}, /* e */
+ {0}, /* f */
+ {0}, /* g */
+ {CUS_HALFOP, 0, check_valid_op},
+ {0}, /* i */
+ {0}, /* j */
+ {0}, /* k */
+ {0}, /* l */
+ {0}, /* m */
+ {0}, /* n */
+ {CUS_OP, CUF_PROTECT_BOTSERV, check_valid_op},
+ {0}, /* p */
+ {0}, /* q */
+ {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}
+};
+
+
+int anope_event_setname(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 1)
+ return MOD_CONT;
+
+ u = finduser(source);
+ if (!u) {
+ if (debug) {
+ alog("debug: SETNAME for nonexistent user %s", source);
+ }
+ return MOD_CONT;
+ }
+
+ change_user_realname(u, av[0]);
+ return MOD_CONT;
+}
+
+int anope_event_chgname(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 2)
+ return MOD_CONT;
+
+ u = finduser(av[0]);
+ if (!u) {
+ if (debug) {
+ alog("debug: CHGNAME for nonexistent user %s", av[0]);
+ }
+ return MOD_CONT;
+ }
+
+ change_user_realname(u, av[1]);
+ return MOD_CONT;
+}
+
+int anope_event_setident(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 1)
+ return MOD_CONT;
+
+ u = finduser(source);
+ if (!u) {
+ if (debug) {
+ alog("debug: SETIDENT for nonexistent user %s", source);
+ }
+ return MOD_CONT;
+ }
+
+ change_user_username(u, av[0]);
+ return MOD_CONT;
+}
+
+int anope_event_chgident(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 2)
+ return MOD_CONT;
+
+ u = finduser(av[0]);
+ if (!u) {
+ if (debug) {
+ alog("debug: CHGIDENT for nonexistent user %s", av[0]);
+ }
+ return MOD_CONT;
+ }
+
+ change_user_username(u, av[1]);
+ return MOD_CONT;
+}
+
+int anope_event_sethost(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 1)
+ return MOD_CONT;
+
+ u = finduser(source);
+ if (!u) {
+ if (debug) {
+ alog("debug: SETHOST for nonexistent user %s", source);
+ }
+ return MOD_CONT;
+ }
+
+ change_user_host(u, av[0]);
+ return MOD_CONT;
+}
+
+int anope_event_nick(char *source, int ac, char **av)
+{
+ if (ac != 2) {
+ if (ac == 7) {
+ do_nick(source, av[0], av[3], av[4], av[5], av[6],
+ strtoul(av[2], NULL, 10), 0, 0, NULL, NULL);
+ } else {
+ do_nick(source, av[0], av[3], av[4], av[5], av[7],
+ strtoul(av[2], NULL, 10), strtoul(av[6], NULL, 0), 0,
+ NULL, NULL);
+ }
+ } else {
+ do_nick(source, av[0], NULL, NULL, NULL, NULL,
+ strtoul(av[1], NULL, 10), 0, 0, NULL, NULL);
+ }
+ return MOD_CONT;
+}
+
+int anope_event_chghost(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 2)
+ return MOD_CONT;
+
+ u = finduser(av[0]);
+ if (!u) {
+ if (debug) {
+ alog("debug: CHGHOST for nonexistent user %s", av[0]);
+ }
+ return MOD_CONT;
+ }
+
+ change_user_host(u, av[1]);
+ return MOD_CONT;
+}
+
+int anope_event_436(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+
+ m_nickcoll(av[0]);
+ return MOD_CONT;
+}
+
+
+/* *INDENT-OFF* */
+void moduleAddIRCDMsgs(void) {
+ Message *m;
+
+ updateProtectDetails("PROTECT","PROTECTME","protect","deprotect","AUTOPROTECT","+a","-a");
+
+ m = createMessage("401", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("436", anope_event_436); addCoreMessage(IRCD,m);
+ m = createMessage("402", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("AWAY", anope_event_away); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("6", anope_event_away); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("INVITE", anope_event_null); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("*", anope_event_null); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("JOIN", anope_event_join); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("C", anope_event_join); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("KICK", anope_event_kick); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("H", anope_event_kick); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("KILL", anope_event_kill); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage(".", anope_event_kill); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("MODE", anope_event_mode); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("G", anope_event_mode); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("MOTD", anope_event_motd); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("F", anope_event_motd); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("NICK", anope_event_nick); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("&", anope_event_nick); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("NOTICE", anope_event_notice); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("B", anope_event_notice); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("PART", anope_event_part); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("D", anope_event_part); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("PASS", anope_event_pass); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("<", anope_event_pass); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("PING", anope_event_ping); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("9", anope_event_ping); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("PRIVMSG", anope_event_privmsg); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("!", anope_event_privmsg); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("QUIT", anope_event_quit); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage(",", anope_event_quit); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("SERVER", anope_event_server); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("'", anope_event_server); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("SQUIT", anope_event_squit); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("-", anope_event_squit); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("TOPIC", anope_event_topic); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage(")", anope_event_topic); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("USER", anope_event_null); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("%", anope_event_null); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("WALLOPS", anope_event_null); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("=", anope_event_null); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("WHOIS", anope_event_whois); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("#", anope_event_whois); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("AKILL", anope_event_null); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("V", anope_event_null); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("GLOBOPS", anope_event_null); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("]", anope_event_null); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("GNOTICE", anope_event_null); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("Z", anope_event_null); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("GOPER", anope_event_null); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("[", anope_event_null); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("RAKILL", anope_event_null); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("Y", anope_event_null); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("SILENCE", anope_event_null); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("U", anope_event_null); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("SVSKILL", anope_event_null); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("h", anope_event_null); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("SVSMODE", anope_event_mode); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("n", anope_event_mode); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("SVSNICK", anope_event_null); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("e", anope_event_null); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("SVSNOOP", anope_event_null); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("f", anope_event_null); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("SQLINE", anope_event_sqline); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("c", anope_event_sqline); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("UNSQLINE", anope_event_null); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("d", anope_event_null); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("PROTOCTL", anope_event_capab); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("_", anope_event_capab); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("CHGHOST", anope_event_chghost); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("!<", anope_event_chghost); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("CHGIDENT", anope_event_chgident); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("!=", anope_event_chgident); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("NETINFO", anope_event_netinfo); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("u", anope_event_netinfo); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("SNETINFO", anope_event_snetinfo); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("!1", anope_event_snetinfo); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("SETHOST", anope_event_sethost); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("!8", anope_event_sethost); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("SETIDENT", anope_event_setident); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("!9", anope_event_setident); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("SETNAME", anope_event_setname); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("!;", anope_event_setname); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("VCTRL", anope_event_vctrl); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("!I", anope_event_vctrl); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("REHASH", anope_event_rehash); addCoreMessage(IRCD,m);
+ m = createMessage("ADMIN", anope_event_admin); addCoreMessage(IRCD,m);
+ m = createMessage("CREDITS", anope_event_credits); addCoreMessage(IRCD,m);
+ m = createMessage("ERROR", anope_event_error); addCoreMessage(IRCD,m);
+
+
+}
+
+/* *INDENT-ON* */
+
+/* Event: PROTOCTL */
+int anope_event_capab(char *source, int ac, char **av)
+{
+ capab_parse(ac, av);
+ return MOD_CONT;
+}
+
+void ultimate2_cmd_sqline(char *mask, char *reason)
+{
+ send_cmd(NULL, "SQLINE %s :%s", mask, reason);
+}
+
+void ultimate2_cmd_svsnoop(char *server, int set)
+{
+ send_cmd(NULL, "SVSNOOP %s %s", server, (set ? "+" : "-"));
+}
+
+void ultimate2_cmd_svsadmin(char *server, int set)
+{
+ ultimate2_cmd_svsnoop(server, set);
+}
+
+void ultimate2_cmd_remove_akill(char *user, char *host)
+{
+ send_cmd(NULL, "RAKILL %s %s", host, user);
+}
+
+
+void ultimate2_cmd_topic(char *whosets, char *chan, char *whosetit,
+ char *topic, time_t when)
+{
+ send_cmd(whosets, "TOPIC %s %s %lu :%s", chan, whosetit,
+ (unsigned long int) when, topic);
+}
+
+void ultimate2_cmd_vhost_off(User * u)
+{
+ /* does not support removing vhosting */
+}
+
+void ultimate2_cmd_vhost_on(char *nick, char *vIdent, char *vhost)
+{
+ 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);
+}
+
+void ultimate2_cmd_unsqline(char *user)
+{
+ send_cmd(NULL, "UNSQLINE %s", user);
+}
+
+void ultimate2_cmd_join(char *user, char *channel, time_t chantime)
+{
+ send_cmd(user, "JOIN %s", channel);
+}
+
+void ultimate2_cmd_akill(char *user, char *host, char *who, time_t when,
+ time_t expires, char *reason)
+{
+ send_cmd(NULL, "AKILL %s %s :%s", host, user, reason);
+}
+
+void ultimate2_cmd_svskill(char *source, char *user, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(source, "KILL %s :%s", user, buf);
+}
+
+void ultimate2_cmd_svsmode(User * u, int ac, char **av)
+{
+ send_cmd(ServerName, "SVSMODE %s %s%s%s", u->nick, av[0],
+ (ac == 2 ? " " : ""), (ac == 2 ? av[1] : ""));
+}
+
+void ultimate2_cmd_capab()
+{
+ if (UseTokens) {
+ send_cmd(NULL, "PROTOCTL NOQUIT TOKEN SILENCE KNOCK");
+ } else {
+ send_cmd(NULL, "PROTOCTL NOQUIT SILENCE KNOCK");
+ }
+}
+
+
+/* PASS */
+void ultimate2_cmd_pass(char *pass)
+{
+ send_cmd(NULL, "PASS :%s", pass);
+}
+
+/* SERVER name hop descript */
+void ultimate2_cmd_server(char *servname, int hop, char *descript)
+{
+ send_cmd(NULL, "SERVER %s %d :%s", servname, hop, descript);
+}
+
+/* PONG */
+void ultimate2_cmd_pong(char *servname, char *who)
+{
+ send_cmd(servname, "PONG %s", who);
+}
+
+void ultimate2_cmd_connect(int servernum)
+{
+ me_server =
+ new_server(NULL, ServerName, ServerDesc, SERVER_ISME, NULL);
+
+ ultimate2_cmd_capab();
+ if (servernum == 1)
+ ultimate2_cmd_pass(RemotePassword);
+ if (servernum == 2)
+ ultimate2_cmd_pass(RemotePassword2);
+ if (servernum == 3)
+ ultimate2_cmd_pass(RemotePassword3);
+ ultimate2_cmd_server(ServerName, 1, ServerDesc);
+}
+
+/* CHGHOST */
+void ultimate2_cmd_chghost(char *nick, char *vhost)
+{
+ if (!nick || !vhost) {
+ return;
+ }
+ send_cmd(ServerName, "CHGHOST %s %s", nick, vhost);
+}
+
+/* CHGIDENT */
+void ultimate2_cmd_chgident(char *nick, char *vIdent)
+{
+ if (!nick || !vIdent) {
+ return;
+ }
+ send_cmd(ServerName, "CHGIDENT %s %s", nick, vIdent);
+}
+
+/* INVITE */
+void ultimate2_cmd_invite(char *source, char *chan, char *nick)
+{
+ if (!source || !chan || !nick) {
+ return;
+ }
+
+ send_cmd(source, "INVITE %s %s", nick, chan);
+}
+
+/* PART */
+void ultimate2_cmd_part(char *nick, char *chan, char *buf)
+{
+ if (!nick || !chan) {
+ return;
+ }
+
+ if (buf) {
+ send_cmd(nick, "PART %s :%s", chan, buf);
+ } else {
+ send_cmd(nick, "PART %s", chan);
+ }
+}
+
+/* 391 */
+void ultimate2_cmd_391(char *source, char *timestr)
+{
+ if (!timestr) {
+ return;
+ }
+ send_cmd(NULL, "391 :%s %s :%s", source, ServerName, timestr);
+}
+
+/* 250 */
+void ultimate2_cmd_250(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "250 %s", buf);
+}
+
+/* 307 */
+void ultimate2_cmd_307(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "307 %s", buf);
+}
+
+/* 311 */
+void ultimate2_cmd_311(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "311 %s", buf);
+}
+
+/* 312 */
+void ultimate2_cmd_312(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "312 %s", buf);
+}
+
+/* 317 */
+void ultimate2_cmd_317(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "317 %s", buf);
+}
+
+/* 219 */
+void ultimate2_cmd_219(char *source, char *letter)
+{
+ if (!source) {
+ return;
+ }
+
+ if (letter) {
+ send_cmd(NULL, "219 %s %c :End of /STATS report.", source,
+ *letter);
+ } else {
+ send_cmd(NULL, "219 %s l :End of /STATS report.", source);
+ }
+}
+
+/* 401 */
+void ultimate2_cmd_401(char *source, char *who)
+{
+ if (!source || !who) {
+ return;
+ }
+ send_cmd(ServerName, "401 %s %s :No such service.", source, who);
+}
+
+/* 318 */
+void ultimate2_cmd_318(char *source, char *who)
+{
+ if (!source || !who) {
+ return;
+ }
+
+ send_cmd(ServerName, "318 %s %s :End of /WHOIS list.", source, who);
+}
+
+/* 242 */
+void ultimate2_cmd_242(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "242 %s", buf);
+}
+
+/* 243 */
+void ultimate2_cmd_243(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "243 %s", buf);
+}
+
+/* 211 */
+void ultimate2_cmd_211(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "211 %s", buf);
+}
+
+/* GLOBOPS */
+void ultimate2_cmd_global(char *source, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(source ? source : ServerName, "GLOBOPS :%s", buf);
+}
+
+/* SQUIT */
+void ultimate2_cmd_squit(char *servname, char *message)
+{
+ if (!servname || !message) {
+ return;
+ }
+
+ send_cmd(NULL, "SQUIT %s :%s", servname, message);
+}
+
+/* SVSO */
+void ultimate2_cmd_svso(char *source, char *nick, char *flag)
+{
+ if (!source || !nick || !flag) {
+ return;
+ }
+
+ send_cmd(source, "SVSO %s %s", nick, flag);
+}
+
+/* NICK <newnick> */
+void ultimate2_cmd_chg_nick(char *oldnick, char *newnick)
+{
+ if (!oldnick || !newnick) {
+ return;
+ }
+
+ send_cmd(oldnick, "NICK %s", newnick);
+}
+
+/* SVSNICK */
+void ultimate2_cmd_svsnick(char *source, char *guest, time_t when)
+{
+ if (!source || !guest) {
+ return;
+ }
+ send_cmd(NULL, "SVSNICK %s %s :%ld", source, guest, (long int) when);
+}
+
+/* Events */
+
+int anope_event_ping(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+ ultimate2_cmd_pong(ac > 1 ? av[1] : ServerName, av[0]);
+ return MOD_CONT;
+}
+
+int anope_event_away(char *source, int ac, char **av)
+{
+ if (!source) {
+ return MOD_CONT;
+ }
+ m_away(source, (ac ? av[0] : NULL));
+ return MOD_CONT;
+}
+
+int anope_event_topic(char *source, int ac, char **av)
+{
+ if (ac != 4)
+ return MOD_CONT;
+ do_topic(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_squit(char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+ do_squit(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_quit(char *source, int ac, char **av)
+{
+ if (ac != 1)
+ return MOD_CONT;
+ do_quit(source, ac, av);
+ return MOD_CONT;
+}
+
+
+int anope_event_mode(char *source, int ac, char **av)
+{
+ if (ac < 2)
+ return MOD_CONT;
+
+ if (*av[0] == '#' || *av[0] == '&') {
+ do_cmode(source, ac, av);
+ } else {
+ do_umode(source, ac, av);
+ }
+ return MOD_CONT;
+}
+
+
+int anope_event_kill(char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+
+ m_kill(av[0], av[1]);
+ return MOD_CONT;
+}
+
+int anope_event_kick(char *source, int ac, char **av)
+{
+ if (ac != 3)
+ return MOD_CONT;
+ do_kick(source, ac, av);
+ return MOD_CONT;
+}
+
+
+int anope_event_join(char *source, int ac, char **av)
+{
+ if (ac != 1)
+ return MOD_CONT;
+ do_join(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_motd(char *source, int ac, char **av)
+{
+ if (!source) {
+ return MOD_CONT;
+ }
+
+ m_motd(source);
+ return MOD_CONT;
+}
+
+/* EVENT: SERVER */
+int anope_event_server(char *source, int ac, char **av)
+{
+ if (!stricmp(av[1], "1")) {
+ uplink = sstrdup(av[0]);
+ }
+ do_server(source, av[0], av[1], av[2], NULL);
+ return MOD_CONT;
+}
+
+
+int anope_event_privmsg(char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+ m_privmsg(source, av[0], av[1]);
+ return MOD_CONT;
+}
+
+int anope_event_part(char *source, int ac, char **av)
+{
+ if (ac < 1 || ac > 2)
+ return MOD_CONT;
+ do_part(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_whois(char *source, int ac, char **av)
+{
+ if (source && ac >= 1) {
+ m_whois(source, av[0]);
+ }
+ return MOD_CONT;
+}
+
+void ultimate2_cmd_kick(char *source, char *chan, char *user, char *buf)
+{
+ if (buf) {
+ send_cmd(source, "KICK %s %s :%s", chan, user, buf);
+ } else {
+ send_cmd(source, "KICK %s %s", chan, user);
+ }
+}
+
+void ultimate2_cmd_notice_ops(char *source, char *dest, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "NOTICE @%s :%s", dest, buf);
+}
+
+
+void ultimate2_cmd_notice(char *source, char *dest, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ if (NSDefFlags & NI_MSG) {
+ ultimate2_cmd_privmsg2(source, dest, buf);
+ } else {
+ send_cmd(source, "NOTICE %s :%s", dest, buf);
+ }
+}
+
+void ultimate2_cmd_notice2(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "NOTICE %s :%s", dest, msg);
+}
+
+void ultimate2_cmd_privmsg(char *source, char *dest, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(source, "PRIVMSG %s :%s", dest, buf);
+}
+
+void ultimate2_cmd_privmsg2(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "PRIVMSG %s :%s", dest, msg);
+}
+
+void ultimate2_cmd_serv_notice(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "NOTICE $%s :%s", dest, msg);
+}
+
+void ultimate2_cmd_serv_privmsg(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "PRIVMSG $%s :%s", dest, msg);
+}
+
+void ultimate2_cmd_nick(char *nick, char *name, char *mode)
+{
+ EnforceQlinedNick(nick, NULL);
+ send_cmd(NULL, "NICK %s 1 %ld %s %s %s 0 :%s", nick,
+ (long int) time(NULL), ServiceUser, ServiceHost, ServerName,
+ name);
+ anope_cmd_mode(nick, nick, "%s", mode);
+ ultimate2_cmd_sqline(nick, "Reserved for services");
+}
+
+void ultimate2_cmd_351(char *source)
+{
+ send_cmd(ServerName, "351 %s Anope-%s %s :%s - %s (%s) -- %s",
+ source, version_number, ServerName, ircd->name, version_flags,
+ EncModule, version_build);
+}
+
+/* QUIT */
+void ultimate2_cmd_quit(char *source, char *buf)
+{
+ if (buf) {
+ send_cmd(source, "QUIT :%s", buf);
+ } else {
+ send_cmd(source, "QUIT");
+ }
+}
+
+void ultimate2_cmd_mode(char *source, char *dest, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(source, "MODE %s %s", dest, buf);
+}
+
+void ultimate2_cmd_bot_nick(char *nick, char *user, char *host, char *real,
+ char *modes)
+{
+ EnforceQlinedNick(nick, s_BotServ);
+ send_cmd(NULL, "NICK %s 1 %ld %s %s %s 0 :%s", nick,
+ (long int) time(NULL), user, host, ServerName, real);
+ anope_cmd_mode(nick, nick, "%s", modes);
+ ultimate2_cmd_sqline(nick, "Reserved for services");
+}
+
+void ultimate2_cmd_372(char *source, char *msg)
+{
+ send_cmd(ServerName, "372 %s :- %s", source, msg);
+}
+
+void ultimate2_cmd_372_error(char *source)
+{
+ send_cmd(ServerName, "422 %s :- MOTD file not found! Please "
+ "contact your IRC administrator.", source);
+}
+
+void ultimate2_cmd_375(char *source)
+{
+ send_cmd(ServerName, "375 %s :- %s Message of the Day",
+ source, ServerName);
+}
+
+void ultimate2_cmd_376(char *source)
+{
+ send_cmd(ServerName, "376 %s :End of /MOTD command.", source);
+}
+
+void ultimate2_cmd_bot_chan_mode(char *nick, char *chan)
+{
+ anope_cmd_mode(nick, chan, "%s %s %s", ircd->botchanumode, nick, nick);
+}
+
+/* SVSHOLD - set */
+void ultimate2_cmd_svshold(char *nick)
+{
+ /* Not supported by this IRCD */
+}
+
+/* SVSHOLD - release */
+void ultimate2_cmd_release_svshold(char *nick)
+{
+ /* Not Supported by this IRCD */
+}
+
+/* UNSGLINE */
+void ultimate2_cmd_unsgline(char *mask)
+{
+ /* Not Supported by this IRCD */
+}
+
+/* UNSZLINE */
+void ultimate2_cmd_unszline(char *mask)
+{
+ /* Not Supported by this IRCD */
+}
+
+/* SZLINE */
+void ultimate2_cmd_szline(char *mask, char *reason, char *whom)
+{
+ /* Not Supported by this IRCD */
+}
+
+/* SGLINE */
+void ultimate2_cmd_sgline(char *mask, char *reason)
+{
+ /* Not Supported by this IRCD */
+}
+
+void ultimate2_cmd_guest_nick(char *nick, char *user, char *host,
+ char *real, char *modes)
+{
+ send_cmd(NULL, "NICK %s 1 %ld %s %s %s 0 :%s", nick,
+ (long int) time(NULL), user, host, ServerName, real);
+ anope_cmd_mode(nick, nick, "MODE %s %s", modes);
+}
+
+
+void ultimate2_cmd_unban(char *name, char *nick)
+{
+ /* Not Supported by this IRCD */
+}
+
+/* SVSMODE channel modes */
+
+void ultimate2_cmd_svsmode_chan(char *name, char *mode, char *nick)
+{
+ /* Not Supported by this IRCD */
+}
+
+/* SVSMODE +d */
+/* sent if svid is something weird */
+void ultimate2_cmd_svid_umode(char *nick, time_t ts)
+{
+ send_cmd(ServerName, "SVSMODE %s +d 1", nick);
+}
+
+/* SVSMODE +d */
+/* nc_change was = 1, and there is no na->status */
+void ultimate2_cmd_nc_change(User * u)
+{
+ common_svsmode(u, "-r+d", "1");
+}
+
+/* SVSMODE +r */
+void ultimate2_cmd_svid_umode2(User * u, char *ts)
+{
+ if (u->svid != u->timestamp) {
+ common_svsmode(u, "+rd", ts);
+ } else {
+ common_svsmode(u, "+r", NULL);
+ }
+}
+
+void ultimate2_cmd_svid_umode3(User * u, char *ts)
+{
+ /* not used */
+}
+
+int anope_event_notice(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_pass(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_vctrl(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_netinfo(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_snetinfo(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_sqline(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+/*
+** svsjoin
+**
+** parv[0] - sender
+** parv[1] - nick to make join
+** parv[2] - channel(s) to join
+*/
+void ultimate2_cmd_svsjoin(char *source, char *nick, char *chan, char *param)
+{
+ send_cmd(source, "SVSJOIN %s %s", nick, chan);
+}
+
+/*
+** svspart
+**
+** parv[0] - sender
+** parv[1] - nick to make part
+** parv[2] - channel(s) to part
+*/
+void ultimate2_cmd_svspart(char *source, char *nick, char *chan)
+{
+ send_cmd(source, "SVSPART %s %s", nick, chan);
+}
+
+void ultimate2_cmd_swhois(char *source, char *who, char *mask)
+{
+ /* not supported */
+}
+
+void ultimate2_cmd_eob()
+{
+ /* not supported */
+}
+
+int anope_event_rehash(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_credits(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_admin(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int ultiamte2_flood_mode_check(char *value)
+{
+ char *dp, *end;
+
+ if (value && *value != ':'
+ && (strtoul((*value == '*' ? value + 1 : value), &dp, 10) > 0)
+ && (*dp == ':') && (*(++dp) != 0) && (strtoul(dp, &end, 10) > 0)
+ && (*end == 0)) {
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
+int anope_event_error(char *source, int ac, char **av)
+{
+ if (av[0]) {
+ if (debug) {
+ alog("debug: %s", av[0]);
+ }
+ }
+ return MOD_CONT;
+}
+
+void ultimate2_cmd_jupe(char *jserver, char *who, char *reason)
+{
+ char rbuf[256];
+
+ snprintf(rbuf, sizeof(rbuf), "Juped by %s%s%s", who,
+ reason ? ": " : "", reason ? reason : "");
+
+ if (findserver(servlist, jserver))
+ ultimate2_cmd_squit(jserver, rbuf);
+ ultimate2_cmd_server(jserver, 2, rbuf);
+ new_server(me_server, jserver, rbuf, SERVER_JUPED, NULL);
+}
+
+/* GLOBOPS - to handle old WALLOPS */
+void ultimate2_cmd_global_legacy(char *source, char *fmt)
+{
+ send_cmd(source ? source : ServerName, "GLOBOPS :%s", fmt);
+}
+
+/*
+ 1 = valid nick
+ 0 = nick is in valid
+*/
+int ultiamte2_valid_nick(char *nick)
+{
+ /* no hard coded invalid nicks */
+ return 1;
+}
+
+/*
+ 1 = valid chan
+ 0 = chan is in valid
+*/
+int ultiamte2_valid_chan(char *chan)
+{
+ /* no hard coded invalid chans */
+ return 1;
+}
+
+
+void ultimate2_cmd_ctcp(char *source, char *dest, char *buf)
+{
+ char *s;
+
+ if (!buf) {
+ return;
+ } else {
+ s = normalizeBuffer(buf);
+ }
+
+ send_cmd(source, "NOTICE %s :\1%s \1", dest, s);
+ free(s);
+}
+
+
+/**
+ * Tell anope which function we want to perform each task inside of anope.
+ * These prototypes must match what anope expects.
+ **/
+void moduleAddAnopeCmds()
+{
+ pmodule_cmd_svsnoop(ultimate2_cmd_svsnoop);
+ pmodule_cmd_remove_akill(ultimate2_cmd_remove_akill);
+ pmodule_cmd_topic(ultimate2_cmd_topic);
+ pmodule_cmd_vhost_off(ultimate2_cmd_vhost_off);
+ pmodule_cmd_akill(ultimate2_cmd_akill);
+ pmodule_cmd_svskill(ultimate2_cmd_svskill);
+ pmodule_cmd_svsmode(ultimate2_cmd_svsmode);
+ pmodule_cmd_372(ultimate2_cmd_372);
+ pmodule_cmd_372_error(ultimate2_cmd_372_error);
+ pmodule_cmd_375(ultimate2_cmd_375);
+ pmodule_cmd_376(ultimate2_cmd_376);
+ pmodule_cmd_nick(ultimate2_cmd_nick);
+ pmodule_cmd_guest_nick(ultimate2_cmd_guest_nick);
+ pmodule_cmd_mode(ultimate2_cmd_mode);
+ pmodule_cmd_bot_nick(ultimate2_cmd_bot_nick);
+ pmodule_cmd_kick(ultimate2_cmd_kick);
+ pmodule_cmd_notice_ops(ultimate2_cmd_notice_ops);
+ pmodule_cmd_notice(ultimate2_cmd_notice);
+ pmodule_cmd_notice2(ultimate2_cmd_notice2);
+ pmodule_cmd_privmsg(ultimate2_cmd_privmsg);
+ pmodule_cmd_privmsg2(ultimate2_cmd_privmsg2);
+ pmodule_cmd_serv_notice(ultimate2_cmd_serv_notice);
+ pmodule_cmd_serv_privmsg(ultimate2_cmd_serv_privmsg);
+ pmodule_cmd_bot_chan_mode(ultimate2_cmd_bot_chan_mode);
+ pmodule_cmd_351(ultimate2_cmd_351);
+ pmodule_cmd_quit(ultimate2_cmd_quit);
+ pmodule_cmd_pong(ultimate2_cmd_pong);
+ pmodule_cmd_join(ultimate2_cmd_join);
+ pmodule_cmd_unsqline(ultimate2_cmd_unsqline);
+ pmodule_cmd_invite(ultimate2_cmd_invite);
+ pmodule_cmd_part(ultimate2_cmd_part);
+ pmodule_cmd_391(ultimate2_cmd_391);
+ pmodule_cmd_250(ultimate2_cmd_250);
+ pmodule_cmd_307(ultimate2_cmd_307);
+ pmodule_cmd_311(ultimate2_cmd_311);
+ pmodule_cmd_312(ultimate2_cmd_312);
+ pmodule_cmd_317(ultimate2_cmd_317);
+ pmodule_cmd_219(ultimate2_cmd_219);
+ pmodule_cmd_401(ultimate2_cmd_401);
+ pmodule_cmd_318(ultimate2_cmd_318);
+ pmodule_cmd_242(ultimate2_cmd_242);
+ pmodule_cmd_243(ultimate2_cmd_243);
+ pmodule_cmd_211(ultimate2_cmd_211);
+ pmodule_cmd_global(ultimate2_cmd_global);
+ pmodule_cmd_global_legacy(ultimate2_cmd_global_legacy);
+ pmodule_cmd_sqline(ultimate2_cmd_sqline);
+ pmodule_cmd_squit(ultimate2_cmd_squit);
+ pmodule_cmd_svso(ultimate2_cmd_svso);
+ pmodule_cmd_chg_nick(ultimate2_cmd_chg_nick);
+ pmodule_cmd_svsnick(ultimate2_cmd_svsnick);
+ pmodule_cmd_vhost_on(ultimate2_cmd_vhost_on);
+ pmodule_cmd_connect(ultimate2_cmd_connect);
+ pmodule_cmd_svshold(ultimate2_cmd_svshold);
+ pmodule_cmd_release_svshold(ultimate2_cmd_release_svshold);
+ pmodule_cmd_unsgline(ultimate2_cmd_unsgline);
+ pmodule_cmd_unszline(ultimate2_cmd_unszline);
+ pmodule_cmd_szline(ultimate2_cmd_szline);
+ pmodule_cmd_sgline(ultimate2_cmd_sgline);
+ pmodule_cmd_unban(ultimate2_cmd_unban);
+ pmodule_cmd_svsmode_chan(ultimate2_cmd_svsmode_chan);
+ pmodule_cmd_svid_umode(ultimate2_cmd_svid_umode);
+ pmodule_cmd_nc_change(ultimate2_cmd_nc_change);
+ pmodule_cmd_svid_umode2(ultimate2_cmd_svid_umode2);
+ pmodule_cmd_svid_umode3(ultimate2_cmd_svid_umode3);
+ pmodule_cmd_svsjoin(ultimate2_cmd_svsjoin);
+ pmodule_cmd_svspart(ultimate2_cmd_svspart);
+ pmodule_cmd_swhois(ultimate2_cmd_swhois);
+ pmodule_cmd_eob(ultimate2_cmd_eob);
+ pmodule_flood_mode_check(ultiamte2_flood_mode_check);
+ pmodule_cmd_jupe(ultimate2_cmd_jupe);
+ pmodule_valid_nick(ultiamte2_valid_nick);
+ pmodule_valid_chan(ultiamte2_valid_chan);
+ pmodule_cmd_ctcp(ultimate2_cmd_ctcp);
+ pmodule_set_umode(ultiamte2_set_umode);
+}
+
+/**
+ * Now tell anope how to use us.
+ **/
+int AnopeInit(int argc, char **argv)
+{
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(PROTOCOL);
+
+ pmodule_ircd_version("UltimateIRCd 2.8.2+");
+ pmodule_ircd_cap(myIrcdcap);
+ pmodule_ircd_var(myIrcd);
+ pmodule_ircd_cbmodeinfos(myCbmodeinfos);
+ pmodule_ircd_cumodes(myCumodes);
+ pmodule_ircd_flood_mode_char_set("+f");
+ pmodule_ircd_flood_mode_char_remove("-f");
+ pmodule_ircd_cbmodes(myCbmodes);
+ pmodule_ircd_cmmodes(myCmmodes);
+ pmodule_ircd_csmodes(myCsmodes);
+ pmodule_ircd_useTSMode(0);
+
+ /** Deal with modes anope _needs_ to know **/
+ pmodule_invis_umode(UMODE_i);
+ pmodule_oper_umode(UMODE_o);
+ pmodule_invite_cmode(CMODE_i);
+ pmodule_secret_cmode(CMODE_s);
+ pmodule_private_cmode(CMODE_p);
+ pmodule_key_mode(CMODE_k);
+ pmodule_limit_mode(CMODE_l);
+
+ moduleAddAnopeCmds();
+ moduleAddIRCDMsgs();
+
+ return MOD_CONT;
+}
diff --git a/src/protocol/ultimate2.h b/src/protocol/ultimate2.h
new file mode 100644
index 000000000..221e69911
--- /dev/null
+++ b/src/protocol/ultimate2.h
@@ -0,0 +1,120 @@
+/* Ultimate IRCD 2 functions
+ *
+ * (C) 2003-2008 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.
+ *
+ *
+ */
+
+#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
+#define UMODE_p 0x04000000
+#define UMODE_R 0x08000000
+#define UMODE_P 0x20000000
+#define UMODE_g 0x80000000
+#define UMODE_x 0x40000000
+
+
+#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
+#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
+#define CMODE_R 0x00000100 /* Only identified users can join */
+#define CMODE_r 0x00000200 /* Set for all registered channels */
+
+#define DEFAULT_MLOCK CMODE_n | CMODE_t | CMODE_r
+
+void ultimate2_set_umode(User * user, int ac, char **av);
+void ultimate2_cmd_svsnoop(char *server, int set);
+void ultimate2_cmd_remove_akill(char *user, char *host);
+void ultimate2_cmd_topic(char *whosets, char *chan, char *whosetit, char *topic, time_t when);
+void ultimate2_cmd_vhost_off(User * u);
+void ultimate2_cmd_akill(char *user, char *host, char *who, time_t when,time_t expires, char *reason);
+void ultimate2_cmd_svskill(char *source, char *user, char *buf);
+void ultimate2_cmd_svsmode(User * u, int ac, char **av);
+void ultimate2_cmd_372(char *source, char *msg);
+void ultimate2_cmd_372_error(char *source);
+void ultimate2_cmd_375(char *source);
+void ultimate2_cmd_376(char *source);
+void ultimate2_cmd_nick(char *nick, char *name, char *modes);
+void ultimate2_cmd_guest_nick(char *nick, char *user, char *host, char *real, char *modes);
+void ultimate2_cmd_mode(char *source, char *dest, char *buf);
+void ultimate2_cmd_bot_nick(char *nick, char *user, char *host, char *real, char *modes);
+void ultimate2_cmd_kick(char *source, char *chan, char *user, char *buf);
+void ultimate2_cmd_notice_ops(char *source, char *dest, char *buf);
+void ultimate2_cmd_notice(char *source, char *dest, char *buf);
+void ultimate2_cmd_notice2(char *source, char *dest, char *msg);
+void ultimate2_cmd_privmsg(char *source, char *dest, char *buf);
+void ultimate2_cmd_privmsg2(char *source, char *dest, char *msg);
+void ultimate2_cmd_serv_notice(char *source, char *dest, char *msg);
+void ultimate2_cmd_serv_privmsg(char *source, char *dest, char *msg);
+void ultimate2_cmd_bot_chan_mode(char *nick, char *chan);
+void ultimate2_cmd_351(char *source);
+void ultimate2_cmd_quit(char *source, char *buf);
+void ultimate2_cmd_pong(char *servname, char *who);
+void ultimate2_cmd_join(char *user, char *channel, time_t chantime);
+void ultimate2_cmd_unsqline(char *user);
+void ultimate2_cmd_invite(char *source, char *chan, char *nick);
+void ultimate2_cmd_part(char *nick, char *chan, char *buf);
+void ultimate2_cmd_391(char *source, char *timestr);
+void ultimate2_cmd_250(char *buf);
+void ultimate2_cmd_307(char *buf);
+void ultimate2_cmd_311(char *buf);
+void ultimate2_cmd_312(char *buf);
+void ultimate2_cmd_317(char *buf);
+void ultimate2_cmd_219(char *source, char *letter);
+void ultimate2_cmd_401(char *source, char *who);
+void ultimate2_cmd_318(char *source, char *who);
+void ultimate2_cmd_242(char *buf);
+void ultimate2_cmd_243(char *buf);
+void ultimate2_cmd_211(char *buf);
+void ultimate2_cmd_global(char *source, char *buf);
+void ultimate2_cmd_global_legacy(char *source, char *fmt);
+void ultimate2_cmd_sqline(char *mask, char *reason);
+void ultimate2_cmd_squit(char *servname, char *message);
+void ultimate2_cmd_svso(char *source, char *nick, char *flag);
+void ultimate2_cmd_chg_nick(char *oldnick, char *newnick);
+void ultimate2_cmd_svsnick(char *source, char *guest, time_t when);
+void ultimate2_cmd_vhost_on(char *nick, char *vIdent, char *vhost);
+void ultimate2_cmd_connect(int servernum);
+void ultimate2_cmd_svshold(char *nick);
+void ultimate2_cmd_release_svshold(char *nick);
+void ultimate2_cmd_unsgline(char *mask);
+void ultimate2_cmd_unszline(char *mask);
+void ultimate2_cmd_szline(char *mask, char *reason, char *whom);
+void ultimate2_cmd_sgline(char *mask, char *reason);
+void ultimate2_cmd_unban(char *name, char *nick);
+void ultimate2_cmd_svsmode_chan(char *name, char *mode, char *nick);
+void ultimate2_cmd_svid_umode(char *nick, time_t ts);
+void ultimate2_cmd_nc_change(User * u);
+void ultimate2_cmd_svid_umode2(User * u, char *ts);
+void ultimate2_cmd_svid_umode3(User * u, char *ts);
+void ultimate2_cmd_eob();
+int ultimate2_flood_mode_check(char *value);
+void ultimate2_cmd_jupe(char *jserver, char *who, char *reason);
+int ultimate2_valid_nick(char *nick);
+void ultimate2_cmd_ctcp(char *source, char *dest, char *buf);
+
+
diff --git a/src/protocol/ultimate3.c b/src/protocol/ultimate3.c
new file mode 100644
index 000000000..16186481a
--- /dev/null
+++ b/src/protocol/ultimate3.c
@@ -0,0 +1,1818 @@
+/* Ultimate IRCD 3 functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ *
+ */
+
+#include "services.h"
+#include "pseudo.h"
+#include "ultimate3.h"
+
+IRCDVar myIrcd[] = {
+ {"UltimateIRCd 3.0.*", /* ircd name */
+ "+S", /* nickserv mode */
+ "+S", /* chanserv mode */
+ "+S", /* memoserv mode */
+ "+o", /* hostserv mode */
+ "+iS", /* operserv mode */
+ "+S", /* botserv mode */
+ "+Sh", /* helpserv mode */
+ "+iS", /* Dev/Null mode */
+ "+iS", /* Global mode */
+ "+o", /* nickserv alias mode */
+ "+o", /* chanserv alias mode */
+ "+o", /* memoserv alias mode */
+ "+io", /* hostserv alias mode */
+ "+io", /* operserv alias mode */
+ "+o", /* botserv alias mode */
+ "+h", /* helpserv alias mode */
+ "+i", /* Dev/Null alias mode */
+ "+io", /* Global alias mode */
+ "+S", /* Used by BotServ Bots */
+ 5, /* Chan Max Symbols */
+ "-ilmnpqstRKAO", /* Modes to Remove */
+ "+o", /* Channel Umode used by Botserv bots */
+ 1, /* SVSNICK */
+ 1, /* Vhost */
+ 0, /* Has Owner */
+ NULL, /* Mode to set for an owner */
+ NULL, /* Mode to unset for an owner */
+ "+a", /* Mode to set for channel admin */
+ "-a", /* Mode to unset for channel admin */
+ "+rd", /* Mode On Reg */
+ NULL, /* Mode on ID for Roots */
+ NULL, /* Mode on ID for Admins */
+ NULL, /* Mode on ID for Opers */
+ "-r+d", /* Mode on UnReg */
+ "+d", /* Mode on Nick Change */
+ 1, /* Supports SGlines */
+ 1, /* Supports SQlines */
+ 1, /* Supports SZlines */
+ 1, /* Supports Halfop +h */
+ 3, /* Number of server args */
+ 0, /* Join 2 Set */
+ 0, /* Join 2 Message */
+ 1, /* Has exceptions +e */
+ 0, /* TS Topic Forward */
+ 0, /* TS Topci Backward */
+ UMODE_p, /* Protected Umode */
+ 1, /* Has Admin */
+ 1, /* Chan SQlines */
+ 0, /* Quit on Kill */
+ 1, /* SVSMODE unban */
+ 0, /* Has Protect */
+ 0, /* Reverse */
+ 1, /* Chan Reg */
+ CMODE_r, /* Channel Mode */
+ 0, /* vidents */
+ 0, /* svshold */
+ 1, /* time stamp on mode */
+ 1, /* NICKIP */
+ 0, /* O:LINE */
+ 1, /* UMODE */
+ 1, /* VHOST ON NICK */
+ 0, /* Change RealName */
+ CMODE_K, /* No Knock */
+ CMODE_A, /* Admin Only */
+ DEFAULT_MLOCK, /* Default MLOCK */
+ UMODE_x, /* Vhost Mode */
+ 0, /* +f */
+ 0, /* +L */
+ 0, /* +f Mode */
+ 0, /* +L Mode */
+ 1, /* On nick change check if they could be identified */
+ 1, /* No Knock requires +i */
+ NULL, /* CAPAB Chan Modes */
+ 0, /* We support TOKENS */
+ 1, /* TOKENS are CASE inSensitive */
+ 0, /* TIME STAMPS are BASE64 */
+ 0, /* +I support */
+ 0, /* SJOIN ban char */
+ 0, /* SJOIN except char */
+ 0, /* SJOIN invite char */
+ 0, /* Can remove User Channel Modes with SVSMODE */
+ 1, /* Sglines are enforced */
+ "x", /* vhost char */
+ 0, /* ts6 */
+ 1, /* support helper umode */
+ 0, /* p10 */
+ NULL, /* character set */
+ 1, /* reports sync state */
+ 0, /* CIDR channelbans */
+ }
+ ,
+ {NULL}
+};
+
+IRCDCAPAB myIrcdcap[] = {
+ {
+ CAPAB_NOQUIT, /* NOQUIT */
+ CAPAB_TSMODE, /* TSMODE */
+ CAPAB_UNCONNECT, /* UNCONNECT */
+ 0, /* NICKIP */
+ CAPAB_NSJOIN, /* SJOIN */
+ CAPAB_ZIP, /* ZIP */
+ CAPAB_BURST, /* BURST */
+ CAPAB_TS5, /* TS5 */
+ 0, /* TS3 */
+ CAPAB_DKEY, /* DKEY */
+ 0, /* PT4 */
+ 0, /* SCS */
+ 0, /* QS */
+ 0, /* UID */
+ 0, /* KNOCK */
+ CAPAB_CLIENT, /* CLIENT */
+ CAPAB_IPV6, /* IPV6 */
+ CAPAB_SSJ5, /* SSJ5 */
+ 0, /* SN2 */
+ 0, /* TOKEN */
+ 0, /* VHOST */
+ 0, /* SSJ3 */
+ 0, /* NICK2 */
+ 0, /* UMODE2 */
+ 0, /* VL */
+ 0, /* TLKEXT */
+ CAPAB_DODKEY, /* DODKEY */
+ CAPAB_DOZIP, /* DOZIP */
+ 0, 0, 0}
+};
+
+void ultimate3_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) {
+
+ /* This looks better, much better than "add ? (do_add) : (do_remove)".
+ * At least this is readable without paying much attention :) -GD
+ */
+ if (add)
+ user->mode |= umodes[(int) *modes];
+ else
+ user->mode &= ~umodes[(int) *modes];
+
+ switch (*modes++) {
+ case '+':
+ add = 1;
+ break;
+ case '-':
+ add = 0;
+ break;
+ case 'a':
+ if (add && !is_services_oper(user)) {
+ common_svsmode(user, "-a", NULL);
+ user->mode &= ~UMODE_a;
+ }
+ break;
+ case 'P':
+ if (add && !is_services_admin(user)) {
+ common_svsmode(user, "-P", NULL);
+ user->mode &= ~UMODE_P;
+ }
+ break;
+ case 'Z':
+ if (add && !is_services_root(user)) {
+ common_svsmode(user, "-Z", NULL);
+ user->mode &= ~UMODE_Z;
+ }
+ break;
+ case 'd':
+ if (ac == 0) {
+ alog("user: umode +d with no parameter (?) for user %s",
+ user->nick);
+ break;
+ }
+
+ ac--;
+ av++;
+ user->svid = strtoul(*av, NULL, 0);
+ break;
+ case 'o':
+ if (add) {
+ opcnt++;
+ if (WallOper) {
+ anope_cmd_global(s_OperServ,
+ "\2%s\2 is now an IRC operator.",
+ user->nick);
+ }
+ display_news(user, NEWS_OPER);
+ if (is_services_oper(user)) {
+ common_svsmode(user, "+a", NULL);
+ user->mode |= UMODE_a;
+ }
+ if (is_services_admin(user)) {
+ common_svsmode(user, "+P", NULL);
+ user->mode |= UMODE_P;
+ }
+ if (is_services_root(user)) {
+ common_svsmode(user, "+Z", NULL);
+ user->mode |= UMODE_Z;
+ }
+ } else {
+ opcnt--;
+ }
+ break;
+ case 'r':
+ if (add && !nick_identified(user)) {
+ common_svsmode(user, "-r", NULL);
+ user->mode &= ~UMODE_r;
+ }
+ break;
+ case 'x':
+ update_host(user);
+ break;
+ }
+ }
+}
+
+unsigned long umodes[128] = {
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused, Unused, Horzontal Tab */
+ 0, 0, 0, /* Line Feed, Unused, Unused */
+ 0, 0, 0, /* Carriage Return, Unused, Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused, Unused, Space */
+ 0, 0, 0, /* ! " # */
+ 0, 0, 0, /* $ % & */
+ 0, 0, 0, /* ! ( ) */
+ 0, 0, 0, /* * + , */
+ 0, 0, 0, /* - . / */
+ 0, 0, /* 0 1 */
+ 0, 0, /* 2 3 */
+ 0, 0, /* 4 5 */
+ 0, 0, /* 6 7 */
+ 0, 0, /* 8 9 */
+ 0, 0, /* : ; */
+ 0, 0, 0, /* < = > */
+ 0, 0, /* ? @ */
+ UMODE_A, 0, 0, /* A B C */
+ UMODE_D, 0, 0, /* D E F */
+ 0, 0, 0, /* G H I */
+ 0, 0, 0, /* J K L */
+ 0, 0, UMODE_0, /* M N O */
+ UMODE_P, 0, UMODE_R, /* P Q R */
+ UMODE_S, 0, 0, /* S T U */
+ 0, UMODE_W, 0, /* V W X */
+ 0, /* Y */
+ UMODE_Z, /* Z */
+ 0, 0, 0, /* [ \ ] */
+ 0, 0, 0, /* ^ _ ` */
+ UMODE_a, 0, 0, /* a b c */
+ UMODE_d, 0, 0, /* d e f */
+ 0, UMODE_h, UMODE_i, /* g h i */
+ 0, 0, 0, /* j k l */
+ 0, 0, UMODE_o, /* m n o */
+ UMODE_p, 0, UMODE_r, /* p q r */
+ 0, 0, 0, /* s t u */
+ 0, UMODE_w, UMODE_x, /* v w x */
+ 0, /* y */
+ 0, /* z */
+ 0, 0, 0, /* { | } */
+ 0, 0 /* ~ � */
+};
+
+
+char myCsmodes[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,
+ 'a', /* (33) ! Channel Admins */
+ 0, 0, 0,
+ 'h', /* (37) % Channel halfops */
+ 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
+};
+
+
+CMMode myCmmodes[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},
+ {add_exception, del_exception},
+ {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}
+};
+
+
+CBMode myCbmodes[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},
+ {CMODE_A, CBM_NO_USER_MLOCK, NULL, NULL},
+ {0}, /* B */
+ {0}, /* C */
+ {0}, /* D */
+ {0}, /* E */
+ {0}, /* F */
+ {0}, /* G */
+ {0}, /* H */
+ {0}, /* I */
+ {0}, /* J */
+ {CMODE_K, 0, NULL, NULL}, /* K */
+ {0}, /* L */
+ {CMODE_M, 0, NULL, NULL}, /* M */
+ {CMODE_N, 0, NULL, NULL}, /* N */
+ {CMODE_O, CBM_NO_USER_MLOCK, NULL, NULL},
+ {0}, /* P */
+ {0}, /* Q */
+ {CMODE_R, 0, NULL, NULL}, /* R */
+ {CMODE_S, 0, NULL, NULL}, /* S */
+ {0}, /* T */
+ {0}, /* U */
+ {0}, /* V */
+ {0}, /* W */
+ {0}, /* X */
+ {0}, /* Y */
+ {0}, /* Z */
+ {0}, {0}, {0}, {0}, {0}, {0},
+ {0}, /* a */
+ {0}, /* b */
+ {CMODE_c, 0, NULL, NULL}, /* c */
+ {0}, /* d */
+ {0}, /* e */
+ {0}, /* f */
+ {0}, /* g */
+ {0}, /* h */
+ {CMODE_i, 0, NULL, NULL}, /* i */
+ {0}, /* j */
+ {CMODE_k, 0, chan_set_key, cs_set_key},
+ {CMODE_l, CBM_MINUS_NO_ARG, set_limit, cs_set_limit},
+ {CMODE_m, 0, NULL, NULL}, /* m */
+ {CMODE_n, 0, NULL, NULL}, /* n */
+ {0}, /* o */
+ {CMODE_p, 0, NULL, NULL}, /* p */
+ {CMODE_q, 0, NULL, NULL}, /* q */
+ {CMODE_r, CBM_NO_MLOCK, NULL, NULL},
+ {CMODE_s, 0, NULL, NULL}, /* s */
+ {CMODE_t, 0, NULL, NULL}, /* t */
+ {0}, /* u */
+ {0}, /* v */
+ {0}, /* w */
+ {0}, /* x */
+ {0}, /* y */
+ {0}, /* z */
+ {0}, {0}, {0}, {0}
+};
+
+CBModeInfo myCbmodeinfos[] = {
+ {'c', CMODE_c, 0, NULL, NULL},
+ {'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},
+ {'q', CMODE_q, 0, NULL, NULL},
+ {'r', CMODE_r, 0, NULL, NULL},
+ {'s', CMODE_s, 0, NULL, NULL},
+ {'t', CMODE_t, 0, NULL, NULL},
+ {'A', CMODE_A, 0, NULL, NULL},
+ {'K', CMODE_K, 0, NULL, NULL},
+ {'M', CMODE_M, 0, NULL, NULL},
+ {'N', CMODE_N, 0, NULL, NULL},
+ {'O', CMODE_O, 0, NULL, NULL},
+ {'R', CMODE_R, 0, NULL, NULL},
+ {'S', CMODE_S, 0, NULL, NULL},
+ {0}
+};
+
+CUMode myCumodes[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},
+
+ {CUS_PROTECT, CUF_PROTECT_BOTSERV, check_valid_admin},
+ {0}, /* b */
+ {0}, /* c */
+ {0}, /* d */
+ {0}, /* e */
+ {0}, /* f */
+ {0}, /* g */
+ {CUS_HALFOP, 0, check_valid_op},
+ {0}, /* i */
+ {0}, /* j */
+ {0}, /* k */
+ {0}, /* l */
+ {0}, /* m */
+ {0}, /* n */
+ {CUS_OP, CUF_PROTECT_BOTSERV, check_valid_op},
+ {0}, /* p */
+ {0}, /* q */
+ {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}
+};
+
+/* SVSMODE -b */
+void ultimate3_cmd_unban(char *name, char *nick)
+{
+ ultimate3_cmd_svsmode_chan(name, "-b", nick);
+}
+
+
+/* SVSMODE channel modes */
+
+void ultimate3_cmd_svsmode_chan(char *name, char *mode, char *nick)
+{
+ if (nick) {
+ send_cmd(ServerName, "SVSMODE %s %s %s", name, mode, nick);
+ } else {
+ send_cmd(ServerName, "SVSMODE %s %s", name, mode);
+ }
+}
+
+int anope_event_sjoin(char *source, int ac, char **av)
+{
+ do_sjoin(source, ac, av);
+ return MOD_CONT;
+}
+
+
+/*
+** NICK - new
+** source = NULL
+** parv[0] = nickname
+** parv[1] = hopcount
+** parv[2] = timestamp
+** parv[3] = modes
+** parv[4] = username
+** parv[5] = hostname
+** parv[6] = server
+** parv[7] = servicestamp
+** parv[8] = IP
+** parv[9] = info
+** NICK - change
+** source = oldnick
+** parv[0] = new nickname
+** parv[1] = hopcount
+*/
+int anope_event_nick(char *source, int ac, char **av)
+{
+ if (ac != 2) {
+ 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), "*", NULL);
+ if (user)
+ anope_set_umode(user, 1, &av[3]);
+ } else {
+ do_nick(source, av[0], NULL, NULL, NULL, NULL,
+ strtoul(av[1], NULL, 10), 0, 0, NULL, NULL);
+ }
+ return MOD_CONT;
+}
+
+int anope_event_sethost(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 2)
+ return MOD_CONT;
+
+ u = finduser(av[0]);
+ if (!u) {
+ if (debug) {
+ alog("debug: SETHOST for nonexistent user %s", av[0]);
+ }
+ return MOD_CONT;
+ }
+
+ change_user_host(u, av[1]);
+ return MOD_CONT;
+}
+
+int anope_event_capab(char *source, int ac, char **av)
+{
+ capab_parse(ac, av);
+ return MOD_CONT;
+}
+
+/*
+** CLIENT
+** source = NULL
+** parv[0] = nickname Trystan
+** parv[1] = hopcount 1
+** parv[2] = timestamp 1090083810
+** parv[3] = modes +ix
+** parv[4] = modes ? +
+** parv[5] = username Trystan
+** parv[6] = hostname c-24-2-101-227.client.comcast.net
+** parv[7] = vhost 3223f75b.2b32ee69.client.comcast.net
+** parv[8] = server WhiteRose.No.Eu.Shadow-Realm.org
+** parv[9] = svid 0
+** parv[10] = ip 402810339
+** parv[11] = info Dreams are answers to questions not yet asked
+*/
+int anope_event_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], NULL);
+ if (user) {
+ anope_set_umode(user, 1, &av[3]);
+ }
+ }
+ return MOD_CONT;
+}
+
+/* *INDENT-OFF* */
+void moduleAddIRCDMsgs(void) {
+ Message *m;
+
+ updateProtectDetails("ADMIN","ADMINME","admin","deadmin","AUTOADMIN","+a","-a");
+
+ m = createMessage("401", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("402", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("436", anope_event_436); addCoreMessage(IRCD,m);
+ m = createMessage("AWAY", anope_event_away); addCoreMessage(IRCD,m);
+ m = createMessage("INVITE", anope_event_invite); addCoreMessage(IRCD,m);
+ m = createMessage("JOIN", anope_event_join); addCoreMessage(IRCD,m);
+ m = createMessage("KICK", anope_event_kick); addCoreMessage(IRCD,m);
+ m = createMessage("KILL", anope_event_kill); addCoreMessage(IRCD,m);
+ m = createMessage("MODE", anope_event_mode); addCoreMessage(IRCD,m);
+ m = createMessage("MOTD", anope_event_motd); addCoreMessage(IRCD,m);
+ m = createMessage("NICK", anope_event_nick); addCoreMessage(IRCD,m);
+ m = createMessage("NOTICE", anope_event_notice); addCoreMessage(IRCD,m);
+ m = createMessage("PART", anope_event_part); addCoreMessage(IRCD,m);
+ m = createMessage("PASS", anope_event_pass); addCoreMessage(IRCD,m);
+ m = createMessage("PING", anope_event_ping); addCoreMessage(IRCD,m);
+ m = createMessage("PRIVMSG", anope_event_privmsg); addCoreMessage(IRCD,m);
+ m = createMessage("QUIT", anope_event_quit); addCoreMessage(IRCD,m);
+ m = createMessage("SERVER", anope_event_server); addCoreMessage(IRCD,m);
+ m = createMessage("SQUIT", anope_event_squit); addCoreMessage(IRCD,m);
+ m = createMessage("TOPIC", anope_event_topic); addCoreMessage(IRCD,m);
+ m = createMessage("USER", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("WALLOPS", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("WHOIS", anope_event_whois); addCoreMessage(IRCD,m);
+ m = createMessage("AKILL", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("GLOBOPS", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("GNOTICE", anope_event_gnotice); addCoreMessage(IRCD,m);
+ m = createMessage("GOPER", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("RAKILL", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SILENCE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SVSKILL", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SVSMODE", anope_event_mode); addCoreMessage(IRCD,m);
+ m = createMessage("SVSNICK", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SVSNOOP", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SQLINE", anope_event_sqline); addCoreMessage(IRCD,m);
+ m = createMessage("UNSQLINE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("CAPAB", anope_event_capab); addCoreMessage(IRCD,m);
+ m = createMessage("CS", anope_event_cs); addCoreMessage(IRCD,m);
+ m = createMessage("HS", anope_event_hs); addCoreMessage(IRCD,m);
+ m = createMessage("MS", anope_event_ms); addCoreMessage(IRCD,m);
+ m = createMessage("NS", anope_event_ns); addCoreMessage(IRCD,m);
+ m = createMessage("OS", anope_event_os); addCoreMessage(IRCD,m);
+ m = createMessage("RS", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SGLINE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SJOIN", anope_event_sjoin); addCoreMessage(IRCD,m);
+ m = createMessage("SS", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SVINFO", anope_event_svinfo); addCoreMessage(IRCD,m);
+ m = createMessage("SZLINE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("UNSGLINE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("UNSZLINE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SETHOST", anope_event_sethost); addCoreMessage(IRCD,m);
+ m = createMessage("NETINFO", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("GCONNECT", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("NETGLOBAL", anope_event_netglobal); addCoreMessage(IRCD,m);
+ m = createMessage("CHATOPS", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("NETCTRL", anope_event_netctrl); addCoreMessage(IRCD,m);
+ m = createMessage("CLIENT", anope_event_client); addCoreMessage(IRCD,m);
+ m = createMessage("SMODE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("ERROR", anope_event_error); addCoreMessage(IRCD,m);
+ m = createMessage("BURST", anope_event_burst); addCoreMessage(IRCD,m);
+ m = createMessage("REHASH", anope_event_rehash); addCoreMessage(IRCD,m);
+ m = createMessage("ADMIN", anope_event_admin); addCoreMessage(IRCD,m);
+ m = createMessage("CREDITS", anope_event_credits); addCoreMessage(IRCD,m);
+ m = createMessage("SMODE", anope_event_mode); addCoreMessage(IRCD,m);
+ m = createMessage("EOBURST", anope_event_eob); addCoreMessage(IRCD,m);
+}
+
+/* *INDENT-ON* */
+
+
+void ultimate3_cmd_sqline(char *mask, char *reason)
+{
+ if (!mask || !reason) {
+ return;
+ }
+
+ send_cmd(NULL, "SQLINE %s :%s", mask, reason);
+}
+
+void ultimate3_cmd_unsgline(char *mask)
+{
+ send_cmd(NULL, "UNSGLINE 0 :%s", mask);
+}
+
+void ultimate3_cmd_unszline(char *mask)
+{
+ send_cmd(NULL, "UNSZLINE 0 %s", mask);
+}
+
+/* As of alpha27 (one after our offical support szline was removed */
+/* quote the changelog ---
+ Complete rewrite of the kline/akill/zline system. (s)zlines no longer exist.
+ K: lines set on IP addresses without username portions (or *) are treated as Z: lines used to be.
+*/
+void ultimate3_cmd_szline(char *mask, char *reason, char *whom)
+{
+ send_cmd(NULL, "AKILL %s * %d %s %ld :%s", mask, 86400 * 2, whom,
+ (long int) time(NULL), reason);
+ /* leaving this in here in case some legacy user asks for it */
+ /* send_cmd(NULL, "SZLINE %s :%s", mask, reason); */
+}
+
+void ultimate3_cmd_svsnoop(char *server, int set)
+{
+ send_cmd(NULL, "SVSNOOP %s %s", server, (set ? "+" : "-"));
+}
+
+void ultimate3_cmd_svsadmin(char *server, int set)
+{
+ ultimate3_cmd_svsnoop(server, set);
+}
+
+void ultimate3_cmd_sgline(char *mask, char *reason)
+{
+ send_cmd(NULL, "SGLINE %d :%s:%s", (int)strlen(mask), mask, reason);
+}
+
+void ultimate3_cmd_remove_akill(char *user, char *host)
+{
+ send_cmd(NULL, "RAKILL %s %s", host, user);
+}
+
+void ultimate3_cmd_vhost_off(User * u)
+{
+ send_cmd(s_HostServ, "SVSMODE %s -x", u->nick);
+ notice_lang(s_HostServ, u, HOST_OFF_UNREAL, u->nick, ircd->vhostchar);
+}
+
+void ultimate3_cmd_vhost_on(char *nick, char *vIdent, char *vhost)
+{
+ send_cmd(s_HostServ, "SVSMODE %s +x", nick);
+ send_cmd(ServerName, "SETHOST %s %s", nick, vhost);
+}
+
+void ultimate3_cmd_join(char *user, char *channel, time_t chantime)
+{
+ send_cmd(user, "SJOIN %ld %s", (long int) chantime, channel);
+}
+
+void ultimate3_cmd_akill(char *user, char *host, char *who, time_t when,
+ time_t expires, char *reason)
+{
+ send_cmd(NULL, "AKILL %s %s %d %s %ld :%s", host, user, 86400 * 2, who,
+ (long int) time(NULL), reason);
+}
+
+void ultimate3_cmd_svskill(char *source, char *user, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "SVSKILL %s :%s", user, buf);
+}
+
+
+void ultimate3_cmd_svsmode(User * u, int ac, char **av)
+{
+ send_cmd(ServerName, "SVSMODE %s %ld %s%s%s", u->nick,
+ (long int) u->timestamp, av[0], (ac == 2 ? " " : ""),
+ (ac == 2 ? av[1] : ""));
+}
+
+void anope_squit(char *servname, char *message)
+{
+ send_cmd(servname, "SQUIT %s :%s", servname, message);
+}
+
+void anope_pong(char *servname)
+{
+ send_cmd(servname, "PONG %s", servname);
+}
+
+/* Events */
+
+int anope_event_ping(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+ ultimate3_cmd_pong(ac > 1 ? av[1] : ServerName, av[0]);
+ return MOD_CONT;
+}
+
+int anope_event_436(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+
+ m_nickcoll(av[0]);
+ return MOD_CONT;
+}
+
+int anope_event_away(char *source, int ac, char **av)
+{
+ if (!source) {
+ return MOD_CONT;
+ }
+ m_away(source, (ac ? av[0] : NULL));
+ return MOD_CONT;
+}
+
+int anope_event_topic(char *source, int ac, char **av)
+{
+ if (ac != 4)
+ return MOD_CONT;
+ do_topic(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_squit(char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+ do_squit(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_quit(char *source, int ac, char **av)
+{
+ if (ac != 1)
+ return MOD_CONT;
+ do_quit(source, ac, av);
+ return MOD_CONT;
+}
+
+
+int anope_event_mode(char *source, int ac, char **av)
+{
+ if (ac < 2)
+ return MOD_CONT;
+
+ if (*av[0] == '#' || *av[0] == '&') {
+ do_cmode(source, ac, av);
+ } else {
+ do_umode(source, ac, av);
+ }
+ return MOD_CONT;
+}
+
+/* EVENT : OS */
+int anope_event_os(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+ m_privmsg(source, s_OperServ, av[0]);
+ return MOD_CONT;
+}
+
+/* EVENT : NS */
+int anope_event_ns(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+ m_privmsg(source, s_NickServ, av[0]);
+ return MOD_CONT;
+}
+
+/* EVENT : MS */
+int anope_event_ms(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+ m_privmsg(source, s_MemoServ, av[0]);
+ return MOD_CONT;
+}
+
+/* EVENT : HS */
+int anope_event_hs(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+ m_privmsg(source, s_HostServ, av[0]);
+ return MOD_CONT;
+}
+
+/* EVENT : CS */
+int anope_event_cs(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+ m_privmsg(source, s_ChanServ, av[0]);
+ return MOD_CONT;
+}
+
+
+int anope_event_kill(char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+
+ m_kill(av[0], av[1]);
+ return MOD_CONT;
+}
+
+int anope_event_kick(char *source, int ac, char **av)
+{
+ if (ac != 3)
+ return MOD_CONT;
+ do_kick(source, ac, av);
+ return MOD_CONT;
+}
+
+
+int anope_event_join(char *source, int ac, char **av)
+{
+ if (ac != 1)
+ return MOD_CONT;
+ do_join(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_motd(char *source, int ac, char **av)
+{
+ if (!source) {
+ return MOD_CONT;
+ }
+
+ m_motd(source);
+ return MOD_CONT;
+}
+
+int anope_event_setname(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 1)
+ return MOD_CONT;
+
+ u = finduser(source);
+ if (!u) {
+ if (debug) {
+ alog("debug: SETNAME for nonexistent user %s", source);
+ }
+ return MOD_CONT;
+ }
+
+ change_user_realname(u, av[0]);
+ return MOD_CONT;
+}
+
+int anope_event_chgname(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 2)
+ return MOD_CONT;
+
+ u = finduser(av[0]);
+ if (!u) {
+ if (debug) {
+ alog("debug: CHGNAME for nonexistent user %s", av[0]);
+ }
+ return MOD_CONT;
+ }
+
+ change_user_realname(u, av[1]);
+ return MOD_CONT;
+}
+
+int anope_event_setident(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 1)
+ return MOD_CONT;
+
+ u = finduser(source);
+ if (!u) {
+ if (debug) {
+ alog("debug: SETIDENT for nonexistent user %s", source);
+ }
+ return MOD_CONT;
+ }
+
+ change_user_username(u, av[0]);
+ return MOD_CONT;
+}
+int anope_event_chgident(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 2)
+ return MOD_CONT;
+
+ u = finduser(av[0]);
+ if (!u) {
+ if (debug) {
+ alog("debug: CHGIDENT for nonexistent user %s", av[0]);
+ }
+ return MOD_CONT;
+ }
+
+ change_user_username(u, av[1]);
+ return MOD_CONT;
+}
+
+/* EVENT: SERVER */
+int anope_event_server(char *source, int ac, char **av)
+{
+ if (!stricmp(av[1], "1")) {
+ uplink = sstrdup(av[0]);
+ }
+ do_server(source, av[0], av[1], av[2], NULL);
+ return MOD_CONT;
+}
+
+
+int anope_event_privmsg(char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+ m_privmsg(source, av[0], av[1]);
+ return MOD_CONT;
+}
+
+int anope_event_part(char *source, int ac, char **av)
+{
+ if (ac < 1 || ac > 2)
+ return MOD_CONT;
+ do_part(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_whois(char *source, int ac, char **av)
+{
+ if (source && ac >= 1) {
+ m_whois(source, av[0]);
+ }
+ return MOD_CONT;
+}
+
+void ultimate3_cmd_topic(char *whosets, char *chan, char *whosetit,
+ char *topic, time_t when)
+{
+ send_cmd(whosets, "TOPIC %s %s %lu :%s", chan, whosetit,
+ (unsigned long int) when, topic);
+}
+
+void ultimate3_cmd_372(char *source, char *msg)
+{
+ send_cmd(ServerName, "372 %s :- %s", source, msg);
+}
+
+void ultimate3_cmd_372_error(char *source)
+{
+ send_cmd(ServerName, "422 %s :- MOTD file not found! Please "
+ "contact your IRC administrator.", source);
+}
+
+void ultimate3_cmd_375(char *source)
+{
+ send_cmd(ServerName, "375 %s :- %s Message of the Day",
+ source, ServerName);
+}
+
+void ultimate3_cmd_376(char *source)
+{
+ send_cmd(ServerName, "376 %s :End of /MOTD command.", source);
+}
+
+void ultimate3_cmd_nick(char *nick, char *name, char *modes)
+{
+ EnforceQlinedNick(nick, NULL);
+ send_cmd(NULL, "CLIENT %s 1 %ld %s + %s %s * %s 0 0 :%s", nick,
+ (long int) time(NULL), modes, ServiceUser, ServiceHost,
+ ServerName, name);
+ ultimate3_cmd_sqline(nick, "Reserved for services");
+}
+
+void ultimate3_cmd_guest_nick(char *nick, char *user, char *host,
+ char *real, char *modes)
+{
+ send_cmd(NULL, "CLIENT %s 1 %ld %s + %s %s * %s 0 0 :%s", nick,
+ (long int) time(NULL), modes, user, host, ServerName, real);
+}
+
+void ultimate3_cmd_mode(char *source, char *dest, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(source, "MODE %s %s", dest, buf);
+}
+
+void ultimate3_cmd_bot_nick(char *nick, char *user, char *host, char *real,
+ char *modes)
+{
+ EnforceQlinedNick(nick, s_BotServ);
+ send_cmd(NULL, "CLIENT %s 1 %ld %s + %s %s * %s 0 0 :%s", nick,
+ (long int) time(NULL), modes, user, host, ServerName, real);
+ ultimate3_cmd_sqline(nick, "Reserved for services");
+}
+
+void ultimate3_cmd_kick(char *source, char *chan, char *user, char *buf)
+{
+ if (buf) {
+ send_cmd(source, "KICK %s %s :%s", chan, user, buf);
+ } else {
+ send_cmd(source, "KICK %s %s", chan, user);
+ }
+}
+
+void ultimate3_cmd_notice_ops(char *source, char *dest, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "NOTICE @%s :%s", dest, buf);
+}
+
+
+void ultimate3_cmd_notice(char *source, char *dest, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ if (NSDefFlags & NI_MSG) {
+ ultimate3_cmd_privmsg2(source, dest, buf);
+ } else {
+ send_cmd(source, "NOTICE %s :%s", dest, buf);
+ }
+}
+
+void ultimate3_cmd_notice2(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "NOTICE %s :%s", dest, msg);
+}
+
+void ultimate3_cmd_privmsg(char *source, char *dest, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(source, "PRIVMSG %s :%s", dest, buf);
+}
+
+void ultimate3_cmd_privmsg2(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "PRIVMSG %s :%s", dest, msg);
+}
+
+void ultimate3_cmd_serv_notice(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "NOTICE $%s :%s", dest, msg);
+}
+
+void ultimate3_cmd_serv_privmsg(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "PRIVMSG $%s :%s", dest, msg);
+}
+
+void ultimate3_cmd_bot_chan_mode(char *nick, char *chan)
+{
+ anope_cmd_mode(nick, chan, "%s %s %s", ircd->botchanumode, nick, nick);
+}
+
+void ultimate3_cmd_351(char *source)
+{
+ send_cmd(ServerName, "351 %s Anope-%s %s :%s - %s (%s) -- %s",
+ source, version_number, ServerName, ircd->name, version_flags,
+ EncModule,version_build);
+
+}
+
+/* QUIT */
+void ultimate3_cmd_quit(char *source, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ if (buf) {
+ send_cmd(source, "QUIT :%s", buf);
+ } else {
+ send_cmd(source, "QUIT");
+ }
+}
+
+/* PROTOCTL */
+void ultimate3_cmd_capab()
+{
+ send_cmd(NULL,
+ "CAPAB TS5 NOQUIT SSJ5 BURST UNCONNECT TSMODE NICKIP CLIENT");
+}
+
+/* PASS */
+void ultimate3_cmd_pass(char *pass)
+{
+ send_cmd(NULL, "PASS %s :TS", pass);
+}
+
+/* SERVER name hop descript */
+/* Unreal 3.2 actually sends some info about itself in the descript area */
+void ultimate3_cmd_server(char *servname, int hop, char *descript)
+{
+ send_cmd(NULL, "SERVER %s %d :%s", servname, hop, descript);
+}
+
+/* PONG */
+void ultimate3_cmd_pong(char *servname, char *who)
+{
+ send_cmd(servname, "PONG %s", who);
+}
+
+/* UNSQLINE */
+void ultimate3_cmd_unsqline(char *user)
+{
+ if (!user) {
+ return;
+ }
+ send_cmd(NULL, "UNSQLINE %s", user);
+}
+
+/* CHGHOST */
+void ultimate3_cmd_chghost(char *nick, char *vhost)
+{
+ if (!nick || !vhost) {
+ return;
+ }
+ send_cmd(ServerName, "CHGHOST %s %s", nick, vhost);
+}
+
+/* CHGIDENT */
+void ultimate3_cmd_chgident(char *nick, char *vIdent)
+{
+ if (!nick || !vIdent) {
+ return;
+ }
+ send_cmd(ServerName, "CHGIDENT %s %s", nick, vIdent);
+}
+
+/* INVITE */
+void ultimate3_cmd_invite(char *source, char *chan, char *nick)
+{
+ if (!source || !chan || !nick) {
+ return;
+ }
+
+ send_cmd(source, "INVITE %s %s", nick, chan);
+}
+
+/* PART */
+void ultimate3_cmd_part(char *nick, char *chan, char *buf)
+{
+
+ if (!nick || !chan) {
+ return;
+ }
+
+ if (buf) {
+ send_cmd(nick, "PART %s :%s", chan, buf);
+ } else {
+ send_cmd(nick, "PART %s", chan);
+ }
+}
+
+/* 391 */
+void ultimate3_cmd_391(char *source, char *timestr)
+{
+ if (!timestr) {
+ return;
+ }
+ send_cmd(NULL, "391 :%s %s :%s", source, ServerName, timestr);
+}
+
+/* 250 */
+void ultimate3_cmd_250(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "250 %s", buf);
+}
+
+/* 307 */
+void ultimate3_cmd_307(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "307 %s", buf);
+}
+
+/* 311 */
+void ultimate3_cmd_311(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "311 %s", buf);
+}
+
+/* 312 */
+void ultimate3_cmd_312(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "312 %s", buf);
+}
+
+/* 317 */
+void ultimate3_cmd_317(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "317 %s", buf);
+}
+
+/* 219 */
+void ultimate3_cmd_219(char *source, char *letter)
+{
+ if (!source) {
+ return;
+ }
+
+ if (letter) {
+ send_cmd(NULL, "219 %s %c :End of /STATS report.", source,
+ *letter);
+ } else {
+ send_cmd(NULL, "219 %s l :End of /STATS report.", source);
+ }
+}
+
+/* 401 */
+void ultimate3_cmd_401(char *source, char *who)
+{
+ if (!source || !who) {
+ return;
+ }
+ send_cmd(ServerName, "401 %s %s :No such service.", source, who);
+}
+
+/* 318 */
+void ultimate3_cmd_318(char *source, char *who)
+{
+ if (!source || !who) {
+ return;
+ }
+
+ send_cmd(ServerName, "318 %s %s :End of /WHOIS list.", source, who);
+}
+
+/* 242 */
+void ultimate3_cmd_242(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "242 %s", buf);
+}
+
+/* 243 */
+void ultimate3_cmd_243(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "243 %s", buf);
+}
+
+/* 211 */
+void ultimate3_cmd_211(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "211 %s", buf);
+}
+
+/* GLOBOPS */
+void ultimate3_cmd_global(char *source, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(source ? source : ServerName, "GLOBOPS :%s", buf);
+}
+
+/* SQUIT */
+void ultimate3_cmd_squit(char *servname, char *message)
+{
+ if (!servname || !message) {
+ return;
+ }
+
+ send_cmd(NULL, "SQUIT %s :%s", servname, message);
+}
+
+/* SVSO */
+void ultimate3_cmd_svso(char *source, char *nick, char *flag)
+{
+ if (!source || !nick || !flag) {
+ return;
+ }
+
+ send_cmd(source, "SVSO %s %s", nick, flag);
+}
+
+/* NICK <newnick> */
+void ultimate3_cmd_chg_nick(char *oldnick, char *newnick)
+{
+ if (!oldnick || !newnick) {
+ return;
+ }
+
+ send_cmd(oldnick, "NICK %s", newnick);
+}
+
+/* SVSNICK */
+void ultimate3_cmd_svsnick(char *source, char *guest, time_t when)
+{
+ if (!source || !guest) {
+ return;
+ }
+ send_cmd(NULL, "SVSNICK %s %s :%ld", source, guest, (long int) when);
+}
+
+/* Functions that use serval cmd functions */
+/*
+ * SVINFO
+ * parv[0] = sender prefix
+ * parv[1] = TS_CURRENT for the server
+ * parv[2] = TS_MIN for the server
+ * parv[3] = server is standalone or connected to non-TS only
+ * parv[4] = server's idea of UTC time
+ */
+void ultimate3_cmd_svinfo()
+{
+ send_cmd(NULL, "SVINFO 5 3 0 :%ld", (long int) time(NULL));
+}
+
+void ultimate3_cmd_burst()
+{
+ send_cmd(NULL, "BURST");
+}
+
+
+void ultimate3_cmd_connect(int servernum)
+{
+ me_server =
+ new_server(NULL, ServerName, ServerDesc, SERVER_ISME, NULL);
+
+ if (servernum == 1) {
+ ultimate3_cmd_pass(RemotePassword);
+ }
+ if (servernum == 2) {
+ ultimate3_cmd_pass(RemotePassword2);
+ }
+ if (servernum == 3) {
+ ultimate3_cmd_pass(RemotePassword3);
+ }
+ ultimate3_cmd_capab();
+ ultimate3_cmd_server(ServerName, 1, ServerDesc);
+ ultimate3_cmd_svinfo();
+ ultimate3_cmd_burst();
+}
+
+/* SVSHOLD - set */
+void ultimate3_cmd_svshold(char *nick)
+{
+ /* Not supported by this IRCD */
+}
+
+/* SVSHOLD - release */
+void ultimate3_cmd_release_svshold(char *nick)
+{
+ /* Not Supported by this IRCD */
+}
+
+/* SVSMODE +d */
+/* sent if svid is something weird */
+void ultimate3_cmd_svid_umode(char *nick, time_t ts)
+{
+ send_cmd(ServerName, "SVSMODE %s %lu +d 1", nick,
+ (unsigned long int) ts);
+}
+
+/* SVSMODE +d */
+/* nc_change was = 1, and there is no na->status */
+void ultimate3_cmd_nc_change(User * u)
+{
+ common_svsmode(u, "+d", "1");
+}
+
+/* SVSMODE +d */
+void ultimate3_cmd_svid_umode2(User * u, char *ts)
+{
+ /* not used by bahamut ircds */
+}
+
+void ultimate3_cmd_svid_umode3(User * u, char *ts)
+{
+ if (u->svid != u->timestamp) {
+ common_svsmode(u, "+rd", ts);
+ } else {
+ common_svsmode(u, "+r", NULL);
+ }
+
+}
+
+int anope_event_svinfo(char *source, int ac, char **av)
+{
+ /* currently not used but removes the message : unknown message from server */
+ return MOD_CONT;
+}
+
+int anope_event_pass(char *source, int ac, char **av)
+{
+ /* currently not used but removes the message : unknown message from server */
+ return MOD_CONT;
+}
+
+int anope_event_gnotice(char *source, int ac, char **av)
+{
+ /* currently not used but removes the message : unknown message from server */
+ return MOD_CONT;
+}
+
+int anope_event_netctrl(char *source, int ac, char **av)
+{
+ /* currently not used but removes the message : unknown message from server */
+ return MOD_CONT;
+}
+
+int anope_event_notice(char *source, int ac, char **av)
+{
+ /* currently not used but removes the message : unknown message from server */
+ return MOD_CONT;
+}
+
+int anope_event_sqline(char *source, int ac, char **av)
+{
+ /* currently not used but removes the message : unknown message from server */
+ return MOD_CONT;
+}
+
+void ultimate3_cmd_svsjoin(char *source, char *nick, char *chan, char *param)
+{
+ /* Not Supported by this IRCD */
+}
+
+void ultimate3_cmd_svspart(char *source, char *nick, char *chan)
+{
+ /* Not Supported by this IRCD */
+}
+
+void ultimate3_cmd_swhois(char *source, char *who, char *mask)
+{
+ /* not supported */
+}
+
+
+void ultimate3_cmd_eob()
+{
+ send_cmd(NULL, "BURST 0");
+}
+
+int anope_event_error(char *source, int ac, char **av)
+{
+ if (ac >= 1) {
+ if (debug) {
+ alog("debug: %s", av[0]);
+ }
+ }
+ return MOD_CONT;
+}
+
+
+int anope_event_eob(char *source, int ac, char **av)
+{
+ Server *s;
+
+ if (ac == 1) {
+ s = findserver(servlist, av[0]);
+ /* If we found a server with the given source, that one just
+ * finished bursting. If there was no source, then our uplink
+ * server finished bursting. -GD
+ */
+ if (!s && serv_uplink)
+ s = serv_uplink;
+ finish_sync(s, 1);
+ }
+ return MOD_CONT;
+}
+
+
+int anope_event_burst(char *source, int ac, char **av)
+{
+ Server *s;
+ s = findserver(servlist, source);
+ if (!ac) {
+ /* for future use - start burst */
+ } else {
+ /* If we found a server with the given source, that one just
+ * finished bursting. If there was no source, then our uplink
+ * server finished bursting. -GD
+ */
+ if (!s && serv_uplink)
+ s = serv_uplink;
+ finish_sync(s, 1);
+ }
+ return MOD_CONT;
+}
+
+int anope_event_rehash(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_credits(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_admin(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_netglobal(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_invite(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int ultiamte3_flood_mode_check(char *value)
+{
+ return 0;
+}
+
+void ultimate3_cmd_jupe(char *jserver, char *who, char *reason)
+{
+ char rbuf[256];
+
+ snprintf(rbuf, sizeof(rbuf), "Juped by %s%s%s", who,
+ reason ? ": " : "", reason ? reason : "");
+
+ if (findserver(servlist, jserver))
+ ultimate3_cmd_squit(jserver, rbuf);
+ ultimate3_cmd_server(jserver, 2, rbuf);
+ new_server(me_server, jserver, rbuf, SERVER_JUPED, NULL);
+}
+
+/* GLOBOPS - to handle old WALLOPS */
+void ultimate3_cmd_global_legacy(char *source, char *fmt)
+{
+ send_cmd(source ? source : ServerName, "GLOBOPS :%s", fmt);
+}
+
+/*
+ 1 = valid nick
+ 0 = nick is in valid
+*/
+int ultiamte3_valid_nick(char *nick)
+{
+ /* no hard coded invalid nicks */
+ return 1;
+}
+
+/*
+ 1 = valid chan
+ 0 = chan is in valid
+*/
+int ultiamte3_valid_chan(char *chan)
+{
+ /* no hard coded invalid chans */
+ return 1;
+}
+
+
+void ultimate3_cmd_ctcp(char *source, char *dest, char *buf)
+{
+ char *s;
+
+ if (!buf) {
+ return;
+ } else {
+ s = normalizeBuffer(buf);
+ }
+
+ send_cmd(source, "NOTICE %s :\1%s \1", dest, s);
+ free(s);
+}
+
+
+/**
+ * Tell anope which function we want to perform each task inside of anope.
+ * These prototypes must match what anope expects.
+ **/
+void moduleAddAnopeCmds()
+{
+ pmodule_cmd_svsnoop(ultimate3_cmd_svsnoop);
+ pmodule_cmd_remove_akill(ultimate3_cmd_remove_akill);
+ pmodule_cmd_topic(ultimate3_cmd_topic);
+ pmodule_cmd_vhost_off(ultimate3_cmd_vhost_off);
+ pmodule_cmd_akill(ultimate3_cmd_akill);
+ pmodule_cmd_svskill(ultimate3_cmd_svskill);
+ pmodule_cmd_svsmode(ultimate3_cmd_svsmode);
+ pmodule_cmd_372(ultimate3_cmd_372);
+ pmodule_cmd_372_error(ultimate3_cmd_372_error);
+ pmodule_cmd_375(ultimate3_cmd_375);
+ pmodule_cmd_376(ultimate3_cmd_376);
+ pmodule_cmd_nick(ultimate3_cmd_nick);
+ pmodule_cmd_guest_nick(ultimate3_cmd_guest_nick);
+ pmodule_cmd_mode(ultimate3_cmd_mode);
+ pmodule_cmd_bot_nick(ultimate3_cmd_bot_nick);
+ pmodule_cmd_kick(ultimate3_cmd_kick);
+ pmodule_cmd_notice_ops(ultimate3_cmd_notice_ops);
+ pmodule_cmd_notice(ultimate3_cmd_notice);
+ pmodule_cmd_notice2(ultimate3_cmd_notice2);
+ pmodule_cmd_privmsg(ultimate3_cmd_privmsg);
+ pmodule_cmd_privmsg2(ultimate3_cmd_privmsg2);
+ pmodule_cmd_serv_notice(ultimate3_cmd_serv_notice);
+ pmodule_cmd_serv_privmsg(ultimate3_cmd_serv_privmsg);
+ pmodule_cmd_bot_chan_mode(ultimate3_cmd_bot_chan_mode);
+ pmodule_cmd_351(ultimate3_cmd_351);
+ pmodule_cmd_quit(ultimate3_cmd_quit);
+ pmodule_cmd_pong(ultimate3_cmd_pong);
+ pmodule_cmd_join(ultimate3_cmd_join);
+ pmodule_cmd_unsqline(ultimate3_cmd_unsqline);
+ pmodule_cmd_invite(ultimate3_cmd_invite);
+ pmodule_cmd_part(ultimate3_cmd_part);
+ pmodule_cmd_391(ultimate3_cmd_391);
+ pmodule_cmd_250(ultimate3_cmd_250);
+ pmodule_cmd_307(ultimate3_cmd_307);
+ pmodule_cmd_311(ultimate3_cmd_311);
+ pmodule_cmd_312(ultimate3_cmd_312);
+ pmodule_cmd_317(ultimate3_cmd_317);
+ pmodule_cmd_219(ultimate3_cmd_219);
+ pmodule_cmd_401(ultimate3_cmd_401);
+ pmodule_cmd_318(ultimate3_cmd_318);
+ pmodule_cmd_242(ultimate3_cmd_242);
+ pmodule_cmd_243(ultimate3_cmd_243);
+ pmodule_cmd_211(ultimate3_cmd_211);
+ pmodule_cmd_global(ultimate3_cmd_global);
+ pmodule_cmd_global_legacy(ultimate3_cmd_global_legacy);
+ pmodule_cmd_sqline(ultimate3_cmd_sqline);
+ pmodule_cmd_squit(ultimate3_cmd_squit);
+ pmodule_cmd_svso(ultimate3_cmd_svso);
+ pmodule_cmd_chg_nick(ultimate3_cmd_chg_nick);
+ pmodule_cmd_svsnick(ultimate3_cmd_svsnick);
+ pmodule_cmd_vhost_on(ultimate3_cmd_vhost_on);
+ pmodule_cmd_connect(ultimate3_cmd_connect);
+ pmodule_cmd_svshold(ultimate3_cmd_svshold);
+ pmodule_cmd_release_svshold(ultimate3_cmd_release_svshold);
+ pmodule_cmd_unsgline(ultimate3_cmd_unsgline);
+ pmodule_cmd_unszline(ultimate3_cmd_unszline);
+ pmodule_cmd_szline(ultimate3_cmd_szline);
+ pmodule_cmd_sgline(ultimate3_cmd_sgline);
+ pmodule_cmd_unban(ultimate3_cmd_unban);
+ pmodule_cmd_svsmode_chan(ultimate3_cmd_svsmode_chan);
+ pmodule_cmd_svid_umode(ultimate3_cmd_svid_umode);
+ pmodule_cmd_nc_change(ultimate3_cmd_nc_change);
+ pmodule_cmd_svid_umode2(ultimate3_cmd_svid_umode2);
+ pmodule_cmd_svid_umode3(ultimate3_cmd_svid_umode3);
+ pmodule_cmd_svsjoin(ultimate3_cmd_svsjoin);
+ pmodule_cmd_svspart(ultimate3_cmd_svspart);
+ pmodule_cmd_swhois(ultimate3_cmd_swhois);
+ pmodule_cmd_eob(ultimate3_cmd_eob);
+ pmodule_flood_mode_check(ultiamte3_flood_mode_check);
+ pmodule_cmd_jupe(ultimate3_cmd_jupe);
+ pmodule_valid_nick(ultiamte3_valid_nick);
+ pmodule_valid_chan(ultiamte3_valid_chan);
+ pmodule_cmd_ctcp(ultimate3_cmd_ctcp);
+ pmodule_set_umode(ultimate3_set_umode);
+}
+
+/**
+ * Now tell anope how to use us.
+ **/
+int AnopeInit(int argc, char **argv)
+{
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion
+ ("$Id$");
+ moduleSetType(PROTOCOL);
+
+ pmodule_ircd_version("UltimateIRCd 3.0.0.a26+");
+ pmodule_ircd_cap(myIrcdcap);
+ pmodule_ircd_var(myIrcd);
+ pmodule_ircd_cbmodeinfos(myCbmodeinfos);
+ pmodule_ircd_cumodes(myCumodes);
+ pmodule_ircd_flood_mode_char_set("");
+ pmodule_ircd_flood_mode_char_remove("");
+ pmodule_ircd_cbmodes(myCbmodes);
+ pmodule_ircd_cmmodes(myCmmodes);
+ pmodule_ircd_csmodes(myCsmodes);
+ pmodule_ircd_useTSMode(0);
+
+ /** Deal with modes anope _needs_ to know **/
+ pmodule_invis_umode(UMODE_i);
+ pmodule_oper_umode(UMODE_o);
+ pmodule_invite_cmode(CMODE_i);
+ pmodule_secret_cmode(CMODE_s);
+ pmodule_private_cmode(CMODE_p);
+ pmodule_key_mode(CMODE_k);
+ pmodule_limit_mode(CMODE_l);
+
+ moduleAddAnopeCmds();
+ moduleAddIRCDMsgs();
+
+ return MOD_CONT;
+}
diff --git a/src/protocol/ultimate3.h b/src/protocol/ultimate3.h
new file mode 100644
index 000000000..cdff880c1
--- /dev/null
+++ b/src/protocol/ultimate3.h
@@ -0,0 +1,125 @@
+/* Ultimate IRCD 3.0 functions
+ *
+ * (C) 2003-2008 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.
+ *
+ *
+ */
+
+#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
+#define UMODE_0 0x00000080
+#define UMODE_Z 0x00000100 /* umode +Z - Services Root Admin */
+#define UMODE_S 0x00000200 /* umode +S - Services Client */
+#define UMODE_D 0x00000400 /* umode +D - has seen dcc warning message */
+#define UMODE_d 0x00000800 /* umode +d - user is deaf to channel messages */
+#define UMODE_W 0x00001000 /* umode +d - user is deaf to channel messages */
+#define UMODE_p 0x04000000
+#define UMODE_P 0x20000000 /* umode +P - Services Admin */
+#define UMODE_x 0x40000000
+#define UMODE_R 0x80000000
+
+
+#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
+#define CMODE_R 0x00000100 /* Only identified users can join */
+#define CMODE_r 0x00000200 /* Set for all registered channels */
+#define CMODE_c 0x00000400 /* Colors can't be used */
+#define CMODE_A 0x00000800
+#define CMODE_N 0x00001000
+#define CMODE_S 0x00002000
+#define CMODE_K 0x00004000
+#define CMODE_O 0x00008000 /* Only opers can join */
+#define CMODE_q 0x00010000 /* No Quit Reason */
+#define CMODE_M 0x00020000 /* Non-regged nicks can't send messages */
+
+#define DEFAULT_MLOCK CMODE_n | CMODE_t | CMODE_r
+
+void ultimate3_set_umode(User * user, int ac, char **av);
+void ultimate3_cmd_svsnoop(char *server, int set);
+void ultimate3_cmd_remove_akill(char *user, char *host);
+void ultimate3_cmd_topic(char *whosets, char *chan, char *whosetit, char *topic, time_t when);
+void ultimate3_cmd_vhost_off(User * u);
+void ultimate3_cmd_akill(char *user, char *host, char *who, time_t when,time_t expires, char *reason);
+void ultimate3_cmd_svskill(char *source, char *user, char *buf);
+void ultimate3_cmd_svsmode(User * u, int ac, char **av);
+void ultimate3_cmd_372(char *source, char *msg);
+void ultimate3_cmd_372_error(char *source);
+void ultimate3_cmd_375(char *source);
+void ultimate3_cmd_376(char *source);
+void ultimate3_cmd_nick(char *nick, char *name, char *modes);
+void ultimate3_cmd_guest_nick(char *nick, char *user, char *host, char *real, char *modes);
+void ultimate3_cmd_mode(char *source, char *dest, char *buf);
+void ultimate3_cmd_bot_nick(char *nick, char *user, char *host, char *real, char *modes);
+void ultimate3_cmd_kick(char *source, char *chan, char *user, char *buf);
+void ultimate3_cmd_notice_ops(char *source, char *dest, char *buf);
+void ultimate3_cmd_notice(char *source, char *dest, char *buf);
+void ultimate3_cmd_notice2(char *source, char *dest, char *msg);
+void ultimate3_cmd_privmsg(char *source, char *dest, char *buf);
+void ultimate3_cmd_privmsg2(char *source, char *dest, char *msg);
+void ultimate3_cmd_serv_notice(char *source, char *dest, char *msg);
+void ultimate3_cmd_serv_privmsg(char *source, char *dest, char *msg);
+void ultimate3_cmd_bot_chan_mode(char *nick, char *chan);
+void ultimate3_cmd_351(char *source);
+void ultimate3_cmd_quit(char *source, char *buf);
+void ultimate3_cmd_pong(char *servname, char *who);
+void ultimate3_cmd_join(char *user, char *channel, time_t chantime);
+void ultimate3_cmd_unsqline(char *user);
+void ultimate3_cmd_invite(char *source, char *chan, char *nick);
+void ultimate3_cmd_part(char *nick, char *chan, char *buf);
+void ultimate3_cmd_391(char *source, char *timestr);
+void ultimate3_cmd_250(char *buf);
+void ultimate3_cmd_307(char *buf);
+void ultimate3_cmd_311(char *buf);
+void ultimate3_cmd_312(char *buf);
+void ultimate3_cmd_317(char *buf);
+void ultimate3_cmd_219(char *source, char *letter);
+void ultimate3_cmd_401(char *source, char *who);
+void ultimate3_cmd_318(char *source, char *who);
+void ultimate3_cmd_242(char *buf);
+void ultimate3_cmd_243(char *buf);
+void ultimate3_cmd_211(char *buf);
+void ultimate3_cmd_global(char *source, char *buf);
+void ultimate3_cmd_global_legacy(char *source, char *fmt);
+void ultimate3_cmd_sqline(char *mask, char *reason);
+void ultimate3_cmd_squit(char *servname, char *message);
+void ultimate3_cmd_svso(char *source, char *nick, char *flag);
+void ultimate3_cmd_chg_nick(char *oldnick, char *newnick);
+void ultimate3_cmd_svsnick(char *source, char *guest, time_t when);
+void ultimate3_cmd_vhost_on(char *nick, char *vIdent, char *vhost);
+void ultimate3_cmd_connect(int servernum);
+void ultimate3_cmd_svshold(char *nick);
+void ultimate3_cmd_release_svshold(char *nick);
+void ultimate3_cmd_unsgline(char *mask);
+void ultimate3_cmd_unszline(char *mask);
+void ultimate3_cmd_szline(char *mask, char *reason, char *whom);
+void ultimate3_cmd_sgline(char *mask, char *reason);
+void ultimate3_cmd_unban(char *name, char *nick);
+void ultimate3_cmd_svsmode_chan(char *name, char *mode, char *nick);
+void ultimate3_cmd_svid_umode(char *nick, time_t ts);
+void ultimate3_cmd_nc_change(User * u);
+void ultimate3_cmd_svid_umode2(User * u, char *ts);
+void ultimate3_cmd_svid_umode3(User * u, char *ts);
+void ultimate3_cmd_eob();
+int ultimate3_flood_mode_check(char *value);
+void ultimate3_cmd_jupe(char *jserver, char *who, char *reason);
+int ultimate3_valid_nick(char *nick);
+void ultimate3_cmd_ctcp(char *source, char *dest, char *buf);
+
+
diff --git a/src/protocol/unreal31.c b/src/protocol/unreal31.c
new file mode 100644
index 000000000..08781ca0f
--- /dev/null
+++ b/src/protocol/unreal31.c
@@ -0,0 +1,1592 @@
+/* Unreal IRCD 3.1.x functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ *
+ */
+
+/*************************************************************************/
+
+#include "services.h"
+#include "pseudo.h"
+#include "unreal31.h"
+
+IRCDVar myIrcd[] = {
+ {"UnrealIRCd 3.1.x", /* ircd name */
+ "+oS", /* nickserv mode */
+ "+oS", /* chanserv mode */
+ "+oS", /* memoserv mode */
+ "+oS", /* hostserv mode */
+ "+ioS", /* operserv mode */
+ "+oS", /* botserv mode */
+ "+oS", /* helpserv mode */
+ "+iS", /* Dev/Null mode */
+ "+ioS", /* Global mode */
+ "+oS", /* nickserv alias mode */
+ "+oS", /* chanserv alias mode */
+ "+oS", /* memoserv alias mode */
+ "+ioS", /* hostserv alias mode */
+ "+ioS", /* operserv alias mode */
+ "+oS", /* botserv alias mode */
+ "+oS", /* helpserv alias mode */
+ "+iS", /* Dev/Null alias mode */
+ "+ioS", /* Global alias mode */
+ "+qS", /* Used by BotServ Bots */
+ 5, /* Chan Max Symbols */
+ "-cilmnpstuzACGHKNOQRSV", /* Modes to Remove */
+ "+ao", /* Channel Umode used by Botserv bots */
+ 1, /* SVSNICK */
+ 1, /* Vhost */
+ 1, /* Has Owner */
+ "+q", /* Mode to set for an owner */
+ "-q", /* Mode to unset for an owner */
+ "+a", /* Mode to set for channel admin */
+ "-a", /* Mode to unset for channel admin */
+ "+rd", /* Mode On Reg */
+ NULL, /* Mode on ID for Roots */
+ NULL, /* Mode on ID for Admins */
+ NULL, /* Mode on ID for Opers */
+ "-r+d", /* Mode on UnReg */
+ "-r+d", /* Mode on Nick Change */
+ 0, /* Supports SGlines */
+ 1, /* Supports SQlines */
+ 1, /* Supports SZlines */
+ 1, /* Supports Halfop +h */
+ 3, /* Number of server args */
+ 0, /* Join 2 Set */
+ 0, /* Join 2 Message */
+ 1, /* Has exceptions +e */
+ 1, /* TS Topic Forward */
+ 0, /* TS Topci Backward */
+ 0, /* Protected Umode */
+ 0, /* Has Admin */
+ 0, /* Chan SQlines */
+ 0, /* Quit on Kill */
+ 0, /* SVSMODE unban */
+ 1, /* Has Protect */
+ 1, /* Reverse */
+ 1, /* Chan Reg */
+ CMODE_r, /* Channel Mode */
+ 1, /* vidents */
+ 1, /* svshold */
+ 1, /* time stamp on mode */
+ 0, /* NICKIP */
+ 1, /* O:LINE */
+ 1, /* UMODE */
+ 1, /* VHOST ON NICK */
+ 1, /* Change RealName */
+ CMODE_K, /* No Knock */
+ CMODE_A, /* Admin Only */
+ DEFAULT_MLOCK, /* Default MLOCK */
+ UMODE_x, /* Vhost Mode */
+ 1, /* +f */
+ 1, /* +L */
+ CMODE_f,
+ CMODE_L,
+ 0,
+ 1, /* No Knock requires +i */
+ NULL, /* CAPAB Chan Modes */
+ 0, /* We support Unreal TOKENS */
+ 1, /* TOKENS are CASE inSensitive */
+ 0, /* TIME STAMPS are BASE64 */
+ 0, /* +I support */
+ 0, /* SJOIN ban char */
+ 0, /* SJOIN except char */
+ 0, /* SJOIN invite char */
+ 0, /* Can remove User Channel Modes with SVSMODE */
+ 0, /* Sglines are not enforced until user reconnects */
+ "x", /* vhost char */
+ 0, /* ts6 */
+ 1, /* support helper umode */
+ 0, /* p10 */
+ NULL, /* character set */
+ 0, /* reports sync state */
+ 0, /* CIDR channelbans */
+ }
+ ,
+ {NULL}
+};
+
+
+IRCDCAPAB myIrcdcap[] = {
+ {
+ CAPAB_NOQUIT, /* NOQUIT */
+ 0, /* TSMODE */
+ 0, /* UNCONNECT */
+ 0, /* NICKIP */
+ 0, /* SJOIN */
+ CAPAB_ZIP, /* ZIP */
+ 0, /* BURST */
+ 0, /* TS5 */
+ 0, /* TS3 */
+ 0, /* DKEY */
+ 0, /* PT4 */
+ 0, /* SCS */
+ 0, /* QS */
+ 0, /* UID */
+ 0, /* KNOCK */
+ 0, /* CLIENT */
+ 0, /* IPV6 */
+ 0, /* SSJ5 */
+ 0, /* SN2 */
+ CAPAB_TOKEN, /* TOKEN */
+ 0, /* VHOST */
+ CAPAB_SSJ3, /* SSJ3 */
+ CAPAB_NICK2, /* NICK2 */
+ CAPAB_UMODE2, /* UMODE2 */
+ CAPAB_VL, /* VL */
+ CAPAB_TLKEXT, /* TLKEXT */
+ 0, /* DODKEY */
+ 0, /* DOZIP */
+ 0,
+ 0, 0}
+};
+
+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,
+ 0,
+ 0,
+ 0,
+ 0, 0, 0, 0, 0, 0, 0,
+ 0,
+ 0, 0, 0, 0, 0,
+ 0, UMODE_a, 0, 0, 0, 0, 0,
+ UMODE_g,
+ UMODE_h, UMODE_i, 0, 0, 0, 0, 0, UMODE_o,
+ 0,
+ 0, UMODE_r, 0, 0, 0, 0, UMODE_w,
+ UMODE_x,
+ 0,
+ 0,
+ 0, 0, 0, 0, 0
+};
+
+
+char myCsmodes[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,
+ 'h', /* (37) % Channel halfops */
+ 0,
+ 0, 0, 0,
+ 'q',
+
+ '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, 'a', 0
+};
+
+CMMode myCmmodes[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},
+ {add_exception, del_exception},
+ {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}
+};
+
+
+
+CBMode myCbmodes[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},
+ {CMODE_A, CBM_NO_USER_MLOCK, NULL, NULL},
+ {0}, /* B */
+ {CMODE_C, 0, NULL, NULL}, /* C */
+ {0}, /* D */
+ {0}, /* E */
+ {0}, /* F */
+ {CMODE_G, 0, NULL, NULL}, /* G */
+ {CMODE_H, CBM_NO_USER_MLOCK, NULL, NULL},
+ {0}, /* I */
+ {0}, /* J */
+ {CMODE_K, 0, NULL, NULL}, /* K */
+ {CMODE_L, 0, set_redirect, cs_set_redirect},
+ {0}, /* M */
+ {CMODE_N, 0, NULL, NULL}, /* N */
+ {CMODE_O, CBM_NO_USER_MLOCK, NULL, NULL},
+ {0}, /* P */
+ {CMODE_Q, 0, NULL, NULL}, /* Q */
+ {CMODE_R, 0, NULL, NULL}, /* R */
+ {CMODE_S, 0, NULL, NULL}, /* S */
+ {0}, /* T */
+ {0}, /* U */
+ {CMODE_V, 0, NULL, NULL}, /* V */
+ {0}, /* W */
+ {0}, /* X */
+ {0}, /* Y */
+ {0}, /* Z */
+ {0}, {0}, {0}, {0}, {0}, {0},
+ {0}, /* a */
+ {0}, /* b */
+ {CMODE_c, 0, NULL, NULL},
+ {0}, /* d */
+ {0}, /* e */
+ {CMODE_f, 0, set_flood, cs_set_flood},
+ {0}, /* g */
+ {0}, /* h */
+ {CMODE_i, 0, NULL, NULL},
+ {0}, /* j */
+ {CMODE_k, 0, chan_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},
+ {0}, /* q */
+ {CMODE_r, CBM_NO_MLOCK, NULL, NULL},
+ {CMODE_s, 0, NULL, NULL},
+ {CMODE_t, 0, NULL, NULL},
+ {CMODE_u, 0, NULL, NULL},
+ {0}, /* v */
+ {0}, /* w */
+ {0}, /* x */
+ {0}, /* y */
+ {CMODE_z, 0, NULL, NULL},
+ {0}, {0}, {0}, {0}
+};
+
+CBModeInfo myCbmodeinfos[] = {
+ {'c', CMODE_c, 0, NULL, NULL},
+ {'f', CMODE_f, 0, get_flood, cs_get_flood},
+ {'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},
+ {'r', CMODE_r, 0, NULL, NULL},
+ {'s', CMODE_s, 0, NULL, NULL},
+ {'t', CMODE_t, 0, NULL, NULL},
+ {'u', CMODE_u, 0, NULL, NULL},
+ {'z', CMODE_z, 0, NULL, NULL},
+ {'A', CMODE_A, 0, NULL, NULL},
+ {'C', CMODE_C, 0, NULL, NULL},
+ {'G', CMODE_G, 0, NULL, NULL},
+ {'H', CMODE_H, 0, NULL, NULL},
+ {'K', CMODE_K, 0, NULL, NULL},
+ {'L', CMODE_L, 0, get_redirect, cs_get_redirect},
+ {'N', CMODE_N, 0, NULL, NULL},
+ {'O', CMODE_O, 0, NULL, NULL},
+ {'Q', CMODE_Q, 0, NULL, NULL},
+ {'R', CMODE_R, 0, NULL, NULL},
+ {'S', CMODE_S, 0, NULL, NULL},
+ {'V', CMODE_V, 0, NULL, NULL},
+ {0}
+};
+
+CUMode myCumodes[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},
+
+ {CUS_PROTECT, CUF_PROTECT_BOTSERV, check_valid_op},
+ {0}, /* b */
+ {0}, /* c */
+ {0}, /* d */
+ {0}, /* e */
+ {0}, /* f */
+ {0}, /* g */
+ {CUS_HALFOP, 0, check_valid_op},
+ {0}, /* i */
+ {0}, /* j */
+ {0}, /* k */
+ {0}, /* l */
+ {0}, /* m */
+ {0}, /* n */
+ {CUS_OP, CUF_PROTECT_BOTSERV, check_valid_op},
+ {0}, /* p */
+ {CUS_OWNER, 0, check_valid_op},
+ {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}
+};
+
+
+void unreal_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) {
+
+ /* This looks better, much better than "add ? (do_add) : (do_remove)".
+ * At least this is readable without paying much attention :) -GD
+ */
+ if (add)
+ user->mode |= umodes[(int) *modes];
+ else
+ user->mode &= ~umodes[(int) *modes];
+
+ switch (*modes++) {
+ case '+':
+ add = 1;
+ break;
+ case '-':
+ add = 0;
+ break;
+ case 'd':
+ if (ac == 0) {
+ break;
+ }
+
+ ac--;
+ av++;
+ user->svid = strtoul(*av, NULL, 0);
+ break;
+ case 'o':
+ if (add) {
+ opcnt++;
+ if (WallOper) {
+ anope_cmd_global(s_OperServ,
+ "\2%s\2 is now an IRC operator.",
+ user->nick);
+ }
+ display_news(user, NEWS_OPER);
+ } else {
+ opcnt--;
+ }
+ break;
+ case 'r':
+ if (add && !nick_identified(user)) {
+ common_svsmode(user, "-r", NULL);
+ user->mode &= ~UMODE_r;
+ }
+ break;
+ case 'x':
+ update_host(user);
+ break;
+ }
+ }
+}
+
+
+/* *INDENT-OFF* */
+void moduleAddIRCDMsgs(void) {
+ Message *m;
+
+ updateProtectDetails("PROTECT","PROTECTME","protect","deprotect","AUTOPROTECT","+a","-a");
+
+ m = createMessage("401", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("402", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("436", anope_event_436); addCoreMessage(IRCD,m);
+ m = createMessage("AWAY", anope_event_away); addCoreMessage(IRCD,m);
+ m = createMessage("INVITE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("JOIN", anope_event_join); addCoreMessage(IRCD,m);
+ m = createMessage("KICK", anope_event_kick); addCoreMessage(IRCD,m);
+ m = createMessage("KILL", anope_event_kill); addCoreMessage(IRCD,m);
+ m = createMessage("MODE", anope_event_mode); addCoreMessage(IRCD,m);
+ m = createMessage("MOTD", anope_event_motd); addCoreMessage(IRCD,m);
+ m = createMessage("NICK", anope_event_nick); addCoreMessage(IRCD,m);
+ m = createMessage("NOTICE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("PART", anope_event_part); addCoreMessage(IRCD,m);
+ m = createMessage("PASS", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("PING", anope_event_ping); addCoreMessage(IRCD,m);
+ m = createMessage("PRIVMSG", anope_event_privmsg); addCoreMessage(IRCD,m);
+ m = createMessage("QUIT", anope_event_quit); addCoreMessage(IRCD,m);
+ m = createMessage("SERVER", anope_event_server); addCoreMessage(IRCD,m);
+ m = createMessage("SQUIT", anope_event_squit); addCoreMessage(IRCD,m);
+ m = createMessage("TOPIC", anope_event_topic); addCoreMessage(IRCD,m);
+ m = createMessage("USER", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("WALLOPS", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("WHOIS", anope_event_whois); addCoreMessage(IRCD,m);
+ m = createMessage("AKILL", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("GLOBOPS", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("GNOTICE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("GOPER", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("RAKILL", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SILENCE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SVSKILL", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SVSMODE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SVSNICK", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SVSNOOP", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SQLINE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("UNSQLINE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("PROTOCTL", anope_event_capab); addCoreMessage(IRCD,m);
+ m = createMessage("CHGHOST", anope_event_chghost); addCoreMessage(IRCD,m);
+ m = createMessage("CHGIDENT", anope_event_chgident); addCoreMessage(IRCD,m);
+ m = createMessage("CHGNAME", anope_event_chgname); addCoreMessage(IRCD,m);
+ m = createMessage("NETINFO", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SETHOST", anope_event_sethost); addCoreMessage(IRCD,m);
+ m = createMessage("SETIDENT", anope_event_setident); addCoreMessage(IRCD,m);
+ m = createMessage("SETNAME", anope_event_setname); addCoreMessage(IRCD,m);
+ m = createMessage("REHASH", anope_event_rehash); addCoreMessage(IRCD,m);
+ m = createMessage("ADMIN", anope_event_admin); addCoreMessage(IRCD,m);
+ m = createMessage("CREDITS", anope_event_credits); addCoreMessage(IRCD,m);
+}
+
+/* *INDENT-ON* */
+
+/* Event: PROTOCTL */
+int anope_event_capab(char *source, int ac, char **av)
+{
+ capab_parse(ac, av);
+ return MOD_CONT;
+}
+
+void unreal_cmd_svsnoop(char *server, int set)
+{
+ send_cmd(NULL, "SVSNOOP %s %s", server, (set ? "+" : "-"));
+}
+
+void unreal_cmd_svsadmin(char *server, int set)
+{
+ unreal_cmd_svsnoop(server, set);
+}
+
+void unreal_cmd_remove_akill(char *user, char *host)
+{
+ send_cmd(NULL, "TKL - G %s %s %s", user, host, s_OperServ);
+}
+
+void unreal_cmd_topic(char *whosets, char *chan, char *whosetit,
+ char *topic, time_t when)
+{
+ send_cmd(whosets, "TOPIC %s %s %lu :%s", chan, whosetit,
+ (unsigned long int) when, topic);
+}
+
+void unreal_cmd_vhost_off(User * u)
+{
+ send_cmd(s_HostServ, "SVSMODE %s -xt", u->nick);
+ notice_lang(s_HostServ, u, HOST_OFF_UNREAL, u->nick, ircd->vhostchar);
+}
+
+void unreal_cmd_akill(char *user, char *host, char *who, time_t when,
+ time_t expires, char *reason)
+{
+ send_cmd(NULL, "TKL + G %s %s %s %ld %ld :%s", user, host, who,
+ (long int) time(NULL) + 86400 * 2, (long int) when, reason);
+}
+
+void unreal_cmd_svskill(char *source, char *user, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ if (!source || !user) {
+ return;
+ }
+
+ send_cmd(source, "SVSKILL %s :%s", user, buf);
+}
+
+void unreal_cmd_svsmode(User * u, int ac, char **av)
+{
+ send_cmd(ServerName, "SVSMODE %s %s%s%s", u->nick, av[0],
+ (ac == 2 ? " " : ""), (ac == 2 ? av[1] : ""));
+}
+
+
+void unreal_cmd_372(char *source, char *msg)
+{
+ send_cmd(ServerName, "372 %s :- %s", source, msg);
+}
+
+void unreal_cmd_372_error(char *source)
+{
+ send_cmd(ServerName, "422 %s :- MOTD file not found! Please "
+ "contact your IRC administrator.", source);
+}
+
+void unreal_cmd_375(char *source)
+{
+ send_cmd(ServerName, "375 %s :- %s Message of the Day",
+ source, ServerName);
+}
+
+void unreal_cmd_376(char *source)
+{
+ send_cmd(ServerName, "376 %s :End of /MOTD command.", source);
+}
+
+void unreal_cmd_nick(char *nick, char *name, char *modes)
+{
+ EnforceQlinedNick(nick, NULL);
+ send_cmd(NULL, "NICK %s 1 %ld %s %s %s 0 %s * :%s", nick,
+ (long int) time(NULL), ServiceUser, ServiceHost, ServerName,
+ modes, name);
+ unreal_cmd_sqline(nick, "Reserved for services");
+}
+
+void unreal_cmd_guest_nick(char *nick, char *user, char *host, char *real,
+ char *modes)
+{
+ send_cmd(NULL, "NICK %s 1 %ld %s %s %s 0 %s * :%s", nick,
+ (long int) time(NULL), user, host, ServerName, modes, real);
+}
+
+void unreal_cmd_mode(char *source, char *dest, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(source, "MODE %s %s", dest, buf);
+}
+
+void unreal_cmd_bot_nick(char *nick, char *user, char *host, char *real,
+ char *modes)
+{
+ EnforceQlinedNick(nick, s_BotServ);
+ send_cmd(NULL, "NICK %s 1 %ld %s %s %s 0 %s * :%s", nick,
+ (long int) time(NULL), user, host, ServerName, modes, real);
+ unreal_cmd_sqline(nick, "Reserved for services");
+}
+
+void unreal_cmd_kick(char *source, char *chan, char *user, char *buf)
+{
+ if (buf) {
+ send_cmd(source, "KICK %s %s :%s", chan, user, buf);
+ } else {
+ send_cmd(source, "KICK %s %s", chan, user);
+ }
+}
+
+void unreal_cmd_notice_ops(char *source, char *dest, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "NOTICE @%s :%s", dest, buf);
+}
+
+
+void unreal_cmd_notice(char *source, char *dest, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ if (NSDefFlags & NI_MSG) {
+ unreal_cmd_privmsg2(source, dest, buf);
+ } else {
+ send_cmd(source, "NOTICE %s :%s", dest, buf);
+ }
+}
+
+void unreal_cmd_notice2(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "NOTICE %s :%s", dest, msg);
+}
+
+void unreal_cmd_privmsg(char *source, char *dest, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(source, "PRIVMSG %s :%s", dest, buf);
+}
+
+void unreal_cmd_privmsg2(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "PRIVMSG %s :%s", dest, msg);
+}
+
+void unreal_cmd_serv_notice(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "NOTICE $%s :%s", dest, msg);
+}
+
+void unreal_cmd_serv_privmsg(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "PRIVMSG $%s :%s", dest, msg);
+}
+
+
+void unreal_cmd_bot_chan_mode(char *nick, char *chan)
+{
+ anope_cmd_mode(nick, chan, "%s %s %s", ircd->botchanumode, nick, nick);
+}
+
+void unreal_cmd_351(char *source)
+{
+ send_cmd(ServerName, "351 %s Anope-%s %s :%s - %s (%s) -- %s",
+ source, version_number, ServerName, ircd->name, version_flags,
+ EncModule, version_build);
+}
+
+/* QUIT */
+void unreal_cmd_quit(char *source, char *buf)
+{
+ if (buf) {
+ send_cmd(source, "QUIT :%s", buf);
+ } else {
+ send_cmd(source, "QUIT");
+ }
+}
+
+/* PROTOCTL */
+void unreal_cmd_protoctl()
+{
+ /*
+ See Unreal's protoctl.txt for reference
+ VHP - Send hostnames in NICKv2 even if not sethosted
+ */
+ send_cmd(NULL, "PROTOCTL NICKv2 VHP");
+}
+
+/* PASS */
+void unreal_cmd_pass(char *pass)
+{
+ send_cmd(NULL, "PASS :%s", pass);
+}
+
+/* SERVER name hop descript */
+/* Unreal 3.2 actually sends some info about itself in the descript area */
+void unreal_cmd_server(char *servname, int hop, char *descript)
+{
+ send_cmd(NULL, "SERVER %s %d :%s", servname, hop, descript);
+}
+
+/* PONG */
+void unreal_cmd_pong(char *servname, char *who)
+{
+ send_cmd(servname, "PONG %s", who);
+}
+
+/* JOIN */
+/* Althought Unreal 3.2 does not need the timestamp others do so
+ we get it in the common function call */
+void unreal_cmd_join(char *user, char *channel, time_t chantime)
+{
+ send_cmd(user, "JOIN %s", channel);
+}
+
+/* UNSQLINE */
+void unreal_cmd_unsqline(char *user)
+{
+ if (!user) {
+ return;
+ }
+ send_cmd(NULL, "UNSQLINE %s", user);
+}
+
+/* CHGHOST */
+void unreal_cmd_chghost(char *nick, char *vhost)
+{
+ if (!nick || !vhost) {
+ return;
+ }
+ send_cmd(ServerName, "CHGHOST %s %s", nick, vhost);
+}
+
+/* CHGIDENT */
+void unreal_cmd_chgident(char *nick, char *vIdent)
+{
+ if (!nick || !vIdent) {
+ return;
+ }
+ send_cmd(ServerName, "CHGIDENT %s %s", nick, vIdent);
+}
+
+/* INVITE */
+void unreal_cmd_invite(char *source, char *chan, char *nick)
+{
+ if (!source || !chan || !nick) {
+ return;
+ }
+
+ send_cmd(source, "INVITE %s %s", nick, chan);
+}
+
+/* PART */
+void unreal_cmd_part(char *nick, char *chan, char *buf)
+{
+ if (!nick || !chan) {
+ return;
+ }
+
+ if (buf) {
+ send_cmd(nick, "PART %s :%s", chan, buf);
+ } else {
+ send_cmd(nick, "PART %s", chan);
+ }
+}
+
+/* 391 */
+void unreal_cmd_391(char *source, char *timestr)
+{
+ if (!timestr) {
+ return;
+ }
+ send_cmd(NULL, "391 :%s %s :%s", source, ServerName, timestr);
+}
+
+/* 250 */
+void unreal_cmd_250(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "250 %s", buf);
+}
+
+/* 307 */
+void unreal_cmd_307(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "307 %s", buf);
+}
+
+/* 311 */
+void unreal_cmd_311(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "311 %s", buf);
+}
+
+/* 312 */
+void unreal_cmd_312(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "312 %s", buf);
+}
+
+/* 317 */
+void unreal_cmd_317(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "317 %s", buf);
+}
+
+/* 219 */
+void unreal_cmd_219(char *source, char *letter)
+{
+ if (!source) {
+ return;
+ }
+
+ if (letter) {
+ send_cmd(NULL, "219 %s %c :End of /STATS report.", source,
+ *letter);
+ } else {
+ send_cmd(NULL, "219 %s l :End of /STATS report.", source);
+ }
+}
+
+/* 401 */
+void unreal_cmd_401(char *source, char *who)
+{
+ if (!source || !who) {
+ return;
+ }
+ send_cmd(ServerName, "401 %s %s :No such service.", source, who);
+}
+
+/* 318 */
+void unreal_cmd_318(char *source, char *who)
+{
+ if (!source || !who) {
+ return;
+ }
+
+ send_cmd(ServerName, "318 %s %s :End of /WHOIS list.", source, who);
+}
+
+/* 242 */
+void unreal_cmd_242(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "242 %s", buf);
+}
+
+/* 243 */
+void unreal_cmd_243(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "243 %s", buf);
+}
+
+/* 211 */
+void unreal_cmd_211(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "211 %s", buf);
+}
+
+/* GLOBOPS */
+void unreal_cmd_global(char *source, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(source ? source : ServerName, "GLOBOPS :%s", buf);
+}
+
+/* SQLINE */
+void unreal_cmd_sqline(char *mask, char *reason)
+{
+ if (!mask || !reason) {
+ return;
+ }
+
+ send_cmd(NULL, "SQLINE %s :%s", mask, reason);
+}
+
+/* SQUIT */
+void unreal_cmd_squit(char *servname, char *message)
+{
+ if (!servname || !message) {
+ return;
+ }
+
+ send_cmd(NULL, "SQUIT %s :%s", servname, message);
+}
+
+/* SVSO */
+void unreal_cmd_svso(char *source, char *nick, char *flag)
+{
+ if (!source || !nick || !flag) {
+ return;
+ }
+
+ send_cmd(source, "SVSO %s %s", nick, flag);
+}
+
+/* NICK <newnick> */
+void unreal_cmd_chg_nick(char *oldnick, char *newnick)
+{
+ if (!oldnick || !newnick) {
+ return;
+ }
+
+ send_cmd(oldnick, "NICK %s", newnick);
+}
+
+/* SVSNICK */
+void unreal_cmd_svsnick(char *source, char *guest, time_t when)
+{
+ if (!source || !guest) {
+ return;
+ }
+ send_cmd(NULL, "SVSNICK %s %s :%ld", source, guest, (long int) when);
+}
+
+/* Functions that use serval cmd functions */
+
+void unreal_cmd_vhost_on(char *nick, char *vIdent, char *vhost)
+{
+ if (!nick) {
+ return;
+ }
+ if (vIdent) {
+ unreal_cmd_chgident(nick, vIdent);
+ }
+ unreal_cmd_chghost(nick, vhost);
+}
+
+void unreal_cmd_connect(int servernum)
+{
+ me_server =
+ new_server(NULL, ServerName, ServerDesc, SERVER_ISME, NULL);
+
+ unreal_cmd_protoctl();
+ if (servernum == 1) {
+ unreal_cmd_pass(RemotePassword);
+ }
+ if (servernum == 2) {
+ unreal_cmd_pass(RemotePassword2);
+ }
+ if (servernum == 3) {
+ unreal_cmd_pass(RemotePassword3);
+ }
+ unreal_cmd_server(ServerName, 1, ServerDesc);
+}
+
+/* Events */
+
+int anope_event_ping(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+ unreal_cmd_pong(ac > 1 ? av[1] : ServerName, av[0]);
+ return MOD_CONT;
+}
+
+int anope_event_436(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+
+ m_nickcoll(av[0]);
+ return MOD_CONT;
+}
+
+int anope_event_away(char *source, int ac, char **av)
+{
+ if (!source) {
+ return MOD_CONT;
+ }
+ m_away(source, (ac ? av[0] : NULL));
+ return MOD_CONT;
+}
+
+int anope_event_topic(char *source, int ac, char **av)
+{
+ if (ac != 4)
+ return MOD_CONT;
+ do_topic(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_squit(char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+ do_squit(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_quit(char *source, int ac, char **av)
+{
+ if (ac != 1)
+ return MOD_CONT;
+ do_quit(source, ac, av);
+ return MOD_CONT;
+}
+
+
+int anope_event_mode(char *source, int ac, char **av)
+{
+ if (ac < 2)
+ return MOD_CONT;
+
+ if (*av[0] == '#' || *av[0] == '&') {
+ do_cmode(source, ac, av);
+ } else {
+ do_umode(source, ac, av);
+ }
+ return MOD_CONT;
+}
+
+
+int anope_event_kill(char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+
+ m_kill(av[0], av[1]);
+ return MOD_CONT;
+}
+
+int anope_event_kick(char *source, int ac, char **av)
+{
+ if (ac != 3)
+ return MOD_CONT;
+ do_kick(source, ac, av);
+ return MOD_CONT;
+}
+
+
+int anope_event_join(char *source, int ac, char **av)
+{
+ if (ac != 1)
+ return MOD_CONT;
+ do_join(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_motd(char *source, int ac, char **av)
+{
+ if (!source) {
+ return MOD_CONT;
+ }
+
+ m_motd(source);
+ return MOD_CONT;
+}
+
+int anope_event_setname(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 1)
+ return MOD_CONT;
+
+ u = finduser(source);
+ if (!u) {
+ if (debug) {
+ alog("debug: SETNAME for nonexistent user %s", source);
+ }
+ return MOD_CONT;
+ }
+
+ change_user_realname(u, av[0]);
+ return MOD_CONT;
+}
+
+int anope_event_chgname(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 2)
+ return MOD_CONT;
+
+ u = finduser(av[0]);
+ if (!u) {
+ if (debug) {
+ alog("debug: CHGNAME for nonexistent user %s", av[0]);
+ }
+ return MOD_CONT;
+ }
+
+ change_user_realname(u, av[1]);
+ return MOD_CONT;
+}
+
+int anope_event_setident(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 1)
+ return MOD_CONT;
+
+ u = finduser(source);
+ if (!u) {
+ if (debug) {
+ alog("debug: SETIDENT for nonexistent user %s", source);
+ }
+ return MOD_CONT;
+ }
+
+ change_user_username(u, av[0]);
+ return MOD_CONT;
+}
+int anope_event_chgident(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 2)
+ return MOD_CONT;
+
+ u = finduser(av[0]);
+ if (!u) {
+ if (debug) {
+ alog("debug: CHGIDENT for nonexistent user %s", av[0]);
+ }
+ return MOD_CONT;
+ }
+
+ change_user_username(u, av[1]);
+ return MOD_CONT;
+}
+
+int anope_event_sethost(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 1)
+ return MOD_CONT;
+
+ u = finduser(source);
+ if (!u) {
+ if (debug) {
+ alog("debug: SETHOST for nonexistent user %s", source);
+ }
+ return MOD_CONT;
+ }
+
+ change_user_host(u, av[0]);
+ return MOD_CONT;
+}
+
+
+int anope_event_nick(char *source, int ac, char **av)
+{
+ User *user;
+
+ if (ac != 2) {
+ if (ac == 7) {
+ /*
+ <codemastr> that was a bug that is now fixed in 3.2.1
+ <codemastr> in some instances it would use the non-nickv2 format
+ <codemastr> it's sent when a nick collision occurs
+ - so we have to leave it around for now -TSL
+ */
+ do_nick(source, av[0], av[3], av[4], av[5], av[6],
+ strtoul(av[2], NULL, 10), 0, 0, "*", NULL);
+ } else {
+ user = do_nick(source, av[0], av[3], av[4], av[5], av[9],
+ strtoul(av[2], NULL, 10), strtoul(av[6], NULL,
+ 0), 0, av[8],
+ NULL);
+ if (user)
+ anope_set_umode(user, 1, &av[7]);
+ }
+ } else {
+ do_nick(source, av[0], NULL, NULL, NULL, NULL,
+ strtoul(av[1], NULL, 10), 0, 0, NULL, NULL);
+ }
+ return MOD_CONT;
+}
+
+
+int anope_event_chghost(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 2)
+ return MOD_CONT;
+
+ u = finduser(av[0]);
+ if (!u) {
+ if (debug) {
+ alog("debug: CHGHOST for nonexistent user %s", av[0]);
+ }
+ return MOD_CONT;
+ }
+
+ change_user_host(u, av[1]);
+ return MOD_CONT;
+}
+
+/* EVENT: SERVER */
+int anope_event_server(char *source, int ac, char **av)
+{
+ if (!stricmp(av[1], "1")) {
+ uplink = sstrdup(av[0]);
+ }
+ do_server(source, av[0], av[1], av[2], NULL);
+ return MOD_CONT;
+}
+
+
+int anope_event_privmsg(char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+ m_privmsg(source, av[0], av[1]);
+ return MOD_CONT;
+}
+
+int anope_event_part(char *source, int ac, char **av)
+{
+ if (ac < 1 || ac > 2)
+ return MOD_CONT;
+ do_part(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_whois(char *source, int ac, char **av)
+{
+ if (source && ac >= 1) {
+ m_whois(source, av[0]);
+ }
+ return MOD_CONT;
+}
+
+/* SVSHOLD - set */
+void unreal_cmd_svshold(char *nick)
+{
+ /* Not supported by this IRCD */
+}
+
+/* SVSHOLD - release */
+void unreal_cmd_release_svshold(char *nick)
+{
+ /* Not Supported by this IRCD */
+}
+
+/* UNSGLINE */
+void unreal_cmd_unsgline(char *mask)
+{
+ /* Not Supported by this IRCD */
+}
+
+/* UNSZLINE */
+void unreal_cmd_unszline(char *mask)
+{
+ send_cmd(NULL, "%s - Z * %s %s", send_token("TKL", "BD"), mask,
+ s_OperServ);
+}
+
+/* SZLINE */
+void unreal_cmd_szline(char *mask, char *reason, char *whom)
+{
+ send_cmd(NULL, "%s + Z * %s %s %ld %ld :%s", send_token("TKL", "BD"),
+ mask, whom, (long int) time(NULL) + 86400 * 2,
+ (long int) time(NULL), reason);
+}
+
+/* SGLINE */
+void unreal_cmd_sgline(char *mask, char *reason)
+{
+ /* Not Supported by this IRCD */
+}
+
+void unreal_cmd_unban(char *name, char *nick)
+{
+ /* Not Supported by this IRCD */
+}
+
+/* SVSMODE channel modes */
+
+void unreal_cmd_svsmode_chan(char *name, char *mode, char *nick)
+{
+ /* Not Supported by this IRCD */
+}
+
+
+/* SVSMODE +d */
+/* sent if svid is something weird */
+void unreal_cmd_svid_umode(char *nick, time_t ts)
+{
+ send_cmd(ServerName, "SVSMODE %s +d 1", nick);
+}
+
+/* SVSMODE +d */
+/* nc_change was = 1, and there is no na->status */
+void unreal_cmd_nc_change(User * u)
+{
+ common_svsmode(u, "-r+d", "1");
+}
+
+/* SVSMODE +r */
+void unreal_cmd_svid_umode2(User * u, char *ts)
+{
+ if (u->svid != u->timestamp) {
+ common_svsmode(u, "+rd", ts);
+ } else {
+ common_svsmode(u, "+r", NULL);
+ }
+}
+
+void unreal_cmd_svid_umode3(User * u, char *ts)
+{
+ /* not used */
+}
+
+/* svsjoin
+ parv[0] - sender
+ parv[1] - nick to make join
+ parv[2] - channel(s) to join
+ parv[3] - (optional) channel key(s)
+*/
+void unreal_cmd_svsjoin(char *source, char *nick, char *chan, char *param)
+{
+ if (param) {
+ send_cmd(source, "SVSJOIN %s %s :%s", nick, chan, param);
+ } else {
+ send_cmd(source, "SVSJOIN %s :%s", nick, chan);
+ }
+}
+
+/* svspart
+ parv[0] - sender
+ parv[1] - nick to make part
+ parv[2] - channel(s) to part
+*/
+void unreal_cmd_svspart(char *source, char *nick, char *chan)
+{
+ send_cmd(source, "SVSPART %s :%s", nick, chan);
+}
+
+void unreal_cmd_swhois(char *source, char *who, char *mask)
+{
+ /* Can anyone tell me if 3.1 has this? */
+}
+
+void unreal_cmd_eob()
+{
+ /* Can anyone tell me if 3.1 has this? */
+}
+
+
+int anope_event_rehash(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_credits(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_admin(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int unreal_flood_mode_check(char *value)
+{
+ char *dp, *end;
+
+ if (value && *value != ':'
+ && (strtoul((*value == '*' ? value + 1 : value), &dp, 10) > 0)
+ && (*dp == ':') && (*(++dp) != 0) && (strtoul(dp, &end, 10) > 0)
+ && (*end == 0)) {
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
+void unreal_cmd_jupe(char *jserver, char *who, char *reason)
+{
+ char rbuf[256];
+
+ snprintf(rbuf, sizeof(rbuf), "Juped by %s%s%s", who,
+ reason ? ": " : "", reason ? reason : "");
+
+ if (findserver(servlist, jserver))
+ unreal_cmd_squit(jserver, rbuf);
+ unreal_cmd_server(jserver, 2, rbuf);
+ new_server(me_server, jserver, rbuf, SERVER_JUPED, NULL);
+}
+
+/* GLOBOPS - to handle old WALLOPS */
+void unreal_cmd_global_legacy(char *source, char *fmt)
+{
+ send_cmd(source ? source : ServerName, "%s :%s",
+ send_token("GLOBOPS", "]"), fmt);
+}
+
+/*
+ 1 = valid nick
+ 0 = nick is in valid
+*/
+int unreal_valid_nick(char *nick)
+{
+ if (!stricmp("ircd", nick)) {
+ return 0;
+ }
+ if (!stricmp("irc", nick)) {
+ return 0;
+ }
+ return 1;
+}
+
+int unreal_valid_chan(char *chan) {
+ if (strchr(chan, ':')) {
+ return 0;
+ }
+ return 1;
+}
+
+void unreal_cmd_ctcp(char *source, char *dest, char *buf)
+{
+ char *s;
+
+ if (!buf) {
+ return;
+ } else {
+ s = normalizeBuffer(buf);
+ }
+
+ send_cmd(source, "NOTICE %s :\1%s \1", dest, s);
+ free(s);
+}
+
+
+/**
+ * Tell anope which function we want to perform each task inside of anope.
+ * These prototypes must match what anope expects.
+ **/
+void moduleAddAnopeCmds()
+{
+ pmodule_cmd_svsnoop(unreal_cmd_svsnoop);
+ pmodule_cmd_remove_akill(unreal_cmd_remove_akill);
+ pmodule_cmd_topic(unreal_cmd_topic);
+ pmodule_cmd_vhost_off(unreal_cmd_vhost_off);
+ pmodule_cmd_akill(unreal_cmd_akill);
+ pmodule_cmd_svskill(unreal_cmd_svskill);
+ pmodule_cmd_svsmode(unreal_cmd_svsmode);
+ pmodule_cmd_372(unreal_cmd_372);
+ pmodule_cmd_372_error(unreal_cmd_372_error);
+ pmodule_cmd_375(unreal_cmd_375);
+ pmodule_cmd_376(unreal_cmd_376);
+ pmodule_cmd_nick(unreal_cmd_nick);
+ pmodule_cmd_guest_nick(unreal_cmd_guest_nick);
+ pmodule_cmd_mode(unreal_cmd_mode);
+ pmodule_cmd_bot_nick(unreal_cmd_bot_nick);
+ pmodule_cmd_kick(unreal_cmd_kick);
+ pmodule_cmd_notice_ops(unreal_cmd_notice_ops);
+ pmodule_cmd_notice(unreal_cmd_notice);
+ pmodule_cmd_notice2(unreal_cmd_notice2);
+ pmodule_cmd_privmsg(unreal_cmd_privmsg);
+ pmodule_cmd_privmsg2(unreal_cmd_privmsg2);
+ pmodule_cmd_serv_notice(unreal_cmd_serv_notice);
+ pmodule_cmd_serv_privmsg(unreal_cmd_serv_privmsg);
+ pmodule_cmd_bot_chan_mode(unreal_cmd_bot_chan_mode);
+ pmodule_cmd_351(unreal_cmd_351);
+ pmodule_cmd_quit(unreal_cmd_quit);
+ pmodule_cmd_pong(unreal_cmd_pong);
+ pmodule_cmd_join(unreal_cmd_join);
+ pmodule_cmd_unsqline(unreal_cmd_unsqline);
+ pmodule_cmd_invite(unreal_cmd_invite);
+ pmodule_cmd_part(unreal_cmd_part);
+ pmodule_cmd_391(unreal_cmd_391);
+ pmodule_cmd_250(unreal_cmd_250);
+ pmodule_cmd_307(unreal_cmd_307);
+ pmodule_cmd_311(unreal_cmd_311);
+ pmodule_cmd_312(unreal_cmd_312);
+ pmodule_cmd_317(unreal_cmd_317);
+ pmodule_cmd_219(unreal_cmd_219);
+ pmodule_cmd_401(unreal_cmd_401);
+ pmodule_cmd_318(unreal_cmd_318);
+ pmodule_cmd_242(unreal_cmd_242);
+ pmodule_cmd_243(unreal_cmd_243);
+ pmodule_cmd_211(unreal_cmd_211);
+ pmodule_cmd_global(unreal_cmd_global);
+ pmodule_cmd_global_legacy(unreal_cmd_global_legacy);
+ pmodule_cmd_sqline(unreal_cmd_sqline);
+ pmodule_cmd_squit(unreal_cmd_squit);
+ pmodule_cmd_svso(unreal_cmd_svso);
+ pmodule_cmd_chg_nick(unreal_cmd_chg_nick);
+ pmodule_cmd_svsnick(unreal_cmd_svsnick);
+ pmodule_cmd_vhost_on(unreal_cmd_vhost_on);
+ pmodule_cmd_connect(unreal_cmd_connect);
+ pmodule_cmd_svshold(unreal_cmd_svshold);
+ pmodule_cmd_release_svshold(unreal_cmd_release_svshold);
+ pmodule_cmd_unsgline(unreal_cmd_unsgline);
+ pmodule_cmd_unszline(unreal_cmd_unszline);
+ pmodule_cmd_szline(unreal_cmd_szline);
+ pmodule_cmd_sgline(unreal_cmd_sgline);
+ pmodule_cmd_unban(unreal_cmd_unban);
+ pmodule_cmd_svsmode_chan(unreal_cmd_svsmode_chan);
+ pmodule_cmd_svid_umode(unreal_cmd_svid_umode);
+ pmodule_cmd_nc_change(unreal_cmd_nc_change);
+ pmodule_cmd_svid_umode2(unreal_cmd_svid_umode2);
+ pmodule_cmd_svid_umode3(unreal_cmd_svid_umode3);
+ pmodule_cmd_svsjoin(unreal_cmd_svsjoin);
+ pmodule_cmd_svspart(unreal_cmd_svspart);
+ pmodule_cmd_swhois(unreal_cmd_swhois);
+ pmodule_cmd_eob(unreal_cmd_eob);
+ pmodule_flood_mode_check(unreal_flood_mode_check);
+ pmodule_cmd_jupe(unreal_cmd_jupe);
+ pmodule_valid_nick(unreal_valid_nick);
+ pmodule_valid_chan(unreal_valid_chan);
+ pmodule_cmd_ctcp(unreal_cmd_ctcp);
+ pmodule_set_umode(unreal_set_umode);
+}
+
+/**
+ * Now tell anope how to use us.
+ **/
+int AnopeInit(int argc, char **argv)
+{
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(PROTOCOL);
+
+ pmodule_ircd_version("UnrealIRCd 3.1.1+");
+ pmodule_ircd_cap(myIrcdcap);
+ pmodule_ircd_var(myIrcd);
+ pmodule_ircd_cbmodeinfos(myCbmodeinfos);
+ pmodule_ircd_cumodes(myCumodes);
+ pmodule_ircd_flood_mode_char_set("+f");
+ pmodule_ircd_flood_mode_char_remove("-f");
+ pmodule_ircd_cbmodes(myCbmodes);
+ pmodule_ircd_cmmodes(myCmmodes);
+ pmodule_ircd_csmodes(myCsmodes);
+ pmodule_ircd_useTSMode(0);
+
+ /** Deal with modes anope _needs_ to know **/
+ pmodule_invis_umode(UMODE_i);
+ pmodule_oper_umode(UMODE_o);
+ pmodule_invite_cmode(CMODE_i);
+ pmodule_secret_cmode(CMODE_s);
+ pmodule_private_cmode(CMODE_p);
+ pmodule_key_mode(CMODE_k);
+ pmodule_limit_mode(CMODE_l);
+
+ moduleAddAnopeCmds();
+ moduleAddIRCDMsgs();
+
+ return MOD_CONT;
+}
diff --git a/src/protocol/unreal31.h b/src/protocol/unreal31.h
new file mode 100644
index 000000000..21ace9b86
--- /dev/null
+++ b/src/protocol/unreal31.h
@@ -0,0 +1,124 @@
+/* Unreal IRCD 3.1.x functions
+ *
+ * (C) 2003-2008 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.
+ *
+ *
+ */
+
+/*************************************************************************/
+
+#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
+#define UMODE_g 0x80000000
+#define UMODE_x 0x40000000
+
+#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
+#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
+#define CMODE_R 0x00000100 /* Only identified users can join */
+#define CMODE_r 0x00000200 /* Set for all registered channels */
+
+#define DEFAULT_MLOCK CMODE_n | CMODE_t | CMODE_r
+
+void unreal_set_umode(User * user, int ac, char **av);
+void unreal_cmd_svsnoop(char *server, int set);
+void unreal_cmd_remove_akill(char *user, char *host);
+void unreal_cmd_topic(char *whosets, char *chan, char *whosetit, char *topic, time_t when);
+void unreal_cmd_vhost_off(User * u);
+void unreal_cmd_akill(char *user, char *host, char *who, time_t when,time_t expires, char *reason);
+void unreal_cmd_svskill(char *source, char *user, char *buf);
+void unreal_cmd_svsmode(User * u, int ac, char **av);
+void unreal_cmd_372(char *source, char *msg);
+void unreal_cmd_372_error(char *source);
+void unreal_cmd_375(char *source);
+void unreal_cmd_376(char *source);
+void unreal_cmd_nick(char *nick, char *name, char *modes);
+void unreal_cmd_guest_nick(char *nick, char *user, char *host, char *real, char *modes);
+void unreal_cmd_mode(char *source, char *dest, char *buf);
+void unreal_cmd_bot_nick(char *nick, char *user, char *host, char *real, char *modes);
+void unreal_cmd_kick(char *source, char *chan, char *user, char *buf);
+void unreal_cmd_notice_ops(char *source, char *dest, char *buf);
+void unreal_cmd_notice(char *source, char *dest, char *buf);
+void unreal_cmd_notice2(char *source, char *dest, char *msg);
+void unreal_cmd_privmsg(char *source, char *dest, char *buf);
+void unreal_cmd_privmsg2(char *source, char *dest, char *msg);
+void unreal_cmd_serv_notice(char *source, char *dest, char *msg);
+void unreal_cmd_serv_privmsg(char *source, char *dest, char *msg);
+void unreal_cmd_bot_chan_mode(char *nick, char *chan);
+void unreal_cmd_351(char *source);
+void unreal_cmd_quit(char *source, char *buf);
+void unreal_cmd_pong(char *servname, char *who);
+void unreal_cmd_join(char *user, char *channel, time_t chantime);
+void unreal_cmd_unsqline(char *user);
+void unreal_cmd_invite(char *source, char *chan, char *nick);
+void unreal_cmd_part(char *nick, char *chan, char *buf);
+void unreal_cmd_391(char *source, char *timestr);
+void unreal_cmd_250(char *buf);
+void unreal_cmd_307(char *buf);
+void unreal_cmd_311(char *buf);
+void unreal_cmd_312(char *buf);
+void unreal_cmd_317(char *buf);
+void unreal_cmd_219(char *source, char *letter);
+void unreal_cmd_401(char *source, char *who);
+void unreal_cmd_318(char *source, char *who);
+void unreal_cmd_242(char *buf);
+void unreal_cmd_243(char *buf);
+void unreal_cmd_211(char *buf);
+void unreal_cmd_global(char *source, char *buf);
+void unreal_cmd_global_legacy(char *source, char *fmt);
+void unreal_cmd_sqline(char *mask, char *reason);
+void unreal_cmd_squit(char *servname, char *message);
+void unreal_cmd_svso(char *source, char *nick, char *flag);
+void unreal_cmd_chg_nick(char *oldnick, char *newnick);
+void unreal_cmd_svsnick(char *source, char *guest, time_t when);
+void unreal_cmd_vhost_on(char *nick, char *vIdent, char *vhost);
+void unreal_cmd_connect(int servernum);
+void unreal_cmd_svshold(char *nick);
+void unreal_cmd_release_svshold(char *nick);
+void unreal_cmd_unsgline(char *mask);
+void unreal_cmd_unszline(char *mask);
+void unreal_cmd_szline(char *mask, char *reason, char *whom);
+void unreal_cmd_sgline(char *mask, char *reason);
+void unreal_cmd_unban(char *name, char *nick);
+void unreal_cmd_svsmode_chan(char *name, char *mode, char *nick);
+void unreal_cmd_svid_umode(char *nick, time_t ts);
+void unreal_cmd_nc_change(User * u);
+void unreal_cmd_svid_umode2(User * u, char *ts);
+void unreal_cmd_svid_umode3(User * u, char *ts);
+void unreal_cmd_eob();
+int unreal_flood_mode_check(char *value);
+void unreal_cmd_jupe(char *jserver, char *who, char *reason);
+int unreal_valid_nick(char *nick);
+void unreal_cmd_ctcp(char *source, char *dest, char *buf);
+
diff --git a/src/protocol/unreal32.c b/src/protocol/unreal32.c
new file mode 100644
index 000000000..a3b1c04ce
--- /dev/null
+++ b/src/protocol/unreal32.c
@@ -0,0 +1,2232 @@
+/* Unreal IRCD 3.2.x functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ *
+ */
+
+/*************************************************************************/
+
+#include "services.h"
+#include "pseudo.h"
+#include "unreal32.h"
+
+IRCDVar myIrcd[] = {
+ {"UnrealIRCd 3.2.x", /* ircd name */
+ "+oS", /* nickserv mode */
+ "+oS", /* chanserv mode */
+ "+oS", /* memoserv mode */
+ "+oS", /* hostserv mode */
+ "+ioS", /* operserv mode */
+ "+oS", /* botserv mode */
+ "+oS", /* helpserv mode */
+ "+iS", /* Dev/Null mode */
+ "+ioS", /* Global mode */
+ "+oS", /* nickserv alias mode */
+ "+oS", /* chanserv alias mode */
+ "+oS", /* memoserv alias mode */
+ "+ioS", /* hostserv alias mode */
+ "+ioS", /* operserv alias mode */
+ "+oS", /* botserv alias mode */
+ "+oS", /* helpserv alias mode */
+ "+iS", /* Dev/Null alias mode */
+ "+ioS", /* Global alias mode */
+ "+qS", /* Used by BotServ Bots */
+ 5, /* Chan Max Symbols */
+ "-cilmnpstuzACGHKMNOQRSTV", /* Modes to Remove */
+ "+ao", /* Channel Umode used by Botserv bots */
+ 1, /* SVSNICK */
+ 1, /* Vhost */
+ 1, /* Has Owner */
+ "+q", /* Mode to set for an owner */
+ "-q", /* Mode to unset for an owner */
+ "+a", /* Mode to set for channel admin */
+ "-a", /* Mode to unset for channel admin */
+ "+rd", /* Mode On Reg */
+ NULL, /* Mode on ID for Roots */
+ NULL, /* Mode on ID for Admins */
+ NULL, /* Mode on ID for Opers */
+ "-r+d", /* Mode on UnReg */
+ "-r+d", /* Mode on Nick Change */
+ 1, /* Supports SGlines */
+ 1, /* Supports SQlines */
+ 1, /* Supports SZlines */
+ 1, /* Supports Halfop +h */
+ 3, /* Number of server args */
+ 0, /* Join 2 Set */
+ 0, /* Join 2 Message */
+ 1, /* Has exceptions +e */
+ 1, /* TS Topic Forward */
+ 0, /* TS Topci Backward */
+ UMODE_S, /* Protected Umode */
+ 0, /* Has Admin */
+ 0, /* Chan SQlines */
+ 0, /* Quit on Kill */
+ 1, /* SVSMODE unban */
+ 1, /* Has Protect */
+ 1, /* Reverse */
+ 1, /* Chan Reg */
+ CMODE_r, /* Channel Mode */
+ 1, /* vidents */
+ 1, /* svshold */
+ 1, /* time stamp on mode */
+ 1, /* NICKIP */
+ 1, /* O:LINE */
+ 1, /* UMODE */
+ 1, /* VHOST ON NICK */
+ 1, /* Change RealName */
+ CMODE_K, /* No Knock */
+ CMODE_A, /* Admin Only */
+ DEFAULT_MLOCK, /* Default MLOCK */
+ UMODE_x, /* Vhost Mode */
+ 1, /* +f */
+ 1, /* +L */
+ CMODE_f, /* +f Mode */
+ CMODE_L, /* +L Mode */
+ 0, /* On nick change check if they could be identified */
+ 1, /* No Knock requires +i */
+ NULL, /* CAPAB Chan Modes */
+ 1, /* We support Unreal TOKENS */
+ 0, /* TOKENS are CASE Sensitive */
+ 1, /* TIME STAMPS are BASE64 */
+ 1, /* +I support */
+ '&', /* SJOIN ban char */
+ '\"', /* SJOIN except char */
+ '\'', /* SJOIN invite char */
+ 1, /* Can remove User Channel Modes with SVSMODE */
+ 0, /* Sglines are not enforced until user reconnects */
+ "x", /* vhost char */
+ 0, /* ts6 */
+ 1, /* support helper umode */
+ 0, /* p10 */
+ NULL, /* character set */
+ 1, /* reports sync state */
+ 0, /* CIDR channelbans */
+ }
+ ,
+ {NULL}
+};
+
+IRCDCAPAB myIrcdcap[] = {
+ {
+ CAPAB_NOQUIT, /* NOQUIT */
+ 0, /* TSMODE */
+ 0, /* UNCONNECT */
+ CAPAB_NICKIP, /* NICKIP */
+ 0, /* SJOIN */
+ CAPAB_ZIP, /* ZIP */
+ 0, /* BURST */
+ 0, /* TS5 */
+ 0, /* TS3 */
+ 0, /* DKEY */
+ 0, /* PT4 */
+ 0, /* SCS */
+ 0, /* QS */
+ 0, /* UID */
+ 0, /* KNOCK */
+ 0, /* CLIENT */
+ 0, /* IPV6 */
+ 0, /* SSJ5 */
+ 0, /* SN2 */
+ CAPAB_TOKEN, /* TOKEN */
+ 0, /* VHOST */
+ CAPAB_SSJ3, /* SSJ3 */
+ CAPAB_NICK2, /* NICK2 */
+ CAPAB_UMODE2, /* UMODE2 */
+ CAPAB_VL, /* VL */
+ CAPAB_TLKEXT, /* TLKEXT */
+ 0, /* DODKEY */
+ 0, /* DOZIP */
+ CAPAB_CHANMODE, /* CHANMODE */
+ CAPAB_SJB64,
+ CAPAB_NICKCHARS,
+ }
+};
+
+
+unsigned long umodes[128] = {
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused, Unused, Horzontal Tab */
+ 0, 0, 0, /* Line Feed, Unused, Unused */
+ 0, 0, 0, /* Carriage Return, Unused, Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused */
+ 0, 0, 0, /* Unused, Unused, Space */
+ 0, 0, 0, /* ! " # */
+ 0, 0, 0, /* $ % & */
+ 0, 0, 0, /* ! ( ) */
+ 0, 0, 0, /* * + , */
+ 0, 0, 0, /* - . / */
+ 0, 0, /* 0 1 */
+ 0, 0, /* 2 3 */
+ 0, 0, /* 4 5 */
+ 0, 0, /* 6 7 */
+ 0, 0, /* 8 9 */
+ 0, 0, /* : ; */
+ 0, 0, 0, /* < = > */
+ 0, 0, /* ? @ */
+ UMODE_A, UMODE_B, UMODE_C, /* A B C */
+ 0, 0, 0, /* D E F */
+ UMODE_G, UMODE_H, 0, /* G H I */
+ 0, 0, 0, /* J K L */
+ 0, UMODE_N, UMODE_O, /* M N O */
+ 0, 0, UMODE_R, /* P Q R */
+ UMODE_S, UMODE_T, 0, /* S T U */
+ UMODE_V, UMODE_W, 0, /* V W X */
+ 0, /* Y */
+ 0, /* Z */
+ 0, 0, 0, /* [ \ ] */
+ 0, 0, 0, /* ^ _ ` */
+ UMODE_a, 0, 0, /* a b c */
+ UMODE_d, 0, 0, /* d e f */
+ UMODE_g, UMODE_h, UMODE_i, /* g h i */
+ 0, 0, 0, /* j k l */
+ 0, 0, UMODE_o, /* m n o */
+ UMODE_p, UMODE_q, UMODE_r, /* p q r */
+ UMODE_s, UMODE_t, 0, /* s t u */
+ UMODE_v, UMODE_w, UMODE_x, /* v w x */
+ 0, /* y */
+ UMODE_z, /* z */
+ 0, 0, 0, /* { | } */
+ 0, 0 /* ~ � */
+};
+
+char myCsmodes[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,
+ 'h', /* (37) % Channel halfops */
+ 'b', /* (38) & bans */
+ 0, 0, 0,
+ 'q',
+
+ '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, 'a', 0
+};
+
+CMMode myCmmodes[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}, /* BCD */
+ {NULL}, {NULL}, {NULL}, /* EFG */
+ {NULL}, /* H */
+ {add_invite, del_invite}, /* I */
+ {NULL}, /* J */
+ {NULL}, {NULL}, {NULL}, /* KLM */
+ {NULL}, {NULL}, {NULL}, /* NOP */
+ {NULL}, {NULL}, {NULL}, /* QRS */
+ {NULL}, {NULL}, {NULL}, /* TUV */
+ {NULL}, {NULL}, {NULL}, /* WXY */
+ {NULL}, /* Z */
+ {NULL}, {NULL}, /* (char 91 - 92) */
+ {NULL}, {NULL}, {NULL}, /* (char 93 - 95) */
+ {NULL}, /* ` (char 96) */
+ {NULL}, /* a (char 97) */
+ {add_ban, del_ban}, /* b */
+ {NULL}, {NULL}, /* cd */
+ {add_exception, del_exception},
+ {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}
+};
+
+CBMode myCbmodes[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},
+ {CMODE_A, CBM_NO_USER_MLOCK, NULL, NULL},
+ {0}, /* B */
+ {CMODE_C, 0, NULL, NULL}, /* C */
+ {0}, /* D */
+ {0}, /* E */
+ {0}, /* F */
+ {CMODE_G, 0, NULL, NULL}, /* G */
+ {0}, /* H */
+ {0}, /* I */
+ {0}, /* J */
+ {CMODE_K, 0, NULL, NULL}, /* K */
+ {CMODE_L, 0, set_redirect, cs_set_redirect},
+ {CMODE_M, 0, NULL, NULL}, /* M */
+ {CMODE_N, 0, NULL, NULL}, /* N */
+ {CMODE_O, CBM_NO_USER_MLOCK, NULL, NULL},
+ {0}, /* P */
+ {CMODE_Q, 0, NULL, NULL}, /* Q */
+ {CMODE_R, 0, NULL, NULL}, /* R */
+ {CMODE_S, 0, NULL, NULL}, /* S */
+ {CMODE_T, 0, NULL, NULL}, /* T */
+ {0}, /* U */
+ {CMODE_V, 0, NULL, NULL}, /* V */
+ {0}, /* W */
+ {0}, /* X */
+ {0}, /* Y */
+ {0}, /* Z */
+ {0}, {0}, {0}, {0}, {0}, {0},
+ {0}, /* a */
+ {0}, /* b */
+ {CMODE_c, 0, NULL, NULL},
+ {0}, /* d */
+ {0}, /* e */
+ {CMODE_f, 0, set_flood, cs_set_flood},
+ {0}, /* g */
+ {0}, /* h */
+ {CMODE_i, 0, NULL, NULL},
+ {0}, /* j */
+ {CMODE_k, 0, chan_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},
+ {0}, /* q */
+ {CMODE_r, CBM_NO_MLOCK, NULL, NULL},
+ {CMODE_s, 0, NULL, NULL},
+ {CMODE_t, 0, NULL, NULL},
+ {CMODE_u, 0, NULL, NULL},
+ {0}, /* v */
+ {0}, /* w */
+ {0}, /* x */
+ {0}, /* y */
+ {CMODE_z, 0, NULL, NULL},
+ {0}, {0}, {0}, {0}
+};
+
+CBModeInfo myCbmodeinfos[] = {
+ {'c', CMODE_c, 0, NULL, NULL},
+ {'f', CMODE_f, 0, get_flood, cs_get_flood},
+ {'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},
+ {'r', CMODE_r, 0, NULL, NULL},
+ {'s', CMODE_s, 0, NULL, NULL},
+ {'t', CMODE_t, 0, NULL, NULL},
+ {'u', CMODE_u, 0, NULL, NULL},
+ {'z', CMODE_z, 0, NULL, NULL},
+ {'A', CMODE_A, 0, NULL, NULL},
+ {'C', CMODE_C, 0, NULL, NULL},
+ {'G', CMODE_G, 0, NULL, NULL},
+ {'K', CMODE_K, 0, NULL, NULL},
+ {'L', CMODE_L, 0, get_redirect, cs_get_redirect},
+ {'M', CMODE_M, 0, NULL, NULL},
+ {'N', CMODE_N, 0, NULL, NULL},
+ {'O', CMODE_O, 0, NULL, NULL},
+ {'Q', CMODE_Q, 0, NULL, NULL},
+ {'R', CMODE_R, 0, NULL, NULL},
+ {'S', CMODE_S, 0, NULL, NULL},
+ {'T', CMODE_T, 0, NULL, NULL},
+ {'V', CMODE_V, 0, NULL, NULL},
+ {0}
+};
+
+CUMode myCumodes[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},
+
+ {CUS_PROTECT, CUF_PROTECT_BOTSERV, check_valid_op},
+ {0}, /* b */
+ {0}, /* c */
+ {0}, /* d */
+ {0}, /* e */
+ {0}, /* f */
+ {0}, /* g */
+ {CUS_HALFOP, 0, check_valid_op},
+ {0}, /* i */
+ {0}, /* j */
+ {0}, /* k */
+ {0}, /* l */
+ {0}, /* m */
+ {0}, /* n */
+ {CUS_OP, CUF_PROTECT_BOTSERV, check_valid_op},
+ {0}, /* p */
+ {CUS_OWNER, 0, check_valid_op},
+ {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}
+};
+
+
+void unreal_set_umode(User * user, int ac, char **av)
+{
+ int add = 1; /* 1 if adding modes, 0 if deleting */
+ char *modes = av[0];
+
+ ac--;
+
+ if (!user || !modes) {
+ /* Prevent NULLs from doing bad things */
+ return;
+ }
+
+ if (debug)
+ alog("debug: Changing mode for %s to %s", user->nick, modes);
+
+ while (*modes) {
+ uint32 backup = user->mode;
+
+ /* This looks better, much better than "add ? (do_add) : (do_remove)".
+ * At least this is readable without paying much attention :) -GD
+ */
+ if (add)
+ user->mode |= umodes[(int) *modes];
+ else
+ user->mode &= ~umodes[(int) *modes];
+
+ switch (*modes++) {
+ case '+':
+ add = 1;
+ break;
+ case '-':
+ add = 0;
+ break;
+ case 'd':
+ if (ac <= 0) {
+ break;
+ }
+ if (isdigit(*av[1])) {
+ user->svid = strtoul(av[1], NULL, 0);
+ user->mode = backup; /* Ugly fix, but should do the job ~ Viper */
+ }
+ break;
+ case 'o':
+ if (add) {
+ opcnt++;
+ if (WallOper) {
+ anope_cmd_global(s_OperServ,
+ "\2%s\2 is now an IRC operator.",
+ user->nick);
+ }
+ display_news(user, NEWS_OPER);
+ } else {
+ opcnt--;
+ }
+ break;
+ case 'a':
+ if (UnRestrictSAdmin) {
+ break;
+ }
+ if (add && !is_services_admin(user)) {
+ common_svsmode(user, "-a", NULL);
+ user->mode &= ~UMODE_a;
+ }
+ break;
+ case 'r':
+ if (add && !nick_identified(user)) {
+ common_svsmode(user, "-r", NULL);
+ user->mode &= ~UMODE_r;
+ }
+ break;
+ case 'x':
+ update_host(user);
+ break;
+ }
+ }
+}
+
+
+
+
+/* Event: PROTOCTL */
+int anope_event_capab(char *source, int ac, char **av)
+{
+ capab_parse(ac, av);
+ return MOD_CONT;
+}
+
+/* SVSNOOP */
+void unreal_cmd_svsnoop(char *server, int set)
+{
+ send_cmd(NULL, "%s %s %s", send_token("SVSNOOP", "f"), server,
+ (set ? "+" : "-"));
+}
+
+void unreal_cmd_svsadmin(char *server, int set)
+{
+ unreal_cmd_svsnoop(server, set);
+}
+
+void unreal_cmd_remove_akill(char *user, char *host)
+{
+ send_cmd(NULL, "%s - G %s %s %s", send_token("TKL", "BD"), user, host,
+ s_OperServ);
+}
+
+void unreal_cmd_topic(char *whosets, char *chan, char *whosetit,
+ char *topic, time_t when)
+{
+ send_cmd(whosets, "%s %s %s %lu :%s", send_token("TOPIC", ")"), chan,
+ whosetit, (unsigned long int) when, topic);
+}
+
+void unreal_cmd_vhost_off(User * u)
+{
+ if (UseSVS2MODE) {
+ send_cmd(s_HostServ, "%s %s -xt", send_token("SVS2MODE", "v"),
+ u->nick);
+ } else {
+ send_cmd(s_HostServ, "%s %s -xt", send_token("SVSMODE", "n"),
+ u->nick);
+ }
+ notice_lang(s_HostServ, u, HOST_OFF_UNREAL, u->nick,
+ myIrcd->vhostchar);
+}
+
+void unreal_cmd_akill(char *user, char *host, char *who, time_t when,
+ time_t expires, char *reason)
+{
+ send_cmd(NULL, "%s + G %s %s %s %ld %ld :%s", send_token("TKL", "BD"),
+ user, host, who, (long int) time(NULL) + 86400 * 2,
+ (long int) when, reason);
+}
+
+/*
+** svskill
+** parv[0] = servername
+** parv[1] = client
+** parv[2] = kill message
+*/
+void unreal_cmd_svskill(char *source, char *user, char *buf)
+{
+ if (!source || !user || !buf) {
+ return;
+ }
+ send_cmd(source, "%s %s :%s", send_token("SVSKILL", "h"), user, buf);
+}
+
+/*
+ * m_svsmode() added by taz
+ * parv[0] - sender
+ * parv[1] - username to change mode for
+ * parv[2] - modes to change
+ * parv[3] - Service Stamp (if mode == d)
+ */
+void unreal_cmd_svsmode(User * u, int ac, char **av)
+{
+ if (ac >= 1) {
+ if (!u || !av[0]) {
+ return;
+ }
+ if (UseSVS2MODE) {
+ send_cmd(ServerName, "%s %s %s%s%s",
+ send_token("SVS2MODE", "v"), u->nick, av[0],
+ (ac == 2 ? " " : ""), (ac == 2 ? av[1] : ""));
+ } else {
+ send_cmd(ServerName, "%s %s %s%s%s",
+ send_token("SVSMODE", "n"), u->nick, av[0],
+ (ac == 2 ? " " : ""), (ac == 2 ? av[1] : ""));
+ }
+ }
+}
+
+/* 372 */
+void unreal_cmd_372(char *source, char *msg)
+{
+ send_cmd(ServerName, "372 %s :- %s", source, msg);
+}
+
+void unreal_cmd_372_error(char *source)
+{
+ send_cmd(ServerName, "422 %s :- MOTD file not found! Please "
+ "contact your IRC administrator.", source);
+}
+
+void unreal_cmd_375(char *source)
+{
+ send_cmd(ServerName, "375 %s :- %s Message of the Day",
+ source, ServerName);
+}
+
+void unreal_cmd_376(char *source)
+{
+ send_cmd(ServerName, "376 %s :End of /MOTD command.", source);
+}
+
+void unreal_cmd_nick(char *nick, char *name, char *modes)
+{
+ EnforceQlinedNick(nick, NULL);
+ send_cmd(NULL, "%s %s 1 %ld %s %s %s 0 %s %s%s :%s",
+ send_token("NICK", "&"), nick, (long int) time(NULL),
+ ServiceUser, ServiceHost, ServerName, modes, ServiceHost,
+ (myIrcd->nickip ? " *" : " "), name);
+ unreal_cmd_sqline(nick, "Reserved for services");
+}
+
+void unreal_cmd_guest_nick(char *nick, char *user, char *host, char *real,
+ char *modes)
+{
+ send_cmd(NULL, "%s %s 1 %ld %s %s %s 0 %s %s%s :%s",
+ send_token("NICK", "&"), nick, (long int) time(NULL), user,
+ host, ServerName, modes, host, (myIrcd->nickip ? " *" : " "),
+ real);
+}
+
+void unreal_cmd_mode(char *source, char *dest, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(source, "%s %s %s", send_token("MODE", "G"), dest, buf);
+}
+
+void unreal_cmd_bot_nick(char *nick, char *user, char *host, char *real,
+ char *modes)
+{
+ EnforceQlinedNick(nick, s_BotServ);
+ send_cmd(NULL, "%s %s 1 %ld %s %s %s 0 %s %s%s :%s",
+ send_token("NICK", "&"), nick, (long int) time(NULL), user,
+ host, ServerName, modes, host, (myIrcd->nickip ? " *" : " "),
+ real);
+ unreal_cmd_sqline(nick, "Reserved for services");
+}
+
+void unreal_cmd_kick(char *source, char *chan, char *user, char *buf)
+{
+ if (buf) {
+ send_cmd(source, "%s %s %s :%s", send_token("KICK", "H"), chan,
+ user, buf);
+ } else {
+ send_cmd(source, "%s %s %s", send_token("KICK", "H"), chan, user);
+ }
+}
+
+void unreal_cmd_notice_ops(char *source, char *dest, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(source, "%s @%s :%s", send_token("NOTICE", "B"), dest, buf);
+}
+
+
+void unreal_cmd_notice(char *source, char *dest, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ if (NSDefFlags & NI_MSG) {
+ unreal_cmd_privmsg2(source, dest, buf);
+ } else {
+ send_cmd(source, "%s %s :%s", send_token("NOTICE", "B"), dest,
+ buf);
+ }
+}
+
+void unreal_cmd_notice2(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "%s %s :%s", send_token("NOTICE", "B"), dest, msg);
+}
+
+void unreal_cmd_privmsg(char *source, char *dest, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(source, "%s %s :%s", send_token("PRIVMSG", "!"), dest, buf);
+}
+
+void unreal_cmd_privmsg2(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "%s %s :%s", send_token("PRIVMSG", "!"), dest, msg);
+}
+
+void unreal_cmd_serv_notice(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "%s $%s :%s", send_token("NOTICE", "B"), dest, msg);
+}
+
+void unreal_cmd_serv_privmsg(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "%s $%s :%s", send_token("PRIVMSG", "!"), dest, msg);
+}
+
+void unreal_cmd_bot_chan_mode(char *nick, char *chan)
+{
+ anope_cmd_mode(nick, chan, "%s %s %s", myIrcd->botchanumode, nick,
+ nick);
+}
+
+void unreal_cmd_351(char *source)
+{
+ send_cmd(ServerName, "351 %s Anope-%s %s :%s - %s (%s) -- %s",
+ source, version_number, ServerName, myIrcd->name,
+ version_flags, EncModule, version_build);
+}
+
+/* QUIT */
+void unreal_cmd_quit(char *source, char *buf)
+{
+ if (buf) {
+ send_cmd(source, "%s :%s", send_token("QUIT", ","), buf);
+ } else {
+ send_cmd(source, "%s", send_token("QUIT", ","));
+ }
+}
+
+/* PROTOCTL */
+/*
+ NICKv2 = Nick Version 2
+ VHP = Sends hidden host
+ UMODE2 = sends UMODE2 on user modes
+ NICKIP = Sends IP on NICK
+ TOKEN = Use tokens to talk
+ SJ3 = Supports SJOIN
+ NOQUIT = No Quit
+ TKLEXT = Extended TKL we don't use it but best to have it
+ SJB64 = Base64 encoded time stamps
+ VL = Version Info
+ NS = Numeric Server
+
+*/
+void unreal_cmd_capab()
+{
+ if (UseTokens) {
+ if (Numeric) {
+ send_cmd(NULL,
+ "PROTOCTL NICKv2 VHP UMODE2 NICKIP TOKEN SJOIN SJOIN2 SJ3 NOQUIT TKLEXT SJB64 VL");
+ } else {
+ send_cmd(NULL,
+ "PROTOCTL NICKv2 VHP UMODE2 NICKIP TOKEN SJOIN SJOIN2 SJ3 NOQUIT TKLEXT SJB64");
+ }
+ } else {
+ if (Numeric) {
+ send_cmd(NULL,
+ "PROTOCTL NICKv2 VHP UMODE2 NICKIP SJOIN SJOIN2 SJ3 NOQUIT TKLEXT SJB64 VL");
+ } else {
+ send_cmd(NULL,
+ "PROTOCTL NICKv2 VHP UMODE2 NICKIP SJOIN SJOIN2 SJ3 NOQUIT TKLEXT SJB64");
+ }
+ }
+}
+
+/* PASS */
+void unreal_cmd_pass(char *pass)
+{
+ send_cmd(NULL, "PASS :%s", pass);
+}
+
+/* SERVER name hop descript */
+/* Unreal 3.2 actually sends some info about itself in the descript area */
+void unreal_cmd_server(char *servname, int hop, char *descript)
+{
+ if (Numeric) {
+ send_cmd(NULL, "SERVER %s %d :U0-*-%s %s", servname, hop, Numeric,
+ descript);
+ } else {
+ send_cmd(NULL, "SERVER %s %d :%s", servname, hop, descript);
+ }
+}
+
+/* PONG */
+void unreal_cmd_pong(char *servname, char *who)
+{
+ send_cmd(servname, "%s %s", send_token("PONG", "9"), who);
+}
+
+/* JOIN */
+void unreal_cmd_join(char *user, char *channel, time_t chantime)
+{
+ send_cmd(ServerName, "%s !%s %s :%s",
+ send_token("SJOIN", "~"), base64enc((long int) chantime),
+ channel, user);
+ /* send_cmd(user, "%s %s", send_token("JOIN", "C"), channel); */
+}
+
+/* unsqline
+** parv[0] = sender
+** parv[1] = nickmask
+*/
+void unreal_cmd_unsqline(char *user)
+{
+ if (!user) {
+ return;
+ }
+ send_cmd(NULL, "%s %s", send_token("UNSQLINE", "d"), user);
+}
+
+/* CHGHOST */
+void unreal_cmd_chghost(char *nick, char *vhost)
+{
+ if (!nick || !vhost) {
+ return;
+ }
+ send_cmd(ServerName, "%s %s %s", send_token("CHGHOST", "AL"), nick,
+ vhost);
+}
+
+/* CHGIDENT */
+void unreal_cmd_chgident(char *nick, char *vIdent)
+{
+ if (!nick || !vIdent) {
+ return;
+ }
+ send_cmd(ServerName, "%s %s %s", send_token("CHGIDENT", "AZ"), nick,
+ vIdent);
+}
+
+/* INVITE */
+void unreal_cmd_invite(char *source, char *chan, char *nick)
+{
+ if (!source || !chan || !nick) {
+ return;
+ }
+
+ send_cmd(source, "%s %s %s", send_token("INVITE", "*"), nick, chan);
+}
+
+/* PART */
+void unreal_cmd_part(char *nick, char *chan, char *buf)
+{
+ if (!nick || !chan) {
+ return;
+ }
+
+ if (buf) {
+ send_cmd(nick, "%s %s :%s", send_token("PART", "D"), chan, buf);
+ } else {
+ send_cmd(nick, "%s %s", send_token("PART", "D"), chan);
+ }
+}
+
+/* 391 RPL_TIME ":%s 391 %s %s :%s" */
+void unreal_cmd_391(char *source, char *timestr)
+{
+ if (!timestr) {
+ return;
+ }
+ send_cmd(ServerName, "391 %s %s :%s", source, ServerName, timestr);
+}
+
+/* 250 */
+void unreal_cmd_250(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "250 %s", buf);
+}
+
+/* 307 */
+void unreal_cmd_307(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "307 %s", buf);
+}
+
+/* 311 */
+void unreal_cmd_311(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "311 %s", buf);
+}
+
+/* 312 */
+void unreal_cmd_312(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "312 %s", buf);
+}
+
+/* 317 */
+void unreal_cmd_317(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "317 %s", buf);
+}
+
+/* 219 */
+void unreal_cmd_219(char *source, char *letter)
+{
+ if (!source) {
+ return;
+ }
+
+ if (letter) {
+ send_cmd(NULL, "219 %s %c :End of /STATS report.", source,
+ *letter);
+ } else {
+ send_cmd(NULL, "219 %s l :End of /STATS report.", source);
+ }
+}
+
+/* 401 */
+void unreal_cmd_401(char *source, char *who)
+{
+ if (!source || !who) {
+ return;
+ }
+ send_cmd(ServerName, "401 %s %s :No such service.", source, who);
+}
+
+/* 318 */
+void unreal_cmd_318(char *source, char *who)
+{
+ if (!source || !who) {
+ return;
+ }
+
+ send_cmd(ServerName, "318 %s %s :End of /WHOIS list.", source, who);
+}
+
+/* 242 */
+void unreal_cmd_242(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "242 %s", buf);
+}
+
+/* 243 */
+void unreal_cmd_243(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "243 %s", buf);
+}
+
+/* 211 */
+void unreal_cmd_211(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "211 %s", buf);
+}
+
+/* GLOBOPS */
+void unreal_cmd_global(char *source, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(source ? source : ServerName, "%s :%s",
+ send_token("GLOBOPS", "]"), buf);
+}
+
+/* GLOBOPS - to handle old WALLOPS */
+void unreal_cmd_global_legacy(char *source, char *fmt)
+{
+ send_cmd(source ? source : ServerName, "%s :%s",
+ send_token("GLOBOPS", "]"), fmt);
+}
+
+/* SQLINE */
+/*
+** parv[0] = sender
+** parv[1] = nickmask
+** parv[2] = reason
+**
+** - Unreal will translate this to TKL for us
+**
+*/
+void unreal_cmd_sqline(char *mask, char *reason)
+{
+ if (!mask || !reason) {
+ return;
+ }
+
+ send_cmd(NULL, "%s %s :%s", send_token("SQLINE", "c"), mask, reason);
+}
+
+/* SQUIT */
+void unreal_cmd_squit(char *servname, char *message)
+{
+ if (!servname || !message) {
+ return;
+ }
+
+ send_cmd(NULL, "%s %s :%s", send_token("SQUIT", "-"), servname,
+ message);
+}
+
+/*
+** svso
+** parv[0] = sender prefix
+** parv[1] = nick
+** parv[2] = options
+*/
+void unreal_cmd_svso(char *source, char *nick, char *flag)
+{
+ if (!source || !nick || !flag) {
+ return;
+ }
+
+ send_cmd(source, "%s %s %s", send_token("SVSO", "BB"), nick, flag);
+}
+
+/* NICK <newnick> */
+void unreal_cmd_chg_nick(char *oldnick, char *newnick)
+{
+ if (!oldnick || !newnick) {
+ return;
+ }
+
+ send_cmd(oldnick, "%s %s %ld", send_token("NICK", "&"), newnick,
+ (long int) time(NULL));
+}
+
+/* SVSNICK */
+/*
+** parv[0] = sender
+** parv[1] = old nickname
+** parv[2] = new nickname
+** parv[3] = timestamp
+*/
+void unreal_cmd_svsnick(char *source, char *guest, time_t when)
+{
+ if (!source || !guest) {
+ return;
+ }
+ send_cmd(NULL, "%s %s %s :%ld", send_token("SVSNICK", "e"), source,
+ guest, (long int) when);
+}
+
+/* Functions that use serval cmd functions */
+
+void unreal_cmd_vhost_on(char *nick, char *vIdent, char *vhost)
+{
+ if (!nick) {
+ return;
+ }
+ if (vIdent) {
+ unreal_cmd_chgident(nick, vIdent);
+ }
+ unreal_cmd_chghost(nick, vhost);
+}
+
+void unreal_cmd_connect(int servernum)
+{
+ if (Numeric) {
+ me_server =
+ new_server(NULL, ServerName, ServerDesc, SERVER_ISME, Numeric);
+ } else {
+ me_server =
+ new_server(NULL, ServerName, ServerDesc, SERVER_ISME, NULL);
+ }
+
+ unreal_cmd_capab();
+ if (servernum == 1) {
+ unreal_cmd_pass(RemotePassword);
+ }
+ if (servernum == 2) {
+ unreal_cmd_pass(RemotePassword2);
+ }
+ if (servernum == 3) {
+ unreal_cmd_pass(RemotePassword3);
+ }
+ unreal_cmd_server(ServerName, 1, ServerDesc);
+}
+
+/* Events */
+
+int anope_event_ping(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+ unreal_cmd_pong(ac > 1 ? av[1] : ServerName, av[0]);
+ return MOD_CONT;
+}
+
+void unreal_cmd_netinfo(int ac, char **av)
+{
+ send_cmd(NULL, "%s %ld %ld %d %s 0 0 0 :%s",
+ send_token("NETINFO", "AO"), (long int) maxusercnt,
+ (long int) time(NULL), atoi(av[2]), av[3], av[7]);
+}
+
+/* netinfo
+ * argv[0] = max global count
+ * argv[1] = time of end sync
+ * argv[2] = unreal protocol using (numeric)
+ * argv[3] = cloak-crc (> u2302)
+ * argv[4] = free(**)
+ * argv[5] = free(**)
+ * argv[6] = free(**)
+ * argv[7] = ircnet
+ */
+int anope_event_netinfo(char *source, int ac, char **av)
+{
+ unreal_cmd_netinfo(ac, av);
+ return MOD_CONT;
+}
+
+
+/* TKL
+ * add: remove: spamfilter: spamfilter+TKLEXT sqline:
+ * parv[ 1]: + - +/- + +/-
+ * parv[ 2]: type type type type type
+ * parv[ 3]: user user target target hold
+ * parv[ 4]: host host action action host
+ * parv[ 5]: setby removedby (un)setby setby setby
+ * parv[ 6]: expire_at expire_at (0) expire_at (0) expire_at
+ * parv[ 7]: set_at set_at set_at set_at
+ * parv[ 8]: reason regex tkl duration reason
+ * parv[ 9]: tkl reason [A]
+ * parv[10]: regex
+ *
+*/
+int anope_event_tkl(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_eos(char *source, int ac, char **av)
+{
+ Server *s;
+ s = findserver(servlist, source);
+ /* If we found a server with the given source, that one just
+ * finished bursting. If there was no source, then our uplink
+ * server finished bursting. -GD
+ */
+ if (!s && serv_uplink)
+ s = serv_uplink;
+ finish_sync(s, 1);
+ return MOD_CONT;
+}
+
+int anope_event_436(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+
+ m_nickcoll(av[0]);
+ return MOD_CONT;
+}
+
+/*
+** away
+** parv[0] = sender prefix
+** parv[1] = away message
+*/
+int anope_event_away(char *source, int ac, char **av)
+{
+ if (!source) {
+ return MOD_CONT;
+ }
+ m_away(source, (ac ? av[0] : NULL));
+ return MOD_CONT;
+}
+
+/*
+** m_topic
+** parv[0] = sender prefix
+** parv[1] = topic text
+**
+** For servers using TS:
+** parv[0] = sender prefix
+** parv[1] = channel name
+** parv[2] = topic nickname
+** parv[3] = topic time
+** parv[4] = topic text
+*/
+int anope_event_topic(char *source, int ac, char **av)
+{
+ if (ac != 4)
+ return MOD_CONT;
+ do_topic(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_squit(char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+ do_squit(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_quit(char *source, int ac, char **av)
+{
+ if (ac != 1)
+ return MOD_CONT;
+ do_quit(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_pass(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+
+int anope_event_mode(char *source, int ac, char **av)
+{
+ if (ac < 2)
+ return MOD_CONT;
+
+ if (*av[0] == '#' || *av[0] == '&') {
+ do_cmode(source, ac, av);
+ } else {
+ do_umode(source, ac, av);
+ }
+ return MOD_CONT;
+}
+
+/* Unreal sends USER modes with this */
+/*
+ umode2
+ parv[0] - sender
+ parv[1] - modes to change
+*/
+int anope_event_umode2(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+
+ do_umode2(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_kill(char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+
+ m_kill(av[0], av[1]);
+ return MOD_CONT;
+}
+
+int anope_event_kick(char *source, int ac, char **av)
+{
+ if (ac != 3)
+ return MOD_CONT;
+ do_kick(source, ac, av);
+ return MOD_CONT;
+}
+
+
+int anope_event_join(char *source, int ac, char **av)
+{
+ if (ac != 1)
+ return MOD_CONT;
+ do_join(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_motd(char *source, int ac, char **av)
+{
+ if (!source) {
+ return MOD_CONT;
+ }
+
+ m_motd(source);
+ return MOD_CONT;
+}
+
+int anope_event_setname(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 1)
+ return MOD_CONT;
+
+ u = finduser(source);
+ if (!u) {
+ if (debug) {
+ alog("debug: SETNAME for nonexistent user %s", source);
+ }
+ return MOD_CONT;
+ }
+
+ change_user_realname(u, av[0]);
+ return MOD_CONT;
+}
+
+int anope_event_chgname(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 2)
+ return MOD_CONT;
+
+ u = finduser(av[0]);
+ if (!u) {
+ if (debug) {
+ alog("debug: CHGNAME for nonexistent user %s", av[0]);
+ }
+ return MOD_CONT;
+ }
+
+ change_user_realname(u, av[1]);
+ return MOD_CONT;
+}
+
+int anope_event_setident(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 1)
+ return MOD_CONT;
+
+ u = finduser(source);
+ if (!u) {
+ if (debug) {
+ alog("debug: SETIDENT for nonexistent user %s", source);
+ }
+ return MOD_CONT;
+ }
+
+ change_user_username(u, av[0]);
+ return MOD_CONT;
+}
+int anope_event_chgident(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 2)
+ return MOD_CONT;
+
+ u = finduser(av[0]);
+ if (!u) {
+ if (debug) {
+ alog("debug: CHGIDENT for nonexistent user %s", av[0]);
+ }
+ return MOD_CONT;
+ }
+
+ change_user_username(u, av[1]);
+ return MOD_CONT;
+}
+
+int anope_event_sethost(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 1)
+ return MOD_CONT;
+
+ u = finduser(source);
+ if (!u) {
+ if (debug) {
+ alog("debug: SETHOST for nonexistent user %s", source);
+ }
+ return MOD_CONT;
+ }
+
+ change_user_host(u, av[0]);
+ return MOD_CONT;
+}
+
+/*
+** NICK - new
+** source = NULL
+** parv[0] = nickname
+** parv[1] = hopcount
+** parv[2] = timestamp
+** parv[3] = username
+** parv[4] = hostname
+** parv[5] = servername
+** if NICK version 1:
+** parv[6] = servicestamp
+** parv[7] = info
+** if NICK version 2:
+** parv[6] = servicestamp
+** parv[7] = umodes
+** parv[8] = virthost, * if none
+** parv[9] = info
+** if NICKIP:
+** parv[9] = ip
+** parv[10] = info
+**
+** NICK - change
+** source = oldnick
+** parv[0] = new nickname
+** parv[1] = hopcount
+*/
+/*
+ do_nick(const char *source, char *nick, char *username, char *host,
+ char *server, char *realname, time_t ts, uint32 svid,
+ uint32 ip, char *vhost, char *uid)
+*/
+int anope_event_nick(char *source, int ac, char **av)
+{
+ User *user;
+
+ if (ac != 2) {
+ if (ac == 7) {
+ /*
+ <codemastr> that was a bug that is now fixed in 3.2.1
+ <codemastr> in some instances it would use the non-nickv2 format
+ <codemastr> it's sent when a nick collision occurs
+ - so we have to leave it around for now -TSL
+ */
+ do_nick(source, av[0], av[3], av[4], av[5], av[6],
+ strtoul(av[2], NULL, 10), 0, 0, "*", NULL);
+
+ } else if (ac == 11) {
+ user = do_nick(source, av[0], av[3], av[4], av[5], av[10],
+ strtoul(av[2], NULL, 10), strtoul(av[6], NULL,
+ 0),
+ ntohl(decode_ip(av[9])), av[8], NULL);
+ if (user)
+ anope_set_umode(user, 1, &av[7]);
+
+ } else {
+ /* NON NICKIP */
+ user = do_nick(source, av[0], av[3], av[4], av[5], av[9],
+ strtoul(av[2], NULL, 10), strtoul(av[6], NULL,
+ 0), 0, av[8],
+ NULL);
+ if (user)
+ anope_set_umode(user, 1, &av[7]);
+ }
+ } else {
+ do_nick(source, av[0], NULL, NULL, NULL, NULL,
+ strtoul(av[1], NULL, 10), 0, 0, NULL, NULL);
+ }
+ return MOD_CONT;
+}
+
+
+int anope_event_chghost(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 2)
+ return MOD_CONT;
+
+ u = finduser(av[0]);
+ if (!u) {
+ if (debug) {
+ alog("debug: CHGHOST for nonexistent user %s", av[0]);
+ }
+ return MOD_CONT;
+ }
+
+ change_user_host(u, av[1]);
+ return MOD_CONT;
+}
+
+/* EVENT: SERVER */
+int anope_event_server(char *source, int ac, char **av)
+{
+ char *desc;
+ char *vl;
+ char *upnumeric;
+
+ if (!stricmp(av[1], "1")) {
+ uplink = sstrdup(av[0]);
+ vl = myStrGetToken(av[2], ' ', 0);
+ upnumeric = myStrGetToken(vl, '-', 2);
+ desc = myStrGetTokenRemainder(av[2], ' ', 1);
+ do_server(source, av[0], av[1], desc, upnumeric);
+ Anope_Free(vl);
+ Anope_Free(desc);
+ Anope_Free(upnumeric);
+ } else {
+ do_server(source, av[0], av[1], av[2], NULL);
+ }
+
+ return MOD_CONT;
+}
+
+int anope_event_privmsg(char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+ m_privmsg(source, av[0], av[1]);
+ return MOD_CONT;
+}
+
+int anope_event_part(char *source, int ac, char **av)
+{
+ if (ac < 1 || ac > 2)
+ return MOD_CONT;
+ do_part(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_whois(char *source, int ac, char **av)
+{
+ if (source && ac >= 1) {
+ m_whois(source, av[0]);
+ }
+ return MOD_CONT;
+}
+
+/* SVSHOLD - set */
+void unreal_cmd_svshold(char *nick)
+{
+ send_cmd(NULL, "%s + Q H %s %s %ld %ld :%s", send_token("TKL", "BD"),
+ nick, ServerName, (long int) time(NULL) + NSReleaseTimeout,
+ (long int) time(NULL), "Being held for registered user");
+}
+
+/* SVSHOLD - release */
+void unreal_cmd_release_svshold(char *nick)
+{
+ send_cmd(NULL, "%s - Q * %s %s", send_token("TKL", "BD"), nick,
+ ServerName);
+}
+
+/* UNSGLINE */
+/*
+ * SVSNLINE - :realname mask
+*/
+void unreal_cmd_unsgline(char *mask)
+{
+ send_cmd(NULL, "%s - :%s", send_token("SVSNLINE", "BR"), mask);
+}
+
+/* UNSZLINE */
+void unreal_cmd_unszline(char *mask)
+{
+ send_cmd(NULL, "%s - Z * %s %s", send_token("TKL", "BD"), mask,
+ s_OperServ);
+}
+
+/* SZLINE */
+void unreal_cmd_szline(char *mask, char *reason, char *whom)
+{
+ send_cmd(NULL, "%s + Z * %s %s %ld %ld :%s", send_token("TKL", "BD"),
+ mask, whom, (long int) time(NULL) + 86400 * 2,
+ (long int) time(NULL), reason);
+}
+
+/* SGLINE */
+/*
+ * SVSNLINE + reason_where_is_space :realname mask with spaces
+*/
+void unreal_cmd_sgline(char *mask, char *reason)
+{
+ strnrepl(reason, BUFSIZE, " ", "_");
+ send_cmd(NULL, "%s + %s :%s", send_token("SVSNLINE", "BR"), reason,
+ mask);
+}
+
+/* SVSMODE -b */
+void unreal_cmd_unban(char *name, char *nick)
+{
+ unreal_cmd_svsmode_chan(name, "-b", nick);
+}
+
+
+/* SVSMODE channel modes */
+
+void unreal_cmd_svsmode_chan(char *name, char *mode, char *nick)
+{
+ if (nick) {
+ send_cmd(ServerName, "%s %s %s %s", send_token("SVSMODE", "n"),
+ name, mode, nick);
+ } else {
+ send_cmd(ServerName, "%s %s %s", send_token("SVSMODE", "n"), name,
+ mode);
+ }
+}
+
+
+/* SVSMODE +d */
+/* sent if svid is something weird */
+void unreal_cmd_svid_umode(char *nick, time_t ts)
+{
+ if (UseSVS2MODE) {
+ send_cmd(ServerName, "%s %s +d 1", send_token("SVS2MODE", "v"),
+ nick);
+ } else {
+ send_cmd(ServerName, "%s %s +d 1", send_token("SVSMODE", "n"),
+ nick);
+ }
+}
+
+/* SVSMODE +d */
+/* nc_change was = 1, and there is no na->status */
+void unreal_cmd_nc_change(User * u)
+{
+ common_svsmode(u, "-r+d", "1");
+}
+
+/* SVSMODE +r */
+void unreal_cmd_svid_umode2(User * u, char *ts)
+{
+ if (u->svid != u->timestamp) {
+ common_svsmode(u, "+rd", ts);
+ } else {
+ common_svsmode(u, "+r", NULL);
+ }
+}
+
+void unreal_cmd_svid_umode3(User * u, char *ts)
+{
+ /* not used */
+}
+
+int anope_event_error(char *source, int ac, char **av)
+{
+ if (av[0]) {
+ if (debug) {
+ alog("debug: %s", av[0]);
+ }
+ if(strstr(av[0],"No matching link configuration")!=0) {
+ alog("Error: Your IRCD's link block may not setup correctly, please check unrealircd.conf");
+ }
+ }
+ return MOD_CONT;
+}
+
+int anope_event_notice(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_smo(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+/* svsjoin
+ parv[0] - sender
+ parv[1] - nick to make join
+ parv[2] - channel to join
+ parv[3] - (optional) channel key(s)
+*/
+/* In older Unreal SVSJOIN and SVSNLINE tokens were mixed so SVSJOIN and SVSNLINE are broken
+ when coming from a none TOKEN'd server
+*/
+void unreal_cmd_svsjoin(char *source, char *nick, char *chan, char *param)
+{
+ if (param) {
+ send_cmd(source, "%s %s %s :%s", send_token("SVSJOIN", "BX"), nick, chan, param);
+ } else {
+ send_cmd(source, "%s %s :%s", send_token("SVSJOIN", "BX"), nick, chan);
+ }
+}
+
+/* svspart
+ parv[0] - sender
+ parv[1] - nick to make part
+ parv[2] - channel(s) to part
+*/
+void unreal_cmd_svspart(char *source, char *nick, char *chan)
+{
+ send_cmd(source, "%s %s :%s", send_token("SVSPART", "BT"), nick, chan);
+}
+
+int anope_event_globops(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_swhois(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_rehash(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_credits(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_admin(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_sdesc(char *source, int ac, char **av)
+{
+ Server *s;
+ s = findserver(servlist, source);
+
+ if (s) {
+ s->desc = av[0];
+ }
+
+ return MOD_CONT;
+}
+
+int anope_event_sjoin(char *source, int ac, char **av)
+{
+ do_sjoin(source, ac, av);
+ return MOD_CONT;
+}
+
+void unreal_cmd_swhois(char *source, char *who, char *mask)
+{
+ send_cmd(source, "%s %s :%s", send_token("SWHOIS", "BA"), who, mask);
+}
+
+void unreal_cmd_eob()
+{
+ send_cmd(ServerName, "%s", send_token("EOS", "ES"));
+}
+
+/* svswatch
+ * parv[0] - sender
+ * parv[1] - target nick
+ * parv[2] - parameters
+ */
+void unreal_cmd_svswatch(char *sender, char *nick, char *parm)
+{
+ send_cmd(sender, "%s %s :%s", send_token("SVSWATCH", "Bw"), nick,
+ parm);
+}
+
+/* check if +f mode is valid for the ircd */
+/* borrowed part of the new check from channels.c in Unreal */
+int unreal_flood_mode_check(char *value)
+{
+ char *dp, *end;
+ /* NEW +F */
+ char xbuf[256], *p, *p2, *x = xbuf + 1;
+ int v;
+
+ if (!value) {
+ return 0;
+ }
+
+ if (*value != ':'
+ && (strtoul((*value == '*' ? value + 1 : value), &dp, 10) > 0)
+ && (*dp == ':') && (*(++dp) != 0) && (strtoul(dp, &end, 10) > 0)
+ && (*end == 0)) {
+ return 1;
+ } else {
+ /* '['<number><1 letter>[optional: '#'+1 letter],[next..]']'':'<number> */
+ strncpy(xbuf, value, sizeof(xbuf));
+ p2 = strchr(xbuf + 1, ']');
+ if (!p2) {
+ return 0;
+ }
+ *p2 = '\0';
+ if (*(p2 + 1) != ':') {
+ return 0;
+ }
+ for (x = strtok(xbuf + 1, ","); x; x = strtok(NULL, ",")) {
+ /* <number><1 letter>[optional: '#'+1 letter] */
+ p = x;
+ while (isdigit(*p)) {
+ p++;
+ }
+ if ((*p == '\0')
+ || !((*p == 'c') || (*p == 'j') || (*p == 'k')
+ || (*p == 'm') || (*p == 'n') || (*p == 't'))) {
+ continue; /* continue instead of break for forward compatability. */
+ }
+ *p = '\0';
+ v = atoi(x);
+ if ((v < 1) || (v > 999)) {
+ return 0;
+ }
+ p++;
+ }
+ return 1;
+ }
+}
+
+void unreal_cmd_jupe(char *jserver, char *who, char *reason)
+{
+ char rbuf[256];
+
+ snprintf(rbuf, sizeof(rbuf), "Juped by %s%s%s", who,
+ reason ? ": " : "", reason ? reason : "");
+
+ if (findserver(servlist, jserver))
+ unreal_cmd_squit(jserver, rbuf);
+ unreal_cmd_server(jserver, 2, rbuf);
+ new_server(me_server, jserver, rbuf, SERVER_JUPED, NULL);
+}
+
+/*
+ 1 = valid nick
+ 0 = nick is in valid
+*/
+int unreal_valid_nick(char *nick)
+{
+ if (!stricmp("ircd", nick)) {
+ return 0;
+ }
+ if (!stricmp("irc", nick)) {
+ return 0;
+ }
+ return 1;
+}
+
+int unreal_valid_chan(char *chan) {
+ if (strchr(chan, ':')) {
+ return 0;
+ }
+ return 1;
+}
+
+void unreal_cmd_ctcp(char *source, char *dest, char *buf)
+{
+ char *s;
+ if (!buf) {
+ return;
+ } else {
+ s = normalizeBuffer(buf);
+ }
+
+ send_cmd(source, "%s %s :\1%s \1", send_token("NOTICE", "B"), dest, s);
+ free(s);
+}
+
+/* *INDENT-OFF* */
+void moduleAddIRCDMsgs(void) {
+ Message *m;
+
+ updateProtectDetails("PROTECT","PROTECTME","protect","deprotect","AUTOPROTECT","+a","-a");
+
+ m = createMessage("401", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("402", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("436", anope_event_436); addCoreMessage(IRCD,m);
+ m = createMessage("451", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("461", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("AWAY", anope_event_away); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("6", anope_event_away); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("INVITE", anope_event_null); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("*", anope_event_null); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("JOIN", anope_event_join); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("C", anope_event_join); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("KICK", anope_event_kick); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("H", anope_event_kick); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("KILL", anope_event_kill); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage(".", anope_event_kill); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("MODE", anope_event_mode); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("G", anope_event_mode); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("MOTD", anope_event_motd); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("F", anope_event_motd); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("NICK", anope_event_nick); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("&", anope_event_nick); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("NOTICE", anope_event_notice); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("B", anope_event_notice); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("PART", anope_event_part); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("D", anope_event_part); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("PING", anope_event_ping); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("8", anope_event_ping); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("PRIVMSG", anope_event_privmsg); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("!", anope_event_privmsg); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("QUIT", anope_event_quit); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage(",", anope_event_quit); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("SERVER", anope_event_server); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("'", anope_event_server); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("SQUIT", anope_event_squit); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("-", anope_event_squit); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("TOPIC", anope_event_topic); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage(")", anope_event_topic); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("SVSMODE", anope_event_mode); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("n", anope_event_mode); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("SVS2MODE", anope_event_mode); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("v", anope_event_mode); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("USER", anope_event_null); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("%", anope_event_null); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("WALLOPS", anope_event_null); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("=", anope_event_null); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("WHOIS", anope_event_whois); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("#", anope_event_whois); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("AKILL", anope_event_null); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("V", anope_event_null); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("GLOBOPS", anope_event_globops); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("]", anope_event_globops); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("GNOTICE", anope_event_null); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("Z", anope_event_null); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("GOPER", anope_event_null); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("[", anope_event_null); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("RAKILL", anope_event_null); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("Y", anope_event_null); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("SILENCE", anope_event_null); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("U", anope_event_null); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("SVSKILL", anope_event_null); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("h", anope_event_null); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("SVSNICK", anope_event_null); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("e", anope_event_null); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("SVSNOOP", anope_event_null); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("f", anope_event_null); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("SQLINE", anope_event_null); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("c", anope_event_null); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("UNSQLINE", anope_event_null); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("d", anope_event_null); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("PROTOCTL", anope_event_capab); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("_", anope_event_capab); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("CHGHOST", anope_event_chghost); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("AL", anope_event_chghost); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("CHGIDENT", anope_event_chgident); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("AZ", anope_event_chgident); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("CHGNAME", anope_event_chgname); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("BK", anope_event_chgname); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("NETINFO", anope_event_netinfo); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("AO", anope_event_netinfo); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("SETHOST", anope_event_sethost); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("AA", anope_event_sethost); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("SETIDENT", anope_event_setident); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("AD", anope_event_setident); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("SETNAME", anope_event_setname); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("AE", anope_event_setname); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("TKL", anope_event_tkl); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("BD", anope_event_tkl); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("EOS", anope_event_eos); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("ES", anope_event_eos); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("PASS", anope_event_pass); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("<", anope_event_pass); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("ERROR", anope_event_error); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("5", anope_event_error); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("SMO", anope_event_smo); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("AU", anope_event_smo); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("UMODE2", anope_event_umode2); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("|", anope_event_umode2); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("SWHOIS", anope_event_swhois); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("BA", anope_event_swhois); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("SJOIN", anope_event_sjoin); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("~", anope_event_sjoin); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("REHASH", anope_event_rehash); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("O", anope_event_rehash); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("ADMIN", anope_event_admin); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("@", anope_event_admin); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("CREDITS", anope_event_credits); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("AJ", anope_event_credits); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("SDESC", anope_event_sdesc); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("AG", anope_event_sdesc); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("HTM", anope_event_null); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("BH", anope_event_null); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("HELP", anope_event_null); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("4", anope_event_null); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("TRACE", anope_event_null); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("b", anope_event_null); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("LAG", anope_event_null); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("AF", anope_event_null); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("RPING", anope_event_null); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("AM", anope_event_null); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("SENDSNO", anope_event_null); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("Ss", anope_event_null); addCoreMessage(IRCD,m);
+ }
+ m = createMessage("SENDUMODE", anope_event_null); addCoreMessage(IRCD,m);
+ if (UseTokens) {
+ m = createMessage("AP", anope_event_null); addCoreMessage(IRCD,m);
+ }
+
+ /* The none token version of these is in messages.c */
+ if (UseTokens) {
+ m = createMessage("2", m_stats); addCoreMessage(IRCD,m);
+ m = createMessage(">", m_time); addCoreMessage(IRCD,m);
+ m = createMessage("+", m_version); addCoreMessage(IRCD,m);
+ }
+}
+
+/* *INDENT-ON* */
+
+/**
+ * Tell anope which function we want to perform each task inside of anope.
+ * These prototypes must match what anope expects.
+ **/
+void moduleAddAnopeCmds()
+{
+ pmodule_cmd_svsnoop(unreal_cmd_svsnoop);
+ pmodule_cmd_remove_akill(unreal_cmd_remove_akill);
+ pmodule_cmd_topic(unreal_cmd_topic);
+ pmodule_cmd_vhost_off(unreal_cmd_vhost_off);
+ pmodule_cmd_akill(unreal_cmd_akill);
+ pmodule_cmd_svskill(unreal_cmd_svskill);
+ pmodule_cmd_svsmode(unreal_cmd_svsmode);
+ pmodule_cmd_372(unreal_cmd_372);
+ pmodule_cmd_372_error(unreal_cmd_372_error);
+ pmodule_cmd_375(unreal_cmd_375);
+ pmodule_cmd_376(unreal_cmd_376);
+ pmodule_cmd_nick(unreal_cmd_nick);
+ pmodule_cmd_guest_nick(unreal_cmd_guest_nick);
+ pmodule_cmd_mode(unreal_cmd_mode);
+ pmodule_cmd_bot_nick(unreal_cmd_bot_nick);
+ pmodule_cmd_kick(unreal_cmd_kick);
+ pmodule_cmd_notice_ops(unreal_cmd_notice_ops);
+ pmodule_cmd_notice(unreal_cmd_notice);
+ pmodule_cmd_notice2(unreal_cmd_notice2);
+ pmodule_cmd_privmsg(unreal_cmd_privmsg);
+ pmodule_cmd_privmsg2(unreal_cmd_privmsg2);
+ pmodule_cmd_serv_notice(unreal_cmd_serv_notice);
+ pmodule_cmd_serv_privmsg(unreal_cmd_serv_privmsg);
+ pmodule_cmd_bot_chan_mode(unreal_cmd_bot_chan_mode);
+ pmodule_cmd_351(unreal_cmd_351);
+ pmodule_cmd_quit(unreal_cmd_quit);
+ pmodule_cmd_pong(unreal_cmd_pong);
+ pmodule_cmd_join(unreal_cmd_join);
+ pmodule_cmd_unsqline(unreal_cmd_unsqline);
+ pmodule_cmd_invite(unreal_cmd_invite);
+ pmodule_cmd_part(unreal_cmd_part);
+ pmodule_cmd_391(unreal_cmd_391);
+ pmodule_cmd_250(unreal_cmd_250);
+ pmodule_cmd_307(unreal_cmd_307);
+ pmodule_cmd_311(unreal_cmd_311);
+ pmodule_cmd_312(unreal_cmd_312);
+ pmodule_cmd_317(unreal_cmd_317);
+ pmodule_cmd_219(unreal_cmd_219);
+ pmodule_cmd_401(unreal_cmd_401);
+ pmodule_cmd_318(unreal_cmd_318);
+ pmodule_cmd_242(unreal_cmd_242);
+ pmodule_cmd_243(unreal_cmd_243);
+ pmodule_cmd_211(unreal_cmd_211);
+ pmodule_cmd_global(unreal_cmd_global);
+ pmodule_cmd_global_legacy(unreal_cmd_global_legacy);
+ pmodule_cmd_sqline(unreal_cmd_sqline);
+ pmodule_cmd_squit(unreal_cmd_squit);
+ pmodule_cmd_svso(unreal_cmd_svso);
+ pmodule_cmd_chg_nick(unreal_cmd_chg_nick);
+ pmodule_cmd_svsnick(unreal_cmd_svsnick);
+ pmodule_cmd_vhost_on(unreal_cmd_vhost_on);
+ pmodule_cmd_connect(unreal_cmd_connect);
+ pmodule_cmd_svshold(unreal_cmd_svshold);
+ pmodule_cmd_release_svshold(unreal_cmd_release_svshold);
+ pmodule_cmd_unsgline(unreal_cmd_unsgline);
+ pmodule_cmd_unszline(unreal_cmd_unszline);
+ pmodule_cmd_szline(unreal_cmd_szline);
+ pmodule_cmd_sgline(unreal_cmd_sgline);
+ pmodule_cmd_unban(unreal_cmd_unban);
+ pmodule_cmd_svsmode_chan(unreal_cmd_svsmode_chan);
+ pmodule_cmd_svid_umode(unreal_cmd_svid_umode);
+ pmodule_cmd_nc_change(unreal_cmd_nc_change);
+ pmodule_cmd_svid_umode2(unreal_cmd_svid_umode2);
+ pmodule_cmd_svid_umode3(unreal_cmd_svid_umode3);
+ pmodule_cmd_svsjoin(unreal_cmd_svsjoin);
+ pmodule_cmd_svspart(unreal_cmd_svspart);
+ pmodule_cmd_swhois(unreal_cmd_swhois);
+ pmodule_cmd_eob(unreal_cmd_eob);
+ pmodule_flood_mode_check(unreal_flood_mode_check);
+ pmodule_cmd_jupe(unreal_cmd_jupe);
+ pmodule_valid_nick(unreal_valid_nick);
+ pmodule_valid_chan(unreal_valid_chan);
+ pmodule_cmd_ctcp(unreal_cmd_ctcp);
+ pmodule_set_umode(unreal_set_umode);
+}
+
+/**
+ * Now tell anope how to use us.
+ **/
+int AnopeInit(int argc, char **argv)
+{
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(PROTOCOL);
+
+ pmodule_ircd_version("UnrealIRCd 3.2+");
+ pmodule_ircd_cap(myIrcdcap);
+ pmodule_ircd_var(myIrcd);
+ pmodule_ircd_cbmodeinfos(myCbmodeinfos);
+ pmodule_ircd_cumodes(myCumodes);
+ pmodule_ircd_flood_mode_char_set("+f");
+ pmodule_ircd_flood_mode_char_remove("-f");
+ pmodule_ircd_cbmodes(myCbmodes);
+ pmodule_ircd_cmmodes(myCmmodes);
+ pmodule_ircd_csmodes(myCsmodes);
+ pmodule_ircd_useTSMode(0);
+
+ /** Deal with modes anope _needs_ to know **/
+ pmodule_invis_umode(UMODE_i);
+ pmodule_oper_umode(UMODE_o);
+ pmodule_invite_cmode(CMODE_i);
+ pmodule_secret_cmode(CMODE_s);
+ pmodule_private_cmode(CMODE_p);
+ pmodule_key_mode(CMODE_k);
+ pmodule_limit_mode(CMODE_l);
+
+ moduleAddAnopeCmds();
+ moduleAddIRCDMsgs();
+
+ return MOD_CONT;
+}
diff --git a/src/protocol/unreal32.h b/src/protocol/unreal32.h
new file mode 100644
index 000000000..4f8a9adf6
--- /dev/null
+++ b/src/protocol/unreal32.h
@@ -0,0 +1,153 @@
+/* Unreal IRCD 3.2.x functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@unreal.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.
+ *
+ *
+ */
+
+/*************************************************************************/
+
+/* User Modes */
+#define UMODE_a 0x00000001 /* a Services Admin */
+#define UMODE_h 0x00000002 /* h Available for help (HelpOp) */
+#define UMODE_i 0x00000004 /* i Invisible (not shown in /who) */
+#define UMODE_o 0x00000008 /* o Global IRC Operator */
+#define UMODE_r 0x00000010 /* r Identifies the nick as being registered */
+#define UMODE_w 0x00000020 /* w Can listen to wallop messages */
+#define UMODE_A 0x00000040 /* A Server Admin */
+#define UMODE_N 0x00000080 /* N Network Administrator */
+#define UMODE_O 0x00000100 /* O Local IRC Operator */
+#define UMODE_C 0x00000200 /* C Co-Admin */
+#define UMODE_d 0x00000400 /* d Makes it so you can not receive channel PRIVMSGs */
+#define UMODE_p 0x00000800 /* Hides the channels you are in in a /whois reply */
+#define UMODE_q 0x00001000 /* q Only U:Lines can kick you (Services Admins Only) */
+#define UMODE_s 0x00002000 /* s Can listen to server notices */
+#define UMODE_t 0x00004000 /* t Says you are using a /vhost */
+#define UMODE_v 0x00008000 /* v Receives infected DCC Send Rejection notices */
+#define UMODE_z 0x00010000 /* z Indicates that you are an SSL client */
+#define UMODE_B 0x00020000 /* B Marks you as being a Bot */
+#define UMODE_G 0x00040000 /* G Filters out all the bad words per configuration */
+#define UMODE_H 0x00080000 /* H Hide IRCop Status (IRCop Only) */
+#define UMODE_S 0x00100000 /* S services client */
+#define UMODE_V 0x00200000 /* V Marks you as a WebTV user */
+#define UMODE_W 0x00400000 /* W Lets you see when people do a /whois on you */
+#define UMODE_T 0x00800000 /* T Prevents you from receiving CTCPs */
+#define UMODE_g 0x20000000 /* g Can send & read globops and locops */
+#define UMODE_x 0x40000000 /* x Gives user a hidden hostname */
+#define UMODE_R 0x80000000 /* Allows you to only receive PRIVMSGs/NOTICEs from registered (+r) users */
+
+
+/*************************************************************************/
+
+/* Channel Modes */
+
+#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
+#define CMODE_R 0x00000100 /* Only identified users can join */
+#define CMODE_r 0x00000200 /* Set for all registered channels */
+#define CMODE_c 0x00000400
+#define CMODE_A 0x00000800
+/* #define CMODE_H 0x00001000 Was now +I may not join, but Unreal Removed it and it will not set in 3.2 */
+#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
+#define CMODE_T 0x02000000
+#define CMODE_M 0x04000000
+
+
+/* Default Modes with MLOCK */
+
+#define DEFAULT_MLOCK CMODE_n | CMODE_t | CMODE_r
+
+void unreal_set_umode(User * user, int ac, char **av);
+void unreal_cmd_svsnoop(char *server, int set);
+void unreal_cmd_remove_akill(char *user, char *host);
+void unreal_cmd_topic(char *whosets, char *chan, char *whosetit, char *topic, time_t when);
+void unreal_cmd_vhost_off(User * u);
+void unreal_cmd_akill(char *user, char *host, char *who, time_t when,time_t expires, char *reason);
+void unreal_cmd_svskill(char *source, char *user, char *buf);
+void unreal_cmd_svsmode(User * u, int ac, char **av);
+void unreal_cmd_372(char *source, char *msg);
+void unreal_cmd_372_error(char *source);
+void unreal_cmd_375(char *source);
+void unreal_cmd_376(char *source);
+void unreal_cmd_nick(char *nick, char *name, char *modes);
+void unreal_cmd_guest_nick(char *nick, char *user, char *host, char *real, char *modes);
+void unreal_cmd_mode(char *source, char *dest, char *buf);
+void unreal_cmd_bot_nick(char *nick, char *user, char *host, char *real, char *modes);
+void unreal_cmd_kick(char *source, char *chan, char *user, char *buf);
+void unreal_cmd_notice_ops(char *source, char *dest, char *buf);
+void unreal_cmd_notice(char *source, char *dest, char *buf);
+void unreal_cmd_notice2(char *source, char *dest, char *msg);
+void unreal_cmd_privmsg(char *source, char *dest, char *buf);
+void unreal_cmd_privmsg2(char *source, char *dest, char *msg);
+void unreal_cmd_serv_notice(char *source, char *dest, char *msg);
+void unreal_cmd_serv_privmsg(char *source, char *dest, char *msg);
+void unreal_cmd_bot_chan_mode(char *nick, char *chan);
+void unreal_cmd_351(char *source);
+void unreal_cmd_quit(char *source, char *buf);
+void unreal_cmd_pong(char *servname, char *who);
+void unreal_cmd_join(char *user, char *channel, time_t chantime);
+void unreal_cmd_unsqline(char *user);
+void unreal_cmd_invite(char *source, char *chan, char *nick);
+void unreal_cmd_part(char *nick, char *chan, char *buf);
+void unreal_cmd_391(char *source, char *timestr);
+void unreal_cmd_250(char *buf);
+void unreal_cmd_307(char *buf);
+void unreal_cmd_311(char *buf);
+void unreal_cmd_312(char *buf);
+void unreal_cmd_317(char *buf);
+void unreal_cmd_219(char *source, char *letter);
+void unreal_cmd_401(char *source, char *who);
+void unreal_cmd_318(char *source, char *who);
+void unreal_cmd_242(char *buf);
+void unreal_cmd_243(char *buf);
+void unreal_cmd_211(char *buf);
+void unreal_cmd_global(char *source, char *buf);
+void unreal_cmd_global_legacy(char *source, char *fmt);
+void unreal_cmd_sqline(char *mask, char *reason);
+void unreal_cmd_squit(char *servname, char *message);
+void unreal_cmd_svso(char *source, char *nick, char *flag);
+void unreal_cmd_chg_nick(char *oldnick, char *newnick);
+void unreal_cmd_svsnick(char *source, char *guest, time_t when);
+void unreal_cmd_vhost_on(char *nick, char *vIdent, char *vhost);
+void unreal_cmd_connect(int servernum);
+void unreal_cmd_svshold(char *nick);
+void unreal_cmd_release_svshold(char *nick);
+void unreal_cmd_unsgline(char *mask);
+void unreal_cmd_unszline(char *mask);
+void unreal_cmd_szline(char *mask, char *reason, char *whom);
+void unreal_cmd_sgline(char *mask, char *reason);
+void unreal_cmd_unban(char *name, char *nick);
+void unreal_cmd_svsmode_chan(char *name, char *mode, char *nick);
+void unreal_cmd_svid_umode(char *nick, time_t ts);
+void unreal_cmd_nc_change(User * u);
+void unreal_cmd_svid_umode2(User * u, char *ts);
+void unreal_cmd_svid_umode3(User * u, char *ts);
+void unreal_cmd_eob();
+int unreal_flood_mode_check(char *value);
+void unreal_cmd_jupe(char *jserver, char *who, char *reason);
+int unreal_valid_nick(char *nick);
+void unreal_cmd_ctcp(char *source, char *dest, char *buf);
+
diff --git a/src/protocol/viagra.c b/src/protocol/viagra.c
new file mode 100644
index 000000000..8638204b7
--- /dev/null
+++ b/src/protocol/viagra.c
@@ -0,0 +1,1716 @@
+/* Viagra IRCD functions
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+
+#include "services.h"
+#include "pseudo.h"
+#include "viagra.h"
+
+IRCDVar myIrcd[] = {
+ {"ViagraIRCd 1.3.*", /* ircd name */
+ "+oS", /* nickserv mode */
+ "+oS", /* chanserv mode */
+ "+oS", /* memoserv mode */
+ "+oS", /* hostserv mode */
+ "+ioS", /* operserv mode */
+ "+oS", /* botserv mode */
+ "+oS", /* helpserv mode */
+ "+i", /* Dev/Null mode */
+ "+ioS", /* Global mode */
+ "+oS", /* nickserv alias mode */
+ "+oS", /* chanserv alias mode */
+ "+oS", /* memoserv alias mode */
+ "+ioS", /* hostserv alias mode */
+ "+ioS", /* operserv alias mode */
+ "+oS", /* botserv alias mode */
+ "+oS", /* helpserv alias mode */
+ "+iS", /* Dev/Null alias mode */
+ "+ioS", /* Global alias mode */
+ "+qS", /* Used by BotServ Bots */
+ 5, /* Chan Max Symbols */
+ "-ciklmnpstOR", /* Modes to Remove */
+ "+ao", /* Channel Umode used by Botserv bots */
+ 1, /* SVSNICK */
+ 1, /* Vhost */
+ 1, /* Has Owner */
+ "+q", /* Mode to set for an owner */
+ "-q", /* Mode to unset for an owner */
+ "+a", /* Mode to set for channel admin */
+ "-a", /* Mode to unset for channel admin */
+ "+rd", /* Mode On Reg */
+ NULL, /* Mode on ID for Roots */
+ NULL, /* Mode on ID for Admins */
+ NULL, /* Mode on ID for Opers */
+ "-r+d", /* Mode on UnReg */
+ "-r+d", /* Mode on Nick Change */
+ 1, /* Supports SGlines */
+ 1, /* Supports SQlines */
+ 1, /* Supports SZlines */
+ 1, /* Supports Halfop +h */
+ 3, /* Number of server args */
+ 0, /* Join 2 Set */
+ 0, /* Join 2 Message */
+ 1, /* Has exceptions +e */
+ 0, /* TS Topic Forward */
+ 0, /* TS Topci Backward */
+ 0, /* Protected Umode */
+ 1, /* Has Admin */
+ 0, /* Chan SQlines */
+ 1, /* Quit on Kill */
+ 1, /* SVSMODE unban */
+ 1, /* Has Protect */
+ 0, /* Reverse */
+ 1, /* Chan Reg */
+ CMODE_r, /* Channel Mode */
+ 1, /* vidents */
+ 0, /* svshold */
+ 1, /* time stamp on mode */
+ 1, /* NICKIP */
+ 0, /* O:LINE */
+ 1, /* UMODE */
+ 1, /* VHOST ON NICK */
+ 1, /* Change RealName */
+ 0, /* No Knock */
+ 0, /* Admin Only */
+ DEFAULT_MLOCK, /* Default MLOCK */
+ UMODE_x, /* Vhost Mode */
+ 0, /* +f */
+ 0, /* +L */
+ 0,
+ 0,
+ 1,
+ 1, /* No Knock requires +i */
+ NULL, /* CAPAB Chan Modes */
+ 0, /* We support TOKENS */
+ 1, /* TOKENS are CASE inSensitive */
+ 0, /* TIME STAMPS are BASE64 */
+ 0, /* +I support */
+ 0, /* SJOIN ban char */
+ 0, /* SJOIN except char */
+ 0, /* SJOIN invite char */
+ 0, /* Can remove User Channel Modes with SVSMODE */
+ 0, /* Sglines are not enforced until user reconnects */
+ "x", /* vhost char */
+ 0, /* ts6 */
+ 1, /* support helper umode */
+ 0, /* p10 */
+ NULL, /* character set */
+ 1, /* reports sync state */
+ 0, /* CIDR channelbans */
+ }
+ ,
+ {NULL}
+};
+
+
+IRCDCAPAB myIrcdcap[] = {
+ {
+ CAPAB_NOQUIT, /* NOQUIT */
+ CAPAB_TSMODE, /* TSMODE */
+ CAPAB_UNCONNECT, /* UNCONNECT */
+ CAPAB_NICKIP, /* NICKIP */
+ CAPAB_NSJOIN, /* SJOIN */
+ CAPAB_ZIP, /* ZIP */
+ CAPAB_BURST, /* BURST */
+ CAPAB_TS5, /* TS5 */
+ CAPAB_TS3, /* TS3 */
+ CAPAB_DKEY, /* DKEY */
+ 0, /* PT4 */
+ 0, /* SCS */
+ 0, /* QS */
+ 0, /* UID */
+ 0, /* KNOCK */
+ 0, /* CLIENT */
+ 0, /* IPV6 */
+ 0, /* SSJ5 */
+ 0, /* SN2 */
+ 0, /* TOKEN */
+ 0, /* VHOST */
+ 0, /* SSJ3 */
+ 0, /* NICK2 */
+ 0, /* UMODE2 */
+ 0, /* VL */
+ 0, /* TLKEXT */
+ CAPAB_DODKEY, /* DODKEY */
+ CAPAB_DOZIP, /* DOZIP */
+ 0, 0, 0}
+};
+
+
+
+
+void viagra_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) {
+
+ /* This looks better, much better than "add ? (do_add) : (do_remove)".
+ * At least this is readable without paying much attention :) -GD
+ */
+ if (add)
+ user->mode |= umodes[(int) *modes];
+ else
+ user->mode &= ~umodes[(int) *modes];
+
+ switch (*modes++) {
+ case '+':
+ add = 1;
+ break;
+ case '-':
+ add = 0;
+ break;
+ case 'd':
+ if (ac == 0) {
+ alog("user: umode +d with no parameter (?) for user %s",
+ user->nick);
+ break;
+ }
+
+ ac--;
+ av++;
+ user->svid = strtoul(*av, NULL, 0);
+ break;
+ case 'o':
+ if (add) {
+ opcnt++;
+ if (WallOper) {
+ anope_cmd_global(s_OperServ,
+ "\2%s\2 is now an IRC operator.",
+ user->nick);
+ }
+ display_news(user, NEWS_OPER);
+ } else {
+ opcnt--;
+ }
+ break;
+ case 'r':
+ if (add && !nick_identified(user)) {
+ common_svsmode(user, "-r", NULL);
+ user->mode &= ~UMODE_r;
+ }
+ break;
+ case 'x':
+ update_host(user);
+ break;
+ }
+ }
+}
+
+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, UMODE_C, 0, 0, 0, 0, 0, UMODE_I, 0, 0, 0, 0, UMODE_N,
+ UMODE_O,
+ 0,
+ UMODE_Q,
+ UMODE_R,
+ UMODE_S, UMODE_T, 0, 0, 0, 0, 0,
+ 0,
+ 0, 0, 0, 0, 0,
+ 0, UMODE_a, UMODE_b, UMODE_c, UMODE_d, UMODE_e, UMODE_f,
+ UMODE_g,
+ UMODE_h, UMODE_i, 0, 0, 0, 0, UMODE_n, UMODE_o,
+ 0,
+ 0, UMODE_r, UMODE_s, 0, 0, 0, UMODE_w,
+ UMODE_x,
+ 0,
+ 0,
+ 0, 0, 0, 0, 0
+};
+
+
+char myCsmodes[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,
+ 'h', /* (37) % Channel halfops */
+ 0, /* (38) & bans */
+ 0, 0, 0,
+ 'q',
+
+ '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, 'a', 0
+};
+
+CMMode myCmmodes[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},
+ {add_exception, del_exception},
+ {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}
+};
+
+
+
+CBMode myCbmodes[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}, /* A */
+ {0}, /* B */
+ {0}, /* C */
+ {0}, /* D */
+ {0}, /* E */
+ {0}, /* F */
+ {0}, /* G */
+ {CMODE_H, 0, NULL, NULL}, /* H */
+ {0}, /* I */
+ {0}, /* J */
+ {0}, /* K */
+ {0}, /* L */
+ {CMODE_M, 0, NULL, NULL}, /* M */
+ {CMODE_N, 0, NULL, NULL}, /* N */
+ {CMODE_O, CBM_NO_USER_MLOCK, NULL, NULL},
+ {CMODE_P, 0, NULL, NULL}, /* P */
+ {0}, /* Q */
+ {CMODE_R, 0, NULL, NULL}, /* R */
+ {CMODE_S, 0, NULL, NULL}, /* S */
+ {0}, /* T */
+ {0}, /* U */
+ {0}, /* V */
+ {0}, /* W */
+ {0}, /* X */
+ {0}, /* Y */
+ {0}, /* Z */
+ {0}, {0}, {0}, {0}, {0}, {0},
+ {0}, /* a */
+ {0}, /* b */
+ {CMODE_c, 0, NULL, NULL},
+ {0}, /* d */
+ {0}, /* e */
+ {0}, /* f */
+ {0}, /* g */
+ {0}, /* h */
+ {CMODE_i, 0, NULL, NULL},
+ {0}, /* j */
+ {CMODE_k, 0, chan_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},
+ {0}, /* q */
+ {CMODE_r, CBM_NO_MLOCK, NULL, NULL},
+ {CMODE_s, 0, NULL, NULL},
+ {CMODE_t, 0, NULL, NULL},
+ {0},
+ {0}, /* v */
+ {0}, /* w */
+ {CMODE_x, 0, NULL, NULL}, /* x */
+ {0}, /* y */
+ {0}, /* z */
+ {0}, {0}, {0}, {0}
+};
+
+CBModeInfo myCbmodeinfos[] = {
+ {'c', CMODE_c, 0, NULL, NULL},
+ {'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},
+ {'r', CMODE_r, 0, NULL, NULL},
+ {'s', CMODE_s, 0, NULL, NULL},
+ {'t', CMODE_t, 0, NULL, NULL},
+ {'x', CMODE_x, 0, NULL, NULL},
+ {'H', CMODE_H, 0, NULL, NULL},
+ {'M', CMODE_M, 0, NULL, NULL},
+ {'N', CMODE_N, 0, NULL, NULL},
+ {'O', CMODE_O, 0, NULL, NULL},
+ {'P', CMODE_P, 0, NULL, NULL},
+ {'R', CMODE_R, 0, NULL, NULL},
+ {'S', CMODE_S, 0, NULL, NULL},
+ {0}
+};
+
+CUMode myCumodes[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},
+
+ {CUS_PROTECT, CUF_PROTECT_BOTSERV, check_valid_op},
+ {0}, /* b */
+ {0}, /* c */
+ {0}, /* d */
+ {0}, /* e */
+ {0}, /* f */
+ {0}, /* g */
+ {CUS_HALFOP, 0, check_valid_op},
+ {0}, /* i */
+ {0}, /* j */
+ {0}, /* k */
+ {0}, /* l */
+ {0}, /* m */
+ {0}, /* n */
+ {CUS_OP, CUF_PROTECT_BOTSERV, check_valid_op},
+ {0}, /* p */
+ {CUS_OWNER, 0, check_valid_op},
+ {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}
+};
+
+
+void viagra_cmd_bot_unban(ChannelInfo * ci, char *nick)
+{
+ send_cmd(ServerName, "SVSMODE %s -b %s", ci->name, nick);
+}
+
+int anope_event_setname(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 1)
+ return MOD_CONT;
+
+ u = finduser(source);
+ if (!u) {
+ if (debug) {
+ alog("debug: SETNAME for nonexistent user %s", source);
+ }
+ return MOD_CONT;
+ }
+
+ change_user_realname(u, av[0]);
+ return MOD_CONT;
+}
+
+int anope_event_sjoin(char *source, int ac, char **av)
+{
+ do_sjoin(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_chgname(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 2)
+ return MOD_CONT;
+
+ u = finduser(av[0]);
+ if (!u) {
+ if (debug) {
+ alog("debug: CHGNAME for nonexistent user %s", av[0]);
+ }
+ return MOD_CONT;
+ }
+
+ change_user_realname(u, av[1]);
+ return MOD_CONT;
+}
+
+int anope_event_setident(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 1)
+ return MOD_CONT;
+
+ u = finduser(source);
+ if (!u) {
+ if (debug) {
+ alog("debug: SETIDENT for nonexistent user %s", source);
+ }
+ return MOD_CONT;
+ }
+
+ change_user_username(u, av[0]);
+ return MOD_CONT;
+}
+
+int anope_event_chgident(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 2)
+ return MOD_CONT;
+
+ u = finduser(av[0]);
+ if (!u) {
+ if (debug) {
+ alog("debug: CHGIDENT for nonexistent user %s", av[0]);
+ }
+ return MOD_CONT;
+ }
+
+ change_user_username(u, av[1]);
+ return MOD_CONT;
+}
+
+/*
+ * sethost
+ * parv[0] = sender
+ * parv[1] = newhost
+ */
+int anope_event_sethost(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 1)
+ return MOD_CONT;
+
+ u = finduser(source);
+ if (!u) {
+ if (debug) {
+ alog("debug: SETHOST for nonexistent user %s", source);
+ }
+ return MOD_CONT;
+ }
+
+ change_user_host(u, av[0]);
+ return MOD_CONT;
+}
+
+int anope_event_nick(char *source, int ac, char **av)
+{
+ User *user;
+
+ if (ac != 2) {
+ 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), "*", NULL);
+ if (user) {
+ anope_set_umode(user, 1, &av[3]);
+ }
+ } else {
+ do_nick(source, av[0], NULL, NULL, NULL, NULL,
+ strtoul(av[1], NULL, 10), 0, 0, NULL, NULL);
+ }
+ return MOD_CONT;
+}
+
+int anope_event_vs(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 2)
+ return MOD_CONT;
+
+ u = finduser(av[0]);
+ if (!u) {
+ if (debug) {
+ alog("debug: VS for nonexistent user %s", av[0]);
+ }
+ return MOD_CONT;
+ }
+
+ change_user_host(u, av[1]);
+ return MOD_CONT;
+
+}
+
+int anope_event_chghost(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 2)
+ return MOD_CONT;
+
+ u = finduser(av[0]);
+ if (!u) {
+ if (debug) {
+ alog("debug: CHGHOST for nonexistent user %s", av[0]);
+ }
+ return MOD_CONT;
+ }
+
+ change_user_host(u, av[1]);
+ return MOD_CONT;
+}
+
+int anope_event_436(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+
+ m_nickcoll(av[0]);
+ return MOD_CONT;
+}
+
+int anope_event_notice(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_pass(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_svinfo(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+/*
+ * gnotice
+ * parv[0] = sender prefix
+ * parv[1] = message text
+ */
+int anope_event_gnotice(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_sqline(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_burst(char *source, int ac, char **av)
+{
+ Server *s;
+ s = findserver(servlist, source);
+ if (!ac) {
+ /* for future use - start burst */
+ } else {
+ /* If we found a server with the given source, that one just
+ * finished bursting. If there was no source, then our uplink
+ * server finished bursting. -GD
+ */
+ if (!s && serv_uplink)
+ s = serv_uplink;
+ finish_sync(s, 1);
+ }
+ return MOD_CONT;
+}
+
+int anope_event_tctrl(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+/*
+ * error
+ * parv[0] = sender prefix
+ * parv[*] = parameters
+ */
+int anope_event_error(char *source, int ac, char **av)
+{
+ if (ac >= 1) {
+ if (debug) {
+ alog("debug: %s", av[0]);
+ }
+ }
+ return MOD_CONT;
+}
+
+/* *INDENT-OFF* */
+void moduleAddIRCDMsgs(void) {
+ Message *m;
+
+ updateProtectDetails("PROTECT","PROTECTME","protect","deprotect","AUTOPROTECT","+a","-a");
+
+ m = createMessage("401", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("402", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("436", anope_event_436); addCoreMessage(IRCD,m);
+ m = createMessage("AWAY", anope_event_away); addCoreMessage(IRCD,m);
+ m = createMessage("INVITE", anope_event_invite); addCoreMessage(IRCD,m);
+ m = createMessage("JOIN", anope_event_join); addCoreMessage(IRCD,m);
+ m = createMessage("KICK", anope_event_kick); addCoreMessage(IRCD,m);
+ m = createMessage("KILL", anope_event_kill); addCoreMessage(IRCD,m);
+ m = createMessage("MODE", anope_event_mode); addCoreMessage(IRCD,m);
+ m = createMessage("MOTD", anope_event_motd); addCoreMessage(IRCD,m);
+ m = createMessage("NICK", anope_event_nick); addCoreMessage(IRCD,m);
+ m = createMessage("NOTICE", anope_event_notice); addCoreMessage(IRCD,m);
+ m = createMessage("PART", anope_event_part); addCoreMessage(IRCD,m);
+ m = createMessage("PASS", anope_event_pass); addCoreMessage(IRCD,m);
+ m = createMessage("PING", anope_event_ping); addCoreMessage(IRCD,m);
+ m = createMessage("PRIVMSG", anope_event_privmsg); addCoreMessage(IRCD,m);
+ m = createMessage("QUIT", anope_event_quit); addCoreMessage(IRCD,m);
+ m = createMessage("SERVER", anope_event_server); addCoreMessage(IRCD,m);
+ m = createMessage("SQUIT", anope_event_squit); addCoreMessage(IRCD,m);
+ m = createMessage("TOPIC", anope_event_topic); addCoreMessage(IRCD,m);
+ m = createMessage("WALLOPS", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("WHOIS", anope_event_whois); addCoreMessage(IRCD,m);
+ m = createMessage("AKILL", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("GLOBOPS", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("GNOTICE", anope_event_gnotice); addCoreMessage(IRCD,m);
+ m = createMessage("GOPER", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("RAKILL", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SILENCE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SVSKILL", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SVSMODE", anope_event_mode); addCoreMessage(IRCD,m);
+ m = createMessage("SVSNICK", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SVSNOOP", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SQLINE", anope_event_sqline); addCoreMessage(IRCD,m);
+ m = createMessage("UNSQLINE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("CAPAB", anope_event_capab); addCoreMessage(IRCD,m);
+ m = createMessage("CS", anope_event_cs); addCoreMessage(IRCD,m);
+ m = createMessage("HS", anope_event_hs); addCoreMessage(IRCD,m);
+ m = createMessage("MS", anope_event_ms); addCoreMessage(IRCD,m);
+ m = createMessage("NS", anope_event_ns); addCoreMessage(IRCD,m);
+ m = createMessage("OS", anope_event_os); addCoreMessage(IRCD,m);
+ m = createMessage("RS", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SGLINE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SJOIN", anope_event_sjoin); addCoreMessage(IRCD,m);
+ m = createMessage("SS", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("SVINFO", anope_event_svinfo); addCoreMessage(IRCD,m);
+ m = createMessage("SZLINE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("UNSGLINE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("UNSZLINE", anope_event_null); addCoreMessage(IRCD,m);
+ m = createMessage("CHGHOST", anope_event_chghost); addCoreMessage(IRCD,m);
+ m = createMessage("CHGIDENT", anope_event_chgident); addCoreMessage(IRCD,m);
+ m = createMessage("CHGNAME", anope_event_chgname); addCoreMessage(IRCD,m);
+ m = createMessage("SETHOST", anope_event_sethost); addCoreMessage(IRCD,m);
+ m = createMessage("SETIDENT", anope_event_setident); addCoreMessage(IRCD,m);
+ m = createMessage("SETNAME", anope_event_setname); addCoreMessage(IRCD,m);
+ m = createMessage("VS", anope_event_vs); addCoreMessage(IRCD,m);
+ m = createMessage("BURST", anope_event_burst); addCoreMessage(IRCD,m);
+ m = createMessage("TCTRL", anope_event_tctrl); addCoreMessage(IRCD,m);
+ m = createMessage("ERROR", anope_event_error); addCoreMessage(IRCD,m);
+ m = createMessage("REHASH", anope_event_rehash); addCoreMessage(IRCD,m);
+ m = createMessage("ADMIN", anope_event_admin); addCoreMessage(IRCD,m);
+ m = createMessage("SNOTICE", anope_event_snotice); addCoreMessage(IRCD,m);
+}
+
+/* *INDENT-ON* */
+
+
+/* SQLINE */
+void viagra_cmd_sqline(char *mask, char *reason)
+{
+ if (!mask || !reason) {
+ return;
+ }
+
+ send_cmd(NULL, "SQLINE %s :%s", mask, reason);
+}
+
+void viagra_cmd_unsgline(char *mask)
+{
+ send_cmd(NULL, "UNSGLINE 0 :%s", mask);
+}
+
+void viagra_cmd_unszline(char *mask)
+{
+ send_cmd(NULL, "UNSZLINE 0 %s", mask);
+}
+
+void viagra_cmd_szline(char *mask, char *reason, char *whom)
+{
+ send_cmd(NULL, "SZLINE %s :%s", mask, reason);
+}
+
+void viagra_cmd_svsnoop(char *server, int set)
+{
+ send_cmd(NULL, "SVSNOOP %s %s", server, (set ? "+" : "-"));
+}
+
+void viagra_cmd_svsadmin(char *server, int set)
+{
+ viagra_cmd_svsnoop(server, set);
+}
+
+void viagra_cmd_sgline(char *mask, char *reason)
+{
+ send_cmd(NULL, "SGLINE %d :%s:%s", (int)strlen(mask), mask, reason);
+}
+
+void viagra_cmd_remove_akill(char *user, char *host)
+{
+ send_cmd(NULL, "RAKILL %s %s", host, user);
+}
+
+/* PART */
+void viagra_cmd_part(char *nick, char *chan, char *buf)
+{
+ if (!nick || !chan) {
+ return;
+ }
+
+ if (buf) {
+ send_cmd(nick, "PART %s :%s", chan, buf);
+ } else {
+ send_cmd(nick, "PART %s", chan);
+ }
+}
+
+void viagra_cmd_topic(char *whosets, char *chan, char *whosetit,
+ char *topic, time_t when)
+{
+ send_cmd(whosets, "TOPIC %s %s %lu :%s", chan, whosetit,
+ (unsigned long int) when, topic);
+}
+
+void viagra_cmd_vhost_off(User * u)
+{
+ send_cmd(NULL, "SVSMODE %s -x", u->nick);
+ notice_lang(s_HostServ, u, HOST_OFF_UNREAL, u->nick, ircd->vhostchar);
+}
+
+void viagra_cmd_vhost_on(char *nick, char *vIdent, char *vhost)
+{
+ 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);
+}
+
+void viagra_cmd_unsqline(char *user)
+{
+ send_cmd(NULL, "UNSQLINE %s", user);
+}
+
+void viagra_cmd_join(char *user, char *channel, time_t chantime)
+{
+ send_cmd(user, "SJOIN %ld %s", (long int) chantime, channel);
+}
+
+
+/*
+ * m_akill()
+ * parv[1]=host
+ * parv[2]=user
+ * parv[3]=length
+ * parv[4]=akiller
+ * parv[5]=time set
+ * parv[6]=reason
+ */
+void viagra_cmd_akill(char *user, char *host, char *who, time_t when,
+ time_t expires, char *reason)
+{
+ send_cmd(NULL, "AKILL %s %s %d %s %ld :%s", host, user, 86400 * 2, who,
+ (long int) time(NULL), reason);
+}
+
+
+/*
+ * svskill
+ * parv[0] = servername
+ * parv[1] = client
+ * parv[2] = nick stamp
+ * parv[3] = kill message
+ */
+void viagra_cmd_svskill(char *source, char *user, char *buf)
+{
+ if (buf) {
+ send_cmd(source, "SVSKILL %s :%s", user, buf);
+ }
+ return;
+}
+
+void viagra_cmd_mode(char *source, char *dest, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ if (ircdcap->tsmode) {
+ if (uplink_capab & ircdcap->tsmode) {
+ send_cmd(source, "MODE %s 0 %s", dest, buf);
+ } else {
+ send_cmd(source, "MODE %s %s", dest, buf);
+ }
+ } else {
+ send_cmd(source, "MODE %s %s", dest, buf);
+ }
+}
+
+/* QUIT */
+void viagra_cmd_quit(char *source, char *buf)
+{
+ if (buf) {
+ send_cmd(source, "QUIT :%s", buf);
+ } else {
+ send_cmd(source, "QUIT");
+ }
+}
+
+int anope_event_away(char *source, int ac, char **av)
+{
+ if (!source) {
+ return MOD_CONT;
+ }
+ m_away(source, (ac ? av[0] : NULL));
+ return MOD_CONT;
+}
+
+int anope_event_ping(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+ viagra_cmd_pong(ac > 1 ? av[1] : ServerName, av[0]);
+ return MOD_CONT;
+}
+
+void viagra_cmd_svsmode(User * u, int ac, char **av)
+{
+ send_cmd(ServerName, "SVSMODE %s %ld %s%s%s", u->nick,
+ (long int) u->timestamp, av[0], (ac == 2 ? " " : ""),
+ (ac == 2 ? av[1] : ""));
+}
+
+void viagra_cmd_squit(char *servname, char *message)
+{
+ send_cmd(NULL, "SQUIT %s :%s", servname, message);
+}
+
+/* PONG */
+void viagra_cmd_pong(char *servname, char *who)
+{
+ send_cmd(servname, "PONG %s", who);
+}
+
+/*
+ * svinfo
+ * parv[0] = sender prefix
+ * parv[1] = TS_CURRENT for the server
+ * parv[2] = TS_MIN for the server
+ * parv[3] = server is standalone or connected to non-TS only
+ * parv[4] = server's idea of UTC time
+ */
+void viagra_cmd_svinfo()
+{
+ send_cmd(NULL, "SVINFO 5 3 0 :%ld", (long int) time(NULL));
+}
+
+/* CAPAB */
+void viagra_cmd_capab()
+{
+ send_cmd(NULL, "CAPAB TS5 NOQUIT SSJOIN BURST UNCONNECT NICKIP");
+}
+
+/* PASS */
+void viagra_cmd_pass(char *pass)
+{
+ send_cmd(NULL, "PASS %s :TS", pass);
+}
+
+/* SERVER */
+void viagra_cmd_server(char *servname, int hop, char *descript)
+{
+ send_cmd(NULL, "SERVER %s %d :%s", servname, hop, descript);
+}
+
+void viagra_cmd_burst()
+{
+ send_cmd(NULL, "BURST");
+}
+
+void viagra_cmd_connect(int servernum)
+{
+ me_server =
+ new_server(NULL, ServerName, ServerDesc, SERVER_ISME, NULL);
+
+ if (servernum == 1) {
+ viagra_cmd_pass(RemotePassword);
+ } else if (servernum == 2) {
+ viagra_cmd_pass(RemotePassword2);
+ } else if (servernum == 3) {
+ viagra_cmd_pass(RemotePassword3);
+ }
+ viagra_cmd_capab();
+ viagra_cmd_server(ServerName, 1, ServerDesc);
+ viagra_cmd_svinfo();
+ viagra_cmd_burst();
+}
+
+/* EVENT : OS */
+int anope_event_os(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+ m_privmsg(source, s_OperServ, av[0]);
+ return MOD_CONT;
+}
+
+/* EVENT : NS */
+int anope_event_ns(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+ m_privmsg(source, s_NickServ, av[0]);
+ return MOD_CONT;
+}
+
+/* EVENT : MS */
+int anope_event_ms(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+ m_privmsg(source, s_MemoServ, av[0]);
+ return MOD_CONT;
+}
+
+/* EVENT : HS */
+int anope_event_hs(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+ m_privmsg(source, s_HostServ, av[0]);
+ return MOD_CONT;
+}
+
+/* EVENT : CS */
+int anope_event_cs(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+ m_privmsg(source, s_ChanServ, av[0]);
+ return MOD_CONT;
+}
+
+int anope_event_server(char *source, int ac, char **av)
+{
+ if (!stricmp(av[1], "1")) {
+ uplink = sstrdup(av[0]);
+ }
+ do_server(source, av[0], av[1], av[2], NULL);
+ return MOD_CONT;
+}
+
+
+int anope_event_privmsg(char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+ m_privmsg(source, av[0], av[1]);
+ return MOD_CONT;
+}
+
+int anope_event_part(char *source, int ac, char **av)
+{
+ if (ac < 1 || ac > 2)
+ return MOD_CONT;
+ do_part(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_whois(char *source, int ac, char **av)
+{
+ if (source && ac >= 1) {
+ m_whois(source, av[0]);
+ }
+ return MOD_CONT;
+}
+
+int anope_event_topic(char *source, int ac, char **av)
+{
+ if (ac != 4)
+ return MOD_CONT;
+ do_topic(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_squit(char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+ do_squit(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_quit(char *source, int ac, char **av)
+{
+ if (ac != 1)
+ return MOD_CONT;
+ do_quit(source, ac, av);
+ return MOD_CONT;
+}
+
+
+int anope_event_mode(char *source, int ac, char **av)
+{
+ if (ac < 2)
+ return MOD_CONT;
+
+ if (*av[0] == '#' || *av[0] == '&') {
+ do_cmode(source, ac, av);
+ } else {
+ do_umode(source, ac, av);
+ }
+ return MOD_CONT;
+}
+
+int anope_event_kill(char *source, int ac, char **av)
+{
+ if (ac != 2)
+ return MOD_CONT;
+
+ m_kill(av[0], av[1]);
+ return MOD_CONT;
+}
+
+int anope_event_kick(char *source, int ac, char **av)
+{
+ if (ac != 3)
+ return MOD_CONT;
+ do_kick(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_join(char *source, int ac, char **av)
+{
+ if (ac != 1)
+ return MOD_CONT;
+ do_join(source, ac, av);
+ return MOD_CONT;
+}
+
+int anope_event_motd(char *source, int ac, char **av)
+{
+ if (!source) {
+ return MOD_CONT;
+ }
+
+ m_motd(source);
+ return MOD_CONT;
+}
+
+void viagra_cmd_notice_ops(char *source, char *dest, char *buf)
+{
+ if (buf) {
+ send_cmd(NULL, "NOTICE @%s :%s", dest, buf);
+ }
+ return;
+}
+
+void viagra_cmd_notice(char *source, char *dest, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ if (NSDefFlags & NI_MSG) {
+ viagra_cmd_privmsg2(source, dest, buf);
+ } else {
+ send_cmd(source, "NOTICE %s :%s", dest, buf);
+ }
+}
+
+void viagra_cmd_notice2(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "NOTICE %s :%s", dest, msg);
+}
+
+void viagra_cmd_privmsg(char *source, char *dest, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(source, "PRIVMSG %s :%s", dest, buf);
+}
+
+void viagra_cmd_privmsg2(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "PRIVMSG %s :%s", dest, msg);
+}
+
+void viagra_cmd_serv_notice(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "NOTICE $%s :%s", dest, msg);
+}
+
+void viagra_cmd_serv_privmsg(char *source, char *dest, char *msg)
+{
+ send_cmd(source, "PRIVMSG $%s :%s", dest, msg);
+}
+
+/* GLOBOPS */
+void viagra_cmd_global(char *source, char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(source ? source : ServerName, "GLOBOPS :%s", buf);
+}
+
+/* 391 */
+void viagra_cmd_391(char *source, char *timestr)
+{
+ if (!timestr) {
+ return;
+ }
+ send_cmd(NULL, "391 :%s %s :%s", source, ServerName, timestr);
+}
+
+/* 250 */
+void viagra_cmd_250(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "250 %s", buf);
+}
+
+/* 307 */
+void viagra_cmd_307(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "307 %s", buf);
+}
+
+/* 311 */
+void viagra_cmd_311(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "311 %s", buf);
+}
+
+/* 312 */
+void viagra_cmd_312(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "312 %s", buf);
+}
+
+/* 317 */
+void viagra_cmd_317(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(ServerName, "317 %s", buf);
+}
+
+/* 219 */
+void viagra_cmd_219(char *source, char *letter)
+{
+ if (!source) {
+ return;
+ }
+
+ if (letter) {
+ send_cmd(NULL, "219 %s %c :End of /STATS report.", source,
+ *letter);
+ } else {
+ send_cmd(NULL, "219 %s l :End of /STATS report.", source);
+ }
+}
+
+/* 401 */
+void viagra_cmd_401(char *source, char *who)
+{
+ if (!source || !who) {
+ return;
+ }
+ send_cmd(ServerName, "401 %s %s :No such service.", source, who);
+}
+
+/* 318 */
+void viagra_cmd_318(char *source, char *who)
+{
+ if (!source || !who) {
+ return;
+ }
+
+ send_cmd(ServerName, "318 %s %s :End of /WHOIS list.", source, who);
+}
+
+/* 242 */
+void viagra_cmd_242(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "242 %s", buf);
+}
+
+/* 243 */
+void viagra_cmd_243(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "243 %s", buf);
+}
+
+/* 211 */
+void viagra_cmd_211(char *buf)
+{
+ if (!buf) {
+ return;
+ }
+
+ send_cmd(NULL, "211 %s", buf);
+}
+
+void viagra_cmd_351(char *source)
+{
+ send_cmd(ServerName, "351 %s Anope-%s %s :%s - %s (%s) -- %s",
+ source, version_number, ServerName, ircd->name, version_flags,
+ EncModule, version_build);
+}
+
+void viagra_cmd_bot_nick(char *nick, char *user, char *host, char *real,
+ char *modes)
+{
+ EnforceQlinedNick(nick, s_BotServ);
+ send_cmd(NULL, "NICK %s 1 %ld %s %s %s %s 0 0 :%s", nick,
+ (long int) time(NULL), modes, user, host, ServerName, real);
+ viagra_cmd_sqline(nick, "Reserved for services");
+}
+
+void viagra_cmd_kick(char *source, char *chan, char *user, char *buf)
+{
+ if (buf) {
+ send_cmd(source, "KICK %s %s :%s", chan, user, buf);
+ } else {
+ send_cmd(source, "KICK %s %s", chan, user);
+ }
+}
+
+void viagra_cmd_nick(char *nick, char *name, char *modes)
+{
+ EnforceQlinedNick(nick, NULL);
+ send_cmd(NULL, "NICK %s 1 %ld %s %s %s %s 0 0 :%s", nick,
+ (long int) time(NULL), modes, ServiceUser, ServiceHost,
+ ServerName, name);
+ viagra_cmd_sqline(nick, "Reserved for services");
+}
+
+void viagra_cmd_372(char *source, char *msg)
+{
+ send_cmd(ServerName, "372 %s :- %s", source, msg);
+}
+
+void viagra_cmd_372_error(char *source)
+{
+ send_cmd(ServerName, "422 %s :- MOTD file not found! Please "
+ "contact your IRC administrator.", source);
+}
+
+void viagra_cmd_375(char *source)
+{
+ send_cmd(ServerName, "375 %s :- %s Message of the Day",
+ source, ServerName);
+}
+
+void viagra_cmd_376(char *source)
+{
+ send_cmd(ServerName, "376 %s :End of /MOTD command.", source);
+}
+
+/* INVITE */
+void viagra_cmd_invite(char *source, char *chan, char *nick)
+{
+ if (!source || !chan || !nick) {
+ return;
+ }
+
+ send_cmd(source, "INVITE %s %s", nick, chan);
+}
+
+void viagra_cmd_bot_chan_mode(char *nick, char *chan)
+{
+ anope_cmd_mode(nick, chan, "%s %s", ircd->botchanumode, nick);
+}
+
+int anope_event_capab(char *source, int ac, char **av)
+{
+ capab_parse(ac, av);
+ return MOD_CONT;
+}
+
+/* SVSHOLD - set */
+void viagra_cmd_svshold(char *nick)
+{
+ /* Not supported by this IRCD */
+}
+
+/* SVSHOLD - release */
+void viagra_cmd_release_svshold(char *nick)
+{
+ /* Not Supported by this IRCD */
+}
+
+/* SVSNICK */
+void viagra_cmd_svsnick(char *source, char *guest, time_t when)
+{
+ if (!source || !guest) {
+ return;
+ }
+ send_cmd(NULL, "SVSNICK %s %s :%ld", source, guest, (long int) when);
+}
+
+void viagra_cmd_guest_nick(char *nick, char *user, char *host, char *real,
+ char *modes)
+{
+ send_cmd(NULL, "NICK %s 1 %ld %s %s %s %s 0 0 :%s", nick,
+ (long int) time(NULL), modes, user, host, ServerName, real);
+}
+
+void viagra_cmd_svso(char *source, char *nick, char *flag)
+{
+ /* Not Supported by this IRCD */
+}
+
+
+/* SVSMODE -b */
+void viagra_cmd_unban(char *name, char *nick)
+{
+ viagra_cmd_svsmode_chan(name, "-b", nick);
+}
+
+/* SVSMODE channel modes */
+
+void viagra_cmd_svsmode_chan(char *name, char *mode, char *nick)
+{
+ if (nick) {
+ send_cmd(ServerName, "SVSMODE %s %s %s", name, mode, nick);
+ } else {
+ send_cmd(ServerName, "SVSMODE %s %s", name, mode);
+ }
+}
+
+/* SVSMODE +d */
+/* sent if svid is something weird */
+void viagra_cmd_svid_umode(char *nick, time_t ts)
+{
+ send_cmd(ServerName, "SVSMODE %s %lu +d 1", nick,
+ (unsigned long int) ts);
+}
+
+/* SVSMODE +d */
+/* nc_change was = 1, and there is no na->status */
+void viagra_cmd_nc_change(User * u)
+{
+ common_svsmode(u, "+d", "1");
+}
+
+/* SVSMODE +d */
+void viagra_cmd_svid_umode2(User * u, char *ts)
+{
+ /* not used by bahamut ircds */
+}
+
+void viagra_cmd_svid_umode3(User * u, char *ts)
+{
+ if (u->svid != u->timestamp) {
+ common_svsmode(u, "+rd", ts);
+ } else {
+ common_svsmode(u, "+r", NULL);
+ }
+}
+
+/* NICK <newnick> */
+void viagra_cmd_chg_nick(char *oldnick, char *newnick)
+{
+ if (!oldnick || !newnick) {
+ return;
+ }
+
+ send_cmd(oldnick, "NICK %s", newnick);
+}
+
+/*
+ * svsjoin
+ * parv[0] = sender
+ * parv[1] = nick to make join
+ * parv[2] = channel(s) to join
+ */
+void viagra_cmd_svsjoin(char *source, char *nick, char *chan, char *param)
+{
+ send_cmd(source, "SVSJOIN %s :%s", nick, chan);
+}
+
+/*
+ * svspart
+ * parv[0] = sender
+ * parv[1] = nick to make part
+ * parv[2] = channel(s) to part
+ */
+void viagra_cmd_svspart(char *source, char *nick, char *chan)
+{
+ send_cmd(source, "SVSPART %s :%s", nick, chan);
+}
+
+void viagra_cmd_swhois(char *source, char *who, char *mask)
+{
+ /* not supported */
+}
+
+int viagra_flood_mode_check(char *value)
+{
+ return 0;
+}
+
+int anope_event_rehash(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_admin(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_snotice(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+int anope_event_invite(char *source, int ac, char **av)
+{
+ return MOD_CONT;
+}
+
+void viagra_cmd_eob()
+{
+ send_cmd(NULL, "BURST 0");
+}
+
+void viagra_cmd_jupe(char *jserver, char *who, char *reason)
+{
+ char rbuf[256];
+
+ snprintf(rbuf, sizeof(rbuf), "Juped by %s%s%s", who,
+ reason ? ": " : "", reason ? reason : "");
+
+ if (findserver(servlist, jserver))
+ viagra_cmd_squit(jserver, rbuf);
+ viagra_cmd_server(jserver, 2, rbuf);
+ new_server(me_server, jserver, rbuf, SERVER_JUPED, NULL);
+}
+
+/* GLOBOPS - to handle old WALLOPS */
+void viagra_cmd_global_legacy(char *source, char *fmt)
+{
+ send_cmd(source ? source : ServerName, "GLOBOPS :%s", fmt);
+}
+
+/*
+ 1 = valid nick
+ 0 = nick is in valid
+*/
+int viagra_valid_nick(char *nick)
+{
+ /* no hard coded invalid nicks */
+ return 1;
+}
+
+/*
+ 1 = valid chan
+ 0 = chan is in valid
+*/
+int viagra_valid_chan(char *chan)
+{
+ /* no hard coded invalid chans */
+ return 1;
+}
+
+
+void viagra_cmd_ctcp(char *source, char *dest, char *buf)
+{
+ char *s;
+
+ if (!buf) {
+ return;
+ } else {
+ s = normalizeBuffer(buf);
+ }
+
+ send_cmd(source, "NOTICE %s :\1%s \1", dest, s);
+ free(s);
+}
+
+
+/**
+ * Tell anope which function we want to perform each task inside of anope.
+ * These prototypes must match what anope expects.
+ **/
+void moduleAddAnopeCmds()
+{
+ pmodule_cmd_svsnoop(viagra_cmd_svsnoop);
+ pmodule_cmd_remove_akill(viagra_cmd_remove_akill);
+ pmodule_cmd_topic(viagra_cmd_topic);
+ pmodule_cmd_vhost_off(viagra_cmd_vhost_off);
+ pmodule_cmd_akill(viagra_cmd_akill);
+ pmodule_cmd_svskill(viagra_cmd_svskill);
+ pmodule_cmd_svsmode(viagra_cmd_svsmode);
+ pmodule_cmd_372(viagra_cmd_372);
+ pmodule_cmd_372_error(viagra_cmd_372_error);
+ pmodule_cmd_375(viagra_cmd_375);
+ pmodule_cmd_376(viagra_cmd_376);
+ pmodule_cmd_nick(viagra_cmd_nick);
+ pmodule_cmd_guest_nick(viagra_cmd_guest_nick);
+ pmodule_cmd_mode(viagra_cmd_mode);
+ pmodule_cmd_bot_nick(viagra_cmd_bot_nick);
+ pmodule_cmd_kick(viagra_cmd_kick);
+ pmodule_cmd_notice_ops(viagra_cmd_notice_ops);
+ pmodule_cmd_notice(viagra_cmd_notice);
+ pmodule_cmd_notice2(viagra_cmd_notice2);
+ pmodule_cmd_privmsg(viagra_cmd_privmsg);
+ pmodule_cmd_privmsg2(viagra_cmd_privmsg2);
+ pmodule_cmd_serv_notice(viagra_cmd_serv_notice);
+ pmodule_cmd_serv_privmsg(viagra_cmd_serv_privmsg);
+ pmodule_cmd_bot_chan_mode(viagra_cmd_bot_chan_mode);
+ pmodule_cmd_351(viagra_cmd_351);
+ pmodule_cmd_quit(viagra_cmd_quit);
+ pmodule_cmd_pong(viagra_cmd_pong);
+ pmodule_cmd_join(viagra_cmd_join);
+ pmodule_cmd_unsqline(viagra_cmd_unsqline);
+ pmodule_cmd_invite(viagra_cmd_invite);
+ pmodule_cmd_part(viagra_cmd_part);
+ pmodule_cmd_391(viagra_cmd_391);
+ pmodule_cmd_250(viagra_cmd_250);
+ pmodule_cmd_307(viagra_cmd_307);
+ pmodule_cmd_311(viagra_cmd_311);
+ pmodule_cmd_312(viagra_cmd_312);
+ pmodule_cmd_317(viagra_cmd_317);
+ pmodule_cmd_219(viagra_cmd_219);
+ pmodule_cmd_401(viagra_cmd_401);
+ pmodule_cmd_318(viagra_cmd_318);
+ pmodule_cmd_242(viagra_cmd_242);
+ pmodule_cmd_243(viagra_cmd_243);
+ pmodule_cmd_211(viagra_cmd_211);
+ pmodule_cmd_global(viagra_cmd_global);
+ pmodule_cmd_global_legacy(viagra_cmd_global_legacy);
+ pmodule_cmd_sqline(viagra_cmd_sqline);
+ pmodule_cmd_squit(viagra_cmd_squit);
+ pmodule_cmd_svso(viagra_cmd_svso);
+ pmodule_cmd_chg_nick(viagra_cmd_chg_nick);
+ pmodule_cmd_svsnick(viagra_cmd_svsnick);
+ pmodule_cmd_vhost_on(viagra_cmd_vhost_on);
+ pmodule_cmd_connect(viagra_cmd_connect);
+ pmodule_cmd_svshold(viagra_cmd_svshold);
+ pmodule_cmd_release_svshold(viagra_cmd_release_svshold);
+ pmodule_cmd_unsgline(viagra_cmd_unsgline);
+ pmodule_cmd_unszline(viagra_cmd_unszline);
+ pmodule_cmd_szline(viagra_cmd_szline);
+ pmodule_cmd_sgline(viagra_cmd_sgline);
+ pmodule_cmd_unban(viagra_cmd_unban);
+ pmodule_cmd_svsmode_chan(viagra_cmd_svsmode_chan);
+ pmodule_cmd_svid_umode(viagra_cmd_svid_umode);
+ pmodule_cmd_nc_change(viagra_cmd_nc_change);
+ pmodule_cmd_svid_umode2(viagra_cmd_svid_umode2);
+ pmodule_cmd_svid_umode3(viagra_cmd_svid_umode3);
+ pmodule_cmd_svsjoin(viagra_cmd_svsjoin);
+ pmodule_cmd_svspart(viagra_cmd_svspart);
+ pmodule_cmd_swhois(viagra_cmd_swhois);
+ pmodule_cmd_eob(viagra_cmd_eob);
+ pmodule_flood_mode_check(viagra_flood_mode_check);
+ pmodule_cmd_jupe(viagra_cmd_jupe);
+ pmodule_valid_nick(viagra_valid_nick);
+ pmodule_valid_chan(viagra_valid_chan);
+ pmodule_cmd_ctcp(viagra_cmd_ctcp);
+ pmodule_set_umode(viagra_set_umode);
+}
+
+/**
+ * Now tell anope how to use us.
+ **/
+int AnopeInit(int argc, char **argv)
+{
+
+ moduleAddAuthor("Anope");
+ moduleAddVersion("$Id$");
+ moduleSetType(PROTOCOL);
+
+ pmodule_ircd_version("ViagraIRCd 1.3.x");
+ pmodule_ircd_cap(myIrcdcap);
+ pmodule_ircd_var(myIrcd);
+ pmodule_ircd_cbmodeinfos(myCbmodeinfos);
+ pmodule_ircd_cumodes(myCumodes);
+ pmodule_ircd_flood_mode_char_set("");
+ pmodule_ircd_flood_mode_char_remove("");
+ pmodule_ircd_cbmodes(myCbmodes);
+ pmodule_ircd_cmmodes(myCmmodes);
+ pmodule_ircd_csmodes(myCsmodes);
+ pmodule_ircd_useTSMode(0);
+
+ /** Deal with modes anope _needs_ to know **/
+ pmodule_invis_umode(UMODE_i);
+ pmodule_oper_umode(UMODE_o);
+ pmodule_invite_cmode(CMODE_i);
+ pmodule_secret_cmode(CMODE_s);
+ pmodule_private_cmode(CMODE_p);
+ pmodule_key_mode(CMODE_k);
+ pmodule_limit_mode(CMODE_l);
+
+ moduleAddAnopeCmds();
+ moduleAddIRCDMsgs();
+
+ return MOD_CONT;
+}
diff --git a/src/protocol/viagra.h b/src/protocol/viagra.h
new file mode 100644
index 000000000..1aa687eca
--- /dev/null
+++ b/src/protocol/viagra.h
@@ -0,0 +1,132 @@
+/* Viagra IRCD functions
+ *
+ * (C) 2003-2008 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.
+ *
+ *
+ */
+
+/* User Modes */
+#define UMODE_A 0x00000040 /* Is a Server Administrator. */
+#define UMODE_C 0x00002000 /* Is a Server Co Administrator. */
+#define UMODE_I 0x00008000 /* Stealth mode, makes you beeing hidden at channel. invisible joins/parts. */
+#define UMODE_N 0x00000400 /* Is a Network Administrator. */
+#define UMODE_O 0x00004000 /* Local IRC Operator. */
+#define UMODE_Q 0x00001000 /* Is an Abuse Administrator. */
+#define UMODE_R 0x08000000 /* Cant receive messages from non registered user. */
+#define UMODE_S 0x00000080 /* Is a Network Service. For Services only. */
+#define UMODE_T 0x00000800 /* Is a Technical Administrator. */
+#define UMODE_a 0x00000001 /* Is a Services Administrator. */
+#define UMODE_b 0x00040000 /* Can listen to generic bot warnings. */
+#define UMODE_c 0x00010000 /* See's all connects/disconnects on local server. */
+#define UMODE_d 0x00000100 /* Can listen to debug and channel cration notices. */
+#define UMODE_e 0x00080000 /* Can see client connections/exits on remote servers. */
+#define UMODE_f 0x00100000 /* Listen to flood/spam alerts from server. */
+#define UMODE_g 0x00000200 /* Can read & send to globops, and locops. */
+#define UMODE_h 0x00000002 /* Is a Help Operator. */
+#define UMODE_i 0x00000004 /* Invisible (Not shown in /who and /names searches). */
+#define UMODE_n 0x00020000 /* Can see client nick change notices. */
+#define UMODE_o 0x00000008 /* Global IRC Operator. */
+#define UMODE_r 0x00000010 /* Identifies the nick as being registered. */
+#define UMODE_s 0x00200000 /* Can listen to generic server messages. */
+#define UMODE_w 0x00000020 /* Can listen to wallop messages. */
+#define UMODE_x 0x40000000 /* Gives the user hidden hostname. */
+
+
+/* Channel Modes */
+#define CMODE_i 0x00000001 /* Invite-only allowed. */
+#define CMODE_m 0x00000002 /* Moderated channel, noone can speak and changing nick except users with mode +vho */
+#define CMODE_n 0x00000004 /* No messages from outside channel */
+#define CMODE_p 0x00000008 /* Private channel. */
+#define CMODE_s 0x00000010 /* Secret channel. */
+#define CMODE_t 0x00000020 /* Only channel operators may set the topic */
+#define CMODE_k 0x00000040 /* Needs the channel key to join the channel */
+#define CMODE_l 0x00000080 /* Channel may hold at most <number> of users */
+#define CMODE_R 0x00000100 /* Requires a registered nickname to join the channel. */
+#define CMODE_r 0x00000200 /* Channel is registered. */
+#define CMODE_c 0x00000400 /* No ANSI color can be sent to the channel */
+#define CMODE_M 0x00000800 /* Requires a registered nickname to speak at the channel. */
+#define CMODE_H 0x00001000 /* HelpOps only channel. */
+#define CMODE_O 0x00008000 /* IRCOps only channel. */
+#define CMODE_S 0x00020000 /* Strips all mesages out of colors. */
+#define CMODE_N 0x01000000 /* No nickchanges allowed. */
+#define CMODE_P 0x02000000 /* "Peace mode" No kicks allowed unless by u:lines */
+#define CMODE_x 0x04000000 /* No bold/underlined or reversed text can be sent to the channel */
+
+#define DEFAULT_MLOCK CMODE_n | CMODE_t | CMODE_r
+
+void viagra_set_umode(User * user, int ac, char **av);
+void viagra_cmd_svsnoop(char *server, int set);
+void viagra_cmd_remove_akill(char *user, char *host);
+void viagra_cmd_topic(char *whosets, char *chan, char *whosetit, char *topic, time_t when);
+void viagra_cmd_vhost_off(User * u);
+void viagra_cmd_akill(char *user, char *host, char *who, time_t when,time_t expires, char *reason);
+void viagra_cmd_svskill(char *source, char *user, char *buf);
+void viagra_cmd_svsmode(User * u, int ac, char **av);
+void viagra_cmd_372(char *source, char *msg);
+void viagra_cmd_372_error(char *source);
+void viagra_cmd_375(char *source);
+void viagra_cmd_376(char *source);
+void viagra_cmd_nick(char *nick, char *name, char *modes);
+void viagra_cmd_guest_nick(char *nick, char *user, char *host, char *real, char *modes);
+void viagra_cmd_mode(char *source, char *dest, char *buf);
+void viagra_cmd_bot_nick(char *nick, char *user, char *host, char *real, char *modes);
+void viagra_cmd_kick(char *source, char *chan, char *user, char *buf);
+void viagra_cmd_notice_ops(char *source, char *dest, char *buf);
+void viagra_cmd_notice(char *source, char *dest, char *buf);
+void viagra_cmd_notice2(char *source, char *dest, char *msg);
+void viagra_cmd_privmsg(char *source, char *dest, char *buf);
+void viagra_cmd_privmsg2(char *source, char *dest, char *msg);
+void viagra_cmd_serv_notice(char *source, char *dest, char *msg);
+void viagra_cmd_serv_privmsg(char *source, char *dest, char *msg);
+void viagra_cmd_bot_chan_mode(char *nick, char *chan);
+void viagra_cmd_351(char *source);
+void viagra_cmd_quit(char *source, char *buf);
+void viagra_cmd_pong(char *servname, char *who);
+void viagra_cmd_join(char *user, char *channel, time_t chantime);
+void viagra_cmd_unsqline(char *user);
+void viagra_cmd_invite(char *source, char *chan, char *nick);
+void viagra_cmd_part(char *nick, char *chan, char *buf);
+void viagra_cmd_391(char *source, char *timestr);
+void viagra_cmd_250(char *buf);
+void viagra_cmd_307(char *buf);
+void viagra_cmd_311(char *buf);
+void viagra_cmd_312(char *buf);
+void viagra_cmd_317(char *buf);
+void viagra_cmd_219(char *source, char *letter);
+void viagra_cmd_401(char *source, char *who);
+void viagra_cmd_318(char *source, char *who);
+void viagra_cmd_242(char *buf);
+void viagra_cmd_243(char *buf);
+void viagra_cmd_211(char *buf);
+void viagra_cmd_global(char *source, char *buf);
+void viagra_cmd_global_legacy(char *source, char *fmt);
+void viagra_cmd_sqline(char *mask, char *reason);
+void viagra_cmd_squit(char *servname, char *message);
+void viagra_cmd_svso(char *source, char *nick, char *flag);
+void viagra_cmd_chg_nick(char *oldnick, char *newnick);
+void viagra_cmd_svsnick(char *source, char *guest, time_t when);
+void viagra_cmd_vhost_on(char *nick, char *vIdent, char *vhost);
+void viagra_cmd_connect(int servernum);
+void viagra_cmd_svshold(char *nick);
+void viagra_cmd_release_svshold(char *nick);
+void viagra_cmd_unsgline(char *mask);
+void viagra_cmd_unszline(char *mask);
+void viagra_cmd_szline(char *mask, char *reason, char *whom);
+void viagra_cmd_sgline(char *mask, char *reason);
+void viagra_cmd_unban(char *name, char *nick);
+void viagra_cmd_svsmode_chan(char *name, char *mode, char *nick);
+void viagra_cmd_svid_umode(char *nick, time_t ts);
+void viagra_cmd_nc_change(User * u);
+void viagra_cmd_svid_umode2(User * u, char *ts);
+void viagra_cmd_svid_umode3(User * u, char *ts);
+void viagra_cmd_eob();
+int viagra_flood_mode_check(char *value);
+void viagra_cmd_jupe(char *jserver, char *who, char *reason);
+int viagra_valid_nick(char *nick);
+void viagra_cmd_ctcp(char *source, char *dest, char *buf);
diff --git a/src/rdb.c b/src/rdb.c
new file mode 100644
index 000000000..91e4e8480
--- /dev/null
+++ b/src/rdb.c
@@ -0,0 +1,499 @@
+/* RDB functions.
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+#include "services.h"
+
+/*************************************************************************/
+
+/* Initialize the current RDB database engine */
+int rdb_init()
+{
+
+#ifdef USE_MYSQL
+ return db_mysql_init();
+#endif
+
+ return 0;
+}
+
+/*************************************************************************/
+
+/* Check if RDB can be used to load/save data */
+int rdb_open()
+{
+
+#ifdef USE_MYSQL
+ return db_mysql_open(); /* db_mysql_open(); */
+#endif
+
+ return 0;
+}
+
+/*************************************************************************/
+
+/* Strictly spoken this should close the database. However, it's not too
+ * efficient to close it every time after a write or so, so we just
+ * pretend we closed it while in reality it's still open.
+ */
+int rdb_close()
+{
+
+#ifdef USE_MYSQL
+ return 1; /* db_mysql_close(); */
+#endif
+
+ return 1;
+}
+
+/*************************************************************************/
+
+/* Quote the string to be used in inclused for the current RDB database */
+char *rdb_quote(char *str)
+{
+#ifdef USE_MYSQL
+ return db_mysql_quote(str);
+#endif
+
+ return sstrdup(str);
+}
+
+/*************************************************************************/
+
+/* Tag a table by setting the 'active' field to 0 for all rows. After an
+ * update, all rows with active still 0 will be deleted; this is done to
+ * easily delete old entries from the database.
+ */
+int rdb_tag_table(char *table)
+{
+#ifdef USE_MYSQL
+ return db_mysql_try("UPDATE %s SET active = 0", table);
+#endif
+
+ return 0;
+
+}
+
+/* Be sure to quote all user input in the clause! */
+int rdb_tag_table_where(char *table, char *clause)
+{
+#ifdef USE_MYSQL
+ return db_mysql_try("UPDATE %s SET active = 0 WHERE %s", table,
+ clause);
+#endif
+
+ return 0;
+
+}
+
+/*************************************************************************/
+
+/* Empty an entire database table */
+int rdb_empty_table(char *table)
+{
+#ifdef USE_MYSQL
+ return db_mysql_try("TRUNCATE TABLE %s", table);
+#endif
+
+ return 0;
+
+}
+
+/*************************************************************************/
+
+/* Clean up a table with 'dirty' records (active = 0) */
+int rdb_clean_table(char *table)
+{
+#ifdef USE_MYSQL
+ return db_mysql_try("DELETE FROM %s WHERE active = 0", table);
+#endif
+
+ return 0;
+}
+
+/* Be sure to quote user input in the clause! */
+int rdb_clean_table_where(char *table, char *clause)
+{
+#ifdef USE_MYSQL
+ return db_mysql_try("DELETE FROM %s WHERE active = 0 AND (%s)", table,
+ clause);
+#endif
+
+ return 0;
+}
+
+/*************************************************************************/
+
+/* Delete specific records from a table. The clause is MySQL syntax, and
+ * should be all quoted up nicely in the calling code.
+ */
+int rdb_scrub_table(char *table, char *clause)
+{
+#ifdef USE_MYSQL
+ return db_mysql_try("DELETE FROM %s WHERE %s", table, clause);
+#endif
+
+ return 0;
+
+}
+
+/*************************************************************************/
+
+/* Execute a direct MySQL query. Do NOT forget to quote all user input!
+ * NOTE: this ideally shouldn't be used, but that's probably a phase3 utopia
+ */
+int rdb_direct_query(char *query)
+{
+
+#ifdef USE_MYSQL
+ alog("Direct Query: %s", query);
+ return db_mysql_query(query);
+#endif
+
+ return 0;
+
+}
+
+/*************************************************************************/
+
+/* Update the needed tables when someone changes their display.
+ * The original author didn't even like this (claimed it should be in
+ * mysql.c), and i do agree muchly.
+ */
+int rdb_ns_set_display(char *newnick, char *oldnick)
+{
+ int ret = 0;
+ char *q_newnick;
+ char *q_oldnick;
+
+ q_newnick = rdb_quote(newnick);
+ q_oldnick = rdb_quote(oldnick);
+
+#ifdef USE_MYSQL
+ /* Change the display on NS_CORE */
+ ret =
+ db_mysql_try
+ ("UPDATE anope_ns_core SET display = '%s' WHERE display = '%s'",
+ q_newnick, q_oldnick);
+
+ /* Change the display on NS_ALIAS for all grouped nicks */
+ if (ret)
+ ret =
+ db_mysql_try
+ ("UPDATE anope_ns_alias SET display='%s' WHERE display='%s'",
+ q_newnick, q_oldnick);
+
+ /* Change the display on ChanServ ACCESS list */
+ if (ret)
+ ret =
+ db_mysql_try
+ ("UPDATE anope_cs_access SET display='%s' WHERE display='%s'",
+ q_newnick, q_oldnick);
+
+ /* Change the display on ChanServ AKICK list */
+ if (ret)
+ ret =
+ db_mysql_try
+ ("UPDATE anope_cs_akicks SET creator='%s' WHERE creator='%s'",
+ q_newnick, q_oldnick);
+
+ /* Change the display on MemoServ sent memos -- is it required? */
+ if (ret)
+ ret =
+ db_mysql_try
+ ("UPDATE anope_ms_info SET sender='%s' WHERE sender='%s'",
+ q_newnick, q_oldnick);
+
+ /* Change the display on MemoServ received memos -- is it required? */
+ if (ret)
+ ret =
+ db_mysql_try
+ ("UPDATE anope_ms_info SET receiver='%s' WHERE receiver='%s'",
+ q_newnick, q_oldnick);
+
+ /* Change the akills set on the person's nick */
+ if (ret)
+ ret =
+ db_mysql_try
+ ("UPDATE anope_cs_akicks SET dmask='%s' WHERE dmask='%s' AND flags & %d",
+ q_newnick, q_oldnick, AK_ISNICK);
+
+ /* Change the display on NickServ ACCESS list */
+ if (ret)
+ ret =
+ db_mysql_try
+ ("UPDATE anope_ns_access SET display='%s' WHERE display='%s'",
+ q_newnick, q_oldnick);
+
+ /* No need to update anope_cs_info here as it is updated when we
+ * save the database.
+ *
+ * anope_hs_core is per nick, not per display; a changed display
+ * won't change anything there
+ */
+
+#endif
+
+ free(q_newnick);
+ free(q_oldnick);
+
+ return ret;
+}
+
+/*************************************************************************/
+
+int rdb_save_ns_core(NickCore * nc)
+{
+
+#ifdef USE_MYSQL
+ return db_mysql_save_ns_core(nc);
+#endif
+
+ return 0;
+}
+
+/*************************************************************************/
+
+int rdb_save_ns_alias(NickAlias * na)
+{
+
+#ifdef USE_MYSQL
+ return db_mysql_save_ns_alias(na);
+#endif
+
+ return 0;
+}
+
+/*************************************************************************/
+
+int rdb_save_ns_req(NickRequest * nr)
+{
+
+#ifdef USE_MYSQL
+ return db_mysql_save_ns_req(nr);
+#endif
+
+ return 0;
+}
+
+/*************************************************************************/
+
+int rdb_save_cs_info(ChannelInfo * ci)
+{
+
+#ifdef USE_MYSQL
+ return db_mysql_save_cs_info(ci);
+#endif
+
+ return 0;
+}
+
+/*************************************************************************/
+
+int rdb_save_bs_core(BotInfo * bi)
+{
+
+#ifdef USE_MYSQL
+ return db_mysql_save_bs_core(bi);
+#endif
+
+ return 0;
+}
+
+/*************************************************************************/
+
+int rdb_save_hs_core(HostCore * hc)
+{
+
+#ifdef USE_MYSQL
+ return db_mysql_save_hs_core(hc);
+#endif
+
+ return 0;
+}
+
+/*************************************************************************/
+
+int rdb_save_os_db(unsigned int maxucnt, unsigned int maxutime,
+ SList * ak, SList * sgl, SList * sql, SList * szl)
+{
+
+#ifdef USE_MYSQL
+ return db_mysql_save_os_db(maxusercnt, maxusertime, ak, sgl, sql, szl);
+#endif
+
+ return 0;
+}
+
+/*************************************************************************/
+
+int rdb_save_news(NewsItem * ni)
+{
+
+#ifdef USE_MYSQL
+ return db_mysql_save_news(ni);
+#endif
+
+ return 0;
+}
+
+/*************************************************************************/
+
+int rdb_load_bs_dbase(void)
+{
+
+#ifdef USE_MYSQL
+ return db_mysql_load_bs_dbase();
+#endif
+
+ return 0;
+}
+
+/*************************************************************************/
+
+int rdb_load_hs_dbase(void)
+{
+
+#ifdef USE_MYSQL
+ return db_mysql_load_hs_dbase();
+#endif
+
+ return 0;
+}
+
+/*************************************************************************/
+
+int rdb_load_ns_dbase(void)
+{
+
+#ifdef USE_MYSQL
+ return db_mysql_load_ns_dbase();
+#endif
+
+ return 0;
+}
+
+/*************************************************************************/
+
+int rdb_load_news(void)
+{
+
+#ifdef USE_MYSQL
+ return db_mysql_load_news();
+#endif
+
+ return 0;
+}
+
+/*************************************************************************/
+
+int rdb_load_exceptions(void)
+{
+
+#ifdef USE_MYSQL
+ return db_mysql_load_exceptions();
+#endif
+
+ return 0;
+}
+
+/*************************************************************************/
+
+int rdb_load_cs_dbase(void)
+{
+
+#ifdef USE_MYSQL
+ return db_mysql_load_cs_dbase();
+#endif
+
+ return 0;
+}
+
+/*************************************************************************/
+
+int rdb_load_os_dbase(void)
+{
+
+#ifdef USE_MYSQL
+ return db_mysql_load_os_dbase();
+#endif
+
+ return 0;
+}
+
+/*************************************************************************/
+
+int rdb_load_ns_req_dbase(void)
+{
+
+#ifdef USE_MYSQL
+ return db_mysql_load_ns_req_dbase();
+#endif
+
+ return 0;
+}
+
+/*************************************************************************/
+
+#define LOAD_DBASE(num, name, func) {\
+ if (!func) {\
+ alog("RDB unable to load %s database (%d/8) !!!", name, num);\
+ return 0;\
+ }\
+ if (debug)\
+ alog("debug: RDB Loaded %s DataBase (%d/8)", name, num);\
+}
+
+int rdb_load_dbases(void)
+{
+ if (!skeleton) {
+ LOAD_DBASE(1, "NickServ", rdb_load_ns_dbase());
+
+ if (s_HostServ) {
+ LOAD_DBASE(2, "HostServ", rdb_load_hs_dbase());
+ }
+
+ if (s_BotServ) {
+ LOAD_DBASE(3, "BotServ", rdb_load_bs_dbase());
+ }
+
+ LOAD_DBASE(4, "ChanServ", rdb_load_cs_dbase());
+ }
+
+ LOAD_DBASE(5, "OperServ", rdb_load_os_dbase());
+ LOAD_DBASE(6, "News", rdb_load_news());
+ LOAD_DBASE(7, "Exception", rdb_load_exceptions());
+
+ if (PreNickDBName) {
+ LOAD_DBASE(8, "PreNick", rdb_load_ns_req_dbase());
+ } else if (debug) {
+ alog("debug: RDB No need to load PreNickDB (8/8)");
+ }
+
+ alog("RDB: All DataBases loaded.");
+
+ return 0;
+}
+
+/*************************************************************************/
+
+int rdb_save_exceptions(Exception * e)
+{
+
+#ifdef USE_MYSQL
+ return db_mysql_save_exceptions(e);
+#endif
+
+ return 0;
+}
+
+/* EOF */
diff --git a/src/send.c b/src/send.c
new file mode 100644
index 000000000..6d57a9823
--- /dev/null
+++ b/src/send.c
@@ -0,0 +1,341 @@
+/* Routines for sending stuff to the network.
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+
+#include "services.h"
+
+/*************************************************************************/
+
+/**
+ * Send a command to the server. The two forms here are like
+ * printf()/vprintf() and friends.
+ * @param source Orgin of the Message (some times NULL)
+ * @param fmt Format of the Message
+ * @param ... any number of parameters
+ * @return void
+ */
+void send_cmd(const char *source, const char *fmt, ...)
+{
+ va_list args;
+
+ if (fmt) {
+ va_start(args, fmt);
+ vsend_cmd(source, fmt, args);
+ va_end(args);
+ }
+}
+
+/*************************************************************************/
+
+/**
+ * actually Send a command to the server.
+ * @param source Orgin of the Message (some times NULL)
+ * @param fmt Format of the Message
+ * @param args List of the arguments
+ * @return void
+ */
+void vsend_cmd(const char *source, const char *fmt, va_list args)
+{
+ char buf[BUFSIZE];
+ *buf = '\0';
+
+ if (fmt) {
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+
+ if (source) {
+ sockprintf(servsock, ":%s %s\r\n", source, buf);
+ eventprintf(":%s %s", source, buf);
+ if (debug) {
+ alog("debug: Sent: :%s %s", source, buf);
+ }
+ } else {
+ sockprintf(servsock, "%s\r\n", buf);
+ eventprintf("%s", buf);
+ if (debug) {
+ alog("debug: Sent: %s", buf);
+ }
+ }
+ }
+}
+
+/*************************************************************************/
+
+/**
+ * Send a server notice
+ * @param source Orgin of the Message
+ * @param s Server Struct
+ * @param fmt Format of the Message
+ * @param ... any number of parameters
+ * @return void
+ */
+void notice_server(char *source, Server * s, char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ *buf = '\0';
+
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+
+ if (NSDefFlags & NI_MSG) {
+ anope_cmd_serv_privmsg(source, s->name, buf);
+ } else {
+ anope_cmd_serv_notice(source, s->name, buf);
+ }
+ va_end(args);
+ }
+}
+
+/*************************************************************************/
+
+/**
+ * Send a notice to a user
+ * @param source Orgin of the Message
+ * @param u User Struct
+ * @param fmt Format of the Message
+ * @param ... any number of parameters
+ * @return void
+ */
+void notice_user(char *source, User * u, const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ *buf = '\0';
+
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+
+ /* Send privmsg instead of notice if:
+ * - UsePrivmsg is enabled
+ * - The user is not registered and NSDefMsg is enabled
+ * - The user is registered and has set /ns set msg on
+ */
+ if (UsePrivmsg && ((!u->na && (NSDefFlags & NI_MSG))
+ || (u->na && (u->na->nc->flags & NI_MSG)))) {
+ anope_cmd_privmsg2(source, u->nick, buf);
+ } else {
+ anope_cmd_notice2(source, u->nick, buf);
+ }
+ va_end(args);
+ }
+}
+
+/*************************************************************************/
+
+/**
+ * Send a NULL-terminated array of text as NOTICEs.
+ * @param source Orgin of the Message
+ * @param dest Destination of the Notice
+ * @param text Array of text to send
+ * @return void
+ */
+void notice_list(char *source, char *dest, 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) {
+ anope_cmd_notice2(source, dest, *text);
+ } else {
+ anope_cmd_notice2(source, dest, " ");
+ }
+ text++;
+ }
+}
+
+/*************************************************************************/
+
+/**
+ * Send a message in the user's selected language to the user using NOTICE.
+ * @param source Orgin of the Message
+ * @param u User Struct
+ * @param int Index of the Message
+ * @param ... any number of parameters
+ * @return void
+ */
+void notice_lang(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 || !message) {
+ 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 privmsg instead of notice if:
+ * - UsePrivmsg is enabled
+ * - The user is not registered and NSDefMsg is enabled
+ * - The user is registered and has set /ns set msg on
+ */
+ if (UsePrivmsg && ((!dest->na && (NSDefFlags & NI_MSG))
+ || (dest->na
+ && (dest->na->nc->flags & NI_MSG)))) {
+ anope_cmd_privmsg2(source, dest->nick, *t ? t : " ");
+ } else {
+ anope_cmd_notice2(source, dest->nick, *t ? t : " ");
+ }
+ }
+ va_end(args);
+}
+
+/*************************************************************************/
+
+/**
+ * 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.
+ * @param source Orgin of the Message
+ * @param u User Struct
+ * @param int Index of the Message
+ * @param ... any number of parameters
+ * @return void
+ */
+void notice_help(char *source, User * dest, int message, ...)
+{
+ va_list args;
+ char buf[4096], buf2[4096], outbuf[BUFSIZE];
+ char *s, *t;
+ const char *fmt;
+
+ if (!dest || !message) {
+ 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 privmsg instead of notice if:
+ * - UsePrivmsg is enabled
+ * - The user is not registered and NSDefMsg is enabled
+ * - The user is registered and has set /ns set msg on
+ */
+ if (UsePrivmsg && ((!dest->na && (NSDefFlags & NI_MSG))
+ || (dest->na
+ && (dest->na->nc->flags & NI_MSG)))) {
+ anope_cmd_privmsg2(source, dest->nick, *outbuf ? outbuf : " ");
+ } else {
+ anope_cmd_notice2(source, dest->nick, *outbuf ? outbuf : " ");
+ }
+ }
+ va_end(args);
+}
+
+/*************************************************************************/
+
+/**
+ * Send a NOTICE from the given source to the given nick.
+ * @param source Orgin of the Message
+ * @param dest Destination of the Message
+ * @param fmt Format of the Message
+ * @param ... any number of parameters
+ * @return void
+ */
+void notice(char *source, char *dest, const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ *buf = '\0';
+
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+
+ if (NSDefFlags & NI_MSG) {
+ anope_cmd_privmsg2(source, dest, buf);
+ } else {
+ anope_cmd_notice2(source, dest, buf);
+ }
+ va_end(args);
+ }
+}
+
+/*************************************************************************/
+
+/**
+ * Send a PRIVMSG from the given source to the given nick.
+ * @param source Orgin of the Message
+ * @param dest Destination of the Message
+ * @param fmt Format of the Message
+ * @param ... any number of parameters
+ * @return void
+ */
+void privmsg(char *source, char *dest, const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ *buf = '\0';
+
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+
+ anope_cmd_privmsg2(source, dest, buf);
+}
+
+/*************************************************************************/
+
+/**
+ * Send out a WALLOP, this is here for legacy only, same day we will pull it out
+ * @param source Orgin of the Message
+ * @param fmt Format of the Message
+ * @param ... any number of parameters
+ * @return void
+ */
+void wallops(char *source, const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ *buf = '\0';
+
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+ va_end(args);
+ }
+
+ anope_cmd_global_legacy(source, buf);
+}
diff --git a/src/servers.c b/src/servers.c
new file mode 100644
index 000000000..dc87826ce
--- /dev/null
+++ b/src/servers.c
@@ -0,0 +1,618 @@
+/* Routines to maintain a list of connected servers
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+
+#include "services.h"
+
+Server *servlist = NULL;
+Server *me_server = NULL; /* This are we */
+Server *serv_uplink = NULL; /* This is our uplink */
+uint32 uplink_capab;
+char *uplink;
+char *TS6UPLINK;
+char *TS6SID;
+
+/* For first_server / next_server */
+static Server *server_cur;
+
+CapabInfo capab_info[] = {
+ {"NOQUIT", CAPAB_NOQUIT},
+ {"TSMODE", CAPAB_TSMODE},
+ {"UNCONNECT", CAPAB_UNCONNECT},
+ {"NICKIP", CAPAB_NICKIP},
+ {"SSJOIN", CAPAB_NSJOIN},
+ {"ZIP", CAPAB_ZIP},
+ {"BURST", CAPAB_BURST},
+ {"TS5", CAPAB_TS5},
+ {"TS3", CAPAB_TS3},
+ {"DKEY", CAPAB_DKEY},
+ {"PT4", CAPAB_PT4},
+ {"SCS", CAPAB_SCS},
+ {"QS", CAPAB_QS},
+ {"UID", CAPAB_UID},
+ {"KNOCK", CAPAB_KNOCK},
+ {"CLIENT", CAPAB_CLIENT},
+ {"IPV6", CAPAB_IPV6},
+ {"SSJ5", CAPAB_SSJ5},
+ {"SN2", CAPAB_SN2},
+ {"TOK1", CAPAB_TOKEN},
+ {"TOKEN", CAPAB_TOKEN},
+ {"VHOST", CAPAB_VHOST},
+ {"SSJ3", CAPAB_SSJ3},
+ {"SJB64", CAPAB_SJB64},
+ {"CHANMODES", CAPAB_CHANMODE},
+ {"NICKCHARS", CAPAB_NICKCHARS},
+ {NULL, 0}
+};
+
+/*************************************************************************/
+
+/**
+ * Return the first server in the server struct
+ * @param flags Server Flags, see services.h
+ * @return Server Struct
+ */
+Server *first_server(int flags)
+{
+ server_cur = servlist;
+ if (flags > -1) {
+ while (server_cur && (server_cur->flags != flags))
+ server_cur = next_server(flags);
+ }
+ return server_cur;
+}
+
+/*************************************************************************/
+
+/**
+ * Return the next server in the server struct
+ * @param flags Server Flags, see services.h
+ * @return Server Struct
+ */
+Server *next_server(int flags)
+{
+ if (!server_cur)
+ return NULL;
+
+ do {
+ if (server_cur->links) {
+ server_cur = server_cur->links;
+ } else if (server_cur->next) {
+ server_cur = server_cur->next;
+ } else {
+ do {
+ server_cur = server_cur->uplink;
+ if (server_cur && server_cur->next) {
+ server_cur = server_cur->next;
+ break;
+ }
+ } while (server_cur);
+ }
+ } while (server_cur && ((flags > -1) && (server_cur->flags != flags)));
+
+ return server_cur;
+}
+
+/*************************************************************************/
+
+/**
+ * This function makes a new Server structure and links it in the right
+ * places in the linked list if a Server struct to it's uplink if provided.
+ * It can also be NULL to indicate it's the uplink and should be first in
+ * the server list.
+ * @param uplink Server struct
+ * @param name Server Name
+ * @param desc Server Description
+ * @param flags Server Flags, see services.h
+ * @param suid Server Universal ID
+ * @return Server Struct
+ */
+Server *new_server(Server * uplink, const char *name, const char *desc,
+ uint16 flags, char *suid)
+{
+ Server *serv;
+
+ serv = scalloc(sizeof(Server), 1);
+ if (!name)
+ name = "";
+ serv->name = sstrdup(name);
+ serv->desc = sstrdup(desc);
+ serv->flags = flags;
+ serv->uplink = uplink;
+ if (suid) {
+ serv->suid = sstrdup(suid);
+ } else {
+ serv->suid = NULL;
+ }
+ if (ircd->sync)
+ serv->sync = SSYNC_IN_PROGRESS;
+ else
+ serv->sync = SSYNC_UNKNOWN;
+ serv->links = NULL;
+ serv->prev = NULL;
+
+ if (!uplink) {
+ serv->hops = 0;
+ serv->next = servlist;
+ if (servlist)
+ servlist->prev = serv;
+ servlist = serv;
+ } else {
+ serv->hops = uplink->hops + 1;
+ serv->next = uplink->links;
+ if (uplink->links)
+ uplink->links->prev = serv;
+ uplink->links = serv;
+ }
+ /* Check if this is our uplink server */
+ if ((uplink == me_server) && !(flags & SERVER_JUPED))
+ serv_uplink = serv;
+
+ /* Write the StartGlobal (to non-juped servers) */
+ if (GlobalOnCycle && GlobalOnCycleUP && !(flags & SERVER_JUPED))
+ notice_server(s_GlobalNoticer, serv, "%s", GlobalOnCycleUP);
+
+ return serv;
+}
+
+/*************************************************************************/
+
+/**
+ * Remove and free a Server structure. This function is the most complete
+ * remove treatment a server can get, as it first quits all clients which
+ * still pretend to be on this server, then it walks through all connected
+ * servers and disconnects them too. If all mess is cleared, the server
+ * itself will be too.
+ * @param Server struct
+ * @param reason the server quit
+ * @return void
+ */
+static void delete_server(Server * serv, const char *quitreason)
+{
+ Server *s, *snext;
+ User *u, *unext;
+ NickAlias *na;
+
+ if (!serv) {
+ if (debug) {
+ alog("debug: delete_server() called with NULL arg!");
+ }
+ return;
+ }
+
+ if (debug)
+ alog("debug: delete_server() called for %s", serv->name);
+
+ if (ircdcap->noquit || ircdcap->qs) {
+ if ((uplink_capab & ircdcap->noquit)
+ || (uplink_capab & ircdcap->qs)) {
+ u = firstuser();
+ while (u) {
+ unext = nextuser();
+ if (u->server == serv) {
+ if ((na = u->na) && !(na->status & NS_VERBOTEN)
+ && (!(na->nc->flags & NI_SUSPENDED))
+ && (na->status & (NS_IDENTIFIED | NS_RECOGNIZED))) {
+ na->last_seen = time(NULL);
+ if (na->last_quit)
+ free(na->last_quit);
+ na->last_quit =
+ (quitreason ? sstrdup(quitreason) : NULL);
+ }
+ if (LimitSessions) {
+ del_session(u->host);
+ }
+ delete_user(u);
+ }
+ u = unext;
+ }
+ if (debug)
+ alog("debug: delete_server() cleared all users");
+ }
+ }
+
+ s = serv->links;
+ while (s) {
+ snext = s->next;
+ delete_server(s, quitreason);
+ s = snext;
+ }
+
+ if (debug)
+ alog("debug: delete_server() cleared all servers");
+
+ free(serv->name);
+ free(serv->desc);
+ if (serv->prev)
+ serv->prev->next = serv->next;
+ if (serv->next)
+ serv->next->prev = serv->prev;
+ if (serv->uplink->links == serv)
+ serv->uplink->links = serv->next;
+
+ if (debug)
+ alog("debug: delete_server() completed");
+}
+
+/*************************************************************************/
+
+/**
+ * Find a server by name, returns NULL if not found
+ * @param s Server struct
+ * @param name Server Name
+ * @return Server struct
+ */
+Server *findserver(Server * s, const char *name)
+{
+ Server *sl;
+
+ if (!name || !*name) {
+ return NULL;
+ }
+
+ if (debug >= 3) {
+ alog("debug: findserver(%p)", name);
+ }
+ while (s && (stricmp(s->name, name) != 0)) {
+ if (s->links) {
+ sl = findserver(s->links, name);
+ if (sl) {
+ s = sl;
+ } else {
+ s = s->next;
+ }
+ } else {
+ s = s->next;
+ }
+ }
+ if (debug >= 3) {
+ alog("debug: findserver(%s) -> %p", name, (void *) s);
+ }
+ return s;
+}
+
+/*************************************************************************/
+
+/**
+ * Find a server by UID, returns NULL if not found
+ * @param s Server struct
+ * @param name Server Name
+ * @return Server struct
+ */
+Server *findserver_uid(Server * s, const char *name)
+{
+ Server *sl;
+
+ if (!name || !*name) {
+ return NULL;
+ }
+
+ if (debug >= 3) {
+ alog("debug: findserver_uid(%p)", name);
+ }
+ while (s && s->suid && (stricmp(s->suid, name) != 0)) {
+ if (s->links) {
+ sl = findserver_uid(s->links, name);
+ if (sl) {
+ s = sl;
+ } else {
+ s = s->next;
+ }
+ } else {
+ s = s->next;
+ }
+ }
+ if (debug >= 3) {
+ alog("debug: findserver_uid(%s) -> %p", name, (void *) s);
+ }
+ return s;
+}
+
+/*************************************************************************/
+
+/**
+ * Find if the server is synced with the network
+ * @param s Server struct
+ * @param name Server Name
+ * @return Not Synced returns -1, Synced returns 1, Error returns 0
+ */
+int anope_check_sync(const char *name)
+{
+ Server *s;
+ s = findserver(servlist, name);
+
+ if (!s)
+ return 0;
+
+ if (is_sync(s))
+ return 1;
+ else
+ return -1;
+}
+
+/*************************************************************************/
+
+/**
+ * Handle adding the server to the Server struct
+ * @param source Name of the uplink if any
+ * @param servername Name of the server being linked
+ * @param hops Number of hops to reach this server
+ * @param descript Description of the server
+ * @param numeric Server Numberic/SUID
+ * @return void
+ */
+void do_server(const char *source, char *servername, char *hops,
+ char *descript, char *numeric)
+{
+ Server *s;
+
+ if (debug) {
+ if (!*source) {
+ alog("debug: Server introduced (%s)", servername);
+ } else {
+ alog("debug: Server introduced (%s) from %s", servername,
+ source);
+ }
+ }
+
+ if (source[0] == '\0')
+ s = me_server;
+ else
+ s = findserver(servlist, source);
+
+ new_server(s, servername, descript, 0, numeric);
+ send_event(EVENT_SERVER_CONNECT, 1, servername);
+}
+
+/*************************************************************************/
+
+/**
+ * Handle removing the server from the Server struct
+ * @param source Name of the server leaving
+ * @param ac Number of arguments in av
+ * @param av Agruments as part of the SQUIT
+ * @return void
+ */
+void do_squit(const char *source, int ac, char **av)
+{
+ char buf[BUFSIZE];
+ Server *s;
+
+ if (UseTS6 && ircd->ts6) {
+ s = findserver_uid(servlist, av[0]);
+ if (!s) {
+ s = findserver(servlist, av[0]);
+ }
+ } else {
+ s = findserver(servlist, av[0]);
+ }
+ if (!s) {
+ alog("SQUIT for nonexistent server (%s)!!", av[0]);
+ return;
+ }
+ send_event(EVENT_SERVER_SQUIT, 1, s->name);
+
+ /* If this is a juped server, send a nice global to inform the online
+ * opers that we received it.
+ */
+ if (s->flags & SERVER_JUPED) {
+ snprintf(buf, BUFSIZE, "Received SQUIT for juped server %s",
+ s->name);
+ anope_cmd_global(s_OperServ, buf);
+ }
+
+ snprintf(buf, sizeof(buf), "%s %s", s->name,
+ (s->uplink ? s->uplink->name : ""));
+
+ if (ircdcap->unconnect) {
+ if ((s->uplink == me_server)
+ && (uplink_capab & ircdcap->unconnect)) {
+ if (debug) {
+ alog("debug: Sending UNCONNECT SQUIT for %s", s->name);
+ }
+ /* need to fix */
+ anope_cmd_squit(s->name, buf);
+ }
+ }
+
+ delete_server(s, buf);
+}
+
+/*************************************************************************/
+
+/**
+ * Handle parsing the CAPAB/PROTOCTL messages
+ * @param ac Number of arguments in av
+ * @param av Agruments
+ * @return void
+ */
+void capab_parse(int ac, char **av)
+{
+ int i;
+ int j;
+ char *s, *tmp;
+
+ char *temp;
+
+ for (i = 0; i < ac; i++) {
+ temp = av[i];
+
+ s = myStrGetToken(temp, '=', 0);
+ tmp = myStrGetTokenRemainder(temp, '=', 1);
+
+ if (!s)
+ continue;
+
+ for (j = 0; capab_info[j].token; j++) {
+ if (stricmp(s, capab_info[j].token) == 0)
+ uplink_capab |= capab_info[j].flag;
+ /* Special cases */
+ if ((stricmp(s, "NICKIP") == 0) && !ircd->nickip)
+ ircd->nickip = 1;
+ if ((stricmp(s, "CHANMODES") == 0) && tmp)
+ ircd->chanmodes = sstrdup(tmp);
+ if ((stricmp(s, "NICKCHARS") == 0) && tmp)
+ ircd->nickchars = sstrdup(tmp);
+ }
+
+ if (s)
+ free(s);
+ if (tmp)
+ free(tmp);
+ }
+}
+
+/*************************************************************************/
+
+/**
+ * Search the uline servers array to find out if the server that just set the
+ * mode is in our uline list
+ * @param server Server Setting the mode
+ * @return int 0 if not found, 1 if found
+ */
+int is_ulined(char *server)
+{
+ int j;
+
+ for (j = 0; j < NumUlines; j++) {
+ if (stricmp(Ulines[j], server) == 0) {
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+/*************************************************************************/
+
+/**
+ * See if the current server is synced, or has an unknown sync state
+ * (in which case we pretend it is always synced)
+ * @param server Server of which we want to know the state
+ * @return int 0 if not synced, 1 if synced
+ */
+int is_sync(Server * server)
+{
+ if ((server->sync == SSYNC_DONE) || (server->sync == SSYNC_UNKNOWN))
+ return 1;
+ return 0;
+}
+
+/*************************************************************************/
+
+/* Finish the syncing process for this server and (optionally) for all
+ * it's leaves as well
+ * @param serv Server to finish syncing
+ * @param sync_links Should all leaves be synced as well? (1: yes, 0: no)
+ * @return void
+ */
+void finish_sync(Server * serv, int sync_links)
+{
+ Server *s;
+
+ if (!serv || is_sync(serv))
+ return;
+
+ /* Mark each server as in sync */
+ s = serv;
+ do {
+ if (!is_sync(s)) {
+ if (debug)
+ alog("debug: Finishing sync for server %s", s->name);
+
+ s->sync = SSYNC_DONE;
+ }
+
+ if (!sync_links)
+ break;
+
+ if (s->links) {
+ s = s->links;
+ } else if (s->next) {
+ s = s->next;
+ } else {
+ do {
+ s = s->uplink;
+ if (s == serv)
+ s = NULL;
+ if (s == me_server)
+ s = NULL;
+ } while (s && !(s->next));
+ if (s)
+ s = s->next;
+ }
+ } while (s);
+
+ /* Do some general stuff which should only be done once */
+ restore_unsynced_topics();
+ alog("Server %s is done syncing", serv->name);
+}
+
+/*******************************************************************/
+
+/* TS6 UID generator common code.
+ *
+ * Derived from atheme-services, uid.c (hg 2954:116d46894b4c).
+ * -nenolod
+ */
+static int ts6_uid_initted = 0;
+static char ts6_new_uid[10]; /* allow for \0 */
+static unsigned int ts6_uid_index = 9; /* last slot in uid buf */
+
+void ts6_uid_init(void)
+{
+ unsigned int i;
+ char buf[BUFSIZE];
+
+ /* check just in case... you can never be too safe. */
+ if (TS6SID != NULL) {
+ snprintf(ts6_new_uid, 10, "%sAAAAAA", TS6SID);
+ ts6_uid_initted = 1;
+ } else {
+ alog("warning: no TS6SID specified, disabling TS6 support.");
+ UseTS6 = 0;
+
+ return;
+ }
+}
+
+void ts6_uid_increment(unsigned int slot)
+{
+ if (slot != strlen(TS6SID)) {
+ if (ts6_new_uid[slot] == 'Z')
+ ts6_new_uid[slot] = '0';
+ else if (ts6_new_uid[slot] == '9') {
+ ts6_new_uid[slot] = 'A';
+ ts6_uid_increment(slot - 1);
+ } else
+ ts6_new_uid[slot]++;
+ } else {
+ if (ts6_new_uid[slot] == 'Z')
+ for (slot = 3; slot < 9; slot++)
+ ts6_new_uid[slot] = 'A';
+ else
+ ts6_new_uid[slot]++;
+ }
+}
+
+char *ts6_uid_retrieve(void)
+{
+ if (ts6_uid_initted != 1)
+ ts6_uid_init();
+
+ ts6_uid_increment(ts6_uid_index - 1);
+
+ return ts6_new_uid;
+}
+
+/* EOF */
diff --git a/src/sessions.c b/src/sessions.c
new file mode 100644
index 000000000..05e90a76d
--- /dev/null
+++ b/src/sessions.c
@@ -0,0 +1,873 @@
+/* Session Limiting functions.
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+
+#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)
+ */
+
+/*************************************************************************/
+
+/* 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))
+
+Session *sessionlist[1024];
+int32 nsessions = 0;
+
+Exception *exceptions = NULL;
+int16 nexceptions = 0;
+
+/*************************************************************************/
+/****************************** 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 ************************/
+/*************************************************************************/
+
+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(char *nick, char *host, char *hostip)
+{
+ Session *session, **list;
+ Exception *exception;
+ int sessionlimit = 0;
+
+ session = findsession(host);
+
+ if (session) {
+ exception = find_hostip_exception(host, hostip);
+
+ 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, "%s", SessionLimitDetailsLoc);
+
+ /* We don't use kill_user() because a user stucture has not yet
+ * been created. Simply kill the user. -TheShadow
+ */
+ kill_user(s_OperServ, nick, "Session limit exceeded");
+
+ 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");
+ anope_cmd_global(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 (!LimitSessions) {
+ if (debug) {
+ alog("debug: del_session called when LimitSessions is disabled");
+ }
+ return;
+ }
+
+ if (!host || !*host) {
+ if (debug) {
+ alog("debug: del_session called with NULL values");
+ }
+ return;
+ }
+
+ if (debug >= 2)
+ alog("debug: del_session() called");
+
+ session = findsession(host);
+
+ if (!session) {
+ if (debug) {
+ anope_cmd_global(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)
+ anope_cmd_global(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;
+}
+
+/* Same as find_host_exception() except
+ * this tries to find the exception by IP also. */
+Exception *find_hostip_exception(const char *host, const char *hostip)
+{
+ int i;
+
+ for (i = 0; i < nexceptions; i++) {
+ if ((match_wild_nocase(exceptions[i].mask, host))
+ || ((ircd->nickip && hostip)
+ && (match_wild_nocase(exceptions[i].mask, hostip)))) {
+ 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;
+ uint16 n;
+ uint16 tmp16;
+ uint32 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) { \
+ anope_cmd_global(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;
+ if (rdb_tag_table("anope_os_exceptions") == 0) {
+ alog("Unable to tag table 'anope_os_exceptions' - Exception RDB save failed.");
+ return;
+ }
+ for (i = 0; i < nexceptions; i++) {
+ e = &exceptions[i];
+ if (rdb_save_exceptions(e) == 0) {
+ alog("Unable to save Exception '%s' - Exception RDB save failed.", e->mask);
+ return;
+ }
+ }
+ if (rdb_clean_table("anope_os_exceptions") == 0) {
+ alog("Unable to clean table 'anope_os_exceptions' - Exception RDB save failed.");
+ return;
+ }
+ rdb_close();
+#endif
+}
+
+/*************************************************************************/
+/************************ Exception Manipulation *************************/
+/*************************************************************************/
+
+int exception_add(User * u, 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)) {
+ if (exceptions[i].limit != limit) {
+ exceptions[i].limit = limit;
+ if (u)
+ notice_lang(s_OperServ, u, OPER_EXCEPTION_CHANGED,
+ mask, exceptions[i].limit);
+ return -2;
+ } else {
+ if (u)
+ notice_lang(s_OperServ, u, OPER_EXCEPTION_EXISTS,
+ mask);
+ return -1;
+ }
+ }
+ }
+
+ 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;
+ int x;
+
+ 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;
+ }
+
+ x = exception_add(u, mask, limit, reason, u->nick, expires);
+
+ if (x == 1) {
+ notice_lang(s_OperServ, u, OPER_EXCEPTION_ADDED, 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/src/slist.c b/src/slist.c
new file mode 100644
index 000000000..099a59328
--- /dev/null
+++ b/src/slist.c
@@ -0,0 +1,395 @@
+/* Services list handler implementation.
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+
+#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.
+ * @param slist Slist Struct
+ * @param item Item being added
+ * @return int
+ */
+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.
+ * @param slist Slist Struct
+ * @param mustfree What is being freed
+ * @return void
+ */
+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.
+ * @param slist Slist Struct
+ * @param index beign deleted
+ * @return int 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
+ * @param slist Slist Struct
+ * @param range Range to delete
+ * @param cb Call back function
+ * @param ... various args
+ * @return int
+ */
+int slist_delete_range(SList * slist, char *range, slist_delcheckcb_t cb,
+ ...)
+{
+ int count = 0, i, n1, n2;
+ va_list args, preserve;
+
+ 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;
+
+ /* copy this off the stack for safety's sake --nenolod */
+ VA_COPY(preserve, args);
+
+ if (cb && !cb(slist, slist->list[i - 1], preserve)) {
+ va_end(preserve);
+ return -1;
+ }
+
+ /* if it's to be freed, lets free it */
+ if (slist->opts && slist->opts->freeitem)
+ slist->opts->freeitem(slist, slist->list[i - 1]);
+ slist->list[i - 1] = NULL;
+
+ /* and release the copied list */
+ va_end(preserve);
+
+ 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.
+ * @param slit Slist struct
+ * @param range Range to enum
+ * @param cb Call back function
+ * @param ... various args
+ * @return int
+ */
+int slist_enum(SList * slist, char *range, slist_enumcb_t cb, ...)
+{
+ int count = 0, i, res;
+ va_list args, preserve;
+
+ 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;
+ }
+
+ /* copy off stack for safety */
+ VA_COPY(preserve, args);
+
+ res = cb(slist, i + 1, slist->list[i], preserve);
+ if (res < 0) {
+ va_end(preserve);
+ break;
+ }
+
+ /* and release our copy */
+ va_end(preserve);
+
+ 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;
+ }
+
+ /* copy off stack for safety */
+ VA_COPY(preserve, args);
+
+ res = cb(slist, i, slist->list[i - 1], preserve);
+ if (res < 0) {
+ va_end(preserve);
+ break;
+ }
+ count += res;
+
+ /* and release our copy */
+ va_end(preserve);
+ }
+ if (res < -1)
+ break;
+ range += strcspn(range, ",");
+ if (*range)
+ range++;
+ else
+ break;
+ }
+ }
+
+ va_end(args);
+
+ return count;
+}
+
+/*************************************************************************/
+
+/**
+ * Determines whether the list is full.
+ * @param slist Slist Struct
+ * @return int
+ */
+int slist_full(SList * slist)
+{
+ if (slist->limit != 0 && slist->count >= slist->limit)
+ return 1;
+ else
+ return 0;
+}
+
+/*************************************************************************/
+
+/**
+ * Initialization of the list.
+ * @param slist Slist Struct
+ * @return int
+ */
+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.
+ * @param slist Slist Struct
+ * @param item Item index
+ * @return int
+ */
+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.
+ * @param slist Slist Struct
+ * @return void
+ */
+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.
+ * @param slist Slist Struct
+ * @param item to remove
+ * @return int
+ */
+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
+ * @param slist Slist Struct
+ * @param capacity How large the list can be
+ * @return int
+ */
+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/src/sockutil.c b/src/sockutil.c
new file mode 100644
index 000000000..b28989bdb
--- /dev/null
+++ b/src/sockutil.c
@@ -0,0 +1,737 @@
+/* Socket utility routines.
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+
+#include "services.h"
+
+/*************************************************************************/
+
+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;
+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;
+static int lastchar = EOF;
+
+/*************************************************************************/
+
+/**
+ * Return amount of data in read buffer.
+ * @return int32
+ */
+int32 read_buffer_len()
+{
+ if (read_bufend >= read_curpos) {
+ return read_bufend - read_curpos;
+ } else {
+ return (read_bufend + NET_BUFSIZE) - read_curpos;
+ }
+}
+
+/*************************************************************************/
+
+/**
+ * Read data.
+ * @param fd File Pointer
+ * @param buf Buffer
+ * @param int Length of buffer
+ * @return int
+ */
+static int buffered_read(ano_socket_t fd, char *buf, int len)
+{
+ int nread, left = len;
+ fd_set fds;
+ struct timeval tv = { 0, 0 };
+ int errno_save = ano_sockgeterr();
+
+ if (fd < 0) {
+ ano_sockseterr(SOCKERR_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 = ano_sockread(fd, read_bufend, maxread);
+ errno_save = ano_sockgeterr();
+ 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);
+ }
+ ano_sockseterr(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().
+ * @param fd File Pointer
+ * @return int
+ */
+static int buffered_read_one(ano_socket_t 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 = ano_sockgeterr();
+
+ if (fd < 0) {
+ ano_sockseterr(SOCKERR_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 = ano_sockread(fd, read_bufend, maxread);
+ errno_save = ano_sockgeterr();
+ 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);
+ ano_sockseterr(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;
+}
+
+/*************************************************************************/
+
+/**
+ * Return amount of data in write buffer.
+ * @return int
+ */
+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.
+ * @param wait Wait
+ * @return int
+ */
+static int flush_write_buffer(int wait)
+{
+ fd_set fds;
+ struct timeval tv = { 0, 0 };
+ int errno_save = ano_sockgeterr();
+
+ 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 = ano_sockwrite(write_fd, write_curpos, maxwrite);
+ errno_save = ano_sockgeterr();
+ 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;
+ }
+ }
+ ano_sockseterr(errno_save);
+ return 0;
+}
+
+/*************************************************************************/
+
+/**
+ * Write data.
+ * @param fd File Pointer
+ * @param buf Buffer to write
+ * @param len Length to write
+ * @return int
+ */
+static int buffered_write(ano_socket_t fd, char *buf, int len)
+{
+ int nwritten, left = len;
+ int errno_save = ano_sockgeterr();
+
+ 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);
+ }
+ ano_sockseterr(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.
+ * @param int to write
+ * @param fd Pointer
+ * @return int
+ */
+#if 0
+static int buffered_write_one(int c, ano_socket_t fd)
+{
+ struct timeval tv = { 0, 0 };
+
+ if (fd < 0) {
+ ano_sockseterr(SOCKERR_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 */
+
+/*************************************************************************/
+
+/**
+ * sgetc ?
+ * @param int to read
+ * @return int
+ */
+int sgetc(ano_socket_t s)
+{
+ int c;
+
+ if (lastchar != EOF) {
+ c = lastchar;
+ lastchar = EOF;
+ return c;
+ }
+ return buffered_read_one(s);
+}
+
+/*************************************************************************/
+
+/**
+ * sungetc ?
+ * @param int c
+ * @param int s
+ * @return int
+ */
+int sungetc(int c, int s)
+{
+ return lastchar = c;
+}
+
+/*************************************************************************/
+
+/**
+ * If connection was broken, return NULL. If the read timed out, return
+ * (char *)-1.
+ * @param buf Buffer to get
+ * @param len Length
+ * @param s Socket
+ * @return buffer
+ */
+char *sgets(char *buf, int len, ano_socket_t s)
+{
+ int c = 0;
+ struct timeval tv;
+ fd_set fds;
+ char *ptr = buf;
+
+ flush_write_buffer(0);
+
+ 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 (ano_sockgeterr() != EINTR)
+ break;
+ flush_write_buffer(0);
+ }
+ 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.
+ * @param buf Buffer to get
+ * @param len Length
+ * @param s Socket
+ * @return buffer
+ */
+char *sgets2(char *buf, int len, ano_socket_t 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.)
+ * @param s Socket
+ * @param buf Buffer to get
+ * @param len Length
+ * @return int
+ */
+int sread(ano_socket_t s, char *buf, int len)
+{
+ return buffered_read(s, buf, len);
+}
+
+/*************************************************************************/
+
+/**
+ * sputs : write buffer
+ * @param s Socket
+ * @param str Buffer to write
+ * @return int
+ */
+int sputs(char *str, ano_socket_t s)
+{
+ return buffered_write(s, str, strlen(str));
+}
+
+/*************************************************************************/
+
+/**
+ * sockprintf : a socket writting printf()
+ * @param s Socket
+ * @param fmt format of message
+ * @param ... various args
+ * @return int
+ */
+int sockprintf(ano_socket_t s, char *fmt, ...)
+{
+ va_list args;
+ char buf[16384]; /* Really huge, to try and avoid truncation */
+ int value;
+
+ va_start(args, fmt);
+ value = buffered_write(s, buf, vsnprintf(buf, sizeof(buf), fmt, args));
+ va_end(args);
+ return value;
+}
+
+/*************************************************************************/
+
+#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.
+ * @param ipaddr IP Address
+ * @return char 4byte ip char string
+ */
+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.
+ * @param host Remote Host
+ * @param port Remote Port
+ * @param lhost LocalHost
+ * @param lport LocalPort
+ * @return int if successful
+ */
+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;
+ ano_socket_t sock;
+ int sockopt = 1;
+
+ 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);
+ ano_sockseterr(SOCKERR_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 (setsockopt
+ (sock, SOL_SOCKET, SO_REUSEADDR, (char *) &sockopt,
+ sizeof(int)) < 0)
+ alog("debug: couldn't set SO_REUSEADDR on socket");
+
+ if ((lhost || lport)
+ && bind(sock, (struct sockaddr *) &lsa, sizeof(lsa)) < 0) {
+ int errno_save = ano_sockgeterr();
+ ano_sockclose(sock);
+ ano_sockseterr(errno_save);
+ return -1;
+ }
+
+ if (connect(sock, (struct sockaddr *) &sa, sizeof(sa)) < 0) {
+ int errno_save = ano_sockgeterr();
+ ano_sockclose(sock);
+ ano_sockseterr(errno_save);
+ return -1;
+ }
+
+ return sock;
+}
+
+/*************************************************************************/
+
+/**
+ * Close up the connection
+ * @param s Socket
+ * @return void
+ */
+void disconn(ano_socket_t s)
+{
+ shutdown(s, 2);
+ ano_sockclose(s);
+}
+
+/*************************************************************************/
+/* Windows support functions */
+
+#ifdef _WIN32
+/* Microsoft makes things nice and fun for us! */
+struct u_WSA_errors {
+ int error_code;
+ char *error_string;
+};
+
+/* Must be sorted ascending by error code */
+struct u_WSA_errors WSAErrors[] = {
+ {WSAEINTR, "Interrupted system call"},
+ {WSAEBADF, "Bad file number"},
+ {WSAEACCES, "Permission denied"},
+ {WSAEFAULT, "Bad address"},
+ {WSAEINVAL, "Invalid argument"},
+ {WSAEMFILE, "Too many open sockets"},
+ {WSAEWOULDBLOCK, "Operation would block"},
+ {WSAEINPROGRESS, "Operation now in progress"},
+ {WSAEALREADY, "Operation already in progress"},
+ {WSAENOTSOCK, "Socket operation on non-socket"},
+ {WSAEDESTADDRREQ, "Destination address required"},
+ {WSAEMSGSIZE, "Message too long"},
+ {WSAEPROTOTYPE, "Protocol wrong type for socket"},
+ {WSAENOPROTOOPT, "Bad protocol option"},
+ {WSAEPROTONOSUPPORT, "Protocol not supported"},
+ {WSAESOCKTNOSUPPORT, "Socket type not supported"},
+ {WSAEOPNOTSUPP, "Operation not supported on socket"},
+ {WSAEPFNOSUPPORT, "Protocol family not supported"},
+ {WSAEAFNOSUPPORT, "Address family not supported"},
+ {WSAEADDRINUSE, "Address already in use"},
+ {WSAEADDRNOTAVAIL, "Can't assign requested address"},
+ {WSAENETDOWN, "Network is down"},
+ {WSAENETUNREACH, "Network is unreachable"},
+ {WSAENETRESET, "Net connection reset"},
+ {WSAECONNABORTED, "Software caused connection abort"},
+ {WSAECONNRESET, "Connection reset by peer"},
+ {WSAENOBUFS, "No buffer space available"},
+ {WSAEISCONN, "Socket is already connected"},
+ {WSAENOTCONN, "Socket is not connected"},
+ {WSAESHUTDOWN, "Can't send after socket shutdown"},
+ {WSAETOOMANYREFS, "Too many references, can't splice"},
+ {WSAETIMEDOUT, "Connection timed out"},
+ {WSAECONNREFUSED, "Connection refused"},
+ {WSAELOOP, "Too many levels of symbolic links"},
+ {WSAENAMETOOLONG, "File name too long"},
+ {WSAEHOSTDOWN, "Host is down"},
+ {WSAEHOSTUNREACH, "No route to host"},
+ {WSAENOTEMPTY, "Directory not empty"},
+ {WSAEPROCLIM, "Too many processes"},
+ {WSAEUSERS, "Too many users"},
+ {WSAEDQUOT, "Disc quota exceeded"},
+ {WSAESTALE, "Stale NFS file handle"},
+ {WSAEREMOTE, "Too many levels of remote in path"},
+ {WSASYSNOTREADY, "Network subsystem is unavailable"},
+ {WSAVERNOTSUPPORTED, "Winsock version not supported"},
+ {WSANOTINITIALISED, "Winsock not yet initialized"},
+ {WSAHOST_NOT_FOUND, "Host not found"},
+ {WSATRY_AGAIN, "Non-authoritative host not found"},
+ {WSANO_RECOVERY, "Non-recoverable errors"},
+ {WSANO_DATA, "Valid name, no data record of requested type"},
+ {WSAEDISCON, "Graceful disconnect in progress"},
+#ifdef WSASYSCALLFAILURE
+ {WSASYSCALLFAILURE, "System call failure"},
+#endif
+ {0, NULL}
+};
+
+char *ano_sockstrerror(int error)
+{
+ static char unkerr[64];
+ int start = 0;
+ int stop = sizeof(WSAErrors) / sizeof(WSAErrors[0]) - 1;
+ int mid;
+
+ /* Microsoft decided not to use sequential numbers for the error codes,
+ * so we can't just use the array index for the code. But, at least
+ * use a binary search to make it as fast as possible.
+ */
+ while (start <= stop) {
+ mid = (start + stop) / 2;
+ if (WSAErrors[mid].error_code > error)
+ stop = mid - 1;
+
+ else if (WSAErrors[mid].error_code < error)
+ start = mid + 1;
+ else
+ return WSAErrors[mid].error_string;
+ }
+ sprintf(unkerr, "Unknown Error: %d", error);
+ return unkerr;
+}
+
+int ano_socksetnonb(ano_socket_t fd)
+{
+ u_long i = 1;
+ return (!ioctlsocket(fd, FIONBIO, &i) ? -1 : 1);
+}
+#endif
diff --git a/src/timeout.c b/src/timeout.c
new file mode 100644
index 000000000..1db734654
--- /dev/null
+++ b/src/timeout.c
@@ -0,0 +1,132 @@
+/* Routines for time-delayed actions.
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+
+#include "services.h"
+#include "pseudo.h"
+
+static Timeout *timeouts = NULL;
+
+/*************************************************************************/
+
+#ifdef DEBUG_COMMANDS
+
+/* Send the timeout list to the given user. */
+
+int send_timeout_list(User * u)
+{
+ Timeout *to, *last;
+
+ notice(s_OperServ, u->nick, "Now: %ld", (long int) time(NULL));
+ for (to = timeouts, last = NULL; to; last = to, to = to->next) {
+ notice(s_OperServ, u->nick, "0x%p: %ld: 0x%p (0x%p)",
+ (void *) to, (long int) to->timeout, (void *) to->code,
+ (void *) to->data);
+ if (to->prev != last)
+ notice(s_OperServ, u->nick,
+ " to->prev incorrect! expected=0x%p seen=0x%p",
+ (void *) last, (void *) to->prev);
+ }
+ return MOD_CONT;
+}
+
+#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", (long int) t);
+
+ to = timeouts;
+ while (to) {
+ if (t < to->timeout) {
+ to = to->next;
+ continue;
+ }
+ if (debug >= 4) {
+ alog("debug: Running timeout 0x%p (code=0x%p repeat=%d)",
+ (void *) to, (void *) 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/src/tools/Anope_Install_Script.nsi b/src/tools/Anope_Install_Script.nsi
new file mode 100644
index 000000000..633a4aa19
--- /dev/null
+++ b/src/tools/Anope_Install_Script.nsi
@@ -0,0 +1,540 @@
+; Script generated by the HM NIS Edit Script Wizard.
+
+; HM NIS Edit Wizard helper defines
+!define PRODUCT_NAME "Anope IRC Services"
+!define PRODUCT_VERSION "1.8.0"
+!define PRODUCT_PUBLISHER "Anope"
+!define PRODUCT_WEB_SITE "http://www.anope.org"
+!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\anope.exe"
+!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
+!define PRODUCT_UNINST_ROOT_KEY "HKLM"
+
+; MUI 1.67 compatible ------
+!include "MUI.nsh"
+
+; MUI Settings
+!define MUI_ABORTWARNING
+!define MUI_ICON "anope-icon.ico"
+!define MUI_UNICON "anope-icon.ico"
+
+; Language Selection Dialog Settings
+!define MUI_LANGDLL_REGISTRY_ROOT "${PRODUCT_UNINST_ROOT_KEY}"
+!define MUI_LANGDLL_REGISTRY_KEY "${PRODUCT_UNINST_KEY}"
+!define MUI_LANGDLL_REGISTRY_VALUENAME "NSIS:Language"
+
+; Welcome page
+!insertmacro MUI_PAGE_WELCOME
+; License page
+!define MUI_LICENSEPAGE_RADIOBUTTONS
+!insertmacro MUI_PAGE_LICENSE "anope-1.8.0\docs\COPYING.txt"
+; Directory page
+!insertmacro MUI_PAGE_DIRECTORY
+; Instfiles page
+!insertmacro MUI_PAGE_INSTFILES
+; Finish page
+!define MUI_FINISHPAGE_SHOWREADME "$INSTDIR\docs\README.txt"
+!insertmacro MUI_PAGE_FINISH
+
+; Uninstaller pages
+!insertmacro MUI_UNPAGE_INSTFILES
+
+; Language files
+!insertmacro MUI_LANGUAGE "Dutch"
+!insertmacro MUI_LANGUAGE "English"
+!insertmacro MUI_LANGUAGE "French"
+!insertmacro MUI_LANGUAGE "German"
+!insertmacro MUI_LANGUAGE "Italian"
+!insertmacro MUI_LANGUAGE "Portuguese"
+!insertmacro MUI_LANGUAGE "Spanish"
+
+; MUI end ------
+
+Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
+OutFile "Anope-1.8.0.exe"
+InstallDir "$PROGRAMFILES\Anope"
+InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" ""
+ShowInstDetails show
+ShowUnInstDetails show
+
+Function .onInit
+ !insertmacro MUI_LANGDLL_DISPLAY
+FunctionEnd
+
+Section "MainSection" SEC01
+ SetOutPath "$INSTDIR"
+ File "anope-1.8.0\anope.exe"
+File "anope-1.8.0\anope.bat"
+ SetShellVarContext all
+ CreateDirectory "$SMPROGRAMS\Anope"
+ CreateShortCut "$SMPROGRAMS\Anope\Anope IRC Services.lnk" "$INSTDIR\anope.exe"
+ CreateDirectory "$SMPROGRAMS\Anope\Advanced"
+ CreateShortCut "$SMPROGRAMS\Anope\Advanced\Anope IRC Services (Debug and Window Logging).lnk" "$INSTDIR\anope.bat" "-debug -nofork"
+ CreateShortCut "$SMPROGRAMS\Anope\Advanced\Anope IRC Services (Window Logging).lnk" "$INSTDIR\anope.bat" "-nofork"
+ CreateShortCut "$SMPROGRAMS\Anope\Advanced\Anope IRC Services (No Third Party Modules).lnk" "$INSTDIR\anope.bat" "-nothird"
+ CreateShortCut "$DESKTOP\Anope IRC Services.lnk" "$INSTDIR\anope.exe"
+ File "anope-1.8.0\anope.exe.manifest"
+ File "anope-1.8.0\Changes.conf.txt"
+ File "anope-1.8.0\Changes.lang.txt"
+ File "anope-1.8.0\Changes.mysql.txt"
+ File "anope-1.8.0\Changes.txt"
+ SetOutPath "$INSTDIR\data"
+ File "anope-1.8.0\data\anopesmtp.exe"
+ File "anope-1.8.0\data\anopesmtp.exe.manifest"
+ SetOutPath "$INSTDIR\data\bin"
+ File "anope-1.8.0\data\bin\am"
+ File "anope-1.8.0\data\bin\anoperc.in"
+ File "anope-1.8.0\data\bin\cp-recursive"
+ File "anope-1.8.0\data\bin\langtool"
+ File "anope-1.8.0\data\bin\mydbgen"
+ File "anope-1.8.0\data\bin\register"
+ SetOutPath "$INSTDIR\data"
+ File "anope-1.8.0\data\db-merger.exe"
+ File "anope-1.8.0\data\db-merger.exe.manifest"
+ File "anope-1.8.0\data\epona2anope.exe"
+ File "anope-1.8.0\data\epona2anope.exe.manifest"
+ File "anope-1.8.0\data\example.conf"
+ SetOutPath "$INSTDIR\data\languages"
+ File "anope-1.8.0\data\languages\cat"
+ File "anope-1.8.0\data\languages\de"
+ File "anope-1.8.0\data\languages\en_us"
+ File "anope-1.8.0\data\languages\es"
+ File "anope-1.8.0\data\languages\fr"
+ File "anope-1.8.0\data\languages\gr"
+ File "anope-1.8.0\data\languages\hun"
+ File "anope-1.8.0\data\languages\it"
+ File "anope-1.8.0\data\languages\nl"
+ File "anope-1.8.0\data\languages\pl"
+ File "anope-1.8.0\data\languages\pt"
+ File "anope-1.8.0\data\languages\ru"
+ File "anope-1.8.0\data\languages\tr"
+ SetOutPath "$INSTDIR\data\logs"
+ SetOutPath "$INSTDIR\data\backups"
+ SetOutPath "$INSTDIR\data\modules"
+ File "anope-1.8.0\data\modules\bahamut.dll"
+ File "anope-1.8.0\data\modules\bs_act.dll"
+ File "anope-1.8.0\data\modules\bs_assign.dll"
+ File "anope-1.8.0\data\modules\bs_badwords.dll"
+ File "anope-1.8.0\data\modules\bs_bot.dll"
+ File "anope-1.8.0\data\modules\bs_botlist.dll"
+ File "anope-1.8.0\data\modules\bs_fantasy.dll"
+ File "anope-1.8.0\data\modules\bs_fantasy_kick.dll"
+ File "anope-1.8.0\data\modules\bs_fantasy_kickban.dll"
+ File "anope-1.8.0\data\modules\bs_fantasy_owner.dll"
+ File "anope-1.8.0\data\modules\bs_fantasy_seen.dll"
+ File "anope-1.8.0\data\modules\bs_fantasy_unban.dll"
+ File "anope-1.8.0\data\modules\bs_help.dll"
+ File "anope-1.8.0\data\modules\bs_info.dll"
+ File "anope-1.8.0\data\modules\bs_kick.dll"
+ File "anope-1.8.0\data\modules\bs_say.dll"
+ File "anope-1.8.0\data\modules\bs_set.dll"
+ File "anope-1.8.0\data\modules\bs_unassign.dll"
+ File "anope-1.8.0\data\modules\charybdis.dll"
+ File "anope-1.8.0\data\modules\cs_access.dll"
+ File "anope-1.8.0\data\modules\cs_akick.dll"
+ File "anope-1.8.0\data\modules\cs_appendtopic.dll"
+ File "anope-1.8.0\data\modules\cs_ban.dll"
+ File "anope-1.8.0\data\modules\cs_clear.dll"
+ File "anope-1.8.0\data\modules\cs_drop.dll"
+ File "anope-1.8.0\data\modules\cs_enforce.dll"
+ File "anope-1.8.0\data\modules\cs_forbid.dll"
+ File "anope-1.8.0\data\modules\cs_getkey.dll"
+ File "anope-1.8.0\data\modules\cs_getpass.dll"
+ File "anope-1.8.0\data\modules\cs_help.dll"
+ File "anope-1.8.0\data\modules\cs_identify.dll"
+ File "anope-1.8.0\data\modules\cs_info.dll"
+ File "anope-1.8.0\data\modules\cs_invite.dll"
+ File "anope-1.8.0\data\modules\cs_kick.dll"
+ File "anope-1.8.0\data\modules\cs_list.dll"
+ File "anope-1.8.0\data\modules\cs_logout.dll"
+ File "anope-1.8.0\data\modules\cs_modes.dll"
+ File "anope-1.8.0\data\modules\cs_register.dll"
+ File "anope-1.8.0\data\modules\cs_sendpass.dll"
+ File "anope-1.8.0\data\modules\cs_set.dll"
+ File "anope-1.8.0\data\modules\cs_status.dll"
+ File "anope-1.8.0\data\modules\cs_suspend.dll"
+ File "anope-1.8.0\data\modules\cs_tban.dll"
+ File "anope-1.8.0\data\modules\cs_topic.dll"
+ File "anope-1.8.0\data\modules\cs_xop.dll"
+ File "anope-1.8.0\data\modules\dreamforge.dll"
+ File "anope-1.8.0\data\modules\enc_md5.dll"
+ File "anope-1.8.0\data\modules\enc_sha1.dll"
+ File "anope-1.8.0\data\modules\enc_none.dll"
+ File "anope-1.8.0\data\modules\enc_old.dll"
+ File "anope-1.8.0\data\modules\he_help.dll"
+ File "anope-1.8.0\data\modules\hs_del.dll"
+ File "anope-1.8.0\data\modules\hs_delall.dll"
+ File "anope-1.8.0\data\modules\hs_group.dll"
+ File "anope-1.8.0\data\modules\hs_help.dll"
+ File "anope-1.8.0\data\modules\hs_list.dll"
+ File "anope-1.8.0\data\modules\hs_off.dll"
+ File "anope-1.8.0\data\modules\hs_on.dll"
+ File "anope-1.8.0\data\modules\hs_request.dll"
+ File "anope-1.8.0\data\modules\hs_set.dll"
+ File "anope-1.8.0\data\modules\hs_setall.dll"
+ File "anope-1.8.0\data\modules\hybrid.dll"
+ File "anope-1.8.0\data\modules\inspircd10.dll"
+ File "anope-1.8.0\data\modules\inspircd11.dll"
+ File "anope-1.8.0\data\modules\ms_cancel.dll"
+ File "anope-1.8.0\data\modules\ms_check.dll"
+ File "anope-1.8.0\data\modules\ms_del.dll"
+ File "anope-1.8.0\data\modules\ms_help.dll"
+ File "anope-1.8.0\data\modules\ms_info.dll"
+ File "anope-1.8.0\data\modules\ms_list.dll"
+ File "anope-1.8.0\data\modules\ms_read.dll"
+ File "anope-1.8.0\data\modules\ms_rsend.dll"
+ File "anope-1.8.0\data\modules\ms_send.dll"
+ File "anope-1.8.0\data\modules\ms_sendall.dll"
+ File "anope-1.8.0\data\modules\ms_set.dll"
+ File "anope-1.8.0\data\modules\ms_staff.dll"
+ File "anope-1.8.0\data\modules\ns_access.dll"
+ File "anope-1.8.0\data\modules\ns_alist.dll"
+ File "anope-1.8.0\data\modules\ns_drop.dll"
+ File "anope-1.8.0\data\modules\ns_forbid.dll"
+ File "anope-1.8.0\data\modules\ns_getemail.dll"
+ File "anope-1.8.0\data\modules\ns_getpass.dll"
+ File "anope-1.8.0\data\modules\ns_ghost.dll"
+ File "anope-1.8.0\data\modules\ns_group.dll"
+ File "anope-1.8.0\data\modules\ns_help.dll"
+ File "anope-1.8.0\data\modules\ns_identify.dll"
+ File "anope-1.8.0\data\modules\ns_info.dll"
+ File "anope-1.8.0\data\modules\ns_list.dll"
+ File "anope-1.8.0\data\modules\ns_logout.dll"
+ File "anope-1.8.0\data\modules\ns_maxemail.dll"
+ File "anope-1.8.0\data\modules\ns_recover.dll"
+ File "anope-1.8.0\data\modules\ns_register.dll"
+ File "anope-1.8.0\data\modules\ns_release.dll"
+ File "anope-1.8.0\data\modules\ns_saset.dll"
+ File "anope-1.8.0\data\modules\ns_sendpass.dll"
+ File "anope-1.8.0\data\modules\ns_set.dll"
+ File "anope-1.8.0\data\modules\ns_status.dll"
+ File "anope-1.8.0\data\modules\ns_suspend.dll"
+ File "anope-1.8.0\data\modules\ns_update.dll"
+ File "anope-1.8.0\data\modules\os_admin.dll"
+ File "anope-1.8.0\data\modules\os_akill.dll"
+ File "anope-1.8.0\data\modules\os_chankill.dll"
+ File "anope-1.8.0\data\modules\os_chanlist.dll"
+ File "anope-1.8.0\data\modules\os_clearmodes.dll"
+ File "anope-1.8.0\data\modules\os_defcon.dll"
+ File "anope-1.8.0\data\modules\os_global.dll"
+ File "anope-1.8.0\data\modules\os_help.dll"
+ File "anope-1.8.0\data\modules\os_ignore.dll"
+ File "anope-1.8.0\data\modules\os_info.dll"
+ File "anope-1.8.0\data\modules\os_jupe.dll"
+ File "anope-1.8.0\data\modules\os_kick.dll"
+ File "anope-1.8.0\data\modules\os_logonnews.dll"
+ File "anope-1.8.0\data\modules\os_mode.dll"
+ File "anope-1.8.0\data\modules\os_modinfo.dll"
+ File "anope-1.8.0\data\modules\os_modlist.dll"
+ File "anope-1.8.0\data\modules\os_modload.dll"
+ File "anope-1.8.0\data\modules\os_modunload.dll"
+ File "anope-1.8.0\data\modules\os_noop.dll"
+ File "anope-1.8.0\data\modules\os_oline.dll"
+ File "anope-1.8.0\data\modules\os_oper.dll"
+ File "anope-1.8.0\data\modules\os_opernews.dll"
+ File "anope-1.8.0\data\modules\os_quit.dll"
+ File "anope-1.8.0\data\modules\os_randomnews.dll"
+ File "anope-1.8.0\data\modules\os_raw.dll"
+ File "anope-1.8.0\data\modules\os_reload.dll"
+ File "anope-1.8.0\data\modules\os_restart.dll"
+ File "anope-1.8.0\data\modules\os_session.dll"
+ File "anope-1.8.0\data\modules\os_set.dll"
+ File "anope-1.8.0\data\modules\os_sgline.dll"
+ File "anope-1.8.0\data\modules\os_shutdown.dll"
+ File "anope-1.8.0\data\modules\os_sqline.dll"
+ File "anope-1.8.0\data\modules\os_staff.dll"
+ File "anope-1.8.0\data\modules\os_stats.dll"
+ File "anope-1.8.0\data\modules\os_svsnick.dll"
+ File "anope-1.8.0\data\modules\os_szline.dll"
+ File "anope-1.8.0\data\modules\os_umode.dll"
+ File "anope-1.8.0\data\modules\os_update.dll"
+ File "anope-1.8.0\data\modules\os_userlist.dll"
+ File "anope-1.8.0\data\modules\plexus2.dll"
+ File "anope-1.8.0\data\modules\plexus3.dll"
+ File "anope-1.8.0\data\modules\ptlink.dll"
+ File "anope-1.8.0\data\modules\rageircd.dll"
+ File "anope-1.8.0\data\modules\ratbox.dll"
+ File "anope-1.8.0\data\modules\shadowircd.dll"
+ File "anope-1.8.0\data\modules\solidircd.dll"
+ File "anope-1.8.0\data\modules\ultimate2.dll"
+ File "anope-1.8.0\data\modules\ultimate3.dll"
+ File "anope-1.8.0\data\modules\unreal31.dll"
+ File "anope-1.8.0\data\modules\unreal32.dll"
+ File "anope-1.8.0\data\modules\viagra.dll"
+ SetOutPath "$INSTDIR\data\modules\runtime"
+ SetOutPath "$INSTDIR\data"
+ File "anope-1.8.0\data\tables.sql"
+ SetOutPath "$INSTDIR\docs"
+ File "anope-1.8.0\docs\BUGS.txt"
+ File "anope-1.8.0\docs\COPYING.txt"
+ File "anope-1.8.0\docs\DEFCON.txt"
+ File "anope-1.8.0\docs\EVENTS.txt"
+ File "anope-1.8.0\docs\FAQ.txt"
+ File "anope-1.8.0\docs\INSTALL.txt"
+ File "anope-1.8.0\docs\IRCD.txt"
+ File "anope-1.8.0\docs\MODULES.txt"
+ File "anope-1.8.0\docs\MYSQL.txt"
+ File "anope-1.8.0\docs\NEWS.txt"
+ File "anope-1.8.0\docs\OLDCHANGES.txt"
+ File "anope-1.8.0\docs\PROXY.txt"
+ File "anope-1.8.0\docs\README.txt"
+ File "anope-1.8.0\docs\WIN32.txt"
+ File "anope-1.8.0\docs\OLDNEWS.txt"
+
+SectionEnd
+
+Section -AdditionalIcons
+ SetOutPath $INSTDIR
+ WriteIniStr "$INSTDIR\${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}"
+ CreateShortCut "$SMPROGRAMS\Anope\Website.lnk" "$INSTDIR\${PRODUCT_NAME}.url"
+ CreateShortCut "$SMPROGRAMS\Anope\Uninstall.lnk" "$INSTDIR\uninst.exe"
+SectionEnd
+
+Section -Post
+ WriteUninstaller "$INSTDIR\uninst.exe"
+ WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\anope.exe"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\anope.exe"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}"
+SectionEnd
+
+
+Function un.onUninstSuccess
+ HideWindow
+ MessageBox MB_ICONINFORMATION|MB_OK "$(^Name) was successfully removed from your computer."
+FunctionEnd
+
+Function un.onInit
+!insertmacro MUI_UNGETLANGUAGE
+ MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "Are you sure you want to completely remove $(^Name) and all of its components?" IDYES +2
+ Abort
+FunctionEnd
+
+Section Uninstall
+ Delete "$INSTDIR\${PRODUCT_NAME}.url"
+ Delete "$INSTDIR\uninst.exe"
+ Delete "$INSTDIR\docs\WIN32.txt"
+ Delete "$INSTDIR\docs\README.txt"
+ Delete "$INSTDIR\docs\PROXY.txt"
+ Delete "$INSTDIR\docs\OLDCHANGES.txt"
+ Delete "$INSTDIR\docs\OLDNEWS.txt"
+ Delete "$INSTDIR\docs\NEWS.txt"
+ Delete "$INSTDIR\docs\MYSQL.txt"
+ Delete "$INSTDIR\docs\MODULES.txt"
+ Delete "$INSTDIR\docs\IRCD.txt"
+ Delete "$INSTDIR\docs\INSTALL.txt"
+ Delete "$INSTDIR\docs\FAQ.txt"
+ Delete "$INSTDIR\docs\EVENTS.txt"
+ Delete "$INSTDIR\docs\DEFCON.txt"
+ Delete "$INSTDIR\docs\COPYING.txt"
+ Delete "$INSTDIR\docs\BUGS.txt"
+ Delete "$INSTDIR\data\tables.sql"
+ Delete "$INSTDIR\data\modules\viagra.dll"
+ Delete "$INSTDIR\data\modules\unreal32.dll"
+ Delete "$INSTDIR\data\modules\unreal31.dll"
+ Delete "$INSTDIR\data\modules\ultimate3.dll"
+ Delete "$INSTDIR\data\modules\ultimate2.dll"
+ Delete "$INSTDIR\data\modules\solidircd.dll"
+ Delete "$INSTDIR\data\modules\shadowircd.dll"
+ Delete "$INSTDIR\data\modules\ratbox.dll"
+ Delete "$INSTDIR\data\modules\rageircd.dll"
+ Delete "$INSTDIR\data\modules\ptlink.dll"
+ Delete "$INSTDIR\data\modules\plexus3.dll"
+ Delete "$INSTDIR\data\modules\plexus2.dll"
+ Delete "$INSTDIR\data\modules\os_userlist.dll"
+ Delete "$INSTDIR\data\modules\os_update.dll"
+ Delete "$INSTDIR\data\modules\os_umode.dll"
+ Delete "$INSTDIR\data\modules\os_szline.dll"
+ Delete "$INSTDIR\data\modules\os_svsnick.dll"
+ Delete "$INSTDIR\data\modules\os_stats.dll"
+ Delete "$INSTDIR\data\modules\os_staff.dll"
+ Delete "$INSTDIR\data\modules\os_sqline.dll"
+ Delete "$INSTDIR\data\modules\os_shutdown.dll"
+ Delete "$INSTDIR\data\modules\os_sgline.dll"
+ Delete "$INSTDIR\data\modules\os_set.dll"
+ Delete "$INSTDIR\data\modules\os_session.dll"
+ Delete "$INSTDIR\data\modules\os_restart.dll"
+ Delete "$INSTDIR\data\modules\os_reload.dll"
+ Delete "$INSTDIR\data\modules\os_raw.dll"
+ Delete "$INSTDIR\data\modules\os_randomnews.dll"
+ Delete "$INSTDIR\data\modules\os_quit.dll"
+ Delete "$INSTDIR\data\modules\os_opernews.dll"
+ Delete "$INSTDIR\data\modules\os_oper.dll"
+ Delete "$INSTDIR\data\modules\os_oline.dll"
+ Delete "$INSTDIR\data\modules\os_noop.dll"
+ Delete "$INSTDIR\data\modules\os_modunload.dll"
+ Delete "$INSTDIR\data\modules\os_modload.dll"
+ Delete "$INSTDIR\data\modules\os_modlist.dll"
+ Delete "$INSTDIR\data\modules\os_modinfo.dll"
+ Delete "$INSTDIR\data\modules\os_mode.dll"
+ Delete "$INSTDIR\data\modules\os_logonnews.dll"
+ Delete "$INSTDIR\data\modules\os_kick.dll"
+ Delete "$INSTDIR\data\modules\os_jupe.dll"
+ Delete "$INSTDIR\data\modules\os_info.dll"
+ Delete "$INSTDIR\data\modules\os_ignore.dll"
+ Delete "$INSTDIR\data\modules\os_help.dll"
+ Delete "$INSTDIR\data\modules\os_global.dll"
+ Delete "$INSTDIR\data\modules\os_defcon.dll"
+ Delete "$INSTDIR\data\modules\os_clearmodes.dll"
+ Delete "$INSTDIR\data\modules\os_chanlist.dll"
+ Delete "$INSTDIR\data\modules\os_chankill.dll"
+ Delete "$INSTDIR\data\modules\os_akill.dll"
+ Delete "$INSTDIR\data\modules\os_admin.dll"
+ Delete "$INSTDIR\data\modules\ns_update.dll"
+ Delete "$INSTDIR\data\modules\ns_suspend.dll"
+ Delete "$INSTDIR\data\modules\ns_status.dll"
+ Delete "$INSTDIR\data\modules\ns_set.dll"
+ Delete "$INSTDIR\data\modules\ns_sendpass.dll"
+ Delete "$INSTDIR\data\modules\ns_saset.dll"
+ Delete "$INSTDIR\data\modules\ns_release.dll"
+ Delete "$INSTDIR\data\modules\ns_register.dll"
+ Delete "$INSTDIR\data\modules\ns_recover.dll"
+ Delete "$INSTDIR\data\modules\ns_maxemail.dll"
+ Delete "$INSTDIR\data\modules\ns_logout.dll"
+ Delete "$INSTDIR\data\modules\ns_list.dll"
+ Delete "$INSTDIR\data\modules\ns_info.dll"
+ Delete "$INSTDIR\data\modules\ns_identify.dll"
+ Delete "$INSTDIR\data\modules\ns_help.dll"
+ Delete "$INSTDIR\data\modules\ns_group.dll"
+ Delete "$INSTDIR\data\modules\ns_ghost.dll"
+ Delete "$INSTDIR\data\modules\ns_getpass.dll"
+ Delete "$INSTDIR\data\modules\ns_getemail.dll"
+ Delete "$INSTDIR\data\modules\ns_forbid.dll"
+ Delete "$INSTDIR\data\modules\ns_drop.dll"
+ Delete "$INSTDIR\data\modules\ns_alist.dll"
+ Delete "$INSTDIR\data\modules\ns_access.dll"
+ Delete "$INSTDIR\data\modules\ms_staff.dll"
+ Delete "$INSTDIR\data\modules\ms_set.dll"
+ Delete "$INSTDIR\data\modules\ms_sendall.dll"
+ Delete "$INSTDIR\data\modules\ms_send.dll"
+ Delete "$INSTDIR\data\modules\ms_rsend.dll"
+ Delete "$INSTDIR\data\modules\ms_read.dll"
+ Delete "$INSTDIR\data\modules\ms_list.dll"
+ Delete "$INSTDIR\data\modules\ms_info.dll"
+ Delete "$INSTDIR\data\modules\ms_help.dll"
+ Delete "$INSTDIR\data\modules\ms_del.dll"
+ Delete "$INSTDIR\data\modules\ms_check.dll"
+ Delete "$INSTDIR\data\modules\ms_cancel.dll"
+ Delete "$INSTDIR\data\modules\inspircd11.dll"
+ Delete "$INSTDIR\data\modules\inspircd10.dll"
+ Delete "$INSTDIR\data\modules\hybrid.dll"
+ Delete "$INSTDIR\data\modules\hs_setall.dll"
+ Delete "$INSTDIR\data\modules\hs_set.dll"
+ Delete "$INSTDIR\data\modules\hs_request.dll"
+ Delete "$INSTDIR\data\modules\hs_on.dll"
+ Delete "$INSTDIR\data\modules\hs_off.dll"
+ Delete "$INSTDIR\data\modules\hs_list.dll"
+ Delete "$INSTDIR\data\modules\hs_help.dll"
+ Delete "$INSTDIR\data\modules\hs_group.dll"
+ Delete "$INSTDIR\data\modules\hs_delall.dll"
+ Delete "$INSTDIR\data\modules\hs_del.dll"
+ Delete "$INSTDIR\data\modules\he_help.dll"
+ Delete "$INSTDIR\data\modules\enc_old.dll"
+ Delete "$INSTDIR\data\modules\enc_none.dll"
+ Delete "$INSTDIR\data\modules\enc_md5.dll"
+ Delete "$INSTDIR\data\modules\enc_sha1.dll"
+ Delete "$INSTDIR\data\modules\dreamforge.dll"
+ Delete "$INSTDIR\data\modules\cs_xop.dll"
+ Delete "$INSTDIR\data\modules\cs_topic.dll"
+ Delete "$INSTDIR\data\modules\cs_tban.dll"
+ Delete "$INSTDIR\data\modules\cs_suspend.dll"
+ Delete "$INSTDIR\data\modules\cs_status.dll"
+ Delete "$INSTDIR\data\modules\cs_set.dll"
+ Delete "$INSTDIR\data\modules\cs_sendpass.dll"
+ Delete "$INSTDIR\data\modules\cs_register.dll"
+ Delete "$INSTDIR\data\modules\cs_modes.dll"
+ Delete "$INSTDIR\data\modules\cs_logout.dll"
+ Delete "$INSTDIR\data\modules\cs_list.dll"
+ Delete "$INSTDIR\data\modules\cs_kick.dll"
+ Delete "$INSTDIR\data\modules\cs_invite.dll"
+ Delete "$INSTDIR\data\modules\cs_info.dll"
+ Delete "$INSTDIR\data\modules\cs_identify.dll"
+ Delete "$INSTDIR\data\modules\cs_help.dll"
+ Delete "$INSTDIR\data\modules\cs_getpass.dll"
+ Delete "$INSTDIR\data\modules\cs_getkey.dll"
+ Delete "$INSTDIR\data\modules\cs_forbid.dll"
+ Delete "$INSTDIR\data\modules\cs_enforce.dll"
+ Delete "$INSTDIR\data\modules\cs_drop.dll"
+ Delete "$INSTDIR\data\modules\cs_clear.dll"
+ Delete "$INSTDIR\data\modules\cs_ban.dll"
+ Delete "$INSTDIR\data\modules\cs_appendtopic.dll"
+ Delete "$INSTDIR\data\modules\cs_akick.dll"
+ Delete "$INSTDIR\data\modules\cs_access.dll"
+ Delete "$INSTDIR\data\modules\charybdis.dll"
+ Delete "$INSTDIR\data\modules\bs_unassign.dll"
+ Delete "$INSTDIR\data\modules\bs_set.dll"
+ Delete "$INSTDIR\data\modules\bs_say.dll"
+ Delete "$INSTDIR\data\modules\bs_kick.dll"
+ Delete "$INSTDIR\data\modules\bs_info.dll"
+ Delete "$INSTDIR\data\modules\bs_help.dll"
+ Delete "$INSTDIR\data\modules\bs_fantasy_unban.dll"
+ Delete "$INSTDIR\data\modules\bs_fantasy_seen.dll"
+ Delete "$INSTDIR\data\modules\bs_fantasy_owner.dll"
+ Delete "$INSTDIR\data\modules\bs_fantasy_kickban.dll"
+ Delete "$INSTDIR\data\modules\bs_fantasy_kick.dll"
+ Delete "$INSTDIR\data\modules\bs_fantasy.dll"
+ Delete "$INSTDIR\data\modules\bs_botlist.dll"
+ Delete "$INSTDIR\data\modules\bs_bot.dll"
+ Delete "$INSTDIR\data\modules\bs_badwords.dll"
+ Delete "$INSTDIR\data\modules\bs_assign.dll"
+ Delete "$INSTDIR\data\modules\bs_act.dll"
+ Delete "$INSTDIR\data\modules\bahamut.dll"
+ Delete "$INSTDIR\data\languages\tr"
+ Delete "$INSTDIR\data\languages\ru"
+ Delete "$INSTDIR\data\languages\pt"
+ Delete "$INSTDIR\data\languages\pl"
+ Delete "$INSTDIR\data\languages\nl"
+ Delete "$INSTDIR\data\languages\it"
+ Delete "$INSTDIR\data\languages\hun"
+ Delete "$INSTDIR\data\languages\gr"
+ Delete "$INSTDIR\data\languages\fr"
+ Delete "$INSTDIR\data\languages\es"
+ Delete "$INSTDIR\data\languages\en_us"
+ Delete "$INSTDIR\data\languages\de"
+ Delete "$INSTDIR\data\languages\cat"
+ Delete "$INSTDIR\data\example.conf"
+ Delete "$INSTDIR\data\epona2anope.exe.manifest"
+ Delete "$INSTDIR\data\epona2anope.exe"
+ Delete "$INSTDIR\data\db-merger.exe.manifest"
+ Delete "$INSTDIR\data\db-merger.exe"
+ Delete "$INSTDIR\data\bin\register"
+ Delete "$INSTDIR\data\bin\mydbgen"
+ Delete "$INSTDIR\data\bin\langtool"
+ Delete "$INSTDIR\data\bin\cp-recursive"
+ Delete "$INSTDIR\data\bin\anoperc.in"
+ Delete "$INSTDIR\data\bin\am"
+ Delete "$INSTDIR\data\anopesmtp.exe.manifest"
+ Delete "$INSTDIR\data\anopesmtp.exe"
+ Delete "$INSTDIR\Changes.txt"
+ Delete "$INSTDIR\Changes.mysql.txt"
+ Delete "$INSTDIR\Changes.lang.txt"
+ Delete "$INSTDIR\Changes.conf.txt"
+ Delete "$INSTDIR\anope.exe.manifest"
+ Delete "$INSTDIR\anope.exe"
+Delete "$INSTDIR\anope.bat"
+ SetShellVarContext all
+ Delete "$SMPROGRAMS\Anope\Uninstall.lnk"
+ Delete "$SMPROGRAMS\Anope\Website.lnk"
+ Delete "$DESKTOP\Anope IRC Services.lnk"
+ Delete "$SMPROGRAMS\Anope\Anope IRC Services.lnk"
+ Delete "$SMPROGRAMS\Anope\Advanced\Anope IRC Services (Debug and Window Logging).lnk"
+ Delete "$SMPROGRAMS\Anope\Advanced\Anope IRC Services (Window Logging).lnk"
+ Delete "$SMPROGRAMS\Anope\Advanced\Anope IRC Services (No Third Party Modules).lnk"
+
+RMDir "$SMPROGRAMS\Anope\Advanced"
+ RMDir "$SMPROGRAMS\Anope"
+ RMDir "$INSTDIR\docs"
+ RMDir "$INSTDIR\data\modules"
+RMDir "$INSTDIR\data\backups"
+ RMDir "$INSTDIR\data\logs"
+ RMDir "$INSTDIR\data\languages"
+ RMDir "$INSTDIR\data\bin"
+ RMDir "$INSTDIR\data"
+ RMDir "$INSTDIR"
+
+ DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
+ DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}"
+ SetAutoClose true
+SectionEnd \ No newline at end of file
diff --git a/src/tools/Anope_MySQL_Install_Script.nsi b/src/tools/Anope_MySQL_Install_Script.nsi
new file mode 100644
index 000000000..ead85e449
--- /dev/null
+++ b/src/tools/Anope_MySQL_Install_Script.nsi
@@ -0,0 +1,542 @@
+; Script generated by the HM NIS Edit Script Wizard.
+
+; HM NIS Edit Wizard helper defines
+!define PRODUCT_NAME "Anope IRC Services"
+!define PRODUCT_VERSION "1.8.0-MySQL"
+!define PRODUCT_PUBLISHER "Anope"
+!define PRODUCT_WEB_SITE "http://www.anope.org"
+!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\anope.exe"
+!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
+!define PRODUCT_UNINST_ROOT_KEY "HKLM"
+
+; MUI 1.67 compatible ------
+!include "MUI.nsh"
+
+; MUI Settings
+!define MUI_ABORTWARNING
+!define MUI_ICON "anope-icon.ico"
+!define MUI_UNICON "anope-icon.ico"
+
+; Language Selection Dialog Settings
+!define MUI_LANGDLL_REGISTRY_ROOT "${PRODUCT_UNINST_ROOT_KEY}"
+!define MUI_LANGDLL_REGISTRY_KEY "${PRODUCT_UNINST_KEY}"
+!define MUI_LANGDLL_REGISTRY_VALUENAME "NSIS:Language"
+
+; Welcome page
+!insertmacro MUI_PAGE_WELCOME
+; License page
+!define MUI_LICENSEPAGE_RADIOBUTTONS
+!insertmacro MUI_PAGE_LICENSE "anope-1.8.0-MySQL\docs\COPYING.txt"
+; Directory page
+!insertmacro MUI_PAGE_DIRECTORY
+; Instfiles page
+!insertmacro MUI_PAGE_INSTFILES
+; Finish page
+!define MUI_FINISHPAGE_SHOWREADME "$INSTDIR\docs\README.txt"
+!insertmacro MUI_PAGE_FINISH
+
+; Uninstaller pages
+!insertmacro MUI_UNPAGE_INSTFILES
+
+; Language files
+!insertmacro MUI_LANGUAGE "Dutch"
+!insertmacro MUI_LANGUAGE "English"
+!insertmacro MUI_LANGUAGE "French"
+!insertmacro MUI_LANGUAGE "German"
+!insertmacro MUI_LANGUAGE "Italian"
+!insertmacro MUI_LANGUAGE "Portuguese"
+!insertmacro MUI_LANGUAGE "Spanish"
+
+; MUI end ------
+
+Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
+OutFile "Anope-1.8.0-MySQL.exe"
+InstallDir "$PROGRAMFILES\Anope"
+InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" ""
+ShowInstDetails show
+ShowUnInstDetails show
+
+Function .onInit
+ !insertmacro MUI_LANGDLL_DISPLAY
+FunctionEnd
+
+Section "MainSection" SEC01
+ SetOutPath "$INSTDIR"
+ File "anope-1.8.0-MySQL\anope.exe"
+File "anope-1.8.0\anope.bat"
+ SetShellVarContext all
+ CreateDirectory "$SMPROGRAMS\Anope"
+ CreateShortCut "$SMPROGRAMS\Anope\Anope IRC Services.lnk" "$INSTDIR\anope.exe"
+ CreateShortCut "$DESKTOP\Anope IRC Services.lnk" "$INSTDIR\anope.exe"
+ CreateDirectory "$SMPROGRAMS\Anope\Advanced"
+ CreateShortCut "$SMPROGRAMS\Anope\Advanced\Anope IRC Services (Debug and Window Logging).lnk" "$INSTDIR\anope.bat" "-debug -nofork"
+ CreateShortCut "$SMPROGRAMS\Anope\Advanced\Anope IRC Services (Window Logging).lnk" "$INSTDIR\anope.bat" "-nofork"
+ CreateShortCut "$SMPROGRAMS\Anope\Advanced\Anope IRC Services (No Third Party Modules).lnk" "$INSTDIR\anope.bat" "-nothird"
+
+ File "anope-1.8.0-MySQL\anope.exe.manifest"
+ File "anope-1.8.0-MySQL\Changes.conf.txt"
+ File "anope-1.8.0-MySQL\Changes.lang.txt"
+ File "anope-1.8.0-MySQL\Changes.mysql.txt"
+ File "anope-1.8.0-MySQL\Changes.txt"
+ SetOutPath "$INSTDIR\data"
+ File "anope-1.8.0-MySQL\data\anopesmtp.exe"
+ File "anope-1.8.0-MySQL\data\anopesmtp.exe.manifest"
+ SetOutPath "$INSTDIR\data\bin"
+ File "anope-1.8.0-MySQL\data\bin\am"
+ File "anope-1.8.0-MySQL\data\bin\anoperc.in"
+ File "anope-1.8.0-MySQL\data\bin\cp-recursive"
+ File "anope-1.8.0-MySQL\data\bin\langtool"
+ File "anope-1.8.0-MySQL\data\bin\mydbgen"
+ File "anope-1.8.0-MySQL\data\bin\register"
+ SetOutPath "$INSTDIR\data"
+ File "anope-1.8.0-MySQL\data\db-merger.exe"
+ File "anope-1.8.0-MySQL\data\db-merger.exe.manifest"
+ File "anope-1.8.0-MySQL\data\epona2anope.exe"
+ File "anope-1.8.0-MySQL\data\epona2anope.exe.manifest"
+ File "anope-1.8.0-MySQL\data\example.conf"
+ SetOutPath "$INSTDIR\data\languages"
+ File "anope-1.8.0-MySQL\data\languages\cat"
+ File "anope-1.8.0-MySQL\data\languages\de"
+ File "anope-1.8.0-MySQL\data\languages\en_us"
+ File "anope-1.8.0-MySQL\data\languages\es"
+ File "anope-1.8.0-MySQL\data\languages\fr"
+ File "anope-1.8.0-MySQL\data\languages\gr"
+ File "anope-1.8.0-MySQL\data\languages\hun"
+ File "anope-1.8.0-MySQL\data\languages\it"
+ File "anope-1.8.0-MySQL\data\languages\nl"
+ File "anope-1.8.0-MySQL\data\languages\pl"
+ File "anope-1.8.0-MySQL\data\languages\pt"
+ File "anope-1.8.0-MySQL\data\languages\ru"
+ File "anope-1.8.0-MySQL\data\languages\tr"
+ SetOutPath "$INSTDIR\data\logs"
+SetOutPath "$INSTDIR\data\backups"
+ SetOutPath "$INSTDIR\data\modules"
+ File "anope-1.8.0-MySQL\data\modules\bahamut.dll"
+ File "anope-1.8.0-MySQL\data\modules\bs_act.dll"
+ File "anope-1.8.0-MySQL\data\modules\bs_assign.dll"
+ File "anope-1.8.0-MySQL\data\modules\bs_badwords.dll"
+ File "anope-1.8.0-MySQL\data\modules\bs_bot.dll"
+ File "anope-1.8.0-MySQL\data\modules\bs_botlist.dll"
+ File "anope-1.8.0-MySQL\data\modules\bs_fantasy.dll"
+ File "anope-1.8.0-MySQL\data\modules\bs_fantasy_kick.dll"
+ File "anope-1.8.0-MySQL\data\modules\bs_fantasy_kickban.dll"
+ File "anope-1.8.0-MySQL\data\modules\bs_fantasy_owner.dll"
+ File "anope-1.8.0-MySQL\data\modules\bs_fantasy_seen.dll"
+ File "anope-1.8.0-MySQL\data\modules\bs_fantasy_unban.dll"
+ File "anope-1.8.0-MySQL\data\modules\bs_help.dll"
+ File "anope-1.8.0-MySQL\data\modules\bs_info.dll"
+ File "anope-1.8.0-MySQL\data\modules\bs_kick.dll"
+ File "anope-1.8.0-MySQL\data\modules\bs_say.dll"
+ File "anope-1.8.0-MySQL\data\modules\bs_set.dll"
+ File "anope-1.8.0-MySQL\data\modules\bs_unassign.dll"
+ File "anope-1.8.0-MySQL\data\modules\charybdis.dll"
+ File "anope-1.8.0-MySQL\data\modules\cs_access.dll"
+ File "anope-1.8.0-MySQL\data\modules\cs_akick.dll"
+ File "anope-1.8.0-MySQL\data\modules\cs_appendtopic.dll"
+ File "anope-1.8.0-MySQL\data\modules\cs_ban.dll"
+ File "anope-1.8.0-MySQL\data\modules\cs_clear.dll"
+ File "anope-1.8.0-MySQL\data\modules\cs_drop.dll"
+ File "anope-1.8.0-MySQL\data\modules\cs_enforce.dll"
+ File "anope-1.8.0-MySQL\data\modules\cs_forbid.dll"
+ File "anope-1.8.0-MySQL\data\modules\cs_getkey.dll"
+ File "anope-1.8.0-MySQL\data\modules\cs_getpass.dll"
+ File "anope-1.8.0-MySQL\data\modules\cs_help.dll"
+ File "anope-1.8.0-MySQL\data\modules\cs_identify.dll"
+ File "anope-1.8.0-MySQL\data\modules\cs_info.dll"
+ File "anope-1.8.0-MySQL\data\modules\cs_invite.dll"
+ File "anope-1.8.0-MySQL\data\modules\cs_kick.dll"
+ File "anope-1.8.0-MySQL\data\modules\cs_list.dll"
+ File "anope-1.8.0-MySQL\data\modules\cs_logout.dll"
+ File "anope-1.8.0-MySQL\data\modules\cs_modes.dll"
+ File "anope-1.8.0-MySQL\data\modules\cs_register.dll"
+ File "anope-1.8.0-MySQL\data\modules\cs_sendpass.dll"
+ File "anope-1.8.0-MySQL\data\modules\cs_set.dll"
+ File "anope-1.8.0-MySQL\data\modules\cs_status.dll"
+ File "anope-1.8.0-MySQL\data\modules\cs_suspend.dll"
+ File "anope-1.8.0-MySQL\data\modules\cs_tban.dll"
+ File "anope-1.8.0-MySQL\data\modules\cs_topic.dll"
+ File "anope-1.8.0-MySQL\data\modules\cs_xop.dll"
+ File "anope-1.8.0-MySQL\data\modules\dreamforge.dll"
+ File "anope-1.8.0-MySQL\data\modules\enc_md5.dll"
+ File "anope-1.8.0-MySQL\data\modules\enc_sha1.dll"
+ File "anope-1.8.0-MySQL\data\modules\enc_none.dll"
+ File "anope-1.8.0-MySQL\data\modules\enc_old.dll"
+ File "anope-1.8.0-MySQL\data\modules\he_help.dll"
+ File "anope-1.8.0-MySQL\data\modules\hs_del.dll"
+ File "anope-1.8.0-MySQL\data\modules\hs_delall.dll"
+ File "anope-1.8.0-MySQL\data\modules\hs_group.dll"
+ File "anope-1.8.0-MySQL\data\modules\hs_help.dll"
+ File "anope-1.8.0-MySQL\data\modules\hs_list.dll"
+ File "anope-1.8.0-MySQL\data\modules\hs_off.dll"
+ File "anope-1.8.0-MySQL\data\modules\hs_on.dll"
+ File "anope-1.8.0-MySQL\data\modules\hs_request.dll"
+ File "anope-1.8.0-MySQL\data\modules\hs_set.dll"
+ File "anope-1.8.0-MySQL\data\modules\hs_setall.dll"
+ File "anope-1.8.0-MySQL\data\modules\hybrid.dll"
+ File "anope-1.8.0-MySQL\data\modules\inspircd10.dll"
+ File "anope-1.8.0-MySQL\data\modules\inspircd11.dll"
+ File "anope-1.8.0-MySQL\data\modules\ms_cancel.dll"
+ File "anope-1.8.0-MySQL\data\modules\ms_check.dll"
+ File "anope-1.8.0-MySQL\data\modules\ms_del.dll"
+ File "anope-1.8.0-MySQL\data\modules\ms_help.dll"
+ File "anope-1.8.0-MySQL\data\modules\ms_info.dll"
+ File "anope-1.8.0-MySQL\data\modules\ms_list.dll"
+ File "anope-1.8.0-MySQL\data\modules\ms_read.dll"
+ File "anope-1.8.0-MySQL\data\modules\ms_rsend.dll"
+ File "anope-1.8.0-MySQL\data\modules\ms_send.dll"
+ File "anope-1.8.0-MySQL\data\modules\ms_sendall.dll"
+ File "anope-1.8.0-MySQL\data\modules\ms_set.dll"
+ File "anope-1.8.0-MySQL\data\modules\ms_staff.dll"
+ File "anope-1.8.0-MySQL\data\modules\ns_access.dll"
+ File "anope-1.8.0-MySQL\data\modules\ns_alist.dll"
+ File "anope-1.8.0-MySQL\data\modules\ns_drop.dll"
+ File "anope-1.8.0-MySQL\data\modules\ns_forbid.dll"
+ File "anope-1.8.0-MySQL\data\modules\ns_getemail.dll"
+ File "anope-1.8.0-MySQL\data\modules\ns_getpass.dll"
+ File "anope-1.8.0-MySQL\data\modules\ns_ghost.dll"
+ File "anope-1.8.0-MySQL\data\modules\ns_group.dll"
+ File "anope-1.8.0-MySQL\data\modules\ns_help.dll"
+ File "anope-1.8.0-MySQL\data\modules\ns_identify.dll"
+ File "anope-1.8.0-MySQL\data\modules\ns_info.dll"
+ File "anope-1.8.0-MySQL\data\modules\ns_list.dll"
+ File "anope-1.8.0-MySQL\data\modules\ns_logout.dll"
+ File "anope-1.8.0-MySQL\data\modules\ns_maxemail.dll"
+ File "anope-1.8.0-MySQL\data\modules\ns_recover.dll"
+ File "anope-1.8.0-MySQL\data\modules\ns_register.dll"
+ File "anope-1.8.0-MySQL\data\modules\ns_release.dll"
+ File "anope-1.8.0-MySQL\data\modules\ns_saset.dll"
+ File "anope-1.8.0-MySQL\data\modules\ns_sendpass.dll"
+ File "anope-1.8.0-MySQL\data\modules\ns_set.dll"
+ File "anope-1.8.0-MySQL\data\modules\ns_status.dll"
+ File "anope-1.8.0-MySQL\data\modules\ns_suspend.dll"
+ File "anope-1.8.0-MySQL\data\modules\ns_update.dll"
+ File "anope-1.8.0-MySQL\data\modules\os_admin.dll"
+ File "anope-1.8.0-MySQL\data\modules\os_akill.dll"
+ File "anope-1.8.0-MySQL\data\modules\os_chankill.dll"
+ File "anope-1.8.0-MySQL\data\modules\os_chanlist.dll"
+ File "anope-1.8.0-MySQL\data\modules\os_clearmodes.dll"
+ File "anope-1.8.0-MySQL\data\modules\os_defcon.dll"
+ File "anope-1.8.0-MySQL\data\modules\os_global.dll"
+ File "anope-1.8.0-MySQL\data\modules\os_help.dll"
+ File "anope-1.8.0-MySQL\data\modules\os_ignore.dll"
+ File "anope-1.8.0-MySQL\data\modules\os_info.dll"
+ File "anope-1.8.0-MySQL\data\modules\os_jupe.dll"
+ File "anope-1.8.0-MySQL\data\modules\os_kick.dll"
+ File "anope-1.8.0-MySQL\data\modules\os_logonnews.dll"
+ File "anope-1.8.0-MySQL\data\modules\os_mode.dll"
+ File "anope-1.8.0-MySQL\data\modules\os_modinfo.dll"
+ File "anope-1.8.0-MySQL\data\modules\os_modlist.dll"
+ File "anope-1.8.0-MySQL\data\modules\os_modload.dll"
+ File "anope-1.8.0-MySQL\data\modules\os_modunload.dll"
+ File "anope-1.8.0-MySQL\data\modules\os_noop.dll"
+ File "anope-1.8.0-MySQL\data\modules\os_oline.dll"
+ File "anope-1.8.0-MySQL\data\modules\os_oper.dll"
+ File "anope-1.8.0-MySQL\data\modules\os_opernews.dll"
+ File "anope-1.8.0-MySQL\data\modules\os_quit.dll"
+ File "anope-1.8.0-MySQL\data\modules\os_randomnews.dll"
+ File "anope-1.8.0-MySQL\data\modules\os_raw.dll"
+ File "anope-1.8.0-MySQL\data\modules\os_reload.dll"
+ File "anope-1.8.0-MySQL\data\modules\os_restart.dll"
+ File "anope-1.8.0-MySQL\data\modules\os_session.dll"
+ File "anope-1.8.0-MySQL\data\modules\os_set.dll"
+ File "anope-1.8.0-MySQL\data\modules\os_sgline.dll"
+ File "anope-1.8.0-MySQL\data\modules\os_shutdown.dll"
+ File "anope-1.8.0-MySQL\data\modules\os_sqline.dll"
+ File "anope-1.8.0-MySQL\data\modules\os_staff.dll"
+ File "anope-1.8.0-MySQL\data\modules\os_stats.dll"
+ File "anope-1.8.0-MySQL\data\modules\os_svsnick.dll"
+ File "anope-1.8.0-MySQL\data\modules\os_szline.dll"
+ File "anope-1.8.0-MySQL\data\modules\os_umode.dll"
+ File "anope-1.8.0-MySQL\data\modules\os_update.dll"
+ File "anope-1.8.0-MySQL\data\modules\os_userlist.dll"
+ File "anope-1.8.0-MySQL\data\modules\plexus2.dll"
+ File "anope-1.8.0-MySQL\data\modules\plexus3.dll"
+ File "anope-1.8.0-MySQL\data\modules\ptlink.dll"
+ File "anope-1.8.0-MySQL\data\modules\rageircd.dll"
+ File "anope-1.8.0-MySQL\data\modules\ratbox.dll"
+ File "anope-1.8.0-MySQL\data\modules\shadowircd.dll"
+ File "anope-1.8.0-MySQL\data\modules\solidircd.dll"
+ File "anope-1.8.0-MySQL\data\modules\ultimate2.dll"
+ File "anope-1.8.0-MySQL\data\modules\ultimate3.dll"
+ File "anope-1.8.0-MySQL\data\modules\unreal31.dll"
+ File "anope-1.8.0-MySQL\data\modules\unreal32.dll"
+ File "anope-1.8.0-MySQL\data\modules\viagra.dll"
+ SetOutPath "$INSTDIR\data\modules\runtime"
+ SetOutPath "$INSTDIR\data"
+ File "anope-1.8.0-MySQL\data\tables.sql"
+ SetOutPath "$INSTDIR\docs"
+ File "anope-1.8.0-MySQL\docs\BUGS.txt"
+ File "anope-1.8.0-MySQL\docs\COPYING.txt"
+ File "anope-1.8.0-MySQL\docs\DEFCON.txt"
+ File "anope-1.8.0-MySQL\docs\EVENTS.txt"
+ File "anope-1.8.0-MySQL\docs\FAQ.txt"
+ File "anope-1.8.0-MySQL\docs\INSTALL.txt"
+ File "anope-1.8.0-MySQL\docs\IRCD.txt"
+ File "anope-1.8.0-MySQL\docs\MODULES.txt"
+ File "anope-1.8.0-MySQL\docs\MYSQL.txt"
+ File "anope-1.8.0-MySQL\docs\NEWS.txt"
+ File "anope-1.8.0-MySQL\docs\OLDNEWS.txt"
+ File "anope-1.8.0-MySQL\docs\OLDCHANGES.txt"
+ File "anope-1.8.0-MySQL\docs\PROXY.txt"
+ File "anope-1.8.0-MySQL\docs\README.txt"
+ File "anope-1.8.0-MySQL\docs\WIN32.txt"
+SectionEnd
+
+Section -AdditionalIcons
+ SetOutPath $INSTDIR
+ WriteIniStr "$INSTDIR\${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}"
+ CreateShortCut "$SMPROGRAMS\Anope\Website.lnk" "$INSTDIR\${PRODUCT_NAME}.url"
+ CreateShortCut "$SMPROGRAMS\Anope\Uninstall.lnk" "$INSTDIR\uninst.exe"
+SectionEnd
+
+Section -Post
+ WriteUninstaller "$INSTDIR\uninst.exe"
+ WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\anope.exe"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\anope.exe"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}"
+SectionEnd
+
+
+Function un.onUninstSuccess
+ HideWindow
+ MessageBox MB_ICONINFORMATION|MB_OK "$(^Name) was successfully removed from your computer."
+FunctionEnd
+
+Function un.onInit
+!insertmacro MUI_UNGETLANGUAGE
+ MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "Are you sure you want to completely remove $(^Name) and all of its components?" IDYES +2
+ Abort
+FunctionEnd
+
+Section Uninstall
+ Delete "$INSTDIR\${PRODUCT_NAME}.url"
+ Delete "$INSTDIR\uninst.exe"
+ Delete "$INSTDIR\docs\WIN32.txt"
+ Delete "$INSTDIR\docs\README.txt"
+ Delete "$INSTDIR\docs\PROXY.txt"
+ Delete "$INSTDIR\docs\OLDCHANGES.txt"
+ Delete "$INSTDIR\docs\OLDNEWS.txt"
+ Delete "$INSTDIR\docs\NEWS.txt"
+ Delete "$INSTDIR\docs\MYSQL.txt"
+ Delete "$INSTDIR\docs\MODULES.txt"
+ Delete "$INSTDIR\docs\IRCD.txt"
+ Delete "$INSTDIR\docs\INSTALL.txt"
+ Delete "$INSTDIR\docs\FAQ.txt"
+ Delete "$INSTDIR\docs\EVENTS.txt"
+ Delete "$INSTDIR\docs\DEFCON.txt"
+ Delete "$INSTDIR\docs\COPYING.txt"
+ Delete "$INSTDIR\docs\BUGS.txt"
+ Delete "$INSTDIR\data\tables.sql"
+ Delete "$INSTDIR\data\modules\viagra.dll"
+ Delete "$INSTDIR\data\modules\unreal32.dll"
+ Delete "$INSTDIR\data\modules\unreal31.dll"
+ Delete "$INSTDIR\data\modules\ultimate3.dll"
+ Delete "$INSTDIR\data\modules\ultimate2.dll"
+ Delete "$INSTDIR\data\modules\solidircd.dll"
+ Delete "$INSTDIR\data\modules\shadowircd.dll"
+ Delete "$INSTDIR\data\modules\ratbox.dll"
+ Delete "$INSTDIR\data\modules\rageircd.dll"
+ Delete "$INSTDIR\data\modules\ptlink.dll"
+ Delete "$INSTDIR\data\modules\plexus3.dll"
+ Delete "$INSTDIR\data\modules\plexus2.dll"
+ Delete "$INSTDIR\data\modules\os_userlist.dll"
+ Delete "$INSTDIR\data\modules\os_update.dll"
+ Delete "$INSTDIR\data\modules\os_umode.dll"
+ Delete "$INSTDIR\data\modules\os_szline.dll"
+ Delete "$INSTDIR\data\modules\os_svsnick.dll"
+ Delete "$INSTDIR\data\modules\os_stats.dll"
+ Delete "$INSTDIR\data\modules\os_staff.dll"
+ Delete "$INSTDIR\data\modules\os_sqline.dll"
+ Delete "$INSTDIR\data\modules\os_shutdown.dll"
+ Delete "$INSTDIR\data\modules\os_sgline.dll"
+ Delete "$INSTDIR\data\modules\os_set.dll"
+ Delete "$INSTDIR\data\modules\os_session.dll"
+ Delete "$INSTDIR\data\modules\os_restart.dll"
+ Delete "$INSTDIR\data\modules\os_reload.dll"
+ Delete "$INSTDIR\data\modules\os_raw.dll"
+ Delete "$INSTDIR\data\modules\os_randomnews.dll"
+ Delete "$INSTDIR\data\modules\os_quit.dll"
+ Delete "$INSTDIR\data\modules\os_opernews.dll"
+ Delete "$INSTDIR\data\modules\os_oper.dll"
+ Delete "$INSTDIR\data\modules\os_oline.dll"
+ Delete "$INSTDIR\data\modules\os_noop.dll"
+ Delete "$INSTDIR\data\modules\os_modunload.dll"
+ Delete "$INSTDIR\data\modules\os_modload.dll"
+ Delete "$INSTDIR\data\modules\os_modlist.dll"
+ Delete "$INSTDIR\data\modules\os_modinfo.dll"
+ Delete "$INSTDIR\data\modules\os_mode.dll"
+ Delete "$INSTDIR\data\modules\os_logonnews.dll"
+ Delete "$INSTDIR\data\modules\os_kick.dll"
+ Delete "$INSTDIR\data\modules\os_jupe.dll"
+ Delete "$INSTDIR\data\modules\os_info.dll"
+ Delete "$INSTDIR\data\modules\os_ignore.dll"
+ Delete "$INSTDIR\data\modules\os_help.dll"
+ Delete "$INSTDIR\data\modules\os_global.dll"
+ Delete "$INSTDIR\data\modules\os_defcon.dll"
+ Delete "$INSTDIR\data\modules\os_clearmodes.dll"
+ Delete "$INSTDIR\data\modules\os_chanlist.dll"
+ Delete "$INSTDIR\data\modules\os_chankill.dll"
+ Delete "$INSTDIR\data\modules\os_akill.dll"
+ Delete "$INSTDIR\data\modules\os_admin.dll"
+ Delete "$INSTDIR\data\modules\ns_update.dll"
+ Delete "$INSTDIR\data\modules\ns_suspend.dll"
+ Delete "$INSTDIR\data\modules\ns_status.dll"
+ Delete "$INSTDIR\data\modules\ns_set.dll"
+ Delete "$INSTDIR\data\modules\ns_sendpass.dll"
+ Delete "$INSTDIR\data\modules\ns_saset.dll"
+ Delete "$INSTDIR\data\modules\ns_release.dll"
+ Delete "$INSTDIR\data\modules\ns_register.dll"
+ Delete "$INSTDIR\data\modules\ns_recover.dll"
+ Delete "$INSTDIR\data\modules\ns_maxemail.dll"
+ Delete "$INSTDIR\data\modules\ns_logout.dll"
+ Delete "$INSTDIR\data\modules\ns_list.dll"
+ Delete "$INSTDIR\data\modules\ns_info.dll"
+ Delete "$INSTDIR\data\modules\ns_identify.dll"
+ Delete "$INSTDIR\data\modules\ns_help.dll"
+ Delete "$INSTDIR\data\modules\ns_group.dll"
+ Delete "$INSTDIR\data\modules\ns_ghost.dll"
+ Delete "$INSTDIR\data\modules\ns_getpass.dll"
+ Delete "$INSTDIR\data\modules\ns_getemail.dll"
+ Delete "$INSTDIR\data\modules\ns_forbid.dll"
+ Delete "$INSTDIR\data\modules\ns_drop.dll"
+ Delete "$INSTDIR\data\modules\ns_alist.dll"
+ Delete "$INSTDIR\data\modules\ns_access.dll"
+ Delete "$INSTDIR\data\modules\ms_staff.dll"
+ Delete "$INSTDIR\data\modules\ms_set.dll"
+ Delete "$INSTDIR\data\modules\ms_sendall.dll"
+ Delete "$INSTDIR\data\modules\ms_send.dll"
+ Delete "$INSTDIR\data\modules\ms_rsend.dll"
+ Delete "$INSTDIR\data\modules\ms_read.dll"
+ Delete "$INSTDIR\data\modules\ms_list.dll"
+ Delete "$INSTDIR\data\modules\ms_info.dll"
+ Delete "$INSTDIR\data\modules\ms_help.dll"
+ Delete "$INSTDIR\data\modules\ms_del.dll"
+ Delete "$INSTDIR\data\modules\ms_check.dll"
+ Delete "$INSTDIR\data\modules\ms_cancel.dll"
+ Delete "$INSTDIR\data\modules\inspircd11.dll"
+ Delete "$INSTDIR\data\modules\inspircd10.dll"
+ Delete "$INSTDIR\data\modules\hybrid.dll"
+ Delete "$INSTDIR\data\modules\hs_setall.dll"
+ Delete "$INSTDIR\data\modules\hs_set.dll"
+ Delete "$INSTDIR\data\modules\hs_request.dll"
+ Delete "$INSTDIR\data\modules\hs_on.dll"
+ Delete "$INSTDIR\data\modules\hs_off.dll"
+ Delete "$INSTDIR\data\modules\hs_list.dll"
+ Delete "$INSTDIR\data\modules\hs_help.dll"
+ Delete "$INSTDIR\data\modules\hs_group.dll"
+ Delete "$INSTDIR\data\modules\hs_delall.dll"
+ Delete "$INSTDIR\data\modules\hs_del.dll"
+ Delete "$INSTDIR\data\modules\he_help.dll"
+ Delete "$INSTDIR\data\modules\enc_old.dll"
+ Delete "$INSTDIR\data\modules\enc_none.dll"
+ Delete "$INSTDIR\data\modules\enc_md5.dll"
+ Delete "$INSTDIR\data\modules\enc_sha1.dll"
+ Delete "$INSTDIR\data\modules\dreamforge.dll"
+ Delete "$INSTDIR\data\modules\cs_xop.dll"
+ Delete "$INSTDIR\data\modules\cs_topic.dll"
+ Delete "$INSTDIR\data\modules\cs_tban.dll"
+ Delete "$INSTDIR\data\modules\cs_suspend.dll"
+ Delete "$INSTDIR\data\modules\cs_status.dll"
+ Delete "$INSTDIR\data\modules\cs_set.dll"
+ Delete "$INSTDIR\data\modules\cs_sendpass.dll"
+ Delete "$INSTDIR\data\modules\cs_register.dll"
+ Delete "$INSTDIR\data\modules\cs_modes.dll"
+ Delete "$INSTDIR\data\modules\cs_logout.dll"
+ Delete "$INSTDIR\data\modules\cs_list.dll"
+ Delete "$INSTDIR\data\modules\cs_kick.dll"
+ Delete "$INSTDIR\data\modules\cs_invite.dll"
+ Delete "$INSTDIR\data\modules\cs_info.dll"
+ Delete "$INSTDIR\data\modules\cs_identify.dll"
+ Delete "$INSTDIR\data\modules\cs_help.dll"
+ Delete "$INSTDIR\data\modules\cs_getpass.dll"
+ Delete "$INSTDIR\data\modules\cs_getkey.dll"
+ Delete "$INSTDIR\data\modules\cs_forbid.dll"
+ Delete "$INSTDIR\data\modules\cs_enforce.dll"
+ Delete "$INSTDIR\data\modules\cs_drop.dll"
+ Delete "$INSTDIR\data\modules\cs_clear.dll"
+ Delete "$INSTDIR\data\modules\cs_ban.dll"
+ Delete "$INSTDIR\data\modules\cs_appendtopic.dll"
+ Delete "$INSTDIR\data\modules\cs_akick.dll"
+ Delete "$INSTDIR\data\modules\cs_access.dll"
+ Delete "$INSTDIR\data\modules\charybdis.dll"
+ Delete "$INSTDIR\data\modules\bs_unassign.dll"
+ Delete "$INSTDIR\data\modules\bs_set.dll"
+ Delete "$INSTDIR\data\modules\bs_say.dll"
+ Delete "$INSTDIR\data\modules\bs_kick.dll"
+ Delete "$INSTDIR\data\modules\bs_info.dll"
+ Delete "$INSTDIR\data\modules\bs_help.dll"
+ Delete "$INSTDIR\data\modules\bs_fantasy_unban.dll"
+ Delete "$INSTDIR\data\modules\bs_fantasy_seen.dll"
+ Delete "$INSTDIR\data\modules\bs_fantasy_owner.dll"
+ Delete "$INSTDIR\data\modules\bs_fantasy_kickban.dll"
+ Delete "$INSTDIR\data\modules\bs_fantasy_kick.dll"
+ Delete "$INSTDIR\data\modules\bs_fantasy.dll"
+ Delete "$INSTDIR\data\modules\bs_botlist.dll"
+ Delete "$INSTDIR\data\modules\bs_bot.dll"
+ Delete "$INSTDIR\data\modules\bs_badwords.dll"
+ Delete "$INSTDIR\data\modules\bs_assign.dll"
+ Delete "$INSTDIR\data\modules\bs_act.dll"
+ Delete "$INSTDIR\data\modules\bahamut.dll"
+ Delete "$INSTDIR\data\languages\tr"
+ Delete "$INSTDIR\data\languages\ru"
+ Delete "$INSTDIR\data\languages\pt"
+ Delete "$INSTDIR\data\languages\pl"
+ Delete "$INSTDIR\data\languages\nl"
+ Delete "$INSTDIR\data\languages\it"
+ Delete "$INSTDIR\data\languages\hun"
+ Delete "$INSTDIR\data\languages\gr"
+ Delete "$INSTDIR\data\languages\fr"
+ Delete "$INSTDIR\data\languages\es"
+ Delete "$INSTDIR\data\languages\en_us"
+ Delete "$INSTDIR\data\languages\de"
+ Delete "$INSTDIR\data\languages\cat"
+ Delete "$INSTDIR\data\example.conf"
+ Delete "$INSTDIR\data\epona2anope.exe.manifest"
+ Delete "$INSTDIR\data\epona2anope.exe"
+ Delete "$INSTDIR\data\db-merger.exe.manifest"
+ Delete "$INSTDIR\data\db-merger.exe"
+ Delete "$INSTDIR\data\bin\register"
+ Delete "$INSTDIR\data\bin\mydbgen"
+ Delete "$INSTDIR\data\bin\langtool"
+ Delete "$INSTDIR\data\bin\cp-recursive"
+ Delete "$INSTDIR\data\bin\anoperc.in"
+ Delete "$INSTDIR\data\bin\am"
+ Delete "$INSTDIR\data\anopesmtp.exe.manifest"
+ Delete "$INSTDIR\data\anopesmtp.exe"
+ Delete "$INSTDIR\Changes.txt"
+ Delete "$INSTDIR\Changes.mysql.txt"
+ Delete "$INSTDIR\Changes.lang.txt"
+ Delete "$INSTDIR\Changes.conf.txt"
+ Delete "$INSTDIR\anope.exe.manifest"
+ Delete "$INSTDIR\anope.exe"
+Delete "$INSTDIR\anope.bat"
+ SetShellVarContext all
+
+ Delete "$SMPROGRAMS\Anope\Uninstall.lnk"
+ Delete "$SMPROGRAMS\Anope\Website.lnk"
+ Delete "$DESKTOP\Anope IRC Services.lnk"
+ Delete "$SMPROGRAMS\Anope\Anope IRC Services.lnk"
+ Delete "$SMPROGRAMS\Anope\Advanced\Anope IRC Services (Debug and Window Logging).lnk"
+ Delete "$SMPROGRAMS\Anope\Advanced\Anope IRC Services (Window Logging).lnk"
+ Delete "$SMPROGRAMS\Anope\Advanced\Anope IRC Services (No Third Party Modules).lnk"
+
+RMDir "$SMPROGRAMS\Anope\Advanced"
+
+ RMDir "$SMPROGRAMS\Anope"
+ RMDir "$INSTDIR\docs"
+ RMDir "$INSTDIR\data\modules"
+ RMDir "$INSTDIR\data\logs"
+ RMDir "$INSTDIR\data\languages"
+ RMDir "$INSTDIR\data\bin"
+RMDir "$INSTDIR\data\backups"
+ RMDir "$INSTDIR\data"
+ RMDir "$INSTDIR"
+
+ DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
+ DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}"
+ SetAutoClose true
+SectionEnd \ No newline at end of file
diff --git a/src/tools/Makefile b/src/tools/Makefile
new file mode 100644
index 000000000..c0aa9fb85
--- /dev/null
+++ b/src/tools/Makefile
@@ -0,0 +1,39 @@
+SRCS = anopesmtp.c db-merger.c epona2anope.c
+OBJS = $(SRCS:.c=.o)
+
+INCLUDES = ../../include/services.h
+
+MAKEARGS = 'CFLAGS=${CFLAGS}' 'CC=${CC}' 'ANOPELIBS=${ANOPELIBS}' \
+ 'LDFLAGS=${LDFLAGS}' 'BINDEST=${BINDEST}' 'INSTALL=${INSTALL}' \
+ 'INCLUDEDIR=${INCLUDEDIR}' 'RM=${RM}' 'CP=${CP}' \
+ 'TOUCH=${TOUCH}' 'SHELL=${SHELL}' 'DATDEST=${DATDEST}' \
+ 'RUNGROUP=${RUNGROUP}'
+
+.c.o:
+ $(CC) $(CFLAGS) -I../include/ -c $<
+
+all: ${OBJS}
+
+distclean: spotless
+
+anopesmpt: $(OBJS)
+ $(CC) $(CFLAGS) $(OBJS) $(ANOPELIBS) $(MLIBS) -o $@ $(LDFLAGS)
+
+$(OBJS): Makefile
+anopesmtp.o: anopesmtp.c $(INCLUDES)
+db-merger.o: db-merger.c $(INCLUDES)
+epona2anope.o: epona2anope.c $(INCLUDES)
+
+clean:
+ rm -f *.o anopesmtp a.out db-merger epona2anope
+
+spotless: clean
+
+install: anopesmtp db-merger epona2anope
+ test -d ${BINDEST} || mkdir ${BINDEST}
+ test -d $(BINDEST)/tools || mkdir $(BINDEST)/tools
+ $(INSTALL) anopesmtp $(BINDEST)/tools/anopesmtp
+ $(INSTALL) db-merger $(BINDEST)/tools/db-merger
+ $(INSTALL) epona2anope $(BINDEST)/tools/epona2anope
+
+DUMMY:
diff --git a/src/tools/Makefile.win32 b/src/tools/Makefile.win32
new file mode 100644
index 000000000..77e7f2c91
--- /dev/null
+++ b/src/tools/Makefile.win32
@@ -0,0 +1,29 @@
+include ../../Makefile.inc.win32
+
+SRCS=anopesmtp.c epona2anope.c db-merger.c
+OBJECTS= $(SRCS:.c=.exe)
+CFLAGS=$(CFLAGS) /I"../../include"
+LFLAGS=/link wsock32.lib $(LIBS) $(LFLAGS)
+
+all: $(OBJECTS)
+
+distclean: clean spotless
+
+.c.exe:
+ $(CC) $(CFLAGS) $< $(LFLAGS)
+
+clean:
+ -@del *.obj
+
+spotless: clean
+ -@del *.exe *.lib *.exp
+
+install: exe_install manifest_install
+
+exe_install: FRC
+ -@copy *.exe ..\..\$(DATDEST)\
+
+manifest_install: FRC
+ -@copy *.manifest ..\..\$(DATDEST)\
+
+FRC:
diff --git a/src/tools/README b/src/tools/README
new file mode 100644
index 000000000..3acb80ad2
--- /dev/null
+++ b/src/tools/README
@@ -0,0 +1,58 @@
+Anope Bundled Tools
+-------------------
+
+1) Anope SMTP Client
+2) Anope Database Merger
+3) Epona to Anope Database Converter
+
+1) Anope SMTP Client
+
+ Provided with Anope is a simple SMTP client which can be used instead of
+ programs like SendMail in some cases.
+
+ The SMTP client can be used instead of sendmail for use with Anope's mail
+ options. To use the SMTP client instead of sendmail, find the line in your
+ services configuration file (services.conf) that defines SendMailPath. On
+ that line, change the path to your services installation directory, then
+ followed by "tools/anopesmtp" and the IP address of a valid SMTP server. It
+ should look like this:
+
+ SendMailPath "/home/anope/services/tools/anopesmtp 127.0.0.1"
+
+ If the SMTP client doesn't send mail, or if there's an other problem with
+ it, you can compile it in debug mode. To do this, open smtp.h, and look
+ for "smtp_debug" near the bottom. Change this from 0 to 1 and recompile
+ the code. This should generate a log file of what happened when it tried
+ to connect to the SMTP server.
+
+ Credits:
+ Originally written by Dominick Meglio <codemastr@unrealircd.com>
+ Ported to *nix by Trystan Scott Lee <trystan@nomadirc.net>
+
+2) Anope Database Merger
+
+ This program tries to merge two standard Anope database sets (ChanServ,
+ NickServ, BotServ, and MemoServ).
+
+ To merge two database sets, put them both in the folder where the merger
+ is located. The first database set must be named <name>1.db (nick1.db,
+ chan1.db, etc); the second database set must be named <name>2.db (nick2.db,
+ chan2.db, etc). If you execute the merger now the databases will be merged
+ into databases named <name>.db.
+
+ Credits:
+ Written by Florian Schulze <certus@anope.org>
+
+3) Epona to Anope Database Converter
+
+ This program tries to convert databases made by epona .4.15 and up to
+ standard anope databases. Currently, only the ChanServ database needs to
+ be converted.
+
+ Put your Epona (ChanServ) database in the folder where the epona2anope
+ executable file is located. Rename this ChanServ database file to
+ chan1.db and then run the converter (epona2anope). A new database called
+ chan.db will be created; this file is Anope-compatible.
+
+ Credits:
+ Written by Florian Schulze <certus@anope.org>
diff --git a/src/tools/anopesmtp.c b/src/tools/anopesmtp.c
new file mode 100644
index 000000000..4ff0c6fcf
--- /dev/null
+++ b/src/tools/anopesmtp.c
@@ -0,0 +1,604 @@
+/* smtp stuff handler for win32.
+ *
+ * (C) 2003-2008 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.
+ *
+ * Written by Dominick Meglio <codemastr@unrealircd.com>
+ * *nix port by Trystan Scott Lee <trystan@nomadirc.net>
+ *
+ */
+
+#include "smtp.h"
+
+static FILE *logfile;
+static int curday = 0;
+
+/*************************************************************************/
+
+#ifdef _WIN32
+int strcasecmp(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;
+}
+#endif
+
+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", "anopesmtp", timestamp);
+ curday = tm->tm_yday;
+
+ return 1;
+}
+
+/*************************************************************************/
+
+/* Close the log file. */
+
+void close_log(void)
+{
+ if (!logfile)
+ return;
+ fclose(logfile);
+ logfile = NULL;
+}
+
+/*************************************************************************/
+
+static void remove_log(void)
+{
+ time_t t;
+ struct tm tm;
+
+ char name[PATH_MAX];
+
+ time(&t);
+ t -= (60 * 60 * 24 * 30);
+ tm = *localtime(&t);
+
+ if (!get_logname(name, sizeof(name), &tm))
+ return;
+ unlink(name);
+}
+
+/*************************************************************************/
+
+/* 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;
+}
+
+/*************************************************************************/
+
+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();
+ }
+}
+
+/*************************************************************************/
+
+/* 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;
+
+ if (!smtp_debug) {
+ return;
+ }
+
+ checkday();
+
+ if (!fmt) {
+ return;
+ }
+
+ va_start(args, fmt);
+ time(&t);
+ tm = *localtime(&t);
+ strftime(buf, sizeof(buf) - 1, "[%b %d %H:%M:%S %Y] ", &tm);
+ if (logfile && args) {
+ fputs(buf, logfile);
+ vfprintf(logfile, fmt, args);
+ fputc('\n', logfile);
+ }
+ va_end(args);
+ errno = errno_save;
+}
+
+/*************************************************************************/
+
+/* Remove a trailing \r\n */
+char *strip(char *buf)
+{
+ char *c;
+ if ((c = strchr(buf, '\n')))
+ *c = 0;
+ if ((c = strchr(buf, '\r')))
+ *c = 0;
+ return buf;
+}
+
+/*************************************************************************/
+
+/* Convert a trailing \n to \r\n
+ * The caller must free the allocated memory
+ */
+char *lftocrlf(char *buf)
+{
+ char *result = malloc(strlen(buf) + 2);
+ strip(buf);
+ strcpy(result, buf);
+ strcat(result, "\r\n");
+ return result;
+}
+
+/*************************************************************************/
+
+/* Add a header to the list */
+void smtp_add_header(char *header)
+{
+ struct smtp_header *head = malloc(sizeof(struct smtp_header));
+
+ head->header = lftocrlf(header);
+ head->next = NULL;
+
+ if (!mail.smtp_headers) {
+ mail.smtp_headers = head;
+ }
+ if (mail.smtp_headers_tail) {
+ mail.smtp_headers_tail->next = head;
+ }
+ mail.smtp_headers_tail = head;
+}
+
+/*************************************************************************/
+
+/* Is the buffer a header? */
+int smtp_is_header(char *buf)
+{
+ char *tmp = strchr(buf, ' ');
+
+ if (!tmp)
+ return 0;
+
+ if (*(tmp - 1) == ':')
+ return 1;
+ return 0;
+}
+
+/*************************************************************************/
+
+/* Parse a header into a name and value */
+void smtp_parse_header(char *buf, char **header, char **value)
+{
+ strip(buf);
+
+ *header = strtok(buf, " ");
+ *value = strtok(NULL, "");
+ if (*header)
+ (*header)[strlen(*header) - 1] = 0;
+}
+
+/*************************************************************************/
+
+/* Have we reached the end of input? */
+int smtp_is_end(char *buf)
+{
+ if (*buf == '.')
+ if (*(buf + 1) == '\r' || *(buf + 1) == '\n')
+ return 1;
+
+ return 0;
+}
+
+/*************************************************************************/
+
+/* Set who the email is from */
+void smtp_set_from(char *from)
+{
+ mail.from = strdup(from);
+}
+
+/*************************************************************************/
+
+/* Set who the email is to */
+void smtp_set_to(char *to)
+{
+ char *c;
+
+ if ((c = strrchr(to, '<')) && *(c + 1)) {
+ to = c + 1;
+ to[strlen(to) - 1] = 0;
+ }
+ mail.to = strdup(to);
+}
+
+/*************************************************************************/
+
+/* Add a line of body text */
+void smtp_add_body_line(char *line)
+{
+ struct smtp_body_line *body;
+
+ body = malloc(sizeof(struct smtp_body_line));
+
+ body->line = lftocrlf(line);
+ body->next = NULL;
+
+ if (!mail.smtp_body)
+ mail.smtp_body = body;
+ if (mail.smtp_body_tail)
+ mail.smtp_body_tail->next = body;
+ mail.smtp_body_tail = body;
+
+}
+
+/*************************************************************************/
+
+/* Establish a connection to the SMTP server */
+int smtp_connect(char *host, unsigned short port)
+{
+ struct sockaddr_in addr;
+
+ if ((mail.sock = socket(AF_INET, SOCK_STREAM, 0)) == SOCKET_ERROR)
+ return 0;
+
+ if ((addr.sin_addr.s_addr = inet_addr(host)) == INADDR_NONE) {
+ struct hostent *hent;
+ if (!(hent = gethostbyname(host)))
+ return 0;
+ memcpy(&addr.sin_addr, hent->h_addr, hent->h_length);
+ }
+ addr.sin_family = AF_INET;
+ addr.sin_port = htons(port ? port : 25);
+ if (connect(mail.sock, (struct sockaddr *) &addr, sizeof(struct sockaddr_in)) == SOCKET_ERROR) {
+ ano_sockclose(mail.sock);
+ return 0;
+ }
+
+ return 1;
+}
+
+/*************************************************************************/
+
+/* Send a line of text */
+int smtp_send(char *text)
+{
+ int result = ano_sockwrite(mail.sock, text, strlen(text));
+
+ alog("SMTP: sent %s",text);
+
+ if (result == SOCKET_ERROR)
+ ano_sockclose(mail.sock);
+
+ return result;
+}
+
+/*************************************************************************/
+
+/* Read a line of text */
+int smtp_read(char *buf, int len)
+{
+ int result;
+
+ memset(buf, 0, len);
+ result = ano_sockread(mail.sock, buf, len);
+
+ if (result == SOCKET_ERROR)
+ ano_sockclose(mail.sock);
+
+ return result;
+}
+
+/*************************************************************************/
+
+/* Retrieve a response code */
+int smtp_get_code(char *text)
+{
+ char *tmp = strtok(text, " ");
+
+ if (!tmp)
+ return 0;
+
+ return atol(tmp);
+}
+
+/*************************************************************************/
+
+/* Send the email */
+int smtp_send_email()
+{
+ char buf[1024];
+ struct smtp_header *head;
+ struct smtp_body_line *body;
+ int code;
+ int skip_done = 0;
+
+ if (!smtp_read(buf, 1024)) {
+ alog("SMTP: error reading buffer");
+ return 0;
+ }
+
+ code = smtp_get_code(buf);
+ if (code != 220) {
+ alog("SMTP: error expected code 220 got %d",code);
+ return 0;
+ }
+
+ if (!smtp_send("HELO anope\r\n")) {
+ alog("SMTP: error writting to socket");
+ return 0;
+ }
+
+ if (!smtp_read(buf, 1024)) {
+ alog("SMTP: error reading buffer");
+ return 0;
+ }
+
+ code = smtp_get_code(buf);
+ if (code != 250) {
+ alog("SMTP: error expected code 250 got %d",code);
+ return 0;
+ }
+
+ strcpy(buf, "MAIL FROM: <");
+ strcat(buf, mail.from);
+ strcat(buf, ">\r\n");
+
+ if (!smtp_send(buf)) {
+ alog("SMTP: error writting to socket");
+ return 0;
+ }
+
+ if (!smtp_read(buf, 1024)) {
+ alog("SMTP: error reading buffer");
+ return 0;
+ }
+
+ code = smtp_get_code(buf);
+ if (code != 250)
+ return 0;
+
+ strcpy(buf, "RCPT TO: <");
+ strcat(buf, mail.to);
+ strcat(buf, ">\r\n");
+
+ if (!smtp_send(buf)) {
+ alog("SMTP: error writting to socket");
+ return 0;
+ }
+
+ if (!smtp_read(buf, 1024)) {
+ alog("SMTP: error reading buffer");
+ return 0;
+ }
+
+ code = smtp_get_code(buf);
+ if (smtp_get_code(buf) != 250) {
+ alog("SMTP: error expected code 250 got %d",code);
+ return 0;
+ }
+
+ if (!smtp_send("DATA\r\n")) {
+ alog("SMTP: error writting to socket");
+ return 0;
+ }
+
+ if (!smtp_read(buf, 1024)) {
+ alog("SMTP: error reading buffer");
+ return 0;
+ }
+
+ code = smtp_get_code(buf);
+ if (code != 354) {
+ alog("SMTP: error expected code 354 got %d",code);
+ return 0;
+ }
+
+ for (head = mail.smtp_headers; head; head = head->next) {
+ if (!smtp_send(head->header)) {
+ alog("SMTP: error writting to socket");
+ return 0;
+ }
+ }
+
+ if (!smtp_send("\r\n")) {
+ alog("SMTP: error writting to socket");
+ return 0;
+ }
+
+ for (body = mail.smtp_body; body; body = body->next) {
+ if (skip_done) {
+ if (!smtp_send(body->line)) {
+ alog("SMTP: error writting to socket");
+ return 0;
+ }
+ } else {
+ skip_done = 1;
+ }
+ }
+
+ if (!smtp_send("\r\n.\r\n")) {
+ alog("SMTP: error writting to socket");
+ return 0;
+ }
+
+ return 1;
+}
+
+/*************************************************************************/
+
+void smtp_disconnect()
+{
+ smtp_send("QUIT\r\n");
+ ano_sockclose(mail.sock);
+}
+
+/*************************************************************************/
+
+void mail_cleanup()
+{
+ struct smtp_header *headers, *nexth;
+ struct smtp_body_line *body, *nextb;
+
+ if (mail.from)
+ free(mail.from);
+ if (mail.to)
+ free(mail.to);
+
+ headers = mail.smtp_headers;
+ while (headers) {
+ nexth = headers->next;
+ free(headers->header);
+ free(headers);
+ headers = nexth;
+ }
+
+ body = mail.smtp_body;
+ while (body) {
+ nextb = body->next;
+ free(body->line);
+ free(body);
+ body = nextb;
+ }
+}
+
+/*************************************************************************/
+
+int main(int argc, char *argv[])
+{
+ char buf[8192];
+/* These are somehow unused - why are they here? -GD
+
+ struct smtp_body_line *b;
+ struct smtp_header *h;
+*/
+ int headers_done = 0;
+/* Win32 stuff */
+#ifdef _WIN32
+ WSADATA wsa;
+#endif
+ char *server, *aport;
+ short port;
+
+ if (argc == 1)
+ return 0;
+
+ server = strtok(argv[1], ":");
+ if ((aport = strtok(NULL, ""))) {
+ port = atoi(aport);
+ } else {
+ port = 25;
+ }
+
+ if (!server) {
+ alog("No Server");
+ /* Bad, bad, bad. This was a eturn from main with no value! -GD */
+ return 0;
+ } else {
+ alog("SMTP: server %s port %d",server,port);
+ }
+
+ memset(&mail, 0, sizeof(mail));
+
+/* The WSAStartup function initiates use of WS2_32.DLL by a process. */
+/* guessing we can skip it under *nix */
+#ifdef _WIN32
+ if (WSAStartup(MAKEWORD(1, 1), &wsa) != 0)
+ return 0;
+#endif
+
+ /* Read the message and parse it */
+ while (fgets(buf, 8192, stdin)) {
+ if (smtp_is_header(buf) && !headers_done) {
+ char *header, *value;
+ smtp_add_header(buf);
+ smtp_parse_header(buf, &header, &value);
+ if (!strcasecmp(header, "from")) {
+ alog("SMTP: from: %s",value);
+ smtp_set_from(value);
+ } else if (!strcasecmp(header, "to")) {
+ alog("SMTP: to: %s",value);
+ smtp_set_to(value);
+ } else if (smtp_is_end(buf)) {
+ break;
+ } else {
+ headers_done = 1;
+ smtp_add_body_line(buf);
+ }
+ } else {
+ smtp_add_body_line(buf);
+ }
+ }
+
+ if (!smtp_connect(server, port)) {
+ alog("SMTP: failed to connect to %s:%d",server, port);
+ mail_cleanup();
+ return 0;
+ }
+ if (!smtp_send_email()) {
+ alog("SMTP: error during sending of mail");
+ mail_cleanup();
+ return 0;
+ }
+ smtp_disconnect();
+ mail_cleanup();
+
+ return 1;
+}
diff --git a/src/tools/db-merger.c b/src/tools/db-merger.c
new file mode 100644
index 000000000..b44e5b9d0
--- /dev/null
+++ b/src/tools/db-merger.c
@@ -0,0 +1,2031 @@
+/*
+ * Anope Database Merger
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ *****
+ *
+ * Based on the original IRC, db-merger.c
+ * (C) Copyright 2005-2006, Florian Schulze (Certus)
+ * Based on the original code of Anope, (C) 2003-2005 Anope Team
+ *
+ */
+
+/*
+ * Known issues:
+ * - When merging it is possible that ownership of a channel is transferred
+ * to another nickgroup if the founder's main nick is dropped and granted
+ * to another user in the other database. This user will then become
+ * founder of the channel.
+ *
+ * - The count of channels a nickgroup has registered is not recalculated
+ * after the merge. This means that if a channel was dropped, the owner may
+ * have an incorrect counter and may sooner reach the maximum number of
+ * allowed registered channels.
+ *
+ * Ideally, this should be rewritten from scratch to only merge after both
+ * database sets are fully loaded, however since we will be migrating to
+ * another database architecture, this is unlikely to be done for the
+ * current "stable" DB architecture.
+ *
+ * ~ Viper
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <ctype.h>
+#include <time.h>
+
+#ifndef _WIN32
+#include <unistd.h>
+#else
+#include "sysconf.h"
+#include <windows.h>
+#endif
+
+/* Some SUN fixs */
+#ifdef __sun
+/* Solaris specific code, types that do not exist in Solaris'
+ * sys/types.h
+ **/
+#undef u_int8_t
+#undef u_int16_t
+#undef u_int32_t
+#undef u_int_64_t
+#define u_int8_t uint8_t
+#define u_int16_t uint16_t
+#define u_int32_t uint32_t
+#define u_int64_t uint64_t
+
+#ifndef INADDR_NONE
+#define INADDR_NONE (-1)
+#endif
+
+#endif
+
+
+/* CONFIGURATION BLOCK */
+
+#define NICK_DB_1 "nick1.db"
+#define NICK_DB_2 "nick2.db"
+#define NICK_DB_NEW "nick.db"
+
+#define CHAN_DB_1 "chan1.db"
+#define CHAN_DB_2 "chan2.db"
+#define CHAN_DB_NEW "chan.db"
+
+#define BOT_DB_1 "bot1.db"
+#define BOT_DB_2 "bot2.db"
+#define BOT_DB_NEW "bot.db"
+
+#define HOST_DB_1 "hosts1.db"
+#define HOST_DB_2 "hosts2.db"
+#define HOST_DB_NEW "hosts.db"
+
+/* END OF CONFIGURATION BLOCK */
+
+#ifndef _WIN32
+#define C_LBLUE "\033[1;34m"
+#define C_NONE "\033[m"
+#else
+#define C_LBLUE ""
+#define C_NONE ""
+#endif
+
+#define getc_db(f) (fgetc((f)->fp))
+#define HASH(nick) ((tolower((nick)[0])&31)<<5 | (tolower((nick)[1])&31))
+#define HASH2(chan) ((chan)[1] ? ((chan)[1]&31)<<5 | ((chan)[2]&31) : 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_db(f,buf,len) (fread((buf),1,(len),(f)->fp))
+#define write_db(f,buf,len) (fwrite((buf),1,(len),(f)->fp))
+#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 SAFE(x) do { \
+ if ((x) < 0) { \
+ printf("Error, the database is broken, trying to continue... no guarantee.\n"); \
+ } \
+} while (0)
+#define READ(x) do { \
+ if ((x) < 0) { \
+ printf("Error, the database is broken, trying to continue... no guarantee.\n"); \
+ exit(0); \
+ } \
+} while (0)
+
+typedef int16_t int16;
+typedef u_int16_t uint16;
+typedef int32_t int32;
+typedef u_int32_t uint32;
+typedef struct memo_ Memo;
+typedef struct dbFILE_ dbFILE;
+typedef struct nickalias_ NickAlias;
+typedef struct nickcore_ NickCore;
+typedef struct chaninfo_ ChannelInfo;
+typedef struct botinfo_ BotInfo;
+typedef struct badword_ BadWord;
+typedef struct hostcore_ HostCore;
+
+struct memo_ {
+ uint32 number; /* Index number -- not necessarily array position! */
+ uint16 flags; /* Flags */
+ time_t time; /* When was it sent? */
+ char sender[32]; /* Name of the sender */
+ char *text;
+};
+
+struct dbFILE_ {
+ int mode; /* 'r' for reading, 'w' for writing */
+ FILE *fp; /* The normal file descriptor */
+ char filename[1024]; /* Name of the database file */
+};
+
+typedef struct {
+ int16 memocount; /* Current # of memos */
+ int16 memomax; /* Max # of memos one can hold*/
+ Memo *memos; /* Pointer to original memos */
+} MemoInfo;
+
+typedef struct {
+ uint16 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;
+
+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 */
+ uint16 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;
+
+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 */
+ uint16 status; /* See NS_* below */
+ NickCore *nc; /* I'm an alias of this */
+};
+
+struct nickcore_ {
+ NickCore *next, *prev;
+
+ char *display; /* How the nick is displayed */
+ char pass[32]; /* 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 */
+ uint32 flags; /* See NI_* below */
+ uint16 language; /* Language selected by nickname owner (LANG_*) */
+ uint16 accesscount; /* # of entries */
+ char **access; /* Array of strings */
+ MemoInfo memos; /* Memo information */
+ uint16 channelcount; /* Number of channels currently registered */
+ uint16 channelmax; /* Maximum number of channels allowed */
+ int unused; /* Used for nick collisions */
+ int aliascount; /* How many aliases link to us? Remove the core if 0 */
+};
+
+struct chaninfo_ {
+ ChannelInfo *next, *prev;
+
+ char name[64]; /* Channel name */
+ char *founder; /* Who registered the channel */
+ char *successor; /* Who gets the channel if the founder nick is dropped or expires */
+ char founderpass[32]; /* Channel password */
+ char *desc; /* Description */
+ char *url; /* URL */
+ char *email; /* Email address */
+ time_t time_registered; /* When was it registered */
+ time_t last_used; /* When was it used hte last time */
+ char *last_topic; /* Last topic on the channel */
+ char last_topic_setter[32]; /* Who set the last topic */
+ time_t last_topic_time; /* When the last topic was set */
+ uint32 flags; /* Flags */
+ char *forbidby; /* if forbidden: who did it */
+ char *forbidreason; /* if forbidden: why */
+ int16 bantype; /* Bantype */
+ int16 *levels; /* Access levels for commands */
+ uint16 accesscount; /* # of pple with access */
+ ChanAccess *access; /* List of authorized users */
+ uint16 akickcount; /* # of akicked pple */
+ 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 */
+ char *mlock_flood; /* NULL if no +f */
+ char *mlock_redirect; /* NULL if no +L */
+ char *entry_message; /* Notice sent on entering channel */
+ MemoInfo memos; /* Memos */
+ char *bi; /* Bot used on this channel */
+ uint32 botflags; /* BS_* below */
+ int16 *ttb; /* Times to ban for each kicker */
+ uint16 bwcount; /* Badword count */
+ BadWord *badwords; /* For BADWORDS kicker */
+ int16 capsmin, capspercent; /* For CAPS kicker */
+ int16 floodlines, floodsecs; /* For FLOOD kicker */
+ int16 repeattimes; /* For REPEAT kicker */
+};
+
+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 */
+ time_t created; /* Birth date */
+ int16 chancount; /* Number of channels that use the bot. */
+};
+
+struct badword_ {
+ uint16 in_use;
+ char *word;
+ uint16 type;
+};
+
+struct hostcore_ {
+ HostCore *next, *last;
+ 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 */
+};
+
+dbFILE *open_db_write(const char *service, const char *filename, int version);
+dbFILE *open_db_read(const char *service, const char *filename, int version);
+NickCore *findcore(const char *nick, int version);
+NickAlias *findnick(const char *nick);
+BotInfo *findbot(char *nick);
+ChannelInfo *cs_findchan(const char *chan);
+char *strscpy(char *d, const char *s, size_t len);
+int write_file_version(dbFILE * f, uint32 version);
+int mystricmp(const char *s1, const char *s2);
+int delnick(NickAlias *na, int donttouchthelist);
+int write_string(const char *s, dbFILE * f);
+int write_ptr(const void *ptr, dbFILE * f);
+int read_int16(int16 * ret, dbFILE * f);
+int read_int32(int32 * ret, dbFILE * f);
+int read_uint16(uint16 * ret, dbFILE * f);
+int read_uint32(uint32 * ret, dbFILE * f);
+int read_string(char **ret, dbFILE * f);
+int write_int16(uint16 val, dbFILE * f);
+int write_int32(uint32 val, dbFILE * f);
+int read_ptr(void **ret, dbFILE * f);
+int delcore(NickCore *nc);
+void alpha_insert_chan(ChannelInfo * ci);
+void insert_bot(BotInfo * bi);
+void close_db(dbFILE * f);
+
+ChannelInfo *chanlists[256];
+NickAlias *nalists[1024];
+NickCore *nclists[1024];
+BotInfo *botlists[256];
+
+int preferfirst = 0, prefersecond = 0, preferoldest = 0, prefernewest = 0;
+int nonick = 0, nochan = 0, nobot = 0, nohost = 0;
+
+int main(int argc, char *argv[])
+{
+ dbFILE *f;
+ int i;
+ NickCore *nc, *ncnext;
+ HostCore *firsthc = NULL;
+
+ printf("\n"C_LBLUE"DB Merger for Anope IRC Services"C_NONE"\n");
+ printf("Version: $Id$"C_NONE"\n\n");
+
+ if (argc >= 2) {
+ if (!mystricmp(argv[1], "--PREFEROLDEST")) {
+ printf("Preferring oldest database entries on collision.\n");
+ preferoldest = 1;
+ } else if (!mystricmp(argv[1], "--PREFERFIRST")) {
+ printf("Preferring first database's entries on collision .\n");
+ preferfirst = 1;
+ } else if (!mystricmp(argv[1], "--PREFERSECOND")) {
+ printf("Preferring second database's entries on collision.\n");
+ prefersecond = 1;
+ } else if (!mystricmp(argv[1], "--PREFERNEWEST")) {
+ printf("Preferring newest database entries on collision.\n");
+ prefernewest = 1;
+ }
+ }
+
+ /* Section I: Nicks */
+ /* Ia: First database */
+ if ((f = open_db_read("NickServ", NICK_DB_1, 14))) {
+
+ NickAlias *na, **nalast, *naprev;
+ NickCore *nc, **nclast, *ncprev;
+ int16 tmp16;
+ int32 tmp32;
+ int i, j, c;
+
+ printf("Trying to merge nicks...\n");
+
+ /* Nick cores */
+ for (i = 0; i < 1024; i++) {
+ nclast = &nclists[i];
+ ncprev = NULL;
+
+ while ((c = getc_db(f)) == 1) {
+ if (c != 1) {
+ printf("Invalid format in %s.\n", NICK_DB_1);
+ exit(0);
+ }
+
+ nc = calloc(1, sizeof(NickCore));
+ nc->aliascount = 0;
+ nc->unused = 0;
+
+ *nclast = nc;
+ nclast = &nc->next;
+ nc->prev = ncprev;
+ ncprev = nc;
+
+ READ(read_string(&nc->display, f));
+ READ(read_buffer(nc->pass, f));
+ READ(read_string(&nc->email, f));
+ READ(read_string(&nc->greet, f));
+ READ(read_uint32(&nc->icq, f));
+ READ(read_string(&nc->url, f));
+ READ(read_uint32(&nc->flags, f));
+ READ(read_uint16(&nc->language, f));
+ READ(read_uint16(&nc->accesscount, f));
+ if (nc->accesscount) {
+ char **access;
+ access = calloc(sizeof(char *) * nc->accesscount, 1);
+ nc->access = access;
+ for (j = 0; j < nc->accesscount; j++, access++)
+ READ(read_string(access, f));
+ }
+ READ(read_int16(&nc->memos.memocount, f));
+ READ(read_int16(&nc->memos.memomax, f));
+ if (nc->memos.memocount) {
+ Memo *memos;
+ memos = calloc(sizeof(Memo) * nc->memos.memocount, 1);
+ nc->memos.memos = memos;
+ for (j = 0; j < nc->memos.memocount; j++, memos++) {
+ READ(read_uint32(&memos->number, f));
+ READ(read_uint16(&memos->flags, f));
+ READ(read_int32(&tmp32, f));
+ memos->time = tmp32;
+ READ(read_buffer(memos->sender, f));
+ READ(read_string(&memos->text, f));
+ }
+ }
+ READ(read_uint16(&nc->channelcount, f));
+ READ(read_int16(&tmp16, f));
+ } /* getc_db() */
+ *nclast = NULL;
+ } /* for() loop */
+
+ /* Nick aliases */
+ for (i = 0; i < 1024; i++) {
+ char *s = NULL;
+
+ nalast = &nalists[i];
+ naprev = NULL;
+
+ while ((c = getc_db(f)) == 1) {
+ if (c != 1) {
+ printf("Invalid format in %s.\n", NICK_DB_1);
+ exit(0);
+ }
+
+ na = calloc(1, sizeof(NickAlias));
+
+ READ(read_string(&na->nick, f));
+ READ(read_string(&na->last_usermask, f));
+ READ(read_string(&na->last_realname, f));
+ READ(read_string(&na->last_quit, f));
+
+ READ(read_int32(&tmp32, f));
+ na->time_registered = tmp32;
+ READ(read_int32(&tmp32, f));
+ na->last_seen = tmp32;
+ READ(read_uint16(&na->status, f));
+ READ(read_string(&s, f));
+ na->nc = findcore(s, 0);
+ na->nc->aliascount++;
+ free(s);
+
+ *nalast = na;
+ nalast = &na->next;
+ na->prev = naprev;
+ naprev = na;
+ } /* getc_db() */
+ *nalast = NULL;
+ } /* for() loop */
+ close_db(f); /* End of section Ia */
+ } else
+ nonick = 1;
+
+ /* Ib: Second database */
+ if (!nonick) {
+ if ((f = open_db_read("NickServ", NICK_DB_2, 14))) {
+
+ NickAlias *na, *naptr;
+ NickCore *nc;
+ int16 tmp16;
+ int32 tmp32;
+ int i, j, index, c;
+
+ /* Nick cores */
+ for (i = 0; i < 1024; i++) {
+
+ while ((c = getc_db(f)) == 1) {
+ if (c != 1) {
+ printf("Invalid format in %s.\n", NICK_DB_2);
+ exit(0);
+ }
+
+ nc = calloc(1, sizeof(NickCore));
+ READ(read_string(&nc->display, f));
+ READ(read_buffer(nc->pass, f));
+ READ(read_string(&nc->email, f));
+
+ naptr = findnick(nc->display);
+ if (naptr)
+ nc->unused = 1;
+ else
+ nc->unused = 0;
+
+ nc->aliascount = 0;
+
+ index = HASH(nc->display);
+ nc->prev = NULL;
+ nc->next = nclists[index];
+ if (nc->next)
+ nc->next->prev = nc;
+ nclists[index] = nc;
+
+ READ(read_string(&nc->greet, f));
+ READ(read_uint32(&nc->icq, f));
+ READ(read_string(&nc->url, f));
+ READ(read_uint32(&nc->flags, f));
+ READ(read_uint16(&nc->language, f));
+ READ(read_uint16(&nc->accesscount, f));
+ if (nc->accesscount) {
+ char **access;
+ access = calloc(sizeof(char *) * nc->accesscount, 1);
+ nc->access = access;
+ for (j = 0; j < nc->accesscount; j++, access++)
+ READ(read_string(access, f));
+ }
+ READ(read_int16(&nc->memos.memocount, f));
+ READ(read_int16(&nc->memos.memomax, f));
+ if (nc->memos.memocount) {
+ Memo *memos;
+ memos = calloc(sizeof(Memo) * nc->memos.memocount, 1);
+ nc->memos.memos = memos;
+ for (j = 0; j < nc->memos.memocount; j++, memos++) {
+ READ(read_uint32(&memos->number, f));
+ READ(read_uint16(&memos->flags, f));
+ READ(read_int32(&tmp32, f));
+ memos->time = tmp32;
+ READ(read_buffer(memos->sender, f));
+ READ(read_string(&memos->text, f));
+ }
+ }
+ READ(read_uint16(&nc->channelcount, f));
+ READ(read_int16(&tmp16, f));
+ } /* getc_db() */
+ } /* for() loop */
+
+ /* Nick aliases */
+ for (i = 0; i < 1024; i++) {
+ char *s = NULL;
+ NickAlias *ptr, *prev, *naptr;
+
+ while ((c = getc_db(f)) == 1) {
+ if (c != 1) {
+ printf("Invalid format in %s.\n", NICK_DB_2);
+ exit(0);
+ }
+
+ na = calloc(1, sizeof(NickAlias));
+
+ READ(read_string(&na->nick, f));
+ READ(read_string(&na->last_usermask, f));
+ READ(read_string(&na->last_realname, f));
+ READ(read_string(&na->last_quit, f));
+ READ(read_int32(&tmp32, f));
+ na->time_registered = tmp32;
+ READ(read_int32(&tmp32, f));
+ na->last_seen = tmp32;
+ READ(read_uint16(&na->status, f));
+ READ(read_string(&s, f));
+
+ naptr = findnick(na->nick);
+ if (naptr) { /* COLLISION! na = collision #2 = new (na->nc doesn't exist yet), naptr = collision #1 = old (naptr->nc exists) */
+ char input[1024];
+ NickCore *ncptr = findcore(na->nick, 1); /* Find core for #2, ncptr MUST exist since we've read all cores, if it doesn't eixst, we have a malformed db */;
+
+ if (!ncptr) { /* malformed */
+ printf("\n\n WARNING! Malformed database. No nickcore for nick %s, droping it.\n\n\n", na->nick);
+ delnick(na, 1);
+ } else { /* not malformed */
+ if (!preferoldest && !preferfirst && !prefersecond && !prefernewest) {
+ printf("Nick collision for nick %s:\n\n", na->nick);
+ printf("Group 1: %s (%s)\n", naptr->nc->display, naptr->nc->email);
+ printf("Time registered: %s\n", ctime(&naptr->time_registered));
+ printf("Group 2: %s (%s)\n", ncptr->display, ncptr->email);
+ printf("Time registered: %s\n", ctime(&na->time_registered));
+ printf("What group do you want to keep? Enter the related group number \"1\" or \"2\".\n");
+ }
+
+ if (preferoldest) {
+ input[0] = (na->time_registered > naptr->time_registered) ? '1' : '2';
+ } else if (prefernewest) {
+ input[0] = (na->time_registered > naptr->time_registered) ? '2' : '1';
+ } else if (preferfirst) {
+ input[0] = '1';
+ } else if (prefersecond) {
+ input[0] = '2';
+ } else {
+ waiting_for_input:
+ scanf("%s", input);
+ }
+ if (input[0] == '1') { /* #2 isn't in the list yet, #1 is. free #2 alias. */
+ printf("Deleting nick alias %s (#2).\n", na->nick);
+ delnick(na, 1); /* free()s the alias without touching the list since na isn't in the list */
+ } else if (input[0] == '2') { /* get alias #1 out of the list, then free() it, then add #2 to the list */
+ printf("Deleting nick alias %s (#1).\n", naptr->nick);
+ naptr->nc->aliascount--; /* tell the core it has one alias less */
+ delnick(naptr, 0); /* removes the alias from the list and free()s it */
+ na->nc = ncptr;
+ na->nc->aliascount++;
+ index = HASH(na->nick);
+ for (prev = NULL, ptr = nalists[index]; ptr && mystricmp(ptr->nick, na->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;
+ } else {
+ printf("Invalid number, give us a valid one (1 or 2).\n");
+ goto waiting_for_input;
+ }
+ } /* not malformed */
+ } else { /* No collision, add the core pointer and put the alias in the list */
+ na->nc = findcore(s, 0);
+ if (!na->nc) {
+ printf("\n\n WARNING! Malformed database. No nickcore for nick %s, droping it.\n\n\n", na->nick);
+ delnick(na, 1);
+ } else {
+ na->nc->aliascount++;
+ index = HASH(na->nick);
+ for (prev = NULL, ptr = nalists[index]; ptr && mystricmp(ptr->nick, na->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;
+ }
+ }
+ free(s);
+ } /* getc_db() */
+ } /* for() loop */
+ close_db(f); /* End of section Ib */
+ } else
+ nonick = 1;
+ }
+
+ /* CLEAN THE CORES */
+
+ for (i = 0; i < 1024; i++) {
+ for (nc = nclists[i]; nc; nc = ncnext) {
+ ncnext = nc->next;
+ if (nc->aliascount < 1) {
+ printf("Deleting core %s (%s).\n", nc->display, nc->email);
+ delcore(nc);
+ }
+ }
+ }
+
+ /* Ic: Saving */
+ if (!nonick) {
+ if ((f = open_db_write("NickServ", NICK_DB_NEW, 14))) {
+
+ NickAlias *na;
+ NickCore *nc;
+ char **access;
+ Memo *memos;
+ int i, j;
+
+ /* Nick cores */
+ 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_buffer(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) */
+
+ /* Nick aliases */
+ 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); /* End of section Ic */
+ printf("Nick merging done. New database saved as %s.\n", NICK_DB_NEW);
+ }
+ } /* End of section I */
+
+ /* Section II: Chans */
+ /* IIa: First database */
+ if ((f = open_db_read("ChanServ", CHAN_DB_1, 16))) {
+ ChannelInfo *ci, **last, *prev;
+ int c;
+
+ printf("Trying to merge channels...\n");
+
+ for (i = 0; i < 256; i++) {
+ int16 tmp16;
+ int32 tmp32;
+ int n_levels;
+ char *s;
+ int n_ttb;
+ /* Unused variable - why? -GD
+ int J;
+ */
+
+ last = &chanlists[i];
+ prev = NULL;
+
+ while ((c = getc_db(f)) == 1) {
+ int j;
+
+ if (c != 1) {
+ printf("Invalid format in %s.\n", CHAN_DB_1);
+ exit(0);
+ }
+
+ ci = calloc(sizeof(ChannelInfo), 1);
+ *last = ci;
+ last = &ci->next;
+ ci->prev = prev;
+ prev = ci;
+ READ(read_buffer(ci->name, f));
+ READ(read_string(&ci->founder, f));
+ READ(read_string(&ci->successor, f));
+ READ(read_buffer(ci->founderpass, f));
+ READ(read_string(&ci->desc, f));
+ if (!ci->desc)
+ ci->desc = strdup("");
+ READ(read_string(&ci->url, f));
+ READ(read_string(&ci->email, f));
+ READ(read_int32(&tmp32, f));
+ ci->time_registered = tmp32;
+ READ(read_int32(&tmp32, f));
+ ci->last_used = tmp32;
+ READ(read_string(&ci->last_topic, f));
+ READ(read_buffer(ci->last_topic_setter, f));
+ READ(read_int32(&tmp32, f));
+ ci->last_topic_time = tmp32;
+ READ(read_uint32(&ci->flags, f));
+ /* Temporary flags cleanup */
+ ci->flags &= ~0x80000000;
+ READ(read_string(&ci->forbidby, f));
+ READ(read_string(&ci->forbidreason, f));
+ READ(read_int16(&tmp16, f));
+ ci->bantype = tmp16;
+ READ(read_int16(&tmp16, f));
+ n_levels = tmp16;
+ ci->levels = calloc(36 * sizeof(*ci->levels), 1);
+ for (j = 0; j < n_levels; j++) {
+ if (j < 36)
+ READ(read_int16(&ci->levels[j], f));
+ else
+ READ(read_int16(&tmp16, f));
+ }
+ READ(read_uint16(&ci->accesscount, f));
+ if (ci->accesscount) {
+ ci->access = calloc(ci->accesscount, sizeof(ChanAccess));
+ for (j = 0; j < ci->accesscount; j++) {
+ READ(read_uint16(&ci->access[j].in_use, f));
+ if (ci->access[j].in_use) {
+ READ(read_int16(&ci->access[j].level, f));
+ READ(read_string(&s, f));
+ if (s) {
+ ci->access[j].nc = findcore(s, 0);
+ free(s);
+ }
+ if (ci->access[j].nc == NULL)
+ ci->access[j].in_use = 0;
+ READ(read_int32(&tmp32, f));
+ ci->access[j].last_seen = tmp32;
+ }
+ }
+ } else {
+ ci->access = NULL;
+ }
+ READ(read_uint16(&ci->akickcount, f));
+ if (ci->akickcount) {
+ ci->akick = calloc(ci->akickcount, sizeof(AutoKick));
+ for (j = 0; j < ci->akickcount; j++) {
+ SAFE(read_uint16(&ci->akick[j].flags, f));
+ if (ci->akick[j].flags & 0x0001) {
+ SAFE(read_string(&s, f));
+ if (ci->akick[j].flags & 0x0002) {
+ ci->akick[j].u.nc = findcore(s, 0);
+ if (!ci->akick[j].u.nc)
+ ci->akick[j].flags &= ~0x0001;
+ free(s);
+ } else {
+ ci->akick[j].u.mask = s;
+ }
+ SAFE(read_string(&s, f));
+ if (ci->akick[j].flags & 0x0001)
+ ci->akick[j].reason = s;
+ else if (s)
+ free(s);
+ SAFE(read_string(&s, f));
+ if (ci->akick[j].flags & 0x0001) {
+ ci->akick[j].creator = s;
+ } else if (s) {
+ free(s);
+ }
+ SAFE(read_int32(&tmp32, f));
+ if (ci->akick[j].flags & 0x0001)
+ ci->akick[j].addtime = tmp32;
+ }
+ }
+ } else {
+ ci->akick = NULL;
+ }
+ READ(read_uint32(&ci->mlock_on, f));
+ READ(read_uint32(&ci->mlock_off, f));
+ READ(read_uint32(&ci->mlock_limit, f));
+ READ(read_string(&ci->mlock_key, f));
+ READ(read_string(&ci->mlock_flood, f));
+ READ(read_string(&ci->mlock_redirect, f));
+ READ(read_int16(&ci->memos.memocount, f));
+ READ(read_int16(&ci->memos.memomax, f));
+ if (ci->memos.memocount) {
+ Memo *memos;
+ memos = calloc(sizeof(Memo) * ci->memos.memocount, 1);
+ ci->memos.memos = memos;
+ for (j = 0; j < ci->memos.memocount; j++, memos++) {
+ READ(read_uint32(&memos->number, f));
+ READ(read_uint16(&memos->flags, f));
+ READ(read_int32(&tmp32, f));
+ memos->time = tmp32;
+ READ(read_buffer(memos->sender, f));
+ READ(read_string(&memos->text, f));
+ }
+ }
+ READ(read_string(&ci->entry_message, f));
+
+ /* BotServ options */
+ READ(read_string(&ci->bi, f));
+ READ(read_int32(&tmp32, f));
+ ci->botflags = tmp32;
+ READ(read_int16(&tmp16, f));
+ n_ttb = tmp16;
+ ci->ttb = calloc(2 * 8, 1);
+ for (j = 0; j < n_ttb; j++) {
+ if (j < 8)
+ READ(read_int16(&ci->ttb[j], f));
+ else
+ READ(read_int16(&tmp16, f));
+ }
+ for (j = n_ttb; j < 8; j++)
+ ci->ttb[j] = 0;
+ READ(read_int16(&tmp16, f));
+ ci->capsmin = tmp16;
+ READ(read_int16(&tmp16, f));
+ ci->capspercent = tmp16;
+ READ(read_int16(&tmp16, f));
+ ci->floodlines = tmp16;
+ READ(read_int16(&tmp16, f));
+ ci->floodsecs = tmp16;
+ READ(read_int16(&tmp16, f));
+ ci->repeattimes = tmp16;
+
+ READ(read_uint16(&ci->bwcount, f));
+ if (ci->bwcount) {
+ ci->badwords = calloc(ci->bwcount, sizeof(BadWord));
+ for (j = 0; j < ci->bwcount; j++) {
+ SAFE(read_uint16(&ci->badwords[j].in_use, f));
+ if (ci->badwords[j].in_use) {
+ SAFE(read_string(&ci->badwords[j].word, f));
+ SAFE(read_uint16(&ci->badwords[j].type, f));
+ }
+ }
+ } else {
+ ci->badwords = NULL;
+ }
+ } /* getc_db() */
+ *last = NULL;
+ } /* for() loop */
+ close_db(f);
+ } else
+ nochan = 1;
+
+ /* IIb: Second database */
+ if (!nochan) {
+ if ((f = open_db_read("ChanServ", CHAN_DB_2, 16))) {
+ int c;
+
+ for (i = 0; i < 256; i++) {
+ int16 tmp16;
+ int32 tmp32;
+ int n_levels;
+ char *s;
+ int n_ttb;
+ /* Unused variables - why? -GD
+ char input[1024];
+ NickAlias *na;
+ int J;
+ */
+
+ while ((c = getc_db(f)) == 1) {
+ ChannelInfo *ci = NULL, *ciptr = NULL;
+ int j;
+
+ if (c != 1) {
+ printf("Invalid format in %s.\n", CHAN_DB_2);
+ exit(0);
+ }
+
+ ci = calloc(sizeof(ChannelInfo), 1);
+ READ(read_buffer(ci->name, f));
+ READ(read_string(&ci->founder, f));
+ READ(read_string(&ci->successor, f));
+ READ(read_buffer(ci->founderpass, f));
+ READ(read_string(&ci->desc, f));
+ if (!ci->desc)
+ ci->desc = strdup("");
+ READ(read_string(&ci->url, f));
+ READ(read_string(&ci->email, f));
+ READ(read_int32(&tmp32, f));
+ ci->time_registered = tmp32;
+ READ(read_int32(&tmp32, f));
+ ci->last_used = tmp32;
+ READ(read_string(&ci->last_topic, f));
+ READ(read_buffer(ci->last_topic_setter, f));
+ READ(read_int32(&tmp32, f));
+ ci->last_topic_time = tmp32;
+ READ(read_uint32(&ci->flags, f));
+ /* Temporary flags cleanup */
+ ci->flags &= ~0x80000000;
+ READ(read_string(&ci->forbidby, f));
+ READ(read_string(&ci->forbidreason, f));
+ READ(read_int16(&tmp16, f));
+ ci->bantype = tmp16;
+ READ(read_int16(&tmp16, f));
+ n_levels = tmp16;
+ ci->levels = calloc(36 * sizeof(*ci->levels), 1);
+ for (j = 0; j < n_levels; j++) {
+ if (j < 36)
+ READ(read_int16(&ci->levels[j], f));
+ else
+ READ(read_int16(&tmp16, f));
+ }
+ READ(read_uint16(&ci->accesscount, f));
+ if (ci->accesscount) {
+ ci->access = calloc(ci->accesscount, sizeof(ChanAccess));
+ for (j = 0; j < ci->accesscount; j++) {
+ READ(read_uint16(&ci->access[j].in_use, f));
+ if (ci->access[j].in_use) {
+ READ(read_int16(&ci->access[j].level, f));
+ READ(read_string(&s, f));
+ if (s) {
+ ci->access[j].nc = findcore(s, 0);
+ free(s);
+ }
+ if (ci->access[j].nc == NULL)
+ ci->access[j].in_use = 0;
+ READ(read_int32(&tmp32, f));
+ ci->access[j].last_seen = tmp32;
+ }
+ }
+ } else {
+ ci->access = NULL;
+ }
+ READ(read_uint16(&ci->akickcount, f));
+ if (ci->akickcount) {
+ ci->akick = calloc(ci->akickcount, sizeof(AutoKick));
+ for (j = 0; j < ci->akickcount; j++) {
+ SAFE(read_uint16(&ci->akick[j].flags, f));
+ if (ci->akick[j].flags & 0x0001) {
+ SAFE(read_string(&s, f));
+ if (ci->akick[j].flags & 0x0002) {
+ ci->akick[j].u.nc = findcore(s, 0);
+ if (!ci->akick[j].u.nc)
+ ci->akick[j].flags &= ~0x0001;
+ free(s);
+ } else {
+ ci->akick[j].u.mask = s;
+ }
+ SAFE(read_string(&s, f));
+ if (ci->akick[j].flags & 0x0001)
+ ci->akick[j].reason = s;
+ else if (s)
+ free(s);
+ SAFE(read_string(&s, f));
+ if (ci->akick[j].flags & 0x0001) {
+ ci->akick[j].creator = s;
+ } else if (s) {
+ free(s);
+ }
+ SAFE(read_int32(&tmp32, f));
+ if (ci->akick[j].flags & 0x0001)
+ ci->akick[j].addtime = tmp32;
+ }
+ }
+ } else {
+ ci->akick = NULL;
+ }
+ READ(read_uint32(&ci->mlock_on, f));
+ READ(read_uint32(&ci->mlock_off, f));
+ READ(read_uint32(&ci->mlock_limit, f));
+ READ(read_string(&ci->mlock_key, f));
+ READ(read_string(&ci->mlock_flood, f));
+ READ(read_string(&ci->mlock_redirect, f));
+ READ(read_int16(&ci->memos.memocount, f));
+ READ(read_int16(&ci->memos.memomax, f));
+ if (ci->memos.memocount) {
+ Memo *memos;
+ memos = calloc(sizeof(Memo) * ci->memos.memocount, 1);
+ ci->memos.memos = memos;
+ for (j = 0; j < ci->memos.memocount; j++, memos++) {
+ READ(read_uint32(&memos->number, f));
+ READ(read_uint16(&memos->flags, f));
+ READ(read_int32(&tmp32, f));
+ memos->time = tmp32;
+ READ(read_buffer(memos->sender, f));
+ READ(read_string(&memos->text, f));
+ }
+ }
+ READ(read_string(&ci->entry_message, f));
+
+ /* BotServ options */
+ READ(read_string(&ci->bi, f));
+ READ(read_int32(&tmp32, f));
+ ci->botflags = tmp32;
+ READ(read_int16(&tmp16, f));
+ n_ttb = tmp16;
+ ci->ttb = calloc(32, 1);
+ for (j = 0; j < n_ttb; j++) {
+ if (j < 8)
+ READ(read_int16(&ci->ttb[j], f));
+ else
+ READ(read_int16(&tmp16, f));
+ }
+ for (j = n_ttb; j < 8; j++)
+ ci->ttb[j] = 0;
+ READ(read_int16(&tmp16, f));
+ ci->capsmin = tmp16;
+ READ(read_int16(&tmp16, f));
+ ci->capspercent = tmp16;
+ READ(read_int16(&tmp16, f));
+ ci->floodlines = tmp16;
+ READ(read_int16(&tmp16, f));
+ ci->floodsecs = tmp16;
+ READ(read_int16(&tmp16, f));
+ ci->repeattimes = tmp16;
+
+ READ(read_uint16(&ci->bwcount, f));
+ if (ci->bwcount) {
+ ci->badwords = calloc(ci->bwcount, sizeof(BadWord));
+ for (j = 0; j < ci->bwcount; j++) {
+ SAFE(read_uint16(&ci->badwords[j].in_use, f));
+ if (ci->badwords[j].in_use) {
+ SAFE(read_string(&ci->badwords[j].word, f));
+ SAFE(read_uint16(&ci->badwords[j].type, f));
+ }
+ }
+ } else {
+ ci->badwords = NULL;
+ }
+ /* READING DONE */
+ ciptr = cs_findchan(ci->name);
+ if (ciptr) { /* COLLISION! ciptr = old = 1; ci = new = 2*/
+ char input[1024];
+
+ if (!preferoldest && !preferfirst && !prefersecond && !prefernewest) {
+ printf("Chan collision for channel %s:\n\n", ci->name);
+
+ printf("Owner of channel 1: %s (%s)\n", (ciptr->founder) ? ciptr->founder : "none", (ciptr->email) ? ciptr->email : "no valid email");
+ printf("Accesscount: %u\n", ciptr->accesscount);
+ if (ciptr->flags & 0x00000080) {
+ printf("Status: Channel is forbidden");
+ } else if (ciptr->flags & 0x00010000) {
+ printf("Status: Channel is suspended");
+ }
+ printf("Time registered: %s\n", ctime(&ciptr->time_registered));
+
+ printf("Owner of channel 2: %s (%s)\n", (ci->founder) ? ci->founder : "none", (ci->email) ? ci->email : "no valid email");
+ printf("Accesscount: %u\n", ci->accesscount);
+ if (ci->flags & 0x00000080) {
+ printf("Status: Channel is forbidden");
+ } else if (ci->flags & 0x00010000) {
+ printf("Status: Channel is suspended");
+ }
+ printf("Time registered: %s\n", ctime(&ci->time_registered));
+
+ printf("What channel do you want to keep? Enter the related number \"1\" or \"2\".\n");
+ }
+
+ if (preferoldest) {
+ input[0] = (ci->time_registered > ciptr->time_registered) ? '1' : '2';
+ } else if (prefernewest) {
+ input[0] = (ci->time_registered > ciptr->time_registered) ? '2' : '1';
+ } else if (preferfirst) {
+ input[0] = '1';
+ } else if (prefersecond) {
+ input[0] = '2';
+ } else {
+ waiting_for_input4:
+ scanf("%s", input);
+ }
+ if (input[0] == '1') { /* #2 isn't in the list yet, #1 is. -> free() #2 [ci] */
+ NickCore *nc = NULL;
+ int i;
+ printf("Deleting chan %s (#2).\n", ci->name);
+
+ if (ci->founder) {
+ nc = findcore(ci->founder, 0);
+ if (nc)
+ nc->channelcount--;
+ }
+ free(ci->desc);
+ free(ci->founder);
+ free(ci->successor);
+ if (ci->url)
+ free(ci->url);
+ if (ci->email)
+ free(ci->email);
+ if (ci->last_topic)
+ free(ci->last_topic);
+ if (ci->forbidby)
+ free(ci->forbidby);
+ if (ci->forbidreason)
+ free(ci->forbidreason);
+ if (ci->mlock_key)
+ free(ci->mlock_key);
+ if (ci->mlock_flood)
+ free(ci->mlock_flood);
+ if (ci->mlock_redirect)
+ free(ci->mlock_redirect);
+ if (ci->entry_message)
+ free(ci->entry_message);
+ if (ci->access)
+ free(ci->access);
+ for (i = 0; i < ci->akickcount; i++) {
+ if (!(ci->akick[i].flags & 0x0002) && 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);
+ if (ci->bi)
+ free(ci->bi);
+ free(ci);
+
+ } else if (input[0] == '2') { /* get #1 out of the list, free() it and add #2 to the list */
+ NickCore *nc = NULL;
+ printf("Deleting chan %s (#1).\n", ciptr->name);
+
+ if (ciptr->next)
+ ciptr->next->prev = ciptr->prev;
+ if (ciptr->prev)
+ ciptr->prev->next = ciptr->next;
+ else
+ chanlists[tolower(ciptr->name[1])] = ciptr->next;
+
+ if (ciptr->founder) {
+ nc = findcore(ciptr->founder, 0);
+ if (nc)
+ nc->channelcount--;
+ }
+ free(ciptr->desc);
+ if (ciptr->url)
+ free(ciptr->url);
+ if (ciptr->email)
+ free(ciptr->email);
+ if (ciptr->last_topic)
+ free(ciptr->last_topic);
+ if (ciptr->forbidby)
+ free(ciptr->forbidby);
+ if (ciptr->forbidreason)
+ free(ciptr->forbidreason);
+ if (ciptr->mlock_key)
+ free(ciptr->mlock_key);
+ if (ciptr->mlock_flood)
+ free(ciptr->mlock_flood);
+ if (ciptr->mlock_redirect)
+ free(ciptr->mlock_redirect);
+ if (ciptr->entry_message)
+ free(ciptr->entry_message);
+ if (ciptr->access)
+ free(ciptr->access);
+ for (i = 0; i < ciptr->akickcount; i++) {
+ if (!(ciptr->akick[i].flags & 0x0002) && ciptr->akick[i].u.mask)
+ free(ciptr->akick[i].u.mask);
+ if (ciptr->akick[i].reason)
+ free(ciptr->akick[i].reason);
+ if (ciptr->akick[i].creator)
+ free(ciptr->akick[i].creator);
+ }
+ if (ciptr->akick)
+ free(ciptr->akick);
+ if (ciptr->levels)
+ free(ciptr->levels);
+ if (ciptr->memos.memos) {
+ for (i = 0; i < ciptr->memos.memocount; i++) {
+ if (ciptr->memos.memos[i].text)
+ free(ciptr->memos.memos[i].text);
+ }
+ free(ciptr->memos.memos);
+ }
+ if (ciptr->ttb)
+ free(ciptr->ttb);
+ for (i = 0; i < ciptr->bwcount; i++) {
+ if (ciptr->badwords[i].word)
+ free(ciptr->badwords[i].word);
+ }
+ if (ciptr->badwords)
+ free(ciptr->badwords);
+ free(ciptr);
+
+ alpha_insert_chan(ci);
+
+ } else {
+ printf("Invalid number, give us a valid one (1 or 2).\n");
+ goto waiting_for_input4;
+ }
+ } else { /* no collision, put the chan into the list */
+ alpha_insert_chan(ci);
+ }
+ } /* getc_db() */
+ } /* for() loop */
+ close_db(f);
+ } else
+ nochan = 1;
+ }
+
+ /* IIc: Saving */
+ if (!nochan) {
+ if ((f = open_db_write("ChanServ", CHAN_DB_NEW, 16))) {
+ ChannelInfo *ci;
+ Memo *memos;
+ /* Unused variable - why? -GD
+ static time_t lastwarn = 0;
+ */
+
+ for (i = 0; i < 256; i++) {
+ int16 tmp16;
+ for (ci = chanlists[i]; ci; ci = ci->next) {
+ int j;
+ SAFE(write_int8(1, f));
+ SAFE(write_buffer(ci->name, f));
+ if (ci->founder)
+ SAFE(write_string(ci->founder, f));
+ else
+ SAFE(write_string(NULL, f));
+ if (ci->successor)
+ SAFE(write_string(ci->successor, 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 = 36;
+ SAFE(write_int16(tmp16, f));
+ for (j = 0; j < 36; 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 & 0x0001) {
+ if (ci->akick[j].flags & 0x0002)
+ 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));
+ SAFE(write_string(ci->mlock_flood, f));
+ SAFE(write_string(ci->mlock_redirect, f));
+ 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, f));
+ else
+ SAFE(write_string(NULL, f));
+ SAFE(write_int32(ci->botflags, f));
+ tmp16 = 8;
+ SAFE(write_int16(tmp16, f));
+ for (j = 0; j < 8; 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);
+ printf("Chan merging done. New database saved as %s.\n", CHAN_DB_NEW);
+ }
+ }
+
+ /* Section III: Bots */
+ /* IIIa: First database */
+ if ((f = open_db_read("Botserv", BOT_DB_1, 10))) {
+ BotInfo *bi;
+ int c;
+ int32 tmp32;
+ int16 tmp16;
+
+ printf("Trying to merge bots...\n");
+
+ while ((c = getc_db(f)) == 1) {
+ if (c != 1) {
+ printf("Invalid format in %s.\n", BOT_DB_1);
+ exit(0);
+ }
+
+ bi = calloc(sizeof(BotInfo), 1);
+ READ(read_string(&bi->nick, f));
+ READ(read_string(&bi->user, f));
+ READ(read_string(&bi->host, f));
+ READ(read_string(&bi->real, f));
+ SAFE(read_int16(&tmp16, f));
+ bi->flags = tmp16;
+ READ(read_int32(&tmp32, f));
+ bi->created = tmp32;
+ READ(read_int16(&tmp16, f));
+ bi->chancount = tmp16;
+ insert_bot(bi);
+ }
+ } else
+ nobot = 1;
+
+ /* IIIb: Second database */
+ if (!nobot) {
+ if ((f = open_db_read("Botserv", BOT_DB_2, 10))) {
+ BotInfo *bi, *biptr;
+ int c;
+ int32 tmp32;
+ int16 tmp16;
+ char input[1024];
+
+ while ((c = getc_db(f)) == 1) {
+ if (c != 1) {
+ printf("Invalid format in %s.\n", BOT_DB_2);
+ exit(0);
+ }
+
+ bi = calloc(sizeof(BotInfo), 1);
+ READ(read_string(&bi->nick, f));
+ READ(read_string(&bi->user, f));
+ READ(read_string(&bi->host, f));
+ READ(read_string(&bi->real, f));
+ SAFE(read_int16(&tmp16, f));
+ bi->flags = tmp16;
+ READ(read_int32(&tmp32, f));
+ bi->created = tmp32;
+ READ(read_int16(&tmp16, f));
+ bi->chancount = tmp16;
+ biptr = findbot(bi->nick);
+ if (biptr) { /* BOT COLLISION! #1 is biptr-> (db1), #2 is bi-> (db2) */
+ if (!preferoldest && !preferfirst && !prefersecond && !prefernewest) {
+ printf("Bot collision for botnick %s:\n\n", biptr->nick);
+ printf("Bot 1: %s@%s (%s) is assigned to %d chans\n", biptr->user, biptr->host, biptr->real, biptr->chancount);
+ printf("Time registered: %s\n", ctime(&biptr->created));
+ printf("Bot 2: %s@%s (%s) is assigned to %d chans\n", bi->user, bi->host, bi->real, bi->chancount);
+ printf("Time registered: %s\n", ctime(&bi->created));
+ printf("What bot do you want to keep? Enter the related bot number \"1\" or \"2\".\n");
+ }
+
+ if (preferoldest) {
+ input[0] = (biptr->created > bi->created) ? '1' : '2';
+ } else if (prefernewest) {
+ input[0] = (biptr->created > bi->created) ? '2' : '1';
+ } else if (preferfirst) {
+ input[0] = '2';
+ } else if (prefersecond) {
+ input[0] = '1';
+ } else {
+ waiting_for_input3:
+ scanf("%s", input);
+ }
+ if (input[0] == '1') { /* free() bot #2 (bi) */
+ printf("Deleting Bot %s!%s@%s (%s) (#2).\n", bi->nick, bi->user, bi->host, bi->real);
+ free(bi->nick);
+ free(bi->user);
+ free(bi->host);
+ free(bi->real);
+ free(bi);
+ } else if (input[0] == '2') { /* get bot #1 (biptr) out of the list, free() it and add #2 to the list */
+ printf("Deleting Bot %s!%s@%s (%s) (#1).\n", biptr->nick, biptr->user, biptr->host, biptr->real);
+ if (biptr->next)
+ biptr->next->prev = biptr->prev;
+ if (biptr->prev)
+ biptr->prev->next = biptr->next;
+ else
+ botlists[tolower(*biptr->nick)] = biptr->next;
+ free(biptr->nick);
+ free(biptr->user);
+ free(biptr->host);
+ free(biptr->real);
+ free(biptr);
+ insert_bot(bi);
+ } else {
+ printf("Invalid number, give us a valid one (1 or 2).\n");
+ goto waiting_for_input3;
+ }
+ } /* NO COLLISION (biptr) */
+ insert_bot(bi);
+ }
+ } else
+ nobot = 1;
+ }
+
+ /* IIIc: Saving */
+ if (!nobot) {
+ if ((f = open_db_write("Botserv", BOT_DB_NEW, 10))) {
+ BotInfo *bi;
+ 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);
+ printf("Bot merging done. New database saved as %s.\n", BOT_DB_NEW);
+ }
+ } /* End of section III */
+
+ /* Section IV: Hosts */
+ /* IVa: First database */
+ if ((f = open_db_read("HostServ", HOST_DB_1, 3))) {
+ HostCore *hc;
+ int c;
+ int32 tmp32;
+
+ printf("Trying to merge hosts...\n");
+
+ while ((c = getc_db(f)) == 1) {
+ if (c != 1) {
+ printf("Invalid format in %s.\n", HOST_DB_1);
+ exit(0);
+ }
+ hc = calloc(1, sizeof(HostCore));
+ READ(read_string(&hc->nick, f));
+ READ(read_string(&hc->vIdent, f));
+ READ(read_string(&hc->vHost, f));
+ READ(read_string(&hc->creator, f));
+ READ(read_int32(&tmp32, f));
+ hc->time = tmp32;
+ hc->next = firsthc;
+ if (firsthc)
+ firsthc->last = hc;
+ hc->last = NULL;
+ firsthc = hc;
+ }
+ } else
+ nohost = 1;
+
+ /* IVb: Second database */
+ if (!nohost) {
+ if ((f = open_db_read("HostServ", HOST_DB_2, 3))) {
+ HostCore *hc, *hcptr;
+ char input[1024];
+ int32 tmp32;
+ int c;
+ int collision = 0;
+
+ while ((c = getc_db(f)) == 1) {
+ if (c != 1) {
+ printf("Invalid format in %s.\n", HOST_DB_2);
+ exit(0);
+ }
+ collision = 0;
+ hc = calloc(1, sizeof(HostCore));
+ READ(read_string(&hc->nick, f));
+ READ(read_string(&hc->vIdent, f));
+ READ(read_string(&hc->vHost, f));
+ READ(read_string(&hc->creator, f));
+ READ(read_int32(&tmp32, f));
+ hc->time = tmp32;
+
+ for (hcptr = firsthc; hcptr; hcptr = hcptr->next) {
+ if (!mystricmp(hcptr->nick, hc->nick)) { /* COLLISION: #1 is from db1 (hcptr), #2 is from db2 (hc) */
+ collision++;
+ if (!preferoldest && !preferfirst && !prefersecond && !prefernewest) {
+ printf("vHost collision for nick %s:\n\n", hcptr->nick);
+ printf("vHost 1: %s (vIdent: %s)\n", hcptr->vHost, (hcptr->vIdent) ? hcptr->vIdent : "none");
+ printf("Time set: %s\n", ctime(&hcptr->time));
+ printf("vHost 2: %s (vIdent: %s)\n", hc->vHost, (hc->vIdent) ? hc->vIdent : "none");
+ printf("Time set: %s\n", ctime(&hc->time));
+ printf("What vhost do you want to keep? Enter the related number \"1\" or \"2\".\n");
+ }
+ if (preferoldest) {
+ input[0] = (hcptr->time > hc->time) ? '1' : '2';
+ } else if (prefernewest) {
+ input[0] = (hcptr->time > hc->time) ? '2' : '1';
+ } else if (preferfirst) {
+ input[0] = '1';
+ } else if (prefersecond) {
+ input[0] = '2';
+ } else {
+ waiting_for_input2:
+ scanf("%s", input);
+ }
+ if (input[0] == '2') { /* free() hcptr and get it out of the list, put hc into the list */
+ printf("Deleting vHost %s (vIdent: %s) for nick %s (#1).\n", hcptr->vHost, (hcptr->vIdent) ? hcptr->vIdent : "none", hcptr->nick);
+ if (hcptr->last)
+ hcptr->last->next = hcptr->next;
+ if (hcptr->next)
+ hcptr->next->last = hcptr->last;
+ free(hcptr->nick);
+ free(hcptr->vHost);
+ free(hcptr->vIdent);
+ free(hcptr->creator);
+ free(hcptr);
+ hc->next = firsthc;
+ if (firsthc)
+ firsthc->last = hc;
+ hc->last = NULL;
+ firsthc = hc;
+ } else if (input[0] == '1') { /* free() hc */
+ printf("Deleting vHost %s (vIdent: %s) for nick %s (#2).\n", hc->vHost, (hc->vIdent) ? hc->vIdent : "none", hc->nick);
+ free(hc->nick);
+ free(hc->vHost);
+ free(hc->vIdent);
+ free(hc->creator);
+ free(hc);
+ } else {
+ printf("Invalid number, give us a valid one (1 or 2).\n");
+ goto waiting_for_input2;
+ } /* input[0] */
+ } /* mystricmp */
+ } /* for (hcptr...) */
+ if (!collision) { /* No collision */
+ hc->next = firsthc;
+ if (firsthc)
+ firsthc->last = hc;
+ hc->last = NULL;
+ firsthc = hc;
+ }
+ } /* while */
+ } else
+ nohost = 1;
+ }
+
+ /* IVc: Saving */
+ if (!nohost) {
+ if ((f = open_db_write("HostServ", HOST_DB_NEW, 3))) {
+ HostCore *hcptr;
+ for (hcptr = firsthc; hcptr; hcptr = hcptr->next) {
+ SAFE(write_int8(1, f));
+ SAFE(write_string(hcptr->nick, f));
+ SAFE(write_string(hcptr->vIdent, f));
+ SAFE(write_string(hcptr->vHost, f));
+ SAFE(write_string(hcptr->creator, f));
+ SAFE(write_int32(hcptr->time, f));
+ }
+ SAFE(write_int8(0, f));
+ close_db(f);
+ printf("Host merging done. New database saved as %s.\n", HOST_DB_NEW);
+ }
+ } /* End of section IV */
+
+ /* MERGING DONE \o/ HURRAY! */
+
+ printf("\n\nMerging is now done. I give NO guarantee for your DBs.\n");
+ return 0;
+} /* End of main() */
+
+/* Open a database file for reading and check for the version */
+dbFILE *open_db_read(const char *service, const char *filename, int version)
+{
+ dbFILE *f;
+ FILE *fp;
+ int myversion;
+
+ f = calloc(sizeof(*f), 1);
+ if (!f) {
+ printf("Can't allocate memory for %s database %s.\n", service, filename);
+ exit(0);
+ }
+ strscpy(f->filename, filename, sizeof(f->filename));
+ f->mode = 'r';
+ fp = fopen(f->filename, "rb");
+ if (!fp) {
+ printf("Can't read %s database %s.\n", service, f->filename);
+ free(f);
+ return NULL;
+ }
+ f->fp = fp;
+ myversion = fgetc(fp) << 24 | fgetc(fp) << 16 | fgetc(fp) << 8 | fgetc(fp);
+ if (feof(fp)) {
+ printf("Error reading version number on %s: End of file detected.\n", f->filename);
+ exit(0);
+ } else if (myversion < version) {
+ printf("Unsuported database version (%d) on %s.\n", myversion, f->filename);
+ exit(0);
+ }
+ return f;
+}
+
+/* Open a database file for reading and check for the version */
+dbFILE *open_db_write(const char *service, const char *filename, int version)
+{
+ dbFILE *f;
+ int fd;
+
+ f = calloc(sizeof(*f), 1);
+ if (!f) {
+ printf("Can't allocate memory for %s database %s.\n", service, filename);
+ exit(0);
+ }
+ strscpy(f->filename, filename, sizeof(f->filename));
+ filename = f->filename;
+#ifndef _WIN32
+ unlink(filename);
+#else
+ DeleteFile(filename);
+#endif
+ f->mode = 'w';
+#ifndef _WIN32
+ fd = open(filename, O_WRONLY | O_CREAT | O_EXCL, 0666);
+#else
+ fd = open(filename, O_WRONLY | O_CREAT | O_EXCL | _O_BINARY, 0666);
+#endif
+ f->fp = fdopen(fd, "wb"); /* will fail and return NULL if fd < 0 */
+ if (!f->fp || !write_file_version(f, version)) {
+ printf("Can't write to %s database %s.\n", service, filename);
+ if (f->fp) {
+ fclose(f->fp);
+#ifndef _WIN32
+ unlink(filename);
+#else
+ DeleteFile(filename);
+#endif
+ }
+ free(f);
+ return NULL;
+ }
+ return f;
+}
+
+/* Close it */
+void close_db(dbFILE * f)
+{
+ fclose(f->fp);
+ free(f);
+}
+
+int read_int16(int16 * 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 read_uint16(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(int32 * 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 read_uint32(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_uint16(&len, f) < 0)
+ return -1;
+ if (len == 0) {
+ *ret = NULL;
+ return 0;
+ }
+ s = calloc(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;
+}
+
+NickCore *findcore(const char *nick, int unused)
+{
+ NickCore *nc;
+
+ for (nc = nclists[HASH(nick)]; nc; nc = nc->next) {
+ if (!mystricmp(nc->display, nick))
+ if ((nc->unused && unused) || (!nc->unused && !unused))
+ return nc;
+ }
+
+ return NULL;
+}
+
+NickAlias *findnick(const char *nick)
+{
+ NickAlias *na;
+
+ for (na = nalists[HASH(nick)]; na; na = na->next) {
+ if (!mystricmp(na->nick, nick))
+ return na;
+ }
+
+ return NULL;
+}
+
+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) {
+ printf("Error writing version number on %s.\n", f->filename);
+ exit(0);
+ }
+ return 1;
+}
+
+/* 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;
+}
+
+int mystricmp(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 delnick(NickAlias *na, int donttouchthelist)
+{
+ if (!donttouchthelist) {
+ /* 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;
+ }
+
+ /* free() us */
+ 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;
+}
+
+int delcore(NickCore *nc)
+{
+ int i;
+ /* 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);
+ 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;
+}
+
+void insert_bot(BotInfo * bi)
+{
+ BotInfo *ptr, *prev;
+
+ for (prev = NULL, ptr = botlists[tolower(*bi->nick)];
+ ptr != NULL && mystricmp(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;
+}
+
+BotInfo *findbot(char *nick)
+{
+ BotInfo *bi;
+
+ for (bi = botlists[tolower(*nick)]; bi; bi = bi->next)
+ if (!mystricmp(nick, bi->nick))
+ return bi;
+
+ return NULL;
+}
+
+ChannelInfo *cs_findchan(const char *chan)
+{
+ ChannelInfo *ci;
+ for (ci = chanlists[tolower(chan[1])]; ci; ci = ci->next) {
+ if (!mystricmp(ci->name, chan))
+ return ci;
+ }
+ return NULL;
+}
+
+void alpha_insert_chan(ChannelInfo * ci)
+{
+ ChannelInfo *ptr, *prev;
+ char *chan = ci->name;
+
+ for (prev = NULL, ptr = chanlists[tolower(chan[1])];
+ ptr != NULL && mystricmp(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;
+}
+
diff --git a/src/tools/epona2anope.c b/src/tools/epona2anope.c
new file mode 100644
index 000000000..d89be6d12
--- /dev/null
+++ b/src/tools/epona2anope.c
@@ -0,0 +1,856 @@
+/*
+ * IRC - Internet Relay Chat, epona2anope.c
+ * (C) Copyright 2005-2006, Florian Schulze (Certus)
+ *
+ * Based on the original code of Anope, (C) 2003-2005 Anope Team
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License (see it online
+ * at http://www.gnu.org/copyleft/gpl.html) as published by the Free
+ * Software Foundation;
+ *
+ * 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.
+ *
+ * This program tries to convert epona-1.4.15+ dbs to anope standard dbs.
+ * At the moment this only affects chanserv dbs.
+ *
+ * - Certus
+ * February 26, 2005
+ *
+ * Added win32 fix. Who needs that anyways? :P
+ * - Certus
+ * July 20, 2006
+ */
+
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <ctype.h>
+#include <time.h>
+
+#ifndef _WIN32
+#include <unistd.h>
+#else
+#include "sysconf.h"
+#include <windows.h>
+#endif
+
+/* Some SUN fixs */
+#ifdef __sun
+/* Solaris specific code, types that do not exist in Solaris'
+ * * sys/types.h
+ * **/
+#undef u_int8_t
+#undef u_int16_t
+#undef u_int32_t
+#undef u_int_64_t
+#define u_int8_t uint8_t
+#define u_int16_t uint16_t
+#define u_int32_t uint32_t
+#define u_int64_t uint64_t
+
+#ifndef INADDR_NONE
+#define INADDR_NONE (-1)
+#endif
+
+#endif
+
+
+/* CONFIGURATION BLOCK */
+
+#define CHAN_DB_EPONA "chan1.db"
+#define CHAN_DB_ANOPE "chan.db"
+
+/* END OF CONFIGURATION BLOCK */
+
+#ifndef _WIN32
+#define C_LBLUE "\033[1;34m"
+#define C_NONE "\033[m"
+#else
+#define C_LBLUE ""
+#define C_NONE ""
+#endif
+
+#define getc_db(f) (fgetc((f)->fp))
+#define HASH(nick) ((tolower((nick)[0])&31)<<5 | (tolower((nick)[1])&31))
+#define HASH2(chan) ((chan)[1] ? ((chan)[1]&31)<<5 | ((chan)[2]&31) : 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_db(f,buf,len) (fread((buf),1,(len),(f)->fp))
+#define write_db(f,buf,len) (fwrite((buf),1,(len),(f)->fp))
+#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 SAFE(x) do { \
+ if ((x) < 0) { \
+ printf("Error, the database is broken, trying to continue... no guarantee.\n"); \
+ } \
+} while (0)
+#define READ(x) do { \
+ if ((x) < 0) { \
+ printf("Error, the database is broken, trying to continue... no guarantee.\n"); \
+ exit(0); \
+ } \
+} while (0)
+
+typedef int16_t int16;
+typedef u_int16_t uint16;
+typedef int32_t int32;
+typedef u_int32_t uint32;
+typedef struct memo_ Memo;
+typedef struct dbFILE_ dbFILE;
+typedef struct nickalias_ NickAlias;
+typedef struct nickcore_ NickCore;
+typedef struct chaninfo_ ChannelInfo;
+typedef struct botinfo_ BotInfo;
+typedef struct badword_ BadWord;
+typedef struct hostcore_ HostCore;
+
+struct memo_ {
+ uint32 number; /* Index number -- not necessarily array position! */
+ int16 flags; /* Flags */
+ time_t time; /* When was it sent? */
+ char sender[32]; /* Name of the sender */
+ char *text;
+};
+
+struct dbFILE_ {
+ int mode; /* 'r' for reading, 'w' for writing */
+ FILE *fp; /* The normal file descriptor */
+ char filename[1024]; /* Name of the database file */
+};
+
+typedef struct {
+ int16 memocount; /* Current # of memos */
+ int16 memomax; /* Max # of memos one can hold*/
+ Memo *memos; /* Pointer to original memos */
+} MemoInfo;
+
+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;
+
+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;
+
+struct nickcore_ {
+ NickCore *next, *prev;
+
+ char *display; /* How the nick is displayed */
+ int unused; /* Used for nick collisions */
+};
+
+struct chaninfo_ {
+ ChannelInfo *next, *prev;
+
+ char name[64]; /* Channel name */
+ char *founder; /* Who registered the channel */
+ char *successor; /* Who gets the channel if the founder nick is dropped or expires */
+ char founderpass[32]; /* Channel password */
+ char *desc; /* Description */
+ char *url; /* URL */
+ char *email; /* Email address */
+ time_t time_registered; /* When was it registered */
+ time_t last_used; /* When was it used hte last time */
+ char *last_topic; /* Last topic on the channel */
+ char last_topic_setter[32]; /* Who set the last topic */
+ time_t last_topic_time; /* When the last topic was set */
+ uint32 flags; /* Flags */
+ char *forbidby; /* if forbidden: who did it */
+ char *forbidreason; /* if forbidden: why */
+ int16 bantype; /* Bantype */
+ int16 *levels; /* Access levels for commands */
+ int16 accesscount; /* # of pple with access */
+ ChanAccess *access; /* List of authorized users */
+ int16 akickcount; /* # of akicked pple */
+ 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 */
+ char *mlock_flood; /* NULL if no +f */
+ char *mlock_joinrate; /* NULL if no +j */
+ char *mlock_redirect; /* NULL if no +L */
+ char *entry_message; /* Notice sent on entering channel */
+ MemoInfo memos; /* Memos */
+ char *bi; /* Bot used on this channel */
+ uint32 botflags; /* BS_* below */
+ int16 *ttb; /* Times to ban for each kicker */
+ int16 bwcount; /* Badword count */
+ BadWord *badwords; /* For BADWORDS kicker */
+ int16 capsmin, capspercent; /* For CAPS kicker */
+ int16 floodlines, floodsecs; /* For FLOOD kicker */
+ int16 repeattimes; /* For REPEAT kicker */
+};
+
+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 */
+ time_t created; /* Birth date */
+ int16 chancount; /* Number of channels that use the bot. */
+};
+
+struct badword_ {
+ int16 in_use;
+ char *word;
+ int16 type;
+};
+
+dbFILE *open_db_write(const char *service, const char *filename, int version);
+dbFILE *open_db_read(const char *service, const char *filename, int version);
+NickCore *findcore(const char *nick, int version);
+ChannelInfo *cs_findchan(const char *chan);
+char *strscpy(char *d, const char *s, size_t len);
+int write_file_version(dbFILE * f, uint32 version);
+int mystricmp(const char *s1, const char *s2);
+int write_string(const char *s, dbFILE * f);
+int write_ptr(const void *ptr, dbFILE * f);
+int read_int16(int16 * ret, dbFILE * f);
+int read_uint16(uint16 * ret, dbFILE * f);
+int read_int32(int32 * ret, dbFILE * f);
+int read_uint32(uint32 * ret, dbFILE * f);
+int read_string(char **ret, dbFILE * f);
+int write_int16(uint16 val, dbFILE * f);
+int write_int32(uint32 val, dbFILE * f);
+int read_ptr(void **ret, dbFILE * f);
+void alpha_insert_chan(ChannelInfo * ci);
+void close_db(dbFILE * f);
+
+ChannelInfo *chanlists[256];
+NickCore *nclists[1024];
+
+int main(int argc, char *argv[])
+{
+ dbFILE *f;
+ int i;
+ long countr = 0, countw = 0;
+ /* Unused variables - why? -GD
+ NickCore *nc, *ncnext;
+ */
+
+ printf("\n"C_LBLUE"Epona to Anope DB converter by Certus"C_NONE"\n\n");
+
+ /* Section I: Reading */
+ if ((f = open_db_read("ChanServ", CHAN_DB_EPONA, 17))) {
+ ChannelInfo *ci, **last, *prev;
+ int c;
+
+ printf("Trying to convert channel database...\n");
+
+ for (i = 0; i < 256; i++) {
+ int16 tmp16;
+ int32 tmp32;
+ int n_levels;
+ char *s;
+ int n_ttb;
+ /* Unused variable - why? -GD
+ int J;
+ */
+
+ last = &chanlists[i];
+ prev = NULL;
+
+ while ((c = getc_db(f)) == 1) {
+ int j;
+
+ if (c != 1) {
+ printf("Invalid format in %s.\n", CHAN_DB_EPONA);
+ exit(0);
+ }
+
+ ci = calloc(sizeof(ChannelInfo), 1);
+ *last = ci;
+ last = &ci->next;
+ ci->prev = prev;
+ prev = ci;
+ READ(read_buffer(ci->name, f));
+ READ(read_string(&ci->founder, f));
+ READ(read_string(&ci->successor, f));
+ READ(read_buffer(ci->founderpass, f));
+ READ(read_string(&ci->desc, f));
+ if (!ci->desc)
+ ci->desc = strdup("");
+ READ(read_string(&ci->url, f));
+ READ(read_string(&ci->email, f));
+ READ(read_int32(&tmp32, f));
+ ci->time_registered = tmp32;
+ READ(read_int32(&tmp32, f));
+ ci->last_used = tmp32;
+ READ(read_string(&ci->last_topic, f));
+ READ(read_buffer(ci->last_topic_setter, f));
+ READ(read_int32(&tmp32, f));
+ ci->last_topic_time = tmp32;
+ READ(read_uint32(&ci->flags, f));
+ /* Temporary flags cleanup */
+ ci->flags &= ~0x80000000;
+ READ(read_string(&ci->forbidby, f));
+ READ(read_string(&ci->forbidreason, f));
+ READ(read_int16(&tmp16, f));
+ ci->bantype = tmp16;
+ READ(read_int16(&tmp16, f));
+ n_levels = tmp16;
+ ci->levels = calloc(36 * sizeof(*ci->levels), 1);
+ for (j = 0; j < n_levels; j++) {
+ if (j < 36)
+ READ(read_int16(&ci->levels[j], f));
+ else
+ READ(read_int16(&tmp16, f));
+ }
+ READ(read_int16(&ci->accesscount, f));
+ if (ci->accesscount) {
+ ci->access = calloc(ci->accesscount, sizeof(ChanAccess));
+ for (j = 0; j < ci->accesscount; j++) {
+ READ(read_int16(&ci->access[j].in_use, f));
+ if (ci->access[j].in_use) {
+ READ(read_int16(&ci->access[j].level, f));
+ READ(read_string(&s, f));
+ if (s) {
+ ci->access[j].nc = findcore(s, 0);
+ free(s);
+ }
+ if (ci->access[j].nc == NULL)
+ ci->access[j].in_use = 0;
+ READ(read_int32(&tmp32, f));
+ ci->access[j].last_seen = tmp32;
+ }
+ }
+ } else {
+ ci->access = NULL;
+ }
+ READ(read_int16(&ci->akickcount, f));
+ if (ci->akickcount) {
+ ci->akick = calloc(ci->akickcount, sizeof(AutoKick));
+ for (j = 0; j < ci->akickcount; j++) {
+ SAFE(read_int16(&ci->akick[j].flags, f));
+ if (ci->akick[j].flags & 0x0001) {
+ SAFE(read_string(&s, f));
+ if (ci->akick[j].flags & 0x0002) {
+ ci->akick[j].u.nc = findcore(s, 0);
+ if (!ci->akick[j].u.nc)
+ ci->akick[j].flags &= ~0x0001;
+ free(s);
+ } else {
+ ci->akick[j].u.mask = s;
+ }
+ SAFE(read_string(&s, f));
+ if (ci->akick[j].flags & 0x0001)
+ ci->akick[j].reason = s;
+ else if (s)
+ free(s);
+ SAFE(read_string(&s, f));
+ if (ci->akick[j].flags & 0x0001) {
+ ci->akick[j].creator = s;
+ } else if (s) {
+ free(s);
+ }
+ SAFE(read_int32(&tmp32, f));
+ if (ci->akick[j].flags & 0x0001)
+ ci->akick[j].addtime = tmp32;
+ }
+ }
+ } else {
+ ci->akick = NULL;
+ }
+ READ(read_uint32(&ci->mlock_on, f));
+ READ(read_uint32(&ci->mlock_off, f));
+ READ(read_uint32(&ci->mlock_limit, f));
+ READ(read_string(&ci->mlock_key, f));
+ READ(read_string(&ci->mlock_flood, f));
+ READ(read_string(&ci->mlock_joinrate, f));
+ READ(read_string(&ci->mlock_redirect, f));
+ READ(read_int16(&ci->memos.memocount, f));
+ READ(read_int16(&ci->memos.memomax, f));
+ if (ci->memos.memocount) {
+ Memo *memos;
+ memos = calloc(sizeof(Memo) * ci->memos.memocount, 1);
+ ci->memos.memos = memos;
+ for (j = 0; j < ci->memos.memocount; j++, memos++) {
+ READ(read_uint32(&memos->number, f));
+ READ(read_int16(&memos->flags, f));
+ READ(read_int32(&tmp32, f));
+ memos->time = tmp32;
+ READ(read_buffer(memos->sender, f));
+ READ(read_string(&memos->text, f));
+ }
+ }
+ READ(read_string(&ci->entry_message, f));
+
+ /* BotServ options */
+ READ(read_string(&ci->bi, f));
+ READ(read_int32(&tmp32, f));
+ ci->botflags = tmp32;
+ READ(read_int16(&tmp16, f));
+ n_ttb = tmp16;
+ ci->ttb = calloc(2 * 8, 1);
+ for (j = 0; j < n_ttb; j++) {
+ if (j < 8)
+ READ(read_int16(&ci->ttb[j], f));
+ else
+ READ(read_int16(&tmp16, f));
+ }
+ for (j = n_ttb; j < 8; j++)
+ ci->ttb[j] = 0;
+ READ(read_int16(&tmp16, f));
+ ci->capsmin = tmp16;
+ READ(read_int16(&tmp16, f));
+ ci->capspercent = tmp16;
+ READ(read_int16(&tmp16, f));
+ ci->floodlines = tmp16;
+ READ(read_int16(&tmp16, f));
+ ci->floodsecs = tmp16;
+ READ(read_int16(&tmp16, f));
+ ci->repeattimes = tmp16;
+
+ READ(read_int16(&ci->bwcount, f));
+ if (ci->bwcount) {
+ ci->badwords = calloc(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;
+ }
+ countr++;
+ } /* getc_db() */
+ *last = NULL;
+ } /* for() loop */
+ close_db(f);
+ }
+
+ /* II: Saving */
+ {
+ if ((f = open_db_write("ChanServ", CHAN_DB_ANOPE, 16))) {
+ ChannelInfo *ci;
+ Memo *memos;
+ /* Unused variable - why? -GD
+ static time_t lastwarn = 0;
+ */
+
+ for (i = 0; i < 256; i++) {
+ int16 tmp16;
+ for (ci = chanlists[i]; ci; ci = ci->next) {
+ int j;
+ SAFE(write_int8(1, f));
+ SAFE(write_buffer(ci->name, f));
+ if (ci->founder)
+ SAFE(write_string(ci->founder, f));
+ else
+ SAFE(write_string(NULL, f));
+ if (ci->successor)
+ SAFE(write_string(ci->successor, 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 = 36;
+ SAFE(write_int16(tmp16, f));
+ for (j = 0; j < 36; 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 & 0x0001) {
+ if (ci->akick[j].flags & 0x0002)
+ 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));
+ SAFE(write_string(ci->mlock_flood, f));
+ SAFE(write_string(ci->mlock_redirect, f));
+ 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, f));
+ else
+ SAFE(write_string(NULL, f));
+ SAFE(write_int32(ci->botflags, f));
+ tmp16 = 8;
+ SAFE(write_int16(tmp16, f));
+ for (j = 0; j < 8; 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));
+ }
+ }
+ countw++;
+ } /* for (chanlists[i]) */
+ SAFE(write_int8(0, f));
+ } /* for (i) */
+ close_db(f);
+ printf("%ld channels read, %ld channels written. New database saved as %s.\n", countr, countw, CHAN_DB_ANOPE);
+ }
+ }
+
+ printf("\n\nConverting is now done.\n");
+ return 0;
+} /* End of main() */
+
+/* Open a database file for reading and check for the version */
+dbFILE *open_db_read(const char *service, const char *filename, int version)
+{
+ dbFILE *f;
+ FILE *fp;
+ int myversion;
+
+ f = calloc(sizeof(*f), 1);
+ if (!f) {
+ printf("Can't allocate memory for %s database %s.\n", service, filename);
+ exit(0);
+ }
+ strscpy(f->filename, filename, sizeof(f->filename));
+ f->mode = 'r';
+ fp = fopen(f->filename, "rb");
+ if (!fp) {
+ printf("Can't read %s database %s.\n", service, f->filename);
+ free(f);
+ return NULL;
+ }
+ f->fp = fp;
+ myversion = fgetc(fp) << 24 | fgetc(fp) << 16 | fgetc(fp) << 8 | fgetc(fp);
+ if (feof(fp)) {
+ printf("Error reading version number on %s: End of file detected.\n", f->filename);
+ exit(0);
+ } else if (myversion < version) {
+ printf("Unsuported database version (%d) on %s.\n", myversion, f->filename);
+ exit(0);
+ }
+ return f;
+}
+
+/* Open a database file for reading and check for the version */
+dbFILE *open_db_write(const char *service, const char *filename, int version)
+{
+ dbFILE *f;
+ int fd;
+
+ f = calloc(sizeof(*f), 1);
+ if (!f) {
+ printf("Can't allocate memory for %s database %s.\n", service, filename);
+ exit(0);
+ }
+ strscpy(f->filename, filename, sizeof(f->filename));
+ filename = f->filename;
+#ifndef _WIN32
+ unlink(filename);
+#else
+ DeleteFile(filename);
+#endif
+ f->mode = 'w';
+#ifndef _WIN32
+ fd = open(filename, O_WRONLY | O_CREAT | O_EXCL, 0666);
+#else
+ fd = open(filename, O_WRONLY | O_CREAT | O_EXCL | _O_BINARY, 0666);
+#endif
+ f->fp = fdopen(fd, "wb"); /* will fail and return NULL if fd < 0 */
+ if (!f->fp || !write_file_version(f, version)) {
+ printf("Can't write to %s database %s.\n", service, filename);
+ if (f->fp) {
+ fclose(f->fp);
+#ifndef _WIN32
+ unlink(filename);
+#else
+ DeleteFile(filename);
+#endif
+ }
+ free(f);
+ return NULL;
+ }
+ return f;
+}
+
+/* Close it */
+void close_db(dbFILE * f)
+{
+ fclose(f->fp);
+ free(f);
+}
+
+int read_int16(int16 * 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 read_uint16(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(int32 * 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 read_uint32(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_uint16(&len, f) < 0)
+ return -1;
+ if (len == 0) {
+ *ret = NULL;
+ return 0;
+ }
+ s = calloc(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;
+}
+
+NickCore *findcore(const char *nick, int unused)
+{
+ NickCore *nc;
+
+ for (nc = nclists[HASH(nick)]; nc; nc = nc->next) {
+ if (!mystricmp(nc->display, nick))
+ if ((nc->unused && unused) || (!nc->unused && !unused))
+ return nc;
+ }
+
+ return NULL;
+}
+
+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) {
+ printf("Error writing version number on %s.\n", f->filename);
+ exit(0);
+ }
+ return 1;
+}
+
+/* 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;
+}
+
+int mystricmp(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;
+}
+
+ChannelInfo *cs_findchan(const char *chan)
+{
+ ChannelInfo *ci;
+ for (ci = chanlists[tolower(chan[1])]; ci; ci = ci->next) {
+ if (!mystricmp(ci->name, chan))
+ return ci;
+ }
+ return NULL;
+}
+
+void alpha_insert_chan(ChannelInfo * ci)
+{
+ ChannelInfo *ptr, *prev;
+ char *chan = ci->name;
+
+ for (prev = NULL, ptr = chanlists[tolower(chan[1])];
+ ptr != NULL && mystricmp(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;
+}
+
diff --git a/src/tools/smtp.h b/src/tools/smtp.h
new file mode 100644
index 000000000..7a30cc0fe
--- /dev/null
+++ b/src/tools/smtp.h
@@ -0,0 +1,130 @@
+/*
+ *
+ * (C) 2003-2008 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 SMTP_H
+#define SMTP_H
+
+/*************************************************************************/
+
+/* Some Linux boxes (or maybe glibc includes) require this for the
+ * prototype of strsignal(). */
+#define _GNU_SOURCE
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* Windows does not have:
+ * unistd.h, grp.h,
+ * netdb.h, netinet/in.h,
+ * sys/socket.h, sys/time.h
+ * Windows requires:
+ * winsock.h
+ * -- codemastr
+ */
+
+#ifndef _WIN32
+#include <unistd.h>
+#endif
+
+#include <signal.h>
+#include <time.h>
+#include <errno.h>
+#include <limits.h>
+
+#ifndef _WIN32
+#include <netdb.h>
+#include <netinet/in.h>
+#include <sys/socket.h>
+#include <arpa/inet.h>
+#else
+#include <winsock.h>
+#include <windows.h>
+#endif
+
+#include <sys/types.h>
+
+#ifndef _WIN32
+#include <sys/time.h>
+#endif
+
+#ifdef _AIX
+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 socket(int, int, int);
+extern int connect(int, struct sockaddr *, int);
+# endif
+#endif /* _AIX */
+
+/* Some SUN fixs */
+#ifdef __sun
+/* Solaris specific code, types that do not exist in Solaris'
+ * * sys/types.h
+ * **/
+#ifndef INADDR_NONE
+#define INADDR_NONE (-1)
+#endif
+
+#endif
+
+
+#ifdef _WIN32
+#define PATH_MAX MAX_PATH
+#define snprintf _snprintf
+#endif
+
+
+/*************************************************************************/
+
+#ifdef _WIN32
+#include <winsock.h>
+typedef SOCKET ano_socket_t;
+#define ano_sockclose(fd) closesocket(fd)
+#define ano_sockread(fd, buf, len) recv(fd, buf, len, 0)
+#define ano_sockwrite(fd, buf, len) send(fd, buf, len, 0)
+#else
+typedef int ano_socket_t;
+#define ano_sockclose(fd) close(fd)
+#define ano_sockread(fd, buf, len) read(fd, buf, len)
+#define ano_sockwrite(fd, buf, len) write(fd, buf, len)
+#define SOCKET_ERROR -1
+#endif
+
+
+/* Data structures */
+struct smtp_header {
+ char *header;
+ struct smtp_header *next;
+};
+
+struct smtp_body_line {
+ char *line;
+ struct smtp_body_line *next;
+};
+
+struct smtp_message {
+ struct smtp_header *smtp_headers, *smtp_headers_tail;
+ struct smtp_body_line *smtp_body, *smtp_body_tail;
+ char *from;
+ char *to;
+ ano_socket_t sock;
+};
+
+struct smtp_message mail;
+
+/* set this to 1 if you want to get a log otherwise it runs silent */
+int smtp_debug = 0;
+
+#endif /* SMTP_H */
diff --git a/src/users.c b/src/users.c
new file mode 100644
index 000000000..44faaf9d5
--- /dev/null
+++ b/src/users.c
@@ -0,0 +1,1125 @@
+/* Routines to maintain a list of online users.
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+
+#include "services.h"
+
+#define HASH(nick) (((nick)[0]&31)<<5 | ((nick)[1]&31))
+User *userlist[1024];
+
+#define HASH2(nick) (((nick)[0]&31)<<5 | ((nick)[1]&31))
+Uid *uidlist[1024];
+
+int32 usercnt = 0, opcnt = 0;
+uint32 maxusercnt = 0;
+time_t maxusertime;
+
+/*************************************************************************/
+/*************************************************************************/
+
+/* 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 */
+ user->nickTrack = NULL; /* ensure no default tracking nick */
+ 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;
+
+ /* Sanity check to make sure we don't segfault */
+ if (!user || !nick || !*nick) {
+ return;
+ }
+
+ 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;
+ }
+}
+
+/*************************************************************************/
+
+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(common_get_vident(user)) +
+ strlen(common_get_vhost(user)) + 2);
+ sprintf(user->na->last_usermask, "%s@%s", common_get_vident(user),
+ common_get_vhost(user));
+ }
+
+ if (debug)
+ alog("debug: %s changes its host to %s", user->nick,
+ common_get_vhost(user));
+}
+
+
+/*************************************************************************/
+
+/* 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);
+}
+
+/*************************************************************************/
+
+/* 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->vident)
+ free(user->vident);
+ user->vident = 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(common_get_vident(user)) +
+ strlen(common_get_vhost(user)) + 2);
+ sprintf(user->na->last_usermask, "%s@%s", common_get_vident(user),
+ common_get_vhost(user));
+ }
+ if (debug)
+ alog("debug: %s changes its username to %s", user->nick, username);
+}
+
+/*************************************************************************/
+
+/* Remove and free a User structure. */
+
+void delete_user(User * user)
+{
+ struct u_chanlist *c, *c2;
+ struct u_chaninfolist *ci, *ci2;
+ char *realname;
+
+ if (LogUsers) {
+ realname = normalizeBuffer(user->realname);
+ if (ircd->vhost) {
+ alog("LOGUSERS: %s (%s@%s => %s) (%s) left the network (%s).",
+ user->nick, user->username, user->host,
+ (user->vhost ? user->vhost : "(none)"),
+ realname, user->server->name);
+ } else {
+ alog("LOGUSERS: %s (%s@%s) (%s) left the network (%s).",
+ user->nick, user->username, user->host,
+ realname, user->server->name);
+ }
+ free(realname);
+ }
+ send_event(EVENT_USER_LOGOFF, 1, user->nick);
+
+ 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);
+ if (user->vhost)
+ free(user->vhost);
+ if (user->vident)
+ free(user->vident);
+ if (user->uid) {
+ free(user->uid);
+ }
+ Anope_Free(user->realname);
+ Anope_Free(user->hostip);
+ 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 (user->nickTrack)
+ free(user->nickTrack);
+
+ moduleCleanStruct(&user->moduleData);
+
+ 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;
+ if (ircd->vhost) {
+ if (user->vhost)
+ mem += strlen(user->vhost) + 1;
+ }
+ if (user->realname)
+ mem += strlen(user->realname) + 1;
+ if (user->server->name)
+ mem += strlen(user->server->name) + 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 (!nick || !*nick) {
+ if (debug) {
+ alog("debug: finduser() called with NULL values");
+ }
+ return NULL;
+ }
+
+ 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) -> 0x%p", nick, (void *) 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;
+ current = NULL;
+ 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;
+}
+
+User *find_byuid(const char *uid)
+{
+ User *u, *next;
+
+ if (!uid) {
+ if (debug)
+ alog("debug: find_byuid() called with NULL-value");
+ return NULL;
+ }
+
+ u = first_uid();
+ while (u) {
+ next = next_uid();
+ if (u->uid) {
+ if (!stricmp(uid, u->uid)) {
+ return u;
+ }
+ }
+ u = next;
+ }
+ return NULL;
+}
+
+static User *current_uid;
+static int next_index_uid;
+
+User *first_uid(void)
+{
+ next_index_uid = 0;
+ current_uid = NULL;
+ while (next_index_uid < 1024 && current_uid == NULL) {
+ current_uid = userlist[next_index_uid++];
+ }
+ if (debug >= 2) {
+ alog("debug: first_uid() returning %s %s",
+ current_uid ? current_uid->nick : "NULL (end of list)",
+ current_uid ? current_uid->uid : "");
+ }
+ return current_uid;
+}
+
+User *next_uid(void)
+{
+ if (current_uid)
+ current_uid = current_uid->next;
+ if (!current_uid && next_index_uid < 1024) {
+ while (next_index_uid < 1024 && current_uid == NULL)
+ current_uid = userlist[next_index_uid++];
+ }
+ if (debug >= 2) {
+ alog("debug: next_uid() returning %s %s",
+ current_uid ? current_uid->nick : "NULL (end of list)",
+ current_uid ? current_uid->uid : "");
+ }
+ return current_uid;
+}
+
+Uid *new_uid(const char *nick, char *uid)
+{
+ Uid *u, **list;
+
+ u = scalloc(sizeof(Uid), 1);
+ if (!nick || !uid) {
+ return NULL;
+ }
+ strscpy(u->nick, nick, NICKMAX);
+ list = &uidlist[HASH2(u->nick)];
+ u->next = *list;
+ if (*list)
+ (*list)->prev = u;
+ *list = u;
+ u->uid = sstrdup(uid);
+ return u;
+}
+
+Uid *find_uid(const char *nick)
+{
+ Uid *u;
+ int i;
+
+ for (i = 0; i < 1024; i++) {
+ for (u = uidlist[i]; u; u = u->next) {
+ if (!stricmp(nick, u->nick)) {
+ return u;
+ }
+ }
+ }
+ return NULL;
+}
+
+Uid *find_nickuid(const char *uid)
+{
+ Uid *u;
+ int i;
+
+ for (i = 0; i < 1024; i++) {
+ for (u = uidlist[i]; u; u = u->next) {
+ if (!stricmp(uid, u->uid)) {
+ return u;
+ }
+ }
+ }
+ return NULL;
+}
+
+/*************************************************************************/
+/*************************************************************************/
+
+/* 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,
+ uint32 ip, char *vhost, char *uid)
+{
+ User *user = NULL;
+
+ 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];
+ char *logrealname;
+
+ if (!*source) {
+ char ipbuf[16];
+ struct in_addr addr;
+
+ if (ircd->nickvhost) {
+ if (vhost) {
+ if (!strcmp(vhost, "*")) {
+ vhost = NULL;
+ if (debug)
+ alog("debug: new user�with no vhost in NICK command: %s", nick);
+ }
+ }
+ }
+
+ /* This is a new user; create a User structure for it. */
+ if (debug)
+ alog("debug: new user: %s", nick);
+
+ if (ircd->nickip) {
+ addr.s_addr = htonl(ip);
+ ntoa(addr, ipbuf, sizeof(ipbuf));
+ }
+
+
+ if (LogUsers) {
+ /**
+ * Ugly swap routine for Flop's bug :)
+ **/
+ if (realname) {
+ tmp = strchr(realname, '%');
+ while (tmp) {
+ *tmp = '-';
+ tmp = strchr(realname, '%');
+ }
+ }
+ logrealname = normalizeBuffer(realname);
+
+ /**
+ * End of ugly swap
+ **/
+
+ if (ircd->nickvhost) {
+ if (ircd->nickip) {
+ alog("LOGUSERS: %s (%s@%s => %s) (%s) [%s] connected to the network (%s).", nick, username, host, (vhost ? vhost : "none"), logrealname, ipbuf, server);
+ } else {
+ alog("LOGUSERS: %s (%s@%s => %s) (%s) connected to the network (%s).", nick, username, host, (vhost ? vhost : "none"), logrealname, server);
+ }
+ } else {
+ if (ircd->nickip) {
+ alog("LOGUSERS: %s (%s@%s) (%s) [%s] connected to the network (%s).", nick, username, host, logrealname, ipbuf, server);
+ } else {
+ alog("LOGUSERS: %s (%s@%s) (%s) connected to the network (%s).", nick, username, host, logrealname, server);
+ }
+ }
+ Anope_Free(logrealname);
+ }
+
+ /* 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, vhost, ipbuf)) {
+/* 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...
+ **/
+ /* don't akill on netmerges -Certus */
+ /* don't akill clients introduced by ulines. -Viper */
+ if (is_sync(findserver(servlist, server))
+ && checkDefCon(DEFCON_AKILL_NEW_CLIENTS) && !is_ulined(server)) {
+ 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, vhost, ipbuf)) {
+/* return NULL; */
+ }
+ }
+
+ /* SGLINE */
+ if (ircd->sgline) {
+ if (check_sgline(nick, realname))
+ return NULL;
+ }
+
+ /* SQLINE */
+ if (ircd->sqline) {
+ if (check_sqline(nick, 0))
+ return NULL;
+ }
+
+ /* SZLINE */
+ if (ircd->szline && ircd->nickip) {
+ if (check_szline(nick, ipbuf))
+ return NULL;
+ }
+ /* Now check for session limits */
+ if (LimitSessions && !is_ulined(server)
+ && !add_session(nick, host, ipbuf))
+ return NULL;
+
+ /* Allocate User structure and fill it in. */
+ user = new_user(nick);
+ user->username = sstrdup(username);
+ user->host = sstrdup(host);
+ user->server = findserver(servlist, server);
+ user->realname = sstrdup(realname);
+ user->timestamp = ts;
+ user->my_signon = time(NULL);
+ user->vhost = vhost ? sstrdup(vhost) : sstrdup(host);
+ if (uid) {
+ user->uid = sstrdup(uid); /* p10/ts6 stuff */
+ } else {
+ user->uid = NULL;
+ }
+ user->vident = sstrdup(username);
+ /* We now store the user's ip in the user_ struct,
+ * because we will use it in serveral places -- DrStein */
+ if (ircd->nickip) {
+ user->hostip = sstrdup(ipbuf);
+ } else {
+ user->hostip = NULL;
+ }
+
+ 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;
+
+ /* Start nick tracking if available */
+ if (NSNickTracking)
+ nsStartNickTracking(user);
+
+ } else if (svid != 1) {
+ /* Resets the svid because it doesn't match */
+ user->svid = 1;
+
+ anope_cmd_svid_umode(user->nick, user->timestamp);
+
+ } else {
+ user->svid = 1;
+ }
+ send_event(EVENT_NEWNICK, 1, nick);
+
+ } else {
+ /* An old user changing nicks. */
+ if (UseTS6)
+ user = find_byuid(source);
+
+ if (!user)
+ 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) {
+ logrealname = normalizeBuffer(user->realname);
+ if (ircd->vhost) {
+ alog("LOGUSERS: %s (%s@%s => %s) (%s) changed nick to %s (%s).", user->nick, user->username, user->host, (user->vhost ? user->vhost : "(none)"), logrealname, nick, user->server->name);
+ } else {
+ alog("LOGUSERS: %s (%s@%s) (%s) changed nick to %s (%s).",
+ user->nick, user->username, user->host, logrealname,
+ nick, user->server->name);
+ }
+ if (logrealname) {
+ free(logrealname);
+ }
+ }
+
+ 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);
+ send_event(EVENT_CHANGE_NICK, 1, 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 {
+ anope_cmd_nc_change(user);
+ }
+ }
+
+ if (ircd->sqline) {
+ if (!is_oper(user) && check_sqline(user->nick, 1))
+ return NULL;
+ }
+
+ } /* if (!*source) */
+
+ /* Check for nick tracking to bypass identification */
+ if (NSNickTracking && nsCheckNickTracking(user)) {
+ user->na->status |= NS_IDENTIFIED;
+ nc_changed = 0;
+ }
+
+ if (nc_changed || !nick_recognized(user)) {
+ if (validate_user(user))
+ check_memos(user);
+
+ } else {
+ if (nick_identified(user)) {
+ char tsbuf[16];
+ user->na->last_seen = time(NULL);
+
+ if (user->na->last_usermask)
+ free(user->na->last_usermask);
+ user->na->last_usermask =
+ smalloc(strlen(common_get_vident(user)) +
+ strlen(common_get_vhost(user)) + 2);
+ sprintf(user->na->last_usermask, "%s@%s",
+ common_get_vident(user), common_get_vhost(user));
+
+ snprintf(tsbuf, sizeof(tsbuf), "%lu",
+ (unsigned long int) user->timestamp);
+ anope_cmd_svid_umode2(user, tsbuf);
+
+ alog("%s: %s!%s@%s automatically identified for nick %s",
+ s_NickServ, user->nick, user->username,
+ user->host, user->nick);
+ }
+ }
+
+ /* Bahamut sets -r on every nick changes, so we must test it even if nc_changed == 0 */
+ if (ircd->check_nick_id) {
+ if (nick_identified(user)) {
+ char tsbuf[16];
+ snprintf(tsbuf, sizeof(tsbuf), "%lu",
+ (unsigned long int) user->timestamp);
+ anope_cmd_svid_umode3(user, tsbuf);
+ }
+ }
+
+ 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;
+
+ user = finduser(av[0]);
+ if (!user) {
+ alog("user: MODE %s for nonexistent nick %s: %s", av[1], av[0],
+ merge_args(ac, av));
+ return;
+ }
+
+ anope_set_umode(user, ac - 1, &av[1]);
+}
+
+/* Handle a UMODE2 command for a user.
+ * av[0] = modes
+ */
+
+void do_umode2(const char *source, int ac, char **av)
+{
+ User *user;
+
+ user = finduser(source);
+ if (!user) {
+ alog("user: MODE %s for nonexistent nick %s: %s", av[0], source,
+ merge_args(ac, av));
+ return;
+ }
+
+ anope_set_umode(user, ac, &av[0]);
+}
+
+/*************************************************************************/
+
+/* 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->nc->flags & NI_SUSPENDED))
+ && (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;
+ }
+ if (LimitSessions && !is_ulined(user->server->name)) {
+ del_session(user->host);
+ }
+ delete_user(user);
+}
+
+/*************************************************************************/
+
+/* Handle a KILL command.
+ * av[0] = nick being killed
+ * av[1] = reason
+ */
+
+void do_kill(char *nick, char *msg)
+{
+ User *user;
+ NickAlias *na;
+
+ user = finduser(nick);
+ if (!user) {
+ if (debug) {
+ alog("debug: KILL of nonexistent nick: %s", nick);
+ }
+ return;
+ }
+ if (debug) {
+ alog("debug: %s killed", nick);
+ }
+ if ((na = user->na) && (!(na->status & NS_VERBOTEN))
+ && (!(na->nc->flags & NI_SUSPENDED))
+ && (na->status & (NS_IDENTIFIED | NS_RECOGNIZED))) {
+ na->last_seen = time(NULL);
+ if (na->last_quit)
+ free(na->last_quit);
+ na->last_quit = *msg ? sstrdup(msg) : NULL;
+
+ }
+ if (LimitSessions && !is_ulined(user->server->name)) {
+ del_session(user->host);
+ }
+ delete_user(user);
+}
+
+/*************************************************************************/
+/*************************************************************************/
+
+/* Is the given user protected from kicks and negative mode changes? */
+
+int is_protected(User * user)
+{
+ if (ircd->protectedumode) {
+ return (user->mode & ircd->protectedumode);
+ } else {
+ return 0;
+ }
+}
+
+/*************************************************************************/
+
+/* Is the given nick an oper? */
+
+int is_oper(User * user)
+{
+ if (user) {
+ return (user->mode & anope_get_oper_mode());
+ } else {
+ return 0;
+ }
+}
+
+/*************************************************************************/
+/*************************************************************************/
+
+/* Is the given user ban-excepted? */
+int is_excepted(ChannelInfo * ci, User * user)
+{
+ if (!ci->c || !ircd->except)
+ return 0;
+
+ if (elist_match_user(ci->c->excepts, user))
+ return 1;
+
+ return 0;
+}
+
+/*************************************************************************/
+
+/* Is the given MASK ban-excepted? */
+int is_excepted_mask(ChannelInfo * ci, char *mask)
+{
+ if (!ci->c || !ircd->except)
+ return 0;
+
+ if (elist_match_mask(ci->c->excepts, mask, 0))
+ return 1;
+
+ return 0;
+}
+
+
+/*************************************************************************/
+
+/* 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;
+ char *nick, *username, *host;
+ int result;
+
+ if (!mask || !*mask) {
+ return 0;
+ }
+
+ mask2 = sstrdup(mask);
+
+ 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)
+ || match_wild_nocase(host, user->vhost));
+ } else {
+ result = match_wild_nocase(username, user->username)
+ && (match_wild_nocase(host, user->host)
+ || match_wild_nocase(host, user->vhost));
+ }
+
+ free(mask2);
+ return result;
+}
+
+
+/*************************************************************************/
+
+/* simlar to match_usermask, except here we pass the host as the IP */
+
+int match_userip(const char *mask, User * user, char *iphost)
+{
+ char *mask2;
+ char *nick, *username, *host;
+ int result;
+
+ if (!mask || !*mask) {
+ return 0;
+ }
+
+ mask2 = sstrdup(mask);
+
+ 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, iphost)
+ || match_wild_nocase(host, user->vhost));
+ } else {
+ result = match_wild_nocase(username, user->username)
+ && (match_wild_nocase(host, iphost)
+ || match_wild_nocase(host, user->vhost));
+ }
+
+ 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(common_get_vident(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(common_get_vhost(u)) + 3);
+ end += sprintf(end, "%s%s@",
+ (ulen <
+ (*(common_get_vident(u)) ==
+ '~' ? USERMAX + 1 : USERMAX) ? "*" : ""),
+ (*(common_get_vident(u)) ==
+ '~' ? common_get_vident(u) +
+ 1 : common_get_vident(u)));
+
+ if (strspn(common_get_vhost(u), "0123456789.") ==
+ strlen(common_get_vhost(u))
+ && (s = strchr(common_get_vhost(u), '.'))
+ && (s = strchr(s + 1, '.'))
+ && (s = strchr(s + 1, '.'))
+ && (!strchr(s + 1, '.'))) { /* IP addr */
+ s = sstrdup(common_get_vhost(u));
+ *strrchr(s, '.') = 0;
+
+ sprintf(end, "%s.*", s);
+ free(s);
+ } else {
+ if ((s = strchr(common_get_vhost(u), '.')) && strchr(s + 1, '.')) {
+ s = sstrdup(strchr(common_get_vhost(u), '.') - 1);
+ *s = '*';
+ strcpy(end, s);
+ free(s);
+ } else {
+ strcpy(end, common_get_vhost(u));
+ }
+ }
+ return mask;
+}
+
+/*************************************************************************/
diff --git a/src/win32.rc.template b/src/win32.rc.template
new file mode 100644
index 000000000..7f1ee7e32
--- /dev/null
+++ b/src/win32.rc.template
@@ -0,0 +1,90 @@
+///Microsoft Developer Studio generated resource script.
+//
+#include "../include/resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#define APSTUDIO_HIDDEN_SYMBOLS
+#include "windows.h"
+#undef APSTUDIO_HIDDEN_SYMBOLS
+#include "../include/resource.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// English (U.S.) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+#ifdef _WIN32
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+#pragma code_page(1252)
+#endif //_WIN32
+
+#ifndef _MAC
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+
+VER_ANOPE VERSIONINFO
+ FILEVERSION VERSION_COMMA
+ PRODUCTVERSION VERSION_COMMA
+ FILEFLAGSMASK 0x17L10
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x4L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904b0"
+ BEGIN
+ VALUE "CompanyName", "Anope Team"
+ VALUE "FileDescription", "Anope IRC Services"
+ VALUE "FileVersion", "VERSION_FULL"
+ VALUE "InternalName", "Anope"
+ VALUE "LegalCopyright", "Copyright (C) 2003-2008 Anope Team"
+ VALUE "OriginalFilename", "anope.exe"
+ VALUE "ProductName", "Anope"
+ VALUE "ProductVersion", "VERSION_DOTTED"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
+
+#endif // !_MAC
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Icon
+//
+
+// Icon with lowest ID value placed first to ensure application icon
+// remains consistent on all systems.
+ICON_APP ICON "anope-icon.ico"
+#endif // English (U.S.) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
diff --git a/version.log b/version.log
new file mode 100644
index 000000000..abe8a4dae
--- /dev/null
+++ b/version.log
@@ -0,0 +1,90 @@
+# (C) 2003-2008 Anope
+# Contact us at info@anope.org
+#
+# Please read COPYING and README for further details.
+#
+# $Id$
+
+VERSION_MAJOR="1"
+VERSION_MINOR="8"
+VERSION_PATCH="0"
+VERSION_EXTRA="-svn"
+VERSION_BUILD="1901"
+
+# $Log$
+#
+
+# BUILD : 1.8.0 (1899)
+# BUGS :
+# NOTES : 1.8.0 Release
+#
+# BUILD : 1.8.0 (1896)
+# BUGS :
+# NOTES : Updated VERSION_BUILD to SVN as opposed to implying full release
+#
+# BUILD : 1.8.0 (1860)
+# BUGS :
+# NOTES : Updated src/core/Makefile.win32 to include the building of enc_sha1.c
+#
+# BUILD : 1.8.0 (1859)
+# BUGS :
+# NOTES : Updated Windows Installer build script files (.nsi) to include enc_sha1.dll.
+#
+# BUILD : 1.8.0 (1854)
+# BUGS :
+# NOTES : Archived version.log to version.log.old for pre Sourceforge SVN revisions and archived docs/NEWS to docs/OLDNEWS
+#
+# BUILD : 1.8.0 (1853)
+# BUGS :
+# NOTES : Updated some documentation for 1.8 release.
+#
+# BUILD : 1.8.0 (1852)
+# BUGS :
+# NOTES : Manually updated version.log to reflect changes since migration to Sourceforge SVN.
+#
+# BUILD : 1.8.0 (1850)
+# BUGS : 966
+# NOTES : Fixed crashbug in db-merger.
+#
+# BUILD : 1.8.0 (1845)
+# BUGS : 966
+# NOTES : Backport better fix for umode +d bug.
+#
+# BUILD : 1.8.0 (1832)
+# BUGS : 970
+# NOTES : Implemented MySQL fixes from patch supplied in bug #970
+#
+# BUILD : 1.8.0 (1827)
+# BUGS : 966
+# NOTES : Fixed improper tracking of 'd' usermode on UnrealIRCd.
+#
+# BUILD : 1.8.0 (1826)
+# BUGS : 966
+# NOTES : Set proper svn:keywords on the entire 1.8 repository.. now modules should return a decent version reply again.
+#
+# BUILD : 1.8.0 (1825)
+# BUGS : 973
+# NOTES : Fixed ChanServ setting +ntsi when akicking a user from an otherwise empty channel. Those modes are legit when kicking from a forbidden/suspended channel, but shouldn't block users from joining regular chans.
+#
+# BUILD : 1.8.0 (1824)
+# BUGS :
+# NOTES : Fixed session count being decremented twice on NickServ GHOST.
+#
+# BUILD : 1.8.0 (1754)
+# BUGS :
+# NOTES : changed error message to be more descriptive...
+#
+# BUILD : 1.8.0 (1697)
+# BUGS : 964
+# NOTES : Fixed ns resend for the resending of verification codes
+#
+# BUILD : 1.8.0 (1692)
+# BUGS : 964
+# NOTES : Prevent ns_access getting screwed over if using mysql - TODO more checks of mysql.c need to be done for stuff like this...
+#
+# BUILD : 1.8.0 (1665)
+# BUGS : 965
+# NOTES : Add fix from Julien S. for bug #965, BotInfo::chancount was not being correctly initialised correctly, thanks :)
+#
+#
+# Migration to Sourceforge SVN has changed revision numbers. (Please see version.log.old)
diff --git a/version.log.old b/version.log.old
new file mode 100644
index 000000000..cd0c873fc
--- /dev/null
+++ b/version.log.old
@@ -0,0 +1,4968 @@
+# (C) 2003-2008 Anope
+# Contact us at info@anope.org
+#
+# Please read COPYING and README for furhter details.
+#
+# $Id: version.log.old 1853 2008-12-20 16:29:14Z sjaz $
+#
+#
+#
+# Migration to Sourceforge SVN has changed revision numbers. (Please see version.log)
+#
+#
+# BUILD : 1.8.0 (1489)
+# BUGS :
+# NOTES : Anope 1.8.0-rc1
+#
+# BUILD : 1.7.24 (1488)
+# BUGS : 959
+# NOTES : Updated russian language file. Update provided by Kein.
+#
+# BUILD : 1.7.24 (1487)
+# BUGS :
+# NOTES : Updated polish language file. Update provided by Syzmek.
+#
+# BUILD : 1.7.24 (1486)
+# BUGS :
+# NOTES : Fixed Changes from my last commit.
+#
+# BUILD : 1.7.24 (1485)
+# BUGS :
+# NOTES : Update Anope Credits
+#
+# BUILD : 1.7.24 (1484)
+# BUGS :
+# NOTES : Development Framework
+#
+# BUILD : 1.7.24 (1483)
+# BUGS :
+# NOTES : 1.7.24 Release
+#
+# BUILD : 1.7.23 (1482)
+# BUGS :
+# NOTES : Added entry to the FAQ regarding anopes max nicklength.
+#
+# BUILD : 1.7.23 (1481)
+# BUGS : 957
+# NOTES : Added a warning message in the logs regarding the combined usage of MySQL and skeleton mode.
+#
+# BUILD : 1.7.23 (1480)
+# BUGS :
+# NOTES : Updated german language file. Update provided by Han`.
+#
+# BUILD : 1.7.23 (1479)
+# BUGS : 958
+# NOTES : Fixed minor German langfile errors.
+#
+# BUILD : 1.7.23 (1478)
+# BUGS :
+# NOTES : updated langfile for pl.l
+#
+# BUILD : 1.7.23 (1477)
+# BUGS : 956
+# NOTES : Fixed OS STATS missing HostServ and showing disabled optional client(s).
+#
+# BUILD : 1.7.23 (1476)
+# BUGS :
+# NOTES : Fixed fuckup in earlier commit message... No more multitasking for me..
+#
+# BUILD : 1.7.23 (1475)
+# BUGS :
+# NOTES : Fixed compile warning in nickserv.c.
+#
+# BUILD : 1.7.23 (1474)
+# BUGS :
+# NOTES : Added missing SVN tag to version string.
+#
+# BUILD : 1.7.23 (1473)
+# BUGS : 940
+# NOTES : Rewrote MySQL password storing and loading to properly handle hashes. Note that Anope should not be started with UseRDB if the MySQL DB was dumped by an older version.
+#
+# BUILD : 1.7.23 (1472)
+# BUGS :
+# NOTES : Fixed language error in SASET AUTOOP help.
+#
+# BUILD : 1.7.23 (1471)
+# BUGS :
+# NOTES : Development Framework
+#
+# BUILD : 1.7.23 (1469)
+# BUGS :
+# NOTES : 1.7.23b Release (fixes encrypted nick.db issue on .23)
+#
+# BUILD : 1.7.23 (1468)
+# BUGS :
+# NOTES : Fixed fuckup in nickserv.c. Passwords should not be encrypted when loading an old nick.db, only when loading pre-nick.db.
+#
+# BUILD : 1.7.23 (1467)
+# BUGS :
+# NOTES : Development Framework
+#
+# BUILD : 1.7.23 (1465)
+# BUGS :
+# NOTES : Anope 1.7.23 Release
+#
+# BUILD : 1.7.22 (1464)
+# BUGS : 951
+# NOTES : Applied patch by katsklaw to add missing optional parameters to OS MODLIST help.
+#
+# BUILD : 1.7.22 (1463)
+# BUGS : 941
+# NOTES : Applied patches by chaz and katsklaw to fix issues with CS LOGOUT documentation.
+#
+# BUILD : 1.7.22 (1462)
+# BUGS : 940
+# NOTES : Fixed a bug in the database system causing certain nickserv password hashes to be stored incorrectly. Note that THIS BREAKS BACKWARDS COMPATIBILITY !!! As of now nick.db is no longer backwards compatible.
+#
+# BUILD : 1.7.22 (1461)
+# BUGS :
+# NOTES : Fixed possible compile warning in os_ignore_db.
+#
+# BUILD : 1.7.22 (1460)
+# BUGS : 948
+# NOTES : Corrected some errors in the OS IGNORE help.
+#
+# BUILD : 1.7.22 (1459)
+# BUGS : 948
+# NOTES : Added a supported module to provide a database back-end for OS IGNORE.
+#
+# BUILD : 1.7.22 (1458)
+# BUGS : 950
+# NOTES : Fixed an error in the help docs on SASET. Patch provided by chaz.
+#
+# BUILD : 1.7.22 (1457)
+# BUGS :
+# NOTES : Forgot Changes log. Autoformatters during commit ought to die.. last try to get process.c properly formatted in SVN.
+#
+# BUILD : 1.7.22 (1456)
+# BUGS : 948
+# NOTES : We now support real permanent ignoring. When ignoring a nick we now also use the hostmask if the user exists.
+#
+# BUILD : 1.7.22 (1455)
+# BUGS : 943
+# NOTES : Applied patch by katsklaw to fix a bug in HELP OPER.
+#
+# BUILD : 1.7.22 (1454)
+# BUGS :
+# NOTES : Applied patch by w00t to fix math bug in strnrepl().
+#
+# BUILD : 1.7.22 (1453)
+# BUGS : 947
+# NOTES : Fixed a buffer overflow in enc_sha1.
+#
+# BUILD : 1.7.22 (1452)
+# BUGS : 944
+# NOTES : Updated NSIS Build script and added anope.bat to properly remove windows menus after uninstall. Provided by chaz.
+#
+# BUILD : 1.7.22 (1451)
+# BUGS : 942
+# NOTES : We now enforce UnRestrictSAdmin on Unreal and InspIRCd.
+#
+# BUILD : 1.7.22 (1450)
+# BUGS :
+# NOTES : Fixed a number of remaining buffer overflows in NS and CS not addressed by previous commit.
+#
+# BUILD : 1.7.22 (1449)
+# BUGS :
+# NOTES : Applied a patch by w00t to fix possible buffer overflows in NS/CS REGISTER. As of now the max pass length is 31 instead of 32 characters.
+#
+# BUILD : 1.7.22 (1448)
+# BUGS :
+# NOTES : Applied patch by w00t to remove a pointer comparison on a non-ptr in cs_clear.c
+#
+# BUILD : 1.7.22 (1447)
+# BUGS :
+# NOTES : Applied patch by w00t to enable UMODE in insp
+#
+# BUILD : 1.7.22 (1446)
+# BUGS :
+# NOTES : Removed password truncating and fixed a crashbug in enc_none. This build still crashes on CS GETPASS on some systems though. Someone take a look at termination of ci->founderpass pls.
+#
+# BUILD : 1.7.22 (1445)
+# BUGS :
+# NOTES : Added missing entries for .22 release to Changes.lang.
+#
+# BUILD : 1.7.22 (1444)
+# BUGS :
+# NOTES : Fixed a typo in modules.c introduced in the last commit
+#
+# BUILD : 1.7.22 (1442)
+# BUGS :
+# NOTES : Development Framework
+#
+# BUILD : 1.7.22 (1440)
+# BUGS :
+# NOTES : Anope 1.7.22 release
+#
+# BUILD : 1.7.21 (1439)
+# BUGS :
+# NOTES : Fixed compiling on windows. We needed access to do_help_limited().
+#
+# BUILD : 1.7.21 (1438)
+# BUGS :
+# NOTES : Updated docs regarding myself and CIDR channellists.
+#
+# BUILD : 1.7.21 (1437)
+# BUGS : 939
+# NOTES : Applied patch by chaz to fix compile warning in os_clearmodes.c.
+#
+# BUILD : 1.7.21 (1436)
+# BUGS : 937
+# NOTES : Rewrote CLEAR OPS to have it send correct mode changes on all ircds.
+#
+# BUILD : 1.7.21 (1435)
+# BUGS : 935
+# NOTES : AKICK now respects ChanServ PEACE. Checks are performed before adding a nick/mask.
+#
+# BUILD : 1.7.21 (1434)
+# BUGS : 937
+# NOTES : Applied patch by Jobe to fix a bug with ratbox RESV caused by incorrect client introduction order.
+#
+# BUILD : 1.7.21 (1433)
+# BUGS :
+# NOTES : Help now handled by respective modules. Should fix compiling on windows.
+#
+# BUILD : 1.7.21 (1432)
+# BUGS :
+# NOTES : The newscount in help is now handled by modules instead of os_help.
+#
+# BUILD : 1.7.21 (1431)
+# BUGS :
+# NOTES : Fixes possible mismatches in entry_match() introduced in previous commit.
+#
+# BUILD : 1.7.21 (1430)
+# BUGS :
+# NOTES : Fixes a possible segfault in entry_match.
+#
+# BUILD : 1.7.21 (1429)
+# BUGS : 929
+# NOTES : Updated the help on ignore.
+#
+# BUILD : 1.7.21 (1428)
+# BUGS : 930
+# NOTES : Rewrote the ignore system to handle both nicks and masks
+# properly.
+#
+# BUILD : 1.7.21 (1427)
+# BUGS : 931
+# NOTES : Added anope build scripts for windows to /src/tools
+#
+# BUILD : 1.7.21 (1426)
+# BUGS : 876
+# NOTES : We now support CIDR in channel ban/invite/except lists. Introduces new CIDR capable generic lists system.
+#
+# BUILD : 1.7.21 (1425)
+# BUGS : 873
+# NOTES : We now show config variables in the help.
+#
+# BUILD : 1.7.21 (1424)
+# BUGS : 934
+# NOTES : Fixed bogus password being returned by enc_none when password was truncated.
+#
+# BUILD : 1.7.21 (1423)
+# BUGS : 932
+# NOTES : Fixed crashbug in cs_access.
+#
+# BUILD : 1.7.21 (1422)
+# BUGS : 927
+# NOTES : Fixes compiling on windows. We should define new variables above the code not in between.
+#
+# BUILD : 1.7.21 (1421)
+# BUGS : 879
+# NOTES : Updated help on ChanServ AKICK.
+#
+# BUILD : 1.7.21 (1420)
+# BUGS : 882
+# NOTES : Replaces the static count in logon&oper -news by a reference to NewsCount. Also fixes a booboo in my first commit.
+#
+# BUILD : 1.7.21 (1419)
+# BUGS : 875
+# NOTES : Fixes a number of minor language errors. Restricts access to svsnick, oline and umode to SRA as superadmin too requires SRA. Prevents them from showing up in SA help.
+#
+# BUILD : 1.7.21 (1418)
+# BUGS : 927
+# NOTES : Applied a patch by w00t to store the timestamp supplied by insp in FJOIN on channel creation
+#
+# BUILD : 1.7.21 (1417)
+# BUGS :
+# NOTES : Set SO_REUSEADDR on sock to prevent potential issues with bind() failing after a restart
+#
+# BUILD : 1.7.21 (1416)
+# BUGS : 880
+# NOTES : Changed CS GETKEY response to what the help for GS GETKEY says it should be
+#
+# BUILD : 1.7.21 (1415)
+# BUGS : 905
+# NOTES : Applied patch by Viper to add missing config file changes in Changes.conf
+#
+# BUILD : 1.7.21 (1414)
+# BUGS : 832 925
+# NOTES : Applied patch from Twitch to fix warnings in users.c. Also corrected a typo made in previous commit to add +f support to inspircd11.c, and corrected various mistakes in Changes and version.log
+#
+# BUILD : 1.7.21 (1413)
+# BUGS : 832
+# NOTES : Added support for channelmodes +efI and SVSHOLD to inspircd11.c
+#
+# BUILD : 1.7.21 (1412)
+# BUGS :
+# NOTES : Fixed the SVN ID/module version for inspircd11.c
+#
+# BUILD : 1.7.21 (1411)
+# BUGS : 887
+# NOTES : SGLINE and SQLINE support added for Hybrid
+#
+# BUILD : 1.7.21 (1410)
+# BUGS : 924
+# NOTES : Bug fixed where forbidden channels will appear in /list when inhabited by ChanServ
+#
+# BUILD : 1.7.21 (1409)
+# BUGS : 922
+# NOTES : Changes 'check' argument in calls to chan_set_modes() from cs_modes.c/do_util() to 2 to avoid calling chan_set_proper_modes()
+#
+# BUILD : 1.7.21 (1408)
+# BUGS :
+# NOTES : Set os_raw to show up as a 3rd party module...
+#
+# BUILD : 1.7.21 (1407)
+# BUGS :
+# NOTES : Removed pointless checks for buf existing, as they always will for non pointers.
+#
+# BUILD : 1.7.21 (1406)
+# BUGS : 883
+# NOTES : w00t removed more sa commands from inspircd, as they no longer work
+#
+# BUILD : 1.7.21 (1405)
+# BUGS : 883
+# NOTES : Applied patch from w00t to remove sajoin in inspircd.
+#
+# BUILD : 1.7.21 (1404)
+# BUGS : 917
+# NOTES : make install now runs install routine for modules subdirs also. Thanks Viper
+#
+# BUILD : 1.7.21 (1403)
+# BUGS : 916
+# NOTES : Fixes weird hs_setall behaviour (memory issues). Thanks Jan again
+#
+# BUILD : 1.7.21 (1402)
+# BUGS : 899
+# NOTES : DEFCON was akilling ulined servers clients. Thanks Jan
+#
+# BUILD : 1.7.21 (1401)
+# BUGS : 894
+# NOTES : Botserv replying with /(null). Thanks Jan
+#
+# BUILD : 1.7.21 (1400)
+# BUGS : 892
+# NOTES : Updated Deutch language file. Thanks to Christian
+#
+# BUILD : 1.7.21 (1399)
+# BUGS : 909
+# NOTES : Anope will not limit sessions for ulined servers. Thanks Jan
+#
+# BUILD : 1.7.21 (1398)
+# BUGS : 910
+# NOTES : EVENT_BOT_KICK not being send under all circumstances. Thanks to Jan Milants for reporting and fixing.
+#
+# BUILD : 1.7.21 (1395)
+# BUGS : 897
+# NOTES : install.js script now works properly on x64 machines
+#
+# BUILD : 1.7.21 (1393)
+# BUGS :
+# NOTES : Services Operators can now also use NickServ INFO ALL
+#
+# BUILD : 1.7.21 (1392)
+# BUGS :
+# NOTES : <Hal9000> fixes a potential crash in channels.c and does handle the TS on incoming FMODE in inspircd.11
+#
+# BUILD : 1.7.21 (1390)
+# BUGS : 881
+# NOTES : Fixed error in lang files related to NS SASET LANGUAGE
+#
+# BUILD : 1.7.21 (1389)
+# BUGS : 872
+# NOTES : Added NS SASET LANGUAGE
+#
+# BUILD : 1.7.21 (1388)
+# BUGS : N/A
+# NOTES : Modified NS LIST help messages to add SUSPENDED keyword.
+#
+# BUILD : 1.7.21 (1387)
+# BUGS : 869
+# NOTES : Added SUSPENDED to NS LIST keywords.
+#
+# BUILD : 1.7.21 (1386)
+# BUGS : 867
+# NOTES : Removed extra loop when parsing defcon modes.
+#
+# BUILD : 1.7.21 (1385)
+# BUGS : 862
+# NOTES : rdb_close() where rdb_open() is used in rdb_dbase() functions.
+#
+# BUILD : 1.7.21 (1384)
+# BUGS : 870
+# NOTES : Fixed segfault introduced y me trying to fix 870.
+#
+# BUILD : 1.7.21 (1383)
+# BUGS : 863
+# NOTES : Added missed debug message when HostServ is disabled.
+#
+# BUILD : 1.7.21 (1382)
+# BUGS : 870
+# NOTES : Fixed memory leak in cs_akick().
+#
+# BUILD : 1.7.21 (1381)
+# BUGS : 868
+# NOTES : Fixed memory leak in add_akill().
+#
+# BUILD : 1.7.21 (1380)
+# BUGS : 864
+# NOTES : Fixed configure script so it will complain about args.
+#
+# BUILD : 1.7.21 (1379)
+# BUGS : 856
+# NOTES : x86_64 generating improper SHA1 hash values. Thanks Johno Crawford ;)
+#
+# BUILD : 1.7.21 (1378)
+# BUGS : 861
+# NOTES : NickServ replying to SVSNICK command where OperServ must.
+#
+# BUILD : 1.7.21 (1377)
+# BUGS : 857
+# NOTES : Fixed the findchan() debug messages so you now have ubercool debug stuff when you enter debug level 3\!
+#
+# BUILD : 1.7.21 (1376)
+# BUGS : 859
+# NOTES : Fixed a small oddity in do_cmode()
+#
+# BUILD : 1.7.21 (1375)
+# BUGS : 858
+# NOTES : do_sjoin() called finduser(NULL)
+#
+# BUILD : 1.7.21 (1374)
+# BUGS : 820
+# NOTES : do_cmode() called without passing TS
+#
+# BUILD : 1.7.21 (1373)
+# BUGS : 855
+# NOTES : Fixed various issues in handling of DefCon modes with params
+#
+# BUILD : 1.7.21 (1372)
+# BUGS : 854
+# NOTES : Removed bs_fantasy_unban from core modules.
+#
+# BUILD : 1.7.21 (1371)
+# BUGS : 849
+# NOTES : Applied patch by Jan Milants to remove an excessive free in cs_akick
+#
+# BUILD : 1.7.21 (1370)
+# BUGS : 846
+# NOTES : Updated docs/WIN32.txt
+#
+# BUILD : 1.7.21 (1369)
+# BUGS : 685
+# NOTES : Fixed some small compiler warnings about buffer addresses always evaluating to true
+#
+# BUILD : 1.7.21 (1368)
+# BUGS : 853
+# NOTES : Updated config.guess and config.sub from upstream (GNU)
+#
+# BUILD : 1.7.21 (1367)
+# BUGS : 847
+# NOTES : Added missed NickServ HELP for RESEND command.
+#
+# BUILD : 1.7.21 (1366)
+# BUGS : 848
+# NOTES : No variable for NSReleaseTimeout in NICK_RECOVERED message
+#
+# BUILD : 1.7.21 (1365)
+# BUGS : 850, 851, 852
+# NOTES : Fixed several memory leaks reported by Trystan. Do not forget to free allocated memory!
+#
+# BUILD : 1.7.21 (1364)
+# BUGS : 844
+# NOTES : Removed broken version checking for windows media center edition and tablet edition; free(Jobe);
+#
+# BUILD : 1.7.21 (1363)
+# BUGS : 842
+# NOTES : Fixed yet another memory leak; it wass cs_akick this time
+#
+# BUILD : 1.7.21 (1362)
+# BUGS : 841
+# NOTES : Fixed memleaks in hs_setall
+#
+# BUILD : 1.7.21 (1361)
+# BUGS : 840
+# NOTES : Fixed a memory leak in cs_list
+#
+# BUILD : 1.7.21 (1360)
+# BUGS : 839
+# NOTES : Removed old code from cs_clear and fixed a memory leak in there as well
+#
+# BUILD : 1.7.21 (1359)
+# BUGS : 838
+# NOTES : Fixed various checks for LogBot in bs_say and bs_act
+#
+# BUILD : 1.7.21 (1358)
+# BUGS : 837
+# NOTES : Added a check for LogChannel when running with -logchan switch
+#
+# BUILD : 1.7.21 (1357)
+# BUGS : 836
+# NOTES : Fixed memleaks in os_clearmodes
+#
+# BUILD : 1.7.21 (1356)
+# BUGS : 835
+# NOTES : Fixed channel walking for do_mass_mode() and restore_unsynced_topics() to use firstchan/nextchan
+#
+# BUILD : 1.7.21 (1355)
+# BUGS : 834
+# NOTES : Fixed various oddities in ChanServ suspend code
+#
+# BUILD : 1.7.21 (1354)
+# BUGS : 833
+# NOTES : Ficed various oddities in moduleAddData()
+#
+# BUILD : 1.7.21 (1353)
+# BUGS :
+# NOTES : Rules for Changes: [[1]] A always goes before F (and anything else in between) [[2]] Anything within an A-block or F-block for 1 version is sorted ascending on the date (newer lines on the bottom) [[3]] Lines end with a period.
+#
+# BUILD : 1.7.21 (1352)
+# BUGS : N/A
+# NOTES : Fixed several language erros (missed strings, bad formatting, etc). Added a check for BotServs bots hostname too long.
+#
+# BUILD : 1.7.21 (1351)
+# BUGS : 831
+# NOTES : Fixed a bug in next_server() which skipped over all servers right away when passing -1 as param
+#
+# BUILD : 1.7.21 (1350)
+# BUGS : 828
+# NOTES : Forgot to update the other language files
+#
+# BUILD : 1.7.21 (1349)
+# BUGS : 828
+# NOTES : BOT_NOT_ASSIGNED language string error
+#
+# BUILD : 1.7.21 (1348)
+# BUGS : 825
+# NOTES : listnicks/listchans now shows if a nickname/channel is SUSPENDED.
+#
+# BUILD : 1.7.21 (1347)
+# BUGS : 827
+# NOTES : Re-assigned OS CHANLIST perms to Services Opers
+#
+# BUILD : 1.7.21 (1346)
+# BUGS : 826
+# NOTES : GPL required header added
+#
+# BUILD : 1.7.21 (1345)
+# BUGS :
+# NOTES : Updated copyright information
+#
+# BUILD : 1.7.21 (1344)
+# BUGS : 824
+# NOTES : Removed a random time(NULL) which was appended to bans set in check_kick()
+#
+# BUILD : 1.7.21 (1342)
+# BUGS :
+# NOTES : Development Framework
+#
+# BUILD : 1.7.21 (1341)
+# BUGS :
+# NOTES : Anope 1.7.21 release
+#
+# BUILD : 1.7.20 (1340)
+# BUGS :
+# NOTES : I agree
+#
+# BUILD : 1.7.20 (1339)
+# BUGS :
+# NOTES : mark is a retard when it comes to editing Changes :(
+#
+# BUILD : 1.7.20 (1338)
+# BUGS : 821
+# NOTES : Temporary patch for the crash in inspircd_cmd_mode()
+#
+# BUILD : 1.7.20 (1337)
+# BUGS :
+# NOTES : Updating something in NEWS, just because i want r1337 instead of letting mark have it >:(
+#
+# BUILD : 1.7.20 (1336)
+# BUGS :
+# NOTES : Fixed swapped prefixes for +a and +q on inspircd11
+#
+# BUILD : 1.7.20 (1335)
+# BUGS :
+# NOTES : Updated documentations as by Jobes patch and did some readability work on cs_enforce
+#
+# BUILD : 1.7.20 (1334)
+# BUGS :
+# NOTES : Fixed insp11 not parsing +q correctly in FJOIN
+#
+# BUILD : 1.7.20 (1333)
+# BUGS : 817
+# NOTES : Fixed users not being re-identified automatically after a netsplit on insp
+#
+# BUILD : 1.7.20 (1332)
+# BUGS :
+# NOTES : Updated Russian language file provided by Kein and added his Russian translations to bundled modules as well
+#
+# BUILD : 1.7.20 (1331)
+# BUGS : 816
+# NOTES : Applied patch by Jan Milants to fix EVENT_ACCESS_DEL being sent with NULL-param when using XOP
+#
+# BUILD : 1.7.20 (1330)
+# BUGS : 815
+# NOTES : Applied patch by Trystan to properly detect Windows Vista and Windows Server 2008
+#
+# BUILD : 1.7.20 (1329)
+# BUGS : 811
+# NOTES : Fixed databases not being saved when anope quit due to a connection error
+#
+# BUILD : 1.7.20 (1328)
+# BUGS : 812
+# NOTES : Fixed a bug where multiple grouped nicks and not all of them listed in ServicesRoot could result in services roots not becoming services root when using MySQL
+#
+# BUILD : 1.7.20 (1325)
+# BUGS :
+# NOTES : Development Framework
+#
+# BUILD : 1.7.20 (1324)
+# BUGS :
+# NOTES : 1.7.20 release
+#
+# BUILD : 1.7.19 (1323)
+# BUGS : 692
+# NOTES : Added RSQUIT support to the InspIRCd 1.1 protocol module
+#
+# BUILD : 1.7.19 (1322)
+# BUGS : 685
+# NOTES : Applied a patch by Jilles which should fix SJOIN not always sending the correct TS
+#
+# BUILD : 1.7.19 (1321)
+# BUGS : 810
+# NOTES : Fixed outdated module error strings in ModuleGetErrStr
+#
+# BUILD : 1.7.19 (1320)
+# BUGS :
+# NOTES : Commit of Changes from 1319
+#
+# BUILD : 1.7.19 (1319)
+# BUGS : 724
+# NOTES : Fixed the use of MODE instead of FMODE in the InspIRCd 1.1 protocol module
+#
+# BUILD : 1.7.19 (1318)
+# BUGS : 791
+# NOTES : Fixed inconsistent use of ACCESS events
+#
+# BUILD : 1.7.19 (1317)
+# BUGS :
+# NOTES : Updates some docs; by chaz
+#
+# BUILD : 1.7.19 (1316)
+# BUGS : 802
+# NOTES : Added support for MSVC++ 2008 Express (damn names.. gcc-4.4 would be so much shorter)
+#
+# BUILD : 1.7.19 (1315)
+# BUGS :
+# NOTES : Left an oops after the last commit :)
+#
+# BUILD : 1.7.19 (1314)
+# BUGS : 797
+# NOTES : Fixed malformed command for chgident in inspircd11.c
+#
+# BUILD : 1.7.19 (1313)
+# BUGS : 796
+# NOTES : Fixed unregistered users getting access level -1 instead of 0 so they could never get opped
+#
+# BUILD : 1.7.19 (1311)
+# BUGS : 804,805,806
+# NOTES : Applied the patches of my beer buddy.
+#
+# BUILD : 1.7.19 (1310)
+# BUGS : 794
+# NOTES : Fixes the segfault in inspircd11.c / anope_event_capab() on missing required modules.
+#
+# BUILD : 1.7.19 (1309)
+# BUGS : 793
+# NOTES : Fixed a typo in inspircd11.c where it checked for chgident.so
+#
+# BUILD : 1.7.19 (1308)
+# BUGS : 787
+# NOTES : Applied a patch by T fixing moduleGetConfigDirective disliking CRLF line-ends
+#
+# BUILD : 1.7.19 (1307)
+# BUGS : 788
+# NOTES : Fixed OS HELP OPER showing admin instead of root (OH NOES)
+#
+# BUILD : 1.7.19 (1306)
+# BUGS : 789
+# NOTES : Fixed Polish language reporting itself as English when switching to it
+#
+# BUILD : 1.7.19 (1305)
+# BUGS : 757
+# NOTES : Fixed mysql_config values only being tried to compile/link sources and not running the result to see if it actually works
+#
+# BUILD : 1.7.19 (1304)
+# BUGS : 782
+# NOTES : Fixed an undeclared identifier in the new code for cleaning up the modules dir on win32
+#
+# BUILD : 1.7.19 (1303)
+# BUGS : 703
+# NOTES : Fixed user being able to change channel modes on empty channels without permission (eg SECUREOPS)
+#
+# BUILD : 1.7.19 (1302)
+# BUGS :
+# NOTES : Minor style changes in Changes
+#
+# BUILD : 1.7.19 (1301)
+# BUGS : 780, 781
+# NOTES : [1] Removed extra bolds from OS HELP SET [2] Removed extra Limited to... messages from os_akill and
+# os_modload.
+#
+# BUILD : 1.7.19 (1300)
+# BUGS :
+# NOTES : Changed 2 // (C++-style) comments in /* (C-style) */ comments in src/misc.s and ran indent on the same file
+#
+# BUILD : 1.7.19 (1299)
+# BUGS :
+# NOTES : Added MySQL indexes to decrease the MySQL load during database operations
+#
+# BUILD : 1.7.19 (1298)
+# BUGS : N/A
+# NOTES : [1] Applied heinz patch to WIN32 docs [2] Corrected comment in chanserv.c
+#
+# BUILD : 1.7.19 (1297)
+# BUGS : N/A
+# NOTES : In the last commit, I forgot to store the just resolved IP in common_unban() so we wont need to
+# resolve the host again.
+#
+# BUILD : 1.7.19 (1296)
+# BUGS : N/A
+# NOTES : Since we now have u->hostip, lets use it in common_unban()
+#
+# BUILD : 1.7.19 (1295)
+# BUGS : N/A
+# NOTES : We now have hostip in user_ struct so we can use it where needed. We wont do host_resolve() unless
+# it is extremely necessary, coz we dont want to flood the nameserver.
+#
+# BUILD : 1.7.19 (1294)
+# BUGS : N/A
+# NOTES : in is_excepted() if we found the exception, break(). There is no point on continue exploring the
+# array. Also, I forgot to free hostip in my previous commit.
+#
+# BUILD : 1.7.19 (1293)
+# BUGS : 778
+# NOTES : is_excepted() now uses match_userip() also.
+#
+# BUILD : 1.7.19 (1292)
+# BUGS : 776
+# NOTES : Fixed wrong reply when deleting entries by number (akick, badwords)
+#
+# BUILD : 1.7.19 (1291)
+# BUGS : 774
+# NOTES : Unreals (3.2) SVSJOIN command now supports channel keys
+#
+# BUILD : 1.7.19 (1290)
+# BUGS : 723
+# NOTES : Anope now can except users from Session limit based on their IP.
+#
+# BUILD : 1.7.19 (1289)
+# BUGS : 768
+# NOTES : Fixed module runtime directory not always being cleaned up nicely
+#
+# BUILD : 1.7.19 (1288)
+# BUGS : 761
+# NOTES : Fixing up a comment from the last commit
+#
+# BUILD : 1.7.19 (1287)
+# BUGS : 761
+# NOTES : Fixed OperServ SGLINE to now remove trailing spaces from the mask... this is not 100% syntactically correct, but spaces on the end are not usually needed anyways
+#
+# BUILD : 1.7.19 (1286)
+# BUGS : 731
+# NOTES : Fixed TS6 UID generation
+#
+# BUILD : 1.7.19 (1285)
+# BUGS : 684, 772
+# NOTES : [1] Added InspIRCd11 vIdent support [2] InspIRCD11 protocol now uses SVSJOIN/PART instead of
+# SAJOIN/PART
+#
+# BUILD : 1.7.19 (1284)
+# BUGS : 770
+# NOTES : SuperAdmins now have a higher channel level than channel founders so they will always win from founders
+#
+# BUILD : 1.7.19 (1283)
+# BUGS : 773
+# NOTES : Patch provided by katsklaw: This patch makes us check commands existance before issuing and we scream like a girl if its
+# not.
+#
+# BUILD : 1.7.19 (1282)
+# BUGS : 729
+# NOTES : Changed the "Limited to ..." lines in help replies to automatically appended lines
+#
+# BUILD : 1.7.19 (1281)
+# BUGS :
+# NOTES : Reworded some stuffs in Changes
+#
+# BUILD : 1.7.19 (1280)
+# BUGS : 763
+# NOTES : Fixed bug in ptlink protocol where topic time wasnt being sent.
+#
+# BUILD : 1.7.19 (1279)
+# BUGS : 765
+# NOTES : Fixed bug when truncating passwords to PASSMAX with enc_none.
+#
+# BUILD : 1.7.19 (1278)
+# BUGS : 683, 767
+# NOTES : [1] typo in en_us.l [2] Provided by katsklaws patch: inspircd11 protocol now uses svshold.
+#
+# BUILD : 1.7.19 (1277)
+# BUGS : 759
+# NOTES : Added missed NS CONFIRM help.
+#
+# BUILD : 1.7.19 (1275)
+# BUGS : 753
+# NOTES : Services Admins and Services Opers can now be kicked by ChanServ.
+#
+# BUILD : 1.7.19 (1275)
+# BUGS : 747
+# NOTES : CS SET XOP can not be used if cs_xop is not loaded.
+#
+# BUILD : 1.7.19 (1274)
+# BUGS : 764
+# NOTES : Fixed firstuser/nextuser and first_uid/next_uid using the same globals thus being unable to be used at the same time
+#
+# BUILD : 1.7.19 (1273)
+# BUGS :
+# NOTES : Updated src/bin/am to now correctly work with multiversioned repositories as reported by svnversion
+#
+# BUILD : 1.7.19 (1272)
+# BUGS : N/A
+# NOTES : Patch provided by teh heinz: [1] Updated the WIN32.txt document a bit [2] Re-worded the CHAN_LEVELS_XOP string in en_us.l
+#
+# BUILD : 1.7.19 (1271)
+# BUGS :
+# NOTES : Fixed revision numbering in version.log
+#
+# BUILD : 1.7.19 (1270)
+# BUGS : 714
+# NOTES : Moved left settings for commands to core modules.
+#
+# BUILD : 1.7.19 (1269)
+# BUGS : 662
+# NOTES : Optimized akick and badwords lists, provided by Viper.
+#
+# BUILD : 1.7.19 (1268)
+# BUGS : 662
+# NOTES : badword counting fixed, and now the list is sorted also. fixed remaining bug in akick sorting.
+#
+# BUILD : 1.7.19 (1267)
+# BUGS : 662
+# NOTES : akick counts are now properly decressed. os_info now really uses status var. some module clean ups.
+#
+# BUILD : 1.7.19 (1266)
+# BUGS :
+# NOTES : Updated src/bin/am for now SVN host some more
+#
+# BUILD : 1.7.19 (1265)
+# BUGS :
+# NOTES : Updated copyright information
+#
+# BUILD : 1.7.19 (1264)
+# BUGS :
+# NOTES : Made an oops in the fix for bug 742 :) (wrong params passed to a function)
+#
+# BUILD : 1.7.19 (1263)
+# BUGS : 742
+# NOTES : Fixed inspircd11.c so it generates a fake capab parse call to enable things like NOQUIT... also ran indent on inspircd11.c
+#
+# BUILD : 1.7.19 (1262)
+# BUGS : 727
+# NOTES : Fixed DefConChanModes being re-set while being unset
+#
+# BUILD : 1.7.19 (1260)
+# BUGS : 734
+# NOTES : Fixed a false debug notice claiming the killed user did not exist when it was killed due to a session limit exceeded
+#
+# BUILD : 1.7.19 (1260)
+# BUGS :
+# NOTES : Updated FAQ to reflect the changes on wiki/site
+#
+# BUILD : 1.7.19 (1258)
+# BUGS :
+# NOTES : Quick fix to src/bin/am to make it work (sort of) again...
+#
+# BUILD : 1.7.19 (1258)
+# BUGS : 750
+# NOTES : Fixed CA_AUTODEOP not working anymore (since 1.7.9 or so probably)
+#
+# BUILD : 1.7.19 (1256)
+# BUGS :
+# NOTES : Moved the displaying of command infos on command add/remove to debug level 2 instead of 1
+#
+# BUILD : 1.7.19 (1255)
+# BUGS : 743
+# NOTES : Fixed various compile errors with `make strict`
+#
+# BUILD : 1.7.19 (1254)
+# BUGS : 741
+# NOTES : Fixed a possible buffer overflow in inspircd10.c
+#
+# BUILD : 1.7.19 (1253)
+# BUGS : 737
+# NOTES : Fixed GlobalOnCycle notices being sent to Anope itself and juped servers
+#
+# BUILD : 1.7.19 (1252)
+# BUGS : 729
+# NOTES : Fixed various access levels for oper commands
+#
+# BUILD : 1.7.19 (1251)
+# BUGS : 732
+# NOTES : Fixed /os MODINFO showing 'no information about module' when it was loaded but had no hooked commands
+#
+# BUILD : 1.7.19 (1250)
+# BUGS : 718
+# NOTES : Fixed the fact that we did not send a receive-notification for the SQUIT for a juped server
+#
+# BUILD : 1.7.19 (1249)
+# BUGS : 726
+# NOTES : Fixed some jupe stuff: when juping a currently non-existing server, it was still squitted and the globaloncycleup message was sent to newly juped servers
+#
+# BUILD : 1.7.19 (1248)
+# BUGS :
+# NOTES : Development Framework
+#
+# BUILD : 1.7.19 (1247)
+# BUGS :
+# NOTES : Anope 1.7.19 Release
+#
+# BUILD : 1.7.18 (1246)
+# BUGS :
+# NOTES : Fixed possible compile error with inspircd11 on win32
+#
+# BUILD : 1.7.18 (1245)
+# BUGS : 671
+# NOTES : NSDefKill can now only be enabled if UsePrivmsg is also enabled; NSDefKill is now used instead of UsePrivmsg to determine whether unregistered users receive PRIVMSGs or NOTICEs
+#
+# BUILD : 1.7.18 (1244)
+# BUGS : 713 719
+# NOTES : Corrected typo in rdb.c, added code in backup_databases() and remove_backups() to backup the prenick db, and added checks in remove_backups() for s_BotServ and s_HostServ being NULL
+#
+# BUILD : 1.7.18 (1243)
+# BUGS :
+# NOTES : Fixed a typo in example.conf
+#
+# BUILD : 1.7.18 (1242)
+# BUGS :
+# NOTES : Minor tweaks to the ns_noop_convert output
+#
+# BUILD : 1.7.18 (1241)
+# BUGS : 707
+# NOTES : Applied a patch by jilles to fix various charybdis and ts6 related issues
+#
+# BUILD : 1.7.18 (1240)
+# BUGS : 706
+# NOTES : Fixed EVENT_ACCESS_DEL nog being sent on each delete when mass-deleting in cs_xop
+#
+# BUILD : 1.7.18 (1239)
+# BUGS : 705
+# NOTES : Applied patch by Jan Milants to fix the swapped ACCESS_ADD and ACCESS_CHANGED events in cs_xop
+#
+# BUILD : 1.7.18 (1238)
+# BUGS : 662
+# NOTES : Fixed array count not being decremented on ChanServ access lists (provided by Jan Milants)
+#
+# BUILD : 1.7.18 (1237)
+# BUGS : 661
+# NOTES : Fixed DefCon which did not force DefConChanModes when it was enabled
+#
+# BUILD : 1.7.18 (1236)
+# BUGS :
+# NOTES : Applied Rob's password length patch
+#
+# BUILD : 1.7.18 (1235)
+# BUGS : 643
+# NOTES : Defcon's AKILL will now honor the server's sync flag
+#
+# BUILD : 1.7.18 (1234)
+# BUGS : 680 681
+# NOTES : typos in en_us.l
+#
+# BUILD : 1.7.18 (1233)
+# BUGS : 670
+# NOTES : Fixed minor booboo in en_us.l and de.l
+#
+# BUILD : 1.7.18 (1232)
+# BUGS : 622
+# NOTES : Modified en_us.l, de.l and Changes.lang to fix 622.
+#
+# BUILD : 1.7.18 (1231)
+# BUGS : N/A
+# NOTES : Ensure moduleData is still populated when anopeFini gets called when explicitaly unloading a single module.
+#
+# BUILD : 1.7.18 (1230)
+# BUGS : 656
+# NOTES : We now send out UNKLINE on hybridircd
+#
+# BUILD : 1.7.18 (1229)
+# BUGS : 690
+# NOTES : SAs can no longer move down other SAs to the SO list.
+#
+# BUILD : 1.7.18 (1228)
+# BUGS : 672
+# NOTES : Fixed a crash when MySQL was enabled; it checked the (unset) uplink server flags resulting in a segfault
+#
+# BUILD : 1.7.18 (1227)
+# BUGS : 667
+# NOTES : Fixed inspircd11.c using strtok_r - myStrGetToken is more compatible (strtok_r does not work on windows)
+#
+# BUILD : 1.7.18 (1226)
+# BUGS : 668
+# NOTES : Fixed win32 makefile for the inspircd protocol module changes
+#
+# BUILD : 1.7.18 (1225)
+# BUGS : 669
+# NOTES : Fixed spurious PONGs being sent during burst when MySQL was saving (it still is a dirty hack, but at least it should work now)
+#
+# BUILD : 1.7.18 (1224)
+# BUGS : 663
+# NOTES : Fixed BotServ kicks to now obey the SignKick setting of the channel
+#
+# BUILD : 1.7.18 (1223)
+# BUGS : 666
+# NOTES : Fixed CHAN_SYMBOL_REQUIRED which claimed one can register local (&) channels (sorry Rob, i should have left this bug for you)
+#
+# BUILD : 1.7.18 (1222)
+# BUGS : 665
+# NOTES : Fixed a minor syntax error in anoperc (echi instead of echo)
+#
+# BUILD : 1.7.18 (1221)
+# BUGS : 659
+# NOTES : Fixed a mistake in the MySQL code with identifying services roots
+#
+# BUILD : 1.7.18 (1220)
+# BUGS : 657
+# NOTES : Fixed various OperServ commands which did not respect a disabled OSOpersOnly
+#
+# BUILD : 1.7.18 (1219)
+# BUGS :
+# NOTES : Fixed a missing backtick in the INSERT query for newsitems
+#
+# BUILD : 1.7.18 (1218)
+# BUGS : 622
+# NOTES : Fixed ChanServ LIST to now search for <#chan> if only <chan> is given; Fixed all LIST commands to give error reporting when specifying incorrect ranges.
+#
+# BUILD : 1.7.18 (1217)
+# BUGS :
+# NOTES : Fixed small mistakes in both InspIRCd protocol modules
+#
+# BUILD : 1.7.18 (1216)
+# BUGS :
+# NOTES : Added support for inspircd 1.1 (b8+)
+#
+# BUILD : 1.7.18 (1215)
+# BUGS :
+# NOTES : Development Framework
+#
+# BUILD : 1.7.18 (1214)
+# BUGS :
+# NOTES : Anope 1.7.18 Release
+#
+# BUILD : 1.7.17 (1213)
+# BUGS : 651 653
+# NOTES : Fixed channel joins being logged twice in debug mode on some IRCds and BotServ incorrectly attempting to remove bans with BSSmartJoin
+#
+# BUILD : 1.7.17 (1212)
+# BUGS : 652
+# NOTES : Fixed handleModuleOperationQueue to also include error messages instead of only error numbers
+#
+# BUILD : 1.7.17 (1211)
+# BUGS : 650
+# NOTES : Fixed ModuleNoticeLang which was formatting the string twice
+#
+# BUILD : 1.7.17 (1210)
+# BUGS : 645 646 647
+# NOTES : Fixed anoperc restart, nickchanges on TS6, typo in CHAN_REGISTER_NONE_CHANNEL; added error messages when RDB functions fail (thx heinz)
+#
+# BUILD : 1.7.17 (1209)
+# BUGS :
+# NOTES : Another batch of changes regarding RDB/MySQL; all functions are now doing proper error reporting; errors are not yet handled properly
+#
+# BUILD : 1.7.17 (1208)
+# BUGS : N/A
+# NOTES : EVENT_BOT_KICK and EVENT_BOT_ADD added
+#
+# BUILD : 1.7.17 (1207)
+# BUGS : 641
+# NOTES : Fixed EVENT_TOPIC_UPDATED not being sent when the topic was updated from within certain protocol modules
+#
+# BUILD : 1.7.17 (1206)
+# BUGS : 631
+# NOTES : Fixed small language mistake in en_us.l and nl.l
+#
+# BUILD : 1.7.17 (1205)
+# BUGS : 630
+# NOTES : Fixed a small typo in ru.l
+#
+# BUILD : 1.7.17 (1204)
+# BUGS : 629
+# NOTES : Fixed ns_alist which did not accept Founder as a correct min_lev
+#
+# BUILD : 1.7.17 (1203)
+# BUGS :
+# NOTES : Small MySQL fix which should have already been in
+#
+# BUILD : 1.7.17 (1202)
+# BUGS : 640
+# NOTES : Fixed langfiles having CHANAKILL instead of CHANKILL in the chankill syntax lines
+#
+# BUILD : 1.7.17 (1201)
+# BUGS : 634
+# NOTES : Fixed install.js by adding the possibility to search for files on multiple drives instead of just C:
+#
+# BUILD : 1.7.17 (1200)
+# BUGS : 632
+# NOTES : Fixed BotServ KICK incorrectly reporting assigned status
+#
+# BUILD : 1.7.17 (1199)
+# BUGS : 621
+# NOTES : Added the ability to see if AutoOp is enabled in NickServ INFO displays.
+#
+# BUILD : 1.7.17 (1198)
+# BUGS :
+# NOTES : Reviewed and updated all of the MySQL code...
+#
+# BUILD : 1.7.17 (1196)
+# BUGS : 623
+# NOTES : Applied marks 623 patch, didnt apply the 621 patch as only en_us.l has been updated in it.
+#
+#
+# BUILD : 1.7.17 (1195)
+# BUGS : N/A
+# NOTES : testing...
+#
+# BUILD : 1.7.17 (1194)
+# BUGS : N/A
+# NOTES : Hmm it sent the mail but didnt commit...
+#
+# BUILD : 1.7.17 (1193)
+# BUGS : N/A
+# NOTES : really just making sure i can still commit properly
+#
+# BUILD : 1.7.17 (1192)
+# BUGS : 617
+# NOTES : Send svspart instead of eob
+#
+#
+# BUILD : 1.7.17 (1191)
+# BUGS : 616
+# NOTES : Error message changed when trying to register a nick before NSRegDelay is up.
+#
+#
+# BUILD : 1.7.17 (1190)
+# BUGS : N/A
+# NOTES : sha1 is a valid choice of encryption hash
+#
+# BUILD : 1.7.17 (1189)
+# BUGS :
+# NOTES : Support for mlocking +c on ultimate3 was missing
+#
+# BUILD : 1.7.17 (1188)
+# BUGS : N/A
+# NOTES : Make the mysql secure check easier to read... its ugly :(
+#
+#
+# BUILD : 1.7.17 (1187)
+# BUGS : N/A
+# NOTES : Put mysql secure back to how it should be - i think
+#
+# BUILD : 1.7.17 (1186)
+# BUGS : N/A
+# NOTES : Encryption fixes for win32
+#
+# BUILD : 1.7.17 (1185)
+# BUGS : N/A
+# NOTES : Encryption now offers the choice of none, old and md5 - the md5 module is nicely taken from irc-services and actaully works, yes, real md5, in anope, wow eh?
+#
+#
+# BUILD : 1.7.17 (1184)
+# BUGS :
+# NOTES : Development Framework
+#
+# BUILD : 1.7.17 (1182)
+# BUGS :
+# NOTES : Anope 1.7.17 release
+#
+# BUILD : 1.7.16 (1181)
+# BUGS :
+# NOTES : Fixed MySQL detection in configure.in; it should now always work correctly if mysql_config is found
+#
+# BUILD : 1.7.16 (1180)
+# BUGS : 614
+# NOTES : Fixed: [1] MySQL not storing passwords at all (blank passes) [2] saving of ttb with MySQL/RDB was completely fubar [3] do not send PONG-flood anymore on db-load...
+#
+# BUILD : 1.7.16 (1179)
+# BUGS :
+# NOTES : Changed uber-mysql-validation-detection to use AM_LINK_IFELSE as it should have used all along...
+#
+# BUILD : 1.7.16 (1178)
+# BUGS :
+# NOTES : Fixed a MySQL query error in the RDB functions.... successor cannot be NULL
+#
+# BUILD : 1.7.16 (1177)
+# BUGS :
+# NOTES : Fixed MySQL query debug to not excessivly quote queries before displaying in debug mode
+#
+# BUILD : 1.7.16 (1176)
+# BUGS : 611
+# NOTES : Fixed anoperc restart to allow arguments like anoperc start
+#
+# BUILD : 1.7.16 (1175)
+# BUGS : 612
+# NOTES : Fixed a number of MySQL/RDB-related functions which did not correctly escape their arguments
+#
+# BUILD : 1.7.16 (1174)
+# BUGS :
+# NOTES : Fixed src/mod_version.c to be compiled with module options and added an additional check to see if the values returned by mysql_config are valid
+#
+# BUILD : 1.7.16 (1173)
+# BUGS :
+# NOTES : Fixed a boo-boo in docs/WIN32.txt and removed a solved bug from BUGS (the one with clone detection... well it's not fixed but it's not there anymore either!)
+#
+# BUILD : 1.7.16 (1172)
+# BUGS :
+# NOTES : Added copyright notice for strlcat() and strlcpy() in src/misc.c
+#
+# BUILD : 1.7.16 (1171)
+# BUGS :
+# NOTES : Small documentation updates
+#
+# BUILD : 1.7.16 (1170)
+# BUGS :
+# NOTES : Development Framework
+#
+# BUILD : 1.7.16 (1168)
+# BUGS :
+# NOTES : Anope 1.7.16 Release
+#
+# BUILD : 1.7.15 (1167)
+# BUGS : 609
+# NOTES : Removed LANGUAGE from the SASET help for nearly all languages (it was only not there in en_us.l)
+#
+# BUILD : 1.7.15 (1166)
+# BUGS : 603
+# NOTES : Modified do_umode() to work with last fix.
+#
+# BUILD : 1.7.15 (1165)
+# BUGS : 603
+# NOTES : Added support for SVSMODE by parsing it as a MODE on supported IRCDs
+#
+# BUILD : 1.7.15 (1164)
+# BUGS : 607
+# NOTES : Fixed the BotServ CAPS-kicker; when calculating the percentage, it now ignores all non-alphabetic characters
+#
+# BUILD : 1.7.15 (1163)
+# BUGS :
+# NOTES : Various small changes to documentation and example config (and removing void \r from sources)
+#
+# BUILD : 1.7.15 (1162)
+# BUGS : 604
+# NOTES : Added functions to let modules backup their own databases and added this functionality to the bundled modules
+#
+# BUILD : 1.7.15 (1161)
+# BUGS : 606
+# NOTES : Fixed Makefile.win32 to fix a typo and `nmake clean` (it now uses spotless)
+#
+# BUILD : 1.7.15 (1159)
+# BUGS : 603
+# NOTES : we will now process UnrealIRCd's SVS(2)MODE messages
+#
+# BUILD : 1.7.15 (1158)
+# BUGS :
+# NOTES : Fixed the Makefile to let make work with multiple threads (tested with 3)
+#
+# BUILD : 1.7.15 (1157)
+# BUGS : 589
+# NOTES : Fixed restarting under windows, it should now work correctly
+#
+# BUILD : 1.7.15 (1156)
+# BUGS :
+# NOTES : Another small fix in nl.l
+#
+# BUILD : 1.7.15 (1155)
+# BUGS :
+# NOTES : Fixed small mistakes in nl.l
+#
+# BUILD : 1.7.15 (1154)
+# BUGS : N/A
+# NOTES : Fixed plexus3 noop support
+#
+#
+# BUILD : 1.7.15 (1153)
+# BUGS : 596
+# NOTES : Applied first part of Heinz's win32 patch
+#
+# BUILD : 1.7.15 (1152)
+# BUGS : 599
+# NOTES : Corrected valid nick characters for /OS SVSNICK by making the bs_bot isvalidnick() macro global via services.h
+#
+# BUILD : 1.7.15 (1151)
+# BUGS : 601
+# NOTES : Fixed us with reposding we didn't know someone when we were WHOIS'd for a nick enforcer client; now we reply correctly
+#
+# BUILD : 1.7.15 (1150)
+# BUGS : 595
+# NOTES : Fixed MySQL making a new connection for each query (bit TOO enthousiastic?)
+#
+# BUILD : 1.7.15 (1149)
+# BUGS : 598
+# NOTES : Added HOP to the list of XOP commands in the error from ChanServ ACCESS when XOP is enabled on supported ircds (and that line is too long!)
+#
+# BUILD : 1.7.15 (1148)
+# BUGS : 588
+# NOTES : Added SASET AUTOOP to NickServ to match SET AUTOOP
+#
+# BUILD : 1.7.15 (1147)
+# BUGS : 587
+# NOTES : Fixed missing help for /ns SET AUTOOP
+#
+# BUILD : 1.7.15 (1146)
+# BUGS : 583
+# NOTES : Fixed mass compiler warnings with make strict on FC5 (patch by Trystan)
+#
+# BUILD : 1.7.15 (1145)
+# BUGS : 579
+# NOTES : Fixed make strict issues with src/tools
+#
+# BUILD : 1.7.15 (1144)
+# BUGS :
+# NOTES : Fixed some c++-comments rob added; c-comments ftw!
+#
+# BUILD : 1.7.15 (1143)
+# BUGS : 593
+# NOTES : Fixed mod_current_module not always NULL-ified in mod_run_cmd, resulting in weird segfaults in special situations
+#
+# BUILD : 1.7.15 (1142)
+# BUGS : N/A
+# NOTES : Dont let hybrid send EOBs since we told it we dont suppor them anymore
+#
+# BUILD : 1.7.15 (1141)
+# BUGS : N/A
+# NOTES : Removed EOB support from hybrid protocol file, this should make things like entry message work even after a remove net-join
+#
+#
+# BUILD : 1.7.15 (1140)
+# BUGS : N/A
+# NOTES : Plexus3 can send global EOBs if we send SVS in the capab string - so now we do, this does NOT help with other hyb based ircds, and they still have an issue.
+#
+#
+# BUILD : 1.7.15 (1139)
+# BUGS : N/A
+# NOTES : Applied pelxus3 fixs from ThaPrince
+#
+# BUILD : 1.7.15 (1138)
+# BUGS : 585
+# NOTES : Another attempt at fixing db_mysql_query()
+#
+# BUILD : 1.7.15 (1137)
+# BUGS : n/a
+# NOTES : Another try at better mysql query.
+#
+# BUILD : 1.7.15 (1136)
+# BUGS : 578
+# NOTES : fixed bsd compiler warning
+#
+# BUILD : 1.7.15 (1135)
+# BUGS : 586 584 582
+# NOTES : several fixes
+#
+# BUILD : 1.7.15 (1134)
+# BUGS : N/A
+# NOTES : Missed two %Rs in hun.l
+#
+# BUILD : 1.7.15 (1133)
+# BUGS : N/A
+# NOTES : Improved robustness on db_mysql_query()
+#
+# BUILD : 1.7.15 (1132)
+# BUGS :
+# NOTES : Fixed development framework
+#
+# BUILD : 1.7.15 (1131)
+# BUGS :
+# NOTES : fixed revision number, we're missing an entry
+#
+# BUILD : 1.7.15 (1130)
+# BUGS :
+# NOTES : missing entry
+#
+# BUILD : 1.7.15 (1129)
+# BUGS : 575
+# NOTES : fixed port checking when using cmd line switches
+#
+# BUILD : 1.7.15 (1128)
+# BUGS :
+# NOTES : Anope 1.7.15 Release
+#
+# BUILD : 1.7.14 (1127)
+# BUGS : 573
+# NOTES : fixed integer types in db-merger.c
+#
+# BUILD : 1.7.14 (1126)
+# BUGS : N/A
+# NOTES : Applied ThaPrinces plexus support patch
+#
+# BUILD : 1.7.14 (1125)
+# BUGS : 572
+# NOTES : Increasd langauge buffer size to avoid issues 256 wasnt big enough.
+#
+# BUILD : 1.7.14 (1124)
+# BUGS : 552
+# NOTES : Added a way to modules_unload_all() to specify if we should unload the protocol module or not
+#
+# BUILD : 1.7.14 (1123)
+# BUGS : 563
+# NOTES : Fixed UseTSMode thing for ratbox; TS6 for ratbox should work now
+#
+# BUILD : 1.7.14 (1122)
+# BUGS : 571
+# NOTES : fixed typos in cs_appendtopic
+#
+# BUILD : 1.7.14 (1121)
+# BUGS : 491
+# NOTES : anope segfault on shutdown
+#
+# BUILD : 1.7.14 (1120)
+# BUGS : N/A
+# NOTES : ok last time with the lang file thing
+#
+# BUILD : 1.7.14 (1119)
+# BUGS : N/A
+# NOTES : Should have fixed my stupid segfault
+#
+# BUILD : 1.7.14 (1118)
+# BUGS : N/A
+# NOTES : Updated Changes to show %R
+#
+# BUILD : 1.7.14 (1117)
+# BUGS : N/A
+# NOTES : Use %R instead of %M
+#
+# BUILD : 1.7.14 (1116)
+# BUGS : N/A
+# NOTES : Changed %M to %R to avoid strftime call
+#
+# BUILD : 1.7.14 (1115)
+# BUGS : 491
+# NOTES : Dont allow IRCD Protocol modules to be unloaded
+#
+# BUILD : 1.7.14 (1114)
+# BUGS : 565
+# NOTES : Updated all lang files
+#
+# BUILD : 1.7.14 (1113)
+# BUGS :
+# NOTES : Same for de.l
+#
+# BUILD : 1.7.14 (1112)
+# BUGS : 565
+# NOTES : %M will now be replaced by either /msg or / depending on UseStrictPrivMsg - we still need to update the .l files for all langauges tho.
+#
+# BUILD : 1.7.14 (1111)
+# BUGS : 570
+# NOTES : Allow doValidHost to be called from modules.
+#
+# BUILD : 1.7.14 (1110)
+# BUGS : 523
+# NOTES : os_info.c now calls mSaveData on AnopeFini
+#
+# BUILD : 1.7.14 (1109)
+# BUGS : 566
+# NOTES : Finished support for SVSJOIN/SVSPART/SWHOIS in ircd modules
+#
+# BUILD : 1.7.14 (1108)
+# BUGS : 569
+# NOTES : Fixed giving modes for unregistered users :)
+#
+# BUILD : 1.7.14 (1107)
+# BUGS : 561
+# NOTES : Various small fixes for charybdis
+#
+# BUILD : 1.7.14 (1106)
+# BUGS :
+# NOTES : applied heinz's fix for the gcc hardened issue
+#
+# BUILD : 1.7.14 (1105)
+# BUGS : 558
+# NOTES : fixed usermode stuff for ratbox and shadow
+#
+# BUILD : 1.7.14 (1104)
+# BUGS : 557
+# NOTES : new fix to make the last fix work ;-p
+#
+# BUILD : 1.7.14 (1103)
+# BUGS : 557
+# NOTES : Fixed very nasty typecast. GCC Hardened should now work.
+#
+# BUILD : 1.7.14 (1102)
+# BUGS : 560
+# NOTES : fixed ptlink /newmask stuff. thx to trystan.
+#
+# BUILD : 1.7.14 (1101)
+# BUGS : N/A
+# NOTES : Unreal32 will now prompt users to check there link blocks if there wrong.
+#
+# BUILD : 1.7.14 (1100)
+# BUGS :
+# NOTES : removed os_killclones.c
+#
+# BUILD : 1.7.14 (1099)
+# BUGS :
+# NOTES : removed all that clone stuff
+#
+# BUILD : 1.7.14 (1098)
+# BUGS :
+# NOTES : db-merger booboo
+#
+# BUILD : 1.7.14 (1097)
+# BUGS :
+# NOTES : another fix for db-merger and epona2anope
+#
+# BUILD : 1.7.14 (1096)
+# BUGS : 536
+# NOTES : Fixed win32 versions of db-merger.c and epona2anope.c
+#
+# BUILD : 1.7.14 (1095)
+# BUGS : 554
+# NOTES : Applied heinzs manifest patch
+#
+# BUILD : 1.7.14 (1094)
+# BUGS : 530
+# NOTES : Applied marks botserv bold striping patch
+#
+# BUILD : 1.7.14 (1093)
+# BUGS :
+# NOTES : hs_request was missing the "officially supported" flag.
+#
+# BUILD : 1.7.14 (1092)
+# BUGS : 551
+# NOTES : applied chaz's fix for win32.
+#
+# BUILD : 1.7.14 (1091)
+# BUGS : 534
+# NOTES : applied trystan's fantasy patch.
+#
+# BUILD : 1.7.14 (1090)
+# BUGS : 538
+# NOTES : added BOT_LONG_IDENT.
+#
+# BUILD : 1.7.14 (1089)
+# BUGS : 549
+# NOTES : applied trystan's patch for the SJOIN issue.
+#
+# BUILD : 1.7.14 (1088)
+# BUGS :
+# NOTES : applied trystan's patch for 491.
+#
+# BUILD : 1.7.14 (1087)
+# BUGS : 545 550 541
+# NOTES : Various fixes.
+#
+# BUILD : 1.7.14 (1086)
+# BUGS : N/A
+# NOTES : Applied gds socket buffering patch, we should play nice with inspircd now.
+#
+# BUILD : 1.7.14 (1085)
+# BUGS : 544
+# NOTES : Applied Heinzy-mcHeinzs documentation update
+#
+# BUILD : 1.7.14 (1084)
+# BUGS : N/A
+# NOTES : Added ns_noop_convert.c
+#
+#
+# BUILD : 1.7.14 (1082)
+# BUGS : 423
+# NOTES : Moved ns_noop into core, its now a /ns set option.
+#
+# BUILD : 1.7.14 (1079)
+# BUGS : 529 531
+# NOTES : applied trystan's fix and fixed some readonly stuff
+#
+# BUILD : 1.7.14 (1078)
+# BUGS : 527
+# NOTES : Applied path from heinz for... 1) fixes bug 527 2) adds mod version to windows stuff 3) fixes some ugly indentation in install.js 4) cleans up manifest files on spotless
+#
+#
+# BUILD : 1.7.14 (1077)
+# BUGS : N/A
+# NOTES : renamed set_key to chan_set_key, modified modules Makefiles to not link against anope libs (its unneeded)
+#
+# BUILD : 1.7.14 (1076)
+# BUGS : N/A
+# NOTES : Missing space
+#
+# BUILD : 1.7.14 (1075)
+# BUGS : N/A
+# NOTES : multiple file modules now respect mod_version, and ./configure is checked for and executed.
+#
+# BUILD : 1.7.14 (1074)
+# BUGS : N/A
+# NOTES : Small patch by ThaPrince for ircds with modes on id
+#
+# BUILD : 1.7.14 (1073)
+# BUGS : N/A
+# NOTES : Added a string privmsg option, which can force services to only accept /msg nick@host
+#
+# BUILD : 1.7.14 (1072)
+# BUGS :
+# NOTES : Fixed a mistake in en_us.nl and updated inspircd support module
+#
+# BUILD : 1.7.14 (1071)
+# BUGS : N/A
+# NOTES : plexus3 now uses the ircd struct when deciding which modes to send for svid_umode3 calls
+#
+# BUILD : 1.7.14 (1070)
+# BUGS : N/A
+# NOTES : Added N as a root mode on id for plexus3.c
+#
+#
+# BUILD : 1.7.14 (1069)
+# BUGS : N/A
+# NOTES : Added support for ircd modules to set extra modes based on services access (plexus needs this)
+#
+# BUILD : 1.7.14 (1068)
+# BUGS : N/A
+# NOTES : Added -nothird and -support command line options
+#
+# BUILD : 1.7.14 (1067)
+# BUGS :
+# NOTES : Updating VERSION_BUILD with am
+#
+# BUILD : 1.7.14 (1064)
+# BUGS :
+# NOTES : Fixed booboo with win32.rc.template.. it was seeing double!
+#
+# BUILD : 1.7.14 (1063)
+# BUGS : 526
+# NOTES : Applied win32-maintenance patch by heinz
+#
+# BUILD : 1.7.14 (1062)
+# BUGS :
+# NOTES : Fixed the makefiles to not recompile the core if nothing changed, and to not always re-link all modules if not needed
+#
+# BUILD : 1.7.14 (1061)
+# BUGS : 408
+# NOTES : Added support for Visual Studio 2005, partially by replacing install.vbs by a more robust install.js -- thanks heinz!
+#
+# BUILD : 1.7.14 (1060)
+# BUGS : 523
+# NOTES : Module data was cleared before calling AnopeFini, thus being evil to saving-routines and such (like in ns_noop)
+#
+# BUILD : 1.7.14 (1059)
+# BUGS : 525
+# NOTES : In cs_xop, copied the check from ADD to DEL, so you still need AOP to remove people from any XOP list (HOP could delete VOP)
+#
+# BUILD : 1.7.14 (1058)
+# BUGS : 496
+# NOTES : Removed legacy my_vsnprintf() code and anything related; detection for it was already gone...
+#
+# BUILD : 1.7.14 (1054)
+# BUGS : 524
+# NOTES : fixed typo in a function name.
+#
+# BUILD : 1.7.14 (1053)
+# BUGS :
+# NOTES : just a booboo.
+#
+# BUILD : 1.7.14 (1052)
+# BUGS :
+# NOTES : Fixed several memleaks in ns_noop.c. Certus 4 teh win!
+#
+# BUILD : 1.7.14 (1051)
+# BUGS :
+# NOTES : Changed mysql detection to use mysql_config instead of home brewn mysql.m4
+#
+# BUILD : 1.7.14 (1050)
+# BUGS : 498
+# NOTES : Removed last traces of threading support and added a W-flag in our version response if we run on windows
+#
+# BUILD : 1.7.14 (1049)
+# BUGS :
+# NOTES : Two small win32 fixes...
+#
+# BUILD : 1.7.14 (1048)
+# BUGS : 510
+# NOTES : Fixed a lot of redundant function declarations
+#
+# BUILD : 1.7.14 (1047)
+# BUGS : 464
+# NOTES : Added cleanup code to tools/anopesmtp to clear out used memory etc...
+#
+# BUILD : 1.7.14 (1046)
+# BUGS :
+# NOTES : We were walking memory in moduleGetConfigDirecte with an allocated pointer, and free-ing it later when it was past the allocatrd space... We now store the original pointer so we can free it correctly :)
+#
+# BUILD : 1.7.14 (1045)
+# BUGS :
+# NOTES : Fixed ano_modclearerr() - it was not POSIX-compliant
+#
+# BUILD : 1.7.14 (1044)
+# BUGS :
+# NOTES : Update InspIRCd protocol support module
+#
+# BUILD : 1.7.14 (1043)
+# BUGS :
+# NOTES : NULLified *s and *t in moduleGetConfigDirective in src/modules.c by default
+#
+# BUILD : 1.7.14 (1042)
+# BUGS : 520
+# NOTES : Fixed src/protocol/Makefile.win32 for plexus->plexus2/plexus3 change
+#
+# BUILD : 1.7.14 (1041)
+# BUGS : 514
+# NOTES : Fixed booboo. Thx to Trystan.
+#
+# BUILD : 1.7.14 (1040)
+# BUGS : 509 511
+# NOTES : Fixed compiler warnigs, thx to trystan. again.
+#
+# BUILD : 1.7.14 (1039)
+# BUGS : 493
+# NOTES : Fixed /bs BOT CHANGE not setting new Q:Line when only nick was changed
+#
+# BUILD : 1.7.14 (1038)
+# BUGS : 500
+# NOTES : Updated register script; it now accepts YES, yes, and Yes as valid values and tells about ./Config instead of ./configure
+#
+# BUILD : 1.7.14 (1037)
+# BUGS : 507
+# NOTES : Fixed NICKIP/NICKv2 support for unreal32
+#
+# BUILD : 1.7.14 (1032)
+# BUGS :
+# NOTES : suspended nicks/chans won't expire
+#
+# BUILD : 1.7.14 (1031)
+# BUGS : 504
+# NOTES : fixed memleak, thx to trystan
+#
+# BUILD : 1.7.14 (1030)
+# BUGS :
+# NOTES : fixed coding booboo, thx to viper
+#
+# BUILD : 1.7.14 (1029)
+# BUGS : 501
+# NOTES : several fixes.
+#
+# BUILD : 1.7.14 (1028)
+# BUGS : 499
+# NOTES : fixed index of backtrace(), thx craig
+#
+# BUILD : 1.7.14 (1027)
+# BUGS :
+# NOTES : removed threads.h
+#
+# BUILD : 1.7.14 (1026)
+# BUGS : 487 488 489
+# NOTES : some fixes.
+#
+# BUILD : 1.7.14 (1025)
+# BUGS :
+# NOTES : Development Framework (1.7.14-svn)
+#
+# BUILD : 1.7.14 (1023)
+# BUGS : N/A
+# NOTES : Anope 1.7.14 Release.
+#
+# BUILD : 1.7.14 (1022)
+# BUGS : 483
+# NOTES : important seg fix
+#
+# BUILD : 1.7.14 (1021)
+# BUGS :
+# NOTES : Anope 1.7.14 RC1
+#
+# BUILD : 1.7.13 (1020)
+# BUGS :
+# NOTES : fixed main.c after last commit :)
+#
+# BUILD : 1.7.13 (1019)
+# BUGS : 390
+# NOTES : fixed some obsolete defines. hopefully :P
+#
+# BUILD : 1.7.13 (1017)
+# BUGS :
+# NOTES : updated version.log :P
+#
+# BUILD : 1.7.13 (1016)
+# BUGS :
+# NOTES : fixed broken strings in de.l
+#
+# BUILD : 1.7.13 (1015)
+# BUGS :
+# NOTES : Fixed distclean.
+#
+# BUILD : 1.7.13 (1014)
+# BUGS :
+# NOTES : de.l updated, thx to monk.
+#
+# BUILD : 1.7.13 (1013)
+# BUGS :
+# NOTES : bs will now check for a bot on /bs kick
+#
+# BUILD : 1.7.13 (1012)
+# BUGS : 453
+# NOTES : gcc4 compiling fixes
+#
+# BUILD : 1.7.13 (1011)
+# BUGS : 472 478
+# NOTES : new w32 icon and fixed file pointer
+#
+# BUILD : 1.7.13 (1010)
+# BUGS : 471
+# NOTES : fixed charybdis umodes.
+#
+# BUILD : 1.7.13 (1009)
+# BUGS : 460
+# NOTES : fixed sstrdup(NULL) in cs_akick.c
+#
+# BUILD : 1.7.13 (1008)
+# BUGS : 473 474
+# NOTES : gcc switches and win98 stop, thx 2 trystan
+#
+# BUILD : 1.7.13 (1007)
+# BUGS : 476
+# NOTES : Applied Trystan's patch.
+#
+# BUILD : 1.7.13 (1006)
+# BUGS : 468
+# NOTES : Fixed a counting issue in /os stats uplink and ran indent on src/core/os_uplink.c
+#
+# BUILD : 1.7.13 (1005)
+# BUGS : 469
+# NOTES : Applied Trystan's moduleNoticeLang() patch
+#
+# BUILD : 1.7.13 (1004)
+# BUGS : 333
+# NOTES : Fixed botserv's mode stuff with protect umode
+#
+# BUILD : 1.7.13 (1003)
+# BUGS : 467
+# NOTES : Fixed server desc for several ircds
+#
+# BUILD : 1.7.13 (1002)
+# BUGS : 440
+# NOTES : Made bs_init and hostserv_init useless when BotServ/HostServ are disabled; fixed compile errors/warnings introduced by Certus
+#
+# BUILD : 1.7.13 (1001)
+# BUGS :
+# NOTES : NickServ will now check anope_valid_nick()
+#
+# BUILD : 1.7.13 (1000)
+# BUGS : 424
+# NOTES : Added TS6 Save support. This is #1000!
+#
+# BUILD : 1.7.13 (998)
+# BUGS : 445
+# NOTES : Fixed possible overflow in process()
+#
+# BUILD : 1.7.13 (997)
+# BUGS : 418
+# NOTES : Fixed TS6 stuff in channels.c, thx 2 Trystan.
+#
+# BUILD : 1.7.13 (993)
+# BUGS : 441
+# NOTES : Fixed memleak in hs_set.c
+#
+# BUILD : 1.7.13 (992)
+# BUGS : 450 447
+# NOTES : Fixed more memleaks.
+#
+# BUILD : 1.7.13 (989)
+# BUGS : 444
+# NOTES : Fixed memleak in os_mode.c
+#
+# BUILD : 1.7.13 (988)
+# BUGS : 421 436 438
+# NOTES : Hooray, it's still bug-fixing-day!
+#
+# BUILD : 1.7.13 (987)
+# BUGS : 456
+# NOTES : Added fix for unreal's "local" channels
+#
+# BUILD : 1.7.13 (986)
+# BUGS : n/a
+# NOTES : Propagated CHAN_X_INVALID to all languages and Changes.lang
+#
+# BUILD : 1.7.13 (985)
+# BUGS :
+# NOTES : added new langstring CHAN_X_INVALID
+#
+# BUILD : 1.7.13 (984)
+# BUGS : 451 459
+# NOTES : bug fixing day!
+#
+# BUILD : 1.7.13 (983)
+# BUGS :
+# NOTES : Updated version.log by hand :P
+#
+# BUILD : 1.7.13 (982)
+# BUGS : 457
+# NOTES : Fixed wasteful finduser() call in os_oline.c
+#
+# BUILD : 1.7.13 (981)
+# BUGS : 429 434 446
+# NOTES : several fixes
+#
+# BUILD : 1.7.13 (980)
+# BUGS : 419
+# NOTES : Fixed NULL checks to add_invite and add_exception.
+#
+# BUILD : 1.7.13 (979)
+# BUGS : 455
+# NOTES : Fixed ns_saset: swapped args to createCommand and added check to see if nick was set
+#
+# BUILD : 1.7.13 (978)
+# BUGS : 417
+# NOTES : fixed events on /join 0.
+#
+# BUILD : 1.7.13 (977)
+# BUGS : 461 463
+# NOTES : happy bug-fixing-day to all of you.
+#
+# BUILD : 1.7.13 (976)
+# BUGS : 396
+# NOTES : Fixed TS6 issues with handling nick changes and channel modes
+#
+# BUILD : 1.7.13 (975)
+# BUGS : 435
+# NOTES : Added messages explaining what module status numbers mean
+#
+# BUILD : 1.7.13 (974)
+# BUGS : 454
+# NOTES : Fixed a crash when passing a NULL-user to moduleGetLangString
+#
+# BUILD : 1.7.13 (972)
+# BUGS :
+# NOTES : Fixed a bug involving EVENT_ACCESS_DEL.
+#
+# BUILD : 1.7.13 (969)
+# BUGS :
+# NOTES : Fixed position of EVENT_ACCESS_DEL. HEADACHE!
+#
+# BUILD : 1.7.13 (968)
+# BUGS :
+# NOTES : Fixed cs_getpass.c, thx to Trystan.
+#
+# BUILD : 1.7.13 (965)
+# BUGS : 442 437 432 431 420
+# NOTES : Fixed a few memleaks.
+#
+# BUILD : 1.7.13 (962)
+# BUGS :
+# NOTES : Added events for channel kicks and nickserv logout
+#
+# BUILD : 1.7.13 (961)
+# BUGS :
+# NOTES : Added support for Charybdis IRCd
+#
+# BUILD : 1.7.13 (958)
+# BUGS :
+# NOTES : Applied the new french translation provided by illu.
+#
+# BUILD : 1.7.13 (955)
+# BUGS :
+# NOTES : updated config.guess and config.sub
+#
+# BUILD : 1.7.13 (953)
+# BUGS :
+# NOTES : Fixed SGLine removal on all ircds.
+#
+# BUILD : 1.7.13 (952)
+# BUGS :
+# NOTES : Development Framework ; made .BANNER version dynamic
+#
+# BUILD : 1.7.13 (951)
+# BUGS :
+# NOTES : Anope 1.7.13 release
+#
+# BUILD : 1.7.13 (949)
+# BUGS :
+# NOTES : Anope 1.7.13 release
+#
+# BUILD : 1.7.13 (948)
+# BUGS :
+# NOTES : Anope 1.7.13-rc1
+#
+# BUILD : 1.7.12 (947)
+# BUGS :
+# NOTES : Updated inspircd support module and fixed error with generating language.h on certain setups
+#
+# BUILD : 1.7.12 (945)
+# BUGS : 405 410
+# NOTES : Fixed: first user on HelpChannel always got +h, even if it had no access at all; enforcers had incorrect user when only user was specified; missing quitmessage when catching unknown signals
+#
+# BUILD : 1.7.12 (924)
+# BUGS :
+# NOTES : Updated docs/FAQ
+#
+# BUILD : 1.7.12 (920)
+# BUGS :
+# NOTES : Development Framework
+#
+# BUILD : 1.7.12 (918)
+# BUGS :
+# NOTES : 1.7.12 Release
+#
+# BUILD : 1.7.12 (917)
+# BUGS :
+# NOTES : Fixed module loading code to get rid of a few memory leaks and to (hopefully) correctly remove runtime copies when loading fails
+#
+# BUILD : 1.7.12 (915)
+# BUGS :
+# NOTES : Fixed indenting errors in last commit (1.7.12-rc1)
+#
+# BUILD : 1.7.12 (914)
+# BUGS :
+# NOTES : Anope 1.7.12-rc1 stuffs
+#
+# BUILD : 1.7.11 (913)
+# BUGS :
+# NOTES : Turned NickLen into RECOMMENDED and BSFantasyCharacter into OPTIONAL
+#
+# BUILD : 1.7.11 (912)
+# BUGS :
+# NOTES : Turned identical userkeys error into a warning and added hs_request to src/modules/makefile.inc.win32
+#
+# BUILD : 1.7.11 (911)
+# BUGS :
+# NOTES : Added a check to os_stats to see if we actually have a param to avoid segs
+#
+# BUILD : 1.7.11 (910)
+# BUGS :
+# NOTES : Fixed some stats not passing the correct letter to anope_cmd_219
+#
+# BUILD : 1.7.11 (909)
+# BUGS :
+# NOTES : Fixed /cs hop being available on ircds without halfop support
+#
+# BUILD : 1.7.11 (908)
+# BUGS :
+# NOTES : Created a CapabInfo table to allow easier handling of capab tokens/flags
+#
+# BUILD : 1.7.11 (907)
+# BUGS :
+# NOTES : Fixed capab parsing on hybrid/plexus/ratbox and a typo in example.conf
+#
+# BUILD : 1.7.11 (906)
+# BUGS :
+# NOTES : Added information on the uplink server via /os stats uplink
+#
+# BUILD : 1.7.11 (905)
+# BUGS :
+# NOTES : Fixed up config; UserKeys can be safely missing again, you get a real warning when they are identical, and fixed a small grammar error in the GlobalOnCycle warning just above
+#
+# BUILD : 1.7.11 (904)
+# BUGS :
+# NOTES : Stripping fantasy char from fantasy commands now
+#
+# BUILD : 1.7.11 (903)
+# BUGS :
+# NOTES : Added BSFantasyCharacter configuration option to change the fantasy prefix character
+#
+# BUILD : 1.7.11 (902)
+# BUGS :
+# NOTES : Changed how /os modload and /os modunload load/unload modules; they are now handled in a queue instead of using the mod_current_* variables
+#
+# BUILD : 1.7.11 (901)
+# BUGS :
+# NOTES : Updated Italian translation (by Hal9000); updated German translation for cs_appendtopic (by Cloud); added Changes message for ns_saset fix accidently comitted when comitting the dev framework
+#
+# BUILD : 1.7.11 (900)
+# BUGS :
+# NOTES : Added an event for fantasy commands triggered by people without CA_FANTASY access on the channel
+#
+# BUILD : 1.7.11 (899)
+# BUGS :
+# NOTES : Development Framework
+#
+# BUILD : 1.7.11 (897)
+# BUGS :
+# NOTES : Anope 1.7.11 Release
+#
+# BUILD : 1.7.11 (896)
+# BUGS :
+# NOTES : Fixed minor issues: forgot an 'End If' in install.vbs and an old typo in Changes.conf
+#
+# BUILD : 1.7.11 (895)
+# BUGS :
+# NOTES : Fixed a typo in en_us.l
+#
+# BUILD : 1.7.11 (894)
+# BUGS :
+# NOTES : Anope 1.7.11-rc3
+#
+# BUILD : 1.7.11 (893)
+# BUGS :
+# NOTES : Fixed a segfault in find_byuid() if it was passed with a NULL-argument
+#
+# BUILD : 1.7.11 (892)
+# BUGS :
+# NOTES : Applied patch by Trystan to [1] strip CR/LF as well with normalizeBuffer() [2] fix various issues with hs_request (makes use of #1 in hs_request so that lines that are \n only are not processed; Adds check of tmp before allowing strtol() to get its hands on it; HSRequestDBName is set during the config load, if not by the config its sstrdup() with the default value.. so that the message at the end of the load does not read (NULL); frees the HSRequestDBName on unload; ran indent again it)
+#
+# BUILD : 1.7.11 (891)
+# BUGS :
+# NOTES : Fixed bot ident length checking and sending a reponse when loading a non-existing module
+#
+# BUILD : 1.7.11 (890)
+# BUGS :
+# NOTES : Fixed common_get_vhost/vident to also return vhost/vident on ircds without usermode for vhost/vident
+#
+# BUILD : 1.7.11 (889)
+# BUGS :
+# NOTES : Applied patches by Trystan to: (1) Fix memleak when AddAkiller was enabled (2) Fix MySQL detection on win32 with install.vbs (3) Remove color codes from tools on win32
+#
+# BUILD : 1.7.11 (888)
+# BUGS :
+# NOTES : Anope 1.7.11-rc2
+#
+# BUILD : 1.7.11 (887)
+# BUGS :
+# NOTES : Fixed various errors with version handling, mostly related to VERSION_EXTRA on win32
+#
+# BUILD : 1.7.11 (886)
+# BUGS :
+# NOTES : Redid the gcc4 fixes for the db-merger
+#
+# BUILD : 1.7.11 (884)
+# BUGS : n/a
+# NOTES : Version bump. First release candidate for .11
+#
+# BUILD : 1.7.10 (883)
+# BUGS : n/a
+# NOTES : Making use of VERSION_EXTRA for release candidates.
+#
+# BUILD : 1.7.10 (882)
+# BUGS : n/a
+# NOTES : Typo fix
+#
+# BUILD : 1.7.10 (881)
+# BUGS :
+# NOTES : Added a NickLen directive to make sure bot nicks are not longer than the net's allowed niclen, and thus we can't be yelled at because of that
+#
+# BUILD : 1.7.10 (880)
+# BUGS : n/a
+# NOTES : Version 0.2 for db-merge fixing corruptions. By Certus.
+#
+# BUILD : 1.7.10 (879)
+# BUGS : n/a
+# NOTES : The anoperc scripts is now generate for the user. By DrStein
+#
+# BUILD : 1.7.10 (878)
+# BUGS :
+# NOTES : Applied patch by ThaPrince to fix XLINEs with plexus
+#
+# BUILD : 1.7.10 (877)
+# BUGS :
+# NOTES : Added two more globops warnings when a database cannott be opened
+#
+# BUILD : 1.7.10 (876)
+# BUGS :
+# NOTES : Added something about DevNull to the FAQ
+#
+# BUILD : 1.7.10 (873)
+# BUGS :
+# NOTES : Added SGLINE support for plexus, and fixed minor other things (by ThaPrince)
+#
+# BUILD : 1.7.10 (872)
+# BUGS :
+# NOTES : Fixed delete_user to always free any allocated memory for vhost/vident
+#
+# BUILD : 1.7.10 (871)
+# BUGS :
+# NOTES : Applied two patches by ThaPrince to add the correct nicks to SQLINE/SGLINE with plexus and ratbox
+#
+# BUILD : 1.7.10 (870)
+# BUGS :
+# NOTES : Move on, nothing to see here (typo fix in Changes)
+#
+# BUILD : 1.7.10 (869)
+# BUGS :
+# NOTES : pmodule_cmd_unsgline for plexus set plexus_cmd_unsqline instead of pmodule_cmd_unsgline (so unsQline instead of unsGline)
+#
+# BUILD : 1.7.10 (868)
+# BUGS :
+# NOTES : Fixed duplicate Changes entries for Hal9000
+#
+# BUILD : 1.7.10 (866)
+# BUGS :
+# NOTES : Added a moduleGetLangString() function to allow modules to retrieve their language strings instead of only being able to send a NOTICE with them
+#
+# BUILD : 1.7.10 (865)
+# BUGS :
+# NOTES : Fixed the "limited to" line in the help for /os modlist
+#
+# BUILD : 1.7.10 (864)
+# BUGS :
+# NOTES : Changed UserKeys from REQUIRED to RECOMMENDED
+#
+# BUILD : 1.7.10 (862)
+# BUGS :
+# NOTES : Fixed anope_cmd_part passing on "\0" instead of NULL when given NULL-arg
+#
+# BUILD : 1.7.10 (858)
+# BUGS :
+# NOTES : Converted docs/FAQ to a more organized format
+#
+# BUILD : 1.7.10 (857)
+# BUGS :
+# NOTES : Another FAQ update
+#
+# BUILD : 1.7.10 (856)
+# BUGS :
+# NOTES : Fixed gcc4 warnings for db-merger and epona2anope
+#
+# BUILD : 1.7.10 (855)
+# BUGS :
+# NOTES : Fixed default location of services.conf in example.conf being incorrect
+#
+# BUILD : 1.7.10 (854)
+# BUGS :
+# NOTES : Added ns_saset to the win32 makefiles
+#
+# BUILD : 1.7.10 (853)
+# BUGS :
+# NOTES : Moved SET for other nicks (SA only) to a seperate SASET command
+#
+# BUILD : 1.7.10 (852)
+# BUGS :
+# NOTES : Added the new windows installation files
+#
+# BUILD : 1.7.10 (851)
+# BUGS :
+# NOTES : Fixed a few memleaks in os_info (thanks Certus)
+#
+# BUILD : 1.7.10 (850)
+# BUGS :
+# NOTES : Fixed NS SET sometimes using the option as nick if it existed and updated docs/NEWS for 1.7
+#
+# BUILD : 1.7.10 (847)
+# BUGS :
+# NOTES : Fixed a typo when loading two protocol modules
+#
+# BUILD : 1.7.10 (846)
+# BUGS :
+# NOTES : Clarified comments above SendMailPath in the config, thanks IcyLiquid
+#
+# BUILD : 1.7.10 (845)
+# BUGS :
+# NOTES : Added a warning for *NIX when running as root
+#
+# BUILD : 1.7.10 (844)
+# BUGS :
+# NOTES : Fixed module languages defaulting to english instead of NSDefLanguage
+#
+# BUILD : 1.7.10 (843)
+# BUGS :
+# NOTES : Fixed various compile warnings on AMD64 systems
+#
+# BUILD : 1.7.10 (842)
+# BUGS :
+# NOTES : Added 3 new events for channel access/xop list modifications
+#
+# BUILD : 1.7.10 (841)
+# BUGS : 400
+# NOTES : Modules will now get a more random filename in the runtime/ folder, which makes sure that no duplicate filenames will occur, which makes sure listchans can run at the same time as services since they both use the same protocol module, which in turn fixes bug 400. And all modules are now properly unloaded on shutdown :)
+#
+# BUILD : 1.7.10 (840)
+# BUGS :
+# NOTES : Fixed most core compile warnings when using make strict
+#
+# BUILD : 1.7.10 (839)
+# BUGS :
+# NOTES : Removed the requirement of a valid config file when running ./services -version
+#
+# BUILD : 1.7.10 (836)
+# BUGS :
+# NOTES : Added italian translations for all modpack modules
+#
+# BUILD : 1.7.10 (835)
+# BUGS :
+# NOTES : Added portugese translation to hs_request, applied win32 fixes by heinz (or should i say heniz?)
+#
+# BUILD : 1.7.10 (834)
+# BUGS :
+# NOTES : Added hs_request to the modpack, made memo_send a real global, and fixed a bug with module config stuff and PARAM_SET options
+#
+# BUILD : 1.7.10 (833)
+# BUGS :
+# NOTES : Fixed some fuckups in the previous commit
+#
+# BUILD : 1.7.10 (832)
+# BUGS :
+# NOTES : Updated Italian langfile and removed some leftovers of userban stuff
+#
+# BUILD : 1.7.10 (831)
+# BUGS :
+# NOTES : Removing userban code for now
+#
+# BUILD : 1.7.10 (829)
+# BUGS :
+# NOTES : Forgot a comment and a return in userban.c, and various win32 fixed by heinz
+#
+# BUILD : 1.7.10 (828)
+# BUGS :
+# NOTES : Added a new ban system which should be faster than what we have now and also supports CIDR bans -- not yet in use, but will be used for akills andeventually channel bans -- hashing and cidr bans are not tested yet
+#
+# BUILD : 1.7.10 (827)
+# BUGS : 394
+# NOTES : Fixed /src/bin/register
+#
+# BUILD : 1.7.10 (826)
+# BUGS : 384
+# NOTES : Removed --with-ircd stuff from configure(.in)
+#
+# BUILD : 1.7.10 (825)
+# BUGS : 398
+# NOTES : Forgot to enable finish_sync() for ultimate3, it was still using the old way to do it
+#
+# BUILD : 1.7.10 (824)
+# BUGS : 389
+# NOTES : Added the possibility for protocol files to override the code setting mod_current_buffer, which is needed for InspIRCd
+#
+# BUILD : 1.7.10 (823)
+# BUGS : 385 391
+# NOTES : Moved checks for UseTokens, UseTS6, and Numeric into protocol_module_init because they need the ircd struct, and split init() into two functions to load the protocol module for listnicks/listchans.
+#
+# BUILD : 1.7.10 (822)
+# BUGS : none
+# NOTES : Added pt.l and bundled modules pt.l patch. Thanx to Ricardo.
+#
+# BUILD : 1.7.10 (817)
+# BUGS : N/A
+# NOTES : Synced inspircd.c with brains cvs server
+#
+# BUILD : 1.7.10 (816)
+# BUGS :
+# NOTES : Updated the FAQ
+#
+# BUILD : 1.7.10 (815)
+# BUGS : 383
+# NOTES : Added value checking for deleting ignores, which fixes a (very rare) segfault
+#
+# BUILD : 1.7.10 (814)
+# BUGS : 381
+# NOTES : Removed a double extern definition of rdb_tag_table; Fixed mydbgen so it sends the pass and installs in the data dir
+#
+# BUILD : 1.7.10 (813)
+# BUGS : 380
+# NOTES : Fixed a bug with listnicks option displaying
+#
+# BUILD : 1.7.10 (811)
+# BUGS :
+# NOTES : Development Framework
+#
+# BUILD : 1.7.10 (810)
+# BUGS :
+# NOTES : And heniz (yes, heniz!) made a boo-boo with the version of install.vbs :)
+#
+# BUILD : 1.7.10 (809)
+# BUGS :
+# NOTES : Updated install.vbs to detect SDK paths (by heinz)
+#
+# BUILD : 1.7.10 (808)
+# BUGS :
+# NOTES : Updated banner for 1.7.10
+#
+# BUILD : 1.7.10 (805)
+# BUGS : N/A
+# NOTES : Removed trailing space for whois output
+#
+# BUILD : 1.7.10 (803)
+# BUGS :
+# NOTES : Anope 1.7.10 Release
+#
+# BUILD : 1.7.9 (801)
+# BUGS : N/A
+# NOTES : last couple of solaris fixs :)
+#
+# BUILD : 1.7.9 (799)
+# BUGS : N/A
+# NOTES : Fixed compiling on solaris and amd64 systems
+#
+# BUILD : 1.7.9 (798)
+# BUGS : N/A
+# NOTES : Should compile on solaris and amd64, inspircd.c has warnings atm, [brain] is on them :)
+#
+#
+# BUILD : 1.7.9 (797)
+# BUGS : N/A
+# NOTES : Applied some nicities for sun boxs
+#
+# BUILD : 1.7.9 (796)
+# BUGS : N/A
+# NOTES : Updated inspircd module to work with inspircd beta 5 and up
+#
+# BUILD : 1.7.9 (795)
+# BUGS : 379
+# NOTES : Fixed the channelname issue in do_part once and for all with sstrdup(tm) power
+#
+# BUILD : 1.7.9 (794)
+# BUGS : 377
+# NOTES : Removed any ! and further from topicsetters, since Unreal sometimes sends a nick!user@host topicsetter instead of just nick
+#
+# BUILD : 1.7.9 (793)
+# BUGS : 378
+# NOTES : Applied patch
+#
+# BUILD : 1.7.9 (792)
+# BUGS : N/A
+# NOTES : Added a check for last_quit when infoing a suspended nick, this should never happen, but it seems a few networks have odd databases which are using the suspend flag for something else, i think its related to networks that have merged databases, but i dont know, anyway, we check for it before using it now. (this dosnt fix the fact they are using a nc->flag that core wants for something else)
+#
+#
+# BUILD : 1.7.9 (791)
+# BUGS : N/A
+# NOTES : PARAM_RELOAD works for NSListOpersOnly etc again *grumbles at heniz*
+#
+# BUILD : 1.7.9 (790)
+# BUGS : N/A
+# NOTES : Removed some comments from config.c
+#
+# BUILD : 1.7.9 (789)
+# BUGS : 375
+# NOTES : NSOperListOnly and CSOperListOnly are correctly formated in the help now.
+#
+# BUILD : 1.7.9 (788)
+# BUGS : 374
+# NOTES : Moved free() to after sending the EVENT_PART_CHANNEL event, so the event does not use an already freed variable
+#
+# BUILD : 1.7.9 (787)
+# BUGS : 369
+# NOTES : Added a dummy folder/makefile to keep older shells happen with doing processing Makefile.inc subs
+#
+# BUILD : 1.7.9 (786)
+# BUGS :
+# NOTES : Applied patch by crazy for language updates and removal of IRCDFILE stuff
+#
+# BUILD : 1.7.9 (785)
+# BUGS : 371 372
+# NOTES : Set mod_current_module_name for AnopeFini and updated get_access to return -1 for non-identified users instead of 0.
+#
+# BUILD : 1.7.9 (784)
+# BUGS :
+# NOTES : Fixed another segfault in ns_maxemail, forget a check for nc->email this time.
+#
+# BUILD : 1.7.9 (783)
+# BUGS :
+# NOTES : Fixed most compiler warnings for the core (not modules) when using make strict
+#
+# BUILD : 1.7.9 (782)
+# BUGS : 357
+# NOTES : Fixed a segfault in os_clearmodes when clearing invites -- it used the exception list for the invite hosts, not the invite list, which is bad :)
+#
+# BUILD : 1.7.9 (781)
+# BUGS : 358 364
+# NOTES : Changed chan_set_correct_modes() to allow identified founders to get founder is SECUREFOUNDER is on. Added code in delchan() to logout people identified as founder to the channel dropped.
+#
+# BUILD : 1.7.9 (780)
+# BUGS : none
+# NOTES : Language to clarify configuration directive dependencies.
+#
+# BUILD : 1.7.9 (779)
+# BUGS : none
+# NOTES : TS6 nick tracking fix by static
+#
+# BUILD : 1.7.9 (778)
+# BUGS : N/A
+# NOTES : inspircd fixs, debug output fix
+#
+# BUILD : 1.7.9 (777)
+# BUGS : N/A
+# NOTES : Synced with [brain]s cvs server
+#
+# BUILD : 1.7.9 (776)
+# BUGS : none
+# NOTES : Prepended all debug messages for consistency.
+#
+# BUILD : 1.7.9 (775)
+# BUGS :
+# NOTES : Fixed possible segfaults in ns_maxemail
+#
+# BUILD : 1.7.9 (774)
+# BUGS : 366
+# NOTES : Updated chan_set_correct_modes() to work ok with U:Lined servers and added checking for OPDEOPME next to AUTOOP levels (same for the other modes)
+#
+# BUILD : 1.7.9 (773)
+# BUGS : none
+# NOTES : Development Framework.
+#
+# BUILD : 1.7.9 (771)
+# BUGS : none
+# NOTES : Anope 1.7.9 Release (fixed compiler warning).
+#
+# BUILD : 1.7.9 (770)
+# BUGS : none
+# NOTES : Anope 1.7.9 Release.
+#
+# BUILD : 1.7.8 (769)
+# BUGS : N/A
+# NOTES : Quick tidy up to cs_enforce
+#
+# BUILD : 1.7.8 (768)
+# BUGS : N/A
+# NOTES : synced with [brain]s cvs server
+#
+# BUILD : 1.7.8 (767)
+# BUGS : N/A
+# NOTES : Removed some pointless alogs
+#
+# BUILD : 1.7.8 (766)
+# BUGS : N/A
+# NOTES : Added author/version and type to cs_tban
+#
+# BUILD : 1.7.8 (765)
+# BUGS : 352
+# NOTES : Fixed various PTlink vhost handling bugs. Added a fake umode to indicate we have a vHost, to not break other IRCDs which DO use umodes. Ignoring PTlinks NEWMASK on SVSMODE +r, as that would desynch the services internal vhost.
+#
+# BUILD : 1.7.8 (764)
+# BUGS : 363
+# NOTES : Missing (c->)ci check in do_topic(), causing segfaults...
+#
+# BUILD : 1.7.8 (763)
+# BUGS : none
+# NOTES : Final file normalization, Languages ready for dev release.
+#
+# BUILD : 1.7.8 (762)
+# BUGS : none
+# NOTES : Language file normalization
+#
+# BUILD : 1.7.8 (761)
+# BUGS : N/A
+# NOTES : Tidied up tr.l in trunk
+#
+# BUILD : 1.7.8 (759)
+# BUGS :
+# NOTES : Various updates to the modulepack, and fixed an issue with mod_current_module set incorrectly in some cases, making the lang functions fail
+#
+# BUILD : 1.7.8 (758)
+# BUGS : 332
+# NOTES : FIXED: anope_event_away() doing dangerous things with ac/av, viagra had issues in notice_ops, anope_cmd_mode() used wrongly for dreamforge and ultimate2
+#
+# BUILD : 1.7.8 (757)
+# BUGS : 355 361
+# NOTES : FIXED: Seperated +q/+a and +o in chan_set_correct_modes, and used +Z (and not +R) for services roots with ultimate3.
+#
+# BUILD : 1.7.8 (756)
+# BUGS : N/A
+# NOTES : Turnend -x off
+#
+# BUILD : 1.7.8 (754)
+# BUGS : N/A
+# NOTES : store default vales in Config properly
+#
+# BUILD : 1.7.8 (753)
+# BUGS : N/a
+# NOTES : Merged anope-dev with trunk
+#
+# BUILD : 1.7.8 (752)
+# BUGS : none
+# NOTES : Startup alog language change to reflect modular ircd protocol.
+#
+# BUILD : 1.7.8 (751)
+# BUGS : none
+# NOTES : Added latest inspircd protocol file
+#
+# BUILD : 1.7.8 (750)
+# BUGS : 354 316
+# NOTES : FIXED: (354) typo in include/extern.h (316) modes with no arguments where required being set internally with /os mode
+#
+# BUILD : 1.7.8 (749)
+# BUGS :
+# NOTES : Fixed small example.conf typo and updated win32 stuff by heinz (and VBS is evil!)
+#
+# BUILD : 1.7.8 (748)
+# BUGS :
+# NOTES : Updates ns_noop by DrS, and added a small debug with send_event which can be handy with debugging
+#
+# BUILD : 1.7.8 (747)
+# BUGS : N/A
+# NOTES : win32 makefile patchs - install.vbs isnt in svn yet!
+#
+# BUILD : 1.7.8 (746)
+# BUGS : N/A
+# NOTES : Compile issues when encryption is used
+#
+# BUILD : 1.7.8 (745)
+# BUGS : N/A
+# NOTES : Fixed cs_tban help for newlines, and fixed null in os_info
+#
+# BUILD : 1.7.8 (744)
+# BUGS : N/A
+# NOTES : Added cs_tban
+#
+# BUILD : 1.7.8 (743)
+# BUGS :
+# NOTES : <heinz> missed Changes.conf
+#
+# BUILD : 1.7.8 (742)
+# BUGS :
+# NOTES : Added five modules of the modulepack, and added their configvars to the config file
+#
+# BUILD : 1.7.8 (741)
+# BUGS :
+# NOTES : Fixed a small bug with my previous am update and ran indent on src/core and src/protocol
+#
+# BUILD : 1.7.8 (740)
+# BUGS :
+# NOTES : Updated am to also indent src/core and src/protocol files
+#
+# BUILD : 1.7.8 (739)
+# BUGS :
+# NOTES : Modularized BotServ fantasy commands, and fixed a small error with BOT_SEEN_UNKNOWN in most langfiles (most had a newline after it)
+#
+# BUILD : 1.7.8 (738)
+# BUGS :
+# NOTES : Updated docs/EVENTS -- It was ancient! We have argc/argv now, and we have a few new events as well...
+#
+# BUILD : 1.7.8 (737)
+# BUGS :
+# NOTES : Added EVENT_PART_CHANNEL (same params as JOIN_CHANNEL)
+#
+# BUILD : 1.7.8 (736)
+# BUGS :
+# NOTES : Fixed Rob his spelling mistakes with langau... language -- Added EVENT_JOIN_CHANNEL for when users join a channel (av: [0] START/STOP [1] nick [2] chan)
+#
+# BUILD : 1.7.8 (735)
+# BUGS : N/A
+# NOTES : Applied crazys patch for gcc4 compiling
+#
+# BUILD : 1.7.8 (734)
+# BUGS : N/A
+# NOTES : Synced with brains cvs for inspircd
+#
+# BUILD : 1.7.8 (733)
+# BUGS : N/A
+# NOTES : synced with brains cvs tree
+#
+# BUILD : 1.7.8 (732)
+# BUGS : N/a
+# NOTES : Synced with [brain]s cvs for inspircd support
+#
+# BUILD : 1.7.8 (731)
+# BUGS : N/A
+# NOTES : shadowircd.c will never try and use a null, i hope shadows comments can be beleived :)
+#
+# BUILD : 1.7.8 (730)
+# BUGS : N/A
+# NOTES : Dont leave the tmp veriable un-freeed in the hs_conf demo module
+#
+# BUILD : 1.7.8 (729)
+# BUGS : N/A
+# NOTES : added hs_conf.c to the demos folder
+#
+# BUILD : 1.7.8 (728)
+# BUGS : N/A
+# NOTES : Anope compiles with no modules present at all :)
+#
+# BUILD : 1.7.8 (727)
+# BUGS : N/A
+# NOTES : ci always set
+#
+# BUILD : 1.7.8 (726)
+# BUGS :
+# NOTES : Ran indent on src/modules.c -- Added support for multi-line language texts with the module lang system -- Fixed display help texts with the modulelang system; mod_current_module(_name) was not set correctly
+#
+# BUILD : 1.7.8 (725)
+# BUGS : N/A
+# NOTES : Added multi-langauge module framework
+#
+# BUILD : 1.7.8 (724)
+# BUGS : N/A
+# NOTES : Added new module type
+#
+# BUILD : 1.7.8 (723)
+# BUGS :
+# NOTES : Small error with variable names fixed. That is what you get for coding on sunday...
+#
+# BUILD : 1.7.8 (722)
+# BUGS : N/A
+# NOTES : Moved demo modules to demos folder
+#
+# BUILD : 1.7.8 (721)
+# BUGS :
+# NOTES : EVENT_TOPIC_UPDATES is now sent for all channels, not just registered ones, and it has no NULL-argument anymore (which sstrdup() complained about)
+#
+# BUILD : 1.7.8 (720)
+# BUGS :
+# NOTES : Fixed normalizeBuffer using malloc() instead of smalloc()
+#
+# BUILD : 1.7.8 (719)
+# BUGS : N/A
+# NOTES : Restored old win32 makefile (i think)
+#
+# BUILD : 1.7.8 (718)
+# BUGS : N/A
+# NOTES : Removed old calls to addCoreCommand()
+#
+# BUILD : 1.7.8 (717)
+# BUGS : N/A
+# NOTES : Didnt mean to commit alog()s :)
+#
+# BUILD : 1.7.8 (716)
+# BUGS : N/A
+# NOTES : Fixed cs_xop
+#
+# BUILD : 1.7.8 (715)
+# BUGS : N/A
+# NOTES : Heinz win32 patch part 2 of 2
+#
+# BUILD : 1.7.8 (714)
+# BUGS : N/A
+# NOTES : Applied heinzs win32 patch (part 1)
+#
+# BUILD : 1.7.8 (713)
+# BUGS :
+# NOTES : Cosmetic updates for OSOpersOnly
+#
+# BUILD : 1.7.8 (712)
+# BUGS : N/A
+# NOTES : Added OSOpersOnly as a default config flag, when enabled, it will prefect modules from adding operserv commands with the standard command access level checks.
+#
+# BUILD : 1.7.8 (711)
+# BUGS : N/A
+# NOTES : Fixed what i broke in Changes file :)
+#
+# BUILD : 1.7.8 (710)
+# BUGS : N/A
+# NOTES : Updated version numbers on modules to use svn revision string
+#
+# BUILD : 1.7.8 (709)
+# BUGS : N/A
+# NOTES : Dont event params if there wernt any, while it isnt a problem to do so, its a waste of time.
+#
+# BUILD : 1.7.8 (708)
+# BUGS : N/A
+# NOTES : Added a fantasy command to events.c to demo the easy event system for botserv fantasy commands.
+#
+#
+# BUILD : 1.7.8 (706)
+# BUGS : N/A
+# NOTES : Dont seg on -version anymore
+#
+# BUILD : 1.7.8 (705)
+# BUGS : N/A
+# NOTES : Applied DrSteins patch, convereted all events to argc,argv this means we can expand the event system alot without breaking modules more in the future.
+#
+# BUILD : 1.7.8 (704)
+# BUGS : N/A
+# NOTES : Converted nenolods (spellin?) new shadowircd.c file into a suitable module format
+#
+# BUILD : 1.7.8 (703)
+# BUGS : N/A
+# NOTES : I trust heniz, really i do!
+#
+# BUILD : 1.7.8 (702)
+# BUGS : N/A
+# NOTES : Removed extra gap in lang. files
+#
+# BUILD : 1.7.8 (701)
+# BUGS : N/A
+# NOTES : Finished all the modular work, all servs are now fully modular :)
+#
+# BUILD : 1.7.8 (700)
+# BUGS :
+# NOTES : Updated the FAQ to enlighten people about how to enable RAW if really needed
+#
+# BUILD : 1.7.8 (699)
+# BUGS : N/A
+# NOTES : synced with inspircds cvs
+#
+# BUILD : 1.7.8 (698)
+# BUGS : N/A
+# NOTES : Fixed case insensitve token matching for ircd messages
+#
+# BUILD : 1.7.8 (697)
+# BUGS : N/A
+# NOTES : Synced our svn with brains cvs for inspircd
+#
+# BUILD : 1.7.8 (696)
+# BUGS : N/A
+# NOTES : Moved veriable declare, used the right version of inspircd.c and .h :)
+#
+# BUILD : 1.7.8 (695)
+# BUGS : N/A
+# NOTES : Modularised nickserv, added brians inspircd module to ./src/protocols
+#
+# BUILD : 1.7.8 (694)
+# BUGS : N/A
+# NOTES : Added AnopeFini() calls to all modules - i forgot them :(
+#
+#
+# BUILD : 1.7.8 (693)
+# BUGS : N/A
+# NOTES : Removed the os_raw module from the example.conf
+#
+# BUILD : 1.7.8 (692)
+# BUGS : N/A
+# NOTES : OperServ now nice and modular
+#
+# BUILD : 1.7.8 (691)
+# BUGS : N/A
+# NOTES : All compiles for win32 now thanks to heniz the window fitter :)
+#
+# BUILD : 1.7.8 (690)
+# BUGS : N/A
+# NOTES : Updated example.conf and Changes.conf
+#
+# BUILD : 1.7.8 (689)
+# BUGS : N/A
+# NOTES : BotServ is now all modular
+#
+# BUILD : 1.7.8 (688)
+# BUGS : N/A
+# NOTES : Added helpserv stuff
+#
+# BUILD : 1.7.8 (684)
+# BUGS : N/A
+# NOTES : Converted memoserv over to be module based too
+#
+# BUILD : 1.7.8 (683)
+# BUGS : N/A
+# NOTES : Module subfolders now get ./configure called on them if it exists, so they could check for any custom libraries they need etc... now.
+#
+#
+# BUILD : 1.7.8 (682)
+# BUGS : N/A
+# NOTES : Removed a couple of alog debug output from the previous bug hunting fun
+#
+# BUILD : 1.7.8 (681)
+# BUGS : N/A
+# NOTES : Events no long segfault after when being called after mod-unloaded.
+#
+# BUILD : 1.7.8 (680)
+# BUGS : N/A
+# NOTES : Added Id keyword (i think)
+#
+# BUILD : 1.7.8 (679)
+# BUGS : N/A
+# NOTES : id test... :/
+#
+# BUILD : 1.7.8 (678)
+# BUGS : N/A
+# NOTES : Added module types
+#
+# BUILD : 1.7.8 (676)
+# BUGS : N/A
+# NOTES : Added modules to hostserv Changes.conf line
+#
+# BUILD : 1.7.8 (675)
+# BUGS : N/A
+# NOTES : Swaped declarations of found around so older compilers dont complain
+#
+# BUILD : 1.7.8 (674)
+# BUGS : N/A
+# NOTES : Updated Changes.conf
+#
+# BUILD : 1.7.8 (673)
+# BUGS : N/A
+# NOTES : Added warning in example.conf
+#
+# BUILD : 1.7.8 (672)
+# BUGS : N/A
+# NOTES : dos2unix on all hs .c files
+#
+# BUILD : 1.7.8 (671)
+# BUGS : N/A
+# NOTES : Removed extra space from lang file
+#
+# BUILD : 1.7.8 (670)
+# BUGS : N/A
+# NOTES : Added host langage strings to all languages.
+#
+# BUILD : 1.7.8 (669)
+# BUGS : N/A
+# NOTES : Added module.h to ./include/
+#
+# BUILD : 1.7.8 (668)
+# BUGS : N/A
+# NOTES : Added ircd.c file :)
+#
+# BUILD : 1.7.8 (663)
+# BUGS :
+# NOTES : Small typo in last commit
+#
+# BUILD : 1.7.8 (662)
+# BUGS : 342
+# NOTES : I should know that real_av and av are not identical, thanks for pointing that out heinz :P
+#
+# BUILD : 1.7.8 (661)
+# BUGS : 341 342
+# NOTES : Fixed removing modes when users with insufficient rights entered a channel, and added a check to make sure the guestnick is not in use yet
+#
+# BUILD : 1.7.8 (660)
+# BUGS :
+# NOTES : Added .BANNER file for the Config script
+#
+# BUILD : 1.7.8 (659)
+# BUGS : N/A
+# NOTES : dbgen script will now accept a blank sql pass if you tell it too...
+#
+# BUILD : 1.7.8 (658)
+# BUGS : 658
+# NOTES : Applied qa patch for bug 658
+#
+# BUILD : 1.7.8 (657)
+# BUGS : 346 351 341 328 345
+# NOTES : Added channame to XOP/ACCESS/AKICK CLEAR, added checks to /hs off, fixed guest nick to take an unused nick, added SVN revision to win32 versions, fixed /ns alist to not accept invalid access levels, improved Config script, fixed responses for /ns glist/alist -- ty qa ;)
+#
+# BUILD : 1.7.8 (656)
+# BUGS : 331
+# NOTES : (1) Updated de.l (2) mydbgen will now be installed correctly (3) added support for cmodes +SN to solidircd
+#
+# BUILD : 1.7.8 (655)
+# BUGS :
+# NOTES : We need to update the sync-state for leaf servers as well, or strange things will happen...
+#
+# BUILD : 1.7.8 (654)
+# BUGS :
+# NOTES : DrSteins Makefile Patches...
+#
+# BUILD : 1.7.8 (653)
+# BUGS : 339
+# NOTES : Chanserv now sets topic when channel is recreated.
+#
+# BUILD : 1.7.8 (652)
+# BUGS :
+# NOTES : Changed anoperc to use numerics for compliance.
+#
+# BUILD : 1.7.8 (651)
+# BUGS : none
+# NOTES : Applied shadowirc.c patch from nenolod.
+#
+# BUILD : 1.7.8 (650)
+# BUGS : 338
+# NOTES : Moved GlobalOnCycleUP again...
+#
+# BUILD : 1.7.8 (649)
+# BUGS : 336
+# NOTES : Moved code for GlobalOnCycleUP to after the server has connected.
+#
+# BUILD : 1.7.8 (648)
+# BUGS : 337
+# NOTES : Fixed the db query for anope_cs_akicks in display name change function.
+#
+# BUILD : 1.7.8 (647)
+# BUGS : 326
+# NOTES : Changed usermode for ultimate3 SRA to +Z
+#
+# BUILD : 1.7.8 (646)
+# BUGS : 327 329 334 335
+# NOTES : Fixed quite a few bugs with mode handling (not always removed correctly, added/removed modes were split), fixed a segfault in chan_set_correct_modes, fixed some issues with topic setting, made stripModePrefix really stripping the mode prefix instead of the first char
+#
+# BUILD : 1.7.8 (645)
+# BUGS : none
+# NOTES : Language file normalization.
+#
+# BUILD : 1.7.8 (644)
+# BUGS : 330
+# NOTES : Fixed bugs with nickserv suspend
+#
+# BUILD : 1.7.8 (643)
+# BUGS :
+# NOTES : Fixed: (1) memleak in nickIsServices [src/misc.c] (2) Fixed language files to reflect r641 (3) Updated nl.l (4) Added event of r642 to docs/EVENTS
+#
+# BUILD : 1.7.8 (642)
+# BUGS :
+# NOTES : Minor Update (Event Handler) for SUSPENDING
+#
+# BUILD : 1.7.8 (641)
+# BUGS :
+# NOTES : Added SUSPEND and UNSUSPEND to NickServ. Also added running as root check to anoperc.
+#
+# BUILD : 1.7.8 (640)
+# BUGS : 323
+# NOTES : Fixed /ns update setting +a if you had rights to get +q but already had it
+#
+# BUILD : 1.7.8 (639)
+# BUGS :
+# NOTES : Some more fixing of the topic stuff to get it to work better with UnrealIRCd
+#
+# BUILD : 1.7.8 (638)
+# BUGS :
+# NOTES : Accidently left 2 lines too much while fixing the topics being re-set on sync, causing them to be re-set on every normal join sent via SJOIN
+#
+# BUILD : 1.7.8 (637)
+# BUGS :
+# NOTES : Changed the email addy of Simba in Changes
+#
+# BUILD : 1.7.8 (636)
+# BUGS :
+# NOTES : When the topic was fully identical to the topiclocked one it still was being re-set, fixed that
+#
+# BUILD : 1.7.8 (635)
+# BUGS :
+# NOTES : Topics should be only updated when really needed during bursts now (on IRCDs that support it)
+#
+# BUILD : 1.7.8 (634)
+# BUGS : 321
+# NOTES : Applied Trystans patch for shadow-ircd nick changing and vhosting - there are still issues with it tho.
+#
+# BUILD : 1.7.8 (633)
+# BUGS : none
+# NOTES : OS SET SQL ON shall warn about SQL disabled in services.conf
+#
+# BUILD : 1.7.8 (632)
+# BUGS : 315
+# NOTES : 422 is sent if the file dosnt exist, 375 and 376 are no longer sent, if the error numeric is sent.
+#
+# BUILD : 1.7.8 (631)
+# BUGS : 320
+# NOTES : Fixed an error in the big if/else if thing when setting the modes on SJOIN, should now give correct modes
+#
+# BUILD : 1.7.8 (630)
+# BUGS : N/A
+# NOTES : Use sstrdup instead of strdup
+#
+# BUILD : 1.7.8 (629)
+# BUGS : 313
+# NOTES : Updated mydbgen and Changes.mysql to remove anope_os_cache
+#
+# BUILD : 1.7.8 (628)
+# BUGS : none
+# NOTES : Moved ALIST from CHAN_HELP to NICK_HELP on es.l (Reported
+# by alladus)
+#
+# BUILD : 1.7.8 (627)
+# BUGS : 318
+# NOTES : ChanServ will now include the channel name in SET responses. By Drstein
+#
+# BUILD : 1.7.8 (626)
+# BUGS : N/A
+# NOTES : Moved the protect defines out of the ircd protocol header files.
+#
+#
+# BUILD : 1.7.8 (625)
+# BUGS : 319
+# NOTES : Globalized do_getkey by DrStein.
+#
+# BUILD : 1.7.8 (624)
+# BUGS : 312
+# NOTES : Revision 623 was the bugfix for bug 312, noted it in Changes now
+#
+# BUILD : 1.7.8 (623)
+# BUGS :
+# NOTES : FAQ update (thx DrS)
+#
+# BUILD : 1.7.8 (622)
+# BUGS : 317
+# NOTES : Applied Trystans patch to remove old ifdef convertor code
+#
+# BUILD : 1.7.8 (621)
+# BUGS : 314
+# NOTES : Fixed normalizeBuffer not being freed twice (anope_cmd_ctcp / delete_user)
+#
+# BUILD : 1.7.8 (620)
+# BUGS : 313
+# NOTES : Fixed various mistakes, as listed in bug 313 (only the mydbgen issue is not done yet)
+#
+# BUILD : 1.7.8 (619)
+# BUGS :
+# NOTES : Fixed the recording of server sync state more reliable, which fixes a bug where servers which did not report bursts would always remain in burst-mode internally
+#
+# BUILD : 1.7.8 (618)
+# BUGS :
+# NOTES : Fixed a small error in my previous commit caused by making a few if/else if easier to read
+#
+# BUILD : 1.7.8 (617)
+# BUGS :
+# NOTES : Fixed: [1] Will not set already set channel modes anymore [2] Do not display entrymsg/greet while syncing [3] Sync state for uplink not always set correctly
+#
+# BUILD : 1.7.8 (616)
+# BUGS :
+# NOTES : Added EVENT_DB_BACKUP and changed EVENT_BOT_ASSIGN to pass channel name instead of bot nick as argument
+#
+# BUILD : 1.7.8 (615)
+# BUGS : N/A
+# NOTES : PTlink has +a
+#
+# BUILD : 1.7.8 (614)
+# BUGS :
+# NOTES : Updated es.l - thx DrStein
+#
+# BUILD : 1.7.8 (613)
+# BUGS :
+# NOTES : Documentation: 1) Added PROXY for information on the current state of the proxy detector 2) Updated the event list of EVENTS to be more clear
+#
+# BUILD : 1.7.8 (612)
+# BUGS : none
+# NOTES : Updated pt.l by Ricardo.
+#
+# BUILD : 1.7.8 (611)
+# BUGS : none
+# NOTES : alogs display the real host instead of vhost.
+#
+# BUILD : 1.7.8 (610)
+# BUGS :
+# NOTES : Update tools README for one documentation style
+#
+# BUILD : 1.7.8 (609)
+# BUGS :
+# NOTES : Updated the README for tools.
+#
+# BUILD : 1.7.8 (608)
+# BUGS :
+# NOTES : Added db-merger and epona db converter. docs will follow.
+#
+# BUILD : 1.7.8 (607)
+# BUGS : N/A
+# NOTES : Clean up after proxy was removed, some Win32 touch ups
+#
+# BUILD : 1.7.8 (606)
+# BUGS :
+# NOTES : Removed proxy detector code from the core, threads stuff still there. Needs good testing
+#
+# BUILD : 1.7.8 (605)
+# BUGS : N/A
+# NOTES : Win32 encryption fixed
+#
+# BUILD : 1.7.8 (604)
+# BUGS : N/A
+# NOTES : tolower/toupper compiler errors on Win32.
+#
+# BUILD : 1.7.8 (603)
+# BUGS : N/A
+# NOTES : Fixed EVENT_DEFCON_LEVEL
+#
+# BUILD : 1.7.8 (602)
+# BUGS : 308, 311
+# NOTES : Fixed a couple of bugs, some smelling errors, and only in debug will nonexistent warnings display
+#
+# BUILD : 1.7.8 (601)
+# BUGS : N/A
+# NOTES : Only module subfolders which contain Makefiles will be compiled on nix
+#
+# BUILD : 1.7.8 (600)
+# BUGS : N/A
+# NOTES : Added UPDATE to the ns help menu
+#
+# BUILD : 1.7.8 (599)
+# BUGS : N/A
+# NOTES : Cleaned up debug message for Win32 users
+#
+# BUILD : 1.7.8 (598)
+# BUGS : 310
+# NOTES : Updated Unreal 3.2 token support.
+#
+# BUILD : 1.7.8 (596)
+# BUGS : N/A
+# NOTES : Added clean_modules and distclean_modules as valid make targets
+#
+# BUILD : 1.7.8 (595)
+# BUGS : N/A
+# NOTES : ShadowIRCD, and cleaned up Numeric
+#
+# BUILD : 1.7.8 (594)
+# BUGS : N/A
+# NOTES : Changes strdup to sstrdup - doh!
+#
+# BUILD : 1.7.8 (593)
+# BUGS : 307
+# NOTES : Fixed admin/owner mode handling
+#
+# BUILD : 1.7.8 (591)
+# BUGS : 306
+# NOTES : Fixed LogUser message, normalizes the "realname" on nick change.
+#
+# BUILD : 1.7.8 (590)
+# BUGS : 288 / N/A
+# NOTES : Fixed 288, moved updated all set/unset admin/owner calls to use the ircd protocol files. This needs a fair good test, but it seems all ok, and i cant see anything wrong with it :)
+#
+#
+# BUILD : 1.7.8 (589)
+# BUGS : 303
+# NOTES : normalizeBuffer() now strips two digit color codes
+#
+# BUILD : 1.7.8 (588)
+# BUGS : 304
+# NOTES : 1. nickIsServices() no longer alters the buffer 2. Fixes +I on Unreal and Bahamut 3. Anope Feature Request 285
+# 4. Updates documentation 5. Ratbox compiles clean with make strict 6. Trap and storing of NICKCHARS
+#
+# BUILD : 1.7.8 (587)
+# BUGS : N/A
+# NOTES : Fixed a typo in the win32 makefile.inc
+#
+#
+# BUILD : 1.7.8 (586)
+# BUGS : N/A
+# NOTES : Added multifile module support for win32 - thanks heinz :)
+#
+# BUILD : 1.7.8 (585)
+# BUGS : N/A
+# NOTES : removed veriable that isnt used anymore :)
+#
+#
+# BUILD : 1.7.8 (584)
+# BUGS : N/A
+# NOTES : Removed ircd_catserv.c and added ./src/modules/catserv/ subfolder
+#
+#
+# BUILD : 1.7.8 (583)
+# BUGS : N/A
+# NOTES : Added multifile module support for nix, win32 will follow
+#
+# BUILD : 1.7.8 (582)
+# BUGS :
+# NOTES : Another update in the docs/ dir. All that's left is FAQ now if i'm right. Has been noted in Changes already in r578
+#
+# BUILD : 1.7.8 (581)
+# BUGS :
+# NOTES : Another docs/ style update - has been noted in Changes at r578
+#
+# BUILD : 1.7.8 (580)
+# BUGS : 301 302
+# NOTES : Fixed (1) uninitialized var in nickserv do_drop (2) remote whois returning incorrect numeric (3) some operserv commands using notice() instead of notice_user()
+#
+# BUILD : 1.7.8 (579)
+# BUGS :
+# NOTES : Updated a small leftover from my previous commit.
+#
+# BUILD : 1.7.8 (578)
+# BUGS :
+# NOTES : Updates of documentation (BUGS, IRCD, EVENTS, MYSQL, INSTALL, MODULES, DEFCON) for one style and some smaller fixes and updates.
+#
+# BUILD : 1.7.8 (577)
+# BUGS :
+# NOTES : Applied a patch in behalf of heinz.
+#
+# BUILD : 1.7.8 (576)
+# BUGS : N/A
+# NOTES : Build flag to show its Win32
+#
+# BUILD : 1.7.8 (575)
+# BUGS : N/A
+# NOTES : Some event clean ups found by heinz today
+#
+# BUILD : 1.7.8 (574)
+# BUGS : N/A
+# NOTES : Internal Events, Win32 can build with encryption, nickIsServices() works if format is nick@services
+#
+# BUILD : 1.7.8 (573)
+# BUGS : 296
+# NOTES : mod_current_buffer was not set in all possible cases
+#
+# BUILD : 1.7.8 (572)
+# BUGS :
+# NOTES : fixed grammar.
+#
+# BUILD : 1.7.8 (571)
+# BUGS :
+# NOTES : Updated userkey infos in example.conf.
+#
+# BUILD : 1.7.8 (570)
+# BUGS : 294
+# NOTES : Win32 Module Load Errors
+#
+# BUILD : 1.7.8 (569)
+# BUGS : N/A
+# NOTES : Cleaned up the win32 makefiles, fixed hs_moo
+#
+# BUILD : 1.7.8 (568)
+# BUGS : N/A
+# NOTES : Set default value for botmodes
+#
+# BUILD : 1.7.8 (565)
+# BUGS : 293
+# NOTES : Merge of Win32 branch into the main, support for Unreal +I, German language updated, fixed bug vidents not
+# updating, Setting and Removal of sqlines on forbid or drop
+#
+# BUILD : 1.7.8 (564)
+# BUGS : 285
+# NOTES : Compiling modules under MacOSX, and fixes up some ChanServ stuff
+#
+# BUILD : 1.7.8 (563)
+# BUGS : none
+# NOTES : SVN Framework.
+#
+# BUILD : 1.7.8 (561)
+# BUGS : none
+# NOTES : Anope 1.7.8 Release.
+#
+# BUILD : 1.7.7 (560)
+# BUGS : 290, 291
+# NOTES : Fixes HS HELP LIST, and improves on Robs fix for RSEND
+#
+# BUILD : 1.7.7 (559)
+# BUGS : 291
+# NOTES : Fixed memoserv issue :)
+#
+# BUILD : 1.7.7 (558)
+# BUGS : N/A
+# NOTES : Should really fix gcc2 stuff
+#
+# BUILD : 1.7.7 (557)
+# BUGS : N/A
+# NOTES : Should fix gcc2 compiler warnings with ratbox
+#
+# BUILD : 1.7.7 (556)
+# BUGS : N/A
+# NOTES : synced headers so our copyright is 2005, Solid IRCD compiles again, fixed sstrdup() error,
+# updated the documentation a bit, cleaned up ratbox a bit.
+#
+# BUILD : 1.7.7 (555)
+# BUGS : N/A
+# NOTES : TS6 support, Ratbox support, lots of little bug fixes, updated documentation
+#
+# BUILD : 1.7.7 (554)
+# BUGS : none
+# NOTES : Updated pt.l by Ricardo.
+#
+# BUILD : 1.7.7 (553)
+# BUGS : none
+# NOTES : Forgot Changes file :)
+#
+# BUILD : 1.7.7 (552)
+# BUGS : none
+# NOTES : Fixed misplaced MEMO_NO_RSEND_SELF in es.l
+#
+# BUILD : 1.7.7 (551)
+# BUGS : 25
+# NOTES : OperServ HELP cleaned up to show only commands that work on the given ircd
+#
+# BUILD : 1.7.7 (550)
+# BUGS : N/A
+# NOTES : Anope SMTP client
+#
+# BUILD : 1.7.7 (549)
+# BUGS : N/A
+# NOTES : Fixes a segfault with the last commit
+#
+# BUILD : 1.7.7 (548)
+# BUGS : N/A
+# NOTES : Support for PTlinks VHOST (NEWMASK) command.
+#
+# BUILD : 1.7.7 (547)
+# BUGS : 272 275
+# NOTES : Fixes up help for their access levels, and ircops except from ignore in all places
+#
+# BUILD : 1.7.7 (546)
+# BUGS : 271
+# NOTES : Help for /OS HELP SET IGNORE.
+#
+# BUILD : 1.7.7 (545)
+# BUGS : 278
+# NOTES : On vhost unset show the correct vhost character
+#
+# BUILD : 1.7.7 (544)
+# BUGS : N/A
+# NOTES : Forgot the changelog
+#
+# BUILD : 1.7.7 (543)
+# BUGS : 276
+# NOTES : Disables UseRDB when MysqlSecure is enable, since we use one way encryption on the sql databases
+#
+# BUILD : 1.7.7 (542)
+# BUGS : 263
+# NOTES : BotServ bots would flood if they were attempting to reset modes on themselves ie.. (-oooooo), this fix makes
+# them check if they set the mode last on themselves, if so it ignores and continues. This should also fix if you did -v to a bot as it would
+# says non-existant user
+#
+# BUILD : 1.7.7 (541)
+# BUGS : 274, 281
+# NOTES : IRCops are not killed on sqline/sgline when set KillOnSQline or KillOnSGline are enabled, made it so uline
+# servers are except from NOJOIN settings
+#
+# BUILD : 1.7.7 (540)
+# BUGS : 277
+# NOTES : BotServ Badwords (START) would return a false positivie when BSCaseSensitive is enabled
+#
+# BUILD : 1.7.7 (539)
+# BUGS : 279
+# NOTES : Fixed typo in example.conf...
+#
+# BUILD : 1.7.7 (538)
+# BUGS : none
+# NOTES : Framework for svn development.
+#
+# BUILD : 1.7.7 (536)
+# BUGS : none
+# NOTES : Added mysql schema change to mydbgen and created Changes.mysql
+#
+# BUILD : 1.7.7 (535)
+# BUGS : N/A
+# NOTES : Added +h halfop support for plexus - plexus is now fully supported according to ThaPrince (plexus coder) :)
+#
+# BUILD : 1.7.7 (534)
+# BUGS : N/A
+# NOTES : Added support for plexus user timestamping
+#
+# BUILD : 1.7.7 (533)
+# BUGS : N/A
+# NOTES : Added make profile to allow for gprof profiling
+#
+# BUILD : 1.7.7 (532)
+# NOTES : Updated es.l by DrStein
+#
+# BUILD : 1.7.7 (531)
+# NOTES : Language file normalization.
+#
+# BUILD : 1.7.7 (530)
+# BUGS : N/A
+# NOTES : Fixed /ns status to be consistant with what help reports it will do.
+#
+# BUILD : 1.7.7 (529)
+# BUGS :
+# NOTES : Fixed example.conf syntax error, token was space and not comma space.
+#
+# BUILD : 1.7.7 (528)
+# BUGS : N/A
+# NOTES : Rolled back hs_moo - which i didnt mean to commit in the first place :)
+#
+# BUILD : 1.7.7 (527)
+# BUGS : 269
+# NOTES : You can no longer request a reciept when sending a memo to yourself.
+#
+# BUILD : 1.7.7 (526)
+# NOTES : Anope 1.7.7 Release.
+#
+# BUILD : 1.7.6 (525)
+# BUGS :
+# NOTES : Updated nl.l a bit
+#
+# BUILD : 1.7.6 (524)
+# BUGS :
+# NOTES : bot_raw_ban was not adjusted for TSMODE capable IRCDs yet
+#
+# BUILD : 1.7.6 (523)
+# BUGS : 267
+# NOTES : Internal last topic was not emptied on channel creation when KEEPTOPIC was off
+#
+# BUILD : 1.7.6 (522)
+# BUGS : 254
+# NOTES : Memo INFO should finallly be fixed
+#
+# BUILD : 1.7.6 (521)
+# BUGS : 254, 266
+# NOTES : Fixed up some alog() messages, and MemoServ INFO showing -1 for no hard limit
+#
+# BUILD : 1.7.6 (520)
+# BUGS : 265
+# NOTES : Fixed a few issues with chanserv, botserv, symbiosis, and topics
+#
+# BUILD : 1.7.6 (519)
+# BUGS : N/A
+# NOTES : Ultimate3 bug fixes, they have NICKIP, and some channel modes were defined the same causing problems
+#
+# BUILD : 1.7.6 (518)
+# BUGS : 262
+# NOTES : CS ACCESS was also affected by the overflow
+#
+# BUILD : 1.7.6 (517)
+# BUGS : 262
+# NOTES : Fixed integer overflow error with CS LEVELS.
+#
+# BUILD : 1.7.6 (516)
+# BUGS : 261
+# NOTES : This should be it finally! The moduleAddData function was using the old head to append/prepend the new moduleData to, but it had to use the new head. Thanks to DrStein for finding the cause! :)
+#
+# BUILD : 1.7.6 (515)
+# BUGS : 261
+# NOTES : Fixed a few memleaks with moduleData functions returning early, and fixed the list handling with deleting moduleData (thanks DrStein)
+#
+# BUILD : 1.7.6 (514)
+# BUGS : 261
+# NOTES : Modules can no longer call addCommand directly. The mod_name of the command MUST be set if it is a module.
+#
+# BUILD : 1.7.6 (513)
+# BUGS :
+# NOTES : Added warnings for NULL-args with sstrdup, and NULL modname with module*Data functions. Fixed Catserv to use moduleAddCommand instead of addCommand.
+#
+# BUILD : 1.7.6 (512)
+# BUGS :
+# NOTES : Indenting src/modules.c correctly.... it got skipped somehow...
+#
+# BUILD : 1.7.6 (511)
+# BUGS :
+# NOTES : Rollback to 507
+#
+# BUILD : 1.7.6 (507)
+# BUGS : N/A
+# NOTES : Fixed not freeing memory when a channel got deleted.
+#
+# BUILD : 1.7.6 (506)
+# BUGS : 260
+# NOTES : Fixed segfaults in the user-list walking with KillonSGline/KillonSQline
+#
+# BUILD : 1.7.6 (505)
+# BUGS : N/A
+# NOTES : Some documentation updated, fixed compiler errors with ptlink, and fixed a segfault with some options when
+# set with just quotes
+#
+# BUILD : 1.7.6 (504)
+# BUGS : 245
+# NOTES : Enforce SGLINE/SQLINE where the ircd does not do it on its own, and updated ptlink support to be more complaint
+#
+# BUILD : 1.7.6 (503)
+# BUGS : N/A
+# NOTES : Fixes alot of user and channel modes on various ircd, also applied two patches provided by DrStein
+#
+# BUILD : 1.7.6 (502)
+# BUGS : N/A
+# NOTES : SolidIRCD can mlock +R again
+#
+# BUILD : 1.7.6 (501)
+# BUGS : N/A
+# NOTES : Added Flag to tell if we need to enforce SGlines or not so GD can fix 245
+#
+# BUILD : 1.7.6 (500)
+# BUGS : 259
+# NOTES : Added support for hybrid TBURST -- merry xmas :)
+#
+# BUILD : 1.7.6 (499)
+# BUGS :
+# NOTES : Fixed several compiler warnings with make strict, removed 2 deprecated config vars.
+#
+# BUILD : 1.7.6 (498)
+# BUGS : N/A
+# NOTES : Updated plexus.c/.h as per patch from ThaPrince
+#
+# BUILD : 1.7.6 (497)
+# BUGS : 256, 258
+# NOTES : support for QS, and fixed a /away bug
+#
+# BUILD : 1.7.6 (496)
+# BUGS : N/A
+# NOTES : Dreamforge now compiles properly again :)
+#
+# BUILD : 1.7.6 (495)
+# BUGS : N/A
+# NOTES : Moved global regarding the deletion of non-existing session toinside the if(debug) as anope will call that function when users ping out etc
+#
+#
+# BUILD : 1.7.6 (494)
+# BUGS : N/A
+# NOTES : Added support for plexus IRCD - provided by ThaPrince
+#
+# BUILD : 1.7.6 (493)
+# BUGS : N/A
+# NOTES : Applied patch from mitch regarding unclear password emails.
+#
+# BUILD : 1.7.6 (492)
+# BUGS : N/A
+# NOTES : Some gcc2 errors fixed
+#
+# BUILD : 1.7.6 (491)
+# BUGS : N/A
+# NOTES : Forgot to update the change log
+#
+# BUILD : 1.7.6 (490)
+# BUGS : 253
+# NOTES : Fixed loguser where the nickip is 0
+#
+# BUILD : 1.7.6 (489)
+# BUGS : 244, 246, 247, 248, 249, 250, 251, 252, 254, 255
+# NOTES : 1. In some cases READONLY was not respected, and data was saved.
+# 2. Corrected a few mistakes in example.conf.
+# 3. Wrong column type in tables.sql for nick alias status fiag.
+# 4. listchans and listnicks work under Cygwin.
+# 5. NickRegDelay no longer accepts negative values.
+# 6. -is44 option not show if converter not built.
+# 7. Removed #ifndef STREAMLINE from the code as its no longer set during build time
+# 8. MS MAX LIMIT was set incorrectly
+# 9. Segfault if USERDB enabled and tables does not exist
+# 10. Provides clear message of SUPERADMIN is not enabled
+#
+# BUILD : 1.7.6 (488)
+# BUGS : N/A
+# NOTES : del_session() warning messages when LimitSessions is disabled.
+#
+# BUILD : 1.7.6 (487)
+# BUGS :
+# NOTES : Fixed possible NULL-free() in delcore()
+#
+# BUILD : 1.7.6 (486)
+# BUGS : 243
+# NOTES : docs patch to bug 243, and removed shut_clean_user() it started to do more harm then good
+#
+# BUILD : 1.7.6 (485)
+# BUGS :
+# NOTES : Fixed a segfault when unsetting registration modes on hybrid
+#
+# BUILD : 1.7.6 (484)
+# BUGS : 167
+# NOTES : Made BotServ !seen recognize the channel founder
+#
+# BUILD : 1.7.6 (483)
+# BUGS : 240
+# NOTES : 1. ChanServ ACCESS wrong when dealing negative numbers, 2. make strict under FreeBSD works again
+#
+# BUILD : 1.7.6 (482)
+# BUGS : N/A
+# NOTES : Minor updates to the Unreal32 protocol for NICK and NETINFO
+#
+# BUILD : 1.7.6 (481)
+# BUGS :
+# NOTES : Fixed misplaced pointer in moduleaddData().
+#
+# BUILD : 1.7.6 (480)
+# BUGS :
+# NOTES : Updated some formatting in the Changes file
+#
+# BUILD : 1.7.6 (479)
+# BUGS : 239
+# NOTES : Fixes infinite loop with moduleGetData()
+#
+# BUILD : 1.7.6 (478)
+# BUGS : N/A
+# NOTES : 1. CS CLEAR strips +q/+a
+# 2. CS CLEAR uses SVSMODE with Unreal to strip +q/a/o/h/v
+# 3. SVSMODE unban works again on Viagra
+# 4. Adds anope_cmd_svsmode_chan() to for SVSMODE on channels
+# 5. OS CLEARMODES uses SVSMODE with Unreal to strip +q/a/o/h/v
+# 6. memory.c, servers.c, slist.c, sockutil.c, misc. is doxygen ready
+# 7. Unreal32 pseduo clients use SJOIN now to join the channels
+# 8. clean out the process() buffers before we start to use them, maybe less garbage in them when we do bts
+# 9. Few memory cleans up in hostserv do_setall()
+# 10. Tons of clean up, only a handful left when you make strict
+#
+# BUILD : 1.7.6 (477)
+# BUGS : N/A
+# NOTES : list.c and mail.c are doxygen ready now
+#
+# BUILD : 1.7.6 (476)
+# BUGS : N/A
+# NOTES : Fixed Ultimate3 not setting +a on channel admins
+#
+# BUILD : 1.7.6 (475)
+# BUGS : 126
+# NOTES : Some valgrind clean up, should fix 126
+#
+# BUILD : 1.7.6 (474)
+# BUGS : N/A
+# NOTES : Unreal 391 TIME replies
+#
+# BUILD : 1.7.6 (473)
+# BUGS : N/A
+# NOTES : In some cases if you set TOPICLOCK on the channel before it ever got a TOPIC, then attempted to set a TOPIC,
+# services would try to set a maliformed TOPIC message to the ircd.
+#
+# BUILD : 1.7.6 (472)
+# BUGS : N/A
+# NOTES : 1. Bahamut +I support
+# 2. Changes file updated (merged my items under the dev banner)
+#
+# BUILD : 1.7.6 (471)
+# BUGS : N/A
+# NOTES : Redid Services Mode stuff to be config option called UlineServers this allows you to state what servers can set
+# channel modes and we are to respecet the mode. Gotta clean this up some more in a bit
+#
+# BUILD : 1.7.6 (470)
+# BUGS : N/A
+# NOTES : add mode.. not remove mode.. from the previous commit
+#
+# BUILD : 1.7.6 (469)
+# BUGS : N/A
+# NOTES : 1. ultimate3 setting the wrong channel mode on botserv bots
+# 2. helpserv.c is doxygen ready, did some code clean up
+# 3. Services Clients (+S) now override channel modes (yeah no more deopping NeoStats), this only
+# works on ircds where there is a clear services mode (Unreal, Viagra, Ultimeate2/3)
+# 4. send.c is doxygen ready, did some code clean up
+# 5. commands.c id doxygen ready, did some code clean up
+#
+# BUILD : 1.7.6 (468)
+# BUGS : N/A
+# NOTES : 1. fixes del_session() warning when LimitSessions is disabled
+# 2. actions.c is doxygen ready, along with code clean up
+# 3. sessions.c cleaned up and moved some items around
+# 4. ChanServ AKICK (pointed to freed memory)
+# 5. servers.c is doxygen ready, along with some code clean up
+#
+# BUILD : 1.7.6 (467)
+# BUGS :
+# NOTES : Fixed bug with ircd->chanmodes. Thanks to Syzop.
+#
+# BUILD : 1.7.6 (466)
+# BUGS : 237
+# NOTES : docs patch to bug 237
+#
+# BUILD : 1.7.6 (465)
+# BUGS : 218, 235
+# NOTES : 1. correct the grammer in the example.conf
+# 2. SolidIRCD cmode +S
+# 3. NSSecureAdmins now restricts /NS SET EMAIL
+# 4. Unreals version of SVSHOLD
+# 5. SolidIRCD halfop support
+# 6. /os set list
+#
+# BUILD : 1.7.6 (464)
+# BUGS : N/A
+# NOTES : gcc 2.x compiler errors
+#
+# BUILD : 1.7.6 (463)
+# BUGS : 192, 210, 222, 234
+# NOTES : 1. Removed +d references from the ptlink protocol code, since they do not timestamp the nicks
+# 2. Memos sent as notification of receipt can not be cancelled.
+# 3. Unreal3.2 supports SVSMODE -b on clearing bans
+# 4. fixed do_kill() not remove the user from the user list
+# 5. /os set sql [on|off] runtime sql toggle
+# 6. Segfaults logged to the services log when DumpCore is disabled
+# 7. fixed RUNGROUP not passed during build time
+# 8. Exceptions now update if the limit is changed
+# 9. Solid-IRCD support
+# 10. Fixed TSMODE warnings when using FANTASY commands
+# 11. Fixed read_int32 warnings (fixes compiling and running under cygwin)
+# - Thats all..
+#
+# BUILD : 1.7.6 (462)
+# BUGS : 226
+# NOTES : 1. RageIRCD sends TSMODE which is part of their beta7
+# 2. RageIRCD protocol file now has anope_cmd_chghost()
+# 3. RageIRCD SVINFO more in line with what we get
+# 4. Bahamut protocol file now has anope_cmd_chghost() to prevent undefined symbol messages
+# 5. Bahamut SZLINE and UNSZLINE dealt with per documentation, left the old commands behind
+# for now, till we decide to move our base Bahamut version forward
+#
+# BUILD : 1.7.6 (461)
+# BUGS : 230
+# NOTES : 1. Moving Services Operators to Services Admins and vice-versa (230), 2. PTlink anope_cmd_server() had a minor
+# issue thats now fixed
+#
+# BUILD : 1.7.6 (460)
+# BUGS : 223
+# NOTES : HelpChan +h mode not being given if status was greater then op.
+#
+# BUILD : 1.7.6 (459)
+# BUGS : N/A
+# NOTES : Got Unreals SVSNLINE (sgline) working
+#
+# BUILD : 1.7.6 (458)
+# BUGS : N/A
+# NOTES : Updated our SGLINE/SZLINE support to all ircd where avaiable, this fixes some issues as well
+# 1. Unreal still doesnt do SGLINE well so its still disabled at this time
+# 2. We now enforce SZLINE on ircd with NICKIP
+# 3. Added check_szline() so we can check for szline matches
+# 4. Ultimate3 (s)zline work as documented, which is AKILL without the user part
+#
+# BUILD : 1.7.6 (457)
+# BUGS :
+# NOTES : Fixed session decrease on /NS GHOST.
+#
+# BUILD : 1.7.6 (456)
+# BUGS : N/A
+# NOTES : Disables UseRDB if SQL fails to init
+#
+# BUILD : 1.7.6 (455)
+# BUGS : N/A
+# NOTES : Clean up changelog
+#
+# BUILD : 1.7.6 (454)
+# BUGS : 225
+# NOTES : MS CHECK now checks if the nick is forbidden.
+#
+# BUILD : 1.7.6 (453)
+# BUGS : 224
+# NOTES : Removing Sqline on bot nicks change if the nick was registered
+#
+# BUILD : 1.7.6 (452)
+# BUGS : N/A
+# NOTES : 1. Fixed some config options could overflow strtol(), 2. Fixed CTCP Ping replies when UsePrivmsg is enabled
+#
+# BUILD : 1.7.6 (451)
+# BUGS : 221
+# NOTES : Fixes for wrong string for bot nick registration check, and added the check to bot change
+#
+# BUILD : 1.7.6 (450)
+# BUGS :
+# NOTES : Updated en_us.l for new BotServ BOT ADD behaviour
+#
+# BUILD : 1.7.6 (449)
+# NOTES : Language normalization.
+#
+# BUILD : 1.7.6 (448)
+# BUGS :
+# NOTES : Added NSAddAccessOnReg config directive
+#
+# BUILD : 1.7.6 (447)
+# BUGS :
+# NOTES : New botserv bot nicks need to be unregistered nicks from now on
+#
+# BUILD : 1.7.6 (446)
+# BUGS : N/A
+# NOTES : 1. Added a debug message to do_kill(), 2. nsCheckNickTracking() could return true in some cases where the nick
+# was forbidden
+#
+# BUILD : 1.7.6 (445)
+# NOTES : Setup for devel.
+#
+# BUILD : 1.7.6 (443)
+# BUGS : 217
+# NOTES : minor typo with OS CLEARMODES
+#
+# BUILD : 1.7.6 (442)
+# BUGS : N/A
+# NOTES : padded RDB database updates with pongs to help prevent time outs
+#
+# BUILD : 1.7.6 (441)
+# BUGS : 215, 216
+# NOTES : Fixed some last minute bugs, and fixed make strict under Redhat
+#
+# BUILD : 1.7.6 (440)
+# BUGS : 211
+# NOTES : 1. Updated PTLink support, 2. OperServ takes +q/+a on CLEARMODES, 3. fixed a segfault in do_match_wild()
+# reported by DJ
+#
+# BUILD : 1.7.6 (439)
+# BUGS : 68, 170, 209
+# NOTES : 1. DrSteins XOP patch (bug# 170), 2. Cleaned up the English language file for grammar (bug# 209),
+# 3. Patch that fixes segfaults under NetBSD, 4. Cleaned up some places that could lead to segfaults,
+# 5. DrSteins patch for NS ACCESS LIST, 6. Chanserv taking modes more than once (bug #68),
+# 7. Fixed errors when doing "make" under some BSD systems, 8. Fixed syntax error when NSForceEmail is disabled
+#
+#
+# BUILD : 1.7.6 (438)
+# BUGS : 160
+# NOTES : configure warning about sysproto.h resolved
+#
+# BUILD : 1.7.6 (437)
+# NOTES : Anope 1.7.6 Release
+#
+# BUILD : 1.7.5 (436)
+# BUGS : 207
+# NOTES : Fixed up OS CLEARMODES
+#
+# BUILD : 1.7.5 (435)
+# BUGS : 203, 204, 205
+# NOTES : 1. minor fix to CS CLEAR, 2. Added to DrSteins more CS obsecure password, 3. fixed memoserv not using the
+# correct message, 4. fixed botserv info to tell the channel is forbidden
+#
+#
+# BUILD : 1.7.5 (434)
+# BUGS : N/A
+# NOTES : 1. fixed typo in the lang files, 2. updated de.l from Crazytoon, 3. UnRestrictSAdmin for Bahamut to allow them
+# the usage of +a without being a Service Admin
+#
+# BUILD : 1.7.5 (433)
+# BUGS : 182
+# NOTES : Fixed CS not resetting the modes after CS CLEAR MODES
+#
+# BUILD : 1.7.5 (432)
+# BUGS : 199
+# NOTES : 1. fixed unused var from previous commit, 2. normalized the realname when doing LogUsers (199)
+#
+# BUILD : 1.7.5 (431)
+# BUGS : 193
+# NOTES : 1. extern normalizeBuffer() helpful in some many other places not just botserv, 2. fixed BS ACT, if the string
+# contained a control char 001, it would cause the string to act like SAY
+#
+# BUILD : 1.7.5 (430)
+# BUGS : 187, 201, 202
+# NOTES : Reorder fixes, Obsecure password for chanserv registeration (DrStein), minor tweak to hybrid support (TSL)
+#
+# BUILD : 1.7.5 (429)
+# NOTES : Minor fix on example.conf
+#
+# BUILD : 1.7.5 (426)
+# BUGS : 133, 196, 200
+# NOTES : Add method to deal with hardcored sqline in the ircd (133), fixes timestamp errors with TOPIC (196), modes
+# structs externed so mod coders can get to them easier (N/A), MS CHECK now checks the right value (200)
+#
+# BUILD : 1.7.5 (424)
+# BUGS : N/A
+# NOTES : Updated de.l per crazytoon
+#
+# BUILD : 1.7.5 (423)
+# BUGS : N/A
+# NOTES : code tidy up fixes stuff under Freebsd
+#
+# BUILD : 1.7.5 (421)
+# BUGS : 198
+# NOTES : 1. fixes TSMODE warnings found by SGR, 2. Fixed OPNOTICE when doing /CS OP
+#
+# BUILD : 1.7.5 (418)
+# BUGS : N/A
+# NOTES : 1. Fixed Rage IRCD compiler error, 2. Added hook for Unreal SJOIN +I support, 3. wallops() is back, 4.
+# depricated.h added to help older modules work with the new commands
+#
+# BUILD : 1.7.5 (415)
+# BUGS : N/A
+# NOTES : Fixes Unreal NICKIP and SVSMODE, Updated Base64 lib to fix NICKIP, Updated Spanish language file
+#
+# BUILD : 1.7.5 (414)
+# BUGS : N/A
+# NOTES : Deleted compile.sh as it wont work anymore anyway
+#
+# BUILD : 1.7.5 (412)
+# BUGS : 169
+# NOTES : A minor touch up to prevent issues
+#
+# BUILD : 1.7.5 (411)
+# BUGS : 197
+# NOTES : Fixed hostserv message on removal of vhost
+#
+# BUILD : 1.7.5 (410)
+# BUGS :
+# NOTES : Added shot note in example.conf regarding NsRestrictOperNick or whatever it is called.
+#
+# BUILD : 1.7.5 (409)
+# BUGS :
+# NOTES : Made expire_all() extern instead of static.
+#
+# BUILD : 1.7.5 (408)
+# BUGS : 189, 191
+# NOTES : segfault fix, and vident sent to logs when set
+#
+# BUILD : 1.7.5 (407)
+# BUGS : 185, 190
+# NOTES : TTB work again, and RestrictOperNicks is no longer case sensitive
+#
+# BUILD : 1.7.5 (406)
+# BUGS : N/A
+# NOTES : Forgot the changes file
+#
+# BUILD : 1.7.5 (405)
+# BUGS : 180
+# NOTES : Fixed tsbuf not being sent, which caused issues with ircds whom have +d (deaf)
+#
+# BUILD : 1.7.5 (404)
+# BUGS :
+# NOTES : Fixed bug 188.
+#
+# BUILD : 1.7.5 (403)
+# BUGS : 186
+# NOTES : Fixed anope_cmd_server() in some protocol files it was broken
+#
+# BUILD : 1.7.5 (403)
+# BUGS : 186
+# NOTES : Fixed anope_cmd_server() on some protocol files it would not work correctly
+#
+# BUILD : 1.7.5 (402)
+# BUGS : N/A
+# NOTES : Forgot to get chanserv.c and nickserv.c in the last commit
+#
+# BUILD : 1.7.5 (401)
+# BUGS : 147, 179, 181, 183, 184, 186
+# NOTES : Lots of little fixes, should fix OS JUPE issues
+#
+# BUILD : 1.7.5 (400)
+# BUGS : N/A
+# NOTES : Removed debug left over from last commit
+#
+# BUILD : 1.7.5 (399)
+# BUGS : 180, 181
+# NOTES : code tidy up, fixes a few items from bug 180 and 181
+#
+# BUILD : 1.7.5 (398)
+# BUGS : N/A
+# NOTES : Tiny change to save 1*len bytes per line said in a botserv channel - they are freeed anyway, so... :)
+#
+# BUILD : 1.7.5 (396)
+# BUGS : N/A
+# NOTES : Added arvg[0] to AnopeInit call, it will contain the nick of the person who loaded the module. All existing modules are un-effected :)
+#
+# BUILD : 1.7.5 (395)
+# BUGS : N/A
+# NOTES : Fixed a typo in all source files, and merged sstrdup and anopeStrDup, as they do the same thing
+#
+# BUILD : 1.7.5 (394)
+# BUGS : N/A
+# NOTES : More code tidying, added make strict_modules etc, incase module coders what to use it :)
+#
+# BUILD : 1.7.5 (393)
+# BUGS : N/A
+# NOTES : Ultimate3 EOBURST support
+#
+# BUILD : 1.7.5 (392)
+# BUGS : N/A
+# NOTES : More code tidy with strict enabled, some clean up of Unreal32
+#
+# BUILD : 1.7.5 (391)
+# BUGS : N/A
+# NOTES : Code tidy, added make strict to the makefile, allowing ansi Wall pedantic to be used for compiling
+#
+# BUILD : 1.7.5 (390)
+# BUGS : 149
+# NOTES : Bug in MySQL debug, possibly causing segfaults.
+#
+# BUILD : 1.7.5 (385)
+# BUGS : N/A
+# NOTES : Moved more veriable declarations above the new null checking code
+#
+#
+# BUILD : 1.7.5 (384)
+# BUGS : N/A
+# NOTES : Moved veriable declaration to the top of function - btw, are all these null checks needed? createCommand should never be passed NULL values, its a wasted if imho... *shrug*
+#
+#
+# BUILD : 1.7.5 (383)
+# BUGS : N/A
+# NOTES : glist fix - DrStein, improved on DrStein typo fix to init.c - TSL, tons of NULL crash checks - TSL
+#
+# BUILD : 1.7.5 (382)
+# BUGS : N/A
+# NOTES : Really fix news.c (I hope)
+#
+# BUILD : 1.7.5 (381)
+# BUGS : N/A
+# NOTES : fixed up news.c
+#
+# BUILD : 1.7.5 (379)
+# BUGS : 176
+# NOTES : Fixed a possible segfault due to a bug in LogChannel
+#
+# BUILD : 1.7.5 (378)
+# BUGS : N/A
+# NOTES : News reodering - DrStein, TSMODE issues - TSL, NULL crash fixes - TSL
+#
+# BUILD : 1.7.5 (376)
+# BUGS : N/A
+# NOTES : CS INFO - DrStein, init.c typo - DrStein, Bahamut +j support - TSL, more protocol clean up
+#
+# BUILD : 1.7.5 (375)
+# BUGS :
+# NOTES : Fixed Changes files errors.
+#
+# BUILD : 1.7.5 (374)
+# BUGS : N/A
+# NOTES : One last time for hybrid.c
+#
+# BUILD : 1.7.5 (373)
+# BUGS : N/A
+# NOTES : Try again
+#
+# BUILD : 1.7.5 (372)
+# BUGS : N/A
+# NOTES : hybrid.c got screwed by indent try from backup
+#
+# BUILD : 1.7.5 (371)
+# BUGS : 175?
+# NOTES : Fixed some ircd protcol mistakes, clean up clear modes, also a patch form DrStein
+#
+# BUILD : 1.7.5 (369)
+# BUGS : N/A
+# NOTES : Updates BUGS, fixed compiler warning if DEBUG_COMMANDS had been enabled
+#
+# BUILD : 1.7.5 (368)
+# BUGS : N/A
+# NOTES : IRCD protocol clean up, and support for Numerics on Unreal32/RageIRCD
+#
+# BUILD : 1.7.5 (367)
+# BUGS :
+# NOTES : Changed UserKeys from uint to long uint.
+#
+# BUILD : 1.7.5 (366)
+# BUGS :
+# NOTES : Fixed a typo in T his previous commit (logins on -> logs on)
+#
+# BUILD : 1.7.5 (365)
+# BUGS : 172
+# NOTES : - New directive NewsCount
+# - fr.l updated
+# - do_memocheck() globalized the time display
+# - getmemoinfo() improved to return info about being forbidden
+# - fixes svsnick on Unreal
+# - anope_event_null to allow ircd devs to point events that go to no where some where
+# - fixed SQUIT
+#
+# BUILD : 1.7.5 (364)
+# NOTES : Added nullfix patch from Trystan.
+#
+# BUILD : 1.7.5 (363)
+# NOTES : Added unreal fix from Trystan.
+#
+# BUILD : 1.7.5 (362)
+# BUGS : 17 143 147 166 172 173
+# NOTES : Applied patch 927 provided by Trystan.
+#
+# BUILD : 1.7.5 (356)
+# BUGS : N/A
+# NOTES : Fuixed mysql include issue, it should now detect to use mysql/mysql/h or not
+#
+# BUILD : 1.7.5 (355)
+# BUGS : N/A
+# NOTES : An option to not detect mysql has been added to ./Config
+#
+# BUILD : 1.7.5 (354)
+# BUGS :
+# NOTES : Added RestrictOpernicks by request. Small feature.
+#
+# BUILD : 1.7.5 (353)
+# BUGS : N/A
+# NOTES : Fixed version booboo :)
+#
+# BUILD : 1.7.5 (352)
+# BUGS : N/A
+# NOTES : corrected a semi-colon that my compiled dosnt mind, but certuss does :)
+#
+# BUILD : 1.7.5 (351)
+# BUGS : N/A
+# NOTES : Rewrote the internals of moduleData, this will save _lots_ of memory especially on larger networks. The downside is modules using it need to make a tiny, tiny change... :/
+#
+# BUILD : 1.7.5 (350)
+# BUGS :
+# NOTES : Changed mysql init checks so they are only done if mysql is
+# enabled. Many Thanks to DrStein for the patch.
+#
+# BUILD : 1.7.5 (349)
+# BUGS :
+# NOTES : Gave the Doc a mail addy
+#
+# BUILD : 1.7.5 (348)
+# BUGS :
+# NOTES : /os MODE was not functioning, by joining 2 seperate if statements into one the problem was solved. Many Thanks to DrStein for the patch.
+#
+# BUILD : 1.7.5 (347)
+# BUGS :
+# NOTES : Fixed PROTECT_UNSET_MODE from +a to -a -- Certus was too lazy to do it so he asked if i could :\
+#
+# BUILD : 1.7.5 (346)
+# BUGS :
+# NOTES : nl.l updates
+#
+# BUILD : 1.7.5 (345)
+# BUGS :
+# NOTES : Renamed anope_cmd_relase_svshold to anope_cmd_release_svshold
+#
+# BUILD : 1.7.5 (344)
+# BUGS :
+# NOTES : Fixed bug with an uninitialized buffer in check_sqline()
+#
+# BUILD : 1.7.5 (344)
+# BUGS :
+# NOTES : Fixed bug with an uninitialized buffer in check_sqline()
+#
+# BUILD : 1.7.5 (344)
+# BUGS :
+# NOTES : Fixef bug with uninitialized pointer in check_sqline. Thx to codemastr.
+#
+# BUILD : 1.7.5 (343)
+# BUGS : #00
+# NOTES : Fixed previous commit.
+#
+# BUILD : 1.7.5 (342)
+# BUGS : #00
+# NOTES : Certus: Replaced current rand-implementation with arc4random and replaced C++ comments with C-style comments (gcc 2.95 might
+# complain).
+#
+# BUILD : 1.7.5 (341)
+# BUGS : none
+# NOTES : Fixed minor bug in /CS LOGOUT
+#
+# BUILD : 1.7.5 (340)
+# BUGS : none
+# NOTES : Applied patch 830 provided by Trystan to resolve several issues.
+#
+# BUILD : 1.7.5 (338)
+# BUGS : N/A
+# NOTES : Ran autoconf, as configure.in was changed in a previous commit
+#
+# BUILD : 1.7.5 (337)
+# BUGS : N/A
+# NOTES : Moved new channel registeration checks
+#
+# BUILD : 1.7.5 (336)
+# BUGS : 159
+# NOTES : German langfile fixed
+#
+# BUILD : 1.7.5 (335)
+# BUGS : 142, 152, 154, 155, 156, 157, 158
+# NOTES : Applied bugfix bundle patch from Trystan.
+#
+# BUILD : 1.7.5 (334)
+# BUGS :
+# NOTES : Oops in the Changes file... (bad me)
+#
+# BUILD : 1.7.5 (333)
+# BUGS : none
+# NOTES : Fixed verbose Makefile echo
+#
+# BUILD : 1.7.5 (332)
+# BUGS : none
+# NOTES : Added -l option to am script to list possible selectors and
+# fixed destination directory guessing for tags.
+#
+# BUILD : 1.7.5 (331)
+# BUGS :
+# NOTES : Fixed a compile error on gcc2, caused by a misplaced variable declaration
+#
+# BUILD : 1.7.5 (330)
+# BUGS : N/A
+# NOTES : More indent fun!
+#
+# BUILD : 1.7.5 (329)
+# BUGS : N/A
+# NOTES : Fixed more indent crap
+#
+# BUILD : 1.7.5 (328)
+# BUGS : N/A
+# NOTES : Fixed a couple of null char entrys on svn
+#
+# BUILD : 1.7.5 (327)
+# BUGS : none
+# NOTES : Merged anope-capab into main trunk...
+#
+# BUILD : 1.7.5 (325)
+# BUGS : 128 139 146 147 148
+# NOTES : Applied patch supplied by Trystan to fix bugs listed above.
+#
+# BUILD : 1.7.5 (323)
+# BUGS :
+# NOTES : fix seriously stupid booboo introduced by myself (ifdef stuff finally fixed)
+#
+# BUILD : 1.7.5 (322)
+# BUGS :
+# NOTES : fixed small lang mistake
+#
+# BUILD : 1.7.5 (321)
+# BUGS : none
+# NOTES : Fixed make distclean and updated hun.l
+#
+# BUILD : 1.7.5 (320)
+# BUGS :
+# NOTES : Fixed support for Ultimate, Rage and Viagra.
+#
+# BUILD : 1.7.5 (319)
+# BUGS :
+# NOTES : Hopefully fixed the Changes file now
+#
+# BUILD : 1.7.5 (318)
+# BUGS : N/A
+# NOTES : fixed a rearanging error in Changes which i caused :)
+#
+# BUILD : 1.7.5 (317)
+# BUGS : N/A
+# NOTES : autoconf should now deal with no mysql properly
+#
+# BUILD : 1.7.5 (316)
+# BUGS : 131
+# NOTES : Fixed bugs in previous BotServ buffer fix.
+#
+# BUILD : 1.7.5 (315)
+# BUGS :
+# NOTES : Updated documentation to suit the new build process
+#
+# BUILD : 1.7.5 (313)
+# BUGS : none
+# NOTES : Anope 1.7.5 Release
+#
+# BUILD : 1.7.4 (312)
+# BUGS : none
+# NOTES : Fixed bug on am script indent
+#
+# BUILD : 1.7.4 (311)
+# BUGS : none
+# NOTES : Running am script with new am script.
+#
+# BUILD : 1.7.4 (310)
+# BUGS : none
+# NOTES : Fixed am script to run indent on src dir if it exists.
+#
+# BUILD : 1.7.4 (309)
+# BUGS : none
+# NOTES : Added Hungarian and Polish language files.
+#
+# BUILD : 1.7.4 (299)
+# BUGS : none
+# NOTES : Fixed repository decteion and added -P flag for am script.
+#
+# BUILD : 1.7.4 (298)
+# BUGS : none
+# NOTES : Yet another rollback...
+#
+# BUILD : 1.7.4 (283)
+# BUGS : N/A
+# NOTES : Added better mysql detection to autoconf
+#
+# BUILD : 1.7.4 (282)
+# BUGS : N/A
+# NOTES : Starting to add better mysql detection / manaul option
+#
+# BUILD : 1.7.4 (278)
+# BUGS :
+# NOTES : Forgot Changes *shrug*
+#
+# BUILD : 1.7.4 (277)
+# BUGS : 131
+# NOTES : BotServ fantasy modified (module) buffer
+#
+# BUILD : 1.7.4 (275)
+# BUGS : 126
+# NOTES : Fixed the 3rd mem leak identified in this bug report, i didnt find the first two however :/
+#
+#
+# BUILD : 1.7.4 (273)
+# BUGS : 121
+# NOTES : Applied patch provided by Trystan for +A +H support on viagra
+#
+# BUILD : 1.7.4 (272)
+# BUGS : 111,115
+# NOTES : Fixed bugs 111 and 115, both need backporting to 1.6.x
+#
+#
+# BUILD : 1.7.4 (271)
+# BUGS :
+# NOTES : Rolled Back to 291 for GeniusDex
+#
+# BUILD : 1.7.4 (269)
+# BUGS : N/A
+# NOTES : dont use -funsigned-chars as the md5 encryption stuff (while it will still encrypt, probably in a way that is more normal md5) it wont be compatiable with the old md5 encryption, so for now, we will never use it, and itll be left to the OSs to just pick if chars are signed or unsigned....
+#
+#
+# BUILD : 1.7.4 (268)
+# BUGS : N/A
+# NOTES : Fixed position of text after ./Config and make
+#
+# BUILD : 1.7.4 (266)
+# BUGS : N/A
+# NOTES : Added include/Makefile to svn
+#
+# BUILD : 1.7.4 (265)
+# BUGS : N/A
+# NOTES : Only forgot 2 changes :)
+#
+# BUILD : 1.7.4 (264)
+# BUGS : N/A
+# NOTES : Switched to autoconf - try to commit part 1
+#
+# BUILD : 1.7.4 (262)
+# BUGS : 125
+# NOTES : Fixed the /ns release issue with UseSVSHOLD
+#
+# BUILD : 1.7.4 (261)
+# BUGS :
+# NOTES : fixed a tiny memleak in the db routine
+#
+# BUILD : 1.7.4 (260)
+# BUGS :
+# NOTES : Updated nl.l
+#
+# BUILD : 1.7.4 (258)
+# BUGS :
+# NOTES : Added CHECK to the /msg memoserv help menu
+#
+# BUILD : 1.7.4 (257)
+# BUGS : N/A
+# NOTES : Bots will join a channel even if the first user to join is being ignored
+#
+# BUILD : 1.7.4 (230)
+# BUGS : 97
+# NOTES : Fixed the need of hybrid to have Global in LogChan on startup
+#
+# BUILD : 1.7.4 (229)
+# BUGS : 118
+# NOTES : Added warning for a config conflict between LocalAddress and RemoteServer
+#
+# BUILD : 1.7.4 (228)
+# BUGS :
+# NOTES : Fixed a bug with m_time.
+#
+# BUILD : 1.7.4 (223)
+# BUGS :
+# NOTES : Anope crontab failed because when path was too long the ps ux was cut short so grep failed. ps ux was changed to ps auwx to stop this problem (w is stops cutting the lines short)
+#
+# BUILD : 1.7.4 (218)
+# BUGS :
+# NOTES : Fixed compiling problem with Rage and Viagra
+#
+# BUILD : 1.7.4 (216)
+# BUGS :
+# NOTES : Fixed compiling bug with UltimateIRCd3 (thx to kenshinxl)
+#
+# BUILD : 1.7.4 (215)
+# BUGS :
+# NOTES : Forgot the Changes file
+#
+# BUILD : 1.7.4 (214)
+# BUGS : 112
+# NOTES : Removed TSMODE for usermodes on bahamut 1.8
+#
+# BUILD : 1.7.4 (213)
+# BUGS : none
+# NOTES : Testing svn mailing list.
+#
+# BUILD : 1.7.4 (212)
+# BUGS : none
+# NOTES : Moved Changes entries around.
+#
+# BUILD : 1.7.4 (211)
+# BUGS : N/A
+# NOTES : Fixed a booboo with my last commit :)
+#
+# BUILD : 1.7.4 (209)
+# BUGS : none
+# NOTES : Fixed implementation for dynamic server /OS GLOBAL
+#
+# BUILD : 1.7.4 (208)
+# BUGS : none
+# NOTES : New implementation for dynamic server /OS GLOBAL
+#
+# BUILD : 1.7.4 (207)
+# BUGS : N/A
+# NOTES : Fixed PTLink m_server incorrect argument count
+#
+# BUILD : 1.7.4 (206)
+# BUGS : 55
+# NOTES : Added proper Bahamut1.8 support. Merged r132:195 from branch
+# branches/proto/anope-bahamut18 which should now be obsolete.
+#
+# BUILD : 1.7.4 (205)
+# BUGS : none
+# NOTES : SVN Framework.
+#
+# BUILD : 1.7.4 (204)
+# BUGS : none
+# NOTES : Anope 1.7.4 Release
+#
+# BUILD : 1.7.4 (203)
+# BUGS : none
+# NOTES : Anope 1.7.4 Release
+#
+# BUILD : 1.7.3 (202)
+# BUGS : 99
+# NOTES : Completed user defined modes as per Trystan patch
+#
+# BUILD : 1.7.3 (201)
+# BUGS : 91
+# NOTES : Fix provided by trystan - ty :)
+#
+# BUILD : 1.7.3 (200)
+# BUGS : 96
+# NOTES : Fixed wrong bug number on previous commit
+#
+# BUILD : 1.7.3 (199)
+# BUGS : 91
+# NOTES : Added SQLINE to NICK() on PTlink.
+#
+# BUILD : 1.7.3 (198)
+# BUGS : N/A
+# NOTES : Fixed changes format for dengel
+#
+# BUILD : 1.7.3 (197)
+# BUGS : none
+# NOTES : More verbose error messages for services.conf checking.
+#
+# BUILD : 1.7.3 (196)
+# BUGS : 106
+# NOTES : Fixed module support for OpenBSD systems
+#
+# BUILD : 1.7.3 (194)
+# BUGS : none
+# NOTES : Rolled back win32 support files in lieu of a branch.
+#
+# BUILD : 1.7.3 (190)
+# BUGS : 90
+# NOTES : We check now for valid arguments in ModuleAddData().
+#
+# BUILD : 1.7.3 (189)
+# BUGS : 95
+# NOTES : Removed duplicate user kill on hybrid.
+#
+# BUILD : 1.7.3 (188)
+# BUGS : 101
+# NOTES : Unified kill_user function to handle all ircd protocols.
+#
+# BUILD : 1.7.3 (187)
+# BUGS : 102
+# NOTES : Removed duplicate ULTIMATE3 define.
+#
+# BUILD : 1.7.3 (186)
+# BUGS :
+# NOTES : Added langtool.c and modified some langcomp.c stuff in behalf of codemastr (win32 port)
+#
+# BUILD : 1.7.3 (185)
+# BUGS : 99
+# NOTES : User customizable pseudo-client modes.
+#
+# BUILD : 1.7.3 (184)
+# BUGS : 98
+# NOTES : Improved handling of /NS INFO for pseudo-clients.
+#
+# BUILD : 1.7.3 (183)
+# BUGS : 92
+# NOTES : Added check to see if MysqlName and MysqlUser were not null to avoid any problems.
+#
+# BUILD : 1.7.3 (182)
+# BUGS : 94
+# NOTES : Fixed number of spelling errors in en_us.l. Thanks to Trystan for assisting corrections.
+#
+# BUILD : 1.7.3 (181)
+# BUGS : 87
+# NOTES : Fixed several spelling and typing errors in the examples and docs. Thanks to GD for assisting corrections.
+#
+# BUILD : 1.7.3 (180)
+# NOTES : Minor spelling fixes to es.l (needs porting to 1.6)
+#
+# BUILD : 1.7.3 (179)
+# BUGS : 93
+# NOTES : Corrected compile warning for Hybrid support.
+#
+# BUILD : 1.7.3 (176)
+# BUGS :
+# NOTES : Added check to make sure register script was being run from within the bin/ directory. If ./bin/register was used, the path to cache file would be incorrect (../config.cache)
+#
+# BUILD : 1.7.3 (174)
+# BUGS :
+# NOTES : Sorry, another changes file mistake, remember to have a fullstop at the end, AND bug number as [#00] if there is no bug
+#
+# BUILD : 1.7.3 (173)
+# BUGS :
+# NOTES : Fixed Changes file mistake
+#
+# BUILD : 1.7.3 (172)
+# BUGS :
+# NOTES : Added register script in /bin/ to allow central registration of Anope using networks
+#
+# BUILD : 1.7.3 (171)
+# BUGS :
+# NOTES : Fixed big with long NSGuestNickPrefixes. We just used them in a snprintf without checking their size. Fixed a second
+# guestnick bug as well: if compiled for hybrid guestnum was increased, tho it was never used.
+#
+# BUILD : 1.7.3 (170)
+# BUGS : 86
+# NOTES : Buffer initialization for encrypted MySQL passwords.
+#
+# BUILD : 1.7.3 (169)
+# BUGS : 78
+# NOTES : Rewrite of del_exception() fixing segfault and memory leak
+#
+# BUILD : 1.7.3 (167)
+# BUGS :
+# NOTES : Fixed a typo in my last submit, which caused a compile error.
+#
+# BUILD : 1.7.3 (166)
+# BUGS : #84
+# NOTES : MemoServ send limit does no longer apply for services operators. That fixed the problem with /MS STAFF for services
+# ops (they got the "memo limit in time X reached" message).
+#
+# BUILD : 1.7.3 (165)
+# BUGS :
+# NOTES :
+#
+# BUILD : 1.7.3 (164)
+# BUGS :
+# NOTES : Fixed Changes file formatted error
+#
+# BUILD : 1.7.3 (163)
+# BUGS : 67
+# NOTES : Reversed pthread library detection order on ./configure script.
+#
+# BUILD : 1.7.3 (162)
+# BUGS : 79
+# NOTES : Fixed bug 79 (memoserv set notify not working) also fixed a blocker bug in actions.c
+#
+# BUILD : 1.7.3 (161)
+# NOTES : Fixed cut/paste error on mydbgen
+#
+# BUILD : 1.7.3 (159)
+# BUGS :
+# NOTES : Fixed some internal errors with return values in void functions. codemastr needs it to be fixed for the windows
+# port.
+#
+# BUILD : 1.7.3 (157)
+# NOTES : Fixed botched auto-akick enforcer. ? post 1207
+#
+# BUILD : 1.7.3 (152)
+# NOTES : Reverted chanserv.c changes.
+#
+# BUILD : 1.7.3 (151)
+# BUGS : 77
+# NOTES : HostServ functions no longer called for non VHOST capable ircds.
+#
+# BUILD : 1.7.3 (144)
+# BUGS :
+# NOTES : Fixed botserv bug with HAS_EXCEPTION (chmode +e)
+#
+# BUILD : 1.7.3 (131)
+# BUGS :
+# NOTES : Translated daniels changes
+#
+# BUILD : 1.7.3 (130)
+# BUGS : 74
+# NOTES : Better /OS MODLIST output to include version information and
+# a proper list header/footer.
+#
+# BUILD : 1.7.3 (129)
+# BUGS :
+# NOTES : Changed guestnum from static to extern (internal change)
+#
+# BUILD : 1.7.3 (128)
+# NOTES : Typo no Changes file.
+#
+# BUILD : 1.7.3 (126)
+# BUGS : 73
+# NOTES : Repaired /NS GROUP for compiled but disabled MySQL support.
+#
+# BUILD : 1.7.3 (125)
+# BUGS : 72
+# NOTES : New /CS CLEAR HOPS for ircds that support halfops.
+#
+# BUILD : 1.7.3 (124)
+# BUGS : 70
+# NOTES : Fixed typo in example.conf.
+#
+# BUILD : 1.7.3 (123)
+# BUGS : None
+# NOTES : Fixed Changes and version.log format and added reference bug number.
+#
+# BUILD : 1.7.3 (122)
+# BUGS : 71
+# NOTES : New NSNickTracking directive to track nick cores when changing nicks.
+#
+# BUILD : 1.7.3 (121)
+# BUGS : 69
+# NOTES : Cleaned up compile errors on older compilers.
+#
+# BUILD : 1.7.3 (120)
+# BUGS : 50
+# NOTES : Reserved nicks (Q-lined) will be KILLed if taken on induction.
+#
+# BUILD : 1.7.3 (119)
+# BUGS : 54
+# NOTES : Allow /CS SUSPEND on registered non-forbidden channels only
+#
+# BUILD : 1.7.3 (118)
+# BUGS : 56
+# NOTES : Check for VHOST capable ircd on HostServAlias induction.
+#
+# BUILD : 1.7.3 (117)
+# BUGS : 63
+# NOTES : Auto enforce upon AKICK addition.
+#
+# BUILD : 1.7.3 (116)
+# BUGS : 65
+# NOTES : New file docs/OLDCHANGES
+#
+# BUILD : 1.7.3 (115)
+# BUGS : 64
+# NOTES : Removed threads.c
+#
+# BUILD : 1.7.3 (114)
+# BUGS : 64
+# NOTES : Removed threads.c
+#
+# BUILD : 1.7.3 (112)
+# NOTES : Dev framework.
+#
+# BUILD : 1.7.3 (110)
+# NOTES : Anope 1.7.3 Release
+#
+# BUILD : 1.7.3 (109)
+# BUGS :
+# NOTES : make install now moves anoperc to bin, also typos and one bug in anoperc fixed (ps ux changed to ps auxw which was failing when paths were too long to fit on the screen)
+#
+# BUILD : 1.7.3 (108)
+# NOTES : Anope 1.7.3 Release
+#
+# BUILD : 1.7.2 (107)
+# BUGS :
+# NOTES : woops, forgot a small condition ;)
+#
+# BUILD : 1.7.2 (106)
+# BUGS :
+# NOTES : Added BSCaseSensitive directive for a cAsE sEnSiTiVe badword kicker.
+#
+# BUILD : 1.7.2 (104)
+# BUGS :
+# NOTES : Removed some illegal sizeof(void). Thanks to codemastr.
+#
+# BUILD : 1.7.2 (103)
+# BUGS : none
+# NOTES : Added +a/-a support for PTLink ircd.
+#
+# BUILD : 1.7.2 (102)
+# BUGS : 53
+# NOTES : Modified HELP LIST and LIST SYNTAX help messages
+#
+# BUILD : 1.7.2 (101)
+# BUGS : none
+# NOTES : Fixed Makefiles to deal with lang/index properly.
+#
+# BUILD : 1.7.2 (100)
+# BUGS : 52
+# NOTES : Fixed a bug with globals containing format characters
+#
+# BUILD : 1.7.2 (99)
+# BUGS : none
+# NOTES : Removed lang/index since it is auto-generated upon compilation.
+#
+# BUILD : 1.7.2 (98)
+# BUGS : none
+# NOTES : Language file normalization.
+#
+# BUILD : 1.7.2 (97)
+# BUGS : 51
+# NOTES : Fixed a typo in hostserv group help response
+#
+# BUILD : 1.7.2 (96)
+# BUGS : 40
+# NOTES : Added RANDOMNEWS to de.l /OS HELP
+#
+# BUILD : 1.7.2 (95)
+# BUGS : 38
+# NOTES : Fixed xOP management inconsistency.
+#
+# BUILD : 1.7.2 (94)
+# BUGS : 40 (partial)
+# NOTES : Added RANDOMNEWS to pt.l /OS HELP
+#
+# BUILD : 1.7.2 (93)
+# BUGS : 46
+# NOTES : Applied the Rage2 IRCD patch provided by al
+#
+# BUILD : 1.7.2 (92)
+# BUGS : 43
+# NOTES : Fixed moduleData error with memo Data handeling
+#
+# BUILD : 1.7.2 (91)
+# BUGS :
+# NOTES : db_mysql_query memory usage tweaked.
+#
+# BUILD : 1.7.2 (90)
+# BUGS :
+# NOTES : Accidently commited config.c
+#
+# BUILD : 1.7.2 (89)
+# BUGS :
+# NOTES : Accidently commited config.c
+#
+# BUILD : 1.7.2 (88)
+# BUGS : 13 and 14
+# NOTES : Hopefully fixed empty nickserv-accesslist entries and corrupt mysql code
+#
+# BUILD : 1.7.2 (87)
+# BUGS : 28
+# NOTES : Fixed bug with RDB and empty nickserv greet message.
+#
+# BUILD : 1.7.2 (86)
+# BUGS :
+# NOTES : Changed the allocation of buffer for normalizeBuffer yet again
+#
+# BUILD : 1.7.2 (85)
+# BUGS :
+# NOTES : Made normalizeBuffer string size equal to BUFSIZE (1024). Fixed function comments to be doxygen friendly :)
+#
+# BUILD : 1.7.2 (84)
+# BUGS :
+# NOTES : Updating Changes :)
+#
+# BUILD : 1.7.2 (83)
+# BUGS : 22
+# NOTES : Badwords now cannot be evaded by using control chars or color codes.
+#
+# BUILD : 1.7.2 (82)
+# BUGS : N/A
+# NOTES : Removed an old debug log
+#
+# BUILD : 1.7.2 (81)
+# BUGS : N/A
+# NOTES : Always set the correct module name when executing module functions
+#
+# BUILD : 1.7.2 (80)
+# BUGS : N/A
+# NOTES : Added Memos/ChannelInfo to the moduleAddData() system
+#
+# BUILD : 1.7.2 (79)
+# BUGS :
+# NOTES : Added check to anoperc to see if paths work, and fixed one grammar error
+#
+# BUILD : 1.7.2 (78)
+# BUGS : N/A
+# NOTES : Added the ability to add module data to the NickCore and the NickAlias structs
+#
+# BUILD : 1.7.2 (77)
+# BUGS : Compile errors on picky compilers
+# NOTES : fixed a compile error on picky compilers
+#
+# BUILD : 1.7.2 (76)
+# BUGS :
+# NOTES : Added memoserv function to check whether the last memo you sent to a nick has been read or not. new cmd: /MS CHECK
+# <nick> (I rule! :P)
+#
+# BUILD : 1.7.2 (75)
+# BUGS : N/A
+# NOTES : Been right through modules.c, every - yes EVERY function is now commented in a doxy-gen style mannor, detailing what it does, along with all the params and return codes - be affraid! - oh and jsut by-the-by when people are working on functions/new features/bug fixs in other parts of anope, we really should be adding these comments :)
+#
+#
+# BUILD : 1.7.2 (74)
+# BUGS : N/A
+# NOTES : Added moduleAddData() and moduleGetData() currently only added to the User struct as a test
+#
+#
+# BUILD : 1.7.2 (73)
+# BUGS :
+# NOTES : Removed delay timer from RSEND notifications.
+#
+# BUILD : 1.7.2 (72)
+# NOTES : New language index (temp fix)
+#
+# BUILD : 1.7.2 (71)
+# NOTES : Language file normalization. Make sure distclean is made.
+#
+# BUILD : 1.7.2 (70)
+# BUGS :
+# NOTES : Modified RSEND to send receipt memo as user instead of MemoServ
+#
+# BUILD : 1.7.2 (69)
+# BUGS :
+# NOTES : Added new MemoServ command RSEND to send a memo requesting a receipt memo once the recipient reads it.
+#
+# BUILD : 1.7.2 (68)
+# BUGS : 20
+# NOTES : Fixed ALIST bug when being invoked by systems admins
+#
+# BUILD : 1.7.2 (67)
+# BUGS : N/A
+# NOTES : Bumped Changes file verisons ready for new updates
+#
+# BUILD : 1.7.2 (66)
+# BUGS :
+# NOTES : Added /bin/anoperc anope console control script
+#
+# BUILD : 1.7.2 (64)
+# NOTES : Anope 1.7.2 Release
+#
+# BUILD : 1.7.1 (59)
+# BUGS : 10
+# NOTES : Fixed the second part of bug 10. The mydbgen script should
+# behave much better now.
+#
+# BUILD : 1.7.1 (58)
+# BUGS :
+# NOTES : anope_ns_req was being referenced should have been anope_ns_request (fixed)
+#
+# BUILD : 1.7.1 (57)
+# BUGS :
+# NOTES : Added SIGUSR2 to rehash configuration and save databases
+#
+# BUILD : 1.7.1 (56)
+# NOTES : Fourth time is a charm? Fixinf MySQL password saves.
+#
+# BUILD : 1.7.1 (55)
+# NOTES : One last try to fix the MySQL password saves... omg.
+#
+# BUILD : 1.7.1 (54)
+# NOTES : Added one more fix for MySQL nick password.
+#
+# BUILD : 1.7.1 (53)
+# BUGS : 10
+# NOTES : Fixed previous MySQL fix for saving nick passwords.
+#
+# BUILD : 1.7.1 (51)
+# NOTES : SVN Framework.
+#
+# BUILD : 1.7.1 (45)
+# NOTES : Anope 1.7.1 Release
+#
+# BUILD : 1.7.0 (42)
+# BUGS : 11
+# NOTES : Fixed quoted MD5 password for MySQL use (again...)
+#
+# BUILD : 1.7.0 (40)
+# BUGS : 11
+# NOTES : Fixed mysql query failure with md5 passwords
+#
+# BUILD : 1.7.0 (39)
+# BUGS : 10
+# NOTES : Fixed tables.sql detection on mydbgen script.
+#
+# BUILD : 1.7.0 (38)
+# BUGS : 008
+# NOTES : Fixed segfault due to coreless nicks in MySQL db on behalf of Keeper
+#
+# BUILD : 1.7.0 (37)
+# BUGS :
+# NOTES : Added NickRegDelay which prevents users from regging their nick if they are not connected for at least X seconds.
+#
+# BUILD : 1.7.0 (36)
+# BUGS :
+# NOTES : 1. Added "is a services root administrator" to /ns info. 2. Added option for SOs and above to hide their services
+# access status in /ns info.
+#
+# BUILD : 1.7.0 (35)
+# BUGS :
+# NOTES : Added -help arguement for command line parameter information
+#
+# BUILD : 1.7.0 (34)
+# BUGS : none
+# NOTES : Fixed indentation issue on memoserv.c
+#
+# BUILD : 1.7.0 (33)
+# BUGS :
+# NOTES : Small bugfix to allow ./services -version to be done without anope running
+#
+# BUILD : 1.7.0 (32)
+# BUGS :
+# NOTES : Added -version arguement to return anope version and build information
+#
+# BUILD : 1.7.0 (30)
+# BUGS : http://bugs.anope.org/show_bug.cgi?id=3
+# NOTES : Fixed moduleAddCommand for a non-existant service, now returns MOD_ERR_NOSERVICE, updated hs_moo to deal with it nicely
+#
+# BUILD : 1.7.0 (29)
+# BUGS : http://bugs.anope.org/show_bug.cgi?id=9
+# NOTES : Updated en_us.l file to show MAIL as a valid option on notify syntax response
+#
+# BUILD : 1.7.0 (28)
+# BUGS : http://bugs.anope.org/show_bug.cgi?id=7
+# NOTES : Dont display "Commands available to services admins only:" for /hs help, as there are no services admin only commands
+#
+#
+# BUILD : 1.7.0 (27)
+# BUGS : none
+# NOTES : Normalized language files and updated Changes.lang
+#
+# BUILD : 1.7.0 (26)
+# BUGS : none
+# NOTES : Testing svn access with a new am script.
+#
+# BUILD : 1.7.0 (25)
+# BUGS :
+# NOTES : Added memo2mail and /msg memoserv set notify MAIL/NOMAIL
+#
+# BUILD : 1.7.0 (23)
+# BUGS : none.
+# NOTES : Spelling error
+#
+# BUILD : 1.7.0 (20)
+# BUGS : none
+# NOTES : Fixed MySQL double encryption if using MD5.
+#
+# BUILD : 1.7.0 (19)
+# BUGS : none
+# NOTES : Refixed compile error if no RDB :(
+#
+# BUILD : 1.7.0 (18)
+# BUGS : none
+# NOTES : Fixed lack of BotServ. Fixed compile error if no RDB
+#
+# BUILD : 1.7.0 (17)
+# BUGS :
+# NOTES : Implemented MySQL Phase 2, see Changes and docs/MYSQL file for information.
+#
+# BUILD : 1.7.0 (15)
+# BUGS : N/A
+# NOTES : Added the ability for modules to add Commands and Messages outside of AnopeInit()
+#
+# BUILD : 1.7.0 (12)
+# BUGS : 5
+# NOTES : Fixed a bug with module callbacks, this is a tiny fix, but will need to be merged with the 1.6.x series, as it can cause a segfault if a module attempts to use recersive callbacks.
+#
+#
+# BUILD : 1.7.0 (11)
+# BUGS :
+# NOTES : Added channelname to entrymsgs
+#
+# BUILD : 1.7.0 (8)
+# BUGS : none.
+# NOTES : Made svn://zero.org/repos/anope/trunk the 1.7 development stream.
+#
+# BUILD : 1.6.0 (6)
+# BUGS : none
+# NOTES : Removed estra table definition from tables.sql. Minor fixes.
+#
+# BUILD : 1.6.0 (4)
+# BUGS : none
+# NOTES : File cleanup and new AnopeManager script (bin/am) to work
+# with Anope source control. Version schema change with no
+# impact on cpp directives.
+# EOF