1
0
mirror of https://github.com/anope/anope.git synced 2026-06-18 06:34:47 +02:00

Compare commits

..

46 Commits

Author SHA1 Message Date
Sadie Powell e9614986d0 Release 2.1.22. 2026-03-01 03:00:19 +00:00
Sadie Powell dde9113418 Fix erroneously repeating the command name in the example wrapper. 2026-03-01 03:00:19 +00:00
Sadie Powell 99f7ea8307 Clarify the purpose of the autologin option in the change log. 2026-03-01 02:53:19 +00:00
Sadie Powell f912e30b25 Disable autologin by default in the example configs. 2026-03-01 02:47:55 +00:00
Sadie Powell 2ca5045593 Update the change log. 2026-02-28 17:28:29 +00:00
Sadie Powell be6a454579 Update author list. 2026-02-26 16:40:13 +00:00
Sadie Powell 1ffeb85727 Allow mkauthors to omit users that don't want to be included. 2026-02-26 16:39:43 +00:00
Sadie Powell 95fc992355 Update the mailmap. 2026-02-26 16:37:22 +00:00
Sadie Powell 0df341fa32 Fix echoing tags on Solanum. 2026-02-25 18:32:19 +00:00
Sadie Powell decbab5d09 Fix translating examples. 2026-02-25 15:56:58 +00:00
Sadie Powell 9409560597 Tweak the layout and ergonomics the ExampleWrapper class. 2026-02-25 15:38:11 +00:00
Sadie Powell a02b81f219 Fix iterating the status mode list while unsetting modes. 2026-02-25 03:37:29 +00:00
Sadie Powell 6c86cd108a Add a default command help implementation. 2026-02-25 03:11:10 +00:00
Sadie Powell 3ea5b078dc Fix some minor typos in the change log. 2026-02-25 00:50:45 +00:00
Sadie Powell d77fd4bde1 Update the change log. 2026-02-25 00:39:01 +00:00
Sadie Powell da723d562f Fix the missing command blocks for nickserv/{sa,}set/autologin. 2026-02-25 00:12:50 +00:00
Sadie Powell 5db1a57833 Fix handling incoming FIDENT messages on InspIRCd. 2026-02-25 00:03:24 +00:00
Sadie Powell a01cd481b9 Send the clock synchronisation TS token on UnrealIRCd. 2026-02-24 23:57:39 +00:00
Sadie Powell aa41fffd49 Remove some obsolete InspIRCd compatibility code. 2026-02-24 21:10:48 +00:00
Sadie Powell 8062d01a90 Rework the output of nickserv/list.
* Add a new account name field to the output.
* Remove the last mask field from the output. This is almost never
  useful nowadays.
