diff --git a/.BANNER b/.BANNER index bd5ff5884..22fe35fa6 100644 --- a/.BANNER +++ b/.BANNER @@ -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 diff --git a/Changes b/Changes index ac81c9d5d..e9307ba47 100644 --- a/Changes +++ b/Changes @@ -1,7 +1,20 @@ Anope Version S V N ------------------- Provided by Anope Dev. - 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. - 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. - 2005 01/30 F Compiling modules under Mac OSX. [#285] 03/07 R Removed Proxy Detector from core. [ #00] +Provided by Brain - 2005 +04/18 A InspIRCd 1.0 Beta 3 support module. [ #00] + Provided by Trystan - 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 - 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 - 2005 Provided by crazytoon - 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. 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 [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 +# 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 [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 [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 [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 [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 [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 [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 [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 ** ########################################################################### diff --git a/Config b/Config index bb4417927..c6922cd2f 100755 --- a/Config +++ b/Config @@ -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 @@ -64,6 +64,84 @@ # superseded by that of other directives or incorporated into the main # program. +########################################################################### +# +# IRCD configuration +# +########################################################################### + +# IRCDModule [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 +# 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 [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 [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 [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 [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 [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 [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 [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 "ircd_catserv" +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. +# +#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. diff --git a/docs/FAQ b/docs/FAQ index 7addb9910..8143987d2 100644 --- a/docs/FAQ +++ b/docs/FAQ @@ -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 * Trystan Scott Lee * Chris Hogben + + Anope's Windows Installer was made using: + + * Inno Setup 5 + 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 similarity index 99% rename from src/modules/module.h rename to 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 */ @@ -383,6 +364,40 @@ struct uid_ { char *uid; }; +/*************************************************************************/ +/* Config Details */ +/*************************************************************************/ + +#define MAXPARAMS 8 + +/* Configuration directives */ + +typedef struct { + char *name; + struct { + int type; /* PARAM_* below */ + int flags; /* Same */ + void *ptr; /* Pointer to where to store the value */ + } params[MAXPARAMS]; +} Directive; + +#define PARAM_NONE 0 +#define PARAM_INT 1 +#define PARAM_POSINT 2 /* Positive integer only */ +#define PARAM_PORT 3 /* 1..65535 only */ +#define PARAM_STRING 4 +#define PARAM_TIME 5 +#define PARAM_STRING_ARRAY 6 /* Array of string */ +#define PARAM_SET -1 /* Not a real parameter; just set the + * given integer variable to 1 */ +#define PARAM_DEPRECATED -2 /* Set for deprecated directives; `ptr' + * is a function pointer to call */ + +/* Flags: */ +#define PARAM_OPTIONAL 0x01 +#define PARAM_FULLONLY 0x02 /* Directive only allowed if !STREAMLINED */ +#define PARAM_RELOAD 0x04 /* Directive is reloadable */ + /*************************************************************************/ /* File version for each database. Was one version for all before but was @@ -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 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,6 +3287,56 @@ HELP_HELP_HOST # ########################################################################### +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 @@ -3295,18 +3345,7 @@ NICK_HELP per més informació sobre una comanda especifica escriu /msg %S HELP comanda. - REGISTER Registra un nickname - GROUP Ingresa en un grup - IDENTIFY Per identificar-te amb la teva clau - ACCESS Modifica la llista d'adreçes autoritzades - SET Estableix proteccions, inclouent kills - DROP Cancela el registre d'un nickname - RECOVER Kickeja un usuari que estigui utilitzant el teu nickname - RELEASE Repren possesió del teu nick després de RECOVER - SENDPASS Vas oblidar la teva clau? Intenta això - - Altres comandes: GHOST, GLIST, INFO, LIST, LOGOUT, STATUS - +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,6 +3922,87 @@ NICK_SERVADMIN_HELP_UNSUSPEND # ChanServ help messages # ########################################################################### +CHAN_HELP_CMD_GETPASS + GETPASS Retorna la clau de fundador per a un canal + (sols si l'encriptació esta deshabilitada) +CHAN_HELP_CMD_FORBID + FORBID Evita que un canal es faci servir +CHAN_HELP_CMD_SUSPEND + SUSPEND Prevent a channel from being used preserving + channel data and settings +CHAN_HELP_CMD_UNSUSPEND + UNSUSPEND Releases a suspended channel +CHAN_HELP_CMD_STATUS + STATUS Returns the current access level of a user + on a channel +CHAN_HELP_CMD_REGISTER + REGISTER Registra un canal +CHAN_HELP_CMD_IDENTIFY + IDENTIFY T'identifica amb la teva clau +CHAN_HELP_CMD_SET + SET Establir opcions i informació d'un canal +CHAN_HELP_CMD_AOP + AOP Modifica la llista d'usuaris AOP +CHAN_HELP_CMD_SOP + SOP Modifica la llista d'usuaris SOP +CHAN_HELP_CMD_ACCESS + ACCESS Modifica la llista d'usuaris privilegiats +CHAN_HELP_CMD_LEVELS + LEVELS Redefine el significat de nivells d'accés +CHAN_HELP_CMD_AKICK + AKICK Manté la llista d'AutoKick +CHAN_HELP_CMD_DROP + DROP Cancel.la l'enregistrament d'un canal +CHAN_HELP_CMD_SENDPASS + SENDPASS Ajuda a recuperar claus perdudes +CHAN_HELP_CMD_BAN + BAN Bans a selected nick on a channel +CHAN_HELP_CMD_CLEAR + CLEAR Tells ChanServ to clear certain settings on a channel +CHAN_HELP_CMD_DEVOICE + DEVOICE Devoices a selected nick on a channel +CHAN_HELP_CMD_GETKEY + GETKEY Returns the key of the given channel +CHAN_HELP_CMD_INFO + INFO Lists information about the named registered channel +CHAN_HELP_CMD_INVITE + INVITE Tells ChanServ to invite you or a given nick into a channel +CHAN_HELP_CMD_KICK + KICK Kicks a selected nick from a channel +CHAN_HELP_CMD_LIST + LIST Lists all registered channels matching the given pattern +CHAN_HELP_CMD_LOGOUT + LOGOUT This command will logout the selected nickname +CHAN_HELP_CMD_OP + OP Gives Op status to a selected nick on a channel +CHAN_HELP_CMD_TOPIC + TOPIC Manipulate the topic of the specified channel +CHAN_HELP_CMD_UNBAN + UNBAN Remove all bans preventing you from entering a channel +CHAN_HELP_CMD_VOICE + VOICE Voices a selected nick on a channel +CHAN_HELP_CMD_VOP + VOP Maintains the VOP (VOicePeople) list for a channel +CHAN_HELP_CMD_DEHALFOP + DEHALFOP Dehalfops a selected nick on a channel +CHAN_HELP_CMD_DEOWNER + DEOWNER Removes your owner status on a channel +CHAN_HELP_CMD_DEPROTECT + DEPROTECT Deprotects a selected nick on a channel +CHAN_HELP_CMD_HALFOP + HALFOP Halfops a selected nick on a channel +CHAN_HELP_CMD_HOP + HOP Maintains the HOP (HalfOP) list for a channel +CHAN_HELP_CMD_OWNER + OWNER Gives you owner status on channel +CHAN_HELP_CMD_PROTECT + PROTECT Protects a selected nick on a channel +CHAN_HELP_CMD_ADMIN + ADMIN Protects a selected nick on a channel +CHAN_HELP_CMD_DEADMIN + DEADMIN Deprotects a selected nick on a channel +CHAN_HELP_CMD_DEOP + DEOP Deops a selected nick on a channel CHAN_HELP %S et permet registrar i controlar varis @@ -3901,42 +4013,7 @@ CHAN_HELP Per a utilitzar-los, escriu /msg %S comanda. Per més informació sobre una comanda especifica, escriu /msg %S HELP comanda. - - REGISTER Registra un canal - IDENTIFY T'identifica amb la teva clau - SET Establir opcions i informació d'un canal - AOP Modifica la llista d'usuaris AOP - SOP Modifica la llista d'usuaris SOP - ACCESS Modifica la llista d'usuaris privilegiats - LEVELS Redefine el significat de nivells d'accés - AKICK Manté la llista d'AutoKick - DROP Cancel.la l'enregistrament d'un canal - SENDPASS Ajuda a recuperar claus perdudes - - Altres comandes: BAN, CLEAR, DEOP, DEVOICE, GETKEY, INFO, - INVITE, KICK, LIST, LOGOUT, OP, UNBAN, - VOICE, VOP - -CHAN_HELP_UNREAL - - Aquestes comandes tambe estan disponibles en aquesta xarxa: - DEHALFOP, DEOWNER, DEPROTECT, HALFOP, HOP, OWNER, - PROTECT - -CHAN_HELP_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_IRCD_PROTECT - - These commands are also available on this network: - DEPROTECT, PROTECT + 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 - serveis - -OPER_HELP_OPER_CMD - Comandes disponibles sols per a operadors i administradors - de serveis: - MODE Canvia els Modes d'un canal - KICK Kickeja un usuari d'un canal - CLEARMODES neteja els Modes d'un canal - KILLCLONES Mata tots els usuaris en un host - AKILL Manipula la llista AKILL - -OPER_HELP_OPER_CMD_EXTRA - Following commands are also available - -OPER_HELP_OPER_CMD_SGLINE - SGLINE Manipula la llista SGLINE - -OPER_HELP_OPER_CMD_SQLINE - SQLINE Manipula la llista SQLINE - -OPER_HELP_OPER_CMD_SZLINE - SZLINE Manipula la llista SZLINE - -OPER_HELP_ADMIN_CMD - Comandes disponibles només a administradors de serveis: +OPER_HELP_CMD_OPER OPER Modifica la llista d'operadors de serveis - CHANLIST Llista tots els records de canal - USERLIST Llista tots els records d'usuaris - LOGONNEWS Defineix missatges per a ser mostrats a usuaris - al conectarse - RANDOMNEWS Defineix missatges per a ser mostrats a usuaris - al conectarse - OPERNEWS Defineix missatges per a ser mostrats a usuaris - al transformar-se en operadors - SESSION Mostra la llista de sessions de host - EXCEPTION Modifica la llista de límit de sessió - CACHE Llista cau de hostnames utilitzats pel detector - de proxys - NOOP Temporalment elimina totes les linees O: - d'un servidor remotamente - JUPE "Jupiter" (Mart,Saturn....) un servidor - SET Estableix varies opcions globals dels serveis - RELOAD Recarrega la configuració dels serveis - UPDATE Força a la base de dades dels serveis a - ser actualitzada a disc inmediatament - QUIT Termina el programa de serveis sense grabar les dades - RESTART Guarda la base de dades dels serveis i - reinicia els serveis - QUIT Termina el programa de serveis sense guardar - els canvis - SHUTDOWN Termina el programa de serveis guardant els - canvios - - Comandes disponibles nomès pel super-usuari de serveis: +OPER_HELP_CMD_ADMIN 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_STAFF + STAFF Display Services staff and online status +OPER_HELP_CMD_MODE + MODE Canvia els Modes d'un canal +OPER_HELP_CMD_KICK + KICK Kickeja un usuari d'un canal +OPER_HELP_CMD_CLEARMODES + CLEARMODES neteja els Modes d'un canal +OPER_HELP_CMD_KILLCLONES + KILLCLONES Mata tots els usuaris en un host +OPER_HELP_CMD_AKILL + AKILL Manipula la llista AKILL +OPER_HELP_CMD_SGLINE + SGLINE Manipula la llista SGLINE +OPER_HELP_CMD_SQLINE + SQLINE Manipula la llista SQLINE +OPER_HELP_CMD_SZLINE + SZLINE Manipula la llista SZLINE +OPER_HELP_CMD_CHANLIST + CHANLIST Llista tots els records de canal +OPER_HELP_CMD_USERLIST + USERLIST Llista tots els records d'usuaris +OPER_HELP_CMD_LOGONNEWS + LOGONNEWS Defineix missatges per a ser mostrats a usuaris + al conectarse +OPER_HELP_CMD_RANDOMNEWS + RANDOMNEWS Defineix missatges per a ser mostrats a usuaris + al conectarse +OPER_HELP_CMD_OPERNEWS + OPERNEWS Defineix missatges per a ser mostrats a usuaris + al transformar-se en operadors +OPER_HELP_CMD_SESSION + SESSION Mostra la llista de sessions de host +OPER_HELP_CMD_EXCEPTION + EXCEPTION Modifica la llista de límit de sessió +OPER_HELP_CMD_NOOP + NOOP Temporalment elimina totes les linees O: + d'un servidor remotamente +OPER_HELP_CMD_JUPE + JUPE "Jupiter" (Mart,Saturn....) un servidor +OPER_HELP_CMD_IGNORE + IGNORE Modify the Services ignore list +OPER_HELP_CMD_SET + SET Estableix varies opcions globals dels serveis +OPER_HELP_CMD_RELOAD + RELOAD Recarrega la configuració dels serveis +OPER_HELP_CMD_UPDATE + UPDATE Força a la base de dades dels serveis a + ser actualitzada a disc inmediatament +OPER_HELP_CMD_RESTART + RESTART Guarda la base de dades dels serveis i + reinicia els serveis +OPER_HELP_CMD_QUIT + QUIT Termina el programa de serveis sense guardar + els canvis +OPER_HELP_CMD_SHUTDOWN + SHUTDOWN Termina el programa de serveis guardant els + canvios +OPER_HELP_CMD_DEFCON + DEFCON Manipulate the DefCon system +OPER_HELP_CMD_CHANKILL + CHANKILL Kill all users on a specific channel +OPER_HELP_CMD_OLINE OLINE Give Operflags to a certain user - -OPER_HELP_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 diff --git a/lang/de.l b/lang/de.l index 69661ae32..48f8698ca 100644 --- a/lang/de.l +++ b/lang/de.l @@ -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,6 +3307,60 @@ 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_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 @@ -3316,20 +3370,7 @@ NICK_HELP /msg %S Befehl. Für weitergehende Informationen zu einem bestimmten Befehl, tippe /msg %S HELP Befehl. - REGISTER Registriert einen Nicknamen - GROUP Verwaltung von Nickname-Gruppierungen - IDENTIFY Identifizierung des Nicknames - ACCESS Liste der autorisierten Adressen - SET Optionen einstellen, auch Kill-Schutz - DROP Die Registrierung einen Nicknamen löschen - RECOVER User killen, der deinen Nicknamen - verwendet - RELEASE Hebt die Nickname-Sperre auf nach der - verwendung des RECOVER Befehls - SENDPASS Passwort vergessen? Versuch das hier.. - - 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,6 +4043,93 @@ NICK_SERVADMIN_HELP_UNSUSPEND # ChanServ help messages # ########################################################################### +CHAN_HELP_CMD_GETPASS + GETPASS Liest das Passwort des Channel-Founders + aus der Datenbank aus (wenn die + Verschlüsselung deaktiviert ist) +CHAN_HELP_CMD_FORBID + FORBID Verhindert die Nutzung eines Channels +CHAN_HELP_CMD_SUSPEND + SUSPEND Verbietet jegliche Nutzung des Channels. + Die Channel Einstellungen bleiben jedoch + erhalten +CHAN_HELP_CMD_UNSUSPEND + UNSUSPEND Hebt ein SUSPEND wieder auf +CHAN_HELP_CMD_STATUS + STATUS Liefert das Zugriffslevel eines Users + in dem Channel +CHAN_HELP_CMD_REGISTER + REGISTER Einen Channel registrieren +CHAN_HELP_CMD_IDENTIFY + IDENTIFY Sich mit Passwort als Founder (z.B.) + des Channels identifizieren +CHAN_HELP_CMD_SET + SET Bestimmte Channel-Optionen und + Informationen einstellen +CHAN_HELP_CMD_AOP + AOP 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 +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 Mit Hilfe von %S kann man Channel registrieren und @@ -4023,46 +4140,8 @@ CHAN_HELP Um sie zu benutzen tippe /msg %S Befehl. Für weitere Informationen zu einem bestimmten Befehl, tippe : /msg %S HELP Befehl. + - REGISTER Einen Channel registrieren - IDENTIFY Sich mit Passwort als Founder (z.B.) - des Channels identifizieren - SET Bestimmte Channel-Optionen und - Informationen einstellen - AOP Die Liste von AOP User bearbeiten - SOP Die Liste von AOP User bearbeiten - ACCESS Die Liste der priviligierten User - bearbeiten - LEVELS Die Einstellungen verschiedener - Zugriffslevel neu definieren - AKICK Die Autokick-Liste bearbeiten - DROP Registrierung eines Channels aufheben - SENDPASS Hilft bei vergessenen Passwörtern - - Weitere 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_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 - - 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,8 +5139,34 @@ CHAN_SERVADMIN_HELP_STATUS # MemoServ help messages ## 22.10.2004 ## # ########################################################################### +MEMO_HELP_CMD_SEND + SEND Sendet eine Memo an einen Nickname oder Channel +MEMO_HELP_CMD_CANCEL + CANCEL Annulliert deine letzte gesendete Memo +MEMO_HELP_CMD_LIST + LIST Erzeugt eine Liste deiner Memos +MEMO_HELP_CMD_READ + READ Lesen einer oder mehrerer Memos +MEMO_HELP_CMD_DEL + DEL Löschen einer oder mehrerer Memos +MEMO_HELP_CMD_SET + SET Stellt bestimmte Optionen ein in Hinsicht + auf Memos +MEMO_HELP_CMD_INFO + INFO Zeigt Informationen bezüglich deiner Memos an +MEMO_HELP_CMD_RSEND + RSEND Sendet eine Memo an einen Nickname oder Channel + und sendet dir eine Empfangsbestätigung zurück +MEMO_HELP_CMD_CHECK + CHECK Überprüft ob deine letzte gesendete Memo an + einen Nicknamen gelesen wurde -MEMO_HELP +MEMO_HELP_CMD_SENDALL + SENDALL Sendet eine Nachricht an alle registrierten User. +MEMO_HELP_CMD_STAFF + STAFF Sendet allen Opers/Admins eine Nachricht. + +MEMO_HELP_HEADER %S ist eine Einrichtung, die es erlaubt, dass sich IRC User untereinander kurze Textnachrichten senden, egal ob die Empfänger zu dem Zeitpunkt online @@ -5087,25 +5178,10 @@ MEMO_HELP %S's Befehle beinhalten: - SEND Sendet eine Memo an einen Nickname oder Channel - CANCEL Annulliert deine letzte gesendete Memo - LIST Erzeugt eine Liste deiner Memos - READ Lesen einer oder mehrerer Memos - DEL Löschen einer oder mehrerer Memos - SET Stellt bestimmte Optionen ein in Hinsicht - auf Memos - INFO Zeigt Informationen bezüglich deiner Memos an - RSEND Sendet eine Memo an einen Nickname oder Channel - und sendet dir eine Empfangsbestätigung zurück - CHECK Überprüft ob deine letzte gesendete Memo an - einen Nicknamen gelesen wurde - MEMO_HELP_ADMIN - SENDALL Sendet eine Nachricht an alle registrierten User. - + not used. MEMO_HELP_OPER - STAFF Sendet allen Opers/Admins eine Nachricht. - + 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,6 +3162,55 @@ HELP_HELP_HOST # ########################################################################### +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 @@ -3168,19 +3219,9 @@ NICK_HELP For more information on a specific command, type /msg %S HELP command. - REGISTER Register a nickname - GROUP Join a group - IDENTIFY Identify yourself with your password - ACCESS Modify the list of authorized addresses - SET Set options, including kill protection - DROP Cancel the registration of a nickname - RECOVER Kill another user who has taken your nick - RELEASE Regain custody of your nick after RECOVER - SENDPASS Forgot your password? Try this - - Other commands: GHOST, ALIST, GLIST, INFO, LIST, LOGOUT, - STATUS, 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,6 +3786,87 @@ NICK_SERVADMIN_HELP_UNSUSPEND # ########################################################################### +CHAN_HELP_CMD_GETPASS + GETPASS Retrieve the founder password for a channel +CHAN_HELP_CMD_FORBID + FORBID Prevent a channel from being used +CHAN_HELP_CMD_SUSPEND + SUSPEND Prevent a channel from being used preserving + channel data and settings +CHAN_HELP_CMD_UNSUSPEND + UNSUSPEND Releases a suspended channel +CHAN_HELP_CMD_STATUS + STATUS Returns the current access level of a user + on a channel +CHAN_HELP_CMD_REGISTER + REGISTER Register a channel +CHAN_HELP_CMD_IDENTIFY + IDENTIFY Identify yourself with your password +CHAN_HELP_CMD_SET + SET Set channel options and information +CHAN_HELP_CMD_AOP + AOP Modify the list of AOP users +CHAN_HELP_CMD_SOP + SOP Modify the list of SOP users +CHAN_HELP_CMD_ACCESS + ACCESS Modify the list of privileged users +CHAN_HELP_CMD_LEVELS + LEVELS Redefine the meanings of access levels +CHAN_HELP_CMD_AKICK + AKICK Maintain the AutoKick list +CHAN_HELP_CMD_DROP + DROP Cancel the registration of a channel +CHAN_HELP_CMD_SENDPASS + SENDPASS Help retrieve lost passwords +CHAN_HELP_CMD_BAN + BAN Bans a selected nick on a channel +CHAN_HELP_CMD_CLEAR + CLEAR Tells ChanServ to clear certain settings on a channel +CHAN_HELP_CMD_DEVOICE + DEVOICE Devoices a selected nick on a channel +CHAN_HELP_CMD_GETKEY + GETKEY Returns the key of the given channel +CHAN_HELP_CMD_INFO + INFO Lists information about the named registered channel +CHAN_HELP_CMD_INVITE + INVITE Tells ChanServ to invite you or a given nick into a channel +CHAN_HELP_CMD_KICK + KICK Kicks a selected nick from a channel +CHAN_HELP_CMD_LIST + LIST Lists all registered channels matching the given pattern +CHAN_HELP_CMD_LOGOUT + LOGOUT This command will logout the selected nickname +CHAN_HELP_CMD_OP + OP Gives Op status to a selected nick on a channel +CHAN_HELP_CMD_TOPIC + TOPIC Manipulate the topic of the specified channel +CHAN_HELP_CMD_UNBAN + UNBAN Remove all bans preventing you from entering a channel +CHAN_HELP_CMD_VOICE + VOICE Voices a selected nick on a channel +CHAN_HELP_CMD_VOP + VOP Maintains the VOP (VOicePeople) list for a channel +CHAN_HELP_CMD_DEHALFOP + DEHALFOP Dehalfops a selected nick on a channel +CHAN_HELP_CMD_DEOWNER + DEOWNER Removes your owner status on a channel +CHAN_HELP_CMD_DEPROTECT + DEPROTECT Deprotects a selected nick on a channel +CHAN_HELP_CMD_HALFOP + HALFOP Halfops a selected nick on a channel +CHAN_HELP_CMD_HOP + HOP Maintains the HOP (HalfOP) list for a channel +CHAN_HELP_CMD_OWNER + OWNER Gives you owner status on channel +CHAN_HELP_CMD_PROTECT + PROTECT Protects a selected nick on a channel +CHAN_HELP_CMD_ADMIN + ADMIN Protects a selected nick on a channel +CHAN_HELP_CMD_DEADMIN + DEADMIN Deprotects a selected nick on a channel +CHAN_HELP_CMD_DEOP + DEOP Deops a selected nick on a channel + CHAN_HELP %S allows you to register and control various aspects of channels. %S can often prevent @@ -3761,43 +3875,8 @@ CHAN_HELP commands are listed below; to use them, type /msg %S command. For more information on a specific command, type /msg %S HELP command. + - REGISTER Register a channel - IDENTIFY Identify yourself with your password - SET Set channel options and information - AOP Modify the list of AOP users - SOP Modify the list of SOP users - ACCESS Modify the list of privileged users - LEVELS Redefine the meanings of access levels - AKICK Maintain the AutoKick list - DROP Cancel the registration of a channel - SENDPASS Help 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_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 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,7 +4812,30 @@ CHAN_SERVADMIN_HELP_STATUS # ########################################################################### -MEMO_HELP +MEMO_HELP_CMD_SEND + SEND Send a memo to a nick or channel +MEMO_HELP_CMD_CANCEL + CANCEL Cancel last memo you sent +MEMO_HELP_CMD_LIST + LIST List your memos +MEMO_HELP_CMD_READ + READ Read a memo or memos +MEMO_HELP_CMD_DEL + DEL Delete a memo or memos +MEMO_HELP_CMD_SET + SET Set options related to memos +MEMO_HELP_CMD_INFO + INFO Displays information about your memos +MEMO_HELP_CMD_RSEND + RSEND Sends a memo and requests a read receipt +MEMO_HELP_CMD_CHECK + CHECK Checks if last memo to a nick was read +MEMO_HELP_CMD_SENDALL + SENDALL Send a memo to all registered users +MEMO_HELP_CMD_STAFF + STAFF Send a memo to all opers/admins + +MEMO_HELP_HEADER %S is a utility allowing IRC users to send short messages to other IRC users, whether they are online at the time or not, or to channels(*). Both the sender's @@ -4753,21 +4844,11 @@ MEMO_HELP %S's commands include: - SEND Send a memo to a nick or channel - CANCEL Cancel last memo you sent - LIST List your memos - READ Read a memo or memos - DEL Delete a memo or memos - SET Set options related to memos - INFO Displays information about your memos - RSEND Sends a memo and requests a read receipt - CHECK Checks if last memo to a nick was read 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 @@ -4949,81 +5030,89 @@ MEMO_HELP_CHECK # OperServ help messages # ########################################################################### +OPER_HELP_CMD_GLOBAL + GLOBAL Send a message to all users +OPER_HELP_CMD_STATS + STATS Show status of Services and network +OPER_HELP_CMD_OPER + OPER Modify the Services operator list +OPER_HELP_CMD_ADMIN + ADMIN Modify the Services admin list +OPER_HELP_CMD_STAFF + STAFF Display Services staff and online status +OPER_HELP_CMD_MODE + MODE Change a channel's modes +OPER_HELP_CMD_KICK + KICK Kick a user from a channel +OPER_HELP_CMD_CLEARMODES + CLEARMODES Clear modes of a channel +OPER_HELP_CMD_KILLCLONES + KILLCLONES Kill all users that have a certain host +OPER_HELP_CMD_AKILL + AKILL Manipulate the AKILL list +OPER_HELP_CMD_SGLINE + SGLINE Manipulate the SGLINE list +OPER_HELP_CMD_SQLINE + SQLINE Manipulate the SQLINE list +OPER_HELP_CMD_SZLINE + SZLINE Manipulate the SZLINE list +OPER_HELP_CMD_CHANLIST + CHANLIST Lists all channel records +OPER_HELP_CMD_USERLIST + USERLIST Lists all user records +OPER_HELP_CMD_LOGONNEWS + LOGONNEWS Define messages to be shown to users at logon +OPER_HELP_CMD_RANDOMNEWS + RANDOMNEWS Define messages to be randomly shown to users + at logon +OPER_HELP_CMD_OPERNEWS + OPERNEWS Define messages to be shown to users who oper +OPER_HELP_CMD_SESSION + SESSION View the list of host sessions +OPER_HELP_CMD_EXCEPTION + EXCEPTION Modify the session-limit exception list +OPER_HELP_CMD_NOOP + NOOP Temporarily remove all O:lines of a server + remotely + +OPER_HELP_CMD_JUPE + JUPE "Jupiter" a server +OPER_HELP_CMD_IGNORE + IGNORE Modify the Services ignore list +OPER_HELP_CMD_SET + SET Set various global Services options +OPER_HELP_CMD_RELOAD + RELOAD Reload services' configuration file +OPER_HELP_CMD_UPDATE + UPDATE Force the Services databases to be + updated on disk immediately +OPER_HELP_CMD_RESTART + RESTART Save databases and restart Services +OPER_HELP_CMD_QUIT + QUIT Terminate the Services program with no save +OPER_HELP_CMD_SHUTDOWN + SHUTDOWN Terminate the Services program with save +OPER_HELP_CMD_DEFCON + DEFCON Manipulate the DefCon system +OPER_HELP_CMD_CHANKILL + CHANKILL Kill all users on a specific channel +OPER_HELP_CMD_OLINE + OLINE Give Operflags to a certain user +OPER_HELP_CMD_UMODE + UMODE Change a user's modes +OPER_HELP_CMD_SVSNICK + SVSNICK Forcefully change a user's nickname +OPER_HELP_CMD_MODLOAD + MODLOAD Load a module +OPER_HELP_CMD_MODUNLOAD + MODUNLOAD Un-Load a module +OPER_HELP_CMD_MODINFO + MODINFO Info about a loaded module +OPER_HELP_CMD_MODLIST + MODLIST List loaded modules OPER_HELP %S commands: - GLOBAL Send a message to all users - STATS Show status of Services and network - OPER LIST List all Services operators - ADMIN LIST List all Services admins - STAFF Display Services staff and online status - -OPER_HELP_OPER_CMD - Commands available to Services operators and admins only: - MODE Change a channel's modes - KICK Kick a user from a channel - CLEARMODES Clear modes of a channel - KILLCLONES Kill all users that have a certain host - AKILL Manipulate the AKILL list - -OPER_HELP_OPER_CMD_EXTRA - Following commands are also available - -OPER_HELP_OPER_CMD_SGLINE - SGLINE Manipulate the SGLINE list - -OPER_HELP_OPER_CMD_SQLINE - SQLINE Manipulate the SQLINE list - -OPER_HELP_OPER_CMD_SZLINE - SZLINE Manipulate the SZLINE list - -OPER_HELP_ADMIN_CMD - Commands available to Services admins only: - OPER Modify the Services operator list - CHANLIST Lists all channel records - USERLIST Lists all user records - LOGONNEWS Define messages to be shown to users at logon - RANDOMNEWS Define messages to be randomly shown to users - at logon - OPERNEWS Define messages to be shown to users who oper - SESSION View the list of host sessions - EXCEPTION Modify the session-limit exception list - NOOP Temporarily remove all O:lines of a server - remotely - JUPE "Jupiter" a server - IGNORE Modify the Services ignore list - SET Set various global Services options - RELOAD Reload services' configuration file - UPDATE Force the Services databases to be - updated on disk immediately - RESTART Save databases and restart Services - QUIT Terminate the Services program with no save - SHUTDOWN Terminate the Services program with save - DEFCON Manipulate the DefCon system - CHANKILL Kill all users on a specific channel - - Commands available to the Services super-user only: - ADMIN Modify the Services admin list - -OPER_HELP_ADMIN_CMD_EXTRA - Following commands are also available to Service Admins - -OPER_HELP_ADMIN_CMD_OLINE - OLINE Give Operflags to a certain user - -OPER_HELP_ADMIN_CMD_UMODE - UMODE Change a user's modes - -OPER_HELP_ADMIN_CMD_SVSNICK - SVSNICK Forcefully change a user's nickname - -OPER_HELP_ROOT_CMD - Commands available to Service Roots only: - MODLOAD Load a module - MODUNLOAD Un-Load a module - MODLIST List loaded modules - MODINFO Info about a loaded module OPER_HELP_LOGGED Notice: All commands sent to %S are logged! @@ -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 diff --git a/lang/es.l b/lang/es.l index 389460dfa..0bd122b01 100644 --- a/lang/es.l +++ b/lang/es.l @@ -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,6 +3259,56 @@ 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_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 @@ -3268,18 +3318,7 @@ NICK_HELP Para mayor informacion acerca de un comando especifico tipea /msg %S HELP comando. - REGISTER Registra un nickname - GROUP Ingresa a un grupo - IDENTIFY Para identificarte con tu clave - ACCESS Modifica la lista de direcciones autorizadas - SET Setea protecciones, incluyendo kills - DROP Cancela la registracion de un nickname - RECOVER Killea otro usuario que este usando tu nickname - RELEASE Retoma custodia de tu nick luego de RECOVER - SENDPASS Olvidaste tu clave? Intenta esto - - Otros comandos: 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,6 +3895,86 @@ NICK_SERVADMIN_HELP_UNSUSPEND # ChanServ help messages # ########################################################################### +CHAN_HELP_CMD_GETPASS + GETPASS Retorna la clave de fundador para un canal +CHAN_HELP_CMD_FORBID + FORBID Previene un canal a ser usado +CHAN_HELP_CMD_SUSPEND + SUSPEND Previene un canal a ser usado preservando + toda su informacion. +CHAN_HELP_CMD_UNSUSPEND + UNSUSPEND Libera la suspencion del canal. +CHAN_HELP_CMD_STATUS + STATUS Retorna el nivel de acceso actual de un + usuario en un canal +CHAN_HELP_CMD_REGISTER + REGISTER Registra un canal +CHAN_HELP_CMD_IDENTIFY + IDENTIFY Te identifica con tu clave +CHAN_HELP_CMD_SET + SET Setea opciones e informacion de un canal +CHAN_HELP_CMD_AOP + AOP Modifica la lista de usuarios AOP +CHAN_HELP_CMD_SOP + SOP Modifica la lista de usuarios SOP +CHAN_HELP_CMD_ACCESS + ACCESS Modifica la lista de usuarios privilegiados +CHAN_HELP_CMD_LEVELS + LEVELS Redefine el significado de niveles de acceso +CHAN_HELP_CMD_AKICK + AKICK Mantiene la lista de AutoKick +CHAN_HELP_CMD_DROP + DROP Cancela la registracion de un canal +CHAN_HELP_CMD_SENDPASS + SENDPASS Ayuda a recuperar claves perdidas +CHAN_HELP_CMD_BAN + BAN Bans a selected nick on a channel +CHAN_HELP_CMD_CLEAR + CLEAR Tells ChanServ to clear certain settings on a channel +CHAN_HELP_CMD_DEVOICE + DEVOICE Devoices a selected nick on a channel +CHAN_HELP_CMD_GETKEY + GETKEY Returns the key of the given channel +CHAN_HELP_CMD_INFO + INFO Lists information about the named registered channel +CHAN_HELP_CMD_INVITE + INVITE Tells ChanServ to invite you or a given nick into a channel +CHAN_HELP_CMD_KICK + KICK Kicks a selected nick from a channel +CHAN_HELP_CMD_LIST + LIST Lists all registered channels matching the given pattern +CHAN_HELP_CMD_LOGOUT + LOGOUT This command will logout the selected nickname +CHAN_HELP_CMD_OP + OP Gives Op status to a selected nick on a channel +CHAN_HELP_CMD_TOPIC + TOPIC Manipulate the topic of the specified channel +CHAN_HELP_CMD_UNBAN + UNBAN Remove all bans preventing you from entering a channel +CHAN_HELP_CMD_VOICE + VOICE Voices a selected nick on a channel +CHAN_HELP_CMD_VOP + VOP Maintains the VOP (VOicePeople) list for a channel +CHAN_HELP_CMD_DEHALFOP + DEHALFOP Dehalfops a selected nick on a channel +CHAN_HELP_CMD_DEOWNER + DEOWNER Removes your owner status on a channel +CHAN_HELP_CMD_DEPROTECT + DEPROTECT Deprotects a selected nick on a channel +CHAN_HELP_CMD_HALFOP + HALFOP Halfops a selected nick on a channel +CHAN_HELP_CMD_HOP + HOP Maintains the HOP (HalfOP) list for a channel +CHAN_HELP_CMD_OWNER + OWNER Gives you owner status on channel +CHAN_HELP_CMD_PROTECT + PROTECT Protects a selected nick on a channel +CHAN_HELP_CMD_ADMIN + ADMIN Protects a selected nick on a channel +CHAN_HELP_CMD_DEADMIN + DEADMIN Deprotects a selected nick on a channel +CHAN_HELP_CMD_DEOP + DEOP Deops a selected nick on a channel CHAN_HELP %S te permite registrar y controlar varios @@ -3874,43 +3985,8 @@ CHAN_HELP para usarlos, tipea /msg %S comando. Para mayor informacion acerca de un comando especifico, tipea /msg %S HELP comando. + - REGISTER Registra un canal - IDENTIFY Te identifica con tu clave - SET Setea opciones e informacion de un canal - AOP Modifica la lista de usuarios AOP - SOP Modifica la lista de usuarios SOP - ACCESS Modifica la lista de usuarios privilegiados - LEVELS Redefine el significado de niveles de acceso - AKICK Mantiene la lista de AutoKick - DROP Cancela la registracion de un canal - SENDPASS Ayuda a recuperar claves perdidas - - Otros comandos: 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_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 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 - STAFF Muestra la lista del staff y su status - -OPER_HELP_OPER_CMD - Comandos disponibles solo para operadores y administradores - de Servicios: - MODE Cambia los modos de un canal - KICK Kickea un usuario de un canal - CLEARMODES Limpia los modos de un canal - KILLCLONES Killea todos los usuarios en un host - AKILL Manipula la lista AKILL - -OPER_HELP_OPER_CMD_EXTRA - Following commands are also available - -OPER_HELP_OPER_CMD_SGLINE - SGLINE Manipula la lista SGLINE - -OPER_HELP_OPER_CMD_SQLINE - SQLINE Manipula la lista SQLINE - -OPER_HELP_OPER_CMD_SZLINE - SZLINE Manipula la lista SZLINE - -OPER_HELP_ADMIN_CMD - Comandos disponibles solo a administradores de Servicios: +OPER_HELP_CMD_OPER OPER Modifica la lista de operadores de Servicios - CHANLIST Lista todos los records de canal - USERLIST Lista todos los records de usuarios - LOGONNEWS Define mensajes para ser mostrados a usuarios - al conectarse - RANDOMNEWS Define mensajes para ser mostrados al azar a - usuarios al conectarse - OPERNEWS Define mensajes a ser mostrados a usuarios al - transformarse en operadores - SESSION Muestra la lista de sesiones de host - EXCEPTION Modifica la lista de limite de sesion - CACHE Lista cache de hostnames usado por el detector - de proxys - NOOP Temporalmente remueve todas las lineas O: de - un servidor remotamente - JUPE "Jupiter" un servidor - IGNORE Ignora a un usuario - SET Setea varias opciones globales de los Servicios - RELOAD Recarga la configuracion de los Servicios - UPDATE Fuerza a la base de datos de los Servicios a - ser updateada a disco inmediatamente - QUIT Termina el programa de Servicios sin salvar - RESTART Guarda la base de datos de los Servicios y - recarga los Servicios - QUIT Termina el programa de servicios sin guardar - los cambios - SHUTDOWN Termina el programa de Servicios guardando los - cambios - - Comandos disponibles al super-usuario de Servicios solamente: +OPER_HELP_CMD_ADMIN 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_STAFF + STAFF Muestra la lista del staff y su status +OPER_HELP_CMD_MODE + MODE Cambia los modos de un canal +OPER_HELP_CMD_KICK + KICK Kickea un usuario de un canal +OPER_HELP_CMD_CLEARMODES + CLEARMODES Limpia los modos de un canal +OPER_HELP_CMD_KILLCLONES + KILLCLONES Killea todos los usuarios en un host +OPER_HELP_CMD_AKILL + AKILL Manipula la lista AKILL +OPER_HELP_CMD_SGLINE + SGLINE Manipula la lista SGLINE +OPER_HELP_CMD_SQLINE + SQLINE Manipula la lista SQLINE +OPER_HELP_CMD_SZLINE + SZLINE Manipula la lista SZLINE +OPER_HELP_CMD_CHANLIST + CHANLIST Lista todos los records de canal +OPER_HELP_CMD_USERLIST + USERLIST Lista todos los records de usuarios +OPER_HELP_CMD_LOGONNEWS + LOGONNEWS Define mensajes para ser mostrados a usuarios + al conectarse +OPER_HELP_CMD_RANDOMNEWS + RANDOMNEWS Define mensajes para ser mostrados al azar a + usuarios al conectarse +OPER_HELP_CMD_OPERNEWS + OPERNEWS Define mensajes a ser mostrados a usuarios al + transformarse en operadores +OPER_HELP_CMD_SESSION + SESSION Muestra la lista de sesiones de host +OPER_HELP_CMD_EXCEPTION + EXCEPTION Modifica la lista de limite de sesion +OPER_HELP_CMD_NOOP + NOOP Temporalmente remueve todas las lineas O: de + un servidor remotamente +OPER_HELP_CMD_JUPE + JUPE "Jupiter" un servidor +OPER_HELP_CMD_IGNORE + IGNORE Ignora a un usuario +OPER_HELP_CMD_SET + SET Setea varias opciones globales de los Servicios +OPER_HELP_CMD_RELOAD + RELOAD Recarga la configuracion de los Servicios +OPER_HELP_CMD_UPDATE + UPDATE Fuerza a la base de datos de los Servicios a + ser updateada a disco inmediatamente +OPER_HELP_CMD_RESTART + RESTART Guarda la base de datos de los Servicios y + recarga los Servicios +OPER_HELP_CMD_QUIT + QUIT Termina el programa de servicios sin guardar + los cambios +OPER_HELP_CMD_SHUTDOWN + SHUTDOWN Termina el programa de Servicios guardando los + cambios +OPER_HELP_CMD_DEFCON + DEFCON Manipulate the DefCon system +OPER_HELP_CMD_CHANKILL + CHANKILL Kill all users on a specific channel +OPER_HELP_CMD_OLINE OLINE Otorga privilegios IRCOP temporarios - -OPER_HELP_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 diff --git a/lang/fr.l b/lang/fr.l index 061e7b865..9b2dd6790 100644 --- a/lang/fr.l +++ b/lang/fr.l @@ -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,6 +3308,58 @@ 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_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 @@ -3317,20 +3369,7 @@ NICK_HELP d'informations sur une certaine commande, tapez /msg %S HELP commande. - REGISTER Enregistre un nick - GROUP Joint un groupe - IDENTIFY Vous identifie avec votre mot de passe - ACCESS Modifie la liste des adresses autorisées - SET Configure les options, protection comprise - DROP Annule l'enregistrement d'un nick - RECOVER Change le nick d'un utilisateur qui a pris - votre nick - RELEASE Pour reprendre la tutelle de votre nick - après un RECOVER - SENDPASS A utiliser en cas de perte de mot de passe - - Autres commandes: GHOST, INFO, GLIST, LIST, LOGOUT, STATUS - +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,6 +3953,88 @@ NICK_SERVADMIN_HELP_UNSUSPEND # ChanServ help messages # ########################################################################### +CHAN_HELP_CMD_GETPASS + GETPASS Retrouve le mot de passe du propriétaire pour + un channel +CHAN_HELP_CMD_FORBID + FORBID Empêche un channel d'être utilisé +CHAN_HELP_CMD_SUSPEND + SUSPEND 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 +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 vous permet d'enregistrer et de contrôler divers @@ -3931,44 +4045,8 @@ CHAN_HELP pour les utiliser, tapez /msg %S command. Pour plus d'informations sur une commande spécifique, tapez /msg %S HELP command. + - REGISTER Enregistre un channel - IDENTIFY Vous identifie avec votre mot de passe - SET Configure les options et informations du - channel - AOP Modifie la liste des utilisateurs AOPs - SOP Modifie la liste des utilisateurs SOPs - ACCESS Modifie la liste des utilisateurs privilégiés - LEVELS Redéfinit la signification des levels d'accès - AKICK Gère la liste des kicks automatiques - DROP Annule l'enregistrement d'un channel - SENDPASS Aide à retrouver les mots de passe égarés - - Autres commandes: BAN, CLEAR, DEOP, DEVOICE, GETKEY, INFO, - INVITE, KICK, LIST, LOGOUT, OP, TOPIC, - UNBAN, VOICE, VOP - -CHAN_HELP_UNREAL - - Ces commandes sont également disponibles sur ce réseau: - DEHALFOP, DEOWNER, DEPROTECT, HALFOP, HOP, OWNER, - PROTECT - -CHAN_HELP_ULTIMATE3 - - Ces commandes sont également disponibles sur ce réseau: - 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 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_CMD_GLOBAL + GLOBAL Envoie un message à tous les utilisateurs +OPER_HELP_CMD_STATS + STATS Affiche le status des Services et du réseau +OPER_HELP_CMD_OPER + OPER Modifie la liste des opérateurs des Services +OPER_HELP_CMD_ADMIN + ADMIN Modifie la liste des administrateurs des Services +OPER_HELP_CMD_STAFF + STAFF Display Services staff and online status +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 +OPER_HELP_CMD_AKILL + AKILL Contrôle la liste des AKILLs +OPER_HELP_CMD_SGLINE + SGLINE Contrôle la liste des SGLINEs +OPER_HELP_CMD_SQLINE + SQLINE Contrôle la liste des SQLINEs +OPER_HELP_CMD_SZLINE + SZLINE Contrôle la liste des SZLINEs +OPER_HELP_CMD_CHANLIST + CHANLIST Liste tous les 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 +OPER_HELP_CMD_RANDOMNEWS + RANDOMNEWS Définit les messages affichés aléatoirement + aux utilisateurs à la connexion +OPER_HELP_CMD_OPERNEWS + OPERNEWS Définit les messages affichés aux utilisateurs + qui deviennent IRCops +OPER_HELP_CMD_SESSION + SESSION Affiche la liste des sessions par host +OPER_HELP_CMD_EXCEPTION + EXCEPTION Modifie la liste d'exceptions à la limite de + session +OPER_HELP_CMD_NOOP + NOOP Supprime temporairement toutes les O:lines + d'un serveur +OPER_HELP_CMD_JUPE + JUPE "Jupiter" un serveur +OPER_HELP_CMD_IGNORE + IGNORE Modifier la liste d'ignore des services +OPER_HELP_CMD_SET + SET Configure des options globales des Services +OPER_HELP_CMD_RELOAD + RELOAD Recharge le fichier de configuration des Services +OPER_HELP_CMD_UPDATE + UPDATE Oblige les bases de données des Services + à être sauvegardées immédiatement. +OPER_HELP_CMD_RESTART + RESTART Sauvegarde les bases de données et relance les + Services. +OPER_HELP_CMD_QUIT + QUIT Arrête les Services sans sauvegarde +OPER_HELP_CMD_SHUTDOWN + SHUTDOWN Arrête les Services avec sauvegarde +OPER_HELP_CMD_DEFCON + DEFCON 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_CMD_UMODE + UMODE Change un mode d'un utilisateur +OPER_HELP_CMD_SVSNICK + SVSNICK Forcefully change a user's nickname +OPER_HELP_CMD_MODLOAD + MODLOAD Load a module +OPER_HELP_CMD_MODUNLOAD + MODUNLOAD Un-Load a module +OPER_HELP_CMD_MODINFO + MODINFO Info about a loaded module +OPER_HELP_CMD_MODLIST + MODLIST List loaded modules + OPER_HELP Commandes %S: - GLOBAL Envoie un message à tous les utilisateurs - STATS Affiche le status des Services et du réseau - OPER LIST Liste tous les opérateurs des Services - ADMIN LIST Liste tous les administrateurs des Services - STAFF Display Services staff and online status - -OPER_HELP_OPER_CMD - Commandes réservées aux opérateurs et administrateurs des Services: - MODE Change les modes d'un channel - KICK Expulse un utilisateur d'un channel - CLEARMODES Supprime tous les modes d'un channel - KILLCLONES Déconnecte tous les utilisateurs ayant un - certain hostname - AKILL Contrôle la liste des AKILLs - -OPER_HELP_OPER_CMD_EXTRA - Following commands are also available - -OPER_HELP_OPER_CMD_SGLINE - SGLINE Contrôle la liste des SGLINEs - -OPER_HELP_OPER_CMD_SQLINE - SQLINE Contrôle la liste des SQLINEs - -OPER_HELP_OPER_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 - CHANLIST Liste tous les channels - USERLIST Liste tous les utilisateurs - LOGONNEWS Définit les messages affichés aux utilisateurs - à la connexion - RANDOMNEWS Définit les messages affichés aléatoirement - aux utilisateurs à la connexion - OPERNEWS Définit les messages affichés aux utilisateurs - qui deviennent IRCops - SESSION Affiche la liste des sessions par host - EXCEPTION Modifie la liste d'exceptions à la limite de - session - CACHE Liste le cache de noms d'hôte utilisé par le - détecteur de proxy - NOOP Supprime temporairement toutes les O:lines - d'un serveur - JUPE "Jupiter" un serveur - IGNORE Modifier la liste d'ignore des services - SET Configure des options globales des Services - RELOAD Recharge le fichier de configuration des Services - UPDATE Oblige les bases de données des Services - à être sauvegardées immédiatement. - RESTART Sauvegarde les bases de données et relance les - Services. - QUIT Arrête les Services sans sauvegarde - SHUTDOWN Arrête les Services avec sauvegarde - - Commandes réservées aux super-utilisateurs des Services: - ADMIN Modifie la liste des administrateurs des Services - -OPER_HELP_ADMIN_CMD_EXTRA - Following commands are also available to Service Admins - -OPER_HELP_ADMIN_CMD_OLINE - OLINE Donne les flags d'un Oper à un utilisateur - -OPER_HELP_ADMIN_CMD_UMODE - UMODE Change un mode d'un utilisateur - -OPER_HELP_ADMIN_CMD_SVSNICK - SVSNICK Forcefully change a user's nickname - -OPER_HELP_ROOT_CMD - Commands available to Serivces Roots only: - MODLOAD Load a module - MODUNLOAD Un-Load a module - MODLIST List loaded modules - MODINFO Info about a loaded module OPER_HELP_LOGGED Remarque: Toutes les commandes envoyées à %S sont enregistrées! @@ -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_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_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: - ON Active une vhost - OFF Désactive une vhost - GROUP Synchronise toutes les vhost d'un group HOST_OPER_HELP - Commandes pour les ServicesOpérateurs seulement: - SET Configure la vhost d'un pseudo - SETALL Configure la vhost pour tous les nicks d'un groupe - DEL Supprime la vhost d'un pseudo - LIST Recherche une vhost + not used. HOST_ADMIN_HELP - Commandes pour les ServicesAdmins seulement: + not used. HOST_HELP_ON Syntaxe: ON diff --git a/lang/gr.l b/lang/gr.l index 4c15bf734..672310ac6 100644 --- a/lang/gr.l +++ b/lang/gr.l @@ -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,6 +3263,57 @@ 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_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 óáò åðéôñÝðåé íá êáôï÷õñþóåôå Ýíá øåõäþíõìï, @@ -3272,18 +3323,7 @@ NICK_HELP Ãéá ðåñéóóüôåñåò ðëçñïöïñßåò óå ìéá óõãêåêñéìÝíç åíôïëÞ,ãñÜøôå /msg %S HELP ^_command^_. - REGISTER Êáôï÷õñþíåé Ýíá øåõäþíõìï - GROUP ÌðÝíåôå óå ïìÜäá øåõäþíõìïõ - IDENTIFY Óáò áíáãíùñßæåé ìå ôç ÷ñÞóç êùäéêïý - ACCESS ÁëëÜæåé ôç ëßóôá ôùí åîïõóéïäïôçìÝíùí äéåõèýíóåùí - SET ÁëëáãÞ åðéëïãþí, óõìðåñéëáìâÜíåôáé ç ðñïóôáóßá ìå áðïóýíäåóç - DROP ÄéáãñÜöåé Ýíá øåõäþíõìï - RECOVER Áðïóýíäåóç åíüò Üëëïõ ÷ñÞóôç ðïõ Ý÷åé ðÜñåé ôï øåõäþíõìü óáò - RELEASE ÁíÜêôçóç ôçò êáôáêñÜôçóçò ôïõ øåõäùíýìïõ,ìåôÜ áðü RECOVER - SENDPASS ÎÝ÷áóåò ôïí êùäéêü? Äïêßìáóå áõôü êáé èá óôï óôåßëïõìå åìåßò - - ¢ëëåò åíôïëÝò: 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,6 +3905,87 @@ NICK_SERVADMIN_HELP_UNSUSPEND # ChanServ help messages # ########################################################################### +CHAN_HELP_CMD_GETPASS + GETPASS ÂëÝðåéò ôïí êùäéêü ôïõ óõãêåêñéìÝíïõ êáíáëéïý +CHAN_HELP_CMD_FORBID + FORBID ÊáôáóôÝëåé ôï êáíÜëé,äåí ìðïñåß íá ôï ÷ñçóéìïðïéÞóç êáíåßò +CHAN_HELP_CMD_SUSPEND + SUSPEND Prevent a channel from being used preserving + channel data and settings +CHAN_HELP_CMD_UNSUSPEND + UNSUSPEND Releases a suspended channel +CHAN_HELP_CMD_STATUS + STATUS ÅðéóôñÝöåé ôçí óõãêåêñéìÝíç access level ôïõ ÷ñÞóôç óôï + êáíÜëé +CHAN_HELP_CMD_REGISTER + REGISTER Êáôï÷õñþíåé Ýíá êáíÜëé +CHAN_HELP_CMD_IDENTIFY + IDENTIFY Óáò áíáãíùñßæåé ìå êùäéêü +CHAN_HELP_CMD_SET + SET Ñõèìßæåé ôéò åðéëïãÝò êáé ôéò ðëçñïöïñßåò + ôïõ êáíáëéïý +CHAN_HELP_CMD_AOP + AOP ÁëëÜæåé ôçí ëßóôá ôùí AOP ÷ñçóôþí +CHAN_HELP_CMD_SOP + SOP ÁëëÜæåé ôçí ëßóôá ôùí SOP ÷ñçóôþí +CHAN_HELP_CMD_ACCESS + ACCESS ÁëëÜæåé ôç ëßóôá ôùí åîïõóéïäïôçìÝíùí ÷ñçóôþí +CHAN_HELP_CMD_LEVELS + LEVELS Åðáíáêáèïñßæåé ôï íüçìá ôùí åðéðÝäùí ðñüóâáóçò +CHAN_HELP_CMD_AKICK + AKICK Óõíôçñåß ôç ëßóôá áõôüìáôçò áðüññéøçò +CHAN_HELP_CMD_DROP + DROP Áêõñþíåé ôçí êáôï÷ýñùóç åíüò êáíáëéïý +CHAN_HELP_CMD_SENDPASS + SENDPASS ÓôÝëíåé ôïí ÷áìÝíï êùäéêü ôïõ êáíáëéïý +CHAN_HELP_CMD_BAN + BAN Bans a selected nick on a channel +CHAN_HELP_CMD_CLEAR + CLEAR Tells ChanServ to clear certain settings on a channel +CHAN_HELP_CMD_DEVOICE + DEVOICE Devoices a selected nick on a channel +CHAN_HELP_CMD_GETKEY + GETKEY Returns the key of the given channel +CHAN_HELP_CMD_INFO + INFO Lists information about the named registered channel +CHAN_HELP_CMD_INVITE + INVITE Tells ChanServ to invite you or a given nick into a channel +CHAN_HELP_CMD_KICK + KICK Kicks a selected nick from a channel +CHAN_HELP_CMD_LIST + LIST Lists all registered channels matching the given pattern +CHAN_HELP_CMD_LOGOUT + LOGOUT This command will logout the selected nickname +CHAN_HELP_CMD_OP + OP Gives Op status to a selected nick on a channel +CHAN_HELP_CMD_TOPIC + TOPIC Manipulate the topic of the specified channel +CHAN_HELP_CMD_UNBAN + UNBAN Remove all bans preventing you from entering a channel +CHAN_HELP_CMD_VOICE + VOICE Voices a selected nick on a channel +CHAN_HELP_CMD_VOP + VOP Maintains the VOP (VOicePeople) list for a channel +CHAN_HELP_CMD_DEHALFOP + DEHALFOP Dehalfops a selected nick on a channel +CHAN_HELP_CMD_DEOWNER + DEOWNER Removes your owner status on a channel +CHAN_HELP_CMD_DEPROTECT + DEPROTECT Deprotects a selected nick on a channel +CHAN_HELP_CMD_HALFOP + HALFOP Halfops a selected nick on a channel +CHAN_HELP_CMD_HOP + HOP Maintains the HOP (HalfOP) list for a channel +CHAN_HELP_CMD_OWNER + OWNER Gives you owner status on channel +CHAN_HELP_CMD_PROTECT + PROTECT Protects a selected nick on a channel +CHAN_HELP_CMD_ADMIN + ADMIN Protects a selected nick on a channel +CHAN_HELP_CMD_DEADMIN + DEADMIN Deprotects a selected nick on a channel +CHAN_HELP_CMD_DEOP + DEOP Deops a selected nick on a channel CHAN_HELP Ï %S óáò åðéôñÝðåé íá êáôï÷õñþóåôå êáé íá ÷åéñéóôåßôå @@ -3883,44 +3996,8 @@ CHAN_HELP ðáñáêÜôù. Ãéá íá ôéò ÷ñçóéìïðïéÞóåôå, ðëçêôñïëïãÞóôå /msg %S åíôïëÞ. Ãéá ðåñéóóüôåñåò ðëçñïöïñßåò óå ìßá óõãêåêñéìÝíç åíôïëÞ, ðëçêôñïëïãÞóôå /msg %S HELP åíôïëÞ. + - REGISTER Êáôï÷õñþíåé Ýíá êáíÜëé - IDENTIFY Óáò áíáãíùñßæåé ìå êùäéêü - SET Ñõèìßæåé ôéò åðéëïãÝò êáé ôéò ðëçñïöïñßåò - ôïõ êáíáëéïý - AOP ÁëëÜæåé ôçí ëßóôá ôùí AOP ÷ñçóôþí - SOP ÁëëÜæåé ôçí ëßóôá ôùí SOP ÷ñçóôþí - ACCESS ÁëëÜæåé ôç ëßóôá ôùí åîïõóéïäïôçìÝíùí ÷ñçóôþí - LEVELS Åðáíáêáèïñßæåé ôï íüçìá ôùí åðéðÝäùí ðñüóâáóçò - AKICK Óõíôçñåß ôç ëßóôá áõôüìáôçò áðüññéøçò - DROP Áêõñþíåé ôçí êáôï÷ýñùóç åíüò êáíáëéïý - SENDPASS ÓôÝëíåé ôïí ÷áìÝíï êùäéêü ôïõ êáíáëéïý - - ¢ëëåò åíôïëÝò: BAN, CLEAR, DEOP, DEVOICE, GETKEY, INFO, - INVITE, KICK, LIST, LOGOUT, OP, TOPIC, - UNBAN, VOICE, VOP - -CHAN_HELP_UNREAL - - ÁõôÝò ïé åíôïëÝò åßíáé äéáèÝóéìåò áå áõôü ôï äßêôõï: - DEHALFOP, DEOWNER, DEPROTECT, HALFOP, HOP, OWNER, - PROTECT - -CHAN_HELP_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 - - 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 - STAFF Display Services staff and online status - -OPER_HELP_OPER_CMD - ÄéáèÝóéìåò åíôïëÝò ãéá ôïõò Services operators êáé admins ìüíï: - MODE ÁëëÜæåé modes óå êáíÜëé êáé Üëëá - KICK Áðïìáêñýíåé ôï ÷ñÞóôç áðü ôï êáíÜëé - CLEARMODES Êáèáñßæåé ôá modes áðü ôï êáíÜëé - KILLCLONES Óêïôþíåé üëïõò ôïõò ÷ñÞóôåò ðïõ Ý÷ïõí ôï ßäéï host - AKILL ÐñïóèÝôåé ip êëð óôçí ëßóôá AKILL - -OPER_HELP_OPER_CMD_EXTRA - Following commands are also available - -OPER_HELP_OPER_CMD_SGLINE - SGLINE ÐñïóèÝôåé ip óôçí ëßóôá SGLINE - -OPER_HELP_OPER_CMD_SQLINE - SQLINE ÐñïóèÝôåé ip óôçí ëßóôá SQLINE - -OPER_HELP_OPER_CMD_SZLINE - SZLINE ÐñïóèÝôåé ip óôçí ëßóôá SZLINE - -OPER_HELP_ADMIN_CMD - ÄéáèÝóéìåò åíôïëÝò ãéá ôïõò 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_CMD_MODE + MODE ÁëëÜæåé modes óå êáíÜëé êáé Üëëá +OPER_HELP_CMD_KICK + KICK Áðïìáêñýíåé ôï ÷ñÞóôç áðü ôï êáíÜëé +OPER_HELP_CMD_CLEARMODES + CLEARMODES Êáèáñßæåé ôá modes áðü ôï êáíÜëé +OPER_HELP_CMD_KILLCLONES + KILLCLONES Óêïôþíåé üëïõò ôïõò ÷ñÞóôåò ðïõ Ý÷ïõí ôï ßäéï host +OPER_HELP_CMD_AKILL + AKILL ÐñïóèÝôåé ip êëð óôçí ëßóôá AKILL +OPER_HELP_CMD_SGLINE + SGLINE ÐñïóèÝôåé ip óôçí ëßóôá SGLINE +OPER_HELP_CMD_SQLINE + SQLINE ÐñïóèÝôåé ip óôçí ëßóôá SQLINE +OPER_HELP_CMD_SZLINE + SZLINE ÐñïóèÝôåé ip óôçí ëßóôá SZLINE +OPER_HELP_CMD_CHANLIST CHANLIST Åìöáíßæåé üëá ôá êáíÜëéá +OPER_HELP_CMD_USERLIST USERLIST Åìöáíßæåé üëïõò ôïõò ÷ñÞóôåò +OPER_HELP_CMD_LOGONNEWS LOGONNEWS ÁëëÜæåéò ôá ìçíýìáôá ðïõ èá åìöáíßæïíôáé üôáí áõôïß èá ìðÝíïõí óôï äßêôõï +OPER_HELP_CMD_RANDOMNEWS RANDOMNEWS ÁëëÜæåéò ôá ôõ÷áßá åðéëåãüìåíá ìçíýìáôá ðïõ èá åìöáíßæïíôáé üôáí áõôïß èá ìðÝíïõí óôï äßêôõï +OPER_HELP_CMD_OPERNEWS OPERNEWS ÁëëÜæåéò ôá ìçíýìáôá ðïõ èá åìöáíßæïíôáé óôïõò ÷ñÞóôåò ðïõ ãßíïíôáé oper +OPER_HELP_CMD_SESSION SESSION ÂëÝðåéò ôçí ëßóôá ìå ôá host sessions +OPER_HELP_CMD_EXCEPTION EXCEPTION ÁëëÜæåéò ôçí ëßóôá ôïõ session-limit exception - 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,7 +3201,58 @@ HELP_HELP_HOST # NickServ segítség üzenetei # ########################################################### - +NICK_HELP_CMD_CONFIRM + CONFIRM Confirm a nickserv auth code +NICK_HELP_CMD_RESEND + RESEND Resend a nickserv auth code + +NICK_HELP_CMD_REGISTER + REGISTER Nicknév regisztráció +NICK_HELP_CMD_GROUP + GROUP Csatlakozás egy csoporthoz +NICK_HELP_CMD_IDENTIFY + IDENTIFY Jelszavas azonosítás +NICK_HELP_CMD_ACCESS + ACCESS A hozzáférési lista módosítása +NICK_HELP_CMD_SET + SET Opciók beállítása, például kill védelem +NICK_HELP_CMD_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 @@ -3210,18 +3261,7 @@ NICK_HELP beírod, hogy: /msg %S parancs, lásd még a /msg %S HELP parancs. - REGISTER Nicknév regisztráció - GROUP Csatlakozás egy csoporthoz - IDENTIFY Jelszavas azonosítás - ACCESS A hozzáférési lista módosítása - SET Opciók beállítása, például kill védelem - DROP Nicknév regisztrációjának törlése - RECOVER Killeli a nickedet használó usert - RELEASE Visszaadja a neved a RECOVER után - SENDPASS Elfelejtetted a jelszavad? Próbáld ezt - - 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,6 +3814,86 @@ NICK_SERVADMIN_HELP_UNSUSPEND # ChanServ help messages # ########################################################################### +CHAN_HELP_CMD_GETPASS + GETPASS Megadja a founder jelszót a csatornán +CHAN_HELP_CMD_FORBID + FORBID Megakadályozza a szoba használatát +CHAN_HELP_CMD_SUSPEND + SUSPEND Felfüggeszti a szoba használatát de + megõrzi az adatokat és beállításokat. +CHAN_HELP_CMD_UNSUSPEND + UNSUSPEND Törli a suspendet a csatornáról. +CHAN_HELP_CMD_STATUS + STATUS Kiírja a felhasználó aktuális hozzáférési + szintjét a megadott csatornán +CHAN_HELP_CMD_REGISTER + REGISTER Szoba regisztrálása +CHAN_HELP_CMD_IDENTIFY + IDENTIFY Azonosíthatod magad a jelszavaddal +CHAN_HELP_CMD_SET + SET Beállíthatod a csatornád opcióit +CHAN_HELP_CMD_AOP + AOP AutoOperátor lista beállítása +CHAN_HELP_CMD_SOP + SOP SzuperOperátor lista beállítása +CHAN_HELP_CMD_ACCESS + ACCESS A szoba hozzáférési listájának beállítása +CHAN_HELP_CMD_LEVELS + LEVELS Átállíthatod a szoba hozzáférési szintjeit +CHAN_HELP_CMD_AKICK + AKICK AutoKirúgás listára teheted a "rossz" usereket +CHAN_HELP_CMD_DROP + DROP Törölheted a csatornád regisztrációját +CHAN_HELP_CMD_SENDPASS + SENDPASS Elveszett a jelszavad? Jelszó küldés. +CHAN_HELP_CMD_BAN + BAN Bans a selected nick on a channel +CHAN_HELP_CMD_CLEAR + CLEAR Tells ChanServ to clear certain settings on a channel +CHAN_HELP_CMD_DEVOICE + DEVOICE Devoices a selected nick on a channel +CHAN_HELP_CMD_GETKEY + GETKEY Returns the key of the given channel +CHAN_HELP_CMD_INFO + INFO Lists information about the named registered channel +CHAN_HELP_CMD_INVITE + INVITE Tells ChanServ to invite you or a given nick into a channel +CHAN_HELP_CMD_KICK + KICK Kicks a selected nick from a channel +CHAN_HELP_CMD_LIST + LIST Lists all registered channels matching the given pattern +CHAN_HELP_CMD_LOGOUT + LOGOUT This command will logout the selected nickname +CHAN_HELP_CMD_OP + OP Gives Op status to a selected nick on a channel +CHAN_HELP_CMD_TOPIC + TOPIC Manipulate the topic of the specified channel +CHAN_HELP_CMD_UNBAN + UNBAN Remove all bans preventing you from entering a channel +CHAN_HELP_CMD_VOICE + VOICE Voices a selected nick on a channel +CHAN_HELP_CMD_VOP + VOP Maintains the VOP (VOicePeople) list for a channel +CHAN_HELP_CMD_DEHALFOP + DEHALFOP Dehalfops a selected nick on a channel +CHAN_HELP_CMD_DEOWNER + DEOWNER Removes your owner status on a channel +CHAN_HELP_CMD_DEPROTECT + DEPROTECT Deprotects a selected nick on a channel +CHAN_HELP_CMD_HALFOP + HALFOP Halfops a selected nick on a channel +CHAN_HELP_CMD_HOP + HOP Maintains the HOP (HalfOP) list for a channel +CHAN_HELP_CMD_OWNER + OWNER Gives you owner status on channel +CHAN_HELP_CMD_PROTECT + PROTECT Protects a selected nick on a channel +CHAN_HELP_CMD_ADMIN + ADMIN Protects a selected nick on a channel +CHAN_HELP_CMD_DEADMIN + DEADMIN Deprotects a selected nick on a channel +CHAN_HELP_CMD_DEOP + DEOP Deops a selected nick on a channel CHAN_HELP @@ -3793,43 +3904,8 @@ CHAN_HELP 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. + - REGISTER Szoba regisztrálása - IDENTIFY Azonosíthatod magad a jelszavaddal - SET Beállíthatod a csatornád opcióit - AOP AutoOperátor lista beállítása - SOP SzuperOperátor lista beállítása - ACCESS A szoba hozzáférési listájának beállítása - LEVELS Átállíthatod a szoba hozzáférési szintjeit - AKICK AutoKirúgás listára teheted a "rossz" usereket - DROP Törölheted a csatornád regisztrációját - SENDPASS Elveszett a jelszavad? Jelszó küldés. - - 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 - - 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 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,8 +4861,30 @@ CHAN_SERVADMIN_HELP_STATUS # MemoServ help üzenetek # ########################################################### - -MEMO_HELP +MEMO_HELP_CMD_SEND + SEND Üzenetet küld egy nicknek vagy csatornára +MEMO_HELP_CMD_CANCEL + CANCEL Visszavonja az utoljára küldött memot +MEMO_HELP_CMD_LIST + LIST Megjeleníti az üzenetek listáját +MEMO_HELP_CMD_READ + READ Elolvassa a megadott üzenete(ke)t +MEMO_HELP_CMD_DEL + DEL Törli a megadott üzenete(ke)t +MEMO_HELP_CMD_SET + SET Üzenetekkel kapcsolatos beállításokat hajt végre +MEMO_HELP_CMD_INFO + INFO Kiírja az üzenetekkel kapcsolatos információkat +MEMO_HELP_CMD_RSEND + RSEND Memo üzenetet küld és olvasási visszaigazolást kér +MEMO_HELP_CMD_CHECK + CHECK Ellenõrzi, hogy a címzett elolvasta-e már az üzit +MEMO_HELP_CMD_SENDALL + SENDALL Memo küldése minden regisztrált felhasználónak. +MEMO_HELP_CMD_STAFF + STAFF Memo küldése minden opernek/adminnak. + +MEMO_HELP_HEADER %S lehetõséget nyújt az IRC felhasználókank, hogy rövid üzeneteket küldjenek más IRC felhasználók részére, akkor is, ha a fogadó fél nem online, és csatornákra (*). @@ -4806,22 +4893,11 @@ MEMO_HELP %S parancsok a következõket tartalmazzák: - SEND Üzenetet küld egy nicknek vagy csatornára - CANCEL Visszavonja az utoljára küldött memot - LIST Megjeleníti az üzenetek listáját - READ Elolvassa a megadott üzenete(ke)t - DEL Törli a megadott üzenete(ke)t - SET Üzenetekkel kapcsolatos beállításokat hajt végre - INFO Kiírja az üzenetekkel kapcsolatos információkat - RSEND Memo üzenetet küld és olvasási visszaigazolást kér - CHECK Ellenõrzi, hogy a címzett elolvasta-e már az üzit MEMO_HELP_ADMIN - SENDALL Memo küldése minden regisztrált felhasználónak. - + not used. MEMO_HELP_OPER - STAFF Memo küldése minden opernek/adminnak. - + 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_CMD_GLOBAL + GLOBAL Üzenetet küld összes felhasználónak +OPER_HELP_CMD_STATS + STATS Mutatja a Szervít és hálózat állapotát +OPER_HELP_CMD_OPER + OPER Módosítja a Szervíz operátorok listáját +OPER_HELP_CMD_ADMIN + ADMIN Módosítja a Szervíz admin listát +OPER_HELP_CMD_STAFF + STAFF Kijelzi a szervízt és aktív állapotát +OPER_HELP_CMD_MODE + MODE Váltóztatja a szoba módot +OPER_HELP_CMD_KICK + KICK Kirúgja a felhasználót csatornáról +OPER_HELP_CMD_CLEARMODES + CLEARMODES Törli a szoba módot +OPER_HELP_CMD_KILLCLONES + KILLCLONES Killeli az összes klónt a hosztról +OPER_HELP_CMD_AKILL + AKILL Szerkeszti az AKILL listát +OPER_HELP_CMD_SGLINE + SGLINE Szerkeszti az SGLINE listát +OPER_HELP_CMD_SQLINE + SQLINE Szerkeszti az SQLINE listát +OPER_HELP_CMD_SZLINE + SZLINE Szerkeszti az SZLINE listát +OPER_HELP_CMD_CHANLIST + CHANLIST Listázza az összes csatornát +OPER_HELP_CMD_USERLIST + USERLIST Listázza az összes felhasználót +OPER_HELP_CMD_LOGONNEWS + LOGONNEWS Fellépõ üzenetek beállítása +OPER_HELP_CMD_RANDOMNEWS + RANDOMNEWS Véletlenszerûen megjelenõ üzenetet állít be + a felhasználók részére +OPER_HELP_CMD_OPERNEWS + OPERNEWS Operek részére megjelenõ üzenetet állít be +OPER_HELP_CMD_SESSION + SESSION Olvassa a sessionok hoszt listáját +OPER_HELP_CMD_EXCEPTION + EXCEPTION Módosítja a session-korlát/kivétel listát +OPER_HELP_CMD_NOOP + NOOP Ideiglenesen törli az összes O:line-t a szerver + távollétében +OPER_HELP_CMD_JUPE + JUPE Létrehoz egy "Jupiter" álszervert. +OPER_HELP_CMD_IGNORE + IGNORE Módosítja a Szervíz mellõzési listáját +OPER_HELP_CMD_SET + SET Beállítja szervíz általános változóit +OPER_HELP_CMD_RELOAD + RELOAD Újratölti a szervíz Konfigurációs fájlját +OPER_HELP_CMD_UPDATE + UPDATE A Szervíz adatbázist frissíti, felülírja + lemezre közvetlenül +OPER_HELP_CMD_RESTART + RESTART Menti az adatbázist, és újraindítja a szervízt +OPER_HELP_CMD_QUIT + QUIT Leállítja a szervíz programot mentés nélkül +OPER_HELP_CMD_SHUTDOWN + SHUTDOWN Leállítja a szervíz programot mentéssel +OPER_HELP_CMD_DEFCON + DEFCON Manipulálja a DefCon rendszert +OPER_HELP_CMD_CHANKILL + CHANKILL Kirúgja az összes usert a csatornáról +OPER_HELP_CMD_OLINE + OLINE Operflaget ad a biztos felhasználónak +OPER_HELP_CMD_UMODE + UMODE Felhasználó módok állítása +OPER_HELP_CMD_SVSNICK + SVSNICK Megváltoztatja a felhasználó nicknevét +OPER_HELP_CMD_MODLOAD + MODLOAD Betölti a modult +OPER_HELP_CMD_MODUNLOAD + MODUNLOAD Kitölti a modult +OPER_HELP_CMD_MODINFO + MODINFO Információ a betöltött modulokról +OPER_HELP_CMD_MODLIST + MODLIST Listázza a betöltött modulokat OPER_HELP %S parancsok: - GLOBAL Üzenetet küld összes felhasználónak - 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 - 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: - MODE Váltóztatja a szoba módot - KICK Kirúgja a felhasználót csatornáról - CLEARMODES Törli a szoba módot - KILLCLONES Killeli az összes klónt a hosztról - AKILL Szerkeszti az AKILL listát - -OPER_HELP_OPER_CMD_EXTRA - Following commands are also available - -OPER_HELP_OPER_CMD_SGLINE - SGLINE Szerkeszti az SGLINE listát - -OPER_HELP_OPER_CMD_SQLINE - SQLINE Szerkeszti az SQLINE listát - -OPER_HELP_OPER_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 - CHANLIST Listázza az összes csatornát - USERLIST Listázza az összes felhasználót - LOGONNEWS Fellépõ üzenetek beállítása - RANDOMNEWS Véletlenszerûen megjelenõ üzenetet állít be - a felhasználók részére - OPERNEWS Operek részére megjelenõ üzenetet állít be - SESSION Olvassa a sessionok hoszt listáját - EXCEPTION Módosítja a session-korlát/kivétel listát - CACHE Kiírja a hostnév rejtõ usereket a proxy keresõ - NOOP Ideiglenesen törli az összes O:line-t a szerver - távollétében - JUPE Létrehoz egy "Jupiter" álszervert. - IGNORE Módosítja a Szervíz mellõzési listáját - SET Beállítja szervíz általános változóit - RELOAD Újratölti a szervíz Konfigurációs fájlját - UPDATE A Szervíz adatbázist frissíti, felülírja - lemezre közvetlenül - RESTART Menti az adatbázist, és újraindítja a szervízt - QUIT Leállítja a szervíz programot mentés nélkül - SHUTDOWN Leállítja a szervíz programot mentéssel - DEFCON Manipulálja a DefCon rendszert - 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 - OLINE Operflaget ad a biztos felhasználónak - -OPER_HELP_ADMIN_CMD_UMODE - UMODE Felhasználó módok állítása - -OPER_HELP_ADMIN_CMD_SVSNICK - SVSNICK Megváltoztatja a felhasználó nicknevét - -OPER_HELP_ROOT_CMD - Parancs rendelkezésre áll Szervíz Rootok részére: - MODLOAD Betölti a modult - MODUNLOAD Kitölti a modult - MODLIST Listázza a betöltött modulokat - MODINFO Információ a betöltött modulokról 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 diff --git a/lang/it.l b/lang/it.l index 649665ac2..8e4781f95 100644 --- a/lang/it.l +++ b/lang/it.l @@ -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,6 +3287,56 @@ 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_CMD_REGISTER + REGISTER Registra un nick +NICK_HELP_CMD_GROUP + GROUP Entra in un gruppo +NICK_HELP_CMD_IDENTIFY + IDENTIFY Ti identifica per il tuo nick +NICK_HELP_CMD_ACCESS + ACCESS Modifica la lista degli indirizzi autorizzati +NICK_HELP_CMD_SET + SET Imposta le opzioni, inclusa la protezione +NICK_HELP_CMD_DROP + DROP Annulla la registrazione del nick +NICK_HELP_CMD_RECOVER + RECOVER Disconnette un altro utente che usa il tuo nick +NICK_HELP_CMD_RELEASE + RELEASE Permette di usare di nuovo il proprio nick dopo un RECOVER +NICK_HELP_CMD_SENDPASS + SENDPASS Invia la password del proprio nick via e-mail +NICK_HELP_CMD_GHOST + GHOST Disconnette un nick fantasma che non è ancora caduto +NICK_HELP_CMD_ALIST + ALIST Mostra i canali in cui si ha accesso +NICK_HELP_CMD_GLIST + GLIST Mostra la lista di tutti i nick nel proprio gruppo +NICK_HELP_CMD_INFO + INFO Mostra le informazioni su un nick +NICK_HELP_CMD_LIST + LIST Mostra l'elenco dei nick registrati +NICK_HELP_CMD_LOGOUT + LOGOUT Deidentifica dal proprio nick +NICK_HELP_CMD_STATUS + STATUS Indica lo stato di identificazione di un nick +NICK_HELP_CMD_UPDATE + UPDATE 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 @@ -3296,23 +3346,7 @@ NICK_HELP Per maggiori informazioni su un comando specifico, digita /msg %S HELP comando. - ACCESS Modifica la lista degli indirizzi autorizzati - ALIST Mostra i canali in cui si ha accesso - DROP Annulla la registrazione del nick - GHOST Disconnette un nick fantasma che non è ancora caduto - GLIST Mostra la lista di tutti i nick nel proprio gruppo - GROUP Entra in un gruppo - IDENTIFY Ti identifica per il tuo nick - INFO Mostra le informazioni su un nick - LIST Mostra l'elenco dei nick registrati - LOGOUT Deidentifica dal proprio nick - RECOVER Disconnette un altro utente che usa il tuo nick - REGISTER Registra un nick - RELEASE Permette di usare di nuovo il proprio nick dopo un RECOVER - SENDPASS Invia la password del proprio nick via e-mail - SET Imposta le opzioni, inclusa la protezione - STATUS Indica lo stato di identificazione di un nick - +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,6 +3931,86 @@ NICK_SERVADMIN_HELP_UNSUSPEND # ChanServ help messages # ########################################################################### +CHAN_HELP_CMD_GETPASS + GETPASS Recupera la password di fondatore di un canale +CHAN_HELP_CMD_FORBID + FORBID Blocca un canale in modo che non venga usato +CHAN_HELP_CMD_SUSPEND + SUSPEND 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 +CHAN_HELP_CMD_DROP + DROP Annulla la registrazione di un canale +CHAN_HELP_CMD_SENDPASS + SENDPASS Invia la password del proprio canale via e-mail +CHAN_HELP_CMD_BAN + BAN Permette di bannare un utente +CHAN_HELP_CMD_CLEAR + CLEAR Annulla varie impostazioni del canale +CHAN_HELP_CMD_DEVOICE + DEVOICE Toglie lo stato di voice a un utente (-v) +CHAN_HELP_CMD_GETKEY + GETKEY Recupera la password (chiave) di un canale +CHAN_HELP_CMD_INFO + INFO Mostra le informazioni su un canale +CHAN_HELP_CMD_INVITE + INVITE Richiede un invito per un canale +CHAN_HELP_CMD_KICK + KICK Espelle un utente da un canale (kick) +CHAN_HELP_CMD_LIST + LIST Mostra la lista dei canali +CHAN_HELP_CMD_LOGOUT + LOGOUT Deidentifica dal canale specificato +CHAN_HELP_CMD_OP + OP Assegna lo stato di operatore a un utente (+o) +CHAN_HELP_CMD_TOPIC + TOPIC Cambia il topic di un canale +CHAN_HELP_CMD_UNBAN + UNBAN Rimuove i ban che impediscono l'accesso a un canale +CHAN_HELP_CMD_VOICE + VOICE Assegna lo stato di voice a un utente (+v) +CHAN_HELP_CMD_VOP + VOP Modifica la lista degli utenti VOP +CHAN_HELP_CMD_DEHALFOP + DEHALFOP Toglie lo stato di mezzo operatore a un utente +CHAN_HELP_CMD_DEOWNER + DEOWNER Toglie lo stato di owner a un utente +CHAN_HELP_CMD_DEPROTECT + DEPROTECT Toglie lo stato di protezione a un utente +CHAN_HELP_CMD_HALFOP + HALFOP Assegna lo stato di mezzo operatore a un utente (+h) +CHAN_HELP_CMD_HOP + HOP Modifica la lista degli utenti HOP +CHAN_HELP_CMD_OWNER + OWNER Assegna lo stato di owner a un utente (+q) +CHAN_HELP_CMD_PROTECT + PROTECT Assegna lo stato di protezione a un utente (+a) +CHAN_HELP_CMD_ADMIN + ADMIN 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 %S permette di registrare i canali e di controllarne @@ -3913,59 +4020,8 @@ CHAN_HELP sono indicati in basso; per usarli, puoi digitare /msg %S comando. Per avere maggiori informazioni su un comando specifico, digita /msg %S HELP comando. + - ACCESS Modifica la lista degli utenti con privilegi - AKICK Modifica la lista AutoKick - AOP Modifica la lista degli utenti AOP - BAN Permette di bannare un utente - CLEAR Annulla varie impostazioni del canale - DEOP Toglie lo stato di operatore a un utente (-o) - DEVOICE Toglie lo stato di voice a un utente (-v) - DROP Annulla la registrazione di un canale - GETKEY Recupera la password (chiave) di un canale - IDENTIFY Ti identifica come fondatore di un canale - INFO Mostra le informazioni su un canale - INVITE Richiede un invito per un canale - KICK Espelle un utente da un canale (kick) - LEVELS Ridefinisce i privilegi dei livelli di accesso - LIST Mostra la lista dei canali - LOGOUT Deidentifica dal canale specificato - OP Assegna lo stato di operatore a un utente (+o) - REGISTER Registra un canale - SENDPASS Invia la password del proprio canale via e-mail - SET Imposta le opzioni e le informazioni di canale - SOP Modifica la lista degli utenti SOP - TOPIC Cambia il topic di un canale - UNBAN Rimuove i ban che impediscono l'accesso a un canale - VOICE Assegna lo stato di voice a un utente (+v) - VOP Modifica la lista degli utenti VOP - -CHAN_HELP_UNREAL - - Su questa rete sono inoltre disponibili questi comandi: - DEHALFOP Toglie lo stato di mezzo operatore a un utente (-h) - DEOWNER Toglie lo stato di owner a un utente (-q) - DEPROTECT Toglie lo stato di protezione a un utente (-a) - HALFOP Assegna lo stato di mezzo operatore a un utente (+h) - HOP Modifica la lista degli utenti HOP - OWNER Assegna lo stato di owner a un utente (+q) - PROTECT Assegna lo stato di protezione a un utente (+a) - -CHAN_HELP_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 - - 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_CMD_GLOBAL + GLOBAL Invia un messaggio a tutti gli utenti +OPER_HELP_CMD_STATS + STATS Mostra lo stato dei Services e della rete +OPER_HELP_CMD_OPER + OPER Modifica la lista dei Services operator +OPER_HELP_CMD_ADMIN + ADMIN Modifica la lista dei Services admin +OPER_HELP_CMD_STAFF + STAFF Display Services staff and online status +OPER_HELP_CMD_MODE + MODE Cambia dei modi di un canale +OPER_HELP_CMD_KICK + KICK Kicka un utente da un canale +OPER_HELP_CMD_CLEARMODES + CLEARMODES "Pulisce" i modi di un canale +OPER_HELP_CMD_KILLCLONES + KILLCLONES Killa tutti gli utenti da un certo host +OPER_HELP_CMD_AKILL + AKILL Manipola la lista AKILL +OPER_HELP_CMD_SGLINE + SGLINE Manipola la lista SGLINE +OPER_HELP_CMD_SQLINE + SQLINE Manipola la lista SQLINE +OPER_HELP_CMD_SZLINE + SZLINE Manipola la lista SZLINE +OPER_HELP_CMD_CHANLIST + CHANLIST Mostra tutti i canali +OPER_HELP_CMD_USERLIST + USERLIST Mostra tutti gli utenti +OPER_HELP_CMD_LOGONNEWS + LOGONNEWS Definisce i messaggi da mostrare agli utenti + quando si connettono +OPER_HELP_CMD_RANDOMNEWS + RANDOMNEWS Definisce i messaggi da mostrare casualmente + agli utenti quando si connettono +OPER_HELP_CMD_OPERNEWS + OPERNEWS Definisce i messaggi da mostrare agli operatori +OPER_HELP_CMD_SESSION + SESSION Mostra la lista delle sessioni degli host +OPER_HELP_CMD_EXCEPTION + EXCEPTION Modifica la lista delle eccezioni al limite delle + sessioni +OPER_HELP_CMD_NOOP + NOOP Rimuove temporaneamente tutte le O:line di un server +OPER_HELP_CMD_JUPE + JUPE Disabilita ("jupiter") un server +OPER_HELP_CMD_IGNORE + IGNORE Modifica la lista ignore dei Services +OPER_HELP_CMD_SET + SET Imposta varie opzioni globali dei Services +OPER_HELP_CMD_RELOAD + RELOAD Rilegge il file di configurazione dei Services +OPER_HELP_CMD_UPDATE + UPDATE Forza la scrittura su disco immediata dei database + dei Services +OPER_HELP_CMD_RESTART + RESTART Salva i database e riavvia i Services +OPER_HELP_CMD_QUIT + QUIT Termina i Services senza salvare i database +OPER_HELP_CMD_SHUTDOWN + SHUTDOWN Termina i Services salvando i database +OPER_HELP_CMD_DEFCON + DEFCON 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_CMD_UMODE + UMODE Cambia i modi utente di un utente +OPER_HELP_CMD_SVSNICK + SVSNICK Forcefully change a user's nickname +OPER_HELP_CMD_MODLOAD + MODLOAD Load a module +OPER_HELP_CMD_MODUNLOAD + MODUNLOAD Un-Load a module +OPER_HELP_CMD_MODINFO + MODINFO Info about a loaded module +OPER_HELP_CMD_MODLIST + MODLIST List loaded modules + OPER_HELP Comandi di %S: - GLOBAL Invia un messaggio a tutti gli utenti - STATS Mostra lo stato dei Services e della rete - OPER LIST Mostra tutti i Services operator - ADMIN LIST Mostra tutti i Services admin - STAFF Display Services staff and online status - -OPER_HELP_OPER_CMD - Comandi disponibili solo ai Services operator e admin: - MODE Cambia dei modi di un canale - KICK Kicka un utente da un canale - CLEARMODES "Pulisce" i modi di un canale - KILLCLONES Killa tutti gli utenti da un certo host - AKILL Manipola la lista AKILL - -OPER_HELP_OPER_CMD_EXTRA - Following commands are also available - -OPER_HELP_OPER_CMD_SGLINE - SGLINE Manipola la lista SGLINE - -OPER_HELP_OPER_CMD_SQLINE - SQLINE Manipola la lista SQLINE - -OPER_HELP_OPER_CMD_SZLINE - SZLINE Manipola la lista SZLINE - -OPER_HELP_ADMIN_CMD - Comandi disponibili solo ai Services admin: - OPER Modifica la lista dei Services operator - CHANLIST Mostra tutti i canali - USERLIST Mostra tutti gli utenti - LOGONNEWS Definisce i messaggi da mostrare agli utenti - quando si connettono - RANDOMNEWS Definisce i messaggi da mostrare casualmente - agli utenti quando si connettono - OPERNEWS Definisce i messaggi da mostrare agli operatori - SESSION Mostra la lista delle sessioni degli host - EXCEPTION Modifica la lista delle eccezioni al limite delle - sessioni - CACHE Mostra gli host nella cache del proxy detector - NOOP Rimuove temporaneamente tutte le O:line di un server - JUPE Disabilita ("jupiter") un server - IGNORE Modifica la lista ignore dei Services - SET Imposta varie opzioni globali dei Services - RELOAD Rilegge il file di configurazione dei Services - UPDATE Forza la scrittura su disco immediata dei database - dei Services - RESTART Salva i database e riavvia i Services - QUIT Termina i Services senza salvare i database - SHUTDOWN Termina i Services salvando i database - - Comandi disponibili solo al super-user dei Services: - ADMIN Modifica la lista dei Services admin - -OPER_HELP_ADMIN_CMD_EXTRA - Following commands are also available to Service Admins - -OPER_HELP_ADMIN_CMD_OLINE - OLINE Imposta le operflag di un utente - -OPER_HELP_ADMIN_CMD_UMODE - UMODE Cambia i modi utente di un utente - -OPER_HELP_ADMIN_CMD_SVSNICK - SVSNICK Forcefully change a user's nickname - -OPER_HELP_ROOT_CMD - Commands available to Serivces Roots only: - MODLOAD Load a module - MODUNLOAD Un-Load a module - MODLIST List loaded modules - MODINFO Info about a loaded module OPER_HELP_LOGGED Nota: Tutti i comandi inviati a %S sono loggati! @@ -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: - Comandi disponibili solo ai Services Admin: +HOST_OPER_HELP + not used. + +HOST_ADMIN_HELP + not used. HOST_HELP_ON Sintassi: ON diff --git a/lang/nl.l b/lang/nl.l index 1601bb06a..f72c9ec84 100644 --- a/lang/nl.l +++ b/lang/nl.l @@ -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,6 +3240,56 @@ 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_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 @@ -3249,18 +3299,7 @@ NICK_HELP Voor meer informatie over een specifiek commando, type /msg %S HELP commando. - REGISTER Registreer een nickname - GROUP Bij een groep aanmelden - IDENTIFY Jezelf identificeren met je wachtwoord - ACCESS De lijst met toegestane adressen wijzigen - SET Opties instellen, inclusief kill bescherming - DROP De registratie van je nickname annuleren - RECOVER Een andere gebruiker killen die je nick gebruikt - RELEASE Je nick terugnemen nadat je RECOVER gebruikt hebt - SENDPASS Je wachtwoord vergeten? Probeer dit - - Andere commando's: GHOST, GLIST, INFO, LIST, LOGOUT, STATUS - +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,6 +3878,87 @@ NICK_SERVADMIN_HELP_UNSUSPEND # ChanServ help messages # ########################################################################### +CHAN_HELP_CMD_GETPASS + GETPASS Haal het stichter-wachtwoord voor een kanaal op +CHAN_HELP_CMD_FORBID + FORBID Verbied het gebruik van een kanaal +CHAN_HELP_CMD_SUSPEND + SUSPEND Stel een kanaal tijdelijk buiten werking terwijl de + kanaal-data en -instellingen bewaard blijven. +CHAN_HELP_CMD_UNSUSPEND + UNSUSPEND Stelt een tijdelijk buiten werking gesteld kanaal weer + in werking +CHAN_HELP_CMD_STATUS + STATUS Geeft het huidige toegangsniveau van een gebruiker + op een kanaal weer +CHAN_HELP_CMD_REGISTER + REGISTER Registreer een kanaal +CHAN_HELP_CMD_IDENTIFY + IDENTIFY Identificeer jezelf met je wachtwoord +CHAN_HELP_CMD_SET + SET Stel kanaal opties en informatie in +CHAN_HELP_CMD_AOP + AOP Wijzig de lijst van AOP's +CHAN_HELP_CMD_SOP + SOP Wijzig de lijst van SOP's +CHAN_HELP_CMD_ACCESS + ACCESS Wijzig de lijst van toegestane gebruikers +CHAN_HELP_CMD_LEVELS + LEVELS Verander de betekenissen van toegangsniveaus +CHAN_HELP_CMD_AKICK + AKICK Beheer de AutoKick lijst +CHAN_HELP_CMD_DROP + DROP Annuleer een kanaalregistratie +CHAN_HELP_CMD_SENDPASS + SENDPASS Wachtwoord vergeten? +CHAN_HELP_CMD_BAN + BAN Bans a selected nick on a channel +CHAN_HELP_CMD_CLEAR + CLEAR Tells ChanServ to clear certain settings on a channel +CHAN_HELP_CMD_DEVOICE + DEVOICE Devoices a selected nick on a channel +CHAN_HELP_CMD_GETKEY + GETKEY Returns the key of the given channel +CHAN_HELP_CMD_INFO + INFO Lists information about the named registered channel +CHAN_HELP_CMD_INVITE + INVITE Tells ChanServ to invite you or a given nick into a channel +CHAN_HELP_CMD_KICK + KICK Kicks a selected nick from a channel +CHAN_HELP_CMD_LIST + LIST Lists all registered channels matching the given pattern +CHAN_HELP_CMD_LOGOUT + LOGOUT This command will logout the selected nickname +CHAN_HELP_CMD_OP + OP Gives Op status to a selected nick on a channel +CHAN_HELP_CMD_TOPIC + TOPIC Manipulate the topic of the specified channel +CHAN_HELP_CMD_UNBAN + UNBAN Remove all bans preventing you from entering a channel +CHAN_HELP_CMD_VOICE + VOICE Voices a selected nick on a channel +CHAN_HELP_CMD_VOP + VOP Maintains the VOP (VOicePeople) list for a channel +CHAN_HELP_CMD_DEHALFOP + DEHALFOP Dehalfops a selected nick on a channel +CHAN_HELP_CMD_DEOWNER + DEOWNER Removes your owner status on a channel +CHAN_HELP_CMD_DEPROTECT + DEPROTECT Deprotects a selected nick on a channel +CHAN_HELP_CMD_HALFOP + HALFOP Halfops a selected nick on a channel +CHAN_HELP_CMD_HOP + HOP Maintains the HOP (HalfOP) list for a channel +CHAN_HELP_CMD_OWNER + OWNER Gives you owner status on channel +CHAN_HELP_CMD_PROTECT + PROTECT Protects a selected nick on a channel +CHAN_HELP_CMD_ADMIN + ADMIN Protects a selected nick on a channel +CHAN_HELP_CMD_DEADMIN + DEADMIN Deprotects a selected nick on a channel +CHAN_HELP_CMD_DEOP + DEOP Deops a selected nick on a channel CHAN_HELP %S stelt je in staat om kanalen te registreren en er @@ -3855,43 +3968,8 @@ CHAN_HELP Beschikbare commando's staan hier beneden; om ze te gebruiken type je /msg %S commando. Voor meer informatie over een specifiek commando type je /msg %S HELP commando. + - REGISTER Registreer een kanaal - IDENTIFY Identificeer jezelf met je wachtwoord - SET Stel kanaal opties en informatie in - AOP Wijzig de lijst van AOP's - SOP Wijzig de lijst van SOP's - ACCESS Wijzig de lijst van toegestane gebruikers - LEVELS Verander de betekenissen van toegangsniveaus - AKICK Beheer de AutoKick lijst - DROP Annuleer een kanaalregistratie - SENDPASS Wachtwoord vergeten? - - Overige commando's: BAN, CLEAR, DEOP, DEVOICE, GETKEY, - INFO, INVITE, KICK, LIST, LOGOUT, OP, - TOPIC, UNBAN, VOICE, VOP - -CHAN_HELP_UNREAL - - Deze commando's zijn ook beschikbaar op dit netwerk: - DEHALFOP, DEOWNER, DEPROTECT, HALFOP, HOP, OWNER, - PROTECT - -CHAN_HELP_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 - - 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,8 +4944,30 @@ CHAN_SERVADMIN_HELP_STATUS # MemoServ help messages # ########################################################################### +MEMO_HELP_CMD_SEND + SEND Vertstuur een memo naar een nick of kanaal +MEMO_HELP_CMD_CANCEL + CANCEL Annuleer je laatst verzonden memo +MEMO_HELP_CMD_LIST + LIST Geef je memo's weer +MEMO_HELP_CMD_READ + READ Lees een of meerdere memo's +MEMO_HELP_CMD_DEL + DEL Verwijder een of meerdere memo's +MEMO_HELP_CMD_SET + SET Stel opties gerelateerd aan memo's in +MEMO_HELP_CMD_INFO + INFO Toont info over jouw memo's +MEMO_HELP_CMD_RSEND + RSEND Verstuur een memo en verzoek een ontvangstbevestiging +MEMO_HELP_CMD_CHECK + CHECK Kijk of je laatste memo naar iemand is gelezen +MEMO_HELP_CMD_SENDALL + SENDALL Stuur een memo naar alle geregistreerde gebruikers +MEMO_HELP_CMD_STAFF + STAFF Stuur een memo naar alle opers/admin -MEMO_HELP +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 @@ -4888,22 +4976,11 @@ MEMO_HELP %S's commando's bevatten: - SEND Vertstuur een memo naar een nick of kanaal - CANCEL Annuleer je laatst verzonden memo - LIST Geef je memo's weer - READ Lees een of meerdere memo's - DEL Verwijder een of meerdere memo's - SET Stel opties gerelateerd aan memo's in - INFO Toont info over jouw memo's - RSEND Verstuur een memo en verzoek een ontvangstbevestiging - CHECK Kijk of je laatste memo naar iemand is gelezen MEMO_HELP_ADMIN - SENDALL Stuur een memo naar alle geregistreerde gebruikers - + not used. MEMO_HELP_OPER - STAFF Stuur een memo naar alle opers/admin - + 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 - STAFF Display Services staff and online status - -OPER_HELP_OPER_CMD - Commando's beschikbaar voor Services operators en administrators: - MODE Verander de modes op een kanaal - KICK Kick een gebruiker uit een kanaal - CLEARMODES Verwijder alle modes van een kanaal - KILLCLONES Kill alle gebruikers met een bepaalde hostmask - AKILL Beheer de AKILL lijst - -OPER_HELP_OPER_CMD_EXTRA - Following commands are also available - -OPER_HELP_OPER_CMD_SGLINE - SGLINE Beheer de SGLINE lijst - -OPER_HELP_OPER_CMD_SQLINE - SQLINE Beheer de SQLINE lijst - -OPER_HELP_OPER_CMD_SZLINE - SZLINE Beheer de SZLINE lijst - -OPER_HELP_ADMIN_CMD - Commando's beschikbaar voor Services administrators: +OPER_HELP_CMD_OPER OPER Wijzig de Services operator lijst +OPER_HELP_CMD_ADMIN + ADMIN Wijzig de Services Administrator lijst +OPER_HELP_CMD_STAFF + STAFF Display Services staff and online status +OPER_HELP_CMD_MODE + MODE Verander de modes op een kanaal +OPER_HELP_CMD_KICK + KICK Kick een gebruiker uit een kanaal +OPER_HELP_CMD_CLEARMODES + CLEARMODES Verwijder alle modes van een kanaal +OPER_HELP_CMD_KILLCLONES + KILLCLONES Kill alle gebruikers met een bepaalde hostmask +OPER_HELP_CMD_AKILL + AKILL Beheer de AKILL lijst +OPER_HELP_CMD_SGLINE + SGLINE Beheer de SGLINE lijst +OPER_HELP_CMD_SQLINE + SQLINE Beheer de SQLINE lijst +OPER_HELP_CMD_SZLINE + SZLINE Beheer de SZLINE lijst +OPER_HELP_CMD_CHANLIST CHANLIST Geef alle kanalen weer +OPER_HELP_CMD_USERLIST USERLIST Geef alle gebruikers weer +OPER_HELP_CMD_LOGONNEWS LOGONNEWS Stel de berichten in die gebruikers krijgen als - ze inloggen + 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 diff --git a/lang/pl.l b/lang/pl.l index 8e50611fa..d6eb1901e 100644 --- a/lang/pl.l +++ b/lang/pl.l @@ -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,6 +3434,56 @@ 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_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 @@ -3444,19 +3494,7 @@ NICK_HELP uzyskaæ pisz±c: /msg %S HELP komenda. - REGISTER Rejestracja nicka. - GROUP Stworzenie grupy w³asnych nicków. - IDENTIFY Identyfikacja nicka za pomoc± has³a. - ACCESS Modyfikacje listy dostêpu. - SET Ustawienia ró¿nych opcji nicka. - DROP Odrejestruj nicka. - RECOVER Odzyskuje Twojego nicka. - RELEASE Zwalnia nick po opcji RECOVER. - SENDPASS Zapomniane has³o? Spróbuj tego. - - 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,6 +4152,87 @@ NICK_SERVADMIN_HELP_UNSUSPEND # ChanServ help messages # ########################################################################### +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. +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 pozwala na rejestracjê oraz kontrolê @@ -4138,44 +4244,8 @@ CHAN_HELP /msg %S komenda. Aby uzyskaæ wiêcej informacji o poszczególnych komendach, napisz: /msg %S HELP komenda. + - REGISTER Rejestracja kana³u. - IDENTIFY Identyfikacja w³a¶ciciela kana³u. - SET Ustawienia ró¿nych opcji kana³u. - AOP Modyfikacje listy AOP kana³u. - SOP Modyfikacje listy SOP kana³u. - ACCESS Zarz±dzanie kana³ow± list± dostêpu - LEVELS Zarz±dzanie poziomami dostêpu. - AKICK Zarz±dzanie kana³ow± list± AKICK. - DROP Odrejestrowanie kana³u. - 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_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 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,8 +5366,34 @@ CHAN_SERVADMIN_HELP_STATUS # Wiadomo¶ci pomocy MemoServ # ########################################################################### +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_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 +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 @@ -5319,24 +5402,11 @@ MEMO_HELP %S lista dostêpnych komend: - SEND Wyslij wiadomo¶æ do u¿ytkownika/kana³u. - CANCEL Wycofaj ostatni± ustawion± wiadomo¶æ. - LIST Wy¶wietl wszystkie ustawione wiadomo¶ci. - READ Przeczytaj jedn± lub wiêcej wiadomo¶ci. - DEL Skasuj jedn± lub wiêcej wiadomo¶ci. - SET Ustaw opcje dla wiadomo¶ci. - INFO Wy¶wietl informacje o wiadomo¶ciach. - RSEND Wysy³a wiadomo¶æ z ¿±daniem potwierdzenia - odbioru. MEMO_HELP_ADMIN - SENDALL Wysy³a wiadomo¶æ do wszystkich - zarejestrowanych u¿ytkowników. - + not used. MEMO_HELP_OPER - STAFF Wysy³a wiadomo¶æ do wszystkich - operatorów/administratorów Serwisów. - + 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. - STAFF Wy¶wietla ekipe serwisów i jej stan. - -OPER_HELP_OPER_CMD - Komendy tylko dla operatorów i adminów serwisów: - MODE Zmiana modów kana³owych. - KICK Wykopanie u¿ytkownika z kana³u. - CLEARMODES Czyszczenie modów na kanale. - KILLCLONES Skilluj u¿ytkowników z danego hosta. - AKILL Modyfikacje listy AKILL. - -OPER_HELP_OPER_CMD_EXTRA - Following commands are also available - -OPER_HELP_OPER_CMD_SGLINE - SGLINE Modyfikacje listy SGLINII. - -OPER_HELP_OPER_CMD_SQLINE - SQLINE Modyfikacje listy SQLINII. - -OPER_HELP_OPER_CMD_SZLINE - SZLINE Modyfikacje listy SZLINII. - -OPER_HELP_ADMIN_CMD - Komendy dostêpne tylko dla adminów serwisó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_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_CMD_SGLINE + SGLINE Modyfikacje listy SGLINII. +OPER_HELP_CMD_SQLINE + SQLINE Modyfikacje listy SQLINII. +OPER_HELP_CMD_SZLINE + SZLINE Modyfikacje listy SZLINII. +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 diff --git a/lang/pt.l b/lang/pt.l index 00738a04a..a7793e68d 100644 --- a/lang/pt.l +++ b/lang/pt.l @@ -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,6 +3186,57 @@ 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_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 @@ -3194,19 +3245,7 @@ NICK_HELP /msg %S comando. Para mais informações sobre um comando específico, digite /msg %S HELP comando. - REGISTER Registra um nick - GROUP Se junta a um grupo - IDENTIFY Identifica seu nick com sua senha - ACCESS Modifica a lista de endereços autorizados - SET Ajusta opções, incluindo proteção de kill - DROP Cancela o registro de um nick - RECOVER Derruba usuário que esteja usando seu nick - RELEASE Retoma a custódia do seu nick após um RECOVER - SENDPASS Esqueceu sua senha? Tente isto - - Outros comandos: GHOST, 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,6 +3815,88 @@ NICK_SERVADMIN_HELP_UNSUSPEND # ChanServ help messages # ########################################################################### +CHAN_HELP_CMD_GETPASS + GETPASS Recupera a senha de um canal +CHAN_HELP_CMD_FORBID + FORBID Previne um canal de ser registrado/usado +CHAN_HELP_CMD_SUSPEND + SUSPEND Previne um canal de ser registrado/usado, + preservando os dados do canal e suas configurações. +CHAN_HELP_CMD_UNSUSPEND + UNSUSPEND Libera um canal suspenso. +CHAN_HELP_CMD_STATUS + STATUS Fornece o atual nível de acesso de um + usuário em um canal +CHAN_HELP_CMD_REGISTER + REGISTER Registra um canal +CHAN_HELP_CMD_IDENTIFY + IDENTIFY Identifica seu nick +CHAN_HELP_CMD_SET + SET Ajusta as opções e informações do canal +CHAN_HELP_CMD_AOP + AOP Modifica a lista de 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 +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 permite que você registre e controle vários @@ -3794,45 +3906,8 @@ CHAN_HELP 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. + - REGISTER Registra um canal - IDENTIFY Identifica seu nick - SET Ajusta as opções e informações do canal - AOP Modifica a lista de usuários AOP - (efetivo quando listagem xOP está ativada) - SOP Modifica a lista de usuários SOP - (efetivo quando listagem xOP está ativada) - ACCESS Modifica a lista de usuários privilegiados - LEVELS Redefine os níveis de acesso - AKICK Faz a manutenção da Lista de Autokick - DROP Cancela o registro de um canal - SENDPASS Ajuda para recuperar senhas - - Outros comandos: 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_IRCD_HALFOP - - Estes comandos estão também disponíveis nesta Rede: - DEHALFOP, HALFOP, HOP - -CHAN_HELP_IRCD_PROTECT - - 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,7 +4873,30 @@ CHAN_SERVADMIN_HELP_STATUS # ########################################################################### -MEMO_HELP +MEMO_HELP_CMD_SEND + SEND Envia uma mensagem para um nick ou para um canal +MEMO_HELP_CMD_CANCEL + CANCEL Cancela o último memo enviado por você +MEMO_HELP_CMD_LIST + LIST Lista suas mensagens +MEMO_HELP_CMD_READ + READ Lê a(s) mensagem(ns) +MEMO_HELP_CMD_DEL + DEL Apaga a(s) mensagem(ns) +MEMO_HELP_CMD_SET + SET Ajusta opções relacionadas às mensagens +MEMO_HELP_CMD_INFO + INFO Exibe informações sobre suas mensagens +MEMO_HELP_CMD_RSEND + RSEND Envia um memo e pede uma confirmação de leitura +MEMO_HELP_CMD_CHECK + CHECK Verifica se o último memo enviado para um nick foi lido +MEMO_HELP_CMD_SENDALL + SENDALL Envia um memo para todos os usuários registrados +MEMO_HELP_CMD_STAFF + STAFF Envia um memo para todos os opers/admins + +MEMO_HELP_HEADER %S é um serviço que permite aos usuários de IRC enviar curtas mensagens a outros usuários, mesmo que eles estejam conectados no momento ou não; ou @@ -4819,22 +4905,11 @@ MEMO_HELP que possam enviar uma mensagem (memo). Os comandos do %S são: - SEND Envia uma mensagem para um nick ou para um canal - CANCEL Cancela o último memo enviado por você - LIST Lista suas mensagens - READ Lê a(s) mensagem(ns) - DEL Apaga a(s) mensagem(ns) - SET Ajusta opções relacionadas às mensagens - INFO Exibe informações sobre suas mensagens - RSEND Envia um memo e pede uma confirmação de leitura - CHECK Verifica se o último memo enviado para um nick foi lido MEMO_HELP_ADMIN - SENDALL Envia um memo para todos os usuários registrados - + not used. MEMO_HELP_OPER - STAFF Envia um memo para todos os opers/admins - + not used. MEMO_HELP_FOOTER Digite /msg %S HELP comando para ajuda em qualquer um @@ -5019,78 +5094,86 @@ MEMO_HELP_CHECK # ########################################################################### +OPER_HELP_CMD_GLOBAL + GLOBAL Envia uma mensagem para todos usuários +OPER_HELP_CMD_STATS + STATS Mostra estatísticas dos Services e da Rede +OPER_HELP_CMD_OPER + OPER Modifica a lista de Operadores dos Services +OPER_HELP_CMD_ADMIN + ADMIN Modifica lista de Administradores dos Services +OPER_HELP_CMD_STAFF + STAFF Exibe os membros da Staff dos Services e seu status online +OPER_HELP_CMD_MODE + MODE Muda o modo de um canal +OPER_HELP_CMD_KICK + KICK Kicka um usuário de um canal +OPER_HELP_CMD_CLEARMODES + CLEARMODES Limpa os modos de um canal +OPER_HELP_CMD_KILLCLONES + KILLCLONES Derruba todos os usuários de um mesmo host +OPER_HELP_CMD_AKILL + AKILL Manipula a lista de AKILL +OPER_HELP_CMD_SGLINE + SGLINE Manipula a lista de SGLINE +OPER_HELP_CMD_SQLINE + SQLINE Manipula a lista de SQLINE +OPER_HELP_CMD_SZLINE + SZLINE Manipula a lista de SZLINE +OPER_HELP_CMD_CHANLIST + CHANLIST Lista todos os canais em uso na Rede +OPER_HELP_CMD_USERLIST + USERLIST Lista todos os usuários online na Rede +OPER_HELP_CMD_LOGONNEWS + LOGONNEWS Define mensagens a serem mostradas na conexão +OPER_HELP_CMD_RANDOMNEWS + RANDOMNEWS Define mensagens a serem mostradas ao azar na conexão +OPER_HELP_CMD_OPERNEWS + OPERNEWS Define mensagens a serem mostradas a quem pega Oper +OPER_HELP_CMD_SESSION + SESSION Mostra a lista de sessões de host +OPER_HELP_CMD_EXCEPTION + EXCEPTION Modifica a lista de limite de sessões +OPER_HELP_CMD_NOOP + NOOP Remove temporariamente todas as O:lines de um + servidor remotamente +OPER_HELP_CMD_JUPE + JUPE Jupa um servidor +OPER_HELP_CMD_IGNORE + IGNORE Modifica a lista de ignorados dos Services +OPER_HELP_CMD_SET + SET Configura várias opções globais dos Services +OPER_HELP_CMD_RELOAD + RELOAD Recarrega o arquivo de configuração dos Services +OPER_HELP_CMD_UPDATE + UPDATE Salva os dados atuais dos Services +OPER_HELP_CMD_RESTART + RESTART Salva os dados e reinicia os Services +OPER_HELP_CMD_QUIT + QUIT Termina os Services sem salvar os dados +OPER_HELP_CMD_SHUTDOWN + SHUTDOWN Termina os Services salvando os dados +OPER_HELP_CMD_DEFCON + DEFCON Manipula o sistema DefCon +OPER_HELP_CMD_CHANKILL + CHANKILL Derruba todos os usuários de um canal específico +OPER_HELP_CMD_OLINE + OLINE Dá flags de Operador a um determinado usuário +OPER_HELP_CMD_UMODE + UMODE Altera os modos de um usuário +OPER_HELP_CMD_SVSNICK + SVSNICK Força a mudança do nick de um usuário +OPER_HELP_CMD_MODLOAD + MODLOAD Carrega um módulo +OPER_HELP_CMD_MODUNLOAD + MODUNLOAD Descarrega um módulo +OPER_HELP_CMD_MODINFO + MODINFO Informação sobre um módulo carregado +OPER_HELP_CMD_MODLIST + MODLIST Lista os módulos carregados + OPER_HELP Comandos do %S: - GLOBAL Envia uma mensagem para todos usuários - STATS Mostra estatísticas dos Services e da Rede - OPER LIST Lista todos os Operadores dos Services - ADMIN LIST Lista todos os Administradores dos Services - STAFF Exibe os membros da Staff dos Services e seu status online - -OPER_HELP_OPER_CMD - Comandos disponíveis para Operadores e Admins dos Services: - MODE Muda o modo de um canal - KICK Kicka um usuário de um canal - CLEARMODES Limpa os modos de um canal - KILLCLONES Derruba todos os usuários de um mesmo host - 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 - SGLINE Manipula a lista de SGLINE - -OPER_HELP_OPER_CMD_SQLINE - SQLINE Manipula a lista de SQLINE - -OPER_HELP_OPER_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 - CHANLIST Lista todos os canais em uso na Rede - USERLIST Lista todos os usuários online na Rede - LOGONNEWS Define mensagens a serem mostradas na conexão - RANDOMNEWS Define mensagens a serem mostradas ao azar na conexão - OPERNEWS Define mensagens a serem mostradas a quem pega Oper - SESSION Mostra a lista de sessões de host - EXCEPTION Modifica a lista de limite de sessões - NOOP Remove temporariamente todas as O:lines de um - servidor remotamente - JUPE Jupa um servidor - IGNORE Modifica a lista de ignorados dos Services - SET Configura várias opções globais dos Services - RELOAD Recarrega o arquivo de configuração dos Services - UPDATE Salva os dados atuais dos Services - RESTART Salva os dados e reinicia os Services - QUIT Termina os Services sem salvar os dados - SHUTDOWN Termina os Services salvando os dados - DEFCON Manipula o sistema DefCon - 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 - OLINE Dá flags de Operador a um determinado usuário - -OPER_HELP_ADMIN_CMD_UMODE - UMODE Altera os modos de um usuário - -OPER_HELP_ADMIN_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: - MODLOAD Carrega um módulo - MODUNLOAD Descarrega um módulo - MODLIST Lista os módulos carregados - MODINFO Informação sobre um módulo carregado 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 diff --git a/lang/ru.l b/lang/ru.l index 1322da31f..ab066f381 100644 --- a/lang/ru.l +++ b/lang/ru.l @@ -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,6 +3204,56 @@ 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_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 ýòî ñåðâèñ, ïðåäíàçíà÷åííûé äëÿ "ðåãèñòðàöèè" Âàøåãî íèêà è åãî çàùèòû @@ -3213,19 +3263,7 @@ NICK_HELP Äëÿ áîëåå ïîäðîáíîé èíôîðìàöèè ïî êàêîé-ëèáî êîìàíäå íàïèøèòå: /msg %S HELP êîìàíäà. - REGISTER Ðåãèñòðàöèÿ íèêà - GROUP Îáúåäèíåíèå íèêîâ â ãðóïïû - IDENTIFY Èäåíòèôèêàöèÿ Âàñ êàê âëàäåëüöà íèêà - ACCESS Óïðàâëåíèå ñïèñêîì äîñòóïà - SET Óñòàíîâêà ïàðàìåòðîâ, âêëþ÷àÿ çàùèòó kill'îì - DROP Îòìåíà ðåãèñòðàöèè íèêà - RECOVER Âûáðîñèòü èç ÷àòà ïîëüçîâàòåëÿ, âçÿâøåãî Âàø íèê - RELEASE Âîññòàíîâëåíèå èñïîëüçîâàíèÿ Âàøåãî íèêà ïîñëå êîìàíäû RECOVER - SENDPASS Çàáûëè ïàðîëü? Ïîïðîáóéòå ýòó êîìàíäó - - Äðóãèå êîìàíäû: 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,6 +3836,86 @@ NICK_SERVADMIN_HELP_UNSUSPEND # ChanServ help messages # ########################################################################### +CHAN_HELP_CMD_GETPASS + GETPASS Ïîëó÷èòü ïàðîëü âëàäåëüöà êàíàëà +CHAN_HELP_CMD_FORBID + FORBID Çàïðåòèòü èñïîëüçîâàòü êàíàë +CHAN_HELP_CMD_SUSPEND + SUSPEND Ïðèîñòàíîâèòü ðàáîòó êàíàëà ñ ñîõðàíåíèåì + äàííûõ è íàñòðîåê êàíàëà. +CHAN_HELP_CMD_UNSUSPEND + UNSUSPEND Âîññòàíîâèòü ðàáîòó ïðèîñòàíîâëåííîãî êàíàëà. +CHAN_HELP_CMD_STATUS + STATUS Âîçâðàùàåò òåêóùèé óðîâåíü äîñòóïà äëÿ óêàçàííîãî + ïîëüçîâàòåëÿ íà êàíàëå. +CHAN_HELP_CMD_REGISTER + REGISTER Ðåãèñòðàöèÿ êàíàëà +CHAN_HELP_CMD_IDENTIFY + IDENTIFY Èäåíòèôèöèðîâàòüñÿ êàê âëàäåëåö êàíàëà +CHAN_HELP_CMD_SET + SET Óñòàíîâèòü èíôîðìàöèþ î êàíàëå è îïöèè êàíàëà +CHAN_HELP_CMD_AOP + AOP Ìîäèôèöèðîâàòü ñïèñîê AOP'îâ +CHAN_HELP_CMD_SOP + SOP Ìîäèôèöèðîâàòü ñïèñîê SOP'îâ +CHAN_HELP_CMD_ACCESS + ACCESS Ìîäèôèöèðîâàòü ñïèñîê ïðèâèëåãèðîâàííûõ ïîëüçîâàòåëåé +CHAN_HELP_CMD_LEVELS + LEVELS Ïåðåóñòàíîâèòü çíà÷åíèÿ óðîâíåé äîñòóïà +CHAN_HELP_CMD_AKICK + AKICK Óïðàâëåíèå ñïèñêîì àâòîêèêîâ +CHAN_HELP_CMD_DROP + DROP Óäàëèòü êàíàë èç áàçû äàííûõ ChanServ +CHAN_HELP_CMD_SENDPASS + SENDPASS Ïîìîæåò âîññòàíîâèòü çàáûòûé ïàðîëü +CHAN_HELP_CMD_BAN + BAN Bans a selected nick on a channel +CHAN_HELP_CMD_CLEAR + CLEAR Tells ChanServ to clear certain settings on a channel +CHAN_HELP_CMD_DEVOICE + DEVOICE Devoices a selected nick on a channel +CHAN_HELP_CMD_GETKEY + GETKEY Returns the key of the given channel +CHAN_HELP_CMD_INFO + INFO Lists information about the named registered channel +CHAN_HELP_CMD_INVITE + INVITE Tells ChanServ to invite you or a given nick into a channel +CHAN_HELP_CMD_KICK + KICK Kicks a selected nick from a channel +CHAN_HELP_CMD_LIST + LIST Lists all registered channels matching the given pattern +CHAN_HELP_CMD_LOGOUT + LOGOUT This command will logout the selected nickname +CHAN_HELP_CMD_OP + OP Gives Op status to a selected nick on a channel +CHAN_HELP_CMD_TOPIC + TOPIC Manipulate the topic of the specified channel +CHAN_HELP_CMD_UNBAN + UNBAN Remove all bans preventing you from entering a channel +CHAN_HELP_CMD_VOICE + VOICE Voices a selected nick on a channel +CHAN_HELP_CMD_VOP + VOP Maintains the VOP (VOicePeople) list for a channel +CHAN_HELP_CMD_DEHALFOP + DEHALFOP Dehalfops a selected nick on a channel +CHAN_HELP_CMD_DEOWNER + DEOWNER Removes your owner status on a channel +CHAN_HELP_CMD_DEPROTECT + DEPROTECT Deprotects a selected nick on a channel +CHAN_HELP_CMD_HALFOP + HALFOP Halfops a selected nick on a channel +CHAN_HELP_CMD_HOP + HOP Maintains the HOP (HalfOP) list for a channel +CHAN_HELP_CMD_OWNER + OWNER Gives you owner status on channel +CHAN_HELP_CMD_PROTECT + PROTECT Protects a selected nick on a channel +CHAN_HELP_CMD_ADMIN + ADMIN Protects a selected nick on a channel +CHAN_HELP_CMD_DEADMIN + DEADMIN Deprotects a selected nick on a channel +CHAN_HELP_CMD_DEOP + DEOP Deops a selected nick on a channel CHAN_HELP %S ïîçâîëÿåò Âàì ðåãèñòðèðîâàòü êàíàë è óïðàâëÿòü @@ -3814,43 +3925,8 @@ CHAN_HELP êîìàíäû ïîêàçàíû íèæå; ÷òîáû èñïîëüçîâàòü èõ ïèøèòå /msg %S êîìàíäà. Äëÿ áîëåå ïîäðîáíîé èíôîðìàöèè î êîíêðåòíîé êîìàíäå, íàïèøèòå /msg %S HELP êîìàíäà. + - REGISTER Ðåãèñòðàöèÿ êàíàëà - IDENTIFY Èäåíòèôèöèðîâàòüñÿ êàê âëàäåëåö êàíàëà - SET Óñòàíîâèòü èíôîðìàöèþ î êàíàëå è îïöèè êàíàëà - AOP Ìîäèôèöèðîâàòü ñïèñîê AOP'îâ - SOP Ìîäèôèöèðîâàòü ñïèñîê SOP'îâ - ACCESS Ìîäèôèöèðîâàòü ñïèñîê ïðèâèëåãèðîâàííûõ ïîëüçîâàòåëåé - LEVELS Ïåðåóñòàíîâèòü çíà÷åíèÿ óðîâíåé äîñòóïà - AKICK Óïðàâëåíèå ñïèñêîì àâòîêèêîâ - DROP Óäàëèòü êàíàë èç áàçû äàííûõ ChanServ - SENDPASS Ïîìîæåò âîññòàíîâèòü çàáûòûé ïàðîëü - - Äðóãèå êîìàíäû: BAN, CLEAR, DEOP, DEVOICE, GETKEY, INFO, - INVITE, KICK, LIST, LOGOUT, OP, TOPIC, - UNBAN, VOICE, VOP - -CHAN_HELP_UNREAL - -  äàííîé ñåòè òàêæå äîñòóïíû êîìàíäû: - DEHALFOP, DEOWNER, DEPROTECT, HALFOP, HOP, OWNER, - PROTECT - -CHAN_HELP_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 - - 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_CMD_GLOBAL + GLOBAL Ïîñëàòü ñîîáùåíèå âñåì ïîëüçîâàòåëÿì +OPER_HELP_CMD_STATS + STATS Ïîêàçàòü ñòàòèñòèêó ñåðâèñîâ è ñåòè +OPER_HELP_CMD_OPER + OPER Óïðàâëåíèå ñïèñêîì Îïåðàòîðîâ ñåðâèñîâ +OPER_HELP_CMD_ADMIN + ADMIN Óïðàâëåíèå ñïèñêîì àäìèíèñòðàòîðîâ ñåðâèñîâ +OPER_HELP_CMD_STAFF + STAFF Ñïèñîê âñåõ ïðîïèñàííûõ íà ñåðâèñàõ è èõ îíëàéí-ñòàòóñ +OPER_HELP_CMD_MODE + MODE Èçìåíÿåò ðåæèì íà êàíàëå +OPER_HELP_CMD_KICK + KICK Êèêíóòü ïîëüçîâàòåëÿ ñ êàíàëà +OPER_HELP_CMD_CLEARMODES + CLEARMODES Î÷èñòêà ðåæèìîâ íà êàíàëå +OPER_HELP_CMD_KILLCLONES + KILLCLONES Ïðèáèòü âñåõ ïîëüçîâàòåëåé ñ îïðåäåëåííîãî õîñòà +OPER_HELP_CMD_AKILL + AKILL Óïðàâëåíèå ñïèñêîì AKILL'îâ +OPER_HELP_CMD_SGLINE + SGLINE Óïðàâëåíèå ñïèñêîì SGLINE'îâ +OPER_HELP_CMD_SQLINE + SQLINE Óïðàâëåíèå ñïèñêîì SQLINE'îâ +OPER_HELP_CMD_SZLINE + SZLINE Óïðàâëåíèå ñïèñêîì SZLINE'îâ +OPER_HELP_CMD_CHANLIST + CHANLIST Ïîêàçàòü âñå òåêóùèå êàíàëû +OPER_HELP_CMD_USERLIST + USERLIST Ïîêàçàòü âñåõ òåêóùèõ ïîëüçîâàòåëåé +OPER_HELP_CMD_LOGONNEWS + LOGONNEWS Óñòàíîâèòü ñîîáùåíèÿ ïðè âõîäå â ñåòü +OPER_HELP_CMD_RANDOMNEWS + RANDOMNEWS Óñòàíîâèòü ñëó÷àéíûå ñîîáùåíèÿ + ïðè âõîäå â ñåòü +OPER_HELP_CMD_OPERNEWS + OPERNEWS Óñòàíîâèòü ñîîáùåíèÿ, ïîêàçûâàåìûå ïðè /oper +OPER_HELP_CMD_SESSION + SESSION Ïîñìîòðåòü ñïèñîê òåêóùèõ ñîåäèíåíèé +OPER_HELP_CMD_EXCEPTION + EXCEPTION Óïðàâëåíèå ñïèñêîì èñêëþ÷åíèé èç ëèìèòà ñåññèé +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 Ïðèáèòü âñåõ ïîëüçîâàòåëåé íà îïðåäåëåííîì êàíàëå +OPER_HELP_CMD_OLINE + OLINE Óñòàíîâèòü ôëàãè IRC Îïåðàòîðîâ îïðåäåëåííîìó ïîëüçîâàòåëþ +OPER_HELP_CMD_UMODE + UMODE Èçìåíåíèå ðåæèìîâ ïîëüçîâàòåëÿ +OPER_HELP_CMD_SVSNICK + SVSNICK Ñìåíèòü íèê ïîëüçîâàòåëþ +OPER_HELP_CMD_MODLOAD + MODLOAD Çàãðóçèòü ìîäóëü +OPER_HELP_CMD_MODUNLOAD + MODUNLOAD Âûãðóçèòü ìîäóëü +OPER_HELP_CMD_MODINFO + MODINFO Èíôîðìàöèÿ î çàãðóæåííîì ìîäóëå +OPER_HELP_CMD_MODLIST + MODLIST Ñïèñîê çàãðóæåííûõ ìîäóëåé + OPER_HELP %S commands: - GLOBAL Ïîñëàòü ñîîáùåíèå âñåì ïîëüçîâàòåëÿì - STATS Ïîêàçàòü ñòàòèñòèêó ñåðâèñîâ è ñåòè - OPER LIST Ñïèñîê Îïåðàòîðîâ ñåðâèñîâ - ADMIN LIST Ñïèñîê Àäìèíèñòðàòîðîâ Ñåðâèñîâ - STAFF Ñïèñîê âñåõ ïðîïèñàííûõ íà ñåðâèñàõ è èõ îíëàéí-ñòàòóñ - -OPER_HELP_OPER_CMD - Êîìàíäû, äîñòóïíûå òîëüêî Îïåðàòîðàì è Àäìèíèñòðàòîðàì ñåðâèñîâ è: - MODE Èçìåíÿåò ðåæèì íà êàíàëå - KICK Êèêíóòü ïîëüçîâàòåëÿ ñ êàíàëà - CLEARMODES Î÷èñòêà ðåæèìîâ íà êàíàëå - KILLCLONES Ïðèáèòü âñåõ ïîëüçîâàòåëåé ñ îïðåäåëåííîãî õîñòà - AKILL Óïðàâëåíèå ñïèñêîì AKILL'îâ - -OPER_HELP_OPER_CMD_EXTRA - Following commands are also available - -OPER_HELP_OPER_CMD_SGLINE - SGLINE Óïðàâëåíèå ñïèñêîì SGLINE'îâ - -OPER_HELP_OPER_CMD_SQLINE - SQLINE Óïðàâëåíèå ñïèñêîì SQLINE'îâ - -OPER_HELP_OPER_CMD_SZLINE - SZLINE Óïðàâëåíèå ñïèñêîì SZLINE'îâ - - -OPER_HELP_ADMIN_CMD - Êîìàíäû, äîñòóïíûå òîëüêî Àäìèíèñòðàòîðàì ñåðâèñîâ: - OPER Óïðàâëåíèå ñïèñêîì Îïåðàòîðîâ ñåðâèñîâ - CHANLIST Ïîêàçàòü âñå òåêóùèå êàíàëû - USERLIST Ïîêàçàòü âñåõ òåêóùèõ ïîëüçîâàòåëåé - LOGONNEWS Óñòàíîâèòü ñîîáùåíèÿ ïðè âõîäå â ñåòü - RANDOMNEWS Óñòàíîâèòü ñëó÷àéíûå ñîîáùåíèÿ - ïðè âõîäå â ñåòü - OPERNEWS Óñòàíîâèòü ñîîáùåíèÿ, ïîêàçûâàåìûå ïðè /oper - SESSION Ïîñìîòðåòü ñïèñîê òåêóùèõ ñîåäèíåíèé - EXCEPTION Óïðàâëåíèå ñïèñêîì èñêëþ÷åíèé èç ëèìèòà ñåññèé - CACHE Ñïèñîê êýøèðîâàííûõ õîñòîâ, èñïîëüçóåìûõ äåòåêòîðîì ïðîêñè - NOOP Âðåìåííî óäàëèòü âñå O:ëàéíû íà óêàçàííîì - ñåðâåðå - JUPE "Äæóïíóòü" ñåðâåð - IGNORE Óïðàâëåíèå ñïèñêîì èãíîðîâ ñåðâèñîâ - SET Óñòàíîâèòü ðàçëè÷íûå îïöèè ñåðâèñîâ - RELOAD Ïåðåçàãðóçèòü êîíôèãóðàöèîííûé ôàéë ñåðâèñîâ - UPDATE Çàñòàâèòü ñåðâèñû íåìåäëåííî ñîõðàíèòü - âñå áàçû äàííûõ íà äèñê - RESTART Ñîõðàíèòü áàçû äàííûõ è ïåðåçàïóñòèòü ñåðâèñû - QUIT Çàâåðøèòü ðàáîòó ñåðâèñîâ áåç ñîõðàíåíèÿ äàííûõ - SHUTDOWN Çàâåðøèòü ðàáîòó ñåðâèñîâ ñ ñîõðàíåíèåì äàííûõ - DEFCON Óïðàâëåíèå ñèñòåìîé DefCon - CHANKILL Ïðèáèòü âñåõ ïîëüçîâàòåëåé íà îïðåäåëåííîì êàíàëå - - Êîìàíäû, äîñòóïíûå òîëüêî ñóïåðïîëüçîâàòåëþ ñåðâèñîâ: - ADMIN Óïðàâëåíèå ñïèñêîì àäìèíèñòðàòîðîâ ñåðâèñîâ - -OPER_HELP_ADMIN_CMD_EXTRA - Following commands are also available to Service Admins - -OPER_HELP_ADMIN_CMD_OLINE - OLINE Óñòàíîâèòü ôëàãè IRC Îïåðàòîðîâ îïðåäåëåííîìó ïîëüçîâàòåëþ - -OPER_HELP_ADMIN_CMD_UMODE - UMODE Èçìåíåíèå ðåæèìîâ ïîëüçîâàòåëÿ - -OPER_HELP_ADMIN_CMD_SVSNICK - SVSNICK Ñìåíèòü íèê ïîëüçîâàòåëþ - -OPER_HELP_ROOT_CMD - Êîìàíäû, äîñòóïíû òîëüêî ñóïåðïîëüçîâàòåëÿì ñåðâèñîâ: - MODLOAD Çàãðóçèòü ìîäóëü - MODUNLOAD Âûãðóçèòü ìîäóëü - MODLIST Ñïèñîê çàãðóæåííûõ ìîäóëåé - MODINFO Èíôîðìàöèÿ î çàãðóæåííîì ìîäóëå 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,23 +6193,32 @@ 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): - SET Óñòàíîâèòü âèðóòàëüíûé õîñò ïîëüçîâàòåëþ - SETALL Óñòàíîâèòü âèðòóàëüíûé õîñò äëÿ âñåõ íêîâ â ãðóïïå - DEL Óäàëèòü âèðòóàëüíûé õîñò ïîëüçîâàòåëÿ - DELALL Óäàëèòü âèðòóàëüíûå õîñòû äëÿ âñåõ íèêîâ â ãðóïïå -HOST_ADMIN_HELP - Êîìàíäû, äîñòóïíûå òîëüêî Àäìèíèñòðàòîðàì ñåðâèñîâ: +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 + not used. + HOST_HELP_ON Ñèíòàêñèñ: ON diff --git a/lang/tr.l b/lang/tr.l index e0bc6ca69..b0bae72d1 100644 --- a/lang/tr.l +++ b/lang/tr.l @@ -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,6 +3277,57 @@ 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_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 +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 @@ -3285,19 +3336,7 @@ NICK_HELP /msg %S komut yazýn. Belirli bir komut hakkýnda daha fazla bilgi için, /msg %S HELP komut yazýn. - REGISTER Nickinizi kaydeder - GROUP Bir gruba dahil eder - IDENTIFY Þifrenizle nickinizi tanýtýr - ACCESS Ýzinli adreslerin listesini düzenler - SET Ayarlar, kill korumasýný içerir - DROP Nickin kaydýný siler - RECOVER Nickinizi kullanan birini kill ler - RELEASE RECOVER komutundan sonra nickinizi serbest - býrakýr - SENDPASS Þifrenizimi unuttunuz? Bunu deneyin - - Diðer komutlar: GHOST, GLIST, INFO, LIST, LOGOUT, STATUS - +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_CMD_GLOBAL + GLOBAL Tüm kullanýcýlara mesaj gönderir +OPER_HELP_CMD_STATS + STATS Servislerin ve networkun durumunu gösterir +OPER_HELP_CMD_OPER + OPER Servis operatör listesini düzenler +OPER_HELP_CMD_ADMIN + ADMIN Servis adminleri listesini düzenler +OPER_HELP_CMD_STAFF + STAFF Display Services staff and online status +OPER_HELP_CMD_MODE + MODE Bir kanalýn modlarýný deðiþtirir +OPER_HELP_CMD_KICK + KICK Bir kullanýcýyý kanaldan atar +OPER_HELP_CMD_CLEARMODES + CLEARMODES Bir kanalýn modlarýný temizler +OPER_HELP_CMD_KILLCLONES + KILLCLONES Ayni ip'deki tum kullanicilari kill'ler. +OPER_HELP_CMD_AKILL + AKILL AKILL listesini düzenler +OPER_HELP_CMD_SGLINE + SGLINE SGLINE listesini düzenler +OPER_HELP_CMD_SQLINE + SQLINE SQLINE listesini düzenler +OPER_HELP_CMD_SZLINE + SZLINE SZLINE listesini düzenler +OPER_HELP_CMD_CHANLIST + CHANLIST Tüm kanal kayýtlarýný listeler +OPER_HELP_CMD_USERLIST + USERLIST Tüm kullanýcý kayýtlarýný listeler +OPER_HELP_CMD_LOGONNEWS + LOGONNEWS Baðlantý sýrasýnda kullanýcýnýn göreceði mesajý + belirler +OPER_HELP_CMD_RANDOMNEWS + RANDOMNEWS Baglanti sirasina kullaniciya gönderilen karisik + mesajlari belirler +OPER_HELP_CMD_OPERNEWS + OPERNEWS Oper olan kullanýcýlarýn görüntüleyeceði mesajý + belirler +OPER_HELP_CMD_SESSION + SESSION Host session(oturum) larýn listesini gösterir +OPER_HELP_CMD_EXCEPTION + EXCEPTION Session-limit exception listesini düzenler +OPER_HELP_CMD_NOOP + NOOP Geçici olarak tüm O:line larý kaldýrýr +OPER_HELP_CMD_JUPE + JUPE Bir server'ý "Kullanýlmaz" yapar +OPER_HELP_CMD_IGNORE + IGNORE Modify the Services ignore list +OPER_HELP_CMD_SET + SET Çeþitli global servis özelliklerini ayarlar +OPER_HELP_CMD_RELOAD + RELOAD Servislerin conf dosyasýný yeniden yükler +OPER_HELP_CMD_UPDATE + UPDATE Diskteki Servis veritabanýnýn hemen + güncellenmesini saðlar + +OPER_HELP_CMD_RESTART + RESTART Veritabanýný kaydeder ve servisleri yeniden + baþlatýr + +OPER_HELP_CMD_QUIT + QUIT Servis programýný kapatýr +OPER_HELP_CMD_SHUTDOWN + SHUTDOWN Servisler programýný kayýt ederek kapatýr +OPER_HELP_CMD_DEFCON + DEFCON Manipulate the DefCon system +OPER_HELP_CMD_CHANKILL + CHANKILL Kill all users on a specific channel +OPER_HELP_CMD_OLINE + OLINE Give Operflags to a certain user +OPER_HELP_CMD_UMODE + UMODE Change a user's modes +OPER_HELP_CMD_SVSNICK + SVSNICK Forcefully change a user's nickname +OPER_HELP_CMD_MODLOAD + MODLOAD Load a module +OPER_HELP_CMD_MODUNLOAD + MODUNLOAD Un-Load a module +OPER_HELP_CMD_MODINFO + MODINFO Info about a loaded module +OPER_HELP_CMD_MODLIST + MODLIST List loaded modules + OPER_HELP %S commands: - GLOBAL Tüm kullanýcýlara mesaj gönderir - STATS Servislerin ve networkun durumunu gösterir - OPER LIST Tüm Servis operatörlerini listeler - ADMIN LIST Tüm Servis adminlerini listeler - STAFF Display Services staff and online status - -OPER_HELP_OPER_CMD - Sadece Servis operatörleri ve adminleri için geçerli komutlar: - MODE Bir kanalýn modlarýný deðiþtirir - KICK Bir kullanýcýyý kanaldan atar - CLEARMODES Bir kanalýn modlarýný temizler - KILLCLONES Ayni ip'deki tum kullanicilari kill'ler. - AKILL AKILL listesini düzenler - -OPER_HELP_OPER_CMD_EXTRA - Following commands are also available - -OPER_HELP_OPER_CMD_SGLINE - SGLINE SGLINE listesini düzenler - -OPER_HELP_OPER_CMD_SQLINE - SQLINE SQLINE listesini düzenler - -OPER_HELP_OPER_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 - CHANLIST Tüm kanal kayýtlarýný listeler - USERLIST Tüm kullanýcý kayýtlarýný listeler - OPER Servis operatör listesini düzenler - LOGONNEWS Baðlantý sýrasýnda kullanýcýnýn göreceði mesajý - belirler - RANDOMNEWS Baglanti sirasina kullaniciya gönderilen karisik - mesajlari belirler - OPERNEWS Oper olan kullanýcýlarýn görüntüleyeceði mesajý - belirler - NOOP Geçici olarak tüm O:line larý kaldýrýr - JUPE Bir server'ý "Kullanýlmaz" yapar - SET Çeþitli global servis özelliklerini ayarlar - UPDATE Diskteki Servis veritabanýnýn hemen - güncellenmesini saðlar - RELOAD Servislerin conf dosyasýný yeniden yükler - QUIT Servis programýný kapatýr - RESTART Veritabanýný kaydeder ve servisleri yeniden - baþlatýr - SHUTDOWN Servisler programýný kayýt ederek kapatýr - - Sadece Servis super-user(root) larý için geçerli komutlar: - ADMIN Servis adminleri listesini düzenler - -OPER_HELP_ADMIN_CMD_EXTRA - Following commands are also available to Service Admins - -OPER_HELP_ADMIN_CMD_OLINE - OLINE Give Operflags to a certain user - -OPER_HELP_ADMIN_CMD_UMODE - UMODE Change a user's modes - -OPER_HELP_ADMIN_CMD_SVSNICK - SVSNICK Forcefully change a user's nickname - -OPER_HELP_ROOT_CMD - Commands available to Serivces Roots only: - MODLOAD Load a module - MODUNLOAD Un-Load a module - MODLIST List loaded modules - MODINFO Info about a loaded module OPER_HELP_LOGGED Not: %S'e gönderilen tüm komutlarýn kaydý tutulur! @@ -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; @@ -1241,1307 +1015,6 @@ static void bot_raw_mode(User * requester, ChannelInfo * ci, char *mode, do_cmode(ci->bi->nick, ac, av); } -/*************************************************************************/ - -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 @@ -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); +int is_identified(User * user, 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); 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 {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); +E int is_host_setter(User * u); +E 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 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; @@ -351,117 +324,6 @@ char *getvIdent(char *nick) return NULL; } -/*************************************************************************/ -int listOut(User * u) -{ - char *key = strtok(NULL, ""); - struct tm *tm; - char buf[BUFSIZE]; - int counter = 1; - int from = 0, to = 0; - char *tmp = NULL; - char *s = NULL; - int display_counter = 0; - - HostCore *current; - - current = head; - if (current == NULL) - notice_lang(s_HostServ, u, HOST_EMPTY); - else { - /** - * Do a check for a range here, then in the next loop - * we'll only display what has been requested.. - **/ - if (key) { - if (key[0] == '#') { - tmp = myStrGetOnlyToken((key + 1), '-', 0); /* Read FROM out */ - if (!tmp) { - return MOD_CONT; - } - for (s = tmp; *s; s++) { - if (!isdigit(*s)) { - return MOD_CONT; - } - } - from = atoi(tmp); - tmp = myStrGetTokenRemainder(key, '-', 1); /* Read TO out */ - if (!tmp) { - return MOD_CONT; - } - for (s = tmp; *s; s++) { - if (!isdigit(*s)) { - return MOD_CONT; - } - } - to = atoi(tmp); - key = NULL; - } - } - - while (current != NULL) { - if (key) { - if (((match_wild_nocase(key, current->nick)) - || (match_wild_nocase(key, current->vHost))) - && (display_counter < NSListMax)) { - display_counter++; - tm = localtime(¤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) { @@ -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; @@ -217,84 +189,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 @@ -445,374 +339,31 @@ void memo_send(User * u, char *name, char *text, int z) } /*************************************************************************/ - /** - * Cancel the memo - * @param u User Struct - * @return MOD_CONT + * 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 do_cancel(User * u) +int delmemo(MemoInfo * mi, int num) { - 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; + 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 = &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() - */ -static int read_memo_callback(User * u, int num, va_list args) -{ - MemoInfo *mi = va_arg(args, MemoInfo *); - const char *chan = va_arg(args, const char *); - int i; - - for (i = 0; i < mi->memocount; i++) { - if (mi->memos[i].number == num) - break; - } - /* Range check done in read_memo */ - return read_memo(u, i, mi, chan); -} - - -/*************************************************************************/ - -/** - * Read 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; @@ -821,560 +372,6 @@ static int del_memo_callback(User * u, int num, va_list args) /*************************************************************************/ -/** - * 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); - } - 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); - } 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; - } - - - 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; -} - -/*************************************************************************/ - static void new_memo_mail(NickCore * nc, Memo * m) { MailInfo *mail = NULL; @@ -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; } @@ -462,6 +563,18 @@ int unloadModule(Module * m, User * u) #endif } +/** + * Module setType() + * Lets the module set a type, CORE,PROTOCOL,3RD etc.. + **/ +void moduleSetType(MODType type) +{ + if ((mod_current_module_name) && (!mod_current_module)) { + mod_current_module = findModule(mod_current_module_name); + } + mod_current_module->type = type; +} + /** * Prepare a module to be unloaded. * Remove all commands and messages this module is providing, and delete @@ -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; +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]; + 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; + } } - 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); + 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 + * + * 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 + * 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 + * + * 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 similarity index 100% rename from src/modules/catserv/Makefile rename to src/modules/demos/catserv/Makefile diff --git a/src/modules/catserv/README b/src/modules/demos/catserv/README similarity index 100% rename from src/modules/catserv/README rename to src/modules/demos/catserv/README diff --git a/src/modules/catserv/catserv_extern.h b/src/modules/demos/catserv/catserv_extern.h similarity index 100% rename from src/modules/catserv/catserv_extern.h rename to src/modules/demos/catserv/catserv_extern.h diff --git a/src/modules/catserv/catserv_messages.c b/src/modules/demos/catserv/catserv_messages.c similarity index 100% rename from src/modules/catserv/catserv_messages.c rename to src/modules/demos/catserv/catserv_messages.c diff --git a/src/modules/catserv/catserv_messages.h b/src/modules/demos/catserv/catserv_messages.h similarity index 100% rename from src/modules/catserv/catserv_messages.h rename to src/modules/demos/catserv/catserv_messages.h diff --git a/src/modules/catserv/ircd_catserv.c b/src/modules/demos/catserv/ircd_catserv.c similarity index 99% rename from src/modules/catserv/ircd_catserv.c rename to 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 similarity index 100% rename from src/modules/catserv/makefile.win32 rename to src/modules/demos/catserv/makefile.win32 diff --git a/src/modules/catserv/meow.c b/src/modules/demos/catserv/meow.c similarity index 100% rename from src/modules/catserv/meow.c rename to src/modules/demos/catserv/meow.c diff --git a/src/modules/catserv/meow.h b/src/modules/demos/catserv/meow.h similarity index 100% rename from src/modules/catserv/meow.h rename to src/modules/demos/catserv/meow.h diff --git a/src/modules/catserv/purr.c b/src/modules/demos/catserv/purr.c similarity index 100% rename from src/modules/catserv/purr.c rename to src/modules/demos/catserv/purr.c diff --git a/src/modules/catserv/purr.h b/src/modules/demos/catserv/purr.h similarity index 100% rename from src/modules/catserv/purr.h rename to 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 similarity index 98% rename from src/modules/hs_moo.c rename to 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 + * + * 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 + * Included in the Anope module pack since Anope 1.7.9 + * Anope Coder: DrStein + * + * 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 + * Included in the Anope module pack since Anope 1.7.9 + * Anope Coder: DrStein + * + * 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 ", + /* 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 ", + /* 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 ", + /* 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 ", + /* 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 ", + /* 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 ", + /* 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 ", + /* 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 ", + /* 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); } } @@ -1450,68 +1360,13 @@ void insert_requestnick(NickRequest * nr) nrlists[index] = nr; } -/*************************************************************************/ -/* Creates a new Nick Request */ -static NickRequest *makerequest(const char *nick) -{ - NickRequest *nr; - - nr = scalloc(1, sizeof(NickRequest)); - nr->nick = sstrdup(nick); - insert_requestnick(nr); - alog("%s: Nick %s has been requested", s_NickServ, nr->nick); - return nr; -} - - - -/* Creates a full new nick (alias + core) in NickServ database. */ - -static NickAlias *makenick(const char *nick) -{ - NickAlias *na; - NickCore *nc; - - /* First make the core */ - nc = scalloc(1, sizeof(NickCore)); - nc->display = sstrdup(nick); - slist_init(&nc->aliases); - insert_core(nc); - alog("%s: group %s has been created", s_NickServ, nc->display); - - /* Then make the alias */ - na = scalloc(1, sizeof(NickAlias)); - na->nick = sstrdup(nick); - na->nc = nc; - slist_add(&nc->aliases, na); - alpha_insert_alias(na); - return na; -} - -/*************************************************************************/ - -/* Creates a new alias in NickServ database. */ - -static NickAlias *makealias(const char *nick, NickCore * nc) -{ - NickAlias *na; - - /* Just need to make the alias */ - na = scalloc(1, sizeof(NickAlias)); - na->nick = sstrdup(nick); - na->nc = nc; - slist_add(&nc->aliases, na); - alpha_insert_alias(na); - return na; -} - /*************************************************************************/ /* Sets nc->display to newdisplay. If newdisplay is NULL, it will change * it to the first alias in the list. */ -static void change_core_display(NickCore * nc, char *newdisplay) +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; @@ -2691,1765 +1879,6 @@ static int do_setmodes(User * u) return MOD_CONT; } -/*************************************************************************/ - -static int do_logout(User * u) -{ - char *nick = strtok(NULL, " "); - char *param = strtok(NULL, " "); - User *u2; - - if (!is_services_admin(u) && nick) { - syntax_error(s_NickServ, u, "LOGOUT", NICK_LOGOUT_SYNTAX); - } else if (!(u2 = (nick ? finduser(nick) : u))) { - notice_lang(s_NickServ, u, NICK_X_NOT_IN_USE, nick); - } else if (!u2->na) { - if (nick) - notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, nick); - else - notice_lang(s_NickServ, u, NICK_NOT_REGISTERED); - } else if (u2->na->status & NS_VERBOTEN) { - notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, u2->na->nick); - } else if (!nick && !nick_identified(u)) { - notice_lang(s_NickServ, u, NICK_IDENTIFY_REQUIRED, s_NickServ); - } else if (nick && is_services_admin(u2)) { - notice_lang(s_NickServ, u, NICK_LOGOUT_SERVICESADMIN, nick); - } else { - if (nick && param && !stricmp(param, "REVALIDATE")) { - cancel_user(u2); - validate_user(u2); - } else { - u2->na->status &= ~(NS_IDENTIFIED | NS_RECOGNIZED); - } - - 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 {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; -time_t DefContimer; -void runDefCon(void); void resetDefCon(int level); + +time_t DefContimer; +int DefConModesSet = 0; +void runDefCon(void); +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); + + modules_core_init(OperServCoreNumber, OperServCoreModules); - /* 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 #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 **/ @@ -5042,6 +1631,38 @@ int checkDefCon(int level) return DefCon[DefConLevel] & level; } +/** + * Automaticaly re-set the DefCon level if the time limit has expired. + **/ +void resetDefCon(int level) +{ + char strLevel[5]; + snprintf(strLevel, 4, "%d", level); + if (DefConLevel != level) { + if ((DefContimer) + && (time(NULL) - DefContimer >= dotime(DefConTimeOut))) { + DefConLevel = level; + send_event(EVENT_DEFCON_LEVEL, 1, strLevel); + alog("Defcon level timeout, returning to lvl %d", level); + anope_cmd_global(s_OperServ, + getstring2(NULL, OPER_DEFCON_WALL), + s_OperServ, level); + if (GlobalOnDefcon) { + if (DefConOffMessage) { + oper_global(NULL, "%s", DefConOffMessage); + } else { + oper_global(NULL, getstring(NULL, DEFCON_GLOBAL), + DefConLevel); + } + } + if (GlobalOnDefconMore && !DefConOffMessage) { + oper_global(NULL, "%s", DefconMessage); + } + runDefCon(); + } + } +} + /** * Run DefCon level specific Functions. **/ @@ -5070,287 +1691,29 @@ void runDefCon(void) } /** - * Automaticaly re-set the DefCon level if the time limit has expired. + * Reverse the mode string, used for remove DEFCON chan modes. **/ -void resetDefCon(int level) +char *defconReverseModes(const char *modes) { - if (DefConLevel != level) { - if ((DefContimer) - && (time(NULL) - DefContimer >= dotime(DefConTimeOut))) { - DefConLevel = level; - send_event(EVENT_DEFCON_LEVEL, "%d", DefConLevel); - alog("Defcon level timeout, returning to lvl %d", level); - anope_cmd_global(s_OperServ, - getstring2(NULL, OPER_DEFCON_WALL), - s_OperServ, level); - if (GlobalOnDefcon) { - if (DefConOffMessage) { - oper_global(NULL, "%s", DefConOffMessage); - } else { - oper_global(NULL, getstring(NULL, DEFCON_GLOBAL), - DefConLevel); - } - } - if (GlobalOnDefconMore && !DefConOffMessage) { - oper_global(NULL, "%s", DefconMessage); - } - runDefCon(); - } + 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; } -/** - * Send a message to the oper about which precautions are "active" for this level - **/ -static void defcon_sendlvls(User * u) -{ - if (checkDefCon(DEFCON_NO_NEW_CHANNELS)) { - notice_lang(s_OperServ, u, OPER_HELP_DEFCON_NO_NEW_CHANNELS); - } - if (checkDefCon(DEFCON_NO_NEW_NICKS)) { - notice_lang(s_OperServ, u, OPER_HELP_DEFCON_NO_NEW_NICKS); - } - if (checkDefCon(DEFCON_NO_MLOCK_CHANGE)) { - notice_lang(s_OperServ, u, OPER_HELP_DEFCON_NO_MLOCK_CHANGE); - } - if (checkDefCon(DEFCON_FORCE_CHAN_MODES) && (DefConChanModes)) { - notice_lang(s_OperServ, u, OPER_HELP_DEFCON_FORCE_CHAN_MODES, - DefConChanModes); - } - if (checkDefCon(DEFCON_REDUCE_SESSION)) { - notice_lang(s_OperServ, u, OPER_HELP_DEFCON_REDUCE_SESSION, - DefConSessionLimit); - } - if (checkDefCon(DEFCON_NO_NEW_CLIENTS)) { - notice_lang(s_OperServ, u, OPER_HELP_DEFCON_NO_NEW_CLIENTS); - } - if (checkDefCon(DEFCON_OPER_ONLY)) { - notice_lang(s_OperServ, u, OPER_HELP_DEFCON_OPER_ONLY); - } - if (checkDefCon(DEFCON_SILENT_OPER_ONLY)) { - notice_lang(s_OperServ, u, OPER_HELP_DEFCON_SILENT_OPER_ONLY); - } - if (checkDefCon(DEFCON_AKILL_NEW_CLIENTS)) { - notice_lang(s_OperServ, u, OPER_HELP_DEFCON_AKILL_NEW_CLIENTS); - } - if (checkDefCon(DEFCON_NO_NEW_MEMOS)) { - notice_lang(s_OperServ, u, OPER_HELP_DEFCON_NO_NEW_MEMOS); - } -} - -/** - * ChanKill - Akill an entire channel (got botnet?) - * - * /msg OperServ ChanKill +expire #channel reason - * - **/ - -static int do_chankill(User * u) -{ - char *expiry, *channel, *reason; - time_t expires; - char breason[BUFSIZE]; - char mask[USERMAX + HOSTMAX + 2]; - struct c_userlist *cu, *next; - Channel *c; - - channel = strtok(NULL, " "); - if (channel && *channel == '+') { - expiry = channel; - channel = strtok(NULL, " "); - } else { - expiry = NULL; - } - - expires = expiry ? dotime(expiry) : ChankillExpiry; - if (expiry && isdigit(expiry[strlen(expiry) - 1])) - expires *= 86400; - if (expires != 0 && expires < 60) { - notice_lang(s_OperServ, u, BAD_EXPIRY_TIME); - return MOD_CONT; - } else if (expires > 0) { - expires += time(NULL); - } - - if (channel && (reason = strtok(NULL, ""))) { - - if (AddAkiller) { - snprintf(breason, sizeof(breason), "[%s] %s", u->nick, reason); - reason = sstrdup(breason); - } - - if ((c = findchan(channel))) { - for (cu = c->users; cu; cu = next) { - next = cu->next; - if (is_oper(cu->user)) { - continue; - } - strncpy(mask, "*@", 3); /* Use *@" for the akill's, */ - strncat(mask, cu->user->host, HOSTMAX); - add_akill(NULL, mask, s_OperServ, expires, reason); - check_akill(cu->user->nick, cu->user->username, - cu->user->host, NULL, NULL); - } - if (WallOSAkill) { - 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; -} - -#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 (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) -{ - char *file; - struct tm tm; - char timebuf[64]; - Module *m; - int idx = 0; - int display = 0; - - file = strtok(NULL, ""); - if (!file) { - syntax_error(s_OperServ, u, "MODINFO", OPER_MODULE_INFO_SYNTAX); - return MOD_CONT; - } - m = findModule(file); - if (m) { - tm = *localtime(&m->time); - strftime_lang(timebuf, sizeof(timebuf), u, - STRFTIME_DATE_TIME_FORMAT, &tm); - notice_lang(s_OperServ, u, OPER_MODULE_INFO_LIST, m->name, - m->version ? m->version : "?", - m->author ? m->author : "?", timebuf); - for (idx = 0; idx < MAX_CMD_HASH; idx++) { - display += showModuleCmdLoaded(HOSTSERV[idx], m->name, u); - display += showModuleCmdLoaded(OPERSERV[idx], m->name, u); - display += showModuleCmdLoaded(NICKSERV[idx], m->name, u); - display += showModuleCmdLoaded(CHANSERV[idx], m->name, u); - display += showModuleCmdLoaded(BOTSERV[idx], m->name, u); - display += showModuleCmdLoaded(MEMOSERV[idx], m->name, u); - display += showModuleCmdLoaded(HELPSERV[idx], m->name, u); - display += showModuleMsgLoaded(IRCD[idx], m->name, u); - - } - } - if (display == 0) { - notice_lang(s_OperServ, u, OPER_MODULE_NO_INFO, file); - } - return MOD_CONT; -} - -static int showModuleCmdLoaded(CommandHash * cmdList, char *mod_name, - User * u) -{ - Command *c; - CommandHash *current; - int display = 0; - - for (current = cmdList; current; current = current->next) { - for (c = current->c; c; c = c->next) { - if ((c->mod_name) && (stricmp(c->mod_name, mod_name) == 0)) { - notice_lang(s_OperServ, u, OPER_MODULE_CMD_LIST, - c->service, c->name); - display++; - } - } - } - return display; -} - -static int showModuleMsgLoaded(MessageHash * msgList, char *mod_name, - User * u) -{ - Message *msg; - MessageHash *mcurrent; - int display = 0; - for (mcurrent = msgList; mcurrent; mcurrent = mcurrent->next) { - for (msg = mcurrent->m; msg; msg = msg->next) { - if ((msg->mod_name) && (stricmp(msg->mod_name, mod_name) == 0)) { - notice_lang(s_OperServ, u, OPER_MODULE_MSG_LIST, - msg->name); - display++; - } - } - } - return display; -} - -#endif /*************************************************************************/ diff --git a/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 similarity index 79% rename from src/bahamut.c rename to 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 (!buf) { + return; + } - if (fmt) { - va_start(args, fmt); - vsnprintf(buf, BUFSIZE - 1, fmt, args); - va_end(args); - - 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 */ -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 similarity index 76% rename from src/dreamforge.c rename to 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) -{ - anope_cmd_mode(nick, chan, "%s %s %s", ircd->botchanumode, nick, nick); -} - /* SERVER name hop descript */ -void anope_cmd_server(char *servname, int hop, char *descript) +void dreamforge_cmd_server(char *servname, int hop, char *descript) { send_cmd(NULL, "SERVER %s %d :%s", servname, hop, descript); } -/* GLOBOPS */ -void anope_cmd_global(char *source, const char *fmt, ...) +void dreamforge_cmd_connect(int servernum) { - va_list args; - char buf[BUFSIZE]; - *buf = '\0'; + me_server = + new_server(NULL, ServerName, ServerDesc, SERVER_ISME, NULL); - if (fmt) { - va_start(args, fmt); - vsnprintf(buf, BUFSIZE - 1, fmt, args); - va_end(args); - } + dreamforge_cmd_capab(); + if (servernum == 1) + dreamforge_cmd_pass(RemotePassword); + if (servernum == 2) + dreamforge_cmd_pass(RemotePassword2); + if (servernum == 3) + dreamforge_cmd_pass(RemotePassword3); + dreamforge_cmd_server(ServerName, 1, ServerDesc); +} + +void dreamforge_cmd_bot_chan_mode(char *nick, char *chan) +{ + anope_cmd_mode(nick, chan, "%s %s %s", ircd->botchanumode, nick, nick); +} + + + +/* GLOBOPS */ +void dreamforge_cmd_global(char *source, char *buf) +{ if (!buf) { return; } @@ -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 */ -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 similarity index 79% rename from src/hybrid.c rename to 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); -void anope_cmd_bot_nick(char *nick, char *user, char *host, char *real, - char *modes) + if (servernum == 1) + hybrid_cmd_pass(RemotePassword); + else if (servernum == 2) + hybrid_cmd_pass(RemotePassword2); + else if (servernum == 3) + hybrid_cmd_pass(RemotePassword3); + + hybrid_cmd_capab(); + hybrid_cmd_server(ServerName, 1, ServerDesc); + hybrid_cmd_svinfo(); +} + +void hybrid_cmd_svsinfo() +{ + /* not used */ +} + + + +void hybrid_cmd_bot_nick(char *nick, char *user, char *host, char *real, + char *modes) { EnforceQlinedNick(nick, s_BotServ); send_cmd(NULL, "NICK %s 1 %ld %s %s %s %s :%s", nick, @@ -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 */ -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