1
0
mirror of https://github.com/anope/anope.git synced 2026-06-25 04:56:39 +02:00

Compare commits

..

61 Commits

Author SHA1 Message Date
Adam b382c27bb0 Anope 1.9.3-p1 Release 2011-05-16 03:08:48 -04:00
Adam 9f9e83c65c Updated Changes 2011-05-16 03:08:39 -04:00
Adam 4ab0bd3a8e Fixed a crash when certain nicks expired 2011-04-25 22:44:33 -04:00
Adam 68b1abc6f7 Fixed botserv kicker logic 2011-04-16 04:37:57 -04:00
Adam 86ff426642 Fixed caps kicker
(cherry picked from commit efe5fedde9)
2011-04-15 19:52:05 -04:00
Adam 1aa0905241 Fixed disabling channel levels
(cherry picked from commit bd62c4891e)
2011-04-09 20:54:00 -04:00
Adam 255d76ccc1 Fixed bug #1261 2011-04-05 19:10:42 -04:00
DukePyrolator d0746ae8d6 removed a merge conflict in example.conf 2011-03-26 18:11:15 +01:00
Adam dbc19768b1 Fixed ns_release with a password 2011-03-12 03:31:13 -05:00
Adam 8d64d91742 Fixed /bs badword del to show what word was deleted 2011-03-05 18:21:20 -05:00
Adam ed4c5e1457 Fixed os_sqline del 2011-02-27 23:53:56 -05:00
Adam fdcb7e56ae Don't burst SXLines when we link because its unnecessary and fixed applying SQLines 2011-02-27 22:12:51 -05:00
Adam 0d1a0e8db9 Fixed tracking umodes on bahamut and fjoins on inspircd11 2011-02-25 21:56:00 -05:00
Adam b9fb2f8e63 Fixed session exception limit of 0 to mean unlimited
(cherry picked from commit 28d17a40ce)
2011-02-25 21:55:23 -05:00
Adam 1a1665ba56 Update SQL when a nick is deleted 2011-02-17 15:27:30 -05:00
Adam 634e9af9cb Fixed expiring session exceptions 2011-02-09 21:55:11 -05:00
Adam b6ab031fc1 Update the language strings too... 2011-02-09 13:29:22 -05:00
Adam ebe0ce6610 Fixed a compiler warning in os_news 2011-02-06 20:49:36 -05:00
Adam b2e52553a7 Merge 83556667fd 2011-02-04 22:10:39 -05:00
Adam 032c30dd5d Fixed /ms set limit none and made db_plain care less about convert exceptions 2011-02-04 12:37:01 -05:00
Charles Kingsley fb0f7649b4 Merge of 9704ccc8a62f...c362a1e077d5 2011-01-29 14:16:09 -05:00
Adam 92fb9844ec Fixed setting usermode +k on our clients on InspIRCd 2.0 2011-01-28 13:21:24 -05:00
lethality d8b92f1c70 Bug #1237 - only set umode +h on a user joining help chan if they have op access 2011-01-28 00:44:30 +00:00
Adam b354d4d1ab nickcore:language is a string now, not an int 2011-01-24 19:04:27 -05:00
Adam 81d8858e56 Fixed some SQL queries 2011-01-24 17:52:33 -05:00
Adam d7206c8f38 Fixed db upgrade loading forbidden nicks 2011-01-24 01:08:28 -05:00
Adam 7c30d223fb Bug #1234 - Fix reading resolv.conf if it has multiple spaces or tabs
(cherry picked from commit a162f1d18e)
2011-01-21 23:03:27 -05:00
Adam 0db220812f Bug #1232 - Fixed db-convert to properly convert mode lock parameters
(cherry picked from commit e7a8bcc30b)
2011-01-18 19:28:34 -05:00
Adam a2f5edf977 Fixed /ns confirm's log message to show the nick of who was confirmed
(cherry picked from commit 1b6aab0cd7)

Conflicts:

	modules/core/ns_register.cpp
2011-01-15 16:31:46 -05:00
Adam 2631eb2e48 Made CA_SET always be accessable, even if db-converter messes up levels
(cherry picked from commit a4ded88e85)
2011-01-15 16:29:37 -05:00
lethality 49970524c8 Fix CODINGs formatting and a missed typo 2011-01-14 04:37:32 +00:00
Adam 11a144ad61 Bug #1230 - Fixed unknown CTCPs from crashing services
(cherry picked from commit e490202a1b)
2011-01-11 22:20:36 -05:00
Adam 1bdadde68a Fixed CanAdd() to use safe iteration and make SNLine::Check really work 2011-01-09 13:37:12 -05:00
DukePyrolator 39d34f7174 fixed a small bug in the ratbox protocol module
(cherry picked from commit 2e7d08c10b)
2011-01-08 03:41:12 -05:00
Adam c7979d98fa Fixed restoring topics on perm channels 2010-12-30 01:11:35 -05:00
Adam 58c2f0c409 Fixed creating permanent channels on burst that have no botserv bot on IRCds without a perm channel mode 2010-12-29 23:24:44 -05:00
Adam 851c0a990e Bug #1225 - Made REGISTER show in /cs help 2010-12-28 16:39:41 -05:00
Adam c68933e547 Fixed build on debian lenny 2010-12-27 15:31:34 -05:00
Adam e9f84a0db9 Load session exceptions on start when using SQL
(cherry picked from commit a1c635b050)
2010-12-27 01:35:40 -05:00
Adam 87141253a1 Bug #1222 - Fixed crash from reading to read a range of memos 2010-12-27 01:03:13 -05:00
Adam 0c686e7168 Bug #1220 - Fixed an event in /hs activate and /ms del
(cherry picked from commit 49dd1c3409)
2010-12-27 01:02:18 -05:00
Adam b5091a373e Bug #1219 - Correctly restrict people from registering potentential guest names
(cherry picked from commit 8af2465a61)
2010-12-26 00:31:50 -05:00
Adam 8e898c2e3e Fixed a potential crash from dropping nicks
(cherry picked from commit 1b3f2567bc)
2010-12-26 00:31:41 -05:00
Adam 821995bf60 Properly remove commands from bots when they are destructed, and run privmsgs for bots we know of but aren't the core 2010-12-25 02:26:00 -05:00
Adam 673f6cb2f9 Merge branch '1.9.3-p1' of git.sigterm.info:anope/anope into 1.9.3-p1 2010-12-25 01:19:29 -05:00
Adam 852ed51ed7 Fixed bug #1217 again... works better now 2010-12-25 01:19:02 -05:00
Adam 5144b63a3a Bump version.sh to -p1 2010-12-24 23:04:44 -05:00
Adam 0f63790b4c Bug #1215 - Fixed crash when /cs set mlock is given an empty string 2010-12-24 20:16:42 -05:00
Adam 4f6232e628 Bug #1217 - Fix crash from deleting nonexistant users from XOP list 2010-12-24 20:15:28 -05:00
Adam 4e303566dc Bug #1216 - Do not apply SQLines on our own clients 2010-12-24 20:11:00 -05:00
Adam 4f7144e513 Made clearing SXLines remove the XLine from the IRCd too
(cherry picked from commit 86900175c8)
2010-12-24 20:09:49 -05:00
Adam c7a44bfd8e Fixed deleting expired SXLines 2010-12-24 20:07:59 -05:00
Adam 839fb4e5f0 Made SQLine clear work 2010-12-24 20:06:59 -05:00
Adam a2a6708f1a Allow hostmasks to be in uplink:host
(cherry picked from commit 18377ac9fd)
2010-12-24 20:06:25 -05:00
Adam faf1e3710e Fixed version.cpp to work ok if we are on a tag, and
prevent version.cpp from prepending version.sh's VERSION_EXTRA on every build
2010-12-24 20:05:52 -05:00
Adam e54cffd9b7 Don't send SXLines until after we start bursting with our uplink 2010-12-24 20:05:16 -05:00
Adam 75098739e6 NULL the core *serv pointers when core clients are deleted
(cherry picked from commit 7f9a5e01c6)
2010-12-24 20:04:37 -05:00
Adam 12d6e2ef3f Bug #1211 - Fixed loading and saving anope_os_sxlines 2010-12-24 20:04:25 -05:00
Adam 00ec71f81d Bug #1212 - Fixed some bad logic in /os exception preventing valid exceptions from being added 2010-12-24 20:03:33 -05:00
Adam 479fc1ce3f Handle not being able to completely flush our write buffer correctly 2010-12-24 20:02:25 -05:00
Adam 667419a460 Document that /cs owner and deowner allow nick args
(cherry picked from commit 5fe41fb8a0)
2010-12-24 20:00:17 -05:00
344 changed files with 76825 additions and 67581 deletions
+4 -6
View File
@@ -220,15 +220,11 @@ find_package(Gettext)
option(USE_RUN_CC_PL "Use run-cc.pl for building" OFF)
# Use the following directories as includes
# Note that it is important the binary include directory comes before the
# source include directory so the precompiled headers work correctly.
include_directories(${Anope_BINARY_DIR}/include ${Anope_SOURCE_DIR}/include ${Anope_BINARY_DIR}/language)
include_directories(${Anope_SOURCE_DIR}/include ${Anope_BINARY_DIR}/include ${Anope_BINARY_DIR}/lang)
# If using Windows, always add the _WIN32 define
if(WIN32)
add_definitions(-D_WIN32)
# And include the windows specific folder for our anope_windows.h
include_directories(${Anope_SOURCE_DIR}/src/win32)
endif(WIN32)
# If using Visual Studio, set the C++ flags accordingly
@@ -331,9 +327,11 @@ endif(CMAKE_BUILD_TYPE STREQUAL "DEBUG" OR CMAKE_BUILD_TYPE STREQUAL "RELWITHDEB
# Check for the existance of the following include files
check_include_file(sys/types.h HAVE_SYS_TYPES_H)
check_include_file(strings.h HAVE_STRINGS_H)
check_include_file(sys/select.h HAVE_SYS_SELECT_H)
check_include_file(sys/eventfd.h HAVE_SYS_EVENTFD_H)
# Check for the existance of the following functions
check_function_exists(gettimeofday HAVE_GETTIMEOFDAY)
check_function_exists(setgrent HAVE_SETGRENT)
check_function_exists(strcasecmp HAVE_STRCASECMP)
check_function_exists(stricmp HAVE_STRICMP)
@@ -451,7 +449,7 @@ endif(${Anope_SOURCE_DIR} STREQUAL ${Anope_BINARY_DIR})
# Go into the following directories and run their CMakeLists.txt as well
add_subdirectory(data)
add_subdirectory(docs)
add_subdirectory(language)
add_subdirectory(lang)
add_subdirectory(src)
add_subdirectory(modules)
add_subdirectory(include)
+1 -12
View File
@@ -2,7 +2,7 @@
#
# Configuration script for Services.
#
# Anope (c) 2003-2011 Anope team
# Anope (c) 2003-2010 Anope team
# Contact us at team@anope.org
#
# This program is free but copyrighted software; see the file COPYING for
@@ -153,17 +153,6 @@ done
###########################################################################
which cmake > /dev/null
if [ $? -ne 0 ] ; then
clear
echo "Anope requires CMake 2.4 or newer to be configured, which can"
echo "be downloaded at http://www.cmake.org/. If you have installed"
echo "CMake already, ensure it is in your PATH environment variable."
exit 0
fi
###########################################################################
if [ ! "$NO_INTRO" ] ; then
case `uname -s` in
MINGW*)
+1 -1
View File
@@ -20,7 +20,7 @@ endif(NOT WIN32)
# If we found everything we need set variables correctly for lang/CMakeLists.txt to use
if(GETTEXT_FOUND)
include_directories("${GETTEXT_INCLUDE}")
set(LIBINTL_INCLUDE "${GETTEXT_INCLUDE}/libintl.h")
set(GETTEXT_MSGFMT_EXECUTABLE ${GETTEXT_MSGFMT})
if(WIN32)
+211 -539
View File
File diff suppressed because it is too large Load Diff
+45 -37
View File
@@ -3,7 +3,7 @@
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Generation Time: Apr 28, 2011 at 07:08 PM
-- Generation Time: Oct 31, 2010 at 03:02 AM
-- Server version: 5.1.50
-- PHP Version: 5.3.3-pl1-gentoo
@@ -108,6 +108,10 @@ CREATE TABLE IF NOT EXISTS `anope_cs_info` (
`forbidby` text NOT NULL,
`forbidreason` text NOT NULL,
`bantype` smallint(6) NOT NULL DEFAULT '0',
`mlock_on` text NOT NULL,
`mlock_off` text NOT NULL,
`mlock_params` text NOT NULL,
`entry_message` text NOT NULL,
`memomax` smallint(5) unsigned NOT NULL DEFAULT '0',
`botnick` varchar(255) NOT NULL DEFAULT '',
`botflags` text NOT NULL,
@@ -147,23 +151,6 @@ CREATE TABLE IF NOT EXISTS `anope_cs_levels` (
-- --------------------------------------------------------
--
-- Table structure for table `anope_cs_mlock`
--
CREATE TABLE IF NOT EXISTS `anope_cs_mlock` (
`channel` varchar(255) NOT NULL,
`mode` varchar(127) NOT NULL,
`status` int(11) NOT NULL,
`setter` varchar(255) NOT NULL,
`created` int(11) NOT NULL,
`param` varchar(255) NOT NULL,
UNIQUE KEY `entry` (`channel`,`mode`,`status`,`setter`,`param`),
KEY `FK_anope_cs_mlock` (`channel`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Table structure for table `anope_cs_ttb`
--
@@ -283,7 +270,7 @@ CREATE TABLE IF NOT EXISTS `anope_ns_core` (
`email` text NOT NULL,
`greet` text NOT NULL,
`flags` text NOT NULL,
`language` varchar(5) NOT NULL DEFAULT '',
`language` smallint(5) unsigned NOT NULL DEFAULT '0',
`channelcount` smallint(5) unsigned NOT NULL DEFAULT '0',
`memomax` smallint(5) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`display`)
@@ -303,6 +290,21 @@ CREATE TABLE IF NOT EXISTS `anope_ns_core_metadata` (
-- --------------------------------------------------------
--
-- Table structure for table `anope_ns_request`
--
CREATE TABLE IF NOT EXISTS `anope_ns_request` (
`nick` varchar(255) NOT NULL DEFAULT '',
`passcode` text NOT NULL,
`password` text NOT NULL,
`email` text NOT NULL,
`requested` int(10) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`nick`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Table structure for table `anope_os_akills`
--
@@ -369,77 +371,83 @@ CREATE TABLE IF NOT EXISTS `anope_os_xlines` (
-- Constraints for table `anope_bs_badwords`
--
ALTER TABLE `anope_bs_badwords`
ADD CONSTRAINT `FK_anope_bs_badwords_channel` FOREIGN KEY (`channel`) REFERENCES `anope_cs_info` (`name`) ON DELETE CASCADE ON UPDATE CASCADE;
ADD CONSTRAINT `FK_anope_bs_badwords_channel` FOREIGN KEY (`channel`) REFERENCES `anope_cs_info` (`name`) ON DELETE CASCADE
ON UPDATE CASCADE;
--
-- Constraints for table `anope_bs_info_metadata`
--
ALTER TABLE `anope_bs_info_metadata`
ADD CONSTRAINT `FK_anope_bs_info_metadata_botname` FOREIGN KEY (`botname`) REFERENCES `anope_bs_core` (`nick`) ON DELETE CASCADE ON UPDATE CASCADE;
ADD CONSTRAINT `FK_anope_bs_info_metadata_botname` FOREIGN KEY (`botname`) REFERENCES `anope_bs_core` (`nick`) ON DELETE
CASCADE ON UPDATE CASCADE;
--
-- Constraints for table `anope_cs_access`
--
ALTER TABLE `anope_cs_access`
ADD CONSTRAINT `FK_anope_cs_access_channel` FOREIGN KEY (`channel`) REFERENCES `anope_cs_info` (`name`) ON DELETE CASCADE ON UPDATE CASCADE;
ADD CONSTRAINT `FK_anope_cs_access_channel` FOREIGN KEY (`channel`) REFERENCES `anope_cs_info` (`name`) ON DELETE CASCADE ON
UPDATE CASCADE;
--
-- Constraints for table `anope_cs_akick`
--
ALTER TABLE `anope_cs_akick`
ADD CONSTRAINT `FK_anope_cs_akick_channel` FOREIGN KEY (`channel`) REFERENCES `anope_cs_info` (`name`) ON DELETE CASCADE ON UPDATE CASCADE;
ADD CONSTRAINT `FK_anope_cs_akick_channel` FOREIGN KEY (`channel`) REFERENCES `anope_cs_info` (`name`) ON DELETE CASCADE ON
UPDATE CASCADE;
--
-- Constraints for table `anope_cs_info_metadata`
--
ALTER TABLE `anope_cs_info_metadata`
ADD CONSTRAINT `FK_anope_cs_info_metadata_channel` FOREIGN KEY (`channel`) REFERENCES `anope_cs_info` (`name`) ON DELETE CASCADE ON UPDATE CASCADE;
ADD CONSTRAINT `FK_anope_cs_info_metadata_channel` FOREIGN KEY (`channel`) REFERENCES `anope_cs_info` (`name`) ON DELETE
CASCADE ON UPDATE CASCADE;
--
-- Constraints for table `anope_cs_levels`
--
ALTER TABLE `anope_cs_levels`
ADD CONSTRAINT `FK_anope_cs_levels_channel` FOREIGN KEY (`channel`) REFERENCES `anope_cs_info` (`name`) ON DELETE CASCADE ON UPDATE CASCADE;
--
-- Constraints for table `anope_cs_mlock`
--
ALTER TABLE `anope_cs_mlock`
ADD CONSTRAINT `FK_anope_cs_mlock_channel` FOREIGN KEY (`channel`) REFERENCES `anope_cs_info` (`name`) ON DELETE CASCADE ON UPDATE CASCADE;
ADD CONSTRAINT `FK_anope_cs_levels_channel` FOREIGN KEY (`channel`) REFERENCES `anope_cs_info` (`name`) ON DELETE CASCADE ON
UPDATE CASCADE;
--
-- Constraints for table `anope_cs_ttb`
--
ALTER TABLE `anope_cs_ttb`
ADD CONSTRAINT `FK_anope_cs_ttb_channel` FOREIGN KEY (`channel`) REFERENCES `anope_cs_info` (`name`) ON DELETE CASCADE ON UPDATE CASCADE;
ADD CONSTRAINT `FK_anope_cs_ttb_channel` FOREIGN KEY (`channel`) REFERENCES `anope_cs_info` (`name`) ON DELETE CASCADE ON
UPDATE CASCADE;
--
-- Constraints for table `anope_hs_core`
--
ALTER TABLE `anope_hs_core`
ADD CONSTRAINT `FK_anope_hs_core_nick` FOREIGN KEY (`nick`) REFERENCES `anope_ns_alias` (`nick`) ON DELETE CASCADE ON UPDATE CASCADE;
ADD CONSTRAINT `FK_anope_hs_core_nick` FOREIGN KEY (`nick`) REFERENCES `anope_ns_alias` (`nick`) ON DELETE CASCADE ON UPDATE
CASCADE;
--
-- Constraints for table `anope_ms_info`
--
ALTER TABLE `anope_ms_info`
ADD CONSTRAINT `FK_anope_ms_info_receiver` FOREIGN KEY (`receiver`) REFERENCES `anope_ns_alias` (`nick`) ON DELETE CASCADE ON UPDATE CASCADE;
ADD CONSTRAINT `FK_anope_ms_info_receiver` FOREIGN KEY (`receiver`) REFERENCES `anope_ns_alias` (`nick`) ON DELETE CASCADE ON
UPDATE CASCADE;
--
-- Constraints for table `anope_ns_access`
--
ALTER TABLE `anope_ns_access`
ADD CONSTRAINT `FK_anope_ns_access_display` FOREIGN KEY (`display`) REFERENCES `anope_ns_core` (`display`) ON DELETE CASCADE ON UPDATE CASCADE;
ADD CONSTRAINT `FK_anope_ns_access_display` FOREIGN KEY (`display`) REFERENCES `anope_ns_core` (`display`) ON DELETE CASCADE
ON UPDATE CASCADE;
--
-- Constraints for table `anope_ns_alias`
--
ALTER TABLE `anope_ns_alias`
ADD CONSTRAINT `FK_anope_ns_alias_display` FOREIGN KEY (`display`) REFERENCES `anope_ns_core` (`display`) ON DELETE CASCADE ON UPDATE CASCADE;
ADD CONSTRAINT `FK_anope_ns_alias_display` FOREIGN KEY (`display`) REFERENCES `anope_ns_core` (`display`) ON DELETE CASCADE
ON UPDATE CASCADE;
--
-- Constraints for table `anope_ns_alias_metadata`
--
ALTER TABLE `anope_ns_alias_metadata`
ADD CONSTRAINT `FK_anope_ns_alias_metadata_nick` FOREIGN KEY (`nick`) REFERENCES `anope_ns_alias` (`nick`) ON DELETE CASCADE ON UPDATE CASCADE;
ADD CONSTRAINT `FK_anope_ns_alias_metadata_nick` FOREIGN KEY (`nick`) REFERENCES `anope_ns_alias` (`nick`) ON DELETE CASCADE
ON UPDATE CASCADE;
+18 -19
View File
@@ -1,23 +1,22 @@
Anope Version 1.9.4
Anope Version 1.9.3-p1
--------------------
A Automatically set channel founder to the user with the highest access if there is no successor
A /chanserv clone command to copy settings from one channel to another.
A /chanserv mode command
A Ability for users to delete their own access in channels
A Added support for Plexus 3
A Readded in support for /cs op/deop/etc to op/deop you in all channels
A Added LDAP support
A Added live SQL support
A Added support for learning tracking/storing/locking all modes at runtime
A Added m_alias
A Added support for XMLRPC queries
A Added /botserv set msg
A Added /operserv config
A Added /ns cert
A Added /operserv login
F Changed the GHOST command to not allow ghosting unidentified users if the RECOVER command exists
F Some failed logic in /operserv exception that prevents proper exceptions from being added
F Fixed the anope_os_sxlines MySQL table and code to work after restarting
F Fixed bad logic in /os exception preventing valid hosts from being added
F Fixed /os sqline clear
F Fixed not applying SQLines to our own clients
F Fixed crash from deleting nonexistant users on the XOP access lists
F Fixed crash when /cs set mlock is given an empty string
F Fixed a potential crash from expiring nicks
F Fixed build on Debian Lenny
F Fixed /bs badword del to show what word was deleted
F Fixed using /ns release with a password
F Fixed allowing setting a valid TTB with /bs kick repeat
F Fixed caps kicker
F Fixed many SQL issues
F Fixed reading resolv.conf if it has multiple spaces or tabs
F Fixed creating permanent channels on burst and setting their topics
F Fixed /cs register to show in HELP
F Fixed restricting people from registering guest nick names
F Fixed a potential crash from dropping nicks
Anope Version 1.9.3
--------------------
-22
View File
@@ -1,25 +1,3 @@
Anope Version 1.9.4
-------------------
** ADDED CONFIGURATION DIRECTIVES **
memoserv:modules added ms_ignore
chanserv:modules added cs_clone and cs_mode
nickserv:suspendexpire and nickserv:forbidexpire added
chanserv:suspendexpire and chanserv:forbidexpire added
module added cs_entrymsg
nickserv:modules added ns_ajoin, ns_cert
options:nomlock added
log:target added globops
nickserv:confirmemailchanges added
operserv:modules added os_config, os_login
** MODIFIED CONFIGURATION DIRECTIVES **
operserv:notifications removed osglobal, osmode, oskick, osakill, ossnline, ossqline, osszline, osnoop, osjupe, getpass, setpass, forbid, drop
renamed nickserv:preregexpire to nickserv:unconfirmedexpire
** DELETED CONFIGURATION DIRECTIVES **
opertype:commands removed operserv/umode
operserv:modules removed os_umode
Anope Version 1.9.3
------------------
** ADDED CONFIGURATION DIRECTIVES **
+4 -4
View File
@@ -183,16 +183,16 @@ Note: You should also read the README and FAQ files!
still running, and restart it if not.
First rename the example.chk script that is in Anope path (by default,
this is ~/services/data) to services.chk and edit it. You'll need to
modify the CONFIGURATION part of the file. Then ensure that the file is
marked as executable by typing chmod +x services.chk, and try to launch the
this is ~/services) to services.chk and edit it. You'll need to modify
the CONFIGURATION part of the file. Then ensure that the file is marked
as executable by typing chmod +x services.chk, and try to launch the
script to see if it works (Anope must not be running when you do this ;))
When this is done, you'll have to add the crontab entry. Type crontab -e.
This will open the default text editor with the crontab file. Enter the
following (with correct path):
*/5 * * * * /home/ircd/services/data/services.chk >/dev/null 2>&1
*/5 * * * * /home/ircd/services/services.chk >/dev/null 2>&1
The */5 at the beginning means "check every 5 minutes". You may replace
the 5 with other another number if you want (but less than 60). Consult
+77 -8
View File
@@ -106,10 +106,18 @@ How To Add IRCd Support
23) TS6: Does the IRCd support TS6? Use 1 for yes, 0 for no.
24) Global TLD Prefix: Prefix used to send global messages, should probably
24) Channel CIDR: Set to 1 if channel bans, excepts and invites
support CIDR masks. Expected syntax: *!*@ip/mask.
When set to 1, anope will only parse strict CIDR masks.
IRCd's that try to correct invalid CIDR's (like nefarious)
will need a custom implementation in the core.
Contact the anope Dev Team if this is the case.
Set to 0 if CIDR's are not supported by your IRCd.
25) Global TLD Prefix: Prefix used to send global messages, should probably
be "$"
25) Max Modes: The max number of mode changes we can send in one line
26) Max Modes: The max number of mode changes we can send in one line
3) Modes
@@ -147,6 +155,12 @@ How To Add IRCd Support
ModeManager::AddChannelMode(new ChannelModeOper('O'));
The CMODE_FLOOD param also has its own class, but due to the wide range of
valid parameters accepted across IRCds, your protocol module MUST have the
IsValid function for this.
bool ChannelModeFlood::IsValid(const Anope::string &value) { }
4) Functions and Events
A brief word about functions and events. All events are captured by creating a Message struct
@@ -169,19 +183,74 @@ How To Add IRCd Support
5) CAPAB/PROTOCTL
Most IRCDs send a CAPAB or PROTOCTL line so that they can work out what
the other end of the connection is capable of doing. The protocol module should
handle all of these without the cores knowledge with the exception of the following:
Most IRCD send a CAPAB or PROTOCTL line so that they can work out what
the other end of the connection is capable of doing. Anope has a function
to read these lines and set itself up to to handle these events better.
When adding support for your ircd, take the following steps.
1) In the module constructor you must tell Anope what the uplink is capable of that
isn't already passed in the CAPAB/PROTOCTL, you do this by something similar to:
CapabType c[] = { CAPAB_NOQUIT, CAPAB_NICKIP, CAPAB_ZIP, CAPAB_TOKEN, CAPAB_SSJ3, CAPAB_NICK2, CAPAB_VL, CAPAB_TLKEXT, CAPAB_CHANMODE, CAPAB_SJB64, CAPAB_NICKCHARS };
for (unsigned i = 0; i < 11; ++i)
Capab.SetFlag(c[i]);
Anything else given to Anope in the CAPAB/PROTOCTL message will be handled later by CapabParse.
The available CAPAB options are:
--------------------------------------------------------------------------
Define | Description
----------------|---------------------------------------------------------
----------------|------------|-----------|--------------------------------
CAPAB_NOQUIT | NOQUIT protocol support
CAPAB_TSMODE | Chanmodes are timestamped
CAPAB_UNCONNECT | UNCONNECT protocol support
CAPAB_QS | Quitstorm - same as NOQUIT
CAPAB_NICKIP | IP sent in the NICK line
CAPAB_NSJOIN | Smart SJOIN support
CAPAB_ZIP | Support for gzipped links
CAPAB_BURST | Supports BURST command
CAPAB_TS3 | Support for TS3 protocol
CAPAB_TS5 | Support for TS5 protocol
CAPAB_DKEY | DH-Key exchange using DKEY
CAPAB_DOZIP | Link traffic will be gzipped
CAPAB_DODKEY | Do DKEY with this link
CAPAB_QS | Supports quit storm removal
CAPAB_SCS | String Cache System support
CAPAB_PT4 | Support for PT4 protocol
CAPAB_UID | Support for UIDs
CAPAB_KNOCK | Supports KNOCK
CAPAB_CLIENT | Supports CLIENT
CAPAB_IPV6 | Support for IPv6 addresses
CAPAB_SSJ5 | Smart Join protocol 5 support
CAPAB_SN2 | Support for SN2 protocol
CAPAB_VHOST | Supports VHOST protocol
CAPAB_TOKEN | Supports s2s tokens
CAPAB_SSJ3 | Smart Join protocol 3 support
CAPAB_NICK2 | Support for extended NICK (v2)
CAPAB_UMODE2 | Supports UMODE2 command
CAPAB_VL | VLine information in info field
CAPAB_TLKEXT | Not 8, but 10 params in TKL's
CAPAB_CHANMODE | Channel modes are passed here
CAPAB_SJB64 | SJOIN timestamps are base64 encoded
CAPAB_NICKCHARS | Character set used by the IRCD for nicks
You can override the default OnCapab method in IRCdMessage if required.
2) Ensure that the CAPAB/PROTOCTL event his handled correctly.
A) In the function module constructor make sure that you have the
following two lines:
Message message_capab("CAPAB", event_capab);
B) Add the function to handle the event
bool event_capab(const Anope::string &source, const std::vector<Anope::string> &params)
{
CapabParse(params);
return true;
}
This function should call the CapabParse function which parses
the received CAPAB/PROTOCTL line.
6) IRCDProto Class
+1
View File
@@ -200,6 +200,7 @@ Table of Contents
* Ratbox 2.0.6 or later
* UnrealIRCd 3.2 or later
* Plexus 3 or later
* ngIRCd 17.1 or later
Anope could also work with some of the daemons derived by the ones listed
above, but there's no support for them if they work or don't work.
+30 -17
View File
@@ -3,43 +3,56 @@ Legend:
? = unsure
+ = in progress
1.9.4
1.9.3
-----
[x] MS IGNORE. Make it take nick (accounts) or n!u@h masks. Fake success of memo send still, but send to opers?
[x] Allow users to delete their own access
[x] ChanServ CLONE command
[x] XMLRPC to execute commands and get data from Anope
[+] fantasy: allow replies/notifications to fantasy commands to go to the channel via notice
[x] Method to store listmodes (more generically than AKICK, too) for e.g. +beI and extbans, etc.
[ ] understanding extbans for /cs unban etc.
[ ] (optional?) A way to confirm email changes by users
[ ] Auto identify through SSL key
[ ] Optional os_login system that can also use SSL keys.
[ ] os_info module to show useful configuration settings to services opers.
[ ] Remove nick requests. Instead use an unconfirmed nick group which cant recieve umode +r and auto expires after 1d?
[ ] LDAP
[x] Add in a subcommand system, ns_set, cs_set, etc.
[x] Threading
[x] Mail sending needs to be threaded
[x] process_numlist needs to die
[x] SList needs to die
[x] SSL
[x] Command handling system needs to die, strtok() needs to die more
[x] Asynchronous DNS
[x] Hashing system for storing just about everything needs to die
[x] Add support for +k, +q, etc type umodes
[x] Language system is disgusting, it must die.
[x] Modules should also have a way to add strings programatically
[x] Should be able to add many strings by dropping a file in a set location.
[x] Config bailing on /os reload needs to be non fatal
[x] AutoID needs to be able to live through /os restart, current system is just annoying.
[x] SQL tables need to changed to have references etc
[x] Merge NS INFO blah ALL with NS INFO blah, if you're requesting info, you really want the info anyway.
[x] More "friendly" date displays of some things like registration time ("November 7th 2006 (2 years, 0 months, 0 days ago)")
[?] Remote identification
[x] Move a (lot) of stuff to class members as a defined interface rather than copypasta everywhere (ns_set, ns_saset!)
[x] Store vhosts in SQL.
Future
------
[+] Method to store listmodes (more generically than AKICK, too) for e.g. +beI and extbans, etc.
[ ] XMLRPC to execute commands and get data from Anope
[ ] NS IDENTIFY changes
[?] Last failed identify? Maybe more useful for sopers only, so users don't get unnecessarily worried
[?] Last successful login time/ip? perhaps both of these should be a new nick setting
[ ] NS INFO: seperate field for last seen realhost, shown to SRA only
[ ] NS SUSPEND: show suspender and reason, probably to sopers only (see CS SUSPEND)
[ ] MS IGNORE. Make it take nick (accounts) or n!u@h masks. Fake success of memo send still, but send to opers?
[ ] Allow channel founders to change the fantasy trigger for their channel.
[ ] CIDR Akills, session exceptions, etc
[?] Language charset stuff, including collation (1.9.1? phoenix?)
[ ] Language charset stuff, including collation (1.9.1? phoenix?)
[ ] fantasy: allow replies/notifications to fantasy commands to go to the channel via notice
[?] a way for a module to queue itself (or even another module) for unloading
[ ] Useful/common "third party" modules to core distro
[ ] NS AJOIN
[x] CS ENTRYMSG
[ ] CS ENTRYMSG
[?] Don't allow soper accounts to expire
[?] Reason for CS SET RESTRICTED
[x] AKILL/SGLINE/etc..
[x] Setter
[x] Time added
[+] Time modified (can they be modified?)
[x] Time until expiry/expiry time (YES, time until expiry *instead of* expiry time, more human)
[ ] Time until expiry/expiry time (YES, time until expiry *instead of* expiry time, more human)
[x] Reason
[ ] Unique IDs on each AKILL/blah so that networks may use them as ticket IDs
[ ] HS ACTIVATE -ALL (rob sez this all needs reviewing)
[?] Drop CS SET ENTRYMSG, replace with a 'news' type system? (limited to a configured number of items, default 3)
+1 -1
View File
@@ -104,7 +104,7 @@ Anope for Windows
Building Anope with gettext requires libintl, libiconv, libgcc and
libmingex. We have precompiled these libraries for you that you may
use if you want. They are avaiable at http://anope.org/downloads/anope-extra.zip
The OpenSSL, MySQL, and OpenLDAP header files and libraries are also included in
The OpenSSL and MySQL header files and libraries are also included in
this package. Once downloaded and extracted, you should run install.bat
then give Config the path to the new 'installed' directory.
-26
View File
@@ -1,26 +0,0 @@
Starting with Anope 1.9.4 XMLRPC using PHP's xmlrpc_encode_request and xmlrpc_decode functions is supported.
This allows external applications, such as websites, to execute remote procedure calls to Anope in real time.
Currently there are 5 supported XMLRPC calls, provided by m_xmlrpc_main:
checkAuthetication - Takes two parameters, an account name and a password. Checks if the account name is valid and the password
is correct for the account name, useful for making login pages on websites.
command - Takes three parameters, a service name (BotServ, ChanServ, NickServ), a user name (whether online or not), and the command
to execute. This will execute a the given command to Anope using the given service name. If the user given is online, the
command reply will go to them, if not it is returned by XMLRPC.
stats - Takes no parameters, returns miscellaneous stats that can be found in the /operserv stats command.
channel - Takes one parameter, a channel name, and returns real time information regarding that channel, such as users, modes
(ban lists and such), topic etc.
user - Takes one parameter, a user name, and returns real time information regarding that user.
XMLRPC was designed to be used with db_mysql, and will not return any information that can be pulled from the SQL
database, such as accounts and registered channel information. It is instead used for pulling realtime data such
as users and channels currently onlive. For examples on how to use these calls in PHP, see xmlrpc.php in docs/XMLRPC.
Also note that the parameter named "id" is reserved for query ID. If you pass a query to Anope containing a value for id. it will
be stored by Anope and the same id will be passed back in the result.
-101
View File
@@ -1,101 +0,0 @@
<?php
/* XMLRPC Functions
*
* (C) 2003-2011 Anope Team
* Contact us at team@anope.org
*
*/
class AnopeXMLRPC
{
private $Host, $Bind, $Port;
private $Socket;
function __construct($Host, $Port, $Bind = NULL)
{
$this->Host = $Host;
$this->Port = $Port;
$this->Bind = $Bind;
$this->Socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($Bind && socket_bind($this->Socket, $this->Bind) == false)
$his->Socket = false;
if (socket_connect($this->Socket, $this->Host, $this->Port) == false)
$this->Socket = false;
}
function __destruct()
{
@socket_close($this->Socket);
}
/** Run an XMLRPC command. Name should be a query name and params an array of parameters, eg:
* $this->RunXMLRPC("checkAuthentication", array("adam", "qwerty"));
* If successful returns back an array of useful information.
*
* Note that $params["id"] is reserved for query ID, you may set it to something if you wish.
* If you do, the same ID will be passed back with the reply from Anope.
*/
function RunXMLRPC($name, $params)
{
$xmlquery = xmlrpc_encode_request($name, $params);
socket_write($this->Socket, $xmlquery);
$inbuf = socket_read($this->Socket, 4096);
$inbuf = substr($inbuf, strpos($inbuf, "\r\n\r\n") + 4);
$response = xmlrpc_decode($inbuf);
if (isset($response[0]))
return $response[0];
return NULL;
}
/** Do Command on Service as User, eg:
* $anope->DoCommand("ChanServ", "Adam", "REGISTER #adam");
* Returns an array of information regarding the command execution, if
* If 'online' is set to yes, then the reply to the command was sent to the user on IRC.
* If 'online' is set to no, then the reply to the command is in the array member 'return'
*/
function DoCommand($Service, $User, $Command)
{
return $this->RunXMLRPC("command", array($Service, $User, $Command));
}
/** Check an account/nick name and password to see if they are valid
* Returns the account display name if valid
*/
function CheckAuthentication($Account, $Pass)
{
$ret = $this->RunXMLRPC("checkAuthentication", array($Account, $Pass));
if ($ret && $ret["result"] == "Success")
return $ret["account"];
return NULL;
}
/* Returns an array of misc stats regarding Anope
*/
function DoStats()
{
return $this->RunXMLRPC("stats", NULL);
}
/* Look up data for a channel
* Returns an array containing channel information, or an array of size one
* (just containing the name) if the channel does not exist
*/
function DoChannel($Channel)
{
return $this->RunXMLRPC("channel", NULL);
}
/* Like DoChannel(), but different.
*/
function DoUser($User)
{
return $this->RunXMLRPC("user", array($User));
}
}
?>
+1 -28
View File
@@ -16,32 +16,5 @@ if(NOT WIN32)
add_to_cpack_ignored_files("version.h$" TRUE)
endif(NOT WIN32)
set(PCH_SOURCES_GCH "")
if(CMAKE_COMPILER_IS_GNUCXX)
string(REPLACE " " ";" PCH_CXXFLAGS ${CXXFLAGS})
file(GLOB INCLUDE_SRCS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.h")
remove_item_from_list(INCLUDE_SRCS "version.h")
set(PCH_SOURCES "module.h;modules.h;services.h")
foreach(PCH_SOURCE ${PCH_SOURCES})
set(PCH_EXTRAFLAGS "")
if(DEBUG_BUILD)
set(PCH_EXTRAFLAGS "-g")
endif(DEBUG_BUILD)
if(PCH_SOURCE STREQUAL "module.h")
set(PCH_EXTRAFLAGS ${PCH_EXTRAFLAGS} -fPIC)
endif(PCH_SOURCE STREQUAL "module.h")
if(GETTEXT_INCLUDE)
set(PCH_GETTEXT_INCLUDE "-I${GETTEXT_INCLUDE}")
endif(GETTEXT_INCLUDE)
set(PCH_SOURCES_GCH "${PCH_SOURCES_GCH};${CMAKE_CURRENT_BINARY_DIR}/${PCH_SOURCE}.gch")
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${PCH_SOURCE}.gch
COMMAND ${CMAKE_CXX_COMPILER} ARGS ${PCH_CXXFLAGS} ${PCH_EXTRAFLAGS} ${PCH_GETTEXT_INCLUDE} -I${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/${PCH_SOURCE} -o ${CMAKE_CURRENT_BINARY_DIR}/${PCH_SOURCE}.gch
DEPENDS ${INCLUDE_SRCS} VERBATIM
)
endforeach(PCH_SOURCE ${PCH_SOURCES})
endif(CMAKE_COMPILER_IS_GNUCXX)
# Add a custom target to the above file
add_custom_target(headers DEPENDS version ${CMAKE_CURRENT_BINARY_DIR}/version.h ${PCH_SOURCES_GCH})
add_custom_target(headers DEPENDS version ${CMAKE_CURRENT_BINARY_DIR}/version.h)
+29 -54
View File
@@ -5,12 +5,15 @@
class NickAlias;
class NickCore;
class NickRequest;
typedef unordered_map_namespace::unordered_map<Anope::string, NickAlias *, ci::hash, std::equal_to<ci::string> > nickalias_map;
typedef unordered_map_namespace::unordered_map<Anope::string, NickCore *, ci::hash, std::equal_to<ci::string> > nickcore_map;
typedef unordered_map_namespace::unordered_map<Anope::string, NickRequest *, ci::hash, std::equal_to<ci::string> > nickrequest_map;
extern CoreExport nickalias_map NickAliasList;
extern CoreExport nickcore_map NickCoreList;
extern CoreExport nickrequest_map NickRequestList;
/* NickServ nickname structures. */
@@ -38,10 +41,6 @@ enum NickNameFlag
NS_END
};
const Anope::string NickNameFlagStrings[] = {
"BEGIN", "FORBIDDEN", "NO_EXPIRE", "HELD", "COLLIDED", ""
};
/** Flags set on NickCores
*/
enum NickCoreFlag
@@ -82,17 +81,23 @@ enum NickCoreFlag
NI_AUTOOP,
/* This nickcore is forbidden, which means the nickalias for it is aswell */
NI_FORBIDDEN,
/* If set means the nick core does not have their email addrses confirmed.
*/
NI_UNCONFIRMED,
NI_END
};
const Anope::string NickCoreFlagStrings[] = {
"BEGIN", "KILLPROTECT", "SECURE", "MSG", "MEMO_HARDMAX", "MEMO_SIGNON", "MEMO_RECEIVE",
"PRIVATE", "HIDE_EMAIL", "HIDE_MASK", "HIDE_QUIT", "KILL_QUICK", "KILL_IMMED",
"MEMO_MAIL", "HIDE_STATUS", "SUSPENDED", "AUTOOP", "FORBIDDEN", "UNCONFIRMED", ""
class CoreExport NickRequest : public Extensible
{
public:
NickRequest(const Anope::string &nickname);
~NickRequest();
Anope::string nick;
Anope::string passcode;
Anope::string password;
Anope::string email;
time_t requested;
time_t lastmail; /* Unsaved */
};
class NickCore;
@@ -152,21 +157,32 @@ class CoreExport NickCore : public Extensible, public Flags<NickCoreFlag, NI_END
Anope::string greet; /* Greet associated to the nick */
Anope::string language; /* Language name */
std::vector<Anope::string> access; /* Access list, vector of strings */
std::vector<Anope::string> cert; /* ssl certificate list, vector of strings */
MemoInfo memos;
uint16 channelcount; /* Number of channels currently registered */
Oper *o;
OperType *ot;
/* Unsaved data */
time_t lastmail; /* Last time this nick record got a mail */
std::list<NickAlias *> aliases; /* List of aliases */
/** Check whether this opertype has access to run the given command string.
* @param cmdstr The string to check, e.g. botserv/set/private.
* @return True if this opertype may run the specified command, false otherwise.
*/
virtual bool HasCommand(const Anope::string &cmdstr) const;
/** Checks whether this account is a services oper or not.
* @return True if this account is a services oper, false otherwise.
*/
virtual bool IsServicesOper() const;
/** Check whether this opertype has access to the given special permission.
* @param privstr The priv to check for, e.g. users/auspex.
* @return True if this opertype has the specified priv, false otherwise.
*/
virtual bool HasPriv(const Anope::string &privstr) const;
/** Add an entry to the nick's access list
*
* @param entry The nick!ident@host entry to add to the access list
@@ -206,47 +222,6 @@ class CoreExport NickCore : public Extensible, public Flags<NickCoreFlag, NI_END
* Deletes all the memory allocated in the access list vector and then clears the vector.
*/
void ClearAccess();
/** Add an entry to the nick's certificate list
*
* @param entry The fingerprint to add to the cert list
*
* Adds a new entry into the cert list.
*/
void AddCert(const Anope::string &entry);
/** Get an entry from the nick's cert list by index
*
* @param entry Index in the certificaate list vector to retrieve
* @return The fingerprint entry of the given index if within bounds, an empty string if the vector is empty or the index is out of bounds
*
* Retrieves an entry from the certificate list corresponding to the given index.
*/
Anope::string GetCert(unsigned entry) const;
/** Find an entry in the nick's cert list
*
* @param entry The fingerprint to search for
* @return True if the fingerprint is found in the cert list, false otherwise
*
* Search for an fingerprint within the cert list.
*/
bool FindCert(const Anope::string &entry);
/** Erase a fingerprint from the nick's certificate list
*
* @param entry The fingerprint to remove
*
* Removes the specified fingerprint from the cert list.
*/
void EraseCert(const Anope::string &entry);
/** Clears the entire nick's cert list
*
* Deletes all the memory allocated in the certificate list vector and then clears the vector.
*/
void ClearCert();
};
/** Timer for colliding nicks to force people off of nicknames
+4 -25
View File
@@ -1,8 +1,8 @@
/*
* (C) 2003-2011 Anope Team
* (C) 2003-2010 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
* 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.
@@ -20,9 +20,6 @@ class Message;
namespace Anope
{
template<typename T> class map : public std::map<string, T> { };
template<typename T> class insensitive_map : public std::map<string, T, std::less<ci::string> > { };
/**
* A wrapper string class around all the other string classes, this class will
* allow us to only require one type of string everywhere that can be converted
@@ -156,11 +153,6 @@ namespace Anope
*/
inline size_type length() const { return this->_string.length(); }
/**
* Add a char to the end of the string.
*/
inline void push_back(char c) { return this->_string.push_back(c); }
/**
* Resizes the string content to n characters.
*/
@@ -302,12 +294,8 @@ namespace Anope
extern CoreExport time_t CurTime;
extern CoreExport string Version();
extern CoreExport string VersionShort();
extern CoreExport string VersionBuildString();
extern CoreExport int VersionMajor();
extern CoreExport int VersionMinor();
extern CoreExport int VersionPatch();
extern CoreExport int VersionBuild();
extern CoreExport string Build();
/** Check whether two strings match.
* @param str The string to check against the pattern (e.g. foobar)
@@ -336,15 +324,6 @@ namespace Anope
extern CoreExport void Unhex(const Anope::string &src, Anope::string &dest);
extern CoreExport void Unhex(const Anope::string &src, char *dest);
/** Returns a sequence of data formatted as the format argument specifies.
** After the format parameter, the function expects at least as many
** additional arguments as specified in format.
* @param fmt Format of the Message
* @param ... any number of parameters
* @return a Anope::string
*/
extern CoreExport string printf(const char *fmt, ...);
/** Return the last error, uses errno/GetLastError() to determin this
* @return An error message
*/
+10 -10
View File
@@ -1,6 +1,6 @@
/*
* Copyright (C) 2008-2011 Robin Burchell <w00t@inspircd.org>
* Copyright (C) 2008-2011 Anope Team <team@anope.org>
* Copyright (C) 2008-2010 Robin Burchell <w00t@inspircd.org>
* Copyright (C) 2008-2010 Anope Team <team@anope.org>
*
* Please read COPYING and README for further details.
*/
@@ -12,8 +12,10 @@
class BotInfo;
extern CoreExport Anope::insensitive_map<BotInfo *> BotListByNick;
extern CoreExport Anope::map<BotInfo *> BotListByUID;
typedef unordered_map_namespace::unordered_map<Anope::string, BotInfo *, ci::hash, std::equal_to<ci::string> > botinfo_map;
typedef unordered_map_namespace::unordered_map<Anope::string, BotInfo *, Anope::hash> botinfo_uid_map;
extern CoreExport botinfo_map BotListByNick;
extern CoreExport botinfo_uid_map BotListByUID;
/** Flags settable on a bot
*/
@@ -29,8 +31,6 @@ enum BotFlag
BI_END
};
static const Anope::string BotFlagString[] = { "BEGIN", "CORE", "PRIVATE", "" };
class CoreExport BotInfo : public User, public Flags<BotFlag, BI_END>
{
public:
@@ -75,15 +75,15 @@ class CoreExport BotInfo : public User, public Flags<BotFlag, BI_END>
/** Join this bot to a channel
* @param c The channel
* @param status The status the bot should have on the channel
* @param update_ts Assume we're updating the TS for this channel
*/
void Join(Channel *c, ChannelStatus *status = NULL);
void Join(Channel *c, bool update_ts = false);
/** Join this bot to a channel
* @param chname The channel name
* @param status The status the bot should have on the channel
* @param update_ts Assume we're updating the TS for this channel
*/
void Join(const Anope::string &chname, ChannelStatus *status = NULL);
void Join(const Anope::string &chname, bool update_ts = false);
/** Part this bot from a channel
* @param c The channel
+47 -15
View File
@@ -1,6 +1,6 @@
/* Channel support
*
* (C) 2008-2011 Anope Team
* (C) 2008-2010 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
@@ -52,7 +52,7 @@ struct UserContainer
typedef std::list<UserContainer *> CUserList;
enum ChannelFlag
enum ChannelFlags
{
/* Channel still exists when emptied */
CH_PERSIST,
@@ -62,14 +62,15 @@ enum ChannelFlag
CH_LOGCHAN
};
class CoreExport Channel : public Extensible, public Flags<ChannelFlag, 3>
class CoreExport Channel : public Extensible, public Flags<ChannelFlags>
{
public:
typedef std::multimap<ChannelModeName, Anope::string> ModeList;
private:
/** A map of channel modes with their parameters set on this channel
*/
ModeList modes;
std::map<ChannelModeName, Anope::string> Params;
/* Modes set on the channel */
Flags<ChannelModeName, CMODE_END * 2> modes;
public:
/** Default constructor
@@ -86,6 +87,10 @@ class CoreExport Channel : public Extensible, public Flags<ChannelFlag, 3>
ChannelInfo *ci; /* Corresponding ChannelInfo */
time_t creation_time; /* When channel was created */
EList *bans;
EList *excepts;
EList *invites;
/* List of users in the channel */
CUserList users;
@@ -141,18 +146,16 @@ class CoreExport Channel : public Extensible, public Flags<ChannelFlag, 3>
*/
bool HasUserStatus(User *u, ChannelModeName Name) const;
/** See if the channel has any modes at all
* @return true or false
*/
inline bool HasModes() const { return modes.FlagCount(); }
/** See if a channel has a mode
* @param Name The mode name
* @return The number of modes set
* @param param The optional mode param
* @return true or false
*/
size_t HasMode(ChannelModeName Name, const Anope::string &param = "");
/** Get a list of modes on a channel
* @param Name A mode name to get the list of
* @return a pair of iterators for the beginning and end of the list
*/
std::pair<ModeList::iterator, ModeList::iterator> GetModeList(ChannelModeName Name);
bool HasMode(ChannelModeName Name) const;
/** Set a mode internally on a channel, this is not sent out to the IRCd
* @param cm The mode
@@ -202,6 +205,30 @@ class CoreExport Channel : public Extensible, public Flags<ChannelFlag, 3>
*/
void RemoveMode(BotInfo *bi, ChannelModeName Name, const Anope::string &param = "", bool EnforceMLock = true);
/** Clear all the modes from the channel
* @param bi The client unsetting the modes
* @param internal Only remove the modes internally
*/
void ClearModes(BotInfo *bi = NULL, bool internal = false);
/** Clear all the bans from the channel
* @param bi The client unsetting the modes
* @param internal Only remove the modes internally
*/
void ClearBans(BotInfo *bi = NULL, bool internal = false);
/** Clear all the excepts from the channel
* @param bi The client unsetting the modes
* @param internal Only remove the modes internally
*/
void ClearExcepts(BotInfo *bi = NULL, bool internal = false);
/** Clear all the invites from the channel
* @param bi The client unsetting the modes
* @param internal Only remove the modes internally
*/
void ClearInvites(BotInfo *bi = NULL, bool internal = false);
/** Get a param from the channel
* @param Name The mode
* @param Target a string to put the param into
@@ -209,6 +236,11 @@ class CoreExport Channel : public Extensible, public Flags<ChannelFlag, 3>
*/
bool GetParam(ChannelModeName Name, Anope::string &Target) const;
/** Check if a mode is set and has a param
* @param Name The mode
*/
bool HasParam(ChannelModeName Name) const;
/** Set a string of modes on the channel
* @param bi The client setting the modes
* @param EnforceMLock Should mlock be enforced on this mode change
+15 -55
View File
@@ -1,9 +1,9 @@
/* Declarations for command data.
*
* (C) 2003-2011 Anope Team
* (C) 2003-2010 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
* 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.
@@ -29,9 +29,9 @@ enum CommandReturn
};
extern CoreExport Command *FindCommand(BotInfo *bi, const Anope::string &cmd);
extern CoreExport void mod_help_cmd(BotInfo *bi, User *u, ChannelInfo *ci, const Anope::string &cmd);
extern CoreExport void mod_run_cmd(BotInfo *bi, User *u, ChannelInfo *ci, const Anope::string &message);
extern CoreExport void mod_run_cmd(BotInfo *bi, User *u, ChannelInfo *ci, Command *c, const Anope::string &command, const Anope::string &message);
extern CoreExport void mod_help_cmd(BotInfo *bi, User *u, const Anope::string &cmd);
extern CoreExport void mod_run_cmd(BotInfo *bi, User *u, const Anope::string &message);
extern CoreExport void mod_run_cmd(BotInfo *bi, User *u, Command *c, const Anope::string &command, const Anope::string &message);
enum CommandFlag
{
@@ -43,44 +43,10 @@ enum CommandFlag
CFLAG_DISABLE_FANTASY
};
const Anope::string CommandFlagStrings[] = {
"CFLAG_ALLOW_UNREGISTERED",
"CFLAG_ALLOW_FORBIDDEN",
"CFLAG_ALLOW_SUSPENDED",
"CFLAG_ALLOW_UNREGISTEREDCHANNEL",
"CFLAG_STRIP_CHANNEL",
"CFLAG_DISABLE_FANTASY",
""
};
/* The source for a command */
struct CoreExport CommandSource
{
/* User executing the command */
User *u;
/* Channel (if applicable) */
ChannelInfo *ci;
/* The service this command is on */
BotInfo *owner;
/* The service the reply should come from, *not* necessarily the service the command is on */
BotInfo *service;
/* Whether or not this was a fantasy command */
bool fantasy;
std::list<Anope::string> reply;
void Reply(const char *message, ...);
void Reply(const Anope::string &message);
void DoReply();
};
/** Every services command is a class, inheriting from Command.
*/
class CoreExport Command : public Flags<CommandFlag>, public Base
class CoreExport Command : public Flags<CommandFlag>
{
Anope::string desc;
public:
/* Maximum paramaters accepted by this command */
size_t MaxParams;
@@ -106,33 +72,28 @@ class CoreExport Command : public Flags<CommandFlag>, public Base
virtual ~Command();
protected:
void SetDesc(const Anope::string &d);
public:
/** Execute this command.
* @param source The source
* @param params Command parameters
* @param u The user executing the command.
*/
virtual CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params) = 0;
virtual CommandReturn Execute(User *u, const std::vector<Anope::string> &);
/** Called when HELP is requsted for the client this command is on.
* @param source The source
* @param u The user requesting help
*/
virtual void OnServHelp(CommandSource &source);
virtual void OnServHelp(User *u);
/** Requested when the user is requesting help on this command. Help on this command should be sent to the user.
* @param source The source
* @param u The user requesting help
* @param subcommand The subcommand the user is requesting help on, or an empty string. (e.g. /ns help set foo bar lol gives a subcommand of "FOO BAR LOL")
* @return true if help was provided to the user, false otherwise.
*/
virtual bool OnHelp(CommandSource &source, const Anope::string &subcommand);
virtual bool OnHelp(User *u, const Anope::string &subcommand);
/** Requested when the user provides bad syntax to this command (not enough params, etc).
* @param source The source
* @param u The user executing the command.
* @param subcommand The subcommand the user tried to use
*/
virtual void OnSyntaxError(CommandSource &source, const Anope::string &subcommand);
virtual void OnSyntaxError(User *u, const Anope::string &subcommand);
/** Set which command permission (e.g. chanserv/forbid) is required for this command.
* @param reststr The permission required to successfully execute this command
@@ -140,10 +101,9 @@ class CoreExport Command : public Flags<CommandFlag>, public Base
void SetPermission(const Anope::string &reststr);
/** Add a subcommand to this command
* @param creator The creator of the subcommand
* @param c The command
*/
virtual bool AddSubcommand(Module *creator, Command *c);
virtual bool AddSubcommand(Command *c);
/** Delete a subcommand from this command
* @param c The command
+169 -106
View File
@@ -34,6 +34,8 @@ enum ConfigDataType
DT_UINTEGER, // Unsigned Integer
DT_LUINTEGER, // Long Unsigned Integer
DT_CHARPTR, // Char pointer
DT_CSSTRING, // std::string
DT_CISTRING, // ci::string
DT_STRING, // Anope::string
DT_BOOLEAN, // Boolean
DT_HOSTNAME, // Hostname syntax
@@ -51,7 +53,7 @@ enum ConfigDataType
* The callback function can then alter the values of the ValueItem
* classes to validate the settings.
*/
class CoreExport ValueItem
class ValueItem
{
private:
/** Actual data */
@@ -87,7 +89,11 @@ class CoreExport ValueItem
int GetInteger() const;
/** Get value as a string */
const char *GetString() const;
/** Get value as an Anope::string */
/** Get value as an std::string */
inline const std::string GetCSValue() const { return v.str(); }
/** Get value as a ci::string */
inline const ci::string GetCIValue() const { return v.ci_str(); }
/** Get value as a ci::string */
inline const Anope::string &GetValue() const { return v; }
/** Get value as a bool */
bool GetBool() const;
@@ -171,6 +177,78 @@ template<> class ValueContainer<char **> : public ValueContainerBase
}
};
/** This a specific version of ValueContainer to handle std::string specially
*/
template<> class ValueContainer<std::string *> : public ValueContainerBase
{
private:
/** Contained item */
std::string *val;
public:
/** Initialize with nothing */
ValueContainer() : ValueContainerBase(), val(NULL) { }
/** Initialize with an std::string */
ValueContainer(std::string *Val) : ValueContainerBase(), val(Val) { }
/** Initialize with a copy */
ValueContainer(const ValueContainer &Val) : ValueContainerBase(), val(Val.val) { }
ValueContainer &operator=(const ValueContainer &Val)
{
val = Val.val;
return *this;
}
/** Change value to given std::string */
void Set(const std::string &newval)
{
*val = newval;
}
/** Change value to given ci::string */
void Set(const ci::string &newval)
{
*val = newval.c_str();
}
/** Change value to given char pointer */
void Set(const char *newval)
{
*val = newval;
}
};
/** This a specific version of ValueContainer to handle ci::string specially
*/
template<> class ValueContainer<ci::string *> : public ValueContainerBase
{
private:
/** Contained item */
ci::string *val;
public:
/** Initialize with nothing */
ValueContainer() : ValueContainerBase(), val(NULL) { }
/** Initialize with an std::string */
ValueContainer(ci::string *Val) : ValueContainerBase(), val(Val) { }
/** Initialize with a copy */
ValueContainer(const ValueContainer &Val) : ValueContainerBase(), val(Val.val) { }
ValueContainer &operator=(const ValueContainer &Val)
{
val = Val.val;
return *this;
}
/** Change value to given std::string */
void Set(const std::string &newval)
{
*val = newval.c_str();
}
/** Change value to given ci::string */
void Set(const ci::string &newval)
{
*val = newval;
}
/** Change value to given char pointer */
void Set(const char *newval)
{
*val = newval;
}
};
/** This a specific version of ValueContainer to handle Anope::string specially
*/
template<> class ValueContainer<Anope::string *> : public ValueContainerBase
@@ -190,7 +268,16 @@ template<> class ValueContainer<Anope::string *> : public ValueContainerBase
val = Val.val;
return *this;
}
/** Change value to given std::string */
void Set(const std::string &newval)
{
*val = newval;
}
/** Change value to given ci::string */
void Set(const ci::string &newval)
{
*val = newval;
}
/** Change value to given Anope::string */
void Set(const Anope::string &newval)
{
@@ -232,6 +319,16 @@ typedef ValueContainer<int *> ValueContainerInt;
*/
typedef ValueContainer<time_t *> ValueContainerTime;
/** A specialization of ValueContainer to hold a pointer to
* an std::string
*/
typedef ValueContainer<std::string *> ValueContainerCSString;
/** A specialization of ValueContainer to hold a pointer to
* an ci::string
*/
typedef ValueContainer<ci::string *> ValueContainerCIString;
/** A specialization of ValueContainer to hold a pointer to
* an Anope::string
*/
@@ -251,89 +348,43 @@ typedef bool (*MultiValidator)(ServerConfig *, const Anope::string &, const Anop
*/
typedef bool (*MultiNotify)(ServerConfig *, const Anope::string &);
bool ValidateNotEmpty(ServerConfig *, const Anope::string &tag, const Anope::string &value, ValueItem &data);
bool ValidateNotZero(ServerConfig *, const Anope::string &tag, const Anope::string &value, ValueItem &data);
bool ValidateEmailReg(ServerConfig *config, const Anope::string &tag, const Anope::string &value, ValueItem &data);
bool ValidatePort(ServerConfig *, const Anope::string &tag, const Anope::string &value, ValueItem &data);
bool ValidateGuestPrefix(ServerConfig *conf, const Anope::string &tag, const Anope::string &value, ValueItem &data);
bool ValidateBantype(ServerConfig *, const Anope::string &, const Anope::string &, ValueItem &data);
bool ValidateChanServ(ServerConfig *config, const Anope::string &tag, const Anope::string &value, ValueItem &data);
bool ValidateMemoServ(ServerConfig *config, const Anope::string &tag, const Anope::string &value, ValueItem &data);
bool ValidateBotServ(ServerConfig *config, const Anope::string &tag, const Anope::string &value, ValueItem &data);
bool ValidateHostServ(ServerConfig *config, const Anope::string &tag, const Anope::string &value, ValueItem &data);
bool ValidateLimitSessions(ServerConfig *config, const Anope::string &tag, const Anope::string &value, ValueItem &data);
bool ValidateOperServ(ServerConfig *config, const Anope::string &tag, const Anope::string &value, ValueItem &data);
bool ValidateGlobal(ServerConfig *config, const Anope::string &tag, const Anope::string &value, ValueItem &data);
bool ValidateDefCon(ServerConfig *config, const Anope::string &tag, const Anope::string &value, ValueItem &data);
bool ValidateNickLen(ServerConfig *, const Anope::string &, const Anope::string &, ValueItem &data);
bool ValidateMail(ServerConfig *config, const Anope::string &tag, const Anope::string &value, ValueItem &data);
bool ValidateGlobalOnCycle(ServerConfig *config, const Anope::string &tag, const Anope::string &value, ValueItem &data);
/** Represents a configuration file
/** Holds a core configuration item and its callbacks
*/
class ConfigurationFile
struct InitialConfig
{
Anope::string name;
bool executable;
FILE *fp;
public:
ConfigurationFile(const Anope::string &, bool);
~ConfigurationFile();
const Anope::string &GetName() const;
bool IsOpen() const;
bool Open();
void Close();
bool End() const;
Anope::string Read();
/** Tag name */
const Anope::string tag;
/** Value name */
const Anope::string value;
/** Default, if not defined */
const Anope::string default_value;
/** Value containers */
ValueContainerBase *val;
/** Data types */
int datatype;
/** Validation function */
Validator validation_function;
};
/** Holds all of the core configuration items
/** Holds a core configuration item and its callbacks
* where there may be more than one item
*/
class CoreExport ConfigItems
struct MultiConfig
{
public:
/** Holds a core configuration item and its callbacks
*/
struct Item
{
/** Tag name */
Anope::string tag;
/** Value name */
Anope::string value;
/** Default, if not defined */
Anope::string default_value;
/** Value containers */
ValueContainerBase *val;
/** Data types */
int datatype;
/** Validation function */
Validator validation_function;
} *Values;
/** Holds a core configuration item and its callbacks
* where there may be more than one item
*/
struct MultiItem
{
/** Tag name */
Anope::string tag;
/** One or more items within tag */
Anope::string items[17];
/** One or more defaults for items within tags */
Anope::string items_default[17];
/** One or more data types */
int datatype[17];
/** Initialization function */
MultiNotify init_function;
/** Validation function */
MultiValidator validation_function;
/** Completion function */
MultiNotify finish_function;
} *MultiValues;
ConfigItems(ServerConfig *conf);
~ConfigItems();
/** Tag name */
const Anope::string tag;
/** One or more items within tag */
const Anope::string items[17];
/** One or more defaults for items within tags */
const Anope::string items_default[17];
/** One or more data types */
int datatype[17];
/** Initialization function */
MultiNotify init_function;
/** Validation function */
MultiValidator validation_function;
/** Completion function */
MultiNotify finish_function;
};
/** This class holds the bulk of the runtime configuration for Anope.
@@ -347,6 +398,8 @@ class CoreExport ServerConfig
*/
bool CheckOnce(const Anope::string &);
public:
/* Error from the config */
std::ostringstream errstr;
/** This holds all the information in the config file,
* it's indexed by tag name to a vector of key/values.
*/
@@ -354,16 +407,15 @@ class CoreExport ServerConfig
/** Construct a new ServerConfig
*/
ServerConfig();
/** Read the entire configuration into memory
* and initialize this class. All other methods
* should be used only by the core.
*/
void Read();
/** Load the configuration file into 'this'. With the new config parser everything is parsed into
/** Load 'filename' into 'target', with the new config parser everything is parsed into
* tag/key/value at load-time rather than at read-value time.
*/
void LoadConf(ConfigurationFile &file);
bool LoadConf(ConfigDataHash &, const Anope::string &);
// Both these return true if the value existed or false otherwise
/** Writes 'length' chars into 'result' as a string
*/
@@ -485,9 +537,6 @@ class CoreExport ServerConfig
bool UsePrivmsg;
/* Services only respond to full PRIVMSG client@services.server.name messages */
bool UseStrictPrivMsg;
/* This is not a configurable option.
* Config::Config will set it depending on the value of UseStrictPrivMsg */
Anope::string UseStrictPrivMsgString;
/* Number of seconds between consecutive uses of the REGISTER command
* Not to be confused with NSRegDelay */
unsigned NickRegDelay;
@@ -495,12 +544,10 @@ class CoreExport ServerConfig
unsigned NewsCount;
/* Default mlock modes */
Anope::string MLock;
/* Unmlockable modes */
Anope::string NoMLock;
/* Default botmodes on channels, defaults to ao */
Anope::string BotModes;
/* THe actual modes */
ChannelStatus BotModeList;
std::vector<ChannelModeStatus *> BotModeList;
/* How many times to try and reconnect to the uplink before giving up */
unsigned MaxRetries;
/* How long to wait between connection attempts */
@@ -546,18 +593,12 @@ class CoreExport ServerConfig
time_t NSRegDelay;
/* Time before the registering mail will be resent */
time_t NSResendDelay;
/* How long before nicks expire */
/* How long before nicks expir */
time_t NSExpire;
/* How long before suspended nicks expire */
time_t NSSuspendExpire;
/* How long before forbidden nicks expire */
time_t NSForbidExpire;
/* Time before unconfirmed nicks expire */
time_t NSUnconfirmedExpire;
/* Time before NickRequests expire */
time_t NSRExpire;
/* Force email when registering */
bool NSForceEmail;
/* Force users to validate new email addresses */
bool NSConfirmEmailChanges;
/* Max number of nicks in a group */
unsigned NSMaxAliases;
/* Max number of allowed strings on the access list */
@@ -582,8 +623,6 @@ class CoreExport ServerConfig
bool NSModeOnID;
/* Add the users hostnask their access list when they register */
bool NSAddAccessOnReg;
/* Maximum number of channels on AJoin */
unsigned AJoinMax;
/* Default flags for newly registered channels */
Flags<ChannelInfoFlag, CI_END> CSDefFlags;
@@ -591,10 +630,6 @@ class CoreExport ServerConfig
unsigned CSMaxReg;
/* Time before a channel expires */
time_t CSExpire;
/* How long before suspended channels expire */
time_t CSSuspendExpire;
/* How long before forbidden channels expire */
time_t CSForbidExpire;
/* Default ban type to use for channels */
int CSDefBantype;
/* Max number of entries allowed on channel access lists */
@@ -672,6 +707,26 @@ class CoreExport ServerConfig
bool WallOper;
/* Send a WALLOPS/GLOBOPS when a nonoper tries to use OperServ */
bool WallBadOS;
/* Send a WALLOPS/GLOBOPS when someone uses the GLOBAL command */
bool WallOSGlobal;
/* Send a WALLOPS/GLOBOPS when someone uses the MODE command */
bool WallOSMode;
/* Send a WALLOPS/GLOBOPS when someone uses the CLEARMODES command */
bool WallOSClearmodes;
/* Send a WALLOPS/GLOBOPS when someone uses the KICK command */
bool WallOSKick;
/* Send a WALLOPS/GLOBOPS when someone uses the AKILL command */
bool WallOSAkill;
/* Send a WALLOPS/GLOBOPS when someone uses the SNLINE command */
bool WallOSSNLine;
/* Send a WALLOPS/GLOBOPS when someone uses the SQLINE command */
bool WallOSSQLine;
/* Send a WALLOPS/GLOBOPS when someone uses the SZLINE command */
bool WallOSSZLine;
/* Send a WALLOPS/GLOBOPS when someone uses the NOOP command */
bool WallOSNoOp;
/* Send a WALLOPS/GLOBOPS when when someone uses the JUPE command */
bool WallOSJupe;
/* Send a WALLOPS/GLOBOPS when an akill expires */
bool WallAkillExpire;
/* Send a WALLOPS/GLOBOPS when SNLines expire */
@@ -682,6 +737,14 @@ class CoreExport ServerConfig
bool WallSZLineExpire;
/* Send a WALLOPS/GLOBOPS when exceptions expire */
bool WallExceptionExpire;
/* Send a WALLOPS/GLOBOPS when DROP is used */
bool WallDrop;
/* Send a WALLOPS/GLOBOPS when FORBID is used */
bool WallForbid;
/* Send a WALLOPS/GLOBOPS when GETPASS is used */
bool WallGetpass;
/* Send a WALLOPS/GLOBOPS when SETPASS is used */
bool WallSetpass;
/* Add the akillers nick to the akill reason */
bool AddAkiller;
@@ -760,7 +823,7 @@ class CoreExport ServerConfig
/* List of available opertypes */
std::list<OperType *> MyOperTypes;
/* List of pairs of opers and their opertype from the config */
std::vector<Oper *> Opers;
std::list<std::pair<Anope::string, Anope::string> > Opers;
};
/** This class can be used on its own to represent an exception, or derived to represent a module-specific exception.
@@ -808,7 +871,7 @@ class CoreExport ConfigReader
long error;
public:
/** Default constructor.
* This constructor initialises the ConfigReader class to read the configuration file(s).
* This constructor initialises the ConfigReader class to read services.conf.
*/
ConfigReader();
/** Overloaded constructor.
+3 -5
View File
@@ -113,7 +113,7 @@ struct DNSPacket
inline void FillBuffer(unsigned char *buffer);
};
struct CoreExport DNSRecord
struct DNSRecord
{
/* Name of the initial lookup */
Anope::string name;
@@ -130,11 +130,9 @@ struct CoreExport DNSRecord
/* Record length */
unsigned short rdlength;
inline DNSRecord(const Anope::string &n);
/* When this record was created in our cache */
time_t created;
inline DNSRecord(const Anope::string &n);
operator bool() const;
};
/** The socket used to talk to the nameserver, uses UDP
@@ -156,7 +154,7 @@ class DNSSocket : public ConnectionSocket
/** DNS manager, manages the connection and all requests
*/
class CoreExport DNSManager : public Timer
class DNSManager : public Timer
{
std::multimap<Anope::string, DNSRecord *> cache;
public:
+5 -5
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2008-2011 Anope Team <team@anope.org>
* Copyright (C) 2008-2010 Anope Team <team@anope.org>
*
* Please read COPYING and README for further details.
*/
@@ -28,7 +28,7 @@ template<typename T> class ExtensibleItemRegular : public ExtensibleItemBase
public:
ExtensibleItemRegular(T item) : Item(item) { }
virtual ~ExtensibleItemRegular() { }
T &GetItem() { return Item; }
T GetItem() const { return Item; }
};
/** Class used to represent an extensible item that holds a pointer
@@ -41,7 +41,7 @@ template<typename T> class ExtensibleItemPointer : public ExtensibleItemBase
public:
ExtensibleItemPointer(T *item) : Item(item) { }
virtual ~ExtensibleItemPointer() { delete Item; }
T *GetItem() { return Item; }
T *GetItem() const { return Item; }
};
/** Class used to represent an extensible item that holds a pointer to an arrray
@@ -54,7 +54,7 @@ template<typename T> class ExtensibleItemPointerArray : public ExtensibleItemBas
public:
ExtensibleItemPointerArray(T *item) : Item(item) { }
virtual ~ExtensibleItemPointerArray() { delete [] Item; }
T *GetItem() { return Item; }
T *GetItem() const { return Item; }
};
class CoreExport Extensible : public Base
@@ -108,7 +108,7 @@ class CoreExport Extensible : public Base
*/
void Extend(const Anope::string &key)
{
this->Extend(key, new ExtensibleItemPointer<char *>(NULL));
this->Extend(key, new ExtensibleItemRegular<char *>(NULL));
}
/** Shrink an Extensible class.
+80 -51
View File
@@ -1,9 +1,9 @@
/* Prototypes and external variable declarations.
*
* (C) 2003-2011 Anope Team
* (C) 2003-2010 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
* 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.
@@ -23,13 +23,12 @@ E void ModuleRunTimeDirCleanUp();
E IRCDVar *ircd;
E IRCDProto *ircdproto;
E IRCdMessage *ircdmessage;
/**** actions.c ****/
E void kill_user(const Anope::string &source, User *user, const Anope::string &reason);
E void kill_user(const Anope::string &source, const Anope::string &user, const Anope::string &reason);
E bool bad_password(User *u);
E void common_unban(ChannelInfo *ci, User *u, bool full = false);
E void common_unban(ChannelInfo *ci, const Anope::string &nick);
E BotInfo *BotServ;
E BotInfo *ChanServ;
@@ -52,10 +51,9 @@ E BotInfo *findbot(const Anope::string &nick);
*/
E Anope::string normalizeBuffer(const Anope::string &);
E void check_ban(ChannelInfo *ci, User *u, int ttbtype);
E void bot_kick(ChannelInfo *ci, User *u, const char *message, ...);
E void bot_raw_ban(User *requester, ChannelInfo *ci, const Anope::string &nick, const Anope::string &reason);
E void bot_raw_kick(User *requester, ChannelInfo *ci, const Anope::string &nick, const Anope::string &reason);
E void bot_raw_mode(User *requester, ChannelInfo *ci, const Anope::string &mode, const Anope::string &nick);
/**** channels.c ****/
@@ -65,6 +63,8 @@ E Channel *findchan(const Anope::string &chan);
E User *nc_on_chan(Channel *c, const NickCore *nc);
E int get_access_level(ChannelInfo *ci, NickAlias *na);
E int get_access_level(ChannelInfo *ci, NickCore *nc);
E Anope::string get_xop_level(int level);
E void do_cmode(const Anope::string &source, const Anope::string &channel, const Anope::string &modes, const Anope::string &ts);
@@ -75,6 +75,18 @@ E void MassChannelModes(BotInfo *bi, const Anope::string &modes);
E void chan_set_correct_modes(User *user, Channel *c, int give_modes);
E Entry *entry_create(const Anope::string &mask);
E Entry *entry_add(EList *list, const Anope::string &mask);
E void entry_delete(EList *list, Entry *e);
E EList *list_create();
E int entry_match(Entry *e, const Anope::string &nick, const Anope::string &user, const Anope::string &host, uint32 ip);
E int entry_match_mask(Entry *e, const Anope::string &mask, uint32 ip);
E Entry *elist_match(EList *list, const Anope::string &nick, const Anope::string &user, const Anope::string &host, uint32 ip);
E Entry *elist_match_mask(EList *list, const Anope::string &mask, uint32 ip);
E Entry *elist_match_user(EList *list, User *u);
E Entry *elist_find_mask(EList *list, const Anope::string &mask);
E long get_memuse(EList *list);
inline BotInfo *whosends(ChannelInfo *ci)
{
if (!ci || !ci->bi || !ci->c || !ci->botflags.HasFlag(BS_SYMBIOSIS) || !ci->c->FindUser(ci->bi))
@@ -91,7 +103,7 @@ E void get_chanserv_stats(long *nrec, long *memuse);
E void reset_levels(ChannelInfo *ci);
E void cs_init();
E void expire_chans();
E void cs_remove_nick(NickCore *nc);
E void cs_remove_nick(const NickCore *nc);
E void check_modes(Channel *c);
E int check_valid_admin(User *user, Channel *chan, int servermode);
@@ -100,15 +112,19 @@ E int check_valid_op(User *user, Channel *chan, int servermode);
E ChannelInfo *cs_findchan(const Anope::string &chan);
E int check_access(User *user, ChannelInfo *ci, int what);
E bool IsFounder(User *user, ChannelInfo *ci);
E int get_access(User *user, ChannelInfo *ci);
E void update_cs_lastseen(User *user, ChannelInfo *ci);
E int get_idealban(ChannelInfo *ci, User *u, Anope::string &ret);
E AutoKick *is_stuck(ChannelInfo *ci, const Anope::string &mask);
E void stick_mask(ChannelInfo *ci, AutoKick *akick);
E void stick_all(ChannelInfo *ci);
E int levelinfo_maxwidth;
E Anope::string get_mlock_modes(ChannelInfo *ci, int complete);
/**** config.c ****/
E ConfigurationFile services_conf;
E Anope::string services_conf;
E ServerConfig *Config;
/* hostserv.c */
@@ -118,6 +134,7 @@ E void HostServSyncVhosts(NickAlias *na);
/**** encrypt.c ****/
E int enc_encrypt(const Anope::string &src, Anope::string &dest);
E int enc_decrypt(const Anope::string &src, Anope::string &dest);
E int enc_check_password(Anope::string &plaintext, Anope::string &password);
/**** hostserv.c ****/
E void get_hostserv_stats(long *nrec, long *memuse);
@@ -134,17 +151,17 @@ E Uplink *uplink_server;
/**** ircd.c ****/
E void pmodule_ircd_proto(IRCDProto *);
E void pmodule_ircd_var(IRCDVar *ircdvar);
E void pmodule_ircd_message(IRCdMessage *message);
/**** language.cpp ****/
E std::vector<Anope::string> languages;
E void InitLanguages();
E const Anope::string GetString(NickCore *nc, const char *string);
E const Anope::string GetString(const Anope::string &domain, const Anope::string &lang, const char *string);
E void PushLanguage(const Anope::string &, Anope::string);
E void PopLanguage();
E const char *anope_gettext(const char *string);
E void SyntaxError(CommandSource &source, const Anope::string &command, const Anope::string &message);
E const Anope::string GetString(const Anope::string &language, LanguageString string);
E const Anope::string GetString(LanguageString string);
E const Anope::string GetString(const NickCore *nc, LanguageString string);
E const Anope::string GetString(const User *u, LanguageString string);
E const Anope::string GetString(const char *domain, Anope::string language, const Anope::string &string);
E Anope::string language_strings[LANG_STRING_COUNT];
E void SyntaxError(BotInfo *bi, User *u, const Anope::string &command, LanguageString message);
/*** logger.cpp ***/
E void InitLogChannels(ServerConfig *);
@@ -187,54 +204,43 @@ class CoreExport UplinkSocket : public ConnectionSocket
/**** memoserv.c ****/
E void ms_init();
E void rsend_notify(CommandSource &source, Memo *m, const Anope::string &chan);
E void rsend_notify(User *u, Memo *m, const Anope::string &chan);
E void check_memos(User *u);
E MemoInfo *getmemoinfo(const Anope::string &name, bool &ischan, bool &isforbid);
E void memo_send(CommandSource &source, const Anope::string &name, const Anope::string &text, int z);
E void memo_send(User *u, const Anope::string &name, const Anope::string &text, int z);
/**** messages.cpp ****/
/**** messages.c ****/
E int m_nickcoll(const Anope::string &user);
E int m_away(const Anope::string &source, const Anope::string &msg);
E int m_kill(const Anope::string &nick, const Anope::string &msg);
E int m_motd(const Anope::string &source);
E int m_privmsg(const Anope::string &source, const Anope::string &receiver, const Anope::string &message);
E bool m_stats(const Anope::string &source, const std::vector<Anope::string> &);
E int m_whois(const Anope::string &source, const Anope::string &who);
E bool m_time(const Anope::string &source, const std::vector<Anope::string> &);
E bool m_version(const Anope::string &source, const std::vector<Anope::string> &);
E void init_core_messages();
E bool OnStats(const Anope::string &source, const std::vector<Anope::string> &);
E bool OnTime(const Anope::string &source, const std::vector<Anope::string> &);
E bool OnVersion(const Anope::string &source, const std::vector<Anope::string> &);
E bool On436(const Anope::string &, const std::vector<Anope::string> &);
E bool OnAway(const Anope::string &, const std::vector<Anope::string> &);
E bool OnJoin(const Anope::string &, const std::vector<Anope::string> &);
E bool OnKick(const Anope::string &, const std::vector<Anope::string> &);
E bool OnKill(const Anope::string &, const std::vector<Anope::string> &);
E bool OnMode(const Anope::string &, const std::vector<Anope::string> &);
E bool OnNick(const Anope::string &, const std::vector<Anope::string> &);
E bool OnUID(const Anope::string &, const std::vector<Anope::string> &);
E bool OnPart(const Anope::string &, const std::vector<Anope::string> &);
E bool OnPing(const Anope::string &, const std::vector<Anope::string> &);
E bool OnPrivmsg(const Anope::string &, const std::vector<Anope::string> &);
E bool OnQuit(const Anope::string &, const std::vector<Anope::string> &);
E bool OnServer(const Anope::string &, const std::vector<Anope::string> &);
E bool OnSQuit(const Anope::string &, const std::vector<Anope::string> &);
E bool OnTopic(const Anope::string &, const std::vector<Anope::string> &);
E bool OnWhois(const Anope::string &, const std::vector<Anope::string> &);
E bool OnCapab(const Anope::string &, const std::vector<Anope::string> &);
E bool OnSJoin(const Anope::string &, const std::vector<Anope::string> &);
E bool OnError(const Anope::string &, const std::vector<Anope::string> &);
/**** misc.c ****/
E bool IsFile(const Anope::string &filename);
E int toupper(char);
E int tolower(char);
E char *strscpy(char *d, const char *s, size_t len);
#ifndef HAVE_STRLCPY
E size_t strlcpy(char *, const char *, size_t);
#endif
#ifndef HAVE_STRLCAT
E size_t strlcat(char *, const char *, size_t);
#endif
E char *strnrepl(char *s, int32 size, const char *old, const char *nstr);
E const char *merge_args(int argc, char **argv);
E const char *merge_args(int argc, const char **argv);
E time_t dotime(const Anope::string &s);
E Anope::string duration(time_t seconds);
E Anope::string expire_left(NickCore *nc, time_t expires);
E Anope::string duration(const NickCore *nc, time_t seconds);
E Anope::string expire_left(const NickCore *nc, time_t expires);
E Anope::string do_strftime(const time_t &t);
E bool doValidHost(const Anope::string &host, int type);
@@ -258,17 +264,25 @@ E char *str_signed(unsigned char *str);
E std::list<Anope::string> BuildStringList(const Anope::string &, char = ' ');
E std::vector<Anope::string> BuildStringVector(const Anope::string &, char = ' ');
E uint32 cidr_to_netmask(uint16 cidr);
E uint16 netmask_to_cidr(uint32 mask);
E bool str_is_wildcard(const Anope::string &str);
E bool str_is_pure_wildcard(const Anope::string &str);
E bool str_is_cidr(const Anope::string &str, uint32 &ip, uint32 &mask, Anope::string &host);
/**** modes.cpp ****/
/* Number of generic modes we support */
E unsigned GenericChannelModes, GenericUserModes;
E std::multimap<ChannelModeName, ModeLock> def_mode_locks;
E Flags<ChannelModeName, CMODE_END * 2> DefMLockOn;
E Flags<ChannelModeName, CMODE_END * 2> DefMLockOff;
E std::map<ChannelModeName, Anope::string> DefMLockParams;
E void SetDefaultMLock(ServerConfig *config);
/**** nickserv.c ****/
E NickRequest *findrequestnick(const Anope::string &nick);
E void get_aliases_stats(long &count, long &mem);
E void get_core_stats(long &count, long &mem);
E void change_core_display(NickCore *nc);
@@ -278,12 +292,21 @@ E int do_setmodes(User *u);
E void ns_init();
E int validate_user(User *u);
E void expire_nicks();
E void expire_requests();
E NickAlias *findnick(const Anope::string &nick);
E NickCore *findcore(const Anope::string &nick);
E bool is_on_access(const User *u, const NickCore *nc);
/**** process.c ****/
E int allow_ignore;
E std::list<IgnoreData *> ignore;
E void add_ignore(const Anope::string &nick, time_t delta);
E IgnoreData *get_ignore(const Anope::string &nick);
E int delete_ignore(const Anope::string &nick);
E int clear_ignores();
E void process(const Anope::string &buf);
/**** send.c ****/
@@ -299,8 +322,8 @@ E std::vector<Exception *> exceptions;
E void get_session_stats(long &count, long &mem);
E void get_exception_stats(long &count, long &mem);
E void add_session(User *u);
E void del_session(User *u);
E void add_session(const Anope::string &nick, const Anope::string &host, const Anope::string &hostip);
E void del_session(const Anope::string &host);
E void expire_exceptions();
@@ -327,14 +350,20 @@ E void get_user_stats(long &count, long &mem);
E User *finduser(const Anope::string &nick);
E Anope::string TS6SID;
E User *do_nick(const Anope::string &source, const Anope::string &nick, const Anope::string &username, const Anope::string &host, const Anope::string &server, const Anope::string &realname, time_t ts, const Anope::string &ip, const Anope::string &vhost, const Anope::string &uid, const Anope::string &modes);
E void do_umode(const Anope::string &user, const Anope::string &modes);
E void do_kill(User *user, const Anope::string &reason);
E void do_umode(const Anope::string &, const Anope::string &user, const Anope::string &modes);
E void do_quit(const Anope::string &source, const Anope::string &reason);
E void do_kill(const Anope::string &source, const Anope::string &reason);
E bool matches_list(Channel *c, User *user, ChannelModeName mode);
E bool is_oper(User *user);
E bool is_excepted(ChannelInfo *ci, User *user);
E bool is_excepted_mask(ChannelInfo *ci, const Anope::string &mask);
E bool match_usermask(const Anope::string &mask, User *user);
E Anope::string create_mask(User *u);
/******************************************************************************/
+4 -4
View File
@@ -1,6 +1,6 @@
/*
* Copyright (C) 2002-2011 InspIRCd Development Team
* Copyright (C) 2009-2011 Anope Team <team@anope.org>
* Copyright (C) 2002-2010 InspIRCd Development Team
* Copyright (C) 2009-2010 Anope Team <team@anope.org>
*
* Please read COPYING and README for further details.
*
@@ -170,7 +170,7 @@ namespace irc
/** Used to hash irc::strings for unordered_map
*/
struct CoreExport hash
struct hash
{
/* VS 2008 specific code */
enum { bucket_size = 4, min_buckets = 8 };
@@ -241,7 +241,7 @@ namespace ci
/** Used to hash ci::strings for unordered_map
*/
struct CoreExport hash
struct hash
{
/* VS 2008 specific code */
enum { bucket_size = 4, min_buckets = 8 };
+1552 -115
View File
File diff suppressed because it is too large Load Diff
+1
View File
@@ -3,6 +3,7 @@
#include "anope.h"
extern CoreExport bool Mail(User *u, NickRequest *nr, BotInfo *service, const Anope::string &subject, const Anope::string &message);
extern CoreExport bool Mail(User *u, NickCore *nc, BotInfo *service, const Anope::string &subject, const Anope::string &message);
extern CoreExport bool Mail(NickCore *nc, const Anope::string &subject, const Anope::string &message);
extern CoreExport bool MailValidate(const Anope::string &email);
+84 -86
View File
@@ -1,7 +1,7 @@
/* Mode support
*
* Copyright (C) 2008-2011 Adam <Adam@anope.org>
* Copyright (C) 2008-2011 Anope Team <team@anope.org>
* Copyright (C) 2008-2010 Adam <Adam@anope.org>
* Copyright (C) 2008-2010 Anope Team <team@anope.org>
*
* Please read COPYING and README for further details.
*/
@@ -16,26 +16,14 @@ enum UserModeName
UMODE_BEGIN,
UMODE_SERV_ADMIN, UMODE_BOT, UMODE_CO_ADMIN, UMODE_FILTER, UMODE_HIDEOPER, UMODE_NETADMIN,
UMODE_REGPRIV, UMODE_PROTECTED, UMODE_NO_CTCP, UMODE_WEBTV, UMODE_WEBIRC, UMODE_WHOIS, UMODE_ADMIN, UMODE_DEAF,
UMODE_REGPRIV, UMODE_PROTECTED, UMODE_NO_CTCP, UMODE_WEBTV, UMODE_WHOIS, UMODE_ADMIN, UMODE_DEAF,
UMODE_GLOBOPS, UMODE_HELPOP, UMODE_INVIS, UMODE_OPER, UMODE_PRIV, UMODE_GOD, UMODE_REGISTERED,
UMODE_SNOMASK, UMODE_VHOST, UMODE_WALLOPS, UMODE_CLOAK, UMODE_SSL, UMODE_SOFTCALLERID, UMODE_CALLERID,
UMODE_COMMONCHANS, UMODE_HIDDEN, UMODE_STRIPCOLOR, UMODE_INVISIBLE_OPER, UMODE_RESTRICTED,
UMODE_SNOMASK, UMODE_VHOST, UMODE_WALLOPS, UMODE_CLOAK, UMODE_SSL, UMODE_CALLERID, UMODE_COMMONCHANS,
UMODE_HIDDEN, UMODE_STRIPCOLOR, UMODE_INVISIBLE_OPER,
UMODE_END
};
const Anope::string UserModeNameStrings[] = {
"UMODE_BEGIN",
"UMODE_SERV_ADMIN", "UMODE_BOT", "UMODE_CO_ADMIN", "UMODE_FILTER", "UMODE_HIDEOPER", "UMODE_NETADMIN",
"UMODE_REGPRIV", "UMODE_PROTECTED", "UMODE_NO_CTCP", "UMODE_WEBTV", "UMODE_WEBIRC", "UMODE_WHOIS", "UMODE_ADMIN", "UMODE_DEAF",
"UMODE_GLOBOPS", "UMODE_HELPOP", "UMODE_INVIS", "UMODE_OPER", "UMODE_PRIV", "UMODE_GOD", "UMODE_REGISTERED",
"UMODE_SNOMASK", "UMODE_VHOST", "UMODE_WALLOPS", "UMODE_CLOAK", "UMODE_SSL", "UMODE_SOFTCALLERID", "UMODE_CALLERID",
"UMODE_COMMONCHANS", "UMODE_HIDDEN", "UMODE_STRIPCOLOR", "UMODE_INVISIBLE_OPER", "UMODE_RESTRICTED"
""
};
/** All of the valid channel mode names
*/
enum ChannelModeName
@@ -48,7 +36,6 @@ enum ChannelModeName
CMODE_NOCTCP, CMODE_FILTER, CMODE_NOKNOCK, CMODE_REDIRECT, CMODE_REGMODERATED, CMODE_NONICK, CMODE_OPERONLY,
CMODE_NOKICK, CMODE_REGISTEREDONLY, CMODE_STRIPCOLOR, CMODE_NONOTICE, CMODE_NOINVITE, CMODE_ALLINVITE,
CMODE_BLOCKCAPS, CMODE_PERM, CMODE_NICKFLOOD, CMODE_JOINFLOOD, CMODE_DELAYEDJOIN, CMODE_NOREJOIN,
CMODE_BANDWIDTH,
/* b/e/I */
CMODE_BAN, CMODE_EXCEPT,
@@ -61,29 +48,6 @@ enum ChannelModeName
CMODE_END
};
const Anope::string ChannelModeNameStrings[] = {
"CMODE_BEGIN",
/* Channel modes */
"CMODE_BLOCKCOLOR", "CMODE_FLOOD", "CMODE_INVITE", "CMODE_KEY", "CMODE_LIMIT", "CMODE_MODERATED", "CMODE_NOEXTERNAL",
"CMODE_PRIVATE", "CMODE_REGISTERED", "CMODE_SECRET", "CMODE_TOPIC", "CMODE_AUDITORIUM", "CMODE_SSL", "CMODE_ADMINONLY",
"CMODE_NOCTCP", "CMODE_FILTER", "CMODE_NOKNOCK", "CMODE_REDIRECT", "CMODE_REGMODERATED", "CMODE_NONICK", "CMODE_OPERONLY",
"CMODE_NOKICK", "CMODE_REGISTEREDONLY", "CMODE_STRIPCOLOR", "CMODE_NONOTICE", "CMODE_NOINVITE", "CMODE_ALLINVITE",
"CMODE_BLOCKCAPS", "CMODE_PERM", "CMODE_NICKFLOOD", "CMODE_JOINFLOOD", "CMODE_DELAYEDJOIN", "CMODE_NOREJOIN",
"CMODE_BANDWIDTH",
/* b/e/I */
"CMODE_BAN", "CMODE_EXCEPT",
"CMODE_INVITEOVERRIDE",
/* v/h/o/a/q */
"CMODE_VOICE", "CMODE_HALFOP", "CMODE_OP",
"CMODE_PROTECT", "CMODE_OWNER",
""
};
/** The different types of modes
*/
enum ModeType
@@ -115,6 +79,8 @@ class CoreExport Mode : public Base
public:
/* Class of mode this is */
ModeClass Class;
/* The mode name, as a string */
Anope::string NameAsString;
/* Mode char for this */
char ModeChar;
/* Type of mode this is */
@@ -122,10 +88,11 @@ class CoreExport Mode : public Base
/** Default constructor
* @param mClass The type of mode this is
* @param mNameAsString The mode name as a string
* @param modeChar The mode char
* @param type The mode type
*/
Mode(ModeClass mClass, char modeChar, ModeType type);
Mode(ModeClass mClass, const Anope::string &mNameAsString, char modeChar, ModeType type);
/** Default destructor
*/
@@ -142,17 +109,14 @@ class CoreExport UserMode : public Mode
/** Default constructor
* @param nName The mode name
* @param mNameAsString The mode name as a string
* @param modeChar The mode char
*/
UserMode(UserModeName mName, char modeChar);
UserMode(UserModeName mName, const Anope::string &mNameAsString, char modeChar);
/** Default destructor
*/
virtual ~UserMode();
/** Returns the mode name as a string
*/
const Anope::string NameAsString();
};
class CoreExport UserModeParam : public UserMode
@@ -160,9 +124,10 @@ class CoreExport UserModeParam : public UserMode
public:
/** Default constructor
* @param mName The mode name
* @param mNameAsString The mode name as a string
* @param modeChar The mode char
*/
UserModeParam(UserModeName mName, char modeChar);
UserModeParam(UserModeName mName, const Anope::string &mNameAsString, char modeChar);
/** Check if the param is valid
* @param value The param
@@ -181,9 +146,10 @@ class CoreExport ChannelMode : public Mode
/** Default constructor
* @param mName The mode name
* @param mNameAsString The mode name as a string
* @param modeChar The mode char
*/
ChannelMode(ChannelModeName mName, char modeChar);
ChannelMode(ChannelModeName mName, const Anope::string &mNameAsString, char modeChar);
/** Default destructor
*/
@@ -193,11 +159,7 @@ class CoreExport ChannelMode : public Mode
* NOTE: User CAN be NULL, this is for checking if it can be locked with defcon
* @param u The user, or NULL
*/
bool CanSet(User *u) const;
/** Returns the mode name as a string
*/
const Anope::string NameAsString();
virtual bool CanSet(User *u) const { return true; }
};
@@ -208,9 +170,10 @@ class CoreExport ChannelModeList : public ChannelMode
public:
/** Default constructor
* @param mName The mode name
* @param mNameAsString The mode name as a string
* @param modeChar The mode char
*/
ChannelModeList(ChannelModeName mName, char modeChar);
ChannelModeList(ChannelModeName mName, const Anope::string &mNameAsString, char modeChar);
/** Default destructor
*/
@@ -222,25 +185,18 @@ class CoreExport ChannelModeList : public ChannelMode
*/
virtual bool IsValid(const Anope::string &mask) const { return true; }
/** Checks if mask affects user
* Should only be used for extbans or other weird ircd-specific things.
* @param u The user
* @param e The entry to match against
* @return true on match
*/
virtual bool Matches(User *u, const Entry *e) { return false; }
/** Called when a mask is added to a channel
/** Add the mask to the channel, this should be overridden
* @param chan The channel
* @param mask The mask
*/
virtual void OnAdd(Channel *chan, const Anope::string &mask) { }
virtual void AddMask(Channel *chan, const Anope::string &mask) { }
/** Called when a mask is removed from a channel
/** Delete the mask from the channel, this should be overridden
* @param chan The channel
* @param mask The mask
*/
virtual void OnDel(Channel *chan, const Anope::string &mask) { }
virtual void DelMask(Channel *chan, const Anope::string &mask) { }
};
/** This is a mode with a paramater, eg +k/l. These modes should use/inherit from this
@@ -250,10 +206,11 @@ class CoreExport ChannelModeParam : public ChannelMode
public:
/** Default constructor
* @param mName The mode name
* @param mNameAsString The mode name as a string
* @param modeChar The mode char
* @param MinusArg true if this mode sends no arg when unsetting
*/
ChannelModeParam(ChannelModeName mName, char modeChar, bool MinusArg = false);
ChannelModeParam(ChannelModeName mName, const Anope::string &mNameAsString, char modeChar, bool MinusArg = false);
/** Default destructor
*/
@@ -279,10 +236,11 @@ class CoreExport ChannelModeStatus : public ChannelMode
/** Default constructor
* @param mName The mode name
* @param mNameAsString The mode name as a string
* @param modeChar The mode char
* @param mSymbol The symbol for the mode, eg @ % +
*/
ChannelModeStatus(ChannelModeName mName, char modeChar, char mSymbol);
ChannelModeStatus(ChannelModeName mName, const Anope::string &mNameAsString, char modeChar, char mSymbol);
/** Default destructor
*/
@@ -294,17 +252,54 @@ class CoreExport ChannelModeStatus : public ChannelMode
class CoreExport ChannelModeBan : public ChannelModeList
{
public:
ChannelModeBan(ChannelModeName mName, char modeChar) : ChannelModeList(mName, modeChar) { }
ChannelModeBan(char modeChar) : ChannelModeList(CMODE_BAN, "CMODE_BAN", modeChar) { }
void OnAdd(Channel *chan, const Anope::string &mask);
void AddMask(Channel *chan, const Anope::string &mask);
void DelMask(Channel *chan, const Anope::string &mask);
};
/** Channel mode +e
*/
class CoreExport ChannelModeExcept : public ChannelModeList
{
public:
ChannelModeExcept(char modeChar) : ChannelModeList(CMODE_EXCEPT, "CMODE_EXCEPT", modeChar) { }
void AddMask(Channel *chan, const Anope::string &mask);
void DelMask(Channel *chan, const Anope::string &mask);
};
/** Channel mode +I
*/
class CoreExport ChannelModeInvex : public ChannelModeList
{
public:
ChannelModeInvex(char modeChar) : ChannelModeList(CMODE_INVITEOVERRIDE, "CMODE_INVITEOVERRIDE", modeChar) { }
void AddMask(Channel *chan, const Anope::string &mask);
void DelMask(Channel *chan, const Anope::string &mask);
};
/** Channel mode +k (key)
*/
class CoreExport ChannelModeKey : public ChannelModeParam
{
public:
ChannelModeKey(char modeChar) : ChannelModeParam(CMODE_KEY, modeChar) { }
ChannelModeKey(char modeChar) : ChannelModeParam(CMODE_KEY, "CMODE_KEY", modeChar) { }
bool IsValid(const Anope::string &value) const;
};
/** Channel mode +f (flood)
*/
class ChannelModeFlood : public ChannelModeParam
{
public:
ChannelModeFlood(char modeChar, bool minusNoArg = false) : ChannelModeParam(CMODE_FLOOD, "CMODE_FLOOD", modeChar, minusNoArg) { }
bool IsValid(const Anope::string &value) const;
};
@@ -315,7 +310,7 @@ class CoreExport ChannelModeKey : public ChannelModeParam
class CoreExport ChannelModeAdmin : public ChannelMode
{
public:
ChannelModeAdmin(char modeChar) : ChannelMode(CMODE_ADMINONLY, modeChar) { }
ChannelModeAdmin(char modeChar) : ChannelMode(CMODE_ADMINONLY, "CMODE_ADMINONLY", modeChar) { }
/* Opers only */
bool CanSet(User *u) const;
@@ -327,7 +322,7 @@ class CoreExport ChannelModeAdmin : public ChannelMode
class CoreExport ChannelModeOper : public ChannelMode
{
public:
ChannelModeOper(char modeChar) : ChannelMode(CMODE_OPERONLY, modeChar) { }
ChannelModeOper(char modeChar) : ChannelMode(CMODE_OPERONLY, "CMODE_OPERONLY", modeChar) { }
/* Opers only */
bool CanSet(User *u) const;
@@ -339,7 +334,7 @@ class CoreExport ChannelModeOper : public ChannelMode
class CoreExport ChannelModeRegistered : public ChannelMode
{
public:
ChannelModeRegistered(char modeChar) : ChannelMode(CMODE_REGISTERED, modeChar) { }
ChannelModeRegistered(char modeChar) : ChannelMode(CMODE_REGISTERED, "CMODE_REGISTERED", modeChar) { }
/* No one mlocks +r */
bool CanSet(User *u) const;
@@ -406,9 +401,18 @@ class CoreExport ModeManager
static void StackerAddInternal(BotInfo *bi, Base *Object, Mode *mode, bool Set, const Anope::string &Param, StackerType Type);
public:
/* List of all modes Anope knows about */
static std::vector<ChannelMode *> ChannelModes;
static std::vector<UserMode *> UserModes;
/* List of all modes Anope knows about */
static std::map<Anope::string, Mode *> Modes;
/* User modes */
static std::map<char, UserMode *> UserModesByChar;
static std::map<UserModeName, UserMode *> UserModesByName;
/* Channel modes */
static std::map<char, ChannelMode *> ChannelModesByChar;
static std::map<ChannelModeName, ChannelMode *> ChannelModesByName;
/* Although there are two different maps for UserModes and ChannelModes
* the pointers in each are the same. This is used to increase efficiency.
*/
/** Add a user mode to Anope
* @param um A UserMode or UserMode derived class
@@ -446,17 +450,11 @@ class CoreExport ModeManager
*/
static UserMode *FindUserModeByName(UserModeName Name);
/** Find channel mode by string
/** Find a mode by name
* @param name The mode name
* @return The mode
*/
static ChannelMode *FindChannelModeByString(const Anope::string &name);
/** Find user mode by string
* @param name The mode name
* @return The mode
*/
static UserMode *FindUserModeByString(const Anope::string &name);
static Mode *FindModeByName(const Anope::string &name);
/** Gets the channel mode char for a symbol (eg + returns v)
* @param Value The symbol
+1
View File
@@ -4,5 +4,6 @@
#include "services.h"
#include "commands.h"
#include "modules.h"
#define _(x) x
#endif // MODULE_H
+79 -126
View File
@@ -1,9 +1,9 @@
/* Modular support
*
* (C) 2003-2011 Anope Team
* (C) 2003-2010 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
* 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.
@@ -165,9 +165,9 @@ extern CoreExport std::list<Module *> Modules;
class Version
{
private:
int Major;
int Minor;
int Build;
unsigned Major;
unsigned Minor;
unsigned Build;
public:
/** Constructor
@@ -175,7 +175,7 @@ class Version
* @param vMinor The minor version numbber
* @param vBuild The build version numbber
*/
Version(int vMajor, int vMinor, int vBuild);
Version(unsigned vMajor, unsigned vMinor, unsigned vBuild);
/** Destructor
*/
@@ -184,17 +184,17 @@ class Version
/** Get the major version of Anope this was built against
* @return The major version
*/
int GetMajor() const;
unsigned GetMajor() const;
/** Get the minor version of Anope this was built against
* @return The minor version
*/
int GetMinor() const;
unsigned GetMinor() const;
/** Get the build version this was built against
* @return The build version
*/
int GetBuild() const;
unsigned GetBuild() const;
};
/* Forward declaration of CallBack class for the Module class */
@@ -284,10 +284,11 @@ class CoreExport Module : public Extensible
Version GetVersion() const;
/** Send a message to a user in their language, if a translation is available
* @param source The source of the message
* @param from Client to send the message from
* @param to User to send the message to
* @param fmt The message
*/
void SendMessage(CommandSource &source, const char *fmt, ...);
void SendMessage(BotInfo *from, User *to, const char *fmt, ...);
/**
* Add a module provided command to the given service.
@@ -364,25 +365,27 @@ class CoreExport Module : public Extensible
* @param bi The bot the command is being run from
* @param command The command
* @param message The parameters used for the command
* @param ci If a tanasy command, the channel the comman was used on
* @param c The command class (if it exists)
* @return EVENT_CONTINUE to let other modules decide, EVENT_STOP to halt the command and not process it
*/
virtual EventReturn OnPreCommandRun(User *&u, BotInfo *&bi, Anope::string &command, Anope::string &message, ChannelInfo *&ci) { return EVENT_CONTINUE; }
virtual EventReturn OnPreCommandRun(User *u, BotInfo *bi, const Anope::string &command, const Anope::string &message, Command *c) { return EVENT_CONTINUE; }
/** Called before a command is due to be executed.
* @param source The source of the command
* @param u The user executing the command
* @param service The service the command is associated with
* @param command The command the user is executing
* @param params The parameters the user is sending
* @return EVENT_CONTINUE to let other modules decide, EVENT_STOP to halt the command and not process it
*/
virtual EventReturn OnPreCommand(CommandSource &source, Command *command, const std::vector<Anope::string> &params) { return EVENT_CONTINUE; }
virtual EventReturn OnPreCommand(User *u, BotInfo *service, const Anope::string &command, const std::vector<Anope::string> &params) { return EVENT_CONTINUE; }
/** Called after a command has been executed.
* @param source The source of the command
* @param u The user executing the command
* @param service The service the command is associated with
* @param command The command the user executed
* @param params The parameters the user sent
*/
virtual void OnPostCommand(CommandSource &source, Command *command, const std::vector<Anope::string> &params) { }
virtual void OnPostCommand(User *u, BotInfo *service, const Anope::string &command, const std::vector<Anope::string> &params) { }
/** Called after the core has finished loading the databases, but before
* we connect to the server
@@ -404,6 +407,7 @@ class CoreExport Module : public Extensible
*/
virtual EventReturn OnEncrypt(const Anope::string &src, Anope::string &dest) { return EVENT_CONTINUE; }
virtual EventReturn OnDecrypt(const Anope::string &hashm, const Anope::string &src, Anope::string &dest) { return EVENT_CONTINUE; }
virtual EventReturn OnCheckPassword(const Anope::string &hashm, Anope::string &plaintext, Anope::string &password) { return EVENT_CONTINUE; }
/** Called on fantasy command
* @param command The command
@@ -422,10 +426,10 @@ class CoreExport Module : public Extensible
virtual void OnBotNoFantasyAccess(const Anope::string &command, User *u, ChannelInfo *ci, const Anope::string &params) { }
/** Called after a bot joins a channel
* @param c The channel
* @param ci The channael
* @param bi The bot
*/
virtual void OnBotJoin(Channel *c, BotInfo *bi) { }
virtual void OnBotJoin(ChannelInfo *ci, BotInfo *bi) { }
/** Called when a bot places a ban
* @param u User being banned
@@ -446,11 +450,6 @@ class CoreExport Module : public Extensible
*/
virtual void OnBadWordDel(ChannelInfo *ci, BadWord *bw) { }
/** Called in findbot()
* @param nick The nick being looked up
*/
virtual void OnFindBot(const Anope::string &nick) { }
/** Called before a bot kicks a user
* @param bi The bot sending the kick
* @param c The channel the user is being kicked on
@@ -499,10 +498,10 @@ class CoreExport Module : public Extensible
*/
virtual EventReturn OnPreChanExpire(ChannelInfo *ci) { return EVENT_CONTINUE; }
/** Called before a channel expires
* @param ci The channel
/** Called when a channel expires
* @param chname The channel name
*/
virtual void OnChanExpire(ChannelInfo *ci) { }
virtual void OnChanExpire(const Anope::string &chname) { }
/** Called before Anope connects to its uplink
* @param u The uplink we're going to connect to
@@ -560,6 +559,14 @@ class CoreExport Module : public Extensible
*/
virtual EventReturn OnDatabaseReadMetadata(NickAlias *na, const Anope::string &key, const std::vector<Anope::string> &params) { return EVENT_CONTINUE; }
/** Called when nickrequest metadata is read from the database
* @param nr The nickrequest
* @parm key The metadata key
* @param params The params from the database
* @return EVENT_CONTINUE to let other modules decide, EVENT_STOP to stop processing
*/
virtual EventReturn OnDatabaseReadMetadata(NickRequest *nr, const Anope::string &key, const std::vector<Anope::string> &params) { return EVENT_CONTINUE; }
/** Called when botinfo metadata is read from the database
* @param bi The botinfo
* @param key The metadata key
@@ -588,6 +595,12 @@ class CoreExport Module : public Extensible
*/
virtual void OnDatabaseWriteMetadata(void (*WriteMetadata)(const Anope::string &, const Anope::string &), NickAlias *na) { }
/** Called when we are wrting metadata for a nickrequest
* @param WriteMetata A callback function used to insert the metadata
* @param nr The nick request
*/
virtual void OnDatabaseWriteMetadata(void (*WriteMetadata)(const Anope::string &, const Anope::string &), NickRequest *nr) { }
/** Called when we are writing metadata for a botinfo
* @param WriteMetata A callback function used to insert the metadata
* @param bi The botinfo
@@ -713,23 +726,25 @@ class CoreExport Module : public Extensible
/** Called when access is deleted from a channel
* @param ci The channel
* @param u The user who removed the access
* @param access The access entry being removed
* @param nc The user who was deleted
*/
virtual void OnAccessDel(ChannelInfo *ci, User *u, ChanAccess *access) { }
virtual void OnAccessDel(ChannelInfo *ci, User *u, NickCore *nc) { }
/** Called when access is changed
* @param ci The channel
* @param u The user who changed the access
* @param u access The access changed
* @param nc The nick whos access was changed
* @param level The level of the new access
*/
virtual void OnAccessChange(ChannelInfo *ci, User *u, ChanAccess *access) { }
virtual void OnAccessChange(ChannelInfo *ci, User *u, NickCore *nc, int level) { }
/** Called when access is added
* @param ci The channel
* @param u The user who added the access
* @param access The access changed
* @para nc The nick who was added to access
* @param level The level they were added at
*/
virtual void OnAccessAdd(ChannelInfo *ci, User *u, ChanAccess *access) { }
virtual void OnAccessAdd(ChannelInfo *ci, User *u, NickCore *nc, int level) { }
/** Called when the access list is cleared
* @param ci The channel
@@ -800,22 +815,16 @@ class CoreExport Module : public Extensible
virtual void OnAkickDel(User *u, ChannelInfo *ci, AutoKick *ak) { }
/** Called when a user requests info for a channel
* @param source The user requesting info
* @param u The user requesting info
* @param ci The channel the user is requesting info for
* @param ShowHidden true if we should show the user everything
*/
virtual void OnChanInfo(CommandSource &source, ChannelInfo *ci, bool ShowHidden) { }
/** Called on cs_findchan()
* @param chname The name being looked up
*/
virtual void OnFindChan(const Anope::string &chname) { }
virtual void OnChanInfo(User *u, ChannelInfo *ci, bool ShowHidden) { }
/** Called when a nick is dropped
* @param u The user dropping the nick
* @param na The nick
* @param nick The nick
*/
virtual void OnNickDrop(User *u, NickAlias *na) { }
virtual void OnNickDrop(const Anope::string &nick) { }
/** Called when a nick is forbidden
* @param na The nick alias of the forbidden nick
@@ -869,6 +878,16 @@ class CoreExport Module : public Extensible
*/
virtual void OnChangeCoreDisplay(NickCore *nc, const Anope::string &newdisplay) { }
/** called from ns_register.c, after the NickRequest have been created
* @param nr pointer to the NickRequest
*/
virtual void OnMakeNickRequest(NickRequest *nr) { }
/** called on delnickrequest()
* @param nr pointer to the NickRequest
*/
virtual void OnDelNickRequest(NickRequest *nr) { }
/** called from NickCore::ClearAccess()
* @param nc pointer to the NickCore
*/
@@ -886,57 +905,12 @@ class CoreExport Module : public Extensible
*/
virtual void OnNickEraseAccess(NickCore *nc, const Anope::string &entry) { }
/** called from NickCore::ClearCert()
* @param nc pointer to the NickCore
*/
virtual void OnNickClearCert(NickCore *nc) { }
/** Called when a user adds an entry to their cert list
* @param nc The nick
* @param entry The entry
*/
virtual void OnNickAddCert(NickCore *nc, const Anope::string &entry) { }
/** Called from NickCore::EraseCert()
* @param nc pointer to the NickCore
* @param entry The fingerprint
*/
virtual void OnNickEraseCert(NickCore *nc, const Anope::string &entry) { }
/** Called when a user requests info for a nick
* @param source The user requesting info
* @param u The user requesting info
* @param na The nick the user is requesting info from
* @param ShowHidden true if we should show the user everything
*/
virtual void OnNickInfo(CommandSource &source, NickAlias *na, bool ShowHidden) { }
/** Called in findnick()
* Useful to modify the na returned by findnick()
* @param nick The nick being looked up
*/
virtual void OnFindNick(const Anope::string &nick) { }
/** Called in findcore()
* Useful to modify the nc returned by findcore()
* @param nick The nick being looked up
*/
virtual void OnFindCore(const Anope::string &nick) { }
/** Check whether a users password is correct.
* @param u The user
* @param command The command the user is doing
* @param params Command params
* @param account The account the password should be checked against
* @param password The password
* @return EVENT_ALLOW to allow the password, EVENT_STOP to stop processing completely
*/
virtual EventReturn OnCheckAuthentication(User *u, Command *c, const std::vector<Anope::string> &params, const Anope::string &account, const Anope::string &password) { return EVENT_CONTINUE; }
/** Called when we get informed about a users SSL fingerprint
* when we call this, the fingerprint should already be stored in the user struct
* @param u pointer to the user
*/
virtual void OnFingerprint(User *u) { }
virtual void OnNickInfo(User *u, NickAlias *na, bool ShowHidden) { }
/** Called when a vhost is deleted
* @param na The nickalias of the vhost
@@ -1017,18 +991,20 @@ class CoreExport Module : public Extensible
virtual void OnUserModeAdd(UserMode *um) { }
/** Called when a mode is about to be mlocked
* @param ci The channel the mode is being locked on
* @param lock The mode lock
* @param ci The channel
* @param Name The mode being mlocked
* @param status true if its being mlocked +, false for -
* @param param The param, if there is one and if status is true
* @return EVENT_CONTINUE to let other modules decide, EVENT_STOP to deny the mlock.
*/
virtual EventReturn OnMLock(ChannelInfo *ci, ModeLock *lock) { return EVENT_CONTINUE; }
virtual EventReturn OnMLock(ChannelInfo *ci, ChannelModeName Name, bool status, const Anope::string &param) { return EVENT_CONTINUE; }
/** Called when a mode is about to be unlocked
* @param ci The channel the mode is being unlocked from
* @param mode The mode being unlocked
* @param ci The channel
* @param Name The mode being mlocked
* @return EVENT_CONTINUE to let other modules decide, EVENT_STOP to deny the mlock.
*/
virtual EventReturn OnUnMLock(ChannelInfo *ci, ChannelMode *mode, const Anope::string &param) { return EVENT_CONTINUE; }
virtual EventReturn OnUnMLock(ChannelInfo *ci, ChannelModeName Name) { return EVENT_CONTINUE; }
/** Called after a module is loaded
* @param u The user loading the module, can be NULL
@@ -1051,28 +1027,6 @@ class CoreExport Module : public Extensible
* @param s Our uplink
*/
virtual void OnUplinkSync(Server *s) { }
/** Called when we receive a PRIVMSG for one of our clients
* @param u The user sending the PRIVMSG
* @param bi The target of the PRIVMSG
* @param message The message
* @return EVENT_STOP to halt processing
*/
virtual EventReturn OnBotPrivmsg(User *u, BotInfo *bi, const Anope::string &message) { return EVENT_CONTINUE; }
/** Called when we receive a PRIVMSG for a registered channel we are in
* @param u The source of the message
* @param ci The channel
* @param msg The message
* @param Allow set to false to make the flood kickers halt
* @return MOD_STOP to stop processing completely
*/
virtual EventReturn OnPrivmsg(User *u, ChannelInfo *ci, Anope::string &msg, bool &Allow) { return EVENT_CONTINUE; }
/** Called when any object is destroyed
* @param b The object
*/
virtual void OnObjectDestroy(Base *b) { }
};
/** Implementation-specific flags which may be set in ModuleManager::Attach()
@@ -1084,19 +1038,18 @@ enum Implementation
I_OnPreNickExpire, I_OnNickExpire, I_OnNickForbidden, I_OnNickGroup, I_OnNickLogout, I_OnNickIdentify, I_OnNickDrop,
I_OnNickRegister, I_OnNickSuspended, I_OnNickUnsuspended,
I_OnDelNick, I_OnDelCore, I_OnChangeCoreDisplay,
I_OnNickClearAccess, I_OnNickAddAccess, I_OnNickEraseAccess,
I_OnNickClearCert, I_OnNickAddCert, I_OnNickEraseCert,
I_OnNickInfo, I_OnFindNick, I_OnFindCore, I_OnCheckAuthentication,
I_OnDelNickRequest, I_OnMakeNickRequest, I_OnNickClearAccess, I_OnNickAddAccess, I_OnNickEraseAccess,
I_OnNickInfo,
/* ChanServ */
I_OnChanForbidden, I_OnChanSuspend, I_OnChanDrop, I_OnPreChanExpire, I_OnChanExpire, I_OnAccessAdd, I_OnAccessChange,
I_OnAccessDel, I_OnAccessClear, I_OnLevelChange, I_OnChanRegistered, I_OnChanUnsuspend, I_OnDelChan, I_OnChannelCreate,
I_OnChannelDelete, I_OnAkickAdd, I_OnAkickDel,
I_OnChanInfo, I_OnFindChan,
I_OnChanInfo,
/* BotServ */
I_OnBotJoin, I_OnBotKick, I_OnBotCreate, I_OnBotChange, I_OnBotDelete, I_OnBotAssign, I_OnBotUnAssign,
I_OnUserKicked, I_OnBotFantasy, I_OnBotNoFantasyAccess, I_OnBotBan, I_OnBadWordAdd, I_OnBadWordDel, I_OnFindBot,
I_OnUserKicked, I_OnBotFantasy, I_OnBotNoFantasyAccess, I_OnBotBan, I_OnBadWordAdd, I_OnBadWordDel,
/* HostServ */
I_OnSetVhost, I_OnDeleteVhost,
@@ -1106,7 +1059,7 @@ enum Implementation
/* Users */
I_OnPreUserConnect, I_OnUserConnect, I_OnUserNickChange, I_OnUserQuit, I_OnUserLogoff, I_OnPreJoinChannel,
I_OnJoinChannel, I_OnPrePartChannel, I_OnPartChannel, I_OnFingerprint,
I_OnJoinChannel, I_OnPrePartChannel, I_OnPartChannel,
/* OperServ */
I_OnDefconLevel, I_OnAddAkill, I_OnDelAkill, I_OnExceptionAdd, I_OnExceptionDel,
@@ -1124,9 +1077,9 @@ enum Implementation
I_OnReload, I_OnPreServerConnect, I_OnNewServer, I_OnServerConnect, I_OnPreUplinkSync, I_OnServerDisconnect, I_OnPreCommandRun,
I_OnPreCommand, I_OnPostCommand, I_OnPreDatabaseExpire, I_OnPreRestart, I_OnRestart, I_OnPreShutdown, I_OnShutdown, I_OnSignal,
I_OnServerQuit, I_OnTopicUpdated,
I_OnEncrypt, I_OnDecrypt,
I_OnEncrypt, I_OnEncryptCheckLen, I_OnDecrypt, I_OnCheckPassword,
I_OnChannelModeSet, I_OnChannelModeUnset, I_OnUserModeSet, I_OnUserModeUnset, I_OnChannelModeAdd, I_OnUserModeAdd,
I_OnMLock, I_OnUnMLock, I_OnServerSync, I_OnUplinkSync, I_OnBotPrivmsg, I_OnPrivmsg, I_OnObjectDestroy,
I_OnMLock, I_OnUnMLock, I_OnServerSync, I_OnUplinkSync,
I_END
};
+6 -8
View File
@@ -1,6 +1,6 @@
/* OperServ support
*
* (C) 2008-2011 Anope Team
* (C) 2008-2010 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
@@ -180,10 +180,8 @@ class CoreExport XLineManager
virtual void OnExpire(XLine *x);
/** Called to send an XLine to the IRCd
* @param u The user, if we know it
* @param x The xline
*/
virtual void Send(User *u, XLine *x) = 0;
virtual void Send(XLine *x) = 0;
};
/* This is for AKILLS */
@@ -198,7 +196,7 @@ class SGLineManager : public XLineManager
void OnExpire(XLine *x);
void Send(User *u, XLine *x);
void Send(XLine *x);
};
class SNLineManager : public XLineManager
@@ -212,7 +210,7 @@ class SNLineManager : public XLineManager
void OnExpire(XLine *x);
void Send(User *u, XLine *x);
void Send(XLine *x);
XLine *Check(User *u);
};
@@ -228,7 +226,7 @@ class SQLineManager : public XLineManager
void OnExpire(XLine *x);
void Send(User *u, XLine *x);
void Send(XLine *x);
static bool Check(Channel *c);
};
@@ -244,7 +242,7 @@ class SZLineManager : public XLineManager
void OnExpire(XLine *x);
void Send(User *u, XLine *x);
void Send(XLine *x);
};
#endif // OPERSERV_H
+2 -37
View File
@@ -1,6 +1,6 @@
/*
* Copyright (C) 2008-2011 Robin Burchell <w00t@inspircd.org>
* Copyright (C) 2008-2011 Anope Team <team@anope.org>
* Copyright (C) 2008-2010 Robin Burchell <w00t@inspircd.org>
* Copyright (C) 2008-2010 Anope Team <team@anope.org>
*
* Please read COPYING and README for further details.
*/
@@ -10,25 +10,6 @@
#include "hashcomp.h"
class OperType;
struct Oper
{
Anope::string name;
Anope::string password;
Anope::string certfp;
OperType *ot;
Oper(const Anope::string &n, const Anope::string &p, const Anope::string &c, OperType *o) :
name(n), password(p), certfp(c), ot(o) { }
/** Find an oper block by name
* @param name The name
* @return the oper block
*/
static Oper *Find(const Anope::string &name);
};
class CoreExport OperType
{
private:
@@ -55,12 +36,6 @@ class CoreExport OperType
*/
std::set<OperType *> inheritances;
public:
/** Find an oper type by name
* @param name The name
* @return The oper type
*/
static OperType *Find(const Anope::string &name);
/** Create a new opertype of the given name.
* @param nname The opertype name, e.g. "sra".
*/
@@ -96,16 +71,6 @@ class CoreExport OperType
* @param ot The opertype to inherit from
*/
void Inherits(OperType *ot);
/** Gets the icommands for this opertype
* @return A list of commands
*/
const std::list<Anope::string> &GetCommands() const;
/** Gets the privileges for this opertype
* @return A list of privileges
*/
const std::list<Anope::string> &GetPrivs() const;
};
#endif // OPERTYPE_H
+33 -122
View File
@@ -1,6 +1,6 @@
/* Modular support
*
* (C) 2008-2011 Anope Team
* (C) 2008-2010 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
@@ -62,70 +62,15 @@ enum ChannelInfoFlag
CI_END
};
const Anope::string ChannelInfoFlagStrings[] = {
"BEGIN", "INHABIT", "KEEPTOPIC", "SECUREOPS", "PRIVATE", "TOPICLOCK", "RESTRICTED",
"PEACE", "SECURE", "FORBIDDEN", "NO_EXPIRE", "MEMO_HARDMAX", "OPNOTICE", "SECUREFOUNDER",
"SIGNKICK", "SIGNKICK_LEVEL", "XOP", "SUSPENDED", "PERSIST", ""
};
class CoreExport ChanAccess
{
Anope::string mask; /* Mask of the access entry */
public:
int16 level;
NickCore *nc; /* NC of the entry, if the entry is a valid nickcore */
time_t last_seen;
Anope::string creator;
ChanAccess(const Anope::string &umask);
const Anope::string &GetMask();
};
/** Flags for auto kick
*/
enum AutoKickFlag
{
/* Is by nick core, not mask */
AK_ISNICK
};
const Anope::string AutoKickFlagString[] = { "AK_ISNICK", "" };
/* AutoKick data. */
class AutoKick : public Flags<AutoKickFlag>
{
public:
AutoKick() : Flags<AutoKickFlag>(AutoKickFlagString) { }
/* Only one of these can be in use */
Anope::string mask;
NickCore *nc;
Anope::string reason;
Anope::string creator;
time_t addtime;
time_t last_used;
};
struct ModeLock
{
bool set;
ChannelModeName name;
Anope::string param;
Anope::string setter;
time_t created;
ModeLock(bool s, ChannelModeName n, const Anope::string &p, const Anope::string &se = "", time_t c = Anope::CurTime) : set(s), name(n), param(p), setter(se), created(c) { }
};
class CoreExport ChannelInfo : public Extensible, public Flags<ChannelInfoFlag, CI_END>
{
private:
typedef std::multimap<ChannelModeName, ModeLock> ModeList;
private:
std::map<ChannelModeName, Anope::string> Params; /* Map of parameters by mode name for mlock */
std::vector<ChanAccess *> access; /* List of authorized users */
std::vector<AutoKick *> akick; /* List of users to kickban */
std::vector<BadWord *> badwords; /* List of badwords */
ModeList mode_locks;
Flags<ChannelModeName, CMODE_END * 2> mlock_on; /* Modes mlocked on */
Flags<ChannelModeName, CMODE_END * 2> mlock_off; /* Modes mlocked off */
public:
/** Default constructor
@@ -133,11 +78,6 @@ class CoreExport ChannelInfo : public Extensible, public Flags<ChannelInfoFlag,
*/
ChannelInfo(const Anope::string &chname);
/** Copy constructor
* @param ci The ChannelInfo to copy settings to
*/
ChannelInfo(ChannelInfo *ci);
/** Default destructor
*/
~ChannelInfo();
@@ -154,13 +94,14 @@ class CoreExport ChannelInfo : public Extensible, public Flags<ChannelInfoFlag,
Anope::string last_topic_setter; /* Setter */
time_t last_topic_time; /* Time */
// These two should be using extensible
Anope::string forbidby;
Anope::string forbidreason;
int16 bantype;
int16 *levels; /* Access levels for commands */
Anope::string entry_message; /* Notice sent on entering channel */
MemoInfo memos;
Channel *c; /* Pointer to channel record (if channel is currently in use) */
@@ -177,15 +118,14 @@ class CoreExport ChannelInfo : public Extensible, public Flags<ChannelInfoFlag,
/** Add an entry to the channel access list
*
* @param mask The mask of the access entry
* @param nc The NickCore of the user that the access entry should be tied to
* @param level The channel access level the user has on the channel
* @param creator The user who added the access
* @param last_seen When the user was last seen within the channel
* @return The new access class
*
* Creates a new access list entry and inserts it into the access list.
*/
ChanAccess *AddAccess(const Anope::string &mask, int16 level, const Anope::string &creator, int32 last_seen = 0);
void AddAccess(NickCore *nc, int16 level, const Anope::string &creator, int32 last_seen = 0);
/** Get an entry from the channel access list by index
*
@@ -196,36 +136,15 @@ class CoreExport ChannelInfo : public Extensible, public Flags<ChannelInfoFlag,
*/
ChanAccess *GetAccess(unsigned index);
/** Get an entry from the channel access list by User
*
* @param u The User to find within the access list vector
* @param level Optional channel access level to compare the access entries to
* @return A ChanAccess struct corresponding to the User, or NULL if not found
*
* Retrieves an entry from the access list that matches the given User, optionally also matching a certain level.
*/
ChanAccess *GetAccess(User *u, int16 level = 0);
/** Get an entry from the channel access list by NickCore
*
* @param u The NickCore to find within the access list vector
* @param nc The NickCore to find within the access list vector
* @param level Optional channel access level to compare the access entries to
* @return A ChanAccess struct corresponding to the NickCore, or NULL if not found
*
* Retrieves an entry from the access list that matches the given NickCore, optionally also matching a certain level.
*/
ChanAccess *GetAccess(NickCore *nc, int16 level = 0);
/** Get an entry from the channel access list by mask
*
* @param u The mask to find within the access list vector
* @param level Optional channel access level to compare the access entries to
* @param wildcard True to match using wildcards
* @return A ChanAccess struct corresponding to the mask, or NULL if not found
*
* Retrieves an entry from the access list that matches the given mask, optionally also matching a certain level.
*/
ChanAccess *GetAccess(const Anope::string &mask, int16 level = 0, bool wildcard = true);
ChanAccess *GetAccess(const NickCore *nc, int16 level = 0);
/** Get the size of the accss vector for this channel
* @return The access vector size
@@ -240,14 +159,6 @@ class CoreExport ChannelInfo : public Extensible, public Flags<ChannelInfoFlag,
*/
void EraseAccess(unsigned index);
/** Erase an entry from the channel access list
*
* @param taccess The access to remove
*
* Clears the memory used by the given access entry and removes it from the vector.
*/
void EraseAccess(ChanAccess *taccess);
/** Clear the entire channel access list
*
* Clears the entire access list by deleting every item and then clearing the vector.
@@ -325,51 +236,51 @@ class CoreExport ChannelInfo : public Extensible, public Flags<ChannelInfoFlag,
void LoadMLock();
/** Check if a mode is mlocked
* @param mode The mode
* @param An optional param
* @param Name The mode
* @param status True to check mlock on, false for mlock off
* @return true on success, false on fail
*/
bool HasMLock(ChannelMode *mode, const Anope::string &param, bool status) const;
bool HasMLock(ChannelModeName Name, bool status) const;
/** Set a mlock
* @param mode The mode
* @param Name The mode
* @param status True for mlock on, false for mlock off
* @param param An optional param arg for + mlocked modes
* @param setter Who is setting the mlock
* @param created When the mlock was created
* @return true on success, false on failure (module blocking)
*/
bool SetMLock(ChannelMode *mode, bool status, const Anope::string &param = "", Anope::string setter = "", time_t created = Anope::CurTime);
bool SetMLock(ChannelModeName Name, bool status, const Anope::string &param = "");
/** Remove a mlock
* @param mode The mode
* @param param The param of the mode, required if it is a list or status mode
* @return true on success, false on failure
* @param Name The mode
* @return true on success, false on failure (module blcoking)
*/
bool RemoveMLock(ChannelMode *mode, const Anope::string &param = "");
bool RemoveMLock(ChannelModeName Name);
/** Clear all mlocks on the channel
*/
void ClearMLock();
/** Get all of the mlocks for this channel
* @return The mlocks
/** Get the number of mlocked modes for this channel
* @param status true for mlock on, false for mlock off
* @return The number of mlocked modes
*/
const std::multimap<ChannelModeName, ModeLock> &GetMLock() const;
size_t GetMLockCount(bool status) const;
/** Get a list of modes on a channel
* @param Name The mode name to get a list of
* @return a pair of iterators for the beginning and end of the list
/** Get a param from the channel
* @param Name The mode
* @param Target a string to put the param into
* @return true on success
*/
std::pair<ModeList::iterator, ModeList::iterator> GetModeList(ChannelModeName Name);
bool GetParam(ChannelModeName Name, Anope::string &Target) const;
/** Get details for a specific mlock
* @param mname The mode name
* @param An optional param to match with
* @return The MLock, if any
/** Check if a mode is set and has a param
* @param Name The mode
*/
ModeLock *GetMLock(ChannelModeName mname, const Anope::string &param = "");
bool HasParam(ChannelModeName Name) const;
/** Clear all the params from the channel
*/
void ClearParams();
/** Check whether a user is permitted to be on this channel
* @param u The user
+33 -2
View File
@@ -4,7 +4,10 @@
/* Anope */
extern CoreExport Server *Me;
extern CoreExport void CapabParse(const std::vector<Anope::string> &params);
extern CoreExport void do_server(const Anope::string &source, const Anope::string &servername, unsigned int hops, const Anope::string &descript, const Anope::string &numeric);
extern CoreExport void do_squit(const Anope::string &source, const Anope::string &server);
extern CoreExport const char *ts6_uid_retrieve();
extern CoreExport const char *ts6_sid_retrieve();
@@ -18,7 +21,33 @@ enum CapabType
CAPAB_NOQUIT,
CAPAB_TSMODE,
CAPAB_UNCONNECT,
CAPAB_NICKIP,
CAPAB_NSJOIN,
CAPAB_ZIP,
CAPAB_BURST,
CAPAB_TS3,
CAPAB_TS5,
CAPAB_DKEY,
CAPAB_DOZIP,
CAPAB_DODKEY,
CAPAB_QS,
CAPAB_SCS,
CAPAB_PT4,
CAPAB_UID,
CAPAB_KNOCK,
CAPAB_CLIENT,
CAPAB_IPV6,
CAPAB_SSJ5,
CAPAB_SN2,
CAPAB_VHOST,
CAPAB_TOKEN,
CAPAB_SSJ3,
CAPAB_NICK2,
CAPAB_VL,
CAPAB_TLKEXT,
CAPAB_CHANMODE,
CAPAB_SJB64,
CAPAB_NICKCHARS,
CAPAB_END
};
@@ -44,8 +73,6 @@ enum ServerFlag
SERVER_JUPED
};
const Anope::string ServerFlagStrings[] = { "SERVER_NONE", "SERVER_SYNCING", "SERVER_JUPED", "" };
/** Class representing a server
*/
class CoreExport Server : public Flags<ServerFlag>
@@ -132,6 +159,10 @@ class CoreExport Server : public Flags<ServerFlag>
*/
void DelLink(Server *s);
/** Remove all links from this server
*/
void ClearLinks();
/** Finish syncing this server and optionally all links to it
* @param SyncLinks True to sync the links for this server too (if any)
*/
+138 -135
View File
@@ -1,9 +1,9 @@
/*
*
* (C) 2003-2011 Anope Team
* (C) 2003-2010 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
* 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.
@@ -43,13 +43,6 @@
#include <fcntl.h>
#include <typeinfo>
#if GETTEXT_FOUND
# include <libintl.h>
# define _(x) anope_gettext(x)
#else
# define _(x) x
#endif
#ifndef _WIN32
# include <unistd.h>
# include <grp.h>
@@ -57,7 +50,6 @@
# include <netinet/in.h>
# include <arpa/inet.h>
# include <sys/socket.h>
# include <sys/time.h>
# include <dirent.h>
# ifdef HAVE_BACKTRACE
# include <execinfo.h>
@@ -67,7 +59,31 @@
# define MARK_DEPRECATED __attribute((deprecated))
# define DeleteFile unlink
#else
# include "anope_windows.h"
# include <winsock2.h>
# include <ws2tcpip.h>
# include <windows.h>
# include <sys/timeb.h>
# include <direct.h>
# include <io.h>
# ifdef MODULE_COMPILE
# define CoreExport __declspec(dllimport)
# define DllExport __declspec(dllexport)
# else
# define CoreExport __declspec(dllexport)
# define DllExport __declspec(dllimport)
# endif
/* VS2008 hates having this define before its own */
# define vsnprintf _vsnprintf
/* We have our own inet_pton and inet_ntop (Windows doesn't have its own) */
# define inet_pton inet_pton_
# define inet_ntop inet_ntop_
# define setenv(x, y, z) SetEnvironmentVariable(x, y)
# define unsetenv(x) SetEnvironmentVariable(x, NULL)
# define MARK_DEPRECATED
extern CoreExport USHORT WindowsGetLanguage(const char *lang);
extern CoreExport int inet_pton(int af, const char *src, void *dst);
extern CoreExport const char *inet_ntop(int af, const void *src, char *dst, size_t size);
#endif
/* Telling compilers about printf()-like functions: */
@@ -77,10 +93,18 @@
# define FORMAT(type, fmt, start)
#endif
#ifdef HAVE_GETTIMEOFDAY
# include <sys/time.h>
#endif
#if HAVE_STRINGS_H
# include <strings.h>
#endif
#if HAVE_SYS_SELECT_H
# include <sys/select.h>
#endif
#ifdef _AIX
/* Some AIX boxes seem to have bogus includes that don't have these
* prototypes. */
@@ -104,6 +128,18 @@ extern int strncasecmp(const char *, const char *, size_t);
#define tolower tolower_
#define toupper toupper_
#ifdef __WINS__
# ifndef BKCHECK
# define BKCHECK
extern "C" void __pfnBkCheck() {}
# endif
#endif
#if INTTYPE_WORKAROUND
# undef int16
# undef int32
#endif
/** This definition is used as shorthand for the various classes
* and functions needed to make a module loadable by the OS.
* It defines the class factory and external AnopeInit and AnopeFini functions.
@@ -269,11 +305,8 @@ template<typename T, size_t Size = 32> class Flags
{
protected:
std::bitset<Size> Flag_Values;
const Anope::string *Flag_Strings;
public:
Flags(const Anope::string *flag_strings) : Flag_Strings(flag_strings) { }
/** Add a flag to this item
* @param Value The flag
*/
@@ -313,23 +346,6 @@ template<typename T, size_t Size = 32> class Flags
{
Flag_Values.reset();
}
std::vector<Anope::string> ToString()
{
std::vector<Anope::string> ret;
for (unsigned i = 0; this->Flag_Strings && !this->Flag_Strings[i].empty(); ++i)
if (this->HasFlag(static_cast<T>(i)))
ret.push_back(this->Flag_Strings[i]);
return ret;
}
void FromString(const std::vector<Anope::string> &strings)
{
for (unsigned i = 0; this->Flag_Strings && !this->Flag_Strings[i].empty(); ++i)
for (unsigned j = 0; j < strings.size(); ++j)
if (this->Flag_Strings[i] == strings[j])
this->SetFlag(static_cast<T>(i));
}
};
#include "sockets.h"
@@ -340,20 +356,12 @@ template<typename T, size_t Size = 32> class Flags
/*************************************************************************/
class ConvertException : public CoreException
{
public:
ConvertException(const Anope::string &reason = "") : CoreException(reason) { }
virtual ~ConvertException() throw() { }
};
template<typename T> inline Anope::string stringify(const T &x)
{
std::ostringstream stream;
if (!(stream << x))
throw ConvertException("Stringify fail");
throw CoreException("Stringify fail");
return stream.str();
}
@@ -365,11 +373,11 @@ template<typename T> inline void convert(const Anope::string &s, T &x, Anope::st
char c;
bool res = i >> x;
if (!res)
throw ConvertException("Convert fail");
throw CoreException("Convert fail");
if (failIfLeftoverChars)
{
if (i.get(c))
throw ConvertException("Convert fail");
throw CoreException("Convert fail");
}
else
{
@@ -404,11 +412,12 @@ template<typename T> inline T convertTo(const Anope::string &s, bool failIfLefto
class User;
class NickCore;
class NickAlias;
class NickRequest;
class BotInfo;
class ChannelInfo;
class Channel;
class Server;
class Entry;
struct EList;
struct Session;
#include "threadengine.h"
@@ -423,6 +432,7 @@ struct IRCDVar
{
const char *name; /* Name of the IRCd command */
const char *pseudoclient_mode; /* Mode used by BotServ Bots */
int max_symbols; /* Chan Max Symbols */
int svsnick; /* Supports SVSNICK */
int vhost; /* Supports vhost */
int snline; /* Supports SNline */
@@ -431,6 +441,8 @@ struct IRCDVar
int join2msg; /* Join 2 Message */
int chansqline; /* Supports Channel Sqlines */
int quitonkill; /* IRCD sends QUIT when kill */
int svsmode_unban; /* svsmode can be used to unban */
int reversekickcheck; /* Can reverse ban check */
int vident; /* Supports vidents */
int svshold; /* Supports svshold */
int tsonmode; /* Timestamp on mode changes */
@@ -440,9 +452,11 @@ struct IRCDVar
int svsmode_ucmode; /* Can remove User Channel Modes with SVSMODE */
int sglineenforce;
int ts6; /* ircd is TS6 */
int cidrchanbei; /* channel bans/excepts/invites support CIDR (syntax: +b *!*@192.168.0.0/15)
* 0 for no support, 1 for strict cidr support, anything else
* for ircd specific support (nefarious only cares about first /mask) */
const char *globaltldprefix; /* TLD prefix used for Global */
unsigned maxmodes; /* Max modes to send per line */
int certfp; /* IRCd sends a SSL users certificate fingerprint */
};
/*************************************************************************/
@@ -453,22 +467,17 @@ enum MemoFlag
{
/* Memo is unread */
MF_UNREAD,
/* Sender requests a receipt */
/* SEnder requests a receipt */
MF_RECEIPT,
/* Memo is a notification of receipt */
MF_NOTIFYS
};
const Anope::string MemoFlagStrings[] = {
"MF_UNREAD", "MF_RECEIPT", "MF_NOTIFYS", ""
};
/* Memo info structures. Since both nicknames and channels can have memos,
* we encapsulate memo data in a MemoList to make it easier to handle. */
class CoreExport Memo : public Flags<MemoFlag>
class Memo : public Flags<MemoFlag>
{
public:
Memo();
time_t time; /* When it was sent */
Anope::string sender;
Anope::string text;
@@ -478,12 +487,10 @@ struct CoreExport MemoInfo
{
int16 memomax;
std::vector<Memo *> memos;
std::vector<ci::string> ignores;
unsigned GetIndex(Memo *m) const;
void Del(unsigned index);
void Del(Memo *m);
bool HasIgnore(User *u);
};
/*************************************************************************/
@@ -557,6 +564,44 @@ enum AccessLevel
ACCESS_QOP = 10000
};
/* Channel info structures. Stored similarly to the nicks, except that
* the second character of the channel name, not the first, is used to
* determine the list. (Hashing based on the first character of the name
* wouldn't get very far. ;) ) */
/* Access levels for users. */
struct ChanAccess
{
int16 level;
NickCore *nc; /* Guaranteed to be non-NULL if in use, NULL if not */
time_t last_seen;
Anope::string creator;
};
/** Flags for auto kick
*/
enum AutoKickFlag
{
/* Is by nick core, not mask */
AK_ISNICK,
/* This entry is stuck */
AK_STUCK
};
/* AutoKick data. */
class AutoKick : public Flags<AutoKickFlag>
{
public:
/* Only one of these can be in use */
Anope::string mask;
NickCore *nc;
Anope::string reason;
Anope::string creator;
time_t addtime;
time_t last_used;
};
/** Flags for badwords
*/
enum BadWordType
@@ -586,9 +631,11 @@ enum ChannelAccess
CA_SET, /* but not FOUNDER or PASSWORD */
CA_UNBAN,
CA_AUTOOP,
CA_AUTODEOP, /* Maximum, not minimum */
CA_AUTOVOICE,
CA_OPDEOP, /* ChanServ commands OP and DEOP */
CA_ACCESS_LIST,
CA_CLEAR,
CA_NOJOIN, /* Maximum */
CA_ACCESS_CHANGE,
CA_MEMO,
@@ -614,7 +661,6 @@ enum ChannelAccess
CA_BANME,
CA_BAN,
CA_TOPIC,
CA_MODE,
CA_INFO,
CA_AUTOOWNER,
CA_OWNER,
@@ -657,24 +703,9 @@ enum BotServFlag
BS_KICK_REPEAT,
/* BotServ kicks for italics */
BS_KICK_ITALICS,
/* BotServ kicks for amsgs */
BS_KICK_AMSGS,
/* Send fantasy replies back to the channel via PRIVMSG */
BS_MSG_PRIVMSG,
/* Send fantasy replies back to the channel via NOTICE */
BS_MSG_NOTICE,
/* Send fantasy replies back to the channel via NOTICE to ops */
BS_MSG_NOTICEOPS,
BS_END
};
const Anope::string BotServFlagStrings[] = {
"BEGIN", "DONTKICKOPS", "DONTKICKVOICES", "FANTASY", "SYMBIOSIS", "GREET", "NOBOT",
"KICK_BOLDs", "KICK_COLORS", "KICK_REVERSES", "KICK_UNDERLINES", "KICK_BADWORDS", "KICK_CAPS",
"KICK_FLOOD", "KICK_REPEAT", "KICK_ITALICS", "KICK_AMSGS", "MSG_PRIVMSG", "MSG_NOTICE",
"MSG_NOTICEOPS", ""
};
/* Indices for TTB (Times To Ban) */
enum
{
@@ -687,7 +718,6 @@ enum
TTB_FLOOD,
TTB_REPEAT,
TTB_ITALICS,
TTB_AMSGS,
TTB_SIZE
};
@@ -699,6 +729,7 @@ enum
* user is kicked.
*/
#include "language.h"
#include "users.h"
#include "account.h"
#include "bots.h"
@@ -714,7 +745,7 @@ struct LevelInfo
{
int what;
Anope::string name;
const char *desc;
LanguageString desc;
};
#include "channels.h"
@@ -724,7 +755,7 @@ struct LevelInfo
enum EntryType
{
ENTRYTYPE_NONE,
ENTRYTYPE_CIDR,
ENTRYTYPE_CIDR4,
ENTRYTYPE_NICK_WILD,
ENTRYTYPE_NICK,
ENTRYTYPE_USER_WILD,
@@ -733,32 +764,29 @@ enum EntryType
ENTRYTYPE_HOST
};
class CoreExport Entry : public Flags<EntryType>
class Entry : public Flags<EntryType>
{
ChannelModeName modename;
public:
unsigned char cidr_len;
Entry *next, *prev;
uint32 cidr_ip; /* IP mask for CIDR matching */
uint32 cidr_mask; /* Netmask for CIDR matching */
Anope::string nick, user, host, mask;
};
struct EList
{
Entry *entries;
int32 count;
};
/*************************************************************************/
/* Ignorance list data. */
struct IgnoreData
{
Anope::string mask;
Anope::string nick, user, host;
/** Constructor
* @param _host A full nick!ident@host/cidr mask
* @param mode What mode this host is for - can be CMODE_BEGIN for unknown/no mode
*/
Entry(ChannelModeName mode, const Anope::string &_host);
/** Get the banned mask for this entry
* @return The mask
*/
const Anope::string GetMask();
/** Check if this entry matches a user
* @param u The user
* @param full True to match against a users real host and IP
* @return true on match
*/
bool Matches(User *u, bool full = false) const;
time_t time; /* When do we stop ignoring them? */
};
/*************************************************************************/
@@ -776,7 +804,7 @@ struct NewsMessages
{
NewsType type;
Anope::string name;
const char *msgs[10];
LanguageString msgs[10];
};
struct NewsItem
@@ -797,6 +825,7 @@ struct MailInfo
FILE *pipe;
User *sender;
NickCore *recipient;
NickRequest *recip;
};
/*************************************************************************/
@@ -813,7 +842,8 @@ struct Exception
/*************************************************************************/
extern CoreExport Anope::map<Session *> SessionList;
typedef unordered_map_namespace::unordered_map<Anope::string, Session *, Anope::hash> session_map;
extern CoreExport session_map SessionList;
struct Session
{
@@ -856,13 +886,10 @@ enum DefconLevel
* Forward declaration reqired, because the base IRCDProto class uses some crap from in here.
*/
class IRCDProto;
class IRCdMessage;
struct Uplink;
class ServerConfig;
class ConfigurationFile;
#include "extern.h"
#include "language.h"
#include "operserv.h"
#include "mail.h"
#include "servers.h"
@@ -891,9 +918,10 @@ class CoreExport IRCDProto
virtual void SendSVSNOOP(const Anope::string &, int) { }
virtual void SendTopic(BotInfo *, Channel *) = 0;
virtual void SendVhostDel(User *) { }
virtual void SendAkill(User *, const XLine *) = 0;
virtual void SendAkill(const XLine *) = 0;
virtual void SendAkillDel(const XLine *) = 0;
virtual void SendSVSKill(const BotInfo *source, const User *user, const char *fmt, ...);
virtual void SendSVSMode(const User *, int, const char **) = 0;
virtual void SendMode(const BotInfo *bi, const Channel *dest, const char *fmt, ...);
virtual void SendMode(const BotInfo *bi, const User *u, const char *fmt, ...);
virtual void SendClientIntroduction(const User *u, const Anope::string &) = 0;
@@ -909,12 +937,13 @@ class CoreExport IRCDProto
virtual void SendQuit(const User *u, const char *fmt, ...);
virtual void SendPing(const Anope::string &servname, const Anope::string &who);
virtual void SendPong(const Anope::string &servname, const Anope::string &who);
virtual void SendJoin(BotInfo *, Channel *, const ChannelStatus *) = 0;
virtual void SendSQLineDel(const XLine *x) { }
virtual void SendJoin(const BotInfo *, const Anope::string &, time_t) = 0;
virtual void SendJoin(BotInfo *, const ChannelContainer *);
virtual void SendSQLineDel(const XLine *x) = 0;
virtual void SendInvite(const BotInfo *bi, const Anope::string &chan, const Anope::string &nick);
virtual void SendPart(const BotInfo *bi, const Channel *chan, const char *fmt, ...);
virtual void SendGlobops(const BotInfo *source, const char *fmt, ...);
virtual void SendSQLine(User *, const XLine *x) { }
virtual void SendSQLine(const XLine *x) = 0;
virtual void SendSquit(const Anope::string &servname, const Anope::string &message);
virtual void SendSVSO(const Anope::string &, const Anope::string &, const Anope::string &) { }
virtual void SendChangeBotNick(const BotInfo *bi, const Anope::string &newnick);
@@ -925,11 +954,14 @@ class CoreExport IRCDProto
virtual void SendSVSHoldDel(const Anope::string &) { }
virtual void SendSGLineDel(const XLine *) { }
virtual void SendSZLineDel(const XLine *) { }
virtual void SendSZLine(User *u, const XLine *) { }
virtual void SendSGLine(User *, const XLine *) { }
virtual void SendSZLine(const XLine *) { }
virtual void SendSGLine(const XLine *) { }
virtual void SendBanDel(const Channel *, const Anope::string &) { }
virtual void SendSVSModeChan(const Channel *, const Anope::string &, const Anope::string &) { }
virtual void SendUnregisteredNick(const User *) { }
virtual void SendCTCP(const BotInfo *bi, const Anope::string &dest, const char *fmt, ...);
virtual void SendSVSJoin(const Anope::string &, const Anope::string &, const Anope::string &, const Anope::string &) { }
virtual void SendSVSPart(const Anope::string &, const Anope::string &, const Anope::string &) { }
virtual void SendSWhois(const Anope::string &, const Anope::string &, const Anope::string &) { }
virtual void SendBOB() { }
virtual void SendEOB() { }
@@ -954,35 +986,6 @@ class CoreExport IRCDProto
* @param u The user
*/
virtual void SetAutoIdentificationToken(User *u) { }
/** Send a channel creation message to the uplink.
* On most TS6 IRCds this is a SJOIN with no nick
*/
virtual void SendChannel(Channel *c) { }
};
class CoreExport IRCdMessage
{
public:
virtual bool On436(const Anope::string &, const std::vector<Anope::string> &);
virtual bool OnAway(const Anope::string &, const std::vector<Anope::string> &);
virtual bool OnJoin(const Anope::string &, const std::vector<Anope::string> &);
virtual bool OnKick(const Anope::string &, const std::vector<Anope::string> &);
virtual bool OnKill(const Anope::string &, const std::vector<Anope::string> &);
virtual bool OnMode(const Anope::string &, const std::vector<Anope::string> &) = 0;
virtual bool OnUID(const Anope::string &, const std::vector<Anope::string> &);
virtual bool OnNick(const Anope::string &, const std::vector<Anope::string> &) = 0;
virtual bool OnPart(const Anope::string &, const std::vector<Anope::string> &);
virtual bool OnPing(const Anope::string &, const std::vector<Anope::string> &);
virtual bool OnPrivmsg(const Anope::string &, const std::vector<Anope::string> &);
virtual bool OnQuit(const Anope::string &, const std::vector<Anope::string> &);
virtual bool OnServer(const Anope::string &, const std::vector<Anope::string> &) = 0;
virtual bool OnSQuit(const Anope::string &, const std::vector<Anope::string> &);
virtual bool OnTopic(const Anope::string &, const std::vector<Anope::string> &) = 0;
virtual bool OnWhois(const Anope::string &, const std::vector<Anope::string> &);
virtual bool OnCapab(const Anope::string &, const std::vector<Anope::string> &);
virtual bool OnSJoin(const Anope::string &, const std::vector<Anope::string> &) = 0;
virtual bool OnError(const Anope::string &, const std::vector<Anope::string> &);
};
/*************************************************************************/
+2 -2
View File
@@ -1,9 +1,9 @@
/*
*
* (C) 2003-2011 Anope Team
* (C) 2003-2010 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
* 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.
+4 -18
View File
@@ -1,9 +1,9 @@
/*
*
* (C) 2003-2011 Anope Team
* (C) 2003-2010 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
* 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.
@@ -80,18 +80,6 @@ union CoreExport sockaddrs
void ntop(int type, const void *src);
};
class CoreExport cidr
{
sockaddrs addr;
Anope::string cidr_ip;
unsigned char cidr_len;
public:
cidr(const Anope::string &ip);
cidr(const Anope::string &ip, unsigned char len);
Anope::string mask() const;
bool match(sockaddrs &other);
};
class SocketException : public CoreException
{
public:
@@ -121,8 +109,6 @@ enum SocketFlag
SF_WRITABLE
};
static const Anope::string SocketFlagStrings[] = { "SF_DEAD", "SF_WRITABLE", "" };
class Socket;
class ClientSocket;
class ListenSocket;
@@ -342,13 +328,13 @@ class CoreExport ConnectionSocket : public BufferedSocket
void Connect(const Anope::string &TargetHost, int Port, const Anope::string &BindHost = "");
};
class CoreExport ClientSocket : public BufferedSocket
class ClientSocket : public BufferedSocket
{
public:
/* Listen socket this connection came from */
ListenSocket *LS;
/* Clients address */
sockaddrs clientaddr;
public:
/** Constructor
* @param ls Listen socket this connection is from
+6
View File
@@ -8,16 +8,19 @@
#cmakedefine HAVE_STDINT_H 1
#cmakedefine HAVE_STDDEF_H 1
#cmakedefine HAVE_BACKTRACE 1
#cmakedefine HAVE_GETTIMEOFDAY 1
#cmakedefine HAVE_SETGRENT 1
#cmakedefine HAVE_STRCASECMP 1
#cmakedefine HAVE_STRICMP 1
#cmakedefine HAVE_STRINGS_H 1
#cmakedefine HAVE_STRLCAT 1
#cmakedefine HAVE_STRLCPY 1
#cmakedefine HAVE_SYS_SELECT_H 1
#cmakedefine HAVE_UMASK 1
#cmakedefine HAVE_EVENTFD 1
#cmakedefine GETTEXT_FOUND 1
#cmakedefine RUNGROUP "@RUNGROUP@"
#define LIBINTL "@LIBINTL_INCLUDE@"
#cmakedefine HAVE_UINT8_T 1
#cmakedefine HAVE_U_INT8_T 1
@@ -101,6 +104,9 @@ typedef unsigned long uint32;
#endif
#ifdef _WIN32
# ifdef MSVCPP
# define snprintf _snprintf
# endif
# define popen _popen
# define pclose _pclose
# define ftruncate _chsize
+1 -11
View File
@@ -45,7 +45,7 @@ class CoreExport Thread : public Extensible
{
private:
/* Set to true to tell the thread to finish and we are waiting for it */
bool exit;
bool Exit;
public:
/* Handle for this thread */
@@ -67,10 +67,6 @@ class CoreExport Thread : public Extensible
*/
void SetExitState();
/** Exit the thread. Note that the thread still must be joined to free resources!
*/
void Exit();
/** Returns the exit state of the thread
* @return true if we want to exit
*/
@@ -103,12 +99,6 @@ class CoreExport Mutex
/** Unlock the mutex, it must be locked first
*/
void Unlock();
/** Attempt to lock the mutex, will return true on success and false on fail
* Does not block
* @return true or false
*/
bool TryLock();
};
class CoreExport Condition : public Mutex
+2 -2
View File
@@ -1,9 +1,9 @@
/* Timer include stuff.
*
* (C) 2003-2011 Anope Team
* (C) 2003-2010 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
* 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.
*/
+24 -40
View File
@@ -1,6 +1,6 @@
/*
* Copyright (C) 2008-2011 Robin Burchell <w00t@inspircd.org>
* Copyright (C) 2008-2011 Anope Team <team@anope.org>
* Copyright (C) 2008-2010 Robin Burchell <w00t@inspircd.org>
* Copyright (C) 2008-2010 Anope Team <team@anope.org>
*
* Please read COPYING and README for further details.
*/
@@ -8,13 +8,18 @@
#ifndef USERS_H
#define USERS_H
extern CoreExport Anope::insensitive_map<User *> UserListByNick;
extern CoreExport Anope::map<User *> UserListByUID;
/* Hash maps used for users. Note UserListByUID will not be used on non-TS6 IRCds, and should never
* be assumed to have users
*/
typedef unordered_map_namespace::unordered_map<Anope::string, User *, ci::hash, std::equal_to<ci::string> > user_map;
typedef unordered_map_namespace::unordered_map<Anope::string, User *, Anope::hash> user_uid_map;
extern CoreExport user_map UserListByNick;
extern CoreExport user_uid_map UserListByUID;
class CoreExport ChannelStatus : public Flags<ChannelModeName, CMODE_END * 2>
{
public:
ChannelStatus();
Anope::string BuildCharPrefixList() const;
Anope::string BuildModePrefixList() const;
};
@@ -49,7 +54,6 @@ class CoreExport User : public Extensible
Anope::string vhost; /* User's virtual hostname */
Anope::string chost; /* User's cloaked hostname */
Anope::string realname; /* Realname */
Anope::string fingerprint; /* SSL Fingerprint */
sockaddrs ip; /* User's IP */
Server *server; /* Server user is connected to */
time_t timestamp; /* Timestamp of the nick */
@@ -86,7 +90,7 @@ class CoreExport User : public Extensible
/** Update the nickname of a user record accordingly, should be
* called from ircd protocol.
*/
void SetNewNick(const Anope::string &newnick);
virtual void SetNewNick(const Anope::string &newnick);
/** Update the displayed (vhost) of a user record.
* This is used (if set) instead of real host.
@@ -141,22 +145,25 @@ class CoreExport User : public Extensible
*/
Anope::string GetMask() const;
/** Get the full display mask (nick!vident@vhost/chost)
*/
Anope::string GetDisplayedMask() const;
/** Updates the realname of the user record.
*/
void SetRealname(const Anope::string &realname);
/**
* Send a message (notice or privmsg, depending on settings) to a user
* @param source Sender
* @param source Sender nick
* @param fmt Format of the Message
* @param ... any number of parameters
*/
void SendMessage(BotInfo *source, const char *fmt, ...);
virtual void SendMessage(BotInfo *source, Anope::string msg);
virtual void SendMessage(const Anope::string &source, const char *fmt, ...) const;
virtual void SendMessage(const Anope::string &source, const Anope::string &msg) const;
/** Send a language string message to a user
* @param source Sender
* @param message The message num
* @param ... parameters
*/
void SendMessage(BotInfo *source, LanguageString message, ...) const;
/** Collide a nick
* See the comment in users.cpp
@@ -164,13 +171,6 @@ class CoreExport User : public Extensible
*/
void Collide(NickAlias *na);
/** Identify the user to the Nick
* updates last_seen, logs the user in,
* send messages, checks for mails, set vhost and more
* @param the NickAlias
*/
void Identify(NickAlias *na);
/** Login the user to a NickCore
* @param core The account the user is useing
*/
@@ -184,35 +184,19 @@ class CoreExport User : public Extensible
* @return The account or NULL
*/
virtual NickCore *Account();
virtual const NickCore *Account() const;
/** Check if the user is identified for their nick
* @param CheckNick True to check if the user is identified to the nickname they are on too
* @return true or false
*/
virtual bool IsIdentified(bool CheckNick = false);
virtual bool IsIdentified(bool CheckNick = false) const;
/** Check if the user is recognized for their nick (on the nicks access list)
* @param CheckSecure Only returns true if the user has secure off
* @return true or false
*/
virtual bool IsRecognized(bool CheckSecure = false);
/** Check if the user is a services oper
* @return true if they are an oper
*/
bool IsServicesOper();
/** Check whether this user has access to run the given command string.
* @param cmdstr The string to check, e.g. botserv/set/private.
* @return True if this user may run the specified command, false otherwise.
*/
bool HasCommand(const Anope::string &cmdstr);
/** Check whether this user has access to the given special permission.
* @param privstr The priv to check for, e.g. users/auspex.
* @return True if this user has the specified priv, false otherwise.
*/
bool HasPriv(const Anope::string &privstr);
virtual bool IsRecognized(bool CheckSecure = false) const;
/** Update the last usermask stored for a user, and check to see if they are recognized
*/
+2 -2
View File
@@ -1,9 +1,9 @@
/* Build bumper
*
* (C) 2003-2011 Anope Team
* (C) 2003-2010 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
* 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.
@@ -24,6 +24,7 @@ if(GETTEXT_FOUND)
MAIN_DEPENDENCY ${LANG_PO}
)
# Add to cpack ignored files if not on Windows.
file(RELATIVE_PATH LANG_RELATIVE ${Anope_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR}/${LANG_LANG})
if(NOT WIN32)
add_to_cpack_ignored_files("${LANG_MO}")
endif(NOT WIN32)
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -1,14 +1,14 @@
# German translations for cs_appendtopic
# German messages for cs_appendtopic
# Copyright (C) 2011 Anope Team
# Copyright (C) 2010 Anope Team
# This file is distributed under the same license as Anope IRC Services
# Adam <adam@anope.org>, 2011.
# Adam <adam@anope.org>, 2010.
#
msgid ""
msgstr ""
"Project-Id-Version: Anope\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-02-04 03:41-0500\n"
"POT-Creation-Date: 2010-09-25 20:53-0400\n"
"PO-Revision-Date: 2010-09-25 20:57-0400\n"
"Last-Translator: Adam <adam@anope.org>\n"
"Language-Team: German\n"
@@ -17,21 +17,20 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: ../cs_appendtopic.cpp:106
#: cs_appendtopic.cpp:105
msgid " APPENDTOPIC Add text to a channels topic"
msgstr " APPENDTOPIC Fügt einen Text zu einem Channel-Topic hinzu."
#: ../cs_appendtopic.cpp:90 ../cs_appendtopic.cpp:101
#: cs_appendtopic.cpp:89 cs_appendtopic.cpp:100
msgid "Syntax: APPENDTOPIC channel text"
msgstr "Syntax: APPENDTOPIC Channel Text"
#: ../cs_appendtopic.cpp:92
#: cs_appendtopic.cpp:91
msgid ""
"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."
msgstr ""
"Dieser Befehl erlaubt Benutzern, einen Text zu dem vorhandenen Channel-"
"Topic\n"
"Dieser Befehl erlaubt Benutzern, einen Text zu dem vorhandenen Channel-Topic\n"
"hinzuzufügen. Wenn TOPICLOCK gesetzt ist, wird das Topic aktualisiert\n"
"und das neue, aktualisierte Topic wird gesperrt."
@@ -1,14 +1,14 @@
# Italian translations for cs_appendtopic
# Traduzioni italiane per il cs_appendtopic
# Copyright (C) 2011 Anope Team
# Copyright (C) 2010 Anope Team
# This file is distributed under the same license as Anope IRC Services
# Adam <adam@anope.org>, 2011.
# Adam <adam@anope.org>, 2010.
#
msgid ""
msgstr ""
"Project-Id-Version: Anope\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-02-04 03:41-0500\n"
"POT-Creation-Date: 2010-09-25 20:53-0400\n"
"PO-Revision-Date: 2010-09-25 21:04-0400\n"
"Last-Translator: Adam <adam@anope.org>\n"
"Language-Team: Italian\n"
@@ -17,22 +17,20 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: ../cs_appendtopic.cpp:106
#: cs_appendtopic.cpp:105
msgid " APPENDTOPIC Add text to a channels topic"
msgstr " APPENDTOPIC Aggiunge del testo al topic di un canale"
#: ../cs_appendtopic.cpp:90 ../cs_appendtopic.cpp:101
#: cs_appendtopic.cpp:89 cs_appendtopic.cpp:100
msgid "Syntax: APPENDTOPIC channel text"
msgstr "Sintassi: APPENDTOPIC canale testo"
#: ../cs_appendtopic.cpp:92
#: cs_appendtopic.cpp:91
msgid ""
"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."
msgstr ""
"Questo comando permette agli utenti di aggiungere del testo ad un topic di "
"un canale\n"
"già impostato. Se TOPICLOCK è attivato, il topic viene aggiornato e il nuovo "
"topic\n"
"Questo comando permette agli utenti di aggiungere del testo ad un topic di un canale\n"
"già impostato. Se TOPICLOCK è attivato, il topic viene aggiornato e il nuovo topic\n"
"viene bloccato."
@@ -1,14 +1,14 @@
# Dutch translations for cs_appendtopic
# Engelse vertalingen voor het cs_appendtopic
# Copyright (C) 2011 Anope Team
# Copyright (C) 2010 Anope Team
# This file is distributed under the same license as Anope IRC Services
# Adam <adam@anope.org>, 2011.
# Adam <adam@anope.org>, 2010.
#
msgid ""
msgstr ""
"Project-Id-Version: Anope\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-02-04 03:41-0500\n"
"POT-Creation-Date: 2010-09-25 20:53-0400\n"
"PO-Revision-Date: 2010-09-25 20:55-0400\n"
"Last-Translator: Adam <adam@anope.org>\n"
"Language-Team: Dutch\n"
@@ -17,15 +17,15 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: ../cs_appendtopic.cpp:106
#: cs_appendtopic.cpp:105
msgid " APPENDTOPIC Add text to a channels topic"
msgstr " APPENDTOPIC Voeg tekst aan een kanaal onderwerp toe"
#: ../cs_appendtopic.cpp:90 ../cs_appendtopic.cpp:101
#: cs_appendtopic.cpp:89 cs_appendtopic.cpp:100
msgid "Syntax: APPENDTOPIC channel text"
msgstr "Gebruik: APPENDTOPIC kanaal tekst"
#: ../cs_appendtopic.cpp:92
#: cs_appendtopic.cpp:91
msgid ""
"This command allows users to append text to a currently set\n"
"channel topic. When TOPICLOCK is on, the topic is updated and\n"
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-02-04 03:41-0500\n"
"POT-Creation-Date: 2010-09-25 20:53-0400\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -16,15 +16,15 @@ msgstr ""
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
#: ../cs_appendtopic.cpp:106
#: cs_appendtopic.cpp:105
msgid " APPENDTOPIC Add text to a channels topic"
msgstr ""
#: ../cs_appendtopic.cpp:90 ../cs_appendtopic.cpp:101
#: cs_appendtopic.cpp:89 cs_appendtopic.cpp:100
msgid "Syntax: APPENDTOPIC channel text"
msgstr ""
#: ../cs_appendtopic.cpp:92
#: cs_appendtopic.cpp:91
msgid ""
"This command allows users to append text to a currently set\n"
"channel topic. When TOPICLOCK is on, the topic is updated and\n"
@@ -1,13 +1,13 @@
# Portuguese translations for cs_appendtopic
# Copyright (C) 2011 Anope Team
# Copyright (C) 2010 Anope Team
# This file is distributed under the same license as Anope IRC Services
# Adam <adam@anope.org>, 2011.
# Adam <adam@anope.org>, 2010.
#
msgid ""
msgstr ""
"Project-Id-Version: Anope\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-02-04 03:41-0500\n"
"POT-Creation-Date: 2010-09-25 20:53-0400\n"
"PO-Revision-Date: 2010-09-25 21:00-0400\n"
"Last-Translator: Adam <adam@anope.org>\n"
"Language-Team: Portuguese\n"
@@ -16,15 +16,15 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: ../cs_appendtopic.cpp:106
#: cs_appendtopic.cpp:105
msgid " APPENDTOPIC Add text to a channels topic"
msgstr " APPENDTOPIC Adiciona texto ao tópico de um canal"
#: ../cs_appendtopic.cpp:90 ../cs_appendtopic.cpp:101
#: cs_appendtopic.cpp:89 cs_appendtopic.cpp:100
msgid "Syntax: APPENDTOPIC channel text"
msgstr "Sintaxe: APPENDTOPIC canal texto"
#: ../cs_appendtopic.cpp:92
#: cs_appendtopic.cpp:91
msgid ""
"This command allows users to append text to a currently set\n"
"channel topic. When TOPICLOCK is on, the topic is updated and\n"
@@ -1,14 +1,14 @@
# Russian translations for cs_appendtopic
# ?????????? ???????? ??? ?????? cs_appendtopic
# Copyright (C) 2011 Anope Team
# Copyright (C) 2010 Anope Team
# This file is distributed under the same license as Anope IRC Services
# Adam <adam@anope.org>, 2011.
# Adam <adam@anope.org>, 2010.
#
msgid ""
msgstr ""
"Project-Id-Version: Anope\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-02-04 03:41-0500\n"
"POT-Creation-Date: 2010-09-25 20:53-0400\n"
"PO-Revision-Date: 2010-09-25 21:02-0400\n"
"Last-Translator: Adam <adam@anope.org>\n"
"Language-Team: Russian\n"
@@ -18,23 +18,20 @@ msgstr ""
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
#: ../cs_appendtopic.cpp:106
#: cs_appendtopic.cpp:105
msgid " APPENDTOPIC Add text to a channels topic"
msgstr " APPENDTOPIC Äîáàâëÿåò òåêñò ê òîïèêó êàíàëà"
#: ../cs_appendtopic.cpp:90 ../cs_appendtopic.cpp:101
#: cs_appendtopic.cpp:89 cs_appendtopic.cpp:100
msgid "Syntax: APPENDTOPIC channel text"
msgstr "Ñèíòàêñèñ: APPENDTOPIC #êàíàë òåêñò"
#: ../cs_appendtopic.cpp:92
#: cs_appendtopic.cpp:91
msgid ""
"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."
msgstr ""
"Данная команда позволяет добавить текст к топику, который установлен на "
"указанном\n"
"канале. Если активирован режим TOPICLOCK, топик будет обновлен и "
"заблокирован.\n"
"Примечание: текст будет ДОБАВЛЕН к топику, то есть старый топик удален НЕ "
"БУДЕТ."
"Данная команда позволяет добавить текст к топику, который установлен на указанном\n"
"канале. Если активирован режим TOPICLOCK, топик будет обновлен и заблокирован.\n"
"Примечание: текст будет ДОБАВЛЕН к топику, то есть старый топик удален НЕ БУДЕТ."
@@ -1,14 +1,14 @@
# German translations for cs_enforce
# German messages for cs_enforce
# Copyright (C) 2011 Anope Team
# Copyright (C) 2010 Anope Team
# This file is distributed under the same license as Anope IRC Services
# Adam <adam@anope.org>, 2011.
# Adam <adam@anope.org>, 2010.
#
msgid ""
msgstr ""
"Project-Id-Version: Anope\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-02-04 03:41-0500\n"
"POT-Creation-Date: 2010-09-25 21:11-0400\n"
"PO-Revision-Date: 2010-09-25 21:12-0400\n"
"Last-Translator: Adam <adam@anope.org>\n"
"Language-Team: German\n"
@@ -17,11 +17,11 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: ../cs_enforce.cpp:213
#: cs_enforce.cpp:215
msgid " ENFORCE Enforce various channel modes and set options"
msgstr " ENFORCE Erzwingt verschieden Modes und SET Optionen"
#: ../cs_enforce.cpp:178
#: cs_enforce.cpp:180
msgid ""
"Enforce various channel modes and set options. The channel\n"
"option indicates what channel to enforce the modes and options\n"
@@ -35,37 +35,37 @@ msgid ""
"enabled. Use RESTRICTED to enfore the RESTRICTED option, also\n"
"if it's not enabled."
msgstr ""
"Erzwingt verschieden Modes und SET Optionen. Die Channel\n"
"Erzwingt verschieden Modes und SET Optionen. Die \037Channel\037\n"
"Option zeigt dir den Channel an, indem Modes und Optionen\n"
"zu erzwingen sind. Die was Option zeigt dir welche Modes\n"
"zu erzwingen sind. Die \037was\037 Option zeigt dir welche Modes\n"
"und Optionen zu erzwingen sind. Die können nur SET, SECUREOPS,\n"
"RESTRICTED, MODES oder +R sein.Default ist SET.\n"
" \n"
"Wenn was SET ist, wird SECUREOPS und RESTRICTED\n"
"Wenn \037was\037 SET ist, wird SECUREOPS und RESTRICTED\n"
"auf die User die z.Z.in Channel sind erzwungen, wenn sie AN sind.\n"
"Benutze SECUREOPS oder RESTRICTED , um die Optionen einzeln\n"
"zu erzwingen, also wenn sie nicht eingeschaltet sind."
#: ../cs_enforce.cpp:145 ../cs_enforce.cpp:150 ../cs_enforce.cpp:155
#: ../cs_enforce.cpp:160 ../cs_enforce.cpp:165
#: cs_enforce.cpp:147 cs_enforce.cpp:152 cs_enforce.cpp:157 cs_enforce.cpp:162
#: cs_enforce.cpp:167
#, c-format
msgid "Enforced %s"
msgstr "Erzwungen %s"
#: ../cs_enforce.cpp:191
#: cs_enforce.cpp:193
msgid ""
"If what is MODES, it will enforce channelmode +R if it is\n"
"set. If +R is specified for what, 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."
msgstr ""
"Wenn was MODES ist, wird das ChannelMode +R erzwungen\n"
"falls an. Wenn was +R ist, wird +R erzwungen aber eben\n"
"Wenn \037was\037 MODES ist, wird das ChannelMode +R erzwungen\n"
"falls an. Wenn \037was\037 +R ist, wird +R erzwungen aber eben\n"
"wenn noch nicht als Channel-Mode ist. Wenn +R noch nicht als\n"
"Channel-Mode war werden alle User aus den Channel gebannt um\n"
"sicher zu sein das sie nicht rejoinen."
#: ../cs_enforce.cpp:196
#: cs_enforce.cpp:198
msgid ""
"If what is MODES, nothing will be enforced, since it would\n"
"enforce modes that the current ircd does not support. If +R is\n"
@@ -74,12 +74,12 @@ msgid ""
"but have not identified for their nickname will be kicked and\n"
"banned from the channel."
msgstr ""
"Wenn was MODES ist, wird nichts erzwungen weil es MODES seine\n"
"können die dein IRCD nicht unterstützt. Wenn was +R ist\n"
"Wenn \037was\037 MODES ist, wird nichts erzwungen weil es MODES seine\n"
"können die dein IRCD nicht unterstützt. Wenn \037was\037 +R ist\n"
"oder ein Modes was auf ein anderen IRCD gleich +R ist, wird es\n"
"erzwungen. Alle User die nicht für deren Nicknamen identifiziert\n"
"sind werden aus den Channel gekickt und gebannt."
#: ../cs_enforce.cpp:176 ../cs_enforce.cpp:208
#: cs_enforce.cpp:178 cs_enforce.cpp:210
msgid "Syntax: ENFORCE channel [what]"
msgstr "Syntax: ENFORCE Channel [was]"
msgstr "Syntax: \002ENFORCE \037Channel\037 [\037was\037]\002"
@@ -1,14 +1,14 @@
# Italian translations for cs_enforce
# Traduzioni italiane per il cs_enforce
# Copyright (C) 2011 Anope Team
# Copyright (C) 2010 Anope Team
# This file is distributed under the same license as Anope IRC Services
# Adam <adam@anope.org>, 2011.
# Adam <adam@anope.org>, 2010.
#
msgid ""
msgstr ""
"Project-Id-Version: Anope\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-02-04 03:41-0500\n"
"POT-Creation-Date: 2010-09-25 21:11-0400\n"
"PO-Revision-Date: 2010-09-25 21:55-0400\n"
"Last-Translator: Adam <adam@anope.org>\n"
"Language-Team: Italian\n"
@@ -17,11 +17,11 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: ../cs_enforce.cpp:213
#: cs_enforce.cpp:215
msgid " ENFORCE Enforce various channel modes and set options"
msgstr " ENFORCE Forza diversi modi di canale ed opzioni SET"
#: ../cs_enforce.cpp:178
#: cs_enforce.cpp:180
msgid ""
"Enforce various channel modes and set options. The channel\n"
"option indicates what channel to enforce the modes and options\n"
@@ -35,37 +35,37 @@ msgid ""
"enabled. Use RESTRICTED to enfore the RESTRICTED option, also\n"
"if it's not enabled."
msgstr ""
"Forza diversi modi di canale ed opzioni SET. Il parametro canale\n"
"Forza diversi modi di canale ed opzioni SET. Il parametro \037canale\037\n"
"indica il canale sul quale forzare i modi e le opzioni. Il parametro\n"
"cosa indica i modi e le opzioni da forzare, e possono essere\n"
"\037cosa\037 indica i modi e le opzioni da forzare, e possono essere\n"
"qualsiasi delle opzioni SET, SECUREOPS, RESTRICTED, MODES, o +R.\n"
"Se non specificato, viene sottointeso SET.\n"
" \n"
"Se cosa è SET, forzerà SECUREOPS e RESTRICTED sugli utenti\n"
"Se \037cosa\037 è SET, forzerà SECUREOPS e RESTRICTED sugli utenti\n"
"attualmente nel canale, se sono impostati. Specifica SECUREOPS per\n"
"forzare l'opzione SECUREOPS, anche se non è attivata. Specifica\n"
"RESTRICTED per forzare l'opzione RESTRICTED, anche se non è\n"
"attivata."
#: ../cs_enforce.cpp:145 ../cs_enforce.cpp:150 ../cs_enforce.cpp:155
#: ../cs_enforce.cpp:160 ../cs_enforce.cpp:165
#: cs_enforce.cpp:147 cs_enforce.cpp:152 cs_enforce.cpp:157 cs_enforce.cpp:162
#: cs_enforce.cpp:167
#, c-format
msgid "Enforced %s"
msgstr "Forzato %s"
#: ../cs_enforce.cpp:191
#: cs_enforce.cpp:193
msgid ""
"If what is MODES, it will enforce channelmode +R if it is\n"
"set. If +R is specified for what, 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."
msgstr ""
"Se cosa è MODES, forzerà il modo del canale +R se è impostato.\n"
"Se +R è specificato per cosa, il modo del canale +R verrà\n"
"Se \037cosa\037 è MODES, forzerà il modo del canale +R se è impostato.\n"
"Se +R è specificato per \037cosa\037, il modo del canale +R verrà\n"
"forzato, anche se non è impostato. Se non è impostato, gli utenti\n"
"verranno bannati per assicurare che non rientrino semplicemente."
#: ../cs_enforce.cpp:196
#: cs_enforce.cpp:198
msgid ""
"If what is MODES, nothing will be enforced, since it would\n"
"enforce modes that the current ircd does not support. If +R is\n"
@@ -74,12 +74,12 @@ msgid ""
"but have not identified for their nickname will be kicked and\n"
"banned from the channel."
msgstr ""
"Se cosa è MODES, niente verrà forzato, siccome forzerebbe\n"
"Se \037cosa\037 è MODES, niente verrà forzato, siccome forzerebbe\n"
"dei modi che l'ircd in uso non supporterebbe. Se +R è specificato\n"
"per cosa, un modo equivalente a +R sui altri ircd verrà\n"
"per \037cosa\037, un modo equivalente a +R sui altri ircd verrà\n"
"forzato. Tutti gli utenti presenti nel canale ma non identificati\n"
"per il loro nickname verranno bannati ed espulsi dal canale."
#: ../cs_enforce.cpp:176 ../cs_enforce.cpp:208
#: cs_enforce.cpp:178 cs_enforce.cpp:210
msgid "Syntax: ENFORCE channel [what]"
msgstr "Sintassi: ENFORCE canale [cosa]"
msgstr "Sintassi: \002ENFORCE \037canale\037 [\037cosa\037]\002"
@@ -1,14 +1,14 @@
# Dutch translations for cs_enforce
# Engelse vertalingen voor het cs_enforce
# Copyright (C) 2011 Anope Team
# Copyright (C) 2010 Anope Team
# This file is distributed under the same license as the Anope IRC Services
# Adam <adam@anope.org>, 2011.
# Adam <adam@anope.org>, 2010.
#
msgid ""
msgstr ""
"Project-Id-Version: Anope\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-02-04 03:41-0500\n"
"POT-Creation-Date: 2010-09-25 21:06-0400\n"
"PO-Revision-Date: 2010-09-25 21:07-0400\n"
"Last-Translator: Adam <adam@anope.org>\n"
"Language-Team: Dutch\n"
@@ -17,11 +17,11 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: ../cs_enforce.cpp:213
#: cs_enforce.cpp:215
msgid " ENFORCE Enforce various channel modes and set options"
msgstr " ENFORCE Forceer enkele kanaalmodes en set-opties"
#: ../cs_enforce.cpp:178
#: cs_enforce.cpp:180
msgid ""
"Enforce various channel modes and set options. The channel\n"
"option indicates what channel to enforce the modes and options\n"
@@ -35,39 +35,39 @@ msgid ""
"enabled. Use RESTRICTED to enfore the RESTRICTED option, also\n"
"if it's not enabled."
msgstr ""
"Forceer enkele kannalmodes en set-opties. De kanaal optie\n"
"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 wat optie geeft aan welke modes en opties\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 wat SET wordt ingevuld, zullen SECUREOPS en\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 wat zal die optie\n"
"SECUREOPS of RESTRICTED wordt gegeven voor \037wat\037 zal die optie\n"
"altijd geforceerd worden, ook als die niet is aangezet."
#: ../cs_enforce.cpp:145 ../cs_enforce.cpp:150 ../cs_enforce.cpp:155
#: ../cs_enforce.cpp:160 ../cs_enforce.cpp:165
#: cs_enforce.cpp:147 cs_enforce.cpp:152 cs_enforce.cpp:157 cs_enforce.cpp:162
#: cs_enforce.cpp:167
#, c-format
msgid "Enforced %s"
msgstr ""
#: ../cs_enforce.cpp:191
#: cs_enforce.cpp:193
msgid ""
"If what is MODES, it will enforce channelmode +R if it is\n"
"set. If +R is specified for what, 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."
msgstr ""
"Als er voor wat MODES wordt ingevuld, zal kanaalmode +R worden\n"
"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 aanstaat voor het "
"kanaal. Als +R niet aan staat, zullen alle ook\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."
#: ../cs_enforce.cpp:196
#: cs_enforce.cpp:198
msgid ""
"If what is MODES, nothing will be enforced, since it would\n"
"enforce modes that the current ircd does not support. If +R is\n"
@@ -76,13 +76,13 @@ msgid ""
"but have not identified for their nickname will be kicked and\n"
"banned from the channel."
msgstr ""
"Als er voor wat MODES wordt ingevuld, zal er niks gebeuren.\n"
"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 wat\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."
#: ../cs_enforce.cpp:176 ../cs_enforce.cpp:208
#: cs_enforce.cpp:178 cs_enforce.cpp:210
msgid "Syntax: ENFORCE channel [what]"
msgstr "Syntax: ENFORCE kanaal [wat]"
msgstr "Syntax: \002ENFORCE \037kanaal\037 [\037wat\037]\002"
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-02-04 03:41-0500\n"
"POT-Creation-Date: 2010-09-25 21:11-0400\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -16,11 +16,11 @@ msgstr ""
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
#: ../cs_enforce.cpp:213
#: cs_enforce.cpp:215
msgid " ENFORCE Enforce various channel modes and set options"
msgstr ""
#: ../cs_enforce.cpp:178
#: cs_enforce.cpp:180
msgid ""
"Enforce various channel modes and set options. The channel\n"
"option indicates what channel to enforce the modes and options\n"
@@ -35,13 +35,13 @@ msgid ""
"if it's not enabled."
msgstr ""
#: ../cs_enforce.cpp:145 ../cs_enforce.cpp:150 ../cs_enforce.cpp:155
#: ../cs_enforce.cpp:160 ../cs_enforce.cpp:165
#: cs_enforce.cpp:147 cs_enforce.cpp:152 cs_enforce.cpp:157 cs_enforce.cpp:162
#: cs_enforce.cpp:167
#, c-format
msgid "Enforced %s"
msgstr ""
#: ../cs_enforce.cpp:191
#: cs_enforce.cpp:193
msgid ""
"If what is MODES, it will enforce channelmode +R if it is\n"
"set. If +R is specified for what, the +R channelmode will\n"
@@ -49,7 +49,7 @@ msgid ""
"users will be banned to ensure they don't just rejoin."
msgstr ""
#: ../cs_enforce.cpp:196
#: cs_enforce.cpp:198
msgid ""
"If what is MODES, nothing will be enforced, since it would\n"
"enforce modes that the current ircd does not support. If +R is\n"
@@ -59,6 +59,6 @@ msgid ""
"banned from the channel."
msgstr ""
#: ../cs_enforce.cpp:176 ../cs_enforce.cpp:208
#: cs_enforce.cpp:178 cs_enforce.cpp:210
msgid "Syntax: ENFORCE channel [what]"
msgstr ""
@@ -1,13 +1,13 @@
# Portuguese translations for cs_enforce
# Copyright (C) 2011 Anope Team
# Copyright (C) 2010 Anope Team
# This file is distributed under the same license as the Anope IRC Services
# Adam <adam@anope.org>, 2011.
# Adam <adam@anope.org>, 2010.
#
msgid ""
msgstr ""
"Project-Id-Version: Anope\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-02-04 03:41-0500\n"
"POT-Creation-Date: 2010-09-25 21:11-0400\n"
"PO-Revision-Date: 2010-09-25 21:24-0400\n"
"Last-Translator: Adam <adam@anope.org>\n"
"Language-Team: Portuguese\n"
@@ -16,13 +16,11 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: ../cs_enforce.cpp:213
#: cs_enforce.cpp:215
msgid " ENFORCE Enforce various channel modes and set options"
msgstr ""
" ENFORCE Verifica o cumprimento de vários modos de canal e opções "
"ajustadas"
msgstr " ENFORCE Verifica o cumprimento de vários modos de canal e opções ajustadas"
#: ../cs_enforce.cpp:178
#: cs_enforce.cpp:180
msgid ""
"Enforce various channel modes and set options. The channel\n"
"option indicates what channel to enforce the modes and options\n"
@@ -37,37 +35,36 @@ msgid ""
"if it's not enabled."
msgstr ""
"Verifica o cumprimento de vários modos de canal e opções ajustadas.\n"
"O campo canal indica qual canal deve ter os modos e opções verificadas\n"
"O campo opção indica quais modos e opções devem ser verificadas,\n"
"O campo \037canal\037 indica qual canal deve ter os modos e opções verificadas\n"
"O campo \037opção\037 indica quais modos e opções devem ser verificadas,\n"
"e pode ser: SET, SECUREOPS, RESTRICTED, MODES ou +R\n"
"Quando deixado em branco, o padrão é SET.\n"
" \n"
"Se opção for SET, serão verificadas as opções SECUREOPS e RESTRICTED\n"
"Se \037opção\037 for SET, serão verificadas as opções SECUREOPS e RESTRICTED\n"
"para usuários que estiverem no canal, caso elas estejam ativadas. Use\n"
"SECUREOPS para verificar a opção SECUREOPS, mesmo que ela não esteja "
"ativada\n"
"SECUREOPS para verificar a opção SECUREOPS, mesmo que ela não esteja ativada\n"
"Use RESTRICTED para verificar a opção RESTRICTED, mesmo que ela não esteja\n"
"ativada."
#: ../cs_enforce.cpp:145 ../cs_enforce.cpp:150 ../cs_enforce.cpp:155
#: ../cs_enforce.cpp:160 ../cs_enforce.cpp:165
#: cs_enforce.cpp:147 cs_enforce.cpp:152 cs_enforce.cpp:157 cs_enforce.cpp:162
#: cs_enforce.cpp:167
#, c-format
msgid "Enforced %s"
msgstr "Verificado %s"
#: ../cs_enforce.cpp:191
#: cs_enforce.cpp:193
msgid ""
"If what is MODES, it will enforce channelmode +R if it is\n"
"set. If +R is specified for what, 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."
msgstr ""
"Se opção for MODES, será verificado o modo de canal +R caso ele\n"
"esteja ativado. Se +R for especificado para opção, o modo de canal\n"
"Se \037opção\037 for MODES, será verificado o modo de canal +R caso ele\n"
"esteja ativado. Se +R for especificado para \037opção\037, o modo de canal\n"
"+R também será verificado, mesmo que ele não esteja ativado. Se ele não\n"
"estiver ativado, os usuários serão banidos para evitar que reentrem no canal."
#: ../cs_enforce.cpp:196
#: cs_enforce.cpp:198
msgid ""
"If what is MODES, nothing will be enforced, since it would\n"
"enforce modes that the current ircd does not support. If +R is\n"
@@ -76,12 +73,12 @@ msgid ""
"but have not identified for their nickname will be kicked and\n"
"banned from the channel."
msgstr ""
"Se opção for MODES, nada será verificado, visto que isto poderia\n"
"Se \037opção\037 for MODES, nada será verificado, visto que isto poderia\n"
"verificar modos que o IRCd atual não suporta. Se +R for especificado\n"
"para opção, um equivalente ao modo de canal +R em outros IRCds\n"
"para \037opção\037, um equivalente ao modo de canal +R em outros IRCds\n"
"será verificado. Todos os usuários que estão no canal, mas não estejam\n"
"identificados para seus nicks serão kickados e banidos do canal."
#: ../cs_enforce.cpp:176 ../cs_enforce.cpp:208
#: cs_enforce.cpp:178 cs_enforce.cpp:210
msgid "Syntax: ENFORCE channel [what]"
msgstr "Sintaxe: ENFORCE canal [opção]"
msgstr "Sintaxe: \002ENFORCE \037canal\037 [\037opção\037]\002"
@@ -1,14 +1,14 @@
# Russian translations for cs_enforce
# ?????????? ???????? ??? ?????? cs_enforce
# Copyright (C) 2011 Anope Team
# Copyright (C) 2010 Anope Team
# This file is distributed under the same license as Anope IRC Services
# Adam <adam@anope.org>, 2011.
# Adam <adam@anope.org>, 2010.
#
msgid ""
msgstr ""
"Project-Id-Version: Anope\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-02-04 03:41-0500\n"
"POT-Creation-Date: 2010-09-25 21:11-0400\n"
"PO-Revision-Date: 2010-09-25 21:38-0400\n"
"Last-Translator: Adam <adam@anope.org>\n"
"Language-Team: Russian\n"
@@ -18,12 +18,11 @@ msgstr ""
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
#: ../cs_enforce.cpp:213
#: cs_enforce.cpp:215
msgid " ENFORCE Enforce various channel modes and set options"
msgstr ""
" ENFORCE Перепроверка и установка различных режимов и опций канала"
msgstr " ENFORCE Перепроверка и установка различных режимов и опций канала"
#: ../cs_enforce.cpp:178
#: cs_enforce.cpp:180
msgid ""
"Enforce various channel modes and set options. The channel\n"
"option indicates what channel to enforce the modes and options\n"
@@ -38,37 +37,35 @@ msgid ""
"if it's not enabled."
msgstr ""
"Ïåðåïðîâåðêà è óñòàíîâêà ðàçëè÷íûõ ðåæèìîâ è îïöèé êàíàëà.\n"
"Параметр указывает какие опции или режимы канала должны быть\n"
"\037Параметр\037 указывает какие опции или режимы канала должны быть\n"
"ïåðåïðîâåðåíû.  êà÷åñòâå ïàðàìåòðà ìîãóò áûòü óêàçàíû: SET, SECUREOPS,\n"
"RESTRICTED, MODES, èëè +R. Åñëè ïàðàìåòð íå óêàçàí, ïî-óìîë÷àíèþ áóäåò SET.\n"
" \n"
"Если в качестве параметра указано SET, будут перепроверены опции\n"
"Если в качестве \037параметра\037 указано SET, будут перепроверены опции\n"
"SECUREOPS è RESTRICTED îòíîñèòåëüíî ïîëüçîâàòåëåé íà óêàçàííîì êàíàëå\n"
"(ïðè óñëîâèè, ÷òî îïöèè âêëþ÷åíû). Îòäåëüíî óêàçàííûé ïàðàìåòð SECUREOPS\n"
"применит опцию SECUREOPS (даже если она НЕ установлена). Параметр\n"
"RESTRICTED применит опцию RESTRICTED (даже если она НЕ установлена)"
"применит опцию SECUREOPS (даже если она \037НЕ\037 установлена). Параметр\n"
"RESTRICTED применит опцию RESTRICTED (даже если она \037НЕ\037 установлена)"
#: ../cs_enforce.cpp:145 ../cs_enforce.cpp:150 ../cs_enforce.cpp:155
#: ../cs_enforce.cpp:160 ../cs_enforce.cpp:165
#: cs_enforce.cpp:147 cs_enforce.cpp:152 cs_enforce.cpp:157 cs_enforce.cpp:162
#: cs_enforce.cpp:167
#, c-format
msgid "Enforced %s"
msgstr "Ïåðåïðîâåðåíî: %s"
#: ../cs_enforce.cpp:191
#: cs_enforce.cpp:193
msgid ""
"If what is MODES, it will enforce channelmode +R if it is\n"
"set. If +R is specified for what, 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."
msgstr ""
"Если в качестве параметра указано MODES, будет перепроверен режим +R\n"
"(если он установлен). Отдельно указанный параметр +R применит\n"
"канальный режим +R, даже если он не установлен, и забанит всех "
"пользователей,\n"
"которые не идентифицировались к своему нику или не имеют зарегистрированного "
"ника."
"Если в качестве \037параметра\037 указано MODES, будет перепроверен режим +R\n"
"(если он установлен). Отдельно указанный параметр \037+R\037 применит\n"
"канальный режим +R, даже если он не установлен, и забанит всех пользователей,\n"
"которые не идентифицировались к своему нику или не имеют зарегистрированного ника."
#: ../cs_enforce.cpp:196
#: cs_enforce.cpp:198
msgid ""
"If what is MODES, nothing will be enforced, since it would\n"
"enforce modes that the current ircd does not support. If +R is\n"
@@ -77,13 +74,12 @@ msgid ""
"but have not identified for their nickname will be kicked and\n"
"banned from the channel."
msgstr ""
"Если в качестве параметра указано MODES, перепроверка осуществлена\n"
"Если в качестве \037параметра\037 указано MODES, перепроверка осуществлена\n"
"ÍÅ ÁÓÄÅÒ, òàê êàê òåêóùèé IRCD íå ïîääåðæèâàåò íåîáõîäèìûå ðåæèìû.\n"
"Отдельно указанный параметр +R применит канальный режим, эквивалентный\n"
"режиму +R и забанит всех пользователей, которые не идентифицировались к "
"своему\n"
"Отдельно указанный параметр \037+R\037 применит канальный режим, эквивалентный\n"
"режиму +R и забанит всех пользователей, которые не идентифицировались к своему\n"
"íèêó èëè íå èìåþò çàðåãèñòðèðîâàííîãî íèêà."
#: ../cs_enforce.cpp:176 ../cs_enforce.cpp:208
#: cs_enforce.cpp:178 cs_enforce.cpp:210
msgid "Syntax: ENFORCE channel [what]"
msgstr "Синтаксис: ENFORCE #канал параметр"
msgstr "Синтаксис: \002ENFORCE \037#канал\037 \037параметр\037\002"
@@ -1,14 +1,14 @@
# German translations for cs_tban
# German messages for cs_tban
# Copyright (C) 2011 Anope Team
# Copyright (C) 2010 Anope Team
# This file is distributed under the same license as the Anope IRC Services
# Adam <adam@anope.org>, 2011.
# Adam <adam@anope.org>, 2010.
#
msgid ""
msgstr ""
"Project-Id-Version: Anope\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-02-04 03:41-0500\n"
"POT-Creation-Date: 2010-09-26 00:14-0400\n"
"PO-Revision-Date: 2010-09-26 00:16-0400\n"
"Last-Translator: Adam <adam@anope.org>\n"
"Language-Team: German\n"
@@ -17,16 +17,16 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: ../cs_tban.cpp:106
#: cs_tban.cpp:104
msgid " TBAN Bans the user for a given length of time"
msgstr " TBAN Bant ein User für eine bestimmte Zeit aus ein Channel"
#: ../cs_tban.cpp:83
#: cs_tban.cpp:81
#, c-format
msgid "%s banned from %s, will auto-expire in %s"
msgstr "%s gebannt von %s, wird auto-auslaufen in %s"
#: ../cs_tban.cpp:93
#: cs_tban.cpp:91
msgid ""
"Bans the given user from a channel for a specified length of\n"
"time. If the ban is removed before by hand, it will NOT be replaced."
@@ -34,6 +34,6 @@ msgstr ""
"Bant ein User für eine bestimmte Zeit aus ein Channel\n"
"Wenn der Ban manuell entfernt wird, wird es NICHT ersetzt."
#: ../cs_tban.cpp:101
#: cs_tban.cpp:99
msgid "Syntax: TBAN channel nick time"
msgstr "Syntax: TBAN Channel Nickname Zeit"
@@ -1,14 +1,14 @@
# Italian translations for cs_tban
# Traduzioni italiane per il cs_tban
# Copyright (C) 2011 Anope Team
# Copyright (C) 2010 Anope Team
# This file is distributed under the same license as the Anope IRC Services
# Adam <adam@anope.org>, 2011.
# Adam <adam@anope.org>, 2010.
#
msgid ""
msgstr ""
"Project-Id-Version: Anope\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-02-04 03:41-0500\n"
"POT-Creation-Date: 2010-09-26 00:14-0400\n"
"PO-Revision-Date: 2010-09-26 00:22-0400\n"
"Last-Translator: Adam <adam@anope.org>\n"
"Language-Team: Italian\n"
@@ -17,24 +17,23 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: ../cs_tban.cpp:106
#: cs_tban.cpp:104
msgid " TBAN Bans the user for a given length of time"
msgstr " TBAN Banna l'utente per un periodo di tempo specificato"
#: ../cs_tban.cpp:83
#: cs_tban.cpp:81
#, c-format
msgid "%s banned from %s, will auto-expire in %s"
msgstr "%s bannato da %s, scadrà automaticamente tra %s"
#: ../cs_tban.cpp:93
#: cs_tban.cpp:91
msgid ""
"Bans the given user from a channel for a specified length of\n"
"time. If the ban is removed before by hand, it will NOT be replaced."
msgstr ""
"Banna l'utente specificato da un canale per un periodo di tempo\n"
"specificato. Se il ban viene rimosso a mano prima della scadenza, NON verrà "
"rimpiazzato."
"specificato. Se il ban viene rimosso a mano prima della scadenza, NON verrà rimpiazzato."
#: ../cs_tban.cpp:101
#: cs_tban.cpp:99
msgid "Syntax: TBAN channel nick time"
msgstr "Sintassi: TBAN canale nick tempo"
@@ -1,14 +1,14 @@
# Dutch translations for cs_tban
# Engelse vertalingen voor het cs_tban
# Copyright (C) 2011 Anope Team
# Copyright (C) 2010 Anope Team
# This file is distributed under the same license as the Anope IRC Services
# Adam <adam@anope.org>, 2011.
# Adam <adam@anope.org>, 2010.
#
msgid ""
msgstr ""
"Project-Id-Version: Anope\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-02-04 03:41-0500\n"
"POT-Creation-Date: 2010-09-26 00:14-0400\n"
"PO-Revision-Date: 2010-09-26 00:15-0400\n"
"Last-Translator: Adam <adam@anope.org>\n"
"Language-Team: Dutch\n"
@@ -17,16 +17,16 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: ../cs_tban.cpp:106
#: cs_tban.cpp:104
msgid " TBAN Bans the user for a given length of time"
msgstr " TBAN Verban een gebruiker voor een bepaalde tijd"
#: ../cs_tban.cpp:83
#: cs_tban.cpp:81
#, c-format
msgid "%s banned from %s, will auto-expire in %s"
msgstr "%s verbannen van %s, zal verlopen in %s"
#: ../cs_tban.cpp:93
#: cs_tban.cpp:91
msgid ""
"Bans the given user from a channel for a specified length of\n"
"time. If the ban is removed before by hand, it will NOT be replaced."
@@ -35,6 +35,6 @@ msgstr ""
"gegeven tijdsduur. Als de verbanning eerder wordt verwijderd,\n"
"zal deze NIET worden vervangen."
#: ../cs_tban.cpp:101
#: cs_tban.cpp:99
msgid "Syntax: TBAN channel nick time"
msgstr "Syntax: TBAN kanaal nick tijd"
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-02-04 03:41-0500\n"
"POT-Creation-Date: 2010-09-26 00:14-0400\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -16,21 +16,21 @@ msgstr ""
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
#: ../cs_tban.cpp:106
#: cs_tban.cpp:104
msgid " TBAN Bans the user for a given length of time"
msgstr ""
#: ../cs_tban.cpp:83
#: cs_tban.cpp:81
#, c-format
msgid "%s banned from %s, will auto-expire in %s"
msgstr ""
#: ../cs_tban.cpp:93
#: cs_tban.cpp:91
msgid ""
"Bans the given user from a channel for a specified length of\n"
"time. If the ban is removed before by hand, it will NOT be replaced."
msgstr ""
#: ../cs_tban.cpp:101
#: cs_tban.cpp:99
msgid "Syntax: TBAN channel nick time"
msgstr ""
@@ -1,13 +1,13 @@
# Portuguese translations for cs_tban
# Copyright (C) 2011 Anope Team
# Copyright (C) 2010 Anope Team
# This file is distributed under the same license as the Anope IRC Services
# Adam <adam@anope.org>, 2011.
# Adam <adam@anope.org>, 2010.
#
msgid ""
msgstr ""
"Project-Id-Version: Anope\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-02-04 03:41-0500\n"
"POT-Creation-Date: 2010-09-26 00:14-0400\n"
"PO-Revision-Date: 2010-09-26 00:18-0400\n"
"Last-Translator: Adam <adam@anope.org>\n"
"Language-Team: Portuguese\n"
@@ -16,24 +16,23 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: ../cs_tban.cpp:106
#: cs_tban.cpp:104
msgid " TBAN Bans the user for a given length of time"
msgstr " TBAN Bane o usuário por um determinado período de tempo"
#: ../cs_tban.cpp:83
#: cs_tban.cpp:81
#, c-format
msgid "%s banned from %s, will auto-expire in %s"
msgstr "%s foi banido do %s, irá auto-expirar em %s"
#: ../cs_tban.cpp:93
#: cs_tban.cpp:91
msgid ""
"Bans the given user from a channel for a specified length of\n"
"time. If the ban is removed before by hand, it will NOT be replaced."
msgstr ""
"Bane de um canal o usuário especificado por um determinado período de\n"
"tempo. Se o ban for removido manualmente antes do tempo, ele não será "
"recolocado."
"tempo. Se o ban for removido manualmente antes do tempo, ele não será recolocado."
#: ../cs_tban.cpp:101
#: cs_tban.cpp:99
msgid "Syntax: TBAN channel nick time"
msgstr "Sintaxe: TBAN canal nick tempo"
@@ -1,14 +1,14 @@
# Russian translations for cs_tban
# ?????????? ???????? ??? ?????? cs_tban
# Copyright (C) 2011 Anope Team
# Copyright (C) 2010 Anope Team
# This file is distributed under the same license as the Anope IRC Services
# Adam <adam@anope.org>, 2011.
# Adam <adam@anope.org>, 2010.
#
msgid ""
msgstr ""
"Project-Id-Version: Anope\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-02-04 03:41-0500\n"
"POT-Creation-Date: 2010-09-26 00:14-0400\n"
"PO-Revision-Date: 2010-09-26 00:20-0400\n"
"Last-Translator: Adam <adam@anope.org>\n"
"Language-Team: Russian\n"
@@ -18,16 +18,16 @@ msgstr ""
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
#: ../cs_tban.cpp:106
#: cs_tban.cpp:104
msgid " TBAN Bans the user for a given length of time"
msgstr " TBAN Áàíèò ïîëüçîâàòåëÿ íà óêàçàííûé ïðîìåæóòîê âðåìåíè"
#: ../cs_tban.cpp:83
#: cs_tban.cpp:81
#, c-format
msgid "%s banned from %s, will auto-expire in %s"
msgstr "Óñòàíîâëåííûé áàí %s íà êàíàëå %s èñòå÷åò ÷åðåç %s ñåêóíä"
#: ../cs_tban.cpp:93
#: cs_tban.cpp:91
msgid ""
"Bans the given user from a channel for a specified length of\n"
"time. If the ban is removed before by hand, it will NOT be replaced."
@@ -36,6 +36,6 @@ msgstr ""
"Ïðèìå÷àíèå: óäàëåííûé âðó÷íóþ (äî ñâîåãî èñòå÷åíèÿ) áàí ÍÅ ÁÓÄÅÒ\n"
"ïåðåóñòàíîâëåí ñåðâèñàìè àâòîìàòè÷åñêè!"
#: ../cs_tban.cpp:101
#: cs_tban.cpp:99
msgid "Syntax: TBAN channel nick time"
msgstr "Ñèíòàêñèñ: TBAN #êàíàë íèê âðåìÿ"
@@ -1,14 +1,14 @@
# Italian translations for hs_request
# Traduzioni italiane per il hs_request
# Copyright (C) 2011 Anope Team
# Copyright (C) 2010 Anope Team
# This file is distributed under the same license as Anope IRC Services
# Adam <adam@anope.org>, 2011.
# Adam <adam@anope.org>, 2010.
#
msgid ""
msgstr ""
"Project-Id-Version: Anope\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-02-04 03:41-0500\n"
"POT-Creation-Date: 2010-09-25 22:23-0400\n"
"PO-Revision-Date: 2010-09-25 23:42-0400\n"
"Last-Translator: Adam <adam@anope.org>\n"
"Language-Team: Italian\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: ../hs_request.cpp:193
#: hs_request.cpp:195
msgid ""
" ACTIVATE Approve the requested vHost of a user\n"
" REJECT Reject the requested vHost of a user\n"
@@ -27,48 +27,33 @@ msgstr ""
" REJECT Rifiuta il vHost richiesto di un utente\n"
" WAITING Comando per LIST +req"
#: ../hs_request.cpp:132
#: hs_request.cpp:137
msgid " REQUEST Request a vHost for your nick"
msgstr " REQUEST Richiede un vHost per il tuo nick"
#: ../hs_request.cpp:274
#, c-format
msgid "#%d Nick:%s, vhost:%s (%s - %s)"
msgstr ""
#: ../hs_request.cpp:272
#, c-format
msgid "#%d Nick:%s, vhost:%s@%s (%s - %s)"
msgstr ""
#: ../hs_request.cpp:181 ../hs_request.cpp:245
#: hs_request.cpp:183 hs_request.cpp:245
msgid "A memo informing the user will also be sent."
msgstr "Viene inviato un memo per informare l'utente."
#: ../hs_request.cpp:179
#: hs_request.cpp:181
msgid "Activate the requested vHost for the given nick."
msgstr "Attiva il vHost richiesto per il nick specificato."
#: ../hs_request.cpp:278
#, c-format
msgid "Displayed all records (Count: %d)"
msgstr ""
#: ../hs_request.cpp:167 ../hs_request.cpp:234
#: hs_request.cpp:169 hs_request.cpp:234
#, c-format
msgid "No request for nick %s found."
msgstr "Nessuna richiesta trovata per il nick %s."
#: ../hs_request.cpp:102
#: hs_request.cpp:104
#, c-format
msgid "Please wait %d seconds before requesting a new vHost"
msgstr "Prego attendere %d secondi prima di richiedere un nuovo vHost"
#: ../hs_request.cpp:243
#: hs_request.cpp:243
msgid "Reject the requested vHost for the given nick."
msgstr "Rifiuta il vHost richiesto per il nick specificato."
#: ../hs_request.cpp:119
#: hs_request.cpp:124
msgid ""
"Request the given vHost to be actived for your nick by the\n"
"network administrators. Please be patient while your request\n"
@@ -78,23 +63,23 @@ msgstr ""
"degli amministratori di rete. Sei pregato di pazientare finchè la tua\n"
"richiesta viene elaborata."
#: ../hs_request.cpp:177 ../hs_request.cpp:188
#: hs_request.cpp:179 hs_request.cpp:190
msgid "Syntax: ACTIVATE nick"
msgstr "Sintassi: ACTIVATE nick"
msgstr "Sintassi: \002ACTIVATE \037nick\037\002"
#: ../hs_request.cpp:241 ../hs_request.cpp:252
#: hs_request.cpp:241 hs_request.cpp:252
msgid "Syntax: REJECT nick"
msgstr "Sintassi: REJECT nick"
msgstr "Sintassi: \002REJECT \037nick\037\002"
#: ../hs_request.cpp:65 ../hs_request.cpp:117 ../hs_request.cpp:127
#: hs_request.cpp:65 hs_request.cpp:122 hs_request.cpp:132
msgid "Syntax: REQUEST vhost"
msgstr "Sintassi: REQUEST vhost"
msgstr "Sintassi: \002REQUEST \037vhost\037\002"
#: ../hs_request.cpp:307
#: hs_request.cpp:307
msgid "Syntax: WAITING"
msgstr "Sintassi: WAITING"
msgstr "Sintassi: \002WAITING\002"
#: ../hs_request.cpp:309
#: hs_request.cpp:309
msgid ""
"This command is provided for convenience. It is essentially\n"
"the same as performing a LIST +req ."
@@ -102,34 +87,35 @@ msgstr ""
"Questo comando è per comodità. Praticamente è la stessa cosa che\n"
"eseguire un LIST +req ."
#: ../hs_request.cpp:108
#: hs_request.cpp:110
msgid "Your vHost has been requested"
msgstr "Il tuo vHost è stato richiesto"
#: ../hs_request.cpp:159
#: hs_request.cpp:161
msgid "[auto memo] Your requested vHost has been approved."
msgstr "[auto memo] Il vHost da te richiesto è stato approvato."
#: ../hs_request.cpp:225
#: hs_request.cpp:225
#, c-format
msgid "[auto memo] Your requested vHost has been rejected."
msgstr "[auto memo] Il vHost da te richiesto è stato rifiutato."
#: ../hs_request.cpp:223
#: hs_request.cpp:223
#, c-format
msgid "[auto memo] Your requested vHost has been rejected. Reason: %s"
msgstr "[auto memo] Il vHost da te richiesto è stato rifiutato. Motivo: %s"
#: ../hs_request.cpp:443
#: hs_request.cpp:646
#, c-format
msgid "[auto memo] vHost %s has been requested."
msgstr "[auto memo] è stato richiesto il vHost %s."
msgstr "[auto memo] è stato richiesto il vHost \002%s\002."
#: ../hs_request.cpp:161
#: hs_request.cpp:163
#, c-format
msgid "vHost for %s has been activated"
msgstr "Il vHost per %s è stato attivato"
#: ../hs_request.cpp:230
#: hs_request.cpp:230
#, c-format
msgid "vHost for %s has been rejected"
msgstr "Il vHost per %s è stato rifiutato"
@@ -1,14 +1,14 @@
# Dutch translations for hs_request
# Engelse vertalingen voor het hs_request
# Copyright (C) 2011 Anope Team
# Copyright (C) 2010 Anope Team
# This file is distributed under the same license as Anope IRC Services
# Adam <adam@anope.org>, 2011.
# Adam <adam@anope.org>, 2010.
#
msgid ""
msgstr ""
"Project-Id-Version: Anope\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-02-04 03:41-0500\n"
"POT-Creation-Date: 2010-09-25 22:23-0400\n"
"PO-Revision-Date: 2010-09-25 22:26-0400\n"
"Last-Translator: Adam <adam@anope.org>\n"
"Language-Team: Dutch\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: ../hs_request.cpp:193
#: hs_request.cpp:195
msgid ""
" ACTIVATE Approve the requested vHost of a user\n"
" REJECT Reject the requested vHost of a user\n"
@@ -27,49 +27,33 @@ msgstr ""
" REJECT Keur de aangevraagde vHost voor een gebruiker af\n"
" WAITING Snelkoppeling naar LIST +req"
#: ../hs_request.cpp:132
#: hs_request.cpp:137
msgid " REQUEST Request a vHost for your nick"
msgstr " REQUEST Vraag een vHost aan voor je nick"
#: ../hs_request.cpp:274
#, c-format
msgid "#%d Nick:%s, vhost:%s (%s - %s)"
msgstr ""
#: ../hs_request.cpp:272
#, c-format
msgid "#%d Nick:%s, vhost:%s@%s (%s - %s)"
msgstr ""
#: ../hs_request.cpp:181 ../hs_request.cpp:245
#: hs_request.cpp:183 hs_request.cpp:245
msgid "A memo informing the user will also be sent."
msgstr ""
"Een memo die de gebruiker op de hoogste stelt zal ook worden verstuurd."
msgstr "Een memo die de gebruiker op de hoogste stelt zal ook worden verstuurd."
#: ../hs_request.cpp:179
#: hs_request.cpp:181
msgid "Activate the requested vHost for the given nick."
msgstr "Activeer de aangevraagde vHost voor de gegeven nick."
#: ../hs_request.cpp:278
#, c-format
msgid "Displayed all records (Count: %d)"
msgstr ""
#: ../hs_request.cpp:167 ../hs_request.cpp:234
#: hs_request.cpp:169 hs_request.cpp:234
#, c-format
msgid "No request for nick %s found."
msgstr "Geen aanvraag voor nick %s gevonden."
#: ../hs_request.cpp:102
#: hs_request.cpp:104
#, c-format
msgid "Please wait %d seconds before requesting a new vHost"
msgstr "Wacht %d seconden voor je een nieuwe vHost aanvraagt"
#: ../hs_request.cpp:243
#: hs_request.cpp:243
msgid "Reject the requested vHost for the given nick."
msgstr "Keur de aangevraagde vHost voor de gegeven nick af."
#: ../hs_request.cpp:119
#: hs_request.cpp:124
msgid ""
"Request the given vHost to be actived for your nick by the\n"
"network administrators. Please be patient while your request\n"
@@ -79,23 +63,23 @@ msgstr ""
"netwerk beheerders. Het kan even duren voordat je aanvraag\n"
"afgehandeld wordt."
#: ../hs_request.cpp:177 ../hs_request.cpp:188
#: hs_request.cpp:179 hs_request.cpp:190
msgid "Syntax: ACTIVATE nick"
msgstr "Gebruik: ACTIVATE nick"
msgstr "Gebruik: \002ACTIVATE \037nick\037\002"
#: ../hs_request.cpp:241 ../hs_request.cpp:252
#: hs_request.cpp:241 hs_request.cpp:252
msgid "Syntax: REJECT nick"
msgstr "Gebruik: REJECT nick"
msgstr "Gebruik: \002REJECT \037nick\037\002"
#: ../hs_request.cpp:65 ../hs_request.cpp:117 ../hs_request.cpp:127
#: hs_request.cpp:65 hs_request.cpp:122 hs_request.cpp:132
msgid "Syntax: REQUEST vhost"
msgstr "Gebruik: REQUEST vhost"
msgstr "Gebruik: \002REQUEST \037vhost\037\002"
#: ../hs_request.cpp:307
#: hs_request.cpp:307
msgid "Syntax: WAITING"
msgstr "Gebruik: WAITING"
msgstr "Gebruik: \002WAITING\002"
#: ../hs_request.cpp:309
#: hs_request.cpp:309
msgid ""
"This command is provided for convenience. It is essentially\n"
"the same as performing a LIST +req ."
@@ -103,34 +87,35 @@ msgstr ""
"Dit commando is beschikbaar als handigheid. Het is simpelweg\n"
"hetzelfde als LIST +req ."
#: ../hs_request.cpp:108
#: hs_request.cpp:110
msgid "Your vHost has been requested"
msgstr "Je vHost is aangevraagd"
#: ../hs_request.cpp:159
#: hs_request.cpp:161
msgid "[auto memo] Your requested vHost has been approved."
msgstr "[auto memo] Je aangevraagde vHost is geaccepteerd."
#: ../hs_request.cpp:225
#: hs_request.cpp:225
#, c-format
msgid "[auto memo] Your requested vHost has been rejected."
msgstr "[auto memo] Je aangevraagde vHost is afgekeurd."
#: ../hs_request.cpp:223
#: hs_request.cpp:223
#, c-format
msgid "[auto memo] Your requested vHost has been rejected. Reason: %s"
msgstr "[auto memo] Je aangevraagde vHost is afgekeurd. Reden: %s"
#: ../hs_request.cpp:443
#: hs_request.cpp:646
#, c-format
msgid "[auto memo] vHost %s has been requested."
msgstr "[auto memo] vHost %s is aangevraagd."
msgstr "[auto memo] vHost \002%s\002 is aangevraagd."
#: ../hs_request.cpp:161
#: hs_request.cpp:163
#, c-format
msgid "vHost for %s has been activated"
msgstr "vHost voor %s is geactiveerd"
#: ../hs_request.cpp:230
#: hs_request.cpp:230
#, c-format
msgid "vHost for %s has been rejected"
msgstr "vHost voor %s is afgekeurd"
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-02-04 03:41-0500\n"
"POT-Creation-Date: 2010-09-25 22:23-0400\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -16,111 +16,97 @@ msgstr ""
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
#: ../hs_request.cpp:193
#: hs_request.cpp:195
msgid ""
" ACTIVATE Approve the requested vHost of a user\n"
" REJECT Reject the requested vHost of a user\n"
" WAITING Convenience command for LIST +req"
msgstr ""
#: ../hs_request.cpp:132
#: hs_request.cpp:137
msgid " REQUEST Request a vHost for your nick"
msgstr ""
#: ../hs_request.cpp:274
#, c-format
msgid "#%d Nick:%s, vhost:%s (%s - %s)"
msgstr ""
#: ../hs_request.cpp:272
#, c-format
msgid "#%d Nick:%s, vhost:%s@%s (%s - %s)"
msgstr ""
#: ../hs_request.cpp:181 ../hs_request.cpp:245
#: hs_request.cpp:183 hs_request.cpp:245
msgid "A memo informing the user will also be sent."
msgstr ""
#: ../hs_request.cpp:179
#: hs_request.cpp:181
msgid "Activate the requested vHost for the given nick."
msgstr ""
#: ../hs_request.cpp:278
#, c-format
msgid "Displayed all records (Count: %d)"
msgstr ""
#: ../hs_request.cpp:167 ../hs_request.cpp:234
#: hs_request.cpp:169 hs_request.cpp:234
#, c-format
msgid "No request for nick %s found."
msgstr ""
#: ../hs_request.cpp:102
#: hs_request.cpp:104
#, c-format
msgid "Please wait %d seconds before requesting a new vHost"
msgstr ""
#: ../hs_request.cpp:243
#: hs_request.cpp:243
msgid "Reject the requested vHost for the given nick."
msgstr ""
#: ../hs_request.cpp:119
#: hs_request.cpp:124
msgid ""
"Request the given vHost to be actived for your nick by the\n"
"network administrators. Please be patient while your request\n"
"is being considered."
msgstr ""
#: ../hs_request.cpp:177 ../hs_request.cpp:188
#: hs_request.cpp:179 hs_request.cpp:190
msgid "Syntax: ACTIVATE nick"
msgstr ""
#: ../hs_request.cpp:241 ../hs_request.cpp:252
#: hs_request.cpp:241 hs_request.cpp:252
msgid "Syntax: REJECT nick"
msgstr ""
#: ../hs_request.cpp:65 ../hs_request.cpp:117 ../hs_request.cpp:127
#: hs_request.cpp:65 hs_request.cpp:122 hs_request.cpp:132
msgid "Syntax: REQUEST vhost"
msgstr ""
#: ../hs_request.cpp:307
#: hs_request.cpp:307
msgid "Syntax: WAITING"
msgstr ""
#: ../hs_request.cpp:309
#: hs_request.cpp:309
msgid ""
"This command is provided for convenience. It is essentially\n"
"the same as performing a LIST +req ."
msgstr ""
#: ../hs_request.cpp:108
#: hs_request.cpp:110
msgid "Your vHost has been requested"
msgstr ""
#: ../hs_request.cpp:159
#: hs_request.cpp:161
msgid "[auto memo] Your requested vHost has been approved."
msgstr ""
#: ../hs_request.cpp:225
#: hs_request.cpp:225
#, c-format
msgid "[auto memo] Your requested vHost has been rejected."
msgstr ""
#: ../hs_request.cpp:223
#: hs_request.cpp:223
#, c-format
msgid "[auto memo] Your requested vHost has been rejected. Reason: %s"
msgstr ""
#: ../hs_request.cpp:443
#: hs_request.cpp:646
#, c-format
msgid "[auto memo] vHost %s has been requested."
msgstr ""
#: ../hs_request.cpp:161
#: hs_request.cpp:163
#, c-format
msgid "vHost for %s has been activated"
msgstr ""
#: ../hs_request.cpp:230
#: hs_request.cpp:230
#, c-format
msgid "vHost for %s has been rejected"
msgstr ""
@@ -1,13 +1,13 @@
# Portuguese translations for hs_request
# Copyright (C) 2011 Anope Team
# Copyright (C) 2010 Anope Team
# This file is distributed under the same license as Anope IRC Services
# Adam <adam@anope.org>, 2011.
# Adam <adam@anope.org>, 2010.
#
msgid ""
msgstr ""
"Project-Id-Version: Anope\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-02-04 03:41-0500\n"
"POT-Creation-Date: 2010-09-25 22:23-0400\n"
"PO-Revision-Date: 2010-09-25 22:48-0400\n"
"Last-Translator: Adam <adam@anope.org>\n"
"Language-Team: Portuguese\n"
@@ -16,7 +16,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: ../hs_request.cpp:193
#: hs_request.cpp:195
msgid ""
" ACTIVATE Approve the requested vHost of a user\n"
" REJECT Reject the requested vHost of a user\n"
@@ -26,48 +26,33 @@ msgstr ""
" REJECT Recusa o pedido de vHost de um usuário\n"
" WAITING Comando para LISTAR +req"
#: ../hs_request.cpp:132
#: hs_request.cpp:137
msgid " REQUEST Request a vHost for your nick"
msgstr " REQUEST Request a vHost for your nick"
#: ../hs_request.cpp:274
#, c-format
msgid "#%d Nick:%s, vhost:%s (%s - %s)"
msgstr ""
#: ../hs_request.cpp:272
#, c-format
msgid "#%d Nick:%s, vhost:%s@%s (%s - %s)"
msgstr ""
#: ../hs_request.cpp:181 ../hs_request.cpp:245
#: hs_request.cpp:183 hs_request.cpp:245
msgid "A memo informing the user will also be sent."
msgstr "Um memo informando o usuário também será enviado."
#: ../hs_request.cpp:179
#: hs_request.cpp:181
msgid "Activate the requested vHost for the given nick."
msgstr "Ativa o vHost solicitado para o nick fornecido."
#: ../hs_request.cpp:278
#, c-format
msgid "Displayed all records (Count: %d)"
msgstr ""
#: ../hs_request.cpp:167 ../hs_request.cpp:234
#: hs_request.cpp:169 hs_request.cpp:234
#, c-format
msgid "No request for nick %s found."
msgstr "Nenhum pedido encontrado para o nick %s."
#: ../hs_request.cpp:102
#: hs_request.cpp:104
#, c-format
msgid "Please wait %d seconds before requesting a new vHost"
msgstr "Por favor, espere %d segundos antes de fazer um novo pedido de vHost"
#: ../hs_request.cpp:243
#: hs_request.cpp:243
msgid "Reject the requested vHost for the given nick."
msgstr "Recusa o pedido de vHost para o nick fornecido."
#: ../hs_request.cpp:119
#: hs_request.cpp:124
msgid ""
"Request the given vHost to be actived for your nick by the\n"
"network administrators. Please be patient while your request\n"
@@ -77,23 +62,23 @@ msgstr ""
"administradores da rede. Por favor, tenha paciência\n"
"enquanto seu pedido é analisado."
#: ../hs_request.cpp:177 ../hs_request.cpp:188
#: hs_request.cpp:179 hs_request.cpp:190
msgid "Syntax: ACTIVATE nick"
msgstr "Sintaxe: ACTIVATE nick"
msgstr "Sintaxe: \002ACTIVATE \037nick\037\002"
#: ../hs_request.cpp:241 ../hs_request.cpp:252
#: hs_request.cpp:241 hs_request.cpp:252
msgid "Syntax: REJECT nick"
msgstr "Sintaxe: REJECT nick"
msgstr "Sintaxe: \002REJECT \037nick\037\002"
#: ../hs_request.cpp:65 ../hs_request.cpp:117 ../hs_request.cpp:127
#: hs_request.cpp:65 hs_request.cpp:122 hs_request.cpp:132
msgid "Syntax: REQUEST vhost"
msgstr "Sintaxe: REQUEST vhost"
msgstr "Sintaxe: \002REQUEST \037vhost\037\002"
#: ../hs_request.cpp:307
#: hs_request.cpp:307
msgid "Syntax: WAITING"
msgstr "Sintaxe: WAITING"
msgstr "Sintaxe: \002WAITING\002"
#: ../hs_request.cpp:309
#: hs_request.cpp:309
msgid ""
"This command is provided for convenience. It is essentially\n"
"the same as performing a LIST +req ."
@@ -101,34 +86,35 @@ msgstr ""
"Este comando é usado por conveniência. É essencialmente\n"
"o mesmo que fazer um LIST +req"
#: ../hs_request.cpp:108
#: hs_request.cpp:110
msgid "Your vHost has been requested"
msgstr "Seu pedido de vHost foi encaminhado"
#: ../hs_request.cpp:159
#: hs_request.cpp:161
msgid "[auto memo] Your requested vHost has been approved."
msgstr "[Auto Memo] Seu pedido de vHost foi aprovado."
#: ../hs_request.cpp:225
#: hs_request.cpp:225
#, c-format
msgid "[auto memo] Your requested vHost has been rejected."
msgstr "[Auto Memo] Seu pedido de vHost foi recusado."
#: ../hs_request.cpp:223
#: hs_request.cpp:223
#, c-format
msgid "[auto memo] Your requested vHost has been rejected. Reason: %s"
msgstr "[Auto Memo] Seu pedido de vHost foi recusado. Motivo: %s"
#: ../hs_request.cpp:443
#: hs_request.cpp:646
#, c-format
msgid "[auto memo] vHost %s has been requested."
msgstr "[Auto Memo] O vHost %s foi solicitado."
msgstr "[Auto Memo] O vHost \002%s\002 foi solicitado."
#: ../hs_request.cpp:161
#: hs_request.cpp:163
#, c-format
msgid "vHost for %s has been activated"
msgstr "O vHost para %s foi ativado"
#: ../hs_request.cpp:230
#: hs_request.cpp:230
#, c-format
msgid "vHost for %s has been rejected"
msgstr "O vHost de %s foi recusado"
@@ -1,14 +1,14 @@
# Russian translations for hs_request
# ?????????? ???????? ??? ?????? PACKAGE.
# Copyright (C) 2011 Anope Team
# Copyright (C) 2010 Anope Team
# This file is distributed under the same license as Anope IRC Services
# Adam <adam@anope.org>, 2011.
# Adam <adam@anope.org>, 2010.
#
msgid ""
msgstr ""
"Project-Id-Version: Anope\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-02-04 03:41-0500\n"
"POT-Creation-Date: 2010-09-25 22:23-0400\n"
"PO-Revision-Date: 2010-09-25 23:27-0400\n"
"Last-Translator: Adam <adam@anope.org>\n"
"Language-Team: Russian\n"
@@ -18,7 +18,7 @@ msgstr ""
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
#: ../hs_request.cpp:193
#: hs_request.cpp:195
msgid ""
" ACTIVATE Approve the requested vHost of a user\n"
" REJECT Reject the requested vHost of a user\n"
@@ -28,48 +28,33 @@ msgstr ""
" REJECT Îòêëîíèòü çàïðàøèâàåìûé ïîëüçîâàòåëåì vHost\n"
" WAITING Ñïèñîê çàïðîñîâ îæèäàþùèõ îáðàáîòêè (àíàëîã LIST +req)"
#: ../hs_request.cpp:132
#: hs_request.cpp:137
msgid " REQUEST Request a vHost for your nick"
msgstr " REQUEST Çàïðîñ íà vHost äëÿ âàøåãî òåêóùåãî íèêà"
#: ../hs_request.cpp:274
#, c-format
msgid "#%d Nick:%s, vhost:%s (%s - %s)"
msgstr ""
#: ../hs_request.cpp:272
#, c-format
msgid "#%d Nick:%s, vhost:%s@%s (%s - %s)"
msgstr ""
#: ../hs_request.cpp:181 ../hs_request.cpp:245
#: hs_request.cpp:183 hs_request.cpp:245
msgid "A memo informing the user will also be sent."
msgstr "Ïîëüçîâàòåëþ áóäåò ïîñëàíî àâòî-óâåäîìëåíèå îá àêòèâàöèè åãî çàïðîñà."
#: ../hs_request.cpp:179
#: hs_request.cpp:181
msgid "Activate the requested vHost for the given nick."
msgstr "Óòâåðäèòü çàïðàøèâàåìûé vHost äëÿ óêàçàííîãî íèêà."
#: ../hs_request.cpp:278
#, c-format
msgid "Displayed all records (Count: %d)"
msgstr ""
#: ../hs_request.cpp:167 ../hs_request.cpp:234
#: hs_request.cpp:169 hs_request.cpp:234
#, c-format
msgid "No request for nick %s found."
msgstr "Çàïðîñ íà vHost äëÿ íèêà %s íå íàéäåí."
#: ../hs_request.cpp:102
#: hs_request.cpp:104
#, c-format
msgid "Please wait %d seconds before requesting a new vHost"
msgstr "Ïîæàëóéñòà, ïîäîæäèòå %d ñåêóíä, ïðåæäå ÷åì çàïðàøèâàòü íîâûé vHost"
#: ../hs_request.cpp:243
#: hs_request.cpp:243
msgid "Reject the requested vHost for the given nick."
msgstr "Îòêëîíèòü çàïðàøèâàåìûé vHost äëÿ óêàçàííîãî íèêà."
#: ../hs_request.cpp:119
#: hs_request.cpp:124
msgid ""
"Request the given vHost to be actived for your nick by the\n"
"network administrators. Please be patient while your request\n"
@@ -79,59 +64,59 @@ msgstr ""
"àäìèíèñòðàòîðîâ ñåòè. Ïðîñüáà ïðîÿâèòü òåðïåíèå, ïîêà çàïðîñ\n"
"ðàññìàòðèâàåòñÿ àäìèíèñòðàöèåé."
#: ../hs_request.cpp:177 ../hs_request.cpp:188
#: hs_request.cpp:179 hs_request.cpp:190
msgid "Syntax: ACTIVATE nick"
msgstr "Ñèíòàêñèñ: ACTIVATE íèê"
msgstr "Ñèíòàêñèñ: \002ACTIVATE \037íèê\037\002"
#: ../hs_request.cpp:241 ../hs_request.cpp:252
#: hs_request.cpp:241 hs_request.cpp:252
msgid "Syntax: REJECT nick"
msgstr "Ñèíòàêñèñ: REJECT íèê"
msgstr "Ñèíòàêñèñ: \002REJECT \037íèê\037\002"
#: ../hs_request.cpp:65 ../hs_request.cpp:117 ../hs_request.cpp:127
#: hs_request.cpp:65 hs_request.cpp:122 hs_request.cpp:132
msgid "Syntax: REQUEST vhost"
msgstr "Ñèíòàêñèñ: REQUEST vHost"
msgstr "Ñèíòàêñèñ: \002REQUEST \037vHost\037\002"
#: ../hs_request.cpp:307
#: hs_request.cpp:307
msgid "Syntax: WAITING"
msgstr "Ñèíòàêñèñ: WAITING"
msgstr "Ñèíòàêñèñ: \002WAITING\002"
#: ../hs_request.cpp:309
#: hs_request.cpp:309
msgid ""
"This command is provided for convenience. It is essentially\n"
"the same as performing a LIST +req ."
msgstr ""
"Äàííàÿ êîìàíäà ñîçäàíà äëÿ óäîáñòâà èñïîëüçîâàíèÿ è âûâîäèò ñïèñîê "
"çàïðîñîâ,\n"
"Äàííàÿ êîìàíäà ñîçäàíà äëÿ óäîáñòâà èñïîëüçîâàíèÿ è âûâîäèò ñïèñîê çàïðîñîâ,\n"
"îæèäàþùèõ îáðàáîòêè. Àíàëîãè÷íàÿ êîìàíäà: LIST +req ."
#: ../hs_request.cpp:108
#: hs_request.cpp:110
msgid "Your vHost has been requested"
msgstr "Âàø çàïðîñ íà vHost îòïðàâëåí."
#: ../hs_request.cpp:159
#: hs_request.cpp:161
msgid "[auto memo] Your requested vHost has been approved."
msgstr "[àâòî-ñîîáùåíèå] Çàïðàøèâàåìûé âàìè vHost óòâåðæäåí è àêòèâèðîâàí."
#: ../hs_request.cpp:225
#: hs_request.cpp:225
#, c-format
msgid "[auto memo] Your requested vHost has been rejected."
msgstr "[àâòî-ñîîáùåíèå] Çàïðàøèâàåìûé âàìè vHost îòêëîíåí."
#: ../hs_request.cpp:223
#: hs_request.cpp:223
#, c-format
msgid "[auto memo] Your requested vHost has been rejected. Reason: %s"
msgstr "[àâòî-ñîîáùåíèå] Çàïðàøèâàåìûé âàìè vHost îòêëîíåí. Ïðè÷èíà: %s"
#: ../hs_request.cpp:443
#: hs_request.cpp:646
#, c-format
msgid "[auto memo] vHost %s has been requested."
msgstr "[àâòî-ñîîáùåíèå] Áûë çàïðîøåí vHost %s"
msgstr "[àâòî-ñîîáùåíèå] Áûë çàïðîøåí vHost \002%s\002"
#: ../hs_request.cpp:161
#: hs_request.cpp:163
#, c-format
msgid "vHost for %s has been activated"
msgstr "vHost äëÿ %s óñïåøíî àêòèâèðîâàí"
#: ../hs_request.cpp:230
#: hs_request.cpp:230
#, c-format
msgid "vHost for %s has been rejected"
msgstr "vHost äëÿ %s îòêëîíåí."
+6
View File
@@ -0,0 +1,6 @@
#!/bin/bash
HLANG=`cat ../include/language.h | grep "^\s" | sed 's/[\t,]//g'`
CPPLANG=`cat ../src/language.cpp | grep "\s\/\* [A-Z0-9_]* \*\/" | sed 's/\/\* \(.*\) \*\//\1/' | sed 's/\t//'`
echo "${HLANG} ${CPPLANG}" | sed 's/ /\n/' | sort | uniq -u
@@ -1,14 +1,14 @@
# German translations for ns_maxemail
# German messages for ns_maxemail
# Copyright (C) 2011 Anope Team
# Copyright (C) 2010 Anope Team
# This file is distributed under the same license as Anope IRC Services
# Adam <adam@anope.org>, 2011.
# Adam <adam@anope.org>, 2010.
#
msgid ""
msgstr ""
"Project-Id-Version: Anope\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-02-04 03:41-0500\n"
"POT-Creation-Date: 2010-09-25 23:51-0400\n"
"PO-Revision-Date: 2010-09-26 00:03-0400\n"
"Last-Translator: Adam <adam@anope.org>\n"
"Language-Team: German\n"
@@ -17,12 +17,11 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: ../ns_maxemail.cpp:33
#, fuzzy, c-format
msgid "The given email address has reached its usage limit of %d users."
#: ns_maxemail.cpp:33
#, c-format
msgid "The given email address has reached it's usage limit of %d users."
msgstr "Die angegebene eMail hat die limit Begrenzung von %d User erreicht."
#: ../ns_maxemail.cpp:31
#, fuzzy
msgid "The given email address has reached its usage limit of 1 user."
#: ns_maxemail.cpp:31
msgid "The given email address has reached it's usage limit of 1 user."
msgstr "Die angegebene eMail hat die limit Begrenzung von 1 User erreicht."
+27
View File
@@ -0,0 +1,27 @@
# Italian translations for ns_maxemail
# Traduzioni italiane per il ns_maxemail
# Copyright (C) 2010 Anope Team
# This file is distributed under the same license as Anope IRC Services
# Adam <adam@anope.org>, 2010.
#
msgid ""
msgstr ""
"Project-Id-Version: Anope\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-09-25 23:51-0400\n"
"PO-Revision-Date: 2010-09-26 00:11-0400\n"
"Last-Translator: Adam <adam@anope.org>\n"
"Language-Team: Italian\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-1\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: ns_maxemail.cpp:33
#, c-format
msgid "The given email address has reached it's usage limit of %d users."
msgstr "L'indirizzo email specificato ha raggiunto il suo limite d'utilizzo di %d utenti."
#: ns_maxemail.cpp:31
msgid "The given email address has reached it's usage limit of 1 user."
msgstr "L'indirizzo email specificato ha raggiunto il suo limite d'utilizzo di 1 utente."
@@ -1,14 +1,14 @@
# Dutch translations for ns_maxemail
# Engelse vertalingen voor het ns_maxemail
# Copyright (C) 2011 Anope Team
# Copyright (C) 2010 Anope Team
# This file is distributed under the same license as Anope IRC Services
# Adam <adam@anope.org>, 2011.
# Adam <adam@anope.org>, 2010.
#
msgid ""
msgstr ""
"Project-Id-Version: Anope\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-02-04 03:41-0500\n"
"POT-Creation-Date: 2010-09-25 23:51-0400\n"
"PO-Revision-Date: 2010-09-25 23:57-0400\n"
"Last-Translator: Adam <adam@anope.org>\n"
"Language-Team: Dutch\n"
@@ -17,12 +17,11 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: ../ns_maxemail.cpp:33
#, fuzzy, c-format
msgid "The given email address has reached its usage limit of %d users."
#: ns_maxemail.cpp:33
#, c-format
msgid "The given email address has reached it's usage limit of %d users."
msgstr "Het gegeven email adres heeft de limiet van %d gebruikers bereikt."
#: ../ns_maxemail.cpp:31
#, fuzzy
msgid "The given email address has reached its usage limit of 1 user."
#: ns_maxemail.cpp:31
msgid "The given email address has reached it's usage limit of 1 user."
msgstr "Het gegeven email adres heeft de limiet van 1 gebruiker bereikt."
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-02-04 03:41-0500\n"
"POT-Creation-Date: 2010-09-25 23:51-0400\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -16,11 +16,11 @@ msgstr ""
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
#: ../ns_maxemail.cpp:33
#: ns_maxemail.cpp:33
#, c-format
msgid "The given email address has reached its usage limit of %d users."
msgid "The given email address has reached it's usage limit of %d users."
msgstr ""
#: ../ns_maxemail.cpp:31
msgid "The given email address has reached its usage limit of 1 user."
#: ns_maxemail.cpp:31
msgid "The given email address has reached it's usage limit of 1 user."
msgstr ""
@@ -1,13 +1,13 @@
# Portuguese translations for ns_maxemail
# Copyright (C) 2011 Anope Team
# Copyright (C) 2010 Anope Team
# This file is distributed under the same license as Anope IRC Services
# Adam <adam@anope.org>, 2011.
# Adam <adam@anope.org>, 2010.
#
msgid ""
msgstr ""
"Project-Id-Version: Anope\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-02-04 03:41-0500\n"
"POT-Creation-Date: 2010-09-25 23:51-0400\n"
"PO-Revision-Date: 2010-09-26 00:05-0400\n"
"Last-Translator: Adam <adam@anope.org>\n"
"Language-Team: Portuguese\n"
@@ -16,13 +16,11 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: ../ns_maxemail.cpp:33
#, fuzzy, c-format
msgid "The given email address has reached its usage limit of %d users."
msgstr ""
"O endereço de email fornecido alcançou seu limite de uso de %d usuários."
#: ns_maxemail.cpp:33
#, c-format
msgid "The given email address has reached it's usage limit of %d users."
msgstr "O endereço de email fornecido alcançou seu limite de uso de %d usuários."
#: ../ns_maxemail.cpp:31
#, fuzzy
msgid "The given email address has reached its usage limit of 1 user."
#: ns_maxemail.cpp:31
msgid "The given email address has reached it's usage limit of 1 user."
msgstr "O endereço de email fornecido alcançou seu limite de uso de 1 usuário."
@@ -1,14 +1,14 @@
# Russian translations for ns_maxemail
# ?????????? ???????? ??? ?????? ns_maxemail
# Copyright (C) 2011 Anope Team
# Copyright (C) 2010 Anope Team
# This file is distributed under the same license as Anope IRC Services
# Adam <adam@anope.org>, 2011.
# Adam <adam@anope.org>, 2010.
#
msgid ""
msgstr ""
"Project-Id-Version: Anope\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-02-04 03:41-0500\n"
"POT-Creation-Date: 2010-09-25 23:51-0400\n"
"PO-Revision-Date: 2010-09-26 00:07-0400\n"
"Last-Translator: Adam <adam@anope.org>\n"
"Language-Team: Russian\n"
@@ -18,13 +18,11 @@ msgstr ""
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
#: ../ns_maxemail.cpp:33
#, fuzzy, c-format
msgid "The given email address has reached its usage limit of %d users."
msgstr ""
"Óêàçàííûé âàìè email-àäðåñ èñïîëüçóåòñÿ ìàêñèìàëüíî äîïóñòèìîå êîë-âî ðàç: %d"
#: ns_maxemail.cpp:33
#, c-format
msgid "The given email address has reached it's usage limit of %d users."
msgstr "Óêàçàííûé âàìè email-àäðåñ èñïîëüçóåòñÿ ìàêñèìàëüíî äîïóñòèìîå êîë-âî ðàç: %d"
#: ../ns_maxemail.cpp:31
#, fuzzy
msgid "The given email address has reached its usage limit of 1 user."
#: ns_maxemail.cpp:31
msgid "The given email address has reached it's usage limit of 1 user."
msgstr "Óêàçàííûé âàìè email-àäðåñ óæå êåì-òî èñïîëüçóåòñÿ."
Executable
+10
View File
@@ -0,0 +1,10 @@
#!/bin/bash
for string in `egrep "^.+[A-Z]+," ../include/language.h | sed "s/\t\(.*\),/\1/"` ; do
CMD=`grep -RI $string {../src,../modules,../include} | grep -v "language\.cpp:.*\/\* $string" | grep -v "language\.h:"`
if [ ! -n "$CMD" ] ; then
echo "$string is unused"
sed -i "s/\/\* $string \*\//\/* $string - UNUSED *\//" ../src/language.cpp
sed -i "/$string,/d" ../include/language.h
fi
done
Executable
+10
View File
@@ -0,0 +1,10 @@
#!/bin/bash
pushd ../src > /dev/null
xgettext -C -s -d Anope -o ../lang/anope.pot --from-code=utf-8 --keyword=_ language.cpp
popd > /dev/null
for f in *.po
do
msgmerge -v -s -U $f `echo $f | cut -d'.' -f1`.pot
done
-20
View File
@@ -1,20 +0,0 @@
#!/bin/bash
rm anope.pot
touch anope.pot
cd ..
FILES=`find ./ -name *.cpp -o -name *.h | grep -v /modules/extra/`
for f in $FILES
do
xgettext -C -s -d Anope -j -o language/anope.pot --from-code=utf-8 --keyword=_ $f
done
cd -
for f in *.po
do
msgmerge -v -s -U $f `echo $f | cut -d'.' -f1`.pot
done
rm -f *~
+8 -15
View File
@@ -1,5 +1,3 @@
add_subdirectory("extra/language")
# Get a list of ALL files and directories within the current directory
file(GLOB MODULES_FOLDERS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*")
remove_item_from_list(MODULES_FOLDERS "CMakeFiles")
@@ -77,10 +75,10 @@ foreach(MODULE_FOLDER ${MODULES_FOLDERS})
set(WIN32_NO_LIBS)
endif(WIN32)
set_target_properties(${SO} PROPERTIES LINKER_LANGUAGE CXX PREFIX "" SUFFIX "" LINK_FLAGS "${TEMP_LDFLAGS} ${WIN32_NO_LIBS}")
add_dependencies(${SO} ${PROGRAM_NAME} module_language)
# For Windows only, have the module link to the export library of Anope as well as wsock32 and Ws2_32 libraries (most of the modules probably don't need this, but this is to be on the safe side), also set it's version
add_dependencies(${SO} ${PROGRAM_NAME})
# For Windows only, have the module link to the export library of Anope as well as the wsock32 library (most of the modules probably don't need this, but this is to be on the safe side), also set it's version
if(WIN32)
target_link_libraries(${SO} ${PROGRAM_NAME} wsock32 Ws2_32 ${WIN32_MEMORY} ${TEMP_DEPENDENCIES})
target_link_libraries(${SO} ${PROGRAM_NAME} wsock32 ${WIN32_MEMORY} ${TEMP_DEPENDENCIES})
set_target_properties(${PROGRAM_NAME} PROPERTIES VERSION "${VERSION_DOTTED}")
endif(WIN32)
# Set the module to be installed to the module directory under the data directory
@@ -88,15 +86,12 @@ foreach(MODULE_FOLDER ${MODULES_FOLDERS})
DESTINATION data/modules
)
endif(HAS_FUNCTION)
else(NOT SKIP_DEPENDS AND NOT SKIP_LIBRARIES)
message(" This is not a fatal error - ${SRC} will not be built.")
endif(NOT SKIP_DEPENDS AND NOT SKIP_LIBRARIES)
endforeach(SRC)
# Get a list of ALL files and directories within this modules directory
file(GLOB SUBMODULE_DIRS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "${MODULE_FOLDER}/*")
remove_item_from_list(SUBMODULE_DIRS "CMakeFiles")
remove_item_from_list(SUBMODULE_DIRS "extra/language")
foreach(SUBDIR ${SUBMODULE_DIRS})
if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/${SUBDIR}")
@@ -154,7 +149,7 @@ foreach(MODULE_FOLDER ${MODULES_FOLDERS})
endforeach(SRC)
# Continue if library and function requirements are met
if(NOT SKIP_DEPENDS AND NOT SKIP_LIBRARIES AND HAS_FUNCTION)
if(NOT SKIP AND HAS_FUNCTION)
# Remove duplicates from the linker flags
if(SUBDIR_LDFLAGS)
remove_list_duplicates(SUBDIR_LDFLAGS)
@@ -174,19 +169,17 @@ foreach(MODULE_FOLDER ${MODULES_FOLDERS})
# Generate the module and set it's linker flags, also set it to depend on the main Anope executable to be built beforehand
add_library(${SO} MODULE ${MODULES_SUBDIR_SRCS})
set_target_properties(${SO} PROPERTIES LINKER_LANGUAGE CXX PREFIX "" SUFFIX "" LINK_FLAGS "${SUBDIR_LDFLAGS}")
add_dependencies(${SO} ${PROGRAM_NAME} module_language)
# For Windows only, have the module link to the export library of Anope as well as wsock32 and Ws2_32 libraries (most of the modules probably don't need this, but this is to be on the safe side), also set it's version
add_dependencies(${SO} ${PROGRAM_NAME})
# For Windows only, have the module link to the export library of Anope as well as the wsock32 library (most of the modules probably don't need this, but this is to be on the safe side), also set it's version
if(WIN32)
target_link_libraries(${SO} ${PROGRAM_NAME} wsock32 Ws2_32 ${WIN32_MEMORY} ${SUBDIR_EXTRA_DEPENDS})
target_link_libraries(${SO} ${PROGRAM_NAME} wsock32 ${WIN32_MEMORY} ${SUBDIR_EXTRA_DEPENDS})
set_target_properties(${PROGRAM_NAME} PROPERTIES VERSION "${VERSION_DOTTED}")
endif(WIN32)
# Set the module to be installed to the module directory under the data directory
install(TARGETS ${SO}
DESTINATION data/modules
)
else(NOT SKIP_DEPENDS AND NOT SKIP_LIBRARIES AND HAS_FUNCTION)
message(" This is not a fatal error - ${SUBDIR} will not be built.")
endif(NOT SKIP_DEPENDS AND NOT SKIP_LIBRARIES AND HAS_FUNCTION)
endif(NOT SKIP AND HAS_FUNCTION)
endif(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/${SUBDIR}")
endforeach(SUBDIR)
endif(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/${MODULE_FOLDER}")
+15 -15
View File
@@ -1,6 +1,6 @@
/* BotServ core functions
*
* (C) 2003-2011 Anope Team
* (C) 2003-2010 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
@@ -18,30 +18,28 @@ class CommandBSAct : public Command
public:
CommandBSAct() : Command("ACT", 2, 2)
{
this->SetDesc(_("Makes the bot do the equivalent of a \"/me\" command"));
}
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
{
User *u = source.u;
ChannelInfo *ci = source.ci;
ChannelInfo *ci = cs_findchan(params[0]);
Anope::string message = params[1];
if (!check_access(u, ci, CA_SAY))
{
source.Reply(_(ACCESS_DENIED));
u->SendMessage(BotServ, ACCESS_DENIED);
return MOD_CONT;
}
if (!ci->bi)
{
source.Reply(_(BOT_NOT_ASSIGNED), Config->UseStrictPrivMsgString.c_str(), BotServ->nick.c_str());
u->SendMessage(BotServ, BOT_NOT_ASSIGNED);
return MOD_CONT;
}
if (!ci->c || !ci->c->FindUser(ci->bi))
{
source.Reply(_(BOT_NOT_ON_CHANNEL), ci->name.c_str());
u->SendMessage(BotServ, BOT_NOT_ON_CHANNEL, ci->name.c_str());
return MOD_CONT;
}
@@ -58,19 +56,21 @@ class CommandBSAct : public Command
return MOD_CONT;
}
void OnSyntaxError(CommandSource &source, const Anope::string &subcommand)
void OnSyntaxError(User *u, const Anope::string &subcommand)
{
SyntaxError(source, "ACT", _("ACT \037channel\037 \037text\037"));
SyntaxError(BotServ, u, "ACT", BOT_ACT_SYNTAX);
}
bool OnHelp(CommandSource &source, const Anope::string &subcommand)
bool OnHelp(User *u, const Anope::string &subcommand)
{
source.Reply(_("Syntax: \002ACT \037channel\037 \037text\037\002\n"
" \n"
"Makes the bot do the equivalent of a \"/me\" command\n"
"on the given channel using the given text."));
u->SendMessage(BotServ, BOT_HELP_ACT);
return true;
}
void OnServHelp(User *u)
{
u->SendMessage(BotServ, BOT_HELP_CMD_ACT);
}
};
class BSAct : public Module
+26 -25
View File
@@ -1,6 +1,6 @@
/* BotServ core functions
*
* (C) 2003-2011 Anope Team
* (C) 2003-2010 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
@@ -18,44 +18,44 @@ class CommandBSAssign : public Command
public:
CommandBSAssign() : Command("ASSIGN", 2, 2)
{
this->SetDesc(_("Assigns a bot to a channel"));
}
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
{
const Anope::string &chan = params[0];
const Anope::string &nick = params[1];
User *u = source.u;
ChannelInfo *ci = source.ci;
Anope::string chan = params[0];
Anope::string nick = params[1];
BotInfo *bi;
ChannelInfo *ci;
if (readonly)
{
source.Reply(_(BOT_ASSIGN_READONLY));
u->SendMessage(BotServ, BOT_ASSIGN_READONLY);
return MOD_CONT;
}
BotInfo *bi = findbot(nick);
if (!bi)
if (!(bi = findbot(nick)))
{
source.Reply(_(BOT_DOES_NOT_EXIST), nick.c_str());
u->SendMessage(BotServ, BOT_DOES_NOT_EXIST, nick.c_str());
return MOD_CONT;
}
if (ci->botflags.HasFlag(BS_NOBOT) || (!check_access(u, ci, CA_ASSIGN) && !u->HasPriv("botserv/administration")))
ci = cs_findchan(chan);
if (ci->botflags.HasFlag(BS_NOBOT) || (!check_access(u, ci, CA_ASSIGN) && !u->Account()->HasPriv("botserv/administration")))
{
source.Reply(_(ACCESS_DENIED));
u->SendMessage(BotServ, ACCESS_DENIED);
return MOD_CONT;
}
if (bi->HasFlag(BI_PRIVATE) && !u->HasCommand("botserv/assign/private"))
if (bi->HasFlag(BI_PRIVATE) && !u->Account()->HasCommand("botserv/assign/private"))
{
source.Reply(_(ACCESS_DENIED));
u->SendMessage(BotServ, ACCESS_DENIED);
return MOD_CONT;
}
if (ci->bi && nick.equals_ci(ci->bi->nick))
{
source.Reply(_("Bot \002%s\002 is already assigned to channel \002%s\002."), ci->bi->nick.c_str(), chan.c_str());
u->SendMessage(BotServ, BOT_ASSIGN_ALREADY, ci->bi->nick.c_str(), chan.c_str());
return MOD_CONT;
}
@@ -63,23 +63,24 @@ class CommandBSAssign : public Command
Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "for " << bi->nick;
bi->Assign(u, ci);
source.Reply(_("Bot \002%s\002 has been assigned to %s."), bi->nick.c_str(), ci->name.c_str());
u->SendMessage(BotServ, BOT_ASSIGN_ASSIGNED, bi->nick.c_str(), ci->name.c_str());
return MOD_CONT;
}
bool OnHelp(CommandSource &source, const Anope::string &subcommand)
bool OnHelp(User *u, const Anope::string &subcommand)
{
source.Reply(_("Syntax: \002ASSIGN \037chan\037 \037nick\037\002\n"
" \n"
"Assigns a bot pointed out by nick to the channel chan. You\n"
"can then configure the bot for the channel so it fits\n"
"your needs."));
u->SendMessage(BotServ, BOT_HELP_ASSIGN);
return true;
}
void OnSyntaxError(CommandSource &source, const Anope::string &subcommand)
void OnSyntaxError(User *u, const Anope::string &subcommand)
{
SyntaxError(source, "ASSIGN", _("ASSIGN \037chan\037 \037nick\037"));
SyntaxError(BotServ, u, "ASSIGN", BOT_ASSIGN_SYNTAX);
}
void OnServHelp(User *u)
{
u->SendMessage(BotServ, BOT_HELP_CMD_ASSIGN);
}
};
+69 -100
View File
@@ -1,6 +1,6 @@
/* BotServ core functions
*
* (C) 2003-2011 Anope Team
* (C) 2003-2010 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
@@ -15,88 +15,88 @@
class BadwordsListCallback : public NumberList
{
CommandSource &source;
User *u;
ChannelInfo *ci;
bool SentHeader;
public:
BadwordsListCallback(CommandSource &_source, const Anope::string &list) : NumberList(list, false), source(_source), SentHeader(false)
BadwordsListCallback(User *_u, ChannelInfo *_ci, const Anope::string &list) : NumberList(list, false), u(_u), ci(_ci), SentHeader(false)
{
}
~BadwordsListCallback()
{
if (!SentHeader)
source.Reply(_("No matching entries on %s bad words list."), source.ci->name.c_str());
u->SendMessage(BotServ, BOT_BADWORDS_NO_MATCH, ci->name.c_str());
}
void HandleNumber(unsigned Number)
{
if (!Number || Number > source.ci->GetBadWordCount())
if (!Number || Number > ci->GetBadWordCount())
return;
if (!SentHeader)
{
SentHeader = true;
source.Reply(_("Bad words list for %s:\n"
" Num Word Type"), source.ci->name.c_str());
u->SendMessage(BotServ, BOT_BADWORDS_LIST_HEADER, ci->name.c_str());
}
DoList(source, Number - 1, source.ci->GetBadWord(Number - 1));
DoList(u, ci, Number - 1, ci->GetBadWord(Number - 1));
}
static void DoList(CommandSource &source, unsigned Number, BadWord *bw)
static void DoList(User *u, ChannelInfo *ci, unsigned Number, BadWord *bw)
{
source.Reply(_(" %3d %-30s %s"), Number + 1, bw->word.c_str(), bw->type == BW_SINGLE ? "(SINGLE)" : (bw->type == BW_START ? "(START)" : (bw->type == BW_END ? "(END)" : "")));
u->SendMessage(BotServ, BOT_BADWORDS_LIST_FORMAT, Number + 1, bw->word.c_str(), bw->type == BW_SINGLE ? "(SINGLE)" : (bw->type == BW_START ? "(START)" : (bw->type == BW_END ? "(END)" : "")));
}
};
class BadwordsDelCallback : public NumberList
{
CommandSource &source;
User *u;
ChannelInfo *ci;
Command *c;
unsigned Deleted;
bool override;
public:
BadwordsDelCallback(CommandSource &_source, Command *_c, const Anope::string &list) : NumberList(list, true), source(_source), c(_c), Deleted(0), override(false)
BadwordsDelCallback(User *_u, ChannelInfo *_ci, Command *_c, const Anope::string &list) : NumberList(list, true), u(_u), ci(_ci), c(_c), Deleted(0), override(false)
{
if (!check_access(source.u, source.ci, CA_BADWORDS) && source.u->HasPriv("botserv/administration"))
if (!check_access(u, ci, CA_BADWORDS) && u->Account()->HasPriv("botserv/administration"))
this->override = true;
}
~BadwordsDelCallback()
{
if (!Deleted)
source.Reply(_("No matching entries on %s bad words list."), source.ci->name.c_str());
u->SendMessage(BotServ, BOT_BADWORDS_NO_MATCH, ci->name.c_str());
else if (Deleted == 1)
source.Reply(_("Deleted 1 entry from %s bad words list."), source.ci->name.c_str());
u->SendMessage(BotServ, BOT_BADWORDS_DELETED_ONE, ci->name.c_str());
else
source.Reply(_("Deleted %d entries from %s bad words list."), Deleted, source.ci->name.c_str());
u->SendMessage(BotServ, BOT_BADWORDS_DELETED_SEVERAL, Deleted, ci->name.c_str());
}
void HandleNumber(unsigned Number)
{
if (!Number || Number > source.ci->GetBadWordCount())
if (!Number || Number > ci->GetBadWordCount())
return;
Log(override ? LOG_OVERRIDE : LOG_COMMAND, source.u, c, source.ci) << "DEL " << source.ci->GetBadWord(Number - 1)->word;
Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, c, ci) << "DEL " << ci->GetBadWord(Number -1 )->word;
++Deleted;
source.ci->EraseBadWord(Number - 1);
ci->EraseBadWord(Number - 1);
}
};
class CommandBSBadwords : public Command
{
private:
CommandReturn DoList(CommandSource &source, const Anope::string &word)
CommandReturn DoList(User *u, ChannelInfo *ci, const Anope::string &word)
{
ChannelInfo *ci = source.ci;
bool override = !check_access(source.u, ci, CA_BADWORDS);
Log(override ? LOG_OVERRIDE : LOG_COMMAND, source.u, this, ci) << "LIST";
bool override = !check_access(u, ci, CA_BADWORDS);
Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "LIST";
if (!ci->GetBadWordCount())
source.Reply(_("%s bad words list is empty."), ci->name.c_str());
u->SendMessage(BotServ, BOT_BADWORDS_LIST_EMPTY, ci->name.c_str());
else if (!word.empty() && word.find_first_not_of("1234567890,-") == Anope::string::npos)
{
BadwordsListCallback list(source, word);
BadwordsListCallback list(u, ci, word);
list.Process();
}
else
@@ -113,24 +113,21 @@ class CommandBSBadwords : public Command
if (!SentHeader)
{
SentHeader = true;
source.Reply(_("Bad words list for %s:\n"
" Num Word Type"), ci->name.c_str());
u->SendMessage(BotServ, BOT_BADWORDS_LIST_HEADER, ci->name.c_str());
}
BadwordsListCallback::DoList(source, i, bw);
BadwordsListCallback::DoList(u, ci, i, bw);
}
if (!SentHeader)
source.Reply(_("No matching entries on %s bad words list."), ci->name.c_str());
u->SendMessage(BotServ, BOT_BADWORDS_NO_MATCH, ci->name.c_str());
}
return MOD_CONT;
}
CommandReturn DoAdd(CommandSource &source, const Anope::string &word)
CommandReturn DoAdd(User *u, ChannelInfo *ci, const Anope::string &word)
{
ChannelInfo *ci = source.ci;
size_t pos = word.rfind(' ');
BadWordType type = BW_ANY;
Anope::string realword = word;
@@ -152,7 +149,7 @@ class CommandBSBadwords : public Command
if (ci->GetBadWordCount() >= Config->BSBadWordsMax)
{
source.Reply(_("Sorry, you can only have %d bad words entries on a channel."), Config->BSBadWordsMax);
u->SendMessage(BotServ, BOT_BADWORDS_REACHED_LIMIT, Config->BSBadWordsMax);
return MOD_CONT;
}
@@ -162,27 +159,26 @@ class CommandBSBadwords : public Command
if (!bw->word.empty() && ((Config->BSCaseSensitive && realword.equals_cs(bw->word)) || (!Config->BSCaseSensitive && realword.equals_ci(bw->word))))
{
source.Reply(_("\002%s\002 already exists in %s bad words list."), bw->word.c_str(), ci->name.c_str());
u->SendMessage(BotServ, BOT_BADWORDS_ALREADY_EXISTS, bw->word.c_str(), ci->name.c_str());
return MOD_CONT;
}
}
bool override = !check_access(source.u, ci, CA_BADWORDS);
Log(override ? LOG_OVERRIDE : LOG_COMMAND, source.u, this, ci) << "ADD " << realword;
bool override = !check_access(u, ci, CA_BADWORDS);
Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "ADD " << realword;
ci->AddBadWord(realword, type);
source.Reply(_("\002%s\002 added to %s bad words list."), realword.c_str(), ci->name.c_str());
u->SendMessage(BotServ, BOT_BADWORDS_ADDED, realword.c_str(), ci->name.c_str());
return MOD_CONT;
}
CommandReturn DoDelete(CommandSource &source, const Anope::string &word)
CommandReturn DoDelete(User *u, ChannelInfo *ci, const Anope::string &word)
{
ChannelInfo *ci = source.ci;
/* Special case: is it a number/list? Only do search if it isn't. */
if (!word.empty() && isdigit(word[0]) && word.find_first_not_of("1234567890,-") == Anope::string::npos)
{
BadwordsDelCallback list(source, this, word);
BadwordsDelCallback list(u, ci, this, word);
list.Process();
}
else
@@ -200,14 +196,14 @@ class CommandBSBadwords : public Command
if (i == end)
{
source.Reply(_("\002%s\002 not found on %s bad words list."), word.c_str(), ci->name.c_str());
u->SendMessage(BotServ, BOT_BADWORDS_NOT_FOUND, word.c_str(), ci->name.c_str());
return MOD_CONT;
}
bool override = !check_access(source.u, ci, CA_BADWORDS);
Log(override ? LOG_OVERRIDE : LOG_COMMAND, source.u, this, ci) << "DEL " << badword->word;
bool override = !check_access(u, ci, CA_BADWORDS);
Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "DEL " << badword->word;
source.Reply(_("\002%s\002 deleted from %s bad words list."), badword->word.c_str(), ci->name.c_str());
u->SendMessage(BotServ, BOT_BADWORDS_DELETED, badword->word.c_str(), ci->name.c_str());
ci->EraseBadWord(i);
}
@@ -215,103 +211,76 @@ class CommandBSBadwords : public Command
return MOD_CONT;
}
CommandReturn DoClear(CommandSource &source)
CommandReturn DoClear(User *u, ChannelInfo *ci)
{
ChannelInfo *ci = source.ci;
bool override = !check_access(source.u, ci, CA_BADWORDS);
Log(override ? LOG_OVERRIDE : LOG_COMMAND, source.u, this, ci) << "CLEAR";
bool override = !check_access(u, ci, CA_BADWORDS);
Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "CLEAR";
ci->ClearBadWords();
source.Reply(_("Bad words list is now empty."));
u->SendMessage(BotServ, BOT_BADWORDS_CLEAR);
return MOD_CONT;
}
public:
CommandBSBadwords() : Command("BADWORDS", 2, 3)
{
this->SetDesc(_("Maintains bad words list"));
}
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
{
const Anope::string &cmd = params[1];
const Anope::string &word = params.size() > 2 ? params[2] : "";
User *u = source.u;
ChannelInfo *ci = source.ci;
Anope::string chan = params[0];
Anope::string cmd = params[1];
Anope::string word = params.size() > 2 ? params[2] : "";
ChannelInfo *ci;
bool need_args = cmd.equals_ci("LIST") || cmd.equals_ci("CLEAR");
if (!need_args && word.empty())
{
this->OnSyntaxError(source, cmd);
this->OnSyntaxError(u, cmd);
return MOD_CONT;
}
if (!check_access(u, ci, CA_BADWORDS) && (!need_args || !u->HasPriv("botserv/administration")))
ci = cs_findchan(chan);
if (!check_access(u, ci, CA_BADWORDS) && (!need_args || !u->Account()->HasPriv("botserv/administration")))
{
source.Reply(_(ACCESS_DENIED));
u->SendMessage(BotServ, ACCESS_DENIED);
return MOD_CONT;
}
if (readonly)
{
source.Reply(_("Sorry, channel bad words list modification is temporarily disabled."));
u->SendMessage(BotServ, BOT_BADWORDS_DISABLED);
return MOD_CONT;
}
if (cmd.equals_ci("ADD"))
return this->DoAdd(source, word);
return this->DoAdd(u, ci, word);
else if (cmd.equals_ci("DEL"))
return this->DoDelete(source, word);
return this->DoDelete(u, ci, word);
else if (cmd.equals_ci("LIST"))
return this->DoList(source, word);
return this->DoList(u, ci, word);
else if (cmd.equals_ci("CLEAR"))
return this->DoClear(source);
return this->DoClear(u, ci);
else
this->OnSyntaxError(source, "");
this->OnSyntaxError(u, "");
return MOD_CONT;
}
bool OnHelp(CommandSource &source, const Anope::string &subcommand)
bool OnHelp(User *u, const Anope::string &subcommand)
{
source.Reply(_("Syntax: \002BADWORDS \037channel\037 ADD \037word\037 [\037SINGLE\037 | \037START\037 | \037END\037]\002\n"
" \002BADWORDS \037channel\037 DEL {\037word\037 | \037entry-num\037 | \037list\037}\002\n"
" \002BADWORDS \037channel\037 LIST [\037mask\037 | \037list\037]\002\n"
" \002BADWORDS \037channel\037 CLEAR\002\n"
" \n"
"Maintains the \002bad words list\002 for a channel. The bad\n"
"words list determines which words are to be kicked\n"
"when the bad words kicker is enabled. For more information,\n"
"type \002%s%s HELP KICK BADWORDS\002.\n"
" \n"
"The \002BADWORDS ADD\002 command adds the given word to the\n"
"badword list. If SINGLE is specified, a kick will be\n"
"done only if a user says the entire word. If START is \n"
"specified, a kick will be done if a user says a word\n"
"that starts with \037word\037. If END is specified, a kick\n"
"will be done if a user says a word that ends with\n"
"\037word\037. If you don't specify anything, a kick will\n"
"be issued every time \037word\037 is said by a user.\n"
" \n"), Config->UseStrictPrivMsgString.c_str(), BotServ->nick.c_str());
source.Reply(_("The \002BADWORDS DEL\002 command removes the given word from the\n"
"bad words list. If a list of entry numbers is given, those\n"
"entries are deleted. (See the example for LIST below.)\n"
" \n"
"The \002BADWORDS LIST\002 command displays the bad words list. If\n"
"a wildcard mask is given, only those entries matching the\n"
"mask are displayed. If a list of entry numbers is given,\n"
"only those entries are shown; for example:\n"
" \002BADWORDS #channel LIST 2-5,7-9\002\n"
" Lists bad words entries numbered 2 through 5 and\n"
" 7 through 9.\n"
" \n"
"The \002BADWORDS CLEAR\002 command clears all entries of the\n"
"bad words list."));
u->SendMessage(BotServ, BOT_HELP_BADWORDS);
return true;
}
void OnSyntaxError(CommandSource &source, const Anope::string &subcommand)
void OnSyntaxError(User *u, const Anope::string &subcommand)
{
SyntaxError(source, "BADWORDS", _("BADWORDS \037channel\037 {ADD|DEL|LIST|CLEAR} [\037word\037 | \037entry-list\037] [SINGLE|START|END]"));
SyntaxError(BotServ, u, "BADWORDS", BOT_BADWORDS_SYNTAX);
}
void OnServHelp(User *u)
{
u->SendMessage(BotServ, BOT_HELP_CMD_BADWORDS);
}
};
+80 -93
View File
@@ -1,6 +1,6 @@
/* BotServ core functions
*
* (C) 2003-2011 Anope Team
* (C) 2003-2010 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
@@ -16,70 +16,70 @@
class CommandBSBot : public Command
{
private:
CommandReturn DoAdd(CommandSource &source, const std::vector<Anope::string> &params)
CommandReturn DoAdd(User *u, const std::vector<Anope::string> &params)
{
const Anope::string &nick = params[1];
const Anope::string &user = params[2];
const Anope::string &host = params[3];
const Anope::string &real = params[4];
Anope::string nick = params[1];
Anope::string user = params[2];
Anope::string host = params[3];
Anope::string real = params[4];
BotInfo *bi;
if (findbot(nick))
{
source.Reply(_("Bot \002%s\002 already exists."), nick.c_str());
u->SendMessage(BotServ, BOT_BOT_ALREADY_EXISTS, nick.c_str());
return MOD_CONT;
}
if (nick.length() > Config->NickLen)
{
source.Reply(_("Bot Nicks may only contain valid nick characters."));
u->SendMessage(BotServ, BOT_BAD_NICK);
return MOD_CONT;
}
if (user.length() > Config->UserLen)
{
source.Reply(_("Bot Idents may only contain %d characters."), Config->UserLen);
u->SendMessage(BotServ, BOT_LONG_IDENT, Config->UserLen);
return MOD_CONT;
}
if (host.length() > Config->HostLen)
{
source.Reply(_("Bot Hosts may only contain %d characters."), Config->HostLen);
u->SendMessage(BotServ, BOT_LONG_HOST, Config->HostLen);
return MOD_CONT;
}
/* Check the nick is valid re RFC 2812 */
if (isdigit(nick[0]) || nick[0] == '-')
{
source.Reply(_("Bot Nicks may only contain valid nick characters."));
u->SendMessage(BotServ, BOT_BAD_NICK);
return MOD_CONT;
}
for (unsigned i = 0, end = nick.length(); i < end && i < Config->NickLen; ++i)
if (!isvalidnick(nick[i]))
{
source.Reply(_("Bot Nicks may only contain valid nick characters."));
u->SendMessage(BotServ, BOT_BAD_NICK);
return MOD_CONT;
}
/* check for hardcored ircd forbidden nicks */
if (!ircdproto->IsNickValid(nick))
{
source.Reply(_("Bot Nicks may only contain valid nick characters."));
u->SendMessage(BotServ, BOT_BAD_NICK);
return MOD_CONT;
}
/* Check the host is valid re RFC 2812 */
if (!isValidHost(host, 3))
{
source.Reply(_("Bot Hosts may only contain valid host characters."));
u->SendMessage(BotServ, BOT_BAD_HOST);
return MOD_CONT;
}
for (unsigned i = 0, end = user.length(); i < end && i < Config->UserLen; ++i)
if (!isalnum(user[i]))
{
source.Reply(_("Bot Idents may only contain valid characters."), Config->UserLen);
u->SendMessage(BotServ, BOT_BAD_IDENT, Config->UserLen);
return MOD_CONT;
}
@@ -89,73 +89,73 @@ class CommandBSBot : public Command
*/
if (findnick(nick))
{
source.Reply(_(NICK_ALREADY_REGISTERED), nick.c_str());
u->SendMessage(BotServ, NICK_ALREADY_REGISTERED, nick.c_str());
return MOD_CONT;
}
if (!(bi = new BotInfo(nick, user, host, real)))
{
// XXX this cant happen?
source.Reply(_("Sorry, bot creation failed."));
u->SendMessage(BotServ, BOT_BOT_CREATION_FAILED);
return MOD_CONT;
}
Log(LOG_ADMIN, source.u, this) << "ADD " << bi->GetMask() << " " << bi->realname;
Log(LOG_ADMIN, u, this) << "ADD " << bi->GetMask() << " " << bi->realname;
source.Reply(_("%s!%s@%s (%s) added to the bot list."), bi->nick.c_str(), bi->GetIdent().c_str(), bi->host.c_str(), bi->realname.c_str());
u->SendMessage(BotServ, BOT_BOT_ADDED, bi->nick.c_str(), bi->GetIdent().c_str(), bi->host.c_str(), bi->realname.c_str());
FOREACH_MOD(I_OnBotCreate, OnBotCreate(bi));
return MOD_CONT;
}
CommandReturn DoChange(CommandSource &source, const std::vector<Anope::string> &params)
CommandReturn DoChange(User *u, const std::vector<Anope::string> &params)
{
const Anope::string &oldnick = params[1];
const Anope::string &nick = params.size() > 2 ? params[2] : "";
const Anope::string &user = params.size() > 3 ? params[3] : "";
const Anope::string &host = params.size() > 4 ? params[4] : "";
const Anope::string &real = params.size() > 5 ? params[5] : "";
Anope::string oldnick = params[1];
Anope::string nick = params.size() > 2 ? params[2] : "";
Anope::string user = params.size() > 3 ? params[3] : "";
Anope::string host = params.size() > 4 ? params[4] : "";
Anope::string real = params.size() > 5 ? params[5] : "";
BotInfo *bi;
if (oldnick.empty() || nick.empty())
{
this->OnSyntaxError(source, "CHANGE");
this->OnSyntaxError(u, "CHANGE");
return MOD_CONT;
}
if (!(bi = findbot(oldnick)))
{
source.Reply(_(BOT_DOES_NOT_EXIST), oldnick.c_str());
u->SendMessage(BotServ, BOT_DOES_NOT_EXIST, oldnick.c_str());
return MOD_CONT;
}
if (!oldnick.equals_ci(nick) && nickIsServices(oldnick, false))
{
source.Reply(_(BOT_DOES_NOT_EXIST), oldnick.c_str());
u->SendMessage(BotServ, BOT_DOES_NOT_EXIST, oldnick.c_str());
return MOD_CONT;
}
if (nick.length() > Config->NickLen)
{
source.Reply(_("Bot Nicks may only contain valid nick characters."));
u->SendMessage(BotServ, BOT_BAD_NICK);
return MOD_CONT;
}
if (!user.empty() && user.length() > Config->UserLen)
{
source.Reply(_("Bot Idents may only contain %d characters."), Config->UserLen);
u->SendMessage(BotServ, BOT_LONG_IDENT, Config->UserLen);
return MOD_CONT;
}
if (!host.empty() && host.length() > Config->HostLen)
{
source.Reply(_("Bot Hosts may only contain %d characters."), Config->HostLen);
u->SendMessage(BotServ, BOT_LONG_HOST, Config->HostLen);
return MOD_CONT;
}
if (!oldnick.equals_ci(nick) && nickIsServices(nick, false))
{
source.Reply(_(BOT_DOES_NOT_EXIST), oldnick.c_str());
u->SendMessage(BotServ, BOT_DOES_NOT_EXIST, oldnick.c_str());
return MOD_CONT;
}
@@ -166,34 +166,34 @@ class CommandBSBot : public Command
*/
if (nick.equals_cs(bi->nick) && (!user.empty() ? user.equals_cs(bi->GetIdent()) : 1) && (!host.empty() ? host.equals_cs(bi->host) : 1) && (!real.empty() ? real.equals_cs(bi->realname) : 1))
{
source.Reply(_("Old info is equal to the new one."));
u->SendMessage(BotServ, BOT_BOT_ANY_CHANGES);
return MOD_CONT;
}
/* Check the nick is valid re RFC 2812 */
if (isdigit(nick[0]) || nick[0] == '-')
{
source.Reply(_("Bot Nicks may only contain valid nick characters."));
u->SendMessage(BotServ, BOT_BAD_NICK);
return MOD_CONT;
}
for (unsigned i = 0, end = nick.length(); i < end && i < Config->NickLen; ++i)
if (!isvalidnick(nick[i]))
{
source.Reply(_("Bot Nicks may only contain valid nick characters."));
u->SendMessage(BotServ, BOT_BAD_NICK);
return MOD_CONT;
}
/* check for hardcored ircd forbidden nicks */
if (!ircdproto->IsNickValid(nick))
{
source.Reply(_("Bot Nicks may only contain valid nick characters."));
u->SendMessage(BotServ, BOT_BAD_NICK);
return MOD_CONT;
}
if (!host.empty() && !isValidHost(host, 3))
{
source.Reply(_("Bot Hosts may only contain valid host characters."));
u->SendMessage(BotServ, BOT_BAD_HOST);
return MOD_CONT;
}
@@ -201,13 +201,13 @@ class CommandBSBot : public Command
for (unsigned i = 0, end = user.length(); i < end && i < Config->UserLen; ++i)
if (!isalnum(user[i]))
{
source.Reply(_("Bot Idents may only contain valid characters."), Config->UserLen);
u->SendMessage(BotServ, BOT_BAD_IDENT, Config->UserLen);
return MOD_CONT;
}
if (!nick.equals_ci(bi->nick) && findbot(nick))
{
source.Reply(_("Bot \002%s\002 already exists."), nick.c_str());
u->SendMessage(BotServ, BOT_BOT_ALREADY_EXISTS, nick.c_str());
return MOD_CONT;
}
@@ -219,7 +219,7 @@ class CommandBSBot : public Command
*/
if (findnick(nick))
{
source.Reply(_(NICK_ALREADY_REGISTERED), nick.c_str());
u->SendMessage(BotServ, NICK_ALREADY_REGISTERED, nick.c_str());
return MOD_CONT;
}
@@ -241,7 +241,7 @@ class CommandBSBot : public Command
{
ircdproto->SendChangeBotNick(bi, nick);
XLine x(bi->nick, "Reserved for services");
ircdproto->SendSQLine(NULL, &x);
ircdproto->SendSQLine(&x);
}
if (!nick.equals_cs(bi->nick))
@@ -258,78 +258,80 @@ class CommandBSBot : public Command
{
ircdproto->SendClientIntroduction(bi, ircd->pseudoclient_mode);
XLine x(bi->nick, "Reserved for services");
ircdproto->SendSQLine(NULL, &x);
ircdproto->SendSQLine(&x);
bi->RejoinAll();
}
source.Reply(_("Bot \002%s\002 has been changed to %s!%s@%s (%s)"), oldnick.c_str(), bi->nick.c_str(), bi->GetIdent().c_str(), bi->host.c_str(), bi->realname.c_str());
Log(LOG_ADMIN, source.u, this) << "CHANGE " << oldnick << " to " << bi->GetMask() << " " << bi->realname;
u->SendMessage(BotServ, BOT_BOT_CHANGED, oldnick.c_str(), bi->nick.c_str(), bi->GetIdent().c_str(), bi->host.c_str(), bi->realname.c_str());
Log(LOG_ADMIN, u, this) << "CHANGE " << oldnick << " to " << bi->GetMask() << " " << bi->realname;
FOREACH_MOD(I_OnBotChange, OnBotChange(bi));
return MOD_CONT;
}
CommandReturn DoDel(CommandSource &source, const std::vector<Anope::string> &params)
CommandReturn DoDel(User *u, const std::vector<Anope::string> &params)
{
const Anope::string &nick = params[1];
Anope::string nick = params[1];
BotInfo *bi;
if (nick.empty())
{
this->OnSyntaxError(source, "DEL");
this->OnSyntaxError(u, "DEL");
return MOD_CONT;
}
if (!(bi = findbot(nick)))
{
source.Reply(_(BOT_DOES_NOT_EXIST), nick.c_str());
u->SendMessage(BotServ, BOT_DOES_NOT_EXIST, nick.c_str());
return MOD_CONT;
}
if (nickIsServices(nick, false))
{
source.Reply(_(BOT_DOES_NOT_EXIST), nick.c_str());
u->SendMessage(BotServ, BOT_DOES_NOT_EXIST, nick.c_str());
return MOD_CONT;
}
FOREACH_MOD(I_OnBotDelete, OnBotDelete(bi));
Log(LOG_ADMIN, source.u, this) << "DEL " << bi->nick;
ircdproto->SendQuit(bi, "Quit: Help! I'm being deleted by %s!", u->nick.c_str());
XLine x(bi->nick);
ircdproto->SendSQLineDel(&x);
Log(LOG_ADMIN, u, this) << "DEL " << bi->nick;
source.Reply(_("Bot \002%s\002 has been deleted."), nick.c_str());
delete bi;
u->SendMessage(BotServ, BOT_BOT_DELETED, nick.c_str());
return MOD_CONT;
}
public:
CommandBSBot() : Command("BOT", 1, 6)
{
this->SetFlag(CFLAG_STRIP_CHANNEL);
this->SetDesc(_("Maintains network bot list"));
}
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
{
const Anope::string &cmd = params[0];
User *u = source.u;
Anope::string cmd = params[0];
if (readonly)
{
source.Reply(_("Sorry, bot modification is temporarily disabled."));
u->SendMessage(BotServ, BOT_BOT_READONLY);
return MOD_CONT;
}
if (cmd.equals_ci("ADD"))
{
// ADD nick user host real - 5
if (!u->HasCommand("botserv/bot/add"))
if (!u->Account()->HasCommand("botserv/bot/add"))
{
source.Reply(_(ACCESS_DENIED));
u->SendMessage(BotServ, ACCESS_DENIED);
return MOD_CONT;
}
if (params.size() < 5)
{
this->OnSyntaxError(source, "ADD");
this->OnSyntaxError(u, "ADD");
return MOD_CONT;
}
@@ -338,78 +340,63 @@ class CommandBSBot : public Command
if (tempparams.size() >= 6)
tempparams[4] = tempparams[4] + " " + tempparams[5];
return this->DoAdd(source, tempparams);
return this->DoAdd(u, tempparams);
}
else if (cmd.equals_ci("CHANGE"))
{
// CHANGE oldn newn user host real - 6
// but only oldn and newn are required
if (!u->HasCommand("botserv/bot/change"))
if (!u->Account()->HasCommand("botserv/bot/change"))
{
source.Reply(_(ACCESS_DENIED));
u->SendMessage(BotServ, ACCESS_DENIED);
return MOD_CONT;
}
if (params.size() < 3)
{
this->OnSyntaxError(source, "CHANGE");
this->OnSyntaxError(u, "CHANGE");
return MOD_CONT;
}
return this->DoChange(source, params);
return this->DoChange(u, params);
}
else if (cmd.equals_ci("DEL"))
{
// DEL nick
if (!u->HasCommand("botserv/bot/del"))
if (!u->Account()->HasCommand("botserv/bot/del"))
{
source.Reply(_(ACCESS_DENIED));
u->SendMessage(BotServ, ACCESS_DENIED);
return MOD_CONT;
}
if (params.size() < 1)
{
this->OnSyntaxError(source, "DEL");
this->OnSyntaxError(u, "DEL");
return MOD_CONT;
}
return this->DoDel(source, params);
return this->DoDel(u, params);
}
else
this->OnSyntaxError(source, "");
this->OnSyntaxError(u, "");
return MOD_CONT;
}
bool OnHelp(CommandSource &source, const Anope::string &subcommand)
bool OnHelp(User *u, const Anope::string &subcommand)
{
source.Reply(_("Syntax: \002BOT ADD \037nick\037 \037user\037 \037host\037 \037real\037\002\n"
" \002BOT CHANGE \037oldnick\037 \037newnick\037 [\037user\037 [\037host\037 [\037real\037]]]\002\n"
" \002BOT DEL \037nick\037\002\n"
" \n"
"Allows Services Operators to create, modify, and delete\n"
"bots that users will be able to use on their own\n"
"channels.\n"
" \n"
"\002BOT ADD\002 adds a bot with the given nickname, username,\n"
"hostname and realname. Since no integrity checks are done \n"
"for these settings, be really careful.\n"
"\002BOT CHANGE\002 allows to change nickname, username, hostname\n"
"or realname of a bot without actually delete it (and all\n"
"the data associated with it).\n"
"\002BOT DEL\002 removes the given bot from the bot list. \n"
" \n"
"\002Note\002: you cannot create a bot that has a nick that is\n"
"currently registered. If an unregistered user is currently\n"
"using the nick, they will be killed."));
u->SendMessage(BotServ, BOT_SERVADMIN_HELP_BOT);
return true;
}
void OnSyntaxError(CommandSource &source, const Anope::string &subcommand)
void OnSyntaxError(User *u, const Anope::string &subcommand)
{
SyntaxError(source, "BOT", _("BOT ADD \037nick\037 \037user\037 \037host\037 \037real\037\n"
"\002BOT CHANGE \037oldnick\037 \037newnick\037 [\037user\037 [\037host\037 [\037real\037]]]\002\n"
"\002BOT DEL \037nick\037\002"));
SyntaxError(BotServ, u, "BOT", BOT_BOT_SYNTAX);
}
void OnServHelp(User *u)
{
u->SendMessage(BotServ, BOT_HELP_CMD_BOT);
}
};
+24 -18
View File
@@ -1,6 +1,6 @@
/* BotServ core functions
*
* (C) 2003-2011 Anope Team
* (C) 2003-2010 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
@@ -18,59 +18,65 @@ class CommandBSBotList : public Command
public:
CommandBSBotList() : Command("BOTLIST", 0, 0)
{
this->SetDesc(_("Lists available bots"));
}
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
{
User *u = source.u;
unsigned count = 0;
for (Anope::insensitive_map<BotInfo *>::const_iterator it = BotListByNick.begin(), it_end = BotListByNick.end(); it != it_end; ++it)
if (BotListByNick.empty())
{
u->SendMessage(BotServ, BOT_BOTLIST_EMPTY);
return MOD_CONT;
}
for (botinfo_map::const_iterator it = BotListByNick.begin(), it_end = BotListByNick.end(); it != it_end; ++it)
{
BotInfo *bi = it->second;
if (!bi->HasFlag(BI_PRIVATE))
{
if (!count)
source.Reply(_("Bot list:"));
u->SendMessage(BotServ, BOT_BOTLIST_HEADER);
++count;
source.Reply(" %-15s (%s@%s)", bi->nick.c_str(), bi->GetIdent().c_str(), bi->host.c_str());
u->SendMessage(Config->s_BotServ, " %-15s (%s@%s)", bi->nick.c_str(), bi->GetIdent().c_str(), bi->host.c_str());
}
}
if (u->HasCommand("botserv/botlist") && count < BotListByNick.size())
if (u->Account()->HasCommand("botserv/botlist") && count < BotListByNick.size())
{
source.Reply(_("Bots reserved to IRC operators:"));
u->SendMessage(BotServ, BOT_BOTLIST_PRIVATE_HEADER);
for (Anope::insensitive_map<BotInfo *>::const_iterator it = BotListByNick.begin(), it_end = BotListByNick.end(); it != it_end; ++it)
for (botinfo_map::const_iterator it = BotListByNick.begin(), it_end = BotListByNick.end(); it != it_end; ++it)
{
BotInfo *bi = it->second;
if (bi->HasFlag(BI_PRIVATE))
{
source.Reply(" %-15s (%s@%s)", bi->nick.c_str(), bi->GetIdent().c_str(), bi->host.c_str());
u->SendMessage(Config->s_BotServ, " %-15s (%s@%s)", bi->nick.c_str(), bi->GetIdent().c_str(), bi->host.c_str());
++count;
}
}
}
if (!count)
source.Reply(_("There are no bots available at this time.\n"
"Ask a Services Operator to create one!"));
u->SendMessage(BotServ, BOT_BOTLIST_EMPTY);
else
source.Reply(_("%d bots available."), count);
u->SendMessage(BotServ, BOT_BOTLIST_FOOTER, count);
return MOD_CONT;
}
bool OnHelp(CommandSource &source, const Anope::string &subcommand)
bool OnHelp(User *u, const Anope::string &subcommand)
{
source.Reply(_("Syntax: \002BOTLIST\002\n"
" \n"
"Lists all available bots on this network."));
u->SendMessage(BotServ, BOT_HELP_BOTLIST);
return true;
}
void OnServHelp(User *u)
{
u->SendMessage(BotServ, BOT_HELP_CMD_BOTLIST);
}
};
class BSBotList : public Module
+8 -21
View File
@@ -1,6 +1,6 @@
/* BotServ core functions
*
* (C) 2003-2011 Anope Team
* (C) 2003-2010 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
@@ -20,35 +20,22 @@ class CommandBSHelp : public Command
{
this->SetFlag(CFLAG_ALLOW_UNREGISTERED);
this->SetFlag(CFLAG_STRIP_CHANNEL);
this->SetDesc(_("Displays this list and give information about commands"));
}
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
{
mod_help_cmd(BotServ, source.u, NULL, params[0]);
mod_help_cmd(findbot(Config->s_BotServ), u, params[0]);
return MOD_CONT;
}
void OnSyntaxError(CommandSource &source, const Anope::string &subcommand)
void OnSyntaxError(User *u, const Anope::string &subcommand)
{
// Abuse syntax error to display general list help.
User *u = source.u;
source.Reply(_("\002%s\002 allows you to have a bot on your own channel.\n"
"It has been created for users that can't host or\n"
"configure a bot, or for use on networks that don't\n"
"allow user bots. Available commands are listed \n"
"below; to use them, type \002%s%s \037command\037\002. For\n"
"more information on a specific command, type\n"
"\002%s%s HELP \037command\037\002."),
BotServ->nick.c_str(), Config->UseStrictPrivMsgString.c_str(), BotServ->nick.c_str(),
Config->UseStrictPrivMsgString.c_str(), BotServ->nick.c_str());
u->SendMessage(BotServ, BOT_HELP);
for (CommandMap::const_iterator it = BotServ->Commands.begin(), it_end = BotServ->Commands.end(); it != it_end; ++it)
if (!Config->HidePrivilegedCommands || it->second->permission.empty() || u->HasCommand(it->second->permission))
it->second->OnServHelp(source);
source.Reply(_("Bot will join a channel whenever there is at least\n"
"\002%d\002 user(s) on it. Additionally, all %s commands\n"
"can be used if fantasy is enabled by prefixing the command\n"
"name with a %c."), Config->BSMinUsers, Config->s_ChanServ.c_str(), Config->BSFantasyCharacter[0]);
if (!Config->HidePrivilegedCommands || it->second->permission.empty() || (u->Account() && u->Account()->HasCommand(it->second->permission)))
it->second->OnServHelp(u);
u->SendMessage(BotServ, BOT_HELP_FOOTER, Config->BSMinUsers);
}
};
+73 -92
View File
@@ -1,6 +1,6 @@
/* BotServ core functions
*
* (C) 2003-2011 Anope Team
* (C) 2003-2010 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
@@ -17,7 +17,7 @@
class CommandBSInfo : public Command
{
private:
void send_bot_channels(CommandSource &source, BotInfo *bi)
void send_bot_channels(User *u, BotInfo *bi)
{
Anope::string buf;
for (registered_channel_map::const_iterator it = RegisteredChannelList.begin(), it_end = RegisteredChannelList.end(); it != it_end; ++it)
@@ -28,7 +28,7 @@ class CommandBSInfo : public Command
{
if (buf.length() + ci->name.length() > 300)
{
source.Reply("%s", buf.c_str());
u->SendMessage(Config->s_BotServ, "%s", buf.c_str());
buf.clear();
}
buf += " " + ci->name + " ";
@@ -36,204 +36,185 @@ class CommandBSInfo : public Command
}
if (!buf.empty())
source.Reply("%s", buf.c_str());
u->SendMessage(Config->s_BotServ, "%s", buf.c_str());
return;
}
public:
CommandBSInfo() : Command("INFO", 1, 1)
{
this->SetFlag(CFLAG_STRIP_CHANNEL);
this->SetDesc(_("Allows you to see BotServ information about a channel or a bot"));
}
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
{
const Anope::string &query = params[0];
BotInfo *bi;
ChannelInfo *ci;
Anope::string query = params[0];
bool need_comma = false;
int need_comma = 0;
char buf[BUFSIZE], *end;
User *u = source.u;
BotInfo *bi = findbot(query);
ChannelInfo *ci;
if (bi)
if ((bi = findbot(query)))
{
source.Reply(_("Information for bot \002%s\002:"), bi->nick.c_str());
source.Reply(_(" Mask : %s@%s"), bi->GetIdent().c_str(), bi->host.c_str());
source.Reply(_(" Real name : %s"), bi->realname.c_str());
source.Reply(_(" Created : %s"), do_strftime(bi->created).c_str());
source.Reply(_(" Options : %s"), bi->HasFlag(BI_PRIVATE) ? _("Private") : _("None"));
source.Reply(_(" Used on : %d channel(s)"), bi->chancount);
u->SendMessage(BotServ, BOT_INFO_BOT_HEADER, bi->nick.c_str());
u->SendMessage(BotServ, BOT_INFO_BOT_MASK, bi->GetIdent().c_str(), bi->host.c_str());
u->SendMessage(BotServ, BOT_INFO_BOT_REALNAME, bi->realname.c_str());
u->SendMessage(BotServ, BOT_INFO_BOT_CREATED, do_strftime(bi->created).c_str());
u->SendMessage(BotServ, BOT_INFO_BOT_OPTIONS, GetString(u, (bi->HasFlag(BI_PRIVATE) ? NICK_INFO_OPT_PRIVATE : NICK_INFO_OPT_NONE)).c_str());
u->SendMessage(BotServ, BOT_INFO_BOT_USAGE, bi->chancount);
if (u->HasPriv("botserv/administration"))
this->send_bot_channels(source, bi);
if (u->Account()->HasPriv("botserv/administration"))
this->send_bot_channels(u, bi);
}
else if ((ci = cs_findchan(query)))
{
if (!check_access(u, ci, CA_FOUNDER) && !u->HasPriv("botserv/administration"))
if (!check_access(u, ci, CA_FOUNDER) && !u->Account()->HasPriv("botserv/administration"))
{
source.Reply(_(ACCESS_DENIED));
u->SendMessage(BotServ, ACCESS_DENIED);
return MOD_CONT;
}
source.Reply(_(CHAN_INFO_HEADER), ci->name.c_str());
u->SendMessage(BotServ, CHAN_INFO_HEADER, ci->name.c_str());
if (ci->bi)
source.Reply(_(" Bot nick : %s"), ci->bi->nick.c_str());
u->SendMessage(BotServ, BOT_INFO_CHAN_BOT, ci->bi->nick.c_str());
else
source.Reply(_(" Bot nick : not assigned yet."));
u->SendMessage(BotServ, BOT_INFO_CHAN_BOT_NONE);
if (ci->botflags.HasFlag(BS_KICK_BADWORDS))
{
if (ci->ttb[TTB_BADWORDS])
source.Reply(_(" Bad words kicker : %s (%d kick(s) to ban)"), _(ENABLED), ci->ttb[TTB_BADWORDS]);
u->SendMessage(BotServ, BOT_INFO_CHAN_KICK_BADWORDS_BAN, GetString(u, BOT_INFO_ACTIVE).c_str(), ci->ttb[TTB_BADWORDS]);
else
source.Reply(_(" Bad words kicker : %s"), _(ENABLED));
u->SendMessage(BotServ, BOT_INFO_CHAN_KICK_BADWORDS, GetString(u, BOT_INFO_ACTIVE).c_str());
}
else
source.Reply(_(" Bad words kicker : %s"), _(DISABLED));
u->SendMessage(BotServ, BOT_INFO_CHAN_KICK_BADWORDS, GetString(u, BOT_INFO_INACTIVE).c_str());
if (ci->botflags.HasFlag(BS_KICK_BOLDS))
{
if (ci->ttb[TTB_BOLDS])
source.Reply(_(" Bolds kicker : %s (%d kick(s) to ban)"), _(ENABLED), ci->ttb[TTB_BOLDS]);
u->SendMessage(BotServ, BOT_INFO_CHAN_KICK_BOLDS_BAN, GetString(u, BOT_INFO_ACTIVE).c_str(), ci->ttb[TTB_BOLDS]);
else
source.Reply(_(" Bolds kicker : %s"), _(ENABLED));
u->SendMessage(BotServ, BOT_INFO_CHAN_KICK_BOLDS, GetString(u, BOT_INFO_ACTIVE).c_str());
}
else
source.Reply(_(" Bolds kicker : %s"), _(DISABLED));
u->SendMessage(BotServ, BOT_INFO_CHAN_KICK_BOLDS, GetString(u, BOT_INFO_INACTIVE).c_str());
if (ci->botflags.HasFlag(BS_KICK_CAPS))
{
if (ci->ttb[TTB_CAPS])
source.Reply(_(" Caps kicker : %s (%d kick(s) to ban; minimum %d/%d%%)"), _(ENABLED), ci->ttb[TTB_CAPS], ci->capsmin, ci->capspercent);
u->SendMessage(BotServ, BOT_INFO_CHAN_KICK_CAPS_BAN, GetString(u, BOT_INFO_ACTIVE).c_str(), ci->ttb[TTB_CAPS], ci->capsmin, ci->capspercent);
else
source.Reply(_(" Caps kicker : %s (minimum %d/%d%%)"), _(ENABLED), ci->capsmin, ci->capspercent);
u->SendMessage(BotServ, BOT_INFO_CHAN_KICK_CAPS_ON, GetString(u, BOT_INFO_ACTIVE).c_str(), ci->capsmin, ci->capspercent);
}
else
source.Reply(_(" Caps kicker : %s"), _(DISABLED));
u->SendMessage(BotServ, BOT_INFO_CHAN_KICK_CAPS_OFF, GetString(u, BOT_INFO_INACTIVE).c_str());
if (ci->botflags.HasFlag(BS_KICK_COLORS))
{
if (ci->ttb[TTB_COLORS])
source.Reply(_(" Colors kicker : %s (%d kick(s) to ban)"), _(ENABLED), ci->ttb[TTB_COLORS]);
u->SendMessage(BotServ, BOT_INFO_CHAN_KICK_COLORS_BAN, GetString(u, BOT_INFO_ACTIVE).c_str(), ci->ttb[TTB_COLORS]);
else
source.Reply(_(" Colors kicker : %s"), _(ENABLED));
u->SendMessage(BotServ, BOT_INFO_CHAN_KICK_COLORS, GetString(u, BOT_INFO_ACTIVE).c_str());
}
else
source.Reply(_(" Colors kicker : %s"), _(DISABLED));
u->SendMessage(BotServ, BOT_INFO_CHAN_KICK_COLORS, GetString(u, BOT_INFO_INACTIVE).c_str());
if (ci->botflags.HasFlag(BS_KICK_FLOOD))
{
if (ci->ttb[TTB_FLOOD])
source.Reply(_(" Flood kicker : %s (%d kick(s) to ban; %d lines in %ds)"), _(ENABLED), ci->ttb[TTB_FLOOD], ci->floodlines, ci->floodsecs);
u->SendMessage(BotServ, BOT_INFO_CHAN_KICK_FLOOD_BAN, GetString(u, BOT_INFO_ACTIVE).c_str(), ci->ttb[TTB_FLOOD], ci->floodlines, ci->floodsecs);
else
source.Reply(_(" Flood kicker : %s (%d lines in %ds)"), _(ENABLED), ci->floodlines, ci->floodsecs);
u->SendMessage(BotServ, BOT_INFO_CHAN_KICK_FLOOD_ON, GetString(u, BOT_INFO_ACTIVE).c_str(), ci->floodlines, ci->floodsecs);
}
else
source.Reply(_(" Flood kicker : %s"), _(DISABLED));
u->SendMessage(BotServ, BOT_INFO_CHAN_KICK_FLOOD_OFF, GetString(u, BOT_INFO_INACTIVE).c_str());
if (ci->botflags.HasFlag(BS_KICK_REPEAT))
{
if (ci->ttb[TTB_REPEAT])
source.Reply(_(" Repeat kicker : %s (%d kick(s) to ban; %d times)"), _(ENABLED), ci->ttb[TTB_REPEAT], ci->repeattimes);
u->SendMessage(BotServ, BOT_INFO_CHAN_KICK_REPEAT_BAN, GetString(u, BOT_INFO_ACTIVE).c_str(), ci->ttb[TTB_REPEAT], ci->repeattimes);
else
source.Reply(_(" Repeat kicker : %s (%d times)"), _(ENABLED), ci->repeattimes);
u->SendMessage(BotServ, BOT_INFO_CHAN_KICK_REPEAT_ON, GetString(u, BOT_INFO_ACTIVE).c_str(), ci->repeattimes);
}
else
source.Reply(_(" Repeat kicker : %s"), _(DISABLED));
u->SendMessage(BotServ, BOT_INFO_CHAN_KICK_REPEAT_OFF, GetString(u, BOT_INFO_INACTIVE).c_str());
if (ci->botflags.HasFlag(BS_KICK_REVERSES))
{
if (ci->ttb[TTB_REVERSES])
source.Reply(_(" Reverses kicker : %s (%d kick(s) to ban)"), _(ENABLED), ci->ttb[TTB_REVERSES]);
u->SendMessage(BotServ, BOT_INFO_CHAN_KICK_REVERSES_BAN, GetString(u, BOT_INFO_ACTIVE).c_str(), ci->ttb[TTB_REVERSES]);
else
source.Reply(_(" Reverses kicker : %s"), _(ENABLED));
u->SendMessage(BotServ, BOT_INFO_CHAN_KICK_REVERSES, GetString(u, BOT_INFO_ACTIVE).c_str());
}
else
source.Reply(_(" Reverses kicker : %s"), _(DISABLED));
u->SendMessage(BotServ, BOT_INFO_CHAN_KICK_REVERSES, GetString(u, BOT_INFO_INACTIVE).c_str());
if (ci->botflags.HasFlag(BS_KICK_UNDERLINES))
{
if (ci->ttb[TTB_UNDERLINES])
source.Reply(_(" Underlines kicker : %s (%d kick(s) to ban)"), _(ENABLED), ci->ttb[TTB_UNDERLINES]);
u->SendMessage(BotServ, BOT_INFO_CHAN_KICK_UNDERLINES_BAN, GetString(u, BOT_INFO_ACTIVE).c_str(), ci->ttb[TTB_UNDERLINES]);
else
source.Reply(_(" Underlines kicker : %s"), _(ENABLED));
u->SendMessage(BotServ, BOT_INFO_CHAN_KICK_UNDERLINES, GetString(u, BOT_INFO_ACTIVE).c_str());
}
else
source.Reply(_(" Underlines kicker : %s"), _(DISABLED));
u->SendMessage(BotServ, BOT_INFO_CHAN_KICK_UNDERLINES, GetString(u, BOT_INFO_INACTIVE).c_str());
if (ci->botflags.HasFlag(BS_KICK_ITALICS))
{
if (ci->ttb[TTB_ITALICS])
source.Reply(_(" Italics kicker : %s (%d kick(s) to ban)"), _(ENABLED), ci->ttb[TTB_ITALICS]);
u->SendMessage(BotServ, BOT_INFO_CHAN_KICK_ITALICS_BAN, GetString(u, BOT_INFO_ACTIVE).c_str(), ci->ttb[TTB_ITALICS]);
else
source.Reply(_(" Italics kicker : %s"), _(ENABLED));
u->SendMessage(BotServ, BOT_INFO_CHAN_KICK_ITALICS, GetString(u, BOT_INFO_ACTIVE).c_str());
}
else
source.Reply(_(" Italics kicker : %s"), _(DISABLED));
if (ci->botflags.HasFlag(BS_KICK_AMSGS))
{
if (ci->ttb[TTB_AMSGS])
source.Reply(_(" AMSG kicker : %s (%d kick(s) to ban)"), _(ENABLED), ci->ttb[TTB_AMSGS]);
else
source.Reply(_(" AMSG kicker : %s"), _(ENABLED));
}
else
source.Reply(_(" AMSG kicker : %s"), _(DISABLED));
if (ci->botflags.HasFlag(BS_MSG_PRIVMSG))
source.Reply(_(" Fantasy reply : %s"), "PRIVMSG");
else if (ci->botflags.HasFlag(BS_MSG_NOTICE))
source.Reply(_(" Fantasy reply : %s"), "NOTICE");
else if (ci->botflags.HasFlag(BS_MSG_NOTICEOPS))
source.Reply(_(" Fantasy reply : %s"), "NOTICEOPS");
u->SendMessage(BotServ, BOT_INFO_CHAN_KICK_ITALICS, GetString(u, BOT_INFO_INACTIVE).c_str());
end = buf;
*end = 0;
if (ci->botflags.HasFlag(BS_DONTKICKOPS))
{
end += snprintf(end, sizeof(buf) - (end - buf), "%s", _("Ops protection"));
need_comma = true;
end += snprintf(end, sizeof(buf) - (end - buf), "%s", GetString(u, BOT_INFO_OPT_DONTKICKOPS).c_str());
need_comma = 1;
}
if (ci->botflags.HasFlag(BS_DONTKICKVOICES))
{
end += snprintf(end, sizeof(buf) - (end - buf), "%s%s", need_comma ? ", " : "", _("Voices protection"));
need_comma = true;
end += snprintf(end, sizeof(buf) - (end - buf), "%s%s", need_comma ? ", " : "", GetString(u, BOT_INFO_OPT_DONTKICKVOICES).c_str());
need_comma = 1;
}
if (ci->botflags.HasFlag(BS_FANTASY))
{
end += snprintf(end, sizeof(buf) - (end - buf), "%s%s", need_comma ? ", " : "", _("Fantasy"));
need_comma = true;
end += snprintf(end, sizeof(buf) - (end - buf), "%s%s", need_comma ? ", " : "", GetString(u, BOT_INFO_OPT_FANTASY).c_str());
need_comma = 1;
}
if (ci->botflags.HasFlag(BS_GREET))
{
end += snprintf(end, sizeof(buf) - (end - buf), "%s%s", need_comma ? ", " : "", _("Greet"));
need_comma = true;
end += snprintf(end, sizeof(buf) - (end - buf), "%s%s", need_comma ? ", " : "", GetString(u, BOT_INFO_OPT_GREET).c_str());
need_comma = 1;
}
if (ci->botflags.HasFlag(BS_NOBOT))
{
end += snprintf(end, sizeof(buf) - (end - buf), "%s%s", need_comma ? ", " : "", _("No bot"));
need_comma = true;
end += snprintf(end, sizeof(buf) - (end - buf), "%s%s", need_comma ? ", " : "", GetString(u, BOT_INFO_OPT_NOBOT).c_str());
need_comma = 1;
}
if (ci->botflags.HasFlag(BS_SYMBIOSIS))
{
end += snprintf(end, sizeof(buf) - (end - buf), "%s%s", need_comma ? ", " : "", _("Symbiosis"));
need_comma = true;
end += snprintf(end, sizeof(buf) - (end - buf), "%s%s", need_comma ? ", " : "", GetString(u, BOT_INFO_OPT_SYMBIOSIS).c_str());
need_comma = 1;
}
source.Reply(_(" Options : %s"), *buf ? buf : _("None"));
u->SendMessage(BotServ, BOT_INFO_CHAN_OPTIONS, *buf ? buf : GetString(u, BOT_INFO_OPT_NONE).c_str());
}
else
source.Reply(_("\002%s\002 is not a valid bot or registered channel."), query.c_str());
u->SendMessage(BotServ, BOT_INFO_NOT_FOUND, query.c_str());
return MOD_CONT;
}
bool OnHelp(CommandSource &source, const Anope::string &subcommand)
bool OnHelp(User *u, const Anope::string &subcommand)
{
source.Reply(_("Syntax: \002INFO {\037chan\037 | \037nick\037}\002\n"
" \n"
"Allows you to see %s information about a channel or a bot.\n"
"If the parameter is a channel, then you'll get information\n"
"such as enabled kickers. If the parameter is a nick,\n"
"you'll get information about a bot, such as creation\n"
"time or number of channels it is on."), NickServ->nick.c_str());
u->SendMessage(BotServ, BOT_HELP_INFO);
return true;
}
void OnSyntaxError(CommandSource &source, const Anope::string &subcommand)
void OnSyntaxError(User *u, const Anope::string &subcommand)
{
SyntaxError(source, "INFO", _("INFO {\037chan\037 | \037nick\037}"));
SyntaxError(BotServ, u, "INFO", BOT_INFO_SYNTAX);
}
void OnServHelp(User *u)
{
u->SendMessage(BotServ, BOT_HELP_CMD_INFO);
}
};
+91 -252
View File
@@ -1,6 +1,6 @@
/* BotServ core functions
*
* (C) 2003-2011 Anope Team
* (C) 2003-2010 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
@@ -19,29 +19,27 @@ class CommandBSKick : public Command
public:
CommandBSKick() : Command("KICK", 3, 6)
{
this->SetDesc(_("Configures kickers"));
}
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
{
const Anope::string &chan = params[0];
const Anope::string &option = params[1];
const Anope::string &value = params[2];
const Anope::string &ttb = params.size() > 3 ? params[3] : "";
Anope::string chan = params[0];
Anope::string option = params[1];
Anope::string value = params[2];
Anope::string ttb = params.size() > 3 ? params[3] : "";
User *u = source.u;
ChannelInfo *ci = source.ci;
ChannelInfo *ci = cs_findchan(chan);
if (readonly)
source.Reply(_("Sorry, kicker configuration is temporarily disabled."));
u->SendMessage(BotServ, BOT_KICK_DISABLED);
else if (chan.empty() || option.empty() || value.empty())
SyntaxError(source, "KICK", _("KICK \037channel\037 \037option\037 {\037ON|\037} [\037settings\037]"));
SyntaxError(BotServ, u, "KICK", BOT_KICK_SYNTAX);
else if (!value.equals_ci("ON") && !value.equals_ci("OFF"))
SyntaxError(source, "KICK", _("KICK \037channel\037 \037option\037 {\037ON|\037} [\037settings\037]"));
else if (!check_access(u, ci, CA_SET) && !u->HasPriv("botserv/administration"))
source.Reply(_(ACCESS_DENIED));
SyntaxError(BotServ, u, "KICK", BOT_KICK_SYNTAX);
else if (!check_access(u, ci, CA_SET) && !u->Account()->HasPriv("botserv/administration"))
u->SendMessage(BotServ, ACCESS_DENIED);
else if (!ci->bi)
source.Reply(_(BOT_NOT_ASSIGNED), Config->UseStrictPrivMsgString.c_str(), BotServ->nick.c_str());
u->SendMessage(BotServ, BOT_NOT_ASSIGNED);
else
{
bool override = !check_access(u, ci, CA_SET);
@@ -57,13 +55,13 @@ class CommandBSKick : public Command
{
ci->ttb[TTB_BADWORDS] = convertTo<int16>(ttb);
if (ci->ttb[TTB_BADWORDS] < 0)
throw ConvertException();
throw CoreException();
}
catch (const ConvertException &)
catch (const CoreException &)
{
/* reset the value back to 0 - TSL */
ci->ttb[TTB_BADWORDS] = 0;
source.Reply(_("\002%s\002 cannot be taken as times to ban."), ttb.c_str());
u->SendMessage(BotServ, BOT_KICK_BAD_TTB, ttb.c_str());
return MOD_CONT;
}
}
@@ -72,17 +70,14 @@ class CommandBSKick : public Command
ci->botflags.SetFlag(BS_KICK_BADWORDS);
if (ci->ttb[TTB_BADWORDS])
source.Reply(_("Bot will now kick \002bad words\002, and will place a ban after \n"
"%d kicks for the same user. Use the BADWORDS command\n"
"to add or remove a bad word."), ci->ttb[TTB_BADWORDS]);
u->SendMessage(BotServ, BOT_KICK_BADWORDS_ON_BAN, ci->ttb[TTB_BADWORDS]);
else
source.Reply(_("Bot will now kick \002bad words\002. Use the BADWORDS command\n"
"to add or remove a bad word."));
u->SendMessage(BotServ, BOT_KICK_BADWORDS_ON);
}
else
{
ci->botflags.UnsetFlag(BS_KICK_BADWORDS);
source.Reply(_("Bot won't kick \002bad words\002 anymore."));
u->SendMessage(BotServ, BOT_KICK_BADWORDS_OFF);
}
}
else if (option.equals_ci("BOLDS"))
@@ -95,12 +90,12 @@ class CommandBSKick : public Command
{
ci->ttb[TTB_BOLDS] = convertTo<int16>(ttb);
if (ci->ttb[TTB_BOLDS] < 0)
throw ConvertException();
throw CoreException();
}
catch (const ConvertException &)
catch (const CoreException &)
{
ci->ttb[TTB_BOLDS] = 0;
source.Reply(_("\002%s\002 cannot be taken as times to ban."), ttb.c_str());
u->SendMessage(BotServ, BOT_KICK_BAD_TTB, ttb.c_str());
return MOD_CONT;
}
}
@@ -108,14 +103,14 @@ class CommandBSKick : public Command
ci->ttb[TTB_BOLDS] = 0;
ci->botflags.SetFlag(BS_KICK_BOLDS);
if (ci->ttb[TTB_BOLDS])
source.Reply(_("Bot will now kick \002bolds\002, and will place a ban after\n%d kicks to the same user."), ci->ttb[TTB_BOLDS]);
u->SendMessage(BotServ, BOT_KICK_BOLDS_ON_BAN, ci->ttb[TTB_BOLDS]);
else
source.Reply(_("Bot will now kick \002bolds\002."));
u->SendMessage(BotServ, BOT_KICK_BOLDS_ON);
}
else
{
ci->botflags.UnsetFlag(BS_KICK_BOLDS);
source.Reply(_("Bot won't kick \002bolds\002 anymore."));
u->SendMessage(BotServ, BOT_KICK_BOLDS_OFF);
}
}
else if (option.equals_ci("CAPS"))
@@ -131,12 +126,12 @@ class CommandBSKick : public Command
{
ci->ttb[TTB_CAPS] = convertTo<int16>(ttb);
if (ci->ttb[TTB_CAPS] < 0)
throw ConvertException();
throw CoreException();
}
catch (const ConvertException &)
catch (const CoreException &)
{
ci->ttb[TTB_CAPS] = 0;
source.Reply(_("\002%s\002 cannot be taken as times to ban."), ttb.c_str());
u->SendMessage(BotServ, BOT_KICK_BAD_TTB, ttb.c_str());
return MOD_CONT;
}
}
@@ -148,7 +143,7 @@ class CommandBSKick : public Command
{
ci->capsmin = convertTo<int16>(min);
}
catch (const ConvertException &) { }
catch (const CoreException &) { }
if (ci->capsmin < 1)
ci->capsmin = 10;
@@ -157,23 +152,20 @@ class CommandBSKick : public Command
{
ci->capspercent = convertTo<int16>(percent);
}
catch (const ConvertException &) { }
catch (const CoreException &) { }
if (ci->capspercent < 1 || ci->capspercent > 100)
ci->capspercent = 25;
ci->botflags.SetFlag(BS_KICK_CAPS);
if (ci->ttb[TTB_CAPS])
source.Reply(_("Bot will now kick \002caps\002 (they must constitute at least\n"
"%d characters and %d%% of the entire message), and will \n"
"place a ban after %d kicks for the same user."), ci->capsmin, ci->capspercent, ci->ttb[TTB_CAPS]);
u->SendMessage(BotServ, BOT_KICK_CAPS_ON_BAN, ci->capsmin, ci->capspercent, ci->ttb[TTB_CAPS]);
else
source.Reply(_("Bot will now kick \002caps\002 (they must constitute at least\n"
"%d characters and %d%% of the entire message)."), ci->capsmin, ci->capspercent);
u->SendMessage(BotServ, BOT_KICK_CAPS_ON, ci->capsmin, ci->capspercent);
}
else
{
ci->botflags.UnsetFlag(BS_KICK_CAPS);
source.Reply(_("Bot won't kick \002caps\002 anymore."));
u->SendMessage(BotServ, BOT_KICK_CAPS_OFF);
}
}
else if (option.equals_ci("COLORS"))
@@ -186,12 +178,12 @@ class CommandBSKick : public Command
{
ci->ttb[TTB_COLORS] = convertTo<int16>(ttb);
if (ci->ttb[TTB_COLORS] < 1)
throw ConvertException();
throw CoreException();
}
catch (const ConvertException &)
catch (const CoreException &)
{
ci->ttb[TTB_COLORS] = 0;
source.Reply(_("\002%s\002 cannot be taken as times to ban."), ttb.c_str());
u->SendMessage(BotServ, BOT_KICK_BAD_TTB, ttb.c_str());
return MOD_CONT;
}
}
@@ -200,14 +192,14 @@ class CommandBSKick : public Command
ci->botflags.SetFlag(BS_KICK_COLORS);
if (ci->ttb[TTB_COLORS])
source.Reply(_("Bot will now kick \002colors\002, and will place a ban after %d\nkicks for the same user."), ci->ttb[TTB_COLORS]);
u->SendMessage(BotServ, BOT_KICK_COLORS_ON_BAN, ci->ttb[TTB_COLORS]);
else
source.Reply(_("Bot will now kick \002colors\002."));
u->SendMessage(BotServ, BOT_KICK_COLORS_ON);
}
else
{
ci->botflags.UnsetFlag(BS_KICK_COLORS);
source.Reply(_("Bot won't kick \002colors\002 anymore."));
u->SendMessage(BotServ, BOT_KICK_COLORS_OFF);
}
}
else if (option.equals_ci("FLOOD"))
@@ -223,12 +215,12 @@ class CommandBSKick : public Command
{
ci->ttb[TTB_FLOOD] = convertTo<int16>(ttb);
if (ci->ttb[TTB_FLOOD] < 1)
throw ConvertException();
throw CoreException();
}
catch (const ConvertException &)
catch (const CoreException &)
{
ci->ttb[TTB_FLOOD] = 0;
source.Reply(_("\002%s\002 cannot be taken as times to ban."), ttb.c_str());
u->SendMessage(BotServ, BOT_KICK_BAD_TTB, ttb.c_str());
return MOD_CONT;
}
}
@@ -240,7 +232,7 @@ class CommandBSKick : public Command
{
ci->floodlines = convertTo<int16>(lines);
}
catch (const ConvertException &) { }
catch (const CoreException &) { }
if (ci->floodlines < 2)
ci->floodlines = 6;
@@ -249,7 +241,7 @@ class CommandBSKick : public Command
{
ci->floodsecs = convertTo<int16>(secs);
}
catch (const ConvertException &) { }
catch (const CoreException &) { }
if (ci->floodsecs < 1)
ci->floodsecs = 10;
if (ci->floodsecs > Config->BSKeepData)
@@ -257,14 +249,14 @@ class CommandBSKick : public Command
ci->botflags.SetFlag(BS_KICK_FLOOD);
if (ci->ttb[TTB_FLOOD])
source.Reply(_("Bot will now kick \002flood\002 (%d lines in %d seconds and\nwill place a ban after %d kicks for the same user."), ci->floodlines, ci->floodsecs, ci->ttb[TTB_FLOOD]);
u->SendMessage(BotServ, BOT_KICK_FLOOD_ON_BAN, ci->floodlines, ci->floodsecs, ci->ttb[TTB_FLOOD]);
else
source.Reply(_("Bot will now kick \002flood\002 (%d lines in %d seconds)."), ci->floodlines, ci->floodsecs);
u->SendMessage(BotServ, BOT_KICK_FLOOD_ON, ci->floodlines, ci->floodsecs);
}
else
{
ci->botflags.UnsetFlag(BS_KICK_FLOOD);
source.Reply(_("Bot won't kick \002flood\002 anymore."));
u->SendMessage(BotServ, BOT_KICK_FLOOD_OFF);
}
}
else if (option.equals_ci("REPEAT"))
@@ -279,12 +271,12 @@ class CommandBSKick : public Command
{
ci->ttb[TTB_REPEAT] = convertTo<int16>(ttb);
if (ci->ttb[TTB_REPEAT] < 0)
throw ConvertException();
throw CoreException();
}
catch (const ConvertException &)
catch (const CoreException &)
{
ci->ttb[TTB_REPEAT] = 0;
source.Reply(_("\002%s\002 cannot be taken as times to ban."), ttb.c_str());
u->SendMessage(BotServ, BOT_KICK_BAD_TTB, ttb.c_str());
return MOD_CONT;
}
}
@@ -296,23 +288,20 @@ class CommandBSKick : public Command
{
ci->repeattimes = convertTo<int16>(times);
}
catch (const ConvertException &) { }
catch (const CoreException &) { }
if (ci->repeattimes < 2)
ci->repeattimes = 3;
ci->botflags.SetFlag(BS_KICK_REPEAT);
if (ci->ttb[TTB_REPEAT])
source.Reply(_("Bot will now kick \002repeats\002 (users that say %d times\n"
"the same thing), and will place a ban after %d \n"
"kicks for the same user."), ci->repeattimes, ci->ttb[TTB_REPEAT]);
u->SendMessage(BotServ, BOT_KICK_REPEAT_ON_BAN, ci->repeattimes, ci->ttb[TTB_REPEAT]);
else
source.Reply(_("Bot will now kick \002repeats\002 (users that say %d times\n"
"the same thing)."), ci->repeattimes);
u->SendMessage(BotServ, BOT_KICK_REPEAT_ON, ci->repeattimes);
}
else
{
ci->botflags.UnsetFlag(BS_KICK_REPEAT);
source.Reply(_("Bot won't kick \002repeats\002 anymore."));
u->SendMessage(BotServ, BOT_KICK_REPEAT_OFF);
}
}
else if (option.equals_ci("REVERSES"))
@@ -325,12 +314,12 @@ class CommandBSKick : public Command
{
ci->ttb[TTB_REVERSES] = convertTo<int16>(ttb);
if (ci->ttb[TTB_REVERSES] < 0)
throw ConvertException();
throw CoreException();
}
catch (const ConvertException &)
catch (const CoreException &)
{
ci->ttb[TTB_REVERSES] = 0;
source.Reply(_("\002%s\002 cannot be taken as times to ban."), ttb.c_str());
u->SendMessage(BotServ, BOT_KICK_BAD_TTB, ttb.c_str());
return MOD_CONT;
}
}
@@ -338,14 +327,14 @@ class CommandBSKick : public Command
ci->ttb[TTB_REVERSES] = 0;
ci->botflags.SetFlag(BS_KICK_REVERSES);
if (ci->ttb[TTB_REVERSES])
source.Reply(_("Bot will now kick \002reverses\002, and will place a ban after %d\nkicks for the same user."), ci->ttb[TTB_REVERSES]);
u->SendMessage(BotServ, BOT_KICK_REVERSES_ON_BAN, ci->ttb[TTB_REVERSES]);
else
source.Reply(_("Bot will now kick \002reverses\002."));
u->SendMessage(BotServ, BOT_KICK_REVERSES_ON);
}
else
{
ci->botflags.UnsetFlag(BS_KICK_REVERSES);
source.Reply(_("Bot won't kick \002reverses\002 anymore."));
u->SendMessage(BotServ, BOT_KICK_REVERSES_OFF);
}
}
else if (option.equals_ci("UNDERLINES"))
@@ -358,12 +347,12 @@ class CommandBSKick : public Command
{
ci->ttb[TTB_UNDERLINES] = convertTo<int16>(ttb);
if (ci->ttb[TTB_REVERSES] < 0)
throw ConvertException();
throw CoreException();
}
catch (const ConvertException &)
catch (const CoreException &)
{
ci->ttb[TTB_UNDERLINES] = 0;
source.Reply(_("\002%s\002 cannot be taken as times to ban."), ttb.c_str());
u->SendMessage(BotServ, BOT_KICK_BAD_TTB, ttb.c_str());
return MOD_CONT;
}
}
@@ -372,14 +361,14 @@ class CommandBSKick : public Command
ci->botflags.SetFlag(BS_KICK_UNDERLINES);
if (ci->ttb[TTB_UNDERLINES])
source.Reply(_("Bot will now kick \002underlines\002, and will place a ban after %d\nkicks for the same user."), ci->ttb[TTB_UNDERLINES]);
u->SendMessage(BotServ, BOT_KICK_UNDERLINES_ON_BAN, ci->ttb[TTB_UNDERLINES]);
else
source.Reply(_("Bot will now kick \002underlines\002."));
u->SendMessage(BotServ, BOT_KICK_UNDERLINES_ON);
}
else
{
ci->botflags.UnsetFlag(BS_KICK_UNDERLINES);
source.Reply(_("Bot won't kick \002underlines\002 anymore."));
u->SendMessage(BotServ, BOT_KICK_UNDERLINES_OFF);
}
}
else if (option.equals_ci("ITALICS"))
@@ -392,12 +381,12 @@ class CommandBSKick : public Command
{
ci->ttb[TTB_ITALICS] = convertTo<int16>(ttb);
if (ci->ttb[TTB_ITALICS] < 0)
throw ConvertException();
throw CoreException();
}
catch (const ConvertException &)
catch (const CoreException &)
{
ci->ttb[TTB_ITALICS] = 0;
source.Reply(_("\002%s\002 cannot be taken as times to ban."), ttb.c_str());
u->SendMessage(BotServ, BOT_KICK_BAD_TTB, ttb.c_str());
return MOD_CONT;
}
}
@@ -406,174 +395,58 @@ class CommandBSKick : public Command
ci->botflags.SetFlag(BS_KICK_ITALICS);
if (ci->ttb[TTB_ITALICS])
source.Reply(_("Bot will now kick \002italics\002, and will place a ban after\n%d kicks for the same user."), ci->ttb[TTB_ITALICS]);
u->SendMessage(BotServ, BOT_KICK_ITALICS_ON_BAN, ci->ttb[TTB_ITALICS]);
else
source.Reply(_("Bot will now kick \002italics\002."));
u->SendMessage(BotServ, BOT_KICK_ITALICS_ON);
}
else
{
ci->botflags.UnsetFlag(BS_KICK_ITALICS);
source.Reply(_("Bot won't kick \002italics\002 anymore."));
}
}
else if (option.equals_ci("AMSGS"))
{
if (value.equals_ci("ON"))
{
if (!ttb.empty())
{
try
{
ci->ttb[TTB_AMSGS] = convertTo<int16>(ttb);
if (ci->ttb[TTB_AMSGS] < 0)
throw ConvertException();
}
catch (const ConvertException &)
{
ci->ttb[TTB_AMSGS] = 0;
source.Reply(_("\002%s\002 cannot be taken as times to ban."), ttb.c_str());
return MOD_CONT;
}
}
else
ci->ttb[TTB_AMSGS] = 0;
ci->botflags.SetFlag(BS_KICK_AMSGS);
if (ci->ttb[TTB_AMSGS])
source.Reply(_("Bot will now kick for \002amsgs\002, and will place a ban after %d\nkicks for the same user."), ci->ttb[TTB_AMSGS]);
else
source.Reply(_("Bot will now kick for \002amsgs\002"));
}
else
{
ci->botflags.UnsetFlag(BS_KICK_AMSGS);
source.Reply(_("Bot won't kick for \002amsgs\002 anymore."));
u->SendMessage(BotServ, BOT_KICK_ITALICS_OFF);
}
}
else
source.Reply(_(UNKNOWN_OPTION), Config->UseStrictPrivMsgString.c_str(), option.c_str(), this->name.c_str());
u->SendMessage(BotServ, BOT_KICK_UNKNOWN, option.c_str());
}
return MOD_CONT;
}
bool OnHelp(CommandSource &source, const Anope::string &subcommand)
bool OnHelp(User *u, const Anope::string &subcommand)
{
if (subcommand.empty())
source.Reply(_("Syntax: \002KICK \037channel\037 \037option\037 \037parameters\037\002\n"
" \n"
"Configures bot kickers. \037option\037 can be one of:\n"
" \n"
" AMSGS Sets if the bot kicks for amsgs\n"
" BOLDS Sets if the bot kicks bolds\n"
" BADWORDS Sets if the bot kicks bad words\n"
" CAPS Sets if the bot kicks caps\n"
" COLORS Sets if the bot kicks colors\n"
" FLOOD Sets if the bot kicks flooding users\n"
" REPEAT Sets if the bot kicks users who repeat\n"
" themselves\n"
" REVERSES Sets if the bot kicks reverses\n"
" UNDERLINES Sets if the bot kicks underlines\n"
" ITALICS Sets if the bot kicks italics\n"
" \n"
"Type \002%s%s HELP KICK \037option\037\002 for more information\n"
"on a specific option.\n"
" \n"
"Note: access to this command is controlled by the\n"
"level SET."), Config->UseStrictPrivMsgString.c_str(), BotServ->nick.c_str());
u->SendMessage(BotServ, BOT_HELP_KICK);
else if (subcommand.equals_ci("BADWORDS"))
source.Reply(_("Syntax: \002KICK \037#channel\037 BADWORDS {\037ON|OFF\037} [\037ttb\037]\002\n"
"Sets the bad words kicker on or off. When enabled, this\n"
"option tells the bot to kick users who say certain words\n"
"on the channels.\n"
"You can define bad words for your channel using the\n"
"\002BADWORDS\002 command. Type \002%s%s HELP BADWORDS\002 for\n"
"more information.\n"
"ttb is the number of times a user can be kicked\n"
"before it get banned. Don't give ttb to disable\n"
"the ban system once activated."), Config->UseStrictPrivMsgString.c_str(), BotServ->nick.c_str());
u->SendMessage(BotServ, BOT_HELP_KICK_BADWORDS);
else if (subcommand.equals_ci("BOLDS"))
source.Reply(_("Syntax: \002KICK \037channel\037 BOLDS {\037ON|OFF\037} [\037ttb\037]\002\n"
"Sets the bolds kicker on or off. When enabled, this\n"
"option tells the bot to kick users who use bolds.\n"
"ttb is the number of times a user can be kicked\n"
"before it get banned. Don't give ttb to disable\n"
"the ban system once activated."));
u->SendMessage(BotServ, BOT_HELP_KICK_BOLDS);
else if (subcommand.equals_ci("CAPS"))
source.Reply(_("Syntax: \002KICK \037channel\037 CAPS {\037ON|OFF\037} [\037ttb\037 [\037min\037 [\037percent\037]]]\002\n"
"Sets the caps kicker on or off. When enabled, this\n"
"option tells the bot to kick users who are talking in\n"
"CAPS.\n"
"The bot kicks only if there are at least \002min\002 caps\n"
"and they constitute at least \002percent\002%% of the total \n"
"text line (if not given, it defaults to 10 characters\n"
"and 25%%).\n"
"ttb is the number of times a user can be kicked\n"
"before it get banned. Don't give ttb to disable\n"
"the ban system once activated."));
u->SendMessage(BotServ, BOT_HELP_KICK_CAPS);
else if (subcommand.equals_ci("COLORS"))
source.Reply(_("Syntax: \002KICK \037channel\037 COLORS {\037ON|OFF\037} [\037ttb\037]\002\n"
"Sets the colors kicker on or off. When enabled, this\n"
"option tells the bot to kick users who use colors.\n"
"ttb is the number of times a user can be kicked\n"
"before it get banned. Don't give ttb to disable\n"
"the ban system once activated."));
u->SendMessage(BotServ, BOT_HELP_KICK_COLORS);
else if (subcommand.equals_ci("FLOOD"))
source.Reply(_("Syntax: \002KICK \037channel\037 FLOOD {\037ON|OFF\037} [\037ttb\037 [\037ln\037 [\037secs\037]]]\002\n"
"Sets the flood kicker on or off. When enabled, this\n"
"option tells the bot to kick users who are flooding\n"
"the channel using at least \002ln\002 lines in \002secs\002 seconds\n"
"(if not given, it defaults to 6 lines in 10 seconds).\n"
" \n"
"ttb is the number of times a user can be kicked\n"
"before it get banned. Don't give ttb to disable\n"
"the ban system once activated."));
u->SendMessage(BotServ, BOT_HELP_KICK_FLOOD);
else if (subcommand.equals_ci("REPEAT"))
source.Reply(_("Syntax: \002KICK \037#channel\037 REPEAT {\037ON|OFF\037} [\037ttb\037 [\037num\037]]\002\n"
"Sets the repeat kicker on or off. When enabled, this\n"
"option tells the bot to kick users who are repeating\n"
"themselves \002num\002 times (if num is not given, it\n"
"defaults to 3).\n"
"ttb is the number of times a user can be kicked\n"
"before it get banned. Don't give ttb to disable\n"
"the ban system once activated."));
u->SendMessage(BotServ, BOT_HELP_KICK_REPEAT);
else if (subcommand.equals_ci("REVERSES"))
source.Reply(_("Syntax: \002KICK \037channel\037 REVERSES {\037ON|OFF\037} [\037ttb\037]\002\n"
"Sets the reverses kicker on or off. When enabled, this\n"
"option tells the bot to kick users who use reverses.\n"
"ttb is the number of times a user can be kicked\n"
"before it get banned. Don't give ttb to disable\n"
"the ban system once activated."));
u->SendMessage(BotServ, BOT_HELP_KICK_REVERSES);
else if (subcommand.equals_ci("UNDERLINES"))
source.Reply(_("Syntax: \002KICK \037channel\037 UNDERLINES {\037ON|OFF\037} [\037ttb\037]\002\n"
"Sets the underlines kicker on or off. When enabled, this\n"
"option tells the bot to kick users who use underlines.\n"
"ttb is the number of times a user can be kicked\n"
"before it get banned. Don't give ttb to disable\n"
"the ban system once activated."));
u->SendMessage(BotServ, BOT_HELP_KICK_UNDERLINES);
else if (subcommand.equals_ci("ITALICS"))
source.Reply(_("Syntax: \002KICK \037channel\037 ITALICS {\037ON|OFF\037} [\037ttb\037]\002\n"
"Sets the italics kicker on or off. When enabled, this\n"
"option tells the bot to kick users who use italics.\n"
"ttb is the number of times a user can be kicked\n"
"before it get banned. Don't give ttb to disable\n"
"the ban system once activated."));
else if (subcommand.equals_ci("AMSGS"))
source.Reply(_("Syntax: \002KICK \037channel\037 AMSGS {\037ON|OFF\037} [\037ttb\037]\002\n"
"Sets the amsg kicker on or off. When enabled, the bot will\n"
"kick users who send the same message to multiple channels\n"
"where BotServ bots are.\n"
"Ttb is the number of times a user can be kicked\n"
"before it get banned. Don't give ttb to disable\n"
"the ban system once activated."));
u->SendMessage(BotServ, BOT_HELP_KICK_ITALICS);
else
return false;
return true;
}
void OnSyntaxError(CommandSource &source, const Anope::string &subcommand)
void OnSyntaxError(User *u, const Anope::string &subcommand)
{
SyntaxError(source, "KICK", _("KICK \037channel\037 \037option\037 {\037ON|\037} [\037settings\037]"));
SyntaxError(BotServ, u, "KICK", BOT_KICK_SYNTAX);
}
void OnServHelp(User *u)
{
u->SendMessage(BotServ, BOT_HELP_CMD_KICK);
}
};
@@ -588,40 +461,6 @@ class BSKick : public Module
this->SetType(CORE);
this->AddCommand(BotServ, &commandbskick);
ModuleManager::Attach(I_OnPrivmsg, this);
}
EventReturn OnPrivmsg(User *u, ChannelInfo *ci, Anope::string &msg, bool &Allow)
{
Anope::string m, ch;
time_t time;
if (u->GetExtRegular("bs_kick_lastmsg", m) && u->GetExtRegular("bs_kick_lasttime", time) && u->GetExtRegular("bs_kick_lastchan", ch))
{
if (time == Anope::CurTime && m == msg && ch != ci->name)
{
for (UChannelList::iterator it = u->chans.begin(); it != u->chans.end();)
{
Channel *c = (*it)->chan;
++it;
if (c->ci != NULL && c->ci->botflags.HasFlag(BS_KICK_AMSGS))
{
check_ban(c->ci, u, TTB_AMSGS);
bot_kick(c->ci, u, _("Don't use AMSGs!"));
}
}
return EVENT_CONTINUE;
}
}
u->Extend("bs_kick_lastmsg", new ExtensibleItemRegular<Anope::string>(msg));
u->Extend("bs_kick_lasttime", new ExtensibleItemRegular<time_t>(Anope::CurTime));
u->Extend("bs_kick_lastchan", new ExtensibleItemRegular<Anope::string>(ci->name));
return EVENT_CONTINUE;
}
};
+20 -16
View File
@@ -1,6 +1,6 @@
/* BotServ core functions
*
* (C) 2003-2011 Anope Team
* (C) 2003-2010 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
@@ -18,37 +18,38 @@ class CommandBSSay : public Command
public:
CommandBSSay() : Command("SAY", 2, 2)
{
this->SetDesc(_("Makes the bot say the given text on the given channel"));
}
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
{
const Anope::string &text = params[1];
ChannelInfo *ci;
User *u = source.u;
ChannelInfo *ci = source.ci;
Anope::string chan = params[0];
Anope::string text = params[1];
ci = cs_findchan(chan);
if (!check_access(u, ci, CA_SAY))
{
source.Reply(_(ACCESS_DENIED));
u->SendMessage(BotServ, ACCESS_DENIED);
return MOD_CONT;
}
if (!ci->bi)
{
source.Reply(_(BOT_NOT_ASSIGNED), Config->UseStrictPrivMsgString.c_str(), BotServ->nick.c_str());
u->SendMessage(BotServ, BOT_NOT_ASSIGNED);
return MOD_CONT;
}
if (!ci->c || !ci->c->FindUser(ci->bi))
{
source.Reply(_(BOT_NOT_ON_CHANNEL), ci->name.c_str());
u->SendMessage(BotServ, BOT_NOT_ON_CHANNEL, ci->name.c_str());
return MOD_CONT;
}
if (text[0] == '\001')
{
this->OnSyntaxError(source, "");
this->OnSyntaxError(u, "");
return MOD_CONT;
}
@@ -61,17 +62,20 @@ class CommandBSSay : public Command
return MOD_CONT;
}
bool OnHelp(CommandSource &source, const Anope::string &subcommand)
bool OnHelp(User *u, const Anope::string &subcommand)
{
source.Reply(_("Syntax: \002SAY \037channel\037 \037text\037\002\n"
" \n"
"Makes the bot say the given text on the given channel."));
u->SendMessage(BotServ, BOT_HELP_SAY);
return true;
}
void OnSyntaxError(CommandSource &source, const Anope::string &subcommand)
void OnSyntaxError(User *u, const Anope::string &subcommand)
{
SyntaxError(source, "SAY", _("SAY \037channel\037 \037text\037"));
SyntaxError(BotServ, u, "SAY", BOT_SAY_SYNTAX);
}
void OnServHelp(User *u)
{
u->SendMessage(BotServ, BOT_HELP_CMD_SAY);
}
};
+56 -150
View File
@@ -1,6 +1,6 @@
/* BotServ core functions
*
* (C) 2003-2011 Anope Team
* (C) 2003-2010 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
@@ -19,48 +19,49 @@ class CommandBSSet : public Command
CommandBSSet() : Command("SET", 3, 3)
{
this->SetFlag(CFLAG_STRIP_CHANNEL);
this->SetDesc(_("Configures bot options"));
}
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
{
const Anope::string &chan = params[0];
const Anope::string &option = params[1];
const Anope::string &value = params[2];
User *u = source.u;
Anope::string chan = params[0];
Anope::string option = params[1];
Anope::string value = params[2];
ChannelInfo *ci;
if (readonly)
source.Reply(_("Sorry, bot option setting is temporarily disabled."));
else if (u->HasCommand("botserv/set/private") && option.equals_ci("PRIVATE"))
{
u->SendMessage(BotServ, BOT_SET_DISABLED);
return MOD_CONT;
}
if (u->Account()->HasCommand("botserv/set/private") && option.equals_ci("PRIVATE"))
{
BotInfo *bi;
if (!(bi = findbot(chan)))
{
source.Reply(_(BOT_DOES_NOT_EXIST), chan.c_str());
u->SendMessage(BotServ, BOT_DOES_NOT_EXIST, chan.c_str());
return MOD_CONT;
}
if (value.equals_ci("ON"))
{
bi->SetFlag(BI_PRIVATE);
source.Reply(_("Private mode of bot %s is now \002on\002."), bi->nick.c_str());
u->SendMessage(BotServ, BOT_SET_PRIVATE_ON, bi->nick.c_str());
}
else if (value.equals_ci("OFF"))
{
bi->UnsetFlag(BI_PRIVATE);
source.Reply(_("Private mode of bot %s is now \002off\002."), bi->nick.c_str());
u->SendMessage(BotServ, BOT_SET_PRIVATE_OFF, bi->nick.c_str());
}
else
SyntaxError(source, "SET PRIVATE", _("SET \037botname\037 PRIVATE {\037ON|\037}"));
SyntaxError(BotServ, u, "SET PRIVATE", BOT_SET_PRIVATE_SYNTAX);
return MOD_CONT;
}
else if (!(ci = cs_findchan(chan)))
source.Reply(_(CHAN_X_NOT_REGISTERED), chan.c_str());
else if (!u->HasPriv("botserv/administration") && !check_access(u, ci, CA_SET))
source.Reply(_(ACCESS_DENIED));
u->SendMessage(BotServ, CHAN_X_NOT_REGISTERED, chan.c_str());
else if (!u->Account()->HasPriv("botserv/administration") && !check_access(u, ci, CA_SET))
u->SendMessage(BotServ, ACCESS_DENIED);
else
{
bool override = !check_access(u, ci, CA_SET);
@@ -71,230 +72,135 @@ class CommandBSSet : public Command
if (value.equals_ci("ON"))
{
ci->botflags.SetFlag(BS_DONTKICKOPS);
source.Reply(_("Bot \002won't kick ops\002 on channel %s."), ci->name.c_str());
u->SendMessage(BotServ, BOT_SET_DONTKICKOPS_ON, ci->name.c_str());
}
else if (value.equals_ci("OFF"))
{
ci->botflags.UnsetFlag(BS_DONTKICKOPS);
source.Reply(_("Bot \002will kick ops\002 on channel %s."), ci->name.c_str());
u->SendMessage(BotServ, BOT_SET_DONTKICKOPS_OFF, ci->name.c_str());
}
else
SyntaxError(source, "SET DONTKICKOPS", _("SET \037channel\037 DONTKICKOPS {\037ON|\037}"));
SyntaxError(BotServ, u, "SET DONTKICKOPS", BOT_SET_DONTKICKOPS_SYNTAX);
}
else if (option.equals_ci("DONTKICKVOICES"))
{
if (value.equals_ci("ON"))
{
ci->botflags.SetFlag(BS_DONTKICKVOICES);
source.Reply(_("Bot \002won't kick voices\002 on channel %s."), ci->name.c_str());
u->SendMessage(BotServ, BOT_SET_DONTKICKVOICES_ON, ci->name.c_str());
}
else if (value.equals_ci("OFF"))
{
ci->botflags.UnsetFlag(BS_DONTKICKVOICES);
source.Reply(_("Bot \002will kick voices\002 on channel %s."), ci->name.c_str());
u->SendMessage(BotServ, BOT_SET_DONTKICKVOICES_OFF, ci->name.c_str());
}
else
SyntaxError(source, "SET DONTKICKVOICES", _("SET \037channel\037 DONTKICKVOICES {\037ON|\037}"));
SyntaxError(BotServ, u, "SET DONTKICKVOICES", BOT_SET_DONTKICKVOICES_SYNTAX);
}
else if (option.equals_ci("FANTASY"))
{
if (value.equals_ci("ON"))
{
ci->botflags.SetFlag(BS_FANTASY);
source.Reply(_("Fantasy mode is now \002on\002 on channel %s."), ci->name.c_str());
u->SendMessage(BotServ, BOT_SET_FANTASY_ON, ci->name.c_str());
}
else if (value.equals_ci("OFF"))
{
ci->botflags.UnsetFlag(BS_FANTASY);
source.Reply(_("Fantasy mode is now \002off\002 on channel %s."), ci->name.c_str());
u->SendMessage(BotServ, BOT_SET_FANTASY_OFF, ci->name.c_str());
}
else
SyntaxError(source, "SET FANTASY", _("SET \037channel\037 FANTASY {\037ON|\037}"));
SyntaxError(BotServ, u, "SET FANTASY", BOT_SET_FANTASY_SYNTAX);
}
else if (option.equals_ci("GREET"))
{
if (value.equals_ci("ON"))
{
ci->botflags.SetFlag(BS_GREET);
source.Reply(_("Greet mode is now \002on\002 on channel %s."), ci->name.c_str());
u->SendMessage(BotServ, BOT_SET_GREET_ON, ci->name.c_str());
}
else if (value.equals_ci("OFF"))
{
ci->botflags.UnsetFlag(BS_GREET);
source.Reply(_("Greet mode is now \002off\002 on channel %s."), ci->name.c_str());
u->SendMessage(BotServ, BOT_SET_GREET_OFF, ci->name.c_str());
}
else
SyntaxError(source, "SET GREET", _("SET \037channel\037 GREET {\037ON|\037}"));
SyntaxError(BotServ, u, "SET GREET", BOT_SET_GREET_SYNTAX);
}
else if (u->HasCommand("botserv/set/nobot") && option.equals_ci("NOBOT"))
else if (u->Account()->HasCommand("botserv/set/nobot") && option.equals_ci("NOBOT"))
{
if (value.equals_ci("ON"))
{
ci->botflags.SetFlag(BS_NOBOT);
if (ci->bi)
ci->bi->UnAssign(u, ci);
source.Reply(_("No Bot mode is now \002on\002 on channel %s."), ci->name.c_str());
u->SendMessage(BotServ, BOT_SET_NOBOT_ON, ci->name.c_str());
}
else if (value.equals_ci("OFF"))
{
ci->botflags.UnsetFlag(BS_NOBOT);
source.Reply(_("No Bot mode is now \002off\002 on channel %s."), ci->name.c_str());
u->SendMessage(BotServ, BOT_SET_NOBOT_OFF, ci->name.c_str());
}
else
SyntaxError(source, "SET NOBOT", _("SET \037botname\037 NOBOT {\037ON|\037}"));
SyntaxError(BotServ, u, "SET NOBOT", BOT_SET_NOBOT_SYNTAX);
}
else if (option.equals_ci("SYMBIOSIS"))
{
if (value.equals_ci("ON"))
{
ci->botflags.SetFlag(BS_SYMBIOSIS);
source.Reply(_("Symbiosis mode is now \002on\002 on channel %s."), ci->name.c_str());
u->SendMessage(BotServ, BOT_SET_SYMBIOSIS_ON, ci->name.c_str());
}
else if (value.equals_ci("OFF"))
{
ci->botflags.UnsetFlag(BS_SYMBIOSIS);
source.Reply(_("Symbiosis mode is now \002off\002 on channel %s."), ci->name.c_str());
u->SendMessage(BotServ, BOT_SET_SYMBIOSIS_OFF, ci->name.c_str());
}
else
SyntaxError(source, "SET SYMBIOSIS", _("SET \037channel\037 SYMBIOSIS {\037ON|\037}"));
}
else if (option.equals_ci("MSG"))
{
if (value.equals_ci("OFF"))
{
ci->botflags.UnsetFlag(BS_MSG_PRIVMSG);
ci->botflags.UnsetFlag(BS_MSG_NOTICE);
ci->botflags.UnsetFlag(BS_MSG_NOTICEOPS);
source.Reply(_("Fantasy replies will no longer be sent to %s."), ci->name.c_str());
}
else if (value.equals_ci("PRIVMSG"))
{
ci->botflags.SetFlag(BS_MSG_PRIVMSG);
ci->botflags.UnsetFlag(BS_MSG_NOTICE);
ci->botflags.UnsetFlag(BS_MSG_NOTICEOPS);
source.Reply(_("Fantasy replies will be sent via PRIVMSG to %s."), ci->name.c_str());
}
else if (value.equals_ci("NOTICE"))
{
ci->botflags.UnsetFlag(BS_MSG_PRIVMSG);
ci->botflags.SetFlag(BS_MSG_NOTICE);
ci->botflags.UnsetFlag(BS_MSG_NOTICEOPS);
source.Reply(_("Fantasy replies will be sent via NOTICE to %s."), ci->name.c_str());
}
else if (value.equals_ci("NOTICEOPS"))
{
ci->botflags.UnsetFlag(BS_MSG_PRIVMSG);
ci->botflags.UnsetFlag(BS_MSG_NOTICE);
ci->botflags.SetFlag(BS_MSG_NOTICEOPS);
source.Reply(_("Fantasy replies will be sent via NOTICE to channel ops on %s."), ci->name.c_str());
}
else
SyntaxError(source, "SET MSG", _("SET \037channel\037 MSG {\037OFF|PRIVMSG|NOTICE|\037}"));
SyntaxError(BotServ, u, "SET SYMBIOSIS", BOT_SET_SYMBIOSIS_SYNTAX);
}
else
source.Reply(_(UNKNOWN_OPTION), option.c_str(), Config->UseStrictPrivMsgString.c_str(), BotServ->nick.c_str(), this->name.c_str());
u->SendMessage(BotServ, BOT_SET_UNKNOWN, option.c_str());
}
return MOD_CONT;
}
bool OnHelp(CommandSource &source, const Anope::string &subcommand)
bool OnHelp(User *u, const Anope::string &subcommand)
{
if (subcommand.empty())
{
source.Reply(_("Syntax: \002SET \037(channel | bot)\037 \037option\037 \037parameters\037\002\n"
" \n"
"Configures bot options. \037option\037 can be one of:\n"
" \n"
" DONTKICKOPS To protect ops against bot kicks\n"
" DONTKICKVOICES To protect voices against bot kicks\n"
" GREET Enable greet messages\n"
" FANTASY Enable fantaisist commands\n"
" SYMBIOSIS Allow the bot to act as a real bot\n"
" MSG Configure how fantasy commands should be replied to\n"
" \n"
"Type \002%s%s HELP SET \037option\037\002 for more information\n"
"on a specific option.\n"
"Note: access to this command is controlled by the\n"
"level SET."), Config->UseStrictPrivMsgString.c_str(), BotServ->nick.c_str());
User *u = source.u;
if (u->IsServicesOper())
source.Reply(_("These options are reserved to Services Operators:\n"
" \n"
" NOBOT Prevent a bot from being assigned to \n"
" a channel\n"
" PRIVATE Prevent a bot from being assigned by\n"
" non IRC operators"));
u->SendMessage(BotServ, BOT_HELP_SET);
if (u->Account() && u->Account()->IsServicesOper())
u->SendMessage(BotServ, BOT_SERVADMIN_HELP_SET);
}
else if (subcommand.equals_ci("DONTKICKOPS"))
source.Reply(_("Syntax: \002SET \037channel\037 DONTKICKOPS {\037ON|OFF\037}\n"
" \n"
"Enables or disables \002ops protection\002 mode on a channel.\n"
"When it is enabled, ops won't be kicked by the bot\n"
"even if they don't match the NOKICK level."));
u->SendMessage(BotServ, BOT_HELP_SET_DONTKICKOPS);
else if (subcommand.equals_ci("DONTKICKVOICES"))
source.Reply(_("Syntax: \002SET \037channel\037 DONTKICKVOICES {\037ON|OFF\037}\n"
" \n"
"Enables or disables \002voices protection\002 mode on a channel.\n"
"When it is enabled, voices won't be kicked by the bot\n"
"even if they don't match the NOKICK level."));
u->SendMessage(BotServ, BOT_HELP_SET_DONTKICKVOICES);
else if (subcommand.equals_ci("FANTASY"))
source.Reply(_("Syntax: \002SET \037channel\037 FANTASY {\037ON|OFF\037}\n"
"Enables or disables \002fantasy\002 mode on a channel.\n"
"When it is enabled, users will be able to use\n"
"commands !op, !deop, !voice, !devoice,\n"
"!kick, !kb, !unban, !seen on a channel (find how \n"
"to use them; try with or without nick for each, \n"
"and with a reason for some?).\n"
" \n"
"Note that users wanting to use fantaisist\n"
"commands MUST have enough level for both\n"
"the FANTASIA and another level depending\n"
"of the command if required (for example, to use \n"
"!op, user must have enough access for the OPDEOP\n"
"level)."));
u->SendMessage(BotServ, BOT_HELP_SET_FANTASY);
else if (subcommand.equals_ci("GREET"))
source.Reply(_("Syntax: \002SET \037channel\037 GREET {\037ON|OFF\037}\n"
" \n"
"Enables or disables \002greet\002 mode on a channel.\n"
"When it is enabled, the bot will display greet\n"
"messages of users joining the channel, provided\n"
"they have enough access to the channel."));
u->SendMessage(BotServ, BOT_HELP_SET_GREET);
else if (subcommand.equals_ci("SYMBIOSIS"))
source.Reply(_("Syntax: \002SET \037channel\037 SYMBIOSIS {\037ON|OFF\037}\n"
" \n"
"Enables or disables \002symbiosis\002 mode on a channel.\n"
"When it is enabled, the bot will do everything\n"
"normally done by %s on channels, such as MODEs,\n"
"KICKs, and even the entry message."), Config->s_ChanServ.c_str());
u->SendMessage(BotServ, BOT_HELP_SET_SYMBIOSIS, Config->s_ChanServ.c_str());
else if (subcommand.equals_ci("NOBOT"))
source.Reply(_("Syntax: \002SET \037channel\037 NOBOT {\037ON|OFF\037}\002\n"
" \n"
"This option makes a channel be unassignable. If a bot \n"
"is already assigned to the channel, it is unassigned\n"
"automatically when you enable the option."));
u->SendMessage(BotServ, BOT_SERVADMIN_HELP_SET_NOBOT);
else if (subcommand.equals_ci("PRIVATE"))
source.Reply(_("Syntax: \002SET \037bot-nick\037 PRIVATE {\037ON|OFF\037}\002\n"
"This option prevents a bot from being assigned to a\n"
"channel by users that aren't IRC operators."));
else if (subcommand.equals_ci("MSG"))
source.Reply(_("Syntax: \002SET \037channel\037 MSG {\037OFF|PRIVMSG|NOTICE|NOTICEOPS\037}\002\n"
" \n"
"Configures how fantasy commands should be returned to the channel. Off disables\n"
"fantasy from replying to the channel. Privmsg, notice, and noticeops message the\n"
"channel, notice the channel, and notice the channel ops respectively.\n"
" \n"
"Note that replies over one line will not use this setting to prevent spam, and will\n"
"go directly to the user who executed it."));
u->SendMessage(BotServ, BOT_SERVADMIN_HELP_SET_PRIVATE);
else
return false;
return true;
}
void OnSyntaxError(CommandSource &source, const Anope::string &subcommand)
void OnSyntaxError(User *u, const Anope::string &subcommand)
{
SyntaxError(source, "SET", _("SET \037(channel | bot)\037 \037option\037 \037settings\037"));
SyntaxError(BotServ, u, "SET", BOT_SET_SYNTAX);
}
void OnServHelp(User *u)
{
u->SendMessage(BotServ, BOT_HELP_CMD_SET);
}
};

Some files were not shown because too many files have changed in this diff Show More