* Move the suspended and unconfirmed status to a new status field.
2026-02-24 19:11:48 +00:00
Sadie Powell d0c2baeed4 Add a type for wrapping examples instead of using manual linewraps.
At a later date we should revise the examples for all commands for
consistency.
2026-02-24 18:21:44 +00:00
Sadie Powell 538b2cf035 Refactor the logic in ns_cert. 2026-02-24 15:54:56 +00:00
Sadie Powell 7aeac28ca7 Rewrite the Windows install docs to reflect how it works now. 2026-02-24 13:06:23 +00:00
Sadie Powell 3244eef71d Update the change log. 2026-02-24 01:33:21 +00:00
Sadie Powell f91cf1745d Fix db_json restoring the object identifier when unserialising. 2026-02-24 01:07:47 +00:00
Sadie Powell f380b27ed3 Move fingerprints to their own table. 2026-02-22 17:03:32 +00:00
Sadie Powell 66f53128ce Add support for disabling automatic login.
Automatic login was created before we had SASL. Now, if a user wants
to log in using their client certificate they can use SASL EXTERNAL.
2026-02-22 17:01:34 +00:00
Sadie Powell 45496780f8 Add more configuration options to {cs,ns}_set_misc.
* Add titles which are separate from the command name.
* Add support for sending data entries as swhois.
* Add validation of data using regexps.
2026-02-19 16:36:29 +00:00
Sadie Powell 8500fefe91 Allow importing custom Atheme metadata to {cs,ns}_set_misc. 2026-02-19 16:35:11 +00:00
Sadie Powell 7242c740c8 Fix matching stacked extended bans. 2026-02-18 17:39:13 +00:00
Sadie Powell d43acc2381 Store modes as their object form in ModeStatus.
This has the side effect of preventing users from putting nonsense
modes in {botserv}:botmodes and other related fields.
2026-02-16 23:24:04 +00:00
Sadie Powell 2f1f04f7cb Short circuit empty format strings in Anope::Format.
This fixes a bug where Anope would loop infinitely when passed an
empty format string.
2026-02-16 00:55:08 +00:00
Sadie Powell 5b2ab323ab Reset the swhois status on InspIRCd when reconnecting. 2026-02-15 11:16:21 +00:00
Sadie Powell 5aa71469e1 Remove trailing semicolons from the config file. 2026-02-14 15:41:54 +00:00
Sadie Powell 5aeb078391 Revamp support for swhois. 2026-02-14 15:09:22 +00:00
Sadie Powell bc737c20c9 Implement support for the ratified +reply tag. 2026-02-13 15:48:49 +00:00
Sadie Powell 7d7ca934b3 Fix some places that weren't updated for the new nbsp character. 2026-02-10 21:58:04 +00:00
Sadie Powell 238adae2cd Fix the description of access entries imported from Atheme. 2026-02-08 19:51:38 +00:00
Sadie Powell 407f604d48 Update the change log. 2026-02-08 14:11:09 +00:00
Sadie Powell 76af25f0b4 Deduplicate some of the Windows extra module enabling code. 2026-02-08 14:11:09 +00:00
Sadie Powell bf5ab14a21 Also build regex_tre on Windows. 2026-02-08 14:11:09 +00:00
Sadie Powell 766a18b0f1 Allow building regex_posix against the PCRE2 POSIX compat layer. 2026-02-08 12:35:16 +00:00
Sadie Powell 1f0c76516b Change to a more reliable method for installing NSIS.
[skip alpine ci]
[skip ubuntu ci]
2026-02-08 10:54:52 +00:00
Sadie Powell aef1925b1d Fix finding gettext on Windows.
Unfortunately we need to move our escape character from 0x1A to 0x1B
because newer versions of gettext treat the former as an EOF character.
2026-02-08 00:23:41 +00:00
Sadie Powell e7aa0cb583 Migrate the Windows dependencies to Conan 2.
[skip alpine ci]
[skip ubuntu ci]
2026-02-07 21:14:20 +00:00
Sadie Powell bd72a444df Bump for 2.1.22-git. 2026-02-07 13:24:31 +00:00
97 changed files with 2622 additions and 1669 deletions
+22 -15
View File
@@ -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
- 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
-1
View File
@@ -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
View File
@@ -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)
+28
View File
@@ -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"
}
}
/*
+73 -73
View File
@@ -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
View File
@@ -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" }
+15 -15
View File
@@ -28,22 +28,22 @@ module
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" }
+4 -4
View File
@@ -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
View File
@@ -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
View File
@@ -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" }
+87 -72
View File
@@ -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
View File
@@ -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
View File
@@ -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>
+83
View File
@@ -1,5 +1,88 @@
# Anope Change Log
## 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
View File
@@ -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
View File
@@ -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
+57
View File
@@ -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
View File
@@ -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
View File
@@ -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.
+1 -1
View File
@@ -135,7 +135,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);
+1
View File
@@ -42,6 +42,7 @@ struct ModeData;
class Module;
class NickAlias;
class NickCore;
namespace NickServ { struct Cert; }
struct Oper;
namespace OperServ { struct Exception; }
class OperType;
+4 -3
View File
@@ -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.")
@@ -147,6 +147,7 @@ namespace Language
#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 +164,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
View File
@@ -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;
};
+2 -2
View File
@@ -793,13 +793,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
+21 -2
View File
@@ -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;
+5 -1
View File
@@ -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
*/
+16
View File
@@ -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:
+319 -233
View File
File diff suppressed because it is too large Load Diff
+199 -199
View File
@@ -78,20 +78,20 @@ msgid "%s allows you to execute \"fantasy\" commands in the channel. Fantasy c
msgstr "%s vă permite să executați comenzile fanteziste ( \"fantasy\") în canal. Comenzile fanteziste sunt comenzi care pot fi executate prin trimiterea de mesaje într-un canal și oferă astfel o modalitate mai convenabilă de a executa comenzi. Comenzile care necesită un canal ca parametru vor avea automat acel parametru atribuit."
#, 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 vă permite să aveți un bot în propriul canal. Acesta a fost creat pentru utilizatorii care nu pot găzdui ori configura un bot, sau pentru utilizarea în rețelele care nu permit boți ai utilizatorilor. Comenzile disponibile sunt listate mai jos; pentru a le folosi tastați %scomanda. Pentru informații suplimentare privind o anumită comandă, tastați %scomanda."
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 vă permite să aveți un bot în propriul canal. Acesta a fost creat pentru utilizatorii care nu pot găzdui ori configura un bot, sau pentru utilizarea în rețelele care nu permit boți ai utilizatorilor. Comenzile disponibile sunt listate mai jos; pentru a le folosi tastați %scomanda. Pentru informații suplimentare privind o anumită comandă, tastați %scomanda."
#, 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 vă permite să înregistrați un pseudonim și să impedicați alte persoane în a-l folosi. Următoarele comenzi permit înregistrarea și întreținerea pseudonimelor; pentru a le folosi tastați %scomanda. Pentru informații suplimentare privind o anumită comandă, tastați %scomanda."
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 vă permite să înregistrați un pseudonim și să impedicați alte persoane în a-l folosi. Următoarele comenzi permit înregistrarea și întreținerea pseudonimelor; pentru a le folosi tastați %scomanda. Pentru informații suplimentare privind o anumită comandă, tastați %scomanda."
#, 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 vă permite să înregistrați un cont. Următoarele comenzi permit înregistrarea și întreținerea conturilor; pentru a le folosi tastați %scomanda. Pentru informații suplimentare privind o anumită comandă, tastați %scomanda."
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 vă permite să înregistrați un cont. Următoarele comenzi permit înregistrarea și întreținerea conturilor; pentru a le folosi tastați %scomanda. Pentru informații suplimentare privind o anumită comandă, tastați %scomanda."
#, 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 vă permite să înregistrați și să controlați diverse aspecte ale canalelor. %s poate adesea împiedica utilizatorii rău intenționați să \"preia controlul\" asupra canalelor prin limitarea privilegiilor de operator în canal. Comenzile disponibile sunt listate mai jos; pentru a le folosi, tastați %scomanda. Pentru informații suplimentare privind o anumită comandă, tastați %scomanda."
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 vă permite să înregistrați și să controlați diverse aspecte ale canalelor. %s poate adesea împiedica utilizatorii rău intenționați să \"preia controlul\" asupra canalelor prin limitarea privilegiilor de operator în canal. Comenzile disponibile sunt listate mai jos; pentru a le folosi, tastați %scomanda. Pentru informații suplimentare privind o anumită comandă, tastați %scomanda."
#, c-format
msgid "%s already exists in %s bad words list."
@@ -347,8 +347,8 @@ msgid "SET kills all operators from the given server and prevents operators
msgstr "SET deconectează toți Operatorii dintr-un server precizat și împiedică Operatorii să acționeze din acel server. REVOKE înlătură această restricție."
#, c-format
msgid "User access levels can be seen by using the %s command; type %sLEVELS for information."
msgstr "Nivelurile de acces ale utilizatorilor pot fi văzute folosind comanda %s; tastați %sLEVELS pentru informații."
msgid "User access levels can be seen by using the %s command; type %sLEVELS for information."
msgstr "Nivelurile de acces ale utilizatorilor pot fi văzute folosind comanda %s; tastați %sLEVELS pentru informații."
#, c-format
msgid "[auto-memo] The memo you sent to %s has been viewed."
@@ -1574,8 +1574,8 @@ msgstr "Permite a folosi comanda MODE"
msgid "Allowed to view the access list"
msgstr "Permite a vizualiza lista de accese"
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 "Permite Operatorilor de Servicii să schimbe moduri pentru orice canal. Parametrii sunt aceiași ca și pentru comanda standard /MODE. Alternativ, se poate da CLEAR pentru a goli toate modurile din canal. Dacă se dă CLEARALL, atunci toate modurile, inclusiv statutul utilizatorului, sunt înlăturate."
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 "Permite Operatorilor de Servicii să schimbe moduri pentru orice canal. Parametrii sunt aceiași ca și pentru comanda standard /MODE. Alternativ, se poate da CLEAR pentru a goli toate modurile din canal. Dacă se dă CLEARALL, atunci toate modurile, inclusiv statutul utilizatorului, sunt înlăturate."
msgid "Allows Services Operators to change modes for any user. Parameters are the same as for the standard /MODE command."
msgstr "Permite Operatorilor de Servicii să schimbe moduri pentru orice utilizator. Parametrii sunt aceiași ca și pentru comanda standard /MODE."
@@ -1584,21 +1584,21 @@ msgstr "Permite Operatorilor de Servicii să schimbe moduri pentru orice utiliza
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 ""
"Permite Operatorilor de Servicii să creeze, să modifice și să înlăture boți pe care utilizatorii îi vor putea folosi în propriile canale.\n"
"\n"
"%sADD adaugă un bot cu datele specificate: pseudonimul, numele de utilizator, numele de gazdă și numele real. Întrucât nu se efectuează verificări ale integrității acestor setări, vă rugăm să fiți cu atenție.\n"
"%sADD adaugă un bot cu datele specificate: pseudonimul, numele de utilizator, numele de gazdă și numele real. Întrucât nu se efectuează verificări ale integrității acestor setări, vă rugăm să fiți cu atenție.\n"
"\n"
"%sCHANGE vă permite să schimbați pseudonimul, numele utilizator, numele de gazdă și numele real ale unui bot fără a-l înlătura (dimpreună cu toate datele asociate acestuia).\n"
"%sCHANGE vă permite să schimbați pseudonimul, numele utilizator, numele de gazdă și numele real ale unui bot fără a-l înlătura (dimpreună cu toate datele asociate acestuia).\n"
"\n"
"%sDEL înlătură botul specificat din lista de boți.\n"
"%sDEL înlătură botul specificat din lista de boți.\n"
"\n"
"Notă: Nu puteți crea un bot cu un pseudonim deja înregistrat. Dacă o persoană neînregistrată folosește pseudonimul respectiv aceasta va fi deconectată."
@@ -1615,53 +1615,53 @@ 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 ""
"Permite Operatorilor de Servicii să manipuleze lista AKILL. Dacă un utilizator corespunzând unei măști AKILL încearcă să se conecteze, serviciile vor emite o comandă KILL pentru acel utilizator și, pe tipurile de server acceptate, vor instrui toate serverele să adauge o blocare pentru masca corespunzătoare utilizatorului.\n"
"\n"
"%sADD adaugă masca specificată la lista AKILL pentru motivul menționat, care trebuie precizat. Masca ar trebui să aibă formatul pseudonim!utilizator@gazdă#numereal, deși tot ce este necesar este utilizator@gazdă. Dacă se specifică un nume real, motivul trebuie să fie precedat de un caracter :. Expirarea este specificată ca un număr întreg urmat de una dintre următoarele: d (zile), h (ore), sau m (minute). Combinațiile (precum 1h30m) nu sunt permise. Dacă nu este specificată o unitate, valoarea implicită este în zile (prin urmare +30 înseamnă 30 zile). Pentru a adăuga un AKILL care nu expiră, utilizați +0. Dacă masca ce urmează să fie adăugată începe cu un +, trebuie specificat un timp de expirare, chiar dacă este același cu cel implicit. Timpul de expirare implicit pentru AKILL poate fi găsit prin comanda STATSAKILL."
"%sADD adaugă masca specificată la lista AKILL pentru motivul menționat, care trebuie precizat. Masca ar trebui să aibă formatul pseudonim!utilizator@gazdă#numereal, deși tot ce este necesar este utilizator@gazdă. Dacă se specifică un nume real, motivul trebuie să fie precedat de un caracter :. Expirarea este specificată ca un număr întreg urmat de una dintre următoarele: d (zile), h (ore), sau m (minute). Combinațiile (precum 1h30m) nu sunt permise. Dacă nu este specificată o unitate, valoarea implicită este în zile (prin urmare +30 înseamnă 30 zile). Pentru a adăuga un AKILL care nu expiră, utilizați +0. Dacă masca ce urmează să fie adăugată începe cu un +, trebuie specificat un timp de expirare, chiar dacă este același cu cel implicit. Timpul de expirare implicit pentru AKILL poate fi găsit prin comanda STATSAKILL."
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 ""
"Permite Operatorilor de Servicii să manipuleze lista SNLINE. Dacă un utilizator cu un nume real corespunzând unei măști SNLINE încearcă să se conecteze, serviciile nu îi vor permite să continue sesiunea IRC.\n"
"\n"
"SNLINEADD adaugă masca numelui real specificată, la lista SNLINE pentru motivul menționat (care trebuie precizat). Expirarea este specificată ca un număr întreg urmat de una dintre următoarele: d (zile), h (ore), sau m (minute). Combinațiile (precum 1h30m) nu sunt permise. Dacă nu este inclus un specificator de unitate, valoarea implicită este în zile (prin urmare +30 înseamnă 30 zile). Pentru a adăuga un SNLINE care nu expiră, utilizați +0. Dacă masca numelui real ce urmează să fie adăugată începe cu un +, trebuie specificat un timp de expirare, chiar dacă este același cu cel implicit. Timpul de expirare implicit pentru SNLINE poate fi găsit prin comanda STATSAKILL.\n"
"SNLINEADD adaugă masca numelui real specificată, la lista SNLINE pentru motivul menționat (care trebuie precizat). Expirarea este specificată ca un număr întreg urmat de una dintre următoarele: d (zile), h (ore), sau m (minute). Combinațiile (precum 1h30m) nu sunt permise. Dacă nu este inclus un specificator de unitate, valoarea implicită este în zile (prin urmare +30 înseamnă 30 zile). Pentru a adăuga un SNLINE care nu expiră, utilizați +0. Dacă masca numelui real ce urmează să fie adăugată începe cu un +, trebuie specificat un timp de expirare, chiar dacă este același cu cel implicit. Timpul de expirare implicit pentru SNLINE poate fi găsit prin comanda STATSAKILL.\n"
"\n"
"Notă: deoarece masca numelui real poate conține spații, separatorul între aceasta și motiv este două puncte."
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 ""
"Permite Operatorilor de Servicii să manipuleze lista SQLINE. Dacă un utilizator cu un pseudonim corespunzând unei măști SQLINE încearcă să se conecteze, serviciile nu îi vor permite să continue sesiunea IRC. Dacă primul caracter al măștii este #, serviciile vor împiedica utilizarea canalelor corespunzătoare. Dacă masca este o expresie regulată, atunci expresia va corespunde și canalelor.\n"
"\n"
"SQLINEADD adaugă masca (pseudonim/canal) la lista SQLINE pentru motivul menționat (care trebuie precizat). Expirarea este specificată ca un număr întreg urmat de una dintre următoarele: d (zile), h (ore), sau m (minute). Combinațiile (precum 1h30m) nu sunt permise. Dacă nu este inclus un specificator de unitate, valoarea implicită este în zile (prin urmare +30 înseamnă 30 zile). Pentru a adăuga un SQLINE care nu expiră, utilizați +0. Dacă masca ce urmează să fie adăugată începe cu un +, trebuie specificat un timp de expirare, chiar dacă este același cu cel implicit. Timpul de expirare implicit pentru SQLINE poate fi găsit prin comanda STATSAKILL."
"SQLINEADD adaugă masca (pseudonim/canal) la lista SQLINE pentru motivul menționat (care trebuie precizat). Expirarea este specificată ca un număr întreg urmat de una dintre următoarele: d (zile), h (ore), sau m (minute). Combinațiile (precum 1h30m) nu sunt permise. Dacă nu este inclus un specificator de unitate, valoarea implicită este în zile (prin urmare +30 înseamnă 30 zile). Pentru a adăuga un SQLINE care nu expiră, utilizați +0. Dacă masca ce urmează să fie adăugată începe cu un +, trebuie specificat un timp de expirare, chiar dacă este același cu cel implicit. Timpul de expirare implicit pentru SQLINE poate fi găsit prin comanda STATSAKILL."
#, 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 ""
"Permite Operatorilor de Servicii să manipuleze lista de gazde cu limite specifice de sesiune - permițând anumitor mașini, cum ar fi serverele shell, să țină simultan mai mulți clienți decât numărul implicit. Odată ce o gazdă atinge limita de sesiuni, toți clienții care încearcă să se conecteze de pe acea gazdă vor fi deconectați. Înainte ca utilizatorul să fie deconectat, acesta este notificat despre o sursă de ajutor privind limitarea sesiunilor. Conținutul acestei notificări este o setare în configurare.\n"
"\n"
"%sADD adaugă masca gazdă precizată la lista de excepții. Rețineți că măștile pseudonim!utilizator@gazdă și utilizator@gazdă sunt invalide! Sunt permise doar măști de gazdă reale, cum ar fi subdomeniu.domeniu.tld și *.domeniu.tld, deoarece limitarea de sesiuni nu ia în considerare pseudonimul și numele de utilizator. limita trebuie să fie un număr mai mare sau egal cu zero. Aceasta determină câte sesiuni poate gestiona simultan această gazdă. O valoare zero înseamnă că gazda are o limită nelimitată de sesiuni. Consultați ajutorul AKILL pentru detalii despre formatul parametrului de expirare opțional.\n"
"%sADD adaugă masca gazdă precizată la lista de excepții. Rețineți că măștile pseudonim!utilizator@gazdă și utilizator@gazdă sunt invalide! Sunt permise doar măști de gazdă reale, cum ar fi subdomeniu.domeniu.tld și *.domeniu.tld, deoarece limitarea de sesiuni nu ia în considerare pseudonimul și numele de utilizator. limita trebuie să fie un număr mai mare sau egal cu zero. Aceasta determină câte sesiuni poate gestiona simultan această gazdă. O valoare zero înseamnă că gazda are o limită nelimitată de sesiuni. Consultați ajutorul AKILL pentru detalii despre formatul parametrului de expirare opțional.\n"
"\n"
"%sDEL înlătură masca precizată din lista de excepții.\n"
"%sDEL înlătură masca precizată din lista de excepții.\n"
"\n"
"%sLIST și %sVIEW afișează toate sesiunile curente dacă masca opțională este specificată, lista este limitată la sesiunile ce corespund măștii. Diferența este că %sVIEW este mai detaliat, afișând numele persoanei care a adăugat excepția, limita sa de sesiune, motivul, masca gazdei și data și ora de expirare.\n"
"%sLIST și %sVIEW afișează toate sesiunile curente dacă masca opțională este specificată, lista este limitată la sesiunile ce corespund măștii. Diferența este că %sVIEW este mai detaliat, afișând numele persoanei care a adăugat excepția, limita sa de sesiune, motivul, masca gazdei și data și ora de expirare.\n"
"\n"
"Rețineți că un client care se conectează va \"utiliza\" prima excepție ce corespunde gazdei lor."
@@ -1669,17 +1669,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 ""
"Permite Operatorilor de Servicii să vizualizeze lista de sesiuni.\n"
"\n"
"%sLIST listează gazdele cu cel puțin sesiuni de prag. Pragul trebuie să fie un număr mai mare decât 1. Acest aspect este pentru a preveni listarea accidentală a numărului mare de gazde cu o singură sesiune.\n"
"%sLIST listează gazdele cu cel puțin sesiuni de prag. Pragul trebuie să fie un număr mai mare decât 1. Acest aspect este pentru a preveni listarea accidentală a numărului mare de gazde cu o singură sesiune.\n"
"\n"
"%sVIEW afișează informații detaliate despre o anumită gazdă - inclusiv numărul curent de sesiuni și limita de sesiuni. Valoarea gazdei nu poate conține caractere wildcard.\n"
"%sVIEW afișează informații detaliate despre o anumită gazdă - inclusiv numărul curent de sesiuni și limita de sesiuni. Valoarea gazdei nu poate conține caractere wildcard.\n"
"\n"
"Consultați ajutorul EXCEPTION pentru mai multe informații despre limitarea sesiunilor și despre cum să setați limite de sesiune specifice anumitor gazde și grupuri ale acestora."
@@ -1696,23 +1696,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 ""
"Permite punerea mesajelor la coadă pentru a fi trimise către utilizatorii din rețea.\n"
"\n"
"Comanda %sADD adaugă mesajul precizat în coada de mesaje.\n"
"Comanda %sADD adaugă mesajul precizat în coada de mesaje.\n"
"\n"
"Comanda %sCLEAR golește coada de mesaje.\n"
"Comanda %sCLEAR golește coada de mesaje.\n"
"\n"
"Comanda %sDEL înlătură mesajul specificat din coada de mesaje. Numărul mesajului poate fi obținut prin comanda %sLIST.\n"
"Comanda %sDEL înlătură mesajul specificat din coada de mesaje. Numărul mesajului poate fi obținut prin comanda %sLIST.\n"
"\n"
"Comanda %sLIST listează toate mesajele care se află în prezent în coada de mesaje."
"Comanda %sLIST listează toate mesajele care se află în prezent în coada de mesaje."
#, c-format
msgid ""
@@ -1760,12 +1760,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 ""
"Vă permite să modificați și să vizualizați setările de configurare. Setările schimbate prin această comandă sunt temporare și nu se vor reflecta în fișierul de configurare. Aceste modificări vor fi pierdute dacă Anope este oprit, repornit, ori dacă se reîncarcă configurarea.\n"
"\n"
"Exemplu:\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 "Vă permite să alegeți metoda prin care serviciile comunică cu utilizatorul precizat. Cu MSG setat, serviciile vor folosi mesaje, altfel vor folosi notificări."
@@ -1781,12 +1781,12 @@ msgid "Allows you to kill a user from the network. Parameters are the same as fo
msgstr "Vă permite să deconectați un utilizator din rețea. Parametrii sunt aceiași ca și pentru comanda standard /KILL."
#, 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)."
msgstr "Vă permite să împiedicați afișarea anumitor informații atunci când cineva utilizează %sINFO asupra pseudonimului. Puteți ascunde adresa de email (EMAIL), ultima mască utilizator@gazdă văzută (MASK), statutul accesului la servicii (STATUS) și ultimul mesaj de plecare din rețea (QUIT). Al doilea parametru specifică dacă informațiile ar trebui afișate (OFF) sau ascunse (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 "Vă permite să împiedicați afișarea anumitor informații atunci când cineva utilizează %sINFO asupra pseudonimului. Puteți ascunde adresa de email (EMAIL), ultima mască utilizator@gazdă văzută (MASK), statutul accesului la servicii (STATUS) și ultimul mesaj de plecare din rețea (QUIT). Al doilea parametru specifică dacă informațiile ar trebui afișate (OFF) sau ascunse (ON)."
#, 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)."
msgstr "Vă permite să împiedicați afișarea anumitor informații atunci când cineva utilizează %sINFO asupra pseudonimului dumneavoastră. Vă puteți ascunde adresa de email (EMAIL), ultima mască utilizator@gazdă văzută (MASK), statutul accesului la servicii (STATUS) și ultimul mesaj de plecare din rețea (QUIT). Al doilea parametru specifică dacă informațiile ar trebui afișate (OFF) sau ascunse (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 "Vă permite să împiedicați afișarea anumitor informații atunci când cineva utilizează %sINFO asupra pseudonimului dumneavoastră. Vă puteți ascunde adresa de email (EMAIL), ultima mască utilizator@gazdă văzută (MASK), statutul accesului la servicii (STATUS) și ultimul mesaj de plecare din rețea (QUIT). Al doilea parametru specifică dacă informațiile ar trebui afișate (OFF) sau ascunse (ON)."
#, c-format
msgid "Allows you to see %s information about a channel or a bot"
@@ -2440,25 +2440,25 @@ msgstr "Controlează modurile și încuierile de moduri"
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 ""
"Controlează ce mesaje vor fi trimise utilizatorilor atunci când aceștia se alătură în canal.\n"
"\n"
"Comanda %sADD adaugă mesajul precizat la lista de mesaje afișate utilizatorilor atunci când aceștia se alătură în canal.\n"
"Comanda %sADD adaugă mesajul precizat la lista de mesaje afișate utilizatorilor atunci când aceștia se alătură în canal.\n"
"\n"
"Comanda %sDEL șterge mesajul specificat din lista de mesaje afișate utilizatorilor atunci când aceștia se alătură în canal. Puteți șterge un mesaj specificând numărul acestuia, pe care îl puteți obține listând mesajele după cum este explicat mai jos.\n"
"Comanda %sDEL șterge mesajul specificat din lista de mesaje afișate utilizatorilor atunci când aceștia se alătură în canal. Puteți șterge un mesaj specificând numărul acestuia, pe care îl puteți obține listând mesajele după cum este explicat mai jos.\n"
"\n"
"Comanda %sLIST afișează o listă de mesaje afișate utilizatorilor atunci când se alătură în canal.\n"
"Comanda %sLIST afișează o listă de mesaje afișate utilizatorilor atunci când se alătură în canal.\n"
"\n"
"Comanda %sCLEAR golește toate intrările din lista de mesaje afișate utilizatorilor atunci când aceștia se alătură în canal, dezactivând efectiv mesajele de intrare.\n"
"Comanda %sCLEAR golește toate intrările din lista de mesaje afișate utilizatorilor atunci când aceștia se alătură în canal, dezactivând efectiv mesajele de intrare.\n"
"\n"
"Adăugarea, ștergerea sau golirea mesajelor de intrare necesită permisiunea SET."
@@ -2734,10 +2734,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 ""
"Șterge misiva sau misivele specificate. Puteți furniza mai multe numere de misive, sau intervale de numere în loc de un singur număr, ca în al doilea exemplu de mai jos.\n"
@@ -2748,10 +2748,10 @@ msgstr ""
"\n"
"Exemple:\n"
"\n"
" DEL1\n"
" DEL1\n"
" Șterge prima misivă a dumneavoastră.\n"
"\n"
" DEL2-5,7-9\n"
" DEL2-5,7-9\n"
" Șterge misivele numerotate de la 2 la 5 și de la 7 la 9."
msgid "Deletes the vhost assigned to the given nick from the database."
@@ -3519,11 +3519,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"
@@ -3537,10 +3537,10 @@ msgstr ""
"\n"
"Exemple:\n"
"\n"
" LIST*anope*\n"
" LIST*anope*\n"
" Listează toate canalele înregistrate cu anope în numele lor (fără distincție între majuscule și minuscule).\n"
"\n"
" LIST*NOEXPIRE\n"
" LIST*NOEXPIRE\n"
" Listează toate canalele înregistrate care au fost setate să nu expire.\n"
"\n"
" LIST #51-100\n"
@@ -3674,41 +3674,41 @@ msgstr "Vă deidentifică de la %s, astfel încât să pierdeți privilegiile de
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 ""
"Controlează în principal încuierile modurilor în canale și accesul la moduri în canale (care sunt diferite de accesele în canale).\n"
"\n"
"Comanda %sLOCK vă permite să adăugați, să ștergeți și să vizualizați blocări de mod într-un canal. Dacă un mod este încuiat sau nu, serviciile nu vor permite schimbarea modului respectiv. Comanda SET va goli toate încuierile de mod existente și va seta pe cea precizată, în timp ce ADD și DEL modifică încuierea de mod existentă.\n"
"Comanda %sLOCK vă permite să adăugați, să ștergeți și să vizualizați blocări de mod într-un canal. Dacă un mod este încuiat sau nu, serviciile nu vor permite schimbarea modului respectiv. Comanda SET va goli toate încuierile de mod existente și va seta pe cea precizată, în timp ce ADD și DEL modifică încuierea de mod existentă.\n"
"\n"
"Exemplu:\n"
" %s#canal%sADD+bmnt*!*@*aol*\n"
" %s#canal%sADD+bmnt*!*@*aol*\n"
"\n"
"\n"
"Comanda %sSET vă permite să setați modurile prin intermediul serviciilor. Caracterele wildcard * și ? pot fi menționate ca parametri pentru modurile de listă și statut.\n"
"Comanda %sSET vă permite să setați modurile prin intermediul serviciilor. Caracterele wildcard * și ? pot fi menționate ca parametri pentru modurile de listă și statut.\n"
"\n"
"Exemplu:\n"
" %s#canalSET+v*\n"
" %s#canalSET+v*\n"
" Setează statutul de membru voce pentru toți utilizatorii din canal.\n"
"\n"
" %s#canalSET-b~c:*\n"
" %s#canalSET-b~c:*\n"
" Golește toate blocările extinse care încep cu ~c:\n"
"\n"
"Comanda %sCLEAR este o modalitate ușoară de a goli modurile dintr-un canal. ce poate fi orice nume de mod. Exemplele includ blocări, excepții, suprascrieri de invitații, operatori, semi-operatori și membri voce. Dacă ce nu este menționat, atunci toate modurile de bază sunt înlăturate."
"Comanda %sCLEAR este o modalitate ușoară de a goli modurile dintr-un canal. ce poate fi orice nume de mod. Exemplele includ blocări, excepții, suprascrieri de invitații, operatori, semi-operatori și membri voce. Dacă ce nu este menționat, atunci toate modurile de bază sunt înlăturate."
msgid "Maintain the AutoKick list"
msgstr "Întreține lista de izgoniri automate"
@@ -3724,65 +3724,65 @@ msgstr "Întreține lista %s într-un canal. Utilizatorii care corespund unei
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 ""
"Întreține lista de izgoniri automate într-un canal. Dacă un utilizator din lista de izgoniri automate încearcă să se alăture canalului, %s va bloca acel utilizator din canal, apoi îl va izgoni.\n"
"\n"
"Comanda %sADD adaugă pseudonimul sau masca precizată la lista de izgoniri automate. Dacă este menționat un motiv odată cu comanda, acel motiv va fi folosit când utilizatorul este izgonit; dacă nu, motivul implicit este \"Utilizatorul a fost blocat din canal\". Când izgoniți automat un pseudonim înregistrat, contul %s va fi adăugat la lista de izgoniri automate în loc de mască. Toți utilizatorii din acel grup de pseudonime vor fi apoi izgoniți automat.\n"
"Comanda %sADD adaugă pseudonimul sau masca precizată la lista de izgoniri automate. Dacă este menționat un motiv odată cu comanda, acel motiv va fi folosit când utilizatorul este izgonit; dacă nu, motivul implicit este \"Utilizatorul a fost blocat din canal\". Când izgoniți automat un pseudonim înregistrat, contul %s va fi adăugat la lista de izgoniri automate în loc de mască. Toți utilizatorii din acel grup de pseudonime vor fi apoi izgoniți automat.\n"
"\n"
"Comanda %sDEL înlătură pseudonimul sau masca precizată din lista de izgoniri automate. Totuși, nu înlătură nicio blocare plasată anterior de izgonirile automate; acestea trebuie înlăturate manual.\n"
"Comanda %sDEL înlătură pseudonimul sau masca precizată din lista de izgoniri automate. Totuși, nu înlătură nicio blocare plasată anterior de izgonirile automate; acestea trebuie înlăturate manual.\n"
"\n"
"Comanda %sLIST afișează lista de izgoniri automate sau, opțional, doar acele intrări care corespund măștii precizate.\n"
"Comanda %sLIST afișează lista de izgoniri automate sau, opțional, doar acele intrări care corespund măștii precizate.\n"
"\n"
"Comanda %sVIEW este o versiune mai detaliată a comenzii %sLIST.\n"
"Comanda %sVIEW este o versiune mai detaliată a comenzii %sLIST.\n"
"\n"
"Comanda %sENFORCE determină %s să impună lista curentă de izgoniri automate prin înlăturarea utilizatorilor care corespund deja unei măști izgonite.\n"
"Comanda %sENFORCE determină %s să impună lista curentă de izgoniri automate prin înlăturarea utilizatorilor care corespund deja unei măști izgonite.\n"
"\n"
"Comanda %sCLEAR golește toate intrările din lista de izgoniri automate."
"Comanda %sCLEAR golește toate intrările din lista de izgoniri automate."
#, 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 ""
"Întreține lista de accese într-un canal. Lista de accese specifică căror utilizatori li se permite statutul de operator de canal sau accesul la comenzile %s în canal. Diferite niveluri de utilizator permit accesul la diferite subseturi de privilegii. Orice utilizator înregistrat care nu se află în lista de accese are un nivel de utilizator de 0, iar orice utilizator neînregistrat are un nivel de utilizator de -1.\n"
"\n"
"Comanda %sADD adaugă masca precizată la lista de accese cu nivelul de utilizator precizat; dacă masca este deja prezentă în listă, nivelul său de acces este modificat la nivelul specificat în comandă. Nivelul specificat poate fi un nivel numeric sau numele unui privilegiu (de exemplu AUTOOP). Când un utilizator se alătură canalului, accesul pe care îl primește este cel de la intrarea cu cel mai înalt nivel din lista de accese."
"Comanda %sADD adaugă masca precizată la lista de accese cu nivelul de utilizator precizat; dacă masca este deja prezentă în listă, nivelul său de acces este modificat la nivelul specificat în comandă. Nivelul specificat poate fi un nivel numeric sau numele unui privilegiu (de exemplu AUTOOP). Când un utilizator se alătură canalului, accesul pe care îl primește este cel de la intrarea cu cel mai înalt nivel din lista de accese."
#, 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 ""
"Întreține lista de cuvinte nepotrivite într-un canal. Lista de cuvinte nepotrivite stabilește la ce cuvinte se vor face izgoniri atunci când este activată opțiunea de izgonire la cuvinte nepotrivite. Pentru mai multe informații, tastați %sKICK%s.\n"
"Întreține lista de cuvinte nepotrivite într-un canal. Lista de cuvinte nepotrivite stabilește la ce cuvinte se vor face izgoniri atunci când este activată opțiunea de izgonire la cuvinte nepotrivite. Pentru mai multe informații, tastați %sKICK%s.\n"
"\n"
"Comanda ADD adaugă cuvântul precizat la lista de cuvinte nepotrivite. Dacă se specifică SINGLE, se va executa o izgonire numai dacă utilizatorul scrie întregul cuvânt. Dacă se specifică START, o izgonire va fi executată dacă un utilizator scrie un cuvânt care începe cu cuvântul. Dacă se specifică END, se va executa o izgonire dacă un utilizator scrie un cuvânt care se termină cu cuvântul. Dacă nu specificați nimic, se va executa o izgonire de fiecare dată când un utilizator scrie cuvântul; aceasta va apărea în LIST ca ANY.\n"
"\n"
"Comanda DEL înlătură cuvântul precizat din lista de cuvinte nepotrivite. Dacă este furnizată o listă de numere de intrare, acele intrări sunt șterse. (Vezi exemplul pentru LIST de mai jos.)\n"
"\n"
"Comanda LIST afișează lista de cuvinte nepotrivite. Dacă este precizată o mască wildcard, vor fi afișate doar intrările care corespund măștii. Dacă este furnizată o listă de numere de intrare, sunt afișate doar acele intrări; de exemplu:\n"
" #canalLIST2-5,7-9\n"
" #canalLIST2-5,7-9\n"
" Listează intrările de cuvinte vulgare numerotate de la 2 la 5 și de la 7 la 9.\n"
"\n"
"Comanda CLEAR golește toate intrările din lista de cuvinte nepotrivite."
@@ -3942,28 +3942,28 @@ 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 ""
"Modifică sau afișează lista de certificate pentru pseudonimul dumneavoastră. Dacă vă conectați la IRC și furnizați un certificat de client cu o amprentă digitală potrivită în lista de certificate, veți fi identificat(ă) automat la servicii. Operatorii de Servicii pot prezenta un pseudonim pentru a modifica listele de certificate ale altor utilizatori.\n"
"\n"
"Exemple:\n"
"\n"
" %sADD\n"
" %sADD\n"
" Adaugă amprenta digitală curentă a dumneavoastră la lista de certificate și vă identifică automat atunci când vă conectați la IRC folosind această amprentă.\n"
"\n"
" %sDEL<fingerprint>\n"
" %sDEL<fingerprint>\n"
" Înlătură amprenta digitală <fingerprint> din lista de certificate.\n"
"\n"
" %sLIST\n"
" %sLIST\n"
" Afișează lista curentă de certificate."
#, c-format
@@ -4380,8 +4380,8 @@ msgid "Persistent"
msgstr "Persistent"
#, c-format
msgid "Please confirm that you want to drop %s with %s%s%s"
msgstr "Vă rugăm confirmați că doriți să radiați %s cu %s%s%s"
msgid "Please confirm that you want to drop %s with %s%s%s"
msgstr "Vă rugăm confirmați că doriți să radiați %s cu %s%s%s"
msgid "Please contact an Operator to get a vhost assigned to this nick."
msgstr "Vă rugăm să contactați un Operator pentru a obține o gazdă virtuală atribuită acestui pseudonim."
@@ -4792,8 +4792,8 @@ msgid "See %s for more information about the flags system."
msgstr "Vedeți %s pentru mai multe informații despre sistemul de stegulețe."
#, c-format
msgid "See the %s command (%sACCESS) for information on giving a subset of these privileges to other channel users."
msgstr "Consultați comanda %s (%sACCESS) pentru informații despre acordarea unui subset al acestor privilegii altor utilizatori ai canalului."
msgid "See the %s command (%sACCESS) for information on giving a subset of these privileges to other channel users."
msgstr "Consultați comanda %s (%sACCESS) pentru informații despre acordarea unui subset al acestor privilegii altor utilizatori ai canalului."
msgid "Send a memo to a nick or channel"
msgstr "Expediază o misivă către un pseudonim sau canal"
@@ -5073,13 +5073,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 ""
"Activează sau dezactivează izgonirea la cuvinte nepotrivite. Când este activată, această opțiune informează botul să izgonească utilizatorii care rostesc anumite cuvinte în canale.\n"
"\n"
"Puteți defini cuvinte nepotrivite pentru canalul dumneavoastră folosind comanda BADWORDS. Tastați %sBADWORDS pentru mai multe informații.\n"
"Puteți defini cuvinte nepotrivite pentru canalul dumneavoastră folosind comanda BADWORDS. Tastați %sBADWORDS pentru mai multe informații.\n"
"\n"
"ttb reprezintă de câte ori un utilizator poate fi izgonit înainte de a fi blocat. Nu utilizați ttb pentru a dezactiva blocările activate."
@@ -5233,8 +5233,8 @@ msgid "Sets whether you will be given your channel status modes automatically. S
msgstr "Setează dacă veți primi automat modurile de statut în canale. Setați la ON pentru a permite %s să vă seteze automat modurile de statut atunci când intrați în canale. Rețineți că, în funcție de setările canalelor, este posibil ca unele moduri să nu fie setate automat."
#, c-format
msgid "Setting %s not known. Type %sLEVELS for a list of valid settings."
msgstr "Setarea %s nu este cunoscută. Tastați %sLEVELS pentru o listă de setări valide."
msgid "Setting %s not known. Type %sLEVELS for a list of valid settings."
msgstr "Setarea %s nu este cunoscută. Tastați %sLEVELS pentru o listă de setări valide."
msgid "Setting for DEBUG must be ON, OFF, or a positive number."
msgstr "Setarea pentru DEBUG trebuie să fie ON, OFF sau un număr pozitiv."
@@ -5422,7 +5422,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 ""
"Sintaxă: LIMIT [utilizator | canal] {limită | NONE} [HARD]\n"
"\n"
@@ -5430,7 +5430,7 @@ msgstr ""
"\n"
"Adăugarea funcției HARD împiedică utilizatorul să modifice limita. Neadăugarea funcției HARD are efectul opus, permițând utilizatorului să modifice limita (chiar dacă o limită anterioară a fost setată cu HARD).\n"
"\n"
"Această utilizare a comenzii SETLIMIT este limitată la Operatorii de Servicii. Alți utilizatori pot introduce o limită doar pentru ei înșiși sau pentru un canal în care au astfel de privilegii; nu își pot înlătura limita, nu pot seta o limită peste %d și nu pot seta o limită strictă."
"Această utilizare a comenzii SETLIMIT este limitată la Operatorii de Servicii. Alți utilizatori pot introduce o limită doar pentru ei înșiși sau pentru un canal în care au astfel de privilegii; nu își pot înlătura limita, nu pot seta o limită peste %d și nu pot seta o limită strictă."
#, c-format
msgid ""
@@ -5531,134 +5531,134 @@ msgstr "Text"
#, 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 ""
"Comanda %s permite un control fin asupra semnificației nivelurilor numerice de acces utilizate pentru canale. Cu această comandă, puteți defini nivelul de acces necesar pentru majoritatea funcțiilor lui %s. (Comanda SETFOUNDER și această comandă sunt întotdeauna restricționate la fondatorul canalului).\n"
"Comanda %s permite un control fin asupra semnificației nivelurilor numerice de acces utilizate pentru canale. Cu această comandă, puteți defini nivelul de acces necesar pentru majoritatea funcțiilor lui %s. (Comanda SETFOUNDER și această comandă sunt întotdeauna restricționate la fondatorul canalului).\n"
"\n"
"%sSET permite modificarea nivelului de acces pentru o funcție sau un grup de funcții. %sDISABLE (sau pe scurt DIS) dezactivează o funcție automată sau interzice accesul la o funcție oricui, INCLUSIV fondatorului (deși fondatorul o poate reactiva oricând). Folosiți %sSET founder doar pentru a crea un nivel de fondator.\n"
"%sSET permite modificarea nivelului de acces pentru o funcție sau un grup de funcții. %sDISABLE (sau pe scurt DIS) dezactivează o funcție automată sau interzice accesul la o funcție oricui, INCLUSIV fondatorului (deși fondatorul o poate reactiva oricând). Folosiți %sSET founder doar pentru a crea un nivel de fondator.\n"
"\n"
"%sLIST afișează nivelurile curente pentru fiecare funcție sau grup de funcții. %sRESET resetează nivelurile la nivelurile implicite ale unui canal nou creat.\n"
"%sLIST afișează nivelurile curente pentru fiecare funcție sau grup de funcții. %sRESET resetează nivelurile la nivelurile implicite ale unui canal nou creat.\n"
"\n"
"Pentru o listă a caracteristicilor și funcțiilor ale căror niveluri pot fi setate, consultați HELP%sDESC."
"Pentru o listă a caracteristicilor și funcțiilor ale căror niveluri pot fi setate, consultați 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 ""
"Comanda %sADD adaugă pseudonimul precizat la lista %s.\n"
"Comanda %sADD adaugă pseudonimul precizat la lista %s.\n"
"\n"
"Comanda %sDEL înlătură pseudonimul precizat din lista %s. Dacă este specificată o listă cu numere de intrare, acele intrări sunt înlăturate. (Vedeți exemplul pentru LIST de mai jos.)\n"
"Comanda %sDEL înlătură pseudonimul precizat din lista %s. Dacă este specificată o listă cu numere de intrare, acele intrări sunt înlăturate. (Vedeți exemplul pentru LIST de mai jos.)\n"
"\n"
"Comanda %sLIST afișează lista %s. Dacă este precizată o mască wildcard, sunt afișate doar intrările care corespund măștii. Dacă este specificată o listă de numere de intrare, sunt afișate doar acele intrări; de exemplu:\n"
" %s#canalLIST2-5,7-9\n"
"Comanda %sLIST afișează lista %s. Dacă este precizată o mască wildcard, sunt afișate doar intrările care corespund măștii. Dacă este specificată o listă de numere de intrare, sunt afișate doar acele intrări; de exemplu:\n"
" %s#canalLIST2-5,7-9\n"
" Listează intrările %s numerotate de la 2 la 5 și de la 7 la 9.\n"
"\n"
"Comanda %sCLEAR golește toate intrările din lista %s."
"Comanda %sCLEAR golește toate intrările din lista %s."
#, 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 ""
"Comanda %sDEL înlătură masca precizată din lista AKILL dacă este prezentă. Dacă este specificată o listă de numere de intrare, acele intrări sunt înlăturate. (Vedeți exemplul pentru LIST de mai jos.)\n"
"Comanda %sDEL înlătură masca precizată din lista AKILL dacă este prezentă. Dacă este specificată o listă de numere de intrare, acele intrări sunt înlăturate. (Vedeți exemplul pentru LIST de mai jos.)\n"
"\n"
"Comanda %sLIST afișează lista AKILL. Dacă este precizată o mască wildcard, sunt afișate doar intrările care corespund măștii. Dacă este specificată o listă de numere de intrare, sunt afișate doar acele intrări; de exemplu:\n"
" %sLIST2-5,7-9\n"
"Comanda %sLIST afișează lista AKILL. Dacă este precizată o mască wildcard, sunt afișate doar intrările care corespund măștii. Dacă este specificată o listă de numere de intrare, sunt afișate doar acele intrări; de exemplu:\n"
" %sLIST2-5,7-9\n"
" Listează intrările AKILL numerotate de la 2 la 5 și de la 7 la 9.\n"
"\n"
"%sVIEW este o versiune mai detaliată a %sLIST și va afișa cine a adăugat un AKILL, data la care a fost adăugat și când expiră, precum și masca utilizator@gazdă/ip și motivul.\n"
"%sVIEW este o versiune mai detaliată a %sLIST și va afișa cine a adăugat un AKILL, data la care a fost adăugat și când expiră, precum și masca utilizator@gazdă/ip și motivul.\n"
"\n"
"%sCLEAR golește toate intrările din lista AKILL."
"%sCLEAR golește toate intrările din lista AKILL."
#, 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 ""
"Comanda %sDEL înlătură pseudonimul precizat din lista de accese. Dacă este furnizată o listă de numere de intrare, acele intrări sunt înlăturate. (Vedeți exemplul pentru LIST de mai jos.) Vă puteți înlătura dintr-o listă de acces, chiar dacă nu aveți acces pentru a modifica lista respectivă în alt mod.\n"
"Comanda %sDEL înlătură pseudonimul precizat din lista de accese. Dacă este furnizată o listă de numere de intrare, acele intrări sunt înlăturate. (Vedeți exemplul pentru LIST de mai jos.) Vă puteți înlătura dintr-o listă de acces, chiar dacă nu aveți acces pentru a modifica lista respectivă în alt mod.\n"
"\n"
"Comanda %sLIST afișează lista de accese. Dacă este precizată o mască wildcard, sunt afișate doar intrările care corespund măștii. Dacă este specificată o listă de numere de intrare, sunt afișate doar acele intrări; de exemplu:\n"
" %s#canalLIST2-5,7-9\n"
"Comanda %sLIST afișează lista de accese. Dacă este precizată o mască wildcard, sunt afișate doar intrările care corespund măștii. Dacă este specificată o listă de numere de intrare, sunt afișate doar acele intrări; de exemplu:\n"
" %s#canalLIST2-5,7-9\n"
" Listează intrările de accese numerotate de la 2 la 5 și de la 7 la 9.\n"
"\n"
"Comanda %sVIEW afișează lista de accese similară cu comanda %sLIST, dar arată în plus creatorul și timpul ultimei utilizări.\n"
"Comanda %sVIEW afișează lista de accese similară cu comanda %sLIST, dar arată în plus creatorul și timpul ultimei utilizări.\n"
"\n"
"%sCLEAR golește toate intrările din lista de accese."
"%sCLEAR golește toate intrările din lista de accese."
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 ""
"Comanda SNLINEDEL înlătură masca precizată din lista SNLINE dacă aceasta este prezentă. Dacă este furnizată o listă de numere de intrare, acele intrări sunt înlăturate. (Vedeți exemplul pentru LIST de mai jos.)\n"
"Comanda SNLINEDEL înlătură masca precizată din lista SNLINE dacă aceasta este prezentă. Dacă este furnizată o listă de numere de intrare, acele intrări sunt înlăturate. (Vedeți exemplul pentru LIST de mai jos.)\n"
"\n"
"Comanda SNLINELIST LIST afișează lista SNLINE. Dacă este precizată o mască wildcard, vor fi afișate doar intrările care corespund măștii. Dacă este furnizată o listă de numere de intrare, sunt afișate doar acele intrări; de exemplu:\n"
" SNLINELIST2-5,7-9\n"
"Comanda SNLINELIST LIST afișează lista SNLINE. Dacă este precizată o mască wildcard, vor fi afișate doar intrările care corespund măștii. Dacă este furnizată o listă de numere de intrare, sunt afișate doar acele intrări; de exemplu:\n"
" SNLINELIST2-5,7-9\n"
" Listează intrările SNLINE numerotate de la 2 la 5 și de la 7 la 9.\n"
"\n"
"SNLINEVIEW este o versiune mai detaliată a SNLINELIST și va afișa cine a adăugat un SNLINE, data la care a fost adăugat și când expiră, precum și masca numelui real și motivul.\n"
"SNLINEVIEW este o versiune mai detaliată a SNLINELIST și va afișa cine a adăugat un SNLINE, data la care a fost adăugat și când expiră, precum și masca numelui real și motivul.\n"
"\n"
"SNLINECLEAR golește toate intrările din lista SNLINE."
"SNLINECLEAR golește toate intrările din lista SNLINE."
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 ""
"Comanda SQLINEDEL înlătură masca precizată din lista SQLINE dacă aceasta este prezentă. Dacă este furnizată o listă de numere de intrare, acele intrări sunt înlăturate. (Vedeți exemplul pentru LIST de mai jos.)\n"
"Comanda SQLINEDEL înlătură masca precizată din lista SQLINE dacă aceasta este prezentă. Dacă este furnizată o listă de numere de intrare, acele intrări sunt înlăturate. (Vedeți exemplul pentru LIST de mai jos.)\n"
"\n"
"Comanda SQLINELIST afișează lista SQLINE. Dacă este precizată o mască wildcard, sunt afișate doar intrările care corespund măștii. Dacă este specificată o listă de numere de intrare, sunt afișate doar acele intrări; de exemplu:\n"
" SQLINELIST2-5,7-9\n"
"Comanda SQLINELIST afișează lista SQLINE. Dacă este precizată o mască wildcard, sunt afișate doar intrările care corespund măștii. Dacă este specificată o listă de numere de intrare, sunt afișate doar acele intrări; de exemplu:\n"
" SQLINELIST2-5,7-9\n"
" Listează intrările SQLINE numerotate de la 2 la 5 și de la 7 la 9.\n"
"\n"
"SQLINEVIEW este o versiune mai detaliată a SQLINELIST și va afișa cine a adăugat un SQLINE, data la care a fost adăugat și când expiră, precum și masca și motivul.\n"
"SQLINEVIEW este o versiune mai detaliată a SQLINELIST și va afișa cine a adăugat un SQLINE, data la care a fost adăugat și când expiră, precum și masca și motivul.\n"
"\n"
"SQLINECLEAR golește toate intrările din lista SQLINE."
"SQLINECLEAR golește toate intrările din lista SQLINE."
#, c-format
msgid ""
@@ -5667,7 +5667,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 ""
"Comanda STATS oferă statistici despre pseudonimele stocate și utilizarea memoriei.\n"
@@ -5675,11 +5675,11 @@ msgstr ""
"Comanda CLEAR vă permite să goliți baza de date prin ștergerea tuturor intrărilor din baza de date care au fost adăugate în intervalul de timp specificat.\n"
"\n"
"Exemplu:\n"
" %sCLEAR30m\n"
" %sCLEAR30m\n"
" Va goli toate intrările adăugate în ultimele 30 de minute."
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 "Parametrul email este opțional și va seta imediat adresa de email pentru pseudonimul dumneavoastră. Este posibil să doriți, de asemenea, a utiliza SETHIDE după înregistrare, dacă ascunderea adresei de email nu este deja o setare implicită."
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 "Parametrul email este opțional și va seta imediat adresa de email pentru pseudonimul dumneavoastră. Este posibil să doriți, de asemenea, a utiliza SETHIDE după înregistrare, dacă ascunderea adresei de email nu este deja o setare implicită."
#, c-format
msgid ""
@@ -5687,14 +5687,14 @@ 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"
" MESSAGEtatus], NOTICEtatus], 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 ""
"Comanda %s permite utilizatorilor să configureze setările de înregistrare în jurnal pentru canalele lor. Dacă nu sunt furnizați parametri, această comandă listează metodele de înregistrare curente pentru acest canal.\n"
@@ -5708,7 +5708,7 @@ msgstr ""
"Pentru a înlătura o metodă de înregistrare în jurnal, utilizați aceeași sintaxă ca pentru a o adăuga.\n"
"\n"
"Examplu:\n"
" %s#anopechanserv/accessMESSAGE@\n"
" %s#anopechanserv/accessMESSAGE@\n"
" Trimite un mesaj tuturor operatorilor de fiecare dată când cineva folosește în canal comanda ACCESS aparținând serviciului ChanServ."
#, c-format
@@ -5889,8 +5889,8 @@ msgstr[0] "Există %zu misivă către canalul %s."
msgstr[1] "Există %zu misive către canalul %s."
#, c-format
msgid "There is a new memo on channel %s. Type %s%s%zu to read it."
msgstr "Există o nouă misivă către canalul %s. Tastați %s%s%zu pentru a o citi."
msgid "There is a new memo on channel %s. Type %s%s%zu to read it."
msgstr "Există o nouă misivă către canalul %s. Tastați %s%s%zu pentru a o citi."
#, c-format
msgid "There is no bot assigned to %s anymore."
@@ -6026,14 +6026,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 ""
"Această comandă caută în fișierele de jurnal ale serviciilor mesaje care se potrivesc cu modelul precizat. Argumentele zi și limită pot fi folosite pentru a specifica câte zile de jurnale să caute și numărul de răspunsuri la care să se limiteze. În mod implicit, această comandă caută o săptămână de jurnale și limitează răspunsurile la 50.\n"
"\n"
"De exemplu:\n"
" LOGSEARCH+21d+500lAnope\n"
" LOGSEARCH+21d+500lAnope\n"
" Caută în jurnalele din ultimele 21 de zile mesajele care conțin Anope și listează cele mai recente 500 dintre acestea."
msgid "This command tells you what a users access is on a channel and what access entries, if any, they match. Additionally it will tell you of any auto kick entries they match. Usage of this command is limited to users who have the ability to modify access entries on the channel."
@@ -6064,8 +6064,8 @@ msgid "This nickname is suspended."
msgstr "Acest pseudonim este suspendat."
#, c-format
msgid "This nickname is registered and has protection enabled. If it belongs to you, type %spassword to identify to your account."
msgstr "Acest pseudonim este înregistrat și are protecția activată. Dacă vă aparține, tastați %sparola pentru a vă identifica în contul dumneavoastră."
msgid "This nickname is registered and has protection enabled. If it belongs to you, type %spassword to identify to your account."
msgstr "Acest pseudonim este înregistrat și are protecția activată. Dacă vă aparține, tastați %sparola pentru a vă identifica în contul dumneavoastră."
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 "Această opțiune împiedică asocierea unui bot într-un canal. Dacă un bot este deja asociat, acesta este disociat automat atunci când activați opțiunea."
@@ -6173,34 +6173,34 @@ msgid "Type %s for more information."
msgstr "Tastați %s pentru mai multe informații."
#, c-format
msgid "Type %scommand for help on any of the above commands."
msgstr "Tastați %scomanda pentru ajutor cu oricare dintre comenzile de mai sus."
msgid "Type %scommand for help on any of the above commands."
msgstr "Tastați %scomanda pentru ajutor cu oricare dintre comenzile de mai sus."
#, c-format
msgid "Type %soption for more information on a particular option."
msgstr "Tastați %sopțiunea pentru mai multe informații despre o anumită opțiune."
msgid "Type %soption for more information on a particular option."
msgstr "Tastați %sopțiunea pentru mai multe informații despre o anumită opțiune."
#, c-format
msgid "Type %soption for more information on a specific option."
msgstr "Tastați %sopțiunea pentru mai multe informații despre o anumită opțiune."
msgid "Type %soption for more information on a specific option."
msgstr "Tastați %sopțiunea pentru mai multe informații despre o anumită opțiune."
#, 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 ""
"Tastați %sopțiunea pentru mai multe informații despre o anumită opțiune.\n"
"Tastați %sopțiunea pentru mai multe informații despre o anumită opțiune.\n"
"\n"
"Notă: accesul la această comandă este controlat de nivelul SET."
#, c-format
msgid "Type %soption for more information on a specific option. The options will be set on the given nickname."
msgstr "Tastați %sopțiunea pentru mai multe informații despre o anumită opțiune. Opțiunile vor fi setate pentru pseudonimul precizat."
msgid "Type %soption for more information on a specific option. The options will be set on the given nickname."
msgstr "Tastați %sopțiunea pentru mai multe informații despre o anumită opțiune. Opțiunile vor fi setate pentru pseudonimul precizat."
#, c-format
msgid "Type %sregion to list timezones for a region."
msgstr "Tastați %sregiune pentru a lista fusurile orare ale unei regiuni."
msgid "Type %sregion to list timezones for a region."
msgstr "Tastați %sregiune pentru a lista fusurile orare ale unei regiuni."
msgid "Un-Load a module"
msgstr "Aruncă un modul"
@@ -6304,8 +6304,8 @@ msgid "Uplink server: %s"
msgstr "Server de uplink: %s"
#, c-format
msgid "Use the %sALL command to list all commands and their descriptions."
msgstr "Utilizați comanda %sALL pentru a lista toate comenzile și descrierile acestora."
msgid "Use the %sALL command to list all commands and their descriptions."
msgstr "Utilizați comanda %sALL pentru a lista toate comenzile și descrierile acestora."
msgid "Used on"
msgstr "Utilizat(ă) în"
@@ -6634,8 +6634,8 @@ msgstr[0] "Aveți %d misivă nouă."
msgstr[1] "Aveți %d misive noi."
#, c-format
msgid "You have a new memo from %s. Type %s%zu to read it."
msgstr "Aveți o misivă nouă de la %s. Tastați %s%zu pentru a o citi."
msgid "You have a new memo from %s. Type %s%zu to read it."
msgstr "Aveți o misivă nouă de la %s. Tastați %s%zu pentru a o citi."
#, c-format
msgid "You have been invited to %s by %s."
@@ -6740,8 +6740,8 @@ msgid "You must have the %s(ME) privilege on the channel to use this command."
msgstr "Trebuie să aveți privilegiul %s(ME) în canal pentru a utiliza această comandă."
#, 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 "Trebuie să furnizați acum o adresă de email pentru pseudonimul dumneavoastră. Această adresă de email vă va permite să vă recuperați contul în cazul în care vă uitați parola. Tastați %semail pentru a vă seta adresa de email."
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 "Trebuie să furnizați acum o adresă de email pentru pseudonimul dumneavoastră. Această adresă de email vă va permite să vă recuperați contul în cazul în care vă uitați parola. Tastați %semail pentru a vă seta adresa de email."
#, c-format
msgid "You must wait %s before registering your nick."
+179 -179
View File
@@ -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"
" MESSAGEtatus], NOTICEtatus], 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"
" MESSAGEtatus], NOTICEtatus], 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."
+19 -16
View File
@@ -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()
+2 -2
View File
@@ -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(),
+12 -5
View File
@@ -482,7 +482,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 "
@@ -501,16 +501,23 @@ public:
"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 examples;
examples.AddEntry("#channel LIST 2-5,7-9", _(
"Lists bad word entries on \037#channel\037 numbered 2 through 5 and 7 through 9."
));
examples.AddEntry("#channel LIST *UwU*", _(
"Lists bad word entries on \037#channel\037 that match \037*UwU*\037."
));
examples.SendTo(source);
return true;
}
};
+3 -3
View File
@@ -350,15 +350,15 @@ 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, "
"\002%s\033ADD\002 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"
"\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 "
+2 -2
View File
@@ -159,7 +159,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 +322,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 "
+1 -1
View File
@@ -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;
+3 -3
View File
@@ -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(),
@@ -464,7 +464,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);
+26 -21
View File
@@ -605,7 +605,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,33 +626,38 @@ 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."
"\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))
@@ -660,7 +665,7 @@ public:
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 +705,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 +748,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());
}
@@ -868,22 +873,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(),
+7 -7
View File
@@ -683,7 +683,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 +692,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(),
+4 -4
View File
@@ -251,19 +251,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"
+15 -12
View File
@@ -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(" ");
+15 -7
View File
@@ -279,22 +279,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;
}
};
+17 -17
View File
@@ -434,7 +434,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;
@@ -811,34 +811,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;
}
};
+1 -1
View File
@@ -109,7 +109,7 @@ public:
{
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."
),
+10 -10
View File
@@ -226,16 +226,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;
}
};
+1 -1
View File
@@ -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;
}
+94 -28
View File
@@ -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;
@@ -100,17 +110,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> &params) override
@@ -140,46 +182,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", Language::Translate(source.nc, 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(
Language::Translate(source.nc, _("\037channel\037 [\037%s\037]")),
Language::Translate(source.nc, value)
));
Command::SendSyntax(source);
}
};
class CSSetMisc final
@@ -204,37 +270,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 +309,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 +323,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;
}
}
};
+3 -2
View File
@@ -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());
}
}
+11 -10
View File
@@ -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,10 +626,14 @@ 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);
+65 -3
View File
@@ -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 },
@@ -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)
{
+6 -1
View File
@@ -219,7 +219,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)
+2 -1
View File
@@ -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)
+2 -1
View File
@@ -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)
+2 -1
View File
@@ -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)
+14 -2
View File
@@ -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
+8 -3
View File
@@ -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"
+5 -5
View File
@@ -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(),
+1 -1
View File
@@ -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());
}
}
+7 -7
View File
@@ -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(),
@@ -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."
+1 -1
View File
@@ -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
View File
@@ -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;
}
};
+11 -3
View File
@@ -143,10 +143,18 @@ public:
"Lists any memos you currently have. With \002NEW\002, lists only "
"new (unread) memos. Unread memos are marked with a \"*\" "
"to the left of the memo number. You can also specify a list "
"of numbers, as in the example below:\n"
" \002LIST 2-5,7-9\002\n"
" Lists memos numbered 2 through 5 and 7 through 9."
"of numbers."
));
ExampleWrapper examples;
examples.AddEntry("NEW", _(
"Lists any new memos."
));
examples.AddEntry("2-5,7-9", _(
"Lists memos numbered 2 through 5 and 7 through 9."
));
examples.SendTo(source);
return true;
}
};
+17 -5
View File
@@ -204,12 +204,24 @@ public:
"given, sends you the memo you most recently received. If "
"NEW is given, sends you all of your new memos. If ALL is "
"given, sends you all of your memos. Otherwise, sends you "
"memo number \037num\037. You can also give a list of numbers, "
"as in this example:"
"\n\n"
" \002READ 2-5,7-9\002\n"
" Displays memos numbered 2 through 5 and 7 through 9."
"memo number \037num\037. You can also give a list of numbers."
));
ExampleWrapper examples;
examples.AddEntry("ALL", _(
"Displays all of your memos."
));
examples.AddEntry("LAST", _(
"Displays your last memo."
));
examples.AddEntry("NEW", _(
"Displays any new memos."
));
examples.AddEntry("2-5,7-9", _(
"Displays memos numbered 2 through 5 and 7 through 9."
));
examples.SendTo(source);
return true;
}
};
+2 -2
View File
@@ -235,7 +235,7 @@ public:
help.SendTo(source);
source.Reply(" ");
source.Reply(_("Type \002%s\032\037option\037\002 for more information on a specific option."),
source.Reply(_("Type \002%s\033\037option\037\002 for more information on a specific option."),
source.service->GetQueryCommand("generic/help", source.command).c_str());
}
else if (subcommand.equals_ci("NOTIFY"))
@@ -280,7 +280,7 @@ public:
"change the limit (even if a previous limit was set with "
"\002HARD\002)."
"\n\n"
"This use of the \002SET\032LIMIT\002 command is limited to \002Services "
"This use of the \002SET\033LIMIT\002 command is limited to \002Services "
"Operators\002. 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 "
+6 -6
View File
@@ -236,7 +236,7 @@ public:
u->SendMessage(NickServ, _(
"This nickname is registered and has protection enabled. If it belongs to you, "
"type \002%s\032\037password\037\002 to identify to your account."
"type \002%s\033\037password\037\002 to identify to your account."
),
NickServ->GetQueryCommand("nickserv/identify", u->nick).c_str()
);
@@ -418,7 +418,7 @@ public:
u->SendMessage(NickServ, _(
"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 "
"\002%s\032\037email\037\002 in order to set your email address."
"\002%s\033\037email\037\002 in order to set your email address."
),
NickServ->GetQueryCommand("nickserv/set/email").c_str());
}
@@ -530,9 +530,9 @@ public:
"\002%s\002 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 \002%s\032\037command\037\002. "
"nicknames; 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."
),
NickServ->nick.c_str(),
NickServ->GetQueryCommand().c_str(),
@@ -543,9 +543,9 @@ public:
source.Reply(_(
"\002%s\002 allows you to register an account. "
"The following commands allow for registration and maintenance of "
"accounts; to use them, type \002%s\032\037command\037\002. "
"accounts; 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."
),
NickServ->nick.c_str(),
NickServ->GetQueryCommand().c_str(),
+411 -146
View File
@@ -15,7 +15,20 @@
#include "module.h"
#include "modules/nickserv/cert.h"
static Anope::unordered_map<NickCore *> certmap;
#define NICKSERV_CERT_TYPE "NSCert"
struct NSCertInfo final
: NickServ::Cert
, Serializable
{
NSCertInfo(Extensible *ext)
: Serializable(NICKSERV_CERT_TYPE)
{
account = anope_dynamic_static_cast<NickCore *>(ext);
}
};
static Anope::unordered_map<NSCertInfo *> certmap;
struct CertServiceImpl final
: NickServ::CertService
@@ -27,9 +40,9 @@ struct CertServiceImpl final
NickCore *FindAccountFromCert(const Anope::string &cert) override
{
Anope::unordered_map<NickCore *>::iterator it = certmap.find(cert);
auto it = certmap.find(cert);
if (it != certmap.end())
return it->second;
return it->second->account;
return NULL;
}
@@ -48,8 +61,10 @@ struct CertServiceImpl final
struct NSCertListImpl final
: NickServ::CertList
{
friend class NSCertInfoType;
Serialize::Reference<NickCore> nc;
std::vector<Anope::string> certs;
std::vector<NSCertInfo *> certs;
public:
NSCertListImpl(Extensible *obj) : nc(anope_dynamic_static_cast<NickCore *>(obj)) { }
@@ -65,11 +80,15 @@ public:
*
* Adds a new entry into the cert list.
*/
void AddCert(const Anope::string &entry) override
NickServ::Cert *AddCert(const Anope::string &entry) override
{
this->certs.push_back(entry);
certmap[entry] = nc;
FOREACH_MOD(OnNickAddCert, (this->nc, entry));
auto *cert = new NSCertInfo(nc);
cert->fingerprint = entry;
this->certs.push_back(cert);
certmap[entry] = cert;
FOREACH_MOD(OnNickAddCert, (this->nc, cert));
return cert;
}
/** Get an entry from the nick's cert list by index
@@ -79,10 +98,11 @@ public:
*
* Retrieves an entry from the certificate list corresponding to the given index.
*/
Anope::string GetCert(unsigned entry) const override
NickServ::Cert *GetCert(unsigned entry) const override
{
if (entry >= this->certs.size())
return "";
return nullptr;
return this->certs[entry];
}
@@ -100,7 +120,10 @@ public:
*/
bool FindCert(const Anope::string &entry) const override
{
return std::find(this->certs.begin(), this->certs.end(), entry) != this->certs.end();
auto it = std::find_if(this->certs.begin(), this->certs.end(), [&entry](const NSCertInfo *cert) {
return cert->fingerprint == entry;
});
return it != this->certs.end();
}
/** Erase a fingerprint from the nick's certificate list
@@ -111,34 +134,45 @@ public:
*/
void EraseCert(const Anope::string &entry) override
{
std::vector<Anope::string>::iterator it = std::find(this->certs.begin(), this->certs.end(), entry);
auto it = std::find_if(this->certs.begin(), this->certs.end(), [&entry](const NSCertInfo *cert) {
return cert->fingerprint == entry;
});
if (it != this->certs.end())
{
FOREACH_MOD(OnNickEraseCert, (this->nc, entry));
FOREACH_MOD(OnNickEraseCert, (this->nc, *it));
certmap.erase(entry);
delete *it;
this->certs.erase(it);
}
}
void ReplaceCert(const Anope::string &oldentry, const Anope::string &newentry) override
{
auto it = std::find(this->certs.begin(), this->certs.end(), oldentry);
if (it == this->certs.end())
auto oldit = std::find_if(this->certs.begin(), this->certs.end(), [&oldentry](const NSCertInfo *cert) {
return cert->fingerprint == oldentry;
});
if (oldit == this->certs.end())
return; // We can't replace a non-existent cert.
FOREACH_MOD(OnNickEraseCert, (this->nc, oldentry));
FOREACH_MOD(OnNickEraseCert, (this->nc, *oldit));
certmap.erase(oldentry);
if (std::find(this->certs.begin(), this->certs.end(), newentry) != this->certs.end())
auto newit = std::find_if(this->certs.begin(), this->certs.end(), [&newentry](const NSCertInfo *cert) {
return cert->fingerprint == newentry;
});
if (newit != this->certs.end())
{
// The cert we're upgrading to already exists.
this->certs.erase(it);
delete *newit;
this->certs.erase(newit);
return;
}
*it = newentry;
certmap[newentry] = nc;
FOREACH_MOD(OnNickAddCert, (this->nc, newentry));
auto *cert = *newit;
cert->fingerprint = newentry;
certmap[newentry] = cert;
FOREACH_MOD(OnNickAddCert, (this->nc, cert));
}
/** Clears the entire nick's cert list
@@ -148,8 +182,11 @@ public:
void ClearCert() override
{
FOREACH_MOD(OnNickClearCert, (this->nc));
for (const auto &cert : certs)
certmap.erase(cert);
for (const auto *cert : certs)
{
delete cert;
certmap.erase(cert->fingerprint);
}
this->certs.clear();
}
@@ -164,53 +201,104 @@ public:
{
ExtensibleItem(Module *m, const Anope::string &ename) : ::ExtensibleItem<NSCertListImpl>(m, ename) { }
void ExtensibleSerialize(const Extensible *e, const Serializable *s, Serialize::Data &data) const override
{
if (s->GetSerializableType()->GetName() != NICKCORE_TYPE)
return;
const NickCore *n = anope_dynamic_static_cast<const NickCore *>(e);
auto *c = this->Get(n);
if (c == NULL || !c->GetCertCount())
return;
std::ostringstream oss;
for (unsigned i = 0; i < c->GetCertCount(); ++i)
oss << c->GetCert(i) << " ";
data.Store("cert", oss.str());
}
void ExtensibleUnserialize(Extensible *e, Serializable *s, Serialize::Data &data) override
{
// Begin 2.0 compatibility.
if (s->GetSerializableType()->GetName() != NICKCORE_TYPE)
return;
NickCore *n = anope_dynamic_static_cast<NickCore *>(e);
auto *c = this->Require(n);
auto *nc = anope_dynamic_static_cast<NickCore *>(e);
auto *cl = this->Require(nc);
// Delete the old cert list.
for (const auto *cert : cl->certs)
{
delete cert;
certmap.erase(cert->fingerprint);
}
cl->certs.clear();
// Add the new cert list
Anope::string buf;
data["cert"] >> buf;
spacesepstream sep(buf);
for (const auto &cert : c->certs)
certmap.erase(cert);
c->certs.clear();
while (sep.GetToken(buf))
for (spacesepstream sep(buf); sep.GetToken(buf); )
{
c->certs.push_back(buf);
certmap[buf] = n;
auto *cert = new NSCertInfo(e);
cert->fingerprint = buf;
cl->certs.push_back(cert);
certmap[buf] = cert;
}
// End 2.0 compatibility.
}
};
};
class NSCertInfoType final
: public Serialize::Type
{
public:
NSCertInfoType()
: Serialize::Type(NICKSERV_CERT_TYPE)
{
}
void Serialize(Serializable *obj, Serialize::Data &data) const override
{
const auto *cert = static_cast<const NSCertInfo *>(obj);
data.Store("account", cert->account->GetId());
data.Store("created", cert->created);
data.Store("creator", cert->creator);
data.Store("description", cert->description);
data.Store("fingerprint", cert->fingerprint);
}
Serializable *Unserialize(Serializable *obj, Serialize::Data &data) const override
{
uint64_t account = 0;
data["account"] >> account;
auto *nc = NickCore::FindId(account);
if (!nc)
return nullptr; // Missing user.
NSCertInfo *cert;
if (obj)
cert = anope_dynamic_static_cast<NSCertInfo *>(obj);
else
cert = new NSCertInfo(nc);
data["created"] >> cert->created;
data["creator"] >> cert->creator;
data["description"] >> cert->description;
data["fingerprint"] >> cert->fingerprint;
if (!obj)
{
auto *cl = nc->Require<NSCertListImpl>(NICKSERV_CERT_EXT);
cl->certs.push_back(cert);
certmap[cert->fingerprint] = cert;
}
return cert;
}
};
class CommandNSCert final
: public Command
{
private:
void DoAdd(CommandSource &source, NickCore *nc, Anope::string certfp)
void DoAdd(CommandSource &source, const std::vector<Anope::string> &params)
{
auto *cl = nc->Require<NickServ::CertList>(NICKSERV_CERT_EXT);
auto *nc = FindTarget(source, params.size() == 3 ? params[1] : "", true);
if (!nc)
return;
const auto certfp = FindFingerprint(source, params, nc, false);
if (certfp.empty())
return;
auto *cl = nc->Require<NickServ::CertList>(NICKSERV_CERT_EXT);
const auto max = Config->GetModule(this->owner).Get<unsigned>("max", "5");
if (cl->GetCertCount() >= max)
{
@@ -219,19 +307,6 @@ private:
return;
}
if (source.GetAccount() == nc)
{
User *u = source.GetUser();
if (!u || u->fingerprint.empty())
{
source.Reply(_("You are not using a client certificate."));
return;
}
certfp = u->fingerprint;
}
if (cl->FindCert(certfp))
{
source.Reply(_("Fingerprint \002%s\002 already present on %s's certificate list."), certfp.c_str(), nc->display.c_str());
@@ -244,28 +319,25 @@ private:
return;
}
cl->AddCert(certfp);
auto *cert = cl->AddCert(certfp);
cert->created = Anope::CurTime;
cert->creator = source.GetNick();
Log(nc == source.GetAccount() ? LOG_COMMAND : LOG_ADMIN, source, this) << "to ADD certificate fingerprint " << certfp << " to " << nc->display;
source.Reply(_("\002%s\002 added to %s's certificate list."), certfp.c_str(), nc->display.c_str());
}
void DoDel(CommandSource &source, NickCore *nc, Anope::string certfp)
void DoDel(CommandSource &source, const std::vector<Anope::string> &params)
{
auto *cl = nc->Require<NickServ::CertList>(NICKSERV_CERT_EXT);
if (certfp.empty())
{
User *u = source.GetUser();
if (u)
certfp = u->fingerprint;
}
if (certfp.empty())
{
this->OnSyntaxError(source, "DEL");
auto *nc = FindTarget(source, params.size() == 3 ? params[1] : "", true);
if (!nc)
return;
}
const auto certfp = FindFingerprint(source, params, nc, true);
if (certfp.empty())
return;
auto *cl = nc->Require<NickServ::CertList>(NICKSERV_CERT_EXT);
if (!cl->FindCert(certfp))
{
source.Reply(_("\002%s\002 not found on %s's certificate list."), certfp.c_str(), nc->display.c_str());
@@ -278,81 +350,143 @@ private:
source.Reply(_("\002%s\002 deleted from %s's certificate list."), certfp.c_str(), nc->display.c_str());
}
static void DoList(CommandSource &source, const NickCore *nc)
void DoList(CommandSource &source, const std::vector<Anope::string> &params, bool full)
{
auto *cl = nc->GetExt<NickServ::CertList>(NICKSERV_CERT_EXT);
auto *nc = FindTarget(source, params.size() > 1 ? params[1] : "", false);
if (!nc)
return;
auto *cl = nc->GetExt<NickServ::CertList>(NICKSERV_CERT_EXT);
if (!cl || !cl->GetCertCount())
{
source.Reply(_("%s's certificate list is empty."), nc->display.c_str());
return;
}
source.Reply(_("Certificate list for %s:"), nc->display.c_str());
ListFormatter list(source.GetAccount());
list.AddColumn(_("Fingerprint"));
if (full)
{
list.AddColumn(_("Creator")).AddColumn(_("Created"));
list.SetFlexible([](ListFormatter::ListEntry &row)
{
return row["Description"].empty()
? _("\002{fingerprint}\002 -- created by {creator} at {created}")
: _("\002{fingerprint}\002 -- created by {creator} at {created} ({description})");
});
}
else
{
list.SetFlexible([](ListFormatter::ListEntry &row)
{
return row["Description"].empty()
? _("\002{fingerprint}\002")
: _("\002{fingerprint}\002 ({description})");
});
}
list.AddColumn(_("Description"));
for (unsigned i = 0; i < cl->GetCertCount(); ++i)
{
Anope::string fingerprint = cl->GetCert(i);
source.Reply(" %s", fingerprint.c_str());
auto *cert = cl->GetCert(i);
ListFormatter::ListEntry entry;
entry["Fingerprint"] = cert->fingerprint;
entry["Description"] = cert->description;
if (full)
{
entry["Created"] = cert->created
? Anope::strftime(cert->created, nullptr, true)
: TIME_UNKNOWN;
entry["Creator"] = cert->creator.empty()
? TIME_UNKNOWN
: cert->creator;
}
list.AddEntry(entry);
}
source.Reply(_("Certificate list for %s:"), nc->display.c_str());
list.SendTo(source);
}
Anope::string FindFingerprint(CommandSource &source, const std::vector<Anope::string> &params, const NickCore *nc, bool del)
{
if (source.GetAccount() != nc || del)
{
if (params.size() > 1)
return params.back();
this->OnSyntaxError(source, params[0]);
return "";
}
auto *u = source.GetUser();
if (u && !u->fingerprint.empty())
return u->fingerprint;
source.Reply(_("You are not using a client certificate."));
return "";
}
NickCore *FindTarget(CommandSource &source, const Anope::string &nick, bool modify)
{
if (!nick.empty())
{
const auto *na = NickAlias::Find(nick);
if (!na)
{
source.Reply(NICK_X_NOT_REGISTERED, nick.c_str());
return nullptr;
}
NickCore *nc = na->nc;
if (nc != source.GetAccount() && !source.HasPriv("nickserv/cert"))
{
source.Reply(ACCESS_DENIED);
return nullptr;
}
if (modify)
{
if (nc->HasExt("NS_SUSPENDED"))
{
source.Reply(NICK_X_SUSPENDED, nc->display.c_str());
return nullptr;
}
if (Config->GetModule("nickserv").Get<bool>("secureadmins", "yes") && source.GetAccount() != nc && nc->IsServicesOper())
{
source.Reply(_("You may view but not modify the certificate list of other Services Operators."));
return nullptr;
}
}
return nc;
}
return source.nc;
}
public:
CommandNSCert(Module *creator) : Command(creator, "nickserv/cert", 1, 3)
{
this->SetDesc(_("Modify the nickname client certificate list"));
this->SetSyntax(_("ADD [\037nickname\037] [\037fingerprint\037]"));
this->SetSyntax(_("ADD [\037nickname\037 \037fingerprint\037]"));
this->SetSyntax(_("DEL [\037nickname\037] \037fingerprint\037"));
this->SetSyntax(_("LIST [\037nickname\037]"));
this->SetSyntax(_("VIEW [\037nickname\037]"));
}
void Execute(CommandSource &source, const std::vector<Anope::string> &params) override
{
const Anope::string &cmd = params[0];
Anope::string nick, certfp;
if (cmd.equals_ci("LIST"))
nick = params.size() > 1 ? params[1] : "";
else
{
nick = params.size() == 3 ? params[1] : "";
certfp = params.size() > 1 ? params[params.size() - 1] : "";
}
NickCore *nc;
if (!nick.empty())
{
const NickAlias *na = NickAlias::Find(nick);
if (na == NULL)
{
source.Reply(NICK_X_NOT_REGISTERED, nick.c_str());
return;
}
else if (na->nc != source.GetAccount() && !source.HasPriv("nickserv/cert"))
{
source.Reply(ACCESS_DENIED);
return;
}
else if (Config->GetModule("nickserv").Get<bool>("secureadmins", "yes") && source.GetAccount() != na->nc && na->nc->IsServicesOper() && !cmd.equals_ci("LIST"))
{
source.Reply(_("You may view but not modify the certificate list of other Services Operators."));
return;
}
nc = na->nc;
}
else
nc = source.nc;
if (cmd.equals_ci("LIST"))
return this->DoList(source, nc);
else if (nc->HasExt("NS_SUSPENDED"))
source.Reply(NICK_X_SUSPENDED, nc->display.c_str());
return this->DoList(source, params, false);
if (cmd.equals_ci("VIEW"))
return this->DoList(source, params, true);
else if (Anope::ReadOnly)
source.Reply(READ_ONLY_MODE);
else if (cmd.equals_ci("ADD"))
return this->DoAdd(source, nc, certfp);
return this->DoAdd(source, params);
else if (cmd.equals_ci("DEL"))
return this->DoDel(source, nc, certfp);
return this->DoDel(source, params);
else
this->OnSyntaxError(source, "");
}
@@ -362,28 +496,148 @@ public:
this->SendSyntax(source);
source.Reply(" ");
source.Reply(_(
"Modifies or displays the certificate list for your nick. "
"If you connect to IRC and provide a client certificate with a "
"matching fingerprint in the cert list, you will be "
"automatically identified to services. Services Operators "
"may provide a nick to modify other users' certificate lists."
"\n\n"
"Examples:"
"\n\n"
" \002%s\032ADD\002\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"
" \002%s\032DEL\032<fingerprint>\002\n"
" Removes the fingerprint <fingerprint> from your certificate list."
"\n\n"
" \002%s\032LIST\002\n"
" Displays the current certificate list."
"Modifies or displays the certificate list for your nick. If you connect to IRC and "
"provide a client certificate with a matching fingerprint in the cert list, you will "
"be automatically identified to services. Services Operators may provide a nick to "
"modify other users' certificate lists."
));
ExampleWrapper examples;
examples.AddEntry("ADD", _(
"Adds your current fingerprint to your certificate list."
));
examples.AddEntry(_("ADD \037nickname\037 \037fingerprint\037"), _(
"Adds the specified \037fingerprint\037 to the certificate list of \037nickname\037."
), "nickserv/cert");
examples.AddEntry(_("DEL \037fingerprint\037"), _(
"Removes the specified \037fingerprint\037 from your certificate list."
));
examples.AddEntry(_("DEL \037nickname\037 \037fingerprint\037"), _(
"Removes the specified \037fingerprint\037 from the certificate list of "
"\037nickname\037."
), "nickserv/cert");
examples.AddEntry("LIST", _(
"Displays your current certificate list."
));
examples.AddEntry(_("LIST \037nickname\037"), _(
"Displays the current certificate list of \037nickname\037."
), "nickserv/cert");
examples.AddEntry("VIEW", _(
"Displays your current certificate list as well the details about who added each entry "
"and when they added it."
));
examples.AddEntry(_("VIEW \037nickname\037"), _(
"Displays the current certificate list of \037nickname\037 as well as the details "
"about who added each entry and when they added it."
), "nickserv/cert");
examples.SendTo(source);
return true;
}
};
class CommandNSSetAutologin
: public Command
{
public:
CommandNSSetAutologin(Module *creator, const Anope::string &sname = "nickserv/set/autologin", size_t min = 1)
: Command(creator, sname, min, min + 1)
{
this->SetDesc(_("Sets whether you should automatically be logged in when you connect using a known SSL certificate."));
this->SetSyntax("{ON | OFF}");
}
void Run(CommandSource &source, const Anope::string &user, const Anope::string &param)
{
if (Anope::ReadOnly)
{
source.Reply(READ_ONLY_MODE);
return;
}
const NickAlias *na = NickAlias::Find(user);
if (na == NULL)
{
source.Reply(NICK_X_NOT_REGISTERED, user.c_str());
return;
}
NickCore *nc = na->nc;
EventReturn MOD_RESULT;
FOREACH_RESULT(OnSetNickOption, MOD_RESULT, (source, this, nc, param));
if (MOD_RESULT == EVENT_STOP)
return;
if (param.equals_ci("ON"))
{
Log(nc == source.GetAccount() ? LOG_COMMAND : LOG_ADMIN, source, this) << "to enable autologin for " << na->nc->display;
nc->Extend<bool>("AUTOLOGIN");
source.Reply(_("%s will now be automatically logged in when they connect using a known SSL certificate."), nc->display.c_str());
}
else if (param.equals_ci("OFF"))
{
Log(nc == source.GetAccount() ? LOG_COMMAND : LOG_ADMIN, source, this) << "to disable autologin for " << na->nc->display;
nc->Shrink<bool>("AUTOLOGIN");
source.Reply(_("%s will now not be automatically logged in when they connect using a known SSL certificate."), nc->display.c_str());
}
else
this->OnSyntaxError(source, "AUTOLOGIN");
}
void Execute(CommandSource &source, const std::vector<Anope::string> &params) override
{
this->Run(source, source.nc->display, params[0]);
}
bool OnHelp(CommandSource &source, const Anope::string &) override
{
this->SendSyntax(source);
source.Reply(" ");
source.Reply(
_(
"Sets whether you should automatically be logged in when you connect using a known "
"SSL certificate. You can configure your SSL certificate using the \002%s\002 "
"command."
),
source.command.nobreak().c_str(),
source.command.nobreak().c_str(),
source.command.nobreak().c_str());
source.service->GetQueryCommand("nickserv/cert").c_str()
);
return true;
}
};
class CommandNSSASetAutologin final
: public CommandNSSetAutologin
{
public:
CommandNSSASetAutologin(Module *creator)
: CommandNSSetAutologin(creator, "nickserv/saset/autologin", 2)
{
this->ClearSyntax();
this->SetSyntax(_("\037nickname\037 {ON | OFF}"));
}
void Execute(CommandSource &source, const std::vector<Anope::string> &params) override
{
this->Run(source, params[0], params[1]);
}
bool OnHelp(CommandSource &source, const Anope::string &) override
{
this->SendSyntax(source);
source.Reply(" ");
source.Reply(
_(
"Sets whether the given nickname should automatically be logged in when they "
"connect using a known SSL certificate. You can configure their SSL certificate "
"using the \002%s\002 command."
),
source.service->GetQueryCommand("nickserv/cert").c_str()
);
return true;
}
};
@@ -391,15 +645,22 @@ public:
class NSCert final
: public Module
{
private:
CommandNSCert commandnscert;
CommandNSSetAutologin commandnssetautologin;
CommandNSSASetAutologin commandnssasetautologin;
NSCertListImpl::ExtensibleItem certs;
CertServiceImpl cs;
NSCertInfoType cert_type;
bool CanLogin(User *u, NickCore *nc)
{
if (!nc || nc->HasExt("NS_SUSPENDED"))
return false; // Account suspended.
if (!nc->HasExt("AUTOLOGIN"))
return false; // Autologin disabled.
const auto maxlogins = Config->GetModule("ns_identify").Get<unsigned int>("maxlogins");
if (maxlogins && nc->users.size() >= maxlogins)
{
@@ -416,6 +677,8 @@ public:
NSCert(const Anope::string &modname, const Anope::string &creator)
: Module(modname, creator, VENDOR)
, commandnscert(this)
, commandnssetautologin(this)
, commandnssasetautologin(this)
, certs(this, NICKSERV_CERT_EXT)
, cs(this)
{
@@ -449,7 +712,9 @@ public:
return;
auto *cl = certs.Require(na->nc);
cl->AddCert(u->fingerprint);
auto *cert = cl->AddCert(u->fingerprint);
cert->created = Anope::CurTime;
cert->creator = u->nick;
auto *NickServ = Config->GetClient("NickServ");
u->SendMessage(NickServ, _("Your SSL certificate fingerprint \002%s\002 has been automatically added to your certificate list."), u->fingerprint.c_str());
+1 -1
View File
@@ -68,7 +68,7 @@ public:
}
help.SendTo(source);
source.Reply(_("Type \002%s\032\037option\037\002 for more information on a specific option."),
source.Reply(_("Type \002%s\033\037option\037\002 for more information on a specific option."),
source.service->GetQueryCommand("generic/help", this_name).c_str());
return true;
+3 -3
View File
@@ -243,8 +243,8 @@ public:
source.Reply(" ");
source.Reply(_(
"Allows you to prevent certain pieces of information from "
"being displayed when someone does a %s\032\002INFO\002 on your "
"nick. You can hide your email address\032(\002EMAIL\002), last seen "
"being displayed when someone does a %s\033\002INFO\002 on your "
"nick. You can hide your email address\033(\002EMAIL\002), last seen "
"user@host mask (\002MASK\002), your services access status "
"(\002STATUS\002) and last quit message (\002QUIT\002). "
"The second parameter specifies whether the information should "
@@ -276,7 +276,7 @@ public:
source.Reply(" ");
source.Reply(_(
"Allows you to prevent certain pieces of information from "
"being displayed when someone does a %s\032\002INFO\002 on the "
"being displayed when someone does a %s\033\002INFO\002 on the "
"nick. You can hide the email address (\002EMAIL\002), last seen "
"user@host mask (\002MASK\002), the services access status "
"(\002STATUS\002) and last quit message (\002QUIT\002). "
+32 -31
View File
@@ -67,12 +67,12 @@ public:
}
ListFormatter list(source.GetAccount());
list.AddColumn(_("Nick")).AddColumn(_("Last mask"));
list.AddColumn(_("Nick")).AddColumn(_("Account")).AddColumn(_("Status"));
list.SetFlexible([](ListFormatter::ListEntry &row)
{
return row["Last mask"].empty()
? _("\002{nick}\002")
: _("\002{nick}\002 (last mask: {last_mask})");
return row["Status"].empty()
? _("\002{nick}\002 (account: {account})")
: _("\002{nick}\002 -- {status} (account: {account})");
});
Anope::map<NickAlias *> ordered_map;
@@ -96,11 +96,7 @@ public:
else if (unconfirmed && !na->nc->HasExt("UNCONFIRMED"))
continue;
/* We no longer compare the pattern against the output buffer.
* Instead we build a nice nick!user@host buffer to compare.
* The output is then generated separately. -TheShadow */
Anope::string buf = Anope::Format("%s!%s", na->nick.c_str(), !na->last_userhost.empty() ? na->last_userhost.c_str() : "*@*");
if (na->nick.equals_ci(pattern) || Anope::Match(buf, pattern, false, true))
if (na->nick.equals_ci(pattern) || Anope::Match(na->nick, pattern, false, true))
{
if (((count + 1 >= from && count + 1 <= to) || (!from && !to)) && ++nnicks <= listmax)
{
@@ -110,14 +106,13 @@ public:
ListFormatter::ListEntry entry;
entry["Nick"] = (isnoexpire ? "!" : "") + na->nick;
if (na->nc->HasExt("HIDE_MASK") && !is_servadmin && na->nc != mync)
entry["Last mask"] = Language::Translate(source.GetAccount(), _("[Hostname hidden]"));
else if (na->nc->HasExt("NS_SUSPENDED"))
entry["Last mask"] = Language::Translate(source.GetAccount(), _("[Suspended]"));
entry["Account"] = na->nc->display;
auto &status = entry["Status"];
if (na->nc->HasExt("NS_SUSPENDED"))
status = Language::Translate(source.GetAccount(), _("Suspended"));
else if (na->nc->HasExt("UNCONFIRMED"))
entry["Last mask"] = Language::Translate(source.GetAccount(), _("[Unconfirmed]"));
else
entry["Last mask"] = is_servadmin ? na->last_userhost_real : na->last_userhost;
status = Language::Translate(source.GetAccount(), _("Unconfirmed"));
list.AddEntry(entry);
}
++count;
@@ -147,23 +142,29 @@ public:
"suspended, or are unconfirmed will be shown. If multiple options are "
"given, nicks must match every option to be shown. "
"Note that these options are limited to \037Services Operators\037."
"\n\n"
"Examples:"
"\n\n"
" \002LIST *!joeuser@foo.com\002\n"
" Lists all registered nicks owned by joeuser@foo.com."
"\n\n"
" \002LIST *Bot*!*@*\002\n"
" Lists all registered nicks with \002Bot\002 in their\n"
" names (case insensitive)."
"\n\n"
" \002LIST * NOEXPIRE\002\n"
" Lists all registered nicks which have been set to not expire."
"\n\n"
" \002LIST #51-100\002\n"
" Lists all registered nicks within the given range (51-100)."
));
ExampleWrapper examples;
examples.AddEntry("*Bot*", _(
"Lists all registered nicks with \037Bot\037 in their name (case insensitive)."
));
examples.AddEntry("#51-100", _(
"Lists all registered nicks within the given range (51-100)."
));
examples.AddEntry("* DISPLAY", _(
"Lists all registered nicks that are the display nickname for their account."
), "nickserv/list");
examples.AddEntry("* NOEXPIRE", _(
"Lists all registered nicks that have been set to not expire."
), "nickserv/list");
examples.AddEntry("* SUSPENDED", _(
"Lists all registered nicks that have been suspended."
), "nickserv/list");
examples.AddEntry("* UNCONFIRMED", _(
"Lists all registered nicks that have not been confirmed yet."
), "nickserv/list");
examples.SendTo(source);
const Anope::string &regexengine = Config->GetBlock("options").Get<const Anope::string>("regexengine");
if (!regexengine.empty())
{
+1 -1
View File
@@ -292,7 +292,7 @@ public:
if (it != ei->end())
{
for (auto mode : it->second.Modes())
c->SetMode(c->WhoSends(), ModeManager::FindChannelModeByChar(mode), u->GetUID());
c->SetMode(c->WhoSends(), mode, u->GetUID());
ei->erase(it);
if (ei->empty())
+1 -1
View File
@@ -212,7 +212,7 @@ public:
source.Reply(" ");
source.Reply(_(
"The \037email\037 parameter is optional and will set the email address for your "
"nick immediately. You may also wish to \002SET\032HIDE\002 it after registering "
"nick immediately. You may also wish to \002SET\033HIDE\002 it after registering "
"if it isn't the default setting already."
));
}
+2 -2
View File
@@ -62,7 +62,7 @@ public:
}
help.SendTo(source);
source.Reply(_("Type \002%s\032\037option\037\002 for more information on a specific option."),
source.Reply(_("Type \002%s\033\037option\037\002 for more information on a specific option."),
source.service->GetQueryCommand("generic/help", this_name).c_str());
return true;
@@ -107,7 +107,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. The options will be set on the given "
"\037nickname\037."
),
+164 -31
View File
@@ -17,7 +17,20 @@
static Module *me;
static Anope::map<Anope::string> descriptions;
#define MISC_PREFIX "ns_set_misc:"
struct CommandData final
{
Anope::string saset_description;
Anope::string set_description;
Anope::string pattern;
Anope::string syntax;
Anope::string title;
bool swhois = false;
};
static Anope::map<CommandData> command_data;
struct NSMiscData;
static Anope::map<ExtensibleItem<NSMiscData> *> items;
@@ -99,13 +112,65 @@ 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<NSMiscData> *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();
}
static void CheckSWhois(User* u, const Anope::string &name, ExtensibleItem<NSMiscData> *ext)
{
auto it = command_data.find(name);
if (it == command_data.end() || !it->second.swhois)
return; // No swhois.
auto *nickserv = Config->GetClient("NickServ");
auto *nc = u->Account();
auto *data = nc ? ext->Get(nc) : nullptr;
if (data)
IRCD->SendSWhois(nickserv, u, name, Anope::Format("%s: %s", GetTitle(ext), data->data.c_str()));
else
IRCD->SendSWhoisDel(nickserv, u, name, "");
}
class CommandNSSetMisc
: public Command
{
protected:
bool saset = false;
private:
bool CheckSyntax(CommandSource &source, ExtensibleItem<NSMiscData> *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:
CommandNSSetMisc(Module *creator, const Anope::string &cname = "nickserv/set/misc", size_t min = 0) : Command(creator, cname, min, min + 1)
{
@@ -133,22 +198,31 @@ public:
if (MOD_RESULT == EVENT_STOP)
return;
Anope::string scommand = GetAttribute(source.command);
Anope::string key = "ns_set_misc:" + scommand;
const auto key = GetAttribute(source.command);
ExtensibleItem<NSMiscData> *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(nc, NSMiscData(nc, key, param));
source.Reply(CHAN_SETTING_CHANGED, scommand.c_str(), nc->display.c_str(), param.c_str());
source.Reply(CHAN_SETTING_CHANGED, GetTitle(item), nc->display.c_str(), param.c_str());
}
else
{
item->Unset(nc);
source.Reply(CHAN_SETTING_UNSET, scommand.c_str(), nc->display.c_str());
source.Reply(CHAN_SETTING_UNSET, GetTitle(item), nc->display.c_str());
}
for (auto *u : nc->users)
CheckSWhois(u, key, item);
}
void Execute(CommandSource &source, const std::vector<Anope::string> &params) override
@@ -158,23 +232,45 @@ public:
void OnServHelp(CommandSource &source, HelpWrapper &help) override
{
if (descriptions.count(source.command))
{
this->SetDesc(descriptions[source.command]);
Command::OnServHelp(source, help);
}
auto it = command_data.find(GetAttribute(source.command));
if (it == command_data.end())
return;
const auto &desc = saset ? it->second.saset_description : it->second.set_description;
if (desc.empty())
return;
this->SetDesc(desc);
Command::OnServHelp(source, help);
}
bool OnHelp(CommandSource &source, const Anope::string &subcommand) override
{
if (descriptions.count(source.command))
{
this->SendSyntax(source);
source.Reply(" ");
source.Reply("%s", Language::Translate(source.nc, descriptions[source.command].c_str()));
return true;
}
return false;
auto it = command_data.find(GetAttribute(source.command));
if (it == command_data.end())
return false;
const auto &desc = saset ? it->second.saset_description : it->second.set_description;
if (desc.empty())
return false;
this->SendSyntax(source);
source.Reply(" ");
source.Reply("%s", Language::Translate(source.nc, desc.c_str()));
return true;
}
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("[\037%s\037]", Language::Translate(source.nc, value)));
Command::SendSyntax(source);
}
};
@@ -184,14 +280,29 @@ class CommandNSSASetMisc final
public:
CommandNSSASetMisc(Module *creator) : CommandNSSetMisc(creator, "nickserv/saset/misc", 1)
{
this->ClearSyntax();
this->SetSyntax(_("\037nickname\037 [\037parameter\037]"));
this->saset = true;
}
void Execute(CommandSource &source, const std::vector<Anope::string> &params) override
{
this->Run(source, params[0], params.size() > 1 ? params[1] : "");
}
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(
Language::Translate(source.nc, _("\037nickname\037 [\037%s\037]")),
Language::Translate(source.nc, value)
));
Command::SendSyntax(source);
}
};
class NSSetMisc final
@@ -218,30 +329,52 @@ public:
void OnReload(Configuration::Conf &conf) override
{
descriptions.clear();
command_data.clear();
for (int i = 0; i < conf.CountBlock("command"); ++i)
{
const auto &block = conf.GetBlock("command", i);
const Anope::string &cmd = block.Get<const Anope::string>("command");
if (cmd != "nickserv/set/misc" && cmd != "nickserv/saset/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.
GetItem("ns_set_misc:" + GetAttribute(cname));
const auto extname = GetAttribute(cname);
GetItem(extname);
auto &data = command_data[extname];
if (cmd == "nickserv/saset/misc")
{
data.saset_description = desc;
continue;
}
data.set_description = desc;
data.pattern = block.Get<const Anope::string>("misc_pattern");
data.syntax = block.Get<const Anope::string>("misc_syntax");
data.title = block.Get<const Anope::string>("misc_title");
data.swhois = block.Get<bool>("misc_swhois");
}
}
void OnUserLogin(User *u) override
{
if (u->server == Me || command_data.empty() || !IRCD->CanSendMultipleSWhois)
return;
for (const auto &[name, ext] : items)
CheckSWhois(u, name, ext);
}
void OnNickLogout(User *u) override
{
OnUserLogin(u);
}
void OnNickInfo(CommandSource &source, NickAlias *na, InfoFormatter &info, bool) override
{
for (const auto &[_, e] : items)
@@ -249,7 +382,7 @@ public:
NSMiscData *data = e->Get(na->nc);
if (data != NULL)
info[e->name.substr(12).replace_all_cs("_", " ")] = data->data;
info[GetTitle(e)] = data->data;
}
}
};
+2 -2
View File
@@ -158,7 +158,7 @@ public:
for (const auto &[timeregion, timezone] : timeregions)
source.Reply(" %s (%zu timezones)", timeregion.c_str(), timezone.size());
source.Reply(_("Type \002%s\032\037region\037\002 to list timezones for a region."),
source.Reply(_("Type \002%s\033\037region\037\002 to list timezones for a region."),
source.service->GetQueryCommand("generic/help", source.command).c_str());
}
else if (!SendZones(source, subcommand))
@@ -201,7 +201,7 @@ public:
for (const auto &[timeregion, timezone] : timeregions)
source.Reply(" %s (%zu timezones)", timeregion.c_str(), timezone.size());
source.Reply(_("Type \002%s\032\037region\037\002 to list timezones for a region."),
source.Reply(_("Type \002%s\033\037region\037\002 to list timezones for a region."),
source.service->GetQueryCommand("generic/help", source.command).c_str());
}
else if (!SendZones(source, subcommand))
+15 -12
View File
@@ -442,9 +442,9 @@ public:
"types, will instruct all servers to add a ban for the mask "
"which the user matched."
"\n\n"
"\002%s\032ADD\002 adds the given mask to the AKILL "
"\002%s\033ADD\002 adds the given mask to the AKILL "
"list for the given reason, which \002must\002 be given. "
"Mask should be in the format of nick!user@host#real\032name, "
"Mask should be in the format of nick!user@host#real\033name, "
"though all that is required is user@host. If a real name is specified, "
"the reason must be prepended with a :. "
"\037expiry\037 is specified as an integer followed by one of \037d\037 "
@@ -455,7 +455,7 @@ public:
"mask to be added starts with a \037+\037, 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 "
"\002STATS\032AKILL\002 command."
"\002STATS\033AKILL\002 command."
),
source.command.nobreak().c_str());
@@ -472,31 +472,34 @@ public:
source.Reply(" ");
source.Reply(_(
"The \002%s\032DEL\002 command removes the given mask from the "
"The \002%s\033DEL\002 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 \002%s\032LIST\002 command displays the AKILL list. "
"The \002%s\033LIST\002 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"
" \002%s\032LIST\0322-5,7-9\002\n"
" Lists AKILL entries numbered 2 through 5 and 7\n"
" through 9."
"only those entries are shown."
"\n\n"
"\002%s\032VIEW\002 is a more verbose version of \002%s\032LIST\002, and "
"\002%s\033VIEW\002 is a more verbose version of \002%s\033LIST\002, 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"
"\002%s\032CLEAR\002 clears all entries of the AKILL list."
"\002%s\033CLEAR\002 clears all entries of the AKILL 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("2-5,7-9", _(
"Lists AKILL entries numbered 2 through 5 and 7 through 9."
));
examples.SendTo(source);
return true;
}
};
+10 -3
View File
@@ -119,10 +119,17 @@ public:
"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"
" \002MODIFY\032nickserv\032regdelay\03215m\002"
));
ExampleWrapper examples;
examples.AddEntry("MODIFY nickserv regdelay 15m", _(
"Changes the registration delay to 15 minutes."
));
examples.AddEntry("VIEW", _(
"Shows the current server configuration."
));
examples.SendTo(source);
return true;
}
};
+8 -5
View File
@@ -157,12 +157,15 @@ public:
"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"
" \002LOGSEARCH\032+21d\032+500l\032Anope\002\n"
" Searches the last 21 days worth of logs for messages\n"
" containing Anope and lists the most recent 500 of them."
));
ExampleWrapper examples;
examples.AddEntry("+21d +500l Anope", _(
"Searches the last 21 days worth of logs for messages containing Anope and lists the "
"most recent 500 of them."
));
examples.SendTo(source);
return true;
}
};
+6 -5
View File
@@ -50,13 +50,14 @@ public:
if (all)
{
for (const auto &[_, uc] : c->users)
for (const auto &[_, memb] : c->users)
{
if (uc->user->HasMode("OPER"))
if (memb->user->HasMode("OPER"))
continue;
for (size_t i = uc->status.Modes().length(); i > 0; --i)
c->RemoveMode(c->WhoSends(), ModeManager::FindChannelModeByChar(uc->status.Modes()[i - 1]), uc->user->GetUID(), false);
auto modes = memb->status.Modes();
for (auto *mode : modes)
c->RemoveMode(c->WhoSends(), mode, memb->user->GetUID(), false);
}
source.Reply(_("All modes cleared on %s."), c->name.c_str());
@@ -135,7 +136,7 @@ public:
"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 CLEAR\032ALL is given then all modes, including user status, is removed."
"If CLEAR\033ALL is given then all modes, including user status, is removed."
));
return true;
}
+6 -6
View File
@@ -316,12 +316,12 @@ public:
source.Reply(_(
"Allows Services Operators to view the session list."
"\n\n"
"\002%s\032LIST\002 lists hosts with at least \037threshold\037 sessions. "
"\002%s\033LIST\002 lists hosts with at least \037threshold\037 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"
"\002%s\032VIEW\002 displays detailed information about a specific "
"\002%s\033VIEW\002 displays detailed information about a specific "
"host - including the current session count and session limit. "
"The \037host\037 value may not include wildcards. "
"\n\n"
@@ -596,7 +596,7 @@ public:
"source of help regarding session limiting. The content of "
"this notice is a config setting."
"\n\n"
"\002%s\032ADD\002 adds the given host mask to the exception list. "
"\002%s\033ADD\002 adds the given host mask to the exception list. "
"Note that \002nick!user@host\002 and \002user@host\002 masks are invalid! "
"Only real host masks, such as \002box.host.dom\002 and \002*.host.dom\002, "
"are allowed because sessions limiting does not take nick or "
@@ -606,12 +606,12 @@ public:
"unlimited session limit. See the \002AKILL\002 help for details about "
"the format of the optional \037expiry\037 parameter. "
"\n\n"
"\002%s\032DEL\002 removes the given mask from the exception list."
"\002%s\033DEL\002 removes the given mask from the exception list."
"\n\n"
"\002%s\032LIST\002 and \002%s\032VIEW\002 show all current "
"\002%s\033LIST\002 and \002%s\033VIEW\002 show all current "
"sessions if the optional mask is given, the list is limited "
"to those sessions matching the mask. The difference is that "
"\002%s\032VIEW\002 is more verbose, displaying the name of the "
"\002%s\033VIEW\002 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"
+28 -20
View File
@@ -456,7 +456,7 @@ public:
"connect, services will not allow them to pursue their IRC "
"session."
"\n\n"
"\002SNLINE\032ADD\002 adds the given realname mask to the SNLINE "
"\002SNLINE\033ADD\002 adds the given realname mask to the SNLINE "
"list for the given reason (which \002must\002 be given). "
"\037expiry\037 is specified as an integer followed by one of \037d\037 "
"(days), \037h\037 (hours), or \037m\037 (minutes). Combinations (such as "
@@ -466,7 +466,7 @@ public:
"realname mask to be added starts with a \037+\037, 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 "
"\002STATS\032AKILL\002 command. "
"\002STATS\033AKILL\002 command. "
"\n\n"
"\002Note\002: because the realname mask may contain spaces, the "
"separator between it and the reason is a colon."
@@ -485,25 +485,29 @@ public:
source.Reply(" ");
source.Reply(_(
"The \002SNLINE\032DEL\002 command removes the given mask from the "
"The \002SNLINE\033DEL\002 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 \002SNLINE\032LIST\002 command displays the SNLINE list. "
"The \002SNLINE\033LIST\002 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"
" \002SNLINE\032LIST\0322-5,7-9\002\n"
" Lists SNLINE entries numbered 2 through 5 and 7\n"
" through 9."
"only those entries are shown."
"\n\n"
"\002SNLINE\032VIEW\002 is a more verbose version of \002SNLINE\032LIST\002, and "
"\002SNLINE\033VIEW\002 is a more verbose version of \002SNLINE\033LIST\002, 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"
"\002SNLINE\032CLEAR\002 clears all entries of the SNLINE list."
"\002SNLINE\033CLEAR\002 clears all entries of the SNLINE list."
));
ExampleWrapper examples;
examples.AddEntry("LIST 2-5,7-9", _(
"Lists SNLINE entries numbered 2 through 5 and 7 through 9."
));
examples.SendTo(source);
return true;
}
};
@@ -699,7 +703,7 @@ public:
"regular expression, the expression will be matched against "
"channels too."
"\n\n"
"\002SQLINE\032ADD\002 adds the given (nick/channel) mask to the SQLINE "
"\002SQLINE\033ADD\002 adds the given (nick/channel) mask to the SQLINE "
"list for the given reason (which \002must\002 be given). "
"\037expiry\037 is specified as an integer followed by one of \037d\037 "
"(days), \037h\037 (hours), or \037m\037 (minutes). Combinations (such as "
@@ -709,7 +713,7 @@ public:
"If the mask to be added starts with a \037+\037, 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 "
"\002STATS\032AKILL\002 command."
"\002STATS\033AKILL\002 command."
));
const Anope::string &regexengine = Config->GetBlock("options").Get<const Anope::string>("regexengine");
@@ -725,25 +729,29 @@ public:
source.Reply(" ");
source.Reply(_(
"The \002SQLINE\032DEL\002 command removes the given mask from the "
"The \002SQLINE\033DEL\002 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 \002SQLINE\032LIST\002 command displays the SQLINE list. "
"The \002SQLINE\033LIST\002 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"
" \002SQLINE\032LIST\0322-5,7-9\002\n"
" Lists SQLINE entries numbered 2 through 5 and 7\n"
" through 9."
"only those entries are shown."
"\n\n"
"\002SQLINE\032VIEW\002 is a more verbose version of \002SQLINE\032LIST\002, and "
"\002SQLINE\033VIEW\002 is a more verbose version of \002SQLINE\033LIST\002, 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"
"\002SQLINE\032CLEAR\002 clears all entries of the SQLINE list."
"\002SQLINE\033CLEAR\002 clears all entries of the SQLINE list."
));
ExampleWrapper examples;
examples.AddEntry("LIST 2-5,7-9", _(
"Lists SQLINE entries numbered 2 through 5 and 7 through 9."
));
examples.SendTo(source);
return true;
}
};
+2 -2
View File
@@ -122,8 +122,8 @@ public:
memb->status.Clear();
BotInfo *setter = BotInfo::Find(u->GetUID());
for (auto mode : cs.Modes())
c->SetMode(setter, ModeManager::FindChannelModeByChar(mode), u->GetUID(), false);
for (auto *mode : cs.Modes())
c->SetMode(setter, mode, u->GetUID(), false);
if (memb)
memb->status = cs;
+50 -16
View File
@@ -516,8 +516,8 @@ public:
memb->status.Clear();
BotInfo *setter = BotInfo::Find(user->GetUID());
for (auto mode : cs.Modes())
c->SetMode(setter, ModeManager::FindChannelModeByChar(mode), user->GetUID(), false);
for (auto *mode : cs.Modes())
c->SetMode(setter, mode, user->GetUID(), false);
if (memb != NULL)
memb->status = cs;
@@ -587,10 +587,36 @@ public:
Uplink::Send(source, "SVSPART", u->GetUID(), chan);
}
void SendSWhois(const MessageSource &bi, const Anope::string &who, const Anope::string &mask) override
void SendSWhois(const MessageSource &source, User *target, const Anope::string &tag, const Anope::string &message) override
{
User *u = User::Find(who);
Uplink::Send("METADATA", u->GetUID(), "swhois", mask);
if (!IRCD->CanSendMultipleSWhois)
{
// Old style SWHOIS.
Uplink::Send("METADATA", target->GetUID(), "swhois", message);
}
else
{
// New style SWHOIS.
Uplink::Send("METADATA", target->GetUID(), "specialwhois", Anope::Format("+ @%s s %ld :%s",
tag.c_str(), Anope::CurTime, message.c_str()));
}
}
void SendSWhoisDel(const MessageSource &source, User *target, const Anope::string &tag, const Anope::string &message) override
{
if (!IRCD->CanSendMultipleSWhois)
{
// Old style SWHOIS.
Uplink::Send("METADATA", target->GetUID(), "swhois", "");
}
else
{
// New style SWHOIS.
if (tag.empty())
Uplink::Send("METADATA", target->GetUID(), "specialwhois", Anope::Format("- :%s", message.c_str()));
else
Uplink::Send("METADATA", target->GetUID(), "specialwhois", Anope::Format("- @%s", tag.c_str()));
}
}
void SendBOB() override
@@ -777,7 +803,7 @@ namespace InspIRCdExtBan
}
};
class EntryMatcher final
class EntryMatcher
: public Base
{
public:
@@ -788,7 +814,9 @@ namespace InspIRCdExtBan
bool Matches(User *u, const Entry *e) override
{
return Entry(e->GetMask(), this->name, false).Matches(u);
auto mask = e->GetMask();
auto *cm = basech->Unwrap(mask);
return Entry(mask, cm->name, false).Matches(u);
}
};
@@ -819,7 +847,7 @@ namespace InspIRCdExtBan
{
auto *memb = c->FindUser(u);
if (memb != NULL)
if (cm == NULL || memb->status.HasMode(cm->mchar))
if (cm == NULL || memb->status.HasMode(cm))
return true;
}
@@ -888,17 +916,17 @@ namespace InspIRCdExtBan
};
class UnidentifiedMatcher final
: public Base
: public EntryMatcher
{
public:
UnidentifiedMatcher(const Anope::string &mname, const Anope::string &xname, char xchar)
: Base(mname, xname, xchar)
: EntryMatcher(mname, xname, xchar)
{
}
bool Matches(User *u, const Entry *e) override
{
return !u->Account() && Entry(e->GetMask(), this->base, false).Matches(u);
return !u->Account() && EntryMatcher::Matches(u, e);
}
};
@@ -1202,6 +1230,7 @@ struct IRCDMessageCapab final
Servers::Capab.clear();
IRCD->CanClearModes.clear();
IRCD->CanSendMultipleSWhois = false;
IRCD->CanSQLineChannel = false;
IRCD->CanTagMessage = false;
IRCD->DefaultPseudoclientModes = "+oI";
@@ -1492,6 +1521,9 @@ struct IRCDMessageCapab final
else if (modname.equals_cs("services"))
Servers::Capab.insert("SERVICES");
else if (modname.equals_cs("swhois_ext"))
IRCD->CanSendMultipleSWhois = true;
}
const auto &anoperegex = Config->GetBlock("options").Get<const Anope::string>("regexengine");
@@ -1673,7 +1705,7 @@ struct IRCDMessageFIdent final
{
User *u = source.GetUser();
if (params[0] != "*")
u->SetDisplayedHost(params[0]);
u->SetIdent(params[0]);
}
};
@@ -1879,6 +1911,9 @@ private:
else if (modname.equals_cs("services"))
required = true;
else if (modname.equals_cs("swhois_ext"))
IRCD->CanSendMultipleSWhois = plus;
else
return;
@@ -2369,7 +2404,7 @@ struct IRCDMessageUID final
* 3: host
* 4: dhost
* 5: ident
* 6: dident (v4 only)
* 6: dident
* 7: ip
* 8: signon
* 9+: modes and params -- IMPORTANT, some modes (e.g. +s) may have parameters. So don't assume a fixed position of realname!
@@ -2377,7 +2412,6 @@ struct IRCDMessageUID final
*/
void Run(MessageSource &source, const std::vector<Anope::string> &params, const Anope::map<Anope::string> &tags) override
{
size_t offset = params[8][0] == '+' ? 0 : 1;
auto ts = IRCD->ExtractTimestamp(params[1]);
NickAlias *na = NULL;
@@ -2397,9 +2431,9 @@ struct IRCDMessageUID final
++it;
}
auto *u = User::OnIntroduce(params[2], params[5+offset], params[3], params[4], params[6+offset], source.GetServer(), params[params.size() - 1], ts, params[8 + offset], params[0], na ? *na->nc : NULL, { params.begin() + 9 + offset, params.end() - 1 });
auto *u = User::OnIntroduce(params[2], params[6], params[3], params[4], params[7], source.GetServer(), params[params.size() - 1], ts, params[9], params[0], na ? *na->nc : NULL, { params.begin() + 10, params.end() - 1 });
if (u)
u->signon = IRCD->ExtractTimestamp(params[7+offset]);
u->signon = IRCD->ExtractTimestamp(params[8]);
}
};
+2 -2
View File
@@ -105,8 +105,8 @@ public:
memb->status.Clear();
BotInfo *setter = BotInfo::Find(user->GetUID());
for (auto mode : cs.Modes())
c->SetMode(setter, ModeManager::FindChannelModeByChar(mode), user->GetUID(), false);
for (auto *mode : cs.Modes())
c->SetMode(setter, mode, user->GetUID(), false);
if (memb != NULL)
memb->status = cs;
+2 -2
View File
@@ -77,8 +77,8 @@ public:
memb->status.Clear();
BotInfo *setter = BotInfo::Find(user->GetUID());
for (auto mode : cs.Modes())
c->SetMode(setter, ModeManager::FindChannelModeByChar(mode), user->GetUID(), false);
for (auto *mode : cs.Modes())
c->SetMode(setter, mode, user->GetUID(), false);
if (memb != NULL)
memb->status = cs;
+1 -1
View File
@@ -134,7 +134,7 @@ public:
{
ChannelStatus status;
status.AddMode('o');
status.AddMode(ModeManager::FindChannelModeByName("OP"));
bi->Join(c, &status);
}
+30 -4
View File
@@ -421,12 +421,15 @@ struct IRCDMessagePass final
struct IRCDMessageNotice final
: Message::Notice
{
IRCDMessageNotice(Module *creator) : Message::Notice(creator) { }
IRCDMessageNotice(Module *creator)
: Message::Notice(creator)
{
}
void Run(MessageSource &source, const std::vector<Anope::string> &params, const Anope::map<Anope::string> &tags) override
{
if (Servers::Capab.count("ECHO"))
Uplink::Send("ECHO", 'N', source.GetSource(), params[1]);
Uplink::Send(tags, "ECHO", 'N', source.GetSource(), params[1]);
Message::Notice::Run(source, params, tags);
}
@@ -435,17 +438,38 @@ struct IRCDMessageNotice final
struct IRCDMessagePrivmsg final
: Message::Privmsg
{
IRCDMessagePrivmsg(Module *creator) : Message::Privmsg(creator) { }
IRCDMessagePrivmsg(Module *creator)
: Message::Privmsg(creator)
{
}
void Run(MessageSource &source, const std::vector<Anope::string> &params, const Anope::map<Anope::string> &tags) override
{
if (Servers::Capab.count("ECHO"))
Uplink::Send("ECHO", 'P', source.GetSource(), params[1]);
Uplink::Send(tags, "ECHO", 'P', source.GetSource(), params[1]);
Message::Privmsg::Run(source, params, tags);
}
};
struct IRCDMessageTagmsg final
: IRCDMessage
{
IRCDMessageTagmsg(Module *creator)
: IRCDMessage(creator, "TAGMSG", 1)
{
SetFlag(FLAG_REQUIRE_USER);
}
void Run(MessageSource &source, const std::vector<Anope::string> &params, const Anope::map<Anope::string> &tags) override
{
if (Servers::Capab.count("ECHO"))
Uplink::Send(tags, "ECHO", 'T', source.GetSource());
// We only care about implementing ECHO for now.
}
};
class ProtoSolanum final
: public Module
{
@@ -487,6 +511,7 @@ class ProtoSolanum final
IRCDMessagePass message_pass;
IRCDMessagePrivmsg message_privmsg;
IRCDMessageServer message_server;
IRCDMessageTagmsg message_tagmsg;
static void AddModes()
{
@@ -550,6 +575,7 @@ public:
, message_pass(this)
, message_privmsg(this)
, message_server(this)
, message_tagmsg(this)
{
if (ModuleManager::LoadModule("ratbox", User::Find(creator)) != MOD_ERR_OK)
throw ModuleException("Unable to load ratbox");
+20 -7
View File
@@ -55,6 +55,7 @@ public:
CanSVSNick = true;
CanSVSJoin = true;
CanSVSNOOP = true;
CanSendMultipleSWhois = true;
CanSetVHost = true;
CanSetVIdent = true;
CanSNLine = true;
@@ -199,8 +200,8 @@ private:
memb->status.Clear();
BotInfo *setter = BotInfo::Find(user->GetUID());
for (auto mode : cs.Modes())
c->SetMode(setter, ModeManager::FindChannelModeByChar(mode), user->GetUID(), false);
for (auto *mode : cs.Modes())
c->SetMode(setter, mode, user->GetUID(), false);
if (memb != NULL)
memb->status = cs;
@@ -246,15 +247,18 @@ private:
// BIGLINES: enable sending lines up to 16384 characters in length.
// EAUTH: communicates information about the local server.
// EXTSWHOIS: enable receiving extended SWHOIS messages.
// MLOCK: enable receiving the MLOCK message when a mode lock changes.
// MTAGS: enable receiving IRCv3 message tags.
// NEXTBANS: enables receiving named extended bans.
// SJSBY: enables receiving list mode setters and set timestamps.
// SID: communicates the unique identifier of the local server.
// TS: communicates the current time for clock synchronisation purposes.
// VHP: enable receiving the vhost in UID.
Uplink::Send("PROTOCTL", "BIGLINES", "MLOCK", "MTAGS", "NEXTBANS", "SJSBY", "VHP");
Uplink::Send("PROTOCTL", "BIGLINES", "EXTSWHOIS", "MLOCK", "MTAGS", "NEXTBANS", "SJSBY", "VHP");
Uplink::Send("PROTOCTL", "EAUTH=" + Me->GetName() + ",,,Anope-" + Anope::VersionShort());
Uplink::Send("PROTOCTL", "SID=" + Me->GetSID());
Uplink::Send("PROTOCTL", "TS=" + Anope::ToString(Anope::CurTime));
SendServer(Me);
}
@@ -342,9 +346,16 @@ private:
Uplink::Send("SENDUMODE", 'o', "From " + source.GetName() + ": " + buf);
}
void SendSWhois(const MessageSource &source, const Anope::string &who, const Anope::string &mask) override
void SendSWhois(const MessageSource &source, User *target, const Anope::string &tag, const Anope::string &message) override
{
Uplink::Send("SWHOIS", who, mask);
const auto utag = tag.empty() ? source.GetName() : tag;
Uplink::Send(source, "SWHOIS", target->GetUID(), "+", utag, 0, message);
}
void SendSWhoisDel(const MessageSource &source, User *target, const Anope::string &tag, const Anope::string &message) override
{
const auto utag = tag.empty() ? source.GetName() : tag;
Uplink::Send(source, "SWHOIS", target->GetUID(), "-", utag, 0, message.empty() ? "*" : message);
}
void SendEOB() override
@@ -545,7 +556,7 @@ namespace UnrealExtBan
{
auto *memb = c->FindUser(u);
if (memb != NULL)
if (cm == NULL || memb->status.HasMode(cm->mchar))
if (cm == NULL || memb->status.HasMode(cm))
return true;
}
@@ -564,7 +575,9 @@ namespace UnrealExtBan
bool Matches(User *u, const Entry *e) override
{
return Entry(e->GetMask(), this->base, false).Matches(u);
auto mask = e->GetMask();
auto *cm = basech->Unwrap(mask);
return Entry(mask, cm->name, false).Matches(u);
}
};
+1 -1
View File
@@ -41,7 +41,7 @@ bool WebCPanel::NickServ::Cert::OnRequest(HTTP::Provider *server, const Anope::s
auto *cl = na->nc->GetExt<::NickServ::CertList>(NICKSERV_CERT_EXT);
if (cl)
for (unsigned i = 0; i < cl->GetCertCount(); ++i)
replacements["CERTS"] = cl->GetCert(i);
replacements["CERTS"] = cl->GetCert(i)->fingerprint;
TemplateFileServer page("nickserv/cert.html");
page.Serve(server, page_name, client, message, reply, replacements);
+5 -5
View File
@@ -77,8 +77,8 @@ void Channel::Reset()
/* reset modes for my clients */
if (uc->user->server == Me)
{
for (auto mode : f.Modes())
this->SetMode(NULL, ModeManager::FindChannelModeByChar(mode), uc->user->GetUID(), false);
for (auto *mode : f.Modes())
this->SetMode(NULL, mode, uc->user->GetUID(), false);
/* Modes might not exist yet, so be sure the status is really reset */
uc->status = f;
}
@@ -182,7 +182,7 @@ bool Channel::HasUserStatus(User *u, ChannelModeStatus *cms)
if (memb)
{
if (cms)
return memb->status.HasMode(cms->mchar);
return memb->status.HasMode(cms);
else
return memb->status.Empty();
}
@@ -283,7 +283,7 @@ void Channel::SetModeInternal(MessageSource &setter, ChannelMode *ocm, const Mod
/* Set the status on the user */
auto *memb = u->FindChannel(this);
if (memb)
memb->status.AddMode(cm->mchar);
memb->status.AddMode(cm);
FOREACH_RESULT(OnChannelModeSet, MOD_RESULT, (this, setter, cm, data));
@@ -354,7 +354,7 @@ void Channel::RemoveModeInternal(MessageSource &setter, ChannelMode *ocm, const
/* Remove the status on the user */
auto *memb = u->FindChannel(this);
if (memb)
memb->status.DelMode(cm->mchar);
memb->status.DelMode(cm);
FOREACH_RESULT(OnChannelModeUnset, MOD_RESULT, (this, setter, cm, param));
+7 -1
View File
@@ -209,7 +209,13 @@ void Command::OnServHelp(CommandSource &source, HelpWrapper &help)
help.AddEntry(source.command, this->GetDesc(source));
}
bool Command::OnHelp(CommandSource &source, const Anope::string &subcommand) { return false; }
bool Command::OnHelp(CommandSource &source, const Anope::string &subcommand)
{
this->SendSyntax(source);
source.Reply(" ");
source.Reply(this->GetDesc(source));
return true;
}
void Command::OnSyntaxError(CommandSource &source, const Anope::string &subcommand)
{
+3 -2
View File
@@ -385,8 +385,9 @@ Conf::Conf() : Block("")
auto *memb = c->FindUser(bi);
if (memb != NULL)
{
for (auto mode : memb->status.Modes())
c->RemoveMode(bi, ModeManager::FindChannelModeByChar(mode), bi->GetUID());
auto modes = memb->status.Modes();
for (auto mode : modes)
c->RemoveMode(bi, mode, bi->GetUID());
}
/* Set the new modes */
for (char want_mode : want_modes)
+57 -1
View File
@@ -310,6 +310,59 @@ void InfoFormatter::AddOption(const Anope::string &opt)
this->options.push_back(Language::Translate(nc, opt.c_str()));
}
ExampleWrapper &ExampleWrapper::AddEntry(const Anope::string &example, const Anope::string &desc, const Anope::string &priv)
{
auto &entry = entries.emplace_back();
entry.example = example;
entry.description = desc;
entry.privilege = priv;
return *this;
}
void ExampleWrapper::SendTo(CommandSource &source)
{
const auto *sourcenc = source.GetAccount();
const auto flexible = sourcenc ? sourcenc->HasExt("NS_FLEXIBLE") : false;
const auto *monospace = !flexible && sourcenc && sourcenc->HasExt("NS_MONOSPACE") ? "\021" : "";
const auto max_length = Config->GetBlock("options").Get<size_t>("linelength", "100");
auto header = true;
for (const auto &entry : entries)
{
if (!entry.privilege.empty() && !source.HasPriv(entry.privilege))
continue;
if (header)
{
source.Reply(" ");
source.Reply(_("Examples:"));
header = false;
}
const auto *trans_example = Language::Translate(source.nc, entry.example.c_str());
const auto *trans_description = Language::Translate(source.nc, entry.description.c_str());
if (flexible)
{
source.Reply("\002%s%s%s\002: %s", source.command.c_str(), *trans_example ? " " : "",
trans_example, trans_description);
}
else
{
source.Reply(" ");
const auto full_example = Anope::Format("%s%s%s", source.command.c_str(),
*trans_example ? " " : "", trans_example);
LineWrapper elw(full_example, max_length - 2);
for (Anope::string line; elw.GetLine(line); )
source.Reply("%s \002%s\002", monospace, line.c_str());
LineWrapper dlw(trans_description, max_length - 4);
for (Anope::string line; dlw.GetLine(line); )
source.Reply("%s %s", monospace, line.c_str());
}
}
}
void HelpWrapper::AddEntry(const Anope::string &name, const Anope::string &desc)
{
@@ -479,7 +532,7 @@ bool LineWrapper::GetLine(Anope::string &out)
break;
}
case '\x1A': // Non-breaking space
case '\x1B': // Non-breaking space
{
// There aren't any single byte non-breaking spaces so we use
// a substitute for that purpose.
@@ -783,6 +836,9 @@ Anope::string Anope::Format(const char *fmt, ...)
Anope::string Anope::Format(va_list &valist, const char *fmt)
{
if (!fmt || !fmt[0])
return "";
static std::vector<char> buffer(512);
while (true)
{
+29 -19
View File
@@ -64,24 +64,41 @@ struct StackerInfo final
void AddMode(Mode *mode, bool set, const ModeData &data);
};
ChannelStatus::ChannelStatus(const Anope::string &m) : modes(m)
ChannelStatus::ChannelStatus(const Anope::string &m)
{
for (const auto mc : m)
{
auto *cm = ModeManager::FindChannelModeByChar(mc);
if (IsValidMode(cm))
AddMode(cm);
}
}
bool ChannelStatus::IsValidMode(ChannelMode *cm)
{
return cm && cm->type == MODE_STATUS;
}
void ChannelStatus::AddMode(char c)
{
if (modes.find(c) == Anope::string::npos)
modes.append(c);
AddMode(ModeManager::FindChannelModeByChar(c));
}
void ChannelStatus::DelMode(char c)
void ChannelStatus::AddMode(ChannelMode *cm)
{
modes = modes.replace_all_cs(c, "");
if (IsValidMode(cm))
modes.insert(cm);
}
bool ChannelStatus::HasMode(char c) const
void ChannelStatus::DelMode(ChannelMode *cm)
{
return modes.find(c) != Anope::string::npos;
if (IsValidMode(cm))
modes.erase(cm);
}
bool ChannelStatus::HasMode(ChannelMode *cm) const
{
return IsValidMode(cm) && modes.find(cm) != modes.end();
}
bool ChannelStatus::Empty() const
@@ -94,23 +111,14 @@ void ChannelStatus::Clear()
modes.clear();
}
const Anope::string &ChannelStatus::Modes() const
{
return modes;
}
Anope::string ChannelStatus::BuildModePrefixList() const
{
Anope::string ret;
for (auto mode : modes)
for (const auto *cm : modes)
{
ChannelMode *cm = ModeManager::FindChannelModeByChar(mode);
if (cm != NULL && cm->type == MODE_STATUS)
{
ChannelModeStatus *cms = anope_dynamic_static_cast<ChannelModeStatus *>(cm);
ret += cms->symbol;
}
const auto *cms = anope_dynamic_static_cast<const ChannelModeStatus *>(cm);
ret += cms->symbol;
}
return ret;
@@ -788,6 +796,8 @@ Anope::string Entry::GetCleanMask() const
bool Entry::Matches(User *u, bool full) const
{
Log(LOG_DEBUG) << "Checking whether " << u->GetMask() << " matches " << this->GetMask();
/* First check if this mode has defined any matches (usually for extbans). */
if (IRCD->IsExtbanValid(this->mask))
{
+17 -3
View File
@@ -21,6 +21,11 @@ use warnings FATAL => qw(all);
use File::Basename qw(dirname);
use File::Spec::Functions qw(catfile);
use FindBin qw($RealDir);
use Digest::SHA qw(sha256_hex);
my @ignored_committers = (
'2f51f982f0630009bad5e02e49212112d1f25785e6ce76847a48774b42dce7e4' # requested via email
);
my %committers;
for my $committer (split /\n+/, `git log --pretty='%an <%ae>%n%(trailers:key=Co-Authored-By,valueonly)' HEAD`) {
@@ -34,9 +39,18 @@ for my $committer (keys %committers) {
chomp(my $author = <$fh>);
close $fh;
$author = $1 if $author =~ /^(.+) <(?:\S+\@localhost|\S+\@users.noreply.github.com)>$/;
next if $author =~ /\[bot\]$/;
next if $author =~ /^\(svnadmin\)$/;
next unless $author =~ /^(.+) <(.+)>$/;
my ($author_name, $author_email) = ($1, $2);
# Skip bots and other non-human committers.
next if $author_name =~ /\[bot\]$/;
next if $author_name =~ /^\(svnadmin\)$/;
# Skip ignored committers.
next if grep { $_ eq sha256_hex($author_email) } @ignored_committers;
# Omit uncontactable email addresses.
$author = $author_name if $author_email =~ /^(?:\S+\@localhost|\S+\@users.noreply.github.com)$/;
$authors{$author} ||= 0;
$authors{$author} += $committers{$committer};
+2 -1
View File
@@ -351,9 +351,10 @@ void User::SendMessage(BotInfo *source, const Anope::string &msg)
void User::SendMessage(CommandSource &source, const Anope::string &msg)
{
// TODO: remove support for the draft tag when other software catches up.
Anope::map<Anope::string> tags;
if (!source.msgid.empty())
tags["+draft/reply"] = source.msgid;
tags["+draft/reply"] = tags["+reply"] = source.msgid;
SendMessageInternal(*source.service, this, msg, tags);
}
+1 -1
View File
@@ -2,5 +2,5 @@
VERSION_MAJOR=2
VERSION_MINOR=1
VERSION_PATCH=21
VERSION_PATCH=22
VERSION_EXTRA=""
+18 -16
View File
@@ -1,23 +1,25 @@
[requires]
argon2/20190702
libgettext/0.26
libmysqlclient/8.1.0
openssl/3.2.1
pcre2/10.42
sqlite3/3.45.1
gettext/0.21
libgettext/0.22
openssl/3.6.1
pcre2/10.44
sqlite3/3.51.0
tre/cci.20230717
[tool_requires]
gettext/0.26
[options]
argon2/*:shared=True
libmysqlclient/*:shared=True
openssl/*:shared=True
pcre2/*:shared=True
sqlite3/*:shared=True
libgettext/*:shared=True
[imports]
., *.dll -> extradll
., *.lib -> extralib
*/*:shared=True
libiconv/*:shared=False # Shared libiconv causes linker errors
openssl/*:no_apps=True
openssl/*:no_legacy=True
pcre2/*:build_pcre2_16=False
pcre2/*:build_pcre2_32=False
pcre2/*:build_pcre2grep=False
sqlite3/*:build_executable=False
[generators]
cmake
CMakeDeps
CMakeToolchain