mirror of
https://github.com/anope/anope.git
synced 2026-06-21 14:16:38 +02:00
Compare commits
288 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 81cf9f0c71 | |||
| 3264669e03 | |||
| 271d723bbd | |||
| a0c4575122 | |||
| 1af64a9bbb | |||
| e3d5140dcc | |||
| f81d0113a2 | |||
| fde42899e7 | |||
| f7bf2fa960 | |||
| b894a569c9 | |||
| 48022c3ddf | |||
| 28aa981464 | |||
| 2b8a09bf55 | |||
| a12788e8f4 | |||
| 9b5f6d3c45 | |||
| af24dc6050 | |||
| f27560cc1e | |||
| 4b309b5044 | |||
| d8a99d619f | |||
| 2dec8e767a | |||
| ba53c7eb03 | |||
| 873d4287de | |||
| 3626fb246e | |||
| a661098ef2 | |||
| a4bf5ce609 | |||
| 437944d416 | |||
| db37b1c634 | |||
| 1e49e9b9dc | |||
| 2cbfbc98e9 | |||
| 38d5f20deb | |||
| 70fb5900a2 | |||
| bf7d1a55af | |||
| 1f73e27870 | |||
| 699087b2bf | |||
| ccd29085a9 | |||
| a883362c14 | |||
| ef88385d85 | |||
| 90b0283160 | |||
| 0a8d46b538 | |||
| a84226edf0 | |||
| 9370b063d0 | |||
| d5ffae0e46 | |||
| f89599726e | |||
| a81b3aaff1 | |||
| 820e4edc2b | |||
| 25586f3246 | |||
| b7149fc940 | |||
| 675b113c3e | |||
| c797987615 | |||
| eb0e07d564 | |||
| 1b5805eeb0 | |||
| 42e652cae7 | |||
| 62818abbf4 | |||
| 4d9a96e8df | |||
| e490a5461f | |||
| 5068483cb9 | |||
| 83ee20fc29 | |||
| b08aa4ed92 | |||
| 1081ecdae8 | |||
| 2370c16f1e | |||
| 3d84dc91f6 | |||
| 573e49a7ea | |||
| 63c639e108 | |||
| fc00406079 | |||
| b752c3a668 | |||
| 7372b457cc | |||
| deb5196101 | |||
| 9e1fda2a44 | |||
| 9d249ef96f | |||
| e03b73e8cd | |||
| 6b473f22bd | |||
| 05bb80c06c | |||
| e6edc6586e | |||
| cf3124c063 | |||
| 12a6a27b52 | |||
| 31a0e673b2 | |||
| 8d0b4a1bf5 | |||
| 1b0ebcadfa | |||
| 0d100ffacc | |||
| 88fd1da803 | |||
| a06934777c | |||
| a26f4b9a9a | |||
| 053d6a2247 | |||
| beae4775cf | |||
| cff91a532f | |||
| 92ed5d7208 | |||
| 7800375510 | |||
| ab25815694 | |||
| 8e0104363f | |||
| b7a6d518b0 | |||
| 4ed844ffd5 | |||
| 020467d472 | |||
| 141b87bd14 | |||
| a5b9e235ae | |||
| a78790eac4 | |||
| 07226feec4 | |||
| e73013830d | |||
| 2bc3bd3fcf | |||
| 83456f6040 | |||
| 601dc41baf | |||
| 2337b7717d | |||
| fde40dee7a | |||
| ba32aad4cb | |||
| 24811e5970 | |||
| f01aab5f9b | |||
| 3850b073dd | |||
| 81e50dd1f4 | |||
| bd31fbb9f0 | |||
| 000660608e | |||
| 826de43724 | |||
| b84e080463 | |||
| 0ba58d7d0e | |||
| 1536c5cf60 | |||
| f2ce9cd85c | |||
| ee5cd8493e | |||
| 41e8d27602 | |||
| e1f5fc6a0c | |||
| db59f1a70f | |||
| a9772cde21 | |||
| 086790d633 | |||
| 1bc8e2ab82 | |||
| 089c85b27e | |||
| 01194e3958 | |||
| f082530f89 | |||
| b906656caa | |||
| 378ae4c4f1 | |||
| ce2a0f72d4 | |||
| be5ba495f9 | |||
| b4f27da51c | |||
| d09a30295b | |||
| 0f909273e1 | |||
| 52eaa7d6d6 | |||
| e88e37c59b | |||
| f10f49d6fc | |||
| d06cdaab29 | |||
| fc20bd7b22 | |||
| b3d9412452 | |||
| 98feb1b76d | |||
| 94c302baf3 | |||
| cdb6bb8ec2 | |||
| a851f849df | |||
| a270a13010 | |||
| 964d63cdac | |||
| f38faedbda | |||
| c462a69b7d | |||
| 14a2c9cec0 | |||
| a52ed70ea0 | |||
| 7c03e60299 | |||
| 1e9d88af01 | |||
| 815e140ecf | |||
| f8245574dc | |||
| 830c5ca725 | |||
| 9e71394127 | |||
| dd64eac782 | |||
| 4204ece7a8 | |||
| 60a5cc1a61 | |||
| 20aa4e85ce | |||
| f1b05acf26 | |||
| a4bf770a49 | |||
| 150831c1a6 | |||
| 1a4157b7f4 | |||
| 3bcb285690 | |||
| 704dbe27bf | |||
| bbddf50c9d | |||
| e5851addd6 | |||
| 03119f2aa9 | |||
| 45fc3ce1c4 | |||
| d320c73f23 | |||
| ca8ce89de4 | |||
| c88a751eab | |||
| 9ea030d060 | |||
| ad14c8145b | |||
| 255a8da347 | |||
| 4211dcf6f9 | |||
| 3c5337fb8a | |||
| d2f788c61e | |||
| fa54d5acb7 | |||
| aeefe1650e | |||
| c80e7844b7 | |||
| 620c08bd7a | |||
| 23a92709c0 | |||
| cef3eb78df | |||
| 12d0a7302f | |||
| 0dd85f7761 | |||
| 51d6e8ebfb | |||
| 3f14882992 | |||
| 5a17b060fe | |||
| bf8e4ac714 | |||
| 781ed11ba8 | |||
| 6f8f7491db | |||
| c43cdf438f | |||
| 8374211239 | |||
| 69dfc729e9 | |||
| 5281282a61 | |||
| 503eb42e40 | |||
| 38d90c76e0 | |||
| 1356498320 | |||
| 9ed203c0cb | |||
| b5ff856f47 | |||
| 97b9055f92 | |||
| 5f0b9338dc | |||
| b3194a10c5 | |||
| d01f4ea3ce | |||
| a42cafbf69 | |||
| 066e5b3fc0 | |||
| 09dba47653 | |||
| ca33ac608d | |||
| 302989bed1 | |||
| 22b7d9fbee | |||
| 9dd71c427d | |||
| 655c1cc1f7 | |||
| d9333e02fa | |||
| 39ac438b8d | |||
| 0761a4a692 | |||
| 66ca256cfc | |||
| 961bb6e27e | |||
| b14f5ea884 | |||
| bf66336e2c | |||
| c79a575452 | |||
| 8334128680 | |||
| 7c62de1f27 | |||
| 377a7a968b | |||
| ccf29c0134 | |||
| d0513d6506 | |||
| f4a0bdd54d | |||
| 3e2ac3640d | |||
| c8b3809fc9 | |||
| ad2ef75cbe | |||
| 6ce9010324 | |||
| d0afc8c509 | |||
| 230b3bc884 | |||
| 1cfb630ede | |||
| d16f9620d5 | |||
| fc16746352 | |||
| eb5b5f97d1 | |||
| faea45245d | |||
| 2c614d5aab | |||
| 89b4be681d | |||
| 28ca0e1007 | |||
| 2504af7d0f | |||
| ddc3c2f38c | |||
| 53275c362c | |||
| f3f6727cdd | |||
| 4681e3a0ef | |||
| 80f4f317b2 | |||
| 9f3d735d9d | |||
| 0e012f73d4 | |||
| 9f850334a1 | |||
| af273e3da5 | |||
| 1f3e96f4ad | |||
| e7ba639beb | |||
| 1f2399de36 | |||
| 43201ead95 | |||
| 7dce64e540 | |||
| 1184eb59c5 | |||
| 4c2a4929ea | |||
| be77a7e27e | |||
| 934723faa5 | |||
| f07295cc78 | |||
| 26c1d67556 | |||
| 3d5889c308 | |||
| 213c1c4860 | |||
| 63cb8ca24c | |||
| dc5d1fa21c | |||
| 563d158e49 | |||
| 1478b5bbd7 | |||
| 19e0b87aa1 | |||
| 17ea4ed8f5 | |||
| feaef7cc4a | |||
| c6d3fbdfab | |||
| 700a585b1b | |||
| 62752db4c4 | |||
| f025d1b495 | |||
| 8c4417cad1 | |||
| d4db2b84f2 | |||
| bb8e04c835 | |||
| b504791bad | |||
| d5749c11f3 | |||
| f54ab5e2ca | |||
| 1e45019f8a | |||
| 2eb708e5ad | |||
| 4fcb371bc8 | |||
| 6401d93b8e | |||
| 8a9a39c065 | |||
| 13e8b26989 | |||
| 8a6d6577bd | |||
| 4a7ba7ef4c | |||
| 2b5d9f349f |
+46
-25
@@ -218,6 +218,7 @@ find_package(Gettext)
|
||||
|
||||
# Add an optional variable for using run-cc.pl for building, Perl will be checked later regardless of this setting
|
||||
option(USE_RUN_CC_PL "Use run-cc.pl for building" OFF)
|
||||
option(USE_PCH "Use precompiled headers" OFF)
|
||||
|
||||
# Use the following directories as includes
|
||||
# Note that it is important the binary include directory comes before the
|
||||
@@ -238,7 +239,7 @@ if(MSVC)
|
||||
string(REPLACE "/GX " "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
|
||||
string(REPLACE "/W3 " "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
|
||||
# Set the compile flags to have warnings on the max setting (but disable a few annoying ones), exception handling turned on, the proper defines
|
||||
set(CXXFLAGS "${CXXFLAGS} /W4 /wd4100 /wd4251 /wd4706 /wd4800 /wd4996 /EHs")
|
||||
set(CXXFLAGS "${CXXFLAGS} /W4 /wd4100 /wd4127 /wd4250 /wd4251 /wd4355 /wd4706 /wd4800 /wd4996 /EHs")
|
||||
add_definitions(-DMSVCPP -D_CRT_SECURE_NO_WARNINGS)
|
||||
# Otherwise, we're not using Visual Studio
|
||||
else(MSVC)
|
||||
@@ -246,9 +247,9 @@ else(MSVC)
|
||||
set(CXXFLAGS "${CXXFLAGS} -Wall -Wshadow")
|
||||
# If on a *nix system, also set the compile flags to remove GNU extensions (favor ISO C++) as well as reject non-ISO C++ code, also remove all leading underscores in exported symbols (only on GNU compiler)
|
||||
if(UNIX)
|
||||
set(CXXFLAGS "${CXXFLAGS} -ansi -pedantic")
|
||||
set(CXXFLAGS "${CXXFLAGS} -ansi -pedantic ${CMAKE_CXX_FLAGS}")
|
||||
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
||||
set(CXXFLAGS "${CXXFLAGS} -fno-leading-underscore")
|
||||
set(CXXFLAGS "${CXXFLAGS} -Wno-long-long -fno-leading-underscore")
|
||||
endif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
||||
# If we aren't on a *nix system, we are using MinGW
|
||||
else(UNIX)
|
||||
@@ -261,7 +262,7 @@ endif(MSVC)
|
||||
|
||||
# If CMake has found that the given system requires a special library for dl* calls, include it with the linker flags
|
||||
if(CMAKE_DL_LIBS)
|
||||
set(LDFLAGS "${LDFLAGS} -l${CMAKE_DL_LIBS}")
|
||||
append_to_list(LINK_LIBS ${CMAKE_DL_LIBS})
|
||||
endif(CMAKE_DL_LIBS)
|
||||
|
||||
# Under MinGW, the -shared flag isn't properly set in the module-specific linker flags, add it from the C flags for shared libraries
|
||||
@@ -297,12 +298,12 @@ if(NOT MSVC)
|
||||
# Check if socket is within the socket library (if the library exists), and add it to the linker flags if needed
|
||||
check_library_exists(socket socket "" HAVE_SOCKET_LIB)
|
||||
if(HAVE_SOCKET_LIB)
|
||||
set(LDFLAGS "${LDFLAGS} -lsocket")
|
||||
append_to_list(LINK_LIBS socket)
|
||||
endif(HAVE_SOCKET_LIB)
|
||||
# Check if inet_addr is within the nsl library (if the library exists), and add it to the linker flags if needed
|
||||
check_library_exists(nsl inet_addr "" HAVE_NSL_LIB)
|
||||
if(HAVE_NSL_LIB)
|
||||
set(LDFLAGS "${LDFLAGS} -lnsl")
|
||||
append_to_list(LINK_LIBS nsl)
|
||||
endif(HAVE_NSL_LIB)
|
||||
# Check if pthread_create is within the pthread library (if the library exists), and add it to the linker flags if needed
|
||||
check_library_exists(pthread pthread_create "" HAVE_PTHREAD)
|
||||
@@ -329,28 +330,25 @@ if(CMAKE_BUILD_TYPE STREQUAL "DEBUG" OR CMAKE_BUILD_TYPE STREQUAL "RELWITHDEBINF
|
||||
endif(CMAKE_BUILD_TYPE STREQUAL "DEBUG" OR CMAKE_BUILD_TYPE STREQUAL "RELWITHDEBINFO")
|
||||
|
||||
# Check for the existance of the following include files
|
||||
check_include_file(sys/types.h HAVE_SYS_TYPES_H)
|
||||
check_include_file(cstdint HAVE_CSTDINT)
|
||||
check_include_file(stdint.h HAVE_STDINT_H)
|
||||
check_include_file(strings.h HAVE_STRINGS_H)
|
||||
check_include_file(sys/eventfd.h HAVE_SYS_EVENTFD_H)
|
||||
|
||||
# Check for the existance of the following functions
|
||||
check_function_exists(setgrent HAVE_SETGRENT)
|
||||
check_function_exists(strcasecmp HAVE_STRCASECMP)
|
||||
check_function_exists(stricmp HAVE_STRICMP)
|
||||
check_function_exists(umask HAVE_UMASK)
|
||||
check_function_exists(eventfd HAVE_EVENTFD)
|
||||
check_function_exists(epoll_wait HAVE_EPOLL)
|
||||
check_function_exists(poll HAVE_POLL)
|
||||
check_function_exists(kqueue HAVE_KQUEUE)
|
||||
|
||||
# Check for the existance of the following types
|
||||
check_type_size(uint8_t UINT8_T)
|
||||
check_type_size(u_int8_t U_INT8_T)
|
||||
check_type_size(int16_t INT16_T)
|
||||
check_type_size(uint16_t UINT16_T)
|
||||
check_type_size(u_int16_t U_INT16_T)
|
||||
check_type_size(int32_t INT32_T)
|
||||
check_type_size(uint32_t UINT32_T)
|
||||
check_type_size(u_int32_t U_INT32_T)
|
||||
# Check if eventfd works
|
||||
try_run(EVENTFD_TEST_RUN_RESULT EVENTFD_TEST_COMPILE_RESULT ${CMAKE_CURRENT_BINARY_DIR} ${Anope_SOURCE_DIR}/cmake/eventfd_test.cpp)
|
||||
set(HAVE_EVENTFD FALSE)
|
||||
if (EVENTFD_TEST_COMPILE_RESULT AND EVENTFD_TEST_RUN_RESULT EQUAL 1)
|
||||
set(HAVE_EVENTFD TRUE)
|
||||
endif(EVENTFD_TEST_COMPILE_RESULT AND EVENTFD_TEST_RUN_RESULT EQUAL 1)
|
||||
|
||||
# Strip the leading and trailing spaces from the compile flags
|
||||
if(CXXFLAGS)
|
||||
@@ -382,6 +380,29 @@ else(INSTDIR)
|
||||
set(CMAKE_INSTALL_PREFIX "$ENV{HOME}/services")
|
||||
endif(INSTDIR)
|
||||
|
||||
# Set default paths for various directories if not already defined
|
||||
if(NOT BIN_DIR)
|
||||
set(BIN_DIR "bin")
|
||||
endif(NOT BIN_DIR)
|
||||
if(NOT DB_DIR)
|
||||
set(DB_DIR "data")
|
||||
endif(NOT DB_DIR)
|
||||
if(NOT DOC_DIR)
|
||||
set(DOC_DIR "doc")
|
||||
endif(NOT DOC_DIR)
|
||||
if(NOT CONF_DIR)
|
||||
set(CONF_DIR "conf")
|
||||
endif(NOT CONF_DIR)
|
||||
if(NOT LIB_DIR)
|
||||
set(LIB_DIR "lib")
|
||||
endif(NOT LIB_DIR)
|
||||
if(NOT LOCALE_DIR)
|
||||
set(LOCALE_DIR "locale")
|
||||
endif(NOT LOCALE_DIR)
|
||||
if(NOT LOGS_DIR)
|
||||
set(LOGS_DIR "logs")
|
||||
endif(NOT LOGS_DIR)
|
||||
|
||||
# Version number processing
|
||||
# Find all lines in src/version.sh that start with VERSION_
|
||||
read_from_file(${Anope_SOURCE_DIR}/src/version.sh "^VERSION_" VERSIONS)
|
||||
@@ -460,20 +481,20 @@ get_target_property(SERVICES_BINARY ${PROGRAM_NAME} LOCATION)
|
||||
get_filename_component(SERVICES_BINARY ${SERVICES_BINARY} NAME)
|
||||
|
||||
# At install time, create the following additional directories
|
||||
install(CODE "file(MAKE_DIRECTORY \"\${CMAKE_INSTALL_PREFIX}/data/backups\")")
|
||||
install(CODE "file(MAKE_DIRECTORY \"\${CMAKE_INSTALL_PREFIX}/data/logs\")")
|
||||
install(CODE "file(MAKE_DIRECTORY \"\${CMAKE_INSTALL_PREFIX}/data/modules/runtime\")")
|
||||
install(CODE "file(MAKE_DIRECTORY \"${DB_DIR}/backups\")")
|
||||
install(CODE "file(MAKE_DIRECTORY \"${LOGS_DIR}\")")
|
||||
install(CODE "file(MAKE_DIRECTORY \"${LIB_DIR}/modules/runtime\")")
|
||||
# On non-Windows platforms, if RUNGROUP is set, change the permissions of the below directories, as well as the group of the data directory
|
||||
if(NOT WIN32 AND RUNGROUP)
|
||||
install(CODE "execute_process(COMMAND ${CHMOD} 2775 \"\${CMAKE_INSTALL_PREFIX}/data/backups\")")
|
||||
install(CODE "execute_process(COMMAND ${CHMOD} 2775 \"\${CMAKE_INSTALL_PREFIX}/data/logs\")")
|
||||
install(CODE "execute_process(COMMAND ${CHMOD} 2775 \"\${CMAKE_INSTALL_PREFIX}/data/modules/runtime\")")
|
||||
install(CODE "execute_process(COMMAND ${CHMOD} 2775 \"\${DB_DIR}/backups\")")
|
||||
install(CODE "execute_process(COMMAND ${CHMOD} 2775 \"\${LOGS_DIR}\")")
|
||||
install(CODE "execute_process(COMMAND ${CHMOD} 2775 \"\${LIB_DIR}/modules/runtime\")")
|
||||
install(CODE "execute_process(COMMAND ${CHGRP} -R ${RUNGROUP} \"\${CMAKE_INSTALL_PREFIX}\")")
|
||||
endif(NOT WIN32 AND RUNGROUP)
|
||||
# On Windows platforms, install extra files
|
||||
if(WIN32)
|
||||
install(FILES ${Anope_SOURCE_DIR}/src/win32/anope.bat
|
||||
DESTINATION bin
|
||||
DESTINATION ${BIN_DIR}
|
||||
)
|
||||
endif(WIN32)
|
||||
|
||||
|
||||
@@ -67,6 +67,12 @@ Run_Build_System () {
|
||||
RUN_CC_PL="-DUSE_RUN_CC_PL:BOOLEAN=OFF"
|
||||
fi
|
||||
|
||||
if [ "$USE_PCH" = "yes" ] ; then
|
||||
PCH="-DUSE_PCH:BOOLEAN=ON"
|
||||
else
|
||||
PCH="-DUSE_PCH:BOOLEAN=OFF"
|
||||
fi
|
||||
|
||||
case `uname -s` in
|
||||
MINGW*)
|
||||
GEN_TYPE="-G\"MSYS Makefiles\""
|
||||
@@ -82,9 +88,9 @@ Run_Build_System () {
|
||||
REAL_SOURCE_DIR="$SOURCE_DIR"
|
||||
fi
|
||||
|
||||
echo "cmake $GEN_TYPE $WITH_INST $WITH_RUN $WITH_PERM $BUILD_TYPE $RUN_CC_PL $EXTRA_CONFIG_ARGS $REAL_SOURCE_DIR"
|
||||
echo "cmake $GEN_TYPE $WITH_INST $WITH_RUN $WITH_PERM $BUILD_TYPE $RUN_CC_PL $PCH $EXTRA_CONFIG_ARGS $REAL_SOURCE_DIR"
|
||||
|
||||
cmake $GEN_TYPE $WITH_INST $WITH_RUN $WITH_PERM $BUILD_TYPE $RUN_CC_PL $EXTRA_CONFIG_ARGS $REAL_SOURCE_DIR
|
||||
cmake $GEN_TYPE $WITH_INST $WITH_RUN $WITH_PERM $BUILD_TYPE $RUN_CC_PL $PCH $EXTRA_CONFIG_ARGS $REAL_SOURCE_DIR
|
||||
|
||||
echo ""
|
||||
if [ "$SOURCE_DIR" = "." ] ; then
|
||||
@@ -117,6 +123,7 @@ RUNGROUP=
|
||||
UMASK=
|
||||
DEBUG="yes"
|
||||
USE_RUN_CC_PL="no"
|
||||
USE_PCH="no"
|
||||
EXTRA_CONFIG_ARGS=
|
||||
CAN_QUICK="no"
|
||||
SOURCE_DIR=`dirname $0`
|
||||
@@ -151,15 +158,49 @@ while [ $# -ge 1 ] ; do
|
||||
shift 1
|
||||
done
|
||||
|
||||
###########################################################################
|
||||
# Check for CMake and (optionally) install it
|
||||
###########################################################################
|
||||
|
||||
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
|
||||
if exists "cmake-bin" ; then :
|
||||
else
|
||||
echo "Anope requires CMake 2.4 or newer, which can be downloaded at http://cmake.org"
|
||||
echo "If you have installed CMake already, ensure it is in your PATH environment variable."
|
||||
|
||||
if [ `uname` = "Linux" ] ; then
|
||||
|
||||
echo ""
|
||||
echo "Config can attempt to install CMake for you now, which"
|
||||
echo "will take approximately 50 MB of disk space."
|
||||
echo "Would you like to install CMake now?"
|
||||
echo2 "[y] "
|
||||
read YN
|
||||
if [ "$YN" = "n" ] ; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo "Downloading CMake... this may take a minute or two."
|
||||
wget -q http://anope.org/cmake/linux-i386.php -O cmake-bin.tar.gz
|
||||
if [ $? -ne 0 ] ; then
|
||||
rm -f cmake-bin.tar.gz
|
||||
echo "Unable to download CMake"
|
||||
exit 0
|
||||
fi
|
||||
mkdir -p cmake-bin
|
||||
tar zxf cmake-bin.tar.gz -C cmake-bin
|
||||
rm -f cmake-bin.tar.gz
|
||||
echo "Done!"
|
||||
else
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
|
||||
CMAKE_BIN=`find cmake-bin -name cmake`
|
||||
CMAKE_BIN="`pwd`/`dirname $CMAKE_BIN`"
|
||||
PATH="$PATH:$CMAKE_BIN"
|
||||
fi
|
||||
|
||||
###########################################################################
|
||||
@@ -175,23 +216,7 @@ if [ ! "$NO_INTRO" ] ; then
|
||||
;;
|
||||
esac
|
||||
. $SOURCE_DIR/src/version.sh
|
||||
if [ -d .git ] ; then
|
||||
VERSION=`git describe --tags`
|
||||
VERSION_BUILD=`echo "$VERSION" | cut -d'-' -f2`
|
||||
if [ "$SOURCE_DIR" = "." ] ; then
|
||||
test -d build || mkdir -p build/include
|
||||
BUILD_DIR="build"
|
||||
else
|
||||
BUILD_DIR="."
|
||||
fi
|
||||
VERSION_EXTRA=`echo "$VERSION" | cut -d'-' -f3`
|
||||
# Only do this if we are not on a tag, src/version.sh will be all we need then.
|
||||
if [ "$VERSION_BUILD" != "$VERSION_EXTRA" ] ; then
|
||||
echo "#define VERSION_BUILD $VERSION_BUILD" > $BUILD_DIR/include/version.h
|
||||
echo "#define VERSION_EXTRA \"-$VERSION_EXTRA\"" >> $BUILD_DIR/include/version.h
|
||||
fi
|
||||
fi
|
||||
cat $SOURCE_DIR/.BANNER | sed "s/CURVER/$VERSION/" | sed "s@SOURCE_DIR@$SOURCE_DIR@" | $PAGER
|
||||
cat $SOURCE_DIR/.BANNER | sed "s/CURVER/$VERSION_MAJOR.$VERSION_MINOR.$VERSION_PATCH$VERSION_EXTRA/" | sed "s@SOURCE_DIR@$SOURCE_DIR@" | $PAGER
|
||||
echo ""
|
||||
else
|
||||
echo ""
|
||||
@@ -342,6 +367,25 @@ echo ""
|
||||
|
||||
####
|
||||
|
||||
TEMP_YN="n"
|
||||
if [ "$USE_PCH" = "yes" ] ; then
|
||||
TEMP_YN="y"
|
||||
fi
|
||||
echo "Do you want to build using precompiled headers? This can speed up"
|
||||
echo "the build, but uses more disk space."
|
||||
echo2 "[$TEMP_YN] "
|
||||
read YN
|
||||
if [ "$YN" ] ; then
|
||||
if [ "$YN" = "y" ] ; then
|
||||
USE_PCH="yes"
|
||||
else
|
||||
USE_PCH="no"
|
||||
fi
|
||||
fi
|
||||
echo ""
|
||||
|
||||
####
|
||||
|
||||
echo "Are there any extra arguments you wish to pass to cmake?"
|
||||
echo "You may only need to do this if cmake is unable to locate"
|
||||
echo "missing dependencies without hints."
|
||||
@@ -367,6 +411,7 @@ RUNGROUP="$RUNGROUP"
|
||||
UMASK=$UMASK
|
||||
DEBUG="$DEBUG"
|
||||
USE_RUN_CC_PL="$USE_RUN_CC_PL"
|
||||
USE_PCH="$USE_PCH"
|
||||
EXTRA_CONFIG_ARGS="$EXTRA_CONFIG_ARGS"
|
||||
EOT
|
||||
echo "done."
|
||||
|
||||
+1
-1
@@ -479,7 +479,7 @@ macro(calculate_libraries SRC SKIP SRC_LDFLAGS EXTRA_DEPENDS)
|
||||
endforeach(LIBRARY_PATH)
|
||||
# Iterate through libraries and add them to the linker flags
|
||||
foreach(LIBRARY ${LIBRARIES})
|
||||
set(THIS_LDFLAGS "${THIS_LDFLAGS} -l${LIBRARY}")
|
||||
append_to_list(EXTRA_DEPENDENCIES "${LIBRARY}")
|
||||
endforeach(LIBRARY)
|
||||
set(${SRC_LDFLAGS} "${THIS_LDFLAGS}")
|
||||
set(${EXTRA_DEPENDS} "${EXTRA_DEPENDENCIES}")
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
#include <sys/eventfd.h>
|
||||
|
||||
int main()
|
||||
{
|
||||
int i = eventfd(0, EFD_NONBLOCK);
|
||||
return i >= 0 ? 1 : 0;
|
||||
}
|
||||
|
||||
+2
-2
@@ -1,6 +1,6 @@
|
||||
# Only install example.chk and example.conf from this directory
|
||||
# NOTE: I would've had this just find all files in the directory, but that would include files not needed (like this file)
|
||||
set(DATA example.chk tables.sql botserv.example.conf example.conf hostserv.example.conf modules.example.conf operserv.example.conf chanserv.example.conf global.example.conf memoserv.example.conf nickserv.example.conf)
|
||||
set(DATA example.chk botserv.example.conf example.conf hostserv.example.conf modules.example.conf operserv.example.conf chanserv.example.conf global.example.conf memoserv.example.conf nickserv.example.conf chanstats.example.conf)
|
||||
install(FILES ${DATA}
|
||||
DESTINATION data
|
||||
DESTINATION ${CONF_DIR}
|
||||
)
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
|
||||
/*
|
||||
* First, create the service.
|
||||
* Note that an easy way to rename this service is to define{} the client name to something else.
|
||||
*/
|
||||
service
|
||||
{
|
||||
@@ -39,6 +40,15 @@ service
|
||||
* unable to do certain things if this option is enabled.
|
||||
*/
|
||||
#modes = "+o"
|
||||
|
||||
/*
|
||||
* An optional comma separated list of channels this service should join. Outside
|
||||
* of log channels this is not very useful, as the service will just idle in the
|
||||
* specified channels, and will not accept any types of commands.
|
||||
*
|
||||
* Prefixes may be given to the channels in the form of mode character or prefix symbol.
|
||||
*/
|
||||
#channels = "@#services,#mychan"
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -46,7 +56,7 @@ service
|
||||
*
|
||||
* Provides essential functionality for BotServ.
|
||||
*/
|
||||
module { name = "bs_main" }
|
||||
module { name = "botserv" }
|
||||
|
||||
/*
|
||||
* Configuration for BotServ provided by bs_main.
|
||||
@@ -121,11 +131,11 @@ botserv
|
||||
#casesensitive = yes
|
||||
|
||||
/*
|
||||
* Defines the prefix for fantasy commands in channels. This character will have to be prepended
|
||||
* Defines the prefixs for fantasy commands in channels. One of these characters will have to be prepended
|
||||
* to all fantasy commands. If you choose "!", for example, fantasy commands will be "!kick",
|
||||
* "!op", etc. This directive is optional, if left out, the default fantasy character is "!".
|
||||
*/
|
||||
#fantasycharacter = "!"
|
||||
#fantasycharacter = "!."
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -238,3 +248,63 @@ command { service = "BotServ"; name = "KICK"; command = "botserv/kick"; }
|
||||
module { name = "bs_set" }
|
||||
command { service = "BotServ"; name = "SET"; command = "botserv/set"; }
|
||||
|
||||
/*
|
||||
* bs_set_dontkickops
|
||||
*
|
||||
* Provides the command botserv/set/dontkickops.
|
||||
*
|
||||
* Used for preventing BotServ from kicking channel operators.
|
||||
*/
|
||||
module { name = "bs_set_dontkickops" }
|
||||
command { service = "BotServ"; name = "SET DONTKICKOPS"; command = "botserv/set/dontkickops"; }
|
||||
|
||||
/*
|
||||
* bs_set_dontkickvoices
|
||||
*
|
||||
* Provides the command botserv/set/dontkickvoices.
|
||||
*
|
||||
* Used for preventing BotServ from kicking voices.
|
||||
*/
|
||||
module { name = "bs_set_dontkickvoices" }
|
||||
command { service = "BotServ"; name = "SET DONTKICKVOICES"; command = "botserv/set/dontkickvoices"; }
|
||||
|
||||
/*
|
||||
* bs_set_fantasy
|
||||
*
|
||||
* Provides the command botserv/set/fantasy.
|
||||
*
|
||||
* Used for enabling or disabling BotServ's fantaisist commands.
|
||||
*/
|
||||
module { name = "bs_set_fantasy" }
|
||||
command { service = "BotServ"; name = "SET FANTASY"; command = "botserv/set/fantasy"; }
|
||||
|
||||
/*
|
||||
* bs_set_greet
|
||||
*
|
||||
* Provides the command botserv/set/greet.
|
||||
*
|
||||
* Used for enabling or disabling BotServ's greet messages in a channel.
|
||||
*/
|
||||
module { name = "bs_set_greet" }
|
||||
command { service = "BotServ"; name = "SET GREET"; command = "botserv/set/greet"; }
|
||||
|
||||
/*
|
||||
* bs_set_nobot
|
||||
*
|
||||
* Provides the command botserv/set/nobot.
|
||||
*
|
||||
* Used by Services Operators to prohibit specific channels from being assigned BotServ bots.
|
||||
*/
|
||||
module { name = "bs_set_nobot" }
|
||||
command { service = "BotServ"; name = "SET NOBOT"; command = "botserv/set/nobot"; }
|
||||
|
||||
/*
|
||||
* bs_set_private
|
||||
*
|
||||
* Provides the command botserv/set/private.
|
||||
*
|
||||
* Used by Services Operators to prohibit specific BotServ bots from being assigned to channels.
|
||||
*/
|
||||
module { name = "bs_set_private" }
|
||||
command { service = "BotServ"; name = "SET PRIVATE"; command = "botserv/set/private"; }
|
||||
|
||||
|
||||
+681
-98
@@ -4,6 +4,7 @@
|
||||
|
||||
/*
|
||||
* First, create the service.
|
||||
* Note that an easy way to rename this service is to define{} the client name to something else.
|
||||
*/
|
||||
service
|
||||
{
|
||||
@@ -39,6 +40,15 @@ service
|
||||
* unable to do certain things if this option is enabled.
|
||||
*/
|
||||
#modes = "+o"
|
||||
|
||||
/*
|
||||
* An optional comma separated list of channels this service should join. Outside
|
||||
* of log channels this is not very useful, as the service will just idle in the
|
||||
* specified channels, and will not accept any types of commands.
|
||||
*
|
||||
* Prefixes may be given to the channels in the form of mode character or prefix symbol.
|
||||
*/
|
||||
#channels = "@#services,#mychan"
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -46,7 +56,7 @@ service
|
||||
*
|
||||
* Provides essential functionality for ChanServ.
|
||||
*/
|
||||
module { name = "cs_main" }
|
||||
module { name = "chanserv" }
|
||||
|
||||
/*
|
||||
* Configuration for ChanServ provided by cs_main.
|
||||
@@ -65,7 +75,6 @@ chanserv
|
||||
*
|
||||
* The options are:
|
||||
* - keeptopic: Retain topic when the channel is not in use
|
||||
* - opnotice: Send a notice when OP/DEOP commands are used
|
||||
* - peace: Disallow users from kicking or removing modes from others who are of the same
|
||||
* access level or superior
|
||||
* - private: Hide the channel from ChanServ's LIST command
|
||||
@@ -165,96 +174,650 @@ chanserv
|
||||
#opersonly = yes
|
||||
|
||||
/*
|
||||
* ChanServ levels configuration, for use with cs_access.
|
||||
* Default modes for mode lock, these are set on newly registered channels.
|
||||
*
|
||||
* These levels are used by the chanserv/access access system.
|
||||
* The levels configured below will be used as a default by newly registered channels.
|
||||
*
|
||||
* The level "founder" is a special level that means anyone with the level_founder permission
|
||||
* can use (which of course defaults to "founder"). Anyone with the founder level permission in
|
||||
* a channel can do anything in the channel.
|
||||
*
|
||||
* The level "disabled" is a special level that means the level is disabled, even from people
|
||||
* with founder level access.
|
||||
* If not set, the default is +nrt.
|
||||
*/
|
||||
level_change = 10
|
||||
level_list = 1
|
||||
level_akick = 10
|
||||
level_assign = "founder"
|
||||
level_autohalfop = 4
|
||||
level_autoop = 5
|
||||
level_autoowner = 9999
|
||||
level_autoprotect = 10
|
||||
level_autovoice = 3
|
||||
level_badwords = 10
|
||||
level_ban = 4
|
||||
level_fantasia = 3
|
||||
level_founder = "founder"
|
||||
level_getkey = 5
|
||||
level_greet = 5
|
||||
level_halfop = 5
|
||||
level_halfopme = 4
|
||||
level_info = 9999
|
||||
level_invite = 5
|
||||
level_kick = 4
|
||||
level_memo = 10
|
||||
level_mode = 5
|
||||
level_nokick = 1
|
||||
level_opdeop = 5
|
||||
level_opdeopme = 5
|
||||
level_owner = "founder"
|
||||
level_ownerme = 9999
|
||||
level_protect = 9999
|
||||
level_protectme = 10
|
||||
level_say = 5
|
||||
level_signkick = 9999
|
||||
level_set = 9999
|
||||
level_topic = 5
|
||||
level_unban = 4
|
||||
level_voice = 4
|
||||
level_voiceme = 3
|
||||
mlock = "+nrt"
|
||||
|
||||
/*
|
||||
* ChanServ flags configuration, for use with cs_flags.
|
||||
*
|
||||
* These flags are used by the chanserv/flags access system.
|
||||
* Modes that will not be allowed to be locked. Oper only modes such as +O
|
||||
* are always restricted from regular users and are not affected by this.
|
||||
* Comment out for no restrictions.
|
||||
*/
|
||||
flag_change = "f"
|
||||
flag_list = "l"
|
||||
flag_akick = "K"
|
||||
flag_assign = "s"
|
||||
flag_autohalfop = "H"
|
||||
flag_autoop = "O"
|
||||
flag_autoowner = "Q"
|
||||
flag_autoprotect = "A"
|
||||
flag_autovoice = "V"
|
||||
flag_badwords = "k"
|
||||
flag_ban = "b"
|
||||
flag_fantasia = "c"
|
||||
flag_founder = "F"
|
||||
flag_getkey = "G"
|
||||
flag_greet = "g"
|
||||
flag_halfop = "h"
|
||||
flag_halfopme = "h"
|
||||
flag_info = "I"
|
||||
flag_invite = "i"
|
||||
flag_kick = "k"
|
||||
flag_memo = "m"
|
||||
flag_mode = "s"
|
||||
flag_nokick = "N"
|
||||
flag_opdeop = "o"
|
||||
flag_opdeopme = "o"
|
||||
flag_owner = "q"
|
||||
flag_ownerme = "q"
|
||||
flag_protect = "a"
|
||||
flag_protectme = "a"
|
||||
flag_say = "B"
|
||||
flag_set = "s"
|
||||
flag_signkick = "K"
|
||||
flag_topic = "t"
|
||||
flag_unban = "u"
|
||||
flag_voice = "v"
|
||||
flag_voiceme = "v"
|
||||
#nomlock = "P"
|
||||
|
||||
/*
|
||||
* Modes that are required to be set and only set on all registered channels.
|
||||
* These modes can not be locked or unlocked.
|
||||
*/
|
||||
require = "r"
|
||||
|
||||
/*
|
||||
* Some IRCds can enforce mode locks server-side. This reduces the spam caused by
|
||||
* services immediately reversing mode changes for locked modes.
|
||||
*/
|
||||
use_server_side_mlock = yes
|
||||
}
|
||||
|
||||
/*
|
||||
* ChanServ privilege configuration.
|
||||
*
|
||||
* ChanServ privileges are used to determine who has what access in channels. By default the core has its own
|
||||
* set of levels it uses for various ChanServ commands, which are defined below. Privilege ranks are used to
|
||||
* determine how powerful privileges are relative to each other, which is used by Anope to determine who has greater
|
||||
* access in a channel.
|
||||
*
|
||||
* If you loaded cs_access, you may define a level for the privilege, which is used by chanserv/access and chanserv/levels.
|
||||
* The levels defined will be used as the default levels for newly registered channels.
|
||||
* The level "founder" is a special level which means anyone with the privilege FOUNDER on the channel
|
||||
* has that permission. Additionally, the level "disabled" means that no one can use the privilege, including founders.
|
||||
*
|
||||
* If you loaded cs_flags, you may define a flag associated with that privilege for use in chanserv/flags.
|
||||
*
|
||||
* Defining new privileges here is not useful unless you have a module (eg, a third party one) made to check for
|
||||
* the specific level you are defining.
|
||||
*
|
||||
* Sane defaults are provided below that do not need to be edited unless you wish to change the default behavior.
|
||||
*/
|
||||
|
||||
/*
|
||||
* ACCESS_CHANGE privilege.
|
||||
*
|
||||
* Used by chanserv/access, chanserv/flags and chanserv/xop.
|
||||
*
|
||||
* Users with this permission can modify the permissions of others.
|
||||
*/
|
||||
privilege
|
||||
{
|
||||
name = "ACCESS_CHANGE"
|
||||
desc = "Allowed to modify the access list"
|
||||
rank = 0
|
||||
level = 10
|
||||
flag = "f"
|
||||
}
|
||||
|
||||
/*
|
||||
* ACCESS_LIST privilege.
|
||||
*
|
||||
* Used by chanserv/access, chanserv/flags, and chanserv/xop.
|
||||
*
|
||||
* Users with this permission can view the access list of channels.
|
||||
*/
|
||||
privilege
|
||||
{
|
||||
name = "ACCESS_LIST"
|
||||
desc = "Allowed to view the access list"
|
||||
rank = 10
|
||||
level = 3
|
||||
flag = "f"
|
||||
}
|
||||
|
||||
/*
|
||||
* AKICK privilege.
|
||||
*
|
||||
* Used by chanserv/akick and chanserv/enforce.
|
||||
*
|
||||
* Users with this permission can modify the AKICK list.
|
||||
*/
|
||||
privilege
|
||||
{
|
||||
name = "AKICK"
|
||||
desc = "Allowed to use the AKICK command"
|
||||
rank = 250
|
||||
level = 10
|
||||
flag = "K"
|
||||
}
|
||||
|
||||
/*
|
||||
* ASSIGN privilege.
|
||||
*
|
||||
* Used by botserv/assign.
|
||||
*
|
||||
* Users with this permission can assign and unassign BotServ bots to and from the channel.
|
||||
*/
|
||||
privilege
|
||||
{
|
||||
name = "ASSIGN"
|
||||
desc = "Allowed to assign/unassign a bot"
|
||||
rank = 270
|
||||
level = "founder"
|
||||
flag = "s"
|
||||
}
|
||||
|
||||
/*
|
||||
* AUTOHALFOP privilege.
|
||||
*
|
||||
* Used by the core.
|
||||
*
|
||||
* Users with this permission get halfop on join.
|
||||
*/
|
||||
privilege
|
||||
{
|
||||
name = "AUTOHALFOP"
|
||||
desc = "Automatic mode +h"
|
||||
rank = 100
|
||||
level = 4
|
||||
flag = "H"
|
||||
}
|
||||
|
||||
/*
|
||||
* AUTOOP privilege.
|
||||
*
|
||||
* Used by the core.
|
||||
*
|
||||
* Users with this permission get op on join.
|
||||
*/
|
||||
privilege
|
||||
{
|
||||
name = "AUTOOP"
|
||||
desc = "Automatic channel operator status"
|
||||
rank = 210
|
||||
level = 5
|
||||
flag = "O"
|
||||
}
|
||||
|
||||
/*
|
||||
* AUTOOWNER privilege.
|
||||
*
|
||||
* Used by the core.
|
||||
*
|
||||
* Users with this permission get owner on join.
|
||||
*/
|
||||
privilege
|
||||
{
|
||||
name = "AUTOOWNER"
|
||||
desc = "Automatic mode +q"
|
||||
rank = 330
|
||||
level = 9999
|
||||
flag = "Q"
|
||||
}
|
||||
|
||||
/*
|
||||
* AUTOPROTECT privilege.
|
||||
*
|
||||
* Used by the core.
|
||||
*
|
||||
* Users with this permission get admin on join.
|
||||
*/
|
||||
privilege
|
||||
{
|
||||
name = "AUTOPROTECT"
|
||||
desc = "Automatic mode +a"
|
||||
rank = 240
|
||||
level = 10
|
||||
flag = "A"
|
||||
}
|
||||
|
||||
/*
|
||||
* AUTOVOICE privilege.
|
||||
*
|
||||
* Used by the core.
|
||||
*
|
||||
* Users with this permission get voice on join.
|
||||
*/
|
||||
privilege
|
||||
{
|
||||
name = "AUTOVOICE"
|
||||
desc = "Automatic mode +v"
|
||||
rank = 50
|
||||
level = 3
|
||||
flag = "V"
|
||||
}
|
||||
|
||||
/*
|
||||
* BADWORDS privilege.
|
||||
*
|
||||
* Used by botserv/badwords.
|
||||
*
|
||||
* Users with this permission can modify BotServ's BADWORDS list.
|
||||
*/
|
||||
privilege
|
||||
{
|
||||
name = "BADWORDS"
|
||||
desc = "Allowed to modify channel badwords list"
|
||||
rank = 260
|
||||
level = 10
|
||||
flag = "K"
|
||||
}
|
||||
|
||||
/*
|
||||
* BAN privilege.
|
||||
*
|
||||
* Used by chanserv/ban and chanserv/tban.
|
||||
*
|
||||
* Users with this permission can use the BAN command.
|
||||
*/
|
||||
privilege
|
||||
{
|
||||
name = "BAN"
|
||||
desc = "Allowed to ban users"
|
||||
rank = 150
|
||||
level = 4
|
||||
flag = "b"
|
||||
}
|
||||
|
||||
/*
|
||||
* FANTASIA privilege.
|
||||
*
|
||||
* Used by botserv/main and chanserv/xop.
|
||||
*
|
||||
* Users with this permission can use fantasy commands in the channel.
|
||||
*/
|
||||
privilege
|
||||
{
|
||||
name = "FANTASIA"
|
||||
desc = "Allowed to use fantasy commands"
|
||||
rank = 30
|
||||
level = 3
|
||||
flag = "c"
|
||||
}
|
||||
|
||||
/*
|
||||
* FOUNDER privilege.
|
||||
*
|
||||
* Used by botserv/info, chanserv/access, chanserv/akick,
|
||||
* chanserv/clearusers, chanserv/drop, chanserv/set/founder,
|
||||
* chanserv/set/securefounder, chanserv/set/successor and chanserv/xop.
|
||||
*
|
||||
* Users with this permission are treated as founders and can use
|
||||
* commands restricted to founders.
|
||||
*/
|
||||
privilege
|
||||
{
|
||||
name = "FOUNDER"
|
||||
desc = "Allowed to issue commands restricted to channel founders"
|
||||
rank = 360
|
||||
level = "founder"
|
||||
flag = "F"
|
||||
}
|
||||
|
||||
/*
|
||||
* GETKEY privilege.
|
||||
*
|
||||
* Used by chanserv/getkey and nickserv/ajoin.
|
||||
*
|
||||
* Users with this permission can get they channel key with GETKEY and
|
||||
* can use nickserv/ajoin to join channels with keys.
|
||||
*/
|
||||
privilege
|
||||
{
|
||||
name = "GETKEY"
|
||||
desc = "Allowed to use GETKEY command"
|
||||
rank = 180
|
||||
level = 5
|
||||
flag = "G"
|
||||
}
|
||||
|
||||
/*
|
||||
* GREET privilege.
|
||||
*
|
||||
* Used by botserv/main.
|
||||
*
|
||||
* Users with this permission get their greet shown on join.
|
||||
*/
|
||||
privilege
|
||||
{
|
||||
name = "GREET"
|
||||
desc = "Greet message displayed on join"
|
||||
rank = 40
|
||||
level = 5
|
||||
flag = "g"
|
||||
}
|
||||
|
||||
/*
|
||||
* HALFOP privilege.
|
||||
*
|
||||
* Used by chanserv/mode, chanserv/halfop and chanserv/dehalfop.
|
||||
*
|
||||
* Users with this permission can use ChanServ to halfop and dehalfop
|
||||
* others in the channel.
|
||||
*/
|
||||
privilege
|
||||
{
|
||||
name = "HALFOP"
|
||||
desc = "Allowed to (de)halfop users"
|
||||
rank = 120
|
||||
level = 5
|
||||
flag = "h"
|
||||
}
|
||||
|
||||
/*
|
||||
* HALFOPME privilege.
|
||||
*
|
||||
* Used by chanserv/mode, chanserv/halfop and chanserv/dehalfop.
|
||||
*
|
||||
* Users with this permission can use ChanServ to halfop and dehalfop
|
||||
* themselves in the channel.
|
||||
*/
|
||||
privilege
|
||||
{
|
||||
name = "HALFOPME"
|
||||
desc = "Allowed to (de)halfop him/herself"
|
||||
rank = 110
|
||||
level = 4
|
||||
flag = "h"
|
||||
}
|
||||
|
||||
/*
|
||||
* INFO privilege.
|
||||
*
|
||||
* Used by botserv/info and chanserv/info.
|
||||
*
|
||||
* Users with this permission are allowed to get the full INFO output
|
||||
* from BotServ and ChanServ.
|
||||
*/
|
||||
privilege
|
||||
{
|
||||
name = "INFO"
|
||||
desc = "Allowed to get full INFO output"
|
||||
rank = 80
|
||||
level = 9999
|
||||
flag = "I"
|
||||
}
|
||||
|
||||
/*
|
||||
* INVITE privilege.
|
||||
*
|
||||
* Used by chanserv/invite and nickserv/ajoin.
|
||||
*
|
||||
* Users with this permission can invite users through ChanServ and
|
||||
* join invite only channels with nickserv/ajoin.
|
||||
*/
|
||||
privilege
|
||||
{
|
||||
name = "INVITE"
|
||||
desc = "Allowed to use the INVITE command"
|
||||
rank = 190
|
||||
level = 5
|
||||
flag = "i"
|
||||
}
|
||||
|
||||
/*
|
||||
* KICK privilege.
|
||||
*
|
||||
* Used by chanserv/kick.
|
||||
*
|
||||
* Users with this permission can use the KICK command.
|
||||
*/
|
||||
privilege
|
||||
{
|
||||
name = "KICK"
|
||||
desc = "Allowed to use the KICK command"
|
||||
rank = 130
|
||||
level = 4
|
||||
flag = "k"
|
||||
}
|
||||
|
||||
/*
|
||||
* MEMO privilege.
|
||||
*
|
||||
* Used by memoserv/del, memoserv/ignore, memoserv/info, memoserv/list,
|
||||
* memoserv/main, memoserv/read and memoserv/set.
|
||||
*
|
||||
* Users with this permission can manage channel memos.
|
||||
*/
|
||||
privilege
|
||||
{
|
||||
name = "MEMO"
|
||||
desc = "Allowed to read channel memos"
|
||||
rank = 280
|
||||
level = 10
|
||||
flag = "m"
|
||||
}
|
||||
|
||||
/*
|
||||
* MODE privilege.
|
||||
*
|
||||
* Used by chanserv/mode.
|
||||
*
|
||||
* Users with this permission can set modes through ChanServ and change
|
||||
* the mode lock.
|
||||
*/
|
||||
privilege
|
||||
{
|
||||
name = "MODE"
|
||||
desc = "Allowed to use the MODE command"
|
||||
rank = 170
|
||||
level = 9999
|
||||
flag = "s"
|
||||
}
|
||||
|
||||
/*
|
||||
* NOKICK privilege.
|
||||
*
|
||||
* Used by botserv/kick.
|
||||
*
|
||||
* Users with this permission are spared from automated BotServ kicks.
|
||||
*/
|
||||
privilege
|
||||
{
|
||||
name = "NOKICK"
|
||||
desc = "Prevents users being kicked by Services"
|
||||
rank = 20
|
||||
level = 1
|
||||
flag = "N"
|
||||
}
|
||||
|
||||
/*
|
||||
* OPDEOP privilege.
|
||||
*
|
||||
* Used by chanserv/mode, chanserv/op and chanserv/deop.
|
||||
*
|
||||
* Users with this permission can use ChanServ to op and deop
|
||||
* others in the channel.
|
||||
*/
|
||||
privilege
|
||||
{
|
||||
name = "OPDEOP"
|
||||
desc = "Allowed to (de)op users"
|
||||
rank = 230
|
||||
level = 5
|
||||
flag = "o"
|
||||
}
|
||||
|
||||
/*
|
||||
* OPDEOPME privilege.
|
||||
*
|
||||
* Used by chanserv/mode, chanserv/op and chanserv/deop.
|
||||
*
|
||||
* Users with this permission can use ChanServ to op and deop
|
||||
* themselves in the channel.
|
||||
*/
|
||||
privilege
|
||||
{
|
||||
name = "OPDEOPME"
|
||||
desc = "Allowed to (de)op him/herself"
|
||||
rank = 220
|
||||
level = 5
|
||||
flag = "o"
|
||||
}
|
||||
|
||||
/*
|
||||
* OWNER privilege.
|
||||
*
|
||||
* Used by chanserv/mode, chanserv/owner and chanserv/deowner.
|
||||
*
|
||||
* Users with this permission can use ChanServ to owner and deowner
|
||||
* others in the channel.
|
||||
*/
|
||||
privilege
|
||||
{
|
||||
name = "OWNER"
|
||||
desc = "Allowed to (de)owner users"
|
||||
rank = 350
|
||||
level = "founder"
|
||||
flag = "q"
|
||||
}
|
||||
|
||||
/*
|
||||
* OWNERME privilege.
|
||||
*
|
||||
* Used by chanserv/mode, chanserv/owner and chanserv/deowner.
|
||||
*
|
||||
* Users with this permission can use ChanServ to owner and deowner
|
||||
* themselves in the channel.
|
||||
*/
|
||||
privilege
|
||||
{
|
||||
name = "OWNERME"
|
||||
desc = "Allowed to (de)owner him/herself"
|
||||
rank = 340
|
||||
level = 9999
|
||||
flag = "q"
|
||||
}
|
||||
|
||||
/*
|
||||
* PROTECT privilege.
|
||||
*
|
||||
* Used by chanserv/mode, chanserv/protect and chanserv/deprotect.
|
||||
*
|
||||
* Users with this permission can use ChanServ to protect and deprotect
|
||||
* others in the channel.
|
||||
*/
|
||||
privilege
|
||||
{
|
||||
name = "PROTECT"
|
||||
desc = "Allowed to (de)protect users"
|
||||
rank = 310
|
||||
level = 9999
|
||||
flag = "a"
|
||||
}
|
||||
|
||||
/*
|
||||
* PROTECTME privilege.
|
||||
*
|
||||
* Used by chanserv/mode, chanserv/protect and chanserv/deprotect.
|
||||
*
|
||||
* Users with this permission can use ChanServ to protect and deprotect
|
||||
* themselves in the channel.
|
||||
*/
|
||||
privilege
|
||||
{
|
||||
name = "PROTECTME"
|
||||
desc = "Allowed to (de)protect him/herself"
|
||||
rank = 300
|
||||
level = 10
|
||||
flag = "a"
|
||||
}
|
||||
|
||||
/*
|
||||
* SAY privilege.
|
||||
*
|
||||
* Used by botserv/control.
|
||||
*
|
||||
* Users with this permission can use the BotServ bot in the channel to
|
||||
* say or do a /me with the provided message.
|
||||
*/
|
||||
privilege
|
||||
{
|
||||
name = "SAY"
|
||||
desc = "Allowed to use SAY and ACT commands"
|
||||
rank = 90
|
||||
level = 5
|
||||
flag = "B"
|
||||
}
|
||||
|
||||
/*
|
||||
* SET privilege.
|
||||
*
|
||||
* Used by botserv/kick, botserv/set, chanserv/clone, chanserv/log,
|
||||
* chanserv/saset/noexpire and chanserv/set.
|
||||
*
|
||||
* Users with this permission can set what BotServ will kick for, change
|
||||
* BotServ and ChanServ settings, clone ChanServ channel setings, and
|
||||
* set ChanServ logging options.
|
||||
*/
|
||||
privilege
|
||||
{
|
||||
name = "SET"
|
||||
desc = "Allowed to set channel settings"
|
||||
rank = 320
|
||||
level = 9999
|
||||
flag = "s"
|
||||
}
|
||||
|
||||
/*
|
||||
* SIGNKICK privilege.
|
||||
*
|
||||
* Used by chanserv/ban and chanserv/kick.
|
||||
*
|
||||
* Users with this permission won't get their nick shown in the kick
|
||||
* through ChanServ when the setting SIGNKICK is set to LEVEL.
|
||||
*/
|
||||
privilege
|
||||
{
|
||||
name = "SIGNKICK"
|
||||
desc = "No signed kick when SIGNKICK LEVEL is used"
|
||||
rank = 140
|
||||
level = 9999
|
||||
flag = "K"
|
||||
}
|
||||
|
||||
/*
|
||||
* TOPIC privilege.
|
||||
*
|
||||
* Used by chanserv/appendtopic and chanserv/topic.
|
||||
*
|
||||
* Users with this permission can change the channel topic through ChanServ.
|
||||
*/
|
||||
privilege
|
||||
{
|
||||
name = "TOPIC"
|
||||
desc = "Allowed to change channel topics"
|
||||
rank = 160
|
||||
level = 5
|
||||
flag = "t"
|
||||
}
|
||||
|
||||
/*
|
||||
* UNBAN privilege.
|
||||
*
|
||||
* Used by chanserv/unban.
|
||||
*
|
||||
* Users with this permission can unban themselves and others through ChanServ.
|
||||
*/
|
||||
privilege
|
||||
{
|
||||
name = "UNBAN"
|
||||
desc = "Allowed to unban users"
|
||||
rank = 200
|
||||
level = 4
|
||||
flag = "u"
|
||||
}
|
||||
|
||||
/*
|
||||
* VOICE privilege.
|
||||
*
|
||||
* Used by chanserv/mode, chanserv/voice and chanserv/devoice.
|
||||
*
|
||||
* Users with this permission can use ChanServ to voice and devoice
|
||||
* others in the channel.
|
||||
*/
|
||||
privilege
|
||||
{
|
||||
name = "VOICE"
|
||||
desc = "Allowed to (de)voice users"
|
||||
rank = 70
|
||||
level = 4
|
||||
flag = "v"
|
||||
}
|
||||
|
||||
/*
|
||||
* VOICEME privilege.
|
||||
*
|
||||
* Used by chanserv/mode, chanserv/voice and chanserv/devoice.
|
||||
*
|
||||
* Users with this permission can use ChanServ to voice and devoice
|
||||
* themselves in the channel.
|
||||
*/
|
||||
privilege
|
||||
{
|
||||
name = "VOICEME"
|
||||
desc = "Allowed to (de)voice him/herself"
|
||||
rank = 60
|
||||
level = 3
|
||||
flag = "v"
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -314,6 +877,16 @@ module { name = "cs_ban" }
|
||||
command { service = "ChanServ"; name = "BAN"; command = "chanserv/ban"; }
|
||||
command { service = "ChanServ"; name = "KB"; command = "chanserv/ban"; }
|
||||
|
||||
/*
|
||||
* cs_tban
|
||||
*
|
||||
* Provides the command chanserv/tban.
|
||||
*
|
||||
* Used for banning users from channels for a specified time.
|
||||
*/
|
||||
module { name = "cs_tban" }
|
||||
command { service = "ChanServ"; name = "TBAN"; command = "chanserv/tban"; }
|
||||
|
||||
/*
|
||||
* cs_clearusers
|
||||
*
|
||||
@@ -431,6 +1004,16 @@ command { service = "ChanServ"; name = "K"; command = "chanserv/kick"; }
|
||||
module { name = "cs_list" }
|
||||
command { service = "ChanServ"; name = "LIST"; command = "chanserv/list"; permission = "chanserv/list"; }
|
||||
|
||||
/*
|
||||
* cs_log
|
||||
*
|
||||
* Provides the command chanserv/log.
|
||||
*
|
||||
* Use for configuring what actions on channels are logged and where.
|
||||
*/
|
||||
module { name = "cs_log" }
|
||||
command { service = "ChanServ"; name = "LOG"; command = "chanserv/log"; }
|
||||
|
||||
/*
|
||||
* cs_mode
|
||||
*
|
||||
@@ -562,17 +1145,6 @@ module { name = "cs_set_misc" }
|
||||
command { service = "ChanServ"; name = "SET URL"; command = "chanserv/set/misc"; }
|
||||
command { service = "ChanServ"; name = "SET EMAIL"; command = "chanserv/set/misc"; }
|
||||
|
||||
/*
|
||||
* cs_set_opnotice
|
||||
*
|
||||
* Provides the commands chanserv/set/opnotice and chanserv/saset/opnotice.
|
||||
*
|
||||
* Used for setting whether channel ops should be notified of mode changes made through ChanServ.
|
||||
*/
|
||||
module { name = "cs_set_opnotice" }
|
||||
command { service = "ChanServ"; name = "SET OPNOTICE"; command = "chanserv/set/opnotice"; }
|
||||
command { service = "ChanServ"; name = "SASET OPNOTICE"; command = "chanserv/saset/opnotice"; permission = "chanserv/saset/opnotice"; }
|
||||
|
||||
/*
|
||||
* cs_set_peace
|
||||
*
|
||||
@@ -735,6 +1307,17 @@ command { service = "ChanServ"; name = "TOPIC"; command = "chanserv/topic"; }
|
||||
module { name = "cs_unban" }
|
||||
command { service = "ChanServ"; name = "UNBAN"; command = "chanserv/unban"; }
|
||||
|
||||
/*
|
||||
* cs_updown
|
||||
*
|
||||
* Provides the commands chanserv/up and chanserv/down.
|
||||
*
|
||||
* Used for setting or removing your status modes on a channel.
|
||||
*/
|
||||
module { name = "cs_updown" }
|
||||
command { service = "ChanServ"; name = "DOWN"; command = "chanserv/down"; }
|
||||
command { service = "ChanServ"; name = "UP"; command = "chanserv/up"; }
|
||||
|
||||
/*
|
||||
* cs_xop
|
||||
*
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
/*
|
||||
* Example configuration file for chanstats
|
||||
* Make sure BotServ, ChanServ and NickServ are running.
|
||||
*/
|
||||
|
||||
module { name = "m_chanstats" }
|
||||
|
||||
chanstats
|
||||
{
|
||||
/*
|
||||
* The name of this engine.
|
||||
* This must match with the name of a SQL engine block
|
||||
*/
|
||||
|
||||
engine = "mysql/main"
|
||||
|
||||
/*
|
||||
* An optional prefix to prepended to the name of each created table.
|
||||
* Do not use the same prefix for other programs.
|
||||
*/
|
||||
prefix = "anope_"
|
||||
|
||||
smileyshappy = ":) :-) ;) :D :-D"
|
||||
smileyssad = ":( :-( ;( ;-("
|
||||
smileysother = ":/"
|
||||
|
||||
/*
|
||||
* Enable Chanstats for new registered nicks / channels
|
||||
* set it to 0 to disable it.
|
||||
*/
|
||||
NSDefChanstats = 1
|
||||
CSDefChanstats = 1
|
||||
}
|
||||
|
||||
|
||||
module { name = "cs_set_chanstats" }
|
||||
command { service = "ChanServ"; name = "SET CHANSTATS"; command = "chanserv/set/chanstats"; }
|
||||
|
||||
module { name = "ns_set_chanstats" }
|
||||
command { service = "NickServ"; name = "SET CHANSTATS"; command = "nickserv/set/chanstats"; }
|
||||
|
||||
module { name = "cs_fantasy_stats" }
|
||||
command { service = "ChanServ"; name = "STATS"; command = "chanserv/stats"; }
|
||||
command { service = "ChanServ"; name = "GSTATS"; command = "chanserv/gstats"; }
|
||||
|
||||
module { name = "cs_fantasy_top" }
|
||||
command { service = "ChanServ"; name = "TOP"; command = "chanserv/top"; }
|
||||
command { service = "ChanServ"; name = "TOP10"; command = "chanserv/top10"; }
|
||||
command { service = "ChanServ"; name = "GTOP"; command = "chanserv/gtop"; }
|
||||
command { service = "ChanServ"; name = "GTOP10"; command = "chanserv/gtop10"; }
|
||||
+230
-75
@@ -116,7 +116,7 @@ include
|
||||
include
|
||||
{
|
||||
type = "executable"
|
||||
name = "/usr/bin/wget -q -O - http://some.miconfigured.network.com/services.conf"
|
||||
name = "/usr/bin/wget -q -O - http://some.misconfigured.network.com/services.conf"
|
||||
}
|
||||
*/
|
||||
|
||||
@@ -192,7 +192,7 @@ serverinfo
|
||||
* the Operating System choose the local address. This directive is optional.
|
||||
*
|
||||
* If you don't know what this means or don't need to use it, just leave this
|
||||
* directives commented out.
|
||||
* directive commented out.
|
||||
*/
|
||||
#localhost = "nowhere."
|
||||
|
||||
@@ -205,15 +205,15 @@ serverinfo
|
||||
|
||||
/*
|
||||
* The filename containing the Services process ID. The path is relative to the
|
||||
* services executable. If not given, defaults to "services.pid".
|
||||
* services root directory. If not given, defaults to "data/services.pid".
|
||||
*/
|
||||
pid = "services.pid"
|
||||
pid = "data/services.pid"
|
||||
|
||||
/*
|
||||
* The filename containing the Message of the Day. The path is relative to the
|
||||
* services executable. If not given, defaults to "services.motd".
|
||||
* services root directory. If not given, defaults to "conf/services.motd".
|
||||
*/
|
||||
motd = "services.motd"
|
||||
motd = "conf/services.motd"
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -276,25 +276,37 @@ networkinfo
|
||||
*/
|
||||
options
|
||||
{
|
||||
/*
|
||||
* The case mapping used by services. This must be set to a valid locale name
|
||||
* installed on your machine. Services use this case map to compare, with
|
||||
* case insensitivity, things such as nick names, channel names, etc.
|
||||
*
|
||||
* We provide two special casemaps shipped with Anope, ascii and rfc1459.
|
||||
*
|
||||
* This value should be set to what your IRCd uses, which is probably rfc1459,
|
||||
* however Anope has always used ascii for comparison, so the default is ascii.
|
||||
*
|
||||
* Changing this value once set is not recommended.
|
||||
*/
|
||||
casemap = "ascii"
|
||||
|
||||
/*
|
||||
* The maximum length of passwords
|
||||
*/
|
||||
passlen = 32
|
||||
|
||||
/*
|
||||
* These keys are used to initiate the random number generator. These numbers
|
||||
* MUST be random as you want your passcodes to be random. Don't give these
|
||||
* keys to anyone! Keep them private!
|
||||
* This key is used to initiate the random number generator. This number
|
||||
* MUST be random as you want your passcodes to be random. Don't give this
|
||||
* key to anyone! Keep it private!
|
||||
*
|
||||
* NOTE: If you don't uncomment these or keep their default values, any talented
|
||||
* NOTE: If you don't uncomment this or keep the default values, any talented
|
||||
* programmer would be able to easily "guess" random strings used to mask
|
||||
* information. Be safe, and come up with three different 7-digit numbers.
|
||||
* information. Be safe, and come up with a 7-digit number.
|
||||
*
|
||||
* These directives are optional, but highly recommended.
|
||||
* This directive is optional, but highly recommended.
|
||||
*/
|
||||
#userkey1 = 9866235
|
||||
#userkey2 = 8362013
|
||||
#userkey3 = 2362899
|
||||
#seed = 9866235
|
||||
|
||||
/*
|
||||
* Allows Services to continue file write operations (i.e. database saving)
|
||||
@@ -358,7 +370,7 @@ options
|
||||
expiretimeout = 30m
|
||||
|
||||
/*
|
||||
* Sets the timout period for reading from the uplink.
|
||||
* Sets the timeout period for reading from the uplink.
|
||||
*/
|
||||
readtimeout = 5s
|
||||
|
||||
@@ -370,7 +382,7 @@ options
|
||||
|
||||
/*
|
||||
* Sets the (maximum) frequency at which the timeout list is checked. This,
|
||||
* combined with readtimeout above, determine how accurately timed events,
|
||||
* combined with readtimeout above, determines how accurately timed events,
|
||||
* such as nick kills, occur; it also determines how much CPU time Services
|
||||
* will use doing this. Higher values will cause less accurate timing but
|
||||
* less CPU usage.
|
||||
@@ -479,18 +491,6 @@ options
|
||||
*/
|
||||
#ulineservers = "stats.your.network"
|
||||
|
||||
/*
|
||||
* Default modes for mode lock, these are set on newly registered channels.
|
||||
*/
|
||||
mlock = "+nrt"
|
||||
|
||||
/*
|
||||
* Modes that will not be allowed to be locked. Oper only modes such as +O
|
||||
* are always restricted from regular users and are not affected by this.
|
||||
* Comment out for no restrictions.
|
||||
*/
|
||||
nomlock = "z"
|
||||
|
||||
/*
|
||||
* Modes to set on service bots when they join channels, comment this out for no modes
|
||||
*
|
||||
@@ -504,10 +504,22 @@ options
|
||||
retrywait = 60
|
||||
|
||||
/*
|
||||
* If set, Services will hide commands that users doesn't have the privileges to execute
|
||||
* If set, Services will hide commands that users don't have the privileges to execute
|
||||
* from HELP output.
|
||||
*/
|
||||
hideprivilegedcommands = no
|
||||
|
||||
/*
|
||||
* If set, Services do not allow ownership of nick names, only ownership of accounts.
|
||||
*/
|
||||
nonicknameownership = no
|
||||
|
||||
/* The regex engine to use, as provided by the regex modules.
|
||||
* Leave commented to disable regex matching.
|
||||
*
|
||||
* Note for this to work the regex module providing the regex engine must be loaded.
|
||||
*/
|
||||
regexengine = "regex/pcre"
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -539,7 +551,7 @@ include
|
||||
/*
|
||||
* [RECOMMENDED] Global
|
||||
*
|
||||
* Includes global.example.conf, which is necessary for Global funcionality.
|
||||
* Includes global.example.conf, which is necessary for Global functionality.
|
||||
*
|
||||
* Remove this block to disable Global.
|
||||
*/
|
||||
@@ -552,7 +564,7 @@ include
|
||||
/*
|
||||
* [OPTIONAL] HostServ
|
||||
*
|
||||
* Includes hostserv.example.conf, which is necessary for HostServ funcionality.
|
||||
* Includes hostserv.example.conf, which is necessary for HostServ functionality.
|
||||
*
|
||||
* Remove this block to disable HostServ.
|
||||
*/
|
||||
@@ -565,7 +577,7 @@ include
|
||||
/*
|
||||
* [OPTIONAL] MemoServ
|
||||
*
|
||||
* Includes memoserv.example.conf, which is necessary for MemoServ funcionality.
|
||||
* Includes memoserv.example.conf, which is necessary for MemoServ functionality.
|
||||
*
|
||||
* Remove this block to disable MemoServ.
|
||||
*/
|
||||
@@ -578,7 +590,7 @@ include
|
||||
/*
|
||||
* [OPTIONAL] NickServ
|
||||
*
|
||||
* Includes memoserv.example.conf, which is necessary for NickServ funcionality.
|
||||
* Includes memoserv.example.conf, which is necessary for NickServ functionality.
|
||||
*
|
||||
* Remove this block to disable NickServ.
|
||||
*/
|
||||
@@ -591,7 +603,7 @@ include
|
||||
/*
|
||||
* [RECOMMENDED] OperServ
|
||||
*
|
||||
* Includes operserv.example.conf, which is necessary for OperServ funcionality.
|
||||
* Includes operserv.example.conf, which is necessary for OperServ functionality.
|
||||
*
|
||||
* Remove this block to disable OperServ.
|
||||
*/
|
||||
@@ -617,7 +629,13 @@ log
|
||||
* - globops
|
||||
*/
|
||||
target = "services.log"
|
||||
/* Log to both services.log and the channel #services */
|
||||
|
||||
/* Log to both services.log and the channel #services
|
||||
*
|
||||
* Note that some older IRCds, such as Ratbox, require services to be in the
|
||||
* log channel to be able to message it. To do this, configure service:channels to
|
||||
* join your logging channel.
|
||||
*/
|
||||
#target = "services.log #services"
|
||||
|
||||
/*
|
||||
@@ -634,12 +652,6 @@ log
|
||||
*/
|
||||
logage = 7
|
||||
|
||||
/*
|
||||
* Enable to have the core services clients join and stay in the log channel(s) when logging.
|
||||
* Note: on some IRCds this is not optional, and is enforced on.
|
||||
*/
|
||||
inhabitlogchannel = yes
|
||||
|
||||
/*
|
||||
* What types of log messages should be logged by this block. There are nine general categories:
|
||||
*
|
||||
@@ -662,13 +674,13 @@ log
|
||||
* pesudo-serv/commandname (eg, operserv/akill, chanserv/set)
|
||||
*
|
||||
* Valid server options are:
|
||||
* connect, quit, sync
|
||||
* connect, quit, sync, squit
|
||||
*
|
||||
* Valid channel options are:
|
||||
* create, destroy, join, part, kick, leave, mode
|
||||
*
|
||||
* Valid user options are:
|
||||
* connect, disconnect, quit, nick, ident, host, mode, maxusers
|
||||
* connect, disconnect, quit, nick, ident, host, mode, maxusers, oper
|
||||
*
|
||||
* Rawio and debug are simple yes/no answers, there are no types for them.
|
||||
*
|
||||
@@ -691,7 +703,10 @@ log
|
||||
log
|
||||
{
|
||||
target = "globops"
|
||||
admin = "global/* operserv/mode operserv/kick operserv/akill operserv/s*line operserv/noop operserv/jupe */forbid nickserv/getpass */drop"
|
||||
admin = "global/* operserv/mode operserv/kick operserv/akill operserv/s*line operserv/noop operserv/jupe operserv/oline operserv/set operserv/svsnick nickserv/getpass */drop"
|
||||
servers = "squit"
|
||||
users = "oper"
|
||||
other = "expire/* bados akill/*"
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -703,7 +718,7 @@ log
|
||||
* This block is recommended, as without it you will be unable to access most oper commands.
|
||||
* It replaces the old ServicesRoot directive amongst others.
|
||||
*
|
||||
* The command names below are defaults and are configured in commands.conf. If you configure
|
||||
* The command names below are defaults and are configured in the *serv.conf's. If you configure
|
||||
* additional commands with permissions, such as commands from third party modules, the permissions
|
||||
* must be included in the opertype block before the command can be used.
|
||||
*
|
||||
@@ -712,10 +727,11 @@ log
|
||||
* chanserv/access/modify - Can modify channel access and akick lists
|
||||
* chanserv/auspex - Can see any information with /chanserv info
|
||||
* chanserv/no-register-limit - May register an unlimited number of channels and nicknames
|
||||
* chanserv/set - Can modify the settings of any channel (incl. changing of the owner and password!)
|
||||
* chanserv/set - Can modify the settings of any channel (incl. changing of the owner!)
|
||||
* memoserv/info - Can see any information with /memoserv info
|
||||
* memoserv/set-limit - Can set the limit of max stored memos on any user and channel
|
||||
* memoserv/no-limit - Can send memos through limits and throttles
|
||||
* nickserv/access - Can modify other users access list
|
||||
* nickserv/auspex - Can see any information with /nickserv info
|
||||
* nickserv/confirm - Can confirm other users nicknames
|
||||
* nickserv/drop - Can drop other users nicks
|
||||
@@ -724,11 +740,11 @@ log
|
||||
* botserv/bot/del botserv/bot/add botserv/bot/change botserv/assign/private
|
||||
* botserv/botlist botserv/set/private botserv/set/nobot
|
||||
*
|
||||
* chanserv/access/list chanserv/drop chanserv/getkey chanserv/mode
|
||||
* chanserv/list chanserv/suspend chanserv/topic chanserv/status
|
||||
* chanserv/access/list chanserv/drop chanserv/getkey chanserv/invite
|
||||
* chanserv/list chanserv/suspend chanserv/topic chanserv/clearusers
|
||||
*
|
||||
* chanserv/saset/bantype chanserv/saset/description chanserv/saset/email chanserv/saset/entrymsg
|
||||
* chanserv/saset/founder chanserv/saset/keeptopic chanserv/saset/opnotice chanserv/saset/restricted
|
||||
* chanserv/saset/bantype chanserv/saset/description chanserv/saset/email
|
||||
* chanserv/saset/founder chanserv/saset/keeptopic chanserv/saset/restricted
|
||||
* chanserv/saset/peace chanserv/saset/persist chanserv/saset/private
|
||||
* chanserv/saset/secure chanserv/saset/securefounder chanserv/saset/secureops
|
||||
* chanserv/saset/signkick chanserv/saset/successor chanserv/saset/topiclock
|
||||
@@ -737,7 +753,7 @@ log
|
||||
* memoserv/sendall memoserv/staff
|
||||
*
|
||||
* nickserv/getpass nickserv/sendpass nickserv/getemail nickserv/suspend
|
||||
* nickserv/resetpass
|
||||
* nickserv/resetpass nickserv/release nickserv/list
|
||||
*
|
||||
* nickserv/saset/autoop nickserv/saset/email nickserv/saset/greet
|
||||
* nickserv/saset/icq nickserv/saset/kill nickserv/saset/language nickserv/saset/message
|
||||
@@ -782,7 +798,7 @@ opertype
|
||||
inherits = "Helper, Another Helper"
|
||||
|
||||
/* What commands (see above) this opertype may use */
|
||||
commands = "chanserv/list chanserv/suspend chanserv/status chanserv/topic memoserv/staff nickserv/sendpass nickserv/resetpass nickserv/suspend operserv/mode operserv/chankill operserv/szline operserv/akill operserv/session operserv/modlist operserv/sqline operserv/oper operserv/kick operserv/ignore operserv/snline"
|
||||
commands = "chanserv/list chanserv/suspend chanserv/topic memoserv/staff nickserv/list nickserv/sendpass nickserv/resetpass nickserv/suspend operserv/mode operserv/chankill operserv/szline operserv/akill operserv/session operserv/modlist operserv/sqline operserv/oper operserv/kick operserv/ignore operserv/snline"
|
||||
|
||||
/* What privs (see above) this opertype has */
|
||||
privs = "chanserv/auspex chanserv/no-register-limit memoserv/* nickserv/auspex nickserv/confirm"
|
||||
@@ -836,11 +852,24 @@ oper
|
||||
/* The opertype this person will have */
|
||||
type = "Services Root"
|
||||
|
||||
/* If set, the user must be an oper on the IRCd to gain their Services
|
||||
* oper privileges.
|
||||
*/
|
||||
require_oper = yes
|
||||
|
||||
/* An optional password. If defined the user must login using /operserv login first */
|
||||
#password = "secret"
|
||||
|
||||
/* An optional SSL fingerprint. If defined is required to use this opertype. */
|
||||
#certfp = "ed3383b3f7d74e89433ddaa4a6e5b2d7"
|
||||
|
||||
/* An optional list of user@host masks. If defined the user must be connected from one of them */
|
||||
#host = "*@*.anope.org ident@*"
|
||||
|
||||
/* An optional vhost to set on users who identify for this oper block.
|
||||
* This will override HostServ vhosts, and may not be available on all IRCds
|
||||
*/
|
||||
#vhost = "oper.mynet"
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -863,6 +892,10 @@ oper
|
||||
* This section contains settings related to the use of e-mail from Services.
|
||||
* If the usemail directive is set to yes, unless specified otherwise, all other
|
||||
* directives are required.
|
||||
*
|
||||
* NOTE: Users can find the IP of the machine services is running on by examining
|
||||
* mail headers. If you do not want your IP known, you should set up a mail relay
|
||||
* to strip the relevant headers.
|
||||
*/
|
||||
mail
|
||||
{
|
||||
@@ -924,6 +957,68 @@ mail
|
||||
* if you are using ESMTP or QMail to send out e-mails.
|
||||
*/
|
||||
#dontquoteaddresses = yes
|
||||
|
||||
/*
|
||||
* The subject and message of emails sent to users when they register accounts.
|
||||
*/
|
||||
registration_subject = "Nickname Registration for %n"
|
||||
registration_message = "Hi,
|
||||
|
||||
You have requested to register the nickname %n on %N.
|
||||
Please type \" /msg NickServ confirm %c \" to complete registration.
|
||||
|
||||
If you don't know why this mail was sent to you, please ignore it silently.
|
||||
%N administrators."
|
||||
|
||||
/*
|
||||
* The subject and message of emails sent to users when they request a new password.
|
||||
*/
|
||||
reset_subject = "Reset password request for %n"
|
||||
reset_message = "Hi,
|
||||
|
||||
You have requested to have the password for %n reset.
|
||||
To reset your password, type \" /msg NickServ CONFIRM %n %c \"
|
||||
|
||||
If you don't know why this mail was sent to you, please ignore it silently.
|
||||
|
||||
%N administrators."
|
||||
|
||||
/*
|
||||
* The subject and message of emails sent to users when they request SENDPASS.
|
||||
*/
|
||||
sendpass_subject = "Nickname password for %n"
|
||||
sendpass_message = "Hi,
|
||||
|
||||
You have requested to receive the password of nickname %n by e-mail.
|
||||
The password is %p. For security purposes, you should change it as soon as you receive this mail.
|
||||
|
||||
If you don't know why this mail was sent to you, please ignore it silently.
|
||||
|
||||
%N administrators."
|
||||
|
||||
/*
|
||||
* The subject and message of emails sent to users when they request a new email address.
|
||||
*/
|
||||
emailchange_subject = "Email confirmation"
|
||||
emailchange_message = "Hi,
|
||||
|
||||
You have requested to change your email address to %e.
|
||||
Please type \" /msg NickServ confirm %c \" to confirm this change.
|
||||
|
||||
If you don't know why this mail was sent to you, please ignore it silently.
|
||||
|
||||
%N administrators."
|
||||
|
||||
/*
|
||||
* The subject and message of emails sent to users when they recieve a new memo.
|
||||
*/
|
||||
memo_subject = "New memo"
|
||||
memo_message = "Hi %n
|
||||
You've just received a new memo from %s. This is memo number %d.
|
||||
|
||||
Memo text:
|
||||
|
||||
%t"
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -958,11 +1053,32 @@ dns
|
||||
*/
|
||||
|
||||
/*
|
||||
* db_plain
|
||||
* [DEPRECATED] db_old
|
||||
*
|
||||
* This is the default flatfile database format.
|
||||
* This is the old binary database format from late Anope 1.7.x, Anope 1.8.x, and
|
||||
* early Anope 1.9.x. This module only loads these databases, and will NOT save them.
|
||||
* You should only use this to upgrade old databases to a newer database format by loading
|
||||
* other database modules in addition to this one, which will be used when saving databases.
|
||||
*/
|
||||
module { name = "db_plain" }
|
||||
#module { name = "db_old" }
|
||||
db_old
|
||||
{
|
||||
/*
|
||||
* This is the encryption type used by the databases. This must be set correctly or
|
||||
* your passwords will not work. Valid options are: md5, oldmd5, sha1, and plain.
|
||||
*/
|
||||
#hash = "md5"
|
||||
}
|
||||
|
||||
/*
|
||||
* [DEPRECATED] db_plain
|
||||
*
|
||||
* This is the flatfile database format from Anope-1.9.2 to Anope-1.9.5.
|
||||
* To convert from this format, load both this and db_flatfile. Be sure to name db_flatfile's
|
||||
* target database to something else. Start Anope then shut down so the new database will be written.
|
||||
* Then unload this and restart Anope, loading from the new database.
|
||||
*/
|
||||
#module { name = "db_plain" }
|
||||
db_plain
|
||||
{
|
||||
/*
|
||||
@@ -972,25 +1088,54 @@ db_plain
|
||||
}
|
||||
|
||||
/*
|
||||
* db_mysql and db_mysql_live
|
||||
* db_flatfile
|
||||
*
|
||||
* Enables (live) MySQL support.
|
||||
*
|
||||
* The db_mysql_live module is an extension to db_mysql, and should only be used if
|
||||
* db_mysql is being used. This module pulls data in real time from SQL as it is
|
||||
* requested by the core as a result of someone executing commands.
|
||||
*
|
||||
* This effectively allows you to edit your database and have it be immediately
|
||||
* reflected back in Anope.
|
||||
*
|
||||
* At this time db_mysql_live only supports pulling data in real time from the three
|
||||
* main tables: anope_cs_info, anope_ns_alias, and anope_ns_core.
|
||||
*
|
||||
* db_mysql provides the command operserv/sqlsync, which is used for importing other database
|
||||
* methods into MySQL.
|
||||
* This is the default flatfile database format.
|
||||
*/
|
||||
#module { name = "db_mysql" }
|
||||
#module { name = "db_mysql_live" }
|
||||
module { name = "db_flatfile" }
|
||||
db_flatfile
|
||||
{
|
||||
/*
|
||||
* The database name db_flatfile should use
|
||||
*/
|
||||
database = "anope.db"
|
||||
}
|
||||
|
||||
/*
|
||||
* db_sql
|
||||
*
|
||||
* This module allows saving and loading databases using one of the SQL engines.
|
||||
* This module loads the databases once on startup, then incrementally updates
|
||||
* objects in the database as they are changed within Anope in real time. Changes
|
||||
* to the SQL tables not done by Anope will have no effect and will be overwritten.
|
||||
*
|
||||
*/
|
||||
#module { name = "db_sql" }
|
||||
|
||||
/*
|
||||
* db_sql_live
|
||||
*
|
||||
* This module allows saving and loading databases using one of the SQL engines.
|
||||
* This module reads and writes to SQL in real time. Changes to the SQL tables
|
||||
* will be immediately reflected into Anope. This module should not be loaded
|
||||
* in conjunction with db_sql.
|
||||
*/
|
||||
#module { name = "db_sql_live" }
|
||||
|
||||
db_sql
|
||||
{
|
||||
/*
|
||||
* The SQL service db_sql(_live) should use, these are configured in modules.conf.
|
||||
* For MySQL, this should probably be mysql/main.
|
||||
*/
|
||||
engine = "sqlite/main"
|
||||
|
||||
/*
|
||||
* An optional prefix to prepended to the name of each created table.
|
||||
* Do not use the same prefix for other programs.
|
||||
*/
|
||||
#prefix = "anope_db_"
|
||||
}
|
||||
|
||||
/*
|
||||
* [REQUIRED] Encryption modules.
|
||||
@@ -1040,7 +1185,17 @@ module { name = "enc_md5" }
|
||||
/* Extra (optional) modules */
|
||||
include
|
||||
{
|
||||
type = "file"
|
||||
name = "modules.example.conf"
|
||||
type = "file"
|
||||
name = "modules.example.conf"
|
||||
}
|
||||
|
||||
/*
|
||||
* Chanstats Modules
|
||||
* Requires a MySQL Database
|
||||
*/
|
||||
|
||||
#include
|
||||
#{
|
||||
# type = "file"
|
||||
# name = "chanstats.example.conf"
|
||||
#}
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
|
||||
/*
|
||||
* First, create the service.
|
||||
* Note that an easy way to rename this service is to define{} the client name to something else.
|
||||
*/
|
||||
service
|
||||
{
|
||||
@@ -39,6 +40,15 @@ service
|
||||
* unable to do certain things if this option is enabled.
|
||||
*/
|
||||
#modes = "+o"
|
||||
|
||||
/*
|
||||
* An optional comma separated list of channels this service should join. Outside
|
||||
* of log channels this is not very useful, as the service will just idle in the
|
||||
* specified channels, and will not accept any types of commands.
|
||||
*
|
||||
* Prefixes may be given to the channels in the form of mode character or prefix symbol.
|
||||
*/
|
||||
#channels = "@#services,#mychan"
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -46,7 +56,7 @@ service
|
||||
*
|
||||
* Provides essential functionality for Global.
|
||||
*/
|
||||
module { name = "gl_main" }
|
||||
module { name = "global" }
|
||||
|
||||
/*
|
||||
* Configuration for Global provided by gl_main.
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
|
||||
/*
|
||||
* First, create the service.
|
||||
* Note that an easy way to rename this service is to define{} the client name to something else.
|
||||
*/
|
||||
service
|
||||
{
|
||||
@@ -39,6 +40,15 @@ service
|
||||
* unable to do certain things if this option is enabled.
|
||||
*/
|
||||
#modes = "+o"
|
||||
|
||||
/*
|
||||
* An optional comma separated list of channels this service should join. Outside
|
||||
* of log channels this is not very useful, as the service will just idle in the
|
||||
* specified channels, and will not accept any types of commands.
|
||||
*
|
||||
* Prefixes may be given to the channels in the form of mode character or prefix symbol.
|
||||
*/
|
||||
#channels = "@#services,#mychan"
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -46,7 +56,7 @@ service
|
||||
*
|
||||
* Provides essential functionality for HostServ.
|
||||
*/
|
||||
module { name = "hs_main" }
|
||||
module { name = "hostserv" }
|
||||
|
||||
/*
|
||||
* Configuration for HostServ provided by hs_main.
|
||||
@@ -57,6 +67,34 @@ hostserv
|
||||
* The name of the client that should be HostServ.
|
||||
*/
|
||||
name = "HostServ"
|
||||
|
||||
/*
|
||||
* The characters allowed in a vhost. Changing this is not recommended unless
|
||||
* you know for sure your IRCd supports whatever characters you are wanting to use.
|
||||
* Telling services to set a vhost containing characters your IRCd disallows could
|
||||
* potentially break the IRCd and/or Services. Note these are 1 byte characters, so
|
||||
* UTF-8 characters will not work.
|
||||
*
|
||||
* It is recommended you DON'T change this.
|
||||
*/
|
||||
vhost_chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.-"
|
||||
|
||||
/*
|
||||
* If set, allows vhosts to not contain dots (.).
|
||||
* Newer IRCds generally do not have a problem with this, but the same warning as
|
||||
* vhost_chars applies.
|
||||
*
|
||||
* It is recommended you DON'T change this.
|
||||
*/
|
||||
allow_undotted_vhosts = false
|
||||
|
||||
/*
|
||||
* The characters that are not allowed to be at the very beginning or very ending
|
||||
* of a vhost. The same warning as vhost_chars applies.
|
||||
*
|
||||
* It is recommended you DON'T change this.
|
||||
*/
|
||||
disallow_start_or_end = ".-"
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
|
||||
/*
|
||||
* First, create the service.
|
||||
* Note that an easy way to rename this service is to define{} the client name to something else.
|
||||
*/
|
||||
service
|
||||
{
|
||||
@@ -39,6 +40,15 @@ service
|
||||
* unable to do certain things if this option is enabled.
|
||||
*/
|
||||
#modes = "+o"
|
||||
|
||||
/*
|
||||
* An optional comma separated list of channels this service should join. Outside
|
||||
* of log channels this is not very useful, as the service will just idle in the
|
||||
* specified channels, and will not accept any types of commands.
|
||||
*
|
||||
* Prefixes may be given to the channels in the form of mode character or prefix symbol.
|
||||
*/
|
||||
#channels = "@#services,#mychan"
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -46,7 +56,7 @@ service
|
||||
*
|
||||
* Provides essential functionality for MemoServ.
|
||||
*/
|
||||
module { name = "ms_main" }
|
||||
module { name = "memoserv" }
|
||||
|
||||
/*
|
||||
* Configuration for MemoServ provided by ms_main.
|
||||
@@ -197,7 +207,7 @@ module { name = "ms_send" }
|
||||
command { service = "MemoServ"; name = "SEND"; command = "memoserv/send"; }
|
||||
|
||||
/*
|
||||
* ms_sendlal
|
||||
* ms_sendall
|
||||
*
|
||||
* Provides the command memoserv/sendall
|
||||
*
|
||||
|
||||
+226
-5
@@ -91,6 +91,38 @@ m_helpchan
|
||||
helpchannel = "#help"
|
||||
}
|
||||
|
||||
/*
|
||||
* m_httpd
|
||||
*
|
||||
* Allows services to serve web pages. By itself, this module does nothing useful.
|
||||
*
|
||||
* Note that using this will allow users to get the IP of your services.
|
||||
* To prevent this we recommend using a reverse proxy or a tunnel.
|
||||
*/
|
||||
#module { name = "m_httpd" }
|
||||
httpd
|
||||
{
|
||||
/* Name of this service */
|
||||
name = "httpd/main"
|
||||
|
||||
/* IP to listen on */
|
||||
ip = "0.0.0.0"
|
||||
/* Port to listen on */
|
||||
port = 8080
|
||||
/* Time before connections to this server are timed out */
|
||||
timeout = 30
|
||||
|
||||
/* If you are using a reverse proxy that sends one of the
|
||||
* extforward_headers set below, set this to its IP.
|
||||
* This allows services to obtain the real IP of users by
|
||||
* reading the forwarded-for HTTP header.
|
||||
*/
|
||||
#extforward_ip = "192.168.0.255"
|
||||
|
||||
/* The header to look for. These probably work as is. */
|
||||
extforward_header = "X-Forwarded-For Forwarded-For"
|
||||
}
|
||||
|
||||
/*
|
||||
* m_ldap
|
||||
*
|
||||
@@ -101,6 +133,10 @@ ldap
|
||||
{
|
||||
server = "ldap://127.0.0.1"
|
||||
port = 389
|
||||
|
||||
/*
|
||||
* Admin credentials used for performing searches and adding users.
|
||||
*/
|
||||
admin_binddn = "cn=Manager,dc=anope,dc=org"
|
||||
admin_password = "secret"
|
||||
}
|
||||
@@ -115,9 +151,16 @@ ldap
|
||||
m_ldap_authentication
|
||||
{
|
||||
/*
|
||||
* The distinguished name we should bind to when a user tries to identify.
|
||||
* The distinguished name used for searching for users's accounts.
|
||||
*/
|
||||
binddn = "ou=users,dc=anope,dc=org"
|
||||
basedn = "ou=users,dc=anope,dc=org"
|
||||
|
||||
/*
|
||||
* The search filter used to look up users's accounts.
|
||||
* %account is replaced with the user's account
|
||||
* %object_class is replaced with the object_class configured below.
|
||||
*/
|
||||
search_filter = "(&(uid=%account)(objectClass=%object_class))"
|
||||
|
||||
/*
|
||||
* The object class used by LDAP to store user account information.
|
||||
@@ -197,13 +240,13 @@ m_ldap_oper
|
||||
/*
|
||||
* m_mysql
|
||||
*
|
||||
* This module allows other modules (db_mysql/db_mysql_live) to use MySQL.
|
||||
* Be sure you have imported the table schema with mydbgen before
|
||||
* trying to use MySQL
|
||||
* This module allows other modules to use MySQL.
|
||||
*/
|
||||
#module { name = "m_mysql" }
|
||||
mysql
|
||||
{
|
||||
/* The name of this service */
|
||||
name = "mysql/main"
|
||||
database = "anope"
|
||||
server = "127.0.0.1"
|
||||
username = "anope"
|
||||
@@ -211,12 +254,167 @@ mysql
|
||||
port = 3306
|
||||
}
|
||||
|
||||
/*
|
||||
* m_proxyscan
|
||||
*
|
||||
* This module allows you to scan connecting clients for open proxies.
|
||||
* Note that using this will allow users to get the IP of your services.
|
||||
*
|
||||
* Currently the two supported proxy types are HTTP and SOCKS5.
|
||||
*
|
||||
* The proxy scanner works by attempting to connect to clients when they
|
||||
* connect to the network, and if they have a proxy running instruct it to connect
|
||||
* back to services. If services are able to connect through the proxy to itself
|
||||
* then it knows it is an insecure proxy, and will ban it.
|
||||
*/
|
||||
#module { name = "m_proxyscan" }
|
||||
m_proxyscan
|
||||
{
|
||||
/*
|
||||
* The target IP services tells the proxy to connect back to. This must be a publicly
|
||||
* avaiable IP that remote proxies can connect to.
|
||||
*/
|
||||
#target_ip = "127.0.0.1"
|
||||
|
||||
/*
|
||||
* The port services tells the proxy to connect to.
|
||||
*/
|
||||
target_port = 7226
|
||||
|
||||
/*
|
||||
* The listen IP services listen on for incoming connections from suspected proxies.
|
||||
* This probably will be the same as target_ip, but may not be if you are behind a firewall (NAT).
|
||||
*/
|
||||
#listen_ip = "127.0.0.1"
|
||||
|
||||
/*
|
||||
* The port services should listen on for incoming connections from suspected proxies.
|
||||
* This most likely will be the same as target_port.
|
||||
*/
|
||||
listen_port = 7226
|
||||
|
||||
/*
|
||||
* An optional notice sent to clients upon connect.
|
||||
*/
|
||||
#connect_notice = "We will now scan your host for insecure proxies. If you do not consent to this scan please disconnect immediately"
|
||||
|
||||
/*
|
||||
* Who the notice should be sent from.
|
||||
*/
|
||||
#connect_source = "OperServ"
|
||||
|
||||
/*
|
||||
* If set, OperServ will add infected clients to the akill list. Without it, OperServ simply sends
|
||||
* a timed G/K-line to the IRCd and forgets about it. Can be useful if your akill list is being fill up by bots.
|
||||
*/
|
||||
add_to_akill = yes
|
||||
|
||||
/*
|
||||
* How long before connections should be timed out.
|
||||
*/
|
||||
timeout = 5
|
||||
}
|
||||
|
||||
/*
|
||||
* A proxyscan block (must have m_proxyscan loaded).
|
||||
* You may have multiple proxyscan blocks.
|
||||
*/
|
||||
proxyscan
|
||||
{
|
||||
/* The type of proxy to check for. A comma separated list is allowed */
|
||||
type = "HTTP"
|
||||
|
||||
/* The ports to check */
|
||||
port = "80,8080"
|
||||
|
||||
/* How long to set the ban for */
|
||||
time = 4h
|
||||
|
||||
/*
|
||||
* The reason to ban the user for.
|
||||
* %h is replaced with the type of proxy found.
|
||||
* %i is replaced with the IP of proxy found.
|
||||
* %p is replaced with the port.
|
||||
*/
|
||||
reason = "You have an open proxy running on your host (%t:%i:%p)"
|
||||
}
|
||||
|
||||
/*
|
||||
* m_sqlite
|
||||
*
|
||||
* This module allows other modules to use SQLite.
|
||||
*/
|
||||
#module { name = "m_sqlite" }
|
||||
sqlite
|
||||
{
|
||||
/* The name of this service */
|
||||
name = "sqlite/main"
|
||||
/* The database name, it will be created if it does not exist. */
|
||||
database = "anope.db"
|
||||
}
|
||||
|
||||
/*
|
||||
* m_regex_pcre
|
||||
*
|
||||
* Provides the regex engine regex/pcre, which uses the Perl Compatible Regular Expressions library.
|
||||
*/
|
||||
module { name = "m_regex_pcre" }
|
||||
|
||||
/*
|
||||
* m_regex_posix
|
||||
*
|
||||
* Provides the regex engine regex/posix, which uses the POSIX compliant regular expressions.
|
||||
* This is likely the only regex module you will not need extra libraries for.
|
||||
*/
|
||||
#module { name = "m_regex_posix" }
|
||||
|
||||
/*
|
||||
* m_regex_tre
|
||||
*
|
||||
* Provides the regex engine regex/tre, which uses the TRE regex library.
|
||||
*/
|
||||
#module { name = "m_regex_tre" }
|
||||
|
||||
/*
|
||||
* m_rewrite
|
||||
*
|
||||
* Allows rewriting commands sent to clients.
|
||||
*/
|
||||
#module { name = "m_rewrite" }
|
||||
rewrite
|
||||
{
|
||||
/* The client to apply this rewrite to. */
|
||||
client = "ChanServ"
|
||||
|
||||
/* Source message to match. A $ can be used to match anything. */
|
||||
source_message = "CLEAR $ USERS"
|
||||
|
||||
/*
|
||||
* Message to rewrite the source message to. A $ followed by a number, eg $0, gets
|
||||
* replaced by the number-th word from the source_message, starting from 0.
|
||||
*/
|
||||
target_message = "CLEARUSERS $1"
|
||||
}
|
||||
|
||||
/*
|
||||
* m_ssl
|
||||
*
|
||||
* This module uses SSL to connect to the uplink server(s)
|
||||
*/
|
||||
module { name = "m_ssl" }
|
||||
ssl
|
||||
{
|
||||
/*
|
||||
* An optional certificate and key for m_ssl to give to the uplink.
|
||||
*
|
||||
* You can generate your own certificate and key pair by using:
|
||||
*
|
||||
* openssl genrsa -out anope.key 2048
|
||||
* openssl req -new -x509 -key anope.key -out anope.crt -days 1095
|
||||
*/
|
||||
cert = "data/anope.crt"
|
||||
key = "data/anope.key"
|
||||
}
|
||||
|
||||
/*
|
||||
* m_statusupdate
|
||||
@@ -274,3 +472,26 @@ ns_maxemail
|
||||
#maxemails = 1
|
||||
}
|
||||
|
||||
/*
|
||||
* webcpanel
|
||||
*
|
||||
* This module creates a web configuration panel that allows users and operators to perform any task
|
||||
* as they could over IRC. If you are using the default configuration you should be able to access
|
||||
* this panel by visiting http://127.0.0.1:8080 in your web browser from the machine Anope is running on.
|
||||
*
|
||||
* This module requires m_httpd.
|
||||
*/
|
||||
#module { name = "webcpanel" }
|
||||
webcpanel
|
||||
{
|
||||
/* Web server to use */
|
||||
server = "httpd/main";
|
||||
|
||||
/* Template to use */
|
||||
template = "default";
|
||||
|
||||
/* Page title */
|
||||
title = "Anope IRC Services";
|
||||
}
|
||||
|
||||
|
||||
|
||||
+50
-22
@@ -4,6 +4,7 @@
|
||||
|
||||
/*
|
||||
* First, create the service.
|
||||
* Note that an easy way to rename this service is to define{} the client name to something else.
|
||||
*/
|
||||
service
|
||||
{
|
||||
@@ -39,6 +40,15 @@ service
|
||||
* unable to do certain things if this option is enabled.
|
||||
*/
|
||||
#modes = "+o"
|
||||
|
||||
/*
|
||||
* An optional comma separated list of channels this service should join. Outside
|
||||
* of log channels this is not very useful, as the service will just idle in the
|
||||
* specified channels, and will not accept any types of commands.
|
||||
*
|
||||
* Prefixes may be given to the channels in the form of mode character or prefix symbol.
|
||||
*/
|
||||
#channels = "@#services,#mychan"
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -46,7 +56,7 @@ service
|
||||
*
|
||||
* Provides essential functionality for NickServ.
|
||||
*/
|
||||
module { name = "ns_main" }
|
||||
module { name = "nickserv" }
|
||||
|
||||
/*
|
||||
* Configuration for NickServ provided by ns_main.
|
||||
@@ -72,9 +82,18 @@ nickserv
|
||||
confirmemailchanges = no
|
||||
|
||||
/*
|
||||
* Require an e-mail to be sent to the user before they can register their nick.
|
||||
* Registration confirmation setting. Set to "none" for no registration confirmation,
|
||||
* "mail" for email confirmation, and "admin" to have services operators manually confirm
|
||||
* every registration. Set to "disable" to completely disable all registrations.
|
||||
*/
|
||||
#emailregistration = yes
|
||||
registration = "none"
|
||||
|
||||
/*
|
||||
* A message sent to users on connect if they user an unregistered nick.
|
||||
*
|
||||
* This directive is optional.
|
||||
*/
|
||||
#unregistered_notice = "Your nickname is not registered. To register it use /nickserv register password email."
|
||||
|
||||
/*
|
||||
* The default options for newly registered nicks. Note that changing these options
|
||||
@@ -202,8 +221,8 @@ nickserv
|
||||
guestnickprefix = "Guest"
|
||||
|
||||
/*
|
||||
* Prevents the use of the DROP, FORBID, GETPASS, and SET PASSWORD commands by Services Admins
|
||||
* on other Services Admins or the Services Root(s).
|
||||
* Prevents the use of the ACCESS (excluding the LIST subcommand), DROP, FORBID, SUSPEND,
|
||||
* GETPASS and SET PASSWORD commands by services operators on other services operators.
|
||||
*
|
||||
* This directive is optional, but recommended.
|
||||
*/
|
||||
@@ -247,7 +266,7 @@ nickserv
|
||||
*
|
||||
* Additionally, you may provide a permission name that must be in the opertype of users executing the command.
|
||||
*
|
||||
* Sane defaults are provided below that do not need to be edited unless you wish to change the default behavior.
|
||||
* Sane defaults are provided below that do not need to be edited unless you wish to change the default behaviour.
|
||||
*/
|
||||
|
||||
/* Give it a help command */
|
||||
@@ -433,25 +452,33 @@ command { service = "NickServ"; name = "RESETPASS"; command = "nickserv/resetpas
|
||||
/*
|
||||
* ns_saset
|
||||
*
|
||||
* Provides commands nickserv/saset, nickserv/saset/display, and nickserv/saset/password.
|
||||
* Provides commands nickserv/saset, nickserv/saset/password.
|
||||
*
|
||||
* Used as a help wrapper for SASET commands, and used to force change users display name or password.
|
||||
* Used as a help wrapper for SASET commands, and used to force change users password.
|
||||
*/
|
||||
module { name = "ns_saset" }
|
||||
command { service = "NickServ"; name = "SASET"; command = "nickserv/saset"; }
|
||||
command { service = "NickServ"; name = "SASET DISPLAY"; command = "nickserv/saset/display"; }
|
||||
command { service = "NickServ"; name = "SASET PASSWORD"; command = "nickserv/saset/password"; }
|
||||
|
||||
/*
|
||||
* ns_saset_noexpire
|
||||
*
|
||||
* Provides the command nickserv/saset/noexpire.
|
||||
*
|
||||
* Used for configuring noexpire, which prevents nicks from expiring.
|
||||
*/
|
||||
module { name = "ns_saset_noexpire" }
|
||||
command { service = "NickServ"; name = "SASET NOEXPIRE"; command = "nickserv/saset/noexpire"; permission = "nickserv/saset/noexpire" }
|
||||
|
||||
/*
|
||||
* ns_set
|
||||
*
|
||||
* Provides the commands nickserv/set, nickserv/set/display, and nickserv/set/password.
|
||||
* Provides the commands nickserv/set, nickserv/set/password.
|
||||
*
|
||||
* Used as a help wrapper for SET commands, and used for users to change their display name or password.
|
||||
* Used as a help wrapper for SET commands, and used for users to change their password.
|
||||
*/
|
||||
module { name = "ns_set" }
|
||||
command { service = "NickServ"; name = "SET"; command = "nickserv/set"; }
|
||||
command { service = "NickServ"; name = "SET DISPLAY"; command = "nickserv/set/display"; }
|
||||
command { service = "NickServ"; name = "SET PASSWORD"; command = "nickserv/set/password"; }
|
||||
|
||||
/*
|
||||
@@ -465,6 +492,17 @@ module { name = "ns_set_autoop" }
|
||||
command { service = "NickServ"; name = "SET AUTOOP"; command = "nickserv/set/autoop"; }
|
||||
command { service = "NickServ"; name = "SASET AUTOOP"; command = "nickserv/saset/autoop"; permission = "nickserv/saset/autoop"; }
|
||||
|
||||
/*
|
||||
* ns_set_display
|
||||
*
|
||||
* Provides the commands nickserv/set/display and nickserv/saset/display.
|
||||
*
|
||||
* Used for setting users display names.
|
||||
*/
|
||||
module { name = "ns_set_display" }
|
||||
command { service = "NickServ"; name = "SET DISPLAY"; command = "nickserv/set/display"; }
|
||||
command { service = "NickServ"; name = "SASET DISPLAY"; command = "nickserv/saset/display"; permission = "nickserv/saset/display"; }
|
||||
|
||||
/*
|
||||
* ns_set_email
|
||||
*
|
||||
@@ -553,16 +591,6 @@ module { name = "ns_set_secure" }
|
||||
command { service = "NickServ"; name = "SET SECURE"; command = "nickserv/set/secure"; }
|
||||
command { service = "NickServ"; name = "SASET SECURE"; command = "nickserv/saset/secure"; permission = "nickserv/saset/secure"; }
|
||||
|
||||
/*
|
||||
* ns_saset_noexpire
|
||||
*
|
||||
* Provides the command nickserv/saset/noexpire.
|
||||
*
|
||||
* Used for configuring noexpire, which prevents nicks from expiring.
|
||||
*/
|
||||
module { name = "ns_saset_noexpire" }
|
||||
command { service = "NickServ"; name = "SASET NOEXPIRE"; command = "nickserv/saset/noexpire"; permission = "nickserv/saset/noexpire" }
|
||||
|
||||
/*
|
||||
* ns_sendpass
|
||||
*
|
||||
|
||||
+25
-26
@@ -4,6 +4,7 @@
|
||||
|
||||
/*
|
||||
* First, create the service.
|
||||
* Note that an easy way to rename this service is to define{} the client name to something else.
|
||||
*/
|
||||
service
|
||||
{
|
||||
@@ -39,6 +40,15 @@ service
|
||||
* unable to do certain things if this option is enabled.
|
||||
*/
|
||||
#modes = "+o"
|
||||
|
||||
/*
|
||||
* An optional comma separated list of channels this service should join. Outside
|
||||
* of log channels this is not very useful, as the service will just idle in the
|
||||
* specified channels, and will not accept any types of commands.
|
||||
*
|
||||
* Prefixes may be given to the channels in the form of mode character or prefix symbol.
|
||||
*/
|
||||
#channels = "@#services,#mychan"
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -46,7 +56,7 @@ service
|
||||
*
|
||||
* Provides essential functionality for OperServ.
|
||||
*/
|
||||
module { name = "os_main" }
|
||||
module { name = "operserv" }
|
||||
|
||||
/*
|
||||
* Configuration for OperServ provided by os_main.
|
||||
@@ -68,7 +78,7 @@ operserv
|
||||
|
||||
/*
|
||||
* These define the default expiration times for, respectively, AKILLs, CHANKILLs, SNLINEs,
|
||||
* SQLINEs, and SZLINEs.
|
||||
* and SQLINEs.
|
||||
*/
|
||||
autokillexpiry = 30d
|
||||
chankillexpiry = 30d
|
||||
@@ -101,22 +111,6 @@ operserv
|
||||
*/
|
||||
#killonsqline = yes
|
||||
|
||||
/*
|
||||
* Defines what actions should trigger notifications. The list must be separated by spaces.
|
||||
*
|
||||
* The notifications are:
|
||||
* - oper: A user has become an IRC operator
|
||||
* - bados: A non-IRCop attempts to use OperServ
|
||||
* - akillexpire: An AKILL has expired
|
||||
* - snlineexpire: An SNLINE has expired
|
||||
* - sqlineexpire: An SQLINE has expired
|
||||
* - szlineexpire: An SZLINE has expired
|
||||
* - exceptionexpire: A session exception has expired
|
||||
*
|
||||
* This directive is optional, if left blank, there will be no notifications.
|
||||
*/
|
||||
notifications = "oper"
|
||||
|
||||
/*
|
||||
* Enables session limiting. Session limiting prevents users from connecting more than a certain
|
||||
* number of times from the same host at the same time - thus preventing most types of cloning.
|
||||
@@ -125,8 +119,7 @@ operserv
|
||||
* should be noted that session limiting, along with a large exception list, can degrade Services'
|
||||
* performance.
|
||||
*
|
||||
* See the source and comments in sessions.c and the online help for more information about
|
||||
* session limiting.
|
||||
* See the online help for more information about session limiting.
|
||||
*
|
||||
* This directive is optional.
|
||||
*/
|
||||
@@ -198,6 +191,12 @@ operserv
|
||||
*/
|
||||
addakiller = yes
|
||||
|
||||
/*
|
||||
* Adds akill IDs to akills. Akill IDs are given to users in their ban reason and can be used to easily view,
|
||||
* modify, or remove an akill from the ID.
|
||||
*/
|
||||
akillids = yes
|
||||
|
||||
/*
|
||||
* If set, only IRC Operators will be permitted to use OperServ, regardless of module-based command
|
||||
* access restrictions.
|
||||
@@ -236,7 +235,7 @@ command { service = "OperServ"; name = "AKILL"; command = "operserv/akill"; perm
|
||||
*
|
||||
* Provides the command operserv/chankill.
|
||||
*
|
||||
* Used to akill uses from an entire channel.
|
||||
* Used to akill users from an entire channel.
|
||||
*/
|
||||
module { name = "os_chankill" }
|
||||
command { service = "OperServ"; name = "CHANKILL"; command = "operserv/chankill"; permission = "operserv/chankill"; }
|
||||
@@ -422,12 +421,13 @@ command { service = "OperServ"; name = "KILL"; command = "operserv/kill"; permis
|
||||
/*
|
||||
* os_login
|
||||
*
|
||||
* Provides the command operserv/login.
|
||||
* Provides the commands operserv/login and operserv/logout.
|
||||
*
|
||||
* Used to login to OperServ, only required if your oper block requires this.
|
||||
*/
|
||||
module { name = "os_login" }
|
||||
command { service = "OperServ"; name = "LOGIN"; command = "operserv/login"; }
|
||||
command { service = "OperServ"; name = "LOGOUT"; command = "operserv/logout"; }
|
||||
|
||||
/*
|
||||
* os_mode
|
||||
@@ -499,7 +499,7 @@ command { service = "OperServ"; name = "OLINE"; command = "operserv/oline"; perm
|
||||
/*
|
||||
* os_oper
|
||||
*
|
||||
* Provides the command opersev/oper.
|
||||
* Provides the command operserv/oper.
|
||||
*
|
||||
* Used to configure opers and show information about opertypes.
|
||||
*/
|
||||
@@ -532,7 +532,7 @@ command { service = "OperServ"; name = "SESSION"; command = "operserv/session";
|
||||
*
|
||||
* Provides the command operserv/set.
|
||||
*
|
||||
* Used to set various settinsg such as superadmin, debug mode, etc.
|
||||
* Used to set various settings such as superadmin, debug mode, etc.
|
||||
*/
|
||||
module { name = "os_set" }
|
||||
command { service = "OperServ"; name = "SET"; command = "operserv/set"; permission = "operserv/set"; }
|
||||
@@ -572,14 +572,13 @@ command { service = "OperServ"; name = "SVSNICK"; command = "operserv/svsnick";
|
||||
/*
|
||||
* os_sxline
|
||||
*
|
||||
* Provides the operserv/snline, operserv/sqline, and operserv/szline commands.
|
||||
* Provides the operserv/snline and operserv/sqline commands.
|
||||
*
|
||||
* Used to ban different things such as realnames, nicknames, and IPs.
|
||||
*/
|
||||
module { name = "os_sxline" }
|
||||
command { service = "OperServ"; name = "SNLINE"; command = "operserv/snline"; permission = "operserv/snline"; }
|
||||
command { service = "OperServ"; name = "SQLINE"; command = "operserv/sqline"; permission = "operserv/sqline"; }
|
||||
command { service = "OperServ"; name = "SZLINE"; command = "operserv/szline"; permission = "operserv/szline"; }
|
||||
|
||||
/*
|
||||
* os_update
|
||||
|
||||
-426
@@ -1,426 +0,0 @@
|
||||
-- phpMyAdmin SQL Dump
|
||||
-- version 3.3.5
|
||||
-- http://www.phpmyadmin.net
|
||||
--
|
||||
-- Host: localhost
|
||||
-- Generation Time: Aug 07, 2011 at 03:53 PM
|
||||
-- Server version: 5.1.50
|
||||
-- PHP Version: 5.3.6-pl0-gentoo
|
||||
|
||||
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
|
||||
|
||||
--
|
||||
-- Database: `anope`
|
||||
--
|
||||
|
||||
-- --------------------------------------------------------
|
||||
|
||||
--
|
||||
-- Table structure for table `anope_bs_badwords`
|
||||
--
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `anope_bs_badwords` (
|
||||
`channel` varchar(255) NOT NULL DEFAULT '',
|
||||
`word` varchar(255) NOT NULL,
|
||||
`type` varchar(50) NOT NULL,
|
||||
UNIQUE KEY `channel` (`channel`,`word`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
-- --------------------------------------------------------
|
||||
|
||||
--
|
||||
-- Table structure for table `anope_bs_core`
|
||||
--
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `anope_bs_core` (
|
||||
`nick` varchar(255) NOT NULL DEFAULT '',
|
||||
`user` varchar(255) NOT NULL DEFAULT '',
|
||||
`host` text NOT NULL,
|
||||
`rname` text NOT NULL,
|
||||
`flags` text NOT NULL,
|
||||
`created` int(10) unsigned NOT NULL DEFAULT '0',
|
||||
`chancount` int(11) NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`nick`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
-- --------------------------------------------------------
|
||||
|
||||
--
|
||||
-- Table structure for table `anope_bs_info_metadata`
|
||||
--
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `anope_bs_info_metadata` (
|
||||
`botname` varchar(255) NOT NULL DEFAULT '',
|
||||
`name` varchar(255) NOT NULL DEFAULT '',
|
||||
`value` text NOT NULL,
|
||||
KEY `FK_anope_bs_info_metadata_botname` (`botname`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
-- --------------------------------------------------------
|
||||
|
||||
--
|
||||
-- Table structure for table `anope_cs_access`
|
||||
--
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `anope_cs_access` (
|
||||
`provider` varchar(255) NOT NULL DEFAULT '',
|
||||
`data` varchar(255) NOT NULL DEFAULT '',
|
||||
`mask` varchar(255) NOT NULL DEFAULT '',
|
||||
`channel` varchar(255) NOT NULL DEFAULT '',
|
||||
`last_seen` int(10) unsigned NOT NULL DEFAULT '0',
|
||||
`creator` varchar(255) NOT NULL DEFAULT '',
|
||||
`created` int(11) unsigned NOT NULL DEFAULT '0',
|
||||
UNIQUE KEY `channel` (`channel`,`mask`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
-- --------------------------------------------------------
|
||||
|
||||
--
|
||||
-- Table structure for table `anope_cs_akick`
|
||||
--
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `anope_cs_akick` (
|
||||
`channel` varchar(255) NOT NULL DEFAULT '',
|
||||
`flags` varchar(255) NOT NULL DEFAULT '',
|
||||
`mask` varchar(255) NOT NULL DEFAULT '',
|
||||
`reason` text NOT NULL,
|
||||
`creator` varchar(255) NOT NULL DEFAULT '',
|
||||
`created` int(10) unsigned NOT NULL DEFAULT '0',
|
||||
`last_used` int(10) unsigned NOT NULL DEFAULT '0',
|
||||
UNIQUE KEY `channel` (`channel`,`mask`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
-- --------------------------------------------------------
|
||||
|
||||
--
|
||||
-- Table structure for table `anope_cs_info`
|
||||
--
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `anope_cs_info` (
|
||||
`name` varchar(255) NOT NULL DEFAULT '',
|
||||
`founder` text NOT NULL,
|
||||
`successor` text NOT NULL,
|
||||
`descr` text NOT NULL,
|
||||
`time_registered` int(10) unsigned NOT NULL DEFAULT '0',
|
||||
`last_used` int(10) unsigned NOT NULL DEFAULT '0',
|
||||
`last_topic` text NOT NULL,
|
||||
`last_topic_setter` text NOT NULL,
|
||||
`last_topic_time` int(10) unsigned NOT NULL DEFAULT '0',
|
||||
`flags` text NOT NULL,
|
||||
`bantype` smallint(6) NOT NULL DEFAULT '0',
|
||||
`memomax` smallint(5) unsigned NOT NULL DEFAULT '0',
|
||||
`botnick` varchar(255) NOT NULL DEFAULT '',
|
||||
`botflags` text NOT NULL,
|
||||
`capsmin` smallint(6) NOT NULL DEFAULT '0',
|
||||
`capspercent` smallint(6) NOT NULL DEFAULT '0',
|
||||
`floodlines` smallint(6) NOT NULL DEFAULT '0',
|
||||
`floodsecs` smallint(6) NOT NULL DEFAULT '0',
|
||||
`repeattimes` smallint(6) NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`name`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
-- --------------------------------------------------------
|
||||
|
||||
--
|
||||
-- Table structure for table `anope_cs_info_metadata`
|
||||
--
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `anope_cs_info_metadata` (
|
||||
`channel` varchar(255) NOT NULL DEFAULT '',
|
||||
`name` varchar(255) NOT NULL DEFAULT '',
|
||||
`value` text NOT NULL,
|
||||
KEY `FK_anope_cs_info_metadata_channel` (`channel`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
-- --------------------------------------------------------
|
||||
|
||||
--
|
||||
-- Table structure for table `anope_cs_levels`
|
||||
--
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `anope_cs_levels` (
|
||||
`channel` varchar(255) NOT NULL DEFAULT '',
|
||||
`position` int(11) NOT NULL DEFAULT '0',
|
||||
`level` int(11) NOT NULL DEFAULT '0',
|
||||
UNIQUE KEY `channel` (`channel`,`position`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
-- --------------------------------------------------------
|
||||
|
||||
--
|
||||
-- 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`
|
||||
--
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `anope_cs_ttb` (
|
||||
`channel` varchar(255) NOT NULL DEFAULT '',
|
||||
`ttb_id` int(11) NOT NULL DEFAULT '0',
|
||||
`value` int(11) NOT NULL DEFAULT '0',
|
||||
UNIQUE KEY `channel` (`channel`,`ttb_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
-- --------------------------------------------------------
|
||||
|
||||
--
|
||||
-- Table structure for table `anope_extra`
|
||||
--
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `anope_extra` (
|
||||
`data` text NOT NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
-- --------------------------------------------------------
|
||||
|
||||
--
|
||||
-- Table structure for table `anope_hs_core`
|
||||
--
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `anope_hs_core` (
|
||||
`nick` varchar(255) NOT NULL,
|
||||
`vident` varchar(64) NOT NULL,
|
||||
`vhost` varchar(255) NOT NULL,
|
||||
`creator` varchar(255) NOT NULL,
|
||||
`time` int(11) NOT NULL,
|
||||
KEY `FK_anope_hs_core_nick` (`nick`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
-- --------------------------------------------------------
|
||||
|
||||
--
|
||||
-- Table structure for table `anope_info`
|
||||
--
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `anope_info` (
|
||||
`version` int(11) DEFAULT NULL,
|
||||
`date` datetime DEFAULT NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
-- --------------------------------------------------------
|
||||
|
||||
--
|
||||
-- Table structure for table `anope_ms_info`
|
||||
--
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `anope_ms_info` (
|
||||
`receiver` varchar(255) NOT NULL,
|
||||
`flags` int(11) NOT NULL DEFAULT '0',
|
||||
`time` int(10) unsigned NOT NULL DEFAULT '0',
|
||||
`sender` text NOT NULL,
|
||||
`text` blob NOT NULL,
|
||||
`serv` enum('NICK','CHAN') NOT NULL DEFAULT 'NICK',
|
||||
KEY `FK_anope_ms_info_receiver` (`receiver`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
-- --------------------------------------------------------
|
||||
|
||||
--
|
||||
-- Table structure for table `anope_ns_access`
|
||||
--
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `anope_ns_access` (
|
||||
`display` varchar(255) NOT NULL DEFAULT '',
|
||||
`access` varchar(160) NOT NULL,
|
||||
KEY `FK_anope_ns_access_display` (`display`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
-- --------------------------------------------------------
|
||||
|
||||
--
|
||||
-- Table structure for table `anope_ns_alias`
|
||||
--
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `anope_ns_alias` (
|
||||
`nick` varchar(255) NOT NULL DEFAULT '',
|
||||
`last_quit` text NOT NULL,
|
||||
`last_realname` text NOT NULL,
|
||||
`last_usermask` text NOT NULL,
|
||||
`last_realhost` text NOT NULL,
|
||||
`time_registered` int(10) unsigned NOT NULL DEFAULT '0',
|
||||
`last_seen` int(10) unsigned NOT NULL DEFAULT '0',
|
||||
`flags` text NOT NULL,
|
||||
`display` varchar(255) NOT NULL DEFAULT '',
|
||||
PRIMARY KEY (`nick`),
|
||||
KEY `FK_anope_ns_alias_display` (`display`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
-- --------------------------------------------------------
|
||||
|
||||
--
|
||||
-- Table structure for table `anope_ns_alias_metadata`
|
||||
--
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `anope_ns_alias_metadata` (
|
||||
`nick` varchar(255) NOT NULL DEFAULT '',
|
||||
`name` varchar(255) NOT NULL DEFAULT '',
|
||||
`value` text NOT NULL,
|
||||
KEY `FK_anope_ns_alias_metadata_nick` (`nick`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
-- --------------------------------------------------------
|
||||
|
||||
--
|
||||
-- Table structure for table `anope_ns_core`
|
||||
--
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `anope_ns_core` (
|
||||
`display` varchar(255) NOT NULL DEFAULT '',
|
||||
`pass` text NOT NULL,
|
||||
`email` text NOT NULL,
|
||||
`greet` text NOT NULL,
|
||||
`flags` text NOT NULL,
|
||||
`language` varchar(5) NOT NULL DEFAULT '',
|
||||
`memomax` smallint(5) unsigned NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`display`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
-- --------------------------------------------------------
|
||||
|
||||
--
|
||||
-- Table structure for table `anope_ns_core_metadata`
|
||||
--
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `anope_ns_core_metadata` (
|
||||
`nick` varchar(255) NOT NULL DEFAULT '',
|
||||
`name` varchar(255) NOT NULL DEFAULT '',
|
||||
`value` text NOT NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
-- --------------------------------------------------------
|
||||
|
||||
--
|
||||
-- Table structure for table `anope_os_core`
|
||||
--
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `anope_os_core` (
|
||||
`maxusercnt` int(11) NOT NULL DEFAULT '0',
|
||||
`maxusertime` int(10) unsigned NOT NULL DEFAULT '0'
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
-- --------------------------------------------------------
|
||||
|
||||
--
|
||||
-- Table structure for table `anope_os_exceptions`
|
||||
--
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `anope_os_exceptions` (
|
||||
`mask` varchar(255) NOT NULL,
|
||||
`slimit` int(11) NOT NULL DEFAULT '0',
|
||||
`who` text NOT NULL,
|
||||
`reason` text NOT NULL,
|
||||
`time` int(10) unsigned NOT NULL DEFAULT '0',
|
||||
`expires` int(10) unsigned NOT NULL DEFAULT '0'
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
-- --------------------------------------------------------
|
||||
|
||||
--
|
||||
-- Table structure for table `anope_os_xlines`
|
||||
--
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `anope_os_xlines` (
|
||||
`type` varchar(1) NOT NULL,
|
||||
`mask` varchar(255) NOT NULL,
|
||||
`xby` text NOT NULL,
|
||||
`reason` text NOT NULL,
|
||||
`seton` int(10) unsigned NOT NULL DEFAULT '0',
|
||||
`expire` int(10) unsigned NOT NULL DEFAULT '0'
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
--
|
||||
-- Constraints for dumped tables
|
||||
--
|
||||
|
||||
--
|
||||
-- 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;
|
||||
|
||||
--
|
||||
-- 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;
|
||||
|
||||
--
|
||||
-- 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;
|
||||
|
||||
--
|
||||
-- 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;
|
||||
|
||||
--
|
||||
-- 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;
|
||||
|
||||
--
|
||||
-- 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;
|
||||
|
||||
--
|
||||
-- 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;
|
||||
|
||||
--
|
||||
-- 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;
|
||||
|
||||
--
|
||||
-- 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;
|
||||
|
||||
--
|
||||
-- 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;
|
||||
|
||||
--
|
||||
-- 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;
|
||||
|
||||
--
|
||||
-- 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;
|
||||
|
||||
+289
-1
@@ -1,3 +1,291 @@
|
||||
Revision 271d723 - Sun, 2 Sep 2012 08:31:11 -0400 - Update Changes
|
||||
Revision a0c4575 - Sun, 2 Sep 2012 08:31:04 -0400 - Regenerate language files
|
||||
Revision 1af64a9 - Sun, 2 Sep 2012 08:30:54 -0400 - Fix Windows
|
||||
Revision e3d5140 - Sat, 1 Sep 2012 18:54:51 -0400 - Added a web panel module + a default template
|
||||
Revision f81d011 - Tue, 28 Aug 2012 00:39:50 -0400 - Actually set xline's manager...
|
||||
Revision fde4289 - Thu, 9 Aug 2012 23:28:02 -0400 - Fixed db_old loading encrypted passwords from 1.8
|
||||
Revision f7bf2fa - Wed, 8 Aug 2012 17:09:34 -0400 - Put motd in conf/ not data/ and fixed the default values in the config
|
||||
Revision b894a56 - Wed, 8 Aug 2012 04:28:33 -0400 - Update pid and motd file paths
|
||||
Revision 48022c3 - Wed, 18 Jul 2012 16:52:14 -0400 - Warn about really big integer values in the config
|
||||
Revision 28aa981 - Sun, 1 Jul 2012 23:50:38 -0400 - Actually the core can't handle empty realnames, just ignore them
|
||||
Revision 2b8a09b - Sun, 1 Jul 2012 22:26:05 -0400 - Remove some unused code in inspircd20 protocol module & allow /chghost/ident/naming services clients
|
||||
Revision a12788e - Sun, 1 Jul 2012 22:26:05 -0400 - Don't crash on empty setnames on inspircd1.2
|
||||
Revision 9b5f6d3 - Sun, 1 Jul 2012 22:26:05 -0400 - Remove ExtensibleString everywhere
|
||||
Revision af24dc6 - Tue, 26 Jun 2012 16:21:24 +0100 - Removed old set xop references and cleared up some other stuff.
|
||||
Revision f27560c - Tue, 26 Jun 2012 02:01:01 +0100 - Merge branch '1.9' of ssh://anope.git.sf.net/gitroot/anope/anope into 1.9
|
||||
Revision 4b309b5 - Mon, 25 Jun 2012 20:51:08 -0400 - Fixed accidentally recursion in User::SendMessage from last commit
|
||||
Revision d8a99d6 - Fri, 22 Jun 2012 21:26:33 +0100 - Merge branch '1.9' of ssh://anope.git.sf.net/gitroot/anope/anope into 1.9
|
||||
Revision 2dec8e7 - Mon, 18 Jun 2012 05:04:30 -0400 - Allow userless command sources
|
||||
Revision ba53c7e - Sun, 17 Jun 2012 22:23:22 +0100 - Updated MODULES somewhat
|
||||
Revision 873d428 - Mon, 11 Jun 2012 15:44:48 -0400 - Split up bs_set
|
||||
Revision 3626fb2 - Wed, 6 Jun 2012 15:16:46 -0400 - Fixed fd leak in win32/pipe.cpp
|
||||
Revision a661098 - Mon, 4 Jun 2012 05:45:13 +0100 - Some more fantasy character help output
|
||||
Revision a4bf5ce - Mon, 4 Jun 2012 04:50:35 +0100 - minor help output changes, including some confusion in fantasy chars
|
||||
Revision 437944d - Fri, 1 Jun 2012 04:43:26 -0400 - Merge branch '1.9' of anope.git.sf.net:/gitroot/anope/anope into 1.9
|
||||
Revision db37b1c - Fri, 1 Jun 2012 07:37:34 +0200 - updated chanstats
|
||||
Revision 1e49e9b - Sat, 26 May 2012 02:36:02 -0400 - This should actually be LOG_TERMINAL, quitmsg isn't logged to terminal on shutdown
|
||||
Revision 2cbfbc9 - Sat, 26 May 2012 02:15:48 -0400 - Some access level fixes from Robby to more closely match the historic levels, and some code cleanup
|
||||
Revision 38d5f20 - Thu, 24 May 2012 21:54:15 -0400 - Added a ./Config option for using precompiled headers
|
||||
Revision 70fb590 - Wed, 23 May 2012 19:35:56 -0400 - Add support for inspircd2.0+s mlock, improved on Unreal's, and made server side mlock usage configurable
|
||||
Revision bf7d1a5 - Wed, 23 May 2012 15:09:41 -0400 - Fixed some problems found by Robby
|
||||
Revision 1f73e27 - Sun, 20 May 2012 04:14:26 -0400 - Updated help messages for ns_list, cs_list, cs_entrymsg, and cs_info. Also fixed logging for cs_entrymsg.
|
||||
Revision 699087b - Sun, 20 May 2012 03:57:22 -0400 - Fixed cs_entrymsg loading entries from the database
|
||||
Revision ccd2908 - Thu, 17 May 2012 03:57:19 -0400 - reinterpret_cast off of a virtual base does Bad Things
|
||||
Revision a883362 - Thu, 17 May 2012 02:03:22 -0400 - Fixed not always calling operator bool() in dynamic_reference, which would mess up service references and do weird things
|
||||
Revision ef88385 - Tue, 15 May 2012 17:19:50 -0400 - m_ldap_authentication: Removed the dependency on a specific binddn in favour of searching the tree for matching criteria and using the returned DN
|
||||
Revision 90b0283 - Tue, 15 May 2012 04:27:36 -0400 - Grab the DN for every LDAP query and send it in the result
|
||||
Revision 0a8d46b - Mon, 14 May 2012 22:30:03 -0400 - Fixed parsing FMODE on inspircd 1.1
|
||||
Revision a84226e - Fri, 11 May 2012 00:50:58 -0400 - Do not show help for set message if useprivmsg is disabled
|
||||
Revision 9370b06 - Thu, 10 May 2012 17:53:53 -0400 - Fixed crash on access del + valgrind errors
|
||||
Revision d5ffae0 - Wed, 9 May 2012 03:37:37 -0400 - Made ssl cert and keyfiles configurable
|
||||
Revision f895997 - Wed, 9 May 2012 03:11:57 +0100 - fixed paste error (failed awesomeness) in last commit.
|
||||
Revision a81b3aa - Wed, 9 May 2012 01:23:34 +0100 - Fixed saving backups
|
||||
Revision 820e4ed - Tue, 8 May 2012 18:04:49 -0400 - Fixed some 100% cpu bugs with the new SQL stuff, and fixed sqlite+db_sql_live
|
||||
Revision 25586f3 - Tue, 8 May 2012 02:01:44 -0400 - Allow services operators to release other user's nicks, and allow services operators to view the access list of other operators
|
||||
Revision b7149fc - Sun, 6 May 2012 21:44:11 -0400 - Merge branch '1.9' of anope.git.sf.net:/gitroot/anope/anope into 1.9
|
||||
Revision 675b113 - Sun, 6 May 2012 21:43:50 -0400 - Split up db/conf/lib/locale install directories, and allow alternate ones to be specified at runtime
|
||||
Revision c797987 - Sat, 5 May 2012 09:35:18 +0200 - Readding missing valid nick check to ns register/group removed in os_forbid commit
|
||||
Revision eb0e07d - Fri, 4 May 2012 16:03:02 -0400 - Use Unreal's MLOCK command if supported
|
||||
Revision 1b5805e - Sun, 29 Apr 2012 20:39:33 -0400 - Set quitmsg on ERROR
|
||||
Revision 42e652c - Sun, 29 Apr 2012 19:24:37 -0400 - Pull table schemas from SQL on startup so we can alter the schemas if we need to, fixed sqlite to work again
|
||||
Revision 62818ab - Sun, 29 Apr 2012 15:43:51 -0400 - Added options:casemap to chose how case insensitive strings are compared, using ascii, rfc1459, or a locale installed on the system
|
||||
Revision 4d9a96e - Fri, 27 Apr 2012 17:06:16 -0400 - Fixes to db_sql
|
||||
Revision e490a54 - Fri, 27 Apr 2012 16:05:49 -0400 - Process defines even before includes, fixes defining{} pseudoclient names to something else in their respective configurations
|
||||
Revision 5068483 - Fri, 27 Apr 2012 15:38:50 -0400 - Add db_sql:prefix allow prefixing all anope tables similarly, and changed db_sql to update the databases incrementally instead of one big flush
|
||||
Revision 83ee20f - Wed, 25 Apr 2012 19:02:09 -0400 - Clarify access denied messages caused by NSSecureAdmins
|
||||
Revision b08aa4e - Wed, 25 Apr 2012 18:49:53 -0400 - Check for os_sesion to exist before having defcon try and place session bans
|
||||
Revision 1081ecd - Wed, 25 Apr 2012 14:29:50 -0400 - Fixed non-debug build
|
||||
Revision 2370c16 - Tue, 24 Apr 2012 16:02:07 -0400 - Fixed build from the previous merge
|
||||
Revision 3d84dc9 - Mon, 23 Apr 2012 05:17:02 -0400 - Merge branch '1.9' of anope.git.sf.net:/gitroot/anope/anope into 1.9
|
||||
Revision 573e49a - Mon, 23 Apr 2012 05:08:26 -0400 - Reworked live SQL support yet again
|
||||
Revision 63c639e - Mon, 23 Apr 2012 05:07:06 -0400 - Fixed hashm checking in db_old and loading 1.9.1 databases
|
||||
Revision fc00406 - Sun, 22 Apr 2012 02:57:17 -0400 - Fixed ./services --version etc not getting printed when stdout is a file/pipe/not a tty
|
||||
Revision b752c3a - Fri, 13 Apr 2012 18:33:22 +0200 - fixed a bug in chanstats
|
||||
Revision 7372b45 - Sun, 8 Apr 2012 19:29:56 +0200 - fixed a compile error in m_sqlite
|
||||
Revision deb5196 - Sun, 8 Apr 2012 12:43:34 +0200 - Added Chanstats. It uses a new, improved database format and is not compatible with current phpdenora or magirc installations.
|
||||
Revision 9e1fda2 - Sun, 8 Apr 2012 12:30:48 +0200 - Modified the SQL API to allow unescaped parameters (useful for passing row names and NULL values)
|
||||
Revision 9d249ef - Fri, 6 Apr 2012 14:41:28 -0400 - Fixed unpacking questions from dns packets
|
||||
Revision e03b73e - Fri, 6 Apr 2012 15:36:49 +0200 - Revert changes made to line endings.
|
||||
Revision 6b473f2 - Fri, 6 Apr 2012 15:12:22 +0200 - Revert last commit cause guess what, I screwed things up
|
||||
Revision 05bb80c - Fri, 6 Apr 2012 14:35:34 +0200 - Fixed mail function causing some MTAs to sent blank messages
|
||||
Revision e6edc65 - Sun, 1 Apr 2012 20:50:46 +0200 - updated the german language file
|
||||
Revision cf3124c - Sun, 1 Apr 2012 20:50:04 +0200 - fixed some typos
|
||||
Revision 12a6a27 - Tue, 27 Mar 2012 19:14:55 -0400 - Merge branch '1.9' of anope.git.sf.net:/gitroot/anope/anope into 1.9
|
||||
Revision 31a0e67 - Tue, 27 Mar 2012 19:01:29 -0400 - Fixed unpacking multiple names from dns packets when one has multiple compression pointers. Currently this will just fail at unpacking the later name due to offsets being invalid. Also cleaned up the existing code and made unpacking error messages more helpful.
|
||||
Revision 8d0b4a1 - Thu, 22 Mar 2012 07:30:38 +0100 - added a missing error message when a module file does not exist. this fixes bug #1401. also moved some debug messages to debug level 2
|
||||
Revision 1b0ebca - Wed, 21 Mar 2012 22:20:18 +0100 - fixed bug #1399
|
||||
Revision 0d100ff - Wed, 21 Mar 2012 20:25:25 +0100 - fixed ns_ajoin
|
||||
Revision 88fd1da - Tue, 13 Mar 2012 21:07:10 -0400 - Fixed typos
|
||||
Revision a069347 - Tue, 13 Mar 2012 19:26:11 -0400 - Actually check if the nicks arent registered, oops
|
||||
Revision a26f4b9 - Tue, 13 Mar 2012 17:45:07 -0400 - Bug #1389 - readd RNG seed in the config and start DNS query ids off on a random number
|
||||
Revision 053d6a2 - Tue, 13 Mar 2012 17:18:11 -0400 - Add a nickserv:unregistered_notice config option to send a message to unregistered users on connect. Suggested by Cronus.
|
||||
Revision beae477 - Tue, 13 Mar 2012 16:58:14 -0400 - Bug #1382 - Save maxusercount and maxusertime
|
||||
Revision cff91a5 - Sun, 11 Mar 2012 21:21:47 -0400 - Made gch files depend on the header they were generated from
|
||||
Revision 92ed5d7 - Sun, 11 Mar 2012 16:44:44 -0400 - Fixed having multiple uplink blocks work right if the first uplink fails on startup
|
||||
Revision 7800375 - Sun, 11 Mar 2012 05:20:28 -0400 - Bug #1384 - Fixed spacing of connection log message if users have no vhost - patch from cbiedl
|
||||
Revision ab25815 - Mon, 5 Mar 2012 20:15:56 -0500 - Fixed backup databases having their names collide due to not separating month and day, #1383
|
||||
Revision 8e01043 - Mon, 5 Mar 2012 14:29:48 -0500 - Fixed bs_kick syntax error
|
||||
Revision b7a6d51 - Sun, 4 Mar 2012 10:18:25 +0100 - fixed the --dir commandline parameter
|
||||
Revision 4ed844f - Fri, 2 Mar 2012 17:05:59 -0500 - Escape all column names when building sql queries
|
||||
Revision 020467d - Mon, 27 Feb 2012 00:16:15 -0500 - Fixed db_old loading noexpire
|
||||
Revision 141b87b - Sun, 26 Feb 2012 23:28:02 -0500 - Changed the OnChanDrop event to be called right before channels are dropped, not after
|
||||
Revision a5b9e23 - Sun, 26 Feb 2012 23:23:15 -0500 - Added chanserv:require config option to set which modes must be on all registered channels. Prevents the core from always enforcing +r on every channel, even if chanserv is not loaded.
|
||||
Revision a78790e - Sun, 26 Feb 2012 20:18:22 -0500 - Fixed vhost check on identify
|
||||
Revision 07226fe - Sun, 26 Feb 2012 19:49:02 -0500 - Track plexus umode and cmode +C and renamed UMODE_NO_CTCP to match up with the names of other modes.
|
||||
Revision e730138 - Sat, 25 Feb 2012 22:45:51 -0500 - Fixed missing #include in init.cpp
|
||||
Revision 2bc3bd3 - Sat, 25 Feb 2012 00:06:02 -0500 - Do not send kills after sending XLines because it causes us to internally remove the user and then recieve a quit from the user (who is now nonexistant) once the IRCd processes the XLine
|
||||
Revision 83456f6 - Fri, 24 Feb 2012 23:25:29 -0500 - Fixed akill setter and ids showing in akill reasons
|
||||
Revision 601dc41 - Fri, 24 Feb 2012 14:54:44 -0500 - Merge branch '1.9' of anope.git.sf.net:/gitroot/anope/anope into 1.9
|
||||
Revision 2337b77 - Fri, 24 Feb 2012 14:53:34 -0500 - Fixed calculating bots channel count of assigned channels and fixed the order of saving memos (among other things)
|
||||
Revision fde40de - Fri, 24 Feb 2012 01:50:21 +0000 - Tell users to use NickServ for registering nicks, not chanserv...
|
||||
Revision ba32aad - Thu, 23 Feb 2012 02:32:49 +0000 - Merge branch '1.9' of ssh://anope.git.sf.net/gitroot/anope/anope into 1.9
|
||||
Revision 24811e5 - Wed, 22 Feb 2012 20:55:59 -0500 - Added a configuration option to make all nick registrations require admin verification
|
||||
Revision f01aab5 - Thu, 23 Feb 2012 00:04:36 +0000 - Merge branch '1.9' of ssh://anope.git.sf.net/gitroot/anope/anope into 1.9
|
||||
Revision 3850b07 - Wed, 22 Feb 2012 18:12:02 -0500 - Added regex support for many commands, such as akill, sqline, snline, all of the */list commands, etc.
|
||||
Revision 81e50dd - Wed, 22 Feb 2012 16:25:20 -0500 - Fixed db_old loading memo owners
|
||||
Revision bd31fbb - Wed, 22 Feb 2012 14:41:36 -0500 - Also fixed m_proxyscan to handle users with invalid ips
|
||||
Revision 0006606 - Tue, 21 Feb 2012 20:50:14 -0500 - Fixed m_dnsbl handling users with spoofs/other non ips
|
||||
Revision 826de43 - Wed, 22 Feb 2012 00:28:58 +0000 - Fixed some trivial formatting
|
||||
Revision b84e080 - Sun, 19 Feb 2012 20:54:55 -0500 - Made our message sources actual clients/servers, and put in a few more default messages for very standard things (KICK etc)
|
||||
Revision 0ba58d7 - Sat, 18 Feb 2012 18:07:34 -0500 - Fixed some events
|
||||
Revision 1536c5c - Sat, 18 Feb 2012 17:21:55 -0500 - Add users hostmask to access lists not nick when access add is used on a non registered user
|
||||
Revision f2ce9cd - Sat, 18 Feb 2012 15:47:16 -0500 - Made mode lock del check status of the mode lock before removing it
|
||||
Revision ee5cd84 - Sat, 18 Feb 2012 15:04:26 -0500 - Use C++11's explicit override feature if available
|
||||
Revision 41e8d27 - Thu, 16 Feb 2012 16:02:17 -0500 - Fixed FreeBSD build
|
||||
Revision e1f5fc6 - Wed, 15 Feb 2012 00:06:25 -0500 - Remove revision numbers as they're only ever set by Config reading git since we've switched off of SVN. Instead just use the hash for the current head when building. Also recheck the hash on every make not just Config.
|
||||
Revision db59f1a - Tue, 14 Feb 2012 19:03:09 -0500 - Fixed detecting when to set +r and fixed crash on shutdown introduced by the last commit
|
||||
Revision a9772cd - Tue, 14 Feb 2012 15:13:27 -0500 - Clean up and reorganize our header files
|
||||
Revision 086790d - Mon, 13 Feb 2012 00:10:45 -0500 - Removed our RNG and just use the systems, it's not very widely used. Also made DNS query ids not random as they don't need to be.
|
||||
Revision 1bc8e2a - Wed, 8 Feb 2012 18:00:24 -0500 - Removed operserv:notifications in favor of log blocks, as well as some other notifiications
|
||||
Revision 089c85b - Sat, 4 Feb 2012 17:28:38 -0500 - Fixed WallBadOS
|
||||
Revision 01194e3 - Sat, 4 Feb 2012 13:12:11 -0500 - Bump for 1.9.7-git
|
||||
Revision f082530 - Fri, 3 Feb 2012 15:19:09 -0500 - Anope 1.9.6 Release
|
||||
Revision b906656 - Fri, 3 Feb 2012 15:18:27 -0500 - Update version.log
|
||||
Revision 378ae4c - Fri, 3 Feb 2012 15:18:06 -0500 - Regenerate language files
|
||||
Revision ce2a0f7 - Tue, 31 Jan 2012 16:19:47 -0500 - Fixed a memory leak in m_ldap
|
||||
Revision be5ba49 - Tue, 31 Jan 2012 15:44:04 -0500 - Not sure what I was thinking here
|
||||
Revision b4f27da - Tue, 31 Jan 2012 15:35:51 -0500 - Bug #1365 - Fixed nickserv/confirm syntax for services opers
|
||||
Revision d09a302 - Thu, 26 Jan 2012 17:04:59 -0500 - Also refuse to load memoserv modules if memoserv isn't loaded
|
||||
Revision 0f90927 - Wed, 25 Jan 2012 16:13:38 -0500 - Added two common warning messages on Windows to ignore
|
||||
Revision 52eaa7d - Wed, 25 Jan 2012 15:48:07 -0500 - Windows
|
||||
Revision e88e37c - Tue, 24 Jan 2012 18:28:37 -0500 - Add some checks in ms_* to make sure memoserv really exists
|
||||
Revision f10f49d - Tue, 24 Jan 2012 16:42:21 -0500 - Added missing expires column in /os akill view
|
||||
Revision d06cdaa - Tue, 24 Jan 2012 16:35:54 -0500 - Fixed os_ignore to check against users real IPs, not to match against opers, and check for expired ignores on /os ignore list
|
||||
Revision fc20bd7 - Tue, 24 Jan 2012 16:03:44 -0500 - Add tracking for Unreal's usermode +I
|
||||
Revision b3d9412 - Sun, 22 Jan 2012 17:49:23 +0100 - added a french INSTALL file, thanks to MacLeod for translating
|
||||
Revision 98feb1b - Sat, 21 Jan 2012 00:50:48 -0500 - Cleaned up bs_kick and fixed amsg kicker
|
||||
Revision 94c302b - Fri, 20 Jan 2012 20:50:36 +0000 - Fixed param check from last commit
|
||||
Revision cdb6bb8 - Fri, 20 Jan 2012 17:50:09 +0000 - Updated DEFCON and fixed Defcons disabling of the removed mlock command
|
||||
Revision a851f84 - Fri, 20 Jan 2012 15:03:49 +0000 - Corrected some incorrect English
|
||||
Revision a270a13 - Sun, 15 Jan 2012 02:59:09 -0500 - Fixed crash from last commit
|
||||
Revision 964d63c - Sun, 15 Jan 2012 01:47:31 -0500 - Improve on db_sql_live_read
|
||||
Revision f38faed - Sat, 14 Jan 2012 15:58:51 +0000 - Fixed an incorrect crash-causing response when an invalid option is specified in botservs kickers
|
||||
Revision c462a69 - Fri, 13 Jan 2012 15:37:17 -0500 - Only match users nicks against access list entries if the entry is a mask... accidentally removed from an earlier fix for #1368
|
||||
Revision 14a2c9c - Wed, 11 Jan 2012 19:04:40 -0500 - Fixed loading db_sql_live_read's configuration values on startup
|
||||
Revision a52ed70 - Tue, 10 Jan 2012 17:58:56 -0500 - Don't ever attempt to process CTCPs as regular messages
|
||||
Revision 7c03e60 - Tue, 10 Jan 2012 17:53:48 -0500 - Removed this "valid" ip check in cidr::cidr, is wrong for IPv6 and ::pton checks this anyway using inet_pton. Also fixed a comment Robby broke in chanserv.conf
|
||||
Revision 1e9d88a - Tue, 10 Jan 2012 17:06:08 -0500 - Add support for Unreals extban ~a:
|
||||
Revision 815e140 - Sun, 8 Jan 2012 19:42:48 -0500 - Fixed loading akill reasons
|
||||
Revision f824557 - Sun, 8 Jan 2012 18:14:07 -0500 - Fixed topic lock on inspircd
|
||||
Revision 830c5ca - Sat, 7 Jan 2012 16:21:31 -0500 - Cleanup of cs_tban
|
||||
Revision 9e71394 - Sat, 7 Jan 2012 04:10:30 -0500 - Cleaned up a lot of log messages, help replies, fixed cs_tban, and other small fixes
|
||||
Revision dd64eac - Sat, 7 Jan 2012 03:44:43 -0500 - Fixed users not being able to delete their own access with /cs access when using numbers, and clean up cs_xop slightly
|
||||
Revision 4204ece - Mon, 2 Jan 2012 21:28:24 -0500 - Updated Copyright to 2012
|
||||
Revision 60a5cc1 - Sat, 31 Dec 2011 03:04:44 -0500 - Bug #1369 - Fixed os_svsnick to allow changing the case of a users' nick
|
||||
Revision 20aa4e8 - Sat, 31 Dec 2011 01:33:32 -0500 - Bug #1368 - check all members of a users gruop against the access list
|
||||
Revision f1b05ac - Wed, 28 Dec 2011 12:49:04 -0500 - Fixed this back now unreal sends 0 for non logged in users
|
||||
Revision a4bf770 - Wed, 28 Dec 2011 04:31:44 -0500 - Added ESVID support to unreal32 Also fixes a crash due to unreal's ESVID change when users connect.
|
||||
Revision 150831c - Tue, 27 Dec 2011 23:11:14 -0500 - Made capab management a bit simplier
|
||||
Revision 1a4157b - Fri, 23 Dec 2011 12:29:30 -0500 - Add DT_ALLOW_EMPTY config flag, allow fantasychars to be empty
|
||||
Revision 3bcb285 - Thu, 22 Dec 2011 03:46:35 -0500 - Somehow these two modules got mixed up..
|
||||
Revision 704dbe2 - Tue, 20 Dec 2011 18:38:37 -0500 - Updated /bs info output and note db_sql can truncate entire databases
|
||||
Revision bbddf50 - Mon, 19 Dec 2011 17:13:38 -0500 - Fixed botserv kickers
|
||||
Revision e5851ad - Mon, 19 Dec 2011 16:07:28 -0500 - Fixed saving databases with MySQL when shut down by SIGINT
|
||||
Revision 03119f2 - Mon, 19 Dec 2011 15:41:14 -0500 - Made m_dnsbl ban IPs not hostnames
|
||||
Revision 45fc3ce - Mon, 19 Dec 2011 15:37:15 -0500 - Fixed formatting of many lists and INFO outputs
|
||||
Revision d320c73 - Sat, 17 Dec 2011 10:30:13 +0000 - Fixed entry messages not displaying.
|
||||
Revision ca8ce89 - Sat, 17 Dec 2011 02:06:53 +0000 - Fixed a slight error in email registration/resend and some minor typos.
|
||||
Revision c88a751 - Thu, 15 Dec 2011 02:29:13 -0500 - Add privilege ranks to determine how powerful privileges are
|
||||
Revision 9ea030d - Thu, 15 Dec 2011 01:14:13 -0500 - Fixed access comparators
|
||||
Revision ad14c81 - Mon, 12 Dec 2011 15:37:08 -0500 - Update channel last used times when founders use the channel, too
|
||||
Revision 255a8da - Mon, 12 Dec 2011 15:26:59 -0500 - Added oper:require_oper configuration option
|
||||
Revision 4211dcf - Sun, 11 Dec 2011 17:03:33 -0500 - Merge branch '1.9' of anope.git.sf.net:/gitroot/anope/anope into 1.9
|
||||
Revision 3c5337f - Sun, 11 Dec 2011 17:01:56 -0500 - Fixed translating messages with varargs sent directly to users, too
|
||||
Revision d2f788c - Sun, 11 Dec 2011 05:17:19 +0000 - Added K to vhost_chars...
|
||||
Revision fa54d5a - Thu, 8 Dec 2011 17:29:17 -0500 - Fixed a memory leak in m_sqlite
|
||||
Revision aeefe16 - Mon, 5 Dec 2011 11:52:40 -0500 - Bug #1364 - fixed crash in /cs kick
|
||||
Revision c80e784 - Sat, 3 Dec 2011 19:17:41 -0500 - Attempt to fix issue with modules having their link libraries in the wrong order.
|
||||
Revision 620c08b - Fri, 25 Nov 2011 23:12:23 +0000 - Fixed some more errors in sql live-write, hopefully the last.
|
||||
Revision 23a9270 - Fri, 25 Nov 2011 23:10:26 +0000 - Fixed a crash in ns saset when using mysql-write module
|
||||
Revision cef3eb7 - Fri, 25 Nov 2011 00:44:31 -0500 - Remove send_cmd and replace it with a stringstream
|
||||
Revision 12d0a73 - Mon, 21 Nov 2011 16:24:45 -0500 - Merge branch '1.9' of ssh://anope.git.sf.net/gitroot/anope/anope into 1.9
|
||||
Revision 0dd85f7 - Mon, 21 Nov 2011 16:17:17 -0500 - Fixed not translating messages using varargs
|
||||
Revision 51d6e8e - Sun, 20 Nov 2011 18:41:46 -0500 - CMake handles strings and lists differently, so this should hopefully finally fix the linking issue.
|
||||
Revision 3f14882 - Sun, 20 Nov 2011 18:34:13 -0500 - Apparently pstdint.h was NOT included way back with commit 377a7a9 to use something similar to stdint.h
|
||||
Revision 5a17b06 - Sun, 20 Nov 2011 18:32:47 -0500 - Really fix linking in libraries (even if gettext isn't found on *nix), and a minor nitpick about the leading spaces on LINK_LIBS.
|
||||
Revision bf8e4ac - Sun, 20 Nov 2011 16:09:59 -0500 - Attempt to fix where link libraries are set when compiling to fix failed builds on systems that require -ldl.
|
||||
Revision 781ed11 - Sun, 20 Nov 2011 15:31:01 -0500 - Allow services operators to modify other users access list
|
||||
Revision 6f8f749 - Fri, 18 Nov 2011 16:20:17 -0500 - Allow kicking and banning by mask
|
||||
Revision c43cdf4 - Fri, 18 Nov 2011 11:22:01 -0500 - Added operserv/logout
|
||||
Revision 8374211 - Fri, 18 Nov 2011 00:36:54 -0500 - Allow having multiple fantasy characters
|
||||
Revision 69dfc72 - Thu, 17 Nov 2011 12:46:18 -0500 - Fixed storing mode locks
|
||||
Revision 5281282 - Wed, 16 Nov 2011 16:22:58 -0500 - Fixed compile error
|
||||
Revision 503eb42 - Tue, 15 Nov 2011 16:30:31 -0500 - Made looking up a level for a nonexistant privilege debugg log a warning, not abort
|
||||
Revision 38d90c7 - Tue, 15 Nov 2011 16:27:32 -0500 - Fixed loading ssl certs for users
|
||||
Revision 1356498 - Tue, 15 Nov 2011 16:22:02 -0500 - Prevent locking mode Z on unrealircd
|
||||
Revision 9ed203c - Tue, 15 Nov 2011 16:16:38 -0500 - Fixed crash on shutdown & a compiler warning
|
||||
Revision b5ff856 - Tue, 8 Nov 2011 17:29:16 -0500 - Windows
|
||||
Revision 97b9055 - Sat, 5 Nov 2011 15:05:15 -0400 - Remove xlines from the IRCd aswell as from our list when the clear command is used, and fixed adding timed Zlines to inspircd
|
||||
Revision 5f0b933 - Sat, 5 Nov 2011 00:11:49 -0400 - Set proper expirys on ZLines if the IRCd supports it
|
||||
Revision b3194a1 - Fri, 4 Nov 2011 19:39:27 -0400 - Updated Changes
|
||||
Revision d01f4ea - Fri, 4 Nov 2011 18:04:12 -0400 - Allow /os userlist to match host and ip too
|
||||
Revision a42cafb - Fri, 4 Nov 2011 17:55:14 -0400 - Store flags for memos, fixed the expiring very soon message, fixed /os session view when a session exception is added at a lower limit than th default
|
||||
Revision 066e5b3 - Fri, 4 Nov 2011 02:28:21 -0400 - Delete all tables before flushing not just ones we know about
|
||||
Revision 09dba47 - Thu, 3 Nov 2011 18:59:51 -0400 - Added an assignment operator for Serializable because some STL containers use it which causes iterators to become invalidated
|
||||
Revision ca33ac6 - Thu, 3 Nov 2011 02:28:29 -0400 - Bug #1354 - Allow mode chars to be used for channel prefixs in services.conf
|
||||
Revision 302989b - Tue, 1 Nov 2011 01:11:26 -0400 - Clarify the message when users try to lock modes they don't have access to lock
|
||||
Revision 22b7d9f - Tue, 1 Nov 2011 00:15:28 -0400 - Added a copy constructor to dynamic_reference to allow references to reference other references correctly
|
||||
Revision 9dd71c4 - Sat, 29 Oct 2011 21:16:50 -0400 - Fixed the signal/fork/wait mess hopefully once and for all. fork() did not copy kqueue descriptors on freebsd which caused problems
|
||||
Revision 655c1cc - Thu, 27 Oct 2011 18:21:49 -0400 - Fix a few warnings that only showed up with gcc 3.4.6 here (sadly, there is one on every file about anonymous variadic macros that I can't get rid of).
|
||||
Revision d9333e0 - Thu, 27 Oct 2011 18:01:56 -0400 - Clear flags before rebuilding them from the databases. Fixes bug #1351 where default flags would always be set when unserializing objects.
|
||||
Revision 39ac438 - Thu, 27 Oct 2011 15:09:31 -0400 - Ignore sigchld/usr2 sent to the child process after fork
|
||||
Revision 0761a4a - Thu, 27 Oct 2011 14:46:20 -0400 - Bug #1350 + other related fixes
|
||||
Revision 66ca256 - Thu, 27 Oct 2011 13:50:32 -0400 - Fixed loading exceptions in db_plain
|
||||
Revision 961bb6e - Thu, 27 Oct 2011 00:13:00 +0100 - Fixed some typos/errors in the example configs comments.
|
||||
Revision b14f5ea - Wed, 26 Oct 2011 16:52:00 -0400 - Fixed accidentally clearing botmodes when joins are sent
|
||||
Revision bf66336 - Wed, 26 Oct 2011 15:29:45 -0400 - Bug #1347, fixed incorrect param parsing in cs_set_misc
|
||||
Revision c79a575 - Wed, 26 Oct 2011 15:17:05 -0400 - Bug #1348 - Fixed /cs entrymsg list
|
||||
Revision 8334128 - Wed, 26 Oct 2011 14:31:58 -0400 - Removed the old unordered_map code
|
||||
Revision 7c62de1 - Mon, 24 Oct 2011 16:37:29 -0400 - Merge branch '1.9' of anope.git.sf.net:/gitroot/anope/anope into 1.9
|
||||
Revision 377a7a9 - Mon, 24 Oct 2011 16:32:29 -0400 - Fixed bug #1349 (m_sqlite compiles without error under FreeBSD), as well as use C99's stdint.h (or cstdint if available) to get (u)intX_t types instead of our stupid typedefs. pstdint.h included in case there is no cstdint or stdint.h available.
|
||||
Revision ccf29c0 - Mon, 24 Oct 2011 13:19:51 -0400 - Fixed the capab parser to parse capab tokens prefixed with :. Fixes not detecting quitstorm support on ratbox
|
||||
Revision d0513d6 - Sat, 22 Oct 2011 16:11:26 -0400 - A few minor fixups
|
||||
Revision f4a0bdd - Sat, 22 Oct 2011 12:45:55 -0400 - Added our own eventfd test for openvz machines which have eventfd but can not be used
|
||||
Revision 3e2ac36 - Sat, 22 Oct 2011 11:35:31 -0400 - Bug #1343 - don't allow recovering and ghosting enforcers
|
||||
Revision c8b3809 - Sat, 22 Oct 2011 11:21:21 -0400 - Added akill ids
|
||||
Revision ad2ef75 - Sat, 22 Oct 2011 11:20:50 -0400 - Fixed a race condition with installing signal handlers and forking
|
||||
Revision 6ce9010 - Fri, 21 Oct 2011 18:01:51 -0400 - Fixed extracting multiple words from our serializable stringstream
|
||||
Revision d0afc8c - Fri, 21 Oct 2011 00:21:34 -0400 - Added m_rewrite
|
||||
Revision 230b3bc - Thu, 20 Oct 2011 13:38:37 -0400 - Only fork if we are at term
|
||||
Revision 1cfb630 - Thu, 20 Oct 2011 11:54:56 -0400 - Fixed a crash in clearusers
|
||||
Revision d16f962 - Wed, 19 Oct 2011 12:59:16 -0400 - Bug #1342 - fixed tracking chmodes in bahamuts sjoin
|
||||
Revision fc16746 - Tue, 18 Oct 2011 12:18:18 -0400 - Prevent chankill from akilling my clients
|
||||
Revision eb5b5f9 - Tue, 18 Oct 2011 12:06:51 -0400 - Fixed compile errors on release build
|
||||
Revision faea452 - Tue, 18 Oct 2011 01:48:05 -0400 - Reorder some stuff in Init & the ts6 proto mods to fix weirdness from bots being introduced by 3rd party modules
|
||||
Revision 2c614d5 - Sat, 15 Oct 2011 02:08:52 -0400 - Fixed up anoperc to work with the newer startup method
|
||||
Revision 89b4be6 - Sat, 15 Oct 2011 00:54:32 -0400 - Fixed crash on /os oper del
|
||||
Revision 28ca0e1 - Fri, 14 Oct 2011 22:07:13 -0400 - Fork earlier in startup to prevent it messing up threads, if there are any
|
||||
Revision 2504af7 - Fri, 14 Oct 2011 12:53:28 -0400 - Fixed os_forbid adds reason if no expiry is given
|
||||
Revision ddc3c2f - Fri, 14 Oct 2011 12:20:07 -0400 - Added options:nonicknameownership config option
|
||||
Revision 53275c3 - Tue, 11 Oct 2011 02:50:37 -0400 - Don't add new levels to existing channels default, screws with stuff when the config is reloaded
|
||||
Revision f3f6727 - Tue, 11 Oct 2011 00:09:26 -0400 - Bug #1337
|
||||
Revision 4681e3a - Mon, 10 Oct 2011 17:19:06 -0400 - Allow chanserv/suspend to take an expiry time
|
||||
Revision 80f4f31 - Mon, 10 Oct 2011 15:04:23 -0400 - Put serialized_items on the heap to prevent weird crashes on shutdown from the list being destructed before members in it
|
||||
Revision 9f3d735 - Mon, 10 Oct 2011 14:16:59 -0400 - Allow nickserv/suspend to take an expiry time
|
||||
Revision 0e012f7 - Sun, 9 Oct 2011 21:29:34 -0400 - Check for being at terminal before forking
|
||||
Revision 9f85033 - Sun, 9 Oct 2011 02:52:13 -0400 - Give more verbose messages on startup
|
||||
Revision af273e3 - Sun, 25 Sep 2011 15:34:56 -0400 - Store flags for objects, also fixes bug #1333
|
||||
Revision 1f3e96f - Sun, 25 Sep 2011 14:42:09 -0400 - Made channel privileges case insensitive
|
||||
Revision e7ba639 - Sun, 25 Sep 2011 14:38:21 -0400 - Remove opnotice from example configs
|
||||
Revision 1f2399d - Sun, 25 Sep 2011 04:19:15 -0400 - Added a new database format and sqlite support. Also moved db-convert to a module.
|
||||
Revision 43201ea - Mon, 19 Sep 2011 18:35:40 -0400 - Fixed /os reload doing weird things to service channels, and allow setting modes by clients on burst
|
||||
Revision 7dce64e - Mon, 19 Sep 2011 13:14:20 -0400 - Fixed missing _ in cs_appendtopic
|
||||
Revision 1184eb5 - Mon, 19 Sep 2011 13:12:52 -0400 - Allow OnPreHelp to stop processing
|
||||
Revision 4c2a492 - Mon, 19 Sep 2011 12:36:52 -0400 - Call fantasy events even if the commands for them don't exist
|
||||
Revision be77a7e - Mon, 19 Sep 2011 12:29:54 -0400 - Bug #1334 - fixed crash on /os oper info
|
||||
Revision 934723f - Mon, 19 Sep 2011 12:14:02 -0400 - LOG_COMMAND must now always give a valid command
|
||||
Revision f07295c - Fri, 16 Sep 2011 14:07:33 -0400 - Bug #1332 - Fixed ValidateUser to not require secure off to disable nickserv kill
|
||||
Revision 26c1d67 - Sat, 10 Sep 2011 16:27:10 -0400 - Fixed compile errors & warnings from 1.9.6 to 1.9 merge
|
||||
Revision 3d5889c - Sat, 10 Sep 2011 16:08:58 -0400 - Updated channel flag names to remove LOGCHAN
|
||||
Revision 213c1c4 - Sat, 10 Sep 2011 02:42:18 -0400 - Changed msgmerge to not use -E.. it will escape all of some languages and mess up poedit etc. Keep it in xgettext for the bold/underline characters.
|
||||
Revision 63cb8ca - Sat, 10 Sep 2011 02:06:31 -0400 - Moved signal/thread/mode checking to use signal pipes
|
||||
Revision dc5d1fa - Sat, 10 Sep 2011 02:06:31 -0400 - Made ChanServ privileges configurable
|
||||
Revision 563d158 - Sat, 10 Sep 2011 02:06:31 -0400 - Allow Config to install cmake
|
||||
Revision 1478b5b - Sat, 10 Sep 2011 02:06:29 -0400 - Added chanserv/log
|
||||
Revision 19e0b87 - Sat, 10 Sep 2011 02:05:56 -0400 - Removed /bs set msg
|
||||
Revision 17ea4ed - Sat, 10 Sep 2011 02:05:03 -0400 - Fixed service_reference to work correctly with external classes
|
||||
Revision feaef7c - Sat, 10 Sep 2011 02:05:03 -0400 - Allow services to register or unregister themselves
|
||||
Revision c6d3fbd - Sat, 10 Sep 2011 02:05:02 -0400 - Added kqueue
|
||||
Revision 700a585 - Sat, 10 Sep 2011 02:05:00 -0400 - Allow modules to add their own channel levels
|
||||
Revision 62752db - Sat, 10 Sep 2011 01:58:39 -0400 - Rewrote mlock saving/loading code to not use this silly extensible hack
|
||||
Revision f025d1b - Sat, 10 Sep 2011 01:58:38 -0400 - Made service_reference type safe
|
||||
Revision 8c4417c - Sat, 10 Sep 2011 01:58:38 -0400 - Removed opnotice
|
||||
Revision d4db2b8 - Sat, 10 Sep 2011 01:58:38 -0400 - Made the IsValidHost checks configurable
|
||||
Revision bb8e04c - Sat, 10 Sep 2011 01:58:35 -0400 - Added oper:host and oper:vhost
|
||||
Revision b504791 - Sat, 10 Sep 2011 01:55:37 -0400 - Cleaned up the dns engine, and fixed sometimes parsing multiple answer queries incorrectly
|
||||
Revision d5749c1 - Sat, 10 Sep 2011 01:55:37 -0400 - Fixed eventfd pipeengine to not add the same socket twice
|
||||
Revision f54ab5e - Sat, 10 Sep 2011 01:55:29 -0400 - Squash merge of 1.9 to 1.9.6
|
||||
Revision 1e45019 - Sat, 10 Sep 2011 01:55:11 -0400 - Added m_proxyscan
|
||||
Revision 2eb708e - Sat, 10 Sep 2011 01:55:09 -0400 - Cleaned up some of the socket code, cleaned up the pipe engines, added support for binary sockets, and cleaned up the asynch connect/accept code
|
||||
Revision 4fcb371 - Sat, 10 Sep 2011 01:52:59 -0400 - Track what "level" channel status modes are, which allows us to have chanserv/mode determine if a status mode can be set by users better
|
||||
Revision 6401d93 - Sat, 10 Sep 2011 01:52:59 -0400 - Added chanserv/up and chanserv/down
|
||||
Revision 8a9a39c - Sat, 10 Sep 2011 01:52:59 -0400 - Renamed the core pseudoclient modules to match their names
|
||||
Revision 13e8b26 - Sat, 10 Sep 2011 01:52:59 -0400 - Made email messages sent by services configurable
|
||||
Revision 8a6d657 - Sat, 10 Sep 2011 01:52:46 -0400 - Removed log:inhabitlogchannel and replaced it with service:channels
|
||||
Revision 4a7ba7e - Sat, 10 Sep 2011 00:58:35 -0400 - Removed SZLine. Instead, have AKILL determine whether or not a ZLINE should be set.
|
||||
Revision 2b5d9f3 - Sat, 10 Sep 2011 00:54:29 -0400 - Bump for 1.9.6 git
|
||||
Revision 3a502f2 - Fri, 9 Sep 2011 23:28:58 -0400 - Anope 1.9.5 Release
|
||||
Revision b6dad37 - Fri, 9 Sep 2011 23:28:37 -0400 - Update version.log
|
||||
Revision 3cbad7f - Fri, 9 Sep 2011 23:27:15 -0400 - Regenerate language files
|
||||
Revision b80a0a8 - Fri, 9 Sep 2011 22:27:51 -0400 - Updated Greek language file
|
||||
Revision f844b0a - Fri, 9 Sep 2011 19:18:43 -0400 - Changed User::IsRecognized check to default to secure
|
||||
@@ -782,7 +1070,7 @@ Revision 0d2d7e9 - Sun, 20 Jun 2010 20:05:23 -0400 - Fixed Windows build
|
||||
Revision 63d7bee - Sun, 20 Jun 2010 18:51:03 -0400 - Merge branch '1.9' of ssh://anope.git.sf.net/gitroot/anope/anope into 1.9
|
||||
Revision 381c9c8 - Sun, 20 Jun 2010 18:42:58 -0400 - The first of a few "CBX OCDing over code style" commits, focusing on include/* and src/* but not src/core/* or src/modules/*.
|
||||
Revision e8a1570 - Sun, 20 Jun 2010 14:04:17 -0400 - Added m_helpchan to replace the cores helpchannel functionality
|
||||
Revision 968e4d0 - Sun, 20 Jun 2010 13:11:31 -0400 - Fixed the name of cs_forbid in chanserv:modules so it really loads
|
||||
Revision 968e4d0b - Sun, 20 Jun 2010 13:11:31 -0400 - Fixed the name of cs_forbid in chanserv:modules so it really loads
|
||||
Revision 7b7e2a6 - Sat, 19 Jun 2010 21:22:48 -0400 - Updated TODO
|
||||
Revision 448eadd - Sat, 19 Jun 2010 20:53:53 -0400 - Made db-converter add all of the core clients when converting a 1.8 database
|
||||
Revision 68b54f3 - Sat, 19 Jun 2010 13:39:12 -0400 - Made db-converter only write mlock params if there really is one, fixes some problems with converting mlock for certain databases
|
||||
|
||||
+1
-1
@@ -9,7 +9,7 @@ if(WIN32)
|
||||
endif(IN_SOURCE)
|
||||
set(DOCS Changes Changes.conf DEFCON FAQ INSTALL LANGUAGE MODULES NEWS ${CMAKE_CURRENT_BINARY_DIR}/README.txt WIN32.txt)
|
||||
install(FILES ${DOCS}
|
||||
DESTINATION docs
|
||||
DESTINATION ${DOC_DIR}
|
||||
)
|
||||
set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${CMAKE_CURRENT_BINARY_DIR}/README.txt")
|
||||
endif(WIN32)
|
||||
|
||||
@@ -1,3 +1,32 @@
|
||||
Anope Version 1.9.7
|
||||
--------------------
|
||||
A Added ability for using regex as patterns for various commands
|
||||
A Extended ability of operserv/akill to also match against nick and realname
|
||||
A Added chanserv:require configuration option
|
||||
A Added nickserv:unregistered_notice and nickserv:registration configuration option
|
||||
A Added options:casemap configuration option
|
||||
A Added a web panel
|
||||
A db_sql_live now allows all tables to be "live", not just a select few
|
||||
|
||||
Anope Version 1.9.6
|
||||
--------------------
|
||||
A Added ability to configure emails sent by services
|
||||
A Added chanserv/up and chanserv/down
|
||||
A Added m_proxyscan
|
||||
A Added more configurability for what vhosts are valid
|
||||
A Added chanserv/log
|
||||
A Added ability to configure ChanServ privileges
|
||||
A Added a new database format
|
||||
A Added SQLite support
|
||||
A Added more verbose messages on startup
|
||||
A Added ability for chanserv/suspend and nickserv/suspend to take an expiry time
|
||||
A Added no nickname ownership config option
|
||||
A Added m_rewrite
|
||||
A Added akill IDs
|
||||
F Fixed crash in clearusers
|
||||
F Fixed crash in /os oper info
|
||||
F Fixed eventfd Config check to work properly on OpenVZ
|
||||
|
||||
Anope Version 1.9.5
|
||||
--------------------
|
||||
A Extended LDAP support
|
||||
|
||||
@@ -1,3 +1,22 @@
|
||||
Anope Version 1.9.7
|
||||
-------------------
|
||||
operserv:notifications removed in favor of log{} blocks
|
||||
options:regexengine added
|
||||
options:casemap added
|
||||
chanserv:require added
|
||||
nickserv:registration added, emailregistration removed.
|
||||
nickserv:unregistered_notice added
|
||||
|
||||
Anope Version 1.9.6
|
||||
-------------------
|
||||
service:channels added to join services to channels
|
||||
mail block modified to allow configuring of email messages
|
||||
oper:host and oper:vhost added
|
||||
oper:require_oper added
|
||||
options:nonicknameownership added
|
||||
operserv:akillids added
|
||||
nickserv/access oper privilege added
|
||||
|
||||
Anope Version 1.9.5
|
||||
-------------------
|
||||
Don't even try it, get a new config and start over.
|
||||
|
||||
+9
-12
@@ -31,10 +31,11 @@ Anope DefCon
|
||||
|
||||
The DefCon system is part of Anope's core,
|
||||
|
||||
The DefCon system has to be configured on your services.conf file to
|
||||
be enabled. The defcon module will not unload unless all non-optional
|
||||
directives are set. Look for the defcon block
|
||||
section on your services.conf file for more information.
|
||||
The DefCon system has to be configured on your operserv.conf file to
|
||||
be enabled. Defcon will be disabled if "defaultlevel" in the defcon
|
||||
block is left commented, or set to 0. Look for the defcon block
|
||||
on your operserv.conf file for more information on enabling and
|
||||
configuring it.
|
||||
|
||||
Make sure you restart Anope after changing the DefCon configuration
|
||||
directives.
|
||||
@@ -45,7 +46,7 @@ Anope DefCon
|
||||
|
||||
No new channel registrations
|
||||
No New Nick Registrations
|
||||
No MLOCK changes
|
||||
No Mode Lock changes
|
||||
Force Chan Mode
|
||||
Use Reduced Session Limit
|
||||
KILL any new clients trying to connect
|
||||
@@ -55,7 +56,7 @@ Anope DefCon
|
||||
No new memos sent to block MemoServ attacks
|
||||
|
||||
Information regarding how to enable this for specific defcon levels can
|
||||
be found in services.conf
|
||||
be found in operserv.conf
|
||||
|
||||
4) Usage
|
||||
|
||||
@@ -70,22 +71,18 @@ Anope DefCon
|
||||
|
||||
/msg OperServ DEFCON 4
|
||||
|
||||
*** Global -- from OperServ: dengel Changed the DEFCON level to 4
|
||||
|
||||
-OperServ- Services are now at DEFCON 4
|
||||
-OperServ- * No new channel registrations
|
||||
-OperServ- * No new nick registrations
|
||||
-OperServ- * No MLOCK changes
|
||||
-OperServ- * No mode lock changes
|
||||
-OperServ- * Use the reduced session limit of 5
|
||||
|
||||
-Global- The Defcon Level is now at Level: 4
|
||||
-Global- The Defcon Level is now at: 4
|
||||
|
||||
Restore normal readiness:
|
||||
|
||||
/msg OperServ DEFCON 5
|
||||
|
||||
*** Global -- from OperServ: dengel Changed the DEFCON level to 5
|
||||
|
||||
-OperServ- Services are now at DEFCON 5
|
||||
|
||||
-Global- Services are now back to normal, sorry for any inconvenience
|
||||
|
||||
+209
@@ -0,0 +1,209 @@
|
||||
Installation et instructions d'anope
|
||||
------------------------------------
|
||||
|
||||
1) Instalation d'anope
|
||||
2) Mise Ă jour d'anope
|
||||
3) Configuration de l'ircd
|
||||
4) Mise en route de anope
|
||||
5) Mise en place d'un fichier crontab
|
||||
|
||||
Note: Vous devrez également lire les fichiers README et FAQ !
|
||||
|
||||
1) Installation de anope
|
||||
|
||||
Note importante: il n'est pas recommandé d'utiliser (et même d'installer)
|
||||
Anope en tant que root.
|
||||
Utilisez un utilisateur non privilégié,
|
||||
|
||||
|
||||
La première chose que vous devez faire est d'obtenir le package Anope (si ce n'est déjà fait).
|
||||
|
||||
Vous pouvez le trouver ici http://www.anope.org/
|
||||
|
||||
|
||||
|
||||
Anope peut être installer de deux façons.
|
||||
|
||||
1. La méthode recommandée est d'utiliser CMake.
|
||||
Vous pouvez vérifier si CMake est déjà installé sur votre système en utilisant la
|
||||
|
||||
commande: cmake --version ( sur votre vps ou dedier etre loggué en root )
|
||||
|
||||
|
||||
Si c'est installĂ©, vous aurez une ligne qui dit quelque chose qui ressemble Ă
|
||||
|
||||
«version 2.6 cmake-patch 1".
|
||||
|
||||
Si la version est inférieure à 2,4 ou si vous obtenez une erreur disant que la commande n'a pas été trouvé,
|
||||
vous ne serez pas en mesure d'utiliser CMake,
|
||||
|
||||
sauf si vous installez vous-même dans votre répertoire home. CMake
|
||||
vous pouvez le téléchargé ici > http://www.cmake.org/cmake/resources/software.html
|
||||
|
||||
|
||||
Si vous n'arrivez pas Ă installer (soit en raison du manque d'espace
|
||||
ou de restrictions par votre fournisseur d'hébergement),
|
||||
vous pouvez encore utiliser le script de configuration fournis.
|
||||
Cette option n'est pas recommandée et finira par être retiré, mais il est fourni pour la compatibilité de ces
|
||||
manque de CMake.
|
||||
|
||||
|
||||
|
||||
Ensuite, décompressez le package dans votre répertoire home, et allez dans le répértoire
|
||||
qui viens d'être crée.
|
||||
|
||||
Maintenant, tapez ./Config pour lancer le script de configuration. Il va vous poser
|
||||
quelques questions, et compiler Anope sur votre système.
|
||||
|
||||
Si vous ne savez pas repondre à une question, utilisez la valeur par défaut.
|
||||
|
||||
|
||||
Vous pouvez maintenant taper make pour compiler Anope. S'il ya des erreurs dans la
|
||||
Makefile, * essayez d'utiliser * gmake au lieu. Si cela ne fonctionne toujours pas, vous (ou
|
||||
votre fournisseur ) doit installer GNU make. Vous pouvez
|
||||
le Trouvez sur ftp://prep.ai.mit.edu/pub/gnu/.
|
||||
|
||||
Maintenant, tapez make install (ou gmake install; voir ci-dessus). Cela permet d'installer
|
||||
tous les fichiers nécessaires dans les chemins que vous avez spécifié dans la configuration
|
||||
script, et les permissions du fichier de configuration. Vous devez vous assurer que les données
|
||||
répertoire ne sont pas accessible par d'autres utilisateurs, que des utilisateurs malveillants peuvent
|
||||
causer des problèmes sur votre réseau, si les mots de passe ne sont pas cryptés, ou de lire
|
||||
les mémos de tout utilisateur.
|
||||
|
||||
Si vous voyez des erreurs lors de ce processus, s'il vous plaît nous envoyer un mail avec le * complet *
|
||||
sortie d'erreur, et n'oubliez pas de mentionner votre OS, compilateur et bibliothèque C + +
|
||||
versions.
|
||||
|
||||
Maintenant, allez dans le répertoire de données (par défaut, cd ~/services/data). ouvrer exemple.conf
|
||||
avec votre éditeur de texte favori. Il contient toute la configuration
|
||||
directives. Anope va l'utiliser au démarrage. Lisez attentivement les instructions contenues dans
|
||||
le fichier. l'utilisation des valeurs par defauld n'est pas recomment et anope ne risque pas de fonctionner
|
||||
|
||||
|
||||
Si vous avez besoin d'aide, vous devez vous abonner Ă la mailing list et par courrier Anope
|
||||
pour se faire aider par d'autres utilisateurs. Voir le fichier README pour plus de
|
||||
informations.
|
||||
|
||||
2) Mise Ă jour Anope
|
||||
|
||||
Si vous avez un fichier .Diff et que vous voulez patcher les ancienne sources Anope avec,
|
||||
effectuer les opérations suivantes:
|
||||
|
||||
* Copiez le fichier .Diff dans le répertoire racine des sources Anope.
|
||||
* Type de patch-p1 <file.diff
|
||||
|
||||
Notez que la mise à jour anope avec un fichier patch n'est pas recommandé.
|
||||
Vous devez télécharger une nouvelle source propre, car cela vous donnera les meilleurs résultats..
|
||||
|
||||
Pour mettre à jour Anope, suivez simplement les instructions d'installation décrites dans
|
||||
l'article 1. Il y a cependant quelques règles spécifiques:
|
||||
|
||||
* IMPORTANT: Sauvegardez vos anciennes bases de données!
|
||||
* Si vous mettez à jour vers une nouvelle version majeure, toujours redémarrer avec un
|
||||
fichier de configuration neuve example.conf.
|
||||
|
||||
|
||||
|
||||
3) Mise en place du IRCd
|
||||
|
||||
Ce Services agit comme un serveur IRC avec des pseudo-clients sur elle. Pour les relier Ă
|
||||
votre réseau, vous aurez besoin d'ajouter quelques lignes dans le ircd.conf de leur plate-forme
|
||||
serveur (comme indiqué dans la directive de configuration RemoteServer).
|
||||
|
||||
Pour les échantillons ci-dessous, nous allons prendre services.localhost.net que le nom de la
|
||||
Services (comme indiqué dans la directive de configuration ServerName). Notez que
|
||||
présente des échantillons sont faites pour être aussi générique que possible, mais il pourrait y avoir
|
||||
de petites variations, en fonction de votre IRCd. Pour IRCd aide spécifique aux
|
||||
de configuration, lire près de la fin de cette section.
|
||||
|
||||
Tout d'abord, les lignes C / N, qui permettent aux services de crée un lien. Ils ont également besoin d'un
|
||||
Y: ligne fonctionne correctement.
|
||||
|
||||
Y: 27:180:0:0:4000000
|
||||
C: 127.0.0.1: mypass: services.localhost.net: 30
|
||||
N: 127.0.0.1: mypass: services.localhost.net: 30
|
||||
|
||||
"mot de pass" est le même mot de passe que vous avez mentionné dans le RemoteServer
|
||||
directive de configuration. 127.0.0.1 est l'adresse IP Ă partir de laquelle les services se connecterons
|
||||
à partir de (reliant en localhost est le moyen le plus efficace pour exécuter les services).
|
||||
|
||||
Ensuite, vous avez Ă mettre en place un U:ligne, qui permettra aux services de changer
|
||||
modes de canal, de sujets, et bien plus encore, sans ĂŞtre op sur le canal.
|
||||
|
||||
U: services.localhost.net: *: *
|
||||
|
||||
REMARQUE: si vous avez plus d'un serveur dans votre réseau, cette ligne doit
|
||||
être ajouté sur tous les autres serveurs, où cela ne risque pas de fonctionner correctement.
|
||||
|
||||
Enfin, vous aurez besoin d'ajouter un H:ligne, pour permttre la commande OperServ JUPE
|
||||
de fonctionner correctement.
|
||||
|
||||
H:*::Services.LocalHost.Net
|
||||
|
||||
Ne pas oublier de /rehash votre IRCd pour appliquer les modifications.
|
||||
|
||||
Une nouvelle tendance dans la configuration ircd hybride, Unreal et Bahamut, qui utilisent une approche plus
|
||||
«Lisibles» sous forme de configuration. Pour ceux, utiliser quelque chose comme:
|
||||
|
||||
link services.localhost.net
|
||||
{
|
||||
username *;
|
||||
hostname localhost;
|
||||
bind-ip *;
|
||||
port 6667;
|
||||
hub *;
|
||||
password-connect "mypass";
|
||||
password-receive "mypass";
|
||||
class servers;
|
||||
};
|
||||
|
||||
Notez que ce bloc de fichiers de configuration de style est diffèrent
|
||||
sur le IRCd. Consultez le fabricant de lien interactif (le lien est ci-dessous) pour plus
|
||||
détails sur la configuration exacte utilisée par votre IRCd.
|
||||
|
||||
Si vous êtes incapable d'obtenir un lien avec votre IRCd après la lecture de cet article,
|
||||
vous pouvez essayer le fabricant lien interactif, qui est situé au:
|
||||
|
||||
http://anope.org/ilm.php
|
||||
|
||||
4) A partir Anope
|
||||
|
||||
Allez dans le répertoire où les fichiers binaires ont été installés (par défaut, ce n'est
|
||||
~/ Services/ bin). Tapez. /Services Ă lancer Anope.
|
||||
|
||||
S'il ya des erreurs de syntaxe dans le fichier de configuration, ils seront
|
||||
affiche sur l'écran. Corrigez-les jusqu'à ce qu'il n'y à plus d'erreur.
|
||||
Un démarrage réussi ne générera pas de message.
|
||||
|
||||
Donner aux services au moins une minute pour se connecté à votre réseau, comme certains
|
||||
IRCds sur certains OS peut être très lent pour le processus de liaison. Si rien n'arrive après environ une minute,
|
||||
il y a probablement un problème de configuration. Essayez
|
||||
de lancer Anope en mode debug ./services-debug-nofork pour voir toutes les erreurs qu'il
|
||||
rencontres, et d'essayer de les corriger.
|
||||
|
||||
Si vous avez besoin d'aide pour résoudre des erreurs, n'hésitez pas à vous abonner à la Anope
|
||||
liste de diffusion et de poser là . Voir le fichier README pour plus de détails.
|
||||
|
||||
5) Mettre en place un crontab
|
||||
|
||||
Une entrée crontab vous permettra de vérifier périodiquement que Anope est
|
||||
toujours en cours, et redémarrez-le s'il n'est pas.
|
||||
|
||||
D'abord renommer le script example.chk qui est dans le chemin de Anope (par défaut,
|
||||
cela est ~/services/data) pour services.chk et le modifier. Vous aurez besoin de
|
||||
modifier la partie configuration du fichier. Assurez-vous ensuite que le fichier est
|
||||
marqué comme exécutable en tapant chmod + x services.chk, et essayer de lancer le
|
||||
script pour voir si cela fonctionne (Anope ne doit pas ĂŞtre en marche lorsque vous faites cela ;))
|
||||
|
||||
Lorsque cela est fait, vous devrez ajouter l'entrée crontab. Type de crontab-e.
|
||||
Cela va ouvrir l'éditeur de texte par défaut avec le fichier crontab. Entrez le chemin
|
||||
suivant (avec le chemin correct):
|
||||
|
||||
* / 5 * * * * /home/ircd/services/data/services.chk> /dev/nul 2> & 1
|
||||
|
||||
Le * / 5 au commencement signifie "vérifier toutes les 5 minutes". Vous pouvez remplacer
|
||||
le 5 avec un autre numéro si vous voulez (mais moins de 60). Consulter
|
||||
pages de manuel de votre système pour plus de détails sur la syntaxe de la crontab
|
||||
fichier. Intéressant pages de manuel sont crontab (5), crontab (1) et cron (8).
|
||||
|
||||
Sauvegarder et quitter, et il est installé.
|
||||
+42
-38
@@ -22,16 +22,16 @@ Anope Modules
|
||||
1. If modules are supported by your system, they will be configured
|
||||
automatically when you run ./Config. The modules will be installed
|
||||
to the modules directory in your data path (by default this will
|
||||
be ~/services/modules).
|
||||
be ~/services/data/modules).
|
||||
|
||||
Note: you might need to run "make distclean" prior to running ./Config
|
||||
2. Compile Anope as usual using ./Config. The "make" process will now
|
||||
compile module support into Anope, and compile the default sample
|
||||
modules, and any other module located in the modules folder or any
|
||||
of its sub-directories, eg. modules/extra.
|
||||
|
||||
2. Compile Anope as usual. The (g)make process will now compile module
|
||||
support into Anope, and compile the default sample modules, and/or
|
||||
any other module located on the modules folder ("src/modules/").
|
||||
|
||||
3. Install Anope as usual. The install process will place the compiled
|
||||
modules in their runtime location, making them available for loading.
|
||||
3. Install Anope as usual. The "make install" process will place the
|
||||
compiled modules in their runtime location, making them available
|
||||
for loading.
|
||||
|
||||
4. Start or restart services to make use of the new Anope executable.
|
||||
Note that you do not need to restart to load new or changed modules,
|
||||
@@ -42,59 +42,64 @@ Anope Modules
|
||||
All module manipulation commands are done through OperServ. These are:
|
||||
|
||||
MODLOAD Load a module
|
||||
MODRELOAD Reload a module
|
||||
MODUNLOAD Un-Load a module
|
||||
MODLIST List loaded modules
|
||||
MODINFO Info about a loaded module
|
||||
|
||||
These commands available to Service Roots only.
|
||||
Access to the above commands require the operserv/modload and modlist
|
||||
permissions. Refer to operserv.example.conf.
|
||||
|
||||
You can also load (and pre-load) Modules automatically by loading them
|
||||
on startup. To do so, edit your services.conf file and change the values
|
||||
of "ModuleAutoload" and "ModuleDelayedAutoload" to include the modules
|
||||
you want to load every time Anope starts.
|
||||
on startup. To do so, edit any one of the configuration files (you may
|
||||
want to use modules.conf for third-party/extra modules, or a config
|
||||
file relevant to the *Serv your module operates on, eg. hostserv.conf),
|
||||
and use the following method to load a module on startup or reload:
|
||||
module { name="hs_modname" }
|
||||
|
||||
4) Usage Example
|
||||
|
||||
/msg OperServ modload hs_moo
|
||||
*** Global -- from OperServ: dengel loaded module hs_moo
|
||||
-OperServ- Module hs_moo loaded
|
||||
/msg OperServ modload ns_identify
|
||||
-OperServ- Module ns_identify loaded
|
||||
|
||||
/msg OperServ modinfo hs_moo
|
||||
-OperServ- Module: hs_moo Version: 1.1 Author: Anope loaded: Mar 21 10:54:37 2004 CLT
|
||||
-OperServ- Providing command: /msg HostServ moo
|
||||
/msg OperServ modinfo ns_identify
|
||||
-OperServ- Module: ns_identify Version: 1.9.7 Author: Anope loaded: Jun 17 18:43:08 2012 BST (2 minutes ago)
|
||||
-OperServ- Providing service: nickserv/identify
|
||||
-OperServ- Command ID on NickServ is linked to nickserv/identify
|
||||
-OperServ- Command IDENTIFY on NickServ is linked to nickserv/identify
|
||||
|
||||
/msg HostServ moo
|
||||
-HostServ- MOO! - This command was loaded via a module!
|
||||
/msg OperServ modreload ns_identify
|
||||
-OperServ- Module ns_identify reloaded
|
||||
|
||||
/msg OperServ modunload hs_moo
|
||||
*** Global -- from OperServ: dengel unloaded module hs_moo
|
||||
-OperServ- Module hs_moo unloaded
|
||||
/msg OperServ modunload ns_identify
|
||||
-OperServ- Module ns_identify unloaded
|
||||
|
||||
/msg HostServ moo
|
||||
-HostServ- Unknown command moo. "/msg HostServ HELP" for help.
|
||||
/msg NickServ IDENTIFY
|
||||
-NickServ- Unknown command identify. "/msg NickServ HELP" for help.
|
||||
NOTE: Doing the above, with the command still existing in a config file,
|
||||
will result in a log message, similar to the following:
|
||||
<@NickServ> Command IDENTIFY exists on me, but its service nickserv/identify was not found!
|
||||
|
||||
* Note that the name of the module file is "hs_moo.c", yet we load
|
||||
and reference the module as "hs_moo" only. By naming convention
|
||||
* Note that the name of the module source file is "ns_identify.cpp", yet we
|
||||
load and reference the module as "ns_identify" only. By naming convention
|
||||
modules have an abbreviated service name they attach to (hs_ for
|
||||
HostServ, cs_ for ChanServ, etc) followed by a descriptive keyword.
|
||||
|
||||
5) More Modules
|
||||
|
||||
Anope ships with three sample modules that only illustrates some of the
|
||||
implemented module capabilities. They don't really do much or anything
|
||||
useful.
|
||||
|
||||
You can download more useful modules from http://modules.anope.org/. Just
|
||||
grab the module file (usually with a .c extension). Place the module
|
||||
file in your modules (src/modules) folder; the same folder that contains
|
||||
both hs_moo.c and catserv.c module files.
|
||||
grab the module file (usually with a .cpp extension). Place the module
|
||||
file in your modules (anope-1.9.x/modules/third) folder; although any of
|
||||
the other folders within the modules directory will work.
|
||||
|
||||
The new modules need to be compiled and installed before you can make
|
||||
use of them:
|
||||
|
||||
|
||||
1. Make sure you're in the main source directory. (usually anope-1.X.XX/)
|
||||
2. Run `make modules` to compile any new or changed modules.
|
||||
3. Run `make install` to install the modules.
|
||||
2. Run ./Config to find and configure modules, then `cd build`.
|
||||
3. Run `make` to compile Anope, and any modules.
|
||||
4. Run `make install` to copy the compiled binaries to the ~/services/
|
||||
directory.
|
||||
|
||||
You can now use /msg OperServ MODLOAD to load the new modules.
|
||||
|
||||
@@ -115,7 +120,6 @@ Anope Modules
|
||||
|
||||
* http://wiki.anope.org/
|
||||
|
||||
|
||||
8) Modules Repository
|
||||
|
||||
You can find modules at http://modules.anope.org
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
Anope -- a set of IRC services for IRC networks
|
||||
-----------------------------------------------
|
||||
|
||||
Anope is 2003-2011 Anope Team <team@anope.org>.
|
||||
Anope is 2003-2012 Anope Team <team@anope.org>.
|
||||
Based on Epona 2000-2002 PegSoft <epona@pegsoft.net>.
|
||||
Based on Services 1996-1999 Andrew Church <achurch@achurch.org>.
|
||||
|
||||
|
||||
@@ -3,17 +3,6 @@ Legend:
|
||||
? = unsure
|
||||
+ = in progress
|
||||
|
||||
1.9.5
|
||||
-----
|
||||
[+] More LDAP
|
||||
[x] Rewrite silly forbid system
|
||||
[x] Fix the modules language system to work without needing its own functions..
|
||||
[x] Rewrite commands system
|
||||
[x] Rewrite access system
|
||||
[x] NS INFO: separate field for last seen realhost, shown to SRA only
|
||||
[x] Configurable bot usermodes
|
||||
|
||||
|
||||
Future
|
||||
------
|
||||
[ ] NS IDENTIFY changes
|
||||
|
||||
+2
-22
@@ -26,36 +26,16 @@ Anope for Windows
|
||||
(NOTE: When installing, tell CMake to add itself to the PATH.)
|
||||
|
||||
If you have Visual C++ 10 (2010) skip ahead to step 2, else you
|
||||
need to download the following free components from Microsoft. Once
|
||||
need to download the following free component from Microsoft. Once
|
||||
downloaded, install these packages.
|
||||
|
||||
* Microsoft Visual C++ 2010 Express Edition:
|
||||
http://www.microsoft.com/express/vc/
|
||||
|
||||
or
|
||||
|
||||
then download and install:
|
||||
|
||||
* Microsoft Windows 2008 SDK:
|
||||
http://www.microsoft.com/downloads/details.aspx?FamilyId=E6E1C3DF-A74F-4207-8586-711EBE331CDC&displaylang=en
|
||||
|
||||
(NOTE: Although they say for Windows Server 2003 or 2008, they do infact work on all supported
|
||||
versions of Windows. When installing the 2003 SDK, you should select the Custom option, and only select
|
||||
to have the Microsoft Windows Core SDK installed. When installing the 2008 SDK, you should select the
|
||||
Custom option, and only select to have the Developer Tools installed, but also expand that and deselect
|
||||
the Visual C++ Compilers as well as the Mobile Tools. Doing this will decrease the install time as well
|
||||
as the space used by the SDK.)
|
||||
|
||||
2) Unpack the Anope tarball with your favorite uncompression program
|
||||
(WinZip or WinRAR, etc).
|
||||
|
||||
3) (Note before this step: If you fall under one of the situations at the end of Step 1 where it says that the
|
||||
SDK will not work out of the box, do not bring up the Visual C++ Command Prompt by using the link in
|
||||
the Windows Start Menu. Instead, edit vsvars32.bat in the directory where you unpacked the source code
|
||||
in step 2, so the first line that says "@SET VSINSTALLDIR=<whatever>" has the directory where you installed
|
||||
Visual C++ Express to, if different from the default. Save the file and then run it instead.)
|
||||
|
||||
Bring up the Visual C++ Command Prompt; This will launch a
|
||||
3) Bring up the Visual C++ Command Prompt; This will launch a
|
||||
DOS Command Prompt like window, which will set the environment
|
||||
properties needed to make Anope.
|
||||
|
||||
|
||||
+2
-2
@@ -17,9 +17,9 @@ channel - Takes one parameter, a channel name, and returns real time information
|
||||
|
||||
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
|
||||
XMLRPC was designed to be used with db_sql, 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.
|
||||
as users and channels currently online. 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.
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?php
|
||||
/* XMLRPC Functions
|
||||
*
|
||||
* (C) 2003-2011 Anope Team
|
||||
* (C) 2003-2012 Anope Team
|
||||
* Contact us at team@anope.org
|
||||
*
|
||||
*/
|
||||
|
||||
+25
-10
@@ -7,7 +7,7 @@ get_target_property(version_BINARY version LOCATION)
|
||||
# Modify version.h from the above executable, with dependencies to version.cpp
|
||||
# and all of the source files in the main build
|
||||
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/version_build
|
||||
COMMAND ${version_BINARY} ${Anope_SOURCE_DIR}/src/version.sh ${CMAKE_CURRENT_BINARY_DIR}/version.h
|
||||
COMMAND ${version_BINARY} ${Anope_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/version.h
|
||||
DEPENDS version ${SRC_SRCS}
|
||||
)
|
||||
# Add version to list of files for CPack to ignore
|
||||
@@ -18,13 +18,27 @@ if(NOT WIN32)
|
||||
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")
|
||||
if(USE_PCH AND CMAKE_COMPILER_IS_GNUCXX)
|
||||
string(REPLACE " " ";" PCH_CXXFLAGS "${CXXFLAGS} ${CMAKE_CXX_FLAGS}")
|
||||
|
||||
file(GLOB PCH_SOURCES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.h")
|
||||
sort_list(PCH_SOURCES)
|
||||
|
||||
set(PCH_SOURCES "module.h;modules.h;services.h")
|
||||
foreach(PCH_SOURCE ${PCH_SOURCES})
|
||||
find_includes(${PCH_SOURCE} INCLUDES)
|
||||
set(INCLUDES_LIST)
|
||||
append_to_list(INCLUDES_LIST ${PCH_SOURCE})
|
||||
foreach(INCLUDE ${INCLUDES})
|
||||
# Extract the filename from the #include line
|
||||
extract_include_filename(${INCLUDE} FILENAME QUOTE_TYPE)
|
||||
if(QUOTE_TYPE STREQUAL "quotes")
|
||||
find_in_list(PCH_SOURCES "${FILENAME}" FOUND)
|
||||
if(NOT FOUND EQUAL -1)
|
||||
append_to_list(INCLUDES_LIST ${FILENAME})
|
||||
endif(NOT FOUND EQUAL -1)
|
||||
endif(QUOTE_TYPE STREQUAL "quotes")
|
||||
endforeach(INCLUDE)
|
||||
|
||||
set(PCH_EXTRAFLAGS "")
|
||||
if(DEBUG_BUILD)
|
||||
set(PCH_EXTRAFLAGS "-g")
|
||||
@@ -33,16 +47,17 @@ if(CMAKE_COMPILER_IS_GNUCXX)
|
||||
set(PCH_EXTRAFLAGS ${PCH_EXTRAFLAGS} -fPIC)
|
||||
endif(PCH_SOURCE STREQUAL "module.h")
|
||||
if(GETTEXT_INCLUDE)
|
||||
set(PCH_GETTEXT_INCLUDE "-I${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
|
||||
COMMAND ${CMAKE_CXX_COMPILER} ARGS ${PCH_CXXFLAGS} ${PCH_EXTRAFLAGS}
|
||||
${PCH_GETTEXT_INCLUDE} -I${CMAKE_CURRENT_BINARY_DIR} -I${Anope_SOURCE_DIR}/modules/pseudoclients ${CMAKE_CURRENT_SOURCE_DIR}/${PCH_SOURCE} -o ${CMAKE_CURRENT_BINARY_DIR}/${PCH_SOURCE}.gch
|
||||
DEPENDS ${INCLUDES_LIST} VERBATIM
|
||||
)
|
||||
endforeach(PCH_SOURCE ${PCH_SOURCES})
|
||||
endif(CMAKE_COMPILER_IS_GNUCXX)
|
||||
endif(USE_PCH AND CMAKE_COMPILER_IS_GNUCXX)
|
||||
|
||||
# Add a custom target to the above file
|
||||
add_custom_target(headers DEPENDS version ${CMAKE_CURRENT_BINARY_DIR}/version_build ${PCH_SOURCES_GCH})
|
||||
|
||||
+65
-52
@@ -1,48 +1,51 @@
|
||||
/*
|
||||
*
|
||||
* (C) 2003-2012 Anope Team
|
||||
* Contact us at team@anope.org
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
*
|
||||
* Based on the original code of Epona by Lara.
|
||||
* Based on the original code of Services by Andy Church.
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef ACCESS_H
|
||||
#define ACCESS_H
|
||||
|
||||
enum ChannelAccess
|
||||
#include "services.h"
|
||||
#include "anope.h"
|
||||
#include "serialize.h"
|
||||
#include "service.h"
|
||||
|
||||
enum
|
||||
{
|
||||
CA_ACCESS_LIST,
|
||||
CA_NOKICK,
|
||||
CA_FANTASIA,
|
||||
CA_GREET,
|
||||
CA_AUTOVOICE,
|
||||
CA_VOICEME,
|
||||
CA_VOICE,
|
||||
CA_INFO,
|
||||
CA_SAY,
|
||||
CA_AUTOHALFOP,
|
||||
CA_HALFOPME,
|
||||
CA_HALFOP,
|
||||
CA_KICK,
|
||||
CA_SIGNKICK,
|
||||
CA_BAN,
|
||||
CA_TOPIC,
|
||||
CA_MODE,
|
||||
CA_GETKEY,
|
||||
CA_INVITE,
|
||||
CA_UNBAN,
|
||||
CA_AUTOOP,
|
||||
CA_OPDEOPME,
|
||||
CA_OPDEOP,
|
||||
CA_AUTOPROTECT,
|
||||
CA_AKICK,
|
||||
CA_BADWORDS,
|
||||
CA_ASSIGN,
|
||||
CA_MEMO,
|
||||
CA_ACCESS_CHANGE,
|
||||
CA_PROTECTME,
|
||||
CA_PROTECT,
|
||||
CA_SET,
|
||||
CA_AUTOOWNER,
|
||||
CA_OWNERME,
|
||||
CA_OWNER,
|
||||
CA_FOUNDER,
|
||||
CA_SIZE
|
||||
ACCESS_INVALID = -10000,
|
||||
ACCESS_FOUNDER = 10001
|
||||
};
|
||||
|
||||
struct CoreExport Privilege
|
||||
{
|
||||
Anope::string name;
|
||||
Anope::string desc;
|
||||
int rank;
|
||||
|
||||
Privilege(const Anope::string &n, const Anope::string &d, int r);
|
||||
bool operator==(const Privilege &other) const;
|
||||
};
|
||||
|
||||
class CoreExport PrivilegeManager
|
||||
{
|
||||
static std::vector<Privilege> privs;
|
||||
public:
|
||||
static void AddPrivilege(Privilege p);
|
||||
static void RemovePrivilege(Privilege &p);
|
||||
static Privilege *FindPrivilege(const Anope::string &name);
|
||||
static std::vector<Privilege> &GetPrivileges();
|
||||
static void ClearPrivileges();
|
||||
};
|
||||
|
||||
class ChanAccess;
|
||||
|
||||
class CoreExport AccessProvider : public Service
|
||||
{
|
||||
@@ -50,13 +53,18 @@ class CoreExport AccessProvider : public Service
|
||||
AccessProvider(Module *o, const Anope::string &n);
|
||||
virtual ~AccessProvider();
|
||||
virtual ChanAccess *Create() = 0;
|
||||
|
||||
private:
|
||||
static std::list<AccessProvider *> providers;
|
||||
public:
|
||||
static const std::list<AccessProvider *>& GetProviders();
|
||||
};
|
||||
|
||||
class CoreExport ChanAccess
|
||||
class CoreExport ChanAccess : public Serializable
|
||||
{
|
||||
public:
|
||||
AccessProvider *provider;
|
||||
ChannelInfo *ci;
|
||||
serialize_obj<ChannelInfo> ci;
|
||||
Anope::string mask;
|
||||
Anope::string creator;
|
||||
time_t last_seen;
|
||||
@@ -64,26 +72,31 @@ class CoreExport ChanAccess
|
||||
|
||||
ChanAccess(AccessProvider *p);
|
||||
virtual ~ChanAccess();
|
||||
virtual bool Matches(User *u, NickCore *nc) = 0;
|
||||
virtual bool HasPriv(ChannelAccess priv) = 0;
|
||||
virtual Anope::string Serialize() = 0;
|
||||
|
||||
const Anope::string serialize_name() const anope_override;
|
||||
Serialize::Data serialize() const anope_override;
|
||||
static Serializable* unserialize(Serializable *obj, Serialize::Data &);
|
||||
|
||||
virtual bool Matches(const User *u, const NickCore *nc) const;
|
||||
virtual bool HasPriv(const Anope::string &name) const = 0;
|
||||
virtual Anope::string Serialize() const = 0;
|
||||
virtual void Unserialize(const Anope::string &data) = 0;
|
||||
|
||||
bool operator>(ChanAccess &other);
|
||||
bool operator<(ChanAccess &other);
|
||||
bool operator>=(ChanAccess &other);
|
||||
bool operator<=(ChanAccess &other);
|
||||
bool operator>(const ChanAccess &other) const;
|
||||
bool operator<(const ChanAccess &other) const;
|
||||
bool operator>=(const ChanAccess &other) const;
|
||||
bool operator<=(const ChanAccess &other) const;
|
||||
};
|
||||
|
||||
class CoreExport AccessGroup : public std::vector<ChanAccess *>
|
||||
{
|
||||
public:
|
||||
ChannelInfo *ci;
|
||||
NickCore *nc;
|
||||
const ChannelInfo *ci;
|
||||
const NickCore *nc;
|
||||
bool SuperAdmin, Founder;
|
||||
AccessGroup();
|
||||
bool HasPriv(ChannelAccess priv) const;
|
||||
ChanAccess *Highest() const;
|
||||
bool HasPriv(const Anope::string &priv) const;
|
||||
const ChanAccess *Highest() const;
|
||||
bool operator>(const AccessGroup &other) const;
|
||||
bool operator<(const AccessGroup &other) const;
|
||||
bool operator>=(const AccessGroup &other) const;
|
||||
|
||||
+82
-75
@@ -1,16 +1,30 @@
|
||||
/*
|
||||
*
|
||||
* (C) 2003-2012 Anope Team
|
||||
* Contact us at team@anope.org
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
*
|
||||
* Based on the original code of Epona by Lara.
|
||||
* Based on the original code of Services by Andy Church.
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef ACCOUNT_H
|
||||
#define ACCOUNT_H
|
||||
|
||||
#include "extensible.h"
|
||||
#include "serialize.h"
|
||||
#include "anope.h"
|
||||
|
||||
class NickAlias;
|
||||
class NickCore;
|
||||
#include "memo.h"
|
||||
#include "base.h"
|
||||
|
||||
typedef Anope::insensitive_map<NickAlias *> nickalias_map;
|
||||
typedef Anope::insensitive_map<NickCore *> nickcore_map;
|
||||
|
||||
extern CoreExport nickalias_map NickAliasList;
|
||||
extern CoreExport nickcore_map NickCoreList;
|
||||
extern CoreExport serialize_checker<nickalias_map> NickAliasList;
|
||||
extern CoreExport serialize_checker<nickcore_map> NickCoreList;
|
||||
|
||||
/* NickServ nickname structures. */
|
||||
|
||||
@@ -83,6 +97,8 @@ enum NickCoreFlag
|
||||
/* If set means the nick core does not have their email addrses confirmed.
|
||||
*/
|
||||
NI_UNCONFIRMED,
|
||||
/* Chanstats are enabled for this user */
|
||||
NI_STATS,
|
||||
|
||||
NI_END
|
||||
};
|
||||
@@ -90,17 +106,18 @@ enum NickCoreFlag
|
||||
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", ""
|
||||
"MEMO_MAIL", "HIDE_STATUS", "SUSPENDED", "AUTOOP", "FORBIDDEN", "UNCONFIRMED", "STATS", ""
|
||||
};
|
||||
|
||||
class NickCore;
|
||||
|
||||
class CoreExport NickAlias : public Extensible, public Flags<NickNameFlag, NS_END>
|
||||
class CoreExport NickAlias : public Extensible, public Flags<NickNameFlag, NS_END>, public Serializable
|
||||
{
|
||||
Anope::string vhost_ident, vhost_host, vhost_creator;
|
||||
time_t vhost_created;
|
||||
|
||||
public:
|
||||
/** Default constructor
|
||||
* @param nickname The nick
|
||||
* @param nickcore The nickcofe for this nick
|
||||
* @param nickcore The nickcore for this nick
|
||||
*/
|
||||
NickAlias(const Anope::string &nickname, NickCore *nickcore);
|
||||
|
||||
@@ -115,8 +132,11 @@ class CoreExport NickAlias : public Extensible, public Flags<NickNameFlag, NS_EN
|
||||
Anope::string last_realhost; /* Last uncloaked usermask, requires nickserv/auspex to see */
|
||||
time_t time_registered; /* When the nick was registered */
|
||||
time_t last_seen; /* When it was seen online for the last time */
|
||||
NickCore *nc; /* I'm an alias of this */
|
||||
HostInfo hostinfo;
|
||||
serialize_obj<NickCore> nc; /* I'm an alias of this */
|
||||
|
||||
const Anope::string serialize_name() const anope_override;
|
||||
Serialize::Data serialize() const anope_override;
|
||||
static Serializable* unserialize(Serializable *obj, Serialize::Data &);
|
||||
|
||||
/** Release a nick
|
||||
* See the comment in users.cpp
|
||||
@@ -129,9 +149,46 @@ class CoreExport NickAlias : public Extensible, public Flags<NickNameFlag, NS_EN
|
||||
* @param u The user
|
||||
*/
|
||||
void OnCancel(User *u);
|
||||
|
||||
/** Set a vhost for the user
|
||||
* @param ident The ident
|
||||
* @param host The host
|
||||
* @param creator Who created the vhost
|
||||
* @param time When the vhost was craated
|
||||
*/
|
||||
void SetVhost(const Anope::string &ident, const Anope::string &host, const Anope::string &creator, time_t created = Anope::CurTime);
|
||||
|
||||
/** Remove a users vhost
|
||||
**/
|
||||
void RemoveVhost();
|
||||
|
||||
/** Check if the user has a vhost
|
||||
* @return true or false
|
||||
*/
|
||||
bool HasVhost() const;
|
||||
|
||||
/** Retrieve the vhost ident
|
||||
* @return the ident
|
||||
*/
|
||||
const Anope::string &GetVhostIdent() const;
|
||||
|
||||
/** Retrieve the vhost host
|
||||
* @return the host
|
||||
*/
|
||||
const Anope::string &GetVhostHost() const;
|
||||
|
||||
/** Retrieve the vhost creator
|
||||
* @return the creator
|
||||
*/
|
||||
const Anope::string &GetVhostCreator() const;
|
||||
|
||||
/** Retrieve when the vhost was created
|
||||
* @return the time it was created
|
||||
*/
|
||||
time_t GetVhostCreated() const;
|
||||
};
|
||||
|
||||
class CoreExport NickCore : public Extensible, public Flags<NickCoreFlag, NI_END>
|
||||
class CoreExport NickCore : public Extensible, public Flags<NickCoreFlag, NI_END>, public Serializable
|
||||
{
|
||||
public:
|
||||
/** Default constructor
|
||||
@@ -153,13 +210,17 @@ class CoreExport NickCore : public Extensible, public Flags<NickCoreFlag, NI_END
|
||||
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;
|
||||
|
||||
/* Unsaved data */
|
||||
uint16_t channelcount; /* Number of channels currently registered */
|
||||
time_t lastmail; /* Last time this nick record got a mail */
|
||||
std::list<NickAlias *> aliases; /* List of aliases */
|
||||
std::list<serialize_obj<NickAlias> > aliases; /* List of aliases */
|
||||
|
||||
const Anope::string serialize_name() const anope_override;
|
||||
Serialize::Data serialize() const anope_override;
|
||||
static Serializable* unserialize(Serializable *obj, Serialize::Data &);
|
||||
|
||||
/** Checks whether this account is a services oper or not.
|
||||
* @return True if this account is a services oper, false otherwise.
|
||||
@@ -230,7 +291,7 @@ class CoreExport NickCore : public Extensible, public Flags<NickCoreFlag, NI_END
|
||||
*
|
||||
* Search for an fingerprint within the cert list.
|
||||
*/
|
||||
bool FindCert(const Anope::string &entry);
|
||||
bool FindCert(const Anope::string &entry) const;
|
||||
|
||||
/** Erase a fingerprint from the nick's certificate list
|
||||
*
|
||||
@@ -248,65 +309,11 @@ class CoreExport NickCore : public Extensible, public Flags<NickCoreFlag, NI_END
|
||||
|
||||
};
|
||||
|
||||
/** Timer for colliding nicks to force people off of nicknames
|
||||
*/
|
||||
class CoreExport NickServCollide : public Timer
|
||||
{
|
||||
dynamic_reference<User> u;
|
||||
Anope::string nick;
|
||||
extern CoreExport void change_core_display(NickCore *nc);
|
||||
extern CoreExport void change_core_display(NickCore *nc, const Anope::string &newdisplay);
|
||||
|
||||
public:
|
||||
/** Default constructor
|
||||
* @param nick The nick we're colliding
|
||||
* @param delay How long to delay before kicking the user off the nick
|
||||
*/
|
||||
NickServCollide(User *user, time_t delay);
|
||||
|
||||
/** Default destructor
|
||||
*/
|
||||
virtual ~NickServCollide();
|
||||
|
||||
/** Called when the delay is up
|
||||
* @param t The current time
|
||||
*/
|
||||
void Tick(time_t t);
|
||||
};
|
||||
|
||||
/** Timers for removing HELD status from nicks.
|
||||
*/
|
||||
class NickServHeld : public Timer
|
||||
{
|
||||
dynamic_reference<NickAlias> na;
|
||||
Anope::string nick;
|
||||
public:
|
||||
NickServHeld(NickAlias *n, long t);
|
||||
|
||||
~NickServHeld();
|
||||
|
||||
void Tick(time_t);
|
||||
};
|
||||
|
||||
/** Timers for releasing nicks to be available for use
|
||||
*/
|
||||
class CoreExport NickServRelease : public User, public Timer
|
||||
{
|
||||
Anope::string nick;
|
||||
|
||||
public:
|
||||
/** Default constructor
|
||||
* @param na The nick
|
||||
* @param delay The delay before the nick is released
|
||||
*/
|
||||
NickServRelease(NickAlias *na, time_t delay);
|
||||
|
||||
/** Default destructor
|
||||
*/
|
||||
virtual ~NickServRelease();
|
||||
|
||||
/** Called when the delay is up
|
||||
* @param t The current time
|
||||
*/
|
||||
void Tick(time_t t);
|
||||
};
|
||||
extern CoreExport NickAlias *findnick(const Anope::string &nick);
|
||||
extern CoreExport NickCore *findcore(const Anope::string &nick);
|
||||
extern CoreExport bool is_on_access(const User *u, const NickCore *nc);
|
||||
|
||||
#endif // ACCOUNT_H
|
||||
|
||||
+264
-100
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* (C) 2003-2011 Anope Team
|
||||
* (C) 2003-2012 Anope Team
|
||||
* Contact us at team@anope.org
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
@@ -11,29 +11,24 @@
|
||||
#ifndef ANOPE_H
|
||||
#define ANOPE_H
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <set>
|
||||
#include "hashcomp.h"
|
||||
|
||||
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> > { };
|
||||
template<typename T> class insensitive_map : public std::map<string, T, ci::less> { };
|
||||
|
||||
/**
|
||||
* 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
|
||||
* at any time to a specific type of string.
|
||||
*/
|
||||
class string
|
||||
class CoreExport string
|
||||
{
|
||||
private:
|
||||
/**
|
||||
* The actual string is stored in an std::string as it can be converted to
|
||||
* ci::string, irc::string, or a C-style string at any time.
|
||||
* ci::string, or a C-style string at any time.
|
||||
*/
|
||||
std::string _string;
|
||||
public:
|
||||
@@ -56,7 +51,6 @@ namespace Anope
|
||||
string(const char *_str) : _string(_str) { }
|
||||
string(const std::string &_str) : _string(_str) { }
|
||||
string(const ci::string &_str) : _string(_str.c_str()) { }
|
||||
string(const irc::string &_str) : _string(_str.c_str()) { }
|
||||
string(const string &_str, size_type pos = 0, size_type n = npos) : _string(_str._string, pos, n) { }
|
||||
template <class InputIterator> string(InputIterator first, InputIterator last) : _string(first, last) { }
|
||||
|
||||
@@ -66,8 +60,6 @@ namespace Anope
|
||||
inline string &operator=(char chr) { this->_string = chr; return *this; }
|
||||
inline string &operator=(const char *_str) { this->_string = _str; return *this; }
|
||||
inline string &operator=(const std::string &_str) { this->_string = _str; return *this; }
|
||||
inline string &operator=(const ci::string &_str) { this->_string = _str.c_str(); return *this; }
|
||||
inline string &operator=(const irc::string &_str) { this->_string = _str.c_str(); return *this; }
|
||||
inline string &operator=(const string &_str) { if (this != &_str) this->_string = _str._string; return *this; }
|
||||
|
||||
/**
|
||||
@@ -75,35 +67,21 @@ namespace Anope
|
||||
*/
|
||||
inline bool operator==(const char *_str) const { return this->_string == _str; }
|
||||
inline bool operator==(const std::string &_str) const { return this->_string == _str; }
|
||||
inline bool operator==(const ci::string &_str) const { return ci::string(this->_string.c_str()) == _str; }
|
||||
inline bool operator==(const irc::string &_str) const { return irc::string(this->_string.c_str()) == _str; }
|
||||
inline bool operator==(const string &_str) const { return this->_string == _str._string; }
|
||||
|
||||
inline bool equals_cs(const char *_str) const { return this->_string == _str; }
|
||||
inline bool equals_cs(const std::string &_str) const { return this->_string == _str; }
|
||||
inline bool equals_cs(const ci::string &_str) const { return this->_string == _str.c_str(); }
|
||||
inline bool equals_cs(const irc::string &_str) const { return this->_string == _str.c_str(); }
|
||||
inline bool equals_cs(const string &_str) const { return this->_string == _str._string; }
|
||||
|
||||
inline bool equals_ci(const char *_str) const { return ci::string(this->_string.c_str()) == _str; }
|
||||
inline bool equals_ci(const std::string &_str) const { return ci::string(this->_string.c_str()) == _str.c_str(); }
|
||||
inline bool equals_ci(const ci::string &_str) const { return _str == this->_string.c_str(); }
|
||||
inline bool equals_ci(const irc::string &_str) const { return ci::string(this->_string.c_str()) == _str.c_str(); }
|
||||
inline bool equals_ci(const string &_str) const { return ci::string(this->_string.c_str()) == _str._string.c_str(); }
|
||||
|
||||
inline bool equals_irc(const char *_str) const { return irc::string(this->_string.c_str()) == _str; }
|
||||
inline bool equals_irc(const std::string &_str) const { return irc::string(this->_string.c_str()) == _str.c_str(); }
|
||||
inline bool equals_irc(const ci::string &_str) const { return irc::string(this->_string.c_str()) == _str.c_str(); }
|
||||
inline bool equals_irc(const irc::string &_str) const { return _str == this->_string.c_str(); }
|
||||
inline bool equals_irc(const string &_str) const { return irc::string(this->_string.c_str()) == _str._string.c_str(); }
|
||||
|
||||
/**
|
||||
* Inequality operators, exact opposites of the above.
|
||||
*/
|
||||
inline bool operator!=(const char *_str) const { return !operator==(_str); }
|
||||
inline bool operator!=(const std::string &_str) const { return !operator==(_str); }
|
||||
inline bool operator!=(const ci::string &_str) const { return !operator==(_str); }
|
||||
inline bool operator!=(const irc::string &_str) const { return !operator==(_str); }
|
||||
inline bool operator!=(const string &_str) const { return !operator==(_str); }
|
||||
|
||||
/**
|
||||
@@ -112,8 +90,6 @@ namespace Anope
|
||||
inline string &operator+=(char chr) { this->_string += chr; return *this; }
|
||||
inline string &operator+=(const char *_str) { this->_string += _str; return *this; }
|
||||
inline string &operator+=(const std::string &_str) { this->_string += _str; return *this; }
|
||||
inline string &operator+=(const ci::string &_str) { this->_string += _str.c_str(); return *this; }
|
||||
inline string &operator+=(const irc::string &_str) { this->_string += _str.c_str(); return *this; }
|
||||
inline string &operator+=(const string &_str) { if (this != &_str) this->_string += _str._string; return *this; }
|
||||
|
||||
/**
|
||||
@@ -122,15 +98,11 @@ namespace Anope
|
||||
inline const string operator+(char chr) const { return string(*this) += chr; }
|
||||
inline const string operator+(const char *_str) const { return string(*this) += _str; }
|
||||
inline const string operator+(const std::string &_str) const { return string(*this) += _str; }
|
||||
inline const string operator+(const ci::string &_str) const { return string(*this) += _str; }
|
||||
inline const string operator+(const irc::string &_str) const { return string(*this) += _str; }
|
||||
inline const string operator+(const string &_str) const { return string(*this) += _str; }
|
||||
|
||||
friend const string operator+(char chr, const string &str);
|
||||
friend const string operator+(const char *_str, const string &str);
|
||||
friend const string operator+(const std::string &_str, const string &str);
|
||||
friend const string operator+(const ci::string &_str, const string &str);
|
||||
friend const string operator+(const irc::string &_str, const string &str);
|
||||
|
||||
/**
|
||||
* Less-than operator.
|
||||
@@ -144,7 +116,6 @@ namespace Anope
|
||||
inline std::string &str() { return this->_string; }
|
||||
inline const std::string &str() const { return this->_string; }
|
||||
inline ci::string ci_str() const { return ci::string(this->_string.c_str()); }
|
||||
inline irc::string irc_str() const { return irc::string(this->_string.c_str()); }
|
||||
|
||||
/**
|
||||
* Returns if the string is empty or not.
|
||||
@@ -258,6 +229,28 @@ namespace Anope
|
||||
return new_string;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the string in lowercase.
|
||||
*/
|
||||
inline string lower()
|
||||
{
|
||||
Anope::string new_string = *this;
|
||||
for (size_type i = 0; i < new_string.length(); ++i)
|
||||
new_string[i] = std::tolower(new_string[i], Anope::casemap);
|
||||
return new_string;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the string in uppercase.
|
||||
*/
|
||||
inline string upper()
|
||||
{
|
||||
Anope::string new_string = *this;
|
||||
for (size_type i = 0; i < new_string.length(); ++i)
|
||||
new_string[i] = std::toupper(new_string[i], Anope::casemap);
|
||||
return new_string;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a substring of the string.
|
||||
*/
|
||||
@@ -308,8 +301,6 @@ namespace Anope
|
||||
inline const string operator+(char chr, const string &str) { string tmp(chr); tmp += str; return tmp; }
|
||||
inline const string operator+(const char *_str, const string &str) { string tmp(_str); tmp += str; return tmp; }
|
||||
inline const string operator+(const std::string &_str, const string &str) { string tmp(_str); tmp += str; return tmp; }
|
||||
inline const string operator+(const ci::string &_str, const string &str) { string tmp(_str); tmp += str; return tmp; }
|
||||
inline const string operator+(const irc::string &_str, const string &str) { string tmp(_str); tmp += str; return tmp; }
|
||||
|
||||
static const char *const compiled = __TIME__ " " __DATE__;
|
||||
|
||||
@@ -324,14 +315,14 @@ namespace Anope
|
||||
extern CoreExport int VersionMajor();
|
||||
extern CoreExport int VersionMinor();
|
||||
extern CoreExport int VersionPatch();
|
||||
extern CoreExport int VersionBuild();
|
||||
|
||||
/** Check whether two strings match.
|
||||
* @param str The string to check against the pattern (e.g. foobar)
|
||||
* @param mask The pattern to check (e.g. foo*bar)
|
||||
* @param case_sensitive Whether or not the match is case sensitive, default false.
|
||||
* @param use_regex Whether or not to try regex. case_sensitive is not used in regex.
|
||||
*/
|
||||
extern CoreExport bool Match(const Anope::string &str, const Anope::string &mask, bool case_sensitive = false);
|
||||
extern CoreExport bool Match(const string &str, const string &mask, bool case_sensitive = false, bool use_regex = false);
|
||||
|
||||
/** Find a message in the message table
|
||||
* @param name The name of the message were looking for
|
||||
@@ -350,20 +341,20 @@ namespace Anope
|
||||
* @param src The data to be converted
|
||||
* @param dest The destination string
|
||||
*/
|
||||
extern CoreExport void Unhex(const Anope::string &src, Anope::string &dest);
|
||||
extern CoreExport void Unhex(const Anope::string &src, char *dest);
|
||||
extern CoreExport void Unhex(const string &src, string &dest);
|
||||
extern CoreExport void Unhex(const string &src, char *dest, size_t sz);
|
||||
|
||||
/** Base 64 encode a string
|
||||
* @param src The string to encode
|
||||
* @param target Where the encoded string is placed
|
||||
*/
|
||||
extern CoreExport void B64Encode(const Anope::string &src, Anope::string &target);
|
||||
extern CoreExport void B64Encode(const string &src, string &target);
|
||||
|
||||
/** Base 64 decode a string
|
||||
* @param src The base64 encoded string
|
||||
* @param target The plain text result
|
||||
*/
|
||||
extern CoreExport void B64Decode(const Anope::string &src, Anope::string &target);
|
||||
extern CoreExport void B64Decode(const string &src, string &target);
|
||||
|
||||
/** Returns a sequence of data formatted as the format argument specifies.
|
||||
** After the format parameter, the function expects at least as many
|
||||
@@ -382,7 +373,7 @@ namespace Anope
|
||||
/** Return the last error, uses errno/GetLastError() to determine this
|
||||
* @return An error message
|
||||
*/
|
||||
extern CoreExport const Anope::string LastError();
|
||||
extern CoreExport const string LastError();
|
||||
}
|
||||
|
||||
/** sepstream allows for splitting token seperated lists.
|
||||
@@ -448,89 +439,262 @@ class spacesepstream : public sepstream
|
||||
spacesepstream(const Anope::string &source) : sepstream(source, ' ') { }
|
||||
};
|
||||
|
||||
/** The base class that most classes in Anope inherit from
|
||||
/** This class can be used on its own to represent an exception, or derived to represent a module-specific exception.
|
||||
* When a module whishes to abort, e.g. within a constructor, it should throw an exception using ModuleException or
|
||||
* a class derived from ModuleException. If a module throws an exception during its constructor, the module will not
|
||||
* be loaded. If this happens, the error message returned by ModuleException::GetReason will be displayed to the user
|
||||
* attempting to load the module, or dumped to the console if the ircd is currently loading for the first time.
|
||||
*/
|
||||
class dynamic_reference_base;
|
||||
class CoreExport Base
|
||||
{
|
||||
/* References to this base class */
|
||||
std::set<dynamic_reference_base *> References;
|
||||
public:
|
||||
Base();
|
||||
virtual ~Base();
|
||||
void AddReference(dynamic_reference_base *r);
|
||||
void DelReference(dynamic_reference_base *r);
|
||||
};
|
||||
|
||||
class dynamic_reference_base : public Base
|
||||
class CoreException : public std::exception
|
||||
{
|
||||
protected:
|
||||
bool invalid;
|
||||
/** Holds the error message to be displayed
|
||||
*/
|
||||
Anope::string err;
|
||||
/** Source of the exception
|
||||
*/
|
||||
Anope::string source;
|
||||
public:
|
||||
dynamic_reference_base() : invalid(false) { }
|
||||
virtual ~dynamic_reference_base() { }
|
||||
inline void Invalidate() { this->invalid = true; }
|
||||
/** Default constructor, just uses the error mesage 'Core threw an exception'.
|
||||
*/
|
||||
CoreException() : err("Core threw an exception"), source("The core") { }
|
||||
/** This constructor can be used to specify an error message before throwing.
|
||||
*/
|
||||
CoreException(const Anope::string &message) : err(message), source("The core") { }
|
||||
/** This constructor can be used to specify an error message before throwing,
|
||||
* and to specify the source of the exception.
|
||||
*/
|
||||
CoreException(const Anope::string &message, const Anope::string &src) : err(message), source(src) { }
|
||||
/** This destructor solves world hunger, cancels the world debt, and causes the world to end.
|
||||
* Actually no, it does nothing. Never mind.
|
||||
* @throws Nothing!
|
||||
*/
|
||||
virtual ~CoreException() throw() { }
|
||||
/** Returns the reason for the exception.
|
||||
* The module should probably put something informative here as the user will see this upon failure.
|
||||
*/
|
||||
virtual const Anope::string &GetReason() const
|
||||
{
|
||||
return err;
|
||||
}
|
||||
|
||||
virtual const Anope::string &GetSource() const
|
||||
{
|
||||
return source;
|
||||
}
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
class dynamic_reference : public dynamic_reference_base
|
||||
class FatalException : public CoreException
|
||||
{
|
||||
public:
|
||||
FatalException(const Anope::string &reason = "") : CoreException(reason) { }
|
||||
|
||||
virtual ~FatalException() throw() { }
|
||||
};
|
||||
|
||||
class ModuleException : public CoreException
|
||||
{
|
||||
public:
|
||||
/** Default constructor, just uses the error mesage 'Module threw an exception'.
|
||||
*/
|
||||
ModuleException() : CoreException("Module threw an exception", "A Module") { }
|
||||
|
||||
/** This constructor can be used to specify an error message before throwing.
|
||||
*/
|
||||
ModuleException(const Anope::string &message) : CoreException(message, "A Module") { }
|
||||
/** This destructor solves world hunger, cancels the world debt, and causes the world to end.
|
||||
* Actually no, it does nothing. Never mind.
|
||||
* @throws Nothing!
|
||||
*/
|
||||
virtual ~ModuleException() throw() { }
|
||||
};
|
||||
|
||||
class ConvertException : public CoreException
|
||||
{
|
||||
public:
|
||||
ConvertException(const Anope::string &reason = "") : CoreException(reason) { }
|
||||
|
||||
virtual ~ConvertException() throw() { }
|
||||
};
|
||||
|
||||
/** Convert something to a string
|
||||
*/
|
||||
template<typename T> inline Anope::string stringify(const T &x)
|
||||
{
|
||||
std::ostringstream stream;
|
||||
|
||||
if (!(stream << x))
|
||||
throw ConvertException("Stringify fail");
|
||||
|
||||
return stream.str();
|
||||
}
|
||||
|
||||
template<typename T> inline void convert(const Anope::string &s, T &x, Anope::string &leftover, bool failIfLeftoverChars = true)
|
||||
{
|
||||
leftover.clear();
|
||||
std::istringstream i(s.str());
|
||||
char c;
|
||||
bool res = i >> x;
|
||||
if (!res)
|
||||
throw ConvertException("Convert fail");
|
||||
if (failIfLeftoverChars)
|
||||
{
|
||||
if (i.get(c))
|
||||
throw ConvertException("Convert fail");
|
||||
}
|
||||
else
|
||||
{
|
||||
std::string left;
|
||||
getline(i, left);
|
||||
leftover = left;
|
||||
}
|
||||
}
|
||||
|
||||
template<typename T> inline void convert(const Anope::string &s, T &x, bool failIfLeftoverChars = true)
|
||||
{
|
||||
Anope::string Unused;
|
||||
convert(s, x, Unused, failIfLeftoverChars);
|
||||
}
|
||||
|
||||
template<typename T> inline T convertTo(const Anope::string &s, Anope::string &leftover, bool failIfLeftoverChars = true)
|
||||
{
|
||||
T x;
|
||||
convert(s, x, leftover, failIfLeftoverChars);
|
||||
return x;
|
||||
}
|
||||
|
||||
template<typename T> inline T convertTo(const Anope::string &s, bool failIfLeftoverChars = true)
|
||||
{
|
||||
T x;
|
||||
convert(s, x, failIfLeftoverChars);
|
||||
return x;
|
||||
}
|
||||
|
||||
/** Casts to be used instead of dynamic_cast, this uses dynamic_cast
|
||||
* for debug builds and static_cast/reinterpret_cast on releass builds
|
||||
* to speed up the program because dynamic_cast relies on RTTI.
|
||||
*/
|
||||
#ifdef DEBUG_BUILD
|
||||
# include <typeinfo>
|
||||
#endif
|
||||
template<typename T, typename O> inline T anope_dynamic_static_cast(O ptr)
|
||||
{
|
||||
#ifdef DEBUG_BUILD
|
||||
T ret = dynamic_cast<T>(ptr);
|
||||
if (ptr != NULL && ret == NULL)
|
||||
throw CoreException(Anope::string("anope_dynamic_static_cast<") + typeid(T).name() + ">(" + typeid(O).name() + ") fail");
|
||||
return ret;
|
||||
#else
|
||||
return static_cast<T>(ptr);
|
||||
#endif
|
||||
}
|
||||
|
||||
template<typename T, typename O> inline T anope_dynamic_reinterpret_cast(O ptr)
|
||||
{
|
||||
#ifdef DEBUG_BUILD
|
||||
T ret = dynamic_cast<T>(ptr);
|
||||
if (ptr != NULL && ret == NULL)
|
||||
throw CoreException(Anope::string("anope_dynamic_reinterpret_cast<") + typeid(T).name() + ">(" + typeid(O).name() + ") fail");
|
||||
return ret;
|
||||
#else
|
||||
return reinterpret_cast<T>(ptr);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*************************************************************************/
|
||||
|
||||
/** Class with the ability to keep flags on items, they should extend from this
|
||||
* where T is an enum.
|
||||
*/
|
||||
template<typename T, size_t Size = 32> class Flags
|
||||
{
|
||||
protected:
|
||||
T *ref;
|
||||
std::bitset<Size> Flag_Values;
|
||||
const Anope::string *Flag_Strings;
|
||||
|
||||
public:
|
||||
dynamic_reference(T *obj) : ref(obj)
|
||||
Flags() : Flag_Strings(NULL) { }
|
||||
Flags(const Anope::string *flag_strings) : Flag_Strings(flag_strings) { }
|
||||
|
||||
/** Add a flag to this item
|
||||
* @param Value The flag
|
||||
*/
|
||||
void SetFlag(T Value)
|
||||
{
|
||||
if (ref)
|
||||
ref->AddReference(this);
|
||||
Flag_Values[Value] = true;
|
||||
}
|
||||
|
||||
virtual ~dynamic_reference()
|
||||
/** Remove a flag from this item
|
||||
* @param Value The flag
|
||||
*/
|
||||
void UnsetFlag(T Value)
|
||||
{
|
||||
if (this->invalid)
|
||||
{
|
||||
this->invalid = false;
|
||||
this->ref = NULL;
|
||||
}
|
||||
else if (this->operator bool())
|
||||
ref->DelReference(this);
|
||||
Flag_Values[Value] = false;
|
||||
}
|
||||
|
||||
virtual operator bool()
|
||||
/** Check if this item has a flag
|
||||
* @param Value The flag
|
||||
* @return true or false
|
||||
*/
|
||||
bool HasFlag(T Value) const
|
||||
{
|
||||
if (this->invalid)
|
||||
{
|
||||
this->invalid = false;
|
||||
this->ref = NULL;
|
||||
}
|
||||
return this->ref != NULL;
|
||||
return Flag_Values.test(Value);
|
||||
}
|
||||
|
||||
virtual inline operator T*()
|
||||
/** Check how many flags are set
|
||||
* @return The number of flags set
|
||||
*/
|
||||
size_t FlagCount() const
|
||||
{
|
||||
if (this->operator bool())
|
||||
return this->ref;
|
||||
return NULL;
|
||||
return Flag_Values.count();
|
||||
}
|
||||
|
||||
virtual inline T *operator->()
|
||||
/** Unset all of the flags
|
||||
*/
|
||||
void ClearFlags()
|
||||
{
|
||||
if (this->operator bool())
|
||||
return this->ref;
|
||||
return NULL;
|
||||
Flag_Values.reset();
|
||||
}
|
||||
|
||||
virtual inline void operator=(T *newref)
|
||||
Anope::string ToString() const
|
||||
{
|
||||
if (this->invalid)
|
||||
{
|
||||
this->invalid = false;
|
||||
this->ref = NULL;
|
||||
}
|
||||
else if (this->operator bool())
|
||||
this->ref->DelReference(this);
|
||||
this->ref = newref;
|
||||
if (this->operator bool())
|
||||
this->ref->AddReference(this);
|
||||
std::vector<Anope::string> v = ToVector();
|
||||
Anope::string flag_buf;
|
||||
for (unsigned i = 0; i < v.size(); ++i)
|
||||
flag_buf += v[i] + " ";
|
||||
flag_buf.trim();
|
||||
return flag_buf;
|
||||
}
|
||||
|
||||
void FromString(const Anope::string &str)
|
||||
{
|
||||
spacesepstream sep(str);
|
||||
Anope::string buf;
|
||||
std::vector<Anope::string> v;
|
||||
|
||||
while (sep.GetToken(buf))
|
||||
v.push_back(buf);
|
||||
|
||||
FromVector(v);
|
||||
}
|
||||
|
||||
std::vector<Anope::string> ToVector() const
|
||||
{
|
||||
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 FromVector(const std::vector<Anope::string> &strings)
|
||||
{
|
||||
this->ClearFlags();
|
||||
|
||||
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));
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
+115
@@ -0,0 +1,115 @@
|
||||
/*
|
||||
*
|
||||
* Copyright (C) 2008-2011 Adam <Adam@anope.org>
|
||||
* Copyright (C) 2008-2012 Anope Team <team@anope.org>
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
*/
|
||||
|
||||
#ifndef BASE_H
|
||||
#define BASE_H
|
||||
|
||||
#include "services.h"
|
||||
|
||||
/** The base class that most classes in Anope inherit from
|
||||
*/
|
||||
class CoreExport Base
|
||||
{
|
||||
/* References to this base class */
|
||||
std::set<dynamic_reference_base *> References;
|
||||
public:
|
||||
Base();
|
||||
virtual ~Base();
|
||||
void AddReference(dynamic_reference_base *r);
|
||||
void DelReference(dynamic_reference_base *r);
|
||||
};
|
||||
|
||||
class dynamic_reference_base
|
||||
{
|
||||
protected:
|
||||
bool invalid;
|
||||
public:
|
||||
dynamic_reference_base() : invalid(false) { }
|
||||
dynamic_reference_base(const dynamic_reference_base &other) : invalid(other.invalid) { }
|
||||
virtual ~dynamic_reference_base() { }
|
||||
inline void Invalidate() { this->invalid = true; }
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
class dynamic_reference : public dynamic_reference_base
|
||||
{
|
||||
protected:
|
||||
T *ref;
|
||||
public:
|
||||
dynamic_reference() : ref(NULL)
|
||||
{
|
||||
}
|
||||
|
||||
dynamic_reference(T *obj) : ref(obj)
|
||||
{
|
||||
if (ref)
|
||||
ref->AddReference(this);
|
||||
}
|
||||
|
||||
dynamic_reference(const dynamic_reference<T> &other) : dynamic_reference_base(other), ref(other.ref)
|
||||
{
|
||||
if (operator bool())
|
||||
ref->AddReference(this);
|
||||
}
|
||||
|
||||
virtual ~dynamic_reference()
|
||||
{
|
||||
if (operator bool())
|
||||
ref->DelReference(this);
|
||||
}
|
||||
|
||||
/* We explicitly call operator bool here in several places to prevent other
|
||||
* operators, such operator T*, from being called instead, which will mess
|
||||
* with any class inheriting from this that overloads this operator.
|
||||
*/
|
||||
virtual operator bool()
|
||||
{
|
||||
if (!this->invalid)
|
||||
return this->ref != NULL;
|
||||
return false;
|
||||
}
|
||||
|
||||
inline operator T*()
|
||||
{
|
||||
if (operator bool())
|
||||
return this->ref;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
inline T* operator->()
|
||||
{
|
||||
if (operator bool())
|
||||
return this->ref;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
inline void operator=(T *newref)
|
||||
{
|
||||
if (operator bool())
|
||||
this->ref->DelReference(this);
|
||||
this->ref = newref;
|
||||
this->invalid = false;
|
||||
if (operator bool())
|
||||
this->ref->AddReference(this);
|
||||
}
|
||||
|
||||
inline bool operator<(const dynamic_reference<T> &other) const
|
||||
{
|
||||
return this < &other;
|
||||
}
|
||||
|
||||
inline bool operator==(const dynamic_reference<T> &other)
|
||||
{
|
||||
if (!this->invalid)
|
||||
return this->ref == other;
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
#endif // BASE_H
|
||||
|
||||
+25
-6
@@ -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-2012 Anope Team <team@anope.org>
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
*/
|
||||
@@ -8,11 +8,17 @@
|
||||
#ifndef BOTS_H
|
||||
#define BOTS_H
|
||||
|
||||
class BotInfo;
|
||||
#include "users.h"
|
||||
#include "anope.h"
|
||||
#include "serialize.h"
|
||||
#include "commands.h"
|
||||
|
||||
|
||||
extern CoreExport Anope::insensitive_map<BotInfo *> BotListByNick;
|
||||
extern CoreExport Anope::map<BotInfo *> BotListByUID;
|
||||
typedef Anope::insensitive_map<BotInfo *> botinfo_map;
|
||||
typedef Anope::map<BotInfo *> botinfouid_map;
|
||||
|
||||
extern CoreExport serialize_checker<botinfo_map> BotListByNick;
|
||||
extern CoreExport serialize_checker<botinfouid_map> BotListByUID;
|
||||
|
||||
/** Flags settable on a bot
|
||||
*/
|
||||
@@ -32,15 +38,15 @@ enum BotFlag
|
||||
|
||||
static const Anope::string BotFlagString[] = { "BEGIN", "CORE", "PRIVATE", "CONF", "" };
|
||||
|
||||
class CoreExport BotInfo : public User, public Flags<BotFlag, BI_END>
|
||||
class CoreExport BotInfo : public User, public Flags<BotFlag, BI_END>, public Serializable
|
||||
{
|
||||
public:
|
||||
uint32 chancount;
|
||||
time_t created; /* Birth date ;) */
|
||||
time_t lastmsg; /* Last time we said something */
|
||||
typedef Anope::insensitive_map<CommandInfo> command_map;
|
||||
command_map commands; /* Commands, actual name to service name */
|
||||
Anope::string botmodes; /* Modes the bot should have as configured in service:modes */
|
||||
std::vector<Anope::string> botchannels; /* Channels the bot should be in as configured in service:channels */
|
||||
bool introduced; /* Whether or not this bot is introduced */
|
||||
|
||||
/** Create a new bot.
|
||||
@@ -56,6 +62,10 @@ class CoreExport BotInfo : public User, public Flags<BotFlag, BI_END>
|
||||
*/
|
||||
virtual ~BotInfo();
|
||||
|
||||
const Anope::string serialize_name() const;
|
||||
Serialize::Data serialize() const;
|
||||
static Serializable* unserialize(Serializable *obj, Serialize::Data &);
|
||||
|
||||
void GenerateUID();
|
||||
|
||||
/** Change the nickname for the bot.
|
||||
@@ -80,6 +90,10 @@ class CoreExport BotInfo : public User, public Flags<BotFlag, BI_END>
|
||||
*/
|
||||
void UnAssign(User *u, ChannelInfo *ci);
|
||||
|
||||
/** Get the number of channels this bot is assigned to
|
||||
*/
|
||||
unsigned GetChannelCount() const;
|
||||
|
||||
/** Join this bot to a channel
|
||||
* @param c The channel
|
||||
* @param status The status the bot should have on the channel
|
||||
@@ -118,4 +132,9 @@ class CoreExport BotInfo : public User, public Flags<BotFlag, BI_END>
|
||||
CommandInfo *GetCommand(const Anope::string &cname);
|
||||
};
|
||||
|
||||
extern CoreExport BotInfo *findbot(const Anope::string &nick);
|
||||
|
||||
extern CoreExport void bot_raw_ban(User *requester, ChannelInfo *ci, const Anope::string &nick, const Anope::string &reason);
|
||||
extern CoreExport void bot_raw_kick(User *requester, ChannelInfo *ci, const Anope::string &nick, const Anope::string &reason);
|
||||
|
||||
#endif // BOTS_H
|
||||
|
||||
@@ -0,0 +1,79 @@
|
||||
/*
|
||||
*
|
||||
* (C) 2003-2012 Anope Team
|
||||
* Contact us at team@anope.org
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
*
|
||||
* Based on the original code of Epona by Lara.
|
||||
* Based on the original code of Services by Andy Church.
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef BOTSERV_H
|
||||
#define BOTSERV_H
|
||||
|
||||
#include "anope.h"
|
||||
|
||||
/* BotServ SET flags */
|
||||
enum BotServFlag
|
||||
{
|
||||
BS_BEGIN,
|
||||
/* BotServ won't kick ops */
|
||||
BS_DONTKICKOPS,
|
||||
/* BotServ won't kick voices */
|
||||
BS_DONTKICKVOICES,
|
||||
/* BotServ bot accepts fantasy commands */
|
||||
BS_FANTASY,
|
||||
/* BotServ should show greets */
|
||||
BS_GREET,
|
||||
/* BotServ bots are not allowed to be in this channel */
|
||||
BS_NOBOT,
|
||||
/* BotServ kicks for bolds */
|
||||
BS_KICK_BOLDS,
|
||||
/* BotServ kicks for colors */
|
||||
BS_KICK_COLORS,
|
||||
/* BOtServ kicks for reverses */
|
||||
BS_KICK_REVERSES,
|
||||
/* BotServ kicks for underlines */
|
||||
BS_KICK_UNDERLINES,
|
||||
/* BotServ kicks for badwords */
|
||||
BS_KICK_BADWORDS,
|
||||
/* BotServ kicks for caps */
|
||||
BS_KICK_CAPS,
|
||||
/* BotServ kicks for flood */
|
||||
BS_KICK_FLOOD,
|
||||
/* BotServ kicks for repeating */
|
||||
BS_KICK_REPEAT,
|
||||
/* BotServ kicks for italics */
|
||||
BS_KICK_ITALICS,
|
||||
/* BotServ kicks for amsgs */
|
||||
BS_KICK_AMSGS,
|
||||
BS_END
|
||||
};
|
||||
|
||||
const Anope::string BotServFlagStrings[] = {
|
||||
"BEGIN", "DONTKICKOPS", "DONTKICKVOICES", "FANTASY", "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
|
||||
{
|
||||
TTB_BOLDS,
|
||||
TTB_COLORS,
|
||||
TTB_REVERSES,
|
||||
TTB_UNDERLINES,
|
||||
TTB_BADWORDS,
|
||||
TTB_CAPS,
|
||||
TTB_FLOOD,
|
||||
TTB_REPEAT,
|
||||
TTB_ITALICS,
|
||||
TTB_AMSGS,
|
||||
TTB_SIZE
|
||||
};
|
||||
|
||||
#endif // BOTSERV_H
|
||||
+40
-16
@@ -1,6 +1,6 @@
|
||||
/* Channel support
|
||||
*
|
||||
* (C) 2008-2011 Anope Team
|
||||
* (C) 2008-2012 Anope Team
|
||||
* Contact us at team@anope.org
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
@@ -9,6 +9,11 @@
|
||||
#ifndef CHANNELS_H
|
||||
#define CHANNELS_H
|
||||
|
||||
#include "anope.h"
|
||||
#include "extensible.h"
|
||||
#include "modes.h"
|
||||
#include "serialize.h"
|
||||
|
||||
typedef Anope::insensitive_map<Channel *> channel_map;
|
||||
extern CoreExport channel_map ChannelList;
|
||||
|
||||
@@ -30,14 +35,12 @@ enum ChannelFlag
|
||||
/* Channel still exists when emptied */
|
||||
CH_PERSIST,
|
||||
/* If set the channel is syncing users (channel was just created) and it should not be deleted */
|
||||
CH_SYNCING,
|
||||
/* Is a services log channel */
|
||||
CH_LOGCHAN
|
||||
CH_SYNCING
|
||||
};
|
||||
|
||||
const Anope::string ChannelFlagString[] = { "CH_INABIT", "CH_PERSIST", "CH_SYNCING", "CH_LOGCHAN", "" };
|
||||
const Anope::string ChannelFlagString[] = { "CH_INABIT", "CH_PERSIST", "CH_SYNCING", "" };
|
||||
|
||||
class CoreExport Channel : public Extensible, public Flags<ChannelFlag, 3>
|
||||
class CoreExport Channel : public virtual Base, public Extensible, public Flags<ChannelFlag, 3>
|
||||
{
|
||||
public:
|
||||
typedef std::multimap<ChannelModeName, Anope::string> ModeList;
|
||||
@@ -45,7 +48,7 @@ class CoreExport Channel : public Extensible, public Flags<ChannelFlag, 3>
|
||||
/** A map of channel modes with their parameters set on this channel
|
||||
*/
|
||||
ModeList modes;
|
||||
|
||||
|
||||
public:
|
||||
/** Default constructor
|
||||
* @param name The channel name
|
||||
@@ -58,7 +61,7 @@ class CoreExport Channel : public Extensible, public Flags<ChannelFlag, 3>
|
||||
~Channel();
|
||||
|
||||
Anope::string name; /* Channel name */
|
||||
ChannelInfo *ci; /* Corresponding ChannelInfo */
|
||||
serialize_obj<ChannelInfo> ci; /* Corresponding ChannelInfo */
|
||||
time_t creation_time; /* When channel was created */
|
||||
|
||||
/* List of users in the channel */
|
||||
@@ -70,9 +73,9 @@ class CoreExport Channel : public Extensible, public Flags<ChannelFlag, 3>
|
||||
|
||||
time_t server_modetime; /* Time of last server MODE */
|
||||
time_t chanserv_modetime; /* Time of last check_modes() */
|
||||
int16 server_modecount; /* Number of server MODEs this second */
|
||||
int16 chanserv_modecount; /* Number of check_mode()'s this sec */
|
||||
int16 bouncy_modes; /* Did we fail to set modes here? */
|
||||
int16_t server_modecount; /* Number of server MODEs this second */
|
||||
int16_t chanserv_modecount; /* Number of check_mode()'s this sec */
|
||||
int16_t bouncy_modes; /* Did we fail to set modes here? */
|
||||
|
||||
/** Call if we need to unset all modes and clear all user status (internally).
|
||||
* Only useful if we get a SJOIN with a TS older than what we have here
|
||||
@@ -83,6 +86,10 @@ class CoreExport Channel : public Extensible, public Flags<ChannelFlag, 3>
|
||||
*/
|
||||
void Sync();
|
||||
|
||||
/** Check if a channels modes are correct.
|
||||
*/
|
||||
void CheckModes();
|
||||
|
||||
/** Join a user internally to the channel
|
||||
* @param u The user
|
||||
*/
|
||||
@@ -97,14 +104,14 @@ class CoreExport Channel : public Extensible, public Flags<ChannelFlag, 3>
|
||||
* @param u The user
|
||||
* @return A user container if found, else NULL
|
||||
*/
|
||||
UserContainer *FindUser(User *u);
|
||||
UserContainer *FindUser(const User *u) const;
|
||||
|
||||
/** Check if a user has a status on a channel
|
||||
* @param u The user
|
||||
* @param cms The status mode, or NULL to represent no status
|
||||
* @return true or false
|
||||
*/
|
||||
bool HasUserStatus(User *u, ChannelModeStatus *cms) const;
|
||||
bool HasUserStatus(const User *u, ChannelModeStatus *cms) const;
|
||||
|
||||
/** Check if a user has a status on a channel
|
||||
* Use the overloaded function for ChannelModeStatus* to check for no status
|
||||
@@ -112,7 +119,7 @@ class CoreExport Channel : public Extensible, public Flags<ChannelFlag, 3>
|
||||
* @param Name The Mode name, eg CMODE_OP, CMODE_VOICE
|
||||
* @return true or false
|
||||
*/
|
||||
bool HasUserStatus(User *u, ChannelModeName Name) const;
|
||||
bool HasUserStatus(const User *u, ChannelModeName Name) const;
|
||||
|
||||
/** See if a channel has a mode
|
||||
* @param Name The mode name
|
||||
@@ -128,18 +135,20 @@ class CoreExport Channel : public Extensible, public Flags<ChannelFlag, 3>
|
||||
std::pair<ModeList::iterator, ModeList::iterator> GetModeList(ChannelModeName Name);
|
||||
|
||||
/** Set a mode internally on a channel, this is not sent out to the IRCd
|
||||
* @param setter The setter
|
||||
* @param cm The mode
|
||||
* @param param The param
|
||||
* @param EnforceMLock true if mlocks should be enforced, false to override mlock
|
||||
*/
|
||||
void SetModeInternal(ChannelMode *cm, const Anope::string ¶m = "", bool EnforceMLock = true);
|
||||
void SetModeInternal(User *setter, ChannelMode *cm, const Anope::string ¶m = "", bool EnforceMLock = true);
|
||||
|
||||
/** Remove a mode internally on a channel, this is not sent out to the IRCd
|
||||
* @param setter The Setter
|
||||
* @param cm The mode
|
||||
* @param param The param
|
||||
* @param EnforceMLock true if mlocks should be enforced, false to override mlock
|
||||
*/
|
||||
void RemoveModeInternal(ChannelMode *cm, const Anope::string ¶m = "", bool EnforceMLock = true);
|
||||
void RemoveModeInternal(User *setter, ChannelMode *cm, const Anope::string ¶m = "", bool EnforceMLock = true);
|
||||
|
||||
/** Set a mode on a channel
|
||||
* @param bi The client setting the modes
|
||||
@@ -231,6 +240,21 @@ class CoreExport Channel : public Extensible, public Flags<ChannelFlag, 3>
|
||||
* @param ts The time when the new topic is being set
|
||||
*/
|
||||
void ChangeTopic(const Anope::string &user, const Anope::string &newtopic, time_t ts = Anope::CurTime);
|
||||
|
||||
/** Hold the channel open using ChanServ
|
||||
*/
|
||||
void Hold();
|
||||
};
|
||||
|
||||
extern CoreExport Channel *findchan(const Anope::string &chan);
|
||||
|
||||
extern CoreExport User *nc_on_chan(Channel *c, const NickCore *nc);
|
||||
|
||||
extern CoreExport void do_cmode(const Anope::string &source, const Anope::string &channel, const Anope::string &modes, const Anope::string &ts);
|
||||
extern CoreExport void do_join(const Anope::string &source, const Anope::string &channels, const Anope::string &ts);
|
||||
extern CoreExport void do_kick(const Anope::string &source, const Anope::string &channel, const Anope::string &users, const Anope::string &reason);
|
||||
extern CoreExport void do_part(const Anope::string &source, const Anope::string &channels, const Anope::string &reason);
|
||||
|
||||
extern CoreExport void chan_set_correct_modes(const User *user, Channel *c, int give_modes);
|
||||
|
||||
#endif // CHANNELS_H
|
||||
|
||||
+30
-11
@@ -1,6 +1,6 @@
|
||||
/* Declarations for command data.
|
||||
*
|
||||
* (C) 2003-2011 Anope Team
|
||||
* (C) 2003-2012 Anope Team
|
||||
* Contact us at team@anope.org
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
@@ -12,11 +12,8 @@
|
||||
#ifndef COMMAND_H
|
||||
#define COMMAND_H
|
||||
|
||||
#include "services.h"
|
||||
|
||||
class Module;
|
||||
class BotInfo;
|
||||
class Command;
|
||||
#include "service.h"
|
||||
#include "anope.h"
|
||||
|
||||
enum CommandFlag
|
||||
{
|
||||
@@ -36,11 +33,23 @@ struct CommandInfo
|
||||
Anope::string permission;
|
||||
};
|
||||
|
||||
/* The source for a command */
|
||||
struct CoreExport CommandSource
|
||||
struct CommandReply
|
||||
{
|
||||
/* User executing the command */
|
||||
virtual void SendMessage(const BotInfo *source, const Anope::string &msg) = 0;
|
||||
};
|
||||
|
||||
/* The source for a command */
|
||||
class CoreExport CommandSource
|
||||
{
|
||||
/* The nick executing the command */
|
||||
Anope::string nick;
|
||||
/* User executing the command, may be NULL */
|
||||
User *u;
|
||||
public:
|
||||
/* The account executing the command */
|
||||
NickCore *nc;
|
||||
/* Where the reply should go */
|
||||
CommandReply *reply;
|
||||
/* Channel the command was executed on (fantasy) */
|
||||
Channel *c;
|
||||
/* The service this command is on */
|
||||
@@ -52,12 +61,20 @@ struct CoreExport CommandSource
|
||||
/* The permission of the command being executed */
|
||||
Anope::string permission;
|
||||
|
||||
std::list<Anope::string> reply;
|
||||
CommandSource(const Anope::string &n, User *user, NickCore *core, CommandReply *reply);
|
||||
|
||||
const Anope::string &GetNick() const;
|
||||
User *GetUser() const;
|
||||
AccessGroup AccessFor(ChannelInfo *ci) const;
|
||||
bool IsFounder(ChannelInfo *ci) const;
|
||||
|
||||
void Reply(const char *message, ...);
|
||||
void Reply(const Anope::string &message);
|
||||
|
||||
void DoReply();
|
||||
bool HasCommand(const Anope::string &cmd);
|
||||
bool HasPriv(const Anope::string &cmd);
|
||||
bool IsServicesOper() const;
|
||||
bool IsOper() const;
|
||||
};
|
||||
|
||||
/** Every services command is a class, inheriting from Command.
|
||||
@@ -125,4 +142,6 @@ class CoreExport Command : public Service, public Flags<CommandFlag>
|
||||
virtual void OnSyntaxError(CommandSource &source, const Anope::string &subcommand);
|
||||
};
|
||||
|
||||
extern CoreExport void RunCommand(CommandSource &source, const Anope::string &message);
|
||||
|
||||
#endif // COMMANDS_H
|
||||
|
||||
+76
-32
@@ -1,14 +1,22 @@
|
||||
/*
|
||||
*
|
||||
* (C) 2003-2012 Anope Team
|
||||
* Contact us at team@anope.org
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
*
|
||||
* Based on the original code of Epona by Lara.
|
||||
* Based on the original code of Services by Andy Church.
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef CONFIG_H
|
||||
#define CONFIG_H
|
||||
|
||||
#include <string>
|
||||
#include <fstream>
|
||||
#include <sstream>
|
||||
#include <vector>
|
||||
#include <map>
|
||||
#include <deque>
|
||||
|
||||
#include "anope.h"
|
||||
#include "account.h"
|
||||
#include "regchannel.h"
|
||||
#include "users.h"
|
||||
|
||||
/** A configuration key and value pair
|
||||
*/
|
||||
@@ -23,7 +31,6 @@ typedef std::vector<KeyVal> KeyValList;
|
||||
typedef std::multimap<Anope::string, KeyValList> ConfigDataHash;
|
||||
|
||||
// Required forward definitions
|
||||
class ServerConfig;
|
||||
|
||||
/** Types of data in the core config
|
||||
*/
|
||||
@@ -41,7 +48,8 @@ enum ConfigDataType
|
||||
DT_TIME, // Time value
|
||||
DT_NORELOAD = 32, // Item can't be reloaded after startup
|
||||
DT_ALLOW_WILD = 64, // Allow wildcards/CIDR in DT_IPADDRESS
|
||||
DT_ALLOW_NEWLINE = 128 // New line characters allowed in DT_STRING
|
||||
DT_ALLOW_NEWLINE = 128, // New line characters allowed in DT_STRING
|
||||
DT_ALLOW_EMPTY = 256 // Allow empty value
|
||||
};
|
||||
|
||||
/** Holds a config value, either string, integer or boolean.
|
||||
@@ -340,6 +348,29 @@ class CoreExport ServerConfig
|
||||
void ValidateIP(const Anope::string &p, const Anope::string &, const Anope::string &, bool) const;
|
||||
void ValidateNoSpaces(const Anope::string &, const Anope::string &, const Anope::string &) const;
|
||||
|
||||
struct Uplink
|
||||
{
|
||||
Anope::string host;
|
||||
unsigned port;
|
||||
Anope::string password;
|
||||
bool ipv6;
|
||||
|
||||
Uplink(const Anope::string &_host, int _port, const Anope::string &_password, bool _ipv6) : host(_host), port(_port), password(_password), ipv6(_ipv6) { }
|
||||
bool operator==(const Uplink &other) const
|
||||
{
|
||||
if (this->host != other.host)
|
||||
return false;
|
||||
if (this->port != other.port)
|
||||
return false;
|
||||
if (this->password != other.password)
|
||||
return false;
|
||||
if (this->ipv6 != other.ipv6)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
inline bool operator!=(const Uplink &other) const { return !(*this == other); }
|
||||
};
|
||||
|
||||
/** Below here is a list of variables which contain the config files values
|
||||
*/
|
||||
/* Host to bind to */
|
||||
@@ -361,6 +392,9 @@ class CoreExport ServerConfig
|
||||
/* Max lenght of hostnames */
|
||||
unsigned HostLen;
|
||||
|
||||
/* Casemapping to use */
|
||||
Anope::string CaseMap;
|
||||
|
||||
/* Max length of passwords */
|
||||
unsigned PassLen;
|
||||
|
||||
@@ -415,6 +449,10 @@ class CoreExport ServerConfig
|
||||
Anope::string MLock;
|
||||
/* Unmlockable modes */
|
||||
Anope::string NoMLock;
|
||||
/* Modes that are required to be on registered channels */
|
||||
Anope::string CSRequire;
|
||||
/* Use server side mlock */
|
||||
bool UseServerSideMLock;
|
||||
/* Default botmodes on channels, defaults to ao */
|
||||
Anope::string BotModes;
|
||||
/* THe actual modes */
|
||||
@@ -423,6 +461,10 @@ class CoreExport ServerConfig
|
||||
int RetryWait;
|
||||
/* If services should hide unprivileged commands */
|
||||
bool HidePrivilegedCommands;
|
||||
/* If set, nicks cant be owned/everything is entirely account based */
|
||||
bool NoNicknameOwnership;
|
||||
/* Regex engine to use */
|
||||
Anope::string RegexEngine;
|
||||
|
||||
/* A vector of our logfile options */
|
||||
std::vector<LogInfo *> LogInfos;
|
||||
@@ -439,6 +481,12 @@ class CoreExport ServerConfig
|
||||
time_t MailDelay;
|
||||
/* Don't quote the To: address */
|
||||
bool DontQuoteAddresses;
|
||||
/* Mail messages to send */
|
||||
Anope::string MailRegistrationSubject, MailRegistrationMessage;
|
||||
Anope::string MailResetSubject, MailResetMessage;
|
||||
Anope::string MailSendpassSubject, MailSendpassMessage;
|
||||
Anope::string MailEmailchangeSubject, MailEmailchangeMessage;
|
||||
Anope::string MailMemoSubject, MailMemoMessage;
|
||||
|
||||
/* Nameserver to use for resolving hostnames */
|
||||
Anope::string NameServer;
|
||||
@@ -488,8 +536,10 @@ class CoreExport ServerConfig
|
||||
bool NSSecureAdmins;
|
||||
/* Services opers must be /operd on the ircd aswell */
|
||||
bool NSStrictPrivileges;
|
||||
/* Use email to verify new users registering */
|
||||
bool NSEmailReg;
|
||||
/* Type of confirmation to use, or to disable registration completely */
|
||||
Anope::string NSRegistration;
|
||||
/* A message sent to unregistered users on connect */
|
||||
Anope::string NSUnregisteredNotice;
|
||||
/* Core NickServ modules */
|
||||
Anope::string NickCoreModules;
|
||||
/* Set the proper channel modes on users when they identify */
|
||||
@@ -535,6 +585,13 @@ class CoreExport ServerConfig
|
||||
/* Who can use memos reciepts */
|
||||
unsigned MSMemoReceipt;
|
||||
|
||||
/* Valid chars allowed in vhosts */
|
||||
Anope::string VhostChars;
|
||||
/* Allow undotted vhosts? */
|
||||
bool VhostUndotted;
|
||||
/* Chars disallowed at the beginning or end of vhosts */
|
||||
Anope::string VhostDisallowBE;
|
||||
|
||||
/* Core BotServ modules */
|
||||
Anope::string BotCoreModules;
|
||||
/* Default BotServ flags */
|
||||
@@ -576,30 +633,16 @@ class CoreExport ServerConfig
|
||||
time_t SNLineExpiry;
|
||||
/* Default expiry time for SQLines */
|
||||
time_t SQLineExpiry;
|
||||
/* Default expiry time for SZLine */
|
||||
time_t SZLineExpiry;
|
||||
/* Actually akill the user when the akill is added */
|
||||
bool AkillOnAdd;
|
||||
/* Kill users on SNLine */
|
||||
bool KillonSNline;
|
||||
/* Kill users on SQline */
|
||||
bool KillonSQline;
|
||||
/* Send a WALLOPS/GLOBOPS when a user opers */
|
||||
bool WallOper;
|
||||
/* Send a WALLOPS/GLOBOPS when a nonoper tries to use OperServ */
|
||||
bool WallBadOS;
|
||||
/* Send a WALLOPS/GLOBOPS when an akill expires */
|
||||
bool WallAkillExpire;
|
||||
/* Send a WALLOPS/GLOBOPS when SNLines expire */
|
||||
bool WallSNLineExpire;
|
||||
/* Send a WALLOPS/GLOBOPS when SQLines expire */
|
||||
bool WallSQLineExpire;
|
||||
/* Send a WALLOPS/GLOBOPS when SZLines expire */
|
||||
bool WallSZLineExpire;
|
||||
/* Send a WALLOPS/GLOBOPS when exceptions expire */
|
||||
bool WallExceptionExpire;
|
||||
/* Add the akillers nick to the akill reason */
|
||||
bool AddAkiller;
|
||||
/* Add akill ids to akill reason */
|
||||
bool AkillIds;
|
||||
|
||||
/* Limit sessions */
|
||||
bool LimitSessions;
|
||||
@@ -623,10 +666,8 @@ class CoreExport ServerConfig
|
||||
/* List of modules to autoload */
|
||||
std::list<Anope::string> ModulesAutoLoad;
|
||||
|
||||
/* User keys to use for generating random hashes for pass codes etc */
|
||||
unsigned long UserKey1;
|
||||
unsigned long UserKey2;
|
||||
unsigned long UserKey3;
|
||||
/* Seed to use for RNG */
|
||||
unsigned long Seed;
|
||||
|
||||
/* Numeric */
|
||||
Anope::string Numeric;
|
||||
@@ -763,4 +804,7 @@ class CoreExport ConfigReader
|
||||
int EnumerateValues(const Anope::string &, int);
|
||||
};
|
||||
|
||||
extern ConfigurationFile services_conf;
|
||||
extern CoreExport ServerConfig *Config;
|
||||
|
||||
#endif // CONFIG_H
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
/*
|
||||
*
|
||||
* (C) 2003-2012 Anope Team
|
||||
* Contact us at team@anope.org
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
*
|
||||
* Based on the original code of Epona by Lara.
|
||||
* Based on the original code of Services by Andy Church.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
class AccessGroup;
|
||||
class AutoKick;
|
||||
class BotInfo;
|
||||
class CallBack;
|
||||
class ChanAccess;
|
||||
class Channel;
|
||||
class ChannelInfo;
|
||||
class ChannelStatus;
|
||||
class ClientSocket;
|
||||
class Command;
|
||||
class CommandSource;
|
||||
class ConnectionSocket;
|
||||
class DNSPacket;
|
||||
class dynamic_reference_base;
|
||||
class Entry;
|
||||
class InfoFormatter;
|
||||
class ListenSocket;
|
||||
class Log;
|
||||
class LogInfo;
|
||||
class Memo;
|
||||
class Message;
|
||||
class Module;
|
||||
class NickAlias;
|
||||
class NickCore;
|
||||
class OperType;
|
||||
class Regex;
|
||||
class Serializable;
|
||||
class Server;
|
||||
class ServerConfig;
|
||||
class Socket;
|
||||
class Thread;
|
||||
class User;
|
||||
class XLine;
|
||||
class XLineManager;
|
||||
struct BadWord;
|
||||
struct DNSQuery;
|
||||
struct Exception;
|
||||
struct MemoInfo;
|
||||
struct ModeLock;
|
||||
struct Oper;
|
||||
|
||||
+93
-81
@@ -1,6 +1,24 @@
|
||||
/*
|
||||
*
|
||||
* (C) 2003-2012 Anope Team
|
||||
* Contact us at team@anope.org
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
*
|
||||
* Based on the original code of Epona by Lara.
|
||||
* Based on the original code of Services by Andy Church.
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef DNS_H
|
||||
#define DNS_H
|
||||
|
||||
#include "sockets.h"
|
||||
#include "timers.h"
|
||||
#include "extern.h"
|
||||
#include "config.h"
|
||||
|
||||
/** Valid query types
|
||||
*/
|
||||
enum QueryType
|
||||
@@ -19,7 +37,7 @@ enum QueryType
|
||||
|
||||
/** Flags that can be AND'd into DNSPacket::flags to receive certain values
|
||||
*/
|
||||
enum QueryFlags
|
||||
enum
|
||||
{
|
||||
DNS_QUERYFLAGS_QR = 0x8000,
|
||||
DNS_QUERYFLAGS_OPCODE = 0x7800,
|
||||
@@ -48,16 +66,42 @@ enum DNSError
|
||||
DNS_ERROR_INVALIDTYPE
|
||||
};
|
||||
|
||||
class DNSRequestTimeout; // Forward declarations
|
||||
struct DNSRecord;
|
||||
class Module;
|
||||
|
||||
struct CoreExport Question
|
||||
{
|
||||
Anope::string name;
|
||||
QueryType type;
|
||||
unsigned short qclass;
|
||||
|
||||
Question();
|
||||
Question(const Anope::string &, QueryType, unsigned short = 1);
|
||||
};
|
||||
|
||||
struct CoreExport ResourceRecord : public Question
|
||||
{
|
||||
unsigned int ttl;
|
||||
Anope::string rdata;
|
||||
time_t created;
|
||||
|
||||
ResourceRecord(const Anope::string &, QueryType, unsigned short = 1);
|
||||
ResourceRecord(const Question &);
|
||||
};
|
||||
|
||||
struct CoreExport DNSQuery
|
||||
{
|
||||
std::vector<Question> questions;
|
||||
std::vector<ResourceRecord> answers, authorities, additional;
|
||||
DNSError error;
|
||||
|
||||
DNSQuery();
|
||||
DNSQuery(const Question &q);
|
||||
DNSQuery(const DNSPacket &p);
|
||||
};
|
||||
|
||||
/** The request
|
||||
*/
|
||||
class CoreExport DNSRequest
|
||||
class CoreExport DNSRequest : public Timer, public Question
|
||||
{
|
||||
/* Timeout timer for this request */
|
||||
DNSRequestTimeout *timeout;
|
||||
/* Use result cache if available */
|
||||
bool use_cache;
|
||||
|
||||
@@ -67,85 +111,54 @@ class CoreExport DNSRequest
|
||||
/* Creator of this request */
|
||||
Module *creator;
|
||||
|
||||
/* Address we're looking up */
|
||||
Anope::string address;
|
||||
/* QueryType, A, AAAA, PTR etc */
|
||||
QueryType QT;
|
||||
|
||||
DNSRequest(const Anope::string &addr, QueryType qt, bool cache = false, Module *c = NULL);
|
||||
|
||||
virtual ~DNSRequest();
|
||||
|
||||
void Process();
|
||||
|
||||
virtual void OnLookupComplete(const DNSRecord *r) = 0;
|
||||
virtual void OnLookupComplete(const DNSQuery *r) = 0;
|
||||
|
||||
virtual void OnError(const DNSRecord *r);
|
||||
virtual void OnError(const DNSQuery *r);
|
||||
|
||||
void Tick(time_t) anope_override;
|
||||
};
|
||||
|
||||
/** A full packet sent to the nameserver, may contain multiple queries
|
||||
/** A full packet sent or recieved to/from the nameserver, may contain multiple queries
|
||||
*/
|
||||
struct DNSPacket
|
||||
class DNSPacket : public DNSQuery
|
||||
{
|
||||
static const int DNS_POINTER = 0xC0;
|
||||
static const int DNS_LABEL = 0x3F;
|
||||
|
||||
void PackName(unsigned char *output, unsigned short output_size, unsigned short &pos, const Anope::string &name);
|
||||
Anope::string UnpackName(const unsigned char *input, unsigned short input_size, unsigned short &pos);
|
||||
|
||||
Question UnpackQuestion(const unsigned char *input, unsigned short input_size, unsigned short &pos);
|
||||
ResourceRecord UnpackResourceRecord(const unsigned char *input, unsigned short input_size, unsigned short &poss);
|
||||
public:
|
||||
static const int HEADER_LENGTH = 12;
|
||||
|
||||
/* Our 16-bit id for this header */
|
||||
unsigned short id;
|
||||
/* Flags on the query */
|
||||
unsigned short flags;
|
||||
/* Number of queries */
|
||||
unsigned short qdcount;
|
||||
/* Number of resource records in answer */
|
||||
unsigned short ancount;
|
||||
/* Number of NS resource records in authority records section */
|
||||
unsigned short nscount;
|
||||
/* Number of resource records in the additional records section */
|
||||
unsigned short arcount;
|
||||
/* How many of the bytes of the payload are in use */
|
||||
unsigned short payload_count;
|
||||
/* The queries, at most can be 512 bytes */
|
||||
unsigned char payload[512];
|
||||
|
||||
inline DNSPacket();
|
||||
|
||||
bool AddQuestion(const Anope::string &address, QueryType qt);
|
||||
|
||||
inline void FillPacket(const unsigned char *input, const size_t length);
|
||||
|
||||
inline void FillBuffer(unsigned char *buffer);
|
||||
DNSPacket();
|
||||
void Fill(const unsigned char *input, const unsigned short len);
|
||||
unsigned short Pack(unsigned char *output, unsigned short output_size);
|
||||
};
|
||||
|
||||
struct CoreExport DNSRecord
|
||||
{
|
||||
/* Name of the initial lookup */
|
||||
Anope::string name;
|
||||
/* Result of the lookup */
|
||||
Anope::string result;
|
||||
/* Type of query this was */
|
||||
QueryType type;
|
||||
/* Error, if there was one */
|
||||
DNSError error;
|
||||
/* Record class, should always be 1 */
|
||||
unsigned short record_class;
|
||||
/* Time to live */
|
||||
time_t ttl;
|
||||
/* Record length */
|
||||
unsigned short rdlength;
|
||||
|
||||
/* When this record was created in our cache */
|
||||
time_t created;
|
||||
|
||||
inline DNSRecord(const Anope::string &n);
|
||||
operator bool() const;
|
||||
};
|
||||
|
||||
/** DNS manager, manages the connection and all requests
|
||||
/** DNS manager, manages all requests
|
||||
*/
|
||||
class CoreExport DNSManager : public Timer, public Socket
|
||||
{
|
||||
std::multimap<Anope::string, DNSRecord *> cache;
|
||||
typedef std::multimap<Anope::string, ResourceRecord, ci::less> cache_map;
|
||||
cache_map cache;
|
||||
sockaddrs addrs;
|
||||
public:
|
||||
std::deque<DNSPacket *> packets;
|
||||
std::map<short, DNSRequest *> requests;
|
||||
std::map<unsigned short, DNSRequest *> requests;
|
||||
|
||||
static const int DNSPort = 53;
|
||||
|
||||
@@ -157,35 +170,34 @@ class CoreExport DNSManager : public Timer, public Socket
|
||||
|
||||
bool ProcessWrite();
|
||||
|
||||
void AddCache(DNSRecord *rr);
|
||||
bool CheckCache(DNSRequest *request);
|
||||
void Tick(time_t now);
|
||||
/** Add a record to the dns cache
|
||||
* @param r The record
|
||||
*/
|
||||
void AddCache(DNSQuery &r);
|
||||
|
||||
/** Check the DNS cache to see if request can be handled by a cached result
|
||||
* @return true if a cached result was found.
|
||||
*/
|
||||
bool CheckCache(DNSRequest *request);
|
||||
|
||||
/** Tick this timer, used to clear the DNS cache.
|
||||
*/
|
||||
void Tick(time_t now) anope_override;
|
||||
|
||||
/** Cleanup all pending DNS queries for a module
|
||||
* @param mod The module
|
||||
*/
|
||||
void Cleanup(Module *mod);
|
||||
|
||||
/** Does a BLOCKING DNS query and returns the first IP.
|
||||
* Only use this if you know what you are doing. Unless you specifically
|
||||
* need a blocking query use the DNSRequest system
|
||||
*/
|
||||
static DNSRecord BlockingQuery(const Anope::string &mask, QueryType qt);
|
||||
};
|
||||
|
||||
/** A DNS timeout, one is made for every DNS request to detect timeouts
|
||||
*/
|
||||
class DNSRequestTimeout : public Timer
|
||||
{
|
||||
DNSRequest *request;
|
||||
public:
|
||||
bool done;
|
||||
|
||||
DNSRequestTimeout(DNSRequest *r, time_t timeout);
|
||||
|
||||
~DNSRequestTimeout();
|
||||
|
||||
void Tick(time_t);
|
||||
static DNSQuery BlockingQuery(const Anope::string &mask, QueryType qt);
|
||||
};
|
||||
|
||||
extern DNSManager *DNSEngine;
|
||||
|
||||
#endif // DNS_H
|
||||
|
||||
|
||||
|
||||
+41
-139
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2008-2011 Anope Team <team@anope.org>
|
||||
* Copyright (C) 2008-2012 Anope Team <team@anope.org>
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
*/
|
||||
@@ -7,61 +7,26 @@
|
||||
#ifndef EXTENSIBLE_H
|
||||
#define EXTENSIBLE_H
|
||||
|
||||
#include "hashcomp.h"
|
||||
#include "anope.h"
|
||||
|
||||
/** Dummy base class we use to cast everything to/from
|
||||
*/
|
||||
class ExtensibleItemBase
|
||||
class CoreExport ExtensibleItem
|
||||
{
|
||||
public:
|
||||
ExtensibleItemBase() { }
|
||||
virtual ~ExtensibleItemBase() { }
|
||||
ExtensibleItem();
|
||||
virtual ~ExtensibleItem();
|
||||
virtual void OnDelete();
|
||||
};
|
||||
|
||||
/** Class used to represent an extensible item that doesn't hold a pointer
|
||||
*/
|
||||
template<typename T> class ExtensibleItemRegular : public ExtensibleItemBase
|
||||
template<typename T> struct CoreExport ExtensibleItemClass : T, ExtensibleItem
|
||||
{
|
||||
protected:
|
||||
T Item;
|
||||
|
||||
public:
|
||||
ExtensibleItemRegular(T item) : Item(item) { }
|
||||
virtual ~ExtensibleItemRegular() { }
|
||||
T &GetItem() { return Item; }
|
||||
ExtensibleItemClass(const T& t) : T(t) { }
|
||||
};
|
||||
|
||||
/** Class used to represent an extensible item that holds a pointer
|
||||
*/
|
||||
template<typename T> class ExtensibleItemPointer : public ExtensibleItemBase
|
||||
{
|
||||
protected:
|
||||
T *Item;
|
||||
|
||||
public:
|
||||
ExtensibleItemPointer(T *item) : Item(item) { }
|
||||
virtual ~ExtensibleItemPointer() { delete Item; }
|
||||
T *GetItem() { return Item; }
|
||||
};
|
||||
|
||||
/** Class used to represent an extensible item that holds a pointer to an arrray
|
||||
*/
|
||||
template<typename T> class ExtensibleItemPointerArray : public ExtensibleItemBase
|
||||
{
|
||||
protected:
|
||||
T *Item;
|
||||
|
||||
public:
|
||||
ExtensibleItemPointerArray(T *item) : Item(item) { }
|
||||
virtual ~ExtensibleItemPointerArray() { delete [] Item; }
|
||||
T *GetItem() { return Item; }
|
||||
};
|
||||
|
||||
class CoreExport Extensible : public Base
|
||||
class CoreExport Extensible
|
||||
{
|
||||
private:
|
||||
typedef std::map<Anope::string, ExtensibleItemBase *> extensible_map;
|
||||
extensible_map Extension_Items;
|
||||
typedef Anope::map<ExtensibleItem *> extensible_map;
|
||||
extensible_map extension_items;
|
||||
|
||||
public:
|
||||
/** Default constructor, does nothing
|
||||
@@ -73,9 +38,10 @@ class CoreExport Extensible : public Base
|
||||
*/
|
||||
virtual ~Extensible()
|
||||
{
|
||||
for (extensible_map::iterator it = Extension_Items.begin(), it_end = Extension_Items.end(); it != it_end; ++it)
|
||||
delete it->second;
|
||||
Extension_Items.clear();
|
||||
for (extensible_map::iterator it = extension_items.begin(), it_end = extension_items.end(); it != it_end; ++it)
|
||||
if (it->second)
|
||||
it->second->OnDelete();
|
||||
extension_items.clear();
|
||||
}
|
||||
|
||||
/** Extend an Extensible class.
|
||||
@@ -89,26 +55,10 @@ class CoreExport Extensible : public Base
|
||||
*
|
||||
* @return Returns true on success, false if otherwise
|
||||
*/
|
||||
void Extend(const Anope::string &key, ExtensibleItemBase *p)
|
||||
void Extend(const Anope::string &key, ExtensibleItem *p)
|
||||
{
|
||||
this->Shrink(key);
|
||||
this->Extension_Items.insert(std::make_pair(key, p));
|
||||
}
|
||||
|
||||
/** Extend an Extensible class.
|
||||
*
|
||||
* @param key The key parameter is an arbitary string which identifies the extension data
|
||||
*
|
||||
* You must provide a key to store the data as via the parameter 'key', this single-parameter
|
||||
* version takes no 'data' parameter, this is used purely for boolean values.
|
||||
* The key will be inserted into the map with a NULL 'data' pointer. If the key already exists
|
||||
* then you may not insert it twice, Extensible::Extend will return false in this case.
|
||||
*
|
||||
* @return Returns true on success, false if otherwise
|
||||
*/
|
||||
void Extend(const Anope::string &key)
|
||||
{
|
||||
this->Extend(key, new ExtensibleItemPointer<char *>(NULL));
|
||||
this->extension_items[key] = p;
|
||||
}
|
||||
|
||||
/** Shrink an Extensible class.
|
||||
@@ -121,91 +71,43 @@ class CoreExport Extensible : public Base
|
||||
*/
|
||||
bool Shrink(const Anope::string &key)
|
||||
{
|
||||
extensible_map::iterator it = this->Extension_Items.find(key);
|
||||
if (it != this->Extension_Items.end())
|
||||
extensible_map::iterator it = this->extension_items.find(key);
|
||||
if (it != this->extension_items.end())
|
||||
{
|
||||
delete it->second;
|
||||
if (it->second != NULL)
|
||||
it->second->OnDelete();
|
||||
/* map::size_type map::erase( const key_type& key );
|
||||
* returns the number of elements removed, std::map
|
||||
* is single-associative so this should only be 0 or 1
|
||||
*/
|
||||
return this->Extension_Items.erase(key);
|
||||
return this->extension_items.erase(key) > 0;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/** Get an extension item that is not a pointer.
|
||||
*
|
||||
* @param key The key parameter is an arbitary string which identifies the extension data
|
||||
* @param p If you provide a non-existent key, this value will be 0. Otherwise a copy to the item you requested will be placed in this templated parameter.
|
||||
* @return Returns true if the item was found and false if it was nor, regardless of wether 'p' is NULL. This allows you to store NULL values in Extensible.
|
||||
*/
|
||||
template<typename T> bool GetExtRegular(const Anope::string &key, T &p)
|
||||
{
|
||||
extensible_map::iterator it = this->Extension_Items.find(key);
|
||||
|
||||
if (it != this->Extension_Items.end())
|
||||
{
|
||||
p = debug_cast<ExtensibleItemRegular<T> *>(it->second)->GetItem();
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/** Get an extension item that is a pointer.
|
||||
*
|
||||
* @param key The key parameter is an arbitary string which identifies the extension data
|
||||
* * @param p If you provide a non-existent key, this value will be NULL. Otherwise a pointer to the item you requested will be placed in this templated parameter.
|
||||
* @return Returns true if the item was found and false if it was nor, regardless of wether 'p' is NULL. This allows you to store NULL values in Extensible.
|
||||
*/
|
||||
template<typename T> bool GetExtPointer(const Anope::string &key, T *&p)
|
||||
{
|
||||
extensible_map::iterator it = this->Extension_Items.find(key);
|
||||
|
||||
if (it != this->Extension_Items.end())
|
||||
{
|
||||
p = debug_cast<ExtensibleItemPointer<T> *>(it->second)->GetItem();
|
||||
return true;
|
||||
}
|
||||
|
||||
p = NULL;
|
||||
return false;
|
||||
}
|
||||
|
||||
/** Get an extension item that is a pointer to an array
|
||||
*
|
||||
* @param key The key parameter is an arbitary string which identifies the extension data
|
||||
* @param p If you provide a non-existent key, this value will be NULL. Otherwise a pointer to the item you requested will be placed in this templated parameter.
|
||||
* @return Returns true if the item was found and false if it was nor, regardless of wether 'p' is NULL. This allows you to store NULL values in Extensible.
|
||||
*/
|
||||
template<typename T> bool GetExtArray(const Anope::string &key, T *&p)
|
||||
{
|
||||
extensible_map::iterator it = this->Extension_Items.find(key);
|
||||
|
||||
if (it != this->Extension_Items.end())
|
||||
{
|
||||
p = debug_cast<ExtensibleItemPointerArray<T> *>(it->second)->GetItem();
|
||||
return true;
|
||||
}
|
||||
|
||||
p = NULL;
|
||||
return false;
|
||||
}
|
||||
|
||||
/** Get an extension item.
|
||||
*
|
||||
* @param key The key parameter is an arbitary string which identifies the extension data
|
||||
* @return Returns true if the item was found and false if it was not.
|
||||
*
|
||||
* This single-parameter version only checks if the key exists, it does nothing with
|
||||
* the 'data' field and is probably only useful in conjunction with the single-parameter
|
||||
* version of Extend().
|
||||
* @return The item found
|
||||
*/
|
||||
bool GetExt(const Anope::string &key)
|
||||
template<typename T> T GetExt(const Anope::string &key) const
|
||||
{
|
||||
return this->Extension_Items.find(key) != this->Extension_Items.end();
|
||||
extensible_map::const_iterator it = this->extension_items.find(key);
|
||||
if (it != this->extension_items.end())
|
||||
return anope_dynamic_reinterpret_cast<T>(it->second);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/** Check if an extension item exists.
|
||||
*
|
||||
* @param key The key parameter is an arbitary string which identifies the extension data
|
||||
* @return True if the item was found.
|
||||
*/
|
||||
bool HasExt(const Anope::string &key) const
|
||||
{
|
||||
return this->extension_items.count(key) > 0;
|
||||
}
|
||||
|
||||
/** Get a list of all extension items names.
|
||||
@@ -213,9 +115,9 @@ class CoreExport Extensible : public Base
|
||||
* @return This function writes a list of all extension items stored
|
||||
* in this object by name into the given deque and returns void.
|
||||
*/
|
||||
void GetExtList(std::deque<Anope::string> &list)
|
||||
void GetExtList(std::deque<Anope::string> &list) const
|
||||
{
|
||||
for (extensible_map::iterator it = Extension_Items.begin(), it_end = Extension_Items.end(); it != it_end; ++it)
|
||||
for (extensible_map::const_iterator it = extension_items.begin(), it_end = extension_items.end(); it != it_end; ++it)
|
||||
list.push_back(it->first);
|
||||
}
|
||||
};
|
||||
|
||||
+19
-107
@@ -1,6 +1,6 @@
|
||||
/* Prototypes and external variable declarations.
|
||||
*
|
||||
* (C) 2003-2011 Anope Team
|
||||
* (C) 2003-2012 Anope Team
|
||||
* Contact us at team@anope.org
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
@@ -12,82 +12,41 @@
|
||||
#ifndef EXTERN_H
|
||||
#define EXTERN_H
|
||||
|
||||
#include "modes.h"
|
||||
|
||||
#define E extern CoreExport
|
||||
#define EI extern DllExport
|
||||
|
||||
#include "hashcomp.h"
|
||||
|
||||
/* IRC Variables */
|
||||
|
||||
E IRCDVar *ircd;
|
||||
E IRCDProto *ircdproto;
|
||||
E IRCdMessage *ircdmessage;
|
||||
|
||||
/**** actions.c ****/
|
||||
|
||||
E bool bad_password(User *u);
|
||||
E void common_unban(ChannelInfo *ci, User *u, bool full = false);
|
||||
|
||||
/**** botserv.c ****/
|
||||
|
||||
E BotInfo *findbot(const Anope::string &nick);
|
||||
|
||||
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);
|
||||
|
||||
/**** channels.c ****/
|
||||
|
||||
|
||||
E Channel *findchan(const Anope::string &chan);
|
||||
|
||||
E User *nc_on_chan(Channel *c, const NickCore *nc);
|
||||
|
||||
E void do_cmode(const Anope::string &source, const Anope::string &channel, const Anope::string &modes, const Anope::string &ts);
|
||||
E void do_join(const Anope::string &source, const Anope::string &channels, const Anope::string &ts);
|
||||
E void do_kick(const Anope::string &source, const Anope::string &channel, const Anope::string &users, const Anope::string &reason);
|
||||
E void do_part(const Anope::string &source, const Anope::string &channels, const Anope::string &reason);
|
||||
|
||||
E void chan_set_correct_modes(User *user, Channel *c, int give_modes);
|
||||
|
||||
/**** chanserv.c ****/
|
||||
|
||||
E void check_modes(Channel *c);
|
||||
|
||||
E ChannelInfo *cs_findchan(const Anope::string &chan);
|
||||
E bool IsFounder(User *user, ChannelInfo *ci);
|
||||
E void update_cs_lastseen(User *user, ChannelInfo *ci);
|
||||
E int get_idealban(ChannelInfo *ci, User *u, Anope::string &ret);
|
||||
|
||||
/**** config.c ****/
|
||||
|
||||
E ConfigurationFile services_conf;
|
||||
E ServerConfig *Config;
|
||||
E void common_unban(const ChannelInfo *ci, User *u, bool full = false);
|
||||
|
||||
/**** encrypt.c ****/
|
||||
|
||||
E void enc_encrypt(const Anope::string &src, Anope::string &dest);
|
||||
E bool enc_decrypt(const Anope::string &src, Anope::string &dest);
|
||||
|
||||
/**** hostserv.c ****/
|
||||
|
||||
/**** init.c ****/
|
||||
|
||||
E Anope::string conf_dir, db_dir, modules_dir, locale_dir, log_dir;
|
||||
|
||||
E void introduce_user(const Anope::string &user);
|
||||
E bool GetCommandLineArgument(const Anope::string &name, char shortname = 0);
|
||||
E bool GetCommandLineArgument(const Anope::string &name, char shortname, Anope::string ¶m);
|
||||
E bool AtTerm();
|
||||
E void Fork();
|
||||
E void Init(int ac, char **av);
|
||||
|
||||
/**** 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 std::vector<Anope::string> domains;
|
||||
E void InitLanguages();
|
||||
E const char *translate(const char *string);
|
||||
E const char *translate(User *u, const char *string);
|
||||
E const char *translate(NickCore *nc, const char *string);
|
||||
E const char *translate(const NickCore *nc, const char *string);
|
||||
E const char *anope_gettext(const char *lang, const char *string);
|
||||
|
||||
/**** main.c ****/
|
||||
@@ -102,11 +61,11 @@ E bool noexpire;
|
||||
E bool protocoldebug;
|
||||
|
||||
E bool quitting;
|
||||
E int return_code;
|
||||
E bool restarting;
|
||||
E Anope::string quitmsg;
|
||||
E time_t start_time;
|
||||
|
||||
E ConnectionSocket *UplinkSock;
|
||||
E int CurrentUplink;
|
||||
|
||||
E void save_databases();
|
||||
@@ -143,29 +102,19 @@ 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 time_t dotime(const Anope::string &s);
|
||||
E Anope::string duration(const time_t &seconds, NickCore *nc = NULL);
|
||||
E Anope::string expire_left(NickCore *nc, time_t expires);
|
||||
E Anope::string do_strftime(const time_t &t, NickCore *nc = NULL, bool short_output = false);
|
||||
E bool doValidHost(const Anope::string &host, int type);
|
||||
|
||||
E bool isValidHost(const Anope::string &host, int type);
|
||||
E bool isvalidchar(char c);
|
||||
E Anope::string duration(const time_t &seconds, const NickCore *nc = NULL);
|
||||
E Anope::string expire_left(const NickCore *nc, time_t expires);
|
||||
E Anope::string do_strftime(const time_t &t, const NickCore *nc = NULL, bool short_output = false);
|
||||
E bool IsValidIdent(const Anope::string &ident);
|
||||
E bool IsValidHost(const Anope::string &host);
|
||||
|
||||
E Anope::string myStrGetToken(const Anope::string &str, char dilim, int token_number);
|
||||
E Anope::string myStrGetTokenRemainder(const Anope::string &str, char dilim, int token_number);
|
||||
E int myNumToken(const Anope::string &str, char dilim);
|
||||
E bool nickIsServices(const Anope::string &nick, bool bot);
|
||||
|
||||
E void add_entropy_userkeys();
|
||||
E void rand_init();
|
||||
E unsigned char getrandom8();
|
||||
E uint16 getrandom16();
|
||||
E uint32 getrandom32();
|
||||
|
||||
E std::list<Anope::string> BuildStringList(const Anope::string &, char = ' ');
|
||||
E std::vector<Anope::string> BuildStringVector(const Anope::string &, char = ' ');
|
||||
|
||||
@@ -174,51 +123,14 @@ E bool str_is_pure_wildcard(const Anope::string &str);
|
||||
E Anope::string normalizeBuffer(const Anope::string &);
|
||||
|
||||
/**** modes.cpp ****/
|
||||
|
||||
/* Number of generic modes we support */
|
||||
E unsigned GenericChannelModes, GenericUserModes;
|
||||
E std::multimap<ChannelModeName, ModeLock> def_mode_locks;
|
||||
E std::multimap<ChannelModeName, ModeLock *> def_mode_locks;
|
||||
E void SetDefaultMLock(ServerConfig *config);
|
||||
|
||||
/**** nickserv.c ****/
|
||||
|
||||
E void change_core_display(NickCore *nc);
|
||||
E void change_core_display(NickCore *nc, const Anope::string &newdisplay);
|
||||
|
||||
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 void process(const Anope::string &buf);
|
||||
|
||||
/**** send.c ****/
|
||||
|
||||
E void send_cmd(const Anope::string &source, const char *fmt, ...) FORMAT(printf, 2, 3);
|
||||
|
||||
E void notice_server(const Anope::string &source, const Server *s, const char *fmt, ...) FORMAT(printf, 3, 4);
|
||||
|
||||
/**** sockets.cpp ****/
|
||||
|
||||
E int32 TotalRead;
|
||||
E int32 TotalWritten;
|
||||
E SocketIO normalSocketIO;
|
||||
|
||||
/**** users.c ****/
|
||||
|
||||
E int32 opcnt;
|
||||
E uint32 maxusercnt, usercnt;
|
||||
E time_t maxusertime;
|
||||
|
||||
E User *finduser(const Anope::string &nick);
|
||||
|
||||
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 bool matches_list(Channel *c, User *user, ChannelModeName mode);
|
||||
|
||||
E Anope::string create_mask(User *u);
|
||||
|
||||
#endif /* EXTERN_H */
|
||||
|
||||
+41
-358
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Copyright (C) 2002-2011 InspIRCd Development Team
|
||||
* Copyright (C) 2009-2011 Anope Team <team@anope.org>
|
||||
* Copyright (C) 2009-2012 Anope Team <team@anope.org>
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
*
|
||||
@@ -13,176 +13,57 @@
|
||||
#ifndef HASHCOMP_H
|
||||
#define HASHCOMP_H
|
||||
|
||||
#ifdef _WIN32
|
||||
# ifdef MODULE_COMPILE
|
||||
# define CoreExport __declspec(dllimport)
|
||||
# define DllExport __declspec(dllexport)
|
||||
# else
|
||||
# define CoreExport __declspec(dllexport)
|
||||
# define DllExport __declspec(dllimport)
|
||||
# endif
|
||||
#else
|
||||
# define CoreExport
|
||||
# define DllExport
|
||||
#endif
|
||||
|
||||
#include <string>
|
||||
#include <locale>
|
||||
|
||||
#include "services.h"
|
||||
|
||||
namespace Anope
|
||||
{
|
||||
class string;
|
||||
}
|
||||
|
||||
#ifndef _WIN32
|
||||
# if defined(__GNUC__) && __GNUC__ >= 4
|
||||
/* GCC4+ has deprecated hash_map and uses tr1. But of course, uses a different include to MSVC. */
|
||||
# include <tr1/unordered_map>
|
||||
# define unordered_map_namespace std::tr1
|
||||
# else /* GCC ver < 4 */
|
||||
# include <ext/hash_map>
|
||||
/* Oddball linux namespace for hash_map */
|
||||
# define unordered_map_namespace __gnu_cxx
|
||||
# define unordered_map hash_map
|
||||
# endif
|
||||
#else
|
||||
# if _MSC_VER >= 1600
|
||||
/* MSVC 2010+ has tr1. Though MSVC and GCC use different includes! */
|
||||
# include <unordered_map>
|
||||
# define unordered_map_namespace std::tr1
|
||||
# else
|
||||
# include <hash_map>
|
||||
# define unordered_map_namespace
|
||||
template<typename Key, typename Type, typename Compare, typename Unused = void>
|
||||
class unordered_map : public stdext::hash_map<Key, Type, Compare>
|
||||
{
|
||||
public:
|
||||
unordered_map() : hash_map() { }
|
||||
};
|
||||
# endif
|
||||
#endif
|
||||
extern std::locale casemap;
|
||||
|
||||
/*******************************************************
|
||||
* This file contains classes and templates that deal
|
||||
* with the comparison and hashing of 'irc strings'.
|
||||
* An 'irc string' is a string which compares in a
|
||||
* case insensitive manner, and as per RFC 1459 will
|
||||
* treat [ identical to {, ] identical to }, and \
|
||||
* as identical to |.
|
||||
*
|
||||
* Our hashing functions are designed to accept
|
||||
* std::string and compare/hash them as type irc::string
|
||||
* by converting them internally. This makes them
|
||||
* backwards compatible with other code which is not
|
||||
* aware of irc::string.
|
||||
*******************************************************/
|
||||
|
||||
/** A mapping of uppercase to lowercase, including scandinavian
|
||||
* 'oddities' as specified by RFC1459, e.g. { -> [, and | -> \
|
||||
*/
|
||||
unsigned const char rfc_case_insensitive_map[256] = {
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, /* 0-19 */
|
||||
20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, /* 20-39 */
|
||||
40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, /* 40-59 */
|
||||
60, 61, 62, 63, 64, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, /* 60-79 */
|
||||
112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 94, 95, 96, 97, 98, 99, /* 80-99 */
|
||||
100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, /* 100-119 */
|
||||
120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, /* 120-139 */
|
||||
140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, /* 140-159 */
|
||||
160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, /* 160-179 */
|
||||
180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, /* 180-199 */
|
||||
200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, /* 200-219 */
|
||||
220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, /* 220-239 */
|
||||
240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255 /* 240-255 */
|
||||
};
|
||||
|
||||
/** Case insensitive map, ASCII rules.
|
||||
* That is;
|
||||
* [ != {, but A == a.
|
||||
*/
|
||||
unsigned const char ascii_case_insensitive_map[256] = {
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, /* 0-19 */
|
||||
20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, /* 20-39 */
|
||||
40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, /* 40-59 */
|
||||
60, 61, 62, 63, 64, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, /* 60-79 */
|
||||
112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 91, 92, 93, 94, 95, 96, 97, 98, 99, /* 80-99 */
|
||||
100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, /* 100-119 */
|
||||
120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, /* 120-139 */
|
||||
140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, /* 140-159 */
|
||||
160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, /* 160-179 */
|
||||
180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, /* 180-199 */
|
||||
200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, /* 200-219 */
|
||||
220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, /* 220-239 */
|
||||
240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255 /* 240-255 */
|
||||
};
|
||||
|
||||
/** The irc namespace contains a number of helper classes.
|
||||
*/
|
||||
namespace irc
|
||||
{
|
||||
/** The irc_char_traits class is used for RFC-style comparison of strings.
|
||||
* This class is used to implement irc::string, a case-insensitive, RFC-
|
||||
* comparing string class.
|
||||
*/
|
||||
struct irc_char_traits : std::char_traits<char>
|
||||
template<typename charT>
|
||||
class ascii_ctype : public std::ctype<charT>
|
||||
{
|
||||
/** Check if two chars match.
|
||||
* @param c1st First character
|
||||
* @param c2nd Second character
|
||||
* @return true if the characters are equal
|
||||
*/
|
||||
static bool eq(char c1st, char c2nd);
|
||||
public:
|
||||
charT do_toupper(charT c) const anope_override
|
||||
{
|
||||
if (c >= 'a' && c <= 'z')
|
||||
return c - 32;
|
||||
else
|
||||
return c;
|
||||
}
|
||||
|
||||
/** Check if two chars do NOT match.
|
||||
* @param c1st First character
|
||||
* @param c2nd Second character
|
||||
* @return true if the characters are unequal
|
||||
*/
|
||||
static bool ne(char c1st, char c2nd);
|
||||
|
||||
/** Check if one char is less than another.
|
||||
* @param c1st First character
|
||||
* @param c2nd Second character
|
||||
* @return true if c1st is less than c2nd
|
||||
*/
|
||||
static bool lt(char c1st, char c2nd);
|
||||
|
||||
/** Compare two strings of size n.
|
||||
* @param str1 First string
|
||||
* @param str2 Second string
|
||||
* @param n Length to compare to
|
||||
* @return similar to strcmp, zero for equal, less than zero for str1
|
||||
* being less and greater than zero for str1 being greater than str2.
|
||||
*/
|
||||
static int compare(const char *str1, const char *str2, size_t n);
|
||||
|
||||
/** Find a char within a string up to position n.
|
||||
* @param s1 String to find in
|
||||
* @param n Position to search up to
|
||||
* @param c Character to search for
|
||||
* @return Pointer to the first occurance of c in s1
|
||||
*/
|
||||
static const char *find(const char *s1, int n, char c);
|
||||
charT do_tolower(charT c) const anope_override
|
||||
{
|
||||
if (c >= 'A' && c <= 'Z')
|
||||
return c + 32;
|
||||
else
|
||||
return c;
|
||||
}
|
||||
};
|
||||
|
||||
/** This typedef declares irc::string based upon irc_char_traits.
|
||||
*/
|
||||
typedef std::basic_string<char, irc_char_traits, std::allocator<char> > string;
|
||||
|
||||
/** Used to hash irc::strings for unordered_map
|
||||
*/
|
||||
struct CoreExport hash
|
||||
template<typename charT>
|
||||
class rfc1459_ctype : public ascii_ctype<charT>
|
||||
{
|
||||
/* VS 2008 specific code */
|
||||
enum { bucket_size = 4, min_buckets = 8 };
|
||||
bool operator()(const Anope::string &s1, const Anope::string &s2) const;
|
||||
/* End VS 2008 specific code */
|
||||
public:
|
||||
charT do_toupper(charT c) const anope_override
|
||||
{
|
||||
if (c == '{' || c == '}' || c == '|')
|
||||
return c - 32;
|
||||
else
|
||||
return ascii_ctype<charT>::do_toupper(c);
|
||||
}
|
||||
|
||||
/** Hash an irc::string for unordered_map
|
||||
* @param s The string
|
||||
* @return A hash value for the string
|
||||
*/
|
||||
size_t operator()(const irc::string &s) const;
|
||||
size_t operator()(const Anope::string &s) const;
|
||||
charT do_tolower(charT c) const anope_override
|
||||
{
|
||||
if (c == '[' || c == ']' || c == '\\')
|
||||
return c + 32;
|
||||
else
|
||||
return ascii_ctype<charT>::do_tolower(c);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -239,60 +120,8 @@ namespace ci
|
||||
*/
|
||||
typedef std::basic_string<char, ci_char_traits, std::allocator<char> > string;
|
||||
|
||||
/** Used to hash ci::strings for unordered_map
|
||||
*/
|
||||
struct CoreExport hash
|
||||
struct CoreExport less
|
||||
{
|
||||
/* VS 2008 specific code */
|
||||
enum { bucket_size = 4, min_buckets = 8 };
|
||||
bool operator()(const Anope::string &s1, const Anope::string &s2) const;
|
||||
/* End VS 2008 specific code */
|
||||
|
||||
/** Hash a ci::string for unordered_map
|
||||
* @param s The string
|
||||
* @return A hash value for the string
|
||||
*/
|
||||
size_t operator()(const ci::string &s) const;
|
||||
size_t operator()(const Anope::string &s) const;
|
||||
};
|
||||
}
|
||||
|
||||
namespace std
|
||||
{
|
||||
/** An overload for std::equal_to<ci::string> that uses Anope::string, passed for the fourth temmplate
|
||||
* argument for unordered_map
|
||||
*/
|
||||
template<> struct CoreExport equal_to<ci::string>
|
||||
{
|
||||
public:
|
||||
/** Compare two Anope::strings as ci::strings
|
||||
* @paarm s1 The first string
|
||||
* @param s2 The second string
|
||||
* @return true if they are equal
|
||||
*/
|
||||
bool operator()(const Anope::string &s1, const Anope::string &s2) const;
|
||||
};
|
||||
|
||||
/** An overload for std::equal_to<irc::string> that uses Anope::string, passed for the fourth template
|
||||
* argument for unorderd_map
|
||||
*/
|
||||
template<> struct CoreExport equal_to<irc::string>
|
||||
{
|
||||
public:
|
||||
/** Compare two Anope::strings as irc::strings
|
||||
* @param s1 The first string
|
||||
* @param s2 The second string
|
||||
* @return true if they are equal
|
||||
*/
|
||||
bool operator()(const Anope::string &s1, const Anope::string &s2) const;
|
||||
};
|
||||
|
||||
/** An overload for std::less<ci::string> that uses Anope::string, passed for the third template argument
|
||||
* to std::map and std::multimap
|
||||
*/
|
||||
template<> struct CoreExport less<ci::string>
|
||||
{
|
||||
public:
|
||||
/** Compare two Anope::strings as ci::strings and find which one is less
|
||||
* @param s1 The first string
|
||||
* @param s2 The second string
|
||||
@@ -300,64 +129,6 @@ namespace std
|
||||
*/
|
||||
bool operator()(const Anope::string &s1, const Anope::string &s2) const;
|
||||
};
|
||||
|
||||
/** An overload for std;:less<irc::string> that uses Anope::string, passed for the third tempalte argument
|
||||
* to std::map and std::multimap
|
||||
*/
|
||||
template<> struct CoreExport less<irc::string>
|
||||
{
|
||||
public:
|
||||
/** Compare two Anope::strings as irc::strings and find which one is less
|
||||
* @param s1 The first string
|
||||
* @param s2 The second string
|
||||
* @return true if s1 < s2, else false
|
||||
*/
|
||||
bool operator()(const Anope::string &s1, const Anope::string &s2) const;
|
||||
};
|
||||
}
|
||||
|
||||
/* Define operators for using >> and << with irc::string to an ostream on an istream. */
|
||||
/* This was endless fun. No. Really. */
|
||||
/* It was also the first core change Ommeh made, if anyone cares */
|
||||
|
||||
/** Operator >> for irc::string
|
||||
*/
|
||||
inline std::istream &operator>>(std::istream &is, irc::string &str)
|
||||
{
|
||||
std::string tmp;
|
||||
is >> tmp;
|
||||
str = tmp.c_str();
|
||||
return is;
|
||||
}
|
||||
|
||||
/** Operator >> for ci::string
|
||||
*/
|
||||
inline std::istream &operator>>(std::istream &is, ci::string &str)
|
||||
{
|
||||
std::string tmp;
|
||||
is >> tmp;
|
||||
str = tmp.c_str();
|
||||
return is;
|
||||
}
|
||||
|
||||
/* Define operators for + and == with irc::string to std::string for easy assignment
|
||||
* and comparison
|
||||
*
|
||||
* Operator +
|
||||
*/
|
||||
inline std::string operator+(std::string &leftval, irc::string &rightval)
|
||||
{
|
||||
return leftval + std::string(rightval.c_str());
|
||||
}
|
||||
|
||||
/* Define operators for + and == with irc::string to std::string for easy assignment
|
||||
* and comparison
|
||||
*
|
||||
* Operator +
|
||||
*/
|
||||
inline irc::string operator+(irc::string &leftval, std::string &rightval)
|
||||
{
|
||||
return leftval + irc::string(rightval.c_str());
|
||||
}
|
||||
|
||||
/* Define operators for + and == with ci::string to std::string for easy assignment
|
||||
@@ -380,46 +151,6 @@ inline ci::string operator+(ci::string &leftval, std::string &rightval)
|
||||
return leftval + ci::string(rightval.c_str());
|
||||
}
|
||||
|
||||
/* Define operators for + and == with irc::string to ci::string for easy assignment
|
||||
* and comparison
|
||||
*
|
||||
* Operator +
|
||||
*/
|
||||
inline irc::string operator+(irc::string &leftval, ci::string &rightval)
|
||||
{
|
||||
return leftval + irc::string(rightval.c_str());
|
||||
}
|
||||
|
||||
/* Define operators for + and == with irc::string to ci::string for easy assignment
|
||||
* and comparison
|
||||
*
|
||||
* Operator +
|
||||
*/
|
||||
inline ci::string operator+(ci::string &leftval, irc::string &rightval)
|
||||
{
|
||||
return leftval + ci::string(rightval.c_str());
|
||||
}
|
||||
|
||||
/* Define operators for + and == with irc::string to std::string for easy assignment
|
||||
* and comparison
|
||||
*
|
||||
* Operator ==
|
||||
*/
|
||||
inline bool operator==(const std::string &leftval, const irc::string &rightval)
|
||||
{
|
||||
return leftval.c_str() == rightval;
|
||||
}
|
||||
|
||||
/* Define operators for + and == with irc::string to std::string for easy assignment
|
||||
* and comparison
|
||||
*
|
||||
* Operator ==
|
||||
*/
|
||||
inline bool operator==(const irc::string &leftval, const std::string &rightval)
|
||||
{
|
||||
return leftval == rightval.c_str();
|
||||
}
|
||||
|
||||
/* Define operators for + and == with ci::string to std::string for easy assignment
|
||||
* and comparison
|
||||
*
|
||||
@@ -440,40 +171,6 @@ inline bool operator==(const ci::string &leftval, const std::string &rightval)
|
||||
return leftval == rightval.c_str();
|
||||
}
|
||||
|
||||
/* Define operators for + and == with irc::string to ci::string for easy assignment
|
||||
* and comparison
|
||||
*
|
||||
* Operator ==
|
||||
*/
|
||||
inline bool operator==(const ci::string &leftval, const irc::string &rightval)
|
||||
{
|
||||
return leftval.c_str() == rightval;
|
||||
}
|
||||
|
||||
/* Define operators for + and == with irc::string to ci::string for easy assignment
|
||||
* and comparison
|
||||
*
|
||||
* Operator ==
|
||||
*/
|
||||
inline bool operator==(const irc::string &leftval, const ci::string &rightval)
|
||||
{
|
||||
return leftval == rightval.c_str();
|
||||
}
|
||||
|
||||
/* Define operators != for irc::string to std::string for easy comparison
|
||||
*/
|
||||
inline bool operator!=(const irc::string &leftval, const std::string &rightval)
|
||||
{
|
||||
return !(leftval == rightval.c_str());
|
||||
}
|
||||
|
||||
/* Define operators != for std::string to irc::string for easy comparison
|
||||
*/
|
||||
inline bool operator!=(const std::string &leftval, const irc::string &rightval)
|
||||
{
|
||||
return !(leftval.c_str() == rightval);
|
||||
}
|
||||
|
||||
/* Define operators != for ci::string to std::string for easy comparison
|
||||
*/
|
||||
inline bool operator!=(const ci::string &leftval, const std::string &rightval)
|
||||
@@ -481,25 +178,11 @@ inline bool operator!=(const ci::string &leftval, const std::string &rightval)
|
||||
return !(leftval == rightval.c_str());
|
||||
}
|
||||
|
||||
/* Define operators != for ci::string to irc::string for easy comparison
|
||||
/* Define operators != for std::string to ci::string for easy comparison
|
||||
*/
|
||||
inline bool operator!=(const std::string &leftval, const ci::string &rightval)
|
||||
{
|
||||
return !(leftval.c_str() == rightval);
|
||||
}
|
||||
|
||||
/* Define operators != for irc::string to ci::string for easy comparison
|
||||
*/
|
||||
inline bool operator!=(const irc::string &leftval, const ci::string &rightval)
|
||||
{
|
||||
return !(leftval == rightval.c_str());
|
||||
}
|
||||
|
||||
/* Define operators != for irc::string to ci::string for easy comparison
|
||||
*/
|
||||
inline bool operator!=(const ci::string &leftval, const irc::string &rightval)
|
||||
{
|
||||
return !(leftval.c_str() == rightval);
|
||||
}
|
||||
|
||||
#endif // HASHCOMP_H
|
||||
|
||||
+1
-16
@@ -1,6 +1,6 @@
|
||||
/* Commonly used language strings
|
||||
*
|
||||
* (C) 2008-2011 Anope Team
|
||||
* (C) 2008-2012 Anope Team
|
||||
* Contact us at team@anope.org
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
@@ -30,7 +30,6 @@
|
||||
#define NO_REASON _("No reason")
|
||||
#define UNKNOWN _("<unknown>")
|
||||
#define NO_EXPIRE _("does not expire")
|
||||
#define END_OF_ANY_LIST _("End of \002%s\002 list.")
|
||||
#define LIST_INCORRECT_RANGE _("Incorrect range specified. The correct syntax is \002#\037from\037-\037to\037\002.")
|
||||
#define UNKNOWN_OPTION _("Unknown option \002%s\002.\n" \
|
||||
"Type %s%s HELP %s for more information.")
|
||||
@@ -47,7 +46,6 @@
|
||||
#define NICK_SET_UNKNOWN_OPTION _("Unknown SET option \002%s%s\002.")
|
||||
#define NICK_SET_DISPLAY_CHANGED _("The new display is now \002%s\002.")
|
||||
#define NICK_LIST_SYNTAX _("LIST \037pattern\037")
|
||||
#define LIST_HEADER _("List of entries matching \002%s\002:")
|
||||
#define NICK_RECOVERED _("User claiming your nick has been killed.\n" \
|
||||
"\002%s%s RELEASE %s\002 to get it back before %s timeout.")
|
||||
#define NICK_REQUESTED _("This nick has already been requested, please check your e-mail address for the pass code")
|
||||
@@ -62,16 +60,8 @@
|
||||
#define CHAN_SETTING_UNSET _("%s for %s unset.")
|
||||
#define CHAN_SET_MLOCK_DEPRECATED _("MLOCK is deprecated. Use \002%s%s HELP MODE\002 instead.")
|
||||
#define CHAN_ACCESS_LEVEL_RANGE _("Access level must be between %d and %d inclusive.")
|
||||
#define CHAN_ACCESS_LIST_HEADER _("Access list for %s:\n" \
|
||||
" Num Lev Mask")
|
||||
#define CHAN_ACCESS_VIEW_AXS_FORMAT _(" %3d %4d %s\n" \
|
||||
" by %s on %s, last seen %s")
|
||||
#define CHAN_AKICK_VIEW_FORMAT _("%3d %s (by %s on %s)\n" \
|
||||
" %s")
|
||||
#define CHAN_INFO_HEADER _("Information for channel \002%s\002:")
|
||||
#define CHAN_EXCEPTED _("\002%s\002 matches an except on %s and cannot be banned until the except have been removed.")
|
||||
#define CHAN_LIST_ENTRY _("%3d %s\n" \
|
||||
" Added by %s on %s")
|
||||
#define MEMO_NEW_X_MEMO_ARRIVED _("There is a new memo on channel %s.\n" \
|
||||
"Type \002%s%s READ %s %d\002 to read it.")
|
||||
#define MEMO_NEW_MEMO_ARRIVED _("You have a new memo from %s.\n" \
|
||||
@@ -86,11 +76,6 @@
|
||||
#define BOT_NOT_ASSIGNED _("You must assign a bot to the channel before using this command.")
|
||||
#define BOT_NOT_ON_CHANNEL _("Bot is not on channel \002%s\002.")
|
||||
#define BOT_ASSIGN_READONLY _("Sorry, bot assignment is temporarily disabled.")
|
||||
#define ENABLED _("Enabled")
|
||||
#define DISABLED _("Disabled")
|
||||
#define OPER_LIST_FORMAT _(" %3d %-32s %s")
|
||||
#define OPER_VIEW_FORMAT _("%3d %s (by %s on %s; %s)\n" \
|
||||
" %s")
|
||||
#define HOST_SET_ERROR _("A vhost must be in the format of a valid hostmask.")
|
||||
#define HOST_SET_IDENT_ERROR _("A vhost ident must be in the format of a valid ident")
|
||||
#define HOST_SET_TOOLONG _("Error! The vhost is too long, please use a host shorter than %d characters.")
|
||||
|
||||
@@ -0,0 +1,94 @@
|
||||
/*
|
||||
*
|
||||
* (C) 2003-2012 Anope Team
|
||||
* Contact us at team@anope.org
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
*
|
||||
* Based on the original code of Epona by Lara.
|
||||
* Based on the original code of Services by Andy Church.
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef LISTS_H
|
||||
#define LISTS_H
|
||||
|
||||
#include "services.h"
|
||||
#include "anope.h"
|
||||
|
||||
/** A class to process numbered lists (passed to most DEL/LIST/VIEW commands).
|
||||
* The function HandleNumber is called for every number in the list. Note that
|
||||
* if descending is true it gets called in descending order. This is so deleting
|
||||
* the index passed to the function from an array will not cause the other indexes
|
||||
* passed to the function to be incorrect. This keeps us from having to have an
|
||||
* 'in use' flag on everything.
|
||||
*/
|
||||
class CoreExport NumberList
|
||||
{
|
||||
private:
|
||||
bool is_valid;
|
||||
|
||||
std::set<unsigned> numbers;
|
||||
|
||||
bool desc;
|
||||
public:
|
||||
/** Processes a numbered list
|
||||
* @param list The list
|
||||
* @param descending True to make HandleNumber get called with numbers in descending order
|
||||
*/
|
||||
NumberList(const Anope::string &list, bool descending);
|
||||
|
||||
/** Destructor, does nothing
|
||||
*/
|
||||
virtual ~NumberList();
|
||||
|
||||
/** Should be called after the constructors are done running. This calls the callbacks.
|
||||
*/
|
||||
void Process();
|
||||
|
||||
/** Called with a number from the list
|
||||
* @param Number The number
|
||||
*/
|
||||
virtual void HandleNumber(unsigned Number);
|
||||
|
||||
/** Called when there is an error with the numbered list
|
||||
* Return false to immediatly stop processing the list and return
|
||||
* This is all done before we start calling HandleNumber, so no numbers will have been processed yet
|
||||
* @param list The list
|
||||
* @return false to stop processing
|
||||
*/
|
||||
virtual bool InvalidRange(const Anope::string &list);
|
||||
};
|
||||
|
||||
/** This class handles formatting LIST/VIEW replies.
|
||||
*/
|
||||
class CoreExport ListFormatter
|
||||
{
|
||||
public:
|
||||
typedef std::map<Anope::string, Anope::string> ListEntry;
|
||||
private:
|
||||
std::vector<Anope::string> columns;
|
||||
std::vector<ListEntry> entries;
|
||||
public:
|
||||
ListFormatter &addColumn(const Anope::string &name);
|
||||
void addEntry(const ListEntry &entry);
|
||||
bool isEmpty() const;
|
||||
void Process(std::vector<Anope::string> &);
|
||||
};
|
||||
|
||||
/** This class handles formatting INFO replies
|
||||
*/
|
||||
class CoreExport InfoFormatter
|
||||
{
|
||||
NickCore *nc;
|
||||
std::vector<std::pair<Anope::string, Anope::string> > replies;
|
||||
unsigned longest;
|
||||
public:
|
||||
InfoFormatter(NickCore *nc);
|
||||
void Process(std::vector<Anope::string> &);
|
||||
Anope::string &operator[](const Anope::string &key);
|
||||
};
|
||||
|
||||
#endif // LISTS_H
|
||||
|
||||
+32
-10
@@ -1,6 +1,21 @@
|
||||
/*
|
||||
*
|
||||
* (C) 2003-2012 Anope Team
|
||||
* Contact us at team@anope.org
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
*
|
||||
* Based on the original code of Epona by Lara.
|
||||
* Based on the original code of Services by Andy Church.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef LOGGER_H
|
||||
#define LOGGER_H
|
||||
|
||||
#include "anope.h"
|
||||
#include "defs.h"
|
||||
|
||||
enum LogType
|
||||
{
|
||||
LOG_ADMIN,
|
||||
@@ -29,36 +44,44 @@ struct LogFile
|
||||
Anope::string GetName() const;
|
||||
};
|
||||
|
||||
class Command;
|
||||
|
||||
class CoreExport Log
|
||||
{
|
||||
public:
|
||||
BotInfo *bi;
|
||||
const BotInfo *bi;
|
||||
Anope::string nick;
|
||||
const User *u;
|
||||
const NickCore *nc;
|
||||
Command *c;
|
||||
Channel *chan;
|
||||
const ChannelInfo *ci;
|
||||
Server *s;
|
||||
LogType Type;
|
||||
Anope::string Category;
|
||||
std::list<Anope::string> Sources;
|
||||
|
||||
std::stringstream buf;
|
||||
|
||||
Log(LogType type = LOG_NORMAL, const Anope::string &category = "", BotInfo *bi = NULL);
|
||||
Log(LogType type = LOG_NORMAL, const Anope::string &category = "", const BotInfo *bi = NULL);
|
||||
|
||||
/* LOG_COMMAND/OVERRIDE/ADMIN */
|
||||
Log(LogType type, User *u, Command *c, ChannelInfo *ci = NULL);
|
||||
Log(LogType type, const CommandSource &source, Command *c, const ChannelInfo *ci = NULL);
|
||||
|
||||
/* LOG_CHANNEL */
|
||||
Log(User *u, Channel *c, const Anope::string &category = "");
|
||||
Log(const User *u, Channel *c, const Anope::string &category = "");
|
||||
|
||||
/* LOG_USER */
|
||||
explicit Log(User *u, const Anope::string &category = "");
|
||||
explicit Log(const User *u, const Anope::string &category = "", const BotInfo *bi = NULL);
|
||||
|
||||
/* LOG_SERVER */
|
||||
Log(Server *s, const Anope::string &category = "");
|
||||
explicit Log(Server *s, const Anope::string &category = "", const BotInfo *bi = NULL);
|
||||
|
||||
Log(BotInfo *b, const Anope::string &category = "");
|
||||
explicit Log(const BotInfo *b, const Anope::string &category = "");
|
||||
|
||||
~Log();
|
||||
|
||||
Anope::string BuildPrefix() const;
|
||||
|
||||
template<typename T> Log &operator<<(T val)
|
||||
{
|
||||
this->buf << val;
|
||||
@@ -73,7 +96,6 @@ class CoreExport LogInfo
|
||||
std::map<Anope::string, LogFile *> Logfiles;
|
||||
std::list<Anope::string> Sources;
|
||||
int LogAge;
|
||||
bool Inhabit;
|
||||
std::list<Anope::string> Admin;
|
||||
std::list<Anope::string> Override;
|
||||
std::list<Anope::string> Commands;
|
||||
@@ -84,7 +106,7 @@ class CoreExport LogInfo
|
||||
bool RawIO;
|
||||
bool Debug;
|
||||
|
||||
LogInfo(int logage, bool inhabit, bool rawio, bool debug);
|
||||
LogInfo(int logage, bool rawio, bool debug);
|
||||
|
||||
~LogInfo();
|
||||
|
||||
|
||||
+16
-1
@@ -1,9 +1,24 @@
|
||||
/*
|
||||
*
|
||||
* (C) 2003-2012 Anope Team
|
||||
* Contact us at team@anope.org
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
*
|
||||
* Based on the original code of Epona by Lara.
|
||||
* Based on the original code of Services by Andy Church.
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef MAIL_H
|
||||
#define MAIL_H
|
||||
|
||||
#include "anope.h"
|
||||
#include "threadengine.h"
|
||||
#include "serialize.h"
|
||||
|
||||
extern CoreExport bool Mail(User *u, NickCore *nc, BotInfo *service, const Anope::string &subject, const Anope::string &message);
|
||||
extern CoreExport bool Mail(User *u, NickCore *nc, const 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);
|
||||
|
||||
|
||||
@@ -0,0 +1,65 @@
|
||||
/*
|
||||
*
|
||||
* (C) 2003-2012 Anope Team
|
||||
* Contact us at team@anope.org
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
*
|
||||
* Based on the original code of Epona by Lara.
|
||||
* Based on the original code of Services by Andy Church.
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef MEMO_H
|
||||
#define MEMO_H
|
||||
|
||||
#include "anope.h"
|
||||
#include "serialize.h"
|
||||
|
||||
/** Memo Flags
|
||||
*/
|
||||
enum MemoFlag
|
||||
{
|
||||
/* Memo is unread */
|
||||
MF_UNREAD,
|
||||
/* Sender requests a receipt */
|
||||
MF_RECEIPT
|
||||
};
|
||||
|
||||
const Anope::string MemoFlagStrings[] = {
|
||||
"MF_UNREAD", "MF_RECEIPT", ""
|
||||
};
|
||||
|
||||
/* 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>, public Serializable
|
||||
{
|
||||
public:
|
||||
Memo();
|
||||
|
||||
const Anope::string serialize_name() const anope_override;
|
||||
Serialize::Data serialize() const anope_override;
|
||||
static Serializable* unserialize(Serializable *obj, Serialize::Data &);
|
||||
|
||||
Anope::string owner;
|
||||
time_t time; /* When it was sent */
|
||||
Anope::string sender;
|
||||
Anope::string text;
|
||||
};
|
||||
|
||||
struct CoreExport MemoInfo
|
||||
{
|
||||
int16_t memomax;
|
||||
serialize_checker<std::vector<Memo *> > memos;
|
||||
std::vector<Anope::string> ignores;
|
||||
|
||||
MemoInfo();
|
||||
Memo *GetMemo(unsigned index) const;
|
||||
unsigned GetIndex(Memo *m) const;
|
||||
void Del(unsigned index);
|
||||
void Del(Memo *m);
|
||||
bool HasIgnore(User *u);
|
||||
};
|
||||
|
||||
#endif // MEMO_H
|
||||
+73
-44
@@ -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-2012 Anope Team <team@anope.org>
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
*/
|
||||
@@ -9,6 +9,9 @@
|
||||
#ifndef MODES_H
|
||||
#define MODES_H
|
||||
|
||||
#include "anope.h"
|
||||
#include "base.h"
|
||||
|
||||
/** All of the valid user mode names
|
||||
*/
|
||||
enum UserModeName
|
||||
@@ -16,10 +19,10 @@ 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_NOCTCP, 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,
|
||||
UMODE_COMMONCHANS, UMODE_HIDDEN, UMODE_STRIPCOLOR, UMODE_INVISIBLE_OPER, UMODE_RESTRICTED, UMODE_HIDEIDLE,
|
||||
|
||||
UMODE_END
|
||||
};
|
||||
@@ -28,10 +31,10 @@ 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_REGPRIV", "UMODE_PROTECTED", "UMODE_NOCTCP", "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"
|
||||
"UMODE_COMMONCHANS", "UMODE_HIDDEN", "UMODE_STRIPCOLOR", "UMODE_INVISIBLE_OPER", "UMODE_RESTRICTED", "UMODE_HIDEIDLE",
|
||||
|
||||
""
|
||||
};
|
||||
@@ -228,7 +231,7 @@ class CoreExport ChannelModeList : public ChannelMode
|
||||
* @param e The entry to match against
|
||||
* @return true on match
|
||||
*/
|
||||
virtual bool Matches(User *u, const Entry *e) { return false; }
|
||||
virtual bool Matches(const User *u, const Entry *e) { return false; }
|
||||
|
||||
/** Called when a mask is added to a channel
|
||||
* @param chan The channel
|
||||
@@ -276,13 +279,18 @@ class CoreExport ChannelModeStatus : public ChannelMode
|
||||
public:
|
||||
/* The symbol, eg @ % + */
|
||||
char Symbol;
|
||||
/* The "level" of the mode, used to compare with other modes.
|
||||
* Used so we know op > halfop > voice etc.
|
||||
*/
|
||||
unsigned short Level;
|
||||
|
||||
/** Default constructor
|
||||
* @param mName The mode name
|
||||
* @param modeChar The mode char
|
||||
* @param mSymbol The symbol for the mode, eg @ % +
|
||||
* @param mSymbol The symbol for the mode, eg @ %
|
||||
* @param mLevel A level for the mode, which is usually determined by the PREFIX capab
|
||||
*/
|
||||
ChannelModeStatus(ChannelModeName mName, char modeChar, char mSymbol);
|
||||
ChannelModeStatus(ChannelModeName mName, char modeChar, char mSymbol, unsigned short mLevel = 0);
|
||||
|
||||
/** Default destructor
|
||||
*/
|
||||
@@ -296,7 +304,7 @@ class CoreExport ChannelModeKey : public ChannelModeParam
|
||||
public:
|
||||
ChannelModeKey(char modeChar) : ChannelModeParam(CMODE_KEY, modeChar) { }
|
||||
|
||||
bool IsValid(const Anope::string &value) const;
|
||||
bool IsValid(const Anope::string &value) const anope_override;
|
||||
};
|
||||
|
||||
/** This class is used for channel mode +A (Admin only)
|
||||
@@ -308,7 +316,7 @@ class CoreExport ChannelModeAdmin : public ChannelMode
|
||||
ChannelModeAdmin(char modeChar) : ChannelMode(CMODE_ADMINONLY, modeChar) { }
|
||||
|
||||
/* Opers only */
|
||||
bool CanSet(User *u) const;
|
||||
bool CanSet(User *u) const anope_override;
|
||||
};
|
||||
|
||||
/** This class is used for channel mode +O (Opers only)
|
||||
@@ -320,7 +328,7 @@ class CoreExport ChannelModeOper : public ChannelMode
|
||||
ChannelModeOper(char modeChar) : ChannelMode(CMODE_OPERONLY, modeChar) { }
|
||||
|
||||
/* Opers only */
|
||||
bool CanSet(User *u) const;
|
||||
bool CanSet(User *u) const anope_override;
|
||||
};
|
||||
|
||||
/** This class is used for channel mode +r (registered channel)
|
||||
@@ -332,26 +340,18 @@ class CoreExport ChannelModeRegistered : public ChannelMode
|
||||
ChannelModeRegistered(char modeChar) : ChannelMode(CMODE_REGISTERED, modeChar) { }
|
||||
|
||||
/* No one mlocks +r */
|
||||
bool CanSet(User *u) const;
|
||||
};
|
||||
|
||||
enum StackerType
|
||||
{
|
||||
ST_CHANNEL,
|
||||
ST_USER
|
||||
bool CanSet(User *u) const anope_override;
|
||||
};
|
||||
|
||||
class StackerInfo
|
||||
{
|
||||
public:
|
||||
/* Modes to be added */
|
||||
std::list<std::pair<Base *, Anope::string> > AddModes;
|
||||
std::list<std::pair<Mode *, Anope::string> > AddModes;
|
||||
/* Modes to be deleted */
|
||||
std::list<std::pair<Base *, Anope::string> > DelModes;
|
||||
/* The type of object this stacker info is for */
|
||||
StackerType Type;
|
||||
std::list<std::pair<Mode *, Anope::string> > DelModes;
|
||||
/* Bot this is sent from */
|
||||
BotInfo *bi;
|
||||
const BotInfo *bi;
|
||||
|
||||
/** Add a mode to this object
|
||||
* @param mode The mode
|
||||
@@ -371,13 +371,8 @@ class CoreExport ModeManager
|
||||
{
|
||||
protected:
|
||||
/* List of pairs of user/channels and their stacker info */
|
||||
static std::list<std::pair<Base *, StackerInfo *> > StackerObjects;
|
||||
|
||||
/** Get the stacker info for an item, if one doesnt exist it is created
|
||||
* @param Item The user/channel etc
|
||||
* @return The stacker info
|
||||
*/
|
||||
static StackerInfo *GetInfo(Base *Item);
|
||||
static std::map<User *, StackerInfo *> UserStackerObjects;
|
||||
static std::map<Channel *, StackerInfo *> ChannelStackerObjects;
|
||||
|
||||
/** Build a list of mode strings to send to the IRCd from the mode stacker
|
||||
* @param info The stacker info for a channel or user
|
||||
@@ -385,16 +380,6 @@ class CoreExport ModeManager
|
||||
*/
|
||||
static std::list<Anope::string> BuildModeStrings(StackerInfo *info);
|
||||
|
||||
/** Really add a mode to the stacker, internal use only
|
||||
* @param bi The client to set the modes from
|
||||
* @param Object The object, user/channel
|
||||
* @param mode The mode
|
||||
* @param Set Adding or removing?
|
||||
* @param Param A param, if there is one
|
||||
* @param Type The type this is, user or channel
|
||||
*/
|
||||
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;
|
||||
@@ -461,7 +446,7 @@ class CoreExport ModeManager
|
||||
* @param Set true for setting, false for removing
|
||||
* @param Param The param, if there is one
|
||||
*/
|
||||
static void StackerAdd(BotInfo *bi, Channel *c, ChannelMode *cm, bool Set, const Anope::string &Param = "");
|
||||
static void StackerAdd(const BotInfo *bi, Channel *c, ChannelMode *cm, bool Set, const Anope::string &Param = "");
|
||||
|
||||
/** Add a mode to the stacker to be set on a user
|
||||
* @param bi The client to set the modes from
|
||||
@@ -470,16 +455,60 @@ class CoreExport ModeManager
|
||||
* @param Set true for setting, false for removing
|
||||
* @param param The param, if there is one
|
||||
*/
|
||||
static void StackerAdd(BotInfo *bi, User *u, UserMode *um, bool Set, const Anope::string &Param = "");
|
||||
static void StackerAdd(const BotInfo *bi, User *u, UserMode *um, bool Set, const Anope::string &Param = "");
|
||||
|
||||
/** Process all of the modes in the stacker and send them to the IRCd to be set on channels/users
|
||||
*/
|
||||
static void ProcessModes();
|
||||
|
||||
/** Delete a user or channel from the stacker
|
||||
* @param b The user/channel
|
||||
*/
|
||||
static void StackerDel(Base *b);
|
||||
static void StackerDel(User *u);
|
||||
static void StackerDel(Channel *c);
|
||||
};
|
||||
|
||||
/** Entry flags
|
||||
*/
|
||||
enum EntryType
|
||||
{
|
||||
ENTRYTYPE_NONE,
|
||||
ENTRYTYPE_CIDR,
|
||||
ENTRYTYPE_NICK_WILD,
|
||||
ENTRYTYPE_NICK,
|
||||
ENTRYTYPE_USER_WILD,
|
||||
ENTRYTYPE_USER,
|
||||
ENTRYTYPE_HOST_WILD,
|
||||
ENTRYTYPE_HOST
|
||||
};
|
||||
|
||||
/** Represents a mask set on a channel (b/e/I)
|
||||
*/
|
||||
class CoreExport Entry : public Flags<EntryType>
|
||||
{
|
||||
ChannelModeName modename;
|
||||
|
||||
public:
|
||||
unsigned char cidr_len;
|
||||
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(const User *u, bool full = false) const;
|
||||
};
|
||||
|
||||
#endif // MODES_H
|
||||
|
||||
+50
-2
@@ -1,9 +1,57 @@
|
||||
/*
|
||||
*
|
||||
* (C) 2003-2012 Anope Team
|
||||
* Contact us at team@anope.org
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
*
|
||||
* Based on the original code of Epona by Lara.
|
||||
* Based on the original code of Services by Andy Church.
|
||||
*/
|
||||
|
||||
#ifndef MODULE_H
|
||||
#define MODULE_H
|
||||
|
||||
#include "services.h"
|
||||
/* Just include everything for now */
|
||||
#include "access.h"
|
||||
#include "account.h"
|
||||
#include "anope.h"
|
||||
#include "base.h"
|
||||
#include "bots.h"
|
||||
#include "botserv.h"
|
||||
#include "channels.h"
|
||||
#include "commands.h"
|
||||
#include "config.h"
|
||||
#include "dns.h"
|
||||
#include "extensible.h"
|
||||
#include "extern.h"
|
||||
#include "hashcomp.h"
|
||||
#include "language.h"
|
||||
#include "lists.h"
|
||||
#include "logger.h"
|
||||
#include "mail.h"
|
||||
#include "memo.h"
|
||||
#include "modes.h"
|
||||
#include "modules.h"
|
||||
#include "oper.h"
|
||||
#include "commands.h"
|
||||
#include "opertype.h"
|
||||
#include "protocol.h"
|
||||
#include "regexpr.h"
|
||||
#include "regchannel.h"
|
||||
#include "serialize.h"
|
||||
#include "servers.h"
|
||||
#include "service.h"
|
||||
#include "services.h"
|
||||
#include "signals.h"
|
||||
#include "socketengine.h"
|
||||
#include "sockets.h"
|
||||
#include "threadengine.h"
|
||||
#include "timers.h"
|
||||
#include "uplink.h"
|
||||
#include "users.h"
|
||||
|
||||
#include "global.h"
|
||||
#include "memoserv.h"
|
||||
#include "nickserv.h"
|
||||
|
||||
#endif // MODULE_H
|
||||
|
||||
+136
-290
@@ -1,6 +1,6 @@
|
||||
/* Modular support
|
||||
*
|
||||
* (C) 2003-2011 Anope Team
|
||||
* (C) 2003-2012 Anope Team
|
||||
* Contact us at team@anope.org
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
@@ -9,45 +9,49 @@
|
||||
* Based on the original code of Services by Andy Church.
|
||||
*/
|
||||
|
||||
#include "serialize.h"
|
||||
|
||||
#ifndef MODULES_H
|
||||
#define MODULES_H
|
||||
|
||||
#include <time.h>
|
||||
#include "services.h"
|
||||
#include <stdio.h>
|
||||
#include "base.h"
|
||||
#include "modes.h"
|
||||
#include "timers.h"
|
||||
#include "hashcomp.h"
|
||||
#include "logger.h"
|
||||
#include "extensible.h"
|
||||
|
||||
/* Cross OS compatibility macros */
|
||||
/** 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.
|
||||
*/
|
||||
#ifdef _WIN32
|
||||
typedef HMODULE ano_module_t;
|
||||
|
||||
# define dlopen(file, unused) LoadLibrary(file)
|
||||
# define dlsym(file, symbol) (HMODULE)GetProcAddress(file, symbol)
|
||||
# define dlclose(file) FreeLibrary(file) ? 0 : 1
|
||||
# define ano_modclearerr() SetLastError(0)
|
||||
# define ano_moderr() (Anope::LastError().empty() ? NULL : Anope::LastError().c_str())
|
||||
# define MODULE_INIT(x) \
|
||||
extern "C" DllExport Module *AnopeInit(const Anope::string &, const Anope::string &); \
|
||||
extern "C" Module *AnopeInit(const Anope::string &modname, const Anope::string &creator) \
|
||||
{ \
|
||||
return new x(modname, creator); \
|
||||
} \
|
||||
BOOLEAN WINAPI DllMain(HINSTANCE, DWORD nReason, LPVOID) \
|
||||
{ \
|
||||
return TRUE; \
|
||||
} \
|
||||
extern "C" DllExport void AnopeFini(x *); \
|
||||
extern "C" void AnopeFini(x *m) \
|
||||
{ \
|
||||
delete m; \
|
||||
}
|
||||
#else
|
||||
typedef void * ano_module_t;
|
||||
|
||||
/* We call dlerror() here because it clears the module error after being
|
||||
* called. This previously read 'errno = 0', but that didn't work on
|
||||
* all POSIX-compliant architectures. This way the error is guaranteed
|
||||
* to be cleared, POSIX-wise. -GD
|
||||
*/
|
||||
# define ano_modclearerr() dlerror()
|
||||
# define ano_moderr() dlerror()
|
||||
# define MODULE_INIT(x) \
|
||||
extern "C" DllExport Module *AnopeInit(const Anope::string &modname, const Anope::string &creator) \
|
||||
{ \
|
||||
return new x(modname, creator); \
|
||||
} \
|
||||
extern "C" DllExport void AnopeFini(x *m) \
|
||||
{ \
|
||||
delete m; \
|
||||
}
|
||||
#endif
|
||||
|
||||
/** Possible return types from events.
|
||||
*/
|
||||
enum EventReturn
|
||||
{
|
||||
EVENT_STOP,
|
||||
EVENT_CONTINUE,
|
||||
EVENT_ALLOW
|
||||
};
|
||||
|
||||
/**
|
||||
* This #define allows us to call a method in all
|
||||
* loaded modules in a readable simple way, e.g.:
|
||||
@@ -56,8 +60,8 @@ enum EventReturn
|
||||
#define FOREACH_MOD(y, x) \
|
||||
if (true) \
|
||||
{ \
|
||||
std::vector<Module*>::iterator safei; \
|
||||
for (std::vector<Module*>::iterator _i = ModuleManager::EventHandlers[y].begin(); _i != ModuleManager::EventHandlers[y].end(); ) \
|
||||
std::vector<Module *>::iterator safei; \
|
||||
for (std::vector<Module *>::iterator _i = ModuleManager::EventHandlers[y].begin(); _i != ModuleManager::EventHandlers[y].end(); ) \
|
||||
{ \
|
||||
safei = _i; \
|
||||
++safei; \
|
||||
@@ -83,9 +87,9 @@ else \
|
||||
#define FOREACH_RESULT(y, x) \
|
||||
if (true) \
|
||||
{ \
|
||||
std::vector<Module*>::iterator safei; \
|
||||
std::vector<Module *>::iterator safei; \
|
||||
MOD_RESULT = EVENT_CONTINUE; \
|
||||
for (std::vector<Module*>::iterator _i = ModuleManager::EventHandlers[y].begin(); _i != ModuleManager::EventHandlers[y].end(); ) \
|
||||
for (std::vector<Module *>::iterator _i = ModuleManager::EventHandlers[y].begin(); _i != ModuleManager::EventHandlers[y].end(); ) \
|
||||
{ \
|
||||
safei = _i; \
|
||||
++safei; \
|
||||
@@ -107,24 +111,15 @@ if (true) \
|
||||
else \
|
||||
static_cast<void>(0)
|
||||
|
||||
#ifndef _WIN32
|
||||
# include <dlfcn.h>
|
||||
/* Define these for systems without them */
|
||||
# ifndef RTLD_NOW
|
||||
# define RTLD_NOW 0
|
||||
# endif
|
||||
# ifndef RTLD_LAZY
|
||||
# define RTLD_LAZY RTLD_NOW
|
||||
# endif
|
||||
# ifndef RTLD_GLOBAL
|
||||
# define RTLD_GLOBAL 0
|
||||
# endif
|
||||
# ifndef RTLD_LOCAL
|
||||
# define RTLD_LOCAL 0
|
||||
# endif
|
||||
#endif
|
||||
/** Possible return types from events.
|
||||
*/
|
||||
enum EventReturn
|
||||
{
|
||||
EVENT_STOP,
|
||||
EVENT_CONTINUE,
|
||||
EVENT_ALLOW
|
||||
};
|
||||
|
||||
class Message;
|
||||
|
||||
enum ModuleReturn
|
||||
{
|
||||
@@ -148,27 +143,27 @@ enum ModType { MT_BEGIN, THIRD, SUPPORTED, CORE, DATABASE, ENCRYPTION, PROTOCOL,
|
||||
|
||||
typedef std::multimap<Anope::string, Message *> message_map;
|
||||
extern CoreExport message_map MessageMap;
|
||||
class Module;
|
||||
|
||||
extern CoreExport std::list<Module *> Modules;
|
||||
|
||||
class Version
|
||||
class ModuleVersion
|
||||
{
|
||||
private:
|
||||
int Major;
|
||||
int Minor;
|
||||
int Build;
|
||||
int Patch;
|
||||
|
||||
public:
|
||||
/** Constructor
|
||||
* @param vMajor The major version numbber
|
||||
* @param vMinor The minor version numbber
|
||||
* @param vBuild The build version numbber
|
||||
* @param vPatch The patch version numbber
|
||||
*/
|
||||
Version(int vMajor, int vMinor, int vBuild);
|
||||
ModuleVersion(int vMajor, int vMinor, int vPatch);
|
||||
|
||||
/** Destructor
|
||||
*/
|
||||
virtual ~Version();
|
||||
virtual ~ModuleVersion();
|
||||
|
||||
/** Get the major version of Anope this was built against
|
||||
* @return The major version
|
||||
@@ -180,15 +175,12 @@ class Version
|
||||
*/
|
||||
int GetMinor() const;
|
||||
|
||||
/** Get the build version this was built against
|
||||
* @return The build version
|
||||
/** Get the patch version this was built against
|
||||
* @return The patch version
|
||||
*/
|
||||
int GetBuild() const;
|
||||
int GetPatch() const;
|
||||
};
|
||||
|
||||
class CallBack;
|
||||
class XLineManager;
|
||||
struct CommandSource;
|
||||
|
||||
/** Every module in Anope is actually a class.
|
||||
*/
|
||||
@@ -215,7 +207,7 @@ class CoreExport Module : public Extensible
|
||||
|
||||
/** Handle for this module, obtained from dlopen()
|
||||
*/
|
||||
ano_module_t handle;
|
||||
void *handle;
|
||||
|
||||
/** Time this module was created
|
||||
*/
|
||||
@@ -268,7 +260,7 @@ class CoreExport Module : public Extensible
|
||||
* compiled against
|
||||
* @return The version
|
||||
*/
|
||||
Version GetVersion() const;
|
||||
ModuleVersion GetVersion() const;
|
||||
|
||||
/** Called when the ircd notifies that a user has been kicked from a channel.
|
||||
* @param c The channel the user has been kicked from.
|
||||
@@ -317,8 +309,9 @@ class CoreExport Module : public Extensible
|
||||
/** Called when someone uses the generic/help command
|
||||
* @param source Command source
|
||||
* @param params Params
|
||||
* @return EVENT_STOP to stop processing
|
||||
*/
|
||||
virtual void OnPreHelp(CommandSource &source, const std::vector<Anope::string> ¶ms) { }
|
||||
virtual EventReturn OnPreHelp(CommandSource &source, const std::vector<Anope::string> ¶ms) { return EVENT_CONTINUE; }
|
||||
|
||||
/** Called when someone uses the generic/help command
|
||||
* @param source Command source
|
||||
@@ -341,11 +334,6 @@ class CoreExport Module : public Extensible
|
||||
*/
|
||||
virtual void OnPostCommand(CommandSource &source, Command *command, const std::vector<Anope::string> ¶ms) { }
|
||||
|
||||
/** Called after the core has finished loading the databases, but before
|
||||
* we connect to the server
|
||||
*/
|
||||
virtual void OnPostLoadDatabases() { }
|
||||
|
||||
/** Called when the databases are saved
|
||||
* @return EVENT_CONTINUE to let other modules continue saving, EVENT_STOP to stop
|
||||
*/
|
||||
@@ -395,18 +383,13 @@ class CoreExport Module : public Extensible
|
||||
* @param ci The channel
|
||||
* @param bw The badword
|
||||
*/
|
||||
virtual void OnBadWordAdd(ChannelInfo *ci, BadWord *bw) { }
|
||||
virtual void OnBadWordAdd(ChannelInfo *ci, const BadWord *bw) { }
|
||||
|
||||
/** Called before a badword is deleted from a channel
|
||||
* @param ci The channel
|
||||
* @param bw The badword
|
||||
*/
|
||||
virtual void OnBadWordDel(ChannelInfo *ci, BadWord *bw) { }
|
||||
|
||||
/** Called in findbot()
|
||||
* @param nick The nick being looked up
|
||||
*/
|
||||
virtual void OnFindBot(const Anope::string &nick) { }
|
||||
virtual void OnBadWordDel(ChannelInfo *ci, const BadWord *bw) { }
|
||||
|
||||
/** Called before a bot kicks a user
|
||||
* @param bi The bot sending the kick
|
||||
@@ -453,15 +436,16 @@ class CoreExport Module : public Extensible
|
||||
|
||||
/** Called when a new topic is set
|
||||
* @param c The channel
|
||||
* @param setter The user who set the new topic
|
||||
* @param topic The new topic
|
||||
*/
|
||||
virtual void OnTopicUpdated(Channel *c, const Anope::string &topic) { }
|
||||
virtual void OnTopicUpdated(Channel *c, User *setter, const Anope::string &topic) { }
|
||||
|
||||
/** Called before a channel expires
|
||||
* @param ci The channel
|
||||
* @return EVENT_CONTINUE to let other modules decide, EVENT_STOP to halt the command and not process it
|
||||
* @param expire Set to true to allow the chan to expire
|
||||
*/
|
||||
virtual EventReturn OnPreChanExpire(ChannelInfo *ci) { return EVENT_CONTINUE; }
|
||||
virtual void OnPreChanExpire(ChannelInfo *ci, bool &expire) { }
|
||||
|
||||
/** Called before a channel expires
|
||||
* @param ci The channel
|
||||
@@ -484,73 +468,6 @@ class CoreExport Module : public Extensible
|
||||
*/
|
||||
virtual void OnServerDisconnect() { }
|
||||
|
||||
/** Called when the flatfile dbs are being written
|
||||
* @param Write A callback to the function used to insert a line into the database
|
||||
*/
|
||||
virtual void OnDatabaseWrite(void (*Write)(const Anope::string &)) { }
|
||||
|
||||
/** Called when a line is read from the database
|
||||
* @param params The params from the database
|
||||
* @return EVENT_CONTINUE to let other modules decide, EVENT_STOP to stop processing
|
||||
*/
|
||||
virtual EventReturn OnDatabaseRead(const std::vector<Anope::string> ¶ms) { return EVENT_CONTINUE; }
|
||||
|
||||
/** Called when nickcore metadata is read from the database
|
||||
* @param nc The nickcore
|
||||
* @param 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(NickCore *nc, const Anope::string &key, const std::vector<Anope::string> ¶ms) { return EVENT_CONTINUE; }
|
||||
|
||||
/** Called when nickcore metadata is read from the database
|
||||
* @param na The nickalias
|
||||
* @param 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(NickAlias *na, const Anope::string &key, const std::vector<Anope::string> ¶ms) { return EVENT_CONTINUE; }
|
||||
|
||||
/** Called when botinfo metadata is read from the database
|
||||
* @param bi The botinfo
|
||||
* @param 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(BotInfo *bi, const Anope::string &key, const std::vector<Anope::string> ¶ms) { return EVENT_CONTINUE; }
|
||||
|
||||
/** Called when chaninfo metadata is read from the database
|
||||
* @param ci The chaninfo
|
||||
* @param 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(ChannelInfo *ci, const Anope::string &key, const std::vector<Anope::string> ¶ms) { return EVENT_CONTINUE; }
|
||||
|
||||
/** Called when we are writing metadata for a nickcore
|
||||
* @param WriteMetata A callback function used to insert the metadata
|
||||
* @param nc The nickcore
|
||||
*/
|
||||
virtual void OnDatabaseWriteMetadata(void (*WriteMetadata)(const Anope::string &, const Anope::string &), NickCore *nc) { }
|
||||
|
||||
/** Called when we are wrting metadata for a nickalias
|
||||
* @param WriteMetata A callback function used to insert the metadata
|
||||
* @param na The nick alias
|
||||
*/
|
||||
virtual void OnDatabaseWriteMetadata(void (*WriteMetadata)(const Anope::string &, const Anope::string &), NickAlias *na) { }
|
||||
|
||||
/** Called when we are writing metadata for a botinfo
|
||||
* @param WriteMetata A callback function used to insert the metadata
|
||||
* @param bi The botinfo
|
||||
*/
|
||||
virtual void OnDatabaseWriteMetadata(void (*WriteMetadata)(const Anope::string &, const Anope::string &), BotInfo *bi) { }
|
||||
|
||||
/** Called when are are writing metadata for a channelinfo
|
||||
* @param WriteMetata A callback function used to insert the metadata
|
||||
* @param bi The channelinfo
|
||||
*/
|
||||
virtual void OnDatabaseWriteMetadata(void (*WriteMetadata)(const Anope::string &, const Anope::string &), ChannelInfo *ci) { }
|
||||
|
||||
/** Called when services restart
|
||||
*/
|
||||
virtual void OnRestart() { }
|
||||
@@ -561,9 +478,9 @@ class CoreExport Module : public Extensible
|
||||
|
||||
/** Called before a nick expires
|
||||
* @param na The nick
|
||||
* @return EVENT_CONTINUE to let other modules decide, EVENT_STOP to halt the command and not process it
|
||||
* @param expire Set to true to allow the nick to expire
|
||||
*/
|
||||
virtual EventReturn OnPreNickExpire(NickAlias *na) { return EVENT_CONTINUE; }
|
||||
virtual void OnPreNickExpire(NickAlias *na, bool &expire) { }
|
||||
|
||||
/** Called when a nick drops
|
||||
* @param na The nick
|
||||
@@ -582,25 +499,25 @@ class CoreExport Module : public Extensible
|
||||
virtual EventReturn OnExceptionAdd(Exception *ex) { return EVENT_CONTINUE; }
|
||||
|
||||
/** Called before an exception is deleted
|
||||
* @param u The user who is deleting it
|
||||
* @param source The source deleting it
|
||||
* @param ex The exceotion
|
||||
*/
|
||||
virtual void OnExceptionDel(User *u, Exception *ex) { }
|
||||
virtual void OnExceptionDel(CommandSource &source, Exception *ex) { }
|
||||
|
||||
/** Called before a XLine is added
|
||||
* @param u The user adding the XLine
|
||||
* @param source The source of the XLine
|
||||
* @param x The XLine
|
||||
* @param xlm The xline manager it was added to
|
||||
* @return EVENT_CONTINUE to let other modules decide, EVENT_STOP to halt the command and not process it
|
||||
*/
|
||||
virtual EventReturn OnAddXLine(User *u, XLine *x, XLineManager *xlm) { return EVENT_CONTINUE; }
|
||||
virtual EventReturn OnAddXLine(CommandSource &source, const XLine *x, XLineManager *xlm) { return EVENT_CONTINUE; }
|
||||
|
||||
/** Called before a XLine is deleted
|
||||
* @param u The user deleting the XLine
|
||||
* @param x The XLine, can be NULL for all XLines
|
||||
* @param source The source of the XLine
|
||||
* @param x The XLine
|
||||
* @param xlm The xline manager it was deleted from
|
||||
*/
|
||||
virtual void OnDelXLine(User *u, XLine *x, XLineManager *xlm) { }
|
||||
virtual void OnDelXLine(CommandSource &source, const XLine *x, XLineManager *xlm) { }
|
||||
|
||||
/** Called when a user is checked for whether they are a services oper
|
||||
* @param u The user
|
||||
@@ -641,41 +558,36 @@ 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 source The source of the command
|
||||
* @param access The access entry being removed
|
||||
*/
|
||||
virtual void OnAccessDel(ChannelInfo *ci, User *u, ChanAccess *access) { }
|
||||
virtual void OnAccessDel(ChannelInfo *ci, CommandSource &source, ChanAccess *access) { }
|
||||
|
||||
/** Called when access is added
|
||||
* @param ci The channel
|
||||
* @param u The user who added the access
|
||||
* @param source The source of the command
|
||||
* @param access The access changed
|
||||
*/
|
||||
virtual void OnAccessAdd(ChannelInfo *ci, User *u, ChanAccess *access) { }
|
||||
virtual void OnAccessAdd(ChannelInfo *ci, CommandSource &source, ChanAccess *access) { }
|
||||
|
||||
/** Called when the access list is cleared
|
||||
* @param ci The channel
|
||||
* @param u The user who cleared the access
|
||||
*/
|
||||
virtual void OnAccessClear(ChannelInfo *ci, User *u) { }
|
||||
virtual void OnAccessClear(ChannelInfo *ci, CommandSource &source) { }
|
||||
|
||||
/** Called when a level for a channel is changed
|
||||
* @param u The user changing the level
|
||||
* @param source The source of the command
|
||||
* @param ci The channel the level was changed on
|
||||
* @param pos The level position, can be -1 for resetting levels
|
||||
* @param priv The privilege changed
|
||||
* @param what The new level
|
||||
*/
|
||||
virtual void OnLevelChange(User *u, ChannelInfo *ci, int pos, int what) { }
|
||||
virtual void OnLevelChange(CommandSource &source, ChannelInfo *ci, const Anope::string &priv, int16_t what) { }
|
||||
|
||||
/** Called when a channel is dropped
|
||||
* @param chname The channel name
|
||||
*/
|
||||
virtual void OnChanDrop(const Anope::string &chname) { }
|
||||
|
||||
/** Called when a channel is forbidden
|
||||
/** Called right before a channel is dropped
|
||||
* @param ci The channel
|
||||
*/
|
||||
virtual void OnChanForbidden(ChannelInfo *ci) { }
|
||||
virtual void OnChanDrop(ChannelInfo *ci) { }
|
||||
|
||||
/** Called when a channel is registered
|
||||
* @param ci The channel
|
||||
@@ -713,18 +625,18 @@ class CoreExport Module : public Extensible
|
||||
virtual void OnChannelDelete(Channel *c) { }
|
||||
|
||||
/** Called after adding an akick to a channel
|
||||
* @param u The user adding the akick
|
||||
* @param source The source of the command
|
||||
* @param ci The channel
|
||||
* @param ak The akick
|
||||
*/
|
||||
virtual void OnAkickAdd(User *u, ChannelInfo *ci, AutoKick *ak) { }
|
||||
virtual void OnAkickAdd(CommandSource &source, ChannelInfo *ci, const AutoKick *ak) { }
|
||||
|
||||
/** Called before removing an akick from a channel
|
||||
* @param u The user removing the akick
|
||||
* @param source The source of the command
|
||||
* @param ci The channel
|
||||
* @param ak The akick
|
||||
*/
|
||||
virtual void OnAkickDel(User *u, ChannelInfo *ci, AutoKick *ak) { }
|
||||
virtual void OnAkickDel(CommandSource &source, ChannelInfo *ci, const AutoKick *ak) { }
|
||||
|
||||
/** Called after a user join a channel when we decide whether to kick them or not
|
||||
* @param u The user
|
||||
@@ -737,34 +649,30 @@ class CoreExport Module : public Extensible
|
||||
/** Called when a user requests info for a channel
|
||||
* @param source The user requesting info
|
||||
* @param ci The channel the user is requesting info for
|
||||
* @param info Data to show the user requesting information
|
||||
* @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(CommandSource &source, ChannelInfo *ci, InfoFormatter &info, bool ShowHidden) { }
|
||||
|
||||
/** Checks if access has the channel privilege 'priv'.
|
||||
* @param access THe access struct
|
||||
* @param priv The privilege being checked for
|
||||
* @return EVENT_ALLOW for yes, EVENT_STOP to stop all processing
|
||||
*/
|
||||
virtual EventReturn OnCheckPriv(ChanAccess *access, ChannelAccess priv) { return EVENT_CONTINUE; }
|
||||
virtual EventReturn OnCheckPriv(ChanAccess *access, const Anope::string &priv) { return EVENT_CONTINUE; }
|
||||
|
||||
/** Check whether an access group has a privilege
|
||||
* @param group The group
|
||||
* @param priv The privilege
|
||||
* @return MOD_ALLOW to allow, MOD_STOP to stop
|
||||
*/
|
||||
virtual EventReturn OnGroupCheckPriv(const AccessGroup *group, ChannelAccess priv) { return EVENT_CONTINUE; }
|
||||
virtual EventReturn OnGroupCheckPriv(const AccessGroup *group, const Anope::string &priv) { return EVENT_CONTINUE; }
|
||||
|
||||
/** Called when a nick is dropped
|
||||
* @param u The user dropping the nick
|
||||
* @param source The source of the command
|
||||
* @param na The nick
|
||||
*/
|
||||
virtual void OnNickDrop(User *u, NickAlias *na) { }
|
||||
virtual void OnNickDrop(CommandSource &source, NickAlias *na) { }
|
||||
|
||||
/** Called when a nick is forbidden
|
||||
* @param na The nick alias of the forbidden nick
|
||||
@@ -855,21 +763,10 @@ class CoreExport Module : public Extensible
|
||||
/** Called when a user requests info for a nick
|
||||
* @param source The user requesting info
|
||||
* @param na The nick the user is requesting info from
|
||||
* @param info Data to show the user requesting information
|
||||
* @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) { }
|
||||
virtual void OnNickInfo(CommandSource &source, NickAlias *na, InfoFormatter &info, bool ShowHidden) { }
|
||||
|
||||
/** Check whether a users password is correct.
|
||||
* @param u The user
|
||||
@@ -919,33 +816,33 @@ class CoreExport Module : public Extensible
|
||||
* @param nc The nickcore of the memo being deleted
|
||||
* @param mi The memo info
|
||||
* @param m The memo
|
||||
* @param number What memo number is being deleted, can be 0 for all memos
|
||||
*/
|
||||
virtual void OnMemoDel(const NickCore *nc, MemoInfo *mi, Memo *m) { }
|
||||
virtual void OnMemoDel(NickCore *nc, MemoInfo *mi, const Memo *m) { }
|
||||
|
||||
/** Called when a memo is deleted
|
||||
* @param ci The channel of the memo being deleted
|
||||
* @param mi The memo info
|
||||
* @param m The memo
|
||||
* @param number What memo number is being deleted, can be 0 for all memos
|
||||
*/
|
||||
virtual void OnMemoDel(ChannelInfo *ci, MemoInfo *mi, Memo *m) { }
|
||||
virtual void OnMemoDel(ChannelInfo *ci, MemoInfo *mi, const Memo *m) { }
|
||||
|
||||
/** Called when a mode is set on a channel
|
||||
* @param c The channel
|
||||
* @param setter The user who is setting the mode
|
||||
* @param Name The mode name
|
||||
* @param param The mode param, if there is one
|
||||
* @return EVENT_STOP to make mlock/secureops etc checks not happen
|
||||
*/
|
||||
virtual EventReturn OnChannelModeSet(Channel *c, ChannelModeName Name, const Anope::string ¶m) { return EVENT_CONTINUE; }
|
||||
virtual EventReturn OnChannelModeSet(Channel *c, User *setter, ChannelModeName Name, const Anope::string ¶m) { return EVENT_CONTINUE; }
|
||||
|
||||
/** Called when a mode is unset on a channel
|
||||
* @param c The channel
|
||||
* @param setter the user who is unsetting the mode
|
||||
* @param Name The mode name
|
||||
* @param param The mode param, if there is one
|
||||
* @return EVENT_STOP to make mlock/secureops etc checks not happen
|
||||
*/
|
||||
virtual EventReturn OnChannelModeUnset(Channel *c, ChannelModeName Name, const Anope::string ¶m) { return EVENT_CONTINUE; }
|
||||
virtual EventReturn OnChannelModeUnset(Channel *c, User *setter, ChannelModeName Name, const Anope::string ¶m) { return EVENT_CONTINUE; }
|
||||
|
||||
/** Called when a mode is set on a user
|
||||
* @param u The user
|
||||
@@ -978,10 +875,10 @@ class CoreExport Module : public Extensible
|
||||
|
||||
/** 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 lock The mode lock
|
||||
* @return EVENT_CONTINUE to let other modules decide, EVENT_STOP to deny the mlock.
|
||||
*/
|
||||
virtual EventReturn OnUnMLock(ChannelInfo *ci, ChannelMode *mode, const Anope::string ¶m) { return EVENT_CONTINUE; }
|
||||
virtual EventReturn OnUnMLock(ChannelInfo *ci, ModeLock *lock) { return EVENT_CONTINUE; }
|
||||
|
||||
/** Called after a module is loaded
|
||||
* @param u The user loading the module, can be NULL
|
||||
@@ -1019,6 +916,24 @@ class CoreExport Module : public Extensible
|
||||
* @param msg The message
|
||||
*/
|
||||
virtual void OnPrivmsg(User *u, Channel *c, Anope::string &msg) { }
|
||||
|
||||
/** Called when a message is logged
|
||||
* @param l The log message
|
||||
*/
|
||||
virtual void OnLog(Log *l) { }
|
||||
|
||||
/** Called when a channels modes are being checked to see if they are allowed,
|
||||
* mostly to ensure mlock/+r are set.
|
||||
* @param c The channel
|
||||
* @return EVENT_STOP to stop checking modes
|
||||
*/
|
||||
virtual EventReturn OnCheckModes(Channel *c) { return EVENT_CONTINUE; }
|
||||
|
||||
virtual void OnSerializeCheck(SerializeType *) { }
|
||||
virtual void OnSerializableConstruct(Serializable *) { }
|
||||
virtual void OnSerializableDestruct(Serializable *) { }
|
||||
virtual void OnSerializePtrAssign(Serializable *) { }
|
||||
virtual void OnSerializableUpdate(Serializable *) { }
|
||||
};
|
||||
|
||||
/** Implementation-specific flags which may be set in ModuleManager::Attach()
|
||||
@@ -1032,18 +947,18 @@ enum Implementation
|
||||
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_OnNickInfo, I_OnCheckAuthentication,
|
||||
I_OnNickUpdate,
|
||||
|
||||
/* ChanServ */
|
||||
I_OnChanForbidden, I_OnChanSuspend, I_OnChanDrop, I_OnPreChanExpire, I_OnChanExpire, I_OnAccessAdd,
|
||||
I_OnChanSuspend, I_OnChanDrop, I_OnPreChanExpire, I_OnChanExpire, I_OnAccessAdd,
|
||||
I_OnAccessDel, I_OnAccessClear, I_OnLevelChange, I_OnChanRegistered, I_OnChanUnsuspend, I_OnCreateChan, I_OnDelChan, I_OnChannelCreate,
|
||||
I_OnChannelDelete, I_OnAkickAdd, I_OnAkickDel, I_OnCheckKick,
|
||||
I_OnChanInfo, I_OnFindChan, I_OnCheckPriv, I_OnGroupCheckPriv,
|
||||
I_OnChannelDelete, I_OnAkickAdd, I_OnAkickDel, I_OnCheckKick, I_OnCheckModes,
|
||||
I_OnChanInfo, I_OnCheckPriv, I_OnGroupCheckPriv,
|
||||
|
||||
/* 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,
|
||||
@@ -1060,8 +975,7 @@ enum Implementation
|
||||
I_OnAddXLine, I_OnDelXLine, I_IsServicesOper,
|
||||
|
||||
/* Database */
|
||||
I_OnPostLoadDatabases, I_OnSaveDatabase, I_OnLoadDatabase,
|
||||
I_OnDatabaseWrite, I_OnDatabaseRead, I_OnDatabaseReadMetadata, I_OnDatabaseWriteMetadata,
|
||||
I_OnSaveDatabase, I_OnLoadDatabase,
|
||||
|
||||
/* Modules */
|
||||
I_OnModuleLoad, I_OnModuleUnload,
|
||||
@@ -1072,20 +986,16 @@ enum Implementation
|
||||
I_OnServerQuit, I_OnTopicUpdated,
|
||||
I_OnEncrypt, I_OnDecrypt,
|
||||
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_OnMLock, I_OnUnMLock, I_OnServerSync, I_OnUplinkSync, I_OnBotPrivmsg, I_OnPrivmsg, I_OnLog,
|
||||
|
||||
I_OnSerializeCheck, I_OnSerializableConstruct, I_OnSerializableDestruct, I_OnSerializePtrAssign, I_OnSerializableUpdate,
|
||||
I_END
|
||||
};
|
||||
|
||||
class Service;
|
||||
|
||||
/** Used to manage modules.
|
||||
*/
|
||||
class CoreExport ModuleManager
|
||||
{
|
||||
private:
|
||||
/** A map of service providers
|
||||
*/
|
||||
static std::map<Anope::string, Service *> ServiceProviders;
|
||||
public:
|
||||
/** Event handler hooks.
|
||||
* This needs to be public to be used by FOREACH_MOD and friends.
|
||||
@@ -1096,11 +1006,6 @@ class CoreExport ModuleManager
|
||||
*/
|
||||
static void CleanupRuntimeDirectory();
|
||||
|
||||
/** Load up a list of modules.
|
||||
* @param module_list The list of modules to load
|
||||
**/
|
||||
static void LoadModuleList(std::list<Anope::string> &ModList);
|
||||
|
||||
/** Loads a given module.
|
||||
* @param m the module to load
|
||||
* @param u the user who loaded it, NULL for auto-load
|
||||
@@ -1132,9 +1037,8 @@ class CoreExport ModuleManager
|
||||
* @param major The major version
|
||||
* @param minor The minor vesion
|
||||
* @param patch The patch version
|
||||
* @param build The build version
|
||||
*/
|
||||
static void RequireVersion(int major, int minor, int patch, int build);
|
||||
static void RequireVersion(int major, int minor, int patch);
|
||||
|
||||
/** Change the priority of one event in a module.
|
||||
* Each module event has a list of modules which are attached to that event type. If you wish to be called before or after other specific modules, you may use this
|
||||
@@ -1197,29 +1101,6 @@ class CoreExport ModuleManager
|
||||
*/
|
||||
static void UnloadAll();
|
||||
|
||||
/** Register a service
|
||||
* @param s The service
|
||||
* @return true if it was successfully registeed, else false (service name colision)
|
||||
*/
|
||||
static bool RegisterService(Service *s);
|
||||
|
||||
/** Unregister a service
|
||||
* @param s The service
|
||||
* @return true if it was unregistered successfully
|
||||
*/
|
||||
static bool UnregisterService(Service *s);
|
||||
|
||||
/** Get a service
|
||||
* @param name The service name
|
||||
* @return The services, or NULL
|
||||
*/
|
||||
static Service *GetService(const Anope::string &name);
|
||||
|
||||
/** Get the existing service key names
|
||||
* @return The keys
|
||||
*/
|
||||
static std::vector<Anope::string> GetServiceKeys();
|
||||
|
||||
private:
|
||||
/** Call the module_delete function to safely delete the module
|
||||
* @param m the module to delete
|
||||
@@ -1230,49 +1111,14 @@ class CoreExport ModuleManager
|
||||
|
||||
/** Class used for callbacks within modules
|
||||
*/
|
||||
class CallBack : public Timer
|
||||
class CoreExport CallBack : public Timer
|
||||
{
|
||||
private:
|
||||
Module *m;
|
||||
public:
|
||||
CallBack(Module *mod, long time_from_now, time_t now = Anope::CurTime, bool repeating = false) : Timer(time_from_now, now, repeating), m(mod)
|
||||
{
|
||||
m->CallBacks.push_back(this);
|
||||
}
|
||||
CallBack(Module *mod, long time_from_now, time_t now = Anope::CurTime, bool repeating = false);
|
||||
|
||||
virtual ~CallBack()
|
||||
{
|
||||
std::list<CallBack *>::iterator it = std::find(m->CallBacks.begin(), m->CallBacks.end(), this);
|
||||
if (it != m->CallBacks.end())
|
||||
m->CallBacks.erase(it);
|
||||
}
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
class service_reference : public dynamic_reference<T>
|
||||
{
|
||||
Anope::string name;
|
||||
|
||||
public:
|
||||
service_reference(const Anope::string &n) : dynamic_reference<T>(static_cast<T *>(ModuleManager::GetService(n))), name(n)
|
||||
{
|
||||
}
|
||||
|
||||
operator bool()
|
||||
{
|
||||
if (this->invalid)
|
||||
{
|
||||
this->invalid = false;
|
||||
this->ref = NULL;
|
||||
}
|
||||
if (!this->ref)
|
||||
{
|
||||
this->ref = static_cast<T *>(ModuleManager::GetService(this->name));
|
||||
if (this->ref)
|
||||
this->ref->AddReference(this);
|
||||
}
|
||||
return this->ref;
|
||||
}
|
||||
virtual ~CallBack();
|
||||
};
|
||||
|
||||
class CoreExport Message
|
||||
|
||||
+65
-49
@@ -1,6 +1,6 @@
|
||||
/* OperServ support
|
||||
*
|
||||
* (C) 2008-2011 Anope Team
|
||||
* (C) 2008-2012 Anope Team
|
||||
* Contact us at team@anope.org
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
@@ -9,49 +9,53 @@
|
||||
#ifndef OPER_H
|
||||
#define OPER_H
|
||||
|
||||
class XLineManager;
|
||||
#include "serialize.h"
|
||||
#include "service.h"
|
||||
|
||||
class CoreExport XLine
|
||||
class CoreExport XLine : public Serializable
|
||||
{
|
||||
void InitRegex();
|
||||
public:
|
||||
Anope::string Mask;
|
||||
Regex *regex;
|
||||
Anope::string By;
|
||||
time_t Created;
|
||||
time_t Expires;
|
||||
Anope::string Reason;
|
||||
XLineManager *manager;
|
||||
Anope::string UID;
|
||||
|
||||
XLine(const Anope::string &mask, const Anope::string &reason = "");
|
||||
XLine(const Anope::string &mask, const Anope::string &reason = "", const Anope::string &uid = "");
|
||||
|
||||
XLine(const Anope::string &mask, const Anope::string &by, const time_t expires, const Anope::string &reason);
|
||||
XLine(const Anope::string &mask, const Anope::string &by, const time_t expires, const Anope::string &reason, const Anope::string &uid = "");
|
||||
~XLine();
|
||||
|
||||
Anope::string GetNick() const;
|
||||
Anope::string GetUser() const;
|
||||
Anope::string GetHost() const;
|
||||
Anope::string GetReal() const;
|
||||
|
||||
Anope::string GetReason() const;
|
||||
|
||||
bool HasNickOrReal() const;
|
||||
bool IsRegex() const;
|
||||
|
||||
const Anope::string serialize_name() const anope_override;
|
||||
Serialize::Data serialize() const anope_override;
|
||||
static Serializable* unserialize(Serializable *obj, Serialize::Data &data);
|
||||
};
|
||||
|
||||
class CoreExport XLineManager : public Service
|
||||
{
|
||||
char type;
|
||||
protected:
|
||||
/* List of XLines in this XLineManager */
|
||||
std::vector<XLine *> XLines;
|
||||
serialize_checker<std::vector<XLine *> > XLines;
|
||||
/* Akills can have the same IDs, sometimes */
|
||||
static serialize_checker<std::multimap<Anope::string, XLine *, ci::less> > XLinesByUID;
|
||||
public:
|
||||
/* List of XLine managers we check users against in XLineManager::CheckAll */
|
||||
static std::list<XLineManager *> XLineManagers;
|
||||
|
||||
/** Constructor
|
||||
*/
|
||||
XLineManager(Module *creator, const Anope::string &name, char t);
|
||||
|
||||
/** Destructor
|
||||
*/
|
||||
virtual ~XLineManager();
|
||||
|
||||
/** The type of xline provided by this service
|
||||
* @return The type
|
||||
*/
|
||||
const char &Type();
|
||||
|
||||
/** Register a XLineManager, places it in XLineManagers for use in XLineManager::CheckAll
|
||||
* It is important XLineManagers are registered in the proper order. Eg, if you had one akilling
|
||||
* clients and one handing them free olines, you would want the akilling one first. This way if a client
|
||||
@@ -69,7 +73,25 @@ class CoreExport XLineManager : public Service
|
||||
* Wparam u The user
|
||||
* @return A pair of the XLineManager the user was found in and the XLine they matched, both may be NULL for no match
|
||||
*/
|
||||
static std::pair<XLineManager *, XLine *> CheckAll(User *u);
|
||||
static void CheckAll(User *u);
|
||||
|
||||
/** Generate a unique ID for this XLine
|
||||
* @return A unique ID
|
||||
*/
|
||||
static Anope::string GenerateUID();
|
||||
|
||||
/** Constructor
|
||||
*/
|
||||
XLineManager(Module *creator, const Anope::string &name, char t);
|
||||
|
||||
/** Destructor
|
||||
*/
|
||||
virtual ~XLineManager();
|
||||
|
||||
/** The type of xline provided by this service
|
||||
* @return The type
|
||||
*/
|
||||
const char &Type();
|
||||
|
||||
/** Get the number of XLines in this XLineManager
|
||||
* @return The number of XLines
|
||||
@@ -96,67 +118,61 @@ class CoreExport XLineManager : public Service
|
||||
* @param index The index
|
||||
* @return The XLine, or NULL if the index is out of bounds
|
||||
*/
|
||||
XLine *GetEntry(unsigned index);
|
||||
XLine* GetEntry(unsigned index);
|
||||
|
||||
/** Clear the XLine vector
|
||||
* Note: This does not remove the XLines from the IRCd
|
||||
*/
|
||||
void Clear();
|
||||
|
||||
/** Add an entry to this XLine Manager
|
||||
* @param mask The mask of the XLine
|
||||
* @param creator The creator of the XLine
|
||||
* @param expires When this should expire
|
||||
* @param reaosn The reason
|
||||
* @return A pointer to the XLine
|
||||
*/
|
||||
virtual XLine *Add(const Anope::string &mask, const Anope::string &creator, time_t expires, const Anope::string &reason);
|
||||
|
||||
private:
|
||||
/** Delete an XLine, eg, remove it from the IRCd.
|
||||
* @param x The xline
|
||||
*/
|
||||
virtual void Del(XLine *x);
|
||||
|
||||
public:
|
||||
/** Checks if a mask can/should be added to the XLineManager
|
||||
* @param source The source adding the mask.
|
||||
* @param mask The mask
|
||||
* @param expires When the mask would expire
|
||||
* @return A pair of int and XLine*.
|
||||
* 1 - Mask already exists
|
||||
* 2 - Mask already exists, but the expiry time was changed
|
||||
* 3 - Mask is already covered by another mask
|
||||
* In each case the XLine it matches/is covered by is returned in XLine*
|
||||
* @param reason the reason
|
||||
* @return true if the mask can be added
|
||||
*/
|
||||
std::pair<int, XLine *> CanAdd(const Anope::string &mask, time_t expires);
|
||||
bool CanAdd(CommandSource &source, const Anope::string &mask, time_t expires, const Anope::string &reason);
|
||||
|
||||
/** Checks if this list has an entry
|
||||
* @param mask The mask
|
||||
* @return The XLine the user matches, or NULL
|
||||
*/
|
||||
XLine *HasEntry(const Anope::string &mask);
|
||||
XLine* HasEntry(const Anope::string &mask);
|
||||
|
||||
/** Check a user against all of the xlines in this XLineManager
|
||||
* @param u The user
|
||||
* @return The xline the user marches, if any. Also calls OnMatch()
|
||||
* @return The xline the user marches, if any.
|
||||
*/
|
||||
virtual XLine *Check(User *u);
|
||||
XLine *CheckAllXLines(User *u);
|
||||
|
||||
/** Check a user against an xline
|
||||
* @param u The user
|
||||
* @param x The xline
|
||||
*/
|
||||
virtual bool Check(User *u, const XLine *x) = 0;
|
||||
|
||||
/** Called when a user matches a xline in this XLineManager
|
||||
* @param u The user
|
||||
* @param x The XLine they match
|
||||
*/
|
||||
virtual void OnMatch(User *u, XLine *x);
|
||||
virtual void OnMatch(User *u, XLine *x) = 0;
|
||||
|
||||
/** Called when an XLine expires
|
||||
* @param x The xline
|
||||
*/
|
||||
virtual void OnExpire(XLine *x);
|
||||
virtual void OnExpire(const 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;
|
||||
|
||||
/** Called to remove an XLine from the IRCd
|
||||
* @param x The XLine
|
||||
*/
|
||||
virtual void SendDel(XLine *x) = 0;
|
||||
};
|
||||
|
||||
#endif // OPER_H
|
||||
|
||||
+11
-7
@@ -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-2012 Anope Team <team@anope.org>
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
*/
|
||||
@@ -8,20 +8,24 @@
|
||||
#ifndef OPERTYPE_H
|
||||
#define OPERTYPE_H
|
||||
|
||||
#include "hashcomp.h"
|
||||
|
||||
class OperType;
|
||||
#include "services.h"
|
||||
#include "account.h"
|
||||
|
||||
struct CoreExport Oper
|
||||
{
|
||||
Anope::string name;
|
||||
OperType *ot;
|
||||
bool require_oper;
|
||||
Anope::string password;
|
||||
Anope::string certfp;
|
||||
OperType *ot;
|
||||
bool config;
|
||||
|
||||
Oper(const Anope::string &n, const Anope::string &p, const Anope::string &c, OperType *o) :
|
||||
name(n), password(p), certfp(c), ot(o), config(false) { }
|
||||
std::vector<Anope::string> hosts;
|
||||
Anope::string vhost;
|
||||
|
||||
Oper(const Anope::string &n, OperType *o) : name(n), ot(o) { this->config = false; }
|
||||
|
||||
virtual ~Oper() { }
|
||||
|
||||
/** Find an oper block by name
|
||||
* @param name The name
|
||||
|
||||
@@ -0,0 +1,155 @@
|
||||
/*
|
||||
*
|
||||
* (C) 2003-2012 Anope Team
|
||||
* Contact us at team@anope.org
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
*
|
||||
* Based on the original code of Epona by Lara.
|
||||
* Based on the original code of Services by Andy Church.
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef PROTOCOL_H
|
||||
#define PROTOCOL_H
|
||||
|
||||
#include "services.h"
|
||||
#include "anope.h"
|
||||
|
||||
/* Protocol tweaks */
|
||||
|
||||
struct IRCDVar
|
||||
{
|
||||
const char *name; /* Name of the IRCd command */
|
||||
const char *pseudoclient_mode; /* Mode used by BotServ Bots */
|
||||
int svsnick; /* Supports SVSNICK */
|
||||
int vhost; /* Supports vhost */
|
||||
int snline; /* Supports SNline */
|
||||
int sqline; /* Supports SQline */
|
||||
int szline; /* Supports SZline */
|
||||
int join2msg; /* Join 2 Message */
|
||||
int chansqline; /* Supports Channel Sqlines */
|
||||
int quitonkill; /* IRCD sends QUIT when kill */
|
||||
int vident; /* Supports vidents */
|
||||
int svshold; /* Supports svshold */
|
||||
int tsonmode; /* Timestamp on mode changes */
|
||||
int omode; /* On the fly o:lines */
|
||||
int umode; /* change user modes */
|
||||
int knock_needs_i; /* Check if we needed +i when setting NOKNOCK */
|
||||
int svsmode_ucmode; /* Can remove User Channel Modes with SVSMODE */
|
||||
int sglineenforce;
|
||||
int ts6; /* ircd is TS6 */
|
||||
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 */
|
||||
};
|
||||
|
||||
|
||||
class CoreExport IRCDProto
|
||||
{
|
||||
protected:
|
||||
virtual void SendSVSKillInternal(const BotInfo *, const User *, const Anope::string &);
|
||||
virtual void SendModeInternal(const BotInfo *, const Channel *, const Anope::string &);
|
||||
virtual void SendModeInternal(const BotInfo *, const User *, const Anope::string &) = 0;
|
||||
virtual void SendKickInternal(const BotInfo *, const Channel *, const User *, const Anope::string &);
|
||||
virtual void SendMessageInternal(const BotInfo *bi, const Anope::string &dest, const Anope::string &buf);
|
||||
virtual void SendNoticeInternal(const BotInfo *bi, const Anope::string &dest, const Anope::string &msg);
|
||||
virtual void SendPrivmsgInternal(const BotInfo *bi, const Anope::string &dest, const Anope::string &buf);
|
||||
virtual void SendQuitInternal(const User *u, const Anope::string &buf);
|
||||
virtual void SendPartInternal(const BotInfo *bi, const Channel *chan, const Anope::string &buf);
|
||||
virtual void SendGlobopsInternal(const BotInfo *source, const Anope::string &buf);
|
||||
virtual void SendCTCPInternal(const BotInfo *bi, const Anope::string &dest, const Anope::string &buf);
|
||||
virtual void SendNumericInternal(int numeric, const Anope::string &dest, const Anope::string &buf);
|
||||
public:
|
||||
virtual ~IRCDProto() { }
|
||||
|
||||
virtual void SendSVSNOOP(const Server *, bool) { }
|
||||
virtual void SendTopic(BotInfo *, Channel *);
|
||||
virtual void SendVhostDel(User *) { }
|
||||
virtual void SendAkill(User *, XLine *) = 0;
|
||||
virtual void SendAkillDel(const XLine *) = 0;
|
||||
virtual void SendSVSKill(const BotInfo *source, const User *user, const char *fmt, ...);
|
||||
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) = 0;
|
||||
virtual void SendKick(const BotInfo *bi, const Channel *chan, const User *user, const char *fmt, ...);
|
||||
virtual void SendMessage(const BotInfo *bi, const Anope::string &dest, const char *fmt, ...);
|
||||
virtual void SendNotice(const BotInfo *bi, const Anope::string &dest, const char *fmt, ...);
|
||||
virtual void SendAction(const BotInfo *bi, const Anope::string &dest, const char *fmt, ...);
|
||||
virtual void SendPrivmsg(const BotInfo *bi, const Anope::string &dest, const char *fmt, ...);
|
||||
virtual void SendGlobalNotice(const BotInfo *bi, const Server *dest, const Anope::string &msg);
|
||||
virtual void SendGlobalPrivmsg(const BotInfo *bi, const Server *desc, const Anope::string &msg);
|
||||
|
||||
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(const User *, Channel *, const ChannelStatus *) = 0;
|
||||
virtual void SendSQLineDel(const XLine *x) { }
|
||||
virtual void SendInvite(const BotInfo *bi, const Channel *c, const User *u);
|
||||
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 SendSquit(Server *, const Anope::string &message);
|
||||
virtual void SendSVSO(const BotInfo *, const Anope::string &, const Anope::string &) { }
|
||||
virtual void SendChangeBotNick(const BotInfo *bi, const Anope::string &newnick);
|
||||
virtual void SendForceNickChange(const User *u, const Anope::string &newnick, time_t when);
|
||||
virtual void SendVhost(User *, const Anope::string &, const Anope::string &) { }
|
||||
virtual void SendConnect() = 0;
|
||||
virtual void SendSVSHold(const Anope::string &) { }
|
||||
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 SendCTCP(const BotInfo *bi, const Anope::string &dest, const char *fmt, ...);
|
||||
virtual void SendSVSJoin(const BotInfo *bi, const Anope::string &, const Anope::string &, const Anope::string &) { }
|
||||
virtual void SendSWhois(const BotInfo *bi, const Anope::string &, const Anope::string &) { }
|
||||
virtual void SendBOB() { }
|
||||
virtual void SendEOB() { }
|
||||
virtual void SendServer(const Server *) = 0;
|
||||
virtual bool IsNickValid(const Anope::string &) { return true; }
|
||||
virtual bool IsChannelValid(const Anope::string &);
|
||||
virtual void SendNumeric(int numeric, const Anope::string &dest, const char *fmt, ...);
|
||||
virtual void SendLogin(User *u) = 0;
|
||||
virtual void SendLogout(User *u) = 0;
|
||||
|
||||
/** 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> &);
|
||||
};
|
||||
|
||||
extern CoreExport IRCDVar *ircd;
|
||||
extern CoreExport IRCDProto *ircdproto;
|
||||
extern CoreExport IRCdMessage *ircdmessage;
|
||||
|
||||
extern CoreExport void pmodule_ircd_proto(IRCDProto *);
|
||||
extern CoreExport void pmodule_ircd_var(IRCDVar *ircdvar);
|
||||
extern CoreExport void pmodule_ircd_message(IRCdMessage *message);
|
||||
|
||||
#endif // PROTOCOL_H
|
||||
@@ -0,0 +1,800 @@
|
||||
/* A portable stdint.h
|
||||
****************************************************************************
|
||||
* BSD License:
|
||||
****************************************************************************
|
||||
*
|
||||
* Copyright (c) 2005-2011 Paul Hsieh
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
****************************************************************************
|
||||
*
|
||||
* Version 0.1.12
|
||||
*
|
||||
* The ANSI C standard committee, for the C99 standard, specified the
|
||||
* inclusion of a new standard include file called stdint.h. This is
|
||||
* a very useful and long desired include file which contains several
|
||||
* very precise definitions for integer scalar types that is
|
||||
* critically important for making portable several classes of
|
||||
* applications including cryptography, hashing, variable length
|
||||
* integer libraries and so on. But for most developers its likely
|
||||
* useful just for programming sanity.
|
||||
*
|
||||
* The problem is that most compiler vendors have decided not to
|
||||
* implement the C99 standard, and the next C++ language standard
|
||||
* (which has a lot more mindshare these days) will be a long time in
|
||||
* coming and its unknown whether or not it will include stdint.h or
|
||||
* how much adoption it will have. Either way, it will be a long time
|
||||
* before all compilers come with a stdint.h and it also does nothing
|
||||
* for the extremely large number of compilers available today which
|
||||
* do not include this file, or anything comparable to it.
|
||||
*
|
||||
* So that's what this file is all about. Its an attempt to build a
|
||||
* single universal include file that works on as many platforms as
|
||||
* possible to deliver what stdint.h is supposed to. A few things
|
||||
* that should be noted about this file:
|
||||
*
|
||||
* 1) It is not guaranteed to be portable and/or present an identical
|
||||
* interface on all platforms. The extreme variability of the
|
||||
* ANSI C standard makes this an impossibility right from the
|
||||
* very get go. Its really only meant to be useful for the vast
|
||||
* majority of platforms that possess the capability of
|
||||
* implementing usefully and precisely defined, standard sized
|
||||
* integer scalars. Systems which are not intrinsically 2s
|
||||
* complement may produce invalid constants.
|
||||
*
|
||||
* 2) There is an unavoidable use of non-reserved symbols.
|
||||
*
|
||||
* 3) Other standard include files are invoked.
|
||||
*
|
||||
* 4) This file may come in conflict with future platforms that do
|
||||
* include stdint.h. The hope is that one or the other can be
|
||||
* used with no real difference.
|
||||
*
|
||||
* 5) In the current verison, if your platform can't represent
|
||||
* int32_t, int16_t and int8_t, it just dumps out with a compiler
|
||||
* error.
|
||||
*
|
||||
* 6) 64 bit integers may or may not be defined. Test for their
|
||||
* presence with the test: #ifdef INT64_MAX or #ifdef UINT64_MAX.
|
||||
* Note that this is different from the C99 specification which
|
||||
* requires the existence of 64 bit support in the compiler. If
|
||||
* this is not defined for your platform, yet it is capable of
|
||||
* dealing with 64 bits then it is because this file has not yet
|
||||
* been extended to cover all of your system's capabilities.
|
||||
*
|
||||
* 7) (u)intptr_t may or may not be defined. Test for its presence
|
||||
* with the test: #ifdef PTRDIFF_MAX. If this is not defined
|
||||
* for your platform, then it is because this file has not yet
|
||||
* been extended to cover all of your system's capabilities, not
|
||||
* because its optional.
|
||||
*
|
||||
* 8) The following might not been defined even if your platform is
|
||||
* capable of defining it:
|
||||
*
|
||||
* WCHAR_MIN
|
||||
* WCHAR_MAX
|
||||
* (u)int64_t
|
||||
* PTRDIFF_MIN
|
||||
* PTRDIFF_MAX
|
||||
* (u)intptr_t
|
||||
*
|
||||
* 9) The following have not been defined:
|
||||
*
|
||||
* WINT_MIN
|
||||
* WINT_MAX
|
||||
*
|
||||
* 10) The criteria for defining (u)int_least(*)_t isn't clear,
|
||||
* except for systems which don't have a type that precisely
|
||||
* defined 8, 16, or 32 bit types (which this include file does
|
||||
* not support anyways). Default definitions have been given.
|
||||
*
|
||||
* 11) The criteria for defining (u)int_fast(*)_t isn't something I
|
||||
* would trust to any particular compiler vendor or the ANSI C
|
||||
* committee. It is well known that "compatible systems" are
|
||||
* commonly created that have very different performance
|
||||
* characteristics from the systems they are compatible with,
|
||||
* especially those whose vendors make both the compiler and the
|
||||
* system. Default definitions have been given, but its strongly
|
||||
* recommended that users never use these definitions for any
|
||||
* reason (they do *NOT* deliver any serious guarantee of
|
||||
* improved performance -- not in this file, nor any vendor's
|
||||
* stdint.h).
|
||||
*
|
||||
* 12) The following macros:
|
||||
*
|
||||
* PRINTF_INTMAX_MODIFIER
|
||||
* PRINTF_INT64_MODIFIER
|
||||
* PRINTF_INT32_MODIFIER
|
||||
* PRINTF_INT16_MODIFIER
|
||||
* PRINTF_LEAST64_MODIFIER
|
||||
* PRINTF_LEAST32_MODIFIER
|
||||
* PRINTF_LEAST16_MODIFIER
|
||||
* PRINTF_INTPTR_MODIFIER
|
||||
*
|
||||
* are strings which have been defined as the modifiers required
|
||||
* for the "d", "u" and "x" printf formats to correctly output
|
||||
* (u)intmax_t, (u)int64_t, (u)int32_t, (u)int16_t, (u)least64_t,
|
||||
* (u)least32_t, (u)least16_t and (u)intptr_t types respectively.
|
||||
* PRINTF_INTPTR_MODIFIER is not defined for some systems which
|
||||
* provide their own stdint.h. PRINTF_INT64_MODIFIER is not
|
||||
* defined if INT64_MAX is not defined. These are an extension
|
||||
* beyond what C99 specifies must be in stdint.h.
|
||||
*
|
||||
* In addition, the following macros are defined:
|
||||
*
|
||||
* PRINTF_INTMAX_HEX_WIDTH
|
||||
* PRINTF_INT64_HEX_WIDTH
|
||||
* PRINTF_INT32_HEX_WIDTH
|
||||
* PRINTF_INT16_HEX_WIDTH
|
||||
* PRINTF_INT8_HEX_WIDTH
|
||||
* PRINTF_INTMAX_DEC_WIDTH
|
||||
* PRINTF_INT64_DEC_WIDTH
|
||||
* PRINTF_INT32_DEC_WIDTH
|
||||
* PRINTF_INT16_DEC_WIDTH
|
||||
* PRINTF_INT8_DEC_WIDTH
|
||||
*
|
||||
* Which specifies the maximum number of characters required to
|
||||
* print the number of that type in either hexadecimal or decimal.
|
||||
* These are an extension beyond what C99 specifies must be in
|
||||
* stdint.h.
|
||||
*
|
||||
* Compilers tested (all with 0 warnings at their highest respective
|
||||
* settings): Borland Turbo C 2.0, WATCOM C/C++ 11.0 (16 bits and 32
|
||||
* bits), Microsoft Visual C++ 6.0 (32 bit), Microsoft Visual Studio
|
||||
* .net (VC7), Intel C++ 4.0, GNU gcc v3.3.3
|
||||
*
|
||||
* This file should be considered a work in progress. Suggestions for
|
||||
* improvements, especially those which increase coverage are strongly
|
||||
* encouraged.
|
||||
*
|
||||
* Acknowledgements
|
||||
*
|
||||
* The following people have made significant contributions to the
|
||||
* development and testing of this file:
|
||||
*
|
||||
* Chris Howie
|
||||
* John Steele Scott
|
||||
* Dave Thorup
|
||||
* John Dill
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stddef.h>
|
||||
#include <limits.h>
|
||||
#include <signal.h>
|
||||
|
||||
/*
|
||||
* For gcc with _STDINT_H, fill in the PRINTF_INT*_MODIFIER macros, and
|
||||
* do nothing else. On the Mac OS X version of gcc this is _STDINT_H_.
|
||||
*/
|
||||
|
||||
#if ((defined(__STDC__) && __STDC__ && __STDC_VERSION__ >= 199901L) || (defined (__WATCOMC__) && (defined (_STDINT_H_INCLUDED) || __WATCOMC__ >= 1250)) || (defined(__GNUC__) && (defined(_STDINT_H) || defined(_STDINT_H_) || defined (__UINT_FAST64_TYPE__)) )) && !defined (_PSTDINT_H_INCLUDED)
|
||||
#include <stdint.h>
|
||||
#define _PSTDINT_H_INCLUDED
|
||||
# ifndef PRINTF_INT64_MODIFIER
|
||||
# define PRINTF_INT64_MODIFIER "ll"
|
||||
# endif
|
||||
# ifndef PRINTF_INT32_MODIFIER
|
||||
# define PRINTF_INT32_MODIFIER "l"
|
||||
# endif
|
||||
# ifndef PRINTF_INT16_MODIFIER
|
||||
# define PRINTF_INT16_MODIFIER "h"
|
||||
# endif
|
||||
# ifndef PRINTF_INTMAX_MODIFIER
|
||||
# define PRINTF_INTMAX_MODIFIER PRINTF_INT64_MODIFIER
|
||||
# endif
|
||||
# ifndef PRINTF_INT64_HEX_WIDTH
|
||||
# define PRINTF_INT64_HEX_WIDTH "16"
|
||||
# endif
|
||||
# ifndef PRINTF_INT32_HEX_WIDTH
|
||||
# define PRINTF_INT32_HEX_WIDTH "8"
|
||||
# endif
|
||||
# ifndef PRINTF_INT16_HEX_WIDTH
|
||||
# define PRINTF_INT16_HEX_WIDTH "4"
|
||||
# endif
|
||||
# ifndef PRINTF_INT8_HEX_WIDTH
|
||||
# define PRINTF_INT8_HEX_WIDTH "2"
|
||||
# endif
|
||||
# ifndef PRINTF_INT64_DEC_WIDTH
|
||||
# define PRINTF_INT64_DEC_WIDTH "20"
|
||||
# endif
|
||||
# ifndef PRINTF_INT32_DEC_WIDTH
|
||||
# define PRINTF_INT32_DEC_WIDTH "10"
|
||||
# endif
|
||||
# ifndef PRINTF_INT16_DEC_WIDTH
|
||||
# define PRINTF_INT16_DEC_WIDTH "5"
|
||||
# endif
|
||||
# ifndef PRINTF_INT8_DEC_WIDTH
|
||||
# define PRINTF_INT8_DEC_WIDTH "3"
|
||||
# endif
|
||||
# ifndef PRINTF_INTMAX_HEX_WIDTH
|
||||
# define PRINTF_INTMAX_HEX_WIDTH PRINTF_INT64_HEX_WIDTH
|
||||
# endif
|
||||
# ifndef PRINTF_INTMAX_DEC_WIDTH
|
||||
# define PRINTF_INTMAX_DEC_WIDTH PRINTF_INT64_DEC_WIDTH
|
||||
# endif
|
||||
|
||||
/*
|
||||
* Something really weird is going on with Open Watcom. Just pull some of
|
||||
* these duplicated definitions from Open Watcom's stdint.h file for now.
|
||||
*/
|
||||
|
||||
# if defined (__WATCOMC__) && __WATCOMC__ >= 1250
|
||||
# if !defined (INT64_C)
|
||||
# define INT64_C(x) (x + (INT64_MAX - INT64_MAX))
|
||||
# endif
|
||||
# if !defined (UINT64_C)
|
||||
# define UINT64_C(x) (x + (UINT64_MAX - UINT64_MAX))
|
||||
# endif
|
||||
# if !defined (INT32_C)
|
||||
# define INT32_C(x) (x + (INT32_MAX - INT32_MAX))
|
||||
# endif
|
||||
# if !defined (UINT32_C)
|
||||
# define UINT32_C(x) (x + (UINT32_MAX - UINT32_MAX))
|
||||
# endif
|
||||
# if !defined (INT16_C)
|
||||
# define INT16_C(x) (x)
|
||||
# endif
|
||||
# if !defined (UINT16_C)
|
||||
# define UINT16_C(x) (x)
|
||||
# endif
|
||||
# if !defined (INT8_C)
|
||||
# define INT8_C(x) (x)
|
||||
# endif
|
||||
# if !defined (UINT8_C)
|
||||
# define UINT8_C(x) (x)
|
||||
# endif
|
||||
# if !defined (UINT64_MAX)
|
||||
# define UINT64_MAX 18446744073709551615ULL
|
||||
# endif
|
||||
# if !defined (INT64_MAX)
|
||||
# define INT64_MAX 9223372036854775807LL
|
||||
# endif
|
||||
# if !defined (UINT32_MAX)
|
||||
# define UINT32_MAX 4294967295UL
|
||||
# endif
|
||||
# if !defined (INT32_MAX)
|
||||
# define INT32_MAX 2147483647L
|
||||
# endif
|
||||
# if !defined (INTMAX_MAX)
|
||||
# define INTMAX_MAX INT64_MAX
|
||||
# endif
|
||||
# if !defined (INTMAX_MIN)
|
||||
# define INTMAX_MIN INT64_MIN
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef _PSTDINT_H_INCLUDED
|
||||
#define _PSTDINT_H_INCLUDED
|
||||
|
||||
#ifndef SIZE_MAX
|
||||
# define SIZE_MAX (~(size_t)0)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Deduce the type assignments from limits.h under the assumption that
|
||||
* integer sizes in bits are powers of 2, and follow the ANSI
|
||||
* definitions.
|
||||
*/
|
||||
|
||||
#ifndef UINT8_MAX
|
||||
# define UINT8_MAX 0xff
|
||||
#endif
|
||||
#ifndef uint8_t
|
||||
# if (UCHAR_MAX == UINT8_MAX) || defined (S_SPLINT_S)
|
||||
typedef unsigned char uint8_t;
|
||||
# define UINT8_C(v) ((uint8_t) v)
|
||||
# else
|
||||
# error "Platform not supported"
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef INT8_MAX
|
||||
# define INT8_MAX 0x7f
|
||||
#endif
|
||||
#ifndef INT8_MIN
|
||||
# define INT8_MIN INT8_C(0x80)
|
||||
#endif
|
||||
#ifndef int8_t
|
||||
# if (SCHAR_MAX == INT8_MAX) || defined (S_SPLINT_S)
|
||||
typedef signed char int8_t;
|
||||
# define INT8_C(v) ((int8_t) v)
|
||||
# else
|
||||
# error "Platform not supported"
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef UINT16_MAX
|
||||
# define UINT16_MAX 0xffff
|
||||
#endif
|
||||
#ifndef uint16_t
|
||||
#if (UINT_MAX == UINT16_MAX) || defined (S_SPLINT_S)
|
||||
typedef unsigned int uint16_t;
|
||||
# ifndef PRINTF_INT16_MODIFIER
|
||||
# define PRINTF_INT16_MODIFIER ""
|
||||
# endif
|
||||
# define UINT16_C(v) ((uint16_t) (v))
|
||||
#elif (USHRT_MAX == UINT16_MAX)
|
||||
typedef unsigned short uint16_t;
|
||||
# define UINT16_C(v) ((uint16_t) (v))
|
||||
# ifndef PRINTF_INT16_MODIFIER
|
||||
# define PRINTF_INT16_MODIFIER "h"
|
||||
# endif
|
||||
#else
|
||||
#error "Platform not supported"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef INT16_MAX
|
||||
# define INT16_MAX 0x7fff
|
||||
#endif
|
||||
#ifndef INT16_MIN
|
||||
# define INT16_MIN INT16_C(0x8000)
|
||||
#endif
|
||||
#ifndef int16_t
|
||||
#if (INT_MAX == INT16_MAX) || defined (S_SPLINT_S)
|
||||
typedef signed int int16_t;
|
||||
# define INT16_C(v) ((int16_t) (v))
|
||||
# ifndef PRINTF_INT16_MODIFIER
|
||||
# define PRINTF_INT16_MODIFIER ""
|
||||
# endif
|
||||
#elif (SHRT_MAX == INT16_MAX)
|
||||
typedef signed short int16_t;
|
||||
# define INT16_C(v) ((int16_t) (v))
|
||||
# ifndef PRINTF_INT16_MODIFIER
|
||||
# define PRINTF_INT16_MODIFIER "h"
|
||||
# endif
|
||||
#else
|
||||
#error "Platform not supported"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef UINT32_MAX
|
||||
# define UINT32_MAX (0xffffffffUL)
|
||||
#endif
|
||||
#ifndef uint32_t
|
||||
#if (ULONG_MAX == UINT32_MAX) || defined (S_SPLINT_S)
|
||||
typedef unsigned long uint32_t;
|
||||
# define UINT32_C(v) v ## UL
|
||||
# ifndef PRINTF_INT32_MODIFIER
|
||||
# define PRINTF_INT32_MODIFIER "l"
|
||||
# endif
|
||||
#elif (UINT_MAX == UINT32_MAX)
|
||||
typedef unsigned int uint32_t;
|
||||
# ifndef PRINTF_INT32_MODIFIER
|
||||
# define PRINTF_INT32_MODIFIER ""
|
||||
# endif
|
||||
# define UINT32_C(v) v ## U
|
||||
#elif (USHRT_MAX == UINT32_MAX)
|
||||
typedef unsigned short uint32_t;
|
||||
# define UINT32_C(v) ((unsigned short) (v))
|
||||
# ifndef PRINTF_INT32_MODIFIER
|
||||
# define PRINTF_INT32_MODIFIER ""
|
||||
# endif
|
||||
#else
|
||||
#error "Platform not supported"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef INT32_MAX
|
||||
# define INT32_MAX (0x7fffffffL)
|
||||
#endif
|
||||
#ifndef INT32_MIN
|
||||
# define INT32_MIN INT32_C(0x80000000)
|
||||
#endif
|
||||
#ifndef int32_t
|
||||
#if (LONG_MAX == INT32_MAX) || defined (S_SPLINT_S)
|
||||
typedef signed long int32_t;
|
||||
# define INT32_C(v) v ## L
|
||||
# ifndef PRINTF_INT32_MODIFIER
|
||||
# define PRINTF_INT32_MODIFIER "l"
|
||||
# endif
|
||||
#elif (INT_MAX == INT32_MAX)
|
||||
typedef signed int int32_t;
|
||||
# define INT32_C(v) v
|
||||
# ifndef PRINTF_INT32_MODIFIER
|
||||
# define PRINTF_INT32_MODIFIER ""
|
||||
# endif
|
||||
#elif (SHRT_MAX == INT32_MAX)
|
||||
typedef signed short int32_t;
|
||||
# define INT32_C(v) ((short) (v))
|
||||
# ifndef PRINTF_INT32_MODIFIER
|
||||
# define PRINTF_INT32_MODIFIER ""
|
||||
# endif
|
||||
#else
|
||||
#error "Platform not supported"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
* The macro stdint_int64_defined is temporarily used to record
|
||||
* whether or not 64 integer support is available. It must be
|
||||
* defined for any 64 integer extensions for new platforms that are
|
||||
* added.
|
||||
*/
|
||||
|
||||
#undef stdint_int64_defined
|
||||
#if (defined(__STDC__) && defined(__STDC_VERSION__)) || defined (S_SPLINT_S)
|
||||
# if (__STDC__ && __STDC_VERSION__ >= 199901L) || defined (S_SPLINT_S)
|
||||
# define stdint_int64_defined
|
||||
typedef long long int64_t;
|
||||
typedef unsigned long long uint64_t;
|
||||
# define UINT64_C(v) v ## ULL
|
||||
# define INT64_C(v) v ## LL
|
||||
# ifndef PRINTF_INT64_MODIFIER
|
||||
# define PRINTF_INT64_MODIFIER "ll"
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if !defined (stdint_int64_defined)
|
||||
# if defined(__GNUC__)
|
||||
# define stdint_int64_defined
|
||||
__extension__ typedef long long int64_t;
|
||||
__extension__ typedef unsigned long long uint64_t;
|
||||
# define UINT64_C(v) v ## ULL
|
||||
# define INT64_C(v) v ## LL
|
||||
# ifndef PRINTF_INT64_MODIFIER
|
||||
# define PRINTF_INT64_MODIFIER "ll"
|
||||
# endif
|
||||
# elif defined(__MWERKS__) || defined (__SUNPRO_C) || defined (__SUNPRO_CC) || defined (__APPLE_CC__) || defined (_LONG_LONG) || defined (_CRAYC) || defined (S_SPLINT_S)
|
||||
# define stdint_int64_defined
|
||||
typedef long long int64_t;
|
||||
typedef unsigned long long uint64_t;
|
||||
# define UINT64_C(v) v ## ULL
|
||||
# define INT64_C(v) v ## LL
|
||||
# ifndef PRINTF_INT64_MODIFIER
|
||||
# define PRINTF_INT64_MODIFIER "ll"
|
||||
# endif
|
||||
# elif (defined(__WATCOMC__) && defined(__WATCOM_INT64__)) || (defined(_MSC_VER) && _INTEGRAL_MAX_BITS >= 64) || (defined (__BORLANDC__) && __BORLANDC__ > 0x460) || defined (__alpha) || defined (__DECC)
|
||||
# define stdint_int64_defined
|
||||
typedef __int64 int64_t;
|
||||
typedef unsigned __int64 uint64_t;
|
||||
# define UINT64_C(v) v ## UI64
|
||||
# define INT64_C(v) v ## I64
|
||||
# ifndef PRINTF_INT64_MODIFIER
|
||||
# define PRINTF_INT64_MODIFIER "I64"
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if !defined (LONG_LONG_MAX) && defined (INT64_C)
|
||||
# define LONG_LONG_MAX INT64_C (9223372036854775807)
|
||||
#endif
|
||||
#ifndef ULONG_LONG_MAX
|
||||
# define ULONG_LONG_MAX UINT64_C (18446744073709551615)
|
||||
#endif
|
||||
|
||||
#if !defined (INT64_MAX) && defined (INT64_C)
|
||||
# define INT64_MAX INT64_C (9223372036854775807)
|
||||
#endif
|
||||
#if !defined (INT64_MIN) && defined (INT64_C)
|
||||
# define INT64_MIN INT64_C (-9223372036854775808)
|
||||
#endif
|
||||
#if !defined (UINT64_MAX) && defined (INT64_C)
|
||||
# define UINT64_MAX UINT64_C (18446744073709551615)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Width of hexadecimal for number field.
|
||||
*/
|
||||
|
||||
#ifndef PRINTF_INT64_HEX_WIDTH
|
||||
# define PRINTF_INT64_HEX_WIDTH "16"
|
||||
#endif
|
||||
#ifndef PRINTF_INT32_HEX_WIDTH
|
||||
# define PRINTF_INT32_HEX_WIDTH "8"
|
||||
#endif
|
||||
#ifndef PRINTF_INT16_HEX_WIDTH
|
||||
# define PRINTF_INT16_HEX_WIDTH "4"
|
||||
#endif
|
||||
#ifndef PRINTF_INT8_HEX_WIDTH
|
||||
# define PRINTF_INT8_HEX_WIDTH "2"
|
||||
#endif
|
||||
|
||||
#ifndef PRINTF_INT64_DEC_WIDTH
|
||||
# define PRINTF_INT64_DEC_WIDTH "20"
|
||||
#endif
|
||||
#ifndef PRINTF_INT32_DEC_WIDTH
|
||||
# define PRINTF_INT32_DEC_WIDTH "10"
|
||||
#endif
|
||||
#ifndef PRINTF_INT16_DEC_WIDTH
|
||||
# define PRINTF_INT16_DEC_WIDTH "5"
|
||||
#endif
|
||||
#ifndef PRINTF_INT8_DEC_WIDTH
|
||||
# define PRINTF_INT8_DEC_WIDTH "3"
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Ok, lets not worry about 128 bit integers for now. Moore's law says
|
||||
* we don't need to worry about that until about 2040 at which point
|
||||
* we'll have bigger things to worry about.
|
||||
*/
|
||||
|
||||
#ifdef stdint_int64_defined
|
||||
typedef int64_t intmax_t;
|
||||
typedef uint64_t uintmax_t;
|
||||
# define INTMAX_MAX INT64_MAX
|
||||
# define INTMAX_MIN INT64_MIN
|
||||
# define UINTMAX_MAX UINT64_MAX
|
||||
# define UINTMAX_C(v) UINT64_C(v)
|
||||
# define INTMAX_C(v) INT64_C(v)
|
||||
# ifndef PRINTF_INTMAX_MODIFIER
|
||||
# define PRINTF_INTMAX_MODIFIER PRINTF_INT64_MODIFIER
|
||||
# endif
|
||||
# ifndef PRINTF_INTMAX_HEX_WIDTH
|
||||
# define PRINTF_INTMAX_HEX_WIDTH PRINTF_INT64_HEX_WIDTH
|
||||
# endif
|
||||
# ifndef PRINTF_INTMAX_DEC_WIDTH
|
||||
# define PRINTF_INTMAX_DEC_WIDTH PRINTF_INT64_DEC_WIDTH
|
||||
# endif
|
||||
#else
|
||||
typedef int32_t intmax_t;
|
||||
typedef uint32_t uintmax_t;
|
||||
# define INTMAX_MAX INT32_MAX
|
||||
# define UINTMAX_MAX UINT32_MAX
|
||||
# define UINTMAX_C(v) UINT32_C(v)
|
||||
# define INTMAX_C(v) INT32_C(v)
|
||||
# ifndef PRINTF_INTMAX_MODIFIER
|
||||
# define PRINTF_INTMAX_MODIFIER PRINTF_INT32_MODIFIER
|
||||
# endif
|
||||
# ifndef PRINTF_INTMAX_HEX_WIDTH
|
||||
# define PRINTF_INTMAX_HEX_WIDTH PRINTF_INT32_HEX_WIDTH
|
||||
# endif
|
||||
# ifndef PRINTF_INTMAX_DEC_WIDTH
|
||||
# define PRINTF_INTMAX_DEC_WIDTH PRINTF_INT32_DEC_WIDTH
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Because this file currently only supports platforms which have
|
||||
* precise powers of 2 as bit sizes for the default integers, the
|
||||
* least definitions are all trivial. Its possible that a future
|
||||
* version of this file could have different definitions.
|
||||
*/
|
||||
|
||||
#ifndef stdint_least_defined
|
||||
typedef int8_t int_least8_t;
|
||||
typedef uint8_t uint_least8_t;
|
||||
typedef int16_t int_least16_t;
|
||||
typedef uint16_t uint_least16_t;
|
||||
typedef int32_t int_least32_t;
|
||||
typedef uint32_t uint_least32_t;
|
||||
# define PRINTF_LEAST32_MODIFIER PRINTF_INT32_MODIFIER
|
||||
# define PRINTF_LEAST16_MODIFIER PRINTF_INT16_MODIFIER
|
||||
# define UINT_LEAST8_MAX UINT8_MAX
|
||||
# define INT_LEAST8_MAX INT8_MAX
|
||||
# define UINT_LEAST16_MAX UINT16_MAX
|
||||
# define INT_LEAST16_MAX INT16_MAX
|
||||
# define UINT_LEAST32_MAX UINT32_MAX
|
||||
# define INT_LEAST32_MAX INT32_MAX
|
||||
# define INT_LEAST8_MIN INT8_MIN
|
||||
# define INT_LEAST16_MIN INT16_MIN
|
||||
# define INT_LEAST32_MIN INT32_MIN
|
||||
# ifdef stdint_int64_defined
|
||||
typedef int64_t int_least64_t;
|
||||
typedef uint64_t uint_least64_t;
|
||||
# define PRINTF_LEAST64_MODIFIER PRINTF_INT64_MODIFIER
|
||||
# define UINT_LEAST64_MAX UINT64_MAX
|
||||
# define INT_LEAST64_MAX INT64_MAX
|
||||
# define INT_LEAST64_MIN INT64_MIN
|
||||
# endif
|
||||
#endif
|
||||
#undef stdint_least_defined
|
||||
|
||||
/*
|
||||
* The ANSI C committee pretending to know or specify anything about
|
||||
* performance is the epitome of misguided arrogance. The mandate of
|
||||
* this file is to *ONLY* ever support that absolute minimum
|
||||
* definition of the fast integer types, for compatibility purposes.
|
||||
* No extensions, and no attempt to suggest what may or may not be a
|
||||
* faster integer type will ever be made in this file. Developers are
|
||||
* warned to stay away from these types when using this or any other
|
||||
* stdint.h.
|
||||
*/
|
||||
|
||||
typedef int_least8_t int_fast8_t;
|
||||
typedef uint_least8_t uint_fast8_t;
|
||||
typedef int_least16_t int_fast16_t;
|
||||
typedef uint_least16_t uint_fast16_t;
|
||||
typedef int_least32_t int_fast32_t;
|
||||
typedef uint_least32_t uint_fast32_t;
|
||||
#define UINT_FAST8_MAX UINT_LEAST8_MAX
|
||||
#define INT_FAST8_MAX INT_LEAST8_MAX
|
||||
#define UINT_FAST16_MAX UINT_LEAST16_MAX
|
||||
#define INT_FAST16_MAX INT_LEAST16_MAX
|
||||
#define UINT_FAST32_MAX UINT_LEAST32_MAX
|
||||
#define INT_FAST32_MAX INT_LEAST32_MAX
|
||||
#define INT_FAST8_MIN INT_LEAST8_MIN
|
||||
#define INT_FAST16_MIN INT_LEAST16_MIN
|
||||
#define INT_FAST32_MIN INT_LEAST32_MIN
|
||||
#ifdef stdint_int64_defined
|
||||
typedef int_least64_t int_fast64_t;
|
||||
typedef uint_least64_t uint_fast64_t;
|
||||
# define UINT_FAST64_MAX UINT_LEAST64_MAX
|
||||
# define INT_FAST64_MAX INT_LEAST64_MAX
|
||||
# define INT_FAST64_MIN INT_LEAST64_MIN
|
||||
#endif
|
||||
|
||||
#undef stdint_int64_defined
|
||||
|
||||
/*
|
||||
* Whatever piecemeal, per compiler thing we can do about the wchar_t
|
||||
* type limits.
|
||||
*/
|
||||
|
||||
#if defined(__WATCOMC__) || defined(_MSC_VER) || defined (__GNUC__)
|
||||
# include <wchar.h>
|
||||
# ifndef WCHAR_MIN
|
||||
# define WCHAR_MIN 0
|
||||
# endif
|
||||
# ifndef WCHAR_MAX
|
||||
# define WCHAR_MAX ((wchar_t)-1)
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Whatever piecemeal, per compiler/platform thing we can do about the
|
||||
* (u)intptr_t types and limits.
|
||||
*/
|
||||
|
||||
#if defined (_MSC_VER) && defined (_UINTPTR_T_DEFINED)
|
||||
# define STDINT_H_UINTPTR_T_DEFINED
|
||||
#endif
|
||||
|
||||
#ifndef STDINT_H_UINTPTR_T_DEFINED
|
||||
# if defined (__alpha__) || defined (__ia64__) || defined (__x86_64__) || defined (_WIN64)
|
||||
# define stdint_intptr_bits 64
|
||||
# elif defined (__WATCOMC__) || defined (__TURBOC__)
|
||||
# if defined(__TINY__) || defined(__SMALL__) || defined(__MEDIUM__)
|
||||
# define stdint_intptr_bits 16
|
||||
# else
|
||||
# define stdint_intptr_bits 32
|
||||
# endif
|
||||
# elif defined (__i386__) || defined (_WIN32) || defined (WIN32)
|
||||
# define stdint_intptr_bits 32
|
||||
# elif defined (__INTEL_COMPILER)
|
||||
/* TODO -- what did Intel do about x86-64? */
|
||||
# endif
|
||||
|
||||
# ifdef stdint_intptr_bits
|
||||
# define stdint_intptr_glue3_i(a,b,c) a##b##c
|
||||
# define stdint_intptr_glue3(a,b,c) stdint_intptr_glue3_i(a,b,c)
|
||||
# ifndef PRINTF_INTPTR_MODIFIER
|
||||
# define PRINTF_INTPTR_MODIFIER stdint_intptr_glue3(PRINTF_INT,stdint_intptr_bits,_MODIFIER)
|
||||
# endif
|
||||
# ifndef PTRDIFF_MAX
|
||||
# define PTRDIFF_MAX stdint_intptr_glue3(INT,stdint_intptr_bits,_MAX)
|
||||
# endif
|
||||
# ifndef PTRDIFF_MIN
|
||||
# define PTRDIFF_MIN stdint_intptr_glue3(INT,stdint_intptr_bits,_MIN)
|
||||
# endif
|
||||
# ifndef UINTPTR_MAX
|
||||
# define UINTPTR_MAX stdint_intptr_glue3(UINT,stdint_intptr_bits,_MAX)
|
||||
# endif
|
||||
# ifndef INTPTR_MAX
|
||||
# define INTPTR_MAX stdint_intptr_glue3(INT,stdint_intptr_bits,_MAX)
|
||||
# endif
|
||||
# ifndef INTPTR_MIN
|
||||
# define INTPTR_MIN stdint_intptr_glue3(INT,stdint_intptr_bits,_MIN)
|
||||
# endif
|
||||
# ifndef INTPTR_C
|
||||
# define INTPTR_C(x) stdint_intptr_glue3(INT,stdint_intptr_bits,_C)(x)
|
||||
# endif
|
||||
# ifndef UINTPTR_C
|
||||
# define UINTPTR_C(x) stdint_intptr_glue3(UINT,stdint_intptr_bits,_C)(x)
|
||||
# endif
|
||||
typedef stdint_intptr_glue3(uint,stdint_intptr_bits,_t) uintptr_t;
|
||||
typedef stdint_intptr_glue3( int,stdint_intptr_bits,_t) intptr_t;
|
||||
# else
|
||||
/* TODO -- This following is likely wrong for some platforms, and does
|
||||
nothing for the definition of uintptr_t. */
|
||||
typedef ptrdiff_t intptr_t;
|
||||
# endif
|
||||
# define STDINT_H_UINTPTR_T_DEFINED
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Assumes sig_atomic_t is signed and we have a 2s complement machine.
|
||||
*/
|
||||
|
||||
#ifndef SIG_ATOMIC_MAX
|
||||
# define SIG_ATOMIC_MAX ((((sig_atomic_t) 1) << (sizeof (sig_atomic_t)*CHAR_BIT-1)) - 1)
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#if defined (__TEST_PSTDINT_FOR_CORRECTNESS)
|
||||
|
||||
/*
|
||||
* Please compile with the maximum warning settings to make sure macros are not
|
||||
* defined more than once.
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#define glue3_aux(x,y,z) x ## y ## z
|
||||
#define glue3(x,y,z) glue3_aux(x,y,z)
|
||||
|
||||
#define DECLU(bits) glue3(uint,bits,_t) glue3(u,bits,=) glue3(UINT,bits,_C) (0);
|
||||
#define DECLI(bits) glue3(int,bits,_t) glue3(i,bits,=) glue3(INT,bits,_C) (0);
|
||||
|
||||
#define DECL(us,bits) glue3(DECL,us,) (bits)
|
||||
|
||||
#define TESTUMAX(bits) glue3(u,bits,=) glue3(~,u,bits); if (glue3(UINT,bits,_MAX) glue3(!=,u,bits)) printf ("Something wrong with UINT%d_MAX\n", bits)
|
||||
|
||||
int main () {
|
||||
DECL(I,8)
|
||||
DECL(U,8)
|
||||
DECL(I,16)
|
||||
DECL(U,16)
|
||||
DECL(I,32)
|
||||
DECL(U,32)
|
||||
#ifdef INT64_MAX
|
||||
DECL(I,64)
|
||||
DECL(U,64)
|
||||
#endif
|
||||
intmax_t imax = INTMAX_C(0);
|
||||
uintmax_t umax = UINTMAX_C(0);
|
||||
char str0[256], str1[256];
|
||||
|
||||
sprintf (str0, "%d %x\n", 0, ~0);
|
||||
|
||||
sprintf (str1, "%d %x\n", i8, ~0);
|
||||
if (0 != strcmp (str0, str1)) printf ("Something wrong with i8 : %s\n", str1);
|
||||
sprintf (str1, "%u %x\n", u8, ~0);
|
||||
if (0 != strcmp (str0, str1)) printf ("Something wrong with u8 : %s\n", str1);
|
||||
sprintf (str1, "%d %x\n", i16, ~0);
|
||||
if (0 != strcmp (str0, str1)) printf ("Something wrong with i16 : %s\n", str1);
|
||||
sprintf (str1, "%u %x\n", u16, ~0);
|
||||
if (0 != strcmp (str0, str1)) printf ("Something wrong with u16 : %s\n", str1);
|
||||
sprintf (str1, "%" PRINTF_INT32_MODIFIER "d %x\n", i32, ~0);
|
||||
if (0 != strcmp (str0, str1)) printf ("Something wrong with i32 : %s\n", str1);
|
||||
sprintf (str1, "%" PRINTF_INT32_MODIFIER "u %x\n", u32, ~0);
|
||||
if (0 != strcmp (str0, str1)) printf ("Something wrong with u32 : %s\n", str1);
|
||||
#ifdef INT64_MAX
|
||||
sprintf (str1, "%" PRINTF_INT64_MODIFIER "d %x\n", i64, ~0);
|
||||
if (0 != strcmp (str0, str1)) printf ("Something wrong with i64 : %s\n", str1);
|
||||
#endif
|
||||
sprintf (str1, "%" PRINTF_INTMAX_MODIFIER "d %x\n", imax, ~0);
|
||||
if (0 != strcmp (str0, str1)) printf ("Something wrong with imax : %s\n", str1);
|
||||
sprintf (str1, "%" PRINTF_INTMAX_MODIFIER "u %x\n", umax, ~0);
|
||||
if (0 != strcmp (str0, str1)) printf ("Something wrong with umax : %s\n", str1);
|
||||
|
||||
TESTUMAX(8);
|
||||
TESTUMAX(16);
|
||||
TESTUMAX(32);
|
||||
#ifdef INT64_MAX
|
||||
TESTUMAX(64);
|
||||
#endif
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
#endif
|
||||
+139
-67
@@ -1,6 +1,6 @@
|
||||
/* Modular support
|
||||
*
|
||||
* (C) 2008-2011 Anope Team
|
||||
* (C) 2008-2012 Anope Team
|
||||
* Contact us at team@anope.org
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
@@ -9,8 +9,18 @@
|
||||
#ifndef REGCHANNEL_H
|
||||
#define REGCHANNEL_H
|
||||
|
||||
#include "botserv.h"
|
||||
#include "memo.h"
|
||||
#include "modes.h"
|
||||
#include "extensible.h"
|
||||
#include "logger.h"
|
||||
#include "modules.h"
|
||||
#include "serialize.h"
|
||||
#include "bots.h"
|
||||
|
||||
typedef Anope::insensitive_map<ChannelInfo *> registered_channel_map;
|
||||
extern CoreExport registered_channel_map RegisteredChannelList;
|
||||
|
||||
extern CoreExport serialize_checker<registered_channel_map> RegisteredChannelList;
|
||||
|
||||
/** Flags used for the ChannelInfo class
|
||||
*/
|
||||
@@ -36,8 +46,6 @@ enum ChannelInfoFlag
|
||||
CI_NO_EXPIRE,
|
||||
/* Channel memo limit may not be changed */
|
||||
CI_MEMO_HARDMAX,
|
||||
/* Send notice to channel on use of OP/DEOP */
|
||||
CI_OPNOTICE,
|
||||
/* Stricter control of channel founder status */
|
||||
CI_SECUREFOUNDER,
|
||||
/* Sign kicks with the user who did the kick */
|
||||
@@ -52,14 +60,42 @@ enum ChannelInfoFlag
|
||||
* is set or not
|
||||
*/
|
||||
CI_PERSIST,
|
||||
/* Chanstats are enabled */
|
||||
CI_STATS,
|
||||
|
||||
CI_END
|
||||
};
|
||||
|
||||
const Anope::string ChannelInfoFlagStrings[] = {
|
||||
"BEGIN", "KEEPTOPIC", "SECUREOPS", "PRIVATE", "TOPICLOCK", "RESTRICTED",
|
||||
"PEACE", "SECURE", "NO_EXPIRE", "MEMO_HARDMAX", "OPNOTICE", "SECUREFOUNDER",
|
||||
"SIGNKICK", "SIGNKICK_LEVEL", "SUSPENDED", "PERSIST", ""
|
||||
"PEACE", "SECURE", "NO_EXPIRE", "MEMO_HARDMAX", "SECUREFOUNDER",
|
||||
"SIGNKICK", "SIGNKICK_LEVEL", "SUSPENDED", "PERSIST", "STATS", ""
|
||||
};
|
||||
|
||||
/** Flags for badwords
|
||||
*/
|
||||
enum BadWordType
|
||||
{
|
||||
/* Always kicks if the word is said */
|
||||
BW_ANY,
|
||||
/* User must way the entire word */
|
||||
BW_SINGLE,
|
||||
/* The word has to start with the badword */
|
||||
BW_START,
|
||||
/* The word has to end with the badword */
|
||||
BW_END
|
||||
};
|
||||
|
||||
/* Structure used to contain bad words. */
|
||||
struct CoreExport BadWord : Serializable
|
||||
{
|
||||
ChannelInfo *ci;
|
||||
Anope::string word;
|
||||
BadWordType type;
|
||||
|
||||
const Anope::string serialize_name() const anope_override;
|
||||
Serialize::Data serialize() const anope_override;
|
||||
static Serializable* unserialize(Serializable *obj, Serialize::Data &);
|
||||
};
|
||||
|
||||
/** Flags for auto kick
|
||||
@@ -73,42 +109,73 @@ enum AutoKickFlag
|
||||
const Anope::string AutoKickFlagString[] = { "AK_ISNICK", "" };
|
||||
|
||||
/* AutoKick data. */
|
||||
class AutoKick : public Flags<AutoKickFlag>
|
||||
class CoreExport AutoKick : public Flags<AutoKickFlag>, public Serializable
|
||||
{
|
||||
public:
|
||||
AutoKick() : Flags<AutoKickFlag>(AutoKickFlagString) { }
|
||||
AutoKick();
|
||||
serialize_obj<ChannelInfo> ci;
|
||||
/* Only one of these can be in use */
|
||||
Anope::string mask;
|
||||
NickCore *nc;
|
||||
serialize_obj<NickCore> nc;
|
||||
|
||||
Anope::string reason;
|
||||
Anope::string creator;
|
||||
time_t addtime;
|
||||
time_t last_used;
|
||||
|
||||
const Anope::string serialize_name() const anope_override;
|
||||
Serialize::Data serialize() const anope_override;
|
||||
static Serializable* unserialize(Serializable *obj, Serialize::Data &);
|
||||
};
|
||||
|
||||
struct ModeLock
|
||||
struct CoreExport ModeLock : Serializable
|
||||
{
|
||||
public:
|
||||
serialize_obj<ChannelInfo> ci;
|
||||
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) { }
|
||||
ModeLock(ChannelInfo *ch, bool s, ChannelModeName n, const Anope::string &p, const Anope::string &se = "", time_t c = Anope::CurTime);
|
||||
|
||||
const Anope::string serialize_name() const anope_override;
|
||||
Serialize::Data serialize() const anope_override;
|
||||
static Serializable* unserialize(Serializable *obj, Serialize::Data &);
|
||||
};
|
||||
|
||||
class CoreExport ChannelInfo : public Extensible, public Flags<ChannelInfoFlag, CI_END>
|
||||
struct CoreExport LogSetting : Serializable
|
||||
{
|
||||
serialize_obj<ChannelInfo> ci;
|
||||
/* Our service name of the command */
|
||||
Anope::string service_name;
|
||||
/* The name of the client the command is on */
|
||||
Anope::string command_service;
|
||||
/* Name of the command to the user, can have spaces */
|
||||
Anope::string command_name;
|
||||
Anope::string method, extra;
|
||||
Anope::string creator;
|
||||
time_t created;
|
||||
|
||||
const Anope::string serialize_name() const anope_override;
|
||||
Serialize::Data serialize() const anope_override;
|
||||
static Serializable* unserialize(Serializable *obj, Serialize::Data &);
|
||||
};
|
||||
|
||||
class CoreExport ChannelInfo : public Extensible, public Flags<ChannelInfoFlag, CI_END>, public Serializable
|
||||
{
|
||||
private:
|
||||
NickCore *founder; /* Channel founder */
|
||||
std::vector<ChanAccess *> access; /* List of authorized users */
|
||||
std::vector<AutoKick *> akick; /* List of users to kickban */
|
||||
std::vector<BadWord *> badwords; /* List of badwords */
|
||||
serialize_obj<NickCore> founder; /* Channel founder */
|
||||
serialize_checker<std::vector<ChanAccess *> > access; /* List of authorized users */
|
||||
serialize_checker<std::vector<AutoKick *> > akick; /* List of users to kickban */
|
||||
serialize_checker<std::vector<BadWord *> > badwords; /* List of badwords */
|
||||
std::map<Anope::string, int16_t> levels;
|
||||
|
||||
public:
|
||||
typedef std::multimap<ChannelModeName, ModeLock> ModeList;
|
||||
ModeList mode_locks;
|
||||
typedef std::multimap<ChannelModeName, ModeLock *> ModeList;
|
||||
serialize_checker<ModeList> mode_locks;
|
||||
serialize_checker<std::vector<LogSetting *> > log_settings;
|
||||
|
||||
/** Default constructor
|
||||
* @param chname The channel name
|
||||
@@ -118,14 +185,14 @@ class CoreExport ChannelInfo : public Extensible, public Flags<ChannelInfoFlag,
|
||||
/** Copy constructor
|
||||
* @param ci The ChannelInfo to copy settings to
|
||||
*/
|
||||
ChannelInfo(ChannelInfo &ci);
|
||||
ChannelInfo(const ChannelInfo &ci);
|
||||
|
||||
/** Default destructor
|
||||
*/
|
||||
~ChannelInfo();
|
||||
|
||||
Anope::string name; /* Channel name */
|
||||
NickCore *successor; /* Who gets the channel if the founder nick is dropped or expires */
|
||||
serialize_obj<NickCore> successor; /* Who gets the channel if the founder nick is dropped or expires */
|
||||
Anope::string desc;
|
||||
|
||||
time_t time_registered;
|
||||
@@ -135,21 +202,24 @@ class CoreExport ChannelInfo : public Extensible, public Flags<ChannelInfoFlag,
|
||||
Anope::string last_topic_setter; /* Setter */
|
||||
time_t last_topic_time; /* Time */
|
||||
|
||||
int16 bantype;
|
||||
int16 levels[CA_SIZE];
|
||||
int16_t bantype;
|
||||
|
||||
MemoInfo memos;
|
||||
|
||||
Channel *c; /* Pointer to channel record (if channel is currently in use) */
|
||||
|
||||
/* For BotServ */
|
||||
BotInfo *bi; /* Bot used on this channel */
|
||||
serialize_obj<BotInfo> bi; /* Bot used on this channel */
|
||||
Flags<BotServFlag> botflags;
|
||||
int16 ttb[TTB_SIZE]; /* Times to ban for each kicker */
|
||||
int16_t ttb[TTB_SIZE]; /* Times to ban for each kicker */
|
||||
|
||||
int16 capsmin, capspercent; /* For CAPS kicker */
|
||||
int16 floodlines, floodsecs; /* For FLOOD kicker */
|
||||
int16 repeattimes; /* For REPEAT kicker */
|
||||
int16_t capsmin, capspercent; /* For CAPS kicker */
|
||||
int16_t floodlines, floodsecs; /* For FLOOD kicker */
|
||||
int16_t repeattimes; /* For REPEAT kicker */
|
||||
|
||||
const Anope::string serialize_name() const anope_override;
|
||||
Serialize::Data serialize() const anope_override;
|
||||
static Serializable* unserialize(Serializable *obj, Serialize::Data &);
|
||||
|
||||
/** Change the founder of the channek
|
||||
* @params nc The new founder
|
||||
@@ -164,7 +234,7 @@ class CoreExport ChannelInfo : public Extensible, public Flags<ChannelInfoFlag,
|
||||
/** Find which bot should send mode/topic/etc changes for this channel
|
||||
* @return The bot
|
||||
*/
|
||||
BotInfo *WhoSends();
|
||||
BotInfo *WhoSends() const;
|
||||
|
||||
/** Add an entry to the channel access list
|
||||
* @param access The entry
|
||||
@@ -178,13 +248,13 @@ class CoreExport ChannelInfo : public Extensible, public Flags<ChannelInfoFlag,
|
||||
*
|
||||
* Retrieves an entry from the access list that matches the given index.
|
||||
*/
|
||||
ChanAccess *GetAccess(unsigned index);
|
||||
ChanAccess *GetAccess(unsigned index) const;
|
||||
|
||||
/** Retrieve the access for a user or group in the form of a vector of access entries
|
||||
* (as multiple entries can affect a single user).
|
||||
*/
|
||||
AccessGroup AccessFor(User *u);
|
||||
AccessGroup AccessFor(NickCore *nc);
|
||||
AccessGroup AccessFor(const User *u);
|
||||
AccessGroup AccessFor(const NickCore *nc);
|
||||
|
||||
/** Get the size of the accss vector for this channel
|
||||
* @return The access vector size
|
||||
@@ -205,7 +275,7 @@ class CoreExport ChannelInfo : public Extensible, public Flags<ChannelInfoFlag,
|
||||
*
|
||||
* Clears the memory used by the given access entry and removes it from the vector.
|
||||
*/
|
||||
void EraseAccess(ChanAccess *taccess);
|
||||
void EraseAccess(const ChanAccess *taccess);
|
||||
|
||||
/** Clear the entire channel access list
|
||||
*
|
||||
@@ -220,7 +290,7 @@ class CoreExport ChannelInfo : public Extensible, public Flags<ChannelInfoFlag,
|
||||
* @param t The time the akick was added, defaults to now
|
||||
* @param lu The time the akick was last used, defaults to never
|
||||
*/
|
||||
AutoKick *AddAkick(const Anope::string &user, NickCore *akicknc, const Anope::string &reason, time_t t = Anope::CurTime, time_t lu = 0);
|
||||
AutoKick* AddAkick(const Anope::string &user, NickCore *akicknc, const Anope::string &reason, time_t t = Anope::CurTime, time_t lu = 0);
|
||||
|
||||
/** Add an akick entry to the channel by reason
|
||||
* @param user The user who added the akick
|
||||
@@ -229,13 +299,13 @@ class CoreExport ChannelInfo : public Extensible, public Flags<ChannelInfoFlag,
|
||||
* @param t The time the akick was added, defaults to now
|
||||
* @param lu The time the akick was last used, defaults to never
|
||||
*/
|
||||
AutoKick *AddAkick(const Anope::string &user, const Anope::string &mask, const Anope::string &reason, time_t t = Anope::CurTime, time_t lu = 0);
|
||||
AutoKick* AddAkick(const Anope::string &user, const Anope::string &mask, const Anope::string &reason, time_t t = Anope::CurTime, time_t lu = 0);
|
||||
|
||||
/** Get an entry from the channel akick list
|
||||
* @param index The index in the akick vector
|
||||
* @return The akick structure, or NULL if not found
|
||||
*/
|
||||
AutoKick *GetAkick(unsigned index);
|
||||
AutoKick* GetAkick(unsigned index) const;
|
||||
|
||||
/** Get the size of the akick vector for this channel
|
||||
* @return The akick vector size
|
||||
@@ -256,13 +326,13 @@ class CoreExport ChannelInfo : public Extensible, public Flags<ChannelInfoFlag,
|
||||
* @param type The type (SINGLE START END)
|
||||
* @return The badword
|
||||
*/
|
||||
BadWord *AddBadWord(const Anope::string &word, BadWordType type);
|
||||
BadWord* AddBadWord(const Anope::string &word, BadWordType type);
|
||||
|
||||
/** Get a badword structure by index
|
||||
* @param index The index
|
||||
* @return The badword
|
||||
*/
|
||||
BadWord *GetBadWord(unsigned index);
|
||||
BadWord* GetBadWord(unsigned index) const;
|
||||
|
||||
/** Get how many badwords are on this channel
|
||||
* @return The number of badwords in the vector
|
||||
@@ -278,11 +348,6 @@ class CoreExport ChannelInfo : public Extensible, public Flags<ChannelInfoFlag,
|
||||
*/
|
||||
void ClearBadWords();
|
||||
|
||||
/** Loads MLocked modes from extensible. This is used from database loading because Anope doesn't know what modes exist
|
||||
* until after it connects to the IRCd.
|
||||
*/
|
||||
void LoadMLock();
|
||||
|
||||
/** Check if a mode is mlocked
|
||||
* @param mode The mode
|
||||
* @param An optional param
|
||||
@@ -303,10 +368,11 @@ class CoreExport ChannelInfo : public Extensible, public Flags<ChannelInfoFlag,
|
||||
|
||||
/** Remove a mlock
|
||||
* @param mode The mode
|
||||
* @param status True for mlock on, false for mlock off
|
||||
* @param param The param of the mode, required if it is a list or status mode
|
||||
* @return true on success, false on failure
|
||||
*/
|
||||
bool RemoveMLock(ChannelMode *mode, const Anope::string ¶m = "");
|
||||
bool RemoveMLock(ChannelMode *mode, bool status, const Anope::string ¶m = "");
|
||||
|
||||
/** Clear all mlocks on the channel
|
||||
*/
|
||||
@@ -315,7 +381,7 @@ class CoreExport ChannelInfo : public Extensible, public Flags<ChannelInfoFlag,
|
||||
/** Get all of the mlocks for this channel
|
||||
* @return The mlocks
|
||||
*/
|
||||
const std::multimap<ChannelModeName, ModeLock> &GetMLock() const;
|
||||
const ModeList &GetMLock() const;
|
||||
|
||||
/** Get a list of modes on a channel
|
||||
* @param Name The mode name to get a list of
|
||||
@@ -328,10 +394,10 @@ class CoreExport ChannelInfo : public Extensible, public Flags<ChannelInfoFlag,
|
||||
* @param An optional param to match with
|
||||
* @return The MLock, if any
|
||||
*/
|
||||
ModeLock *GetMLock(ChannelModeName mname, const Anope::string ¶m = "");
|
||||
const ModeLock *GetMLock(ChannelModeName mname, const Anope::string ¶m = "");
|
||||
|
||||
/** Get the current mode locks as a string
|
||||
* @param complete True to show mlock parameters aswell
|
||||
* @param complete True to show mlock parameters aswell
|
||||
* @return A string of mode locks, eg: +nrt
|
||||
*/
|
||||
Anope::string GetMLockAsString(bool complete) const;
|
||||
@@ -347,32 +413,38 @@ class CoreExport ChannelInfo : public Extensible, public Flags<ChannelInfoFlag,
|
||||
* the new topic in the ChannelInfo
|
||||
*/
|
||||
void CheckTopic();
|
||||
|
||||
|
||||
/** Restore the channel topic, used on channel creation when not syncing with the uplink
|
||||
* and after uplink sync
|
||||
*/
|
||||
void RestoreTopic();
|
||||
|
||||
/** Get the level for a privilege
|
||||
* @param priv The privilege name
|
||||
* @return the level
|
||||
* @throws CoreException if priv is not a valid privilege
|
||||
*/
|
||||
int16_t GetLevel(const Anope::string &priv) const;
|
||||
|
||||
/** Set the level for a privilege
|
||||
* @param priv The privilege priv
|
||||
* @param level The new level
|
||||
*/
|
||||
void SetLevel(const Anope::string &priv, int16_t level);
|
||||
|
||||
/** Remove a privilege from the channel
|
||||
* @param priv The privilege
|
||||
*/
|
||||
void RemoveLevel(const Anope::string &priv);
|
||||
|
||||
/** Clear all privileges from the channel
|
||||
*/
|
||||
void ClearLevels();
|
||||
};
|
||||
|
||||
/** A timer used to keep the BotServ bot/ChanServ in the channel
|
||||
* after kicking the last user in a channel
|
||||
*/
|
||||
class CoreExport ChanServTimer : public Timer
|
||||
{
|
||||
private:
|
||||
dynamic_reference<Channel> c;
|
||||
|
||||
public:
|
||||
/** Default constructor
|
||||
* @param chan The channel
|
||||
*/
|
||||
ChanServTimer(Channel *chan);
|
||||
|
||||
/** Called when the delay is up
|
||||
* @param The current time
|
||||
*/
|
||||
void Tick(time_t);
|
||||
};
|
||||
|
||||
extern CoreExport ChannelInfo *cs_findchan(const Anope::string &chan);
|
||||
extern CoreExport bool IsFounder(const User *user, const ChannelInfo *ci);
|
||||
extern CoreExport void update_cs_lastseen(User *user, ChannelInfo *ci);
|
||||
extern CoreExport int get_idealban(const ChannelInfo *ci, User *u, Anope::string &ret);
|
||||
|
||||
#endif // REGCHANNEL_H
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
/*
|
||||
*
|
||||
* (C) 2003-2012 Anope Team
|
||||
* Contact us at team@anope.org
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
*
|
||||
* Based on the original code of Epona by Lara.
|
||||
* Based on the original code of Services by Andy Church.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef REGEXPR_H
|
||||
#define REGEXPR_H
|
||||
|
||||
#include "services.h"
|
||||
#include "anope.h"
|
||||
#include "service.h"
|
||||
|
||||
class RegexException : public CoreException
|
||||
{
|
||||
public:
|
||||
RegexException(const Anope::string &reason = "") : CoreException(reason) { }
|
||||
|
||||
virtual ~RegexException() throw() { }
|
||||
};
|
||||
|
||||
class CoreExport Regex
|
||||
{
|
||||
Anope::string expression;
|
||||
protected:
|
||||
Regex(const Anope::string &expr) : expression(expr) { }
|
||||
public:
|
||||
virtual ~Regex() { }
|
||||
const Anope::string &GetExpression() { return expression; }
|
||||
virtual bool Matches(const Anope::string &str) = 0;
|
||||
};
|
||||
|
||||
class CoreExport RegexProvider : public Service
|
||||
{
|
||||
public:
|
||||
RegexProvider(Module *o, const Anope::string &n) : Service(o, "Regex", n) { }
|
||||
virtual Regex *Compile(const Anope::string &) = 0;
|
||||
};
|
||||
|
||||
#endif // REGEXPR_H
|
||||
|
||||
@@ -0,0 +1,281 @@
|
||||
/*
|
||||
*
|
||||
* (C) 2003-2012 Anope Team
|
||||
* Contact us at team@anope.org
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
*
|
||||
* Based on the original code of Epona by Lara.
|
||||
* Based on the original code of Services by Andy Church.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef SERIALIZE_H
|
||||
#define SERIALIZE_H
|
||||
|
||||
#include <sstream>
|
||||
|
||||
#include "anope.h"
|
||||
#include "base.h"
|
||||
|
||||
namespace Serialize
|
||||
{
|
||||
enum DataType
|
||||
{
|
||||
DT_TEXT,
|
||||
DT_INT
|
||||
};
|
||||
}
|
||||
|
||||
class CoreExport stringstream : public std::stringstream
|
||||
{
|
||||
private:
|
||||
Serialize::DataType type;
|
||||
unsigned _max;
|
||||
|
||||
public:
|
||||
stringstream();
|
||||
stringstream(const stringstream &ss);
|
||||
Anope::string astr() const;
|
||||
|
||||
template<typename T> std::istream &operator>>(T &val)
|
||||
{
|
||||
std::istringstream is(this->str());
|
||||
is >> val;
|
||||
return *this;
|
||||
}
|
||||
std::istream &operator>>(Anope::string &val);
|
||||
|
||||
bool operator==(const stringstream &other) const;
|
||||
bool operator!=(const stringstream &other) const;
|
||||
|
||||
stringstream &setType(Serialize::DataType t);
|
||||
Serialize::DataType getType() const;
|
||||
stringstream &setMax(unsigned m);
|
||||
unsigned getMax() const;
|
||||
};
|
||||
|
||||
namespace Serialize
|
||||
{
|
||||
typedef std::map<Anope::string, stringstream> Data;
|
||||
}
|
||||
|
||||
extern void RegisterTypes();
|
||||
|
||||
class CoreExport Serializable : public virtual Base
|
||||
{
|
||||
private:
|
||||
static std::list<Serializable *> *serializable_items;
|
||||
|
||||
private:
|
||||
std::list<Serializable *>::iterator s_iter;
|
||||
Serialize::Data last_commit;
|
||||
time_t last_commit_time;
|
||||
|
||||
protected:
|
||||
Serializable();
|
||||
Serializable(const Serializable &);
|
||||
|
||||
virtual ~Serializable();
|
||||
|
||||
Serializable &operator=(const Serializable &);
|
||||
|
||||
public:
|
||||
unsigned int id;
|
||||
|
||||
void destroy();
|
||||
|
||||
void QueueUpdate();
|
||||
|
||||
bool IsCached();
|
||||
void UpdateCache();
|
||||
|
||||
bool IsTSCached();
|
||||
void UpdateTS();
|
||||
|
||||
virtual const Anope::string serialize_name() const = 0;
|
||||
virtual Serialize::Data serialize() const = 0;
|
||||
|
||||
static const std::list<Serializable *> &GetItems();
|
||||
};
|
||||
|
||||
class CoreExport SerializeType
|
||||
{
|
||||
typedef Serializable* (*unserialize_func)(Serializable *obj, Serialize::Data &);
|
||||
|
||||
static std::vector<Anope::string> type_order;
|
||||
static Anope::map<SerializeType *> types;
|
||||
|
||||
Anope::string name;
|
||||
unserialize_func unserialize;
|
||||
time_t timestamp;
|
||||
|
||||
public:
|
||||
std::map<unsigned int, Serializable *> objects;
|
||||
|
||||
SerializeType(const Anope::string &n, unserialize_func f);
|
||||
~SerializeType();
|
||||
|
||||
const Anope::string &GetName();
|
||||
|
||||
Serializable *Unserialize(Serializable *obj, Serialize::Data &data);
|
||||
|
||||
void Check();
|
||||
|
||||
time_t GetTimestamp() const;
|
||||
void UpdateTimestamp();
|
||||
|
||||
static SerializeType *Find(const Anope::string &name);
|
||||
|
||||
static const std::vector<Anope::string> &GetTypeOrder();
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
class serialize_checker
|
||||
{
|
||||
Anope::string name;
|
||||
T obj;
|
||||
|
||||
public:
|
||||
serialize_checker(const Anope::string &n) : name(n) { }
|
||||
|
||||
inline const T* operator->() const
|
||||
{
|
||||
static SerializeType *type = SerializeType::Find(this->name);
|
||||
if (type)
|
||||
type->Check();
|
||||
return &this->obj;
|
||||
}
|
||||
inline T* operator->()
|
||||
{
|
||||
static SerializeType *type = SerializeType::Find(this->name);
|
||||
if (type)
|
||||
type->Check();
|
||||
return &this->obj;
|
||||
}
|
||||
|
||||
inline const T& operator*() const
|
||||
{
|
||||
static SerializeType *type = SerializeType::Find(this->name);
|
||||
if (type)
|
||||
type->Check();
|
||||
return this->obj;
|
||||
}
|
||||
inline T& operator*()
|
||||
{
|
||||
static SerializeType *type = SerializeType::Find(this->name);
|
||||
if (type)
|
||||
type->Check();
|
||||
return this->obj;
|
||||
}
|
||||
|
||||
inline operator const T&() const
|
||||
{
|
||||
static SerializeType *type = SerializeType::Find(this->name);
|
||||
if (type)
|
||||
type->Check();
|
||||
return this->obj;
|
||||
}
|
||||
inline operator T&()
|
||||
{
|
||||
static SerializeType *type = SerializeType::Find(this->name);
|
||||
if (type)
|
||||
type->Check();
|
||||
return this->obj;
|
||||
}
|
||||
};
|
||||
|
||||
#include "modules.h"
|
||||
|
||||
template<typename T>
|
||||
class serialize_obj : public dynamic_reference_base
|
||||
{
|
||||
protected:
|
||||
T *ref;
|
||||
|
||||
public:
|
||||
serialize_obj() : ref(NULL)
|
||||
{
|
||||
}
|
||||
|
||||
serialize_obj(T *obj) : ref(obj)
|
||||
{
|
||||
if (obj)
|
||||
obj->AddReference(this);
|
||||
}
|
||||
|
||||
serialize_obj(const serialize_obj<T> &other) : ref(other.ref)
|
||||
{
|
||||
if (*this)
|
||||
this->ref->AddReference(this);
|
||||
}
|
||||
|
||||
~serialize_obj()
|
||||
{
|
||||
if (*this)
|
||||
this->ref->DelReference(this);
|
||||
}
|
||||
|
||||
inline operator bool() const
|
||||
{
|
||||
if (!this->invalid)
|
||||
return this->ref != NULL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
inline void operator=(T *newref)
|
||||
{
|
||||
if (*this)
|
||||
this->ref->DelReference(this);
|
||||
|
||||
this->ref = newref;
|
||||
this->invalid = false;
|
||||
|
||||
if (newref)
|
||||
this->ref->AddReference(this);
|
||||
}
|
||||
|
||||
inline operator T*() const
|
||||
{
|
||||
if (!this->invalid)
|
||||
{
|
||||
if (this->ref)
|
||||
{
|
||||
FOREACH_MOD(I_OnSerializePtrAssign, OnSerializePtrAssign(this->ref));
|
||||
this->ref->QueueUpdate();
|
||||
}
|
||||
return this->ref;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
inline T* operator*() const
|
||||
{
|
||||
if (!this->invalid)
|
||||
{
|
||||
if (this->ref)
|
||||
{
|
||||
FOREACH_MOD(I_OnSerializePtrAssign, OnSerializePtrAssign(this->ref));
|
||||
this->ref->QueueUpdate();
|
||||
}
|
||||
return this->ref;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
inline T* operator->() const
|
||||
{
|
||||
if (!this->invalid)
|
||||
{
|
||||
if (this->ref)
|
||||
{
|
||||
FOREACH_MOD(I_OnSerializePtrAssign, OnSerializePtrAssign(this->ref));
|
||||
this->ref->QueueUpdate();
|
||||
}
|
||||
return this->ref;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
};
|
||||
|
||||
#endif // SERIALIZE_H
|
||||
+10
-23
@@ -1,6 +1,9 @@
|
||||
#ifndef SERVERS_H
|
||||
#define SERVERS_H
|
||||
|
||||
#include "services.h"
|
||||
#include "anope.h"
|
||||
|
||||
/* Anope */
|
||||
extern CoreExport Server *Me;
|
||||
|
||||
@@ -9,29 +12,7 @@ extern CoreExport void do_server(const Anope::string &source, const Anope::strin
|
||||
extern CoreExport const Anope::string ts6_uid_retrieve();
|
||||
extern CoreExport const Anope::string ts6_sid_retrieve();
|
||||
|
||||
/* Types of capab
|
||||
*/
|
||||
enum CapabType
|
||||
{
|
||||
CAPAB_BEGIN,
|
||||
|
||||
CAPAB_NOQUIT,
|
||||
CAPAB_TSMODE,
|
||||
CAPAB_UNCONNECT,
|
||||
CAPAB_QS,
|
||||
|
||||
CAPAB_END
|
||||
};
|
||||
|
||||
/* CAPAB stuffs */
|
||||
struct CapabInfo
|
||||
{
|
||||
Anope::string Token;
|
||||
CapabType Flag;
|
||||
};
|
||||
|
||||
extern CoreExport Flags<CapabType, CAPAB_END> Capab;
|
||||
extern CoreExport CapabInfo Capab_Info[];
|
||||
extern CoreExport std::set<Anope::string> Capab;
|
||||
|
||||
/** Flags set on servers
|
||||
*/
|
||||
@@ -152,6 +133,12 @@ class CoreExport Server : public Flags<ServerFlag>
|
||||
*/
|
||||
bool IsULined() const;
|
||||
|
||||
/** Send a message to alll users on this server
|
||||
* @param source The source of the message
|
||||
* @param message The message
|
||||
*/
|
||||
void Notice(const BotInfo *source, const Anope::string &message);
|
||||
|
||||
/** Find a server
|
||||
* @param name The name or SID/numeric
|
||||
* @param s The server list to search for this server on, defaults to our Uplink
|
||||
|
||||
@@ -0,0 +1,110 @@
|
||||
/*
|
||||
* (C) 2003-2012 Anope Team
|
||||
* Contact us at team@anope.org
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
*
|
||||
* Based on the original code of Epona by Lara.
|
||||
* Based on the original code of Services by Andy Church.
|
||||
*/
|
||||
|
||||
#ifndef SERVICE_H
|
||||
#define SERVICE_H
|
||||
|
||||
#include "services.h"
|
||||
#include "anope.h"
|
||||
#include "modules.h"
|
||||
|
||||
class CoreExport Service : public virtual Base
|
||||
{
|
||||
static Anope::map<Anope::map<Service *> > services;
|
||||
public:
|
||||
static Service *FindService(const Anope::string &t, const Anope::string &n)
|
||||
{
|
||||
Anope::map<Anope::map<Service *> >::iterator it = services.find(t);
|
||||
if (it != services.end())
|
||||
{
|
||||
Anope::map<Service *>::iterator it2 = it->second.find(n);
|
||||
if (it2 != it->second.end())
|
||||
return it2->second;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static std::vector<Anope::string> GetServiceKeys(const Anope::string &t)
|
||||
{
|
||||
std::vector<Anope::string> keys;
|
||||
Anope::map<Anope::map<Service *> >::iterator it = services.find(t);
|
||||
if (it != services.end())
|
||||
for (Anope::map<Service *>::iterator it2 = it->second.begin(); it2 != it->second.end(); ++it2)
|
||||
keys.push_back(it2->first);
|
||||
return keys;
|
||||
}
|
||||
|
||||
Module *owner;
|
||||
Anope::string type;
|
||||
Anope::string name;
|
||||
|
||||
Service(Module *o, const Anope::string &t, const Anope::string &n) : owner(o), type(t), name(n)
|
||||
{
|
||||
this->Register();
|
||||
}
|
||||
|
||||
virtual ~Service()
|
||||
{
|
||||
this->Unregister();
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
Anope::map<Service *> &smap = services[this->type];
|
||||
if (smap.find(this->name) != smap.end())
|
||||
throw ModuleException("Service " + this->type + " with name " + this->name + " already exists");
|
||||
smap[this->name] = this;
|
||||
}
|
||||
|
||||
void Unregister()
|
||||
{
|
||||
Anope::map<Service *> &smap = services[this->type];
|
||||
smap.erase(this->name);
|
||||
if (smap.empty())
|
||||
services.erase(this->type);
|
||||
}
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
class service_reference : public dynamic_reference<T>
|
||||
{
|
||||
Anope::string type;
|
||||
Anope::string name;
|
||||
|
||||
public:
|
||||
service_reference(const Anope::string &t, const Anope::string &n) : dynamic_reference<T>(NULL), type(t), name(n)
|
||||
{
|
||||
}
|
||||
|
||||
inline void operator=(const Anope::string &n)
|
||||
{
|
||||
this->name = n;
|
||||
}
|
||||
|
||||
operator bool() anope_override
|
||||
{
|
||||
if (this->invalid)
|
||||
{
|
||||
this->invalid = false;
|
||||
this->ref = NULL;
|
||||
}
|
||||
if (!this->ref)
|
||||
{
|
||||
this->ref = static_cast<T *>(Service::FindService(this->type, this->name));
|
||||
if (this->ref)
|
||||
this->ref->AddReference(this);
|
||||
}
|
||||
return this->ref;
|
||||
}
|
||||
};
|
||||
|
||||
#endif // SERVICE_H
|
||||
|
||||
+24
-899
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
*
|
||||
* (C) 2003-2011 Anope Team
|
||||
* (C) 2003-2012 Anope Team
|
||||
* Contact us at team@anope.org
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
@@ -14,137 +14,28 @@
|
||||
#ifndef SERVICES_H
|
||||
#define SERVICES_H
|
||||
|
||||
/*************************************************************************/
|
||||
|
||||
#include "sysconf.h"
|
||||
|
||||
#define BUFSIZE 1024
|
||||
|
||||
/* Some SUN fixs */
|
||||
#ifdef __sun
|
||||
# ifndef INADDR_NONE
|
||||
# define INADDR_NONE (-1)
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <cstdio>
|
||||
#include <cstdlib>
|
||||
#include <cstdarg>
|
||||
#include <stdexcept>
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include <signal.h>
|
||||
#include <time.h>
|
||||
#include <errno.h>
|
||||
#include <limits.h>
|
||||
|
||||
#include <sys/stat.h> /* for umask() on some systems */
|
||||
#include <sys/types.h>
|
||||
#include <fcntl.h>
|
||||
#include <typeinfo>
|
||||
|
||||
#if GETTEXT_FOUND
|
||||
# include <libintl.h>
|
||||
#endif
|
||||
#define _(x) x
|
||||
|
||||
#ifndef _WIN32
|
||||
# include <unistd.h>
|
||||
# include <grp.h>
|
||||
# include <netdb.h>
|
||||
# include <netinet/in.h>
|
||||
# include <arpa/inet.h>
|
||||
# include <sys/socket.h>
|
||||
# include <sys/time.h>
|
||||
# include <dirent.h>
|
||||
# define DllExport
|
||||
# define CoreExport
|
||||
# define MARK_DEPRECATED __attribute((deprecated))
|
||||
# define DeleteFile unlink
|
||||
#else
|
||||
# include "anope_windows.h"
|
||||
#endif
|
||||
|
||||
/* Telling compilers about printf()-like functions: */
|
||||
#ifdef __GNUC__
|
||||
# define FORMAT(type, fmt, start) __attribute__((format(type, fmt, start)))
|
||||
#else
|
||||
# define FORMAT(type, fmt, start)
|
||||
#endif
|
||||
|
||||
#if HAVE_STRINGS_H
|
||||
# include <strings.h>
|
||||
#endif
|
||||
|
||||
#ifdef _AIX
|
||||
/* Some AIX boxes seem to have bogus includes that don't have these
|
||||
* prototypes. */
|
||||
extern int strcasecmp(const char *, const char *);
|
||||
extern int strncasecmp(const char *, const char *, size_t);
|
||||
# undef FD_ZERO
|
||||
# define FD_ZERO(p) memset((p), 0, sizeof(*(p)))
|
||||
#endif /* _AIX */
|
||||
|
||||
/* Alias stricmp/strnicmp to strcasecmp/strncasecmp if we have the latter
|
||||
* but not the former. */
|
||||
#if !HAVE_STRICMP && HAVE_STRCASECMP
|
||||
# define stricmp strcasecmp
|
||||
# define strnicmp strncasecmp
|
||||
#ifndef _WIN32
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
/* We have our own versions of toupper()/tolower(). */
|
||||
#include <ctype.h>
|
||||
#undef tolower
|
||||
#undef toupper
|
||||
#define tolower tolower_
|
||||
#define toupper toupper_
|
||||
|
||||
/** 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.
|
||||
*/
|
||||
#ifdef _WIN32
|
||||
# define MODULE_INIT(x) \
|
||||
extern "C" DllExport Module *AnopeInit(const Anope::string &, const Anope::string &); \
|
||||
extern "C" Module *AnopeInit(const Anope::string &modname, const Anope::string &creator) \
|
||||
{ \
|
||||
return new x(modname, creator); \
|
||||
} \
|
||||
BOOLEAN WINAPI DllMain(HINSTANCE, DWORD nReason, LPVOID) \
|
||||
{ \
|
||||
switch (nReason) \
|
||||
{ \
|
||||
case DLL_PROCESS_ATTACH: \
|
||||
case DLL_PROCESS_DETACH: \
|
||||
break; \
|
||||
} \
|
||||
return TRUE; \
|
||||
} \
|
||||
extern "C" DllExport void AnopeFini(x *); \
|
||||
extern "C" void AnopeFini(x *m) \
|
||||
{ \
|
||||
delete m; \
|
||||
}
|
||||
#else
|
||||
# define MODULE_INIT(x) \
|
||||
extern "C" DllExport Module *AnopeInit(const Anope::string &modname, const Anope::string &creator) \
|
||||
{ \
|
||||
return new x(modname, creator); \
|
||||
} \
|
||||
extern "C" DllExport void AnopeFini(x *m) \
|
||||
{ \
|
||||
delete m; \
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Miscellaneous definitions. */
|
||||
#include "hashcomp.h"
|
||||
|
||||
/* Pull in the various bits of STL */
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
#include <map>
|
||||
#include <exception>
|
||||
#include <list>
|
||||
@@ -152,590 +43,28 @@ extern int strncasecmp(const char *, const char *, size_t);
|
||||
#include <deque>
|
||||
#include <bitset>
|
||||
#include <set>
|
||||
#include <algorithm>
|
||||
|
||||
#include "anope.h"
|
||||
#include "defs.h"
|
||||
|
||||
/** This class can be used on its own to represent an exception, or derived to represent a module-specific exception.
|
||||
* When a module whishes to abort, e.g. within a constructor, it should throw an exception using ModuleException or
|
||||
* a class derived from ModuleException. If a module throws an exception during its constructor, the module will not
|
||||
* be loaded. If this happens, the error message returned by ModuleException::GetReason will be displayed to the user
|
||||
* attempting to load the module, or dumped to the console if the ircd is currently loading for the first time.
|
||||
*/
|
||||
class CoreException : public std::exception
|
||||
{
|
||||
protected:
|
||||
/** Holds the error message to be displayed
|
||||
*/
|
||||
Anope::string err;
|
||||
/** Source of the exception
|
||||
*/
|
||||
Anope::string source;
|
||||
public:
|
||||
/** Default constructor, just uses the error mesage 'Core threw an exception'.
|
||||
*/
|
||||
CoreException() : err("Core threw an exception"), source("The core") { }
|
||||
/** This constructor can be used to specify an error message before throwing.
|
||||
*/
|
||||
CoreException(const Anope::string &message) : err(message), source("The core") { }
|
||||
/** This constructor can be used to specify an error message before throwing,
|
||||
* and to specify the source of the exception.
|
||||
*/
|
||||
CoreException(const Anope::string &message, const Anope::string &src) : err(message), source(src) { }
|
||||
/** This destructor solves world hunger, cancels the world debt, and causes the world to end.
|
||||
* Actually no, it does nothing. Never mind.
|
||||
* @throws Nothing!
|
||||
*/
|
||||
virtual ~CoreException() throw() { }
|
||||
/** Returns the reason for the exception.
|
||||
* The module should probably put something informative here as the user will see this upon failure.
|
||||
*/
|
||||
virtual const Anope::string &GetReason() const
|
||||
{
|
||||
return err;
|
||||
}
|
||||
#define _(x) x
|
||||
|
||||
virtual const Anope::string &GetSource() const
|
||||
{
|
||||
return source;
|
||||
}
|
||||
};
|
||||
|
||||
class FatalException : public CoreException
|
||||
{
|
||||
public:
|
||||
FatalException(const Anope::string &reason = "") : CoreException(reason) { }
|
||||
|
||||
virtual ~FatalException() throw() { }
|
||||
};
|
||||
|
||||
class ModuleException : public CoreException
|
||||
{
|
||||
public:
|
||||
/** Default constructor, just uses the error mesage 'Module threw an exception'.
|
||||
*/
|
||||
ModuleException() : CoreException("Module threw an exception", "A Module") { }
|
||||
|
||||
/** This constructor can be used to specify an error message before throwing.
|
||||
*/
|
||||
ModuleException(const Anope::string &message) : CoreException(message, "A Module") { }
|
||||
/** This destructor solves world hunger, cancels the world debt, and causes the world to end.
|
||||
* Actually no, it does nothing. Never mind.
|
||||
* @throws Nothing!
|
||||
*/
|
||||
virtual ~ModuleException() throw() { }
|
||||
};
|
||||
|
||||
class DatabaseException : public CoreException
|
||||
{
|
||||
public:
|
||||
/** This constructor can be used to specify an error message before throwing.
|
||||
* @param mmessage The exception
|
||||
*/
|
||||
DatabaseException(const Anope::string &message) : CoreException(message, "A database module") { }
|
||||
|
||||
/** Destructor
|
||||
* @throws Nothing
|
||||
*/
|
||||
virtual ~DatabaseException() throw() { }
|
||||
};
|
||||
|
||||
class Signal
|
||||
{
|
||||
static std::vector<Signal *> SignalHandlers;
|
||||
static void SignalHandler(int signal);
|
||||
|
||||
struct sigaction action, old;
|
||||
sig_atomic_t called;
|
||||
public:
|
||||
static void Process();
|
||||
|
||||
int signal;
|
||||
|
||||
Signal(int s);
|
||||
~Signal();
|
||||
virtual void OnSignal() = 0;
|
||||
};
|
||||
|
||||
/** Debug cast to be used instead of dynamic_cast, this uses dynamic_cast
|
||||
* for debug builds and static_cast on releass builds to speed up the program
|
||||
* because dynamic_cast relies on RTTI.
|
||||
*/
|
||||
template<typename T, typename O> inline T debug_cast(O ptr)
|
||||
{
|
||||
#ifdef DEBUG_BUILD
|
||||
T ret = dynamic_cast<T>(ptr);
|
||||
if (ptr != NULL && ret == NULL)
|
||||
throw CoreException(Anope::string("debug_cast<") + typeid(T).name() + ">(" + typeid(O).name() + ") fail");
|
||||
return ret;
|
||||
#ifdef __GXX_EXPERIMENTAL_CXX0X__
|
||||
# define anope_override override
|
||||
# define anope_final final
|
||||
#else
|
||||
return static_cast<T>(ptr);
|
||||
# define anope_override
|
||||
# define anope_final
|
||||
#endif
|
||||
}
|
||||
|
||||
/*************************************************************************/
|
||||
|
||||
/** Class with the ability to keep flags on items, they should extend from this
|
||||
* where T is an enum.
|
||||
*/
|
||||
template<typename T, size_t Size = 32> class Flags
|
||||
{
|
||||
protected:
|
||||
std::bitset<Size> Flag_Values;
|
||||
const Anope::string *Flag_Strings;
|
||||
|
||||
public:
|
||||
Flags() : Flag_Strings(NULL) { }
|
||||
Flags(const Anope::string *flag_strings) : Flag_Strings(flag_strings) { }
|
||||
|
||||
/** Add a flag to this item
|
||||
* @param Value The flag
|
||||
*/
|
||||
void SetFlag(T Value)
|
||||
{
|
||||
Flag_Values[Value] = true;
|
||||
}
|
||||
|
||||
/** Remove a flag from this item
|
||||
* @param Value The flag
|
||||
*/
|
||||
void UnsetFlag(T Value)
|
||||
{
|
||||
Flag_Values[Value] = false;
|
||||
}
|
||||
|
||||
/** Check if this item has a flag
|
||||
* @param Value The flag
|
||||
* @return true or false
|
||||
*/
|
||||
bool HasFlag(T Value) const
|
||||
{
|
||||
return Flag_Values.test(Value);
|
||||
}
|
||||
|
||||
/** Check how many flags are set
|
||||
* @return The number of flags set
|
||||
*/
|
||||
size_t FlagCount() const
|
||||
{
|
||||
return Flag_Values.count();
|
||||
}
|
||||
|
||||
/** Unset all of the flags
|
||||
*/
|
||||
void ClearFlags()
|
||||
{
|
||||
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));
|
||||
}
|
||||
};
|
||||
|
||||
class Module;
|
||||
|
||||
class CoreExport Service : public Base
|
||||
{
|
||||
public:
|
||||
Module *owner;
|
||||
Anope::string name;
|
||||
|
||||
Service(Module *o, const Anope::string &n);
|
||||
|
||||
virtual ~Service();
|
||||
};
|
||||
|
||||
|
||||
#include "sockets.h"
|
||||
#include "socketengine.h"
|
||||
#include "extensible.h"
|
||||
#include "timers.h"
|
||||
#include "dns.h"
|
||||
|
||||
/*************************************************************************/
|
||||
|
||||
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");
|
||||
|
||||
return stream.str();
|
||||
}
|
||||
|
||||
template<typename T> inline void convert(const Anope::string &s, T &x, Anope::string &leftover, bool failIfLeftoverChars = true)
|
||||
{
|
||||
leftover.clear();
|
||||
std::istringstream i(s.str());
|
||||
char c;
|
||||
bool res = i >> x;
|
||||
if (!res)
|
||||
throw ConvertException("Convert fail");
|
||||
if (failIfLeftoverChars)
|
||||
{
|
||||
if (i.get(c))
|
||||
throw ConvertException("Convert fail");
|
||||
}
|
||||
else
|
||||
{
|
||||
std::string left;
|
||||
getline(i, left);
|
||||
leftover = left;
|
||||
}
|
||||
}
|
||||
|
||||
template<typename T> inline void convert(const Anope::string &s, T &x, bool failIfLeftoverChars = true)
|
||||
{
|
||||
Anope::string Unused;
|
||||
convert(s, x, Unused, failIfLeftoverChars);
|
||||
}
|
||||
|
||||
template<typename T> inline T convertTo(const Anope::string &s, Anope::string &leftover, bool failIfLeftoverChars = true)
|
||||
{
|
||||
T x;
|
||||
convert(s, x, leftover, failIfLeftoverChars);
|
||||
return x;
|
||||
}
|
||||
|
||||
template<typename T> inline T convertTo(const Anope::string &s, bool failIfLeftoverChars = true)
|
||||
{
|
||||
T x;
|
||||
convert(s, x, failIfLeftoverChars);
|
||||
return x;
|
||||
}
|
||||
|
||||
/*************************************************************************/
|
||||
|
||||
class User;
|
||||
class NickCore;
|
||||
class NickAlias;
|
||||
class BotInfo;
|
||||
class ChannelInfo;
|
||||
class Channel;
|
||||
class Server;
|
||||
class Entry;
|
||||
|
||||
#include "threadengine.h"
|
||||
#include "opertype.h"
|
||||
#include "modes.h"
|
||||
|
||||
/*************************************************************************/
|
||||
|
||||
/* Protocol tweaks */
|
||||
|
||||
struct IRCDVar
|
||||
{
|
||||
const char *name; /* Name of the IRCd command */
|
||||
const char *pseudoclient_mode; /* Mode used by BotServ Bots */
|
||||
int svsnick; /* Supports SVSNICK */
|
||||
int vhost; /* Supports vhost */
|
||||
int snline; /* Supports SNline */
|
||||
int sqline; /* Supports SQline */
|
||||
int szline; /* Supports SZline */
|
||||
int join2msg; /* Join 2 Message */
|
||||
int chansqline; /* Supports Channel Sqlines */
|
||||
int quitonkill; /* IRCD sends QUIT when kill */
|
||||
int vident; /* Supports vidents */
|
||||
int svshold; /* Supports svshold */
|
||||
int tsonmode; /* Timestamp on mode changes */
|
||||
int omode; /* On the fly o:lines */
|
||||
int umode; /* change user modes */
|
||||
int knock_needs_i; /* Check if we needed +i when setting NOKNOCK */
|
||||
int svsmode_ucmode; /* Can remove User Channel Modes with SVSMODE */
|
||||
int sglineenforce;
|
||||
int ts6; /* ircd is TS6 */
|
||||
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 */
|
||||
};
|
||||
|
||||
/*************************************************************************/
|
||||
|
||||
/** Memo Flags
|
||||
*/
|
||||
enum MemoFlag
|
||||
{
|
||||
/* Memo is unread */
|
||||
MF_UNREAD,
|
||||
/* Sender requests a receipt */
|
||||
MF_RECEIPT
|
||||
};
|
||||
|
||||
const Anope::string MemoFlagStrings[] = {
|
||||
"MF_UNREAD", "MF_RECEIPT", ""
|
||||
};
|
||||
|
||||
/* 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>
|
||||
{
|
||||
public:
|
||||
Memo();
|
||||
time_t time; /* When it was sent */
|
||||
Anope::string sender;
|
||||
Anope::string text;
|
||||
};
|
||||
|
||||
struct CoreExport MemoInfo
|
||||
{
|
||||
int16 memomax;
|
||||
std::vector<Memo *> memos;
|
||||
std::vector<Anope::string> ignores;
|
||||
|
||||
unsigned GetIndex(Memo *m) const;
|
||||
void Del(unsigned index);
|
||||
void Del(Memo *m);
|
||||
bool HasIgnore(User *u);
|
||||
};
|
||||
|
||||
struct Session
|
||||
{
|
||||
Anope::string host; /* Host of the session */
|
||||
unsigned count; /* Number of clients with this host */
|
||||
unsigned hits; /* Number of subsequent kills for a host */
|
||||
};
|
||||
|
||||
struct Exception
|
||||
{
|
||||
Anope::string mask; /* Hosts to which this exception applies */
|
||||
unsigned limit; /* Session limit for exception */
|
||||
Anope::string who; /* Nick of person who added the exception */
|
||||
Anope::string reason; /* Reason for exception's addition */
|
||||
time_t time; /* When this exception was added */
|
||||
time_t expires; /* Time when it expires. 0 == no expiry */
|
||||
};
|
||||
|
||||
/*************************************************************************/
|
||||
|
||||
class CoreExport HostInfo
|
||||
{
|
||||
private:
|
||||
Anope::string Ident;
|
||||
Anope::string Host;
|
||||
Anope::string Creator;
|
||||
time_t Time;
|
||||
|
||||
public:
|
||||
/** Set a vhost for the user
|
||||
* @param ident The ident
|
||||
* @param host The host
|
||||
* @param creator Who created the vhost
|
||||
* @param time When the vhost was craated
|
||||
*/
|
||||
void SetVhost(const Anope::string &ident, const Anope::string &host, const Anope::string &creator, time_t created = Anope::CurTime);
|
||||
|
||||
/** Remove a users vhost
|
||||
**/
|
||||
void RemoveVhost();
|
||||
|
||||
/** Check if the user has a vhost
|
||||
* @return true or false
|
||||
*/
|
||||
bool HasVhost() const;
|
||||
|
||||
/** Retrieve the vhost ident
|
||||
* @return the ident
|
||||
*/
|
||||
const Anope::string &GetIdent() const;
|
||||
|
||||
/** Retrieve the vhost host
|
||||
* @return the host
|
||||
*/
|
||||
const Anope::string &GetHost() const;
|
||||
|
||||
/** Retrieve the vhost creator
|
||||
* @return the creator
|
||||
*/
|
||||
const Anope::string &GetCreator() const;
|
||||
|
||||
/** Retrieve when the vhost was crated
|
||||
* @return the time it was created
|
||||
*/
|
||||
const time_t GetTime() const;
|
||||
};
|
||||
|
||||
/** Flags for badwords
|
||||
*/
|
||||
enum BadWordType
|
||||
{
|
||||
/* Always kicks if the word is said */
|
||||
BW_ANY,
|
||||
/* User must way the entire word */
|
||||
BW_SINGLE,
|
||||
/* The word has to start with the badword */
|
||||
BW_START,
|
||||
/* The word has to end with the badword */
|
||||
BW_END
|
||||
};
|
||||
|
||||
/* Structure used to contain bad words. */
|
||||
struct BadWord
|
||||
{
|
||||
Anope::string word;
|
||||
BadWordType type;
|
||||
};
|
||||
|
||||
/* BotServ SET flags */
|
||||
enum BotServFlag
|
||||
{
|
||||
BS_BEGIN,
|
||||
/* BotServ won't kick ops */
|
||||
BS_DONTKICKOPS,
|
||||
/* BotServ won't kick voices */
|
||||
BS_DONTKICKVOICES,
|
||||
/* BotServ bot accepts fantasy commands */
|
||||
BS_FANTASY,
|
||||
/* BotServ should show greets */
|
||||
BS_GREET,
|
||||
/* BotServ bots are not allowed to be in this channel */
|
||||
BS_NOBOT,
|
||||
/* BotServ kicks for bolds */
|
||||
BS_KICK_BOLDS,
|
||||
/* BotServ kicks for colors */
|
||||
BS_KICK_COLORS,
|
||||
/* BOtServ kicks for reverses */
|
||||
BS_KICK_REVERSES,
|
||||
/* BotServ kicks for underlines */
|
||||
BS_KICK_UNDERLINES,
|
||||
/* BotServ kicks for badwords */
|
||||
BS_KICK_BADWORDS,
|
||||
/* BotServ kicks for caps */
|
||||
BS_KICK_CAPS,
|
||||
/* BotServ kicks for flood */
|
||||
BS_KICK_FLOOD,
|
||||
/* BotServ kicks for repeating */
|
||||
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", "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
|
||||
{
|
||||
TTB_BOLDS,
|
||||
TTB_COLORS,
|
||||
TTB_REVERSES,
|
||||
TTB_UNDERLINES,
|
||||
TTB_BADWORDS,
|
||||
TTB_CAPS,
|
||||
TTB_FLOOD,
|
||||
TTB_REPEAT,
|
||||
TTB_ITALICS,
|
||||
TTB_AMSGS,
|
||||
TTB_SIZE
|
||||
};
|
||||
|
||||
#include "access.h"
|
||||
#include "regchannel.h"
|
||||
|
||||
/*************************************************************************/
|
||||
|
||||
/* This structure stocks ban data since it must not be removed when
|
||||
* user is kicked.
|
||||
*/
|
||||
|
||||
#include "users.h"
|
||||
#include "account.h"
|
||||
#include "commands.h"
|
||||
#include "bots.h"
|
||||
#include "channels.h"
|
||||
|
||||
/** Channelban type flags
|
||||
*/
|
||||
enum EntryType
|
||||
{
|
||||
ENTRYTYPE_NONE,
|
||||
ENTRYTYPE_CIDR,
|
||||
ENTRYTYPE_NICK_WILD,
|
||||
ENTRYTYPE_NICK,
|
||||
ENTRYTYPE_USER_WILD,
|
||||
ENTRYTYPE_USER,
|
||||
ENTRYTYPE_HOST_WILD,
|
||||
ENTRYTYPE_HOST
|
||||
};
|
||||
|
||||
class CoreExport Entry : public Flags<EntryType>
|
||||
{
|
||||
ChannelModeName modename;
|
||||
|
||||
public:
|
||||
unsigned char cidr_len;
|
||||
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;
|
||||
};
|
||||
|
||||
/*************************************************************************/
|
||||
|
||||
/* Mail data */
|
||||
|
||||
struct MailInfo
|
||||
{
|
||||
FILE *pipe;
|
||||
User *sender;
|
||||
NickCore *recipient;
|
||||
};
|
||||
|
||||
/*************************************************************************/
|
||||
|
||||
/* Defcon */
|
||||
|
||||
/*************************************************************************/
|
||||
#ifndef _WIN32
|
||||
# define DllExport
|
||||
# define CoreExport
|
||||
# define MARK_DEPRECATED __attribute((deprecated))
|
||||
# define anope_close close
|
||||
#else
|
||||
# include "anope_windows.h"
|
||||
#endif
|
||||
|
||||
/**
|
||||
* RFC: defination of a valid nick
|
||||
@@ -746,208 +75,4 @@ struct MailInfo
|
||||
**/
|
||||
#define isvalidnick(c) (isalnum(c) || ((c) >= '\x5B' && (c) <= '\x60') || ((c) >= '\x7B' && (c) <= '\x7D') || (c) == '-')
|
||||
|
||||
/*************************************************************************/
|
||||
|
||||
/*
|
||||
* Forward declaration reqired, because the base IRCDProto class uses some crap from in here.
|
||||
*/
|
||||
class IRCDProto;
|
||||
class IRCdMessage;
|
||||
struct Uplink;
|
||||
class ServerConfig;
|
||||
class ConfigurationFile;
|
||||
class XLine;
|
||||
|
||||
#include "extern.h"
|
||||
#include "language.h"
|
||||
#include "mail.h"
|
||||
#include "servers.h"
|
||||
#include "logger.h"
|
||||
#include "config.h"
|
||||
|
||||
class CoreExport IRCDProto
|
||||
{
|
||||
private:
|
||||
virtual void SendSVSKillInternal(const BotInfo *, const User *, const Anope::string &) = 0;
|
||||
virtual void SendModeInternal(const BotInfo *, const Channel *, const Anope::string &) = 0;
|
||||
virtual void SendModeInternal(const BotInfo *, const User *, const Anope::string &) = 0;
|
||||
virtual void SendKickInternal(const BotInfo *, const Channel *, const User *, const Anope::string &) = 0;
|
||||
virtual void SendNoticeChanopsInternal(const BotInfo *bi, const Channel *, const Anope::string &) = 0;
|
||||
virtual void SendMessageInternal(const BotInfo *bi, const Anope::string &dest, const Anope::string &buf);
|
||||
virtual void SendNoticeInternal(const BotInfo *bi, const Anope::string &dest, const Anope::string &msg);
|
||||
virtual void SendPrivmsgInternal(const BotInfo *bi, const Anope::string &dest, const Anope::string &buf);
|
||||
virtual void SendQuitInternal(const User *u, const Anope::string &buf);
|
||||
virtual void SendPartInternal(const BotInfo *bi, const Channel *chan, const Anope::string &buf);
|
||||
virtual void SendGlobopsInternal(const BotInfo *source, const Anope::string &buf);
|
||||
virtual void SendCTCPInternal(const BotInfo *bi, const Anope::string &dest, const Anope::string &buf);
|
||||
virtual void SendNumericInternal(const Anope::string &source, int numeric, const Anope::string &dest, const Anope::string &buf);
|
||||
public:
|
||||
virtual ~IRCDProto() { }
|
||||
|
||||
virtual void SendSVSNOOP(const Server *, bool) { }
|
||||
virtual void SendTopic(BotInfo *, Channel *) = 0;
|
||||
virtual void SendVhostDel(User *) { }
|
||||
virtual void SendAkill(User *, const XLine *) = 0;
|
||||
virtual void SendAkillDel(const XLine *) = 0;
|
||||
virtual void SendSVSKill(const BotInfo *source, const User *user, const char *fmt, ...);
|
||||
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) = 0;
|
||||
virtual void SendKick(const BotInfo *bi, const Channel *chan, const User *user, const char *fmt, ...);
|
||||
virtual void SendNoticeChanops(const BotInfo *bi, const Channel *dest, const char *fmt, ...);
|
||||
virtual void SendMessage(const BotInfo *bi, const Anope::string &dest, const char *fmt, ...);
|
||||
virtual void SendNotice(const BotInfo *bi, const Anope::string &dest, const char *fmt, ...);
|
||||
virtual void SendAction(const BotInfo *bi, const Anope::string &dest, const char *fmt, ...);
|
||||
virtual void SendPrivmsg(const BotInfo *bi, const Anope::string &dest, const char *fmt, ...);
|
||||
virtual void SendGlobalNotice(const BotInfo *bi, const Server *dest, const Anope::string &msg);
|
||||
virtual void SendGlobalPrivmsg(const BotInfo *bi, const Server *desc, const Anope::string &msg);
|
||||
|
||||
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(User *, Channel *, const ChannelStatus *) = 0;
|
||||
virtual void SendSQLineDel(const XLine *x) { }
|
||||
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 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);
|
||||
virtual void SendForceNickChange(const User *u, const Anope::string &newnick, time_t when);
|
||||
virtual void SendVhost(User *, const Anope::string &, const Anope::string &) { }
|
||||
virtual void SendConnect() = 0;
|
||||
virtual void SendSVSHold(const Anope::string &) { }
|
||||
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 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 SendSWhois(const Anope::string &, const Anope::string &, const Anope::string &) { }
|
||||
virtual void SendBOB() { }
|
||||
virtual void SendEOB() { }
|
||||
virtual void SendServer(const Server *) = 0;
|
||||
virtual bool IsNickValid(const Anope::string &) { return true; }
|
||||
virtual bool IsChannelValid(const Anope::string &);
|
||||
virtual void SendNumeric(const Anope::string &source, int numeric, const Anope::string &dest, const char *fmt, ...);
|
||||
|
||||
/** Sends a message logging a user into an account, where ircds support such a feature.
|
||||
* @param u The user logging in
|
||||
* @param account The account the user is logging into
|
||||
*/
|
||||
virtual void SendAccountLogin(const User *u, const NickCore *account) { }
|
||||
|
||||
/** Sends a message logging a user out of an account, where ircds support such a feature.
|
||||
* @param u The user logging out
|
||||
* @param account The account the user is logging out of
|
||||
*/
|
||||
virtual void SendAccountLogout(const User *u, const NickCore *account) { }
|
||||
|
||||
/** Set a users auto identification token
|
||||
* @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> &);
|
||||
};
|
||||
|
||||
/*************************************************************************/
|
||||
|
||||
struct Uplink
|
||||
{
|
||||
Anope::string host;
|
||||
unsigned port;
|
||||
Anope::string password;
|
||||
bool ipv6;
|
||||
|
||||
Uplink(const Anope::string &_host, int _port, const Anope::string &_password, bool _ipv6) : host(_host), port(_port), password(_password), ipv6(_ipv6) { }
|
||||
bool operator==(const Uplink &other) const
|
||||
{
|
||||
if (this->host != other.host)
|
||||
return false;
|
||||
if (this->port != other.port)
|
||||
return false;
|
||||
if (this->password != other.password)
|
||||
return false;
|
||||
if (this->ipv6 != other.ipv6)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
inline bool operator!=(const Uplink &other) const { return !(*this == other); }
|
||||
};
|
||||
|
||||
/** A class to process numbered lists (passed to most DEL/LIST/VIEW commands).
|
||||
* The function HandleNumber is called for every number in the list. Note that
|
||||
* if descending is true it gets called in descending order. This is so deleting
|
||||
* the index passed to the function from an array will not cause the other indexes
|
||||
* passed to the function to be incorrect. This keeps us from having to have an
|
||||
* 'in use' flag on everything.
|
||||
*/
|
||||
class CoreExport NumberList
|
||||
{
|
||||
private:
|
||||
bool is_valid;
|
||||
|
||||
std::set<unsigned> numbers;
|
||||
|
||||
bool desc;
|
||||
public:
|
||||
/** Processes a numbered list
|
||||
* @param list The list
|
||||
* @param descending True to make HandleNumber get called with numbers in descending order
|
||||
*/
|
||||
NumberList(const Anope::string &list, bool descending);
|
||||
|
||||
/** Destructor, does nothing
|
||||
*/
|
||||
virtual ~NumberList();
|
||||
|
||||
/** Should be called after the constructors are done running. This calls the callbacks.
|
||||
*/
|
||||
void Process();
|
||||
|
||||
/** Called with a number from the list
|
||||
* @param Number The number
|
||||
*/
|
||||
virtual void HandleNumber(unsigned Number);
|
||||
|
||||
/** Called when there is an error with the numbered list
|
||||
* Return false to immediatly stop processing the list and return
|
||||
* This is all done before we start calling HandleNumber, so no numbers will have been processed yet
|
||||
* @param list The list
|
||||
* @return false to stop processing
|
||||
*/
|
||||
virtual bool InvalidRange(const Anope::string &list);
|
||||
};
|
||||
|
||||
#endif /* SERVICES_H */
|
||||
#endif // SERVICES_H
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
*
|
||||
* (C) 2003-2012 Anope Team
|
||||
* Contact us at team@anope.org
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
*
|
||||
* Based on the original code of Epona by Lara.
|
||||
* Based on the original code of Services by Andy Church.
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef SIGNAL_H
|
||||
#define SIGNAL_H
|
||||
|
||||
#include <signal.h>
|
||||
|
||||
#include "sockets.h"
|
||||
|
||||
/** Represents a signal handler
|
||||
*/
|
||||
class Signal : public Pipe
|
||||
{
|
||||
static std::vector<Signal *> SignalHandlers;
|
||||
static void SignalHandler(int signal);
|
||||
|
||||
struct sigaction action, old;
|
||||
public:
|
||||
int signal;
|
||||
|
||||
/** Constructor
|
||||
* @param s The signal to listen for
|
||||
*/
|
||||
Signal(int s);
|
||||
~Signal();
|
||||
|
||||
/**
|
||||
* Called when the signal is received.
|
||||
* Note this is not *immediatly* called when the signal is received,
|
||||
* but it is saved and called at a later time when we are not doing something
|
||||
* important. This is always called on the main thread, even on systems that
|
||||
* spawn threads for signals, like Windows.
|
||||
*/
|
||||
virtual void OnNotify() anope_override = 0;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
*
|
||||
* (C) 2003-2011 Anope Team
|
||||
* (C) 2003-2012 Anope Team
|
||||
* Contact us at team@anope.org
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
@@ -12,6 +12,8 @@
|
||||
#ifndef SOCKETENGINE_H
|
||||
#define SOCKETENGINE_H
|
||||
|
||||
#include "services.h"
|
||||
|
||||
class CoreExport SocketEngine
|
||||
{
|
||||
public:
|
||||
|
||||
+128
-84
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
*
|
||||
* (C) 2003-2011 Anope Team
|
||||
* (C) 2003-2012 Anope Team
|
||||
* Contact us at team@anope.org
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
@@ -12,16 +12,16 @@
|
||||
#ifndef SOCKETS_H
|
||||
#define SOCKETS_H
|
||||
|
||||
#ifndef _WIN32
|
||||
#include <netinet/in.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
|
||||
#include "anope.h"
|
||||
|
||||
#define NET_BUFSIZE 65535
|
||||
|
||||
#ifdef _WIN32
|
||||
# define CloseSocket closesocket
|
||||
#else
|
||||
# define CloseSocket close
|
||||
#endif
|
||||
|
||||
/** A sockaddr union used to combine IPv4 and IPv6 sockaddrs
|
||||
*/
|
||||
union CoreExport sockaddrs
|
||||
@@ -32,7 +32,7 @@ union CoreExport sockaddrs
|
||||
|
||||
/** Construct the object, sets everything to 0
|
||||
*/
|
||||
sockaddrs();
|
||||
sockaddrs(const Anope::string &address = "");
|
||||
|
||||
/** Memset the object to 0
|
||||
*/
|
||||
@@ -106,27 +106,18 @@ class SocketException : public CoreException
|
||||
virtual ~SocketException() throw() { }
|
||||
};
|
||||
|
||||
enum SocketType
|
||||
{
|
||||
SOCKTYPE_BASE,
|
||||
SOCKTYPE_BUFFERED,
|
||||
SOCKTYPE_CONNECTION,
|
||||
SOCKTYPE_CLIENT,
|
||||
SOCKTYPE_LISTEN
|
||||
};
|
||||
|
||||
enum SocketFlag
|
||||
{
|
||||
SF_DEAD,
|
||||
SF_WRITABLE
|
||||
SF_WRITABLE,
|
||||
SF_CONNECTING,
|
||||
SF_CONNECTED,
|
||||
SF_ACCEPTING,
|
||||
SF_ACCEPTED
|
||||
};
|
||||
|
||||
static const Anope::string SocketFlagStrings[] = { "SF_DEAD", "SF_WRITABLE", "" };
|
||||
static const Anope::string SocketFlagStrings[] = { "SF_DEAD", "SF_WRITABLE", "SF_CONNECTING", "SF_CONNECTED", "SF_ACCEPTING", "SF_ACCEPTED", "" };
|
||||
|
||||
class Socket;
|
||||
class ClientSocket;
|
||||
class ListenSocket;
|
||||
class ConnectionSocket;
|
||||
|
||||
class CoreExport SocketIO
|
||||
{
|
||||
@@ -140,11 +131,12 @@ class CoreExport SocketIO
|
||||
virtual int Recv(Socket *s, char *buf, size_t sz);
|
||||
|
||||
/** Write something to the socket
|
||||
* @param s The socket
|
||||
* @param buf What to write
|
||||
* @return Number of bytes written
|
||||
* @param s The socket
|
||||
* @param buf The data to write
|
||||
* @param size The length of the data
|
||||
*/
|
||||
virtual int Send(Socket *s, const Anope::string &buf);
|
||||
virtual int Send(Socket *s, const char *buf, size_t sz);
|
||||
int Send(Socket *s, const Anope::string &buf);
|
||||
|
||||
/** Accept a connection from a socket
|
||||
* @param s The socket
|
||||
@@ -152,11 +144,11 @@ class CoreExport SocketIO
|
||||
*/
|
||||
virtual ClientSocket *Accept(ListenSocket *s);
|
||||
|
||||
/** Check if a connection has been accepted
|
||||
* @param s The client socket
|
||||
* @return -1 on error, 0 to wait, 1 on success
|
||||
/** Finished accepting a connection from a socket
|
||||
* @param s The socket
|
||||
* @return SF_ACCEPTED if accepted, SF_ACCEPTING if still in process, SF_DEAD on error
|
||||
*/
|
||||
virtual int Accepted(ClientSocket *cs);
|
||||
virtual SocketFlag FinishAccept(ClientSocket *cs);
|
||||
|
||||
/** Bind a socket
|
||||
* @param s The socket
|
||||
@@ -172,18 +164,18 @@ class CoreExport SocketIO
|
||||
*/
|
||||
virtual void Connect(ConnectionSocket *s, const Anope::string &target, int port);
|
||||
|
||||
/** Check if this socket is connected
|
||||
/** Called to potentially finish a pending connection
|
||||
* @param s The socket
|
||||
* @return -1 for error, 0 for wait, 1 for connected
|
||||
* @return SF_CONNECTED on success, SF_CONNECTING if still pending, and SF_DEAD on error.
|
||||
*/
|
||||
virtual int Connected(ConnectionSocket *s);
|
||||
virtual SocketFlag FinishConnect(ConnectionSocket *s);
|
||||
|
||||
/** Called when the socket is destructing
|
||||
*/
|
||||
virtual void Destroy() { }
|
||||
};
|
||||
|
||||
class CoreExport Socket : public Flags<SocketFlag, 2>
|
||||
class CoreExport Socket : public Flags<SocketFlag>
|
||||
{
|
||||
protected:
|
||||
/* Socket FD */
|
||||
@@ -198,19 +190,16 @@ class CoreExport Socket : public Flags<SocketFlag, 2>
|
||||
/* I/O functions used for this socket */
|
||||
SocketIO *IO;
|
||||
|
||||
/* Type this socket is */
|
||||
SocketType Type;
|
||||
|
||||
/** Empty constructor, used for things such as the pipe socket
|
||||
/** Empty constructor, should not be called.
|
||||
*/
|
||||
Socket();
|
||||
|
||||
/** Default constructor
|
||||
* @param sock The socket to use, 0 if we need to create our own
|
||||
* @param sock The socket to use, -1 if we need to create our own
|
||||
* @param ipv6 true if using ipv6
|
||||
* @param type The socket type, defaults to SOCK_STREAM
|
||||
*/
|
||||
Socket(int sock, bool ipv6, int type = SOCK_STREAM);
|
||||
Socket(int sock, bool ipv6 = false, int type = SOCK_STREAM);
|
||||
|
||||
/** Default destructor
|
||||
*/
|
||||
@@ -242,6 +231,11 @@ class CoreExport Socket : public Flags<SocketFlag, 2>
|
||||
*/
|
||||
void Bind(const Anope::string &ip, int port = 0);
|
||||
|
||||
/** Called when there either is a read or write event.
|
||||
* @return true to continue to call ProcessRead/ProcessWrite, false to not continue
|
||||
*/
|
||||
virtual bool Process();
|
||||
|
||||
/** Called when there is something to be received for this socket
|
||||
* @return true on success, false to drop this socket
|
||||
*/
|
||||
@@ -258,7 +252,7 @@ class CoreExport Socket : public Flags<SocketFlag, 2>
|
||||
virtual void ProcessError();
|
||||
};
|
||||
|
||||
class CoreExport BufferedSocket : public Socket
|
||||
class CoreExport BufferedSocket : public virtual Socket
|
||||
{
|
||||
protected:
|
||||
/* Things to be written to the socket */
|
||||
@@ -269,17 +263,10 @@ class CoreExport BufferedSocket : public Socket
|
||||
int RecvLen;
|
||||
|
||||
public:
|
||||
/** Blank constructor
|
||||
/** Constructor
|
||||
*/
|
||||
BufferedSocket();
|
||||
|
||||
/** Constructor
|
||||
* @param fd FD to use
|
||||
* @param ipv6 true for ipv6
|
||||
* @param type socket type, defaults to SOCK_STREAM
|
||||
*/
|
||||
BufferedSocket(int fd, bool ipv6, int type = SOCK_STREAM);
|
||||
|
||||
/** Default destructor
|
||||
*/
|
||||
virtual ~BufferedSocket();
|
||||
@@ -287,12 +274,12 @@ class CoreExport BufferedSocket : public Socket
|
||||
/** Called when there is something to be received for this socket
|
||||
* @return true on success, false to drop this socket
|
||||
*/
|
||||
bool ProcessRead();
|
||||
bool ProcessRead() anope_override;
|
||||
|
||||
/** Called when the socket is ready to be written to
|
||||
* @return true on success, false to drop this socket
|
||||
*/
|
||||
bool ProcessWrite();
|
||||
bool ProcessWrite() anope_override;
|
||||
|
||||
/** Called with a line received from the socket
|
||||
* @param buf The line
|
||||
@@ -303,6 +290,9 @@ class CoreExport BufferedSocket : public Socket
|
||||
/** Write to the socket
|
||||
* @param message The message
|
||||
*/
|
||||
protected:
|
||||
virtual void Write(const char *buffer, size_t l);
|
||||
public:
|
||||
void Write(const char *message, ...);
|
||||
void Write(const Anope::string &message);
|
||||
|
||||
@@ -317,6 +307,56 @@ class CoreExport BufferedSocket : public Socket
|
||||
int WriteBufferLen() const;
|
||||
};
|
||||
|
||||
class CoreExport BinarySocket : public virtual Socket
|
||||
{
|
||||
protected:
|
||||
struct DataBlock
|
||||
{
|
||||
char *orig;
|
||||
char *buf;
|
||||
size_t len;
|
||||
|
||||
DataBlock(const char *b, size_t l);
|
||||
~DataBlock();
|
||||
};
|
||||
|
||||
std::deque<DataBlock *> WriteBuffer;
|
||||
|
||||
public:
|
||||
/** Constructor
|
||||
*/
|
||||
BinarySocket();
|
||||
|
||||
/** Default destructor
|
||||
*/
|
||||
virtual ~BinarySocket();
|
||||
|
||||
/** Called when there is something to be received for this socket
|
||||
* @return true on success, false to drop this socket
|
||||
*/
|
||||
bool ProcessRead() anope_override;
|
||||
|
||||
/** Called when the socket is ready to be written to
|
||||
* @return true on success, false to drop this socket
|
||||
*/
|
||||
bool ProcessWrite() anope_override;
|
||||
|
||||
/** Write data to the socket
|
||||
* @param buffer The data to write
|
||||
* @param l The length of the data
|
||||
*/
|
||||
virtual void Write(const char *buffer, size_t l);
|
||||
void Write(const char *message, ...);
|
||||
void Write(const Anope::string &message);
|
||||
|
||||
/** Called with data from the socket
|
||||
* @param buffer The data
|
||||
* @param l The length of buffer
|
||||
* @return true to continue reading, false to drop the socket
|
||||
*/
|
||||
virtual bool Read(const char *buffer, size_t l);
|
||||
};
|
||||
|
||||
class CoreExport ListenSocket : public Socket
|
||||
{
|
||||
public:
|
||||
@@ -341,22 +381,18 @@ class CoreExport ListenSocket : public Socket
|
||||
* @param addr The sockaddr for where the connection came from
|
||||
* @return The new socket
|
||||
*/
|
||||
virtual ClientSocket *OnAccept(int fd, const sockaddrs &addr);
|
||||
virtual ClientSocket *OnAccept(int fd, const sockaddrs &addr) = 0;
|
||||
};
|
||||
|
||||
class CoreExport ConnectionSocket : public BufferedSocket
|
||||
class CoreExport ConnectionSocket : public virtual Socket
|
||||
{
|
||||
public:
|
||||
/* Sockaddrs for connection ip/port */
|
||||
sockaddrs conaddr;
|
||||
/* True if connected */
|
||||
bool connected;
|
||||
|
||||
/** Constructor
|
||||
* @param ipv6 true to use IPv6
|
||||
* @param type The socket type, defaults to SOCK_STREAM
|
||||
*/
|
||||
ConnectionSocket(bool ipv6 = false, int type = SOCK_STREAM);
|
||||
ConnectionSocket();
|
||||
|
||||
/** Connect the socket
|
||||
* @param TargetHost The target host to connect to
|
||||
@@ -364,20 +400,16 @@ class CoreExport ConnectionSocket : public BufferedSocket
|
||||
*/
|
||||
void Connect(const Anope::string &TargetHost, int Port);
|
||||
|
||||
/** Called when there is something to be received for this socket
|
||||
* @return true on success, false to drop this socket
|
||||
/** Called when there either is a read or write event.
|
||||
* Used to determine whether or not this socket is connected yet.
|
||||
* @return true to continue to call ProcessRead/ProcessWrite, false to not continue
|
||||
*/
|
||||
bool ProcessRead();
|
||||
|
||||
/** Called when the socket is ready to be written to
|
||||
* @return true on success, false to drop this socket
|
||||
*/
|
||||
bool ProcessWrite();
|
||||
bool Process() anope_override;
|
||||
|
||||
/** Called when there is an error for this socket
|
||||
* @return true on success, false to drop this socket
|
||||
*/
|
||||
void ProcessError();
|
||||
void ProcessError() anope_override;
|
||||
|
||||
/** Called on a successful connect
|
||||
*/
|
||||
@@ -389,7 +421,7 @@ class CoreExport ConnectionSocket : public BufferedSocket
|
||||
virtual void OnError(const Anope::string &error);
|
||||
};
|
||||
|
||||
class CoreExport ClientSocket : public BufferedSocket
|
||||
class CoreExport ClientSocket : public virtual Socket
|
||||
{
|
||||
public:
|
||||
/* Listen socket this connection came from */
|
||||
@@ -399,23 +431,31 @@ class CoreExport ClientSocket : public BufferedSocket
|
||||
|
||||
/** Constructor
|
||||
* @param ls Listen socket this connection is from
|
||||
* @param fd New FD for this socket
|
||||
* @param addr Address the connection came from
|
||||
*/
|
||||
ClientSocket(ListenSocket *ls, int fd, const sockaddrs &addr);
|
||||
ClientSocket(ListenSocket *ls, const sockaddrs &addr);
|
||||
|
||||
/** Called when there is something to be received for this socket
|
||||
/** Called when there either is a read or write event.
|
||||
* Used to determine whether or not this socket is connected yet.
|
||||
* @return true to continue to call ProcessRead/ProcessWrite, false to not continue
|
||||
*/
|
||||
bool Process() anope_override;
|
||||
|
||||
/** Called when there is an error for this socket
|
||||
* @return true on success, false to drop this socket
|
||||
*/
|
||||
bool ProcessRead();
|
||||
void ProcessError() anope_override;
|
||||
|
||||
/** Called when the socket is ready to be written to
|
||||
* @return true on success, false to drop this socket
|
||||
/** Called when a client has been accepted() successfully.
|
||||
*/
|
||||
bool ProcessWrite();
|
||||
virtual void OnAccept();
|
||||
|
||||
/** Called when there was an error accepting the client
|
||||
*/
|
||||
virtual void OnError(const Anope::string &error);
|
||||
};
|
||||
|
||||
class CoreExport Pipe : public BufferedSocket
|
||||
class CoreExport Pipe : public Socket
|
||||
{
|
||||
public:
|
||||
/** The FD of the write pipe (if this isn't evenfd)
|
||||
@@ -427,21 +467,25 @@ class CoreExport Pipe : public BufferedSocket
|
||||
*/
|
||||
Pipe();
|
||||
|
||||
/** Destructor
|
||||
*/
|
||||
~Pipe();
|
||||
|
||||
/** Called when data is to be read
|
||||
*/
|
||||
bool ProcessRead();
|
||||
|
||||
/** Function that calls OnNotify
|
||||
*/
|
||||
bool Read(const Anope::string &);
|
||||
bool ProcessRead() anope_override;
|
||||
|
||||
/** Called when this pipe needs to be woken up
|
||||
*/
|
||||
void Notify();
|
||||
|
||||
/** Should be overloaded to do something useful
|
||||
/** Overload to do something useful
|
||||
*/
|
||||
virtual void OnNotify();
|
||||
virtual void OnNotify() = 0;
|
||||
};
|
||||
|
||||
extern CoreExport uint32_t TotalRead;
|
||||
extern CoreExport uint32_t TotalWritten;
|
||||
extern CoreExport SocketIO normalSocketIO;
|
||||
|
||||
#endif // SOCKET_H
|
||||
|
||||
+9
-77
@@ -4,7 +4,7 @@
|
||||
#cmakedefine DEBUG_BUILD
|
||||
|
||||
#cmakedefine DEFUMASK @DEFUMASK@
|
||||
#cmakedefine HAVE_SYS_TYPES_H 1
|
||||
#cmakedefine HAVE_CSTDINT 1
|
||||
#cmakedefine HAVE_STDINT_H 1
|
||||
#cmakedefine HAVE_STDDEF_H 1
|
||||
#cmakedefine HAVE_SETGRENT 1
|
||||
@@ -18,87 +18,19 @@
|
||||
#cmakedefine GETTEXT_FOUND 1
|
||||
#cmakedefine RUNGROUP "@RUNGROUP@"
|
||||
|
||||
#cmakedefine HAVE_UINT8_T 1
|
||||
#cmakedefine HAVE_U_INT8_T 1
|
||||
#cmakedefine HAVE_INT16_T 1
|
||||
#cmakedefine HAVE_UINT16_T 1
|
||||
#cmakedefine HAVE_U_INT16_T 1
|
||||
#cmakedefine HAVE_INT32_T 1
|
||||
#cmakedefine HAVE_UINT32_T 1
|
||||
#cmakedefine HAVE_U_INT32_T 1
|
||||
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
# include <sys/types.h>
|
||||
#endif
|
||||
#ifdef HAVE_STDINT_H
|
||||
# include <stdint.h>
|
||||
#ifdef HAVE_CSTDINT
|
||||
# include <cstdint>
|
||||
#else
|
||||
# ifdef HAVE_STDINT_H
|
||||
# include <stdint.h>
|
||||
# else
|
||||
# include "pstdint.h"
|
||||
# endif
|
||||
#endif
|
||||
#ifdef HAVE_STDDEF_H
|
||||
# include <stddef.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_UINT8_T
|
||||
typedef uint8_t uint8;
|
||||
#else
|
||||
# ifdef HAVE_U_INT8_T
|
||||
typedef u_int8_t uint8;
|
||||
# else
|
||||
# ifdef _WIN32
|
||||
typedef unsigned __int8 uint8;
|
||||
# else
|
||||
typedef unsigned short uint8;
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_INT16_T
|
||||
typedef int16_t int16;
|
||||
#else
|
||||
# ifdef _WIN32
|
||||
typedef signed __int16 int16;
|
||||
# else
|
||||
typedef int int16;
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_UINT16_T
|
||||
typedef uint16_t uint16;
|
||||
#else
|
||||
# ifdef HAVE_U_INT16_T
|
||||
typedef u_int16_t uint16;
|
||||
# else
|
||||
# ifdef _WIN32
|
||||
typedef unsigned __int16 uint16;
|
||||
# else
|
||||
typedef unsigned int uint16;
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_INT32_T
|
||||
typedef int32_t int32;
|
||||
#else
|
||||
# ifdef _WIN32
|
||||
typedef signed __int32 int32;
|
||||
# else
|
||||
typedef long int32;
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_UINT32_T
|
||||
typedef uint32_t uint32;
|
||||
#else
|
||||
# ifdef HAVE_U_INT32_T
|
||||
typedef u_int32_t uint32;
|
||||
# else
|
||||
# ifdef _WIN32
|
||||
typedef unsigned __int32 uint32;
|
||||
# else
|
||||
typedef unsigned long uint32;
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef _WIN32
|
||||
# define popen _popen
|
||||
# define pclose _pclose
|
||||
|
||||
+16
-45
@@ -1,47 +1,10 @@
|
||||
#ifndef THREADENGINE_H
|
||||
#define THREADENGINE_H
|
||||
|
||||
#ifdef _WIN32
|
||||
typedef HANDLE ThreadHandle;
|
||||
typedef CRITICAL_SECTION MutexHandle;
|
||||
typedef HANDLE CondHandle;
|
||||
#else
|
||||
# include <pthread.h>
|
||||
typedef pthread_t ThreadHandle;
|
||||
typedef pthread_mutex_t MutexHandle;
|
||||
typedef pthread_cond_t CondHandle;
|
||||
#endif
|
||||
#include "sockets.h"
|
||||
#include "extensible.h"
|
||||
|
||||
class ThreadEngine;
|
||||
class Thread;
|
||||
|
||||
extern CoreExport ThreadEngine threadEngine;
|
||||
|
||||
class CoreExport ThreadEngine
|
||||
{
|
||||
public:
|
||||
/* Vector of threads */
|
||||
std::vector<Thread *> threads;
|
||||
|
||||
/** Threadengines constructor
|
||||
*/
|
||||
ThreadEngine();
|
||||
|
||||
/** Threadengines destructor
|
||||
*/
|
||||
~ThreadEngine();
|
||||
|
||||
/** Start a new thread
|
||||
* @param thread A pointer to a newley allocated thread
|
||||
*/
|
||||
void Start(Thread *thread);
|
||||
|
||||
/** Check for finished threads
|
||||
*/
|
||||
void Process();
|
||||
};
|
||||
|
||||
class CoreExport Thread : public Extensible
|
||||
class CoreExport Thread : public Pipe, public Extensible
|
||||
{
|
||||
private:
|
||||
/* Set to true to tell the thread to finish and we are waiting for it */
|
||||
@@ -49,7 +12,7 @@ class CoreExport Thread : public Extensible
|
||||
|
||||
public:
|
||||
/* Handle for this thread */
|
||||
ThreadHandle Handle;
|
||||
pthread_t Handle;
|
||||
|
||||
/** Threads constructor
|
||||
*/
|
||||
@@ -71,21 +34,29 @@ class CoreExport Thread : public Extensible
|
||||
*/
|
||||
void Exit();
|
||||
|
||||
/** Launch the thread
|
||||
*/
|
||||
void Start();
|
||||
|
||||
/** Returns the exit state of the thread
|
||||
* @return true if we want to exit
|
||||
*/
|
||||
bool GetExitState() const;
|
||||
|
||||
/** Called to run the thread, should be overloaded
|
||||
/** Called when this thread should be joined to
|
||||
*/
|
||||
virtual void Run();
|
||||
void OnNotify();
|
||||
|
||||
/** Called when the thread is run.
|
||||
*/
|
||||
virtual void Run() = 0;
|
||||
};
|
||||
|
||||
class CoreExport Mutex
|
||||
{
|
||||
protected:
|
||||
/* A mutex, used to keep threads in sync */
|
||||
MutexHandle mutex;
|
||||
pthread_mutex_t mutex;
|
||||
|
||||
public:
|
||||
/** Constructor
|
||||
@@ -115,7 +86,7 @@ class CoreExport Condition : public Mutex
|
||||
{
|
||||
private:
|
||||
/* A condition */
|
||||
CondHandle cond;
|
||||
pthread_cond_t cond;
|
||||
|
||||
public:
|
||||
/** Constructor
|
||||
|
||||
+4
-8
@@ -1,6 +1,6 @@
|
||||
/* Timer include stuff.
|
||||
*
|
||||
* (C) 2003-2011 Anope Team
|
||||
* (C) 2003-2012 Anope Team
|
||||
* Contact us at team@anope.org
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
@@ -11,13 +11,9 @@
|
||||
#ifndef TIMERS_H
|
||||
#define TIMERS_H
|
||||
|
||||
#include "services.h"
|
||||
#include <time.h>
|
||||
#include <algorithm>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "anope.h"
|
||||
|
||||
class CoreExport Timer : public Extensible
|
||||
class CoreExport Timer
|
||||
{
|
||||
private:
|
||||
/** The time this was created
|
||||
@@ -88,7 +84,7 @@ class CoreExport Timer : public Extensible
|
||||
* This will ensure timers are not missed, as well as removing timers that have
|
||||
* expired and allowing the addition of new ones.
|
||||
*/
|
||||
class CoreExport TimerManager : public Extensible
|
||||
class CoreExport TimerManager
|
||||
{
|
||||
/** A list of timers
|
||||
*/
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
/*
|
||||
*
|
||||
* (C) 2003-2012 Anope Team
|
||||
* Contact us at team@anope.org
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
*
|
||||
* Based on the original code of Epona by Lara.
|
||||
* Based on the original code of Services by Andy Church.
|
||||
*/
|
||||
|
||||
#ifndef UPLINK_H
|
||||
#define UPLINK_H
|
||||
|
||||
#include "sockets.h"
|
||||
|
||||
class UplinkSocket : public ConnectionSocket, public BufferedSocket
|
||||
{
|
||||
public:
|
||||
UplinkSocket();
|
||||
~UplinkSocket();
|
||||
bool Read(const Anope::string &);
|
||||
void OnConnect();
|
||||
void OnError(const Anope::string &);
|
||||
|
||||
class CoreExport Message
|
||||
{
|
||||
private:
|
||||
const Server *server;
|
||||
const User *user;
|
||||
std::stringstream buffer;
|
||||
|
||||
public:
|
||||
Message();
|
||||
explicit Message(const Server *);
|
||||
explicit Message(const User *);
|
||||
~Message();
|
||||
template<typename T> Message &operator<<(const T &val)
|
||||
{
|
||||
this->buffer << val;
|
||||
return *this;
|
||||
}
|
||||
};
|
||||
};
|
||||
extern CoreExport UplinkSocket *UplinkSock;
|
||||
|
||||
#endif // UPLINK_H
|
||||
|
||||
+38
-15
@@ -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-2012 Anope Team <team@anope.org>
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
*/
|
||||
@@ -8,6 +8,13 @@
|
||||
#ifndef USERS_H
|
||||
#define USERS_H
|
||||
|
||||
#include "anope.h"
|
||||
#include "modes.h"
|
||||
#include "extensible.h"
|
||||
#include "serialize.h"
|
||||
#include "commands.h"
|
||||
#include "account.h"
|
||||
|
||||
extern CoreExport Anope::insensitive_map<User *> UserListByNick;
|
||||
extern CoreExport Anope::map<User *> UserListByUID;
|
||||
|
||||
@@ -30,8 +37,9 @@ struct ChannelContainer
|
||||
|
||||
typedef std::list<ChannelContainer *> UChannelList;
|
||||
|
||||
|
||||
/* Online user and channel data. */
|
||||
class CoreExport User : public Extensible
|
||||
class CoreExport User : public virtual Base, public Extensible, public CommandReply
|
||||
{
|
||||
protected:
|
||||
Anope::string vident;
|
||||
@@ -40,7 +48,7 @@ class CoreExport User : public Extensible
|
||||
bool OnAccess; /* If the user is on the access list of the nick theyre on */
|
||||
Flags<UserModeName, UMODE_END * 2> modes; /* Bitset of mode names the user has set on them */
|
||||
std::map<UserModeName, Anope::string> Params; /* Map of user modes and the params this user has */
|
||||
NickCore *nc; /* NickCore account the user is currently loggged in as */
|
||||
serialize_obj<NickCore> nc; /* NickCore account the user is currently loggged in as */
|
||||
|
||||
public: // XXX: exposing a tiny bit too much
|
||||
Anope::string nick; /* User's current nick */
|
||||
@@ -50,7 +58,7 @@ class CoreExport User : public Extensible
|
||||
Anope::string chost; /* User's cloaked hostname */
|
||||
Anope::string realname; /* Realname */
|
||||
Anope::string fingerprint; /* SSL Fingerprint */
|
||||
sockaddrs ip; /* User's IP */
|
||||
Anope::string ip; /* User's IP */
|
||||
Server *server; /* Server user is connected to */
|
||||
time_t timestamp; /* Timestamp of the nick */
|
||||
time_t my_signon; /* When did _we_ see the user? */
|
||||
@@ -154,8 +162,8 @@ class CoreExport User : public Extensible
|
||||
* @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);
|
||||
void SendMessage(const BotInfo *source, const char *fmt, ...);
|
||||
void SendMessage(const BotInfo *source, const Anope::string &msg) anope_override;
|
||||
|
||||
/** Collide a nick
|
||||
* See the comment in users.cpp
|
||||
@@ -182,19 +190,19 @@ class CoreExport User : public Extensible
|
||||
/** Get the account the user is logged in using
|
||||
* @return The account or NULL
|
||||
*/
|
||||
virtual NickCore *Account();
|
||||
virtual 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);
|
||||
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 = true);
|
||||
bool IsRecognized(bool CheckSecure = true) const;
|
||||
|
||||
/** Check if the user is a services oper
|
||||
* @return true if they are an oper
|
||||
@@ -239,32 +247,32 @@ class CoreExport User : public Extensible
|
||||
* @param um The user mode
|
||||
* @param Param Optional param for the mode
|
||||
*/
|
||||
void SetMode(BotInfo *bi, UserMode *um, const Anope::string &Param = "");
|
||||
void SetMode(const BotInfo *bi, UserMode *um, const Anope::string &Param = "");
|
||||
|
||||
/** Set a mode on the user
|
||||
* @param bi The client setting the mode
|
||||
* @param Name The mode name
|
||||
* @param Param Optional param for the mode
|
||||
*/
|
||||
void SetMode(BotInfo *bi, UserModeName Name, const Anope::string &Param = "");
|
||||
void SetMode(const BotInfo *bi, UserModeName Name, const Anope::string &Param = "");
|
||||
|
||||
/** Remove a mode on the user
|
||||
* @param bi The client setting the mode
|
||||
* @param um The user mode
|
||||
*/
|
||||
void RemoveMode(BotInfo *bi, UserMode *um);
|
||||
void RemoveMode(const BotInfo *bi, UserMode *um);
|
||||
|
||||
/** Remove a mode from the user
|
||||
* @param bi The client setting the mode
|
||||
* @param Name The mode name
|
||||
*/
|
||||
void RemoveMode(BotInfo *bi, UserModeName Name);
|
||||
void RemoveMode(const BotInfo *bi, UserModeName Name);
|
||||
|
||||
/** Set a string of modes on a user
|
||||
* @param bi The client setting the modes
|
||||
* @param umodes The modes
|
||||
*/
|
||||
void SetModes(BotInfo *bi, const char *umodes, ...);
|
||||
void SetModes(const BotInfo *bi, const char *umodes, ...);
|
||||
|
||||
/** Set a string of modes on a user internally
|
||||
* @param umodes The modes
|
||||
@@ -282,7 +290,7 @@ class CoreExport User : public Extensible
|
||||
* @param c The channel
|
||||
* @return The channel container, or NULL
|
||||
*/
|
||||
ChannelContainer *FindChannel(const Channel *c);
|
||||
ChannelContainer *FindChannel(const Channel *c) const;
|
||||
|
||||
/** Check if the user is protected from kicks and negative mode changes
|
||||
* @return true or false
|
||||
@@ -296,4 +304,19 @@ class CoreExport User : public Extensible
|
||||
void Kill(const Anope::string &source, const Anope::string &reason);
|
||||
};
|
||||
|
||||
extern CoreExport int32_t opcnt;
|
||||
extern CoreExport uint32_t maxusercnt, usercnt;
|
||||
extern CoreExport time_t maxusertime;
|
||||
|
||||
extern CoreExport User *finduser(const Anope::string &nick);
|
||||
|
||||
extern CoreExport 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);
|
||||
|
||||
extern CoreExport void do_umode(const Anope::string &user, const Anope::string &modes);
|
||||
extern CoreExport void do_kill(User *user, const Anope::string &reason);
|
||||
|
||||
extern CoreExport bool matches_list(Channel *c, User *user, ChannelModeName mode);
|
||||
|
||||
extern CoreExport Anope::string create_mask(User *u);
|
||||
|
||||
#endif // USERS_H
|
||||
|
||||
+47
-21
@@ -1,6 +1,6 @@
|
||||
/* Build bumper
|
||||
*
|
||||
* (C) 2003-2011 Anope Team
|
||||
* (C) 2003-2012 Anope Team
|
||||
* Contact us at team@anope.org
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
@@ -15,21 +15,54 @@
|
||||
#include <sstream>
|
||||
#include <list>
|
||||
|
||||
static std::string get_git_hash(const std::string &git_dir)
|
||||
{
|
||||
std::fstream fd;
|
||||
std::string filebuf;
|
||||
|
||||
fd.open((git_dir + "/HEAD").c_str(), std::ios::in);
|
||||
if (!fd.is_open())
|
||||
return "";
|
||||
if (!getline(fd, filebuf) || filebuf.find("ref: ") != 0)
|
||||
{
|
||||
fd.close();
|
||||
return "";
|
||||
}
|
||||
|
||||
fd.close();
|
||||
|
||||
filebuf = filebuf.substr(5);
|
||||
fd.open((git_dir + "/" + filebuf).c_str(), std::ios::in);
|
||||
if (!fd.is_open())
|
||||
return "";
|
||||
if (!getline(fd, filebuf))
|
||||
{
|
||||
fd.close();
|
||||
return "";
|
||||
}
|
||||
fd.close();
|
||||
|
||||
return "g" + filebuf.substr(0, 7);
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
if (argc < 3)
|
||||
{
|
||||
std::cout << "Syntax: " << argv[0] << " <src/version.sh> <version.h>" << std::endl;
|
||||
std::cerr << "Syntax: " << argv[0] << " <base> <version.h>" << std::endl;
|
||||
return 1;
|
||||
}
|
||||
|
||||
std::string version_sh = std::string(argv[1]) + "/src/version.sh";
|
||||
std::string git_dir = std::string(argv[1]) + "/.git";
|
||||
|
||||
std::fstream fd;
|
||||
|
||||
fd.clear();
|
||||
fd.open(argv[1], std::ios::in);
|
||||
fd.open(version_sh.c_str(), std::ios::in);
|
||||
if (!fd.is_open())
|
||||
{
|
||||
std::cout << "Error: Unable to open src/version.sh for reading: " << argv[1] << std::endl;
|
||||
std::cerr << "Error: Unable to open src/version.sh for reading: " << version_sh << std::endl;
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -41,7 +74,7 @@ int main(int argc, char *argv[])
|
||||
{
|
||||
size_t eq = filebuf.find('=');
|
||||
|
||||
std::string type = filebuf.substr(8, 5);
|
||||
std::string type = filebuf.substr(0, eq);
|
||||
std::string value = filebuf.substr(eq + 2, filebuf.length() - eq - 3);
|
||||
versions.push_back(std::make_pair(type, value));
|
||||
}
|
||||
@@ -49,25 +82,19 @@ int main(int argc, char *argv[])
|
||||
|
||||
fd.close();
|
||||
|
||||
std::string git_version = get_git_hash(git_dir);
|
||||
if (!git_version.empty())
|
||||
versions.push_back(std::make_pair("VERSION_GIT", git_version));
|
||||
|
||||
fd.clear();
|
||||
fd.open(argv[2], std::ios::in);
|
||||
|
||||
std::string version_build = "#define VERSION_BUILD 1";
|
||||
std::string build = "#define BUILD 1";
|
||||
std::string version_extra;
|
||||
if (fd.is_open())
|
||||
{
|
||||
while (getline(fd, filebuf))
|
||||
{
|
||||
if (!filebuf.find("#define VERSION_BUILD"))
|
||||
version_build = filebuf;
|
||||
else if (!filebuf.find("#define VERSION_EXTRA"))
|
||||
{
|
||||
size_t q = filebuf.find('"');
|
||||
|
||||
version_extra = filebuf.substr(q + 1, filebuf.length() - q - 2);
|
||||
}
|
||||
else if (!filebuf.find("#define BUILD"))
|
||||
if (!filebuf.find("#define BUILD"))
|
||||
{
|
||||
size_t tab = filebuf.find(' ');
|
||||
|
||||
@@ -87,7 +114,7 @@ int main(int argc, char *argv[])
|
||||
|
||||
if (!fd.is_open())
|
||||
{
|
||||
std::cout << "Error: Unable to include/version.h for writing: " << argv[2] << std::endl;
|
||||
std::cerr << "Error: Unable to include/version.h for writing: " << argv[2] << std::endl;
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -95,13 +122,12 @@ int main(int argc, char *argv[])
|
||||
|
||||
for (std::list<std::pair<std::string, std::string> >::iterator it = versions.begin(), it_end = versions.end(); it != it_end; ++it)
|
||||
{
|
||||
if (it->first == "EXTRA")
|
||||
fd << "#define VERSION_EXTRA \"" << (!version_extra.empty() ? version_extra : "") << (version_extra.find(it->second) == std::string::npos ? it->second : "") << "\"" << std::endl;
|
||||
if (it->first == "VERSION_EXTRA" || it->first == "VERSION_GIT")
|
||||
fd << "#define " << it->first << " \"" << it->second << "\"" << std::endl;
|
||||
else
|
||||
fd << "#define VERSION_" << it->first << " " << it->second << std::endl;
|
||||
fd << "#define " << it->first << " " << it->second << std::endl;
|
||||
}
|
||||
|
||||
fd << version_build << std::endl;
|
||||
fd << build << std::endl;
|
||||
|
||||
fd.close();
|
||||
|
||||
@@ -29,8 +29,8 @@ if(GETTEXT_FOUND)
|
||||
endif(NOT WIN32)
|
||||
|
||||
# Install the new language file
|
||||
install(CODE "FILE(MAKE_DIRECTORY \${CMAKE_INSTALL_PREFIX}/data/languages/${LANG_LANG}/LC_MESSAGES/)")
|
||||
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${LANG_MO} DESTINATION data/languages/${LANG_LANG}/LC_MESSAGES RENAME ${LANG_DOMAIN}.mo PERMISSIONS ${PERMS})
|
||||
install(CODE "FILE(MAKE_DIRECTORY \"${LOCALE_DIR}/${LANG_LANG}/LC_MESSAGES/\")")
|
||||
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${LANG_MO} DESTINATION ${LOCALE_DIR}/${LANG_LANG}/LC_MESSAGES RENAME ${LANG_DOMAIN}.mo PERMISSIONS ${PERMS})
|
||||
endforeach(LANG_PO)
|
||||
|
||||
# Generate languages, depends on the mo files
|
||||
|
||||
+4592
-5102
File diff suppressed because it is too large
Load Diff
+4828
-5853
File diff suppressed because it is too large
Load Diff
+5560
-10139
File diff suppressed because it is too large
Load Diff
+4198
-4692
File diff suppressed because it is too large
Load Diff
+5194
-5824
File diff suppressed because it is too large
Load Diff
+5218
-5936
File diff suppressed because it is too large
Load Diff
+4472
-5009
File diff suppressed because it is too large
Load Diff
+4157
-4642
File diff suppressed because it is too large
Load Diff
+5248
-5882
File diff suppressed because it is too large
Load Diff
+4924
-5511
File diff suppressed because it is too large
Load Diff
+5623
-11267
File diff suppressed because it is too large
Load Diff
+4922
-5653
File diff suppressed because it is too large
Load Diff
+1
-1
@@ -14,7 +14,7 @@ cd -
|
||||
|
||||
for f in *.po
|
||||
do
|
||||
msgmerge -E -v -s -U $f `echo $f | cut -d'.' -f1`.pot
|
||||
msgmerge -v -s -U $f `echo $f | cut -d'.' -f1`.pot
|
||||
done
|
||||
|
||||
rm -f *~
|
||||
|
||||
+10
-3
@@ -85,10 +85,12 @@ foreach(MODULE_FOLDER ${MODULES_FOLDERS})
|
||||
if(WIN32)
|
||||
target_link_libraries(${SO} ${PROGRAM_NAME} wsock32 Ws2_32 ${WIN32_MEMORY} ${TEMP_DEPENDENCIES})
|
||||
set_target_properties(${PROGRAM_NAME} PROPERTIES VERSION "${VERSION_DOTTED}")
|
||||
else(WIN32)
|
||||
target_link_libraries(${SO} ${PROGRAM_NAME} ${TEMP_DEPENDENCIES})
|
||||
endif(WIN32)
|
||||
# Set the module to be installed to the module directory under the data directory
|
||||
install(TARGETS ${SO}
|
||||
DESTINATION data/modules
|
||||
DESTINATION ${LIB_DIR}/modules
|
||||
)
|
||||
endif(HAS_FUNCTION)
|
||||
else(NOT SKIP_DEPENDS AND NOT SKIP_LIBRARIES)
|
||||
@@ -103,7 +105,7 @@ foreach(MODULE_FOLDER ${MODULES_FOLDERS})
|
||||
|
||||
foreach(SUBDIR ${SUBMODULE_DIRS})
|
||||
if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/${SUBDIR}")
|
||||
file(GLOB MODULES_SUBDIR_SRCS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "${SUBDIR}/*.cpp")
|
||||
file(GLOB_RECURSE MODULES_SUBDIR_SRCS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "${SUBDIR}/*.cpp")
|
||||
sort_list(MODULES_SUBDIR_SRCS)
|
||||
|
||||
# Set all the files to use C++ as well as set their compile flags (use the module-specific compile flags, though)
|
||||
@@ -188,11 +190,16 @@ foreach(MODULE_FOLDER ${MODULES_FOLDERS})
|
||||
endif(WIN32)
|
||||
# Set the module to be installed to the module directory under the data directory
|
||||
install(TARGETS ${SO}
|
||||
DESTINATION data/modules
|
||||
DESTINATION ${LIB_DIR}/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)
|
||||
|
||||
# Run the directories CMakeLists.txt if there is one
|
||||
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${SUBDIR}/CMakeLists.txt")
|
||||
add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/${SUBDIR}")
|
||||
endif(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${SUBDIR}/CMakeLists.txt")
|
||||
endif(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/${SUBDIR}")
|
||||
endforeach(SUBDIR)
|
||||
endif(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/${MODULE_FOLDER}")
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* BotServ core functions
|
||||
*
|
||||
* (C) 2003-2011 Anope Team
|
||||
* (C) 2003-2012 Anope Team
|
||||
* Contact us at team@anope.org
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
@@ -22,13 +22,11 @@ class CommandBSAssign : public Command
|
||||
this->SetSyntax(_("\037channel\037 \037nick\037"));
|
||||
}
|
||||
|
||||
void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms) anope_override
|
||||
{
|
||||
const Anope::string &chan = params[0];
|
||||
const Anope::string &nick = params[1];
|
||||
|
||||
User *u = source.u;
|
||||
|
||||
if (readonly)
|
||||
{
|
||||
source.Reply(BOT_ASSIGN_READONLY);
|
||||
@@ -49,13 +47,14 @@ class CommandBSAssign : public Command
|
||||
return;
|
||||
}
|
||||
|
||||
if (ci->botflags.HasFlag(BS_NOBOT) || (!ci->AccessFor(u).HasPriv(CA_ASSIGN) && !u->HasPriv("botserv/administration")))
|
||||
AccessGroup access = source.AccessFor(ci);
|
||||
if (ci->botflags.HasFlag(BS_NOBOT) || (!access.HasPriv("ASSIGN") && !source.HasPriv("botserv/administration")))
|
||||
{
|
||||
source.Reply(ACCESS_DENIED);
|
||||
return;
|
||||
}
|
||||
|
||||
if (bi->HasFlag(BI_PRIVATE) && !u->HasCommand("botserv/assign/private"))
|
||||
if (bi->HasFlag(BI_PRIVATE) && !source.HasCommand("botserv/assign/private"))
|
||||
{
|
||||
source.Reply(ACCESS_DENIED);
|
||||
return;
|
||||
@@ -67,14 +66,14 @@ class CommandBSAssign : public Command
|
||||
return;
|
||||
}
|
||||
|
||||
bool override = !ci->AccessFor(u).HasPriv(CA_ASSIGN);
|
||||
Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "for " << bi->nick;
|
||||
bool override = !access.HasPriv("ASSIGN");
|
||||
Log(override ? LOG_OVERRIDE : LOG_COMMAND, source, this, ci) << "for " << bi->nick;
|
||||
|
||||
bi->Assign(u, ci);
|
||||
bi->Assign(source.GetUser(), ci);
|
||||
source.Reply(_("Bot \002%s\002 has been assigned to %s."), bi->nick.c_str(), ci->name.c_str());
|
||||
}
|
||||
|
||||
bool OnHelp(CommandSource &source, const Anope::string &subcommand)
|
||||
bool OnHelp(CommandSource &source, const Anope::string &subcommand) anope_override
|
||||
{
|
||||
this->SendSyntax(source);
|
||||
source.Reply(" ");
|
||||
@@ -94,10 +93,8 @@ class CommandBSUnassign : public Command
|
||||
this->SetSyntax(_("\037channel\037"));
|
||||
}
|
||||
|
||||
void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms) anope_override
|
||||
{
|
||||
User *u = source.u;
|
||||
|
||||
if (readonly)
|
||||
{
|
||||
source.Reply(BOT_ASSIGN_READONLY);
|
||||
@@ -111,7 +108,8 @@ class CommandBSUnassign : public Command
|
||||
return;
|
||||
}
|
||||
|
||||
if (!u->HasPriv("botserv/administration") && !ci->AccessFor(u).HasPriv(CA_ASSIGN))
|
||||
AccessGroup access = source.AccessFor(ci);
|
||||
if (!source.HasPriv("botserv/administration") && !access.HasPriv("ASSIGN"))
|
||||
{
|
||||
source.Reply(ACCESS_DENIED);
|
||||
return;
|
||||
@@ -129,14 +127,14 @@ class CommandBSUnassign : public Command
|
||||
return;
|
||||
}
|
||||
|
||||
bool override = !ci->AccessFor(u).HasPriv(CA_ASSIGN);
|
||||
Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "for " << ci->bi->nick;
|
||||
bool override = !access.HasPriv("ASSIGN");
|
||||
Log(override ? LOG_OVERRIDE : LOG_COMMAND, source, this, ci) << "for " << ci->bi->nick;
|
||||
|
||||
ci->bi->UnAssign(u, ci);
|
||||
ci->bi->UnAssign(source.GetUser(), ci);
|
||||
source.Reply(_("There is no bot assigned to %s anymore."), ci->name.c_str());
|
||||
}
|
||||
|
||||
bool OnHelp(CommandSource &source, const Anope::string &subcommand)
|
||||
bool OnHelp(CommandSource &source, const Anope::string &subcommand) anope_override
|
||||
{
|
||||
this->SendSyntax(source);
|
||||
source.Reply(" ");
|
||||
@@ -160,8 +158,6 @@ class BSAssign : public Module
|
||||
{
|
||||
this->SetAuthor("Anope");
|
||||
|
||||
ModuleManager::RegisterService(&commandbsassign);
|
||||
ModuleManager::RegisterService(&commandbsunassign);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* BotServ core functions
|
||||
*
|
||||
* (C) 2003-2011 Anope Team
|
||||
* (C) 2003-2012 Anope Team
|
||||
* Contact us at team@anope.org
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
@@ -13,42 +13,6 @@
|
||||
|
||||
#include "module.h"
|
||||
|
||||
class BadwordsListCallback : public NumberList
|
||||
{
|
||||
CommandSource &source;
|
||||
ChannelInfo *ci;
|
||||
bool SentHeader;
|
||||
public:
|
||||
BadwordsListCallback(CommandSource &_source, ChannelInfo *_ci, const Anope::string &list) : NumberList(list, false), source(_source), ci(_ci), SentHeader(false)
|
||||
{
|
||||
}
|
||||
|
||||
~BadwordsListCallback()
|
||||
{
|
||||
if (!SentHeader)
|
||||
source.Reply(_("No matching entries on %s bad words list."), ci->name.c_str());
|
||||
}
|
||||
|
||||
void HandleNumber(unsigned Number)
|
||||
{
|
||||
if (!Number || Number > ci->GetBadWordCount())
|
||||
return;
|
||||
|
||||
if (!SentHeader)
|
||||
{
|
||||
SentHeader = true;
|
||||
source.Reply(_("Bad words list for %s:\n"
|
||||
" Num Word Type"), ci->name.c_str());
|
||||
}
|
||||
|
||||
DoList(source, Number - 1, ci->GetBadWord(Number - 1));
|
||||
}
|
||||
|
||||
static void DoList(CommandSource &source, 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)" : "")));
|
||||
}
|
||||
};
|
||||
|
||||
class BadwordsDelCallback : public NumberList
|
||||
{
|
||||
@@ -60,7 +24,7 @@ class BadwordsDelCallback : public NumberList
|
||||
public:
|
||||
BadwordsDelCallback(CommandSource &_source, ChannelInfo *_ci, Command *_c, const Anope::string &list) : NumberList(list, true), source(_source), ci(_ci), c(_c), Deleted(0), override(false)
|
||||
{
|
||||
if (!ci->AccessFor(source.u).HasPriv(CA_BADWORDS) && source.u->HasPriv("botserv/administration"))
|
||||
if (!source.AccessFor(ci).HasPriv("BADWORDS") && source.HasPriv("botserv/administration"))
|
||||
this->override = true;
|
||||
}
|
||||
|
||||
@@ -74,12 +38,12 @@ class BadwordsDelCallback : public NumberList
|
||||
source.Reply(_("Deleted %d entries from %s bad words list."), Deleted, ci->name.c_str());
|
||||
}
|
||||
|
||||
void HandleNumber(unsigned Number)
|
||||
void HandleNumber(unsigned Number) anope_override
|
||||
{
|
||||
if (!Number || Number > ci->GetBadWordCount())
|
||||
return;
|
||||
|
||||
Log(override ? LOG_OVERRIDE : LOG_COMMAND, source.u, c, ci) << "DEL " << ci->GetBadWord(Number - 1)->word;
|
||||
Log(override ? LOG_OVERRIDE : LOG_COMMAND, source, c, ci) << "DEL " << ci->GetBadWord(Number - 1)->word;
|
||||
++Deleted;
|
||||
ci->EraseBadWord(Number - 1);
|
||||
}
|
||||
@@ -90,49 +54,81 @@ class CommandBSBadwords : public Command
|
||||
private:
|
||||
void DoList(CommandSource &source, ChannelInfo *ci, const Anope::string &word)
|
||||
{
|
||||
bool override = !ci->AccessFor(source.u).HasPriv(CA_BADWORDS);
|
||||
Log(override ? LOG_OVERRIDE : LOG_COMMAND, source.u, this, ci) << "LIST";
|
||||
bool override = !source.AccessFor(ci).HasPriv("BADWORDS");
|
||||
Log(override ? LOG_OVERRIDE : LOG_COMMAND, source, this, ci) << "LIST";
|
||||
ListFormatter list;
|
||||
|
||||
list.addColumn("Number").addColumn("Word").addColumn("Type");
|
||||
|
||||
if (!ci->GetBadWordCount())
|
||||
{
|
||||
source.Reply(_("%s bad words list is empty."), ci->name.c_str());
|
||||
return;
|
||||
}
|
||||
else if (!word.empty() && word.find_first_not_of("1234567890,-") == Anope::string::npos)
|
||||
{
|
||||
BadwordsListCallback list(source, ci, word);
|
||||
list.Process();
|
||||
class BadwordsListCallback : public NumberList
|
||||
{
|
||||
ListFormatter &list;
|
||||
ChannelInfo *ci;
|
||||
public:
|
||||
BadwordsListCallback(ListFormatter &_list, ChannelInfo *_ci, const Anope::string &numlist) : NumberList(numlist, false), list(_list), ci(_ci)
|
||||
{
|
||||
}
|
||||
|
||||
void HandleNumber(unsigned Number) anope_override
|
||||
{
|
||||
if (!Number || Number > ci->GetBadWordCount())
|
||||
return;
|
||||
|
||||
const BadWord *bw = ci->GetBadWord(Number - 1);
|
||||
ListFormatter::ListEntry entry;
|
||||
entry["Number"] = stringify(Number);
|
||||
entry["Word"] = bw->word;
|
||||
entry["Type"] = bw->type == BW_SINGLE ? "(SINGLE)" : (bw->type == BW_START ? "(START)" : (bw->type == BW_END ? "(END)" : ""));
|
||||
this->list.addEntry(entry);
|
||||
}
|
||||
}
|
||||
nl_list(list, ci, word);
|
||||
nl_list.Process();
|
||||
}
|
||||
else
|
||||
{
|
||||
bool SentHeader = false;
|
||||
|
||||
for (unsigned i = 0, end = ci->GetBadWordCount(); i < end; ++i)
|
||||
{
|
||||
BadWord *bw = ci->GetBadWord(i);
|
||||
const BadWord *bw = ci->GetBadWord(i);
|
||||
|
||||
if (!word.empty() && !Anope::Match(bw->word, word))
|
||||
continue;
|
||||
|
||||
if (!SentHeader)
|
||||
{
|
||||
SentHeader = true;
|
||||
source.Reply(_("Bad words list for %s:\n"
|
||||
" Num Word Type"), ci->name.c_str());
|
||||
|
||||
}
|
||||
|
||||
BadwordsListCallback::DoList(source, i, bw);
|
||||
ListFormatter::ListEntry entry;
|
||||
entry["Number"] = stringify(i + 1);
|
||||
entry["Word"] = bw->word;
|
||||
entry["Type"] = bw->type == BW_SINGLE ? "(SINGLE)" : (bw->type == BW_START ? "(START)" : (bw->type == BW_END ? "(END)" : ""));
|
||||
list.addEntry(entry);
|
||||
}
|
||||
|
||||
if (!SentHeader)
|
||||
source.Reply(_("No matching entries on %s bad words list."), ci->name.c_str());
|
||||
}
|
||||
|
||||
return;
|
||||
if (list.isEmpty())
|
||||
source.Reply(_("No matching entries on %s badword list."), ci->name.c_str());
|
||||
else
|
||||
{
|
||||
std::vector<Anope::string> replies;
|
||||
list.Process(replies);
|
||||
|
||||
source.Reply(_("Badword list for %s:"), ci->name.c_str());
|
||||
|
||||
for (unsigned i = 0; i < replies.size(); ++i)
|
||||
source.Reply(replies[i]);
|
||||
|
||||
source.Reply(_("End of badword list."));
|
||||
}
|
||||
}
|
||||
|
||||
void DoAdd(CommandSource &source, ChannelInfo *ci, const Anope::string &word)
|
||||
{
|
||||
size_t pos = word.rfind(' ');
|
||||
BadWordType type = BW_ANY;
|
||||
BadWordType bwtype = BW_ANY;
|
||||
Anope::string realword = word;
|
||||
|
||||
if (pos != Anope::string::npos)
|
||||
@@ -141,11 +137,11 @@ class CommandBSBadwords : public Command
|
||||
if (!opt.empty())
|
||||
{
|
||||
if (opt.equals_ci("SINGLE"))
|
||||
type = BW_SINGLE;
|
||||
bwtype = BW_SINGLE;
|
||||
else if (opt.equals_ci("START"))
|
||||
type = BW_START;
|
||||
bwtype = BW_START;
|
||||
else if (opt.equals_ci("END"))
|
||||
type = BW_END;
|
||||
bwtype = BW_END;
|
||||
}
|
||||
realword = word.substr(0, pos);
|
||||
}
|
||||
@@ -158,7 +154,7 @@ class CommandBSBadwords : public Command
|
||||
|
||||
for (unsigned i = 0, end = ci->GetBadWordCount(); i < end; ++i)
|
||||
{
|
||||
BadWord *bw = ci->GetBadWord(i);
|
||||
const BadWord *bw = ci->GetBadWord(i);
|
||||
|
||||
if (!bw->word.empty() && ((Config->BSCaseSensitive && realword.equals_cs(bw->word)) || (!Config->BSCaseSensitive && realword.equals_ci(bw->word))))
|
||||
{
|
||||
@@ -167,9 +163,9 @@ class CommandBSBadwords : public Command
|
||||
}
|
||||
}
|
||||
|
||||
bool override = !ci->AccessFor(source.u).HasPriv(CA_BADWORDS);
|
||||
Log(override ? LOG_OVERRIDE : LOG_COMMAND, source.u, this, ci) << "ADD " << realword;
|
||||
ci->AddBadWord(realword, type);
|
||||
bool override = !source.AccessFor(ci).HasPriv("BADWORDS");
|
||||
Log(override ? LOG_OVERRIDE : LOG_COMMAND, source, this, ci) << "ADD " << realword;
|
||||
ci->AddBadWord(realword, bwtype);
|
||||
|
||||
source.Reply(_("\002%s\002 added to %s bad words list."), realword.c_str(), ci->name.c_str());
|
||||
|
||||
@@ -187,7 +183,7 @@ class CommandBSBadwords : public Command
|
||||
else
|
||||
{
|
||||
unsigned i, end;
|
||||
BadWord *badword;
|
||||
const BadWord *badword;
|
||||
|
||||
for (i = 0, end = ci->GetBadWordCount(); i < end; ++i)
|
||||
{
|
||||
@@ -203,8 +199,8 @@ class CommandBSBadwords : public Command
|
||||
return;
|
||||
}
|
||||
|
||||
bool override = !ci->AccessFor(source.u).HasPriv(CA_BADWORDS);
|
||||
Log(override ? LOG_OVERRIDE : LOG_COMMAND, source.u, this, ci) << "DEL " << badword->word;
|
||||
bool override = !source.AccessFor(ci).HasPriv("BADWORDS");
|
||||
Log(override ? LOG_OVERRIDE : LOG_COMMAND, source, this, ci) << "DEL " << badword->word;
|
||||
|
||||
source.Reply(_("\002%s\002 deleted from %s bad words list."), badword->word.c_str(), ci->name.c_str());
|
||||
|
||||
@@ -216,8 +212,8 @@ class CommandBSBadwords : public Command
|
||||
|
||||
void DoClear(CommandSource &source, ChannelInfo *ci)
|
||||
{
|
||||
bool override = !ci->AccessFor(source.u).HasPriv(CA_BADWORDS);
|
||||
Log(override ? LOG_OVERRIDE : LOG_COMMAND, source.u, this, ci) << "CLEAR";
|
||||
bool override = !source.AccessFor(ci).HasPriv("BADWORDS");
|
||||
Log(override ? LOG_OVERRIDE : LOG_COMMAND, source, this, ci) << "CLEAR";
|
||||
|
||||
ci->ClearBadWords();
|
||||
source.Reply(_("Bad words list is now empty."));
|
||||
@@ -233,11 +229,10 @@ class CommandBSBadwords : public Command
|
||||
this->SetSyntax(_("\037channel\037 CLEAR"));
|
||||
}
|
||||
|
||||
void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms) anope_override
|
||||
{
|
||||
const Anope::string &cmd = params[1];
|
||||
const Anope::string &word = params.size() > 2 ? params[2] : "";
|
||||
User *u = source.u;
|
||||
bool need_args = cmd.equals_ci("LIST") || cmd.equals_ci("CLEAR");
|
||||
|
||||
if (!need_args && word.empty())
|
||||
@@ -253,8 +248,7 @@ class CommandBSBadwords : public Command
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (!ci->AccessFor(u).HasPriv(CA_BADWORDS) && (!need_args || !u->HasPriv("botserv/administration")))
|
||||
if (!source.AccessFor(ci).HasPriv("BADWORDS") && (!need_args || !source.HasPriv("botserv/administration")))
|
||||
{
|
||||
source.Reply(ACCESS_DENIED);
|
||||
return;
|
||||
@@ -278,7 +272,7 @@ class CommandBSBadwords : public Command
|
||||
this->OnSyntaxError(source, "");
|
||||
}
|
||||
|
||||
bool OnHelp(CommandSource &source, const Anope::string &subcommand)
|
||||
bool OnHelp(CommandSource &source, const Anope::string &subcommand) anope_override
|
||||
{
|
||||
this->SendSyntax(source);
|
||||
source.Reply(" ");
|
||||
@@ -324,7 +318,6 @@ class BSBadwords : public Module
|
||||
{
|
||||
this->SetAuthor("Anope");
|
||||
|
||||
ModuleManager::RegisterService(&commandbsbadwords);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
+18
-21
@@ -1,6 +1,6 @@
|
||||
/* BotServ core functions
|
||||
*
|
||||
* (C) 2003-2011 Anope Team
|
||||
* (C) 2003-2012 Anope Team
|
||||
* Contact us at team@anope.org
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
@@ -22,7 +22,6 @@ class CommandBSBot : public Command
|
||||
const Anope::string &user = params[2];
|
||||
const Anope::string &host = params[3];
|
||||
const Anope::string &real = params[4];
|
||||
BotInfo *bi;
|
||||
|
||||
if (findbot(nick))
|
||||
{
|
||||
@@ -69,8 +68,8 @@ class CommandBSBot : public Command
|
||||
return;
|
||||
}
|
||||
|
||||
/* Check the host is valid re RFC 2812 */
|
||||
if (!isValidHost(host, 3))
|
||||
/* Check the host is valid */
|
||||
if (!IsValidHost(host))
|
||||
{
|
||||
source.Reply(_("Bot Hosts may only contain valid host characters."));
|
||||
return;
|
||||
@@ -93,9 +92,9 @@ class CommandBSBot : public Command
|
||||
return;
|
||||
}
|
||||
|
||||
bi = new BotInfo(nick, user, host, real);
|
||||
BotInfo *bi = new BotInfo(nick, user, host, real);
|
||||
|
||||
Log(LOG_ADMIN, source.u, this) << "ADD " << bi->GetMask() << " " << bi->realname;
|
||||
Log(LOG_ADMIN, source, 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());
|
||||
|
||||
@@ -110,7 +109,6 @@ class CommandBSBot : public Command
|
||||
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] : "";
|
||||
BotInfo *bi;
|
||||
|
||||
if (oldnick.empty() || nick.empty())
|
||||
{
|
||||
@@ -118,7 +116,8 @@ class CommandBSBot : public Command
|
||||
return;
|
||||
}
|
||||
|
||||
if (!(bi = findbot(oldnick)))
|
||||
BotInfo *bi = findbot(oldnick);
|
||||
if (!bi)
|
||||
{
|
||||
source.Reply(BOT_DOES_NOT_EXIST, oldnick.c_str());
|
||||
return;
|
||||
@@ -186,7 +185,7 @@ class CommandBSBot : public Command
|
||||
return;
|
||||
}
|
||||
|
||||
if (!host.empty() && !isValidHost(host, 3))
|
||||
if (!host.empty() && !IsValidHost(host))
|
||||
{
|
||||
source.Reply(_("Bot Hosts may only contain valid host characters."));
|
||||
return;
|
||||
@@ -254,7 +253,7 @@ class CommandBSBot : public Command
|
||||
}
|
||||
|
||||
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;
|
||||
Log(LOG_ADMIN, source, this) << "CHANGE " << oldnick << " to " << bi->GetMask() << " " << bi->realname;
|
||||
|
||||
FOREACH_MOD(I_OnBotChange, OnBotChange(bi));
|
||||
return;
|
||||
@@ -263,7 +262,6 @@ class CommandBSBot : public Command
|
||||
void DoDel(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
const Anope::string &nick = params[1];
|
||||
BotInfo *bi;
|
||||
|
||||
if (nick.empty())
|
||||
{
|
||||
@@ -271,7 +269,8 @@ class CommandBSBot : public Command
|
||||
return;
|
||||
}
|
||||
|
||||
if (!(bi = findbot(nick)))
|
||||
BotInfo *bi = findbot(nick);
|
||||
if (!bi)
|
||||
{
|
||||
source.Reply(BOT_DOES_NOT_EXIST, nick.c_str());
|
||||
return;
|
||||
@@ -285,10 +284,10 @@ class CommandBSBot : public Command
|
||||
|
||||
FOREACH_MOD(I_OnBotDelete, OnBotDelete(bi));
|
||||
|
||||
Log(LOG_ADMIN, source.u, this) << "DEL " << bi->nick;
|
||||
Log(LOG_ADMIN, source, this) << "DEL " << bi->nick;
|
||||
|
||||
source.Reply(_("Bot \002%s\002 has been deleted."), nick.c_str());
|
||||
delete bi;
|
||||
bi->destroy();
|
||||
return;
|
||||
}
|
||||
public:
|
||||
@@ -300,10 +299,9 @@ class CommandBSBot : public Command
|
||||
this->SetSyntax(_("\002DEL \037nick\037\002"));
|
||||
}
|
||||
|
||||
void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms) anope_override
|
||||
{
|
||||
const Anope::string &cmd = params[0];
|
||||
User *u = source.u;
|
||||
|
||||
if (readonly)
|
||||
{
|
||||
@@ -314,7 +312,7 @@ class CommandBSBot : public Command
|
||||
if (cmd.equals_ci("ADD"))
|
||||
{
|
||||
// ADD nick user host real - 5
|
||||
if (!u->HasCommand("botserv/bot/add"))
|
||||
if (!source.HasCommand("botserv/bot/add"))
|
||||
{
|
||||
source.Reply(ACCESS_DENIED);
|
||||
return;
|
||||
@@ -337,7 +335,7 @@ class CommandBSBot : public Command
|
||||
{
|
||||
// CHANGE oldn newn user host real - 6
|
||||
// but only oldn and newn are required
|
||||
if (!u->HasCommand("botserv/bot/change"))
|
||||
if (!source.HasCommand("botserv/bot/change"))
|
||||
{
|
||||
source.Reply(ACCESS_DENIED);
|
||||
return;
|
||||
@@ -354,7 +352,7 @@ class CommandBSBot : public Command
|
||||
else if (cmd.equals_ci("DEL"))
|
||||
{
|
||||
// DEL nick
|
||||
if (!u->HasCommand("botserv/bot/del"))
|
||||
if (!source.HasCommand("botserv/bot/del"))
|
||||
{
|
||||
source.Reply(ACCESS_DENIED);
|
||||
return;
|
||||
@@ -374,7 +372,7 @@ class CommandBSBot : public Command
|
||||
return;
|
||||
}
|
||||
|
||||
bool OnHelp(CommandSource &source, const Anope::string &subcommand)
|
||||
bool OnHelp(CommandSource &source, const Anope::string &subcommand) anope_override
|
||||
{
|
||||
this->SendSyntax(source);
|
||||
source.Reply(" ");
|
||||
@@ -407,7 +405,6 @@ class BSBot : public Module
|
||||
{
|
||||
this->SetAuthor("Anope");
|
||||
|
||||
ModuleManager::RegisterService(&commandbsbot);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* BotServ core functions
|
||||
*
|
||||
* (C) 2003-2011 Anope Team
|
||||
* (C) 2003-2012 Anope Team
|
||||
* Contact us at team@anope.org
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
@@ -22,54 +22,50 @@ class CommandBSBotList : public Command
|
||||
this->SetSyntax("");
|
||||
}
|
||||
|
||||
void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms) anope_override
|
||||
{
|
||||
User *u = source.u;
|
||||
unsigned count = 0;
|
||||
ListFormatter list;
|
||||
|
||||
for (Anope::insensitive_map<BotInfo *>::const_iterator it = BotListByNick.begin(), it_end = BotListByNick.end(); it != it_end; ++it)
|
||||
list.addColumn("Nick").addColumn("Mask");
|
||||
|
||||
for (Anope::insensitive_map<BotInfo *>::const_iterator it = BotListByNick->begin(), it_end = BotListByNick->end(); it != it_end; ++it)
|
||||
{
|
||||
BotInfo *bi = it->second;
|
||||
|
||||
if (!bi->HasFlag(BI_PRIVATE))
|
||||
if (source.HasCommand("botserv/botlist") || !bi->HasFlag(BI_PRIVATE))
|
||||
{
|
||||
if (!count)
|
||||
source.Reply(_("Bot list:"));
|
||||
++count;
|
||||
source.Reply(" %-15s (%s@%s)", bi->nick.c_str(), bi->GetIdent().c_str(), bi->host.c_str());
|
||||
ListFormatter::ListEntry entry;
|
||||
entry["Nick"] = (bi->HasFlag(BI_PRIVATE) ? "* " : "") + bi->nick;
|
||||
entry["Mask"] = bi->GetIdent() + "@" + bi->host;
|
||||
list.addEntry(entry);
|
||||
}
|
||||
}
|
||||
|
||||
if (u->HasCommand("botserv/botlist") && count < BotListByNick.size())
|
||||
{
|
||||
source.Reply(_("Bots reserved to IRC operators:"));
|
||||
|
||||
for (Anope::insensitive_map<BotInfo *>::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());
|
||||
++count;
|
||||
}
|
||||
}
|
||||
}
|
||||
std::vector<Anope::string> replies;
|
||||
list.Process(replies);
|
||||
|
||||
if (!count)
|
||||
source.Reply(_("There are no bots available at this time.\n"
|
||||
"Ask a Services Operator to create one!"));
|
||||
else
|
||||
source.Reply(_("%d bots available."), count);
|
||||
{
|
||||
source.Reply(_("Bot list:"));
|
||||
|
||||
return;
|
||||
for (unsigned i = 0; i < replies.size(); ++i)
|
||||
source.Reply(replies[i]);
|
||||
|
||||
source.Reply(_("%d bots available."), count);
|
||||
}
|
||||
}
|
||||
|
||||
bool OnHelp(CommandSource &source, const Anope::string &subcommand)
|
||||
bool OnHelp(CommandSource &source, const Anope::string &subcommand) anope_override
|
||||
{
|
||||
this->SendSyntax(source);
|
||||
source.Reply(" ");
|
||||
source.Reply(_("Lists all available bots on this network."));
|
||||
source.Reply(_("Lists all available bots on this network.\n"
|
||||
"Bots prefixed by a * are reserved for IRC operators."));
|
||||
return true;
|
||||
}
|
||||
};
|
||||
@@ -84,7 +80,6 @@ class BSBotList : public Module
|
||||
{
|
||||
this->SetAuthor("Anope");
|
||||
|
||||
ModuleManager::RegisterService(&commandbsbotlist);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* BotServ core functions
|
||||
*
|
||||
* (C) 2003-2011 Anope Team
|
||||
* (C) 2003-2012 Anope Team
|
||||
* Contact us at team@anope.org
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
@@ -22,12 +22,10 @@ class CommandBSSay : public Command
|
||||
this->SetSyntax(_("\037channel\037 \037text\037"));
|
||||
}
|
||||
|
||||
void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms) anope_override
|
||||
{
|
||||
const Anope::string &text = params[1];
|
||||
|
||||
User *u = source.u;
|
||||
|
||||
ChannelInfo *ci = cs_findchan(params[0]);
|
||||
if (ci == NULL)
|
||||
{
|
||||
@@ -35,7 +33,7 @@ class CommandBSSay : public Command
|
||||
return;
|
||||
}
|
||||
|
||||
if (!ci->AccessFor(u).HasPriv(CA_SAY))
|
||||
if (!source.AccessFor(ci).HasPriv("SAY"))
|
||||
{
|
||||
source.Reply(ACCESS_DENIED);
|
||||
return;
|
||||
@@ -63,12 +61,12 @@ class CommandBSSay : public Command
|
||||
ci->bi->lastmsg = Anope::CurTime;
|
||||
|
||||
// XXX need a way to find if someone is overriding this
|
||||
Log(LOG_COMMAND, u, this, ci) << text;
|
||||
Log(LOG_COMMAND, source, this, ci) << text;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
bool OnHelp(CommandSource &source, const Anope::string &subcommand)
|
||||
bool OnHelp(CommandSource &source, const Anope::string &subcommand) anope_override
|
||||
{
|
||||
this->SendSyntax(source);
|
||||
source.Reply(" ");
|
||||
@@ -86,9 +84,8 @@ class CommandBSAct : public Command
|
||||
this->SetSyntax(_("\037channel\037 \037text\037"));
|
||||
}
|
||||
|
||||
void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms) anope_override
|
||||
{
|
||||
User *u = source.u;
|
||||
Anope::string message = params[1];
|
||||
|
||||
ChannelInfo *ci = cs_findchan(params[0]);
|
||||
@@ -98,7 +95,7 @@ class CommandBSAct : public Command
|
||||
return;
|
||||
}
|
||||
|
||||
if (!ci->AccessFor(u).HasPriv(CA_SAY))
|
||||
if (!source.AccessFor(ci).HasPriv("SAY"))
|
||||
{
|
||||
source.Reply(ACCESS_DENIED);
|
||||
return;
|
||||
@@ -124,12 +121,12 @@ class CommandBSAct : public Command
|
||||
ci->bi->lastmsg = Anope::CurTime;
|
||||
|
||||
// XXX Need to be able to find if someone is overriding this.
|
||||
Log(LOG_COMMAND, u, this, ci) << message;
|
||||
Log(LOG_COMMAND, source, this, ci) << message;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
bool OnHelp(CommandSource &source, const Anope::string &subcommand)
|
||||
bool OnHelp(CommandSource &source, const Anope::string &subcommand) anope_override
|
||||
{
|
||||
this->SendSyntax(source);
|
||||
source.Reply(" ");
|
||||
@@ -150,8 +147,6 @@ class BSControl : public Module
|
||||
{
|
||||
this->SetAuthor("Anope");
|
||||
|
||||
ModuleManager::RegisterService(&commandbssay);
|
||||
ModuleManager::RegisterService(&commandbsact);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
+101
-96
@@ -1,6 +1,6 @@
|
||||
/* BotServ core functions
|
||||
*
|
||||
* (C) 2003-2011 Anope Team
|
||||
* (C) 2003-2012 Anope Team
|
||||
* Contact us at team@anope.org
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
@@ -17,28 +17,37 @@
|
||||
class CommandBSInfo : public Command
|
||||
{
|
||||
private:
|
||||
void send_bot_channels(CommandSource &source, BotInfo *bi)
|
||||
void send_bot_channels(std::vector<Anope::string> &buffers, const BotInfo *bi)
|
||||
{
|
||||
Anope::string buf;
|
||||
for (registered_channel_map::const_iterator it = RegisteredChannelList.begin(), it_end = RegisteredChannelList.end(); it != it_end; ++it)
|
||||
for (registered_channel_map::const_iterator it = RegisteredChannelList->begin(), it_end = RegisteredChannelList->end(); it != it_end; ++it)
|
||||
{
|
||||
ChannelInfo *ci = it->second;
|
||||
const ChannelInfo *ci = it->second;
|
||||
|
||||
if (ci->bi == bi)
|
||||
{
|
||||
if (buf.length() + ci->name.length() > 300)
|
||||
buf += " " + ci->name + " ";
|
||||
if (buf.length() > 300)
|
||||
{
|
||||
source.Reply("%s", buf.c_str());
|
||||
buffers.push_back(buf);
|
||||
buf.clear();
|
||||
}
|
||||
buf += " " + ci->name + " ";
|
||||
}
|
||||
}
|
||||
|
||||
if (!buf.empty())
|
||||
source.Reply("%s", buf.c_str());
|
||||
return;
|
||||
buffers.push_back(buf);
|
||||
}
|
||||
|
||||
void CheckOptStr(Anope::string &buf, BotServFlag flag, const char *option, Flags<BotServFlag> &flags, const NickCore *nc)
|
||||
{
|
||||
if (flags.HasFlag(flag))
|
||||
{
|
||||
if (!buf.empty())
|
||||
buf += ", ";
|
||||
buf += translate(nc, option);
|
||||
}
|
||||
}
|
||||
|
||||
public:
|
||||
CommandBSInfo(Module *creator) : Command(creator, "botserv/info", 1, 1)
|
||||
{
|
||||
@@ -46,175 +55,172 @@ class CommandBSInfo : public Command
|
||||
this->SetSyntax(_("\002INFO {\037chan\037 | \037nick\037}\002"));
|
||||
}
|
||||
|
||||
void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms) anope_override
|
||||
{
|
||||
const Anope::string &query = params[0];
|
||||
|
||||
bool need_comma = false;
|
||||
char buf[BUFSIZE], *end;
|
||||
|
||||
User *u = source.u;
|
||||
BotInfo *bi = findbot(query);
|
||||
const BotInfo *bi = findbot(query);
|
||||
ChannelInfo *ci;
|
||||
InfoFormatter info(source.nc);
|
||||
|
||||
if (bi)
|
||||
{
|
||||
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);
|
||||
info[_("Mask")] = bi->GetIdent() + "@" + bi->host;
|
||||
info[_("Real name")] = bi->realname;
|
||||
info[_("Created")] = do_strftime(bi->created);
|
||||
info[_("Options")] = bi->HasFlag(BI_PRIVATE) ? _("Private") : _("None");
|
||||
info[_("Used on")] = stringify(bi->GetChannelCount()) + " channel(s)";
|
||||
|
||||
std::vector<Anope::string> replies;
|
||||
info.Process(replies);
|
||||
|
||||
for (unsigned i = 0; i < replies.size(); ++i)
|
||||
source.Reply(replies[i]);
|
||||
|
||||
if (source.HasPriv("botserv/administration"))
|
||||
{
|
||||
std::vector<Anope::string> buf;
|
||||
this->send_bot_channels(buf, bi);
|
||||
for (unsigned i = 0; i < buf.size(); ++i)
|
||||
source.Reply(buf[i]);
|
||||
}
|
||||
|
||||
if (u->HasPriv("botserv/administration"))
|
||||
this->send_bot_channels(source, bi);
|
||||
}
|
||||
else if ((ci = cs_findchan(query)))
|
||||
{
|
||||
if (!ci->AccessFor(u).HasPriv(CA_FOUNDER) && !u->HasPriv("botserv/administration"))
|
||||
if (!source.AccessFor(ci).HasPriv("FOUNDER") && !source.HasPriv("botserv/administration"))
|
||||
{
|
||||
source.Reply(ACCESS_DENIED);
|
||||
return;
|
||||
}
|
||||
|
||||
source.Reply(CHAN_INFO_HEADER, ci->name.c_str());
|
||||
if (ci->bi)
|
||||
source.Reply(_(" Bot nick : %s"), ci->bi->nick.c_str());
|
||||
else
|
||||
source.Reply(_(" Bot nick : not assigned yet."));
|
||||
info[_("Bot nick")] = ci->bi ? ci->bi->nick : "not assigned yet";
|
||||
|
||||
Anope::string enabled = translate(source.nc, _("Enabled"));
|
||||
Anope::string disabled = translate(source.nc, _("Disabled"));
|
||||
|
||||
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]);
|
||||
info[_("Bad words kicker")] = Anope::printf("%s (%d kick(s) to ban)", enabled.c_str(), ci->ttb[TTB_BADWORDS]);
|
||||
else
|
||||
source.Reply(_(" Bad words kicker : %s"), ENABLED);
|
||||
info[_("Bad words kicker")] = enabled;
|
||||
}
|
||||
else
|
||||
source.Reply(_(" Bad words kicker : %s"), DISABLED);
|
||||
info[_("Bad words kicker")] = disabled;
|
||||
|
||||
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]);
|
||||
info[_("Bolds kicker")] = Anope::printf("%s (%d kick(s) to ban)", enabled.c_str(), ci->ttb[TTB_BOLDS]);
|
||||
else
|
||||
source.Reply(_(" Bolds kicker : %s"), ENABLED);
|
||||
info[_("Bolds kicker")] = enabled;
|
||||
}
|
||||
else
|
||||
source.Reply(_(" Bolds kicker : %s"), DISABLED);
|
||||
info[_("Bolds kicker")] = disabled;
|
||||
|
||||
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);
|
||||
info[_("Caps kicker")] = Anope::printf(_("%s (%d kick(s) to ban; minimum %d/%d%%"), enabled.c_str(), ci->ttb[TTB_CAPS], ci->capsmin, ci->capspercent);
|
||||
else
|
||||
source.Reply(_(" Caps kicker : %s (minimum %d/%d%%)"), ENABLED, ci->capsmin, ci->capspercent);
|
||||
info[_("Caps kicker")] = Anope::printf(_("%s (minimum %d/%d%%)"), enabled.c_str(), ci->capsmin, ci->capspercent);
|
||||
}
|
||||
else
|
||||
source.Reply(_(" Caps kicker : %s"), DISABLED);
|
||||
info[_("Caps kicker")] = disabled;
|
||||
|
||||
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]);
|
||||
info[_("Colors kicker")] = Anope::printf(_("%s (%d kick(s) to ban)"), enabled.c_str(), ci->ttb[TTB_COLORS]);
|
||||
else
|
||||
source.Reply(_(" Colors kicker : %s"), ENABLED);
|
||||
info[_("Colors kicker")] = enabled;
|
||||
}
|
||||
else
|
||||
source.Reply(_(" Colors kicker : %s"), DISABLED);
|
||||
info[_("Colors kicker")] = disabled;
|
||||
|
||||
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);
|
||||
info[_("Flood kicker")] = Anope::printf(_("%s (%d kick(s) to ban; %d lines in %ds"), enabled.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);
|
||||
info[_("Flood kicker")] = Anope::printf(_("%s (%d lines in %ds)"), enabled.c_str(), ci->floodlines, ci->floodsecs);
|
||||
}
|
||||
else
|
||||
source.Reply(_(" Flood kicker : %s"), DISABLED);
|
||||
info[_("Flood kicker")] = disabled;
|
||||
|
||||
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);
|
||||
info[_("Repeat kicker")] = Anope::printf(_("%s (%d kick(s) to ban; %d times)"), enabled.c_str(), ci->ttb[TTB_REPEAT], ci->repeattimes);
|
||||
else
|
||||
source.Reply(_(" Repeat kicker : %s (%d times)"), ENABLED, ci->repeattimes);
|
||||
info[_("Repeat kicker")] = Anope::printf(_("%s (%d times)"), enabled.c_str(), ci->repeattimes);
|
||||
}
|
||||
else
|
||||
source.Reply(_(" Repeat kicker : %s"), DISABLED);
|
||||
info[_("Repeat kicker")] = disabled;
|
||||
|
||||
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]);
|
||||
info[_("Reverses kicker")] = Anope::printf(_("%s (%d kick(s) to ban)"), enabled.c_str(), ci->ttb[TTB_REVERSES]);
|
||||
else
|
||||
source.Reply(_(" Reverses kicker : %s"), ENABLED);
|
||||
info[_("Reverses kicker")] = enabled;
|
||||
}
|
||||
else
|
||||
source.Reply(_(" Reverses kicker : %s"), DISABLED);
|
||||
info[_("Reverses kicker")] = disabled;
|
||||
|
||||
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]);
|
||||
info[_("Underlines kicker")] = Anope::printf(_("%s (%d kick(s) to ban)"), enabled.c_str(), ci->ttb[TTB_UNDERLINES]);
|
||||
else
|
||||
source.Reply(_(" Underlines kicker : %s"), ENABLED);
|
||||
info[_("Underlines kicker")] = enabled;
|
||||
}
|
||||
else
|
||||
source.Reply(_(" Underlines kicker : %s"), DISABLED);
|
||||
info[_("Underlines kicker")] = disabled;
|
||||
|
||||
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]);
|
||||
info[_("Italics kicker")] = Anope::printf(_("%s (%d kick(s) to ban)"), enabled.c_str(), ci->ttb[TTB_ITALICS]);
|
||||
else
|
||||
source.Reply(_(" Italics kicker : %s"), ENABLED);
|
||||
info[_("Italics kicker")] = enabled;
|
||||
}
|
||||
else
|
||||
source.Reply(_(" Italics kicker : %s"), DISABLED);
|
||||
info[_("Italics kicker")] = 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]);
|
||||
info[_("AMSG kicker")] = Anope::printf(_("%s (%d kick(s) to ban)"), enabled.c_str(), ci->ttb[TTB_AMSGS]);
|
||||
else
|
||||
source.Reply(_(" AMSG kicker : %s"), ENABLED);
|
||||
info[_("AMSG kicker")] = enabled;
|
||||
}
|
||||
else
|
||||
source.Reply(_(" AMSG kicker : %s"), DISABLED);
|
||||
info[_("AMSG kicker")] = 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");
|
||||
|
||||
end = buf;
|
||||
*end = 0;
|
||||
if (ci->botflags.HasFlag(BS_DONTKICKOPS))
|
||||
{
|
||||
end += snprintf(end, sizeof(buf) - (end - buf), "%s", _("Ops protection"));
|
||||
need_comma = true;
|
||||
}
|
||||
if (ci->botflags.HasFlag(BS_DONTKICKVOICES))
|
||||
{
|
||||
end += snprintf(end, sizeof(buf) - (end - buf), "%s%s", need_comma ? ", " : "", _("Voices protection"));
|
||||
need_comma = true;
|
||||
}
|
||||
if (ci->botflags.HasFlag(BS_FANTASY))
|
||||
{
|
||||
end += snprintf(end, sizeof(buf) - (end - buf), "%s%s", need_comma ? ", " : "", _("Fantasy"));
|
||||
need_comma = true;
|
||||
}
|
||||
if (ci->botflags.HasFlag(BS_GREET))
|
||||
{
|
||||
end += snprintf(end, sizeof(buf) - (end - buf), "%s%s", need_comma ? ", " : "", _("Greet"));
|
||||
need_comma = true;
|
||||
}
|
||||
if (ci->botflags.HasFlag(BS_NOBOT))
|
||||
{
|
||||
end += snprintf(end, sizeof(buf) - (end - buf), "%s%s", need_comma ? ", " : "", _("No bot"));
|
||||
need_comma = true;
|
||||
}
|
||||
source.Reply(_(" Options : %s"), *buf ? buf : _("None"));
|
||||
Anope::string flags;
|
||||
CheckOptStr(flags, BS_DONTKICKOPS, _("Ops protection"), ci->botflags, source.nc);
|
||||
CheckOptStr(flags, BS_DONTKICKVOICES, _("Voices protection"), ci->botflags, source.nc);
|
||||
CheckOptStr(flags, BS_FANTASY, _("Fantasy"), ci->botflags, source.nc);
|
||||
CheckOptStr(flags, BS_GREET, _("Greet"), ci->botflags, source.nc);
|
||||
CheckOptStr(flags, BS_NOBOT, _("No bot"), ci->botflags, source.nc);
|
||||
|
||||
info[_("Options")] = flags.empty() ? _("None") : flags;
|
||||
|
||||
std::vector<Anope::string> replies;
|
||||
info.Process(replies);
|
||||
|
||||
for (unsigned i = 0; i < replies.size(); ++i)
|
||||
source.Reply(replies[i]);
|
||||
}
|
||||
else
|
||||
source.Reply(_("\002%s\002 is not a valid bot or registered channel."), query.c_str());
|
||||
return;
|
||||
}
|
||||
|
||||
bool OnHelp(CommandSource &source, const Anope::string &subcommand)
|
||||
bool OnHelp(CommandSource &source, const Anope::string &subcommand) anope_override
|
||||
{
|
||||
this->SendSyntax(source);
|
||||
source.Reply(" ");
|
||||
@@ -237,7 +243,6 @@ class BSInfo : public Module
|
||||
{
|
||||
this->SetAuthor("Anope");
|
||||
|
||||
ModuleManager::RegisterService(&commandbsinfo);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
+309
-292
@@ -1,6 +1,6 @@
|
||||
/* BotServ core functions
|
||||
*
|
||||
* (C) 2003-2011 Anope Team
|
||||
* (C) 2003-2012 Anope Team
|
||||
* Contact us at team@anope.org
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
@@ -20,17 +20,16 @@ class CommandBSKick : public Command
|
||||
CommandBSKick(Module *creator) : Command(creator, "botserv/kick", 3, 6)
|
||||
{
|
||||
this->SetDesc(_("Configures kickers"));
|
||||
this->SetSyntax(_("\037channel\037 \037option\037 {\037ON|\037} [\037settings\037]"));
|
||||
this->SetSyntax(_("\037channel\037 \037option\037 {\037ON|OFF\037} [\037settings\037]"));
|
||||
}
|
||||
|
||||
void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms) anope_override
|
||||
{
|
||||
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] : "";
|
||||
|
||||
User *u = source.u;
|
||||
ChannelInfo *ci = cs_findchan(params[0]);
|
||||
|
||||
if (readonly)
|
||||
@@ -41,14 +40,14 @@ class CommandBSKick : public Command
|
||||
this->OnSyntaxError(source, "");
|
||||
else if (!value.equals_ci("ON") && !value.equals_ci("OFF"))
|
||||
this->OnSyntaxError(source, "");
|
||||
else if (!ci->AccessFor(u).HasPriv(CA_SET) && !u->HasPriv("botserv/administration"))
|
||||
else if (!source.AccessFor(ci).HasPriv("SET") && !source.HasPriv("botserv/administration"))
|
||||
source.Reply(ACCESS_DENIED);
|
||||
else if (!ci->bi)
|
||||
source.Reply(BOT_NOT_ASSIGNED);
|
||||
else
|
||||
{
|
||||
bool override = !ci->AccessFor(u).HasPriv(CA_SET);
|
||||
Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << option << " " << value;
|
||||
bool override = !source.AccessFor(ci).HasPriv("SET");
|
||||
Log(override ? LOG_OVERRIDE : LOG_COMMAND, source, this, ci) << option << " " << value;
|
||||
|
||||
if (option.equals_ci("BADWORDS"))
|
||||
{
|
||||
@@ -58,7 +57,7 @@ class CommandBSKick : public Command
|
||||
{
|
||||
try
|
||||
{
|
||||
ci->ttb[TTB_BADWORDS] = convertTo<int16>(ttb);
|
||||
ci->ttb[TTB_BADWORDS] = convertTo<int16_t>(ttb);
|
||||
if (ci->ttb[TTB_BADWORDS] < 0)
|
||||
throw ConvertException();
|
||||
}
|
||||
@@ -96,7 +95,7 @@ class CommandBSKick : public Command
|
||||
{
|
||||
try
|
||||
{
|
||||
ci->ttb[TTB_BOLDS] = convertTo<int16>(ttb);
|
||||
ci->ttb[TTB_BOLDS] = convertTo<int16_t>(ttb);
|
||||
if (ci->ttb[TTB_BOLDS] < 0)
|
||||
throw ConvertException();
|
||||
}
|
||||
@@ -132,7 +131,7 @@ class CommandBSKick : public Command
|
||||
{
|
||||
try
|
||||
{
|
||||
ci->ttb[TTB_CAPS] = convertTo<int16>(ttb);
|
||||
ci->ttb[TTB_CAPS] = convertTo<int16_t>(ttb);
|
||||
if (ci->ttb[TTB_CAPS] < 0)
|
||||
throw ConvertException();
|
||||
}
|
||||
@@ -149,7 +148,7 @@ class CommandBSKick : public Command
|
||||
ci->capsmin = 10;
|
||||
try
|
||||
{
|
||||
ci->capsmin = convertTo<int16>(min);
|
||||
ci->capsmin = convertTo<int16_t>(min);
|
||||
}
|
||||
catch (const ConvertException &) { }
|
||||
if (ci->capsmin < 1)
|
||||
@@ -158,7 +157,7 @@ class CommandBSKick : public Command
|
||||
ci->capspercent = 25;
|
||||
try
|
||||
{
|
||||
ci->capspercent = convertTo<int16>(percent);
|
||||
ci->capspercent = convertTo<int16_t>(percent);
|
||||
}
|
||||
catch (const ConvertException &) { }
|
||||
if (ci->capspercent < 1 || ci->capspercent > 100)
|
||||
@@ -187,7 +186,7 @@ class CommandBSKick : public Command
|
||||
{
|
||||
try
|
||||
{
|
||||
ci->ttb[TTB_COLORS] = convertTo<int16>(ttb);
|
||||
ci->ttb[TTB_COLORS] = convertTo<int16_t>(ttb);
|
||||
if (ci->ttb[TTB_COLORS] < 1)
|
||||
throw ConvertException();
|
||||
}
|
||||
@@ -224,7 +223,7 @@ class CommandBSKick : public Command
|
||||
{
|
||||
try
|
||||
{
|
||||
ci->ttb[TTB_FLOOD] = convertTo<int16>(ttb);
|
||||
ci->ttb[TTB_FLOOD] = convertTo<int16_t>(ttb);
|
||||
if (ci->ttb[TTB_FLOOD] < 1)
|
||||
throw ConvertException();
|
||||
}
|
||||
@@ -241,7 +240,7 @@ class CommandBSKick : public Command
|
||||
ci->floodlines = 6;
|
||||
try
|
||||
{
|
||||
ci->floodlines = convertTo<int16>(lines);
|
||||
ci->floodlines = convertTo<int16_t>(lines);
|
||||
}
|
||||
catch (const ConvertException &) { }
|
||||
if (ci->floodlines < 2)
|
||||
@@ -250,7 +249,7 @@ class CommandBSKick : public Command
|
||||
ci->floodsecs = 10;
|
||||
try
|
||||
{
|
||||
ci->floodsecs = convertTo<int16>(secs);
|
||||
ci->floodsecs = convertTo<int16_t>(secs);
|
||||
}
|
||||
catch (const ConvertException &) { }
|
||||
if (ci->floodsecs < 1)
|
||||
@@ -280,7 +279,7 @@ class CommandBSKick : public Command
|
||||
{
|
||||
try
|
||||
{
|
||||
ci->ttb[TTB_REPEAT] = convertTo<int16>(ttb);
|
||||
ci->ttb[TTB_REPEAT] = convertTo<int16_t>(ttb);
|
||||
if (ci->ttb[TTB_REPEAT] < 0)
|
||||
throw ConvertException();
|
||||
}
|
||||
@@ -297,7 +296,7 @@ class CommandBSKick : public Command
|
||||
ci->repeattimes = 3;
|
||||
try
|
||||
{
|
||||
ci->repeattimes = convertTo<int16>(times);
|
||||
ci->repeattimes = convertTo<int16_t>(times);
|
||||
}
|
||||
catch (const ConvertException &) { }
|
||||
if (ci->repeattimes < 2)
|
||||
@@ -305,12 +304,12 @@ class CommandBSKick : public Command
|
||||
|
||||
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"
|
||||
source.Reply(_("Bot will now kick \002repeats\002 (users that say the\n"
|
||||
"same thing %d times), and will place a ban after %d \n"
|
||||
"kicks for the same user."), 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);
|
||||
source.Reply(_("Bot will now kick \002repeats\002 (users that say the\n"
|
||||
"same thing %d times)."), ci->repeattimes);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -326,7 +325,7 @@ class CommandBSKick : public Command
|
||||
{
|
||||
try
|
||||
{
|
||||
ci->ttb[TTB_REVERSES] = convertTo<int16>(ttb);
|
||||
ci->ttb[TTB_REVERSES] = convertTo<int16_t>(ttb);
|
||||
if (ci->ttb[TTB_REVERSES] < 0)
|
||||
throw ConvertException();
|
||||
}
|
||||
@@ -359,7 +358,7 @@ class CommandBSKick : public Command
|
||||
{
|
||||
try
|
||||
{
|
||||
ci->ttb[TTB_UNDERLINES] = convertTo<int16>(ttb);
|
||||
ci->ttb[TTB_UNDERLINES] = convertTo<int16_t>(ttb);
|
||||
if (ci->ttb[TTB_REVERSES] < 0)
|
||||
throw ConvertException();
|
||||
}
|
||||
@@ -393,7 +392,7 @@ class CommandBSKick : public Command
|
||||
{
|
||||
try
|
||||
{
|
||||
ci->ttb[TTB_ITALICS] = convertTo<int16>(ttb);
|
||||
ci->ttb[TTB_ITALICS] = convertTo<int16_t>(ttb);
|
||||
if (ci->ttb[TTB_ITALICS] < 0)
|
||||
throw ConvertException();
|
||||
}
|
||||
@@ -427,7 +426,7 @@ class CommandBSKick : public Command
|
||||
{
|
||||
try
|
||||
{
|
||||
ci->ttb[TTB_AMSGS] = convertTo<int16>(ttb);
|
||||
ci->ttb[TTB_AMSGS] = convertTo<int16_t>(ttb);
|
||||
if (ci->ttb[TTB_AMSGS] < 0)
|
||||
throw ConvertException();
|
||||
}
|
||||
@@ -454,12 +453,12 @@ class CommandBSKick : public Command
|
||||
}
|
||||
}
|
||||
else
|
||||
source.Reply(UNKNOWN_OPTION, Config->UseStrictPrivMsgString.c_str(), option.c_str(), this->name.c_str());
|
||||
this->OnSyntaxError(source, "");
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
bool OnHelp(CommandSource &source, const Anope::string &subcommand)
|
||||
bool OnHelp(CommandSource &source, const Anope::string &subcommand) anope_override
|
||||
{
|
||||
if (subcommand.empty())
|
||||
{
|
||||
@@ -577,26 +576,62 @@ class CommandBSKick : public Command
|
||||
}
|
||||
};
|
||||
|
||||
struct BanData
|
||||
struct BanData : public ExtensibleItem
|
||||
{
|
||||
Anope::string mask;
|
||||
time_t last_use;
|
||||
int16 ttb[TTB_SIZE];
|
||||
|
||||
BanData()
|
||||
struct Data
|
||||
{
|
||||
this->Clear();
|
||||
Anope::string mask;
|
||||
time_t last_use;
|
||||
int16_t ttb[TTB_SIZE];
|
||||
|
||||
Data()
|
||||
{
|
||||
this->Clear();
|
||||
}
|
||||
|
||||
void Clear()
|
||||
{
|
||||
last_use = 0;
|
||||
for (int i = 0; i < TTB_SIZE; ++i)
|
||||
this->ttb[i] = 0;
|
||||
}
|
||||
};
|
||||
|
||||
private:
|
||||
typedef std::map<Anope::string, Data, ci::less> data_type;
|
||||
data_type data_map;
|
||||
|
||||
public:
|
||||
Data &get(const Anope::string &key)
|
||||
{
|
||||
return this->data_map[key];
|
||||
}
|
||||
|
||||
void Clear()
|
||||
bool empty() const
|
||||
{
|
||||
last_use = 0;
|
||||
for (int i = 0; i < TTB_SIZE; ++i)
|
||||
this->ttb[i] = 0;
|
||||
return this->data_map.empty();
|
||||
}
|
||||
|
||||
void purge()
|
||||
{
|
||||
for (data_type::iterator it = data_map.begin(), it_end = data_map.end(); it != it_end;)
|
||||
{
|
||||
const Anope::string &user = it->first;
|
||||
Data &bd = it->second;
|
||||
++it;
|
||||
|
||||
if (Anope::CurTime - bd.last_use > Config->BSKeepData)
|
||||
data_map.erase(user);
|
||||
}
|
||||
}
|
||||
|
||||
void OnDelete() anope_override
|
||||
{
|
||||
delete this;
|
||||
}
|
||||
};
|
||||
|
||||
struct UserData
|
||||
struct UserData : public ExtensibleItem
|
||||
{
|
||||
UserData()
|
||||
{
|
||||
@@ -614,13 +649,19 @@ struct UserData
|
||||
time_t last_use;
|
||||
|
||||
/* for flood kicker */
|
||||
int16 lines;
|
||||
int16_t lines;
|
||||
time_t last_start;
|
||||
|
||||
/* for repeat kicker */
|
||||
Anope::string lastline;
|
||||
Anope::string lasttarget;
|
||||
int16 times;
|
||||
int16_t times;
|
||||
|
||||
Anope::string lastline;
|
||||
|
||||
void OnDelete() anope_override
|
||||
{
|
||||
delete this;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -629,31 +670,19 @@ class BanDataPurger : public CallBack
|
||||
public:
|
||||
BanDataPurger(Module *owner) : CallBack(owner, 300, Anope::CurTime, true) { }
|
||||
|
||||
void Tick(time_t)
|
||||
void Tick(time_t) anope_override
|
||||
{
|
||||
Log(LOG_DEBUG) << "bs_main: Running bandata purger";
|
||||
|
||||
for (channel_map::iterator it = ChannelList.begin(), it_end = ChannelList.end(); it != it_end; ++it)
|
||||
{
|
||||
Channel *c = it->second;
|
||||
|
||||
std::map<Anope::string, BanData> bandata;
|
||||
if (c->GetExtRegular("bs_main_bandata", bandata))
|
||||
|
||||
BanData *bd = c->GetExt<BanData *>("bs_main_bandata");
|
||||
if (bd != NULL)
|
||||
{
|
||||
for (std::map<Anope::string, BanData>::iterator it2 = bandata.begin(), it2_end = bandata.end(); it2 != it2_end;)
|
||||
{
|
||||
const Anope::string &user = it2->first;
|
||||
BanData *bd = &it2->second;
|
||||
++it2;
|
||||
|
||||
if (Anope::CurTime - bd->last_use > Config->BSKeepData)
|
||||
{
|
||||
bandata.erase(user);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (bandata.empty())
|
||||
bd->purge();
|
||||
if (bd->empty())
|
||||
c->Shrink("bs_main_bandata");
|
||||
}
|
||||
}
|
||||
@@ -665,30 +694,32 @@ class BSKick : public Module
|
||||
CommandBSKick commandbskick;
|
||||
BanDataPurger purger;
|
||||
|
||||
BanData *GetBanData(User *u, Channel *c)
|
||||
BanData::Data &GetBanData(User *u, Channel *c)
|
||||
{
|
||||
std::map<Anope::string, BanData> bandatamap;
|
||||
if (!c->GetExtRegular("bs_main_bandata", bandatamap));
|
||||
c->Extend("bs_main_bandata", new ExtensibleItemRegular<std::map<Anope::string, BanData> >(bandatamap));
|
||||
c->GetExtRegular("bs_main_bandata", bandatamap);
|
||||
BanData *bd = c->GetExt<BanData *>("bs_main_bandata");
|
||||
if (bd == NULL)
|
||||
{
|
||||
bd = new BanData();
|
||||
c->Extend("bs_main_bandata", bd);
|
||||
}
|
||||
|
||||
BanData *bd = &bandatamap[u->GetMask()];
|
||||
if (bd->last_use && Anope::CurTime - bd->last_use > Config->BSKeepData)
|
||||
bd->Clear();
|
||||
bd->last_use = Anope::CurTime;
|
||||
return bd;
|
||||
return bd->get(u->GetMask());
|
||||
}
|
||||
|
||||
UserData *GetUserData(User *u, Channel *c)
|
||||
{
|
||||
UserData *ud = NULL;
|
||||
UserContainer *uc = c->FindUser(u);
|
||||
if (uc != NULL && !uc->GetExtPointer("bs_main_userdata", ud))
|
||||
if (uc == NULL)
|
||||
return NULL;
|
||||
|
||||
UserData *ud = uc->GetExt<UserData *>("bs_main_userdata");
|
||||
if (ud == NULL)
|
||||
{
|
||||
ud = new UserData();
|
||||
uc->Extend("bs_main_userdata", new ExtensibleItemPointer<UserData>(ud));
|
||||
uc->Extend("bs_main_userdata", ud);
|
||||
}
|
||||
return ud;
|
||||
|
||||
return ud;
|
||||
}
|
||||
|
||||
void check_ban(ChannelInfo *ci, User *u, int ttbtype)
|
||||
@@ -697,17 +728,17 @@ class BSKick : public Module
|
||||
if (u->server->IsULined())
|
||||
return;
|
||||
|
||||
BanData *bd = this->GetBanData(u, ci->c);
|
||||
BanData::Data &bd = this->GetBanData(u, ci->c);
|
||||
|
||||
++bd->ttb[ttbtype];
|
||||
if (ci->ttb[ttbtype] && bd->ttb[ttbtype] >= ci->ttb[ttbtype])
|
||||
++bd.ttb[ttbtype];
|
||||
if (ci->ttb[ttbtype] && bd.ttb[ttbtype] >= ci->ttb[ttbtype])
|
||||
{
|
||||
/* Should not use == here because bd->ttb[ttbtype] could possibly be > ci->ttb[ttbtype]
|
||||
/* Should not use == here because bd.ttb[ttbtype] could possibly be > ci->ttb[ttbtype]
|
||||
* if the TTB was changed after it was not set (0) before and the user had already been
|
||||
* kicked a few times. Bug #1056 - Adam */
|
||||
Anope::string mask;
|
||||
|
||||
bd->ttb[ttbtype] = 0;
|
||||
bd.ttb[ttbtype] = 0;
|
||||
|
||||
get_idealban(ci, u, mask);
|
||||
|
||||
@@ -722,7 +753,7 @@ class BSKick : public Module
|
||||
va_list args;
|
||||
char buf[1024];
|
||||
|
||||
if (!ci || !ci->bi || !ci->c || !u || u->server->IsULined())
|
||||
if (!ci || !ci->bi || !ci->c || !u || u->server->IsULined() || !ci->c->FindUser(u))
|
||||
return;
|
||||
|
||||
Anope::string fmt = translate(u, message);
|
||||
@@ -739,8 +770,6 @@ class BSKick : public Module
|
||||
{
|
||||
this->SetAuthor("Anope");
|
||||
|
||||
ModuleManager::RegisterService(&commandbskick);
|
||||
|
||||
ModuleManager::Attach(I_OnPrivmsg, this);
|
||||
}
|
||||
|
||||
@@ -748,12 +777,14 @@ class BSKick : public Module
|
||||
{
|
||||
for (channel_map::const_iterator cit = ChannelList.begin(), cit_end = ChannelList.end(); cit != cit_end; ++cit)
|
||||
{
|
||||
cit->second->Shrink("bs_main_userdata");
|
||||
cit->second->Shrink("bs_main_bandata");
|
||||
Channel *c = cit->second;
|
||||
for (CUserList::iterator it = c->users.begin(), it_end = c->users.end(); it != it_end; ++it)
|
||||
(*it)->Shrink("bs_main_userdata");
|
||||
c->Shrink("bs_main_bandata");
|
||||
}
|
||||
}
|
||||
|
||||
void OnPrivmsg(User *u, Channel *c, Anope::string &msg)
|
||||
void OnPrivmsg(User *u, Channel *c, Anope::string &msg) anope_override
|
||||
{
|
||||
/* Now we can make kicker stuff. We try to order the checks
|
||||
* from the fastest one to the slowest one, since there's
|
||||
@@ -768,242 +799,228 @@ class BSKick : public Module
|
||||
return;
|
||||
|
||||
bool Allow = true;
|
||||
if (ci->AccessFor(u).HasPriv(CA_NOKICK))
|
||||
if (ci->AccessFor(u).HasPriv("NOKICK"))
|
||||
Allow = false;
|
||||
else if (ci->botflags.HasFlag(BS_DONTKICKOPS) && (c->HasUserStatus(u, CMODE_HALFOP) || c->HasUserStatus(u, CMODE_OP) || c->HasUserStatus(u, CMODE_PROTECT) || c->HasUserStatus(u, CMODE_OWNER)))
|
||||
Allow = false;
|
||||
else if (ci->botflags.HasFlag(BS_DONTKICKVOICES) && c->HasUserStatus(u, CMODE_VOICE))
|
||||
Allow = false;
|
||||
|
||||
if (Allow)
|
||||
if (!Allow)
|
||||
return;
|
||||
|
||||
Anope::string realbuf = msg;
|
||||
|
||||
/* If it's a /me, cut the CTCP part because the ACTION will cause
|
||||
* problems with the caps or badwords kicker
|
||||
*/
|
||||
if (realbuf.substr(0, 8).equals_ci("\1ACTION ") && realbuf[realbuf.length() - 1] == '\1')
|
||||
{
|
||||
Anope::string realbuf = msg;
|
||||
realbuf.erase(0, 8);
|
||||
realbuf.erase(realbuf.length() - 1);
|
||||
}
|
||||
|
||||
/* If it's a /me, cut the CTCP part because the ACTION will cause
|
||||
* problems with the caps or badwords kicker
|
||||
if (realbuf.empty())
|
||||
return;
|
||||
|
||||
/* Bolds kicker */
|
||||
if (ci->botflags.HasFlag(BS_KICK_BOLDS) && realbuf.find(2) != Anope::string::npos)
|
||||
{
|
||||
check_ban(ci, u, TTB_BOLDS);
|
||||
bot_kick(ci, u, _("Don't use bolds on this channel!"));
|
||||
return;
|
||||
}
|
||||
|
||||
/* Color kicker */
|
||||
if (ci->botflags.HasFlag(BS_KICK_COLORS) && realbuf.find(3) != Anope::string::npos)
|
||||
{
|
||||
check_ban(ci, u, TTB_COLORS);
|
||||
bot_kick(ci, u, _("Don't use colors on this channel!"));
|
||||
return;
|
||||
}
|
||||
|
||||
/* Reverses kicker */
|
||||
if (ci->botflags.HasFlag(BS_KICK_REVERSES) && realbuf.find(22) != Anope::string::npos)
|
||||
{
|
||||
check_ban(ci, u, TTB_REVERSES);
|
||||
bot_kick(ci, u, _("Don't use reverses on this channel!"));
|
||||
return;
|
||||
}
|
||||
|
||||
/* Italics kicker */
|
||||
if (ci->botflags.HasFlag(BS_KICK_ITALICS) && realbuf.find(29) != Anope::string::npos)
|
||||
{
|
||||
check_ban(ci, u, TTB_ITALICS);
|
||||
bot_kick(ci, u, _("Don't use italics on this channel!"));
|
||||
return;
|
||||
}
|
||||
|
||||
/* Underlines kicker */
|
||||
if (ci->botflags.HasFlag(BS_KICK_UNDERLINES) && realbuf.find(31) != Anope::string::npos)
|
||||
{
|
||||
check_ban(ci, u, TTB_UNDERLINES);
|
||||
bot_kick(ci, u, _("Don't use underlines on this channel!"));
|
||||
return;
|
||||
}
|
||||
|
||||
/* Caps kicker */
|
||||
if (ci->botflags.HasFlag(BS_KICK_CAPS) && realbuf.length() >= static_cast<unsigned>(ci->capsmin))
|
||||
{
|
||||
int i = 0, l = 0;
|
||||
|
||||
for (unsigned j = 0, end = realbuf.length(); j < end; ++j)
|
||||
{
|
||||
if (isupper(realbuf[j]))
|
||||
++i;
|
||||
else if (islower(realbuf[j]))
|
||||
++l;
|
||||
}
|
||||
|
||||
/* i counts uppercase chars, l counts lowercase chars. Only
|
||||
* alphabetic chars (so islower || isupper) qualify for the
|
||||
* percentage of caps to kick for; the rest is ignored. -GD
|
||||
*/
|
||||
if (realbuf.substr(0, 8).equals_ci("\1ACTION ") && realbuf[realbuf.length() - 1] == '\1')
|
||||
{
|
||||
realbuf.erase(0, 8);
|
||||
realbuf.erase(realbuf.length() - 1);
|
||||
}
|
||||
|
||||
if (realbuf.empty())
|
||||
return;
|
||||
|
||||
/* Bolds kicker */
|
||||
if (ci->botflags.HasFlag(BS_KICK_BOLDS) && realbuf.find(2) != Anope::string::npos)
|
||||
if ((i || l) && i >= ci->capsmin && i * 100 / (i + l) >= ci->capspercent)
|
||||
{
|
||||
check_ban(ci, u, TTB_BOLDS);
|
||||
bot_kick(ci, u, _("Don't use bolds on this channel!"));
|
||||
check_ban(ci, u, TTB_CAPS);
|
||||
bot_kick(ci, u, _("Turn caps lock OFF!"));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/* Color kicker */
|
||||
if (ci->botflags.HasFlag(BS_KICK_COLORS) && realbuf.find(3) != Anope::string::npos)
|
||||
{
|
||||
check_ban(ci, u, TTB_COLORS);
|
||||
bot_kick(ci, u, _("Don't use colors on this channel!"));
|
||||
return;
|
||||
}
|
||||
/* Bad words kicker */
|
||||
if (ci->botflags.HasFlag(BS_KICK_BADWORDS))
|
||||
{
|
||||
bool mustkick = false;
|
||||
|
||||
/* Reverses kicker */
|
||||
if (ci->botflags.HasFlag(BS_KICK_REVERSES) && realbuf.find(22) != Anope::string::npos)
|
||||
{
|
||||
check_ban(ci, u, TTB_REVERSES);
|
||||
bot_kick(ci, u, _("Don't use reverses on this channel!"));
|
||||
return;
|
||||
}
|
||||
/* Normalize the buffer */
|
||||
Anope::string nbuf = normalizeBuffer(realbuf);
|
||||
|
||||
/* Italics kicker */
|
||||
if (ci->botflags.HasFlag(BS_KICK_ITALICS) && realbuf.find(29) != Anope::string::npos)
|
||||
for (unsigned i = 0, end = ci->GetBadWordCount(); i < end; ++i)
|
||||
{
|
||||
check_ban(ci, u, TTB_ITALICS);
|
||||
bot_kick(ci, u, _("Don't use italics on this channel!"));
|
||||
return;
|
||||
}
|
||||
const BadWord *bw = ci->GetBadWord(i);
|
||||
|
||||
/* Underlines kicker */
|
||||
if (ci->botflags.HasFlag(BS_KICK_UNDERLINES) && realbuf.find(31) != Anope::string::npos)
|
||||
{
|
||||
check_ban(ci, u, TTB_UNDERLINES);
|
||||
bot_kick(ci, u, _("Don't use underlines on this channel!"));
|
||||
return;
|
||||
}
|
||||
|
||||
/* Caps kicker */
|
||||
if (ci->botflags.HasFlag(BS_KICK_CAPS) && realbuf.length() >= ci->capsmin)
|
||||
{
|
||||
int i = 0, l = 0;
|
||||
|
||||
for (unsigned j = 0, end = realbuf.length(); j < end; ++j)
|
||||
if (bw->type == BW_ANY && ((Config->BSCaseSensitive && nbuf.find(bw->word) != Anope::string::npos) || (!Config->BSCaseSensitive && nbuf.find_ci(bw->word) != Anope::string::npos)))
|
||||
mustkick = true;
|
||||
else if (bw->type == BW_SINGLE)
|
||||
{
|
||||
if (isupper(realbuf[j]))
|
||||
++i;
|
||||
else if (islower(realbuf[j]))
|
||||
++l;
|
||||
size_t len = bw->word.length();
|
||||
|
||||
if ((Config->BSCaseSensitive && bw->word.equals_cs(nbuf)) || (!Config->BSCaseSensitive && bw->word.equals_ci(nbuf)))
|
||||
mustkick = true;
|
||||
else if (nbuf.find(' ') == len && ((Config->BSCaseSensitive && bw->word.equals_cs(nbuf)) || (!Config->BSCaseSensitive && bw->word.equals_ci(nbuf))))
|
||||
mustkick = true;
|
||||
else
|
||||
{
|
||||
if (nbuf.rfind(' ') == nbuf.length() - len - 1 && ((Config->BSCaseSensitive && nbuf.find(bw->word) == nbuf.length() - len) || (!Config->BSCaseSensitive && nbuf.find_ci(bw->word) == nbuf.length() - len)))
|
||||
mustkick = true;
|
||||
else
|
||||
{
|
||||
Anope::string wordbuf = " " + bw->word + " ";
|
||||
|
||||
if ((Config->BSCaseSensitive && nbuf.find(wordbuf) != Anope::string::npos) || (!Config->BSCaseSensitive && nbuf.find_ci(wordbuf) != Anope::string::npos))
|
||||
mustkick = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (bw->type == BW_START)
|
||||
{
|
||||
size_t len = bw->word.length();
|
||||
|
||||
if ((Config->BSCaseSensitive && nbuf.substr(0, len).equals_cs(bw->word)) || (!Config->BSCaseSensitive && nbuf.substr(0, len).equals_ci(bw->word)))
|
||||
mustkick = true;
|
||||
else
|
||||
{
|
||||
Anope::string wordbuf = " " + bw->word;
|
||||
|
||||
if ((Config->BSCaseSensitive && nbuf.find(wordbuf) != Anope::string::npos) || (!Config->BSCaseSensitive && nbuf.find_ci(wordbuf) != Anope::string::npos))
|
||||
mustkick = true;
|
||||
}
|
||||
}
|
||||
else if (bw->type == BW_END)
|
||||
{
|
||||
size_t len = bw->word.length();
|
||||
|
||||
if ((Config->BSCaseSensitive && nbuf.substr(nbuf.length() - len).equals_cs(bw->word)) || (!Config->BSCaseSensitive && nbuf.substr(nbuf.length() - len).equals_ci(bw->word)))
|
||||
mustkick = true;
|
||||
else
|
||||
{
|
||||
Anope::string wordbuf = bw->word + " ";
|
||||
|
||||
if ((Config->BSCaseSensitive && nbuf.find(wordbuf) != Anope::string::npos) || (!Config->BSCaseSensitive && nbuf.find_ci(wordbuf) != Anope::string::npos))
|
||||
mustkick = true;
|
||||
}
|
||||
}
|
||||
|
||||
/* i counts uppercase chars, l counts lowercase chars. Only
|
||||
* alphabetic chars (so islower || isupper) qualify for the
|
||||
* percentage of caps to kick for; the rest is ignored. -GD
|
||||
*/
|
||||
|
||||
if ((i || l) && i >= ci->capsmin && i * 100 / (i + l) >= ci->capspercent)
|
||||
if (mustkick)
|
||||
{
|
||||
check_ban(ci, u, TTB_CAPS);
|
||||
bot_kick(ci, u, _("Turn caps lock OFF!"));
|
||||
check_ban(ci, u, TTB_BADWORDS);
|
||||
if (Config->BSGentleBWReason)
|
||||
bot_kick(ci, u, _("Watch your language!"));
|
||||
else
|
||||
bot_kick(ci, u, _("Don't use the word \"%s\" on this channel!"), bw->word.c_str());
|
||||
|
||||
return;
|
||||
}
|
||||
} /* for */
|
||||
} /* if badwords */
|
||||
|
||||
UserData *ud = GetUserData(u, c);
|
||||
|
||||
if (ud)
|
||||
{
|
||||
/* Flood kicker */
|
||||
if (ci->botflags.HasFlag(BS_KICK_FLOOD))
|
||||
{
|
||||
if (Anope::CurTime - ud->last_start > ci->floodsecs)
|
||||
{
|
||||
ud->last_start = Anope::CurTime;
|
||||
ud->lines = 0;
|
||||
}
|
||||
|
||||
++ud->lines;
|
||||
if (ud->lines >= ci->floodlines)
|
||||
{
|
||||
check_ban(ci, u, TTB_FLOOD);
|
||||
bot_kick(ci, u, _("Stop flooding!"));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/* Bad words kicker */
|
||||
if (ci->botflags.HasFlag(BS_KICK_BADWORDS))
|
||||
|
||||
/* Repeat kicker */
|
||||
if (ci->botflags.HasFlag(BS_KICK_REPEAT))
|
||||
{
|
||||
bool mustkick = false;
|
||||
if (!ud->lastline.equals_ci(realbuf))
|
||||
ud->times = 0;
|
||||
else
|
||||
++ud->times;
|
||||
|
||||
/* Normalize the buffer */
|
||||
Anope::string nbuf = normalizeBuffer(realbuf);
|
||||
|
||||
for (unsigned i = 0, end = ci->GetBadWordCount(); i < end; ++i)
|
||||
if (ud->times >= ci->repeattimes)
|
||||
{
|
||||
BadWord *bw = ci->GetBadWord(i);
|
||||
|
||||
if (bw->type == BW_ANY && ((Config->BSCaseSensitive && nbuf.find(bw->word) != Anope::string::npos) || (!Config->BSCaseSensitive && nbuf.find_ci(bw->word) != Anope::string::npos)))
|
||||
mustkick = true;
|
||||
else if (bw->type == BW_SINGLE)
|
||||
{
|
||||
size_t len = bw->word.length();
|
||||
|
||||
if ((Config->BSCaseSensitive && bw->word.equals_cs(nbuf)) || (!Config->BSCaseSensitive && bw->word.equals_ci(nbuf)))
|
||||
mustkick = true;
|
||||
else if (nbuf.find(' ') == len && ((Config->BSCaseSensitive && bw->word.equals_cs(nbuf)) || (!Config->BSCaseSensitive && bw->word.equals_ci(nbuf))))
|
||||
mustkick = true;
|
||||
else
|
||||
{
|
||||
if (nbuf.rfind(' ') == nbuf.length() - len - 1 && ((Config->BSCaseSensitive && nbuf.find(bw->word) == nbuf.length() - len) || (!Config->BSCaseSensitive && nbuf.find_ci(bw->word) == nbuf.length() - len)))
|
||||
mustkick = true;
|
||||
else
|
||||
{
|
||||
Anope::string wordbuf = " " + bw->word + " ";
|
||||
|
||||
if ((Config->BSCaseSensitive && nbuf.find(wordbuf) != Anope::string::npos) || (!Config->BSCaseSensitive && nbuf.find_ci(wordbuf) != Anope::string::npos))
|
||||
mustkick = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (bw->type == BW_START)
|
||||
{
|
||||
size_t len = bw->word.length();
|
||||
|
||||
if ((Config->BSCaseSensitive && nbuf.substr(0, len).equals_cs(bw->word)) || (!Config->BSCaseSensitive && nbuf.substr(0, len).equals_ci(bw->word)))
|
||||
mustkick = true;
|
||||
else
|
||||
{
|
||||
Anope::string wordbuf = " " + bw->word;
|
||||
|
||||
if ((Config->BSCaseSensitive && nbuf.find(wordbuf) != Anope::string::npos) || (!Config->BSCaseSensitive && nbuf.find_ci(wordbuf) != Anope::string::npos))
|
||||
mustkick = true;
|
||||
}
|
||||
}
|
||||
else if (bw->type == BW_END)
|
||||
{
|
||||
size_t len = bw->word.length();
|
||||
|
||||
if ((Config->BSCaseSensitive && nbuf.substr(nbuf.length() - len).equals_cs(bw->word)) || (!Config->BSCaseSensitive && nbuf.substr(nbuf.length() - len).equals_ci(bw->word)))
|
||||
mustkick = true;
|
||||
else
|
||||
{
|
||||
Anope::string wordbuf = bw->word + " ";
|
||||
|
||||
if ((Config->BSCaseSensitive && nbuf.find(wordbuf) != Anope::string::npos) || (!Config->BSCaseSensitive && nbuf.find_ci(wordbuf) != Anope::string::npos))
|
||||
mustkick = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (mustkick)
|
||||
{
|
||||
check_ban(ci, u, TTB_BADWORDS);
|
||||
if (Config->BSGentleBWReason)
|
||||
bot_kick(ci, u, _("Watch your language!"));
|
||||
else
|
||||
bot_kick(ci, u, _("Don't use the word \"%s\" on this channel!"), bw->word.c_str());
|
||||
|
||||
return;
|
||||
}
|
||||
check_ban(ci, u, TTB_REPEAT);
|
||||
bot_kick(ci, u, _("Stop repeating yourself!"));
|
||||
return;
|
||||
}
|
||||
|
||||
UserData *ud = NULL;
|
||||
|
||||
/* Flood kicker */
|
||||
if (ci->botflags.HasFlag(BS_KICK_FLOOD))
|
||||
{
|
||||
ud = GetUserData(u, c);
|
||||
if (ud)
|
||||
{
|
||||
if (Anope::CurTime - ud->last_start > ci->floodsecs)
|
||||
{
|
||||
ud->last_start = Anope::CurTime;
|
||||
ud->lines = 0;
|
||||
}
|
||||
|
||||
++ud->lines;
|
||||
if (ud->lines >= ci->floodlines)
|
||||
{
|
||||
check_ban(ci, u, TTB_FLOOD);
|
||||
bot_kick(ci, u, _("Stop flooding!"));
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Repeat kicker */
|
||||
if (ci->botflags.HasFlag(BS_KICK_REPEAT))
|
||||
{
|
||||
if (!ud)
|
||||
ud = GetUserData(u, c);
|
||||
if (ud)
|
||||
{
|
||||
|
||||
if (!ud->lastline.empty() && !ud->lastline.equals_ci(realbuf))
|
||||
{
|
||||
ud->lastline = realbuf;
|
||||
ud->times = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (ud->lastline.empty())
|
||||
ud->lastline = realbuf;
|
||||
++ud->times;
|
||||
}
|
||||
|
||||
if (ud->times >= ci->repeattimes)
|
||||
{
|
||||
check_ban(ci, u, TTB_REPEAT);
|
||||
bot_kick(ci, u, _("Stop repeating yourself!"));
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (ud && ud->lastline.equals_ci(realbuf) && !ud->lasttarget.empty() && !ud->lasttarget.equals_ci(ci->name))
|
||||
{
|
||||
for (UChannelList::iterator it = u->chans.begin(); it != u->chans.end();)
|
||||
{
|
||||
Channel *chan = (*it)->chan;
|
||||
++it;
|
||||
|
||||
if (chan->ci != NULL && chan->ci->botflags.HasFlag(BS_KICK_AMSGS) && !chan->ci->AccessFor(u).HasPriv(CA_NOKICK))
|
||||
{
|
||||
check_ban(chan->ci, u, TTB_AMSGS);
|
||||
bot_kick(chan->ci, u, _("Don't use AMSGs!"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (ud)
|
||||
ud->lasttarget = ci->name;
|
||||
}
|
||||
|
||||
if (ud->lastline.equals_ci(realbuf) && !ud->lasttarget.empty() && !ud->lasttarget.equals_ci(ci->name))
|
||||
{
|
||||
for (UChannelList::iterator it = u->chans.begin(); it != u->chans.end();)
|
||||
{
|
||||
Channel *chan = (*it)->chan;
|
||||
++it;
|
||||
|
||||
if (chan->ci && chan->ci->botflags.HasFlag(BS_KICK_AMSGS) && !chan->ci->AccessFor(u).HasPriv("NOKICK"))
|
||||
{
|
||||
check_ban(chan->ci, u, TTB_AMSGS);
|
||||
bot_kick(chan->ci, u, _("Don't use AMSGs!"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ud->lasttarget = ci->name;
|
||||
ud->lastline = realbuf;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
+25
-262
@@ -1,6 +1,6 @@
|
||||
/* BotServ core functions
|
||||
*
|
||||
* (C) 2003-2011 Anope Team
|
||||
* (C) 2003-2012 Anope Team
|
||||
* Contact us at team@anope.org
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
@@ -19,277 +19,41 @@ class CommandBSSet : public Command
|
||||
CommandBSSet(Module *creator) : Command(creator, "botserv/set", 3, 3)
|
||||
{
|
||||
this->SetDesc(_("Configures bot options"));
|
||||
this->SetSyntax(_("\037(channel | bot)\037 \037option\037 \037settings\037"));
|
||||
this->SetSyntax(_("\037option\037 \037(channel | bot)\037 \037settings\037"));
|
||||
}
|
||||
|
||||
void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms) anope_override
|
||||
{
|
||||
const Anope::string &chan = params[0];
|
||||
const Anope::string &option = params[1];
|
||||
const Anope::string &value = params[2];
|
||||
|
||||
User *u = source.u;
|
||||
ChannelInfo *ci;
|
||||
|
||||
if (readonly)
|
||||
source.Reply(_("Sorry, bot option setting is temporarily disabled."));
|
||||
else if (u->HasCommand("botserv/set/private") && option.equals_ci("PRIVATE"))
|
||||
{
|
||||
BotInfo *bi;
|
||||
|
||||
if (!(bi = findbot(chan)))
|
||||
{
|
||||
source.Reply(BOT_DOES_NOT_EXIST, chan.c_str());
|
||||
return;
|
||||
}
|
||||
|
||||
if (value.equals_ci("ON"))
|
||||
{
|
||||
bi->SetFlag(BI_PRIVATE);
|
||||
source.Reply(_("Private mode of bot %s is now \002on\002."), 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());
|
||||
}
|
||||
else
|
||||
this->OnSyntaxError(source, "PRIVATE");
|
||||
return;
|
||||
}
|
||||
else if (!(ci = cs_findchan(chan)))
|
||||
source.Reply(CHAN_X_NOT_REGISTERED, chan.c_str());
|
||||
else if (!u->HasPriv("botserv/administration") && !ci->AccessFor(u).HasPriv(CA_SET))
|
||||
source.Reply(ACCESS_DENIED);
|
||||
else
|
||||
{
|
||||
bool override = !ci->AccessFor(u).HasPriv(CA_SET);
|
||||
Log(override ? LOG_ADMIN : LOG_COMMAND, u, this, ci) << option << " " << value;
|
||||
|
||||
if (option.equals_ci("DONTKICKOPS"))
|
||||
{
|
||||
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());
|
||||
}
|
||||
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());
|
||||
}
|
||||
else
|
||||
this->OnSyntaxError(source, "DONTKICKOPS");
|
||||
}
|
||||
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());
|
||||
}
|
||||
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());
|
||||
}
|
||||
else
|
||||
this->OnSyntaxError(source, "DONTKICKVOICE");
|
||||
}
|
||||
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());
|
||||
}
|
||||
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());
|
||||
}
|
||||
else
|
||||
this->OnSyntaxError(source, "FANTASY");
|
||||
}
|
||||
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());
|
||||
}
|
||||
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());
|
||||
}
|
||||
else
|
||||
this->OnSyntaxError(source, "GREET");
|
||||
}
|
||||
else if (u->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());
|
||||
}
|
||||
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());
|
||||
}
|
||||
else
|
||||
this->OnSyntaxError(source, "NOBOT");
|
||||
}
|
||||
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
|
||||
this->OnSyntaxError(source, "MSG");
|
||||
}
|
||||
else
|
||||
this->OnSyntaxError(source, "");
|
||||
}
|
||||
|
||||
return;
|
||||
this->OnSyntaxError(source, "");
|
||||
}
|
||||
|
||||
bool OnHelp(CommandSource &source, const Anope::string &subcommand)
|
||||
bool OnHelp(CommandSource &source, const Anope::string &subcommand) anope_override
|
||||
{
|
||||
if (subcommand.empty())
|
||||
this->SendSyntax(source);
|
||||
source.Reply(" ");
|
||||
source.Reply(_("Configures bot options.\n"
|
||||
" \n"
|
||||
"Available options:"));
|
||||
Anope::string this_name = source.command;
|
||||
for (BotInfo::command_map::const_iterator it = source.owner->commands.begin(), it_end = source.owner->commands.end(); it != it_end; ++it)
|
||||
{
|
||||
this->SendSyntax(source);
|
||||
source.Reply(" ");
|
||||
source.Reply(_("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"
|
||||
" 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(), source.owner->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"));
|
||||
const Anope::string &c_name = it->first;
|
||||
const CommandInfo &info = it->second;
|
||||
if (c_name.find_ci(this_name + " ") == 0)
|
||||
{
|
||||
service_reference<Command> command("Command", info.name);
|
||||
if (command)
|
||||
{
|
||||
source.command = it->first;
|
||||
command->OnServHelp(source);
|
||||
}
|
||||
}
|
||||
}
|
||||
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."));
|
||||
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."));
|
||||
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)."));
|
||||
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."));
|
||||
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."));
|
||||
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."));
|
||||
else
|
||||
return false;
|
||||
source.Reply(_("Type \002%s%s HELP SET \037option\037\002 for more information on a\n"
|
||||
"particular option."), Config->UseStrictPrivMsgString.c_str(), source.owner->nick.c_str());
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void OnSyntaxError(CommandSource &source, const Anope::string &subcommand)
|
||||
{
|
||||
if (subcommand.empty())
|
||||
Command::OnSyntaxError(source, "");
|
||||
else if (subcommand.equals_ci("PRIVATE"))
|
||||
this->SendSyntax(source, "\037botname\037 PRIVATE {\037ON|OFF\037}");
|
||||
else if (subcommand.equals_ci("DONTKICKOPS"))
|
||||
this->SendSyntax(source, "\037channel\037 DONTKICKOPS {\037ON|OFF\037}");
|
||||
else if (subcommand.equals_ci("DONTKICKVOICES"))
|
||||
this->SendSyntax(source, "\037channel\037 DONTKICKVOICES {\037ON|OFF\037}");
|
||||
else if (subcommand.equals_ci("FANTASY"))
|
||||
this->SendSyntax(source, "\037channel\037 FANTASY {\037ON|OFF\037}");
|
||||
else if (subcommand.equals_ci("GREET"))
|
||||
this->SendSyntax(source, "\037channel\037 GREET {\037ON|OFF\037}");
|
||||
else if (subcommand.equals_ci("MSG"))
|
||||
this->SendSyntax(source, "\037channel\037 MSG {\037PRIVMSG|NOTICE|NOTICEOPS|OFF\037}");
|
||||
else if (subcommand.equals_ci("NOBOT"))
|
||||
this->SendSyntax(source, "\037channel\037 NOBOT {\037ON|OFF\037}");
|
||||
else
|
||||
this->OnSyntaxError(source, "");
|
||||
}
|
||||
};
|
||||
|
||||
class BSSet : public Module
|
||||
@@ -302,7 +66,6 @@ class BSSet : public Module
|
||||
{
|
||||
this->SetAuthor("Anope");
|
||||
|
||||
ModuleManager::RegisterService(&commandbsset);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -0,0 +1,90 @@
|
||||
/* BotServ core functions
|
||||
*
|
||||
* (C) 2003-2012 Anope Team
|
||||
* Contact us at team@anope.org
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
*
|
||||
* Based on the original code of Epona by Lara.
|
||||
* Based on the original code of Services by Andy Church.
|
||||
*/
|
||||
|
||||
/*************************************************************************/
|
||||
|
||||
#include "module.h"
|
||||
|
||||
class CommandBSSetDontKickOps : public Command
|
||||
{
|
||||
public:
|
||||
CommandBSSetDontKickOps(Module *creator, const Anope::string &sname = "botserv/set/dontkickops") : Command(creator, sname, 2, 2)
|
||||
{
|
||||
this->SetDesc(_("To protect ops against bot kicks"));
|
||||
this->SetSyntax(_("\037channel\037 {ON | OFF}"));
|
||||
}
|
||||
|
||||
void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms) anope_override
|
||||
{
|
||||
ChannelInfo *ci = cs_findchan(params[0]);
|
||||
if (ci == NULL)
|
||||
{
|
||||
source.Reply(CHAN_X_NOT_REGISTERED, params[0].c_str());
|
||||
return;
|
||||
}
|
||||
|
||||
AccessGroup access = source.AccessFor(ci);
|
||||
if (!source.HasPriv("botserv/administration") && !access.HasPriv("SET"))
|
||||
{
|
||||
source.Reply(ACCESS_DENIED);
|
||||
return;
|
||||
}
|
||||
|
||||
if (readonly)
|
||||
{
|
||||
source.Reply(_("Sorry, bot option setting is temporarily disabled."));
|
||||
return;
|
||||
}
|
||||
|
||||
if (params[1].equals_ci("ON"))
|
||||
{
|
||||
bool override = !access.HasPriv("SET");
|
||||
Log(override ? LOG_OVERRIDE : LOG_COMMAND, source, this, ci) << "to enable dontkickops";
|
||||
|
||||
ci->botflags.SetFlag(BS_DONTKICKOPS);
|
||||
source.Reply(_("Bot \002won't kick ops\002 on channel %s."), ci->name.c_str());
|
||||
}
|
||||
else if (params[1].equals_ci("OFF"))
|
||||
{
|
||||
bool override = !access.HasPriv("SET");
|
||||
Log(override ? LOG_OVERRIDE : LOG_COMMAND, source, this, ci) << "to disable dontkickops";
|
||||
|
||||
ci->botflags.UnsetFlag(BS_DONTKICKOPS);
|
||||
source.Reply(_("Bot \002will kick ops\002 on channel %s."), ci->name.c_str());
|
||||
}
|
||||
else
|
||||
this->OnSyntaxError(source, source.command);
|
||||
}
|
||||
|
||||
bool OnHelp(CommandSource &source, const Anope::string &) anope_override
|
||||
{
|
||||
this->SendSyntax(source);
|
||||
source.Reply(_(" \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."));
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
class BSSetDontKickOps : public Module
|
||||
{
|
||||
CommandBSSetDontKickOps commandbssetdontkickops;
|
||||
|
||||
public:
|
||||
BSSetDontKickOps(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
|
||||
commandbssetdontkickops(this)
|
||||
{
|
||||
this->SetAuthor("Anope");
|
||||
}
|
||||
};
|
||||
|
||||
MODULE_INIT(BSSetDontKickOps)
|
||||
@@ -0,0 +1,90 @@
|
||||
/* BotServ core functions
|
||||
*
|
||||
* (C) 2003-2012 Anope Team
|
||||
* Contact us at team@anope.org
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
*
|
||||
* Based on the original code of Epona by Lara.
|
||||
* Based on the original code of Services by Andy Church.
|
||||
*/
|
||||
|
||||
/*************************************************************************/
|
||||
|
||||
#include "module.h"
|
||||
|
||||
class CommandBSSetDontKickVoices : public Command
|
||||
{
|
||||
public:
|
||||
CommandBSSetDontKickVoices(Module *creator, const Anope::string &sname = "botserv/set/dontkickvoices") : Command(creator, sname, 2, 2)
|
||||
{
|
||||
this->SetDesc(_("To protect voices against bot kicks"));
|
||||
this->SetSyntax(_("\037channel\037 {ON | OFF}"));
|
||||
}
|
||||
|
||||
void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms) anope_override
|
||||
{
|
||||
ChannelInfo *ci = cs_findchan(params[0]);
|
||||
if (ci == NULL)
|
||||
{
|
||||
source.Reply(CHAN_X_NOT_REGISTERED, params[0].c_str());
|
||||
return;
|
||||
}
|
||||
|
||||
AccessGroup access = source.AccessFor(ci);
|
||||
if (!source.HasPriv("botserv/administration") && !access.HasPriv("SET"))
|
||||
{
|
||||
source.Reply(ACCESS_DENIED);
|
||||
return;
|
||||
}
|
||||
|
||||
if (readonly)
|
||||
{
|
||||
source.Reply(_("Sorry, bot option setting is temporarily disabled."));
|
||||
return;
|
||||
}
|
||||
|
||||
if (params[1].equals_ci("ON"))
|
||||
{
|
||||
bool override = !access.HasPriv("SET");
|
||||
Log(override ? LOG_OVERRIDE : LOG_COMMAND, source, this, ci) << "to enable dontkickvoices";
|
||||
|
||||
ci->botflags.SetFlag(BS_DONTKICKVOICES);
|
||||
source.Reply(_("Bot \002won't kick voices\002 on channel %s."), ci->name.c_str());
|
||||
}
|
||||
else if (params[1].equals_ci("OFF"))
|
||||
{
|
||||
bool override = !access.HasPriv("SET");
|
||||
Log(override ? LOG_OVERRIDE : LOG_COMMAND, source, this, ci) << "to disable dontkickvoices";
|
||||
|
||||
ci->botflags.UnsetFlag(BS_DONTKICKVOICES);
|
||||
source.Reply(_("Bot \002will kick voices\002 on channel %s."), ci->name.c_str());
|
||||
}
|
||||
else
|
||||
this->OnSyntaxError(source, source.command);
|
||||
}
|
||||
|
||||
bool OnHelp(CommandSource &source, const Anope::string &) anope_override
|
||||
{
|
||||
this->SendSyntax(source);
|
||||
source.Reply(_(" \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."));
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
class BSSetDontKickVoices : public Module
|
||||
{
|
||||
CommandBSSetDontKickVoices commandbssetdontkickvoices;
|
||||
|
||||
public:
|
||||
BSSetDontKickVoices(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
|
||||
commandbssetdontkickvoices(this)
|
||||
{
|
||||
this->SetAuthor("Anope");
|
||||
}
|
||||
};
|
||||
|
||||
MODULE_INIT(BSSetDontKickVoices)
|
||||
@@ -0,0 +1,99 @@
|
||||
/* BotServ core functions
|
||||
*
|
||||
* (C) 2003-2012 Anope Team
|
||||
* Contact us at team@anope.org
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
*
|
||||
* Based on the original code of Epona by Lara.
|
||||
* Based on the original code of Services by Andy Church.
|
||||
*/
|
||||
|
||||
/*************************************************************************/
|
||||
|
||||
#include "module.h"
|
||||
|
||||
class CommandBSSetFantasy : public Command
|
||||
{
|
||||
public:
|
||||
CommandBSSetFantasy(Module *creator, const Anope::string &sname = "botserv/set/fantasy") : Command(creator, sname, 2, 2)
|
||||
{
|
||||
this->SetDesc(_("Enable fantaisist commands"));
|
||||
this->SetSyntax(_("\037channel\037 {\037ON|OFF\037}"));
|
||||
}
|
||||
|
||||
void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms) anope_override
|
||||
{
|
||||
ChannelInfo *ci = cs_findchan(params[0]);
|
||||
const Anope::string &value = params[1];
|
||||
|
||||
if (ci == NULL)
|
||||
{
|
||||
source.Reply(CHAN_X_NOT_REGISTERED, params[0].c_str());
|
||||
return;
|
||||
}
|
||||
|
||||
if (!source.HasPriv("botserv/administration") && !source.AccessFor(ci).HasPriv("SET"))
|
||||
{
|
||||
source.Reply(ACCESS_DENIED);
|
||||
return;
|
||||
}
|
||||
|
||||
if (readonly)
|
||||
{
|
||||
source.Reply(_("Sorry, bot option setting is temporarily disabled."));
|
||||
return;
|
||||
}
|
||||
|
||||
if (value.equals_ci("ON"))
|
||||
{
|
||||
bool override = !source.AccessFor(ci).HasPriv("SET");
|
||||
Log(override ? LOG_OVERRIDE : LOG_COMMAND, source, this, ci) << "to enable fantasy";
|
||||
|
||||
ci->botflags.SetFlag(BS_FANTASY);
|
||||
source.Reply(_("Fantasy mode is now \002on\002 on channel %s."), ci->name.c_str());
|
||||
}
|
||||
else if (value.equals_ci("OFF"))
|
||||
{
|
||||
bool override = !source.AccessFor(ci).HasPriv("SET");
|
||||
Log(override ? LOG_OVERRIDE : LOG_COMMAND, source, this, ci) << "to disable fantasy";
|
||||
|
||||
ci->botflags.UnsetFlag(BS_FANTASY);
|
||||
source.Reply(_("Fantasy mode is now \002off\002 on channel %s."), ci->name.c_str());
|
||||
}
|
||||
else
|
||||
this->OnSyntaxError(source, source.command);
|
||||
}
|
||||
|
||||
bool OnHelp(CommandSource &source, const Anope::string &) anope_override
|
||||
{
|
||||
this->SendSyntax(source);
|
||||
source.Reply(_(" \n"
|
||||
"Enables or disables \002fantasy\002 mode on a channel.\n"
|
||||
"When it is enabled, users will be able to use\n"
|
||||
"%s commands on a channel when prefixed\n"
|
||||
"with one of the following fantasy characters: \002%s\002\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)."), Config->ChanServ.c_str(), Config->BSFantasyCharacter.c_str());
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
class BSSetFantasy : public Module
|
||||
{
|
||||
CommandBSSetFantasy commandbssetfantasy;
|
||||
|
||||
public:
|
||||
BSSetFantasy(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
|
||||
commandbssetfantasy(this)
|
||||
{
|
||||
this->SetAuthor("Anope");
|
||||
}
|
||||
};
|
||||
|
||||
MODULE_INIT(BSSetFantasy)
|
||||
@@ -0,0 +1,92 @@
|
||||
/* BotServ core functions
|
||||
*
|
||||
* (C) 2003-2012 Anope Team
|
||||
* Contact us at team@anope.org
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
*
|
||||
* Based on the original code of Epona by Lara.
|
||||
* Based on the original code of Services by Andy Church.
|
||||
*/
|
||||
|
||||
/*************************************************************************/
|
||||
|
||||
#include "module.h"
|
||||
|
||||
class CommandBSSetGreet : public Command
|
||||
{
|
||||
public:
|
||||
CommandBSSetGreet(Module *creator, const Anope::string &sname = "botserv/set/greet") : Command(creator, sname, 2, 2)
|
||||
{
|
||||
this->SetDesc(_("Enable greet messages"));
|
||||
this->SetSyntax(_("\037channel\037 {\037ON|OFF\037}"));
|
||||
}
|
||||
|
||||
void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms) anope_override
|
||||
{
|
||||
ChannelInfo *ci = cs_findchan(params[0]);
|
||||
const Anope::string &value = params[1];
|
||||
|
||||
if (ci == NULL)
|
||||
{
|
||||
source.Reply(CHAN_X_NOT_REGISTERED, params[0].c_str());
|
||||
return;
|
||||
}
|
||||
|
||||
if (!source.HasPriv("botserv/administration") && !source.AccessFor(ci).HasPriv("SET"))
|
||||
{
|
||||
source.Reply(ACCESS_DENIED);
|
||||
return;
|
||||
}
|
||||
|
||||
if (readonly)
|
||||
{
|
||||
source.Reply(_("Sorry, bot option setting is temporarily disabled."));
|
||||
return;
|
||||
}
|
||||
|
||||
if (value.equals_ci("ON"))
|
||||
{
|
||||
bool override = !source.AccessFor(ci).HasPriv("SET");
|
||||
Log(override ? LOG_OVERRIDE : LOG_COMMAND, source, this, ci) << "to enable greets";
|
||||
|
||||
ci->botflags.SetFlag(BS_GREET);
|
||||
source.Reply(_("Greet mode is now \002on\002 on channel %s."), ci->name.c_str());
|
||||
}
|
||||
else if (value.equals_ci("OFF"))
|
||||
{
|
||||
bool override = !source.AccessFor(ci).HasPriv("SET");
|
||||
Log(override ? LOG_OVERRIDE : LOG_COMMAND, source, this, ci) << "to disable greets";
|
||||
|
||||
ci->botflags.UnsetFlag(BS_GREET);
|
||||
source.Reply(_("Greet mode is now \002off\002 on channel %s."), ci->name.c_str());
|
||||
}
|
||||
else
|
||||
this->OnSyntaxError(source, source.command);
|
||||
}
|
||||
|
||||
bool OnHelp(CommandSource &source, const Anope::string &) anope_override
|
||||
{
|
||||
this->SendSyntax(source);
|
||||
source.Reply(_(" \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."));
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
class BSSetGreet : public Module
|
||||
{
|
||||
CommandBSSetGreet commandbssetgreet;
|
||||
|
||||
public:
|
||||
BSSetGreet(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
|
||||
commandbssetgreet(this)
|
||||
{
|
||||
this->SetAuthor("Anope");
|
||||
}
|
||||
};
|
||||
|
||||
MODULE_INIT(BSSetGreet)
|
||||
@@ -0,0 +1,87 @@
|
||||
/* BotServ core functions
|
||||
*
|
||||
* (C) 2003-2012 Anope Team
|
||||
* Contact us at team@anope.org
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
*
|
||||
* Based on the original code of Epona by Lara.
|
||||
* Based on the original code of Services by Andy Church.
|
||||
*/
|
||||
|
||||
/*************************************************************************/
|
||||
|
||||
#include "module.h"
|
||||
|
||||
class CommandBSSetNoBot : public Command
|
||||
{
|
||||
public:
|
||||
CommandBSSetNoBot(Module *creator, const Anope::string &sname = "botserv/set/nobot") : Command(creator, sname, 2, 2)
|
||||
{
|
||||
this->SetDesc(_("Prevent a bot from being assigned to a channel"));
|
||||
this->SetSyntax(_("\037channel\037 {\037ON|OFF\037}"));
|
||||
}
|
||||
|
||||
void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms) anope_override
|
||||
{
|
||||
ChannelInfo *ci = cs_findchan(params[0]);
|
||||
const Anope::string &value = params[1];
|
||||
|
||||
if (ci == NULL)
|
||||
{
|
||||
source.Reply(CHAN_X_NOT_REGISTERED, params[0].c_str());
|
||||
return;
|
||||
}
|
||||
|
||||
if (!source.HasCommand("botserv/set/nobot"))
|
||||
{
|
||||
source.Reply(ACCESS_DENIED);
|
||||
return;
|
||||
}
|
||||
|
||||
if (value.equals_ci("ON"))
|
||||
{
|
||||
bool override = !source.AccessFor(ci).HasPriv("SET");
|
||||
Log(override ? LOG_ADMIN : LOG_COMMAND, source, this, ci) << "to enable nobot";
|
||||
|
||||
ci->botflags.SetFlag(BS_NOBOT);
|
||||
if (ci->bi)
|
||||
ci->bi->UnAssign(source.GetUser(), ci);
|
||||
source.Reply(_("No Bot mode is now \002on\002 on channel %s."), ci->name.c_str());
|
||||
}
|
||||
else if (value.equals_ci("OFF"))
|
||||
{
|
||||
bool override = !source.AccessFor(ci).HasPriv("SET");
|
||||
Log(override ? LOG_ADMIN : LOG_COMMAND, source, this, ci) << "to disable nobot";
|
||||
|
||||
ci->botflags.UnsetFlag(BS_NOBOT);
|
||||
source.Reply(_("No Bot mode is now \002off\002 on channel %s."), ci->name.c_str());
|
||||
}
|
||||
else
|
||||
this->OnSyntaxError(source, source.command);
|
||||
}
|
||||
|
||||
bool OnHelp(CommandSource &source, const Anope::string &) anope_override
|
||||
{
|
||||
this->SendSyntax(source);
|
||||
source.Reply(_(" \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."));
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
class BSSetNoBot : public Module
|
||||
{
|
||||
CommandBSSetNoBot commandbssetnobot;
|
||||
|
||||
public:
|
||||
BSSetNoBot(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
|
||||
commandbssetnobot(this)
|
||||
{
|
||||
this->SetAuthor("Anope");
|
||||
}
|
||||
};
|
||||
|
||||
MODULE_INIT(BSSetNoBot)
|
||||
@@ -0,0 +1,78 @@
|
||||
/* BotServ core functions
|
||||
*
|
||||
* (C) 2003-2012 Anope Team
|
||||
* Contact us at team@anope.org
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
*
|
||||
* Based on the original code of Epona by Lara.
|
||||
* Based on the original code of Services by Andy Church.
|
||||
*/
|
||||
|
||||
/*************************************************************************/
|
||||
|
||||
#include "module.h"
|
||||
|
||||
class CommandBSSetPrivate : public Command
|
||||
{
|
||||
public:
|
||||
CommandBSSetPrivate(Module *creator, const Anope::string &sname = "botserv/set/private") : Command(creator, sname, 2, 2)
|
||||
{
|
||||
this->SetDesc(_("Prevent a bot from being assigned by non IRC operators"));
|
||||
this->SetSyntax(_("\037botname\037 {\037ON|OFF\037}"));
|
||||
}
|
||||
|
||||
void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms) anope_override
|
||||
{
|
||||
BotInfo *bi = findbot(params[0]);
|
||||
const Anope::string &value = params[1];
|
||||
|
||||
if (bi == NULL)
|
||||
{
|
||||
source.Reply(BOT_DOES_NOT_EXIST, params[0].c_str());
|
||||
return;
|
||||
}
|
||||
|
||||
if (!source.HasCommand("botserv/set/private"))
|
||||
{
|
||||
source.Reply(ACCESS_DENIED);
|
||||
return;
|
||||
}
|
||||
|
||||
if (value.equals_ci("ON"))
|
||||
{
|
||||
bi->SetFlag(BI_PRIVATE);
|
||||
source.Reply(_("Private mode of bot %s is now \002on\002."), 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());
|
||||
}
|
||||
else
|
||||
this->OnSyntaxError(source, source.command);
|
||||
}
|
||||
|
||||
bool OnHelp(CommandSource &source, const Anope::string &) anope_override
|
||||
{
|
||||
this->SendSyntax(source);
|
||||
source.Reply(_(" \n"
|
||||
"This option prevents a bot from being assigned to a\n"
|
||||
"channel by users that aren't IRC operators."));
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
class BSSetPrivate : public Module
|
||||
{
|
||||
CommandBSSetPrivate commandbssetprivate;
|
||||
|
||||
public:
|
||||
BSSetPrivate(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
|
||||
commandbssetprivate(this)
|
||||
{
|
||||
this->SetAuthor("Anope");
|
||||
}
|
||||
};
|
||||
|
||||
MODULE_INIT(BSSetPrivate)
|
||||
+333
-420
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user