mirror of
https://github.com/anope/anope.git
synced 2026-06-18 02:34:48 +02:00
Compare commits
101 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 331c33c350 | |||
| 10eef1af23 | |||
| 90ff716ed3 | |||
| f67c70e485 | |||
| fd5e10c54c | |||
| 029565c894 | |||
| 9b8862826c | |||
| e2dc77641a | |||
| 7eb710a009 | |||
| b33b5a6630 | |||
| f4d5b1f01d | |||
| b61daf81b0 | |||
| da3f667188 | |||
| 040cd99027 | |||
| 6c7977f239 | |||
| 9b8570a2ee | |||
| 64f386e29e | |||
| 9434be29bc | |||
| 9aff71fb2f | |||
| ba26d9a15c | |||
| 22dc33de9f | |||
| 11d6f58a1a | |||
| f32d6453f5 | |||
| 1606bb01a3 | |||
| 3d86c82ac5 | |||
| a858a1e0a0 | |||
| eaa24d3b0a | |||
| 5355b53008 | |||
| 85a32077b5 | |||
| 5006993d0a | |||
| 1b2b4386c1 | |||
| b199d74088 | |||
| 7e2ef3774b | |||
| e002f39509 | |||
| d3395a5d39 | |||
| 1deff337fe | |||
| adf457ffb2 | |||
| 550adc13f3 | |||
| 04bdcb8ce6 | |||
| 0a99866e5b | |||
| c22f7a9038 | |||
| 074ad6556c | |||
| a657cb5edf | |||
| 63032dc8d9 | |||
| 404f55502e | |||
| 73f3621af6 | |||
| 2a1409face | |||
| 9834040948 | |||
| f111e3b3ec | |||
| 22a1924bfd | |||
| fa5bb3f1bf | |||
| 12545ccbde | |||
| 98703052cc | |||
| 15635779af | |||
| 1fc58c7a57 | |||
| e9614986d0 | |||
| dde9113418 | |||
| 99f7ea8307 | |||
| f912e30b25 | |||
| 2ca5045593 | |||
| be6a454579 | |||
| 1ffeb85727 | |||
| 95fc992355 | |||
| 0df341fa32 | |||
| decbab5d09 | |||
| 9409560597 | |||
| a02b81f219 | |||
| 6c86cd108a | |||
| 3ea5b078dc | |||
| d77fd4bde1 | |||
| da723d562f | |||
| 5db1a57833 | |||
| a01cd481b9 | |||
| aa41fffd49 | |||
| 8062d01a90 | |||
| d0c2baeed4 | |||
| 538b2cf035 | |||
| 7aeac28ca7 | |||
| 3244eef71d | |||
| f91cf1745d | |||
| f380b27ed3 | |||
| 66f53128ce | |||
| 45496780f8 | |||
| 8500fefe91 | |||
| 7242c740c8 | |||
| d43acc2381 | |||
| 2f1f04f7cb | |||
| 5b2ab323ab | |||
| 5aa71469e1 | |||
| 5aeb078391 | |||
| bc737c20c9 | |||
| 7d7ca934b3 | |||
| 238adae2cd | |||
| 407f604d48 | |||
| 76af25f0b4 | |||
| bf5ab14a21 | |||
| 766a18b0f1 | |||
| 1f0c76516b | |||
| aef1925b1d | |||
| e7aa0cb583 | |||
| bd72a444df |
@@ -14,46 +14,53 @@ jobs:
|
||||
runs-on: windows-2025
|
||||
env:
|
||||
BUILD_TYPE: ${{ github.event_name == 'release' && 'Release' || 'Debug' }}
|
||||
CONAN_USER_HOME: ${{ github.workspace }}/win/build
|
||||
CONAN_USER_HOME_SHORT: None
|
||||
CONAN_HOME: ${{ github.workspace }}\build\conan
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
|
||||
- name: Setup NSIS
|
||||
run: |-
|
||||
choco install nsis
|
||||
- name: Install NSIS
|
||||
uses: negrutiu/nsis-install@v2
|
||||
with:
|
||||
distro: official
|
||||
|
||||
- name: Setup MSBuild
|
||||
uses: microsoft/setup-msbuild@v2
|
||||
uses: microsoft/setup-msbuild@v3
|
||||
|
||||
- name: Setup Conan
|
||||
uses: turtlebrowser/get-conan@v1.2
|
||||
with:
|
||||
version: 1.66.0
|
||||
|
||||
- name: Create Conan profile
|
||||
run: |-
|
||||
conan profile detect
|
||||
(Get-Content ${{ env.CONAN_HOME }}\profiles\default).replace('build_type=Release', 'build_type=${{ env.BUILD_TYPE }}') | Set-Content ${{ env.CONAN_HOME }}\profiles\default
|
||||
(Get-Content ${{ env.CONAN_HOME }}\profiles\default).replace('compiler.cppstd=14', 'compiler.cppstd=17') | Set-Content ${{ env.CONAN_HOME }}\profiles\default
|
||||
Write-Output 'core.sources:download_urls=["origin", "https://c3i.jfrog.io/artifactory/conan-center-backup-sources/"]' | Out-File -Append ${{ env.CONAN_HOME }}\global.conf
|
||||
|
||||
- name: Try to restore libraries from the cache
|
||||
uses: actions/cache/restore@v5
|
||||
id: library-cache
|
||||
with:
|
||||
key: conan-${{ hashFiles('src/win32/conanfile.txt') }}
|
||||
path: ${{ env.CONAN_USER_HOME }}/.conan
|
||||
key: conan-${{ env.BUILD_TYPE }}-${{ hashFiles('src\win32\conanfile.txt') }}
|
||||
path: ${{ env.CONAN_HOME }}\p
|
||||
|
||||
- name: Install libraries
|
||||
run: |
|
||||
conan install ${{ github.workspace }}\src\win32 --build=missing
|
||||
(Get-Content ${{ github.workspace }}\src\win32\conanfile.txt).replace('##', '') | Set-Content ${{ github.workspace }}\src\win32\conanfile.txt
|
||||
conan install ${{ github.workspace }}\src\win32 --build missing --deployer runtime_deploy --deployer-folder ${{ github.workspace }}\build\extradll --output-folder .
|
||||
|
||||
- name: Save libraries to the cache
|
||||
if: ${{ steps.library-cache.outputs.cache-hit != 'true' }}
|
||||
uses: actions/cache/save@v5
|
||||
with:
|
||||
key: ${{ steps.library-cache.outputs.cache-primary-key }}
|
||||
path: ${{ env.CONAN_USER_HOME }}/.conan
|
||||
key: ${{ steps.library-cache.outputs.cache-primary-key }}
|
||||
path: ${{ env.CONAN_HOME }}\p
|
||||
|
||||
- name: Run CMake
|
||||
shell: cmd # work around a conan-io/conan-center-index bug #21823
|
||||
working-directory: ${{ github.workspace }}\build
|
||||
run: |
|
||||
mkdir ${{ github.workspace }}\build
|
||||
cd ${{ github.workspace }}\build
|
||||
cmake -A x64 -D "CMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }}" -G "Visual Studio 17 2022" ..
|
||||
call ${{ github.workspace }}\conanbuild.bat
|
||||
cmake -A x64 -D "CMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }}" -D CMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake -G "Visual Studio 17 2022" ..
|
||||
|
||||
- name: Build Anope
|
||||
working-directory: ${{ github.workspace }}\build
|
||||
@@ -70,7 +77,7 @@ jobs:
|
||||
|
||||
- name: Upload artifact
|
||||
if: "${{ github.event_name != 'release' }}"
|
||||
uses: actions/upload-artifact@v6
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: windows-installer
|
||||
path: ${{ github.workspace }}\build\\anope-*.exe
|
||||
|
||||
@@ -15,7 +15,6 @@ Daniel Engel <dane@zero.org> <dane dane@31f1291d-b8d6-0310-a050-a5561fc1590b@541
|
||||
David Robson <rob@anope.org> <rob rob@31f1291d-b8d6-0310-a050-a5561fc1590b@5417fbe8-f217-4b02-8779-1006273d7864>
|
||||
David Robson <rob@anope.org> <robbeh@5417fbe8-f217-4b02-8779-1006273d7864>
|
||||
Dennis Friis <peavey@inspircd.org> <peavey peavey@inspircd.org@5417fbe8-f217-4b02-8779-1006273d7864>
|
||||
Dragone2 <dragone2@risposteinformatiche.it> <davide.paolini8@gmail.com>
|
||||
Fabio Scotoni <cculex@gmail.com>
|
||||
Filippo Cortigiani <simos@simosnap.org> <devel@devel.crtnet.it>
|
||||
Filippo Cortigiani <simos@simosnap.org> <simos@H7-25.fritz.box>
|
||||
|
||||
+5
-8
@@ -25,7 +25,10 @@ include(CheckFunctionExists)
|
||||
include(CheckTypeSize)
|
||||
include(CheckLibraryExists)
|
||||
include(CheckCXXCompilerFlag)
|
||||
include(FindPkgConfig)
|
||||
|
||||
if(NOT WIN32)
|
||||
include(FindPkgConfig)
|
||||
endif()
|
||||
|
||||
# If extra include directories were specified, tell cmake about them.
|
||||
if(EXTRA_INCLUDE)
|
||||
@@ -37,19 +40,13 @@ if(EXTRA_LIBS)
|
||||
link_directories(${EXTRA_LIBS})
|
||||
endif()
|
||||
|
||||
# setup conan
|
||||
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/conanbuildinfo.cmake")
|
||||
include("${CMAKE_CURRENT_SOURCE_DIR}/conanbuildinfo.cmake")
|
||||
conan_basic_setup(TARGETS)
|
||||
endif()
|
||||
|
||||
# Find gettext
|
||||
find_package(Gettext)
|
||||
find_package(Intl)
|
||||
if(GETTEXT_FOUND AND Intl_FOUND)
|
||||
set(HAVE_LOCALIZATION ON)
|
||||
include_directories(${Intl_INCLUDE_DIRS})
|
||||
link_libraries(${Intl_LIBRARY})
|
||||
link_libraries(${Intl_LIBRARIES})
|
||||
else()
|
||||
message("Unable to find gettext and libintl; disabling localization")
|
||||
set(HAVE_LOCALIZATION OFF)
|
||||
|
||||
@@ -29,43 +29,37 @@ Load_Cache () {
|
||||
}
|
||||
|
||||
Run_Build_System () {
|
||||
WITH_INST=""
|
||||
WITH_RUN=""
|
||||
WITH_PERM=""
|
||||
EXTRA_INCLUDE=""
|
||||
EXTRA_LIBS=""
|
||||
BUILD_DIR="${SOURCE_DIR}/build"
|
||||
CMAKE_COMMAND="${CMAKE:-cmake} -B ${BUILD_DIR} -S ${SOURCE_DIR}"
|
||||
|
||||
if [ "$INSTDIR" != "" ] ; then
|
||||
WITH_INST="-DINSTDIR=$INSTDIR"
|
||||
CMAKE_COMMAND="${CMAKE_COMMAND} -D INSTDIR=$INSTDIR"
|
||||
fi
|
||||
|
||||
if [ "$RUNGROUP" != "" ] ; then
|
||||
WITH_RUN="-DRUNGROUP=$RUNGROUP"
|
||||
CMAKE_COMMAND="${CMAKE_COMMAND} -D RUNGROUP=$RUNGROUP"
|
||||
fi
|
||||
|
||||
if [ "$UMASK" != "" ] ; then
|
||||
WITH_PERM="-DDEFUMASK=$UMASK"
|
||||
CMAKE_COMMAND="${CMAKE_COMMAND} -D DEFUMASK=$UMASK"
|
||||
fi
|
||||
|
||||
if [ "$DEBUG" = "yes" ] ; then
|
||||
BUILD_TYPE="-DCMAKE_BUILD_TYPE=Debug"
|
||||
CMAKE_COMMAND="${CMAKE_COMMAND} -D CMAKE_BUILD_TYPE=Debug"
|
||||
else
|
||||
BUILD_TYPE="-DCMAKE_BUILD_TYPE=Release"
|
||||
CMAKE_COMMAND="${CMAKE_COMMAND} -D CMAKE_BUILD_TYPE=Release"
|
||||
fi
|
||||
|
||||
if [ "$EXTRA_INCLUDE_DIRS" != "" ] ; then
|
||||
EXTRA_INCLUDE="-DEXTRA_INCLUDE=$EXTRA_INCLUDE_DIRS"
|
||||
CMAKE_COMMAND="${CMAKE_COMMAND} -D EXTRA_INCLUDE=$EXTRA_INCLUDE_DIRS"
|
||||
fi
|
||||
|
||||
if [ "$EXTRA_LIB_DIRS" != "" ] ; then
|
||||
EXTRA_LIBS="-DEXTRA_LIBS=$EXTRA_LIB_DIRS"
|
||||
CMAKE_COMMAND="${CMAKE_COMMAND} -D EXTRA_LIBS=$EXTRA_LIB_DIRS"
|
||||
fi
|
||||
|
||||
BUILD_PATHS="-B ${SOURCE_DIR}/build ${SOURCE_DIR}"
|
||||
|
||||
CMAKE="cmake $GEN_TYPE $WITH_INST $WITH_RUN $WITH_PERM $BUILD_TYPE $EXTRA_INCLUDE $EXTRA_LIBS $EXTRA_CONFIG_ARGS $BUILD_PATHS"
|
||||
echo $CMAKE
|
||||
$CMAKE
|
||||
echo $CMAKE_COMMAND
|
||||
$CMAKE_COMMAND
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "You should fix these issues and then run ./Config -quick to rerun CMake."
|
||||
@@ -73,11 +67,7 @@ Run_Build_System () {
|
||||
fi
|
||||
|
||||
echo ""
|
||||
if [ "$PWD" = "${SOURCE_DIR}/build" ]; then
|
||||
echo "Now run make to build Anope."
|
||||
else
|
||||
echo "Now cd build, then run make to build Anope."
|
||||
fi
|
||||
echo "Now run 'make -C ${BUILD_DIR#"$PWD/"} install' to build and install Anope."
|
||||
}
|
||||
|
||||
###########################################################################
|
||||
@@ -98,7 +88,12 @@ CAN_QUICK="no"
|
||||
###########################################################################
|
||||
|
||||
while [ $# -ge 1 ] ; do
|
||||
if [ $1 = "--help" ] ; then
|
||||
OPTION=$1
|
||||
while [ "${OPTION#-}" != "$OPTION" ]; do
|
||||
OPTION="${OPTION#-}"
|
||||
done
|
||||
|
||||
if [ "$OPTION" = "--help" ] ; then
|
||||
echo "Config utility for Anope"
|
||||
echo "------------------------"
|
||||
echo "Syntax: ./Config [options]"
|
||||
@@ -106,15 +101,15 @@ while [ $# -ge 1 ] ; do
|
||||
echo "-nointro Skip intro (disclaimer, etc)"
|
||||
echo "-quick Skip questions, go straight to cmake"
|
||||
exit 0
|
||||
elif [ $1 = "-devel" ] ; then
|
||||
elif [ "$OPTION" = "devel" ] ; then
|
||||
DEBUG="yes"
|
||||
DEVEL="yes"
|
||||
INSTDIR="$SOURCE_DIR/run"
|
||||
elif [ $1 = "-nocache" ] ; then
|
||||
elif [ "$OPTION" = "nocache" ] ; then
|
||||
IGNORE_CACHE="1"
|
||||
elif [ $1 = "-nointro" ] ; then
|
||||
elif [ "$OPTION" = "nointro" ] ; then
|
||||
NO_INTRO="1"
|
||||
elif [ $1 = "-quick" -o $1 = "-q" ] ; then
|
||||
elif [ "$OPTION" = "quick" -o "$OPTION" = "q" ] ; then
|
||||
Load_Cache
|
||||
if [ "$CAN_QUICK" = "yes" ] ; then
|
||||
Run_Build_System
|
||||
|
||||
+29
-21
@@ -1084,6 +1084,34 @@ mail
|
||||
* The file that db_atheme will import your main database from.
|
||||
*/
|
||||
database = "atheme.db"
|
||||
|
||||
/*
|
||||
* If you have custom data in your Atheme database that you want converted
|
||||
* to Anope misc data to be shown with cs_set_misc you can configure that
|
||||
* using one or more cs_set_misc blocks.
|
||||
*/
|
||||
#cs_set_misc
|
||||
{
|
||||
/* The key name used by Atheme. */
|
||||
atheme = "private:misc:data"
|
||||
|
||||
/* The cs_set_misc entry to import into. */
|
||||
anope = "MISC_DATA"
|
||||
}
|
||||
|
||||
/*
|
||||
* If you have custom data in your Atheme database that you want converted
|
||||
* to Anope misc data to be shown with ns_set_misc you can configure that
|
||||
* using one or more ns_set_misc blocks.
|
||||
*/
|
||||
#ns_set_misc
|
||||
{
|
||||
/* The key name used by Atheme. */
|
||||
atheme = "private:misc:data"
|
||||
|
||||
/* The ns_set_misc entry to import into. */
|
||||
anope = "MISC_DATA"
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1200,7 +1228,7 @@ module
|
||||
* An optional prefix to prepended to the name of each created table.
|
||||
* Do not use the same prefix for other programs.
|
||||
*/
|
||||
#prefix = "anope_db_"
|
||||
#prefix = "anope21_"
|
||||
|
||||
/*
|
||||
* Whether or not to import data from another database module in to SQL on
|
||||
@@ -1220,26 +1248,6 @@ module
|
||||
import = no
|
||||
}
|
||||
|
||||
/*
|
||||
* db_redis.
|
||||
*
|
||||
* This module allows using Redis (https://redis.io/) as a database backend.
|
||||
* This module requires that redis is loaded and configured properly.
|
||||
*
|
||||
* Redis 2.8 supports keyspace notifications which allows Redis to push notifications
|
||||
* to Anope about outside modifications to the database. This module supports this and
|
||||
* will internally reflect any changes made to the database immediately once notified.
|
||||
* See docs/REDIS for more information regarding this.
|
||||
*/
|
||||
#module
|
||||
{
|
||||
name = "db_redis"
|
||||
|
||||
/*
|
||||
* Redis database to use. This must be configured with redis.
|
||||
*/
|
||||
engine = "redis/main"
|
||||
}
|
||||
|
||||
/*
|
||||
* [RECOMMENDED] Encryption modules.
|
||||
|
||||
+73
-73
@@ -148,7 +148,7 @@ module
|
||||
*/
|
||||
|
||||
/* Give it a help command. */
|
||||
command { service = "BotServ"; name = "HELP"; command = "generic/help"; }
|
||||
command { service = "BotServ"; name = "HELP"; command = "generic/help" }
|
||||
|
||||
/*
|
||||
* bs_assign
|
||||
@@ -161,9 +161,9 @@ command { service = "BotServ"; name = "HELP"; command = "generic/help"; }
|
||||
* Used for assigning and unassigning bots to channels.
|
||||
*/
|
||||
module { name = "bs_assign" }
|
||||
command { service = "BotServ"; name = "ASSIGN"; command = "botserv/assign"; }
|
||||
command { service = "BotServ"; name = "UNASSIGN"; command = "botserv/unassign"; }
|
||||
command { service = "BotServ"; name = "SET NOBOT"; command = "botserv/set/nobot"; permission = "botserv/set/nobot"; }
|
||||
command { service = "BotServ"; name = "ASSIGN"; command = "botserv/assign" }
|
||||
command { service = "BotServ"; name = "UNASSIGN"; command = "botserv/unassign" }
|
||||
command { service = "BotServ"; name = "SET NOBOT"; command = "botserv/set/nobot"; permission = "botserv/set/nobot" }
|
||||
|
||||
/*
|
||||
* bs_autoassign
|
||||
@@ -203,7 +203,7 @@ module
|
||||
*/
|
||||
#casesensitive = yes
|
||||
}
|
||||
command { service = "BotServ"; name = "BADWORDS"; command = "botserv/badwords"; }
|
||||
command { service = "BotServ"; name = "BADWORDS"; command = "botserv/badwords" }
|
||||
|
||||
/*
|
||||
* bs_bot
|
||||
@@ -213,7 +213,7 @@ command { service = "BotServ"; name = "BADWORDS"; command = "botserv/badwords";
|
||||
* Used for administrating BotServ bots.
|
||||
*/
|
||||
module { name = "bs_bot" }
|
||||
command { service = "BotServ"; name = "BOT"; command = "botserv/bot"; permission = "botserv/bot"; }
|
||||
command { service = "BotServ"; name = "BOT"; command = "botserv/bot"; permission = "botserv/bot" }
|
||||
|
||||
/*
|
||||
* bs_botlist
|
||||
@@ -223,7 +223,7 @@ command { service = "BotServ"; name = "BOT"; command = "botserv/bot"; permission
|
||||
* Used for listing all available bots.
|
||||
*/
|
||||
module { name = "bs_botlist" }
|
||||
command { service = "BotServ"; name = "BOTLIST"; command = "botserv/botlist"; }
|
||||
command { service = "BotServ"; name = "BOTLIST"; command = "botserv/botlist" }
|
||||
|
||||
/*
|
||||
* bs_control
|
||||
@@ -233,8 +233,8 @@ command { service = "BotServ"; name = "BOTLIST"; command = "botserv/botlist"; }
|
||||
* Used for making the bot message a channel.
|
||||
*/
|
||||
module { name = "bs_control" }
|
||||
command { service = "BotServ"; name = "ACT"; command = "botserv/act"; }
|
||||
command { service = "BotServ"; name = "SAY"; command = "botserv/say"; }
|
||||
command { service = "BotServ"; name = "ACT"; command = "botserv/act" }
|
||||
command { service = "BotServ"; name = "SAY"; command = "botserv/say" }
|
||||
|
||||
/*
|
||||
* bs_info
|
||||
@@ -244,7 +244,7 @@ command { service = "BotServ"; name = "SAY"; command = "botserv/say"; }
|
||||
* Used for getting information on bots or channels.
|
||||
*/
|
||||
module { name = "bs_info" }
|
||||
command { service = "BotServ"; name = "INFO"; command = "botserv/info"; }
|
||||
command { service = "BotServ"; name = "INFO"; command = "botserv/info" }
|
||||
|
||||
/*
|
||||
* bs_kick
|
||||
@@ -285,19 +285,19 @@ module
|
||||
*/
|
||||
gentlebadwordreason = yes
|
||||
}
|
||||
command { service = "BotServ"; name = "KICK"; command = "botserv/kick"; }
|
||||
command { service = "BotServ"; name = "KICK AMSG"; command = "botserv/kick/amsg"; }
|
||||
command { service = "BotServ"; name = "KICK BADWORDS"; command = "botserv/kick/badwords"; }
|
||||
command { service = "BotServ"; name = "KICK BOLDS"; command = "botserv/kick/bolds"; }
|
||||
command { service = "BotServ"; name = "KICK CAPS"; command = "botserv/kick/caps"; }
|
||||
command { service = "BotServ"; name = "KICK COLORS"; command = "botserv/kick/colors"; }
|
||||
command { service = "BotServ"; name = "KICK FLOOD"; command = "botserv/kick/flood"; }
|
||||
command { service = "BotServ"; name = "KICK ITALICS"; command = "botserv/kick/italics"; }
|
||||
command { service = "BotServ"; name = "KICK REPEAT"; command = "botserv/kick/repeat"; }
|
||||
command { service = "BotServ"; name = "KICK REVERSES"; command = "botserv/kick/reverses"; }
|
||||
command { service = "BotServ"; name = "KICK UNDERLINES"; command = "botserv/kick/underlines"; }
|
||||
command { service = "BotServ"; name = "SET DONTKICKOPS"; command = "botserv/set/dontkickops"; }
|
||||
command { service = "BotServ"; name = "SET DONTKICKVOICES"; command = "botserv/set/dontkickvoices"; }
|
||||
command { service = "BotServ"; name = "KICK"; command = "botserv/kick" }
|
||||
command { service = "BotServ"; name = "KICK AMSG"; command = "botserv/kick/amsg" }
|
||||
command { service = "BotServ"; name = "KICK BADWORDS"; command = "botserv/kick/badwords" }
|
||||
command { service = "BotServ"; name = "KICK BOLDS"; command = "botserv/kick/bolds" }
|
||||
command { service = "BotServ"; name = "KICK CAPS"; command = "botserv/kick/caps" }
|
||||
command { service = "BotServ"; name = "KICK COLORS"; command = "botserv/kick/colors" }
|
||||
command { service = "BotServ"; name = "KICK FLOOD"; command = "botserv/kick/flood" }
|
||||
command { service = "BotServ"; name = "KICK ITALICS"; command = "botserv/kick/italics" }
|
||||
command { service = "BotServ"; name = "KICK REPEAT"; command = "botserv/kick/repeat" }
|
||||
command { service = "BotServ"; name = "KICK REVERSES"; command = "botserv/kick/reverses" }
|
||||
command { service = "BotServ"; name = "KICK UNDERLINES"; command = "botserv/kick/underlines" }
|
||||
command { service = "BotServ"; name = "SET DONTKICKOPS"; command = "botserv/set/dontkickops" }
|
||||
command { service = "BotServ"; name = "SET DONTKICKVOICES"; command = "botserv/set/dontkickvoices" }
|
||||
|
||||
/*
|
||||
* bs_set
|
||||
@@ -306,9 +306,9 @@ command { service = "BotServ"; name = "SET DONTKICKVOICES"; command = "botserv/s
|
||||
* botserv/set/private - Used to prohibit specific BotServ bots from being assigned to channels.
|
||||
*/
|
||||
module { name = "bs_set" }
|
||||
command { service = "BotServ"; name = "SET"; command = "botserv/set"; }
|
||||
command { service = "BotServ"; name = "SET BANEXPIRE"; command = "botserv/set/banexpire"; }
|
||||
command { service = "BotServ"; name = "SET PRIVATE"; command = "botserv/set/private"; permission = "botserv/set/private"; }
|
||||
command { service = "BotServ"; name = "SET"; command = "botserv/set" }
|
||||
command { service = "BotServ"; name = "SET BANEXPIRE"; command = "botserv/set/banexpire" }
|
||||
command { service = "BotServ"; name = "SET PRIVATE"; command = "botserv/set/private"; permission = "botserv/set/private" }
|
||||
|
||||
/*
|
||||
* greet
|
||||
@@ -318,9 +318,9 @@ command { service = "BotServ"; name = "SET PRIVATE"; command = "botserv/set/priv
|
||||
* nickserv/set/greet, nickserv/saset/greet - Used for changing a users greet message, which is displayed when they enter channels.
|
||||
*/
|
||||
module { name = "greet" }
|
||||
command { service = "BotServ"; name = "SET GREET"; command = "botserv/set/greet"; }
|
||||
command { service = "NickServ"; name = "SET GREET"; command = "nickserv/set/greet"; }
|
||||
command { service = "NickServ"; name = "SASET GREET"; command = "nickserv/saset/greet"; permission = "nickserv/saset/greet"; }
|
||||
command { service = "BotServ"; name = "SET GREET"; command = "botserv/set/greet" }
|
||||
command { service = "NickServ"; name = "SET GREET"; command = "nickserv/set/greet" }
|
||||
command { service = "NickServ"; name = "SASET GREET"; command = "nickserv/saset/greet"; permission = "nickserv/saset/greet" }
|
||||
|
||||
/*
|
||||
* GREET privilege.
|
||||
@@ -360,7 +360,7 @@ module
|
||||
*/
|
||||
#prefix = "! ?"
|
||||
}
|
||||
command { service = "BotServ"; name = "SET FANTASY"; command = "botserv/set/fantasy"; }
|
||||
command { service = "BotServ"; name = "SET FANTASY"; command = "botserv/set/fantasy" }
|
||||
|
||||
/*
|
||||
* Fantasy commands
|
||||
@@ -372,46 +372,46 @@ command { service = "BotServ"; name = "SET FANTASY"; command = "botserv/set/fant
|
||||
* Sane defaults are provided below that do not need to be edited unless you
|
||||
* wish to change the default behavior.
|
||||
*/
|
||||
fantasy { name = "ACCESS"; command = "chanserv/access"; }
|
||||
fantasy { name = "AKICK"; command = "chanserv/akick"; }
|
||||
fantasy { name = "AOP"; command = "chanserv/xop"; }
|
||||
fantasy { name = "BAN"; command = "chanserv/ban"; }
|
||||
fantasy { name = "CLONE"; command = "chanserv/clone"; }
|
||||
fantasy { name = "DEHALFOP"; command = "chanserv/modes"; }
|
||||
fantasy { name = "DEOP"; command = "chanserv/modes"; }
|
||||
fantasy { name = "DEOWNER"; command = "chanserv/modes"; }
|
||||
fantasy { name = "DEPROTECT"; command = "chanserv/modes"; }
|
||||
fantasy { name = "DEVOICE"; command = "chanserv/modes"; }
|
||||
fantasy { name = "DOWN"; command = "chanserv/down"; }
|
||||
fantasy { name = "ENFORCE"; command = "chanserv/enforce"; }
|
||||
fantasy { name = "ENTRYMSG"; command = "chanserv/entrymsg"; }
|
||||
fantasy { name = "FLAGS"; command = "chanserv/flags"; }
|
||||
fantasy { name = "HALFOP"; command = "chanserv/modes"; }
|
||||
fantasy { name = "HELP"; command = "generic/help"; prepend_channel = no; require_privilege = no; }
|
||||
fantasy { name = "HOP"; command = "chanserv/xop"; }
|
||||
fantasy { name = "INFO"; command = "chanserv/info"; prepend_channel = no; }
|
||||
fantasy { name = "INVITE"; command = "chanserv/invite"; }
|
||||
fantasy { name = "K"; command = "chanserv/kick"; }
|
||||
fantasy { name = "KB"; command = "chanserv/ban"; }
|
||||
fantasy { name = "KICK"; command = "chanserv/kick"; }
|
||||
fantasy { name = "LEVELS"; command = "chanserv/levels"; }
|
||||
fantasy { name = "LIST"; command = "chanserv/list"; prepend_channel = no; }
|
||||
fantasy { name = "LOG"; command = "chanserv/log"; }
|
||||
fantasy { name = "MODE"; command = "chanserv/mode"; }
|
||||
fantasy { name = "MUTE"; command = "chanserv/ban"; kick = no; mode = "QUIET"; }
|
||||
fantasy { name = "OP"; command = "chanserv/modes"; }
|
||||
fantasy { name = "OWNER"; command = "chanserv/modes"; }
|
||||
fantasy { name = "PROTECT"; command = "chanserv/modes"; }
|
||||
fantasy { name = "QOP"; command = "chanserv/xop"; }
|
||||
fantasy { name = "SEEN"; command = "chanserv/seen"; prepend_channel = no; }
|
||||
fantasy { name = "SOP"; command = "chanserv/xop"; }
|
||||
fantasy { name = "STATUS"; command = "chanserv/status"; }
|
||||
fantasy { name = "SUSPEND"; command = "chanserv/suspend"; permission = "chanserv/suspend"; }
|
||||
fantasy { name = "SYNC"; command = "chanserv/sync"; }
|
||||
fantasy { name = "TOPIC"; command = "chanserv/topic"; }
|
||||
fantasy { name = "UNBAN"; command = "chanserv/unban"; }
|
||||
fantasy { name = "UNMUTE"; command = "chanserv/unban"; mode = "QUIET"; }
|
||||
fantasy { name = "UNSUSPEND"; command = "chanserv/unsuspend"; permission = "chanserv/suspend"; }
|
||||
fantasy { name = "UP"; command = "chanserv/up"; }
|
||||
fantasy { name = "VOICE"; command = "chanserv/modes"; }
|
||||
fantasy { name = "VOP"; command = "chanserv/xop"; }
|
||||
fantasy { name = "ACCESS"; command = "chanserv/access" }
|
||||
fantasy { name = "AKICK"; command = "chanserv/akick" }
|
||||
fantasy { name = "AOP"; command = "chanserv/xop" }
|
||||
fantasy { name = "BAN"; command = "chanserv/ban" }
|
||||
fantasy { name = "CLONE"; command = "chanserv/clone" }
|
||||
fantasy { name = "DEHALFOP"; command = "chanserv/modes" }
|
||||
fantasy { name = "DEOP"; command = "chanserv/modes" }
|
||||
fantasy { name = "DEOWNER"; command = "chanserv/modes" }
|
||||
fantasy { name = "DEPROTECT"; command = "chanserv/modes" }
|
||||
fantasy { name = "DEVOICE"; command = "chanserv/modes" }
|
||||
fantasy { name = "DOWN"; command = "chanserv/down" }
|
||||
fantasy { name = "ENFORCE"; command = "chanserv/enforce" }
|
||||
fantasy { name = "ENTRYMSG"; command = "chanserv/entrymsg" }
|
||||
fantasy { name = "FLAGS"; command = "chanserv/flags" }
|
||||
fantasy { name = "HALFOP"; command = "chanserv/modes" }
|
||||
fantasy { name = "HELP"; command = "generic/help"; prepend_channel = no; require_privilege = no }
|
||||
fantasy { name = "HOP"; command = "chanserv/xop" }
|
||||
fantasy { name = "INFO"; command = "chanserv/info"; prepend_channel = no }
|
||||
fantasy { name = "INVITE"; command = "chanserv/invite" }
|
||||
fantasy { name = "K"; command = "chanserv/kick" }
|
||||
fantasy { name = "KB"; command = "chanserv/ban" }
|
||||
fantasy { name = "KICK"; command = "chanserv/kick" }
|
||||
fantasy { name = "LEVELS"; command = "chanserv/levels" }
|
||||
fantasy { name = "LIST"; command = "chanserv/list"; prepend_channel = no }
|
||||
fantasy { name = "LOG"; command = "chanserv/log" }
|
||||
fantasy { name = "MODE"; command = "chanserv/mode" }
|
||||
fantasy { name = "MUTE"; command = "chanserv/ban"; kick = no; mode = "QUIET" }
|
||||
fantasy { name = "OP"; command = "chanserv/modes" }
|
||||
fantasy { name = "OWNER"; command = "chanserv/modes" }
|
||||
fantasy { name = "PROTECT"; command = "chanserv/modes" }
|
||||
fantasy { name = "QOP"; command = "chanserv/xop" }
|
||||
fantasy { name = "SEEN"; command = "chanserv/seen"; prepend_channel = no }
|
||||
fantasy { name = "SOP"; command = "chanserv/xop" }
|
||||
fantasy { name = "STATUS"; command = "chanserv/status" }
|
||||
fantasy { name = "SUSPEND"; command = "chanserv/suspend"; permission = "chanserv/suspend" }
|
||||
fantasy { name = "SYNC"; command = "chanserv/sync" }
|
||||
fantasy { name = "TOPIC"; command = "chanserv/topic" }
|
||||
fantasy { name = "UNBAN"; command = "chanserv/unban" }
|
||||
fantasy { name = "UNMUTE"; command = "chanserv/unban"; mode = "QUIET" }
|
||||
fantasy { name = "UNSUSPEND"; command = "chanserv/unsuspend"; permission = "chanserv/suspend" }
|
||||
fantasy { name = "UP"; command = "chanserv/up" }
|
||||
fantasy { name = "VOICE"; command = "chanserv/modes" }
|
||||
fantasy { name = "VOP"; command = "chanserv/xop" }
|
||||
|
||||
+64
-54
@@ -897,7 +897,7 @@ command_group
|
||||
}
|
||||
|
||||
/* Give it a help command. */
|
||||
command { service = "ChanServ"; name = "HELP"; command = "generic/help"; }
|
||||
command { service = "ChanServ"; name = "HELP"; command = "generic/help" }
|
||||
|
||||
/*
|
||||
* cs_access
|
||||
@@ -913,8 +913,8 @@ command { service = "ChanServ"; name = "HELP"; command = "generic/help"; }
|
||||
* entry by the other access system, which could be an XOP command name, or a set of flags.
|
||||
*/
|
||||
module { name = "cs_access" }
|
||||
command { service = "ChanServ"; name = "ACCESS"; command = "chanserv/access"; group = "chanserv/access"; }
|
||||
command { service = "ChanServ"; name = "LEVELS"; command = "chanserv/levels"; group = "chanserv/access"; }
|
||||
command { service = "ChanServ"; name = "ACCESS"; command = "chanserv/access"; group = "chanserv/access" }
|
||||
command { service = "ChanServ"; name = "LEVELS"; command = "chanserv/levels"; group = "chanserv/access" }
|
||||
|
||||
/*
|
||||
* cs_akick
|
||||
@@ -937,7 +937,7 @@ module
|
||||
*/
|
||||
autokickreason = "User has been banned from the channel"
|
||||
}
|
||||
command { service = "ChanServ"; name = "AKICK"; command = "chanserv/akick"; group = "chanserv/management"; }
|
||||
command { service = "ChanServ"; name = "AKICK"; command = "chanserv/akick"; group = "chanserv/management" }
|
||||
|
||||
/*
|
||||
* cs_ban
|
||||
@@ -953,7 +953,7 @@ command { service = "ChanServ"; name = "AKICK"; command = "chanserv/akick"; grou
|
||||
* Used for banning users from channels.
|
||||
*/
|
||||
module { name = "cs_ban" }
|
||||
command { service = "ChanServ"; name = "BAN"; command = "chanserv/ban"; group = "chanserv/management"; }
|
||||
command { service = "ChanServ"; name = "BAN"; command = "chanserv/ban"; group = "chanserv/management" }
|
||||
|
||||
/*
|
||||
* cs_clone
|
||||
@@ -963,7 +963,7 @@ command { service = "ChanServ"; name = "BAN"; command = "chanserv/ban"; group =
|
||||
* Used for copying channel settings from one channel to another.
|
||||
*/
|
||||
module { name = "cs_clone" }
|
||||
command { service = "ChanServ"; name = "CLONE"; command = "chanserv/clone"; group = "chanserv/management"; }
|
||||
command { service = "ChanServ"; name = "CLONE"; command = "chanserv/clone"; group = "chanserv/management" }
|
||||
|
||||
/*
|
||||
* cs_drop
|
||||
@@ -973,7 +973,7 @@ command { service = "ChanServ"; name = "CLONE"; command = "chanserv/clone"; grou
|
||||
* Used for unregistering channels.
|
||||
*/
|
||||
module { name = "cs_drop" }
|
||||
command { service = "ChanServ"; name = "DROP"; command = "chanserv/drop"; }
|
||||
command { service = "ChanServ"; name = "DROP"; command = "chanserv/drop" }
|
||||
|
||||
/*
|
||||
* cs_enforce
|
||||
@@ -983,7 +983,7 @@ command { service = "ChanServ"; name = "DROP"; command = "chanserv/drop"; }
|
||||
* Used to enforce various channel settings such as secureops and restricted.
|
||||
*/
|
||||
module { name = "cs_enforce" }
|
||||
command { service = "ChanServ"; name = "ENFORCE"; command = "chanserv/enforce"; group = "chanserv/management"; }
|
||||
command { service = "ChanServ"; name = "ENFORCE"; command = "chanserv/enforce"; group = "chanserv/management" }
|
||||
|
||||
/*
|
||||
* cs_entrymsg
|
||||
@@ -1011,7 +1011,7 @@ module
|
||||
*/
|
||||
#timestamp = no
|
||||
}
|
||||
command { service = "ChanServ"; name = "ENTRYMSG"; command = "chanserv/entrymsg"; group = "chanserv/management"; }
|
||||
command { service = "ChanServ"; name = "ENTRYMSG"; command = "chanserv/entrymsg"; group = "chanserv/management" }
|
||||
|
||||
/*
|
||||
* cs_flags
|
||||
@@ -1026,7 +1026,7 @@ command { service = "ChanServ"; name = "ENTRYMSG"; command = "chanserv/entrymsg"
|
||||
* privilege set granted by the access entry.
|
||||
*/
|
||||
module { name = "cs_flags" }
|
||||
command { service = "ChanServ"; name = "FLAGS"; command = "chanserv/flags"; group = "chanserv/access"; }
|
||||
command { service = "ChanServ"; name = "FLAGS"; command = "chanserv/flags"; group = "chanserv/access" }
|
||||
|
||||
/*
|
||||
* cs_getkey
|
||||
@@ -1036,7 +1036,7 @@ command { service = "ChanServ"; name = "FLAGS"; command = "chanserv/flags"; grou
|
||||
* Used for getting the key for channels.
|
||||
*/
|
||||
module { name = "cs_getkey" }
|
||||
command { service = "ChanServ"; name = "GETKEY"; command = "chanserv/getkey"; }
|
||||
command { service = "ChanServ"; name = "GETKEY"; command = "chanserv/getkey" }
|
||||
|
||||
/*
|
||||
* cs_info
|
||||
@@ -1046,7 +1046,7 @@ command { service = "ChanServ"; name = "GETKEY"; command = "chanserv/getkey"; }
|
||||
* Used for getting information about channels.
|
||||
*/
|
||||
module { name = "cs_info" }
|
||||
command { service = "ChanServ"; name = "INFO"; command = "chanserv/info"; }
|
||||
command { service = "ChanServ"; name = "INFO"; command = "chanserv/info" }
|
||||
|
||||
/*
|
||||
* cs_invite
|
||||
@@ -1056,7 +1056,7 @@ command { service = "ChanServ"; name = "INFO"; command = "chanserv/info"; }
|
||||
* Used for inviting yourself in to channels.
|
||||
*/
|
||||
module { name = "cs_invite" }
|
||||
command { service = "ChanServ"; name = "INVITE"; command = "chanserv/invite"; }
|
||||
command { service = "ChanServ"; name = "INVITE"; command = "chanserv/invite" }
|
||||
|
||||
/*
|
||||
* cs_kick
|
||||
@@ -1066,7 +1066,7 @@ command { service = "ChanServ"; name = "INVITE"; command = "chanserv/invite"; }
|
||||
* Used for kicking users from channels.
|
||||
*/
|
||||
module { name = "cs_kick" }
|
||||
command { service = "ChanServ"; name = "KICK"; command = "chanserv/kick"; group = "chanserv/management"; }
|
||||
command { service = "ChanServ"; name = "KICK"; command = "chanserv/kick"; group = "chanserv/management" }
|
||||
|
||||
/*
|
||||
* cs_list
|
||||
@@ -1084,8 +1084,8 @@ module
|
||||
*/
|
||||
listmax = 50
|
||||
}
|
||||
command { service = "ChanServ"; name = "LIST"; command = "chanserv/list"; }
|
||||
command { service = "ChanServ"; name = "SET PRIVATE"; command = "chanserv/set/private"; }
|
||||
command { service = "ChanServ"; name = "LIST"; command = "chanserv/list" }
|
||||
command { service = "ChanServ"; name = "SET PRIVATE"; command = "chanserv/set/private" }
|
||||
|
||||
/*
|
||||
* cs_log
|
||||
@@ -1126,7 +1126,7 @@ module
|
||||
method = "MESSAGE @"
|
||||
}
|
||||
}
|
||||
command { service = "ChanServ"; name = "LOG"; command = "chanserv/log"; group = "chanserv/management"; }
|
||||
command { service = "ChanServ"; name = "LOG"; command = "chanserv/log"; group = "chanserv/management" }
|
||||
|
||||
/*
|
||||
* cs_mode
|
||||
@@ -1155,7 +1155,7 @@ module
|
||||
*/
|
||||
max = 50
|
||||
}
|
||||
command { service = "ChanServ"; name = "MODE"; command = "chanserv/mode"; group = "chanserv/management"; }
|
||||
command { service = "ChanServ"; name = "MODE"; command = "chanserv/mode"; group = "chanserv/management" }
|
||||
|
||||
command { service = "ChanServ"; name = "OWNER"; command = "chanserv/modes"; group = "chanserv/status"; set = "OWNER" }
|
||||
command { service = "ChanServ"; name = "DEOWNER"; command = "chanserv/modes"; group = "chanserv/status"; unset = "OWNER" }
|
||||
@@ -1180,7 +1180,7 @@ command { service = "ChanServ"; name = "DEVOICE"; command = "chanserv/modes"; gr
|
||||
* Used for registering channels.
|
||||
*/
|
||||
module { name = "cs_register" }
|
||||
command { service = "ChanServ"; name = "REGISTER"; command = "chanserv/register"; }
|
||||
command { service = "ChanServ"; name = "REGISTER"; command = "chanserv/register" }
|
||||
|
||||
/*
|
||||
* cs_seen
|
||||
@@ -1197,7 +1197,7 @@ module
|
||||
/* Sets the time to keep seen entries in the seen database. */
|
||||
purgetime = 90d
|
||||
}
|
||||
command { service = "OperServ"; name = "SEEN"; command = "operserv/seen"; permission = "operserv/seen"; }
|
||||
command { service = "OperServ"; name = "SEEN"; command = "operserv/seen"; permission = "operserv/seen" }
|
||||
|
||||
/*
|
||||
* cs_set
|
||||
@@ -1243,33 +1243,43 @@ module
|
||||
*/
|
||||
persist_lower_ts = yes
|
||||
}
|
||||
command { service = "ChanServ"; name = "SET"; command = "chanserv/set"; group = "chanserv/management"; }
|
||||
command { service = "ChanServ"; name = "SET AUTOOP"; command = "chanserv/set/autoop"; }
|
||||
command { service = "ChanServ"; name = "SET BANTYPE"; command = "chanserv/set/bantype"; }
|
||||
command { service = "ChanServ"; name = "SET DESCRIPTION"; command = "chanserv/set/description"; }
|
||||
command { service = "ChanServ"; name = "SET DESC"; command = "chanserv/set/description"; hide = yes; }
|
||||
command { service = "ChanServ"; name = "SET FOUNDER"; command = "chanserv/set/founder"; }
|
||||
command { service = "ChanServ"; name = "SET KEEPMODES"; command = "chanserv/set/keepmodes"; }
|
||||
command { service = "ChanServ"; name = "SET NOEXPIRE"; command = "chanserv/saset/noexpire"; permission = "chanserv/saset/noexpire"; }
|
||||
command { service = "ChanServ"; name = "SET PEACE"; command = "chanserv/set/peace"; }
|
||||
command { service = "ChanServ"; name = "SET PERSIST"; command = "chanserv/set/persist"; }
|
||||
command { service = "ChanServ"; name = "SET RESTRICTED"; command = "chanserv/set/restricted"; }
|
||||
command { service = "ChanServ"; name = "SET SECUREFOUNDER"; command = "chanserv/set/securefounder"; }
|
||||
command { service = "ChanServ"; name = "SET SECUREOPS"; command = "chanserv/set/secureops"; }
|
||||
command { service = "ChanServ"; name = "SET SIGNKICK"; command = "chanserv/set/signkick"; }
|
||||
command { service = "ChanServ"; name = "SET SUCCESSOR"; command = "chanserv/set/successor"; }
|
||||
command { service = "ChanServ"; name = "SET"; command = "chanserv/set"; group = "chanserv/management" }
|
||||
command { service = "ChanServ"; name = "SET AUTOOP"; command = "chanserv/set/autoop" }
|
||||
command { service = "ChanServ"; name = "SET BANTYPE"; command = "chanserv/set/bantype" }
|
||||
command { service = "ChanServ"; name = "SET DESCRIPTION"; command = "chanserv/set/description" }
|
||||
command { service = "ChanServ"; name = "SET DESC"; command = "chanserv/set/description"; hide = yes }
|
||||
command { service = "ChanServ"; name = "SET FOUNDER"; command = "chanserv/set/founder" }
|
||||
command { service = "ChanServ"; name = "SET KEEPMODES"; command = "chanserv/set/keepmodes" }
|
||||
command { service = "ChanServ"; name = "SET NOEXPIRE"; command = "chanserv/saset/noexpire"; permission = "chanserv/saset/noexpire" }
|
||||
command { service = "ChanServ"; name = "SET PEACE"; command = "chanserv/set/peace" }
|
||||
command { service = "ChanServ"; name = "SET PERSIST"; command = "chanserv/set/persist" }
|
||||
command { service = "ChanServ"; name = "SET RESTRICTED"; command = "chanserv/set/restricted" }
|
||||
command { service = "ChanServ"; name = "SET SECUREFOUNDER"; command = "chanserv/set/securefounder" }
|
||||
command { service = "ChanServ"; name = "SET SECUREOPS"; command = "chanserv/set/secureops" }
|
||||
command { service = "ChanServ"; name = "SET SIGNKICK"; command = "chanserv/set/signkick" }
|
||||
command { service = "ChanServ"; name = "SET SUCCESSOR"; command = "chanserv/set/successor" }
|
||||
|
||||
/*
|
||||
* cs_set_misc
|
||||
*
|
||||
* Provides the command chanserv/set/misc.
|
||||
*
|
||||
* Allows you to create arbitrary commands to set data, and have that data show up in chanserv/info.
|
||||
* A field named misc_description may be given for use with help output.
|
||||
* Allows you to create arbitrary commands to set data, and have that data show
|
||||
* up in chanserv/info. You can configure this using the following fields:
|
||||
*
|
||||
* misc_description: A description of the command to show in the help.
|
||||
* misc_title: A human-readable description of the stored data.
|
||||
* misc_numeric: If defined then the numeric (in the range 1-999) to send the
|
||||
* data to users with when they join the channel.
|
||||
* misc_pattern: If defined then a regex pattern (using the engine specified
|
||||
* in <options:regexengine> to validate the data with).
|
||||
* misc_syntax: If defined then the syntax to show in the help output and, if
|
||||
* misc_pattern is defined, when a user specifies an invalid
|
||||
* value.
|
||||
*/
|
||||
module { name = "cs_set_misc" }
|
||||
command { service = "ChanServ"; name = "SET URL"; command = "chanserv/set/misc"; misc_description = _("Associate a URL with the channel"); misc_numeric = 328; }
|
||||
command { service = "ChanServ"; name = "SET EMAIL"; command = "chanserv/set/misc"; misc_description = _("Associate an email address with the channel"); }
|
||||
command { service = "ChanServ"; name = "SET URL"; command = "chanserv/set/misc"; misc_description = _("Associate a URL with the channel"); misc_numeric = 328; misc_pattern = "^https?:\/\/\S+$" }
|
||||
#command { service = "ChanServ"; name = "SET EMAIL"; command = "chanserv/set/misc"; misc_description = _("Associate an email address with the channel"); misc_pattern = "^\S+@\S.\S+$"; misc_title = _("Email address") }
|
||||
|
||||
/*
|
||||
* cs_status
|
||||
@@ -1280,8 +1290,8 @@ command { service = "ChanServ"; name = "SET EMAIL"; command = "chanserv/set/misc
|
||||
* or not they match any autokick entries.
|
||||
*/
|
||||
module { name = "cs_status" }
|
||||
command { service = "ChanServ"; name = "STATUS"; command = "chanserv/status"; }
|
||||
command { service = "ChanServ"; name = "WHY"; command = "chanserv/status"; hide = yes; }
|
||||
command { service = "ChanServ"; name = "STATUS"; command = "chanserv/status" }
|
||||
command { service = "ChanServ"; name = "WHY"; command = "chanserv/status"; hide = yes }
|
||||
|
||||
/*
|
||||
* cs_statusupdate
|
||||
@@ -1317,8 +1327,8 @@ module
|
||||
*/
|
||||
show = "suspended, by, reason, on, expires"
|
||||
}
|
||||
command { service = "ChanServ"; name = "SUSPEND"; command = "chanserv/suspend"; permission = "chanserv/suspend"; group = "chanserv/admin"; }
|
||||
command { service = "ChanServ"; name = "UNSUSPEND"; command = "chanserv/unsuspend"; permission = "chanserv/suspend"; group = "chanserv/admin"; }
|
||||
command { service = "ChanServ"; name = "SUSPEND"; command = "chanserv/suspend"; permission = "chanserv/suspend"; group = "chanserv/admin" }
|
||||
command { service = "ChanServ"; name = "UNSUSPEND"; command = "chanserv/unsuspend"; permission = "chanserv/suspend"; group = "chanserv/admin" }
|
||||
|
||||
/*
|
||||
* cs_sync
|
||||
@@ -1328,7 +1338,7 @@ command { service = "ChanServ"; name = "UNSUSPEND"; command = "chanserv/unsuspen
|
||||
* Used to sync users channel status modes with what access they have.
|
||||
*/
|
||||
module { name = "cs_sync" }
|
||||
command { service = "ChanServ"; name = "SYNC"; command = "chanserv/sync"; group = "chanserv/management"; }
|
||||
command { service = "ChanServ"; name = "SYNC"; command = "chanserv/sync"; group = "chanserv/management" }
|
||||
|
||||
/*
|
||||
* cs_topic
|
||||
@@ -1339,8 +1349,8 @@ command { service = "ChanServ"; name = "SYNC"; command = "chanserv/sync"; group
|
||||
*
|
||||
*/
|
||||
module { name = "cs_topic" }
|
||||
command { service = "ChanServ"; name = "TOPIC"; command = "chanserv/topic"; group = "chanserv/management"; }
|
||||
command { service = "ChanServ"; name = "SET KEEPTOPIC"; command = "chanserv/set/keeptopic"; }
|
||||
command { service = "ChanServ"; name = "TOPIC"; command = "chanserv/topic"; group = "chanserv/management" }
|
||||
command { service = "ChanServ"; name = "SET KEEPTOPIC"; command = "chanserv/set/keeptopic" }
|
||||
|
||||
/*
|
||||
* cs_unban
|
||||
@@ -1350,7 +1360,7 @@ command { service = "ChanServ"; name = "SET KEEPTOPIC"; command = "chanserv/set/
|
||||
* Used for unbanning users from channels.
|
||||
*/
|
||||
module { name = "cs_unban" }
|
||||
command { service = "ChanServ"; name = "UNBAN"; command = "chanserv/unban"; group = "chanserv/management"; }
|
||||
command { service = "ChanServ"; name = "UNBAN"; command = "chanserv/unban"; group = "chanserv/management" }
|
||||
|
||||
/*
|
||||
* cs_updown
|
||||
@@ -1360,8 +1370,8 @@ command { service = "ChanServ"; name = "UNBAN"; command = "chanserv/unban"; grou
|
||||
* Used for setting or removing your status modes on a channel.
|
||||
*/
|
||||
module { name = "cs_updown" }
|
||||
command { service = "ChanServ"; name = "DOWN"; command = "chanserv/down"; group = "chanserv/status"; }
|
||||
command { service = "ChanServ"; name = "UP"; command = "chanserv/up"; group = "chanserv/status"; }
|
||||
command { service = "ChanServ"; name = "DOWN"; command = "chanserv/down"; group = "chanserv/status" }
|
||||
command { service = "ChanServ"; name = "UP"; command = "chanserv/up"; group = "chanserv/status" }
|
||||
|
||||
/*
|
||||
* cs_xop
|
||||
@@ -1378,8 +1388,8 @@ command { service = "ChanServ"; name = "UP"; command = "chanserv/up"; group = "c
|
||||
* can not view the entire access list at once, and instead should use another access system to do that.
|
||||
*/
|
||||
module { name = "cs_xop" }
|
||||
command { service = "ChanServ"; name = "QOP"; command = "chanserv/xop"; group = "chanserv/access"; }
|
||||
command { service = "ChanServ"; name = "SOP"; command = "chanserv/xop"; group = "chanserv/access"; }
|
||||
command { service = "ChanServ"; name = "AOP"; command = "chanserv/xop"; group = "chanserv/access"; }
|
||||
command { service = "ChanServ"; name = "HOP"; command = "chanserv/xop"; group = "chanserv/access"; }
|
||||
command { service = "ChanServ"; name = "VOP"; command = "chanserv/xop"; group = "chanserv/access"; }
|
||||
command { service = "ChanServ"; name = "QOP"; command = "chanserv/xop"; group = "chanserv/access" }
|
||||
command { service = "ChanServ"; name = "SOP"; command = "chanserv/xop"; group = "chanserv/access" }
|
||||
command { service = "ChanServ"; name = "AOP"; command = "chanserv/xop"; group = "chanserv/access" }
|
||||
command { service = "ChanServ"; name = "HOP"; command = "chanserv/xop"; group = "chanserv/access" }
|
||||
command { service = "ChanServ"; name = "VOP"; command = "chanserv/xop"; group = "chanserv/access" }
|
||||
|
||||
+16
-16
@@ -22,28 +22,28 @@ module
|
||||
* An optional prefix to prepended to the name of each created table.
|
||||
* Do not use the same prefix for other programs.
|
||||
*/
|
||||
prefix = "anope_"
|
||||
#prefix = "chanstats21_"
|
||||
|
||||
smileyshappy = ":) :-) ;) ;-) :D :-D :P :-P"
|
||||
smileyssad = ":( :-( ;( ;-("
|
||||
smileysother = ":/ :-/"
|
||||
}
|
||||
command { service = "ChanServ"; name = "SET CHANSTATS"; command = "chanserv/set/chanstats"; }
|
||||
command { service = "NickServ"; name = "SET CHANSTATS"; command = "nickserv/set/chanstats"; }
|
||||
command { service = "NickServ"; name = "SASET CHANSTATS"; command = "nickserv/saset/chanstats"; permission = "nickserv/saset/chanstats"; }
|
||||
command { service = "ChanServ"; name = "SET CHANSTATS"; command = "chanserv/set/chanstats" }
|
||||
command { service = "NickServ"; name = "SET CHANSTATS"; command = "nickserv/set/chanstats" }
|
||||
command { service = "NickServ"; name = "SASET CHANSTATS"; command = "nickserv/saset/chanstats"; permission = "nickserv/saset/chanstats" }
|
||||
|
||||
module { name = "cs_fantasy_stats" }
|
||||
command { service = "ChanServ"; name = "STATS"; command = "chanserv/stats"; }
|
||||
command { service = "ChanServ"; name = "GSTATS"; command = "chanserv/gstats"; }
|
||||
fantasy { name = "STATS"; command = "chanserv/stats"; }
|
||||
fantasy { name = "GSTATS"; command = "chanserv/gstats"; }
|
||||
command { service = "ChanServ"; name = "STATS"; command = "chanserv/stats" }
|
||||
command { service = "ChanServ"; name = "GSTATS"; command = "chanserv/gstats" }
|
||||
fantasy { name = "STATS"; command = "chanserv/stats" }
|
||||
fantasy { 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"; }
|
||||
fantasy { name = "TOP"; command = "chanserv/top"; }
|
||||
fantasy { name = "TOP10"; command = "chanserv/top10"; }
|
||||
fantasy { name = "GTOP"; command = "chanserv/gtop"; }
|
||||
fantasy { name = "GTOP10"; command = "chanserv/gtop10"; }
|
||||
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" }
|
||||
fantasy { name = "TOP"; command = "chanserv/top" }
|
||||
fantasy { name = "TOP10"; command = "chanserv/top10" }
|
||||
fantasy { name = "GTOP"; command = "chanserv/gtop" }
|
||||
fantasy { name = "GTOP10"; command = "chanserv/gtop10" }
|
||||
|
||||
@@ -113,7 +113,7 @@ module
|
||||
*/
|
||||
|
||||
/* Give it a help command. */
|
||||
command { service = "Global"; name = "HELP"; command = "generic/help"; }
|
||||
command { service = "Global"; name = "HELP"; command = "generic/help" }
|
||||
|
||||
/*
|
||||
* gl_global
|
||||
@@ -123,7 +123,7 @@ command { service = "Global"; name = "HELP"; command = "generic/help"; }
|
||||
* Used for sending a message to every online user.
|
||||
*/
|
||||
module { name = "gl_global" }
|
||||
command { service = "Global"; name = "GLOBAL"; command = "global/global"; permission = "global/global"; }
|
||||
command { service = "Global"; name = "GLOBAL"; command = "global/global"; permission = "global/global" }
|
||||
|
||||
/*
|
||||
* gl_queue
|
||||
@@ -139,7 +139,7 @@ module
|
||||
/* The maximum number of messages in a message queue. Defaults to 10. */
|
||||
maxqueue = 10
|
||||
}
|
||||
command { service = "Global"; name = "QUEUE"; command = "global/queue"; permission = "global/queue"; }
|
||||
command { service = "Global"; name = "QUEUE"; command = "global/queue"; permission = "global/queue" }
|
||||
|
||||
/*
|
||||
* gl_server
|
||||
@@ -149,4 +149,4 @@ command { service = "Global"; name = "QUEUE"; command = "global/queue"; permissi
|
||||
* Used for sending a message to every online user on a server.
|
||||
*/
|
||||
module { name = "gl_server" }
|
||||
command { service = "Global"; name = "SERVER"; command = "global/server"; permission = "global/server"; }
|
||||
command { service = "Global"; name = "SERVER"; command = "global/server"; permission = "global/server" }
|
||||
|
||||
+16
-16
@@ -99,7 +99,7 @@ module
|
||||
*/
|
||||
|
||||
/* Give it a help command. */
|
||||
command { service = "HostServ"; name = "HELP"; command = "generic/help"; }
|
||||
command { service = "HostServ"; name = "HELP"; command = "generic/help" }
|
||||
|
||||
/*
|
||||
* hs_del
|
||||
@@ -109,8 +109,8 @@ command { service = "HostServ"; name = "HELP"; command = "generic/help"; }
|
||||
* Used for removing users' vhosts.
|
||||
*/
|
||||
module { name = "hs_del" }
|
||||
command { service = "HostServ"; name = "DEL"; command = "hostserv/del"; permission = "hostserv/del"; }
|
||||
command { service = "HostServ"; name = "DELALL"; command = "hostserv/delall"; permission = "hostserv/del"; }
|
||||
command { service = "HostServ"; name = "DEL"; command = "hostserv/del"; permission = "hostserv/del" }
|
||||
command { service = "HostServ"; name = "DELALL"; command = "hostserv/delall"; permission = "hostserv/del" }
|
||||
|
||||
/*
|
||||
* hs_group
|
||||
@@ -133,7 +133,7 @@ module
|
||||
*/
|
||||
synconset = yes
|
||||
}
|
||||
command { service = "HostServ"; name = "GROUP"; command = "hostserv/group"; }
|
||||
command { service = "HostServ"; name = "GROUP"; command = "hostserv/group" }
|
||||
|
||||
/*
|
||||
* hs_list
|
||||
@@ -143,7 +143,7 @@ command { service = "HostServ"; name = "GROUP"; command = "hostserv/group"; }
|
||||
* Used for listing actively set vhosts.
|
||||
*/
|
||||
module { name = "hs_list" }
|
||||
command { service = "HostServ"; name = "LIST"; command = "hostserv/list"; permission = "hostserv/list"; }
|
||||
command { service = "HostServ"; name = "LIST"; command = "hostserv/list"; permission = "hostserv/list" }
|
||||
|
||||
/*
|
||||
* hs_off
|
||||
@@ -153,7 +153,7 @@ command { service = "HostServ"; name = "LIST"; command = "hostserv/list"; permis
|
||||
* Used for turning off your vhost.
|
||||
*/
|
||||
module { name = "hs_off" }
|
||||
command { service = "HostServ"; name = "OFF"; command = "hostserv/off"; }
|
||||
command { service = "HostServ"; name = "OFF"; command = "hostserv/off" }
|
||||
|
||||
/*
|
||||
* hs_offfer
|
||||
@@ -171,8 +171,8 @@ module
|
||||
*/
|
||||
takedelay = 7d
|
||||
}
|
||||
command { service = "HostServ"; name = "OFFER"; command = "hostserv/offer"; permission = "hostserv/offer"; }
|
||||
command { service = "HostServ"; name = "OFFERLIST"; command = "hostserv/offerlist"; }
|
||||
command { service = "HostServ"; name = "OFFER"; command = "hostserv/offer"; permission = "hostserv/offer" }
|
||||
command { service = "HostServ"; name = "OFFERLIST"; command = "hostserv/offerlist" }
|
||||
|
||||
/*
|
||||
* hs_on
|
||||
@@ -182,7 +182,7 @@ command { service = "HostServ"; name = "OFFERLIST"; command = "hostserv/offerlis
|
||||
* Used for turning on your vhost.
|
||||
*/
|
||||
module { name = "hs_on" }
|
||||
command { service = "HostServ"; name = "ON"; command = "hostserv/on"; }
|
||||
command { service = "HostServ"; name = "ON"; command = "hostserv/on" }
|
||||
|
||||
/*
|
||||
* hs_request
|
||||
@@ -224,11 +224,11 @@ module
|
||||
*/
|
||||
#validationrecord = "anope-dns-validation"
|
||||
}
|
||||
command { service = "HostServ"; name = "REQUEST"; command = "hostserv/request"; }
|
||||
command { service = "HostServ"; name = "ACTIVATE"; command = "hostserv/activate"; permission = "hostserv/set"; }
|
||||
command { service = "HostServ"; name = "REJECT"; command = "hostserv/reject"; permission = "hostserv/set"; }
|
||||
command { service = "HostServ"; name = "WAITING"; command = "hostserv/waiting"; permission = "hostserv/set"; }
|
||||
#command { service = "HostServ"; name = "VALIDATE"; command = "hostserv/validate"; }
|
||||
command { service = "HostServ"; name = "REQUEST"; command = "hostserv/request" }
|
||||
command { service = "HostServ"; name = "ACTIVATE"; command = "hostserv/activate"; permission = "hostserv/set" }
|
||||
command { service = "HostServ"; name = "REJECT"; command = "hostserv/reject"; permission = "hostserv/set" }
|
||||
command { service = "HostServ"; name = "WAITING"; command = "hostserv/waiting"; permission = "hostserv/set" }
|
||||
#command { service = "HostServ"; name = "VALIDATE"; command = "hostserv/validate" }
|
||||
|
||||
/*
|
||||
* hs_set
|
||||
@@ -238,5 +238,5 @@ command { service = "HostServ"; name = "WAITING"; command = "hostserv/waiting";
|
||||
* Used for setting users' vhosts.
|
||||
*/
|
||||
module { name = "hs_set" }
|
||||
command { service = "HostServ"; name = "SET"; command = "hostserv/set"; permission = "hostserv/set"; }
|
||||
command { service = "HostServ"; name = "SETALL"; command = "hostserv/setall"; permission = "hostserv/set"; }
|
||||
command { service = "HostServ"; name = "SET"; command = "hostserv/set"; permission = "hostserv/set" }
|
||||
command { service = "HostServ"; name = "SETALL"; command = "hostserv/setall"; permission = "hostserv/set" }
|
||||
|
||||
+13
-13
@@ -108,7 +108,7 @@ module
|
||||
*/
|
||||
|
||||
/* Give it a help command. */
|
||||
command { service = "MemoServ"; name = "HELP"; command = "generic/help"; }
|
||||
command { service = "MemoServ"; name = "HELP"; command = "generic/help" }
|
||||
|
||||
/*
|
||||
* ms_cancel
|
||||
@@ -118,7 +118,7 @@ command { service = "MemoServ"; name = "HELP"; command = "generic/help"; }
|
||||
* Used to cancel memos already sent but not yet read.
|
||||
*/
|
||||
module { name = "ms_cancel" }
|
||||
command { service = "MemoServ"; name = "CANCEL"; command = "memoserv/cancel"; }
|
||||
command { service = "MemoServ"; name = "CANCEL"; command = "memoserv/cancel" }
|
||||
|
||||
/*
|
||||
* ms_check
|
||||
@@ -128,7 +128,7 @@ command { service = "MemoServ"; name = "CANCEL"; command = "memoserv/cancel"; }
|
||||
* Used to check if a sent memo has been read.
|
||||
*/
|
||||
module { name = "ms_check" }
|
||||
command { service = "MemoServ"; name = "CHECK"; command = "memoserv/check"; }
|
||||
command { service = "MemoServ"; name = "CHECK"; command = "memoserv/check" }
|
||||
|
||||
/*
|
||||
* ms_del
|
||||
@@ -138,7 +138,7 @@ command { service = "MemoServ"; name = "CHECK"; command = "memoserv/check"; }
|
||||
* Used to delete your memos.
|
||||
*/
|
||||
module { name = "ms_del" }
|
||||
command { service = "MemoServ"; name = "DEL"; command = "memoserv/del"; }
|
||||
command { service = "MemoServ"; name = "DEL"; command = "memoserv/del" }
|
||||
|
||||
/*
|
||||
* ms_ignore
|
||||
@@ -158,7 +158,7 @@ module
|
||||
*/
|
||||
max = 50
|
||||
}
|
||||
command { service = "MemoServ"; name = "IGNORE"; command = "memoserv/ignore"; }
|
||||
command { service = "MemoServ"; name = "IGNORE"; command = "memoserv/ignore" }
|
||||
|
||||
/*
|
||||
* ms_info
|
||||
@@ -168,7 +168,7 @@ command { service = "MemoServ"; name = "IGNORE"; command = "memoserv/ignore"; }
|
||||
* Used to show memo related information about an account or a channel.
|
||||
*/
|
||||
module { name = "ms_info" }
|
||||
command { service = "MemoServ"; name = "INFO"; command = "memoserv/info"; }
|
||||
command { service = "MemoServ"; name = "INFO"; command = "memoserv/info" }
|
||||
|
||||
/*
|
||||
* ms_list
|
||||
@@ -178,7 +178,7 @@ command { service = "MemoServ"; name = "INFO"; command = "memoserv/info"; }
|
||||
* Used to list your current memos.
|
||||
*/
|
||||
module { name = "ms_list" }
|
||||
command { service = "MemoServ"; name = "LIST"; command = "memoserv/list"; }
|
||||
command { service = "MemoServ"; name = "LIST"; command = "memoserv/list" }
|
||||
|
||||
/*
|
||||
* ms_read
|
||||
@@ -188,7 +188,7 @@ command { service = "MemoServ"; name = "LIST"; command = "memoserv/list"; }
|
||||
* Used to read your memos.
|
||||
*/
|
||||
module { name = "ms_read" }
|
||||
command { service = "MemoServ"; name = "READ"; command = "memoserv/read"; }
|
||||
command { service = "MemoServ"; name = "READ"; command = "memoserv/read" }
|
||||
|
||||
/*
|
||||
* ms_rsend
|
||||
@@ -208,7 +208,7 @@ command { service = "MemoServ"; name = "READ"; command = "memoserv/read"; }
|
||||
*/
|
||||
operonly = no
|
||||
}
|
||||
#command { service = "MemoServ"; name = "RSEND"; command = "memoserv/rsend"; }
|
||||
#command { service = "MemoServ"; name = "RSEND"; command = "memoserv/rsend" }
|
||||
|
||||
/*
|
||||
* ms_send
|
||||
@@ -218,7 +218,7 @@ command { service = "MemoServ"; name = "READ"; command = "memoserv/read"; }
|
||||
* Used to send memos.
|
||||
*/
|
||||
module { name = "ms_send" }
|
||||
command { service = "MemoServ"; name = "SEND"; command = "memoserv/send"; }
|
||||
command { service = "MemoServ"; name = "SEND"; command = "memoserv/send" }
|
||||
|
||||
/*
|
||||
* ms_sendall
|
||||
@@ -228,7 +228,7 @@ command { service = "MemoServ"; name = "SEND"; command = "memoserv/send"; }
|
||||
* Used to send a mass memo to every registered user.
|
||||
*/
|
||||
module { name = "ms_sendall" }
|
||||
command { service = "MemoServ"; name = "SENDALL"; command = "memoserv/sendall"; permission = "memoserv/sendall"; }
|
||||
command { service = "MemoServ"; name = "SENDALL"; command = "memoserv/sendall"; permission = "memoserv/sendall" }
|
||||
|
||||
/*
|
||||
* ms_set
|
||||
@@ -238,7 +238,7 @@ command { service = "MemoServ"; name = "SENDALL"; command = "memoserv/sendall";
|
||||
* Used to set settings such as how you are notified of new memos, and your memo limit.
|
||||
*/
|
||||
module { name = "ms_set" }
|
||||
command { service = "MemoServ"; name = "SET"; command = "memoserv/set"; }
|
||||
command { service = "MemoServ"; name = "SET"; command = "memoserv/set" }
|
||||
|
||||
/*
|
||||
* ms_staff
|
||||
@@ -248,4 +248,4 @@ command { service = "MemoServ"; name = "SET"; command = "memoserv/set"; }
|
||||
* Used to send a memo to all registered staff members.
|
||||
*/
|
||||
module { name = "ms_staff" }
|
||||
command { service = "MemoServ"; name = "STAFF"; command = "memoserv/staff"; permission = "memoserv/staff"; }
|
||||
command { service = "MemoServ"; name = "STAFF"; command = "memoserv/staff"; permission = "memoserv/staff" }
|
||||
|
||||
@@ -374,30 +374,6 @@ module { name = "help" }
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* redis
|
||||
*
|
||||
* This module allows other modules to use Redis.
|
||||
*/
|
||||
#module
|
||||
{
|
||||
name = "redis"
|
||||
|
||||
/* A redis database */
|
||||
redis
|
||||
{
|
||||
/* The name of this service */
|
||||
name = "redis/main"
|
||||
|
||||
/*
|
||||
* The redis database to use. New connections default to 0.
|
||||
*/
|
||||
db = 0
|
||||
|
||||
ip = "127.0.0.1"
|
||||
port = 6379
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* [EXTRA] regex_pcre2
|
||||
|
||||
+87
-72
@@ -113,6 +113,7 @@ module
|
||||
* - memo_signon: Notify user if they have a new memo when they sign into the nick
|
||||
* - memo_receive: Notify user if they have a new memo as soon as it's received
|
||||
* - memo_mail: Notify user if they have a new memo by mail
|
||||
* - autologin: User will be automatically logged in when they connect with a known SSL cert.
|
||||
* - autoop: User will be automatically opped in channels they enter and have access to
|
||||
* - neverop: User can not be added to access lists
|
||||
* - msg: Messages will be sent as PRIVMSGs instead of NOTICEs
|
||||
@@ -280,7 +281,7 @@ command_group
|
||||
}
|
||||
|
||||
/* Give it a help command. */
|
||||
command { service = "NickServ"; name = "HELP"; command = "generic/help"; }
|
||||
command { service = "NickServ"; name = "HELP"; command = "generic/help" }
|
||||
|
||||
/*
|
||||
* ns_ajoin
|
||||
@@ -298,7 +299,7 @@ module
|
||||
*/
|
||||
ajoinmax = 10
|
||||
}
|
||||
command { service = "NickServ"; name = "AJOIN"; command = "nickserv/ajoin"; }
|
||||
command { service = "NickServ"; name = "AJOIN"; command = "nickserv/ajoin" }
|
||||
|
||||
/*
|
||||
* ns_alist
|
||||
@@ -308,8 +309,8 @@ command { service = "NickServ"; name = "AJOIN"; command = "nickserv/ajoin"; }
|
||||
* Used for viewing what channels you have access to.
|
||||
*/
|
||||
module { name = "ns_alist" }
|
||||
command { service = "NickServ"; name = "ALIST"; command = "nickserv/alist"; }
|
||||
command { service = "NickServ"; name = "ACCESS"; command = "nickserv/alist"; hide = yes; }
|
||||
command { service = "NickServ"; name = "ALIST"; command = "nickserv/alist" }
|
||||
command { service = "NickServ"; name = "ACCESS"; command = "nickserv/alist"; hide = yes }
|
||||
|
||||
/*
|
||||
* ns_cert
|
||||
@@ -334,7 +335,10 @@ module
|
||||
*/
|
||||
max = 5
|
||||
}
|
||||
command { service = "NickServ"; name = "CERT"; command = "nickserv/cert"; }
|
||||
command { service = "NickServ"; name = "CERT"; command = "nickserv/cert" }
|
||||
command { service = "NickServ"; name = "SET AUTOLOGIN"; command = "nickserv/set/autologin" }
|
||||
command { service = "NickServ"; name = "SASET AUTOLOGIN"; command = "nickserv/saset/autologin"; permission = "nickserv/saset/autologin" }
|
||||
|
||||
|
||||
/*
|
||||
* ns_confirm
|
||||
@@ -344,7 +348,7 @@ command { service = "NickServ"; name = "CERT"; command = "nickserv/cert"; }
|
||||
* Used for confirming previous account actions.
|
||||
*/
|
||||
module { name = "ns_confirm" }
|
||||
command { service = "NickServ"; name = "CONFIRM"; command = "nickserv/confirm"; }
|
||||
command { service = "NickServ"; name = "CONFIRM"; command = "nickserv/confirm" }
|
||||
|
||||
/*
|
||||
* ns_drop
|
||||
@@ -354,7 +358,7 @@ command { service = "NickServ"; name = "CONFIRM"; command = "nickserv/confirm";
|
||||
* Used for unregistering names.
|
||||
*/
|
||||
module { name = "ns_drop" }
|
||||
command { service = "NickServ"; name = "DROP"; command = "nickserv/drop"; }
|
||||
command { service = "NickServ"; name = "DROP"; command = "nickserv/drop" }
|
||||
|
||||
/*
|
||||
* ns_email
|
||||
@@ -391,10 +395,10 @@ module
|
||||
*/
|
||||
#remove_aliases = yes
|
||||
}
|
||||
command { service = "NickServ"; name = "CONFIRM EMAIL"; command = "nickserv/confirm/email"; }
|
||||
command { service = "NickServ"; name = "GETEMAIL"; command = "nickserv/getemail"; permission = "nickserv/getemail"; group = "nickserv/admin"; }
|
||||
command { service = "NickServ"; name = "SET EMAIL"; command = "nickserv/set/email"; }
|
||||
command { service = "NickServ"; name = "SASET EMAIL"; command = "nickserv/saset/email"; permission = "nickserv/saset/email"; }
|
||||
command { service = "NickServ"; name = "CONFIRM EMAIL"; command = "nickserv/confirm/email" }
|
||||
command { service = "NickServ"; name = "GETEMAIL"; command = "nickserv/getemail"; permission = "nickserv/getemail"; group = "nickserv/admin" }
|
||||
command { service = "NickServ"; name = "SET EMAIL"; command = "nickserv/set/email" }
|
||||
command { service = "NickServ"; name = "SASET EMAIL"; command = "nickserv/saset/email"; permission = "nickserv/saset/email" }
|
||||
|
||||
/*
|
||||
* ns_group
|
||||
@@ -428,15 +432,15 @@ module
|
||||
*/
|
||||
nogroupchange = yes
|
||||
}
|
||||
command { service = "NickServ"; name = "GLIST"; command = "nickserv/glist"; }
|
||||
command { service = "NickServ"; name = "GROUP"; command = "nickserv/group"; }
|
||||
command { service = "NickServ"; name = "UNGROUP"; command = "nickserv/ungroup"; }
|
||||
command { service = "NickServ"; name = "SET DISPLAY"; command = "nickserv/set/display"; }
|
||||
command { service = "NickServ"; name = "SASET DISPLAY"; command = "nickserv/saset/display"; permission = "nickserv/saset/display"; }
|
||||
command { service = "NickServ"; name = "GLIST"; command = "nickserv/glist" }
|
||||
command { service = "NickServ"; name = "GROUP"; command = "nickserv/group" }
|
||||
command { service = "NickServ"; name = "UNGROUP"; command = "nickserv/ungroup" }
|
||||
command { service = "NickServ"; name = "SET DISPLAY"; command = "nickserv/set/display" }
|
||||
command { service = "NickServ"; name = "SASET DISPLAY"; command = "nickserv/saset/display"; permission = "nickserv/saset/display" }
|
||||
|
||||
# For compatibility with Atheme.
|
||||
command { service = "NickServ"; name = "SET ACCOUNTNAME"; command = "nickserv/set/display"; hide = yes; }
|
||||
command { service = "NickServ"; name = "SASET ACCOUNTNAME"; command = "nickserv/saset/display"; permission = "nickserv/saset/display"; hide = yes; }
|
||||
command { service = "NickServ"; name = "SET ACCOUNTNAME"; command = "nickserv/set/display"; hide = yes }
|
||||
command { service = "NickServ"; name = "SASET ACCOUNTNAME"; command = "nickserv/saset/display"; permission = "nickserv/saset/display"; hide = yes }
|
||||
|
||||
/*
|
||||
* ns_identify
|
||||
@@ -454,8 +458,8 @@ module
|
||||
*/
|
||||
maxlogins = 10
|
||||
}
|
||||
command { service = "NickServ"; name = "ID"; command = "nickserv/identify"; hide = yes; }
|
||||
command { service = "NickServ"; name = "IDENTIFY"; command = "nickserv/identify"; }
|
||||
command { service = "NickServ"; name = "ID"; command = "nickserv/identify"; hide = yes }
|
||||
command { service = "NickServ"; name = "IDENTIFY"; command = "nickserv/identify" }
|
||||
|
||||
/*
|
||||
* ns_info
|
||||
@@ -466,10 +470,10 @@ command { service = "NickServ"; name = "IDENTIFY"; command = "nickserv/identify"
|
||||
*
|
||||
*/
|
||||
module { name = "ns_info" }
|
||||
command { service = "NickServ"; name = "INFO"; command = "nickserv/info"; }
|
||||
command { service = "NickServ"; name = "INFO"; command = "nickserv/info" }
|
||||
|
||||
command { service = "NickServ"; name = "SET HIDE"; command = "nickserv/set/hide"; }
|
||||
command { service = "NickServ"; name = "SASET HIDE"; command = "nickserv/saset/hide"; permission = "nickserv/saset/hide"; }
|
||||
command { service = "NickServ"; name = "SET HIDE"; command = "nickserv/set/hide" }
|
||||
command { service = "NickServ"; name = "SASET HIDE"; command = "nickserv/saset/hide"; permission = "nickserv/saset/hide" }
|
||||
|
||||
/*
|
||||
* ns_list
|
||||
@@ -488,9 +492,9 @@ module
|
||||
*/
|
||||
listmax = 50
|
||||
}
|
||||
command { service = "NickServ"; name = "LIST"; command = "nickserv/list"; }
|
||||
command { service = "NickServ"; name = "SET PRIVATE"; command = "nickserv/set/private"; }
|
||||
command { service = "NickServ"; name = "SASET PRIVATE"; command = "nickserv/saset/private"; permission = "nickserv/saset/private"; }
|
||||
command { service = "NickServ"; name = "LIST"; command = "nickserv/list" }
|
||||
command { service = "NickServ"; name = "SET PRIVATE"; command = "nickserv/set/private" }
|
||||
command { service = "NickServ"; name = "SASET PRIVATE"; command = "nickserv/saset/private"; permission = "nickserv/saset/private" }
|
||||
|
||||
/*
|
||||
* ns_logout
|
||||
@@ -500,7 +504,7 @@ command { service = "NickServ"; name = "SASET PRIVATE"; command = "nickserv/sase
|
||||
* Used for logging out of your account.
|
||||
*/
|
||||
module { name = "ns_logout" }
|
||||
command { service = "NickServ"; name = "LOGOUT"; command = "nickserv/logout"; }
|
||||
command { service = "NickServ"; name = "LOGOUT"; command = "nickserv/logout" }
|
||||
|
||||
/*
|
||||
* ns_recover
|
||||
@@ -521,11 +525,11 @@ module
|
||||
*/
|
||||
restoreonrecover = yes
|
||||
}
|
||||
command { service = "NickServ"; name = "RECOVER"; command = "nickserv/recover"; }
|
||||
command { service = "NickServ"; name = "RECOVER"; command = "nickserv/recover" }
|
||||
|
||||
# For compatibility with Anope 1.8 and Atheme.
|
||||
command { service = "NickServ"; name = "GHOST"; command = "nickserv/recover"; hide = yes; }
|
||||
command { service = "NickServ"; name = "RELEASE"; command = "nickserv/recover"; hide = yes; }
|
||||
command { service = "NickServ"; name = "GHOST"; command = "nickserv/recover"; hide = yes }
|
||||
command { service = "NickServ"; name = "RELEASE"; command = "nickserv/recover"; hide = yes }
|
||||
|
||||
/*
|
||||
* ns_register
|
||||
@@ -570,9 +574,9 @@ module
|
||||
*/
|
||||
#unconfirmedexpire = 1d
|
||||
}
|
||||
command { service = "NickServ"; name = "CONFIRM REGISTER"; command = "nickserv/confirm/register"; }
|
||||
command { service = "NickServ"; name = "REGISTER"; command = "nickserv/register"; }
|
||||
command { service = "NickServ"; name = "RESEND"; command = "nickserv/resend"; }
|
||||
command { service = "NickServ"; name = "CONFIRM REGISTER"; command = "nickserv/confirm/register" }
|
||||
command { service = "NickServ"; name = "REGISTER"; command = "nickserv/register" }
|
||||
command { service = "NickServ"; name = "RESEND"; command = "nickserv/resend" }
|
||||
|
||||
/*
|
||||
* ns_resetpass
|
||||
@@ -591,11 +595,11 @@ module
|
||||
*/
|
||||
#resetexpire = 1d
|
||||
}
|
||||
command { service = "NickServ"; name = "CONFIRM RESETPASS"; command = "nickserv/confirm/resetpass"; }
|
||||
command { service = "NickServ"; name = "RESETPASS"; command = "nickserv/resetpass"; }
|
||||
command { service = "NickServ"; name = "CONFIRM RESETPASS"; command = "nickserv/confirm/resetpass" }
|
||||
command { service = "NickServ"; name = "RESETPASS"; command = "nickserv/resetpass" }
|
||||
|
||||
# For compatibility with Anope 2.0.
|
||||
command { service = "NickServ"; name = "GETPASS"; command = "nickserv/resetpass"; hide = yes; }
|
||||
command { service = "NickServ"; name = "GETPASS"; command = "nickserv/resetpass"; hide = yes }
|
||||
|
||||
/*
|
||||
* ns_sasl
|
||||
@@ -661,13 +665,13 @@ module { name = "ns_sasl_plain" }
|
||||
*/
|
||||
module { name = "ns_set" }
|
||||
|
||||
command { service = "NickServ"; name = "SET"; command = "nickserv/set"; }
|
||||
command { service = "NickServ"; name = "SASET"; command = "nickserv/saset"; permission = "nickserv/saset/"; group = "nickserv/admin"; }
|
||||
command { service = "NickServ"; name = "SET"; command = "nickserv/set" }
|
||||
command { service = "NickServ"; name = "SASET"; command = "nickserv/saset"; permission = "nickserv/saset/"; group = "nickserv/admin" }
|
||||
|
||||
command { service = "NickServ"; name = "SET PASSWORD"; command = "nickserv/set/password"; }
|
||||
command { service = "NickServ"; name = "SASET PASSWORD"; command = "nickserv/saset/password"; permission = "nickserv/saset/password"; }
|
||||
command { service = "NickServ"; name = "SET PASSWORD"; command = "nickserv/set/password" }
|
||||
command { service = "NickServ"; name = "SASET PASSWORD"; command = "nickserv/saset/password"; permission = "nickserv/saset/password" }
|
||||
|
||||
command { service = "NickServ"; name = "SASET NOEXPIRE"; command = "nickserv/saset/noexpire"; permission = "nickserv/saset/noexpire"; }
|
||||
command { service = "NickServ"; name = "SASET NOEXPIRE"; command = "nickserv/saset/noexpire"; permission = "nickserv/saset/noexpire" }
|
||||
|
||||
/*
|
||||
* ns_set_keepmodes
|
||||
@@ -687,8 +691,8 @@ module
|
||||
*/
|
||||
#norestore = "ABCabc"
|
||||
}
|
||||
command { service = "NickServ"; name = "SET KEEPMODES"; command = "nickserv/set/keepmodes"; }
|
||||
command { service = "NickServ"; name = "SASET KEEPMODES"; command = "nickserv/saset/keepmodes"; permission = "nickserv/saset/keepmodes"; }
|
||||
command { service = "NickServ"; name = "SET KEEPMODES"; command = "nickserv/set/keepmodes" }
|
||||
command { service = "NickServ"; name = "SASET KEEPMODES"; command = "nickserv/saset/keepmodes"; permission = "nickserv/saset/keepmodes" }
|
||||
|
||||
/*
|
||||
* ns_set_language
|
||||
@@ -698,8 +702,8 @@ command { service = "NickServ"; name = "SASET KEEPMODES"; command = "nickserv/sa
|
||||
* Allows configuring the language that services uses.
|
||||
*/
|
||||
module { name = "ns_set_language" }
|
||||
command { service = "NickServ"; name = "SET LANGUAGE"; command = "nickserv/set/language"; }
|
||||
command { service = "NickServ"; name = "SASET LANGUAGE"; command = "nickserv/saset/language"; permission = "nickserv/saset/language"; }
|
||||
command { service = "NickServ"; name = "SET LANGUAGE"; command = "nickserv/set/language" }
|
||||
command { service = "NickServ"; name = "SASET LANGUAGE"; command = "nickserv/saset/language"; permission = "nickserv/saset/language" }
|
||||
|
||||
/*
|
||||
* ns_set_layout
|
||||
@@ -709,8 +713,8 @@ command { service = "NickServ"; name = "SASET LANGUAGE"; command = "nickserv/sas
|
||||
* Allows configuring the layout that services uses.
|
||||
*/
|
||||
module { name = "ns_set_layout" }
|
||||
command { service = "NickServ"; name = "SET LAYOUT"; command = "nickserv/set/layout"; }
|
||||
command { service = "NickServ"; name = "SASET LAYOUT"; command = "nickserv/saset/layout"; permission = "nickserv/saset/layout"; }
|
||||
command { service = "NickServ"; name = "SET LAYOUT"; command = "nickserv/set/layout" }
|
||||
command { service = "NickServ"; name = "SASET LAYOUT"; command = "nickserv/saset/layout"; permission = "nickserv/saset/layout" }
|
||||
|
||||
/*
|
||||
* ns_set_message
|
||||
@@ -724,24 +728,35 @@ command { service = "NickServ"; name = "SASET LAYOUT"; command = "nickserv/saset
|
||||
* message loops. Only enable this if you are sure this can not happen.
|
||||
*/
|
||||
#module { name = "ns_set_message" }
|
||||
#command { service = "NickServ"; name = "SET MESSAGE"; command = "nickserv/set/message"; }
|
||||
#command { service = "NickServ"; name = "SASET MESSAGE"; command = "nickserv/saset/message"; permission = "nickserv/saset/message"; }
|
||||
#command { service = "NickServ"; name = "SET MESSAGE"; command = "nickserv/set/message" }
|
||||
#command { service = "NickServ"; name = "SASET MESSAGE"; command = "nickserv/saset/message"; permission = "nickserv/saset/message" }
|
||||
|
||||
/*
|
||||
* ns_set_misc
|
||||
*
|
||||
* Provides the command nickserv/set/misc.
|
||||
*
|
||||
* Allows you to create arbitrary commands to set data, and have that data show up in nickserv/info.
|
||||
* A field named misc_description may be given for use with help output.
|
||||
* Allows you to create arbitrary commands to set data, and have that data show
|
||||
* up in nickserv/info. You can configure this using the following fields:
|
||||
*
|
||||
* misc_description: A description of the command to show in the help.
|
||||
* misc_title: A human-readable description of the stored data.
|
||||
* misc_pattern: If defined then a regex pattern (using the engine specified
|
||||
* in <options:regexengine> to validate the data with).
|
||||
* misc_syntax: If defined then the syntax to show in the help output and, if
|
||||
* misc_pattern is defined, when a user specifies an invalid
|
||||
* value.
|
||||
* misc_swhois: Whether to also show the data in the WHOIS output of logged
|
||||
* in users. Requires that your IRCd supports multiple swhois
|
||||
entries.
|
||||
*/
|
||||
module { name = "ns_set_misc" }
|
||||
command { service = "NickServ"; name = "SET URL"; command = "nickserv/set/misc"; misc_description = _("Associate a URL with your account"); }
|
||||
command { service = "NickServ"; name = "SASET URL"; command = "nickserv/saset/misc"; misc_description = _("Associate a URL with this account"); permission = "nickserv/saset/url"; group = "nickserv/admin"; }
|
||||
#command { service = "NickServ"; name = "SET MASTODON"; command = "nickserv/set/misc"; misc_description = _("Associate a Mastodon account with your account"); }
|
||||
#command { service = "NickServ"; name = "SASET MASTODON"; command = "nickserv/saset/misc"; misc_description = _("Associate a Mastodon account with this account"); permission = "nickserv/saset/mastodon"; group = "nickserv/admin"; }
|
||||
#command { service = "NickServ"; name = "SET LOCATION"; command = "nickserv/set/misc"; misc_description = _("Associate a location with your account"); }
|
||||
#command { service = "NickServ"; name = "SASET LOCATION"; command = "nickserv/saset/misc"; misc_description = _("Associate a location with this account"); permission = "nickserv/saset/location"; group = "nickserv/admin"; }
|
||||
command { service = "NickServ"; name = "SET URL"; command = "nickserv/set/misc"; misc_description = _("Associate a URL with your account"); misc_pattern = "^https?:\/\/\S+$"; misc_swhois = yes }
|
||||
command { service = "NickServ"; name = "SASET URL"; command = "nickserv/saset/misc"; misc_description = _("Associate a URL with this account"); permission = "nickserv/saset/url"; group = "nickserv/admin" }
|
||||
#command { service = "NickServ"; name = "SET MASTODON"; command = "nickserv/set/misc"; misc_description = _("Associate a Mastodon account with your account"); misc_pattern = "^@\S+@\S+\.\S+$"; misc_title = _("Mastodon") }
|
||||
#command { service = "NickServ"; name = "SASET MASTODON"; command = "nickserv/saset/misc"; misc_description = _("Associate a Mastodon account with this account"); permission = "nickserv/saset/mastodon"; group = "nickserv/admin" }
|
||||
#command { service = "NickServ"; name = "SET LOCATION"; command = "nickserv/set/misc"; misc_description = _("Associate a location with your account"); misc_title = _("Location") }
|
||||
#command { service = "NickServ"; name = "SASET LOCATION"; command = "nickserv/saset/misc"; misc_description = _("Associate a location with this account"); permission = "nickserv/saset/location"; group = "nickserv/admin" }
|
||||
|
||||
/*
|
||||
* ns_set_op
|
||||
@@ -752,15 +767,15 @@ command { service = "NickServ"; name = "SASET URL"; command = "nickserv/saset/mi
|
||||
*/
|
||||
module { name = "ns_set_op" }
|
||||
|
||||
command { service = "NickServ"; name = "SET AUTOOP"; command = "nickserv/set/autoop"; }
|
||||
command { service = "NickServ"; name = "SASET AUTOOP"; command = "nickserv/saset/autoop"; permission = "nickserv/saset/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" }
|
||||
|
||||
command { service = "NickServ"; name = "SET NEVEROP"; command = "nickserv/set/neverop"; }
|
||||
command { service = "NickServ"; name = "SASET NEVEROP"; command = "nickserv/saset/neverop"; permission = "nickserv/saset/neverop"; }
|
||||
command { service = "NickServ"; name = "SET NEVEROP"; command = "nickserv/set/neverop" }
|
||||
command { service = "NickServ"; name = "SASET NEVEROP"; command = "nickserv/saset/neverop"; permission = "nickserv/saset/neverop" }
|
||||
|
||||
# For compatibility with DALnet Services.
|
||||
command { service = "NickServ"; name = "SET NOOP"; command = "nickserv/set/neverop"; hide = yes; }
|
||||
command { service = "NickServ"; name = "SASET NOOP"; command = "nickserv/saset/neverop"; permission = "nickserv/saset/neverop"; hide = yes; }
|
||||
command { service = "NickServ"; name = "SET NOOP"; command = "nickserv/set/neverop"; hide = yes }
|
||||
command { service = "NickServ"; name = "SASET NOOP"; command = "nickserv/saset/neverop"; permission = "nickserv/saset/neverop"; hide = yes }
|
||||
|
||||
/*
|
||||
* ns_set_protect
|
||||
@@ -770,12 +785,12 @@ command { service = "NickServ"; name = "SASET NOOP"; command = "nickserv/saset/n
|
||||
* Used for configuring nickname protection.
|
||||
*/
|
||||
module { name = "ns_set_protect" }
|
||||
command { service = "NickServ"; name = "SET PROTECT"; command = "nickserv/set/protect"; }
|
||||
command { service = "NickServ"; name = "SASET PROTECT"; command = "nickserv/saset/protect"; permission = "nickserv/saset/protect"; }
|
||||
command { service = "NickServ"; name = "SET PROTECT"; command = "nickserv/set/protect" }
|
||||
command { service = "NickServ"; name = "SASET PROTECT"; command = "nickserv/saset/protect"; permission = "nickserv/saset/protect" }
|
||||
|
||||
# For compatibility with Anope 2.0.
|
||||
command { service = "NickServ"; name = "SET KILL"; command = "nickserv/set/protect"; hide = yes; }
|
||||
command { service = "NickServ"; name = "SASET KILL"; command = "nickserv/saset/protect"; permission = "nickserv/saset/protect"; hide = yes; }
|
||||
command { service = "NickServ"; name = "SET KILL"; command = "nickserv/set/protect"; hide = yes }
|
||||
command { service = "NickServ"; name = "SASET KILL"; command = "nickserv/saset/protect"; permission = "nickserv/saset/protect"; hide = yes }
|
||||
|
||||
/*
|
||||
* ns_set_timezone
|
||||
@@ -785,8 +800,8 @@ command { service = "NickServ"; name = "SASET KILL"; command = "nickserv/saset/p
|
||||
* Allows configuring the timezone that services uses.
|
||||
*/
|
||||
module { name = "ns_set_timezone" }
|
||||
command { service = "NickServ"; name = "SET TIMEZONE"; command = "nickserv/set/timezone"; }
|
||||
command { service = "NickServ"; name = "SASET TIMEZONE"; command = "nickserv/saset/timezone"; permission = "nickserv/saset/timezone"; }
|
||||
command { service = "NickServ"; name = "SET TIMEZONE"; command = "nickserv/set/timezone" }
|
||||
command { service = "NickServ"; name = "SASET TIMEZONE"; command = "nickserv/saset/timezone"; permission = "nickserv/saset/timezone" }
|
||||
|
||||
/*
|
||||
* ns_suspend
|
||||
@@ -813,8 +828,8 @@ module
|
||||
*/
|
||||
show = "suspended, by, reason, on, expires"
|
||||
}
|
||||
command { service = "NickServ"; name = "SUSPEND"; command = "nickserv/suspend"; permission = "nickserv/suspend"; group = "nickserv/admin"; }
|
||||
command { service = "NickServ"; name = "UNSUSPEND"; command = "nickserv/unsuspend"; permission = "nickserv/suspend"; group = "nickserv/admin"; }
|
||||
command { service = "NickServ"; name = "SUSPEND"; command = "nickserv/suspend"; permission = "nickserv/suspend"; group = "nickserv/admin" }
|
||||
command { service = "NickServ"; name = "UNSUSPEND"; command = "nickserv/unsuspend"; permission = "nickserv/suspend"; group = "nickserv/admin" }
|
||||
|
||||
/*
|
||||
* ns_update
|
||||
@@ -824,4 +839,4 @@ command { service = "NickServ"; name = "UNSUSPEND"; command = "nickserv/unsuspen
|
||||
* Used to update your status on all channels, turn on your vhost, etc.
|
||||
*/
|
||||
module { name = "ns_update" }
|
||||
command { service = "NickServ"; name = "UPDATE"; command = "nickserv/update"; }
|
||||
command { service = "NickServ"; name = "UPDATE"; command = "nickserv/update" }
|
||||
|
||||
+45
-45
@@ -143,7 +143,7 @@ module
|
||||
*/
|
||||
|
||||
/* Give it a help command. */
|
||||
command { service = "OperServ"; name = "HELP"; command = "generic/help"; }
|
||||
command { service = "OperServ"; name = "HELP"; command = "generic/help" }
|
||||
|
||||
/*
|
||||
* os_akill
|
||||
@@ -153,7 +153,7 @@ command { service = "OperServ"; name = "HELP"; command = "generic/help"; }
|
||||
* Used to ban users from the network.
|
||||
*/
|
||||
module { name = "os_akill" }
|
||||
command { service = "OperServ"; name = "AKILL"; command = "operserv/akill"; permission = "operserv/akill"; }
|
||||
command { service = "OperServ"; name = "AKILL"; command = "operserv/akill"; permission = "operserv/akill" }
|
||||
|
||||
/*
|
||||
* os_chankill
|
||||
@@ -163,7 +163,7 @@ command { service = "OperServ"; name = "AKILL"; command = "operserv/akill"; perm
|
||||
* Used to akill users from an entire channel.
|
||||
*/
|
||||
module { name = "os_chankill" }
|
||||
command { service = "OperServ"; name = "CHANKILL"; command = "operserv/chankill"; permission = "operserv/chankill"; }
|
||||
command { service = "OperServ"; name = "CHANKILL"; command = "operserv/chankill"; permission = "operserv/chankill" }
|
||||
|
||||
/*
|
||||
* os_defcon
|
||||
@@ -271,7 +271,7 @@ command { service = "OperServ"; name = "CHANKILL"; command = "operserv/chankill"
|
||||
*/
|
||||
#akillreason = "This network is currently not accepting connections, please try again later."
|
||||
}
|
||||
#command { service = "OperServ"; name = "DEFCON"; command = "operserv/defcon"; permission = "operserv/defcon"; }
|
||||
#command { service = "OperServ"; name = "DEFCON"; command = "operserv/defcon"; permission = "operserv/defcon" }
|
||||
|
||||
/*
|
||||
* os_dns
|
||||
@@ -292,10 +292,10 @@ command { service = "OperServ"; name = "CHANKILL"; command = "operserv/chankill"
|
||||
*
|
||||
* To do this using BIND, configure similar to:
|
||||
*
|
||||
* options { max-refresh-time 60; };
|
||||
* options { max-refresh-time 60 };
|
||||
* zone "irc.example.com" IN {
|
||||
* type secondary;
|
||||
* primaries { 127.0.0.1 port 5353; };
|
||||
* primaries { 127.0.0.1 port 5353 };
|
||||
* };
|
||||
*
|
||||
* Where 127.0.0.1:5353 is the IP and port services are listening on.
|
||||
@@ -332,7 +332,7 @@ command { service = "OperServ"; name = "CHANKILL"; command = "operserv/chankill"
|
||||
*/
|
||||
readd_connected_servers = no
|
||||
}
|
||||
#command { service = "OperServ"; name = "DNS"; command = "operserv/dns"; permission = "operserv/dns"; }
|
||||
#command { service = "OperServ"; name = "DNS"; command = "operserv/dns"; permission = "operserv/dns" }
|
||||
|
||||
/*
|
||||
* os_config
|
||||
@@ -342,7 +342,7 @@ command { service = "OperServ"; name = "CHANKILL"; command = "operserv/chankill"
|
||||
* Used to view and set configuration options while services are running.
|
||||
*/
|
||||
module { name = "os_config" }
|
||||
command { service = "OperServ"; name = "CONFIG"; command = "operserv/config"; permission = "operserv/config"; }
|
||||
command { service = "OperServ"; name = "CONFIG"; command = "operserv/config"; permission = "operserv/config" }
|
||||
|
||||
/*
|
||||
* os_forbid
|
||||
@@ -379,7 +379,7 @@ module
|
||||
}
|
||||
|
||||
}
|
||||
command { service = "OperServ"; name = "FORBID"; command = "operserv/forbid"; permission = "operserv/forbid"; }
|
||||
command { service = "OperServ"; name = "FORBID"; command = "operserv/forbid"; permission = "operserv/forbid" }
|
||||
|
||||
/*
|
||||
* os_ignore
|
||||
@@ -389,7 +389,7 @@ command { service = "OperServ"; name = "FORBID"; command = "operserv/forbid"; pe
|
||||
* Used to make Anope ignore users.
|
||||
*/
|
||||
module { name = "os_ignore" }
|
||||
command { service = "OperServ"; name = "IGNORE"; command = "operserv/ignore"; permission = "operserv/ignore"; }
|
||||
command { service = "OperServ"; name = "IGNORE"; command = "operserv/ignore"; permission = "operserv/ignore" }
|
||||
|
||||
/*
|
||||
* os_info
|
||||
@@ -399,7 +399,7 @@ command { service = "OperServ"; name = "IGNORE"; command = "operserv/ignore"; pe
|
||||
* Used to add oper only notes to users and channels.
|
||||
*/
|
||||
module { name = "os_info" }
|
||||
command { service = "OperServ"; name = "INFO"; command = "operserv/info"; permission = "operserv/info"; }
|
||||
command { service = "OperServ"; name = "INFO"; command = "operserv/info"; permission = "operserv/info" }
|
||||
|
||||
/*
|
||||
* os_jupe
|
||||
@@ -409,7 +409,7 @@ command { service = "OperServ"; name = "INFO"; command = "operserv/info"; permis
|
||||
* Used to disconnect servers from the network and prevent them from relinking.
|
||||
*/
|
||||
module { name = "os_jupe" }
|
||||
command { service = "OperServ"; name = "JUPE"; command = "operserv/jupe"; permission = "operserv/jupe"; }
|
||||
command { service = "OperServ"; name = "JUPE"; command = "operserv/jupe"; permission = "operserv/jupe" }
|
||||
|
||||
/*
|
||||
* os_kick
|
||||
@@ -419,7 +419,7 @@ command { service = "OperServ"; name = "JUPE"; command = "operserv/jupe"; permis
|
||||
* Used to kick users from channels.
|
||||
*/
|
||||
module { name = "os_kick" }
|
||||
command { service = "OperServ"; name = "KICK"; command = "operserv/kick"; permission = "operserv/kick"; }
|
||||
command { service = "OperServ"; name = "KICK"; command = "operserv/kick"; permission = "operserv/kick" }
|
||||
|
||||
/*
|
||||
* os_kill
|
||||
@@ -429,7 +429,7 @@ command { service = "OperServ"; name = "KICK"; command = "operserv/kick"; permis
|
||||
* Used to forcibly disconnect users from the network.
|
||||
*/
|
||||
module { name = "os_kill" }
|
||||
command { service = "OperServ"; name = "KILL"; command = "operserv/kill"; permission = "operserv/kill"; }
|
||||
command { service = "OperServ"; name = "KILL"; command = "operserv/kill"; permission = "operserv/kill" }
|
||||
|
||||
/*
|
||||
* os_list
|
||||
@@ -439,8 +439,8 @@ command { service = "OperServ"; name = "KILL"; command = "operserv/kill"; permis
|
||||
* Used to list and search the channels and users currently on the network.
|
||||
*/
|
||||
module { name = "os_list" }
|
||||
command { service = "OperServ"; name = "CHANLIST"; command = "operserv/chanlist"; permission = "operserv/chanlist"; }
|
||||
command { service = "OperServ"; name = "USERLIST"; command = "operserv/userlist"; permission = "operserv/userlist"; }
|
||||
command { service = "OperServ"; name = "CHANLIST"; command = "operserv/chanlist"; permission = "operserv/chanlist" }
|
||||
command { service = "OperServ"; name = "USERLIST"; command = "operserv/userlist"; permission = "operserv/userlist" }
|
||||
|
||||
/*
|
||||
* os_login
|
||||
@@ -450,8 +450,8 @@ command { service = "OperServ"; name = "USERLIST"; command = "operserv/userlist"
|
||||
* 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"; }
|
||||
command { service = "OperServ"; name = "LOGIN"; command = "operserv/login" }
|
||||
command { service = "OperServ"; name = "LOGOUT"; command = "operserv/logout" }
|
||||
|
||||
/*
|
||||
* os_logsearch
|
||||
@@ -469,7 +469,7 @@ module
|
||||
*/
|
||||
logname = "services.log"
|
||||
}
|
||||
command { service = "OperServ"; name = "LOGSEARCH"; command = "operserv/logsearch"; permission = "operserv/logsearch"; }
|
||||
command { service = "OperServ"; name = "LOGSEARCH"; command = "operserv/logsearch"; permission = "operserv/logsearch" }
|
||||
|
||||
/*
|
||||
* os_mode
|
||||
@@ -479,8 +479,8 @@ command { service = "OperServ"; name = "LOGSEARCH"; command = "operserv/logsearc
|
||||
* Used to change user and channel modes.
|
||||
*/
|
||||
module { name = "os_mode" }
|
||||
command { service = "OperServ"; name = "UMODE"; command = "operserv/umode"; permission = "operserv/umode"; }
|
||||
command { service = "OperServ"; name = "MODE"; command = "operserv/mode"; permission = "operserv/mode"; }
|
||||
command { service = "OperServ"; name = "UMODE"; command = "operserv/umode"; permission = "operserv/umode" }
|
||||
command { service = "OperServ"; name = "MODE"; command = "operserv/mode"; permission = "operserv/mode" }
|
||||
|
||||
/*
|
||||
* os_modinfo
|
||||
@@ -490,8 +490,8 @@ command { service = "OperServ"; name = "MODE"; command = "operserv/mode"; permis
|
||||
* Used to show information about loaded modules.
|
||||
*/
|
||||
module { name = "os_modinfo" }
|
||||
command { service = "OperServ"; name = "MODINFO"; command = "operserv/modinfo"; permission = "operserv/modinfo"; }
|
||||
command { service = "OperServ"; name = "MODLIST"; command = "operserv/modlist"; permission = "operserv/modinfo"; }
|
||||
command { service = "OperServ"; name = "MODINFO"; command = "operserv/modinfo"; permission = "operserv/modinfo" }
|
||||
command { service = "OperServ"; name = "MODLIST"; command = "operserv/modlist"; permission = "operserv/modinfo" }
|
||||
|
||||
/*
|
||||
* os_module
|
||||
@@ -501,9 +501,9 @@ command { service = "OperServ"; name = "MODLIST"; command = "operserv/modlist";
|
||||
* Used to load, reload, and unload modules.
|
||||
*/
|
||||
module { name = "os_module" }
|
||||
command { service = "OperServ"; name = "MODLOAD"; command = "operserv/modload"; permission = "operserv/modload"; }
|
||||
command { service = "OperServ"; name = "MODRELOAD"; command = "operserv/modreload"; permission = "operserv/modload"; }
|
||||
command { service = "OperServ"; name = "MODUNLOAD"; command = "operserv/modunload"; permission = "operserv/modload"; }
|
||||
command { service = "OperServ"; name = "MODLOAD"; command = "operserv/modload"; permission = "operserv/modload" }
|
||||
command { service = "OperServ"; name = "MODRELOAD"; command = "operserv/modreload"; permission = "operserv/modload" }
|
||||
command { service = "OperServ"; name = "MODUNLOAD"; command = "operserv/modunload"; permission = "operserv/modload" }
|
||||
|
||||
/*
|
||||
* os_news
|
||||
@@ -537,9 +537,9 @@ module
|
||||
*/
|
||||
#showdate = yes
|
||||
}
|
||||
command { service = "OperServ"; name = "LOGONNEWS"; command = "operserv/logonnews"; permission = "operserv/news"; }
|
||||
command { service = "OperServ"; name = "OPERNEWS"; command = "operserv/opernews"; permission = "operserv/news"; }
|
||||
command { service = "OperServ"; name = "RANDOMNEWS"; command = "operserv/randomnews"; permission = "operserv/news"; }
|
||||
command { service = "OperServ"; name = "LOGONNEWS"; command = "operserv/logonnews"; permission = "operserv/news" }
|
||||
command { service = "OperServ"; name = "OPERNEWS"; command = "operserv/opernews"; permission = "operserv/news" }
|
||||
command { service = "OperServ"; name = "RANDOMNEWS"; command = "operserv/randomnews"; permission = "operserv/news" }
|
||||
|
||||
/*
|
||||
* os_noop
|
||||
@@ -549,7 +549,7 @@ command { service = "OperServ"; name = "RANDOMNEWS"; command = "operserv/randomn
|
||||
* Used to NOOP a server, which prevents users from opering on that server.
|
||||
*/
|
||||
#module { name = "os_noop" }
|
||||
command { service = "OperServ"; name = "NOOP"; command = "operserv/noop"; permission = "operserv/noop"; }
|
||||
command { service = "OperServ"; name = "NOOP"; command = "operserv/noop"; permission = "operserv/noop" }
|
||||
|
||||
/*
|
||||
* os_oper
|
||||
@@ -559,7 +559,7 @@ command { service = "OperServ"; name = "NOOP"; command = "operserv/noop"; permis
|
||||
* Used to configure opers and show information about opertypes.
|
||||
*/
|
||||
module { name = "os_oper" }
|
||||
command { service = "OperServ"; name = "OPER"; command = "operserv/oper"; permission = "operserv/oper"; }
|
||||
command { service = "OperServ"; name = "OPER"; command = "operserv/oper"; permission = "operserv/oper" }
|
||||
|
||||
/*
|
||||
* os_reload
|
||||
@@ -569,7 +569,7 @@ command { service = "OperServ"; name = "OPER"; command = "operserv/oper"; permis
|
||||
* Used to reload the anope.conf configuration file.
|
||||
*/
|
||||
module { name = "os_reload" }
|
||||
command { service = "OperServ"; name = "RELOAD"; command = "operserv/reload"; permission = "operserv/reload"; }
|
||||
command { service = "OperServ"; name = "RELOAD"; command = "operserv/reload"; permission = "operserv/reload" }
|
||||
|
||||
/*
|
||||
* os_session
|
||||
@@ -652,8 +652,8 @@ module
|
||||
session_ipv4_cidr = 32
|
||||
session_ipv6_cidr = 128
|
||||
}
|
||||
command { service = "OperServ"; name = "EXCEPTION"; command = "operserv/exception"; permission = "operserv/exception"; }
|
||||
command { service = "OperServ"; name = "SESSION"; command = "operserv/session"; permission = "operserv/session"; }
|
||||
command { service = "OperServ"; name = "EXCEPTION"; command = "operserv/exception"; permission = "operserv/exception" }
|
||||
command { service = "OperServ"; name = "SESSION"; command = "operserv/session"; permission = "operserv/session" }
|
||||
|
||||
/*
|
||||
* os_set
|
||||
@@ -674,7 +674,7 @@ module
|
||||
*/
|
||||
#superadmin = yes
|
||||
}
|
||||
command { service = "OperServ"; name = "SET"; command = "operserv/set"; permission = "operserv/set"; }
|
||||
command { service = "OperServ"; name = "SET"; command = "operserv/set"; permission = "operserv/set" }
|
||||
|
||||
/*
|
||||
* os_shutdown
|
||||
@@ -694,9 +694,9 @@ module
|
||||
*/
|
||||
requirename = yes
|
||||
}
|
||||
#command { service = "OperServ"; name = "QUIT"; command = "operserv/quit"; permission = "operserv/quit"; }
|
||||
command { service = "OperServ"; name = "RESTART"; command = "operserv/restart"; permission = "operserv/restart"; }
|
||||
command { service = "OperServ"; name = "SHUTDOWN"; command = "operserv/shutdown"; permission = "operserv/shutdown"; }
|
||||
#command { service = "OperServ"; name = "QUIT"; command = "operserv/quit"; permission = "operserv/quit" }
|
||||
command { service = "OperServ"; name = "RESTART"; command = "operserv/restart"; permission = "operserv/restart" }
|
||||
command { service = "OperServ"; name = "SHUTDOWN"; command = "operserv/shutdown"; permission = "operserv/shutdown" }
|
||||
|
||||
/*
|
||||
* os_stats
|
||||
@@ -706,7 +706,7 @@ command { service = "OperServ"; name = "SHUTDOWN"; command = "operserv/shutdown"
|
||||
* Used to show statistics about services.
|
||||
*/
|
||||
module { name = "os_stats" }
|
||||
command { service = "OperServ"; name = "STATS"; command = "operserv/stats"; permission = "operserv/stats"; }
|
||||
command { service = "OperServ"; name = "STATS"; command = "operserv/stats"; permission = "operserv/stats" }
|
||||
|
||||
/*
|
||||
* os_svs
|
||||
@@ -716,9 +716,9 @@ command { service = "OperServ"; name = "STATS"; command = "operserv/stats"; perm
|
||||
* Used to force users to change nicks, join and part channels.
|
||||
*/
|
||||
module { name = "os_svs" }
|
||||
command { service = "OperServ"; name = "SVSNICK"; command = "operserv/svsnick"; permission = "operserv/svs"; }
|
||||
command { service = "OperServ"; name = "SVSJOIN"; command = "operserv/svsjoin"; permission = "operserv/svs"; }
|
||||
command { service = "OperServ"; name = "SVSPART"; command = "operserv/svspart"; permission = "operserv/svs"; }
|
||||
command { service = "OperServ"; name = "SVSNICK"; command = "operserv/svsnick"; permission = "operserv/svs" }
|
||||
command { service = "OperServ"; name = "SVSJOIN"; command = "operserv/svsjoin"; permission = "operserv/svs" }
|
||||
command { service = "OperServ"; name = "SVSPART"; command = "operserv/svspart"; permission = "operserv/svs" }
|
||||
|
||||
/*
|
||||
* os_sxline
|
||||
@@ -728,8 +728,8 @@ command { service = "OperServ"; name = "SVSPART"; command = "operserv/svspart";
|
||||
* Used to ban real names, nick names, and possibly channels.
|
||||
*/
|
||||
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 = "SNLINE"; command = "operserv/snline"; permission = "operserv/snline" }
|
||||
command { service = "OperServ"; name = "SQLINE"; command = "operserv/sqline"; permission = "operserv/sqline" }
|
||||
|
||||
/*
|
||||
* os_update
|
||||
@@ -739,4 +739,4 @@ command { service = "OperServ"; name = "SQLINE"; command = "operserv/sqline"; pe
|
||||
* Use to immediately update the databases.
|
||||
*/
|
||||
module { name = "os_update" }
|
||||
command { service = "OperServ"; name = "UPDATE"; command = "operserv/update"; permission = "operserv/update"; }
|
||||
command { service = "OperServ"; name = "UPDATE"; command = "operserv/update"; permission = "operserv/update" }
|
||||
|
||||
+1
-1
@@ -27,7 +27,6 @@ contributions they have made, are:
|
||||
* MatthewM <mcm@they-got.us>
|
||||
* Sebastian V. <hal9000@denorastats.org>
|
||||
* Alvaro Toledo <atoledo@keldon.org>
|
||||
* Dragone2 <dragone2@risposteinformatiche.it>
|
||||
* Björn Stiddien <keeper@anope.org>
|
||||
* n0kS Phr33d0m <god@politeia.in>
|
||||
* Hendrik Jäger <gitcommit@henk.geekmail.org>
|
||||
@@ -39,6 +38,7 @@ contributions they have made, are:
|
||||
* Federico G. Schwindt <fgsch@lodoss.net>
|
||||
* Alexander Barton <alex@barton.de>
|
||||
* Cronus <cronus@nite-serv.com>
|
||||
* Dragone2 <dragone2@risposteinformatiche.it>
|
||||
* H7-25 <simos@simosnap.org>
|
||||
* Jyzee <jyzee.git@gmail.com>
|
||||
* Sebastian Barfurth <github@afreshmelon.com>
|
||||
|
||||
+135
@@ -1,5 +1,140 @@
|
||||
# Anope Change Log
|
||||
|
||||
## Anope 2.1.24 (unreleased)
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
* If a database contains duplicate corrupt entries from a prior write failure the oldest ones will now be purged from the database. This is a destructive action so make sure you take a manual backup of your database before upgrading.
|
||||
|
||||
* Removed support for storing the Anope database in Redis. The Redis code was extremely bitrotted, had not been tested in years, and to our knowledge has almost no (if any) users. It is recommended that db_redis users migrate to db_json or db_sql.
|
||||
|
||||
* SQL tables now use versioned prefixes by default. For the SQL database backends the default is `anope21_` and for ChanStats the default is `chanstats21_`. If you do not have a prefix explicitly set in your config you will need to add one it. Alternatively, you may also want to consider exporting to db_json and re-importing to update your SQL schema for the recent database layout changes.
|
||||
|
||||
### Changes
|
||||
|
||||
* Added some helper methods to `CommandSource` to allow quickly translting messages.
|
||||
|
||||
* Changed the Config script to allow multiple dashes in front of options, i.e. `-quick` and `--quick` are now equivalent.
|
||||
|
||||
* Converted some language strings to use format strings instead of concatenation.
|
||||
|
||||
* Fixed a rare crash in the ns_cert module.
|
||||
|
||||
* Fixed building Anope as a unity build.
|
||||
|
||||
* Fixed the ns_cert module erasing certificate entries if using an old database.
|
||||
|
||||
* Fixed users having the wrong real name in log messages on InspIRCd if it has been previously changed with `CHGNAME` or `SETNAME`.
|
||||
|
||||
## Anope 2.1.23 (2026-04-01)
|
||||
|
||||
### Changes
|
||||
|
||||
* Added examples to several BotServ commands.
|
||||
|
||||
* Added missing fields to the `RPL_STATSLINKINFO` output.
|
||||
|
||||
* Added support for migrating access entries between systems (currently only `chanserv/flags` is supported).
|
||||
|
||||
* Added the default levels to the `chanserv/levels` DESC help.
|
||||
|
||||
* Changed access listing commands to only show their own access entries unless `ALL` is specified.
|
||||
|
||||
* Fixed a non-translatable string which has been marked as translatable.
|
||||
|
||||
* Fixed the missing AUTOLOGIN extension.
|
||||
|
||||
* Fixed translating the help output when the flexible layout is used.
|
||||
|
||||
* Improved the accuracy of the X-line expiry time in `operserv/stats`.
|
||||
|
||||
* Updated the Portuguese translation.
|
||||
|
||||
* Updated the Romanian translation.
|
||||
|
||||
## Anope 2.1.22 (2026-03-01)
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
* Automatic login using a known SSL fingerprint now requires the `AUTOLOGIN` option to be set on accounts with `/NS SET AUTOLOGIN ON`. Automatic login is largely obsolete now SASL EXTERNAL exists and is widely supported.
|
||||
|
||||
* Conan 2 is now used for packaging dependencies on Windows. If you are building from source you will need to upgrade Conan.
|
||||
|
||||
* Non-breaking spaces in translatable messages now use 0x1B instead of 0x1A due to recent msgfmt releases treating 0x1A as an EOF character. If you have an out of tree translation you will need to update it.
|
||||
|
||||
* User TLS certificates are now stored in their own `NSCert` table instead of as a column in the `NickCore` table. If you are reading this information you will need to update your code.
|
||||
|
||||
### Changes
|
||||
|
||||
* Fixed `{botserv}:botmodes` erroneously allowing setting non-status modes on channels.
|
||||
|
||||
* Fixed echoing message tags on Solanum.
|
||||
|
||||
* Fixed handling incoming `FIDENT` messages on InspIRCd.
|
||||
|
||||
* Fixed matching stacked extended bans on InspIRCd and UnrealIRCd.
|
||||
|
||||
* Fixed parameter modes in `chanserv/mode` locks erroneously requiring a parameter to unset a lock.
|
||||
|
||||
* Fixed restoring the object identifier when unserialising objects in db_json.
|
||||
|
||||
* Fixed the consistency of indenting and line wrapping command examples in help output.
|
||||
|
||||
* Redesigned the output of `nickserv/list` to show more relevant information.
|
||||
|
||||
```
|
||||
/NICKSERV LIST *
|
||||
-NickServ- List of entries matching *:
|
||||
-NickServ- alice (account: alice)
|
||||
-NickServ- alice|work (account: alice)
|
||||
-NickServ- bob -- Unconfirmed (account: bob)
|
||||
-NickServ- mallory -- Suspended (account: mallory)
|
||||
-NickServ- End of list - 4/4 matches shown.
|
||||
```
|
||||
|
||||
* The cs_set_misc and ns_set_misc modules now can use a separate title from the command name.
|
||||
|
||||
```
|
||||
/NICKSERV SET MASTODON @example@mastodon.social
|
||||
-NickServ- Mastodon for testuser set to @example@mastodon.social
|
||||
```
|
||||
|
||||
* The cs_set_misc and ns_set_misc modules now support validation of user-specified data.
|
||||
|
||||
```
|
||||
/NICKSERV SET MASTODON example.mastodon.social
|
||||
-NickServ- Mastodon syntax is invalid.
|
||||
-NickServ- Syntax: SET MASTODON [@user@host.tld]
|
||||
```
|
||||
|
||||
* The db_atheme module can now import arbitrary metadata to fields from the ns_set_misc module.
|
||||
|
||||
* The local clock will now be checked for synchronisation with the IRCd clock on UnrealIRCd.
|
||||
|
||||
* The `nickserv/cert` command will now show the time a TLS certificate was created and the nickname of the creator if the `VIEW` subcommand is used.
|
||||
|
||||
```
|
||||
/NICKSERV CERT VIEW
|
||||
-NickServ- d41d8cd98f00b204e9800998ecf8427e -- created by nick1 at Wed 25 Feb 00:18:50 GMT
|
||||
```
|
||||
|
||||
* The ns_set_misc module can now add account data to the WHOIS output of authenticated users on InspIRCd (with the swhois_ext module) and UnrealIRCd.
|
||||
|
||||
```
|
||||
/WHOIS nick1
|
||||
* [nick1] (nick1@example.com): nick1
|
||||
* [nick1] Mastodon: @example@mastodon.social
|
||||
* [nick1] irc.example.com :Example-IRC server
|
||||
...
|
||||
* [nick1] End of WHOIS list.
|
||||
```
|
||||
|
||||
* The regex_posix module is now available on Windows (using the PCRE2 POSIX compatibility layer).
|
||||
|
||||
* The regex_tre module is now available on Windows.
|
||||
|
||||
* The Windows dependencies have been updated.
|
||||
|
||||
## Anope 2.1.21 (2026-02-07)
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@ if(WIN32)
|
||||
# Only install given files 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)
|
||||
execute_process(COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/README ${CMAKE_CURRENT_BINARY_DIR}/README.txt)
|
||||
set(DOCS CHANGES.md DEFCON FAQ INSTALL LANGUAGE MODULES ${CMAKE_CURRENT_BINARY_DIR}/README.txt WIN32.txt)
|
||||
set(DOCS CHANGES.md DEFCON FAQ INSTALL LANGUAGE MODULES ${CMAKE_CURRENT_BINARY_DIR}/README.txt WIN32.md)
|
||||
install(FILES ${DOCS}
|
||||
DESTINATION ${DOC_DIR}
|
||||
)
|
||||
|
||||
+2
-2
@@ -16,7 +16,7 @@ Anope Multi Language Support
|
||||
|
||||
If you have already built Anope you will need to delete the build directory and rebuild from scratch.
|
||||
|
||||
Building Anope on Windows with gettext support is explained in docs/WIN32.txt
|
||||
Building Anope on Windows with gettext support is explained in docs/WIN32.md
|
||||
|
||||
2) Adding a new language
|
||||
|
||||
@@ -29,7 +29,7 @@ Anope Multi Language Support
|
||||
po files (especially on Windows).
|
||||
|
||||
There are several control characters within the messages. These are mostly IRC formatting codes (https://modern.ircdocs.horse/formatting)
|
||||
but 0x1A is special to Anope and is used to prevent the automatic linewrapper from breaking messages in the middle of
|
||||
but 0x1B is special to Anope and is used to prevent the automatic linewrapper from breaking messages in the middle of
|
||||
text that should not be split (e.g. commands). Your editor may not show these so be careful you don't delete them!
|
||||
|
||||
If you have finished a language file translation and you want others to use it, please file a pull request on GitHub
|
||||
|
||||
-160
@@ -1,160 +0,0 @@
|
||||
Anope has Redis database support (https://redis.io/).
|
||||
This document explains the data structure used by Anope, and explains how
|
||||
keyspace notification works.
|
||||
|
||||
This is not a tutorial on how to use Redis, see https://redis.io/documentation
|
||||
for that.
|
||||
|
||||
Table of Contents
|
||||
-----------------
|
||||
1) Data structure
|
||||
2) Keyspace notifications
|
||||
3) Examples of modifying, deleting, and creating objects
|
||||
|
||||
1) Data structure
|
||||
|
||||
There are 4 key namespaces in Anope, they are:
|
||||
|
||||
id - The keys in id are used to atomically create object ids for new
|
||||
objects. For example, if I were to create a new BotInfo I would first:
|
||||
|
||||
redis 127.0.0.1:6379> INCR id:BotInfo
|
||||
|
||||
To get the object ID of the new object.
|
||||
|
||||
ids - The keys in ids contain a set of all object ids of the given type.
|
||||
For example:
|
||||
|
||||
redis 127.0.0.1:6379> SMEMBERS ids:BotInfo
|
||||
|
||||
Returns "1", "2", "3", "4", "5", "6", "7", "8" because I have 8 bots that
|
||||
have IDs 1, 2, 3, 4, 5, 6, 7, and 8, respectively.
|
||||
|
||||
hash - The keys in hash are the actual objects, stored as hashes. For
|
||||
example, if I had just looked up all BotInfo ids and wanted to iterate
|
||||
over all of them, I would start by:
|
||||
|
||||
redis 127.0.0.1:6379> HGETALL hash:BotInfo:1
|
||||
|
||||
Which gets all keys and values from the hash of type BotInfo with id 1.
|
||||
This may return:
|
||||
|
||||
"nick" -> "BotServ"
|
||||
"user" -> "services"
|
||||
"host" -> "services.anope.org"
|
||||
"created" -> "1368704765"
|
||||
|
||||
value - The keys in value only exist to aid looking up object IDs. They
|
||||
are sets of object IDs and are used to map key+value pairs to objects.
|
||||
For example:
|
||||
|
||||
redis 127.0.0.1:6379> SMEMBERS value:NickAlias:nick:Adam
|
||||
|
||||
Returns a set of object ids of NickAlias objects that have the key
|
||||
'nick' set to the value 'Adam' in its hash. Clearly this can only
|
||||
ever contain at most one object, since it is not possible to have
|
||||
more than one registered nick with the same name, but other keys
|
||||
will contain more than one, such as:
|
||||
|
||||
redis 127.0.0.1:6379> SMEMBERS value:NickCore:email:adam@anope.org
|
||||
|
||||
Which would return all accounts with the email "adam@anope.org".
|
||||
|
||||
redis 127.0.0.1:6379> SMEMBERS value:ChanAccess:mask:Adam
|
||||
|
||||
Which would return all access entries set on the account "Adam".
|
||||
|
||||
Behavior similar to SQL's AND, can be achieved using the
|
||||
SINTER command, which does set intersection on one or more sets.
|
||||
|
||||
2) Keyspace notifications
|
||||
|
||||
Redis 2.7 (unstable) and 2.8 (stable) and newer support keyspace notifications
|
||||
(https://redis.io/topics/notifications). This allows Redis to notify Anope of
|
||||
any external changes to objects in the database. Once notified, Anope will
|
||||
immediately update the object. Otherwise, Anope keeps all objects in memory
|
||||
and will not regularly read from the database once started.
|
||||
|
||||
You can use this to modify objects in Redis and have them immediately reflected
|
||||
back into Anope. Additionally you can use this feature to run multiple Anope
|
||||
instances simultaneously from the same database (see also, Redis database
|
||||
replication).
|
||||
|
||||
To use keyspace notifications you MUST execute
|
||||
|
||||
redis 127.0.0.1:6379> CONFIG SET notify-keyspace-events KA
|
||||
OK
|
||||
|
||||
or set notify-keyspace-events in redis.conf properly. Anope always executes
|
||||
CONFIG SET when it first connects.
|
||||
|
||||
If you do not enable keyspace events properly Anope will be UNABLE to see any
|
||||
object modifications you do.
|
||||
|
||||
The key space ids and value are managed entirely by Anope, you do
|
||||
not (and should not) modify them. Once you modify the object (hash), Anope will
|
||||
update them for you to correctly reflect any changes made to the object.
|
||||
|
||||
Finally, always use atomic operations. If you are inserting a new object with
|
||||
multiple commands, or inserting multiple objects at once, specifically if the
|
||||
objects depend on each other, you MUST use a transaction.
|
||||
|
||||
3) Examples of modifying, deleting, and creating objects
|
||||
|
||||
These examples will ONLY work if you meet the criteria in section 2.
|
||||
|
||||
If I want to change the email account 'Adam' to 'Adam@anope.org', I would execute the following:
|
||||
|
||||
redis 127.0.0.1:6379> SMEMBERS value:NickCore:display:Adam
|
||||
|
||||
Which returns a value of "1", which is the object id I want to modify.
|
||||
Now to change the email:
|
||||
|
||||
redis 127.0.0.1:6379> HSET hash:NickCore:1 email Adam@anope.org
|
||||
|
||||
You can now see this in NickServ's INFO command:
|
||||
-NickServ- Email address: Adam@anope.org
|
||||
|
||||
If I want to drop the account "Adam", I would execute the following:
|
||||
|
||||
redis 127.0.0.1:6379> SMEMBERS value:NickCore:display:Adam
|
||||
|
||||
Which returns a value of "1". I would then check:
|
||||
|
||||
redis 127.0.0.1:6379> SMEMBERS value:NickAlias:nc:Adam
|
||||
|
||||
To see what nicknames depend on this account to exist, as I will
|
||||
have to remove those too. This returns the values "2", and "3".
|
||||
|
||||
Finally, I can drop the nick using a transaction via:
|
||||
|
||||
redis 127.0.0.1:6379> MULTI
|
||||
OK
|
||||
redis 127.0.0.1:6379> DEL hash:NickAlias:2
|
||||
QUEUED
|
||||
redis 127.0.0.1:6379> DEL hash:NickAlias:3
|
||||
QUEUED
|
||||
redis 127.0.0.1:6379> DEL hash:NickCore:1
|
||||
QUEUED
|
||||
redis 127.0.0.1:6379> EXEC
|
||||
|
||||
Or alternatively simply:
|
||||
|
||||
redis 127.0.0.1:6379> DEL hash:NickAlias:2 hash:NickAlias:3 hash:NickCore:1
|
||||
|
||||
If I wanted to create a BotServ bot, I would execute the following:
|
||||
|
||||
redis 127.0.0.1:6379> INCR id:BotInfo
|
||||
|
||||
Which returns a new object ID for me, in this example it will be "8".
|
||||
Now I can create the object:
|
||||
|
||||
HMSET hash:BotInfo:8 nick redis user redis host services.anope.org realname "Anope IRC Services"
|
||||
|
||||
Note if you are using HSET instead of HMSET you will need to use a transaction, as shown in the above example.
|
||||
If you are watching your services logs you will immediately see:
|
||||
|
||||
USERS: redis!redis@services.anope.org (Anope IRC Services) connected to the network (services.anope.org)
|
||||
|
||||
And the bot redis will be in BotServ's bot list.
|
||||
Notice how ids:BotInfo and the value keys are updated automatically.
|
||||
@@ -0,0 +1,57 @@
|
||||
# Building Anope on Windows
|
||||
|
||||
## Dependencies
|
||||
|
||||
You will need the following software installed to build Anope:
|
||||
|
||||
* [CMake 3.20 or newer](https://cmake.org/download/#latest)
|
||||
* [Conan 2 or newer](https://conan.io/downloads) (optional if you don't want to build extra modules)
|
||||
* [NSIS 3 or newer](https://nsis.sourceforge.io/Download)
|
||||
* [Visual Studio 2022 or newer](https://visualstudio.microsoft.com/downloads/) (*NOT* Visual Studio Code)
|
||||
|
||||
## Building
|
||||
|
||||
First you need to download the latest version of the Anope source code from [the releases page](https://github.com/anope/anope/releases) and unpack it using Windows Explorer.
|
||||
|
||||
---
|
||||
|
||||
Once you have the source code unpacked you need open the Command Prompt and move to the directory in which Anope has been unpacked. You can do this by pressing Control+R and then entering `cmd.exe` and pressing enter. Once the terminal opens you can move to the directory using the following command (assuming you unpacked to `C:\Users\Example\Downloads\anope-2.1`):
|
||||
|
||||
```cmd
|
||||
cd C:\Users\Example\Downloads\anope-2.1
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
If you want to build with multiple-language support or want to use the enc_argon2, mysql, regex_pcre2, regex_posix, regex_tre, sqlite, or ssl_openssl extra modules you will now need to install the third-party dependencies using Conan. Before you can do this you need to create a Conan profile for C++17 using the following command:
|
||||
|
||||
```cmd
|
||||
conan profile detect
|
||||
notepad ~\.conan2\profiles\default
|
||||
```
|
||||
|
||||
When Notepad opens you should find the line beginning with `compiler.cppstd=` and replace the entire line with `compiler.cppstd=17` and save the file.
|
||||
|
||||
Now you're ready to install the third-party dependencies using the following command:
|
||||
|
||||
|
||||
```cmd
|
||||
conan install .\src\win32 --build missing --deployer runtime_deploy --deployer-folder .\build\extradll --output-folder .
|
||||
call .\conanbuild.bat
|
||||
```
|
||||
|
||||
This will probably take a long time if its the first time you have run it.
|
||||
|
||||
---
|
||||
|
||||
Now you're ready to build Anope.
|
||||
|
||||
```cmd
|
||||
cd .\build
|
||||
cmake -A x64 -D "CMAKE_BUILD_TYPE=Release" -D "CMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake" ..
|
||||
msbuild PACKAGE.vcxproj /P:Configuration=Release /P:Platform=x64 /VERBOSITY:MINIMAL
|
||||
```
|
||||
|
||||
Once the build finishes the installer will be available in the build directory. You can install this by opening the directory in Windows Explorer and then running it as you would with most Windows installers.
|
||||
|
||||
Once installed Anope will be available at `C:\Program Files\Anope`.
|
||||
-161
@@ -1,161 +0,0 @@
|
||||
Anope for Windows
|
||||
-----------------
|
||||
|
||||
1) Building the Source
|
||||
2) Installation
|
||||
3) Compiling Modules
|
||||
4) Other compile options
|
||||
5) Credits
|
||||
|
||||
1) Building the Source
|
||||
|
||||
NOTE: If you have downloaded one of the pre-compiled installers, you do
|
||||
NOT need to complete this step, and you can proceed to step 2.
|
||||
|
||||
If you want to build Anope from source on a Win32 system, you will need
|
||||
to follow this instructions:
|
||||
|
||||
1) Download the required files:
|
||||
|
||||
* Current Anope source:
|
||||
https://github.com/anope/anope/releases
|
||||
|
||||
* CMake:
|
||||
https://cmake.org/download/
|
||||
|
||||
(NOTE: When installing, tell CMake to add itself to the PATH.)
|
||||
|
||||
If you have Visual C++ 10 or 11 (2010/2012) skip ahead to step 2, else you
|
||||
need to download and install the following free component from Microsoft.
|
||||
|
||||
* Microsoft Visual C++ 2010 Express Edition:
|
||||
http://www.microsoft.com/visualstudio/eng/downloads#d-2010-express
|
||||
|
||||
2) Unpack the Anope tarball with your favorite uncompression program
|
||||
(WinZip or WinRAR, etc).
|
||||
|
||||
3) Bring up the Visual C++ Command Prompt; This will launch a
|
||||
DOS Command Prompt like window, which will set the environment
|
||||
properties needed to make Anope.
|
||||
|
||||
Create a new directory, which will be used to hold the build files. You can make it
|
||||
be a directory under the source directory unpacked in step 2, or somewhere else entirely.
|
||||
|
||||
Change directories to this new folder, by typing:
|
||||
|
||||
cd <path to build directory>
|
||||
|
||||
e.g.
|
||||
|
||||
cd c:\anope-build
|
||||
|
||||
4) You now need to configure Anope to your requirements. At the prompt type:
|
||||
|
||||
<path to source directory>\Config.exe
|
||||
|
||||
NOTE: If you run an Anti-Virus program such as McAfee or Norton, you may
|
||||
be unable to run this command due to the protection in place. Some Anti-
|
||||
Virus programs may detect the Anope Configuration Tool as a worm, however
|
||||
this is not the case. If you are prompted to allow or deny execution of
|
||||
the script, you should choose allow. If the script fails to run, and no
|
||||
notice is displayed, please check your Anti-Virus settings before seeking
|
||||
assistance.
|
||||
|
||||
An interactive configuration program should guide you through the install
|
||||
options. You will be given a choice to use NMake or not. NMake will compile
|
||||
inside the command prompt window you are in. If you want to build within
|
||||
the Visual C++ IDE, say no to that option, and it'll create a Solution for
|
||||
you to open up.
|
||||
|
||||
If you cannot find whats causing the error, please visit our forums or
|
||||
our IRC Support channel for assistance.
|
||||
|
||||
Some Anope modules require third party libraries, such as mysql and
|
||||
the SSL modules. If these libraries are installed in nonstandard
|
||||
locations, cmake will probably not find them and should be told where
|
||||
they are by passing their location to Config.
|
||||
|
||||
The libraries used to build the 'extra' modules are available at
|
||||
https://github.com/Adam-/windows-scripts.
|
||||
|
||||
5) You are now ready to compile. If you said you wanted to use NMake in step 4,
|
||||
at the prompt type:
|
||||
|
||||
nmake
|
||||
|
||||
Once you are back at the command prompt again, if there have been no
|
||||
errors, you are ready to go.
|
||||
|
||||
If instead you decided to use the Visual C++ IDE, open up the Anope.sln
|
||||
file. After the IDE has fully loaded, hit F7 to build everything.
|
||||
|
||||
Should you encounter errors with the installation process, check the
|
||||
messages displayed for advice on resolving them. If you are unable to
|
||||
resolve the issues yourself, seek assistance on our forums or in our
|
||||
IRC Support channel.
|
||||
|
||||
6) Finally you will need to install Anope. If you said you wanted to use NMake
|
||||
in step 4, at the prompt type:
|
||||
|
||||
nmake install
|
||||
|
||||
Otherwise, if you decided to use the Visual C++ IDE, find the project called
|
||||
INSTALL within the Solution Explorer. Right-click on INSTALL and choose Build.
|
||||
|
||||
When you have done this, all the files will be installed to where they belong.
|
||||
The only thing you need to do is rename "data/anope.example.conf" to be "data/anope.conf",
|
||||
and then follow the steps to set up Anope.
|
||||
|
||||
You have now completed the building phase of Anope for Windows. You can
|
||||
now move on to the next section, which is related to setting up Anope.
|
||||
|
||||
2) Installation
|
||||
|
||||
Since Anope for Windows does not use a visual interface, you must do the
|
||||
configuration with a text editor before proceeding with running Anope
|
||||
itself.
|
||||
|
||||
NOTE: You may need to open the configuration file with Wordpad, or a text
|
||||
editor which supports UNIX line endings. Opening the configuration file in
|
||||
Notepad will cause strange characters to appear, and you may not be able to
|
||||
edit the file correctly.
|
||||
|
||||
Open anope.conf, and read through it carefully and adjust the settings
|
||||
you think you need to adjust.
|
||||
|
||||
If you are unsure of the settings, you can go to the dos command prompt
|
||||
and run "anope.exe --nofork --debug" and watch the information as it
|
||||
attempts to connect.
|
||||
|
||||
You can launch services in two ways. If you are sure that the entered
|
||||
configuration information is correct, simply double clicking the Anope
|
||||
executable will cause it to start; no window will pop up. If you'd rather
|
||||
have a more textual output, you can start at the dos prompt and type in
|
||||
"anope.exe". If services are successfully started up the dos prompt will
|
||||
seem to hang; at this point you can safely close the dos window.
|
||||
|
||||
3) Compiling Modules
|
||||
|
||||
If you want to build other modules than the ones shipped by default, you
|
||||
will need to rerun Config.exe
|
||||
|
||||
4) Other compile options
|
||||
|
||||
A) If you have trouble recompiling Anope, you should delete all files and folders
|
||||
within the build folder you created in step 3 of section 1. Afterwards, follow
|
||||
the directions from step 4 of section 1 down.
|
||||
|
||||
5) Credits
|
||||
|
||||
Anope is based on Epona and IRCServices. See CREDITS for more credits and
|
||||
a complete list of all developers.
|
||||
|
||||
Anope's Windows-specific code is provided by:
|
||||
|
||||
* Dominick Meglio <codemastr@unrealircd.com>
|
||||
* Trystan Scott Lee <trystan@nomadirc.net>
|
||||
* Chris Hogben <heinz@anope.org>
|
||||
|
||||
Anope's Windows Installer was made using:
|
||||
|
||||
* NSIS 2.20 <http://nsis.sourceforge.net>
|
||||
+2
-2
@@ -230,12 +230,12 @@ namespace Anope
|
||||
inline bool is_pos_number_only() const { return this->find_first_not_of("0123456789.") == npos; }
|
||||
|
||||
/**
|
||||
* In IRC messages we use a substitute (ASCII 0x1A) instead of a space
|
||||
* In IRC messages we use a substitute (ASCII 0x1B) instead of a space
|
||||
* (ASCII 0x20) so it doesn't get line wrapped when put into a message.
|
||||
* The line wrapper will convert this to a space before it is sent to
|
||||
* clients.
|
||||
*/
|
||||
inline Anope::string nobreak() const { return this->replace_all_cs("\x20", "\x1A"); }
|
||||
inline Anope::string nobreak() const { return this->replace_all_cs("\x20", "\x1B"); }
|
||||
|
||||
/**
|
||||
* Replace parts of the string.
|
||||
|
||||
+7
-2
@@ -90,6 +90,11 @@ public:
|
||||
void Reply(int count, const char *singular, const char *plural, ...) ATTR_FORMAT(4, 5);
|
||||
void Reply(const Anope::string &message);
|
||||
|
||||
const char *Translate(const char *message);
|
||||
const char *Translate(const Anope::string &message);
|
||||
const char *Translate(int count, const char *single, const char *plural);
|
||||
const char *Translate(int count, const Anope::string &single, const Anope::string &plural);
|
||||
|
||||
bool HasCommand(const Anope::string &cmd);
|
||||
bool HasPriv(const Anope::string &cmd);
|
||||
bool IsServicesOper();
|
||||
@@ -135,7 +140,7 @@ protected:
|
||||
|
||||
void ClearSyntax();
|
||||
void SetSyntax(const Anope::string &s, const std::function<bool(CommandSource&)> &p = nullptr);
|
||||
void SendSyntax(CommandSource &);
|
||||
virtual void SendSyntax(CommandSource &);
|
||||
|
||||
void AllowUnregistered(bool b);
|
||||
void RequireUser(bool b);
|
||||
@@ -189,5 +194,5 @@ public:
|
||||
* @param name If found, is set to the command name, eg REGISTER
|
||||
* @return true if the given command service exists
|
||||
*/
|
||||
static bool FindCommandFromService(const Anope::string &command_service, BotInfo *&bi, Anope::string &name);
|
||||
static bool FindFromService(const Anope::string &command_service, BotInfo *&bi, Anope::string &name);
|
||||
};
|
||||
|
||||
@@ -42,6 +42,7 @@ struct ModeData;
|
||||
class Module;
|
||||
class NickAlias;
|
||||
class NickCore;
|
||||
namespace NickServ { struct Cert; }
|
||||
struct Oper;
|
||||
namespace OperServ { struct Exception; }
|
||||
class OperType;
|
||||
|
||||
@@ -185,7 +185,7 @@ public:
|
||||
void ExtensibleUnserialize(Extensible *e, Serializable *s, Serialize::Data &data) override
|
||||
{
|
||||
T t;
|
||||
if (data[this->name] >> t)
|
||||
if (data.TryLoad(this->name, t))
|
||||
this->Set(e, t);
|
||||
else
|
||||
this->Unset(e);
|
||||
@@ -205,9 +205,7 @@ public:
|
||||
|
||||
void ExtensibleUnserialize(Extensible *e, Serializable *s, Serialize::Data &data) override
|
||||
{
|
||||
bool b = false;
|
||||
data[this->name] >> b;
|
||||
if (b)
|
||||
if (data.Load<bool>(this->name))
|
||||
this->Set(e);
|
||||
else
|
||||
this->Unset(e);
|
||||
|
||||
+10
-4
@@ -44,7 +44,7 @@ namespace Language
|
||||
/** Sets the locale to the specified language.
|
||||
* @param lang The language to translate to.
|
||||
*/
|
||||
extern CoreExport void SetLocale(const char* lang);
|
||||
extern CoreExport void SetLocale(const char *lang);
|
||||
|
||||
/** Sets the locale back to the default. */
|
||||
extern CoreExport void ResetLocale();
|
||||
@@ -117,7 +117,7 @@ namespace Language
|
||||
#define ACCESS_DENIED _("Access denied.")
|
||||
#define BAD_EXPIRY_TIME _("Invalid expiry time.")
|
||||
#define BAD_USERHOST_MASK _("Mask must be in the form \037user\037@\037host\037.")
|
||||
#define CONFIRM_DROP _("Please confirm that you want to drop \002%s\002 with \002%s\032%s\032%s\002")
|
||||
#define CONFIRM_DROP _("Please confirm that you want to drop \002%s\002 with \002%s\033%s\033%s\002")
|
||||
#define CONFIRM_REGISTER_ADMIN _("All new accounts must be confirmed by an administrator. Please wait for your registration to be confirmed.")
|
||||
#define CONFIRM_REGISTER_CODE _("All new accounts must be confirmed. To confirm your account, type \002%s\002.")
|
||||
#define CONFIRM_REGISTER_MAIL _("All new accounts must be confirmed. To confirm your account, follow the instructions that were emailed to you.")
|
||||
@@ -141,12 +141,18 @@ namespace Language
|
||||
#define CHAN_ACCESS_LIMIT_DEEP N_("You can only have %u access entry on a channel, including access entries from other channels.", "You can only have %u access entries on a channel, including access entries from other channels.")
|
||||
#define CHAN_ACCESS_LEVEL_RANGE _("Access level must be between %d and %d inclusive.")
|
||||
#define CHAN_ACCESS_MALFORMED _("You cannot add a malformed mask to an access list. Did you mean to add %s instead?")
|
||||
#define CHAN_ACCESS_FOREIGN N_("%u access entry from other access systems not shown; use \002%s\033ALL\002 to view all access entries.", "%u access entries from other access systems not shown; use \002%s\033ALL\002 to view all access entries.")
|
||||
#define CHAN_ACCESS_MIGRATED_1 _("\002%s\002 has been migrated to the %s access system.")
|
||||
#define CHAN_ACCESS_MIGRATED_N N_("\002%u\002 entry has been migrated to the %s access system.", "\002%u\002 entries have been migrated to the %s access system.")
|
||||
#define CHAN_ACCESS_NOT_MIGRATED_1 _("\002%s\002 can not be migrated to the %s access system because they have privileges that you do not.")
|
||||
#define CHAN_ACCESS_NOT_MIGRATED_N N_("\002%u\002 entry can not be migrated to the %s access system because they have privileges that you do not.", "\002%u\002 entries can not be migrated to the %s access system because they have privileges that you do not.")
|
||||
#define CHAN_EXCEPTED _("\002%s\002 matches an except on %s and cannot be banned until the except has been removed.")
|
||||
#define CHAN_INFO_HEADER _("Information about channel \002%s\002:")
|
||||
#define CHAN_LIMIT_EXCEEDED _("You have already exceeded your limit of \002%d\002 channels.")
|
||||
#define CHAN_LIMIT_REACHED _("You have already reached your limit of \002%d\002 channels.")
|
||||
#define CHAN_NOT_ALLOWED_TO_JOIN _("You are not permitted to be on this channel.")
|
||||
#define CHAN_SETTING_CHANGED _("%s for %s set to %s.")
|
||||
#define CHAN_SETTING_INVALID _("%s syntax is invalid.")
|
||||
#define CHAN_SETTING_UNSET _("%s for %s unset.")
|
||||
#define CHAN_SYMBOL_REQUIRED _("Please use the symbol of \002#\002 when attempting to register.")
|
||||
#define CHAN_X_INVALID _("Channel %s is not a valid channel.")
|
||||
@@ -163,8 +169,8 @@ namespace Language
|
||||
|
||||
#define MEMO_HAVE_NO_MEMOS _("You have no memos.")
|
||||
#define MEMO_HAVE_NO_NEW_MEMOS _("You have no new memos.")
|
||||
#define MEMO_NEW_MEMO_ARRIVED _("You have a new memo from %s. Type \002%s\032%zu\002 to read it.")
|
||||
#define MEMO_NEW_X_MEMO_ARRIVED _("There is a new memo on channel %s. Type \002%s\032%s\032%zu\002 to read it.")
|
||||
#define MEMO_NEW_MEMO_ARRIVED _("You have a new memo from %s. Type \002%s\033%zu\002 to read it.")
|
||||
#define MEMO_NEW_X_MEMO_ARRIVED _("There is a new memo on channel %s. Type \002%s\033%s\033%zu\002 to read it.")
|
||||
#define MEMO_X_HAS_NO_MEMOS _("%s has no memos.")
|
||||
#define MEMO_X_HAS_NO_NEW_MEMOS _("%s has no new memos.")
|
||||
|
||||
|
||||
+9
-7
@@ -242,11 +242,9 @@ template<typename T>
|
||||
class CoreExport ChannelModeVirtual
|
||||
: public T
|
||||
{
|
||||
private:
|
||||
ChannelMode *basech;
|
||||
|
||||
protected:
|
||||
Anope::string base;
|
||||
ChannelMode *basech;
|
||||
|
||||
public:
|
||||
ChannelModeVirtual(const Anope::string &mname, const Anope::string &basename);
|
||||
@@ -263,16 +261,20 @@ public:
|
||||
/* The status a user has on a channel (+v, +h, +o) etc */
|
||||
class CoreExport ChannelStatus final
|
||||
{
|
||||
Anope::string modes;
|
||||
private:
|
||||
std::set<ChannelMode *> modes;
|
||||
static bool IsValidMode(ChannelMode *cm);
|
||||
|
||||
public:
|
||||
ChannelStatus() = default;
|
||||
ChannelStatus(const Anope::string &modes);
|
||||
void AddMode(char c);
|
||||
void DelMode(char c);
|
||||
bool HasMode(char c) const;
|
||||
void AddMode(ChannelMode *cm);
|
||||
void DelMode(ChannelMode *cm);
|
||||
bool HasMode(ChannelMode *cm) const;
|
||||
bool Empty() const;
|
||||
void Clear();
|
||||
const Anope::string &Modes() const;
|
||||
const auto &Modes() const { return modes; }
|
||||
Anope::string BuildModePrefixList() const;
|
||||
};
|
||||
|
||||
|
||||
+6
-4
@@ -601,15 +601,17 @@ public:
|
||||
* @param ci The channel
|
||||
* @param source The source of the command
|
||||
* @param access The access entry that was removed
|
||||
* @param migrated Whether the access entry was deleted because of being migrated to another system.
|
||||
*/
|
||||
virtual void OnAccessDel(ChannelInfo *ci, CommandSource &source, ChanAccess *access) ATTR_NOT_NULL(2, 4) { throw NotImplementedException(); }
|
||||
virtual void OnAccessDel(ChannelInfo *ci, CommandSource &source, ChanAccess *access, bool migrated) ATTR_NOT_NULL(2, 4) { throw NotImplementedException(); }
|
||||
|
||||
/** Called when access is added
|
||||
* @param ci The channel
|
||||
* @param source The source of the command
|
||||
* @param access The access changed
|
||||
* @param migrated Whether the access entry was added because of being migrated to another system.
|
||||
*/
|
||||
virtual void OnAccessAdd(ChannelInfo *ci, CommandSource &source, ChanAccess *access) ATTR_NOT_NULL(2, 4) { throw NotImplementedException(); }
|
||||
virtual void OnAccessAdd(ChannelInfo *ci, CommandSource &source, ChanAccess *access, bool migrated) ATTR_NOT_NULL(2, 4) { throw NotImplementedException(); }
|
||||
|
||||
/** Called when the access list is cleared
|
||||
* @param ci The channel
|
||||
@@ -793,13 +795,13 @@ public:
|
||||
* @param nc The nick
|
||||
* @param entry The entry
|
||||
*/
|
||||
virtual void OnNickAddCert(NickCore *nc, const Anope::string &entry) ATTR_NOT_NULL(2) { throw NotImplementedException(); }
|
||||
virtual void OnNickAddCert(NickCore *nc, const NickServ::Cert *entry) ATTR_NOT_NULL(2, 3) { throw NotImplementedException(); }
|
||||
|
||||
/** Called from NickCore::EraseCert()
|
||||
* @param nc pointer to the NickCore
|
||||
* @param entry The fingerprint
|
||||
*/
|
||||
virtual void OnNickEraseCert(NickCore *nc, const Anope::string &entry) ATTR_NOT_NULL(2) { throw NotImplementedException(); }
|
||||
virtual void OnNickEraseCert(NickCore *nc, const NickServ::Cert *entry) ATTR_NOT_NULL(2, 3) { throw NotImplementedException(); }
|
||||
|
||||
/** Called when a user requests info for a nick
|
||||
* @param source The user requesting info
|
||||
|
||||
@@ -46,7 +46,7 @@ public:
|
||||
/** Retrieves the size of the messages queue for the specified user.
|
||||
* @param nc The account to count queued messages for.
|
||||
*/
|
||||
inline size_t CountQueue(NickCore* nc) const
|
||||
inline size_t CountQueue(NickCore *nc) const
|
||||
{
|
||||
auto *q = GetQueue(nc);
|
||||
return q ? q->size() : 0;
|
||||
@@ -55,7 +55,7 @@ public:
|
||||
/** Retrieves the messages queue for the specified user.
|
||||
* @param nc The account to retrieve queued messages for.
|
||||
*/
|
||||
virtual const std::vector<Anope::string> *GetQueue(NickCore* nc) const = 0;
|
||||
virtual const std::vector<Anope::string> *GetQueue(NickCore *nc) const = 0;
|
||||
|
||||
/** Queues a message to be sent later.
|
||||
* @param nc The account to queue the message for.
|
||||
|
||||
@@ -19,12 +19,31 @@
|
||||
|
||||
namespace NickServ
|
||||
{
|
||||
struct Cert;
|
||||
class CertList;
|
||||
class CertService;
|
||||
|
||||
ServiceReference<CertService> cert_service(NICKSERV_CERT_SERVICE, NICKSERV_CERT_SERVICE);
|
||||
}
|
||||
|
||||
struct NickServ::Cert
|
||||
{
|
||||
/** The account this cert is for. */
|
||||
Serialize::Reference<NickCore> account;
|
||||
|
||||
/** The time at which this certificate was created. */
|
||||
time_t created = 0;
|
||||
|
||||
/** The user who created this certificate. */
|
||||
Anope::string creator;
|
||||
|
||||
/** If non-empty then a description of the certificate. */
|
||||
Anope::string description;
|
||||
|
||||
/** The TLS fingerprint for the certificate. */
|
||||
Anope::string fingerprint;
|
||||
};
|
||||
|
||||
class NickServ::CertList
|
||||
{
|
||||
protected:
|
||||
@@ -39,7 +58,7 @@ public:
|
||||
*
|
||||
* Adds a new entry into the cert list.
|
||||
*/
|
||||
virtual void AddCert(const Anope::string &entry) = 0;
|
||||
virtual NickServ::Cert *AddCert(const Anope::string &entry) = 0;
|
||||
|
||||
/** Get an entry from the nick's cert list by index
|
||||
*
|
||||
@@ -48,7 +67,7 @@ public:
|
||||
*
|
||||
* Retrieves an entry from the certificate list corresponding to the given index.
|
||||
*/
|
||||
virtual Anope::string GetCert(unsigned entry) const = 0;
|
||||
virtual NickServ::Cert *GetCert(unsigned entry) const = 0;
|
||||
|
||||
virtual unsigned GetCertCount() const = 0;
|
||||
|
||||
|
||||
@@ -1,83 +0,0 @@
|
||||
// Anope IRC Services <https://www.anope.org/>
|
||||
//
|
||||
// Copyright (C) 2003-2026 Anope Contributors
|
||||
//
|
||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||
// for the complete terms of this license and docs/AUTHORS.txt for a list of
|
||||
// contributors.
|
||||
//
|
||||
// Based on the original code of Epona by Lara
|
||||
// Based on the original code of Services by Andy Church
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
|
||||
#pragma once
|
||||
|
||||
namespace Redis
|
||||
{
|
||||
struct Reply final
|
||||
{
|
||||
enum Type
|
||||
{
|
||||
NOT_PARSED,
|
||||
NOT_OK,
|
||||
OK,
|
||||
INT,
|
||||
BULK,
|
||||
MULTI_BULK
|
||||
}
|
||||
type;
|
||||
|
||||
Reply() { Clear(); }
|
||||
~Reply() { Clear(); }
|
||||
|
||||
void Clear()
|
||||
{
|
||||
type = NOT_PARSED;
|
||||
i = 0;
|
||||
bulk.clear();
|
||||
multi_bulk_size = 0;
|
||||
for (const auto *reply : multi_bulk)
|
||||
delete reply;
|
||||
multi_bulk.clear();
|
||||
}
|
||||
|
||||
int64_t i;
|
||||
Anope::string bulk;
|
||||
int multi_bulk_size;
|
||||
std::deque<Reply *> multi_bulk;
|
||||
};
|
||||
|
||||
class Interface
|
||||
{
|
||||
public:
|
||||
Module *owner;
|
||||
|
||||
Interface(Module *m) : owner(m) { }
|
||||
virtual ~Interface() = default;
|
||||
|
||||
virtual void OnResult(const Reply &r) = 0;
|
||||
virtual void OnError(const Anope::string &error) { Log(owner) << error; }
|
||||
};
|
||||
|
||||
class Provider
|
||||
: public Service
|
||||
{
|
||||
public:
|
||||
Provider(Module *c, const Anope::string &n) : Service(c, "Redis::Provider", n) { }
|
||||
|
||||
virtual bool IsSocketDead() = 0;
|
||||
|
||||
virtual void SendCommand(Interface *i, const std::vector<Anope::string> &cmds) = 0;
|
||||
virtual void SendCommand(Interface *i, const Anope::string &str) = 0;
|
||||
|
||||
virtual bool BlockAndProcess() = 0;
|
||||
|
||||
virtual void Subscribe(Interface *i, const Anope::string &pattern) = 0;
|
||||
virtual void Unsubscribe(const Anope::string &pattern) = 0;
|
||||
|
||||
virtual void StartTransaction() = 0;
|
||||
virtual void CommitTransaction() = 0;
|
||||
};
|
||||
}
|
||||
@@ -183,7 +183,7 @@ private:
|
||||
size_t minparams;
|
||||
|
||||
protected:
|
||||
Event(Module *o, const Anope::string& e, size_t mp = 0)
|
||||
Event(Module *o, const Anope::string &e, size_t mp = 0)
|
||||
: Service(o, RPC_EVENT, e)
|
||||
, minparams(mp)
|
||||
{
|
||||
|
||||
+13
-26
@@ -23,46 +23,33 @@ namespace SQL
|
||||
: public Serialize::Data
|
||||
{
|
||||
public:
|
||||
typedef std::map<Anope::string, std::stringstream *> Map;
|
||||
Map data;
|
||||
|
||||
~Data()
|
||||
{
|
||||
Clear();
|
||||
}
|
||||
|
||||
std::iostream &operator[](const Anope::string &key) override
|
||||
{
|
||||
std::stringstream *&ss = data[key];
|
||||
if (!ss)
|
||||
ss = new std::stringstream();
|
||||
return *ss;
|
||||
}
|
||||
Anope::unordered_map<Anope::string> data;
|
||||
|
||||
size_t Hash() const override
|
||||
{
|
||||
size_t hash = 0;
|
||||
for (const auto &[_, value] : this->data)
|
||||
{
|
||||
if (!value->str().empty())
|
||||
hash ^= Anope::hash_cs()(value->str());
|
||||
if (!value.empty())
|
||||
hash ^= Anope::hash_cs()(value);
|
||||
}
|
||||
return hash;
|
||||
}
|
||||
|
||||
std::map<Anope::string, std::iostream *> GetData() const
|
||||
bool LoadInternal(const Anope::string &key, Anope::string &value) override
|
||||
{
|
||||
std::map<Anope::string, std::iostream *> d;
|
||||
for (const auto &[key, value] : this->data)
|
||||
d[key] = value;
|
||||
return d;
|
||||
auto it = this->data.find(key);
|
||||
if (it == this->data.end())
|
||||
return false;
|
||||
|
||||
value = it->second;
|
||||
return true;
|
||||
}
|
||||
|
||||
void Clear()
|
||||
bool StoreInternal(const Anope::string &key, const Anope::string &value) override
|
||||
{
|
||||
for (const auto &[_, value] : this->data)
|
||||
delete value;
|
||||
this->data.clear();
|
||||
this->data[key] = value;
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
+6
-2
@@ -80,6 +80,9 @@ public:
|
||||
/** Can we force servers to remove opers? */
|
||||
bool CanSVSNOOP = false;
|
||||
|
||||
/** Can we send multiple swhois messages? */
|
||||
bool CanSendMultipleSWhois = false;
|
||||
|
||||
/* Can we set vhosts on users? */
|
||||
bool CanSetVHost = false;
|
||||
|
||||
@@ -276,7 +279,8 @@ public:
|
||||
virtual void SendSVSHold(const Anope::string &, time_t) { }
|
||||
virtual void SendSVSHoldDel(const Anope::string &) { }
|
||||
|
||||
virtual void SendSWhois(const MessageSource &, const Anope::string &, const Anope::string &) { }
|
||||
virtual void SendSWhois(const MessageSource &source, User *target, const Anope::string &tag, const Anope::string &message) { };
|
||||
virtual void SendSWhoisDel(const MessageSource &source, User *target, const Anope::string &tag, const Anope::string &message) { }
|
||||
|
||||
/** Introduces a server to the uplink
|
||||
*/
|
||||
@@ -303,7 +307,7 @@ public:
|
||||
*/
|
||||
virtual void SendOper(User *u);
|
||||
|
||||
virtual void SendClearModes(const MessageSource &user, Channel *c, User* u, const Anope::string &mode) { }
|
||||
virtual void SendClearModes(const MessageSource &user, Channel *c, User *u, const Anope::string &mode) { }
|
||||
|
||||
virtual bool IsNickValid(const Anope::string &);
|
||||
virtual bool IsChannelValid(const Anope::string &);
|
||||
|
||||
+113
-36
@@ -40,43 +40,11 @@ namespace Serialize
|
||||
UINT,
|
||||
};
|
||||
|
||||
class CoreExport Data
|
||||
{
|
||||
protected:
|
||||
std::map<Anope::string, Serialize::DataType> types;
|
||||
|
||||
public:
|
||||
virtual ~Data() = default;
|
||||
|
||||
virtual std::iostream &operator[](const Anope::string &key) = 0;
|
||||
|
||||
template <typename T>
|
||||
void Store(const Anope::string &key, const T &value)
|
||||
{
|
||||
using Type = std::remove_cv_t<std::remove_reference_t<T>>;
|
||||
|
||||
if constexpr (std::is_same_v<Type, bool>)
|
||||
SetType(key, DataType::BOOL);
|
||||
else if constexpr (std::is_floating_point_v<Type>)
|
||||
SetType(key, DataType::FLOAT);
|
||||
else if constexpr (std::is_integral_v<Type> && std::is_signed_v<Type>)
|
||||
SetType(key, DataType::INT);
|
||||
else if constexpr (std::is_integral_v<Type> && std::is_unsigned_v<Type>)
|
||||
SetType(key, DataType::UINT);
|
||||
|
||||
this->operator[](key) << value;
|
||||
}
|
||||
|
||||
virtual size_t Hash() const { throw CoreException("Not supported"); }
|
||||
|
||||
Serialize::DataType GetType(const Anope::string &key) const;
|
||||
void SetType(const Anope::string &key, Serialize::DataType dt);
|
||||
};
|
||||
|
||||
extern void RegisterTypes();
|
||||
extern void CheckTypes();
|
||||
extern void CreateTypes();
|
||||
|
||||
class Data;
|
||||
class Type;
|
||||
template<typename T> class Checker;
|
||||
template<typename T> class Reference;
|
||||
@@ -106,6 +74,8 @@ private:
|
||||
size_t last_commit = 0;
|
||||
/* The last time this object was committed to the database */
|
||||
time_t last_commit_time = 0;
|
||||
/** Whether this object should be committed to the database. */
|
||||
bool should_commit = true;
|
||||
|
||||
protected:
|
||||
Serializable(const Anope::string &serialize_type);
|
||||
@@ -113,6 +83,20 @@ protected:
|
||||
|
||||
Serializable &operator=(const Serializable &);
|
||||
|
||||
template<typename Container,
|
||||
typename Key = typename Container::key_type,
|
||||
typename Value = typename Container::mapped_type>
|
||||
bool InsertUnique(Container &container, const Key &key)
|
||||
{
|
||||
auto res = container.emplace(key, static_cast<Value>(this));
|
||||
if (res.second)
|
||||
return true;
|
||||
|
||||
res.first->second->should_commit = false;
|
||||
res.first->second = static_cast<Value>(this);
|
||||
return false;
|
||||
}
|
||||
|
||||
public:
|
||||
using Id = uint64_t;
|
||||
virtual ~Serializable();
|
||||
@@ -120,13 +104,13 @@ public:
|
||||
/* Unique ID (per type, not globally) for this object */
|
||||
Id object_id = 0;
|
||||
|
||||
/* Only used by redis, to ignore updates */
|
||||
unsigned short redis_ignore = 0;
|
||||
|
||||
/** Marks the object as potentially being updated "soon".
|
||||
*/
|
||||
void QueueUpdate();
|
||||
|
||||
/** Determines whether the object should be committed to the database. */
|
||||
bool ShouldCommit() const { return this->should_commit; }
|
||||
|
||||
bool IsCached(Serialize::Data &);
|
||||
void UpdateCache(Serialize::Data &);
|
||||
|
||||
@@ -137,10 +121,103 @@ public:
|
||||
* @return The serializable object type
|
||||
*/
|
||||
Serialize::Type *GetSerializableType() const { return this->s_type; }
|
||||
const auto &GetSerializableName() const { return this->s_name; }
|
||||
|
||||
static const std::list<Serializable *> &GetItems();
|
||||
};
|
||||
|
||||
class CoreExport Serialize::Data
|
||||
{
|
||||
protected:
|
||||
/** The specified data types of known fields. */
|
||||
std::map<Anope::string, Serialize::DataType> types;
|
||||
|
||||
Data() = default;
|
||||
|
||||
/** Internal method for loading data from the database.
|
||||
* @param key The field to get the value of.
|
||||
* @param value The location to store the retrieved value.
|
||||
*/
|
||||
virtual bool LoadInternal(const Anope::string &key, Anope::string &value) = 0;
|
||||
|
||||
/** Internal method for storing data in the database.
|
||||
* @param key The field to set the value of.
|
||||
* @param value The value of the field.
|
||||
*/
|
||||
virtual bool StoreInternal(const Anope::string &key, const Anope::string &value) = 0;
|
||||
|
||||
/** Sets the data type of the specified field. This is called automatically from \ref Store.
|
||||
* @param key The field to specify the data type for.
|
||||
* @param dt The data type of the field.
|
||||
*/
|
||||
void SetType(const Anope::string &key, Serialize::DataType dt);
|
||||
|
||||
public:
|
||||
virtual ~Data() = default;
|
||||
|
||||
/** Retrieves the data type for the specified field. If the field does not have a data type
|
||||
* specified then it will default to TEXT.
|
||||
* @param key The field to retrieve the data type for.
|
||||
*/
|
||||
Serialize::DataType GetType(const Anope::string &key) const;
|
||||
|
||||
/** Retrieves a unique hash for the data set. */
|
||||
virtual size_t Hash() const { throw CoreException("Not supported"); }
|
||||
|
||||
/** Loads the value of a specific field.
|
||||
* @param key The field to get the value of.
|
||||
* @param def The default value if none is set.
|
||||
*/
|
||||
template <typename T = Anope::string>
|
||||
T Load(const Anope::string &key, T def = T())
|
||||
{
|
||||
T out;
|
||||
if (!TryLoad(key, out))
|
||||
out = def;
|
||||
return out;
|
||||
}
|
||||
|
||||
/** Stores the value of a specific field, automatically setting its type.
|
||||
* @param key The field to set the value of.
|
||||
* @param value The value of the field.
|
||||
*/
|
||||
template <typename T>
|
||||
void Store(const Anope::string &key, const T &value)
|
||||
{
|
||||
using Type = std::remove_cv_t<std::remove_reference_t<T>>;
|
||||
|
||||
if constexpr (std::is_same_v<Type, bool>)
|
||||
SetType(key, DataType::BOOL);
|
||||
else if constexpr (std::is_floating_point_v<Type>)
|
||||
SetType(key, DataType::FLOAT);
|
||||
else if constexpr (std::is_integral_v<Type> && std::is_signed_v<Type>)
|
||||
SetType(key, DataType::INT);
|
||||
else if constexpr (std::is_integral_v<Type> && std::is_unsigned_v<Type>)
|
||||
SetType(key, DataType::UINT);
|
||||
|
||||
StoreInternal(key, Anope::ToString(value));
|
||||
}
|
||||
|
||||
/** Tries to load the value of a specific field.
|
||||
* @param key The field to get the value of.
|
||||
* @param out The location to store the retrieved value.
|
||||
*/
|
||||
template <typename T = Anope::string>
|
||||
bool TryLoad(const Anope::string &key, T &out)
|
||||
{
|
||||
Anope::string out_str;
|
||||
if (!LoadInternal(key, out_str))
|
||||
return false;
|
||||
|
||||
auto out_opt = Anope::TryConvert<T>(out_str);
|
||||
if (!out_opt)
|
||||
return false;
|
||||
|
||||
out = out_opt.value();
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
/* A serializable type. There should be a single instance of a subclass of this
|
||||
* for each subclass of Serializable as this is what is used to serialize and
|
||||
* deserialize data from the database.
|
||||
|
||||
+4
-4
@@ -57,11 +57,11 @@ private:
|
||||
/* Uplink for this server */
|
||||
Server *uplink;
|
||||
/* Server is syncing */
|
||||
bool syncing;
|
||||
bool syncing = true;
|
||||
/* The server is juped */
|
||||
bool juped;
|
||||
/* The server is about to quit */
|
||||
bool quitting;
|
||||
bool quitting = false;
|
||||
/* Reason this server was quit */
|
||||
Anope::string quit_reason;
|
||||
|
||||
@@ -69,12 +69,12 @@ public:
|
||||
/** Constructor
|
||||
* @param uplink The uplink this server is from, is only NULL when creating Me
|
||||
* @param name The server name
|
||||
* @param hops Hops from services server
|
||||
* @param description Server rdescription
|
||||
* @param sid Server sid/numeric
|
||||
* @param hops Hops from services server
|
||||
* @param jupe If the server is juped
|
||||
*/
|
||||
Server(Server *uplink, const Anope::string &name, unsigned hops, const Anope::string &description, const Anope::string &sid = "", bool jupe = false);
|
||||
Server(Server *uplink, const Anope::string &name, const Anope::string &description, const Anope::string &sid = "", unsigned hops = 0, bool jupe = false);
|
||||
|
||||
private:
|
||||
/** Destructor
|
||||
|
||||
+2
-2
@@ -151,14 +151,14 @@ public:
|
||||
const auto &GetServiceType() const { return type; }
|
||||
|
||||
/** Invalidates the reference and changes the name of the referenced service. */
|
||||
void SetServiceName(const Anope::string& newname)
|
||||
void SetServiceName(const Anope::string &newname)
|
||||
{
|
||||
this->invalid = true;
|
||||
this->name = newname;
|
||||
}
|
||||
|
||||
/** Invalidates the reference and changes the type of the referenced service. */
|
||||
void SetServiceType(const Anope::string& newtype)
|
||||
void SetServiceType(const Anope::string &newtype)
|
||||
{
|
||||
this->invalid = true;
|
||||
this->type = newtype;
|
||||
|
||||
+1
-3
@@ -27,7 +27,7 @@
|
||||
#include <exception>
|
||||
#include <fstream>
|
||||
#include <functional>
|
||||
#include <iostream>
|
||||
#include <istream>
|
||||
#include <list>
|
||||
#include <map>
|
||||
#include <set>
|
||||
@@ -41,8 +41,6 @@
|
||||
#include "defs.h"
|
||||
#include "sysconf.h"
|
||||
|
||||
#define BUFSIZE 1024
|
||||
|
||||
#define _(x) x
|
||||
#define N_(x, y) x, y
|
||||
|
||||
|
||||
@@ -28,8 +28,6 @@
|
||||
# include <afunix.h>
|
||||
#endif
|
||||
|
||||
#define NET_BUFSIZE 65535
|
||||
|
||||
/** A sockaddr union used to combine IPv4 and IPv6 sockaddrs
|
||||
*/
|
||||
union CoreExport sockaddrs
|
||||
|
||||
@@ -101,6 +101,22 @@ namespace Anope
|
||||
extern CoreExport Anope::string Template(const Anope::string &str, const Anope::map<Anope::string> &vars);
|
||||
}
|
||||
|
||||
class CoreExport ExampleWrapper final
|
||||
{
|
||||
private:
|
||||
struct Example final
|
||||
{
|
||||
Anope::string example;
|
||||
Anope::string description;
|
||||
Anope::string privilege;
|
||||
};
|
||||
std::vector<Example> entries;
|
||||
|
||||
public:
|
||||
ExampleWrapper &AddEntry(const Anope::string &example, const Anope::string &desc, const Anope::string &priv = "");
|
||||
void SendTo(CommandSource &source);
|
||||
};
|
||||
|
||||
class CoreExport HelpWrapper final
|
||||
{
|
||||
private:
|
||||
|
||||
+3
-1
@@ -54,7 +54,9 @@ class UplinkSocket final
|
||||
, public BufferedSocket
|
||||
{
|
||||
public:
|
||||
bool error;
|
||||
bool error = false;
|
||||
size_t recv_msgs = 0;
|
||||
size_t sent_msgs = 0;
|
||||
UplinkSocket();
|
||||
~UplinkSocket();
|
||||
bool ProcessRead() override;
|
||||
|
||||
+2422
-331
File diff suppressed because it is too large
Load Diff
+3534
-4098
File diff suppressed because it is too large
Load Diff
+928
-706
File diff suppressed because it is too large
Load Diff
+179
-179
@@ -78,20 +78,20 @@ msgid "%s allows you to execute \"fantasy\" commands in the channel. Fantasy c
|
||||
msgstr "%s kanalda \"fantezi\" komutları çalıştırmanıza olanak tanır. Fantezi komutları, bir kanala mesaj gönderilerek çalıştırılabilen komutlardır ve komutları yürütmek için daha uygun bir yol sağlar. Parametre olarak kanal gerektiren komutlar otomatik olarak bu parametreyi verecektir."
|
||||
|
||||
#, c-format
|
||||
msgid "%s allows you to have a bot on your own channel. It has been created for users that can't host or configure a bot, or for use on networks that don't allow user bots. Available commands are listed below; to use them, type %scommand. For more information on a specific command, type %scommand."
|
||||
msgstr "%s kendi kanalınızda bir bot bulundurmanıza olanak tanır. Bir botu barındıramayan veya yapılandıramayan kullanıcılar için ya da kullanıcı botlarına izin vermeyen ağlarda kullanılmak üzere oluşturulmuştur. Mevcut komutlar aşağıdaki listelendi; bunları kullanmak için %skomut yazın. Belirli bir komut hakkında daha fazla bilgi için, %skomut yazın."
|
||||
msgid "%s allows you to have a bot on your own channel. It has been created for users that can't host or configure a bot, or for use on networks that don't allow user bots. Available commands are listed below; to use them, type %scommand. For more information on a specific command, type %scommand."
|
||||
msgstr "%s kendi kanalınızda bir bot bulundurmanıza olanak tanır. Bir botu barındıramayan veya yapılandıramayan kullanıcılar için ya da kullanıcı botlarına izin vermeyen ağlarda kullanılmak üzere oluşturulmuştur. Mevcut komutlar aşağıdaki listelendi; bunları kullanmak için %skomut yazın. Belirli bir komut hakkında daha fazla bilgi için, %skomut yazın."
|
||||
|
||||
#, c-format
|
||||
msgid "%s allows you to register a nickname and prevent others from using it. The following commands allow for registration and maintenance of nicknames; to use them, type %scommand. For more information on a specific command, type %scommand."
|
||||
msgstr "%s bir rumuz kaydetmenizi ve başkalarının bunu kullanmasının engellenmesini sağlar. Aşağıdaki komutlar rumuz kaydı ve bakımına izin verir; bunları kullanmak için %skomut yazın. Belirli bir komut hakkında daha fazla bilgi için şunu yazın: %skomut."
|
||||
msgid "%s allows you to register a nickname and prevent others from using it. The following commands allow for registration and maintenance of nicknames; to use them, type %scommand. For more information on a specific command, type %scommand."
|
||||
msgstr "%s bir rumuz kaydetmenizi ve başkalarının bunu kullanmasının engellenmesini sağlar. Aşağıdaki komutlar rumuz kaydı ve bakımına izin verir; bunları kullanmak için %skomut yazın. Belirli bir komut hakkında daha fazla bilgi için şunu yazın: %skomut."
|
||||
|
||||
#, c-format
|
||||
msgid "%s allows you to register an account. The following commands allow for registration and maintenance of accounts; to use them, type %scommand. For more information on a specific command, type %scommand."
|
||||
msgstr "%s bir hesap kaydetmenizi sağlar. Aşağıdaki komutlar hesap kaydı ve bakımının yapılmasına izin verir; bunları kullanmak için %skomut yazın. Belirli bir komut hakkında daha fazla bilgi için şunu yazın: %skomut."
|
||||
msgid "%s allows you to register an account. The following commands allow for registration and maintenance of accounts; to use them, type %scommand. For more information on a specific command, type %scommand."
|
||||
msgstr "%s bir hesap kaydetmenizi sağlar. Aşağıdaki komutlar hesap kaydı ve bakımının yapılmasına izin verir; bunları kullanmak için %skomut yazın. Belirli bir komut hakkında daha fazla bilgi için şunu yazın: %skomut."
|
||||
|
||||
#, c-format
|
||||
msgid "%s allows you to register and control various aspects of channels. %s can often prevent malicious users from \"taking over\" channels by limiting who is allowed channel operator privileges. Available commands are listed below; to use them, type %scommand. For more information on a specific command, type %scommand."
|
||||
msgstr "%s kanalların çeşitli yönlerini kaydetmenize ve kontrol etmenize olanak tanır. %s, kanal operatörü ayrıcalıklarına izin verilen kişileri sınırlayarak, genellikle kötü niyetli kullanıcıların kanalları \"ele geçirmesini\" engelleyebilir. Mevcut komutlar aşağıda listelenmiştir; bunları kullanmak için %skomut yazın. Belirli bir komut hakkında daha fazla bilgi için %skomut yazın."
|
||||
msgid "%s allows you to register and control various aspects of channels. %s can often prevent malicious users from \"taking over\" channels by limiting who is allowed channel operator privileges. Available commands are listed below; to use them, type %scommand. For more information on a specific command, type %scommand."
|
||||
msgstr "%s kanalların çeşitli yönlerini kaydetmenize ve kontrol etmenize olanak tanır. %s, kanal operatörü ayrıcalıklarına izin verilen kişileri sınırlayarak, genellikle kötü niyetli kullanıcıların kanalları \"ele geçirmesini\" engelleyebilir. Mevcut komutlar aşağıda listelenmiştir; bunları kullanmak için %skomut yazın. Belirli bir komut hakkında daha fazla bilgi için %skomut yazın."
|
||||
|
||||
#, c-format
|
||||
msgid "%s already exists in %s bad words list."
|
||||
@@ -346,8 +346,8 @@ msgid "SET kills all operators from the given server and prevents operators
|
||||
msgstr "SET, belirtilen sunucu'daki tüm operatörleri öldürür ve operatörlerin belirtilen sunucuda çalışmasını engeller. REVOKE bu kısıtlamayı kaldırır."
|
||||
|
||||
#, c-format
|
||||
msgid "User access levels can be seen by using the %s command; type %sLEVELS for information."
|
||||
msgstr "Kullanıcı erişim düzeyleri %s komutu kullanılarak görülebilir; bilgi için %sLEVELS yazın."
|
||||
msgid "User access levels can be seen by using the %s command; type %sLEVELS for information."
|
||||
msgstr "Kullanıcı erişim düzeyleri %s komutu kullanılarak görülebilir; bilgi için %sLEVELS yazın."
|
||||
|
||||
#, c-format
|
||||
msgid "[auto-memo] The memo you sent to %s has been viewed."
|
||||
@@ -1579,8 +1579,8 @@ msgstr "MODE komutunu kullanma izni var"
|
||||
msgid "Allowed to view the access list"
|
||||
msgstr "Erişim listesini görüntüleme izni var"
|
||||
|
||||
msgid "Allows Services Operators to change modes for any channel. Parameters are the same as for the standard /MODE command. Alternatively, CLEAR may be given to clear all modes on the channel. If CLEARALL is given then all modes, including user status, is removed."
|
||||
msgstr "Servis Operatörlerinin herhangi bir kanal için modları değiştirmesine izin verir. Parametreler standart /MODE komutuyla aynıdır. Alternatif olarak, kanaldaki tüm modları temizlemek için CLEAR komutu verilebilir. CLEARALL komutu verilirse kullanıcı durumu dahil tüm modlar, kaldırılmış olur."
|
||||
msgid "Allows Services Operators to change modes for any channel. Parameters are the same as for the standard /MODE command. Alternatively, CLEAR may be given to clear all modes on the channel. If CLEARALL is given then all modes, including user status, is removed."
|
||||
msgstr "Servis Operatörlerinin herhangi bir kanal için modları değiştirmesine izin verir. Parametreler standart /MODE komutuyla aynıdır. Alternatif olarak, kanaldaki tüm modları temizlemek için CLEAR komutu verilebilir. CLEARALL komutu verilirse kullanıcı durumu dahil tüm modlar, kaldırılmış olur."
|
||||
|
||||
msgid "Allows Services Operators to change modes for any user. Parameters are the same as for the standard /MODE command."
|
||||
msgstr "Servis Operatörlerinin herhangi bir kullanıcı için modları değiştirmesine izin verir. Parametreler standart /MODE komutuyla aynıdır."
|
||||
@@ -1589,21 +1589,21 @@ msgstr "Servis Operatörlerinin herhangi bir kullanıcı için modları değişt
|
||||
msgid ""
|
||||
"Allows Services Operators to create, modify, and delete bots that users will be able to use on their own channels.\n"
|
||||
"\n"
|
||||
"%sADD adds a bot with the given nickname, username, hostname and realname. Since no integrity checks are done for these settings, be really careful.\n"
|
||||
"%sADD adds a bot with the given nickname, username, hostname and realname. Since no integrity checks are done for these settings, be really careful.\n"
|
||||
"\n"
|
||||
"%sCHANGE allows you to change the nickname, username, hostname or realname of a bot without deleting it (and all the data associated with it).\n"
|
||||
"%sCHANGE allows you to change the nickname, username, hostname or realname of a bot without deleting it (and all the data associated with it).\n"
|
||||
"\n"
|
||||
"%sDEL removes the given bot from the bot list.\n"
|
||||
"%sDEL removes the given bot from the bot list.\n"
|
||||
"\n"
|
||||
"Note: You cannot create a bot with a nick that is currently registered. If an unregistered user is currently using the nick, they will be killed."
|
||||
msgstr ""
|
||||
"Servis Operatörlerinin, kullanıcıların kendi kanallarında kullanabilecekleri botlar oluşturmasına, değiştirmesine ve silmesine olanak tanır.\n"
|
||||
"\n"
|
||||
"%sADD belirtilen rumuz, kullanıcı adı, host adı ve gerçek adla bir bot ekler. Bu ayarlar için herhangi bir bütünlük kontrolü yapılmadığından çok dikkatli olun.\n"
|
||||
"%sADD belirtilen rumuz, kullanıcı adı, host adı ve gerçek adla bir bot ekler. Bu ayarlar için herhangi bir bütünlük kontrolü yapılmadığından çok dikkatli olun.\n"
|
||||
"\n"
|
||||
"%sCHANGE, bir botun rumuzunu, kullanıcı adını, host adını veya gerçek adını, onu (ve onunla ilişkili tüm verileri) silmeden değiştirmenize olanak tanır.\n"
|
||||
"%sCHANGE, bir botun rumuzunu, kullanıcı adını, host adını veya gerçek adını, onu (ve onunla ilişkili tüm verileri) silmeden değiştirmenize olanak tanır.\n"
|
||||
"\n"
|
||||
"%sDEL, belirtilen botu, bot listesinden kaldırır.\n"
|
||||
"%sDEL, belirtilen botu, bot listesinden kaldırır.\n"
|
||||
"\n"
|
||||
"Not: Halihazırda kayıtlı olan bir rumuzla bot oluşturamazsınız. Kayıtlı olmayan bir kullanıcı halihazırda rumuzu kullanıyorsa, bu kullanıcı killenecektir."
|
||||
|
||||
@@ -1620,26 +1620,26 @@ msgstr ""
|
||||
msgid ""
|
||||
"Allows Services Operators to manipulate the AKILL list. If a user matching an AKILL mask attempts to connect, services will issue a KILL for that user and, on supported server types, will instruct all servers to add a ban for the mask which the user matched.\n"
|
||||
"\n"
|
||||
"%sADD adds the given mask to the AKILL list for the given reason, which must be given. Mask should be in the format of nick!user@host#realname, though all that is required is user@host. If a real name is specified, the reason must be prepended with a :. expiry is specified as an integer followed by one of d (days), h (hours), or m (minutes). Combinations (such as 1h30m) are not permitted. If a unit specifier is not included, the default is days (so +30 by itself means 30 days). To add an AKILL which does not expire, use +0. If the mask to be added starts with a +, an expiry time must be given, even if it is the same as the default. The current AKILL default expiry time can be found with the STATSAKILL command."
|
||||
"%sADD adds the given mask to the AKILL list for the given reason, which must be given. Mask should be in the format of nick!user@host#realname, though all that is required is user@host. If a real name is specified, the reason must be prepended with a :. expiry is specified as an integer followed by one of d (days), h (hours), or m (minutes). Combinations (such as 1h30m) are not permitted. If a unit specifier is not included, the default is days (so +30 by itself means 30 days). To add an AKILL which does not expire, use +0. If the mask to be added starts with a +, an expiry time must be given, even if it is the same as the default. The current AKILL default expiry time can be found with the STATSAKILL command."
|
||||
msgstr ""
|
||||
"Servis Operatörlerinin SQLINE listesini değiştirmesine olanak tanır. SQLINE maskesiyle eşleşen bir kullanıcı bağlanmaya çalışırsa Servisler IRC oturumlarını sürdürmelerine izin vermeyecektir. Servisler, maskenin ilk karakteri # ise eşleşen kanalların kullanımını engelleyecektir. Eğer maske bir düzenli ifade ise, ifade kanallara karşı da eşleştirilecektir.\n"
|
||||
"\n"
|
||||
"%sADD, belirtilen (rumuz/kanal) maskesini belirtilen nedenden dolayı SQLINE listesine ekler (ki verilmelidir). süre bir tamsayı olarak belirtilir ve ardından d (gün), h (saat) veya m (dakika) değerlerinden biri gelir. Kombinasyonlara (1h30m gibi) izin verilmez. Birim belirtici dahil edilmezse, varsayılan gün sayısıdır (yani +30 tek başına 30 gün anlamına gelir). Süresi dolmayan bir SQLINE eklemek için +0 kullanın. Eklenecek maske + ile başlıyorsa varsayılanla aynı olsa bile bir son kullanma süresi verilmelidir. Geçerli SQLINE varsayılan geçerlilik süresi STATSAKILL komutuyla bulunabilir."
|
||||
"%sADD, belirtilen (rumuz/kanal) maskesini belirtilen nedenden dolayı SQLINE listesine ekler (ki verilmelidir). süre bir tamsayı olarak belirtilir ve ardından d (gün), h (saat) veya m (dakika) değerlerinden biri gelir. Kombinasyonlara (1h30m gibi) izin verilmez. Birim belirtici dahil edilmezse, varsayılan gün sayısıdır (yani +30 tek başına 30 gün anlamına gelir). Süresi dolmayan bir SQLINE eklemek için +0 kullanın. Eklenecek maske + ile başlıyorsa varsayılanla aynı olsa bile bir son kullanma süresi verilmelidir. Geçerli SQLINE varsayılan geçerlilik süresi STATSAKILL komutuyla bulunabilir."
|
||||
|
||||
msgid ""
|
||||
"Allows Services Operators to manipulate the SNLINE list. If a user with a realname matching an SNLINE mask attempts to connect, services will not allow them to pursue their IRC session.\n"
|
||||
"\n"
|
||||
"SNLINEADD adds the given realname mask to the SNLINE list for the given reason (which must be given). expiry is specified as an integer followed by one of d (days), h (hours), or m (minutes). Combinations (such as 1h30m) are not permitted. If a unit specifier is not included, the default is days (so +30 by itself means 30 days). To add an SNLINE which does not expire, use +0. If the realname mask to be added starts with a +, an expiry time must be given, even if it is the same as the default. The current SNLINE default expiry time can be found with the STATSAKILL command. \n"
|
||||
"SNLINEADD adds the given realname mask to the SNLINE list for the given reason (which must be given). expiry is specified as an integer followed by one of d (days), h (hours), or m (minutes). Combinations (such as 1h30m) are not permitted. If a unit specifier is not included, the default is days (so +30 by itself means 30 days). To add an SNLINE which does not expire, use +0. If the realname mask to be added starts with a +, an expiry time must be given, even if it is the same as the default. The current SNLINE default expiry time can be found with the STATSAKILL command. \n"
|
||||
"\n"
|
||||
"Note: because the realname mask may contain spaces, the separator between it and the reason is a colon."
|
||||
msgstr ""
|
||||
"Servis Operatörlerinin SNLINE listesini değiştirmesine izin verir. SNLINE maskesiyle eşleşen gerçek adı olan bir kullanıcı bağlanmaya çalışırsa, servisler IRC oturumunu sürdürmelerine izin vermez.\n"
|
||||
"\n"
|
||||
"SNLINEADD, belirtilen gerçek ad maskesini belirtilen nedenden dolayı SNLINE listesine ekler (bunun verilmesi gerekir). sona-erme; d (gün), h (saat) veya m (dakika) değerleriyle bir tamsayı olarak belirtilir. Kombinasyonlara (1h30m gibi) izin verilmez. Birim belirtici dahil edilmezse, varsayılan gün sayısıdır\n"
|
||||
"SNLINEADD, belirtilen gerçek ad maskesini belirtilen nedenden dolayı SNLINE listesine ekler (bunun verilmesi gerekir). sona-erme; d (gün), h (saat) veya m (dakika) değerleriyle bir tamsayı olarak belirtilir. Kombinasyonlara (1h30m gibi) izin verilmez. Birim belirtici dahil edilmezse, varsayılan gün sayısıdır\n"
|
||||
"(yani +30 tek başına 30 gün anlamına gelir). Süresi dolmayan bir SNLINE eklemek için +0 kullanın. Eklenecek gerçek ad maskesi\n"
|
||||
"+ ile başlıyorsa, varsayılanla aynı olsa bile bir son kullanma\n"
|
||||
"süresi verilmelidir. Geçerli SNLINE varsayılan geçerlilik süresi\n"
|
||||
"STATSAKILL komutuyla bulunabilir.\n"
|
||||
"STATSAKILL komutuyla bulunabilir.\n"
|
||||
" \n"
|
||||
"Not: Gerçek ad maskesi boşluk içerebileceğinden,\n"
|
||||
"onunla sebep arasındaki ayırıcı iki nokta üst üstedir."
|
||||
@@ -1647,31 +1647,31 @@ msgstr ""
|
||||
msgid ""
|
||||
"Allows Services Operators to manipulate the SQLINE list. If a user with a nick matching an SQLINE mask attempts to connect, services will not allow them to pursue their IRC session. If the first character of the mask is #, services will prevent the use of matching channels. If the mask is a regular expression, the expression will be matched against channels too.\n"
|
||||
"\n"
|
||||
"SQLINEADD adds the given (nick/channel) mask to the SQLINE list for the given reason (which must be given). expiry is specified as an integer followed by one of d (days), h (hours), or m (minutes). Combinations (such as 1h30m) are not permitted. If a unit specifier is not included, the default is days (so +30 by itself means 30 days). To add an SQLINE which does not expire, use +0. If the mask to be added starts with a +, an expiry time must be given, even if it is the same as the default. The current SQLINE default expiry time can be found with the STATSAKILL command."
|
||||
"SQLINEADD adds the given (nick/channel) mask to the SQLINE list for the given reason (which must be given). expiry is specified as an integer followed by one of d (days), h (hours), or m (minutes). Combinations (such as 1h30m) are not permitted. If a unit specifier is not included, the default is days (so +30 by itself means 30 days). To add an SQLINE which does not expire, use +0. If the mask to be added starts with a +, an expiry time must be given, even if it is the same as the default. The current SQLINE default expiry time can be found with the STATSAKILL command."
|
||||
msgstr ""
|
||||
"Servis Operatörlerinin SQLINE listesini değiştirmesine izin verir. SQLINE maskesiyle eşleşen gerçek adı olan bir kullanıcı bağlanmaya çalışırsa, servisler IRC oturumunu sürdürmelerine izin vermez. Maskenin ilk karakteri # ise servisler eşleşen kanalların kullanımını engelleyecektir. Eğer maske bir düzenli ifade ise, ifade kanallara karşı da eşleştirilecektir.\n"
|
||||
"\n"
|
||||
"SQLINEADD, belirtilen (rumuz/kanal) maskesini belirtilen nedenden dolayı SQLINE listesine ekler (ki verilmelidir). süre bir tamsayı olarak belirtilir ve ardından d (gün), h (saat) veya m (dakika) değerlerinden birigelir. Kombinasyonlara (1h30m gibi) izin verilmez. Birim belirtici dahiledilmezse, varsayılan gün sayısıdır (yani +30 tek başına 30 gün anlamına gelir). Süresi dolmayan bir SQLINE eklemek için +0 kullanın. Eklenecek maske + ile başlıyorsa varsayılanla aynı olsa bile bir son kullanma süresi verilmelidir. Geçerli SQLINE varsayılan geçerlilik süresi STATSAKILL komutuyla bulunabilir."
|
||||
"SQLINEADD, belirtilen (rumuz/kanal) maskesini belirtilen nedenden dolayı SQLINE listesine ekler (ki verilmelidir). süre bir tamsayı olarak belirtilir ve ardından d (gün), h (saat) veya m (dakika) değerlerinden birigelir. Kombinasyonlara (1h30m gibi) izin verilmez. Birim belirtici dahiledilmezse, varsayılan gün sayısıdır (yani +30 tek başına 30 gün anlamına gelir). Süresi dolmayan bir SQLINE eklemek için +0 kullanın. Eklenecek maske + ile başlıyorsa varsayılanla aynı olsa bile bir son kullanma süresi verilmelidir. Geçerli SQLINE varsayılan geçerlilik süresi STATSAKILL komutuyla bulunabilir."
|
||||
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Allows Services Operators to manipulate the list of hosts that have specific session limits - allowing certain machines, such as shell servers, to carry more than the default number of clients at a time. Once a host reaches its session limit, all clients attempting to connect from that host will be killed. Before the user is killed, they are notified, of a source of help regarding session limiting. The content of this notice is a config setting.\n"
|
||||
"\n"
|
||||
"%sADD adds the given host mask to the exception list. Note that nick!user@host and user@host masks are invalid! Only real host masks, such as box.host.dom and *.host.dom, are allowed because sessions limiting does not take nick or user names into account. limit must be a number greater than or equal to zero. This determines how many sessions this host may carry at a time. A value of zero means the host has an unlimited session limit. See the AKILL help for details about the format of the optional expiry parameter. \n"
|
||||
"%sADD adds the given host mask to the exception list. Note that nick!user@host and user@host masks are invalid! Only real host masks, such as box.host.dom and *.host.dom, are allowed because sessions limiting does not take nick or user names into account. limit must be a number greater than or equal to zero. This determines how many sessions this host may carry at a time. A value of zero means the host has an unlimited session limit. See the AKILL help for details about the format of the optional expiry parameter. \n"
|
||||
"\n"
|
||||
"%sDEL removes the given mask from the exception list.\n"
|
||||
"%sDEL removes the given mask from the exception list.\n"
|
||||
"\n"
|
||||
"%sLIST and %sVIEW show all current sessions if the optional mask is given, the list is limited to those sessions matching the mask. The difference is that %sVIEW is more verbose, displaying the name of the person who added the exception, its session limit, reason, host mask and the expiry date and time. \n"
|
||||
"%sLIST and %sVIEW show all current sessions if the optional mask is given, the list is limited to those sessions matching the mask. The difference is that %sVIEW is more verbose, displaying the name of the person who added the exception, its session limit, reason, host mask and the expiry date and time. \n"
|
||||
"\n"
|
||||
"Note that a connecting client will \"use\" the first exception their host matches."
|
||||
msgstr ""
|
||||
"Servis Operatörlerinin; belirli oturum sınırlarına sahip ana makineler (shell sunucuları gibi belirli makinelerin bir seferde varsayılan istemci sayısından daha fazlasını taşımasına) listesini değiştirmesine izin verir. Bir ana makine oturum sınırına ulaştığında, o ana makineden bağlanmaya çalışan tüm istemciler killenir. Kullanıcı killenmeden önce, oturum sınırlamasıyla ilgili bir yardım kaynağı hakkında bilgilendirilir. Bu bildirimin içeriği bir yapılandırma ayarıdır.\n"
|
||||
"\n"
|
||||
"%sADD, belirtilen host maskesini istisna listesine ekler. rumuz!ident@host ve ident@host maskelerinin geçersiz olduğunu unutmayın! Yalnızca box.host.dom ve *.host.dom gibi gerçek host maskelerine izin verilir çünkü oturum sınırlamasında rumuz veya kullanıcı adları dikkate alınmaz. limit sıfırdan büyük veya sıfıra eşit bir sayı olmalıdır. Bu, bu hostun aynı anda kaç oturum taşıyabileceğini belirler. Sıfır değeri, hostun sınırsız oturum sınırına sahip olduğu anlamına gelir. İsteğe bağlı sona-erme parametresinin formatıyla ilgili ayrıntılar için AKILL yardımına bakın. \n"
|
||||
"%sADD, belirtilen host maskesini istisna listesine ekler. rumuz!ident@host ve ident@host maskelerinin geçersiz olduğunu unutmayın! Yalnızca box.host.dom ve *.host.dom gibi gerçek host maskelerine izin verilir çünkü oturum sınırlamasında rumuz veya kullanıcı adları dikkate alınmaz. limit sıfırdan büyük veya sıfıra eşit bir sayı olmalıdır. Bu, bu hostun aynı anda kaç oturum taşıyabileceğini belirler. Sıfır değeri, hostun sınırsız oturum sınırına sahip olduğu anlamına gelir. İsteğe bağlı sona-erme parametresinin formatıyla ilgili ayrıntılar için AKILL yardımına bakın. \n"
|
||||
"\n"
|
||||
"%sDEL belirtilen maskeyi istisna listesinden kaldırır.\n"
|
||||
"%sDEL belirtilen maskeyi istisna listesinden kaldırır.\n"
|
||||
"\n"
|
||||
"%sLIST ve %sVIEW, isteğe bağlı maske belirtilmişse mevcut tüm oturumları gösterir; liste, maskeyle eşleşen oturumlarla sınırlıdır. Aradaki fark, %sVIEW'nin daha ayrıntılı olması ve istisnayı ekleyen kişinin adını, oturum sınırını, nedenini, host maskesini ve son kullanma tarihini ve saatini göstermesidir. \n"
|
||||
"%sLIST ve %sVIEW, isteğe bağlı maske belirtilmişse mevcut tüm oturumları gösterir; liste, maskeyle eşleşen oturumlarla sınırlıdır. Aradaki fark, %sVIEW'nin daha ayrıntılı olması ve istisnayı ekleyen kişinin adını, oturum sınırını, nedenini, host maskesini ve son kullanma tarihini ve saatini göstermesidir. \n"
|
||||
"\n"
|
||||
"Bağlanan bir istemcinin, hostunun eşleştiği ilk istisnayı \"kullanacağını\" unutmayın."
|
||||
|
||||
@@ -1679,17 +1679,17 @@ msgstr ""
|
||||
msgid ""
|
||||
"Allows Services Operators to view the session list.\n"
|
||||
"\n"
|
||||
"%sLIST lists hosts with at least threshold sessions. The threshold must be a number greater than 1. This is to prevent accidental listing of the large number of single session hosts.\n"
|
||||
"%sLIST lists hosts with at least threshold sessions. The threshold must be a number greater than 1. This is to prevent accidental listing of the large number of single session hosts.\n"
|
||||
"\n"
|
||||
"%sVIEW displays detailed information about a specific host - including the current session count and session limit. The host value may not include wildcards. \n"
|
||||
"%sVIEW displays detailed information about a specific host - including the current session count and session limit. The host value may not include wildcards. \n"
|
||||
"\n"
|
||||
"See the EXCEPTION help for more information about session limiting and how to set session limits specific to certain hosts and groups thereof."
|
||||
msgstr ""
|
||||
"Servis Operatörlerinin oturum listesini görüntülemesine olanak tanır.\n"
|
||||
"\n"
|
||||
"%sLIST, en az threshold (eşik) oturuma sahip hostları listeler. Eşik 1'den büyük bir sayı olmalıdır. Bu, çok sayıda tek oturumlu hostun yanlışlıkla listelenmesini önlemek içindir.\n"
|
||||
"%sLIST, en az threshold (eşik) oturuma sahip hostları listeler. Eşik 1'den büyük bir sayı olmalıdır. Bu, çok sayıda tek oturumlu hostun yanlışlıkla listelenmesini önlemek içindir.\n"
|
||||
"\n"
|
||||
"%sVIEW, geçerli oturum sayısı ve oturum sınırı da dahil\n"
|
||||
"%sVIEW, geçerli oturum sayısı ve oturum sınırı da dahil\n"
|
||||
"olmak üzere belirli bir host hakkında ayrıntılı bilgileri görüntüler.\n"
|
||||
"host değeri joker karakterler içeremez. \n"
|
||||
"\n"
|
||||
@@ -1708,23 +1708,23 @@ msgstr ""
|
||||
msgid ""
|
||||
"Allows queueing messages to send to users on the network.\n"
|
||||
"\n"
|
||||
"The %sADD command adds the given message to the message queue.\n"
|
||||
"The %sADD command adds the given message to the message queue.\n"
|
||||
"\n"
|
||||
"The %sCLEAR command clears the message queue.\n"
|
||||
"The %sCLEAR command clears the message queue.\n"
|
||||
"\n"
|
||||
"The %sDEL command removes the specified message from the message queue. The message number can be obtained from the output of the %sLIST command.\n"
|
||||
"The %sDEL command removes the specified message from the message queue. The message number can be obtained from the output of the %sLIST command.\n"
|
||||
"\n"
|
||||
"The %sLIST command lists all messages that are currently in the message queue."
|
||||
"The %sLIST command lists all messages that are currently in the message queue."
|
||||
msgstr ""
|
||||
"Ağdaki kullanıcılara gönderilecek mesajların sıraya alınmasına izin verir.\n"
|
||||
"\n"
|
||||
"%sADD komutu verilen mesajı mesaj kuyruğuna ekler.\n"
|
||||
"%sADD komutu verilen mesajı mesaj kuyruğuna ekler.\n"
|
||||
"\n"
|
||||
"%sCLEAR komutu mesaj kuyruğunu temizler.\n"
|
||||
"%sCLEAR komutu mesaj kuyruğunu temizler.\n"
|
||||
"\n"
|
||||
"%sDEL komutu belirtilen mesajı mesaj kuyruğundan kaldırır. Mesaj numarası %sLIST komutunun çıktısından alınabilir.\n"
|
||||
"%sDEL komutu belirtilen mesajı mesaj kuyruğundan kaldırır. Mesaj numarası %sLIST komutunun çıktısından alınabilir.\n"
|
||||
"\n"
|
||||
"%sLIST komutu, o anda mesaj kuyruğunda bulunan tüm mesajları listeler."
|
||||
"%sLIST komutu, o anda mesaj kuyruğunda bulunan tüm mesajları listeler."
|
||||
|
||||
#, c-format
|
||||
msgid ""
|
||||
@@ -1772,12 +1772,12 @@ msgid ""
|
||||
"Allows you to change and view configuration settings. Settings changed by this command are temporary and will not be reflected back into the configuration file, and will be lost if Anope is shut down, restarted, or the configuration is reloaded.\n"
|
||||
"\n"
|
||||
"Example:\n"
|
||||
" MODIFYnickservregdelay15m"
|
||||
" MODIFYnickservregdelay15m"
|
||||
msgstr ""
|
||||
"Yapılandırma ayarlarını değiştirmenizi ve görüntülemenizi sağlar. Bu komutla değiştirilen ayarlar geçicidir ve yapılandırma dosyasına geri yansıtılmayacaktır ve Anope kapatılırsa, yeniden başlatılırsa veya yapılandırma yeniden yüklenirse kaybolacaktır.\n"
|
||||
"\n"
|
||||
"Örnek:\n"
|
||||
" MODIFYnickservregdelay15m"
|
||||
" MODIFYnickservregdelay15m"
|
||||
|
||||
msgid "Allows you to choose the way services are communicating with the given user. With MSG set, services will use messages, else they'll use notices."
|
||||
msgstr "Servislerin belirli bir kullanıcıyla iletişim kurma şeklini seçmenizi sağlar. MSG ayarlandığında Servisler mesajları kullanır, aksi takdirde bildirimleri (notice) kullanır."
|
||||
@@ -1793,11 +1793,11 @@ msgid "Allows you to kill a user from the network. Parameters are the same as fo
|
||||
msgstr "Ağdaki bir kullanıcıyı killemenizi sağlar. Parametreler standart /KILL komutuyla aynıdır."
|
||||
|
||||
#, c-format
|
||||
msgid "Allows you to prevent certain pieces of information from being displayed when someone does a %sINFO on the nick. You can hide the email address (EMAIL), last seen user@host mask (MASK), the services access status (STATUS) and last quit message (QUIT). The second parameter specifies whether the information should be displayed (OFF) or hidden (ON)."
|
||||
msgid "Allows you to prevent certain pieces of information from being displayed when someone does a %sINFO on the nick. You can hide the email address (EMAIL), last seen user@host mask (MASK), the services access status (STATUS) and last quit message (QUIT). The second parameter specifies whether the information should be displayed (OFF) or hidden (ON)."
|
||||
msgstr "Birisi rumuz üzerinde %s INFO işlemi yaptığında belirli bilgilerin görüntülenmesini engellemenizi sağlar. E-posta adresini (EMAIL), son görülen user@host maskesini (USERMASK), servis erişim durumunu (STATUS) ve son çıkış mesajını (QUIT) gizleyebilirsiniz. İkinci parametre, bilgilerin görüntülenip görüntülenmeyeceği (OFF) veya gizlenmesi (ON) gerektiğini belirtir."
|
||||
|
||||
#, c-format
|
||||
msgid "Allows you to prevent certain pieces of information from being displayed when someone does a %sINFO on your nick. You can hide your email address(EMAIL), last seen user@host mask (MASK), your services access status (STATUS) and last quit message (QUIT). The second parameter specifies whether the information should be displayed (OFF) or hidden (ON)."
|
||||
msgid "Allows you to prevent certain pieces of information from being displayed when someone does a %sINFO on your nick. You can hide your email address(EMAIL), last seen user@host mask (MASK), your services access status (STATUS) and last quit message (QUIT). The second parameter specifies whether the information should be displayed (OFF) or hidden (ON)."
|
||||
msgstr "Birisi rumuzunuza %s INFO işlemi yaptığında belirli bilgilerin görüntülenmesini engellemenizi sağlar. E-posta adresinizi (EMAIL), son görülen user@host maskenizi (USERMASK), servis erişim durumunuzu (STATUS) ve son çıkış mesajınızı (QUIT) gizleyebilirsiniz. İkinci parametre, bilgilerin görüntülenip görüntülenmeyeceği (OFF) veya gizlenmesi (ON) gerektiğini belirtir."
|
||||
|
||||
#, c-format
|
||||
@@ -2452,25 +2452,25 @@ msgstr "Bir kanaldaki modları ve mod kilitlerini kontrol edin"
|
||||
msgid ""
|
||||
"Controls what messages will be sent to users when they join the channel.\n"
|
||||
"\n"
|
||||
"The %sADD command adds the given message to the list of messages shown to users when they join the channel.\n"
|
||||
"The %sADD command adds the given message to the list of messages shown to users when they join the channel.\n"
|
||||
"\n"
|
||||
"The %sDEL command removes the specified message from the list of messages shown to users when they join the channel. You can remove a message by specifying its number which you can get by listing the messages as explained below.\n"
|
||||
"The %sDEL command removes the specified message from the list of messages shown to users when they join the channel. You can remove a message by specifying its number which you can get by listing the messages as explained below.\n"
|
||||
"\n"
|
||||
"The %sLIST command displays a listing of messages shown to users when they join the channel.\n"
|
||||
"The %sLIST command displays a listing of messages shown to users when they join the channel.\n"
|
||||
"\n"
|
||||
"The %sCLEAR command clears all entries from the list of messages shown to users when they join the channel, effectively disabling entry messages.\n"
|
||||
"The %sCLEAR command clears all entries from the list of messages shown to users when they join the channel, effectively disabling entry messages.\n"
|
||||
"\n"
|
||||
"Adding, deleting, or clearing entry messages requires the SET permission."
|
||||
msgstr ""
|
||||
"Kullanıcılara kanala girdiklerinde hangi mesajların gönderileceğini kontrol eder.\n"
|
||||
"\n"
|
||||
"%sADD komutu, belirtilen mesajı, kullanıcılar kanala katıldıklarında kendilerine gösterilen mesajlar listesine ekler.\n"
|
||||
"%sADD komutu, belirtilen mesajı, kullanıcılar kanala katıldıklarında kendilerine gösterilen mesajlar listesine ekler.\n"
|
||||
"\n"
|
||||
"%sDEL komutu, kullanıcılar kanala katıldıklarında kendilerine gösterilen mesajlar listesinden belirtilen mesajı kaldırır. Aşağıda açıklandığı gibi mesajları listeleyerek seçilen numarayı belirterek bir mesajı kaldırabilirsiniz.\n"
|
||||
"%sDEL komutu, kullanıcılar kanala katıldıklarında kendilerine gösterilen mesajlar listesinden belirtilen mesajı kaldırır. Aşağıda açıklandığı gibi mesajları listeleyerek seçilen numarayı belirterek bir mesajı kaldırabilirsiniz.\n"
|
||||
"\n"
|
||||
"%sLIST komutu, kullanıcılar kanala katıldıklarında kendilerine gösterilen mesajların bir listesini görüntüler.\n"
|
||||
"%sLIST komutu, kullanıcılar kanala katıldıklarında kendilerine gösterilen mesajların bir listesini görüntüler.\n"
|
||||
"\n"
|
||||
"%sCLEAR komutu, kullanıcılar kanala katıldıklarında kendilerine gösterilen mesaj listesindeki tüm girişleri temizler ve giriş mesajlarını etkin bir şekilde devre dışı bırakır.\n"
|
||||
"%sCLEAR komutu, kullanıcılar kanala katıldıklarında kendilerine gösterilen mesaj listesindeki tüm girişleri temizler ve giriş mesajlarını etkin bir şekilde devre dışı bırakır.\n"
|
||||
"\n"
|
||||
"Giriş mesajlarının eklenmesi, silinmesi veya temizlenmesi SET iznini gerektirir."
|
||||
|
||||
@@ -2746,10 +2746,10 @@ msgid ""
|
||||
"\n"
|
||||
"Examples:\n"
|
||||
"\n"
|
||||
" DEL1\n"
|
||||
" DEL1\n"
|
||||
" Deletes your first memo.\n"
|
||||
"\n"
|
||||
" DEL2-5,7-9\n"
|
||||
" DEL2-5,7-9\n"
|
||||
" Deletes memos numbered 2 through 5 and 7 through 9."
|
||||
msgstr ""
|
||||
"Belirtilen memou veya memoları siler. Aşağıdaki ikinci örnekte olduğu gibi tek bir numara yerine birden fazla not numarası veya numara aralığı belirtebilirsiniz.\n"
|
||||
@@ -3528,11 +3528,11 @@ msgid ""
|
||||
"\n"
|
||||
"Examples:\n"
|
||||
"\n"
|
||||
" LIST*anope*\n"
|
||||
" LIST*anope*\n"
|
||||
" Lists all registered channels with anope in their\n"
|
||||
" names (case insensitive).\n"
|
||||
"\n"
|
||||
" LIST*NOEXPIRE\n"
|
||||
" LIST*NOEXPIRE\n"
|
||||
" Lists all registered channels which have been set to not expire.\n"
|
||||
"\n"
|
||||
" LIST #51-100\n"
|
||||
@@ -3685,39 +3685,39 @@ msgstr "%s oturumunuzu kapatır ve sonrasında Servis Operatörü ayrıcalıklar
|
||||
msgid ""
|
||||
"Mainly controls mode locks and mode access (which is different from channel access) on a channel.\n"
|
||||
"\n"
|
||||
"The %sLOCK command allows you to add, delete, and view mode locks on a channel. If a mode is locked on or off, services will not allow that mode to be changed. The SET command will clear all existing mode locks and set the new one given, while ADD and DEL modify the existing mode lock.\n"
|
||||
"The %sLOCK command allows you to add, delete, and view mode locks on a channel. If a mode is locked on or off, services will not allow that mode to be changed. The SET command will clear all existing mode locks and set the new one given, while ADD and DEL modify the existing mode lock.\n"
|
||||
"\n"
|
||||
"Example:\n"
|
||||
" %s#channel%sADD+bmnt*!*@*aol*\n"
|
||||
" %s#channel%sADD+bmnt*!*@*aol*\n"
|
||||
"\n"
|
||||
"\n"
|
||||
"The %sSET command allows you to set modes through services. Wildcards * and ? may be given as parameters for list and status modes.\n"
|
||||
"The %sSET command allows you to set modes through services. Wildcards * and ? may be given as parameters for list and status modes.\n"
|
||||
"\n"
|
||||
"Example:\n"
|
||||
" %s#channelSET+v*\n"
|
||||
" %s#channelSET+v*\n"
|
||||
" Sets voice status to all users in the channel.\n"
|
||||
"\n"
|
||||
" %s#channelSET-b~c:*\n"
|
||||
" %s#channelSET-b~c:*\n"
|
||||
" Clears all extended bans that start with ~c:\n"
|
||||
"\n"
|
||||
"The %sCLEAR command is an easy way to clear modes on a channel. what may be any mode name. Examples include bans, excepts, inviteoverrides, ops, halfops, and voices. If what is not given then all basic modes are removed."
|
||||
"The %sCLEAR command is an easy way to clear modes on a channel. what may be any mode name. Examples include bans, excepts, inviteoverrides, ops, halfops, and voices. If what is not given then all basic modes are removed."
|
||||
msgstr ""
|
||||
"Temel olarak bir kanaldaki mod kilitlerini ve mod erişimini (kanal erişiminden farklıdır) kontrol eder.\n"
|
||||
"\n"
|
||||
"%s LOCK komutu, bir kanaldaki mod kilitlerini eklemenizi, silmenizi ve görüntülemenizi sağlar. Bir mod açık veya kapalı olarak kilitlenirse servisler bu modun değiştirilmesine izin vermez. SET komutu tüm mevcut mod kilitlerini temizler ve belirtilen yenisini ayarlar, ADD ve DEL ise mevcut mod kilidini değiştirir.\n"
|
||||
"\n"
|
||||
"Örneğin:\n"
|
||||
" %s#channel%sADD+bmnt*!*@*aol*\n"
|
||||
" %s#channel%sADD+bmnt*!*@*aol*\n"
|
||||
"\n"
|
||||
"\n"
|
||||
"%s SET komutu, servisler aracılığıyla modları ayarlamanıza olanak tanır. Joker\n"
|
||||
"karakterler \"*\" ve \"?\", liste ve durum modları için parametre olarak verilebilir.\n"
|
||||
"Örneğin:\n"
|
||||
"\n"
|
||||
" %s#kanalSET+v*\n"
|
||||
" %s#kanalSET+v*\n"
|
||||
" Kanaldaki tüm kullanıcıların voice durumunu ayarlar.\n"
|
||||
"\n"
|
||||
" %s#kanalSET-b~c:*\n"
|
||||
" %s#kanalSET-b~c:*\n"
|
||||
" ~c ile başlayan tüm genişletilmiş banları temizler:\n"
|
||||
"\n"
|
||||
"%s CLEAR komutu, bir kanaldaki modları temizlemenin kolay bir yoludur. ne? herhangi bir mod adı olabilir. Örnekler arasında yasaklar, istisnalar, davet geçersiz kılmalar, oplar, \n"
|
||||
@@ -3737,65 +3737,65 @@ msgstr "Bir kanal için %s listesini ayarlar. %s listesindeki bir erişim gird
|
||||
msgid ""
|
||||
"Maintains the AutoKick list for a channel. If a user on the AutoKick list attempts to join the channel, %s will ban that user from the channel, then kick the user.\n"
|
||||
"\n"
|
||||
"The %sADD command adds the given nick or mask to the AutoKick list. If a reason is given with the command, that reason will be used when the user is kicked; if not, the default reason is \"User has been banned from the channel\". When akicking a registered nick the %s account will be added to the akick list instead of the mask. All users within that nickgroup will then be akicked. \n"
|
||||
"The %sADD command adds the given nick or mask to the AutoKick list. If a reason is given with the command, that reason will be used when the user is kicked; if not, the default reason is \"User has been banned from the channel\". When akicking a registered nick the %s account will be added to the akick list instead of the mask. All users within that nickgroup will then be akicked. \n"
|
||||
"\n"
|
||||
"The %sDEL command removes the given nick or mask from the AutoKick list. It does not, however, remove any bans placed by an AutoKick; those must be removed manually.\n"
|
||||
"The %sDEL command removes the given nick or mask from the AutoKick list. It does not, however, remove any bans placed by an AutoKick; those must be removed manually.\n"
|
||||
"\n"
|
||||
"The %sLIST command displays the AutoKick list, or optionally only those AutoKick entries which match the given mask.\n"
|
||||
"The %sLIST command displays the AutoKick list, or optionally only those AutoKick entries which match the given mask.\n"
|
||||
"\n"
|
||||
"The %sVIEW command is a more verbose version of the %sLIST command.\n"
|
||||
"The %sVIEW command is a more verbose version of the %sLIST command.\n"
|
||||
"\n"
|
||||
"The %sENFORCE command causes %s to enforce the current akick list by removing those users who match an akick mask.\n"
|
||||
"The %sENFORCE command causes %s to enforce the current akick list by removing those users who match an akick mask.\n"
|
||||
"\n"
|
||||
"The %sCLEAR command clears all entries of the akick list."
|
||||
"The %sCLEAR command clears all entries of the akick list."
|
||||
msgstr ""
|
||||
"Bir kanal için Oto-At listesini düzenler. Oto-At listesindeki bir kullanıcı kanala girmeye çalışırsa, %s bu kullanıcıyı kanaldan banlayacak ve ardından kullanıcıyı atacaktır.\n"
|
||||
"\n"
|
||||
"%sADD komutu belirtilen rumuzu veya kullanıcı maskesini Oto-At listesine ekler. Komutla birlikte sebep verilirse kullanıcı atıldığında bu sebep kullanılacaktır; değilse, varsayılan neden \"Kullanıcının kanaldan banlanması\"dır. Kayıtlı bir rumuz atıldığında, maske yerine %s hesabı akick listesine eklenecektir. Daha sonra o rumuz grubundaki tüm kullanıcılar atılacaktır.\n"
|
||||
"%sADD komutu belirtilen rumuzu veya kullanıcı maskesini Oto-At listesine ekler. Komutla birlikte sebep verilirse kullanıcı atıldığında bu sebep kullanılacaktır; değilse, varsayılan neden \"Kullanıcının kanaldan banlanması\"dır. Kayıtlı bir rumuz atıldığında, maske yerine %s hesabı akick listesine eklenecektir. Daha sonra o rumuz grubundaki tüm kullanıcılar atılacaktır.\n"
|
||||
"\n"
|
||||
"%sDEL komutu belirtilen rumuz veya maskeyi Oto-At listesinden kaldırır. Ancak, Oto-At tarafından yerleştirilen yasakları kaldırmaz; bunlar manuel olarak kaldırılmalıdır.\n"
|
||||
"%sDEL komutu belirtilen rumuz veya maskeyi Oto-At listesinden kaldırır. Ancak, Oto-At tarafından yerleştirilen yasakları kaldırmaz; bunlar manuel olarak kaldırılmalıdır.\n"
|
||||
"\n"
|
||||
"%sLIST komutu Oto-At listesini veya isteğe bağlı olarak yalnızca belirtilen maskeyle eşleşen Oto-At girdilerini görüntüler.\n"
|
||||
"%sLIST komutu Oto-At listesini veya isteğe bağlı olarak yalnızca belirtilen maskeyle eşleşen Oto-At girdilerini görüntüler.\n"
|
||||
"\n"
|
||||
"%sVIEW komutu, %sLIST komutunun daha ayrıntılı bir sürümüdür.\n"
|
||||
"%sVIEW komutu, %sLIST komutunun daha ayrıntılı bir sürümüdür.\n"
|
||||
"\n"
|
||||
"%sENFORCE komutu, %s'nin, akick maskesiyle eşleşen kullanıcıları kaldırarak geçerli akick listesini uygulamasını sağlar.\n"
|
||||
"%sENFORCE komutu, %s'nin, akick maskesiyle eşleşen kullanıcıları kaldırarak geçerli akick listesini uygulamasını sağlar.\n"
|
||||
"\n"
|
||||
"%sCLEAR komutu akick listesindeki tüm girişleri temizler."
|
||||
"%sCLEAR komutu akick listesindeki tüm girişleri temizler."
|
||||
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Maintains the access list for a channel. The access list specifies which users are allowed chanop status or access to %s commands on the channel. Different user levels allow for access to different subsets of privileges. Any registered user not on the access list has a user level of 0, and any unregistered user has a user level of -1.\n"
|
||||
"\n"
|
||||
"The %sADD command adds the given mask to the access list with the given user level; if the mask is already present on the list, its access level is changed to the level specified in the command. The level specified may be a numerical level or the name of a privilege (eg AUTOOP). When a user joins the channel the access they receive is from the highest level entry in the access list."
|
||||
"The %sADD command adds the given mask to the access list with the given user level; if the mask is already present on the list, its access level is changed to the level specified in the command. The level specified may be a numerical level or the name of a privilege (eg AUTOOP). When a user joins the channel the access they receive is from the highest level entry in the access list."
|
||||
msgstr ""
|
||||
"Bir kanal için erişim listesini bakımı yapar. Erişim listesi, kanalda hangi kullanıcıların chanop statüsüne veya %s komutlarına erişime izin verildiğini belirtir. Farklı kullanıcı seviyeleri, ayrıcalıkların farklı alt kümelerine erişime izin verir. Erişim listesinde olmayan kayıtlı herhangi bir kullanıcının kullanıcı seviyesi 0'dır ve kayıtlı olmayan herhangi bir kullanıcının kullanıcı seviyesi -1'dir.\n"
|
||||
"\n"
|
||||
"Bu %sADD komutu, belirtilen maskeyi, belirtilen kullanıcı düzeyiyle erişim listesine ekler; maske listede zaten mevcutsa erişim düzeyi komutta belirtilen düzeye değiştirilir. Belirtilen seviye sayısal bir seviye veya bir ayrıcalığın adı (örn. AUTOOP) olabilir. Bir kullanıcı kanala katıldığında aldığı erişim, erişim listesindeki en üst düzey girişten olur."
|
||||
"Bu %sADD komutu, belirtilen maskeyi, belirtilen kullanıcı düzeyiyle erişim listesine ekler; maske listede zaten mevcutsa erişim düzeyi komutta belirtilen düzeye değiştirilir. Belirtilen seviye sayısal bir seviye veya bir ayrıcalığın adı (örn. AUTOOP) olabilir. Bir kullanıcı kanala katıldığında aldığı erişim, erişim listesindeki en üst düzey girişten olur."
|
||||
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Maintains the bad words list for a channel. The bad words list determines which words are to be kicked when the bad words kicker is enabled. For more information, type %sKICK%s.\n"
|
||||
"Maintains the bad words list for a channel. The bad words list determines which words are to be kicked when the bad words kicker is enabled. For more information, type %sKICK%s.\n"
|
||||
"\n"
|
||||
"The ADD command adds the given word to the bad words list. If SINGLE is specified, a kick will be done only if a user says the entire word. If START is specified, a kick will be done if a user says a word that starts with word. If END is specified, a kick will be done if a user says a word that ends with word. If you don't specify anything, a kick will be issued every time word is said by a user. This will be shown in the LIST output as ANY.\n"
|
||||
"\n"
|
||||
"The DEL command removes the given word from the bad words list. If a list of entry numbers is given, those entries are deleted. (See the example for LIST below.)\n"
|
||||
"\n"
|
||||
"The LIST command displays the bad words list. If a wildcard mask is given, only those entries matching the mask are displayed. If a list of entry numbers is given, only those entries are shown; for example:\n"
|
||||
" #channelLIST2-5,7-9\n"
|
||||
" #channelLIST2-5,7-9\n"
|
||||
" Lists bad words entries numbered 2 through 5 and\n"
|
||||
" 7 through 9.\n"
|
||||
"\n"
|
||||
"The CLEAR command clears all entries from the bad words list."
|
||||
msgstr ""
|
||||
"Bir kanal için küfür listesini düzenler. küfür listesi, küfürlü konuşanları atma etkinleştirildiğinde hangi kelimelerin atılacağını belirler. Daha fazla bilgi için %sKICK%s yazın.\n"
|
||||
"Bir kanal için küfür listesini düzenler. küfür listesi, küfürlü konuşanları atma etkinleştirildiğinde hangi kelimelerin atılacağını belirler. Daha fazla bilgi için %sKICK%s yazın.\n"
|
||||
"\n"
|
||||
"ADD komutu belirtilen kelimeyi küfür listesine ekler. SINGLE belirtilirse, yalnızca kullanıcı kelimenin tamamını söylediğinde atış yapılacaktır. START belirtilirse, kullanıcı kelime ile başlayan bir kelime söylerse atış yapılacaktır. END belirtilirse, kullanıcı kelime ile biten bir kelime söylerse atış yapılacaktır. Herhangi bir şey belirtmezseniz, kullanıcı tarafından kelime her söylendiğinde bir atış yapılır.\n"
|
||||
"\n"
|
||||
"DEL komutu verilen kelimeyi küfür listesinden kaldırır. Girdi numaralarının bir listesi verilirse, bu girdiler silinir. (Aşağıdaki LIST örneğine bakın.)\n"
|
||||
"\n"
|
||||
"LIST komutu küfür listesini görüntüler. Joker karakter maskesi verilirse, yalnızca maskeyle eşleşen girdiler görüntülenir. Girdi numaralarının bir listesi verilirse, yalnızca bu girdiler gösterilir; örneğin:\n"
|
||||
" #kanalLIST2-5,7-9\n"
|
||||
" #kanalLIST2-5,7-9\n"
|
||||
" 2'den 5'e ve 7'den 9'a kadar numaralandırılmış küfür \n"
|
||||
" girdilerini listeler.\n"
|
||||
"\n"
|
||||
@@ -3956,30 +3956,30 @@ msgid ""
|
||||
"\n"
|
||||
"Examples:\n"
|
||||
"\n"
|
||||
" %sADD\n"
|
||||
" %sADD\n"
|
||||
" Adds your current fingerprint to the certificate list and\n"
|
||||
" automatically identifies you when you connect to IRC\n"
|
||||
" using this fingerprint.\n"
|
||||
"\n"
|
||||
" %sDEL<fingerprint>\n"
|
||||
" %sDEL<fingerprint>\n"
|
||||
" Removes the fingerprint <fingerprint> from your certificate list.\n"
|
||||
"\n"
|
||||
" %sLIST\n"
|
||||
" %sLIST\n"
|
||||
" Displays the current certificate list."
|
||||
msgstr ""
|
||||
"Rumuzunuz için sertifika listesini değiştirir veya görüntüler. IRC'ye bağlanırsanız ve sertifika listesinde eşleşen bir parmak izi olan bir istemci sertifikası sağlarsanız, otomatik olarak hizmetlere tanımlanırsınız. Servis Operatörleri, diğer kullanıcıların sertifika listelerini değiştirmek için bir rumuz sağlayabilir.\n"
|
||||
"\n"
|
||||
"Örnekler:\n"
|
||||
"\n"
|
||||
" %sADD\n"
|
||||
" %sADD\n"
|
||||
" Geçerli parmak izinizi sertifika listesine ekler ve bu parmak\n"
|
||||
" izini kullanarak IRC'ye bağlandığınızda sizi otomatik\n"
|
||||
" olarak tanımlar.\n"
|
||||
"\n"
|
||||
" %sDEL<fingerprint>\n"
|
||||
" %sDEL<fingerprint>\n"
|
||||
" Parmak izini <parmak-izi> sertifika listenizden kaldırır.\n"
|
||||
"\n"
|
||||
" %sLIST\n"
|
||||
" %sLIST\n"
|
||||
" Geçerli sertifika listesini görüntüler."
|
||||
|
||||
#, c-format
|
||||
@@ -4396,8 +4396,8 @@ msgid "Persistent"
|
||||
msgstr "Kalıcı"
|
||||
|
||||
#, c-format
|
||||
msgid "Please confirm that you want to drop %s with %s%s%s"
|
||||
msgstr "Lütfen %s rumuzunu droplamak isteğinizi %s%s%s ile onaylayın"
|
||||
msgid "Please confirm that you want to drop %s with %s%s%s"
|
||||
msgstr "Lütfen %s rumuzunu droplamak isteğinizi %s%s%s ile onaylayın"
|
||||
|
||||
msgid "Please contact an Operator to get a vhost assigned to this nick."
|
||||
msgstr "Bu rumuza atanan bir vHost almak için lütfen bir operle iletişime geçin."
|
||||
@@ -4808,7 +4808,7 @@ msgid "See %s for more information about the flags system."
|
||||
msgstr "Bayrak sistemi hakkında detaylı bilgi için %s komut çıktısına bakın."
|
||||
|
||||
#, c-format
|
||||
msgid "See the %s command (%sACCESS) for information on giving a subset of these privileges to other channel users."
|
||||
msgid "See the %s command (%sACCESS) for information on giving a subset of these privileges to other channel users."
|
||||
msgstr "Bu ayrıcalıkların bir alt kümesini diğer kanal kullanıcılarına verme hakkında bilgi için %s komutuna (%s HELP ACCESS) bakın."
|
||||
|
||||
msgid "Send a memo to a nick or channel"
|
||||
@@ -5089,13 +5089,13 @@ msgstr ""
|
||||
msgid ""
|
||||
"Sets the bad words kicker on or off. When enabled, this option tells the bot to kick users who say certain words on the channels.\n"
|
||||
"\n"
|
||||
"You can define bad words for your channel using the BADWORDS command. Type %sBADWORDS for more information.\n"
|
||||
"You can define bad words for your channel using the BADWORDS command. Type %sBADWORDS for more information.\n"
|
||||
"\n"
|
||||
"ttb is the number of times a user can be kicked before it gets banned. Don't give ttb to disable the ban system once activated."
|
||||
msgstr ""
|
||||
"Küfür atmayı açar veya kapatır. Etkinleştirildiğinde, bu seçenek bota kanallarda belirli kelimeleri söyleyen kullanıcıları atmasını söyler.\n"
|
||||
"\n"
|
||||
"BADWORDS komutunu kullanarak kanalınıza küfür tanımlayabilirsiniz. Daha fazla bilgi için %sBADWORDS yazın.\n"
|
||||
"BADWORDS komutunu kullanarak kanalınıza küfür tanımlayabilirsiniz. Daha fazla bilgi için %sBADWORDS yazın.\n"
|
||||
"\n"
|
||||
"ttb, bir kullanıcının banlanmadan önce atılabileceği sayıdır. Ban sistemini aktif hale getirdikten sonra devre dışı bırakmak için ttb'yi komutta belirtmeyin."
|
||||
|
||||
@@ -5251,8 +5251,8 @@ msgid "Sets whether you will be given your channel status modes automatically. S
|
||||
msgstr "Kanal durum modlarınızın size otomatik olarak verilip verilmeyeceğini ayarlar. Kanallara girerken %s'nin durum modlarını otomatik olarak sizin üzerinizde ayarlamasına izin vermek için AÇIK olarak ayarlayın. Kanal ayarlarına bağlı olarak bazı modların otomatik olarak ayarlanamayacağını unutmayın."
|
||||
|
||||
#, c-format
|
||||
msgid "Setting %s not known. Type %sLEVELS for a list of valid settings."
|
||||
msgstr "%s ayarı bilinmiyor. Geçerli ayarların listesi için %sLEVELS yazın."
|
||||
msgid "Setting %s not known. Type %sLEVELS for a list of valid settings."
|
||||
msgstr "%s ayarı bilinmiyor. Geçerli ayarların listesi için %sLEVELS yazın."
|
||||
|
||||
msgid "Setting for DEBUG must be ON, OFF, or a positive number."
|
||||
msgstr "DEBUG ayarı ON, OFF veya pozitif bir sayı olmalıdır."
|
||||
@@ -5440,7 +5440,7 @@ msgid ""
|
||||
"\n"
|
||||
"Adding HARD prevents the user from changing the limit. Not adding HARD has the opposite effect, allowing the user to change the limit (even if a previous limit was set with HARD).\n"
|
||||
"\n"
|
||||
"This use of the SETLIMIT command is limited to Services Operators. Other users may only enter a limit for themselves or a channel on which they have such privileges, may not remove their limit, may not set a limit above %d, and may not set a hard limit."
|
||||
"This use of the SETLIMIT command is limited to Services Operators. Other users may only enter a limit for themselves or a channel on which they have such privileges, may not remove their limit, may not set a limit above %d, and may not set a hard limit."
|
||||
msgstr ""
|
||||
"Kullanımı: LIMIT [ident | kanal] {limit | NONE} [HARD]\n"
|
||||
"\n"
|
||||
@@ -5546,35 +5546,35 @@ msgstr "Metin"
|
||||
|
||||
#, c-format
|
||||
msgid ""
|
||||
"The %s command allows fine control over the meaning of the numeric access levels used for channels. With this command, you can define the access level required for most of %s's functions. (The SETFOUNDER and this command are always restricted to the channel founder).\n"
|
||||
"The %s command allows fine control over the meaning of the numeric access levels used for channels. With this command, you can define the access level required for most of %s's functions. (The SETFOUNDER and this command are always restricted to the channel founder).\n"
|
||||
"\n"
|
||||
"%sSET allows the access level for a function or group of functions to be changed. %sDISABLE (or DIS for short) disables an automatic feature or disallows access to a function by anyone, INCLUDING the founder (although, the founder can always re-enable it). Use %sSET founder to make a level founder only.\n"
|
||||
"%sSET allows the access level for a function or group of functions to be changed. %sDISABLE (or DIS for short) disables an automatic feature or disallows access to a function by anyone, INCLUDING the founder (although, the founder can always re-enable it). Use %sSET founder to make a level founder only.\n"
|
||||
"\n"
|
||||
"%sLIST shows the current levels for each function or group of functions. %sRESET resets the levels to the default levels of a newly-created channel.\n"
|
||||
"%sLIST shows the current levels for each function or group of functions. %sRESET resets the levels to the default levels of a newly-created channel.\n"
|
||||
"\n"
|
||||
"For a list of the features and functions whose levels can be set, see HELP%sDESC."
|
||||
"For a list of the features and functions whose levels can be set, see HELP%sDESC."
|
||||
msgstr ""
|
||||
"%s komutu, kanallar için kullanılan sayısal erişim seviyelerinin anlamı üzerinde hassas kontrol sağlar. Bu komutla, %s işlevlerinin çoğu için gereken erişim düzeyini tanımlayabilirsiniz. (SETFOUNDER ve bu komut her zaman kanal kurucusuyla sınırlıdır.)\n"
|
||||
"%s komutu, kanallar için kullanılan sayısal erişim seviyelerinin anlamı üzerinde hassas kontrol sağlar. Bu komutla, %s işlevlerinin çoğu için gereken erişim düzeyini tanımlayabilirsiniz. (SETFOUNDER ve bu komut her zaman kanal kurucusuyla sınırlıdır.)\n"
|
||||
"\n"
|
||||
"%sSET, bir işlevin veya işlev grubunun erişim düzeyinin değiştirilmesine olanak tanır. %sDISABLE (ya da kısaca DIS), otomatik bir özelliği devre dışı bırakır veya kurucu DAHİL olmak üzere herhangi birinin bir işleve erişimine izin vermez (ancak kurucu bunu her zaman yeniden etkinleştirebilir). Yalnızca kurucu seviyesi yapmak için %sSET founder komutunu kullanın.\n"
|
||||
"%sSET, bir işlevin veya işlev grubunun erişim düzeyinin değiştirilmesine olanak tanır. %sDISABLE (ya da kısaca DIS), otomatik bir özelliği devre dışı bırakır veya kurucu DAHİL olmak üzere herhangi birinin bir işleve erişimine izin vermez (ancak kurucu bunu her zaman yeniden etkinleştirebilir). Yalnızca kurucu seviyesi yapmak için %sSET founder komutunu kullanın.\n"
|
||||
"\n"
|
||||
"%sLIST her fonksiyon veya fonksiyon grubu için mevcut seviyeleri gösterir. %sRESET, seviyeleri yeni oluşturulan bir kanalın varsayılan seviyelerine sıfırlar.\n"
|
||||
"%sLIST her fonksiyon veya fonksiyon grubu için mevcut seviyeleri gösterir. %sRESET, seviyeleri yeni oluşturulan bir kanalın varsayılan seviyelerine sıfırlar.\n"
|
||||
"\n"
|
||||
"Düzeyleri ayarlanabilecek özellik ve işlevlerin listesi için\n"
|
||||
"bkz. HELP%sDESC."
|
||||
"bkz. HELP%sDESC."
|
||||
|
||||
#, c-format
|
||||
msgid ""
|
||||
"The %sADD command adds the given nickname to the %s list.\n"
|
||||
"The %sADD command adds the given nickname to the %s list.\n"
|
||||
"\n"
|
||||
"The %sDEL command removes the given nick from the %s list. If a list of entry numbers is given, those entries are deleted. (See the example for LIST below.)\n"
|
||||
"The %sDEL command removes the given nick from the %s list. If a list of entry numbers is given, those entries are deleted. (See the example for LIST below.)\n"
|
||||
"\n"
|
||||
"The %sLIST command displays the %s list. If a wildcard mask is given, only those entries matching the mask are displayed. If a list of entry numbers is given, only those entries are shown; for example:\n"
|
||||
" %s#channelLIST2-5,7-9\n"
|
||||
"The %sLIST command displays the %s list. If a wildcard mask is given, only those entries matching the mask are displayed. If a list of entry numbers is given, only those entries are shown; for example:\n"
|
||||
" %s#channelLIST2-5,7-9\n"
|
||||
" Lists %s entries numbered 2 through 5 and\n"
|
||||
" 7 through 9.\n"
|
||||
"\n"
|
||||
"The %sCLEAR command clears all entries of the %s list."
|
||||
"The %sCLEAR command clears all entries of the %s list."
|
||||
msgstr ""
|
||||
"Bu %s ADD komutu belirtilen rumuzu %s listesine ekler.\n"
|
||||
" \n"
|
||||
@@ -5591,87 +5591,87 @@ msgstr ""
|
||||
|
||||
#, c-format
|
||||
msgid ""
|
||||
"The %sDEL command removes the given mask from the AKILL list if it is present. If a list of entry numbers is given, those entries are deleted. (See the example for LIST below.)\n"
|
||||
"The %sDEL command removes the given mask from the AKILL list if it is present. If a list of entry numbers is given, those entries are deleted. (See the example for LIST below.)\n"
|
||||
"\n"
|
||||
"The %sLIST command displays the AKILL list. If a wildcard mask is given, only those entries matching the mask are displayed. If a list of entry numbers is given, only those entries are shown; for example:\n"
|
||||
" %sLIST2-5,7-9\n"
|
||||
"The %sLIST command displays the AKILL list. If a wildcard mask is given, only those entries matching the mask are displayed. If a list of entry numbers is given, only those entries are shown; for example:\n"
|
||||
" %sLIST2-5,7-9\n"
|
||||
" Lists AKILL entries numbered 2 through 5 and 7\n"
|
||||
" through 9.\n"
|
||||
"\n"
|
||||
"%sVIEW is a more verbose version of %sLIST, and will show who added an AKILL, the date it was added, and when it expires, as well as the user@host/ip mask and reason.\n"
|
||||
"%sVIEW is a more verbose version of %sLIST, and will show who added an AKILL, the date it was added, and when it expires, as well as the user@host/ip mask and reason.\n"
|
||||
"\n"
|
||||
"%sCLEAR clears all entries of the AKILL list."
|
||||
"%sCLEAR clears all entries of the AKILL list."
|
||||
msgstr ""
|
||||
"Bu %sDEL komutu, belirtilen maskeyi varsa AKILL listesinden kaldırır. Girdi numara listesi belirtilmişse bu girdiler silinir. (Aşağıdaki LIST örneğine bakın.)\n"
|
||||
"Bu %sDEL komutu, belirtilen maskeyi varsa AKILL listesinden kaldırır. Girdi numara listesi belirtilmişse bu girdiler silinir. (Aşağıdaki LIST örneğine bakın.)\n"
|
||||
" \n"
|
||||
"%sLIST komutu AKILL listesini görüntüler. Eğer joker karakter belirtilirse, yalnızca maskeyle eşleşen girdiler görüntülenir. Bir girdi numara listesi verilirse yalnızca bu girdiler gösterilir; Örneğin:\n"
|
||||
" %sLIST2-5,7-9\n"
|
||||
"%sLIST komutu AKILL listesini görüntüler. Eğer joker karakter belirtilirse, yalnızca maskeyle eşleşen girdiler görüntülenir. Bir girdi numara listesi verilirse yalnızca bu girdiler gösterilir; Örneğin:\n"
|
||||
" %sLIST2-5,7-9\n"
|
||||
" 2'den 5'e ve 7'den 9'a kadar numaralandırılmış olan AKILL girdilerini\n"
|
||||
" listeler.\n"
|
||||
"\n"
|
||||
"%sVIEW,%sLIST'in daha ayrıntılı bir sürümüdür ve AKILL'i kimin eklediğini, eklendiği tarihi, süresinin ne zaman dolduğunu, ayrıca user@host/ip maskesini ve nedenini gösterir.\n"
|
||||
"%sVIEW,%sLIST'in daha ayrıntılı bir sürümüdür ve AKILL'i kimin eklediğini, eklendiği tarihi, süresinin ne zaman dolduğunu, ayrıca user@host/ip maskesini ve nedenini gösterir.\n"
|
||||
" \n"
|
||||
"%sCLEAR komutu AKILL listesindeki tüm girdileri temizler."
|
||||
"%sCLEAR komutu AKILL listesindeki tüm girdileri temizler."
|
||||
|
||||
#, c-format
|
||||
msgid ""
|
||||
"The %sDEL command removes the given nick from the access list. If a list of entry numbers is given, those entries are deleted. (See the example for LIST below.) You may remove yourself from an access list, even if you do not have access to modify that list otherwise.\n"
|
||||
"The %sDEL command removes the given nick from the access list. If a list of entry numbers is given, those entries are deleted. (See the example for LIST below.) You may remove yourself from an access list, even if you do not have access to modify that list otherwise.\n"
|
||||
"\n"
|
||||
"The %sLIST command displays the access list. If a wildcard mask is given, only those entries matching the mask are displayed. If a list of entry numbers is given, only those entries are shown; for example:\n"
|
||||
" %s#channelLIST2-5,7-9\n"
|
||||
"The %sLIST command displays the access list. If a wildcard mask is given, only those entries matching the mask are displayed. If a list of entry numbers is given, only those entries are shown; for example:\n"
|
||||
" %s#channelLIST2-5,7-9\n"
|
||||
" Lists access entries numbered 2 through 5 and\n"
|
||||
" 7 through 9.\n"
|
||||
"\n"
|
||||
"The %sVIEW command displays the access list similar to %sLIST but shows the creator and last used time.\n"
|
||||
"The %sVIEW command displays the access list similar to %sLIST but shows the creator and last used time.\n"
|
||||
"\n"
|
||||
"The %sCLEAR command clears all entries of the access list."
|
||||
"The %sCLEAR command clears all entries of the access list."
|
||||
msgstr ""
|
||||
"Bu %sDEL komutu belirtilen kelimeyi küfür listesinden çıkarır. Girdi numaraları listesi verilmişse bu girdiler silinir. (Aşağıdaki LIST örneğine bakın.) Aksi takdirde söz konusu listeyi değiştirme erişiminiz olmasa bile, kendinizi erişim listesinden kaldırabilirsiniz.\n"
|
||||
"Bu %sDEL komutu belirtilen kelimeyi küfür listesinden çıkarır. Girdi numaraları listesi verilmişse bu girdiler silinir. (Aşağıdaki LIST örneğine bakın.) Aksi takdirde söz konusu listeyi değiştirme erişiminiz olmasa bile, kendinizi erişim listesinden kaldırabilirsiniz.\n"
|
||||
" \n"
|
||||
"Bu %sLIST komutu küfür listesini görüntüler. Joker karakter maskesi belirtilirse yalnızca maskeyle eşleşen girdiler görüntülenir. Girdi numaralarının bir listesi verilirse yalnızca bu girdiler gösterilir; Örneğin:\n"
|
||||
" %s#kanalLIST2-5,7-9\n"
|
||||
"Bu %sLIST komutu küfür listesini görüntüler. Joker karakter maskesi belirtilirse yalnızca maskeyle eşleşen girdiler görüntülenir. Girdi numaralarının bir listesi verilirse yalnızca bu girdiler gösterilir; Örneğin:\n"
|
||||
" %s#kanalLIST2-5,7-9\n"
|
||||
" 2'den 5'e ve 7'den 9'a kadar numaralandırılmış küfür\n"
|
||||
" girdilerini listeler.\n"
|
||||
"\n"
|
||||
"%sVIEW komutu, %sLIST komutuna benzer erişim listesini görüntüler ancak oluşturanı ve son kullanılan zamanı gösterir.\n"
|
||||
"%sVIEW komutu, %sLIST komutuna benzer erişim listesini görüntüler ancak oluşturanı ve son kullanılan zamanı gösterir.\n"
|
||||
"\n"
|
||||
"%sCLEAR komutu, küfür listesindeki tüm girdileri\n"
|
||||
"%sCLEAR komutu, küfür listesindeki tüm girdileri\n"
|
||||
"temizler."
|
||||
|
||||
msgid ""
|
||||
"The SNLINEDEL command removes the given mask from the SNLINE list if it is present. If a list of entry numbers is given, those entries are deleted. (See the example for LIST below.)\n"
|
||||
"The SNLINEDEL command removes the given mask from the SNLINE list if it is present. If a list of entry numbers is given, those entries are deleted. (See the example for LIST below.)\n"
|
||||
"\n"
|
||||
"The SNLINELIST command displays the SNLINE list. If a wildcard mask is given, only those entries matching the mask are displayed. If a list of entry numbers is given, only those entries are shown; for example:\n"
|
||||
" SNLINELIST2-5,7-9\n"
|
||||
"The SNLINELIST command displays the SNLINE list. If a wildcard mask is given, only those entries matching the mask are displayed. If a list of entry numbers is given, only those entries are shown; for example:\n"
|
||||
" SNLINELIST2-5,7-9\n"
|
||||
" Lists SNLINE entries numbered 2 through 5 and 7\n"
|
||||
" through 9.\n"
|
||||
"\n"
|
||||
"SNLINEVIEW is a more verbose version of SNLINELIST, and will show who added an SNLINE, the date it was added, and when it expires, as well as the realname mask and reason.\n"
|
||||
"SNLINEVIEW is a more verbose version of SNLINELIST, and will show who added an SNLINE, the date it was added, and when it expires, as well as the realname mask and reason.\n"
|
||||
"\n"
|
||||
"SNLINECLEAR clears all entries of the SNLINE list."
|
||||
"SNLINECLEAR clears all entries of the SNLINE list."
|
||||
msgstr ""
|
||||
"SNLINEDEL komutu, belirtilen maskeyi varsa SNLINE listesinden kaldırır. Giriş numaraları listesi belirtilmişse bu girişler silinir. (Aşağıdaki LIST örneğine bakın.)\n"
|
||||
"SNLINEDEL komutu, belirtilen maskeyi varsa SNLINE listesinden kaldırır. Giriş numaraları listesi belirtilmişse bu girişler silinir. (Aşağıdaki LIST örneğine bakın.)\n"
|
||||
" \n"
|
||||
"SNLINELIST komutu SNLINE listesini görüntüler. Joker karakter maskesi verilirse yalnızca maskeyle eşleşen girişler görüntülenir. Giriş numaralarının bir listesi verilirse yalnızca bu girişler gösterilir; Örneğin:\n"
|
||||
" SNLINELIST2-5,7-9\n"
|
||||
"SNLINELIST komutu SNLINE listesini görüntüler. Joker karakter maskesi verilirse yalnızca maskeyle eşleşen girişler görüntülenir. Giriş numaralarının bir listesi verilirse yalnızca bu girişler gösterilir; Örneğin:\n"
|
||||
" SNLINELIST2-5,7-9\n"
|
||||
" 2'den 5'e ve 7'den 9'a kadar numaralandırılmış \n"
|
||||
" SNLINE girişlerini listeler.\n"
|
||||
" \n"
|
||||
"SNLINEVIEW, SNLINELIST'nin daha ayrıntılı bir sürümüdür ve SNLINE'ı kimin eklediğini, eklendiği tarihi, süresinin ne zaman dolduğunu, ayrıca gerçek ad maskesini ve nedenini gösterir.\n"
|
||||
"SNLINEVIEW, SNLINELIST'nin daha ayrıntılı bir sürümüdür ve SNLINE'ı kimin eklediğini, eklendiği tarihi, süresinin ne zaman dolduğunu, ayrıca gerçek ad maskesini ve nedenini gösterir.\n"
|
||||
" \n"
|
||||
"SNLINECLEAR SNLINE listesindeki tüm girişleri temizler."
|
||||
"SNLINECLEAR SNLINE listesindeki tüm girişleri temizler."
|
||||
|
||||
msgid ""
|
||||
"The SQLINEDEL command removes the given mask from the SQLINE list if it is present. If a list of entry numbers is given, those entries are deleted. (See the example for LIST below.)\n"
|
||||
"The SQLINEDEL command removes the given mask from the SQLINE list if it is present. If a list of entry numbers is given, those entries are deleted. (See the example for LIST below.)\n"
|
||||
"\n"
|
||||
"The SQLINELIST command displays the SQLINE list. If a wildcard mask is given, only those entries matching the mask are displayed. If a list of entry numbers is given, only those entries are shown; for example:\n"
|
||||
" SQLINELIST2-5,7-9\n"
|
||||
"The SQLINELIST command displays the SQLINE list. If a wildcard mask is given, only those entries matching the mask are displayed. If a list of entry numbers is given, only those entries are shown; for example:\n"
|
||||
" SQLINELIST2-5,7-9\n"
|
||||
" Lists SQLINE entries numbered 2 through 5 and 7\n"
|
||||
" through 9.\n"
|
||||
"\n"
|
||||
"SQLINEVIEW is a more verbose version of SQLINELIST, and will show who added an SQLINE, the date it was added, and when it expires, as well as the mask and reason.\n"
|
||||
"SQLINEVIEW is a more verbose version of SQLINELIST, and will show who added an SQLINE, the date it was added, and when it expires, as well as the mask and reason.\n"
|
||||
"\n"
|
||||
"SQLINECLEAR clears all entries of the SQLINE list."
|
||||
"SQLINECLEAR clears all entries of the SQLINE list."
|
||||
msgstr ""
|
||||
|
||||
#, c-format
|
||||
@@ -5681,7 +5681,7 @@ msgid ""
|
||||
"The CLEAR command lets you clean the database by removing all entries from the database that were added within time.\n"
|
||||
"\n"
|
||||
"Example:\n"
|
||||
" %sCLEAR30m\n"
|
||||
" %sCLEAR30m\n"
|
||||
" Will remove all entries that were added within the last 30 minutes."
|
||||
msgstr ""
|
||||
"STATS komutu, depolanan rumuzlar ve bellek kullanımı hakkında istatistikleri yazdırır.\n"
|
||||
@@ -5689,11 +5689,11 @@ msgstr ""
|
||||
"CLEAR komutu, süre içinde eklenen tüm girdileri kaldırarak veritabanının temizlemenizi sağlar.\n"
|
||||
" \n"
|
||||
"Örneğin:\n"
|
||||
" %sCLEAR30m\n"
|
||||
" %sCLEAR30m\n"
|
||||
" Son 30 dakika içinde eklenen tüm girdiler kaldırılacaktır."
|
||||
|
||||
msgid "The email parameter is optional and will set the email address for your nick immediately. You may also wish to SETHIDE it after registering if it isn't the default setting already."
|
||||
msgstr "Bu email parametresi isteğe bağlıdır ve rumuzunuzun e-postasını hemen ayarlayacaktır. Zaten varsayılan ayar değilse, kayıttan sonra bunu SETHIDE yapmak da isteyebilirsiniz."
|
||||
msgid "The email parameter is optional and will set the email address for your nick immediately. You may also wish to SETHIDE it after registering if it isn't the default setting already."
|
||||
msgstr "Bu email parametresi isteğe bağlıdır ve rumuzunuzun e-postasını hemen ayarlayacaktır. Zaten varsayılan ayar değilse, kayıttan sonra bunu SETHIDE yapmak da isteyebilirsiniz."
|
||||
|
||||
#, c-format
|
||||
msgid ""
|
||||
@@ -5701,28 +5701,28 @@ msgid ""
|
||||
"\n"
|
||||
"Otherwise, command must be a command name, and method is one of the following logging methods:\n"
|
||||
"\n"
|
||||
" MESSAGE[status], NOTICE[status], MEMO\n"
|
||||
" MESSAGE[status], NOTICE[status], MEMO\n"
|
||||
"\n"
|
||||
"Which are used to message, notice, and memo the channel respectively. With MESSAGE or NOTICE you must have a service bot assigned to and joined to your channel. Status may be a channel status such as @ or +.\n"
|
||||
"\n"
|
||||
"To remove a logging method use the same syntax as you would to add it.\n"
|
||||
"\n"
|
||||
"Example:\n"
|
||||
" %s#anopechanserv/accessMESSAGE@\n"
|
||||
" %s#anopechanserv/accessMESSAGE@\n"
|
||||
" Would message any channel operators whenever someone used the ACCESS command on ChanServ on the channel."
|
||||
msgstr ""
|
||||
"%s komutu, kullanıcıların kanalları için günlük kaydı ayarlarını yapılandırmasına olanak tanır. Hiçbir parametre verilmemişse bu komut, bu kanal için geçerli olan günlük kaydı yöntemlerini listeler.\n"
|
||||
"\n"
|
||||
"Aksi takdirde, komut bir komut adı, ve yöntem aşağıdaki günlük kaydı yöntemlerinden biri olmalıdır:\n"
|
||||
"\n"
|
||||
" MESSAGE[status], NOTICE[status], MEMO\n"
|
||||
" MESSAGE[status], NOTICE[status], MEMO\n"
|
||||
"\n"
|
||||
"Bunlar sırasıyla kanala mesaj göndermek, bildirimde bulunmak ve not almak için kullanılır. MESSAGE veya NOTICE ile kanalınıza atanmış ve katılmış bir servis botunun olması gerekir. Durum @ veya + gibi bir kanal durumu olabilir.\n"
|
||||
"\n"
|
||||
"Bir yöntemi kaldırmak için, onu eklerken kullanıdığınız komut yapısının aynısını kullanın.\n"
|
||||
"\n"
|
||||
"Örnek:\n"
|
||||
" %s#anopechanserv/accessMESSAGE@\n"
|
||||
" %s#anopechanserv/accessMESSAGE@\n"
|
||||
" Birisi kanalda ChanServ'in ACCESS komutunu kullandığında herhangi bir kanal operatörüne mesaj gönderir."
|
||||
|
||||
#, c-format
|
||||
@@ -5903,8 +5903,8 @@ msgstr[0] "%zu memo (%s kanalında) var."
|
||||
msgstr[1] "%zu memo (%s kanalında) var."
|
||||
|
||||
#, c-format
|
||||
msgid "There is a new memo on channel %s. Type %s%s%zu to read it."
|
||||
msgstr "%s kanalında yeni bir memo var. Okumak için %s%s%zu yazın."
|
||||
msgid "There is a new memo on channel %s. Type %s%s%zu to read it."
|
||||
msgstr "%s kanalında yeni bir memo var. Okumak için %s%s%zu yazın."
|
||||
|
||||
#, c-format
|
||||
msgid "There is no bot assigned to %s anymore."
|
||||
@@ -6040,14 +6040,14 @@ msgid ""
|
||||
"This command searches the services logfiles for messages that match the given pattern. The day and limit argument may be used to specify how many days of logs to search and the number of replies to limit to. By default this command searches one week of logs, and limits replies to 50.\n"
|
||||
"\n"
|
||||
"For example:\n"
|
||||
" LOGSEARCH+21d+500lAnope\n"
|
||||
" LOGSEARCH+21d+500lAnope\n"
|
||||
" Searches the last 21 days worth of logs for messages\n"
|
||||
" containing Anope and lists the most recent 500 of them."
|
||||
msgstr ""
|
||||
"Bu komut, Servislerin günlük dosyalarında verilen şablonla eşleşen iletileri arar. Gün ve sınır bağımsız değişkeni, kaç günlük günlükte arama yapılacağını ve sınırlanacak yanıt sayısını belirtmek için kullanılabilir. Varsayılan olarak bu komut bir haftalık günlükleri arar ve yanıtları 50 ile sınırlandırır.\n"
|
||||
"\n"
|
||||
"Örneğin:\n"
|
||||
" LOGSEARCH+21d+500lAnope\n"
|
||||
" LOGSEARCH+21d+500lAnope\n"
|
||||
" Anope içeren iletiler için son 21 günlük günlükleri\n"
|
||||
" arar ve bunlardan en yeni 500'ünü listeler."
|
||||
|
||||
@@ -6079,8 +6079,8 @@ msgid "This nickname is suspended."
|
||||
msgstr "Bu rumuz askıya alındı."
|
||||
|
||||
#, c-format
|
||||
msgid "This nickname is registered and has protection enabled. If it belongs to you, type %spassword to identify to your account."
|
||||
msgstr "Bu rumuz kayıtlı ve korumalıdır. Eğer sizin rumuzunuzsa, %sşifreniz yazın. Aksi halde, kendinize başka bir rumuz seçin."
|
||||
msgid "This nickname is registered and has protection enabled. If it belongs to you, type %spassword to identify to your account."
|
||||
msgstr "Bu rumuz kayıtlı ve korumalıdır. Eğer sizin rumuzunuzsa, %sşifreniz yazın. Aksi halde, kendinize başka bir rumuz seçin."
|
||||
|
||||
msgid "This option makes a channel unassignable. If a bot is already assigned to the channel, it is unassigned automatically when you enable it."
|
||||
msgstr "Bu seçenek bir kanalı atanamaz hale getirir. Kanala zaten bir bot atanmışsa, etkinleştirdiğinizde otomatik olarak ataması kaldırılır."
|
||||
@@ -6190,34 +6190,34 @@ msgid "Type %s for more information."
|
||||
msgstr "Daha fazla bilgi için %s yazın."
|
||||
|
||||
#, c-format
|
||||
msgid "Type %scommand for help on any of the above commands."
|
||||
msgid "Type %scommand for help on any of the above commands."
|
||||
msgstr "Yukarıdaki komutlardan herhangi biri hakkında yardım almak için%s HELP komut yazın."
|
||||
|
||||
#, c-format
|
||||
msgid "Type %soption for more information on a particular option."
|
||||
msgstr "Özel bir seçenek hakkında daha fazla bilgi için %sseçenek yazın."
|
||||
msgid "Type %soption for more information on a particular option."
|
||||
msgstr "Özel bir seçenek hakkında daha fazla bilgi için %sseçenek yazın."
|
||||
|
||||
#, c-format
|
||||
msgid "Type %soption for more information on a specific option."
|
||||
msgstr "Belirli bir seçenek hakkında daha fazla bilgi için %sseçenek yazın."
|
||||
msgid "Type %soption for more information on a specific option."
|
||||
msgstr "Belirli bir seçenek hakkında daha fazla bilgi için %sseçenek yazın."
|
||||
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Type %soption for more information on a specific option.\n"
|
||||
"Type %soption for more information on a specific option.\n"
|
||||
"\n"
|
||||
"Note: access to this command is controlled by the level SET."
|
||||
msgstr ""
|
||||
"Belirli bir seçenek hakkında daha fazla bilgi için %sseçenek yazın.\n"
|
||||
"Belirli bir seçenek hakkında daha fazla bilgi için %sseçenek yazın.\n"
|
||||
"\n"
|
||||
"Not: Bu komuta erişim SET seviyesi tarafından kontrol edilir."
|
||||
|
||||
#, c-format
|
||||
msgid "Type %soption for more information on a specific option. The options will be set on the given nickname."
|
||||
msgstr "Belirli bir seçenek hakkında daha fazla bilgi için %sseçenek yazın. Seçenekler belirtilen rumuz'a göre ayarlanacaktır."
|
||||
msgid "Type %soption for more information on a specific option. The options will be set on the given nickname."
|
||||
msgstr "Belirli bir seçenek hakkında daha fazla bilgi için %sseçenek yazın. Seçenekler belirtilen rumuz'a göre ayarlanacaktır."
|
||||
|
||||
#, c-format
|
||||
msgid "Type %sregion to list timezones for a region."
|
||||
msgstr "Bir bölgenin saat dilimlerini listelemek için %sregion yazın."
|
||||
msgid "Type %sregion to list timezones for a region."
|
||||
msgstr "Bir bölgenin saat dilimlerini listelemek için %sregion yazın."
|
||||
|
||||
msgid "Un-Load a module"
|
||||
msgstr "Bir modülün yüklemesini kaldır"
|
||||
@@ -6321,8 +6321,8 @@ msgid "Uplink server: %s"
|
||||
msgstr "Bağlanan sunucu: %s"
|
||||
|
||||
#, c-format
|
||||
msgid "Use the %sALL command to list all commands and their descriptions."
|
||||
msgstr "Tüm komutları ve açıklamalarını listelemek için %sALL komutunu kullanın."
|
||||
msgid "Use the %sALL command to list all commands and their descriptions."
|
||||
msgstr "Tüm komutları ve açıklamalarını listelemek için %sALL komutunu kullanın."
|
||||
|
||||
msgid "Used on"
|
||||
msgstr "Kull. yerler"
|
||||
@@ -6651,8 +6651,8 @@ msgstr[0] "%d yeni memonuz var."
|
||||
msgstr[1] "%d yeni memonuz var."
|
||||
|
||||
#, c-format
|
||||
msgid "You have a new memo from %s. Type %s%zu to read it."
|
||||
msgstr "%s size yeni bir memo gönderdi. Okumak için %s%zu yazın."
|
||||
msgid "You have a new memo from %s. Type %s%zu to read it."
|
||||
msgstr "%s size yeni bir memo gönderdi. Okumak için %s%zu yazın."
|
||||
|
||||
#, c-format
|
||||
msgid "You have been invited to %s by %s."
|
||||
@@ -6757,8 +6757,8 @@ msgid "You must have the %s(ME) privilege on the channel to use this command."
|
||||
msgstr "Bu komutu kullanmak için kanalda %s(ME) ayrıcalığına sahip olmanız gerekir."
|
||||
|
||||
#, c-format
|
||||
msgid "You must now supply an email address for your nick. This email address will allow you to recover your account in case you forget your password. Type %semail in order to set your email address."
|
||||
msgstr "Şimdi rumuzunuz için bir e-posta girmelisiniz. Bu e-posta, unutmanız durumunda şifrenizi geri almanıza olanak tanır. E-postanızı ayarlamak için %se-postanız yazın."
|
||||
msgid "You must now supply an email address for your nick. This email address will allow you to recover your account in case you forget your password. Type %semail in order to set your email address."
|
||||
msgstr "Şimdi rumuzunuz için bir e-posta girmelisiniz. Bu e-posta, unutmanız durumunda şifrenizi geri almanıza olanak tanır. E-postanızı ayarlamak için %se-postanız yazın."
|
||||
|
||||
#, c-format
|
||||
msgid "You must wait %s before registering your nick."
|
||||
|
||||
+5
-3
@@ -15,11 +15,13 @@ fi
|
||||
find ../ \
|
||||
! -path '../docs/*' \
|
||||
-a ! -path '../modules/third/*' \
|
||||
-a ! -path '../run/*' \
|
||||
-a ! -path '../vendor/*' \
|
||||
-a \( -name '*.cpp' \
|
||||
-o -name '*.h' \
|
||||
-o -name '*.conf' \
|
||||
\) \
|
||||
-exec \
|
||||
-print0 | sort -z | xargs -0 -I {} \
|
||||
xgettext \
|
||||
--language=C++ \
|
||||
--sort-output \
|
||||
@@ -30,13 +32,13 @@ find ../ \
|
||||
--keyword \
|
||||
--keyword=_ \
|
||||
--keyword=N_:1,2 \
|
||||
{} +
|
||||
{}
|
||||
|
||||
for f in *.po
|
||||
do
|
||||
echo "Merging $f"
|
||||
msgmerge \
|
||||
--no-location \
|
||||
--add-location=file \
|
||||
--no-wrap \
|
||||
--sort-output \
|
||||
--update \
|
||||
|
||||
+19
-16
@@ -4,31 +4,34 @@ if(WIN32)
|
||||
endif()
|
||||
|
||||
# enable extra modules if conan is used
|
||||
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/../conanbuildinfo.cmake")
|
||||
function(enable_extra NAME PACKAGE)
|
||||
if(DEFINED "CONAN_${PACKAGE}_ROOT")
|
||||
message("Enabling the ${NAME} module")
|
||||
# copy the modules out of extra so it gets picked up by build_modules
|
||||
file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/extra/${NAME}.cpp" DESTINATION "${CMAKE_CURRENT_SOURCE_DIR}")
|
||||
else()
|
||||
message("Unable to enable the ${NAME} module (missing library)")
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
if(WIN32 AND DEFINED CMAKE_TOOLCHAIN_FILE)
|
||||
function(copy_extra NAME)
|
||||
# copy the modules out of extra so it gets picked up by build_modules
|
||||
message("Enabling the ${NAME} module")
|
||||
file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/extra/${NAME}.cpp" DESTINATION "${CMAKE_CURRENT_SOURCE_DIR}")
|
||||
endfunction()
|
||||
|
||||
enable_extra("enc_argon2" "ARGON2")
|
||||
enable_extra("mysql" "LIBMYSQLCLIENT")
|
||||
function(enable_extra NAME PACKAGE)
|
||||
find_package(${PACKAGE})
|
||||
if(${PACKAGE}_FOUND)
|
||||
copy_extra(${NAME})
|
||||
else()
|
||||
message("Unable to enable the ${NAME} module (missing ${PACKAGE} library)")
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
enable_extra("enc_argon2" "argon2")
|
||||
enable_extra("mysql" "libmysqlclient")
|
||||
enable_extra("regex_pcre2" "PCRE2")
|
||||
enable_extra("sqlite" "SQLITE3")
|
||||
enable_extra("ssl_openssl" "OPENSSL")
|
||||
enable_extra("regex_posix" "PCRE2")
|
||||
enable_extra("regex_tre" "tre")
|
||||
enable_extra("sqlite" "SQLite3")
|
||||
enable_extra("ssl_openssl" "OpenSSL")
|
||||
# this uses Wldap so should always be available
|
||||
copy_extra("ldap")
|
||||
|
||||
# Package extra dlls
|
||||
file(GLOB EXTRA_DLLS "${Anope_SOURCE_DIR}/extradll/bin/*.dll" "${Anope_SOURCE_DIR}/extradll/lib/*.dll")
|
||||
file(GLOB EXTRA_DLLS "${PROJECT_BINARY_DIR}/extradll/*.dll")
|
||||
install(FILES ${EXTRA_DLLS} DESTINATION ${BIN_DIR})
|
||||
endif()
|
||||
|
||||
|
||||
@@ -164,9 +164,9 @@ public:
|
||||
"It has been created for users that can't host or "
|
||||
"configure a bot, or for use on networks that don't "
|
||||
"allow user bots. Available commands are listed "
|
||||
"below; to use them, type \002%s\032\037command\037\002. For "
|
||||
"below; to use them, type \002%s\033\037command\037\002. For "
|
||||
"more information on a specific command, type "
|
||||
"\002%s\032\037command\037\002."
|
||||
"\002%s\033\037command\037\002."
|
||||
),
|
||||
BotServ->nick.c_str(),
|
||||
BotServ->GetQueryCommand().c_str(),
|
||||
|
||||
@@ -84,6 +84,13 @@ public:
|
||||
"can then configure the bot for the channel so it fits "
|
||||
"your needs."
|
||||
));
|
||||
|
||||
ExampleWrapper()
|
||||
.AddEntry("#opers OperServ", _(
|
||||
"Assigns the \037OperServ\037 bot to \037#opers\037."
|
||||
))
|
||||
.SendTo(source);
|
||||
|
||||
return true;
|
||||
}
|
||||
};
|
||||
@@ -150,6 +157,13 @@ public:
|
||||
"be able to reassign a bot later without having to reconfigure "
|
||||
"it entirely."
|
||||
));
|
||||
|
||||
ExampleWrapper()
|
||||
.AddEntry("#opers", _(
|
||||
"Unassigns a previously assigned bot from \037#opers\037."
|
||||
))
|
||||
.SendTo(source);
|
||||
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -147,7 +147,7 @@ struct BadWordsImpl final
|
||||
|
||||
BadWordsImpl::~BadWordsImpl()
|
||||
{
|
||||
for (list::iterator it = badwords->begin(); it != badwords->end();)
|
||||
for (auto it = badwords->begin(); it != badwords->end();)
|
||||
{
|
||||
auto *bw = *it;
|
||||
++it;
|
||||
@@ -160,10 +160,10 @@ BadWordImpl::~BadWordImpl()
|
||||
ChannelInfo *ci = ChannelInfo::Find(chan);
|
||||
if (ci)
|
||||
{
|
||||
BadWordsImpl *badwords = ci->GetExt<BadWordsImpl>(BOTSERV_BAD_WORDS_EXT);
|
||||
auto *badwords = ci->GetExt<BadWordsImpl>(BOTSERV_BAD_WORDS_EXT);
|
||||
if (badwords)
|
||||
{
|
||||
BadWordsImpl::list::iterator it = std::find(badwords->badwords->begin(), badwords->badwords->end(), this);
|
||||
auto it = std::find(badwords->badwords->begin(), badwords->badwords->end(), this);
|
||||
if (it != badwords->badwords->end())
|
||||
badwords->badwords->erase(it);
|
||||
}
|
||||
@@ -172,28 +172,20 @@ BadWordImpl::~BadWordImpl()
|
||||
|
||||
Serializable *BadWordTypeImpl::Unserialize(Serializable *obj, Serialize::Data &data) const
|
||||
{
|
||||
Anope::string sci, sword;
|
||||
|
||||
data["ci"] >> sci;
|
||||
data["word"] >> sword;
|
||||
|
||||
ChannelInfo *ci = ChannelInfo::Find(sci);
|
||||
auto *ci = ChannelInfo::Find(data.Load("ci"));
|
||||
if (!ci)
|
||||
return NULL;
|
||||
|
||||
Anope::string n;
|
||||
data["type"] >> n;
|
||||
|
||||
BadWordImpl *bw;
|
||||
if (obj)
|
||||
bw = anope_dynamic_static_cast<BadWordImpl *>(obj);
|
||||
else
|
||||
bw = new BadWordImpl();
|
||||
bw->chan = sci;
|
||||
bw->word = sword;
|
||||
bw->type = StringToType(n);
|
||||
bw->chan = ci->name;
|
||||
bw->word = data.Load("word");
|
||||
bw->type = StringToType(data.Load("type"));
|
||||
|
||||
BadWordsImpl *bws = ci->Require<BadWordsImpl>(BOTSERV_BAD_WORDS_EXT);
|
||||
auto *bws = ci->Require<BadWordsImpl>(BOTSERV_BAD_WORDS_EXT);
|
||||
if (!obj)
|
||||
bws->badwords->push_back(bw);
|
||||
|
||||
@@ -337,7 +329,7 @@ private:
|
||||
realword = word.substr(0, pos);
|
||||
}
|
||||
|
||||
unsigned badwordsmax = Config->GetModule(this->module).Get<unsigned>("badwordsmax");
|
||||
auto badwordsmax = Config->GetModule(this->module).Get<unsigned>("badwordsmax");
|
||||
if (badwords->GetBadWordCount() >= badwordsmax)
|
||||
{
|
||||
source.Reply(_("You can only have %d bad words entries on a channel."), badwordsmax);
|
||||
@@ -482,7 +474,7 @@ public:
|
||||
"Maintains the \002bad words list\002 for a channel. The bad "
|
||||
"words list determines which words are to be kicked "
|
||||
"when the bad words kicker is enabled. For more information, "
|
||||
"type \002%s\032KICK\032%s\002."
|
||||
"type \002%s\033KICK\033%s\002."
|
||||
"\n\n"
|
||||
"The \002ADD\002 command adds the given word to the "
|
||||
"bad words list. If SINGLE is specified, a kick will be "
|
||||
@@ -496,21 +488,58 @@ public:
|
||||
"\n\n"
|
||||
"The \002DEL\002 command removes the given word from the "
|
||||
"bad words list. If a list of entry numbers is given, those "
|
||||
"entries are deleted. (See the example for LIST below.)"
|
||||
"entries are deleted."
|
||||
"\n\n"
|
||||
"The \002LIST\002 command displays the bad words list. If "
|
||||
"a wildcard mask is given, only those entries matching the "
|
||||
"mask are displayed. If a list of entry numbers is given, "
|
||||
"only those entries are shown; for example:\n"
|
||||
" \002#channel\032LIST\0322-5,7-9\002\n"
|
||||
" Lists bad words entries numbered 2 through 5 and\n"
|
||||
" 7 through 9."
|
||||
"only those entries are shown."
|
||||
"\n\n"
|
||||
"The \002CLEAR\002 command clears all entries from the "
|
||||
"bad words list."
|
||||
),
|
||||
source.service->GetQueryCommand("generic/help").c_str(),
|
||||
source.command.nobreak().c_str());
|
||||
|
||||
ExampleWrapper()
|
||||
.AddEntry("#channel ADD smeg", _(
|
||||
"Add \035smeg\035 to the bad word list of \035#channel\035. If a user says this "
|
||||
"word anywhere in a message they will be kicked."
|
||||
))
|
||||
.AddEntry("#channel ADD smeg SINGLE", _(
|
||||
"Add \035smeg\035 to the bad word list of \035#channel\035. If a user says only "
|
||||
"this word in a message they will be kicked."
|
||||
))
|
||||
.AddEntry("#channel ADD smeg START", _(
|
||||
"Add \035smeg\035 to the bad word list of \035#channel\035. If a user says this "
|
||||
"word at the start of a message they will be kicked."
|
||||
))
|
||||
.AddEntry("#channel ADD smeg END", _(
|
||||
"Add \035smeg\035 to the bad word list of \035#channel\035. If a user says this "
|
||||
"word at the start of a message they will be kicked."
|
||||
))
|
||||
.AddEntry("#channel CLEAR", _(
|
||||
"Clears all bad word entries set on \035#channel\035."
|
||||
))
|
||||
.AddEntry("#channel DEL 2-5,7-9", _(
|
||||
"Deletes bad word entries set on \035#channel\035 numbered 2 through 5 and 7 "
|
||||
"through 9."
|
||||
))
|
||||
.AddEntry("#channel DEL heck", _(
|
||||
"Deletes \035heck\035 from the bad word list of \035#channel\035."
|
||||
))
|
||||
.AddEntry("#channel LIST", _(
|
||||
"Lists all bad word entries set on \035#channel\035."
|
||||
))
|
||||
.AddEntry("#channel LIST 2-5,7-9", _(
|
||||
"Lists bad word entries set on \035#channel\035 numbered 2 through 5 and 7 through "
|
||||
"9."
|
||||
))
|
||||
.AddEntry("#channel LIST *frack*", _(
|
||||
"Lists bad word entries set on \035#channel\035 that match \035*frack*\035."
|
||||
))
|
||||
.SendTo(source);
|
||||
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -350,15 +350,14 @@ public:
|
||||
"bots that users will be able to use on their own "
|
||||
"channels."
|
||||
"\n\n"
|
||||
"\002%s\032ADD\002 adds a bot with the given nickname, username, "
|
||||
"hostname and realname. Since no integrity checks are done "
|
||||
"for these settings, be really careful."
|
||||
"\002%s\033ADD\002 adds a bot with the given nickname, username, "
|
||||
"hostname and realname."
|
||||
"\n\n"
|
||||
"\002%s\032CHANGE\002 allows you to change the nickname, username, hostname "
|
||||
"\002%s\033CHANGE\002 allows you to change the nickname, username, hostname "
|
||||
"or realname of a bot without deleting it (and "
|
||||
"all the data associated with it)."
|
||||
"\n\n"
|
||||
"\002%s\032DEL\002 removes the given bot from the bot list."
|
||||
"\002%s\033DEL\002 removes the given bot from the bot list."
|
||||
"\n\n"
|
||||
"\002Note\002: You cannot create a bot with a nick that is "
|
||||
"currently registered. If an unregistered user is currently "
|
||||
@@ -367,6 +366,25 @@ public:
|
||||
source.command.nobreak().c_str(),
|
||||
source.command.nobreak().c_str(),
|
||||
source.command.nobreak().c_str());
|
||||
|
||||
ExampleWrapper()
|
||||
.AddEntry("ADD Chii chobit persocom.test Chii Motosuwa", _(
|
||||
"Adds a new bot with the nickname \035Chii\035, username \035chobit\035, hostname "
|
||||
"\035persocom.test\035, and realname \035Chii Motosuwa\035."
|
||||
))
|
||||
.AddEntry("CHANGE Elda Chii", _(
|
||||
"Renames an existing bot called \035Elda\035 to \035Chii\035."
|
||||
))
|
||||
.AddEntry("CHANGE Chii Mahoro saint vesper.test Mahoro Andou", _(
|
||||
"Changes all of the information of the bot called \035Chii\035. The new nickname "
|
||||
"will be \035Mahoro\035, the new username will be \035saint\035, the new hostname "
|
||||
"will be \035vesper.test\035, and the new realname will be \035Mahoro Andou\035."
|
||||
))
|
||||
.AddEntry("DEL Mahoro", _(
|
||||
"Deletes a bot called \035Mahoro\035."
|
||||
))
|
||||
.SendTo(source);
|
||||
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -71,6 +71,13 @@ public:
|
||||
this->SendSyntax(source);
|
||||
source.Reply(" ");
|
||||
source.Reply(_("Makes the bot say the specified text on the specified channel."));
|
||||
|
||||
ExampleWrapper()
|
||||
.AddEntry(_("#chat hello all"), _(
|
||||
"Sends a message to \035#chat\035 saying \035hello all\035."
|
||||
))
|
||||
.SendTo(source);
|
||||
|
||||
return true;
|
||||
}
|
||||
};
|
||||
@@ -126,9 +133,16 @@ public:
|
||||
this->SendSyntax(source);
|
||||
source.Reply(" ");
|
||||
source.Reply(_(
|
||||
"Makes the bot do the equivalent of a \"/me\" command "
|
||||
"on the specified channel using the specified text."
|
||||
"Makes the bot do the equivalent of a \"/me\" command on the specified channel using "
|
||||
"the specified text."
|
||||
));
|
||||
|
||||
ExampleWrapper()
|
||||
.AddEntry(_("#chat is eating pizza"), _(
|
||||
"Sends an action message to \035#chat\035 saying \035is eating pizza\035."
|
||||
))
|
||||
.SendTo(source);
|
||||
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -58,7 +58,7 @@ public:
|
||||
info[_("Real name")] = bi->realname;
|
||||
info[_("Created")] = Anope::strftime(bi->created, source.GetAccount());
|
||||
info[_("Options")] = bi->oper_only ? _("Private") : _("None");
|
||||
info[_("Used on")] = Anope::Format(Language::Translate(source.nc, bi->GetChannelCount(), N_("%u channel", "%u channels")), bi->GetChannelCount());
|
||||
info[_("Used on")] = Anope::Format(source.Translate(bi->GetChannelCount(), N_("%u channel", "%u channels")), bi->GetChannelCount());
|
||||
|
||||
FOREACH_MOD(OnBotInfo, (source, bi, ci, info));
|
||||
info.SendTo(source);
|
||||
@@ -83,8 +83,8 @@ public:
|
||||
source.Reply(CHAN_INFO_HEADER, ci->name.c_str());
|
||||
info[_("Bot nick")] = ci->bi ? ci->bi->nick : _("not assigned yet");
|
||||
|
||||
Anope::string enabled = Language::Translate(source.nc, _("Enabled"));
|
||||
Anope::string disabled = Language::Translate(source.nc, _("Disabled"));
|
||||
Anope::string enabled = source.Translate(_("Enabled"));
|
||||
Anope::string disabled = source.Translate(_("Disabled"));
|
||||
|
||||
FOREACH_MOD(OnBotInfo, (source, bi, ci, info));
|
||||
info.SendTo(source);
|
||||
@@ -104,12 +104,23 @@ public:
|
||||
"you'll get information about a bot, such as creation "
|
||||
"time or number of channels it is on."
|
||||
), source.service->nick.c_str());
|
||||
|
||||
ExampleWrapper()
|
||||
.AddEntry("#example", _(
|
||||
"Shows information about the bot assigned to \035#example\035 and its kickers and "
|
||||
"options."
|
||||
))
|
||||
.AddEntry("ChanServ", _(
|
||||
"Shows information about the \035ChanServ\035 bot."
|
||||
))
|
||||
.SendTo(source);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
Anope::string GetDesc(CommandSource &source) const override
|
||||
{
|
||||
return Anope::Format(Language::Translate(source.GetAccount(), _("Allows you to see %s information about a channel or a bot")), source.service->nick.c_str());
|
||||
return Anope::Format(source.Translate(_("Allows you to see %s information about a channel or a bot")), source.service->nick.c_str());
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
+32
-30
@@ -51,7 +51,7 @@ struct KickerDataImpl final
|
||||
if (s->GetSerializableType()->GetName() != CHANNELINFO_TYPE)
|
||||
return;
|
||||
|
||||
const ChannelInfo *ci = anope_dynamic_static_cast<const ChannelInfo *>(e);
|
||||
const auto *ci = anope_dynamic_static_cast<const ChannelInfo *>(e);
|
||||
auto *kd = this->Get(ci);
|
||||
if (kd == NULL)
|
||||
return;
|
||||
@@ -85,33 +85,35 @@ struct KickerDataImpl final
|
||||
if (s->GetSerializableType()->GetName() != CHANNELINFO_TYPE)
|
||||
return;
|
||||
|
||||
ChannelInfo *ci = anope_dynamic_static_cast<ChannelInfo *>(e);
|
||||
auto *ci = anope_dynamic_static_cast<ChannelInfo *>(e);
|
||||
auto *kd = ci->Require<BotServ::KickerData>(BOTSERV_KICKER_DATA_EXT);
|
||||
|
||||
data["kickerdata:amsgs"] >> kd->amsgs;
|
||||
data["kickerdata:badwords"] >> kd->badwords;
|
||||
data["kickerdata:bolds"] >> kd->bolds;
|
||||
data["kickerdata:caps"] >> kd->caps;
|
||||
data["kickerdata:colors"] >> kd->colors;
|
||||
data["kickerdata:flood"] >> kd->flood;
|
||||
data["kickerdata:italics"] >> kd->italics;
|
||||
data["kickerdata:repeat"] >> kd->repeat;
|
||||
data["kickerdata:reverses"] >> kd->reverses;
|
||||
data["kickerdata:underlines"] >> kd->underlines;
|
||||
kd->amsgs = data.Load<bool>("kickerdata:amsgs");
|
||||
kd->badwords = data.Load<bool>("kickerdata:badwords");
|
||||
kd->bolds = data.Load<bool>("kickerdata:bolds");
|
||||
kd->caps = data.Load<bool>("kickerdata:caps");
|
||||
kd->colors = data.Load<bool>("kickerdata:colors");
|
||||
kd->flood = data.Load<bool>("kickerdata:flood");
|
||||
kd->italics = data.Load<bool>("kickerdata:italics");
|
||||
kd->repeat = data.Load<bool>("kickerdata:repeat");
|
||||
kd->reverses = data.Load<bool>("kickerdata:reverses");
|
||||
kd->underlines = data.Load<bool>("kickerdata:underlines");
|
||||
|
||||
data["capsmin"] >> kd->capsmin;
|
||||
data["capspercent"] >> kd->capspercent;
|
||||
data["floodlines"] >> kd->floodlines;
|
||||
data["floodsecs"] >> kd->floodsecs;
|
||||
data["repeattimes"] >> kd->repeattimes;
|
||||
data["dontkickops"] >> kd->dontkickops;
|
||||
data["dontkickvoices"] >> kd->dontkickvoices;
|
||||
kd->capsmin = data.Load<int16_t>("capsmin");
|
||||
kd->capspercent = data.Load<int16_t>("capspercent");
|
||||
kd->floodlines = data.Load<int16_t>("floodlines");
|
||||
kd->floodsecs = data.Load<int16_t>("floodsecs");
|
||||
kd->repeattimes = data.Load<int16_t>("repeattimes");
|
||||
kd->dontkickops = data.Load<bool>("dontkickops");
|
||||
kd->dontkickvoices = data.Load<bool>("dontkickvoices");
|
||||
|
||||
Anope::string ttb, tok;
|
||||
data["ttb"] >> ttb;
|
||||
spacesepstream sep(ttb);
|
||||
for (int i = 0; sep.GetToken(tok) && i < BotServ::TTB_SIZE; ++i)
|
||||
spacesepstream sep(data.Load("ttb"));
|
||||
for (size_t i = 0; i < BotServ::TTB_SIZE; ++i)
|
||||
{
|
||||
Anope::string tok;
|
||||
if (!sep.GetToken(tok))
|
||||
break;
|
||||
|
||||
if (auto n = Anope::TryConvert<int16_t>(tok))
|
||||
kd->ttb[i] = n.value();
|
||||
}
|
||||
@@ -159,7 +161,7 @@ public:
|
||||
help.SendTo(source);
|
||||
|
||||
source.Reply(_(
|
||||
"Type \002%s\032\037option\037\002 for more information "
|
||||
"Type \002%s\033\037option\037\002 for more information "
|
||||
"on a specific option."
|
||||
"\n\n"
|
||||
"Note: access to this command is controlled by the "
|
||||
@@ -322,7 +324,7 @@ public:
|
||||
"on the channels."
|
||||
"\n\n"
|
||||
"You can define bad words for your channel using the "
|
||||
"\002BADWORDS\002 command. Type \002%s\032BADWORDS\002 for "
|
||||
"\002BADWORDS\002 command. Type \002%s\033BADWORDS\002 for "
|
||||
"more information."
|
||||
"\n\n"
|
||||
"\037ttb\037 is the number of times a user can be kicked "
|
||||
@@ -988,7 +990,7 @@ public:
|
||||
void purge()
|
||||
{
|
||||
time_t keepdata = Config->GetModule(me).Get<time_t>("keepdata");
|
||||
for (data_type::iterator it = data_map.begin(), it_end = data_map.end(); it != it_end;)
|
||||
for (auto it = data_map.begin(), it_end = data_map.end(); it != it_end;)
|
||||
{
|
||||
const Anope::string &user = it->first;
|
||||
Data &bd = it->second;
|
||||
@@ -1038,7 +1040,7 @@ public:
|
||||
|
||||
for (auto &[_, c] : ChannelList)
|
||||
{
|
||||
BanData *bd = c->GetExt<BanData>("bandata");
|
||||
auto *bd = c->GetExt<BanData>("bandata");
|
||||
if (bd != NULL)
|
||||
{
|
||||
bd->purge();
|
||||
@@ -1149,8 +1151,8 @@ public:
|
||||
if (!ci)
|
||||
return;
|
||||
|
||||
Anope::string enabled = Language::Translate(source.nc, _("Enabled"));
|
||||
Anope::string disabled = Language::Translate(source.nc, _("Disabled"));
|
||||
Anope::string enabled = source.Translate(_("Enabled"));
|
||||
Anope::string disabled = source.Translate(_("Disabled"));
|
||||
auto *kd = kickerdata.Get(ci);
|
||||
|
||||
if (kd && kd->badwords)
|
||||
@@ -1488,7 +1490,7 @@ public:
|
||||
|
||||
if (ud->lastline.equals_ci(realbuf) && !ud->lasttarget.empty() && !ud->lasttarget.equals_ci(ci->name))
|
||||
{
|
||||
for (User::ChanUserList::iterator it = u->chans.begin(); it != u->chans.end();)
|
||||
for (auto it = u->chans.begin(); it != u->chans.end();)
|
||||
{
|
||||
Channel *chan = it->second->chan;
|
||||
++it;
|
||||
|
||||
@@ -67,7 +67,7 @@ public:
|
||||
}
|
||||
help.SendTo(source);
|
||||
|
||||
source.Reply(_("Type \002%s\032\037option\037\002 for more information on a particular option."),
|
||||
source.Reply(_("Type \002%s\033\037option\037\002 for more information on a particular option."),
|
||||
source.service->GetQueryCommand("generic/help", this_name).c_str());
|
||||
|
||||
return true;
|
||||
@@ -166,6 +166,13 @@ public:
|
||||
"be removed after the given time. Set to 0 to disable bans from "
|
||||
"automatically expiring."
|
||||
));
|
||||
|
||||
ExampleWrapper()
|
||||
.AddEntry("#wibble 15m", _(
|
||||
"Sets bot bans on \035#wibble\035 to expire after \03515 minutes\035."
|
||||
))
|
||||
.SendTo(source);
|
||||
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -263,8 +263,8 @@ public:
|
||||
"malicious users from \"taking over\" channels by limiting "
|
||||
"who is allowed channel operator privileges. Available "
|
||||
"commands are listed below; to use them, type "
|
||||
"\002%s\032\037command\037\002. For more information on a "
|
||||
"specific command, type \002%s\032\037command\037\002."
|
||||
"\002%s\033\037command\037\002. For more information on a "
|
||||
"specific command, type \002%s\033\037command\037\002."
|
||||
),
|
||||
ChanServ->nick.c_str(),
|
||||
ChanServ->nick.c_str(),
|
||||
@@ -357,7 +357,7 @@ public:
|
||||
if (!chanserv_expire || Anope::NoExpire || Anope::ReadOnly)
|
||||
return;
|
||||
|
||||
for (registered_channel_map::const_iterator it = RegisteredChannelList->begin(), it_end = RegisteredChannelList->end(); it != it_end; )
|
||||
for (auto it = RegisteredChannelList->begin(), it_end = RegisteredChannelList->end(); it != it_end; )
|
||||
{
|
||||
ChannelInfo *ci = it->second;
|
||||
++it;
|
||||
@@ -369,7 +369,7 @@ public:
|
||||
if (ci->c)
|
||||
{
|
||||
time_t last_used = ci->last_used;
|
||||
for (Channel::ChanUserList::const_iterator cit = ci->c->users.begin(), cit_end = ci->c->users.end(); cit != cit_end && last_used == ci->last_used; ++cit)
|
||||
for (auto cit = ci->c->users.begin(), cit_end = ci->c->users.end(); cit != cit_end && last_used == ci->last_used; ++cit)
|
||||
ci->AccessFor(cit->second->user);
|
||||
expire = last_used == ci->last_used;
|
||||
}
|
||||
@@ -397,11 +397,10 @@ public:
|
||||
return EVENT_CONTINUE;
|
||||
}
|
||||
|
||||
void OnUplinkSync(Server* s) override
|
||||
void OnUplinkSync(Server *s) override
|
||||
{
|
||||
// We need to do this when the uplink is synced as we may not know if
|
||||
// the mode exists before then on some IRCds (e.g. InspIRCd).
|
||||
|
||||
if (!persist)
|
||||
return;
|
||||
|
||||
@@ -464,7 +463,7 @@ public:
|
||||
{
|
||||
auto *memb = c->FindUser(setter.GetUser());
|
||||
ChannelMode *cm = ModeManager::FindChannelModeByName("OP");
|
||||
if (memb && cm && !memb->status.HasMode(cm->mchar))
|
||||
if (memb && cm && !memb->status.HasMode(cm))
|
||||
{
|
||||
/* Our -o and their mode change crossing, bounce their mode */
|
||||
c->RemoveMode(c->ci->WhoSends(), mode, data.value);
|
||||
|
||||
@@ -23,6 +23,17 @@ static inline void reset_levels(ChannelInfo *ci)
|
||||
ci->SetLevel(priv, level);
|
||||
}
|
||||
|
||||
static Anope::string LevelToString(CommandSource &source, int16_t level)
|
||||
{
|
||||
if (level == ACCESS_INVALID)
|
||||
return source.Translate(_("(disabled)"));
|
||||
|
||||
if (level == ACCESS_FOUNDER)
|
||||
return source.Translate(_("(founder only)"));
|
||||
|
||||
return Anope::ToString(level);
|
||||
}
|
||||
|
||||
class AccessChanAccess final
|
||||
: public ChanAccess
|
||||
{
|
||||
@@ -276,7 +287,7 @@ private:
|
||||
ServiceReference<AccessProvider> provider("AccessProvider", "access/access");
|
||||
if (!provider)
|
||||
return;
|
||||
AccessChanAccess *access = anope_dynamic_static_cast<AccessChanAccess *>(provider->Create());
|
||||
auto *access = anope_dynamic_static_cast<AccessChanAccess *>(provider->Create());
|
||||
access->SetMask(mask, ci);
|
||||
access->creator = source.GetNick();
|
||||
access->level = level;
|
||||
@@ -285,7 +296,7 @@ private:
|
||||
access->description = description;
|
||||
ci->AddAccess(access);
|
||||
|
||||
FOREACH_MOD(OnAccessAdd, (ci, source, access));
|
||||
FOREACH_MOD(OnAccessAdd, (ci, source, access, false));
|
||||
|
||||
Log(override ? LOG_OVERRIDE : LOG_COMMAND, source, this, ci) << "to add " << mask << " with level " << level;
|
||||
if (p != NULL)
|
||||
@@ -376,7 +387,7 @@ private:
|
||||
|
||||
ci->EraseAccess(Number - 1);
|
||||
|
||||
FOREACH_MOD(OnAccessDel, (ci, source, access));
|
||||
FOREACH_MOD(OnAccessDel, (ci, source, access, false));
|
||||
delete access;
|
||||
}
|
||||
}
|
||||
@@ -402,7 +413,7 @@ private:
|
||||
Log(override ? LOG_OVERRIDE : LOG_COMMAND, source, this, ci) << "to delete " << access->Mask();
|
||||
|
||||
ci->EraseAccess(i - 1);
|
||||
FOREACH_MOD(OnAccessDel, (ci, source, access));
|
||||
FOREACH_MOD(OnAccessDel, (ci, source, access, false));
|
||||
delete access;
|
||||
}
|
||||
return;
|
||||
@@ -416,6 +427,8 @@ private:
|
||||
void ProcessList(CommandSource &source, ChannelInfo *ci, const std::vector<Anope::string> ¶ms, ListFormatter &list)
|
||||
{
|
||||
const Anope::string &nick = params.size() > 2 ? params[2] : "";
|
||||
const auto show_all = params.size() > 3 && params[3].equals_ci("ALL");
|
||||
unsigned foreign = 0;
|
||||
|
||||
if (!ci->GetAccessCount())
|
||||
source.Reply(_("%s access list is empty."), ci->name.c_str());
|
||||
@@ -426,9 +439,16 @@ private:
|
||||
{
|
||||
ListFormatter &list;
|
||||
ChannelInfo *ci;
|
||||
bool show_all;
|
||||
unsigned &foreign;
|
||||
|
||||
public:
|
||||
AccessListCallback(ListFormatter &_list, ChannelInfo *_ci, const Anope::string &numlist) : NumberList(numlist, false), list(_list), ci(_ci)
|
||||
AccessListCallback(ListFormatter &_list, ChannelInfo *_ci, const Anope::string &numlist, bool _show_all, unsigned &_foreign)
|
||||
: NumberList(numlist, false)
|
||||
, list(_list)
|
||||
, ci(_ci)
|
||||
, show_all(_show_all)
|
||||
, foreign(_foreign)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -438,11 +458,16 @@ private:
|
||||
return;
|
||||
|
||||
const ChanAccess *access = ci->GetAccess(number - 1);
|
||||
if (!show_all && access->provider->name != "access/access")
|
||||
{
|
||||
foreign++;
|
||||
return;
|
||||
}
|
||||
|
||||
AddEntry(this->list, ci, access, number);
|
||||
}
|
||||
}
|
||||
nl_list(list, ci, nick);
|
||||
nl_list(list, ci, nick, show_all, foreign);
|
||||
nl_list.Process();
|
||||
}
|
||||
else
|
||||
@@ -454,6 +479,12 @@ private:
|
||||
if (!nick.empty() && !Anope::Match(access->Mask(), nick))
|
||||
continue;
|
||||
|
||||
if (!show_all && access->provider->name != "access/access")
|
||||
{
|
||||
foreign++;
|
||||
continue;
|
||||
}
|
||||
|
||||
AddEntry(list, ci, access, i + 1);
|
||||
}
|
||||
}
|
||||
@@ -466,6 +497,14 @@ private:
|
||||
list.SendTo(source);
|
||||
source.Reply(_("End of access list"));
|
||||
}
|
||||
|
||||
if (foreign)
|
||||
{
|
||||
const auto full_command = Anope::Format("%s %s %s %s", source.command.c_str(),
|
||||
ci->name.c_str(), params[1].upper().c_str(), nick.empty() ? "*" : nick.c_str()).nobreak();
|
||||
|
||||
source.Reply(foreign, CHAN_ACCESS_FOREIGN, foreign, full_command.c_str());
|
||||
}
|
||||
}
|
||||
|
||||
void DoList(CommandSource &source, ChannelInfo *ci, const std::vector<Anope::string> ¶ms)
|
||||
@@ -531,8 +570,8 @@ public:
|
||||
this->SetDesc(_("Modify the list of privileged users"));
|
||||
this->SetSyntax(_("\037channel\037 ADD \037mask\037 \037level\037 [\037description\037]"));
|
||||
this->SetSyntax(_("\037channel\037 DEL {\037mask\037 | \037entry-num\037 | \037list\037}"));
|
||||
this->SetSyntax(_("\037channel\037 LIST [\037mask\037 | \037list\037]"));
|
||||
this->SetSyntax(_("\037channel\037 VIEW [\037mask\037 | \037list\037]"));
|
||||
this->SetSyntax(_("\037channel\037 LIST [\037mask\037 | \037list\037] [ALL]"));
|
||||
this->SetSyntax(_("\037channel\037 VIEW [\037mask\037 | \037list\037] [ALL]"));
|
||||
this->SetSyntax(_("\037channel\037 CLEAR"));
|
||||
}
|
||||
|
||||
@@ -605,7 +644,7 @@ public:
|
||||
"a user level of 0, and any unregistered user has a user level "
|
||||
"of -1."
|
||||
"\n\n"
|
||||
"The \002%s\032ADD\002 command adds the given mask to the "
|
||||
"The \002%s\033ADD\002 command adds the given mask to the "
|
||||
"access list with the given user level; if the mask is "
|
||||
"already present on the list, its access level is changed to "
|
||||
"the level specified in the command. The \037level\037 specified "
|
||||
@@ -626,41 +665,47 @@ public:
|
||||
|
||||
source.Reply(" ");
|
||||
source.Reply(_(
|
||||
"The \002%s\032DEL\002 command removes the given nick from the "
|
||||
"The \002%s\033DEL\002 command removes the given nick from the "
|
||||
"access list. If a list of entry numbers is given, those "
|
||||
"entries are deleted. (See the example for LIST below.) "
|
||||
"You may remove yourself from an access list, even if you "
|
||||
"do not have access to modify that list otherwise."
|
||||
"\n\n"
|
||||
"The \002%s\032LIST\002 command displays the access list. If "
|
||||
"The \002%s\033LIST\002 command displays the access list. If "
|
||||
"a wildcard mask is given, only those entries matching the "
|
||||
"mask are displayed. If a list of entry numbers is given, "
|
||||
"only those entries are shown; for example:\n"
|
||||
" \002%s\032#channel\032LIST\0322-5,7-9\002\n"
|
||||
" Lists access entries numbered 2 through 5 and\n"
|
||||
" 7 through 9."
|
||||
"only those entries are shown. The \002ALL\002 option allows "
|
||||
"listing entries from other access systems as well as levels."
|
||||
"\n\n"
|
||||
"The \002%s\032VIEW\002 command displays the access list similar "
|
||||
"to \002%s\032LIST\002 but shows the creator and last used time."
|
||||
"The \002%s\033VIEW\002 command displays the access list similar "
|
||||
"to \002%s\033LIST\002 but shows the creator and last used time."
|
||||
"\n\n"
|
||||
"The \002%s\032CLEAR\002 command clears all entries of the "
|
||||
"The \002%s\033CLEAR\002 command clears all entries of the "
|
||||
"access list."
|
||||
),
|
||||
source.command.nobreak().c_str(),
|
||||
source.command.nobreak().c_str(),
|
||||
source.command.nobreak().c_str(),
|
||||
source.command.nobreak().c_str(),
|
||||
source.command.nobreak().c_str(),
|
||||
source.command.nobreak().c_str());
|
||||
|
||||
ExampleWrapper examples;
|
||||
examples.AddEntry("#channel LIST 2-5,7-9", _(
|
||||
"Lists access entries on \037#channel\037 numbered 2 through 5 and 7 through 9."
|
||||
));
|
||||
examples.AddEntry("#channel LIST *nick*", _(
|
||||
"Lists access entries on \037#channel\037 that match \037*nick*\037."
|
||||
));
|
||||
examples.SendTo(source);
|
||||
|
||||
BotInfo *bi;
|
||||
Anope::string cmd;
|
||||
if (Command::FindCommandFromService("chanserv/levels", bi, cmd))
|
||||
if (Command::FindFromService("chanserv/levels", bi, cmd))
|
||||
{
|
||||
source.Reply(" ");
|
||||
source.Reply(_(
|
||||
"\002User access levels\002 can be seen by using the "
|
||||
"\002%s\002 command; type \002%s\032LEVELS\002 for "
|
||||
"\002%s\002 command; type \002%s\033LEVELS\002 for "
|
||||
"information."
|
||||
),
|
||||
cmd.c_str(),
|
||||
@@ -700,7 +745,7 @@ class CommandCSLevels final
|
||||
Privilege *p = PrivilegeManager::FindPrivilege(what);
|
||||
if (p == NULL)
|
||||
{
|
||||
source.Reply(_("Setting \002%s\002 not known. Type \002%s\032LEVELS\002 for a list of valid settings."),
|
||||
source.Reply(_("Setting \002%s\002 not known. Type \002%s\033LEVELS\002 for a list of valid settings."),
|
||||
what.c_str(), source.service->GetQueryCommand("generic/help").c_str());
|
||||
}
|
||||
else
|
||||
@@ -743,7 +788,7 @@ class CommandCSLevels final
|
||||
return;
|
||||
}
|
||||
|
||||
source.Reply(_("Setting \002%s\002 not known. Type \002%s\032LEVELS\002 for a list of valid settings."),
|
||||
source.Reply(_("Setting \002%s\002 not known. Type \002%s\033LEVELS\002 for a list of valid settings."),
|
||||
what.c_str(), source.service->GetQueryCommand("generic/help").c_str());
|
||||
}
|
||||
|
||||
@@ -763,14 +808,7 @@ class CommandCSLevels final
|
||||
|
||||
ListFormatter::ListEntry entry;
|
||||
entry["Name"] = p.name;
|
||||
|
||||
if (j == ACCESS_INVALID)
|
||||
entry["Level"] = Language::Translate(source.GetAccount(), _("(disabled)"));
|
||||
else if (j == ACCESS_FOUNDER)
|
||||
entry["Level"] = Language::Translate(source.GetAccount(), _("(founder only)"));
|
||||
else
|
||||
entry["Level"] = Anope::ToString(j);
|
||||
|
||||
entry["Level"] = LevelToString(source, j);
|
||||
list.AddEntry(entry);
|
||||
}
|
||||
|
||||
@@ -847,14 +885,15 @@ public:
|
||||
source.Reply(_("The following feature/function names are available:"));
|
||||
|
||||
ListFormatter list(source.GetAccount());
|
||||
list.AddColumn(_("Name")).AddColumn(_("Description"));
|
||||
list.SetFlexible(_("\002{name}\002: {description}"));
|
||||
list.AddColumn(_("Name")).AddColumn(_("Default")).AddColumn(_("Description"));
|
||||
list.SetFlexible(_("\002{name}\002: defaults to {default} ({description})"));
|
||||
|
||||
for (const auto &p : PrivilegeManager::GetPrivileges())
|
||||
{
|
||||
ListFormatter::ListEntry entry;
|
||||
entry["Name"] = p.name;
|
||||
entry["Description"] = Language::Translate(source.nc, p.desc.c_str());
|
||||
entry["Default"] = LevelToString(source, defaultLevels[p.name]);
|
||||
entry["Description"] = source.Translate(p.desc.c_str());
|
||||
list.AddEntry(entry);
|
||||
}
|
||||
|
||||
@@ -868,22 +907,22 @@ public:
|
||||
"The \002%s\002 command allows fine control over the meaning of "
|
||||
"the numeric access levels used for channels. With this "
|
||||
"command, you can define the access level required for most "
|
||||
"of %s's functions. (The \002SET\032FOUNDER\002 and this command "
|
||||
"of %s's functions. (The \002SET\033FOUNDER\002 and this command "
|
||||
"are always restricted to the channel founder)."
|
||||
"\n\n"
|
||||
"\002%s\032SET\002 allows the access level for a function or group of "
|
||||
"functions to be changed. \002%s\032DISABLE\002 (or \002DIS\002 for short) "
|
||||
"\002%s\033SET\002 allows the access level for a function or group of "
|
||||
"functions to be changed. \002%s\033DISABLE\002 (or \002DIS\002 for short) "
|
||||
"disables an automatic feature or disallows access to a "
|
||||
"function by anyone, INCLUDING the founder (although, the founder "
|
||||
"can always re-enable it). Use \002%s\032SET founder\002 to make a level "
|
||||
"can always re-enable it). Use \002%s\033SET founder\002 to make a level "
|
||||
"founder only."
|
||||
"\n\n"
|
||||
"\002%s\032LIST\002 shows the current levels for each function or "
|
||||
"group of functions. \002%s\032RESET\002 resets the levels to the "
|
||||
"\002%s\033LIST\002 shows the current levels for each function or "
|
||||
"group of functions. \002%s\033RESET\002 resets the levels to the "
|
||||
"default levels of a newly-created channel."
|
||||
"\n\n"
|
||||
"For a list of the features and functions whose levels can be "
|
||||
"set, see \002HELP\032%s\032DESC\002."
|
||||
"set, see \002HELP\033%s\033DESC\002."
|
||||
),
|
||||
source.service->nick.c_str(),
|
||||
source.command.nobreak().c_str(),
|
||||
@@ -955,7 +994,7 @@ public:
|
||||
/* Access accessprovider is the only accessprovider with the concept of negative access,
|
||||
* so check they don't have negative access
|
||||
*/
|
||||
const AccessChanAccess *aca = anope_dynamic_static_cast<const AccessChanAccess *>(highest);
|
||||
const auto *aca = anope_dynamic_static_cast<const AccessChanAccess *>(highest);
|
||||
|
||||
if (aca->level < 0)
|
||||
return EVENT_CONTINUE;
|
||||
|
||||
@@ -143,46 +143,34 @@ struct AutoKickType final
|
||||
|
||||
Serializable *Unserialize(Serializable *obj, Serialize::Data &data) const override
|
||||
{
|
||||
Anope::string sci, snc;
|
||||
uint64_t sncid = 0;
|
||||
|
||||
data["ci"] >> sci;
|
||||
data["nc"] >> snc; // Deprecated 2.0 field
|
||||
data["ncid"] >> sncid;
|
||||
|
||||
ChannelInfo *ci = ChannelInfo::Find(sci);
|
||||
auto *ci = ChannelInfo::Find(data.Load("ci"));
|
||||
if (!ci)
|
||||
return NULL;
|
||||
|
||||
const auto sncid = data.Load<uint64_t>("ncid");
|
||||
auto *nc = sncid ? NickCore::FindId(sncid) : NickCore::Find(data.Load("nc"));
|
||||
|
||||
const auto screator = data.Load("creator");
|
||||
const auto smask = data.Load("mask");
|
||||
const auto sreason = data.Load("reason");
|
||||
const auto saddtime = data.Load<time_t>("addtime");
|
||||
const auto slastused = data.Load<time_t>("last_used");
|
||||
|
||||
ChanServ::AutoKick *ak;
|
||||
auto *nc = sncid ? NickCore::FindId(sncid) : NickCore::Find(snc);
|
||||
if (obj)
|
||||
{
|
||||
ak = anope_dynamic_static_cast<ChanServ::AutoKick *>(obj);
|
||||
data["creator"] >> ak->creator;
|
||||
data["reason"] >> ak->reason;
|
||||
ak->creator = screator;
|
||||
ak->reason = sreason;
|
||||
ak->nc = nc;
|
||||
data["mask"] >> ak->mask;
|
||||
data["addtime"] >> ak->addtime;
|
||||
data["last_used"] >> ak->last_used;
|
||||
ak->mask = smask;
|
||||
ak->addtime = saddtime;
|
||||
ak->last_used = slastused;
|
||||
}
|
||||
else if (nc)
|
||||
ak = ChanServ::akick_service->AddAKick(ci, screator, nc, sreason, saddtime, slastused);
|
||||
else
|
||||
{
|
||||
time_t addtime, lastused;
|
||||
data["addtime"] >> addtime;
|
||||
data["last_used"] >> lastused;
|
||||
|
||||
Anope::string screator, sreason, smask;
|
||||
|
||||
data["creator"] >> screator;
|
||||
data["reason"] >> sreason;
|
||||
data["mask"] >> smask;
|
||||
|
||||
if (nc)
|
||||
ak = ChanServ::akick_service->AddAKick(ci, screator, nc, sreason, addtime, lastused);
|
||||
else
|
||||
ak = ChanServ::akick_service->AddAKick(ci, screator, smask, sreason, addtime, lastused);
|
||||
}
|
||||
ak = ChanServ::akick_service->AddAKick(ci, screator, smask, sreason, saddtime, slastused);
|
||||
|
||||
return ak;
|
||||
}
|
||||
@@ -201,7 +189,7 @@ class CommandCSAKick final
|
||||
return;
|
||||
}
|
||||
|
||||
for (Channel::ChanUserList::iterator it = c->users.begin(), it_end = c->users.end(); it != it_end; )
|
||||
for (auto it = c->users.begin(), it_end = c->users.end(); it != it_end; )
|
||||
{
|
||||
auto *memb = it->second;
|
||||
++it;
|
||||
@@ -223,7 +211,7 @@ class CommandCSAKick final
|
||||
const NickAlias *na = NickAlias::Find(mask);
|
||||
NickCore *nc = NULL;
|
||||
const ChanServ::AutoKick *akick;
|
||||
unsigned reasonmax = Config->GetModule("chanserv").Get<unsigned>("reasonmax", "200");
|
||||
auto reasonmax = Config->GetModule("chanserv").Get<unsigned>("reasonmax", "200");
|
||||
|
||||
if (reason.length() > reasonmax)
|
||||
reason = reason.substr(0, reasonmax);
|
||||
@@ -683,7 +671,7 @@ public:
|
||||
"%s will ban that user from the channel, then kick "
|
||||
"the user."
|
||||
"\n\n"
|
||||
"The \002%s\032ADD\002 command adds the given nick or mask "
|
||||
"The \002%s\033ADD\002 command adds the given nick or mask "
|
||||
"to the AutoKick list. If a \037reason\037 is given with "
|
||||
"the command, that reason will be used when the user is "
|
||||
"kicked; if not, the default reason is \"User has been "
|
||||
@@ -692,23 +680,23 @@ public:
|
||||
"will be added to the akick list instead of the mask. "
|
||||
"All users within that nickgroup will then be akicked. "
|
||||
"\n\n"
|
||||
"The \002%s\032DEL\002 command removes the given nick or mask "
|
||||
"The \002%s\033DEL\002 command removes the given nick or mask "
|
||||
"from the AutoKick list. It does not, however, remove any "
|
||||
"bans placed by an AutoKick; those must be removed "
|
||||
"manually."
|
||||
"\n\n"
|
||||
"The \002%s\032LIST\002 command displays the AutoKick list, or "
|
||||
"The \002%s\033LIST\002 command displays the AutoKick list, or "
|
||||
"optionally only those AutoKick entries which match the "
|
||||
"given mask."
|
||||
"\n\n"
|
||||
"The \002%s\032VIEW\002 command is a more verbose version of the "
|
||||
"\002%s\032LIST\002 command."
|
||||
"The \002%s\033VIEW\002 command is a more verbose version of the "
|
||||
"\002%s\033LIST\002 command."
|
||||
"\n\n"
|
||||
"The \002%s\032ENFORCE\002 command causes %s to enforce the "
|
||||
"The \002%s\033ENFORCE\002 command causes %s to enforce the "
|
||||
"current akick list by removing those users who match an "
|
||||
"akick mask."
|
||||
"\n\n"
|
||||
"The \002%s\032CLEAR\002 command clears all entries of the "
|
||||
"The \002%s\033CLEAR\002 command clears all entries of the "
|
||||
"akick list."
|
||||
),
|
||||
source.service->nick.c_str(),
|
||||
|
||||
@@ -128,7 +128,7 @@ public:
|
||||
reason += " " + params[3];
|
||||
}
|
||||
|
||||
unsigned reasonmax = Config->GetModule("chanserv").Get<unsigned>("reasonmax", "200");
|
||||
auto reasonmax = Config->GetModule("chanserv").Get<unsigned>("reasonmax", "200");
|
||||
if (reason.length() > reasonmax)
|
||||
reason = reason.substr(0, reasonmax);
|
||||
|
||||
@@ -211,7 +211,7 @@ public:
|
||||
}
|
||||
|
||||
int matched = 0, kicked = 0;
|
||||
for (Channel::ChanUserList::iterator it = c->users.begin(), it_end = c->users.end(); it != it_end;)
|
||||
for (auto it = c->users.begin(), it_end = c->users.end(); it != it_end;)
|
||||
{
|
||||
auto *memb = it->second;
|
||||
++it;
|
||||
|
||||
@@ -28,7 +28,7 @@ class CommandCSClone final
|
||||
static void CopyAccess(CommandSource &source, ChannelInfo *ci, ChannelInfo *target_ci)
|
||||
{
|
||||
std::set<Anope::string> masks;
|
||||
unsigned access_max = Config->GetModule("chanserv").Get<unsigned>("accessmax", "1000");
|
||||
auto access_max = Config->GetModule("chanserv").Get<unsigned>("accessmax", "1000");
|
||||
unsigned count = 0;
|
||||
|
||||
for (unsigned i = 0; i < target_ci->GetAccessCount(); ++i)
|
||||
|
||||
@@ -64,7 +64,7 @@ private:
|
||||
for (auto *user : users)
|
||||
{
|
||||
Anope::string mask = ci->GetIdealBan(user);
|
||||
Anope::string reason = Language::Translate(user, _("RESTRICTED enforced by ")) + source.GetNick();
|
||||
Anope::string reason = Anope::Format(Language::Translate(user, _("RESTRICTED enforced by %s")), source.GetNick().c_str());
|
||||
ci->c->SetMode(NULL, "BAN", mask);
|
||||
ci->c->Kick(NULL, user, reason);
|
||||
}
|
||||
@@ -92,7 +92,7 @@ private:
|
||||
for (auto *user : users)
|
||||
{
|
||||
Anope::string mask = ci->GetIdealBan(user);
|
||||
Anope::string reason = Language::Translate(user, _("REGONLY enforced by ")) + source.GetNick();
|
||||
Anope::string reason = Anope::Format(Language::Translate(user, _("REGONLY enforced by %s")), source.GetNick().c_str());
|
||||
if (!ci->c->HasMode("REGISTEREDONLY"))
|
||||
ci->c->SetMode(NULL, "BAN", mask);
|
||||
ci->c->Kick(NULL, user, reason);
|
||||
@@ -121,7 +121,7 @@ private:
|
||||
for (auto *user : users)
|
||||
{
|
||||
Anope::string mask = ci->GetIdealBan(user);
|
||||
Anope::string reason = Language::Translate(user, _("SSLONLY enforced by ")) + source.GetNick();
|
||||
Anope::string reason = Anope::Format(Language::Translate(user, _("SSLONLY enforced by %s")), source.GetNick().c_str());
|
||||
if (!ci->c->HasMode("SSL"))
|
||||
ci->c->SetMode(NULL, "BAN", mask);
|
||||
ci->c->Kick(NULL, user, reason);
|
||||
@@ -149,7 +149,7 @@ private:
|
||||
|
||||
for (auto *user : users)
|
||||
{
|
||||
Anope::string reason = Language::Translate(user, _("BANS enforced by ")) + source.GetNick();
|
||||
Anope::string reason = Anope::Format(Language::Translate(user, _("BANS enforced by %s")), source.GetNick().c_str());
|
||||
ci->c->Kick(NULL, user, reason);
|
||||
}
|
||||
|
||||
@@ -177,7 +177,7 @@ private:
|
||||
|
||||
std::vector<User *> users;
|
||||
/* The newer users are at the end of the list, so kick users starting from the end */
|
||||
for (Channel::ChanUserList::reverse_iterator it = ci->c->users.rbegin(), it_end = ci->c->users.rend(); it != it_end; ++it)
|
||||
for (auto it = ci->c->users.rbegin(), it_end = ci->c->users.rend(); it != it_end; ++it)
|
||||
{
|
||||
auto *memb = it->second;
|
||||
User *user = memb->user;
|
||||
@@ -197,7 +197,7 @@ private:
|
||||
|
||||
for (auto *user : users)
|
||||
{
|
||||
Anope::string reason = Language::Translate(user, _("LIMIT enforced by ")) + source.GetNick();
|
||||
Anope::string reason = Anope::Format(Language::Translate(user, _("LIMIT enforced by %s")), source.GetNick().c_str());
|
||||
ci->c->Kick(NULL, user, reason);
|
||||
}
|
||||
|
||||
|
||||
@@ -85,31 +85,24 @@ EntryMsgImpl::~EntryMsgImpl()
|
||||
|
||||
Serializable *EntryMsgTypeImpl::Unserialize(Serializable *obj, Serialize::Data &data) const
|
||||
{
|
||||
Anope::string sci, screator, smessage;
|
||||
time_t swhen;
|
||||
|
||||
data["ci"] >> sci;
|
||||
data["creator"] >> screator;
|
||||
data["message"] >> smessage;
|
||||
|
||||
ChannelInfo *ci = ChannelInfo::Find(sci);
|
||||
auto *ci = ChannelInfo::Find(data.Load("ci"));
|
||||
if (!ci)
|
||||
return NULL;
|
||||
|
||||
const auto screator = data.Load("creator");
|
||||
const auto smessage = data.Load("message");
|
||||
const auto swhen = data.Load<time_t>("when");
|
||||
if (obj)
|
||||
{
|
||||
EntryMsgImpl *msg = anope_dynamic_static_cast<EntryMsgImpl *>(obj);
|
||||
auto *msg = anope_dynamic_static_cast<EntryMsgImpl *>(obj);
|
||||
msg->chan = ci->name;
|
||||
data["creator"] >> msg->creator;
|
||||
data["message"] >> msg->message;
|
||||
data["when"] >> msg->when;
|
||||
msg->creator = screator;
|
||||
msg->message = smessage;
|
||||
msg->when = swhen;
|
||||
return msg;
|
||||
}
|
||||
|
||||
auto *messages = ci->Require<ChanServ::EntryMessageList>(CHANSERV_ENTRY_MESSAGE_EXT);
|
||||
|
||||
data["when"] >> swhen;
|
||||
|
||||
auto *m = new EntryMsgImpl(ci, screator, smessage, swhen);
|
||||
(*messages)->push_back(m);
|
||||
return m;
|
||||
@@ -251,19 +244,19 @@ public:
|
||||
source.Reply(_(
|
||||
"Controls what messages will be sent to users when they join the channel."
|
||||
"\n\n"
|
||||
"The \002%s\032ADD\002 command adds the given message to "
|
||||
"The \002%s\033ADD\002 command adds the given message to "
|
||||
"the list of messages shown to users when they join "
|
||||
"the channel."
|
||||
"\n\n"
|
||||
"The \002%s\032DEL\002 command removes the specified message from "
|
||||
"The \002%s\033DEL\002 command removes the specified message from "
|
||||
"the list of messages shown to users when they join "
|
||||
"the channel. You can remove a message by specifying its number "
|
||||
"which you can get by listing the messages as explained below."
|
||||
"\n\n"
|
||||
"The \002%s\032LIST\002 command displays a listing of messages "
|
||||
"The \002%s\033LIST\002 command displays a listing of messages "
|
||||
"shown to users when they join the channel."
|
||||
"\n\n"
|
||||
"The \002%s\032CLEAR\002 command clears all entries from "
|
||||
"The \002%s\033CLEAR\002 command clears all entries from "
|
||||
"the list of messages shown to users when they join "
|
||||
"the channel, effectively disabling entry messages."
|
||||
"\n\n"
|
||||
|
||||
@@ -86,7 +86,7 @@ public:
|
||||
void OnReload(Configuration::Conf &conf) override
|
||||
{
|
||||
const auto &block = conf.GetModule("chanstats");
|
||||
prefix = block.Get<const Anope::string>("prefix", "anope_");
|
||||
prefix = block.Get<const Anope::string>("prefix", "chanstats21_");
|
||||
this->sql.SetServiceName(block.Get<const Anope::string>("engine"));
|
||||
}
|
||||
|
||||
|
||||
@@ -114,7 +114,7 @@ public:
|
||||
void OnReload(Configuration::Conf &conf) override
|
||||
{
|
||||
const auto &block = conf.GetModule("chanstats");
|
||||
prefix = block.Get<const Anope::string>("prefix", "anope_");
|
||||
prefix = block.Get<const Anope::string>("prefix", "chanstats21_");
|
||||
this->sql.SetServiceName(block.Get<const Anope::string>("engine"));
|
||||
}
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@ public:
|
||||
|
||||
bool HasPriv(const Anope::string &priv) const override
|
||||
{
|
||||
std::map<Anope::string, char>::iterator it = defaultFlags.find(priv);
|
||||
auto it = defaultFlags.find(priv);
|
||||
return it != defaultFlags.end() && this->flags.count(it->second) > 0;
|
||||
}
|
||||
|
||||
@@ -286,7 +286,7 @@ class CommandCSFlags final
|
||||
if (current != NULL)
|
||||
{
|
||||
ci->EraseAccess(current_idx - 1);
|
||||
FOREACH_MOD(OnAccessDel, (ci, source, current));
|
||||
FOREACH_MOD(OnAccessDel, (ci, source, current, false));
|
||||
delete current;
|
||||
Log(override ? LOG_OVERRIDE : LOG_COMMAND, source, this, ci) << "to delete " << mask;
|
||||
source.Reply(_("\002%s\002 removed from the %s access list."), mask.c_str(), ci->name.c_str());
|
||||
@@ -301,7 +301,7 @@ class CommandCSFlags final
|
||||
ServiceReference<AccessProvider> provider("AccessProvider", "access/flags");
|
||||
if (!provider)
|
||||
return;
|
||||
FlagsChanAccess *access = anope_dynamic_static_cast<FlagsChanAccess *>(provider->Create());
|
||||
auto *access = anope_dynamic_static_cast<FlagsChanAccess *>(provider->Create());
|
||||
access->SetMask(mask, ci);
|
||||
access->creator = source.GetNick();
|
||||
access->description = current ? current->description : description;
|
||||
@@ -314,7 +314,7 @@ class CommandCSFlags final
|
||||
|
||||
ci->AddAccess(access);
|
||||
|
||||
FOREACH_MOD(OnAccessAdd, (ci, source, access));
|
||||
FOREACH_MOD(OnAccessAdd, (ci, source, access, false));
|
||||
|
||||
Log(override ? LOG_OVERRIDE : LOG_COMMAND, source, this, ci) << "to modify " << mask << "'s flags to " << access->AccessSerialize();
|
||||
if (p != NULL)
|
||||
@@ -331,6 +331,7 @@ class CommandCSFlags final
|
||||
static void DoList(CommandSource &source, ChannelInfo *ci, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
const Anope::string &arg = params.size() > 2 ? params[2] : "";
|
||||
const auto show_all = params.size() > 3 && params[3].equals_ci("ALL");
|
||||
|
||||
if (!ci->GetAccessCount())
|
||||
{
|
||||
@@ -348,6 +349,7 @@ class CommandCSFlags final
|
||||
});
|
||||
|
||||
unsigned count = 0;
|
||||
unsigned foreign = 0;
|
||||
for (unsigned i = 0, end = ci->GetAccessCount(); i < end; ++i)
|
||||
{
|
||||
const ChanAccess *access = ci->GetAccess(i);
|
||||
@@ -368,6 +370,12 @@ class CommandCSFlags final
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!show_all && access->provider->name != "access/flags")
|
||||
{
|
||||
foreign++;
|
||||
continue;
|
||||
}
|
||||
|
||||
ListFormatter::ListEntry entry;
|
||||
++count;
|
||||
entry["Number"] = Anope::ToString(i + 1);
|
||||
@@ -390,6 +398,88 @@ class CommandCSFlags final
|
||||
else
|
||||
source.Reply(_("End of access list - %d/%d entries shown."), count, ci->GetAccessCount());
|
||||
}
|
||||
|
||||
if (foreign)
|
||||
{
|
||||
const auto full_command = Anope::Format("%s %s LIST %s", source.command.c_str(),
|
||||
ci->name.c_str(), arg.empty() ? "*" : arg.c_str()).nobreak();
|
||||
|
||||
source.Reply(foreign, CHAN_ACCESS_FOREIGN, foreign, full_command.c_str());
|
||||
}
|
||||
}
|
||||
|
||||
void DoMigrate(CommandSource &source, ChannelInfo *ci, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
auto override = false;
|
||||
const auto source_access = source.AccessFor(ci);
|
||||
|
||||
unsigned migrated = 0, notmigrated = 0;
|
||||
Anope::string migratedmask, notmigratedmask;
|
||||
const auto &entry = params.size() > 2 ? params[2] : "*";
|
||||
for (auto idx = ci->GetAccessCount(); idx > 0; --idx)
|
||||
{
|
||||
auto *access = ci->GetAccess(idx - 1);
|
||||
if (access->provider->name == "access/flags")
|
||||
continue; // Already using flags.
|
||||
|
||||
if (!Anope::Match(access->Mask(), entry))
|
||||
continue; // Not this entry.
|
||||
|
||||
std::set<char> newflags;
|
||||
for (auto &[priv, flag] : defaultFlags)
|
||||
{
|
||||
if (access->HasPriv(priv))
|
||||
continue; // Source doesn't have this flag.
|
||||
|
||||
// Check that the source has access to set this entry.
|
||||
if (!override && !source_access.HasPriv(priv) && !source_access.founder)
|
||||
{
|
||||
if (!source.HasPriv("chanserv/access/modify"))
|
||||
{
|
||||
notmigrated++;
|
||||
notmigratedmask = access->Mask();
|
||||
continue; // No privs
|
||||
}
|
||||
|
||||
override = true;
|
||||
}
|
||||
|
||||
newflags.insert(flag);
|
||||
}
|
||||
|
||||
migrated++;
|
||||
migratedmask = access->Mask();
|
||||
|
||||
auto *newaccess = anope_dynamic_static_cast<FlagsChanAccess *>(FlagsAccessProvider::ap->Create());
|
||||
newaccess->SetMask(access->Mask(), ci);
|
||||
newaccess->creator = access->creator;
|
||||
newaccess->description = access->description;
|
||||
newaccess->created = access->created;
|
||||
newaccess->flags = newflags;
|
||||
|
||||
ci->EraseAccess(idx - 1);
|
||||
FOREACH_MOD(OnAccessDel, (ci, source, access, true));
|
||||
delete access;
|
||||
|
||||
ci->AddAccess(newaccess);
|
||||
FOREACH_MOD(OnAccessAdd, (ci, source, newaccess, true));
|
||||
}
|
||||
|
||||
if (migrated == 1)
|
||||
{
|
||||
Log(override ? LOG_OVERRIDE : LOG_COMMAND, source, this, ci) << "to migrate " << migratedmask;
|
||||
source.Reply(CHAN_ACCESS_MIGRATED_1, migratedmask.c_str(), source.command.nobreak().c_str());
|
||||
}
|
||||
else if (migrated > 1)
|
||||
{
|
||||
Log(override ? LOG_OVERRIDE : LOG_COMMAND, source, this, ci) << "to migrate " << migrated << " access entries";
|
||||
source.Reply(migrated, CHAN_ACCESS_MIGRATED_N, migrated, source.command.nobreak().c_str());
|
||||
}
|
||||
|
||||
if (notmigrated == 1)
|
||||
source.Reply(CHAN_ACCESS_NOT_MIGRATED_1, notmigratedmask.c_str(), source.command.nobreak().c_str());
|
||||
else if (notmigrated > 1)
|
||||
source.Reply(migrated, CHAN_ACCESS_NOT_MIGRATED_N, notmigrated, source.command.nobreak().c_str());
|
||||
}
|
||||
|
||||
void DoClear(CommandSource &source, ChannelInfo *ci)
|
||||
@@ -414,7 +504,8 @@ public:
|
||||
{
|
||||
this->SetDesc(_("Modify the list of privileged users"));
|
||||
this->SetSyntax(_("\037channel\037 [MODIFY] \037mask\037 \037changes\037 [\037description\037]"));
|
||||
this->SetSyntax(_("\037channel\037 LIST [\037mask\037 | +\037flags\037]"));
|
||||
this->SetSyntax(_("\037channel\037 LIST [\037mask\037 | +\037flags\037] [ALL]"));
|
||||
this->SetSyntax(_("\037channel\037 MIGRATE [\037mask\037]"));
|
||||
this->SetSyntax(_("\037channel\037 CLEAR"));
|
||||
}
|
||||
|
||||
@@ -447,6 +538,8 @@ public:
|
||||
source.Reply(READ_ONLY_MODE);
|
||||
else if (is_list)
|
||||
this->DoList(source, ci, params);
|
||||
else if (cmd.equals_ci("MIGRATE"))
|
||||
this->DoMigrate(source, ci, params);
|
||||
else if (cmd.equals_ci("CLEAR"))
|
||||
this->DoClear(source, ci);
|
||||
else
|
||||
@@ -487,7 +580,8 @@ public:
|
||||
"The \002LIST\002 command allows you to list existing entries on the channel access list. "
|
||||
"If a mask is given, the mask is wildcard matched against all existing entries on the "
|
||||
"access list, and only those entries are returned. If a set of flags is given, only those "
|
||||
"on the access list with the specified flags are returned."
|
||||
"on the access list with the specified flags are returned. The \002ALL\002 option allows "
|
||||
"listing entries from other access systems as well as flags."
|
||||
"\n\n"
|
||||
"The \002CLEAR\002 command clears the channel access list. This requires channel founder access."
|
||||
"\n\n"
|
||||
@@ -505,7 +599,7 @@ public:
|
||||
Privilege *p = PrivilegeManager::FindPrivilege(priv);
|
||||
if (p == NULL)
|
||||
continue;
|
||||
source.Reply(" %c - %s", flag, Language::Translate(source.nc, p->desc.c_str()));
|
||||
source.Reply(" %c - %s", flag, source.Translate(p->desc.c_str()));
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
@@ -47,7 +47,7 @@ public:
|
||||
return;
|
||||
}
|
||||
|
||||
unsigned reasonmax = Config->GetModule("chanserv").Get<unsigned>("reasonmax", "200");
|
||||
auto reasonmax = Config->GetModule("chanserv").Get<unsigned>("reasonmax", "200");
|
||||
if (reason.length() > reasonmax)
|
||||
reason = reason.substr(0, reasonmax);
|
||||
|
||||
@@ -90,7 +90,7 @@ public:
|
||||
Log(LOG_COMMAND, source, this, ci) << "for " << mask;
|
||||
|
||||
int matched = 0, kicked = 0;
|
||||
for (Channel::ChanUserList::iterator it = c->users.begin(), it_end = c->users.end(); it != it_end;)
|
||||
for (auto it = c->users.begin(), it_end = c->users.end(); it != it_end;)
|
||||
{
|
||||
auto *memb = it->second;
|
||||
++it;
|
||||
|
||||
@@ -73,7 +73,7 @@ public:
|
||||
}
|
||||
|
||||
Anope::string spattern = "#" + pattern;
|
||||
unsigned listmax = Config->GetModule(this->owner).Get<unsigned>("listmax", "50");
|
||||
auto listmax = Config->GetModule(this->owner).Get<unsigned>("listmax", "50");
|
||||
|
||||
source.Reply(_("List of entries matching \002%s\002:"), pattern.c_str());
|
||||
|
||||
@@ -122,7 +122,7 @@ public:
|
||||
ListFormatter::ListEntry entry;
|
||||
entry["Name"] = (isnoexpire ? "!" : "") + ci->name;
|
||||
if (ci->HasExt("CS_SUSPENDED"))
|
||||
entry["Description"] = Language::Translate(source.GetAccount(), _("[Suspended]"));
|
||||
entry["Description"] = source.Translate(_("[Suspended]"));
|
||||
else
|
||||
entry["Description"] = ci->desc;
|
||||
list.AddEntry(entry);
|
||||
@@ -154,20 +154,23 @@ public:
|
||||
"flag set will be displayed. If multiple options are given, "
|
||||
"all channels matching at least one option will be displayed. "
|
||||
"Note that these options are limited to \037Services Operators\037."
|
||||
"\n\n"
|
||||
"Examples:"
|
||||
"\n\n"
|
||||
" \002LIST\032*anope*\002\n"
|
||||
" Lists all registered channels with \002anope\002 in their\n"
|
||||
" names (case insensitive)."
|
||||
"\n\n"
|
||||
" \002LIST\032*\032NOEXPIRE\002\n"
|
||||
" Lists all registered channels which have been set to not expire."
|
||||
"\n\n"
|
||||
" \002LIST #51-100\002\n"
|
||||
" Lists all registered channels within the given range (51-100)."
|
||||
));
|
||||
|
||||
ExampleWrapper examples;
|
||||
examples.AddEntry("*anope*", _(
|
||||
"Lists all registered channels with \037anope\037 in their name (case insensitive). "
|
||||
));
|
||||
examples.AddEntry("#51-100", _(
|
||||
"Lists all registered channels within the given range (51-100)."
|
||||
));
|
||||
examples.AddEntry("* NOEXPIRE", _(
|
||||
"Lists all registered channels that have been set to not expire."
|
||||
), "chanserv/list");
|
||||
examples.AddEntry("* SUSPENDED", _(
|
||||
"Lists all registered channels that have been suspended."
|
||||
), "chanserv/list");
|
||||
examples.SendTo(source);
|
||||
|
||||
if (!Config->GetBlock("options").Get<const Anope::string>("regexengine").empty())
|
||||
{
|
||||
source.Reply(" ");
|
||||
@@ -242,7 +245,7 @@ public:
|
||||
|
||||
BotInfo *bi;
|
||||
Anope::string cmd;
|
||||
if (Command::FindCommandFromService("chanserv/list", bi, cmd))
|
||||
if (Command::FindFromService("chanserv/list", bi, cmd))
|
||||
{
|
||||
source.Reply(_("When \002private\002 is set, the channel will not appear in %s's %s command."),
|
||||
bi->nick.c_str(), cmd.c_str());
|
||||
|
||||
+23
-18
@@ -64,10 +64,7 @@ struct LogSettingTypeImpl final
|
||||
|
||||
Serializable *Unserialize(Serializable *obj, Serialize::Data &data) const override
|
||||
{
|
||||
Anope::string sci;
|
||||
data["ci"] >> sci;
|
||||
|
||||
ChannelInfo *ci = ChannelInfo::Find(sci);
|
||||
auto *ci = ChannelInfo::Find(data.Load("ci"));
|
||||
if (ci == NULL)
|
||||
return NULL;
|
||||
|
||||
@@ -82,13 +79,13 @@ struct LogSettingTypeImpl final
|
||||
}
|
||||
|
||||
ls->chan = ci->name;
|
||||
data["service_name"] >> ls->service_name;
|
||||
data["command_service"] >> ls->command_service;
|
||||
data["command_name"] >> ls->command_name;
|
||||
data["method"] >> ls->method;
|
||||
data["extra"] >> ls->extra;
|
||||
data["creator"] >> ls->creator;
|
||||
data["created"] >> ls->created;
|
||||
ls->service_name = data.Load("service_name");
|
||||
ls->command_service = data.Load("command_service");
|
||||
ls->command_name = data.Load("command_name");
|
||||
ls->method = data.Load("method");
|
||||
ls->extra = data.Load("extra");
|
||||
ls->creator = data.Load("creator");
|
||||
ls->created = data.Load<time_t>("created");
|
||||
|
||||
return ls;
|
||||
}
|
||||
@@ -279,22 +276,30 @@ public:
|
||||
"Otherwise, \037command\037 must be a command name, and \037method\037 "
|
||||
"is one of the following logging methods:"
|
||||
"\n\n"
|
||||
" MESSAGE\032[status], NOTICE\032[status], MEMO"
|
||||
" MESSAGE\033[status], NOTICE\033[status], MEMO"
|
||||
"\n\n"
|
||||
"Which are used to message, notice, and memo the channel respectively. "
|
||||
"With MESSAGE or NOTICE you must have a service bot assigned to and joined "
|
||||
"to your channel. Status may be a channel status such as @ or +."
|
||||
"\n\n"
|
||||
"To remove a logging method use the same syntax as you would to add it."
|
||||
"\n\n"
|
||||
"Example:\n"
|
||||
" %s\032#anope\032chanserv/access\032MESSAGE\032@\n"
|
||||
" Would message any channel operators whenever someone used the "
|
||||
"ACCESS command on ChanServ on the channel."
|
||||
),
|
||||
source.command.nobreak().c_str(),
|
||||
source.command.nobreak().c_str());
|
||||
|
||||
ExampleWrapper examples;
|
||||
examples.AddEntry("#anope chanserv/access MESSAGE @", _(
|
||||
"Sends a message to channel operators and above when someone uses the chanserv/access "
|
||||
"command on #anope."
|
||||
));
|
||||
examples.AddEntry("#anope chanserv/flags NOTICE +", _(
|
||||
"Sends a notice to channel voices and above when someone uses the chanserv/flags "
|
||||
"command on #anope."
|
||||
));
|
||||
examples.AddEntry("#anope chanserv/xop MEMO", _(
|
||||
"Sends a memo to the channel when someone uses the chanserv/xop command on #anope."
|
||||
));
|
||||
examples.SendTo(source);
|
||||
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -270,11 +270,7 @@ void ModeLockTypeImpl::Serialize(Serializable *obj, Serialize::Data &data) const
|
||||
|
||||
Serializable *ModeLockTypeImpl::Unserialize(Serializable *obj, Serialize::Data &data) const
|
||||
{
|
||||
Anope::string sci;
|
||||
|
||||
data["ci"] >> sci;
|
||||
|
||||
ChannelInfo *ci = ChannelInfo::Find(sci);
|
||||
auto *ci = ChannelInfo::Find(data.Load("ci"));
|
||||
if (!ci)
|
||||
return NULL;
|
||||
|
||||
@@ -287,11 +283,11 @@ Serializable *ModeLockTypeImpl::Unserialize(Serializable *obj, Serialize::Data &
|
||||
ml->ci = ci->name;
|
||||
}
|
||||
|
||||
data["set"] >> ml->set;
|
||||
data["created"] >> ml->created;
|
||||
data["setter"] >> ml->setter;
|
||||
data["name"] >> ml->name;
|
||||
data["param"] >> ml->param;
|
||||
ml->set = data.Load<bool>("set");
|
||||
ml->created = data.Load<time_t>("created");
|
||||
ml->setter = data.Load("setter");
|
||||
ml->name = data.Load("name");
|
||||
ml->param = data.Load("param");
|
||||
|
||||
if (!obj)
|
||||
ci->Require<ModeLocksImpl>(CHANSERV_MODE_LOCK_EXT)->mlocks->push_back(ml);
|
||||
@@ -434,7 +430,7 @@ class CommandCSMode final
|
||||
break;
|
||||
}
|
||||
Anope::string mode_param;
|
||||
if (NeedsParam(cm, adding) && !sep.GetToken(mode_param))
|
||||
if (NeedsParam(cm, adding && setting) && !sep.GetToken(mode_param))
|
||||
{
|
||||
missingparam.Push(cm, mode_param, adding);
|
||||
break;
|
||||
@@ -601,7 +597,7 @@ class CommandCSMode final
|
||||
}
|
||||
}
|
||||
|
||||
for (Channel::ChanUserList::const_iterator it = ci->c->users.begin(), it_end = ci->c->users.end(); it != it_end;)
|
||||
for (auto it = ci->c->users.begin(), it_end = ci->c->users.end(); it != it_end;)
|
||||
{
|
||||
auto *memb = it->second;
|
||||
++it;
|
||||
@@ -811,34 +807,34 @@ public:
|
||||
"Mainly controls mode locks and mode access (which is different from channel access) "
|
||||
"on a channel."
|
||||
"\n\n"
|
||||
"The \002%s\032LOCK\002 command allows you to add, delete, and view mode locks on a channel. "
|
||||
"The \002%s\033LOCK\002 command allows you to add, delete, and view mode locks on a channel. "
|
||||
"If a mode is locked on or off, services will not allow that mode to be changed. The \002SET\002 "
|
||||
"command will clear all existing mode locks and set the new one given, while \002ADD\002 and \002DEL\002 "
|
||||
"modify the existing mode lock."
|
||||
"\n\n"
|
||||
"Example:\n"
|
||||
" \002%s\032#channel\032LOCK\032ADD\032+bmnt\032*!*@*.example.com\002\n"
|
||||
"\n\n"
|
||||
"The \002%s\032SET\002 command allows you to set modes through services. Wildcards * and ? may "
|
||||
"The \002%s\033SET\002 command allows you to set modes through services. Wildcards * and ? may "
|
||||
"be given as parameters for list and status modes."
|
||||
"\n\n"
|
||||
"Example:\n"
|
||||
" \002%s\032#channel\032SET\032+v\032*\002\n"
|
||||
" Sets voice status to all users in the channel."
|
||||
"\n\n"
|
||||
" \002%s\032#channel\032SET\032-b\032~c:*\n"
|
||||
" Clears all extended bans that start with ~c:"
|
||||
"\n\n"
|
||||
"The \002%s\032CLEAR\002 command is an easy way to clear modes on a channel. \037what\037 may be "
|
||||
"The \002%s\033CLEAR\002 command is an easy way to clear modes on a channel. \037what\037 may be "
|
||||
"any mode name. Examples include bans, excepts, inviteoverrides, ops, halfops, and voices. If \037what\037 "
|
||||
"is not given then all basic modes are removed."
|
||||
),
|
||||
source.command.nobreak().c_str(),
|
||||
source.command.nobreak().c_str(),
|
||||
source.command.nobreak().c_str(),
|
||||
source.command.nobreak().c_str(),
|
||||
source.command.nobreak().c_str(),
|
||||
source.command.nobreak().c_str());
|
||||
|
||||
ExampleWrapper examples;
|
||||
examples.AddEntry("#channel LOCK ADD +bmnt *!*@*.example.com", _(
|
||||
"Adds a mode lock on the moderated, no external messages, topic lock flag modes as "
|
||||
"well as a ban on \037*!*@*.example.com\037."
|
||||
));
|
||||
examples.AddEntry("#channel SET +v *", _(
|
||||
"Sets voice status on all users in the channel."
|
||||
));
|
||||
examples.AddEntry("#channel SET -b channel:*", _(
|
||||
"Clears all extended bans that start with \037channel:\037."
|
||||
));
|
||||
|
||||
return true;
|
||||
}
|
||||
};
|
||||
@@ -949,9 +945,9 @@ public:
|
||||
if (!m.second.empty())
|
||||
{
|
||||
if (m.first)
|
||||
return Anope::Format(Language::Translate(source.GetAccount(), _("Gives you or the specified nick %s status on a channel")), m.second.c_str());
|
||||
return Anope::Format(source.Translate(_("Gives you or the specified nick %s status on a channel")), m.second.c_str());
|
||||
else
|
||||
return Anope::Format(Language::Translate(source.GetAccount(), _("Removes %s status from you or the specified nick on a channel")), m.second.c_str());
|
||||
return Anope::Format(source.Translate(_("Removes %s status from you or the specified nick on a channel")), m.second.c_str());
|
||||
}
|
||||
else
|
||||
return "";
|
||||
@@ -1102,7 +1098,7 @@ public:
|
||||
Anope::string param;
|
||||
if (cm->type == MODE_PARAM)
|
||||
{
|
||||
ChannelModeParam *cmp = anope_dynamic_static_cast<ChannelModeParam *>(cm);
|
||||
auto *cmp = anope_dynamic_static_cast<ChannelModeParam *>(cm);
|
||||
if (add || !cmp->minus_no_arg)
|
||||
{
|
||||
sep.GetToken(param);
|
||||
|
||||
@@ -28,7 +28,7 @@ public:
|
||||
{
|
||||
const Anope::string &chan = params[0];
|
||||
const Anope::string &chdesc = params.size() > 1 ? params[1] : "";
|
||||
unsigned maxregistered = Config->GetModule("chanserv").Get<unsigned>("maxregistered");
|
||||
auto maxregistered = Config->GetModule("chanserv").Get<unsigned>("maxregistered");
|
||||
|
||||
User *u = source.GetUser();
|
||||
NickCore *nc = source.nc;
|
||||
@@ -105,11 +105,11 @@ public:
|
||||
|
||||
BotInfo *bi;
|
||||
Anope::string cmd;
|
||||
if (Command::FindCommandFromService("chanserv/access", bi, cmd))
|
||||
if (Command::FindFromService("chanserv/access", bi, cmd))
|
||||
{
|
||||
source.Reply(" ");
|
||||
source.Reply(_(
|
||||
"See the \002%s\002 command (\002%s\032ACCESS\002) for "
|
||||
"See the \002%s\002 command (\002%s\033ACCESS\002) for "
|
||||
"information on giving a subset of these privileges to "
|
||||
"other channel users."
|
||||
),
|
||||
|
||||
@@ -41,7 +41,7 @@ struct SeenInfo final
|
||||
|
||||
~SeenInfo() override
|
||||
{
|
||||
database_map::iterator iter = database.find(nick);
|
||||
auto iter = database.find(nick);
|
||||
if (iter != database.end() && iter->second == this)
|
||||
database.erase(iter);
|
||||
}
|
||||
@@ -111,9 +111,7 @@ struct SeenInfoType final
|
||||
|
||||
Serializable *Unserialize(Serializable *obj, Serialize::Data &data) const override
|
||||
{
|
||||
Anope::string snick;
|
||||
|
||||
data["nick"] >> snick;
|
||||
const auto snick = data.Load("nick");
|
||||
|
||||
SeenInfo *s;
|
||||
if (obj)
|
||||
@@ -127,14 +125,12 @@ struct SeenInfoType final
|
||||
}
|
||||
|
||||
s->nick = snick;
|
||||
data["vhost"] >> s->vhost;
|
||||
Anope::string n;
|
||||
data["type"] >> n;
|
||||
s->type = StringToType(n);
|
||||
data["nick2"] >> s->nick2;
|
||||
data["channel"] >> s->channel;
|
||||
data["message"] >> s->message;
|
||||
data["last"] >> s->last;
|
||||
s->vhost = data.Load("vhost");
|
||||
s->type = StringToType(data.Load("type"));
|
||||
s->nick2 = data.Load("nick2");
|
||||
s->channel = data.Load("channel");
|
||||
s->message = data.Load("message");
|
||||
s->last = data.Load<time_t>("last");
|
||||
|
||||
if (!obj)
|
||||
database[s->nick] = s;
|
||||
@@ -144,7 +140,7 @@ struct SeenInfoType final
|
||||
|
||||
static SeenInfo *FindInfo(const Anope::string &nick)
|
||||
{
|
||||
database_map::iterator iter = database.find(nick);
|
||||
auto iter = database.find(nick);
|
||||
if (iter != database.end())
|
||||
return iter->second;
|
||||
return NULL;
|
||||
@@ -203,7 +199,7 @@ public:
|
||||
time = Anope::CurTime - time;
|
||||
database_map::iterator buf;
|
||||
size_t counter = 0;
|
||||
for (database_map::iterator it = database.begin(), it_end = database.end(); it != it_end;)
|
||||
for (auto it = database.begin(), it_end = database.end(); it != it_end;)
|
||||
{
|
||||
buf = it;
|
||||
++it;
|
||||
@@ -226,16 +222,16 @@ public:
|
||||
this->SendSyntax(source);
|
||||
source.Reply(" ");
|
||||
source.Reply(_(
|
||||
"The \002STATS\002 command prints out statistics about stored nicks and memory usage."
|
||||
"\n\n"
|
||||
"The \002CLEAR\002 command lets you clean the database by removing all entries from the "
|
||||
"database that were added within \037time\037."
|
||||
"\n\n"
|
||||
"Example:\n"
|
||||
" %s\032CLEAR\03230m\n"
|
||||
" Will remove all entries that were added within the last 30 minutes."
|
||||
),
|
||||
source.command.nobreak().c_str());
|
||||
"The \002STATS\002 command prints out statistics about stored nicks and memory usage."
|
||||
"\n\n"
|
||||
"The \002CLEAR\002 command lets you clean the database by removing all entries from the "
|
||||
"database that were added within \037time\037."
|
||||
));
|
||||
|
||||
ExampleWrapper examples;
|
||||
examples.AddEntry("CLEAR 30m", _(
|
||||
"Removes all entries that were added in the last 30 minutes."
|
||||
));
|
||||
return true;
|
||||
}
|
||||
};
|
||||
@@ -285,7 +281,7 @@ public:
|
||||
if (u2)
|
||||
onlinestatus = ".";
|
||||
else
|
||||
onlinestatus = Anope::Format(Language::Translate(source.nc, _(" but %s mysteriously dematerialized.")), target.c_str());
|
||||
onlinestatus = Anope::Format(source.Translate(_(" but %s mysteriously dematerialized.")), target.c_str());
|
||||
|
||||
Anope::string timebuf = Anope::Duration(Anope::CurTime - info->last, source.nc);
|
||||
Anope::string timebuf2 = Anope::strftime(info->last, source.nc, true);
|
||||
@@ -299,9 +295,9 @@ public:
|
||||
{
|
||||
u2 = User::Find(info->nick2, true);
|
||||
if (u2)
|
||||
onlinestatus = Anope::Format(Language::Translate(source.nc, _(". %s is still online.")), u2->nick.c_str());
|
||||
onlinestatus = Anope::Format(source.Translate(_(". %s is still online.")), u2->nick.c_str());
|
||||
else
|
||||
onlinestatus = Anope::Format(Language::Translate(source.nc, _(", but %s mysteriously dematerialized.")), info->nick2.c_str());
|
||||
onlinestatus = Anope::Format(source.Translate(_(", but %s mysteriously dematerialized.")), info->nick2.c_str());
|
||||
|
||||
source.Reply(_("%s (%s) was last seen changing nick to %s %s ago%s"),
|
||||
target.c_str(), info->vhost.c_str(), info->nick2.c_str(), timebuf.c_str(), onlinestatus.c_str());
|
||||
@@ -379,9 +375,9 @@ public:
|
||||
return;
|
||||
|
||||
auto previous_size = database.size();
|
||||
for (database_map::iterator it = database.begin(), it_end = database.end(); it != it_end;)
|
||||
for (auto it = database.begin(), it_end = database.end(); it != it_end;)
|
||||
{
|
||||
database_map::iterator cur = it;
|
||||
auto cur = it;
|
||||
++it;
|
||||
|
||||
if ((Anope::CurTime - cur->second->last) > purgetime)
|
||||
|
||||
@@ -67,7 +67,7 @@ public:
|
||||
}
|
||||
help.SendTo(source);
|
||||
|
||||
source.Reply(_("Type \002%s\032\037option\037\002 for more information on a particular option."),
|
||||
source.Reply(_("Type \002%s\033\037option\037\002 for more information on a particular option."),
|
||||
source.service->GetQueryCommand("generic/help", this_name).c_str());
|
||||
return true;
|
||||
}
|
||||
@@ -320,7 +320,7 @@ public:
|
||||
}
|
||||
|
||||
NickCore *nc = na->nc;
|
||||
unsigned max_reg = Config->GetModule("chanserv").Get<unsigned>("maxregistered");
|
||||
auto max_reg = Config->GetModule("chanserv").Get<unsigned>("maxregistered");
|
||||
if (max_reg && nc->channelcount >= max_reg && !source.HasPriv("chanserv/no-register-limit"))
|
||||
{
|
||||
source.Reply(_("\002%s\002 has too many channels registered."), na->nick.c_str());
|
||||
@@ -1018,7 +1018,7 @@ public:
|
||||
"channel will be dropped."
|
||||
));
|
||||
|
||||
unsigned max_reg = Config->GetModule("chanserv").Get<unsigned>("maxregistered");
|
||||
auto max_reg = Config->GetModule("chanserv").Get<unsigned>("maxregistered");
|
||||
if (max_reg)
|
||||
{
|
||||
source.Reply(" ");
|
||||
@@ -1112,7 +1112,7 @@ class CSSet final
|
||||
if (s->GetSerializableType()->GetName() != CHANNELINFO_TYPE)
|
||||
return;
|
||||
|
||||
const ChannelInfo *ci = anope_dynamic_static_cast<const ChannelInfo *>(s);
|
||||
const auto *ci = anope_dynamic_static_cast<const ChannelInfo *>(s);
|
||||
Anope::string modes;
|
||||
for (const auto &[last_mode, last_data] : ci->last_modes)
|
||||
{
|
||||
@@ -1138,11 +1138,11 @@ class CSSet final
|
||||
if (s->GetSerializableType()->GetName() != CHANNELINFO_TYPE)
|
||||
return;
|
||||
|
||||
ChannelInfo *ci = anope_dynamic_static_cast<ChannelInfo *>(s);
|
||||
Anope::string modes;
|
||||
data["last_modes"] >> modes;
|
||||
auto *ci = anope_dynamic_static_cast<ChannelInfo *>(s);
|
||||
ci->last_modes.clear();
|
||||
for (spacesepstream sep(modes); sep.GetToken(modes);)
|
||||
|
||||
spacesepstream sep(data.Load("last_modes"));
|
||||
for (Anope::string modes; sep.GetToken(modes);)
|
||||
{
|
||||
if (modes[0] == '+')
|
||||
{
|
||||
|
||||
@@ -17,8 +17,18 @@
|
||||
|
||||
static Module *me;
|
||||
|
||||
static Anope::map<Anope::string> descriptions;
|
||||
static Anope::map<unsigned> numerics;
|
||||
#define MISC_PREFIX "cs_set_misc:"
|
||||
|
||||
struct CommandData final
|
||||
{
|
||||
Anope::string description;
|
||||
Anope::string pattern;
|
||||
Anope::string syntax;
|
||||
Anope::string title;
|
||||
unsigned numeric = 0;
|
||||
};
|
||||
|
||||
static Anope::map<CommandData> command_data;
|
||||
|
||||
struct CSMiscData;
|
||||
static Anope::map<ExtensibleItem<CSMiscData> *> items;
|
||||
@@ -67,23 +77,20 @@ struct CSMiscDataType
|
||||
|
||||
Serializable *Unserialize(Serializable *obj, Serialize::Data &data) const override
|
||||
{
|
||||
Anope::string sci, sname, sdata;
|
||||
|
||||
data["ci"] >> sci;
|
||||
data["name"] >> sname;
|
||||
data["data"] >> sdata;
|
||||
|
||||
ChannelInfo *ci = ChannelInfo::Find(sci);
|
||||
auto *ci = ChannelInfo::Find(data.Load("ci"));
|
||||
if (ci == NULL)
|
||||
return NULL;
|
||||
|
||||
const auto sname = data.Load("name");
|
||||
const auto sdata = data.Load("data");
|
||||
|
||||
CSMiscData *d = NULL;
|
||||
if (obj)
|
||||
{
|
||||
d = anope_dynamic_static_cast<CSMiscData *>(obj);
|
||||
d->object = ci->name;
|
||||
data["name"] >> d->name;
|
||||
data["data"] >> d->data;
|
||||
d->name = sname;
|
||||
d->data = sdata;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -100,17 +107,49 @@ static Anope::string GetAttribute(const Anope::string &command)
|
||||
{
|
||||
size_t sp = command.rfind(' ');
|
||||
if (sp != Anope::string::npos)
|
||||
return command.substr(sp + 1);
|
||||
return command;
|
||||
return MISC_PREFIX + command.substr(sp + 1);
|
||||
return MISC_PREFIX + command;
|
||||
}
|
||||
|
||||
static const char* GetTitle(ExtensibleItem<CSMiscData> *ext)
|
||||
{
|
||||
auto it = command_data.find(ext->name);
|
||||
if (it == command_data.end() || it->second.title.empty())
|
||||
return ext->name.c_str() + 12;
|
||||
return it->second.title.c_str();
|
||||
}
|
||||
|
||||
class CommandCSSetMisc final
|
||||
: public Command
|
||||
{
|
||||
private:
|
||||
bool CheckSyntax(CommandSource &source, ExtensibleItem<CSMiscData> *ext, const Anope::string &value) const
|
||||
{
|
||||
auto it = command_data.find(ext->name);
|
||||
if (it == command_data.end() || it->second.pattern.empty())
|
||||
return true; // No syntax validation.
|
||||
|
||||
ServiceReference<RegexProvider> regex("Regex", Config->GetBlock("options").Get<const Anope::string>("regexengine"));
|
||||
if (!regex)
|
||||
return true; // No regex engine.
|
||||
|
||||
auto ret = true;
|
||||
try
|
||||
{
|
||||
auto *pattern = regex->Compile(it->second.pattern);
|
||||
ret = pattern->Matches(value);
|
||||
delete pattern;
|
||||
}
|
||||
catch (const RegexException &ex)
|
||||
{
|
||||
Log(LOG_DEBUG) << ex.GetReason();
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
public:
|
||||
CommandCSSetMisc(Module *creator, const Anope::string &cname = "chanserv/set/misc") : Command(creator, cname, 1, 2)
|
||||
{
|
||||
this->SetSyntax(_("\037channel\037 [\037parameters\037]"));
|
||||
}
|
||||
|
||||
void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms) override
|
||||
@@ -140,46 +179,70 @@ public:
|
||||
return;
|
||||
}
|
||||
|
||||
Anope::string scommand = GetAttribute(source.command);
|
||||
Anope::string key = "cs_set_misc:" + scommand;
|
||||
const auto key = GetAttribute(source.command);
|
||||
ExtensibleItem<CSMiscData> *item = GetItem(key);
|
||||
if (item == NULL)
|
||||
return;
|
||||
|
||||
if (!param.empty())
|
||||
{
|
||||
if (!CheckSyntax(source, item, param))
|
||||
{
|
||||
source.Reply(CHAN_SETTING_INVALID, GetTitle(item));
|
||||
this->SendSyntax(source);
|
||||
return;
|
||||
}
|
||||
|
||||
item->Set(ci, CSMiscData(ci, key, param));
|
||||
Log(source.AccessFor(ci).HasPriv("SET") ? LOG_COMMAND : LOG_OVERRIDE, source, this, ci) << "to change it to " << param;
|
||||
source.Reply(CHAN_SETTING_CHANGED, scommand.c_str(), ci->name.c_str(), params[1].c_str());
|
||||
source.Reply(CHAN_SETTING_CHANGED, GetTitle(item), ci->name.c_str(), params[1].c_str());
|
||||
}
|
||||
else
|
||||
{
|
||||
item->Unset(ci);
|
||||
Log(source.AccessFor(ci).HasPriv("SET") ? LOG_COMMAND : LOG_OVERRIDE, source, this, ci) << "to unset it";
|
||||
source.Reply(CHAN_SETTING_UNSET, scommand.c_str(), ci->name.c_str());
|
||||
source.Reply(CHAN_SETTING_UNSET, GetTitle(item), ci->name.c_str());
|
||||
}
|
||||
}
|
||||
|
||||
void OnServHelp(CommandSource &source, HelpWrapper &help) override
|
||||
{
|
||||
if (descriptions.count(source.command))
|
||||
auto it = command_data.find(GetAttribute(source.command));
|
||||
if (it != command_data.end() && !it->second.description.empty())
|
||||
{
|
||||
this->SetDesc(descriptions[source.command]);
|
||||
this->SetDesc(it->second.description);
|
||||
Command::OnServHelp(source, help);
|
||||
}
|
||||
}
|
||||
|
||||
bool OnHelp(CommandSource &source, const Anope::string &subcommand) override
|
||||
{
|
||||
if (descriptions.count(source.command))
|
||||
auto it = command_data.find(GetAttribute(source.command));
|
||||
if (it != command_data.end() && !it->second.description.empty())
|
||||
{
|
||||
this->SendSyntax(source);
|
||||
source.Reply(" ");
|
||||
source.Reply("%s", Language::Translate(source.nc, descriptions[source.command].c_str()));
|
||||
source.Reply("%s", source.Translate(it->second.description.c_str()));
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void SendSyntax(CommandSource &source) override
|
||||
{
|
||||
auto *value = _("value");
|
||||
auto it = command_data.find(GetAttribute(source.command));
|
||||
if (it != command_data.end() && !it->second.syntax.empty())
|
||||
value = it->second.syntax.c_str();
|
||||
|
||||
this->ClearSyntax();
|
||||
this->SetSyntax(Anope::Format(
|
||||
source.Translate(_("\037channel\037 [\037%s\037]")),
|
||||
source.Translate(value)
|
||||
));
|
||||
|
||||
Command::SendSyntax(source);
|
||||
}
|
||||
};
|
||||
|
||||
class CSSetMisc final
|
||||
@@ -204,37 +267,37 @@ public:
|
||||
|
||||
void OnReload(Configuration::Conf &conf) override
|
||||
{
|
||||
descriptions.clear();
|
||||
numerics.clear();
|
||||
|
||||
command_data.clear();
|
||||
for (int i = 0; i < conf.CountBlock("command"); ++i)
|
||||
{
|
||||
const auto &block = conf.GetBlock("command", i);
|
||||
|
||||
if (block.Get<const Anope::string>("command") != "chanserv/set/misc")
|
||||
continue;
|
||||
|
||||
Anope::string cname = block.Get<const Anope::string>("name");
|
||||
Anope::string desc = block.Get<const Anope::string>("misc_description");
|
||||
|
||||
if (cname.empty() || desc.empty())
|
||||
continue;
|
||||
|
||||
descriptions[cname] = desc;
|
||||
|
||||
// Force creation of the extension item.
|
||||
const auto extname = "cs_set_misc:" + GetAttribute(cname);
|
||||
const auto extname = GetAttribute(cname);
|
||||
GetItem(extname);
|
||||
|
||||
auto numeric = block.Get<unsigned>("misc_numeric");
|
||||
auto &data = command_data[extname];
|
||||
data.description = desc;
|
||||
data.title = block.Get<const Anope::string>("misc_title");
|
||||
data.pattern = block.Get<const Anope::string>("misc_pattern");
|
||||
data.syntax = block.Get<const Anope::string>("misc_syntax");
|
||||
|
||||
const auto numeric = block.Get<unsigned>("misc_numeric");
|
||||
if (numeric >= 1 && numeric <= 999)
|
||||
numerics[extname] = numeric;
|
||||
data.numeric = numeric;
|
||||
}
|
||||
}
|
||||
|
||||
void OnJoinChannel(User *user, Channel *c) override
|
||||
{
|
||||
if (!c->ci || !user->server->IsSynced() || user->server == Me || numerics.empty())
|
||||
if (!c->ci || !user->server->IsSynced() || user->server == Me || command_data.empty())
|
||||
return;
|
||||
|
||||
for (const auto &[name, ext] : items)
|
||||
@@ -243,9 +306,9 @@ public:
|
||||
if (!data)
|
||||
continue;
|
||||
|
||||
auto numeric = numerics.find(name);
|
||||
if (numeric != numerics.end())
|
||||
IRCD->SendNumeric(numeric->second, user->GetUID(), c->ci->name, data->data);
|
||||
auto command = command_data.find(name);
|
||||
if (command != command_data.end() && command->second.numeric)
|
||||
IRCD->SendNumeric(command->second.numeric, user->GetUID(), c->ci->name, data->data);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -257,7 +320,7 @@ public:
|
||||
MiscData *data = e->Get(ci);
|
||||
|
||||
if (data != NULL)
|
||||
info[e->name.substr(12).replace_all_cs("_", " ")] = data->data;
|
||||
info[GetTitle(e)] = data->data;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -18,9 +18,9 @@ class StatusUpdate final
|
||||
: public Module
|
||||
{
|
||||
private:
|
||||
void OnAccessChange(ChannelInfo *ci, ChanAccess *access, bool adding)
|
||||
void OnAccessChange(ChannelInfo *ci, ChanAccess *access, bool migrated, bool adding)
|
||||
{
|
||||
if (!ci->c)
|
||||
if (!ci->c || migrated)
|
||||
return;
|
||||
|
||||
for (const auto &[_, uc] : ci->c->users)
|
||||
@@ -50,14 +50,14 @@ public:
|
||||
{
|
||||
}
|
||||
|
||||
void OnAccessAdd(ChannelInfo *ci, CommandSource &, ChanAccess *access) override
|
||||
void OnAccessAdd(ChannelInfo *ci, CommandSource &, ChanAccess *access, bool migrated) override
|
||||
{
|
||||
OnAccessChange(ci, access, true);
|
||||
OnAccessChange(ci, access, migrated, true);
|
||||
}
|
||||
|
||||
void OnAccessDel(ChannelInfo *ci, CommandSource &, ChanAccess *access) override
|
||||
void OnAccessDel(ChannelInfo *ci, CommandSource &, ChanAccess *access, bool migrated) override
|
||||
{
|
||||
OnAccessChange(ci, access, false);
|
||||
OnAccessChange(ci, access, migrated, false);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -42,25 +42,22 @@ struct CSSuspendInfoType final
|
||||
|
||||
Serializable *Unserialize(Serializable *obj, Serialize::Data &data) const override
|
||||
{
|
||||
Anope::string schan;
|
||||
data["chan"] >> schan;
|
||||
|
||||
CSSuspendInfo *si;
|
||||
if (obj)
|
||||
si = anope_dynamic_static_cast<CSSuspendInfo *>(obj);
|
||||
else
|
||||
{
|
||||
ChannelInfo *ci = ChannelInfo::Find(schan);
|
||||
auto *ci = ChannelInfo::Find(data.Load("chan"));
|
||||
if (!ci)
|
||||
return NULL;
|
||||
si = ci->Extend<CSSuspendInfo>("CS_SUSPENDED");
|
||||
data["chan"] >> si->what;
|
||||
si->what = ci->name;
|
||||
}
|
||||
|
||||
data["by"] >> si->by;
|
||||
data["reason"] >> si->reason;
|
||||
data["time"] >> si->when;
|
||||
data["expires"] >> si->expires;
|
||||
si->by = data.Load("by");
|
||||
si->reason = data.Load("reason");
|
||||
si->when = data.Load<time_t>("time");
|
||||
si->expires = data.Load<time_t>("expires");
|
||||
return si;
|
||||
}
|
||||
};
|
||||
@@ -116,7 +113,7 @@ public:
|
||||
for (auto idx = reason_idx; idx < params.size(); ++idx)
|
||||
reason.append(reason.empty() ? "" : " ").append(params[idx]);
|
||||
|
||||
CSSuspendInfo *si = ci->Extend<CSSuspendInfo>("CS_SUSPENDED");
|
||||
auto *si = ci->Extend<CSSuspendInfo>("CS_SUSPENDED");
|
||||
si->what = ci->name;
|
||||
si->by = source.GetNick();
|
||||
si->reason = reason;
|
||||
@@ -186,7 +183,7 @@ public:
|
||||
}
|
||||
|
||||
/* Only UNSUSPEND already suspended channels */
|
||||
CSSuspendInfo *si = ci->GetExt<CSSuspendInfo>("CS_SUSPENDED");
|
||||
auto *si = ci->GetExt<CSSuspendInfo>("CS_SUSPENDED");
|
||||
if (!si)
|
||||
{
|
||||
source.Reply(_("Channel \002%s\002 isn't suspended."), ci->name.c_str());
|
||||
@@ -254,7 +251,7 @@ public:
|
||||
|
||||
void OnReload(Configuration::Conf &conf) override
|
||||
{
|
||||
Anope::string s = conf.GetModule(this).Get<Anope::string>("show");
|
||||
auto s = conf.GetModule(this).Get<Anope::string>("show");
|
||||
commasepstream(s).GetTokens(show);
|
||||
std::transform(show.begin(), show.end(), show.begin(), trim());
|
||||
}
|
||||
|
||||
@@ -58,7 +58,7 @@ public:
|
||||
{
|
||||
if (!source.GetUser())
|
||||
return;
|
||||
for (User::ChanUserList::iterator it = source.GetUser()->chans.begin(); it != source.GetUser()->chans.end(); ++it)
|
||||
for (auto it = source.GetUser()->chans.begin(); it != source.GetUser()->chans.end(); ++it)
|
||||
{
|
||||
Channel *c = it->second->chan;
|
||||
SetModes(source.GetUser(), c);
|
||||
@@ -143,8 +143,9 @@ class CommandCSDown final
|
||||
auto *memb = c->FindUser(u);
|
||||
if (memb != NULL)
|
||||
{
|
||||
for (size_t i = memb->status.Modes().length(); i > 0;)
|
||||
c->RemoveMode(NULL, ModeManager::FindChannelModeByChar(memb->status.Modes()[--i]), u->GetUID());
|
||||
auto modes = memb->status.Modes();
|
||||
for (auto *mode : modes)
|
||||
c->RemoveMode(NULL, mode, u->GetUID());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -161,7 +162,7 @@ public:
|
||||
{
|
||||
if (!source.GetUser())
|
||||
return;
|
||||
for (User::ChanUserList::iterator it = source.GetUser()->chans.begin(); it != source.GetUser()->chans.end(); ++it)
|
||||
for (auto it = source.GetUser()->chans.begin(); it != source.GetUser()->chans.end(); ++it)
|
||||
{
|
||||
Channel *c = it->second->chan;
|
||||
RemoveAll(source.GetUser(), c);
|
||||
|
||||
+22
-21
@@ -32,7 +32,7 @@ public:
|
||||
|
||||
bool HasPriv(const Anope::string &priv) const override
|
||||
{
|
||||
for (std::vector<Anope::string>::iterator it = std::find(order.begin(), order.end(), this->type); it != order.end(); ++it)
|
||||
for (auto it = std::find(order.begin(), order.end(), this->type); it != order.end(); ++it)
|
||||
{
|
||||
const std::vector<Anope::string> &privs = permissions[*it];
|
||||
if (std::find(privs.begin(), privs.end(), priv) != privs.end())
|
||||
@@ -55,7 +55,7 @@ public:
|
||||
{
|
||||
if (access->provider->name == "access/xop")
|
||||
{
|
||||
const XOPChanAccess *xaccess = anope_dynamic_static_cast<const XOPChanAccess *>(access);
|
||||
const auto *xaccess = anope_dynamic_static_cast<const XOPChanAccess *>(access);
|
||||
return xaccess->type;
|
||||
}
|
||||
else
|
||||
@@ -128,7 +128,7 @@ private:
|
||||
bool override = false;
|
||||
const NickAlias *na = NULL;
|
||||
|
||||
std::vector<Anope::string>::iterator cmd_it = std::find(order.begin(), order.end(), source.command.upper()),
|
||||
auto cmd_it = std::find(order.begin(), order.end(), source.command.upper()),
|
||||
access_it = highest ? std::find(order.begin(), order.end(), XOPChanAccess::DetermineLevel(highest)) : order.end();
|
||||
|
||||
if (!access.founder && (!access.HasPriv("ACCESS_CHANGE") || cmd_it <= access_it))
|
||||
@@ -252,7 +252,7 @@ private:
|
||||
ServiceReference<AccessProvider> provider("AccessProvider", "access/xop");
|
||||
if (!provider)
|
||||
return;
|
||||
XOPChanAccess *acc = anope_dynamic_static_cast<XOPChanAccess *>(provider->Create());
|
||||
auto *acc = anope_dynamic_static_cast<XOPChanAccess *>(provider->Create());
|
||||
acc->SetMask(mask, ci);
|
||||
acc->creator = source.GetNick();
|
||||
acc->description = description;
|
||||
@@ -263,7 +263,7 @@ private:
|
||||
|
||||
Log(override ? LOG_OVERRIDE : LOG_COMMAND, source, this, ci) << "to add " << mask;
|
||||
|
||||
FOREACH_MOD(OnAccessAdd, (ci, source, acc));
|
||||
FOREACH_MOD(OnAccessAdd, (ci, source, acc, false));
|
||||
source.Reply(_("\002%s\002 added to %s %s list."), acc->Mask().c_str(), ci->name.c_str(), source.command.nobreak().c_str());
|
||||
}
|
||||
|
||||
@@ -311,7 +311,7 @@ private:
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<Anope::string>::iterator cmd_it = std::find(order.begin(), order.end(), source.command.upper()),
|
||||
auto cmd_it = std::find(order.begin(), order.end(), source.command.upper()),
|
||||
access_it = highest ? std::find(order.begin(), order.end(), XOPChanAccess::DetermineLevel(highest)) : order.end();
|
||||
|
||||
if (!mask.equals_ci(nc->display) && !access.founder && (!access.HasPriv("ACCESS_CHANGE") || cmd_it <= access_it))
|
||||
@@ -372,7 +372,7 @@ private:
|
||||
nicks += caccess->Mask();
|
||||
|
||||
ci->EraseAccess(number - 1);
|
||||
FOREACH_MOD(OnAccessDel, (ci, source, caccess));
|
||||
FOREACH_MOD(OnAccessDel, (ci, source, caccess, false));
|
||||
delete caccess;
|
||||
}
|
||||
}
|
||||
@@ -395,7 +395,7 @@ private:
|
||||
source.Reply(_("\002%s\002 deleted from %s %s list."), a->Mask().c_str(), ci->name.c_str(), source.command.nobreak().c_str());
|
||||
|
||||
ci->EraseAccess(i);
|
||||
FOREACH_MOD(OnAccessDel, (ci, source, a));
|
||||
FOREACH_MOD(OnAccessDel, (ci, source, a, false));
|
||||
delete a;
|
||||
|
||||
return;
|
||||
@@ -543,7 +543,7 @@ public:
|
||||
|
||||
Anope::string GetDesc(CommandSource &source) const override
|
||||
{
|
||||
return Anope::Format(Language::Translate(source.GetAccount(), _("Modify the list of %s users")), source.command.nobreak().c_str());
|
||||
return Anope::Format(source.Translate(_("Modify the list of %s users")), source.command.nobreak().c_str());
|
||||
}
|
||||
|
||||
void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms) override
|
||||
@@ -604,22 +604,19 @@ public:
|
||||
|
||||
source.Reply(" ");
|
||||
source.Reply(_(
|
||||
"The \002%s\032ADD\002 command adds the given nickname to the "
|
||||
"The \002%s\033ADD\002 command adds the given nickname to the "
|
||||
"%s list."
|
||||
"\n\n"
|
||||
"The \002%s\032DEL\002 command removes the given nick from the "
|
||||
"The \002%s\033DEL\002 command removes the given nick from the "
|
||||
"%s list. If a list of entry numbers is given, those "
|
||||
"entries are deleted. (See the example for LIST below.)"
|
||||
"\n\n"
|
||||
"The \002%s\032LIST\002 command displays the %s list. If "
|
||||
"The \002%s\033LIST\002 command displays the %s list. If "
|
||||
"a wildcard mask is given, only those entries matching the "
|
||||
"mask are displayed. If a list of entry numbers is given, "
|
||||
"only those entries are shown; for example:\n"
|
||||
" \002%s\032#channel\032LIST\0322-5,7-9\002\n"
|
||||
" Lists %s entries numbered 2 through 5 and\n"
|
||||
" 7 through 9."
|
||||
"only those entries are shown."
|
||||
"\n\n"
|
||||
"The \002%s\032CLEAR\002 command clears all entries of the "
|
||||
"The \002%s\033CLEAR\002 command clears all entries of the "
|
||||
"%s list."
|
||||
),
|
||||
cmd.c_str(),
|
||||
@@ -629,14 +626,18 @@ public:
|
||||
cmd.c_str(),
|
||||
cmd.c_str(),
|
||||
cmd.c_str(),
|
||||
cmd.c_str(),
|
||||
cmd.c_str(),
|
||||
cmd.c_str());
|
||||
|
||||
ExampleWrapper examples;
|
||||
examples.AddEntry("#channel LIST 2-5,7-9", _(
|
||||
"Lists access entries numbered 2 through 5 and 7 through 9."
|
||||
));
|
||||
examples.SendTo(source);
|
||||
|
||||
BotInfo *access_bi, *flags_bi;
|
||||
Anope::string access_cmd, flags_cmd;
|
||||
Command::FindCommandFromService("chanserv/access", access_bi, access_cmd);
|
||||
Command::FindCommandFromService("chanserv/flags", flags_bi, flags_cmd);
|
||||
Command::FindFromService("chanserv/access", access_bi, access_cmd);
|
||||
Command::FindFromService("chanserv/flags", flags_bi, flags_cmd);
|
||||
if (!access_cmd.empty() || !flags_cmd.empty())
|
||||
{
|
||||
source.Reply(_("Alternative methods of modifying channel access lists are available."));
|
||||
|
||||
@@ -235,7 +235,7 @@ class MChanstats final
|
||||
for (int i = 0; i < r.Rows(); ++i)
|
||||
{
|
||||
const std::map<Anope::string, Anope::string> &map = r.Row(i);
|
||||
for (std::map<Anope::string, Anope::string>::const_iterator it = map.begin(); it != map.end(); ++it)
|
||||
for (auto it = map.begin(); it != map.end(); ++it)
|
||||
TableList.push_back(it->second);
|
||||
}
|
||||
query = "SHOW PROCEDURE STATUS WHERE `Db` = Database();";
|
||||
@@ -254,7 +254,7 @@ class MChanstats final
|
||||
|
||||
bool HasTable(const Anope::string &table)
|
||||
{
|
||||
for (std::vector<Anope::string>::const_iterator it = TableList.begin(); it != TableList.end(); ++it)
|
||||
for (auto it = TableList.begin(); it != TableList.end(); ++it)
|
||||
if (*it == table)
|
||||
return true;
|
||||
return false;
|
||||
@@ -262,7 +262,7 @@ class MChanstats final
|
||||
|
||||
bool HasProcedure(const Anope::string &table)
|
||||
{
|
||||
for (std::vector<Anope::string>::const_iterator it = ProcedureList.begin(); it != ProcedureList.end(); ++it)
|
||||
for (auto it = ProcedureList.begin(); it != ProcedureList.end(); ++it)
|
||||
if (*it == table)
|
||||
return true;
|
||||
return false;
|
||||
@@ -270,7 +270,7 @@ class MChanstats final
|
||||
|
||||
bool HasEvent(const Anope::string &table)
|
||||
{
|
||||
for (std::vector<Anope::string>::const_iterator it = EventList.begin(); it != EventList.end(); ++it)
|
||||
for (auto it = EventList.begin(); it != EventList.end(); ++it)
|
||||
if (*it == table)
|
||||
return true;
|
||||
return false;
|
||||
@@ -509,7 +509,7 @@ public:
|
||||
void OnReload(Configuration::Conf &conf) override
|
||||
{
|
||||
const auto &block = conf.GetModule(this);
|
||||
prefix = block.Get<const Anope::string>("prefix", "anope_");
|
||||
prefix = block.Get<const Anope::string>("prefix", "chanstats21_");
|
||||
SmileysHappy = block.Get<const Anope::string>("SmileysHappy");
|
||||
SmileysSad = block.Get<const Anope::string>("SmileysSad");
|
||||
SmileysOther = block.Get<const Anope::string>("SmileysOther");
|
||||
|
||||
@@ -170,6 +170,8 @@ private:
|
||||
ServiceReference<XLineManager> sglinemgr;
|
||||
ServiceReference<XLineManager> snlinemgr;
|
||||
ServiceReference<XLineManager> sqlinemgr;
|
||||
Anope::map<Anope::string> csmiscdata;
|
||||
Anope::map<Anope::string> nsmiscdata;
|
||||
|
||||
Anope::map<std::function<bool(DBAtheme*,AthemeRow&)>> rowhandlers = {
|
||||
{ "AC", &DBAtheme::HandleIgnore },
|
||||
@@ -251,7 +253,7 @@ private:
|
||||
}
|
||||
}
|
||||
|
||||
void ApplyFlags(Extensible *ext, Anope::string &flags, char flag, const char* extname, bool extend = true)
|
||||
void ApplyFlags(Extensible *ext, Anope::string &flags, char flag, const char *extname, bool extend = true)
|
||||
{
|
||||
auto pos = flags.find(flag);
|
||||
auto has_flag = (pos != Anope::string::npos);
|
||||
@@ -653,7 +655,7 @@ private:
|
||||
auto *access = accessprov->Create();
|
||||
access->SetMask(mask, ci);
|
||||
access->creator = setter;
|
||||
access->description = "Imported from Atheme: " + flags;
|
||||
access->description = "Imported from Atheme: " + originalflags;
|
||||
access->last_seen = modifiedtime;
|
||||
access->created = modifiedtime;
|
||||
access->AccessUnserialize(accessflags);
|
||||
@@ -1080,7 +1082,26 @@ private:
|
||||
data->data = value;
|
||||
}
|
||||
else
|
||||
Log(this) << "Unknown channel metadata for " << ci->name << ": " << key << " = " << value;
|
||||
{
|
||||
auto it = csmiscdata.find(key);
|
||||
if (it == csmiscdata.end())
|
||||
{
|
||||
Log(this) << "Unknown channel metadata for " << ci->name << ": " << key << " = " << value;
|
||||
return true;
|
||||
}
|
||||
|
||||
ExtensibleRef<MiscData> extref("cs_set_misc:" + it->second);
|
||||
if (!extref)
|
||||
{
|
||||
Log(this) << "Unknown imported channel metadata for " << ci->name << ": " << it->second << " = " << value;
|
||||
return true;
|
||||
}
|
||||
|
||||
auto *data = extref->Set(ci);
|
||||
data->object = ci->name;
|
||||
data->name = it->second;
|
||||
data->data = value;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -1193,7 +1214,26 @@ private:
|
||||
data->data = value;
|
||||
}
|
||||
else
|
||||
Log(this) << "Unknown account metadata for " << nc->display << ": " << key << " = " << value;
|
||||
{
|
||||
auto it = nsmiscdata.find(key);
|
||||
if (it == nsmiscdata.end())
|
||||
{
|
||||
Log(this) << "Unknown public account metadata for " << nc->display << ": " << key << " = " << value;
|
||||
return true;
|
||||
}
|
||||
|
||||
ExtensibleRef<MiscData> extref("ns_set_misc:" + it->second);
|
||||
if (!extref)
|
||||
{
|
||||
Log(this) << "Unknown imported account metadata for " << nc->display << ": " << key << " = " << value;
|
||||
return true;
|
||||
}
|
||||
|
||||
auto *data = extref->Set(nc);
|
||||
data->object = nc->display;
|
||||
data->name = it->second;
|
||||
data->data = value;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -1541,6 +1581,28 @@ public:
|
||||
|
||||
void OnReload(Configuration::Conf &conf) override
|
||||
{
|
||||
const auto &modconf = conf.GetModule(this);
|
||||
|
||||
csmiscdata.clear();
|
||||
for (auto idx = 0; idx < modconf.CountBlock("cs_set_misc"); ++idx)
|
||||
{
|
||||
const auto &data = modconf.GetBlock("cs_set_misc", idx);
|
||||
const auto &anope = data.Get<const Anope::string>("anope");
|
||||
const auto &atheme = data.Get<const Anope::string>("atheme");
|
||||
if (!anope.empty() && !atheme.empty())
|
||||
csmiscdata[atheme] = anope.upper();
|
||||
}
|
||||
|
||||
nsmiscdata.clear();
|
||||
for (auto idx = 0; idx < modconf.CountBlock("ns_set_misc"); ++idx)
|
||||
{
|
||||
const auto &data = modconf.GetBlock("ns_set_misc", idx);
|
||||
const auto &anope = data.Get<const Anope::string>("anope");
|
||||
const auto &atheme = data.Get<const Anope::string>("atheme");
|
||||
if (!anope.empty() && !atheme.empty())
|
||||
nsmiscdata[atheme] = anope.upper();
|
||||
}
|
||||
|
||||
flags.clear();
|
||||
for (int i = 0; i < Config->CountBlock("privilege"); ++i)
|
||||
{
|
||||
|
||||
@@ -21,7 +21,6 @@ public:
|
||||
std::fstream *fs;
|
||||
Serializable::Id id = 0;
|
||||
std::map<Anope::string, Anope::string> data;
|
||||
std::stringstream ss;
|
||||
bool read = false;
|
||||
|
||||
LoadData(std::fstream &fsref)
|
||||
@@ -29,7 +28,7 @@ public:
|
||||
{
|
||||
}
|
||||
|
||||
std::iostream &operator[](const Anope::string &key) override
|
||||
bool LoadInternal(const Anope::string &key, Anope::string &value) override
|
||||
{
|
||||
if (!read)
|
||||
{
|
||||
@@ -51,9 +50,13 @@ public:
|
||||
read = true;
|
||||
}
|
||||
|
||||
ss.clear();
|
||||
this->ss << this->data[key];
|
||||
return this->ss;
|
||||
value = this->data[key];
|
||||
return true;
|
||||
}
|
||||
|
||||
bool StoreInternal(const Anope::string &key, const Anope::string &value) override
|
||||
{
|
||||
return false; // This module can only load data.
|
||||
}
|
||||
|
||||
size_t Hash() const override
|
||||
|
||||
@@ -38,7 +38,7 @@ public:
|
||||
Serializable::Id id = 0;
|
||||
|
||||
// Data in this database entry.
|
||||
Anope::map<std::stringstream> data;
|
||||
Anope::unordered_map<Anope::string> data;
|
||||
|
||||
// Used when writing data.
|
||||
Data(Serialize::Type *s_type, Serializable *obj)
|
||||
@@ -58,7 +58,7 @@ public:
|
||||
if (yyjson_get_type(key) != YYJSON_TYPE_STR)
|
||||
continue;
|
||||
|
||||
auto akey = yyjson_get_astr(key);
|
||||
const auto akey = yyjson_get_astr(key);
|
||||
if (akey.equals_ci("@id"))
|
||||
{
|
||||
this->id = yyjson_get_uint(value);
|
||||
@@ -66,23 +66,28 @@ public:
|
||||
}
|
||||
|
||||
if (yyjson_is_bool(value))
|
||||
data[akey] << yyjson_get_bool(value);
|
||||
data[akey] = Anope::ToString(yyjson_get_bool(value));
|
||||
else if (yyjson_is_int(value))
|
||||
data[akey] << yyjson_get_int(value);
|
||||
data[akey] = Anope::ToString(yyjson_get_int(value));
|
||||
else if (yyjson_is_null(value))
|
||||
data[akey];
|
||||
else if (yyjson_is_real(value))
|
||||
data[akey] << yyjson_get_real(value);
|
||||
data[akey] = Anope::ToString(yyjson_get_real(value));
|
||||
else if (yyjson_is_str(value))
|
||||
data[akey] << yyjson_get_astr(value);
|
||||
data[akey] = Anope::ToString(yyjson_get_astr(value));
|
||||
else if (yyjson_is_uint(value))
|
||||
data[akey] << yyjson_get_uint(value);
|
||||
data[akey] = Anope::ToString(yyjson_get_uint(value));
|
||||
}
|
||||
}
|
||||
|
||||
std::iostream &operator[](const Anope::string &key) override
|
||||
bool LoadInternal(const Anope::string &key, Anope::string &value) override
|
||||
{
|
||||
return data[key];
|
||||
auto it = this->data.find(key);
|
||||
if (it == this->data.end())
|
||||
return false;
|
||||
|
||||
value = it->second;
|
||||
return true;
|
||||
}
|
||||
|
||||
size_t Hash() const override
|
||||
@@ -96,6 +101,12 @@ public:
|
||||
}
|
||||
return hash;
|
||||
}
|
||||
|
||||
bool StoreInternal(const Anope::string &key, const Anope::string &value) override
|
||||
{
|
||||
this->data[key] = value;
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
class DBJSON final
|
||||
@@ -219,7 +230,12 @@ private:
|
||||
return;
|
||||
|
||||
for (auto it = entries.first; it != entries.second; ++it)
|
||||
s_type->Unserialize(nullptr, it->second);
|
||||
{
|
||||
auto &data = it->second;
|
||||
auto *obj = s_type->Unserialize(nullptr, data);
|
||||
if (obj && data.id)
|
||||
obj->object_id = data.id;
|
||||
}
|
||||
}
|
||||
|
||||
std::optional<DBData> ReadDatabase(const Anope::string &dbname)
|
||||
@@ -313,22 +329,23 @@ private:
|
||||
switch (data.GetType(key))
|
||||
{
|
||||
case Serialize::DataType::BOOL:
|
||||
v = yyjson_mut_bool(doc, Anope::Convert<bool>(value.str(), false));
|
||||
v = yyjson_mut_bool(doc, Anope::Convert<bool>(value, false));
|
||||
break;
|
||||
case Serialize::DataType::FLOAT:
|
||||
v = yyjson_mut_real(doc, Anope::Convert<double>(value.str(), 0.0));
|
||||
v = yyjson_mut_real(doc, Anope::Convert<double>(value, 0.0));
|
||||
break;
|
||||
case Serialize::DataType::INT:
|
||||
v = yyjson_mut_int(doc, Anope::Convert<int64_t>(value.str(), 0));
|
||||
v = yyjson_mut_int(doc, Anope::Convert<int64_t>(value, 0));
|
||||
break;
|
||||
case Serialize::DataType::TEXT:
|
||||
{
|
||||
auto str = value.str();
|
||||
v = str.empty() ? yyjson_mut_null(doc) : yyjson_mut_strncpy(doc, str.c_str(), str.length());
|
||||
v = value.empty()
|
||||
? yyjson_mut_null(doc)
|
||||
: yyjson_mut_strncpy(doc, value.c_str(), value.length());
|
||||
break;
|
||||
}
|
||||
case Serialize::DataType::UINT:
|
||||
v = yyjson_mut_uint(doc, Anope::Convert<uint64_t>(value.str(), 0));
|
||||
v = yyjson_mut_uint(doc, Anope::Convert<uint64_t>(value, 0));
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -395,9 +412,18 @@ public:
|
||||
// Step 2: store the new data.
|
||||
for (auto *item : Serializable::GetItems())
|
||||
{
|
||||
if (!item->ShouldCommit())
|
||||
{
|
||||
Log(LOG_DEBUG) << "Not committing dead " << item->GetSerializableName() << " object: " << item;
|
||||
continue; // Non-committable object.
|
||||
}
|
||||
|
||||
auto *s_type = item->GetSerializableType();
|
||||
if (!s_type)
|
||||
{
|
||||
Log(LOG_DEBUG) << "Not committing orphaned " << item->GetSerializableName() << " object: " << item;
|
||||
continue; // Provider has been unloaded.
|
||||
}
|
||||
|
||||
// This should always be found because we create it in the previous step.
|
||||
auto it = databases.find(s_type->GetOwner());
|
||||
|
||||
@@ -1,646 +0,0 @@
|
||||
// Anope IRC Services <https://www.anope.org/>
|
||||
//
|
||||
// Copyright (C) 2003-2026 Anope Contributors
|
||||
//
|
||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||
// for the complete terms of this license and docs/AUTHORS.txt for a list of
|
||||
// contributors.
|
||||
//
|
||||
// Based on the original code of Epona by Lara
|
||||
// Based on the original code of Services by Andy Church
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
|
||||
#include "module.h"
|
||||
#include "modules/redis.h"
|
||||
|
||||
using namespace Redis;
|
||||
|
||||
class DatabaseRedis;
|
||||
static DatabaseRedis *me;
|
||||
|
||||
class Data final
|
||||
: public Serialize::Data
|
||||
{
|
||||
public:
|
||||
std::map<Anope::string, std::stringstream *> data;
|
||||
|
||||
~Data() override
|
||||
{
|
||||
for (auto &[_, stream] : data)
|
||||
delete stream;
|
||||
}
|
||||
|
||||
std::iostream &operator[](const Anope::string &key) override
|
||||
{
|
||||
std::stringstream *&stream = data[key];
|
||||
if (!stream)
|
||||
stream = new std::stringstream();
|
||||
return *stream;
|
||||
}
|
||||
|
||||
size_t Hash() const override
|
||||
{
|
||||
size_t hash = 0;
|
||||
for (const auto &[_, value] : this->data)
|
||||
if (!value->str().empty())
|
||||
hash ^= Anope::hash_cs()(value->str());
|
||||
return hash;
|
||||
}
|
||||
};
|
||||
|
||||
class TypeLoader final
|
||||
: public Interface
|
||||
{
|
||||
Anope::string type;
|
||||
public:
|
||||
TypeLoader(Module *creator, const Anope::string &t) : Interface(creator), type(t) { }
|
||||
|
||||
void OnResult(const Reply &r) override;
|
||||
};
|
||||
|
||||
class ObjectLoader final
|
||||
: public Interface
|
||||
{
|
||||
Anope::string type;
|
||||
int64_t id;
|
||||
|
||||
public:
|
||||
ObjectLoader(Module *creator, const Anope::string &t, int64_t i) : Interface(creator), type(t), id(i) { }
|
||||
|
||||
void OnResult(const Reply &r) override;
|
||||
};
|
||||
|
||||
class IDInterface final
|
||||
: public Interface
|
||||
{
|
||||
Reference<Serializable> o;
|
||||
public:
|
||||
IDInterface(Module *creator, Serializable *obj) : Interface(creator), o(obj) { }
|
||||
|
||||
void OnResult(const Reply &r) override;
|
||||
};
|
||||
|
||||
class Deleter final
|
||||
: public Interface
|
||||
{
|
||||
Anope::string type;
|
||||
int64_t id;
|
||||
public:
|
||||
Deleter(Module *creator, const Anope::string &t, int64_t i) : Interface(creator), type(t), id(i) { }
|
||||
|
||||
void OnResult(const Reply &r) override;
|
||||
};
|
||||
|
||||
class Updater final
|
||||
: public Interface
|
||||
{
|
||||
Anope::string type;
|
||||
int64_t id;
|
||||
public:
|
||||
Updater(Module *creator, const Anope::string &t, int64_t i) : Interface(creator), type(t), id(i) { }
|
||||
|
||||
void OnResult(const Reply &r) override;
|
||||
};
|
||||
|
||||
class ModifiedObject final
|
||||
: public Interface
|
||||
{
|
||||
Anope::string type;
|
||||
int64_t id;
|
||||
public:
|
||||
ModifiedObject(Module *creator, const Anope::string &t, int64_t i) : Interface(creator), type(t), id(i) { }
|
||||
|
||||
void OnResult(const Reply &r) override;
|
||||
};
|
||||
|
||||
class SubscriptionListener final
|
||||
: public Interface
|
||||
{
|
||||
public:
|
||||
SubscriptionListener(Module *creator) : Interface(creator) { }
|
||||
|
||||
void OnResult(const Reply &r) override;
|
||||
};
|
||||
|
||||
class DatabaseRedis final
|
||||
: public Module
|
||||
, public Pipe
|
||||
{
|
||||
SubscriptionListener sl;
|
||||
std::set<Serializable *> updated_items;
|
||||
|
||||
public:
|
||||
ServiceReference<Provider> redis;
|
||||
|
||||
DatabaseRedis(const Anope::string &modname, const Anope::string &creator)
|
||||
: Module(modname, creator, DATABASE | VENDOR)
|
||||
, sl(this)
|
||||
, redis("Redis::Provider")
|
||||
{
|
||||
me = this;
|
||||
|
||||
}
|
||||
|
||||
/* Insert or update an object */
|
||||
void InsertObject(Serializable *obj)
|
||||
{
|
||||
Serialize::Type *t = obj->GetSerializableType();
|
||||
|
||||
/* If there is no id yet for this object, get one */
|
||||
if (!obj->object_id)
|
||||
redis->SendCommand(new IDInterface(this, obj), "INCR id:" + t->GetName());
|
||||
else
|
||||
{
|
||||
Data data;
|
||||
t->Serialize(obj, data);
|
||||
|
||||
if (obj->IsCached(data))
|
||||
return;
|
||||
|
||||
obj->UpdateCache(data);
|
||||
|
||||
std::vector<Anope::string> args;
|
||||
args.emplace_back("HGETALL");
|
||||
args.push_back("hash:" + t->GetName() + ":" + Anope::ToString(obj->object_id));
|
||||
|
||||
/* Get object attrs to clear before updating */
|
||||
redis->SendCommand(new Updater(this, t->GetName(), obj->object_id), args);
|
||||
}
|
||||
}
|
||||
|
||||
void OnNotify() override
|
||||
{
|
||||
for (auto *obj : this->updated_items)
|
||||
{
|
||||
this->InsertObject(obj);
|
||||
}
|
||||
|
||||
this->updated_items.clear();
|
||||
}
|
||||
|
||||
void OnReload(Configuration::Conf &conf) override
|
||||
{
|
||||
const auto &block = conf.GetModule(this);
|
||||
this->redis.SetServiceName(block.Get<const Anope::string>("engine", "redis/main"));
|
||||
}
|
||||
|
||||
EventReturn OnLoadDatabase() override
|
||||
{
|
||||
if (!redis)
|
||||
{
|
||||
Log(this) << "Unable to load database - unable to find redis provider";
|
||||
return EVENT_CONTINUE;
|
||||
}
|
||||
|
||||
for (const auto &type_order : Serialize::Type::GetTypeOrder())
|
||||
{
|
||||
Serialize::Type *sb = Serialize::Type::Find(type_order);
|
||||
this->OnSerializeTypeCreate(sb);
|
||||
}
|
||||
|
||||
while (!redis->IsSocketDead() && redis->BlockAndProcess());
|
||||
|
||||
if (redis->IsSocketDead())
|
||||
{
|
||||
Log(this) << "I/O error while loading redis database - is it online?";
|
||||
return EVENT_CONTINUE;
|
||||
}
|
||||
|
||||
redis->Subscribe(&this->sl, "__keyspace@*__:hash:*");
|
||||
|
||||
return EVENT_STOP;
|
||||
}
|
||||
|
||||
void OnSerializeTypeCreate(Serialize::Type *sb) override
|
||||
{
|
||||
if (!redis)
|
||||
return;
|
||||
|
||||
std::vector<Anope::string> args;
|
||||
args.emplace_back("SMEMBERS");
|
||||
args.push_back("ids:" + sb->GetName());
|
||||
|
||||
redis->SendCommand(new TypeLoader(this, sb->GetName()), args);
|
||||
}
|
||||
|
||||
void OnSerializableConstruct(Serializable *obj) override
|
||||
{
|
||||
this->updated_items.insert(obj);
|
||||
this->Notify();
|
||||
}
|
||||
|
||||
void OnSerializableDestruct(Serializable *obj) override
|
||||
{
|
||||
Serialize::Type *t = obj->GetSerializableType();
|
||||
|
||||
if (t == NULL)
|
||||
{
|
||||
/* This is probably the module providing the type unloading.
|
||||
*
|
||||
* The types get registered after the extensible container is
|
||||
* registered so that unserialization on module load can insert
|
||||
* into the extensible container. So, the type destructs prior to
|
||||
* the extensible container, which then triggers this
|
||||
*/
|
||||
return;
|
||||
}
|
||||
|
||||
std::vector<Anope::string> args;
|
||||
args.emplace_back("HGETALL");
|
||||
args.push_back("hash:" + t->GetName() + ":" + Anope::ToString(obj->object_id));
|
||||
|
||||
/* Get all of the attributes for this object */
|
||||
redis->SendCommand(new Deleter(this, t->GetName(), obj->object_id), args);
|
||||
|
||||
this->updated_items.erase(obj);
|
||||
t->objects.erase(obj->object_id);
|
||||
this->Notify();
|
||||
}
|
||||
|
||||
void OnSerializableUpdate(Serializable *obj) override
|
||||
{
|
||||
this->updated_items.insert(obj);
|
||||
this->Notify();
|
||||
}
|
||||
};
|
||||
|
||||
void TypeLoader::OnResult(const Reply &r)
|
||||
{
|
||||
if (r.type != Reply::MULTI_BULK || !me->redis)
|
||||
{
|
||||
delete this;
|
||||
return;
|
||||
}
|
||||
|
||||
for (auto *reply : r.multi_bulk)
|
||||
{
|
||||
if (reply->type != Reply::BULK)
|
||||
continue;
|
||||
|
||||
auto i = Anope::TryConvert<int64_t>(reply->bulk);
|
||||
if (!i)
|
||||
continue;
|
||||
|
||||
auto id = i.value();
|
||||
std::vector<Anope::string> args;
|
||||
args.emplace_back("HGETALL");
|
||||
args.push_back("hash:" + this->type + ":" + Anope::ToString(id));
|
||||
|
||||
me->redis->SendCommand(new ObjectLoader(me, this->type, id), args);
|
||||
}
|
||||
|
||||
delete this;
|
||||
}
|
||||
|
||||
void ObjectLoader::OnResult(const Reply &r)
|
||||
{
|
||||
Serialize::Type *st = Serialize::Type::Find(this->type);
|
||||
|
||||
if (r.type != Reply::MULTI_BULK || r.multi_bulk.empty() || !me->redis || !st)
|
||||
{
|
||||
delete this;
|
||||
return;
|
||||
}
|
||||
|
||||
Data data;
|
||||
|
||||
for (unsigned i = 0; i + 1 < r.multi_bulk.size(); i += 2)
|
||||
{
|
||||
const Reply *key = r.multi_bulk[i],
|
||||
*value = r.multi_bulk[i + 1];
|
||||
|
||||
data[key->bulk] << value->bulk;
|
||||
}
|
||||
|
||||
Serializable *&obj = st->objects[this->id];
|
||||
obj = st->Unserialize(obj, data);
|
||||
if (obj)
|
||||
{
|
||||
obj->object_id = this->id;
|
||||
obj->UpdateCache(data);
|
||||
}
|
||||
|
||||
delete this;
|
||||
}
|
||||
|
||||
void IDInterface::OnResult(const Reply &r)
|
||||
{
|
||||
if (!o || r.type != Reply::INT || !r.i)
|
||||
{
|
||||
delete this;
|
||||
return;
|
||||
}
|
||||
|
||||
Serializable *&obj = o->GetSerializableType()->objects[r.i];
|
||||
if (obj)
|
||||
/* This shouldn't be possible */
|
||||
obj->object_id = 0;
|
||||
|
||||
o->object_id = r.i;
|
||||
obj = o;
|
||||
|
||||
/* Now that we have the id, insert this object for real */
|
||||
anope_dynamic_static_cast<DatabaseRedis *>(this->owner)->InsertObject(o);
|
||||
|
||||
delete this;
|
||||
}
|
||||
|
||||
void Deleter::OnResult(const Reply &r)
|
||||
{
|
||||
if (r.type != Reply::MULTI_BULK || !me->redis || r.multi_bulk.empty())
|
||||
{
|
||||
delete this;
|
||||
return;
|
||||
}
|
||||
|
||||
/* Transaction start */
|
||||
me->redis->StartTransaction();
|
||||
|
||||
std::vector<Anope::string> args;
|
||||
args.emplace_back("DEL");
|
||||
args.push_back("hash:" + this->type + ":" + Anope::ToString(this->id));
|
||||
|
||||
/* Delete hash object */
|
||||
me->redis->SendCommand(NULL, args);
|
||||
|
||||
args.clear();
|
||||
args.emplace_back("SREM");
|
||||
args.push_back("ids:" + this->type);
|
||||
args.push_back(Anope::ToString(this->id));
|
||||
|
||||
/* Delete id from ids set */
|
||||
me->redis->SendCommand(NULL, args);
|
||||
|
||||
for (unsigned i = 0; i + 1 < r.multi_bulk.size(); i += 2)
|
||||
{
|
||||
const Reply *key = r.multi_bulk[i],
|
||||
*value = r.multi_bulk[i + 1];
|
||||
|
||||
args.clear();
|
||||
args.emplace_back("SREM");
|
||||
args.push_back("value:" + this->type + ":" + key->bulk + ":" + value->bulk);
|
||||
args.push_back(Anope::ToString(this->id));
|
||||
|
||||
/* Delete value -> object id */
|
||||
me->redis->SendCommand(NULL, args);
|
||||
}
|
||||
|
||||
/* Transaction end */
|
||||
me->redis->CommitTransaction();
|
||||
|
||||
delete this;
|
||||
}
|
||||
|
||||
void Updater::OnResult(const Reply &r)
|
||||
{
|
||||
Serialize::Type *st = Serialize::Type::Find(this->type);
|
||||
|
||||
if (!st)
|
||||
{
|
||||
delete this;
|
||||
return;
|
||||
}
|
||||
|
||||
Serializable *obj = st->objects[this->id];
|
||||
if (!obj)
|
||||
{
|
||||
delete this;
|
||||
return;
|
||||
}
|
||||
|
||||
Data data;
|
||||
st->Serialize(obj, data);
|
||||
|
||||
/* Transaction start */
|
||||
me->redis->StartTransaction();
|
||||
|
||||
for (unsigned i = 0; i + 1 < r.multi_bulk.size(); i += 2)
|
||||
{
|
||||
const Reply *key = r.multi_bulk[i],
|
||||
*value = r.multi_bulk[i + 1];
|
||||
|
||||
std::vector<Anope::string> args;
|
||||
args.emplace_back("SREM");
|
||||
args.push_back("value:" + this->type + ":" + key->bulk + ":" + value->bulk);
|
||||
args.push_back(Anope::ToString(this->id));
|
||||
|
||||
/* Delete value -> object id */
|
||||
me->redis->SendCommand(NULL, args);
|
||||
}
|
||||
|
||||
/* Add object id to id set for this type */
|
||||
std::vector<Anope::string> args;
|
||||
args.emplace_back("SADD");
|
||||
args.push_back("ids:" + this->type);
|
||||
args.push_back(Anope::ToString(obj->object_id));
|
||||
me->redis->SendCommand(NULL, args);
|
||||
|
||||
args.clear();
|
||||
args.emplace_back("HMSET");
|
||||
args.push_back("hash:" + this->type + ":" + Anope::ToString(obj->object_id));
|
||||
|
||||
for (const auto &[key, value] : data.data)
|
||||
{
|
||||
args.push_back(key);
|
||||
args.emplace_back(value->str());
|
||||
|
||||
std::vector<Anope::string> args2;
|
||||
|
||||
args2.emplace_back("SADD");
|
||||
args2.push_back("value:" + this->type + ":" + key + ":" + value->str());
|
||||
args2.push_back(Anope::ToString(obj->object_id));
|
||||
|
||||
/* Add to value -> object id set */
|
||||
me->redis->SendCommand(NULL, args2);
|
||||
}
|
||||
|
||||
++obj->redis_ignore;
|
||||
|
||||
/* Add object */
|
||||
me->redis->SendCommand(NULL, args);
|
||||
|
||||
/* Transaction end */
|
||||
me->redis->CommitTransaction();
|
||||
|
||||
delete this;
|
||||
}
|
||||
|
||||
void SubscriptionListener::OnResult(const Reply &r)
|
||||
{
|
||||
/*
|
||||
* [May 15 13:59:35.645839 2013] Debug: pmessage
|
||||
* [May 15 13:59:35.645866 2013] Debug: __keyspace@*__:anope:hash:*
|
||||
* [May 15 13:59:35.645880 2013] Debug: __keyspace@0__:anope:hash:type:id
|
||||
* [May 15 13:59:35.645893 2013] Debug: hset
|
||||
*/
|
||||
if (r.multi_bulk.size() != 4)
|
||||
return;
|
||||
|
||||
size_t sz = r.multi_bulk[2]->bulk.find(':');
|
||||
if (sz == Anope::string::npos)
|
||||
return;
|
||||
|
||||
const Anope::string &key = r.multi_bulk[2]->bulk.substr(sz + 1),
|
||||
&op = r.multi_bulk[3]->bulk;
|
||||
|
||||
sz = key.rfind(':');
|
||||
if (sz == Anope::string::npos)
|
||||
return;
|
||||
|
||||
const Anope::string &id = key.substr(sz + 1);
|
||||
|
||||
size_t sz2 = key.rfind(':', sz - 1);
|
||||
if (sz2 == Anope::string::npos)
|
||||
return;
|
||||
const Anope::string &type = key.substr(sz2 + 1, sz - sz2 - 1);
|
||||
|
||||
Serialize::Type *s_type = Serialize::Type::Find(type);
|
||||
|
||||
if (s_type == NULL)
|
||||
return;
|
||||
|
||||
auto oid = Anope::TryConvert<Serializable::Id>(id);
|
||||
if (!oid.has_value())
|
||||
return;
|
||||
|
||||
auto obj_id = oid.value();
|
||||
if (op == "hset" || op == "hdel")
|
||||
{
|
||||
Serializable *s = s_type->objects[obj_id];
|
||||
|
||||
if (s && s->redis_ignore)
|
||||
{
|
||||
--s->redis_ignore;
|
||||
Log(LOG_DEBUG) << "redis: notify: got modify for object id " << obj_id << " of type " << type << ", but I am ignoring it";
|
||||
}
|
||||
else
|
||||
{
|
||||
Log(LOG_DEBUG) << "redis: notify: got modify for object id " << obj_id << " of type " << type;
|
||||
|
||||
std::vector<Anope::string> args;
|
||||
args.emplace_back("HGETALL");
|
||||
args.push_back("hash:" + type + ":" + id);
|
||||
|
||||
me->redis->SendCommand(new ModifiedObject(me, type, obj_id), args);
|
||||
}
|
||||
}
|
||||
else if (op == "del")
|
||||
{
|
||||
Serializable *&s = s_type->objects[obj_id];
|
||||
if (s == NULL)
|
||||
return;
|
||||
|
||||
Log(LOG_DEBUG) << "redis: notify: deleting object id " << obj_id << " of type " << type;
|
||||
|
||||
Data data;
|
||||
s_type->Serialize(s, data);
|
||||
|
||||
/* Transaction start */
|
||||
me->redis->StartTransaction();
|
||||
|
||||
for (const auto &[k, value] : data.data)
|
||||
{
|
||||
std::vector<Anope::string> args;
|
||||
args.emplace_back("SREM");
|
||||
args.push_back("value:" + type + ":" + k + ":" + value->str());
|
||||
args.push_back(id);
|
||||
|
||||
/* Delete value -> object id */
|
||||
me->redis->SendCommand(NULL, args);
|
||||
}
|
||||
|
||||
std::vector<Anope::string> args;
|
||||
args.emplace_back("SREM");
|
||||
args.push_back("ids:" + type);
|
||||
args.push_back(Anope::ToString(s->object_id));
|
||||
|
||||
/* Delete object from id set */
|
||||
me->redis->SendCommand(NULL, args);
|
||||
|
||||
/* Transaction end */
|
||||
me->redis->CommitTransaction();
|
||||
|
||||
delete s;
|
||||
s = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void ModifiedObject::OnResult(const Reply &r)
|
||||
{
|
||||
Serialize::Type *st = Serialize::Type::Find(this->type);
|
||||
|
||||
if (!st)
|
||||
{
|
||||
delete this;
|
||||
return;
|
||||
}
|
||||
|
||||
Serializable *&obj = st->objects[this->id];
|
||||
|
||||
/* Transaction start */
|
||||
me->redis->StartTransaction();
|
||||
|
||||
/* Erase old object values */
|
||||
if (obj)
|
||||
{
|
||||
Data data;
|
||||
st->Serialize(obj, data);
|
||||
|
||||
for (auto &[key, value] : data.data)
|
||||
{
|
||||
std::vector<Anope::string> args;
|
||||
args.emplace_back("SREM");
|
||||
args.push_back("value:" + st->GetName() + ":" + key + ":" + value->str());
|
||||
args.push_back(Anope::ToString(this->id));
|
||||
|
||||
/* Delete value -> object id */
|
||||
me->redis->SendCommand(NULL, args);
|
||||
}
|
||||
}
|
||||
|
||||
Data data;
|
||||
|
||||
for (unsigned i = 0; i + 1 < r.multi_bulk.size(); i += 2)
|
||||
{
|
||||
const Reply *key = r.multi_bulk[i],
|
||||
*value = r.multi_bulk[i + 1];
|
||||
|
||||
data[key->bulk] << value->bulk;
|
||||
}
|
||||
|
||||
obj = st->Unserialize(obj, data);
|
||||
if (obj)
|
||||
{
|
||||
obj->object_id = this->id;
|
||||
obj->UpdateCache(data);
|
||||
|
||||
/* Insert new object values */
|
||||
for (const auto &[key, value] : data.data)
|
||||
{
|
||||
std::vector<Anope::string> args;
|
||||
args.emplace_back("SADD");
|
||||
args.push_back("value:" + st->GetName() + ":" + key + ":" + value->str());
|
||||
args.push_back(Anope::ToString(obj->object_id));
|
||||
|
||||
/* Add to value -> object id set */
|
||||
me->redis->SendCommand(NULL, args);
|
||||
}
|
||||
|
||||
std::vector<Anope::string> args;
|
||||
args.emplace_back("SADD");
|
||||
args.push_back("ids:" + st->GetName());
|
||||
args.push_back(Anope::ToString(obj->object_id));
|
||||
|
||||
/* Add to type -> id set */
|
||||
me->redis->SendCommand(NULL, args);
|
||||
}
|
||||
|
||||
/* Transaction end */
|
||||
me->redis->CommitTransaction();
|
||||
|
||||
delete this;
|
||||
}
|
||||
|
||||
MODULE_INIT(DatabaseRedis)
|
||||
@@ -120,6 +120,12 @@ public:
|
||||
{
|
||||
if (this->sql)
|
||||
{
|
||||
if (!obj->ShouldCommit())
|
||||
{
|
||||
OnSerializableDestruct(obj);
|
||||
continue; // Non-committable object.
|
||||
}
|
||||
|
||||
Serialize::Type *s_type = obj->GetSerializableType();
|
||||
if (!s_type)
|
||||
continue;
|
||||
@@ -168,7 +174,7 @@ public:
|
||||
{
|
||||
const auto &block = conf.GetModule(this);
|
||||
this->sql.SetServiceName(block.Get<const Anope::string>("engine"));
|
||||
this->prefix = block.Get<const Anope::string>("prefix", "anope_db_");
|
||||
this->prefix = block.Get<const Anope::string>("prefix", "anope21_");
|
||||
this->import = block.Get<bool>("import");
|
||||
}
|
||||
|
||||
@@ -256,7 +262,7 @@ public:
|
||||
Data data;
|
||||
|
||||
for (const auto &[key, value] : res.Row(j))
|
||||
data[key] << value;
|
||||
data.StoreInternal(key, value);
|
||||
|
||||
Serializable *obj = sb->Unserialize(NULL, data);
|
||||
if (obj)
|
||||
|
||||
@@ -104,6 +104,12 @@ public:
|
||||
{
|
||||
if (obj && this->SQL)
|
||||
{
|
||||
if (!obj->ShouldCommit())
|
||||
{
|
||||
OnSerializableDestruct(obj);
|
||||
continue; // Non-committable object.
|
||||
}
|
||||
|
||||
Serialize::Type *s_type = obj->GetSerializableType();
|
||||
if (!s_type)
|
||||
continue;
|
||||
@@ -152,7 +158,7 @@ public:
|
||||
const auto &block = conf.GetModule(this);
|
||||
|
||||
this->SQL.SetServiceName(block.Get<const Anope::string>("engine"));
|
||||
this->prefix = block.Get<const Anope::string>("prefix", "anope_db_");
|
||||
this->prefix = block.Get<const Anope::string>("prefix", "anope21_");
|
||||
}
|
||||
|
||||
void OnSerializableConstruct(Serializable *obj) override
|
||||
@@ -220,7 +226,7 @@ public:
|
||||
Data data;
|
||||
|
||||
for (const auto &[key, value] : row)
|
||||
data[key] << value;
|
||||
data.StoreInternal(key, value);
|
||||
|
||||
Serializable *s = NULL;
|
||||
auto it = obj->objects.find(id);
|
||||
|
||||
+7
-7
@@ -729,7 +729,7 @@ public:
|
||||
delete udpsock;
|
||||
delete tcpsock;
|
||||
|
||||
for (std::map<unsigned short, Request *>::iterator it = this->requests.begin(), it_end = this->requests.end(); it != it_end;)
|
||||
for (auto it = this->requests.begin(), it_end = this->requests.end(); it != it_end;)
|
||||
{
|
||||
Request *request = it->second;
|
||||
++it;
|
||||
@@ -909,7 +909,7 @@ public:
|
||||
return true;
|
||||
}
|
||||
|
||||
std::map<unsigned short, Request *>::iterator it = this->requests.find(recv_packet.id);
|
||||
auto it = this->requests.find(recv_packet.id);
|
||||
if (it == this->requests.end())
|
||||
{
|
||||
Log(LOG_DEBUG_2) << "Resolver: Received an answer for something we didn't request";
|
||||
@@ -1043,7 +1043,7 @@ private:
|
||||
*/
|
||||
bool CheckCache(Request *request)
|
||||
{
|
||||
cache_map::iterator it = this->cache.find(*request);
|
||||
auto it = this->cache.find(*request);
|
||||
if (it != this->cache.end())
|
||||
{
|
||||
Query &record = it->second;
|
||||
@@ -1070,7 +1070,7 @@ public:
|
||||
|
||||
~ModuleDNS() override
|
||||
{
|
||||
for (std::map<int, Socket *>::const_iterator it = SocketEngine::Sockets.begin(), it_end = SocketEngine::Sockets.end(); it != it_end;)
|
||||
for (auto it = SocketEngine::Sockets.begin(), it_end = SocketEngine::Sockets.end(); it != it_end;)
|
||||
{
|
||||
Socket *s = it->second;
|
||||
++it;
|
||||
@@ -1096,8 +1096,8 @@ public:
|
||||
for (int i = 0; i < block.CountBlock("notify"); ++i)
|
||||
{
|
||||
const auto &n = block.GetBlock("notify", i);
|
||||
Anope::string nip = n.Get<Anope::string>("ip");
|
||||
short nport = n.Get<short>("port");
|
||||
auto nip = n.Get<Anope::string>("ip");
|
||||
auto nport = n.Get<short>("port");
|
||||
|
||||
notify.emplace_back(nip, nport);
|
||||
}
|
||||
@@ -1149,7 +1149,7 @@ public:
|
||||
|
||||
void OnModuleUnload(User *u, Module *m) override
|
||||
{
|
||||
for (std::map<unsigned short, Request *>::iterator it = this->manager.requests.begin(), it_end = this->manager.requests.end(); it != it_end;)
|
||||
for (auto it = this->manager.requests.begin(), it_end = this->manager.requests.end(); it != it_end;)
|
||||
{
|
||||
unsigned short id = it->first;
|
||||
Request *req = it->second;
|
||||
|
||||
@@ -14,7 +14,8 @@
|
||||
|
||||
/// BEGIN CMAKE
|
||||
/// if(WIN32)
|
||||
/// target_link_libraries(${SO} PRIVATE CONAN_PKG::argon2)
|
||||
/// find_package("argon2" REQUIRED)
|
||||
/// target_link_libraries(${SO} PRIVATE "argon2::argon2")
|
||||
/// else()
|
||||
/// pkg_check_modules("ARGON2" IMPORTED_TARGET REQUIRED "libargon2")
|
||||
/// target_link_libraries(${SO} PRIVATE PkgConfig::ARGON2)
|
||||
|
||||
@@ -14,7 +14,8 @@
|
||||
|
||||
/// BEGIN CMAKE
|
||||
/// if(WIN32)
|
||||
/// target_link_libraries(${SO} PRIVATE CONAN_PKG::libmysqlclient)
|
||||
/// find_package("libmysqlclient" REQUIRED)
|
||||
/// target_link_libraries(${SO} PRIVATE "libmysqlclient::libmysqlclient")
|
||||
/// else()
|
||||
/// pkg_search_module("MYSQL" IMPORTED_TARGET REQUIRED "mysqlclient" "mariadb")
|
||||
/// target_link_libraries(${SO} PRIVATE PkgConfig::MYSQL)
|
||||
@@ -574,7 +575,7 @@ Query MySQLService::BuildInsert(const Anope::string &table, Serializable::Id id,
|
||||
for (const auto &known_col : this->active_schema[table])
|
||||
{
|
||||
if (data.data.count(known_col) == 0)
|
||||
data[known_col] << "";
|
||||
data.data[known_col];
|
||||
}
|
||||
|
||||
Anope::string query_text = "INSERT INTO `" + table + "` (`id`";
|
||||
@@ -592,9 +593,7 @@ Query MySQLService::BuildInsert(const Anope::string &table, Serializable::Id id,
|
||||
Query query(query_text);
|
||||
for (auto &[field, value] : data.data)
|
||||
{
|
||||
Anope::string buf;
|
||||
*value >> buf;
|
||||
|
||||
auto buf = value;
|
||||
auto escape = true;
|
||||
switch (data.GetType(field))
|
||||
{
|
||||
|
||||
@@ -14,7 +14,8 @@
|
||||
|
||||
/// BEGIN CMAKE
|
||||
/// if(WIN32)
|
||||
/// target_link_libraries(${SO} PRIVATE CONAN_PKG::pcre2)
|
||||
/// find_package("PCRE2" REQUIRED)
|
||||
/// target_link_libraries(${SO} PRIVATE "PCRE2::8BIT")
|
||||
/// else()
|
||||
/// pkg_check_modules("PCRE2" IMPORTED_TARGET REQUIRED "libpcre2-8")
|
||||
/// target_link_libraries(${SO} PRIVATE PkgConfig::PCRE2)
|
||||
|
||||
@@ -12,9 +12,21 @@
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
|
||||
/// BEGIN CMAKE
|
||||
/// if(WIN32)
|
||||
/// find_package("PCRE2" REQUIRED)
|
||||
/// target_link_libraries(${SO} PRIVATE "PCRE2::POSIX")
|
||||
/// endif()
|
||||
/// END CMAKE
|
||||
|
||||
#include "module.h"
|
||||
#include <sys/types.h>
|
||||
#include <regex.h>
|
||||
|
||||
#ifdef _WIN32
|
||||
# include "pcre2posix.h"
|
||||
#else
|
||||
# include <sys/types.h>
|
||||
# include <regex.h>
|
||||
#endif
|
||||
|
||||
class POSIXRegex final
|
||||
: public Regex
|
||||
@@ -27,7 +39,7 @@ public:
|
||||
int err = regcomp(&this->regbuf, expr.c_str(), REG_EXTENDED | REG_NOSUB | REG_ICASE);
|
||||
if (err)
|
||||
{
|
||||
char buf[BUFSIZE];
|
||||
char buf[256];
|
||||
regerror(err, &this->regbuf, buf, sizeof(buf));
|
||||
regfree(&this->regbuf);
|
||||
throw RegexException("Error in regex " + expr + ": " + buf);
|
||||
|
||||
@@ -13,9 +13,14 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
|
||||
/// BEGIN CMAKE
|
||||
/// pkg_check_modules("TRE" IMPORTED_TARGET REQUIRED "tre")
|
||||
/// target_link_libraries(${SO} PRIVATE PkgConfig::TRE)
|
||||
/// target_compile_options(${SO} PRIVATE "-Wno-error=date-time") # Workaround for TRE bug 117
|
||||
/// if(WIN32)
|
||||
/// find_package("tre" REQUIRED)
|
||||
/// target_link_libraries(${SO} PRIVATE "tre::tre")
|
||||
/// else()
|
||||
/// pkg_check_modules("TRE" IMPORTED_TARGET REQUIRED "tre")
|
||||
/// target_link_libraries(${SO} PRIVATE PkgConfig::TRE)
|
||||
/// target_compile_options(${SO} PRIVATE "-Wno-error=date-time") # Workaround for TRE bug 117
|
||||
/// endif()
|
||||
/// END CMAKE
|
||||
|
||||
#include "module.h"
|
||||
@@ -32,7 +37,7 @@ public:
|
||||
int err = regcomp(&this->regbuf, expr.c_str(), REG_EXTENDED | REG_NOSUB);
|
||||
if (err)
|
||||
{
|
||||
char buf[BUFSIZE];
|
||||
char buf[256];
|
||||
regerror(err, &this->regbuf, buf, sizeof(buf));
|
||||
regfree(&this->regbuf);
|
||||
throw RegexException("Error in regex " + expr + ": " + buf);
|
||||
|
||||
@@ -311,7 +311,7 @@ Query SQLiteService::BuildInsert(const Anope::string &table, Serializable::Id id
|
||||
for (const auto &known_col : this->active_schema[table])
|
||||
{
|
||||
if (known_col != "id" && known_col != "timestamp" && data.data.count(known_col) == 0)
|
||||
data[known_col] << "";
|
||||
data.data[known_col];
|
||||
}
|
||||
|
||||
Anope::string query_text = "REPLACE INTO `" + table + "` (";
|
||||
@@ -331,9 +331,7 @@ Query SQLiteService::BuildInsert(const Anope::string &table, Serializable::Id id
|
||||
Query query(query_text);
|
||||
for (auto &[field, value] : data.data)
|
||||
{
|
||||
Anope::string buf;
|
||||
*value >> buf;
|
||||
|
||||
auto buf = value;
|
||||
auto escape = true;
|
||||
switch (data.GetType(field))
|
||||
{
|
||||
|
||||
+1
-1
@@ -147,7 +147,7 @@ public:
|
||||
if (params.empty())
|
||||
return;
|
||||
|
||||
CommandInfo::map::const_iterator it = Config->Fantasy.end();
|
||||
auto it = Config->Fantasy.end();
|
||||
unsigned count = 0;
|
||||
for (unsigned max = params.size(); it == Config->Fantasy.end() && max > 0; --max)
|
||||
{
|
||||
|
||||
@@ -166,14 +166,14 @@ public:
|
||||
source.Reply(_(
|
||||
"Allows queueing messages to send to users on the network."
|
||||
"\n\n"
|
||||
"The \002%s\032ADD\002 command adds the given message to the message queue."
|
||||
"The \002%s\033ADD\002 command adds the given message to the message queue."
|
||||
"\n\n"
|
||||
"The \002%s\032CLEAR\002 command clears the message queue."
|
||||
"The \002%s\033CLEAR\002 command clears the message queue."
|
||||
"\n\n"
|
||||
"The \002%s\032DEL\002 command removes the specified message from the message queue. The "
|
||||
"message number can be obtained from the output of the \002%s\032LIST\002 command."
|
||||
"The \002%s\033DEL\002 command removes the specified message from the message queue. The "
|
||||
"message number can be obtained from the output of the \002%s\033LIST\002 command."
|
||||
"\n\n"
|
||||
"The \002%s\032LIST\002 command lists all messages that are currently in the message queue."
|
||||
"The \002%s\033LIST\002 command lists all messages that are currently in the message queue."
|
||||
),
|
||||
source.command.nobreak().c_str(),
|
||||
source.command.nobreak().c_str(),
|
||||
|
||||
+27
-10
@@ -88,7 +88,7 @@ public:
|
||||
CommandNSSetGreet(Module *creator, const Anope::string &sname = "nickserv/set/greet", size_t min = 0) : Command(creator, sname, min, min + 1)
|
||||
{
|
||||
this->SetDesc(_("Associate a greet message with your nickname"));
|
||||
this->SetSyntax(_("\037message\037"));
|
||||
this->SetSyntax(_("[\037message\037]"));
|
||||
}
|
||||
|
||||
void Run(CommandSource &source, const Anope::string &user, const Anope::string ¶m)
|
||||
@@ -136,11 +136,19 @@ public:
|
||||
this->SendSyntax(source);
|
||||
source.Reply(" ");
|
||||
source.Reply(_(
|
||||
"Makes the given message the greet of your nickname, that "
|
||||
"will be displayed when joining a channel that has GREET "
|
||||
"option enabled, provided that you have the necessary "
|
||||
"access on it."
|
||||
"Changes your greet message. This message will be displayed when joining a channel "
|
||||
"that has GREET option enabled, provided that you have the necessary access on it."
|
||||
));
|
||||
|
||||
ExampleWrapper()
|
||||
.AddEntry(_("I come in peace"), _(
|
||||
"Changes your greet message to \035I come in peace\035."
|
||||
))
|
||||
.AddEntry("", _(
|
||||
"Removes your greet message."
|
||||
))
|
||||
.SendTo(source);
|
||||
|
||||
return true;
|
||||
}
|
||||
};
|
||||
@@ -152,7 +160,7 @@ public:
|
||||
CommandNSSASetGreet(Module *creator) : CommandNSSetGreet(creator, "nickserv/saset/greet", 1)
|
||||
{
|
||||
this->ClearSyntax();
|
||||
this->SetSyntax(_("\037nickname\037 \037message\037"));
|
||||
this->SetSyntax(_("\037nickname\037 [\037message\037]"));
|
||||
}
|
||||
|
||||
void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms) override
|
||||
@@ -165,11 +173,20 @@ public:
|
||||
this->SendSyntax(source);
|
||||
source.Reply(" ");
|
||||
source.Reply(_(
|
||||
"Makes the given message the greet of the nickname, that "
|
||||
"will be displayed when joining a channel that has GREET "
|
||||
"option enabled, provided that the user has the necessary "
|
||||
"access on it."
|
||||
"Changes the greet message of the specified nickname. This message will be displayed "
|
||||
"when joining a channel that has GREET option enabled, provided that the user has the "
|
||||
"necessary access on it."
|
||||
));
|
||||
|
||||
ExampleWrapper()
|
||||
.AddEntry(_("alien I come in peace"), _(
|
||||
"Changes the greet message of \035alien\035 to \035I come in peace\035."
|
||||
))
|
||||
.AddEntry("zebra", _(
|
||||
"Removes the greet message of \035zebra\035."
|
||||
))
|
||||
.SendTo(source);
|
||||
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
+2
-2
@@ -124,7 +124,7 @@ public:
|
||||
if (!groups.empty())
|
||||
{
|
||||
source.Reply(" ");
|
||||
source.Reply(_("Use the \002%s\032ALL\002 command to list all commands and their descriptions."),
|
||||
source.Reply(_("Use the \002%s\033ALL\002 command to list all commands and their descriptions."),
|
||||
source_command.nobreak().c_str());
|
||||
}
|
||||
}
|
||||
@@ -138,7 +138,7 @@ public:
|
||||
full_command += " " + params[i];
|
||||
full_command.erase(full_command.begin());
|
||||
|
||||
CommandInfo::map::const_iterator it = map.find(full_command);
|
||||
auto it = map.find(full_command);
|
||||
if (it == map.end())
|
||||
continue;
|
||||
|
||||
|
||||
@@ -223,12 +223,12 @@ public:
|
||||
else
|
||||
ho = new HostOffer();
|
||||
|
||||
data["ident"] >> ho->ident;
|
||||
data["host"] >> ho->host;
|
||||
data["reason"] >> ho->reason;
|
||||
data["creator"] >> ho->creator;
|
||||
data["created"] >> ho->created;
|
||||
data["expires"] >> ho->expires;
|
||||
ho->ident = data.Load("ident");
|
||||
ho->host = data.Load("host");
|
||||
ho->reason = data.Load("reason");
|
||||
ho->creator = data.Load("creator");
|
||||
ho->created = data.Load<time_t>("created");
|
||||
ho->expires = data.Load<time_t>("expires");
|
||||
|
||||
if (!obj)
|
||||
host_offers->Add(ho);
|
||||
@@ -603,7 +603,7 @@ public:
|
||||
source.Reply(_(
|
||||
"Offer stock vhosts to unprivileged users."
|
||||
"\n"
|
||||
"The \002%s\032ADD\002 command adds an offered vhost. If "
|
||||
"The \002%s\033ADD\002 command adds an offered vhost. If "
|
||||
"\037expiry\037 is provided then the offered vhost will only be "
|
||||
"available for a limited time. The \037vhost\037 field may "
|
||||
"contain template variables. The supported template variables "
|
||||
@@ -614,16 +614,16 @@ public:
|
||||
" \002{regdate}\002 - The YYYY-MM-DD date at which your nick was registered.\n"
|
||||
" \002{regepoch}\002 - The UNIX time at which your nick was registered.\n"
|
||||
"\n"
|
||||
"The \002%s\032CLEAR\002 command removes all offered vhosts.\n"
|
||||
"The \002%s\033CLEAR\002 command removes all offered vhosts.\n"
|
||||
"\n"
|
||||
"The \002%s\032DEL\002 command removes an offered vhost.\n"
|
||||
"The \002%s\033DEL\002 command removes an offered vhost.\n"
|
||||
"\n"
|
||||
"The \002%s\032LIST\002 command displays the offered vhosts, or "
|
||||
"The \002%s\033LIST\002 command displays the offered vhosts, or "
|
||||
"optionally only those offered vhosts which match the given "
|
||||
"mask."
|
||||
"\n\n"
|
||||
"The \002%s\032VIEW\002 command is a more verbose version of "
|
||||
"the \002%s\032LIST\002 command."
|
||||
"The \002%s\033VIEW\002 command is a more verbose version of "
|
||||
"the \002%s\033LIST\002 command."
|
||||
),
|
||||
source.command.c_str(),
|
||||
source.command.c_str(),
|
||||
@@ -669,7 +669,7 @@ public:
|
||||
{
|
||||
if (!show_all)
|
||||
return;
|
||||
mask = Anope::Format(Language::Translate(source.GetAccount(), _("%s [Invalid]")), mask.c_str());
|
||||
mask = Anope::Format(source.Translate(_("%s [Invalid]")), mask.c_str());
|
||||
}
|
||||
|
||||
ListFormatter::ListEntry entry;
|
||||
@@ -835,7 +835,7 @@ private:
|
||||
{
|
||||
if (!show_all)
|
||||
continue;
|
||||
mask = Anope::Format(Language::Translate(source.GetAccount(), _("%s [Invalid]")), mask.c_str());
|
||||
mask = Anope::Format(source.Translate(_("%s [Invalid]")), mask.c_str());
|
||||
}
|
||||
|
||||
ListFormatter::ListEntry entry;
|
||||
@@ -898,7 +898,7 @@ public:
|
||||
" \002{regdate}\002 - The YYYY-MM-DD date at which your nick was registered.\n"
|
||||
" \002{regepoch}\002 - The UNIX time at which your nick was registered.\n"
|
||||
"\n"
|
||||
"With \002%s\032TAKE\002 an offered vhost will be applied. You "
|
||||
"With \002%s\033TAKE\002 an offered vhost will be applied. You "
|
||||
"must specify the offered template variable or the entry number "
|
||||
"for the offered vhost you want to use. Once a vhost is taken "
|
||||
"you can not take another one for %s."
|
||||
|
||||
@@ -75,10 +75,7 @@ struct HostRequestTypeImpl final
|
||||
|
||||
Serializable *Unserialize(Serializable *obj, Serialize::Data &data) const override
|
||||
{
|
||||
Anope::string snick;
|
||||
data["nick"] >> snick;
|
||||
|
||||
NickAlias *na = NickAlias::Find(snick);
|
||||
auto *na = NickAlias::Find(data.Load("nick"));
|
||||
if (na == NULL)
|
||||
return NULL;
|
||||
|
||||
@@ -90,11 +87,11 @@ struct HostRequestTypeImpl final
|
||||
if (req)
|
||||
{
|
||||
req->nick = na->nick;
|
||||
data["ident"] >> req->ident;
|
||||
data["host"] >> req->host;
|
||||
data["time"] >> req->time;
|
||||
data["validation_token"] >> req->validation_token;
|
||||
data["last_validation"] >> req->last_validation;
|
||||
req->ident = data.Load("ident");
|
||||
req->host = data.Load("host");
|
||||
req->time = data.Load<time_t>("time");
|
||||
req->validation_token = data.Load("validation_token");
|
||||
req->last_validation = data.Load<time_t>("last_validation");
|
||||
}
|
||||
|
||||
return req;
|
||||
@@ -285,7 +282,7 @@ public:
|
||||
|
||||
BotInfo *bi;
|
||||
Anope::string cmd;
|
||||
if (dnsmanager && Command::FindCommandFromService("hostserv/validate", bi, cmd))
|
||||
if (dnsmanager && Command::FindFromService("hostserv/validate", bi, cmd))
|
||||
{
|
||||
source.Reply(_(
|
||||
"Your vhost \002%s\002 has been requested. If the requested vhost is for a valid "
|
||||
@@ -404,7 +401,7 @@ public:
|
||||
else
|
||||
message = _("Your requested vhost has been rejected.");
|
||||
|
||||
MemoServ::service->Send(source.service->nick, nick, Language::Translate(source.GetAccount(), message.c_str()), true);
|
||||
MemoServ::service->Send(source.service->nick, nick, source.Translate(message.c_str()), true);
|
||||
}
|
||||
|
||||
source.Reply(_("VHost for %s has been rejected."), nick.c_str());
|
||||
|
||||
+2
-2
@@ -354,7 +354,7 @@ public:
|
||||
|
||||
~HTTPD() override
|
||||
{
|
||||
for (std::map<int, Socket *>::const_iterator it = SocketEngine::Sockets.begin(), it_end = SocketEngine::Sockets.end(); it != it_end;)
|
||||
for (auto it = SocketEngine::Sockets.begin(), it_end = SocketEngine::Sockets.end(); it != it_end;)
|
||||
{
|
||||
Socket *s = it->second;
|
||||
++it;
|
||||
@@ -447,7 +447,7 @@ public:
|
||||
spacesepstream(ext_header).GetTokens(p->ext_headers);
|
||||
}
|
||||
|
||||
for (std::map<Anope::string, MyHTTPProvider *>::iterator it = this->providers.begin(), it_end = this->providers.end(); it != it_end;)
|
||||
for (auto it = this->providers.begin(), it_end = this->providers.end(); it != it_end;)
|
||||
{
|
||||
HTTP::Provider *p = it->second;
|
||||
++it;
|
||||
|
||||
@@ -238,7 +238,7 @@ public:
|
||||
return;
|
||||
|
||||
source.Reply(" ");
|
||||
source.Reply(_("Type \002%s\032\037command\037\002 for help on any of the above commands."),
|
||||
source.Reply(_("Type \002%s\033\037command\037\002 for help on any of the above commands."),
|
||||
MemoServ->GetQueryCommand("generic/help").c_str());
|
||||
}
|
||||
};
|
||||
|
||||
+16
-12
@@ -134,19 +134,23 @@ public:
|
||||
"Deletes the specified memo or memos. You can supply "
|
||||
"multiple memo numbers or ranges of numbers instead of a "
|
||||
"single number, as in the second example below."
|
||||
"\n\n"
|
||||
"If \002LAST\002 is given, the last memo will be deleted."
|
||||
"\n\n"
|
||||
"If \002ALL\002 is given, deletes all of your memos."
|
||||
"\n\n"
|
||||
"Examples:"
|
||||
"\n\n"
|
||||
" \002DEL\0321\002\n"
|
||||
" Deletes your first memo."
|
||||
"\n\n"
|
||||
" \002DEL\0322-5,7-9\002\n"
|
||||
" Deletes memos numbered 2 through 5 and 7 through 9."
|
||||
));
|
||||
|
||||
ExampleWrapper examples;
|
||||
examples.AddEntry("ALL", _(
|
||||
"Deletes all of your memos."
|
||||
));
|
||||
examples.AddEntry("LAST", _(
|
||||
"Deletes your last memo."
|
||||
));
|
||||
examples.AddEntry("1", _(
|
||||
"Deletes your first memo."
|
||||
));
|
||||
examples.AddEntry("2-5,7-9", _(
|
||||
"Deletes memos numbered 2 through 5 and 7 through 9."
|
||||
));
|
||||
examples.SendTo(source);
|
||||
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user