diff options
author | rob rob@31f1291d-b8d6-0310-a050-a5561fc1590b <rob rob@31f1291d-b8d6-0310-a050-a5561fc1590b@5417fbe8-f217-4b02-8779-1006273d7864> | 2005-05-02 19:02:12 +0000 |
---|---|---|
committer | rob rob@31f1291d-b8d6-0310-a050-a5561fc1590b <rob rob@31f1291d-b8d6-0310-a050-a5561fc1590b@5417fbe8-f217-4b02-8779-1006273d7864> | 2005-05-02 19:02:12 +0000 |
commit | e0583918834a3f8683e430adf3923ea89d2a449a (patch) | |
tree | ff36ada734c3874d3be1a806e3a2b994386b54ed | |
parent | 49491770383e66f1b8074d8b0f80026e3086e9d8 (diff) |
BUILD : 1.7.8 (753) BUGS : N/a NOTES : Merged anope-dev with trunk
git-svn-id: svn://svn.anope.org/anope/trunk@753 31f1291d-b8d6-0310-a050-a5561fc1590b
git-svn-id: http://anope.svn.sourceforge.net/svnroot/anope/trunk@516 5417fbe8-f217-4b02-8779-1006273d7864
260 files changed, 37375 insertions, 21692 deletions
@@ -7,7 +7,6 @@ | | |_| IRC Services v1.7.9 - 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 @@ -16,8 +15,4 @@ 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. -Do not forget to read all the documents located in "docs/", -specially the README and INSTALL files. - -For all your Anope needs please visit our portal at -http://www.anope.org/ +For all your Anope needs please visit our portal at www.anope.org @@ -1,7 +1,20 @@ Anope Version S V N ------------------- Provided by Anope Dev. <dev@anope.org> - 2005 -04/16 I Changed subversion format from bdb to fsfs. [ #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] @@ -11,6 +24,21 @@ Provided by Anope Dev. <dev@anope.org> - 2005 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/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] @@ -66,6 +94,9 @@ Provided by Anope Dev. <dev@anope.org> - 2005 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] @@ -77,6 +108,10 @@ Provided by DrStein <drstein@anope.org> - 2005 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] @@ -91,6 +126,7 @@ Provided by Ricardo <ricardoltdb@gmail.com> - 2005 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] @@ -485,3 +521,4 @@ Provided by Anope Dev. <dev@anope.org> 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 index 97a27b05e..169664459 100644 --- a/Changes.conf +++ b/Changes.conf @@ -1,6 +1,103 @@ Anope Version S V N ------------------- ** 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 3 - "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. +# +#NSAutoOPDBName "os_info.db" ** MODIFIED CONFIGURATION DIRECTIVES ** @@ -25,6 +122,17 @@ Anope Version S V N #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 ** ########################################################################### @@ -40,7 +40,6 @@ Run_Configure () { WITH_BIN="" WITH_DATA="" WITH_ENC="" -WITH_IRCD="" WITH_RUN="" WITH_PERM="" WITH_MYSQL="" @@ -58,10 +57,6 @@ if [ "$ENCRYPTION" != "" ] ; then WITH_ENC=" --with-encryption" fi -if [ "$IRCTYPE_DEF" != "" ] ; then - WITH_IRCD=" --with-ircd=$IRCTYPE_DEF" -fi - if [ "$RUNGROUP" != "" ] ; then WITH_RUN=" --with-rungroup=$RUNGROUP" fi @@ -75,9 +70,9 @@ if [ "$MYSQL" != "yes" ] ; then fi -echo "./configure $WITH_BIN $WITH_DATA $WITH_ENC $WITH_IRCD $WITH_RUN $WITH_PERM $WITH_MYSQL" +echo "./configure $WITH_BIN $WITH_DATA $WITH_ENC $WITH_RUN $WITH_PERM $WITH_MYSQL" -./configure $WITH_BIN $WITH_DATA $WITH_ENC $WITH_IRCD $WITH_RUN $WITH_PERM $WITH_MYSQL +./configure $WITH_BIN $WITH_DATA $WITH_ENC $WITH_RUN $WITH_PERM $WITH_MYSQL } ECHO2SUF='' @@ -281,104 +276,6 @@ echo "" #### -ok=0 -echo "Select the closest to the type of server on your IRC network:" -echo " 1) DreamForge 4.6.7 [dated IRCd, upgrade to a current one]" -echo " 2) Bahamut 1.4.27 [or later]" -echo " 3) UnrealIRCd 3.1.1 [or later (not 3.2)]" -echo " 4) UltimateIRCd 2.8.2 [or later]" -echo " 5) UltimateIRCd 3.0.0 [alpha26 or later]" -echo " 6) Hybrid IRCd 7.0 [experimental]" -echo " 7) ViagraIRCd 1.3.x [or later]" -echo " 8) PTlink 6.15.0 [experimental]" -echo " 9) RageIRCd 2.0.0 [beta-6 or later]" -echo " 10) Unreal 3.2 [Unreal 3.2 beta19 or later]" -echo " 11) Solid IRCD 3.4.x [Solid IRCD 3.4.6 or later]" -echo " 12) Plexus 2.0 [or later]" -echo " 13) Ratbox 2.0.6 [or later]" -echo " 14) ShadowIRCD 4.0x [beta 7 or later]" - -while [ $ok -eq 0 ] ; do - echo2 "[$IRCTYPE] " - if read INPUT ; then : ; else echo "" ; exit 1 ; fi - if [ ! "$INPUT" ] ; then - INPUT=$IRCTYPE - fi - case $INPUT in - no\ default) - echo "You must specify your IRC server type in order for Services to function" - echo "correctly." - ;; - 1) - IRCTYPE_DEF="IRC_DREAMFORGE" - ok=1; - ;; - 2) - IRCTYPE_DEF="IRC_BAHAMUT" - ok=1; - ;; - 3) - IRCTYPE_DEF="IRC_UNREAL31" - ok=1; - ;; - 4) - IRCTYPE_DEF="IRC_ULTIMATE2" - ok=1; - ;; - 5) - IRCTYPE_DEF="IRC_ULTIMATE3" - ok=1; - ;; - 6) - IRCTYPE_DEF="IRC_HYBRID" - ok=1; - ;; - 7) - IRCTYPE_DEF="IRC_VIAGRA" - ok=1; - ;; - 8) - IRCTYPE_DEF="IRC_PTLINK" - ok=1; - ;; - 9) - IRCTYPE_DEF="IRC_RAGE2" - ok=1; - ;; - - 10) - IRCTYPE_DEF="IRC_UNREAL32" - ok=1; - ;; - - 11) - IRCTYPE_DEF="IRC_SOLID" - ok=1; - ;; - 12) - IRCTYPE_DEF="IRC_PLEXUS" - ok=1; - ;; - 13) - IRCTYPE_DEF="IRC_RATBOX" - ok=1; - ;; - 14) - IRCTYPE_DEF="IRC_SHADOWIRCD" - ok=1; - ;; - - - *) - echo "Please enter a valid option number." - ;; - esac -done -IRCTYPE=$INPUT -echo "" - -#### - if [ "$ENCRYPTION" = "ENCRYPT_MD5" ] ; then DEF=yes else diff --git a/Makefile.in b/Makefile.in index 4b611beb6..19f743896 100644 --- a/Makefile.in +++ b/Makefile.in @@ -21,9 +21,9 @@ RUNGROUP=@RUNGROUP@ IRCDFILE=@IRCDFILE@ SHARED=@SHARED@ -all: language headers build tools modules -strict: language headers strict_build tools strict_modules -profile: language headers profile_build tools profile_modules +all: language headers build core protocols tools modules +strict: language headers strict_build core protocols tools strict_modules +profile: language headers profile_build core protocols tools profile_modules MAKEARGS = 'CFLAGS=${CFLAGS}' 'CC=${CC}' 'ANOPELIBS=${ANOPELIBS}' \ 'LDFLAGS=${LDFLAGS}' 'BINDEST=${BINDEST}' 'INSTALL=${INSTALL}' \ @@ -60,6 +60,13 @@ clean_modules: distclean_modules: (cd src ; ${MAKE} ${MAKEARGS} distclean_modules ) +protocols: build + @echo "*** Building protocol support"; + (cd src/protocol ; ./configure ; ${MAKE} ${MAKEARGS} all; ) + +core: build + @echo "*** Building Core modules"; + (cd src/ ; ${MAKE} ${MAKEARGS} core; ) tools: build (cd src/tools ; ${MAKE} ${MAKEARGS} all; ) diff --git a/Makefile.win32 b/Makefile.win32 index c39d56d38..5b31fff05 100644 --- a/Makefile.win32 +++ b/Makefile.win32 @@ -13,7 +13,7 @@ include Makefile.inc.win32 ########################################################################### -all: src languages tools modules install +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 .. @@ -25,22 +25,31 @@ install: 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\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 insalled successfully! - -@echo See docs/INSTALL for details on how to configure Anope for use. + -@echo See docs\INSTALL for details on how to configure Anope for use. -@echo --- clean: - cd lang && $(MAKE) spotless && cd .. cd src && $(MAKE) spotless && cd .. - cd src\modules && $(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 .. + cd lang && $(MAKE) spotless && cd .. -@erase *.exe version.h *.obj 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 *~ anope.exe version.sh.exe *.obj anopesmtp.exe mypasql: @@ -48,84 +57,6 @@ mypasql: distclean: spotless -dist: - $(MAKE) clean -#Compile dreamforge - echo Compiling Dreamforge build - $(MAKE) IRCTYPE=/DIRC_DREAMFORGE CAPAB_C=dreamforge.c CAPAB_O=dreamforge.obj - -@copy src\$(PROGRAM) services-dreamforge.exe - $(MAKE) clean -#Compile bahamut - echo Compiling Bahamut build - $(MAKE) IRCTYPE=/DIRC_BAHAMUT CAPAB_C=bahamut.c CAPAB_O=bahamut.obj - -@copy src\$(PROGRAM) services-bahamut.exe - $(MAKE) clean -#Compile unreal - echo Compiling UnrealIRCd3.1 build - $(MAKE) IRCTYPE=/DIRC_UNREAL31 CAPAB_C=unreal31.c CAPAB_O=unreal31.obj - -@copy src\$(PROGRAM) services-unreal31.exe - $(MAKE) clean -#Compile ultimate2 - echo Compiling UltimateIRCd2 build - $(MAKE) IRCTYPE=/DIRC_ULTIMATE2 CAPAB_C=ultimate2.c CAPAB_O=ultimate2.obj - -@copy src\$(PROGRAM) services-ultimate2.exe - $(MAKE) clean -#Compile ultimate3 - echo Compiling UltimateIRCd 3.x build - $(MAKE) IRCTYPE=/DIRC_ULTIMATE3 CAPAB_C=ultimate3.c CAPAB_O=ultimate3.obj - -@copy src\$(PROGRAM) services-ultimate3.exe - $(MAKE) clean -#Compile hybrid - echo Compiling Hybrid build - $(MAKE) IRCTYPE=/DIRC_HYBRID CAPAB_C=hybrid.c CAPAB_O=hybrid.obj - -@copy src\$(PROGRAM) services-hybrid.exe - $(MAKE) clean -#Compile viagra - echo Compiling ViagraIRCd build - $(MAKE) IRCTYPE=/DIRC_VIAGRA CAPAB_C=viagra.c CAPAB_O=viagra.obj - -@copy src\$(PROGRAM) services-viagra.exe - $(MAKE) clean -#Compile ptlink - echo Compiling PTLink IRCd build - $(MAKE) IRCTYPE=/DIRC_PTLINK CAPAB_C=ptlink.c CAPAB_O=ptlink.obj - -@copy src\$(PROGRAM) services-ptlink.exe - $(MAKE) clean -#Compile rage2 - echo Compiling Rage2 IRCd build - $(MAKE) IRCTYPE=/DIRC_RAGE2 CAPAB_C=rageircd.c CAPAB_O=rageircd.obj - -@copy src\$(PROGRAM) services-rage2.exe - $(MAKE) clean -#Compile UnrealIRCD3.2 - echo Compiling UnrealIRCD3.2 IRCd build - $(MAKE) IRCTYPE=/DIRC_UNREAL32 CAPAB_C=unreal32.c CAPAB_O=unreal32.obj - -@copy src\$(PROGRAM) services-unreal32.exe - $(MAKE) clean -#Compile SolidIRCD - echo Compiling SolidIRCD IRCd build - $(MAKE) IRCTYPE=/DIRC_SOLID CAPAB_C=solidircd.c CAPAB_O=solidircd.obj - -@copy src\$(PROGRAM) services-solid.exe - $(MAKE) clean -#Compile PlexusIRCD - echo Compiling Plexus IRCd build - $(MAKE) IRCTYPE=/DIRC_PLEXUS CAPAB_C=plexus.c CAPAB_O=plexus.obj - -@copy src\$(PROGRAM) services-plexus.exe - $(MAKE) clean -#Compile Ratbox - echo Compiling Ratbox IRCd build - $(MAKE) IRCTYPE=/DIRC_RATBOX CAPAB_C=ratbox.c CAPAB_O=ratbox.obj - -@copy src\$(PROGRAM) services-ratbox.exe -#Compile ShadowIRCD - echo Compiling Shadow IRCd build - $(MAKE) IRCTYPE=/DIRC_SHADOWIRCD CAPAB_C=shadowircd.c CAPAB_O=shadwoircd.obj - -@copy src\$(PROGRAM) services-shadowircd.exe - -#Compile mypasql - $(MYPASQL_BUILD) - -#Cleanup - $(MAKE) spotless - - ########################################################################### @@ -135,6 +66,12 @@ languages: FRC 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 ..\.. diff --git a/data/example.conf b/data/example.conf index 69d82370a..9f62f906f 100644 --- a/data/example.conf +++ b/data/example.conf @@ -66,6 +66,84 @@ ########################################################################### # +# 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" +# DreamForge 4.6.7 - "dreamforge" +# Hybrid IRCd 7.0 [experimental] - "hybrid" +# InspIRCd 1.0 Beta 3 - "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" + + +########################################################################### +# +# 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 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" +########################################################################### +# # Remote server configuration # ########################################################################### @@ -1242,6 +1320,13 @@ SessionAutoKillExpiry 30m # 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 @@ -1426,7 +1511,46 @@ AddAkiller # 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" + +########################################################################### +# +# 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 + +# 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. # -#ModuleDelayedAutoload "ircd_catserv" +#OSInfoDBName "os_info.db" #EOF diff --git a/docs/EVENTS b/docs/EVENTS index 8b5185a9b..7d2fb34e7 100644 --- a/docs/EVENTS +++ b/docs/EVENTS @@ -78,7 +78,7 @@ Anope Internal Events A) All functions most be formatted as: - int functioname(char *message); + 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 @@ -112,9 +112,13 @@ Anope Internal Events 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(char *source) + int my_save(int argc, char **argv) { - if (!stricmp(source, EVENT_START)) { + 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"); @@ -137,158 +141,207 @@ Anope Internal Events 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_BOT_ASSIGN A BotServ bot has been assigned to a channel. - The argument contains the name of the channel has been assigned to. + 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_CHANGE The properties of a BotServ bot have been changed. - The argument contains the nickname of the bot involved. + av[0] The nickname of the bot involved. EVENT_BOT_CREATE A new BotServ bot has been created, and is ready to use. - The argument contains the nickname of the newly created bot. + 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. - The argument contains the nickname of the bot being deleted. + 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 with 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. - The argument contains the channel name the bot is on. + av[0] The channel name the bot has just joined. + av[1] The nickname of the bot that has joined the channel. 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. - The argument contains the channel name the bot is on. + 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. - The argument is the name of the channel that has been dropped. + 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. - The argument is the name of the channel being deleted. + av[0] The name of the channel that has been expired. EVENT_CHAN_FORBIDDEN A channel has been forbidden (ChanServ FORBID). - The argument is the name of the channel that has been forbidden. + av[0] The name of the channel that has been forbidden. EVENT_CHAN_REGISTERED A new channel has been registered. - The argument is the name of the channel that has been registered. + av[0] The name of the channel that has been registered. EVENT_CHAN_SUSPENDED A channel has been suspended (ChanServ SUSPEND). - The argument is the name of the channel that has been suspended. + 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. - The argument contains the new nickname of the user. + av[0] The new nickname of the user. EVENT_CONNECT This event is emitted when the connection to our uplink hub is being made. - The argument is either 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. + 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. - The argument is either EVENT_START or EVENT_STOP, to indicate if it's - being emitted before or after the expiry routines have been 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. - The argument is either EVENT_START or EVENT_STOP, to indicate if it's - emitted before or after the saving routines. + 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. - The event will send EVENT_START when the backup commences, and - EVENT_STOP when it finishes. + 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. - The argument contains the new level of DefCon being invoked. + av[0] The new level of DefCon being invoked. EVENT_GROUP A user has grouped it's nickname to another user group. - The argument contains the nickname of the user that joined the 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. - The argument contains the nickname of the newly introduced user. + 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! - The argument contains the nickname of the user that has just been - dropped. + 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! - The argument contains the nickname of the user that has just expired. + av[0] The nickname of the user that has just expired. EVENT_NICK_FORBIDDEN A user's nick has just been forbidden. - The argument contains the nickname that 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. - The argument contains the nickname of the user that just identified. + av[0] The nickname of the user that just identified. 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. - The argument contains the nickname of the newly registered user. + av[0] The nickname of the newly registered user. - EVENT_NICK_SUSPEND + EVENT_NICK_SUSPENDED A user's nick has just been suspended. - The argument contains the nickname that 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. + + 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. - The argument is always EVENT_START. + av[0] Always EVENT_START. EVENT_SERVER_CONNECT A new server has just connected to the network. - The argument contains the name of the new server. + 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. - The argument is the name of the server that is being removed. + 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. - The argument is either 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. + 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. - The argument contains the quit message that will be sent with the SQUIT - for this shutdown. + 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 even is + 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. - The argument is the name of the channel involved. + 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. - The argument contains the nickname of the user leaving the network. + av[0] The nickname of the user leaving the network. @@ -95,6 +95,8 @@ List of Questions 34) How to auto voice all those whom join my #channel? +35) How can i enable the OperServ RAW command? + List of answers --------------- @@ -396,3 +398,21 @@ List of answers /cs set #channel secure off /cs set #channel xop off /cs levels #channel set AUTOVOICE -1 + +35) 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. diff --git a/docs/WIN32.txt b/docs/WIN32.txt index 3d09bef97..fd06141c8 100644 --- a/docs/WIN32.txt +++ b/docs/WIN32.txt @@ -39,47 +39,21 @@ Anope for Windows 2) Unpack the Anope tarball with your favorite uncompression program (winzip or winrar). - 3) Open Makefile.inc.win32 in the main directory with a text editor - (notepad or notepad clones). - - A) Change the line "IRCD=" to match the ircd that you want to build, - and place that number after the =. So if you want to build for - Unreal 3.2 (#10), you would change the line to read "IRCD=10". - - B) If you are building for MySQL change USE_MYSQL to equal 1 (i.e. - USE_MYSQL=1). On the next two lines you must enter the path to the - MySQL installation. MYSQL_INC, and MYSQL_LIB. You can define the - path one of two ways, either with \ or /. If you use \ you must - add a secondary \; so c:\mysql would be c:\\mysql. - - C) Do you want to use the MD5 message-digest algorithm to encrypt - passwords? Selecting "yes" protects your passwords from being - stolen if someone gains access to the Services databases, but - makes it impossible to recover forgotten passwords. There is no - way to reverse this operation, so make sure you really want to - enable it. Change DB_ENCRYPTION to be equal to 1 to enable it. - - D) If you are using Visual Studio 6, this next line can be very - important. If you are getting an error during compile about - "unresolved external symbol __ftol2", remove the # in front of - VC6=/QIfist and attempt to compile again. - - E) If you get an error about "Cannot find wsock32.lib" or - "Cannot find msvcrt.lib" when compiling, you need to define the - libpath, in the LIBPATH directive. You can define the path in one - of two ways: either with \ or /. If you use \ you must add a - secondary \; so c:\sdk\lib would be c:\\sdk\\lib. Be sure to - remove the # in front of LFLAGS. - - F) Most import is to set the DATDEST to be the folder name where the - database will be stored. This does not need to be the full path, - just the folder under the main executable in which data will - exist. In our example we will use "data" + 3) Bring up the Visual C++ toolkit command prompt; This will launch a + dos command prompt like windows, which will set the environment + properties need to make Anope. Change directories to where you unpacked + the source code in step 2. + + 4) You now need to configure Anope to your requirements. At the prompt type: + + cscript /nologo install.vbs + + 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 can manually specify a path. Please refer to + your compilers documentation if you need to specify a manual path. - 4) You are now ready to compile. bring up the Visual C++ toolkit command - prompt; This will launch a dos command prompt like windows, which will - set the environment properties need to make Anope. Change directories - to where you unpacked the source code in step 2. At the prompt type: + 5) You are now ready to compile. At the prompt type: nmake -f Makefile.win32 @@ -88,7 +62,7 @@ Anope for Windows adjust the Makefile.inc.win32 to help resolve the issue. If those changes in Makefile.inc.win32 didn't help, file a bug report. - 5) Anope will install the files where the belong. The only thing you need + 6) Anope will install the files where the belong. The only thing you need to do is rename "data/example.conf" to be "services.conf". You have now completed the building phase of Anope for Windows. You can @@ -97,17 +71,23 @@ Anope for Windows 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 + configuration with a text editor before proceeding with running Anope itself. Open services.conf, and read through it carefully and adjust the settings - you think you need to adjust. Pay special attention to this settings: + you think you need to adjust. Pay special attention to these settings: - A) RemoteServer: This is the address to your ircd, along with the port + 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. - B) ServicesRoot: Remove the # and change the names to your nick so you + 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 @@ -123,31 +103,34 @@ Anope for Windows 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. + will need to modify the Makefile.inc.win32 file, in the src\modules folder. - A) If you get an error about "Cannot find wsock32.lib" or - "Cannot find msvcrt.lib" when compiling, you need to define the - libpath, in the LIBPATH directive. You can define the path in one - of two ways: either with \ or /. If you use \ you must add a - secondary \; so c:\sdk\lib would be c:\\sdk\\lib. Be sure to - remove the # in front of LFLAGS. - - B) Add modules; find the line stating "SRCS=" and add the name of the + 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 - C) 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: + 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: - D) Copy the *.dll files that get created to the "data/modules/runtime" - folder. + 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) Credits - Anope is base on Epona and IRCServices. See README for more credits and + 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: @@ -155,3 +138,8 @@ Anope for Windows * Dominick Meglio <codemastr@unrealircd.com> * Trystan Scott Lee <trystan@nomadirc.net> * Chris Hogben <heinz@anope.org> + + Anope's Windows Installer was made using: + + * Inno Setup 5 <http://www.jrsoftware.org> + diff --git a/include/bahamut.h b/include/bahamut.h deleted file mode 100644 index 2d386e73d..000000000 --- a/include/bahamut.h +++ /dev/null @@ -1,65 +0,0 @@ -/* Bahamut functions - * - * (C) 2003-2005 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. - * - * - */ - -/*************************************************************************/ - -#ifdef IRC_BAHAMUT - - -#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 - -#endif - diff --git a/include/commands.h b/include/commands.h index ec08a44a9..5fe00fc65 100644 --- a/include/commands.h +++ b/include/commands.h @@ -30,5 +30,4 @@ 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); -extern char *mod_current_module_name; /*************************************************************************/ diff --git a/include/dreamforge.h b/include/dreamforge.h deleted file mode 100644 index f5ee12b00..000000000 --- a/include/dreamforge.h +++ /dev/null @@ -1,44 +0,0 @@ -/* DreamForge IRCD functions - * - * (C) 2003-2005 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. - * - * - */ - -#ifdef IRC_DREAMFORGE - -#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 - -#endif - diff --git a/include/encrypt.h b/include/encrypt.h index e786fd1de..462e1b373 100644 --- a/include/encrypt.h +++ b/include/encrypt.h @@ -12,5 +12,5 @@ * */ -extern int encrypt(const char *src, int len, char *dest, int size); -extern int check_password(const char *plaintext, const char *password); +E int encrypt(const char *src, int len, char *dest, int size); +E int check_password(const char *plaintext, const char *password); diff --git a/include/events.h b/include/events.h index 6fa858810..4065e1a2a 100644 --- a/include/events.h +++ b/include/events.h @@ -8,7 +8,7 @@ * Based on the original code of Epona by Lara. * Based on the original code of Services by Andy Church. * - * $Id:$ + * $Id$ * */ @@ -22,6 +22,7 @@ #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_DEL "bot_del" #define EVENT_BOT_ASSIGN "bot_assign" #define EVENT_TOPIC_UPDATED "chan_topic_updated" @@ -34,6 +35,7 @@ #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" @@ -49,4 +51,5 @@ #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" diff --git a/include/extern.h b/include/extern.h index fdfd09d4b..1c951d801 100644 --- a/include/extern.h +++ b/include/extern.h @@ -15,32 +15,37 @@ #ifndef EXTERN_H #define EXTERN_H -#include "slist.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 +#include "slist.h" + E char *uplink; /* IRC Variables */ -E IRCDVar ircd[]; -E IRCDCAPAB ircdcap[]; -E const char flood_mode_char_set[]; -E const char flood_mode_char_remove[]; +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 */ -E unsigned long umodes[128]; +I unsigned long umodes[128]; E char csmodes[128]; E CMMode cmmodes[128]; E CBMode cbmodes[128]; -E CBModeInfo cbmodeinfos[]; +E CBModeInfo *cbmodeinfos; E CUMode cumodes[128]; +E char *IRCDModule; +E IRCDProto ircdproto; /**** actions.c ****/ @@ -53,6 +58,7 @@ 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); @@ -66,15 +72,19 @@ 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 CBMode cbmodes[128]; -E CBModeInfo cbmodeinfos[]; E CUMode cumodes[128]; E CMMode cmmodes[128]; -E unsigned long umodes[128]; E char csmodes[128]; E void add_ban(Channel * chan, char *mask); @@ -129,7 +139,7 @@ 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_unsycned_topics(void); +E void restore_unsynced_topics(void); #define whosends(ci) ((!(ci) || !((ci)->botflags & BS_SYMBIOSIS) || !(ci)->bi || !(ci)->c || (ci)->c->usercount < BSMinUsers) ? s_ChanServ : (ci)->bi->nick) @@ -188,6 +198,11 @@ 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 @@ -430,11 +445,35 @@ E int CloneWarningDelay; E int KillClones; E int AddAkiller; +/** + * 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 KillClonesAkillExpire; @@ -518,6 +557,9 @@ E long unsigned int UserKey3; E int convert_ircservices_44(void); +/**** encrypt.c ****/ +E int check_password(const char *plaintext, const char *password); + /**** helpserv.c ****/ E void helpserv(User * u, char *buf); E void helpserv_init(void); @@ -527,6 +569,11 @@ 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 void set_lastmask(User * u); /**** init.c ****/ @@ -534,6 +581,103 @@ E void introduce_user(const char *user); E int init(int ac, char **av); E int servernum; +/**** ircd.c ****/ +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_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_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_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]; @@ -580,7 +724,7 @@ E int MailValidate(const char *email); E const char version_number[]; E const char version_number_dotted[]; E const char version_build[]; -E const char version_protocol[]; +E char *version_protocol; E const char version_flags[]; E char *services_dir; @@ -611,6 +755,7 @@ 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 ****/ @@ -625,6 +770,8 @@ E char *sstrdup(const char *s); 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 int delmemo(MemoInfo * mi, int num); /**** messages.c ****/ @@ -704,6 +851,8 @@ E int do_randomnews(User * u); 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); @@ -711,6 +860,11 @@ 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 void ns_init(void); E void nickserv(User * u, char *buf); @@ -726,7 +880,7 @@ E int nick_identified(User * u); E int nick_recognized(User * u); E void expire_nicks(void); E void expire_requests(void); -E int ns_do_register(User * u); +I int ns_do_register(User * u); E int delnick(NickAlias * na); E NickAlias *findnick(const char *nick); E NickCore *findcore(const char *nick); @@ -778,10 +932,16 @@ E void expire_szlines(void); E int check_szline(char *nick, char *ip); E void check_clones(User * user); -E void delete_ignore(const char *nick); E Server *server_global(Server * s, char *msg); +E int OSOpersOnly; +E time_t DefContimer; +E void runDefCon(void); + +E struct clone clonelist[CLONE_DETECT_SIZE]; +E struct clone warnings[CLONE_DETECT_SIZE]; + /**** process.c ****/ E int allow_ignore; @@ -863,6 +1023,19 @@ 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; @@ -1051,74 +1224,74 @@ 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 */ -E int anope_event_482(char *source, int ac, char **av); -E int anope_event_436(char *source, int ac, char **av); -E int anope_event_away(char *source, int ac, char **av); -E int anope_event_ping(char *source, int ac, char **av); -E int anope_event_motd(char *source, int ac, char **av); -E int anope_event_join(char *source, int ac, char **av); -E int anope_event_kick(char *source, int ac, char **av); -E int anope_event_kill(char *source, int ac, char **av); -E int anope_event_mode(char *source, int ac, char **av); -E int anope_event_tmode(char *source, int ac, char **av); -E int anope_event_quit(char *source, int ac, char **av); -E int anope_event_squit(char *source, int ac, char **av); -E int anope_event_topic(char *source, int ac, char **av); -E int anope_event_whois(char *source, int ac, char **av); -E int anope_event_part(char *source, int ac, char **av); -E int anope_event_server(char *source, int ac, char **av); -E int anope_event_sid(char *source, int ac, char **av); -E int anope_event_nick(char *source, int ac, char **av); -E int anope_event_bmask(char *source, int ac, char **av); -E int anope_event_gnotice(char *source, int ac, char **av); -E int anope_event_privmsg(char *source, int ac, char **av); -E int anope_event_capab(char *source, int ac, char **av); -E int anope_event_sjoin(char *source, int ac, char **av); -E int anope_event_cs(char *source, int ac, char **av); -E int anope_event_hs(char *source, int ac, char **av); -E int anope_event_ms(char *source, int ac, char **av); -E int anope_event_ns(char *source, int ac, char **av); -E int anope_event_os(char *source, int ac, char **av); -E int anope_event_vs(char *source, int ac, char **av); -E int anope_event_svinfo(char *source, int ac, char **av); -E int anope_event_chghost(char *source, int ac, char **av); -E int anope_event_sethost(char *source, int ac, char **av); -E int anope_event_chgident(char *source, int ac, char **av); -E int anope_event_setident(char *source, int ac, char **av); -E int anope_event_chgname(char *source, int ac, char **av); -E int anope_event_setname(char *source, int ac, char **av); -E int anope_event_svsinfo(char *source, int ac, char **av); -E int anope_event_snick(char *source, int ac, char **av); -E int anope_event_vhost(char *source, int ac, char **av); -E int anope_event_tkl(char *source, int ac, char **av); -E int anope_event_eos(char *source, int ac, char **av); -E int anope_event_eob(char *source, int ac, char **av); -E int anope_event_pass(char *source, int ac, char **av); -E int anope_event_netinfo(char *source, int ac, char **av); -E int anope_event_error(char *source, int ac, char **av); -E int anope_event_eb(char *source, int ac, char **av); -E int anope_event_netctrl(char *source, int ac, char **av); -E int anope_event_notice(char *source, int ac, char **av); -E int anope_event_snotice(char *source, int ac, char **av); -E int anope_event_sqline(char *source, int ac, char **av); -E int anope_event_error(char *source, int ac, char **av); -E int anope_event_smo(char *source, int ac, char **av); -E int anope_event_myid(char *source, int ac, char **av); -E int anope_event_vctrl(char *source, int ac, char **av); -E int anope_event_tctrl(char *source, int ac, char **av); -E int anope_event_netinfo(char *source, int ac, char **av); -E int anope_event_snetinfo(char *source, int ac, char **av); -E int anope_event_umode2(char *source, int ac, char **av); -E int anope_event_globops(char *source, int ac, char **av); -E int anope_event_swhois(char *source, int ac, char **av); -E int anope_event_burst(char *source, int ac, char **av); -E int anope_event_luserslock(char *source, int ac, char **av); -E int anope_event_admin(char *source, int ac, char **av); -E int anope_event_credits(char *source, int ac, char **av); -E int anope_event_rehash(char *source, int ac, char **av); -E int anope_event_sdesc(char *source, int ac, char **av); -E int anope_event_netglobal(char *source, int ac, char **av); -E int anope_event_invite(char *source, int ac, char **av); +I int anope_event_482(char *source, int ac, char **av); +I int anope_event_436(char *source, int ac, char **av); +I int anope_event_away(char *source, int ac, char **av); +I int anope_event_ping(char *source, int ac, char **av); +I int anope_event_motd(char *source, int ac, char **av); +I int anope_event_join(char *source, int ac, char **av); +I int anope_event_kick(char *source, int ac, char **av); +I int anope_event_kill(char *source, int ac, char **av); +I int anope_event_mode(char *source, int ac, char **av); +I int anope_event_tmode(char *source, int ac, char **av); +I int anope_event_quit(char *source, int ac, char **av); +I int anope_event_squit(char *source, int ac, char **av); +I int anope_event_topic(char *source, int ac, char **av); +I int anope_event_whois(char *source, int ac, char **av); +I int anope_event_part(char *source, int ac, char **av); +I int anope_event_server(char *source, int ac, char **av); +I int anope_event_sid(char *source, int ac, char **av); +I int anope_event_nick(char *source, int ac, char **av); +I int anope_event_bmask(char *source, int ac, char **av); +I int anope_event_gnotice(char *source, int ac, char **av); +I int anope_event_privmsg(char *source, int ac, char **av); +I int anope_event_capab(char *source, int ac, char **av); +I int anope_event_sjoin(char *source, int ac, char **av); +I int anope_event_cs(char *source, int ac, char **av); +I int anope_event_hs(char *source, int ac, char **av); +I int anope_event_ms(char *source, int ac, char **av); +I int anope_event_ns(char *source, int ac, char **av); +I int anope_event_os(char *source, int ac, char **av); +I int anope_event_vs(char *source, int ac, char **av); +I int anope_event_svinfo(char *source, int ac, char **av); +I int anope_event_chghost(char *source, int ac, char **av); +I int anope_event_sethost(char *source, int ac, char **av); +I int anope_event_chgident(char *source, int ac, char **av); +I int anope_event_setident(char *source, int ac, char **av); +I int anope_event_chgname(char *source, int ac, char **av); +I int anope_event_setname(char *source, int ac, char **av); +I int anope_event_svsinfo(char *source, int ac, char **av); +I int anope_event_snick(char *source, int ac, char **av); +I int anope_event_vhost(char *source, int ac, char **av); +I int anope_event_tkl(char *source, int ac, char **av); +I int anope_event_eos(char *source, int ac, char **av); +I int anope_event_eob(char *source, int ac, char **av); +I int anope_event_pass(char *source, int ac, char **av); +I int anope_event_netinfo(char *source, int ac, char **av); +I int anope_event_error(char *source, int ac, char **av); +I int anope_event_eb(char *source, int ac, char **av); +I int anope_event_netctrl(char *source, int ac, char **av); +I int anope_event_notice(char *source, int ac, char **av); +I int anope_event_snotice(char *source, int ac, char **av); +I int anope_event_sqline(char *source, int ac, char **av); +I int anope_event_error(char *source, int ac, char **av); +I int anope_event_smo(char *source, int ac, char **av); +I int anope_event_myid(char *source, int ac, char **av); +I int anope_event_vctrl(char *source, int ac, char **av); +I int anope_event_tctrl(char *source, int ac, char **av); +I int anope_event_netinfo(char *source, int ac, char **av); +I int anope_event_snetinfo(char *source, int ac, char **av); +I int anope_event_umode2(char *source, int ac, char **av); +I int anope_event_globops(char *source, int ac, char **av); +I int anope_event_swhois(char *source, int ac, char **av); +I int anope_event_burst(char *source, int ac, char **av); +I int anope_event_luserslock(char *source, int ac, char **av); +I int anope_event_admin(char *source, int ac, char **av); +I int anope_event_credits(char *source, int ac, char **av); +I int anope_event_rehash(char *source, int ac, char **av); +I int anope_event_sdesc(char *source, int ac, char **av); +I int anope_event_netglobal(char *source, int ac, char **av); +I 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); @@ -1150,9 +1323,9 @@ E int decode_ip(char *buf); E char *host_resolve(char *host); -extern void event_message_process(char *eventbuf); -extern void eventprintf(char *fmt, ...); -extern void event_process_hook(char *name, char *eventbuf); -extern void send_event(char *name, const char *fmt, ...); +E void event_message_process(char *eventbuf); +E void eventprintf(char *fmt, ...); +E void event_process_hook(char *name, int argc, char **argv); +E void send_event(char *name, int argc, ...); #endif /* EXTERN_H */ diff --git a/include/hybrid.h b/include/hybrid.h deleted file mode 100644 index 05dfbe4ca..000000000 --- a/include/hybrid.h +++ /dev/null @@ -1,51 +0,0 @@ -/* Hybrid IRCD functions - * - * (C) 2003-2005 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. - * - * - */ - -#ifdef IRC_HYBRID - - -#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 - -#endif - - diff --git a/src/modules/module.h b/include/module.h index 3f341c0aa..fa09f545c 100644 --- a/src/modules/module.h +++ b/include/module.h @@ -7,4 +7,3 @@ #define MOD_UNIQUE 0 #define MOD_HEAD 1 #define MOD_TAIL 2 - diff --git a/include/modules.h b/include/modules.h index 0a00b4e2f..c2abd3279 100644 --- a/include/modules.h +++ b/include/modules.h @@ -96,11 +96,15 @@ typedef void * ano_module_t; #endif /*************************************************************************/ +typedef enum { CORE,PROTOCOL,THIRD,SUPPORTED,QATESTED } MODType; + +/*************************************************************************/ /* 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 Message_ Message; typedef struct MessageHash_ MessageHash; @@ -118,8 +122,14 @@ 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 EvtMessageHash *EVENT[MAX_CMD_HASH]; -extern EvtHookHash *EVENTHOOKS[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; @@ -129,6 +139,8 @@ struct Module_ { char *version; char *author; + MODType type; + void (*nickHelp)(User *u); /* service 1 */ void (*chanHelp)(User *u); /* 2 */ void (*memoHelp)(User *u); /* 3 */ @@ -139,6 +151,7 @@ struct Module_ { /* CommandHash *cmdList[MAX_CMD_HASH]; */ MessageHash *msgList[MAX_CMD_HASH]; + ModuleLang lang[NUM_LANGS]; }; struct ModuleHash_ { @@ -225,7 +238,7 @@ struct EvtMessageHash_ { struct EvtHook_ { - int (*func)(char *source); + int (*func)(int argc, char **argv); int core; char *name; char *mod_name; @@ -241,12 +254,13 @@ struct EvtHookHash_ { /*************************************************************************/ /* Module Managment Functions */ -Module *createModule(char *filename); /* Create a new module, using the given name */ +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 */ -Module *findModule(char *name); /* Find a module */ +MDE Module *findModule(char *name); /* Find a module */ int loadModule(Module *m,User *u); /* Load the given module into the program */ +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(char *version); @@ -269,6 +283,14 @@ 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); +MDE Module *mod_current_module; +MDE char *mod_current_module_name; +MDE char *mod_current_buffer; +MDE int mod_current_op; +MDE User *mod_current_user; + +MDE int moduleGetConfigDirective(Directive *h); /*************************************************************************/ /*************************************************************************/ /* Command Managment Functions */ @@ -287,7 +309,7 @@ Command *findCommand(CommandHash *cmdTable[], const char *name); /* Find a comma MDE Message *createMessage(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 */ -int addCoreMessage(MessageHash *msgTable[], Message *m); /* 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); @@ -305,7 +327,7 @@ int delEventHandler(EvtMessageHash * msgEvtTable[], EvtMessage * evm, char *mod_ int destroyEventHandler(EvtMessage * evm); int addEventHandler(EvtMessageHash * msgEvtTable[], EvtMessage * evm); -MDE EvtHook *createEventHook(char *name, int (*func) (char *source)); +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); @@ -314,6 +336,10 @@ 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 void moduleDeleteLanguage(int langNumber); + /*************************************************************************/ MDE int moduleAddCallback(char *name,time_t when,int (*func)(int argc, char *argv[]),int argc, char **argv); diff --git a/include/plexus.h b/include/plexus.h deleted file mode 100644 index 5c90bcbfd..000000000 --- a/include/plexus.h +++ /dev/null @@ -1,60 +0,0 @@ -/* PlexusIRCD IRCD functions - * - * (C) 2003-2005 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. - * - * - */ - -#ifdef IRC_PLEXUS - - -#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 - -#endif - - diff --git a/include/ptlink.h b/include/ptlink.h deleted file mode 100644 index 877d48423..000000000 --- a/include/ptlink.h +++ /dev/null @@ -1,84 +0,0 @@ -/* PTLink IRCD functions - * - * (C) 2003-2005 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. - * - * - */ - -#ifdef IRC_PTLINK - - -#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 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 - - -#endif - - diff --git a/include/rageircd.h b/include/rageircd.h deleted file mode 100644 index ea78f69ba..000000000 --- a/include/rageircd.h +++ /dev/null @@ -1,48 +0,0 @@ -/* Rage IRCD functions - * - * (C) 2003-2005 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. - * - * - */ - -#ifdef IRC_RAGE2 - - -#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 - -#endif - diff --git a/include/ratbox.h b/include/ratbox.h deleted file mode 100644 index c3b44a737..000000000 --- a/include/ratbox.h +++ /dev/null @@ -1,52 +0,0 @@ -/* Ratbox IRCD functions - * - * (C) 2003-2005 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. - * - * - */ - -#ifdef IRC_RATBOX - - -#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 - -#endif - - diff --git a/include/services.h b/include/services.h index 1590637bf..c6e171908 100644 --- a/include/services.h +++ b/include/services.h @@ -229,24 +229,6 @@ typedef enum { false, true } boolean; /* Protocol tweaks */ - -#include "hybrid.h" -#include "viagra.h" -#include "bahamut.h" -#include "rageircd.h" -#include "ptlink.h" -#include "ultimate2.h" -#include "unreal31.h" -#include "ultimate3.h" -#include "dreamforge.h" -#include "unreal32.h" -#include "solidircd.h" -#include "plexus.h" -#include "ratbox.h" -#include "shadowircd.h" - - - typedef struct ircdvars_ IRCDVar; typedef struct ircdcapab_ IRCDCAPAB; @@ -311,7 +293,6 @@ struct ircdvars_ { int umode; /* change user modes */ int nickvhost; /* Users vhost sent during NICK */ int chgreal; /* Change RealName */ - int extrahelp; /* Lang file entry for extra */ uint32 noknock; /* Channel Mode for no knock */ uint32 adminmode; /* Admin Only Channel Mode */ uint32 defmlock; /* Default mlock modes */ @@ -384,6 +365,40 @@ struct 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. =) */ @@ -992,6 +1007,17 @@ struct sxline_ { /*************************************************************************/ +/*************************************************************************/ + +/* clone stuff structure */ + +struct clone { + char *host; + long time; +}; + +/************************************************************************/ + /* Host serv structures */ struct hostcore_ { @@ -1039,7 +1065,97 @@ struct session_ { }; /*************************************************************************/ +/** + * 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_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_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_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 **/ diff --git a/include/shadowircd.h b/include/shadowircd.h deleted file mode 100644 index 1dc2e5e52..000000000 --- a/include/shadowircd.h +++ /dev/null @@ -1,77 +0,0 @@ -/* ShadowIRCD functions - * - * (C) 2003-2005 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. - * - * - */ - -#ifdef IRC_SHADOWIRCD - -/* 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 - -#endif - - diff --git a/include/slist.h b/include/slist.h index a3e05650f..1ff56aaf1 100644 --- a/include/slist.h +++ b/include/slist.h @@ -46,18 +46,5 @@ typedef int (*slist_enumcb_t) (SList *slist, int number, void *item, va_list arg /* Callback to know whether we can delete the entry. */ typedef int (*slist_delcheckcb_t) (SList *slist, void *item, va_list args); -/* Functions for global use */ -extern int slist_add(SList *slist, void *item); -extern void slist_clear(SList *slist, int free); -extern int slist_delete(SList *slist, int index); -extern int slist_delete_range(SList *slist, char *range, slist_delcheckcb_t cb, ...); -extern int slist_enum(SList *slist, char *range, slist_enumcb_t cb, ...); -extern int slist_full(SList *slist); -extern int slist_indexof(SList *slist, void *item); -extern void slist_init(SList *slist); -extern void slist_pack(SList *slist); -extern int slist_remove(SList *slist, void *item); -extern int slist_setcapacity(SList *slist, int16 capacity); - #endif /* SLIST_H */ diff --git a/include/solidircd.h b/include/solidircd.h deleted file mode 100644 index 972ec73da..000000000 --- a/include/solidircd.h +++ /dev/null @@ -1,71 +0,0 @@ -/* SolidIRCD functions - * - * (C) 2003-2005 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. - * - * - */ - -/*************************************************************************/ - -#ifdef IRC_SOLID - -#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 - -#endif - diff --git a/include/ultimate2.h b/include/ultimate2.h deleted file mode 100644 index 34cbcdc54..000000000 --- a/include/ultimate2.h +++ /dev/null @@ -1,54 +0,0 @@ -/* Ultimate IRCD 2 functions - * - * (C) 2003-2005 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. - * - * - */ - -#ifdef IRC_ULTIMATE2 - - -#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 - -#endif - - diff --git a/include/ultimate3.h b/include/ultimate3.h deleted file mode 100644 index 75252cbf3..000000000 --- a/include/ultimate3.h +++ /dev/null @@ -1,58 +0,0 @@ -/* Ultimate IRCD 3.0 functions - * - * (C) 2003-2005 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. - * - * - */ - -#ifdef IRC_ULTIMATE3 - - -#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 - -#endif - diff --git a/include/unreal31.h b/include/unreal31.h deleted file mode 100644 index bbf049a6d..000000000 --- a/include/unreal31.h +++ /dev/null @@ -1,57 +0,0 @@ -/* Unreal IRCD 3.1.x functions - * - * (C) 2003-2005 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. - * - * - */ - -/*************************************************************************/ - -#ifdef IRC_UNREAL31 - - -#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 - -#endif diff --git a/include/unreal32.h b/include/unreal32.h deleted file mode 100644 index 9f7b10ebc..000000000 --- a/include/unreal32.h +++ /dev/null @@ -1,85 +0,0 @@ -/* Unreal IRCD 3.2.x functions - * - * (C) 2003-2005 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. - * - * - */ - -#ifdef IRC_UNREAL32 - -/*************************************************************************/ - -/* 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 - -#endif diff --git a/include/viagra.h b/include/viagra.h deleted file mode 100644 index d725f41d9..000000000 --- a/include/viagra.h +++ /dev/null @@ -1,67 +0,0 @@ -/* Viagra IRCD functions - * - * (C) 2003-2005 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. - * - * - */ - -#ifdef IRC_VIAGRA - - -/* 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 - -#endif - diff --git a/install.vbs b/install.vbs new file mode 100644 index 000000000..fb298dd85 --- /dev/null +++ b/install.vbs @@ -0,0 +1,273 @@ +' Configuration for Anope +' +' (C) 2003-2005 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. + + +' Required Variables +Dim StdIn +Dim UseMySQL, UseDBEnc, CompilerVer +Dim fso +Set fso = CreateObject("Scripting.FileSystemObject") + +' Setup StdIn for use +Set StdIn = WScript.StdIn + +' Display introductory header +WScript.Echo "" +WScript.Echo " ___" +WScript.Echo " / _ \ http://www.anope.org" +WScript.Echo " | /_\ | _ __ _ _ _ _ ___" +WScript.Echo " | _ || '_ \/ _ \/ _ \ / _ \" +WScript.Echo " | | | || | | |_| |_| | __/" +WScript.Echo " |_| |_||_| |_\___/| _/ \___|" +WScript.Echo " | |" +WScript.Echo " |_| IRC Services" +WScript.Echo " v1.7.9" +WScript.Echo "" +WScript.Echo "" +WScript.Echo "This program will help you to compile your Services, and ask you" +WScript.Echo "questions regarding the compile-time settings of it during the" +WScript.Echo "process." +WScript.Echo "" +WScript.Echo "Anope is a set of Services for IRC networks that allows users to" +WScript.Echo "manage their nicks and channels in a secure and efficient way," +WScript.Echo "and administrators to manage their network with powerful tools." +WScript.Echo "" +WScript.Echo "Do not forget to read all the documents located in docs/," +WScript.Echo "especially the README and INSTALL files." +WScript.Echo "" +WScript.Echo "For all your Anope needs please visit our portal at" +WScript.Echo "http://www.anope.org/" +WScript.Echo "" +WScript.Echo "Press Enter to Continue..." +StdIn.ReadLine + +' Enable MySQL Support? +Do While (UseMySQL <> "Y" AND UseMySQL <> "N" AND UseMySQL <> "YES" AND UseMySQL <> "NO") + WScript.Echo "Would you like to compile Anope with MySQL Support?" + WScript.Echo "(NOTE: You must have MySQL 3.23 or Later installed)" + WScript.Echo "" + WScript.Echo "Yes / No (Default)" + UseMySQL = UCase(Trim(StdIn.ReadLine)) + If (UseMySQL = "") Then + UseMySQL = "N" + End If + If (UseMySQL <> "Y" AND UseMySQL <> "N" AND UseMySQL <> "YES" AND UseMySQL <> "NO") Then + WScript.Echo "" + WScript.Echo "Invalid Selection!" + WScript.Echo "" + End If +Loop + +WScript.Echo "" + +If (UseMySQL = "Y" OR UseMySQL = "YES") Then + If (fso.FileExists("C:\mysql\lib\opt\libmysql.lib") = False) Then + WScript.Echo "ERROR: Cannot find LibMySQL.lib in c:\mysql\lib\opt!" + WScript.Echo "MySQL Support Disabled.." + UseMySQL = "0" + ElseIf (fso.FileExists("C:\mysql\include\mysql.h") = False) Then + WScript.Echo "ERROR: Cannot find mysql.h in c:\mysql\include!" + WScript.Echo "MySQL Support Disabled.." + UseMySQL = "0" + Else + WScript.Echo "All required files for MySQL Support have been located!" + WScript.Echo "MySQL Support Enabled.." + UseMySQL = "1" + End If +Else + WScript.Echo "MySQL Support Disabled.." + UseMySQL = "0" +End If + +WScript.Echo "" + +' Enable Database Encryption Support? +Do While (UseDBEnc <> "Y" AND UseDBEnc <> "N" AND UseDBEnc <> "YES" AND UseDBEnc <> "NO") + WScript.Echo "Would you like to enable Database Encryption?" + WScript.Echo "(NOTE: If you enable encryption, you will NOT be able to recover" + WScript.Echo "passwords at a later date. GETPASS and SENDPASS will also be useless)" + WScript.Echo "" + WScript.Echo "Yes / No (Default)" + UseDBEnc = UCase(Trim(StdIn.ReadLine)) + If (UseDBEnc = "") Then + UseDBEnc = "N" + End If + If (UseDBEnc <> "Y" AND UseDBEnc <> "N" AND UseDBEnc <> "YES" AND UseDBEnc <> "NO") Then + WScript.Echo "" + WScript.Echo "Invalid Selection!" + WScript.Echo "" + End If +Loop + +WScript.Echo "" + +If (UseDBEnc = "Y" OR UseDBEnc = "YES") Then + WScript.Echo "Database Encryption Enabled.." + UseDBEnc = "1" +Else + WScript.Echo "Database Encryption Disabled.." + UseDBEnc = "0" +End If + +WScript.Echo "" +WScript.Echo "I will now check you have all the things I need..." + +Dim libPath, libPath2 +If (fso.FolderExists("C:\Program Files\Microsoft Visual Studio .NET 2003\VC7\Lib")) Then + WScript.Echo "I found a copy of Microsoft Visual Studio .NET 2003.." + libPath = "C:\Program Files\Microsoft Visual Studio .NET 2003\VC7\Lib" + libPath2 = "C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\PlatformSDK\Lib" + If (fso.FileExists(libPath & "/MSVCRT.lib") = False And fso.FileExists(libPath2 & "/MSVCRT.lib") = False) Then + WScript.Echo "Hm. I can't seem to find the default library.. Are you sure this is installed properly?" + libPath = "" + libPath2 = "" + ElseIf (fso.FileExists(libPath & "/wsock32.lib") = False And fso.FileExists(libPath2 & "/wsock32.lib") = False) Then + WScript.Echo "I couldn't seem to find wsock32.lib.. We kind of need this.." + libPath = "" + libPath2 = "" + ElseIf (fso.FileExists(libPath & "/advapi32.lib") = False And fso.FileExists(libPath2 & "/advapi32.lib") = False) Then + WScript.Echo "I couldn't seem to find advapi32.lib.. We kind of need this.." + libPath = "" + libPath2 = "" + ElseIf (fso.FileExists(libPath & "/uuid.lib") = False And fso.FileExists(libPath2 & "/uuid.lib") = False) Then + WScript.Echo "I couldn't seem to find uuid.lib.. We kind of need this.." + libPath = "" + libPath2 = "" + End If +End If + +If (fso.FolderExists("C:\Program Files\Microsoft Visual Studio\VC98\Lib") And LibPath = "") Then + WScript.Echo "I found a copy of Microsoft Visual Studio 6.. It's old, but we can use it.." + libPath = "C:\Program Files\Microsoft Visual Studio\VC98\Lib" + CompilerVer = "VC6" + If (fso.FileExists(libPath & "/MSVCRT.lib") = False) Then + WScript.Echo "Hm. I can't seem to find the default library.. Are you sure this is installed properly?" + libPath = "" + ElseIf (fso.FileExists(libPath & "/wsock32.lib") = False) Then + WScript.Echo "I couldn't seem to find wsock32.lib.. We kind of need this.." + libPath = "" + ElseIf (fso.FileExists(libPath & "/advapi32.lib") = False) Then + WScript.Echo "I couldn't seem to find advapi32.lib.. We kind of need this.." + libPath = "" + ElseIf (fso.FileExists(libPath & "/uuid.lib") = False) Then + WScript.Echo "I couldn't seem to find uuid.lib.. We kind of need this.." + libPath = "" + End If +End If + +If (fso.FileExists("C:\Program Files\Microsoft Visual Studio .NET 2003\VC7\Bin\nmake.exe") = False AND fso.FileExists("C:\Program Files\Microsoft Visual Studio\VC98\Bin\nmake.exe") = False AND fso.FileExists("C:\nmake.exe") = False) Then + WScript.Echo "" + WScript.Echo "I couldn't seem to find a copy of nmake.exe on your system.." + WScript.Echo "" + WScript.Echo "I can continue without it for now, but you'll need it when you want to compile." + WScript.Echo "I suggest downloading a copy from the URL below, and placing it in your C:\ drive." + WScript.Echo "" + WScript.Echo "http://download.microsoft.com/download/vc15/patch/1.52/w95/en-us/nmake15.exe" + WScript.Echo "" +End If + +If (libPath = "") Then + Dim tmpPath + WScript.Echo "I couldn't find any of the paths I was looking for.." + WScript.Echo "If you have installed the Visual C++ Libraries in a non-standard location, enter" + WScript.Echo "this location below, and I will try and look there.." + WScript.Echo "(NOTE: Do NOT enter a trailing slash)" + WScript.Echo "" + WScript.Echo "Path to Visual C++ Libraries: " + tmpPath = Trim(StdIn.ReadLine) + If (fso.FolderExists(tmpPath) AND fso.FileExists(tmpPath & "/MSVCRT.lib")) Then + libPath = tmpPath + If (fso.FileExists(libPath & "/wsock32.lib") = False) Then + WScript.Echo "I couldn't seem to find wsock32.lib.. We kind of need this.." + libPath = "" + ElseIf (fso.FileExists(libPath & "/advapi32.lib") = False) Then + WScript.Echo "I couldn't seem to find advapi32.lib.. We kind of need this.." + libPath = "" + ElseIf (fso.FileExists(libPath & "/uuid.lib") = False) Then + WScript.Echo "I couldn't seem to find uuid.lib.. We kind of need this.." + libPath = "" + Else + WScript.Echo "Okay, I found what I was looking for.." + End If + Else + WScript.Echo "I couldn't find the default library in that folder." + End If +End If + +If (libPath <> "") Then + Dim f, f2, i, verMaj, verMin, verPatch, verBuild + Const ForReading = 1, ForWriting = 2 + WScript.Echo "Looks like you've got all the libraries I need.." + Set f2 = fso.OpenTextFile("version.log", ForReading) + Do While (i < 7) + f2.SkipLine() + i = i + 1 + Loop + verMaj = Replace(Replace(Trim(f2.ReadLine), "VERSION_MAJOR=" & chr(34), ""), chr(34), "") + verMin = Replace(Replace(Trim(f2.ReadLine), "VERSION_MINOR=" & chr(34), ""), chr(34), "") + verPatch = Replace(Replace(Trim(f2.ReadLine), "VERSION_PATCH=" & chr(34), ""), chr(34), "") + verBuild = Replace(Replace(Trim(f2.ReadLine), "VERSION_BUILD=" & chr(34), ""), chr(34), "") + verStr = Replace(verStr, chr(34), "") + f2.close + Set f = fso.OpenTextFile("Makefile.inc.win32", ForWriting) + f.WriteLine("USE_MYSQL=" & UseMySQL) + If (UseMySQL = "1") Then + f.WriteLine("MYSQL_LIB=" & chr(34) & "c:\\mysql\\lib\\opt" & chr(34)) + f.WriteLine("MYSQL_INC=" & chr(34) & "c:\\mysql\\include" & chr(34)) + End If + f.WriteLine("DB_ENCRYPTION=" & UseDBEnc) + If (CompilerVer = "VC6") Then + f.WriteLine("VC6=/QIfist") + End If + if (libPath2 <> "") Then + libPath = libPath2 & chr(34) & " /LIBPATH:" & chr(34) & libPath + End If + f.WriteLine("VERSION=" & verMaj & "." & verMin & "." & verPatch & "." & verBuild) + f.WriteLine("LIBPATH=" & libPath) + 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=/O2 /MD") + f.WriteLine("LIBS=wsock32.lib advapi32.lib /NODEFAULTLIB:libcmtd.lib") + f.WriteLine("LFLAGS=/LIBPATH:" & chr(34) & "$(LIBPATH)" & chr(34)) + If (UseMySQL = "1") Then + 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) \") + f.WriteLine("/DEF:src\mypasql.def libmysql.lib zlib.lib ws2_32.lib advapi32.lib /NODEFAULTLIB:LIBCMTD.lib") + f.WriteLine("LIBS=$(LIBS) libmysql.lib zlib.lib") + End If + If (UseDBEnc = "1") Then + f.WriteLine("BASE_CFLAGS=/D USE_ENCRYPTION /D ENCRYPT_MD5 $(BASE_CFLAGS)") + End If + f.WriteLine("MORE_CFLAGS = /I" & chr(34) & "../include" & chr(34)) + f.WriteLine("CFLAGS = /nologo $(VC6) $(CDEFS) $(BASE_CFLAGS) $(MORE_CFLAGS)") + f.close() + WScript.Echo "Configuration Complete!" + WScript.Echo "" + WScript.Echo "Type nmake -f Makefile.win32 to Compile Anope" +Else + WScript.Echo "" + WScript.Echo "Sorry, but you didn't have all the required libraries installed." + WScript.Echo "" + WScript.Echo "See http://windows.anope.org for a list of downloads needed to install Anope" + WScript.Echo "" +End If + diff --git a/lang/cat.l b/lang/cat.l index 7699ad2a6..0b5763b7a 100644 --- a/lang/cat.l +++ b/lang/cat.l @@ -1923,7 +1923,7 @@ 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 @@ -2887,7 +2887,7 @@ OPER_MODULE_UNLOAD_SYNTAX OPER_MODULE_LIST_HEADER Current Module list: OPER_MODULE_LIST - Module: %s [%s] + Module: %s [%s] [%s] OPER_MODULE_LIST_FOOTER %d Modules loaded. OPER_MODULE_INFO_LIST @@ -3287,26 +3287,65 @@ HELP_HELP_HOST # ########################################################################### -NICK_HELP - %S Et permet "registrar" un nickname i - prevenir a d'altres utilitzar-lo. Les següents comandes - permeten el registre i manteniment de nicknames; - per a utilitzar-los, escriu /msg %S comanda. - per més informació sobre una comanda especifica - escriu /msg %S HELP comanda. - +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_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 /msg %S comanda. + per més informació sobre una comanda especifica + escriu /msg %S HELP comanda. - Altres comandes: GHOST, GLIST, INFO, LIST, LOGOUT, STATUS - +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 @@ -3720,14 +3759,6 @@ NICK_HELP_SENDPASS Aquesta comanda no esta disponible quant encriptació esta habilitada. NICK_SERVADMIN_HELP - - Les següents comandes estan disponibles a administradors - de serveis: - - GETPASS Recupera la clau per un nickname - (sols si encriptació esta deshabilitada) - FORBID Impossibilita que un nickname sigui utilitzat - Administradors de serveis poden també eliminar qualsevol nickname sense tenir que identificar-se pel nick i poden veure la llista d'accés per qualsevol nickname @@ -3891,52 +3922,98 @@ NICK_SERVADMIN_HELP_UNSUSPEND # ChanServ help messages # ########################################################################### - -CHAN_HELP - %S et permet registrar i controlar varis - aspectes dels canals. Sovint, %S pot prevenir - a usuaris maliciosos "pendre" canals limitant - qui esta permés a tenir privilegis d'operador. - Les comandes disponibles estan llistades a continuació; - Per a utilitzar-los, escriu /msg %S comanda. - Per més informació sobre una comanda especifica, - escriu /msg %S HELP comanda. - +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 - - Altres comandes: BAN, CLEAR, DEOP, DEVOICE, GETKEY, INFO, - INVITE, KICK, LIST, LOGOUT, OP, UNBAN, - VOICE, VOP - -CHAN_HELP_UNREAL - - Aquestes comandes tambe estan disponibles en aquesta xarxa: - DEHALFOP, DEOWNER, DEPROTECT, HALFOP, HOP, OWNER, - PROTECT - -CHAN_HELP_ULTIMATE3 - - Aquestes comandes tambe estan disponibles en aquesta xarxa: - DEHALFOP, HALFOP, HOP, ADMIN, DEADMIN - -CHAN_HELP_IRCD_HALFOP - - These commands are also available on this network: - DEHALFOP, HALFOP, HOP +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_IRCD_PROTECT - - These commands are also available on this network: - DEPROTECT, PROTECT +CHAN_HELP + %S et permet registrar i controlar varis + aspectes dels canals. Sovint, %S pot prevenir + a usuaris maliciosos "pendre" canals limitant + qui esta permés a tenir privilegis d'operador. + Les comandes disponibles estan llistades a continuació; + Per a utilitzar-los, escriu /msg %S comanda. + Per més informació sobre una comanda especifica, + escriu /msg %S HELP comanda. + CHAN_HELP_EXPIRES @@ -4798,9 +4875,6 @@ CHAN_SERVADMIN_HELP Les següents comandes estan disponibles per a administradors de serveis: - GETPASS Retorna la clau de fundador per a un canal - (sols si l'encriptació esta deshabilitada) - FORBID Evita que un canal es faci servir STATUS Retorna el nivell d'accés actual d'un usuari en un canal CLIST llista tots els canals en els que l'usuari @@ -4928,8 +5002,30 @@ CHAN_SERVADMIN_HELP_STATUS # 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 +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 @@ -4938,19 +5034,10 @@ MEMO_HELP Les comandes de %S incloen: - SEND Envia un memo a un nick o canal - CANCEL Cancela l'últim memo enviat - LIST llista els teus memos - READ Llegeix un o més memos - DEL Esborra un o més memos - SET Estableix opcions relacionades a memos - MEMO_HELP_ADMIN - SENDALL Send a memo to all registered users - + not used. MEMO_HELP_OPER - STAFF Send a memo to all opers/admins - + not used. MEMO_HELP_FOOTER escriu /msg %S HELP comando per a més ajuda en @@ -5158,88 +5245,91 @@ MEMO_HELP_CHECK # OperServ help messages # ########################################################################### - -OPER_HELP - Comandes per a %S: +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 LIST Llista tots els operadors de serveis - ADMIN LIST Llista tots els administradors de +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_OPER_CMD - Comandes disponibles sols per a operadors i 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_OPER_CMD_EXTRA - Following commands are also available - -OPER_HELP_OPER_CMD_SGLINE +OPER_HELP_CMD_SGLINE SGLINE Manipula la llista SGLINE - -OPER_HELP_OPER_CMD_SQLINE +OPER_HELP_CMD_SQLINE SQLINE Manipula la llista SQLINE - -OPER_HELP_OPER_CMD_SZLINE +OPER_HELP_CMD_SZLINE SZLINE Manipula la llista SZLINE - -OPER_HELP_ADMIN_CMD - Comandes disponibles només a administradors de serveis: - OPER Modifica la llista d'operadors de serveis +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ó - CACHE Llista cau de hostnames utilitzats pel detector - de proxys +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 - QUIT Termina el programa de serveis sense grabar les dades +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 - - Comandes disponibles nomès pel super-usuari de serveis: - ADMIN Modifica la llista d'administradors de - serveis - -OPER_HELP_ADMIN_CMD_EXTRA - Following commands are also available to Service Admins - -OPER_HELP_ADMIN_CMD_OLINE +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_ADMIN_CMD_UMODE +OPER_HELP_CMD_UMODE UMODE Change a user's modes - -OPER_HELP_ADMIN_CMD_SVSNICK +OPER_HELP_CMD_SVSNICK SVSNICK Forcefully change a user's nickname - -OPER_HELP_ROOT_CMD - Commands available to Serivces Roots only: +OPER_HELP_CMD_MODLOAD MODLOAD Load a module +OPER_HELP_CMD_MODUNLOAD MODUNLOAD Un-Load a module - MODLIST List loaded modules +OPER_HELP_CMD_MODINFO MODINFO Info about a loaded module +OPER_HELP_CMD_MODLIST + MODLIST List loaded modules OPER_HELP_LOGGED Noticia: Totes les comandes enviades a %S son monitorejades! @@ -5877,6 +5967,27 @@ OPER_HELP_MODLIST # 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. @@ -5888,14 +5999,8 @@ BOT_HELP informació sobre un comanda especifica, escriu /msg %S HELP comanda. - BOTLIST Llista bots disponibles - ASSIGN Assigna un bot a un canal - SET Configura opcions de bots - KICK Configura kickers - BADWORDS Manté una llista de paraules malsonants - - Altres comandos: ACT INFO SAY UNASSIGN +BOT_HELP_FOOTER El bot entrara a un canal quan hi hagin %d usuari(s) en ell. @@ -6166,18 +6271,11 @@ BOT_HELP_ACT Fa que el bot fagi l'equivalent a la comanda "/me" en el canal especificat utilitzant el text especificat. -BOT_SERVADMIN_HELP - - La següent comanda està disponible per administradors - de serveis: - - BOT Manté la llista de bots de la xarxa BOT_SERVADMIN_HELP_BOT Sintaxi: BOT ADD nick usuari host real BOT CHANGE nick-ant nick-nue [usuari [host [real]]] BOT DEL nick - BOT LIST Permet als administradors de serveis crear, modificar i esborrar bots que usuaris podran usar en els seus propis @@ -6190,8 +6288,6 @@ BOT_SERVADMIN_HELP_BOT o nom real d'un bot sense tenir que esborrar-lo (i la informació associada a ell). BOT DEL esborra el bot donat de la llista de bots. - BOT LIST es un àlies de BOTLIST i només llista - tots els bots disponibles en la xarxa. Nota: Si fas un bot amb un nick ja enregistrat, sera eliminat. A més, si un usuari està actualment @@ -6312,20 +6408,38 @@ HOST_LIST_KEY_FOOTER # HostServ Help messages # ########################################################################### -HOST_HELP - %S commands: +HOST_HELP_CMD_ON ON Activates your assigned vhost + +HOST_HELP_CMD_OFF OFF Deactivates your assigned vhost -HOST_OPER_HELP - Commands available to services operators only: +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_HELP + %S commands: + +HOST_OPER_HELP + not used. + HOST_ADMIN_HELP - Commands available to services admins only: + not used. HOST_HELP_ON Syntax: ON @@ -1918,7 +1918,7 @@ 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 @@ -2880,7 +2880,7 @@ OPER_MODULE_UNLOAD_SYNTAX OPER_MODULE_LIST_HEADER Aktuelle Module - Liste: OPER_MODULE_LIST - Module: %s [%s] + Module: %s [%s] [%s] OPER_MODULE_LIST_FOOTER %d Module geladen. OPER_MODULE_INFO_LIST @@ -3307,29 +3307,70 @@ HELP_HELP_HOST # NickServ help messages ## 22.10.2004 ## # ########################################################################### +NICK_HELP_CMD_CONFIRM + CONFIRM Confirm a nickserv auth code +NICK_HELP_CMD_RESEND + RESEND Resend a nickserv auth code -NICK_HELP - Mit %S kannst du einen Nicknamen "registrieren" und somit - verhindern, dass andere ihn nutzen. Die folgenden Befehle - erlauben die Registrierung und das Ändern der Einstellungen - von den Nicknamen. Um sie zu benutzen, tippe - /msg %S Befehl. Für weitergehende Informationen zu - einem bestimmten Befehl, tippe /msg %S HELP Befehl. - +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_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 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 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 Suspend a given nick +NICK_HELP_CMD_UNSUSPEND + UNSUSPEND Unsuspend a given nick + +NICK_HELP + Mit %S kannst du einen Nicknamen "registrieren" und somit + verhindern, dass andere ihn nutzen. Die folgenden Befehle + erlauben die Registrierung und das Ändern der Einstellungen + von den Nicknamen. Um sie zu benutzen, tippe + /msg %S Befehl. Für weitergehende Informationen zu + einem bestimmten Befehl, tippe /msg %S HELP Befehl. - Weitere Befehle: GHOST, ALIST, INFO, LIST, LOGOUT, STATUS - +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. @@ -3818,17 +3859,6 @@ NICK_HELP_SENDPASS verschlüsselt angelegt sind. NICK_SERVADMIN_HELP - - Die folgenden Befehle sind für Services Administratoren - verfügbar: - - GETPASS Das Passwort eines Nicknamens aus der - Datenbank auslesen (nur wenn keine - Verschlüsselung aktiv ist) - GETEMAIL Gibt die passenden Nicknamen wieder, - welche die angegebene eMail benutzen. - FORBID Einen bestimmten Nicknamen verbieten - 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 @@ -4013,56 +4043,105 @@ NICK_SERVADMIN_HELP_UNSUSPEND # ChanServ help messages # ########################################################################### - -CHAN_HELP - Mit Hilfe von %S kann man Channel registrieren und - eine Vielzahl von Kontrolloptionen einstellen. %S kann - zum Beispiel das "Takeover" von Channels verhindern,in - dem man die Channel-Op Privilegien auf bestimmte registrierte - Nicknamen begrenzt. Verfügbare Befehle sind unten aufgelistet. - Um sie zu benutzen tippe /msg %S Befehl. Für weitere - Informationen zu einem bestimmten Befehl, tippe : - /msg %S HELP Befehl. - +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 Die Liste von AOP User bearbeiten +CHAN_HELP_CMD_SOP SOP Die Liste von AOP User bearbeiten +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 - - Weitere Befehle: BAN, CLEAR, DEOP, DEVOICE, GETKEY, INFO, - INVITE, KICK, LIST, LOGOUT, OP, TOPIC, - UNBAN, VOICE, VOP - -CHAN_HELP_UNREAL - - Diese Befehle stehen zusätzlich in diesem Netzwerk zur Verfügung: - DEHALFOP, DEOWNER, DEPROTECT, HALFOP, HOP, OWNER, PROTECT +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_ULTIMATE3 - - Diese Befehle stehen zusätzlich in diesem Netzwerk zur Verfügung: - DEHALFOP, HALFOP, HOP, ADMIN, DEADMIN - -CHAN_HELP_IRCD_HALFOP - - Die folgende Befehle sind auf diesem Netzwerk Verfügbar: - DEHALFOP, HALFOP, HOP - -CHAN_HELP_IRCD_PROTECT +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 /msg %S Befehl. Für weitere + Informationen zu einem bestimmten Befehl, tippe : + /msg %S HELP Befehl. + - Die folgende Befehle sind auf diesem Netzwerk Verfügbar: - DEPROTECT, PROTECT - CHAN_HELP_EXPIRES Beachte das jeder Channel der für %d Tage nicht @@ -4925,20 +5004,6 @@ CHAN_HELP_SENDPASS CHAN_SERVADMIN_HELP - Die folgenden Befehle sind zusätzlich für - Services Administratoren verfügbar: - - GETPASS Liest das Passwort des Channel-Founders - aus der Datenbank aus (wenn die - Verschlüsselung deaktiviert ist) - FORBID Verhindert die Nutzung eines Channels - SUSPEND Verbietet jegliche Nutzung des Channels. - Die Channel Einstellungen bleiben jedoch - erhalten - UNSUSPEND Hebt ein SUSPEND wieder auf - STATUS Liefert das Zugriffslevel eines Users - in dem Channel - 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. @@ -5074,38 +5139,49 @@ CHAN_SERVADMIN_HELP_STATUS # MemoServ help messages ## 22.10.2004 ## # ########################################################################### - -MEMO_HELP - %S ist eine Einrichtung, die es erlaubt, - dass sich IRC User untereinander kurze Textnachrichten - senden, egal ob die Empfänger zu dem Zeitpunkt online - sind oder nicht. - Als Empfänger können auch Channels angegeben werden (*). - - Sowohl der Nickname des Senders als auch Empfängers müssen - registriert sein, um eine Memo versenden zu können. - - %S's Befehle beinhalten: - +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 + einen Nicknamen gelesen wurde -MEMO_HELP_ADMIN +MEMO_HELP_CMD_SENDALL SENDALL Sendet eine Nachricht an alle registrierten User. - -MEMO_HELP_OPER +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 + not used. +MEMO_HELP_OPER + not used. MEMO_HELP_FOOTER Type /msg %S HELP Befehl für hilfe bei jedem der @@ -5330,83 +5406,89 @@ MEMO_HELP_CHECK # ########################################################################### -OPER_HELP - Befehle von %S: +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 - GLOBAL Eine Notice an alle User schicken - OPER LIST Alle Services Operatoren anzeigen - ADMIN LIST Alle Services Administratoren anzeigen - -OPER_HELP_OPER_CMD - Befehle, auf die nur Services Operatoren und - Services Admininistratoren Zugriff haben: +OPER_HELP_CMD_MODE MODE Channel-Modes ändern +OPER_HELP_CMD_KICK KICK Einen User aus einem beliebigen Channel kicken - AKILL Die AutoKill-Liste bearbeiten +OPER_HELP_CMD_CLEARMODES CLEARMODES Die Modis eines Channels zurücksetzen - -OPER_HELP_OPER_CMD_EXTRA - Die folgende Befehle sind Verfügbar - -OPER_HELP_OPER_CMD_SGLINE +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_OPER_CMD_SQLINE +OPER_HELP_CMD_SQLINE SQLINE Die SQLINE-Liste bearbeiten - -OPER_HELP_OPER_CMD_SZLINE +OPER_HELP_CMD_SZLINE SZLINE Die SZLINE-Liste bearbeiten - -OPER_HELP_ADMIN_CMD - Befehle, auf die nur Services Administratoren Zugriff haben: - SET Verschiedene Services Optionen einstellen - OPER Die Services Operatoren Liste bearbeiten - NOOP Alle O:Lines temporär deaktivieren - JUPE Einen Server "jupitern" - QUIT Services _ohne_ Speichern der Datenbanken - beenden - DEFCON Ändert das DefCon System - UPDATE Die Services Datenbänke sofort speichern - RELOAD Die Konfigurationsdatei neu einlesen - SHUTDOWN Datenbanken speichern und Services beenden - IGNORE Die "Services Ignore Liste" bearbeiten - RESTART Datenbanken speichern und Services neustarten - SESSION Hosts mit einer bestimmten Anzahl - CHANKILL Killt alle User des angegebenen Channels +OPER_HELP_CMD_CHANLIST CHANLIST Alle registrierten Channels anzeigen +OPER_HELP_CMD_USERLIST USERLIST Alle registrierten Nicknamen anzeigen - OPERNEWS Oper News bearbeiten +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 - KILLCLONES Alle User mit einem bestimmten Host killen - - Befehle, auf die nur Services Roots (diese sind fest in der - services.conf eingetragen) Zugriff haben: - ADMIN Liste der Services Administratoren bearbeiten - -OPER_HELP_ADMIN_CMD_EXTRA - Die folgende Befehle sind für Service Administartoren Verfügbar - -OPER_HELP_ADMIN_CMD_OLINE +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_ADMIN_CMD_UMODE +OPER_HELP_CMD_UMODE UMODE User Modes ändern - -OPER_HELP_ADMIN_CMD_SVSNICK +OPER_HELP_CMD_SVSNICK SVSNICK Erzwingt einen Nicknamen wechsel - -OPER_HELP_ROOT_CMD - Befehle, auf die nur Services Roots Zugriff haben: +OPER_HELP_CMD_MODLOAD MODLOAD Lädt ein Modul - MODLIST Listet die geladenen Module auf - MODINFO Info über ein geladenes 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, @@ -6076,7 +6158,29 @@ OPER_HELP_MODLIST # BotServ help messages ## 19.10.2004 ## # ########################################################################### - + + +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 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 Verwaltung von Bots + BOT_HELP %S ist dafür geschaffen, Bots in Channels einzubringen. Geschaffen wurde er für User, die @@ -6086,15 +6190,8 @@ BOT_HELP Für weitere Hilfe zu einem bestimmten Befehl tippe /msg %S HELP Befehl - - BOTLIST Zeigt alle vorhandenen Bots an - ASSIGN Weist einem Channel einen Bot zu - SET Konfiguriert die Bot-Optionen - KICK Konfiguriert den Kicker (s.u.) - BADWORDS Verwaltet die Bad-Word-Liste - - Weitere Befehle: ACT, INFO, SAY, UNASSIGN - + +BOT_HELP_FOOTER Ein Bot betritt den Channel erst, wenn sich %d User in diesem Channel befinden. @@ -6372,17 +6469,10 @@ BOT_HELP_ACT Bringt den Bot dazu, /me text auf dem angegebenen Channel auszugeben. -BOT_SERVADMIN_HELP - - Der folgende Befehl ist nur für Services Administratoren verfügbar: - - BOT Verwaltung von Bots - BOT_SERVADMIN_HELP_BOT Syntax: BOT ADD Botnick User Host Realname BOT CHANGE Botnick Neuer-Botnick [User [Host [Realname]]] BOT DEL Botnick - BOT LIST Erlaubt Services Administratoren Bots zu erstellen/verändern/ löschen, die die User in Ihren Channeln benutzen können. @@ -6391,8 +6481,6 @@ BOT_SERVADMIN_HELP_BOT 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. - Der BOT LIST Befehl ist ein Alias für BOTLIST und zeigt alle - im Netz verfügbaren Bots an. Achtung: Wenn ein Bot erstellt wird, dessen Nickname registriert ist, wird dieser Nickname gelöscht. Falls @@ -6509,23 +6597,32 @@ HOST_LIST_KEY_FOOTER # HostServ Help messages ## 19.10.2004 ## # ########################################################################### -HOST_HELP - %S Befehle: +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_OPER_HELP - Befehle für Services Operatoren: +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_HELP + %S Befehle: +HOST_OPER_HELP + not used. + HOST_ADMIN_HELP - Befehle für Services Administratoren: + not used. HOST_HELP_ON Syntax: ON diff --git a/lang/en_us.l b/lang/en_us.l index c84c121c9..983f83442 100644 --- a/lang/en_us.l +++ b/lang/en_us.l @@ -1865,7 +1865,7 @@ 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 @@ -2778,6 +2778,8 @@ 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 @@ -2785,7 +2787,7 @@ OPER_MODULE_UNLOAD_SYNTAX OPER_MODULE_LIST_HEADER Current Module list: OPER_MODULE_LIST - Module: %s [%s] + Module: %s [%s] [%s] OPER_MODULE_LIST_FOOTER %d Modules loaded. OPER_MODULE_INFO_LIST @@ -3160,27 +3162,66 @@ HELP_HELP_HOST # ########################################################################### -NICK_HELP - %S allows you to "register" a nickname and - prevent others from using it. The following - commands allow for registration and maintenance of - nicknames; to use them, type /msg %S command. - For more information on a specific command, type - /msg %S HELP command. - +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_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 /msg %S command. + For more information on a specific command, type + /msg %S HELP command. - Other commands: GHOST, ALIST, GLIST, INFO, LIST, LOGOUT, - STATUS, UPDATE +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 @@ -3596,15 +3637,7 @@ NICK_HELP_SENDPASS This command is unavailable when encryption is enabled. NICK_SERVADMIN_HELP - - The following commands are available to Services admins: - - GETPASS Retrieve the password for a nickname - (only if encryption is disabled) - GETEMAIL Matches and returns all users that - registered using given email - FORBID Prevents a nickname from being registered - + Services admins can also drop any nickname without needing to identify for the nick, and may view the access list for any nickname (/msg %S ACCESS LIST nick). @@ -3753,51 +3786,97 @@ NICK_SERVADMIN_HELP_UNSUSPEND # ########################################################################### -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 - /msg %S command. For more information on a - specific command, type /msg %S HELP command. - +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 - - Other commands: BAN, CLEAR, DEOP, DEVOICE, GETKEY, INFO, - INVITE, KICK, LIST, LOGOUT, OP, TOPIC, - UNBAN, VOICE, VOP - -CHAN_HELP_UNREAL - - These commands are also available on this network: - DEHALFOP, DEOWNER, DEPROTECT, HALFOP, HOP, OWNER, - PROTECT - -CHAN_HELP_ULTIMATE3 - - These commands are also available on this network: - DEHALFOP, HALFOP, HOP, ADMIN, DEADMIN +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_IRCD_HALFOP - - These commands are also available on this network: - DEHALFOP, HALFOP, HOP - -CHAN_HELP_IRCD_PROTECT +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 + /msg %S command. For more information on a + specific command, type /msg %S HELP command. + - These commands are also available on this network: - DEPROTECT, PROTECT - CHAN_HELP_EXPIRES Note that any channel which is not used for %d days @@ -4616,18 +4695,7 @@ CHAN_HELP_SENDPASS This command is unavailable when encryption is enabled. CHAN_SERVADMIN_HELP - - The following commands are available to Services admins: - - GETPASS Retrieve the founder password for a channel - (only if encryption is disabled) - FORBID Prevent a channel from being used - SUSPEND Prevent a channel from being used preserving - channel data and settings. - UNSUSPEND Releases a suspended channel. - STATUS Returns the current access level of a user - on a channel - + Services admins can also drop any channel without needing to identify via password, and may view the access, AKICK, and level setting lists for any channel. @@ -4744,30 +4812,43 @@ CHAN_SERVADMIN_HELP_STATUS # ########################################################################### -MEMO_HELP - %S is a utility allowing IRC users to send short - messages to other IRC users, whether they are online at - the time or not, or to channels(*). Both the sender's - nickname and the target nickname or channel must be - registered in order to send a memo. - - %S's commands include: - +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_ADMIN +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 - STAFF Send a memo to all opers/admins + not used. MEMO_HELP_FOOTER @@ -4949,81 +5030,89 @@ MEMO_HELP_CHECK # OperServ help messages # ########################################################################### - -OPER_HELP - %S commands: +OPER_HELP_CMD_GLOBAL GLOBAL Send a message to all users +OPER_HELP_CMD_STATS STATS Show status of Services and network - OPER LIST List all Services operators - ADMIN LIST List all Services admins +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_OPER_CMD - Commands available to Services operators and admins only: +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_OPER_CMD_EXTRA - Following commands are also available - -OPER_HELP_OPER_CMD_SGLINE +OPER_HELP_CMD_SGLINE SGLINE Manipulate the SGLINE list - -OPER_HELP_OPER_CMD_SQLINE +OPER_HELP_CMD_SQLINE SQLINE Manipulate the SQLINE list - -OPER_HELP_OPER_CMD_SZLINE +OPER_HELP_CMD_SZLINE SZLINE Manipulate the SZLINE list - -OPER_HELP_ADMIN_CMD - Commands available to Services admins only: - OPER Modify the Services operator 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 + 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 + 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 + 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 - - Commands available to the Services super-user only: - ADMIN Modify the Services admin list - -OPER_HELP_ADMIN_CMD_EXTRA - Following commands are also available to Service Admins - -OPER_HELP_ADMIN_CMD_OLINE +OPER_HELP_CMD_OLINE OLINE Give Operflags to a certain user - -OPER_HELP_ADMIN_CMD_UMODE +OPER_HELP_CMD_UMODE UMODE Change a user's modes - -OPER_HELP_ADMIN_CMD_SVSNICK +OPER_HELP_CMD_SVSNICK SVSNICK Forcefully change a user's nickname - -OPER_HELP_ROOT_CMD - Commands available to Service Roots only: +OPER_HELP_CMD_MODLOAD MODLOAD Load a module +OPER_HELP_CMD_MODUNLOAD MODUNLOAD Un-Load a module - MODLIST List loaded modules +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! @@ -5629,7 +5718,27 @@ OPER_HELP_MODLIST # 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 @@ -5639,16 +5748,11 @@ BOT_HELP more information on a specific command, type /msg %S HELP command. - BOTLIST Lists available bots - ASSIGN Assigns a bot to a channel - SET Configures bot options - KICK Configures kickers - BADWORDS Maintains bad words list - - Other commands: ACT INFO SAY UNASSIGN - + +BOT_HELP_FOOTER Bot will join a channel whenever there is at least %d user(s) on it. + BOT_HELP_BOTLIST Syntax: BOTLIST @@ -5907,17 +6011,11 @@ BOT_HELP_ACT Makes the bot do the equivalent of a "/me" command on the given channel using the given text. -BOT_SERVADMIN_HELP - - The following command is available to Services admins: - - BOT Maintains network bot list BOT_SERVADMIN_HELP_BOT Syntax: BOT ADD nick user host real BOT CHANGE oldnick newnick [user [host [real]]] BOT DEL nick - BOT LIST Allows Services admins to create, modify, and delete bots that users will be able to use on their own @@ -5930,8 +6028,6 @@ BOT_SERVADMIN_HELP_BOT or realname of a bot without actually delete it (and all the data associated with it). BOT DEL removes the given bot from the bot list. - BOT LIST is an alias of BOTLIST and just lists all - bots available on the network. Note: you cannot create a bot that has a nick that is currently registered. If an unregistered user is currently @@ -6036,22 +6132,38 @@ HOST_LIST_KEY_FOOTER # HostServ Help messages # ########################################################################### -HOST_HELP - %S commands: +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_OPER_HELP - Commands available to HostSetters/Removes only: +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 + moo + HOST_ADMIN_HELP - Commands available to services admins only: + moo + +HOST_HELP + %S commands: HOST_HELP_ON Syntax: ON @@ -2860,7 +2860,7 @@ OPER_MODULE_UNLOAD_SYNTAX OPER_MODULE_LIST_HEADER Lista actual de modulos: OPER_MODULE_LIST - Modulo: %s [%s] + Modulo: %s [%s] [%s] OPER_MODULE_LIST_FOOTER %d Modulos cargados. OPER_MODULE_INFO_LIST @@ -3259,27 +3259,66 @@ HELP_HELP_HOST # 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 - %S te permite "registrar" un nickname y - prevenir a otros usarlo. Los siguientes comandos - permiten el registro y mantenimiento de nicknames; - para usarlos, tipea /msg %S comando. - Para mayor informacion acerca de un comando especifico - tipea /msg %S HELP comando. - +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_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 /msg %S comando. + Para mayor informacion acerca de un comando especifico + tipea /msg %S HELP comando. - Otros comandos: ALIST, GHOST, GLIST, INFO, LIST, LOGOUT, STATUS - +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 @@ -3693,14 +3732,6 @@ NICK_HELP_SENDPASS Este comando no esta disponible cuando encripcion esta habilitada. NICK_SERVADMIN_HELP - - Los siguientes comandos estan disponibles a administradores - de Servicios: - - GETPASS Recupera la clave para un nickname - (solo si encripcion esta desabilitada) - FORBID Previene un nickname a ser usado - Administradores de Servicios pueden tambien botar cualquier nickname sin tener que identificarse por el nick y pueden ver la lista de acceso para cualquier nickname @@ -3864,53 +3895,98 @@ NICK_SERVADMIN_HELP_UNSUSPEND # ChanServ help messages # ########################################################################### - -CHAN_HELP - %S te permite registrar y controlar varios - aspectos de los canales. A menudo, %S puede prevenir - a usuarios maliciosos "tomarse" canales limitando - quienes estan permitidos a tener privilegios de operador. - Los comandos disponibles estan listados a continuacion; - para usarlos, tipea /msg %S comando. - Para mayor informacion acerca de un comando especifico, - tipea /msg %S HELP comando. - +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 - - Otros comandos: BAN, CLEAR, DEOP, DEVOICE, GETKEY, - INFO, INVITE, KICK, LIST, LOGOUT, OP, - UNBAN, VOICE, VOP - -CHAN_HELP_UNREAL - - Estos comandos tambien estan disponibles en esta red: - DEHALFOP, DEOWNER, DEPROTECT, HALFOP, HOP, OWNER, - PROTECT - -CHAN_HELP_ULTIMATE3 - - Estos comandos tambien estan disponibles en esta red: - DEHALFOP, HALFOP, HOP, ADMIN, DEADMIN +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_IRCD_HALFOP - - These commands are also available on this network: - DEHALFOP, HALFOP, HOP - -CHAN_HELP_IRCD_PROTECT +CHAN_HELP + %S te permite registrar y controlar varios + aspectos de los canales. A menudo, %S puede prevenir + a usuarios maliciosos "tomarse" canales limitando + quienes estan permitidos a tener privilegios de operador. + Los comandos disponibles estan listados a continuacion; + para usarlos, tipea /msg %S comando. + Para mayor informacion acerca de un comando especifico, + tipea /msg %S HELP comando. + - These commands are also available on this network: - DEPROTECT, PROTECT - CHAN_HELP_EXPIRES Ten en cuenta que cualquier canal que no es usado por @@ -4771,18 +4847,6 @@ CHAN_HELP_SENDPASS CHAN_SERVADMIN_HELP - Los siguientes comandos estan disponibles para administradores - de Servicios: - - GETPASS Retorna la clave de fundador para un canal - (solo si encripcion esta desabilitada) - FORBID Previene un canal a ser usado - SUSPEND Previene un canal a ser usado preservando - toda su informacion. - UNSUSPEND Libera la suspencion del canal. - STATUS Retorna el nivel de acceso actual de un - usuario en un canal - Administradores de Servicios tambien pueden botar un canal sin tener que identificarse por medio de clave, y pueden ver el acceso, AKICK, y seteos de las listas de niveles para @@ -4905,8 +4969,30 @@ CHAN_SERVADMIN_HELP_STATUS # 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 +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 @@ -4915,19 +5001,11 @@ MEMO_HELP Los comandos de %S incluyen: - SEND Envia un memo a un nick o canal - CANCEL Cancela el ultimo memo que enviaste - LIST Lista tus memos - READ Lee uno o mas memos - DEL Borra uno o mas memos - SET Setea opciones relacionadas a memos MEMO_HELP_ADMIN - SENDALL Envia un memo a todos los usuarios registrados - + not used. MEMO_HELP_OPER - STAFF Envia un memo a todos los opers/admins - + not used. MEMO_HELP_FOOTER Tipea /msg %S HELP comando para ayuda de cualquiera @@ -5133,88 +5211,94 @@ MEMO_HELP_CHECK # ########################################################################### -OPER_HELP - Comandos para %S: +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 LIST Lista todos los operadores de Servicios - ADMIN LIST Lista todos los administradores de Servicios +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_OPER_CMD - Comandos disponibles solo para operadores y administradores - de Servicios: +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_OPER_CMD_EXTRA - Following commands are also available - -OPER_HELP_OPER_CMD_SGLINE +OPER_HELP_CMD_SGLINE SGLINE Manipula la lista SGLINE - -OPER_HELP_OPER_CMD_SQLINE +OPER_HELP_CMD_SQLINE SQLINE Manipula la lista SQLINE - -OPER_HELP_OPER_CMD_SZLINE +OPER_HELP_CMD_SZLINE SZLINE Manipula la lista SZLINE - -OPER_HELP_ADMIN_CMD - Comandos disponibles solo a administradores de Servicios: - OPER Modifica la lista de operadores de Servicios +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 - CACHE Lista cache de hostnames usado por el detector - de proxys +OPER_HELP_CMD_NOOP NOOP Temporalmente remueve todas las lineas O: de - un servidor remotamente + 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 - QUIT Termina el programa de Servicios sin salvar + 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 - - Comandos disponibles al super-usuario de Servicios solamente: - ADMIN Modifica la lista de administradores de - Servicios - -OPER_HELP_ADMIN_CMD_EXTRA - Following commands are also available to Service Admins - -OPER_HELP_ADMIN_CMD_OLINE +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_ADMIN_CMD_UMODE +OPER_HELP_CMD_UMODE UMODE Otorga cambios de modos de usuario - -OPER_HELP_ADMIN_CMD_SVSNICK +OPER_HELP_CMD_SVSNICK SVSNICK Forcefully change a user's nickname - -OPER_HELP_ROOT_CMD - Commands available to Serivces Roots only: +OPER_HELP_CMD_MODLOAD MODLOAD Load a module +OPER_HELP_CMD_MODUNLOAD MODUNLOAD Un-Load a module - MODLIST List loaded modules +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! @@ -5857,7 +5941,28 @@ OPER_HELP_MODLIST # 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 @@ -5868,14 +5973,7 @@ BOT_HELP informacion sobre un comando especifico, tipea /msg %S HELP comando. - BOTLIST Lista bots disponibles - ASSIGN Asigna un bot a un canal - SET Configura opciones de bots - KICK Configura kickers - BADWORDS Mantiene lista de bad words - - Otros comandos: ACT INFO SAY UNASSIGN - +BOT_HELP_FOOTER El bot entrara a un canal cuando quiera que hayan %d usuario(s) en el. @@ -6148,18 +6246,10 @@ BOT_HELP_ACT Hace al bot hacer el equivalente del comando "/me" en el canal dado usando el texto dado. -BOT_SERVADMIN_HELP - - El siguiente comando esta disponible a administradores - de Servicios: - - BOT Mantiene la lista de bots de la red - BOT_SERVADMIN_HELP_BOT Sintaxis: BOT ADD nick usuario host real BOT CHANGE nick-ant nick-nue [usuario [host [real]]] BOT DEL nick - BOT LIST Permite a los administradores de Servicios crear, modificar y borrar bots que usuarios podran usar en sus propios @@ -6172,8 +6262,6 @@ BOT_SERVADMIN_HELP_BOT o nombre real de un bot sin tener que borrarlo (y la informacion asociada a el). BOT DEL remueve el bot dado de la lista de bots. - BOT LIST es un alias de BOTLIST y solo lista - todos los bots disponibles en la red. Nota:: no puedes crear un bot que tenga un nick que ya este registrado. Si un usuario no registrado esta usando @@ -6293,22 +6381,34 @@ HOST_LIST_KEY_FOOTER # HostServ Help messages # ########################################################################### -HOST_HELP - Comandos para %S: +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_OPER_HELP - Comandos disponibles solo para operadores de servicios: +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_HELP + Comandos para %S: + +HOST_OPER_HELP + not used. HOST_ADMIN_HELP - Comandos disponibles solo para administradores de servicios: - LIST Muestra uno o mas vhosts. + not used. HOST_HELP_ON Sintaxis: ON @@ -1924,7 +1924,7 @@ BOT_SEEN_NEVER Je n'ai jamais vu %s sur ce channel. BOT_SEEN_UNKNOWN Je ne sais pas qui est %s. - + # BOT responses BOT_BOT_SYNTAX BOT ADD nick user host real @@ -2901,7 +2901,7 @@ OPER_MODULE_UNLOAD_SYNTAX OPER_MODULE_LIST_HEADER Current Module list: OPER_MODULE_LIST - Module: %s [%s] + Module: %s [%s] [%s] OPER_MODULE_LIST_FOOTER %d Modules loaded. OPER_MODULE_INFO_LIST @@ -3308,29 +3308,68 @@ HELP_HELP_HOST # 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 - %S vous permet d'enregistrer un nick et d'empêcher les - autres de l'utiliser. Les commandes suivantes - permettent l'enregistrement et la gestion des nicks; pour - les utiliser, tapez /msg %S commande. Pour plus - d'informations sur une certaine commande, tapez - /msg %S HELP commande. - +NICK_HELP_CMD_REGISTER REGISTER Enregistre un nick +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_DROP DROP Annule l'enregistrement d'un nick +NICK_HELP_CMD_RECOVER RECOVER Change le nick d'un utilisateur qui a pris votre nick +NICK_HELP_CMD_RELEASE RELEASE Pour reprendre la tutelle de votre nick après un RECOVER +NICK_HELP_CMD_SENDPASS SENDPASS A utiliser en cas de perte de mot de passe +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 Retrouve le mot de passe pour un nick + (uniquement si l'encryption est désactivée) +NICK_HELP_CMD_GETEMAIL + GETEMAIL Matches and returns all users that registered using given email +NICK_HELP_CMD_FORBID + FORBID Empêche l'utilisation d'un nick +NICK_HELP_CMD_SUSPEND + SUSPEND Suspend a given nick +NICK_HELP_CMD_UNSUSPEND + UNSUSPEND Unsuspend a given nick + +NICK_HELP + %S vous permet d'enregistrer un nick et d'empêcher les + autres de l'utiliser. Les commandes suivantes + permettent l'enregistrement et la gestion des nicks; pour + les utiliser, tapez /msg %S commande. Pour plus + d'informations sur une certaine commande, tapez + /msg %S HELP commande. - Autres commandes: GHOST, INFO, GLIST, LIST, LOGOUT, STATUS - +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 @@ -3750,13 +3789,6 @@ NICK_HELP_SENDPASS activée. NICK_SERVADMIN_HELP - - Les commandes suivantes sont réservées aux Services admins: - - GETPASS Retrouve le mot de passe pour un nick - (uniquement si l'encryption est désactivée) - FORBID Empêche l'utilisation d'un nick - Les Services admins peuvent également effacer n'importe quel nick sans avoir besoin de s'identifier pour le nick, et peuvent voir l'access list pour n'importe kel nick @@ -3921,54 +3953,100 @@ NICK_SERVADMIN_HELP_UNSUSPEND # ChanServ help messages # ########################################################################### - -CHAN_HELP - %S vous permet d'enregistrer et de contrôler divers - aspects des channels. %S empêche souvent de malicieux - utilisateurs de faire des "take overs" sur les channels - en limitant ceux qui sont autorisés à être channel - operator. Les commandes disponibles sont listées ci-dessous; - pour les utiliser, tapez /msg %S command. Pour plus - d'informations sur une commande spécifique, tapez - /msg %S HELP command. - +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 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 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 - - Autres commandes: BAN, CLEAR, DEOP, DEVOICE, GETKEY, INFO, - INVITE, KICK, LIST, LOGOUT, OP, TOPIC, - UNBAN, VOICE, VOP - -CHAN_HELP_UNREAL - - Ces commandes sont également disponibles sur ce réseau: - DEHALFOP, DEOWNER, DEPROTECT, HALFOP, HOP, OWNER, - PROTECT - -CHAN_HELP_ULTIMATE3 - - Ces commandes sont également disponibles sur ce réseau: - DEHALFOP, HALFOP, HOP, ADMIN, DEADMIN +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_IRCD_HALFOP - - These commands are also available on this network: - DEHALFOP, HALFOP, HOP - -CHAN_HELP_IRCD_PROTECT +CHAN_HELP + %S vous permet d'enregistrer et de contrôler divers + aspects des channels. %S empêche souvent de malicieux + utilisateurs de faire des "take overs" sur les channels + en limitant ceux qui sont autorisés à être channel + operator. Les commandes disponibles sont listées ci-dessous; + pour les utiliser, tapez /msg %S command. Pour plus + d'informations sur une commande spécifique, tapez + /msg %S HELP command. + - These commands are also available on this network: - DEPROTECT, PROTECT - CHAN_HELP_EXPIRES Notez que tout channel non utilisé pendant %d jours @@ -4829,18 +4907,6 @@ CHAN_HELP_SENDPASS CHAN_SERVADMIN_HELP - Les commandes suivantes sont disponibles pour les Services - admins: - - GETPASS Retrouve le mot de passe du propriétaire pour - un channel (seulement si l'encryption - est désactivée) - FORBID Empêche un channel d'être utilisé - STATUS Retourne le level d'accès courant d'un - utilisateur sur un channel - CLIST Liste les channels dont un utilisateur est - le propriétaire - Les Services admins peuvent aussi effacer tout channel sans avoir besoin de s'identifier avec un mot de pass, et peuvent voir l'access, AKICK, et level lists de tout channel. @@ -4964,7 +5030,30 @@ CHAN_SERVADMIN_HELP_STATUS # ########################################################################### -MEMO_HELP +MEMO_HELP_CMD_SEND + SEND Envoie un memo à un nick ou un channel +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 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 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 @@ -4974,20 +5063,11 @@ MEMO_HELP Les commandes de %S sont: - SEND Envoie un memo à un nick ou un channel - CANCEL Annule le dernier memo que vous avez envoyé - LIST Liste vos memos - READ Lit un ou des memos - DEL Efface un ou des memos - SET Définit des options relatifs aux memos - INFO Displays information about your memos MEMO_HELP_ADMIN - SENDALL Send a memo to all registered users - + not used. MEMO_HELP_OPER - STAFF Send a memo to all opers/admins - + not used. MEMO_HELP_FOOTER Tapez /msg %S HELP commande pour de l'aide sur @@ -5202,86 +5282,93 @@ MEMO_HELP_CHECK # ########################################################################### -OPER_HELP - Commandes %S: +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 LIST Liste tous les opérateurs des Services - ADMIN LIST Liste tous les administrateurs des Services +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 Display Services staff and online status - -OPER_HELP_OPER_CMD - Commandes réservées aux opérateurs et administrateurs des Services: +OPER_HELP_CMD_MODE MODE Change les modes d'un channel +OPER_HELP_CMD_KICK KICK Expulse un utilisateur d'un channel +OPER_HELP_CMD_CLEARMODES CLEARMODES Supprime tous les modes d'un channel +OPER_HELP_CMD_KILLCLONES KILLCLONES Déconnecte tous les utilisateurs ayant un - certain hostname + certain hostname +OPER_HELP_CMD_AKILL AKILL Contrôle la liste des AKILLs - -OPER_HELP_OPER_CMD_EXTRA - Following commands are also available - -OPER_HELP_OPER_CMD_SGLINE +OPER_HELP_CMD_SGLINE SGLINE Contrôle la liste des SGLINEs - -OPER_HELP_OPER_CMD_SQLINE +OPER_HELP_CMD_SQLINE SQLINE Contrôle la liste des SQLINEs - -OPER_HELP_OPER_CMD_SZLINE +OPER_HELP_CMD_SZLINE SZLINE Contrôle la liste des SZLINEs - - -OPER_HELP_ADMIN_CMD - Commandes réservées aux administrateurs des Services: - OPER Modifie la liste des opérateurs des Services +OPER_HELP_CMD_CHANLIST CHANLIST Liste tous les channels +OPER_HELP_CMD_USERLIST USERLIST Liste tous les utilisateurs +OPER_HELP_CMD_LOGONNEWS LOGONNEWS Définit les messages affichés aux utilisateurs - à la connexion + à la connexion +OPER_HELP_CMD_RANDOMNEWS RANDOMNEWS Définit les messages affichés aléatoirement - aux utilisateurs à la connexion + aux utilisateurs à la connexion +OPER_HELP_CMD_OPERNEWS OPERNEWS Définit les messages affichés aux utilisateurs - qui deviennent IRCops + 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 - CACHE Liste le cache de noms d'hôte utilisé par le - détecteur de proxy + session +OPER_HELP_CMD_NOOP NOOP Supprime temporairement toutes les O:lines - d'un serveur + 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. + à être sauvegardées immédiatement. +OPER_HELP_CMD_RESTART RESTART Sauvegarde les bases de données et relance les - Services. + Services. +OPER_HELP_CMD_QUIT QUIT Arrête les Services sans sauvegarde +OPER_HELP_CMD_SHUTDOWN SHUTDOWN Arrête les Services avec sauvegarde - - Commandes réservées aux super-utilisateurs des Services: - ADMIN Modifie la liste des administrateurs des Services - -OPER_HELP_ADMIN_CMD_EXTRA - Following commands are also available to Service Admins - -OPER_HELP_ADMIN_CMD_OLINE +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 Donne les flags d'un Oper à un utilisateur - -OPER_HELP_ADMIN_CMD_UMODE +OPER_HELP_CMD_UMODE UMODE Change un mode d'un utilisateur - -OPER_HELP_ADMIN_CMD_SVSNICK +OPER_HELP_CMD_SVSNICK SVSNICK Forcefully change a user's nickname - -OPER_HELP_ROOT_CMD - Commands available to Serivces Roots only: +OPER_HELP_CMD_MODLOAD MODLOAD Load a module +OPER_HELP_CMD_MODUNLOAD MODUNLOAD Un-Load a module - MODLIST List loaded modules +OPER_HELP_CMD_MODINFO MODINFO Info about a loaded module +OPER_HELP_CMD_MODLIST + MODLIST List loaded modules + +OPER_HELP + Commandes %S: OPER_HELP_LOGGED Remarque: Toutes les commandes envoyées à %S sont enregistrées! @@ -5900,7 +5987,28 @@ OPER_HELP_MODLIST # BotServ help messages # ########################################################################### - + +BOT_HELP_CMD_BOTLIST + BOTLIST Liste les bots disponibles +BOT_HELP_CMD_ASSIGN + ASSIGN Attribue un bot à un channel +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 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 Gère la liste des bots du réseau + BOT_HELP %S vous permet d'avoir un bot sur votre channel. Il a été conçu pour les utilisateurs qui ne @@ -5911,14 +6019,7 @@ BOT_HELP /msg %S command. Pour plus d'information sur une commande spécifique, tapez /msg %S HELP command. - BOTLIST Liste les bots disponibles - ASSIGN Attribue un bot à un channel - SET Configure les options du bot - KICK Configure les kickers - BADWORDS Gère la liste des mots interdits - - Autres commandes: ACT INFO SAY UNASSIGN - +BOT_HELP_FOOTER Le bot joindra un channel dès qu'il y aura au moins %d utilisateurs dessus. @@ -6206,17 +6307,10 @@ BOT_HELP_ACT Fait faire au bot l'équivalent d'une commande "/me" sur le channel donné avec le texte donné. -BOT_SERVADMIN_HELP - - La commande suivante est disponible pour les Services admins: - - BOT Gère la liste des bots du réseau - BOT_SERVADMIN_HELP_BOT Syntax: BOT ADD nick user host real BOT CHANGE oldnick newnick [user [host [real]]] BOT DEL nick - BOT LIST Permet aux Services admins de créer, modifier, et supprimer les bots que les utilisateurs pourront @@ -6229,8 +6323,6 @@ BOT_SERVADMIN_HELP_BOT ou realname d'un bot tout en conservant les données qui lui sont associées. BOT DEL supprime le bot donné de la liste des bots. - BOT LIST est un alias de BOTLIST qui liste tous - les bots disponibles sur le réseau. Note: si vous créez un bot ayant un nick enregistré avec NickServ, il sera effacé. De plus, si un utilisateur @@ -6349,21 +6441,30 @@ HOST_LIST_KEY_FOOTER # HostServ Help messages # ########################################################################### -HOST_HELP - %S commandes: +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 vhost d'un group - -HOST_OPER_HELP - Commandes pour les ServicesOpérateurs seulement: +HOST_HELP_CMD_SET SET Configure la vhost d'un pseudo +HOST_HELP_CMD_SETALL SETALL Configure la vhost pour tous les nicks d'un groupe +HOST_HELP_CMD_DEL DEL Supprime la vhost d'un pseudo +HOST_HELP_CMD_DELALL + DELALL Delete the vhost for all nicks in a group +HOST_HELP_CMD_LIST LIST Recherche une vhost +HOST_HELP + %S commandes: + +HOST_OPER_HELP + not used. HOST_ADMIN_HELP - Commandes pour les ServicesAdmins seulement: + not used. HOST_HELP_ON Syntaxe: ON @@ -1913,7 +1913,7 @@ BOT_SEEN_NEVER Äåí Ý÷ù äåé êáíÝíáí %s óå áõôü ôï êáíÜëé. BOT_SEEN_UNKNOWN Äåí îÝñù êáíÝíáí %s ðïéïò åßíáé. - + # BOT responses BOT_BOT_SYNTAX BOT ADD nick user host real @@ -2877,7 +2877,7 @@ OPER_MODULE_UNLOAD_SYNTAX OPER_MODULE_LIST_HEADER Current Module list: OPER_MODULE_LIST - Module: %s [%s] + Module: %s [%s] [%s] OPER_MODULE_LIST_FOOTER %d Modules loaded. OPER_MODULE_INFO_LIST @@ -3263,27 +3263,67 @@ HELP_HELP_HOST # 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 - O %S óáò åðéôñÝðåé íá êáôï÷õñþóåôå Ýíá øåõäþíõìï, - åìðïäßæïíôáò Ýôóé Üëëïõò ÷ñÞóôåò íá ôï ÷ñçóéìïðïéïýí. - Ïé ðáñáêÜôù åíôïëÝò, åðéôñÝðïõí ôçí êáôï÷ýñùóç êáé ôç äéá÷åßñçóç ôùí - øåõäùíýìùí; ãéá íá ÷ñçóéìïðïéÞóåôå áõôÜ, ãñÜøôå /msg %S ^_command^_. - Ãéá ðåñéóóüôåñåò ðëçñïöïñßåò óå ìéá óõãêåêñéìÝíç åíôïëÞ,ãñÜøôå - /msg %S HELP ^_command^_. - +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_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 óáò åðéôñÝðåé íá êáôï÷õñþóåôå Ýíá øåõäþíõìï, + åìðïäßæïíôáò Ýôóé Üëëïõò ÷ñÞóôåò íá ôï ÷ñçóéìïðïéïýí. + Ïé ðáñáêÜôù åíôïëÝò, åðéôñÝðïõí ôçí êáôï÷ýñùóç êáé ôç äéá÷åßñçóç ôùí + øåõäùíýìùí; ãéá íá ÷ñçóéìïðïéÞóåôå áõôÜ, ãñÜøôå /msg %S ^_command^_. + Ãéá ðåñéóóüôåñåò ðëçñïöïñßåò óå ìéá óõãêåêñéìÝíç åíôïëÞ,ãñÜøôå + /msg %S HELP ^_command^_. - ¢ëëåò åíôïëÝò: GHOST, GLIST, INFO, LIST, LOGOUT, STATUS - +NICK_HELP_FOOTER ÐÁÑÁÔÇÑÇÓÇ: ÁõôÞ ç õðçñåóßá óêïðåýåé íá ðáñÝ÷åé Ýíá ôñüðï óôïõò ÷ñÞóôåò ôïõ äéêôýïõ, íá äéáóöáëßóïõí üôé ç ôáõôüôçôÜ ôïõò äåí åêôßèåôáé. ÄÅÍ õößóôáôáé ãéá íá åîõðçñåôåß Þ íá @@ -3712,14 +3752,6 @@ NICK_HELP_SENDPASS ÁõôÞ ç åíôïëÞ åßíáé áäýíáôç áí Ý÷åé åíåñãïðïéçèåß ç êùäéêïðïßçóç ôùí êùäéêþí. NICK_SERVADMIN_HELP - - Ïé ðáñáêÜôù åíôïëÝò åßíáé äéáèÝóéìåò ãéá ôïõò (åðéêåöáëåßò) Services admins: - - GETPASS Åìöáíßæåé ôïí êùäéêü ãéá ôï óõãêåêñéìÝíï øåõäþíõìï - (ìüíï áí ç êùäéêïðïßçóç åßíáé áíåíåñãÞ) - FORBID ÊáôáóôÝëåé Ýíá øåõäþíõìï,äçë ôï êÜíåé íá ìçí ôï ÷ñçóéìïðïéåß - êáíåßò,üðïéïò ôï ðÜñåé Ý÷åé kill - Ïé Services admins (åðéêåöáëåßò) ìðïñïýí íá äéáãñÜøïõí Ýíá øåõäþíõìï ÷ùñßò íá ÷ñåéáóôåß íá êÜíïõí åíôïëÞ áíáãíþñéóçò êáé êáí áëëáãÞ øåõäþíõìïõ, êáé ìðïñïýí íá äïõí ôçí ëßóôá access ãéá êÜèå øåõäþíõìï (/msg %S ACCESS LIST nick). @@ -3873,54 +3905,99 @@ NICK_SERVADMIN_HELP_UNSUSPEND # ChanServ help messages # ########################################################################### - -CHAN_HELP - Ï %S óáò åðéôñÝðåé íá êáôï÷õñþóåôå êáé íá ÷åéñéóôåßôå - äéÜöïñåò ëåéôïõñãßåò ôùí êáíáëéþí. Ï %S ìðïñåß óõíÞèùò - íá áðïôñÝøåé êáêüâïõëïõò ÷ñÞóôåò íá êÜíïõí "êáôÜëçøç" óå - êáíÜëéá, ìå ôï íá ðåñéïñßæåé ôéò áñìïäéüôçôåò ôùí - äéá÷åéñéóôþí êáíáëéþí. Ïé äéáèÝóéìåò åíôïëÝò, âñßóêïíôáé - ðáñáêÜôù. Ãéá íá ôéò ÷ñçóéìïðïéÞóåôå, ðëçêôñïëïãÞóôå - /msg %S åíôïëÞ. Ãéá ðåñéóóüôåñåò ðëçñïöïñßåò óå ìßá - óõãêåêñéìÝíç åíôïëÞ, ðëçêôñïëïãÞóôå /msg %S HELP åíôïëÞ. - +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 ÓôÝëíåé ôïí ÷áìÝíï êùäéêü ôïõ êáíáëéïý - - ¢ëëåò åíôïëÝò: BAN, CLEAR, DEOP, DEVOICE, GETKEY, INFO, - INVITE, KICK, LIST, LOGOUT, OP, TOPIC, - UNBAN, VOICE, VOP +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_UNREAL - - ÁõôÝò ïé åíôïëÝò åßíáé äéáèÝóéìåò áå áõôü ôï äßêôõï: - DEHALFOP, DEOWNER, DEPROTECT, HALFOP, HOP, OWNER, - PROTECT - -CHAN_HELP_ULTIMATE3 - - ÁõôÝò ïé åíôïëÝò åßíáé äéáèÝóéìåò áå áõôü ôï äßêôõï: - DEHALFOP, HALFOP, HOP, ADMIN, DEADMIN - -CHAN_HELP_IRCD_HALFOP - - These commands are also available on this network: - DEHALFOP, HALFOP, HOP - -CHAN_HELP_IRCD_PROTECT +CHAN_HELP + Ï %S óáò åðéôñÝðåé íá êáôï÷õñþóåôå êáé íá ÷åéñéóôåßôå + äéÜöïñåò ëåéôïõñãßåò ôùí êáíáëéþí. Ï %S ìðïñåß óõíÞèùò + íá áðïôñÝøåé êáêüâïõëïõò ÷ñÞóôåò íá êÜíïõí "êáôÜëçøç" óå + êáíÜëéá, ìå ôï íá ðåñéïñßæåé ôéò áñìïäéüôçôåò ôùí + äéá÷åéñéóôþí êáíáëéþí. Ïé äéáèÝóéìåò åíôïëÝò, âñßóêïíôáé + ðáñáêÜôù. Ãéá íá ôéò ÷ñçóéìïðïéÞóåôå, ðëçêôñïëïãÞóôå + /msg %S åíôïëÞ. Ãéá ðåñéóóüôåñåò ðëçñïöïñßåò óå ìßá + óõãêåêñéìÝíç åíôïëÞ, ðëçêôñïëïãÞóôå /msg %S HELP åíôïëÞ. + - These commands are also available on this network: - DEPROTECT, PROTECT - CHAN_HELP_EXPIRES Óçìåßùóç: ïðïéïäÞðïôå êáíÜëé äåí ÷ñçóéìïðïéåßôáé ãéá %d ìÝñåò @@ -4736,15 +4813,6 @@ CHAN_HELP_SENDPASS CHAN_SERVADMIN_HELP - Ïé åðüìåíåò åíôïëÝò åßíáé ìüíï ãéá Services admins: - - GETPASS ÂëÝðåéò ôïí êùäéêü ôïõ óõãêåêñéìÝíïõ êáíáëéïý - (ìüíï áí ç êùäéêïðïßçóç åßíáé áðåíåñãïðïéçìÝíç) - FORBID ÊáôáóôÝëåé ôï êáíÜëé,äåí ìðïñåß íá ôï ÷ñçóéìïðïéÞóç êáíåßò - STATUS ÅðéóôñÝöåé ôçí óõãêåêñéìÝíç access level ôïõ ÷ñÞóôç óôï - êáíÜëé - CLIST Åìöáíßæåé ôá êáíÜëéá ðïõ åßíáé founder Ýíá øåõäþíõìï - Ïé Services admins ìðïñïýí íá äéáãñÜøïõí ïðïéïäÞðïôå êáíÜëé, ÷ùñßò íá êÜíïõí åíôïëÞ áíáãíþñéóçò ìÝóù êùäéêïý, ìðïñïýí íá äïýí ôçí access, AKICK, êáé ôá level ïðïéïõäÞðïôå êáíáëéïý. @@ -4865,7 +4933,30 @@ CHAN_SERVADMIN_HELP_STATUS # ########################################################################### -MEMO_HELP +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 íá óôÝëíïõí ìéêñÜ ãñáðôÜ ìçíýìáôá óå Üëëïõò ÷ñÞóôåò ôïõ äéêôýïõ (åßôå âñßóêïíôáé óõíäåäåìÝíïé åêåßíç ôç óôéãìÞ, @@ -4875,19 +4966,11 @@ MEMO_HELP Ïé åíôïëÝò ôïõ %S åßíáé: - SEND ÓôÝëíåé Ýíá ìÞíõìá óå Ýíá øåõäþíõìï Þ Ýíá êáíÜëé - CANCEL Áêõñþíåé ôï ôåëåõôáßï ìÞíõìá ðïõ óôÝëíåôå - LIST Åìöáíßæåé ëßóôá ìå ôá ìçíýìáôá óáò - READ ÄéáâÜæåé Ýíá Þ ðïëëÜ ìçíýìáôá - DEL ÄéáãñÜöåé Ýíá Þ ðïëëÜ ìçíýìáôá - SET ÁëëÜæåé ôéò åðéëïãÝò ôùí ìçíõìÜôùí MEMO_HELP_ADMIN - SENDALL Send a memo to all registered users - + not used. MEMO_HELP_OPER - STAFF Send a memo to all opers/admins - + not used. MEMO_HELP_FOOTER ÃñÜøôå /msg %S HELP åíôïëÞ ãéá âïÞèåéá óå @@ -5095,82 +5178,91 @@ MEMO_HELP_CHECK # ########################################################################### -OPER_HELP - Ïé åíôïëÝò ôïõ %S åßíáé:: +OPER_HELP_CMD_GLOBAL GLOBAL ÓôÝëíåé ìÞíõìá óå üëïõò ôïõò ÷ñÞóôåò +OPER_HELP_CMD_STATS STATS Äåß÷íåé óôáôéóôéêÜ ó÷åôéêÜ ìå ôá Services êáé ôï äßêôõï - OPER LIST Åìöáíßæåé üëïõò ôïõò Services operators - ADMIN LIST Åìöáíßæåé üëïõò ôïõò Services admins +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_OPER_CMD - ÄéáèÝóéìåò åíôïëÝò ãéá ôïõò Services operators êáé admins ìüíï: +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_OPER_CMD_EXTRA - Following commands are also available - -OPER_HELP_OPER_CMD_SGLINE +OPER_HELP_CMD_SGLINE SGLINE ÐñïóèÝôåé ip óôçí ëßóôá SGLINE - -OPER_HELP_OPER_CMD_SQLINE +OPER_HELP_CMD_SQLINE SQLINE ÐñïóèÝôåé ip óôçí ëßóôá SQLINE - -OPER_HELP_OPER_CMD_SZLINE +OPER_HELP_CMD_SZLINE SZLINE ÐñïóèÝôåé ip óôçí ëßóôá SZLINE - -OPER_HELP_ADMIN_CMD - ÄéáèÝóéìåò åíôïëÝò ãéá ôïõò Services admins ìüíï: - OPER ÁëëÜæåé ôçí ëßóôá ôùí Services operator +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 - CACHE ÂëÝðåéò ôçí ëßóôá ìå ôï hostname cache ðïõ ÷ñçóéìïðïéïýíôáé - áðü ôïí proxy detector +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 ìå ôáõôü÷ñïíï ãñÜøéìï ôùí áëëáãþí - - ÅíôïëÝò äéáèÝóéìåò ãéá ôïõò Services super-÷ñÞóôç ìüíï: - ADMIN ÁëëÜæåé ôçí ëßóôá ôùí Services admin - -OPER_HELP_ADMIN_CMD_EXTRA - Following commands are also available to Service Admins - -OPER_HELP_ADMIN_CMD_OLINE +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_ADMIN_CMD_UMODE +OPER_HELP_CMD_UMODE UMODE Change a user's modes - -OPER_HELP_ADMIN_CMD_SVSNICK +OPER_HELP_CMD_SVSNICK SVSNICK Forcefully change a user's nickname - -OPER_HELP_ROOT_CMD - Commands available to Serivces Roots only: +OPER_HELP_CMD_MODLOAD MODLOAD Load a module +OPER_HELP_CMD_MODUNLOAD MODUNLOAD Un-Load a module - MODLIST List loaded modules +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 êáé êáôáãñÜöïíôáé! @@ -5770,7 +5862,28 @@ OPER_HELP_MODLIST # 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 óôï äéêü óïõ êáíÜëé. ÁõôÞ ç õðçñåóéá Ý÷åé äçìéïõñãçèåß ãéá ôïõò ÷ñÞóôåò ðïõ äåí ìðïñïýí @@ -5780,14 +5893,7 @@ BOT_HELP /msg %S command.Ãéá ðåñéóóüôåñåò ðëçñïöïñßåò óå óõãêåêñéìÝíåò åíôïëÝò ãñÜøôå /msg %S HELP command. - BOTLIST Ëßóôá ìå äéáèÝóéìá bots - ASSIGN ÆçôÜôå áðü ôï bot íá Ýñèåé óôï êáíÜëé óáò - SET ÁëëÜæåôå ôéò åðéëïãÝò ôïõ bot - KICK Ñõèìßæåôáé ôé íá êÜíåé óôïõò "Üôáêôïõò ÷ñÞóôåò" - BADWORDS ÁëëÜæåôå ôçí ëßóôá êáêþí ëÝîåùí - - ¢ëëåò åíôïëÝò: ACT INFO SAY UNASSIGN - +BOT_HELP_FOOTER Ôï Bot èá ìðåß óôï êáíÜëé üôáí åßíáé ôïõëÜ÷éóôïí ìÝóá %d ÷ñÞóôç(åò). @@ -6051,17 +6157,11 @@ BOT_HELP_ACT ÊÜíåé ôï bot íá åíåñãåß,äçë íá åêôåëåß åíôïëÞ "/me" åìöáíßæïíôáò ôï ìÞíõìá óôï áíÜëïãï êáíÜëé. -BOT_SERVADMIN_HELP - - Ç áêüëïõèç åíôïëÞ åßíáé ìüíï ãéá ôïõò Services admins: - - BOT ÁëëÜæåé ôçí ëßóôá ôùí bot ôïõ äéêôýïõ BOT_SERVADMIN_HELP_BOT Óýíôáîç: BOT ADD øåõäþíõìï ID host ðñáãìáôéêü üíïìá BOT CHANGE ðáëéü-øåõäþíõìïick íÝï-øåõäþíõìï [ID [host [ðñáãìáôéêü üíïìá]]] BOT DEL øåõäþíõìï - BOT LIST ÅðéôñÝðåé ìüíï óôïõò Services admins íá äçìéïõñãÞóïõí, áëëÜîïõí, êáé íá óâÞóïõí ôá bots óôá ïðïßá ïé ÷ñÞóôåò èá ìðïñïýí íá ÷ñçóéìïðïéÞóïõí @@ -6074,8 +6174,6 @@ BOT_SERVADMIN_HELP_BOT Þ ðñáãìáôéêü üíïìá ôïõ bot ÷ùñßò íá ÷ñåéÜæåôáé íá ôï óâÞóåôå (êáé üëåò ïé ñõèìßóåéò èá ìåßíïõí). Ç åíôïëÞ BOT DEL áöáéñåß ôï bot áðü ôçí ëßóôá bot. - Ç åíôïëÞ BOT LIST åßíáé ßäéï ìå ôçí BOTLIST êáé áðëÜ äåß÷íåé üëç ôçí - ëßóôá ôùí bots ðïõ õðÜñ÷ïõí óôï äßêôõï. Óçìåßùóç: áí öôéÜîåéò Ýíá bot ðïõ Ý÷åé øåõäþíõìï êáôï÷õñùìÝíï èá äéáãñáöåß. Åðßóçò, áí Ýíáò ÷ñÞóôçò ÷ñçóéìïðïéåß Þäç ôï øåõäþíõìï @@ -6190,20 +6288,38 @@ HOST_LIST_KEY_FOOTER # HostServ Help messages # ########################################################################### -HOST_HELP - %S commands: +HOST_HELP_CMD_ON ON Activates your assigned vhost + +HOST_HELP_CMD_OFF OFF Deactivates your assigned vhost -HOST_OPER_HELP - Commands available to services operators only: +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_HELP + %S commands: + +HOST_OPER_HELP + not used. + HOST_ADMIN_HELP - Commands available to services admins only: + not used. HOST_HELP_ON Syntax: ON diff --git a/lang/hun.l b/lang/hun.l index 495eae47f..cbed0d588 100644 --- a/lang/hun.l +++ b/lang/hun.l @@ -2820,7 +2820,7 @@ OPER_MODULE_UNLOAD_SYNTAX OPER_MODULE_LIST_HEADER Jelenlegi Modul lista: OPER_MODULE_LIST - Modul: %s [%s] + Modul: %s [%s] [%s] OPER_MODULE_LIST_FOOTER %d Modul betöltve. OPER_MODULE_INFO_LIST @@ -3201,27 +3201,67 @@ HELP_HELP_HOST # NickServ segítség üzenetei # ########################################################### - -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: /msg %S parancs, lásd még a - /msg %S HELP parancs. - +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_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: /msg %S parancs, lásd még a + /msg %S HELP parancs. - Egyéb parancsok: GHOST, ALIST, GLIST, INFO, LIST, LOGOUT, STATUS - +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 @@ -3613,15 +3653,6 @@ NICK_HELP_SENDPASS Parancs nem elérhetõ, ha az encryption használatban van. NICK_SERVADMIN_HELP - - Következõ parancsokat használhatják a szervíz adminok: - - GETPASS Kiirja a jeszavát a nicknévnek - (encryption esetén nem használható) - GETEMAIL Kiírja az ilyen e-mail címmel regisztrált - felhasználókat - FORBID Megelõzi, hogy a nicknév regisztrált legyen - 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. (/msg %S ACCESS LIST nick) @@ -3783,53 +3814,98 @@ NICK_SERVADMIN_HELP_UNSUSPEND # ChanServ help messages # ########################################################################### - -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: - /msg %S parancs, ha több információ kell a paranccsal - kapcsolatban, akkor írd be: /msg %S HELP parancs. - +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 - Egyéb parancsok: BAN, CLEAR, DEOP, DEVOICE, GETKEY, INFO - INVITE, KICK, LIST, LOGOUT, OP, TOPIC, - UNBAN, VOICE, VOP - -CHAN_HELP_UNREAL - - Ezek a parancsok is elérhetõk ezen a hálózaton: - DEHALFOP, DEOWNER, DEPROTECT, HALFOP, HOP, OWNER, - PROTECT - -CHAN_HELP_ULTIMATE3 - - Ezek a parancsok is elérhetõk ezen a hálózaton: - DEHALFOP, HALFOP, HOP, ADMIN, DEADMIN - -CHAN_HELP_IRCD_HALFOP +CHAN_HELP - These commands are also available on this network: - DEHALFOP, HALFOP, HOP - -CHAN_HELP_IRCD_PROTECT + %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: + /msg %S parancs, ha több információ kell a paranccsal + kapcsolatban, akkor írd be: /msg %S HELP parancs. + - These commands are also available on this network: - DEPROTECT, PROTECT - CHAN_HELP_EXPIRES Megjegyzés: azok a csatornák, amelyeket nem használnak %d @@ -4669,17 +4745,6 @@ CHAN_HELP_SENDPASS CHAN_SERVADMIN_HELP - A következõ parancsok Szervíz adminok használhatják: - - GETPASS Megadja a founder jelszót a csatornán - (Csak, ha az encryption nincs használatban) - FORBID Megakadályozza a szoba használatát - SUSPEND Felfüggeszti a szoba használatát de - megõrzi az adatokat és beállításokat. - UNSUSPEND Törli a suspendet a csatornáról. - STATUS Kiírja a felhasználó aktuális hozzáférési - szintjét a megadott csatornán - 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. @@ -4796,32 +4861,43 @@ CHAN_SERVADMIN_HELP_STATUS # MemoServ help üzenetek # ########################################################### - -MEMO_HELP - %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_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_ADMIN +MEMO_HELP_CMD_SENDALL SENDALL Memo küldése minden regisztrált felhasználónak. - -MEMO_HELP_OPER +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 @@ -5005,83 +5081,89 @@ MEMO_HELP_CHECK # OperServ help üzenetek # ########################################################### - -OPER_HELP - %S parancsok: + +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 LIST Listázza az öszzes szerviz operátort - ADMIN LIST Listázza az öszzes szerviz admint +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_OPER_CMD - Ezek a Parancsok szervíz adminok/oprátorok részére elérhetõek: +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_OPER_CMD_EXTRA - Following commands are also available - -OPER_HELP_OPER_CMD_SGLINE +OPER_HELP_CMD_SGLINE SGLINE Szerkeszti az SGLINE listát - -OPER_HELP_OPER_CMD_SQLINE +OPER_HELP_CMD_SQLINE SQLINE Szerkeszti az SQLINE listát - -OPER_HELP_OPER_CMD_SZLINE +OPER_HELP_CMD_SZLINE SZLINE Szerkeszti az SZLINE listát - -OPER_HELP_ADMIN_CMD - Ezek a Parancsok a szervíz admin részére elérhetõek: - - OPER Módosítja a Szervíz operátorok listájá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 + 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 - CACHE Kiírja a hostnév rejtõ usereket a proxy keresõ +OPER_HELP_CMD_NOOP NOOP Ideiglenesen törli az összes O:line-t a szerver - távollétében + 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 + 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 - - Parancs rendelkezésre áll szuper-felhasználó részére: - ADMIN Módosítja a Szervíz admin listát - -OPER_HELP_ADMIN_CMD_EXTRA - Following commands are also available to Service Admins - -OPER_HELP_ADMIN_CMD_OLINE +OPER_HELP_CMD_OLINE OLINE Operflaget ad a biztos felhasználónak - -OPER_HELP_ADMIN_CMD_UMODE +OPER_HELP_CMD_UMODE UMODE Felhasználó módok állítása - -OPER_HELP_ADMIN_CMD_SVSNICK +OPER_HELP_CMD_SVSNICK SVSNICK Megváltoztatja a felhasználó nicknevét - -OPER_HELP_ROOT_CMD - Parancs rendelkezésre áll Szervíz Rootok részére: +OPER_HELP_CMD_MODLOAD MODLOAD Betölti a modult +OPER_HELP_CMD_MODUNLOAD MODUNLOAD Kitölti a modult - MODLIST Listázza a betöltött modulokat +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. @@ -5670,7 +5752,28 @@ OPER_HELP_MODLIST # 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. @@ -5681,14 +5784,7 @@ BOT_HELP Bõvebb információt így kaphatsz az adott parancsról: /msg %S HELP parancs. - BOTLIST Listázza az elérhetõ botokat - ASSIGN Társít egy botot a csatornához - SET Konfigurálja a bot opcióit - KICK Konfigurálja a kirúgásokat - BADWORDS Szerkeszti a tiltott szavak listáját - - Egyéb parancsok: ACT INFO SAY UNASSIGN - +BOT_HELP_FOOTER A Bot akkor fog belépni a csatornára, ha legalább %d felhasználó van bent. @@ -5950,17 +6046,10 @@ BOT_HELP_ACT A bot "/me" akcióval küldi el a megadott szöveget a csatornára. -BOT_SERVADMIN_HELP - - A következõ parancsok csak Szervíz Adminoknak elérhetõek: - - BOT Karbantartja a hálózat botjainak listáját - BOT_SERVADMIN_HELP_BOT Syntax: BOT ADD nick user hoszt valós BOT CHANGE réginick újnick [user [ hoszt [ valós ]]] BOT DEL nick - BOT LIST Lehetõvé teszi a Services adminoknak, hogy létrehozzanak töröljenek, módosítsanak botokat, amiket a userek @@ -5973,8 +6062,6 @@ BOT_SERVADMIN_HELP_BOT 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. - BOT LIST egy alias a BOTLIST parancsra, és csak - listázza a hálózaton elérhetõ botokat. Megjegyzés: ha létrehozol egy botot, egy már regisztrált nickkel, akkor a nick dropolva lesz. Akkor is, ha a user @@ -6082,23 +6169,31 @@ HOST_LIST_KEY_FOOTER # HostServ Help üzenetek # ########################################################### - -HOST_HELP - %S parancsok: +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_OPER_HELP - Parancsok a VHostok beállításához/módosításához: +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_HELP + %S parancsok: + +HOST_OPER_HELP + not used. + HOST_ADMIN_HELP - Ezek a Parancsok csak szervíz adminok által használhatók: + not used. HOST_HELP_ON Syntax: ON @@ -2882,7 +2882,7 @@ OPER_MODULE_UNLOAD_SYNTAX OPER_MODULE_LIST_HEADER Current Module list: OPER_MODULE_LIST - Module: %s [%s] + Module: %s [%s] [%s] OPER_MODULE_LIST_FOOTER %d Modules loaded. OPER_MODULE_INFO_LIST @@ -3287,32 +3287,66 @@ HELP_HELP_HOST # 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 - %S ti permette di "registrare" un nick e di - evitare che gli altri lo usino. I seguenti - comandi permettono la registrazione e il mantenimento - dei nick; per usarli, digita /msg %S comando. - Per maggiori informazioni su un comando specifico, - digita /msg %S HELP comando. - +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 - ALIST Mostra i canali in cui si ha accesso +NICK_HELP_CMD_SET + SET Imposta le opzioni, inclusa la protezione +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 - GROUP Entra in un gruppo - IDENTIFY Ti identifica per il tuo nick +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 - RECOVER Disconnette un altro utente che usa il tuo nick - REGISTER Registra un nick - RELEASE Permette di usare di nuovo il proprio nick dopo un RECOVER - SENDPASS Invia la password del proprio nick via e-mail - SET Imposta le opzioni, inclusa la protezione +NICK_HELP_CMD_STATUS STATUS Indica lo stato di identificazione di un nick +NICK_HELP_CMD_UPDATE + UPDATE Updates your current status, i.e. it checks for new memos +NICK_HELP_CMD_GETPASS + GETPASS Recupera la password di un nick + (solo se la criptazione è disattivata) +NICK_HELP_CMD_GETEMAIL + GETEMAIL Matches and returns all users that registered using given email +NICK_HELP_CMD_FORBID + FORBID Blocca un nick in modo che non venga usato +NICK_HELP_CMD_SUSPEND + SUSPEND Suspend a given nick +NICK_HELP_CMD_UNSUSPEND + UNSUSPEND Unsuspend a given nick + +NICK_HELP + %S ti permette di "registrare" un nick e di + evitare che gli altri lo usino. I seguenti + comandi permettono la registrazione e il mantenimento + dei nick; per usarli, digita /msg %S comando. + Per maggiori informazioni su un comando specifico, + digita /msg %S HELP comando. +NICK_HELP_FOOTER NOTA: Questo servizio è pensato per fornire agli utenti un modo per assicurarsi che loro identità non sia compromessa. @@ -3731,13 +3765,6 @@ NICK_HELP_SENDPASS Questo comando non è utilizzabile quando la criptazione è attiva. NICK_SERVADMIN_HELP - - I seguenti comandi sono disponibili per i Services admin: - - GETPASS Recupera la password di un nick - (solo se la criptazione è disattivata) - FORBID Blocca un nick in modo che non venga usato - I Services admin possono inoltre deregistrare qualsiasi nick senza doversi identificare per quel nick, e possono visualizzare le liste di accesso per qualunque nick (/msg %S ACCESS LIST nick). @@ -3904,68 +3931,97 @@ NICK_SERVADMIN_HELP_UNSUSPEND # ChanServ help messages # ########################################################################### - -CHAN_HELP - %S permette di registrare i canali e di controllarne - vari aspetti. %S può spesso evitare che utenti non - autorizzati prendano il controllo dei canali ("take over") - limitandone l'accesso agli utenti. I comandi disponibili - sono indicati in basso; per usarli, puoi digitare - /msg %S comando. Per avere maggiori informazioni su - un comando specifico, digita /msg %S HELP comando. - +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 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 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 - AOP Modifica la lista degli utenti AOP +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 - DEOP Toglie lo stato di operatore a un utente (-o) +CHAN_HELP_CMD_DEVOICE DEVOICE Toglie lo stato di voice a un utente (-v) - DROP Annulla la registrazione di un canale +CHAN_HELP_CMD_GETKEY GETKEY Recupera la password (chiave) di un canale - IDENTIFY Ti identifica come fondatore 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) - LEVELS Ridefinisce i privilegi dei livelli di accesso +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) - REGISTER Registra un canale - SENDPASS Invia la password del proprio canale via e-mail - SET Imposta le opzioni e le informazioni di canale - SOP Modifica la lista degli utenti SOP +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_UNREAL - - Su questa rete sono inoltre disponibili questi comandi: - DEHALFOP Toglie lo stato di mezzo operatore a un utente (-h) - DEOWNER Toglie lo stato di owner a un utente (-q) - DEPROTECT Toglie lo stato di protezione a un utente (-a) +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 Protects a selected nick on a channel +CHAN_HELP_CMD_DEADMIN + DEADMIN Deprotects a selected nick on a channel +CHAN_HELP_CMD_DEOP + DEOP Toglie lo stato di operatore a un utente (-o) -CHAN_HELP_ULTIMATE3 - - Su questa rete sono inoltre disponibili questi comandi: - DEHALFOP, HALFOP, HOP, ADMIN, DEADMIN - -CHAN_HELP_IRCD_HALFOP - - These commands are also available on this network: - DEHALFOP, HALFOP, HOP - -CHAN_HELP_IRCD_PROTECT +CHAN_HELP + %S permette di registrare i canali e di controllarne + vari aspetti. %S può spesso evitare che utenti non + autorizzati prendano il controllo dei canali ("take over") + limitandone l'accesso agli utenti. I comandi disponibili + sono indicati in basso; per usarli, puoi digitare + /msg %S comando. Per avere maggiori informazioni su + un comando specifico, digita /msg %S HELP comando. + - These commands are also available on this network: - DEPROTECT, PROTECT - CHAN_HELP_EXPIRES Tieni conto che i canali che non vengono utilizzati per %d @@ -4854,14 +4910,6 @@ CHAN_HELP_SENDPASS CHAN_SERVADMIN_HELP - I seguenti comandi sono disponibili soltanto ai Services admin: - - GETPASS Recupera la password di fondatore di un canale - (solo se la criptazione è disattivata) - FORBID Blocca un canale in modo che non venga usato - STATUS Restituisce il livello di accesso corrente di - un utente su un canale - I Services admin possono inoltre deregistrare qualsiasi canale senza che siano identificati con la password, e possono vedere la lista di accesso, la lista AKICK e le liste di configurazione @@ -4986,8 +5034,30 @@ CHAN_SERVADMIN_HELP_STATUS # 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 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 +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(*). @@ -4996,19 +5066,11 @@ MEMO_HELP I comandi di %S sono: - SEND Invia un memo a un nick o a un canale - CANCEL Annulla l'ultimo memo inviato - LIST Mostra la lista dei propri memo - READ Legge uno o più memo - DEL Cancella uno o più memo - SET Imposta le opzioni relative ai memo MEMO_HELP_ADMIN - SENDALL Send a memo to all registered users - + not used. MEMO_HELP_OPER - STAFF Send a memo to all opers/admins - + not used. MEMO_HELP_FOOTER Digita /msg %S HELP comando per maggiori informazioni @@ -5223,80 +5285,89 @@ MEMO_HELP_CHECK # ########################################################################### -OPER_HELP - Comandi di %S: +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 LIST Mostra tutti i Services operator - ADMIN LIST Mostra tutti i Services admin +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 Display Services staff and online status - -OPER_HELP_OPER_CMD - Comandi disponibili solo ai Services operator e admin: +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_OPER_CMD_EXTRA - Following commands are also available - -OPER_HELP_OPER_CMD_SGLINE +OPER_HELP_CMD_SGLINE SGLINE Manipola la lista SGLINE - -OPER_HELP_OPER_CMD_SQLINE +OPER_HELP_CMD_SQLINE SQLINE Manipola la lista SQLINE - -OPER_HELP_OPER_CMD_SZLINE +OPER_HELP_CMD_SZLINE SZLINE Manipola la lista SZLINE - -OPER_HELP_ADMIN_CMD - Comandi disponibili solo ai Services admin: - OPER Modifica la lista dei Services operator +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 + quando si connettono +OPER_HELP_CMD_RANDOMNEWS RANDOMNEWS Definisce i messaggi da mostrare casualmente - agli utenti quando si connettono + 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 - CACHE Mostra gli host nella cache del proxy detector + 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 + 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 - - Comandi disponibili solo al super-user dei Services: - ADMIN Modifica la lista dei Services admin - -OPER_HELP_ADMIN_CMD_EXTRA - Following commands are also available to Service Admins - -OPER_HELP_ADMIN_CMD_OLINE +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 Imposta le operflag di un utente - -OPER_HELP_ADMIN_CMD_UMODE +OPER_HELP_CMD_UMODE UMODE Cambia i modi utente di un utente - -OPER_HELP_ADMIN_CMD_SVSNICK +OPER_HELP_CMD_SVSNICK SVSNICK Forcefully change a user's nickname - -OPER_HELP_ROOT_CMD - Commands available to Serivces Roots only: +OPER_HELP_CMD_MODLOAD MODLOAD Load a module +OPER_HELP_CMD_MODUNLOAD MODUNLOAD Un-Load a module - MODLIST List loaded modules +OPER_HELP_CMD_MODINFO MODINFO Info about a loaded module +OPER_HELP_CMD_MODLIST + MODLIST List loaded modules + +OPER_HELP + Comandi di %S: OPER_HELP_LOGGED Nota: Tutti i comandi inviati a %S sono loggati! @@ -5923,7 +5994,29 @@ OPER_HELP_MODLIST # 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 @@ -5932,16 +6025,7 @@ BOT_HELP Per maggiori informazioni sull'uso di un comando specifico, digita /msg %S HELP comando. - ACT Invia un /me in canale - ASSIGN Assegna un bot a un canale - BADWORDS Gestisce la lista delle parolacce - BOTLIST Mostra la lista dei bot disponibili - INFO Mostra informazioni su un bot o su un canale - KICK Configura i kick - SAY Fa sì che il bot dica qualcosa in canale - SET Imposta le opzioni del bot - UNASSIGN Rimuove il bot da un canale - +BOT_HELP_FOOTER Il bot entrerà in canale quando c'è almeno %d persona. @@ -6208,17 +6292,10 @@ BOT_HELP_ACT Fa sì che il bot faccia in canale l'equivalente di un "/me" utilizzando il testo specificato. -BOT_SERVADMIN_HELP - - Il seguente comando è disponibile ai Services admin: - - BOT Gestisce la lista dei bot disponibili - BOT_SERVADMIN_HELP_BOT Sintassi: BOT ADD nick ident host realname BOT CHANGE vecchionick nuovonick [ident [host [realname]]] BOT DEL nick - BOT LIST Permette ai Services admin di creare, modificare ed eliminare i bot che potranno essere usati @@ -6233,8 +6310,6 @@ BOT_SERVADMIN_HELP_BOT cancellarlo realmente (e senza perderne i dati associati). Il comando BOT DEL rimuove il bot indicato dalla lista dei bot disponibili. - Il bot BOT LIST è un alias di BOTLIST e serve semplicemente - a mostrare la lista dei bot disponibili sulla rete. Nota: se crei un bot con un nick che è già registrato, il nick sarà deregistrato; inoltre, se un utente lo sta @@ -6346,23 +6421,31 @@ HOST_LIST_KEY_FOOTER # HostServ Help messages # ########################################################################### -HOST_HELP - Comandi di %S: +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_OPER_HELP - - Comandi disponibili solo ai Services Oper: +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 Delete the vhost for all nicks in a group +HOST_HELP_CMD_LIST LIST Mostra uno o più vhost nel database -HOST_ADMIN_HELP +HOST_HELP + Comandi di %S: + +HOST_OPER_HELP + not used. - Comandi disponibili solo ai Services Admin: +HOST_ADMIN_HELP + not used. HOST_HELP_ON Sintassi: ON @@ -1908,7 +1908,7 @@ 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 @@ -2843,7 +2843,7 @@ OPER_MODULE_UNLOAD_SYNTAX OPER_MODULE_LIST_HEADER Huidige Module lijst: OPER_MODULE_LIST - Module: %s [%s] + Module: %s [%s] [%s] OPER_MODULE_LIST_FOOTER %d Modules geladen. OPER_MODULE_INFO_LIST @@ -3240,27 +3240,66 @@ HELP_HELP_HOST # 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 - %S stelt je in staat een nickname te "registreren", en - te voorkomen dat anderen hem gebruiken. De volgende commando's - kunnen gebruikt worden voor registratie en onderhoud van - nicknames; om ze te gebruiken, type /msg %S commando. - Voor meer informatie over een specifiek commando, type - /msg %S HELP commando. - +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_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 /msg %S commando. + Voor meer informatie over een specifiek commando, type + /msg %S HELP commando. - Andere commando's: GHOST, GLIST, INFO, LIST, LOGOUT, STATUS - +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 @@ -3668,13 +3707,6 @@ NICK_HELP_SENDPASS Dit commando is alleen beschikbaar als encryptie is uitgeschakeld. NICK_SERVADMIN_HELP - - De volgende commando's zijn beschikbaar voor Services admins: - - GETPASS Bekijk het wachtwoord voor een nick - (alleen als encryptie is uitgeschakeld) - FORBID Voorkom dat een nick gebruikt wordt - Services admins kunnen ook de registratie van elke nick opheffen zonder zich voor die nick te identificeren, en mogen de toegangslijst voor elke nick bekijken. @@ -3846,52 +3878,98 @@ NICK_SERVADMIN_HELP_UNSUSPEND # ChanServ help messages # ########################################################################### - -CHAN_HELP - %S stelt je in staat om kanalen te registreren en er - verschillende opties van in te stellen. %S kan vaak - voorkomen dat boosaardig gebruikers een kanaal "overnemen" - door te limiteren wie er op het kanaal operator mag zijn. - Beschikbare commando's staan hier beneden; om ze te gebruiken - type je /msg %S commando. Voor meer informatie over een - specifiek commando type je /msg %S HELP commando. - +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? - - Overige commando's: BAN, CLEAR, DEOP, DEVOICE, GETKEY, - INFO, INVITE, KICK, LIST, LOGOUT, OP, - TOPIC, UNBAN, VOICE, VOP +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_UNREAL - - Deze commando's zijn ook beschikbaar op dit netwerk: - DEHALFOP, DEOWNER, DEPROTECT, HALFOP, HOP, OWNER, - PROTECT - -CHAN_HELP_ULTIMATE3 - - Deze commando's zijn ook beschikbaar op dit netwerk: - DEHALFOP, HALFOP, HOP, ADMIN, DEADMIN - -CHAN_HELP_IRCD_HALFOP - - These commands are also available on this network: - DEHALFOP, HALFOP, HOP - -CHAN_HELP_IRCD_PROTECT +CHAN_HELP + %S stelt je in staat om kanalen te registreren en er + verschillende opties van in te stellen. %S kan vaak + voorkomen dat boosaardig gebruikers een kanaal "overnemen" + door te limiteren wie er op het kanaal operator mag zijn. + Beschikbare commando's staan hier beneden; om ze te gebruiken + type je /msg %S commando. Voor meer informatie over een + specifiek commando type je /msg %S HELP commando. + - These commands are also available on this network: - DEPROTECT, PROTECT - CHAN_HELP_EXPIRES Onthoud dat elk kanaal wat %d dagen ongebruikt is (dwz dat @@ -4742,18 +4820,6 @@ CHAN_HELP_SENDPASS CHAN_SERVADMIN_HELP - De volgende commando's zijn beschikbaar voor services administrators: - - GETPASS Haal het stichter-wachtwoord voor een kanaal op - (alleen als encryptie is uitgeschakeld) - FORBID Verbied het gebruik van een kanaal - SUSPEND Stel een kanaal tijdelijk buiten werking terwijl de - kanaal-data en -instellingen bewaard blijven. - UNSUSPEND Stelt een tijdelijk buiten werking gesteld kanaal weer - in werking - STATUS Geeft het huidige toegangsniveau van een gebruiker - op een kanaal weer - Services administrators kunnen ook elk kanaal dropped zonder dat ze hoeven te indentificeren via een wachtwoord, en kunnen de toegangs-, AKICK-, en niveau-lijsten bekijken voor elk kanaal. @@ -4878,32 +4944,43 @@ CHAN_SERVADMIN_HELP_STATUS # MemoServ help messages # ########################################################################### - -MEMO_HELP - %S is een services die IRC gebruikers in staat stelt om - korte berichten te sturen naar andere IRC gebruikers, online - of offline, of naar kanalen(*). De verstuurder's nick en de - nick van de vanger, of het kanaal waar de memo naartoe gaat, - moeten geregistreerd zijn om de memo te versturn. - - %S's commando's bevatten: - +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_ADMIN +MEMO_HELP_CMD_SENDALL SENDALL Stuur een memo naar alle geregistreerde gebruikers - -MEMO_HELP_OPER +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 /msg %S HELP commando voor hulp bij een van @@ -5106,82 +5183,91 @@ MEMO_HELP_CHECK # ########################################################################### -OPER_HELP - %S commando's: +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 LIST Geeft alle Services operators weer - ADMIN LIST Geeft alle Services admins 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_OPER_CMD - Commando's beschikbaar voor Services operators en administrators: +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_OPER_CMD_EXTRA - Following commands are also available - -OPER_HELP_OPER_CMD_SGLINE +OPER_HELP_CMD_SGLINE SGLINE Beheer de SGLINE lijst - -OPER_HELP_OPER_CMD_SQLINE +OPER_HELP_CMD_SQLINE SQLINE Beheer de SQLINE lijst - -OPER_HELP_OPER_CMD_SZLINE +OPER_HELP_CMD_SZLINE SZLINE Beheer de SZLINE lijst - -OPER_HELP_ADMIN_CMD - Commando's beschikbaar voor Services administrators: - OPER Wijzig de Services operator 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 + ze inloggen +OPER_HELP_CMD_RANDOMNEWS RANDOMNEWS Stel de berichten in waarvan gebruikers er willekeurig - een te zien krijgen als ze inloggen + 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 - CACHE Geeft de hostname cache weer die gebruikt wordt door - de proxy detectie. +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 + 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 - - Commando's beschikbaar voor Services super-gebruikers: - ADMIN Wijzig de Services Administrator lijst - -OPER_HELP_ADMIN_CMD_EXTRA - Following commands are also available to Service Admins - -OPER_HELP_ADMIN_CMD_OLINE +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_ADMIN_CMD_UMODE +OPER_HELP_CMD_UMODE UMODE Wijzigt de modus van een gebruiker - -OPER_HELP_ADMIN_CMD_SVSNICK +OPER_HELP_CMD_SVSNICK SVSNICK Forcefully change a user's nickname - -OPER_HELP_ROOT_CMD - Commando's beschikbaar voor Services Roots: +OPER_HELP_CMD_MODLOAD MODLOAD Laad een module +OPER_HELP_CMD_MODUNLOAD MODUNLOAD Ontlaad een module - MODLIST Geef geladen modules weer +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! @@ -5802,7 +5888,29 @@ OPER_HELP_MODLIST # 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 @@ -5812,14 +5920,7 @@ BOT_HELP /msg %S commando typen. Voor meer informatie over een specifiek commando moet je /msg %S HELP command typen. - BOTLIST Geef beschikbare bots weer - ASSIGN Wijs een bot toe aan een kanaal - SET Configureer bot opties - KICK Configureer kickers - BADWORDS Beheer slechte-woorden lijst - - Overige commando's: ACT INFO SAY UNASSIGN - +BOT_HELP_FOOTER Bot zal een kanaal joinen wanneer daar tenminste %d gebruiker(s) is/zijn. @@ -6084,17 +6185,10 @@ BOT_HELP_ACT Laat de bot een "/me" commando doen op het gegeven kanaal met de gegeven tekst. -BOT_SERVADMIN_HELP - - Het volgende commando is beschikbaar voor Services administrators: - - BOT Beheer de lijst met bots op het netwerk - BOT_SERVADMIN_HELP_BOT Gebruik: BOT ADD nick gebruiker host echte naam BOT CHANGE oldnick newnick [gebruiker [host [echte naam]]] BOT DEL nick - BOT LIST Stelt Services administrators in staat om bots te maken, wijzigen en verwijderen die gebruikers op hun eigen kanaal @@ -6107,8 +6201,6 @@ BOT_SERVADMIN_HELP_BOT naam van een bot veranderen zonder deze (en de date die met de bot geassocieerd is) te verwijderen. BOT DEL verwijdert de gegeven bot van de bot lijst. - BOT LIST is een synoniem van BOTLIST en geeft gewoon - alle beschikbare bots op het netwerk weer. Let op: Als je een bot maakt die een nick heeft die momenteel in gebruiker is zal de betreffende gebruiker worden gekilled. @@ -6221,22 +6313,38 @@ HOST_LIST_KEY_FOOTER # HostServ Help messages # ########################################################################### -HOST_HELP - %S commando'ss: +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_OPER_HELP - Commando's beschikbaar voor Services operators: +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_HELP + %S commando'ss: + +HOST_OPER_HELP + not used. + HOST_ADMIN_HELP - Commando's beschikbaar voor Services administrators: + not used. HOST_HELP_ON Gebruik: ON @@ -2055,7 +2055,7 @@ BOT_SEEN_NEVER Nigdy nie widzia³em %s na tym kanale. BOT_SEEN_UNKNOWN Nie wiem kim %s jest. - + # BOT responses BOT_BOT_SYNTAX BOT ADD nick user host real @@ -3045,7 +3045,7 @@ OPER_MODULE_UNLOAD_SYNTAX OPER_MODULE_LIST_HEADER Aktualna lista modu³u: OPER_MODULE_LIST - Modu³: %s [%s] + Modu³: %s [%s] [%s] OPER_MODULE_LIST_FOOTER Ilo¶æ modu³ów za³adowanych: %d. OPER_MODULE_INFO_LIST @@ -3434,29 +3434,67 @@ HELP_HELP_HOST # HELP NickServ # ########################################################################### +NICK_HELP_CMD_CONFIRM + CONFIRM Confirm a nickserv auth code +NICK_HELP_CMD_RESEND + RESEND Resend a nickserv auth code -NICK_HELP - %S umo¿liwia Tobie zarejestrowanie w³asnego - nicka. Dzieki rejestracji tylko Ty bedziesz go móg³ - u¿ywaæ oraz uzyskasz dostêp do dodatkowych opcji. - Aby ich u¿yæ wpisz /msg %S komenda. - Wiêcej informacji na temat konkretnej komendy mo¿na - uzyskaæ pisz±c: - /msg %S HELP komenda. - +NICK_HELP_CMD_REGISTER REGISTER Rejestracja nicka. +NICK_HELP_CMD_GROUP GROUP Stworzenie grupy w³asnych nicków. +NICK_HELP_CMD_IDENTIFY IDENTIFY Identyfikacja nicka za pomoc± has³a. +NICK_HELP_CMD_ACCESS ACCESS Modyfikacje listy dostêpu. +NICK_HELP_CMD_SET SET Ustawienia ró¿nych opcji nicka. +NICK_HELP_CMD_DROP DROP Odrejestruj nicka. +NICK_HELP_CMD_RECOVER RECOVER Odzyskuje Twojego nicka. +NICK_HELP_CMD_RELEASE RELEASE Zwalnia nick po opcji RECOVER. +NICK_HELP_CMD_SENDPASS SENDPASS Zapomniane has³o? Spróbuj tego. +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 Odzyskanie has³a dla nicka (tylko przy wy³±czonym szyfrowaniu) +NICK_HELP_CMD_GETEMAIL + GETEMAIL Wy¶wietla pasuj±cych u¿ytkowników zarejestrowanych z podanym + e-mailem +NICK_HELP_CMD_FORBID + FORBID Zabrania rejestracji podanego nicka. +NICK_HELP_CMD_SUSPEND + SUSPEND Suspend a given nick +NICK_HELP_CMD_UNSUSPEND + UNSUSPEND Unsuspend a given nick + +NICK_HELP + %S umo¿liwia Tobie zarejestrowanie w³asnego + nicka. Dzieki rejestracji tylko Ty bedziesz go móg³ + u¿ywaæ oraz uzyskasz dostêp do dodatkowych opcji. + Aby ich u¿yæ wpisz /msg %S komenda. + Wiêcej informacji na temat konkretnej komendy mo¿na + uzyskaæ pisz±c: + /msg %S HELP komenda. - Pozosta³e komendy: GHOST, ALIST, GLIST, INFO, LIST, - LOGOUT, STATUS - +NICK_HELP_FOOTER INFO: Ten serwis ma na celu identyfikacjê u¿ytkowników bez wzglêdu na host czy zmienne IP. To NIE jest po to, aby zajmowaæ komu¶ nicka, @@ -3933,19 +3971,6 @@ NICK_HELP_SENDPASS gdy has³a s± szyfrowane. NICK_SERVADMIN_HELP - - Nastêpuj±ce komendy s± dostêpne dla administratorów - serwisów: - - GETPASS Odzyskanie has³a dla nicka - (tylko przy wy³±czonym - szyfrowaniu). - GETEMAIL Wy¶wietla pasuj±cych u¿ytkowników - zarejestrowanych z podanym - e-mailem. - FORBID Zabrania rejestracji podanego - nicka. - Administratorzy Serwisów mog± odrejestrowaæ ka¿dy nick bez potrzeby identyfikacji dla niego i mog± widzieæ listê dostêpu dla ka¿dego nicka @@ -4127,55 +4152,100 @@ NICK_SERVADMIN_HELP_UNSUSPEND # ChanServ help messages # ########################################################################### - -CHAN_HELP - %S pozwala na rejestracjê oraz kontrolê - poszczególnych ustawieñ kana³ów. %S ma na celu - uniemo¿liwiæ innym u¿ytkownikom przejmowanie - kana³ów, poprzez ograniczenie dostêpu do statusu - operatora kana³u. Dostêpne komendy zosta³y podane - poni¿ej, aby ich u¿yæ napisz: - /msg %S komenda. Aby uzyskaæ wiêcej - informacji o poszczególnych komendach, napisz: - /msg %S HELP komenda. - +CHAN_HELP_CMD_GETPASS + GETPASS Uzyskanie has³a w³a¶ciciela dla + wskazanego kana³u +CHAN_HELP_CMD_FORBID + FORBID Zamkniêcie wskazanego kana³u. +CHAN_HELP_CMD_SUSPEND + SUSPEND Blokada kana³u z zachowaniem + wszelkich jego danych i ustawieñ. +CHAN_HELP_CMD_UNSUSPEND + UNSUSPEND Odblokowanie kana³u. +CHAN_HELP_CMD_STATUS + STATUS Zwraca aktualny poziom dostêpu do + kana³u wskazanego u¿ytkownika. +CHAN_HELP_CMD_REGISTER REGISTER Rejestracja kana³u. +CHAN_HELP_CMD_IDENTIFY IDENTIFY Identyfikacja w³a¶ciciela kana³u. +CHAN_HELP_CMD_SET SET Ustawienia ró¿nych opcji kana³u. +CHAN_HELP_CMD_AOP AOP Modyfikacje listy AOP kana³u. +CHAN_HELP_CMD_SOP SOP Modyfikacje listy SOP kana³u. +CHAN_HELP_CMD_ACCESS ACCESS Zarz±dzanie kana³ow± list± dostêpu +CHAN_HELP_CMD_LEVELS LEVELS Zarz±dzanie poziomami dostêpu. +CHAN_HELP_CMD_AKICK AKICK Zarz±dzanie kana³ow± list± AKICK. +CHAN_HELP_CMD_DROP DROP Odrejestrowanie kana³u. +CHAN_HELP_CMD_SENDPASS SENDPASS Odzyskanie utraconego has³a. - - Pozosta³e komendy: BAN, CLEAR, DEOP, DEVOICE, - GETKEY, INFO, INVITE, KICK, LIST, - LOGOUT, OP, TOPIC, UNBAN, VOICE, - VOP - -CHAN_HELP_UNREAL - - Te komendy s± rownie¿ dostêpne na tej sieci: - DEHALFOP, DEOWNER, DEPROTECT, HALFOP, HOP, - OWNER, PROTECT - -CHAN_HELP_ULTIMATE3 - - Te komendy s± rownie¿ dostêpne na tej sieci: - DEHALFOP, HALFOP, HOP, ADMIN, DEADMIN +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_IRCD_HALFOP - - These commands are also available on this network: - DEHALFOP, HALFOP, HOP - -CHAN_HELP_IRCD_PROTECT +CHAN_HELP + %S pozwala na rejestracjê oraz kontrolê + poszczególnych ustawieñ kana³ów. %S ma na celu + uniemo¿liwiæ innym u¿ytkownikom przejmowanie + kana³ów, poprzez ograniczenie dostêpu do statusu + operatora kana³u. Dostêpne komendy zosta³y podane + poni¿ej, aby ich u¿yæ napisz: + /msg %S komenda. Aby uzyskaæ wiêcej + informacji o poszczególnych komendach, napisz: + /msg %S HELP komenda. + - These commands are also available on this network: - DEPROTECT, PROTECT - CHAN_HELP_EXPIRES Uwaga! Kana³ który nie by³ u¿ywany od %d dni (np. @@ -5166,19 +5236,6 @@ CHAN_HELP_SENDPASS CHAN_SERVADMIN_HELP - Poni¿sze komendy s± dostêpne dla administratorów - Serwices: - - GETPASS Uzyskanie has³a w³a¶ciciela dla - wskazanego kana³u (nie dzia³a w - przypadku kodowawanych hase³). - FORBID Zamkniêcie wskazanego kana³u. - SUSPEND Blokada kana³u z zachowaniem - wszelkich jego danych i ustawieñ. - UNSUSPEND Odblokowanie kana³u. - STATUS Zwraca aktualny poziom dostêpu do - kana³u wskazanego u¿ytkownika. - Administratorzy Serwisów mog± tak¿e usun±æ ka¿dy z kana³ów bez potrzeby identyfikowania siê z u¿yciem has³a w³a¶ciciela. Mog± przejrzeæ listy dostêpów, @@ -5309,34 +5366,47 @@ CHAN_SERVADMIN_HELP_STATUS # Wiadomo¶ci pomocy MemoServ # ########################################################################### - -MEMO_HELP - %S jest mechanizmem umo¿liwiaj±cym przesy³anie - krótkich wiadomo¶ci innym uzytkownikom sieci lub - kana³om(*). Zarówno nick osoby wysy³aj±cej jak i - adresata wiadomo¶ci lub adresowany kana³, musz± - byæ zarejestrowane. - - %S lista dostêpnych komend: - +MEMO_HELP_CMD_SEND SEND Wyslij wiadomo¶æ do u¿ytkownika/kana³u. +MEMO_HELP_CMD_CANCEL CANCEL Wycofaj ostatni± ustawion± wiadomo¶æ. +MEMO_HELP_CMD_LIST LIST Wy¶wietl wszystkie ustawione wiadomo¶ci. +MEMO_HELP_CMD_READ READ Przeczytaj jedn± lub wiêcej wiadomo¶ci. +MEMO_HELP_CMD_DEL DEL Skasuj jedn± lub wiêcej wiadomo¶ci. +MEMO_HELP_CMD_SET SET Ustaw opcje dla wiadomo¶ci. +MEMO_HELP_CMD_INFO INFO Wy¶wietl informacje o wiadomo¶ciach. +MEMO_HELP_CMD_RSEND RSEND Wysy³a wiadomo¶æ z ¿±daniem potwierdzenia odbioru. - -MEMO_HELP_ADMIN +MEMO_HELP_CMD_CHECK + CHECK Checks if last memo to a nick was read +MEMO_HELP_CMD_SENDALL SENDALL Wysy³a wiadomo¶æ do wszystkich zarejestrowanych u¿ytkowników. -MEMO_HELP_OPER +MEMO_HELP_CMD_STAFF STAFF Wysy³a wiadomo¶æ do wszystkich operatorów/administratorów Serwisów. +MEMO_HELP_HEADER + %S jest mechanizmem umo¿liwiaj±cym przesy³anie + krótkich wiadomo¶ci innym uzytkownikom sieci lub + kana³om(*). Zarówno nick osoby wysy³aj±cej jak i + adresata wiadomo¶ci lub adresowany kana³, musz± + byæ zarejestrowane. + + %S lista dostêpnych komend: + + +MEMO_HELP_ADMIN + not used. +MEMO_HELP_OPER + not used. MEMO_HELP_FOOTER Napisz /msg %S HELP komenda, aby @@ -5533,82 +5603,89 @@ MEMO_HELP_CHECK # ########################################################################### -OPER_HELP - komendy %S: +OPER_HELP_CMD_GLOBAL GLOBAL Wiadomo¶æ do wszystkich u¿ytkowników. +OPER_HELP_CMD_STATS STATS Informacje na temat serwisów i sieci. - OPER LIST Lista wszystkich operatorów serwisów. - ADMIN LIST Lista wszystkich administratorów. +OPER_HELP_CMD_OPER + OPER Modyfikacja listy operatorów serwisów. +OPER_HELP_CMD_ADMIN + ADMIN Modyfikacja listy adminów serwisów. +OPER_HELP_CMD_STAFF STAFF Wy¶wietla ekipe serwisów i jej stan. - -OPER_HELP_OPER_CMD - Komendy tylko dla operatorów i adminów serwisów: +OPER_HELP_CMD_MODE MODE Zmiana modów kana³owych. +OPER_HELP_CMD_KICK KICK Wykopanie u¿ytkownika z kana³u. +OPER_HELP_CMD_CLEARMODES CLEARMODES Czyszczenie modów na kanale. +OPER_HELP_CMD_KILLCLONES KILLCLONES Skilluj u¿ytkowników z danego hosta. +OPER_HELP_CMD_AKILL AKILL Modyfikacje listy AKILL. - -OPER_HELP_OPER_CMD_EXTRA - Following commands are also available - -OPER_HELP_OPER_CMD_SGLINE +OPER_HELP_CMD_SGLINE SGLINE Modyfikacje listy SGLINII. - -OPER_HELP_OPER_CMD_SQLINE +OPER_HELP_CMD_SQLINE SQLINE Modyfikacje listy SQLINII. - -OPER_HELP_OPER_CMD_SZLINE +OPER_HELP_CMD_SZLINE SZLINE Modyfikacje listy SZLINII. - -OPER_HELP_ADMIN_CMD - Komendy dostêpne tylko dla adminów serwisów: - OPER Modyfikacja listy operatorów serwisów. +OPER_HELP_CMD_CHANLIST CHANLIST Lista wszystkich rekordów kana³ów. +OPER_HELP_CMD_USERLIST USERLIST Lista wszystkich rekordów u¿ytkowników. +OPER_HELP_CMD_LOGONNEWS LOGONNEWS Modyfikacja wiadomo¶ci wy¶wietlanych u¿ytkownikom po po³±czeniu. +OPER_HELP_CMD_RANDOMNEWS RANDOMNEWS Modyfikacja losowych wiadomo¶ci wy¶wietlanych u¿ytkownikom po po³±czeniu. +OPER_HELP_CMD_OPERNEWS OPERNEWS Modyfikacja wiadomo¶ci wy¶wietlanych ircopom. +OPER_HELP_CMD_SESSION SESSION Pokazuje liste sesji. +OPER_HELP_CMD_EXCEPTION EXCEPTION Modyfikacja listy wyj±tków dla limitów sesji. - CACHE Lista hostów w cache detektora proxy. +OPER_HELP_CMD_NOOP NOOP Tymczasowe usuniêcie wszystkich O:linii na serwerze. +OPER_HELP_CMD_JUPE JUPE Fake serwer do blokady po³±czeñ. +OPER_HELP_CMD_IGNORE IGNORE Modyfikacja listy ignore serwisów. +OPER_HELP_CMD_SET SET Ustawienia ró¿nych, globalnych opcji. +OPER_HELP_CMD_RELOAD RELOAD Prze³adowanie pliku konfiguracyjnego. +OPER_HELP_CMD_UPDATE UPDATE Natychmiastowa i wymuszona aktualizacja baz serwisów na dysku. +OPER_HELP_CMD_RESTART RESTART Zapis baz i restart serwisów. +OPER_HELP_CMD_QUIT QUIT Wy³±czenie serwisów bez zapisywania baz. +OPER_HELP_CMD_SHUTDOWN SHUTDOWN Wy³±czenie serwisów z zapisaniem baz. +OPER_HELP_CMD_DEFCON DEFCON Modyfikacje systemu DefCon. +OPER_HELP_CMD_CHANKILL CHANKILL Skilluj wszystkich u¿ytkowników na kanale. - - Komendy dostêpne tylko dla superadminów: - ADMIN Modyfikacja listy adminów serwisów. - -OPER_HELP_ADMIN_CMD_EXTRA - Following commands are also available to Service Admins - -OPER_HELP_ADMIN_CMD_OLINE +OPER_HELP_CMD_OLINE OLINE Daje flagi opera wybranemu u¿ytkownikowi - -OPER_HELP_ADMIN_CMD_UMODE +OPER_HELP_CMD_UMODE UMODE Zmiana usermod dla u¿ytkownika. - -OPER_HELP_ADMIN_CMD_SVSNICK +OPER_HELP_CMD_SVSNICK SVSNICK Wymuszona zmiana nicka danego u¿ytkownika. - -OPER_HELP_ROOT_CMD - Dodatkowe komendy dostêpne tylko dla superadminów: +OPER_HELP_CMD_MODLOAD MODLOAD Za³aduj modu³. +OPER_HELP_CMD_MODUNLOAD MODUNLOAD Wy³aduj modu³. - MODLIST Lista za³adowanych modu³ów. +OPER_HELP_CMD_MODINFO MODINFO Informacja na temat wybranego modu³u. +OPER_HELP_CMD_MODLIST + MODLIST Lista za³adowanych modu³ów. + +OPER_HELP + komendy %S: OPER_HELP_LOGGED Notka: Wszystkie komendy w %S s± logowane! @@ -6214,7 +6291,29 @@ OPER_HELP_MODLIST # Wiadomo¶ci pomocy BotServ # ########################################################################### - + + +BOT_HELP_CMD_BOTLIST + BOTLIST Lista dostêpnych boty. +BOT_HELP_CMD_ASSIGN + ASSIGN Przydziela bota do kana³u. +BOT_HELP_CMD_SET + SET Konfiguruje bota. +BOT_HELP_CMD_KICK + KICK Konfiguruje kick'i. +BOT_HELP_CMD_BADWORDS + BADWORDS Zarz±dzanie lista zakaznych s³ów. +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 Zarz±dza list± botów sieci. + BOT_HELP %S pozwala umie¶ciæ bota na w³asnym kanale. Zosta³ stworzony dla u¿ytkowników, którzy nie mog± @@ -6224,14 +6323,7 @@ BOT_HELP /msg %S komenda. Aby uzyskaæ wiêcej informacji wpisz /msg %S HELP komenda. - BOTLIST Lista dostêpnych boty. - ASSIGN Przydziela bota do kana³u. - SET Konfiguruje bota. - KICK Konfiguruje kick'i. - BADWORDS Zarz±dzanie lista zakaznych s³ów. - - Pozosta³e komendy: ACT INFO SAY UNASSIGN - +BOT_HELP_FOOTER Bot wejdzie na kana³ je¶li przebywa na nim przynajmniej %d u¿ytkownik(ów). @@ -6493,18 +6585,10 @@ BOT_HELP_ACT Sprawia ¿e Bot u¿yje komendy akcji (/me) przy wypowiedzeniu podanego tekstu na kanale. -BOT_SERVADMIN_HELP - - Poni¿sza komenda jest dostêpna dla Aministratorów - Serwisów: - - BOT Zarz±dza list± botów sieci. - BOT_SERVADMIN_HELP_BOT Sk³adnia: BOT ADD nick ident host nazwa BOT CHANGE starynick nowynick [ident [host [nazwa]]] BOT DEL nick - BOT LIST Polecenie pozwala Administratorom Serwisów na tworzenie, modyfikowanie oraz kasowanie botów @@ -6515,8 +6599,6 @@ BOT_SERVADMIN_HELP_BOT BOT CHANGE pozwala na zmiane nicka, identa, hosta lub realname bota bez jego kasowania. BOT DEL usuwa wskazanego bota. - BOT LIST dzia³a tak samo jak BOTLIST - wy¶wietlaj±c wszystkie dostêpne boty. UWAGA: Je¶li stworzony zostanie bot o nicku, który jest ju¿ zarejestrowany, nick zostanie @@ -6627,22 +6709,38 @@ HOST_LIST_KEY_FOOTER # HostServ Help messages # ########################################################################### -HOST_HELP - %S commands: +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_OPER_HELP - Commands available to HostSetters/Removes only: +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_HELP + %S commands: + +HOST_OPER_HELP + not used. + HOST_ADMIN_HELP - Commands available to services admins only: + not used. HOST_HELP_ON Syntax: ON @@ -1876,7 +1876,7 @@ BOT_SEEN_NEVER Eu nunca vi %s neste canal. BOT_SEEN_UNKNOWN Eu não sei quem é %s. - + # BOT responses BOT_BOT_SYNTAX @@ -2803,7 +2803,7 @@ OPER_MODULE_UNLOAD_SYNTAX OPER_MODULE_LIST_HEADER Lista de Módulos atual: OPER_MODULE_LIST - Módulo: %s [%s] + Módulo: %s [%s] [%s] OPER_MODULE_LIST_FOOTER %d módulos carregados. OPER_MODULE_INFO_LIST @@ -3186,27 +3186,66 @@ HELP_HELP_HOST # 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 - %S permite que você "registre" um nick e evita que outras - pessoas o utilizem. Os seguintes comandos permitem o - registro e a manutenção dos nicks; para utilizá-los, digite - /msg %S comando. Para mais informações sobre um - comando específico, digite /msg %S HELP comando. - +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_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 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 a senha de um nick determinado + (apenas se não estiver com encriptação) +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 Suspend a given nick +NICK_HELP_CMD_UNSUSPEND + UNSUSPEND Unsuspend a given nick + +NICK_HELP + %S permite que você "registre" um nick e evita que outras + pessoas o utilizem. Os seguintes comandos permitem o + registro e a manutenção dos nicks; para utilizá-los, digite + /msg %S comando. Para mais informações sobre um + comando específico, digite /msg %S HELP comando. - Outros comandos: GHOST, ALIST, GLIST, INFO, LIST, LOGOUT, - STATUS, UPDATE - +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 @@ -3617,15 +3656,6 @@ NICK_HELP_SENDPASS Este comando não está disponível quando estiver usando encriptação. NICK_SERVADMIN_HELP - - Os comandos abaixo estão disponíveis para Administradores dos Services: - - GETPASS Recupera a senha de um nick determinado - (apenas se não estiver com encriptação) - GETEMAIL Encontra e retorna todos os usuários que se - registraram usando o email fornecido - FORBID Previne um nick de ser usado ou registrado - 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 (/msg %S ACCESS LIST nick). @@ -3785,54 +3815,99 @@ NICK_SERVADMIN_HELP_UNSUSPEND # ChanServ help messages # ########################################################################### - -CHAN_HELP - %S permite que você registre e controle vários - aspectos do canal. %S pode prevenir o "take over" - do canal 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 - /msg %S comando. Para mais informações sobre - um comando específico, digite /msg %S HELP comando. - +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 usuários AOP (efetivo quando listagem xOP está ativada) +CHAN_HELP_CMD_SOP SOP Modifica a lista de usuários SOP (efetivo quando listagem xOP está ativada) +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 - - Outros comandos: BAN, CLEAR, DEOP, DEVOICE, GETKEY, INFO, - INVITE, KICK, LIST, LOGOUT, OP, TOPIC, - UNBAN, VOICE, VOP - -CHAN_HELP_UNREAL - - Estes comandos estão também disponíveis nesta Rede: - HALFOP, DEHALFOP, HOP, PROTECT, DEPROTECT, OWNER, - DEOWNER - -CHAN_HELP_ULTIMATE3 - - Estes comandos estão também disponíveis nesta Rede: - HALFOP, DEHALFOP, HOP, ADMIN, DEADMIN +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_IRCD_HALFOP - - Estes comandos estão também disponíveis nesta Rede: - DEHALFOP, HALFOP, HOP - -CHAN_HELP_IRCD_PROTECT +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 + /msg %S comando. Para mais informações sobre + um comando específico, digite /msg %S HELP comando. + - Estes comandos estão também disponíveis nesta Rede: - DEPROTECT, PROTECT - CHAN_HELP_EXPIRES Note que qualquer canal não utilizado por %d dias @@ -4677,18 +4752,6 @@ CHAN_HELP_SENDPASS CHAN_SERVADMIN_HELP - Os seguintes comandos estão disponíveis para - os Administradores dos Services: - - GETPASS Recupera a senha de um canal - (caso mode de encriptação não seja usado) - FORBID Previne um canal de ser registrado/usado - SUSPEND Previne um canal de ser registrado/usado, - preservando os dados do canal e suas configurações. - UNSUSPEND Libera um canal suspenso. - STATUS Fornece o atual nível de acesso de um - usuário em um canal - 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 @@ -4810,31 +4873,43 @@ CHAN_SERVADMIN_HELP_STATUS # ########################################################################### -MEMO_HELP - %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_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_ADMIN +MEMO_HELP_CMD_SENDALL SENDALL Envia um memo para todos os usuários registrados - -MEMO_HELP_OPER +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 + not used. +MEMO_HELP_OPER + not used. MEMO_HELP_FOOTER Digite /msg %S HELP comando para ajuda em qualquer um @@ -5019,78 +5094,86 @@ MEMO_HELP_CHECK # ########################################################################### -OPER_HELP - Comandos do %S: +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 LIST Lista todos os Operadores dos Services - ADMIN LIST Lista todos os Administradores dos Services +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_OPER_CMD - Comandos disponíveis para Operadores e Admins dos Services: +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_OPER_CMD_EXTRA - Os seguintes comandos também estão disponíveis: - -OPER_HELP_OPER_CMD_SGLINE +OPER_HELP_CMD_SGLINE SGLINE Manipula a lista de SGLINE - -OPER_HELP_OPER_CMD_SQLINE +OPER_HELP_CMD_SQLINE SQLINE Manipula a lista de SQLINE - -OPER_HELP_OPER_CMD_SZLINE +OPER_HELP_CMD_SZLINE SZLINE Manipula a lista de SZLINE - -OPER_HELP_ADMIN_CMD - Comandos disponíveis para Administradores dos Services: - OPER Modifica a lista de Operadores dos Services +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 + 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 - - Comandos disponíveis para Super Usuários dos Services: - ADMIN Modifica lista de Administradores dos Services - -OPER_HELP_ADMIN_CMD_EXTRA - Comandos também disponíveis para Administradores dos Services: - -OPER_HELP_ADMIN_CMD_OLINE +OPER_HELP_CMD_OLINE OLINE Dá flags de Operador a um determinado usuário - -OPER_HELP_ADMIN_CMD_UMODE +OPER_HELP_CMD_UMODE UMODE Altera os modos de um usuário - -OPER_HELP_ADMIN_CMD_SVSNICK +OPER_HELP_CMD_SVSNICK SVSNICK Força a mudança do nick de um usuário - -OPER_HELP_ROOT_CMD - Comandos disponíveis para Service Root Administrators: +OPER_HELP_CMD_MODLOAD MODLOAD Carrega um módulo +OPER_HELP_CMD_MODUNLOAD MODUNLOAD Descarrega um módulo - MODLIST Lista os módulos carregados +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! @@ -5706,7 +5789,29 @@ OPER_HELP_MODLIST # 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 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é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 @@ -5716,14 +5821,7 @@ BOT_HELP /msg %S comando. Para informações mais específicas sobre um comando, digite /msg %S HELP comando. - BOTLIST Lista os bots disponíveis - ASSIGN Associa um bot ao canal - SET Configura as opções do bot - KICK Configura os kickers - BADWORDS Configura os palavrões - - Outros comandos: ACT INFO SAY UNASSIGN - +BOT_HELP_FOOTER O bot irá entrar no canal sempre que tiver ao menos %d usuário(s) nele. @@ -5987,17 +6085,10 @@ BOT_HELP_ACT Faz com que o bot faça o mesmo que o comando "/me" em um determinado canal com o determinado texto. -BOT_SERVADMIN_HELP - - Os seguintes comandos podem ser usados por Administradores dos Services: - - BOT Mantém a lista de bots da Rede - BOT_SERVADMIN_HELP_BOT Sintaxe: BOT ADD nick user host real BOT CHANGE NickAntigo NickNovo [user [host [real]]] BOT DEL nick - BOT LIST Permite que os Administradores dos Services criem, modifiquem, e apaguem bots que os usuários poderão usar @@ -6009,8 +6100,6 @@ BOT_SERVADMIN_HELP_BOT ou realname de um bot sem que seja necessário apagá-lo (e todas as informações nele contidas). BOT DEL remove um bot da lista de bots. - BOT LIST é um alias de BOTLIST e apenas lista todos - os bots disponíveis na Rede. 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 @@ -6116,22 +6205,30 @@ HOST_LIST_KEY_FOOTER # HostServ Help messages # ########################################################################### -HOST_HELP - Comandos do %S: +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_OPER_HELP - Comandos disponíveis para Operadores dos Services ou HostSetters apenas: +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_HELP + Comandos do %S: + +HOST_OPER_HELP + not used. HOST_ADMIN_HELP - Comandos disponíveis para Administradores dos Services apenas: + not used. HOST_HELP_ON Sintaxe: ON @@ -1904,7 +1904,7 @@ BOT_SEEN_NEVER ß íèêîãäà íå âèäåë %s íà êàíàëå. BOT_SEEN_UNKNOWN ß íå çíàþ êòî òàêîé %s. - + # BOT responses BOT_BOT_SYNTAX BOT ADD íèê èäåíò õîñò ðåàëüíîå èìÿ @@ -2831,7 +2831,7 @@ OPER_MODULE_UNLOAD_SYNTAX OPER_MODULE_LIST_HEADER Current Module list: OPER_MODULE_LIST - Ìîäóëü: %s [%s] + Ìîäóëü: %s [%s] [%s] OPER_MODULE_LIST_FOOTER %d Modules loaded. OPER_MODULE_INFO_LIST @@ -3204,28 +3204,66 @@ HELP_HELP_HOST # 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 - %S ýòî ñåðâèñ, ïðåäíàçíà÷åííûé äëÿ "ðåãèñòðàöèè" Âàøåãî íèêà è åãî çàùèòû - îò èñïîëüçîâàíèÿ êåì-ëèáî, êðîìå Âàñ. Ñóùåñòâóåò íåñêîëüêî êîìàíä äëÿ - ðåãèñòðàöèè íèêà è ðàçëè÷íûõ íàñòðîåê; ÷òîáû èñïîëüçîâàòü - äàííûå êîìàíäû, íàïèøèòå /msg %S êîìàíäà. - Äëÿ áîëåå ïîäðîáíîé èíôîðìàöèè ïî êàêîé-ëèáî - êîìàíäå íàïèøèòå: /msg %S HELP êîìàíäà. - +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 Óñòàíîâêà ïàðàìåòðîâ, âêëþ÷àÿ çàùèòó kill'îì +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 Ïðåäîõðàíÿåò íèê îò èñïîëüçîâàíèÿ +NICK_HELP_CMD_SUSPEND + SUSPEND Suspend a given nick +NICK_HELP_CMD_UNSUSPEND + UNSUSPEND Unsuspend a given nick + +NICK_HELP + %S ýòî ñåðâèñ, ïðåäíàçíà÷åííûé äëÿ "ðåãèñòðàöèè" Âàøåãî íèêà è åãî çàùèòû + îò èñïîëüçîâàíèÿ êåì-ëèáî, êðîìå Âàñ. Ñóùåñòâóåò íåñêîëüêî êîìàíä äëÿ + ðåãèñòðàöèè íèêà è ðàçëè÷íûõ íàñòðîåê; ÷òîáû èñïîëüçîâàòü + äàííûå êîìàíäû, íàïèøèòå /msg %S êîìàíäà. + Äëÿ áîëåå ïîäðîáíîé èíôîðìàöèè ïî êàêîé-ëèáî + êîìàíäå íàïèøèòå: /msg %S HELP êîìàíäà. - Äðóãèå êîìàíäû: GHOST, ALIST, GLIST, INFO, LIST, LOGOUT, - STATUS - +NICK_HELP_FOOTER ÂÀÆÍÎ: Äàííûé ñåðâèñ ïðåäíàçíà÷åí äëÿ òîãî, ÷òîáû ïîëüçîâàòåëè IRC ìîãëè âîñïîëüçîâàòüñÿ ìíîãèìè óäîáíûìè âîçìîæíîñòÿìè. NickServ ÍÅ ïðåäíàçíà÷åí äëÿ îáëåã÷åíèÿ "âîðîâñòâà" íèêîâ, @@ -3639,13 +3677,6 @@ NICK_HELP_SENDPASS Ïðè âêëþ÷åííîì øèôðîâàíèè ïàðîëåé ýòà êîìàíäà íåäîñòóïíà. NICK_SERVADMIN_HELP - - Äîñòóïíûå êîìàíäû äëÿ Àäìèíèñòðàòîðîâ ñåðâèñîâ: - - GETPASS Âîçâðàùàåò ïàðîëü íèêà - (òîëüêî åñëè øèôðîâàíèå âûêëþ÷åíî) - FORBID Ïðåäîõðàíÿåò íèê îò èñïîëüçîâàíèÿ - Àäìèíèñòðàòîðû ñåðâèñîâ ìîãóò òàêæå óäàëèòü ëþáîé íèê áåç èäåíòèôèêàöèè äëÿ íåãî, è ìîãóò ñìîòðåòü ñïèñîê äîñòóïà äëÿ ëþáîãî íèêà (/msg %S ACCESS LIST íèê). @@ -3805,52 +3836,97 @@ NICK_SERVADMIN_HELP_UNSUSPEND # ChanServ help messages # ########################################################################### - -CHAN_HELP - %S ïîçâîëÿåò Âàì ðåãèñòðèðîâàòü êàíàë è óïðàâëÿòü - êàíàëîì. %S ìîæåò ïðåäîõðàíèòü - îò çëîáíûõ ïîëüçîâàòåëåé, æåëàþùèõ "çàõâàòèòü" êàíàë, èñïîëüçóÿ - îãðàíè÷åíèå âîçìîæíîñòè ïîëó÷åíèÿ îïà íà êàíàëå. Äîñòóïíûå - êîìàíäû ïîêàçàíû íèæå; ÷òîáû èñïîëüçîâàòü èõ ïèøèòå - /msg %S êîìàíäà. Äëÿ áîëåå ïîäðîáíîé èíôîðìàöèè î êîíêðåòíîé - êîìàíäå, íàïèøèòå /msg %S HELP êîìàíäà. - +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 Ìîäèôèöèðîâàòü ñïèñîê ïðèâèëåãèðîâàííûõ ïîëüçîâàòåëåé +CHAN_HELP_CMD_LEVELS LEVELS Ïåðåóñòàíîâèòü çíà÷åíèÿ óðîâíåé äîñòóïà +CHAN_HELP_CMD_AKICK AKICK Óïðàâëåíèå ñïèñêîì àâòîêèêîâ +CHAN_HELP_CMD_DROP DROP Óäàëèòü êàíàë èç áàçû äàííûõ ChanServ +CHAN_HELP_CMD_SENDPASS SENDPASS Ïîìîæåò âîññòàíîâèòü çàáûòûé ïàðîëü - - Äðóãèå êîìàíäû: BAN, CLEAR, DEOP, DEVOICE, GETKEY, INFO, - INVITE, KICK, LIST, LOGOUT, OP, TOPIC, - UNBAN, VOICE, VOP - -CHAN_HELP_UNREAL - -  äàííîé ñåòè òàêæå äîñòóïíû êîìàíäû: - DEHALFOP, DEOWNER, DEPROTECT, HALFOP, HOP, OWNER, - PROTECT - -CHAN_HELP_ULTIMATE3 - - Ýòè êîìàíäû òàêæå äîñòóïíû â Âàøåé ñåòè: - DEHALFOP, HALFOP, HOP, ADMIN, DEADMIN +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_IRCD_HALFOP - - These commands are also available on this network: - DEHALFOP, HALFOP, HOP - -CHAN_HELP_IRCD_PROTECT +CHAN_HELP + %S ïîçâîëÿåò Âàì ðåãèñòðèðîâàòü êàíàë è óïðàâëÿòü + êàíàëîì. %S ìîæåò ïðåäîõðàíèòü + îò çëîáíûõ ïîëüçîâàòåëåé, æåëàþùèõ "çàõâàòèòü" êàíàë, èñïîëüçóÿ + îãðàíè÷åíèå âîçìîæíîñòè ïîëó÷åíèÿ îïà íà êàíàëå. Äîñòóïíûå + êîìàíäû ïîêàçàíû íèæå; ÷òîáû èñïîëüçîâàòü èõ ïèøèòå + /msg %S êîìàíäà. Äëÿ áîëåå ïîäðîáíîé èíôîðìàöèè î êîíêðåòíîé + êîìàíäå, íàïèøèòå /msg %S HELP êîìàíäà. + - These commands are also available on this network: - DEPROTECT, PROTECT - CHAN_HELP_EXPIRES Ïîìíèòå, ÷òî ëþáîé êàíàë, íå èñïîëüçóþùèéñÿ â òå÷åíèå %d äíåé @@ -4670,17 +4746,6 @@ CHAN_HELP_SENDPASS CHAN_SERVADMIN_HELP - Íèæåñëåäóþùèå êîìàíäû äîñòóïíû äëÿ àäìèíèñòðàòîðîâ ñåðâèñîâ: - - GETPASS Ïîëó÷èòü ïàðîëü âëàäåëüöà êàíàëà - (òîëüêî åñëè øèôðîâàíèå âûêëþ÷åíî) - FORBID Çàïðåòèòü èñïîëüçîâàòü êàíàë - SUSPEND Ïðèîñòàíîâèòü ðàáîòó êàíàëà ñ ñîõðàíåíèåì - äàííûõ è íàñòðîåê êàíàëà. - UNSUSPEND Âîññòàíîâèòü ðàáîòó ïðèîñòàíîâëåííîãî êàíàëà. - STATUS Âîçâðàùàåò òåêóùèé óðîâåíü äîñòóïà äëÿ óêàçàííîãî - ïîëüçîâàòåëÿ íà êàíàëå. - Àäìèíèñòðàòîðû ñåðâèñîâ ìîãóò òàêæå óäàëèòü ëþáîé êàíàë áåç èäåíòèôèêàöèè êàê âëàäåëåö êàíàëà, ìîãóò ïðîñìàòðèâàòü ñïèñîê äîñòóïà, ñïèñîê àêèêîâ, è óñòàíîâêè óðîâíåé äîñòóïà íà êàíàëå. @@ -4797,7 +4862,30 @@ CHAN_SERVADMIN_HELP_STATUS # ########################################################################### -MEMO_HELP +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 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 îòïðàâëÿåò ìåìêó âñåì çàðåãèñòðèðîâàííûì ïîëüçîâàòåëÿì +MEMO_HELP_CMD_STAFF + STAFF Îòïðàâëÿåò ìåìêó âñåì îïåðàòîðàì/àäìèíèñòðàòîðàì ñåðâèñîâ + +MEMO_HELP_HEADER %S ýòî óäîáíûé ñåðâèñ, ïîçâîëÿþùèé ïîëüçîâàòåëÿì IRC îòïðàâëÿòü êîðîòêèå ñîîáùåíèÿ äðóãèì ïîëüçîâàòåëÿì, êîòîðûõ íåò â äàííûé ìîìåíò â ñåòè, èëè íà êàíàëû(*). Íèê îòïðàâèòåëÿ, êàê è @@ -4806,20 +4894,11 @@ MEMO_HELP %S's âêëþ÷àåò êîìàíäû: - SEND Îòïðàâèòü ìåìî íà íèê èëè êàíàë - CANCEL Îòìåíèòü ïîñëåäíþþ îòïðàâëåííóþ Âàìè ìåìêó - LIST Ñïèñîê Âàøèõ ìåìîê - READ ×èòàòü ìåìêè - DEL Óäàëÿòü ìåìêè - SET Óñòàíîâêà îïöèé äëÿ ìåìîê - INFO ïîêàçàòü èíôîðìàöèþ î Âàøèõ ìåìêàõ MEMO_HELP_ADMIN - SENDALL îòïðàâëÿåò ìåìêó âñåì çàðåãèñòðèðîâàííûì ïîëüçîâàòåëÿì - + not used. MEMO_HELP_OPER - STAFF Îòïðàâëÿåò ìåìêó âñåì îïåðàòîðàì/àäìèíèñòðàòîðàì ñåðâèñîâ - + not used. MEMO_HELP_FOOTER Íàïèøèòå /msg %S HELP êîìàíäà äëÿ ïîëó÷åíèÿ áîëåå ïîäðîáíîé @@ -5013,82 +5092,89 @@ MEMO_HELP_CHECK # ########################################################################### -OPER_HELP - %S commands: +OPER_HELP_CMD_GLOBAL GLOBAL Ïîñëàòü ñîîáùåíèå âñåì ïîëüçîâàòåëÿì +OPER_HELP_CMD_STATS STATS Ïîêàçàòü ñòàòèñòèêó ñåðâèñîâ è ñåòè - OPER LIST Ñïèñîê Îïåðàòîðîâ ñåðâèñîâ - ADMIN LIST Ñïèñîê Àäìèíèñòðàòîðîâ Ñåðâèñîâ +OPER_HELP_CMD_OPER + OPER Óïðàâëåíèå ñïèñêîì Îïåðàòîðîâ ñåðâèñîâ +OPER_HELP_CMD_ADMIN + ADMIN Óïðàâëåíèå ñïèñêîì àäìèíèñòðàòîðîâ ñåðâèñîâ +OPER_HELP_CMD_STAFF STAFF Ñïèñîê âñåõ ïðîïèñàííûõ íà ñåðâèñàõ è èõ îíëàéí-ñòàòóñ - -OPER_HELP_OPER_CMD - Êîìàíäû, äîñòóïíûå òîëüêî Îïåðàòîðàì è Àäìèíèñòðàòîðàì ñåðâèñîâ è: +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_OPER_CMD_EXTRA - Following commands are also available - -OPER_HELP_OPER_CMD_SGLINE +OPER_HELP_CMD_SGLINE SGLINE Óïðàâëåíèå ñïèñêîì SGLINE'îâ - -OPER_HELP_OPER_CMD_SQLINE +OPER_HELP_CMD_SQLINE SQLINE Óïðàâëåíèå ñïèñêîì SQLINE'îâ - -OPER_HELP_OPER_CMD_SZLINE +OPER_HELP_CMD_SZLINE SZLINE Óïðàâëåíèå ñïèñêîì SZLINE'îâ - - -OPER_HELP_ADMIN_CMD - Êîìàíäû, äîñòóïíûå òîëüêî Àäìèíèñòðàòîðàì ñåðâèñîâ: - OPER Óïðàâëåíèå ñïèñêîì Îïåðàòîðîâ ñåðâèñîâ +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 Ïîñìîòðåòü ñïèñîê òåêóùèõ ñîåäèíåíèé +OPER_HELP_CMD_EXCEPTION EXCEPTION Óïðàâëåíèå ñïèñêîì èñêëþ÷åíèé èç ëèìèòà ñåññèé - CACHE Ñïèñîê êýøèðîâàííûõ õîñòîâ, èñïîëüçóåìûõ äåòåêòîðîì ïðîêñè +OPER_HELP_CMD_NOOP NOOP Âðåìåííî óäàëèòü âñå O:ëàéíû íà óêàçàííîì - ñåðâåðå + ñåðâåðå +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 Ïðèáèòü âñåõ ïîëüçîâàòåëåé íà îïðåäåëåííîì êàíàëå - - Êîìàíäû, äîñòóïíûå òîëüêî ñóïåðïîëüçîâàòåëþ ñåðâèñîâ: - ADMIN Óïðàâëåíèå ñïèñêîì àäìèíèñòðàòîðîâ ñåðâèñîâ - -OPER_HELP_ADMIN_CMD_EXTRA - Following commands are also available to Service Admins - -OPER_HELP_ADMIN_CMD_OLINE +OPER_HELP_CMD_OLINE OLINE Óñòàíîâèòü ôëàãè IRC Îïåðàòîðîâ îïðåäåëåííîìó ïîëüçîâàòåëþ - -OPER_HELP_ADMIN_CMD_UMODE +OPER_HELP_CMD_UMODE UMODE Èçìåíåíèå ðåæèìîâ ïîëüçîâàòåëÿ - -OPER_HELP_ADMIN_CMD_SVSNICK +OPER_HELP_CMD_SVSNICK SVSNICK Ñìåíèòü íèê ïîëüçîâàòåëþ - -OPER_HELP_ROOT_CMD - Êîìàíäû, äîñòóïíû òîëüêî ñóïåðïîëüçîâàòåëÿì ñåðâèñîâ: +OPER_HELP_CMD_MODLOAD MODLOAD Çàãðóçèòü ìîäóëü +OPER_HELP_CMD_MODUNLOAD MODUNLOAD Âûãðóçèòü ìîäóëü - MODLIST Ñïèñîê çàãðóæåííûõ ìîäóëåé +OPER_HELP_CMD_MODINFO MODINFO Èíôîðìàöèÿ î çàãðóæåííîì ìîäóëå +OPER_HELP_CMD_MODLIST + MODLIST Ñïèñîê çàãðóæåííûõ ìîäóëåé + +OPER_HELP + %S commands: OPER_HELP_LOGGED Âíèìàíèå: Âñå êîìàíäû %S'ó çàïèñûâàþòñÿ â ëîã! @@ -5694,7 +5780,29 @@ OPER_HELP_MODLIST # BotServ help messages # ########################################################################### - + + +BOT_HELP_CMD_BOTLIST + BOTLIST Ñïèñîê äîñòóïíûõ äëÿ óñòàíîâêè áîòîâ +BOT_HELP_CMD_ASSIGN + ASSIGN Óñòàíîâèòü áîòà íà êàíàë +BOT_HELP_CMD_SET + SET Êîíôèãóðèðîâàòü íàñòðîéêè áîòà +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_HELP %S ïîçâîëÿåò Âàì ïîâåñèòü áîòà íà ñâîé êàíàë. Ýòî ñäåëàíî äëÿ òåõ, êòî íå ìîæåò èíà÷å óñòàíîâèòü èëè @@ -5704,14 +5812,7 @@ BOT_HELP áîëåå ïîäðîáíîé èíôîðìàöèè ïî êîíêðåòíîé êîìàíäå, íàïèøèòå /msg %S HELP êîìàíäà. - BOTLIST Ñïèñîê äîñòóïíûõ äëÿ óñòàíîâêè áîòîâ - ASSIGN Óñòàíîâèòü áîòà íà êàíàë - SET Êîíôèãóðèðîâàòü íàñòðîéêè áîòà - KICK Êîíôèãóðèðîâàòü çà ÷òî áîò áóäåò êèêàòü è áàíèòü - BADWORDS Óïðàâëåíèå ñïèñêîì ïëîõèõ ñëîâ - - Äðóãèå êîìàíäû: ACT INFO SAY UNASSIGN - +BOT_HELP_FOOTER Áîò ïðèñîåäèíèòñÿ ê êàíàëó ïîñëå òîãî, êàê íà íåì îêàæåòñÿ íå ìåíåå %d ïîëüçîâàòåëåé. @@ -5972,17 +6073,10 @@ BOT_HELP_ACT Çàñòàâëÿåò áîòà âûïîëíèòü êîìàíäó, ýêâèâàëåíòíóþ êîìàíäó "/me" íà óêàçàííîì êàíàëå, èñïîëüçîâàâ óêàçàííûé òåêñò. -BOT_SERVADMIN_HELP - - Íèæåñëåäóþùèå êîìàíäû äîñòóïíû äëÿ Àäìèíèñòðàòîðîâ ñåðâèñîâ: - - BOT Óïðàâëåíèå áîòàìè - BOT_SERVADMIN_HELP_BOT Ñèíòàêñèñ: BOT ADD íèê èäåíò õîñò ðåàëüíîå èìÿ BOT CHANGE ñòàðûé íèê íîâûé íèê [èäåíò [õîñò [ðåàëüíîå èìÿ]]] BOT DEL íèê - BOT LIST Ïîçâîëÿåò Àäìèíèñòðàòîðàì ñåðâèñîâ ñîçäàâàòü, èçìåíÿòü è óäàëÿòü áîòîâ, êîòîðûå ìîãóò áûòü â äàëüíåéøåì èñïîëüçîâàíû ïîëüçîâàòåëÿìè @@ -5995,8 +6089,6 @@ BOT_SERVADMIN_HELP_BOT èëè ðåàëüíîå èìÿ áîòà áåç óäàëåíèÿ åãî (è âñåõ åãî íàñòðîåê). BOT DEL óäàëÿåò óêàçàííîãî áîòà èç ñïèñêà áîòîâ. - BOT LIST èëè BOTLIST ïîêàæåò ñïèñîê - âñåõ äîñòóïíûõ â ñåòè áîòîâ. Ïðèìå÷àíèå: Åñëè Âû ñîçäàëè áîòà ñ íèêîì, ðàíåå êåì-òî çàðåãèñòðèðîâàííûì, ýòîò íèê áóäåò óäàëåí. À òàêæå, åñëè êòî-òî èñïîëüçóåò äàííûé íèê @@ -6101,22 +6193,31 @@ HOST_LIST_KEY_FOOTER # HostServ Help messages # ########################################################################### -HOST_HELP - %S commands: +HOST_HELP_CMD_ON ON Àêòèâèðóåò íàçíà÷åííûé Âàì âèðòóàëüíûé õîñò +HOST_HELP_CMD_OFF OFF Äåàêòèâèðóåò âèðòóàëüíûé õîñò +HOST_HELP_CMD_GROUP GROUP Óñòàíàâëèâàåò è ñèíõðîíèçèðóåò âèðòóàëüíûé õîñò äëÿ âñåõ íèêîâ â Âàøåé ãðóïïå -HOST_OPER_HELP - Êîìàíäû, äîñòóïíûå òîëüêî Îïåðàòîðàì õîñòîâ (setter/removers): + +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_HELP + %S commands: +HOST_OPER_HELP + not used. HOST_ADMIN_HELP - Êîìàíäû, äîñòóïíûå òîëüêî Àäìèíèñòðàòîðàì ñåðâèñîâ: - LIST Ïîêàæåò ñïèñîê âèðòóàëüíûõ õîñòîâ. + not used. HOST_HELP_ON Ñèíòàêñèñ: ON @@ -1919,7 +1919,7 @@ 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 @@ -2882,7 +2882,7 @@ OPER_MODULE_UNLOAD_SYNTAX OPER_MODULE_LIST_HEADER Current Module list: OPER_MODULE_LIST - Module: %s [%s] + Module: %s [%s] [%s] OPER_MODULE_LIST_FOOTER %d Modules loaded. OPER_MODULE_INFO_LIST @@ -3277,27 +3277,66 @@ HELP_HELP_HOST # 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 - %S nickinizi "kayýt" etmenizi ve diðerlerinin nickinizi - kullanmalarýný engellemeyi saðlar. Aþaðýdaki komutlar nicki - kayýt etmeye ve korumaya izin verir, kullanmak için, - /msg %S komut yazýn. Belirli bir komut hakkýnda daha - fazla bilgi için, /msg %S HELP komut yazýn. - +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_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 + 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, + /msg %S komut yazýn. Belirli bir komut hakkýnda daha + fazla bilgi için, /msg %S HELP komut yazýn. - Diðer komutlar: GHOST, GLIST, INFO, LIST, LOGOUT, STATUS - +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 @@ -3707,13 +3746,6 @@ NICK_HELP_SENDPASS Eðer þifreleme(encryption) aktifse bu komut devre dýþý kalýr. NICK_SERVADMIN_HELP - - Aþaðýdaki komutlarý Servis adminleri kullanabilir: - - GETPASS Bir nickin þifresini öðrenmek içindir - (Sadece þifreleme(encryption) devre dýþýysa) - FORBID Bir nickin kullanýlmasýný yasaklar - Servis adminleri herhangi bir nickin tanýtmasýna gerek olmadan kaydýný silebilir(drop) ve herhangi bir nickin access listesini görüntüleyebilir. (/msg %S ACCESS LIST nick). @@ -3874,6 +3906,85 @@ NICK_SERVADMIN_HELP_UNSUSPEND # 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 @@ -3883,43 +3994,8 @@ CHAN_HELP listelenmiþtir; onlarý kullanmak için /msg %S komut yazýn. Belirli bir komut hakkýnda daha fazla bilgi için, /msg %S HELP komut yazýn. + - REGISTER Kanalý kaydeder - IDENTIFY Þifreyle sizi kanalýn sahibi olarak tanýmlar - SET Kanal özelliklerini ve bilgisini ayarlar - AOP AOP listesini düzenler - SOP SOP listesini düzenler - ACCESS Ayrýcalýklý kullanýcýlarý belirler deðiþtirir - LEVELS Access seviyelerini isteðinize göre düzenler - AKICK Autokick listesini düzenler - DROP Kanal kaydýný siler - SENDPASS Kayýp þifrelerinizi söyler - - Diðer komutlar: BAN, CLEAR, DEOP, DEVOICE, GETKEY, INFO, - INVITE, KICK, LIST, LOGOUT, OP, TOPIC, - UNBAN, VOICE, VOP - -CHAN_HELP_UNREAL - - Bu networkte bu komutlarda mevcuttur: - DEHALFOP, DEOWNER, DEPROTECT, HALFOP, HOP, OWNER, - PROTECT - -CHAN_HELP_ULTIMATE3 - - Bu networkte bu komutlarda mevcuttur: - DEHALFOP, HALFOP, HOP, ADMIN, DEADMIN - -CHAN_HELP_IRCD_HALFOP - - These commands are also available on this network: - DEHALFOP, HALFOP, HOP - -CHAN_HELP_IRCD_PROTECT - - These commands are also available on this network: - DEPROTECT, PROTECT - CHAN_HELP_EXPIRES Unutmayýn %d gün kullanýlmayan kanallarýn @@ -4709,14 +4785,6 @@ CHAN_HELP_SENDPASS CHAN_SERVADMIN_HELP - Aþaðýdaki komutlar servis adminleri tarafýndan kullanýlabilir: - - GETPASS Bir kanalýn founder þifresini ister - (sadece þifreleme(encryption) devre dýþýysa) - FORBID Kanalý kullanýma kapatýr - STATUS Kullanýcýnýn kanaldaki access seviyesini söyler - CLIST Bir kullanýcýnýn founder olduðu kanallarý listeler - Servis adminleri kanalýn kaydýný þifreyle tanýtmadan silebilir, ve access, Akick ve seviye ayarlarýný görüntüleyebilirler. @@ -4834,7 +4902,30 @@ CHAN_SERVADMIN_HELP_STATUS # ########################################################################### -MEMO_HELP +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ý @@ -4842,19 +4933,11 @@ MEMO_HELP %S'ün mevcut komutlarý: - SEND Nicke veya kanala mesaj gönderir - CANCEL Son gönderilen mesajý iptal eder - LIST Mesajlarýnýzý listeler - READ Mesajlarý okumanýzý saðlar - DEL Mesajlarý silmenizi saðlar - SET Mesajlarla ilgili ayarlarý yapar MEMO_HELP_ADMIN - SENDALL Send a memo to all registered users - + not used. MEMO_HELP_OPER - STAFF Send a memo to all opers/admins - + not used. MEMO_HELP_FOOTER Yukardaki herhangi bir komut hakkýnda yardým için @@ -5055,81 +5138,92 @@ MEMO_HELP_CHECK # ########################################################################### -OPER_HELP - %S commands: +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 LIST Tüm Servis operatörlerini listeler - ADMIN LIST Tüm Servis adminlerini listeler +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_OPER_CMD - Sadece Servis operatörleri ve adminleri için geçerli komutlar: +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_OPER_CMD_EXTRA - Following commands are also available - -OPER_HELP_OPER_CMD_SGLINE +OPER_HELP_CMD_SGLINE SGLINE SGLINE listesini düzenler - -OPER_HELP_OPER_CMD_SQLINE +OPER_HELP_CMD_SQLINE SQLINE SQLINE listesini düzenler - -OPER_HELP_OPER_CMD_SZLINE +OPER_HELP_CMD_SZLINE SZLINE SZLINE listesini düzenler - -OPER_HELP_ADMIN_CMD - Sadece Servis adminleri için geçerli komutlar: - CACHE Proxy detectörü tarafindan kullanilan hostname - cache listesini gösterir - SESSION Host session(oturum) larýn listesini gösterir - EXCEPTION Session-limit exception listesini düzenler +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 Servis operatör listesini düzenler +OPER_HELP_CMD_LOGONNEWS LOGONNEWS Baðlantý sýrasýnda kullanýcýnýn göreceði mesajý - belirler + belirler +OPER_HELP_CMD_RANDOMNEWS RANDOMNEWS Baglanti sirasina kullaniciya gönderilen karisik - mesajlari belirler + mesajlari belirler +OPER_HELP_CMD_OPERNEWS OPERNEWS Oper olan kullanýcýlarýn görüntüleyeceði mesajý - belirler + 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 - UPDATE Diskteki Servis veritabanýnýn hemen - güncellenmesini saðlar +OPER_HELP_CMD_RELOAD RELOAD Servislerin conf dosyasýný yeniden yükler - QUIT Servis programýný kapatýr - RESTART Veritabanýný kaydeder ve servisleri yeniden - baþlatýr - SHUTDOWN Servisler programýný kayýt ederek kapatýr - - Sadece Servis super-user(root) larý için geçerli komutlar: - ADMIN Servis adminleri listesini düzenler +OPER_HELP_CMD_UPDATE + UPDATE Diskteki Servis veritabanýnýn hemen + güncellenmesini saðlar -OPER_HELP_ADMIN_CMD_EXTRA - Following commands are also available to Service Admins +OPER_HELP_CMD_RESTART + RESTART Veritabanýný kaydeder ve servisleri yeniden + baþlatýr -OPER_HELP_ADMIN_CMD_OLINE +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_ADMIN_CMD_UMODE +OPER_HELP_CMD_UMODE UMODE Change a user's modes - -OPER_HELP_ADMIN_CMD_SVSNICK +OPER_HELP_CMD_SVSNICK SVSNICK Forcefully change a user's nickname - -OPER_HELP_ROOT_CMD - Commands available to Serivces Roots only: +OPER_HELP_CMD_MODLOAD MODLOAD Load a module +OPER_HELP_CMD_MODUNLOAD MODUNLOAD Un-Load a module - MODLIST List loaded modules +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! @@ -5719,7 +5813,29 @@ OPER_HELP_MODLIST # 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 @@ -5729,14 +5845,7 @@ BOT_HELP daha fazla bilgi için, /msg %S HELP komut yazýn. - BOTLIST Mevcut botlarý listeler - ASSIGN Kanala bot sokar - SET Bot özelliklerini ayarlar - KICK Atma özelliklerini ayarlar - BADWORDS Küfür listesi oluþturur - - Diðer komutlar: ACT INFO SAY UNASSIGN - +BOT_HELP_FOOTER Kanalda en az %d kullanýcý olduðu zaman bot kanala girer. BOT_HELP_BOTLIST @@ -5984,17 +6093,10 @@ BOT_HELP_ACT Botun belirtilen yazýyla belirtilen kanalda "/me" komutunun yaptýðýný kendi üzerinde yapmasýný saðlar. -BOT_SERVADMIN_HELP - - Aþaðýdaki komut Servis adminleri tarafýndan kullanýlýr: - - BOT Networkün bot listesini düzenler - BOT_SERVADMIN_HELP_BOT Kullanýmý: BOT ADD nick user host gerçekismi BOT CHANGE eskinick yeninick [user [host [gerçekismi]]] BOT DEL nick - BOT LIST Servis adminlerinin kullanýcýlarýn kanallarýnda kullanmasý için botlarý yaratmasýný, deðiþtirmesini ve silmesini saðlar. @@ -6005,8 +6107,6 @@ BOT_SERVADMIN_HELP_BOT BOT CHANGE botun nickini, username ini, hostname ini veya gerçek ismini silmeye gerek kalmadan deðiþtirmeyi saðlar. BOT DEL belirtilen botu bot listesinden siler. - BOT LIST komutu BOTLIST ile aynýdýr ve sadece networkteki - mevcut botlarý listeler. Not: Eðer botun nicki olarak, kayýtlý bir nick kullanýrsanýz o nickin kaydý silinir(drop). Ayrýca diff --git a/makefile.inc.win32 b/makefile.inc.win32 index 6ee9f2a33..62448d015 100644 --- a/makefile.inc.win32 +++ b/makefile.inc.win32 @@ -12,25 +12,6 @@ # Please read and edit the configurations options below. -# Set which IRCd to compile for -# 1 DreamForge 4.6.7 [dated IRCd, upgrade to a current one] -# 2 Bahamut 1.4.27 [or later] -# 3 UnrealIRCd 3.1.1 [or later] -# 4 UltimateIRCd 2.8.2 [or later] -# 5 UltimateIRCd 3.0.0 [alpha26 or later] -# 6 Hybrid IRCd 7.0 [experimental] -# 7 ViagraIRCd 1.3.x [or later] -# 8 PTlink 6.15.0 [experimental] -# 9 RageIRCd 2.0 [beta-3 or later] -# 10 Unreal 3.2 [Unreal 3.2 beta19 or later] (default) -# 11 Solid IRCD 3.4.x [Solid IRCD 3.4.6 or later] -# 12 Plexus 2.0 [or later] -# 13 Ratbox 2.0.6 [or later] -# 14 ShadowIRCD 4.0x [beta 7 or later] - -IRCD=10 - - # Set this to 1 to enable MySQL support USE_MYSQL=0 # Set this to the path where the MySQL includes can be found @@ -53,7 +34,7 @@ DATDEST=data # 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 +# Eg: LIBPATH=C:\\Program Files\\Microsoft Visual Studio .NET 2003\\Vc7\\lib # LIBPATH= @@ -74,68 +55,6 @@ LIBS=wsock32.lib advapi32.lib /NODEFAULTLIB:libcmtd.lib ELIBS= MLIBS= -!IFNDEF IRCTYPE -!IF $(IRCD) == 1 -IRCTYPE=IRC_DREAMFORGE -CAPAB_C=dreamforge.c -CAPAB_O=dreamforge.obj -!ELSEIF $(IRCD) == 2 -IRCTYPE=/D IRC_BAHAMUT -CAPAB_C=bahamut.c -CAPAB_O=bahamut.obj -!ELSEIF $(IRCD) == 3 -IRCTYPE=/D IRC_UNREAL31 -CAPAB_C=unreal31.c -CAPAB_O=unreal31.obj -!ELSEIF $(IRCD) == 4 -IRCTYPE=/D IRC_ULTIMATE2 -CAPAB_C=ultimate2.c -CAPAB_O=ultimate2.obj -!ELSEIF $(IRCD) == 5 -IRCTYPE=/D IRC_ULTIMATE33 -CAPAB_C=ultimate3.c -CAPAB_O=ultimate3.obj -!ELSEIF $(IRCD) == 6 -IRCTYPE=/D IRC_HYBRID -CAPAB_C=hybrid.c -CAPAB_O=hybrid.obj -!ELSEIF $(IRCD) == 7 -IRCTYPE=/D IRC_VIAGRA -CAPAB_C=hybrid.c -CAPAB_O=hybrid.obj -!ELSEIF $(IRCD) == 8 -IRCTYPE=/D IRC_PTLINK -CAPAB_C=ptlink.c -CAPAB_O=ptlink.obj -!ELSEIF $(IRCD) == 9 -IRCTYPE=/D IRC_RAGE2 -CAPAB_C=rageircd.c -CAPAB_O=rageircd.obj -!ELSEIF $(IRCD) == 10 -IRCTYPE=/D IRC_UNREAL32 -CAPAB_C=unreal32.c -CAPAB_O=unreal32.obj -!ELSEIF $(IRCD) == 11 -IRCTYPE=/D IRC_SOLID -CAPAB_C=solidircd.c -CAPAB_O=solidircd.obj -!ELSEIF $(IRCD) == 12 -IRCTYPE=/D IRC_PLEXUS -CAPAB_C=plexus.c -CAPAB_O=plexus.obj -!ELSEIF $(IRCD) == 13 -IRCTYPE=/D IRC_RATBOX -CAPAB_C=ratbox.c -CAPAB_O=ratbox.obj -!ELSEIF $(IRCD) == 14 -IRCTYPE=/D IRC_SHADOWIRCD -CAPAB_C=shadowircd.c -CAPAB_O=shadowircd.obj -!ELSE -!ERROR Invalid IRCd -!ENDIF -!ENDIF - !IF $(USE_MYSQL) == 1 !IF $(MYSQL_LIB) != "" LIBS=$(LIBS) /LIBPATH:$(MYSQL_LIB) diff --git a/src/Makefile b/src/Makefile index f80b157ac..4fb8e9467 100644 --- a/src/Makefile +++ b/src/Makefile @@ -2,26 +2,21 @@ MYSQL_OBJ = $(MYSQL:.c=.o) RDB_OBJ = $(RDB:.c=.o) IRCD_OBJ = $(IRCDFILE:.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 language.o list.o log.o mail.o main.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 \ - $(VSNPRINTF_O) $(RDB_OBJ) $(MYSQL_OBJ) $(IRCD_OBJ) + process.o send.o servers.o sessions.o slist.o sockutil.o timeout.o users.o \ + $(VSNPRINTF_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 language.c list.c log.c mail.c main.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 \ - $(VSNPRINTF_C) $(RDB) $(MYSQL) $(IRCDFILE) + $(VSNPRINTF_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 \ - ../include/dreamforge.h ../include/bahamut.h ../include/ultimate2.h \ - ../include/ultimate3.h ../include/hybrid.h ../include/ptlink.h ../include/unreal31.h \ - ../include/viagra.h ../include/rageircd.h ../include/unreal32.h ../include/solidircd.h \ - ../include/plexus.h ../include/shadowircd.h - + ../include/modules.h ../include/slist.h MAKEARGS = 'CFLAGS=${CFLAGS}' 'CC=${CC}' 'ANOPELIBS=${ANOPELIBS}' \ 'LDFLAGS=${LDFLAGS}' 'BINDEST=${BINDEST}' 'INSTALL=${INSTALL}' \ @@ -54,6 +49,7 @@ 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) @@ -84,15 +80,29 @@ rdb.o: rdb.c $(INCLUDES) modules: DUMMY (cd modules ; ./configure ; ${MAKE} ${MAKEARGS} all) -clean: clean_modules +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} ${MAKEARGS} clean) +clean_protocols: + @touch protocol/Makefile.inc + (cd protocol ; ${MAKE} ${MAKEARGS} clean) + +clean_core: + @touch core/Makefile.inc + (cd core ; ${MAKE} ${MAKEARGS} clean) spotless: clean (cd modules ; ${MAKE} ${MAKEARGS} distclean) + (cd protocol ; ${MAKE} ${MAKEARGS} distclean) + (cd core ; ${MAKE} ${MAKEARGS} distclean) install: services test -d ${BINDEST} || mkdir ${BINDEST} @@ -110,6 +120,8 @@ install: services 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) ; \ diff --git a/src/bin/am b/src/bin/am index c8e693b2e..44a091c1c 100755 --- a/src/bin/am +++ b/src/bin/am @@ -423,6 +423,14 @@ NOTES : "; } 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 diff --git a/src/botserv.c b/src/botserv.c index 0eec8f8d9..961f07cee 100644 --- a/src/botserv.c +++ b/src/botserv.c @@ -17,15 +17,6 @@ #include "services.h" #include "pseudo.h" -/** - * RFC: defination of a valid nick - * nickname = ( letter / special ) *8( letter / digit / special / "-" ) - * letter = %x41-5A / %x61-7A ; A-Z / a-z - * digit = %x30-39 ; 0-9 - * special = %x5B-60 / %x7B-7D ; "[", "]", "\", "`", "_", "^", "{", "|", "}" - **/ -#define isvalidnick(c) ( isalnum(c) || ((c) >='\x5B' && (c) <='\x60') || ((c) >='\x7B' && (c) <='\x7D') || (c)=='-' ) - /*************************************************************************/ @@ -36,62 +27,17 @@ int nbots = 0; BotInfo *makebot(char *nick); static UserData *get_user_data(Channel * c, User * u); -static void unassign(User * u, ChannelInfo * ci); +E void unassign(User * u, ChannelInfo * ci); static void check_ban(ChannelInfo * ci, User * u, int ttbtype); static void bot_kick(ChannelInfo * ci, User * u, int message, ...); -static void bot_raw_ban(User * requester, ChannelInfo * ci, char *nick, - char *reason); -static void bot_raw_kick(User * requester, ChannelInfo * ci, char *nick, - char *reason); -static void bot_raw_mode(User * requester, ChannelInfo * ci, char *mode, - char *nick); - -static int do_help(User * u); -static int do_bot(User * u); -static int do_botlist(User * u); -static int do_assign(User * u); -static int do_unassign(User * u); -static int do_info(User * u); -static int do_set(User * u); -static int do_kickcmd(User * u); -static int do_badwords(User * u); -static int do_say(User * u); -static int do_act(User * u); -void moduleAddBotServCmds(void); + +E void moduleAddBotServCmds(void); /*************************************************************************/ /* *INDENT-OFF* */ void moduleAddBotServCmds(void) { - Command *c; - c = createCommand("HELP",do_help,NULL, -1,-1,-1,-1,-1); addCoreCommand(BOTSERV,c); - c = createCommand("BOTLIST", do_botlist, NULL, BOT_HELP_BOTLIST, -1,-1,-1,-1); addCoreCommand(BOTSERV,c); - c = createCommand("ASSIGN", do_assign, NULL, BOT_HELP_ASSIGN, -1,-1,-1,-1); addCoreCommand(BOTSERV,c); - c = createCommand("UNASSIGN", do_unassign, NULL, BOT_HELP_UNASSIGN, -1,-1,-1,-1); addCoreCommand(BOTSERV,c); - c = createCommand("INFO", do_info, NULL, BOT_HELP_INFO, -1,-1,-1,-1); addCoreCommand(BOTSERV,c); - c = createCommand("SET", do_set, NULL, BOT_HELP_SET, -1,-1,BOT_SERVADMIN_HELP_SET, BOT_SERVADMIN_HELP_SET); addCoreCommand(BOTSERV,c); - c = createCommand("SET DONTKICKOPS", NULL, NULL, BOT_HELP_SET_DONTKICKOPS, -1,-1,-1,-1); addCoreCommand(BOTSERV,c); - c = createCommand("SET DONTKICKVOICES", NULL, NULL, BOT_HELP_SET_DONTKICKVOICES, -1,-1,-1,-1); addCoreCommand(BOTSERV,c); - c = createCommand("SET FANTASY", NULL, NULL, BOT_HELP_SET_FANTASY, -1,-1,-1,-1); addCoreCommand(BOTSERV,c); - c = createCommand("SET GREET", NULL, NULL, BOT_HELP_SET_GREET, -1,-1,-1,-1); addCoreCommand(BOTSERV,c); - c = createCommand("SET SYMBIOSIS", NULL, NULL, BOT_HELP_SET_SYMBIOSIS, -1,-1,-1,-1); addCoreCommand(BOTSERV,c); - c = createCommand("KICK", do_kickcmd, NULL, BOT_HELP_KICK, -1,-1,-1,-1); addCoreCommand(BOTSERV,c); - c = createCommand("KICK BADWORDS", NULL, NULL, BOT_HELP_KICK_BADWORDS, -1,-1,-1,-1); addCoreCommand(BOTSERV,c); - c = createCommand("KICK BOLDS", NULL, NULL, BOT_HELP_KICK_BOLDS, -1,-1,-1,-1); addCoreCommand(BOTSERV,c); - c = createCommand("KICK CAPS", NULL, NULL, BOT_HELP_KICK_CAPS, -1,-1,-1,-1); addCoreCommand(BOTSERV,c); - c = createCommand("KICK COLORS", NULL, NULL, BOT_HELP_KICK_COLORS, -1,-1,-1,-1); addCoreCommand(BOTSERV,c); - c = createCommand("KICK FLOOD", NULL, NULL, BOT_HELP_KICK_FLOOD, -1,-1,-1,-1); addCoreCommand(BOTSERV,c); - c = createCommand("KICK REPEAT", NULL, NULL, BOT_HELP_KICK_REPEAT, -1,-1,-1,-1); addCoreCommand(BOTSERV,c); - c = createCommand("KICK REVERSES", NULL, NULL, BOT_HELP_KICK_REVERSES, -1,-1,-1,-1); addCoreCommand(BOTSERV,c); - c = createCommand("KICK UNDERLINES", NULL, NULL, BOT_HELP_KICK_UNDERLINES, -1,-1,-1,-1); addCoreCommand(BOTSERV,c); - c = createCommand("BADWORDS", do_badwords, NULL, BOT_HELP_BADWORDS, -1,-1,-1,-1); addCoreCommand(BOTSERV,c); - c = createCommand("SAY", do_say, NULL, BOT_HELP_SAY, -1,-1,-1,-1); addCoreCommand(BOTSERV,c); - c = createCommand("ACT", do_act, NULL, BOT_HELP_ACT, -1,-1,-1,-1); addCoreCommand(BOTSERV,c); - - /* Services admins commands */ - c = createCommand("BOT", do_bot, is_services_admin, -1,-1, -1,BOT_SERVADMIN_HELP_BOT, BOT_SERVADMIN_HELP_BOT); addCoreCommand(BOTSERV,c); - c = createCommand("SET NOBOT", NULL, NULL, -1,-1, -1,BOT_SERVADMIN_HELP_SET_NOBOT, BOT_SERVADMIN_HELP_SET_NOBOT); addCoreCommand(BOTSERV,c); - c = createCommand("SET PRIVATE", NULL, NULL, -1,-1, -1,BOT_SERVADMIN_HELP_SET_PRIVATE, BOT_SERVADMIN_HELP_SET_PRIVATE); addCoreCommand(BOTSERV,c); + modules_core_init(BotServCoreNumber, BotServCoreModules); } /* *INDENT-ON* */ /*************************************************************************/ @@ -192,6 +138,7 @@ void botchanmsgs(User * u, ChannelInfo * ci, char *buf) int16 cstatus = 0; char *cmd; UserData *ud; + int found = 0; if (!u || !buf || !ci) { @@ -459,149 +406,13 @@ void botchanmsgs(User * u, ChannelInfo * ci, char *buf) && check_access(u, ci, CA_FANTASIA)) { cmd = strtok(buf, " "); - if (cmd) { - if (!stricmp(cmd, "!deowner") && ircd->owner) { - if (is_founder(u, ci)) - bot_raw_mode(u, ci, ircd->ownerunset, u->nick); - } else if (!stricmp(cmd, "!kb")) { - char *target = strtok(NULL, " "); - char *reason = strtok(NULL, ""); - - if (!target && check_access(u, ci, CA_BANME)) { - bot_raw_ban(u, ci, u->nick, "Requested"); - } else if (target && check_access(u, ci, CA_BAN)) { - if (!stricmp(target, ci->bi->nick)) { - bot_raw_ban(u, ci, u->nick, "Oops!"); - } else { - if (!reason) - bot_raw_ban(u, ci, target, "Requested"); - else - bot_raw_ban(u, ci, target, reason); - } - } - } else if ((!stricmp(cmd, "!kick")) || (!stricmp(cmd, "!k"))) { - char *target = strtok(NULL, " "); - char *reason = strtok(NULL, ""); - - if (!target && check_access(u, ci, CA_KICKME)) { - bot_raw_kick(u, ci, u->nick, "Requested"); - } else if (target && check_access(u, ci, CA_KICK)) { - if (!stricmp(target, ci->bi->nick)) - bot_raw_kick(u, ci, u->nick, "Oops!"); - else if (!reason) - bot_raw_kick(u, ci, target, "Requested"); - else - bot_raw_kick(u, ci, target, reason); - } - } else if (!stricmp(cmd, "!owner") && ircd->owner) { - if (is_founder(u, ci)) - bot_raw_mode(u, ci, ircd->ownerset, u->nick); - } else if (!stricmp(cmd, "!seen")) { - char *target = strtok(NULL, " "); - char buf[BUFSIZE]; - - if (target) { - User *u2; - NickAlias *na; - ChanAccess *access; - - if (!stricmp(ci->bi->nick, target)) { - /* If we look for the bot */ - snprintf(buf, sizeof(buf), - getstring(u->na, BOT_SEEN_BOT), u->nick); - 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); - } - } - } else if (!stricmp(cmd, "!unban") - && check_access(u, ci, CA_UNBAN)) { - char *target = strtok(NULL, " "); - - if (!target) - common_unban(ci, u->nick); - else - common_unban(ci, target); - } else { - CSModeUtil *util = csmodeutils; - - do { - if (!stricmp(cmd, util->bsname)) { - char *target = strtok(NULL, " "); - - if (!target - && check_access(u, ci, util->levelself)) - bot_raw_mode(u, ci, util->mode, u->nick); - else if (target - && check_access(u, ci, util->level)) - bot_raw_mode(u, ci, util->mode, target); - } - } while ((++util)->name != NULL); - } + if (cmd && (cmd[0] == '!')) { + char *params = strtok(NULL, ""); + if (params) + send_event(EVENT_BOT_FANTASY, 4, cmd, u->nick, ci->name, + params); + else + send_event(EVENT_BOT_FANTASY, 3, cmd, u->nick, ci->name); } } } @@ -732,7 +543,7 @@ void save_bs_rdb_dbase(void) /* Inserts a bot in the bot list. I can't be much explicit mh? */ -static void insert_bot(BotInfo * bi) +void insert_bot(BotInfo * bi) { BotInfo *ptr, *prev; @@ -772,46 +583,9 @@ BotInfo *makebot(char *nick) /*************************************************************************/ -static void change_bot_nick(BotInfo * bi, char *newnick) -{ - if (bi->next) - bi->next->prev = bi->prev; - if (bi->prev) - bi->prev->next = bi->next; - else - botlists[tolower(*bi->nick)] = bi->next; - - if (bi->nick) - free(bi->nick); - bi->nick = sstrdup(newnick); - - insert_bot(bi); -} /*************************************************************************/ -static int delbot(BotInfo * bi) -{ - cs_remove_bot(bi); - - if (bi->next) - bi->next->prev = bi->prev; - if (bi->prev) - bi->prev->next = bi->next; - else - botlists[tolower(*bi->nick)] = bi->next; - - nbots--; - - free(bi->nick); - free(bi->user); - free(bi->host); - free(bi->real); - - free(bi); - - return 1; -} /*************************************************************************/ @@ -847,9 +621,9 @@ BotInfo *findbot(char *nick) /* Unassign a bot from a channel. Assumes u, ci and ci->bi are not NULL */ -static void unassign(User * u, ChannelInfo * ci) +void unassign(User * u, ChannelInfo * ci) { - send_event(EVENT_BOT_UNASSIGN, ci->name); + 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", @@ -989,7 +763,7 @@ void bot_join(ChannelInfo * ci) } /* Should we be invited? */ - if ((ci->c->mode & CMODE_i) + 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.", @@ -997,7 +771,7 @@ void bot_join(ChannelInfo * ci) } 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, ci->name); + send_event(EVENT_BOT_JOIN, 2, ci->name, ci->bi->nick); } /*************************************************************************/ @@ -1078,8 +852,8 @@ static void bot_kick(ChannelInfo * ci, User * u, int message, ...) /* Makes a simple ban and kicks the target */ -static void bot_raw_ban(User * requester, ChannelInfo * ci, char *nick, - char *reason) +void bot_raw_ban(User * requester, ChannelInfo * ci, char *nick, + char *reason) { int ac; char *av[4]; @@ -1154,8 +928,8 @@ static void bot_raw_ban(User * requester, ChannelInfo * ci, char *nick, /* Makes a kick with a "dynamic" reason ;) */ -static void bot_raw_kick(User * requester, ChannelInfo * ci, char *nick, - char *reason) +void bot_raw_kick(User * requester, ChannelInfo * ci, char *nick, + char *reason) { char *av[3]; User *u = finduser(nick); @@ -1194,8 +968,8 @@ static void bot_raw_kick(User * requester, ChannelInfo * ci, char *nick, /* Makes a mode operation on a channel for a nick */ -static void bot_raw_mode(User * requester, ChannelInfo * ci, char *mode, - char *nick) +void bot_raw_mode(User * requester, ChannelInfo * ci, char *mode, + char *nick) { char *av[4]; int ac; @@ -1242,1307 +1016,6 @@ static void bot_raw_mode(User * requester, ChannelInfo * ci, char *mode, } /*************************************************************************/ - -static int do_help(User * u) -{ - char *cmd = strtok(NULL, ""); - - if (!cmd) { - notice_help(s_BotServ, u, BOT_HELP, BSMinUsers); - if (is_services_oper(u)) - notice_help(s_BotServ, u, BOT_SERVADMIN_HELP); - moduleDisplayHelp(4, u); - } else { - mod_help_cmd(s_BotServ, u, BOTSERV, cmd); - } - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_bot(User * u) -{ - BotInfo *bi; - char *cmd = strtok(NULL, " "); - char *ch = NULL; - - if (!cmd) - syntax_error(s_BotServ, u, "BOT", BOT_BOT_SYNTAX); - else if (!stricmp(cmd, "ADD")) { - char *nick = strtok(NULL, " "); - char *user = strtok(NULL, " "); - char *host = strtok(NULL, " "); - char *real = strtok(NULL, ""); - - if (!nick || !user || !host || !real) - syntax_error(s_BotServ, u, "BOT", BOT_BOT_SYNTAX); - else if (readonly) - notice_lang(s_BotServ, u, BOT_BOT_READONLY); - else if (findbot(nick)) - notice_lang(s_BotServ, u, BOT_BOT_ALREADY_EXISTS, nick); - else { - 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_BAD_IDENT); - return MOD_CONT; - } - } - - /** - * Check the host is valid re RFC 2812 - **/ - - /* Check whether it's a services client's nick and return if so - Certus */ - /* 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, 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 { - 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 (!isValidHost(host, 3)) { - notice_lang(s_BotServ, u, BOT_BAD_HOST); - return MOD_CONT; - } - - for (ch = user; *ch && (ch - user) < USERMAX; ch++) { - if (!isalnum(*ch)) { - notice_lang(s_BotServ, u, BOT_BAD_IDENT); - return MOD_CONT; - } - } - - if (stricmp(bi->nick, nick) && findbot(nick)) { - notice_lang(s_BotServ, u, BOT_BOT_ALREADY_EXISTS, nick); - return MOD_CONT; - } - - if (stricmp(bi->nick, nick)) { - /* 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. */ - if (!user) - anope_cmd_chg_nick(oldnick, bi->nick); - 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, 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, 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 if (!stricmp(cmd, "LIST")) - do_botlist(u); - else - syntax_error(s_BotServ, u, "BOT", BOT_BOT_SYNTAX); - - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_botlist(User * u) -{ - int i, count = 0; - BotInfo *bi; - - if (!nbots) { - notice_lang(s_BotServ, u, BOT_BOTLIST_EMPTY); - return MOD_CONT; - } - - for (i = 0; i < 256; i++) { - for (bi = botlists[i]; bi; bi = bi->next) { - if (!(bi->flags & BI_PRIVATE)) { - if (!count) - notice_lang(s_BotServ, u, BOT_BOTLIST_HEADER); - count++; - notice_user(s_BotServ, u, " %-15s (%s@%s)", bi->nick, - bi->user, bi->host); - } - } - } - - if (is_oper(u) && count < nbots) { - notice_lang(s_BotServ, u, BOT_BOTLIST_PRIVATE_HEADER); - - for (i = 0; i < 256; i++) { - for (bi = botlists[i]; bi; bi = bi->next) { - if (bi->flags & BI_PRIVATE) { - notice_user(s_BotServ, u, " %-15s (%s@%s)", - bi->nick, bi->user, bi->host); - count++; - } - } - } - } - - if (!count) - notice_lang(s_BotServ, u, BOT_BOTLIST_EMPTY); - else - notice_lang(s_BotServ, u, BOT_BOTLIST_FOOTER, count); - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_assign(User * u) -{ - char *chan = strtok(NULL, " "); - char *nick = strtok(NULL, " "); - BotInfo *bi; - ChannelInfo *ci; - - if (readonly) - notice_lang(s_BotServ, u, BOT_ASSIGN_READONLY); - else if (!chan || !nick) - syntax_error(s_BotServ, u, "ASSIGN", BOT_ASSIGN_SYNTAX); - else if (!(bi = findbot(nick))) - notice_lang(s_BotServ, u, BOT_DOES_NOT_EXIST, nick); - else if (bi->flags & BI_PRIVATE && !is_oper(u)) - notice_lang(s_BotServ, u, PERMISSION_DENIED); - else if (!(ci = cs_findchan(chan))) - notice_lang(s_BotServ, u, CHAN_X_NOT_REGISTERED, chan); - else if (ci->flags & CI_VERBOTEN) - notice_lang(s_BotServ, u, CHAN_X_FORBIDDEN, chan); - else if ((ci->bi) && (stricmp(ci->bi->nick, nick) == 0)) - notice_lang(s_BotServ, u, BOT_ASSIGN_ALREADY, ci->bi->nick, chan); - else if ((ci->botflags & BS_NOBOT) - || (!check_access(u, ci, CA_ASSIGN) && !is_services_admin(u))) - notice_lang(s_BotServ, u, PERMISSION_DENIED); - else { - if (ci->bi) - unassign(u, ci); - ci->bi = bi; - bi->chancount++; - if (ci->c && ci->c->usercount >= BSMinUsers) { - bot_join(ci); - } - notice_lang(s_BotServ, u, BOT_ASSIGN_ASSIGNED, bi->nick, ci->name); - send_event(EVENT_BOT_ASSIGN, ci->name); - } - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_unassign(User * u) -{ - char *chan = strtok(NULL, " "); - ChannelInfo *ci; - - if (readonly) - notice_lang(s_BotServ, u, BOT_ASSIGN_READONLY); - else if (!chan) - syntax_error(s_BotServ, u, "UNASSIGN", BOT_UNASSIGN_SYNTAX); - else if (!(ci = cs_findchan(chan))) - notice_lang(s_BotServ, u, CHAN_X_NOT_REGISTERED, chan); - else if (ci->flags & CI_VERBOTEN) - notice_lang(s_BotServ, u, CHAN_X_FORBIDDEN, chan); - else if (!is_services_admin(u) && !check_access(u, ci, CA_ASSIGN)) - notice_lang(s_BotServ, u, ACCESS_DENIED); - else { - if (ci->bi) - unassign(u, ci); - notice_lang(s_BotServ, u, BOT_UNASSIGN_UNASSIGNED, ci->name); - } - return MOD_CONT; -} - -/*************************************************************************/ - -static void send_bot_channels(User * u, BotInfo * bi) -{ - int i; - ChannelInfo *ci; - char buf[307], *end; - - *buf = 0; - end = buf; - - for (i = 0; i < 256; i++) { - for (ci = chanlists[i]; ci; ci = ci->next) { - if (ci->bi == bi) { - if (strlen(buf) + strlen(ci->name) > 300) { - notice_user(s_BotServ, u, buf); - *buf = 0; - end = buf; - } - end += - snprintf(end, sizeof(buf) - (end - buf), " %s ", - ci->name); - } - } - } - - if (*buf) - notice_user(s_BotServ, u, buf); - return; -} - -static int do_info(User * u) -{ - BotInfo *bi; - ChannelInfo *ci; - char *query = strtok(NULL, " "); - - int need_comma = 0, is_servadmin = is_services_admin(u); - char buf[BUFSIZE], *end; - const char *commastr = getstring(u->na, COMMA_SPACE); - - if (!query) - syntax_error(s_BotServ, u, "INFO", BOT_INFO_SYNTAX); - else if ((bi = findbot(query))) { - char buf[BUFSIZE]; - struct tm *tm; - - notice_lang(s_BotServ, u, BOT_INFO_BOT_HEADER, bi->nick); - notice_lang(s_BotServ, u, BOT_INFO_BOT_MASK, bi->user, bi->host); - notice_lang(s_BotServ, u, BOT_INFO_BOT_REALNAME, bi->real); - tm = localtime(&bi->created); - strftime_lang(buf, sizeof(buf), u, STRFTIME_DATE_TIME_FORMAT, tm); - notice_lang(s_BotServ, u, BOT_INFO_BOT_CREATED, buf); - notice_lang(s_BotServ, u, BOT_INFO_BOT_OPTIONS, - getstring(u->na, - (bi-> - flags & BI_PRIVATE) ? BOT_INFO_OPT_PRIVATE : - BOT_INFO_OPT_NONE)); - notice_lang(s_BotServ, u, BOT_INFO_BOT_USAGE, bi->chancount); - - if (is_services_admin(u)) - send_bot_channels(u, bi); - } else if ((ci = cs_findchan(query))) { - if (!is_servadmin && !is_founder(u, ci)) { - notice_lang(s_BotServ, u, PERMISSION_DENIED); - return MOD_CONT; - } - 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; -} - -/*************************************************************************/ - -static int do_set(User * u) -{ - char *chan = strtok(NULL, " "); - char *option = strtok(NULL, " "); - char *value = strtok(NULL, " "); - int is_servadmin = is_services_admin(u); - - ChannelInfo *ci; - - if (readonly) - notice_lang(s_BotServ, u, BOT_SET_DISABLED); - else if (!chan || !option || !value) - syntax_error(s_BotServ, u, "SET", BOT_SET_SYNTAX); - else if (is_servadmin && !stricmp(option, "PRIVATE")) { - BotInfo *bi; - - if ((bi = findbot(chan))) { - if (!stricmp(value, "ON")) { - bi->flags |= BI_PRIVATE; - notice_lang(s_BotServ, u, BOT_SET_PRIVATE_ON, bi->nick); - } else if (!stricmp(value, "OFF")) { - bi->flags &= ~BI_PRIVATE; - notice_lang(s_BotServ, u, BOT_SET_PRIVATE_OFF, bi->nick); - } else { - syntax_error(s_BotServ, u, "SET PRIVATE", - BOT_SET_PRIVATE_SYNTAX); - } - } else { - notice_lang(s_BotServ, u, BOT_DOES_NOT_EXIST, chan); - } - return MOD_CONT; - } else if (!(ci = cs_findchan(chan))) - notice_lang(s_BotServ, u, CHAN_X_NOT_REGISTERED, chan); - else if (ci->flags & CI_VERBOTEN) - notice_lang(s_BotServ, u, CHAN_X_FORBIDDEN, chan); - else if (!is_servadmin && !check_access(u, ci, CA_SET)) - notice_lang(s_BotServ, u, ACCESS_DENIED); - else { - if (!stricmp(option, "DONTKICKOPS")) { - if (!stricmp(value, "ON")) { - ci->botflags |= BS_DONTKICKOPS; - notice_lang(s_BotServ, u, BOT_SET_DONTKICKOPS_ON, - ci->name); - } else if (!stricmp(value, "OFF")) { - ci->botflags &= ~BS_DONTKICKOPS; - notice_lang(s_BotServ, u, BOT_SET_DONTKICKOPS_OFF, - ci->name); - } else { - syntax_error(s_BotServ, u, "SET DONTKICKOPS", - BOT_SET_DONTKICKOPS_SYNTAX); - } - } else if (!stricmp(option, "DONTKICKVOICES")) { - if (!stricmp(value, "ON")) { - ci->botflags |= BS_DONTKICKVOICES; - notice_lang(s_BotServ, u, BOT_SET_DONTKICKVOICES_ON, - ci->name); - } else if (!stricmp(value, "OFF")) { - ci->botflags &= ~BS_DONTKICKVOICES; - notice_lang(s_BotServ, u, BOT_SET_DONTKICKVOICES_OFF, - ci->name); - } else { - syntax_error(s_BotServ, u, "SET DONTKICKVOICES", - BOT_SET_DONTKICKVOICES_SYNTAX); - } - } else if (!stricmp(option, "FANTASY")) { - if (!stricmp(value, "ON")) { - ci->botflags |= BS_FANTASY; - notice_lang(s_BotServ, u, BOT_SET_FANTASY_ON, ci->name); - } else if (!stricmp(value, "OFF")) { - ci->botflags &= ~BS_FANTASY; - notice_lang(s_BotServ, u, BOT_SET_FANTASY_OFF, ci->name); - } else { - syntax_error(s_BotServ, u, "SET FANTASY", - BOT_SET_FANTASY_SYNTAX); - } - } else if (!stricmp(option, "GREET")) { - if (!stricmp(value, "ON")) { - ci->botflags |= BS_GREET; - notice_lang(s_BotServ, u, BOT_SET_GREET_ON, ci->name); - } else if (!stricmp(value, "OFF")) { - ci->botflags &= ~BS_GREET; - notice_lang(s_BotServ, u, BOT_SET_GREET_OFF, ci->name); - } else { - syntax_error(s_BotServ, u, "SET GREET", - BOT_SET_GREET_SYNTAX); - } - } else if (is_servadmin && !stricmp(option, "NOBOT")) { - if (!stricmp(value, "ON")) { - ci->botflags |= BS_NOBOT; - if (ci->bi) - unassign(u, ci); - notice_lang(s_BotServ, u, BOT_SET_NOBOT_ON, ci->name); - } else if (!stricmp(value, "OFF")) { - ci->botflags &= ~BS_NOBOT; - notice_lang(s_BotServ, u, BOT_SET_NOBOT_OFF, ci->name); - } else { - syntax_error(s_BotServ, u, "SET NOBOT", - BOT_SET_NOBOT_SYNTAX); - } - } else if (!stricmp(option, "SYMBIOSIS")) { - if (!stricmp(value, "ON")) { - ci->botflags |= BS_SYMBIOSIS; - notice_lang(s_BotServ, u, BOT_SET_SYMBIOSIS_ON, ci->name); - } else if (!stricmp(value, "OFF")) { - ci->botflags &= ~BS_SYMBIOSIS; - notice_lang(s_BotServ, u, BOT_SET_SYMBIOSIS_OFF, ci->name); - } else { - syntax_error(s_BotServ, u, "SET SYMBIOSIS", - BOT_SET_SYMBIOSIS_SYNTAX); - } - } else { - notice_help(s_BotServ, u, BOT_SET_UNKNOWN, option); - } - } - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_kickcmd(User * u) -{ - char *chan = strtok(NULL, " "); - char *option = strtok(NULL, " "); - char *value = strtok(NULL, " "); - char *ttb = strtok(NULL, " "); - - ChannelInfo *ci; - - if (readonly) - notice_lang(s_BotServ, u, BOT_KICK_DISABLED); - else if (!chan || !option || !value) - syntax_error(s_BotServ, u, "KICK", BOT_KICK_SYNTAX); - else if (stricmp(value, "ON") && stricmp(value, "OFF")) - syntax_error(s_BotServ, u, "KICK", BOT_KICK_SYNTAX); - else if (!(ci = cs_findchan(chan))) - notice_lang(s_BotServ, u, CHAN_X_NOT_REGISTERED, chan); - else if (ci->flags & CI_VERBOTEN) - notice_lang(s_BotServ, u, CHAN_X_FORBIDDEN, chan); - else if (!is_services_admin(u) && !check_access(u, ci, CA_SET)) - notice_lang(s_BotServ, u, ACCESS_DENIED); - else { - if (!stricmp(option, "BADWORDS")) { - if (!stricmp(value, "ON")) { - if (ttb) { - ci->ttb[TTB_BADWORDS] = - 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; -} - -/*************************************************************************/ - -static int badwords_del_callback(User * u, int num, va_list args) -{ - BadWord *bw; - ChannelInfo *ci = va_arg(args, ChannelInfo *); - int *last = va_arg(args, int *); - if (num < 1 || num > ci->bwcount) - return 0; - *last = num; - - bw = &ci->badwords[num - 1]; - if (bw->word) - free(bw->word); - bw->word = NULL; - bw->in_use = 0; - - return 1; -} - -static int badwords_list(User * u, int index, ChannelInfo * ci, - int *sent_header) -{ - BadWord *bw = &ci->badwords[index]; - - if (!bw->in_use) - return 0; - if (!*sent_header) { - notice_lang(s_BotServ, u, BOT_BADWORDS_LIST_HEADER, ci->name); - *sent_header = 1; - } - - notice_lang(s_BotServ, u, BOT_BADWORDS_LIST_FORMAT, index + 1, - bw->word, - ((bw->type == - BW_SINGLE) ? "(SINGLE)" : ((bw->type == - BW_START) ? "(START)" - : ((bw->type == - BW_END) ? "(END)" : ""))) - ); - return 1; -} - -static int badwords_list_callback(User * u, int num, va_list args) -{ - ChannelInfo *ci = va_arg(args, ChannelInfo *); - int *sent_header = va_arg(args, int *); - if (num < 1 || num > ci->bwcount) - return 0; - return badwords_list(u, num - 1, ci, sent_header); -} - -static int do_badwords(User * u) -{ - char *chan = strtok(NULL, " "); - char *cmd = strtok(NULL, " "); - char *word = strtok(NULL, ""); - ChannelInfo *ci; - BadWord *bw; - - int i; - int need_args = (cmd - && (!stricmp(cmd, "LIST") || !stricmp(cmd, "CLEAR"))); - - if (!cmd || (need_args ? 0 : !word)) { - syntax_error(s_BotServ, u, "BADWORDS", BOT_BADWORDS_SYNTAX); - } else if (!(ci = cs_findchan(chan))) { - notice_lang(s_BotServ, u, CHAN_X_NOT_REGISTERED, chan); - } else if (ci->flags & CI_VERBOTEN) { - notice_lang(s_BotServ, u, CHAN_X_FORBIDDEN, chan); - } else if (!check_access(u, ci, CA_BADWORDS) - && (!need_args || !is_services_admin(u))) { - notice_lang(s_BotServ, u, ACCESS_DENIED); - } else if (stricmp(cmd, "ADD") == 0) { - - char *opt, *pos; - int type = BW_ANY; - - if (readonly) { - notice_lang(s_BotServ, u, BOT_BADWORDS_DISABLED); - return MOD_CONT; - } - - pos = strrchr(word, ' '); - if (pos) { - opt = pos + 1; - if (*opt) { - if (!stricmp(opt, "SINGLE")) - type = BW_SINGLE; - else if (!stricmp(opt, "START")) - type = BW_START; - else if (!stricmp(opt, "END")) - type = BW_END; - if (type != BW_ANY) - *pos = 0; - } - } - - for (bw = ci->badwords, i = 0; i < ci->bwcount; bw++, i++) { - if (bw->word && ((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) { - - if (readonly) { - notice_lang(s_BotServ, u, BOT_BADWORDS_DISABLED); - return MOD_CONT; - } - - /* Special case: is it a number/list? Only do search if it isn't. */ - if (isdigit(*word) && strspn(word, "1234567890,-") == strlen(word)) { - int count, deleted, last = -1; - deleted = - process_numlist(word, &count, badwords_del_callback, u, ci, - &last); - if (!deleted) { - if (count == 1) { - notice_lang(s_BotServ, u, BOT_BADWORDS_NO_SUCH_ENTRY, - last, ci->name); - } else { - notice_lang(s_BotServ, u, BOT_BADWORDS_NO_MATCH, - ci->name); - } - } else if (deleted == 1) { - notice_lang(s_BotServ, u, BOT_BADWORDS_DELETED_ONE, - ci->name); - } else { - notice_lang(s_BotServ, u, BOT_BADWORDS_DELETED_SEVERAL, - deleted, ci->name); - } - } else { - for (i = 0; i < ci->bwcount; i++) { - if (ci->badwords[i].in_use - && !stricmp(ci->badwords[i].word, word)) - break; - } - if (i == ci->bwcount) { - notice_lang(s_BotServ, u, BOT_BADWORDS_NOT_FOUND, word, - chan); - return MOD_CONT; - } - bw = &ci->badwords[i]; - notice_lang(s_BotServ, u, BOT_BADWORDS_DELETED, bw->word, - ci->name); - if (bw->word) - free(bw->word); - bw->word = NULL; - bw->in_use = 0; - } - - } else if (stricmp(cmd, "LIST") == 0) { - int sent_header = 0; - - if (ci->bwcount == 0) { - notice_lang(s_BotServ, u, BOT_BADWORDS_LIST_EMPTY, chan); - return MOD_CONT; - } - if (word && strspn(word, "1234567890,-") == strlen(word)) { - process_numlist(word, NULL, badwords_list_callback, u, ci, - &sent_header); - } else { - for (i = 0; i < ci->bwcount; i++) { - if (!(ci->badwords[i].in_use)) - continue; - if (word && ci->badwords[i].word - && !match_wild_nocase(word, ci->badwords[i].word)) - continue; - badwords_list(u, i, ci, &sent_header); - } - } - if (!sent_header) - notice_lang(s_BotServ, u, BOT_BADWORDS_NO_MATCH, chan); - - } else if (stricmp(cmd, "CLEAR") == 0) { - - if (readonly) { - notice_lang(s_BotServ, u, BOT_BADWORDS_DISABLED); - return MOD_CONT; - } - - for (i = 0; i < ci->bwcount; i++) - if (ci->badwords[i].word) - free(ci->badwords[i].word); - - free(ci->badwords); - ci->badwords = NULL; - ci->bwcount = 0; - - notice_lang(s_BotServ, u, BOT_BADWORDS_CLEAR); - - } else { - syntax_error(s_BotServ, u, "BADWORDS", BOT_BADWORDS_SYNTAX); - } - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_say(User * u) -{ - ChannelInfo *ci; - - char *chan = strtok(NULL, " "); - char *text = strtok(NULL, ""); - - if (!chan || !text) - syntax_error(s_BotServ, u, "SAY", BOT_SAY_SYNTAX); - else if (!(ci = cs_findchan(chan))) - notice_lang(s_BotServ, u, CHAN_X_NOT_REGISTERED, chan); - else if (ci->flags & CI_VERBOTEN) - notice_lang(s_BotServ, u, CHAN_X_FORBIDDEN, chan); - else if (!ci->bi) - notice_help(s_BotServ, u, BOT_NOT_ASSIGNED); - else if (!ci->c || ci->c->usercount < BSMinUsers) - notice_lang(s_BotServ, u, BOT_NOT_ON_CHANNEL, ci->name); - else if (!check_access(u, ci, CA_SAY)) - notice_lang(s_BotServ, u, ACCESS_DENIED); - else { - if (text[0] != '\001') { - anope_cmd_privmsg(ci->bi->nick, ci->name, "%s", text); - ci->bi->lastmsg = time(NULL); - if (logchan && LogBot) - 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; -} - -/*************************************************************************/ - -static int do_act(User * u) -{ - ChannelInfo *ci; - - char *chan = strtok(NULL, " "); - char *text = strtok(NULL, ""); - - if (!chan || !text) - syntax_error(s_BotServ, u, "ACT", BOT_ACT_SYNTAX); - else if (!(ci = cs_findchan(chan))) - notice_lang(s_BotServ, u, CHAN_X_NOT_REGISTERED, chan); - else if (ci->flags & CI_VERBOTEN) - notice_lang(s_BotServ, u, CHAN_X_FORBIDDEN, chan); - else if (!ci->bi) - notice_help(s_BotServ, u, BOT_NOT_ASSIGNED); - else if (!ci->c || ci->c->usercount < BSMinUsers) - notice_lang(s_BotServ, u, BOT_NOT_ON_CHANNEL, ci->name); - else if (!check_access(u, ci, CA_SAY)) - notice_lang(s_BotServ, u, ACCESS_DENIED); - else { - strnrepl(text, BUFSIZE, "\001", ""); - anope_cmd_privmsg(ci->bi->nick, ci->name, "%cACTION %s %c", 1, - text, 1); - ci->bi->lastmsg = time(NULL); - if (logchan && LogBot) - anope_cmd_privmsg(ci->bi->nick, LogChannel, "ACT %s %s %s", - u->nick, ci->name, text); - } - return MOD_CONT; -} - -/*************************************************************************/ /** * Normalize buffer stripping control characters and colors * @param A string to be parsed for control and color codes @@ -2554,7 +1027,7 @@ char *normalizeBuffer(char *buf) int i, len, j = 0; len = strlen(buf); - newbuf = (char *) malloc(sizeof(char) * len + 1); + newbuf = (char *) smalloc(sizeof(char) * len + 1); for (i = 0; i < len; i++) { switch (buf[i]) { diff --git a/src/channels.c b/src/channels.c index 7d25c548f..86a42e118 100644 --- a/src/channels.c +++ b/src/channels.c @@ -256,10 +256,12 @@ void chan_set_modes(const char *source, Channel * chan, int ac, char **av, chan_remove_user_status(chan, user, cum->status); } else if ((cbm = &cbmodes[(int) mode])->flag != 0) { - if (add) - chan->mode |= cbm->flag; - else - chan->mode &= ~cbm->flag; + if (check >= 0) { + if (add) + chan->mode |= cbm->flag; + else + chan->mode &= ~cbm->flag; + } if (cbm->setvalue) { if (add || !(cbm->flags & CBM_MINUS_NO_ARG)) { @@ -272,6 +274,13 @@ void chan_set_modes(const char *source, Channel * chan, int ac, char **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); @@ -287,7 +296,7 @@ void chan_set_modes(const char *source, Channel * chan, int ac, char **av, } } - if (check) { + if (check > 0) { check_modes(chan); if (check < 2) { @@ -537,6 +546,8 @@ void do_join(const char *source, int ac, char **av) if (debug) alog("debug: %s joins %s", source, s); + send_event(EVENT_JOIN_CHANNEL, 3, EVENT_START, source, s); + if (*s == '0') { c = user->chans; while (c) { @@ -557,6 +568,8 @@ void do_join(const char *source, int ac, char **av) chan = findchan(s); chan = join_user_update(user, chan, s); chan_set_correct_modes(user, chan, 1); + + send_event(EVENT_JOIN_CHANNEL, 3, EVENT_STOP, source, s); } } @@ -663,6 +676,8 @@ void do_part(const char *source, int ac, char **av) alog("user: BUG parting %s: channel entry found but c->chan NULL", s); return; } + send_event(EVENT_PART_CHANNEL, 3, EVENT_START, user->nick, + c->chan->name); chan_deluser(user, c->chan); if (c->next) c->next->prev = c->prev; @@ -671,6 +686,8 @@ void do_part(const char *source, int ac, char **av) else user->chans = c->next; free(c); + send_event(EVENT_PART_CHANNEL, 3, EVENT_STOP, user->nick, + c->chan->name); } } } @@ -805,6 +822,9 @@ void do_sjoin(const char *source, int ac, char **av) anope_cmd_kick(s_OperServ, av[1], s, "Q-Lined"); } else { if (!check_kick(user, av[1])) { + 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 @@ -827,6 +847,9 @@ void do_sjoin(const char *source, int ac, char **av) && !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]); } } @@ -881,6 +904,9 @@ void do_sjoin(const char *source, int ac, char **av) anope_cmd_kick(s_OperServ, av[1], s, "Q-Lined"); } else { if (!check_kick(user, av[1])) { + 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 @@ -900,6 +926,9 @@ void do_sjoin(const char *source, int ac, char **av) } chan_set_correct_modes(user, c, 1); + + send_event(EVENT_JOIN_CHANNEL, 3, EVENT_STOP, + user->nick, av[1]); } } @@ -952,6 +981,9 @@ void do_sjoin(const char *source, int ac, char **av) anope_cmd_kick(s_OperServ, av[1], s, "Q-Lined"); } else { if (!check_kick(user, av[1])) { + 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 @@ -971,6 +1003,9 @@ void do_sjoin(const char *source, int ac, char **av) } chan_set_correct_modes(user, c, 1); + + send_event(EVENT_JOIN_CHANNEL, 3, EVENT_STOP, + user->nick, av[1]); } } @@ -1011,11 +1046,17 @@ void do_sjoin(const char *source, int ac, char **av) 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]); c->creation_time = 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]); } } } @@ -1122,6 +1163,8 @@ void do_topic(const char *source, int ac, char **av) /* We can be sure that the topic will be in sync here -GD */ c->topic_sync = 1; + ci = c->ci; + /* 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 @@ -1138,13 +1181,20 @@ void do_topic(const char *source, int ac, char **av) free(c->topic); c->topic = NULL; } - if (ac > 3 && *av[3]) + if (ac > 3 && *av[3]) { c->topic = sstrdup(av[3]); + } strscpy(c->topic_setter, av[1], sizeof(c->topic_setter)); c->topic_time = topic_time; record_topic(av[0]); + + if (ci->last_topic) { + send_event(EVENT_TOPIC_UPDATED, 2, av[0], ci->last_topic); + } else { + send_event(EVENT_TOPIC_UPDATED, 2, av[0], ""); + } } /*************************************************************************/ @@ -1471,8 +1521,9 @@ Channel *chan_create(char *chan) stick_all(c->ci); } - if (serv_uplink && is_sync(serv_uplink) && (!(c->topic_sync))) + if (serv_uplink && is_sync(serv_uplink) && (!(c->topic_sync))) { restore_topic(chan); + } return c; } diff --git a/src/chanserv.c b/src/chanserv.c index 6ee7d0056..4d197770e 100644 --- a/src/chanserv.c +++ b/src/chanserv.c @@ -102,7 +102,7 @@ LevelInfo levelinfo[] = { { CA_SAY, "SAY", CHAN_LEVEL_SAY }, { -1 } }; -static int levelinfo_maxwidth = 0; +int levelinfo_maxwidth = 0; CSModeUtil csmodeutils[] = { { "DEOP", "!deop", "-o", CI_OPNOTICE, CA_OPDEOP, CA_OPDEOPME }, @@ -116,207 +116,20 @@ CSModeUtil csmodeutils[] = { { NULL } }; -int xop_msgs[4][14] = { - { CHAN_AOP_SYNTAX, - CHAN_AOP_DISABLED, - CHAN_AOP_NICKS_ONLY, - CHAN_AOP_ADDED, - CHAN_AOP_MOVED, - CHAN_AOP_NO_SUCH_ENTRY, - CHAN_AOP_NOT_FOUND, - CHAN_AOP_NO_MATCH, - CHAN_AOP_DELETED, - CHAN_AOP_DELETED_ONE, - CHAN_AOP_DELETED_SEVERAL, - CHAN_AOP_LIST_EMPTY, - CHAN_AOP_LIST_HEADER, - CHAN_AOP_CLEAR - }, - { CHAN_SOP_SYNTAX, - CHAN_SOP_DISABLED, - CHAN_SOP_NICKS_ONLY, - CHAN_SOP_ADDED, - CHAN_SOP_MOVED, - CHAN_SOP_NO_SUCH_ENTRY, - CHAN_SOP_NOT_FOUND, - CHAN_SOP_NO_MATCH, - CHAN_SOP_DELETED, - CHAN_SOP_DELETED_ONE, - CHAN_SOP_DELETED_SEVERAL, - CHAN_SOP_LIST_EMPTY, - CHAN_SOP_LIST_HEADER, - CHAN_SOP_CLEAR - }, - { CHAN_VOP_SYNTAX, - CHAN_VOP_DISABLED, - CHAN_VOP_NICKS_ONLY, - CHAN_VOP_ADDED, - CHAN_VOP_MOVED, - CHAN_VOP_NO_SUCH_ENTRY, - CHAN_VOP_NOT_FOUND, - CHAN_VOP_NO_MATCH, - CHAN_VOP_DELETED, - CHAN_VOP_DELETED_ONE, - CHAN_VOP_DELETED_SEVERAL, - CHAN_VOP_LIST_EMPTY, - CHAN_VOP_LIST_HEADER, - CHAN_VOP_CLEAR - }, - { CHAN_HOP_SYNTAX, - CHAN_HOP_DISABLED, - CHAN_HOP_NICKS_ONLY, - CHAN_HOP_ADDED, - CHAN_HOP_MOVED, - CHAN_HOP_NO_SUCH_ENTRY, - CHAN_HOP_NOT_FOUND, - CHAN_HOP_NO_MATCH, - CHAN_HOP_DELETED, - CHAN_HOP_DELETED_ONE, - CHAN_HOP_DELETED_SEVERAL, - CHAN_HOP_LIST_EMPTY, - CHAN_HOP_LIST_HEADER, - CHAN_HOP_CLEAR - } -}; - /* *INDENT-ON* */ /*************************************************************************/ void alpha_insert_chan(ChannelInfo * ci); -static ChannelInfo *makechan(const char *chan); +ChannelInfo *makechan(const char *chan); int delchan(ChannelInfo * ci); void reset_levels(ChannelInfo * ci); -static int is_identified(User * user, ChannelInfo * ci); -static void make_unidentified(User * u, ChannelInfo * ci); - -static int do_help(User * u); -static int do_register(User * u); -static int do_identify(User * u); -static int do_logout(User * u); -static int do_drop(User * u); -static int do_set(User * u); -static int do_set_founder(User * u, ChannelInfo * ci, char *param); -static int do_set_successor(User * u, ChannelInfo * ci, char *param); -static int do_set_password(User * u, ChannelInfo * ci, char *param); -static int do_set_desc(User * u, ChannelInfo * ci, char *param); -static int do_set_url(User * u, ChannelInfo * ci, char *param); -static int do_set_email(User * u, ChannelInfo * ci, char *param); -static int do_set_entrymsg(User * u, ChannelInfo * ci, char *param); -static int do_set_bantype(User * u, ChannelInfo * ci, char *param); -static int do_set_mlock(User * u, ChannelInfo * ci, char *param); -static int do_set_keeptopic(User * u, ChannelInfo * ci, char *param); -static int do_set_topiclock(User * u, ChannelInfo * ci, char *param); -static int do_set_private(User * u, ChannelInfo * ci, char *param); -static int do_set_secureops(User * u, ChannelInfo * ci, char *param); -static int do_set_securefounder(User * u, ChannelInfo * ci, char *param); -static int do_set_restricted(User * u, ChannelInfo * ci, char *param); -static int do_set_secure(User * u, ChannelInfo * ci, char *param); -static int do_set_signkick(User * u, ChannelInfo * ci, char *param); -static int do_set_opnotice(User * u, ChannelInfo * ci, char *param); -static int do_set_xop(User * u, ChannelInfo * ci, char *param); -static int do_set_peace(User * u, ChannelInfo * ci, char *param); -static int do_set_noexpire(User * u, ChannelInfo * ci, char *param); -static int do_xop(User * u, char *xname, int xlev, int *xmsgs); -static int do_aop(User * u); -static int do_hop(User * u); -static int do_sop(User * u); -static int do_vop(User * u); -static int do_access(User * u); -static int do_akick(User * u); -static int do_info(User * u); -static int do_list(User * u); -static int do_invite(User * u); -static int do_levels(User * u); -static int do_util(User * u, CSModeUtil * util); -static int do_op(User * u); -static int do_deop(User * u); -static int do_voice(User * u); -static int do_devoice(User * u); -static int do_halfop(User * u); -static int do_dehalfop(User * u); -static int do_protect(User * u); -static int do_deprotect(User * u); -static int do_owner(User * u); -static int do_deowner(User * u); -static int do_cs_kick(User * u); -static int do_ban(User * u); -static int do_cs_topic(User * u); -static int do_unban(User * u); -static int do_clear(User * u); -static int do_getkey(User * u); -static int do_getpass(User * u); -static int do_sendpass(User * u); -static int do_forbid(User * u); -static int do_suspend(User * u); -static int do_unsuspend(User * u); -static int do_status(User * u); +int is_identified(User * user, ChannelInfo * ci); + void moduleAddChanServCmds(void); /*************************************************************************/ /* *INDENT-OFF* */ void moduleAddChanServCmds(void) { - Command *c; - c = createCommand("HELP", do_help, NULL, -1, -1,-1,-1,-1); addCoreCommand(CHANSERV,c); - c = createCommand("REGISTER", do_register, NULL, CHAN_HELP_REGISTER, -1,-1,-1,-1); addCoreCommand(CHANSERV,c); - c = createCommand("IDENTIFY", do_identify, NULL, CHAN_HELP_IDENTIFY, -1,-1,-1,-1); addCoreCommand(CHANSERV,c); - c = createCommand("LOGOUT", do_logout, NULL, -1,CHAN_HELP_LOGOUT, -1,CHAN_SERVADMIN_HELP_LOGOUT, CHAN_SERVADMIN_HELP_LOGOUT); addCoreCommand(CHANSERV,c); - c = createCommand("DROP", do_drop, NULL, -1,CHAN_HELP_DROP, -1,CHAN_SERVADMIN_HELP_DROP, CHAN_SERVADMIN_HELP_DROP); addCoreCommand(CHANSERV,c); - c = createCommand("SET", do_set, NULL, CHAN_HELP_SET,-1, -1,CHAN_SERVADMIN_HELP_SET, CHAN_SERVADMIN_HELP_SET); addCoreCommand(CHANSERV,c); - c = createCommand("SET FOUNDER", NULL, NULL, CHAN_HELP_SET_FOUNDER, -1,-1,-1,-1); addCoreCommand(CHANSERV,c); - c = createCommand("SET SUCCESSOR", NULL, NULL, CHAN_HELP_SET_SUCCESSOR, -1,-1,-1,-1); addCoreCommand(CHANSERV,c); - c = createCommand("SET PASSWORD", NULL, NULL, CHAN_HELP_SET_PASSWORD, -1,-1,-1,-1); addCoreCommand(CHANSERV,c); - c = createCommand("SET DESC", NULL, NULL, CHAN_HELP_SET_DESC, -1,-1,-1,-1); addCoreCommand(CHANSERV,c); - c = createCommand("SET URL", NULL, NULL, CHAN_HELP_SET_URL, -1,-1,-1,-1); addCoreCommand(CHANSERV,c); - c = createCommand("SET EMAIL", NULL, NULL, CHAN_HELP_SET_EMAIL, -1,-1,-1,-1); addCoreCommand(CHANSERV,c); - c = createCommand("SET ENTRYMSG", NULL, NULL, CHAN_HELP_SET_ENTRYMSG, -1,-1,-1,-1); addCoreCommand(CHANSERV,c); - c = createCommand("SET BANTYPE", NULL, NULL, CHAN_HELP_SET_BANTYPE, -1,-1,-1,-1); addCoreCommand(CHANSERV,c); - c = createCommand("SET PRIVATE", NULL, NULL, CHAN_HELP_SET_PRIVATE, -1,-1,-1,-1); addCoreCommand(CHANSERV,c); - c = createCommand("SET KEEPTOPIC", NULL, NULL, CHAN_HELP_SET_KEEPTOPIC, -1,-1,-1,-1); addCoreCommand(CHANSERV,c); - c = createCommand("SET TOPICLOCK", NULL, NULL, CHAN_HELP_SET_TOPICLOCK, -1,-1,-1,-1); addCoreCommand(CHANSERV,c); - c = createCommand("SET MLOCK", NULL, NULL, CHAN_HELP_SET_MLOCK, -1,-1,-1,-1); addCoreCommand(CHANSERV,c); - c = createCommand("SET RESTRICTED", NULL, NULL, CHAN_HELP_SET_RESTRICTED, -1,-1,-1,-1); addCoreCommand(CHANSERV,c); - c = createCommand("SET SECURE", NULL, NULL, CHAN_HELP_SET_SECURE, -1,-1,-1,-1); addCoreCommand(CHANSERV,c); - c = createCommand("SET SECUREOPS", NULL, NULL, CHAN_HELP_SET_SECUREOPS, -1,-1,-1,-1); addCoreCommand(CHANSERV,c); - c = createCommand("SET SECUREFOUNDER", NULL, NULL, CHAN_HELP_SET_SECUREFOUNDER, -1,-1,-1,-1); addCoreCommand(CHANSERV,c); - c = createCommand("SET SIGNKICK", NULL, NULL, CHAN_HELP_SET_SIGNKICK, -1,-1,-1,-1); addCoreCommand(CHANSERV,c); - c = createCommand("SET OPNOTICE", NULL, NULL, CHAN_HELP_SET_OPNOTICE, -1,-1,-1,-1); addCoreCommand(CHANSERV,c); - c = createCommand("SET XOP", NULL, NULL, CHAN_HELP_SET_XOP, -1,-1,-1,-1); addCoreCommand(CHANSERV,c); - c = createCommand("SET PEACE", NULL, NULL, CHAN_HELP_SET_PEACE, -1,-1,-1,-1); addCoreCommand(CHANSERV,c); - c = createCommand("SET NOEXPIRE", NULL, NULL, -1, -1, -1,CHAN_SERVADMIN_HELP_SET_NOEXPIRE,CHAN_SERVADMIN_HELP_SET_NOEXPIRE); addCoreCommand(CHANSERV,c); - c = createCommand("AOP", do_aop, NULL, CHAN_HELP_AOP, -1,-1,-1,-1); addCoreCommand(CHANSERV,c); - c = createCommand("HOP", do_hop, NULL, CHAN_HELP_HOP, -1,-1,-1,-1); addCoreCommand(CHANSERV,c); - c = createCommand("SOP", do_sop, NULL, CHAN_HELP_SOP, -1,-1,-1,-1); addCoreCommand(CHANSERV,c); - c = createCommand("VOP", do_vop, NULL, CHAN_HELP_VOP, -1,-1,-1,-1); addCoreCommand(CHANSERV,c); - c = createCommand("ACCESS", do_access, NULL, CHAN_HELP_ACCESS, -1,-1,-1,-1); addCoreCommand(CHANSERV,c); - c = createCommand("ACCESS LEVELS", NULL, NULL, CHAN_HELP_ACCESS_LEVELS, -1,-1,-1,-1); addCoreCommand(CHANSERV,c); - c = createCommand("AKICK", do_akick, NULL, CHAN_HELP_AKICK, -1,-1,-1,-1); addCoreCommand(CHANSERV,c); - c = createCommand("LEVELS", do_levels, NULL, CHAN_HELP_LEVELS, -1,-1,-1,-1); addCoreCommand(CHANSERV,c); - c = createCommand("INFO", do_info, NULL, CHAN_HELP_INFO,-1, CHAN_SERVADMIN_HELP_INFO, CHAN_SERVADMIN_HELP_INFO,CHAN_SERVADMIN_HELP_INFO); addCoreCommand(CHANSERV,c); - c = createCommand("LIST", do_list, NULL, -1,CHAN_HELP_LIST, CHAN_SERVADMIN_HELP_LIST,CHAN_SERVADMIN_HELP_LIST, CHAN_SERVADMIN_HELP_LIST); addCoreCommand(CHANSERV,c); - c = createCommand("OP", do_op, NULL, CHAN_HELP_OP, -1,-1,-1,-1); addCoreCommand(CHANSERV,c); - c = createCommand("DEOP", do_deop, NULL, CHAN_HELP_DEOP, -1,-1,-1,-1); addCoreCommand(CHANSERV,c); - c = createCommand("VOICE", do_voice, NULL, CHAN_HELP_VOICE, -1,-1,-1,-1); addCoreCommand(CHANSERV,c); - c = createCommand("DEVOICE", do_devoice, NULL, CHAN_HELP_DEVOICE, -1,-1,-1,-1); addCoreCommand(CHANSERV,c); - c = createCommand("HALFOP", do_halfop, NULL, CHAN_HELP_HALFOP, -1,-1,-1,-1); addCoreCommand(CHANSERV,c); - c = createCommand("DEHALFOP", do_dehalfop, NULL, CHAN_HELP_DEHALFOP, -1,-1,-1,-1); addCoreCommand(CHANSERV,c); - c = createCommand("PROTECT", do_protect, NULL, CHAN_HELP_PROTECT, -1,-1,-1,-1); addCoreCommand(CHANSERV,c); - c = createCommand("DEPROTECT",do_deprotect,NULL, CHAN_HELP_DEPROTECT, -1,-1,-1,-1); addCoreCommand(CHANSERV,c); - c = createCommand("OWNER", do_owner, NULL, CHAN_HELP_OWNER, -1,-1,-1,-1); addCoreCommand(CHANSERV,c); - c = createCommand("DEOWNER", do_deowner, NULL, CHAN_HELP_DEOWNER, -1,-1,-1,-1); addCoreCommand(CHANSERV,c); - c = createCommand("ADMIN", do_protect, NULL, CHAN_HELP_PROTECT, -1,-1,-1,-1); addCoreCommand(CHANSERV,c); - c = createCommand("DEADMIN",do_deprotect,NULL, CHAN_HELP_DEPROTECT, -1,-1,-1,-1); addCoreCommand(CHANSERV,c); - c = createCommand("KICK", do_cs_kick, NULL, CHAN_HELP_KICK, -1,-1,-1,-1); addCoreCommand(CHANSERV,c); - c = createCommand("BAN", do_ban, NULL, CHAN_HELP_BAN, -1,-1,-1,-1); addCoreCommand(CHANSERV,c); - c = createCommand("TOPIC", do_cs_topic, NULL, CHAN_HELP_TOPIC, -1,-1,-1,-1); addCoreCommand(CHANSERV,c); - c = createCommand("INVITE", do_invite, NULL, CHAN_HELP_INVITE, -1,-1,-1,-1); addCoreCommand(CHANSERV,c); - c = createCommand("UNBAN", do_unban, NULL, CHAN_HELP_UNBAN, -1,-1,-1,-1); addCoreCommand(CHANSERV,c); - c = createCommand("CLEAR", do_clear, NULL, CHAN_HELP_CLEAR, -1,-1,-1,-1); addCoreCommand(CHANSERV,c); - c = createCommand("GETKEY", do_getkey, NULL, CHAN_HELP_GETKEY, -1,-1,-1,-1); addCoreCommand(CHANSERV,c); - c = createCommand("SENDPASS", do_sendpass, NULL, CHAN_HELP_SENDPASS, -1,-1,-1,-1); addCoreCommand(CHANSERV,c); - c = createCommand("GETPASS", do_getpass, is_services_admin, -1, -1, -1, CHAN_SERVADMIN_HELP_GETPASS, CHAN_SERVADMIN_HELP_GETPASS); addCoreCommand(CHANSERV,c); - c = createCommand("FORBID", do_forbid, is_services_admin, -1, -1, -1, CHAN_SERVADMIN_HELP_FORBID, CHAN_SERVADMIN_HELP_FORBID); addCoreCommand(CHANSERV,c); - c = createCommand("SUSPEND", do_suspend, is_services_admin, -1, -1, -1, CHAN_SERVADMIN_HELP_SUSPEND, CHAN_SERVADMIN_HELP_SUSPEND); addCoreCommand(CHANSERV,c); - c = createCommand("UNSUSPEND",do_unsuspend, is_services_admin, -1, -1, -1, CHAN_SERVADMIN_HELP_UNSUSPEND, CHAN_SERVADMIN_HELP_UNSUSPEND); addCoreCommand(CHANSERV,c); - c = createCommand("STATUS", do_status, is_services_admin, -1, -1, -1, CHAN_SERVADMIN_HELP_STATUS, CHAN_SERVADMIN_HELP_STATUS); addCoreCommand(CHANSERV,c); + modules_core_init(ChanServCoreNumber, ChanServCoreModules); } /* *INDENT-ON* */ @@ -325,7 +138,7 @@ void moduleAddChanServCmds(void) { /* Returns modes for mlock in a nice way. */ -static char *get_mlock_modes(ChannelInfo * ci, int complete) +char *get_mlock_modes(ChannelInfo * ci, int complete) { static char res[BUFSIZE]; @@ -1739,18 +1552,21 @@ void record_topic(const char *chan) 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; - send_event(EVENT_TOPIC_UPDATED, chan); } /*************************************************************************/ @@ -1883,7 +1699,7 @@ void expire_chans() next = ci->next; if (!ci->c && now - ci->last_used >= CSExpire && !(ci->flags & (CI_VERBOTEN | CI_NO_EXPIRE))) { - send_event(EVENT_CHAN_EXPIRE, ci->name); + send_event(EVENT_CHAN_EXPIRE, 1, ci->name); alog("Expiring channel %s (founder: %s)", ci->name, (ci->founder ? ci->founder->display : "(none)")); delchan(ci); @@ -2092,7 +1908,7 @@ void alpha_insert_chan(ChannelInfo * ci) * structure if the channel was successfully registered, NULL otherwise. * Assumes channel does not already exist. */ -static ChannelInfo *makechan(const char *chan) +ChannelInfo *makechan(const char *chan) { int i; ChannelInfo *ci; @@ -2322,7 +2138,7 @@ int is_real_founder(User * user, ChannelInfo * ci) /* Has the given user password-identified as founder for the channel? */ -static int is_identified(User * user, ChannelInfo * ci) +int is_identified(User * user, ChannelInfo * ci) { struct u_chaninfolist *c; @@ -2437,29 +2253,6 @@ int get_idealban(ChannelInfo * ci, User * u, char *ret, int retlen) /*************************************************************************/ -static void make_unidentified(User * u, ChannelInfo * ci) -{ - struct u_chaninfolist *uci; - - if (!u || !ci) - return; - - for (uci = u->founder_chans; uci; uci = uci->next) { - if (uci->chan == ci) { - if (uci->next) - uci->next->prev = uci->prev; - if (uci->prev) - uci->prev->next = uci->next; - else - u->founder_chans = uci->next; - free(uci); - break; - } - } -} - -/*************************************************************************/ - char *cs_get_flood(ChannelInfo * ci) { if (!ci) { @@ -2544,7 +2337,7 @@ void cs_set_key(ChannelInfo * ci, char *value) if (value && *value != ':' && !strchr(value, ',')) { ci->mlock_key = sstrdup(value); } else { - ci->mlock_on &= ~CMODE_k; + ci->mlock_on &= ~anope_get_key_mode(); ci->mlock_key = NULL; } } @@ -2560,7 +2353,7 @@ void cs_set_limit(ChannelInfo * ci, char *value) ci->mlock_limit = value ? strtoul(value, NULL, 10) : 0; if (ci->mlock_limit <= 0) - ci->mlock_on &= ~CMODE_l; + ci->mlock_on &= ~anope_get_limit_mode(); } /*************************************************************************/ @@ -2634,1019 +2427,8 @@ char *get_xop_level(int level) /*********************** ChanServ command routines ***********************/ /*************************************************************************/ -static int do_help(User * u) -{ - char *cmd = strtok(NULL, ""); - - if (!cmd) { - notice_help(s_ChanServ, u, CHAN_HELP); - if (ircd->extrahelp) { - notice_help(s_ChanServ, u, ircd->extrahelp); - } - if (CSExpire >= 86400) - notice_help(s_ChanServ, u, CHAN_HELP_EXPIRES, - CSExpire / 86400); - if (is_services_oper(u)) - notice_help(s_ChanServ, u, CHAN_SERVADMIN_HELP); - moduleDisplayHelp(2, u); - } else if (stricmp(cmd, "LEVELS DESC") == 0) { - int i; - notice_help(s_ChanServ, u, CHAN_HELP_LEVELS_DESC); - if (!levelinfo_maxwidth) { - for (i = 0; levelinfo[i].what >= 0; i++) { - int len = strlen(levelinfo[i].name); - if (len > levelinfo_maxwidth) - levelinfo_maxwidth = len; - } - } - for (i = 0; levelinfo[i].what >= 0; i++) { - notice_help(s_ChanServ, u, CHAN_HELP_LEVELS_DESC_FORMAT, - levelinfo_maxwidth, levelinfo[i].name, - getstring(u->na, levelinfo[i].desc)); - } - } else { - mod_help_cmd(s_ChanServ, u, CHANSERV, cmd); - } - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_register(User * u) -{ - char *chan = strtok(NULL, " "); - char *pass = strtok(NULL, " "); - char *desc = strtok(NULL, ""); - NickCore *nc; - Channel *c; - ChannelInfo *ci; - struct u_chaninfolist *uc; - int is_servadmin = is_services_admin(u); -#ifdef USE_ENCRYPTION - char founderpass[PASSMAX + 1]; -#endif - - if (readonly) { - notice_lang(s_ChanServ, u, CHAN_REGISTER_DISABLED); - return MOD_CONT; - } - - if (checkDefCon(DEFCON_NO_NEW_CHANNELS)) { - notice_lang(s_ChanServ, u, OPER_DEFCON_DENIED); - return MOD_CONT; - } - - if (!desc) { - syntax_error(s_ChanServ, u, "REGISTER", CHAN_REGISTER_SYNTAX); - } else if (*chan == '&') { - notice_lang(s_ChanServ, u, CHAN_REGISTER_NOT_LOCAL); - } else if (*chan != '#') { - notice_lang(s_ChanServ, u, CHAN_SYMBOL_REQUIRED); - } 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 (!(ci = makechan(chan))) { - alog("%s: makechan() failed for REGISTER %s", s_ChanServ, chan); - notice_lang(s_ChanServ, u, CHAN_REGISTRATION_FAILED); - -#ifdef USE_ENCRYPTION - } else if (strscpy(founderpass, pass, PASSMAX + 1), - encrypt_in_place(founderpass, PASSMAX) < 0) { - alog("%s: Couldn't encrypt password for %s (REGISTER)", - s_ChanServ, chan); - notice_lang(s_ChanServ, u, CHAN_REGISTRATION_FAILED); - delchan(ci); -#endif - - } else { - c->ci = ci; - ci->c = c; - ci->bantype = CSDefBantype; - ci->flags = CSDefFlags; - ci->mlock_on = ircd->defmlock; - ci->memos.memomax = MSMaxMemos; - ci->last_used = ci->time_registered; - ci->founder = nc; -#ifdef USE_ENCRYPTION - if (strlen(pass) > PASSMAX) - notice_lang(s_ChanServ, u, PASSWORD_TRUNCATED, PASSMAX); - memset(pass, 0, strlen(pass)); - memcpy(ci->founderpass, founderpass, PASSMAX); - ci->flags |= CI_ENCRYPTEDPW; -#else - if (strlen(pass) > PASSMAX - 1) /* -1 for null byte */ - notice_lang(s_ChanServ, u, PASSWORD_TRUNCATED, PASSMAX - 1); - strscpy(ci->founderpass, pass, PASSMAX); -#endif - ci->desc = sstrdup(desc); - if (c->topic) { - ci->last_topic = sstrdup(c->topic); - strscpy(ci->last_topic_setter, c->topic_setter, NICKMAX); - ci->last_topic_time = c->topic_time; - } 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); -#ifndef USE_ENCRYPTION - notice_lang(s_ChanServ, u, CHAN_PASSWORD_IS, ci->founderpass); -#endif - uc = scalloc(sizeof(*uc), 1); - uc->next = u->founder_chans; - uc->prev = NULL; - if (u->founder_chans) - u->founder_chans->prev = uc; - u->founder_chans = uc; - uc->chan = ci; - /* Implement new mode lock */ - check_modes(c); - /* 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, chan); - } - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_identify(User * u) -{ - char *chan = strtok(NULL, " "); - char *pass = strtok(NULL, " "); - ChannelInfo *ci; - struct u_chaninfolist *uc; - - if (!pass) { - syntax_error(s_ChanServ, u, "IDENTIFY", CHAN_IDENTIFY_SYNTAX); - } else if (!(ci = cs_findchan(chan))) { - notice_lang(s_ChanServ, u, CHAN_X_NOT_REGISTERED, chan); - } else if (ci->flags & CI_VERBOTEN) { - notice_lang(s_ChanServ, u, CHAN_X_FORBIDDEN, chan); - } else if (!nick_identified(u)) { - notice_lang(s_ChanServ, u, NICK_IDENTIFY_REQUIRED, s_NickServ); - } else if (is_founder(u, ci)) { - notice_lang(s_ChanServ, u, NICK_ALREADY_IDENTIFIED); - } else { - int res; - - if ((res = check_password(pass, ci->founderpass)) == 1) { - if (!is_identified(u, ci)) { - uc = scalloc(sizeof(*uc), 1); - uc->next = u->founder_chans; - if (u->founder_chans) - u->founder_chans->prev = uc; - u->founder_chans = uc; - uc->chan = ci; - alog("%s: %s!%s@%s identified for %s", s_ChanServ, u->nick, - u->username, 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; -} - -/*************************************************************************/ - -static int do_logout(User * u) -{ - char *chan = strtok(NULL, " "); - char *nick = strtok(NULL, " "); - ChannelInfo *ci; - User *u2 = NULL; - int is_servadmin = is_services_admin(u); - - if (!chan || (!nick && !is_servadmin)) { - syntax_error(s_ChanServ, u, "LOGOUT", - (!is_servadmin ? CHAN_LOGOUT_SYNTAX : - CHAN_LOGOUT_SERVADMIN_SYNTAX)); - } else if (!(ci = cs_findchan(chan))) { - notice_lang(s_ChanServ, u, CHAN_X_NOT_REGISTERED, chan); - } else if (!is_servadmin && (ci->flags & CI_VERBOTEN)) { - notice_lang(s_ChanServ, u, CHAN_X_FORBIDDEN, chan); - } else if (nick && !(u2 = finduser(nick))) { - notice_lang(s_ChanServ, u, NICK_X_NOT_IN_USE, nick); - } else if (!is_servadmin && u2 != u && !is_real_founder(u, ci)) { - notice_lang(s_ChanServ, u, ACCESS_DENIED); - } else { - if (u2) { - make_unidentified(u2, ci); - notice_lang(s_ChanServ, u, CHAN_LOGOUT_SUCCEEDED, nick, chan); - 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; -} - -/*************************************************************************/ - -static int do_drop(User * u) -{ - char *chan = strtok(NULL, " "); - ChannelInfo *ci; - int is_servadmin = is_services_admin(u); - - if (readonly && !is_servadmin) { - notice_lang(s_ChanServ, u, CHAN_DROP_DISABLED); - return MOD_CONT; - } - - if (!chan) { - syntax_error(s_ChanServ, u, "DROP", CHAN_DROP_SYNTAX); - } else if (!(ci = cs_findchan(chan))) { - notice_lang(s_ChanServ, u, CHAN_X_NOT_REGISTERED, chan); - } else if (!is_servadmin && (ci->flags & CI_VERBOTEN)) { - notice_lang(s_ChanServ, u, CHAN_X_FORBIDDEN, chan); - } else if (!is_servadmin && (ci->flags & CI_SUSPENDED)) { - notice_lang(s_ChanServ, u, CHAN_X_FORBIDDEN, chan); - } else if (!is_servadmin - && (ci-> - flags & CI_SECUREFOUNDER ? !is_real_founder(u, - ci) : - !is_founder(u, ci))) { - notice_lang(s_ChanServ, u, ACCESS_DENIED); - } else { - int level = get_access(u, ci); - - if (readonly) /* in this case we know they're a Services admin */ - notice_lang(s_ChanServ, u, READ_ONLY_MODE); - - 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, chan); - } - return MOD_CONT; -} - -/*************************************************************************/ - -/* Main SET routine. Calls other routines as follows: - * do_set_command(User *command_sender, ChannelInfo *ci, char *param); - * The parameter passed is the first space-delimited parameter after the - * option name, except in the case of DESC, TOPIC, and ENTRYMSG, in which - * it is the entire remainder of the line. Additional parameters beyond - * the first passed in the function call can be retrieved using - * strtok(NULL, toks). - */ -static int do_set(User * u) -{ - char *chan = strtok(NULL, " "); - char *cmd = strtok(NULL, " "); - char *param; - ChannelInfo *ci; - int is_servadmin = is_services_admin(u); - - if (readonly) { - notice_lang(s_ChanServ, u, CHAN_SET_DISABLED); - return MOD_CONT; - } - - if (cmd) { - if (stricmp(cmd, "DESC") == 0 || stricmp(cmd, "ENTRYMSG") == 0) - param = strtok(NULL, ""); - else - param = strtok(NULL, " "); - } else { - param = NULL; - } - - if (!param && (!cmd || (stricmp(cmd, "SUCCESSOR") != 0 && - stricmp(cmd, "URL") != 0 && - stricmp(cmd, "EMAIL") != 0 && - stricmp(cmd, "ENTRYMSG") != 0))) { - syntax_error(s_ChanServ, u, "SET", CHAN_SET_SYNTAX); - } else if (!(ci = cs_findchan(chan))) { - notice_lang(s_ChanServ, u, CHAN_X_NOT_REGISTERED, chan); - } else if (ci->flags & CI_VERBOTEN) { - notice_lang(s_ChanServ, u, CHAN_X_FORBIDDEN, chan); - } else if (!is_servadmin && !check_access(u, ci, CA_SET)) { - notice_lang(s_ChanServ, u, ACCESS_DENIED); - } else if (stricmp(cmd, "FOUNDER") == 0) { - if (!is_servadmin - && (ci-> - flags & CI_SECUREFOUNDER ? !is_real_founder(u, - ci) : - !is_founder(u, ci))) { - notice_lang(s_ChanServ, u, ACCESS_DENIED); - } else { - do_set_founder(u, ci, param); - } - } else if (stricmp(cmd, "SUCCESSOR") == 0) { - if (!is_servadmin - && (ci-> - flags & CI_SECUREFOUNDER ? !is_real_founder(u, - ci) : - !is_founder(u, ci))) { - notice_lang(s_ChanServ, u, ACCESS_DENIED); - } else { - do_set_successor(u, ci, param); - } - } else if (stricmp(cmd, "PASSWORD") == 0) { - if (!is_servadmin - && (ci-> - flags & CI_SECUREFOUNDER ? !is_real_founder(u, - ci) : - !is_founder(u, ci))) { - notice_lang(s_ChanServ, u, ACCESS_DENIED); - } else { - do_set_password(u, ci, param); - } - } else if (stricmp(cmd, "DESC") == 0) { - do_set_desc(u, ci, param); - } else if (stricmp(cmd, "URL") == 0) { - do_set_url(u, ci, param); - } else if (stricmp(cmd, "EMAIL") == 0) { - do_set_email(u, ci, param); - } else if (stricmp(cmd, "ENTRYMSG") == 0) { - do_set_entrymsg(u, ci, param); - } else if (stricmp(cmd, "TOPIC") == 0) { - notice_lang(s_ChanServ, u, OBSOLETE_COMMAND, "TOPIC"); - } else if (stricmp(cmd, "BANTYPE") == 0) { - do_set_bantype(u, ci, param); - } else if (stricmp(cmd, "MLOCK") == 0) { - do_set_mlock(u, ci, param); - } else if (stricmp(cmd, "KEEPTOPIC") == 0) { - do_set_keeptopic(u, ci, param); - } else if (stricmp(cmd, "TOPICLOCK") == 0) { - do_set_topiclock(u, ci, param); - } else if (stricmp(cmd, "PRIVATE") == 0) { - do_set_private(u, ci, param); - } else if (stricmp(cmd, "SECUREOPS") == 0) { - do_set_secureops(u, ci, param); - } else if (stricmp(cmd, "SECUREFOUNDER") == 0) { - if (!is_servadmin - && (ci-> - flags & CI_SECUREFOUNDER ? !is_real_founder(u, - ci) : - !is_founder(u, ci))) { - notice_lang(s_ChanServ, u, ACCESS_DENIED); - } else { - do_set_securefounder(u, ci, param); - } - } else if (stricmp(cmd, "RESTRICTED") == 0) { - do_set_restricted(u, ci, param); - } else if (stricmp(cmd, "SECURE") == 0) { - do_set_secure(u, ci, param); - } else if (stricmp(cmd, "SIGNKICK") == 0) { - do_set_signkick(u, ci, param); - } else if (stricmp(cmd, "OPNOTICE") == 0) { - do_set_opnotice(u, ci, param); - } else if (stricmp(cmd, "XOP") == 0) { - do_set_xop(u, ci, param); - } else if (stricmp(cmd, "PEACE") == 0) { - do_set_peace(u, ci, param); - } else if (stricmp(cmd, "NOEXPIRE") == 0) { - do_set_noexpire(u, ci, param); - } else { - notice_lang(s_ChanServ, u, CHAN_SET_UNKNOWN_OPTION, cmd); - notice_lang(s_ChanServ, u, MORE_INFO, s_ChanServ, "SET"); - } - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_set_founder(User * u, ChannelInfo * ci, char *param) -{ - NickAlias *na = findnick(param); - NickCore *nc, *nc0 = ci->founder; - - if (!na) { - notice_lang(s_ChanServ, u, NICK_X_NOT_REGISTERED, param); - return MOD_CONT; - } else if (na->status & NS_VERBOTEN) { - notice_lang(s_ChanServ, u, NICK_X_FORBIDDEN, param); - return MOD_CONT; - } - - nc = na->nc; - if (nc->channelmax > 0 && nc->channelcount >= nc->channelmax - && !is_services_admin(u)) { - notice_lang(s_ChanServ, u, CHAN_SET_FOUNDER_TOO_MANY_CHANS, param); - return MOD_CONT; - } - - alog("%s: Changing founder of %s from %s to %s by %s!%s@%s", - s_ChanServ, ci->name, ci->founder->display, nc->display, u->nick, - u->username, 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; -} - -/*************************************************************************/ - -static int do_set_successor(User * u, ChannelInfo * ci, char *param) -{ - NickAlias *na; - NickCore *nc; - - if (param) { - na = findnick(param); - - if (!na) { - notice_lang(s_ChanServ, u, NICK_X_NOT_REGISTERED, param); - return MOD_CONT; - } - if (na->status & NS_VERBOTEN) { - notice_lang(s_ChanServ, u, NICK_X_FORBIDDEN, param); - return MOD_CONT; - } - if (na->nc == ci->founder) { - notice_lang(s_ChanServ, u, CHAN_SUCCESSOR_IS_FOUNDER, param, - ci->name); - return MOD_CONT; - } - nc = na->nc; - - } else { - nc = NULL; - } - - alog("%s: Changing successor of %s from %s to %s by %s!%s@%s", - s_ChanServ, ci->name, - (ci->successor ? ci->successor->display : "none"), - (nc ? nc->display : "none"), u->nick, u->username, 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; -} - -/*************************************************************************/ - -static 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; - } -#ifdef USE_ENCRYPTION - if (len > PASSMAX) { - len = PASSMAX; - param[len] = 0; - notice_lang(s_ChanServ, u, PASSWORD_TRUNCATED, PASSMAX); - } - - if (encrypt(param, len, ci->founderpass, PASSMAX) < 0) { - memset(param, 0, strlen(param)); - alog("%s: Failed to encrypt password for %s (set)", s_ChanServ, - ci->name); - notice_lang(s_ChanServ, u, CHAN_SET_PASSWORD_FAILED); - return MOD_CONT; - } - - memset(param, 0, strlen(param)); - notice_lang(s_ChanServ, u, CHAN_PASSWORD_CHANGED, ci->name); - -#else /* !USE_ENCRYPTION */ - if (strlen(param) > PASSMAX - 1) /* -1 for null byte */ - notice_lang(s_ChanServ, u, PASSWORD_TRUNCATED, PASSMAX - 1); - strscpy(ci->founderpass, param, PASSMAX); - notice_lang(s_ChanServ, u, CHAN_PASSWORD_CHANGED_TO, ci->name, - ci->founderpass); -#endif /* USE_ENCRYPTION */ - - if (get_access(u, ci) < ACCESS_FOUNDER) { - alog("%s: %s!%s@%s set password as Services admin for %s", - s_ChanServ, u->nick, u->username, 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; -} - -/*************************************************************************/ - -static int do_set_desc(User * u, ChannelInfo * ci, char *param) -{ - if (ci->desc) - free(ci->desc); - ci->desc = sstrdup(param); - notice_lang(s_ChanServ, u, CHAN_DESC_CHANGED, ci->name, param); - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_set_url(User * u, ChannelInfo * ci, char *param) -{ - if (ci->url) - free(ci->url); - if (param) { - ci->url = sstrdup(param); - notice_lang(s_ChanServ, u, CHAN_URL_CHANGED, ci->name, param); - } else { - ci->url = NULL; - notice_lang(s_ChanServ, u, CHAN_URL_UNSET, ci->name); - } - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_set_email(User * u, ChannelInfo * ci, char *param) -{ - if (ci->email) - free(ci->email); - if (param) { - ci->email = sstrdup(param); - notice_lang(s_ChanServ, u, CHAN_EMAIL_CHANGED, ci->name, param); - } else { - ci->email = NULL; - notice_lang(s_ChanServ, u, CHAN_EMAIL_UNSET, ci->name); - } - return MOD_CONT; -} - /*************************************************************************/ -static int do_set_entrymsg(User * u, ChannelInfo * ci, char *param) -{ - if (ci->entry_message) - free(ci->entry_message); - if (param) { - ci->entry_message = sstrdup(param); - notice_lang(s_ChanServ, u, CHAN_ENTRY_MSG_CHANGED, ci->name, - param); - } else { - ci->entry_message = NULL; - notice_lang(s_ChanServ, u, CHAN_ENTRY_MSG_UNSET, ci->name); - } - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_set_mlock(User * u, ChannelInfo * ci, char *param) -{ - int add = -1; /* 1 if adding, 0 if deleting, -1 if neither */ - unsigned char mode; - CBMode *cbm; - - if (checkDefCon(DEFCON_NO_MLOCK_CHANGE)) { - notice_lang(s_ChanServ, u, OPER_DEFCON_DENIED); - return MOD_CONT; - } - - /* Reinitialize everything */ - 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 & CMODE_l)) { - 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 & CMODE_i)) { - 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; -} - -/*************************************************************************/ - -static int do_set_bantype(User * u, ChannelInfo * ci, char *param) -{ - char *endptr; - - int16 bantype = strtol(param, &endptr, 10); - - if (*endptr != 0 || bantype < 0 || bantype > 3) { - notice_lang(s_ChanServ, u, CHAN_SET_BANTYPE_INVALID, param); - } else { - ci->bantype = bantype; - notice_lang(s_ChanServ, u, CHAN_SET_BANTYPE_CHANGED, ci->name, - ci->bantype); - } - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_set_keeptopic(User * u, ChannelInfo * ci, char *param) -{ - if (stricmp(param, "ON") == 0) { - ci->flags |= CI_KEEPTOPIC; - notice_lang(s_ChanServ, u, CHAN_SET_KEEPTOPIC_ON, 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; -} - -/*************************************************************************/ - -static int do_set_topiclock(User * u, ChannelInfo * ci, char *param) -{ - if (stricmp(param, "ON") == 0) { - ci->flags |= CI_TOPICLOCK; - notice_lang(s_ChanServ, u, CHAN_SET_TOPICLOCK_ON, 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; -} - -/*************************************************************************/ - -static int do_set_private(User * u, ChannelInfo * ci, char *param) -{ - if (stricmp(param, "ON") == 0) { - ci->flags |= CI_PRIVATE; - notice_lang(s_ChanServ, u, CHAN_SET_PRIVATE_ON, 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; -} - -/*************************************************************************/ - -static int do_set_secureops(User * u, ChannelInfo * ci, char *param) -{ - if (stricmp(param, "ON") == 0) { - ci->flags |= CI_SECUREOPS; - notice_lang(s_ChanServ, u, CHAN_SET_SECUREOPS_ON, 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; -} - -/*************************************************************************/ - -static int do_set_securefounder(User * u, ChannelInfo * ci, char *param) -{ - if (stricmp(param, "ON") == 0) { - ci->flags |= CI_SECUREFOUNDER; - notice_lang(s_ChanServ, u, CHAN_SET_SECUREFOUNDER_ON, 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; -} - -/*************************************************************************/ - -static int do_set_restricted(User * u, ChannelInfo * ci, char *param) -{ - if (stricmp(param, "ON") == 0) { - ci->flags |= CI_RESTRICTED; - if (ci->levels[CA_NOJOIN] < 0) - ci->levels[CA_NOJOIN] = 0; - notice_lang(s_ChanServ, u, CHAN_SET_RESTRICTED_ON, 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; -} - -/*************************************************************************/ - -static int do_set_secure(User * u, ChannelInfo * ci, char *param) -{ - if (stricmp(param, "ON") == 0) { - ci->flags |= CI_SECURE; - notice_lang(s_ChanServ, u, CHAN_SET_SECURE_ON, 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; -} - -/*************************************************************************/ - -static int do_set_signkick(User * u, ChannelInfo * ci, char *param) -{ - if (stricmp(param, "ON") == 0) { - ci->flags |= CI_SIGNKICK; - ci->flags &= ~CI_SIGNKICK_LEVEL; - notice_lang(s_ChanServ, u, CHAN_SET_SIGNKICK_ON, 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; -} - -/*************************************************************************/ - -static int do_set_opnotice(User * u, ChannelInfo * ci, char *param) -{ - if (stricmp(param, "ON") == 0) { - ci->flags |= CI_OPNOTICE; - notice_lang(s_ChanServ, u, CHAN_SET_OPNOTICE_ON, 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)])) - -static int do_set_xop(User * u, ChannelInfo * ci, char *param) -{ - if (stricmp(param, "ON") == 0) { - if (!(ci->flags & CI_XOP)) { - int i; - ChanAccess *access; - - for (access = ci->access, i = 0; i < ci->accesscount; - access++, i++) { - if (!access->in_use) - continue; - /* This will probably cause wrong levels to be set, but hey, - * it's better than losing it altogether. - */ - if (CHECKLEV(CA_AKICK) || CHECKLEV(CA_SET)) { - access->level = ACCESS_SOP; - } else if (CHECKLEV(CA_AUTOOP) || CHECKLEV(CA_OPDEOP) - || CHECKLEV(CA_OPDEOPME)) { - access->level = ACCESS_AOP; - } 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 - -/*************************************************************************/ - -static int do_set_peace(User * u, ChannelInfo * ci, char *param) -{ - if (stricmp(param, "ON") == 0) { - ci->flags |= CI_PEACE; - notice_lang(s_ChanServ, u, CHAN_SET_PEACE_ON, 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; -} - -/*************************************************************************/ - -static int do_set_noexpire(User * u, ChannelInfo * ci, char *param) -{ - if (!is_services_admin(u)) { - notice_lang(s_ChanServ, u, PERMISSION_DENIED); - return MOD_CONT; - } - if (stricmp(param, "ON") == 0) { - ci->flags |= CI_NO_EXPIRE; - notice_lang(s_ChanServ, u, CHAN_SET_NOEXPIRE_ON, ci->name); - } else if (stricmp(param, "OFF") == 0) { - ci->flags &= ~CI_NO_EXPIRE; - notice_lang(s_ChanServ, u, CHAN_SET_NOEXPIRE_OFF, ci->name); - } else { - syntax_error(s_ChanServ, u, "SET NOEXPIRE", - CHAN_SET_NOEXPIRE_SYNTAX); - } - return MOD_CONT; -} /*************************************************************************/ @@ -3654,655 +2436,6 @@ static int do_set_noexpire(User * u, ChannelInfo * ci, char *param) * `perm' is incremented whenever a permission-denied error occurs */ -static int xop_del(User * u, ChanAccess * access, int *perm, int uacc, - int xlev) -{ - if (!access->in_use || access->level != xlev) - return 0; - if (!is_services_admin(u) && uacc <= access->level) { - (*perm)++; - return 0; - } - access->nc = NULL; - access->in_use = 0; - return 1; -} - -static int xop_del_callback(User * u, int num, va_list args) -{ - ChannelInfo *ci = va_arg(args, ChannelInfo *); - int *last = va_arg(args, int *); - int *perm = va_arg(args, int *); - int uacc = va_arg(args, int); - int xlev = va_arg(args, int); - - if (num < 1 || num > ci->accesscount) - return 0; - *last = num; - - return xop_del(u, &ci->access[num - 1], perm, uacc, xlev); -} - - -static int xop_list(User * u, int index, ChannelInfo * ci, - int *sent_header, int xlev, int xmsg) -{ - ChanAccess *access = &ci->access[index]; - - if (!access->in_use || access->level != xlev) - return 0; - - if (!*sent_header) { - notice_lang(s_ChanServ, u, xmsg, ci->name); - *sent_header = 1; - } - - notice_lang(s_ChanServ, u, CHAN_XOP_LIST_FORMAT, index + 1, - access->nc->display); - return 1; -} - -static int xop_list_callback(User * u, int num, va_list args) -{ - ChannelInfo *ci = va_arg(args, ChannelInfo *); - int *sent_header = va_arg(args, int *); - int xlev = va_arg(args, int); - int xmsg = va_arg(args, int); - - if (num < 1 || num > ci->accesscount) - return 0; - - return xop_list(u, num - 1, ci, sent_header, xlev, xmsg); -} - - -static int do_xop(User * u, char *xname, int xlev, int *xmsgs) -{ - char *chan = strtok(NULL, " "); - char *cmd = strtok(NULL, " "); - char *nick = strtok(NULL, " "); - - ChannelInfo *ci; - NickAlias *na; - NickCore *nc; - - int i; - int change = 0; - short ulev; - int is_list = (cmd && stricmp(cmd, "LIST") == 0); - int is_servadmin = is_services_admin(u); - ChanAccess *access; - - /* If CLEAR, we don't need any parameters. - * If LIST, we don't *require* any parameters, but we can take any. - * If DEL or ADD we require a nick. */ - if (!cmd || ((is_list || !stricmp(cmd, "CLEAR")) ? 0 : !nick)) { - syntax_error(s_ChanServ, u, xname, xmsgs[0]); - } else if (!(ci = cs_findchan(chan))) { - notice_lang(s_ChanServ, u, CHAN_X_NOT_REGISTERED, chan); - } else if (ci->flags & CI_VERBOTEN) { - notice_lang(s_ChanServ, u, CHAN_X_FORBIDDEN, chan); - } else if (!(ci->flags & CI_XOP)) { - notice_lang(s_ChanServ, u, CHAN_XOP_ACCESS, s_ChanServ); - } else if (stricmp(cmd, "ADD") == 0) { - if (readonly) { - notice_lang(s_ChanServ, u, xmsgs[1]); - return MOD_CONT; - } - - ulev = get_access(u, ci); - - if ((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) { - for (i = 0; i < ci->accesscount; i++) - if (!ci->access[i].in_use) - break; - - if (i == ci->accesscount) { - if (i < CSAccessMax) { - ci->accesscount++; - ci->access = - srealloc(ci->access, - sizeof(ChanAccess) * ci->accesscount); - } else { - notice_lang(s_ChanServ, u, CHAN_XOP_REACHED_LIMIT, - CSAccessMax); - return MOD_CONT; - } - } - - access = &ci->access[i]; - access->nc = nc; - } - - access->in_use = 1; - access->level = xlev; - access->last_seen = 0; - - alog("%s: %s!%s@%s (level %d) %s access level %d to %s (group %s) on channel %s", s_ChanServ, u->nick, u->username, u->host, ulev, change ? "changed" : "set", access->level, na->nick, nc->display, ci->name); - - if (!change) { - notice_lang(s_ChanServ, u, xmsgs[3], access->nc->display, - ci->name); - } else { - notice_lang(s_ChanServ, u, xmsgs[4], access->nc->display, - ci->name); - } - - } else if (stricmp(cmd, "DEL") == 0) { - 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); - - /* 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; - 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; - } - } - } - } - } - } else if (stricmp(cmd, "LIST") == 0) { - int sent_header = 0; - - ulev = get_access(u, ci); - - if (!is_servadmin && ulev < ACCESS_AOP) { - notice_lang(s_ChanServ, u, ACCESS_DENIED); - return MOD_CONT; - } - - if (ci->accesscount == 0) { - notice_lang(s_ChanServ, u, xmsgs[11], ci->name); - return MOD_CONT; - } - - if (nick && strspn(nick, "1234567890,-") == strlen(nick)) { - process_numlist(nick, NULL, xop_list_callback, u, ci, - &sent_header, xlev, xmsgs[12]); - } else { - for (i = 0; i < ci->accesscount; i++) { - if (nick && ci->access[i].nc - && !match_wild_nocase(nick, ci->access[i].nc->display)) - continue; - xop_list(u, i, ci, &sent_header, xlev, xmsgs[12]); - } - } - if (!sent_header) - notice_lang(s_ChanServ, u, xmsgs[7], chan); - } else if (stricmp(cmd, "CLEAR") == 0) { - if (readonly) { - notice_lang(s_ChanServ, u, CHAN_ACCESS_DISABLED); - return MOD_CONT; - } - - if (ci->accesscount == 0) { - notice_lang(s_ChanServ, u, CHAN_ACCESS_LIST_EMPTY, chan); - return MOD_CONT; - } - - if (!is_servadmin && !is_founder(u, ci)) { - notice_lang(s_ChanServ, u, PERMISSION_DENIED); - return MOD_CONT; - } - - for (i = 0; i < ci->accesscount; i++) { - if (ci->access[i].in_use && ci->access[i].level == xlev) { - ci->access[i].nc = NULL; - ci->access[i].in_use = 0; - } - } - - notice_lang(s_ChanServ, u, xmsgs[13], ci->name); - } else { - syntax_error(s_ChanServ, u, xname, xmsgs[0]); - } - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_aop(User * u) -{ - return do_xop(u, "AOP", ACCESS_AOP, xop_msgs[0]); -} - -/*************************************************************************/ - -static int do_hop(User * u) -{ - return do_xop(u, "HOP", ACCESS_HOP, xop_msgs[3]); -} - -/*************************************************************************/ - -static int do_sop(User * u) -{ - return do_xop(u, "SOP", ACCESS_SOP, xop_msgs[1]); -} - -/*************************************************************************/ - -static int do_vop(User * u) -{ - return do_xop(u, "VOP", ACCESS_VOP, xop_msgs[2]); -} - -/*************************************************************************/ - -/* `last' is set to the last index this routine was called with - * `perm' is incremented whenever a permission-denied error occurs - */ - -static int access_del(User * u, ChanAccess * access, int *perm, int uacc) -{ - if (!access->in_use) - return 0; - if (!is_services_admin(u) && uacc <= access->level) { - (*perm)++; - return 0; - } - access->nc = NULL; - access->in_use = 0; - return 1; -} - -static int access_del_callback(User * u, int num, va_list args) -{ - ChannelInfo *ci = va_arg(args, ChannelInfo *); - int *last = va_arg(args, int *); - int *perm = va_arg(args, int *); - int uacc = va_arg(args, int); - if (num < 1 || num > ci->accesscount) - return 0; - *last = num; - return access_del(u, &ci->access[num - 1], perm, uacc); -} - - -static int access_list(User * u, int index, ChannelInfo * ci, - int *sent_header) -{ - ChanAccess *access = &ci->access[index]; - char *xop; - - if (!access->in_use) - return 0; - - if (!*sent_header) { - notice_lang(s_ChanServ, u, CHAN_ACCESS_LIST_HEADER, ci->name); - *sent_header = 1; - } - - if (ci->flags & CI_XOP) { - xop = get_xop_level(access->level); - notice_lang(s_ChanServ, u, CHAN_ACCESS_LIST_XOP_FORMAT, index + 1, - xop, access->nc->display); - } else { - notice_lang(s_ChanServ, u, CHAN_ACCESS_LIST_AXS_FORMAT, index + 1, - access->level, access->nc->display); - } - return 1; -} - -static int access_list_callback(User * u, int num, va_list args) -{ - ChannelInfo *ci = va_arg(args, ChannelInfo *); - int *sent_header = va_arg(args, int *); - if (num < 1 || num > ci->accesscount) - return 0; - return access_list(u, num - 1, ci, sent_header); -} - - -static int do_access(User * u) -{ - char *chan = strtok(NULL, " "); - char *cmd = strtok(NULL, " "); - char *nick = strtok(NULL, " "); - char *s = strtok(NULL, " "); - - ChannelInfo *ci; - NickAlias *na; - NickCore *nc; - ChanAccess *access; - - int i; - 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) { - notice_lang(s_ChanServ, u, CHAN_ACCESS_XOP, s_ChanServ); - } else if (((is_list && !check_access(u, ci, CA_ACCESS_LIST)) - || (!is_list && !check_access(u, ci, CA_ACCESS_CHANGE))) - && !is_servadmin) { - notice_lang(s_ChanServ, u, ACCESS_DENIED); - } else if (stricmp(cmd, "ADD") == 0) { - if (readonly) { - notice_lang(s_ChanServ, u, CHAN_ACCESS_DISABLED); - return MOD_CONT; - } - - level = atoi(s); - ulev = get_access(u, ci); - - if (!is_servadmin && level >= ulev) { - notice_lang(s_ChanServ, u, PERMISSION_DENIED); - return MOD_CONT; - } - - if (level == 0) { - notice_lang(s_ChanServ, u, CHAN_ACCESS_LEVEL_NONZERO); - return MOD_CONT; - } else if (level <= ACCESS_INVALID || level >= ACCESS_FOUNDER) { - notice_lang(s_ChanServ, u, CHAN_ACCESS_LEVEL_RANGE, - ACCESS_INVALID + 1, ACCESS_FOUNDER - 1); - return MOD_CONT; - } - - na = findnick(nick); - if (!na) { - notice_lang(s_ChanServ, u, CHAN_ACCESS_NICKS_ONLY); - return MOD_CONT; - } - if (na->status & NS_VERBOTEN) { - notice_lang(s_ChanServ, u, NICK_X_FORBIDDEN, nick); - return MOD_CONT; - } - - nc = na->nc; - for (access = ci->access, i = 0; i < ci->accesscount; - access++, i++) { - if (access->nc == nc) { - /* Don't allow lowering from a level >= ulev */ - if (!is_servadmin && access->level >= ulev) { - notice_lang(s_ChanServ, u, PERMISSION_DENIED); - return MOD_CONT; - } - if (access->level == level) { - notice_lang(s_ChanServ, u, CHAN_ACCESS_LEVEL_UNCHANGED, - access->nc->display, chan, level); - return MOD_CONT; - } - access->level = level; - alog("%s: %s!%s@%s (level %d) set access level %d to %s (group %s) on channel %s", s_ChanServ, u->nick, u->username, 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; - } - } - - for (i = 0; i < ci->accesscount; i++) { - if (!ci->access[i].in_use) - break; - } - if (i == ci->accesscount) { - if (i < CSAccessMax) { - ci->accesscount++; - ci->access = - srealloc(ci->access, - sizeof(ChanAccess) * ci->accesscount); - } else { - notice_lang(s_ChanServ, u, CHAN_ACCESS_REACHED_LIMIT, - CSAccessMax); - return MOD_CONT; - } - } - - access = &ci->access[i]; - access->nc = nc; - access->in_use = 1; - access->level = level; - access->last_seen = 0; - - alog("%s: %s!%s@%s (level %d) set access level %d to %s (group %s) on channel %s", s_ChanServ, u->nick, u->username, 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; - } - } - } - } - } - } else if (stricmp(cmd, "LIST") == 0) { - int sent_header = 0; - - if (ci->accesscount == 0) { - notice_lang(s_ChanServ, u, CHAN_ACCESS_LIST_EMPTY, chan); - return MOD_CONT; - } - if (nick && strspn(nick, "1234567890,-") == strlen(nick)) { - process_numlist(nick, NULL, access_list_callback, u, ci, - &sent_header); - } else { - for (i = 0; i < ci->accesscount; i++) { - if (nick && ci->access[i].nc - && !match_wild_nocase(nick, ci->access[i].nc->display)) - continue; - access_list(u, i, ci, &sent_header); - } - } - if (!sent_header) { - notice_lang(s_ChanServ, u, CHAN_ACCESS_NO_MATCH, chan); - } else { - notice_lang(s_ChanServ, u, CHAN_ACCESS_LIST_FOOTER, ci->name); - } - } else if (stricmp(cmd, "CLEAR") == 0) { - - if (readonly) { - notice_lang(s_ChanServ, u, CHAN_ACCESS_DISABLED); - return MOD_CONT; - } - - if (!is_servadmin && !is_founder(u, ci)) { - notice_lang(s_ChanServ, u, PERMISSION_DENIED); - return MOD_CONT; - } - - free(ci->access); - ci->access = NULL; - ci->accesscount = 0; - - notice_lang(s_ChanServ, u, CHAN_ACCESS_CLEAR, 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; -} /*************************************************************************/ @@ -4392,2170 +2525,3 @@ void stick_all(ChannelInfo * ci) free(av[0]); } } - -/* `last' is set to the last index this routine was called with */ -static int akick_del(User * u, AutoKick * akick) -{ - if (!(akick->flags & AK_USED)) - return 0; - if (akick->flags & AK_ISNICK) { - akick->u.nc = NULL; - } else { - free(akick->u.mask); - akick->u.mask = NULL; - } - if (akick->reason) { - free(akick->reason); - akick->reason = NULL; - } - if (akick->creator) { - free(akick->creator); - akick->creator = NULL; - } - akick->addtime = 0; - akick->flags = 0; - return 1; -} - -static int akick_del_callback(User * u, int num, va_list args) -{ - ChannelInfo *ci = va_arg(args, ChannelInfo *); - int *last = va_arg(args, int *); - if (num < 1 || num > ci->akickcount) - return 0; - *last = num; - return akick_del(u, &ci->akick[num - 1]); -} - - -static int akick_list(User * u, int index, ChannelInfo * ci, - int *sent_header) -{ - AutoKick *akick = &ci->akick[index]; - - if (!(akick->flags & AK_USED)) - return 0; - if (!*sent_header) { - notice_lang(s_ChanServ, u, CHAN_AKICK_LIST_HEADER, ci->name); - *sent_header = 1; - } - - notice_lang(s_ChanServ, u, CHAN_AKICK_LIST_FORMAT, index + 1, - ((akick->flags & AK_ISNICK) ? akick->u.nc-> - display : akick->u.mask), - (akick->reason ? akick-> - reason : getstring(u->na, NO_REASON))); - return 1; -} - -static int akick_list_callback(User * u, int num, va_list args) -{ - ChannelInfo *ci = va_arg(args, ChannelInfo *); - int *sent_header = va_arg(args, int *); - if (num < 1 || num > ci->akickcount) - return 0; - return akick_list(u, num - 1, ci, sent_header); -} - -static int akick_view(User * u, int index, ChannelInfo * ci, - int *sent_header) -{ - AutoKick *akick = &ci->akick[index]; - char timebuf[64]; - struct tm tm; - - if (!(akick->flags & AK_USED)) - return 0; - if (!*sent_header) { - notice_lang(s_ChanServ, u, CHAN_AKICK_LIST_HEADER, ci->name); - *sent_header = 1; - } - - if (akick->addtime) { - tm = *localtime(&akick->addtime); - strftime_lang(timebuf, sizeof(timebuf), u, - STRFTIME_SHORT_DATE_FORMAT, &tm); - } else { - snprintf(timebuf, sizeof(timebuf), getstring(u->na, UNKNOWN)); - } - - notice_lang(s_ChanServ, u, - ((akick-> - flags & AK_STUCK) ? CHAN_AKICK_VIEW_FORMAT_STUCK : - CHAN_AKICK_VIEW_FORMAT), index + 1, - ((akick->flags & AK_ISNICK) ? akick->u.nc-> - display : akick->u.mask), - akick->creator ? akick->creator : getstring(u->na, - UNKNOWN), - timebuf, - (akick->reason ? akick-> - reason : getstring(u->na, NO_REASON))); - return 1; -} - -static int akick_view_callback(User * u, int num, va_list args) -{ - ChannelInfo *ci = va_arg(args, ChannelInfo *); - int *sent_header = va_arg(args, int *); - if (num < 1 || num > ci->akickcount) - return 0; - return akick_view(u, num - 1, ci, sent_header); -} - -static int do_akick(User * u) -{ - char *chan = strtok(NULL, " "); - char *cmd = strtok(NULL, " "); - char *mask = strtok(NULL, " "); - char *reason = strtok(NULL, ""); - ChannelInfo *ci; - AutoKick *akick; - int i; - Channel *c; - struct c_userlist *cu = NULL; - struct c_userlist *next; - 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); - NickCore *nc = NULL; - char *nick, *user, *host; - - if (readonly) { - notice_lang(s_ChanServ, u, CHAN_AKICK_DISABLED); - return MOD_CONT; - } - - if (!na) { - split_usermask(mask, &nick, &user, &host); - mask = - scalloc(strlen(nick) + strlen(user) + strlen(host) + 3, 1); - sprintf(mask, "%s!%s@%s", nick, user, host); - free(nick); - free(user); - free(host); - } else { - if (na->status & NS_VERBOTEN) { - notice_lang(s_ChanServ, u, NICK_X_FORBIDDEN, mask); - return MOD_CONT; - } - nc = na->nc; - } - - /* Check excepts BEFORE we get this far */ - if (ircd->except) { - if (is_excepted_mask(ci, mask) == 1) { - notice_lang(s_ChanServ, u, CHAN_EXCEPTED, mask, chan); - 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); - return MOD_CONT; - } - } - - for (i = 0; i < ci->akickcount; i++) { - if (!(ci->akick[i].flags & AK_USED)) - break; - } - if (i == ci->akickcount) { - if (ci->akickcount >= CSAutokickMax) { - notice_lang(s_ChanServ, u, CHAN_AKICK_REACHED_LIMIT, - CSAutokickMax); - return MOD_CONT; - } - ci->akickcount++; - ci->akick = - srealloc(ci->akick, sizeof(AutoKick) * ci->akickcount); - } - akick = &ci->akick[i]; - akick->flags = AK_USED; - if (nc) { - akick->flags |= AK_ISNICK; - akick->u.nc = nc; - } else { - akick->u.mask = mask; - } - akick->creator = sstrdup(u->nick); - akick->addtime = time(NULL); - if (reason) { - if (strlen(reason) > 200) - reason[200] = '\0'; - akick->reason = sstrdup(reason); - } else { - akick->reason = NULL; - } - - /* Auto ENFORCE #63 */ - c = findchan(ci->name); - if (c) { - cu = c->users; - while (cu) { - next = cu->next; - if (check_kick(cu->user, c->name)) { - argv[0] = sstrdup(c->name); - argv[1] = sstrdup(cu->user->nick); - 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); - - } 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 = 1; 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); - } - ci->akick[a].reason = - sstrdup(ci->akick[b].reason); - ci->akick[a].creator = - sstrdup(ci->akick[b].creator); - ci->akick[a].addtime = ci->akick[b].addtime; - - akick_del(u, &ci->akick[b]); - break; - } - } - } - } - } - } else if (stricmp(cmd, "LIST") == 0) { - int sent_header = 0; - - if (ci->akickcount == 0) { - notice_lang(s_ChanServ, u, CHAN_AKICK_LIST_EMPTY, chan); - return MOD_CONT; - } - if (mask && isdigit(*mask) && - strspn(mask, "1234567890,-") == strlen(mask)) { - process_numlist(mask, NULL, akick_list_callback, u, ci, - &sent_header); - } else { - for (akick = ci->akick, i = 0; i < ci->akickcount; - akick++, i++) { - if (!(akick->flags & AK_USED)) - continue; - if (mask) { - if (!(akick->flags & AK_ISNICK) - && !match_wild_nocase(mask, akick->u.mask)) - continue; - if ((akick->flags & AK_ISNICK) - && !match_wild_nocase(mask, akick->u.nc->display)) - continue; - } - akick_list(u, i, ci, &sent_header); - } - } - if (!sent_header) - notice_lang(s_ChanServ, u, CHAN_AKICK_NO_MATCH, chan); - - } else if (stricmp(cmd, "VIEW") == 0) { - int sent_header = 0; - - if (ci->akickcount == 0) { - notice_lang(s_ChanServ, u, CHAN_AKICK_LIST_EMPTY, chan); - return MOD_CONT; - } - if (mask && isdigit(*mask) && - strspn(mask, "1234567890,-") == strlen(mask)) { - process_numlist(mask, NULL, akick_view_callback, u, ci, - &sent_header); - } else { - for (akick = ci->akick, i = 0; i < ci->akickcount; - akick++, i++) { - if (!(akick->flags & AK_USED)) - continue; - if (mask) { - if (!(akick->flags & AK_ISNICK) - && !match_wild_nocase(mask, akick->u.mask)) - continue; - if ((akick->flags & AK_ISNICK) - && !match_wild_nocase(mask, akick->u.nc->display)) - continue; - } - akick_view(u, i, ci, &sent_header); - } - } - if (!sent_header) - notice_lang(s_ChanServ, u, CHAN_AKICK_NO_MATCH, chan); - - } else if (stricmp(cmd, "ENFORCE") == 0) { - Channel *c = findchan(ci->name); - struct c_userlist *cu = NULL; - struct c_userlist *next; - char *argv[3]; - int count = 0; - - if (!c) { - notice_lang(s_ChanServ, u, CHAN_X_NOT_IN_USE, ci->name); - return MOD_CONT; - } - - cu = c->users; - - while (cu) { - next = cu->next; - if (check_kick(cu->user, c->name)) { - argv[0] = sstrdup(c->name); - argv[1] = sstrdup(cu->user->nick); - argv[2] = sstrdup(CSAutokickReason); - - do_kick(s_ChanServ, 3, argv); - - free(argv[2]); - free(argv[1]); - free(argv[0]); - - count++; - } - cu = next; - } - - notice_lang(s_ChanServ, u, CHAN_AKICK_ENFORCE_DONE, chan, count); - - } else if (stricmp(cmd, "CLEAR") == 0) { - - if (readonly) { - notice_lang(s_ChanServ, u, CHAN_AKICK_DISABLED); - return MOD_CONT; - } - - for (akick = ci->akick, i = 0; i < ci->akickcount; akick++, i++) { - if (!(akick->flags & AK_USED)) - continue; - akick_del(u, akick); - } - - free(ci->akick); - ci->akick = NULL; - ci->akickcount = 0; - - notice_lang(s_ChanServ, u, CHAN_AKICK_CLEAR, ci->name); - - } else { - syntax_error(s_ChanServ, u, "AKICK", CHAN_AKICK_SYNTAX); - } - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_levels(User * u) -{ - char *chan = strtok(NULL, " "); - char *cmd = strtok(NULL, " "); - char *what = strtok(NULL, " "); - char *s = strtok(NULL, " "); - char *error; - - ChannelInfo *ci; - 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; -} - -/*************************************************************************/ - -/* SADMINS and users, who have identified for a channel, can now cause it's - * Enstry Message and Successor to be displayed by supplying the ALL parameter. - * Syntax: INFO channel [ALL] - * -TheShadow (29 Mar 1999) - */ - -static int do_info(User * u) -{ - char *chan = strtok(NULL, " "); - char *param = strtok(NULL, " "); - ChannelInfo *ci; - char buf[BUFSIZE], *end; - struct tm *tm; - int need_comma = 0; - const char *commastr = getstring(u->na, COMMA_SPACE); - int is_servadmin = is_services_admin(u); - int show_all = 0; - 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 & CMODE_s) - && (!ci->c - || !(ci->c-> - mode & CMODE_s))))) { - notice_lang(s_ChanServ, u, CHAN_INFO_LAST_TOPIC, - ci->last_topic); - notice_lang(s_ChanServ, u, CHAN_INFO_TOPIC_SET_BY, - ci->last_topic_setter); - } - - if (ci->entry_message && show_all) - notice_lang(s_ChanServ, u, CHAN_INFO_ENTRYMSG, - ci->entry_message); - if (ci->url) - notice_lang(s_ChanServ, u, CHAN_INFO_URL, ci->url); - if (ci->email) - notice_lang(s_ChanServ, u, CHAN_INFO_EMAIL, ci->email); - - if (show_all) { - notice_lang(s_ChanServ, u, CHAN_INFO_BANTYPE, ci->bantype); - - end = buf; - *end = 0; - if (ci->flags & CI_KEEPTOPIC) { - end += snprintf(end, sizeof(buf) - (end - buf), "%s", - getstring(u->na, CHAN_INFO_OPT_KEEPTOPIC)); - need_comma = 1; - } - if (ci->flags & CI_OPNOTICE) { - end += snprintf(end, sizeof(buf) - (end - buf), "%s%s", - need_comma ? commastr : "", - getstring(u->na, CHAN_INFO_OPT_OPNOTICE)); - need_comma = 1; - } - if (ci->flags & CI_PEACE) { - end += snprintf(end, sizeof(buf) - (end - buf), "%s%s", - need_comma ? commastr : "", - getstring(u->na, CHAN_INFO_OPT_PEACE)); - need_comma = 1; - } - if (ci->flags & CI_PRIVATE) { - end += snprintf(end, sizeof(buf) - (end - buf), "%s%s", - need_comma ? commastr : "", - getstring(u->na, CHAN_INFO_OPT_PRIVATE)); - need_comma = 1; - } - if (ci->flags & CI_RESTRICTED) { - end += snprintf(end, sizeof(buf) - (end - buf), "%s%s", - need_comma ? commastr : "", - getstring(u->na, - CHAN_INFO_OPT_RESTRICTED)); - need_comma = 1; - } - if (ci->flags & CI_SECURE) { - end += snprintf(end, sizeof(buf) - (end - buf), "%s%s", - need_comma ? commastr : "", - getstring(u->na, CHAN_INFO_OPT_SECURE)); - need_comma = 1; - } - if (ci->flags & CI_SECUREOPS) { - end += snprintf(end, sizeof(buf) - (end - buf), "%s%s", - need_comma ? commastr : "", - getstring(u->na, CHAN_INFO_OPT_SECUREOPS)); - need_comma = 1; - } - if (ci->flags & CI_SECUREFOUNDER) { - end += snprintf(end, sizeof(buf) - (end - buf), "%s%s", - need_comma ? commastr : "", - getstring(u->na, - CHAN_INFO_OPT_SECUREFOUNDER)); - need_comma = 1; - } - if ((ci->flags & CI_SIGNKICK) - || (ci->flags & CI_SIGNKICK_LEVEL)) { - end += - snprintf(end, sizeof(buf) - (end - buf), "%s%s", - need_comma ? commastr : "", getstring(u->na, - CHAN_INFO_OPT_SIGNKICK)); - need_comma = 1; - } - if (ci->flags & CI_TOPICLOCK) { - end += snprintf(end, sizeof(buf) - (end - buf), "%s%s", - need_comma ? commastr : "", - getstring(u->na, CHAN_INFO_OPT_TOPICLOCK)); - need_comma = 1; - } - if (ci->flags & CI_XOP) { - end += snprintf(end, sizeof(buf) - (end - buf), "%s%s", - need_comma ? commastr : "", - getstring(u->na, CHAN_INFO_OPT_XOP)); - need_comma = 1; - } - notice_lang(s_ChanServ, u, CHAN_INFO_OPTIONS, - *buf ? buf : getstring(u->na, CHAN_INFO_OPT_NONE)); - notice_lang(s_ChanServ, u, CHAN_INFO_MODE_LOCK, - get_mlock_modes(ci, 1)); - - } - if (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; -} - -/*************************************************************************/ - -static int do_list(User * u) -{ - char *pattern = strtok(NULL, " "); - ChannelInfo *ci; - int nchans, i; - char buf[BUFSIZE]; - int is_servadmin = is_services_admin(u); - int count = 0, from = 0, to = 0; - char *tmp = NULL; - char *s = NULL; - char *keyword; - int32 matchflags = 0; - - - if (CSListOpersOnly && (!u || !is_oper(u))) { - notice_lang(s_ChanServ, u, PERMISSION_DENIED); - return MOD_CONT; - } - - if (!pattern) { - syntax_error(s_ChanServ, u, "LIST", - is_servadmin ? CHAN_LIST_SERVADMIN_SYNTAX : - CHAN_LIST_SYNTAX); - } else { - - if (pattern) { - if (pattern[0] == '#') { - tmp = myStrGetOnlyToken((pattern + 1), '-', 0); /* Read FROM out */ - if (!tmp) { - return MOD_CONT; - } - for (s = tmp; *s; s++) { - if (!isdigit(*s)) { - return MOD_CONT; - } - } - from = atoi(tmp); - tmp = myStrGetTokenRemainder(pattern, '-', 1); /* Read TO out */ - if (!tmp) { - return MOD_CONT; - } - for (s = tmp; *s; s++) { - if (!isdigit(*s)) { - return MOD_CONT; - } - } - to = atoi(tmp); - pattern = sstrdup("*"); - } - } - - nchans = 0; - - while (is_servadmin && (keyword = strtok(NULL, " "))) { - if (stricmp(keyword, "FORBIDDEN") == 0) - matchflags |= CI_VERBOTEN; - if (stricmp(keyword, "SUSPENDED") == 0) - matchflags |= CI_SUSPENDED; - if (stricmp(keyword, "NOEXPIRE") == 0) - matchflags |= CI_NO_EXPIRE; - } - - notice_lang(s_ChanServ, u, CHAN_LIST_HEADER, pattern); - for (i = 0; i < 256; i++) { - for (ci = chanlists[i]; ci; ci = ci->next) { - if (!is_servadmin && ((ci->flags & CI_PRIVATE) - || (ci->flags & CI_VERBOTEN))) - continue; - if ((matchflags != 0) && !(ci->flags & matchflags)) - continue; - - if (stricmp(pattern, ci->name) == 0 - || match_wild_nocase(pattern, ci->name)) { - if ((((count + 1 >= from) && (count + 1 <= to)) - || ((from == 0) && (to == 0))) - && (++nchans <= CSListMax)) { - char noexpire_char = ' '; - if (is_servadmin && (ci->flags & CI_NO_EXPIRE)) - noexpire_char = '!'; - - if (ci->flags & CI_VERBOTEN) { - snprintf(buf, sizeof(buf), - "%-20s [Forbidden]", ci->name); - } else if (ci->flags & CI_SUSPENDED) { - snprintf(buf, sizeof(buf), - "%-20s [Suspended]", ci->name); - } else { - snprintf(buf, sizeof(buf), "%-20s %s", - ci->name, ci->desc ? ci->desc : ""); - } - - notice_user(s_ChanServ, u, " %c%s", - noexpire_char, buf); - } - count++; - } - } - } - notice_lang(s_ChanServ, u, CHAN_LIST_END, - nchans > CSListMax ? CSListMax : nchans, nchans); - } - return MOD_CONT; - -} - -/*************************************************************************/ - -static int do_invite(User * u) -{ - char *chan = strtok(NULL, " "); - Channel *c; - ChannelInfo *ci; - - if (!chan) { - syntax_error(s_ChanServ, u, "INVITE", CHAN_INVITE_SYNTAX); - } else if (!(c = findchan(chan))) { - notice_lang(s_ChanServ, u, CHAN_X_NOT_IN_USE, chan); - } else if (!(ci = c->ci)) { - notice_lang(s_ChanServ, u, CHAN_X_NOT_REGISTERED, chan); - } else if (ci->flags & CI_VERBOTEN) { - notice_lang(s_ChanServ, u, CHAN_X_FORBIDDEN, chan); - } else if (!u || !check_access(u, ci, CA_INVITE)) { - notice_lang(s_ChanServ, u, PERMISSION_DENIED); - } else { - anope_cmd_invite(whosends(ci), chan, u->nick); - } - return MOD_CONT; -} - -/*************************************************************************/ - -/* do_util: not a command, but does the job of other */ - -static int do_util(User * u, CSModeUtil * util) -{ - char *av[2]; - char *chan = strtok(NULL, " "); - char *nick = strtok(NULL, " "); - - Channel *c; - ChannelInfo *ci; - User *u2; - - int is_same; - - if (!chan) { - struct u_chanlist *uc; - - av[0] = util->mode; - av[1] = u->nick; - - /* Sets the mode to the user on every channels he is on. */ - - for (uc = u->chans; uc; uc = uc->next) { - if ((ci = uc->chan->ci) && !(ci->flags & CI_VERBOTEN) - && check_access(u, ci, util->levelself)) { - anope_cmd_mode(whosends(ci), uc->chan->name, "%s %s", - util->mode, u->nick); - chan_set_modes(s_ChanServ, uc->chan, 2, av, 1); - - 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)) { - 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, 1); - - if (util->notice && ci->flags & util->notice) - notice(whosends(ci), c->name, "%s command used for %s by %s", - util->name, u2->nick, u->nick); - } - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_op(User * u) -{ - return do_util(u, &csmodeutils[MUT_OP]); -} - -/*************************************************************************/ - -static int do_deop(User * u) -{ - return do_util(u, &csmodeutils[MUT_DEOP]); -} - -/*************************************************************************/ - -static int do_voice(User * u) -{ - return do_util(u, &csmodeutils[MUT_VOICE]); -} - -/*************************************************************************/ - -static int do_devoice(User * u) -{ - return do_util(u, &csmodeutils[MUT_DEVOICE]); -} - -/*************************************************************************/ - -static int do_halfop(User * u) -{ - if (ircd->halfop) { - return do_util(u, &csmodeutils[MUT_HALFOP]); - } else { - return MOD_CONT; - } -} - -/*************************************************************************/ - -static int do_dehalfop(User * u) -{ - if (ircd->halfop) { - return do_util(u, &csmodeutils[MUT_DEHALFOP]); - } else { - return MOD_CONT; - } -} - -/*************************************************************************/ - -static int do_protect(User * u) -{ - if (ircd->protect || ircd->admin) { - return do_util(u, &csmodeutils[MUT_PROTECT]); - } else { - return MOD_CONT; - } -} - -/*************************************************************************/ - -static int do_deprotect(User * u) -{ - if (ircd->protect || ircd->admin) { - return do_util(u, &csmodeutils[MUT_DEPROTECT]); - } else { - return MOD_CONT; - } -} - -/*************************************************************************/ - -static 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; -} - -/*************************************************************************/ - -static 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; -} - -/*************************************************************************/ - -static int do_cs_kick(User * u) -{ - char *chan = strtok(NULL, " "); - char *params = strtok(NULL, " "); - char *reason = strtok(NULL, ""); - - Channel *c; - ChannelInfo *ci; - User *u2; - - int is_same; - - if (!reason) { - reason = "Requested"; - } else { - if (strlen(reason) > 200) - reason[200] = '\0'; - } - - if (!chan) { - struct u_chanlist *uc, *next; - - /* Kicks the user on every channels he is on. */ - - for (uc = u->chans; uc; uc = next) { - next = uc->next; - if ((ci = uc->chan->ci) && !(ci->flags & CI_VERBOTEN) - && check_access(u, ci, CA_KICKME)) { - char *av[3]; - - if ((ci->flags & CI_SIGNKICK) - || ((ci->flags & CI_SIGNKICK_LEVEL) - && !check_access(u, ci, CA_SIGNKICK))) - 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; -} - -/*************************************************************************/ - -static int do_ban(User * u) -{ - char *chan = strtok(NULL, " "); - char *params = strtok(NULL, " "); - char *reason = strtok(NULL, ""); - - Channel *c; - ChannelInfo *ci; - User *u2; - - int is_same; - - if (!reason) { - reason = "Requested"; - } else { - if (strlen(reason) > 200) - reason[200] = '\0'; - } - - if (!chan) { - struct u_chanlist *uc, *next; - - /* Bans the user on every channels he is on. */ - - for (uc = u->chans; uc; uc = next) { - next = uc->next; - if ((ci = uc->chan->ci) && !(ci->flags & CI_VERBOTEN) - && check_access(u, ci, CA_BANME)) { - char *av[3]; - char mask[BUFSIZE]; - - /* - * 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; -} - -/*************************************************************************/ - -static int do_cs_topic(User * u) -{ - char *chan = strtok(NULL, " "); - char *topic = strtok(NULL, ""); - - Channel *c; - ChannelInfo *ci; - - if (!chan) { - syntax_error(s_ChanServ, u, "TOPIC", CHAN_TOPIC_SYNTAX); - } else if (!(c = findchan(chan))) { - notice_lang(s_ChanServ, u, CHAN_X_NOT_IN_USE, chan); - } else if (!(ci = c->ci)) { - notice_lang(s_ChanServ, u, CHAN_X_NOT_REGISTERED, c->name); - } else if (ci->flags & CI_VERBOTEN) { - notice_lang(s_ChanServ, u, CHAN_X_FORBIDDEN, ci->name); - } else if (!is_services_admin(u) && !check_access(u, ci, CA_TOPIC)) { - notice_lang(s_ChanServ, u, PERMISSION_DENIED); - } else { - if (ci->last_topic) - free(ci->last_topic); - ci->last_topic = topic ? sstrdup(topic) : NULL; - strscpy(ci->last_topic_setter, u->nick, NICKMAX); - ci->last_topic_time = time(NULL); - - if (c->topic) - free(c->topic); - c->topic = topic ? sstrdup(topic) : NULL; - strscpy(c->topic_setter, u->nick, NICKMAX); - if (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, time(NULL)); - 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; -} - -/*************************************************************************/ - -static int do_unban(User * u) -{ - char *chan = strtok(NULL, " "); - Channel *c; - ChannelInfo *ci; - - if (!chan) { - syntax_error(s_ChanServ, u, "UNBAN", CHAN_UNBAN_SYNTAX); - } else if (!(c = findchan(chan))) { - notice_lang(s_ChanServ, u, CHAN_X_NOT_IN_USE, chan); - } else if (!(ci = c->ci)) { - notice_lang(s_ChanServ, u, CHAN_X_NOT_REGISTERED, chan); - } else if (ci->flags & CI_VERBOTEN) { - notice_lang(s_ChanServ, u, CHAN_X_FORBIDDEN, chan); - } else if (!check_access(u, ci, CA_UNBAN)) { - notice_lang(s_ChanServ, u, PERMISSION_DENIED); - } else { - common_unban(ci, u->nick); - notice_lang(s_ChanServ, u, CHAN_UNBANNED, chan); - } - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_clear(User * u) -{ - char *chan = strtok(NULL, " "); - char *what = strtok(NULL, " "); - char tmp[BUFSIZE]; - 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]; - int i; - - /* Save original ban info */ - int count = c->bancount; - char **bans = scalloc(sizeof(char *) * count, 1); - for (i = 0; i < count; i++) - bans[i] = sstrdup(c->bans[i]); - - for (i = 0; i < count; i++) { - av[0] = sstrdup("-b"); - av[1] = bans[i]; - anope_cmd_mode(whosends(ci), chan, "%s %s", av[0], av[1]); - chan_set_modes(whosends(ci), c, 2, av, 0); - free(av[1]); - free(av[0]); - } - notice_lang(s_ChanServ, u, CHAN_CLEARED_BANS, chan); - free(bans); - } else if (ircd->except && stricmp(what, "excepts") == 0) { - char *av[2]; - int i; - - /* Save original except info */ - int count = c->exceptcount; - char **excepts = scalloc(sizeof(char *) * count, 1); - for (i = 0; i < count; i++) - excepts[i] = sstrdup(c->excepts[i]); - - for (i = 0; i < count; i++) { - av[0] = sstrdup("-e"); - av[1] = excepts[i]; - anope_cmd_mode(whosends(ci), chan, "%s %s", av[0], av[1]); - chan_set_modes(whosends(ci), c, 2, av, 0); - free(av[1]); - free(av[0]); - } - notice_lang(s_ChanServ, u, CHAN_CLEARED_EXCEPTS, chan); - free(excepts); - - } else if (ircd->invitemode && stricmp(what, "invites") == 0) { - char *av[2]; - int i; - - /* Save original except info */ - int count = c->invitecount; - char **invites = scalloc(sizeof(char *) * count, 1); - for (i = 0; i < count; i++) - invites[i] = sstrdup(c->invite[i]); - - for (i = 0; i < count; i++) { - av[0] = sstrdup("-I"); - av[1] = invites[i]; - anope_cmd_mode(whosends(ci), chan, "%s %s", av[0], av[1]); - chan_set_modes(whosends(ci), c, 2, av, 0); - free(av[1]); - free(av[0]); - } - notice_lang(s_ChanServ, u, CHAN_CLEARED_INVITES, chan); - free(invites); - - } else if (stricmp(what, "modes") == 0) { - char buf[BUFSIZE], *end = buf; - 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); - } - - - - /* TODO: decide if the above implementation is better than this one. */ - - if (0) { - CBModeInfo *cbmi = cbmodeinfos; - CBMode *cbm; - - do { - if (c->mode & cbmi->flag) - *end++ = cbmi->mode; - } while ((++cbmi)->flag != 0); - - cbmi = cbmodeinfos; - - do { - if (cbmi->getvalue && (c->mode & cbmi->flag) - && !(cbmi->flags & CBM_MINUS_NO_ARG)) { - char *value = cbmi->getvalue(c); - - if (value) { - *end++ = ' '; - while (*value) - *end++ = *value++; - - /* Free the value */ - cbm = &cbmodes[(int) cbmi->mode]; - cbm->setvalue(c, NULL); - } - } - } while ((++cbmi)->flag != 0); - - *end = 0; - - anope_cmd_mode(whosends(ci), c->name, "-%s", buf); - c->mode = 0; - check_modes(c); - } - notice_lang(s_ChanServ, u, CHAN_CLEARED_MODES, chan); - } else if (stricmp(what, "ops") == 0) { - char *av[3]; - struct c_userlist *cu, *next; - - if (ircd->svsmode_ucmode) { - av[0] = sstrdup(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; - av[0] = sstrdup(chan); - if (!chan_has_user_status(c, cu->user, CUS_OP)) { - if (!chan_has_user_status(c, cu->user, CUS_PROTECT)) { - if (!chan_has_user_status(c, cu->user, CUS_OWNER)) { - continue; - } else { - snprintf(tmp, BUFSIZE, "%so", - ircd->ownerunset); - av[1] = sstrdup(tmp); - - } - } else { - snprintf(tmp, BUFSIZE, "%so", ircd->adminunset); - av[1] = sstrdup(tmp); - } - } else { - av[1] = sstrdup("-o"); - } - av[2] = sstrdup(cu->user->nick); - do_cmode(s_ChanServ, 3, av); - free(av[2]); - free(av[1]); - free(av[0]); - } - } else { - for (cu = c->users; cu; cu = next) { - next = cu->next; - av[0] = sstrdup(chan); - if (!chan_has_user_status(c, cu->user, CUS_OP)) { - if (!chan_has_user_status(c, cu->user, CUS_PROTECT)) { - if (!chan_has_user_status(c, cu->user, CUS_OWNER)) { - continue; - } else { - snprintf(tmp, BUFSIZE, "%so", - ircd->ownerunset); - av[1] = sstrdup(tmp); - } - } else { - snprintf(tmp, BUFSIZE, "%so", ircd->adminunset); - av[1] = sstrdup(tmp); - } - } else { - av[1] = sstrdup("-o"); - } - av[2] = sstrdup(cu->user->nick); - anope_cmd_mode(whosends(ci), av[0], "%s :%s", av[1], - av[2]); - do_cmode(s_ChanServ, 3, av); - free(av[2]); - free(av[1]); - free(av[0]); - } - } - notice_lang(s_ChanServ, u, CHAN_CLEARED_OPS, chan); - } else if (ircd->halfop && stricmp(what, "hops") == 0) { - char *av[3]; - struct c_userlist *cu, *next; - - for (cu = c->users; cu; cu = next) { - next = cu->next; - if (!chan_has_user_status(c, cu->user, CUS_HALFOP)) - continue; - av[0] = sstrdup(chan); - av[1] = sstrdup("-h"); - av[2] = sstrdup(cu->user->nick); - if (ircd->svsmode_ucmode) { - anope_cmd_svsmode_chan(av[0], av[1], NULL); - do_cmode(s_ChanServ, 3, av); - break; - } else { - anope_cmd_mode(whosends(ci), av[0], "%s :%s", av[1], - av[2]); - } - do_cmode(s_ChanServ, 3, av); - free(av[2]); - free(av[1]); - free(av[0]); - } - notice_lang(s_ChanServ, u, CHAN_CLEARED_HOPS, chan); - } else if (stricmp(what, "voices") == 0) { - char *av[3]; - struct c_userlist *cu, *next; - - for (cu = c->users; cu; cu = next) { - next = cu->next; - if (!chan_has_user_status(c, cu->user, CUS_VOICE)) - continue; - av[0] = sstrdup(chan); - av[1] = sstrdup("-v"); - av[2] = sstrdup(cu->user->nick); - if (ircd->svsmode_ucmode) { - anope_cmd_svsmode_chan(av[0], av[1], NULL); - do_cmode(s_ChanServ, 3, av); - break; - } else { - anope_cmd_mode(whosends(ci), av[0], "%s :%s", av[1], - av[2]); - } - do_cmode(s_ChanServ, 3, av); - free(av[2]); - free(av[1]); - free(av[0]); - } - notice_lang(s_ChanServ, u, CHAN_CLEARED_VOICES, chan); - } else if (stricmp(what, "users") == 0) { - char *av[3]; - struct c_userlist *cu, *next; - char buf[256]; - - snprintf(buf, sizeof(buf), "CLEAR USERS command from %s", u->nick); - - for (cu = c->users; cu; cu = next) { - next = cu->next; - av[0] = sstrdup(chan); - av[1] = sstrdup(cu->user->nick); - av[2] = sstrdup(buf); - 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; -} - -/*************************************************************************/ - -static 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; -} - -/*************************************************************************/ - -static int do_getpass(User * u) -{ -#ifndef USE_ENCRYPTION - char *chan = strtok(NULL, " "); - ChannelInfo *ci; -#endif - - /* Assumes that permission checking has already been done. */ -#ifdef USE_ENCRYPTION - notice_lang(s_ChanServ, u, CHAN_GETPASS_UNAVAILABLE); -#else - if (!chan) { - syntax_error(s_ChanServ, u, "GETPASS", CHAN_GETPASS_SYNTAX); - } else if (!(ci = cs_findchan(chan))) { - notice_lang(s_ChanServ, u, CHAN_X_NOT_REGISTERED, chan); - } else if (ci->flags & CI_VERBOTEN) { - notice_lang(s_ChanServ, u, CHAN_X_FORBIDDEN, chan); - } else if (CSRestrictGetPass && !is_services_root(u)) { - notice_lang(s_ChanServ, u, PERMISSION_DENIED); - } else { - alog("%s: %s!%s@%s used GETPASS on %s", - s_ChanServ, u->nick, u->username, 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, ci->founderpass); - } -#endif - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_sendpass(User * u) -{ -#ifndef USE_ENCRYPTION - char *chan = strtok(NULL, " "); - ChannelInfo *ci; - NickCore *founder; -#endif - -#ifdef USE_ENCRYPTION - notice_lang(s_ChanServ, u, CHAN_SENDPASS_UNAVAILABLE); -#else - if (!chan) { - syntax_error(s_ChanServ, u, "SENDPASS", CHAN_SENDPASS_SYNTAX); - } else if (RestrictMail && !is_oper(u)) { - notice_lang(s_ChanServ, u, PERMISSION_DENIED); - } else if (!(ci = cs_findchan(chan)) || !(founder = ci->founder)) { - notice_lang(s_ChanServ, u, CHAN_X_NOT_REGISTERED, chan); - } else if (ci->flags & CI_VERBOTEN) { - notice_lang(s_ChanServ, u, CHAN_X_FORBIDDEN, chan); - } else { - char buf[BUFSIZE]; - MailInfo *mail; - - snprintf(buf, sizeof(buf), - getstring2(founder, CHAN_SENDPASS_SUBJECT), ci->name); - mail = MailBegin(u, founder, buf, s_ChanServ); - if (!mail) - return MOD_CONT; - - fprintf(mail->pipe, getstring2(founder, CHAN_SENDPASS_HEAD)); - fprintf(mail->pipe, "\n\n"); - fprintf(mail->pipe, getstring2(founder, CHAN_SENDPASS_LINE_1), - ci->name); - fprintf(mail->pipe, "\n\n"); - fprintf(mail->pipe, getstring2(founder, CHAN_SENDPASS_LINE_2), - ci->founderpass); - fprintf(mail->pipe, "\n\n"); - fprintf(mail->pipe, getstring2(founder, CHAN_SENDPASS_LINE_3)); - fprintf(mail->pipe, "\n\n"); - fprintf(mail->pipe, getstring2(founder, CHAN_SENDPASS_LINE_4)); - fprintf(mail->pipe, "\n\n"); - fprintf(mail->pipe, getstring2(founder, CHAN_SENDPASS_LINE_5), - NetworkName); - fprintf(mail->pipe, "\n.\n"); - - MailEnd(mail); - - alog("%s: %s!%s@%s used SENDPASS on %s", s_ChanServ, u->nick, - u->username, u->host, chan); - notice_lang(s_ChanServ, u, CHAN_SENDPASS_OK, chan); - } -#endif - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_forbid(User * u) -{ - ChannelInfo *ci; - char *chan = strtok(NULL, " "); - char *reason = strtok(NULL, ""); - - Channel *c; - - /* Assumes that permission checking has already been done. */ - if (!chan || (ForceForbidReason && !reason)) { - syntax_error(s_ChanServ, u, "FORBID", - (ForceForbidReason ? CHAN_FORBID_SYNTAX_REASON : - CHAN_FORBID_SYNTAX)); - return MOD_CONT; - } - if (readonly) - notice_lang(s_ChanServ, u, READ_ONLY_MODE); - if ((ci = cs_findchan(chan)) != NULL) - delchan(ci); - ci = makechan(chan); - if (ci) { - ci->flags |= CI_VERBOTEN; - ci->forbidby = sstrdup(u->nick); - if (reason) - ci->forbidreason = sstrdup(reason); - - if ((c = findchan(ci->name))) { - struct c_userlist *cu, *next; - char *av[3]; - - for (cu = c->users; cu; cu = next) { - next = cu->next; - - if (is_oper(cu->user)) - continue; - - av[0] = c->name; - av[1] = cu->user->nick; - av[2] = reason ? reason : "CHAN_FORBID_REASON"; - 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, chan); - } else { - alog("%s: Valid FORBID for %s by %s failed", s_ChanServ, ci->name, - u->nick); - notice_lang(s_ChanServ, u, CHAN_FORBID_FAILED, chan); - } - return MOD_CONT; -} - - /*************************************************************************/ - -static int do_suspend(User * u) -{ - ChannelInfo *ci; - char *chan = strtok(NULL, " "); - char *reason = strtok(NULL, ""); - - Channel *c; - - /* Assumes that permission checking has already been done. */ - if (!chan || (ForceForbidReason && !reason)) { - syntax_error(s_ChanServ, u, "SUSPEND", - (ForceForbidReason ? CHAN_SUSPEND_SYNTAX_REASON : - CHAN_SUSPEND_SYNTAX)); - return MOD_CONT; - } - - /* 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, chan); - } else { - alog("%s: Valid SUSPEND for %s by %s failed", s_ChanServ, ci->name, - u->nick); - notice_lang(s_ChanServ, u, CHAN_SUSPEND_FAILED, chan); - } - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_unsuspend(User * u) -{ - ChannelInfo *ci; - char *chan = strtok(NULL, " "); - - /* Assumes that permission checking has already been done. */ - if (!chan) { - syntax_error(s_ChanServ, u, "UNSUSPEND", CHAN_UNSUSPEND_SYNTAX); - return MOD_CONT; - } - if (chan[0] != '#') { - notice_lang(s_ChanServ, u, CHAN_UNSUSPEND_ERROR); - return MOD_CONT; - } - if (readonly) - notice_lang(s_ChanServ, u, READ_ONLY_MODE); - - ci = cs_findchan(chan); - - if (ci) { - ci->flags &= ~CI_SUSPENDED; - ci->forbidreason = NULL; - ci->forbidby = NULL; - - if (WallForbid) - 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, chan); - } else { - alog("%s: Valid UNSUSPEND for %s by %s failed", s_ChanServ, - chan, u->nick); - notice_lang(s_ChanServ, u, CHAN_UNSUSPEND_FAILED, chan); - } - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_status(User * u) -{ - ChannelInfo *ci; - User *u2; - char *nick, *chan; - char *temp; - - 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/commands.c b/src/commands.c index 4ab6d90f1..0159ee312 100644 --- a/src/commands.c +++ b/src/commands.c @@ -95,8 +95,8 @@ void do_run_cmd(char *service, User * u, Command * c, const char *cmd) notice_lang(service, u, OPER_DEFCON_DENIED); } } else { + mod_current_module_name = c->mod_name; if ((c->has_priv == NULL) || c->has_priv(u)) { - mod_current_module_name = c->mod_name; retVal = c->routine(u); mod_current_module_name = NULL; if (retVal == MOD_CONT) { @@ -108,13 +108,12 @@ void do_run_cmd(char *service, User * u, Command * c, const char *cmd) current = current->next; } } - } - - else { + } 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)) { @@ -139,9 +138,17 @@ void do_help_cmd(char *service, User * u, Command * c, const char *cmd) 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; @@ -194,6 +201,9 @@ void do_help_cmd(char *service, User * u, Command * c, const char *cmd) if (has_had_help == 0) { notice_lang(service, u, NO_HELP_AVAILABLE, cmd); } + + mod_current_module = calling_module; + mod_current_module_name = calling_module_name; } /*************************************************************************/ diff --git a/src/config.c b/src/config.c index 0043e390e..198860138 100644 --- a/src/config.c +++ b/src/config.c @@ -18,6 +18,8 @@ /* Configurable variables: */ +char *IRCDModule; + char *RemoteServer; int RemotePort; char *RemotePassword; @@ -267,6 +269,8 @@ char *ExceptionDBName; char *SessionLimitExceeded; char *SessionLimitDetailsLoc; +int OSOpersOnly; + char *Modules; char *ModulesDelayed; char **ModulesAutoload; @@ -274,6 +278,38 @@ 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; @@ -316,6 +352,11 @@ int NumUlines; int UseTS6; + + + +char **buildStringList(char *src, int *number); + /*************************************************************************/ /* Deprecated directive (dep_) and value checking (chk_) functions: */ @@ -324,36 +365,6 @@ int UseTS6; /*************************************************************************/ -#define MAXPARAMS 8 - -/* Configuration directives */ - -typedef struct { - char *name; - struct { - int type; /* PARAM_* below */ - int flags; /* Same */ - void *ptr; /* Pointer to where to store the value */ - } params[MAXPARAMS]; -} Directive; - -#define PARAM_NONE 0 -#define PARAM_INT 1 -#define PARAM_POSINT 2 /* Positive integer only */ -#define PARAM_PORT 3 /* 1..65535 only */ -#define PARAM_STRING 4 -#define PARAM_TIME 5 -#define PARAM_STRING_ARRAY 6 /* Array of string */ -#define PARAM_SET -1 /* Not a real parameter; just set the - * given integer variable to 1 */ -#define PARAM_DEPRECATED -2 /* Set for deprecated directives; `ptr' - * is a function pointer to call */ - -/* Flags: */ -#define PARAM_OPTIONAL 0x01 -#define PARAM_FULLONLY 0x02 /* Directive only allowed if !STREAMLINED */ -#define PARAM_RELOAD 0x04 /* Directive is reloadable */ - Directive directives[] = { {"AkillOnAdd", {{PARAM_SET, PARAM_RELOAD, &AkillOnAdd}}}, {"AutokillDB", {{PARAM_STRING, PARAM_RELOAD, &AutokillDBName}}}, @@ -361,6 +372,7 @@ Directive directives[] = { {"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}}}, @@ -381,6 +393,7 @@ Directive directives[] = { {"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}}}, @@ -448,10 +461,13 @@ Directive directives[] = { {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}, @@ -475,6 +491,7 @@ Directive directives[] = { {"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}, @@ -504,6 +521,7 @@ Directive directives[] = { {"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}}}, @@ -543,6 +561,7 @@ Directive directives[] = { {"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}}}, @@ -569,6 +588,7 @@ Directive directives[] = { {"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", @@ -662,6 +682,125 @@ void error(int linenum, char *message, ...) * effect. */ +int parse_directive(Directive * d, char *dir, int ac, char *av[MAXPARAMS], + int linenum, int reload, char *s) +{ + int retval = 1; + int i; + int 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 + + 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; @@ -711,124 +850,21 @@ int parse(char *buf, int linenum, int reload) for (n = 0; n < lenof(directives); n++) { Directive *d = &directives[n]; - if (stricmp(dir, d->name) != 0) - continue; - optind = 0; - for (i = 0; i < MAXPARAMS && d->params[i].type != PARAM_NONE; i++) { - if (reload && !(d->params[i].flags & PARAM_RELOAD)) - continue; - - if (d->params[i].type == PARAM_SET) { - *(int *) d->params[i].ptr = 1; - continue; - } -#ifdef STREAMLINED - if (d->params[i].flags & PARAM_FULLONLY) { - error(linenum, - "Directive `%s' not available in STREAMLINED mode", - d->name); - break; - } -#endif - - if (d->params[i].type == PARAM_DEPRECATED) { - void (*func) (void); - error(linenum, "Deprecated directive `%s' used", d->name); - func = (void (*)(void)) (d->params[i].ptr); - func(); /* For clarity */ - continue; - } - if (optind >= ac) { - if (!(d->params[i].flags & PARAM_OPTIONAL)) { - error(linenum, "Not enough parameters for `%s'", - d->name); - retval = 0; - } - break; - } - switch (d->params[i].type) { - case PARAM_INT: - val = strtol(av[optind++], &s, 0); - if (*s) { - error(linenum, - "%s: Expected an integer for parameter %d", - d->name, optind); - retval = 0; - break; - } - *(int *) d->params[i].ptr = val; - break; - case PARAM_POSINT: - val = strtol(av[optind++], &s, 0); - if (*s || val <= 0) { - error(linenum, - "%s: Expected a positive integer for parameter %d", - d->name, optind); - retval = 0; - break; - } - 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); - return 0; /* don't bother continuing--something's bizarre */ - } + retval = parse_directive(d, dir, ac, av, linenum, reload, s); + if (!retval) { + break; } - break; /* because we found a match */ } if (n == lenof(directives)) { - error(linenum, "Unknown directive `%s'", dir); +/* error(linenum, "Unknown directive `%s'", dir); return 1; /* don't cause abort */ } return retval; } + /*************************************************************************/ #define CHECK(v) do { \ @@ -933,6 +969,7 @@ int read_config(int reload) } } + CHECK(IRCDModule); CHECK(NetworkName); if (!reload) { @@ -1229,48 +1266,31 @@ int read_config(int reload) } /* Host Setters building... :P */ - HostNumber = 0; /* always zero it, even if we have no setters */ - if (HostSetter) { - s = strtok(HostSetter, " "); - do { - if (s) { - HostNumber++; - HostSetters = - realloc(HostSetters, sizeof(char *) * HostNumber); - HostSetters[HostNumber - 1] = sstrdup(s); - } - } while ((s = strtok(NULL, " "))); - } + HostSetters = buildStringList(HostSetter, &HostNumber); /* Modules Autoload building... :P */ - ModulesNumber = 0; /* always zero it, even if we have no setters */ - if (Modules) { - s = strtok(Modules, " "); - do { - if (s) { - ModulesNumber++; - ModulesAutoload = - realloc(ModulesAutoload, - sizeof(char *) * ModulesNumber); - ModulesAutoload[ModulesNumber - 1] = sstrdup(s); - } - } while ((s = strtok(NULL, " "))); - } + 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); - ModulesDelayedNumber = 0; /* always zero it, even if we have no setters */ - if (ModulesDelayed) { - s = strtok(ModulesDelayed, " "); - do { - if (s) { - ModulesDelayedNumber++; - ModulesDelayedAutoload = - realloc(ModulesDelayedAutoload, - sizeof(char *) * ModulesDelayedNumber); - ModulesDelayedAutoload[ModulesDelayedNumber - 1] = - sstrdup(s); - } - } while ((s = strtok(NULL, " "))); - } if (LimitSessions) { CHECK(DefSessionLimit); @@ -1379,7 +1399,10 @@ int read_config(int reload) CHECK(DefconMessage); } - if (UseTokens) { + /** + * Temp. disabled, as ircd-> isnt loaded yet, so we cant check here! + **/ +/* if (UseTokens) { if (!ircd->token) { alog("Anope does not support TOKENS for this ircd setting unsetting UseToken"); UseTokens = 0; @@ -1392,7 +1415,7 @@ int read_config(int reload) "UseTS6 requires the setting of Numeric to be enabled."); retval = 0; } - } + }*/ /** * If they try to enable any email registration option, @@ -1419,4 +1442,25 @@ int read_config(int reload) return retval; } + +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; +} + /*************************************************************************/ diff --git a/src/core/Makefile b/src/core/Makefile new file mode 100644 index 000000000..e73fd7e7c --- /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}' + +OBJECTS= $(SRCS:.c=.o) +SO_FILES=$(OBJECTS:.o=.s) +CDEFS= -g -rdynamic -Wall +CFLAGS=$(CFLAGS) $(CDEFS) + +all: modules subs + +modules: $(OBJECTS) $(SO_FILES) + +install: + $(CP) ./*.so $(MODULE_PATH) + +distclean: clean spotless + +.c.o: + $(CC) $(CFLAGS) -I../${INCLUDEDIR} -c $< + +.o.s: + $(CC) ${SHARED} $< -o $*.so ${PROFILE} + +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 *.so *.c~ core + +spotless: clean + rm -f *.so Makefile.inc + diff --git a/src/core/Makefile.sub b/src/core/Makefile.sub new file mode 100644 index 000000000..b060ca5b6 --- /dev/null +++ b/src/core/Makefile.sub @@ -0,0 +1,30 @@ +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}' + +OBJECTS= $(SRCS:.c=.o) +SO_FILES=$(OBJECTS:.o=.s) +CDEFS= -g -rdynamic -Wall +CFLAGS=$(CFLAGS) $(CDEFS) + +all: module + +module: $(OBJECTS) so + +distclean: clean spotless + +.c.o: + $(CC) $(CFLAGS) -I../ -I../../${INCLUDEDIR} -c $< + +so: + $(CC) ${SHARED} $(OBJECTS) -o ../$(TARGET).so ${PROFILE} + +clean: + rm -f *.o *.so *.c~ core + +spotless: clean + rm -f *~ + diff --git a/src/core/Makefile.win32 b/src/core/Makefile.win32 new file mode 100644 index 000000000..e1f4301a3 --- /dev/null +++ b/src/core/Makefile.win32 @@ -0,0 +1,25 @@ +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_fantasy_unban.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 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_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_killclones.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 + +all: $(OBJECTS) + +distclean: clean spotless + +.c.dll: + $(CC) $(CFLAGS) $< $(LFLAGS) + +clean: + -@del *.obj + +spotless: clean + -@del *.dll *.lib *.exp + +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..0929ba716 --- /dev/null +++ b/src/core/bs_act.c @@ -0,0 +1,93 @@ +/* BotServ core functions + * + * (C) 2003-2005 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_privmsg(ci->bi->nick, ci->name, "%cACTION %s %c", 1, + text, 1); + ci->bi->lastmsg = time(NULL); + if (logchan && LogBot) + 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..320a615fc --- /dev/null +++ b/src/core/bs_assign.c @@ -0,0 +1,102 @@ +/* BotServ core functions + * + * (C) 2003-2005 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..de42f6355 --- /dev/null +++ b/src/core/bs_badwords.c @@ -0,0 +1,290 @@ +/* BotServ core functions + * + * (C) 2003-2005 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) { + + if (readonly) { + notice_lang(s_BotServ, u, BOT_BADWORDS_DISABLED); + return MOD_CONT; + } + + /* Special case: is it a number/list? Only do search if it isn't. */ + if (isdigit(*word) && strspn(word, "1234567890,-") == strlen(word)) { + int count, deleted, last = -1; + deleted = + process_numlist(word, &count, badwords_del_callback, u, ci, + &last); + if (!deleted) { + if (count == 1) { + notice_lang(s_BotServ, u, BOT_BADWORDS_NO_SUCH_ENTRY, + last, ci->name); + } else { + notice_lang(s_BotServ, u, BOT_BADWORDS_NO_MATCH, + ci->name); + } + } else if (deleted == 1) { + notice_lang(s_BotServ, u, BOT_BADWORDS_DELETED_ONE, + ci->name); + } else { + notice_lang(s_BotServ, u, BOT_BADWORDS_DELETED_SEVERAL, + deleted, ci->name); + } + } else { + for (i = 0; i < ci->bwcount; i++) { + if (ci->badwords[i].in_use + && !stricmp(ci->badwords[i].word, word)) + break; + } + if (i == ci->bwcount) { + notice_lang(s_BotServ, u, BOT_BADWORDS_NOT_FOUND, word, + chan); + return MOD_CONT; + } + bw = &ci->badwords[i]; + notice_lang(s_BotServ, u, BOT_BADWORDS_DELETED, bw->word, + ci->name); + if (bw->word) + free(bw->word); + bw->word = NULL; + bw->in_use = 0; + } + + } else if (stricmp(cmd, "LIST") == 0) { + int sent_header = 0; + + if (ci->bwcount == 0) { + notice_lang(s_BotServ, u, BOT_BADWORDS_LIST_EMPTY, chan); + return MOD_CONT; + } + if (word && strspn(word, "1234567890,-") == strlen(word)) { + process_numlist(word, NULL, badwords_list_callback, u, ci, + &sent_header); + } else { + for (i = 0; i < ci->bwcount; i++) { + if (!(ci->badwords[i].in_use)) + continue; + if (word && ci->badwords[i].word + && !match_wild_nocase(word, ci->badwords[i].word)) + continue; + badwords_list(u, i, ci, &sent_header); + } + } + if (!sent_header) + notice_lang(s_BotServ, u, BOT_BADWORDS_NO_MATCH, chan); + + } else if (stricmp(cmd, "CLEAR") == 0) { + + if (readonly) { + notice_lang(s_BotServ, u, BOT_BADWORDS_DISABLED); + return MOD_CONT; + } + + for (i = 0; i < ci->bwcount; i++) + if (ci->badwords[i].word) + free(ci->badwords[i].word); + + free(ci->badwords); + ci->badwords = NULL; + ci->bwcount = 0; + + notice_lang(s_BotServ, u, BOT_BADWORDS_CLEAR); + + } else { + syntax_error(s_BotServ, u, "BADWORDS", BOT_BADWORDS_SYNTAX); + } + return MOD_CONT; +} + +int badwords_del_callback(User * u, int num, va_list args) +{ + BadWord *bw; + ChannelInfo *ci = va_arg(args, ChannelInfo *); + int *last = va_arg(args, int *); + if (num < 1 || num > ci->bwcount) + return 0; + *last = num; + + bw = &ci->badwords[num - 1]; + if (bw->word) + free(bw->word); + bw->word = NULL; + bw->in_use = 0; + + return 1; +} + +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..0e604a410 --- /dev/null +++ b/src/core/bs_bot.c @@ -0,0 +1,372 @@ +/* BotServ core functions + * + * (C) 2003-2005 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" + +/** + * 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)=='-' ) + + +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 { + 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_BAD_IDENT); + return MOD_CONT; + } + } + + /** + * Check the host is valid re RFC 2812 + **/ + + /* Check whether it's a services client's nick and return if so - Certus */ + /* 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 { + 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 (!isValidHost(host, 3)) { + notice_lang(s_BotServ, u, BOT_BAD_HOST); + return MOD_CONT; + } + + for (ch = user; *ch && (ch - user) < USERMAX; ch++) { + if (!isalnum(*ch)) { + notice_lang(s_BotServ, u, BOT_BAD_IDENT); + return MOD_CONT; + } + } + + if (stricmp(bi->nick, nick) && findbot(nick)) { + notice_lang(s_BotServ, u, BOT_BOT_ALREADY_EXISTS, nick); + return MOD_CONT; + } + + if (stricmp(bi->nick, nick)) { + /* 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. */ + if (!user) + anope_cmd_chg_nick(oldnick, bi->nick); + 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..cc510aec0 --- /dev/null +++ b/src/core/bs_botlist.c @@ -0,0 +1,108 @@ +/* BotServ core functions + * + * (C) 2003-2005 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..9ea3fe402 --- /dev/null +++ b/src/core/bs_fantasy.c @@ -0,0 +1,80 @@ +/* BotServ core fantasy functions + * + * (C) 2003-2005 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) { + 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..ec1e78ae6 --- /dev/null +++ b/src/core/bs_fantasy_kick.c @@ -0,0 +1,87 @@ +/* BotServ core fantasy functions + * + * (C) 2003-2005 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; + 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 if (!reason) + bot_raw_kick(u, ci, target, "Requested"); + else + bot_raw_kick(u, ci, target, 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..651b0113d --- /dev/null +++ b/src/core/bs_fantasy_kickban.c @@ -0,0 +1,90 @@ +/* BotServ core fantasy functions + * + * (C) 2003-2005 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; + 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 { + if (!reason) + bot_raw_ban(u, ci, target, "Requested"); + else + bot_raw_ban(u, ci, target, 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..ec88c966b --- /dev/null +++ b/src/core/bs_fantasy_owner.c @@ -0,0 +1,87 @@ +/* BotServ core fantasy functions + * + * (C) 2003-2005 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..e218576d6 --- /dev/null +++ b/src/core/bs_fantasy_seen.c @@ -0,0 +1,136 @@ +/* BotServ core fantasy functions + * + * (C) 2003-2005 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); + } + } + + return MOD_CONT; +} diff --git a/src/core/bs_fantasy_unban.c b/src/core/bs_fantasy_unban.c new file mode 100644 index 000000000..412b36099 --- /dev/null +++ b/src/core/bs_fantasy_unban.c @@ -0,0 +1,78 @@ +/* BotServ core fantasy functions + * + * (C) 2003-2005 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); + } + + return MOD_CONT; +} diff --git a/src/core/bs_help.c b/src/core/bs_help.c new file mode 100644 index 000000000..8fea7a5ad --- /dev/null +++ b/src/core/bs_help.c @@ -0,0 +1,67 @@ +/* BotServ core functions + * + * (C) 2003-2005 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..3665b2054 --- /dev/null +++ b/src/core/bs_info.c @@ -0,0 +1,282 @@ +/* BotServ core functions + * + * (C) 2003-2005 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, buf); + *buf = 0; + end = buf; + } + end += + snprintf(end, sizeof(buf) - (end - buf), " %s ", + ci->name); + } + } + } + + if (*buf) + notice_user(s_BotServ, u, buf); + return; +} diff --git a/src/core/bs_kick.c b/src/core/bs_kick.c new file mode 100644 index 000000000..abedbd550 --- /dev/null +++ b/src/core/bs_kick.c @@ -0,0 +1,377 @@ +/* BotServ core functions + * + * (C) 2003-2005 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 (!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..0330a812d --- /dev/null +++ b/src/core/bs_say.c @@ -0,0 +1,97 @@ +/* BotServ core functions + * + * (C) 2003-2005 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 (logchan && LogBot) + 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..5312b0f6c --- /dev/null +++ b/src/core/bs_set.c @@ -0,0 +1,207 @@ +/* BotServ core functions + * + * (C) 2003-2005 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); + 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..1789189ba --- /dev/null +++ b/src/core/bs_unassign.c @@ -0,0 +1,88 @@ +/* BotServ core functions + * + * (C) 2003-2005 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) + 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..119c7c887 --- /dev/null +++ b/src/core/configure @@ -0,0 +1,35 @@ +#!/bin/sh + +echo -n "SRCS=" > ./Makefile.inc +FIRST=1 +for oldfile in *.c +do + if [ "$FIRST" = 1 ] ; then + echo -n " "$oldfile >> ./Makefile.inc + else + echo "\\" >> ./Makefile.inc + echo -n " " $oldfile >> ./Makefile.inc + fi + FIRST=0 +done +echo "" >> ./Makefile.inc + +echo -n "SUBS=" >> ./Makefile.inc +FIRST=1 +for dir in * +do + if [ -d $dir ] ; then + if [ -f $dir/Makefile ] ; then + if [ "$FIRST" = 1 ] ; then + echo -n " "$dir >> ./Makefile.inc + else + echo "\\" >> ./Makefile.inc + echo -n " " $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..e5d621972 --- /dev/null +++ b/src/core/cs_access.c @@ -0,0 +1,507 @@ +/* ChanServ core functions + * + * (C) 2003-2005 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, ChanAccess * access, int *perm, int uacc) +{ + if (!access->in_use) + return 0; + if (!is_services_admin(u) && uacc <= access->level) { + (*perm)++; + return 0; + } + access->nc = NULL; + access->in_use = 0; + return 1; +} + +static int access_del_callback(User * u, int num, va_list args) +{ + ChannelInfo *ci = va_arg(args, ChannelInfo *); + int *last = va_arg(args, int *); + int *perm = va_arg(args, int *); + int uacc = va_arg(args, int); + if (num < 1 || num > ci->accesscount) + return 0; + *last = num; + return access_del(u, &ci->access[num - 1], perm, uacc); +} + + +static int access_list(User * u, int index, ChannelInfo * ci, + int *sent_header) +{ + ChanAccess *access = &ci->access[index]; + char *xop; + + if (!access->in_use) + return 0; + + if (!*sent_header) { + notice_lang(s_ChanServ, u, CHAN_ACCESS_LIST_HEADER, ci->name); + *sent_header = 1; + } + + if (ci->flags & CI_XOP) { + xop = get_xop_level(access->level); + notice_lang(s_ChanServ, u, CHAN_ACCESS_LIST_XOP_FORMAT, index + 1, + xop, access->nc->display); + } else { + notice_lang(s_ChanServ, u, CHAN_ACCESS_LIST_AXS_FORMAT, index + 1, + access->level, access->nc->display); + } + return 1; +} + +static int access_list_callback(User * u, int num, va_list args) +{ + ChannelInfo *ci = va_arg(args, ChannelInfo *); + int *sent_header = va_arg(args, int *); + if (num < 1 || num > ci->accesscount) + return 0; + return access_list(u, num - 1, ci, sent_header); +} + + +/** + * 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, " "); + + ChannelInfo *ci; + NickAlias *na; + 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) { + notice_lang(s_ChanServ, u, CHAN_ACCESS_XOP, s_ChanServ); + } else if (((is_list && !check_access(u, ci, CA_ACCESS_LIST)) + || (!is_list && !check_access(u, ci, CA_ACCESS_CHANGE))) + && !is_servadmin) { + notice_lang(s_ChanServ, u, ACCESS_DENIED); + } else if (stricmp(cmd, "ADD") == 0) { + if (readonly) { + notice_lang(s_ChanServ, u, CHAN_ACCESS_DISABLED); + return MOD_CONT; + } + + level = atoi(s); + ulev = get_access(u, ci); + + if (!is_servadmin && level >= ulev) { + notice_lang(s_ChanServ, u, PERMISSION_DENIED); + return MOD_CONT; + } + + if (level == 0) { + notice_lang(s_ChanServ, u, CHAN_ACCESS_LEVEL_NONZERO); + return MOD_CONT; + } else if (level <= ACCESS_INVALID || level >= ACCESS_FOUNDER) { + notice_lang(s_ChanServ, u, CHAN_ACCESS_LEVEL_RANGE, + ACCESS_INVALID + 1, ACCESS_FOUNDER - 1); + return MOD_CONT; + } + + na = findnick(nick); + if (!na) { + notice_lang(s_ChanServ, u, CHAN_ACCESS_NICKS_ONLY); + return MOD_CONT; + } + if (na->status & NS_VERBOTEN) { + notice_lang(s_ChanServ, u, NICK_X_FORBIDDEN, nick); + return MOD_CONT; + } + + nc = na->nc; + for (access = ci->access, i = 0; i < ci->accesscount; + access++, i++) { + if (access->nc == nc) { + /* Don't allow lowering from a level >= ulev */ + if (!is_servadmin && access->level >= ulev) { + notice_lang(s_ChanServ, u, PERMISSION_DENIED); + return MOD_CONT; + } + if (access->level == level) { + notice_lang(s_ChanServ, u, CHAN_ACCESS_LEVEL_UNCHANGED, + access->nc->display, chan, level); + return MOD_CONT; + } + access->level = level; + alog("%s: %s!%s@%s (level %d) set access level %d to %s (group %s) on channel %s", s_ChanServ, u->nick, u->username, 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; + } + } + + for (i = 0; i < ci->accesscount; i++) { + if (!ci->access[i].in_use) + break; + } + if (i == ci->accesscount) { + if (i < CSAccessMax) { + ci->accesscount++; + ci->access = + srealloc(ci->access, + sizeof(ChanAccess) * ci->accesscount); + } else { + notice_lang(s_ChanServ, u, CHAN_ACCESS_REACHED_LIMIT, + CSAccessMax); + return MOD_CONT; + } + } + + access = &ci->access[i]; + access->nc = nc; + access->in_use = 1; + access->level = level; + access->last_seen = 0; + + alog("%s: %s!%s@%s (level %d) set access level %d to %s (group %s) on channel %s", s_ChanServ, u->nick, u->username, 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; + } + } + } + } + } + } else if (stricmp(cmd, "LIST") == 0) { + int sent_header = 0; + + if (ci->accesscount == 0) { + notice_lang(s_ChanServ, u, CHAN_ACCESS_LIST_EMPTY, chan); + return MOD_CONT; + } + if (nick && strspn(nick, "1234567890,-") == strlen(nick)) { + process_numlist(nick, NULL, access_list_callback, u, ci, + &sent_header); + } else { + for (i = 0; i < ci->accesscount; i++) { + if (nick && ci->access[i].nc + && !match_wild_nocase(nick, ci->access[i].nc->display)) + continue; + access_list(u, i, ci, &sent_header); + } + } + if (!sent_header) { + notice_lang(s_ChanServ, u, CHAN_ACCESS_NO_MATCH, chan); + } else { + notice_lang(s_ChanServ, u, CHAN_ACCESS_LIST_FOOTER, ci->name); + } + } else if (stricmp(cmd, "CLEAR") == 0) { + + if (readonly) { + notice_lang(s_ChanServ, u, CHAN_ACCESS_DISABLED); + return MOD_CONT; + } + + if (!is_servadmin && !is_founder(u, ci)) { + notice_lang(s_ChanServ, u, PERMISSION_DENIED); + return MOD_CONT; + } + + free(ci->access); + ci->access = NULL; + ci->accesscount = 0; + + notice_lang(s_ChanServ, u, CHAN_ACCESS_CLEAR, 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..dd729da98 --- /dev/null +++ b/src/core/cs_akick.c @@ -0,0 +1,584 @@ +/* ChanServ core functions + * + * (C) 2003-2005 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); + +/** + * 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 *); + if (num < 1 || num > ci->akickcount) + return 0; + *last = num; + 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; + 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); + NickCore *nc = NULL; + char *nick, *user, *host; + + if (readonly) { + notice_lang(s_ChanServ, u, CHAN_AKICK_DISABLED); + return MOD_CONT; + } + + if (!na) { + split_usermask(mask, &nick, &user, &host); + mask = + scalloc(strlen(nick) + strlen(user) + strlen(host) + 3, 1); + sprintf(mask, "%s!%s@%s", nick, user, host); + free(nick); + free(user); + free(host); + } else { + if (na->status & NS_VERBOTEN) { + notice_lang(s_ChanServ, u, NICK_X_FORBIDDEN, mask); + return MOD_CONT; + } + nc = na->nc; + } + + /* Check excepts BEFORE we get this far */ + if (ircd->except) { + if (is_excepted_mask(ci, mask) == 1) { + notice_lang(s_ChanServ, u, CHAN_EXCEPTED, mask, chan); + 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); + return MOD_CONT; + } + } + + for (i = 0; i < ci->akickcount; i++) { + if (!(ci->akick[i].flags & AK_USED)) + break; + } + if (i == ci->akickcount) { + if (ci->akickcount >= CSAutokickMax) { + notice_lang(s_ChanServ, u, CHAN_AKICK_REACHED_LIMIT, + CSAutokickMax); + return MOD_CONT; + } + ci->akickcount++; + ci->akick = + srealloc(ci->akick, sizeof(AutoKick) * ci->akickcount); + } + akick = &ci->akick[i]; + akick->flags = AK_USED; + if (nc) { + akick->flags |= AK_ISNICK; + akick->u.nc = nc; + } else { + akick->u.mask = mask; + } + akick->creator = sstrdup(u->nick); + akick->addtime = time(NULL); + if (reason) { + if (strlen(reason) > 200) + reason[200] = '\0'; + akick->reason = sstrdup(reason); + } else { + akick->reason = NULL; + } + + /* Auto ENFORCE #63 */ + c = findchan(ci->name); + if (c) { + cu = c->users; + while (cu) { + next = cu->next; + if (check_kick(cu->user, c->name)) { + argv[0] = sstrdup(c->name); + argv[1] = sstrdup(cu->user->nick); + 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); + + } 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 = 1; 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); + } + ci->akick[a].reason = + sstrdup(ci->akick[b].reason); + ci->akick[a].creator = + sstrdup(ci->akick[b].creator); + ci->akick[a].addtime = ci->akick[b].addtime; + + akick_del(u, &ci->akick[b]); + break; + } + } + } + } + } + } else if (stricmp(cmd, "LIST") == 0) { + int sent_header = 0; + + if (ci->akickcount == 0) { + notice_lang(s_ChanServ, u, CHAN_AKICK_LIST_EMPTY, chan); + return MOD_CONT; + } + if (mask && isdigit(*mask) && + strspn(mask, "1234567890,-") == strlen(mask)) { + process_numlist(mask, NULL, akick_list_callback, u, ci, + &sent_header); + } else { + for (akick = ci->akick, i = 0; i < ci->akickcount; + akick++, i++) { + if (!(akick->flags & AK_USED)) + continue; + if (mask) { + if (!(akick->flags & AK_ISNICK) + && !match_wild_nocase(mask, akick->u.mask)) + continue; + if ((akick->flags & AK_ISNICK) + && !match_wild_nocase(mask, akick->u.nc->display)) + continue; + } + akick_list(u, i, ci, &sent_header); + } + } + if (!sent_header) + notice_lang(s_ChanServ, u, CHAN_AKICK_NO_MATCH, chan); + + } else if (stricmp(cmd, "VIEW") == 0) { + int sent_header = 0; + + if (ci->akickcount == 0) { + notice_lang(s_ChanServ, u, CHAN_AKICK_LIST_EMPTY, chan); + return MOD_CONT; + } + if (mask && isdigit(*mask) && + strspn(mask, "1234567890,-") == strlen(mask)) { + process_numlist(mask, NULL, akick_view_callback, u, ci, + &sent_header); + } else { + for (akick = ci->akick, i = 0; i < ci->akickcount; + akick++, i++) { + if (!(akick->flags & AK_USED)) + continue; + if (mask) { + if (!(akick->flags & AK_ISNICK) + && !match_wild_nocase(mask, akick->u.mask)) + continue; + if ((akick->flags & AK_ISNICK) + && !match_wild_nocase(mask, akick->u.nc->display)) + continue; + } + akick_view(u, i, ci, &sent_header); + } + } + if (!sent_header) + notice_lang(s_ChanServ, u, CHAN_AKICK_NO_MATCH, chan); + + } else if (stricmp(cmd, "ENFORCE") == 0) { + Channel *c = findchan(ci->name); + struct c_userlist *cu = NULL; + struct c_userlist *next; + char *argv[3]; + int count = 0; + + if (!c) { + notice_lang(s_ChanServ, u, CHAN_X_NOT_IN_USE, ci->name); + return MOD_CONT; + } + + cu = c->users; + + while (cu) { + next = cu->next; + if (check_kick(cu->user, c->name)) { + argv[0] = sstrdup(c->name); + argv[1] = sstrdup(cu->user->nick); + argv[2] = sstrdup(CSAutokickReason); + + do_kick(s_ChanServ, 3, argv); + + free(argv[2]); + free(argv[1]); + free(argv[0]); + + count++; + } + cu = next; + } + + notice_lang(s_ChanServ, u, CHAN_AKICK_ENFORCE_DONE, chan, count); + + } else if (stricmp(cmd, "CLEAR") == 0) { + + if (readonly) { + notice_lang(s_ChanServ, u, CHAN_AKICK_DISABLED); + return MOD_CONT; + } + + for (akick = ci->akick, i = 0; i < ci->akickcount; akick++, i++) { + if (!(akick->flags & AK_USED)) + continue; + akick_del(u, akick); + } + + free(ci->akick); + ci->akick = NULL; + ci->akickcount = 0; + + notice_lang(s_ChanServ, u, CHAN_AKICK_CLEAR, ci->name); + + } else { + syntax_error(s_ChanServ, u, "AKICK", CHAN_AKICK_SYNTAX); + } + return MOD_CONT; +} diff --git a/src/core/cs_ban.c b/src/core/cs_ban.c new file mode 100644 index 000000000..eaf25597d --- /dev/null +++ b/src/core/cs_ban.c @@ -0,0 +1,227 @@ +/* ChanServ core functions + * + * (C) 2003-2005 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..8bf4c8e67 --- /dev/null +++ b/src/core/cs_clear.c @@ -0,0 +1,375 @@ +/* ChanServ core functions + * + * (C) 2003-2005 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, " "); + char tmp[BUFSIZE]; + 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]; + int i; + + /* Save original ban info */ + int count = c->bancount; + char **bans = scalloc(sizeof(char *) * count, 1); + for (i = 0; i < count; i++) + bans[i] = sstrdup(c->bans[i]); + + for (i = 0; i < count; i++) { + av[0] = sstrdup("-b"); + av[1] = bans[i]; + anope_cmd_mode(whosends(ci), chan, "%s %s", av[0], av[1]); + chan_set_modes(whosends(ci), c, 2, av, 0); + free(av[1]); + free(av[0]); + } + notice_lang(s_ChanServ, u, CHAN_CLEARED_BANS, chan); + free(bans); + } else if (ircd->except && stricmp(what, "excepts") == 0) { + char *av[2]; + int i; + + /* Save original except info */ + int count = c->exceptcount; + char **excepts = scalloc(sizeof(char *) * count, 1); + for (i = 0; i < count; i++) + excepts[i] = sstrdup(c->excepts[i]); + + for (i = 0; i < count; i++) { + av[0] = sstrdup("-e"); + av[1] = excepts[i]; + anope_cmd_mode(whosends(ci), chan, "%s %s", av[0], av[1]); + chan_set_modes(whosends(ci), c, 2, av, 0); + free(av[1]); + free(av[0]); + } + notice_lang(s_ChanServ, u, CHAN_CLEARED_EXCEPTS, chan); + free(excepts); + + } else if (ircd->invitemode && stricmp(what, "invites") == 0) { + char *av[2]; + int i; + + /* Save original except info */ + int count = c->invitecount; + char **invites = scalloc(sizeof(char *) * count, 1); + for (i = 0; i < count; i++) + invites[i] = sstrdup(c->invite[i]); + + for (i = 0; i < count; i++) { + av[0] = sstrdup("-I"); + av[1] = invites[i]; + anope_cmd_mode(whosends(ci), chan, "%s %s", av[0], av[1]); + chan_set_modes(whosends(ci), c, 2, av, 0); + free(av[1]); + free(av[0]); + } + notice_lang(s_ChanServ, u, CHAN_CLEARED_INVITES, chan); + free(invites); + + } else if (stricmp(what, "modes") == 0) { + char buf[BUFSIZE], *end = buf; + 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); + } + + + + /* TODO: decide if the above implementation is better than this one. */ + + if (0) { + CBModeInfo *cbmi = cbmodeinfos; + CBMode *cbm; + + do { + if (c->mode & cbmi->flag) + *end++ = cbmi->mode; + } while ((++cbmi)->flag != 0); + + cbmi = cbmodeinfos; + + do { + if (cbmi->getvalue && (c->mode & cbmi->flag) + && !(cbmi->flags & CBM_MINUS_NO_ARG)) { + char *value = cbmi->getvalue(c); + + if (value) { + *end++ = ' '; + while (*value) + *end++ = *value++; + + /* Free the value */ + cbm = &cbmodes[(int) cbmi->mode]; + cbm->setvalue(c, NULL); + } + } + } while ((++cbmi)->flag != 0); + + *end = 0; + + anope_cmd_mode(whosends(ci), c->name, "-%s", buf); + c->mode = 0; + check_modes(c); + } + notice_lang(s_ChanServ, u, CHAN_CLEARED_MODES, chan); + } else if (stricmp(what, "ops") == 0) { + char *av[3]; + struct c_userlist *cu, *next; + + if (ircd->svsmode_ucmode) { + av[0] = sstrdup(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; + av[0] = sstrdup(chan); + if (!chan_has_user_status(c, cu->user, CUS_OP)) { + if (!chan_has_user_status(c, cu->user, CUS_PROTECT)) { + if (!chan_has_user_status(c, cu->user, CUS_OWNER)) { + continue; + } else { + snprintf(tmp, BUFSIZE, "%so", + ircd->ownerunset); + av[1] = sstrdup(tmp); + + } + } else { + snprintf(tmp, BUFSIZE, "%so", ircd->adminunset); + av[1] = sstrdup(tmp); + } + } else { + av[1] = sstrdup("-o"); + } + av[2] = sstrdup(cu->user->nick); + do_cmode(s_ChanServ, 3, av); + free(av[2]); + free(av[1]); + free(av[0]); + } + } else { + for (cu = c->users; cu; cu = next) { + next = cu->next; + av[0] = sstrdup(chan); + if (!chan_has_user_status(c, cu->user, CUS_OP)) { + if (!chan_has_user_status(c, cu->user, CUS_PROTECT)) { + if (!chan_has_user_status(c, cu->user, CUS_OWNER)) { + continue; + } else { + snprintf(tmp, BUFSIZE, "%so", + ircd->ownerunset); + av[1] = sstrdup(tmp); + } + } else { + snprintf(tmp, BUFSIZE, "%so", ircd->adminunset); + av[1] = sstrdup(tmp); + } + } else { + av[1] = sstrdup("-o"); + } + av[2] = sstrdup(cu->user->nick); + anope_cmd_mode(whosends(ci), av[0], "%s :%s", av[1], + av[2]); + do_cmode(s_ChanServ, 3, av); + free(av[2]); + free(av[1]); + free(av[0]); + } + } + notice_lang(s_ChanServ, u, CHAN_CLEARED_OPS, chan); + } else if (ircd->halfop && stricmp(what, "hops") == 0) { + char *av[3]; + struct c_userlist *cu, *next; + + for (cu = c->users; cu; cu = next) { + next = cu->next; + if (!chan_has_user_status(c, cu->user, CUS_HALFOP)) + continue; + av[0] = sstrdup(chan); + av[1] = sstrdup("-h"); + av[2] = sstrdup(cu->user->nick); + if (ircd->svsmode_ucmode) { + anope_cmd_svsmode_chan(av[0], av[1], NULL); + do_cmode(s_ChanServ, 3, av); + break; + } else { + anope_cmd_mode(whosends(ci), av[0], "%s :%s", av[1], + av[2]); + } + do_cmode(s_ChanServ, 3, av); + free(av[2]); + free(av[1]); + free(av[0]); + } + notice_lang(s_ChanServ, u, CHAN_CLEARED_HOPS, chan); + } else if (stricmp(what, "voices") == 0) { + char *av[3]; + struct c_userlist *cu, *next; + + for (cu = c->users; cu; cu = next) { + next = cu->next; + if (!chan_has_user_status(c, cu->user, CUS_VOICE)) + continue; + av[0] = sstrdup(chan); + av[1] = sstrdup("-v"); + av[2] = sstrdup(cu->user->nick); + if (ircd->svsmode_ucmode) { + anope_cmd_svsmode_chan(av[0], av[1], NULL); + do_cmode(s_ChanServ, 3, av); + break; + } else { + anope_cmd_mode(whosends(ci), av[0], "%s :%s", av[1], + av[2]); + } + do_cmode(s_ChanServ, 3, av); + free(av[2]); + free(av[1]); + free(av[0]); + } + notice_lang(s_ChanServ, u, CHAN_CLEARED_VOICES, chan); + } else if (stricmp(what, "users") == 0) { + char *av[3]; + struct c_userlist *cu, *next; + char buf[256]; + + snprintf(buf, sizeof(buf), "CLEAR USERS command from %s", u->nick); + + for (cu = c->users; cu; cu = next) { + next = cu->next; + av[0] = sstrdup(chan); + av[1] = sstrdup(cu->user->nick); + av[2] = sstrdup(buf); + 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..e53aa2037 --- /dev/null +++ b/src/core/cs_drop.c @@ -0,0 +1,128 @@ +/* ChanServ core functions + * + * (C) 2003-2005 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..e7efd39d5 --- /dev/null +++ b/src/core/cs_forbid.c @@ -0,0 +1,132 @@ +/* ChanServ core functions + * + * (C) 2003-2005 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 (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..c7ff77fea --- /dev/null +++ b/src/core/cs_getkey.c @@ -0,0 +1,88 @@ +/* ChanServ core functions + * + * (C) 2003-2005 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..403b21403 --- /dev/null +++ b/src/core/cs_getpass.c @@ -0,0 +1,100 @@ +/* ChanServ core functions + * + * (C) 2003-2005 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); +#ifdef USE_ENCRYPTION + +#else + return MOD_CONT; +#endif +} + +/** + * 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, " "); + 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 { + 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, ci->founderpass); + } + return MOD_CONT; +} diff --git a/src/core/cs_help.c b/src/core/cs_help.c new file mode 100644 index 000000000..8f1910d2a --- /dev/null +++ b/src/core/cs_help.c @@ -0,0 +1,84 @@ +/* ChanServ core functions + * + * (C) 2003-2005 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..0df40f127 --- /dev/null +++ b/src/core/cs_identify.c @@ -0,0 +1,118 @@ +/* ChanServ core functions + * + * (C) 2003-2005 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); +extern MDE int check_password(const char *plaintext, const char *password); + +/** + * 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 = 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..5450980de --- /dev/null +++ b/src/core/cs_info.c @@ -0,0 +1,249 @@ +/* ChanServ core functions + * + * (C) 2003-2005 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..bd3bb8e2b --- /dev/null +++ b/src/core/cs_invite.c @@ -0,0 +1,88 @@ +/* ChanServ core functions + * + * (C) 2003-2005 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 (!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..caaf6b9a9 --- /dev/null +++ b/src/core/cs_kick.c @@ -0,0 +1,152 @@ +/* ChanServ core functions + * + * (C) 2003-2005 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..fa33f2947 --- /dev/null +++ b/src/core/cs_list.c @@ -0,0 +1,172 @@ +/* ChanServ core functions + * + * (C) 2003-2005 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) +{ + 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, " "); + ChannelInfo *ci; + int nchans, i; + char buf[BUFSIZE]; + int is_servadmin = is_services_admin(u); + int count = 0, from = 0, to = 0; + char *tmp = NULL; + char *s = NULL; + char *keyword; + int32 matchflags = 0; + + + if (CSListOpersOnly && (!u || !is_oper(u))) { + notice_lang(s_ChanServ, u, PERMISSION_DENIED); + return MOD_CONT; + } + + if (!pattern) { + syntax_error(s_ChanServ, u, "LIST", + is_servadmin ? CHAN_LIST_SERVADMIN_SYNTAX : + CHAN_LIST_SYNTAX); + } else { + + if (pattern) { + if (pattern[0] == '#') { + tmp = myStrGetOnlyToken((pattern + 1), '-', 0); /* Read FROM out */ + if (!tmp) { + return MOD_CONT; + } + for (s = tmp; *s; s++) { + if (!isdigit(*s)) { + return MOD_CONT; + } + } + from = atoi(tmp); + tmp = myStrGetTokenRemainder(pattern, '-', 1); /* Read TO out */ + if (!tmp) { + return MOD_CONT; + } + for (s = tmp; *s; s++) { + if (!isdigit(*s)) { + return MOD_CONT; + } + } + to = atoi(tmp); + pattern = sstrdup("*"); + } + } + + nchans = 0; + + while (is_servadmin && (keyword = strtok(NULL, " "))) { + if (stricmp(keyword, "FORBIDDEN") == 0) + matchflags |= CI_VERBOTEN; + if (stricmp(keyword, "SUSPENDED") == 0) + matchflags |= CI_SUSPENDED; + if (stricmp(keyword, "NOEXPIRE") == 0) + matchflags |= CI_NO_EXPIRE; + } + + notice_lang(s_ChanServ, u, CHAN_LIST_HEADER, pattern); + for (i = 0; i < 256; i++) { + for (ci = chanlists[i]; ci; ci = ci->next) { + if (!is_servadmin && ((ci->flags & CI_PRIVATE) + || (ci->flags & CI_VERBOTEN))) + continue; + if ((matchflags != 0) && !(ci->flags & matchflags)) + continue; + + if (stricmp(pattern, ci->name) == 0 + || match_wild_nocase(pattern, ci->name)) { + if ((((count + 1 >= from) && (count + 1 <= to)) + || ((from == 0) && (to == 0))) + && (++nchans <= CSListMax)) { + char noexpire_char = ' '; + if (is_servadmin && (ci->flags & CI_NO_EXPIRE)) + noexpire_char = '!'; + + if (ci->flags & CI_VERBOTEN) { + snprintf(buf, sizeof(buf), + "%-20s [Forbidden]", ci->name); + } else if (ci->flags & CI_SUSPENDED) { + snprintf(buf, sizeof(buf), + "%-20s [Suspended]", ci->name); + } else { + snprintf(buf, sizeof(buf), "%-20s %s", + ci->name, ci->desc ? ci->desc : ""); + } + + notice_user(s_ChanServ, u, " %c%s", + noexpire_char, buf); + } + count++; + } + } + } + notice_lang(s_ChanServ, u, CHAN_LIST_END, + nchans > CSListMax ? CSListMax : nchans, nchans); + } + return MOD_CONT; + +} diff --git a/src/core/cs_logout.c b/src/core/cs_logout.c new file mode 100644 index 000000000..2d143fc4b --- /dev/null +++ b/src/core/cs_logout.c @@ -0,0 +1,128 @@ +/* ChanServ core functions + * + * (C) 2003-2005 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); + } 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..c2696a108 --- /dev/null +++ b/src/core/cs_modes.c @@ -0,0 +1,392 @@ +/* ChanServ core functions + * + * (C) 2003-2005 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, 1); + + 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)) { + 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, 1); + + if (util->notice && ci->flags & util->notice) + notice(whosends(ci), c->name, "%s command used for %s by %s", + util->name, u2->nick, u->nick); + } + return MOD_CONT; +} diff --git a/src/core/cs_register.c b/src/core/cs_register.c new file mode 100644 index 000000000..892f51290 --- /dev/null +++ b/src/core/cs_register.c @@ -0,0 +1,199 @@ +/* ChanServ core functions + * + * (C) 2003-2005 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); + 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); +#ifdef USE_ENCRYPTION + char founderpass[PASSMAX + 1]; +#endif + + if (readonly) { + notice_lang(s_ChanServ, u, CHAN_REGISTER_DISABLED); + return MOD_CONT; + } + + if (checkDefCon(DEFCON_NO_NEW_CHANNELS)) { + notice_lang(s_ChanServ, u, OPER_DEFCON_DENIED); + return MOD_CONT; + } + + if (!desc) { + syntax_error(s_ChanServ, u, "REGISTER", CHAN_REGISTER_SYNTAX); + } else if (*chan == '&') { + notice_lang(s_ChanServ, u, CHAN_REGISTER_NOT_LOCAL); + } else if (*chan != '#') { + notice_lang(s_ChanServ, u, CHAN_SYMBOL_REQUIRED); + } 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 (!(ci = makechan(chan))) { + alog("%s: makechan() failed for REGISTER %s", s_ChanServ, chan); + notice_lang(s_ChanServ, u, CHAN_REGISTRATION_FAILED); + +#ifdef USE_ENCRYPTION + } else if (strscpy(founderpass, pass, PASSMAX + 1), + encrypt_in_place(founderpass, PASSMAX) < 0) { + alog("%s: Couldn't encrypt password for %s (REGISTER)", + s_ChanServ, chan); + notice_lang(s_ChanServ, u, CHAN_REGISTRATION_FAILED); + delchan(ci); +#endif + + } else { + c->ci = ci; + ci->c = c; + ci->bantype = CSDefBantype; + ci->flags = CSDefFlags; + ci->mlock_on = ircd->defmlock; + ci->memos.memomax = MSMaxMemos; + ci->last_used = ci->time_registered; + ci->founder = nc; +#ifdef USE_ENCRYPTION + if (strlen(pass) > PASSMAX) + notice_lang(s_ChanServ, u, PASSWORD_TRUNCATED, PASSMAX); + memset(pass, 0, strlen(pass)); + memcpy(ci->founderpass, founderpass, PASSMAX); + ci->flags |= CI_ENCRYPTEDPW; +#else + if (strlen(pass) > PASSMAX - 1) /* -1 for null byte */ + notice_lang(s_ChanServ, u, PASSWORD_TRUNCATED, PASSMAX - 1); + strscpy(ci->founderpass, pass, PASSMAX); +#endif + ci->desc = sstrdup(desc); + if (c->topic) { + ci->last_topic = sstrdup(c->topic); + strscpy(ci->last_topic_setter, c->topic_setter, NICKMAX); + ci->last_topic_time = c->topic_time; + } 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); +#ifndef USE_ENCRYPTION + notice_lang(s_ChanServ, u, CHAN_PASSWORD_IS, ci->founderpass); +#endif + uc = scalloc(sizeof(*uc), 1); + uc->next = u->founder_chans; + uc->prev = NULL; + if (u->founder_chans) + u->founder_chans->prev = uc; + u->founder_chans = uc; + uc->chan = ci; + /* Implement new mode lock */ + check_modes(c); + /* 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..61eb70524 --- /dev/null +++ b/src/core/cs_sendpass.c @@ -0,0 +1,123 @@ +/* ChanServ core functions + * + * (C) 2003-2005 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); +#ifdef USE_ENCRYPTION + return MOD_STOP; +#else + if (UseMail) { + return MOD_CONT; + } else { + return MOD_STOP; + } +#endif +} + +/** + * 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_oper(u)) { + notice_lang(s_ChanServ, u, PERMISSION_DENIED); + } else if (!(ci = cs_findchan(chan)) || !(founder = ci->founder)) { + notice_lang(s_ChanServ, u, CHAN_X_NOT_REGISTERED, chan); + } else if (ci->flags & CI_VERBOTEN) { + notice_lang(s_ChanServ, u, CHAN_X_FORBIDDEN, chan); + } else { + char buf[BUFSIZE]; + MailInfo *mail; + + snprintf(buf, sizeof(buf), + getstring2(founder, CHAN_SENDPASS_SUBJECT), ci->name); + mail = MailBegin(u, founder, buf, s_ChanServ); + if (!mail) + return MOD_CONT; + + fprintf(mail->pipe, getstring2(founder, CHAN_SENDPASS_HEAD)); + fprintf(mail->pipe, "\n\n"); + fprintf(mail->pipe, getstring2(founder, CHAN_SENDPASS_LINE_1), + ci->name); + fprintf(mail->pipe, "\n\n"); + fprintf(mail->pipe, getstring2(founder, CHAN_SENDPASS_LINE_2), + ci->founderpass); + fprintf(mail->pipe, "\n\n"); + fprintf(mail->pipe, getstring2(founder, CHAN_SENDPASS_LINE_3)); + fprintf(mail->pipe, "\n\n"); + fprintf(mail->pipe, getstring2(founder, CHAN_SENDPASS_LINE_4)); + fprintf(mail->pipe, "\n\n"); + fprintf(mail->pipe, getstring2(founder, CHAN_SENDPASS_LINE_5), + NetworkName); + fprintf(mail->pipe, "\n.\n"); + + MailEnd(mail); + + alog("%s: %s!%s@%s used SENDPASS on %s", s_ChanServ, u->nick, + u->username, u->host, chan); + notice_lang(s_ChanServ, u, CHAN_SENDPASS_OK, chan); + } + return MOD_CONT; +} diff --git a/src/core/cs_set.c b/src/core/cs_set.c new file mode 100644 index 000000000..7916a93b4 --- /dev/null +++ b/src/core/cs_set.c @@ -0,0 +1,839 @@ +/* ChanServ core functions + * + * (C) 2003-2005 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_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); + 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); + 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) { + 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; + } +#ifdef USE_ENCRYPTION + if (len > PASSMAX) { + len = PASSMAX; + param[len] = 0; + notice_lang(s_ChanServ, u, PASSWORD_TRUNCATED, PASSMAX); + } + + if (encrypt(param, len, ci->founderpass, PASSMAX) < 0) { + memset(param, 0, strlen(param)); + alog("%s: Failed to encrypt password for %s (set)", s_ChanServ, + ci->name); + notice_lang(s_ChanServ, u, CHAN_SET_PASSWORD_FAILED); + return MOD_CONT; + } + + memset(param, 0, strlen(param)); + notice_lang(s_ChanServ, u, CHAN_PASSWORD_CHANGED, ci->name); + +#else /* !USE_ENCRYPTION */ + if (strlen(param) > PASSMAX - 1) /* -1 for null byte */ + notice_lang(s_ChanServ, u, PASSWORD_TRUNCATED, PASSMAX - 1); + strscpy(ci->founderpass, param, PASSMAX); + notice_lang(s_ChanServ, u, CHAN_PASSWORD_CHANGED_TO, ci->name, + ci->founderpass); +#endif /* USE_ENCRYPTION */ + + if (get_access(u, ci) < ACCESS_FOUNDER) { + alog("%s: %s!%s@%s set password as Services admin for %s", + s_ChanServ, u->nick, u->username, 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..a8a847ff1 --- /dev/null +++ b/src/core/cs_status.c @@ -0,0 +1,102 @@ +/* ChanServ core functions + * + * (C) 2003-2005 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; + + 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..7abf9e730 --- /dev/null +++ b/src/core/cs_suspend.c @@ -0,0 +1,188 @@ +/* ChanServ core functions + * + * (C) 2003-2005 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_admin, -1, -1, -1, + CHAN_SERVADMIN_HELP_SUSPEND, + CHAN_SERVADMIN_HELP_SUSPEND); + moduleAddCommand(CHANSERV, c, MOD_UNIQUE); + c = createCommand("UNSUSPEND", do_unsuspend, is_services_admin, -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_admin(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; + } + + /* 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); + + ci = cs_findchan(chan); + + if (ci) { + ci->flags &= ~CI_SUSPENDED; + ci->forbidreason = NULL; + 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..bd175cafe --- /dev/null +++ b/src/core/cs_topic.c @@ -0,0 +1,119 @@ +/* ChanServ core functions + * + * (C) 2003-2005 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, time(NULL)); + 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..9116d165c --- /dev/null +++ b/src/core/cs_xop.c @@ -0,0 +1,474 @@ +/* ChanServ core functions + * + * (C) 2003-2005 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); + 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, ChanAccess * access, int *perm, int uacc, int xlev) +{ + if (!access->in_use || access->level != xlev) + return 0; + if (!is_services_admin(u) && uacc <= access->level) { + (*perm)++; + return 0; + } + access->nc = NULL; + access->in_use = 0; + return 1; +} + +int xop_del_callback(User * u, int num, va_list args) +{ + ChannelInfo *ci = va_arg(args, ChannelInfo *); + int *last = va_arg(args, int *); + int *perm = va_arg(args, int *); + int uacc = va_arg(args, int); + int xlev = va_arg(args, int); + + if (num < 1 || num > ci->accesscount) + return 0; + *last = num; + + return xop_del(u, &ci->access[num - 1], perm, uacc, xlev); +} + + +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, " "); + + 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) { + for (i = 0; i < ci->accesscount; i++) + if (!ci->access[i].in_use) + break; + + if (i == ci->accesscount) { + if (i < CSAccessMax) { + ci->accesscount++; + ci->access = + srealloc(ci->access, + sizeof(ChanAccess) * ci->accesscount); + } else { + notice_lang(s_ChanServ, u, CHAN_XOP_REACHED_LIMIT, + CSAccessMax); + return MOD_CONT; + } + } + + access = &ci->access[i]; + access->nc = nc; + } + + access->in_use = 1; + access->level = xlev; + access->last_seen = 0; + + alog("%s: %s!%s@%s (level %d) %s access level %d to %s (group %s) on channel %s", s_ChanServ, u->nick, u->username, u->host, ulev, change ? "changed" : "set", access->level, na->nick, nc->display, ci->name); + + if (!change) { + notice_lang(s_ChanServ, u, xmsgs[3], access->nc->display, + ci->name); + } else { + notice_lang(s_ChanServ, u, xmsgs[4], access->nc->display, + ci->name); + } + + } else if (stricmp(cmd, "DEL") == 0) { + 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); + + /* 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; + 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; + } + } + } + } + } + } else if (stricmp(cmd, "LIST") == 0) { + int sent_header = 0; + + ulev = get_access(u, ci); + + if (!is_servadmin && ulev < ACCESS_AOP) { + notice_lang(s_ChanServ, u, ACCESS_DENIED); + return MOD_CONT; + } + + if (ci->accesscount == 0) { + notice_lang(s_ChanServ, u, xmsgs[11], ci->name); + return MOD_CONT; + } + + if (nick && strspn(nick, "1234567890,-") == strlen(nick)) { + process_numlist(nick, NULL, xop_list_callback, u, ci, + &sent_header, xlev, xmsgs[12]); + } else { + for (i = 0; i < ci->accesscount; i++) { + if (nick && ci->access[i].nc + && !match_wild_nocase(nick, ci->access[i].nc->display)) + continue; + xop_list(u, i, ci, &sent_header, xlev, xmsgs[12]); + } + } + if (!sent_header) + notice_lang(s_ChanServ, u, xmsgs[7], chan); + } else if (stricmp(cmd, "CLEAR") == 0) { + if (readonly) { + notice_lang(s_ChanServ, u, CHAN_ACCESS_DISABLED); + return MOD_CONT; + } + + if (ci->accesscount == 0) { + notice_lang(s_ChanServ, u, CHAN_ACCESS_LIST_EMPTY, chan); + return MOD_CONT; + } + + if (!is_servadmin && !is_founder(u, ci)) { + notice_lang(s_ChanServ, u, PERMISSION_DENIED); + return MOD_CONT; + } + + for (i = 0; i < ci->accesscount; i++) { + if (ci->access[i].in_use && ci->access[i].level == xlev) { + ci->access[i].nc = NULL; + ci->access[i].in_use = 0; + } + } + + notice_lang(s_ChanServ, u, xmsgs[13], ci->name); + } else { + syntax_error(s_ChanServ, u, xname, xmsgs[0]); + } + return MOD_CONT; +} diff --git a/src/core/he_help.c b/src/core/he_help.c new file mode 100644 index 000000000..0a96507ab --- /dev/null +++ b/src/core/he_help.c @@ -0,0 +1,76 @@ +/* HelpServ core functions + * + * (C) 2003-2005 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..93bc09551 --- /dev/null +++ b/src/core/hs_del.c @@ -0,0 +1,91 @@ +/* HostServ core functions + * + * (C) 2003-2005 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..4571c5aca --- /dev/null +++ b/src/core/hs_delall.c @@ -0,0 +1,96 @@ +/* HostServ core functions + * + * (C) 2003-2005 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..db034a948 --- /dev/null +++ b/src/core/hs_group.c @@ -0,0 +1,121 @@ +/* HostServ core functions + * + * (C) 2003-2005 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); + +/** + * 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..084bd3434 --- /dev/null +++ b/src/core/hs_help.c @@ -0,0 +1,66 @@ +/* HostServ core functions + * + * (C) 2003-2005 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..c8d096db7 --- /dev/null +++ b/src/core/hs_list.c @@ -0,0 +1,179 @@ +/* HostServ core functions + * + * (C) 2003-2005 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) { + return MOD_CONT; + } + for (s = tmp; *s; s++) { + if (!isdigit(*s)) { + return MOD_CONT; + } + } + from = atoi(tmp); + tmp = myStrGetTokenRemainder(key, '-', 1); /* Read TO out */ + if (!tmp) { + return MOD_CONT; + } + for (s = tmp; *s; s++) { + if (!isdigit(*s)) { + return MOD_CONT; + } + } + to = atoi(tmp); + key = NULL; + } + } + + while (current != NULL) { + if (key) { + if (((match_wild_nocase(key, current->nick)) + || (match_wild_nocase(key, current->vHost))) + && (display_counter < NSListMax)) { + display_counter++; + tm = localtime(¤t->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(¤t->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..e3785e7ad --- /dev/null +++ b/src/core/hs_off.c @@ -0,0 +1,87 @@ +/* HostServ core functions + * + * (C) 2003-2005 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..7421eec7d --- /dev/null +++ b/src/core/hs_on.c @@ -0,0 +1,102 @@ +/* HostServ core functions + * + * (C) 2003-2005 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..f62491414 --- /dev/null +++ b/src/core/hs_set.c @@ -0,0 +1,147 @@ +/* HostServ core functions + * + * (C) 2003-2005 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); + return MOD_CONT; + } + + vIdent = myStrGetOnlyToken(rawhostmask, '@', 0); /* Get the first substring, @ as delimiter */ + if (vIdent) { + rawhostmask = myStrGetTokenRemainder(rawhostmask, '@', 1); /* get the remaining string */ + if (!rawhostmask) { + notice_lang(s_HostServ, u, HOST_SET_SYNTAX, s_HostServ); + return MOD_CONT; + } + if (strlen(vIdent) > USERMAX - 1) { + notice_lang(s_HostServ, u, HOST_SET_IDENTTOOLONG, USERMAX); + return MOD_CONT; + } else { + for (s = vIdent; *s; s++) { + if (!isvalidchar(*s)) { + notice_lang(s_HostServ, u, HOST_SET_IDENT_ERROR); + return MOD_CONT; + } + } + } + if (!ircd->vident) { + notice_lang(s_HostServ, u, HOST_NO_VIDENT); + return MOD_CONT; + } + } + if (strlen(rawhostmask) < HOSTMAX - 1) + snprintf(hostmask, HOSTMAX - 1, "%s", rawhostmask); + else { + notice_lang(s_HostServ, u, HOST_SET_TOOLONG, HOSTMAX); + return MOD_CONT; + } + + if (!isValidHost(hostmask, 3)) { + notice_lang(s_HostServ, u, HOST_SET_ERROR); + return MOD_CONT; + } + + + tmp_time = time(NULL); + + if ((na = findnick(nick))) { + if (na->status & NS_VERBOTEN) { + notice_lang(s_HostServ, u, NICK_X_FORBIDDEN, nick); + 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); + return MOD_CONT; +} diff --git a/src/core/hs_setall.c b/src/core/hs_setall.c new file mode 100644 index 000000000..a0685a89f --- /dev/null +++ b/src/core/hs_setall.c @@ -0,0 +1,150 @@ +/* HostServ core functions + * + * (C) 2003-2005 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); + +/** + * 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); + return MOD_CONT; + } + + vIdent = myStrGetOnlyToken(rawhostmask, '@', 0); /* Get the first substring, @ as delimiter */ + if (vIdent) { + rawhostmask = myStrGetTokenRemainder(rawhostmask, '@', 1); /* get the remaining string */ + if (!rawhostmask) { + notice_lang(s_HostServ, u, HOST_SETALL_SYNTAX, s_HostServ); + return MOD_CONT; + } + if (strlen(vIdent) > USERMAX - 1) { + notice_lang(s_HostServ, u, HOST_SET_IDENTTOOLONG, USERMAX); + return MOD_CONT; + } else { + for (s = vIdent; *s; s++) { + if (!isvalidchar(*s)) { + notice_lang(s_HostServ, u, HOST_SET_IDENT_ERROR); + return MOD_CONT; + } + } + } + if (!ircd->vident) { + notice_lang(s_HostServ, u, HOST_NO_VIDENT); + return MOD_CONT; + } + } + + if (strlen(rawhostmask) < HOSTMAX - 1) + snprintf(hostmask, HOSTMAX - 1, "%s", rawhostmask); + else { + notice_lang(s_HostServ, u, HOST_SET_TOOLONG, HOSTMAX); + return MOD_CONT; + } + + if (!isValidHost(hostmask, 3)) { + notice_lang(s_HostServ, u, HOST_SET_ERROR); + 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); + 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); + } + + 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..8def3b2da --- /dev/null +++ b/src/core/ms_cancel.c @@ -0,0 +1,105 @@ +/* MemoServ core functions + * + * (C) 2003-2005 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..a236ae0a5 --- /dev/null +++ b/src/core/ms_check.c @@ -0,0 +1,118 @@ +/* MemoServ core functions + * + * (C) 2003-2005 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..1fc3557c0 --- /dev/null +++ b/src/core/ms_del.c @@ -0,0 +1,199 @@ +/* MemoServ core functions + * + * (C) 2003-2005 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 (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..d4e3bb4d2 --- /dev/null +++ b/src/core/ms_help.c @@ -0,0 +1,66 @@ +/* MemoServ core functions + * + * (C) 2003-2005 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..92255256a --- /dev/null +++ b/src/core/ms_info.c @@ -0,0 +1,231 @@ +/* MemoServ core functions + * + * (C) 2003-2005 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..fa6a9f95b --- /dev/null +++ b/src/core/ms_list.c @@ -0,0 +1,197 @@ +/* MemoServ core functions + * + * (C) 2003-2005 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..4c650f5e1 --- /dev/null +++ b/src/core/ms_read.c @@ -0,0 +1,201 @@ +/* MemoServ core functions + * + * (C) 2003-2005 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); + +/** + * 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..b712f4af1 --- /dev/null +++ b/src/core/ms_rsend.c @@ -0,0 +1,119 @@ +/* MemoServ core functions + * + * (C) 2003-2005 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..c366072a4 --- /dev/null +++ b/src/core/ms_send.c @@ -0,0 +1,73 @@ +/* MemoServ core functions + * + * (C) 2003-2005 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..36eae983f --- /dev/null +++ b/src/core/ms_sendall.c @@ -0,0 +1,95 @@ +/* MemoServ core functions + * + * (C) 2003-2005 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..6d89818ba --- /dev/null +++ b/src/core/ms_set.c @@ -0,0 +1,265 @@ +/* MemoServ core functions + * + * (C) 2003-2005 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); + 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..091a23ce5 --- /dev/null +++ b/src/core/ms_staff.c @@ -0,0 +1,92 @@ +/* MemoServ core functions + * + * (C) 2003-2005 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..25c6bf8cd --- /dev/null +++ b/src/core/ns_access.c @@ -0,0 +1,189 @@ +/* NickServ core functions + * + * (C) 2003-2005 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..f7a913f8f --- /dev/null +++ b/src/core/ns_alist.c @@ -0,0 +1,186 @@ +/* NickServ core functions + * + * (C) 2003-2005 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)) { + 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..e48849dff --- /dev/null +++ b/src/core/ns_drop.c @@ -0,0 +1,156 @@ +/* NickServ core functions + * + * (C) 2003-2005 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..adf620ff4 --- /dev/null +++ b/src/core/ns_forbid.c @@ -0,0 +1,151 @@ +/* NickServ core functions + * + * (C) 2003-2005 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 ((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..24d463bb6 --- /dev/null +++ b/src/core/ns_getemail.c @@ -0,0 +1,102 @@ +/* NickServ core functions + * + * (C) 2003-2005 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..afacd63a9 --- /dev/null +++ b/src/core/ns_getpass.c @@ -0,0 +1,111 @@ +/* NickServ core functions + * + * (C) 2003-2005 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); + +#ifdef USE_ENCRYPTION + return MOD_STOP; +#else + return MOD_CONT; +#endif +} + +/** + * 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, " "); + 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 { + 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, + na->nc->pass); + } + return MOD_CONT; +} diff --git a/src/core/ns_ghost.c b/src/core/ns_ghost.c new file mode 100644 index 000000000..d97cc39ff --- /dev/null +++ b/src/core/ns_ghost.c @@ -0,0 +1,122 @@ +/* NickServ core functions + * + * (C) 2003-2005 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 = check_password(pass, na->nc->pass); + if (res == 1) { + char buf[NICKMAX + 32]; + snprintf(buf, sizeof(buf), "GHOST command used by %s", + u->nick); + if (LimitSessions) { + del_session(u2->host); + } + 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); + if (LimitSessions) { + del_session(u2->host); + } + 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..f652547a9 --- /dev/null +++ b/src/core/ns_group.c @@ -0,0 +1,326 @@ +/* NickServ core functions + * + * (C) 2003-2005 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]; + + 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 (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) { + if (ircd->tsonmode) { + common_svsmode(u, ircd->modeonreg, tsbuf); + } else { + common_svsmode(u, ircd->modeonreg, 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..579dfec7c --- /dev/null +++ b/src/core/ns_help.c @@ -0,0 +1,77 @@ +/* NickServ core functions + * + * (C) 2003-2005 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; +} diff --git a/src/core/ns_identify.c b/src/core/ns_identify.c new file mode 100644 index 000000000..362cd4488 --- /dev/null +++ b/src/core/ns_identify.c @@ -0,0 +1,160 @@ +/* NickServ core functions + * + * (C) 2003-2005 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]; + + 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 = 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) { + if (ircd->tsonmode) { + common_svsmode(u, ircd->modeonreg, tsbuf); + } else { + common_svsmode(u, ircd->modeonreg, ""); + } + } + 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..1f150b7c3 --- /dev/null +++ b/src/core/ns_info.c @@ -0,0 +1,272 @@ +/* NickServ core functions + * + * (C) 2003-2005 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; + int is_servadmin = is_services_admin(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; + } + + notice_lang(s_NickServ, u, NICK_INFO_OPTIONS, + *buf ? buf : getstring(u->na, NICK_INFO_OPT_NONE)); + + if (na->nc->flags & NI_SUSPENDED) { + notice_lang(s_NickServ, u, NICK_INFO_SUSPENDED, + na->last_quit); + } + + 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..d04d7f2ec --- /dev/null +++ b/src/core/ns_list.c @@ -0,0 +1,230 @@ +/* NickServ core functions + * + * (C) 2003-2005 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); + + if (NSListOpersOnly) { + c = createCommand("LIST", do_list, is_oper, -1, NICK_HELP_LIST, -1, + NICK_SERVADMIN_HELP_LIST, + NICK_SERVADMIN_HELP_LIST); + } else { + 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 + */ + + + char *pattern = strtok(NULL, " "); + char *keyword; + NickAlias *na; + NickCore *mync; + int nnicks, i; + char buf[BUFSIZE]; + int is_servadmin = is_services_admin(u); + int16 matchflags = 0; + NickRequest *nr = NULL; + int nronly = 0; + char noexpire_char = ' '; + int count = 0, from = 0, to = 0; + char *tmp = NULL; + char *s = NULL; + + + + if (!pattern) { + syntax_error(s_NickServ, u, "LIST", + is_servadmin ? NICK_LIST_SERVADMIN_SYNTAX : + NICK_LIST_SYNTAX); + } else { + + if (pattern) { + if (pattern[0] == '#') { + tmp = myStrGetOnlyToken((pattern + 1), '-', 0); /* Read FROM out */ + if (!tmp) { + return MOD_CONT; + } + for (s = tmp; *s; s++) { + if (!isdigit(*s)) { + return MOD_CONT; + } + } + from = atoi(tmp); + tmp = myStrGetTokenRemainder(pattern, '-', 1); /* Read TO out */ + if (!tmp) { + return MOD_CONT; + } + for (s = tmp; *s; s++) { + if (!isdigit(*s)) { + return MOD_CONT; + } + } + to = atoi(tmp); + pattern = sstrdup("*"); + } + } + + nnicks = 0; + + while (is_servadmin && (keyword = strtok(NULL, " "))) { + if (stricmp(keyword, "FORBIDDEN") == 0) + matchflags |= NS_VERBOTEN; + if (stricmp(keyword, "NOEXPIRE") == 0) + matchflags |= NS_NO_EXPIRE; + if (stricmp(keyword, "UNCONFIRMED") == 0) + nronly = 1; + } + + mync = (nick_identified(u) ? u->na->nc : NULL); + + notice_lang(s_NickServ, u, NICK_LIST_HEADER, pattern); + if (nronly != 1) { + for (i = 0; i < 1024; i++) { + for (na = nalists[i]; na; na = na->next) { + /* Don't show private and forbidden nicks to non-services admins. */ + if ((na->status & NS_VERBOTEN) && !is_servadmin) + continue; + if ((na->nc->flags & NI_PRIVATE) && !is_servadmin + && na->nc != mync) + continue; + if ((matchflags != 0) && !(na->status & matchflags)) + continue; + + /* We no longer compare the pattern against the output buffer. + * Instead we build a nice nick!user@host buffer to compare. + * The output is then generated separately. -TheShadow */ + snprintf(buf, sizeof(buf), "%s!%s", na->nick, + (na->last_usermask + && !(na->status & NS_VERBOTEN)) ? na-> + last_usermask : "*@*"); + if (stricmp(pattern, na->nick) == 0 + || match_wild_nocase(pattern, buf)) { + + if ((((count + 1 >= from) && (count + 1 <= to)) + || ((from == 0) && (to == 0))) + && (++nnicks <= NSListMax)) { + if (is_servadmin + && (na->status & NS_NO_EXPIRE)) + noexpire_char = '!'; + else { + noexpire_char = ' '; + } + if ((na->nc->flags & NI_HIDE_MASK) + && !is_servadmin && na->nc != mync) { + snprintf(buf, sizeof(buf), + "%-20s [Hostname Hidden]", + na->nick); + } else if (na->status & NS_VERBOTEN) { + snprintf(buf, sizeof(buf), + "%-20s [Forbidden]", na->nick); + } else { + snprintf(buf, sizeof(buf), "%-20s %s", + na->nick, na->last_usermask); + } + notice_user(s_NickServ, u, " %c%s", + noexpire_char, buf); + } + count++; + } + } + } + } + + if (nronly == 1 || (is_servadmin && matchflags == 0)) { + noexpire_char = ' '; + for (i = 0; i < 1024; i++) { + for (nr = nrlists[i]; nr; nr = nr->next) { + snprintf(buf, sizeof(buf), "%s!*@*", nr->nick); + if (stricmp(pattern, nr->nick) == 0 + || match_wild_nocase(pattern, buf)) { + if (++nnicks <= NSListMax) { + snprintf(buf, sizeof(buf), + "%-20s [UNCONFIRMED]", nr->nick); + notice_user(s_NickServ, u, " %c%s", + noexpire_char, buf); + } + } + } + } + } + notice_lang(s_NickServ, u, NICK_LIST_RESULTS, + nnicks > NSListMax ? NSListMax : nnicks, nnicks); + } + return MOD_CONT; +} diff --git a/src/core/ns_logout.c b/src/core/ns_logout.c new file mode 100644 index 000000000..ef91b75a9 --- /dev/null +++ b/src/core/ns_logout.c @@ -0,0 +1,125 @@ +/* NickServ core functions + * + * (C) 2003-2005 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) + nsStopNickTracking(u); + + /* Clear any timers again */ + if (u->na->nc->flags & NI_KILLPROTECT) { + del_ns_timeout(u->na, TO_COLLIDE); + } + + } + return MOD_CONT; +} diff --git a/src/core/ns_recover.c b/src/core/ns_recover.c new file mode 100644 index 000000000..2b72d94fb --- /dev/null +++ b/src/core/ns_recover.c @@ -0,0 +1,111 @@ +/* NickServ core functions + * + * (C) 2003-2005 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_recover(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("RECOVER", do_recover, NULL, NICK_HELP_RECOVER, -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_RECOVER); +} + +/** + * 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 = check_password(pass, na->nc->pass); + + if (res == 1) { + notice_lang(s_NickServ, u2, FORCENICKCHANGE_NOW); + collide(na, 0); + notice_lang(s_NickServ, u, NICK_RECOVERED, s_NickServ, nick); + } else { + notice_lang(s_NickServ, u, ACCESS_DENIED); + if (res == 0) { + alog("%s: RECOVER: invalid password for %s by %s!%s@%s", + s_NickServ, nick, u->nick, u->username, 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; +} diff --git a/src/core/ns_register.c b/src/core/ns_register.c new file mode 100644 index 000000000..92f4f0589 --- /dev/null +++ b/src/core/ns_register.c @@ -0,0 +1,486 @@ +/* NickServ core functions + * + * (C) 2003-2005 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_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, -1, -1, -1, -1, -1); + moduleAddCommand(NICKSERV, c, MOD_UNIQUE); + + c = createCommand("RESEND", do_resend, 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_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 (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 (email && !MailValidate(email)) { + notice_lang(s_NickServ, u, MAIL_X_INVALID, email); + } else { +#ifdef USE_ENCRYPTION + if (strlen(pass) > PASSMAX) { + pass[PASSMAX] = 0; + notice_lang(s_NickServ, u, PASSWORD_TRUNCATED, PASSMAX); + } +#else + if (strlen(pass) > PASSMAX - 1) { /* -1 for null byte */ + pass[PASSMAX] = 0; + notice_lang(s_NickServ, u, PASSWORD_TRUNCATED, PASSMAX - 1); + } +#endif + 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); + nr->password = sstrdup(pass); + if (email) { + nr->email = sstrdup(email); + } + nr->requested = time(NULL); + if (NSEmailReg) { + if (do_sendregmail(u, nr) == 0) { + notice_lang(s_NickServ, u, NICK_ENTER_REG_CODE, email, + s_NickServ); + alog("%s: sent registration verification code to %s", + s_NickServ, nr->email); + } else { + alog("%s: Unable to send registration verification mail", + s_NickServ); + notice_lang(s_NickServ, u, NICK_REG_UNABLE); + delnickrequest(nr); /* Delete the NickRequest if we couldnt send the mail */ + return MOD_CONT; + } + } else { + do_confirm(u); + } + + } + return MOD_CONT; +} + +/*************************************************************************/ + +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 *pass = NULL; + char *email = NULL; + int forced = 0; + User *utmp = NULL; +#ifdef USE_ENCRYPTION + int len; +#endif + nr = findrequestnick(u->nick); + + if (NSEmailReg) { + if (!passcode) { + notice_lang(s_NickServ, u, NICK_CONFIRM_INVALID); + return MOD_CONT; + } + + if (!nr) { + if (is_services_admin(u)) { +/* If an admin, thier nick is obviously already regged, so look at the passcode to get the nick + of the user they are trying to validate, and push that user through regardless of passcode */ + nr = findrequestnick(passcode); + if (nr) { + utmp = finduser(passcode); + if (utmp) { + sprintf(passcode, + "FORCE_ACTIVATION_DUE_TO_OPER_CONFIRM %s", + nr->passcode); + passcode = strtok(passcode, " "); + notice_lang(s_NickServ, u, NICK_FORCE_REG, + nr->nick); + do_confirm(utmp); + return MOD_CONT; + } else { + passcode = sstrdup(nr->passcode); + forced = 1; + } + } else { + notice_lang(s_NickServ, u, NICK_CONFIRM_NOT_FOUND, + s_NickServ); + return MOD_CONT; + } + } else { + notice_lang(s_NickServ, u, NICK_CONFIRM_NOT_FOUND, + s_NickServ); + return MOD_CONT; + } + } + + if (stricmp(nr->passcode, passcode) != 0) { + notice_lang(s_NickServ, u, NICK_CONFIRM_INVALID); + return MOD_CONT; + } + } + + if (!nr) { + notice_lang(s_NickServ, u, NICK_REGISTRATION_FAILED); + return MOD_CONT; + } + pass = sstrdup(nr->password); + + if (nr->email) { + email = sstrdup(nr->email); + } + na = makenick(nr->nick); + + if (na) { + int i; + char tsbuf[16]; + +#ifdef USE_ENCRYPTION + len = strlen(pass); + na->nc->pass = smalloc(PASSMAX); + if (encrypt(pass, len, na->nc->pass, PASSMAX) < 0) { + memset(pass, 0, strlen(pass)); + alog("%s: Failed to encrypt password for %s (register)", + s_NickServ, nr->nick); + notice_lang(s_NickServ, u, NICK_REGISTRATION_FAILED); + return MOD_CONT; + } + memset(pass, 0, strlen(pass)); + na->status = (int16) (NS_IDENTIFIED | NS_RECOGNIZED); + na->nc->flags |= NI_ENCRYPTEDPW; +#else + na->nc->pass = sstrdup(pass); + na->status = (int16) (NS_IDENTIFIED | NS_RECOGNIZED); +#endif + na->nc->flags |= NSDefFlags; + for (i = 0; i < RootNumber; i++) { + if (!stricmp(ServicesRoots[i], nr->nick)) { + na->nc->flags |= NI_SERVICES_ROOT; + break; + } + } + na->nc->memos.memomax = MSMaxMemos; + na->nc->channelmax = CSMaxReg; + if (forced == 1) { + na->last_usermask = sstrdup("*@*"); + na->last_realname = sstrdup("unknown"); + } else { + na->last_usermask = + scalloc(strlen(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); +#ifndef USE_ENCRYPTION + notice_lang(s_NickServ, u, NICK_PASSWORD_IS, na->nc->pass); +#endif + u->lastnickreg = time(NULL); + if (ircd->modeonreg) { + if (ircd->tsonmode) { + snprintf(tsbuf, sizeof(tsbuf), "%lu", + (unsigned long int) u->timestamp); + common_svsmode(u, ircd->modeonreg, tsbuf); + } else { + common_svsmode(u, ircd->modeonreg, 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 (do_sendregmail(u, nr) == 0) { + notice_lang(s_NickServ, u, NICK_REG_RESENT, nr->email); + alog("%s: re-sent registration verification code for %s to %s", s_NickServ, nr->nick, nr->email); + } else { + alog("%s: Unable to re-send registration verification mail for %s", s_NickServ, nr->nick); + return MOD_CONT; + } + } + } + return MOD_CONT; +} + +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..4112c4606 --- /dev/null +++ b/src/core/ns_release.c @@ -0,0 +1,107 @@ +/* NickServ core functions + * + * (C) 2003-2005 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_release(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("RELEASE", do_release, NULL, NICK_HELP_RELEASE, -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_RELEASE); +} + +/** + * 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 = 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; +} diff --git a/src/core/ns_sendpass.c b/src/core/ns_sendpass.c new file mode 100644 index 000000000..14f766252 --- /dev/null +++ b/src/core/ns_sendpass.c @@ -0,0 +1,120 @@ +/* NickServ core functions + * + * (C) 2003-2005 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; + } +#ifdef USE_ENCRYPTION + return MOD_STOP; +#else + return MOD_CONT; +#endif +} + +/** + * 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_oper(u)) { + notice_lang(s_NickServ, u, PERMISSION_DENIED); + } else if (!(na = findnick(nick))) { + notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, nick); + } else if (na->status & NS_VERBOTEN) { + notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, na->nick); + } else { + char buf[BUFSIZE]; + MailInfo *mail; + + snprintf(buf, sizeof(buf), getstring(na, NICK_SENDPASS_SUBJECT), + na->nick); + mail = MailBegin(u, na->nc, buf, s_NickServ); + if (!mail) + return MOD_CONT; + + fprintf(mail->pipe, getstring(na, NICK_SENDPASS_HEAD)); + fprintf(mail->pipe, "\n\n"); + fprintf(mail->pipe, getstring(na, NICK_SENDPASS_LINE_1), na->nick); + fprintf(mail->pipe, "\n\n"); + fprintf(mail->pipe, getstring(na, NICK_SENDPASS_LINE_2), + na->nc->pass); + fprintf(mail->pipe, "\n\n"); + fprintf(mail->pipe, getstring(na, NICK_SENDPASS_LINE_3)); + fprintf(mail->pipe, "\n\n"); + fprintf(mail->pipe, getstring(na, NICK_SENDPASS_LINE_4)); + fprintf(mail->pipe, "\n\n"); + fprintf(mail->pipe, getstring(na, NICK_SENDPASS_LINE_5), + NetworkName); + fprintf(mail->pipe, "\n.\n"); + + MailEnd(mail); + + alog("%s: %s!%s@%s used SENDPASS on %s", s_NickServ, u->nick, + u->username, u->host, nick); + notice_lang(s_NickServ, u, NICK_SENDPASS_OK, nick); + } + + return MOD_CONT; +} diff --git a/src/core/ns_set.c b/src/core/ns_set.c new file mode 100644 index 000000000..091a7fe42 --- /dev/null +++ b/src/core/ns_set.c @@ -0,0 +1,519 @@ +/* NickServ core functions + * + * (C) 2003-2005 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_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_noexpire(User * u, NickAlias * 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, + NICK_SERVADMIN_HELP_SET, NICK_SERVADMIN_HELP_SET); + 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 NOEXPIRE", NULL, NULL, -1, -1, -1, + NICK_SERVADMIN_HELP_SET_NOEXPIRE, + NICK_SERVADMIN_HELP_SET_NOEXPIRE); + 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; + int is_servadmin = is_services_admin(u); + int set_nick = 0; + + if (readonly) { + notice_lang(s_NickServ, u, NICK_SET_DISABLED); + return MOD_CONT; + } + + if (is_servadmin && cmd && (na = findnick(cmd))) { + cmd = param; + param = strtok(NULL, " "); + set_nick = 1; + } else { + na = u->na; + } + + if (!param + && (!cmd + || (stricmp(cmd, "URL") != 0 && stricmp(cmd, "EMAIL") != 0 + && stricmp(cmd, "GREET") != 0 + && stricmp(cmd, "ICQ") != 0))) { + if (is_servadmin) { + syntax_error(s_NickServ, u, "SET", NICK_SET_SERVADMIN_SYNTAX); + } else { + syntax_error(s_NickServ, u, "SET", NICK_SET_SYNTAX); + } + } else if (!na) { + notice_lang(s_NickServ, u, NICK_NOT_REGISTERED); + } else if (na->status & NS_VERBOTEN) { + notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, na->nick); + } else if (na->nc->flags & NI_SUSPENDED) { + notice_lang(s_NickServ, u, NICK_X_SUSPENDED, na->nick); + } else if (!is_servadmin && !nick_identified(u)) { + notice_lang(s_NickServ, u, NICK_IDENTIFY_REQUIRED, s_NickServ); + } else if (stricmp(cmd, "DISPLAY") == 0) { + do_set_display(u, na->nc, param); + } else if (stricmp(cmd, "PASSWORD") == 0) { + do_set_password(u, na->nc, param); + } else if (stricmp(cmd, "LANGUAGE") == 0) { + do_set_language(u, na->nc, param); + } else if (stricmp(cmd, "URL") == 0) { + do_set_url(u, na->nc, param); + } else if (stricmp(cmd, "EMAIL") == 0) { + do_set_email(u, na->nc, param); + } else if (stricmp(cmd, "ICQ") == 0) { + do_set_icq(u, na->nc, param); + } else if (stricmp(cmd, "GREET") == 0) { + do_set_greet(u, na->nc, param); + } else if (stricmp(cmd, "KILL") == 0) { + do_set_kill(u, na->nc, param); + } else if (stricmp(cmd, "SECURE") == 0) { + do_set_secure(u, na->nc, param); + } else if (stricmp(cmd, "PRIVATE") == 0) { + do_set_private(u, na->nc, param); + } else if (stricmp(cmd, "MSG") == 0) { + do_set_msg(u, na->nc, param); + } else if (stricmp(cmd, "HIDE") == 0) { + do_set_hide(u, na->nc, param); + } else if (stricmp(cmd, "NOEXPIRE") == 0) { + do_set_noexpire(u, na, param); + } else { + if (is_servadmin) + notice_lang(s_NickServ, u, NICK_SET_UNKNOWN_OPTION_OR_BAD_NICK, + cmd); + else + notice_lang(s_NickServ, u, NICK_SET_UNKNOWN_OPTION, cmd); + } + return MOD_CONT; +} + +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); + + if (NSSecureAdmins && u->na->nc != nc && nick_is_services_admin(nc) + && !is_services_root(u)) { + notice_lang(s_NickServ, u, PERMISSION_DENIED); + return MOD_CONT; + } else if (stricmp(nc->display, param) == 0 + || (StrictPasswords && len < 5)) { + notice_lang(s_NickServ, u, MORE_OBSCURE_PASSWORD); + return MOD_CONT; + } + + if (nc->pass) + free(nc->pass); + +#ifdef USE_ENCRYPTION + nc->pass = smalloc(PASSMAX); + + if (encrypt(param, len, nc->pass, PASSMAX) < 0) { + memset(param, 0, len); + alog("%s: Failed to encrypt password for %s (set)", s_NickServ, + nc->display); + notice_lang(s_NickServ, u, NICK_SET_PASSWORD_FAILED); + return MOD_CONT; + } + + memset(param, 0, len); + notice_lang(s_NickServ, u, NICK_SET_PASSWORD_CHANGED); +#else + nc->pass = sstrdup(param); + notice_lang(s_NickServ, u, NICK_SET_PASSWORD_CHANGED_TO, nc->pass); +#endif + + if (u->na && u->na->nc != nc && is_services_admin(u)) { + alog("%s: %s!%s@%s used SET PASSWORD as Services admin on %s (e-mail: %s)", s_NickServ, u->nick, u->username, u->host, nc->display, (nc->email ? nc->email : "none")); + if (WallSetpass) + anope_cmd_global(s_NickServ, + "\2%s\2 used SET PASSWORD as Services admin on \2%s\2", + u->nick, nc->display); + } else { + alog("%s: %s!%s@%s (e-mail: %s) changed its password.", s_NickServ, + u->nick, u->username, 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 (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; + } + + if (u->na && u->na->nc != nc && is_services_admin(u)) { + alog("%s: %s!%s@%s used SET EMAIL as Services admin on %s (e-mail: %s)", s_NickServ, u->nick, u->username, u->host, nc->display, (nc->email ? nc->email : "none")); + } else { + 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_noexpire(User * u, NickAlias * na, char *param) +{ + if (!is_services_admin(u)) { + notice_lang(s_NickServ, u, PERMISSION_DENIED); + return MOD_CONT; + } + if (!param) { + syntax_error(s_NickServ, u, "SET NOEXPIRE", + NICK_SET_NOEXPIRE_SYNTAX); + return MOD_CONT; + } + if (stricmp(param, "ON") == 0) { + na->status |= NS_NO_EXPIRE; + notice_lang(s_NickServ, u, NICK_SET_NOEXPIRE_ON, na->nick); + } else if (stricmp(param, "OFF") == 0) { + na->status &= ~NS_NO_EXPIRE; + notice_lang(s_NickServ, u, NICK_SET_NOEXPIRE_OFF, na->nick); + } else { + syntax_error(s_NickServ, u, "SET NOEXPIRE", + NICK_SET_NOEXPIRE_SYNTAX); + } + return MOD_CONT; +} diff --git a/src/core/ns_status.c b/src/core/ns_status.c new file mode 100644 index 000000000..865329204 --- /dev/null +++ b/src/core/ns_status.c @@ -0,0 +1,94 @@ +/* NickServ core functions + * + * (C) 2003-2005 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..ba48c2175 --- /dev/null +++ b/src/core/ns_suspend.c @@ -0,0 +1,193 @@ +/* NickServ core functions + * + * (C) 2003-2005 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_admin, -1, -1, -1, + NICK_SERVADMIN_HELP_SUSPEND, + NICK_SERVADMIN_HELP_SUSPEND); + moduleAddCommand(NICKSERV, c, MOD_UNIQUE); + c = createCommand("UNSUSPEND", do_unsuspend, is_services_admin, -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_admin(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..0ec8b176a --- /dev/null +++ b/src/core/ns_update.c @@ -0,0 +1,90 @@ +/* NickServ core functions + * + * (C) 2003-2005 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..56df4b195 --- /dev/null +++ b/src/core/os_admin.c @@ -0,0 +1,250 @@ +/* OperServ core functions + * + * (C) 2003-2005 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, is_oper, OPER_HELP_ADMIN, -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_oper(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..97a974e7f --- /dev/null +++ b/src/core/os_akill.c @@ -0,0 +1,378 @@ +/* OperServ core functions + * + * (C) 2003-2005 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) + 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); + + } 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..c391390e0 --- /dev/null +++ b/src/core/os_chankill.c @@ -0,0 +1,130 @@ +/* OperServ core functions + * + * (C) 2003-2005 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; + } + 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); + } + } 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..6a25c3bc9 --- /dev/null +++ b/src/core/os_chanlist.c @@ -0,0 +1,116 @@ +/* OperServ core functions + * + * (C) 2003-2005 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); +extern MDE int anope_get_private_mode(); + +/** + * 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_admin, + 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) +{ + if (is_services_admin(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..9ec37a421 --- /dev/null +++ b/src/core/os_clearmodes.c @@ -0,0 +1,356 @@ +/* OperServ core functions + * + * (C) 2003-2005 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; + int i; + char *argv[2]; + char *chan = strtok(NULL, " "); + Channel *c; + int all = 0; + int count; /* For saving ban info */ + char **bans; /* For saving ban info */ + int exceptcount; /* For saving except info */ + char **excepts; /* For saving except info */ + int invitecount; /* For saving invite info */ + char **invites; /* For saving invite info */ + struct c_userlist *cu, *next; + + 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] = sstrdup(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] = sstrdup(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] = sstrdup(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] = sstrdup(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 */ + count = c->bancount; + bans = scalloc(sizeof(char *) * count, 1); + + for (i = 0; i < count; i++) + bans[i] = sstrdup(c->bans[i]); + + for (i = 0; i < count; i++) { + argv[0] = sstrdup("-b"); + argv[1] = bans[i]; + anope_cmd_mode(s_OperServ, c->name, "-b %s", argv[1]); + chan_set_modes(s_OperServ, c, 2, argv, 0); + free(argv[1]); + free(argv[0]); + } + + free(bans); + + excepts = NULL; + + if (ircd->except) { + /* Clear excepts */ + exceptcount = c->exceptcount; + excepts = scalloc(sizeof(char *) * exceptcount, 1); + + for (i = 0; i < exceptcount; i++) + excepts[i] = sstrdup(c->excepts[i]); + + for (i = 0; i < exceptcount; i++) { + argv[0] = sstrdup("-e"); + argv[1] = excepts[i]; + anope_cmd_mode(s_OperServ, c->name, "-e %s", argv[1]); + chan_set_modes(s_OperServ, c, 2, argv, 0); + free(argv[1]); + free(argv[0]); + } + if (excepts) { + free(excepts); + } + } + + if (ircd->invitemode) { + /* Clear invites */ + invitecount = c->invitecount; + invites = scalloc(sizeof(char *) * invitecount, 1); + + for (i = 0; i < invitecount; i++) + invites[i] = sstrdup(c->invite[i]); + + for (i = 0; i < invitecount; i++) { + argv[0] = sstrdup("-I"); + argv[1] = excepts[i]; + anope_cmd_mode(s_OperServ, c->name, "-I %s", argv[1]); + chan_set_modes(s_OperServ, c, 2, argv, 0); + free(argv[1]); + free(argv[0]); + } + + free(invites); + } + + } + + 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..3517f32d3 --- /dev/null +++ b/src/core/os_defcon.c @@ -0,0 +1,167 @@ +/* OperServ core functions + * + * (C) 2003-2005 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" + +extern MDE time_t DefContimer; +extern MDE void runDefCon(void); +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..37ddcca78 --- /dev/null +++ b/src/core/os_global.c @@ -0,0 +1,81 @@ +/* OperServ core functions + * + * (C) 2003-2005 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_oper, + OPER_HELP_GLOBAL, -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_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..481e3e424 --- /dev/null +++ b/src/core/os_help.c @@ -0,0 +1,66 @@ +/* OperServ core functions + * + * (C) 2003-2005 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, is_oper, -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..a4d73d649 --- /dev/null +++ b/src/core/os_ignore.c @@ -0,0 +1,200 @@ +/* OperServ core functions + * + * (C) 2003-2005 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); +int do_clearignore(User * u); +void delete_ignore(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("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) { + t = 157248000; /* if 0 is given, we set time to 157248000 seconds == 5 years (let's hope the next restart will be before that time ;-)) */ + add_ignore(nick, t); + notice_lang(s_OperServ, u, OPER_IGNORE_PERM_DONE, nick); + } else { + add_ignore(nick, t); + notice_lang(s_OperServ, u, OPER_IGNORE_TIME_DONE, nick, + time); + } + } + } else if (!stricmp(cmd, "LIST")) { + do_ignorelist(u); + } + + else if (!stricmp(cmd, "DEL")) { + char *nick = strtok(NULL, " "); + if (!nick) { + notice_lang(s_OperServ, u, OPER_IGNORE_SYNTAX); + } else { + if (get_ignore(nick) == 0) { + notice_lang(s_OperServ, u, OPER_IGNORE_LIST_NOMATCH, nick); + return MOD_CONT; + } else { + delete_ignore(nick); + notice_lang(s_OperServ, u, OPER_IGNORE_DEL_DONE, nick); + } + } + } else if (!stricmp(cmd, "CLEAR")) { + do_clearignore(u); + + } else + notice_lang(s_OperServ, u, OPER_IGNORE_SYNTAX); + return MOD_CONT; +} + +/* shows the Services ignore list */ + +int do_ignorelist(User * u) +{ + int sent_header = 0; + IgnoreData *id; + int i; + + for (i = 0; i < 256; i++) { + for (id = ignore[i]; id; id = id->next) { + if (!sent_header) { + notice_lang(s_OperServ, u, OPER_IGNORE_LIST); + sent_header = 1; + } + notice_user(s_OperServ, u, "%s", id->who); + } + } + if (!sent_header) + notice_lang(s_OperServ, u, OPER_IGNORE_LIST_EMPTY); + return MOD_CONT; +} + +/* deletes a nick from the ignore list */ + +void delete_ignore(const char *nick) +{ + IgnoreData *ign, *prev; + IgnoreData **whichlist; + + if (!nick || !*nick) { + return; + } + + whichlist = &ignore[tolower(nick[0])]; + + for (ign = *whichlist, prev = NULL; ign; prev = ign, ign = ign->next) { + if (stricmp(ign->who, nick) == 0) + break; + } + if (prev) + prev->next = ign->next; + else + *whichlist = ign->next; + free(ign); + ign = NULL; +} + +/**************************************************************************/ +/* Cleares the Services ignore list */ + +int do_clearignore(User * u) +{ + IgnoreData *id = NULL, *next = NULL; + int i; + for (i = 0; i < 256; i++) { + for (id = ignore[i]; id; id = next) { + next = id->next; + free(id); + if (!next) { + ignore[i] = NULL; + } + } + } + notice_lang(s_OperServ, u, OPER_IGNORE_LIST_CLEARED); + return MOD_CONT; +} diff --git a/src/core/os_jupe.c b/src/core/os_jupe.c new file mode 100644 index 000000000..faaa55122 --- /dev/null +++ b/src/core/os_jupe.c @@ -0,0 +1,88 @@ +/* OperServ core functions + * + * (C) 2003-2005 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..fa0edc440 --- /dev/null +++ b/src/core/os_kick.c @@ -0,0 +1,100 @@ +/* OperServ core functions + * + * (C) 2003-2005 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_killclones.c b/src/core/os_killclones.c new file mode 100644 index 000000000..8f1ac3cbc --- /dev/null +++ b/src/core/os_killclones.c @@ -0,0 +1,129 @@ +/* OperServ core functions + * + * (C) 2003-2005 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_killclones(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("KILLCLONES", do_killclones, is_services_oper, + OPER_HELP_KILLCLONES, -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_KILLCLONES); + } +} + +/** Kill all users matching a certain host. The host is obtained from the + * supplied nick. The raw hostmsk is not supplied with the command in an effort + * to prevent abuse and mistakes from being made - which might cause *.com to + * be killed. It also makes it very quick and simple to use - which is usually + * what you want when someone starts loading numerous clones. In addition to + * killing the clones, we add a temporary AKILL to prevent them from + * immediately reconnecting. + * Syntax: KILLCLONES nick + * -TheShadow (29 Mar 1999) + * @param u The user who issued the command + * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing. + **/ +int do_killclones(User * u) +{ + char *clonenick = strtok(NULL, " "); + int count = 0; + User *cloneuser, *user, *tempuser; + char *clonemask, *akillmask; + char killreason[NICKMAX + 32]; + char akillreason[] = "Temporary KILLCLONES akill."; + + if (!clonenick) { + notice_lang(s_OperServ, u, OPER_KILLCLONES_SYNTAX); + + } else if (!(cloneuser = finduser(clonenick))) { + notice_lang(s_OperServ, u, OPER_KILLCLONES_UNKNOWN_NICK, + clonenick); + + } else { + clonemask = smalloc(strlen(cloneuser->host) + 5); + sprintf(clonemask, "*!*@%s", cloneuser->host); + + akillmask = smalloc(strlen(cloneuser->host) + 3); + sprintf(akillmask, "*@%s", cloneuser->host); + + user = firstuser(); + while (user) { + if (match_usermask(clonemask, user) != 0) { + tempuser = nextuser(); + count++; + snprintf(killreason, sizeof(killreason), + "Cloning [%d]", count); + kill_user(NULL, user->nick, killreason); + user = tempuser; + } else { + user = nextuser(); + } + } + + add_akill(u, akillmask, u->nick, + time(NULL) + KillClonesAkillExpire, akillreason); + + anope_cmd_global(s_OperServ, + "\2%s\2 used KILLCLONES for \2%s\2 killing " + "\2%d\2 clones. A temporary AKILL has been added " + "for \2%s\2.", u->nick, clonemask, count, + akillmask); + + alog("%s: KILLCLONES: %d clone(s) matching %s killed.", + s_OperServ, count, clonemask); + + free(akillmask); + free(clonemask); + } + return MOD_CONT; +} diff --git a/src/core/os_logonnews.c b/src/core/os_logonnews.c new file mode 100644 index 000000000..31d482574 --- /dev/null +++ b/src/core/os_logonnews.c @@ -0,0 +1,65 @@ +/* OperServ core functions + * + * (C) 2003-2005 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_logonnews is actaully defined in news.c + * we can look at moving it here later + **/ + c = createCommand("LOGONNEWS", do_logonnews, is_services_oper, + NEWS_HELP_LOGON, -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_LOGONNEWS); + } +} diff --git a/src/core/os_mode.c b/src/core/os_mode.c new file mode 100644 index 000000000..b926d16a4 --- /dev/null +++ b/src/core/os_mode.c @@ -0,0 +1,101 @@ +/* OperServ core functions + * + * (C) 2003-2005 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); + + 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..c8bba7f92 --- /dev/null +++ b/src/core/os_modinfo.c @@ -0,0 +1,149 @@ +/* OperServ core functions + * + * (C) 2003-2005 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); +extern MDE Module *findModule(char *name); + +extern MDE Module *mod_current_module; +extern MDE int mod_current_op; +extern MDE User *mod_current_user; +extern MDE ModuleHash *MODULE_HASH[MAX_CMD_HASH]; + +/** + * 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, is_oper, -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) +{ + if (is_oper(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; + int display = 0; + + file = strtok(NULL, ""); + if (!file) { + syntax_error(s_OperServ, u, "MODINFO", OPER_MODULE_INFO_SYNTAX); + return MOD_CONT; + } + m = findModule(file); + if (m) { + tm = *localtime(&m->time); + strftime_lang(timebuf, sizeof(timebuf), u, + STRFTIME_DATE_TIME_FORMAT, &tm); + notice_lang(s_OperServ, u, OPER_MODULE_INFO_LIST, m->name, + m->version ? m->version : "?", + m->author ? m->author : "?", timebuf); + for (idx = 0; idx < MAX_CMD_HASH; idx++) { + display += showModuleCmdLoaded(HOSTSERV[idx], m->name, u); + display += showModuleCmdLoaded(OPERSERV[idx], m->name, u); + display += showModuleCmdLoaded(NICKSERV[idx], m->name, u); + display += showModuleCmdLoaded(CHANSERV[idx], m->name, u); + display += showModuleCmdLoaded(BOTSERV[idx], m->name, u); + display += showModuleCmdLoaded(MEMOSERV[idx], m->name, u); + display += showModuleCmdLoaded(HELPSERV[idx], m->name, u); + display += showModuleMsgLoaded(IRCD[idx], m->name, u); + + } + } + if (display == 0) { + notice_lang(s_OperServ, u, OPER_MODULE_NO_INFO, file); + } + return MOD_CONT; +} + +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..2a56983ea --- /dev/null +++ b/src/core/os_modlist.c @@ -0,0 +1,182 @@ +/* OperServ core functions + * + * (C) 2003-2005 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" + +extern MDE Module *mod_current_module; +extern MDE int mod_current_op; +extern MDE User *mod_current_user; +extern MDE ModuleHash *MODULE_HASH[MAX_CMD_HASH]; + +extern MDE Module *createModule(char *filename); + +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, is_oper, -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) +{ + if (is_oper(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 showSupported = 1; + int showQA = 1; + + char *param; + ModuleHash *current = NULL; + + char core[] = "Core"; + char third[] = "3rd"; + char proto[] = "Protocol"; + char supported[] = "Supported"; + char qa[] = "QATested"; + + param = strtok(NULL, ""); + if (param) { + if (stricmp(param, core) == 0) { + showCore = 1; + showThird = 0; + showProto = 0; + showSupported = 0; + showQA = 0; + } else if (stricmp(param, third) == 0) { + showCore = 0; + showThird = 1; + showSupported = 0; + showQA = 0; + showProto = 0; + } else if (stricmp(param, proto) == 0) { + showCore = 0; + showThird = 0; + showProto = 1; + showSupported = 0; + showQA = 0; + } else if (stricmp(param, supported) == 0) { + showCore = 0; + showThird = 0; + showProto = 0; + showSupported = 1; + showQA = 0; + } else if (stricmp(param, qa) == 0) { + showCore = 0; + showThird = 0; + showProto = 0; + showSupported = 0; + showQA = 1; + } + } + + 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; + } + + } + } + 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..732d629f4 --- /dev/null +++ b/src/core/os_modload.c @@ -0,0 +1,96 @@ +/* OperServ core functions + * + * (C) 2003-2005 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" + +extern MDE Module *mod_current_module; +extern MDE int mod_current_op; +extern MDE User *mod_current_user; +extern MDE ModuleHash *MODULE_HASH[MAX_CMD_HASH]; + +extern MDE Module *createModule(char *filename); + +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; + Module *m; + + name = strtok(NULL, ""); + if (!name) { + syntax_error(s_OperServ, u, "MODLOAD", OPER_MODULE_LOAD_SYNTAX); + return MOD_CONT; + } + m = findModule(name); + if (!m) { + m = createModule(name); + mod_current_module = m; + mod_current_user = u; + mod_current_op = 1; + } else { + notice_lang(s_OperServ, u, OPER_MODULE_LOAD_FAIL, name); + } + return MOD_CONT; +} diff --git a/src/core/os_modunload.c b/src/core/os_modunload.c new file mode 100644 index 000000000..315c7a7c4 --- /dev/null +++ b/src/core/os_modunload.c @@ -0,0 +1,95 @@ +/* OperServ core functions + * + * (C) 2003-2005 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" + +extern MDE Module *mod_current_module; +extern MDE int mod_current_op; +extern MDE User *mod_current_user; +extern MDE ModuleHash *MODULE_HASH[MAX_CMD_HASH]; + +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; + Module *m; + + name = strtok(NULL, ""); + if (!name) { + syntax_error(s_OperServ, u, "MODUNLOAD", + OPER_MODULE_UNLOAD_SYNTAX); + return MOD_CONT; + } + m = findModule(name); + if (m) { + mod_current_user = u; + mod_current_module = m; + mod_current_op = 2; + } else { + notice_lang(s_OperServ, u, OPER_MODULE_REMOVE_FAIL, name); + } + return MOD_CONT; +} diff --git a/src/core/os_noop.c b/src/core/os_noop.c new file mode 100644 index 000000000..774433a34 --- /dev/null +++ b/src/core/os_noop.c @@ -0,0 +1,106 @@ +/* OperServ core functions + * + * (C) 2003-2005 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..39ae5ae49 --- /dev/null +++ b/src/core/os_oline.c @@ -0,0 +1,111 @@ +/* OperServ core functions + * + * (C) 2003-2005 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_admin, + 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 { + u2 = finduser(nick); + +/* let's check whether the user is online */ + + if (!finduser(nick)) { + notice_lang(s_OperServ, u, NICK_X_NOT_IN_USE, nick); + } else if (u2 && flags[0] == '+') { + 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..4df712036 --- /dev/null +++ b/src/core/os_oper.c @@ -0,0 +1,244 @@ +/* OperServ core functions + * + * (C) 2003-2005 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, is_oper, OPER_HELP_OPER, -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_oper(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_admin(u)) { + notice_lang(s_OperServ, u, PERMISSION_DENIED); + return MOD_CONT; + } + + if (!(na = findnick(nick))) { + notice_lang(s_OperServ, u, NICK_X_NOT_REGISTERED, nick); + return MOD_CONT; + } + + if (na->status & NS_VERBOTEN) { + notice_lang(s_OperServ, u, NICK_X_FORBIDDEN, nick); + return MOD_CONT; + } + + if (na->nc->flags & NI_SERVICES_OPER + || slist_indexof(&servopers, na->nc) != -1) { + notice_lang(s_OperServ, u, OPER_OPER_EXISTS, nick); + return MOD_CONT; + } + + res = slist_add(&servopers, na->nc); + if (res == -2) { + notice_lang(s_OperServ, u, OPER_OPER_REACHED_LIMIT, nick); + return MOD_CONT; + } else { + if (na->nc->flags & NI_SERVICES_ADMIN + && (res = slist_indexof(&servadmins, na->nc)) != -1) { + 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_admin(u)) { + notice_lang(s_OperServ, u, PERMISSION_DENIED); + return MOD_CONT; + } + + if (isdigit(*nick) && strspn(nick, "1234567890,-") == strlen(nick)) { + /* Deleting a range */ + res = slist_delete_range(&servopers, nick, NULL); + if (res == 0) { + notice_lang(s_OperServ, u, OPER_OPER_NO_MATCH); + return MOD_CONT; + } else if (res == 1) { + notice_lang(s_OperServ, u, OPER_OPER_DELETED_ONE); + } else { + notice_lang(s_OperServ, u, OPER_OPER_DELETED_SEVERAL, res); + } + } else { + if (!(na = findnick(nick))) { + notice_lang(s_OperServ, u, NICK_X_NOT_REGISTERED, nick); + return MOD_CONT; + } + + if (na->status & NS_VERBOTEN) { + notice_lang(s_OperServ, u, NICK_X_FORBIDDEN, nick); + return MOD_CONT; + } + + if (!(na->nc->flags & NI_SERVICES_OPER) + || (res = slist_indexof(&servopers, na->nc)) == -1) { + notice_lang(s_OperServ, u, OPER_OPER_NOT_FOUND, nick); + return MOD_CONT; + } + + slist_delete(&servopers, res); + notice_lang(s_OperServ, u, OPER_OPER_DELETED, nick); + } + + if (readonly) + notice_lang(s_OperServ, u, READ_ONLY_MODE); + } else if (!stricmp(cmd, "LIST")) { + int sent_header = 0; + + if (servopers.count == 0) { + notice_lang(s_OperServ, u, OPER_OPER_LIST_EMPTY); + return MOD_CONT; + } + + if (!nick || (isdigit(*nick) + && strspn(nick, "1234567890,-") == strlen(nick))) { + res = + slist_enum(&servopers, nick, &oper_list_callback, u, + &sent_header); + if (res == 0) { + notice_lang(s_OperServ, u, OPER_OPER_NO_MATCH); + return MOD_CONT; + } else { + notice_lang(s_OperServ, u, END_OF_ANY_LIST, "Oper"); + } + } else { + int i; + + for (i = 0; i < servopers.count; i++) + if (!stricmp + (nick, ((NickCore *) servopers.list[i])->display) + || match_wild_nocase(nick, + ((NickCore *) servopers.list[i])-> + display)) + oper_list(i + 1, servopers.list[i], u, &sent_header); + + if (!sent_header) + notice_lang(s_OperServ, u, OPER_OPER_NO_MATCH); + else { + notice_lang(s_OperServ, u, END_OF_ANY_LIST, "Oper"); + } + } + } else if (!stricmp(cmd, "CLEAR")) { + if (!is_services_admin(u)) { + notice_lang(s_OperServ, u, PERMISSION_DENIED); + return MOD_CONT; + } + + if (servopers.count == 0) { + notice_lang(s_OperServ, u, OPER_OPER_LIST_EMPTY); + return MOD_CONT; + } + + slist_clear(&servopers, 1); + notice_lang(s_OperServ, u, OPER_OPER_CLEAR); + } else { + syntax_error(s_OperServ, u, "OPER", OPER_OPER_SYNTAX); + } + return MOD_CONT; +} + +/* 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..706357893 --- /dev/null +++ b/src/core/os_opernews.c @@ -0,0 +1,65 @@ +/* OperServ core functions + * + * (C) 2003-2005 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_opernews is actaully defined in news.c + * we can look at moving it here later + **/ + c = createCommand("OPERNEWS", do_opernews, is_services_oper, + NEWS_HELP_LOGON, -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_OPERNEWS); + } +} diff --git a/src/core/os_quit.c b/src/core/os_quit.c new file mode 100644 index 000000000..6b7fe8f79 --- /dev/null +++ b/src/core/os_quit.c @@ -0,0 +1,82 @@ +/* OperServ core functions + * + * (C) 2003-2005 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_admin, + 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_admin(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..cf5ab6b3a --- /dev/null +++ b/src/core/os_randomnews.c @@ -0,0 +1,65 @@ +/* OperServ core functions + * + * (C) 2003-2005 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_oper, + NEWS_HELP_OPER, -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_RANDOMNEWS); + } +} diff --git a/src/core/os_raw.c b/src/core/os_raw.c new file mode 100644 index 000000000..64e85dadd --- /dev/null +++ b/src/core/os_raw.c @@ -0,0 +1,77 @@ +/* OperServ core functions + * + * (C) 2003-2005 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(CORE); + + c = createCommand("RAW", do_raw, is_services_admin, OPER_HELP_RAW, -1, + -1, -1, -1); + moduleAddCommand(OPERSERV, c, MOD_UNIQUE); + + if (DisableRaw) { + 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..2ea882b6c --- /dev/null +++ b/src/core/os_reload.c @@ -0,0 +1,84 @@ +/* OperServ core functions + * + * (C) 2003-2005 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_admin, + 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_admin(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..eb4bd7e2c --- /dev/null +++ b/src/core/os_restart.c @@ -0,0 +1,89 @@ +/* OperServ core functions + * + * (C) 2003-2005 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" + +/* OperServ restart needs access to this if were gonna avoid sending ourself a signal */ +extern MDE void do_restart_services(void); + +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_admin, + 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_admin(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..6be2dfb26 --- /dev/null +++ b/src/core/os_session.c @@ -0,0 +1,68 @@ +/* OperServ core functions + * + * (C) 2003-2005 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_admin, + OPER_HELP_SESSION, -1, -1, -1, -1); + moduleAddCommand(OPERSERV, c, MOD_UNIQUE); + c = createCommand("EXCEPTION", do_exception, is_services_admin, + 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_admin(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..616d65a57 --- /dev/null +++ b/src/core/os_set.c @@ -0,0 +1,262 @@ +/* OperServ core functions + * + * (C) 2003-2005 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_admin, 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_admin(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; + + 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) { + anope_cmd_join(s_GlobalNoticer, LogChannel, 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..aa1520e24 --- /dev/null +++ b/src/core/os_sgline.c @@ -0,0 +1,355 @@ +/* OperServ core functions + * + * (C) 2003-2005 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, ""))) { + /* 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..74e61436c --- /dev/null +++ b/src/core/os_shutdown.c @@ -0,0 +1,83 @@ +/* OperServ core functions + * + * (C) 2003-2005 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_admin, + 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_admin(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..9e9bc63d7 --- /dev/null +++ b/src/core/os_sqline.c @@ -0,0 +1,355 @@ +/* OperServ core functions + * + * (C) 2003-2005 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..67d07a94e --- /dev/null +++ b/src/core/os_staff.c @@ -0,0 +1,158 @@ +/* OperServ core functions + * + * (C) 2003-2005 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, is_oper, 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) +{ + if (is_oper(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..f621c56d1 --- /dev/null +++ b/src/core/os_stats.c @@ -0,0 +1,400 @@ +/* OperServ core functions + * + * (C) 2003-2005 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); + +extern MDE struct clone clonelist[CLONE_DETECT_SIZE]; +extern MDE struct clone warnings[CLONE_DETECT_SIZE]; + +/** + * 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, is_services_oper, OPER_HELP_STATS, + -1, -1, -1, -1); + moduleAddCommand(OPERSERV, c, MOD_UNIQUE); + c = createCommand("UPTIME", do_stats, is_services_oper, + 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) +{ + if (is_services_oper(u)) { + notice_lang(s_OperServ, u, OPER_HELP_CMD_STATS); + } +} + +/** + * 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]; + + 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 { + notice_lang(s_OperServ, u, OPER_STATS_UNKNOWN_OPTION, extra); + } + } + + notice_lang(s_OperServ, u, OPER_STATS_CURRENT_USERS, usercnt, opcnt); + tm = localtime(&maxusertime); + strftime_lang(timebuf, sizeof(timebuf), u, STRFTIME_DATE_TIME_FORMAT, + tm); + notice_lang(s_OperServ, u, OPER_STATS_MAX_USERS, maxusercnt, timebuf); + if (days > 1) { + notice_lang(s_OperServ, u, OPER_STATS_UPTIME_DHMS, + days, hours, mins, secs); + } else if (days == 1) { + notice_lang(s_OperServ, u, OPER_STATS_UPTIME_1DHMS, + days, hours, mins, secs); + } else { + if (hours > 1) { + if (mins != 1) { + if (secs != 1) { + notice_lang(s_OperServ, u, OPER_STATS_UPTIME_HMS, + hours, mins, secs); + } else { + notice_lang(s_OperServ, u, OPER_STATS_UPTIME_HM1S, + hours, mins, secs); + } + } else { + if (secs != 1) { + notice_lang(s_OperServ, u, OPER_STATS_UPTIME_H1MS, + hours, mins, secs); + } else { + notice_lang(s_OperServ, u, OPER_STATS_UPTIME_H1M1S, + hours, mins, secs); + } + } + } else if (hours == 1) { + if (mins != 1) { + if (secs != 1) { + notice_lang(s_OperServ, u, OPER_STATS_UPTIME_1HMS, + hours, mins, secs); + } else { + notice_lang(s_OperServ, u, OPER_STATS_UPTIME_1HM1S, + hours, mins, secs); + } + } else { + if (secs != 1) { + notice_lang(s_OperServ, u, OPER_STATS_UPTIME_1H1MS, + hours, mins, secs); + } else { + notice_lang(s_OperServ, u, OPER_STATS_UPTIME_1H1M1S, + hours, mins, secs); + } + } + } else { + if (mins != 1) { + if (secs != 1) { + notice_lang(s_OperServ, u, OPER_STATS_UPTIME_MS, + mins, secs); + } else { + notice_lang(s_OperServ, u, OPER_STATS_UPTIME_M1S, + mins, secs); + } + } else { + if (secs != 1) { + notice_lang(s_OperServ, u, OPER_STATS_UPTIME_1MS, + mins, secs); + } else { + notice_lang(s_OperServ, u, OPER_STATS_UPTIME_1M1S, + mins, secs); + } + } + } + } + + if (extra && stricmp(extra, "ALL") == 0 && is_services_admin(u)) { + long count, mem; + + notice_lang(s_OperServ, u, OPER_STATS_BYTES_READ, + total_read / 1024); + notice_lang(s_OperServ, u, OPER_STATS_BYTES_WRITTEN, + total_written / 1024); + + get_user_stats(&count, &mem); + notice_lang(s_OperServ, u, OPER_STATS_USER_MEM, count, + (mem + 512) / 1024); + get_channel_stats(&count, &mem); + notice_lang(s_OperServ, u, OPER_STATS_CHANNEL_MEM, count, + (mem + 512) / 1024); + get_core_stats(&count, &mem); + notice_lang(s_OperServ, u, OPER_STATS_GROUPS_MEM, count, + (mem + 512) / 1024); + get_aliases_stats(&count, &mem); + notice_lang(s_OperServ, u, OPER_STATS_ALIASES_MEM, count, + (mem + 512) / 1024); + get_chanserv_stats(&count, &mem); + notice_lang(s_OperServ, u, OPER_STATS_CHANSERV_MEM, count, + (mem + 512) / 1024); + get_botserv_stats(&count, &mem); + notice_lang(s_OperServ, u, OPER_STATS_BOTSERV_MEM, count, + (mem + 512) / 1024); + get_operserv_stats(&count, &mem); + notice_lang(s_OperServ, u, OPER_STATS_OPERSERV_MEM, count, + (mem + 512) / 1024); + get_session_stats(&count, &mem); + notice_lang(s_OperServ, u, OPER_STATS_SESSIONS_MEM, count, + (mem + 512) / 1024); + } + 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; + + if (CheckClones) { + mem = sizeof(struct clone) * CLONE_DETECT_SIZE * 2; + for (i = 0; i < CLONE_DETECT_SIZE; i++) { + if (clonelist[i].host) { + count++; + mem += strlen(clonelist[i].host) + 1; + } + if (warnings[i].host) { + count++; + mem += strlen(warnings[i].host) + 1; + } + } + } + + count += akills.count; + mem += akills.capacity; + 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..9c0af28ca --- /dev/null +++ b/src/core/os_svsnick.c @@ -0,0 +1,126 @@ +/* OperServ core functions + * + * (C) 2003-2005 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_admin, + 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_NickServ, u, NICK_X_TRUNCATED, + newnick, NICKMAX - 2, newnick); + newnick[NICKMAX - 2] = '\0'; + } + + /* Check for valid characters */ + if (*newnick == '-' || isdigit(*newnick)) { + notice_lang(s_OperServ, u, NICK_X_ILLEGAL, newnick); + return MOD_CONT; + } +#define isvalid(c) (((c) >= 'A' && (c) <= '~') || isdigit(c) || (c) == '-') + for (c = newnick; *c && (c - newnick) < NICKMAX; c++) { + if (!isvalid(*c) || isspace(*c)) { + notice_lang(s_OperServ, u, NICK_X_ILLEGAL, nick); + return MOD_CONT; + } + } + + /* Check for a nick in use or a forbidden/suspended nick */ + if (!finduser(nick)) { + notice_lang(s_OperServ, u, NICK_X_NOT_IN_USE, nick); + } else if (finduser(newnick)) { + notice_lang(s_NickServ, u, NICK_X_IN_USE, newnick); + } else if ((na = findnick(newnick)) && (na->status & NS_VERBOTEN)) { + notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, newnick); + } else { + notice_lang(s_OperServ, u, OPER_SVSNICK_NEWNICK, nick, newnick); + 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..379bbbfdc --- /dev/null +++ b/src/core/os_szline.c @@ -0,0 +1,350 @@ +/* OperServ core functions + * + * (C) 2003-2005 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..ecd8006d9 --- /dev/null +++ b/src/core/os_umode.c @@ -0,0 +1,116 @@ +/* OperServ core functions + * + * (C) 2003-2005 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_admin, + 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..2ec18ebde --- /dev/null +++ b/src/core/os_update.c @@ -0,0 +1,74 @@ +/* OperServ core functions + * + * (C) 2003-2005 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_admin, + 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_admin(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..7d7b75bc1 --- /dev/null +++ b/src/core/os_userlist.c @@ -0,0 +1,121 @@ +/* OperServ core functions + * + * (C) 2003-2005 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" + +extern MDE int anope_get_invite_mode(); +extern MDE int anope_get_invis_mode(); + +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, is_services_admin, + 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) +{ + if (is_services_admin(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 index a95ca1686..d8dd30654 100644 --- a/src/datafiles.c +++ b/src/datafiles.c @@ -674,7 +674,7 @@ void backup_databases(void) char ext[9]; - send_event(EVENT_DB_BACKUP, EVENT_START); + send_event(EVENT_DB_BACKUP, 1, EVENT_START); alog("Backing up databases"); remove_backups(); @@ -696,6 +696,6 @@ void backup_databases(void) rename_database(OperDBName, ext); rename_database(NewsDBName, ext); rename_database(ExceptionDBName, ext); - send_event(EVENT_DB_BACKUP, EVENT_STOP); + send_event(EVENT_DB_BACKUP, 1, EVENT_STOP); } } diff --git a/src/encrypt.c b/src/encrypt.c index 2904180ec..31f43ce75 100644 --- a/src/encrypt.c +++ b/src/encrypt.c @@ -95,7 +95,7 @@ static unsigned char PADDING[64] = { #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))) +#define MD5_I(x, y, z) ((y) ^ ((x) | (~z))) /* ROTATE_LEFT rotates x left n bits. */ @@ -120,7 +120,7 @@ Rotation is separate from addition to prevent recomputation. (a) += (b); \ } #define II(a, b, c, d, x, s, ac) { \ - (a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \ + (a) += MD5_I ((b), (c), (d)) + (x) + (UINT4)(ac); \ (a) = ROTATE_LEFT ((a), (s)); \ (a) += (b); \ } diff --git a/src/events.c b/src/events.c index e4735efbf..d0712520e 100644 --- a/src/events.c +++ b/src/events.c @@ -36,18 +36,33 @@ EvtHook *find_eventhook(const char *name) return m; } -void send_event(char *name, const char *fmt, ...) +void send_event(char *name, int argc, ...) { - va_list args; - char buf[16384]; /* Really huge, to try and avoid truncation */ - *buf = '\0'; + va_list va; + char *a; + int idx = 0; + char **argv; - if (fmt) { - va_start(args, fmt); - vsnprintf(buf, BUFSIZE - 1, fmt, args); - va_end(args); + 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); } - event_process_hook(name, buf); + va_end(va); + + if (debug) + alog("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, ...) @@ -133,7 +148,7 @@ void event_message_process(char *eventbuf) free(av); } -void event_process_hook(char *name, char *eventbuf) +void event_process_hook(char *name, int argc, char **argv) { int retVal = 0; EvtHook *current = NULL; @@ -141,23 +156,18 @@ void event_process_hook(char *name, char *eventbuf) if (mod_current_evtbuffer) { free(mod_current_evtbuffer); } - if (eventbuf) { - mod_current_evtbuffer = sstrdup(eventbuf); - } else { - mod_current_evtbuffer = NULL; - } /* Do something with the message. */ evh = find_eventhook(name); if (evh) { if (evh->func) { mod_current_module_name = evh->mod_name; - retVal = evh->func(eventbuf); + 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(eventbuf); + retVal = current->func(argc, argv); mod_current_module_name = NULL; current = current->next; } @@ -286,7 +296,7 @@ EvtMessage *createEventHandler(char *name, * @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) (char *message)) +EvtHook *createEventHook(char *name, int (*func) (int argc, char **argv)) { EvtHook *evh = NULL; if (!func) { @@ -685,7 +695,7 @@ int delEventHook(EvtHookHash * hookEvtTable[], EvtHook * evh, index = CMD_HASH(evh->name); for (current = hookEvtTable[index]; current; current = current->next) { - if (stricmp(evh->name, current->name)) { + if (stricmp(evh->name, current->name) == 0) { if (!lastHash) { tail = current->evh; if (tail->next) { diff --git a/src/helpserv.c b/src/helpserv.c index 7b69996e1..f1e4bff35 100644 --- a/src/helpserv.c +++ b/src/helpserv.c @@ -16,7 +16,6 @@ #include "services.h" #include "pseudo.h" -static int do_help(User * u); void moduleAddHelpServCmds(void); /*************************************************************************/ @@ -27,9 +26,7 @@ void moduleAddHelpServCmds(void); */ void moduleAddHelpServCmds(void) { - Command *c; - c = createCommand("HELP", do_help, NULL, -1, -1, -1, -1, -1); - addCoreCommand(HELPSERV, c); + modules_core_init(HelpServCoreNumber, HelpServCoreModules); } /*************************************************************************/ @@ -70,31 +67,3 @@ void helpserv(User * u, char *buf) } /*************************************************************************/ - -/** - * 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 User Struct of the user looking for help - * @return MOD_CONT - */ -static int do_help(User * u) -{ - char *cmd = strtok(NULL, ""); - - if (!cmd) { - notice_help(s_HelpServ, u, HELP_HELP, s_NickServ, s_ChanServ, - s_MemoServ); - if (s_BotServ) { - notice_help(s_HelpServ, u, HELP_HELP_BOT, s_BotServ); - } - if (s_HostServ) { - notice_help(s_HelpServ, u, HELP_HELP_HOST, s_HostServ); - } - moduleDisplayHelp(7, u); - } else { - mod_help_cmd(s_HelpServ, u, HELPSERV, cmd); - } - return MOD_CONT; -} diff --git a/src/hostserv.c b/src/hostserv.c index e6cf50f86..3fde7ba3a 100644 --- a/src/hostserv.c +++ b/src/hostserv.c @@ -32,51 +32,20 @@ HostCore *insertHostCore(HostCore * head, HostCore * prev, char *nick, HostCore *deleteHostCore(HostCore * head, HostCore * prev); void delHostCore(char *nick); -int is_host_setter(User * u); -int is_host_remover(User * u); - -static int do_help(User * u); -static int do_set(User * u); -static int do_on(User * u); -int do_on_id(User * u); -static void set_lastmask(User * u); -static int do_off(User * u); -static int do_del(User * u); -static int do_group(User * u); -static int listOut(User * u); -int do_hs_sync(NickCore * nc, char *vIdent, char *hostmask, char *creator, - time_t time); -int do_setall(User * u); -int do_delall(User * u); -void moduleAddHostServCmds(void); +E int is_host_setter(User * u); +E int is_host_remover(User * u); + +E int do_on_id(User * u); +E void set_lastmask(User * u); + +E int do_hs_sync(NickCore * nc, char *vIdent, char *hostmask, + char *creator, time_t time); + +E void moduleAddHostServCmds(void); /*************************************************************************/ void moduleAddHostServCmds(void) { - Command *c; - c = createCommand("HELP", do_help, NULL, -1, -1, -1, -1, -1); - addCoreCommand(HOSTSERV, c); - c = createCommand("SET", do_set, is_host_setter, HOST_HELP_SET, -1, -1, - -1, -1); - addCoreCommand(HOSTSERV, c); - c = createCommand("GROUP", do_group, NULL, HOST_HELP_GROUP, -1, -1, -1, - -1); - addCoreCommand(HOSTSERV, c); - c = createCommand("SETALL", do_setall, is_host_setter, - HOST_HELP_SETALL, -1, -1, -1, -1); - addCoreCommand(HOSTSERV, c); - c = createCommand("DELALL", do_delall, is_host_remover, - HOST_HELP_DELALL, -1, -1, -1, -1); - addCoreCommand(HOSTSERV, c); - c = createCommand("ON", do_on, NULL, HOST_HELP_ON, -1, -1, -1, -1); - addCoreCommand(HOSTSERV, c); - c = createCommand("OFF", do_off, NULL, HOST_HELP_OFF, -1, -1, -1, -1); - addCoreCommand(HOSTSERV, c); - c = createCommand("DEL", do_del, is_host_remover, HOST_HELP_DEL, -1, - -1, -1, -1); - addCoreCommand(HOSTSERV, c); - c = createCommand("LIST", listOut, is_services_oper, -1, - -1, HOST_HELP_LIST, HOST_HELP_LIST, HOST_HELP_LIST); - addCoreCommand(HOSTSERV, c); + modules_core_init(HostServCoreNumber, HostServCoreModules); } /*************************************************************************/ @@ -88,6 +57,7 @@ void moduleAddHostServCmds(void) void hostserv_init(void) { moduleAddHostServCmds(); + } /*************************************************************************/ @@ -126,6 +96,11 @@ void hostserv(User * u, char *buf) /* Start of Linked List routines */ /*************************************************************************/ +HostCore *hostCoreListHead() +{ + return head; +} + /** * Create HostCore list member * @param next HostCore next slot @@ -177,7 +152,6 @@ HostCore *createHostCorelist(HostCore * next, char *nick, char *vIdent, } /*************************************************************************/ - /** * Returns either NULL for the head, or the location of the *PREVIOUS* * record, this is where we need to insert etc.. @@ -188,7 +162,6 @@ HostCore *createHostCorelist(HostCore * next, char *nick, char *vIdent, */ HostCore *findHostCore(HostCore * head, char *nick, boolean * found) { - HostCore *previous, *current; *found = false; @@ -352,117 +325,6 @@ char *getvIdent(char *nick) } /*************************************************************************/ -int listOut(User * u) -{ - char *key = strtok(NULL, ""); - struct tm *tm; - char buf[BUFSIZE]; - int counter = 1; - int from = 0, to = 0; - char *tmp = NULL; - char *s = NULL; - int display_counter = 0; - - HostCore *current; - - current = head; - if (current == NULL) - notice_lang(s_HostServ, u, HOST_EMPTY); - else { - /** - * Do a check for a range here, then in the next loop - * we'll only display what has been requested.. - **/ - if (key) { - if (key[0] == '#') { - tmp = myStrGetOnlyToken((key + 1), '-', 0); /* Read FROM out */ - if (!tmp) { - return MOD_CONT; - } - for (s = tmp; *s; s++) { - if (!isdigit(*s)) { - return MOD_CONT; - } - } - from = atoi(tmp); - tmp = myStrGetTokenRemainder(key, '-', 1); /* Read TO out */ - if (!tmp) { - return MOD_CONT; - } - for (s = tmp; *s; s++) { - if (!isdigit(*s)) { - return MOD_CONT; - } - } - to = atoi(tmp); - key = NULL; - } - } - - while (current != NULL) { - if (key) { - if (((match_wild_nocase(key, current->nick)) - || (match_wild_nocase(key, current->vHost))) - && (display_counter < NSListMax)) { - display_counter++; - tm = localtime(¤t->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(¤t->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; -} - -/*************************************************************************/ void delHostCore(char *nick) { #ifdef USE_RDB @@ -670,116 +532,6 @@ void save_hs_rdb_dbase(void) /*************************************************************************/ /* Start of Generic Functions */ /*************************************************************************/ -int do_setall(User * u) -{ - - char *nick = strtok(NULL, " "); - char *rawhostmask = strtok(NULL, " "); - char *hostmask = smalloc(HOSTMAX); - - NickAlias *na; - int32 tmp_time; - char *s; - - char *vIdent = NULL; - - if (!nick || !rawhostmask) { - notice_lang(s_HostServ, u, HOST_SETALL_SYNTAX, s_HostServ); - return MOD_CONT; - } - - vIdent = myStrGetOnlyToken(rawhostmask, '@', 0); /* Get the first substring, @ as delimiter */ - if (vIdent) { - rawhostmask = myStrGetTokenRemainder(rawhostmask, '@', 1); /* get the remaining string */ - if (!rawhostmask) { - notice_lang(s_HostServ, u, HOST_SETALL_SYNTAX, s_HostServ); - return MOD_CONT; - } - if (strlen(vIdent) > USERMAX - 1) { - notice_lang(s_HostServ, u, HOST_SET_IDENTTOOLONG, USERMAX); - return MOD_CONT; - } else { - for (s = vIdent; *s; s++) { - if (!isvalidchar(*s)) { - notice_lang(s_HostServ, u, HOST_SET_IDENT_ERROR); - return MOD_CONT; - } - } - } - if (!ircd->vident) { - notice_lang(s_HostServ, u, HOST_NO_VIDENT); - return MOD_CONT; - } - } - - if (strlen(rawhostmask) < HOSTMAX - 1) - snprintf(hostmask, HOSTMAX - 1, "%s", rawhostmask); - else { - notice_lang(s_HostServ, u, HOST_SET_TOOLONG, HOSTMAX); - return MOD_CONT; - } - - if (!isValidHost(hostmask, 3)) { - notice_lang(s_HostServ, u, HOST_SET_ERROR); - 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); - 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); - } - - free(hostmask); - return MOD_CONT; -} - -int do_delall(User * u) -{ - int i; - char *nick = strtok(NULL, " "); - NickAlias *na; - NickCore *nc; - if (!nick) { - notice_lang(s_HostServ, u, HOST_DELALL_SYNTAX, s_HostServ); - return MOD_CONT; - } - if ((na = findnick(nick))) { - 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; -} int do_hs_sync(NickCore * nc, char *vIdent, char *hostmask, char *creator, time_t time) @@ -794,193 +546,6 @@ int do_hs_sync(NickCore * nc, char *vIdent, char *hostmask, char *creator, return MOD_CONT; } -static int do_group(User * u) -{ - NickAlias *na; - HostCore *tmp; - char *vHost = NULL; - char *vIdent = NULL; - char *creator = NULL; - time_t time; - boolean found = false; - - if ((na = findnick(u->nick))) { - if (na->status & NS_IDENTIFIED) { - tmp = findHostCore(head, u->nick, &found); - if (found) { - if (tmp == NULL) { - tmp = head; /* incase first in list */ - } else if (tmp->next) { /* we dont want the previous entry were not inserting! */ - tmp = tmp->next; /* jump to the next */ - } - - vHost = sstrdup(tmp->vHost); - if (tmp->vIdent) - vIdent = sstrdup(tmp->vIdent); - creator = sstrdup(tmp->creator); - time = tmp->time; - - do_hs_sync(na->nc, vIdent, vHost, creator, time); - if (tmp->vIdent) { - notice_lang(s_HostServ, u, HOST_IDENT_GROUP, - na->nc->display, vIdent, vHost); - } else { - notice_lang(s_HostServ, u, HOST_GROUP, na->nc->display, - vHost); - } - free(vHost); - if (vIdent) - free(vIdent); - free(creator); - - } else { - notice_lang(s_HostServ, u, HOST_NOT_ASSIGNED); - } - } else { - notice_lang(s_HostServ, u, HOST_ID); - } - } else { - notice_lang(s_HostServ, u, HOST_NOT_REGED); - } - return MOD_CONT; -} - -static int do_help(User * u) -{ - char *cmd = strtok(NULL, ""); - - if (!cmd) { - notice_help(s_HostServ, u, HOST_HELP, s_HostServ); - if ((is_services_oper(u)) || (is_host_setter(u))) - notice_help(s_HostServ, u, HOST_OPER_HELP); - /* Removed as atm, there is no admin only help */ -/* if (is_services_admin(u)) - notice_help(s_HostServ, u, HOST_ADMIN_HELP);*/ - moduleDisplayHelp(6, u); - } else { - mod_help_cmd(s_HostServ, u, HOSTSERV, cmd); - } - return MOD_CONT; -} - -/*************************************************************************/ -int do_set(User * u) -{ - char *nick = strtok(NULL, " "); - char *rawhostmask = strtok(NULL, " "); - char *hostmask = smalloc(HOSTMAX); - - NickAlias *na; - int32 tmp_time; - char *s; - - char *vIdent = NULL; - - if (!nick || !rawhostmask) { - notice_lang(s_HostServ, u, HOST_SET_SYNTAX, s_HostServ); - return MOD_CONT; - } - - vIdent = myStrGetOnlyToken(rawhostmask, '@', 0); /* Get the first substring, @ as delimiter */ - if (vIdent) { - rawhostmask = myStrGetTokenRemainder(rawhostmask, '@', 1); /* get the remaining string */ - if (!rawhostmask) { - notice_lang(s_HostServ, u, HOST_SET_SYNTAX, s_HostServ); - return MOD_CONT; - } - if (strlen(vIdent) > USERMAX - 1) { - notice_lang(s_HostServ, u, HOST_SET_IDENTTOOLONG, USERMAX); - return MOD_CONT; - } else { - for (s = vIdent; *s; s++) { - if (!isvalidchar(*s)) { - notice_lang(s_HostServ, u, HOST_SET_IDENT_ERROR); - return MOD_CONT; - } - } - } - if (!ircd->vident) { - notice_lang(s_HostServ, u, HOST_NO_VIDENT); - return MOD_CONT; - } - } - if (strlen(rawhostmask) < HOSTMAX - 1) - snprintf(hostmask, HOSTMAX - 1, "%s", rawhostmask); - else { - notice_lang(s_HostServ, u, HOST_SET_TOOLONG, HOSTMAX); - return MOD_CONT; - } - - if (!isValidHost(hostmask, 3)) { - notice_lang(s_HostServ, u, HOST_SET_ERROR); - return MOD_CONT; - } - - - tmp_time = time(NULL); - - if ((na = findnick(nick))) { - if (na->status & NS_VERBOTEN) { - notice_lang(s_HostServ, u, NICK_X_FORBIDDEN, nick); - 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); - return MOD_CONT; -} - -/*************************************************************************/ -int do_on(User * u) -{ - NickAlias *na; - char *vHost; - char *vIdent = NULL; - if ((na = findnick(u->nick))) { - if (na->status & NS_IDENTIFIED) { - vHost = getvHost(u->nick); - vIdent = getvIdent(u->nick); - if (vHost == NULL) { - notice_lang(s_HostServ, u, HOST_NOT_ASSIGNED); - } else { - if (vIdent) { - notice_lang(s_HostServ, u, HOST_IDENT_ACTIVATED, - vIdent, vHost); - } else { - notice_lang(s_HostServ, u, HOST_ACTIVATED, vHost); - } - 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; -} - /*************************************************************************/ int do_on_id(User * u) { /* we've assumed that the user exists etc.. */ @@ -1009,52 +574,6 @@ int do_on_id(User * u) } /*************************************************************************/ -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; -} - -/*************************************************************************/ -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; -} - int is_host_setter(User * u) { int i, j; @@ -1100,11 +619,3 @@ void set_lastmask(User * u) common_get_vhost(u)); } - -/*************************************************************************/ -/* End of Generic Functions */ -/*************************************************************************/ - -/*************************************************************************/ -/* End of Server Functions */ -/*************************************************************************/ diff --git a/src/init.c b/src/init.c index 87a2e91fb..33c4b3dcd 100644 --- a/src/init.c +++ b/src/init.c @@ -18,6 +18,7 @@ int servernum = 0; extern void moduleAddMsgs(void); extern void moduleAddIRCDMsgs(void); +extern int protocol_module_init(void); /*************************************************************************/ void introduce_user(const char *user) @@ -319,8 +320,8 @@ static int parse_options(int ac, char **av) } else if (!strcmp(s, "noexpire")) { noexpire = 1; } else if (!strcmp(s, "version")) { - fprintf(stdout, "Anope-%s %s %s -- %s\n", version_number, - ircd->name, version_flags, version_build); + fprintf(stdout, "Anope-%s %s -- %s\n", version_number, + version_flags, version_build); exit(EXIT_SUCCESS); } else if (!strcmp(s, "help")) { fprintf(stdout, "Anope-%s %s -- %s\n", version_number, @@ -437,8 +438,6 @@ int init(int ac, char **av) return -1; } - /* Add IRCD Message handlers */ - moduleAddIRCDMsgs(); /* Add Core MSG handles */ moduleAddMsgs(); @@ -446,6 +445,10 @@ int init(int ac, char **av) /* Parse all remaining command-line options. */ parse_options(ac, av); + /* Add IRCD Protocol Module; exit if there are errors */ + if (protocol_module_init()) { + return -1; + } #ifndef _WIN32 if (!nofork) { if ((i = fork()) < 0) { @@ -485,16 +488,18 @@ int init(int ac, char **av) /* Announce ourselves to the logfile. */ if (debug || readonly || skeleton) { - alog("Anope %s (compiled for %s) starting up (options:%s%s%s)", + 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 (compiled for %s) starting up", + 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(); @@ -562,6 +567,7 @@ int init(int ac, char **av) if (debug) alog("debug: Loaded languages"); + /* Initialize subservices */ ns_init(); cs_init(); @@ -658,7 +664,7 @@ int init(int ac, char **av) alog("Info: Not reflecting database records."); } #endif - send_event(EVENT_CONNECT, EVENT_START); + send_event(EVENT_CONNECT, 1, EVENT_START); /* Connect to the remote server */ servsock = conn(RemoteServer, RemotePort, LocalHost, LocalPort); @@ -692,7 +698,7 @@ int init(int ac, char **av) } anope_cmd_connect(servernum); - send_event(EVENT_CONNECT, EVENT_STOP); + send_event(EVENT_CONNECT, 1, EVENT_STOP); sgets2(inbuf, sizeof(inbuf), servsock); if (strnicmp(inbuf, "ERROR", 5) == 0) { diff --git a/src/ircd.c b/src/ircd.c new file mode 100644 index 000000000..67b336b47 --- /dev/null +++ b/src/ircd.c @@ -0,0 +1,1114 @@ +#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_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_eob = NULL; + ircdproto.ircd_flood_mode_check = NULL; + ircdproto.ircd_cmd_jupe = NULL; + ircdproto.ircd_valid_nick = NULL; + ircdproto.ircd_cmd_ctcp = NULL; +} + +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_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, ...) +{ + 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_part(nick, chan, buf); +} + +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_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); +} + +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_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_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_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/main.c b/src/main.c index 878e12848..6300078a0 100644 --- a/src/main.c +++ b/src/main.c @@ -98,7 +98,7 @@ static int started = 0; extern void expire_all(void) { - send_event(EVENT_DB_EXPIRE, EVENT_START); + send_event(EVENT_DB_EXPIRE, 1, EVENT_START); waiting = -3; if (debug) alog("debug: Running expire routines"); @@ -125,14 +125,14 @@ extern void expire_all(void) expire_szlines(); } expire_exceptions(); - send_event(EVENT_DB_EXPIRE, EVENT_STOP); + send_event(EVENT_DB_EXPIRE, 1, EVENT_STOP); } /*************************************************************************/ void save_databases(void) { - send_event(EVENT_DB_SAVING, EVENT_START); + send_event(EVENT_DB_SAVING, 1, EVENT_START); waiting = -2; if (debug) @@ -204,7 +204,7 @@ void save_databases(void) } } #endif - send_event(EVENT_DB_SAVING, EVENT_STOP); + send_event(EVENT_DB_SAVING, 1, EVENT_STOP); } /*************************************************************************/ @@ -214,7 +214,7 @@ void save_databases(void) static void services_restart(void) { alog("Restarting"); - send_event(EVENT_RESTART, EVENT_START); + send_event(EVENT_RESTART, 1, EVENT_START); if (!quitmsg) quitmsg = "Restarting"; anope_cmd_squit(ServerName, quitmsg); @@ -254,7 +254,7 @@ static void services_shutdown(void) { User *u, *next; - send_event(EVENT_SHUTDOWN, EVENT_START); + send_event(EVENT_SHUTDOWN, 1, EVENT_START); if (!quitmsg) quitmsg = "Terminating, reason unknown"; @@ -273,7 +273,7 @@ static void services_shutdown(void) u = next; } } - send_event(EVENT_SHUTDOWN, EVENT_STOP); + send_event(EVENT_SHUTDOWN, 1, EVENT_STOP); disconn(servsock); } @@ -317,6 +317,7 @@ void sighandler(int signum) "Error Reading Configuration File (Received SIGUSR2)"); quitting = 1; } + send_event(EVENT_RELOAD, 1, EVENT_START); return; } else @@ -432,7 +433,8 @@ void sighandler(int signum) if (signum == SIGSEGV) { do_backtrace(1); } - send_event(EVENT_SIGNAL, quitmsg); + /* Should we send the signum here as well? -GD */ + send_event(EVENT_SIGNAL, 1, quitmsg); if (started) { services_shutdown(); diff --git a/src/makefile.win32 b/src/makefile.win32 index 8b60c3474..21a78661b 100644 --- a/src/makefile.win32 +++ b/src/makefile.win32 @@ -19,21 +19,21 @@ 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 language.obj list.obj log.obj mail.obj main.obj memory.obj memoserv.obj \ - messages.obj misc.obj modules.obj news.obj nickserv.obj operserv.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 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) $(CAPAB_O) + 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 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.obj sessions.c slist.c sockutil.c \ - timeout.c users.c $(RDB_C) $(MYSQL_C) $(CAPAB_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.obj sessions.c \ + slist.c sockutil.c timeout.c users.c $(RDB_C) $(MYSQL_C) ########################################################################### .c.obj: - $(CC) $(CFLAGS) $(IRCTYPE) -c $< + $(CC) $(CFLAGS) -c $< all: $(PROGRAM) @@ -45,7 +45,6 @@ spotless: install: -@copy anope.exe ..\anope.exe - -@copy tools\anopesmtp.exe ..\anopesmtp.exe -@mkdir ..\$(DATDEST)\bin -@copy bin\* ..\$(DATDEST)\bin @@ -68,8 +67,9 @@ 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 +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 @@ -79,7 +79,7 @@ main.obj: main.c ..\include\services.h ..\include\ 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 +modules.obj: modules.c ..\include\modules.h ..\include\language.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 diff --git a/src/memoserv.c b/src/memoserv.c index 479437aa7..af4b4c063 100644 --- a/src/memoserv.c +++ b/src/memoserv.c @@ -19,43 +19,15 @@ /* *INDENT-OFF* */ NickCore *nclists[1024]; -static int delmemo(MemoInfo *mi, int num); -static int do_help(User *u); -static int do_send(User *u); -void memo_send(User *u, char *name, char *text, int z); -static int do_cancel(User *u); -static int do_list(User *u); -static int do_read(User *u); -static int do_del(User *u); -static int do_set(User *u); -static int do_set_notify(User *u, MemoInfo *mi, char *param); -static int do_set_limit(User *u, MemoInfo *mi, char *param); -static int do_info(User *u); -static int do_staff(User *u); -static int do_sendall(User *u); -void moduleAddMemoServCmds(void); +E void memo_send(User *u, char *name, char *text, int z); +E void moduleAddMemoServCmds(void); static void new_memo_mail(NickCore *nc, Memo *m); -static int do_rsend(User *u); -static int do_memocheck(User *u); -void rsend_notify(User *u, Memo *m, const char *chan); +E void rsend_notify(User *u, Memo *m, const char *chan); +E int delmemo(MemoInfo * mi, int num); /*************************************************************************/ void moduleAddMemoServCmds(void) { - Command *c; - c = createCommand("HELP", do_help, NULL, -1, -1,-1,-1,-1); addCoreCommand(MEMOSERV,c); - c = createCommand("SEND", do_send, NULL, MEMO_HELP_SEND, -1,-1,-1,-1); addCoreCommand(MEMOSERV,c); - c = createCommand("CANCEL", do_cancel, NULL, MEMO_HELP_CANCEL, -1,-1,-1,-1); addCoreCommand(MEMOSERV,c); - c = createCommand("LIST", do_list, NULL, MEMO_HELP_LIST, -1,-1,-1,-1); addCoreCommand(MEMOSERV,c); - c = createCommand("READ", do_read, NULL, MEMO_HELP_READ, -1,-1,-1,-1); addCoreCommand(MEMOSERV,c); - c = createCommand("DEL", do_del, NULL, MEMO_HELP_DEL, -1,-1,-1,-1); addCoreCommand(MEMOSERV,c); - c = createCommand("STAFF", do_staff, is_services_oper, -1, -1,MEMO_HELP_STAFF,MEMO_HELP_STAFF,MEMO_HELP_STAFF); addCoreCommand(MEMOSERV,c); - c = createCommand("SET", do_set, NULL, MEMO_HELP_SET, -1,-1,-1,-1); addCoreCommand(MEMOSERV,c); - c = createCommand("SET NOTIFY", NULL, NULL, MEMO_HELP_SET_NOTIFY, -1,-1,-1,-1); addCoreCommand(MEMOSERV,c); - c = createCommand("SET LIMIT", NULL, NULL, -1,MEMO_HELP_SET_LIMIT, MEMO_SERVADMIN_HELP_SET_LIMIT,MEMO_SERVADMIN_HELP_SET_LIMIT, MEMO_SERVADMIN_HELP_SET_LIMIT); addCoreCommand(MEMOSERV,c); - c = createCommand("INFO", do_info, NULL, -1,MEMO_HELP_INFO, -1,MEMO_SERVADMIN_HELP_INFO, MEMO_SERVADMIN_HELP_INFO); addCoreCommand(MEMOSERV,c); - c = createCommand("SENDALL", do_sendall, is_services_admin, -1, -1,-1,MEMO_HELP_SENDALL,MEMO_HELP_SENDALL); addCoreCommand(MEMOSERV,c); - c = createCommand("RSEND", do_rsend, NULL, MEMO_HELP_RSEND, -1,-1,-1,-1); addCoreCommand(MEMOSERV,c); - c = createCommand("CHECK", do_memocheck, NULL, MEMO_HELP_CHECK, -1,-1,-1,-1); addCoreCommand(MEMOSERV,c); + modules_core_init(MemoServCoreNumber, MemoServCoreModules); } /*************************************************************************/ @@ -176,7 +148,7 @@ void check_memos(User * u) * @return `ischan' 1 if the name was a channel name, else 0. * @return `isforbid' 1 if the name is forbidden, else 0. */ -static MemoInfo *getmemoinfo(const char *name, int *ischan, int *isforbid) +MemoInfo *getmemoinfo(const char *name, int *ischan, int *isforbid) { if (*name == '#') { ChannelInfo *ci; @@ -218,84 +190,6 @@ static MemoInfo *getmemoinfo(const char *name, int *ischan, int *isforbid) /*************************************************************************/ /** - * 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. - */ -static int delmemo(MemoInfo * mi, int num) -{ - int i; - - for (i = 0; i < mi->memocount; i++) { - if (mi->memos[i].number == num) - break; - } - if (i < mi->memocount) { - 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; - } -} - -/*************************************************************************/ -/*********************** MemoServ command routines ***********************/ -/*************************************************************************/ - -/** - * Return a help message. - * @param u User Struct - * @return MOD_CONT - */ -static int do_help(User * u) -{ - char *cmd = strtok(NULL, ""); - - if (!cmd) { - notice_help(s_MemoServ, u, MEMO_HELP); - if (is_services_oper(u)) { - notice_help(s_MemoServ, u, MEMO_HELP_OPER); - } - if (is_services_admin(u)) { - notice_help(s_MemoServ, u, MEMO_HELP_ADMIN); - } - moduleDisplayHelp(3, u); - notice_help(s_MemoServ, u, MEMO_HELP_FOOTER, s_ChanServ); - } else { - mod_help_cmd(s_MemoServ, u, MEMOSERV, cmd); - } - return MOD_CONT; -} - -/*************************************************************************/ - -/** - * Send a memo to a nick/channel. - * @param u User Struct - * @return MOD_CONT - */ -static int do_send(User * u) -{ - char *name = strtok(NULL, " "); - char *text = strtok(NULL, ""); - int z = 0; - memo_send(u, name, text, z); - return MOD_CONT; -} - -/*************************************************************************/ - -/** * Split from do_send, this way we can easily send a memo from any point * @param u User Struct * @param name Target of the memo @@ -445,932 +339,35 @@ void memo_send(User * u, char *name, char *text, int z) } /*************************************************************************/ - -/** - * Cancel the memo - * @param u User Struct - * @return MOD_CONT - */ -static 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; -} - -/*************************************************************************/ - -/** - * 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 - */ -static int list_memo(User * u, int index, MemoInfo * mi, int *sent_header, - int new, const char *chan) -{ - Memo *m; - char timebuf[64]; - struct tm tm; - - if (index < 0 || index >= mi->memocount) - return 0; - if (!*sent_header) { - if (chan) { - notice_lang(s_MemoServ, u, - new ? MEMO_LIST_CHAN_NEW_MEMOS : - MEMO_LIST_CHAN_MEMOS, chan, s_MemoServ, chan); - } else { - notice_lang(s_MemoServ, u, - new ? MEMO_LIST_NEW_MEMOS : MEMO_LIST_MEMOS, - u->nick, s_MemoServ); - } - notice_lang(s_MemoServ, u, MEMO_LIST_HEADER); - *sent_header = 1; - } - m = &mi->memos[index]; - tm = *localtime(&m->time); - strftime_lang(timebuf, sizeof(timebuf), - u, STRFTIME_DATE_TIME_FORMAT, &tm); - timebuf[sizeof(timebuf) - 1] = 0; /* just in case */ - notice_lang(s_MemoServ, u, MEMO_LIST_FORMAT, - (m->flags & MF_UNREAD) ? '*' : ' ', - m->number, m->sender, timebuf); - return 1; -} - -/*************************************************************************/ - -/** - * list memno callback function - * @param u User Struct - * @param int Memo number - * @param va_list List of arguements - * @return result form list_memo() - */ -static int list_memo_callback(User * u, int num, va_list args) -{ - MemoInfo *mi = va_arg(args, MemoInfo *); - int *sent_header = va_arg(args, int *); - const char *chan = va_arg(args, const char *); - int i; - - for (i = 0; i < mi->memocount; i++) { - if (mi->memos[i].number == num) - break; - } - /* Range checking done by list_memo() */ - return list_memo(u, i, mi, sent_header, 0, chan); -} - - -/*************************************************************************/ - /** - * List the memos (if any) for the source nick or given channel. - * @param u User Struct - * @return MOD_CONT - */ -static int do_list(User * u) -{ - char *param = strtok(NULL, " "), *chan = NULL; - ChannelInfo *ci; - MemoInfo *mi; - Memo *m; - int i; - - if (param && *param == '#') { - chan = param; - param = strtok(NULL, " "); - if (!(ci = cs_findchan(chan))) { - notice_lang(s_MemoServ, u, CHAN_X_NOT_REGISTERED, chan); - return MOD_CONT; - } else if (ci->flags & CI_VERBOTEN) { - notice_lang(s_MemoServ, u, CHAN_X_FORBIDDEN, chan); - return MOD_CONT; - } else if (!check_access(u, ci, CA_MEMO)) { - notice_lang(s_MemoServ, u, ACCESS_DENIED); - return MOD_CONT; - } - mi = &ci->memos; - } else { - if (!nick_identified(u)) { - notice_lang(s_MemoServ, u, NICK_IDENTIFY_REQUIRED, s_NickServ); - return MOD_CONT; - } - mi = &u->na->nc->memos; - } - if (param && !isdigit(*param) && stricmp(param, "NEW") != 0) { - syntax_error(s_MemoServ, u, "LIST", MEMO_LIST_SYNTAX); - } else if (mi->memocount == 0) { - if (chan) - notice_lang(s_MemoServ, u, MEMO_X_HAS_NO_MEMOS, chan); - else - notice_lang(s_MemoServ, u, MEMO_HAVE_NO_MEMOS); - } else { - int sent_header = 0; - if (param && isdigit(*param)) { - process_numlist(param, NULL, list_memo_callback, u, - mi, &sent_header, chan); - } else { - if (param) { - for (i = 0, m = mi->memos; i < mi->memocount; i++, m++) { - if (m->flags & MF_UNREAD) - break; - } - if (i == mi->memocount) { - if (chan) - notice_lang(s_MemoServ, u, MEMO_X_HAS_NO_NEW_MEMOS, - chan); - else - notice_lang(s_MemoServ, u, MEMO_HAVE_NO_NEW_MEMOS); - return MOD_CONT; - } - } - for (i = 0, m = mi->memos; i < mi->memocount; i++, m++) { - if (param && !(m->flags & MF_UNREAD)) - continue; - list_memo(u, i, mi, &sent_header, param != NULL, chan); - } - } - } - return MOD_CONT; -} - -/*************************************************************************/ - -/** - * 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 - */ -static int read_memo(User * u, int index, MemoInfo * mi, const char *chan) -{ - Memo *m; - char timebuf[64]; - struct tm tm; - - if (index < 0 || index >= mi->memocount) - return 0; - m = &mi->memos[index]; - tm = *localtime(&m->time); - strftime_lang(timebuf, sizeof(timebuf), - u, STRFTIME_DATE_TIME_FORMAT, &tm); - timebuf[sizeof(timebuf) - 1] = 0; - if (chan) - notice_lang(s_MemoServ, u, MEMO_CHAN_HEADER, m->number, - m->sender, timebuf, s_MemoServ, chan, m->number); - else - notice_lang(s_MemoServ, u, MEMO_HEADER, m->number, - m->sender, timebuf, s_MemoServ, m->number); - notice_lang(s_MemoServ, u, MEMO_TEXT, m->text); - m->flags &= ~MF_UNREAD; - - /* Check if a receipt notification was requested */ - if (m->flags & MF_RECEIPT) { - rsend_notify(u, m, chan); - } - - return 1; -} - -/*************************************************************************/ - -/** - * Read a memo callback function - * @param u User Struct - * @param int Index number - * @param va_list variable arguements - * @return result of read_memo() + * 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. */ -static int read_memo_callback(User * u, int num, va_list args) +int delmemo(MemoInfo * mi, int num) { - 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 memo command - * @param u User Struct - * @return MOD_CONT - */ -static int do_read(User * u) -{ - MemoInfo *mi; - ChannelInfo *ci; - char *numstr = strtok(NULL, " "), *chan = NULL; - int num, count; - - if (numstr && *numstr == '#') { - chan = numstr; - numstr = strtok(NULL, " "); - if (!(ci = cs_findchan(chan))) { - notice_lang(s_MemoServ, u, CHAN_X_NOT_REGISTERED, chan); - return MOD_CONT; - } else if (ci->flags & CI_VERBOTEN) { - notice_lang(s_MemoServ, u, CHAN_X_FORBIDDEN, chan); - return MOD_CONT; - } else if (!check_access(u, ci, CA_MEMO)) { - notice_lang(s_MemoServ, u, ACCESS_DENIED); - return MOD_CONT; - } - mi = &ci->memos; - } else { - if (!nick_identified(u)) { - notice_lang(s_MemoServ, u, NICK_IDENTIFY_REQUIRED, s_NickServ); - return MOD_CONT; - } - mi = &u->na->nc->memos; - } - num = numstr ? atoi(numstr) : -1; - if (!numstr - || (stricmp(numstr, "LAST") != 0 && stricmp(numstr, "NEW") != 0 - && num <= 0)) { - syntax_error(s_MemoServ, u, "READ", MEMO_READ_SYNTAX); - - } else if (mi->memocount == 0) { - if (chan) - notice_lang(s_MemoServ, u, MEMO_X_HAS_NO_MEMOS, chan); - else - notice_lang(s_MemoServ, u, MEMO_HAVE_NO_MEMOS); - - } else { - int i; - - if (stricmp(numstr, "NEW") == 0) { - int readcount = 0; - for (i = 0; i < mi->memocount; i++) { - if (mi->memos[i].flags & MF_UNREAD) { - read_memo(u, i, mi, chan); - readcount++; - } - } - if (!readcount) { - if (chan) - notice_lang(s_MemoServ, u, MEMO_X_HAS_NO_NEW_MEMOS, - chan); - else - notice_lang(s_MemoServ, u, MEMO_HAVE_NO_NEW_MEMOS); - } - } else if (stricmp(numstr, "LAST") == 0) { - for (i = 0; i < mi->memocount - 1; i++); - read_memo(u, i, mi, chan); - } else { /* number[s] */ - if (!process_numlist(numstr, &count, read_memo_callback, u, - mi, chan)) { - if (count == 1) - notice_lang(s_MemoServ, u, MEMO_DOES_NOT_EXIST, num); - else - notice_lang(s_MemoServ, u, MEMO_LIST_NOT_FOUND, - numstr); - } - } - - } - return MOD_CONT; -} - -/*************************************************************************/ - -/** - * Delete a single memo from a MemoInfo. callback function - * @param u User Struct - * @param int Number - * @param va_list Variable Arguemtns - * @return 1 if successful, 0 if it fails - */ -static int del_memo_callback(User * u, int num, va_list args) -{ - MemoInfo *mi = va_arg(args, MemoInfo *); - int *last = va_arg(args, int *); - int *last0 = va_arg(args, int *); - char **end = va_arg(args, char **); - int *left = va_arg(args, int *); - - if (delmemo(mi, num)) { - if (num != (*last) + 1) { - if (*last != -1) { - int len; - if (*last0 != *last) - len = snprintf(*end, *left, ",%d-%d", *last0, *last); - else - len = snprintf(*end, *left, ",%d", *last); - *end += len; - *left -= len; - } - *last0 = num; - } - *last = num; - return 1; - } else { - return 0; - } -} - -/*************************************************************************/ - -/** - * Delete memos command. - * @param u User Struct - * @return MOD_CONT - */ -static int do_del(User * u) -{ - MemoInfo *mi; - ChannelInfo *ci; - char *numstr = strtok(NULL, ""), *chan = NULL; - int last, last0, i; - char buf[BUFSIZE], *end; - int delcount, count, left; - - if (numstr && *numstr == '#') { - chan = strtok(numstr, " "); - numstr = strtok(NULL, ""); - if (!(ci = cs_findchan(chan))) { - notice_lang(s_MemoServ, u, CHAN_X_NOT_REGISTERED, chan); - return MOD_CONT; - } else if (ci->flags & CI_VERBOTEN) { - notice_lang(s_MemoServ, u, CHAN_X_FORBIDDEN, chan); - return MOD_CONT; - } else if (!check_access(u, ci, CA_MEMO)) { - notice_lang(s_MemoServ, u, ACCESS_DENIED); - return MOD_CONT; - } - mi = &ci->memos; - } else { - if (!nick_identified(u)) { - notice_lang(s_MemoServ, u, NICK_IDENTIFY_REQUIRED, s_NickServ); - return MOD_CONT; - } - mi = &u->na->nc->memos; - } - if (!numstr - || (!isdigit(*numstr) && stricmp(numstr, "ALL") != 0 - && stricmp(numstr, "LAST") != 0)) { - syntax_error(s_MemoServ, u, "DEL", MEMO_DEL_SYNTAX); - } else if (mi->memocount == 0) { - if (chan) - notice_lang(s_MemoServ, u, MEMO_X_HAS_NO_MEMOS, chan); - else - notice_lang(s_MemoServ, u, MEMO_HAVE_NO_MEMOS); - } else { - if (isdigit(*numstr)) { - /* Delete a specific memo or memos. */ - last = -1; /* Last memo deleted */ - last0 = -1; /* Beginning of range of last memos deleted */ - end = buf; - left = sizeof(buf); - delcount = - process_numlist(numstr, &count, del_memo_callback, u, mi, - &last, &last0, &end, &left); - if (last != -1) { - /* Some memos got deleted; tell them which ones. */ - if (delcount > 1) { - if (last0 != last) - end += snprintf(end, sizeof(buf) - (end - buf), - ",%d-%d", last0, last); - else - end += snprintf(end, sizeof(buf) - (end - buf), - ",%d", last); - /* "buf+1" here because *buf == ',' */ - notice_lang(s_MemoServ, u, MEMO_DELETED_SEVERAL, - buf + 1); - } else { - notice_lang(s_MemoServ, u, MEMO_DELETED_ONE, last); - } - } else { - /* No memos were deleted. Tell them so. */ - if (count == 1) - notice_lang(s_MemoServ, u, MEMO_DOES_NOT_EXIST, - atoi(numstr)); - else - notice_lang(s_MemoServ, u, MEMO_DELETED_NONE); - } - } else if (stricmp(numstr, "LAST") == 0) { - /* Delete last memo. */ - for (i = 0; i < mi->memocount; i++) - last = mi->memos[i].number; - delmemo(mi, last); - notice_lang(s_MemoServ, u, MEMO_DELETED_ONE, last); - } else { - /* Delete all memos. */ - for (i = 0; i < mi->memocount; i++) { - free(mi->memos[i].text); - moduleCleanStruct(&mi->memos[i].moduleData); - } + 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; - 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; -} - -/*************************************************************************/ - -/** - * MS SET command. - * @param u User Struct - * @return MOD_CONT - */ -static int do_set(User * u) -{ - char *cmd = strtok(NULL, " "); - char *param = strtok(NULL, ""); - MemoInfo *mi = &u->na->nc->memos; - - if (readonly) { - notice_lang(s_MemoServ, u, MEMO_SET_DISABLED); - return MOD_CONT; - } - if (!param) { - syntax_error(s_MemoServ, u, "SET", MEMO_SET_SYNTAX); - } else if (!nick_identified(u)) { - notice_lang(s_MemoServ, u, NICK_IDENTIFY_REQUIRED, s_NickServ); - return MOD_CONT; - } else if (stricmp(cmd, "NOTIFY") == 0) { - do_set_notify(u, mi, param); - } else if (stricmp(cmd, "LIMIT") == 0) { - do_set_limit(u, mi, param); - } else { - notice_lang(s_MemoServ, u, MEMO_SET_UNKNOWN_OPTION, cmd); - notice_lang(s_MemoServ, u, MORE_INFO, s_MemoServ, "SET"); - } - return MOD_CONT; -} - -/*************************************************************************/ - -/** - * MS SET notify - * @param u User Struct - * @param mi MemoInfo Struct - * @param param Parameter - * @return MOD_CONT - */ -static int do_set_notify(User * u, MemoInfo * mi, char *param) -{ - if (stricmp(param, "ON") == 0) { - u->na->nc->flags |= NI_MEMO_SIGNON | NI_MEMO_RECEIVE; - notice_lang(s_MemoServ, u, MEMO_SET_NOTIFY_ON, s_MemoServ); - } else if (stricmp(param, "LOGON") == 0) { - u->na->nc->flags |= NI_MEMO_SIGNON; - u->na->nc->flags &= ~NI_MEMO_RECEIVE; - notice_lang(s_MemoServ, u, MEMO_SET_NOTIFY_LOGON, s_MemoServ); - } else if (stricmp(param, "NEW") == 0) { - u->na->nc->flags &= ~NI_MEMO_SIGNON; - u->na->nc->flags |= NI_MEMO_RECEIVE; - notice_lang(s_MemoServ, u, MEMO_SET_NOTIFY_NEW, s_MemoServ); - } else if (stricmp(param, "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; -} - -/*************************************************************************/ - -/** - * MS SET limit - * @param u User Struct - * @param mi MemoInfo Struct - * @param param Parameter - * @return MOD_CONT - */ -static int do_set_limit(User * u, MemoInfo * mi, char *param) -{ - char *p1 = strtok(param, " "); - char *p2 = strtok(NULL, " "); - char *p3 = strtok(NULL, " "); - char *user = NULL, *chan = NULL; - int32 limit; - NickAlias *na = u->na; - ChannelInfo *ci = NULL; - int is_servadmin = is_services_admin(u); - - if (p1 && *p1 == '#') { - chan = p1; - p1 = p2; - p2 = p3; - p3 = strtok(NULL, " "); - if (!(ci = cs_findchan(chan))) { - notice_lang(s_MemoServ, u, CHAN_X_NOT_REGISTERED, chan); - return MOD_CONT; - } else if (ci->flags & CI_VERBOTEN) { - notice_lang(s_MemoServ, u, CHAN_X_FORBIDDEN, chan); - return MOD_CONT; - } else if (!is_servadmin && !check_access(u, ci, CA_MEMO)) { - notice_lang(s_MemoServ, u, ACCESS_DENIED); - return MOD_CONT; - } - mi = &ci->memos; - } - if (is_servadmin) { - if (p2 && stricmp(p2, "HARD") != 0 && !chan) { - if (!(na = findnick(p1))) { - notice_lang(s_MemoServ, u, NICK_X_NOT_REGISTERED, p1); - return MOD_CONT; - } - user = p1; - mi = &na->nc->memos; - p1 = p2; - p2 = p3; - } else if (!p1) { - syntax_error(s_MemoServ, u, "SET LIMIT", - MEMO_SET_LIMIT_SERVADMIN_SYNTAX); - return MOD_CONT; - } - if ((!isdigit(*p1) && stricmp(p1, "NONE") != 0) || - (p2 && stricmp(p2, "HARD") != 0)) { - syntax_error(s_MemoServ, u, "SET LIMIT", - MEMO_SET_LIMIT_SERVADMIN_SYNTAX); - return MOD_CONT; } - if (chan) { - if (p2) - ci->flags |= CI_MEMO_HARDMAX; - else - ci->flags &= ~CI_MEMO_HARDMAX; - } else { - if (p2) - na->nc->flags |= NI_MEMO_HARDMAX; - else - na->nc->flags &= ~NI_MEMO_HARDMAX; - } - limit = atoi(p1); - if (limit < 0 || limit > 32767) { - notice_lang(s_MemoServ, u, MEMO_SET_LIMIT_OVERFLOW, 32767); - limit = 32767; - } - if (stricmp(p1, "NONE") == 0) - limit = -1; - } else { - if (!p1 || p2 || !isdigit(*p1)) { - syntax_error(s_MemoServ, u, "SET LIMIT", - MEMO_SET_LIMIT_SYNTAX); - return MOD_CONT; - } - if (chan && (ci->flags & CI_MEMO_HARDMAX)) { - notice_lang(s_MemoServ, u, MEMO_SET_LIMIT_FORBIDDEN, chan); - return MOD_CONT; - } else if (!chan && (na->nc->flags & NI_MEMO_HARDMAX)) { - notice_lang(s_MemoServ, u, MEMO_SET_YOUR_LIMIT_FORBIDDEN); - return MOD_CONT; - } - limit = atoi(p1); - /* The first character is a digit, but we could still go negative - * from overflow... watch out! */ - if (limit < 0 || (MSMaxMemos > 0 && limit > MSMaxMemos)) { - if (chan) { - notice_lang(s_MemoServ, u, MEMO_SET_LIMIT_TOO_HIGH, - chan, MSMaxMemos); - } else { - notice_lang(s_MemoServ, u, MEMO_SET_YOUR_LIMIT_TOO_HIGH, - MSMaxMemos); - } - return MOD_CONT; - } else if (limit > 32767) { - notice_lang(s_MemoServ, u, MEMO_SET_LIMIT_OVERFLOW, 32767); - limit = 32767; - } - } - mi->memomax = limit; - if (limit > 0) { - if (!chan && na->nc == u->na->nc) - notice_lang(s_MemoServ, u, MEMO_SET_YOUR_LIMIT, limit); - else - notice_lang(s_MemoServ, u, MEMO_SET_LIMIT, - chan ? chan : user, limit); - } else if (limit == 0) { - if (!chan && na->nc == u->na->nc) - notice_lang(s_MemoServ, u, MEMO_SET_YOUR_LIMIT_ZERO); - else - notice_lang(s_MemoServ, u, MEMO_SET_LIMIT_ZERO, - chan ? chan : user); + return 1; } 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; -} - -/*************************************************************************/ - -/** - * MS INFO - * @param u User Struct - * @return MOD_CONT - */ -static int do_info(User * u) -{ - MemoInfo *mi; - NickAlias *na = NULL; - ChannelInfo *ci = NULL; - char *name = strtok(NULL, " "); - int is_servadmin = is_services_admin(u); - int hardmax = 0; - - if (is_servadmin && name && *name != '#') { - na = findnick(name); - if (!na) { - notice_lang(s_MemoServ, u, NICK_X_NOT_REGISTERED, name); - return MOD_CONT; - } 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)) */ -} - -/*************************************************************************/ -/** - * Allow the easy sending of memo's to all user's on the oper/admin/root lists - * - Rob - * Opers in several lists won't get the memo twice from now on - * - Certus - **/ - -static int do_staff(User * u) -{ - NickCore *nc; - int i, z = 0; - char *text = strtok(NULL, ""); - - if (readonly) { - notice_lang(s_MemoServ, u, MEMO_SEND_DISABLED); - return MOD_CONT; - } else if (checkDefCon(DEFCON_NO_NEW_MEMOS)) { - notice_lang(s_MemoServ, u, OPER_DEFCON_DENIED); - return MOD_CONT; - } else if (text == NULL) { - syntax_error(s_MemoServ, u, "SEND", MEMO_SEND_SYNTAX); - return MOD_CONT; - } - - for (i = 0; i < 1024; i++) { - for (nc = nclists[i]; nc; nc = nc->next) { - if (nick_is_services_oper(nc)) - memo_send(u, nc->display, text, z); - } - } - return MOD_CONT; -} - -/*************************************************************************/ -/** - * Send a memo to all registered nicks - * - Certus - 06/06/2003 - **/ -static int do_sendall(User * u) -{ - int i, z = 1; - NickCore *nc; - char *text = strtok(NULL, ""); - - - - if (readonly) { - notice_lang(s_MemoServ, u, MEMO_SEND_DISABLED); - return MOD_CONT; - } else if (checkDefCon(DEFCON_NO_NEW_MEMOS)) { - notice_lang(s_MemoServ, u, OPER_DEFCON_DENIED); - return MOD_CONT; - } else if (!text) { - syntax_error(s_MemoServ, u, "SENDALL", MEMO_SEND_SYNTAX); - return MOD_CONT; + return 0; } - - - 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; } /*************************************************************************/ @@ -1399,62 +396,6 @@ static void new_memo_mail(NickCore * nc, Memo * m) return; } -/*************************************************************************/ -/* Send a memo to a nick/channel requesting a receipt. */ - -static int do_rsend(User * u) -{ - char *name = strtok(NULL, " "); - char *text = strtok(NULL, ""); - NickAlias *na = NULL; - int z = 3; - - /* check if RSEND is usable first */ - if (!MSMemoReceipt) { - notice_lang(s_MemoServ, u, MEMO_RSEND_DISABLED); - return MOD_CONT; - } - - /* 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; -} /*************************************************************************/ /* Send receipt notification to sender. */ @@ -1507,66 +448,3 @@ void rsend_notify(User * u, Memo * m, const char *chan) return; } - - - -/*************************************************************************/ -/* This function checks whether the last memo you sent to person X has been read - or not. Note that this function does only work with nicks, NOT with chans. */ - -static 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/messages.c b/src/messages.c index 695acbd8b..119200d98 100644 --- a/src/messages.c +++ b/src/messages.c @@ -163,16 +163,15 @@ int m_privmsg(char *source, char *receiver, char *msg) if ((stricmp(receiver, s_OperServ) == 0) || (s_OperServAlias && (stricmp(receiver, s_OperServAlias) == 0))) { - if (is_oper(u)) { - operserv(u, msg); - } else { + 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 diff --git a/src/misc.c b/src/misc.c index d12351ba0..469e449f1 100644 --- a/src/misc.c +++ b/src/misc.c @@ -607,7 +607,7 @@ int isValidHost(const char *host, int type) /** * Valid character check - * @param c Charaacter to check + * @param c Character to check * @return 1 if a host is valid, 0 if it isnt. */ int isvalidchar(const char c) diff --git a/src/modules.c b/src/modules.c index 3d6150a4e..a508cda7e 100644 --- a/src/modules.c +++ b/src/modules.c @@ -86,6 +86,52 @@ void modules_init(void) #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("trying to load core module [%s]", + mod_current_module->name); + alog("status: [%d]", status); + } + mod_current_module = NULL; + mod_current_user = NULL; + } + } +} + +/** + * 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]", ret); + mod_current_module = NULL; + return ret; +} + /** * Automaticaly load modules at startup, delayed. * This function waits until the IRCD link has been made, and then attempts @@ -119,12 +165,14 @@ void modules_delayed_init(void) 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; @@ -137,6 +185,10 @@ Module *createModule(char *filename) 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 */ } @@ -148,9 +200,16 @@ Module *createModule(char *filename) */ 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); } @@ -165,6 +224,7 @@ int destroyModule(Module * m) 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; @@ -262,6 +322,25 @@ Module *findModule(char *name) } +/** + * 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; +} + /** * Copy the module from the modules folder to the runtime folder. * This will prevent module updates while the modules is loaded from @@ -375,7 +454,11 @@ int loadModule(Module * m, User * u) ano_modclearerr(); func = ano_modsym(m->handle, "AnopeInit"); if ((err = ano_moderr()) != NULL) { - ano_modclose(m->handle); /* If no AnopeInit - it isnt an Anope Module, close it */ + ano_modclose(m->handle); /* If no AnopeInit - it isnt an Anope Module, close it */ + if (u) { + notice_lang(s_OperServ, u, OPER_MODULE_LOAD_FAIL, m->name); + } + return MOD_ERR_NOLOAD; } if (func) { @@ -392,7 +475,14 @@ int loadModule(Module * m, User * u) if (u) { free(argv[0]); } + if (m->type == PROTOCOL && protocolModuleLoaded()) { + alog("You cannot load have 2 protocol modules."); + ret = MOD_STOP; + } if (ret == MOD_STOP) { + if (u) { + notice_lang(s_OperServ, u, OPER_MODULE_LOAD_FAIL, m->name); + } alog("%s requested unload...", m->name); unloadModule(m, NULL); mod_current_module_name = NULL; @@ -411,6 +501,10 @@ int loadModule(Module * m, User * u) return MOD_ERR_OK; #else + if (u) { + notice_lang(s_OperServ, u, OPER_MODULE_LOAD_FAIL, m->name); + } + return MOD_ERR_NOLOAD; #endif } @@ -433,6 +527,13 @@ int unloadModule(Module * m, User * u) return MOD_ERR_PARAMS; } + if (m->type == PROTOCOL) { + if (u) { + notice_lang(s_OperServ, u, OPER_MODULE_NO_UNLOAD); + } + return MOD_ERR_NOUNLOAD; + } + if (prepForUnload(mod_current_module) != MOD_ERR_OK) { return MOD_ERR_UNKNOWN; } @@ -463,6 +564,18 @@ int unloadModule(Module * m, User * u) } /** + * 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. @@ -474,8 +587,14 @@ 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; @@ -555,6 +674,25 @@ int prepForUnload(Module * m) } } } + + 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; } @@ -906,7 +1044,7 @@ int addCommand(CommandHash * cmdTable[], Command * c, int pos) 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; @@ -1131,6 +1269,7 @@ int addMessage(MessageHash * msgTable[], Message * m, int pos) MessageHash *newHash = NULL; MessageHash *lastHash = NULL; Message *tail = NULL; + int match = 0; if (!msgTable || !m || (pos < 0 || pos > 2)) { return MOD_ERR_PARAMS; @@ -1139,7 +1278,12 @@ int addMessage(MessageHash * msgTable[], Message * m, int pos) index = CMD_HASH(m->name); for (current = msgTable[index]; current; current = current->next) { - if (stricmp(m->name, current->name) == 0) { /* the msg exist's we are a addHead */ + 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; @@ -1754,54 +1898,34 @@ void moduleDisplayHelp(int service, User * u) int idx; int header_shown = 0; 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) { - if (header_shown == 0) { - notice_lang(s_NickServ, u, MODULE_HELP_HEADER); - header_shown = 1; - } current->m->nickHelp(u); } else if ((service == 2) && current->m->chanHelp) { - if (header_shown == 0) { - notice_lang(s_ChanServ, u, MODULE_HELP_HEADER); - header_shown = 1; - } current->m->chanHelp(u); } else if ((service == 3) && current->m->memoHelp) { - if (header_shown == 0) { - notice_lang(s_MemoServ, u, MODULE_HELP_HEADER); - header_shown = 1; - } current->m->memoHelp(u); } else if ((service == 4) && current->m->botHelp) { - if (header_shown == 0) { - notice_lang(s_BotServ, u, MODULE_HELP_HEADER); - header_shown = 1; - } current->m->botHelp(u); } else if ((service == 5) && current->m->operHelp) { - if (header_shown == 0) { - notice_lang(s_OperServ, u, MODULE_HELP_HEADER); - header_shown = 1; - } current->m->operHelp(u); } else if ((service == 6) && current->m->hostHelp) { - if (header_shown == 0) { - notice_lang(s_HostServ, u, MODULE_HELP_HEADER); - header_shown = 1; - } current->m->hostHelp(u); } else if ((service == 7) && current->m->helpHelp) { - if (header_shown == 0) { - notice_lang(s_HelpServ, u, MODULE_HELP_HEADER); - header_shown = 1; - } current->m->helpHelp(u); } } } + + mod_current_module = calling_module; + mod_current_module_name = calling_module_name; #endif } @@ -1847,7 +1971,7 @@ int moduleAddData(ModuleData ** md, char *key, char *value) free(mod_name); return MOD_ERR_PARAMS; } - + if (mod_current_module_name == NULL) { alog("moduleAddData() called with mod_current_module_name being NULL"); if (debug) @@ -1901,8 +2025,9 @@ char *moduleGetData(ModuleData ** md, char *key) } while (current) { - if ((stricmp(current->moduleName, mod_name) == 0) && (stricmp(current->key, key) == 0)) { - free(mod_name); + if ((stricmp(current->moduleName, mod_name) == 0) + && (stricmp(current->key, key) == 0)) { + free(mod_name); return sstrdup(current->value); } current = current->next; @@ -1934,7 +2059,8 @@ void moduleDelData(ModuleData ** md, char *key) if (key) { while (current) { next = current->next; - if ((stricmp(current->moduleName, mod_name) == 0) && (stricmp(current->key, key) == 0)) { + if ((stricmp(current->moduleName, mod_name) == 0) + && (stricmp(current->key, key) == 0)) { if (prev) { prev->next = current->next; } else { @@ -2127,35 +2253,216 @@ const char *ano_moderr(void) /** * 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); +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; + char buf[1024]; + int linenum = 0; + int i; + int optind = 0; + int ac = 0; + char *av[MAXPARAMS]; + char *s, *t; + int retval; + + 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) { + s = myStrGetTokenRemainder(buf, '\t', 1); + } else { + dir = myStrGetOnlyToken(buf, ' ', 0); + if (dir) { + s = myStrGetTokenRemainder(buf, ' ', 1); + } else { + continue; + } + } + + if (stricmp(dir, d->name) == 0) { + if (s) { + 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++; } - l_ptr = levelinfo[++i]; + } + retval = parse_directive(d, dir, ac, av, linenum, 0, s); + } + } + 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)) { + 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 = LANG_EN_US; + char *s, *t, *buf; + + if ((mod_current_module_name) && (!mod_current_module)) { + mod_current_module = findModule(mod_current_module_name); + } + /* Find the users lang, and use it if we cant */ + if (u->na && u->na->nc) { + lang = u->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); + notice(source, u->nick, buffer); } + free(buf); + } else { + alog("%s: INVALID language string call, language: [%d], String [%d]", mod_current_module->name, lang, number); + } +} + +/** + * 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)) { + 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; } /* EOF */ diff --git a/src/modules/configure b/src/modules/configure index 119c7c887..4ce3dbd32 100755 --- a/src/modules/configure +++ b/src/modules/configure @@ -2,16 +2,23 @@ echo -n "SRCS=" > ./Makefile.inc FIRST=1 -for oldfile in *.c -do - if [ "$FIRST" = 1 ] ; then - echo -n " "$oldfile >> ./Makefile.inc - else - echo "\\" >> ./Makefile.inc - echo -n " " $oldfile >> ./Makefile.inc - fi - FIRST=0 -done + +LS=`ls *.c 2>/dev/null | wc -l ` +if [ "0" == "$LS" ] ; then + echo "*** no modules found" +else + for oldfile in *.c + do + if [ "$FIRST" = 1 ] ; then + echo -n " "$oldfile >> ./Makefile.inc + else + echo "\\" >> ./Makefile.inc + echo -n " " $oldfile >> ./Makefile.inc + fi + FIRST=0 + done +fi + echo "" >> ./Makefile.inc echo -n "SUBS=" >> ./Makefile.inc @@ -27,6 +34,9 @@ do echo -n " " $dir >> ./Makefile.inc fi FIRST=0 + if [ -f $dir/configure ] ; then + $dir/configure + fi fi fi done diff --git a/src/modules/cs_appendtopic.c b/src/modules/cs_appendtopic.c new file mode 100644 index 000000000..774ba35f1 --- /dev/null +++ b/src/modules/cs_appendtopic.c @@ -0,0 +1,188 @@ +#include "module.h" + +/* Original module: cs_appendtopic by SGR + * + * Included in the Anope module pack since 1.7.9 + * Anope Coder: GeniusDex <geniusdex@anope.org> + * + * 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. + */ + +#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 succesfully"); + + return MOD_CONT; +} + +void AnopeFini(void) +{ + alog("[cs_appendtopic] Unloaded succefully"); +} + +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, time(NULL)); + 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; +} + +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 */ + 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" + }; + + moduleInsertLanguage(LANG_EN_US, LNG_NUM_STRINGS, langtable_en_us); + moduleInsertLanguage(LANG_NL, LNG_NUM_STRINGS, langtable_nl); +} + +/* EOF */ diff --git a/src/modules/cs_enforce.c b/src/modules/cs_enforce.c new file mode 100644 index 000000000..9c6f0b796 --- /dev/null +++ b/src/modules/cs_enforce.c @@ -0,0 +1,334 @@ +/* cs_enforce - Add a /cs ENFORCE command to enforce various set + * options and channelmodes on a channel. + * + * (C) 2003-2005 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 5 + +#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 + +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; + char *what; + 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); + } else if (stricmp(what, "MODES") == 0) { + do_enforce_modes(c); + } else if (stricmp(what, "SECUREOPS") == 0) { + do_enforce_secureops(c); + } else if (stricmp(what, "RESTRICTED") == 0) { + do_enforce_restricted(c); + } else if (stricmp(what, "+R") == 0) { + do_enforce_cmode_R(c); + } else { + moduleNoticeLang(s_ChanServ, u, LNG_ENFORCE_SYNTAX); + } + } + + free(chan); + 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." + }; + + /* Dutch */ + 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." + }; + + moduleInsertLanguage(LANG_EN_US, LNG_NUM_STRINGS, langtable_en_us); + moduleInsertLanguage(LANG_NL, LNG_NUM_STRINGS, langtable_nl); +} + +/* EOF */ diff --git a/src/modules/cs_tban.c b/src/modules/cs_tban.c new file mode 100644 index 000000000..9f56211b9 --- /dev/null +++ b/src/modules/cs_tban.c @@ -0,0 +1,171 @@ +#include "module.h" + +#define AUTHOR "Rob" +#define VERSION "1" + +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(); + + 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\n" + "for a specified length of time.\n" + "If the ban is removed before hand, it will\n" + "NOT be replaced.", + "%s banned from %s, will auto-expire in %s" + }; + moduleInsertLanguage(LANG_EN_US, LANG_NUM_STRINGS, langtable_en_us); +} + + +/* EOF */ diff --git a/src/modules/catserv/Makefile b/src/modules/demos/catserv/Makefile index 5b2f4efa3..5b2f4efa3 100644 --- a/src/modules/catserv/Makefile +++ b/src/modules/demos/catserv/Makefile diff --git a/src/modules/catserv/README b/src/modules/demos/catserv/README index c3d3f7084..c3d3f7084 100644 --- a/src/modules/catserv/README +++ b/src/modules/demos/catserv/README diff --git a/src/modules/catserv/catserv_extern.h b/src/modules/demos/catserv/catserv_extern.h index 02c21addb..02c21addb 100644 --- a/src/modules/catserv/catserv_extern.h +++ b/src/modules/demos/catserv/catserv_extern.h diff --git a/src/modules/catserv/catserv_messages.c b/src/modules/demos/catserv/catserv_messages.c index e11235b4e..e11235b4e 100644 --- a/src/modules/catserv/catserv_messages.c +++ b/src/modules/demos/catserv/catserv_messages.c diff --git a/src/modules/catserv/catserv_messages.h b/src/modules/demos/catserv/catserv_messages.h index bb3f82dd0..bb3f82dd0 100644 --- a/src/modules/catserv/catserv_messages.h +++ b/src/modules/demos/catserv/catserv_messages.h diff --git a/src/modules/catserv/ircd_catserv.c b/src/modules/demos/catserv/ircd_catserv.c index 2fa7b52b3..ae34d6161 100644 --- a/src/modules/catserv/ircd_catserv.c +++ b/src/modules/demos/catserv/ircd_catserv.c @@ -10,7 +10,7 @@ #include "catserv_messages.h" #define AUTHOR "Anope" -#define VERSION "1.2" +#define VERSION "$Id$" int my_privmsg(char *source, int ac, char **av); diff --git a/src/modules/catserv/makefile.win32 b/src/modules/demos/catserv/makefile.win32 index 638704440..638704440 100644 --- a/src/modules/catserv/makefile.win32 +++ b/src/modules/demos/catserv/makefile.win32 diff --git a/src/modules/catserv/meow.c b/src/modules/demos/catserv/meow.c index 9279eec0b..9279eec0b 100644 --- a/src/modules/catserv/meow.c +++ b/src/modules/demos/catserv/meow.c diff --git a/src/modules/catserv/meow.h b/src/modules/demos/catserv/meow.h index 0f28673a0..0f28673a0 100644 --- a/src/modules/catserv/meow.h +++ b/src/modules/demos/catserv/meow.h diff --git a/src/modules/catserv/purr.c b/src/modules/demos/catserv/purr.c index 5a39dc26e..5a39dc26e 100644 --- a/src/modules/catserv/purr.c +++ b/src/modules/demos/catserv/purr.c diff --git a/src/modules/catserv/purr.h b/src/modules/demos/catserv/purr.h index a92e421f6..a92e421f6 100644 --- a/src/modules/catserv/purr.h +++ b/src/modules/demos/catserv/purr.h diff --git a/src/modules/demos/events.c b/src/modules/demos/events.c new file mode 100644 index 000000000..c61d62985 --- /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/hs_moo.c b/src/modules/demos/hs_moo.c index 0c3070036..b65e83bb6 100644 --- a/src/modules/hs_moo.c +++ b/src/modules/demos/hs_moo.c @@ -9,7 +9,7 @@ #include "module.h" #define AUTHOR "Anope" /* Set the Author for a modinfo reply */ -#define VERSION "1.1" /* Set the version 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); diff --git a/src/modules/events.c b/src/modules/events.c deleted file mode 100644 index af53a3d40..000000000 --- a/src/modules/events.c +++ /dev/null @@ -1,53 +0,0 @@ -/** - * 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 "1.1" - -int my_nick(char *source, int ac, char **av); -int my_save(char *message); - -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); - - 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(char *message) -{ - if (!stricmp(message, EVENT_START)) { - alog("Saving the databases! has started"); - } else { - alog("Saving the databases is complete"); - } - return MOD_CONT; -} - diff --git a/src/modules/makefile.inc.win32 b/src/modules/makefile.inc.win32 index f069be350..9b933f4a5 100644 --- a/src/modules/makefile.inc.win32 +++ b/src/modules/makefile.inc.win32 @@ -1,2 +1,2 @@ -SRCS=hs_moo.c events.c -SUBS=catserv +SRCS=cs_appendtopic.c cs_enforce.c cs_tban.c ns_maxemail.c ns_noop.c os_info.c +SUBS=test diff --git a/src/modules/makefile.win32 b/src/modules/makefile.win32 index f7a827ec8..61a3e250a 100644 --- a/src/modules/makefile.win32 +++ b/src/modules/makefile.win32 @@ -12,7 +12,6 @@ distclean: clean spotless .c.dll: $(CC) $(CFLAGS) $(IRCTYPE) $< $(LFLAGS) - subs: @for %i in ( $(SUBS) ); do \ @if exist %i; @cd %i && $(MAKE) $(MAKEARGS) && cd .. diff --git a/src/modules/ns_maxemail.c b/src/modules/ns_maxemail.c new file mode 100644 index 000000000..ac51d3d5c --- /dev/null +++ b/src/modules/ns_maxemail.c @@ -0,0 +1,190 @@ +/* ns_maxemail.c - Limit the amount of times an email address + * can be used for a NickServ account. + * + * (C) 2003-2005 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) + && (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); + + 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 (stricmp(set, "email") != 0) { + free(set); + return MOD_CONT; + } + + free(set); + email = myStrGetToken(cur_buffer, ' ', 1); + + 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." + }; + + moduleInsertLanguage(LANG_EN_US, LNG_NUM_STRINGS, langtable_en_us); + moduleInsertLanguage(LANG_NL, LNG_NUM_STRINGS, langtable_nl); +} + +/* EOF */ diff --git a/src/modules/ns_noop.c b/src/modules/ns_noop.c new file mode 100644 index 000000000..14662596b --- /dev/null +++ b/src/modules/ns_noop.c @@ -0,0 +1,483 @@ +/* ns_noop.c - Allows users to optionaly set autoop to off + * + * (C) 2003-2005 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); +void delete_ignore(const char *nick); + +/*************************************************************************/ + +/** + * 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 = NULL; + EvtHook *hook = NULL; + + int status; + + NSAutoOPDBName = NULL; + + moduleAddAuthor(AUTHOR); + moduleAddVersion(VERSION); + moduleSetType(SUPPORTED); + + alog("ns_noop: Loading configuration directives"); + if (mLoadConfig(0, NULL)) + return MOD_STOP; + + c = createCommand("autoop", noop, NULL, -1, -1, -1, -1, -1); + status = moduleAddCommand(NICKSERV, c, MOD_HEAD); + + hook = createEventHook(EVENT_JOIN_CHANNEL, mEventJoin); + status = moduleAddEventHook(hook); + + hook = createEventHook(EVENT_DB_SAVING, mSaveData); + status = moduleAddEventHook(hook); + + hook = createEventHook(EVENT_RELOAD, mLoadConfig); + status = moduleAddEventHook(hook); + + moduleAddHelp(c, myNickServAutoOpHelp); + moduleSetNickHelp(myNickServHelp); + + 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 (NSAutoOPDBName) + free(NSAutoOPDBName); +} + +/*************************************************************************/ + +/** + * Provide de user interface to set autoop on/off + * @param u The user who executed this command + * @return MOD_CONT + **/ +int noop(User * u) +{ + NickAlias *na = NULL; + char *toggleStr = strtok(NULL, ""); + + if (!nick_identified(u)) { + moduleNoticeLang(s_NickServ, u, AUTOOP_NO_NICK); + } else if (!toggleStr) { + if ((na = findnick(u->nick))) { + if (moduleGetData(&na->nc->moduleData, "autoop")) { + moduleNoticeLang(s_NickServ, u, AUTOOP_STATUS_OFF); + } else { + moduleNoticeLang(s_NickServ, u, AUTOOP_STATUS_ON); + } + } else { + moduleNoticeLang(s_NickServ, u, AUTOOP_SYNTAX); + } + } else { + if (strcasecmp(toggleStr, "on") == 0) { + setAutoOp(u); + moduleNoticeLang(s_NickServ, u, AUTOOP_ON); + } else if (strcasecmp(toggleStr, "off") == 0) { + UnsetAutoOp(u); + moduleNoticeLang(s_NickServ, u, AUTOOP_OFF); + } else { + moduleNoticeLang(s_NickServ, u, AUTOOP_SYNTAX); + } + } + return MOD_CONT; +} + +/** + * Toggle on/off the autoop feature by adding or + * deleting moduleData. + * @param u The user who executed this command + * @return 0 On success + **/ +int setAutoOp(User * u) +{ + NickAlias *na = NULL; + + if ((na = findnick(u->nick))) { + /* Remove the module data */ + moduleDelData(&na->nc->moduleData, "autoop"); + /* NickCore not found! */ + } else { + alog("ns_autoop.so: WARNING: Can not find NickAlias for %s", + u->nick); + } + + return 0; +} + +int UnsetAutoOp(User * u) +{ + NickAlias *na = NULL; + + if ((na = findnick(u->nick))) { + /* Add the module data to the user */ + moduleAddData(&na->nc->moduleData, "autoop", "off"); + /* NickCore not found! */ + } else { + alog("ns_autoop.so: WARNING: Can not find NickAlias for %s", + u->nick); + } + + return 0; +} + +/*************************************************************************/ + +/** + * Manage the JOIN_CHANNEL EVENT + * @return MOD_CONT + **/ +int mEventJoin(int argc, char **argv) +{ + User *user; + NickAlias *na = NULL; + + if (argc != 3) + return MOD_CONT; + + user = finduser(argv[1]); + /* Blame Rob if this user->na should be findnick(user->nick); -GD */ + if (user && (na = user->na)) { + if (strcmp(argv[0], EVENT_START) == 0) { + if (moduleGetData(&na->nc->moduleData, "autoop")) { + currentUser = user; + if (is_oper(user)) { + user->mode &= ~(anope_get_oper_mode()); + m_isIRCop = 1; + } + add_ignore(user->nick, 120); + } + } else { + /* Does the user have the autoop info in his moduleData? */ + if (moduleGetData(&na->nc->moduleData, "autoop")) { + /* The most dirty solution ever! - doc */ + if (m_isIRCop) + user->mode |= anope_get_oper_mode(); + delete_ignore(user->nick); + } + } + } + + return MOD_CONT; +} + +/*************************************************************************/ + +/** + * 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 (!feof(in)) { + 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))) { + moduleAddData(&na->nc->moduleData, "autoop", "off"); + } + free(name); + } + } + } + return ret; +} + +/** + * Save all our data to our db file + * First walk through the nick CORE list, and any nick core which has + * the autoop setting, write to the file. + * @return 0 for success + **/ +int mSaveData(int argc, char **argv) +{ + NickCore *nc = NULL; + int i = 0; + int ret = 0; + FILE *out; + + if (argc >= 1) { + if (stricmp(argv[0], EVENT_START) == 0) { + alog("ns_noop: Saving the databases has started!"); + if ((out = fopen(NSAutoOPDBName, "w")) == NULL) { + alog("ns_noop: ERROR: can not open the database file!"); + anope_cmd_global(s_NickServ, + "ns_noop: 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 (moduleGetData(&nc->moduleData, "autoop")) { + fprintf(out, "%s\n", nc->display); + } + } + } + fclose(out); + } + } else { + alog("ns_noop: Saving the databases is complete"); + ret = 0; + } + } + + 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; +} + +/*************************************************************************/ + +/** + * Below are the help funcitons :) + **/ +void myNickServHelp(User * u) +{ + moduleNoticeLang(s_NickServ, u, AUTOOP_DESC); +} + +int myNickServAutoOpHelp(User * u) +{ + moduleNoticeLang(s_NickServ, u, AUTOOP_SYNTAX); + moduleNoticeLang(s_NickServ, u, AUTOOP_HELP, s_ChanServ); + + return MOD_CONT; +} + +/*************************************************************************/ + +/** + * manages the multilanguage stuff + **/ +void m_AddLanguages(void) +{ + /* English (US) */ + char *langtable_en_us[] = { + /* AUTOOP_SYNTAX */ + "Syntax: AUTOOP [ON|OFF]", + /* AUTOOP_STATUS_ON */ + "Your current AUTOOP setting is ON", + /* AUTOOP_STATUS_OFF */ + "Your current AUTOOP setting is OFF", + /* AUTOOP_NO_NICK */ + "Only registered and identified nicknames can set this option", + /* AUTOOP_ON */ + "You will now be auto op'ed in channels when you join", + /* AUTOOP_OFF */ + "You will no longer be auto op'ed in channels when you join them", + /* AUTOOP_DESC */ + " AUTOOP Toggles auto-op'ing when joining rooms", + /* AUTOOP_HELP */ + "When set to ON, this command will prevent %s setting any\n" + "modes on you when you join any channel. This command requires\n" + "you to be identified." + }; + + /* Spanish */ + char *langtable_es[] = { + /* AUTOOP_SYNTAX */ + "Sintaxis: AUTOOP [ON|OFF]", + /* AUTOOP_STATUS_ON */ + "Tu configuracion actual de AUTOOP es ON", + /* AUTOOP_STATUS_OFF */ + "Tu configuracion actual de AUTOOP es OFF", + /* AUTOOP_NO_NICK */ + "Solo nicknames registrados e identificados pueden usar esta opcion", + /* AUTOOP_ON */ + "Recibiras OP automaticamente cuando entres a un canal.", + /* AUTOOP_OFF */ + "Ya no recibiras OP automaticamente.", + /* AUTOOP_DESC */ + " AUTOOP Cambia la opcion de auto-op cuando entras a un canal", + /* AUTOOP_HELP */ + "Cuando esta en ON, evitaras que ChanServ/BotServ\n" + "cambien tus modos en el canal que tengas acceso.\n", + "(Debes estar identificado para usar esta opcion)" + }; + + /* Dutch */ + char *langtable_nl[] = { + /* AUTOOP_SYNTAX */ + "Gebruik: AUTOOP [ON|OFF]", + /* AUTOOP_STATUS_ON */ + "Je huidige AUTOOP instelling is AAN", + /* AUTOOP_STATUS_OFF */ + "Je huidige AUTOOP instelling is UIT", + /* AUTOOP_NO_NICK */ + "Alleen geregistreerd en geidentificeerde nicks kunnen deze optie gebruiken", + /* AUTOOP_ON */ + "Je zal nu kanaal-op worden in kanalen wanneer je die binnen komt", + /* AUTOOP_OFF */ + "Je zal nu geen kanaal-op meer worden in kanalen wanneer je die binnen komt", + /* AUTOOP_DESC */ + " AUTOOP Zet auto-op aan of uit", + /* AUTOOP_HELP */ + "Wanner dit aan (ON) staat, zal dit commando er voor zorgen dat\n" + "%s geen kanaalmodes aan jou zal geven wanneer je een\n" + "kanaal binnen komt. Voor dit command is het vereist dat je\n" + "geidentificeerd bent." + }; + + 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); +} + +/*************************************************************************/ + +/** + * Deletes a nick from the ignore list + * @param nick nickname to unignore. + **/ +void delete_ignore(const char *nick) +{ + IgnoreData *ign, *prev; + IgnoreData **whichlist; + + if (!nick || !*nick) { + return; + } + + whichlist = &ignore[tolower(nick[0])]; + + for (ign = *whichlist, prev = NULL; ign; prev = ign, ign = ign->next) { + if (stricmp(ign->who, nick) == 0) + break; + } + if (ign) { + if (prev) + prev->next = ign->next; + else + *whichlist = ign->next; + free(ign); + ign = NULL; + } +} + +/* EOF */ diff --git a/src/modules/os_info.c b/src/modules/os_info.c new file mode 100644 index 000000000..1e29d0822 --- /dev/null +++ b/src/modules/os_info.c @@ -0,0 +1,639 @@ +/* os_info.c - Adds oper information lines to nicks/channels + * + * (C) 2003-2005 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 16 + +#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_1 6 +#define OINFO_HELP_2 7 +#define OINFO_HELP_3 8 +#define OINFO_HELP_4 9 +#define OCINFO_HELP_1 10 +#define OCINFO_HELP_2 11 +#define OCINFO_HELP_3 12 +#define OCINFO_HELP_4 13 +#define OINFO_HELP 14 +#define OCINFO_HELP 15 + +/*************************************************************************/ + +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 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_RELOAD, mEventReload); + status = moduleAddEventHook(hook); + + moduleSetNickHelp(mMainNickHelp); + moduleSetChanHelp(mMainChanHelp); + + mLoadData(); + m_AddLanguages(); + + return MOD_CONT; +} + +/** + * Unload the module + **/ +void AnopeFini(void) +{ + 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); + } + free(text); + } + 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); + } + free(text); + } + 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; + 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 (moduleGetData(&na->nc->moduleData, "info")) { + notice_user(s_NickServ, u, " OperInfo: %s", + moduleGetData(&na->nc->moduleData, + "info")); + } + /* NickCore not found! */ + } else { + /* we dont care! */ + } + free(nick); + } + free(text); + } + } + 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; + 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 (moduleGetData(&ci->moduleData, "info")) { + notice_user(s_ChanServ, u, " OperInfo: %s", + moduleGetData(&ci->moduleData, + "info")); + } + } + free(chan); + } + free(text); + } + } + 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 (!feof(in)) { + 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; + + if (argc >= 1) { + if (!stricmp(argv[0], EVENT_START)) { + alog("os_info: Saving the databases has started!"); + 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 (moduleGetData(&nc->moduleData, "info")) { + fprintf(out, "N %s %s\n", nc->display, + moduleGetData(&nc->moduleData, + "info")); + } + } + } + + + for (i = 0; i < 256; i++) { + for (ci = chanlists[i]; ci; ci = ci->next) { + /* If we have any info on this channel */ + if (moduleGetData(&ci->moduleData, "info")) { + fprintf(out, "C %s %s\n", ci->name, + moduleGetData(&ci->moduleData, + "info")); + } + } + } + fclose(out); + } + } else { + alog("os_info: Saving the databases is complete"); + ret = 0; + } + } + + return ret; +} + +/** + * Load the configuration directives from Services configuration file. + * @return 0 for success + **/ +int mLoadConfig(void) +{ + char *tmp = NULL; + + Directive directivas[] = { + {"OSInfoDBName", {{PARAM_SET, 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_1 */ + "Syntax: OINFO [ADD|DEL] nick <info>", + /* OINFO_HELP_2 */ + "Add or Delete Oper information for the given nick ", + /* OINFO_HELP_3 */ + "This will show up when any oper /ns info nick's the user.", + /* OINFO_HELP_4 */ + "and can be used for 'tagging' users etc....", + /* OCINFO_HELP_1 */ + "Syntax: OINFO [ADD|DEL] chan <info>", + /* OCINFO_HELP_2 */ + "Add or Delete Oper information for the given channel", + /* OCINFO_HELP_3 */ + "This will show up when any oper /ns info's the channel.", + /* OCINFO_HELP_4 */ + "and can be used for 'tagging' channels etc....", + /* OINFO_HELP */ + " OINFO Add / Del an OperInfo line to a nick", + /* OCINFO_HELP */ + " 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_1 */ + "Sintaxis: OINFO [ADD|DEL] nick <info>", + /* OINFO_HELP_2 */ + "Agrega o elimina informacion para Operadores al nick dado", + /* OINFO_HELP_3 */ + "Esto se mostrara cuando cualquier operador haga /ns info nick", + /* OINFO_HELP_4 */ + "y puede ser usado para 'marcado' de usuarios, etc....", + /* OCINFO_HELP_1 */ + "Sintaxis: OINFO [ADD|DEL] chan <info>", + /* OCINFO_HELP_2 */ + "Agrega o elimina informacion para Operadores al canal dado", + /* OCINFO_HELP_3 */ + "Esto se mostrara cuando cualquier operador haga /cs info canal", + /* OCINFO_HELP_4 */ + "y puede ser usado para 'marcado' de canales, etc....", + /* OINFO_HELP */ + " OINFO Agrega / Elimina una linea OperInfo al nick", + /* OCINFO_HELP */ + " OINFO Agrega / Elimina una linea OperInfo al canal" + }; + + moduleInsertLanguage(LANG_EN_US, LANG_NUM_STRINGS, langtable_en_us); + moduleInsertLanguage(LANG_ES, LANG_NUM_STRINGS, langtable_es); +} + +/*************************************************************************/ + +int mNickHelp(User * u) +{ + if (is_oper(u)) { + moduleNoticeLang(s_NickServ, u, OINFO_HELP_1); + moduleNoticeLang(s_NickServ, u, OINFO_HELP_2); + moduleNoticeLang(s_NickServ, u, OINFO_HELP_3); + moduleNoticeLang(s_NickServ, u, OINFO_HELP_4); + } 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_1); + moduleNoticeLang(s_ChanServ, u, OCINFO_HELP_2); + moduleNoticeLang(s_ChanServ, u, OCINFO_HELP_3); + moduleNoticeLang(s_ChanServ, u, OCINFO_HELP_4); + } 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); + } +} + +/* This help will be added to the main NickServ list */ +void mMainChanHelp(User * u) +{ + if (is_oper(u)) { + moduleNoticeLang(s_ChanServ, u, OCINFO_HELP); + } +} + +/*************************************************************************/ + +/* EOF */ diff --git a/src/news.c b/src/news.c index a85fbe4fa..1ea907226 100644 --- a/src/news.c +++ b/src/news.c @@ -321,7 +321,6 @@ void display_news(User * u, int16 type) /*************************************************************************/ /***************************** News editing ******************************/ /*************************************************************************/ - /* Declared in extern.h */ int do_logonnews(User * u) { @@ -329,6 +328,7 @@ int do_logonnews(User * u) return MOD_CONT; } + /* Declared in extern.h */ int do_opernews(User * u) { diff --git a/src/nickserv.c b/src/nickserv.c index 76dfcf21f..ac0cdd0ae 100644 --- a/src/nickserv.c +++ b/src/nickserv.c @@ -36,111 +36,21 @@ extern char *getvHost(char *nick); void alpha_insert_alias(NickAlias * na); void insert_core(NickCore * nc); void insert_requestnick(NickRequest * nr); -static NickAlias *makenick(const char *nick); -static NickRequest *makerequest(const char *nick); -static NickAlias *makealias(const char *nick, NickCore * nc); -static void change_core_display(NickCore * nc, char *newdisplay); +void change_core_display(NickCore * nc, char *newdisplay); -static void collide(NickAlias * na, int from_timeout); -static void release(NickAlias * na, int from_timeout); +void collide(NickAlias * na, int from_timeout); +void release(NickAlias * na, int from_timeout); static void add_ns_timeout(NickAlias * na, int type, time_t delay); -static void del_ns_timeout(NickAlias * na, int type); +void del_ns_timeout(NickAlias * na, int type); int delnickrequest(NickRequest * nr); NickRequest *findrequestnick(const char *nick); -static int do_sendregmail(User * u, NickRequest * nr); -static int do_setmodes(User * u); - -static int do_help(User * u); -static int do_register(User * u); -static int do_confirm(User * u); -static int do_group(User * u); -static int do_nickupdate(User * u); -static int do_identify(User * u); -static int do_logout(User * u); -static int do_drop(User * u); -static int do_set(User * u); -static int do_set_display(User * u, NickCore * nc, char *param); -static int do_set_password(User * u, NickCore * nc, char *param); -static int do_set_language(User * u, NickCore * nc, char *param); -static int do_set_url(User * u, NickCore * nc, char *param); -static int do_set_email(User * u, NickCore * nc, char *param); -static int do_set_greet(User * u, NickCore * nc, char *param); -static int do_set_icq(User * u, NickCore * nc, char *param); -static int do_set_kill(User * u, NickCore * nc, char *param); -static int do_set_secure(User * u, NickCore * nc, char *param); -static int do_set_private(User * u, NickCore * nc, char *param); -static int do_set_msg(User * u, NickCore * nc, char *param); -static int do_set_hide(User * u, NickCore * nc, char *param); -static int do_set_noexpire(User * u, NickAlias * nc, char *param); -static int do_access(User * u); -static int do_info(User * u); -static int do_list(User * u); -static int do_alist(User * u); -static int do_glist(User * u); -static int do_recover(User * u); -static int do_release(User * u); -static int do_ghost(User * u); -static int do_status(User * u); -static int do_getpass(User * u); -static int do_getemail(User * u); -static int do_sendpass(User * u); -static int do_forbid(User * u); -static int do_resend(User * u); -static int do_suspend(User * u); -static int do_unsuspend(User * u); - -/* Obsolete commands */ -static int do_link(User * u); -static int do_unlink(User * u); -static int do_listlinks(User * u); +int do_setmodes(User * u); /*************************************************************************/ /* *INDENT-OFF* */ void moduleAddNickServCmds(void) { - Command *c; - c = createCommand("HELP", do_help, NULL, -1, -1,-1,-1,-1); addCoreCommand(NICKSERV,c); - c = createCommand("REGISTER", do_register, NULL, NICK_HELP_REGISTER, -1,-1,-1,-1); addCoreCommand(NICKSERV,c); - c = createCommand("RESEND", do_resend, NULL, -1, -1,-1,-1,-1); addCoreCommand(NICKSERV,c); - c = createCommand("CONFIRM", do_confirm, NULL, -1, -1,-1,-1,-1); addCoreCommand(NICKSERV,c); - c = createCommand("GROUP", do_group, NULL, NICK_HELP_GROUP, -1,-1,-1,-1); addCoreCommand(NICKSERV,c); - c = createCommand("UPDATE", do_nickupdate, NULL, NICK_HELP_UPDATE, -1,-1,-1,-1); addCoreCommand(NICKSERV,c); - c = createCommand("ID", do_identify, NULL, NICK_HELP_IDENTIFY, -1,-1,-1,-1); addCoreCommand(NICKSERV,c); - c = createCommand("IDENTIFY", do_identify, NULL, NICK_HELP_IDENTIFY, -1,-1,-1,-1); addCoreCommand(NICKSERV,c); - c = createCommand("SIDENTIFY",do_identify, NULL, -1, -1,-1,-1,-1); addCoreCommand(NICKSERV,c); - c = createCommand("LOGOUT", do_logout, NULL, -1,NICK_HELP_LOGOUT, -1,NICK_SERVADMIN_HELP_LOGOUT, NICK_SERVADMIN_HELP_LOGOUT); addCoreCommand(NICKSERV,c); - c = createCommand("DROP", do_drop, NULL, -1,NICK_HELP_DROP, -1,NICK_SERVADMIN_HELP_DROP, NICK_SERVADMIN_HELP_DROP); addCoreCommand(NICKSERV,c); - c = createCommand("LINK", do_link, NULL, -1, -1,-1,-1,-1); addCoreCommand(NICKSERV,c); - c = createCommand("UNLINK", do_unlink, NULL, -1, -1,-1,-1,-1); addCoreCommand(NICKSERV,c); - c = createCommand("LISTLINKS",do_listlinks, NULL, -1, -1,-1,-1,-1); addCoreCommand(NICKSERV,c); - c = createCommand("ACCESS", do_access, NULL, NICK_HELP_ACCESS, -1,-1,-1,-1); addCoreCommand(NICKSERV,c); - c = createCommand("SET", do_set, NULL, NICK_HELP_SET,-1, -1,NICK_SERVADMIN_HELP_SET, NICK_SERVADMIN_HELP_SET); addCoreCommand(NICKSERV,c); - c = createCommand("SET DISPLAY", NULL, NULL, NICK_HELP_SET_DISPLAY, -1,-1,-1,-1); addCoreCommand(NICKSERV,c); - c = createCommand("SET PASSWORD", NULL, NULL, NICK_HELP_SET_PASSWORD, -1,-1,-1,-1); addCoreCommand(NICKSERV,c); - c = createCommand("SET URL", NULL, NULL, NICK_HELP_SET_URL, -1,-1,-1,-1); addCoreCommand(NICKSERV,c); - c = createCommand("SET EMAIL", NULL, NULL, NICK_HELP_SET_EMAIL, -1,-1,-1,-1); addCoreCommand(NICKSERV,c); - c = createCommand("SET ICQ", NULL, NULL, NICK_HELP_SET_ICQ, -1,-1,-1,-1); addCoreCommand(NICKSERV,c); - c = createCommand("SET GREET", NULL, NULL, NICK_HELP_SET_GREET, -1,-1,-1,-1); addCoreCommand(NICKSERV,c); - c = createCommand("SET KILL", NULL, NULL, NICK_HELP_SET_KILL, -1,-1,-1,-1); addCoreCommand(NICKSERV,c); - c = createCommand("SET SECURE", NULL, NULL, NICK_HELP_SET_SECURE, -1,-1,-1,-1); addCoreCommand(NICKSERV,c); - c = createCommand("SET PRIVATE", NULL, NULL, NICK_HELP_SET_PRIVATE, -1,-1,-1,-1); addCoreCommand(NICKSERV,c); - c = createCommand("SET MSG", NULL, NULL, NICK_HELP_SET_MSG, -1,-1,-1,-1); addCoreCommand(NICKSERV,c); - c = createCommand("SET HIDE", NULL, NULL, NICK_HELP_SET_HIDE, -1,-1,-1,-1); addCoreCommand(NICKSERV,c); - c = createCommand("SET NOEXPIRE", NULL, NULL, -1, -1,-1,NICK_SERVADMIN_HELP_SET_NOEXPIRE,NICK_SERVADMIN_HELP_SET_NOEXPIRE); addCoreCommand(NICKSERV,c); - c = createCommand("RECOVER", do_recover, NULL, NICK_HELP_RECOVER, -1,-1,-1,-1); addCoreCommand(NICKSERV,c); - c = createCommand("RELEASE", do_release, NULL, NICK_HELP_RELEASE, -1,-1,-1,-1); addCoreCommand(NICKSERV,c); - c = createCommand("GHOST", do_ghost, NULL, NICK_HELP_GHOST, -1,-1,-1,-1); addCoreCommand(NICKSERV,c); - c = createCommand("INFO", do_info, NULL, NICK_HELP_INFO,-1, NICK_HELP_INFO, NICK_SERVADMIN_HELP_INFO,NICK_SERVADMIN_HELP_INFO); addCoreCommand(NICKSERV,c); - c = createCommand("LIST", do_list, NULL, -1,NICK_HELP_LIST, -1,NICK_SERVADMIN_HELP_LIST, NICK_SERVADMIN_HELP_LIST); addCoreCommand(NICKSERV,c); - c = createCommand("ALIST", do_alist, NULL, -1,NICK_HELP_ALIST, -1,NICK_SERVADMIN_HELP_ALIST, NICK_SERVADMIN_HELP_ALIST); addCoreCommand(NICKSERV,c); - c = createCommand("GLIST", do_glist, NULL, -1,NICK_HELP_GLIST, -1,NICK_SERVADMIN_HELP_GLIST, NICK_SERVADMIN_HELP_GLIST); addCoreCommand(NICKSERV,c); - c = createCommand("STATUS", do_status, NULL, NICK_HELP_STATUS, -1,-1,-1,-1); addCoreCommand(NICKSERV,c); - c = createCommand("SENDPASS", do_sendpass, NULL, NICK_HELP_SENDPASS, -1,-1,-1,-1); addCoreCommand(NICKSERV,c); - c = createCommand("GETPASS", do_getpass, is_services_admin, -1,-1, -1,NICK_SERVADMIN_HELP_GETPASS, NICK_SERVADMIN_HELP_GETPASS); addCoreCommand(NICKSERV,c); - c = createCommand("GETEMAIL", do_getemail, is_services_admin, -1,-1, -1,NICK_SERVADMIN_HELP_GETEMAIL, NICK_SERVADMIN_HELP_GETEMAIL); addCoreCommand(NICKSERV,c); - c = createCommand("FORBID", do_forbid, is_services_admin, -1,-1, -1,NICK_SERVADMIN_HELP_FORBID, NICK_SERVADMIN_HELP_FORBID); addCoreCommand(NICKSERV,c); - c = createCommand("SUSPEND", do_suspend, is_services_admin, -1,-1, -1,NICK_SERVADMIN_HELP_SUSPEND, NICK_SERVADMIN_HELP_SUSPEND); addCoreCommand(NICKSERV,c); - c = createCommand("UNSUSPEND",do_unsuspend,is_services_admin, -1,-1, -1,NICK_SERVADMIN_HELP_UNSUSPEND, NICK_SERVADMIN_HELP_UNSUSPEND); addCoreCommand(NICKSERV,c); + modules_core_init(NickServCoreNumber, NickServCoreModules); } /* *INDENT-ON* */ /*************************************************************************/ @@ -1240,7 +1150,7 @@ void expire_nicks() (na->nc->email ? na->nc->email : "none")); tmpnick = sstrdup(na->nick); delnick(na); - send_event(EVENT_NICK_EXPIRE, tmpnick); + send_event(EVENT_NICK_EXPIRE, 1, tmpnick); free(tmpnick); } } @@ -1451,67 +1361,12 @@ void insert_requestnick(NickRequest * nr) } /*************************************************************************/ -/* Creates a new Nick Request */ -static NickRequest *makerequest(const char *nick) -{ - NickRequest *nr; - - nr = scalloc(1, sizeof(NickRequest)); - nr->nick = sstrdup(nick); - insert_requestnick(nr); - alog("%s: Nick %s has been requested", s_NickServ, nr->nick); - return nr; -} - - - -/* Creates a full new nick (alias + core) in NickServ database. */ - -static NickAlias *makenick(const char *nick) -{ - NickAlias *na; - NickCore *nc; - - /* First make the core */ - nc = scalloc(1, sizeof(NickCore)); - nc->display = sstrdup(nick); - slist_init(&nc->aliases); - insert_core(nc); - alog("%s: group %s has been created", s_NickServ, nc->display); - - /* Then make the alias */ - na = scalloc(1, sizeof(NickAlias)); - na->nick = sstrdup(nick); - na->nc = nc; - slist_add(&nc->aliases, na); - alpha_insert_alias(na); - return na; -} - -/*************************************************************************/ - -/* Creates a new alias in NickServ database. */ - -static NickAlias *makealias(const char *nick, NickCore * nc) -{ - NickAlias *na; - - /* Just need to make the alias */ - na = scalloc(1, sizeof(NickAlias)); - na->nick = sstrdup(nick); - na->nc = nc; - slist_add(&nc->aliases, na); - alpha_insert_alias(na); - return na; -} - -/*************************************************************************/ /* Sets nc->display to newdisplay. If newdisplay is NULL, it will change * it to the first alias in the list. */ -static void change_core_display(NickCore * nc, char *newdisplay) +void change_core_display(NickCore * nc, char *newdisplay) { if (!newdisplay) { NickAlias *na; @@ -1745,7 +1600,7 @@ int delnick(NickAlias * na) * This is watched for and done in cancel_user(). -TheShadow */ -static void collide(NickAlias * na, int from_timeout) +void collide(NickAlias * na, int from_timeout) { char guestnick[NICKMAX]; @@ -1779,7 +1634,7 @@ static void collide(NickAlias * na, int from_timeout) /* Release hold on a nick. */ -static void release(NickAlias * na, int from_timeout) +void release(NickAlias * na, int from_timeout) { if (!from_timeout) del_ns_timeout(na, TO_RELEASE); @@ -1905,7 +1760,7 @@ void add_ns_timeout(NickAlias * na, int type, time_t delay) /* Delete a collide/release timeout. */ -static void del_ns_timeout(NickAlias * na, int type) +void del_ns_timeout(NickAlias * na, int type) { struct my_timeout *t, *t2; @@ -1962,675 +1817,6 @@ void clean_ns_timeouts(NickAlias * na) /*************************************************************************/ /*********************** NickServ command routines ***********************/ /*************************************************************************/ - -/* Return a help message. */ - -static int do_help(User * u) -{ - char *cmd = strtok(NULL, ""); - - if (!cmd) { - notice_help(s_NickServ, u, NICK_HELP); - if (NSExpire >= 86400) - notice_help(s_NickServ, u, NICK_HELP_EXPIRES, - NSExpire / 86400); - if (is_services_oper(u)) - notice_help(s_NickServ, u, NICK_SERVADMIN_HELP); - moduleDisplayHelp(1, u); - } else if (stricmp(cmd, "SET LANGUAGE") == 0) { - int i; - notice_help(s_NickServ, u, NICK_HELP_SET_LANGUAGE); - for (i = 0; i < NUM_LANGS && langlist[i] >= 0; i++) - notice_user(s_NickServ, u, " %2d) %s", i + 1, - langnames[langlist[i]]); - } else { - mod_help_cmd(s_NickServ, u, NICKSERV, cmd); - } - return MOD_CONT; -} - -/*************************************************************************/ - -/* Register a nick. */ - -static int do_register(User * u) -{ - NickRequest *nr = NULL, *anr = NULL; - 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 (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 (email && !MailValidate(email)) { - notice_lang(s_NickServ, u, MAIL_X_INVALID, email); - } else { -#ifdef USE_ENCRYPTION - if (strlen(pass) > PASSMAX) { - pass[PASSMAX] = 0; - notice_lang(s_NickServ, u, PASSWORD_TRUNCATED, PASSMAX); - } -#else - if (strlen(pass) > PASSMAX - 1) { /* -1 for null byte */ - pass[PASSMAX] = 0; - notice_lang(s_NickServ, u, PASSWORD_TRUNCATED, PASSMAX - 1); - } -#endif - 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); - nr->password = sstrdup(pass); - if (email) { - nr->email = sstrdup(email); - } - nr->requested = time(NULL); - if (NSEmailReg) { - if (do_sendregmail(u, nr) == 0) { - notice_lang(s_NickServ, u, NICK_ENTER_REG_CODE, email, - s_NickServ); - alog("%s: sent registration verification code to %s", - s_NickServ, nr->email); - } else { - alog("%s: Unable to send registration verification mail", - s_NickServ); - notice_lang(s_NickServ, u, NICK_REG_UNABLE); - delnickrequest(nr); /* Delete the NickRequest if we couldnt send the mail */ - return MOD_CONT; - } - } else { - do_confirm(u); - } - - } - return MOD_CONT; -} - - -static int do_resend(User * u) -{ - NickRequest *nr = NULL; - if (NSEmailReg) { - if ((nr = findrequestnick(u->nick))) { - if (do_sendregmail(u, nr) == 0) { - notice_lang(s_NickServ, u, NICK_REG_RESENT, nr->email); - alog("%s: re-sent registration verification code for %s to %s", s_NickServ, nr->nick, nr->email); - } else { - alog("%s: Unable to re-send registration verification mail for %s", s_NickServ, nr->nick); - return MOD_CONT; - } - } - } - return MOD_CONT; -} - -static int do_sendregmail(User * u, NickRequest * nr) -{ - MailInfo *mail = NULL; - char buf[BUFSIZE]; - - if (!(nr || u)) { - return -1; - } - snprintf(buf, sizeof(buf), getstring2(NULL, NICK_REG_MAIL_SUBJECT), - nr->nick); - mail = MailRegBegin(u, nr, buf, s_NickServ); - if (!mail) { - return -1; - } - fprintf(mail->pipe, getstring2(NULL, NICK_REG_MAIL_HEAD)); - fprintf(mail->pipe, "\n\n"); - fprintf(mail->pipe, getstring2(NULL, NICK_REG_MAIL_LINE_1), nr->nick); - fprintf(mail->pipe, "\n\n"); - fprintf(mail->pipe, getstring2(NULL, NICK_REG_MAIL_LINE_2), s_NickServ, - nr->passcode); - fprintf(mail->pipe, "\n\n"); - fprintf(mail->pipe, getstring2(NULL, NICK_REG_MAIL_LINE_3)); - fprintf(mail->pipe, "\n\n"); - fprintf(mail->pipe, getstring2(NULL, NICK_REG_MAIL_LINE_4)); - fprintf(mail->pipe, "\n\n"); - fprintf(mail->pipe, getstring2(NULL, NICK_REG_MAIL_LINE_5), - NetworkName); - fprintf(mail->pipe, "\n.\n"); - MailEnd(mail); - return 0; -} - -static int do_confirm(User * u) -{ - - NickRequest *nr = NULL; - NickAlias *na = NULL; - char *passcode = strtok(NULL, " "); - char *pass = NULL; - char *email = NULL; - int forced = 0; - User *utmp = NULL; -#ifdef USE_ENCRYPTION - int len; -#endif - nr = findrequestnick(u->nick); - - if (NSEmailReg) { - if (!passcode) { - notice_lang(s_NickServ, u, NICK_CONFIRM_INVALID); - return MOD_CONT; - } - - if (!nr) { - if (is_services_admin(u)) { -/* If an admin, thier nick is obviously already regged, so look at the passcode to get the nick - of the user they are trying to validate, and push that user through regardless of passcode */ - nr = findrequestnick(passcode); - if (nr) { - utmp = finduser(passcode); - if (utmp) { - sprintf(passcode, - "FORCE_ACTIVATION_DUE_TO_OPER_CONFIRM %s", - nr->passcode); - passcode = strtok(passcode, " "); - notice_lang(s_NickServ, u, NICK_FORCE_REG, - nr->nick); - do_confirm(utmp); - return MOD_CONT; - } else { - passcode = sstrdup(nr->passcode); - forced = 1; - } - } else { - notice_lang(s_NickServ, u, NICK_CONFIRM_NOT_FOUND, - s_NickServ); - return MOD_CONT; - } - } else { - notice_lang(s_NickServ, u, NICK_CONFIRM_NOT_FOUND, - s_NickServ); - return MOD_CONT; - } - } - - if (stricmp(nr->passcode, passcode) != 0) { - notice_lang(s_NickServ, u, NICK_CONFIRM_INVALID); - return MOD_CONT; - } - } - - if (!nr) { - notice_lang(s_NickServ, u, NICK_REGISTRATION_FAILED); - return MOD_CONT; - } - pass = sstrdup(nr->password); - - if (nr->email) { - email = sstrdup(nr->email); - } - na = makenick(nr->nick); - - if (na) { - int i; - char tsbuf[16]; - -#ifdef USE_ENCRYPTION - len = strlen(pass); - na->nc->pass = smalloc(PASSMAX); - if (encrypt(pass, len, na->nc->pass, PASSMAX) < 0) { - memset(pass, 0, strlen(pass)); - alog("%s: Failed to encrypt password for %s (register)", - s_NickServ, nr->nick); - notice_lang(s_NickServ, u, NICK_REGISTRATION_FAILED); - return MOD_CONT; - } - memset(pass, 0, strlen(pass)); - na->status = (int16) (NS_IDENTIFIED | NS_RECOGNIZED); - na->nc->flags |= NI_ENCRYPTEDPW; -#else - na->nc->pass = sstrdup(pass); - na->status = (int16) (NS_IDENTIFIED | NS_RECOGNIZED); -#endif - na->nc->flags |= NSDefFlags; - for (i = 0; i < RootNumber; i++) { - if (!stricmp(ServicesRoots[i], nr->nick)) { - na->nc->flags |= NI_SERVICES_ROOT; - break; - } - } - na->nc->memos.memomax = MSMaxMemos; - na->nc->channelmax = CSMaxReg; - if (forced == 1) { - na->last_usermask = sstrdup("*@*"); - na->last_realname = sstrdup("unknown"); - } else { - na->last_usermask = - scalloc(strlen(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, u->nick); -#ifndef USE_ENCRYPTION - notice_lang(s_NickServ, u, NICK_PASSWORD_IS, na->nc->pass); -#endif - u->lastnickreg = time(NULL); - if (ircd->modeonreg) { - if (ircd->tsonmode) { - snprintf(tsbuf, sizeof(tsbuf), "%lu", - (unsigned long int) u->timestamp); - common_svsmode(u, ircd->modeonreg, tsbuf); - } else { - common_svsmode(u, ircd->modeonreg, 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; -} - -/*************************************************************************/ - -/* Register a nick in a specified group. */ - -static int do_group(User * u) -{ - NickAlias *na, *target; - NickCore *nc; - char *nick = strtok(NULL, " "); - char *pass = strtok(NULL, " "); - int i; - char tsbuf[16]; - - 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 (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 tried to use GROUP from SUSPENDED nick %s", - s_NickServ, u->username, u->host, u->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 = findnick(nick))) { - notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, nick); - } else if (target && (target->nc->flags & NI_SUSPENDED)) { - alog("%s: %s@%s tried to use GROUP from SUSPENDED nick %s", - s_NickServ, u->username, u->host, u->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 (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, 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) { - if (ircd->tsonmode) { - common_svsmode(u, ircd->modeonreg, tsbuf); - } else { - common_svsmode(u, ircd->modeonreg, 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; -} - -/*************************************************************************/ - -static int do_nickupdate(User * u) -{ - NickAlias *na; - - if (!nick_identified(u)) { - notice_lang(s_NickServ, u, NICK_IDENTIFY_REQUIRED, s_NickServ); - } else { - na = u->na; - if (NSModeOnID) - do_setmodes(u); - check_memos(u); - if (na->last_realname) - free(na->last_realname); - na->last_realname = sstrdup(u->realname); - na->status |= NS_IDENTIFIED; - na->last_seen = time(NULL); - if (ircd->vhost) { - do_on_id(u); - } - notice_lang(s_NickServ, u, NICK_UPDATE_SUCCESS, s_NickServ); - } - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_identify(User * u) -{ - char *pass = strtok(NULL, " "); - NickAlias *na; - NickRequest *nr; - int res; - char tsbuf[16]; - - 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 = 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) { - if (ircd->tsonmode) { - common_svsmode(u, ircd->modeonreg, tsbuf); - } else { - common_svsmode(u, ircd->modeonreg, ""); - } - } - send_event(EVENT_NICK_IDENTIFY, 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; -} - int should_mode_change(int16 status, int16 mode) { switch (mode) { @@ -2678,7 +1864,9 @@ int should_mode_change(int16 status, int16 mode) return 1; } -static int do_setmodes(User * u) +/*************************************************************************/ + +int do_setmodes(User * u) { struct u_chanlist *uc; Channel *c; @@ -2692,1765 +1880,6 @@ static int do_setmodes(User * u) } /*************************************************************************/ - -static int do_logout(User * u) -{ - char *nick = strtok(NULL, " "); - char *param = strtok(NULL, " "); - User *u2; - - if (!is_services_admin(u) && nick) { - syntax_error(s_NickServ, u, "LOGOUT", NICK_LOGOUT_SYNTAX); - } else if (!(u2 = (nick ? finduser(nick) : u))) { - notice_lang(s_NickServ, u, NICK_X_NOT_IN_USE, nick); - } else if (!u2->na) { - if (nick) - notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, nick); - else - notice_lang(s_NickServ, u, NICK_NOT_REGISTERED); - } else if (u2->na->status & NS_VERBOTEN) { - notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, u2->na->nick); - } else if (!nick && !nick_identified(u)) { - notice_lang(s_NickServ, u, NICK_IDENTIFY_REQUIRED, s_NickServ); - } else if (nick && is_services_admin(u2)) { - notice_lang(s_NickServ, u, NICK_LOGOUT_SERVICESADMIN, nick); - } else { - if (nick && param && !stricmp(param, "REVALIDATE")) { - cancel_user(u2); - validate_user(u2); - } else { - u2->na->status &= ~(NS_IDENTIFIED | NS_RECOGNIZED); - } - - 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) - nsStopNickTracking(u); - - /* Clear any timers again */ - if (u->na->nc->flags & NI_KILLPROTECT) { - del_ns_timeout(u->na, TO_COLLIDE); - } - - } - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_drop(User * u) -{ - char *nick = strtok(NULL, " "); - NickAlias *na; - NickRequest *nr = NULL; - int is_servadmin = is_services_admin(u); - int is_mine; /* Does the nick being dropped belong to the user that is dropping? */ - 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, (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; -} - -/*************************************************************************/ - -static int do_set(User * u) -{ - char *cmd = strtok(NULL, " "); - char *param = strtok(NULL, " "); - - NickAlias *na; - int is_servadmin = is_services_admin(u); - int set_nick = 0; - - if (readonly) { - notice_lang(s_NickServ, u, NICK_SET_DISABLED); - return MOD_CONT; - } - - if (is_servadmin && cmd && (na = findnick(cmd))) { - cmd = param; - param = strtok(NULL, " "); - set_nick = 1; - } else { - na = u->na; - } - - if (!param - && (!cmd - || (stricmp(cmd, "URL") != 0 && stricmp(cmd, "EMAIL") != 0 - && stricmp(cmd, "GREET") != 0 - && stricmp(cmd, "ICQ") != 0))) { - if (is_servadmin) { - syntax_error(s_NickServ, u, "SET", NICK_SET_SERVADMIN_SYNTAX); - } else { - syntax_error(s_NickServ, u, "SET", NICK_SET_SYNTAX); - } - } else if (!na) { - notice_lang(s_NickServ, u, NICK_NOT_REGISTERED); - } else if (na->status & NS_VERBOTEN) { - notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, na->nick); - } else if (na->nc->flags & NI_SUSPENDED) { - notice_lang(s_NickServ, u, NICK_X_SUSPENDED, na->nick); - } else if (!is_servadmin && !nick_identified(u)) { - notice_lang(s_NickServ, u, NICK_IDENTIFY_REQUIRED, s_NickServ); - } else if (stricmp(cmd, "DISPLAY") == 0) { - do_set_display(u, na->nc, param); - } else if (stricmp(cmd, "PASSWORD") == 0) { - do_set_password(u, na->nc, param); - } else if (stricmp(cmd, "LANGUAGE") == 0) { - do_set_language(u, na->nc, param); - } else if (stricmp(cmd, "URL") == 0) { - do_set_url(u, na->nc, param); - } else if (stricmp(cmd, "EMAIL") == 0) { - do_set_email(u, na->nc, param); - } else if (stricmp(cmd, "ICQ") == 0) { - do_set_icq(u, na->nc, param); - } else if (stricmp(cmd, "GREET") == 0) { - do_set_greet(u, na->nc, param); - } else if (stricmp(cmd, "KILL") == 0) { - do_set_kill(u, na->nc, param); - } else if (stricmp(cmd, "SECURE") == 0) { - do_set_secure(u, na->nc, param); - } else if (stricmp(cmd, "PRIVATE") == 0) { - do_set_private(u, na->nc, param); - } else if (stricmp(cmd, "MSG") == 0) { - do_set_msg(u, na->nc, param); - } else if (stricmp(cmd, "HIDE") == 0) { - do_set_hide(u, na->nc, param); - } else if (stricmp(cmd, "NOEXPIRE") == 0) { - do_set_noexpire(u, na, param); - } else { - if (is_servadmin) - notice_lang(s_NickServ, u, NICK_SET_UNKNOWN_OPTION_OR_BAD_NICK, - cmd); - else - notice_lang(s_NickServ, u, NICK_SET_UNKNOWN_OPTION, cmd); - } - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_set_display(User * u, NickCore * nc, char *param) -{ - int i; - NickAlias *na; - - /* First check whether param is a valid nick of the group */ - for (i = 0; i < nc->aliases.count; i++) { - na = nc->aliases.list[i]; - if (!stricmp(na->nick, param)) { - param = na->nick; /* Because case may differ */ - break; - } - } - - if (i == nc->aliases.count) { - notice_lang(s_NickServ, u, NICK_SET_DISPLAY_INVALID); - return MOD_CONT; - } - - change_core_display(nc, param); - notice_lang(s_NickServ, u, NICK_SET_DISPLAY_CHANGED, nc->display); - - /* Enable nick tracking if enabled */ - if (NSNickTracking) - nsStartNickTracking(u); - - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_set_password(User * u, NickCore * nc, char *param) -{ - int len = strlen(param); - - if (NSSecureAdmins && u->na->nc != nc && nick_is_services_admin(nc) - && !is_services_root(u)) { - notice_lang(s_NickServ, u, PERMISSION_DENIED); - return MOD_CONT; - } else if (stricmp(nc->display, param) == 0 - || (StrictPasswords && len < 5)) { - notice_lang(s_NickServ, u, MORE_OBSCURE_PASSWORD); - return MOD_CONT; - } - - if (nc->pass) - free(nc->pass); - -#ifdef USE_ENCRYPTION - nc->pass = smalloc(PASSMAX); - - if (encrypt(param, len, nc->pass, PASSMAX) < 0) { - memset(param, 0, len); - alog("%s: Failed to encrypt password for %s (set)", s_NickServ, - nc->display); - notice_lang(s_NickServ, u, NICK_SET_PASSWORD_FAILED); - return MOD_CONT; - } - - memset(param, 0, len); - notice_lang(s_NickServ, u, NICK_SET_PASSWORD_CHANGED); -#else - nc->pass = sstrdup(param); - notice_lang(s_NickServ, u, NICK_SET_PASSWORD_CHANGED_TO, nc->pass); -#endif - - if (u->na && u->na->nc != nc && is_services_admin(u)) { - alog("%s: %s!%s@%s used SET PASSWORD as Services admin on %s (e-mail: %s)", s_NickServ, u->nick, u->username, u->host, nc->display, (nc->email ? nc->email : "none")); - if (WallSetpass) - anope_cmd_global(s_NickServ, - "\2%s\2 used SET PASSWORD as Services admin on \2%s\2", - u->nick, nc->display); - } else { - alog("%s: %s!%s@%s (e-mail: %s) changed its password.", s_NickServ, - u->nick, u->username, u->host, - (nc->email ? nc->email : "none")); - } - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_set_language(User * u, NickCore * nc, char *param) -{ - int langnum; - - if (param[strspn(param, "0123456789")] != 0) { /* i.e. not a number */ - syntax_error(s_NickServ, u, "SET LANGUAGE", - NICK_SET_LANGUAGE_SYNTAX); - return MOD_CONT; - } - langnum = atoi(param) - 1; - if (langnum < 0 || langnum >= NUM_LANGS || langlist[langnum] < 0) { - notice_lang(s_NickServ, u, NICK_SET_LANGUAGE_UNKNOWN, langnum + 1, - s_NickServ); - return MOD_CONT; - } - nc->language = langlist[langnum]; - notice_lang(s_NickServ, u, NICK_SET_LANGUAGE_CHANGED); - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_set_url(User * u, NickCore * nc, char *param) -{ - if (nc->url) - free(nc->url); - - if (param) { - nc->url = sstrdup(param); - notice_lang(s_NickServ, u, NICK_SET_URL_CHANGED, param); - } else { - nc->url = NULL; - notice_lang(s_NickServ, u, NICK_SET_URL_UNSET); - } - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_set_email(User * u, NickCore * nc, char *param) -{ - if (!param && NSForceEmail) { - notice_lang(s_NickServ, u, NICK_SET_EMAIL_UNSET_IMPOSSIBLE); - return MOD_CONT; - } else if (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; - } - - if (u->na && u->na->nc != nc && is_services_admin(u)) { - alog("%s: %s!%s@%s used SET EMAIL as Services admin on %s (e-mail: %s)", s_NickServ, u->nick, u->username, u->host, nc->display, (nc->email ? nc->email : "none")); - } else { - 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; -} - -/*************************************************************************/ - -static int do_set_icq(User * u, NickCore * nc, char *param) -{ - if (param) { - int32 tmp = atol(param); - if (!tmp) { - notice_lang(s_NickServ, u, NICK_SET_ICQ_INVALID, param); - } else { - nc->icq = tmp; - notice_lang(s_NickServ, u, NICK_SET_ICQ_CHANGED, param); - } - } else { - nc->icq = 0; - notice_lang(s_NickServ, u, NICK_SET_ICQ_UNSET); - } - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_set_greet(User * u, NickCore * nc, char *param) -{ - if (nc->greet) - free(nc->greet); - - if (param) { - char buf[BUFSIZE]; - char *end = strtok(NULL, ""); - - snprintf(buf, sizeof(buf), "%s%s%s", param, (end ? " " : ""), - (end ? end : "")); - - nc->greet = sstrdup(buf); - notice_lang(s_NickServ, u, NICK_SET_GREET_CHANGED, buf); - } else { - nc->greet = NULL; - notice_lang(s_NickServ, u, NICK_SET_GREET_UNSET); - } - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_set_kill(User * u, NickCore * nc, char *param) -{ - if (stricmp(param, "ON") == 0) { - nc->flags |= NI_KILLPROTECT; - nc->flags &= ~(NI_KILL_QUICK | NI_KILL_IMMED); - notice_lang(s_NickServ, u, NICK_SET_KILL_ON); - } else if (stricmp(param, "QUICK") == 0) { - nc->flags |= NI_KILLPROTECT | NI_KILL_QUICK; - nc->flags &= ~NI_KILL_IMMED; - notice_lang(s_NickServ, u, NICK_SET_KILL_QUICK); - } else if (stricmp(param, "IMMED") == 0) { - if (NSAllowKillImmed) { - nc->flags |= NI_KILLPROTECT | NI_KILL_IMMED; - nc->flags &= ~NI_KILL_QUICK; - notice_lang(s_NickServ, u, NICK_SET_KILL_IMMED); - } else { - notice_lang(s_NickServ, u, NICK_SET_KILL_IMMED_DISABLED); - } - } else if (stricmp(param, "OFF") == 0) { - nc->flags &= ~(NI_KILLPROTECT | NI_KILL_QUICK | NI_KILL_IMMED); - notice_lang(s_NickServ, u, NICK_SET_KILL_OFF); - } else { - syntax_error(s_NickServ, u, "SET KILL", - NSAllowKillImmed ? NICK_SET_KILL_IMMED_SYNTAX : - NICK_SET_KILL_SYNTAX); - } - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_set_secure(User * u, NickCore * nc, char *param) -{ - if (stricmp(param, "ON") == 0) { - nc->flags |= NI_SECURE; - notice_lang(s_NickServ, u, NICK_SET_SECURE_ON); - } else if (stricmp(param, "OFF") == 0) { - nc->flags &= ~NI_SECURE; - notice_lang(s_NickServ, u, NICK_SET_SECURE_OFF); - } else { - syntax_error(s_NickServ, u, "SET SECURE", NICK_SET_SECURE_SYNTAX); - } - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_set_private(User * u, NickCore * nc, char *param) -{ - if (stricmp(param, "ON") == 0) { - nc->flags |= NI_PRIVATE; - notice_lang(s_NickServ, u, NICK_SET_PRIVATE_ON); - } else if (stricmp(param, "OFF") == 0) { - nc->flags &= ~NI_PRIVATE; - notice_lang(s_NickServ, u, NICK_SET_PRIVATE_OFF); - } else { - syntax_error(s_NickServ, u, "SET PRIVATE", - NICK_SET_PRIVATE_SYNTAX); - } - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_set_msg(User * u, NickCore * nc, char *param) -{ - if (!UsePrivmsg) { - notice_lang(s_NickServ, u, NICK_SET_OPTION_DISABLED, "MSG"); - return MOD_CONT; - } - - if (stricmp(param, "ON") == 0) { - nc->flags |= NI_MSG; - notice_lang(s_NickServ, u, NICK_SET_MSG_ON); - } else if (stricmp(param, "OFF") == 0) { - nc->flags &= ~NI_MSG; - notice_lang(s_NickServ, u, NICK_SET_MSG_OFF); - } else { - syntax_error(s_NickServ, u, "SET MSG", NICK_SET_MSG_SYNTAX); - } - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_set_hide(User * u, NickCore * nc, char *param) -{ - int flag, onmsg, offmsg; - - if (stricmp(param, "EMAIL") == 0) { - flag = NI_HIDE_EMAIL; - onmsg = NICK_SET_HIDE_EMAIL_ON; - offmsg = NICK_SET_HIDE_EMAIL_OFF; - } else if (stricmp(param, "USERMASK") == 0) { - flag = NI_HIDE_MASK; - onmsg = NICK_SET_HIDE_MASK_ON; - offmsg = NICK_SET_HIDE_MASK_OFF; - } else if (stricmp(param, "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; -} - -/*************************************************************************/ - -static int do_set_noexpire(User * u, NickAlias * na, char *param) -{ - if (!is_services_admin(u)) { - notice_lang(s_NickServ, u, PERMISSION_DENIED); - return MOD_CONT; - } - if (!param) { - syntax_error(s_NickServ, u, "SET NOEXPIRE", - NICK_SET_NOEXPIRE_SYNTAX); - return MOD_CONT; - } - if (stricmp(param, "ON") == 0) { - na->status |= NS_NO_EXPIRE; - notice_lang(s_NickServ, u, NICK_SET_NOEXPIRE_ON, na->nick); - } else if (stricmp(param, "OFF") == 0) { - na->status &= ~NS_NO_EXPIRE; - notice_lang(s_NickServ, u, NICK_SET_NOEXPIRE_OFF, na->nick); - } else { - syntax_error(s_NickServ, u, "SET NOEXPIRE", - NICK_SET_NOEXPIRE_SYNTAX); - } - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_link(User * u) -{ - notice_lang(s_NickServ, u, OBSOLETE_COMMAND, "GROUP"); - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_unlink(User * u) -{ - notice_lang(s_NickServ, u, OBSOLETE_COMMAND, "DROP"); - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_listlinks(User * u) -{ - notice_lang(s_NickServ, u, OBSOLETE_COMMAND, "GLIST"); - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_access(User * u) -{ - char *cmd = strtok(NULL, " "); - char *mask = strtok(NULL, " "); - NickAlias *na; - int i; - char **access; - - if (cmd && stricmp(cmd, "LIST") == 0 && mask && is_services_admin(u) - && (na = findnick(mask))) { - - if (na->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; -} - -/*************************************************************************/ - -/* Show hidden info to nick owners and sadmins when the "ALL" parameter is - * supplied. If a nick is online, the "Last seen address" changes to "Is - * online from". - * Syntax: INFO <nick> {ALL} - * -TheShadow (13 Mar 1999) - */ - -static int do_info(User * u) -{ - char *nick = strtok(NULL, " "); - char *param = strtok(NULL, " "); - - NickAlias *na; - NickRequest *nr = NULL; - int is_servadmin = is_services_admin(u); - - 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; - } - - notice_lang(s_NickServ, u, NICK_INFO_OPTIONS, - *buf ? buf : getstring(u->na, NICK_INFO_OPT_NONE)); - - if (na->nc->flags & NI_SUSPENDED) { - notice_lang(s_NickServ, u, NICK_INFO_SUSPENDED, - na->last_quit); - } - - 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; -} - -/*************************************************************************/ - -/* SADMINS can search for nicks based on their NS_VERBOTEN and NS_NO_EXPIRE - * status. The keywords FORBIDDEN and NOEXPIRE represent these two states - * respectively. These keywords should be included after the search pattern. - * Multiple keywords are accepted and should be separated by spaces. Only one - * of the keywords needs to match a nick's state for the nick to be displayed. - * Forbidden nicks can be identified by "[Forbidden]" appearing in the last - * seen address field. Nicks with NOEXPIRE set are preceeded by a "!". Only - * SADMINS will be shown forbidden nicks and the "!" indicator. - * Syntax for sadmins: LIST pattern [FORBIDDEN] [NOEXPIRE] - * -TheShadow - */ - -static int do_list(User * u) -{ - char *pattern = strtok(NULL, " "); - char *keyword; - NickAlias *na; - NickCore *mync; - int nnicks, i; - char buf[BUFSIZE]; - int is_servadmin = is_services_admin(u); - int16 matchflags = 0; - NickRequest *nr = NULL; - int nronly = 0; - char noexpire_char = ' '; - int count = 0, from = 0, to = 0; - char *tmp = NULL; - char *s = NULL; - - if (NSListOpersOnly && !(is_oper(u))) { - notice_lang(s_NickServ, u, PERMISSION_DENIED); - return MOD_CONT; - } - - if (!pattern) { - syntax_error(s_NickServ, u, "LIST", - is_servadmin ? NICK_LIST_SERVADMIN_SYNTAX : - NICK_LIST_SYNTAX); - } else { - - if (pattern) { - if (pattern[0] == '#') { - tmp = myStrGetOnlyToken((pattern + 1), '-', 0); /* Read FROM out */ - if (!tmp) { - return MOD_CONT; - } - for (s = tmp; *s; s++) { - if (!isdigit(*s)) { - return MOD_CONT; - } - } - from = atoi(tmp); - tmp = myStrGetTokenRemainder(pattern, '-', 1); /* Read TO out */ - if (!tmp) { - return MOD_CONT; - } - for (s = tmp; *s; s++) { - if (!isdigit(*s)) { - return MOD_CONT; - } - } - to = atoi(tmp); - pattern = sstrdup("*"); - } - } - - nnicks = 0; - - while (is_servadmin && (keyword = strtok(NULL, " "))) { - if (stricmp(keyword, "FORBIDDEN") == 0) - matchflags |= NS_VERBOTEN; - if (stricmp(keyword, "NOEXPIRE") == 0) - matchflags |= NS_NO_EXPIRE; - if (stricmp(keyword, "UNCONFIRMED") == 0) - nronly = 1; - } - - mync = (nick_identified(u) ? u->na->nc : NULL); - - notice_lang(s_NickServ, u, NICK_LIST_HEADER, pattern); - if (nronly != 1) { - for (i = 0; i < 1024; i++) { - for (na = nalists[i]; na; na = na->next) { - /* Don't show private and forbidden nicks to non-services admins. */ - if ((na->status & NS_VERBOTEN) && !is_servadmin) - continue; - if ((na->nc->flags & NI_PRIVATE) && !is_servadmin - && na->nc != mync) - continue; - if ((matchflags != 0) && !(na->status & matchflags)) - continue; - - /* We no longer compare the pattern against the output buffer. - * Instead we build a nice nick!user@host buffer to compare. - * The output is then generated separately. -TheShadow */ - snprintf(buf, sizeof(buf), "%s!%s", na->nick, - (na->last_usermask - && !(na->status & NS_VERBOTEN)) ? na-> - last_usermask : "*@*"); - if (stricmp(pattern, na->nick) == 0 - || match_wild_nocase(pattern, buf)) { - - if ((((count + 1 >= from) && (count + 1 <= to)) - || ((from == 0) && (to == 0))) - && (++nnicks <= NSListMax)) { - if (is_servadmin - && (na->status & NS_NO_EXPIRE)) - noexpire_char = '!'; - else { - noexpire_char = ' '; - } - if ((na->nc->flags & NI_HIDE_MASK) - && !is_servadmin && na->nc != mync) { - snprintf(buf, sizeof(buf), - "%-20s [Hostname Hidden]", - na->nick); - } else if (na->status & NS_VERBOTEN) { - snprintf(buf, sizeof(buf), - "%-20s [Forbidden]", na->nick); - } else { - snprintf(buf, sizeof(buf), "%-20s %s", - na->nick, na->last_usermask); - } - notice_user(s_NickServ, u, " %c%s", - noexpire_char, buf); - } - count++; - } - } - } - } - - if (nronly == 1 || (is_servadmin && matchflags == 0)) { - noexpire_char = ' '; - for (i = 0; i < 1024; i++) { - for (nr = nrlists[i]; nr; nr = nr->next) { - snprintf(buf, sizeof(buf), "%s!*@*", nr->nick); - if (stricmp(pattern, nr->nick) == 0 - || match_wild_nocase(pattern, buf)) { - if (++nnicks <= NSListMax) { - snprintf(buf, sizeof(buf), - "%-20s [UNCONFIRMED]", nr->nick); - notice_user(s_NickServ, u, " %c%s", - noexpire_char, buf); - } - } - } - } - } - notice_lang(s_NickServ, u, NICK_LIST_RESULTS, - nnicks > NSListMax ? NSListMax : nnicks, nnicks); - } - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_glist(User * u) -{ - char *nick = strtok(NULL, " "); - - NickAlias *na, *na2; - int 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; -} - -/*************************************************************************/ - -/** - * List the channels that the given nickname has access on - * - * /ns ALIST [level] - * /ns ALIST [nickname] [level] - * - * -jester - */ -static int do_alist(User * u) -{ - char *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)) { - char *xop; - - xop = get_xop_level(level); - - notice_lang(s_NickServ, u, NICK_ALIST_XOP_FORMAT, - match_count, - ((ci-> - flags & CI_NO_EXPIRE) ? '!' : ' '), - ci->name, xop, - (ci->desc ? ci->desc : "")); - } else { - notice_lang(s_NickServ, u, - NICK_ALIST_ACCESS_FORMAT, match_count, - ((ci-> - flags & CI_NO_EXPIRE) ? '!' : ' '), - ci->name, level, - (ci->desc ? ci->desc : "")); - - } - } - } - } - - notice_lang(s_NickServ, u, NICK_ALIST_FOOTER, match_count, - chan_count); - } - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_recover(User * u) -{ - char *nick = strtok(NULL, " "); - char *pass = strtok(NULL, " "); - NickAlias *na; - User *u2; - - if (!nick) { - syntax_error(s_NickServ, u, "RECOVER", NICK_RECOVER_SYNTAX); - } else if (!(u2 = finduser(nick))) { - notice_lang(s_NickServ, u, NICK_X_NOT_IN_USE, nick); - } else if (!(na = u2->na)) { - notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, nick); - } else if (na->status & NS_VERBOTEN) { - notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, na->nick); - } else if (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 = check_password(pass, na->nc->pass); - - if (res == 1) { - notice_lang(s_NickServ, u2, FORCENICKCHANGE_NOW); - collide(na, 0); - notice_lang(s_NickServ, u, NICK_RECOVERED, s_NickServ, nick); - } else { - notice_lang(s_NickServ, u, ACCESS_DENIED); - if (res == 0) { - alog("%s: RECOVER: invalid password for %s by %s!%s@%s", - s_NickServ, nick, u->nick, u->username, 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; -} - -/*************************************************************************/ - -static int do_release(User * u) -{ - char *nick = strtok(NULL, " "); - char *pass = strtok(NULL, " "); - NickAlias *na; - - if (!nick) { - syntax_error(s_NickServ, u, "RELEASE", NICK_RELEASE_SYNTAX); - } else if (!(na = findnick(nick))) { - notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, nick); - } else if (na->status & NS_VERBOTEN) { - notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, na->nick); - } else if (na->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 = 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; -} - -/*************************************************************************/ - -static int do_ghost(User * u) -{ - char *nick = strtok(NULL, " "); - char *pass = strtok(NULL, " "); - NickAlias *na; - User *u2; - - if (!nick) { - syntax_error(s_NickServ, u, "GHOST", NICK_GHOST_SYNTAX); - } else if (!(u2 = finduser(nick))) { - notice_lang(s_NickServ, u, NICK_X_NOT_IN_USE, nick); - } else if (!(na = u2->na)) { - notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, nick); - } else if (na->status & NS_VERBOTEN) { - notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, na->nick); - } else if (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 = check_password(pass, na->nc->pass); - if (res == 1) { - char buf[NICKMAX + 32]; - snprintf(buf, sizeof(buf), "GHOST command used by %s", - u->nick); - if (LimitSessions) { - del_session(u2->host); - } - 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); - if (LimitSessions) { - del_session(u2->host); - } - 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; -} - -/*************************************************************************/ - -static 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; -} - -/*************************************************************************/ -/* A simple call to check for all emails that a user may have registered */ -/* with. It returns the nicks that match the email you provide. Wild */ -/* Cards are not excepted. Must use user@email-host. */ -/*************************************************************************/ -static int do_getemail(User * u) -{ - char *email = strtok(NULL, " "); - int i, j = 0; - NickCore *nc; - - if (!email) { - syntax_error(s_NickServ, u, "GETMAIL", NICK_GETEMAIL_SYNTAX); - return MOD_CONT; - } - alog("%s: %s!%s@%s used GETEMAIL on %s", s_NickServ, u->nick, - u->username, 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; -} - -/**************************************************************************/ - -static int do_getpass(User * u) -{ -#ifndef USE_ENCRYPTION - char *nick = strtok(NULL, " "); - NickAlias *na; - NickRequest *nr = NULL; -#endif - - /* Assumes that permission checking has already been done. */ -#ifdef USE_ENCRYPTION - notice_lang(s_NickServ, u, NICK_GETPASS_UNAVAILABLE); -#else - if (!nick) { - syntax_error(s_NickServ, u, "GETPASS", NICK_GETPASS_SYNTAX); - } else if (!(na = findnick(nick))) { - if ((nr = findrequestnick(nick))) { - alog("%s: %s!%s@%s used GETPASS on %s", s_NickServ, u->nick, - u->username, 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 { - 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, - na->nc->pass); - } -#endif - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_sendpass(User * u) -{ -#ifndef USE_ENCRYPTION - char *nick = strtok(NULL, " "); - NickAlias *na; -#endif - -#ifdef USE_ENCRYPTION - notice_lang(s_NickServ, u, NICK_SENDPASS_UNAVAILABLE); -#else - if (!nick) { - syntax_error(s_NickServ, u, "SENDPASS", NICK_SENDPASS_SYNTAX); - } else if (RestrictMail && !is_oper(u)) { - notice_lang(s_NickServ, u, PERMISSION_DENIED); - } else if (!(na = findnick(nick))) { - notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, nick); - } else if (na->status & NS_VERBOTEN) { - notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, na->nick); - } else { - char buf[BUFSIZE]; - MailInfo *mail; - - snprintf(buf, sizeof(buf), getstring(na, NICK_SENDPASS_SUBJECT), - na->nick); - mail = MailBegin(u, na->nc, buf, s_NickServ); - if (!mail) - return MOD_CONT; - - fprintf(mail->pipe, getstring(na, NICK_SENDPASS_HEAD)); - fprintf(mail->pipe, "\n\n"); - fprintf(mail->pipe, getstring(na, NICK_SENDPASS_LINE_1), na->nick); - fprintf(mail->pipe, "\n\n"); - fprintf(mail->pipe, getstring(na, NICK_SENDPASS_LINE_2), - na->nc->pass); - fprintf(mail->pipe, "\n\n"); - fprintf(mail->pipe, getstring(na, NICK_SENDPASS_LINE_3)); - fprintf(mail->pipe, "\n\n"); - fprintf(mail->pipe, getstring(na, NICK_SENDPASS_LINE_4)); - fprintf(mail->pipe, "\n\n"); - fprintf(mail->pipe, getstring(na, NICK_SENDPASS_LINE_5), - NetworkName); - fprintf(mail->pipe, "\n.\n"); - - MailEnd(mail); - - alog("%s: %s!%s@%s used SENDPASS on %s", s_NickServ, u->nick, - u->username, u->host, nick); - notice_lang(s_NickServ, u, NICK_SENDPASS_OK, nick); - } -#endif - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_forbid(User * u) -{ - NickAlias *na; - char *nick = strtok(NULL, " "); - char *reason = strtok(NULL, ""); - - /* Assumes that permission checking has already been done. */ - if (!nick || (ForceForbidReason && !reason)) { - syntax_error(s_NickServ, u, "FORBID", - (ForceForbidReason ? NICK_FORBID_SYNTAX_REASON : - NICK_FORBID_SYNTAX)); - return MOD_CONT; - } - - if (readonly) - notice_lang(s_NickServ, u, READ_ONLY_MODE); - if ((na = findnick(nick)) != NULL) { - if (NSSecureAdmins && nick_is_services_admin(na->nc) - && !is_services_root(u)) { - notice_lang(s_NickServ, u, PERMISSION_DENIED); - return MOD_CONT; - } - delnick(na); - } - na = makenick(nick); - if (na) { - na->status |= NS_VERBOTEN; - na->last_usermask = sstrdup(u->nick); - if (reason) - na->last_realname = sstrdup(reason); - - na->u = finduser(na->nick); - if (na->u) - na->u->na = na; - - if (na->u) { - notice_lang(s_NickServ, na->u, FORCENICKCHANGE_NOW); - collide(na, 0); - } - - - if (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, 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; -} - -/*************************************************************************/ - -static int do_suspend(User * u) -{ - - NickAlias *na; - char *nick = strtok(NULL, " "); - char *reason = strtok(NULL, ""); - - 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->status &= ~(NS_IDENTIFIED | NS_RECOGNIZED); - na->nc->flags &= ~(NI_KILLPROTECT | NI_KILL_QUICK | NI_KILL_IMMED); - na->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, 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; -} - -/*************************************************************************/ - -static 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, 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; - -} - -/*************************************************************************/ - -int ns_do_register(User * u) -{ - return do_register(u); -} - -/*************************************************************************/ /* * Nick tracking */ diff --git a/src/operserv.c b/src/operserv.c index 42b1b94b5..08b42ad15 100644 --- a/src/operserv.c +++ b/src/operserv.c @@ -15,23 +15,16 @@ #include "services.h" #include "pseudo.h" -extern Module *mod_current_module; -extern int mod_current_op; -extern User *mod_current_user; -extern ModuleHash *MODULE_HASH[MAX_CMD_HASH]; /*************************************************************************/ -struct clone { - char *host; - long time; -}; + /* List of most recent users - statically initialized to zeros */ -static struct clone clonelist[CLONE_DETECT_SIZE]; +struct clone clonelist[CLONE_DETECT_SIZE]; /* Which hosts have we warned about, and when? This is used to keep us * from sending out notices over and over for clones from the same host. */ -static struct clone warnings[CLONE_DETECT_SIZE]; +struct clone warnings[CLONE_DETECT_SIZE]; /* List of Services administrators */ SList servadmins; @@ -42,8 +35,6 @@ SList akills, sglines, sqlines, szlines; /*************************************************************************/ -static void get_operserv_stats(long *nrec, long *memuse); - static int compare_adminlist_entries(SList * slist, void *item1, void *item2); static int compare_operlist_entries(SList * slist, void *item1, @@ -60,66 +51,20 @@ 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); -static int do_help(User * u); -static int do_global(User * u); -static int do_stats(User * u); -static int do_admin(User * u); -static int do_oper(User * u); -static int do_os_mode(User * u); -static int do_clearmodes(User * u); -static int do_os_kick(User * u); -static int do_akill(User * u); -static int do_sgline(User * u); -static int do_sqline(User * u); -static int do_szline(User * u); -static int do_set(User * u); -static int do_noop(User * u); -static int do_jupe(User * u); -static int do_raw(User * u); -static int do_update(User * u); -static int do_reload(User * u); -static int do_os_quit(User * u); -static int do_shutdown(User * u); -static int do_restart(User * u); -static int do_ignorelist(User * u); -static int do_clearignore(User * u); -static int do_killclones(User * u); -static int do_chanlist(User * u); -static int do_userlist(User * u); -static int do_ignoreuser(User * u); -static int do_staff(User * u); -static int do_defcon(User * u); -static int do_chankill(User * u); -static void defcon_sendlvls(User * u); -char *defconReverseModes(const char *modes); -int DefConModesSet = 0; +void resetDefCon(int level); + time_t DefContimer; +int DefConModesSet = 0; void runDefCon(void); -void resetDefCon(int level); +char *defconReverseModes(const char *modes); void oper_global(char *nick, char *fmt, ...); -#ifdef USE_MODULES -int do_modload(User * u); -int do_modunload(User * u); -int do_modlist(User * u); -int do_modinfo(User * u); -static int showModuleCmdLoaded(CommandHash * cmdList, char *mod_name, - User * u); -static int showModuleMsgLoaded(MessageHash * msgList, char *mod_name, - User * u); -#endif - -static int do_operumodes(User * u); -static int do_svsnick(User * u); -static int do_operoline(User * u); #ifdef DEBUG_COMMANDS static int send_clone_lists(User * u); static int do_matchwild(User * u); #endif -/* OperServ restart needs access to this if were gonna avoid sending ourself a signal */ -extern int do_restart_services(void); void moduleAddOperServCmds(void); /*************************************************************************/ @@ -140,70 +85,9 @@ SListOpts szopts = { 0, NULL, &is_szline_entry_equal, &free_szline_entry }; /* *INDENT-OFF* */ void moduleAddOperServCmds(void) { Command *c; - c = createCommand("HELP", do_help, NULL, -1, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("GLOBAL", do_global, NULL, OPER_HELP_GLOBAL, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("STATS", do_stats, NULL, OPER_HELP_STATS, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("UPTIME", do_stats, NULL, OPER_HELP_STATS, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - - /* Anyone can use the LIST option to the ADMIN and OPER commands; those - * routines check privileges to ensure that only authorized users - * modify the list. */ - c = createCommand("ADMIN", do_admin, NULL, OPER_HELP_ADMIN, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("OPER", do_oper, NULL, OPER_HELP_OPER, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("STAFF", do_staff, NULL, OPER_HELP_STAFF, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - /* Similarly, anyone can use *NEWS LIST, but *NEWS {ADD,DEL} are - * reserved for Services admins. */ - c = createCommand("LOGONNEWS", do_logonnews, NULL, NEWS_HELP_LOGON, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("OPERNEWS", do_opernews, NULL, NEWS_HELP_OPER, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("RANDOMNEWS", do_randomnews, NULL, NEWS_HELP_RANDOM, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - - /* Commands for Services opers: */ - c = createCommand("MODE", do_os_mode, is_services_oper,OPER_HELP_MODE, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("CLEARMODES", do_clearmodes, is_services_oper,OPER_HELP_CLEARMODES, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("KICK", do_os_kick, is_services_oper,OPER_HELP_KICK, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("KILLCLONES", do_killclones, is_services_oper,OPER_HELP_KILLCLONES, -1,-1,-1, -1); addCoreCommand(OPERSERV,c); - c = createCommand("AKILL", do_akill, is_services_oper,OPER_HELP_AKILL, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("SGLINE", do_sgline, is_services_oper,OPER_HELP_SGLINE, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("SQLINE", do_sqline, is_services_oper,OPER_HELP_SQLINE, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("SZLINE", do_szline, is_services_oper,OPER_HELP_SZLINE, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - - /* Commands for Services admins: */ - c = createCommand("SET", do_set, is_services_admin,OPER_HELP_SET, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("SET LIST", NULL, NULL,OPER_HELP_SET_LIST, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("SET READONLY", NULL, NULL,OPER_HELP_SET_READONLY, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("SET LOGCHAN", NULL, NULL,OPER_HELP_SET_LOGCHAN, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("SET DEBUG", NULL, NULL,OPER_HELP_SET_DEBUG, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("SET NOEXPIRE", NULL, NULL,OPER_HELP_SET_NOEXPIRE, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("SET IGNORE", NULL, NULL,OPER_HELP_SET_IGNORE, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("SET SUPERADMIN", NULL, NULL,OPER_HELP_SET_SUPERADMIN, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); -#ifdef USE_MYSQL - c = createCommand("SET SQL", NULL, NULL,OPER_HELP_SET_SQL, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); -#endif - c = createCommand("SVSNICK", do_svsnick, is_services_admin,OPER_HELP_SVSNICK, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("UMODE", do_operumodes, is_services_admin,OPER_HELP_UMODE, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("NOOP", do_noop, is_services_admin,OPER_HELP_NOOP, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("JUPE", do_jupe, is_services_admin,OPER_HELP_JUPE, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("RAW", do_raw, is_services_admin,OPER_HELP_RAW, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("IGNORE", do_ignoreuser, is_services_admin,OPER_HELP_IGNORE, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("OLINE", do_operoline, is_services_admin,OPER_HELP_OLINE, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("UPDATE", do_update, is_services_admin,OPER_HELP_UPDATE, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("RELOAD", do_reload, is_services_admin,OPER_HELP_RELOAD, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("QUIT", do_os_quit, is_services_admin,OPER_HELP_QUIT, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("SHUTDOWN", do_shutdown, is_services_admin,OPER_HELP_SHUTDOWN, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("RESTART", do_restart, is_services_admin,OPER_HELP_RESTART, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("SESSION", do_session, is_services_admin,OPER_HELP_SESSION, -1,-1,-1, -1); addCoreCommand(OPERSERV,c); - c = createCommand("EXCEPTION", do_exception, is_services_admin,OPER_HELP_EXCEPTION, -1,-1,-1, -1); addCoreCommand(OPERSERV,c); - c = createCommand("CHANLIST", do_chanlist, is_services_admin,OPER_HELP_CHANLIST, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("USERLIST", do_userlist, is_services_admin,OPER_HELP_USERLIST, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("DEFCON", do_defcon, is_services_admin, OPER_HELP_DEFCON,-1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("CHANKILL", do_chankill, is_services_admin, OPER_HELP_CHANKILL,-1,-1,-1,-1); addCoreCommand(OPERSERV,c); - /* Commands for Services root: */ -#ifdef USE_MODULES - c = createCommand("MODLOAD", do_modload, is_services_root, -1,-1,-1,-1,OPER_HELP_MODLOAD); addCoreCommand(OPERSERV,c); - c = createCommand("MODUNLOAD", do_modunload, is_services_root, -1,-1,-1,-1,OPER_HELP_MODUNLOAD); addCoreCommand(OPERSERV,c); - c = createCommand("MODLIST", do_modlist, is_services_root, -1,-1,-1,-1,OPER_HELP_MODLIST); addCoreCommand(OPERSERV,c); - c = createCommand("MODINFO", do_modinfo, is_services_root, -1,-1,-1,-1,OPER_HELP_MODINFO); addCoreCommand(OPERSERV,c); -#endif + + 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); @@ -278,88 +162,6 @@ void operserv(User * u, char *buf) } } -static void get_operserv_stats(long *nrec, long *memuse) -{ - int i; - long mem = 0, count = 0, mem2 = 0, count2 = 0; - Akill *ak; - SXLine *sx; - - if (CheckClones) { - mem = sizeof(struct clone) * CLONE_DETECT_SIZE * 2; - for (i = 0; i < CLONE_DETECT_SIZE; i++) { - if (clonelist[i].host) { - count++; - mem += strlen(clonelist[i].host) + 1; - } - if (warnings[i].host) { - count++; - mem += strlen(warnings[i].host) + 1; - } - } - } - - count += akills.count; - mem += akills.capacity; - 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; -} - /*************************************************************************/ /**************************** Privilege checks ***************************/ /*************************************************************************/ @@ -915,73 +717,8 @@ static int send_clone_lists(User * u) /*********************** OperServ command functions **********************/ /*************************************************************************/ -/* HELP command. */ - -static int do_help(User * u) -{ - const char *cmd = strtok(NULL, ""); - - if (!cmd) { - notice_help(s_OperServ, u, OPER_HELP); - if (is_services_oper(u)) { - notice_help(s_OperServ, u, OPER_HELP_OPER_CMD); - if (ircd->sgline || ircd->sqline || ircd->szline) { - notice_help(s_OperServ, u, OPER_HELP_OPER_CMD_EXTRA); - } - if (ircd->sgline) { - notice_help(s_OperServ, u, OPER_HELP_OPER_CMD_SGLINE); - } - if (ircd->sqline) { - notice_help(s_OperServ, u, OPER_HELP_OPER_CMD_SQLINE); - } - if (ircd->szline) { - notice_help(s_OperServ, u, OPER_HELP_OPER_CMD_SZLINE); - } - } - if (is_services_admin(u)) { - notice_help(s_OperServ, u, OPER_HELP_ADMIN_CMD); - if (ircd->svsnick || ircd->omode || ircd->umode) { - notice_help(s_OperServ, u, OPER_HELP_ADMIN_CMD_EXTRA); - } - if (ircd->svsnick) { - notice_help(s_OperServ, u, OPER_HELP_ADMIN_CMD_SVSNICK); - } - if (ircd->omode) { - notice_help(s_OperServ, u, OPER_HELP_ADMIN_CMD_OLINE); - } - if (ircd->umode) { - notice_help(s_OperServ, u, OPER_HELP_ADMIN_CMD_UMODE); - } - } -#ifdef USE_MODULES - if (is_services_root(u)) { - notice_help(s_OperServ, u, OPER_HELP_ROOT_CMD); - } -#endif - moduleDisplayHelp(5, u); - notice_help(s_OperServ, u, OPER_HELP_LOGGED); - } else { - mod_help_cmd(s_OperServ, u, OPERSERV, cmd); - } - return MOD_CONT; -} - /*************************************************************************/ -static int do_global(User * u) -{ - char *msg = strtok(NULL, ""); - - if (!msg) { - syntax_error(s_OperServ, u, "GLOBAL", OPER_GLOBAL_SYNTAX); - return MOD_CONT; - } - if (WallOSGlobal) - anope_cmd_global(s_OperServ, "\2%s\2 just used GLOBAL command.", - u->nick); - oper_global(u->nick, "%s", msg); - return MOD_CONT; -} Server *server_global(Server * s, char *msg) { @@ -1023,934 +760,10 @@ void oper_global(char *nick, char *fmt, ...) } -/*************************************************************************/ - -/* STATS command. */ - -static int do_stats(User * u) -{ - time_t uptime = time(NULL) - start_time; - char *extra = strtok(NULL, ""); - int days = uptime / 86400, hours = (uptime / 3600) % 24, - mins = (uptime / 60) % 60, secs = uptime % 60; - struct tm *tm; - char timebuf[64]; - - if (extra && stricmp(extra, "ALL") != 0) { - if (stricmp(extra, "AKILL") == 0) { - int timeout; - /* AKILLs */ - notice_lang(s_OperServ, u, OPER_STATS_AKILL_COUNT, - akills.count); - timeout = AutokillExpiry + 59; - if (timeout >= 172800) - notice_lang(s_OperServ, u, OPER_STATS_AKILL_EXPIRE_DAYS, - timeout / 86400); - else if (timeout >= 86400) - notice_lang(s_OperServ, u, OPER_STATS_AKILL_EXPIRE_DAY); - else if (timeout >= 7200) - notice_lang(s_OperServ, u, OPER_STATS_AKILL_EXPIRE_HOURS, - timeout / 3600); - else if (timeout >= 3600) - notice_lang(s_OperServ, u, OPER_STATS_AKILL_EXPIRE_HOUR); - else if (timeout >= 120) - notice_lang(s_OperServ, u, OPER_STATS_AKILL_EXPIRE_MINS, - timeout / 60); - else if (timeout >= 60) - notice_lang(s_OperServ, u, OPER_STATS_AKILL_EXPIRE_MIN); - else - notice_lang(s_OperServ, u, OPER_STATS_AKILL_EXPIRE_NONE); - 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 { - notice_lang(s_OperServ, u, OPER_STATS_UNKNOWN_OPTION, extra); - } - } - - notice_lang(s_OperServ, u, OPER_STATS_CURRENT_USERS, usercnt, opcnt); - tm = localtime(&maxusertime); - strftime_lang(timebuf, sizeof(timebuf), u, STRFTIME_DATE_TIME_FORMAT, - tm); - notice_lang(s_OperServ, u, OPER_STATS_MAX_USERS, maxusercnt, timebuf); - if (days > 1) { - notice_lang(s_OperServ, u, OPER_STATS_UPTIME_DHMS, - days, hours, mins, secs); - } else if (days == 1) { - notice_lang(s_OperServ, u, OPER_STATS_UPTIME_1DHMS, - days, hours, mins, secs); - } else { - if (hours > 1) { - if (mins != 1) { - if (secs != 1) { - notice_lang(s_OperServ, u, OPER_STATS_UPTIME_HMS, - hours, mins, secs); - } else { - notice_lang(s_OperServ, u, OPER_STATS_UPTIME_HM1S, - hours, mins, secs); - } - } else { - if (secs != 1) { - notice_lang(s_OperServ, u, OPER_STATS_UPTIME_H1MS, - hours, mins, secs); - } else { - notice_lang(s_OperServ, u, OPER_STATS_UPTIME_H1M1S, - hours, mins, secs); - } - } - } else if (hours == 1) { - if (mins != 1) { - if (secs != 1) { - notice_lang(s_OperServ, u, OPER_STATS_UPTIME_1HMS, - hours, mins, secs); - } else { - notice_lang(s_OperServ, u, OPER_STATS_UPTIME_1HM1S, - hours, mins, secs); - } - } else { - if (secs != 1) { - notice_lang(s_OperServ, u, OPER_STATS_UPTIME_1H1MS, - hours, mins, secs); - } else { - notice_lang(s_OperServ, u, OPER_STATS_UPTIME_1H1M1S, - hours, mins, secs); - } - } - } else { - if (mins != 1) { - if (secs != 1) { - notice_lang(s_OperServ, u, OPER_STATS_UPTIME_MS, - mins, secs); - } else { - notice_lang(s_OperServ, u, OPER_STATS_UPTIME_M1S, - mins, secs); - } - } else { - if (secs != 1) { - notice_lang(s_OperServ, u, OPER_STATS_UPTIME_1MS, - mins, secs); - } else { - notice_lang(s_OperServ, u, OPER_STATS_UPTIME_1M1S, - mins, secs); - } - } - } - } - - if (extra && stricmp(extra, "ALL") == 0 && is_services_admin(u)) { - long count, mem; - - notice_lang(s_OperServ, u, OPER_STATS_BYTES_READ, - total_read / 1024); - notice_lang(s_OperServ, u, OPER_STATS_BYTES_WRITTEN, - total_written / 1024); - - get_user_stats(&count, &mem); - notice_lang(s_OperServ, u, OPER_STATS_USER_MEM, count, - (mem + 512) / 1024); - get_channel_stats(&count, &mem); - notice_lang(s_OperServ, u, OPER_STATS_CHANNEL_MEM, count, - (mem + 512) / 1024); - get_core_stats(&count, &mem); - notice_lang(s_OperServ, u, OPER_STATS_GROUPS_MEM, count, - (mem + 512) / 1024); - get_aliases_stats(&count, &mem); - notice_lang(s_OperServ, u, OPER_STATS_ALIASES_MEM, count, - (mem + 512) / 1024); - get_chanserv_stats(&count, &mem); - notice_lang(s_OperServ, u, OPER_STATS_CHANSERV_MEM, count, - (mem + 512) / 1024); - get_botserv_stats(&count, &mem); - notice_lang(s_OperServ, u, OPER_STATS_BOTSERV_MEM, count, - (mem + 512) / 1024); - get_operserv_stats(&count, &mem); - notice_lang(s_OperServ, u, OPER_STATS_OPERSERV_MEM, count, - (mem + 512) / 1024); - get_session_stats(&count, &mem); - notice_lang(s_OperServ, u, OPER_STATS_SESSIONS_MEM, count, - (mem + 512) / 1024); - } - return MOD_CONT; -} - -/*************************************************************************/ - -/* make Services ignore users for a certain time */ - -static int do_ignoreuser(User * u) -{ - char *cmd = strtok(NULL, " "); - int t; - - if (!cmd) { - notice_lang(s_OperServ, u, OPER_IGNORE_SYNTAX); - return MOD_CONT; - } - - if (!stricmp(cmd, "ADD")) { - - char *time = strtok(NULL, " "); - char *nick = strtok(NULL, " "); - char *rest = strtok(NULL, ""); - - if (!nick) { - notice_lang(s_OperServ, u, OPER_IGNORE_SYNTAX); - return MOD_CONT; - } else if (!time) { - notice_lang(s_OperServ, u, OPER_IGNORE_SYNTAX); - return MOD_CONT; - } else { - t = dotime(time); - rest = NULL; - - if (t <= -1) { - notice_lang(s_OperServ, u, OPER_IGNORE_VALID_TIME); - return MOD_CONT; - } else if (t == 0) { - t = 157248000; /* if 0 is given, we set time to 157248000 seconds == 5 years (let's hope the next restart will be before that time ;-)) */ - add_ignore(nick, t); - notice_lang(s_OperServ, u, OPER_IGNORE_PERM_DONE, nick); - } else { - add_ignore(nick, t); - notice_lang(s_OperServ, u, OPER_IGNORE_TIME_DONE, nick, - time); - } - } - } else if (!stricmp(cmd, "LIST")) { - do_ignorelist(u); - } - - else if (!stricmp(cmd, "DEL")) { - char *nick = strtok(NULL, " "); - if (!nick) { - notice_lang(s_OperServ, u, OPER_IGNORE_SYNTAX); - } else { - if (get_ignore(nick) == 0) { - notice_lang(s_OperServ, u, OPER_IGNORE_LIST_NOMATCH, nick); - return MOD_CONT; - } else { - delete_ignore(nick); - notice_lang(s_OperServ, u, OPER_IGNORE_DEL_DONE, nick); - } - } - } else if (!stricmp(cmd, "CLEAR")) { - do_clearignore(u); - - } else - notice_lang(s_OperServ, u, OPER_IGNORE_SYNTAX); - return MOD_CONT; -} - -/*************************************************************************/ - -/* deletes a nick from the ignore list */ - -void delete_ignore(const char *nick) -{ - IgnoreData *ign, *prev; - IgnoreData **whichlist; - - if (!nick || !*nick) { - return; - } - - whichlist = &ignore[tolower(nick[0])]; - - for (ign = *whichlist, prev = NULL; ign; prev = ign, ign = ign->next) { - if (stricmp(ign->who, nick) == 0) - break; - } - if (prev) - prev->next = ign->next; - else - *whichlist = ign->next; - free(ign); - ign = NULL; -} - -/*************************************************************************/ - -/* shows the Services ignore list */ - -static int do_ignorelist(User * u) -{ - int sent_header = 0; - IgnoreData *id; - int i; - - for (i = 0; i < 256; i++) { - for (id = ignore[i]; id; id = id->next) { - if (!sent_header) { - notice_lang(s_OperServ, u, OPER_IGNORE_LIST); - sent_header = 1; - } - notice_user(s_OperServ, u, "%s", id->who); - } - } - if (!sent_header) - notice_lang(s_OperServ, u, OPER_IGNORE_LIST_EMPTY); - return MOD_CONT; -} - -/**************************************************************************/ -/* Cleares the Services ignore list */ - -static int do_clearignore(User * u) -{ - IgnoreData *id = NULL, *next = NULL; - int i; - for (i = 0; i < 256; i++) { - for (id = ignore[i]; id; id = next) { - next = id->next; - free(id); - if (!next) { - ignore[i] = NULL; - } - } - } - notice_lang(s_OperServ, u, OPER_IGNORE_LIST_CLEARED); - return MOD_CONT; -} - -/**************************************************************************/ - -/* Channel mode changing (MODE command). */ - -static int do_os_mode(User * u) -{ - int ac; - char **av; - char *chan = strtok(NULL, " "), *modes = strtok(NULL, ""); - Channel *c; - - if (!chan || !modes) { - syntax_error(s_OperServ, u, "MODE", OPER_MODE_SYNTAX); - return MOD_CONT; - } - - if (!(c = findchan(chan))) { - notice_lang(s_OperServ, u, CHAN_X_NOT_IN_USE, chan); - } else if (c->bouncy_modes) { - notice_lang(s_OperServ, u, OPER_BOUNCY_MODES_U_LINE); - return MOD_CONT; - } 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, 0); - - if (WallOSMode) - anope_cmd_global(s_OperServ, "%s used MODE %s on %s", u->nick, - modes, chan); - } - return MOD_CONT; -} - -/**************************************************************************/ - -/** - * Change any user's UMODES - * - * modified to be part of the SuperAdmin directive -jester - * check user flag for SuperAdmin -rob - */ -static int do_operumodes(User * u) -{ - char *nick = strtok(NULL, " "); - char *modes = strtok(NULL, ""); - - User *u2; - - if (!ircd->umode) { - notice_lang(s_OperServ, u, OPER_UMODE_UNSUPPORTED); - return MOD_CONT; - } - - /* 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; -} - /**************************************************************************/ -/** - * give Operflags to any user - * - * modified to be part of the SuperAdmin directive -jester - * check u-> for SuperAdmin -rob - */ - -static int do_operoline(User * u) -{ - char *nick = strtok(NULL, " "); - char *flags = strtok(NULL, ""); - User *u2 = NULL; - - if (!ircd->omode) { - notice_lang(s_OperServ, u, OPER_SVSO_UNSUPPORTED); - return MOD_CONT; - } - - /* Only allow this if SuperAdmin is enabled */ - if (!u->isSuperAdmin) { - notice_lang(s_OperServ, u, OPER_SUPER_ADMIN_ONLY); - return MOD_CONT; - } - - if (!nick || !flags) { - syntax_error(s_OperServ, u, "OLINE", OPER_OLINE_SYNTAX); - return MOD_CONT; - } else { - u2 = finduser(nick); - -/* let's check whether the user is online */ - - if (!finduser(nick)) { - notice_lang(s_OperServ, u, NICK_X_NOT_IN_USE, nick); - } else if (u2 && flags[0] == '+') { - 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; -} - -/*************************************************************************/ - -/* Clear all modes from a channel. */ - -static int do_clearmodes(User * u) -{ - char *s; - int i; - char *argv[2]; - char *chan = strtok(NULL, " "); - Channel *c; - int all = 0; - int count; /* For saving ban info */ - char **bans; /* For saving ban info */ - int exceptcount; /* For saving except info */ - char **excepts; /* For saving except info */ - int invitecount; /* For saving invite info */ - char **invites; /* For saving invite info */ - struct c_userlist *cu, *next; - - 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] = sstrdup(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] = sstrdup(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] = sstrdup(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] = sstrdup(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 */ - count = c->bancount; - bans = scalloc(sizeof(char *) * count, 1); - - for (i = 0; i < count; i++) - bans[i] = sstrdup(c->bans[i]); - - for (i = 0; i < count; i++) { - argv[0] = sstrdup("-b"); - argv[1] = bans[i]; - anope_cmd_mode(s_OperServ, c->name, "-b %s", argv[1]); - chan_set_modes(s_OperServ, c, 2, argv, 0); - free(argv[1]); - free(argv[0]); - } - - free(bans); - - excepts = NULL; - - if (ircd->except) { - /* Clear excepts */ - exceptcount = c->exceptcount; - excepts = scalloc(sizeof(char *) * exceptcount, 1); - - for (i = 0; i < exceptcount; i++) - excepts[i] = sstrdup(c->excepts[i]); - - for (i = 0; i < exceptcount; i++) { - argv[0] = sstrdup("-e"); - argv[1] = excepts[i]; - anope_cmd_mode(s_OperServ, c->name, "-e %s", argv[1]); - chan_set_modes(s_OperServ, c, 2, argv, 0); - free(argv[1]); - free(argv[0]); - } - if (excepts) { - free(excepts); - } - } - - if (ircd->invitemode) { - /* Clear invites */ - invitecount = c->invitecount; - invites = scalloc(sizeof(char *) * invitecount, 1); - - for (i = 0; i < invitecount; i++) - invites[i] = sstrdup(c->invite[i]); - - for (i = 0; i < invitecount; i++) { - argv[0] = sstrdup("-I"); - argv[1] = excepts[i]; - anope_cmd_mode(s_OperServ, c->name, "-I %s", argv[1]); - chan_set_modes(s_OperServ, c, 2, argv, 0); - free(argv[1]); - free(argv[0]); - } - - free(invites); - } - - } - - 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; -} - -/*************************************************************************/ - -/* Kick a user from a channel (KICK command). */ - -static int do_os_kick(User * u) -{ - char *argv[3]; - char *chan, *nick, *s; - Channel *c; - - chan = strtok(NULL, " "); - nick = strtok(NULL, " "); - s = strtok(NULL, ""); - if (!chan || !nick || !s) { - syntax_error(s_OperServ, u, "KICK", OPER_KICK_SYNTAX); - return MOD_CONT; - } - if (!(c = findchan(chan))) { - notice_lang(s_OperServ, u, CHAN_X_NOT_IN_USE, chan); - } else if (c->bouncy_modes) { - notice_lang(s_OperServ, u, OPER_BOUNCY_MODES_U_LINE); - return MOD_CONT; - } - 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; -} - -/*************************************************************************/ - -/* Forcefully change a user's nickname */ - -static int do_svsnick(User * u) -{ - char *nick = strtok(NULL, " "); - char *newnick = strtok(NULL, " "); - - NickAlias *na; - char *c; - - if (!ircd->svsnick) { - notice_lang(s_OperServ, u, OPER_SVSNICK_UNSUPPORTED); - return MOD_CONT; - } - - /* Only allow this if SuperAdmin is enabled */ - if (!u->isSuperAdmin) { - notice_lang(s_OperServ, u, OPER_SUPER_ADMIN_ONLY); - return MOD_CONT; - } - - if (!nick || !newnick) { - syntax_error(s_OperServ, u, "SVSNICK", OPER_SVSNICK_SYNTAX); - return MOD_CONT; - } - - /* Truncate long nicknames to NICKMAX-2 characters */ - if (strlen(newnick) > (NICKMAX - 2)) { - notice_lang(s_NickServ, u, NICK_X_TRUNCATED, - newnick, NICKMAX - 2, newnick); - newnick[NICKMAX - 2] = '\0'; - } - - /* Check for valid characters */ - if (*newnick == '-' || isdigit(*newnick)) { - notice_lang(s_OperServ, u, NICK_X_ILLEGAL, newnick); - return MOD_CONT; - } -#define isvalid(c) (((c) >= 'A' && (c) <= '~') || isdigit(c) || (c) == '-') - for (c = newnick; *c && (c - newnick) < NICKMAX; c++) { - if (!isvalid(*c) || isspace(*c)) { - notice_lang(s_OperServ, u, NICK_X_ILLEGAL, nick); - return MOD_CONT; - } - } - - /* Check for a nick in use or a forbidden/suspended nick */ - if (!finduser(nick)) { - notice_lang(s_OperServ, u, NICK_X_NOT_IN_USE, nick); - } else if (finduser(newnick)) { - notice_lang(s_NickServ, u, NICK_X_IN_USE, newnick); - } else if ((na = findnick(newnick)) && (na->status & NS_VERBOTEN)) { - notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, newnick); - } else { - notice_lang(s_OperServ, u, OPER_SVSNICK_NEWNICK, nick, newnick); - 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; -} +/************************************************************************/ /*************************************************************************/ /* Adds an AKILL to the list. Returns >= 0 on success, -1 if it fails, -2 @@ -2176,313 +989,6 @@ static int is_akill_entry_equal(SList * slist, void *item1, void *item2) return 0; } -/* Lists an AKILL entry, prefixing it with the header if needed */ - -static int akill_list(int number, Akill * ak, User * u, int *sent_header) -{ - char mask[BUFSIZE]; - - if (!ak) - return 0; - - if (!*sent_header) { - notice_lang(s_OperServ, u, OPER_AKILL_LIST_HEADER); - *sent_header = 1; - } - - snprintf(mask, sizeof(mask), "%s@%s", ak->user, ak->host); - notice_lang(s_OperServ, u, OPER_AKILL_LIST_FORMAT, number, mask, - ak->reason); - - return 1; -} - -/* Callback for enumeration purposes */ - -static int akill_list_callback(SList * slist, int number, void *item, - va_list args) -{ - User *u = va_arg(args, User *); - int *sent_header = va_arg(args, int *); - - return akill_list(number, item, u, sent_header); -} - -/* Lists an AKILL entry, prefixing it with the header if needed */ - -static int akill_view(int number, Akill * ak, User * u, int *sent_header) -{ - char mask[BUFSIZE]; - char timebuf[32], expirebuf[256]; - struct tm tm; - - if (!ak) - return 0; - - if (!*sent_header) { - notice_lang(s_OperServ, u, OPER_AKILL_VIEW_HEADER); - *sent_header = 1; - } - - snprintf(mask, sizeof(mask), "%s@%s", ak->user, ak->host); - tm = *localtime(&ak->seton); - strftime_lang(timebuf, sizeof(timebuf), u, STRFTIME_SHORT_DATE_FORMAT, - &tm); - expire_left(u->na, expirebuf, sizeof(expirebuf), ak->expires); - notice_lang(s_OperServ, u, OPER_AKILL_VIEW_FORMAT, number, mask, - ak->by, timebuf, expirebuf, ak->reason); - - return 1; -} - -/* Callback for enumeration purposes */ - -static int akill_view_callback(SList * slist, int number, void *item, - va_list args) -{ - User *u = va_arg(args, User *); - int *sent_header = va_arg(args, int *); - - return akill_view(number, item, u, sent_header); -} - -/* Manage the AKILL list. */ - -static int do_akill(User * u) -{ - char *cmd = strtok(NULL, " "); - char breason[BUFSIZE]; - - if (!cmd) - cmd = ""; - - if (!stricmp(cmd, "ADD")) { - int deleted = 0; - char *expiry, *mask, *reason; - time_t expires; - - mask = strtok(NULL, " "); - if (mask && *mask == '+') { - expiry = mask; - mask = strtok(NULL, " "); - } else { - expiry = NULL; - } - - expires = expiry ? dotime(expiry) : AutokillExpiry; - /* If the expiry given does not contain a final letter, it's in days, - * said the doc. Ah well. - */ - if (expiry && isdigit(expiry[strlen(expiry) - 1])) - expires *= 86400; - /* Do not allow less than a minute expiry time */ - if (expires != 0 && expires < 60) { - notice_lang(s_OperServ, u, BAD_EXPIRY_TIME); - return MOD_CONT; - } else if (expires > 0) { - expires += time(NULL); - } - - if (mask && (reason = strtok(NULL, ""))) { - /* We first do some sanity check on the proposed mask. */ - if (strchr(mask, '!')) { - notice_lang(s_OperServ, u, OPER_AKILL_NO_NICK); - return MOD_CONT; - } - - if (!strchr(mask, '@')) { - notice_lang(s_OperServ, u, BAD_USERHOST_MASK); - return MOD_CONT; - } - - if (mask && strspn(mask, "~@.*?") == strlen(mask)) { - notice_lang(s_OperServ, u, USERHOST_MASK_TOO_WIDE, mask); - return MOD_CONT; - } - - /** - * Changed sprintf() to snprintf()and increased the size of - * breason to match bufsize - * -Rob - **/ - if (AddAkiller) { - snprintf(breason, sizeof(breason), "[%s] %s", u->nick, - reason); - reason = sstrdup(breason); - } - - deleted = add_akill(u, mask, u->nick, expires, reason); - if (deleted < 0) - return MOD_CONT; - else if (deleted) - notice_lang(s_OperServ, u, OPER_AKILL_DELETED_SEVERAL, - deleted); - notice_lang(s_OperServ, u, OPER_AKILL_ADDED, mask); - - if (WallOSAkill) { - char buf[128]; - - if (!expires) { - strcpy(buf, "does not expire"); - } else { - int wall_expiry = expires - time(NULL); - char *s = NULL; - - if (wall_expiry >= 86400) { - wall_expiry /= 86400; - s = "day"; - } else if (wall_expiry >= 3600) { - wall_expiry /= 3600; - s = "hour"; - } else if (wall_expiry >= 60) { - wall_expiry /= 60; - s = "minute"; - } - - snprintf(buf, sizeof(buf), "expires in %d %s%s", - wall_expiry, s, - (wall_expiry == 1) ? "" : "s"); - } - - 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); - - } 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; -} /*************************************************************************/ @@ -2667,292 +1173,6 @@ static int is_sgline_entry_equal(SList * slist, void *item1, void *item2) return 0; } -/* Lists an SGLINE entry, prefixing it with the header if needed */ - -static int sgline_list(int number, SXLine * sx, User * u, int *sent_header) -{ - if (!sx) - return 0; - - if (!*sent_header) { - notice_lang(s_OperServ, u, OPER_SGLINE_LIST_HEADER); - *sent_header = 1; - } - - notice_lang(s_OperServ, u, OPER_SGLINE_LIST_FORMAT, number, sx->mask, - sx->reason); - - return 1; -} - -/* Callback for enumeration purposes */ - -static int sgline_list_callback(SList * slist, int number, void *item, - va_list args) -{ - User *u = va_arg(args, User *); - int *sent_header = va_arg(args, int *); - - return sgline_list(number, item, u, sent_header); -} - -/* Lists an SGLINE entry, prefixing it with the header if needed */ - -static int sgline_view(int number, SXLine * sx, User * u, int *sent_header) -{ - char timebuf[32], expirebuf[256]; - struct tm tm; - - if (!sx) - return 0; - - if (!*sent_header) { - notice_lang(s_OperServ, u, OPER_SGLINE_VIEW_HEADER); - *sent_header = 1; - } - - tm = *localtime(&sx->seton); - strftime_lang(timebuf, sizeof(timebuf), u, STRFTIME_SHORT_DATE_FORMAT, - &tm); - expire_left(u->na, expirebuf, sizeof(expirebuf), sx->expires); - notice_lang(s_OperServ, u, OPER_SGLINE_VIEW_FORMAT, number, sx->mask, - sx->by, timebuf, expirebuf, sx->reason); - - return 1; -} - -/* Callback for enumeration purposes */ - -static int sgline_view_callback(SList * slist, int number, void *item, - va_list args) -{ - User *u = va_arg(args, User *); - int *sent_header = va_arg(args, int *); - - return sgline_view(number, item, u, sent_header); -} - - -/* Manage the SGLINE list. */ - -static int do_sgline(User * u) -{ - char *cmd = strtok(NULL, " "); - - if (!ircd->sgline) { - notice_lang(s_OperServ, u, OPER_SGLINE_UNSUPPORTED); - return MOD_CONT; - } - - if (!cmd) - cmd = ""; - - if (!stricmp(cmd, "ADD")) { - int deleted = 0; - char *expiry, *mask, *reason; - time_t expires; - - mask = strtok(NULL, ":"); - if (mask && *mask == '+') { - expiry = mask; - mask = strchr(expiry, ' '); - if (mask) { - *mask = 0; - mask++; - } - } else { - expiry = NULL; - } - - expires = expiry ? dotime(expiry) : SGLineExpiry; - /* If the expiry given does not contain a final letter, it's in days, - * said the doc. Ah well. - */ - if (expiry && isdigit(expiry[strlen(expiry) - 1])) - expires *= 86400; - /* Do not allow less than a minute expiry time */ - if (expires != 0 && expires < 60) { - notice_lang(s_OperServ, u, BAD_EXPIRY_TIME); - return MOD_CONT; - } else if (expires > 0) { - expires += time(NULL); - } - - if (mask && (reason = strtok(NULL, ""))) { - /* We first do some sanity check on the proposed mask. */ - - if (mask && strspn(mask, "*?") == strlen(mask)) { - notice_lang(s_OperServ, u, USERHOST_MASK_TOO_WIDE, mask); - return MOD_CONT; - } - - deleted = add_sgline(u, mask, u->nick, expires, reason); - if (deleted < 0) - return MOD_CONT; - else if (deleted) - notice_lang(s_OperServ, u, OPER_SGLINE_DELETED_SEVERAL, - deleted); - notice_lang(s_OperServ, u, OPER_SGLINE_ADDED, mask); - - if (WallOSSGLine) { - char buf[128]; - - if (!expires) { - strcpy(buf, "does not expire"); - } else { - int wall_expiry = expires - time(NULL); - char *s = NULL; - - if (wall_expiry >= 86400) { - wall_expiry /= 86400; - s = "day"; - } else if (wall_expiry >= 3600) { - wall_expiry /= 3600; - s = "hour"; - } else if (wall_expiry >= 60) { - wall_expiry /= 60; - s = "minute"; - } - - snprintf(buf, sizeof(buf), "expires in %d %s%s", - wall_expiry, s, - (wall_expiry == 1) ? "" : "s"); - } - - 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; -} - /*************************************************************************/ /* Adds an SQLINE to the list. Returns >= 0 on success, -1 if it failed, -2 if @@ -3174,294 +1394,6 @@ static int is_sqline_entry_equal(SList * slist, void *item1, void *item2) return 0; } -/* Lists an SQLINE entry, prefixing it with the header if needed */ - -static int sqline_list(int number, SXLine * sx, User * u, int *sent_header) -{ - if (!sx) - return 0; - - if (!*sent_header) { - notice_lang(s_OperServ, u, OPER_SQLINE_LIST_HEADER); - *sent_header = 1; - } - - notice_lang(s_OperServ, u, OPER_SQLINE_LIST_FORMAT, number, sx->mask, - sx->reason); - - return 1; -} - -/* Callback for enumeration purposes */ - -static int sqline_list_callback(SList * slist, int number, void *item, - va_list args) -{ - User *u = va_arg(args, User *); - int *sent_header = va_arg(args, int *); - - return sqline_list(number, item, u, sent_header); -} - -/* Lists an SQLINE entry, prefixing it with the header if needed */ - -static int sqline_view(int number, SXLine * sx, User * u, int *sent_header) -{ - char timebuf[32], expirebuf[256]; - struct tm tm; - - if (!sx) - return 0; - - if (!*sent_header) { - notice_lang(s_OperServ, u, OPER_SQLINE_VIEW_HEADER); - *sent_header = 1; - } - - tm = *localtime(&sx->seton); - strftime_lang(timebuf, sizeof(timebuf), u, STRFTIME_SHORT_DATE_FORMAT, - &tm); - expire_left(u->na, expirebuf, sizeof(expirebuf), sx->expires); - notice_lang(s_OperServ, u, OPER_SQLINE_VIEW_FORMAT, number, sx->mask, - sx->by, timebuf, expirebuf, sx->reason); - - return 1; -} - -/* Callback for enumeration purposes */ - -static int sqline_view_callback(SList * slist, int number, void *item, - va_list args) -{ - User *u = va_arg(args, User *); - int *sent_header = va_arg(args, int *); - - return sqline_view(number, item, u, sent_header); -} - -/* Manage the SQLINE list. */ - -static int do_sqline(User * u) -{ - char *cmd = strtok(NULL, " "); - - if (!ircd->sqline) { - notice_lang(s_OperServ, u, OPER_SQLINE_UNSUPPORTED); - return MOD_CONT; - } - - 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; -} - /*************************************************************************/ /* Adds an SZLINE to the list. Returns >= 0 on success, -1 on error, -2 if @@ -3631,390 +1563,6 @@ static int is_szline_entry_equal(SList * slist, void *item1, void *item2) return 0; } -/* Lists an SZLINE entry, prefixing it with the header if needed */ - -static int szline_list(int number, SXLine * sx, User * u, int *sent_header) -{ - if (!sx) - return 0; - - if (!*sent_header) { - notice_lang(s_OperServ, u, OPER_SZLINE_LIST_HEADER); - *sent_header = 1; - } - - notice_lang(s_OperServ, u, OPER_SZLINE_LIST_FORMAT, number, sx->mask, - sx->reason); - - return 1; -} - -/* Callback for enumeration purposes */ - -static int szline_list_callback(SList * slist, int number, void *item, - va_list args) -{ - User *u = va_arg(args, User *); - int *sent_header = va_arg(args, int *); - - return szline_list(number, item, u, sent_header); -} - -/* Lists an SZLINE entry, prefixing it with the header if needed */ - -static int szline_view(int number, SXLine * sx, User * u, int *sent_header) -{ - char timebuf[32], expirebuf[256]; - struct tm tm; - - if (!sx) - return 0; - - if (!*sent_header) { - notice_lang(s_OperServ, u, OPER_SZLINE_VIEW_HEADER); - *sent_header = 1; - } - - tm = *localtime(&sx->seton); - strftime_lang(timebuf, sizeof(timebuf), u, STRFTIME_SHORT_DATE_FORMAT, - &tm); - expire_left(u->na, expirebuf, sizeof(expirebuf), sx->expires); - notice_lang(s_OperServ, u, OPER_SZLINE_VIEW_FORMAT, number, sx->mask, - sx->by, timebuf, expirebuf, sx->reason); - - return 1; -} - -/* Callback for enumeration purposes */ - -static int szline_view_callback(SList * slist, int number, void *item, - va_list args) -{ - User *u = va_arg(args, User *); - int *sent_header = va_arg(args, int *); - - return szline_view(number, item, u, sent_header); -} - -/* Manage the SZLINE list. */ - -static int do_szline(User * u) -{ - char *cmd = strtok(NULL, " "); - - if (!ircd->szline) { - notice_lang(s_OperServ, u, OPER_SZLINE_UNSUPPORTED); - return MOD_CONT; - } - - 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; -} - -/*************************************************************************/ - -static int do_chanlist(User * u) -{ - char *pattern = strtok(NULL, " "); - char *opt = strtok(NULL, " "); - - int modes = 0; - User *u2; - - if (opt && !stricmp(opt, "SECRET")) - modes |= (CMODE_s | CMODE_p); - - if (pattern && (u2 = finduser(pattern))) { - struct u_chanlist *uc; - - notice_lang(s_OperServ, u, OPER_CHANLIST_HEADER_USER, u2->nick); - - for (uc = u2->chans; uc; uc = uc->next) { - if (modes && !(uc->chan->mode & modes)) - continue; - notice_lang(s_OperServ, u, OPER_CHANLIST_RECORD, - uc->chan->name, uc->chan->usercount, - chan_get_modes(uc->chan, 1, 1), - (uc->chan->topic ? uc->chan->topic : "")); - } - } else { - int i; - Channel *c; - - notice_lang(s_OperServ, u, OPER_CHANLIST_HEADER); - - for (i = 0; i < 1024; i++) { - for (c = chanlist[i]; c; c = c->next) { - if (pattern && !match_wild_nocase(pattern, c->name)) - continue; - if (modes && !(c->mode & modes)) - continue; - notice_lang(s_OperServ, u, OPER_CHANLIST_RECORD, c->name, - c->usercount, chan_get_modes(c, 1, 1), - (c->topic ? c->topic : "")); - } - } - } - - notice_lang(s_OperServ, u, OPER_CHANLIST_END); - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_userlist(User * u) -{ - char *pattern = strtok(NULL, " "); - char *opt = strtok(NULL, " "); - - Channel *c; - int modes = 0; - - if (opt && !stricmp(opt, "INVISIBLE")) - modes |= UMODE_i; - - if (pattern && (c = findchan(pattern))) { - struct c_userlist *cu; - - notice_lang(s_OperServ, u, OPER_USERLIST_HEADER_CHAN, pattern); - - for (cu = c->users; cu; cu = cu->next) { - if (modes && !(cu->user->mode & modes)) - continue; - notice_lang(s_OperServ, u, OPER_USERLIST_RECORD, - cu->user->nick, 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; -} - /*************************************************************************/ /* Callback function used to sort the admin list */ @@ -4036,192 +1584,6 @@ static void free_adminlist_entry(SList * slist, void *item) nc->flags &= ~NI_SERVICES_ADMIN; } -/* Lists an admin entry, prefixing it with the header if needed */ - -static int admin_list(int number, NickCore * nc, User * u, - int *sent_header) -{ - if (!nc) - return 0; - - if (!*sent_header) { - notice_lang(s_OperServ, u, OPER_ADMIN_LIST_HEADER); - *sent_header = 1; - } - - notice_lang(s_OperServ, u, OPER_ADMIN_LIST_FORMAT, number, - nc->display); - return 1; -} - -/* Callback for enumeration purposes */ - -static int admin_list_callback(SList * slist, int number, void *item, - va_list args) -{ - User *u = va_arg(args, User *); - int *sent_header = va_arg(args, int *); - - return admin_list(number, item, u, sent_header); -} - -/* Services admin list viewing/modification. */ - -static int do_admin(User * u) -{ - char *cmd = strtok(NULL, " "); - char *nick = strtok(NULL, " "); - NickAlias *na; - int res = 0; - - if (skeleton) { - notice_lang(s_OperServ, u, OPER_ADMIN_SKELETON); - return MOD_CONT; - } - - if (!cmd || (!nick && stricmp(cmd, "LIST") && stricmp(cmd, "CLEAR"))) { - syntax_error(s_OperServ, u, "ADMIN", OPER_ADMIN_SYNTAX); - } else if (!stricmp(cmd, "ADD")) { - if (!is_services_root(u)) { - notice_lang(s_OperServ, u, PERMISSION_DENIED); - return MOD_CONT; - } - - if (!(na = findnick(nick))) { - notice_lang(s_OperServ, u, NICK_X_NOT_REGISTERED, nick); - return MOD_CONT; - } - - if (na->status & NS_VERBOTEN) { - notice_lang(s_OperServ, u, NICK_X_FORBIDDEN, nick); - return MOD_CONT; - } - - if (na->nc->flags & NI_SERVICES_ADMIN - || slist_indexof(&servadmins, na->nc) != -1) { - notice_lang(s_OperServ, u, OPER_ADMIN_EXISTS, nick); - return MOD_CONT; - } - - res = slist_add(&servadmins, na->nc); - if (res == -2) { - notice_lang(s_OperServ, u, OPER_ADMIN_REACHED_LIMIT, nick); - return MOD_CONT; - } else { - 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; -} - /*************************************************************************/ /* Callback function used to sort the oper list */ @@ -4243,628 +1605,6 @@ static void free_operlist_entry(SList * slist, void *item) nc->flags &= ~NI_SERVICES_OPER; } -/* Lists an oper entry, prefixing it with the header if needed */ - -static int oper_list(int number, NickCore * nc, User * u, int *sent_header) -{ - if (!nc) - return 0; - - if (!*sent_header) { - notice_lang(s_OperServ, u, OPER_OPER_LIST_HEADER); - *sent_header = 1; - } - - notice_lang(s_OperServ, u, OPER_OPER_LIST_FORMAT, number, nc->display); - return 1; -} - -/* Callback for enumeration purposes */ - -static int oper_list_callback(SList * slist, int number, void *item, - va_list args) -{ - User *u = va_arg(args, User *); - int *sent_header = va_arg(args, int *); - - return oper_list(number, item, u, sent_header); -} - -/** - * Display an Opers list Entry - **/ -static int opers_list(int number, NickCore * nc, User * u, char *level) -{ - User *au = NULL; - NickAlias *na; - int found; - int i; - - if (!nc) - return 0; - - found = 0; - if ((au = finduser(nc->display))) { /* see if user is online */ - found = 1; - notice_lang(s_OperServ, u, OPER_STAFF_FORMAT, '*', level, - nc->display); - } else { - for (i = 0; i < nc->aliases.count; i++) { /* check all aliases */ - na = nc->aliases.list[i]; - if ((au = finduser(na->nick))) { /* see if user is online */ - found = 1; - notice_lang(s_OperServ, u, OPER_STAFF_AFORMAT, '*', level, - nc->display, na->nick); - } - } - } - - if (!found) - notice_lang(s_OperServ, u, OPER_STAFF_FORMAT, ' ', level, - nc->display); - - return 1; -} - -/** - * Function for the enumerator to call - **/ -static int opers_list_callback(SList * slist, int number, void *item, - va_list args) -{ - User *u = va_arg(args, User *); - char *level = va_arg(args, char *); - - return opers_list(number, item, u, level); -} - -/** - * Display all Services Opers/Admins with Level + Online Status - * /msg OperServ opers - **/ -static int do_staff(User * u) -{ - int idx = 0; - User *au = NULL; - NickCore *nc; - NickAlias *na; - int found; - int i; - - notice_lang(s_OperServ, u, OPER_STAFF_LIST_HEADER); - slist_enum(&servopers, NULL, &opers_list_callback, u, "OPER"); - slist_enum(&servadmins, NULL, &opers_list_callback, u, "ADMN"); - - for (idx = 0; idx < RootNumber; idx++) { - found = 0; - if ((au = finduser(ServicesRoots[idx]))) { /* see if user is online */ - found = 1; - notice_lang(s_OperServ, u, OPER_STAFF_FORMAT, '*', "ROOT", - ServicesRoots[idx]); - } else if ((nc = findcore(ServicesRoots[idx]))) { - for (i = 0; i < nc->aliases.count; i++) { /* check all aliases */ - na = nc->aliases.list[i]; - if ((au = finduser(na->nick))) { /* see if user is online */ - found = 1; - notice_lang(s_OperServ, u, OPER_STAFF_AFORMAT, - '*', "ROOT", ServicesRoots[idx], na->nick); - } - } - } - - if (!found) - notice_lang(s_OperServ, u, OPER_STAFF_FORMAT, ' ', "ROOT", - ServicesRoots[idx]); - - } - notice_lang(s_OperServ, u, END_OF_ANY_LIST, "Staff"); - return MOD_CONT; -} - -/* Services operator list viewing/modification. */ - -static int do_oper(User * u) -{ - char *cmd = strtok(NULL, " "); - char *nick = strtok(NULL, " "); - NickAlias *na; - int res = 0; - - if (skeleton) { - notice_lang(s_OperServ, u, OPER_OPER_SKELETON); - return MOD_CONT; - } - - if (!cmd || (!nick && stricmp(cmd, "LIST") && stricmp(cmd, "CLEAR"))) { - syntax_error(s_OperServ, u, "OPER", OPER_OPER_SYNTAX); - } else if (!stricmp(cmd, "ADD")) { - if (!is_services_admin(u)) { - notice_lang(s_OperServ, u, PERMISSION_DENIED); - return MOD_CONT; - } - - if (!(na = findnick(nick))) { - notice_lang(s_OperServ, u, NICK_X_NOT_REGISTERED, nick); - return MOD_CONT; - } - - if (na->status & NS_VERBOTEN) { - notice_lang(s_OperServ, u, NICK_X_FORBIDDEN, nick); - return MOD_CONT; - } - - if (na->nc->flags & NI_SERVICES_OPER - || slist_indexof(&servopers, na->nc) != -1) { - notice_lang(s_OperServ, u, OPER_OPER_EXISTS, nick); - return MOD_CONT; - } - - res = slist_add(&servopers, na->nc); - if (res == -2) { - notice_lang(s_OperServ, u, OPER_OPER_REACHED_LIMIT, nick); - return MOD_CONT; - } else { - if (na->nc->flags & NI_SERVICES_ADMIN - && (res = slist_indexof(&servadmins, na->nc)) != -1) { - 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_admin(u)) { - notice_lang(s_OperServ, u, PERMISSION_DENIED); - return MOD_CONT; - } - - if (isdigit(*nick) && strspn(nick, "1234567890,-") == strlen(nick)) { - /* Deleting a range */ - res = slist_delete_range(&servopers, nick, NULL); - if (res == 0) { - notice_lang(s_OperServ, u, OPER_OPER_NO_MATCH); - return MOD_CONT; - } else if (res == 1) { - notice_lang(s_OperServ, u, OPER_OPER_DELETED_ONE); - } else { - notice_lang(s_OperServ, u, OPER_OPER_DELETED_SEVERAL, res); - } - } else { - if (!(na = findnick(nick))) { - notice_lang(s_OperServ, u, NICK_X_NOT_REGISTERED, nick); - return MOD_CONT; - } - - if (na->status & NS_VERBOTEN) { - notice_lang(s_OperServ, u, NICK_X_FORBIDDEN, nick); - return MOD_CONT; - } - - if (!(na->nc->flags & NI_SERVICES_OPER) - || (res = slist_indexof(&servopers, na->nc)) == -1) { - notice_lang(s_OperServ, u, OPER_OPER_NOT_FOUND, nick); - return MOD_CONT; - } - - slist_delete(&servopers, res); - notice_lang(s_OperServ, u, OPER_OPER_DELETED, nick); - } - - if (readonly) - notice_lang(s_OperServ, u, READ_ONLY_MODE); - } else if (!stricmp(cmd, "LIST")) { - int sent_header = 0; - - if (servopers.count == 0) { - notice_lang(s_OperServ, u, OPER_OPER_LIST_EMPTY); - return MOD_CONT; - } - - if (!nick || (isdigit(*nick) - && strspn(nick, "1234567890,-") == strlen(nick))) { - res = - slist_enum(&servopers, nick, &oper_list_callback, u, - &sent_header); - if (res == 0) { - notice_lang(s_OperServ, u, OPER_OPER_NO_MATCH); - return MOD_CONT; - } else { - notice_lang(s_OperServ, u, END_OF_ANY_LIST, "Oper"); - } - } else { - int i; - - for (i = 0; i < servopers.count; i++) - if (!stricmp - (nick, ((NickCore *) servopers.list[i])->display) - || match_wild_nocase(nick, - ((NickCore *) servopers.list[i])-> - display)) - oper_list(i + 1, servopers.list[i], u, &sent_header); - - if (!sent_header) - notice_lang(s_OperServ, u, OPER_OPER_NO_MATCH); - else { - notice_lang(s_OperServ, u, END_OF_ANY_LIST, "Oper"); - } - } - } else if (!stricmp(cmd, "CLEAR")) { - if (!is_services_admin(u)) { - notice_lang(s_OperServ, u, PERMISSION_DENIED); - return MOD_CONT; - } - - if (servopers.count == 0) { - notice_lang(s_OperServ, u, OPER_OPER_LIST_EMPTY); - return MOD_CONT; - } - - slist_clear(&servopers, 1); - notice_lang(s_OperServ, u, OPER_OPER_CLEAR); - } else { - syntax_error(s_OperServ, u, "OPER", OPER_OPER_SYNTAX); - } - return MOD_CONT; -} - -/*************************************************************************/ - -/* Set various Services runtime options. */ - -static int do_set(User * u) -{ - char *option = strtok(NULL, " "); - char *setting = strtok(NULL, " "); - int index; - - 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) { - anope_cmd_join(s_GlobalNoticer, LogChannel, 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; -} - -/*************************************************************************/ - -static int do_noop(User * u) -{ - char *cmd = strtok(NULL, " "); - char *server = strtok(NULL, " "); - - if (!cmd || !server) { - syntax_error(s_OperServ, u, "NOOP", OPER_NOOP_SYNTAX); - } else if (!stricmp(cmd, "SET")) { - User *u2; - User *u3 = NULL; - char reason[NICKMAX + 32]; - - /* Remove the O:lines */ - 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; -} - -/*************************************************************************/ - -static 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; -} - -/*************************************************************************/ - -static int do_raw(User * u) -{ - - if (!DisableRaw) { - - char *text = strtok(NULL, ""); - - if (!text) - syntax_error(s_OperServ, u, "RAW", OPER_RAW_SYNTAX); - else { - send_cmd(NULL, "%s", text); - if (WallOSRaw) { - char *kw = strtok(text, " "); - while (kw && *kw == ':') - kw = strtok(NULL, " "); - 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); - } - } else { - notice_lang(s_OperServ, u, RAW_DISABLED); - } - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_update(User * u) -{ - notice_lang(s_OperServ, u, OPER_UPDATING); - save_data = 1; - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_reload(User * u) -{ - if (!read_config(1)) { - quitmsg = calloc(28 + strlen(u->nick), 1); - if (!quitmsg) - quitmsg = - "Error during the reload of the configuration file, but out of memory!"; - else - sprintf(quitmsg, - "Error during the reload of the configuration file!"); - quitting = 1; - } - - notice_lang(s_OperServ, u, OPER_RELOAD); - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_os_quit(User * u) -{ - quitmsg = calloc(28 + strlen(u->nick), 1); - if (!quitmsg) - quitmsg = "QUIT command received, but out of memory!"; - else - sprintf(quitmsg, "QUIT command received from %s", u->nick); - - if (GlobalOnCycle) { - oper_global(NULL, "%s", GlobalOnCycleMessage); - } - quitting = 1; - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_shutdown(User * u) -{ - quitmsg = calloc(32 + strlen(u->nick), 1); - if (!quitmsg) - quitmsg = "SHUTDOWN command received, but out of memory!"; - else - sprintf(quitmsg, "SHUTDOWN command received from %s", u->nick); - - if (GlobalOnCycle) { - oper_global(NULL, "%s", GlobalOnCycleMessage); - } - save_data = 1; - delayed_quit = 1; - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_restart(User * u) -{ -#ifdef SERVICES_BIN - quitmsg = calloc(31 + strlen(u->nick), 1); - if (!quitmsg) - quitmsg = "RESTART command received, but out of memory!"; - else - sprintf(quitmsg, "RESTART command received from %s", u->nick); - - if (GlobalOnCycle) { - oper_global(NULL, "%s", GlobalOnCycleMessage); - } - /* raise(SIGHUP); */ - do_restart_services(); -#else - notice_lang(s_OperServ, u, OPER_CANNOT_RESTART); -#endif - return MOD_CONT; -} - /*************************************************************************/ #ifdef DEBUG_COMMANDS @@ -4883,157 +1623,6 @@ static int do_matchwild(User * u) #endif /* DEBUG_COMMANDS */ /*************************************************************************/ - -/* Kill all users matching a certain host. The host is obtained from the - * supplied nick. The raw hostmsk is not supplied with the command in an effort - * to prevent abuse and mistakes from being made - which might cause *.com to - * be killed. It also makes it very quick and simple to use - which is usually - * what you want when someone starts loading numerous clones. In addition to - * killing the clones, we add a temporary AKILL to prevent them from - * immediately reconnecting. - * Syntax: KILLCLONES nick - * -TheShadow (29 Mar 1999) - */ - -static int do_killclones(User * u) -{ - char *clonenick = strtok(NULL, " "); - int count = 0; - User *cloneuser, *user, *tempuser; - char *clonemask, *akillmask; - char killreason[NICKMAX + 32]; - char akillreason[] = "Temporary KILLCLONES akill."; - - if (!clonenick) { - notice_lang(s_OperServ, u, OPER_KILLCLONES_SYNTAX); - - } else if (!(cloneuser = finduser(clonenick))) { - notice_lang(s_OperServ, u, OPER_KILLCLONES_UNKNOWN_NICK, - clonenick); - - } else { - clonemask = smalloc(strlen(cloneuser->host) + 5); - sprintf(clonemask, "*!*@%s", cloneuser->host); - - akillmask = smalloc(strlen(cloneuser->host) + 3); - sprintf(akillmask, "*@%s", cloneuser->host); - - user = firstuser(); - while (user) { - if (match_usermask(clonemask, user) != 0) { - tempuser = nextuser(); - count++; - snprintf(killreason, sizeof(killreason), - "Cloning [%d]", count); - kill_user(NULL, user->nick, killreason); - user = tempuser; - } else { - user = nextuser(); - } - } - - add_akill(u, akillmask, u->nick, - time(NULL) + KillClonesAkillExpire, akillreason); - - anope_cmd_global(s_OperServ, - "\2%s\2 used KILLCLONES for \2%s\2 killing " - "\2%d\2 clones. A temporary AKILL has been added " - "for \2%s\2.", u->nick, clonemask, count, - akillmask); - - alog("%s: KILLCLONES: %d clone(s) matching %s killed.", - s_OperServ, count, clonemask); - - free(akillmask); - free(clonemask); - } - return MOD_CONT; -} - -/** - * Defcon - A method of impelemting various stages of securty, the hope is this will help serives - * protect a network during an attack, allowing admins to choose the precautions taken at each - * level. - * - * /msg OperServ DefCon [level] - * - **/ - -static int do_defcon(User * u) -{ - char *lvl = strtok(NULL, " "); - int newLevel = 0; - char *langglobal; - langglobal = getstring(NULL, DEFCON_GLOBAL); - - if (!DefConLevel) { /* If we dont have a .conf setting! */ - notice_lang(s_OperServ, u, OPER_DEFCON_NO_CONF); - return MOD_CONT; - } - - if (!lvl) { - notice_lang(s_OperServ, u, OPER_DEFCON_CHANGED, DefConLevel); - defcon_sendlvls(u); - return MOD_CONT; - } - newLevel = atoi(lvl); - if (newLevel < 1 || newLevel > 5) { - notice_lang(s_OperServ, u, OPER_DEFCON_SYNTAX); - return MOD_CONT; - } - DefConLevel = newLevel; - send_event(EVENT_DEFCON_LEVEL, "%d", DefConLevel); - 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; -} - -/** - * Reverse the mode string, used for remove DEFCON chan modes. - **/ -char *defconReverseModes(const char *modes) -{ - char *newmodes = NULL; - int i = 0; - if (!modes) { - return NULL; - } - if (!(newmodes = malloc(sizeof(char) * strlen(modes) + 1))) { - return NULL; - } - for (i = 0; i < strlen(modes); i++) { - if (modes[i] == '+') - newmodes[i] = '-'; - else if (modes[i] == '-') - newmodes[i] = '+'; - else - newmodes[i] = modes[i]; - } - newmodes[i] = '\0'; - return newmodes; -} - /** * Returns 1 if the passed level is part of the CURRENT defcon, else 0 is returned **/ @@ -5043,42 +1632,17 @@ int checkDefCon(int level) } /** - * Run DefCon level specific Functions. - **/ -void runDefCon(void) -{ - char *newmodes; - if (checkDefCon(DEFCON_FORCE_CHAN_MODES)) { - if (DefConChanModes && !DefConModesSet) { - if (DefConChanModes[0] == '+' || DefConChanModes[0] == '-') { - alog("DEFCON: setting %s on all chan's", DefConChanModes); - do_mass_mode(DefConChanModes); - DefConModesSet = 1; - } - } - } else { - if (DefConChanModes && (DefConModesSet != 0)) { - if (DefConChanModes[0] == '+' || DefConChanModes[0] == '-') { - if ((newmodes = defconReverseModes(DefConChanModes))) { - alog("DEFCON: setting %s on all chan's", newmodes); - do_mass_mode(newmodes); - } - DefConModesSet = 0; - } - } - } -} - -/** * Automaticaly re-set the DefCon level if the time limit has expired. **/ void resetDefCon(int level) { + 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, "%d", DefConLevel); + 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), @@ -5100,257 +1664,56 @@ void resetDefCon(int level) } /** - * Send a message to the oper about which precautions are "active" for this level - **/ -static void defcon_sendlvls(User * u) -{ - if (checkDefCon(DEFCON_NO_NEW_CHANNELS)) { - notice_lang(s_OperServ, u, OPER_HELP_DEFCON_NO_NEW_CHANNELS); - } - if (checkDefCon(DEFCON_NO_NEW_NICKS)) { - notice_lang(s_OperServ, u, OPER_HELP_DEFCON_NO_NEW_NICKS); - } - if (checkDefCon(DEFCON_NO_MLOCK_CHANGE)) { - notice_lang(s_OperServ, u, OPER_HELP_DEFCON_NO_MLOCK_CHANGE); - } - if (checkDefCon(DEFCON_FORCE_CHAN_MODES) && (DefConChanModes)) { - notice_lang(s_OperServ, u, OPER_HELP_DEFCON_FORCE_CHAN_MODES, - DefConChanModes); - } - if (checkDefCon(DEFCON_REDUCE_SESSION)) { - notice_lang(s_OperServ, u, OPER_HELP_DEFCON_REDUCE_SESSION, - DefConSessionLimit); - } - if (checkDefCon(DEFCON_NO_NEW_CLIENTS)) { - notice_lang(s_OperServ, u, OPER_HELP_DEFCON_NO_NEW_CLIENTS); - } - if (checkDefCon(DEFCON_OPER_ONLY)) { - notice_lang(s_OperServ, u, OPER_HELP_DEFCON_OPER_ONLY); - } - if (checkDefCon(DEFCON_SILENT_OPER_ONLY)) { - notice_lang(s_OperServ, u, OPER_HELP_DEFCON_SILENT_OPER_ONLY); - } - if (checkDefCon(DEFCON_AKILL_NEW_CLIENTS)) { - notice_lang(s_OperServ, u, OPER_HELP_DEFCON_AKILL_NEW_CLIENTS); - } - if (checkDefCon(DEFCON_NO_NEW_MEMOS)) { - notice_lang(s_OperServ, u, OPER_HELP_DEFCON_NO_NEW_MEMOS); - } -} - -/** - * ChanKill - Akill an entire channel (got botnet?) - * - * /msg OperServ ChanKill +expire #channel reason - * + * Run DefCon level specific Functions. **/ - -static int do_chankill(User * u) +void runDefCon(void) { - char *expiry, *channel, *reason; - time_t expires; - char breason[BUFSIZE]; - char mask[USERMAX + HOSTMAX + 2]; - struct c_userlist *cu, *next; - Channel *c; - - channel = strtok(NULL, " "); - if (channel && *channel == '+') { - expiry = channel; - channel = strtok(NULL, " "); - } else { - expiry = NULL; - } - - expires = expiry ? dotime(expiry) : ChankillExpiry; - if (expiry && isdigit(expiry[strlen(expiry) - 1])) - expires *= 86400; - if (expires != 0 && expires < 60) { - notice_lang(s_OperServ, u, BAD_EXPIRY_TIME); - return MOD_CONT; - } else if (expires > 0) { - expires += time(NULL); - } - - if (channel && (reason = strtok(NULL, ""))) { - - if (AddAkiller) { - snprintf(breason, sizeof(breason), "[%s] %s", u->nick, reason); - reason = sstrdup(breason); - } - - if ((c = findchan(channel))) { - for (cu = c->users; cu; cu = next) { - next = cu->next; - if (is_oper(cu->user)) { - continue; - } - strncpy(mask, "*@", 3); /* Use *@" for the akill's, */ - strncat(mask, cu->user->host, HOSTMAX); - add_akill(NULL, mask, s_OperServ, expires, reason); - check_akill(cu->user->nick, cu->user->username, - cu->user->host, NULL, NULL); - } - if (WallOSAkill) { - anope_cmd_global(s_OperServ, "%s used CHANKILL on %s (%s)", - u->nick, channel, reason); + 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 { - notice_lang(s_OperServ, u, CHAN_X_NOT_IN_USE, channel); } } else { - syntax_error(s_OperServ, u, "CHANKILL", OPER_CHANKILL_SYNTAX); - } - return MOD_CONT; -} - -#ifdef USE_MODULES - -int do_modload(User * u) -{ - char *name; - Module *m; - - name = strtok(NULL, ""); - if (!name) { - syntax_error(s_OperServ, u, "MODLOAD", OPER_MODULE_LOAD_SYNTAX); - return MOD_CONT; - } - m = findModule(name); - if (!m) { - m = createModule(name); - mod_current_module = m; - mod_current_user = u; - mod_current_op = 1; - } else { - notice_lang(s_OperServ, u, OPER_MODULE_LOAD_FAIL, name); - } - return MOD_CONT; -} - -int do_modunload(User * u) -{ - char *name; - Module *m; - - name = strtok(NULL, ""); - if (!name) { - syntax_error(s_OperServ, u, "MODUNLOAD", - OPER_MODULE_UNLOAD_SYNTAX); - return MOD_CONT; - } - m = findModule(name); - if (m) { - mod_current_user = u; - mod_current_module = m; - mod_current_op = 2; - } else { - notice_lang(s_OperServ, u, OPER_MODULE_REMOVE_FAIL, name); - } - return MOD_CONT; -} - -int do_modlist(User * u) -{ - int idx; - int count = 0; - ModuleHash *current = NULL; - - 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) { - notice_lang(s_OperServ, u, OPER_MODULE_LIST, current->name, - current->m->version); - count++; + if (DefConChanModes && (DefConModesSet != 0)) { + if (DefConChanModes[0] == '+' || DefConChanModes[0] == '-') { + if ((newmodes = defconReverseModes(DefConChanModes))) { + alog("DEFCON: setting %s on all chan's", newmodes); + do_mass_mode(newmodes); + } + DefConModesSet = 0; + } } } - 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; } -int do_modinfo(User * u) +/** + * Reverse the mode string, used for remove DEFCON chan modes. + **/ +char *defconReverseModes(const char *modes) { - char *file; - struct tm tm; - char timebuf[64]; - Module *m; - int idx = 0; - int display = 0; - - file = strtok(NULL, ""); - if (!file) { - syntax_error(s_OperServ, u, "MODINFO", OPER_MODULE_INFO_SYNTAX); - return MOD_CONT; - } - m = findModule(file); - if (m) { - tm = *localtime(&m->time); - strftime_lang(timebuf, sizeof(timebuf), u, - STRFTIME_DATE_TIME_FORMAT, &tm); - notice_lang(s_OperServ, u, OPER_MODULE_INFO_LIST, m->name, - m->version ? m->version : "?", - m->author ? m->author : "?", timebuf); - for (idx = 0; idx < MAX_CMD_HASH; idx++) { - display += showModuleCmdLoaded(HOSTSERV[idx], m->name, u); - display += showModuleCmdLoaded(OPERSERV[idx], m->name, u); - display += showModuleCmdLoaded(NICKSERV[idx], m->name, u); - display += showModuleCmdLoaded(CHANSERV[idx], m->name, u); - display += showModuleCmdLoaded(BOTSERV[idx], m->name, u); - display += showModuleCmdLoaded(MEMOSERV[idx], m->name, u); - display += showModuleCmdLoaded(HELPSERV[idx], m->name, u); - display += showModuleMsgLoaded(IRCD[idx], m->name, u); - - } - } - if (display == 0) { - notice_lang(s_OperServ, u, OPER_MODULE_NO_INFO, file); + char *newmodes = NULL; + int i = 0; + if (!modes) { + return NULL; } - return MOD_CONT; -} - -static int showModuleCmdLoaded(CommandHash * cmdList, char *mod_name, - User * u) -{ - Command *c; - CommandHash *current; - int display = 0; - - for (current = cmdList; current; current = current->next) { - for (c = current->c; c; c = c->next) { - if ((c->mod_name) && (stricmp(c->mod_name, mod_name) == 0)) { - notice_lang(s_OperServ, u, OPER_MODULE_CMD_LIST, - c->service, c->name); - display++; - } - } + if (!(newmodes = malloc(sizeof(char) * strlen(modes) + 1))) { + return NULL; } - return display; -} - -static int showModuleMsgLoaded(MessageHash * msgList, char *mod_name, - User * u) -{ - Message *msg; - MessageHash *mcurrent; - int display = 0; - for (mcurrent = msgList; mcurrent; mcurrent = mcurrent->next) { - for (msg = mcurrent->m; msg; msg = msg->next) { - if ((msg->mod_name) && (stricmp(msg->mod_name, mod_name) == 0)) { - notice_lang(s_OperServ, u, OPER_MODULE_MSG_LIST, - msg->name); - display++; - } - } + for (i = 0; i < strlen(modes); i++) { + if (modes[i] == '+') + newmodes[i] = '-'; + else if (modes[i] == '-') + newmodes[i] = '+'; + else + newmodes[i] = modes[i]; } - return display; + newmodes[i] = '\0'; + return newmodes; } -#endif /*************************************************************************/ diff --git a/src/protocol/Makefile b/src/protocol/Makefile new file mode 100644 index 000000000..e73fd7e7c --- /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}' + +OBJECTS= $(SRCS:.c=.o) +SO_FILES=$(OBJECTS:.o=.s) +CDEFS= -g -rdynamic -Wall +CFLAGS=$(CFLAGS) $(CDEFS) + +all: modules subs + +modules: $(OBJECTS) $(SO_FILES) + +install: + $(CP) ./*.so $(MODULE_PATH) + +distclean: clean spotless + +.c.o: + $(CC) $(CFLAGS) -I../${INCLUDEDIR} -c $< + +.o.s: + $(CC) ${SHARED} $< -o $*.so ${PROFILE} + +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 *.so *.c~ core + +spotless: clean + rm -f *.so Makefile.inc + diff --git a/src/protocol/Makefile.sub b/src/protocol/Makefile.sub new file mode 100644 index 000000000..b060ca5b6 --- /dev/null +++ b/src/protocol/Makefile.sub @@ -0,0 +1,30 @@ +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}' + +OBJECTS= $(SRCS:.c=.o) +SO_FILES=$(OBJECTS:.o=.s) +CDEFS= -g -rdynamic -Wall +CFLAGS=$(CFLAGS) $(CDEFS) + +all: module + +module: $(OBJECTS) so + +distclean: clean spotless + +.c.o: + $(CC) $(CFLAGS) -I../ -I../../${INCLUDEDIR} -c $< + +so: + $(CC) ${SHARED} $(OBJECTS) -o ../$(TARGET).so ${PROFILE} + +clean: + rm -f *.o *.so *.c~ core + +spotless: clean + rm -f *~ + diff --git a/src/protocol/Makefile.win32 b/src/protocol/Makefile.win32 new file mode 100644 index 000000000..1f46f7534 --- /dev/null +++ b/src/protocol/Makefile.win32 @@ -0,0 +1,26 @@ +include ../../Makefile.inc.win32 + +SRCS=bahamut.c dreamforge.c hybrid.c inspircd.c plexus.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 + +all: $(OBJECTS) + +distclean: clean spotless + +.c.dll: + $(CC) $(CFLAGS) $< $(LFLAGS) + +clean: + -@del *.obj + +spotless: clean + -@del *.dll *.lib *.exp + +install: + -@mkdir ..\..\$(DATDEST)\modules + -@mkdir ..\..\$(DATDEST)\modules\runtime + -@copy *.dll ..\..\$(DATDEST)\modules diff --git a/src/bahamut.c b/src/protocol/bahamut.c index 1f54406bc..3cc213a7c 100644 --- a/src/bahamut.c +++ b/src/protocol/bahamut.c @@ -15,17 +15,9 @@ #include "services.h" #include "pseudo.h" +#include "bahamut.h" -#ifdef IRC_BAHAMUT - -const char version_protocol[] = "BahamutIRCd 1.4.*/1.8.*"; - -/* Not all ircds use +f for their flood/join throttle system */ -const char flood_mode_char_set[] = "+j"; /* mode char for FLOOD mode on set */ -const char flood_mode_char_remove[] = "-j"; /* mode char for FLOOD mode on remove */ -int UseTSMODE = 0; /* does send TSMODE but if it doesn't means it won't so this is disabled */ - -IRCDVar ircd[] = { +IRCDVar myIrcd[] = { {"BahamutIRCd 1.4.*/1.8.*", /* ircd name */ "+o", /* nickserv mode */ "+o", /* chanserv mode */ @@ -86,7 +78,6 @@ IRCDVar ircd[] = { 1, /* UMODE */ 0, /* VHOST ON NICK */ 0, /* Change RealName */ - 0, /* ChanServ extra */ 0, /* No Knock */ 0, /* Admin Only */ DEFAULT_MLOCK, /* Default MLOCK */ @@ -118,7 +109,7 @@ IRCDVar ircd[] = { {NULL} }; -IRCDCAPAB ircdcap[] = { +IRCDCAPAB myIrcdcap[] = { { CAPAB_NOQUIT, /* NOQUIT */ CAPAB_TSMODE, /* TSMODE */ @@ -152,7 +143,7 @@ IRCDCAPAB ircdcap[] = { }; -void anope_set_umode(User * user, int ac, char **av) +void bahamut_set_umode(User * user, int ac, char **av) { int add = 1; /* 1 if adding modes, 0 if deleting */ char *modes = av[0]; @@ -271,7 +262,7 @@ unsigned long umodes[128] = { 0, 0 /* ~ ‚ */ }; -char csmodes[128] = { +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, @@ -293,7 +284,7 @@ char csmodes[128] = { }; -CMMode cmmodes[128] = { +CMMode myCmmodes[128] = { {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, @@ -340,7 +331,7 @@ CMMode cmmodes[128] = { {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL} }; -CBMode cbmodes[128] = { +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}, @@ -406,7 +397,7 @@ CBMode cbmodes[128] = { {0}, {0}, {0}, {0} }; -CBModeInfo cbmodeinfos[] = { +CBModeInfo myCbmodeinfos[] = { {'c', CMODE_c, 0, NULL, NULL}, {'i', CMODE_i, 0, NULL, NULL}, {'j', CMODE_j, 0, get_flood, cs_get_flood}, @@ -424,7 +415,7 @@ CBModeInfo cbmodeinfos[] = { {0} }; -CUMode cumodes[128] = { +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}, @@ -472,56 +463,46 @@ CUMode cumodes[128] = { -void anope_cmd_mode(char *source, char *dest, const char *fmt, ...) +void bahamut_cmd_mode(char *source, char *dest, char *buf) { - 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; - } + 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); - } + 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 anope_cmd_svshold(char *nick) +void bahamut_cmd_svshold(char *nick) { send_cmd(ServerName, "SVSHOLD %s %d :%s", nick, NSReleaseTimeout, "Being held for registered user"); } /* SVSHOLD - release */ -void anope_cmd_release_svshold(char *nick) +void bahamut_cmd_release_svshold(char *nick) { send_cmd(ServerName, "SVSHOLD %s 0", nick); } /* SVSMODE -b */ -void anope_cmd_unban(char *name, char *nick) +void bahamut_cmd_unban(char *name, char *nick) { - anope_cmd_svsmode_chan(name, "-b", nick); + bahamut_cmd_svsmode_chan(name, "-b", nick); } /* SVSMODE channel modes */ -void anope_cmd_svsmode_chan(char *name, char *mode, char *nick) +void bahamut_cmd_svsmode_chan(char *name, char *mode, char *nick) { if (nick) { send_cmd(ServerName, "SVSMODE %s %s %s", name, mode, nick); @@ -530,7 +511,7 @@ void anope_cmd_svsmode_chan(char *name, char *mode, char *nick) } } -void anope_cmd_bot_chan_mode(char *nick, char *chan) +void bahamut_cmd_bot_chan_mode(char *nick, char *chan) { anope_cmd_mode(nick, chan, "%s %s", ircd->botchanumode, nick); } @@ -707,7 +688,7 @@ void moduleAddIRCDMsgs(void) { /* *INDENT-ON* */ /* SQLINE */ -void anope_cmd_sqline(char *mask, char *reason) +void bahamut_cmd_sqline(char *mask, char *reason) { if (!mask || !reason) { return; @@ -717,13 +698,13 @@ void anope_cmd_sqline(char *mask, char *reason) } /* UNSGLINE */ -void anope_cmd_unsgline(char *mask) +void bahamut_cmd_unsgline(char *mask) { send_cmd(NULL, "UNSGLINE 0 :%s", mask); } /* UNSZLINE */ -void anope_cmd_unszline(char *mask) +void bahamut_cmd_unszline(char *mask) { /* this will likely fail so its only here for legacy */ send_cmd(NULL, "UNSZLINE 0 %s", mask); @@ -732,7 +713,7 @@ void anope_cmd_unszline(char *mask) } /* SZLINE */ -void anope_cmd_szline(char *mask, char *reason, char *whom) +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); @@ -742,41 +723,31 @@ void anope_cmd_szline(char *mask, char *reason, char *whom) } /* SVSNOOP */ -void anope_cmd_svsnoop(char *server, int set) +void bahamut_cmd_svsnoop(char *server, int set) { send_cmd(NULL, "SVSNOOP %s %s", server, (set ? "+" : "-")); } -void anope_cmd_svsadmin(char *server, int set) +void bahamut_cmd_svsadmin(char *server, int set) { - anope_cmd_svsnoop(server, set); + bahamut_cmd_svsnoop(server, set); } /* SGLINE */ -void anope_cmd_sgline(char *mask, char *reason) +void bahamut_cmd_sgline(char *mask, char *reason) { send_cmd(NULL, "SGLINE %d :%s:%s", strlen(mask), mask, reason); } /* RAKILL */ -void anope_cmd_remove_akill(char *user, char *host) +void bahamut_cmd_remove_akill(char *user, char *host) { send_cmd(NULL, "RAKILL %s %s", host, user); } /* PART */ -void anope_cmd_part(char *nick, char *chan, const char *fmt, ...) +void bahamut_cmd_part(char *nick, char *chan, char *buf) { - va_list args; - char buf[BUFSIZE]; - *buf = '\0'; - - if (fmt) { - va_start(args, fmt); - vsnprintf(buf, BUFSIZE - 1, fmt, args); - va_end(args); - } - if (!nick || !chan) { return; } @@ -789,25 +760,30 @@ void anope_cmd_part(char *nick, char *chan, const char *fmt, ...) } /* TOPIC */ -void anope_cmd_topic(char *whosets, char *chan, char *whosetit, - char *topic, time_t when) +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 anope_cmd_unsqline(char *user) +void bahamut_cmd_unsqline(char *user) { send_cmd(NULL, "UNSQLINE %s", user); } /* JOIN - SJOIN */ -void anope_cmd_join(char *user, char *channel, time_t chantime) +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 @@ -816,8 +792,8 @@ void anope_cmd_join(char *user, char *channel, time_t chantime) * parv[5]=time set * parv[6]=reason */ -void anope_cmd_akill(char *user, char *host, char *who, time_t when, - time_t expires, char *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); @@ -832,21 +808,10 @@ void anope_cmd_akill(char *user, char *host, char *who, time_t when, /* Note: if the stamp is null 0, the below usage is correct of Bahamut */ -void anope_cmd_svskill(char *source, char *user, const char *fmt, ...) +void bahamut_cmd_svskill(char *source, char *user, char *buf) { - va_list args; - char buf[BUFSIZE]; - *buf = '\0'; - - if (!source || !user || !fmt) { - return; - } - - va_start(args, fmt); - vsnprintf(buf, BUFSIZE - 1, fmt, args); - va_end(args); - if (!buf) { + if (!source || !user || !buf) { return; } @@ -860,7 +825,7 @@ void anope_cmd_svskill(char *source, char *user, const char *fmt, ...) * parv[3] - mode (or services id if old svs version) * parv[4] - optional arguement (services id) */ -void anope_cmd_svsmode(User * u, int ac, char **av) +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 ? " " : ""), @@ -873,36 +838,17 @@ void anope_cmd_svsmode(User * u, int ac, char **av) * parv[1] = server name * parv[2] = comment */ -void anope_cmd_squit(char *servname, char *message) +void bahamut_cmd_squit(char *servname, char *message) { send_cmd(NULL, "SQUIT %s :%s", servname, message); } /* PONG */ -void anope_cmd_pong(char *servname, char *who) +void bahamut_cmd_pong(char *servname, char *who) { send_cmd(servname, "PONG %s", who); } -void anope_cmd_connect(int servernum) -{ - me_server = - new_server(NULL, ServerName, ServerDesc, SERVER_ISME, NULL); - - if (servernum == 1) { - anope_cmd_pass(RemotePassword); - } else if (servernum == 2) { - anope_cmd_pass(RemotePassword2); - } else if (servernum == 3) { - anope_cmd_pass(RemotePassword3); - } - anope_cmd_capab(); - anope_cmd_server(ServerName, 1, ServerDesc); - anope_cmd_svinfo(); - anope_cmd_burst(); -} - - /* * SVINFO * parv[0] = sender prefix @@ -911,30 +857,52 @@ void anope_cmd_connect(int servernum) * parv[3] = server is standalone or connected to non-TS only * parv[4] = server's idea of UTC time */ -void anope_cmd_svinfo() +void bahamut_cmd_svinfo() { send_cmd(NULL, "SVINFO 3 1 0 :%ld", (long int) time(NULL)); } /* PASS */ -void anope_cmd_pass(char *pass) +void bahamut_cmd_pass(char *pass) { send_cmd(NULL, "PASS %s :TS", pass); } /* SERVER */ -void anope_cmd_server(char *servname, int hop, char *descript) +void bahamut_cmd_server(char *servname, int hop, char *descript) { send_cmd(NULL, "SERVER %s %d :%s", servname, hop, ServerDesc); } /* CAPAB */ -void anope_cmd_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) { @@ -1062,63 +1030,35 @@ int anope_event_motd(char *source, int ac, char **av) return MOD_CONT; } -void anope_cmd_notice_ops(char *source, char *dest, const char *fmt, ...) +void bahamut_cmd_notice_ops(char *source, char *dest, char *buf) { - 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, "NOTICE @%s :%s", dest, buf); + if (!buf) { + return; } + send_cmd(NULL, "NOTICE @%s :%s", dest, buf); } /* NOTICE */ -void anope_cmd_notice(char *source, char *dest, const char *fmt, ...) +void bahamut_cmd_notice(char *source, char *dest, char *buf) { - va_list args; - char buf[BUFSIZE]; - *buf = '\0'; - - if (fmt) { - va_start(args, fmt); - vsnprintf(buf, sizeof(buf), fmt, args); - va_end(args); - } if (!buf) { return; } if (UsePrivmsg) { - anope_cmd_privmsg2(source, dest, buf); + bahamut_cmd_privmsg2(source, dest, buf); } else { send_cmd(source, "NOTICE %s :%s", dest, buf); } } -void anope_cmd_notice2(char *source, char *dest, char *msg) +void bahamut_cmd_notice2(char *source, char *dest, char *msg) { send_cmd(source, "NOTICE %s :%s", dest, msg); } -void anope_cmd_privmsg(char *source, char *dest, const char *fmt, ...) +void bahamut_cmd_privmsg(char *source, char *dest, char *buf) { - 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; } @@ -1126,33 +1066,24 @@ void anope_cmd_privmsg(char *source, char *dest, const char *fmt, ...) send_cmd(source, "PRIVMSG %s :%s", dest, buf); } -void anope_cmd_privmsg2(char *source, char *dest, char *msg) +void bahamut_cmd_privmsg2(char *source, char *dest, char *msg) { send_cmd(source, "PRIVMSG %s :%s", dest, msg); } -void anope_cmd_serv_notice(char *source, char *dest, char *msg) +void bahamut_cmd_serv_notice(char *source, char *dest, char *msg) { send_cmd(source, "NOTICE $%s :%s", dest, msg); } -void anope_cmd_serv_privmsg(char *source, char *dest, char *msg) +void bahamut_cmd_serv_privmsg(char *source, char *dest, char *msg) { send_cmd(source, "PRIVMSG $%s :%s", dest, msg); } /* GLOBOPS */ -void anope_cmd_global(char *source, const char *fmt, ...) +void bahamut_cmd_global(char *source, char *buf) { - 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; } @@ -1161,7 +1092,7 @@ void anope_cmd_global(char *source, const char *fmt, ...) } /* 391 */ -void anope_cmd_391(char *source, char *timestr) +void bahamut_cmd_391(char *source, char *timestr) { if (!timestr) { return; @@ -1170,17 +1101,8 @@ void anope_cmd_391(char *source, char *timestr) } /* 250 */ -void anope_cmd_250(const char *fmt, ...) +void bahamut_cmd_250(char *buf) { - 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; } @@ -1189,17 +1111,8 @@ void anope_cmd_250(const char *fmt, ...) } /* 307 */ -void anope_cmd_307(const char *fmt, ...) +void bahamut_cmd_307(char *buf) { - 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; } @@ -1208,17 +1121,8 @@ void anope_cmd_307(const char *fmt, ...) } /* 311 */ -void anope_cmd_311(const char *fmt, ...) +void bahamut_cmd_311(char *buf) { - 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; } @@ -1227,17 +1131,8 @@ void anope_cmd_311(const char *fmt, ...) } /* 312 */ -void anope_cmd_312(const char *fmt, ...) +void bahamut_cmd_312(char *buf) { - 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; } @@ -1246,17 +1141,8 @@ void anope_cmd_312(const char *fmt, ...) } /* 317 */ -void anope_cmd_317(const char *fmt, ...) +void bahamut_cmd_317(char *buf) { - 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; } @@ -1265,7 +1151,7 @@ void anope_cmd_317(const char *fmt, ...) } /* 219 */ -void anope_cmd_219(char *source, char *letter) +void bahamut_cmd_219(char *source, char *letter) { if (!source) { return; @@ -1280,7 +1166,7 @@ void anope_cmd_219(char *source, char *letter) } /* 401 */ -void anope_cmd_401(char *source, char *who) +void bahamut_cmd_401(char *source, char *who) { if (!source || !who) { return; @@ -1289,7 +1175,7 @@ void anope_cmd_401(char *source, char *who) } /* 318 */ -void anope_cmd_318(char *source, char *who) +void bahamut_cmd_318(char *source, char *who) { if (!source || !who) { return; @@ -1299,17 +1185,8 @@ void anope_cmd_318(char *source, char *who) } /* 242 */ -void anope_cmd_242(const char *fmt, ...) +void bahamut_cmd_242(char *buf) { - 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; } @@ -1318,17 +1195,8 @@ void anope_cmd_242(const char *fmt, ...) } /* 243 */ -void anope_cmd_243(const char *fmt, ...) +void bahamut_cmd_243(char *buf) { - 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; } @@ -1337,17 +1205,8 @@ void anope_cmd_243(const char *fmt, ...) } /* 211 */ -void anope_cmd_211(const char *fmt, ...) +void bahamut_cmd_211(char *buf) { - 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; } @@ -1355,28 +1214,17 @@ void anope_cmd_211(const char *fmt, ...) send_cmd(NULL, "211 %s ", buf); } -void anope_cmd_nick(char *nick, char *name, char *modes) +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); - anope_cmd_sqline(nick, "Reserved for services"); + bahamut_cmd_sqline(nick, "Reserved for services"); } -void anope_cmd_kick(char *source, char *chan, char *user, const char *fmt, - ...) +void bahamut_cmd_kick(char *source, char *chan, char *user, char *buf) { - 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) { send_cmd(source, "KICK %s %s :%s", chan, user, buf); } else { @@ -1384,30 +1232,30 @@ void anope_cmd_kick(char *source, char *chan, char *user, const char *fmt, } } -void anope_cmd_372(char *source, char *msg) +void bahamut_cmd_372(char *source, char *msg) { send_cmd(ServerName, "372 %s :- %s", source, msg); } -void anope_cmd_372_error(char *source) +void bahamut_cmd_372_error(char *source) { send_cmd(ServerName, "422 %s :- MOTD file not found! Please " "contact your IRC administrator.", source); } -void anope_cmd_375(char *source) +void bahamut_cmd_375(char *source) { send_cmd(ServerName, "375 %s :- %s Message of the Day", source, ServerName); } -void anope_cmd_376(char *source) +void bahamut_cmd_376(char *source) { send_cmd(ServerName, "376 %s :End of /MOTD command.", source); } /* INVITE */ -void anope_cmd_invite(char *source, char *chan, char *nick) +void bahamut_cmd_invite(char *source, char *chan, char *nick) { if (!source || !chan || !nick) { return; @@ -1417,18 +1265,8 @@ void anope_cmd_invite(char *source, char *chan, char *nick) } /* QUIT */ -void anope_cmd_quit(char *source, const char *fmt, ...) +void bahamut_cmd_quit(char *source, char *buf) { - 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) { send_cmd(source, "QUIT :%s", buf); } else { @@ -1453,24 +1291,24 @@ int anope_event_ping(char *source, int ac, char **av) { if (ac < 1) return MOD_CONT; - anope_cmd_pong(ac > 1 ? av[1] : ServerName, av[0]); + bahamut_cmd_pong(ac > 1 ? av[1] : ServerName, av[0]); return MOD_CONT; } -void anope_cmd_351(char *source) +void bahamut_cmd_351(char *source) { send_cmd(ServerName, "351 %s Anope-%s %s :%s - %s -- %s", source, version_number, ServerName, ircd->name, version_flags, version_build); } -void anope_cmd_bot_nick(char *nick, char *user, char *host, char *real, - char *modes) +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); - anope_cmd_sqline(nick, "Reserved for services"); + bahamut_cmd_sqline(nick, "Reserved for services"); } /* SVSNICK */ @@ -1479,7 +1317,7 @@ void anope_cmd_bot_nick(char *nick, char *user, char *host, char *real, * parv[2] = new nickname * parv[3] = timestamp */ -void anope_cmd_svsnick(char *source, char *guest, time_t when) +void bahamut_cmd_svsnick(char *source, char *guest, time_t when) { if (!source || !guest) { return; @@ -1487,31 +1325,31 @@ void anope_cmd_svsnick(char *source, char *guest, time_t when) send_cmd(NULL, "SVSNICK %s %s :%ld", source, guest, (long int) when); } -void anope_cmd_guest_nick(char *nick, char *user, char *host, char *real, - char *modes) +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 anope_cmd_svso(char *source, char *nick, char *flag) +void bahamut_cmd_svso(char *source, char *nick, char *flag) { /* Not Supported by this IRCD */ } -void anope_cmd_vhost_on(char *nick, char *vIdent, char *vhost) +void bahamut_cmd_vhost_on(char *nick, char *vIdent, char *vhost) { /* Not Supported by this IRCD */ } -void anope_cmd_vhost_off(User * u) +void bahamut_cmd_vhost_off(User * u) { /* Not Supported by this IRCD */ } /* SVSMODE +d */ /* sent if svid is something weird */ -void anope_cmd_svid_umode(char *nick, time_t ts) +void bahamut_cmd_svid_umode(char *nick, time_t ts) { send_cmd(ServerName, "SVSMODE %s %lu +d 1", nick, (unsigned long int) ts); @@ -1520,19 +1358,19 @@ void anope_cmd_svid_umode(char *nick, time_t ts) /* SVSMODE +d */ /* nc_change was = 1, and there is no na->status */ -void anope_cmd_nc_change(User * u) +void bahamut_cmd_nc_change(User * u) { common_svsmode(u, "+d", "1"); } /* SVSMODE +d */ -void anope_cmd_svid_umode2(User * u, char *ts) +void bahamut_cmd_svid_umode2(User * u, char *ts) { /* not used by bahamut ircds */ } -void anope_cmd_svid_umode3(User * u, char *ts) +void bahamut_cmd_svid_umode3(User * u, char *ts) { if (u->svid != u->timestamp) { common_svsmode(u, "+rd", ts); @@ -1542,7 +1380,7 @@ void anope_cmd_svid_umode3(User * u, char *ts) } /* NICK <newnick> */ -void anope_cmd_chg_nick(char *oldnick, char *newnick) +void bahamut_cmd_chg_nick(char *oldnick, char *newnick) { if (!oldnick || !newnick) { return; @@ -1582,28 +1420,23 @@ int anope_event_pass(char *source, int ac, char **av) return MOD_CONT; } -void anope_cmd_svsjoin(char *source, char *nick, char *chan) +void bahamut_cmd_svsjoin(char *source, char *nick, char *chan) { /* Can not find any reference to these in Bahamut */ } -void anope_cmd_svspart(char *source, char *nick, char *chan) +void bahamut_cmd_svspart(char *source, char *nick, char *chan) { /* Can not find any reference to these in Bahamut */ } -void anope_cmd_swhois(char *source, char *who, char *mask) +void bahamut_cmd_swhois(char *source, char *who, char *mask) { /* not supported */ } -void anope_cmd_burst() -{ - send_cmd(NULL, "BURST"); -} - -void anope_cmd_eob() +void bahamut_cmd_eob() { send_cmd(NULL, "BURST 0"); } @@ -1646,7 +1479,7 @@ int anope_event_admin(char *source, int ac, char **av) return MOD_CONT; } -int anope_flood_mode_check(char *value) +int bahamut_flood_mode_check(char *value) { char *dp, *end; @@ -1660,20 +1493,20 @@ int anope_flood_mode_check(char *value) } } -void anope_cmd_jupe(char *jserver, char *who, char *reason) +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 : ""); - anope_cmd_squit(jserver, rbuf); - anope_cmd_server(jserver, 2, rbuf); + 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 anope_cmd_global_legacy(char *source, char *fmt) +void bahamut_cmd_global_legacy(char *source, char *fmt) { send_cmd(source ? source : ServerName, "GLOBOPS :%s", fmt); } @@ -1682,24 +1515,15 @@ void anope_cmd_global_legacy(char *source, char *fmt) 1 = valid nick 0 = nick is in valid */ -int anope_valid_nick(char *nick) +int bahamut_valid_nick(char *nick) { /* no hard coded invalid nicks */ return 1; } -void anope_cmd_ctcp(char *source, char *dest, const char *fmt, ...) +void bahamut_cmd_ctcp(char *source, char *dest, char *buf) { - va_list args; - char buf[BUFSIZE]; char *s; - *buf = '\0'; - - if (fmt) { - va_start(args, fmt); - vsnprintf(buf, BUFSIZE - 1, fmt, args); - va_end(args); - } if (!buf) { return; } else { @@ -1712,11 +1536,124 @@ void anope_cmd_ctcp(char *source, char *dest, const char *fmt, ...) /* this avoids "undefined symbol" messages of those whom try to load mods that call on this function */ -void anope_cmd_chghost(char *nick, char *vhost) +void bahamut_cmd_chghost(char *nick, char *vhost) { if (debug) { alog("debug: This IRCD does not support vhosting"); } } -#endif +/** + * 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_unsqline); + 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_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_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..7dd79b732 --- /dev/null +++ b/src/protocol/bahamut.h @@ -0,0 +1,131 @@ +/* Bahamut functions + * + * (C) 2003-2005 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/configure b/src/protocol/configure new file mode 100755 index 000000000..119c7c887 --- /dev/null +++ b/src/protocol/configure @@ -0,0 +1,35 @@ +#!/bin/sh + +echo -n "SRCS=" > ./Makefile.inc +FIRST=1 +for oldfile in *.c +do + if [ "$FIRST" = 1 ] ; then + echo -n " "$oldfile >> ./Makefile.inc + else + echo "\\" >> ./Makefile.inc + echo -n " " $oldfile >> ./Makefile.inc + fi + FIRST=0 +done +echo "" >> ./Makefile.inc + +echo -n "SUBS=" >> ./Makefile.inc +FIRST=1 +for dir in * +do + if [ -d $dir ] ; then + if [ -f $dir/Makefile ] ; then + if [ "$FIRST" = 1 ] ; then + echo -n " "$dir >> ./Makefile.inc + else + echo "\\" >> ./Makefile.inc + echo -n " " $dir >> ./Makefile.inc + fi + FIRST=0 + fi + fi +done + +exit 0 + diff --git a/src/dreamforge.c b/src/protocol/dreamforge.c index 9174353f7..6c77608f5 100644 --- a/src/dreamforge.c +++ b/src/protocol/dreamforge.c @@ -13,17 +13,9 @@ #include "services.h" #include "pseudo.h" +#include "dreamforge.h" -#ifdef IRC_DREAMFORGE - -const char version_protocol[] = "DreamForge 4.6.7"; - -/* Not all ircds use +f for their flood/join throttle system */ -const char flood_mode_char_set[] = ""; /* mode char for FLOOD mode on set */ -const char flood_mode_char_remove[] = ""; /* mode char for FLOOD mode on remove */ -int UseTSMODE = 0; - -IRCDVar ircd[] = { +IRCDVar myIrcd[] = { {"DreamForge 4.6.7", /* ircd name */ "+o", /* nickserv mode */ "+o", /* chanserv mode */ @@ -84,7 +76,6 @@ IRCDVar ircd[] = { 1, /* UMODE */ 0, /* VHOST ON NICK */ 0, /* Change RealName */ - 0, /* ChanServ extra */ 0, /* No Knock */ 0, /* Admin Only */ DEFAULT_MLOCK, /* Default MLOCK */ @@ -116,7 +107,7 @@ IRCDVar ircd[] = { {NULL} }; -IRCDCAPAB ircdcap[] = { +IRCDCAPAB myIrcdcap[] = { { CAPAB_NOQUIT, /* NOQUIT */ 0, /* TSMODE */ @@ -149,7 +140,7 @@ IRCDCAPAB ircdcap[] = { 0, 0, 0} }; -void anope_set_umode(User * user, int ac, char **av) +void dreamforge_set_umode(User * user, int ac, char **av) { int add = 1; /* 1 if adding modes, 0 if deleting */ char *modes = av[0]; @@ -259,7 +250,7 @@ unsigned long umodes[128] = { 0, 0 /* ~ ‚ */ }; -char csmodes[128] = { +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, @@ -281,7 +272,7 @@ char csmodes[128] = { }; -CMMode cmmodes[128] = { +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}, @@ -307,7 +298,7 @@ CMMode cmmodes[128] = { }; -CBMode cbmodes[128] = { +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}, @@ -373,7 +364,7 @@ CBMode cbmodes[128] = { {0}, {0}, {0}, {0} }; -CBModeInfo cbmodeinfos[] = { +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}, @@ -387,7 +378,7 @@ CBModeInfo cbmodeinfos[] = { {0} }; -CUMode cumodes[128] = { +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}, @@ -517,46 +508,36 @@ int anope_event_capab(char *source, int ac, char **av) return MOD_CONT; } -void anope_cmd_sqline(char *mask, char *reason) +void dreamforge_cmd_sqline(char *mask, char *reason) { send_cmd(NULL, "SQLINE %s :%s", mask, reason); } -void anope_cmd_svsnoop(char *server, int set) +void dreamforge_cmd_svsnoop(char *server, int set) { send_cmd(NULL, "SVSNOOP %s %s", server, (set ? "+" : "-")); } -void anope_cmd_svsadmin(char *server, int set) +void dreamforge_cmd_svsadmin(char *server, int set) { - anope_cmd_svsnoop(server, set); + dreamforge_cmd_svsnoop(server, set); } -void anope_cmd_remove_akill(char *user, char *host) +void dreamforge_cmd_remove_akill(char *user, char *host) { send_cmd(NULL, "RAKILL %s %s", host, user); } -void anope_cmd_topic(char *whosets, char *chan, char *whosetit, - char *topic, time_t when) +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 anope_cmd_part(char *nick, char *chan, const char *fmt, ...) +void dreamforge_cmd_part(char *nick, char *chan, char *buf) { - va_list args; - char buf[BUFSIZE]; - *buf = '\0'; - - if (fmt) { - va_start(args, fmt); - vsnprintf(buf, BUFSIZE - 1, fmt, args); - va_end(args); - } - if (!nick || !chan) { return; } @@ -569,34 +550,25 @@ void anope_cmd_part(char *nick, char *chan, const char *fmt, ...) } -void anope_cmd_unsqline(char *user) +void dreamforge_cmd_unsqline(char *user) { send_cmd(NULL, "UNSQLINE %s", user); } -void anope_cmd_join(char *user, char *channel, time_t chantime) +void dreamforge_cmd_join(char *user, char *channel, time_t chantime) { send_cmd(user, "JOIN %s", channel); } -void anope_cmd_akill(char *user, char *host, char *who, time_t when, - time_t expires, char *reason) +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 anope_cmd_svskill(char *source, char *user, const char *fmt, ...) +void dreamforge_cmd_svskill(char *source, char *user, char *buf) { - 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; } @@ -608,14 +580,14 @@ void anope_cmd_svskill(char *source, char *user, const char *fmt, ...) send_cmd(source, "KILL %s :%s", user, buf); } -void anope_cmd_svsmode(User * u, int ac, char **av) +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 anope_cmd_squit(char *servname, char *message) +void dreamforge_cmd_squit(char *servname, char *message) { send_cmd(NULL, "SQUIT %s :%s", servname, message); } @@ -625,55 +597,48 @@ void anope_pong(char *servname) send_cmd(servname, "PONG %s", servname); } -void anope_cmd_connect(int servernum) -{ - me_server = - new_server(NULL, ServerName, ServerDesc, SERVER_ISME, NULL); - - anope_cmd_capab(); - if (servernum == 1) - anope_cmd_pass(RemotePassword); - if (servernum == 2) - anope_cmd_pass(RemotePassword2); - if (servernum == 3) - anope_cmd_pass(RemotePassword3); - anope_cmd_server(ServerName, 1, ServerDesc); -} - /* PASS */ -void anope_cmd_pass(char *pass) +void dreamforge_cmd_pass(char *pass) { send_cmd(NULL, "PASS :%s", pass); } -void anope_cmd_capab() +void dreamforge_cmd_capab() { send_cmd(NULL, "PROTOCTL NOQUIT"); } -void anope_cmd_bot_chan_mode(char *nick, char *chan) +/* SERVER name hop descript */ +void dreamforge_cmd_server(char *servname, int hop, char *descript) { - anope_cmd_mode(nick, chan, "%s %s %s", ircd->botchanumode, nick, nick); + send_cmd(NULL, "SERVER %s %d :%s", servname, hop, descript); } -/* SERVER name hop descript */ -void anope_cmd_server(char *servname, int hop, char *descript) +void dreamforge_cmd_connect(int servernum) { - send_cmd(NULL, "SERVER %s %d :%s", servname, hop, descript); + 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); } -/* GLOBOPS */ -void anope_cmd_global(char *source, const char *fmt, ...) +void dreamforge_cmd_bot_chan_mode(char *nick, char *chan) { - va_list args; - char buf[BUFSIZE]; - *buf = '\0'; + anope_cmd_mode(nick, chan, "%s %s %s", ircd->botchanumode, nick, nick); +} - if (fmt) { - va_start(args, fmt); - vsnprintf(buf, BUFSIZE - 1, fmt, args); - va_end(args); - } + + +/* GLOBOPS */ +void dreamforge_cmd_global(char *source, char *buf) +{ if (!buf) { return; } @@ -769,17 +734,8 @@ int anope_event_motd(char *source, int ac, char **av) return MOD_CONT; } -void anope_cmd_mode(char *source, char *dest, const char *fmt, ...) +void dreamforge_cmd_mode(char *source, char *dest, char *buf) { - 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; } @@ -787,17 +743,8 @@ void anope_cmd_mode(char *source, char *dest, const char *fmt, ...) send_cmd(source, "MODE %s %s", dest, buf); } -void anope_cmd_notice_ops(char *source, char *dest, const char *fmt, ...) +void dreamforge_cmd_notice_ops(char *source, char *dest, char *buf) { - 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; } @@ -806,44 +753,26 @@ void anope_cmd_notice_ops(char *source, char *dest, const char *fmt, ...) } -void anope_cmd_notice(char *source, char *dest, const char *fmt, ...) +void dreamforge_cmd_notice(char *source, char *dest, char *buf) { - 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; } if (UsePrivmsg) { - anope_cmd_privmsg2(source, dest, buf); + dreamforge_cmd_privmsg2(source, dest, buf); } else { send_cmd(source, "NOTICE %s :%s", dest, buf); } } -void anope_cmd_notice2(char *source, char *dest, char *msg) +void dreamforge_cmd_notice2(char *source, char *dest, char *msg) { send_cmd(source, "NOTICE %s :%s", dest, msg); } -void anope_cmd_privmsg(char *source, char *dest, const char *fmt, ...) +void dreamforge_cmd_privmsg(char *source, char *dest, char *buf) { - 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; } @@ -851,22 +780,22 @@ void anope_cmd_privmsg(char *source, char *dest, const char *fmt, ...) send_cmd(source, "PRIVMSG %s :%s", dest, buf); } -void anope_cmd_privmsg2(char *source, char *dest, char *msg) +void dreamforge_cmd_privmsg2(char *source, char *dest, char *msg) { send_cmd(source, "PRIVMSG %s :%s", dest, msg); } -void anope_cmd_serv_notice(char *source, char *dest, char *msg) +void dreamforge_cmd_serv_notice(char *source, char *dest, char *msg) { send_cmd(source, "NOTICE $%s :%s", dest, msg); } -void anope_cmd_serv_privmsg(char *source, char *dest, char *msg) +void dreamforge_cmd_serv_privmsg(char *source, char *dest, char *msg) { send_cmd(source, "PRIVMSG $%s :%s", dest, msg); } -void anope_cmd_351(char *source) +void dreamforge_cmd_351(char *source) { send_cmd(ServerName, "351 %s Anope-%s %s :%s - %s -- %s", source, version_number, ServerName, ircd->name, version_flags, @@ -874,18 +803,8 @@ void anope_cmd_351(char *source) } /* QUIT */ -void anope_cmd_quit(char *source, const char *fmt, ...) +void dreamforge_cmd_quit(char *source, char *buf) { - 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) { send_cmd(source, "QUIT :%s", buf); } else { @@ -894,7 +813,7 @@ void anope_cmd_quit(char *source, const char *fmt, ...) } /* 391 */ -void anope_cmd_391(char *source, char *timestr) +void dreamforge_cmd_391(char *source, char *timestr) { if (!timestr) { return; @@ -903,17 +822,8 @@ void anope_cmd_391(char *source, char *timestr) } /* 250 */ -void anope_cmd_250(const char *fmt, ...) +void dreamforge_cmd_250(char *buf) { - 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; } @@ -922,17 +832,8 @@ void anope_cmd_250(const char *fmt, ...) } /* 307 */ -void anope_cmd_307(const char *fmt, ...) +void dreamforge_cmd_307(char *buf) { - 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; } @@ -941,17 +842,8 @@ void anope_cmd_307(const char *fmt, ...) } /* 311 */ -void anope_cmd_311(const char *fmt, ...) +void dreamforge_cmd_311(char *buf) { - 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; } @@ -960,17 +852,8 @@ void anope_cmd_311(const char *fmt, ...) } /* 312 */ -void anope_cmd_312(const char *fmt, ...) +void dreamforge_cmd_312(char *buf) { - 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; } @@ -979,17 +862,8 @@ void anope_cmd_312(const char *fmt, ...) } /* 317 */ -void anope_cmd_317(const char *fmt, ...) +void dreamforge_cmd_317(char *buf) { - 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; } @@ -998,7 +872,7 @@ void anope_cmd_317(const char *fmt, ...) } /* 219 */ -void anope_cmd_219(char *source, char *letter) +void dreamforge_cmd_219(char *source, char *letter) { if (!source) { return; @@ -1013,7 +887,7 @@ void anope_cmd_219(char *source, char *letter) } /* 401 */ -void anope_cmd_401(char *source, char *who) +void dreamforge_cmd_401(char *source, char *who) { if (!source || !who) { return; @@ -1022,7 +896,7 @@ void anope_cmd_401(char *source, char *who) } /* 318 */ -void anope_cmd_318(char *source, char *who) +void dreamforge_cmd_318(char *source, char *who) { if (!source || !who) { return; @@ -1032,17 +906,8 @@ void anope_cmd_318(char *source, char *who) } /* 242 */ -void anope_cmd_242(const char *fmt, ...) +void dreamforge_cmd_242(char *buf) { - 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; } @@ -1051,17 +916,8 @@ void anope_cmd_242(const char *fmt, ...) } /* 243 */ -void anope_cmd_243(const char *fmt, ...) +void dreamforge_cmd_243(char *buf) { - 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; } @@ -1070,17 +926,8 @@ void anope_cmd_243(const char *fmt, ...) } /* 211 */ -void anope_cmd_211(const char *fmt, ...) +void dreamforge_cmd_211(char *buf) { - 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; } @@ -1088,29 +935,18 @@ void anope_cmd_211(const char *fmt, ...) send_cmd(NULL, "211 %s ", buf); } -void anope_cmd_nick(char *nick, char *name, char *modes) +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); - anope_cmd_sqline(nick, "Reserved for services"); + dreamforge_cmd_sqline(nick, "Reserved for services"); } -void anope_cmd_kick(char *source, char *chan, char *user, const char *fmt, - ...) +void dreamforge_cmd_kick(char *source, char *chan, char *user, char *buf) { - 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) { send_cmd(source, "KICK %s %s :%s", chan, user, buf); } else { @@ -1157,34 +993,34 @@ int anope_event_ping(char *source, int ac, char **av) { if (ac < 1) return MOD_CONT; - anope_cmd_pong(ac > 1 ? av[1] : ServerName, av[0]); + dreamforge_cmd_pong(ac > 1 ? av[1] : ServerName, av[0]); return MOD_CONT; } -void anope_cmd_372(char *source, char *msg) +void dreamforge_cmd_372(char *source, char *msg) { send_cmd(ServerName, "372 %s :- %s", source, msg); } -void anope_cmd_372_error(char *source) +void dreamforge_cmd_372_error(char *source) { send_cmd(ServerName, "422 %s :- MOTD file not found! Please " "contact your IRC administrator.", source); } -void anope_cmd_375(char *source) +void dreamforge_cmd_375(char *source) { send_cmd(ServerName, "375 %s :- %s Message of the Day", source, ServerName); } -void anope_cmd_376(char *source) +void dreamforge_cmd_376(char *source) { send_cmd(ServerName, "376 %s :End of /MOTD command.", source); } /* INVITE */ -void anope_cmd_invite(char *source, char *chan, char *nick) +void dreamforge_cmd_invite(char *source, char *chan, char *nick) { if (!source || !chan || !nick) { return; @@ -1194,59 +1030,59 @@ void anope_cmd_invite(char *source, char *chan, char *nick) } /* PONG */ -void anope_cmd_pong(char *servname, char *who) +void dreamforge_cmd_pong(char *servname, char *who) { send_cmd(servname, "PONG %s", who); } -void anope_cmd_bot_nick(char *nick, char *user, char *host, char *real, - char *modes) +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, "MODE %s %s", nick, modes); - anope_cmd_sqline(nick, "Reserved for services"); + dreamforge_cmd_sqline(nick, "Reserved for services"); } /* SVSHOLD - set */ -void anope_cmd_svshold(char *nick) +void dreamforge_cmd_svshold(char *nick) { /* Not supported by this IRCD */ } /* SVSHOLD - release */ -void anope_cmd_release_svshold(char *nick) +void dreamforge_cmd_release_svshold(char *nick) { /* Not Supported by this IRCD */ } /* UNSGLINE */ -void anope_cmd_unsgline(char *mask) +void dreamforge_cmd_unsgline(char *mask) { /* Not Supported by this IRCD */ } /* UNSZLINE */ -void anope_cmd_unszline(char *mask) +void dreamforge_cmd_unszline(char *mask) { /* Not Supported by this IRCD */ } /* SZLINE */ -void anope_cmd_szline(char *mask, char *reason, char *whom) +void dreamforge_cmd_szline(char *mask, char *reason, char *whom) { /* Not Supported by this IRCD */ } /* SGLINE */ -void anope_cmd_sgline(char *mask, char *reason) +void dreamforge_cmd_sgline(char *mask, char *reason) { /* Not Supported by this IRCD */ } /* SVSNICK */ -void anope_cmd_svsnick(char *source, char *guest, time_t when) +void dreamforge_cmd_svsnick(char *source, char *guest, time_t when) { if (!source || !guest) { return; @@ -1254,57 +1090,57 @@ void anope_cmd_svsnick(char *source, char *guest, time_t when) send_cmd(NULL, "SVSNICK %s %s :%ld", source, guest, (long int) when); } -void anope_cmd_guest_nick(char *nick, char *user, char *host, char *real, - char *modes) +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, "MODE %s %s", nick, modes); } -void anope_cmd_svso(char *source, char *nick, char *flag) +void dreamforge_cmd_svso(char *source, char *nick, char *flag) { /* Not Supported by this IRCD */ } -void anope_cmd_vhost_on(char *nick, char *vIdent, char *vhost) +void dreamforge_cmd_vhost_on(char *nick, char *vIdent, char *vhost) { /* Not Supported by this IRCD */ } -void anope_cmd_unban(char *name, char *nick) +void dreamforge_cmd_unban(char *name, char *nick) { /* Not Supported by this IRCD */ } /* SVSMODE channel modes */ -void anope_cmd_svsmode_chan(char *name, char *mode, char *nick) +void dreamforge_cmd_svsmode_chan(char *name, char *mode, char *nick) { /* Not Supported by this IRCD */ } -void anope_cmd_vhost_off(User * u) +void dreamforge_cmd_vhost_off(User * u) { /* Not Supported by this IRCD */ } /* SVSMODE +d */ /* sent if svid is something weird */ -void anope_cmd_svid_umode(char *nick, time_t ts) +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 anope_cmd_nc_change(User * u) +void dreamforge_cmd_nc_change(User * u) { common_svsmode(u, "-r+d", "1"); } /* SVSMODE +r */ -void anope_cmd_svid_umode2(User * u, char *ts) +void dreamforge_cmd_svid_umode2(User * u, char *ts) { if (u->svid != u->timestamp) { common_svsmode(u, "+rd", ts); @@ -1313,13 +1149,13 @@ void anope_cmd_svid_umode2(User * u, char *ts) } } -void anope_cmd_svid_umode3(User * u, char *ts) +void dreamforge_cmd_svid_umode3(User * u, char *ts) { /* not used */ } /* NICK <newnick> */ -void anope_cmd_chg_nick(char *oldnick, char *newnick) +void dreamforge_cmd_chg_nick(char *oldnick, char *newnick) { if (!oldnick || !newnick) { return; @@ -1328,17 +1164,17 @@ void anope_cmd_chg_nick(char *oldnick, char *newnick) send_cmd(oldnick, "NICK %s", newnick); } -void anope_cmd_svsjoin(char *source, char *nick, char *chan) +void dreamforge_cmd_svsjoin(char *source, char *nick, char *chan) { /* Not Supported by this IRCD */ } -void anope_cmd_svspart(char *source, char *nick, char *chan) +void dreamforge_cmd_svspart(char *source, char *nick, char *chan) { /* Not Supported by this IRCD */ } -void anope_cmd_swhois(char *source, char *who, char *mask) +void dreamforge_cmd_swhois(char *source, char *who, char *mask) { /* not supported */ } @@ -1358,30 +1194,30 @@ int anope_event_admin(char *source, int ac, char **av) return MOD_CONT; } -int anope_flood_mode_check(char *value) +int dreamforge_flood_mode_check(char *value) { return 0; } -void anope_cmd_eob() +void dreamforge_cmd_eob() { /* Not supported */ } -void anope_cmd_jupe(char *jserver, char *who, char *reason) +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 : ""); - anope_cmd_squit(jserver, rbuf); - anope_cmd_server(jserver, 2, rbuf); + 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 anope_cmd_global_legacy(char *source, char *fmt) +void dreamforge_cmd_global_legacy(char *source, char *fmt) { send_cmd(source ? source : ServerName, "GLOBOPS :%s", fmt); } @@ -1390,24 +1226,16 @@ void anope_cmd_global_legacy(char *source, char *fmt) 1 = valid nick 0 = nick is in valid */ -int anope_valid_nick(char *nick) +int dreamforge_valid_nick(char *nick) { /* no hard coded invalid nicks */ return 1; } -void anope_cmd_ctcp(char *source, char *dest, const char *fmt, ...) +void dreamforge_cmd_ctcp(char *source, char *dest, char *buf) { - va_list args; - char buf[BUFSIZE]; - char *s; - *buf = '\0'; - if (fmt) { - va_start(args, fmt); - vsnprintf(buf, BUFSIZE - 1, fmt, args); - va_end(args); - } + char *s; if (!buf) { return; } else { @@ -1418,4 +1246,118 @@ void anope_cmd_ctcp(char *source, char *dest, const char *fmt, ...) free(s); } -#endif + +/** + * 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_unsqline); + 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_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_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..aca591932 --- /dev/null +++ b/src/protocol/dreamforge.h @@ -0,0 +1,111 @@ +/* DreamForge IRCD functions + * + * (C) 2003-2005 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/hybrid.c b/src/protocol/hybrid.c index b966fa5a7..c1a862f16 100644 --- a/src/hybrid.c +++ b/src/protocol/hybrid.c @@ -13,17 +13,9 @@ #include "services.h" #include "pseudo.h" +#include "hybrid.h" -#ifdef IRC_HYBRID - -const char version_protocol[] = "Hybrid IRCd 7.0"; - -/* Not all ircds use +f for their flood/join throttle system */ -const char flood_mode_char_set[] = ""; /* mode char for FLOOD mode on set */ -const char flood_mode_char_remove[] = ""; /* mode char for FLOOD mode on remove */ -int UseTSMODE = 0; - -IRCDVar ircd[] = { +IRCDVar myIrcd[] = { {"HybridIRCd 7.*", /* ircd name */ "+o", /* nickserv mode */ "+o", /* chanserv mode */ @@ -84,7 +76,6 @@ IRCDVar ircd[] = { 0, /* O:LINE */ 0, /* VHOST ON NICK */ 0, /* Change RealName */ - CHAN_HELP_IRCD_HALFOP, /* ChanServ extra */ CMODE_p, /* No Knock */ 0, /* Admin Only */ DEFAULT_MLOCK, /* Default MLOCK */ @@ -116,7 +107,7 @@ IRCDVar ircd[] = { {NULL} }; -IRCDCAPAB ircdcap[] = { +IRCDCAPAB myIrcdcap[] = { { CAPAB_NOQUIT, /* NOQUIT */ 0, /* TSMODE */ @@ -151,7 +142,7 @@ IRCDCAPAB ircdcap[] = { -void anope_set_umode(User * user, int ac, char **av) +void hybrid_set_umode(User * user, int ac, char **av) { int add = 1; /* 1 if adding modes, 0 if deleting */ char *modes = av[0]; @@ -262,7 +253,7 @@ unsigned long umodes[128] = { }; -char csmodes[128] = { +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, @@ -283,7 +274,7 @@ char csmodes[128] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -CMMode cmmodes[128] = { +CMMode myCmmodes[128] = { {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, @@ -333,7 +324,7 @@ CMMode cmmodes[128] = { }; -CBMode cbmodes[128] = { +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}, @@ -399,7 +390,7 @@ CBMode cbmodes[128] = { {0}, {0}, {0}, {0} }; -CBModeInfo cbmodeinfos[] = { +CBModeInfo myCbmodeinfos[] = { {'a', CMODE_a, 0, NULL, NULL}, {'i', CMODE_i, 0, NULL, NULL}, {'k', CMODE_k, 0, get_key, cs_get_key}, @@ -413,7 +404,7 @@ CBModeInfo cbmodeinfos[] = { }; -CUMode cumodes[128] = { +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}, @@ -462,44 +453,26 @@ CUMode cumodes[128] = { -void anope_cmd_notice(char *source, char *dest, const char *fmt, ...) +void hybrid_cmd_notice(char *source, char *dest, char *buf) { - 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; } if (UsePrivmsg) { - anope_cmd_privmsg2(source, dest, buf); + hybrid_cmd_privmsg2(source, dest, buf); } else { send_cmd(source, "NOTICE %s :%s", dest, buf); } } -void anope_cmd_notice2(char *source, char *dest, char *msg) +void hybrid_cmd_notice2(char *source, char *dest, char *msg) { send_cmd(source, "NOTICE %s :%s", dest, msg); } -void anope_cmd_privmsg(char *source, char *dest, const char *fmt, ...) +void hybrid_cmd_privmsg(char *source, char *dest, char *buf) { - 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; } @@ -507,33 +480,24 @@ void anope_cmd_privmsg(char *source, char *dest, const char *fmt, ...) send_cmd(source, "PRIVMSG %s :%s", dest, buf); } -void anope_cmd_privmsg2(char *source, char *dest, char *msg) +void hybrid_cmd_privmsg2(char *source, char *dest, char *msg) { send_cmd(source, "PRIVMSG %s :%s", dest, msg); } -void anope_cmd_serv_notice(char *source, char *dest, char *msg) +void hybrid_cmd_serv_notice(char *source, char *dest, char *msg) { send_cmd(source, "NOTICE $$%s :%s", dest, msg); } -void anope_cmd_serv_privmsg(char *source, char *dest, char *msg) +void hybrid_cmd_serv_privmsg(char *source, char *dest, char *msg) { send_cmd(source, "PRIVMSG $$%s :%s", dest, msg); } -void anope_cmd_global(char *source, const char *fmt, ...) +void hybrid_cmd_global(char *source, char *buf) { - 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; } @@ -542,7 +506,7 @@ void anope_cmd_global(char *source, const char *fmt, ...) } /* GLOBOPS - to handle old WALLOPS */ -void anope_cmd_global_legacy(char *source, char *fmt) +void hybrid_cmd_global_legacy(char *source, char *fmt) { send_cmd(source ? source : ServerName, "OPERWALL :%s", fmt); } @@ -676,66 +640,66 @@ void moduleAddIRCDMsgs(void) { /* *INDENT-ON* */ -void anope_cmd_sqline(char *mask, char *reason) +void hybrid_cmd_sqline(char *mask, char *reason) { } -void anope_cmd_unsgline(char *mask) +void hybrid_cmd_unsgline(char *mask) { /* Does not support */ } -void anope_cmd_unszline(char *mask) +void hybrid_cmd_unszline(char *mask) { /* Does not support */ } -void anope_cmd_szline(char *mask, char *reason, char *whom) +void hybrid_cmd_szline(char *mask, char *reason, char *whom) { /* Does not support */ } -void anope_cmd_svsnoop(char *server, int set) +void hybrid_cmd_svsnoop(char *server, int set) { /* does not support */ } -void anope_cmd_svsadmin(char *server, int set) +void hybrid_cmd_svsadmin(char *server, int set) { - anope_cmd_svsnoop(server, set); + hybrid_cmd_svsnoop(server, set); } -void anope_cmd_sgline(char *mask, char *reason) +void hybrid_cmd_sgline(char *mask, char *reason) { /* does not support */ } -void anope_cmd_remove_akill(char *user, char *host) +void hybrid_cmd_remove_akill(char *user, char *host) { /* does not support */ } -void anope_cmd_topic(char *whosets, char *chan, char *whosetit, - char *topic, time_t when) +void hybrid_cmd_topic(char *whosets, char *chan, char *whosetit, + char *topic, time_t when) { send_cmd(whosets, "TOPIC %s :%s", chan, topic); } -void anope_cmd_vhost_off(User * u) +void hybrid_cmd_vhost_off(User * u) { /* does not support vhosting */ } -void anope_cmd_vhost_on(char *nick, char *vIdent, char *vhost) +void hybrid_cmd_vhost_on(char *nick, char *vIdent, char *vhost) { /* does not support vhosting */ } -void anope_cmd_unsqline(char *user) +void hybrid_cmd_unsqline(char *user) { /* Hybrid does not support SQLINEs */ } -void anope_cmd_join(char *user, char *channel, time_t chantime) +void hybrid_cmd_join(char *user, char *channel, time_t chantime) { send_cmd(NULL, "SJOIN %ld %s + :%s", (long int) time(NULL), channel, user); @@ -750,24 +714,15 @@ host: the 'host' portion of the kline reason: the reason for the kline. */ -void anope_cmd_akill(char *user, char *host, char *who, time_t when, - time_t expires, char *reason) +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 anope_cmd_svskill(char *source, char *user, const char *fmt, ...) +void hybrid_cmd_svskill(char *source, char *user, char *buf) { - 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; } @@ -780,33 +735,11 @@ void anope_cmd_svskill(char *source, char *user, const char *fmt, ...) } -void anope_cmd_svsmode(User * u, int ac, char **av) +void hybrid_cmd_svsmode(User * u, int ac, char **av) { /* Hybrid does not support SVSMODE */ } -void anope_cmd_connect(int servernum) -{ - me_server = - new_server(NULL, ServerName, ServerDesc, SERVER_ISME, NULL); - - if (servernum == 1) - anope_cmd_pass(RemotePassword); - else if (servernum == 2) - anope_cmd_pass(RemotePassword2); - else if (servernum == 3) - anope_cmd_pass(RemotePassword3); - - anope_cmd_capab(); - anope_cmd_server(ServerName, 1, ServerDesc); - anope_cmd_svinfo(); -} - -void anope_cmd_svsinfo() -{ - /* not used */ -} - /* * SVINFO * parv[0] = sender prefix @@ -815,7 +748,7 @@ void anope_cmd_svsinfo() * parv[3] = server is standalone or connected to non-TS only * parv[4] = server's idea of UTC time */ -void anope_cmd_svinfo() +void hybrid_cmd_svinfo() { send_cmd(NULL, "SVINFO 5 5 0 :%ld", (long int) time(NULL)); } @@ -841,26 +774,49 @@ void anope_cmd_svinfo() PARA - supports invite broadcasting for +p ENCAP - ? */ -void anope_cmd_capab() +void hybrid_cmd_capab() { send_cmd(NULL, "CAPAB :QS EX CHW IE EOB KLN GLN HOPS HUB AOPS KNOCK TBURST PARA"); } /* PASS */ -void anope_cmd_pass(char *pass) +void hybrid_cmd_pass(char *pass) { send_cmd(NULL, "PASS %s :TS", pass); } /* SERVER name hop descript */ -void anope_cmd_server(char *servname, int hop, char *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 anope_cmd_bot_nick(char *nick, char *user, char *host, char *real, - char *modes) +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, @@ -868,18 +824,8 @@ void anope_cmd_bot_nick(char *nick, char *user, char *host, char *real, } -void anope_cmd_part(char *nick, char *chan, const char *fmt, ...) +void hybrid_cmd_part(char *nick, char *chan, char *buf) { - 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) { send_cmd(nick, "PART %s :%s", chan, buf); } else { @@ -891,7 +837,7 @@ int anope_event_ping(char *source, int ac, char **av) { if (ac < 1) return MOD_CONT; - anope_cmd_pong(ac > 1 ? av[1] : ServerName, av[0]); + hybrid_cmd_pong(ac > 1 ? av[1] : ServerName, av[0]); return MOD_CONT; } @@ -940,7 +886,7 @@ int anope_event_eob(char *source, int ac, char **av) return MOD_CONT; } -void anope_cmd_eob() +void hybrid_cmd_eob() { send_cmd(ServerName, "EOB"); } @@ -1014,30 +960,30 @@ int anope_event_quit(char *source, int ac, char **av) return MOD_CONT; } -void anope_cmd_372(char *source, char *msg) +void hybrid_cmd_372(char *source, char *msg) { send_cmd(ServerName, "372 %s :- %s", source, msg); } -void anope_cmd_372_error(char *source) +void hybrid_cmd_372_error(char *source) { send_cmd(ServerName, "422 %s :- MOTD file not found! Please " "contact your IRC administrator.", source); } -void anope_cmd_375(char *source) +void hybrid_cmd_375(char *source) { send_cmd(ServerName, "375 %s :- %s Message of the Day", source, ServerName); } -void anope_cmd_376(char *source) +void hybrid_cmd_376(char *source) { send_cmd(ServerName, "376 %s :End of /MOTD command.", source); } /* 391 */ -void anope_cmd_391(char *source, char *timestr) +void hybrid_cmd_391(char *source, char *timestr) { if (!timestr) { return; @@ -1046,17 +992,8 @@ void anope_cmd_391(char *source, char *timestr) } /* 250 */ -void anope_cmd_250(const char *fmt, ...) +void hybrid_cmd_250(char *buf) { - 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; } @@ -1065,17 +1002,8 @@ void anope_cmd_250(const char *fmt, ...) } /* 307 */ -void anope_cmd_307(const char *fmt, ...) +void hybrid_cmd_307(char *buf) { - 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; } @@ -1084,17 +1012,8 @@ void anope_cmd_307(const char *fmt, ...) } /* 311 */ -void anope_cmd_311(const char *fmt, ...) +void hybrid_cmd_311(char *buf) { - 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; } @@ -1103,17 +1022,8 @@ void anope_cmd_311(const char *fmt, ...) } /* 312 */ -void anope_cmd_312(const char *fmt, ...) +void hybrid_cmd_312(char *buf) { - 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; } @@ -1122,17 +1032,8 @@ void anope_cmd_312(const char *fmt, ...) } /* 317 */ -void anope_cmd_317(const char *fmt, ...) +void hybrid_cmd_317(char *buf) { - 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; } @@ -1141,7 +1042,7 @@ void anope_cmd_317(const char *fmt, ...) } /* 219 */ -void anope_cmd_219(char *source, char *letter) +void hybrid_cmd_219(char *source, char *letter) { if (!source) { return; @@ -1156,7 +1057,7 @@ void anope_cmd_219(char *source, char *letter) } /* 401 */ -void anope_cmd_401(char *source, char *who) +void hybrid_cmd_401(char *source, char *who) { if (!source || !who) { return; @@ -1165,7 +1066,7 @@ void anope_cmd_401(char *source, char *who) } /* 318 */ -void anope_cmd_318(char *source, char *who) +void hybrid_cmd_318(char *source, char *who) { if (!source || !who) { return; @@ -1175,17 +1076,8 @@ void anope_cmd_318(char *source, char *who) } /* 242 */ -void anope_cmd_242(const char *fmt, ...) +void hybrid_cmd_242(char *buf) { - 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; } @@ -1194,17 +1086,8 @@ void anope_cmd_242(const char *fmt, ...) } /* 243 */ -void anope_cmd_243(const char *fmt, ...) +void hybrid_cmd_243(char *buf) { - 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; } @@ -1213,17 +1096,8 @@ void anope_cmd_243(const char *fmt, ...) } /* 211 */ -void anope_cmd_211(const char *fmt, ...) +void hybrid_cmd_211(char *buf) { - 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; } @@ -1231,17 +1105,8 @@ void anope_cmd_211(const char *fmt, ...) send_cmd(NULL, "211 %s ", buf); } -void anope_cmd_mode(char *source, char *dest, const char *fmt, ...) +void hybrid_cmd_mode(char *source, char *dest, char *buf) { - 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; } @@ -1249,7 +1114,7 @@ void anope_cmd_mode(char *source, char *dest, const char *fmt, ...) send_cmd(source, "MODE %s %s", dest, buf); } -void anope_cmd_nick(char *nick, char *name, char *mode) +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, @@ -1257,19 +1122,8 @@ void anope_cmd_nick(char *nick, char *name, char *mode) ServerName, (name)); } -void anope_cmd_kick(char *source, char *chan, char *user, const char *fmt, - ...) +void hybrid_cmd_kick(char *source, char *chan, char *user, char *buf) { - 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) { send_cmd(source, "KICK %s %s :%s", chan, user, buf); } else { @@ -1277,17 +1131,8 @@ void anope_cmd_kick(char *source, char *chan, char *user, const char *fmt, } } -void anope_cmd_notice_ops(char *source, char *dest, const char *fmt, ...) +void hybrid_cmd_notice_ops(char *source, char *dest, char *buf) { - 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; } @@ -1295,24 +1140,14 @@ void anope_cmd_notice_ops(char *source, char *dest, const char *fmt, ...) send_cmd(NULL, "NOTICE @%s :%s", dest, buf); } -void anope_cmd_bot_chan_mode(char *nick, char *chan) +void hybrid_cmd_bot_chan_mode(char *nick, char *chan) { anope_cmd_mode(nick, chan, "%s %s", ircd->botchanumode, nick); } /* QUIT */ -void anope_cmd_quit(char *source, const char *fmt, ...) +void hybrid_cmd_quit(char *source, char *buf) { - 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) { send_cmd(source, "QUIT :%s", buf); } else { @@ -1321,13 +1156,13 @@ void anope_cmd_quit(char *source, const char *fmt, ...) } /* PONG */ -void anope_cmd_pong(char *servname, char *who) +void hybrid_cmd_pong(char *servname, char *who) { send_cmd(servname, "PONG %s", who); } /* INVITE */ -void anope_cmd_invite(char *source, char *chan, char *nick) +void hybrid_cmd_invite(char *source, char *chan, char *nick) { if (!source || !chan || !nick) { return; @@ -1337,7 +1172,7 @@ void anope_cmd_invite(char *source, char *chan, char *nick) } /* SQUIT */ -void anope_cmd_squit(char *servname, char *message) +void hybrid_cmd_squit(char *servname, char *message) { if (!servname || !message) { return; @@ -1359,7 +1194,7 @@ int anope_event_mode(char *source, int ac, char **av) return MOD_CONT; } -void anope_cmd_351(char *source) +void hybrid_cmd_351(char *source) { send_cmd(ServerName, "351 %s Anope-%s %s :%s - %s -- %s", source, version_number, ServerName, ircd->name, version_flags, @@ -1374,75 +1209,75 @@ int anope_event_capab(char *source, int ac, char **av) } /* SVSHOLD - set */ -void anope_cmd_svshold(char *nick) +void hybrid_cmd_svshold(char *nick) { /* Not supported by this IRCD */ } /* SVSHOLD - release */ -void anope_cmd_release_svshold(char *nick) +void hybrid_cmd_release_svshold(char *nick) { /* Not Supported by this IRCD */ } /* SVSNICK */ -void anope_cmd_svsnick(char *nick, char *newnick, time_t when) +void hybrid_cmd_svsnick(char *nick, char *newnick, time_t when) { /* Not Supported by this IRCD */ } -void anope_cmd_guest_nick(char *nick, char *user, char *host, char *real, - char *modes) +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 anope_cmd_svso(char *source, char *nick, char *flag) +void hybrid_cmd_svso(char *source, char *nick, char *flag) { /* Not Supported by this IRCD */ } -void anope_cmd_unban(char *name, char *nick) +void hybrid_cmd_unban(char *name, char *nick) { /* Not Supported by this IRCD */ } /* SVSMODE channel modes */ -void anope_cmd_svsmode_chan(char *name, char *mode, char *nick) +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 anope_cmd_svid_umode(char *nick, time_t ts) +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 anope_cmd_nc_change(User * u) +void hybrid_cmd_nc_change(User * u) { /* not used */ } /* SVSMODE +d */ -void anope_cmd_svid_umode2(User * u, char *ts) +void hybrid_cmd_svid_umode2(User * u, char *ts) { /* not used */ } -void anope_cmd_svid_umode3(User * u, char *ts) +void hybrid_cmd_svid_umode3(User * u, char *ts) { /* not used */ } /* NICK <newnick> */ -void anope_cmd_chg_nick(char *oldnick, char *newnick) +void hybrid_cmd_chg_nick(char *oldnick, char *newnick) { if (!oldnick || !newnick) { return; @@ -1471,17 +1306,17 @@ int anope_event_pass(char *source, int ac, char **av) return MOD_CONT; } -void anope_cmd_svsjoin(char *source, char *nick, char *chan) +void hybrid_cmd_svsjoin(char *source, char *nick, char *chan) { /* Not Supported by this IRCD */ } -void anope_cmd_svspart(char *source, char *nick, char *chan) +void hybrid_cmd_svspart(char *source, char *nick, char *chan) { /* Not Supported by this IRCD */ } -void anope_cmd_swhois(char *source, char *who, char *mask) +void hybrid_cmd_swhois(char *source, char *who, char *mask) { /* not supported */ } @@ -1501,7 +1336,7 @@ int anope_event_invite(char *source, int ac, char **av) return MOD_CONT; } -int anope_flood_mode_check(char *value) +int hybrid_flood_mode_check(char *value) { return 0; } @@ -1516,15 +1351,15 @@ int anope_event_error(char *source, int ac, char **av) return MOD_CONT; } -void anope_cmd_jupe(char *jserver, char *who, char *reason) +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 : ""); - anope_cmd_squit(jserver, rbuf); - anope_cmd_server(jserver, 2, rbuf); + hybrid_cmd_squit(jserver, rbuf); + hybrid_cmd_server(jserver, 2, rbuf); new_server(me_server, jserver, rbuf, SERVER_JUPED, NULL); } @@ -1532,24 +1367,16 @@ void anope_cmd_jupe(char *jserver, char *who, char *reason) 1 = valid nick 0 = nick is in valid */ -int anope_valid_nick(char *nick) +int hybrid_valid_nick(char *nick) { /* no hard coded invalid nicks */ return 1; } -void anope_cmd_ctcp(char *source, char *dest, const char *fmt, ...) +void hybrid_cmd_ctcp(char *source, char *dest, char *buf) { - va_list args; - char buf[BUFSIZE]; char *s; - *buf = '\0'; - if (fmt) { - va_start(args, fmt); - vsnprintf(buf, BUFSIZE - 1, fmt, args); - va_end(args); - } if (!buf) { return; } else { @@ -1561,4 +1388,117 @@ void anope_cmd_ctcp(char *source, char *dest, const char *fmt, ...) } -#endif +/** + * 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_unsqline); + 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_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_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..153914730 --- /dev/null +++ b/src/protocol/hybrid.h @@ -0,0 +1,115 @@ +/* Hybrid IRCD functions + * + * (C) 2003-2005 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/inspircd.c b/src/protocol/inspircd.c new file mode 100644 index 000000000..58e5bf50a --- /dev/null +++ b/src/protocol/inspircd.c @@ -0,0 +1,1500 @@ +/* InspIRCd beta 3 functions + * + * (C) 2003-2005 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 "inspircd.h" + +#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 Beta", /* 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 */ + "+i", /* Used by BotServ Bots */ + 5, /* Chan Max Symbols */ + "-cilmnpstuzCGKNOQRSV", /* 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 */ + "-r", /* Mode on UnReg */ + "-r", /* 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 */ + 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 */ + 0, /* O:LINE */ + 1, /* UMODE */ + 1, /* VHOST ON NICK */ + 1, /* Change RealName */ + CMODE_K, /* No Knock */ + 0, /* Admin Only */ + DEFAULT_MLOCK, /* Default MLOCK */ + UMODE_x, /* Vhost Mode */ + 0, /* +f */ + 1, /* +L */ + 0, + CMODE_L, + 0, + 0, /* No Knock requires +i */ + NULL, /* CAPAB Chan Modes */ + 1, /* We support inspircd TOKENS */ + 0, /* TOKENS are CASE Sensitive */ + 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 */ + 0, /* support helper umode */ + 0, /* p10 */ + NULL, /* character set */ + 1, /* reports sync state */ + } + , + {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} +}; + +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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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_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, 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) { + + add ? (user->mode |= umodes[(int) *modes]) : (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; + case 'r': + if (add && !nick_identified(user)) { + common_svsmode(user, "-r", NULL); + user->mode &= ~UMODE_r; + } + break; + case 'x': + update_host(user); + break; + } + } +} + +int anope_event_nickchange(char *source, int ac, char **av); +int anope_event_servertopic(char *source, int ac, char **av); +int anope_event_servermode(char *source, int ac, char **av); + +/* *INDENT-OFF* */ +void moduleAddIRCDMsgs(void) { + Message *m; + + // user has no choice but to use tokens with InspIRCd :) + UseTokens = 1; + + updateProtectDetails("PROTECT","PROTECTME","!protect","!deprotect","AUTOPROTECT","+a","-a"); + + m = createMessage("$", anope_event_null); addCoreMessage(IRCD,m); // send routing table + m = createMessage("X", anope_event_null); addCoreMessage(IRCD,m); // begin netburst NOW + m = createMessage("Y", anope_event_null); addCoreMessage(IRCD,m); // end of UPLINK netburst + m = createMessage("H", anope_event_null); addCoreMessage(IRCD,m); // local sync start + m = createMessage("F", anope_event_null); addCoreMessage(IRCD,m); // local sync end + m = createMessage("f", anope_event_null); addCoreMessage(IRCD,m); // local U-lined sync end + m = createMessage("*", anope_event_null); addCoreMessage(IRCD,m); // no operation + m = createMessage("|", anope_event_null); addCoreMessage(IRCD,m); // oper type + m = createMessage("-", anope_event_null); addCoreMessage(IRCD,m); // start mesh operation + m = createMessage("s", anope_event_server); addCoreMessage(IRCD,m); // passive server response + m = createMessage("U", anope_event_null); addCoreMessage(IRCD,m); // active service connect + m = createMessage("J", anope_event_join); addCoreMessage(IRCD,m); // join + m = createMessage("k", anope_event_kick); addCoreMessage(IRCD,m); // kick + m = createMessage("K", anope_event_kill); addCoreMessage(IRCD,m); // kill + m = createMessage("M", anope_event_servermode); addCoreMessage(IRCD,m); // servermode + m = createMessage("m", anope_event_mode); addCoreMessage(IRCD,m); // mode + m = createMessage("N", anope_event_nick); addCoreMessage(IRCD,m); // nick (introduce) + m = createMessage("n", anope_event_nickchange); addCoreMessage(IRCD,m); // nick (change) + m = createMessage("V", anope_event_null); addCoreMessage(IRCD,m); // notice + m = createMessage("L", anope_event_part); addCoreMessage(IRCD,m); // part + m = createMessage("?", anope_event_ping); addCoreMessage(IRCD,m); // ping + m = createMessage("P", anope_event_privmsg); addCoreMessage(IRCD,m); // privmsg + m = createMessage("Q", anope_event_quit); addCoreMessage(IRCD,m); // quit + m = createMessage("&", anope_event_squit); addCoreMessage(IRCD,m); // squit + m = createMessage("t", anope_event_topic); addCoreMessage(IRCD,m); // topic (user) + m = createMessage("T", anope_event_servertopic); addCoreMessage(IRCD,m); // topic (server) + m = createMessage("@", anope_event_null); addCoreMessage(IRCD,m); // wallops + m = createMessage("b", anope_event_chghost); addCoreMessage(IRCD,m); // change displayed host + m = createMessage("a", anope_event_chgname); addCoreMessage(IRCD,m); // change gecos +} + +/* *INDENT-ON* */ + +/* Event: PROTOCTL */ +int anope_event_capab(char *source, int ac, char **av) +{ + capab_parse(ac, av); + return MOD_CONT; +} + +int anope_event_nickchange(char *source, int ac, char **av) +{ + do_nick(av[0], av[1], NULL, NULL, NULL, NULL, 0, 0, 0, NULL, NULL); + return MOD_CONT; +} + +void inspircd_cmd_svsnoop(char *server, int set) +{ + send_cmd(NULL, "*"); +} + +void inspircd_cmd_svsadmin(char *server, int set) +{ + inspircd_cmd_svsnoop(server, set); +} + +void inspircd_cmd_remove_akill(char *user, char *host) +{ + send_cmd(NULL, ". %s@%s %s", user, host, s_OperServ); +} + +void inspircd_cmd_topic(char *whosets, char *chan, char *whosetit, + char *topic, time_t when) +{ + send_cmd(NULL, "t %lu %s %s :%s", (unsigned long int) when, whosetit, + chan, topic); +} + +void inspircd_cmd_vhost_off(User * u) +{ + send_cmd(NULL, "m %s %s -x", s_HostServ, u->nick); +} + +void inspircd_cmd_akill(char *user, char *host, char *who, time_t when, + time_t expires, char *reason) +{ + send_cmd(NULL, "# %s@%s %s %lu %lu :%s", user, host, who, + (long int) when, 86400 * 2, reason); +} + +void inspircd_cmd_svskill(char *source, char *user, char *buf) +{ + if (!buf || !source || !user) { + return; + } + send_cmd(NULL, "K %s %s :%s", s_OperServ, user, buf); +} + +void inspircd_cmd_svsmode(User * u, int ac, char **av) +{ + send_cmd(NULL, "M %s %s", u->nick, av[0]); +} + + +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) +{ + // N <time> <nick> <host> <displayed-host> <ident> <modes> <ipaddress> <server> :<GECOS> + send_cmd(NULL, "N %lu %s %s %s %s %s 0.0.0.0 %s :%s", + (long int) time(NULL), nick, ServiceHost, ServiceHost, + ServiceUser, modes, ServerName, name); +} + +void inspircd_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); + send_cmd(NULL, "N %lu %s %s %s %s %s 0.0.0.0 %s :%s", + (long int) time(NULL), nick, host, host, user, modes, + ServerName, real); +} + +void inspircd_cmd_mode(char *source, char *dest, char *buf) +{ + if (!buf) { + return; + } + send_cmd(NULL, "m %s %s %s", source, dest, buf); +} + +void inspircd_cmd_bot_nick(char *nick, char *user, char *host, char *real, + char *modes) +{ + send_cmd(NULL, "N %lu %s %s %s %s %s 0.0.0.0 %s :%s", + (long int) time(NULL), nick, host, host, user, modes, + ServerName, real); +} + +void inspircd_cmd_kick(char *source, char *chan, char *user, char *buf) +{ + if (buf) { + send_cmd(NULL, "k %s %s :%s", source, user, chan, buf); + } else { + send_cmd(NULL, "k %s %s :", source, user, chan); + } +} + +void inspircd_cmd_notice_ops(char *source, char *dest, char *buf) +{ + if (!buf) { + return; + } + + send_cmd(NULL, "V %s @%s :%s", source, dest, buf); +} + + +void inspircd_cmd_notice(char *source, char *dest, char *buf) +{ + if (!buf) { + return; + } + + if (UsePrivmsg) { + inspircd_cmd_privmsg2(source, dest, buf); + } else { + send_cmd(NULL, "V %s %s :%s", source, dest, buf); + } +} + +void inspircd_cmd_notice2(char *source, char *dest, char *msg) +{ + send_cmd(NULL, "V %s %s :%s", source, dest, msg); +} + +void inspircd_cmd_privmsg(char *source, char *dest, char *buf) +{ + if (!buf) { + return; + } + + send_cmd(NULL, "P %s %s :%s", source, dest, buf); +} + +void inspircd_cmd_privmsg2(char *source, char *dest, char *msg) +{ + send_cmd(NULL, "P %s %s :%s", source, dest, 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) +{ + anope_cmd_mode(nick, chan, "%s %s %s", ircd->botchanumode, nick, nick); +} + +void inspircd_cmd_351(char *source) +{ +} + +/* QUIT */ +void inspircd_cmd_quit(char *source, char *buf) +{ + if (buf) { + send_cmd(NULL, "Q %s :%s", source, buf); + } else { + send_cmd(NULL, "QUIT %s :", source); + } +} + +/* PROTOCTL */ +void inspircd_cmd_protoctl() +{ +} + +/* PASS */ +void inspircd_cmd_pass(char *pass) +{ +// send_cmd(NULL, "PASS :%s", pass); +} + +/* SERVER name hop descript */ +void inspircd_cmd_server(char *servname, int hop, char *descript) +{ + Server *newserv; + if (hop == 0) { + send_cmd(NULL, "H %s", servname); + } else { + char pw[1024]; + switch (hop) { + case 1: + strncpy(pw, RemotePassword, 1023); + break; + case 2: + strncpy(pw, RemotePassword2, 1023); + break; + case 3: + strncpy(pw, RemotePassword3, 1023); + break; + } + send_cmd(NULL, "U %s %s :%s", servname, pw, descript); + send_cmd(NULL, "v %s Anope-%s %s :%s - %s -- %s", servname, + version_number, ServerName, ircd->name, version_flags, + version_build); + } +} + +/* PONG */ +void inspircd_cmd_pong(char *servname, char *who) +{ + send_cmd(NULL, "!"); +} + +/* JOIN */ +void inspircd_cmd_join(char *user, char *channel, time_t chantime) +{ + send_cmd(NULL, "J %s %s", user, channel); +} + +/* UNSQLINE */ +void inspircd_cmd_unsqline(char *user) +{ + if (!user) { + return; + } + send_cmd(NULL, "[ %s %s", user, s_OperServ); +} + +/* CHGHOST */ +void inspircd_cmd_chghost(char *nick, char *vhost) +{ + if (!nick || !vhost) { + return; + } + send_cmd(NULL, "b %s %s", nick, vhost); +} + +/* CHGIDENT */ +void inspircd_cmd_chgident(char *nick, char *vIdent) +{ +} + +/* INVITE */ +void inspircd_cmd_invite(char *source, char *chan, char *nick) +{ + if (!source || !chan || !nick) { + return; + } + + send_cmd(NULL, "i %s %s %s", source, nick, chan); +} + +/* PART */ +void inspircd_cmd_part(char *nick, char *chan, char *buf) +{ + if (!nick || !chan) { + return; + } + if (buf) { + send_cmd(NULL, "L %s :%s", nick, chan, buf); + } else { + send_cmd(NULL, "L %s %s :", nick, chan); + } +} + +/* 391 */ +void inspircd_cmd_391(char *source, char *timestr) +{ +} + +/* 250 */ +void inspircd_cmd_250(char *buf) +{ +} + +/* 307 */ +void inspircd_cmd_307(char *buf) +{ +} + +/* 311 */ +void inspircd_cmd_311(char *buf) +{ +} + +/* 312 */ +void inspircd_cmd_312(char *buf) +{ +} + +/* 317 */ +void inspircd_cmd_317(char *buf) +{ +} + +/* 219 */ +void inspircd_cmd_219(char *source, char *letter) +{ +} + +/* 401 */ +void inspircd_cmd_401(char *source, char *who) +{ +} + +/* 318 */ +void inspircd_cmd_318(char *source, char *who) +{ +} + +/* 242 */ +void inspircd_cmd_242(char *buf) +{ +} + +/* 243 */ +void inspircd_cmd_243(char *buf) +{ +} + +/* 211 */ +void inspircd_cmd_211(char *buf) +{ +} + +/* GLOBOPS */ +void inspircd_cmd_global(char *source, char *buf) +{ + send_cmd(NULL, "V %s * :%s", (source ? source : s_OperServ), buf); +} + +/* SQLINE */ +void inspircd_cmd_sqline(char *mask, char *reason) +{ + if (!mask || !reason) { + return; + } + // { <mask> <who-set-it> <time-set> <duration> :<reason> + send_cmd(NULL, "{ %s %s %lu 0 :%s", mask, ServerName, + (unsigned long) time(NULL), reason); +} + +/* SQUIT */ +void inspircd_cmd_squit(char *servname, char *message) +{ + if (!servname) { + return; + } + + send_cmd(NULL, "& %s", servname); +} + +/* SVSO */ +void inspircd_cmd_svso(char *source, char *nick, char *flag) +{ + send_cmd(NULL, "M %s %s", nick, flag); +} + +/* NICK <newnick> */ +void inspircd_cmd_chg_nick(char *oldnick, char *newnick) +{ + if (!oldnick || !newnick) { + return; + } + + send_cmd("n %s %s", oldnick, newnick); +} + +/* SVSNICK */ +void inspircd_cmd_svsnick(char *source, char *guest, time_t when) +{ + if (!source || !guest) { + return; + } + send_cmd(NULL, "n %s %s", source, guest); +} + +/* 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) +{ + me_server = + new_server(NULL, ServerName, ServerDesc, SERVER_ISME, NULL); + + inspircd_cmd_server(ServerName, servernum, ServerDesc); +} + +/* Events */ + +int anope_event_ping(char *source, int ac, char **av) +{ + if (ac < 1) + return MOD_CONT; + inspircd_cmd_pong(ac > 1 ? av[1] : ServerName, av[0]); + return MOD_CONT; +} + +int anope_event_436(char *source, int ac, char **av) +{ + return MOD_CONT; +} + +int anope_event_away(char *source, int ac, char **av) +{ + return MOD_CONT; +} + +int anope_event_servertopic(char *source, int ac, char **av) +{ + char *v[32]; + if (ac != 4) + return MOD_CONT; + v[0] = av[2]; // channel + v[1] = av[3]; // topic + do_topic(NULL, 2, v); // no source (server set) + return MOD_CONT; +} + +int anope_event_topic(char *source, int ac, char **av) +{ + char *v[32]; + if (ac != 3) + return MOD_CONT; + v[0] = av[1]; // channel + v[1] = av[2]; // topic content + do_topic(av[0], 2, v); + return MOD_CONT; +} + +int anope_event_squit(char *source, int ac, char **av) +{ + char *v[32]; + if (ac != 1) + return MOD_CONT; + v[0] = av[1]; + do_squit(av[1], 1, v); + return MOD_CONT; +} + +int anope_event_quit(char *source, int ac, char **av) +{ + char *v[32]; + if (ac != 2) + return MOD_CONT; + v[0] = av[1]; + v[1] = av[2]; + do_quit(av[0], 2, v); + return MOD_CONT; +} + +int anope_event_servermode(char *source, int ac, char **av) +{ + char *v[32]; + Channel *c; + int i = 0; + + if (*av[0] == '#') { + c = findchan(av[0]); + for (i = 1; i < ac; i++) + v[i - 1] = av[i]; + if (c) { + chan_set_modes(s_OperServ, c, ac - 1, v, 1); + } + } else { + v[0] = av[0]; + for (i = 0; i < ac; i++) + v[i + 1] = av[i]; + anope_event_mode(av[0], ac + 1, v); + } + return MOD_CONT; +} + + +int anope_event_mode(char *source, int ac, char **av) +{ + char *v[32]; + int i; + if (ac < 3) + return MOD_CONT; + + for (i = 1; i < ac; i++) { + v[i - 1] = av[i]; + } + if (*av[1] == '#') { + do_cmode(av[1], ac - 1, v); + } else { + do_umode(av[0], ac - 1, v); + } + return MOD_CONT; +} + + +int anope_event_kill(char *source, int ac, char **av) +{ + if (ac != 3) + return MOD_CONT; + m_kill(av[1], av[2]); + return MOD_CONT; +} + +int anope_event_kick(char *source, int ac, char **av) +{ + // Syntax: k <source> <dest> <channel> :<reason> + char *v[32]; + if (ac != 4) + return MOD_CONT; + v[0] = av[1]; + v[1] = av[2]; + v[2] = av[3]; + do_kick(av[0], 3, v); + return MOD_CONT; +} + + +int anope_event_join(char *source, int ac, char **av) +{ + //if (ac != 2) + // return MOD_CONT; + //char *v[32]; + //v[0] = av[1]; + //do_join(av[0], 1, v); + //return MOD_CONT; + + User *u; + Channel *c; + int i; + int32 modes = 0, thismode; + char *new_av[32]; + char *cumodes[3]; + char thismodes[256]; + cumodes[0] = thismodes; + + // some sanity checks + if (ac < 2) { + return MOD_CONT; + } + + u = finduser(av[0]); // get the user info + + if (!u) { + return MOD_CONT; + } + + cumodes[1] = av[0]; + + // iterate through each channel the user is joining + for (i = 1; i < ac; i++) { + // the channel name + new_av[0] = av[i]; + + // strip off the permissions + strcpy(thismodes, ""); + if (*new_av[0] != '#') { + switch (*new_av[0]) { + case '@': + strcpy(thismodes, "+o"); + break; + case '%': + strcpy(thismodes, "+h"); + break; + case '+': + strcpy(thismodes, "+v"); + break; + } + new_av[0]++; + } + + do_join(av[0], 1, new_av); + c = findchan(new_av[0]); + if ((c) && (strcmp(thismodes, ""))) { + chan_set_modes(av[0], c, 2, cumodes, 1); + } + } + + return MOD_CONT; + +} + +int anope_event_motd(char *source, int ac, char **av) +{ + return MOD_CONT; +} + +int anope_event_setname(char *source, int ac, char **av) +{ + User *u; + + if (ac != 2) + return MOD_CONT; + + u = finduser(av[0]); + if (!u) { + if (debug) { + alog("user: SETNAME for nonexistent user %s", source); + } + return MOD_CONT; + } + change_user_realname(u, av[1]); + 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("user: 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) +{ + return MOD_CONT; +} +int anope_event_chgident(char *source, int ac, char **av) +{ + 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("user: SETHOST for nonexistent user %s", source); + } + return MOD_CONT; + } + change_user_host(u, av[1]); + return MOD_CONT; +} + +int anope_event_nick(char *source, int ac, char **av) +{ + User *user; + struct in_addr addy; + uint32 *ad = (uint32 *) & addy; + +// someone really should comment this -- Brain + +// 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) + +// Syntax: N <time> <nick> <host> <displayed-host> <ident> <modes> <ipaddress> <server> :<GECOS> + + if (ac == 9) { + // fix by brain - 27 apr 2005 + // During a net merge between two meshed clients there may be some spurious "bouncing" + // nick introductions (e.g. introductions for clients we already have). If this happens, + // we should ignore any that claim to be from us as these are just confirmations of the + // services "complement" - processing them will cause all kinds of session limit oddities. + if ((strcmp(av[7], ServerName)) || (finduser(av[1]))) { + inet_aton(av[6], &addy); + user = do_nick(source, av[1], av[4], av[2], uplink, av[8], + strtoul(av[0], NULL, 10), 0, htonl(*ad), av[3], + NULL); + if (user) + anope_set_umode(user, 1, &av[5]); + } + } + 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("user: 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) +{ + // to shield anope from the intricacies of the mesh, + // anope only sees the uplink at all times (and receives + // all nick introductions etc as if they'd come from the + // uplink directly, 1 hop away. + if (!uplink) { + uplink = sstrdup(av[0]); + do_server(source, av[0], av[1], av[3], NULL); + } + return MOD_CONT; +} + + +int anope_event_privmsg(char *source, int ac, char **av) +{ + if (ac != 3) + return MOD_CONT; + m_privmsg(av[0], av[1], av[2]); + return MOD_CONT; +} + +int anope_event_part(char *source, int ac, char **av) +{ + char *v[32]; + if (ac != 3) + return MOD_CONT; + v[0] = av[1]; // channel + v[1] = av[2]; // reason + do_part(av[0], 2, v); + return MOD_CONT; +} + +int anope_event_whois(char *source, int ac, char **av) +{ + 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) +{ + // ] <mask> <who> + send_cmd(NULL, "] %s %s", mask, s_OperServ); +} + +/* SZLINE */ +void inspircd_cmd_szline(char *mask, char *reason, char *whom) +{ + // } <mask> <who-set-it> <time-set> <duration> :<reason> + send_cmd(NULL, "} %s %s %lu %lu :%s", mask, whom, + (long int) time(NULL), 86400 * 2, 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) +{ + /* Not supported by this IRCD */ +} + +/* SVSMODE +d */ +/* nc_change was = 1, and there is no na->status */ +void inspircd_cmd_nc_change(User * u) +{ + common_svsmode(u, "-r", "1"); +} + +/* SVSMODE +r */ +void inspircd_cmd_svid_umode2(User * u, char *ts) +{ + send_cmd(NULL, "m %s %s +r", s_OperServ, u->nick); +} + +void inspircd_cmd_svid_umode3(User * u, char *ts) +{ + /* not used */ +} + +void inspircd_cmd_svsjoin(char *source, char *nick, char *chan) +{ + send_cmd(source, "J %s %s", nick, chan); +} + +void inspircd_cmd_svspart(char *source, char *nick, char *chan) +{ + send_cmd(source, "L %s %s :", nick, chan); +} + +void inspircd_cmd_swhois(char *source, char *who, char *mask) +{ + /* Not supported at U type server */ +} + +void inspircd_cmd_eob() +{ + /* Not implemented in this version of inspircd.c */ +} + + +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) +{ + // no +f mode! + return 1; +} + +void inspircd_cmd_jupe(char *jserver, char *who, char *reason) +{ + alog("JUPE: Unsupported!"); +} + +/* GLOBOPS - to handle old WALLOPS */ +void inspircd_cmd_global_legacy(char *source, char *fmt) +{ + send_cmd(NULL, "@ %s :%s", source ? source : ServerName, fmt); +} + +int inspircd_valid_nick(char *nick) +{ + // no special nicks + return 1; +} + +void inspircd_cmd_ctcp(char *source, char *dest, char *buf) +{ + char *s; + if (!buf) { + return; + } else { + s = normalizeBuffer(buf); + send_cmd(NULL, "V %s %s :\1%s \1", source, 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_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_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("Brain"); + moduleAddVersion("$Id$"); + moduleSetType(PROTOCOL); + + pmodule_ircd_version("InspIRCd 1.0 Beta3"); + 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/inspircd.h b/src/protocol/inspircd.h new file mode 100644 index 000000000..a7aa01e4c --- /dev/null +++ b/src/protocol/inspircd.h @@ -0,0 +1,124 @@ +/* InspIRCd 1.0 beta functions + * + * (C) 2003-2005 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); + diff --git a/src/plexus.c b/src/protocol/plexus.c index 63ef88996..2c14a1c34 100644 --- a/src/plexus.c +++ b/src/protocol/plexus.c @@ -13,17 +13,9 @@ #include "services.h" #include "pseudo.h" +#include "plexus.h" -#ifdef IRC_PLEXUS - -const char version_protocol[] = "PleXusIRCd 2.0+"; - -/* Not all ircds use +f for their flood/join throttle system */ -const char flood_mode_char_set[] = ""; /* mode char for FLOOD mode on set */ -const char flood_mode_char_remove[] = ""; /* mode char for FLOOD mode on remove */ -int UseTSMODE = 0; - -IRCDVar ircd[] = { +IRCDVar myIrcd[] = { {"PleXusIRCd 2.0+", /* ircd name */ "+oiSR", /* nickserv mode */ "+oiSR", /* chanserv mode */ @@ -84,7 +76,6 @@ IRCDVar ircd[] = { 0, /* O:LINE */ 1, /* VHOST ON NICK */ 0, /* Change RealName */ - CHAN_HELP_IRCD_HALFOP, /* ChanServ extra */ CMODE_p, /* No Knock */ 0, /* Admin Only */ DEFAULT_MLOCK, /* Default MLOCK */ @@ -116,7 +107,7 @@ IRCDVar ircd[] = { {NULL} }; -IRCDCAPAB ircdcap[] = { +IRCDCAPAB myIrcdcap[] = { { 0, /* NOQUIT */ 0, /* TSMODE */ @@ -151,7 +142,7 @@ IRCDCAPAB ircdcap[] = { -void anope_set_umode(User * user, int ac, char **av) +void plexus_set_umode(User * user, int ac, char **av) { int add = 1; /* 1 if adding modes, 0 if deleting */ char *modes = av[0]; @@ -317,7 +308,7 @@ unsigned long umodes[128] = { }; -char csmodes[128] = { +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, @@ -338,7 +329,7 @@ char csmodes[128] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -CMMode cmmodes[128] = { +CMMode myCmmodes[128] = { {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, @@ -388,7 +379,7 @@ CMMode cmmodes[128] = { }; -CBMode cbmodes[128] = { +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}, @@ -454,7 +445,7 @@ CBMode cbmodes[128] = { {0}, {0}, {0}, {0} }; -CBModeInfo cbmodeinfos[] = { +CBModeInfo myCbmodeinfos[] = { {'a', CMODE_a, 0, NULL, NULL}, {'i', CMODE_i, 0, NULL, NULL}, {'k', CMODE_k, 0, get_key, cs_get_key}, @@ -473,7 +464,7 @@ CBModeInfo cbmodeinfos[] = { }; -CUMode cumodes[128] = { +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}, @@ -522,44 +513,26 @@ CUMode cumodes[128] = { -void anope_cmd_notice(char *source, char *dest, const char *fmt, ...) +void plexus_cmd_notice(char *source, char *dest, char *buf) { - 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; } if (UsePrivmsg) { - anope_cmd_privmsg2(source, dest, buf); + plexus_cmd_privmsg2(source, dest, buf); } else { send_cmd(source, "NOTICE %s :%s", dest, buf); } } -void anope_cmd_notice2(char *source, char *dest, char *msg) +void plexus_cmd_notice2(char *source, char *dest, char *msg) { send_cmd(source, "NOTICE %s :%s", dest, msg); } -void anope_cmd_privmsg(char *source, char *dest, const char *fmt, ...) +void plexus_cmd_privmsg(char *source, char *dest, char *buf) { - 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; } @@ -567,33 +540,24 @@ void anope_cmd_privmsg(char *source, char *dest, const char *fmt, ...) send_cmd(source, "PRIVMSG %s :%s", dest, buf); } -void anope_cmd_privmsg2(char *source, char *dest, char *msg) +void plexus_cmd_privmsg2(char *source, char *dest, char *msg) { send_cmd(source, "PRIVMSG %s :%s", dest, msg); } -void anope_cmd_serv_notice(char *source, char *dest, char *msg) +void plexus_cmd_serv_notice(char *source, char *dest, char *msg) { send_cmd(source, "NOTICE $$%s :%s", dest, msg); } -void anope_cmd_serv_privmsg(char *source, char *dest, char *msg) +void plexus_cmd_serv_privmsg(char *source, char *dest, char *msg) { send_cmd(source, "PRIVMSG $$%s :%s", dest, msg); } -void anope_cmd_global(char *source, const char *fmt, ...) +void plexus_cmd_global(char *source, char *buf) { - 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; } @@ -602,7 +566,7 @@ void anope_cmd_global(char *source, const char *fmt, ...) } /* GLOBOPS - to handle old WALLOPS */ -void anope_cmd_global_legacy(char *source, char *fmt) +void plexus_cmd_global_legacy(char *source, char *fmt) { send_cmd(source ? source : ServerName, "OPERWALL :%s", fmt); } @@ -728,59 +692,59 @@ void moduleAddIRCDMsgs(void) { /* *INDENT-ON* */ -void anope_cmd_sqline(char *mask, char *reason) +void plexus_cmd_sqline(char *mask, char *reason) { send_cmd(NULL, "RESV * %s :%s", mask, reason); } -void anope_cmd_unsgline(char *mask) +void plexus_cmd_unsgline(char *mask) { /* Does not support */ } -void anope_cmd_unszline(char *mask) +void plexus_cmd_unszline(char *mask) { /* Does not support */ } -void anope_cmd_szline(char *mask, char *reason, char *whom) +void plexus_cmd_szline(char *mask, char *reason, char *whom) { /* Does not support */ } -void anope_cmd_svsnoop(char *server, int set) +void plexus_cmd_svsnoop(char *server, int set) { /* does not support */ } -void anope_cmd_svsadmin(char *server, int set) +void plexus_cmd_svsadmin(char *server, int set) { - anope_cmd_svsnoop(server, set); + plexus_cmd_svsnoop(server, set); } -void anope_cmd_sgline(char *mask, char *reason) +void plexus_cmd_sgline(char *mask, char *reason) { /* does not support */ } -void anope_cmd_remove_akill(char *user, char *host) +void plexus_cmd_remove_akill(char *user, char *host) { send_cmd(s_OperServ, "UNKLINE * %s %s", user, host); } -void anope_cmd_topic(char *whosets, char *chan, char *whosetit, - char *topic, time_t when) +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 anope_cmd_vhost_off(User * u) +void plexus_cmd_vhost_off(User * u) { send_cmd(NULL, "SVSMODE %s -h", u->nick); } -void anope_cmd_vhost_on(char *nick, char *vIdent, char *vhost) +void plexus_cmd_vhost_on(char *nick, char *vIdent, char *vhost) { if (!nick) { return; @@ -789,12 +753,12 @@ void anope_cmd_vhost_on(char *nick, char *vIdent, char *vhost) send_cmd(NULL, "SVSHOST %s %s", nick, vhost); } -void anope_cmd_unsqline(char *user) +void plexus_cmd_unsqline(char *user) { send_cmd(NULL, "UNRESV * %s", user); } -void anope_cmd_join(char *user, char *channel, time_t chantime) +void plexus_cmd_join(char *user, char *channel, time_t chantime) { send_cmd(NULL, "SJOIN %ld %s + :%s", (long int) time(NULL), channel, user); @@ -809,24 +773,15 @@ host: the 'host' portion of the kline reason: the reason for the kline. */ -void anope_cmd_akill(char *user, char *host, char *who, time_t when, - time_t expires, char *reason) +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 anope_cmd_svskill(char *source, char *user, const char *fmt, ...) +void plexus_cmd_svskill(char *source, char *user, char *buf) { - 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; } @@ -838,7 +793,7 @@ void anope_cmd_svskill(char *source, char *user, const char *fmt, ...) send_cmd(source, "KILL %s :%s", user, buf); } -void anope_cmd_svsmode(User * u, int ac, char **av) +void plexus_cmd_svsmode(User * u, int ac, char **av) { send_cmd(ServerName, "SVSMODE %s %s", u->nick, av[0]); @@ -846,28 +801,6 @@ void anope_cmd_svsmode(User * u, int ac, char **av) send_cmd(ServerName, "SVSID %s %s", u->nick, av[1]); } -void anope_cmd_connect(int servernum) -{ - me_server = - new_server(NULL, ServerName, ServerDesc, SERVER_ISME, NULL); - - if (servernum == 1) - anope_cmd_pass(RemotePassword); - else if (servernum == 2) - anope_cmd_pass(RemotePassword2); - else if (servernum == 3) - anope_cmd_pass(RemotePassword3); - - anope_cmd_capab(); - anope_cmd_server(ServerName, 1, ServerDesc); - anope_cmd_svinfo(); -} - -void anope_cmd_svsinfo() -{ - /* not used */ -} - /* * SVINFO * parv[0] = sender prefix @@ -876,7 +809,7 @@ void anope_cmd_svsinfo() * parv[3] = server is standalone or connected to non-TS only * parv[4] = server's idea of UTC time */ -void anope_cmd_svinfo() +void plexus_cmd_svinfo() { send_cmd(NULL, "SVINFO 5 5 0 :%ld", (long int) time(NULL)); } @@ -902,47 +835,61 @@ void anope_cmd_svinfo() PARA - supports invite broadcasting for +p ENCAP - ? */ -void anope_cmd_capab() +void plexus_cmd_capab() { send_cmd(NULL, "CAPAB :QS EX CHW IE EOB KLN GLN HOPS HUB KNOCK TBURST PARA"); } /* PASS */ -void anope_cmd_pass(char *pass) +void plexus_cmd_pass(char *pass) { send_cmd(NULL, "PASS %s :TS", pass); } /* SERVER name hop descript */ -void anope_cmd_server(char *servname, int hop, char *descript) +void plexus_cmd_server(char *servname, int hop, char *descript) { send_cmd(NULL, "SERVER %s %d :%s", servname, hop, descript); } -void anope_cmd_bot_nick(char *nick, char *user, char *host, char *real, - char *modes) +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(NULL, "NICK %s 1 %ld %s %s %s %s %s 0 :%s", nick, (long int) time(NULL), modes, user, host, "*", ServerName, real); - anope_cmd_sqline(nick, "Reserved for services"); + plexus_cmd_sqline(nick, "Reserved for services"); } -void anope_cmd_part(char *nick, char *chan, const char *fmt, ...) +void plexus_cmd_part(char *nick, char *chan, char *buf) { - 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) { send_cmd(nick, "PART %s :%s", chan, buf); } else { @@ -973,7 +920,7 @@ int anope_event_ping(char *source, int ac, char **av) { if (ac < 1) return MOD_CONT; - anope_cmd_pong(ac > 1 ? av[1] : ServerName, av[0]); + plexus_cmd_pong(ac > 1 ? av[1] : ServerName, av[0]); return MOD_CONT; } @@ -1022,7 +969,7 @@ int anope_event_eob(char *source, int ac, char **av) return MOD_CONT; } -void anope_cmd_eob() +void plexus_cmd_eob() { send_cmd(ServerName, "EOB"); } @@ -1096,30 +1043,30 @@ int anope_event_quit(char *source, int ac, char **av) return MOD_CONT; } -void anope_cmd_372(char *source, char *msg) +void plexus_cmd_372(char *source, char *msg) { send_cmd(ServerName, "372 %s :- %s", source, msg); } -void anope_cmd_372_error(char *source) +void plexus_cmd_372_error(char *source) { send_cmd(ServerName, "422 %s :- MOTD file not found! Please " "contact your IRC administrator.", source); } -void anope_cmd_375(char *source) +void plexus_cmd_375(char *source) { send_cmd(ServerName, "375 %s :- %s Message of the Day", source, ServerName); } -void anope_cmd_376(char *source) +void plexus_cmd_376(char *source) { send_cmd(ServerName, "376 %s :End of /MOTD command.", source); } /* 391 */ -void anope_cmd_391(char *source, char *timestr) +void plexus_cmd_391(char *source, char *timestr) { if (!timestr) { return; @@ -1128,17 +1075,8 @@ void anope_cmd_391(char *source, char *timestr) } /* 250 */ -void anope_cmd_250(const char *fmt, ...) +void plexus_cmd_250(char *buf) { - 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; } @@ -1147,17 +1085,8 @@ void anope_cmd_250(const char *fmt, ...) } /* 307 */ -void anope_cmd_307(const char *fmt, ...) +void plexus_cmd_307(char *buf) { - 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; } @@ -1166,17 +1095,8 @@ void anope_cmd_307(const char *fmt, ...) } /* 311 */ -void anope_cmd_311(const char *fmt, ...) +void plexus_cmd_311(char *buf) { - 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; } @@ -1185,17 +1105,8 @@ void anope_cmd_311(const char *fmt, ...) } /* 312 */ -void anope_cmd_312(const char *fmt, ...) +void plexus_cmd_312(char *buf) { - 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; } @@ -1204,17 +1115,8 @@ void anope_cmd_312(const char *fmt, ...) } /* 317 */ -void anope_cmd_317(const char *fmt, ...) +void plexus_cmd_317(char *buf) { - 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; } @@ -1223,7 +1125,7 @@ void anope_cmd_317(const char *fmt, ...) } /* 219 */ -void anope_cmd_219(char *source, char *letter) +void plexus_cmd_219(char *source, char *letter) { if (!source) { return; @@ -1238,7 +1140,7 @@ void anope_cmd_219(char *source, char *letter) } /* 401 */ -void anope_cmd_401(char *source, char *who) +void plexus_cmd_401(char *source, char *who) { if (!source || !who) { return; @@ -1247,7 +1149,7 @@ void anope_cmd_401(char *source, char *who) } /* 318 */ -void anope_cmd_318(char *source, char *who) +void plexus_cmd_318(char *source, char *who) { if (!source || !who) { return; @@ -1257,17 +1159,8 @@ void anope_cmd_318(char *source, char *who) } /* 242 */ -void anope_cmd_242(const char *fmt, ...) +void plexus_cmd_242(char *buf) { - 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; } @@ -1276,17 +1169,8 @@ void anope_cmd_242(const char *fmt, ...) } /* 243 */ -void anope_cmd_243(const char *fmt, ...) +void plexus_cmd_243(char *buf) { - 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; } @@ -1295,17 +1179,8 @@ void anope_cmd_243(const char *fmt, ...) } /* 211 */ -void anope_cmd_211(const char *fmt, ...) +void plexus_cmd_211(char *buf) { - 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; } @@ -1313,17 +1188,8 @@ void anope_cmd_211(const char *fmt, ...) send_cmd(NULL, "211 %s ", buf); } -void anope_cmd_mode(char *source, char *dest, const char *fmt, ...) +void plexus_cmd_mode(char *source, char *dest, char *buf) { - 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; } @@ -1331,28 +1197,17 @@ void anope_cmd_mode(char *source, char *dest, const char *fmt, ...) send_cmd(source, "MODE %s %s", dest, buf); } -void anope_cmd_nick(char *nick, char *name, char *mode) +void plexus_cmd_nick(char *nick, char *name, char *mode) { EnforceQlinedNick(nick, NULL); send_cmd(NULL, "NICK %s 1 %ld %s %s %s %s %s 0 :%s", nick, (long int) time(NULL), mode, ServiceUser, ServiceHost, "*", ServerName, (name)); - anope_cmd_sqline(nick, "Reserved for services"); + plexus_cmd_sqline(nick, "Reserved for services"); } -void anope_cmd_kick(char *source, char *chan, char *user, const char *fmt, - ...) +void plexus_cmd_kick(char *source, char *chan, char *user, char *buf) { - 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) { send_cmd(source, "KICK %s %s :%s", chan, user, buf); } else { @@ -1360,17 +1215,8 @@ void anope_cmd_kick(char *source, char *chan, char *user, const char *fmt, } } -void anope_cmd_notice_ops(char *source, char *dest, const char *fmt, ...) +void plexus_cmd_notice_ops(char *source, char *dest, char *buf) { - 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; } @@ -1378,24 +1224,14 @@ void anope_cmd_notice_ops(char *source, char *dest, const char *fmt, ...) send_cmd(NULL, "NOTICE @%s :%s", dest, buf); } -void anope_cmd_bot_chan_mode(char *nick, char *chan) +void plexus_cmd_bot_chan_mode(char *nick, char *chan) { anope_cmd_mode(nick, chan, "%s %s", ircd->botchanumode, nick); } /* QUIT */ -void anope_cmd_quit(char *source, const char *fmt, ...) +void plexus_cmd_quit(char *source, char *buf) { - 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) { send_cmd(source, "QUIT :%s", buf); } else { @@ -1404,13 +1240,13 @@ void anope_cmd_quit(char *source, const char *fmt, ...) } /* PONG */ -void anope_cmd_pong(char *servname, char *who) +void plexus_cmd_pong(char *servname, char *who) { send_cmd(servname, "PONG %s", who); } /* INVITE */ -void anope_cmd_invite(char *source, char *chan, char *nick) +void plexus_cmd_invite(char *source, char *chan, char *nick) { if (!source || !chan || !nick) { return; @@ -1420,7 +1256,7 @@ void anope_cmd_invite(char *source, char *chan, char *nick) } /* SQUIT */ -void anope_cmd_squit(char *servname, char *message) +void plexus_cmd_squit(char *servname, char *message) { if (!servname || !message) { return; @@ -1449,7 +1285,7 @@ int anope_event_mode(char *source, int ac, char **av) return MOD_CONT; } -void anope_cmd_351(char *source) +void plexus_cmd_351(char *source) { send_cmd(ServerName, "351 %s Anope-%s %s :%s - %s -- %s", source, version_number, ServerName, ircd->name, version_flags, @@ -1464,19 +1300,19 @@ int anope_event_capab(char *source, int ac, char **av) } /* SVSHOLD - set */ -void anope_cmd_svshold(char *nick) +void plexus_cmd_svshold(char *nick) { /* Not supported by this IRCD */ } /* SVSHOLD - release */ -void anope_cmd_release_svshold(char *nick) +void plexus_cmd_release_svshold(char *nick) { /* Not Supported by this IRCD */ } /* SVSNICK */ -void anope_cmd_svsnick(char *nick, char *newnick, time_t when) +void plexus_cmd_svsnick(char *nick, char *newnick, time_t when) { if (!nick || !newnick) { return; @@ -1484,47 +1320,47 @@ void anope_cmd_svsnick(char *nick, char *newnick, time_t when) send_cmd(NULL, "SVSNICK %s %s", nick, newnick); } -void anope_cmd_guest_nick(char *nick, char *user, char *host, char *real, - char *modes) +void plexus_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 0 :%s", nick, (long int) time(NULL), modes, user, host, "*", ServerName, real); } -void anope_cmd_svso(char *source, char *nick, char *flag) +void plexus_cmd_svso(char *source, char *nick, char *flag) { /* Not Supported by this IRCD */ } -void anope_cmd_unban(char *name, char *nick) +void plexus_cmd_unban(char *name, char *nick) { /* Not Supported by this IRCD */ } /* SVSMODE channel modes */ -void anope_cmd_svsmode_chan(char *name, char *mode, char *nick) +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 anope_cmd_svid_umode(char *nick, time_t ts) +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 anope_cmd_nc_change(User * u) +void plexus_cmd_nc_change(User * u) { common_svsmode(u, "-R", "1"); } /* SVSMODE +d */ -void anope_cmd_svid_umode2(User * u, char *ts) +void plexus_cmd_svid_umode2(User * u, char *ts) { if (u->svid != u->timestamp) { common_svsmode(u, "+R", ts); @@ -1533,13 +1369,13 @@ void anope_cmd_svid_umode2(User * u, char *ts) } } -void anope_cmd_svid_umode3(User * u, char *ts) +void plexus_cmd_svid_umode3(User * u, char *ts) { /* not used */ } /* NICK <newnick> */ -void anope_cmd_chg_nick(char *oldnick, char *newnick) +void plexus_cmd_chg_nick(char *oldnick, char *newnick) { if (!oldnick || !newnick) { return; @@ -1568,17 +1404,17 @@ int anope_event_pass(char *source, int ac, char **av) return MOD_CONT; } -void anope_cmd_svsjoin(char *source, char *nick, char *chan) +void plexus_cmd_svsjoin(char *source, char *nick, char *chan) { /* Not Supported by this IRCD */ } -void anope_cmd_svspart(char *source, char *nick, char *chan) +void plexus_cmd_svspart(char *source, char *nick, char *chan) { /* Not Supported by this IRCD */ } -void anope_cmd_swhois(char *source, char *who, char *mask) +void plexus_cmd_swhois(char *source, char *who, char *mask) { /* not supported */ } @@ -1598,7 +1434,7 @@ int anope_event_invite(char *source, int ac, char **av) return MOD_CONT; } -int anope_flood_mode_check(char *value) +int plexus_flood_mode_check(char *value) { return 0; } @@ -1613,15 +1449,15 @@ int anope_event_error(char *source, int ac, char **av) return MOD_CONT; } -void anope_cmd_jupe(char *jserver, char *who, char *reason) +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 : ""); - anope_cmd_squit(jserver, rbuf); - anope_cmd_server(jserver, 2, rbuf); + plexus_cmd_squit(jserver, rbuf); + plexus_cmd_server(jserver, 2, rbuf); new_server(me_server, jserver, rbuf, SERVER_JUPED, NULL); } @@ -1629,24 +1465,16 @@ void anope_cmd_jupe(char *jserver, char *who, char *reason) 1 = valid nick 0 = nick is in valid */ -int anope_valid_nick(char *nick) +int plexus_valid_nick(char *nick) { /* no hard coded invalid nicks */ return 1; } -void anope_cmd_ctcp(char *source, char *dest, const char *fmt, ...) +void plexus_cmd_ctcp(char *source, char *dest, char *buf) { - va_list args; - char buf[BUFSIZE]; char *s; - *buf = '\0'; - if (fmt) { - va_start(args, fmt); - vsnprintf(buf, BUFSIZE - 1, fmt, args); - va_end(args); - } if (!buf) { return; } else { @@ -1657,4 +1485,118 @@ void anope_cmd_ctcp(char *source, char *dest, const char *fmt, ...) free(s); } -#endif + +/** + * 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_unsqline); + 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_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_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; +} diff --git a/src/protocol/plexus.h b/src/protocol/plexus.h new file mode 100644 index 000000000..54f002ca3 --- /dev/null +++ b/src/protocol/plexus.h @@ -0,0 +1,126 @@ +/* PlexusIRCD IRCD functions + * + * (C) 2003-2005 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/ptlink.c b/src/protocol/ptlink.c index d7c848953..25c85d739 100644 --- a/src/ptlink.c +++ b/src/protocol/ptlink.c @@ -13,17 +13,9 @@ #include "services.h" #include "pseudo.h" +#include "ptlink.h" -#ifdef IRC_PTLINK - -const char version_protocol[] = "PTlink 6.15.*+"; - -/* Not all ircds use +f for their flood/join throttle system */ -const char flood_mode_char_set[] = "+f"; /* mode char for FLOOD mode on set */ -const char flood_mode_char_remove[] = "-f"; /* mode char for FLOOD mode on remove */ -int UseTSMODE = 0; - -IRCDVar ircd[] = { +IRCDVar myIrcd[] = { {"PTlink 6.15.*+", /* ircd name */ "+o", /* nickserv mode */ "+o", /* chanserv mode */ @@ -84,7 +76,6 @@ IRCDVar ircd[] = { 1, /* UMODE */ 1, /* VHOST ON NICK */ 0, /* Change RealName */ - CHAN_HELP_IRCD_PROTECT, /* ChanServ extra */ CMODE_K, /* No Knock */ CMODE_A, /* Admin Only */ DEFAULT_MLOCK, /* Default MLOCK */ @@ -116,7 +107,7 @@ IRCDVar ircd[] = { {NULL} }; -IRCDCAPAB ircdcap[] = { +IRCDCAPAB myIrcdcap[] = { { 0, /* NOQUIT */ 0, /* TSMODE */ @@ -201,7 +192,7 @@ unsigned long umodes[128] = { 0, 0 /* ~ ‚ */ }; -char csmodes[128] = { +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, @@ -223,7 +214,7 @@ char csmodes[128] = { }; -CMMode cmmodes[128] = { +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}, @@ -250,7 +241,7 @@ CMMode cmmodes[128] = { }; -CBMode cbmodes[128] = { +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}, @@ -316,7 +307,7 @@ CBMode cbmodes[128] = { {0}, {0}, {0}, {0} }; -CBModeInfo cbmodeinfos[] = { +CBModeInfo myCbmodeinfos[] = { {'c', CMODE_c, 0, NULL, NULL}, {'d', CMODE_d, 0, NULL, NULL}, {'f', CMODE_f, 0, get_flood, cs_get_flood}, @@ -341,7 +332,7 @@ CBModeInfo cbmodeinfos[] = { {0} }; -CUMode cumodes[128] = { +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}, @@ -390,7 +381,7 @@ CUMode cumodes[128] = { -void anope_cmd_bot_chan_mode(char *nick, char *chan) +void ptlink_cmd_bot_chan_mode(char *nick, char *chan) { anope_cmd_mode(s_ChanServ, chan, "%s %s %s", ircd->botchanumode, nick, nick); @@ -606,7 +597,7 @@ int anope_event_capab(char *source, int ac, char **av) parv[1] = sqlined nick/mask parv[2] = reason */ -void anope_cmd_sqline(char *mask, char *reason) +void ptlink_cmd_sqline(char *mask, char *reason) { send_cmd(ServerName, "SQLINE %s :%s", mask, reason); } @@ -619,14 +610,14 @@ void anope_cmd_sqline(char *mask, char *reason) operations: noopers - remove existing opers and disable o:lines */ -void anope_cmd_svsnoop(char *server, int set) +void ptlink_cmd_svsnoop(char *server, int set) { send_cmd(NULL, "SVSADMIN %s :%s", server, set ? "noopers" : "rehash"); } -void anope_cmd_svsadmin(char *server, int set) +void ptlink_cmd_svsadmin(char *server, int set) { - anope_cmd_svsnoop(server, set); + ptlink_cmd_svsnoop(server, set); } /* @@ -634,7 +625,7 @@ void anope_cmd_svsadmin(char *server, int set) parv[0] = sender (server if on network synchronization) parv[1] = glined usert@host mask or ALL to remove all glines */ -void anope_cmd_remove_akill(char *user, char *host) +void ptlink_cmd_remove_akill(char *user, char *host) { send_cmd(NULL, "UNGLINE %s@%s", user, host); } @@ -656,12 +647,12 @@ void anope_topic(char *whosets, char *chan, char *whosetit, char *topic, parv[0] = sender parv[1] = sqlined nick/mask */ -void anope_cmd_unsqline(char *user) +void ptlink_cmd_unsqline(char *user) { send_cmd(NULL, "UNSQLINE %s", user); } -void anope_cmd_join(char *user, char *channel, time_t chantime) +void ptlink_cmd_join(char *user, char *channel, time_t chantime) { send_cmd(ServerName, "SJOIN %ld %s + :%s", (long int) time(NULL), channel, user); @@ -675,25 +666,16 @@ void anope_cmd_join(char *user, char *channel, time_t chantime) parv[3] = who added the gline parv[4] = reason */ -void anope_cmd_akill(char *user, char *host, char *who, time_t when, - time_t expires, char *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 anope_cmd_svskill(char *source, char *user, const char *fmt, ...) +void ptlink_cmd_svskill(char *source, char *user, char *buf) { - 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; } @@ -713,7 +695,7 @@ void anope_cmd_svskill(char *source, char *user, const char *fmt, ...) parv[3] = extra parameter ( if news setting mode(+n) ) e.g.: :NickServ SVSMODE Lamego +rn 1991234 */ -void anope_cmd_svsmode(User * u, int ac, char **av) +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] : "")); @@ -729,35 +711,17 @@ int anope_event_error(char *source, int ac, char **av) return MOD_CONT; } -void anope_cmd_squit(char *servname, char *message) +void ptlink_cmd_squit(char *servname, char *message) { send_cmd(NULL, "SQUIT %s :%s", servname, message); } /* PONG */ -void anope_cmd_pong(char *servname, char *who) +void ptlink_cmd_pong(char *servname, char *who) { send_cmd(servname, "PONG %s", who); } -void anope_cmd_connect(int servernum) -{ - me_server = - new_server(NULL, ServerName, ServerDesc, SERVER_ISME, NULL); - - if (servernum == 1) - anope_cmd_pass(RemotePassword); - else if (servernum == 2) - anope_cmd_pass(RemotePassword2); - else if (servernum == 3) - anope_cmd_pass(RemotePassword3); - - anope_cmd_capab(); - anope_cmd_server(ServerName, 1, ServerDesc); - anope_cmd_svinfo(); - anope_cmd_svsinfo(); -} - /* SVINFO %d %d parv[0] = server name @@ -767,7 +731,7 @@ void anope_cmd_connect(int servernum) See the ptlink.h for information on PTLINK_TS_CURRENT, and PTLINK_TS_MIN */ -void anope_cmd_svinfo() +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, @@ -784,7 +748,7 @@ void anope_cmd_svinfo() parv[1] = local services data TS parv[1] = max global users */ -void anope_cmd_svsinfo() +void ptlink_cmd_svsinfo() { send_cmd(NULL, "SVSINFO %lu %d", (unsigned long int) time(NULL), maxusercnt); @@ -796,7 +760,7 @@ void anope_cmd_svsinfo() (TS indicates this is server uses TS protocol and SVINFO will be sent for protocol compatibility checking) */ -void anope_cmd_pass(char *pass) +void ptlink_cmd_pass(char *pass) { send_cmd(NULL, "PASS %s :TS", pass); } @@ -805,17 +769,36 @@ void anope_cmd_pass(char *pass) CAPAB :%s parv[1] = capability list */ -void anope_cmd_capab() +void ptlink_cmd_capab() { send_cmd(NULL, "CAPAB :QS PTS4"); } -void anope_cmd_server(char *servname, int hop, char *descript) +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) { @@ -929,17 +912,8 @@ int anope_event_motd(char *source, int ac, char **av) return MOD_CONT; } -void anope_cmd_notice_ops(char *source, char *dest, const char *fmt, ...) +void ptlink_cmd_notice_ops(char *source, char *dest, char *buf) { - 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; } @@ -948,44 +922,26 @@ void anope_cmd_notice_ops(char *source, char *dest, const char *fmt, ...) } -void anope_cmd_notice(char *source, char *dest, const char *fmt, ...) +void ptlink_cmd_notice(char *source, char *dest, char *buf) { - 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; } if (UsePrivmsg) { - anope_cmd_privmsg2(source, dest, buf); + ptlink_cmd_privmsg2(source, dest, buf); } else { send_cmd(source, "NOTICE %s :%s", dest, buf); } } -void anope_cmd_notice2(char *source, char *dest, char *msg) +void ptlink_cmd_notice2(char *source, char *dest, char *msg) { send_cmd(source, "NOTICE %s :%s", dest, msg); } -void anope_cmd_privmsg(char *source, char *dest, const char *fmt, ...) +void ptlink_cmd_privmsg(char *source, char *dest, char *buf) { - 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; } @@ -993,33 +949,24 @@ void anope_cmd_privmsg(char *source, char *dest, const char *fmt, ...) send_cmd(source, "PRIVMSG %s :%s", dest, buf); } -void anope_cmd_privmsg2(char *source, char *dest, char *msg) +void ptlink_cmd_privmsg2(char *source, char *dest, char *msg) { send_cmd(source, "PRIVMSG %s :%s", dest, msg); } -void anope_cmd_serv_notice(char *source, char *dest, char *msg) +void ptlink_cmd_serv_notice(char *source, char *dest, char *msg) { send_cmd(source, "NOTICE $%s :%s", dest, msg); } -void anope_cmd_serv_privmsg(char *source, char *dest, char *msg) +void ptlink_cmd_serv_privmsg(char *source, char *dest, char *msg) { send_cmd(source, "PRIVMSG $%s :%s", dest, msg); } /* GLOBOPS */ -void anope_cmd_global(char *source, const char *fmt, ...) +void ptlink_cmd_global(char *source, char *buf) { - 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; } @@ -1028,7 +975,7 @@ void anope_cmd_global(char *source, const char *fmt, ...) } /* 391 */ -void anope_cmd_391(char *source, char *timestr) +void ptlink_cmd_391(char *source, char *timestr) { if (!timestr) { return; @@ -1037,17 +984,8 @@ void anope_cmd_391(char *source, char *timestr) } /* 250 */ -void anope_cmd_250(const char *fmt, ...) +void ptlink_cmd_250(char *buf) { - 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; } @@ -1056,17 +994,8 @@ void anope_cmd_250(const char *fmt, ...) } /* 307 */ -void anope_cmd_307(const char *fmt, ...) +void ptlink_cmd_307(char *buf) { - 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; } @@ -1075,17 +1004,8 @@ void anope_cmd_307(const char *fmt, ...) } /* 311 */ -void anope_cmd_311(const char *fmt, ...) +void ptlink_cmd_311(char *buf) { - 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; } @@ -1094,17 +1014,8 @@ void anope_cmd_311(const char *fmt, ...) } /* 312 */ -void anope_cmd_312(const char *fmt, ...) +void ptlink_cmd_312(char *buf) { - 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; } @@ -1113,17 +1024,8 @@ void anope_cmd_312(const char *fmt, ...) } /* 317 */ -void anope_cmd_317(const char *fmt, ...) +void ptlink_cmd_317(char *buf) { - 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; } @@ -1132,7 +1034,7 @@ void anope_cmd_317(const char *fmt, ...) } /* 219 */ -void anope_cmd_219(char *source, char *letter) +void ptlink_cmd_219(char *source, char *letter) { if (!source) { return; @@ -1147,7 +1049,7 @@ void anope_cmd_219(char *source, char *letter) } /* 401 */ -void anope_cmd_401(char *source, char *who) +void ptlink_cmd_401(char *source, char *who) { if (!source || !who) { return; @@ -1156,7 +1058,7 @@ void anope_cmd_401(char *source, char *who) } /* 318 */ -void anope_cmd_318(char *source, char *who) +void ptlink_cmd_318(char *source, char *who) { if (!source || !who) { return; @@ -1166,17 +1068,8 @@ void anope_cmd_318(char *source, char *who) } /* 242 */ -void anope_cmd_242(const char *fmt, ...) +void ptlink_cmd_242(char *buf) { - 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; } @@ -1185,17 +1078,8 @@ void anope_cmd_242(const char *fmt, ...) } /* 243 */ -void anope_cmd_243(const char *fmt, ...) +void ptlink_cmd_243(char *buf) { - 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; } @@ -1204,17 +1088,8 @@ void anope_cmd_243(const char *fmt, ...) } /* 211 */ -void anope_cmd_211(const char *fmt, ...) +void ptlink_cmd_211(char *buf) { - 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; } @@ -1222,17 +1097,8 @@ void anope_cmd_211(const char *fmt, ...) send_cmd(NULL, "211 %s ", buf); } -void anope_cmd_mode(char *source, char *dest, const char *fmt, ...) +void ptlink_cmd_mode(char *source, char *dest, char *buf) { - 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; } @@ -1252,27 +1118,17 @@ void anope_cmd_mode(char *source, char *dest, const char *fmt, ...) parv[8] = server parv[9] = nick info */ -void anope_cmd_nick(char *nick, char *name, char *mode) +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); - anope_cmd_sqline(nick, "Reserved for services"); + ptlink_cmd_sqline(nick, "Reserved for services"); } -void anope_cmd_kick(char *source, char *chan, char *user, const char *fmt, - ...) +void ptlink_cmd_kick(char *source, char *chan, char *user, char *buf) { - 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; } @@ -1285,18 +1141,8 @@ void anope_cmd_kick(char *source, char *chan, char *user, const char *fmt, } /* QUIT */ -void anope_cmd_quit(char *source, const char *fmt, ...) +void ptlink_cmd_quit(char *source, char *buf) { - 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) { send_cmd(source, "QUIT :%s", buf); } else { @@ -1304,18 +1150,8 @@ void anope_cmd_quit(char *source, const char *fmt, ...) } } -void anope_cmd_part(char *nick, char *chan, const char *fmt, ...) +void ptlink_cmd_part(char *nick, char *chan, char *buf) { - 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) { send_cmd(nick, "PART %s :%s", chan, buf); } else { @@ -1331,18 +1167,18 @@ void anope_cmd_part(char *nick, char *chan, const char *fmt, ...) parv[3] = topic time parv[4] = topic text */ -void anope_cmd_topic(char *whosets, char *chan, char *whosetit, - char *topic, time_t when) +void ptlink_cmd_topic(char *whosets, char *chan, char *whosetit, + char *topic, time_t when) { send_cmd(whosets, "TOPIC %s :%s", chan, topic); } -void anope_cmd_vhost_off(User * u) +void ptlink_cmd_vhost_off(User * u) { /* does not support vhosting */ } -void anope_cmd_vhost_on(char *nick, char *vIdent, char *vhost) +void ptlink_cmd_vhost_on(char *nick, char *vIdent, char *vhost) { if (vIdent) { send_cmd(s_HostServ, "NEWMASK %s@%s %s", vIdent, vhost, nick); @@ -1352,7 +1188,7 @@ void anope_cmd_vhost_on(char *nick, char *vIdent, char *vhost) } /* INVITE */ -void anope_cmd_invite(char *source, char *chan, char *nick) +void ptlink_cmd_invite(char *source, char *chan, char *nick) { if (!source || !chan || !nick) { return; @@ -1361,30 +1197,30 @@ void anope_cmd_invite(char *source, char *chan, char *nick) send_cmd(source, "INVITE %s %s", nick, chan); } -void anope_cmd_372(char *source, char *msg) +void ptlink_cmd_372(char *source, char *msg) { send_cmd(ServerName, "372 %s :- %s", source, msg); } -void anope_cmd_372_error(char *source) +void ptlink_cmd_372_error(char *source) { send_cmd(ServerName, "422 %s :- MOTD file not found! Please " "contact your IRC administrator.", source); } -void anope_cmd_375(char *source) +void ptlink_cmd_375(char *source) { send_cmd(ServerName, "375 %s :- %s Message of the Day", source, ServerName); } -void anope_cmd_376(char *source) +void ptlink_cmd_376(char *source) { send_cmd(ServerName, "376 %s :End of /MOTD command.", source); } -void anope_set_umode(User * user, int ac, char **av) +void ptlink_set_umode(User * user, int ac, char **av) { int add = 1; /* 1 if adding modes, 0 if deleting */ char *modes = av[0]; @@ -1439,7 +1275,7 @@ int anope_event_ping(char *source, int ac, char **av) { if (ac < 1) return MOD_CONT; - anope_cmd_pong(ac > 1 ? av[1] : ServerName, av[0]); + ptlink_cmd_pong(ac > 1 ? av[1] : ServerName, av[0]); return MOD_CONT; } @@ -1456,18 +1292,18 @@ int anope_event_away(char *source, int ac, char **av) return MOD_CONT; } -void anope_cmd_bot_nick(char *nick, char *user, char *host, char *real, - char *modes) +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); - anope_cmd_sqline(nick, "Reserved for services"); + ptlink_cmd_sqline(nick, "Reserved for services"); } -void anope_cmd_351(char *source) +void ptlink_cmd_351(char *source) { send_cmd(ServerName, "351 %s Anope-%s %s :%s - %s -- %s", source, version_number, ServerName, ircd->name, version_flags, @@ -1475,13 +1311,13 @@ void anope_cmd_351(char *source) } /* SVSHOLD - set */ -void anope_cmd_svshold(char *nick) +void ptlink_cmd_svshold(char *nick) { /* Not supported by this IRCD */ } /* SVSHOLD - release */ -void anope_cmd_release_svshold(char *nick) +void ptlink_cmd_release_svshold(char *nick) { /* Not Supported by this IRCD */ } @@ -1491,7 +1327,7 @@ void anope_cmd_release_svshold(char *nick) parv[0] = sender parv[1] = zlined host */ -void anope_cmd_unszline(char *mask) +void ptlink_cmd_unszline(char *mask) { send_cmd(s_OperServ, "UNZLINE %s", mask); } @@ -1503,7 +1339,7 @@ void anope_cmd_unszline(char *mask) parv[2] = time parv[3] = reason */ -void anope_cmd_szline(char *mask, char *reason, char *whom) +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); @@ -1514,7 +1350,7 @@ void anope_cmd_szline(char *mask, char *reason, char *whom) parv[0] = sender parv[1] = info ban mask */ -void anope_cmd_unsgline(char *mask) +void ptlink_cmd_unsgline(char *mask) { send_cmd(ServerName, "UNSXLINE :%s", mask); } @@ -1527,7 +1363,7 @@ void anope_cmd_unsgline(char *mask) * parv[1] = mask length * parv[2] = real name banned mask:reason */ -void anope_cmd_sgline(char *mask, char *reason) +void ptlink_cmd_sgline(char *mask, char *reason) { send_cmd(ServerName, "SXLINE %d :%s:%s", strlen(mask), mask, reason); } @@ -1540,7 +1376,7 @@ void anope_cmd_sgline(char *mask, char *reason) parv[2] = new nick e.g.: :NickServ SVSNICK Smiler 67455223 _Smiler- */ -void anope_cmd_svsnick(char *source, char *guest, time_t when) +void ptlink_cmd_svsnick(char *source, char *guest, time_t when) { if (!source || !guest) { return; @@ -1548,8 +1384,8 @@ void anope_cmd_svsnick(char *source, char *guest, time_t when) send_cmd(NULL, "SVSNICK %s %s :%ld", source, guest, (long int) when); } -void anope_cmd_guest_nick(char *nick, char *user, char *host, char *real, - char *modes) +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, @@ -1557,19 +1393,19 @@ void anope_cmd_guest_nick(char *nick, char *user, char *host, char *real, } -void anope_cmd_unban(char *name, char *nick) +void ptlink_cmd_unban(char *name, char *nick) { /* Not Supported by this IRCD */ } /* SVSMODE channel modes */ -void anope_cmd_svsmode_chan(char *name, char *mode, char *nick) +void ptlink_cmd_svsmode_chan(char *name, char *mode, char *nick) { /* Not Supported by this IRCD */ } -void anope_cmd_svso(char *source, char *nick, char *flag) +void ptlink_cmd_svso(char *source, char *nick, char *flag) { /* Not Supported by this IRCD */ } @@ -1577,26 +1413,26 @@ void anope_cmd_svso(char *source, char *nick, char *flag) /* SVSMODE +d */ /* sent if svid is something weird */ -void anope_cmd_svid_umode(char *nick, time_t ts) +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 anope_cmd_nc_change(User * u) +void ptlink_cmd_nc_change(User * u) { /* Not Supported by this ircd */ } /* SVSMODE +d */ /* sent if svid is something weird */ -void anope_cmd_svid_umode2(User * u, char *ts) +void ptlink_cmd_svid_umode2(User * u, char *ts) { common_svsmode(u, "+r", NULL); } -void anope_cmd_svid_umode3(User * u, char *ts) +void ptlink_cmd_svid_umode3(User * u, char *ts) { /* Bahamuts have this extra one, since they can check on even nick changes */ } @@ -1608,7 +1444,7 @@ void anope_cmd_svid_umode3(User * u, char *ts) parv[1] = new nick parv[2] = TS (timestamp from user's server when nick changed was received) */ -void anope_cmd_chg_nick(char *oldnick, char *newnick) +void ptlink_cmd_chg_nick(char *oldnick, char *newnick) { if (!oldnick || !newnick) { return; @@ -1624,7 +1460,7 @@ void anope_cmd_chg_nick(char *oldnick, char *newnick) parv[2] = channels list :OperServ SVSJOIN Trystan #Admin */ -void anope_cmd_svsjoin(char *source, char *nick, char *chan) +void ptlink_cmd_svsjoin(char *source, char *nick, char *chan) { send_cmd(source, "SVSJOIN %s %s", nick, chan); } @@ -1636,12 +1472,12 @@ void anope_cmd_svsjoin(char *source, char *nick, char *chan) parv[2] = channels list e.g.: :ChanServ SVSPART mynick 4163321 #Chan1,#Chan2 */ -void anope_cmd_svspart(char *source, char *nick, char *chan) +void ptlink_cmd_svspart(char *source, char *nick, char *chan) { send_cmd(source, "SVSPART %s :%s", nick, chan); } -void anope_cmd_swhois(char *source, char *who, char *mask) +void ptlink_cmd_swhois(char *source, char *who, char *mask) { /* not supported */ } @@ -1676,7 +1512,7 @@ int anope_event_invite(char *source, int ac, char **av) return MOD_CONT; } -int anope_flood_mode_check(char *value) +int ptlink_flood_mode_check(char *value) { char *dp, *end; @@ -1690,25 +1526,25 @@ int anope_flood_mode_check(char *value) } } -void anope_cmd_eob() +void ptlink_cmd_eob() { /* not supported */ } -void anope_cmd_jupe(char *jserver, char *who, char *reason) +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 : ""); - anope_cmd_squit(jserver, rbuf); - anope_cmd_server(jserver, 1, rbuf); + 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 anope_cmd_global_legacy(char *source, char *fmt) +void ptlink_cmd_global_legacy(char *source, char *fmt) { send_cmd(source ? source : ServerName, "GLOBOPS :%s", fmt); } @@ -1717,24 +1553,16 @@ void anope_cmd_global_legacy(char *source, char *fmt) 1 = valid nick 0 = nick is in valid */ -int anope_valid_nick(char *nick) +int ptlink_valid_nick(char *nick) { /* no hard coded invalid nicks */ return 1; } -void anope_cmd_ctcp(char *source, char *dest, const char *fmt, ...) +void ptlink_cmd_ctcp(char *source, char *dest, char *buf) { - va_list args; - char buf[BUFSIZE]; char *s; - *buf = '\0'; - if (fmt) { - va_start(args, fmt); - vsnprintf(buf, BUFSIZE - 1, fmt, args); - va_end(args); - } if (!buf) { return; } else { @@ -1745,4 +1573,119 @@ void anope_cmd_ctcp(char *source, char *dest, const char *fmt, ...) free(s); } -#endif + +/** + * 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_unsqline); + 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_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_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; +} diff --git a/src/protocol/ptlink.h b/src/protocol/ptlink.h new file mode 100644 index 000000000..2ec8f1181 --- /dev/null +++ b/src/protocol/ptlink.h @@ -0,0 +1,149 @@ +/* PTLink IRCD functions + * + * (C) 2003-2005 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 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/rageircd.c b/src/protocol/rageircd.c index b357a408c..399d165b7 100644 --- a/src/rageircd.c +++ b/src/protocol/rageircd.c @@ -13,18 +13,9 @@ #include "services.h" #include "pseudo.h" +#include "rageircd.h" -#ifdef IRC_RAGE2 - -const char version_protocol[] = "RageIRCd 2.0.x"; - -/* Not all ircds use +f for their flood/join throttle system */ -const char flood_mode_char_set[] = ""; /* mode char for FLOOD mode on set */ -const char flood_mode_char_remove[] = ""; /* mode char for FLOOD mode on remove */ -int UseTSMODE = 1; /* Rage beta 6 does not send TSMODE but uses it so we do this to enable it */ - - -IRCDVar ircd[] = { +IRCDVar myIrcd[] = { {"RageIRCd 2.0.*", /* ircd name */ "+d", /* nickserv mode */ "+d", /* chanserv mode */ @@ -85,7 +76,6 @@ IRCDVar ircd[] = { 1, /* UMODE */ 1, /* VHOST ON NICK */ 0, /* Change RealName */ - CHAN_HELP_ULTIMATE3, /* ChanServ extra */ CMODE_p, /* No Knock */ CMODE_A, /* Admin Only */ DEFAULT_MLOCK, /* Default MLOCK */ @@ -112,11 +102,12 @@ IRCDVar ircd[] = { 0, /* p10 */ NULL, /* character set */ 1, /* reports sync state */ - }, + } + , {NULL} }; -IRCDCAPAB ircdcap[] = { +IRCDCAPAB myIrcdcap[] = { { CAPAB_NOQUIT, /* NOQUIT */ CAPAB_TSMODE, /* TSMODE */ @@ -201,7 +192,7 @@ unsigned long umodes[128] = { 0, 0 /* ~ ‚ */ }; -char csmodes[128] = { +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, @@ -223,7 +214,7 @@ char csmodes[128] = { }; -CMMode cmmodes[128] = { +CMMode myCmmodes[128] = { {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, @@ -273,7 +264,7 @@ CMMode cmmodes[128] = { }; -CBMode cbmodes[128] = { +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}, @@ -339,7 +330,7 @@ CBMode cbmodes[128] = { {0}, {0}, {0}, {0} }; -CBModeInfo cbmodeinfos[] = { +CBModeInfo myCbmodeinfos[] = { {'c', CMODE_c, 0, NULL, NULL}, {'i', CMODE_i, 0, NULL, NULL}, {'k', CMODE_k, 0, get_key, cs_get_key}, @@ -359,7 +350,7 @@ CBModeInfo cbmodeinfos[] = { {0} }; -CUMode cumodes[128] = { +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}, @@ -407,7 +398,7 @@ CUMode cumodes[128] = { -void anope_cmd_bot_unban(ChannelInfo * ci, char *nick) +void rageircd_cmd_bot_unban(ChannelInfo * ci, char *nick) { send_cmd(ServerName, "SVSMODE %s -b %s", ci->name, nick); } @@ -600,7 +591,7 @@ int anope_event_burst(char *source, int ac, char **av) return MOD_CONT; } -void anope_cmd_sqline(char *mask, char *reason) +void rageircd_cmd_sqline(char *mask, char *reason) { if (!mask || !reason) { return; @@ -609,56 +600,46 @@ void anope_cmd_sqline(char *mask, char *reason) send_cmd(NULL, "SQLINE %s :%s", mask, reason); } -void anope_cmd_unsgline(char *mask) +void rageircd_cmd_unsgline(char *mask) { send_cmd(NULL, "UNSGLINE 0 :%s", mask); } -void anope_cmd_unszline(char *mask) +void rageircd_cmd_unszline(char *mask) { send_cmd(NULL, "UNSZLINE 0 %s", mask); } -void anope_cmd_szline(char *mask, char *reason, char *whom) +void rageircd_cmd_szline(char *mask, char *reason, char *whom) { send_cmd(NULL, "SZLINE %s :%s", mask, reason); } -void anope_cmd_svsnoop(char *server, int set) +void rageircd_cmd_svsnoop(char *server, int set) { send_cmd(NULL, "SVSNOOP %s %s", server, (set ? "+" : "-")); } -void anope_cmd_svsadmin(char *server, int set) +void rageircd_cmd_svsadmin(char *server, int set) { - anope_cmd_svsnoop(server, set); + rageircd_cmd_svsnoop(server, set); } -void anope_cmd_sgline(char *mask, char *reason) +void rageircd_cmd_sgline(char *mask, char *reason) { send_cmd(NULL, "SGLINE %d :%s:%s", strlen(mask), mask, reason); } -void anope_cmd_remove_akill(char *user, char *host) +void rageircd_cmd_remove_akill(char *user, char *host) { send_cmd(NULL, "RAKILL %s %s", host, user); } /* PART */ -void anope_cmd_part(char *nick, char *chan, const char *fmt, ...) +void rageircd_cmd_part(char *nick, char *chan, char *buf) { - va_list args; - char buf[BUFSIZE]; - *buf = '\0'; - - if (fmt) { - va_start(args, fmt); - vsnprintf(buf, BUFSIZE - 1, fmt, args); - va_end(args); - } - if (!nick || !chan) { return; } @@ -670,26 +651,20 @@ void anope_cmd_part(char *nick, char *chan, const char *fmt, ...) } } -void anope_cmd_topic(char *whosets, char *chan, char *whosetit, - char *topic, time_t when) +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 anope_cmd_vhost_off(User * u) +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 anope_cmd_vhost_on(char *nick, char *vIdent, char *vhost) -{ - send_cmd(s_HostServ, "SVSMODE %s +x", nick); - anope_cmd_chghost(nick, vhost); -} - -void anope_cmd_chghost(char *nick, char *vhost) +void rageircd_cmd_chghost(char *nick, char *vhost) { if (!nick || !vhost) { return; @@ -697,34 +672,31 @@ void anope_cmd_chghost(char *nick, char *vhost) send_cmd(ServerName, "VHOST %s %s", nick, vhost); } -void anope_cmd_unsqline(char *user) +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 anope_cmd_join(char *user, char *channel, time_t chantime) +void rageircd_cmd_join(char *user, char *channel, time_t chantime) { send_cmd(user, "SJOIN %ld %s", (long int) chantime, channel); } -void anope_cmd_akill(char *user, char *host, char *who, time_t when, - time_t expires, char *reason) +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 anope_cmd_svskill(char *source, char *user, const char *fmt, ...) +void rageircd_cmd_svskill(char *source, char *user, char *buf) { - 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; } @@ -736,25 +708,52 @@ void anope_cmd_svskill(char *source, char *user, const char *fmt, ...) send_cmd(source, "SVSKILL %s :%s", user, buf); } -void anope_cmd_svsmode(User * u, int ac, char **av) +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 anope_cmd_squit(char *servname, char *message) +void rageircd_cmd_squit(char *servname, char *message) { send_cmd(NULL, "SQUIT %s :%s", servname, message); } /* PONG */ -void anope_cmd_pong(char *servname, char *who) +void rageircd_cmd_pong(char *servname, char *who) { send_cmd(servname, "PONG %s", who); } -void anope_cmd_connect(int servernum) +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, ServerDesc); +} + +/* 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 = @@ -765,37 +764,21 @@ void anope_cmd_connect(int servernum) } if (servernum == 1) - anope_cmd_pass(RemotePassword); + rageircd_cmd_pass(RemotePassword); else if (servernum == 2) - anope_cmd_pass(RemotePassword2); + rageircd_cmd_pass(RemotePassword2); else if (servernum == 3) - anope_cmd_pass(RemotePassword3); - anope_cmd_capab(); + rageircd_cmd_pass(RemotePassword3); + rageircd_cmd_capab(); if (Numeric) { send_cmd(NULL, "MYID !%s", Numeric); } - anope_cmd_server(ServerName, 1, ServerDesc); - anope_cmd_svinfo(); - anope_cmd_burst(); -} - -void anope_cmd_svinfo() -{ - send_cmd(NULL, "SVINFO 5 3 0 %ld bluemoon 0", (long int) time(NULL)); -} - -void anope_cmd_capab() -{ - /* CAPAB BURST UNCONNECT ZIP SSJ3 SN2 VHOST SUID TOK1 TSMODE */ - send_cmd(NULL, "CAPAB BURST UNCONNECT SSJ3 SN2 VHOST TSMODE"); -} - -void anope_cmd_server(char *servname, int hop, char *descript) -{ - send_cmd(NULL, "SERVER %s %d :%s", servname, hop, ServerDesc); + rageircd_cmd_server(ServerName, 1, ServerDesc); + rageircd_cmd_svinfo(); + rageircd_cmd_burst(); } -void anope_set_umode(User * user, int ac, char **av) +void rageircd_set_umode(User * user, int ac, char **av) { int add = 1; /* 1 if adding modes, 0 if deleting */ char *modes = av[0]; @@ -860,17 +843,8 @@ void anope_set_umode(User * user, int ac, char **av) } /* GLOBOPS */ -void anope_cmd_global(char *source, const char *fmt, ...) +void rageircd_cmd_global(char *source, char *buf) { - 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; } @@ -878,17 +852,8 @@ void anope_cmd_global(char *source, const char *fmt, ...) send_cmd(source ? source : ServerName, "GLOBOPS :%s", buf); } -void anope_cmd_notice_ops(char *source, char *dest, const char *fmt, ...) +void rageircd_cmd_notice_ops(char *source, char *dest, char *buf) { - 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; } @@ -897,44 +862,26 @@ void anope_cmd_notice_ops(char *source, char *dest, const char *fmt, ...) } -void anope_cmd_notice(char *source, char *dest, const char *fmt, ...) +void rageircd_cmd_notice(char *source, char *dest, char *buf) { - 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; } if (UsePrivmsg) { - anope_cmd_privmsg2(source, dest, buf); + rageircd_cmd_privmsg2(source, dest, buf); } else { send_cmd(source, "NOTICE %s :%s", dest, buf); } } -void anope_cmd_notice2(char *source, char *dest, char *msg) +void rageircd_cmd_notice2(char *source, char *dest, char *msg) { send_cmd(source, "NOTICE %s :%s", dest, msg); } -void anope_cmd_privmsg(char *source, char *dest, const char *fmt, ...) +void rageircd_cmd_privmsg(char *source, char *dest, char *buf) { - 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; } @@ -942,17 +889,17 @@ void anope_cmd_privmsg(char *source, char *dest, const char *fmt, ...) send_cmd(source, "PRIVMSG %s :%s", dest, buf); } -void anope_cmd_privmsg2(char *source, char *dest, char *msg) +void rageircd_cmd_privmsg2(char *source, char *dest, char *msg) { send_cmd(source, "PRIVMSG %s :%s", dest, msg); } -void anope_cmd_serv_notice(char *source, char *dest, char *msg) +void rageircd_cmd_serv_notice(char *source, char *dest, char *msg) { send_cmd(source, "NOTICE $%s :%s", dest, msg); } -void anope_cmd_serv_privmsg(char *source, char *dest, char *msg) +void rageircd_cmd_serv_privmsg(char *source, char *dest, char *msg) { send_cmd(source, "PRIVMSG $%s :%s", dest, msg); } @@ -974,28 +921,19 @@ int anope_event_ping(char *source, int ac, char **av) { if (ac < 1) return MOD_CONT; - anope_cmd_pong(ac > 1 ? av[1] : ServerName, av[0]); + rageircd_cmd_pong(ac > 1 ? av[1] : ServerName, av[0]); return MOD_CONT; } -void anope_cmd_351(char *source) +void rageircd_cmd_351(char *source) { send_cmd(ServerName, "351 %s Anope-%s %s :%s - %s -- %s", source, version_number, ServerName, ircd->name, version_flags, version_build); } -void anope_cmd_mode(char *source, char *dest, const char *fmt, ...) +void rageircd_cmd_mode(char *source, char *dest, char *buf) { - 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; } @@ -1012,19 +950,8 @@ void anope_cmd_mode(char *source, char *dest, const char *fmt, ...) } -void anope_cmd_kick(char *source, char *chan, char *user, const char *fmt, - ...) +void rageircd_cmd_kick(char *source, char *chan, char *user, char *buf) { - 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) { send_cmd(source, "KICK %s %s :%s", chan, user, buf); } else { @@ -1032,30 +959,30 @@ void anope_cmd_kick(char *source, char *chan, char *user, const char *fmt, } } -void anope_cmd_372(char *source, char *msg) +void rageircd_cmd_372(char *source, char *msg) { send_cmd(ServerName, "372 %s :- %s", source, msg); } -void anope_cmd_372_error(char *source) +void rageircd_cmd_372_error(char *source) { send_cmd(ServerName, "422 %s :- MOTD file not found! Please " "contact your IRC administrator.", source); } -void anope_cmd_375(char *source) +void rageircd_cmd_375(char *source) { send_cmd(ServerName, "375 %s :- %s Message of the Day", source, ServerName); } -void anope_cmd_376(char *source) +void rageircd_cmd_376(char *source) { send_cmd(ServerName, "376 %s :End of /MOTD command.", source); } /* INVITE */ -void anope_cmd_invite(char *source, char *chan, char *nick) +void rageircd_cmd_invite(char *source, char *chan, char *nick) { if (!source || !chan || !nick) { return; @@ -1065,7 +992,7 @@ void anope_cmd_invite(char *source, char *chan, char *nick) } /* 391 */ -void anope_cmd_391(char *source, char *timestr) +void rageircd_cmd_391(char *source, char *timestr) { if (!timestr) { return; @@ -1074,17 +1001,8 @@ void anope_cmd_391(char *source, char *timestr) } /* 250 */ -void anope_cmd_250(const char *fmt, ...) +void rageircd_cmd_250(char *buf) { - 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; } @@ -1093,17 +1011,8 @@ void anope_cmd_250(const char *fmt, ...) } /* 307 */ -void anope_cmd_307(const char *fmt, ...) +void rageircd_cmd_307(char *buf) { - 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; } @@ -1112,17 +1021,8 @@ void anope_cmd_307(const char *fmt, ...) } /* 311 */ -void anope_cmd_311(const char *fmt, ...) +void rageircd_cmd_311(char *buf) { - 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; } @@ -1131,17 +1031,8 @@ void anope_cmd_311(const char *fmt, ...) } /* 312 */ -void anope_cmd_312(const char *fmt, ...) +void rageircd_cmd_312(char *buf) { - 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; } @@ -1150,17 +1041,8 @@ void anope_cmd_312(const char *fmt, ...) } /* 317 */ -void anope_cmd_317(const char *fmt, ...) +void rageircd_cmd_317(char *buf) { - 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; } @@ -1169,7 +1051,7 @@ void anope_cmd_317(const char *fmt, ...) } /* 219 */ -void anope_cmd_219(char *source, char *letter) +void rageircd_cmd_219(char *source, char *letter) { if (!source) { return; @@ -1184,7 +1066,7 @@ void anope_cmd_219(char *source, char *letter) } /* 401 */ -void anope_cmd_401(char *source, char *who) +void rageircd_cmd_401(char *source, char *who) { if (!source || !who) { return; @@ -1193,7 +1075,7 @@ void anope_cmd_401(char *source, char *who) } /* 318 */ -void anope_cmd_318(char *source, char *who) +void rageircd_cmd_318(char *source, char *who) { if (!source || !who) { return; @@ -1203,17 +1085,8 @@ void anope_cmd_318(char *source, char *who) } /* 242 */ -void anope_cmd_242(const char *fmt, ...) +void rageircd_cmd_242(char *buf) { - 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; } @@ -1222,17 +1095,8 @@ void anope_cmd_242(const char *fmt, ...) } /* 243 */ -void anope_cmd_243(const char *fmt, ...) +void rageircd_cmd_243(char *buf) { - 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; } @@ -1241,17 +1105,8 @@ void anope_cmd_243(const char *fmt, ...) } /* 211 */ -void anope_cmd_211(const char *fmt, ...) +void rageircd_cmd_211(char *buf) { - 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; } @@ -1259,13 +1114,13 @@ void anope_cmd_211(const char *fmt, ...) send_cmd(NULL, "211 %s ", buf); } -void anope_cmd_nick(char *nick, char *name, char *modes) +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); - anope_cmd_sqline(nick, "Reserved for services"); + rageircd_cmd_sqline(nick, "Reserved for services"); } /* EVENT : OS */ @@ -1314,18 +1169,8 @@ int anope_event_cs(char *source, int ac, char **av) } /* QUIT */ -void anope_cmd_quit(char *source, const char *fmt, ...) +void rageircd_cmd_quit(char *source, char *buf) { - 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) { send_cmd(source, "QUIT :%s", buf); } else { @@ -1333,25 +1178,25 @@ void anope_cmd_quit(char *source, const char *fmt, ...) } } -void anope_cmd_bot_nick(char *nick, char *user, char *host, char *real, - char *modes) +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); - anope_cmd_sqline(nick, "Reserved for services"); + rageircd_cmd_sqline(nick, "Reserved for services"); } /* SVSMODE -b */ -void anope_cmd_unban(char *name, char *nick) +void rageircd_cmd_unban(char *name, char *nick) { - anope_cmd_svsmode_chan(name, "-b", nick); + rageircd_cmd_svsmode_chan(name, "-b", nick); } /* SVSMODE channel modes */ -void anope_cmd_svsmode_chan(char *name, char *mode, char *nick) +void rageircd_cmd_svsmode_chan(char *name, char *mode, char *nick) { if (nick) { send_cmd(ServerName, "SVSMODE %s %s %s", name, mode, nick); @@ -1360,7 +1205,7 @@ void anope_cmd_svsmode_chan(char *name, char *mode, char *nick) } } -void anope_cmd_bot_chan_mode(char *nick, char *chan) +void rageircd_cmd_bot_chan_mode(char *nick, char *chan) { anope_cmd_mode(nick, chan, "%s %s", ircd->botchanumode, nick); } @@ -1480,26 +1325,20 @@ int anope_event_motd(char *source, int ac, char **av) return MOD_CONT; } -/* PASS */ -void anope_cmd_pass(char *pass) -{ - send_cmd(NULL, "PASS %s :TS", pass); -} - /* SVSHOLD - set */ -void anope_cmd_svshold(char *nick) +void rageircd_cmd_svshold(char *nick) { send_cmd(ServerName, "SVSHOLD %s %d :%s", nick, NSReleaseTimeout, "Being held for registered user"); } /* SVSHOLD - release */ -void anope_cmd_release_svshold(char *nick) +void rageircd_cmd_release_svshold(char *nick) { send_cmd(ServerName, "SVSHOLD %s 0", nick); } -void anope_cmd_svsnick(char *source, char *guest, time_t when) +void rageircd_cmd_svsnick(char *source, char *guest, time_t when) { if (!source || !guest) { return; @@ -1507,15 +1346,15 @@ void anope_cmd_svsnick(char *source, char *guest, time_t when) send_cmd(NULL, "SVSNICK %s %s :%ld", source, guest, (long int) when); } -void anope_cmd_guest_nick(char *nick, char *user, char *host, char *real, - char *modes) +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 anope_cmd_svso(char *source, char *nick, char *flag) +void rageircd_cmd_svso(char *source, char *nick, char *flag) { /* Not Supported by this IRCD */ } @@ -1523,7 +1362,7 @@ void anope_cmd_svso(char *source, char *nick, char *flag) /* SVSMODE +d */ /* sent if svid is something weird */ -void anope_cmd_svid_umode(char *nick, time_t ts) +void rageircd_cmd_svid_umode(char *nick, time_t ts) { send_cmd(ServerName, "SVSMODE %s %lu +d 1", nick, (unsigned long int) ts); @@ -1531,18 +1370,18 @@ void anope_cmd_svid_umode(char *nick, time_t ts) /* SVSMODE +d */ /* nc_change was = 1, and there is no na->status */ -void anope_cmd_nc_change(User * u) +void rageircd_cmd_nc_change(User * u) { common_svsmode(u, "+d", "1"); } /* SVSMODE +d */ -void anope_cmd_svid_umode2(User * u, char *ts) +void rageircd_cmd_svid_umode2(User * u, char *ts) { /* not used by bahamut ircds */ } -void anope_cmd_svid_umode3(User * u, char *ts) +void rageircd_cmd_svid_umode3(User * u, char *ts) { if (u->svid != u->timestamp) { common_svsmode(u, "+rd", ts); @@ -1552,7 +1391,7 @@ void anope_cmd_svid_umode3(User * u, char *ts) } /* NICK <newnick> */ -void anope_cmd_chg_nick(char *oldnick, char *newnick) +void rageircd_cmd_chg_nick(char *oldnick, char *newnick) { if (!oldnick || !newnick) { return; @@ -1612,17 +1451,17 @@ int anope_event_sqline(char *source, int ac, char **av) return MOD_CONT; } -void anope_cmd_svsjoin(char *source, char *nick, char *chan) +void rageircd_cmd_svsjoin(char *source, char *nick, char *chan) { /* Find no reference to it in the code and docs */ } -void anope_cmd_svspart(char *source, char *nick, char *chan) +void rageircd_cmd_svspart(char *source, char *nick, char *chan) { /* Find no reference to it in the code and docs */ } -void anope_cmd_swhois(char *source, char *who, char *mask) +void rageircd_cmd_swhois(char *source, char *who, char *mask) { /* not supported */ } @@ -1647,35 +1486,30 @@ int anope_event_globops(char *source, int ac, char **av) return MOD_CONT; } -int anope_flood_mode_check(char *value) +int rageircd_flood_mode_check(char *value) { return 0; } -void anope_cmd_burst() -{ - send_cmd(NULL, "BURST"); -} - -void anope_cmd_eob() +void rageircd_cmd_eob() { send_cmd(NULL, "BURST 0"); } -void anope_cmd_jupe(char *jserver, char *who, char *reason) +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 : ""); - anope_cmd_squit(jserver, rbuf); - anope_cmd_server(jserver, 2, rbuf); + 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 anope_cmd_global_legacy(char *source, char *fmt) +void rageircd_cmd_global_legacy(char *source, char *fmt) { send_cmd(source ? source : ServerName, "GLOBOPS :%s", fmt); } @@ -1684,24 +1518,16 @@ void anope_cmd_global_legacy(char *source, char *fmt) 1 = valid nick 0 = nick is in valid */ -int anope_valid_nick(char *nick) +int rageircd_valid_nick(char *nick) { /* no hard coded invalid nicks */ return 1; } -void anope_cmd_ctcp(char *source, char *dest, const char *fmt, ...) +void rageircd_cmd_ctcp(char *source, char *dest, char *buf) { - va_list args; - char buf[BUFSIZE]; char *s; - *buf = '\0'; - if (fmt) { - va_start(args, fmt); - vsnprintf(buf, BUFSIZE - 1, fmt, args); - va_end(args); - } if (!buf) { return; } else { @@ -1712,4 +1538,118 @@ void anope_cmd_ctcp(char *source, char *dest, const char *fmt, ...) free(s); } -#endif + +/** + * 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_unsqline); + 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_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_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; +} diff --git a/src/protocol/rageircd.h b/src/protocol/rageircd.h new file mode 100644 index 000000000..4381950f2 --- /dev/null +++ b/src/protocol/rageircd.h @@ -0,0 +1,113 @@ +/* Rage IRCD functions + * + * (C) 2003-2005 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/ratbox.c b/src/protocol/ratbox.c index f2b329e4a..8059ae1fe 100644 --- a/src/ratbox.c +++ b/src/protocol/ratbox.c @@ -13,19 +13,11 @@ #include "services.h" #include "pseudo.h" - -#ifdef IRC_RATBOX - -const char version_protocol[] = "Ratbox IRCD 2.0+"; - -/* Not all ircds use +f for their flood/join throttle system */ -const char flood_mode_char_set[] = ""; /* mode char for FLOOD mode on set */ -const char flood_mode_char_remove[] = ""; /* mode char for FLOOD mode on remove */ -int UseTSMODE = 0; +#include "ratbox.h" int ts6nickcount = 0; -IRCDVar ircd[] = { +IRCDVar myIrcd[] = { {"Ratbox 2.0+", /* ircd name */ "+oi", /* nickserv mode */ "+oi", /* chanserv mode */ @@ -86,7 +78,6 @@ IRCDVar ircd[] = { 0, /* O:LINE */ 0, /* VHOST ON NICK */ 0, /* Change RealName */ - 0, /* ChanServ extra */ CMODE_p, /* No Knock */ 0, /* Admin Only */ DEFAULT_MLOCK, /* Default MLOCK */ @@ -118,7 +109,7 @@ IRCDVar ircd[] = { {NULL} }; -IRCDCAPAB ircdcap[] = { +IRCDCAPAB myIrcdcap[] = { { 0, /* NOQUIT */ 0, /* TSMODE */ @@ -151,7 +142,7 @@ IRCDCAPAB ircdcap[] = { 0, 0, 0} }; -void anope_set_umode(User * user, int ac, char **av) +void ratbox_set_umode(User * user, int ac, char **av) { int add = 1; /* 1 if adding modes, 0 if deleting */ char *modes = av[0]; @@ -244,7 +235,7 @@ unsigned long umodes[128] = { }; -char csmodes[128] = { +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, @@ -265,7 +256,7 @@ char csmodes[128] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -CMMode cmmodes[128] = { +CMMode myCmmodes[128] = { {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, @@ -315,7 +306,7 @@ CMMode cmmodes[128] = { }; -CBMode cbmodes[128] = { +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}, @@ -381,7 +372,7 @@ CBMode cbmodes[128] = { {0}, {0}, {0}, {0} }; -CBModeInfo cbmodeinfos[] = { +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}, @@ -394,7 +385,7 @@ CBModeInfo cbmodeinfos[] = { }; -CUMode cumodes[128] = { +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}, @@ -443,26 +434,17 @@ CUMode cumodes[128] = { -void anope_cmd_notice(char *source, char *dest, const char *fmt, ...) +void ratbox_cmd_notice(char *source, char *dest, char *buf) { - va_list args; - char buf[BUFSIZE]; Uid *ud; User *u; - *buf = '\0'; - - if (fmt) { - va_start(args, fmt); - vsnprintf(buf, BUFSIZE - 1, fmt, args); - va_end(args); - } if (!buf) { return; } if (UsePrivmsg) { - anope_cmd_privmsg2(source, dest, buf); + ratbox_cmd_privmsg2(source, dest, buf); } else { ud = find_uid(source); u = finduser(dest); @@ -472,7 +454,7 @@ void anope_cmd_notice(char *source, char *dest, const char *fmt, ...) } } -void anope_cmd_notice2(char *source, char *dest, char *msg) +void ratbox_cmd_notice2(char *source, char *dest, char *msg) { Uid *ud; User *u; @@ -483,19 +465,10 @@ void anope_cmd_notice2(char *source, char *dest, char *msg) (UseTS6 ? (u ? u->uid : dest) : dest), msg); } -void anope_cmd_privmsg(char *source, char *dest, const char *fmt, ...) +void ratbox_cmd_privmsg(char *source, char *dest, char *buf) { - va_list args; - char buf[BUFSIZE]; Uid *ud, *ud2; - *buf = '\0'; - - if (fmt) { - va_start(args, fmt); - vsnprintf(buf, BUFSIZE - 1, fmt, args); - va_end(args); - } if (!buf) { return; } @@ -506,7 +479,7 @@ void anope_cmd_privmsg(char *source, char *dest, const char *fmt, ...) (UseTS6 ? (ud2 ? ud2->uid : dest) : dest), buf); } -void anope_cmd_privmsg2(char *source, char *dest, char *msg) +void ratbox_cmd_privmsg2(char *source, char *dest, char *msg) { Uid *ud, *ud2; @@ -517,29 +490,21 @@ void anope_cmd_privmsg2(char *source, char *dest, char *msg) (UseTS6 ? (ud2 ? ud2->uid : dest) : dest), msg); } -void anope_cmd_serv_notice(char *source, char *dest, char *msg) +void ratbox_cmd_serv_notice(char *source, char *dest, char *msg) { send_cmd(source, "NOTICE $$%s :%s", dest, msg); } -void anope_cmd_serv_privmsg(char *source, char *dest, char *msg) +void ratbox_cmd_serv_privmsg(char *source, char *dest, char *msg) { send_cmd(source, "PRIVMSG $$%s :%s", dest, msg); } -void anope_cmd_global(char *source, const char *fmt, ...) +void ratbox_cmd_global(char *source, char *buf) { - va_list args; - char buf[BUFSIZE]; Uid *u; - *buf = '\0'; - if (fmt) { - va_start(args, fmt); - vsnprintf(buf, BUFSIZE - 1, fmt, args); - va_end(args); - } if (!buf) { return; } @@ -557,7 +522,7 @@ void anope_cmd_global(char *source, const char *fmt, ...) } /* GLOBOPS - to handle old WALLOPS */ -void anope_cmd_global_legacy(char *source, char *fmt) +void ratbox_cmd_global_legacy(char *source, char *fmt) { Uid *u; @@ -782,42 +747,42 @@ void moduleAddIRCDMsgs(void) /* *INDENT-ON* */ -void anope_cmd_sqline(char *mask, char *reason) +void ratbox_cmd_sqline(char *mask, char *reason) { send_cmd(NULL, "RESV * %s :%s", mask, reason); } -void anope_cmd_unsgline(char *mask) +void ratbox_cmd_unsgline(char *mask) { /* Does not support */ } -void anope_cmd_unszline(char *mask) +void ratbox_cmd_unszline(char *mask) { /* Does not support */ } -void anope_cmd_szline(char *mask, char *reason, char *whom) +void ratbox_cmd_szline(char *mask, char *reason, char *whom) { /* Does not support */ } -void anope_cmd_svsnoop(char *server, int set) +void ratbox_cmd_svsnoop(char *server, int set) { /* does not support */ } -void anope_cmd_svsadmin(char *server, int set) +void ratbox_cmd_svsadmin(char *server, int set) { - anope_cmd_svsnoop(server, set); + ratbox_cmd_svsnoop(server, set); } -void anope_cmd_sgline(char *mask, char *reason) +void ratbox_cmd_sgline(char *mask, char *reason) { /* does not support */ } -void anope_cmd_remove_akill(char *user, char *host) +void ratbox_cmd_remove_akill(char *user, char *host) { Uid *ud; @@ -826,8 +791,8 @@ void anope_cmd_remove_akill(char *user, char *host) "UNKLINE * %s %s", user, host); } -void anope_cmd_topic(char *whosets, char *chan, char *whosetit, - char *topic, time_t when) +void ratbox_cmd_topic(char *whosets, char *chan, char *whosetit, + char *topic, time_t when) { Uid *ud; @@ -836,22 +801,22 @@ void anope_cmd_topic(char *whosets, char *chan, char *whosetit, chan, topic); } -void anope_cmd_vhost_off(User * u) +void ratbox_cmd_vhost_off(User * u) { /* not supported */ } -void anope_cmd_vhost_on(char *nick, char *vIdent, char *vhost) +void ratbox_cmd_vhost_on(char *nick, char *vIdent, char *vhost) { /* not supported */ } -void anope_cmd_unsqline(char *user) +void ratbox_cmd_unsqline(char *user) { send_cmd(NULL, "UNRESV * %s", user); } -void anope_cmd_join(char *user, char *channel, time_t chantime) +void ratbox_cmd_join(char *user, char *channel, time_t chantime) { Uid *ud; @@ -869,8 +834,8 @@ host: the 'host' portion of the kline reason: the reason for the kline. */ -void anope_cmd_akill(char *user, char *host, char *who, time_t when, - time_t expires, char *reason) +void ratbox_cmd_akill(char *user, char *host, char *who, time_t when, + time_t expires, char *reason) { Uid *ud; @@ -881,19 +846,10 @@ void anope_cmd_akill(char *user, char *host, char *who, time_t when, (long int) (expires - (long) time(NULL)), user, host, reason); } -void anope_cmd_svskill(char *source, char *user, const char *fmt, ...) +void ratbox_cmd_svskill(char *source, char *user, char *buf) { - va_list args; - char buf[BUFSIZE]; Uid *ud, *ud2; - *buf = '\0'; - - if (fmt) { - va_start(args, fmt); - vsnprintf(buf, BUFSIZE - 1, fmt, args); - va_end(args); - } if (!buf) { return; } @@ -908,39 +864,12 @@ void anope_cmd_svskill(char *source, char *user, const char *fmt, ...) (UseTS6 ? (ud2 ? ud2->uid : user) : user), buf); } -void anope_cmd_svsmode(User * u, int ac, char **av) +void ratbox_cmd_svsmode(User * u, int ac, char **av) { send_cmd((UseTS6 ? TS6SID : ServerName), "SVSMODE %s %s", u->nick, av[0]); } -void anope_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) - anope_cmd_pass(RemotePassword); - else if (servernum == 2) - anope_cmd_pass(RemotePassword2); - else if (servernum == 3) - anope_cmd_pass(RemotePassword3); - - anope_cmd_capab(); - anope_cmd_server(ServerName, 1, ServerDesc); - anope_cmd_svinfo(); -} - -void anope_cmd_svsinfo() -{ - /* not used */ -} - /* * SVINFO * parv[0] = sender prefix @@ -949,11 +878,16 @@ void anope_cmd_svsinfo() * parv[3] = server is standalone or connected to non-TS only * parv[4] = server's idea of UTC time */ -void anope_cmd_svinfo() +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 @@ -973,14 +907,14 @@ void anope_cmd_svinfo() PARA - supports invite broadcasting for +p ENCAP - ? */ -void anope_cmd_capab() +void ratbox_cmd_capab() { send_cmd(NULL, "CAPAB :QS EX CHW IE KLN GLN KNOCK TB UNKLN CLUSTER ENCAP"); } /* PASS */ -void anope_cmd_pass(char *pass) +void ratbox_cmd_pass(char *pass) { if (UseTS6) { send_cmd(NULL, "PASS %s TS 6 :%s", pass, TS6SID); @@ -990,13 +924,35 @@ void anope_cmd_pass(char *pass) } /* SERVER name hop descript */ -void anope_cmd_server(char *servname, int hop, char *descript) +void ratbox_cmd_server(char *servname, int hop, char *descript) { send_cmd(NULL, "SERVER %s %d :%s", servname, hop, descript); } -void anope_cmd_bot_nick(char *nick, char *user, char *host, char *real, - char *modes) +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) { char nicknumbuf[10]; EnforceQlinedNick(nick, NULL); @@ -1013,23 +969,13 @@ void anope_cmd_bot_nick(char *nick, char *user, char *host, char *real, (long int) time(NULL), modes, user, host, ServerName, real); } - anope_cmd_sqline(nick, "Reserved for services"); + ratbox_cmd_sqline(nick, "Reserved for services"); } -void anope_cmd_part(char *nick, char *chan, const char *fmt, ...) +void ratbox_cmd_part(char *nick, char *chan, char *buf) { - va_list args; - char buf[BUFSIZE]; Uid *ud; - *buf = '\0'; - - if (fmt) { - va_start(args, fmt); - vsnprintf(buf, BUFSIZE - 1, fmt, args); - va_end(args); - } - ud = find_uid(nick); if (buf) { @@ -1043,7 +989,7 @@ int anope_event_ping(char *source, int ac, char **av) { if (ac < 1) return MOD_CONT; - anope_cmd_pong(ac > 1 ? av[1] : ServerName, av[0]); + ratbox_cmd_pong(ac > 1 ? av[1] : ServerName, av[0]); return MOD_CONT; } @@ -1080,7 +1026,7 @@ int anope_event_kick(char *source, int ac, char **av) return MOD_CONT; } -void anope_cmd_eob() +void ratbox_cmd_eob() { /* doesn't support EOB */ } @@ -1197,32 +1143,32 @@ int anope_event_quit(char *source, int ac, char **av) return MOD_CONT; } -void anope_cmd_372(char *source, char *msg) +void ratbox_cmd_372(char *source, char *msg) { send_cmd((UseTS6 ? TS6SID : ServerName), "372 %s :- %s", source, msg); } -void anope_cmd_372_error(char *source) +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 anope_cmd_375(char *source) +void ratbox_cmd_375(char *source) { send_cmd((UseTS6 ? TS6SID : ServerName), "375 %s :- %s Message of the Day", source, ServerName); } -void anope_cmd_376(char *source) +void ratbox_cmd_376(char *source) { send_cmd((UseTS6 ? TS6SID : ServerName), "376 %s :End of /MOTD command.", source); } /* 391 */ -void anope_cmd_391(char *source, char *timestr) +void ratbox_cmd_391(char *source, char *timestr) { if (!timestr) { return; @@ -1231,17 +1177,8 @@ void anope_cmd_391(char *source, char *timestr) } /* 250 */ -void anope_cmd_250(const char *fmt, ...) +void ratbox_cmd_250(char *buf) { - 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; } @@ -1250,17 +1187,8 @@ void anope_cmd_250(const char *fmt, ...) } /* 307 */ -void anope_cmd_307(const char *fmt, ...) +void ratbox_cmd_307(char *buf) { - 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; } @@ -1269,17 +1197,8 @@ void anope_cmd_307(const char *fmt, ...) } /* 311 */ -void anope_cmd_311(const char *fmt, ...) +void ratbox_cmd_311(char *buf) { - 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; } @@ -1288,17 +1207,8 @@ void anope_cmd_311(const char *fmt, ...) } /* 312 */ -void anope_cmd_312(const char *fmt, ...) +void ratbox_cmd_312(char *buf) { - 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; } @@ -1307,17 +1217,8 @@ void anope_cmd_312(const char *fmt, ...) } /* 317 */ -void anope_cmd_317(const char *fmt, ...) +void ratbox_cmd_317(char *buf) { - 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; } @@ -1326,7 +1227,7 @@ void anope_cmd_317(const char *fmt, ...) } /* 219 */ -void anope_cmd_219(char *source, char *letter) +void ratbox_cmd_219(char *source, char *letter) { if (!source) { return; @@ -1341,7 +1242,7 @@ void anope_cmd_219(char *source, char *letter) } /* 401 */ -void anope_cmd_401(char *source, char *who) +void ratbox_cmd_401(char *source, char *who) { if (!source || !who) { return; @@ -1351,7 +1252,7 @@ void anope_cmd_401(char *source, char *who) } /* 318 */ -void anope_cmd_318(char *source, char *who) +void ratbox_cmd_318(char *source, char *who) { if (!source || !who) { return; @@ -1362,17 +1263,8 @@ void anope_cmd_318(char *source, char *who) } /* 242 */ -void anope_cmd_242(const char *fmt, ...) +void ratbox_cmd_242(char *buf) { - 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; } @@ -1381,17 +1273,8 @@ void anope_cmd_242(const char *fmt, ...) } /* 243 */ -void anope_cmd_243(const char *fmt, ...) +void ratbox_cmd_243(char *buf) { - 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; } @@ -1400,17 +1283,8 @@ void anope_cmd_243(const char *fmt, ...) } /* 211 */ -void anope_cmd_211(const char *fmt, ...) +void ratbox_cmd_211(char *buf) { - 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; } @@ -1418,18 +1292,9 @@ void anope_cmd_211(const char *fmt, ...) send_cmd(NULL, "211 %s ", buf); } -void anope_cmd_mode(char *source, char *dest, const char *fmt, ...) +void ratbox_cmd_mode(char *source, char *dest, char *buf) { - va_list args; - char buf[BUFSIZE]; Uid *ud; - *buf = '\0'; - - if (fmt) { - va_start(args, fmt); - vsnprintf(buf, BUFSIZE - 1, fmt, args); - va_end(args); - } if (!buf) { return; } @@ -1443,7 +1308,7 @@ void anope_cmd_mode(char *source, char *dest, const char *fmt, ...) } } -void anope_cmd_tmode(char *source, char *dest, const char *fmt, ...) +void ratbox_cmd_tmode(char *source, char *dest, const char *fmt, ...) { va_list args; char buf[BUFSIZE]; @@ -1461,7 +1326,7 @@ void anope_cmd_tmode(char *source, char *dest, const char *fmt, ...) send_cmd(NULL, "MODE %s %s", dest, buf); } -void anope_cmd_nick(char *nick, char *name, char *mode) +void ratbox_cmd_nick(char *nick, char *name, char *mode) { char nicknumbuf[10]; EnforceQlinedNick(nick, NULL); @@ -1478,24 +1343,13 @@ void anope_cmd_nick(char *nick, char *name, char *mode) (long int) time(NULL), mode, ServiceUser, ServiceHost, ServerName, name); } - anope_cmd_sqline(nick, "Reserved for services"); + ratbox_cmd_sqline(nick, "Reserved for services"); } -void anope_cmd_kick(char *source, char *chan, char *user, const char *fmt, - ...) +void ratbox_cmd_kick(char *source, char *chan, char *user, char *buf) { - va_list args; - char buf[BUFSIZE]; Uid *ud; User *u; - *buf = '\0'; - - - if (fmt) { - va_start(args, fmt); - vsnprintf(buf, BUFSIZE - 1, fmt, args); - va_end(args); - } ud = find_uid(source); u = finduser(user); @@ -1510,17 +1364,8 @@ void anope_cmd_kick(char *source, char *chan, char *user, const char *fmt, } } -void anope_cmd_notice_ops(char *source, char *dest, const char *fmt, ...) +void ratbox_cmd_notice_ops(char *source, char *dest, char *buf) { - 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; } @@ -1528,34 +1373,23 @@ void anope_cmd_notice_ops(char *source, char *dest, const char *fmt, ...) send_cmd(NULL, "NOTICE @%s :%s", dest, buf); } -void anope_cmd_bot_chan_mode(char *nick, char *chan) +void ratbox_cmd_bot_chan_mode(char *nick, char *chan) { Uid *u; if (UseTS6) { u = find_uid(nick); - anope_cmd_tmode(nick, chan, "%s %s", ircd->botchanumode, - (u ? u->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 anope_cmd_quit(char *source, const char *fmt, ...) +void ratbox_cmd_quit(char *source, char *buf) { - va_list args; - char buf[BUFSIZE]; Uid *ud; - - *buf = '\0'; - - if (fmt) { - va_start(args, fmt); - vsnprintf(buf, BUFSIZE - 1, fmt, args); - va_end(args); - } - ud = find_uid(source); if (buf) { @@ -1567,7 +1401,7 @@ void anope_cmd_quit(char *source, const char *fmt, ...) } /* PONG */ -void anope_cmd_pong(char *servname, char *who) +void ratbox_cmd_pong(char *servname, char *who) { if (UseTS6) { send_cmd(TS6SID, "PONG %s", who); @@ -1577,7 +1411,7 @@ void anope_cmd_pong(char *servname, char *who) } /* INVITE */ -void anope_cmd_invite(char *source, char *chan, char *nick) +void ratbox_cmd_invite(char *source, char *chan, char *nick) { Uid *ud; User *u; @@ -1594,7 +1428,7 @@ void anope_cmd_invite(char *source, char *chan, char *nick) } /* SQUIT */ -void anope_cmd_squit(char *servname, char *message) +void ratbox_cmd_squit(char *servname, char *message) { if (!servname || !message) { return; @@ -1634,7 +1468,7 @@ int anope_event_tmode(char *source, int ac, char **av) return MOD_CONT; } -void anope_cmd_351(char *source) +void ratbox_cmd_351(char *source) { send_cmd((UseTS6 ? TS6SID : ServerName), "351 %s Anope-%s %s :%s - %s -- %s", source, version_number, @@ -1649,73 +1483,73 @@ int anope_event_capab(char *source, int ac, char **av) } /* SVSHOLD - set */ -void anope_cmd_svshold(char *nick) +void ratbox_cmd_svshold(char *nick) { /* Not supported by this IRCD */ } /* SVSHOLD - release */ -void anope_cmd_release_svshold(char *nick) +void ratbox_cmd_release_svshold(char *nick) { /* Not Supported by this IRCD */ } /* SVSNICK */ -void anope_cmd_svsnick(char *nick, char *newnick, time_t when) +void ratbox_cmd_svsnick(char *nick, char *newnick, time_t when) { /* not supported */ } -void anope_cmd_guest_nick(char *nick, char *user, char *host, char *real, - char *modes) +void ratbox_cmd_guest_nick(char *nick, char *user, char *host, char *real, + char *modes) { /* not supported */ } -void anope_cmd_svso(char *source, char *nick, char *flag) +void ratbox_cmd_svso(char *source, char *nick, char *flag) { /* Not Supported by this IRCD */ } -void anope_cmd_unban(char *name, char *nick) +void ratbox_cmd_unban(char *name, char *nick) { /* Not Supported by this IRCD */ } /* SVSMODE channel modes */ -void anope_cmd_svsmode_chan(char *name, char *mode, char *nick) +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 anope_cmd_svid_umode(char *nick, time_t ts) +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 anope_cmd_nc_change(User * u) +void ratbox_cmd_nc_change(User * u) { /* not supported */ } /* SVSMODE +d */ -void anope_cmd_svid_umode2(User * u, char *ts) +void ratbox_cmd_svid_umode2(User * u, char *ts) { /* not supported */ } -void anope_cmd_svid_umode3(User * u, char *ts) +void ratbox_cmd_svid_umode3(User * u, char *ts) { /* not used */ } /* NICK <newnick> */ -void anope_cmd_chg_nick(char *oldnick, char *newnick) +void ratbox_cmd_chg_nick(char *oldnick, char *newnick) { if (!oldnick || !newnick) { return; @@ -1746,17 +1580,17 @@ int anope_event_pass(char *source, int ac, char **av) return MOD_CONT; } -void anope_cmd_svsjoin(char *source, char *nick, char *chan) +void ratbox_cmd_svsjoin(char *source, char *nick, char *chan) { /* Not Supported by this IRCD */ } -void anope_cmd_svspart(char *source, char *nick, char *chan) +void ratbox_cmd_svspart(char *source, char *nick, char *chan) { /* Not Supported by this IRCD */ } -void anope_cmd_swhois(char *source, char *who, char *mask) +void ratbox_cmd_swhois(char *source, char *who, char *mask) { /* not supported */ } @@ -1806,7 +1640,7 @@ int anope_event_bmask(char *source, int ac, char **av) return MOD_CONT; } -int anope_flood_mode_check(char *value) +int ratbox_flood_mode_check(char *value) { return 0; } @@ -1821,15 +1655,15 @@ int anope_event_error(char *source, int ac, char **av) return MOD_CONT; } -void anope_cmd_jupe(char *jserver, char *who, char *reason) +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 : ""); - anope_cmd_squit(jserver, rbuf); - anope_cmd_server(jserver, 2, rbuf); + ratbox_cmd_squit(jserver, rbuf); + ratbox_cmd_server(jserver, 2, rbuf); new_server(me_server, jserver, rbuf, SERVER_JUPED, NULL); } @@ -1837,24 +1671,16 @@ void anope_cmd_jupe(char *jserver, char *who, char *reason) 1 = valid nick 0 = nick is in valid */ -int anope_valid_nick(char *nick) +int ratbox_valid_nick(char *nick) { /* no hard coded invalid nicks */ return 1; } -void anope_cmd_ctcp(char *source, char *dest, const char *fmt, ...) +void ratbox_cmd_ctcp(char *source, char *dest, char *buf) { - va_list args; - char buf[BUFSIZE]; char *s; - *buf = '\0'; - if (fmt) { - va_start(args, fmt); - vsnprintf(buf, BUFSIZE - 1, fmt, args); - va_end(args); - } if (!buf) { return; } else { @@ -1865,4 +1691,118 @@ void anope_cmd_ctcp(char *source, char *dest, const char *fmt, ...) free(s); } -#endif + +/** + * 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_unsqline); + 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_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_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(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/ratbox.h b/src/protocol/ratbox.h new file mode 100644 index 000000000..b99e4437e --- /dev/null +++ b/src/protocol/ratbox.h @@ -0,0 +1,119 @@ +/* Ratbox IRCD functions + * + * (C) 2003-2005 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/shadowircd.c b/src/protocol/shadowircd.c index c71381782..6471e1dbe 100644 --- a/src/shadowircd.c +++ b/src/protocol/shadowircd.c @@ -14,20 +14,12 @@ #include "services.h" #include "pseudo.h" - -#ifdef IRC_SHADOWIRCD - -const char version_protocol[] = "ShadowIRCd 4.0+"; - -/* Not all ircds use +f for their flood/join throttle system */ -const char flood_mode_char_set[] = ""; /* mode char for FLOOD mode on set */ -const char flood_mode_char_remove[] = ""; /* mode char for FLOOD mode on remove */ -int UseTSMODE = 1; +#include "shadowircd.h" /* 6 slot array, 35 possible combinations per slot, exponential. */ int ts6nickcount[6] = { 0, 0, 0, 0, 0, 0 }; -IRCDVar ircd[] = { +IRCDVar myIrcd[] = { {"ShadowIRCd 4.0+", /* ircd name */ "+oiqSK", /* nickserv mode */ "+oiqSK", /* chanserv mode */ @@ -88,7 +80,6 @@ IRCDVar ircd[] = { 0, /* O:LINE */ 1, /* VHOST ON NICK */ 1, /* Change RealName */ - 0, /* ChanServ extra */ CMODE_K, /* No Knock */ CMODE_A, /* Admin Only */ DEFAULT_MLOCK, /* Default MLOCK */ @@ -121,7 +112,7 @@ IRCDVar ircd[] = { }; /* ShadowIRCd does not use CAPAB */ -IRCDCAPAB ircdcap[] = { +IRCDCAPAB myIrcdcap[] = { { 0, /* NOQUIT */ 0, /* TSMODE */ @@ -154,7 +145,7 @@ IRCDCAPAB ircdcap[] = { 0, 0, 0} }; -void anope_set_umode(User * user, int ac, char **av) +void shadowircd_set_umode(User * user, int ac, char **av) { int add = 1; /* 1 if adding modes, 0 if deleting */ char *modes = av[0]; @@ -247,7 +238,7 @@ unsigned long umodes[128] = { }; -char csmodes[128] = { +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, @@ -268,7 +259,7 @@ char csmodes[128] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -CMMode cmmodes[128] = { +CMMode myCmmodes[128] = { {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, @@ -318,7 +309,7 @@ CMMode cmmodes[128] = { }; -CBMode cbmodes[128] = { +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}, @@ -384,7 +375,7 @@ CBMode cbmodes[128] = { {0}, {0}, {0}, {0} }; -CBModeInfo cbmodeinfos[] = { +CBModeInfo myCbmodeinfos[] = { {'c', CMODE_c, 0, NULL, NULL}, {'i', CMODE_i, 0, NULL, NULL}, {'k', CMODE_k, 0, get_key, cs_get_key}, @@ -412,7 +403,7 @@ CBModeInfo cbmodeinfos[] = { }; -CUMode cumodes[128] = { +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}, @@ -461,26 +452,17 @@ CUMode cumodes[128] = { -void anope_cmd_notice(char *source, char *dest, const char *fmt, ...) +void shadowircd_cmd_notice(char *source, char *dest, char *buf) { - va_list args; - char buf[BUFSIZE]; Uid *ud; User *u; - *buf = '\0'; - - if (fmt) { - va_start(args, fmt); - vsnprintf(buf, BUFSIZE - 1, fmt, args); - va_end(args); - } if (!buf) { return; } if (UsePrivmsg) { - anope_cmd_privmsg2(source, dest, buf); + shadowircd_cmd_privmsg2(source, dest, buf); } else { ud = find_uid(source); u = finduser(dest); @@ -489,7 +471,7 @@ void anope_cmd_notice(char *source, char *dest, const char *fmt, ...) } } -void anope_cmd_notice2(char *source, char *dest, char *msg) +void shadowircd_cmd_notice2(char *source, char *dest, char *msg) { Uid *ud; User *u; @@ -500,19 +482,10 @@ void anope_cmd_notice2(char *source, char *dest, char *msg) msg); } -void anope_cmd_privmsg(char *source, char *dest, const char *fmt, ...) +void shadowircd_cmd_privmsg(char *source, char *dest, char *buf) { - va_list args; - char buf[BUFSIZE]; Uid *ud, *ud2; - *buf = '\0'; - - if (fmt) { - va_start(args, fmt); - vsnprintf(buf, BUFSIZE - 1, fmt, args); - va_end(args); - } if (!buf) { return; } @@ -523,7 +496,7 @@ void anope_cmd_privmsg(char *source, char *dest, const char *fmt, ...) (ud2 ? ud2->uid : dest), buf); } -void anope_cmd_privmsg2(char *source, char *dest, char *msg) +void shadowircd_cmd_privmsg2(char *source, char *dest, char *msg) { Uid *ud, *ud2; @@ -534,29 +507,21 @@ void anope_cmd_privmsg2(char *source, char *dest, char *msg) (ud2 ? ud2->uid : dest), msg); } -void anope_cmd_serv_notice(char *source, char *dest, char *msg) +void shadowircd_cmd_serv_notice(char *source, char *dest, char *msg) { send_cmd(source, "NOTICE $$%s :%s", dest, msg); } -void anope_cmd_serv_privmsg(char *source, char *dest, char *msg) +void shadowircd_cmd_serv_privmsg(char *source, char *dest, char *msg) { send_cmd(source, "PRIVMSG $$%s :%s", dest, msg); } -void anope_cmd_global(char *source, const char *fmt, ...) +void shadowircd_cmd_global(char *source, char *buf) { - va_list args; - char buf[BUFSIZE]; Uid *u; - *buf = '\0'; - if (fmt) { - va_start(args, fmt); - vsnprintf(buf, BUFSIZE - 1, fmt, args); - va_end(args); - } if (!buf) { return; } @@ -574,7 +539,7 @@ void anope_cmd_global(char *source, const char *fmt, ...) } /* GLOBOPS - to handle old WALLOPS */ -void anope_cmd_global_legacy(char *source, char *fmt) +void shadowircd_cmd_global_legacy(char *source, char *fmt) { Uid *u; @@ -625,7 +590,7 @@ int anope_event_sjoin(char *source, int ac, char **av) */ int anope_event_nick(char *source, int ac, char **av) { - Server *s; + Server *s = NULL; User *user, *u2; if (ac == 10) { @@ -637,6 +602,17 @@ int anope_event_nick(char *source, int ac, char **av) 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, @@ -813,42 +789,42 @@ void moduleAddIRCDMsgs(void) /* *INDENT-ON* */ -void anope_cmd_sqline(char *mask, char *reason) +void shadowircd_cmd_sqline(char *mask, char *reason) { send_cmd(NULL, "RESV * %s :%s", mask, reason); } -void anope_cmd_unsgline(char *mask) +void shadowircd_cmd_unsgline(char *mask) { /* Does not support */ } -void anope_cmd_unszline(char *mask) +void shadowircd_cmd_unszline(char *mask) { /* Does not support */ } -void anope_cmd_szline(char *mask, char *reason, char *whom) +void shadowircd_cmd_szline(char *mask, char *reason, char *whom) { /* Does not support */ } -void anope_cmd_svsnoop(char *server, int set) +void shadowircd_cmd_svsnoop(char *server, int set) { /* does not support */ } -void anope_cmd_svsadmin(char *server, int set) +void shadowircd_cmd_svsadmin(char *server, int set) { - anope_cmd_svsnoop(server, set); + shadowircd_cmd_svsnoop(server, set); } -void anope_cmd_sgline(char *mask, char *reason) +void shadowircd_cmd_sgline(char *mask, char *reason) { /* does not support */ } -void anope_cmd_remove_akill(char *user, char *host) +void shadowircd_cmd_remove_akill(char *user, char *host) { Uid *ud; @@ -856,8 +832,8 @@ void anope_cmd_remove_akill(char *user, char *host) send_cmd((ud ? ud->uid : s_OperServ), "UNKLINE * %s %s", user, host); } -void anope_cmd_topic(char *whosets, char *chan, char *whosetit, - char *topic, time_t when) +void shadowircd_cmd_topic(char *whosets, char *chan, char *whosetit, + char *topic, time_t when) { Uid *ud; @@ -866,12 +842,12 @@ void anope_cmd_topic(char *whosets, char *chan, char *whosetit, whosetit, when, topic); } -void anope_cmd_vhost_off(User * u) +void shadowircd_cmd_vhost_off(User * u) { send_cmd(NULL, "MODE %s -v", (u->uid ? u->uid : u->nick)); } -void anope_cmd_vhost_on(char *nick, char *vIdent, char *vhost) +void shadowircd_cmd_vhost_on(char *nick, char *vIdent, char *vhost) { send_cmd(NULL, "SVSCLOAK %s %s", nick, vhost); @@ -879,12 +855,12 @@ void anope_cmd_vhost_on(char *nick, char *vIdent, char *vhost) send_cmd(NULL, "SVSIDENT %s %s", nick, vIdent); } -void anope_cmd_unsqline(char *user) +void shadowircd_cmd_unsqline(char *user) { send_cmd(NULL, "UNRESV * %s", user); } -void anope_cmd_join(char *user, char *channel, time_t chantime) +void shadowircd_cmd_join(char *user, char *channel, time_t chantime) { Uid *ud; @@ -902,8 +878,8 @@ host: the 'host' portion of the kline reason: the reason for the kline. */ -void anope_cmd_akill(char *user, char *host, char *who, time_t when, - time_t expires, char *reason) +void shadowircd_cmd_akill(char *user, char *host, char *who, time_t when, + time_t expires, char *reason) { Uid *ud; @@ -913,19 +889,10 @@ void anope_cmd_akill(char *user, char *host, char *who, time_t when, (long int) (expires - (long) time(NULL)), user, host, reason); } -void anope_cmd_svskill(char *source, char *user, const char *fmt, ...) +void shadowircd_cmd_svskill(char *source, char *user, char *buf) { - va_list args; - char buf[BUFSIZE]; Uid *ud; - *buf = '\0'; - - if (fmt) { - va_start(args, fmt); - vsnprintf(buf, BUFSIZE - 1, fmt, args); - va_end(args); - } if (!buf) { return; } @@ -938,28 +905,12 @@ void anope_cmd_svskill(char *source, char *user, const char *fmt, ...) send_cmd(NULL, "SVSKILL %s :%s", (ud ? ud->uid : user), buf); } -void anope_cmd_svsmode(User * u, int ac, char **av) +void shadowircd_cmd_svsmode(User * u, int ac, char **av) { send_cmd(TS6SID, "MODE %s %s", u->uid, av[0]); } -void anope_cmd_connect(int servernum) -{ - me_server = - new_server(NULL, ServerName, ServerDesc, SERVER_ISME, TS6SID); - if (servernum == 1) - anope_cmd_pass(RemotePassword); - else if (servernum == 2) - anope_cmd_pass(RemotePassword2); - else if (servernum == 3) - anope_cmd_pass(RemotePassword3); - - anope_cmd_capab(); - anope_cmd_server(ServerName, 1, ServerDesc); - anope_cmd_svinfo(); -} - -void anope_cmd_svsinfo() +void shadowircd_cmd_svsinfo() { /* not used */ } @@ -972,31 +923,48 @@ void anope_cmd_svsinfo() * parv[3] = server is standalone or connected to non-TS only * parv[4] = server's idea of UTC time */ -void anope_cmd_svinfo() +void shadowircd_cmd_svinfo() { send_cmd(NULL, "SVINFO 6 3 0 :%ld", (long int) time(NULL)); } -void anope_cmd_capab() +void shadowircd_cmd_capab() { /* ShadowIRCd does not use CAPAB */ } /* PASS */ -void anope_cmd_pass(char *pass) +void shadowircd_cmd_pass(char *pass) { send_cmd(NULL, "PASS %s TS 6 %s", pass, TS6SID); } /* SERVER name protocol hop descript */ -void anope_cmd_server(char *servname, int hop, char *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 anope_cmd_bot_nick(char *nick, char *user, char *host, char *real, - char *modes) + +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 nicknumbuf[10]; EnforceQlinedNick(nick, NULL); @@ -1011,23 +979,13 @@ void anope_cmd_bot_nick(char *nick, char *user, char *host, char *real, ts6nickcount[1]++; ts6nickcount[0] = 0; /* AAAABA */ } - anope_cmd_sqline(nick, "Reserved for services"); + shadowircd_cmd_sqline(nick, "Reserved for services"); } -void anope_cmd_part(char *nick, char *chan, const char *fmt, ...) +void shadowircd_cmd_part(char *nick, char *chan, char *buf) { - va_list args; - char buf[BUFSIZE]; Uid *ud; - *buf = '\0'; - - if (fmt) { - va_start(args, fmt); - vsnprintf(buf, BUFSIZE - 1, fmt, args); - va_end(args); - } - ud = find_uid(nick); if (buf) { @@ -1041,7 +999,7 @@ int anope_event_ping(char *source, int ac, char **av) { if (ac < 1) return MOD_CONT; - anope_cmd_pong(ac > 1 ? av[1] : ServerName, av[0]); + shadowircd_cmd_pong(ac > 1 ? av[1] : ServerName, av[0]); return MOD_CONT; } @@ -1076,7 +1034,7 @@ int anope_event_kick(char *source, int ac, char **av) return MOD_CONT; } -void anope_cmd_eob() +void shadowircd_cmd_eob() { send_cmd(TS6SID, "EOB"); } @@ -1146,7 +1104,7 @@ int anope_event_whois(char *source, int ac, char **av) /* EVENT: SERVER */ int anope_event_server(char *source, int ac, char **av) { - if (!stricmp(av[1], "1") && !stricmp(av[2], "1")) { + if (!stricmp(av[1], "1")) { uplink = sstrdup(av[0]); if (TS6UPLINK) { do_server(source, av[0], av[1], av[2], TS6UPLINK); @@ -1166,7 +1124,6 @@ int anope_event_sid(char *source, int ac, char **av) /* :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; } @@ -1208,31 +1165,31 @@ int anope_event_quit(char *source, int ac, char **av) return MOD_CONT; } -void anope_cmd_372(char *source, char *msg) +void shadowircd_cmd_372(char *source, char *msg) { send_cmd(TS6SID, "372 %s :- %s", source, msg); } -void anope_cmd_372_error(char *source) +void shadowircd_cmd_372_error(char *source) { send_cmd(TS6SID, "422 %s :- MOTD file not found! Please " "contact your IRC administrator.", source); } -void anope_cmd_375(char *source) +void shadowircd_cmd_375(char *source) { send_cmd(TS6SID, "375 %s :- %s Message of the Day", source, ServerName); } -void anope_cmd_376(char *source) +void shadowircd_cmd_376(char *source) { send_cmd(TS6SID, "376 %s :End of /MOTD command.", source); } /* 391 */ -void anope_cmd_391(char *source, char *timestr) +void shadowircd_cmd_391(char *source, char *timestr) { if (!timestr) { return; @@ -1241,17 +1198,8 @@ void anope_cmd_391(char *source, char *timestr) } /* 250 */ -void anope_cmd_250(const char *fmt, ...) +void shadowircd_cmd_250(char *buf) { - 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; } @@ -1260,17 +1208,8 @@ void anope_cmd_250(const char *fmt, ...) } /* 307 */ -void anope_cmd_307(const char *fmt, ...) +void shadowircd_cmd_307(char *buf) { - 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; } @@ -1279,17 +1218,8 @@ void anope_cmd_307(const char *fmt, ...) } /* 311 */ -void anope_cmd_311(const char *fmt, ...) +void shadowircd_cmd_311(char *buf) { - 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; } @@ -1298,17 +1228,8 @@ void anope_cmd_311(const char *fmt, ...) } /* 312 */ -void anope_cmd_312(const char *fmt, ...) +void shadowircd_cmd_312(char *buf) { - 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; } @@ -1317,17 +1238,8 @@ void anope_cmd_312(const char *fmt, ...) } /* 317 */ -void anope_cmd_317(const char *fmt, ...) +void shadowircd_cmd_317(char *buf) { - 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; } @@ -1336,7 +1248,7 @@ void anope_cmd_317(const char *fmt, ...) } /* 219 */ -void anope_cmd_219(char *source, char *letter) +void shadowircd_cmd_219(char *source, char *letter) { if (!source) { return; @@ -1351,7 +1263,7 @@ void anope_cmd_219(char *source, char *letter) } /* 401 */ -void anope_cmd_401(char *source, char *who) +void shadowircd_cmd_401(char *source, char *who) { if (!source || !who) { return; @@ -1360,7 +1272,7 @@ void anope_cmd_401(char *source, char *who) } /* 318 */ -void anope_cmd_318(char *source, char *who) +void shadowircd_cmd_318(char *source, char *who) { if (!source || !who) { return; @@ -1370,17 +1282,8 @@ void anope_cmd_318(char *source, char *who) } /* 242 */ -void anope_cmd_242(const char *fmt, ...) +void shadowircd_cmd_242(char *buf) { - 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; } @@ -1389,17 +1292,8 @@ void anope_cmd_242(const char *fmt, ...) } /* 243 */ -void anope_cmd_243(const char *fmt, ...) +void shadowircd_cmd_243(char *buf) { - 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; } @@ -1408,17 +1302,8 @@ void anope_cmd_243(const char *fmt, ...) } /* 211 */ -void anope_cmd_211(const char *fmt, ...) +void shadowircd_cmd_211(char *buf) { - 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; } @@ -1426,18 +1311,9 @@ void anope_cmd_211(const char *fmt, ...) send_cmd(NULL, "211 %s ", buf); } -void anope_cmd_mode(char *source, char *dest, const char *fmt, ...) +void shadowircd_cmd_mode(char *source, char *dest, char *buf) { - va_list args; - char buf[BUFSIZE]; Uid *ud; - *buf = '\0'; - - if (fmt) { - va_start(args, fmt); - vsnprintf(buf, BUFSIZE - 1, fmt, args); - va_end(args); - } if (!buf) { return; } @@ -1450,17 +1326,9 @@ void anope_cmd_mode(char *source, char *dest, const char *fmt, ...) } } -void anope_cmd_tmode(char *source, char *dest, const char *fmt, ...) +void shadowircd_cmd_tmode(char *source, char *dest, char *buf) { - 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; } @@ -1468,7 +1336,7 @@ void anope_cmd_tmode(char *source, char *dest, const char *fmt, ...) send_cmd(NULL, "MODE %s %s", dest, buf); } -void anope_cmd_nick(char *nick, char *name, char *mode) +void shadowircd_cmd_nick(char *nick, char *name, char *mode) { char nicknumbuf[10]; EnforceQlinedNick(nick, NULL); @@ -1478,24 +1346,13 @@ void anope_cmd_nick(char *nick, char *name, char *mode) nicknumbuf, ServiceHost, name); new_uid(nick, nicknumbuf); ts6nickcount[0]++; - anope_cmd_sqline(nick, "Reserved for services"); + shadowircd_cmd_sqline(nick, "Reserved for services"); } -void anope_cmd_kick(char *source, char *chan, char *user, const char *fmt, - ...) +void shadowircd_cmd_kick(char *source, char *chan, char *user, char *buf) { - va_list args; - char buf[BUFSIZE]; Uid *ud; User *u; - *buf = '\0'; - - - if (fmt) { - va_start(args, fmt); - vsnprintf(buf, BUFSIZE - 1, fmt, args); - va_end(args); - } ud = find_uid(source); u = finduser(user); @@ -1509,17 +1366,8 @@ void anope_cmd_kick(char *source, char *chan, char *user, const char *fmt, } } -void anope_cmd_notice_ops(char *source, char *dest, const char *fmt, ...) +void shadowircd_cmd_notice_ops(char *source, char *dest, char *buf) { - 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; } @@ -1527,30 +1375,20 @@ void anope_cmd_notice_ops(char *source, char *dest, const char *fmt, ...) send_cmd(NULL, "NOTICE @%s :%s", dest, buf); } -void anope_cmd_bot_chan_mode(char *nick, char *chan) +void shadowircd_cmd_bot_chan_mode(char *nick, char *chan) { Uid *u; u = find_uid(nick); - anope_cmd_tmode(nick, chan, "%s %s", ircd->botchanumode, - (u ? u->uid : nick)); + anope_cmd_mode(nick, chan, "%s %s", ircd->botchanumode, + (u ? u->uid : nick)); } /* QUIT */ -void anope_cmd_quit(char *source, const char *fmt, ...) +void shadowircd_cmd_quit(char *source, char *buf) { - va_list args; - char buf[BUFSIZE]; Uid *ud; - *buf = '\0'; - - if (fmt) { - va_start(args, fmt); - vsnprintf(buf, BUFSIZE - 1, fmt, args); - va_end(args); - } - ud = find_uid(source); if (buf) { @@ -1561,13 +1399,13 @@ void anope_cmd_quit(char *source, const char *fmt, ...) } /* PONG */ -void anope_cmd_pong(char *servname, char *who) +void shadowircd_cmd_pong(char *servname, char *who) { send_cmd(TS6SID, "PONG %s", who); } /* INVITE */ -void anope_cmd_invite(char *source, char *chan, char *nick) +void shadowircd_cmd_invite(char *source, char *chan, char *nick) { Uid *ud; User *u; @@ -1584,7 +1422,7 @@ void anope_cmd_invite(char *source, char *chan, char *nick) } /* SQUIT */ -void anope_cmd_squit(char *servname, char *message) +void shadowircd_cmd_squit(char *servname, char *message) { if (!servname || !message) { return; @@ -1620,7 +1458,7 @@ int anope_event_tmode(char *source, int ac, char **av) return MOD_CONT; } -void anope_cmd_351(char *source) +void shadowircd_cmd_351(char *source) { send_cmd(TS6SID, "351 %s Anope-%s %s :%s (ShadowProtocol %d) - %s -- %s", @@ -1636,19 +1474,19 @@ int anope_event_capab(char *source, int ac, char **av) } /* SVSHOLD - set */ -void anope_cmd_svshold(char *nick) +void shadowircd_cmd_svshold(char *nick) { /* Not supported by this IRCD */ } /* SVSHOLD - release */ -void anope_cmd_release_svshold(char *nick) +void shadowircd_cmd_release_svshold(char *nick) { /* Not Supported by this IRCD */ } /* SVSNICK */ -void anope_cmd_svsnick(char *nick, char *newnick, time_t when) +void shadowircd_cmd_svsnick(char *nick, char *newnick, time_t when) { if (!nick || !newnick) { return; @@ -1656,56 +1494,56 @@ void anope_cmd_svsnick(char *nick, char *newnick, time_t when) send_cmd(NULL, "SVSNICK %s %s %ld", nick, newnick, when); } -void anope_cmd_guest_nick(char *nick, char *user, char *host, char *real, - char *modes) +void shadowircd_cmd_guest_nick(char *nick, char *user, char *host, + char *real, char *modes) { /* not supported */ } -void anope_cmd_svso(char *source, char *nick, char *flag) +void shadowircd_cmd_svso(char *source, char *nick, char *flag) { /* Not Supported by this IRCD */ } -void anope_cmd_unban(char *name, char *nick) +void shadowircd_cmd_unban(char *name, char *nick) { /* Not Supported by this IRCD */ } /* SVSMODE channel modes */ -void anope_cmd_svsmode_chan(char *name, char *mode, char *nick) +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 anope_cmd_svid_umode(char *nick, time_t ts) +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 anope_cmd_nc_change(User * u) +void shadowircd_cmd_nc_change(User * u) { /* not supported */ } /* SVSMODE +d */ -void anope_cmd_svid_umode2(User * u, char *ts) +void shadowircd_cmd_svid_umode2(User * u, char *ts) { /* not supported */ } -void anope_cmd_svid_umode3(User * u, char *ts) +void shadowircd_cmd_svid_umode3(User * u, char *ts) { /* not used */ } /* NICK <newnick> */ -void anope_cmd_chg_nick(char *oldnick, char *newnick) +void shadowircd_cmd_chg_nick(char *oldnick, char *newnick) { if (!oldnick || !newnick) { return; @@ -1734,17 +1572,17 @@ int anope_event_pass(char *source, int ac, char **av) return MOD_CONT; } -void anope_cmd_svsjoin(char *source, char *nick, char *chan) +void shadowircd_cmd_svsjoin(char *source, char *nick, char *chan) { /* Not Supported by this IRCD */ } -void anope_cmd_svspart(char *source, char *nick, char *chan) +void shadowircd_cmd_svspart(char *source, char *nick, char *chan) { /* Not Supported by this IRCD */ } -void anope_cmd_swhois(char *source, char *who, char *mask) +void shadowircd_cmd_swhois(char *source, char *who, char *mask) { /* not supported */ } @@ -1794,7 +1632,7 @@ int anope_event_bmask(char *source, int ac, char **av) return MOD_CONT; } -int anope_flood_mode_check(char *value) +int shadowircd_flood_mode_check(char *value) { return 0; } @@ -1809,15 +1647,15 @@ int anope_event_error(char *source, int ac, char **av) return MOD_CONT; } -void anope_cmd_jupe(char *jserver, char *who, char *reason) +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 : ""); - anope_cmd_squit(jserver, rbuf); - anope_cmd_server(jserver, 2, rbuf); + shadowircd_cmd_squit(jserver, rbuf); + shadowircd_cmd_server(jserver, 2, rbuf); new_server(me_server, jserver, rbuf, SERVER_JUPED, NULL); } @@ -1825,24 +1663,16 @@ void anope_cmd_jupe(char *jserver, char *who, char *reason) 1 = valid nick 0 = nick is in valid */ -int anope_valid_nick(char *nick) +int shadowircd_valid_nick(char *nick) { /* no hard coded invalid nicks */ return 1; } -void anope_cmd_ctcp(char *source, char *dest, const char *fmt, ...) +void shadowircd_cmd_ctcp(char *source, char *dest, char *buf) { - va_list args; - char buf[BUFSIZE]; char *s; - *buf = '\0'; - if (fmt) { - va_start(args, fmt); - vsnprintf(buf, BUFSIZE - 1, fmt, args); - va_end(args); - } if (!buf) { return; } else { @@ -1853,4 +1683,117 @@ void anope_cmd_ctcp(char *source, char *dest, const char *fmt, ...) free(s); } -#endif +/** + * 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_unsqline); + 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_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_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..4c6669ce2 --- /dev/null +++ b/src/protocol/shadowircd.h @@ -0,0 +1,142 @@ +/* ShadowIRCD functions + * + * (C) 2003-2005 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/solidircd.c b/src/protocol/solidircd.c index 1e13f388b..753793895 100644 --- a/src/solidircd.c +++ b/src/protocol/solidircd.c @@ -15,17 +15,9 @@ #include "services.h" #include "pseudo.h" +#include "solidircd.h" -#ifdef IRC_SOLID - -const char version_protocol[] = "Solid-IRCd 3.4.*"; - -/* Not all ircds use +f for their flood/join throttle system */ -const char flood_mode_char_set[] = "+j"; /* mode char for FLOOD mode on set */ -const char flood_mode_char_remove[] = "-j"; /* mode char for FLOOD mode on remove */ -int UseTSMODE = 0; /* does send TSMODE but if it doesn't means it won't so this is disabled */ - -IRCDVar ircd[] = { +IRCDVar myIrcd[] = { {"Solid-IRCd 3.4.*", /* ircd name */ "+o", /* nickserv mode */ "+o", /* chanserv mode */ @@ -86,7 +78,6 @@ IRCDVar ircd[] = { 1, /* UMODE */ 0, /* VHOST ON NICK */ 0, /* Change RealName */ - CHAN_HELP_IRCD_HALFOP, /* ChanServ extra */ 0, /* No Knock */ 0, /* Admin Only */ DEFAULT_MLOCK, /* Default MLOCK */ @@ -118,7 +109,7 @@ IRCDVar ircd[] = { {NULL} }; -IRCDCAPAB ircdcap[] = { +IRCDCAPAB myIrcdcap[] = { { CAPAB_NOQUIT, /* NOQUIT */ CAPAB_TSMODE, /* TSMODE */ @@ -152,7 +143,7 @@ IRCDCAPAB ircdcap[] = { }; -void anope_set_umode(User * user, int ac, char **av) +void solidircd_set_umode(User * user, int ac, char **av) { int add = 1; /* 1 if adding modes, 0 if deleting */ char *modes = av[0]; @@ -274,7 +265,7 @@ unsigned long umodes[128] = { 0, 0 /* ~ ‚ */ }; -char csmodes[128] = { +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, @@ -296,7 +287,7 @@ char csmodes[128] = { }; -CMMode cmmodes[128] = { +CMMode myCmmodes[128] = { {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, @@ -347,7 +338,7 @@ CMMode cmmodes[128] = { -CBMode cbmodes[128] = { +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}, @@ -413,7 +404,7 @@ CBMode cbmodes[128] = { {0}, {0}, {0}, {0} }; -CBModeInfo cbmodeinfos[] = { +CBModeInfo myCbmodeinfos[] = { {'c', CMODE_c, 0, NULL, NULL}, {'i', CMODE_i, 0, NULL, NULL}, {'j', CMODE_j, 0, get_flood, cs_get_flood}, @@ -434,7 +425,7 @@ CBModeInfo cbmodeinfos[] = { }; -CUMode cumodes[128] = { +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}, @@ -481,56 +472,46 @@ CUMode cumodes[128] = { {0}, {0}, {0}, {0}, {0} }; -void anope_cmd_mode(char *source, char *dest, const char *fmt, ...) +void solidircd_cmd_mode(char *source, char *dest, char *buf) { - 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; - } + 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); - } + 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 anope_cmd_svshold(char *nick) +void solidircd_cmd_svshold(char *nick) { send_cmd(ServerName, "SVSHOLD %s %d :%s", nick, NSReleaseTimeout, "Being held for registered user"); } /* SVSHOLD - release */ -void anope_cmd_release_svshold(char *nick) +void solidircd_cmd_release_svshold(char *nick) { send_cmd(ServerName, "SVSHOLD %s 0", nick); } /* SVSMODE -b */ -void anope_cmd_unban(char *name, char *nick) +void solidircd_cmd_unban(char *name, char *nick) { - anope_cmd_svsmode_chan(name, "-b", nick); + solidircd_cmd_svsmode_chan(name, "-b", nick); } /* SVSMODE channel modes */ -void anope_cmd_svsmode_chan(char *name, char *mode, char *nick) +void solidircd_cmd_svsmode_chan(char *name, char *mode, char *nick) { if (nick) { send_cmd(ServerName, "SVSMODE %s %s %s", name, mode, nick); @@ -539,7 +520,7 @@ void anope_cmd_svsmode_chan(char *name, char *mode, char *nick) } } -void anope_cmd_bot_chan_mode(char *nick, char *chan) +void solidircd_cmd_bot_chan_mode(char *nick, char *chan) { anope_cmd_mode(nick, chan, "%s %s", ircd->botchanumode, nick); } @@ -738,7 +719,7 @@ int anope_event_vs(char *source, int ac, char **av) } /* SQLINE */ -void anope_cmd_sqline(char *mask, char *reason) +void solidircd_cmd_sqline(char *mask, char *reason) { if (!mask || !reason) { return; @@ -748,59 +729,49 @@ void anope_cmd_sqline(char *mask, char *reason) } /* UNSGLINE */ -void anope_cmd_unsgline(char *mask) +void solidircd_cmd_unsgline(char *mask) { send_cmd(NULL, "UNSGLINE 0 :%s", mask); } /* UNSZLINE */ -void anope_cmd_unszline(char *mask) +void solidircd_cmd_unszline(char *mask) { send_cmd(NULL, "UNSZLINE 0 %s", mask); } /* SZLINE */ -void anope_cmd_szline(char *mask, char *reason, char *whom) +void solidircd_cmd_szline(char *mask, char *reason, char *whom) { send_cmd(NULL, "SZLINE %s :%s", mask, reason); } /* SVSNOOP */ -void anope_cmd_svsnoop(char *server, int set) +void solidircd_cmd_svsnoop(char *server, int set) { send_cmd(NULL, "SVSNOOP %s %s", server, (set ? "+" : "-")); } -void anope_cmd_svsadmin(char *server, int set) +void solidircd_cmd_svsadmin(char *server, int set) { - anope_cmd_svsnoop(server, set); + solidircd_cmd_svsnoop(server, set); } /* SGLINE */ -void anope_cmd_sgline(char *mask, char *reason) +void solidircd_cmd_sgline(char *mask, char *reason) { send_cmd(NULL, "SGLINE %d :%s:%s", strlen(mask), mask, reason); } /* RAKILL */ -void anope_cmd_remove_akill(char *user, char *host) +void solidircd_cmd_remove_akill(char *user, char *host) { send_cmd(NULL, "RAKILL %s %s", host, user); } /* PART */ -void anope_cmd_part(char *nick, char *chan, const char *fmt, ...) +void solidircd_cmd_part(char *nick, char *chan, char *buf) { - va_list args; - char buf[BUFSIZE]; - *buf = '\0'; - - if (fmt) { - va_start(args, fmt); - vsnprintf(buf, BUFSIZE - 1, fmt, args); - va_end(args); - } - if (!nick || !chan) { return; } @@ -813,21 +784,21 @@ void anope_cmd_part(char *nick, char *chan, const char *fmt, ...) } /* TOPIC */ -void anope_cmd_topic(char *whosets, char *chan, char *whosetit, - char *topic, time_t when) +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 anope_cmd_unsqline(char *user) +void solidircd_cmd_unsqline(char *user) { send_cmd(NULL, "UNSQLINE %s", user); } /* JOIN - SJOIN */ -void anope_cmd_join(char *user, char *channel, time_t chantime) +void solidircd_cmd_join(char *user, char *channel, time_t chantime) { send_cmd(user, "SJOIN %ld %s", (long int) chantime, channel); } @@ -840,8 +811,8 @@ void anope_cmd_join(char *user, char *channel, time_t chantime) * parv[5]=time set * parv[6]=reason */ -void anope_cmd_akill(char *user, char *host, char *who, time_t when, - time_t expires, char *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); @@ -856,21 +827,10 @@ void anope_cmd_akill(char *user, char *host, char *who, time_t when, /* Note: if the stamp is null 0, the below usage is correct of Bahamut */ -void anope_cmd_svskill(char *source, char *user, const char *fmt, ...) +void solidircd_cmd_svskill(char *source, char *user, char *buf) { - va_list args; - char buf[BUFSIZE]; - *buf = '\0'; - - if (!source || !user || !fmt) { - return; - } - va_start(args, fmt); - vsnprintf(buf, BUFSIZE - 1, fmt, args); - va_end(args); - - if (!buf) { + if (!source || !user || !buf) { return; } @@ -884,7 +844,7 @@ void anope_cmd_svskill(char *source, char *user, const char *fmt, ...) * parv[3] - mode (or services id if old svs version) * parv[4] - optional arguement (services id) */ -void anope_cmd_svsmode(User * u, int ac, char **av) +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 ? " " : ""), @@ -897,33 +857,20 @@ void anope_cmd_svsmode(User * u, int ac, char **av) * parv[1] = server name * parv[2] = comment */ -void anope_cmd_squit(char *servname, char *message) +void solidircd_cmd_squit(char *servname, char *message) { send_cmd(NULL, "SQUIT %s :%s", servname, message); } /* PONG */ -void anope_cmd_pong(char *servname, char *who) +void solidircd_cmd_pong(char *servname, char *who) { send_cmd(servname, "PONG %s", who); } -void anope_cmd_connect(int servernum) +void solidircd_cmd_burst() { - me_server = - new_server(NULL, ServerName, ServerDesc, SERVER_ISME, NULL); - - if (servernum == 1) { - anope_cmd_pass(RemotePassword); - } else if (servernum == 2) { - anope_cmd_pass(RemotePassword2); - } else if (servernum == 3) { - anope_cmd_pass(RemotePassword3); - } - anope_cmd_capab(); - anope_cmd_server(ServerName, 1, ServerDesc); - anope_cmd_svinfo(); - anope_cmd_burst(); + send_cmd(NULL, "BURST"); } @@ -935,30 +882,48 @@ void anope_cmd_connect(int servernum) * parv[3] = server is standalone or connected to non-TS only * parv[4] = server's idea of UTC time */ -void anope_cmd_svinfo() +void solidircd_cmd_svinfo() { send_cmd(NULL, "SVINFO 5 3 0 :%ld", (long int) time(NULL)); } /* PASS */ -void anope_cmd_pass(char *pass) +void solidircd_cmd_pass(char *pass) { send_cmd(NULL, "PASS %s :TS", pass); } /* SERVER */ -void anope_cmd_server(char *servname, int hop, char *descript) +void solidircd_cmd_server(char *servname, int hop, char *descript) { send_cmd(NULL, "SERVER %s %d :%s", servname, hop, ServerDesc); } /* CAPAB */ -void anope_cmd_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) { @@ -1088,63 +1053,36 @@ int anope_event_motd(char *source, int ac, char **av) return MOD_CONT; } -void anope_cmd_notice_ops(char *source, char *dest, const char *fmt, ...) +void solidircd_cmd_notice_ops(char *source, char *dest, char *buf) { - 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, "NOTICE @%s :%s", dest, buf); + if (!buf) { + return; } + send_cmd(NULL, "NOTICE @%s :%s", dest, buf); } /* NOTICE */ -void anope_cmd_notice(char *source, char *dest, const char *fmt, ...) +void solidircd_cmd_notice(char *source, char *dest, char *buf) { - va_list args; - char buf[BUFSIZE]; - *buf = '\0'; - - if (fmt) { - va_start(args, fmt); - vsnprintf(buf, sizeof(buf), fmt, args); - va_end(args); - } if (!buf) { return; } if (UsePrivmsg) { - anope_cmd_privmsg2(source, dest, buf); + solidircd_cmd_privmsg2(source, dest, buf); } else { send_cmd(source, "NOTICE %s :%s", dest, buf); } } -void anope_cmd_notice2(char *source, char *dest, char *msg) +void solidircd_cmd_notice2(char *source, char *dest, char *msg) { send_cmd(source, "NOTICE %s :%s", dest, msg); } -void anope_cmd_privmsg(char *source, char *dest, const char *fmt, ...) +void solidircd_cmd_privmsg(char *source, char *dest, char *buf) { - 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; } @@ -1152,33 +1090,24 @@ void anope_cmd_privmsg(char *source, char *dest, const char *fmt, ...) send_cmd(source, "PRIVMSG %s :%s", dest, buf); } -void anope_cmd_privmsg2(char *source, char *dest, char *msg) +void solidircd_cmd_privmsg2(char *source, char *dest, char *msg) { send_cmd(source, "PRIVMSG %s :%s", dest, msg); } -void anope_cmd_serv_notice(char *source, char *dest, char *msg) +void solidircd_cmd_serv_notice(char *source, char *dest, char *msg) { send_cmd(source, "NOTICE $%s :%s", dest, msg); } -void anope_cmd_serv_privmsg(char *source, char *dest, char *msg) +void solidircd_cmd_serv_privmsg(char *source, char *dest, char *msg) { send_cmd(source, "PRIVMSG $%s :%s", dest, msg); } /* GLOBOPS */ -void anope_cmd_global(char *source, const char *fmt, ...) +void solidircd_cmd_global(char *source, char *buf) { - 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; } @@ -1187,7 +1116,7 @@ void anope_cmd_global(char *source, const char *fmt, ...) } /* 391 */ -void anope_cmd_391(char *source, char *timestr) +void solidircd_cmd_391(char *source, char *timestr) { if (!timestr) { return; @@ -1196,17 +1125,8 @@ void anope_cmd_391(char *source, char *timestr) } /* 250 */ -void anope_cmd_250(const char *fmt, ...) +void solidircd_cmd_250(char *buf) { - 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; } @@ -1215,17 +1135,8 @@ void anope_cmd_250(const char *fmt, ...) } /* 307 */ -void anope_cmd_307(const char *fmt, ...) +void solidircd_cmd_307(char *buf) { - 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; } @@ -1234,17 +1145,8 @@ void anope_cmd_307(const char *fmt, ...) } /* 311 */ -void anope_cmd_311(const char *fmt, ...) +void solidircd_cmd_311(char *buf) { - 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; } @@ -1253,17 +1155,8 @@ void anope_cmd_311(const char *fmt, ...) } /* 312 */ -void anope_cmd_312(const char *fmt, ...) +void solidircd_cmd_312(char *buf) { - 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; } @@ -1272,17 +1165,8 @@ void anope_cmd_312(const char *fmt, ...) } /* 317 */ -void anope_cmd_317(const char *fmt, ...) +void solidircd_cmd_317(char *buf) { - 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; } @@ -1291,7 +1175,7 @@ void anope_cmd_317(const char *fmt, ...) } /* 219 */ -void anope_cmd_219(char *source, char *letter) +void solidircd_cmd_219(char *source, char *letter) { if (!source) { return; @@ -1306,7 +1190,7 @@ void anope_cmd_219(char *source, char *letter) } /* 401 */ -void anope_cmd_401(char *source, char *who) +void solidircd_cmd_401(char *source, char *who) { if (!source || !who) { return; @@ -1315,7 +1199,7 @@ void anope_cmd_401(char *source, char *who) } /* 318 */ -void anope_cmd_318(char *source, char *who) +void solidircd_cmd_318(char *source, char *who) { if (!source || !who) { return; @@ -1325,17 +1209,8 @@ void anope_cmd_318(char *source, char *who) } /* 242 */ -void anope_cmd_242(const char *fmt, ...) +void solidircd_cmd_242(char *buf) { - 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; } @@ -1344,17 +1219,8 @@ void anope_cmd_242(const char *fmt, ...) } /* 243 */ -void anope_cmd_243(const char *fmt, ...) +void solidircd_cmd_243(char *buf) { - 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; } @@ -1363,17 +1229,8 @@ void anope_cmd_243(const char *fmt, ...) } /* 211 */ -void anope_cmd_211(const char *fmt, ...) +void solidircd_cmd_211(char *buf) { - 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; } @@ -1381,28 +1238,17 @@ void anope_cmd_211(const char *fmt, ...) send_cmd(NULL, "211 %s ", buf); } -void anope_cmd_nick(char *nick, char *name, char *modes) +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); - anope_cmd_sqline(nick, "Reserved for services"); + solidircd_cmd_sqline(nick, "Reserved for services"); } -void anope_cmd_kick(char *source, char *chan, char *user, const char *fmt, - ...) +void solidircd_cmd_kick(char *source, char *chan, char *user, char *buf) { - 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) { send_cmd(source, "KICK %s %s :%s", chan, user, buf); } else { @@ -1410,30 +1256,30 @@ void anope_cmd_kick(char *source, char *chan, char *user, const char *fmt, } } -void anope_cmd_372(char *source, char *msg) +void solidircd_cmd_372(char *source, char *msg) { send_cmd(ServerName, "372 %s :- %s", source, msg); } -void anope_cmd_372_error(char *source) +void solidircd_cmd_372_error(char *source) { send_cmd(ServerName, "422 %s :- MOTD file not found! Please " "contact your IRC administrator.", source); } -void anope_cmd_375(char *source) +void solidircd_cmd_375(char *source) { send_cmd(ServerName, "375 %s :- %s Message of the Day", source, ServerName); } -void anope_cmd_376(char *source) +void solidircd_cmd_376(char *source) { send_cmd(ServerName, "376 %s :End of /MOTD command.", source); } /* INVITE */ -void anope_cmd_invite(char *source, char *chan, char *nick) +void solidircd_cmd_invite(char *source, char *chan, char *nick) { if (!source || !chan || !nick) { return; @@ -1443,17 +1289,8 @@ void anope_cmd_invite(char *source, char *chan, char *nick) } /* QUIT */ -void anope_cmd_quit(char *source, const char *fmt, ...) +void solidircd_cmd_quit(char *source, char *buf) { - 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) { send_cmd(source, "QUIT :%s", buf); @@ -1479,24 +1316,24 @@ int anope_event_ping(char *source, int ac, char **av) { if (ac < 1) return MOD_CONT; - anope_cmd_pong(ac > 1 ? av[1] : ServerName, av[0]); + solidircd_cmd_pong(ac > 1 ? av[1] : ServerName, av[0]); return MOD_CONT; } -void anope_cmd_351(char *source) +void solidircd_cmd_351(char *source) { send_cmd(ServerName, "351 %s Anope-%s %s :%s - %s -- %s", source, version_number, ServerName, ircd->name, version_flags, version_build); } -void anope_cmd_bot_nick(char *nick, char *user, char *host, char *real, - char *modes) +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); - anope_cmd_sqline(nick, "Reserved for services"); + solidircd_cmd_sqline(nick, "Reserved for services"); } /* SVSNICK */ @@ -1505,7 +1342,7 @@ void anope_cmd_bot_nick(char *nick, char *user, char *host, char *real, * parv[2] = new nickname * parv[3] = timestamp */ -void anope_cmd_svsnick(char *source, char *guest, time_t when) +void solidircd_cmd_svsnick(char *source, char *guest, time_t when) { if (!source || !guest) { return; @@ -1513,41 +1350,42 @@ void anope_cmd_svsnick(char *source, char *guest, time_t when) send_cmd(NULL, "SVSNICK %s %s :%ld", source, guest, (long int) when); } -void anope_cmd_guest_nick(char *nick, char *user, char *host, char *real, - char *modes) +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 anope_cmd_svso(char *source, char *nick, char *flag) +void solidircd_cmd_svso(char *source, char *nick, char *flag) { /* Not Supported by this IRCD */ } -void anope_cmd_vhost_on(char *nick, char *vIdent, char *vhost) +void solidircd_cmd_chghost(char *nick, char *vhost) { - send_cmd(s_HostServ, "SVSMODE %s +v", nick); - anope_cmd_chghost(nick, vhost); + if (!nick || !vhost) { + return; + } + send_cmd(ServerName, "SVHOST %s %s", nick, vhost); } -void anope_cmd_vhost_off(User * u) + +void solidircd_cmd_vhost_on(char *nick, char *vIdent, char *vhost) { - send_cmd(s_HostServ, "SVSMODE %s -v", u->nick); - notice_lang(s_HostServ, u, HOST_OFF_UNREAL, u->nick, ircd->vhostchar); + send_cmd(s_HostServ, "SVSMODE %s +v", nick); + solidircd_cmd_chghost(nick, vhost); } -void anope_cmd_chghost(char *nick, char *vhost) +void solidircd_cmd_vhost_off(User * u) { - if (!nick || !vhost) { - return; - } - send_cmd(ServerName, "SVHOST %s %s", nick, vhost); + 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 anope_cmd_svid_umode(char *nick, time_t ts) +void solidircd_cmd_svid_umode(char *nick, time_t ts) { send_cmd(ServerName, "SVSMODE %s %lu +d 1", nick, (unsigned long int) ts); @@ -1556,19 +1394,19 @@ void anope_cmd_svid_umode(char *nick, time_t ts) /* SVSMODE +d */ /* nc_change was = 1, and there is no na->status */ -void anope_cmd_nc_change(User * u) +void solidircd_cmd_nc_change(User * u) { common_svsmode(u, "+d", "1"); } /* SVSMODE +d */ -void anope_cmd_svid_umode2(User * u, char *ts) +void solidircd_cmd_svid_umode2(User * u, char *ts) { /* not used by bahamut ircds */ } -void anope_cmd_svid_umode3(User * u, char *ts) +void solidircd_cmd_svid_umode3(User * u, char *ts) { if (u->svid != u->timestamp) { common_svsmode(u, "+rd", ts); @@ -1578,7 +1416,7 @@ void anope_cmd_svid_umode3(User * u, char *ts) } /* NICK <newnick> */ -void anope_cmd_chg_nick(char *oldnick, char *newnick) +void solidircd_cmd_chg_nick(char *oldnick, char *newnick) { if (!oldnick || !newnick) { return; @@ -1618,28 +1456,22 @@ int anope_event_pass(char *source, int ac, char **av) return MOD_CONT; } -void anope_cmd_svsjoin(char *source, char *nick, char *chan) +void solidircd_cmd_svsjoin(char *source, char *nick, char *chan) { /* Can not find any reference to these in Bahamut */ } -void anope_cmd_svspart(char *source, char *nick, char *chan) +void solidircd_cmd_svspart(char *source, char *nick, char *chan) { /* Can not find any reference to these in Bahamut */ } -void anope_cmd_swhois(char *source, char *who, char *mask) +void solidircd_cmd_swhois(char *source, char *who, char *mask) { /* not supported */ } - -void anope_cmd_burst() -{ - send_cmd(NULL, "BURST"); -} - -void anope_cmd_eob() +void solidircd_cmd_eob() { send_cmd(NULL, "BURST 0"); } @@ -1682,7 +1514,7 @@ int anope_event_admin(char *source, int ac, char **av) return MOD_CONT; } -int anope_flood_mode_check(char *value) +int solidircd_flood_mode_check(char *value) { char *dp, *end; @@ -1696,20 +1528,20 @@ int anope_flood_mode_check(char *value) } } -void anope_cmd_jupe(char *jserver, char *who, char *reason) +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 : ""); - anope_cmd_squit(jserver, rbuf); - anope_cmd_server(jserver, 2, rbuf); + 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 anope_cmd_global_legacy(char *source, char *fmt) +void solidircd_cmd_global_legacy(char *source, char *fmt) { send_cmd(source ? source : ServerName, "GLOBOPS :%s", fmt); } @@ -1718,24 +1550,16 @@ void anope_cmd_global_legacy(char *source, char *fmt) 1 = valid nick 0 = nick is in valid */ -int anope_valid_nick(char *nick) +int solidircd_valid_nick(char *nick) { /* no hard coded invalid nicks */ return 1; } -void anope_cmd_ctcp(char *source, char *dest, const char *fmt, ...) +void solidircd_cmd_ctcp(char *source, char *dest, char *buf) { - va_list args; - char buf[BUFSIZE]; char *s; - *buf = '\0'; - if (fmt) { - va_start(args, fmt); - vsnprintf(buf, BUFSIZE - 1, fmt, args); - va_end(args); - } if (!buf) { return; } else { @@ -1746,4 +1570,118 @@ void anope_cmd_ctcp(char *source, char *dest, const char *fmt, ...) free(s); } -#endif + +/** + * 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_unsqline); + 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_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_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..e75f9add6 --- /dev/null +++ b/src/protocol/solidircd.h @@ -0,0 +1,137 @@ +/* SolidIRCD functions + * + * (C) 2003-2005 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/ultimate2.c b/src/protocol/ultimate2.c index efc9171e9..eb8d29462 100644 --- a/src/ultimate2.c +++ b/src/protocol/ultimate2.c @@ -13,17 +13,9 @@ #include "services.h" #include "pseudo.h" +#include "ultimate2.h" -#ifdef IRC_ULTIMATE2 - -const char version_protocol[] = "UltimateIRCd 2.8.2+"; - -/* Not all ircds use +f for their flood/join throttle system */ -const char flood_mode_char_set[] = "+f"; /* mode char for FLOOD mode on set */ -const char flood_mode_char_remove[] = "-f"; /* mode char for FLOOD mode on remove */ -int UseTSMODE = 0; - -IRCDVar ircd[] = { +IRCDVar myIrcd[] = { {"UltimateIRCd 2.8.*", /* ircd name */ "+S", /* nickserv mode */ "+S", /* chanserv mode */ @@ -84,7 +76,6 @@ IRCDVar ircd[] = { 1, /* UMODE */ 0, /* VHOST ON NICK */ 1, /* Change RealName */ - CHAN_HELP_IRCD_HALFOP, /* ChanServ extra */ CMODE_K, /* No Knock */ CMODE_A, /* Admin Only */ DEFAULT_MLOCK, /* Default MLOCK */ @@ -117,7 +108,7 @@ IRCDVar ircd[] = { }; -IRCDCAPAB ircdcap[] = { +IRCDCAPAB myIrcdcap[] = { { CAPAB_NOQUIT, /* NOQUIT */ 0, /* TSMODE */ @@ -151,7 +142,7 @@ IRCDCAPAB ircdcap[] = { 0, 0} }; -void anope_set_umode(User * user, int ac, char **av) +void ultiamte2_set_umode(User * user, int ac, char **av) { int add = 1; /* 1 if adding modes, 0 if deleting */ char *modes = av[0]; @@ -262,7 +253,7 @@ unsigned long umodes[128] = { 0, 0, 0, 0, 0 }; -char csmodes[128] = { +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, @@ -283,7 +274,7 @@ char csmodes[128] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -CMMode cmmodes[128] = { +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}, @@ -310,7 +301,7 @@ CMMode cmmodes[128] = { }; -CBMode cbmodes[128] = { +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}, @@ -376,7 +367,7 @@ CBMode cbmodes[128] = { {0}, {0}, {0}, {0} }; -CBModeInfo cbmodeinfos[] = { +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}, @@ -398,7 +389,7 @@ CBModeInfo cbmodeinfos[] = { {0} }; -CUMode cumodes[128] = { +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}, @@ -778,40 +769,40 @@ int anope_event_capab(char *source, int ac, char **av) return MOD_CONT; } -void anope_cmd_sqline(char *mask, char *reason) +void ultimate2_cmd_sqline(char *mask, char *reason) { send_cmd(NULL, "SQLINE %s :%s", mask, reason); } -void anope_cmd_svsnoop(char *server, int set) +void ultimate2_cmd_svsnoop(char *server, int set) { send_cmd(NULL, "SVSNOOP %s %s", server, (set ? "+" : "-")); } -void anope_cmd_svsadmin(char *server, int set) +void ultimate2_cmd_svsadmin(char *server, int set) { - anope_cmd_svsnoop(server, set); + ultimate2_cmd_svsnoop(server, set); } -void anope_cmd_remove_akill(char *user, char *host) +void ultimate2_cmd_remove_akill(char *user, char *host) { send_cmd(NULL, "RAKILL %s %s", host, user); } -void anope_cmd_topic(char *whosets, char *chan, char *whosetit, - char *topic, time_t when) +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 anope_cmd_vhost_off(User * u) +void ultimate2_cmd_vhost_off(User * u) { /* does not support removing vhosting */ } -void anope_cmd_vhost_on(char *nick, char *vIdent, char *vhost) +void ultimate2_cmd_vhost_on(char *nick, char *vIdent, char *vhost) { if (vIdent) { send_cmd(ServerName, "CHGIDENT %s %s", nick, vIdent); @@ -820,33 +811,24 @@ void anope_cmd_vhost_on(char *nick, char *vIdent, char *vhost) send_cmd(ServerName, "CHGHOST %s %s", nick, vhost); } -void anope_cmd_unsqline(char *user) +void ultimate2_cmd_unsqline(char *user) { send_cmd(NULL, "UNSQLINE %s", user); } -void anope_cmd_join(char *user, char *channel, time_t chantime) +void ultimate2_cmd_join(char *user, char *channel, time_t chantime) { send_cmd(user, "JOIN %s", channel); } -void anope_cmd_akill(char *user, char *host, char *who, time_t when, - time_t expires, char *reason) +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 anope_cmd_svskill(char *source, char *user, const char *fmt, ...) +void ultimate2_cmd_svskill(char *source, char *user, char *buf) { - 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; } @@ -854,28 +836,13 @@ void anope_cmd_svskill(char *source, char *user, const char *fmt, ...) send_cmd(source, "KILL %s :%s", user, buf); } -void anope_cmd_svsmode(User * u, int ac, char **av) +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 anope_cmd_connect(int servernum) -{ - me_server = - new_server(NULL, ServerName, ServerDesc, SERVER_ISME, NULL); - - anope_cmd_capab(); - if (servernum == 1) - anope_cmd_pass(RemotePassword); - if (servernum == 2) - anope_cmd_pass(RemotePassword2); - if (servernum == 3) - anope_cmd_pass(RemotePassword3); - anope_cmd_server(ServerName, 1, ServerDesc); -} - -void anope_cmd_capab() +void ultimate2_cmd_capab() { if (UseTokens) { send_cmd(NULL, "PROTOCTL NOQUIT TOKEN SILENCE KNOCK"); @@ -886,25 +853,40 @@ void anope_cmd_capab() /* PASS */ -void anope_cmd_pass(char *pass) +void ultimate2_cmd_pass(char *pass) { send_cmd(NULL, "PASS :%s", pass); } /* SERVER name hop descript */ -void anope_cmd_server(char *servname, int hop, char *descript) +void ultimate2_cmd_server(char *servname, int hop, char *descript) { send_cmd(NULL, "SERVER %s %d :%s", servname, hop, descript); } /* PONG */ -void anope_cmd_pong(char *servname, char *who) +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 anope_cmd_chghost(char *nick, char *vhost) +void ultimate2_cmd_chghost(char *nick, char *vhost) { if (!nick || !vhost) { return; @@ -913,7 +895,7 @@ void anope_cmd_chghost(char *nick, char *vhost) } /* CHGIDENT */ -void anope_cmd_chgident(char *nick, char *vIdent) +void ultimate2_cmd_chgident(char *nick, char *vIdent) { if (!nick || !vIdent) { return; @@ -922,7 +904,7 @@ void anope_cmd_chgident(char *nick, char *vIdent) } /* INVITE */ -void anope_cmd_invite(char *source, char *chan, char *nick) +void ultimate2_cmd_invite(char *source, char *chan, char *nick) { if (!source || !chan || !nick) { return; @@ -932,18 +914,8 @@ void anope_cmd_invite(char *source, char *chan, char *nick) } /* PART */ -void anope_cmd_part(char *nick, char *chan, const char *fmt, ...) +void ultimate2_cmd_part(char *nick, char *chan, char *buf) { - va_list args; - char buf[BUFSIZE]; - *buf = '\0'; - - if (fmt) { - va_start(args, fmt); - vsnprintf(buf, BUFSIZE - 1, fmt, args); - va_end(args); - } - if (!nick || !chan) { return; } @@ -956,7 +928,7 @@ void anope_cmd_part(char *nick, char *chan, const char *fmt, ...) } /* 391 */ -void anope_cmd_391(char *source, char *timestr) +void ultimate2_cmd_391(char *source, char *timestr) { if (!timestr) { return; @@ -965,17 +937,8 @@ void anope_cmd_391(char *source, char *timestr) } /* 250 */ -void anope_cmd_250(const char *fmt, ...) +void ultimate2_cmd_250(char *buf) { - 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; } @@ -984,17 +947,8 @@ void anope_cmd_250(const char *fmt, ...) } /* 307 */ -void anope_cmd_307(const char *fmt, ...) +void ultimate2_cmd_307(char *buf) { - 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; } @@ -1003,17 +957,8 @@ void anope_cmd_307(const char *fmt, ...) } /* 311 */ -void anope_cmd_311(const char *fmt, ...) +void ultimate2_cmd_311(char *buf) { - 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; } @@ -1022,17 +967,8 @@ void anope_cmd_311(const char *fmt, ...) } /* 312 */ -void anope_cmd_312(const char *fmt, ...) +void ultimate2_cmd_312(char *buf) { - 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; } @@ -1041,17 +977,8 @@ void anope_cmd_312(const char *fmt, ...) } /* 317 */ -void anope_cmd_317(const char *fmt, ...) +void ultimate2_cmd_317(char *buf) { - 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; } @@ -1060,7 +987,7 @@ void anope_cmd_317(const char *fmt, ...) } /* 219 */ -void anope_cmd_219(char *source, char *letter) +void ultimate2_cmd_219(char *source, char *letter) { if (!source) { return; @@ -1075,7 +1002,7 @@ void anope_cmd_219(char *source, char *letter) } /* 401 */ -void anope_cmd_401(char *source, char *who) +void ultimate2_cmd_401(char *source, char *who) { if (!source || !who) { return; @@ -1084,7 +1011,7 @@ void anope_cmd_401(char *source, char *who) } /* 318 */ -void anope_cmd_318(char *source, char *who) +void ultimate2_cmd_318(char *source, char *who) { if (!source || !who) { return; @@ -1094,17 +1021,8 @@ void anope_cmd_318(char *source, char *who) } /* 242 */ -void anope_cmd_242(const char *fmt, ...) +void ultimate2_cmd_242(char *buf) { - 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; } @@ -1113,17 +1031,8 @@ void anope_cmd_242(const char *fmt, ...) } /* 243 */ -void anope_cmd_243(const char *fmt, ...) +void ultimate2_cmd_243(char *buf) { - 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; } @@ -1132,17 +1041,8 @@ void anope_cmd_243(const char *fmt, ...) } /* 211 */ -void anope_cmd_211(const char *fmt, ...) +void ultimate2_cmd_211(char *buf) { - 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; } @@ -1151,17 +1051,8 @@ void anope_cmd_211(const char *fmt, ...) } /* GLOBOPS */ -void anope_cmd_global(char *source, const char *fmt, ...) +void ultimate2_cmd_global(char *source, char *buf) { - 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; } @@ -1170,7 +1061,7 @@ void anope_cmd_global(char *source, const char *fmt, ...) } /* SQUIT */ -void anope_cmd_squit(char *servname, char *message) +void ultimate2_cmd_squit(char *servname, char *message) { if (!servname || !message) { return; @@ -1180,7 +1071,7 @@ void anope_cmd_squit(char *servname, char *message) } /* SVSO */ -void anope_cmd_svso(char *source, char *nick, char *flag) +void ultimate2_cmd_svso(char *source, char *nick, char *flag) { if (!source || !nick || !flag) { return; @@ -1190,7 +1081,7 @@ void anope_cmd_svso(char *source, char *nick, char *flag) } /* NICK <newnick> */ -void anope_cmd_chg_nick(char *oldnick, char *newnick) +void ultimate2_cmd_chg_nick(char *oldnick, char *newnick) { if (!oldnick || !newnick) { return; @@ -1200,7 +1091,7 @@ void anope_cmd_chg_nick(char *oldnick, char *newnick) } /* SVSNICK */ -void anope_cmd_svsnick(char *source, char *guest, time_t when) +void ultimate2_cmd_svsnick(char *source, char *guest, time_t when) { if (!source || !guest) { return; @@ -1214,7 +1105,7 @@ int anope_event_ping(char *source, int ac, char **av) { if (ac < 1) return MOD_CONT; - anope_cmd_pong(ac > 1 ? av[1] : ServerName, av[0]); + ultimate2_cmd_pong(ac > 1 ? av[1] : ServerName, av[0]); return MOD_CONT; } @@ -1341,19 +1232,8 @@ int anope_event_whois(char *source, int ac, char **av) return MOD_CONT; } -void anope_cmd_kick(char *source, char *chan, char *user, const char *fmt, - ...) +void ultimate2_cmd_kick(char *source, char *chan, char *user, char *buf) { - 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) { send_cmd(source, "KICK %s %s :%s", chan, user, buf); } else { @@ -1361,17 +1241,8 @@ void anope_cmd_kick(char *source, char *chan, char *user, const char *fmt, } } -void anope_cmd_notice_ops(char *source, char *dest, const char *fmt, ...) +void ultimate2_cmd_notice_ops(char *source, char *dest, char *buf) { - 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; } @@ -1380,44 +1251,26 @@ void anope_cmd_notice_ops(char *source, char *dest, const char *fmt, ...) } -void anope_cmd_notice(char *source, char *dest, const char *fmt, ...) +void ultimate2_cmd_notice(char *source, char *dest, char *buf) { - 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; } if (UsePrivmsg) { - anope_cmd_privmsg2(source, dest, buf); + ultimate2_cmd_privmsg2(source, dest, buf); } else { send_cmd(source, "NOTICE %s :%s", dest, buf); } } -void anope_cmd_notice2(char *source, char *dest, char *msg) +void ultimate2_cmd_notice2(char *source, char *dest, char *msg) { send_cmd(source, "NOTICE %s :%s", dest, msg); } -void anope_cmd_privmsg(char *source, char *dest, const char *fmt, ...) +void ultimate2_cmd_privmsg(char *source, char *dest, char *buf) { - 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; } @@ -1425,32 +1278,32 @@ void anope_cmd_privmsg(char *source, char *dest, const char *fmt, ...) send_cmd(source, "PRIVMSG %s :%s", dest, buf); } -void anope_cmd_privmsg2(char *source, char *dest, char *msg) +void ultimate2_cmd_privmsg2(char *source, char *dest, char *msg) { send_cmd(source, "PRIVMSG %s :%s", dest, msg); } -void anope_cmd_serv_notice(char *source, char *dest, char *msg) +void ultimate2_cmd_serv_notice(char *source, char *dest, char *msg) { send_cmd(source, "NOTICE $%s :%s", dest, msg); } -void anope_cmd_serv_privmsg(char *source, char *dest, char *msg) +void ultimate2_cmd_serv_privmsg(char *source, char *dest, char *msg) { send_cmd(source, "PRIVMSG $%s :%s", dest, msg); } -void anope_cmd_nick(char *nick, char *name, char *mode) +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); - anope_cmd_sqline(nick, "Reserved for services"); + ultimate2_cmd_sqline(nick, "Reserved for services"); } -void anope_cmd_351(char *source) +void ultimate2_cmd_351(char *source) { send_cmd(ServerName, "351 %s Anope-%s %s :%s - %s -- %s", source, version_number, ServerName, ircd->name, version_flags, @@ -1458,18 +1311,8 @@ void anope_cmd_351(char *source) } /* QUIT */ -void anope_cmd_quit(char *source, const char *fmt, ...) +void ultimate2_cmd_quit(char *source, char *buf) { - 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) { send_cmd(source, "QUIT :%s", buf); } else { @@ -1477,17 +1320,8 @@ void anope_cmd_quit(char *source, const char *fmt, ...) } } -void anope_cmd_mode(char *source, char *dest, const char *fmt, ...) +void ultimate2_cmd_mode(char *source, char *dest, char *buf) { - 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; } @@ -1495,81 +1329,81 @@ void anope_cmd_mode(char *source, char *dest, const char *fmt, ...) send_cmd(source, "MODE %s %s", dest, buf); } -void anope_cmd_bot_nick(char *nick, char *user, char *host, char *real, - char *modes) +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); - anope_cmd_sqline(nick, "Reserved for services"); + ultimate2_cmd_sqline(nick, "Reserved for services"); } -void anope_cmd_372(char *source, char *msg) +void ultimate2_cmd_372(char *source, char *msg) { send_cmd(ServerName, "372 %s :- %s", source, msg); } -void anope_cmd_372_error(char *source) +void ultimate2_cmd_372_error(char *source) { send_cmd(ServerName, "422 %s :- MOTD file not found! Please " "contact your IRC administrator.", source); } -void anope_cmd_375(char *source) +void ultimate2_cmd_375(char *source) { send_cmd(ServerName, "375 %s :- %s Message of the Day", source, ServerName); } -void anope_cmd_376(char *source) +void ultimate2_cmd_376(char *source) { send_cmd(ServerName, "376 %s :End of /MOTD command.", source); } -void anope_cmd_bot_chan_mode(char *nick, char *chan) +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 anope_cmd_svshold(char *nick) +void ultimate2_cmd_svshold(char *nick) { /* Not supported by this IRCD */ } /* SVSHOLD - release */ -void anope_cmd_release_svshold(char *nick) +void ultimate2_cmd_release_svshold(char *nick) { /* Not Supported by this IRCD */ } /* UNSGLINE */ -void anope_cmd_unsgline(char *mask) +void ultimate2_cmd_unsgline(char *mask) { /* Not Supported by this IRCD */ } /* UNSZLINE */ -void anope_cmd_unszline(char *mask) +void ultimate2_cmd_unszline(char *mask) { /* Not Supported by this IRCD */ } /* SZLINE */ -void anope_cmd_szline(char *mask, char *reason, char *whom) +void ultimate2_cmd_szline(char *mask, char *reason, char *whom) { /* Not Supported by this IRCD */ } /* SGLINE */ -void anope_cmd_sgline(char *mask, char *reason) +void ultimate2_cmd_sgline(char *mask, char *reason) { /* Not Supported by this IRCD */ } -void anope_cmd_guest_nick(char *nick, char *user, char *host, char *real, - char *modes) +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); @@ -1577,34 +1411,34 @@ void anope_cmd_guest_nick(char *nick, char *user, char *host, char *real, } -void anope_cmd_unban(char *name, char *nick) +void ultimate2_cmd_unban(char *name, char *nick) { /* Not Supported by this IRCD */ } /* SVSMODE channel modes */ -void anope_cmd_svsmode_chan(char *name, char *mode, char *nick) +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 anope_cmd_svid_umode(char *nick, time_t ts) +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 anope_cmd_nc_change(User * u) +void ultimate2_cmd_nc_change(User * u) { common_svsmode(u, "-r+d", "1"); } /* SVSMODE +r */ -void anope_cmd_svid_umode2(User * u, char *ts) +void ultimate2_cmd_svid_umode2(User * u, char *ts) { if (u->svid != u->timestamp) { common_svsmode(u, "+rd", ts); @@ -1613,7 +1447,7 @@ void anope_cmd_svid_umode2(User * u, char *ts) } } -void anope_cmd_svid_umode3(User * u, char *ts) +void ultimate2_cmd_svid_umode3(User * u, char *ts) { /* not used */ } @@ -1655,7 +1489,7 @@ int anope_event_sqline(char *source, int ac, char **av) ** parv[1] - nick to make join ** parv[2] - channel(s) to join */ -void anope_cmd_svsjoin(char *source, char *nick, char *chan) +void ultimate2_cmd_svsjoin(char *source, char *nick, char *chan) { send_cmd(source, "SVSJOIN %s %s", nick, chan); } @@ -1667,17 +1501,17 @@ void anope_cmd_svsjoin(char *source, char *nick, char *chan) ** parv[1] - nick to make part ** parv[2] - channel(s) to part */ -void anope_cmd_svspart(char *source, char *nick, char *chan) +void ultimate2_cmd_svspart(char *source, char *nick, char *chan) { send_cmd(source, "SVSPART %s %s", nick, chan); } -void anope_cmd_swhois(char *source, char *who, char *mask) +void ultimate2_cmd_swhois(char *source, char *who, char *mask) { /* not supported */ } -void anope_cmd_eob() +void ultimate2_cmd_eob() { /* not supported */ } @@ -1697,7 +1531,7 @@ int anope_event_admin(char *source, int ac, char **av) return MOD_CONT; } -int anope_flood_mode_check(char *value) +int ultiamte2_flood_mode_check(char *value) { char *dp, *end; @@ -1721,20 +1555,20 @@ int anope_event_error(char *source, int ac, char **av) return MOD_CONT; } -void anope_cmd_jupe(char *jserver, char *who, char *reason) +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 : ""); - anope_cmd_squit(jserver, rbuf); - anope_cmd_server(jserver, 2, rbuf); + 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 anope_cmd_global_legacy(char *source, char *fmt) +void ultimate2_cmd_global_legacy(char *source, char *fmt) { send_cmd(source ? source : ServerName, "GLOBOPS :%s", fmt); } @@ -1743,24 +1577,16 @@ void anope_cmd_global_legacy(char *source, char *fmt) 1 = valid nick 0 = nick is in valid */ -int anope_valid_nick(char *nick) +int ultiamte2_valid_nick(char *nick) { /* no hard coded invalid nicks */ return 1; } -void anope_cmd_ctcp(char *source, char *dest, const char *fmt, ...) +void ultimate2_cmd_ctcp(char *source, char *dest, char *buf) { - va_list args; - char buf[BUFSIZE]; char *s; - *buf = '\0'; - if (fmt) { - va_start(args, fmt); - vsnprintf(buf, BUFSIZE - 1, fmt, args); - va_end(args); - } if (!buf) { return; } else { @@ -1771,4 +1597,118 @@ void anope_cmd_ctcp(char *source, char *dest, const char *fmt, ...) free(s); } -#endif + +/** + * 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_unsqline); + 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_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_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..dcbee95ec --- /dev/null +++ b/src/protocol/ultimate2.h @@ -0,0 +1,120 @@ +/* Ultimate IRCD 2 functions + * + * (C) 2003-2005 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/ultimate3.c b/src/protocol/ultimate3.c index 0489ef952..dedfb9077 100644 --- a/src/ultimate3.c +++ b/src/protocol/ultimate3.c @@ -13,19 +13,9 @@ #include "services.h" #include "pseudo.h" +#include "ultimate3.h" -#ifdef IRC_ULTIMATE3 - -const char version_protocol[] = "UltimateIRCd 3.0.0.a26+"; - -/* Not all ircds use +f for their flood/join throttle system */ -const char flood_mode_char_set[] = ""; /* mode char for FLOOD mode on set */ -const char flood_mode_char_remove[] = ""; /* mode char for FLOOD mode on remove */ - -int UseTSMODE = 0; - - -IRCDVar ircd[] = { +IRCDVar myIrcd[] = { {"UltimateIRCd 3.0.*", /* ircd name */ "+S", /* nickserv mode */ "+S", /* chanserv mode */ @@ -86,7 +76,6 @@ IRCDVar ircd[] = { 1, /* UMODE */ 1, /* VHOST ON NICK */ 0, /* Change RealName */ - CHAN_HELP_ULTIMATE3, /* ChanServ extra */ CMODE_K, /* No Knock */ CMODE_A, /* Admin Only */ DEFAULT_MLOCK, /* Default MLOCK */ @@ -113,11 +102,12 @@ IRCDVar ircd[] = { 0, /* p10 */ NULL, /* character set */ 1, /* reports sync state */ - }, + } + , {NULL} }; -IRCDCAPAB ircdcap[] = { +IRCDCAPAB myIrcdcap[] = { { CAPAB_NOQUIT, /* NOQUIT */ CAPAB_TSMODE, /* TSMODE */ @@ -150,7 +140,7 @@ IRCDCAPAB ircdcap[] = { 0, 0, 0} }; -void anope_set_umode(User * user, int ac, char **av) +void ultimate3_set_umode(User * user, int ac, char **av) { int add = 1; /* 1 if adding modes, 0 if deleting */ char *modes = av[0]; @@ -292,7 +282,7 @@ unsigned long umodes[128] = { }; -char csmodes[128] = { +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, @@ -314,7 +304,7 @@ char csmodes[128] = { }; -CMMode cmmodes[128] = { +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}, @@ -341,7 +331,7 @@ CMMode cmmodes[128] = { }; -CBMode cbmodes[128] = { +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}, @@ -407,7 +397,7 @@ CBMode cbmodes[128] = { {0}, {0}, {0}, {0} }; -CBModeInfo cbmodeinfos[] = { +CBModeInfo myCbmodeinfos[] = { {'c', CMODE_c, 0, NULL, NULL}, {'i', CMODE_i, 0, NULL, NULL}, {'k', CMODE_k, 0, get_key, cs_get_key}, @@ -429,7 +419,7 @@ CBModeInfo cbmodeinfos[] = { {0} }; -CUMode cumodes[128] = { +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}, @@ -477,15 +467,15 @@ CUMode cumodes[128] = { }; /* SVSMODE -b */ -void anope_cmd_unban(char *name, char *nick) +void ultimate3_cmd_unban(char *name, char *nick) { - anope_cmd_svsmode_chan(name, "-b", nick); + ultimate3_cmd_svsmode_chan(name, "-b", nick); } /* SVSMODE channel modes */ -void anope_cmd_svsmode_chan(char *name, char *mode, char *nick) +void ultimate3_cmd_svsmode_chan(char *name, char *mode, char *nick) { if (nick) { send_cmd(ServerName, "SVSMODE %s %s %s", name, mode, nick); @@ -665,7 +655,7 @@ void moduleAddIRCDMsgs(void) { /* *INDENT-ON* */ -void anope_cmd_sqline(char *mask, char *reason) +void ultimate3_cmd_sqline(char *mask, char *reason) { if (!mask || !reason) { return; @@ -674,12 +664,12 @@ void anope_cmd_sqline(char *mask, char *reason) send_cmd(NULL, "SQLINE %s :%s", mask, reason); } -void anope_cmd_unsgline(char *mask) +void ultimate3_cmd_unsgline(char *mask) { send_cmd(NULL, "UNSGLINE 0 :%s", mask); } -void anope_cmd_unszline(char *mask) +void ultimate3_cmd_unszline(char *mask) { send_cmd(NULL, "UNSZLINE 0 %s", mask); } @@ -689,7 +679,7 @@ void anope_cmd_unszline(char *mask) 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 anope_cmd_szline(char *mask, char *reason, char *whom) +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); @@ -697,61 +687,52 @@ void anope_cmd_szline(char *mask, char *reason, char *whom) /* send_cmd(NULL, "SZLINE %s :%s", mask, reason); */ } -void anope_cmd_svsnoop(char *server, int set) +void ultimate3_cmd_svsnoop(char *server, int set) { send_cmd(NULL, "SVSNOOP %s %s", server, (set ? "+" : "-")); } -void anope_cmd_svsadmin(char *server, int set) +void ultimate3_cmd_svsadmin(char *server, int set) { - anope_cmd_svsnoop(server, set); + ultimate3_cmd_svsnoop(server, set); } -void anope_cmd_sgline(char *mask, char *reason) +void ultimate3_cmd_sgline(char *mask, char *reason) { send_cmd(NULL, "SGLINE %d :%s:%s", strlen(mask), mask, reason); } -void anope_cmd_remove_akill(char *user, char *host) +void ultimate3_cmd_remove_akill(char *user, char *host) { send_cmd(NULL, "RAKILL %s %s", host, user); } -void anope_cmd_vhost_off(User * u) +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 anope_cmd_vhost_on(char *nick, char *vIdent, char *vhost) +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 anope_cmd_join(char *user, char *channel, time_t chantime) +void ultimate3_cmd_join(char *user, char *channel, time_t chantime) { send_cmd(user, "SJOIN %ld %s", (long int) chantime, channel); } -void anope_cmd_akill(char *user, char *host, char *who, time_t when, - time_t expires, char *reason) +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 anope_cmd_svskill(char *source, char *user, const char *fmt, ...) +void ultimate3_cmd_svskill(char *source, char *user, char *buf) { - 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; } @@ -760,7 +741,7 @@ void anope_cmd_svskill(char *source, char *user, const char *fmt, ...) } -void anope_cmd_svsmode(User * u, int ac, char **av) +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 ? " " : ""), @@ -783,7 +764,7 @@ int anope_event_ping(char *source, int ac, char **av) { if (ac < 1) return MOD_CONT; - anope_cmd_pong(ac > 1 ? av[1] : ServerName, av[0]); + ultimate3_cmd_pong(ac > 1 ? av[1] : ServerName, av[0]); return MOD_CONT; } @@ -1039,62 +1020,53 @@ int anope_event_whois(char *source, int ac, char **av) return MOD_CONT; } -void anope_cmd_topic(char *whosets, char *chan, char *whosetit, - char *topic, time_t when) +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 anope_cmd_372(char *source, char *msg) +void ultimate3_cmd_372(char *source, char *msg) { send_cmd(ServerName, "372 %s :- %s", source, msg); } -void anope_cmd_372_error(char *source) +void ultimate3_cmd_372_error(char *source) { send_cmd(ServerName, "422 %s :- MOTD file not found! Please " "contact your IRC administrator.", source); } -void anope_cmd_375(char *source) +void ultimate3_cmd_375(char *source) { send_cmd(ServerName, "375 %s :- %s Message of the Day", source, ServerName); } -void anope_cmd_376(char *source) +void ultimate3_cmd_376(char *source) { send_cmd(ServerName, "376 %s :End of /MOTD command.", source); } -void anope_cmd_nick(char *nick, char *name, char *modes) +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); - anope_cmd_sqline(nick, "Reserved for services"); + ultimate3_cmd_sqline(nick, "Reserved for services"); } -void anope_cmd_guest_nick(char *nick, char *user, char *host, char *real, - char *modes) +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 anope_cmd_mode(char *source, char *dest, const char *fmt, ...) +void ultimate3_cmd_mode(char *source, char *dest, char *buf) { - 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; } @@ -1102,28 +1074,17 @@ void anope_cmd_mode(char *source, char *dest, const char *fmt, ...) send_cmd(source, "MODE %s %s", dest, buf); } -void anope_cmd_bot_nick(char *nick, char *user, char *host, char *real, - char *modes) +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); - anope_cmd_sqline(nick, "Reserved for services"); + ultimate3_cmd_sqline(nick, "Reserved for services"); } -void anope_cmd_kick(char *source, char *chan, char *user, const char *fmt, - ...) +void ultimate3_cmd_kick(char *source, char *chan, char *user, char *buf) { - 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) { send_cmd(source, "KICK %s %s :%s", chan, user, buf); } else { @@ -1131,17 +1092,8 @@ void anope_cmd_kick(char *source, char *chan, char *user, const char *fmt, } } -void anope_cmd_notice_ops(char *source, char *dest, const char *fmt, ...) +void ultimate3_cmd_notice_ops(char *source, char *dest, char *buf) { - 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; } @@ -1150,44 +1102,26 @@ void anope_cmd_notice_ops(char *source, char *dest, const char *fmt, ...) } -void anope_cmd_notice(char *source, char *dest, const char *fmt, ...) +void ultimate3_cmd_notice(char *source, char *dest, char *buf) { - 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; } if (UsePrivmsg) { - anope_cmd_privmsg2(source, dest, buf); + ultimate3_cmd_privmsg2(source, dest, buf); } else { send_cmd(source, "NOTICE %s :%s", dest, buf); } } -void anope_cmd_notice2(char *source, char *dest, char *msg) +void ultimate3_cmd_notice2(char *source, char *dest, char *msg) { send_cmd(source, "NOTICE %s :%s", dest, msg); } -void anope_cmd_privmsg(char *source, char *dest, const char *fmt, ...) +void ultimate3_cmd_privmsg(char *source, char *dest, char *buf) { - 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; } @@ -1195,27 +1129,27 @@ void anope_cmd_privmsg(char *source, char *dest, const char *fmt, ...) send_cmd(source, "PRIVMSG %s :%s", dest, buf); } -void anope_cmd_privmsg2(char *source, char *dest, char *msg) +void ultimate3_cmd_privmsg2(char *source, char *dest, char *msg) { send_cmd(source, "PRIVMSG %s :%s", dest, msg); } -void anope_cmd_serv_notice(char *source, char *dest, char *msg) +void ultimate3_cmd_serv_notice(char *source, char *dest, char *msg) { send_cmd(source, "NOTICE $%s :%s", dest, msg); } -void anope_cmd_serv_privmsg(char *source, char *dest, char *msg) +void ultimate3_cmd_serv_privmsg(char *source, char *dest, char *msg) { send_cmd(source, "PRIVMSG $%s :%s", dest, msg); } -void anope_cmd_bot_chan_mode(char *nick, char *chan) +void ultimate3_cmd_bot_chan_mode(char *nick, char *chan) { anope_cmd_mode(nick, chan, "%s %s %s", ircd->botchanumode, nick, nick); } -void anope_cmd_351(char *source) +void ultimate3_cmd_351(char *source) { send_cmd(ServerName, "351 %s Anope-%s %s :%s - %s -- %s", source, version_number, ServerName, ircd->name, version_flags, @@ -1223,17 +1157,8 @@ void anope_cmd_351(char *source) } /* QUIT */ -void anope_cmd_quit(char *source, const char *fmt, ...) +void ultimate3_cmd_quit(char *source, char *buf) { - 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; } @@ -1246,33 +1171,33 @@ void anope_cmd_quit(char *source, const char *fmt, ...) } /* PROTOCTL */ -void anope_cmd_capab() +void ultimate3_cmd_capab() { send_cmd(NULL, "CAPAB TS5 NOQUIT SSJ5 BURST UNCONNECT TSMODE NICKIP CLIENT"); } /* PASS */ -void anope_cmd_pass(char *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 anope_cmd_server(char *servname, int hop, char *descript) +void ultimate3_cmd_server(char *servname, int hop, char *descript) { send_cmd(NULL, "SERVER %s %d :%s", servname, hop, descript); } /* PONG */ -void anope_cmd_pong(char *servname, char *who) +void ultimate3_cmd_pong(char *servname, char *who) { send_cmd(servname, "PONG %s", who); } /* UNSQLINE */ -void anope_cmd_unsqline(char *user) +void ultimate3_cmd_unsqline(char *user) { if (!user) { return; @@ -1281,7 +1206,7 @@ void anope_cmd_unsqline(char *user) } /* CHGHOST */ -void anope_cmd_chghost(char *nick, char *vhost) +void ultimate3_cmd_chghost(char *nick, char *vhost) { if (!nick || !vhost) { return; @@ -1290,7 +1215,7 @@ void anope_cmd_chghost(char *nick, char *vhost) } /* CHGIDENT */ -void anope_cmd_chgident(char *nick, char *vIdent) +void ultimate3_cmd_chgident(char *nick, char *vIdent) { if (!nick || !vIdent) { return; @@ -1299,7 +1224,7 @@ void anope_cmd_chgident(char *nick, char *vIdent) } /* INVITE */ -void anope_cmd_invite(char *source, char *chan, char *nick) +void ultimate3_cmd_invite(char *source, char *chan, char *nick) { if (!source || !chan || !nick) { return; @@ -1309,17 +1234,8 @@ void anope_cmd_invite(char *source, char *chan, char *nick) } /* PART */ -void anope_cmd_part(char *nick, char *chan, const char *fmt, ...) +void ultimate3_cmd_part(char *nick, char *chan, char *buf) { - va_list args; - char buf[BUFSIZE]; - *buf = '\0'; - - if (fmt) { - va_start(args, fmt); - vsnprintf(buf, BUFSIZE - 1, fmt, args); - va_end(args); - } if (!nick || !chan) { return; @@ -1333,7 +1249,7 @@ void anope_cmd_part(char *nick, char *chan, const char *fmt, ...) } /* 391 */ -void anope_cmd_391(char *source, char *timestr) +void ultimate3_cmd_391(char *source, char *timestr) { if (!timestr) { return; @@ -1342,17 +1258,8 @@ void anope_cmd_391(char *source, char *timestr) } /* 250 */ -void anope_cmd_250(const char *fmt, ...) +void ultimate3_cmd_250(char *buf) { - 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; } @@ -1361,17 +1268,8 @@ void anope_cmd_250(const char *fmt, ...) } /* 307 */ -void anope_cmd_307(const char *fmt, ...) +void ultimate3_cmd_307(char *buf) { - 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; } @@ -1380,17 +1278,8 @@ void anope_cmd_307(const char *fmt, ...) } /* 311 */ -void anope_cmd_311(const char *fmt, ...) +void ultimate3_cmd_311(char *buf) { - 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; } @@ -1399,17 +1288,8 @@ void anope_cmd_311(const char *fmt, ...) } /* 312 */ -void anope_cmd_312(const char *fmt, ...) +void ultimate3_cmd_312(char *buf) { - 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; } @@ -1418,17 +1298,8 @@ void anope_cmd_312(const char *fmt, ...) } /* 317 */ -void anope_cmd_317(const char *fmt, ...) +void ultimate3_cmd_317(char *buf) { - 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; } @@ -1437,7 +1308,7 @@ void anope_cmd_317(const char *fmt, ...) } /* 219 */ -void anope_cmd_219(char *source, char *letter) +void ultimate3_cmd_219(char *source, char *letter) { if (!source) { return; @@ -1452,7 +1323,7 @@ void anope_cmd_219(char *source, char *letter) } /* 401 */ -void anope_cmd_401(char *source, char *who) +void ultimate3_cmd_401(char *source, char *who) { if (!source || !who) { return; @@ -1461,7 +1332,7 @@ void anope_cmd_401(char *source, char *who) } /* 318 */ -void anope_cmd_318(char *source, char *who) +void ultimate3_cmd_318(char *source, char *who) { if (!source || !who) { return; @@ -1471,17 +1342,8 @@ void anope_cmd_318(char *source, char *who) } /* 242 */ -void anope_cmd_242(const char *fmt, ...) +void ultimate3_cmd_242(char *buf) { - 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; } @@ -1490,17 +1352,8 @@ void anope_cmd_242(const char *fmt, ...) } /* 243 */ -void anope_cmd_243(const char *fmt, ...) +void ultimate3_cmd_243(char *buf) { - 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; } @@ -1509,17 +1362,8 @@ void anope_cmd_243(const char *fmt, ...) } /* 211 */ -void anope_cmd_211(const char *fmt, ...) +void ultimate3_cmd_211(char *buf) { - 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; } @@ -1528,17 +1372,8 @@ void anope_cmd_211(const char *fmt, ...) } /* GLOBOPS */ -void anope_cmd_global(char *source, const char *fmt, ...) +void ultimate3_cmd_global(char *source, char *buf) { - 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; } @@ -1547,7 +1382,7 @@ void anope_cmd_global(char *source, const char *fmt, ...) } /* SQUIT */ -void anope_cmd_squit(char *servname, char *message) +void ultimate3_cmd_squit(char *servname, char *message) { if (!servname || !message) { return; @@ -1557,7 +1392,7 @@ void anope_cmd_squit(char *servname, char *message) } /* SVSO */ -void anope_cmd_svso(char *source, char *nick, char *flag) +void ultimate3_cmd_svso(char *source, char *nick, char *flag) { if (!source || !nick || !flag) { return; @@ -1567,7 +1402,7 @@ void anope_cmd_svso(char *source, char *nick, char *flag) } /* NICK <newnick> */ -void anope_cmd_chg_nick(char *oldnick, char *newnick) +void ultimate3_cmd_chg_nick(char *oldnick, char *newnick) { if (!oldnick || !newnick) { return; @@ -1577,7 +1412,7 @@ void anope_cmd_chg_nick(char *oldnick, char *newnick) } /* SVSNICK */ -void anope_cmd_svsnick(char *source, char *guest, time_t when) +void ultimate3_cmd_svsnick(char *source, char *guest, time_t when) { if (!source || !guest) { return; @@ -1586,42 +1421,60 @@ void anope_cmd_svsnick(char *source, char *guest, time_t 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 anope_cmd_connect(int servernum) +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) { - anope_cmd_pass(RemotePassword); + ultimate3_cmd_pass(RemotePassword); } if (servernum == 2) { - anope_cmd_pass(RemotePassword2); + ultimate3_cmd_pass(RemotePassword2); } if (servernum == 3) { - anope_cmd_pass(RemotePassword3); + ultimate3_cmd_pass(RemotePassword3); } - anope_cmd_capab(); - anope_cmd_server(ServerName, 1, ServerDesc); - anope_cmd_svinfo(); - anope_cmd_burst(); + ultimate3_cmd_capab(); + ultimate3_cmd_server(ServerName, 1, ServerDesc); + ultimate3_cmd_svinfo(); + ultimate3_cmd_burst(); } /* SVSHOLD - set */ -void anope_cmd_svshold(char *nick) +void ultimate3_cmd_svshold(char *nick) { /* Not supported by this IRCD */ } /* SVSHOLD - release */ -void anope_cmd_release_svshold(char *nick) +void ultimate3_cmd_release_svshold(char *nick) { /* Not Supported by this IRCD */ } /* SVSMODE +d */ /* sent if svid is something weird */ -void anope_cmd_svid_umode(char *nick, time_t ts) +void ultimate3_cmd_svid_umode(char *nick, time_t ts) { send_cmd(ServerName, "SVSMODE %s %lu +d 1", nick, (unsigned long int) ts); @@ -1629,18 +1482,18 @@ void anope_cmd_svid_umode(char *nick, time_t ts) /* SVSMODE +d */ /* nc_change was = 1, and there is no na->status */ -void anope_cmd_nc_change(User * u) +void ultimate3_cmd_nc_change(User * u) { common_svsmode(u, "+d", "1"); } /* SVSMODE +d */ -void anope_cmd_svid_umode2(User * u, char *ts) +void ultimate3_cmd_svid_umode2(User * u, char *ts) { /* not used by bahamut ircds */ } -void anope_cmd_svid_umode3(User * u, char *ts) +void ultimate3_cmd_svid_umode3(User * u, char *ts) { if (u->svid != u->timestamp) { common_svsmode(u, "+rd", ts); @@ -1656,19 +1509,6 @@ int anope_event_svinfo(char *source, int ac, char **av) return MOD_CONT; } -/* - * 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 anope_cmd_svinfo() -{ - send_cmd(NULL, "SVINFO 5 3 0 :%ld", (long int) time(NULL)); -} - int anope_event_pass(char *source, int ac, char **av) { /* currently not used but removes the message : unknown message from server */ @@ -1699,32 +1539,27 @@ int anope_event_sqline(char *source, int ac, char **av) return MOD_CONT; } -void anope_cmd_svsjoin(char *source, char *nick, char *chan) +void ultimate3_cmd_svsjoin(char *source, char *nick, char *chan) { /* Not Supported by this IRCD */ } -void anope_cmd_svspart(char *source, char *nick, char *chan) +void ultimate3_cmd_svspart(char *source, char *nick, char *chan) { /* Not Supported by this IRCD */ } -void anope_cmd_swhois(char *source, char *who, char *mask) +void ultimate3_cmd_swhois(char *source, char *who, char *mask) { /* not supported */ } -void anope_cmd_eob() +void ultimate3_cmd_eob() { send_cmd(NULL, "BURST 0"); } -void anope_cmd_burst() -{ - send_cmd(NULL, "BURST"); -} - int anope_event_error(char *source, int ac, char **av) { if (ac >= 1) { @@ -1798,25 +1633,25 @@ int anope_event_invite(char *source, int ac, char **av) return MOD_CONT; } -int anope_flood_mode_check(char *value) +int ultiamte3_flood_mode_check(char *value) { return 0; } -void anope_cmd_jupe(char *jserver, char *who, char *reason) +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 : ""); - anope_cmd_squit(jserver, rbuf); - anope_cmd_server(jserver, 2, rbuf); + 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 anope_cmd_global_legacy(char *source, char *fmt) +void ultimate3_cmd_global_legacy(char *source, char *fmt) { send_cmd(source ? source : ServerName, "GLOBOPS :%s", fmt); } @@ -1825,24 +1660,16 @@ void anope_cmd_global_legacy(char *source, char *fmt) 1 = valid nick 0 = nick is in valid */ -int anope_valid_nick(char *nick) +int ultiamte3_valid_nick(char *nick) { /* no hard coded invalid nicks */ return 1; } -void anope_cmd_ctcp(char *source, char *dest, const char *fmt, ...) +void ultimate3_cmd_ctcp(char *source, char *dest, char *buf) { - va_list args; - char buf[BUFSIZE]; char *s; - *buf = '\0'; - if (fmt) { - va_start(args, fmt); - vsnprintf(buf, BUFSIZE - 1, fmt, args); - va_end(args); - } if (!buf) { return; } else { @@ -1853,4 +1680,118 @@ void anope_cmd_ctcp(char *source, char *dest, const char *fmt, ...) free(s); } -#endif + +/** + * 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_unsqline); + 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_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_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..6acced7f2 --- /dev/null +++ b/src/protocol/ultimate3.h @@ -0,0 +1,125 @@ +/* Ultimate IRCD 3.0 functions + * + * (C) 2003-2005 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/unreal31.c b/src/protocol/unreal31.c index d8db1d259..4af96c5a3 100644 --- a/src/unreal31.c +++ b/src/protocol/unreal31.c @@ -15,18 +15,9 @@ #include "services.h" #include "pseudo.h" +#include "unreal31.h" -#ifdef IRC_UNREAL31 - -const char version_protocol[] = "UnrealIRCd 3.1.1+"; - -/* Not all ircds use +f for their flood/join throttle system */ -const char flood_mode_char_set[] = "+f"; /* mode char for FLOOD mode on set */ -const char flood_mode_char_remove[] = "-f"; /* mode char for FLOOD mode on remove */ - -int UseTSMODE = 0; - -IRCDVar ircd[] = { +IRCDVar myIrcd[] = { {"UnrealIRCd 3.1.x", /* ircd name */ "+oS", /* nickserv mode */ "+oS", /* chanserv mode */ @@ -87,7 +78,6 @@ IRCDVar ircd[] = { 1, /* UMODE */ 1, /* VHOST ON NICK */ 1, /* Change RealName */ - CHAN_HELP_UNREAL, /* ChanServ extra */ CMODE_K, /* No Knock */ CMODE_A, /* Admin Only */ DEFAULT_MLOCK, /* Default MLOCK */ @@ -114,12 +104,13 @@ IRCDVar ircd[] = { 0, /* p10 */ NULL, /* character set */ 0, /* reports sync state */ - }, + } + , {NULL} }; -IRCDCAPAB ircdcap[] = { +IRCDCAPAB myIrcdcap[] = { { CAPAB_NOQUIT, /* NOQUIT */ 0, /* TSMODE */ @@ -177,7 +168,7 @@ unsigned long umodes[128] = { }; -char csmodes[128] = { +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, @@ -199,7 +190,7 @@ char csmodes[128] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'a', 0 }; -CMMode cmmodes[128] = { +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}, @@ -227,7 +218,7 @@ CMMode cmmodes[128] = { -CBMode cbmodes[128] = { +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}, @@ -293,7 +284,7 @@ CBMode cbmodes[128] = { {0}, {0}, {0}, {0} }; -CBModeInfo cbmodeinfos[] = { +CBModeInfo myCbmodeinfos[] = { {'c', CMODE_c, 0, NULL, NULL}, {'f', CMODE_f, 0, get_flood, cs_get_flood}, {'i', CMODE_i, 0, NULL, NULL}, @@ -322,7 +313,7 @@ CBModeInfo cbmodeinfos[] = { {0} }; -CUMode cumodes[128] = { +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}, @@ -370,7 +361,7 @@ CUMode cumodes[128] = { }; -void anope_set_umode(User * user, int ac, char **av) +void unreal_set_umode(User * user, int ac, char **av) { int add = 1; /* 1 if adding modes, 0 if deleting */ char *modes = av[0]; @@ -492,52 +483,43 @@ int anope_event_capab(char *source, int ac, char **av) return MOD_CONT; } -void anope_cmd_svsnoop(char *server, int set) +void unreal_cmd_svsnoop(char *server, int set) { send_cmd(NULL, "SVSNOOP %s %s", server, (set ? "+" : "-")); } -void anope_cmd_svsadmin(char *server, int set) +void unreal_cmd_svsadmin(char *server, int set) { - anope_cmd_svsnoop(server, set); + unreal_cmd_svsnoop(server, set); } -void anope_cmd_remove_akill(char *user, char *host) +void unreal_cmd_remove_akill(char *user, char *host) { send_cmd(NULL, "TKL - G %s %s %s", user, host, s_OperServ); } -void anope_cmd_topic(char *whosets, char *chan, char *whosetit, - char *topic, time_t when) +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 anope_cmd_vhost_off(User * u) +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 anope_cmd_akill(char *user, char *host, char *who, time_t when, - time_t expires, char *reason) +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 anope_cmd_svskill(char *source, char *user, const char *fmt, ...) +void unreal_cmd_svskill(char *source, char *user, char *buf) { - 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; } @@ -546,69 +528,56 @@ void anope_cmd_svskill(char *source, char *user, const char *fmt, ...) return; } - va_start(args, fmt); - vsnprintf(buf, sizeof(buf), fmt, args); - va_end(args); - send_cmd(source, "SVSKILL %s :%s", user, buf); } -void anope_cmd_svsmode(User * u, int ac, char **av) +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 anope_cmd_372(char *source, char *msg) +void unreal_cmd_372(char *source, char *msg) { send_cmd(ServerName, "372 %s :- %s", source, msg); } -void anope_cmd_372_error(char *source) +void unreal_cmd_372_error(char *source) { send_cmd(ServerName, "422 %s :- MOTD file not found! Please " "contact your IRC administrator.", source); } -void anope_cmd_375(char *source) +void unreal_cmd_375(char *source) { send_cmd(ServerName, "375 %s :- %s Message of the Day", source, ServerName); } -void anope_cmd_376(char *source) +void unreal_cmd_376(char *source) { send_cmd(ServerName, "376 %s :End of /MOTD command.", source); } -void anope_cmd_nick(char *nick, char *name, char *modes) +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); - anope_cmd_sqline(nick, "Reserved for services"); + unreal_cmd_sqline(nick, "Reserved for services"); } -void anope_cmd_guest_nick(char *nick, char *user, char *host, char *real, - char *modes) +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 anope_cmd_mode(char *source, char *dest, const char *fmt, ...) +void unreal_cmd_mode(char *source, char *dest, char *buf) { - 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; } @@ -616,28 +585,17 @@ void anope_cmd_mode(char *source, char *dest, const char *fmt, ...) send_cmd(source, "MODE %s %s", dest, buf); } -void anope_cmd_bot_nick(char *nick, char *user, char *host, char *real, - char *modes) +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); - anope_cmd_sqline(nick, "Reserved for services"); + unreal_cmd_sqline(nick, "Reserved for services"); } -void anope_cmd_kick(char *source, char *chan, char *user, const char *fmt, - ...) +void unreal_cmd_kick(char *source, char *chan, char *user, char *buf) { - 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) { send_cmd(source, "KICK %s %s :%s", chan, user, buf); } else { @@ -645,17 +603,8 @@ void anope_cmd_kick(char *source, char *chan, char *user, const char *fmt, } } -void anope_cmd_notice_ops(char *source, char *dest, const char *fmt, ...) +void unreal_cmd_notice_ops(char *source, char *dest, char *buf) { - 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; } @@ -664,44 +613,26 @@ void anope_cmd_notice_ops(char *source, char *dest, const char *fmt, ...) } -void anope_cmd_notice(char *source, char *dest, const char *fmt, ...) +void unreal_cmd_notice(char *source, char *dest, char *buf) { - 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; } if (UsePrivmsg) { - anope_cmd_privmsg2(source, dest, buf); + unreal_cmd_privmsg2(source, dest, buf); } else { send_cmd(source, "NOTICE %s :%s", dest, buf); } } -void anope_cmd_notice2(char *source, char *dest, char *msg) +void unreal_cmd_notice2(char *source, char *dest, char *msg) { send_cmd(source, "NOTICE %s :%s", dest, msg); } -void anope_cmd_privmsg(char *source, char *dest, const char *fmt, ...) +void unreal_cmd_privmsg(char *source, char *dest, char *buf) { - 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; } @@ -709,28 +640,28 @@ void anope_cmd_privmsg(char *source, char *dest, const char *fmt, ...) send_cmd(source, "PRIVMSG %s :%s", dest, buf); } -void anope_cmd_privmsg2(char *source, char *dest, char *msg) +void unreal_cmd_privmsg2(char *source, char *dest, char *msg) { send_cmd(source, "PRIVMSG %s :%s", dest, msg); } -void anope_cmd_serv_notice(char *source, char *dest, char *msg) +void unreal_cmd_serv_notice(char *source, char *dest, char *msg) { send_cmd(source, "NOTICE $%s :%s", dest, msg); } -void anope_cmd_serv_privmsg(char *source, char *dest, char *msg) +void unreal_cmd_serv_privmsg(char *source, char *dest, char *msg) { send_cmd(source, "PRIVMSG $%s :%s", dest, msg); } -void anope_cmd_bot_chan_mode(char *nick, char *chan) +void unreal_cmd_bot_chan_mode(char *nick, char *chan) { anope_cmd_mode(nick, chan, "%s %s %s", ircd->botchanumode, nick, nick); } -void anope_cmd_351(char *source) +void unreal_cmd_351(char *source) { send_cmd(ServerName, "351 %s Anope-%s %s :%s - %s -- %s", source, version_number, ServerName, ircd->name, version_flags, @@ -738,18 +669,8 @@ void anope_cmd_351(char *source) } /* QUIT */ -void anope_cmd_quit(char *source, const char *fmt, ...) +void unreal_cmd_quit(char *source, char *buf) { - 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) { send_cmd(source, "QUIT :%s", buf); } else { @@ -758,7 +679,7 @@ void anope_cmd_quit(char *source, const char *fmt, ...) } /* PROTOCTL */ -void anope_cmd_protoctl() +void unreal_cmd_protoctl() { /* See Unreal's protoctl.txt for reference @@ -768,20 +689,20 @@ void anope_cmd_protoctl() } /* PASS */ -void anope_cmd_pass(char *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 anope_cmd_server(char *servname, int hop, char *descript) +void unreal_cmd_server(char *servname, int hop, char *descript) { send_cmd(NULL, "SERVER %s %d :%s", servname, hop, descript); } /* PONG */ -void anope_cmd_pong(char *servname, char *who) +void unreal_cmd_pong(char *servname, char *who) { send_cmd(servname, "PONG %s", who); } @@ -789,13 +710,13 @@ void anope_cmd_pong(char *servname, char *who) /* JOIN */ /* Althought Unreal 3.2 does not need the timestamp others do so we get it in the common function call */ -void anope_cmd_join(char *user, char *channel, time_t chantime) +void unreal_cmd_join(char *user, char *channel, time_t chantime) { send_cmd(user, "JOIN %s", channel); } /* UNSQLINE */ -void anope_cmd_unsqline(char *user) +void unreal_cmd_unsqline(char *user) { if (!user) { return; @@ -804,7 +725,7 @@ void anope_cmd_unsqline(char *user) } /* CHGHOST */ -void anope_cmd_chghost(char *nick, char *vhost) +void unreal_cmd_chghost(char *nick, char *vhost) { if (!nick || !vhost) { return; @@ -813,7 +734,7 @@ void anope_cmd_chghost(char *nick, char *vhost) } /* CHGIDENT */ -void anope_cmd_chgident(char *nick, char *vIdent) +void unreal_cmd_chgident(char *nick, char *vIdent) { if (!nick || !vIdent) { return; @@ -822,7 +743,7 @@ void anope_cmd_chgident(char *nick, char *vIdent) } /* INVITE */ -void anope_cmd_invite(char *source, char *chan, char *nick) +void unreal_cmd_invite(char *source, char *chan, char *nick) { if (!source || !chan || !nick) { return; @@ -832,18 +753,8 @@ void anope_cmd_invite(char *source, char *chan, char *nick) } /* PART */ -void anope_cmd_part(char *nick, char *chan, const char *fmt, ...) +void unreal_cmd_part(char *nick, char *chan, char *buf) { - va_list args; - char buf[BUFSIZE]; - *buf = '\0'; - - if (fmt) { - va_start(args, fmt); - vsnprintf(buf, BUFSIZE - 1, fmt, args); - va_end(args); - } - if (!nick || !chan) { return; } @@ -856,7 +767,7 @@ void anope_cmd_part(char *nick, char *chan, const char *fmt, ...) } /* 391 */ -void anope_cmd_391(char *source, char *timestr) +void unreal_cmd_391(char *source, char *timestr) { if (!timestr) { return; @@ -865,17 +776,8 @@ void anope_cmd_391(char *source, char *timestr) } /* 250 */ -void anope_cmd_250(const char *fmt, ...) +void unreal_cmd_250(char *buf) { - 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; } @@ -884,17 +786,8 @@ void anope_cmd_250(const char *fmt, ...) } /* 307 */ -void anope_cmd_307(const char *fmt, ...) +void unreal_cmd_307(char *buf) { - 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; } @@ -903,17 +796,8 @@ void anope_cmd_307(const char *fmt, ...) } /* 311 */ -void anope_cmd_311(const char *fmt, ...) +void unreal_cmd_311(char *buf) { - 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; } @@ -922,17 +806,8 @@ void anope_cmd_311(const char *fmt, ...) } /* 312 */ -void anope_cmd_312(const char *fmt, ...) +void unreal_cmd_312(char *buf) { - 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; } @@ -941,17 +816,8 @@ void anope_cmd_312(const char *fmt, ...) } /* 317 */ -void anope_cmd_317(const char *fmt, ...) +void unreal_cmd_317(char *buf) { - 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; } @@ -960,7 +826,7 @@ void anope_cmd_317(const char *fmt, ...) } /* 219 */ -void anope_cmd_219(char *source, char *letter) +void unreal_cmd_219(char *source, char *letter) { if (!source) { return; @@ -975,7 +841,7 @@ void anope_cmd_219(char *source, char *letter) } /* 401 */ -void anope_cmd_401(char *source, char *who) +void unreal_cmd_401(char *source, char *who) { if (!source || !who) { return; @@ -984,7 +850,7 @@ void anope_cmd_401(char *source, char *who) } /* 318 */ -void anope_cmd_318(char *source, char *who) +void unreal_cmd_318(char *source, char *who) { if (!source || !who) { return; @@ -994,17 +860,8 @@ void anope_cmd_318(char *source, char *who) } /* 242 */ -void anope_cmd_242(const char *fmt, ...) +void unreal_cmd_242(char *buf) { - 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; } @@ -1013,17 +870,8 @@ void anope_cmd_242(const char *fmt, ...) } /* 243 */ -void anope_cmd_243(const char *fmt, ...) +void unreal_cmd_243(char *buf) { - 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; } @@ -1032,17 +880,8 @@ void anope_cmd_243(const char *fmt, ...) } /* 211 */ -void anope_cmd_211(const char *fmt, ...) +void unreal_cmd_211(char *buf) { - 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; } @@ -1051,17 +890,8 @@ void anope_cmd_211(const char *fmt, ...) } /* GLOBOPS */ -void anope_cmd_global(char *source, const char *fmt, ...) +void unreal_cmd_global(char *source, char *buf) { - 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; } @@ -1070,7 +900,7 @@ void anope_cmd_global(char *source, const char *fmt, ...) } /* SQLINE */ -void anope_cmd_sqline(char *mask, char *reason) +void unreal_cmd_sqline(char *mask, char *reason) { if (!mask || !reason) { return; @@ -1080,7 +910,7 @@ void anope_cmd_sqline(char *mask, char *reason) } /* SQUIT */ -void anope_cmd_squit(char *servname, char *message) +void unreal_cmd_squit(char *servname, char *message) { if (!servname || !message) { return; @@ -1090,7 +920,7 @@ void anope_cmd_squit(char *servname, char *message) } /* SVSO */ -void anope_cmd_svso(char *source, char *nick, char *flag) +void unreal_cmd_svso(char *source, char *nick, char *flag) { if (!source || !nick || !flag) { return; @@ -1100,7 +930,7 @@ void anope_cmd_svso(char *source, char *nick, char *flag) } /* NICK <newnick> */ -void anope_cmd_chg_nick(char *oldnick, char *newnick) +void unreal_cmd_chg_nick(char *oldnick, char *newnick) { if (!oldnick || !newnick) { return; @@ -1110,7 +940,7 @@ void anope_cmd_chg_nick(char *oldnick, char *newnick) } /* SVSNICK */ -void anope_cmd_svsnick(char *source, char *guest, time_t when) +void unreal_cmd_svsnick(char *source, char *guest, time_t when) { if (!source || !guest) { return; @@ -1120,33 +950,33 @@ void anope_cmd_svsnick(char *source, char *guest, time_t when) /* Functions that use serval cmd functions */ -void anope_cmd_vhost_on(char *nick, char *vIdent, char *vhost) +void unreal_cmd_vhost_on(char *nick, char *vIdent, char *vhost) { if (!nick) { return; } if (vIdent) { - anope_cmd_chgident(nick, vIdent); + unreal_cmd_chgident(nick, vIdent); } - anope_cmd_chghost(nick, vhost); + unreal_cmd_chghost(nick, vhost); } -void anope_cmd_connect(int servernum) +void unreal_cmd_connect(int servernum) { me_server = new_server(NULL, ServerName, ServerDesc, SERVER_ISME, NULL); - anope_cmd_protoctl(); + unreal_cmd_protoctl(); if (servernum == 1) { - anope_cmd_pass(RemotePassword); + unreal_cmd_pass(RemotePassword); } if (servernum == 2) { - anope_cmd_pass(RemotePassword2); + unreal_cmd_pass(RemotePassword2); } if (servernum == 3) { - anope_cmd_pass(RemotePassword3); + unreal_cmd_pass(RemotePassword3); } - anope_cmd_server(ServerName, 1, ServerDesc); + unreal_cmd_server(ServerName, 1, ServerDesc); } /* Events */ @@ -1155,7 +985,7 @@ int anope_event_ping(char *source, int ac, char **av) { if (ac < 1) return MOD_CONT; - anope_cmd_pong(ac > 1 ? av[1] : ServerName, av[0]); + unreal_cmd_pong(ac > 1 ? av[1] : ServerName, av[0]); return MOD_CONT; } @@ -1436,32 +1266,32 @@ int anope_event_whois(char *source, int ac, char **av) } /* SVSHOLD - set */ -void anope_cmd_svshold(char *nick) +void unreal_cmd_svshold(char *nick) { /* Not supported by this IRCD */ } /* SVSHOLD - release */ -void anope_cmd_release_svshold(char *nick) +void unreal_cmd_release_svshold(char *nick) { /* Not Supported by this IRCD */ } /* UNSGLINE */ -void anope_cmd_unsgline(char *mask) +void unreal_cmd_unsgline(char *mask) { /* Not Supported by this IRCD */ } /* UNSZLINE */ -void anope_cmd_unszline(char *mask) +void unreal_cmd_unszline(char *mask) { send_cmd(NULL, "%s - Z * %s %s", send_token("TKL", "BD"), mask, s_OperServ); } /* SZLINE */ -void anope_cmd_szline(char *mask, char *reason, char *whom) +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, @@ -1469,19 +1299,19 @@ void anope_cmd_szline(char *mask, char *reason, char *whom) } /* SGLINE */ -void anope_cmd_sgline(char *mask, char *reason) +void unreal_cmd_sgline(char *mask, char *reason) { /* Not Supported by this IRCD */ } -void anope_cmd_unban(char *name, char *nick) +void unreal_cmd_unban(char *name, char *nick) { /* Not Supported by this IRCD */ } /* SVSMODE channel modes */ -void anope_cmd_svsmode_chan(char *name, char *mode, char *nick) +void unreal_cmd_svsmode_chan(char *name, char *mode, char *nick) { /* Not Supported by this IRCD */ } @@ -1489,20 +1319,20 @@ void anope_cmd_svsmode_chan(char *name, char *mode, char *nick) /* SVSMODE +d */ /* sent if svid is something weird */ -void anope_cmd_svid_umode(char *nick, time_t ts) +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 anope_cmd_nc_change(User * u) +void unreal_cmd_nc_change(User * u) { common_svsmode(u, "-r+d", "1"); } /* SVSMODE +r */ -void anope_cmd_svid_umode2(User * u, char *ts) +void unreal_cmd_svid_umode2(User * u, char *ts) { if (u->svid != u->timestamp) { common_svsmode(u, "+rd", ts); @@ -1511,7 +1341,7 @@ void anope_cmd_svid_umode2(User * u, char *ts) } } -void anope_cmd_svid_umode3(User * u, char *ts) +void unreal_cmd_svid_umode3(User * u, char *ts) { /* not used */ } @@ -1521,7 +1351,7 @@ void anope_cmd_svid_umode3(User * u, char *ts) parv[1] - nick to make join parv[2] - channel(s) to join */ -void anope_cmd_svsjoin(char *source, char *nick, char *chan) +void unreal_cmd_svsjoin(char *source, char *nick, char *chan) { send_cmd(source, "SVSJOIN %s :%s", nick, chan); } @@ -1531,17 +1361,17 @@ void anope_cmd_svsjoin(char *source, char *nick, char *chan) parv[1] - nick to make part parv[2] - channel(s) to part */ -void anope_cmd_svspart(char *source, char *nick, char *chan) +void unreal_cmd_svspart(char *source, char *nick, char *chan) { send_cmd(source, "SVSPART %s :%s", nick, chan); } -void anope_cmd_swhois(char *source, char *who, char *mask) +void unreal_cmd_swhois(char *source, char *who, char *mask) { /* Can anyone tell me if 3.1 has this? */ } -void anope_cmd_eob() +void unreal_cmd_eob() { /* Can anyone tell me if 3.1 has this? */ } @@ -1562,7 +1392,7 @@ int anope_event_admin(char *source, int ac, char **av) return MOD_CONT; } -int anope_flood_mode_check(char *value) +int unreal_flood_mode_check(char *value) { char *dp, *end; @@ -1576,20 +1406,20 @@ int anope_flood_mode_check(char *value) } } -void anope_cmd_jupe(char *jserver, char *who, char *reason) +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 : ""); - anope_cmd_squit(jserver, rbuf); - anope_cmd_server(jserver, 2, rbuf); + 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 anope_cmd_global_legacy(char *source, char *fmt) +void unreal_cmd_global_legacy(char *source, char *fmt) { send_cmd(source ? source : ServerName, "%s :%s", send_token("GLOBOPS", "]"), fmt); @@ -1599,7 +1429,7 @@ void anope_cmd_global_legacy(char *source, char *fmt) 1 = valid nick 0 = nick is in valid */ -int anope_valid_nick(char *nick) +int unreal_valid_nick(char *nick) { if (!stricmp("ircd", nick)) { return 0; @@ -1610,18 +1440,10 @@ int anope_valid_nick(char *nick) return 1; } -void anope_cmd_ctcp(char *source, char *dest, const char *fmt, ...) +void unreal_cmd_ctcp(char *source, char *dest, char *buf) { - va_list args; - char buf[BUFSIZE]; char *s; - *buf = '\0'; - if (fmt) { - va_start(args, fmt); - vsnprintf(buf, BUFSIZE - 1, fmt, args); - va_end(args); - } if (!buf) { return; } else { @@ -1632,4 +1454,118 @@ void anope_cmd_ctcp(char *source, char *dest, const char *fmt, ...) free(s); } -#endif + +/** + * 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_unsqline); + 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_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_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..f2ed19503 --- /dev/null +++ b/src/protocol/unreal31.h @@ -0,0 +1,124 @@ +/* Unreal IRCD 3.1.x functions + * + * (C) 2003-2005 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/unreal32.c b/src/protocol/unreal32.c index 13b868f37..5790cb5f6 100644 --- a/src/unreal32.c +++ b/src/protocol/unreal32.c @@ -15,17 +15,9 @@ #include "services.h" #include "pseudo.h" +#include "unreal32.h" -#ifdef IRC_UNREAL32 - -const char version_protocol[] = "UnrealIRCd 3.2+"; - -/* Not all ircds use +f for their flood/join throttle system */ -const char flood_mode_char_set[] = "+f"; /* mode char for FLOOD mode on set */ -const char flood_mode_char_remove[] = "-f"; /* mode char for FLOOD mode on remove */ -int UseTSMODE = 0; - -IRCDVar ircd[] = { +IRCDVar myIrcd[] = { {"UnrealIRCd 3.2.x", /* ircd name */ "+oS", /* nickserv mode */ "+oS", /* chanserv mode */ @@ -86,7 +78,6 @@ IRCDVar ircd[] = { 1, /* UMODE */ 1, /* VHOST ON NICK */ 1, /* Change RealName */ - CHAN_HELP_UNREAL, /* ChanServ extra */ CMODE_K, /* No Knock */ CMODE_A, /* Admin Only */ DEFAULT_MLOCK, /* Default MLOCK */ @@ -113,11 +104,12 @@ IRCDVar ircd[] = { 0, /* p10 */ NULL, /* character set */ 1, /* reports sync state */ - }, + } + , {NULL} }; -IRCDCAPAB ircdcap[] = { +IRCDCAPAB myIrcdcap[] = { { CAPAB_NOQUIT, /* NOQUIT */ 0, /* TSMODE */ @@ -205,7 +197,7 @@ unsigned long umodes[128] = { 0, 0 /* ~ ‚ */ }; -char csmodes[128] = { +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, @@ -227,7 +219,7 @@ char csmodes[128] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'a', 0 }; -CMMode cmmodes[128] = { +CMMode myCmmodes[128] = { {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, @@ -274,7 +266,7 @@ CMMode cmmodes[128] = { {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL} }; -CBMode cbmodes[128] = { +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}, @@ -340,7 +332,7 @@ CBMode cbmodes[128] = { {0}, {0}, {0}, {0} }; -CBModeInfo cbmodeinfos[] = { +CBModeInfo myCbmodeinfos[] = { {'c', CMODE_c, 0, NULL, NULL}, {'f', CMODE_f, 0, get_flood, cs_get_flood}, {'i', CMODE_i, 0, NULL, NULL}, @@ -370,7 +362,7 @@ CBModeInfo cbmodeinfos[] = { {0} }; -CUMode cumodes[128] = { +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}, @@ -418,7 +410,7 @@ CUMode cumodes[128] = { }; -void anope_set_umode(User * user, int ac, char **av) +void unreal_set_umode(User * user, int ac, char **av) { int add = 1; /* 1 if adding modes, 0 if deleting */ char *modes = av[0]; @@ -482,264 +474,7 @@ void anope_set_umode(User * user, int ac, char **av) } } -/* *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("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("SVSMODE", anope_event_null); addCoreMessage(IRCD,m); - if (UseTokens) { - m = createMessage("n", anope_event_null); addCoreMessage(IRCD,m); - } - m = createMessage("SVS2MODE", anope_event_null); addCoreMessage(IRCD,m); - if (UseTokens) { - m = createMessage("v", 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* */ /* Event: PROTOCTL */ @@ -750,31 +485,31 @@ int anope_event_capab(char *source, int ac, char **av) } /* SVSNOOP */ -void anope_cmd_svsnoop(char *server, int set) +void unreal_cmd_svsnoop(char *server, int set) { send_cmd(NULL, "%s %s %s", send_token("SVSNOOP", "f"), server, (set ? "+" : "-")); } -void anope_cmd_svsadmin(char *server, int set) +void unreal_cmd_svsadmin(char *server, int set) { - anope_cmd_svsnoop(server, set); + unreal_cmd_svsnoop(server, set); } -void anope_cmd_remove_akill(char *user, char *host) +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 anope_cmd_topic(char *whosets, char *chan, char *whosetit, - char *topic, time_t when) +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 anope_cmd_vhost_off(User * u) +void unreal_cmd_vhost_off(User * u) { if (UseSVS2MODE) { send_cmd(s_HostServ, "%s %s -xt", send_token("SVS2MODE", "v"), @@ -783,11 +518,12 @@ void anope_cmd_vhost_off(User * u) send_cmd(s_HostServ, "%s %s -xt", send_token("SVSMODE", "n"), u->nick); } - notice_lang(s_HostServ, u, HOST_OFF_UNREAL, u->nick, ircd->vhostchar); + notice_lang(s_HostServ, u, HOST_OFF_UNREAL, u->nick, + myIrcd->vhostchar); } -void anope_cmd_akill(char *user, char *host, char *who, time_t when, - time_t expires, char *reason) +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, @@ -800,24 +536,11 @@ void anope_cmd_akill(char *user, char *host, char *who, time_t when, ** parv[1] = client ** parv[2] = kill message */ -void anope_cmd_svskill(char *source, char *user, const char *fmt, ...) +void unreal_cmd_svskill(char *source, char *user, char *buf) { - va_list args; - char buf[BUFSIZE]; - *buf = '\0'; - - if (!source || !user || !fmt) { + if (!source || !user || !buf) { return; } - - va_start(args, fmt); - vsnprintf(buf, BUFSIZE - 1, fmt, args); - va_end(args); - - if (!buf) { - return; - } - send_cmd(source, "%s %s :%s", send_token("SVSKILL", "h"), user, buf); } @@ -828,7 +551,7 @@ void anope_cmd_svskill(char *source, char *user, const char *fmt, ...) * parv[2] - modes to change * parv[3] - Service Stamp (if mode == d) */ -void anope_cmd_svsmode(User * u, int ac, char **av) +void unreal_cmd_svsmode(User * u, int ac, char **av) { if (ac >= 1) { if (!u || !av[0]) { @@ -847,58 +570,49 @@ void anope_cmd_svsmode(User * u, int ac, char **av) } /* 372 */ -void anope_cmd_372(char *source, char *msg) +void unreal_cmd_372(char *source, char *msg) { send_cmd(ServerName, "372 %s :- %s", source, msg); } -void anope_cmd_372_error(char *source) +void unreal_cmd_372_error(char *source) { send_cmd(ServerName, "422 %s :- MOTD file not found! Please " "contact your IRC administrator.", source); } -void anope_cmd_375(char *source) +void unreal_cmd_375(char *source) { send_cmd(ServerName, "375 %s :- %s Message of the Day", source, ServerName); } -void anope_cmd_376(char *source) +void unreal_cmd_376(char *source) { send_cmd(ServerName, "376 %s :End of /MOTD command.", source); } -void anope_cmd_nick(char *nick, char *name, char *modes) +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, - (ircd->nickip ? " *" : " "), name); - anope_cmd_sqline(nick, "Reserved for services"); + (myIrcd->nickip ? " *" : " "), name); + unreal_cmd_sqline(nick, "Reserved for services"); } -void anope_cmd_guest_nick(char *nick, char *user, char *host, char *real, - char *modes) +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, (ircd->nickip ? " *" : " "), + host, ServerName, modes, host, (myIrcd->nickip ? " *" : " "), real); } -void anope_cmd_mode(char *source, char *dest, const char *fmt, ...) +void unreal_cmd_mode(char *source, char *dest, char *buf) { - 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; } @@ -906,30 +620,19 @@ void anope_cmd_mode(char *source, char *dest, const char *fmt, ...) send_cmd(source, "%s %s %s", send_token("MODE", "G"), dest, buf); } -void anope_cmd_bot_nick(char *nick, char *user, char *host, char *real, - char *modes) +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, (ircd->nickip ? " *" : " "), + host, ServerName, modes, host, (myIrcd->nickip ? " *" : " "), real); - anope_cmd_sqline(nick, "Reserved for services"); + unreal_cmd_sqline(nick, "Reserved for services"); } -void anope_cmd_kick(char *source, char *chan, char *user, const char *fmt, - ...) +void unreal_cmd_kick(char *source, char *chan, char *user, char *buf) { - 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) { send_cmd(source, "%s %s %s :%s", send_token("KICK", "H"), chan, user, buf); @@ -938,17 +641,8 @@ void anope_cmd_kick(char *source, char *chan, char *user, const char *fmt, } } -void anope_cmd_notice_ops(char *source, char *dest, const char *fmt, ...) +void unreal_cmd_notice_ops(char *source, char *dest, char *buf) { - 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; } @@ -957,45 +651,27 @@ void anope_cmd_notice_ops(char *source, char *dest, const char *fmt, ...) } -void anope_cmd_notice(char *source, char *dest, const char *fmt, ...) +void unreal_cmd_notice(char *source, char *dest, char *buf) { - 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; } if (UsePrivmsg) { - anope_cmd_privmsg2(source, dest, buf); + unreal_cmd_privmsg2(source, dest, buf); } else { send_cmd(source, "%s %s :%s", send_token("NOTICE", "B"), dest, buf); } } -void anope_cmd_notice2(char *source, char *dest, char *msg) +void unreal_cmd_notice2(char *source, char *dest, char *msg) { send_cmd(source, "%s %s :%s", send_token("NOTICE", "B"), dest, msg); } -void anope_cmd_privmsg(char *source, char *dest, const char *fmt, ...) +void unreal_cmd_privmsg(char *source, char *dest, char *buf) { - 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; } @@ -1003,46 +679,37 @@ void anope_cmd_privmsg(char *source, char *dest, const char *fmt, ...) send_cmd(source, "%s %s :%s", send_token("PRIVMSG", "!"), dest, buf); } -void anope_cmd_privmsg2(char *source, char *dest, char *msg) +void unreal_cmd_privmsg2(char *source, char *dest, char *msg) { send_cmd(source, "%s %s :%s", send_token("PRIVMSG", "!"), dest, msg); } -void anope_cmd_serv_notice(char *source, char *dest, char *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 anope_cmd_serv_privmsg(char *source, char *dest, char *msg) +void unreal_cmd_serv_privmsg(char *source, char *dest, char *msg) { send_cmd(source, "%s $%s :%s", send_token("PRIVMSG", "!"), dest, msg); } -void anope_cmd_bot_chan_mode(char *nick, char *chan) +void unreal_cmd_bot_chan_mode(char *nick, char *chan) { - anope_cmd_mode(nick, chan, "%s %s %s", ircd->botchanumode, nick, nick); + anope_cmd_mode(nick, chan, "%s %s %s", myIrcd->botchanumode, nick, + nick); } -void anope_cmd_351(char *source) +void unreal_cmd_351(char *source) { send_cmd(ServerName, "351 %s Anope-%s %s :%s - %s -- %s", - source, version_number, ServerName, ircd->name, version_flags, - version_build); + source, version_number, ServerName, myIrcd->name, + version_flags, version_build); } /* QUIT */ -void anope_cmd_quit(char *source, const char *fmt, ...) +void unreal_cmd_quit(char *source, char *buf) { - 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) { send_cmd(source, "%s :%s", send_token("QUIT", ","), buf); } else { @@ -1065,7 +732,7 @@ void anope_cmd_quit(char *source, const char *fmt, ...) NS = Numeric Server */ -void anope_cmd_capab() +void unreal_cmd_capab() { if (UseTokens) { if (Numeric) { @@ -1087,14 +754,14 @@ void anope_cmd_capab() } /* PASS */ -void anope_cmd_pass(char *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 anope_cmd_server(char *servname, int hop, char *descript) +void unreal_cmd_server(char *servname, int hop, char *descript) { if (Numeric) { send_cmd(NULL, "SERVER %s %d :U0-*-%s %s", servname, hop, Numeric, @@ -1105,13 +772,13 @@ void anope_cmd_server(char *servname, int hop, char *descript) } /* PONG */ -void anope_cmd_pong(char *servname, char *who) +void unreal_cmd_pong(char *servname, char *who) { send_cmd(servname, "%s %s", send_token("PONG", "9"), who); } /* JOIN */ -void anope_cmd_join(char *user, char *channel, time_t chantime) +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), @@ -1123,7 +790,7 @@ void anope_cmd_join(char *user, char *channel, time_t chantime) ** parv[0] = sender ** parv[1] = nickmask */ -void anope_cmd_unsqline(char *user) +void unreal_cmd_unsqline(char *user) { if (!user) { return; @@ -1132,7 +799,7 @@ void anope_cmd_unsqline(char *user) } /* CHGHOST */ -void anope_cmd_chghost(char *nick, char *vhost) +void unreal_cmd_chghost(char *nick, char *vhost) { if (!nick || !vhost) { return; @@ -1142,7 +809,7 @@ void anope_cmd_chghost(char *nick, char *vhost) } /* CHGIDENT */ -void anope_cmd_chgident(char *nick, char *vIdent) +void unreal_cmd_chgident(char *nick, char *vIdent) { if (!nick || !vIdent) { return; @@ -1152,7 +819,7 @@ void anope_cmd_chgident(char *nick, char *vIdent) } /* INVITE */ -void anope_cmd_invite(char *source, char *chan, char *nick) +void unreal_cmd_invite(char *source, char *chan, char *nick) { if (!source || !chan || !nick) { return; @@ -1162,18 +829,8 @@ void anope_cmd_invite(char *source, char *chan, char *nick) } /* PART */ -void anope_cmd_part(char *nick, char *chan, const char *fmt, ...) +void unreal_cmd_part(char *nick, char *chan, char *buf) { - va_list args; - char buf[BUFSIZE]; - *buf = '\0'; - - if (fmt) { - va_start(args, fmt); - vsnprintf(buf, BUFSIZE - 1, fmt, args); - va_end(args); - } - if (!nick || !chan) { return; } @@ -1186,7 +843,7 @@ void anope_cmd_part(char *nick, char *chan, const char *fmt, ...) } /* 391 RPL_TIME ":%s 391 %s %s :%s" */ -void anope_cmd_391(char *source, char *timestr) +void unreal_cmd_391(char *source, char *timestr) { if (!timestr) { return; @@ -1195,17 +852,8 @@ void anope_cmd_391(char *source, char *timestr) } /* 250 */ -void anope_cmd_250(const char *fmt, ...) +void unreal_cmd_250(char *buf) { - 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; } @@ -1214,17 +862,8 @@ void anope_cmd_250(const char *fmt, ...) } /* 307 */ -void anope_cmd_307(const char *fmt, ...) +void unreal_cmd_307(char *buf) { - 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; } @@ -1233,17 +872,8 @@ void anope_cmd_307(const char *fmt, ...) } /* 311 */ -void anope_cmd_311(const char *fmt, ...) +void unreal_cmd_311(char *buf) { - 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; } @@ -1252,17 +882,8 @@ void anope_cmd_311(const char *fmt, ...) } /* 312 */ -void anope_cmd_312(const char *fmt, ...) +void unreal_cmd_312(char *buf) { - 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; } @@ -1271,17 +892,8 @@ void anope_cmd_312(const char *fmt, ...) } /* 317 */ -void anope_cmd_317(const char *fmt, ...) +void unreal_cmd_317(char *buf) { - 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; } @@ -1290,7 +902,7 @@ void anope_cmd_317(const char *fmt, ...) } /* 219 */ -void anope_cmd_219(char *source, char *letter) +void unreal_cmd_219(char *source, char *letter) { if (!source) { return; @@ -1305,7 +917,7 @@ void anope_cmd_219(char *source, char *letter) } /* 401 */ -void anope_cmd_401(char *source, char *who) +void unreal_cmd_401(char *source, char *who) { if (!source || !who) { return; @@ -1314,7 +926,7 @@ void anope_cmd_401(char *source, char *who) } /* 318 */ -void anope_cmd_318(char *source, char *who) +void unreal_cmd_318(char *source, char *who) { if (!source || !who) { return; @@ -1324,17 +936,8 @@ void anope_cmd_318(char *source, char *who) } /* 242 */ -void anope_cmd_242(const char *fmt, ...) +void unreal_cmd_242(char *buf) { - 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; } @@ -1343,17 +946,8 @@ void anope_cmd_242(const char *fmt, ...) } /* 243 */ -void anope_cmd_243(const char *fmt, ...) +void unreal_cmd_243(char *buf) { - 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; } @@ -1362,17 +956,8 @@ void anope_cmd_243(const char *fmt, ...) } /* 211 */ -void anope_cmd_211(const char *fmt, ...) +void unreal_cmd_211(char *buf) { - 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; } @@ -1381,17 +966,8 @@ void anope_cmd_211(const char *fmt, ...) } /* GLOBOPS */ -void anope_cmd_global(char *source, const char *fmt, ...) +void unreal_cmd_global(char *source, char *buf) { - 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; } @@ -1401,7 +977,7 @@ void anope_cmd_global(char *source, const char *fmt, ...) } /* GLOBOPS - to handle old WALLOPS */ -void anope_cmd_global_legacy(char *source, char *fmt) +void unreal_cmd_global_legacy(char *source, char *fmt) { send_cmd(source ? source : ServerName, "%s :%s", send_token("GLOBOPS", "]"), fmt); @@ -1416,7 +992,7 @@ void anope_cmd_global_legacy(char *source, char *fmt) ** - Unreal will translate this to TKL for us ** */ -void anope_cmd_sqline(char *mask, char *reason) +void unreal_cmd_sqline(char *mask, char *reason) { if (!mask || !reason) { return; @@ -1426,7 +1002,7 @@ void anope_cmd_sqline(char *mask, char *reason) } /* SQUIT */ -void anope_cmd_squit(char *servname, char *message) +void unreal_cmd_squit(char *servname, char *message) { if (!servname || !message) { return; @@ -1442,7 +1018,7 @@ void anope_cmd_squit(char *servname, char *message) ** parv[1] = nick ** parv[2] = options */ -void anope_cmd_svso(char *source, char *nick, char *flag) +void unreal_cmd_svso(char *source, char *nick, char *flag) { if (!source || !nick || !flag) { return; @@ -1452,7 +1028,7 @@ void anope_cmd_svso(char *source, char *nick, char *flag) } /* NICK <newnick> */ -void anope_cmd_chg_nick(char *oldnick, char *newnick) +void unreal_cmd_chg_nick(char *oldnick, char *newnick) { if (!oldnick || !newnick) { return; @@ -1469,7 +1045,7 @@ void anope_cmd_chg_nick(char *oldnick, char *newnick) ** parv[2] = new nickname ** parv[3] = timestamp */ -void anope_cmd_svsnick(char *source, char *guest, time_t when) +void unreal_cmd_svsnick(char *source, char *guest, time_t when) { if (!source || !guest) { return; @@ -1480,18 +1056,18 @@ void anope_cmd_svsnick(char *source, char *guest, time_t when) /* Functions that use serval cmd functions */ -void anope_cmd_vhost_on(char *nick, char *vIdent, char *vhost) +void unreal_cmd_vhost_on(char *nick, char *vIdent, char *vhost) { if (!nick) { return; } if (vIdent) { - anope_cmd_chgident(nick, vIdent); + unreal_cmd_chgident(nick, vIdent); } - anope_cmd_chghost(nick, vhost); + unreal_cmd_chghost(nick, vhost); } -void anope_cmd_connect(int servernum) +void unreal_cmd_connect(int servernum) { if (Numeric) { me_server = @@ -1501,17 +1077,17 @@ void anope_cmd_connect(int servernum) new_server(NULL, ServerName, ServerDesc, SERVER_ISME, NULL); } - anope_cmd_capab(); + unreal_cmd_capab(); if (servernum == 1) { - anope_cmd_pass(RemotePassword); + unreal_cmd_pass(RemotePassword); } if (servernum == 2) { - anope_cmd_pass(RemotePassword2); + unreal_cmd_pass(RemotePassword2); } if (servernum == 3) { - anope_cmd_pass(RemotePassword3); + unreal_cmd_pass(RemotePassword3); } - anope_cmd_server(ServerName, 1, ServerDesc); + unreal_cmd_server(ServerName, 1, ServerDesc); } /* Events */ @@ -1520,10 +1096,17 @@ int anope_event_ping(char *source, int ac, char **av) { if (ac < 1) return MOD_CONT; - anope_cmd_pong(ac > 1 ? av[1] : ServerName, av[0]); + 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 @@ -1536,16 +1119,10 @@ int anope_event_ping(char *source, int ac, char **av) */ int anope_event_netinfo(char *source, int ac, char **av) { - anope_cmd_netinfo(ac, av); + unreal_cmd_netinfo(ac, av); return MOD_CONT; } -void anope_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]); -} /* TKL * add: remove: spamfilter: spamfilter+TKLEXT sqline: @@ -1945,7 +1522,7 @@ int anope_event_whois(char *source, int ac, char **av) } /* SVSHOLD - set */ -void anope_cmd_svshold(char *nick) +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, @@ -1953,7 +1530,7 @@ void anope_cmd_svshold(char *nick) } /* SVSHOLD - release */ -void anope_cmd_release_svshold(char *nick) +void unreal_cmd_release_svshold(char *nick) { send_cmd(NULL, "%s - Q * %s %s", send_token("TKL", "BD"), nick, ServerName); @@ -1963,20 +1540,20 @@ void anope_cmd_release_svshold(char *nick) /* * SVSNLINE - :realname mask */ -void anope_cmd_unsgline(char *mask) +void unreal_cmd_unsgline(char *mask) { send_cmd(NULL, "%s - :%s", send_token("SVSNLINE", "BR"), mask); } /* UNSZLINE */ -void anope_cmd_unszline(char *mask) +void unreal_cmd_unszline(char *mask) { send_cmd(NULL, "%s - Z * %s %s", send_token("TKL", "BD"), mask, s_OperServ); } /* SZLINE */ -void anope_cmd_szline(char *mask, char *reason, char *whom) +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, @@ -1987,7 +1564,7 @@ void anope_cmd_szline(char *mask, char *reason, char *whom) /* * SVSNLINE + reason_where_is_space :realname mask with spaces */ -void anope_cmd_sgline(char *mask, char *reason) +void unreal_cmd_sgline(char *mask, char *reason) { strnrepl(reason, BUFSIZE, " ", "_"); send_cmd(NULL, "%s + %s :%s", send_token("SVSNLINE", "BR"), reason, @@ -1995,15 +1572,15 @@ void anope_cmd_sgline(char *mask, char *reason) } /* SVSMODE -b */ -void anope_cmd_unban(char *name, char *nick) +void unreal_cmd_unban(char *name, char *nick) { - anope_cmd_svsmode_chan(name, "-b", nick); + unreal_cmd_svsmode_chan(name, "-b", nick); } /* SVSMODE channel modes */ -void anope_cmd_svsmode_chan(char *name, char *mode, char *nick) +void unreal_cmd_svsmode_chan(char *name, char *mode, char *nick) { if (nick) { send_cmd(ServerName, "%s %s %s %s", send_token("SVSMODE", "n"), @@ -2017,7 +1594,7 @@ void anope_cmd_svsmode_chan(char *name, char *mode, char *nick) /* SVSMODE +d */ /* sent if svid is something weird */ -void anope_cmd_svid_umode(char *nick, time_t ts) +void unreal_cmd_svid_umode(char *nick, time_t ts) { if (UseSVS2MODE) { send_cmd(ServerName, "%s %s +d 1", send_token("SVS2MODE", "v"), @@ -2030,13 +1607,13 @@ void anope_cmd_svid_umode(char *nick, time_t ts) /* SVSMODE +d */ /* nc_change was = 1, and there is no na->status */ -void anope_cmd_nc_change(User * u) +void unreal_cmd_nc_change(User * u) { common_svsmode(u, "-r+d", "1"); } /* SVSMODE +r */ -void anope_cmd_svid_umode2(User * u, char *ts) +void unreal_cmd_svid_umode2(User * u, char *ts) { if (u->svid != u->timestamp) { common_svsmode(u, "+rd", ts); @@ -2045,7 +1622,7 @@ void anope_cmd_svid_umode2(User * u, char *ts) } } -void anope_cmd_svid_umode3(User * u, char *ts) +void unreal_cmd_svid_umode3(User * u, char *ts) { /* not used */ } @@ -2080,7 +1657,7 @@ int anope_event_smo(char *source, int ac, char **av) /* In older Unreal SVSJOIN and SVSNLINE tokens were mixed so SVSJOIN and SVSNLINE are broken when coming from a none TOKEN'd server */ -void anope_cmd_svsjoin(char *source, char *nick, char *chan) +void unreal_cmd_svsjoin(char *source, char *nick, char *chan) { send_cmd(source, "%s %s :%s", send_token("SVSJOIN", "BX"), nick, chan); } @@ -2090,7 +1667,7 @@ void anope_cmd_svsjoin(char *source, char *nick, char *chan) parv[1] - nick to make part parv[2] - channel(s) to part */ -void anope_cmd_svspart(char *source, char *nick, char *chan) +void unreal_cmd_svspart(char *source, char *nick, char *chan) { send_cmd(source, "%s %s :%s", send_token("SVSPART", "BT"), nick, chan); } @@ -2138,12 +1715,12 @@ int anope_event_sjoin(char *source, int ac, char **av) return MOD_CONT; } -void anope_cmd_swhois(char *source, char *who, char *mask) +void unreal_cmd_swhois(char *source, char *who, char *mask) { send_cmd(source, "%s %s :%s", send_token("SWHOIS", "BA"), who, mask); } -void anope_cmd_eob() +void unreal_cmd_eob() { send_cmd(ServerName, "%s", send_token("EOS", "ES")); } @@ -2153,7 +1730,7 @@ void anope_cmd_eob() * parv[1] - target nick * parv[2] - parameters */ -void anope_cmd_svswatch(char *sender, char *nick, char *parm) +void unreal_cmd_svswatch(char *sender, char *nick, char *parm) { send_cmd(sender, "%s %s :%s", send_token("SVSWATCH", "Bw"), nick, parm); @@ -2161,7 +1738,7 @@ void anope_cmd_svswatch(char *sender, char *nick, char *parm) /* check if +f mode is valid for the ircd */ /* borrowed part of the new check from channels.c in Unreal */ -int anope_flood_mode_check(char *value) +int unreal_flood_mode_check(char *value) { char *dp, *end; /* NEW +F */ @@ -2210,15 +1787,15 @@ int anope_flood_mode_check(char *value) } } -void anope_cmd_jupe(char *jserver, char *who, char *reason) +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 : ""); - anope_cmd_squit(jserver, rbuf); - anope_cmd_server(jserver, 2, rbuf); + unreal_cmd_squit(jserver, rbuf); + unreal_cmd_server(jserver, 2, rbuf); new_server(me_server, jserver, rbuf, SERVER_JUPED, NULL); } @@ -2226,7 +1803,7 @@ void anope_cmd_jupe(char *jserver, char *who, char *reason) 1 = valid nick 0 = nick is in valid */ -int anope_valid_nick(char *nick) +int unreal_valid_nick(char *nick) { if (!stricmp("ircd", nick)) { return 0; @@ -2237,18 +1814,9 @@ int anope_valid_nick(char *nick) return 1; } -void anope_cmd_ctcp(char *source, char *dest, const char *fmt, ...) +void unreal_cmd_ctcp(char *source, char *dest, char *buf) { - va_list args; - char buf[BUFSIZE]; char *s; - *buf = '\0'; - - if (fmt) { - va_start(args, fmt); - vsnprintf(buf, BUFSIZE - 1, fmt, args); - va_end(args); - } if (!buf) { return; } else { @@ -2259,4 +1827,376 @@ void anope_cmd_ctcp(char *source, char *dest, const char *fmt, ...) free(s); } -#endif +/* *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("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("SVSMODE", anope_event_null); addCoreMessage(IRCD,m); + if (UseTokens) { + m = createMessage("n", anope_event_null); addCoreMessage(IRCD,m); + } + m = createMessage("SVS2MODE", anope_event_null); addCoreMessage(IRCD,m); + if (UseTokens) { + m = createMessage("v", 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_unsqline); + 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_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_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..7bb3863cf --- /dev/null +++ b/src/protocol/unreal32.h @@ -0,0 +1,153 @@ +/* Unreal IRCD 3.2.x functions + * + * (C) 2003-2005 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/viagra.c b/src/protocol/viagra.c index 565508091..cd9fbe991 100644 --- a/src/viagra.c +++ b/src/protocol/viagra.c @@ -14,17 +14,9 @@ #include "services.h" #include "pseudo.h" +#include "viagra.h" -#ifdef IRC_VIAGRA - -const char version_protocol[] = "ViagraIRCd 1.3.x"; - -/* Not all ircds use +f for their flood/join throttle system */ -const char flood_mode_char_set[] = ""; /* mode char for FLOOD mode on set */ -const char flood_mode_char_remove[] = ""; /* mode char for FLOOD mode on remove */ -int UseTSMODE = 0; - -IRCDVar ircd[] = { +IRCDVar myIrcd[] = { {"ViagraIRCd 1.3.*", /* ircd name */ "+oS", /* nickserv mode */ "+oS", /* chanserv mode */ @@ -85,7 +77,6 @@ IRCDVar ircd[] = { 1, /* UMODE */ 1, /* VHOST ON NICK */ 1, /* Change RealName */ - CHAN_HELP_UNREAL, /* ChanServ extra */ 0, /* No Knock */ 0, /* Admin Only */ DEFAULT_MLOCK, /* Default MLOCK */ @@ -118,7 +109,7 @@ IRCDVar ircd[] = { }; -IRCDCAPAB ircdcap[] = { +IRCDCAPAB myIrcdcap[] = { { CAPAB_NOQUIT, /* NOQUIT */ CAPAB_TSMODE, /* TSMODE */ @@ -154,7 +145,7 @@ IRCDCAPAB ircdcap[] = { -void anope_set_umode(User * user, int ac, char **av) +void viagra_set_umode(User * user, int ac, char **av) { int add = 1; /* 1 if adding modes, 0 if deleting */ char *modes = av[0]; @@ -239,7 +230,7 @@ unsigned long umodes[128] = { }; -char csmodes[128] = { +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, @@ -261,7 +252,7 @@ char csmodes[128] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'a', 0 }; -CMMode cmmodes[128] = { +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}, @@ -289,7 +280,7 @@ CMMode cmmodes[128] = { -CBMode cbmodes[128] = { +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}, @@ -355,7 +346,7 @@ CBMode cbmodes[128] = { {0}, {0}, {0}, {0} }; -CBModeInfo cbmodeinfos[] = { +CBModeInfo myCbmodeinfos[] = { {'c', CMODE_c, 0, NULL, NULL}, {'i', CMODE_i, 0, NULL, NULL}, {'k', CMODE_k, 0, get_key, cs_get_key}, @@ -377,7 +368,7 @@ CBModeInfo cbmodeinfos[] = { {0} }; -CUMode cumodes[128] = { +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}, @@ -425,7 +416,7 @@ CUMode cumodes[128] = { }; -void anope_cmd_bot_unban(ChannelInfo * ci, char *nick) +void viagra_cmd_bot_unban(ChannelInfo * ci, char *nick) { send_cmd(ServerName, "SVSMODE %s -b %s", ci->name, nick); } @@ -743,7 +734,7 @@ void moduleAddIRCDMsgs(void) { /* SQLINE */ -void anope_cmd_sqline(char *mask, char *reason) +void viagra_cmd_sqline(char *mask, char *reason) { if (!mask || !reason) { return; @@ -752,54 +743,44 @@ void anope_cmd_sqline(char *mask, char *reason) send_cmd(NULL, "SQLINE %s :%s", mask, reason); } -void anope_cmd_unsgline(char *mask) +void viagra_cmd_unsgline(char *mask) { send_cmd(NULL, "UNSGLINE 0 :%s", mask); } -void anope_cmd_unszline(char *mask) +void viagra_cmd_unszline(char *mask) { send_cmd(NULL, "UNSZLINE 0 %s", mask); } -void anope_cmd_szline(char *mask, char *reason, char *whom) +void viagra_cmd_szline(char *mask, char *reason, char *whom) { send_cmd(NULL, "SZLINE %s :%s", mask, reason); } -void anope_cmd_svsnoop(char *server, int set) +void viagra_cmd_svsnoop(char *server, int set) { send_cmd(NULL, "SVSNOOP %s %s", server, (set ? "+" : "-")); } -void anope_cmd_svsadmin(char *server, int set) +void viagra_cmd_svsadmin(char *server, int set) { - anope_cmd_svsnoop(server, set); + viagra_cmd_svsnoop(server, set); } -void anope_cmd_sgline(char *mask, char *reason) +void viagra_cmd_sgline(char *mask, char *reason) { send_cmd(NULL, "SGLINE %d :%s:%s", strlen(mask), mask, reason); } -void anope_cmd_remove_akill(char *user, char *host) +void viagra_cmd_remove_akill(char *user, char *host) { send_cmd(NULL, "RAKILL %s %s", host, user); } /* PART */ -void anope_cmd_part(char *nick, char *chan, const char *fmt, ...) +void viagra_cmd_part(char *nick, char *chan, char *buf) { - va_list args; - char buf[BUFSIZE]; - *buf = '\0'; - - if (fmt) { - va_start(args, fmt); - vsnprintf(buf, BUFSIZE - 1, fmt, args); - va_end(args); - } - if (!nick || !chan) { return; } @@ -811,20 +792,20 @@ void anope_cmd_part(char *nick, char *chan, const char *fmt, ...) } } -void anope_cmd_topic(char *whosets, char *chan, char *whosetit, - char *topic, time_t when) +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 anope_cmd_vhost_off(User * u) +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 anope_cmd_vhost_on(char *nick, char *vIdent, char *vhost) +void viagra_cmd_vhost_on(char *nick, char *vIdent, char *vhost) { if (vIdent) { send_cmd(NULL, "CHGIDENT %s %s", nick, vIdent); @@ -833,12 +814,12 @@ void anope_cmd_vhost_on(char *nick, char *vIdent, char *vhost) send_cmd(NULL, "SVSCHGHOST %s %s", nick, vhost); } -void anope_cmd_unsqline(char *user) +void viagra_cmd_unsqline(char *user) { send_cmd(NULL, "UNSQLINE %s", user); } -void anope_cmd_join(char *user, char *channel, time_t chantime) +void viagra_cmd_join(char *user, char *channel, time_t chantime) { send_cmd(user, "SJOIN %ld %s", (long int) chantime, channel); } @@ -853,8 +834,8 @@ void anope_cmd_join(char *user, char *channel, time_t chantime) * parv[5]=time set * parv[6]=reason */ -void anope_cmd_akill(char *user, char *host, char *who, time_t when, - time_t expires, char *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); @@ -868,37 +849,16 @@ void anope_cmd_akill(char *user, char *host, char *who, time_t when, * parv[2] = nick stamp * parv[3] = kill message */ -void anope_cmd_svskill(char *source, char *user, const char *fmt, ...) +void viagra_cmd_svskill(char *source, char *user, char *buf) { - va_list args; - char buf[BUFSIZE]; - *buf = '\0'; - - if (!source || !user) { - return; - } - - if (fmt) { - va_start(args, fmt); - vsnprintf(buf, BUFSIZE - 1, fmt, args); - va_end(args); + if (buf) { send_cmd(source, "SVSKILL %s :%s", user, buf); } return; } -void anope_cmd_mode(char *source, char *dest, const char *fmt, ...) +void viagra_cmd_mode(char *source, char *dest, char *buf) { - 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; } @@ -915,18 +875,8 @@ void anope_cmd_mode(char *source, char *dest, const char *fmt, ...) } /* QUIT */ -void anope_cmd_quit(char *source, const char *fmt, ...) +void viagra_cmd_quit(char *source, char *buf) { - 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) { send_cmd(source, "QUIT :%s", buf); } else { @@ -951,46 +901,28 @@ int anope_event_ping(char *source, int ac, char **av) { if (ac < 1) return MOD_CONT; - anope_cmd_pong(ac > 1 ? av[1] : ServerName, av[0]); + viagra_cmd_pong(ac > 1 ? av[1] : ServerName, av[0]); return MOD_CONT; } -void anope_cmd_svsmode(User * u, int ac, char **av) +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 anope_cmd_squit(char *servname, char *message) +void viagra_cmd_squit(char *servname, char *message) { send_cmd(NULL, "SQUIT %s :%s", servname, message); } /* PONG */ -void anope_cmd_pong(char *servname, char *who) +void viagra_cmd_pong(char *servname, char *who) { send_cmd(servname, "PONG %s", who); } -void anope_cmd_connect(int servernum) -{ - me_server = - new_server(NULL, ServerName, ServerDesc, SERVER_ISME, NULL); - - if (servernum == 1) { - anope_cmd_pass(RemotePassword); - } else if (servernum == 2) { - anope_cmd_pass(RemotePassword2); - } else if (servernum == 3) { - anope_cmd_pass(RemotePassword3); - } - anope_cmd_capab(); - anope_cmd_server(ServerName, 1, ServerDesc); - anope_cmd_svinfo(); - anope_cmd_burst(); -} - /* * svinfo * parv[0] = sender prefix @@ -999,29 +931,52 @@ void anope_cmd_connect(int servernum) * parv[3] = server is standalone or connected to non-TS only * parv[4] = server's idea of UTC time */ -void anope_cmd_svinfo() +void viagra_cmd_svinfo() { send_cmd(NULL, "SVINFO 5 3 0 :%ld", (long int) time(NULL)); } /* CAPAB */ -void anope_cmd_capab() +void viagra_cmd_capab() { send_cmd(NULL, "CAPAB TS5 NOQUIT SSJOIN BURST UNCONNECT NICKIP"); } /* PASS */ -void anope_cmd_pass(char *pass) +void viagra_cmd_pass(char *pass) { send_cmd(NULL, "PASS %s :TS", pass); } /* SERVER */ -void anope_cmd_server(char *servname, int hop, char *descript) +void viagra_cmd_server(char *servname, int hop, char *descript) { send_cmd(NULL, "SERVER %s %d :%s", servname, hop, ServerDesc); } +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) { @@ -1174,61 +1129,34 @@ int anope_event_motd(char *source, int ac, char **av) return MOD_CONT; } -void anope_cmd_notice_ops(char *source, char *dest, const char *fmt, ...) +void viagra_cmd_notice_ops(char *source, char *dest, char *buf) { - 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) { send_cmd(NULL, "NOTICE @%s :%s", dest, buf); } return; } -void anope_cmd_notice(char *source, char *dest, const char *fmt, ...) +void viagra_cmd_notice(char *source, char *dest, char *buf) { - 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; } if (UsePrivmsg) { - anope_cmd_privmsg2(source, dest, buf); + viagra_cmd_privmsg2(source, dest, buf); } else { send_cmd(source, "NOTICE %s :%s", dest, buf); } } -void anope_cmd_notice2(char *source, char *dest, char *msg) +void viagra_cmd_notice2(char *source, char *dest, char *msg) { send_cmd(source, "NOTICE %s :%s", dest, msg); } -void anope_cmd_privmsg(char *source, char *dest, const char *fmt, ...) +void viagra_cmd_privmsg(char *source, char *dest, char *buf) { - 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; } @@ -1236,34 +1164,24 @@ void anope_cmd_privmsg(char *source, char *dest, const char *fmt, ...) send_cmd(source, "PRIVMSG %s :%s", dest, buf); } -void anope_cmd_privmsg2(char *source, char *dest, char *msg) +void viagra_cmd_privmsg2(char *source, char *dest, char *msg) { send_cmd(source, "PRIVMSG %s :%s", dest, msg); } -void anope_cmd_serv_notice(char *source, char *dest, char *msg) +void viagra_cmd_serv_notice(char *source, char *dest, char *msg) { send_cmd(source, "NOTICE $%s :%s", dest, msg); } -void anope_cmd_serv_privmsg(char *source, char *dest, char *msg) +void viagra_cmd_serv_privmsg(char *source, char *dest, char *msg) { send_cmd(source, "PRIVMSG $%s :%s", dest, msg); } /* GLOBOPS */ -void anope_cmd_global(char *source, const char *fmt, ...) +void viagra_cmd_global(char *source, char *buf) { - 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; } @@ -1272,7 +1190,7 @@ void anope_cmd_global(char *source, const char *fmt, ...) } /* 391 */ -void anope_cmd_391(char *source, char *timestr) +void viagra_cmd_391(char *source, char *timestr) { if (!timestr) { return; @@ -1281,18 +1199,8 @@ void anope_cmd_391(char *source, char *timestr) } /* 250 */ -void anope_cmd_250(const char *fmt, ...) +void viagra_cmd_250(char *buf) { - 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; } @@ -1301,18 +1209,8 @@ void anope_cmd_250(const char *fmt, ...) } /* 307 */ -void anope_cmd_307(const char *fmt, ...) +void viagra_cmd_307(char *buf) { - 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; } @@ -1321,18 +1219,8 @@ void anope_cmd_307(const char *fmt, ...) } /* 311 */ -void anope_cmd_311(const char *fmt, ...) +void viagra_cmd_311(char *buf) { - 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; } @@ -1341,18 +1229,8 @@ void anope_cmd_311(const char *fmt, ...) } /* 312 */ -void anope_cmd_312(const char *fmt, ...) +void viagra_cmd_312(char *buf) { - 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; } @@ -1361,18 +1239,8 @@ void anope_cmd_312(const char *fmt, ...) } /* 317 */ -void anope_cmd_317(const char *fmt, ...) +void viagra_cmd_317(char *buf) { - 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; } @@ -1381,7 +1249,7 @@ void anope_cmd_317(const char *fmt, ...) } /* 219 */ -void anope_cmd_219(char *source, char *letter) +void viagra_cmd_219(char *source, char *letter) { if (!source) { return; @@ -1396,7 +1264,7 @@ void anope_cmd_219(char *source, char *letter) } /* 401 */ -void anope_cmd_401(char *source, char *who) +void viagra_cmd_401(char *source, char *who) { if (!source || !who) { return; @@ -1405,7 +1273,7 @@ void anope_cmd_401(char *source, char *who) } /* 318 */ -void anope_cmd_318(char *source, char *who) +void viagra_cmd_318(char *source, char *who) { if (!source || !who) { return; @@ -1415,18 +1283,8 @@ void anope_cmd_318(char *source, char *who) } /* 242 */ -void anope_cmd_242(const char *fmt, ...) +void viagra_cmd_242(char *buf) { - 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; } @@ -1435,18 +1293,8 @@ void anope_cmd_242(const char *fmt, ...) } /* 243 */ -void anope_cmd_243(const char *fmt, ...) +void viagra_cmd_243(char *buf) { - 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; } @@ -1455,18 +1303,8 @@ void anope_cmd_243(const char *fmt, ...) } /* 211 */ -void anope_cmd_211(const char *fmt, ...) +void viagra_cmd_211(char *buf) { - 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; } @@ -1474,35 +1312,24 @@ void anope_cmd_211(const char *fmt, ...) send_cmd(NULL, "211 %s ", buf); } -void anope_cmd_351(char *source) +void viagra_cmd_351(char *source) { send_cmd(ServerName, "351 %s Anope-%s %s :%s - %s -- %s", source, version_number, ServerName, ircd->name, version_flags, version_build); } -void anope_cmd_bot_nick(char *nick, char *user, char *host, char *real, - char *modes) +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); - anope_cmd_sqline(nick, "Reserved for services"); + viagra_cmd_sqline(nick, "Reserved for services"); } -void anope_cmd_kick(char *source, char *chan, char *user, const char *fmt, - ...) +void viagra_cmd_kick(char *source, char *chan, char *user, char *buf) { - 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) { send_cmd(source, "KICK %s %s :%s", chan, user, buf); } else { @@ -1510,39 +1337,39 @@ void anope_cmd_kick(char *source, char *chan, char *user, const char *fmt, } } -void anope_cmd_nick(char *nick, char *name, char *modes) +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); - anope_cmd_sqline(nick, "Reserved for services"); + viagra_cmd_sqline(nick, "Reserved for services"); } -void anope_cmd_372(char *source, char *msg) +void viagra_cmd_372(char *source, char *msg) { send_cmd(ServerName, "372 %s :- %s", source, msg); } -void anope_cmd_372_error(char *source) +void viagra_cmd_372_error(char *source) { send_cmd(ServerName, "422 %s :- MOTD file not found! Please " "contact your IRC administrator.", source); } -void anope_cmd_375(char *source) +void viagra_cmd_375(char *source) { send_cmd(ServerName, "375 %s :- %s Message of the Day", source, ServerName); } -void anope_cmd_376(char *source) +void viagra_cmd_376(char *source) { send_cmd(ServerName, "376 %s :End of /MOTD command.", source); } /* INVITE */ -void anope_cmd_invite(char *source, char *chan, char *nick) +void viagra_cmd_invite(char *source, char *chan, char *nick) { if (!source || !chan || !nick) { return; @@ -1551,7 +1378,7 @@ void anope_cmd_invite(char *source, char *chan, char *nick) send_cmd(source, "INVITE %s %s", nick, chan); } -void anope_cmd_bot_chan_mode(char *nick, char *chan) +void viagra_cmd_bot_chan_mode(char *nick, char *chan) { anope_cmd_mode(nick, chan, "%s %s", ircd->botchanumode, nick); } @@ -1563,19 +1390,19 @@ int anope_event_capab(char *source, int ac, char **av) } /* SVSHOLD - set */ -void anope_cmd_svshold(char *nick) +void viagra_cmd_svshold(char *nick) { /* Not supported by this IRCD */ } /* SVSHOLD - release */ -void anope_cmd_release_svshold(char *nick) +void viagra_cmd_release_svshold(char *nick) { /* Not Supported by this IRCD */ } /* SVSNICK */ -void anope_cmd_svsnick(char *source, char *guest, time_t when) +void viagra_cmd_svsnick(char *source, char *guest, time_t when) { if (!source || !guest) { return; @@ -1583,28 +1410,28 @@ void anope_cmd_svsnick(char *source, char *guest, time_t when) send_cmd(NULL, "SVSNICK %s %s :%ld", source, guest, (long int) when); } -void anope_cmd_guest_nick(char *nick, char *user, char *host, char *real, - char *modes) +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 anope_cmd_svso(char *source, char *nick, char *flag) +void viagra_cmd_svso(char *source, char *nick, char *flag) { /* Not Supported by this IRCD */ } /* SVSMODE -b */ -void anope_cmd_unban(char *name, char *nick) +void viagra_cmd_unban(char *name, char *nick) { - anope_cmd_svsmode_chan(name, "-b", nick); + viagra_cmd_svsmode_chan(name, "-b", nick); } /* SVSMODE channel modes */ -void anope_cmd_svsmode_chan(char *name, char *mode, char *nick) +void viagra_cmd_svsmode_chan(char *name, char *mode, char *nick) { if (nick) { send_cmd(ServerName, "SVSMODE %s %s %s", name, mode, nick); @@ -1615,7 +1442,7 @@ void anope_cmd_svsmode_chan(char *name, char *mode, char *nick) /* SVSMODE +d */ /* sent if svid is something weird */ -void anope_cmd_svid_umode(char *nick, time_t ts) +void viagra_cmd_svid_umode(char *nick, time_t ts) { send_cmd(ServerName, "SVSMODE %s %lu +d 1", nick, (unsigned long int) ts); @@ -1623,18 +1450,18 @@ void anope_cmd_svid_umode(char *nick, time_t ts) /* SVSMODE +d */ /* nc_change was = 1, and there is no na->status */ -void anope_cmd_nc_change(User * u) +void viagra_cmd_nc_change(User * u) { common_svsmode(u, "+d", "1"); } /* SVSMODE +d */ -void anope_cmd_svid_umode2(User * u, char *ts) +void viagra_cmd_svid_umode2(User * u, char *ts) { /* not used by bahamut ircds */ } -void anope_cmd_svid_umode3(User * u, char *ts) +void viagra_cmd_svid_umode3(User * u, char *ts) { if (u->svid != u->timestamp) { common_svsmode(u, "+rd", ts); @@ -1644,7 +1471,7 @@ void anope_cmd_svid_umode3(User * u, char *ts) } /* NICK <newnick> */ -void anope_cmd_chg_nick(char *oldnick, char *newnick) +void viagra_cmd_chg_nick(char *oldnick, char *newnick) { if (!oldnick || !newnick) { return; @@ -1659,7 +1486,7 @@ void anope_cmd_chg_nick(char *oldnick, char *newnick) * parv[1] = nick to make join * parv[2] = channel(s) to join */ -void anope_cmd_svsjoin(char *source, char *nick, char *chan) +void viagra_cmd_svsjoin(char *source, char *nick, char *chan) { send_cmd(source, "SVSJOIN %s :%s", nick, chan); } @@ -1670,17 +1497,17 @@ void anope_cmd_svsjoin(char *source, char *nick, char *chan) * parv[1] = nick to make part * parv[2] = channel(s) to part */ -void anope_cmd_svspart(char *source, char *nick, char *chan) +void viagra_cmd_svspart(char *source, char *nick, char *chan) { send_cmd(source, "SVSPART %s :%s", nick, chan); } -void anope_cmd_swhois(char *source, char *who, char *mask) +void viagra_cmd_swhois(char *source, char *who, char *mask) { /* not supported */ } -int anope_flood_mode_check(char *value) +int viagra_flood_mode_check(char *value) { return 0; } @@ -1705,30 +1532,25 @@ int anope_event_invite(char *source, int ac, char **av) return MOD_CONT; } -void anope_cmd_burst() -{ - send_cmd(NULL, "BURST"); -} - -void anope_cmd_eob() +void viagra_cmd_eob() { send_cmd(NULL, "BURST 0"); } -void anope_cmd_jupe(char *jserver, char *who, char *reason) +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 : ""); - anope_cmd_squit(jserver, rbuf); - anope_cmd_server(jserver, 2, rbuf); + 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 anope_cmd_global_legacy(char *source, char *fmt) +void viagra_cmd_global_legacy(char *source, char *fmt) { send_cmd(source ? source : ServerName, "GLOBOPS :%s", fmt); } @@ -1737,24 +1559,16 @@ void anope_cmd_global_legacy(char *source, char *fmt) 1 = valid nick 0 = nick is in valid */ -int anope_valid_nick(char *nick) +int viagra_valid_nick(char *nick) { /* no hard coded invalid nicks */ return 1; } -void anope_cmd_ctcp(char *source, char *dest, const char *fmt, ...) +void viagra_cmd_ctcp(char *source, char *dest, char *buf) { - va_list args; - char buf[BUFSIZE]; char *s; - *buf = '\0'; - if (fmt) { - va_start(args, fmt); - vsnprintf(buf, BUFSIZE - 1, fmt, args); - va_end(args); - } if (!buf) { return; } else { @@ -1765,4 +1579,118 @@ void anope_cmd_ctcp(char *source, char *dest, const char *fmt, ...) free(s); } -#endif + +/** + * 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_unsqline); + 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_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_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..4e145e92e --- /dev/null +++ b/src/protocol/viagra.h @@ -0,0 +1,132 @@ +/* Viagra IRCD functions + * + * (C) 2003-2005 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/servers.c b/src/servers.c index 872e1d5a0..2fe928318 100644 --- a/src/servers.c +++ b/src/servers.c @@ -343,7 +343,7 @@ void do_server(const char *source, char *servername, char *hops, s = findserver(servlist, source); new_server(s, servername, descript, 0, numeric); - send_event(EVENT_SERVER_CONNECT, servername); + send_event(EVENT_SERVER_CONNECT, 1, servername); } /*************************************************************************/ @@ -372,7 +372,7 @@ void do_squit(const char *source, int ac, char **av) alog("SQUIT for nonexistent server (%s)!!", av[0]); return; } - send_event(EVENT_SERVER_SQUIT, s->name); + send_event(EVENT_SERVER_SQUIT, 1, s->name); snprintf(buf, sizeof(buf), "%s %s", s->name, (s->uplink ? s->uplink->name : "")); diff --git a/src/tools/Makefile.win32 b/src/tools/Makefile.win32 index 2a60490bf..d48eb5c6b 100644 --- a/src/tools/Makefile.win32 +++ b/src/tools/Makefile.win32 @@ -19,7 +19,6 @@ spotless: clean -@del *.exe *.lib *.exp install: FRC - -@mkdir ..\..\$(DATDEST)\tools - -@copy *.exe ..\..\$(DATDEST)\tools + -@copy *.exe ..\..\$(DATDEST)\ FRC: diff --git a/src/tools/db-merger.c b/src/tools/db-merger.c index 1c8a2d7bc..89ee72ea5 100644 --- a/src/tools/db-merger.c +++ b/src/tools/db-merger.c @@ -30,9 +30,9 @@ #include <time.h> #ifndef _WIN32 - #include <unistd.h> +#include <unistd.h> #else - #include "sysconf.h" +#include "sysconf.h" #endif /* CONFIGURATION BLOCK */ diff --git a/src/tools/epona2anope.c b/src/tools/epona2anope.c index 5ac3cfe8f..e88cae106 100644 --- a/src/tools/epona2anope.c +++ b/src/tools/epona2anope.c @@ -30,9 +30,9 @@ #include <time.h> #ifndef _WIN32 - #include <unistd.h> +#include <unistd.h> #else - #include "sysconf.h" +#include "sysconf.h" #endif /* CONFIGURATION BLOCK */ diff --git a/src/users.c b/src/users.c index af95c067c..3f9fb9235 100644 --- a/src/users.c +++ b/src/users.c @@ -212,7 +212,7 @@ void delete_user(User * user) } free(realname); } - send_event(EVENT_USER_LOGOFF, user->nick); + send_event(EVENT_USER_LOGOFF, 1, user->nick); if (debug >= 2) alog("debug: delete_user() called"); @@ -642,7 +642,7 @@ User *do_nick(const char *source, char *nick, char *username, char *host, } else { user->svid = 1; } - send_event(EVENT_NEWNICK, nick); + send_event(EVENT_NEWNICK, 1, nick); } else { /* An old user changing nicks. */ @@ -687,7 +687,7 @@ User *do_nick(const char *source, char *nick, char *username, char *host, } change_user_nick(user, nick); - send_event(EVENT_CHANGE_NICK, nick); + send_event(EVENT_CHANGE_NICK, 1, nick); if ((old_na ? old_na->nc : NULL) == (user->na ? user->na->nc : NULL)) @@ -892,7 +892,7 @@ int is_protected(User * user) int is_oper(User * user) { if (user) { - return (user->mode & UMODE_o); + return (user->mode & anope_get_oper_mode()); } else { return 0; } diff --git a/version.log b/version.log index bbc0c8fbe..6d08d4596 100644 --- a/version.log +++ b/version.log @@ -8,25 +8,336 @@ VERSION_MAJOR="1" VERSION_MINOR="7" VERSION_PATCH="8" -VERSION_BUILD="707" +VERSION_BUILD="753" # $Log$ # -# BUILD : 1.7.8 (707) +# 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 : Added src/tools/Makefile.win32, which was missing since last commit +# NOTES : Updates ns_noop by DrS, and added a small debug with send_event which can be handy with debugging # -# BUILD : 1.7.8 (687) +# BUILD : 1.7.8 (747) # BUGS : N/A -# NOTES : Another heinz makefile.win32 patch :) +# NOTES : win32 makefile patchs - install.vbs isnt in svn yet! # -# BUILD : 1.7.8 (686) +# BUILD : 1.7.8 (746) # BUGS : N/A -# NOTES : Applied small makefile patch for win32 +# NOTES : Compile issues when encryption is used # -# BUILD : 1.7.8 (685) -# BUGS : none -# NOTES : svn FSFS test. +# 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 : |