mirror of
https://github.com/anope/anope.git
synced 2026-07-08 01:23:14 +02:00
Compare commits
223 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 4c81f45232 | |||
| cdccfaf99a | |||
| e47d379d98 | |||
| c784f08002 | |||
| 6de2ae0046 | |||
| c26f742662 | |||
| e3bff85339 | |||
| 5819c1fcf3 | |||
| 4b8f073cb7 | |||
| 67026b184d | |||
| b49f984598 | |||
| b9cacf1d0f | |||
| 09d0bd6987 | |||
| f150ee857f | |||
| d60c80a4a3 | |||
| 44b7493eb1 | |||
| a03e765172 | |||
| 17cd10ef21 | |||
| ca8fcbe119 | |||
| b9d0762f2b | |||
| 4878b1787e | |||
| 0163d92b1d | |||
| a861a059f6 | |||
| 90da25f84f | |||
| ab362c9828 | |||
| d1f6da1817 | |||
| 9280d90aba | |||
| c71f69208d | |||
| d0080b85a7 | |||
| 745e94783d | |||
| c32be6a711 | |||
| 9dd3acfc87 | |||
| 82b6da3763 | |||
| 8e691eac80 | |||
| 2327c6ac9a | |||
| e23ea8f8ea | |||
| 449cfa6503 | |||
| 59c60849b6 | |||
| 6d2c4fb612 | |||
| 01fc7421b6 | |||
| 3a59a81aa4 | |||
| c24de0ca8f | |||
| 18555638c9 | |||
| d5a653fe94 | |||
| ad3be96283 | |||
| d689c0686d | |||
| 4ca2952069 | |||
| caf904c938 | |||
| 8930cc2a92 | |||
| 47b927d788 | |||
| 647a07ff96 | |||
| a856e80b1e | |||
| 55746e1098 | |||
| e0da3bae18 | |||
| c1cf7b0bcc | |||
| 1cf64a49c0 | |||
| 92ed0071d7 | |||
| 9469cb8b0e | |||
| e0b715b185 | |||
| e6d7306202 | |||
| 2107d18d9e | |||
| acb9428635 | |||
| d942da1df5 | |||
| a961259556 | |||
| 27a19dcc52 | |||
| e45814bfd6 | |||
| f12b590a6d | |||
| c0bafe10b4 | |||
| 5f40d0d6bb | |||
| 6b416cc64d | |||
| 331c33c350 | |||
| 10eef1af23 | |||
| 90ff716ed3 | |||
| f67c70e485 | |||
| fd5e10c54c | |||
| 029565c894 | |||
| 9b8862826c | |||
| e2dc77641a | |||
| 7eb710a009 | |||
| b33b5a6630 | |||
| f4d5b1f01d | |||
| b61daf81b0 | |||
| da3f667188 | |||
| 040cd99027 | |||
| 6c7977f239 | |||
| 9b8570a2ee | |||
| 64f386e29e | |||
| 9434be29bc | |||
| 9aff71fb2f | |||
| ba26d9a15c | |||
| 22dc33de9f | |||
| 11d6f58a1a | |||
| f32d6453f5 | |||
| 1606bb01a3 | |||
| 3d86c82ac5 | |||
| a858a1e0a0 | |||
| eaa24d3b0a | |||
| 5355b53008 | |||
| 85a32077b5 | |||
| 5006993d0a | |||
| 1b2b4386c1 | |||
| b199d74088 | |||
| 7e2ef3774b | |||
| e002f39509 | |||
| d3395a5d39 | |||
| 1deff337fe | |||
| adf457ffb2 | |||
| 550adc13f3 | |||
| 04bdcb8ce6 | |||
| 0a99866e5b | |||
| c22f7a9038 | |||
| 074ad6556c | |||
| a657cb5edf | |||
| 63032dc8d9 | |||
| 404f55502e | |||
| 73f3621af6 | |||
| 2a1409face | |||
| 9834040948 | |||
| f111e3b3ec | |||
| 22a1924bfd | |||
| fa5bb3f1bf | |||
| 12545ccbde | |||
| 98703052cc | |||
| 15635779af | |||
| 1fc58c7a57 | |||
| e9614986d0 | |||
| dde9113418 | |||
| 99f7ea8307 | |||
| f912e30b25 | |||
| 2ca5045593 | |||
| be6a454579 | |||
| 1ffeb85727 | |||
| 95fc992355 | |||
| 0df341fa32 | |||
| decbab5d09 | |||
| 9409560597 | |||
| a02b81f219 | |||
| 6c86cd108a | |||
| 3ea5b078dc | |||
| d77fd4bde1 | |||
| da723d562f | |||
| 5db1a57833 | |||
| a01cd481b9 | |||
| aa41fffd49 | |||
| 8062d01a90 | |||
| d0c2baeed4 | |||
| 538b2cf035 | |||
| 7aeac28ca7 | |||
| 3244eef71d | |||
| f91cf1745d | |||
| f380b27ed3 | |||
| 66f53128ce | |||
| 45496780f8 | |||
| 8500fefe91 | |||
| 7242c740c8 | |||
| d43acc2381 | |||
| 2f1f04f7cb | |||
| 5b2ab323ab | |||
| 5aa71469e1 | |||
| 5aeb078391 | |||
| bc737c20c9 | |||
| 7d7ca934b3 | |||
| 238adae2cd | |||
| 407f604d48 | |||
| 76af25f0b4 | |||
| bf5ab14a21 | |||
| 766a18b0f1 | |||
| 1f0c76516b | |||
| aef1925b1d | |||
| e7aa0cb583 | |||
| bd72a444df | |||
| 147638bf5a | |||
| 1d8086b12d | |||
| e6fcf3ffb3 | |||
| de122145d9 | |||
| 84b94bdbf1 | |||
| 5a4781161a | |||
| 7b70119294 | |||
| bc9e035038 | |||
| c3e62d3772 | |||
| 48bb6089fa | |||
| debfa59be6 | |||
| e321749d1f | |||
| 8a2d7526cd | |||
| a0676ef8b1 | |||
| e1f34ee5d6 | |||
| 6e18030285 | |||
| 172f443421 | |||
| 655c4fb5eb | |||
| 650f953cb1 | |||
| db3f60292f | |||
| 792308ed5d | |||
| 3af9da7c05 | |||
| 59d8c28c85 | |||
| 520826cdea | |||
| bfb47ab5a6 | |||
| 25cd6c96e3 | |||
| 5dbbac21ec | |||
| 81aa37543e | |||
| 4ac5cf89e3 | |||
| c479bc75d9 | |||
| 6e4dc4947e | |||
| 05002301cc | |||
| 1d18ba3358 | |||
| 65827611e7 | |||
| 0ae67cb371 | |||
| 93e5b871e1 | |||
| 0f433ebe9c | |||
| 3e8c5b2685 | |||
| 3fe9097439 | |||
| 57446ee49b | |||
| 852aae5e4f | |||
| caa9b27a6c | |||
| adcdaeca04 | |||
| 641e011e13 | |||
| aba75c1f31 | |||
| f367820714 | |||
| f526932882 | |||
| db2f7ca192 | |||
| 5a9f581491 | |||
| 6b707049f2 | |||
| 3d845097de | |||
| f368f5c541 |
@@ -35,5 +35,6 @@ I have ensured that:
|
|||||||
|
|
||||||
- [ ] The code I am submitting is my own work and/or I have permission from the author to share it.
|
- [ ] The code I am submitting is my own work and/or I have permission from the author to share it.
|
||||||
- [ ] Generative AI (Copilot, ChatGPT, etc) was not used to create any part of this pull request.
|
- [ ] Generative AI (Copilot, ChatGPT, etc) was not used to create any part of this pull request.
|
||||||
- [ ] I have documented any features added by this pull request.
|
- [ ] If the pull request contains a security fix I have followed the reporting rules mentioned in [the security policy](https://github.com/anope/anope/security/policy) (delete if not applicable).
|
||||||
|
- [ ] I have documented any features added by this pull request (delete if not applicable).
|
||||||
- [ ] This pull request does not introduce any incompatible API changes (stable branches only, delete if not applicable).
|
- [ ] This pull request does not introduce any incompatible API changes (stable branches only, delete if not applicable).
|
||||||
|
|||||||
@@ -3,21 +3,18 @@ on:
|
|||||||
pull_request:
|
pull_request:
|
||||||
push:
|
push:
|
||||||
schedule:
|
schedule:
|
||||||
- cron: '0 0 * * 0'
|
- cron: 0 0 * * 0
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
if: "!contains(github.event.head_commit.message, '[skip alpine ci]')"
|
if: "!contains(github.event.head_commit.message, '[skip alpine ci]')"
|
||||||
container: alpine:edge
|
container: alpine:latest
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
env:
|
|
||||||
CXX: ${{ matrix.compiler }}
|
|
||||||
CXXFLAGS: -Werror
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v5
|
- uses: actions/checkout@v7
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: |
|
run: |-
|
||||||
echo "http://dl-cdn.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories
|
echo "http://dl-cdn.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories
|
||||||
apk update
|
apk update
|
||||||
apk add \
|
apk add \
|
||||||
@@ -37,24 +34,36 @@ jobs:
|
|||||||
tre-dev
|
tre-dev
|
||||||
|
|
||||||
- name: Enable extras
|
- name: Enable extras
|
||||||
run: |
|
run: |-
|
||||||
for MODULE in enc_argon2 enc_posix ldap mysql regex_pcre2 regex_posix regex_tre sqlite ssl_gnutls ssl_openssl
|
for MODULE in enc_argon2 enc_posix ldap mysql regex_pcre2 regex_posix regex_tre sqlite ssl_gnutls ssl_openssl
|
||||||
do
|
do
|
||||||
ln -s $PWD/modules/extra/$MODULE.cpp $PWD/modules
|
ln -s $PWD/modules/extra/$MODULE.cpp $PWD/modules
|
||||||
done
|
done
|
||||||
|
|
||||||
- name: Run CMake
|
- name: Run CMake
|
||||||
run: |
|
env:
|
||||||
mkdir build && cd build
|
CC: ${{ matrix.compiler.cc }}
|
||||||
cmake -GNinja -DCMAKE_BUILD_TYPE:STRING=DEBUG -DINSTDIR:STRING=$(readlink -f ../run) ..
|
CXX: ${{ matrix.compiler.cxx }}
|
||||||
|
CXXFLAGS: -Werror
|
||||||
|
run: |-
|
||||||
|
cmake -B "build" \
|
||||||
|
-D "CMAKE_BUILD_TYPE=Debug" \
|
||||||
|
-D "INSTDIR=$(readlink -f ../run)" \
|
||||||
|
-G "Ninja" \
|
||||||
|
-Wdeprecated \
|
||||||
|
-Wdev
|
||||||
|
|
||||||
- name: Build Anope
|
- name: Build and install
|
||||||
run: |
|
env:
|
||||||
ninja -C build install
|
VERBOSE: ${{ runner.debug }}
|
||||||
|
run: |-
|
||||||
|
ninja -C "build" ${{ runner.debug == '1' && '-v' || '' }} install
|
||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
compiler:
|
compiler:
|
||||||
- clang++
|
- cc: clang
|
||||||
- g++
|
cxx: clang++
|
||||||
|
- cc: gcc
|
||||||
|
cxx: g++
|
||||||
|
|||||||
@@ -3,20 +3,17 @@ on:
|
|||||||
pull_request:
|
pull_request:
|
||||||
push:
|
push:
|
||||||
schedule:
|
schedule:
|
||||||
- cron: '0 0 * * 0'
|
- cron: 0 0 * * 0
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
if: "!contains(github.event.head_commit.message, '[skip ubuntu ci]')"
|
if: "!contains(github.event.head_commit.message, '[skip ubuntu ci]')"
|
||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-latest
|
||||||
env:
|
|
||||||
CXX: ${{ matrix.compiler }}
|
|
||||||
CXXFLAGS: -Werror
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v5
|
- uses: actions/checkout@v7
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: |
|
run: |-
|
||||||
sudo apt-get update --assume-yes
|
sudo apt-get update --assume-yes
|
||||||
sudo apt-get install --assume-yes --no-install-recommends \
|
sudo apt-get install --assume-yes --no-install-recommends \
|
||||||
clang \
|
clang \
|
||||||
@@ -34,24 +31,36 @@ jobs:
|
|||||||
ninja-build
|
ninja-build
|
||||||
|
|
||||||
- name: Enable extras
|
- name: Enable extras
|
||||||
run: |
|
run: |-
|
||||||
for MODULE in enc_argon2 enc_posix ldap mysql regex_pcre2 regex_posix regex_tre sqlite ssl_gnutls ssl_openssl
|
for MODULE in enc_argon2 enc_posix ldap mysql regex_pcre2 regex_posix regex_tre sqlite ssl_gnutls ssl_openssl
|
||||||
do
|
do
|
||||||
ln -s ${{ github.workspace }}/modules/extra/$MODULE.cpp ${{ github.workspace }}/modules
|
ln -s ${{ github.workspace }}/modules/extra/$MODULE.cpp ${{ github.workspace }}/modules
|
||||||
done
|
done
|
||||||
|
|
||||||
- name: Run CMake
|
- name: Run CMake
|
||||||
run: |
|
env:
|
||||||
mkdir build && cd build
|
CC: ${{ matrix.compiler.cc }}
|
||||||
cmake -GNinja -DCMAKE_BUILD_TYPE:STRING=DEBUG -DINSTDIR:STRING=${{ github.workspace }}/run ..
|
CXX: ${{ matrix.compiler.cxx }}
|
||||||
|
CXXFLAGS: -Werror
|
||||||
|
run: |-
|
||||||
|
cmake -B "build" \
|
||||||
|
-D "CMAKE_BUILD_TYPE=Debug" \
|
||||||
|
-D "INSTDIR=${{ github.workspace }}/run" \
|
||||||
|
-G "Ninja" \
|
||||||
|
-Wdeprecated \
|
||||||
|
-Wdev
|
||||||
|
|
||||||
- name: Build Anope
|
- name: Build and install
|
||||||
run: |
|
env:
|
||||||
ninja -C ${{ github.workspace }}/build install
|
VERBOSE: ${{ runner.debug }}
|
||||||
|
run: |-
|
||||||
|
ninja -C "build" ${{ runner.debug == '1' && '-v' || '' }} install
|
||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
compiler:
|
compiler:
|
||||||
- clang++
|
- cc: clang
|
||||||
- g++
|
cxx: clang++
|
||||||
|
- cc: gcc
|
||||||
|
cxx: g++
|
||||||
|
|||||||
@@ -6,71 +6,91 @@ on:
|
|||||||
types:
|
types:
|
||||||
- published
|
- published
|
||||||
schedule:
|
schedule:
|
||||||
- cron: '0 0 * * 0'
|
- cron: 0 0 * * 0
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
if: "!contains(github.event.head_commit.message, '[skip windows ci]')"
|
if: "!contains(github.event.head_commit.message, '[skip windows ci]')"
|
||||||
runs-on: windows-2025
|
runs-on: windows-2025
|
||||||
env:
|
env:
|
||||||
|
BUILD_PATH: ${{ github.workspace }}\build
|
||||||
BUILD_TYPE: ${{ github.event_name == 'release' && 'Release' || 'Debug' }}
|
BUILD_TYPE: ${{ github.event_name == 'release' && 'Release' || 'Debug' }}
|
||||||
CONAN_USER_HOME: ${{ github.workspace }}/win/build
|
CONAN_FILE: ${{ github.workspace }}\src\win32\conanfile.txt
|
||||||
CONAN_USER_HOME_SHORT: None
|
CONAN_HOME: ${{ github.workspace }}\build\conan
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v5
|
- uses: actions/checkout@v7
|
||||||
|
|
||||||
|
- name: Setup MSVC
|
||||||
|
uses: TheMrMilchmann/setup-msvc-dev@v4
|
||||||
|
with:
|
||||||
|
arch: x64
|
||||||
|
|
||||||
- name: Setup NSIS
|
- name: Setup NSIS
|
||||||
run: |-
|
uses: negrutiu/nsis-install@v3
|
||||||
choco install nsis
|
with:
|
||||||
|
distro: official
|
||||||
- name: Setup MSBuild
|
|
||||||
uses: microsoft/setup-msbuild@v2
|
|
||||||
|
|
||||||
- name: Setup Conan
|
- name: Setup Conan
|
||||||
uses: turtlebrowser/get-conan@v1.2
|
uses: turtlebrowser/get-conan@v1.2
|
||||||
with:
|
|
||||||
version: 1.66.0
|
- name: Create Conan configuration
|
||||||
|
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
|
||||||
|
Write-Output 'tools.cmake.cmaketoolchain:generator=Ninja' | Out-File -Append ${{ env.CONAN_HOME }}\global.conf
|
||||||
|
Write-Output 'user.openssl:windows_use_jom=True' | Out-File -Append ${{ env.CONAN_HOME }}\global.conf
|
||||||
|
|
||||||
- name: Try to restore libraries from the cache
|
- name: Try to restore libraries from the cache
|
||||||
uses: actions/cache/restore@v4
|
if: github.event_name != 'release'
|
||||||
|
uses: actions/cache/restore@v6
|
||||||
id: library-cache
|
id: library-cache
|
||||||
with:
|
with:
|
||||||
key: conan-${{ hashFiles('src/win32/conanfile.txt') }}
|
key: Conan VS${{ env.VisualStudioVersion }} ${{ env.BUILD_TYPE }} ${{ hashFiles(env.CONAN_FILE) }}
|
||||||
path: ${{ env.CONAN_USER_HOME }}/.conan
|
path: ${{ env.CONAN_HOME }}/p
|
||||||
|
|
||||||
- name: Install libraries
|
- name: Install libraries
|
||||||
run: |
|
working-directory: ${{ env.BUILD_PATH }}
|
||||||
conan install ${{ github.workspace }}\src\win32 --build=missing
|
run: |-
|
||||||
|
(Get-Content ${{ env.CONAN_FILE }}).replace('##', '') | Set-Content ${{ env.CONAN_FILE }}
|
||||||
|
conan install ${{ env.CONAN_FILE }} --build missing --deployer runtime_deploy --deployer-folder extradll --output-folder .
|
||||||
|
conan cache clean "*"
|
||||||
|
|
||||||
- name: Save libraries to the cache
|
- name: Save libraries to the cache
|
||||||
if: ${{ steps.library-cache.outputs.cache-hit != 'true' }}
|
if: steps.library-cache.outputs.cache-hit != 'true' && github.event_name != 'release'
|
||||||
uses: actions/cache/save@v4
|
uses: actions/cache/save@v6
|
||||||
with:
|
with:
|
||||||
key: ${{ steps.library-cache.outputs.cache-primary-key }}
|
key: ${{ steps.library-cache.outputs.cache-primary-key }}
|
||||||
path: ${{ env.CONAN_USER_HOME }}/.conan
|
path: ${{ env.CONAN_HOME }}\p
|
||||||
|
|
||||||
- name: Run CMake
|
- name: Run CMake
|
||||||
run: |
|
working-directory: ${{ env.BUILD_PATH }}
|
||||||
mkdir ${{ github.workspace }}\build
|
run: |-
|
||||||
cd ${{ github.workspace }}\build
|
cmake -D "CMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }}" `
|
||||||
cmake -A x64 -D "CMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }}" -G "Visual Studio 17 2022" ..
|
-D "CMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake" `
|
||||||
|
-G "Ninja Multi-Config" `
|
||||||
|
-S "${{ github.workspace }}" `
|
||||||
|
-Wdeprecated `
|
||||||
|
-Wdev
|
||||||
|
|
||||||
- name: Build Anope
|
- name: Build installer
|
||||||
working-directory: ${{ github.workspace }}\build
|
working-directory: ${{ env.BUILD_PATH }}
|
||||||
run: |
|
run: |-
|
||||||
msbuild PACKAGE.vcxproj /M:5 /P:Configuration=${{ env.BUILD_TYPE }} /P:Platform=x64 /VERBOSITY:MINIMAL
|
ninja -f "build-${{ env.BUILD_TYPE }}.ninja" ${{ runner.debug == '1' && '-v' || '' }} package
|
||||||
|
|
||||||
- name: Upload installer
|
- name: Upload installer
|
||||||
if: "${{ github.event_name == 'release' }}"
|
if: github.event_name == 'release'
|
||||||
working-directory: ${{ github.workspace }}\build
|
working-directory: ${{ env.BUILD_PATH }}
|
||||||
env:
|
env:
|
||||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
run: |
|
run: |
|
||||||
gh release upload ${{ github.event.release.tag_name }} $(Get-ChildItem anope-*.exe)
|
gh release upload ${{ github.event.release.tag_name }} $(Get-ChildItem anope-*.exe)
|
||||||
|
|
||||||
- name: Upload artifact
|
- name: Upload artifact
|
||||||
if: "${{ github.event_name != 'release' }}"
|
if: github.event_name != 'release'
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v7
|
||||||
with:
|
with:
|
||||||
name: windows-installer
|
name: windows-installer
|
||||||
path: ${{ github.workspace }}\build\\anope-*.exe
|
path: ${{ github.workspace }}\build\\anope-*.exe
|
||||||
|
|||||||
@@ -0,0 +1,223 @@
|
|||||||
|
name: irctest
|
||||||
|
|
||||||
|
# Last checked: 2026-06-29
|
||||||
|
env:
|
||||||
|
INSPIRCD_REF: v4.11.0 # 2026-06-06
|
||||||
|
IRCTEST_REF: ff6ef19d96cacd79ea8033dda2cf660fe5cdba52 # 2026-06-20
|
||||||
|
SOLANUM_REF: a17cc145a7de564e49b84807d335289f30b12d00 # 2026-06-23
|
||||||
|
UNREALIRCD_REF: 1250b7f014dbbe1dae13138dbef6e52c6dcd5557 # 2026-05-15 (6.2.5)
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
push:
|
||||||
|
schedule:
|
||||||
|
- cron: 0 0 * * 0
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
check-skip:
|
||||||
|
if: "!contains(github.event.head_commit.message, '[skip irctest ci]')"
|
||||||
|
runs-on: ubuntu-26.04-arm
|
||||||
|
steps:
|
||||||
|
- run: true # Avoids skip check duplication.
|
||||||
|
|
||||||
|
build-anope:
|
||||||
|
needs:
|
||||||
|
- check-skip
|
||||||
|
runs-on: ubuntu-26.04-arm
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v7
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
run: |-
|
||||||
|
sudo apt-get install build-essential cmake --assume-yes
|
||||||
|
cmake \
|
||||||
|
-B "${{ github.workspace }}/build" \
|
||||||
|
-D "CMAKE_UNITY_BUILD=ON" \
|
||||||
|
-D "CMAKE_UNITY_BUILD_BATCH_SIZE=0" \
|
||||||
|
-D "INSTDIR=$HOME/software/anope" \
|
||||||
|
-G "Ninja" \
|
||||||
|
-S "${{ github.workspace }}"
|
||||||
|
ninja -C "${{ github.workspace }}/build" install
|
||||||
|
|
||||||
|
- name: Make artifact
|
||||||
|
run: |-
|
||||||
|
tar \
|
||||||
|
--auto-compress \
|
||||||
|
--create \
|
||||||
|
--file installed-anope.tar.gz \
|
||||||
|
$HOME/software/anope
|
||||||
|
|
||||||
|
- name: Upload artifact
|
||||||
|
uses: actions/upload-artifact@v7
|
||||||
|
with:
|
||||||
|
name: installed-anope
|
||||||
|
path: installed-anope.tar.gz
|
||||||
|
retention-days: 1
|
||||||
|
|
||||||
|
build-inspircd:
|
||||||
|
needs:
|
||||||
|
- check-skip
|
||||||
|
runs-on: ubuntu-26.04-arm
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v7
|
||||||
|
with:
|
||||||
|
ref: ${{ env.INSPIRCD_REF }}
|
||||||
|
repository: inspircd/inspircd
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
run: |-
|
||||||
|
sudo apt-get install build-essential --assume-yes
|
||||||
|
./configure \
|
||||||
|
--development \
|
||||||
|
--disable-auto-extras \
|
||||||
|
--prefix $HOME/software/inspircd
|
||||||
|
export CXXFLAGS="-DINSPIRCD_UNLIMITED_MAINLOOP"
|
||||||
|
make -j$(($(getconf _NPROCESSORS_ONLN) + 1)) install
|
||||||
|
|
||||||
|
- name: Make artifact
|
||||||
|
run: |-
|
||||||
|
tar \
|
||||||
|
--auto-compress \
|
||||||
|
--create \
|
||||||
|
--file installed-inspircd.tar.gz \
|
||||||
|
$HOME/software/inspircd
|
||||||
|
|
||||||
|
- name: Upload artifact
|
||||||
|
uses: actions/upload-artifact@v7
|
||||||
|
with:
|
||||||
|
name: installed-inspircd
|
||||||
|
path: installed-inspircd.tar.gz
|
||||||
|
retention-days: 1
|
||||||
|
|
||||||
|
build-solanum:
|
||||||
|
needs:
|
||||||
|
- check-skip
|
||||||
|
runs-on: ubuntu-26.04-arm
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v7
|
||||||
|
with:
|
||||||
|
ref: ${{ env.SOLANUM_REF }}
|
||||||
|
repository: solanum-ircd/solanum
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
run: |-
|
||||||
|
sudo apt-get install build-essential libltdl-dev --assume-yes
|
||||||
|
./autogen.sh
|
||||||
|
./configure \
|
||||||
|
--enable-fhs-paths \
|
||||||
|
--prefix $HOME/software/solanum
|
||||||
|
make -j$(($(getconf _NPROCESSORS_ONLN) + 1)) install
|
||||||
|
|
||||||
|
- name: Make artifact
|
||||||
|
run: |-
|
||||||
|
tar \
|
||||||
|
--auto-compress \
|
||||||
|
--create \
|
||||||
|
--file installed-solanum.tar.gz \
|
||||||
|
$HOME/software/solanum
|
||||||
|
|
||||||
|
- name: Upload artifact
|
||||||
|
uses: actions/upload-artifact@v7
|
||||||
|
with:
|
||||||
|
name: installed-solanum
|
||||||
|
path: installed-solanum.tar.gz
|
||||||
|
retention-days: 1
|
||||||
|
|
||||||
|
build-unrealircd:
|
||||||
|
needs:
|
||||||
|
- check-skip
|
||||||
|
runs-on: ubuntu-26.04-arm
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v7
|
||||||
|
with:
|
||||||
|
ref: ${{ env.UNREALIRCD_REF }}
|
||||||
|
repository: unrealircd/unrealircd
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
run: |-
|
||||||
|
sudo apt-get install build-essential libssl-dev --assume-yes
|
||||||
|
wget --output-document src/modules/third/metadata2.c https://raw.githubusercontent.com/progval/unrealircd-contrib/metadata2/files/metadata2.c
|
||||||
|
echo "BASEPATH=$HOME/software/unrealircd" >> config.settings
|
||||||
|
echo "GEOIP=none" >> config.settings
|
||||||
|
yes "" | ./Config
|
||||||
|
make -j$(($(getconf _NPROCESSORS_ONLN) + 1)) install
|
||||||
|
|
||||||
|
- name: Make artifact
|
||||||
|
run: |-
|
||||||
|
tar \
|
||||||
|
--auto-compress \
|
||||||
|
--create \
|
||||||
|
--file installed-unrealircd.tar.gz \
|
||||||
|
$HOME/software/unrealircd
|
||||||
|
|
||||||
|
- name: Upload artifact
|
||||||
|
uses: actions/upload-artifact@v7
|
||||||
|
with:
|
||||||
|
name: installed-unrealircd
|
||||||
|
path: installed-unrealircd.tar.gz
|
||||||
|
retention-days: 1
|
||||||
|
|
||||||
|
test:
|
||||||
|
runs-on: ubuntu-26.04-arm
|
||||||
|
needs:
|
||||||
|
- build-anope
|
||||||
|
- build-inspircd
|
||||||
|
- build-solanum
|
||||||
|
- build-unrealircd
|
||||||
|
steps:
|
||||||
|
- name: Download Anope artifact
|
||||||
|
uses: actions/download-artifact@v8
|
||||||
|
with:
|
||||||
|
name: installed-anope
|
||||||
|
|
||||||
|
- name: Download server artifact
|
||||||
|
uses: actions/download-artifact@v8
|
||||||
|
with:
|
||||||
|
name: installed-${{ matrix.server }}
|
||||||
|
|
||||||
|
- name: Unpack artifacts
|
||||||
|
run: |-
|
||||||
|
for ARCHIVE in installed-anope installed-${{ matrix.server }}
|
||||||
|
do
|
||||||
|
tar \
|
||||||
|
--directory / \
|
||||||
|
--extract \
|
||||||
|
--file ${ARCHIVE}.tar.gz
|
||||||
|
done
|
||||||
|
for SOFTWARE in $HOME/software/*
|
||||||
|
do
|
||||||
|
echo "Adding ${SOFTWARE} to the PATH"
|
||||||
|
export PATH=$SOFTWARE/bin:$SOFTWARE/sbin:$PATH
|
||||||
|
done
|
||||||
|
echo PATH=$PATH >> $GITHUB_ENV
|
||||||
|
|
||||||
|
- name: Checkout irctest
|
||||||
|
uses: actions/checkout@v7
|
||||||
|
with:
|
||||||
|
ref: ${{ env.IRCTEST_REF }}
|
||||||
|
repository: progval/irctest
|
||||||
|
|
||||||
|
- name: Install irctest dependencies
|
||||||
|
run: |-
|
||||||
|
sudo apt-get install faketime
|
||||||
|
pip3 install --requirement requirements.txt pytest-xdist pytest-timeout
|
||||||
|
|
||||||
|
- name: Run irctest
|
||||||
|
env:
|
||||||
|
IRCTEST_DEBUG_LOGS: ${{ runner.debug }}
|
||||||
|
PYTEST_ARGS: --color=yes --verbose
|
||||||
|
run: |-
|
||||||
|
make ${{ matrix.server}}-anope
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
server:
|
||||||
|
- inspircd
|
||||||
|
- solanum
|
||||||
|
- unrealircd
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
build/
|
build/
|
||||||
config.cache
|
config.cache
|
||||||
|
docs/doxygen
|
||||||
include/sysconf.h
|
include/sysconf.h
|
||||||
modules/enc_argon2.cpp
|
modules/enc_argon2.cpp
|
||||||
modules/enc_posix.cpp
|
modules/enc_posix.cpp
|
||||||
|
|||||||
@@ -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> <rob rob@31f1291d-b8d6-0310-a050-a5561fc1590b@5417fbe8-f217-4b02-8779-1006273d7864>
|
||||||
David Robson <rob@anope.org> <robbeh@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>
|
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>
|
Fabio Scotoni <cculex@gmail.com>
|
||||||
Filippo Cortigiani <simos@simosnap.org> <devel@devel.crtnet.it>
|
Filippo Cortigiani <simos@simosnap.org> <devel@devel.crtnet.it>
|
||||||
Filippo Cortigiani <simos@simosnap.org> <simos@H7-25.fritz.box>
|
Filippo Cortigiani <simos@simosnap.org> <simos@H7-25.fritz.box>
|
||||||
@@ -52,7 +51,8 @@ Robby <robby@chatbelgie.be> <robby@chat.be>
|
|||||||
Robert Scheck <robert@fedoraproject.org> <robert-scheck@users.noreply.github.com>
|
Robert Scheck <robert@fedoraproject.org> <robert-scheck@users.noreply.github.com>
|
||||||
Robin Burchell <w00t@inspircd.org> <rburchell@5417fbe8-f217-4b02-8779-1006273d7864>
|
Robin Burchell <w00t@inspircd.org> <rburchell@5417fbe8-f217-4b02-8779-1006273d7864>
|
||||||
Robin Burchell <w00t@inspircd.org> <Robin Burchell w00t@inspircd.org@5417fbe8-f217-4b02-8779-1006273d7864>
|
Robin Burchell <w00t@inspircd.org> <Robin Burchell w00t@inspircd.org@5417fbe8-f217-4b02-8779-1006273d7864>
|
||||||
Sadie Powell <sadie@witchery.services> <petpow@saberuk.com>
|
Sadie Powell <sadie@sadiepowell.dev> <petpow@saberuk.com>
|
||||||
|
Sadie Powell <sadie@sadiepowell.dev> <sadie@witchery.services>
|
||||||
Sebastian Barfurth <github@afreshmelon.com>
|
Sebastian Barfurth <github@afreshmelon.com>
|
||||||
Sebastian V. <hal9000@denorastats.org>
|
Sebastian V. <hal9000@denorastats.org>
|
||||||
Sebastian V. <hal9000@denorastats.org> <pimpmylinux@5417fbe8-f217-4b02-8779-1006273d7864>
|
Sebastian V. <hal9000@denorastats.org> <pimpmylinux@5417fbe8-f217-4b02-8779-1006273d7864>
|
||||||
|
|||||||
+46
-38
@@ -1,8 +1,8 @@
|
|||||||
# This usage of CMake requires at least version 3.20
|
# This usage of CMake requires at least version 3.20
|
||||||
cmake_minimum_required(VERSION 3.20 FATAL_ERROR)
|
cmake_minimum_required(VERSION 3.20 FATAL_ERROR)
|
||||||
|
|
||||||
# Set the project as C++ primarily
|
# Set the project as C++ primarily with C for the vendored libraries
|
||||||
project(Anope CXX)
|
project(Anope CXX C)
|
||||||
|
|
||||||
# Force the locale to C for later uses of things like gcc so the messages come up in English, not the user's default language
|
# Force the locale to C for later uses of things like gcc so the messages come up in English, not the user's default language
|
||||||
set(ENV{LC_ALL} C)
|
set(ENV{LC_ALL} C)
|
||||||
@@ -25,7 +25,11 @@ include(CheckFunctionExists)
|
|||||||
include(CheckTypeSize)
|
include(CheckTypeSize)
|
||||||
include(CheckLibraryExists)
|
include(CheckLibraryExists)
|
||||||
include(CheckCXXCompilerFlag)
|
include(CheckCXXCompilerFlag)
|
||||||
include(FindPkgConfig)
|
include(CheckPIESupported)
|
||||||
|
|
||||||
|
if(NOT WIN32)
|
||||||
|
include(FindPkgConfig)
|
||||||
|
endif()
|
||||||
|
|
||||||
# If extra include directories were specified, tell cmake about them.
|
# If extra include directories were specified, tell cmake about them.
|
||||||
if(EXTRA_INCLUDE)
|
if(EXTRA_INCLUDE)
|
||||||
@@ -37,21 +41,19 @@ if(EXTRA_LIBS)
|
|||||||
link_directories(${EXTRA_LIBS})
|
link_directories(${EXTRA_LIBS})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# setup conan
|
# Enable -fPIC for all targets.
|
||||||
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/conanbuildinfo.cmake")
|
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
|
||||||
include("${CMAKE_CURRENT_SOURCE_DIR}/conanbuildinfo.cmake")
|
check_pie_supported()
|
||||||
conan_basic_setup(TARGETS)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Find gettext
|
# Find gettext
|
||||||
find_package(Gettext)
|
find_package(Gettext)
|
||||||
find_package(Intl)
|
find_package(Intl)
|
||||||
if(GETTEXT_FOUND AND Intl_FOUND)
|
if(Gettext_FOUND AND Intl_FOUND)
|
||||||
set(HAVE_LOCALIZATION ON)
|
set(HAVE_LOCALIZATION ON)
|
||||||
include_directories(${Intl_INCLUDE_DIRS})
|
include_directories(${Intl_INCLUDE_DIRS})
|
||||||
link_libraries(${Intl_LIBRARY})
|
link_libraries(${Intl_LIBRARIES})
|
||||||
else()
|
else()
|
||||||
message("Unable to find gettext and libintl; disabling localization")
|
message(STATUS "Unable to find gettext and/or libintl -- read docs/LANGUAGE for how to enable localization")
|
||||||
set(HAVE_LOCALIZATION OFF)
|
set(HAVE_LOCALIZATION OFF)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@@ -147,28 +149,37 @@ elseif(NOT CMAKE_INSTALL_PREFIX)
|
|||||||
set(CMAKE_INSTALL_PREFIX "$ENV{HOME}/anope-${VERSION_MAJOR}-${VERSION_MINOR}")
|
set(CMAKE_INSTALL_PREFIX "$ENV{HOME}/anope-${VERSION_MAJOR}-${VERSION_MINOR}")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
function(configure_path VARIABLE DEFAULT)
|
||||||
|
if(NOT DEFINED ${VARIABLE})
|
||||||
|
set(${VARIABLE} ${DEFAULT} CACHE PATH "Location of the ${DEFAULT} directory")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(WIN32)
|
||||||
|
set(ABSOLUTE_${VARIABLE} ${${VARIABLE}})
|
||||||
|
else()
|
||||||
|
cmake_path(
|
||||||
|
APPEND CMAKE_INSTALL_PREFIX "${${VARIABLE}}"
|
||||||
|
OUTPUT_VARIABLE ABSOLUTE_${VARIABLE}
|
||||||
|
)
|
||||||
|
cmake_path(NORMAL_PATH ABSOLUTE_${VARIABLE})
|
||||||
|
endif()
|
||||||
|
set(ABSOLUTE_${VARIABLE} ${ABSOLUTE_${VARIABLE}} CACHE INTERNAL "" FORCE)
|
||||||
|
|
||||||
|
install(
|
||||||
|
DIRECTORY
|
||||||
|
DESTINATION ${${VARIABLE}}
|
||||||
|
)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
|
||||||
# Set default paths for various directories if not already defined
|
# Set default paths for various directories if not already defined
|
||||||
if(NOT BIN_DIR)
|
configure_path(BIN_DIR "bin")
|
||||||
set(BIN_DIR "bin")
|
configure_path(DATA_DIR "data")
|
||||||
endif()
|
configure_path(DOC_DIR "doc")
|
||||||
if(NOT DATA_DIR)
|
configure_path(CONF_DIR "conf")
|
||||||
set(DATA_DIR "data")
|
configure_path(MODULE_DIR "modules")
|
||||||
endif()
|
configure_path(LOCALE_DIR "locale")
|
||||||
if(NOT DOC_DIR)
|
configure_path(LOG_DIR "logs")
|
||||||
set(DOC_DIR "doc")
|
|
||||||
endif()
|
|
||||||
if(NOT CONF_DIR)
|
|
||||||
set(CONF_DIR "conf")
|
|
||||||
endif()
|
|
||||||
if(NOT MODULE_DIR)
|
|
||||||
set(MODULE_DIR "modules")
|
|
||||||
endif()
|
|
||||||
if(NOT LOCALE_DIR)
|
|
||||||
set(LOCALE_DIR "locale")
|
|
||||||
endif()
|
|
||||||
if(NOT LOG_DIR)
|
|
||||||
set(LOG_DIR "logs")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Version number processing
|
# Version number processing
|
||||||
# Find all lines in src/version.sh that start with VERSION_
|
# Find all lines in src/version.sh that start with VERSION_
|
||||||
@@ -221,12 +232,9 @@ set(SERVICES_BINARY "$<TARGET_FILE:${PROGRAM_NAME}>")
|
|||||||
cmake_path(GET SERVICES_BINARY FILENAME SERVICES_BINARY)
|
cmake_path(GET SERVICES_BINARY FILENAME SERVICES_BINARY)
|
||||||
|
|
||||||
# At install time, create the following additional directories
|
# At install time, create the following additional directories
|
||||||
file(REAL_PATH ${DATA_DIR} ABSOLUTE_DATA_DIR BASE_DIRECTORY ${CMAKE_INSTALL_PREFIX})
|
install(DIRECTORY DESTINATION "${DATA_DIR}/backups")
|
||||||
file(REAL_PATH ${LOG_DIR} ABSOLUTE_LOG_DIR BASE_DIRECTORY ${CMAKE_INSTALL_PREFIX})
|
|
||||||
install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${ABSOLUTE_DATA_DIR}/backups\")")
|
|
||||||
install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${ABSOLUTE_LOG_DIR}\")")
|
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${ABSOLUTE_DATA_DIR}/runtime\")")
|
install(DIRECTORY DESTINATION "${DATA_DIR}/runtime")
|
||||||
endif()
|
endif()
|
||||||
# On non-Windows platforms, if RUNGROUP is set, change the permissions of the below directories, as well as the group of the data directory
|
# On non-Windows platforms, if RUNGROUP is set, change the permissions of the below directories, as well as the group of the data directory
|
||||||
if(NOT WIN32 AND RUNGROUP)
|
if(NOT WIN32 AND RUNGROUP)
|
||||||
@@ -241,7 +249,6 @@ if(WIN32)
|
|||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
file(REAL_PATH ${MODULE_DIR} ABSOLUTE_MODULE_DIR BASE_DIRECTORY ${CMAKE_INSTALL_PREFIX})
|
|
||||||
install(CODE "file(REMOVE_RECURSE \"$ENV{DESTDIR}${ABSOLUTE_MODULE_DIR}\")")
|
install(CODE "file(REMOVE_RECURSE \"$ENV{DESTDIR}${ABSOLUTE_MODULE_DIR}\")")
|
||||||
|
|
||||||
# Only process the CPack section if we have CPack
|
# Only process the CPack section if we have CPack
|
||||||
@@ -292,6 +299,7 @@ endif()
|
|||||||
add_subdirectory(data)
|
add_subdirectory(data)
|
||||||
add_subdirectory(docs)
|
add_subdirectory(docs)
|
||||||
add_subdirectory(language)
|
add_subdirectory(language)
|
||||||
|
add_subdirectory(vendor)
|
||||||
add_subdirectory(src)
|
add_subdirectory(src)
|
||||||
add_subdirectory(modules)
|
add_subdirectory(modules)
|
||||||
add_subdirectory(include)
|
add_subdirectory(include)
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# Anope IRC Services <https://www.anope.org/>
|
# Anope IRC Services <https://www.anope.org/>
|
||||||
#
|
#
|
||||||
# Copyright (C) 2003-2025 Anope Contributors
|
# Copyright (C) 2003-2026 Anope Contributors
|
||||||
#
|
#
|
||||||
# Anope is free software. You can use, modify, and/or distribute it under the
|
# Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
# terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
# terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
@@ -29,43 +29,41 @@ Load_Cache () {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Run_Build_System () {
|
Run_Build_System () {
|
||||||
WITH_INST=""
|
BUILD_DIR="${SOURCE_DIR}/build"
|
||||||
WITH_RUN=""
|
CMAKE_COMMAND="${CMAKE:-cmake} -B ${BUILD_DIR} -S ${SOURCE_DIR}"
|
||||||
WITH_PERM=""
|
|
||||||
EXTRA_INCLUDE=""
|
|
||||||
EXTRA_LIBS=""
|
|
||||||
|
|
||||||
if [ "$INSTDIR" != "" ] ; then
|
if [ "$INSTDIR" != "" ] ; then
|
||||||
WITH_INST="-DINSTDIR=$INSTDIR"
|
CMAKE_COMMAND="${CMAKE_COMMAND} -D INSTDIR=$INSTDIR"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$RUNGROUP" != "" ] ; then
|
if [ "$RUNGROUP" != "" ] ; then
|
||||||
WITH_RUN="-DRUNGROUP=$RUNGROUP"
|
CMAKE_COMMAND="${CMAKE_COMMAND} -D RUNGROUP=$RUNGROUP"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$UMASK" != "" ] ; then
|
if [ "$UMASK" != "" ] ; then
|
||||||
WITH_PERM="-DDEFUMASK=$UMASK"
|
CMAKE_COMMAND="${CMAKE_COMMAND} -D DEFUMASK=$UMASK"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$DEBUG" = "yes" ] ; then
|
if [ "$DEBUG" = "yes" ] ; then
|
||||||
BUILD_TYPE="-DCMAKE_BUILD_TYPE=Debug"
|
CMAKE_COMMAND="${CMAKE_COMMAND} -D CMAKE_BUILD_TYPE=Debug"
|
||||||
else
|
else
|
||||||
BUILD_TYPE="-DCMAKE_BUILD_TYPE=Release"
|
CMAKE_COMMAND="${CMAKE_COMMAND} -D CMAKE_BUILD_TYPE=Release"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$EXTRA_INCLUDE_DIRS" != "" ] ; then
|
if [ "$EXTRA_INCLUDE_DIRS" != "" ] ; then
|
||||||
EXTRA_INCLUDE="-DEXTRA_INCLUDE=$EXTRA_INCLUDE_DIRS"
|
CMAKE_COMMAND="${CMAKE_COMMAND} -D EXTRA_INCLUDE=$EXTRA_INCLUDE_DIRS"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$EXTRA_LIB_DIRS" != "" ] ; then
|
if [ "$EXTRA_LIB_DIRS" != "" ] ; then
|
||||||
EXTRA_LIBS="-DEXTRA_LIBS=$EXTRA_LIB_DIRS"
|
CMAKE_COMMAND="${CMAKE_COMMAND} -D EXTRA_LIBS=$EXTRA_LIB_DIRS"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
BUILD_PATHS="-B ${SOURCE_DIR}/build ${SOURCE_DIR}"
|
if [ "$EXTRA_CONFIG_ARGS" != "" ] ; then
|
||||||
|
CMAKE_COMMAND="${CMAKE_COMMAND} $EXTRA_CONFIG_ARGS"
|
||||||
|
fi
|
||||||
|
|
||||||
CMAKE="cmake $GEN_TYPE $WITH_INST $WITH_RUN $WITH_PERM $BUILD_TYPE $EXTRA_INCLUDE $EXTRA_LIBS $EXTRA_CONFIG_ARGS $BUILD_PATHS"
|
echo $CMAKE_COMMAND
|
||||||
echo $CMAKE
|
$CMAKE_COMMAND
|
||||||
$CMAKE
|
|
||||||
|
|
||||||
if [ $? -ne 0 ]; then
|
if [ $? -ne 0 ]; then
|
||||||
echo "You should fix these issues and then run ./Config -quick to rerun CMake."
|
echo "You should fix these issues and then run ./Config -quick to rerun CMake."
|
||||||
@@ -73,11 +71,7 @@ Run_Build_System () {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
if [ "$PWD" = "${SOURCE_DIR}/build" ]; then
|
echo "Now run 'make -C ${BUILD_DIR#"$PWD/"} install' to build and install Anope."
|
||||||
echo "Now run make to build Anope."
|
|
||||||
else
|
|
||||||
echo "Now cd build, then run make to build Anope."
|
|
||||||
fi
|
|
||||||
}
|
}
|
||||||
|
|
||||||
###########################################################################
|
###########################################################################
|
||||||
@@ -98,7 +92,12 @@ CAN_QUICK="no"
|
|||||||
###########################################################################
|
###########################################################################
|
||||||
|
|
||||||
while [ $# -ge 1 ] ; do
|
while [ $# -ge 1 ] ; do
|
||||||
if [ $1 = "--help" ] ; then
|
OPTION=$1
|
||||||
|
while [ "${OPTION#-}" != "$OPTION" ]; do
|
||||||
|
OPTION="${OPTION#-}"
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ "$OPTION" = "--help" ] ; then
|
||||||
echo "Config utility for Anope"
|
echo "Config utility for Anope"
|
||||||
echo "------------------------"
|
echo "------------------------"
|
||||||
echo "Syntax: ./Config [options]"
|
echo "Syntax: ./Config [options]"
|
||||||
@@ -106,15 +105,15 @@ while [ $# -ge 1 ] ; do
|
|||||||
echo "-nointro Skip intro (disclaimer, etc)"
|
echo "-nointro Skip intro (disclaimer, etc)"
|
||||||
echo "-quick Skip questions, go straight to cmake"
|
echo "-quick Skip questions, go straight to cmake"
|
||||||
exit 0
|
exit 0
|
||||||
elif [ $1 = "-devel" ] ; then
|
elif [ "$OPTION" = "devel" ] ; then
|
||||||
DEBUG="yes"
|
DEBUG="yes"
|
||||||
DEVEL="yes"
|
DEVEL="yes"
|
||||||
INSTDIR="$SOURCE_DIR/run"
|
INSTDIR="$SOURCE_DIR/run"
|
||||||
elif [ $1 = "-nocache" ] ; then
|
elif [ "$OPTION" = "nocache" ] ; then
|
||||||
IGNORE_CACHE="1"
|
IGNORE_CACHE="1"
|
||||||
elif [ $1 = "-nointro" ] ; then
|
elif [ "$OPTION" = "nointro" ] ; then
|
||||||
NO_INTRO="1"
|
NO_INTRO="1"
|
||||||
elif [ $1 = "-quick" -o $1 = "-q" ] ; then
|
elif [ "$OPTION" = "quick" -o "$OPTION" = "q" ] ; then
|
||||||
Load_Cache
|
Load_Cache
|
||||||
if [ "$CAN_QUICK" = "yes" ] ; then
|
if [ "$CAN_QUICK" = "yes" ] ; then
|
||||||
Run_Build_System
|
Run_Build_System
|
||||||
|
|||||||
+31
-23
@@ -328,7 +328,7 @@ networkinfo
|
|||||||
*
|
*
|
||||||
* It is recommended you DON'T change this.
|
* It is recommended you DON'T change this.
|
||||||
*/
|
*/
|
||||||
vhost_chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.-/"
|
#vhost_chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.-/"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If enabled, allows vhosts to not contain dots (.).
|
* If enabled, allows vhosts to not contain dots (.).
|
||||||
@@ -1084,6 +1084,34 @@ mail
|
|||||||
* The file that db_atheme will import your main database from.
|
* The file that db_atheme will import your main database from.
|
||||||
*/
|
*/
|
||||||
database = "atheme.db"
|
database = "atheme.db"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If you have custom data in your Atheme database that you want converted
|
||||||
|
* to Anope misc data to be shown with cs_set_misc you can configure that
|
||||||
|
* using one or more cs_set_misc blocks.
|
||||||
|
*/
|
||||||
|
#cs_set_misc
|
||||||
|
{
|
||||||
|
/* The key name used by Atheme. */
|
||||||
|
atheme = "private:misc:data"
|
||||||
|
|
||||||
|
/* The cs_set_misc entry to import into. */
|
||||||
|
anope = "MISC_DATA"
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If you have custom data in your Atheme database that you want converted
|
||||||
|
* to Anope misc data to be shown with ns_set_misc you can configure that
|
||||||
|
* using one or more ns_set_misc blocks.
|
||||||
|
*/
|
||||||
|
#ns_set_misc
|
||||||
|
{
|
||||||
|
/* The key name used by Atheme. */
|
||||||
|
atheme = "private:misc:data"
|
||||||
|
|
||||||
|
/* The ns_set_misc entry to import into. */
|
||||||
|
anope = "MISC_DATA"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -1200,7 +1228,7 @@ module
|
|||||||
* An optional prefix to prepended to the name of each created table.
|
* An optional prefix to prepended to the name of each created table.
|
||||||
* Do not use the same prefix for other programs.
|
* Do not use the same prefix for other programs.
|
||||||
*/
|
*/
|
||||||
#prefix = "anope_db_"
|
#prefix = "anope21_"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Whether or not to import data from another database module in to SQL on
|
* Whether or not to import data from another database module in to SQL on
|
||||||
@@ -1220,26 +1248,6 @@ module
|
|||||||
import = no
|
import = no
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* db_redis.
|
|
||||||
*
|
|
||||||
* This module allows using Redis (https://redis.io/) as a database backend.
|
|
||||||
* This module requires that redis is loaded and configured properly.
|
|
||||||
*
|
|
||||||
* Redis 2.8 supports keyspace notifications which allows Redis to push notifications
|
|
||||||
* to Anope about outside modifications to the database. This module supports this and
|
|
||||||
* will internally reflect any changes made to the database immediately once notified.
|
|
||||||
* See docs/REDIS for more information regarding this.
|
|
||||||
*/
|
|
||||||
#module
|
|
||||||
{
|
|
||||||
name = "db_redis"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Redis database to use. This must be configured with redis.
|
|
||||||
*/
|
|
||||||
engine = "redis/main"
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* [RECOMMENDED] Encryption modules.
|
* [RECOMMENDED] Encryption modules.
|
||||||
@@ -1288,7 +1296,7 @@ module
|
|||||||
/** The memory hardness in kibibytes of the Argon2 algorithm. Defaults to
|
/** The memory hardness in kibibytes of the Argon2 algorithm. Defaults to
|
||||||
* 128 mebibytes.
|
* 128 mebibytes.
|
||||||
*/
|
*/
|
||||||
#memory_cost = 121072
|
#memory_cost = 131072
|
||||||
|
|
||||||
/** The time hardness (iterations) of the Argon2 algorithm. Defaults to 3.
|
/** The time hardness (iterations) of the Argon2 algorithm. Defaults to 3.
|
||||||
*/
|
*/
|
||||||
|
|||||||
+84
-81
@@ -148,7 +148,7 @@ module
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/* Give it a help command. */
|
/* Give it a help command. */
|
||||||
command { service = "BotServ"; name = "HELP"; command = "generic/help"; }
|
command { service = "BotServ"; name = "HELP"; command = "generic/help" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* bs_assign
|
* bs_assign
|
||||||
@@ -161,9 +161,9 @@ command { service = "BotServ"; name = "HELP"; command = "generic/help"; }
|
|||||||
* Used for assigning and unassigning bots to channels.
|
* Used for assigning and unassigning bots to channels.
|
||||||
*/
|
*/
|
||||||
module { name = "bs_assign" }
|
module { name = "bs_assign" }
|
||||||
command { service = "BotServ"; name = "ASSIGN"; command = "botserv/assign"; }
|
command { service = "BotServ"; name = "ASSIGN"; command = "botserv/assign" }
|
||||||
command { service = "BotServ"; name = "UNASSIGN"; command = "botserv/unassign"; }
|
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 = "SET NOBOT"; command = "botserv/set/nobot"; permission = "botserv/set/nobot" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* bs_autoassign
|
* bs_autoassign
|
||||||
@@ -203,7 +203,7 @@ module
|
|||||||
*/
|
*/
|
||||||
#casesensitive = yes
|
#casesensitive = yes
|
||||||
}
|
}
|
||||||
command { service = "BotServ"; name = "BADWORDS"; command = "botserv/badwords"; }
|
command { service = "BotServ"; name = "BADWORDS"; command = "botserv/badwords" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* bs_bot
|
* bs_bot
|
||||||
@@ -213,7 +213,7 @@ command { service = "BotServ"; name = "BADWORDS"; command = "botserv/badwords";
|
|||||||
* Used for administrating BotServ bots.
|
* Used for administrating BotServ bots.
|
||||||
*/
|
*/
|
||||||
module { name = "bs_bot" }
|
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
|
* bs_botlist
|
||||||
@@ -223,7 +223,7 @@ command { service = "BotServ"; name = "BOT"; command = "botserv/bot"; permission
|
|||||||
* Used for listing all available bots.
|
* Used for listing all available bots.
|
||||||
*/
|
*/
|
||||||
module { name = "bs_botlist" }
|
module { name = "bs_botlist" }
|
||||||
command { service = "BotServ"; name = "BOTLIST"; command = "botserv/botlist"; }
|
command { service = "BotServ"; name = "BOTLIST"; command = "botserv/botlist" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* bs_control
|
* bs_control
|
||||||
@@ -233,8 +233,8 @@ command { service = "BotServ"; name = "BOTLIST"; command = "botserv/botlist"; }
|
|||||||
* Used for making the bot message a channel.
|
* Used for making the bot message a channel.
|
||||||
*/
|
*/
|
||||||
module { name = "bs_control" }
|
module { name = "bs_control" }
|
||||||
command { service = "BotServ"; name = "ACT"; command = "botserv/act"; }
|
command { service = "BotServ"; name = "ACT"; command = "botserv/act" }
|
||||||
command { service = "BotServ"; name = "SAY"; command = "botserv/say"; }
|
command { service = "BotServ"; name = "SAY"; command = "botserv/say" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* bs_info
|
* bs_info
|
||||||
@@ -244,7 +244,7 @@ command { service = "BotServ"; name = "SAY"; command = "botserv/say"; }
|
|||||||
* Used for getting information on bots or channels.
|
* Used for getting information on bots or channels.
|
||||||
*/
|
*/
|
||||||
module { name = "bs_info" }
|
module { name = "bs_info" }
|
||||||
command { service = "BotServ"; name = "INFO"; command = "botserv/info"; }
|
command { service = "BotServ"; name = "INFO"; command = "botserv/info" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* bs_kick
|
* bs_kick
|
||||||
@@ -285,19 +285,19 @@ module
|
|||||||
*/
|
*/
|
||||||
gentlebadwordreason = yes
|
gentlebadwordreason = yes
|
||||||
}
|
}
|
||||||
command { service = "BotServ"; name = "KICK"; command = "botserv/kick"; }
|
command { service = "BotServ"; name = "KICK"; command = "botserv/kick" }
|
||||||
command { service = "BotServ"; name = "KICK AMSG"; command = "botserv/kick/amsg"; }
|
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 BADWORDS"; command = "botserv/kick/badwords" }
|
||||||
command { service = "BotServ"; name = "KICK BOLDS"; command = "botserv/kick/bolds"; }
|
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 CAPS"; command = "botserv/kick/caps" }
|
||||||
command { service = "BotServ"; name = "KICK COLORS"; command = "botserv/kick/colors"; }
|
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 FLOOD"; command = "botserv/kick/flood" }
|
||||||
command { service = "BotServ"; name = "KICK ITALICS"; command = "botserv/kick/italics"; }
|
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 REPEAT"; command = "botserv/kick/repeat" }
|
||||||
command { service = "BotServ"; name = "KICK REVERSES"; command = "botserv/kick/reverses"; }
|
command { service = "BotServ"; name = "KICK REVERSES"; command = "botserv/kick/reverses" }
|
||||||
command { service = "BotServ"; name = "KICK UNDERLINES"; command = "botserv/kick/underlines"; }
|
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 DONTKICKOPS"; command = "botserv/set/dontkickops" }
|
||||||
command { service = "BotServ"; name = "SET DONTKICKVOICES"; command = "botserv/set/dontkickvoices"; }
|
command { service = "BotServ"; name = "SET DONTKICKVOICES"; command = "botserv/set/dontkickvoices" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* bs_set
|
* 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.
|
* botserv/set/private - Used to prohibit specific BotServ bots from being assigned to channels.
|
||||||
*/
|
*/
|
||||||
module { name = "bs_set" }
|
module { name = "bs_set" }
|
||||||
command { service = "BotServ"; name = "SET"; command = "botserv/set"; }
|
command { service = "BotServ"; name = "SET"; command = "botserv/set" }
|
||||||
command { service = "BotServ"; name = "SET BANEXPIRE"; command = "botserv/set/banexpire"; }
|
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 PRIVATE"; command = "botserv/set/private"; permission = "botserv/set/private" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* greet
|
* 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.
|
* nickserv/set/greet, nickserv/saset/greet - Used for changing a users greet message, which is displayed when they enter channels.
|
||||||
*/
|
*/
|
||||||
module { name = "greet" }
|
module { name = "greet" }
|
||||||
command { service = "BotServ"; name = "SET GREET"; command = "botserv/set/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 = "SET GREET"; command = "nickserv/set/greet" }
|
||||||
command { service = "NickServ"; name = "SASET GREET"; command = "nickserv/saset/greet"; permission = "nickserv/saset/greet"; }
|
command { service = "NickServ"; name = "SASET GREET"; command = "nickserv/saset/greet"; permission = "nickserv/saset/greet" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* GREET privilege.
|
* GREET privilege.
|
||||||
@@ -352,63 +352,66 @@ module
|
|||||||
name = "fantasy"
|
name = "fantasy"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Defines the prefixes for fantasy commands in channels. One of these characters will have to be prepended
|
* Defines the prefixes for fantasy commands in channels. One of these will
|
||||||
* to all fantasy commands. If you choose "!", for example, fantasy commands will be "!kick",
|
* have to be prepended to all fantasy commands. For example, If you choose
|
||||||
* "!op", etc. This directive is optional, if left out, the default fantasy character is "!".
|
* "! ?" as your prefix fantasy commands will be "!kick", "?op", etc.
|
||||||
|
*
|
||||||
|
* This directive is optional, it defaults to "!" if not set.
|
||||||
*/
|
*/
|
||||||
#fantasycharacter = "!."
|
#prefix = "! ?"
|
||||||
}
|
}
|
||||||
command { service = "BotServ"; name = "SET FANTASY"; command = "botserv/set/fantasy"; }
|
command { service = "BotServ"; name = "SET FANTASY"; command = "botserv/set/fantasy" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Fantasy commands
|
* Fantasy commands
|
||||||
*
|
*
|
||||||
* Fantasy commands can be executed in channels that have a BotServ bot by prefixing the
|
* Fantasy commands can be executed in channels that have a BotServ bot assigned
|
||||||
* command with one of the fantasy characters configured in botserv's fantasycharacter
|
* by prefixing the command with one of the fantasy characters configured in the
|
||||||
* directive.
|
* {botserv}:prefix directive.
|
||||||
*
|
*
|
||||||
* Sane defaults are provided below that do not need to be edited unless you wish to change the default behavior.
|
* Sane defaults are provided below that do not need to be edited unless you
|
||||||
|
* wish to change the default behavior.
|
||||||
*/
|
*/
|
||||||
fantasy { name = "ACCESS"; command = "chanserv/access"; }
|
fantasy { name = "ACCESS"; command = "chanserv/access" }
|
||||||
fantasy { name = "AKICK"; command = "chanserv/akick"; }
|
fantasy { name = "AKICK"; command = "chanserv/akick" }
|
||||||
fantasy { name = "AOP"; command = "chanserv/xop"; }
|
fantasy { name = "AOP"; command = "chanserv/xop" }
|
||||||
fantasy { name = "BAN"; command = "chanserv/ban"; }
|
fantasy { name = "BAN"; command = "chanserv/ban" }
|
||||||
fantasy { name = "CLONE"; command = "chanserv/clone"; }
|
fantasy { name = "CLONE"; command = "chanserv/clone" }
|
||||||
fantasy { name = "DEHALFOP"; command = "chanserv/modes"; }
|
fantasy { name = "DEHALFOP"; command = "chanserv/modes" }
|
||||||
fantasy { name = "DEOP"; command = "chanserv/modes"; }
|
fantasy { name = "DEOP"; command = "chanserv/modes" }
|
||||||
fantasy { name = "DEOWNER"; command = "chanserv/modes"; }
|
fantasy { name = "DEOWNER"; command = "chanserv/modes" }
|
||||||
fantasy { name = "DEPROTECT"; command = "chanserv/modes"; }
|
fantasy { name = "DEPROTECT"; command = "chanserv/modes" }
|
||||||
fantasy { name = "DEVOICE"; command = "chanserv/modes"; }
|
fantasy { name = "DEVOICE"; command = "chanserv/modes" }
|
||||||
fantasy { name = "DOWN"; command = "chanserv/down"; }
|
fantasy { name = "DOWN"; command = "chanserv/down" }
|
||||||
fantasy { name = "ENFORCE"; command = "chanserv/enforce"; }
|
fantasy { name = "ENFORCE"; command = "chanserv/enforce" }
|
||||||
fantasy { name = "ENTRYMSG"; command = "chanserv/entrymsg"; }
|
fantasy { name = "ENTRYMSG"; command = "chanserv/entrymsg" }
|
||||||
fantasy { name = "FLAGS"; command = "chanserv/flags"; }
|
fantasy { name = "FLAGS"; command = "chanserv/flags" }
|
||||||
fantasy { name = "HALFOP"; command = "chanserv/modes"; }
|
fantasy { name = "HALFOP"; command = "chanserv/modes" }
|
||||||
fantasy { name = "HELP"; command = "generic/help"; prepend_channel = no; require_privilege = no; }
|
fantasy { name = "HELP"; command = "generic/help"; prepend_channel = no; require_privilege = no }
|
||||||
fantasy { name = "HOP"; command = "chanserv/xop"; }
|
fantasy { name = "HOP"; command = "chanserv/xop" }
|
||||||
fantasy { name = "INFO"; command = "chanserv/info"; prepend_channel = no; }
|
fantasy { name = "INFO"; command = "chanserv/info"; prepend_channel = no }
|
||||||
fantasy { name = "INVITE"; command = "chanserv/invite"; }
|
fantasy { name = "INVITE"; command = "chanserv/invite" }
|
||||||
fantasy { name = "K"; command = "chanserv/kick"; }
|
fantasy { name = "K"; command = "chanserv/kick" }
|
||||||
fantasy { name = "KB"; command = "chanserv/ban"; }
|
fantasy { name = "KB"; command = "chanserv/ban" }
|
||||||
fantasy { name = "KICK"; command = "chanserv/kick"; }
|
fantasy { name = "KICK"; command = "chanserv/kick" }
|
||||||
fantasy { name = "LEVELS"; command = "chanserv/levels"; }
|
fantasy { name = "LEVELS"; command = "chanserv/levels" }
|
||||||
fantasy { name = "LIST"; command = "chanserv/list"; prepend_channel = no; }
|
fantasy { name = "LIST"; command = "chanserv/list"; prepend_channel = no }
|
||||||
fantasy { name = "LOG"; command = "chanserv/log"; }
|
fantasy { name = "LOG"; command = "chanserv/log" }
|
||||||
fantasy { name = "MODE"; command = "chanserv/mode"; }
|
fantasy { name = "MODE"; command = "chanserv/mode" }
|
||||||
fantasy { name = "MUTE"; command = "chanserv/ban"; kick = no; mode = "QUIET"; }
|
fantasy { name = "MUTE"; command = "chanserv/ban"; kick = no; mode = "QUIET" }
|
||||||
fantasy { name = "OP"; command = "chanserv/modes"; }
|
fantasy { name = "OP"; command = "chanserv/modes" }
|
||||||
fantasy { name = "OWNER"; command = "chanserv/modes"; }
|
fantasy { name = "OWNER"; command = "chanserv/modes" }
|
||||||
fantasy { name = "PROTECT"; command = "chanserv/modes"; }
|
fantasy { name = "PROTECT"; command = "chanserv/modes" }
|
||||||
fantasy { name = "QOP"; command = "chanserv/xop"; }
|
fantasy { name = "QOP"; command = "chanserv/xop" }
|
||||||
fantasy { name = "SEEN"; command = "chanserv/seen"; prepend_channel = no; }
|
fantasy { name = "SEEN"; command = "chanserv/seen"; prepend_channel = no }
|
||||||
fantasy { name = "SOP"; command = "chanserv/xop"; }
|
fantasy { name = "SOP"; command = "chanserv/xop" }
|
||||||
fantasy { name = "STATUS"; command = "chanserv/status"; }
|
fantasy { name = "STATUS"; command = "chanserv/status" }
|
||||||
fantasy { name = "SUSPEND"; command = "chanserv/suspend"; permission = "chanserv/suspend"; }
|
fantasy { name = "SUSPEND"; command = "chanserv/suspend"; permission = "chanserv/suspend" }
|
||||||
fantasy { name = "SYNC"; command = "chanserv/sync"; }
|
fantasy { name = "SYNC"; command = "chanserv/sync" }
|
||||||
fantasy { name = "TOPIC"; command = "chanserv/topic"; }
|
fantasy { name = "TOPIC"; command = "chanserv/topic" }
|
||||||
fantasy { name = "UNBAN"; command = "chanserv/unban"; }
|
fantasy { name = "UNBAN"; command = "chanserv/unban" }
|
||||||
fantasy { name = "UNMUTE"; command = "chanserv/unban"; mode = "QUIET"; }
|
fantasy { name = "UNMUTE"; command = "chanserv/unban"; mode = "QUIET" }
|
||||||
fantasy { name = "UNSUSPEND"; command = "chanserv/unsuspend"; permission = "chanserv/suspend"; }
|
fantasy { name = "UNSUSPEND"; command = "chanserv/unsuspend"; permission = "chanserv/suspend" }
|
||||||
fantasy { name = "UP"; command = "chanserv/up"; }
|
fantasy { name = "UP"; command = "chanserv/up" }
|
||||||
fantasy { name = "VOICE"; command = "chanserv/modes"; }
|
fantasy { name = "VOICE"; command = "chanserv/modes" }
|
||||||
fantasy { name = "VOP"; command = "chanserv/xop"; }
|
fantasy { name = "VOP"; command = "chanserv/xop" }
|
||||||
|
|||||||
+76
-55
@@ -119,7 +119,7 @@ module
|
|||||||
/*
|
/*
|
||||||
* The length of time before a channel registration expires.
|
* The length of time before a channel registration expires.
|
||||||
*
|
*
|
||||||
* This directive is optional. If not set, the default is never.
|
* This directive is optional. If not set, the default is 30 days.
|
||||||
*/
|
*/
|
||||||
#expire = 90d
|
#expire = 90d
|
||||||
|
|
||||||
@@ -179,6 +179,12 @@ module
|
|||||||
*/
|
*/
|
||||||
disallow_channel_access = no
|
disallow_channel_access = no
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If set, prevents malformed hostmasks from being added to access lists
|
||||||
|
* instead of attempting to fix their format.
|
||||||
|
*/
|
||||||
|
#disallow_malformed_hostmask = yes
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If set, ChanServ will always lower the timestamp of registered channels to their registration date.
|
* If set, ChanServ will always lower the timestamp of registered channels to their registration date.
|
||||||
* This prevents several race conditions where unauthorized users can join empty registered channels and set
|
* This prevents several race conditions where unauthorized users can join empty registered channels and set
|
||||||
@@ -246,6 +252,7 @@ privilege
|
|||||||
rank = 10
|
rank = 10
|
||||||
level = 3
|
level = 3
|
||||||
flag = "f"
|
flag = "f"
|
||||||
|
flag_migration_requires = "ACCESS_CHANGE"
|
||||||
xop = "VOP"
|
xop = "VOP"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -490,6 +497,7 @@ privilege
|
|||||||
rank = 110
|
rank = 110
|
||||||
level = 4
|
level = 4
|
||||||
flag = "h"
|
flag = "h"
|
||||||
|
flag_migration_requires = "HALFOP"
|
||||||
xop = "HOP"
|
xop = "HOP"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -632,6 +640,7 @@ privilege
|
|||||||
rank = 220
|
rank = 220
|
||||||
level = 5
|
level = 5
|
||||||
flag = "o"
|
flag = "o"
|
||||||
|
flag_migration_requires = "OP"
|
||||||
xop = "AOP"
|
xop = "AOP"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -704,6 +713,7 @@ privilege
|
|||||||
rank = 300
|
rank = 300
|
||||||
level = 10
|
level = 10
|
||||||
flag = "a"
|
flag = "a"
|
||||||
|
flag_migration_requires = "PROTECT"
|
||||||
xop = "SOP"
|
xop = "SOP"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -847,6 +857,7 @@ privilege
|
|||||||
rank = 60
|
rank = 60
|
||||||
level = 3
|
level = 3
|
||||||
flag = "v"
|
flag = "v"
|
||||||
|
flag_migration_requires = "VOICE"
|
||||||
xop = "VOP"
|
xop = "VOP"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -891,7 +902,7 @@ command_group
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Give it a help command. */
|
/* Give it a help command. */
|
||||||
command { service = "ChanServ"; name = "HELP"; command = "generic/help"; }
|
command { service = "ChanServ"; name = "HELP"; command = "generic/help" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* cs_access
|
* cs_access
|
||||||
@@ -907,8 +918,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.
|
* entry by the other access system, which could be an XOP command name, or a set of flags.
|
||||||
*/
|
*/
|
||||||
module { name = "cs_access" }
|
module { name = "cs_access" }
|
||||||
command { service = "ChanServ"; name = "ACCESS"; command = "chanserv/access"; 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"; }
|
command { service = "ChanServ"; name = "LEVELS"; command = "chanserv/levels"; group = "chanserv/access" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* cs_akick
|
* cs_akick
|
||||||
@@ -931,7 +942,7 @@ module
|
|||||||
*/
|
*/
|
||||||
autokickreason = "User has been banned from the channel"
|
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
|
* cs_ban
|
||||||
@@ -947,7 +958,7 @@ command { service = "ChanServ"; name = "AKICK"; command = "chanserv/akick"; grou
|
|||||||
* Used for banning users from channels.
|
* Used for banning users from channels.
|
||||||
*/
|
*/
|
||||||
module { name = "cs_ban" }
|
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
|
* cs_clone
|
||||||
@@ -957,7 +968,7 @@ command { service = "ChanServ"; name = "BAN"; command = "chanserv/ban"; group =
|
|||||||
* Used for copying channel settings from one channel to another.
|
* Used for copying channel settings from one channel to another.
|
||||||
*/
|
*/
|
||||||
module { name = "cs_clone" }
|
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
|
* cs_drop
|
||||||
@@ -967,7 +978,7 @@ command { service = "ChanServ"; name = "CLONE"; command = "chanserv/clone"; grou
|
|||||||
* Used for unregistering channels.
|
* Used for unregistering channels.
|
||||||
*/
|
*/
|
||||||
module { name = "cs_drop" }
|
module { name = "cs_drop" }
|
||||||
command { service = "ChanServ"; name = "DROP"; command = "chanserv/drop"; }
|
command { service = "ChanServ"; name = "DROP"; command = "chanserv/drop" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* cs_enforce
|
* cs_enforce
|
||||||
@@ -977,7 +988,7 @@ command { service = "ChanServ"; name = "DROP"; command = "chanserv/drop"; }
|
|||||||
* Used to enforce various channel settings such as secureops and restricted.
|
* Used to enforce various channel settings such as secureops and restricted.
|
||||||
*/
|
*/
|
||||||
module { name = "cs_enforce" }
|
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
|
* cs_entrymsg
|
||||||
@@ -1005,7 +1016,7 @@ module
|
|||||||
*/
|
*/
|
||||||
#timestamp = no
|
#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
|
* cs_flags
|
||||||
@@ -1020,7 +1031,7 @@ command { service = "ChanServ"; name = "ENTRYMSG"; command = "chanserv/entrymsg"
|
|||||||
* privilege set granted by the access entry.
|
* privilege set granted by the access entry.
|
||||||
*/
|
*/
|
||||||
module { name = "cs_flags" }
|
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
|
* cs_getkey
|
||||||
@@ -1030,7 +1041,7 @@ command { service = "ChanServ"; name = "FLAGS"; command = "chanserv/flags"; grou
|
|||||||
* Used for getting the key for channels.
|
* Used for getting the key for channels.
|
||||||
*/
|
*/
|
||||||
module { name = "cs_getkey" }
|
module { name = "cs_getkey" }
|
||||||
command { service = "ChanServ"; name = "GETKEY"; command = "chanserv/getkey"; }
|
command { service = "ChanServ"; name = "GETKEY"; command = "chanserv/getkey" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* cs_info
|
* cs_info
|
||||||
@@ -1040,7 +1051,7 @@ command { service = "ChanServ"; name = "GETKEY"; command = "chanserv/getkey"; }
|
|||||||
* Used for getting information about channels.
|
* Used for getting information about channels.
|
||||||
*/
|
*/
|
||||||
module { name = "cs_info" }
|
module { name = "cs_info" }
|
||||||
command { service = "ChanServ"; name = "INFO"; command = "chanserv/info"; }
|
command { service = "ChanServ"; name = "INFO"; command = "chanserv/info" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* cs_invite
|
* cs_invite
|
||||||
@@ -1050,7 +1061,7 @@ command { service = "ChanServ"; name = "INFO"; command = "chanserv/info"; }
|
|||||||
* Used for inviting yourself in to channels.
|
* Used for inviting yourself in to channels.
|
||||||
*/
|
*/
|
||||||
module { name = "cs_invite" }
|
module { name = "cs_invite" }
|
||||||
command { service = "ChanServ"; name = "INVITE"; command = "chanserv/invite"; }
|
command { service = "ChanServ"; name = "INVITE"; command = "chanserv/invite" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* cs_kick
|
* cs_kick
|
||||||
@@ -1060,7 +1071,7 @@ command { service = "ChanServ"; name = "INVITE"; command = "chanserv/invite"; }
|
|||||||
* Used for kicking users from channels.
|
* Used for kicking users from channels.
|
||||||
*/
|
*/
|
||||||
module { name = "cs_kick" }
|
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
|
* cs_list
|
||||||
@@ -1078,8 +1089,8 @@ module
|
|||||||
*/
|
*/
|
||||||
listmax = 50
|
listmax = 50
|
||||||
}
|
}
|
||||||
command { service = "ChanServ"; name = "LIST"; command = "chanserv/list"; }
|
command { service = "ChanServ"; name = "LIST"; command = "chanserv/list" }
|
||||||
command { service = "ChanServ"; name = "SET PRIVATE"; command = "chanserv/set/private"; }
|
command { service = "ChanServ"; name = "SET PRIVATE"; command = "chanserv/set/private" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* cs_log
|
* cs_log
|
||||||
@@ -1120,7 +1131,7 @@ module
|
|||||||
method = "MESSAGE @"
|
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
|
* cs_mode
|
||||||
@@ -1149,7 +1160,7 @@ module
|
|||||||
*/
|
*/
|
||||||
max = 50
|
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 = "OWNER"; command = "chanserv/modes"; group = "chanserv/status"; set = "OWNER" }
|
||||||
command { service = "ChanServ"; name = "DEOWNER"; command = "chanserv/modes"; group = "chanserv/status"; unset = "OWNER" }
|
command { service = "ChanServ"; name = "DEOWNER"; command = "chanserv/modes"; group = "chanserv/status"; unset = "OWNER" }
|
||||||
@@ -1174,7 +1185,7 @@ command { service = "ChanServ"; name = "DEVOICE"; command = "chanserv/modes"; gr
|
|||||||
* Used for registering channels.
|
* Used for registering channels.
|
||||||
*/
|
*/
|
||||||
module { name = "cs_register" }
|
module { name = "cs_register" }
|
||||||
command { service = "ChanServ"; name = "REGISTER"; command = "chanserv/register"; }
|
command { service = "ChanServ"; name = "REGISTER"; command = "chanserv/register" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* cs_seen
|
* cs_seen
|
||||||
@@ -1191,7 +1202,7 @@ module
|
|||||||
/* Sets the time to keep seen entries in the seen database. */
|
/* Sets the time to keep seen entries in the seen database. */
|
||||||
purgetime = 90d
|
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
|
* cs_set
|
||||||
@@ -1237,33 +1248,43 @@ module
|
|||||||
*/
|
*/
|
||||||
persist_lower_ts = yes
|
persist_lower_ts = yes
|
||||||
}
|
}
|
||||||
command { service = "ChanServ"; name = "SET"; command = "chanserv/set"; group = "chanserv/management"; }
|
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 AUTOOP"; command = "chanserv/set/autoop" }
|
||||||
command { service = "ChanServ"; name = "SET BANTYPE"; command = "chanserv/set/bantype"; }
|
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 DESCRIPTION"; command = "chanserv/set/description" }
|
||||||
command { service = "ChanServ"; name = "SET DESC"; command = "chanserv/set/description"; hide = yes; }
|
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 FOUNDER"; command = "chanserv/set/founder" }
|
||||||
command { service = "ChanServ"; name = "SET KEEPMODES"; command = "chanserv/set/keepmodes"; }
|
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 NOEXPIRE"; command = "chanserv/saset/noexpire"; permission = "chanserv/saset/noexpire" }
|
||||||
command { service = "ChanServ"; name = "SET PEACE"; command = "chanserv/set/peace"; }
|
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 PERSIST"; command = "chanserv/set/persist" }
|
||||||
command { service = "ChanServ"; name = "SET RESTRICTED"; command = "chanserv/set/restricted"; }
|
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 SECUREFOUNDER"; command = "chanserv/set/securefounder" }
|
||||||
command { service = "ChanServ"; name = "SET SECUREOPS"; command = "chanserv/set/secureops"; }
|
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 SIGNKICK"; command = "chanserv/set/signkick" }
|
||||||
command { service = "ChanServ"; name = "SET SUCCESSOR"; command = "chanserv/set/successor"; }
|
command { service = "ChanServ"; name = "SET SUCCESSOR"; command = "chanserv/set/successor" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* cs_set_misc
|
* cs_set_misc
|
||||||
*
|
*
|
||||||
* Provides the command chanserv/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.
|
* Allows you to create arbitrary commands to set data, and have that data show
|
||||||
* A field named misc_description may be given for use with help output.
|
* 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" }
|
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 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"); }
|
#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
|
* cs_status
|
||||||
@@ -1274,8 +1295,8 @@ command { service = "ChanServ"; name = "SET EMAIL"; command = "chanserv/set/misc
|
|||||||
* or not they match any autokick entries.
|
* or not they match any autokick entries.
|
||||||
*/
|
*/
|
||||||
module { name = "cs_status" }
|
module { name = "cs_status" }
|
||||||
command { service = "ChanServ"; name = "STATUS"; command = "chanserv/status"; }
|
command { service = "ChanServ"; name = "STATUS"; command = "chanserv/status" }
|
||||||
command { service = "ChanServ"; name = "WHY"; command = "chanserv/status"; hide = yes; }
|
command { service = "ChanServ"; name = "WHY"; command = "chanserv/status"; hide = yes }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* cs_statusupdate
|
* cs_statusupdate
|
||||||
@@ -1311,8 +1332,8 @@ module
|
|||||||
*/
|
*/
|
||||||
show = "suspended, by, reason, on, expires"
|
show = "suspended, by, reason, on, expires"
|
||||||
}
|
}
|
||||||
command { service = "ChanServ"; name = "SUSPEND"; command = "chanserv/suspend"; 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"; }
|
command { service = "ChanServ"; name = "UNSUSPEND"; command = "chanserv/unsuspend"; permission = "chanserv/suspend"; group = "chanserv/admin" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* cs_sync
|
* cs_sync
|
||||||
@@ -1322,7 +1343,7 @@ command { service = "ChanServ"; name = "UNSUSPEND"; command = "chanserv/unsuspen
|
|||||||
* Used to sync users channel status modes with what access they have.
|
* Used to sync users channel status modes with what access they have.
|
||||||
*/
|
*/
|
||||||
module { name = "cs_sync" }
|
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
|
* cs_topic
|
||||||
@@ -1333,8 +1354,8 @@ command { service = "ChanServ"; name = "SYNC"; command = "chanserv/sync"; group
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
module { name = "cs_topic" }
|
module { name = "cs_topic" }
|
||||||
command { service = "ChanServ"; name = "TOPIC"; command = "chanserv/topic"; group = "chanserv/management"; }
|
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 = "SET KEEPTOPIC"; command = "chanserv/set/keeptopic" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* cs_unban
|
* cs_unban
|
||||||
@@ -1344,7 +1365,7 @@ command { service = "ChanServ"; name = "SET KEEPTOPIC"; command = "chanserv/set/
|
|||||||
* Used for unbanning users from channels.
|
* Used for unbanning users from channels.
|
||||||
*/
|
*/
|
||||||
module { name = "cs_unban" }
|
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
|
* cs_updown
|
||||||
@@ -1354,8 +1375,8 @@ command { service = "ChanServ"; name = "UNBAN"; command = "chanserv/unban"; grou
|
|||||||
* Used for setting or removing your status modes on a channel.
|
* Used for setting or removing your status modes on a channel.
|
||||||
*/
|
*/
|
||||||
module { name = "cs_updown" }
|
module { name = "cs_updown" }
|
||||||
command { service = "ChanServ"; name = "DOWN"; command = "chanserv/down"; 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"; }
|
command { service = "ChanServ"; name = "UP"; command = "chanserv/up"; group = "chanserv/status" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* cs_xop
|
* cs_xop
|
||||||
@@ -1372,8 +1393,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.
|
* can not view the entire access list at once, and instead should use another access system to do that.
|
||||||
*/
|
*/
|
||||||
module { name = "cs_xop" }
|
module { name = "cs_xop" }
|
||||||
command { service = "ChanServ"; name = "QOP"; 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 = "SOP"; command = "chanserv/xop"; group = "chanserv/access" }
|
||||||
command { service = "ChanServ"; name = "AOP"; 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 = "HOP"; command = "chanserv/xop"; group = "chanserv/access" }
|
||||||
command { service = "ChanServ"; name = "VOP"; command = "chanserv/xop"; group = "chanserv/access"; }
|
command { service = "ChanServ"; name = "VOP"; command = "chanserv/xop"; group = "chanserv/access" }
|
||||||
|
|||||||
+16
-16
@@ -22,28 +22,28 @@ module
|
|||||||
* An optional prefix to prepended to the name of each created table.
|
* An optional prefix to prepended to the name of each created table.
|
||||||
* Do not use the same prefix for other programs.
|
* Do not use the same prefix for other programs.
|
||||||
*/
|
*/
|
||||||
prefix = "anope_"
|
#prefix = "chanstats21_"
|
||||||
|
|
||||||
smileyshappy = ":) :-) ;) ;-) :D :-D :P :-P"
|
smileyshappy = ":) :-) ;) ;-) :D :-D :P :-P"
|
||||||
smileyssad = ":( :-( ;( ;-("
|
smileyssad = ":( :-( ;( ;-("
|
||||||
smileysother = ":/ :-/"
|
smileysother = ":/ :-/"
|
||||||
}
|
}
|
||||||
command { service = "ChanServ"; name = "SET CHANSTATS"; command = "chanserv/set/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 = "SET CHANSTATS"; command = "nickserv/set/chanstats" }
|
||||||
command { service = "NickServ"; name = "SASET CHANSTATS"; command = "nickserv/saset/chanstats"; permission = "nickserv/saset/chanstats"; }
|
command { service = "NickServ"; name = "SASET CHANSTATS"; command = "nickserv/saset/chanstats"; permission = "nickserv/saset/chanstats" }
|
||||||
|
|
||||||
module { name = "cs_fantasy_stats" }
|
module { name = "cs_fantasy_stats" }
|
||||||
command { service = "ChanServ"; name = "STATS"; command = "chanserv/stats"; }
|
command { service = "ChanServ"; name = "STATS"; command = "chanserv/stats" }
|
||||||
command { service = "ChanServ"; name = "GSTATS"; command = "chanserv/gstats"; }
|
command { service = "ChanServ"; name = "GSTATS"; command = "chanserv/gstats" }
|
||||||
fantasy { name = "STATS"; command = "chanserv/stats"; }
|
fantasy { name = "STATS"; command = "chanserv/stats" }
|
||||||
fantasy { name = "GSTATS"; command = "chanserv/gstats"; }
|
fantasy { name = "GSTATS"; command = "chanserv/gstats" }
|
||||||
|
|
||||||
module { name = "cs_fantasy_top" }
|
module { name = "cs_fantasy_top" }
|
||||||
command { service = "ChanServ"; name = "TOP"; command = "chanserv/top"; }
|
command { service = "ChanServ"; name = "TOP"; command = "chanserv/top" }
|
||||||
command { service = "ChanServ"; name = "TOP10"; command = "chanserv/top10"; }
|
command { service = "ChanServ"; name = "TOP10"; command = "chanserv/top10" }
|
||||||
command { service = "ChanServ"; name = "GTOP"; command = "chanserv/gtop"; }
|
command { service = "ChanServ"; name = "GTOP"; command = "chanserv/gtop" }
|
||||||
command { service = "ChanServ"; name = "GTOP10"; command = "chanserv/gtop10"; }
|
command { service = "ChanServ"; name = "GTOP10"; command = "chanserv/gtop10" }
|
||||||
fantasy { name = "TOP"; command = "chanserv/top"; }
|
fantasy { name = "TOP"; command = "chanserv/top" }
|
||||||
fantasy { name = "TOP10"; command = "chanserv/top10"; }
|
fantasy { name = "TOP10"; command = "chanserv/top10" }
|
||||||
fantasy { name = "GTOP"; command = "chanserv/gtop"; }
|
fantasy { name = "GTOP"; command = "chanserv/gtop" }
|
||||||
fantasy { name = "GTOP10"; command = "chanserv/gtop10"; }
|
fantasy { name = "GTOP10"; command = "chanserv/gtop10" }
|
||||||
|
|||||||
@@ -113,7 +113,7 @@ module
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/* Give it a help command. */
|
/* Give it a help command. */
|
||||||
command { service = "Global"; name = "HELP"; command = "generic/help"; }
|
command { service = "Global"; name = "HELP"; command = "generic/help" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* gl_global
|
* gl_global
|
||||||
@@ -123,7 +123,7 @@ command { service = "Global"; name = "HELP"; command = "generic/help"; }
|
|||||||
* Used for sending a message to every online user.
|
* Used for sending a message to every online user.
|
||||||
*/
|
*/
|
||||||
module { name = "gl_global" }
|
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
|
* gl_queue
|
||||||
@@ -139,7 +139,7 @@ module
|
|||||||
/* The maximum number of messages in a message queue. Defaults to 10. */
|
/* The maximum number of messages in a message queue. Defaults to 10. */
|
||||||
maxqueue = 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
|
* 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.
|
* Used for sending a message to every online user on a server.
|
||||||
*/
|
*/
|
||||||
module { name = "gl_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" }
|
||||||
|
|||||||
+29
-16
@@ -99,7 +99,7 @@ module
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/* Give it a help command. */
|
/* Give it a help command. */
|
||||||
command { service = "HostServ"; name = "HELP"; command = "generic/help"; }
|
command { service = "HostServ"; name = "HELP"; command = "generic/help" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* hs_del
|
* hs_del
|
||||||
@@ -109,8 +109,8 @@ command { service = "HostServ"; name = "HELP"; command = "generic/help"; }
|
|||||||
* Used for removing users' vhosts.
|
* Used for removing users' vhosts.
|
||||||
*/
|
*/
|
||||||
module { name = "hs_del" }
|
module { name = "hs_del" }
|
||||||
command { service = "HostServ"; name = "DEL"; command = "hostserv/del"; 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"; }
|
command { service = "HostServ"; name = "DELALL"; command = "hostserv/delall"; permission = "hostserv/del" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* hs_group
|
* hs_group
|
||||||
@@ -133,7 +133,7 @@ module
|
|||||||
*/
|
*/
|
||||||
synconset = yes
|
synconset = yes
|
||||||
}
|
}
|
||||||
command { service = "HostServ"; name = "GROUP"; command = "hostserv/group"; }
|
command { service = "HostServ"; name = "GROUP"; command = "hostserv/group" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* hs_list
|
* hs_list
|
||||||
@@ -143,7 +143,7 @@ command { service = "HostServ"; name = "GROUP"; command = "hostserv/group"; }
|
|||||||
* Used for listing actively set vhosts.
|
* Used for listing actively set vhosts.
|
||||||
*/
|
*/
|
||||||
module { name = "hs_list" }
|
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
|
* hs_off
|
||||||
@@ -153,7 +153,7 @@ command { service = "HostServ"; name = "LIST"; command = "hostserv/list"; permis
|
|||||||
* Used for turning off your vhost.
|
* Used for turning off your vhost.
|
||||||
*/
|
*/
|
||||||
module { name = "hs_off" }
|
module { name = "hs_off" }
|
||||||
command { service = "HostServ"; name = "OFF"; command = "hostserv/off"; }
|
command { service = "HostServ"; name = "OFF"; command = "hostserv/off" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* hs_offfer
|
* hs_offfer
|
||||||
@@ -171,8 +171,8 @@ module
|
|||||||
*/
|
*/
|
||||||
takedelay = 7d
|
takedelay = 7d
|
||||||
}
|
}
|
||||||
command { service = "HostServ"; name = "OFFER"; command = "hostserv/offer"; permission = "hostserv/offer"; }
|
command { service = "HostServ"; name = "OFFER"; command = "hostserv/offer"; permission = "hostserv/offer" }
|
||||||
command { service = "HostServ"; name = "OFFERLIST"; command = "hostserv/offerlist"; }
|
command { service = "HostServ"; name = "OFFERLIST"; command = "hostserv/offerlist" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* hs_on
|
* hs_on
|
||||||
@@ -182,7 +182,7 @@ command { service = "HostServ"; name = "OFFERLIST"; command = "hostserv/offerlis
|
|||||||
* Used for turning on your vhost.
|
* Used for turning on your vhost.
|
||||||
*/
|
*/
|
||||||
module { name = "hs_on" }
|
module { name = "hs_on" }
|
||||||
command { service = "HostServ"; name = "ON"; command = "hostserv/on"; }
|
command { service = "HostServ"; name = "ON"; command = "hostserv/on" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* hs_request
|
* hs_request
|
||||||
@@ -201,6 +201,19 @@ module
|
|||||||
{
|
{
|
||||||
name = "hs_request"
|
name = "hs_request"
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* How long after a requested vhost is activated does a user have to wait
|
||||||
|
* before they can request a new vhost. Defaults to 24 hours.
|
||||||
|
*/
|
||||||
|
#activationcooldown = 24h
|
||||||
|
|
||||||
|
/*
|
||||||
|
* How long after a requested vhost is rejected does a user have to wait
|
||||||
|
* before they can request a new vhost. Defaults to 24 hours.
|
||||||
|
*/
|
||||||
|
#rejectioncooldown = 24h
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If set, Anope will send a memo to the user requesting a vhost when it's been
|
* If set, Anope will send a memo to the user requesting a vhost when it's been
|
||||||
* approved or rejected.
|
* approved or rejected.
|
||||||
@@ -224,11 +237,11 @@ module
|
|||||||
*/
|
*/
|
||||||
#validationrecord = "anope-dns-validation"
|
#validationrecord = "anope-dns-validation"
|
||||||
}
|
}
|
||||||
command { service = "HostServ"; name = "REQUEST"; command = "hostserv/request"; }
|
command { service = "HostServ"; name = "REQUEST"; command = "hostserv/request" }
|
||||||
command { service = "HostServ"; name = "ACTIVATE"; command = "hostserv/activate"; permission = "hostserv/set"; }
|
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 = "REJECT"; command = "hostserv/reject"; permission = "hostserv/set" }
|
||||||
command { service = "HostServ"; name = "WAITING"; command = "hostserv/waiting"; 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 = "VALIDATE"; command = "hostserv/validate" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* hs_set
|
* hs_set
|
||||||
@@ -238,5 +251,5 @@ command { service = "HostServ"; name = "WAITING"; command = "hostserv/waiting";
|
|||||||
* Used for setting users' vhosts.
|
* Used for setting users' vhosts.
|
||||||
*/
|
*/
|
||||||
module { name = "hs_set" }
|
module { name = "hs_set" }
|
||||||
command { service = "HostServ"; name = "SET"; command = "hostserv/set"; 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"; }
|
command { service = "HostServ"; name = "SETALL"; command = "hostserv/setall"; permission = "hostserv/set" }
|
||||||
|
|||||||
+13
-13
@@ -108,7 +108,7 @@ module
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/* Give it a help command. */
|
/* Give it a help command. */
|
||||||
command { service = "MemoServ"; name = "HELP"; command = "generic/help"; }
|
command { service = "MemoServ"; name = "HELP"; command = "generic/help" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ms_cancel
|
* ms_cancel
|
||||||
@@ -118,7 +118,7 @@ command { service = "MemoServ"; name = "HELP"; command = "generic/help"; }
|
|||||||
* Used to cancel memos already sent but not yet read.
|
* Used to cancel memos already sent but not yet read.
|
||||||
*/
|
*/
|
||||||
module { name = "ms_cancel" }
|
module { name = "ms_cancel" }
|
||||||
command { service = "MemoServ"; name = "CANCEL"; command = "memoserv/cancel"; }
|
command { service = "MemoServ"; name = "CANCEL"; command = "memoserv/cancel" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ms_check
|
* ms_check
|
||||||
@@ -128,7 +128,7 @@ command { service = "MemoServ"; name = "CANCEL"; command = "memoserv/cancel"; }
|
|||||||
* Used to check if a sent memo has been read.
|
* Used to check if a sent memo has been read.
|
||||||
*/
|
*/
|
||||||
module { name = "ms_check" }
|
module { name = "ms_check" }
|
||||||
command { service = "MemoServ"; name = "CHECK"; command = "memoserv/check"; }
|
command { service = "MemoServ"; name = "CHECK"; command = "memoserv/check" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ms_del
|
* ms_del
|
||||||
@@ -138,7 +138,7 @@ command { service = "MemoServ"; name = "CHECK"; command = "memoserv/check"; }
|
|||||||
* Used to delete your memos.
|
* Used to delete your memos.
|
||||||
*/
|
*/
|
||||||
module { name = "ms_del" }
|
module { name = "ms_del" }
|
||||||
command { service = "MemoServ"; name = "DEL"; command = "memoserv/del"; }
|
command { service = "MemoServ"; name = "DEL"; command = "memoserv/del" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ms_ignore
|
* ms_ignore
|
||||||
@@ -158,7 +158,7 @@ module
|
|||||||
*/
|
*/
|
||||||
max = 50
|
max = 50
|
||||||
}
|
}
|
||||||
command { service = "MemoServ"; name = "IGNORE"; command = "memoserv/ignore"; }
|
command { service = "MemoServ"; name = "IGNORE"; command = "memoserv/ignore" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ms_info
|
* 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.
|
* Used to show memo related information about an account or a channel.
|
||||||
*/
|
*/
|
||||||
module { name = "ms_info" }
|
module { name = "ms_info" }
|
||||||
command { service = "MemoServ"; name = "INFO"; command = "memoserv/info"; }
|
command { service = "MemoServ"; name = "INFO"; command = "memoserv/info" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ms_list
|
* ms_list
|
||||||
@@ -178,7 +178,7 @@ command { service = "MemoServ"; name = "INFO"; command = "memoserv/info"; }
|
|||||||
* Used to list your current memos.
|
* Used to list your current memos.
|
||||||
*/
|
*/
|
||||||
module { name = "ms_list" }
|
module { name = "ms_list" }
|
||||||
command { service = "MemoServ"; name = "LIST"; command = "memoserv/list"; }
|
command { service = "MemoServ"; name = "LIST"; command = "memoserv/list" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ms_read
|
* ms_read
|
||||||
@@ -188,7 +188,7 @@ command { service = "MemoServ"; name = "LIST"; command = "memoserv/list"; }
|
|||||||
* Used to read your memos.
|
* Used to read your memos.
|
||||||
*/
|
*/
|
||||||
module { name = "ms_read" }
|
module { name = "ms_read" }
|
||||||
command { service = "MemoServ"; name = "READ"; command = "memoserv/read"; }
|
command { service = "MemoServ"; name = "READ"; command = "memoserv/read" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ms_rsend
|
* ms_rsend
|
||||||
@@ -208,7 +208,7 @@ command { service = "MemoServ"; name = "READ"; command = "memoserv/read"; }
|
|||||||
*/
|
*/
|
||||||
operonly = no
|
operonly = no
|
||||||
}
|
}
|
||||||
#command { service = "MemoServ"; name = "RSEND"; command = "memoserv/rsend"; }
|
#command { service = "MemoServ"; name = "RSEND"; command = "memoserv/rsend" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ms_send
|
* ms_send
|
||||||
@@ -218,7 +218,7 @@ command { service = "MemoServ"; name = "READ"; command = "memoserv/read"; }
|
|||||||
* Used to send memos.
|
* Used to send memos.
|
||||||
*/
|
*/
|
||||||
module { name = "ms_send" }
|
module { name = "ms_send" }
|
||||||
command { service = "MemoServ"; name = "SEND"; command = "memoserv/send"; }
|
command { service = "MemoServ"; name = "SEND"; command = "memoserv/send" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ms_sendall
|
* ms_sendall
|
||||||
@@ -228,7 +228,7 @@ command { service = "MemoServ"; name = "SEND"; command = "memoserv/send"; }
|
|||||||
* Used to send a mass memo to every registered user.
|
* Used to send a mass memo to every registered user.
|
||||||
*/
|
*/
|
||||||
module { name = "ms_sendall" }
|
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
|
* 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.
|
* Used to set settings such as how you are notified of new memos, and your memo limit.
|
||||||
*/
|
*/
|
||||||
module { name = "ms_set" }
|
module { name = "ms_set" }
|
||||||
command { service = "MemoServ"; name = "SET"; command = "memoserv/set"; }
|
command { service = "MemoServ"; name = "SET"; command = "memoserv/set" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ms_staff
|
* ms_staff
|
||||||
@@ -248,4 +248,4 @@ command { service = "MemoServ"; name = "SET"; command = "memoserv/set"; }
|
|||||||
* Used to send a memo to all registered staff members.
|
* Used to send a memo to all registered staff members.
|
||||||
*/
|
*/
|
||||||
module { name = "ms_staff" }
|
module { name = "ms_staff" }
|
||||||
command { service = "MemoServ"; name = "STAFF"; command = "memoserv/staff"; permission = "memoserv/staff"; }
|
command { service = "MemoServ"; name = "STAFF"; command = "memoserv/staff"; permission = "memoserv/staff" }
|
||||||
|
|||||||
@@ -374,30 +374,6 @@ module { name = "help" }
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* redis
|
|
||||||
*
|
|
||||||
* This module allows other modules to use Redis.
|
|
||||||
*/
|
|
||||||
#module
|
|
||||||
{
|
|
||||||
name = "redis"
|
|
||||||
|
|
||||||
/* A redis database */
|
|
||||||
redis
|
|
||||||
{
|
|
||||||
/* The name of this service */
|
|
||||||
name = "redis/main"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The redis database to use. New connections default to 0.
|
|
||||||
*/
|
|
||||||
db = 0
|
|
||||||
|
|
||||||
ip = "127.0.0.1"
|
|
||||||
port = 6379
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* [EXTRA] regex_pcre2
|
* [EXTRA] regex_pcre2
|
||||||
|
|||||||
+102
-74
@@ -113,12 +113,17 @@ module
|
|||||||
* - memo_signon: Notify user if they have a new memo when they sign into the nick
|
* - 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_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
|
* - 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
|
* - autoop: User will be automatically opped in channels they enter and have access to
|
||||||
* - neverop: User can not be added to access lists
|
* - neverop: User can not be added to access lists
|
||||||
* - msg: Messages will be sent as PRIVMSGs instead of NOTICEs
|
* - msg: Messages will be sent as PRIVMSGs instead of NOTICEs
|
||||||
* - ns_keep_modes: Enables keepmodes, which retains user modes across sessions
|
* - ns_keep_modes: Enables keepmodes, which retains user modes across sessions
|
||||||
* - protect: Protects the registered nickname from use by unidentified users.
|
* - protect: Protects the registered nickname from use by unidentified users.
|
||||||
* - ns_stats: Enable Chanstats for newly registered nicks
|
* - ns_stats: Enable Chanstats for newly registered nicks
|
||||||
|
* - ns_flexible: Set FLEXIBLE as layout for messages from services (can not be set at the same
|
||||||
|
* time as ns_monospace)
|
||||||
|
* - ns_monospace: Set MONOSPACE as layout for messages from services (can not be set as the same
|
||||||
|
* time as ns_flexible)
|
||||||
*
|
*
|
||||||
* This directive is optional, if left blank, the options will default to memo_signon, and
|
* This directive is optional, if left blank, the options will default to memo_signon, and
|
||||||
* memo_receive. If you really want no defaults, use "none" by itself as the option.
|
* memo_receive. If you really want no defaults, use "none" by itself as the option.
|
||||||
@@ -127,9 +132,9 @@ module
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* The minimum length of time between consecutive uses of NickServ's REGISTER command. This
|
* The minimum length of time between consecutive uses of NickServ's REGISTER command. This
|
||||||
* directive is optional, but recommended. If not set, this restriction will be disabled.
|
* directive is optional, but recommended. If not set, it defaults to 15 minutes.
|
||||||
*/
|
*/
|
||||||
regdelay = 5m
|
regdelay = 15m
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The length of time before a nick's registration expires.
|
* The length of time before a nick's registration expires.
|
||||||
@@ -280,7 +285,7 @@ command_group
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Give it a help command. */
|
/* Give it a help command. */
|
||||||
command { service = "NickServ"; name = "HELP"; command = "generic/help"; }
|
command { service = "NickServ"; name = "HELP"; command = "generic/help" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ns_ajoin
|
* ns_ajoin
|
||||||
@@ -298,7 +303,7 @@ module
|
|||||||
*/
|
*/
|
||||||
ajoinmax = 10
|
ajoinmax = 10
|
||||||
}
|
}
|
||||||
command { service = "NickServ"; name = "AJOIN"; command = "nickserv/ajoin"; }
|
command { service = "NickServ"; name = "AJOIN"; command = "nickserv/ajoin" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ns_alist
|
* ns_alist
|
||||||
@@ -308,8 +313,8 @@ command { service = "NickServ"; name = "AJOIN"; command = "nickserv/ajoin"; }
|
|||||||
* Used for viewing what channels you have access to.
|
* Used for viewing what channels you have access to.
|
||||||
*/
|
*/
|
||||||
module { name = "ns_alist" }
|
module { name = "ns_alist" }
|
||||||
command { service = "NickServ"; name = "ALIST"; command = "nickserv/alist"; }
|
command { service = "NickServ"; name = "ALIST"; command = "nickserv/alist" }
|
||||||
command { service = "NickServ"; name = "ACCESS"; command = "nickserv/alist"; hide = yes; }
|
command { service = "NickServ"; name = "ACCESS"; command = "nickserv/alist"; hide = yes }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ns_cert
|
* ns_cert
|
||||||
@@ -334,7 +339,10 @@ module
|
|||||||
*/
|
*/
|
||||||
max = 5
|
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
|
* ns_confirm
|
||||||
@@ -344,7 +352,7 @@ command { service = "NickServ"; name = "CERT"; command = "nickserv/cert"; }
|
|||||||
* Used for confirming previous account actions.
|
* Used for confirming previous account actions.
|
||||||
*/
|
*/
|
||||||
module { name = "ns_confirm" }
|
module { name = "ns_confirm" }
|
||||||
command { service = "NickServ"; name = "CONFIRM"; command = "nickserv/confirm"; }
|
command { service = "NickServ"; name = "CONFIRM"; command = "nickserv/confirm" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ns_drop
|
* ns_drop
|
||||||
@@ -354,7 +362,7 @@ command { service = "NickServ"; name = "CONFIRM"; command = "nickserv/confirm";
|
|||||||
* Used for unregistering names.
|
* Used for unregistering names.
|
||||||
*/
|
*/
|
||||||
module { name = "ns_drop" }
|
module { name = "ns_drop" }
|
||||||
command { service = "NickServ"; name = "DROP"; command = "nickserv/drop"; }
|
command { service = "NickServ"; name = "DROP"; command = "nickserv/drop" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ns_email
|
* ns_email
|
||||||
@@ -391,10 +399,10 @@ module
|
|||||||
*/
|
*/
|
||||||
#remove_aliases = yes
|
#remove_aliases = yes
|
||||||
}
|
}
|
||||||
command { service = "NickServ"; name = "CONFIRM EMAIL"; command = "nickserv/confirm/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 = "GETEMAIL"; command = "nickserv/getemail"; permission = "nickserv/getemail"; group = "nickserv/admin" }
|
||||||
command { service = "NickServ"; name = "SET EMAIL"; command = "nickserv/set/email"; }
|
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 = "SASET EMAIL"; command = "nickserv/saset/email"; permission = "nickserv/saset/email" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ns_group
|
* ns_group
|
||||||
@@ -412,6 +420,12 @@ module
|
|||||||
{
|
{
|
||||||
name = "ns_group"
|
name = "ns_group"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The minimum length of time between consecutive uses of the GROUP command. This directive is
|
||||||
|
* optional, but recommended. If not set, it defaults to 5 minutes.
|
||||||
|
*/
|
||||||
|
delay = 5m
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The maximum number of nicks allowed in a group.
|
* The maximum number of nicks allowed in a group.
|
||||||
*
|
*
|
||||||
@@ -428,15 +442,15 @@ module
|
|||||||
*/
|
*/
|
||||||
nogroupchange = yes
|
nogroupchange = yes
|
||||||
}
|
}
|
||||||
command { service = "NickServ"; name = "GLIST"; command = "nickserv/glist"; }
|
command { service = "NickServ"; name = "GLIST"; command = "nickserv/glist" }
|
||||||
command { service = "NickServ"; name = "GROUP"; command = "nickserv/group"; }
|
command { service = "NickServ"; name = "GROUP"; command = "nickserv/group" }
|
||||||
command { service = "NickServ"; name = "UNGROUP"; command = "nickserv/ungroup"; }
|
command { service = "NickServ"; name = "UNGROUP"; command = "nickserv/ungroup" }
|
||||||
command { service = "NickServ"; name = "SET DISPLAY"; command = "nickserv/set/display"; }
|
command { service = "NickServ"; name = "SET DISPLAY"; command = "nickserv/set/display" }
|
||||||
command { service = "NickServ"; name = "SASET DISPLAY"; command = "nickserv/saset/display"; permission = "nickserv/saset/display"; }
|
command { service = "NickServ"; name = "SASET DISPLAY"; command = "nickserv/saset/display"; permission = "nickserv/saset/display" }
|
||||||
|
|
||||||
# For compatibility with Atheme.
|
# For compatibility with Atheme.
|
||||||
command { service = "NickServ"; name = "SET ACCOUNTNAME"; command = "nickserv/set/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; }
|
command { service = "NickServ"; name = "SASET ACCOUNTNAME"; command = "nickserv/saset/display"; permission = "nickserv/saset/display"; hide = yes }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ns_identify
|
* ns_identify
|
||||||
@@ -454,8 +468,8 @@ module
|
|||||||
*/
|
*/
|
||||||
maxlogins = 10
|
maxlogins = 10
|
||||||
}
|
}
|
||||||
command { service = "NickServ"; name = "ID"; command = "nickserv/identify"; hide = yes; }
|
command { service = "NickServ"; name = "ID"; command = "nickserv/identify"; hide = yes }
|
||||||
command { service = "NickServ"; name = "IDENTIFY"; command = "nickserv/identify"; }
|
command { service = "NickServ"; name = "IDENTIFY"; command = "nickserv/identify" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ns_info
|
* ns_info
|
||||||
@@ -466,10 +480,10 @@ command { service = "NickServ"; name = "IDENTIFY"; command = "nickserv/identify"
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
module { name = "ns_info" }
|
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 = "SET HIDE"; command = "nickserv/set/hide" }
|
||||||
command { service = "NickServ"; name = "SASET HIDE"; command = "nickserv/saset/hide"; permission = "nickserv/saset/hide"; }
|
command { service = "NickServ"; name = "SASET HIDE"; command = "nickserv/saset/hide"; permission = "nickserv/saset/hide" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ns_list
|
* ns_list
|
||||||
@@ -488,9 +502,9 @@ module
|
|||||||
*/
|
*/
|
||||||
listmax = 50
|
listmax = 50
|
||||||
}
|
}
|
||||||
command { service = "NickServ"; name = "LIST"; command = "nickserv/list"; }
|
command { service = "NickServ"; name = "LIST"; command = "nickserv/list" }
|
||||||
command { service = "NickServ"; name = "SET PRIVATE"; command = "nickserv/set/private"; }
|
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 = "SASET PRIVATE"; command = "nickserv/saset/private"; permission = "nickserv/saset/private" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ns_logout
|
* ns_logout
|
||||||
@@ -500,7 +514,7 @@ command { service = "NickServ"; name = "SASET PRIVATE"; command = "nickserv/sase
|
|||||||
* Used for logging out of your account.
|
* Used for logging out of your account.
|
||||||
*/
|
*/
|
||||||
module { name = "ns_logout" }
|
module { name = "ns_logout" }
|
||||||
command { service = "NickServ"; name = "LOGOUT"; command = "nickserv/logout"; }
|
command { service = "NickServ"; name = "LOGOUT"; command = "nickserv/logout" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ns_recover
|
* ns_recover
|
||||||
@@ -521,11 +535,11 @@ module
|
|||||||
*/
|
*/
|
||||||
restoreonrecover = yes
|
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.
|
# For compatibility with Anope 1.8 and Atheme.
|
||||||
command { service = "NickServ"; name = "GHOST"; 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; }
|
command { service = "NickServ"; name = "RELEASE"; command = "nickserv/recover"; hide = yes }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ns_register
|
* ns_register
|
||||||
@@ -570,9 +584,9 @@ module
|
|||||||
*/
|
*/
|
||||||
#unconfirmedexpire = 1d
|
#unconfirmedexpire = 1d
|
||||||
}
|
}
|
||||||
command { service = "NickServ"; name = "CONFIRM REGISTER"; command = "nickserv/confirm/register"; }
|
command { service = "NickServ"; name = "CONFIRM REGISTER"; command = "nickserv/confirm/register" }
|
||||||
command { service = "NickServ"; name = "REGISTER"; command = "nickserv/register"; }
|
command { service = "NickServ"; name = "REGISTER"; command = "nickserv/register" }
|
||||||
command { service = "NickServ"; name = "RESEND"; command = "nickserv/resend"; }
|
command { service = "NickServ"; name = "RESEND"; command = "nickserv/resend" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ns_resetpass
|
* ns_resetpass
|
||||||
@@ -591,11 +605,11 @@ module
|
|||||||
*/
|
*/
|
||||||
#resetexpire = 1d
|
#resetexpire = 1d
|
||||||
}
|
}
|
||||||
command { service = "NickServ"; name = "CONFIRM RESETPASS"; command = "nickserv/confirm/resetpass"; }
|
command { service = "NickServ"; name = "CONFIRM RESETPASS"; command = "nickserv/confirm/resetpass" }
|
||||||
command { service = "NickServ"; name = "RESETPASS"; command = "nickserv/resetpass"; }
|
command { service = "NickServ"; name = "RESETPASS"; command = "nickserv/resetpass" }
|
||||||
|
|
||||||
# For compatibility with Anope 2.0.
|
# 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
|
* ns_sasl
|
||||||
@@ -661,13 +675,13 @@ module { name = "ns_sasl_plain" }
|
|||||||
*/
|
*/
|
||||||
module { name = "ns_set" }
|
module { name = "ns_set" }
|
||||||
|
|
||||||
command { service = "NickServ"; name = "SET"; command = "nickserv/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 = "SASET"; command = "nickserv/saset"; permission = "nickserv/saset/"; group = "nickserv/admin" }
|
||||||
|
|
||||||
command { service = "NickServ"; name = "SET PASSWORD"; command = "nickserv/set/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 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
|
* ns_set_keepmodes
|
||||||
@@ -687,8 +701,8 @@ module
|
|||||||
*/
|
*/
|
||||||
#norestore = "ABCabc"
|
#norestore = "ABCabc"
|
||||||
}
|
}
|
||||||
command { service = "NickServ"; name = "SET KEEPMODES"; command = "nickserv/set/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"; }
|
command { service = "NickServ"; name = "SASET KEEPMODES"; command = "nickserv/saset/keepmodes"; permission = "nickserv/saset/keepmodes" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ns_set_language
|
* ns_set_language
|
||||||
@@ -698,8 +712,8 @@ command { service = "NickServ"; name = "SASET KEEPMODES"; command = "nickserv/sa
|
|||||||
* Allows configuring the language that services uses.
|
* Allows configuring the language that services uses.
|
||||||
*/
|
*/
|
||||||
module { name = "ns_set_language" }
|
module { name = "ns_set_language" }
|
||||||
command { service = "NickServ"; name = "SET LANGUAGE"; command = "nickserv/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 = "SASET LANGUAGE"; command = "nickserv/saset/language"; permission = "nickserv/saset/language" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ns_set_layout
|
* ns_set_layout
|
||||||
@@ -709,8 +723,8 @@ command { service = "NickServ"; name = "SASET LANGUAGE"; command = "nickserv/sas
|
|||||||
* Allows configuring the layout that services uses.
|
* Allows configuring the layout that services uses.
|
||||||
*/
|
*/
|
||||||
module { name = "ns_set_layout" }
|
module { name = "ns_set_layout" }
|
||||||
command { service = "NickServ"; name = "SET LAYOUT"; command = "nickserv/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 = "SASET LAYOUT"; command = "nickserv/saset/layout"; permission = "nickserv/saset/layout" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ns_set_message
|
* ns_set_message
|
||||||
@@ -724,24 +738,38 @@ command { service = "NickServ"; name = "SASET LAYOUT"; command = "nickserv/saset
|
|||||||
* message loops. Only enable this if you are sure this can not happen.
|
* message loops. Only enable this if you are sure this can not happen.
|
||||||
*/
|
*/
|
||||||
#module { name = "ns_set_message" }
|
#module { name = "ns_set_message" }
|
||||||
#command { service = "NickServ"; name = "SET MESSAGE"; command = "nickserv/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 = "SASET MESSAGE"; command = "nickserv/saset/message"; permission = "nickserv/saset/message" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ns_set_misc
|
* ns_set_misc
|
||||||
*
|
*
|
||||||
* Provides the command nickserv/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.
|
* Allows you to create arbitrary commands to set data, and have that data show
|
||||||
* A field named misc_description may be given for use with help output.
|
* 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_priority: Positive integer representing display order in nickserv/info
|
||||||
|
* and (if enabled) WHOIS output. Entries with unspecified
|
||||||
|
* priority will be prioritized in the order of declaration.
|
||||||
|
* 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" }
|
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 = "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 = "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 = "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 = "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 = "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"; }
|
#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
|
* ns_set_op
|
||||||
@@ -752,15 +780,15 @@ command { service = "NickServ"; name = "SASET URL"; command = "nickserv/saset/mi
|
|||||||
*/
|
*/
|
||||||
module { name = "ns_set_op" }
|
module { name = "ns_set_op" }
|
||||||
|
|
||||||
command { service = "NickServ"; name = "SET AUTOOP"; command = "nickserv/set/autoop"; }
|
command { service = "NickServ"; name = "SET AUTOOP"; command = "nickserv/set/autoop" }
|
||||||
command { service = "NickServ"; name = "SASET AUTOOP"; command = "nickserv/saset/autoop"; permission = "nickserv/saset/autoop"; }
|
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 = "SET NEVEROP"; command = "nickserv/set/neverop" }
|
||||||
command { service = "NickServ"; name = "SASET NEVEROP"; command = "nickserv/saset/neverop"; permission = "nickserv/saset/neverop"; }
|
command { service = "NickServ"; name = "SASET NEVEROP"; command = "nickserv/saset/neverop"; permission = "nickserv/saset/neverop" }
|
||||||
|
|
||||||
# For compatibility with DALnet Services.
|
# For compatibility with DALnet Services.
|
||||||
command { service = "NickServ"; name = "SET NOOP"; command = "nickserv/set/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; }
|
command { service = "NickServ"; name = "SASET NOOP"; command = "nickserv/saset/neverop"; permission = "nickserv/saset/neverop"; hide = yes }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ns_set_protect
|
* ns_set_protect
|
||||||
@@ -770,12 +798,12 @@ command { service = "NickServ"; name = "SASET NOOP"; command = "nickserv/saset/n
|
|||||||
* Used for configuring nickname protection.
|
* Used for configuring nickname protection.
|
||||||
*/
|
*/
|
||||||
module { name = "ns_set_protect" }
|
module { name = "ns_set_protect" }
|
||||||
command { service = "NickServ"; name = "SET PROTECT"; command = "nickserv/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 = "SASET PROTECT"; command = "nickserv/saset/protect"; permission = "nickserv/saset/protect" }
|
||||||
|
|
||||||
# For compatibility with Anope 2.0.
|
# For compatibility with Anope 2.0.
|
||||||
command { service = "NickServ"; name = "SET KILL"; command = "nickserv/set/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; }
|
command { service = "NickServ"; name = "SASET KILL"; command = "nickserv/saset/protect"; permission = "nickserv/saset/protect"; hide = yes }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ns_set_timezone
|
* ns_set_timezone
|
||||||
@@ -785,8 +813,8 @@ command { service = "NickServ"; name = "SASET KILL"; command = "nickserv/saset/p
|
|||||||
* Allows configuring the timezone that services uses.
|
* Allows configuring the timezone that services uses.
|
||||||
*/
|
*/
|
||||||
module { name = "ns_set_timezone" }
|
module { name = "ns_set_timezone" }
|
||||||
command { service = "NickServ"; name = "SET TIMEZONE"; command = "nickserv/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 = "SASET TIMEZONE"; command = "nickserv/saset/timezone"; permission = "nickserv/saset/timezone" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ns_suspend
|
* ns_suspend
|
||||||
@@ -813,8 +841,8 @@ module
|
|||||||
*/
|
*/
|
||||||
show = "suspended, by, reason, on, expires"
|
show = "suspended, by, reason, on, expires"
|
||||||
}
|
}
|
||||||
command { service = "NickServ"; name = "SUSPEND"; command = "nickserv/suspend"; 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"; }
|
command { service = "NickServ"; name = "UNSUSPEND"; command = "nickserv/unsuspend"; permission = "nickserv/suspend"; group = "nickserv/admin" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ns_update
|
* ns_update
|
||||||
@@ -824,4 +852,4 @@ command { service = "NickServ"; name = "UNSUSPEND"; command = "nickserv/unsuspen
|
|||||||
* Used to update your status on all channels, turn on your vhost, etc.
|
* Used to update your status on all channels, turn on your vhost, etc.
|
||||||
*/
|
*/
|
||||||
module { name = "ns_update" }
|
module { name = "ns_update" }
|
||||||
command { service = "NickServ"; name = "UPDATE"; command = "nickserv/update"; }
|
command { service = "NickServ"; name = "UPDATE"; command = "nickserv/update" }
|
||||||
|
|||||||
+45
-45
@@ -143,7 +143,7 @@ module
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/* Give it a help command. */
|
/* Give it a help command. */
|
||||||
command { service = "OperServ"; name = "HELP"; command = "generic/help"; }
|
command { service = "OperServ"; name = "HELP"; command = "generic/help" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* os_akill
|
* os_akill
|
||||||
@@ -153,7 +153,7 @@ command { service = "OperServ"; name = "HELP"; command = "generic/help"; }
|
|||||||
* Used to ban users from the network.
|
* Used to ban users from the network.
|
||||||
*/
|
*/
|
||||||
module { name = "os_akill" }
|
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
|
* os_chankill
|
||||||
@@ -163,7 +163,7 @@ command { service = "OperServ"; name = "AKILL"; command = "operserv/akill"; perm
|
|||||||
* Used to akill users from an entire channel.
|
* Used to akill users from an entire channel.
|
||||||
*/
|
*/
|
||||||
module { name = "os_chankill" }
|
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
|
* 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."
|
#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
|
* os_dns
|
||||||
@@ -292,10 +292,10 @@ command { service = "OperServ"; name = "CHANKILL"; command = "operserv/chankill"
|
|||||||
*
|
*
|
||||||
* To do this using BIND, configure similar to:
|
* To do this using BIND, configure similar to:
|
||||||
*
|
*
|
||||||
* options { max-refresh-time 60; };
|
* options { max-refresh-time 60 };
|
||||||
* zone "irc.example.com" IN {
|
* zone "irc.example.com" IN {
|
||||||
* type secondary;
|
* 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.
|
* 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
|
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
|
* 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.
|
* Used to view and set configuration options while services are running.
|
||||||
*/
|
*/
|
||||||
module { name = "os_config" }
|
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
|
* 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
|
* os_ignore
|
||||||
@@ -389,7 +389,7 @@ command { service = "OperServ"; name = "FORBID"; command = "operserv/forbid"; pe
|
|||||||
* Used to make Anope ignore users.
|
* Used to make Anope ignore users.
|
||||||
*/
|
*/
|
||||||
module { name = "os_ignore" }
|
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
|
* 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.
|
* Used to add oper only notes to users and channels.
|
||||||
*/
|
*/
|
||||||
module { name = "os_info" }
|
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
|
* 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.
|
* Used to disconnect servers from the network and prevent them from relinking.
|
||||||
*/
|
*/
|
||||||
module { name = "os_jupe" }
|
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
|
* os_kick
|
||||||
@@ -419,7 +419,7 @@ command { service = "OperServ"; name = "JUPE"; command = "operserv/jupe"; permis
|
|||||||
* Used to kick users from channels.
|
* Used to kick users from channels.
|
||||||
*/
|
*/
|
||||||
module { name = "os_kick" }
|
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
|
* os_kill
|
||||||
@@ -429,7 +429,7 @@ command { service = "OperServ"; name = "KICK"; command = "operserv/kick"; permis
|
|||||||
* Used to forcibly disconnect users from the network.
|
* Used to forcibly disconnect users from the network.
|
||||||
*/
|
*/
|
||||||
module { name = "os_kill" }
|
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
|
* 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.
|
* Used to list and search the channels and users currently on the network.
|
||||||
*/
|
*/
|
||||||
module { name = "os_list" }
|
module { name = "os_list" }
|
||||||
command { service = "OperServ"; name = "CHANLIST"; command = "operserv/chanlist"; permission = "operserv/chanlist"; }
|
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 = "USERLIST"; command = "operserv/userlist"; permission = "operserv/userlist" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* os_login
|
* 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.
|
* Used to login to OperServ, only required if your oper block requires this.
|
||||||
*/
|
*/
|
||||||
module { name = "os_login" }
|
module { name = "os_login" }
|
||||||
command { service = "OperServ"; name = "LOGIN"; command = "operserv/login"; }
|
command { service = "OperServ"; name = "LOGIN"; command = "operserv/login" }
|
||||||
command { service = "OperServ"; name = "LOGOUT"; command = "operserv/logout"; }
|
command { service = "OperServ"; name = "LOGOUT"; command = "operserv/logout" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* os_logsearch
|
* os_logsearch
|
||||||
@@ -469,7 +469,7 @@ module
|
|||||||
*/
|
*/
|
||||||
logname = "services.log"
|
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
|
* os_mode
|
||||||
@@ -479,8 +479,8 @@ command { service = "OperServ"; name = "LOGSEARCH"; command = "operserv/logsearc
|
|||||||
* Used to change user and channel modes.
|
* Used to change user and channel modes.
|
||||||
*/
|
*/
|
||||||
module { name = "os_mode" }
|
module { name = "os_mode" }
|
||||||
command { service = "OperServ"; name = "UMODE"; command = "operserv/umode"; permission = "operserv/umode"; }
|
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 = "MODE"; command = "operserv/mode"; permission = "operserv/mode" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* os_modinfo
|
* os_modinfo
|
||||||
@@ -490,8 +490,8 @@ command { service = "OperServ"; name = "MODE"; command = "operserv/mode"; permis
|
|||||||
* Used to show information about loaded modules.
|
* Used to show information about loaded modules.
|
||||||
*/
|
*/
|
||||||
module { name = "os_modinfo" }
|
module { name = "os_modinfo" }
|
||||||
command { service = "OperServ"; name = "MODINFO"; command = "operserv/modinfo"; 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"; }
|
command { service = "OperServ"; name = "MODLIST"; command = "operserv/modlist"; permission = "operserv/modinfo" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* os_module
|
* os_module
|
||||||
@@ -501,9 +501,9 @@ command { service = "OperServ"; name = "MODLIST"; command = "operserv/modlist";
|
|||||||
* Used to load, reload, and unload modules.
|
* Used to load, reload, and unload modules.
|
||||||
*/
|
*/
|
||||||
module { name = "os_module" }
|
module { name = "os_module" }
|
||||||
command { service = "OperServ"; name = "MODLOAD"; command = "operserv/modload"; 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 = "MODRELOAD"; command = "operserv/modreload"; permission = "operserv/modload" }
|
||||||
command { service = "OperServ"; name = "MODUNLOAD"; command = "operserv/modunload"; permission = "operserv/modload"; }
|
command { service = "OperServ"; name = "MODUNLOAD"; command = "operserv/modunload"; permission = "operserv/modload" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* os_news
|
* os_news
|
||||||
@@ -537,9 +537,9 @@ module
|
|||||||
*/
|
*/
|
||||||
#showdate = yes
|
#showdate = yes
|
||||||
}
|
}
|
||||||
command { service = "OperServ"; name = "LOGONNEWS"; command = "operserv/logonnews"; 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 = "OPERNEWS"; command = "operserv/opernews"; permission = "operserv/news" }
|
||||||
command { service = "OperServ"; name = "RANDOMNEWS"; command = "operserv/randomnews"; permission = "operserv/news"; }
|
command { service = "OperServ"; name = "RANDOMNEWS"; command = "operserv/randomnews"; permission = "operserv/news" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* os_noop
|
* 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.
|
* Used to NOOP a server, which prevents users from opering on that server.
|
||||||
*/
|
*/
|
||||||
#module { name = "os_noop" }
|
#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
|
* os_oper
|
||||||
@@ -559,7 +559,7 @@ command { service = "OperServ"; name = "NOOP"; command = "operserv/noop"; permis
|
|||||||
* Used to configure opers and show information about opertypes.
|
* Used to configure opers and show information about opertypes.
|
||||||
*/
|
*/
|
||||||
module { name = "os_oper" }
|
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
|
* os_reload
|
||||||
@@ -569,7 +569,7 @@ command { service = "OperServ"; name = "OPER"; command = "operserv/oper"; permis
|
|||||||
* Used to reload the anope.conf configuration file.
|
* Used to reload the anope.conf configuration file.
|
||||||
*/
|
*/
|
||||||
module { name = "os_reload" }
|
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
|
* os_session
|
||||||
@@ -652,8 +652,8 @@ module
|
|||||||
session_ipv4_cidr = 32
|
session_ipv4_cidr = 32
|
||||||
session_ipv6_cidr = 128
|
session_ipv6_cidr = 128
|
||||||
}
|
}
|
||||||
command { service = "OperServ"; name = "EXCEPTION"; command = "operserv/exception"; permission = "operserv/exception"; }
|
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 = "SESSION"; command = "operserv/session"; permission = "operserv/session" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* os_set
|
* os_set
|
||||||
@@ -674,7 +674,7 @@ module
|
|||||||
*/
|
*/
|
||||||
#superadmin = yes
|
#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
|
* os_shutdown
|
||||||
@@ -694,9 +694,9 @@ module
|
|||||||
*/
|
*/
|
||||||
requirename = yes
|
requirename = yes
|
||||||
}
|
}
|
||||||
#command { service = "OperServ"; name = "QUIT"; command = "operserv/quit"; permission = "operserv/quit"; }
|
#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 = "RESTART"; command = "operserv/restart"; permission = "operserv/restart" }
|
||||||
command { service = "OperServ"; name = "SHUTDOWN"; command = "operserv/shutdown"; permission = "operserv/shutdown"; }
|
command { service = "OperServ"; name = "SHUTDOWN"; command = "operserv/shutdown"; permission = "operserv/shutdown" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* os_stats
|
* os_stats
|
||||||
@@ -706,7 +706,7 @@ command { service = "OperServ"; name = "SHUTDOWN"; command = "operserv/shutdown"
|
|||||||
* Used to show statistics about services.
|
* Used to show statistics about services.
|
||||||
*/
|
*/
|
||||||
module { name = "os_stats" }
|
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
|
* 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.
|
* Used to force users to change nicks, join and part channels.
|
||||||
*/
|
*/
|
||||||
module { name = "os_svs" }
|
module { name = "os_svs" }
|
||||||
command { service = "OperServ"; name = "SVSNICK"; command = "operserv/svsnick"; 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 = "SVSJOIN"; command = "operserv/svsjoin"; permission = "operserv/svs" }
|
||||||
command { service = "OperServ"; name = "SVSPART"; command = "operserv/svspart"; permission = "operserv/svs"; }
|
command { service = "OperServ"; name = "SVSPART"; command = "operserv/svspart"; permission = "operserv/svs" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* os_sxline
|
* os_sxline
|
||||||
@@ -728,8 +728,8 @@ command { service = "OperServ"; name = "SVSPART"; command = "operserv/svspart";
|
|||||||
* Used to ban real names, nick names, and possibly channels.
|
* Used to ban real names, nick names, and possibly channels.
|
||||||
*/
|
*/
|
||||||
module { name = "os_sxline" }
|
module { name = "os_sxline" }
|
||||||
command { service = "OperServ"; name = "SNLINE"; command = "operserv/snline"; permission = "operserv/snline"; }
|
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 = "SQLINE"; command = "operserv/sqline"; permission = "operserv/sqline" }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* os_update
|
* os_update
|
||||||
@@ -739,4 +739,4 @@ command { service = "OperServ"; name = "SQLINE"; command = "operserv/sqline"; pe
|
|||||||
* Use to immediately update the databases.
|
* Use to immediately update the databases.
|
||||||
*/
|
*/
|
||||||
module { name = "os_update" }
|
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" }
|
||||||
|
|||||||
+4
-4
@@ -3,7 +3,7 @@ and other useful contributions to Anope. These people, ordered by the number of
|
|||||||
contributions they have made, are:
|
contributions they have made, are:
|
||||||
|
|
||||||
* Adam <adam@anope.org>
|
* Adam <adam@anope.org>
|
||||||
* Sadie Powell <sadie@witchery.services>
|
* Sadie Powell <sadie@sadiepowell.dev>
|
||||||
* Robin Burchell <w00t@inspircd.org>
|
* Robin Burchell <w00t@inspircd.org>
|
||||||
* Naram Qashat <cyberbotx@anope.org>
|
* Naram Qashat <cyberbotx@anope.org>
|
||||||
* Pieter Bootsma <geniusdex@anope.org>
|
* Pieter Bootsma <geniusdex@anope.org>
|
||||||
@@ -20,14 +20,13 @@ contributions they have made, are:
|
|||||||
* Adam Kramer <ribosome@anope.org>
|
* Adam Kramer <ribosome@anope.org>
|
||||||
* Attila Molnar <attilamolnar@hush.com>
|
* Attila Molnar <attilamolnar@hush.com>
|
||||||
* Michael Wobst <wobst.michael@web.de>
|
* Michael Wobst <wobst.michael@web.de>
|
||||||
* Matt Schatz <genius3000@g3k.solutions>
|
|
||||||
* PeGaSuS <droider.pc@gmail.com>
|
* PeGaSuS <droider.pc@gmail.com>
|
||||||
|
* Matt Schatz <genius3000@g3k.solutions>
|
||||||
* Mark Summers <mark@goopler.net>
|
* Mark Summers <mark@goopler.net>
|
||||||
* Daniel Vassdal <shutter@canternet.org>
|
* Daniel Vassdal <shutter@canternet.org>
|
||||||
* MatthewM <mcm@they-got.us>
|
* MatthewM <mcm@they-got.us>
|
||||||
* Sebastian V. <hal9000@denorastats.org>
|
* Sebastian V. <hal9000@denorastats.org>
|
||||||
* Alvaro Toledo <atoledo@keldon.org>
|
* Alvaro Toledo <atoledo@keldon.org>
|
||||||
* Dragone2 <dragone2@risposteinformatiche.it>
|
|
||||||
* Björn Stiddien <keeper@anope.org>
|
* Björn Stiddien <keeper@anope.org>
|
||||||
* n0kS Phr33d0m <god@politeia.in>
|
* n0kS Phr33d0m <god@politeia.in>
|
||||||
* Hendrik Jäger <gitcommit@henk.geekmail.org>
|
* Hendrik Jäger <gitcommit@henk.geekmail.org>
|
||||||
@@ -39,6 +38,7 @@ contributions they have made, are:
|
|||||||
* Federico G. Schwindt <fgsch@lodoss.net>
|
* Federico G. Schwindt <fgsch@lodoss.net>
|
||||||
* Alexander Barton <alex@barton.de>
|
* Alexander Barton <alex@barton.de>
|
||||||
* Cronus <cronus@nite-serv.com>
|
* Cronus <cronus@nite-serv.com>
|
||||||
|
* Dragone2 <dragone2@risposteinformatiche.it>
|
||||||
* H7-25 <simos@simosnap.org>
|
* H7-25 <simos@simosnap.org>
|
||||||
* Jyzee <jyzee.git@gmail.com>
|
* Jyzee <jyzee.git@gmail.com>
|
||||||
* Sebastian Barfurth <github@afreshmelon.com>
|
* Sebastian Barfurth <github@afreshmelon.com>
|
||||||
@@ -49,6 +49,7 @@ contributions they have made, are:
|
|||||||
* Robert Scheck <robert@fedoraproject.org>
|
* Robert Scheck <robert@fedoraproject.org>
|
||||||
* Dennis Friis <peavey@inspircd.org>
|
* Dennis Friis <peavey@inspircd.org>
|
||||||
* Filippo Cortigiani <simos@simosnap.org>
|
* Filippo Cortigiani <simos@simosnap.org>
|
||||||
|
* KidProtect
|
||||||
* Michał Zegan <webczat_200@poczta.onet.pl>
|
* Michał Zegan <webczat_200@poczta.onet.pl>
|
||||||
* AlphaTech <alphat3ch@icloud.com>
|
* AlphaTech <alphat3ch@icloud.com>
|
||||||
* Austin Ellis <siniStar@IRC4Fun.net>
|
* Austin Ellis <siniStar@IRC4Fun.net>
|
||||||
@@ -71,7 +72,6 @@ contributions they have made, are:
|
|||||||
* Jason Foster <retsofaj@gmail.com>
|
* Jason Foster <retsofaj@gmail.com>
|
||||||
* Jeremy <jeremy@ssnet.ca>
|
* Jeremy <jeremy@ssnet.ca>
|
||||||
* Josh Soref
|
* Josh Soref
|
||||||
* KidProtect
|
|
||||||
* KindOne <ineedalifetoday@live.com>
|
* KindOne <ineedalifetoday@live.com>
|
||||||
* linuxdaemon
|
* linuxdaemon
|
||||||
* Mantas MikulÄ—nas <grawity@gmail.com>
|
* Mantas MikulÄ—nas <grawity@gmail.com>
|
||||||
|
|||||||
+191
@@ -1,5 +1,196 @@
|
|||||||
# Anope Change Log
|
# Anope Change Log
|
||||||
|
|
||||||
|
## Anope 2.1.25 (unreleased)
|
||||||
|
|
||||||
|
### Changes
|
||||||
|
|
||||||
|
* Fixed a crash when a temporary ban expires.
|
||||||
|
|
||||||
|
* Fixed a potential crash caused by unusual timestamps being passed to `Anope::strftime`.
|
||||||
|
|
||||||
|
* Fixed confirming accounts when `{ns_register}:registration` is set to "admin".
|
||||||
|
|
||||||
|
* Fixed migrating access entries from xop to flags granting new privileges in cases where multiple privileges share the same flag.
|
||||||
|
|
||||||
|
* Fixed migrating access entries sometimes giving the wrong flags.
|
||||||
|
|
||||||
|
* Fixed not being able to update the description of a flags access entry.
|
||||||
|
|
||||||
|
## Anope 2.1.24 (2026-04-01)
|
||||||
|
|
||||||
|
### Breaking Changes
|
||||||
|
|
||||||
|
* If a database contains duplicate corrupt entries from a prior write failure the oldest ones will now be purged from the database. This is a destructive action so make sure you take a manual backup of your database before upgrading.
|
||||||
|
|
||||||
|
* Removed support for storing the Anope database in Redis. The Redis code was extremely bitrotted, had not been tested in years, and to our knowledge has almost no (if any) users. It is recommended that db_redis users migrate to db_json or db_sql.
|
||||||
|
|
||||||
|
* SQL tables now use versioned prefixes by default. For the SQL database backends the default is `anope21_` and for ChanStats the default is `chanstats21_`. If you do not have a prefix explicitly set in your config you will need to add one it. Alternatively, you may also want to consider exporting to db_json and re-importing to update your SQL schema for the recent database layout changes.
|
||||||
|
|
||||||
|
### Changes
|
||||||
|
|
||||||
|
* Added some helper methods to `CommandSource` to allow quickly translting messages.
|
||||||
|
|
||||||
|
* Changed the Config script to allow multiple dashes in front of options, i.e. `-quick` and `--quick` are now equivalent.
|
||||||
|
|
||||||
|
* Converted some language strings to use format strings instead of concatenation.
|
||||||
|
|
||||||
|
* Fixed a rare crash in the ns_cert module.
|
||||||
|
|
||||||
|
* Fixed building Anope as a unity build.
|
||||||
|
|
||||||
|
* Fixed the ns_cert module erasing certificate entries if using an old database.
|
||||||
|
|
||||||
|
* Fixed users having the wrong real name in log messages on InspIRCd if it has been previously changed with `CHGNAME` or `SETNAME`.
|
||||||
|
|
||||||
|
## Anope 2.1.23 (2026-04-01)
|
||||||
|
|
||||||
|
### Changes
|
||||||
|
|
||||||
|
* Added examples to several BotServ commands.
|
||||||
|
|
||||||
|
* Added missing fields to the `RPL_STATSLINKINFO` output.
|
||||||
|
|
||||||
|
* Added support for migrating access entries between systems (currently only `chanserv/flags` is supported).
|
||||||
|
|
||||||
|
* Added the default levels to the `chanserv/levels` DESC help.
|
||||||
|
|
||||||
|
* Changed access listing commands to only show their own access entries unless `ALL` is specified.
|
||||||
|
|
||||||
|
* Fixed a non-translatable string which has been marked as translatable.
|
||||||
|
|
||||||
|
* Fixed the missing AUTOLOGIN extension.
|
||||||
|
|
||||||
|
* Fixed translating the help output when the flexible layout is used.
|
||||||
|
|
||||||
|
* Improved the accuracy of the X-line expiry time in `operserv/stats`.
|
||||||
|
|
||||||
|
* Updated the Portuguese translation.
|
||||||
|
|
||||||
|
* Updated the Romanian translation.
|
||||||
|
|
||||||
|
## Anope 2.1.22 (2026-03-01)
|
||||||
|
|
||||||
|
### Breaking Changes
|
||||||
|
|
||||||
|
* Automatic login using a known SSL fingerprint now requires the `AUTOLOGIN` option to be set on accounts with `/NS SET AUTOLOGIN ON`. Automatic login is largely obsolete now SASL EXTERNAL exists and is widely supported.
|
||||||
|
|
||||||
|
* Conan 2 is now used for packaging dependencies on Windows. If you are building from source you will need to upgrade Conan.
|
||||||
|
|
||||||
|
* Non-breaking spaces in translatable messages now use 0x1B instead of 0x1A due to recent msgfmt releases treating 0x1A as an EOF character. If you have an out of tree translation you will need to update it.
|
||||||
|
|
||||||
|
* User TLS certificates are now stored in their own `NSCert` table instead of as a column in the `NickCore` table. If you are reading this information you will need to update your code.
|
||||||
|
|
||||||
|
### Changes
|
||||||
|
|
||||||
|
* Fixed `{botserv}:botmodes` erroneously allowing setting non-status modes on channels.
|
||||||
|
|
||||||
|
* Fixed echoing message tags on Solanum.
|
||||||
|
|
||||||
|
* Fixed handling incoming `FIDENT` messages on InspIRCd.
|
||||||
|
|
||||||
|
* Fixed matching stacked extended bans on InspIRCd and UnrealIRCd.
|
||||||
|
|
||||||
|
* Fixed parameter modes in `chanserv/mode` locks erroneously requiring a parameter to unset a lock.
|
||||||
|
|
||||||
|
* Fixed restoring the object identifier when unserialising objects in db_json.
|
||||||
|
|
||||||
|
* Fixed the consistency of indenting and line wrapping command examples in help output.
|
||||||
|
|
||||||
|
* Redesigned the output of `nickserv/list` to show more relevant information.
|
||||||
|
|
||||||
|
```
|
||||||
|
/NICKSERV LIST *
|
||||||
|
-NickServ- List of entries matching *:
|
||||||
|
-NickServ- alice (account: alice)
|
||||||
|
-NickServ- alice|work (account: alice)
|
||||||
|
-NickServ- bob -- Unconfirmed (account: bob)
|
||||||
|
-NickServ- mallory -- Suspended (account: mallory)
|
||||||
|
-NickServ- End of list - 4/4 matches shown.
|
||||||
|
```
|
||||||
|
|
||||||
|
* The cs_set_misc and ns_set_misc modules now can use a separate title from the command name.
|
||||||
|
|
||||||
|
```
|
||||||
|
/NICKSERV SET MASTODON @example@mastodon.social
|
||||||
|
-NickServ- Mastodon for testuser set to @example@mastodon.social
|
||||||
|
```
|
||||||
|
|
||||||
|
* The cs_set_misc and ns_set_misc modules now support validation of user-specified data.
|
||||||
|
|
||||||
|
```
|
||||||
|
/NICKSERV SET MASTODON example.mastodon.social
|
||||||
|
-NickServ- Mastodon syntax is invalid.
|
||||||
|
-NickServ- Syntax: SET MASTODON [@user@host.tld]
|
||||||
|
```
|
||||||
|
|
||||||
|
* The db_atheme module can now import arbitrary metadata to fields from the ns_set_misc module.
|
||||||
|
|
||||||
|
* The local clock will now be checked for synchronisation with the IRCd clock on UnrealIRCd.
|
||||||
|
|
||||||
|
* The `nickserv/cert` command will now show the time a TLS certificate was created and the nickname of the creator if the `VIEW` subcommand is used.
|
||||||
|
|
||||||
|
```
|
||||||
|
/NICKSERV CERT VIEW
|
||||||
|
-NickServ- d41d8cd98f00b204e9800998ecf8427e -- created by nick1 at Wed 25 Feb 00:18:50 GMT
|
||||||
|
```
|
||||||
|
|
||||||
|
* The ns_set_misc module can now add account data to the WHOIS output of authenticated users on InspIRCd (with the swhois_ext module) and UnrealIRCd.
|
||||||
|
|
||||||
|
```
|
||||||
|
/WHOIS nick1
|
||||||
|
* [nick1] (nick1@example.com): nick1
|
||||||
|
* [nick1] Mastodon: @example@mastodon.social
|
||||||
|
* [nick1] irc.example.com :Example-IRC server
|
||||||
|
...
|
||||||
|
* [nick1] End of WHOIS list.
|
||||||
|
```
|
||||||
|
|
||||||
|
* The regex_posix module is now available on Windows (using the PCRE2 POSIX compatibility layer).
|
||||||
|
|
||||||
|
* The regex_tre module is now available on Windows.
|
||||||
|
|
||||||
|
* The Windows dependencies have been updated.
|
||||||
|
|
||||||
|
## Anope 2.1.21 (2026-02-07)
|
||||||
|
|
||||||
|
### Breaking Changes
|
||||||
|
|
||||||
|
* `{fantasy}:fantasycharacter` has been replaced with `{fantasy}:prefix` which allows multiple-character fantasy prefixes. If you have multiple custom fantasy characters set you should separate them with a space when upgrading your config.
|
||||||
|
|
||||||
|
* The db_json module will now terminate the process if it fails to write the database. This replicates the behaviour previously used by the db_flatfile module.
|
||||||
|
|
||||||
|
* When adding an unregistered user to an access list you must now explicitly specify their hostmask. This prevents accidentally adding a hostmask which is too wide.
|
||||||
|
|
||||||
|
### Changes
|
||||||
|
|
||||||
|
* Added cleaning up of hostmasks when adding them to an access list and `{chanserv}:disallow_malformed_hostmask` to allow rejecting them instead.
|
||||||
|
|
||||||
|
* Changed access commands to add the account of a user who is logged in to an account but not using a nickname belonging to that account.
|
||||||
|
|
||||||
|
* Fixed a crash when clearing channel entry messages.
|
||||||
|
|
||||||
|
* Fixed a memory leak when cloning akicks.
|
||||||
|
|
||||||
|
* Fixed cleaning up ban masks.
|
||||||
|
|
||||||
|
* Fixed confirming accounts using the webcpanel.
|
||||||
|
|
||||||
|
* Fixed importing the time a nickname was used from Atheme.
|
||||||
|
|
||||||
|
* Fixed limiting the number of accounts per email address.
|
||||||
|
|
||||||
|
* Fixed locking modes that take a parameter when they are added.
|
||||||
|
|
||||||
|
* Fixed the `chanserv/enforce` command erroneously enforcing against channel founders.
|
||||||
|
|
||||||
|
* Fixed the syntax of the `chanserv/suspend` command.
|
||||||
|
|
||||||
|
* Fixed the syntax of the `nickserv/suspend` command.
|
||||||
|
|
||||||
|
* Improved password rehash detection in the enc_argon2 module.
|
||||||
|
|
||||||
|
* Various minor improvements to how services work internally.
|
||||||
|
|
||||||
## Anope 2.1.20 (2025-12-01)
|
## Anope 2.1.20 (2025-12-01)
|
||||||
|
|
||||||
### Breaking Changes
|
### Breaking Changes
|
||||||
|
|||||||
+1
-1
@@ -3,7 +3,7 @@ if(WIN32)
|
|||||||
# Only install given files from this directory
|
# 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)
|
# 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)
|
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}
|
install(FILES ${DOCS}
|
||||||
DESTINATION ${DOC_DIR}
|
DESTINATION ${DOC_DIR}
|
||||||
)
|
)
|
||||||
|
|||||||
+313
@@ -0,0 +1,313 @@
|
|||||||
|
DOXYFILE_ENCODING = UTF-8
|
||||||
|
PROJECT_NAME = "Anope"
|
||||||
|
PROJECT_NUMBER = 2.0
|
||||||
|
PROJECT_BRIEF =
|
||||||
|
PROJECT_LOGO =
|
||||||
|
PROJECT_ICON = src/win32/anope-icon.ico
|
||||||
|
OUTPUT_DIRECTORY = docs/doxygen
|
||||||
|
CREATE_SUBDIRS = NO
|
||||||
|
CREATE_SUBDIRS_LEVEL = 8
|
||||||
|
ALLOW_UNICODE_NAMES = NO
|
||||||
|
OUTPUT_LANGUAGE = English
|
||||||
|
BRIEF_MEMBER_DESC = YES
|
||||||
|
REPEAT_BRIEF = YES
|
||||||
|
ABBREVIATE_BRIEF = "The $name class" \
|
||||||
|
"The $name widget" \
|
||||||
|
"The $name file" \
|
||||||
|
is \
|
||||||
|
provides \
|
||||||
|
specifies \
|
||||||
|
contains \
|
||||||
|
represents \
|
||||||
|
a \
|
||||||
|
an \
|
||||||
|
the
|
||||||
|
ALWAYS_DETAILED_SEC = NO
|
||||||
|
INLINE_INHERITED_MEMB = NO
|
||||||
|
FULL_PATH_NAMES = YES
|
||||||
|
STRIP_FROM_PATH =
|
||||||
|
STRIP_FROM_INC_PATH =
|
||||||
|
SHORT_NAMES = NO
|
||||||
|
JAVADOC_AUTOBRIEF = NO
|
||||||
|
JAVADOC_BANNER = NO
|
||||||
|
QT_AUTOBRIEF = NO
|
||||||
|
MULTILINE_CPP_IS_BRIEF = NO
|
||||||
|
PYTHON_DOCSTRING = YES
|
||||||
|
INHERIT_DOCS = YES
|
||||||
|
SEPARATE_MEMBER_PAGES = NO
|
||||||
|
TAB_SIZE = 4
|
||||||
|
ALIASES =
|
||||||
|
OPTIMIZE_OUTPUT_FOR_C = NO
|
||||||
|
OPTIMIZE_OUTPUT_JAVA = NO
|
||||||
|
OPTIMIZE_FOR_FORTRAN = NO
|
||||||
|
OPTIMIZE_OUTPUT_VHDL = NO
|
||||||
|
OPTIMIZE_OUTPUT_SLICE = NO
|
||||||
|
EXTENSION_MAPPING =
|
||||||
|
MARKDOWN_SUPPORT = YES
|
||||||
|
TOC_INCLUDE_HEADINGS = 5
|
||||||
|
MARKDOWN_ID_STYLE = GITHUB
|
||||||
|
AUTOLINK_SUPPORT = YES
|
||||||
|
AUTOLINK_IGNORE_WORDS =
|
||||||
|
BUILTIN_STL_SUPPORT = YES
|
||||||
|
CPP_CLI_SUPPORT = NO
|
||||||
|
SIP_SUPPORT = NO
|
||||||
|
IDL_PROPERTY_SUPPORT = YES
|
||||||
|
DISTRIBUTE_GROUP_DOC = NO
|
||||||
|
GROUP_NESTED_COMPOUNDS = NO
|
||||||
|
SUBGROUPING = YES
|
||||||
|
INLINE_GROUPED_CLASSES = NO
|
||||||
|
INLINE_SIMPLE_STRUCTS = NO
|
||||||
|
TYPEDEF_HIDES_STRUCT = NO
|
||||||
|
LOOKUP_CACHE_SIZE = 0
|
||||||
|
NUM_PROC_THREADS = 0
|
||||||
|
TIMESTAMP = NO
|
||||||
|
EXTRACT_ALL = YES
|
||||||
|
EXTRACT_PRIVATE = NO
|
||||||
|
EXTRACT_PRIV_VIRTUAL = NO
|
||||||
|
EXTRACT_PACKAGE = NO
|
||||||
|
EXTRACT_STATIC = NO
|
||||||
|
EXTRACT_LOCAL_CLASSES = NO
|
||||||
|
EXTRACT_LOCAL_METHODS = NO
|
||||||
|
EXTRACT_ANON_NSPACES = NO
|
||||||
|
RESOLVE_UNNAMED_PARAMS = YES
|
||||||
|
HIDE_UNDOC_MEMBERS = NO
|
||||||
|
HIDE_UNDOC_CLASSES = NO
|
||||||
|
HIDE_UNDOC_NAMESPACES = YES
|
||||||
|
HIDE_FRIEND_COMPOUNDS = NO
|
||||||
|
HIDE_IN_BODY_DOCS = NO
|
||||||
|
INTERNAL_DOCS = NO
|
||||||
|
CASE_SENSE_NAMES = SYSTEM
|
||||||
|
HIDE_SCOPE_NAMES = NO
|
||||||
|
HIDE_COMPOUND_REFERENCE= NO
|
||||||
|
SHOW_HEADERFILE = YES
|
||||||
|
SHOW_INCLUDE_FILES = YES
|
||||||
|
SHOW_GROUPED_MEMB_INC = NO
|
||||||
|
FORCE_LOCAL_INCLUDES = NO
|
||||||
|
INLINE_INFO = YES
|
||||||
|
SORT_MEMBER_DOCS = YES
|
||||||
|
SORT_BRIEF_DOCS = NO
|
||||||
|
SORT_MEMBERS_CTORS_1ST = NO
|
||||||
|
SORT_GROUP_NAMES = NO
|
||||||
|
SORT_BY_SCOPE_NAME = NO
|
||||||
|
STRICT_PROTO_MATCHING = NO
|
||||||
|
GENERATE_TODOLIST = YES
|
||||||
|
GENERATE_TESTLIST = YES
|
||||||
|
GENERATE_BUGLIST = YES
|
||||||
|
GENERATE_DEPRECATEDLIST= YES
|
||||||
|
ENABLED_SECTIONS =
|
||||||
|
MAX_INITIALIZER_LINES = 30
|
||||||
|
SHOW_USED_FILES = YES
|
||||||
|
SHOW_FILES = YES
|
||||||
|
SHOW_NAMESPACES = YES
|
||||||
|
FILE_VERSION_FILTER =
|
||||||
|
LAYOUT_FILE =
|
||||||
|
CITE_BIB_FILES =
|
||||||
|
EXTERNAL_TOOL_PATH =
|
||||||
|
QUIET = NO
|
||||||
|
WARNINGS = YES
|
||||||
|
WARN_IF_UNDOCUMENTED = NO
|
||||||
|
WARN_IF_DOC_ERROR = YES
|
||||||
|
WARN_IF_INCOMPLETE_DOC = YES
|
||||||
|
WARN_NO_PARAMDOC = NO
|
||||||
|
WARN_IF_UNDOC_ENUM_VAL = NO
|
||||||
|
WARN_LAYOUT_FILE = YES
|
||||||
|
WARN_AS_ERROR = NO
|
||||||
|
WARN_FORMAT = "$file:$line: $text"
|
||||||
|
WARN_LINE_FORMAT = "at line $line of file $file"
|
||||||
|
WARN_LOGFILE =
|
||||||
|
INPUT = README.md \
|
||||||
|
include
|
||||||
|
INPUT_ENCODING = UTF-8
|
||||||
|
INPUT_FILE_ENCODING =
|
||||||
|
FILE_PATTERNS =
|
||||||
|
RECURSIVE = YES
|
||||||
|
EXCLUDE =
|
||||||
|
EXCLUDE_SYMLINKS = YES
|
||||||
|
EXCLUDE_PATTERNS =
|
||||||
|
EXCLUDE_SYMBOLS =
|
||||||
|
EXAMPLE_PATH =
|
||||||
|
EXAMPLE_PATTERNS =
|
||||||
|
EXAMPLE_RECURSIVE = NO
|
||||||
|
IMAGE_PATH =
|
||||||
|
INPUT_FILTER =
|
||||||
|
FILTER_PATTERNS =
|
||||||
|
FILTER_SOURCE_FILES = NO
|
||||||
|
FILTER_SOURCE_PATTERNS =
|
||||||
|
USE_MDFILE_AS_MAINPAGE = README.md
|
||||||
|
IMPLICIT_DIR_DOCS = YES
|
||||||
|
FORTRAN_COMMENT_AFTER = 72
|
||||||
|
SOURCE_BROWSER = NO
|
||||||
|
INLINE_SOURCES = NO
|
||||||
|
STRIP_CODE_COMMENTS = YES
|
||||||
|
REFERENCED_BY_RELATION = NO
|
||||||
|
REFERENCES_RELATION = NO
|
||||||
|
REFERENCES_LINK_SOURCE = YES
|
||||||
|
SOURCE_TOOLTIPS = YES
|
||||||
|
USE_HTAGS = NO
|
||||||
|
VERBATIM_HEADERS = YES
|
||||||
|
ALPHABETICAL_INDEX = YES
|
||||||
|
IGNORE_PREFIX =
|
||||||
|
GENERATE_HTML = YES
|
||||||
|
HTML_OUTPUT = html
|
||||||
|
HTML_FILE_EXTENSION = .html
|
||||||
|
HTML_HEADER =
|
||||||
|
HTML_FOOTER =
|
||||||
|
HTML_STYLESHEET =
|
||||||
|
HTML_EXTRA_STYLESHEET =
|
||||||
|
HTML_EXTRA_FILES =
|
||||||
|
HTML_COLORSTYLE = AUTO_LIGHT
|
||||||
|
HTML_COLORSTYLE_HUE = 220
|
||||||
|
HTML_COLORSTYLE_SAT = 100
|
||||||
|
HTML_COLORSTYLE_GAMMA = 80
|
||||||
|
HTML_DYNAMIC_MENUS = YES
|
||||||
|
HTML_DYNAMIC_SECTIONS = NO
|
||||||
|
HTML_CODE_FOLDING = YES
|
||||||
|
HTML_COPY_CLIPBOARD = YES
|
||||||
|
HTML_PROJECT_COOKIE =
|
||||||
|
HTML_INDEX_NUM_ENTRIES = 100
|
||||||
|
GENERATE_DOCSET = NO
|
||||||
|
DOCSET_FEEDNAME = "Doxygen generated documentation"
|
||||||
|
DOCSET_FEEDURL =
|
||||||
|
DOCSET_BUNDLE_ID = org.doxygen.Project
|
||||||
|
DOCSET_PUBLISHER_ID = org.doxygen.Publisher
|
||||||
|
DOCSET_PUBLISHER_NAME = Publisher
|
||||||
|
GENERATE_HTMLHELP = NO
|
||||||
|
CHM_FILE =
|
||||||
|
HHC_LOCATION =
|
||||||
|
GENERATE_CHI = NO
|
||||||
|
CHM_INDEX_ENCODING =
|
||||||
|
BINARY_TOC = NO
|
||||||
|
TOC_EXPAND = NO
|
||||||
|
SITEMAP_URL =
|
||||||
|
GENERATE_QHP = NO
|
||||||
|
QCH_FILE =
|
||||||
|
QHP_NAMESPACE = org.doxygen.Project
|
||||||
|
QHP_VIRTUAL_FOLDER = doc
|
||||||
|
QHP_CUST_FILTER_NAME =
|
||||||
|
QHP_CUST_FILTER_ATTRS =
|
||||||
|
QHP_SECT_FILTER_ATTRS =
|
||||||
|
QHG_LOCATION =
|
||||||
|
GENERATE_ECLIPSEHELP = NO
|
||||||
|
ECLIPSE_DOC_ID = org.doxygen.Project
|
||||||
|
DISABLE_INDEX = NO
|
||||||
|
GENERATE_TREEVIEW = NO
|
||||||
|
FULL_SIDEBAR = NO
|
||||||
|
ENUM_VALUES_PER_LINE = 4
|
||||||
|
SHOW_ENUM_VALUES = NO
|
||||||
|
TREEVIEW_WIDTH = 250
|
||||||
|
EXT_LINKS_IN_WINDOW = NO
|
||||||
|
OBFUSCATE_EMAILS = YES
|
||||||
|
HTML_FORMULA_FORMAT = png
|
||||||
|
FORMULA_FONTSIZE = 10
|
||||||
|
FORMULA_MACROFILE =
|
||||||
|
USE_MATHJAX = NO
|
||||||
|
MATHJAX_VERSION = MathJax_2
|
||||||
|
MATHJAX_FORMAT = HTML-CSS
|
||||||
|
MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest
|
||||||
|
MATHJAX_EXTENSIONS =
|
||||||
|
MATHJAX_CODEFILE =
|
||||||
|
SEARCHENGINE = YES
|
||||||
|
SERVER_BASED_SEARCH = NO
|
||||||
|
EXTERNAL_SEARCH = NO
|
||||||
|
SEARCHENGINE_URL =
|
||||||
|
SEARCHDATA_FILE = searchdata.xml
|
||||||
|
EXTERNAL_SEARCH_ID =
|
||||||
|
EXTRA_SEARCH_MAPPINGS =
|
||||||
|
GENERATE_LATEX = NO
|
||||||
|
LATEX_OUTPUT = latex
|
||||||
|
LATEX_CMD_NAME =
|
||||||
|
MAKEINDEX_CMD_NAME = makeindex
|
||||||
|
LATEX_MAKEINDEX_CMD = makeindex
|
||||||
|
COMPACT_LATEX = NO
|
||||||
|
PAPER_TYPE = a4
|
||||||
|
EXTRA_PACKAGES =
|
||||||
|
LATEX_HEADER =
|
||||||
|
LATEX_FOOTER =
|
||||||
|
LATEX_EXTRA_STYLESHEET =
|
||||||
|
LATEX_EXTRA_FILES =
|
||||||
|
PDF_HYPERLINKS = YES
|
||||||
|
USE_PDFLATEX = YES
|
||||||
|
LATEX_BATCHMODE = NO
|
||||||
|
LATEX_HIDE_INDICES = NO
|
||||||
|
LATEX_BIB_STYLE = plainnat
|
||||||
|
LATEX_EMOJI_DIRECTORY =
|
||||||
|
GENERATE_RTF = NO
|
||||||
|
RTF_OUTPUT = rtf
|
||||||
|
COMPACT_RTF = NO
|
||||||
|
RTF_HYPERLINKS = NO
|
||||||
|
RTF_STYLESHEET_FILE =
|
||||||
|
RTF_EXTENSIONS_FILE =
|
||||||
|
RTF_EXTRA_FILES =
|
||||||
|
GENERATE_MAN = NO
|
||||||
|
MAN_OUTPUT = man
|
||||||
|
MAN_EXTENSION = .3
|
||||||
|
MAN_SUBDIR =
|
||||||
|
MAN_LINKS = NO
|
||||||
|
GENERATE_XML = NO
|
||||||
|
XML_OUTPUT = xml
|
||||||
|
XML_PROGRAMLISTING = YES
|
||||||
|
XML_NS_MEMB_FILE_SCOPE = NO
|
||||||
|
GENERATE_DOCBOOK = NO
|
||||||
|
DOCBOOK_OUTPUT = docbook
|
||||||
|
GENERATE_AUTOGEN_DEF = NO
|
||||||
|
GENERATE_SQLITE3 = NO
|
||||||
|
SQLITE3_OUTPUT = sqlite3
|
||||||
|
SQLITE3_RECREATE_DB = YES
|
||||||
|
GENERATE_PERLMOD = NO
|
||||||
|
PERLMOD_LATEX = NO
|
||||||
|
PERLMOD_PRETTY = YES
|
||||||
|
PERLMOD_MAKEVAR_PREFIX =
|
||||||
|
ENABLE_PREPROCESSING = YES
|
||||||
|
MACRO_EXPANSION = YES
|
||||||
|
EXPAND_ONLY_PREDEF = NO
|
||||||
|
SEARCH_INCLUDES = YES
|
||||||
|
INCLUDE_PATH =
|
||||||
|
INCLUDE_FILE_PATTERNS =
|
||||||
|
PREDEFINED = CoreExport=/**/ \
|
||||||
|
ATTR_NOT_NULL(...)=/**/
|
||||||
|
EXPAND_AS_DEFINED =
|
||||||
|
SKIP_FUNCTION_MACROS = YES
|
||||||
|
TAGFILES =
|
||||||
|
GENERATE_TAGFILE =
|
||||||
|
ALLEXTERNALS = NO
|
||||||
|
EXTERNAL_GROUPS = YES
|
||||||
|
EXTERNAL_PAGES = YES
|
||||||
|
HIDE_UNDOC_RELATIONS = YES
|
||||||
|
HAVE_DOT = NO
|
||||||
|
DOT_NUM_THREADS = 0
|
||||||
|
DOT_COMMON_ATTR = "fontname=Helvetica,fontsize=10"
|
||||||
|
DOT_EDGE_ATTR = "labelfontname=Helvetica,labelfontsize=10"
|
||||||
|
DOT_NODE_ATTR = "shape=box,height=0.2,width=0.4"
|
||||||
|
DOT_FONTPATH =
|
||||||
|
CLASS_GRAPH = YES
|
||||||
|
COLLABORATION_GRAPH = YES
|
||||||
|
GROUP_GRAPHS = YES
|
||||||
|
UML_LOOK = NO
|
||||||
|
UML_LIMIT_NUM_FIELDS = 10
|
||||||
|
DOT_UML_DETAILS = NO
|
||||||
|
DOT_WRAP_THRESHOLD = 17
|
||||||
|
TEMPLATE_RELATIONS = NO
|
||||||
|
INCLUDE_GRAPH = YES
|
||||||
|
INCLUDED_BY_GRAPH = YES
|
||||||
|
CALL_GRAPH = NO
|
||||||
|
CALLER_GRAPH = NO
|
||||||
|
GRAPHICAL_HIERARCHY = YES
|
||||||
|
DIRECTORY_GRAPH = YES
|
||||||
|
DIR_GRAPH_MAX_DEPTH = 1
|
||||||
|
DOT_IMAGE_FORMAT = png
|
||||||
|
INTERACTIVE_SVG = NO
|
||||||
|
DOT_PATH =
|
||||||
|
DOTFILE_DIRS =
|
||||||
|
DIA_PATH =
|
||||||
|
DIAFILE_DIRS =
|
||||||
|
PLANTUML_JAR_PATH =
|
||||||
|
PLANTUML_CFG_FILE =
|
||||||
|
PLANTUML_INCLUDE_PATH =
|
||||||
|
PLANTUMLFILE_DIRS =
|
||||||
|
DOT_GRAPH_MAX_NODES = 50
|
||||||
|
MAX_DOT_GRAPH_DEPTH = 0
|
||||||
|
DOT_MULTI_TARGETS = NO
|
||||||
|
GENERATE_LEGEND = YES
|
||||||
|
DOT_CLEANUP = YES
|
||||||
|
MSCGEN_TOOL =
|
||||||
|
MSCFILE_DIRS =
|
||||||
+3
-4
@@ -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.
|
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
|
2) Adding a new language
|
||||||
|
|
||||||
@@ -29,11 +29,10 @@ Anope Multi Language Support
|
|||||||
po files (especially on Windows).
|
po files (especially on Windows).
|
||||||
|
|
||||||
There are several control characters within the messages. These are mostly IRC formatting codes (https://modern.ircdocs.horse/formatting)
|
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!
|
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
|
If you have finished a language file translation and you want others to use it, please file a pull request on GitHub.
|
||||||
or send it to team@anope.org (don't forget to mention clearly your (nick)name, your email and the language name).
|
|
||||||
You'll of course get full credit for it.
|
You'll of course get full credit for it.
|
||||||
|
|
||||||
3) Using languages with modules
|
3) Using languages with modules
|
||||||
|
|||||||
+1
-1
@@ -43,7 +43,7 @@ Anope Modules
|
|||||||
|
|
||||||
MODLOAD Load a module
|
MODLOAD Load a module
|
||||||
MODRELOAD Reload a module
|
MODRELOAD Reload a module
|
||||||
MODUNLOAD Un-Load a module
|
MODUNLOAD Unload a module
|
||||||
MODLIST List loaded modules
|
MODLIST List loaded modules
|
||||||
MODINFO Info about a loaded module
|
MODINFO Info about a loaded module
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
Anope -- a set of IRC services for IRC networks
|
Anope -- a set of IRC services for IRC networks
|
||||||
-----------------------------------------------
|
-----------------------------------------------
|
||||||
|
|
||||||
Anope is 2003-2025 Anope Team <team@anope.org>.
|
Anope is 2003-2026 Anope Team <team@anope.org>.
|
||||||
Based on Epona 2000-2002 PegSoft <epona@pegsoft.net>.
|
Based on Epona 2000-2002 PegSoft <epona@pegsoft.net>.
|
||||||
Based on Services 1996-1999 Andrew Church <achurch@achurch.org>.
|
Based on Services 1996-1999 Andrew Church <achurch@achurch.org>.
|
||||||
|
|
||||||
|
|||||||
-160
@@ -1,160 +0,0 @@
|
|||||||
Anope has Redis database support (https://redis.io/).
|
|
||||||
This document explains the data structure used by Anope, and explains how
|
|
||||||
keyspace notification works.
|
|
||||||
|
|
||||||
This is not a tutorial on how to use Redis, see https://redis.io/documentation
|
|
||||||
for that.
|
|
||||||
|
|
||||||
Table of Contents
|
|
||||||
-----------------
|
|
||||||
1) Data structure
|
|
||||||
2) Keyspace notifications
|
|
||||||
3) Examples of modifying, deleting, and creating objects
|
|
||||||
|
|
||||||
1) Data structure
|
|
||||||
|
|
||||||
There are 4 key namespaces in Anope, they are:
|
|
||||||
|
|
||||||
id - The keys in id are used to atomically create object ids for new
|
|
||||||
objects. For example, if I were to create a new BotInfo I would first:
|
|
||||||
|
|
||||||
redis 127.0.0.1:6379> INCR id:BotInfo
|
|
||||||
|
|
||||||
To get the object ID of the new object.
|
|
||||||
|
|
||||||
ids - The keys in ids contain a set of all object ids of the given type.
|
|
||||||
For example:
|
|
||||||
|
|
||||||
redis 127.0.0.1:6379> SMEMBERS ids:BotInfo
|
|
||||||
|
|
||||||
Returns "1", "2", "3", "4", "5", "6", "7", "8" because I have 8 bots that
|
|
||||||
have IDs 1, 2, 3, 4, 5, 6, 7, and 8, respectively.
|
|
||||||
|
|
||||||
hash - The keys in hash are the actual objects, stored as hashes. For
|
|
||||||
example, if I had just looked up all BotInfo ids and wanted to iterate
|
|
||||||
over all of them, I would start by:
|
|
||||||
|
|
||||||
redis 127.0.0.1:6379> HGETALL hash:BotInfo:1
|
|
||||||
|
|
||||||
Which gets all keys and values from the hash of type BotInfo with id 1.
|
|
||||||
This may return:
|
|
||||||
|
|
||||||
"nick" -> "BotServ"
|
|
||||||
"user" -> "services"
|
|
||||||
"host" -> "services.anope.org"
|
|
||||||
"created" -> "1368704765"
|
|
||||||
|
|
||||||
value - The keys in value only exist to aid looking up object IDs. They
|
|
||||||
are sets of object IDs and are used to map key+value pairs to objects.
|
|
||||||
For example:
|
|
||||||
|
|
||||||
redis 127.0.0.1:6379> SMEMBERS value:NickAlias:nick:Adam
|
|
||||||
|
|
||||||
Returns a set of object ids of NickAlias objects that have the key
|
|
||||||
'nick' set to the value 'Adam' in its hash. Clearly this can only
|
|
||||||
ever contain at most one object, since it is not possible to have
|
|
||||||
more than one registered nick with the same name, but other keys
|
|
||||||
will contain more than one, such as:
|
|
||||||
|
|
||||||
redis 127.0.0.1:6379> SMEMBERS value:NickCore:email:adam@anope.org
|
|
||||||
|
|
||||||
Which would return all accounts with the email "adam@anope.org".
|
|
||||||
|
|
||||||
redis 127.0.0.1:6379> SMEMBERS value:ChanAccess:mask:Adam
|
|
||||||
|
|
||||||
Which would return all access entries set on the account "Adam".
|
|
||||||
|
|
||||||
Behavior similar to SQL's AND, can be achieved using the
|
|
||||||
SINTER command, which does set intersection on one or more sets.
|
|
||||||
|
|
||||||
2) Keyspace notifications
|
|
||||||
|
|
||||||
Redis 2.7 (unstable) and 2.8 (stable) and newer support keyspace notifications
|
|
||||||
(https://redis.io/topics/notifications). This allows Redis to notify Anope of
|
|
||||||
any external changes to objects in the database. Once notified, Anope will
|
|
||||||
immediately update the object. Otherwise, Anope keeps all objects in memory
|
|
||||||
and will not regularly read from the database once started.
|
|
||||||
|
|
||||||
You can use this to modify objects in Redis and have them immediately reflected
|
|
||||||
back into Anope. Additionally you can use this feature to run multiple Anope
|
|
||||||
instances simultaneously from the same database (see also, Redis database
|
|
||||||
replication).
|
|
||||||
|
|
||||||
To use keyspace notifications you MUST execute
|
|
||||||
|
|
||||||
redis 127.0.0.1:6379> CONFIG SET notify-keyspace-events KA
|
|
||||||
OK
|
|
||||||
|
|
||||||
or set notify-keyspace-events in redis.conf properly. Anope always executes
|
|
||||||
CONFIG SET when it first connects.
|
|
||||||
|
|
||||||
If you do not enable keyspace events properly Anope will be UNABLE to see any
|
|
||||||
object modifications you do.
|
|
||||||
|
|
||||||
The key space ids and value are managed entirely by Anope, you do
|
|
||||||
not (and should not) modify them. Once you modify the object (hash), Anope will
|
|
||||||
update them for you to correctly reflect any changes made to the object.
|
|
||||||
|
|
||||||
Finally, always use atomic operations. If you are inserting a new object with
|
|
||||||
multiple commands, or inserting multiple objects at once, specifically if the
|
|
||||||
objects depend on each other, you MUST use a transaction.
|
|
||||||
|
|
||||||
3) Examples of modifying, deleting, and creating objects
|
|
||||||
|
|
||||||
These examples will ONLY work if you meet the criteria in section 2.
|
|
||||||
|
|
||||||
If I want to change the email account 'Adam' to 'Adam@anope.org', I would execute the following:
|
|
||||||
|
|
||||||
redis 127.0.0.1:6379> SMEMBERS value:NickCore:display:Adam
|
|
||||||
|
|
||||||
Which returns a value of "1", which is the object id I want to modify.
|
|
||||||
Now to change the email:
|
|
||||||
|
|
||||||
redis 127.0.0.1:6379> HSET hash:NickCore:1 email Adam@anope.org
|
|
||||||
|
|
||||||
You can now see this in NickServ's INFO command:
|
|
||||||
-NickServ- Email address: Adam@anope.org
|
|
||||||
|
|
||||||
If I want to drop the account "Adam", I would execute the following:
|
|
||||||
|
|
||||||
redis 127.0.0.1:6379> SMEMBERS value:NickCore:display:Adam
|
|
||||||
|
|
||||||
Which returns a value of "1". I would then check:
|
|
||||||
|
|
||||||
redis 127.0.0.1:6379> SMEMBERS value:NickAlias:nc:Adam
|
|
||||||
|
|
||||||
To see what nicknames depend on this account to exist, as I will
|
|
||||||
have to remove those too. This returns the values "2", and "3".
|
|
||||||
|
|
||||||
Finally, I can drop the nick using a transaction via:
|
|
||||||
|
|
||||||
redis 127.0.0.1:6379> MULTI
|
|
||||||
OK
|
|
||||||
redis 127.0.0.1:6379> DEL hash:NickAlias:2
|
|
||||||
QUEUED
|
|
||||||
redis 127.0.0.1:6379> DEL hash:NickAlias:3
|
|
||||||
QUEUED
|
|
||||||
redis 127.0.0.1:6379> DEL hash:NickCore:1
|
|
||||||
QUEUED
|
|
||||||
redis 127.0.0.1:6379> EXEC
|
|
||||||
|
|
||||||
Or alternatively simply:
|
|
||||||
|
|
||||||
redis 127.0.0.1:6379> DEL hash:NickAlias:2 hash:NickAlias:3 hash:NickCore:1
|
|
||||||
|
|
||||||
If I wanted to create a BotServ bot, I would execute the following:
|
|
||||||
|
|
||||||
redis 127.0.0.1:6379> INCR id:BotInfo
|
|
||||||
|
|
||||||
Which returns a new object ID for me, in this example it will be "8".
|
|
||||||
Now I can create the object:
|
|
||||||
|
|
||||||
HMSET hash:BotInfo:8 nick redis user redis host services.anope.org realname "Anope IRC Services"
|
|
||||||
|
|
||||||
Note if you are using HSET instead of HMSET you will need to use a transaction, as shown in the above example.
|
|
||||||
If you are watching your services logs you will immediately see:
|
|
||||||
|
|
||||||
USERS: redis!redis@services.anope.org (Anope IRC Services) connected to the network (services.anope.org)
|
|
||||||
|
|
||||||
And the bot redis will be in BotServ's bot list.
|
|
||||||
Notice how ids:BotInfo and the value keys are updated automatically.
|
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
# Building Anope on Windows
|
||||||
|
|
||||||
|
## Dependencies
|
||||||
|
|
||||||
|
You will need the following software installed to build Anope:
|
||||||
|
|
||||||
|
* [CMake 3.20 or newer](https://cmake.org/download/#latest)
|
||||||
|
* [Conan 2 or newer](https://conan.io/downloads) (optional if you don't want to build extra modules)
|
||||||
|
* [NSIS 3 or newer](https://nsis.sourceforge.io/Download)
|
||||||
|
* [Visual Studio 2022 or newer](https://visualstudio.microsoft.com/downloads/) (*NOT* Visual Studio Code)
|
||||||
|
|
||||||
|
## Building
|
||||||
|
|
||||||
|
First you need to download the latest version of the Anope source code from [the releases page](https://github.com/anope/anope/releases) and unpack it using Windows Explorer.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Once you have the source code unpacked you need open the Command Prompt and move to the directory in which Anope has been unpacked. You can do this by pressing Control+R and then entering `cmd.exe` and pressing enter. Once the terminal opens you can move to the directory using the following command (assuming you unpacked to `C:\Users\Example\Downloads\anope-2.1`):
|
||||||
|
|
||||||
|
```cmd
|
||||||
|
cd C:\Users\Example\Downloads\anope-2.1
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
If you want to build with multiple-language support or want to use the enc_argon2, mysql, regex_pcre2, regex_posix, regex_tre, sqlite, or ssl_openssl extra modules you will now need to install the third-party dependencies using Conan. Before you can do this you need to create a Conan profile for C++17 using the following command:
|
||||||
|
|
||||||
|
```cmd
|
||||||
|
conan profile detect
|
||||||
|
notepad ~\.conan2\profiles\default
|
||||||
|
```
|
||||||
|
|
||||||
|
When Notepad opens you should find the line beginning with `compiler.cppstd=` and replace the entire line with `compiler.cppstd=17` and save the file.
|
||||||
|
|
||||||
|
Now you're ready to install the third-party dependencies using the following command:
|
||||||
|
|
||||||
|
|
||||||
|
```cmd
|
||||||
|
conan install .\src\win32 --build missing --deployer runtime_deploy --deployer-folder .\build\extradll --output-folder .
|
||||||
|
call .\conanbuild.bat
|
||||||
|
```
|
||||||
|
|
||||||
|
This will probably take a long time if its the first time you have run it.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Now you're ready to build Anope.
|
||||||
|
|
||||||
|
```cmd
|
||||||
|
cd .\build
|
||||||
|
cmake -A x64 -D "CMAKE_BUILD_TYPE=Release" -D "CMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake" ..
|
||||||
|
msbuild PACKAGE.vcxproj /P:Configuration=Release /P:Platform=x64 /VERBOSITY:MINIMAL
|
||||||
|
```
|
||||||
|
|
||||||
|
Once the build finishes the installer will be available in the build directory. You can install this by opening the directory in Windows Explorer and then running it as you would with most Windows installers.
|
||||||
|
|
||||||
|
Once installed Anope will be available at `C:\Program Files\Anope`.
|
||||||
-161
@@ -1,161 +0,0 @@
|
|||||||
Anope for Windows
|
|
||||||
-----------------
|
|
||||||
|
|
||||||
1) Building the Source
|
|
||||||
2) Installation
|
|
||||||
3) Compiling Modules
|
|
||||||
4) Other compile options
|
|
||||||
5) Credits
|
|
||||||
|
|
||||||
1) Building the Source
|
|
||||||
|
|
||||||
NOTE: If you have downloaded one of the pre-compiled installers, you do
|
|
||||||
NOT need to complete this step, and you can proceed to step 2.
|
|
||||||
|
|
||||||
If you want to build Anope from source on a Win32 system, you will need
|
|
||||||
to follow this instructions:
|
|
||||||
|
|
||||||
1) Download the required files:
|
|
||||||
|
|
||||||
* Current Anope source:
|
|
||||||
https://github.com/anope/anope/releases
|
|
||||||
|
|
||||||
* CMake:
|
|
||||||
https://cmake.org/download/
|
|
||||||
|
|
||||||
(NOTE: When installing, tell CMake to add itself to the PATH.)
|
|
||||||
|
|
||||||
If you have Visual C++ 10 or 11 (2010/2012) skip ahead to step 2, else you
|
|
||||||
need to download and install the following free component from Microsoft.
|
|
||||||
|
|
||||||
* Microsoft Visual C++ 2010 Express Edition:
|
|
||||||
http://www.microsoft.com/visualstudio/eng/downloads#d-2010-express
|
|
||||||
|
|
||||||
2) Unpack the Anope tarball with your favorite uncompression program
|
|
||||||
(WinZip or WinRAR, etc).
|
|
||||||
|
|
||||||
3) Bring up the Visual C++ Command Prompt; This will launch a
|
|
||||||
DOS Command Prompt like window, which will set the environment
|
|
||||||
properties needed to make Anope.
|
|
||||||
|
|
||||||
Create a new directory, which will be used to hold the build files. You can make it
|
|
||||||
be a directory under the source directory unpacked in step 2, or somewhere else entirely.
|
|
||||||
|
|
||||||
Change directories to this new folder, by typing:
|
|
||||||
|
|
||||||
cd <path to build directory>
|
|
||||||
|
|
||||||
e.g.
|
|
||||||
|
|
||||||
cd c:\anope-build
|
|
||||||
|
|
||||||
4) You now need to configure Anope to your requirements. At the prompt type:
|
|
||||||
|
|
||||||
<path to source directory>\Config.exe
|
|
||||||
|
|
||||||
NOTE: If you run an Anti-Virus program such as McAfee or Norton, you may
|
|
||||||
be unable to run this command due to the protection in place. Some Anti-
|
|
||||||
Virus programs may detect the Anope Configuration Tool as a worm, however
|
|
||||||
this is not the case. If you are prompted to allow or deny execution of
|
|
||||||
the script, you should choose allow. If the script fails to run, and no
|
|
||||||
notice is displayed, please check your Anti-Virus settings before seeking
|
|
||||||
assistance.
|
|
||||||
|
|
||||||
An interactive configuration program should guide you through the install
|
|
||||||
options. You will be given a choice to use NMake or not. NMake will compile
|
|
||||||
inside the command prompt window you are in. If you want to build within
|
|
||||||
the Visual C++ IDE, say no to that option, and it'll create a Solution for
|
|
||||||
you to open up.
|
|
||||||
|
|
||||||
If you cannot find whats causing the error, please visit our forums or
|
|
||||||
our IRC Support channel for assistance.
|
|
||||||
|
|
||||||
Some Anope modules require third party libraries, such as mysql and
|
|
||||||
the SSL modules. If these libraries are installed in nonstandard
|
|
||||||
locations, cmake will probably not find them and should be told where
|
|
||||||
they are by passing their location to Config.
|
|
||||||
|
|
||||||
The libraries used to build the 'extra' modules are available at
|
|
||||||
https://github.com/Adam-/windows-scripts.
|
|
||||||
|
|
||||||
5) You are now ready to compile. If you said you wanted to use NMake in step 4,
|
|
||||||
at the prompt type:
|
|
||||||
|
|
||||||
nmake
|
|
||||||
|
|
||||||
Once you are back at the command prompt again, if there have been no
|
|
||||||
errors, you are ready to go.
|
|
||||||
|
|
||||||
If instead you decided to use the Visual C++ IDE, open up the Anope.sln
|
|
||||||
file. After the IDE has fully loaded, hit F7 to build everything.
|
|
||||||
|
|
||||||
Should you encounter errors with the installation process, check the
|
|
||||||
messages displayed for advice on resolving them. If you are unable to
|
|
||||||
resolve the issues yourself, seek assistance on our forums or in our
|
|
||||||
IRC Support channel.
|
|
||||||
|
|
||||||
6) Finally you will need to install Anope. If you said you wanted to use NMake
|
|
||||||
in step 4, at the prompt type:
|
|
||||||
|
|
||||||
nmake install
|
|
||||||
|
|
||||||
Otherwise, if you decided to use the Visual C++ IDE, find the project called
|
|
||||||
INSTALL within the Solution Explorer. Right-click on INSTALL and choose Build.
|
|
||||||
|
|
||||||
When you have done this, all the files will be installed to where they belong.
|
|
||||||
The only thing you need to do is rename "data/anope.example.conf" to be "data/anope.conf",
|
|
||||||
and then follow the steps to set up Anope.
|
|
||||||
|
|
||||||
You have now completed the building phase of Anope for Windows. You can
|
|
||||||
now move on to the next section, which is related to setting up Anope.
|
|
||||||
|
|
||||||
2) Installation
|
|
||||||
|
|
||||||
Since Anope for Windows does not use a visual interface, you must do the
|
|
||||||
configuration with a text editor before proceeding with running Anope
|
|
||||||
itself.
|
|
||||||
|
|
||||||
NOTE: You may need to open the configuration file with Wordpad, or a text
|
|
||||||
editor which supports UNIX line endings. Opening the configuration file in
|
|
||||||
Notepad will cause strange characters to appear, and you may not be able to
|
|
||||||
edit the file correctly.
|
|
||||||
|
|
||||||
Open anope.conf, and read through it carefully and adjust the settings
|
|
||||||
you think you need to adjust.
|
|
||||||
|
|
||||||
If you are unsure of the settings, you can go to the dos command prompt
|
|
||||||
and run "anope.exe --nofork --debug" and watch the information as it
|
|
||||||
attempts to connect.
|
|
||||||
|
|
||||||
You can launch services in two ways. If you are sure that the entered
|
|
||||||
configuration information is correct, simply double clicking the Anope
|
|
||||||
executable will cause it to start; no window will pop up. If you'd rather
|
|
||||||
have a more textual output, you can start at the dos prompt and type in
|
|
||||||
"anope.exe". If services are successfully started up the dos prompt will
|
|
||||||
seem to hang; at this point you can safely close the dos window.
|
|
||||||
|
|
||||||
3) Compiling Modules
|
|
||||||
|
|
||||||
If you want to build other modules than the ones shipped by default, you
|
|
||||||
will need to rerun Config.exe
|
|
||||||
|
|
||||||
4) Other compile options
|
|
||||||
|
|
||||||
A) If you have trouble recompiling Anope, you should delete all files and folders
|
|
||||||
within the build folder you created in step 3 of section 1. Afterwards, follow
|
|
||||||
the directions from step 4 of section 1 down.
|
|
||||||
|
|
||||||
5) Credits
|
|
||||||
|
|
||||||
Anope is based on Epona and IRCServices. See CREDITS for more credits and
|
|
||||||
a complete list of all developers.
|
|
||||||
|
|
||||||
Anope's Windows-specific code is provided by:
|
|
||||||
|
|
||||||
* Dominick Meglio <codemastr@unrealircd.com>
|
|
||||||
* Trystan Scott Lee <trystan@nomadirc.net>
|
|
||||||
* Chris Hogben <heinz@anope.org>
|
|
||||||
|
|
||||||
Anope's Windows Installer was made using:
|
|
||||||
|
|
||||||
* NSIS 2.20 <http://nsis.sourceforge.net>
|
|
||||||
+4
-1
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
@@ -67,6 +67,9 @@ public:
|
|||||||
*/
|
*/
|
||||||
virtual ChanAccess *Create() = 0;
|
virtual ChanAccess *Create() = 0;
|
||||||
|
|
||||||
|
virtual void GetAccess(CommandSource& source, const Privilege *p, Anope::map<Anope::string> &access) = 0;
|
||||||
|
static void SendAccess(CommandSource &source, const Anope::string &pname);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static std::list<AccessProvider *> Providers;
|
static std::list<AccessProvider *> Providers;
|
||||||
public:
|
public:
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
|
|||||||
+6
-10
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
@@ -230,12 +230,12 @@ namespace Anope
|
|||||||
inline bool is_pos_number_only() const { return this->find_first_not_of("0123456789.") == npos; }
|
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.
|
* (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
|
* The line wrapper will convert this to a space before it is sent to
|
||||||
* clients.
|
* 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.
|
* Replace parts of the string.
|
||||||
@@ -362,10 +362,6 @@ namespace Anope
|
|||||||
template<typename T>
|
template<typename T>
|
||||||
using unordered_map = std::unordered_map<string, T, hash_ci, compare>;
|
using unordered_map = std::unordered_map<string, T, hash_ci, compare>;
|
||||||
|
|
||||||
#if !REPRODUCIBLE_BUILD
|
|
||||||
static const char *const compiled = __TIME__ " " __DATE__;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** The time Anope started.
|
/** The time Anope started.
|
||||||
*/
|
*/
|
||||||
extern CoreExport time_t StartTime;
|
extern CoreExport time_t StartTime;
|
||||||
@@ -418,9 +414,9 @@ namespace Anope
|
|||||||
extern CoreExport string Version();
|
extern CoreExport string Version();
|
||||||
extern CoreExport string VersionShort();
|
extern CoreExport string VersionShort();
|
||||||
extern CoreExport string VersionBuildString();
|
extern CoreExport string VersionBuildString();
|
||||||
extern CoreExport int VersionMajor();
|
extern CoreExport unsigned VersionMajor();
|
||||||
extern CoreExport int VersionMinor();
|
extern CoreExport unsigned VersionMinor();
|
||||||
extern CoreExport int VersionPatch();
|
extern CoreExport unsigned VersionPatch();
|
||||||
|
|
||||||
/** Determines if we are still attached to the terminal, and can print
|
/** Determines if we are still attached to the terminal, and can print
|
||||||
* messages to the user via stderr/stdout.
|
* messages to the user via stderr/stdout.
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
// Copyright (C) 2008-2011 Adam <Adam@anope.org>
|
// Copyright (C) 2008-2011 Adam <Adam@anope.org>
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
// Copyright (C) 2008-2011 Robin Burchell <w00t@inspircd.org>
|
// Copyright (C) 2008-2011 Robin Burchell <w00t@inspircd.org>
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
|
|||||||
+13
-9
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
@@ -23,8 +23,8 @@ typedef Anope::unordered_map<Channel *> channel_map;
|
|||||||
|
|
||||||
extern CoreExport channel_map ChannelList;
|
extern CoreExport channel_map ChannelList;
|
||||||
|
|
||||||
/* A user container, there is one of these per user per channel. */
|
/* A user's membership to a channel, there is one of these per user per channel. */
|
||||||
struct ChanUserContainer final
|
struct Membership final
|
||||||
: public Extensible
|
: public Extensible
|
||||||
{
|
{
|
||||||
User *user;
|
User *user;
|
||||||
@@ -32,7 +32,11 @@ struct ChanUserContainer final
|
|||||||
/* Status the user has in the channel */
|
/* Status the user has in the channel */
|
||||||
ChannelStatus status;
|
ChannelStatus status;
|
||||||
|
|
||||||
ChanUserContainer(User *u, Channel *c) : user(u), chan(c) { }
|
Membership(User *u, Channel *c)
|
||||||
|
: user(u)
|
||||||
|
, chan(c)
|
||||||
|
{
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class CoreExport Channel final
|
class CoreExport Channel final
|
||||||
@@ -61,7 +65,7 @@ public:
|
|||||||
bool botchannel = false;
|
bool botchannel = false;
|
||||||
|
|
||||||
/* Users in the channel */
|
/* Users in the channel */
|
||||||
typedef std::map<User *, ChanUserContainer *> ChanUserList;
|
typedef std::map<User *, Membership *> ChanUserList;
|
||||||
ChanUserList users;
|
ChanUserList users;
|
||||||
|
|
||||||
/* Current topic of the channel */
|
/* Current topic of the channel */
|
||||||
@@ -114,9 +118,9 @@ public:
|
|||||||
/** Join a user internally to the channel
|
/** Join a user internally to the channel
|
||||||
* @param u The user
|
* @param u The user
|
||||||
* @param status The status to give the user, if any
|
* @param status The status to give the user, if any
|
||||||
* @return The UserContainer for the user
|
* @return The membership for the user
|
||||||
*/
|
*/
|
||||||
ChanUserContainer *JoinUser(User *u, const ChannelStatus *status);
|
Membership *JoinUser(User *u, const ChannelStatus *status);
|
||||||
|
|
||||||
/** Remove a user internally from the channel
|
/** Remove a user internally from the channel
|
||||||
* @param u The user
|
* @param u The user
|
||||||
@@ -125,9 +129,9 @@ public:
|
|||||||
|
|
||||||
/** Check if the user is on the channel
|
/** Check if the user is on the channel
|
||||||
* @param u The user
|
* @param u The user
|
||||||
* @return A user container if found, else NULL
|
* @return A membership if found, else NULL
|
||||||
*/
|
*/
|
||||||
ChanUserContainer *FindUser(User *u) const;
|
Membership *FindUser(User *u) const;
|
||||||
|
|
||||||
/** Check if a user has a status on a channel
|
/** Check if a user has a status on a channel
|
||||||
* @param u The user
|
* @param u The user
|
||||||
|
|||||||
+9
-4
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
@@ -90,6 +90,11 @@ public:
|
|||||||
void Reply(int count, const char *singular, const char *plural, ...) ATTR_FORMAT(4, 5);
|
void Reply(int count, const char *singular, const char *plural, ...) ATTR_FORMAT(4, 5);
|
||||||
void Reply(const Anope::string &message);
|
void Reply(const Anope::string &message);
|
||||||
|
|
||||||
|
const char *Translate(const char *message);
|
||||||
|
const char *Translate(const Anope::string &message);
|
||||||
|
const char *Translate(int count, const char *single, const char *plural);
|
||||||
|
const char *Translate(int count, const Anope::string &single, const Anope::string &plural);
|
||||||
|
|
||||||
bool HasCommand(const Anope::string &cmd);
|
bool HasCommand(const Anope::string &cmd);
|
||||||
bool HasPriv(const Anope::string &cmd);
|
bool HasPriv(const Anope::string &cmd);
|
||||||
bool IsServicesOper();
|
bool IsServicesOper();
|
||||||
@@ -135,7 +140,7 @@ protected:
|
|||||||
|
|
||||||
void ClearSyntax();
|
void ClearSyntax();
|
||||||
void SetSyntax(const Anope::string &s, const std::function<bool(CommandSource&)> &p = nullptr);
|
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 AllowUnregistered(bool b);
|
||||||
void RequireUser(bool b);
|
void RequireUser(bool b);
|
||||||
@@ -148,7 +153,7 @@ public:
|
|||||||
* @param source The source wanting the command description
|
* @param source The source wanting the command description
|
||||||
* @return The commands description
|
* @return The commands description
|
||||||
*/
|
*/
|
||||||
virtual const Anope::string GetDesc(CommandSource &source) const;
|
virtual Anope::string GetDesc(CommandSource &source) const;
|
||||||
|
|
||||||
/** Execute this command.
|
/** Execute this command.
|
||||||
* @param source The source
|
* @param source The source
|
||||||
@@ -189,5 +194,5 @@ public:
|
|||||||
* @param name If found, is set to the command name, eg REGISTER
|
* @param name If found, is set to the command name, eg REGISTER
|
||||||
* @return true if the given command service exists
|
* @return true if the given command service exists
|
||||||
*/
|
*/
|
||||||
static bool FindCommandFromService(const Anope::string &command_service, BotInfo *&bi, Anope::string &name);
|
static bool FindFromService(const Anope::string &command_service, BotInfo *&bi, Anope::string &name);
|
||||||
};
|
};
|
||||||
|
|||||||
+14
-11
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
@@ -18,6 +18,7 @@
|
|||||||
#include "regchannel.h"
|
#include "regchannel.h"
|
||||||
#include "users.h"
|
#include "users.h"
|
||||||
#include "opertype.h"
|
#include "opertype.h"
|
||||||
|
#include "miscutils.h"
|
||||||
|
|
||||||
namespace Configuration
|
namespace Configuration
|
||||||
{
|
{
|
||||||
@@ -26,14 +27,15 @@ namespace Configuration
|
|||||||
friend class Configuration::Conf;
|
friend class Configuration::Conf;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
typedef Anope::map<Anope::string> item_map;
|
typedef Anope::map<Anope::string> ItemMap;
|
||||||
typedef Anope::multimap<Block> block_map;
|
typedef Anope::multimap<Block> BlockMap;
|
||||||
|
typedef Anope::iterator_range<BlockMap::const_iterator> BlockList;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Anope::string name;
|
Anope::string name;
|
||||||
item_map items;
|
ItemMap items;
|
||||||
block_map blocks;
|
BlockMap blocks;
|
||||||
int linenum;
|
unsigned linenum;
|
||||||
|
|
||||||
/* Represents a missing tag. */
|
/* Represents a missing tag. */
|
||||||
static Block EmptyBlock;
|
static Block EmptyBlock;
|
||||||
@@ -41,9 +43,10 @@ namespace Configuration
|
|||||||
public:
|
public:
|
||||||
Block(const Anope::string &);
|
Block(const Anope::string &);
|
||||||
const Anope::string &GetName() const;
|
const Anope::string &GetName() const;
|
||||||
int CountBlock(const Anope::string &name) const;
|
size_t CountBlock(const Anope::string &name) const;
|
||||||
const Block &GetBlock(const Anope::string &name, int num = 0) const;
|
BlockList GetBlocks(const Anope::string &name) const;
|
||||||
Block *GetMutableBlock(const Anope::string &name, int num = 0);
|
const Block &GetBlock(const Anope::string &name, size_t num = 0) const;
|
||||||
|
Block *GetMutableBlock(const Anope::string &name, size_t num = 0);
|
||||||
|
|
||||||
template<typename T> T Get(const Anope::string &tag, const Anope::string &def = "") const
|
template<typename T> T Get(const Anope::string &tag, const Anope::string &def = "") const
|
||||||
{
|
{
|
||||||
@@ -51,7 +54,7 @@ namespace Configuration
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool Set(const Anope::string &tag, const Anope::string &value);
|
bool Set(const Anope::string &tag, const Anope::string &value);
|
||||||
const item_map &GetItems() const;
|
const ItemMap &GetItems() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
template<> CoreExport const Anope::string Block::Get(const Anope::string &tag, const Anope::string &def) const;
|
template<> CoreExport const Anope::string Block::Get(const Anope::string &tag, const Anope::string &def) const;
|
||||||
@@ -85,7 +88,7 @@ namespace Configuration
|
|||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
/** Replaces defined variables within a string. */
|
/** Replaces defined variables within a string. */
|
||||||
Anope::string ReplaceVars(const Anope::string &str, const File &file, int linenumber);
|
Anope::string ReplaceVars(const Anope::string &str, const File &file, unsigned linenumber);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/* options:readtimeout */
|
/* options:readtimeout */
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
|
|||||||
+3
-2
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
@@ -22,7 +22,6 @@ class Channel;
|
|||||||
class ChannelInfo;
|
class ChannelInfo;
|
||||||
class ChannelStatus;
|
class ChannelStatus;
|
||||||
namespace ChanServ { class AutoKick; class ModeLock; }
|
namespace ChanServ { class AutoKick; class ModeLock; }
|
||||||
struct ChanUserContainer;
|
|
||||||
class ClientSocket;
|
class ClientSocket;
|
||||||
class Command;
|
class Command;
|
||||||
class CommandSource;
|
class CommandSource;
|
||||||
@@ -35,6 +34,7 @@ class InfoFormatter;
|
|||||||
class IRCDProto;
|
class IRCDProto;
|
||||||
class ListenSocket;
|
class ListenSocket;
|
||||||
class Log;
|
class Log;
|
||||||
|
struct Membership;
|
||||||
class Memo;
|
class Memo;
|
||||||
struct MemoInfo;
|
struct MemoInfo;
|
||||||
class MessageSource;
|
class MessageSource;
|
||||||
@@ -42,6 +42,7 @@ struct ModeData;
|
|||||||
class Module;
|
class Module;
|
||||||
class NickAlias;
|
class NickAlias;
|
||||||
class NickCore;
|
class NickCore;
|
||||||
|
namespace NickServ { struct Cert; }
|
||||||
struct Oper;
|
struct Oper;
|
||||||
namespace OperServ { struct Exception; }
|
namespace OperServ { struct Exception; }
|
||||||
class OperType;
|
class OperType;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
@@ -185,7 +185,7 @@ public:
|
|||||||
void ExtensibleUnserialize(Extensible *e, Serializable *s, Serialize::Data &data) override
|
void ExtensibleUnserialize(Extensible *e, Serializable *s, Serialize::Data &data) override
|
||||||
{
|
{
|
||||||
T t;
|
T t;
|
||||||
if (data[this->name] >> t)
|
if (data.TryLoad(this->name, t))
|
||||||
this->Set(e, t);
|
this->Set(e, t);
|
||||||
else
|
else
|
||||||
this->Unset(e);
|
this->Unset(e);
|
||||||
@@ -205,9 +205,7 @@ public:
|
|||||||
|
|
||||||
void ExtensibleUnserialize(Extensible *e, Serializable *s, Serialize::Data &data) override
|
void ExtensibleUnserialize(Extensible *e, Serializable *s, Serialize::Data &data) override
|
||||||
{
|
{
|
||||||
bool b = false;
|
if (data.Load<bool>(this->name))
|
||||||
data[this->name] >> b;
|
|
||||||
if (b)
|
|
||||||
this->Set(e);
|
this->Set(e);
|
||||||
else
|
else
|
||||||
this->Unset(e);
|
this->Unset(e);
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
// Copyright (C) 2009-2011 InspIRCd Development Team
|
// Copyright (C) 2009-2011 InspIRCd Development Team
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
|
|||||||
+10
-5
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
@@ -44,7 +44,7 @@ namespace Language
|
|||||||
/** Sets the locale to the specified language.
|
/** Sets the locale to the specified language.
|
||||||
* @param lang The language to translate to.
|
* @param lang The language to translate to.
|
||||||
*/
|
*/
|
||||||
extern CoreExport void SetLocale(const char* lang);
|
extern CoreExport void SetLocale(const char *lang);
|
||||||
|
|
||||||
/** Sets the locale back to the default. */
|
/** Sets the locale back to the default. */
|
||||||
extern CoreExport void ResetLocale();
|
extern CoreExport void ResetLocale();
|
||||||
@@ -117,7 +117,7 @@ namespace Language
|
|||||||
#define ACCESS_DENIED _("Access denied.")
|
#define ACCESS_DENIED _("Access denied.")
|
||||||
#define BAD_EXPIRY_TIME _("Invalid expiry time.")
|
#define BAD_EXPIRY_TIME _("Invalid expiry time.")
|
||||||
#define BAD_USERHOST_MASK _("Mask must be in the form \037user\037@\037host\037.")
|
#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_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_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.")
|
#define CONFIRM_REGISTER_MAIL _("All new accounts must be confirmed. To confirm your account, follow the instructions that were emailed to you.")
|
||||||
@@ -137,13 +137,18 @@ namespace Language
|
|||||||
#define BOT_NOT_ASSIGNED _("You must assign a bot to the channel before using this command.")
|
#define BOT_NOT_ASSIGNED _("You must assign a bot to the channel before using this command.")
|
||||||
#define BOT_NOT_ON_CHANNEL _("Bot is not on channel \002%s\002.")
|
#define BOT_NOT_ON_CHANNEL _("Bot is not on channel \002%s\002.")
|
||||||
|
|
||||||
|
#define CHAN_ACCESS_LIMIT N_("You can only have %u access entry on a channel.", "You can only have %u access entries on a channel.")
|
||||||
|
#define CHAN_ACCESS_LIMIT_DEEP N_("You can only have %u access entry on a channel, including access entries from other channels.", "You can only have %u access entries on a channel, including access entries from other channels.")
|
||||||
#define CHAN_ACCESS_LEVEL_RANGE _("Access level must be between %d and %d inclusive.")
|
#define CHAN_ACCESS_LEVEL_RANGE _("Access level must be between %d and %d inclusive.")
|
||||||
|
#define CHAN_ACCESS_MALFORMED _("You cannot add a malformed mask to an access list. Did you mean to add %s instead?")
|
||||||
|
#define CHAN_ACCESS_FOREIGN N_("%u access entry from other access systems not shown; use \002%s\033ALL\002 to view all access entries.", "%u access entries from other access systems not shown; use \002%s\033ALL\002 to view all access entries.")
|
||||||
#define CHAN_EXCEPTED _("\002%s\002 matches an except on %s and cannot be banned until the except has been removed.")
|
#define CHAN_EXCEPTED _("\002%s\002 matches an except on %s and cannot be banned until the except has been removed.")
|
||||||
#define CHAN_INFO_HEADER _("Information about channel \002%s\002:")
|
#define CHAN_INFO_HEADER _("Information about channel \002%s\002:")
|
||||||
#define CHAN_LIMIT_EXCEEDED _("You have already exceeded your limit of \002%d\002 channels.")
|
#define CHAN_LIMIT_EXCEEDED _("You have already exceeded your limit of \002%d\002 channels.")
|
||||||
#define CHAN_LIMIT_REACHED _("You have already reached your limit of \002%d\002 channels.")
|
#define CHAN_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_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_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_SETTING_UNSET _("%s for %s unset.")
|
||||||
#define CHAN_SYMBOL_REQUIRED _("Please use the symbol of \002#\002 when attempting to register.")
|
#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.")
|
#define CHAN_X_INVALID _("Channel %s is not a valid channel.")
|
||||||
@@ -160,8 +165,8 @@ namespace Language
|
|||||||
|
|
||||||
#define MEMO_HAVE_NO_MEMOS _("You have no memos.")
|
#define MEMO_HAVE_NO_MEMOS _("You have no memos.")
|
||||||
#define MEMO_HAVE_NO_NEW_MEMOS _("You have no new 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_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\032%s\032%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_MEMOS _("%s has no memos.")
|
||||||
#define MEMO_X_HAS_NO_NEW_MEMOS _("%s has no new memos.")
|
#define MEMO_X_HAS_NO_NEW_MEMOS _("%s has no new memos.")
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
|
|||||||
@@ -0,0 +1,87 @@
|
|||||||
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
|
//
|
||||||
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
|
//
|
||||||
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
|
// for the complete terms of this license and docs/AUTHORS.txt for a list of
|
||||||
|
// contributors.
|
||||||
|
//
|
||||||
|
// Based on the original code of Epona by Lara
|
||||||
|
// Based on the original code of Services by Andy Church
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-only
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <iterator>
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
|
namespace Anope
|
||||||
|
{
|
||||||
|
template <typename Iterator>
|
||||||
|
class iterator_range;
|
||||||
|
|
||||||
|
/** Returns a range containing all elements equivalent to \p value.
|
||||||
|
* @param collection The collection to search within.
|
||||||
|
* @param value The value to search for.
|
||||||
|
*/
|
||||||
|
template <typename Collection, typename Value>
|
||||||
|
auto equal_range(const Collection& collection, const Value& value)
|
||||||
|
{
|
||||||
|
return iterator_range(collection.equal_range(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Returns a range representing a reverse iterator for the specified colleciton.
|
||||||
|
* @param collection The collection to create a reverse iterator for.
|
||||||
|
*/
|
||||||
|
template <typename Collection>
|
||||||
|
auto reverse_range(const Collection& collection)
|
||||||
|
{
|
||||||
|
return iterator_range(collection.rbegin(), collection.rend());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Represents a range of iterators. */
|
||||||
|
template <typename Iterator>
|
||||||
|
class Anope::iterator_range final
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
/** An iterator which points to the start of the range. */
|
||||||
|
const Iterator begini;
|
||||||
|
|
||||||
|
/* An iterator which points to one past the end of the range. */
|
||||||
|
const Iterator endi;
|
||||||
|
|
||||||
|
public:
|
||||||
|
/** Initialises a new iterator range with the specified iterators.
|
||||||
|
* @param begin An iterator which points to the start of the range.
|
||||||
|
* @param end An iterator which points to one past the end of the range.
|
||||||
|
*/
|
||||||
|
explicit iterator_range(Iterator begin, Iterator end)
|
||||||
|
: begini(begin)
|
||||||
|
, endi(end)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Initialises a new iterator range from a pair of iterators.
|
||||||
|
* @param range A pair of iterators in the format [first, last).
|
||||||
|
*/
|
||||||
|
explicit iterator_range(std::pair<Iterator, Iterator> range)
|
||||||
|
: begini(range.first)
|
||||||
|
, endi(range.second)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Determines whether the iterator range is empty. */
|
||||||
|
bool empty() const { return begini == endi; }
|
||||||
|
|
||||||
|
/** Retrieves an iterator which points to the start of the range. */
|
||||||
|
const Iterator& begin() const { return begini; }
|
||||||
|
|
||||||
|
/** Retrieves an iterator which points to one past the end of the range. */
|
||||||
|
const Iterator& end() const { return endi; }
|
||||||
|
|
||||||
|
/** Retrieves the number of hops within the iterator range. */
|
||||||
|
typename std::iterator_traits<Iterator>::difference_type count() const { return std::distance(begini, endi); }
|
||||||
|
};
|
||||||
+14
-11
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
// Copyright (C) 2008-2011 Adam <Adam@anope.org>
|
// Copyright (C) 2008-2011 Adam <Adam@anope.org>
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
@@ -242,11 +242,9 @@ template<typename T>
|
|||||||
class CoreExport ChannelModeVirtual
|
class CoreExport ChannelModeVirtual
|
||||||
: public T
|
: public T
|
||||||
{
|
{
|
||||||
private:
|
|
||||||
ChannelMode *basech;
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Anope::string base;
|
Anope::string base;
|
||||||
|
ChannelMode *basech;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ChannelModeVirtual(const Anope::string &mname, const Anope::string &basename);
|
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 */
|
/* The status a user has on a channel (+v, +h, +o) etc */
|
||||||
class CoreExport ChannelStatus final
|
class CoreExport ChannelStatus final
|
||||||
{
|
{
|
||||||
Anope::string modes;
|
private:
|
||||||
|
std::set<ChannelMode *> modes;
|
||||||
|
static bool IsValidMode(ChannelMode *cm);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ChannelStatus() = default;
|
ChannelStatus() = default;
|
||||||
ChannelStatus(const Anope::string &modes);
|
ChannelStatus(const Anope::string &modes);
|
||||||
void AddMode(char c);
|
void AddMode(char c);
|
||||||
void DelMode(char c);
|
void AddMode(ChannelMode *cm);
|
||||||
bool HasMode(char c) const;
|
void DelMode(ChannelMode *cm);
|
||||||
|
bool HasMode(ChannelMode *cm) const;
|
||||||
bool Empty() const;
|
bool Empty() const;
|
||||||
void Clear();
|
void Clear();
|
||||||
const Anope::string &Modes() const;
|
const auto &Modes() const { return modes; }
|
||||||
Anope::string BuildModePrefixList() const;
|
Anope::string BuildModePrefixList() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -441,17 +443,18 @@ public:
|
|||||||
Anope::string nick, user, host, real;
|
Anope::string nick, user, host, real;
|
||||||
|
|
||||||
/** Constructor
|
/** Constructor
|
||||||
|
* @param mask A full or partial nick!ident@host/cidr#real name mask
|
||||||
* @param mode What mode this host is for, can be empty for unknown/no mode
|
* @param mode What mode this host is for, can be empty for unknown/no mode
|
||||||
* @param host A full or partial nick!ident@host/cidr#real name mask
|
* @Param real Whether to allow a real name in the mask.
|
||||||
*/
|
*/
|
||||||
Entry(const Anope::string &mode, const Anope::string &host);
|
Entry(const Anope::string &mask, const Anope::string &mode = "", bool real = true);
|
||||||
|
|
||||||
/** Get the banned mask for this entry
|
/** Get the banned mask for this entry
|
||||||
* @return The mask
|
* @return The mask
|
||||||
*/
|
*/
|
||||||
Anope::string GetMask() const;
|
Anope::string GetMask() const;
|
||||||
|
|
||||||
Anope::string GetNUHMask() const;
|
Anope::string GetCleanMask() const;
|
||||||
|
|
||||||
/** Check if this entry matches a user
|
/** Check if this entry matches a user
|
||||||
* @param u The user
|
* @param u The user
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
|
|||||||
+17
-15
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
@@ -169,7 +169,7 @@ typedef unsigned short ModType;
|
|||||||
|
|
||||||
struct ModuleVersionC final
|
struct ModuleVersionC final
|
||||||
{
|
{
|
||||||
int version_major, version_minor, version_patch;
|
unsigned version_major, version_minor, version_patch;
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Returned by Module::GetVersion, used to see what version of Anope
|
/** Returned by Module::GetVersion, used to see what version of Anope
|
||||||
@@ -178,9 +178,9 @@ struct ModuleVersionC final
|
|||||||
class ModuleVersion final
|
class ModuleVersion final
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
int version_major;
|
unsigned version_major;
|
||||||
int version_minor;
|
unsigned version_minor;
|
||||||
int version_patch;
|
unsigned version_patch;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ModuleVersion(const ModuleVersionC &);
|
ModuleVersion(const ModuleVersionC &);
|
||||||
@@ -188,17 +188,17 @@ public:
|
|||||||
/** Get the major version of Anope this was built against
|
/** Get the major version of Anope this was built against
|
||||||
* @return The major version
|
* @return The major version
|
||||||
*/
|
*/
|
||||||
int GetMajor() const;
|
unsigned GetMajor() const;
|
||||||
|
|
||||||
/** Get the minor version of Anope this was built against
|
/** Get the minor version of Anope this was built against
|
||||||
* @return The minor version
|
* @return The minor version
|
||||||
*/
|
*/
|
||||||
int GetMinor() const;
|
unsigned GetMinor() const;
|
||||||
|
|
||||||
/** Get the patch version this was built against
|
/** Get the patch version this was built against
|
||||||
* @return The patch version
|
* @return The patch version
|
||||||
*/
|
*/
|
||||||
int GetPatch() const;
|
unsigned GetPatch() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
class CoreExport NotImplementedException final
|
class CoreExport NotImplementedException final
|
||||||
@@ -292,10 +292,10 @@ public:
|
|||||||
|
|
||||||
/** Called before a user has been kicked from a channel.
|
/** Called before a user has been kicked from a channel.
|
||||||
* @param source The kicker
|
* @param source The kicker
|
||||||
* @param cu The user, channel, and status of the user being kicked
|
* @param memb The membership for the user who is being kicked
|
||||||
* @param kickmsg The reason for the kick.
|
* @param kickmsg The reason for the kick.
|
||||||
*/
|
*/
|
||||||
virtual void OnPreUserKicked(const MessageSource &source, ChanUserContainer *cu, const Anope::string &kickmsg) ATTR_NOT_NULL(3) { throw NotImplementedException(); }
|
virtual void OnPreUserKicked(const MessageSource &source, Membership *memb, const Anope::string &kickmsg) ATTR_NOT_NULL(3) { throw NotImplementedException(); }
|
||||||
|
|
||||||
/** Called when a user has been kicked from a channel.
|
/** Called when a user has been kicked from a channel.
|
||||||
* @param source The kicker
|
* @param source The kicker
|
||||||
@@ -601,15 +601,17 @@ public:
|
|||||||
* @param ci The channel
|
* @param ci The channel
|
||||||
* @param source The source of the command
|
* @param source The source of the command
|
||||||
* @param access The access entry that was removed
|
* @param access The access entry that was removed
|
||||||
|
* @param migrated Whether the access entry was deleted because of being migrated to another system.
|
||||||
*/
|
*/
|
||||||
virtual void OnAccessDel(ChannelInfo *ci, CommandSource &source, ChanAccess *access) ATTR_NOT_NULL(2, 4) { throw NotImplementedException(); }
|
virtual void OnAccessDel(ChannelInfo *ci, CommandSource &source, ChanAccess *access, bool migrated) ATTR_NOT_NULL(2, 4) { throw NotImplementedException(); }
|
||||||
|
|
||||||
/** Called when access is added
|
/** Called when access is added
|
||||||
* @param ci The channel
|
* @param ci The channel
|
||||||
* @param source The source of the command
|
* @param source The source of the command
|
||||||
* @param access The access changed
|
* @param access The access changed
|
||||||
|
* @param migrated Whether the access entry was added because of being migrated to another system.
|
||||||
*/
|
*/
|
||||||
virtual void OnAccessAdd(ChannelInfo *ci, CommandSource &source, ChanAccess *access) ATTR_NOT_NULL(2, 4) { throw NotImplementedException(); }
|
virtual void OnAccessAdd(ChannelInfo *ci, CommandSource &source, ChanAccess *access, bool migrated) ATTR_NOT_NULL(2, 4) { throw NotImplementedException(); }
|
||||||
|
|
||||||
/** Called when the access list is cleared
|
/** Called when the access list is cleared
|
||||||
* @param ci The channel
|
* @param ci The channel
|
||||||
@@ -793,13 +795,13 @@ public:
|
|||||||
* @param nc The nick
|
* @param nc The nick
|
||||||
* @param entry The entry
|
* @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()
|
/** Called from NickCore::EraseCert()
|
||||||
* @param nc pointer to the NickCore
|
* @param nc pointer to the NickCore
|
||||||
* @param entry The fingerprint
|
* @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
|
/** Called when a user requests info for a nick
|
||||||
* @param source The user requesting info
|
* @param source The user requesting info
|
||||||
@@ -1271,7 +1273,7 @@ public:
|
|||||||
* @param minor The minor version
|
* @param minor The minor version
|
||||||
* @param patch The patch version
|
* @param patch The patch version
|
||||||
*/
|
*/
|
||||||
static void RequireVersion(int major, int minor, int patch);
|
static void RequireVersion(unsigned major, unsigned minor, unsigned patch);
|
||||||
|
|
||||||
/** Change the priority of one event in a module.
|
/** Change the priority of one event in a module.
|
||||||
* Each module event has a list of modules which are attached to that event type. If you wish to be called before or after other specific modules, you may use this
|
* Each module event has a list of modules which are attached to that event type. If you wish to be called before or after other specific modules, you may use this
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
@@ -49,8 +49,8 @@ protected:
|
|||||||
public:
|
public:
|
||||||
virtual ~EntryMessageList()
|
virtual ~EntryMessageList()
|
||||||
{
|
{
|
||||||
while (!(*this)->empty())
|
for (auto i = (*this)->size(); i > 0; --i)
|
||||||
delete (*this)->back();
|
delete (*this)->at(i - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual ChanServ::EntryMessage *Create() = 0;
|
virtual ChanServ::EntryMessage *Create() = 0;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
@@ -194,12 +194,13 @@ namespace DNS
|
|||||||
/** Used to time out the query, xalls OnError and lets the TimerManager
|
/** Used to time out the query, xalls OnError and lets the TimerManager
|
||||||
* delete this request.
|
* delete this request.
|
||||||
*/
|
*/
|
||||||
void Tick() override
|
bool Tick() override
|
||||||
{
|
{
|
||||||
Log(LOG_DEBUG_2) << "Resolver: timeout for query " << this->name;
|
Log(LOG_DEBUG_2) << "Resolver: timeout for query " << this->name;
|
||||||
Query rr(*this);
|
Query rr(*this);
|
||||||
rr.error = ERROR_TIMEDOUT;
|
rr.error = ERROR_TIMEDOUT;
|
||||||
this->OnError(&rr);
|
this->OnError(&rr);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
@@ -46,7 +46,7 @@ public:
|
|||||||
/** Retrieves the size of the messages queue for the specified user.
|
/** Retrieves the size of the messages queue for the specified user.
|
||||||
* @param nc The account to count queued messages for.
|
* @param nc The account to count queued messages for.
|
||||||
*/
|
*/
|
||||||
inline size_t CountQueue(NickCore* nc) const
|
inline size_t CountQueue(NickCore *nc) const
|
||||||
{
|
{
|
||||||
auto *q = GetQueue(nc);
|
auto *q = GetQueue(nc);
|
||||||
return q ? q->size() : 0;
|
return q ? q->size() : 0;
|
||||||
@@ -55,7 +55,7 @@ public:
|
|||||||
/** Retrieves the messages queue for the specified user.
|
/** Retrieves the messages queue for the specified user.
|
||||||
* @param nc The account to retrieve queued messages for.
|
* @param nc The account to retrieve queued messages for.
|
||||||
*/
|
*/
|
||||||
virtual const std::vector<Anope::string> *GetQueue(NickCore* nc) const = 0;
|
virtual const std::vector<Anope::string> *GetQueue(NickCore *nc) const = 0;
|
||||||
|
|
||||||
/** Queues a message to be sent later.
|
/** Queues a message to be sent later.
|
||||||
* @param nc The account to queue the message for.
|
* @param nc The account to queue the message for.
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
@@ -152,7 +152,7 @@ public:
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual const Anope::string GetIP()
|
virtual Anope::string GetIP() const
|
||||||
{
|
{
|
||||||
return this->clientaddr.addr();
|
return this->clientaddr.addr();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
|
|||||||
+11
-1
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
@@ -173,4 +173,14 @@ public:
|
|||||||
* @param attributes The attributes to modify
|
* @param attributes The attributes to modify
|
||||||
*/
|
*/
|
||||||
virtual void Modify(LDAPInterface *i, const Anope::string &base, LDAPMods &attributes) = 0;
|
virtual void Modify(LDAPInterface *i, const Anope::string &base, LDAPMods &attributes) = 0;
|
||||||
|
|
||||||
|
/** Escapes a LDAP string for use in a DN.
|
||||||
|
* @param str The string to escape.
|
||||||
|
*/
|
||||||
|
virtual Anope::string EscapeDN(const Anope::string &str) const = 0;
|
||||||
|
|
||||||
|
/** Escapes a LDAP string for use in a search filter.
|
||||||
|
* @param str The string to escape.
|
||||||
|
*/
|
||||||
|
virtual Anope::string EscapeSF(const Anope::string &str) const = 0;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
|
|||||||
@@ -0,0 +1,47 @@
|
|||||||
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
|
//
|
||||||
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
|
//
|
||||||
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
|
// for the complete terms of this license and docs/AUTHORS.txt for a list of
|
||||||
|
// contributors.
|
||||||
|
//
|
||||||
|
// Based on the original code of Epona by Lara
|
||||||
|
// Based on the original code of Services by Andy Church
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-only
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#define NICKSERV_AJOIN_LIST_EXT "ajoinlist"
|
||||||
|
|
||||||
|
struct AJoinEntry;
|
||||||
|
|
||||||
|
struct AJoinList
|
||||||
|
: Serialize::Checker<std::vector<AJoinEntry *> >
|
||||||
|
{
|
||||||
|
AJoinList(Extensible *) : Serialize::Checker<std::vector<AJoinEntry *> >("AJoinEntry") { }
|
||||||
|
virtual ~AJoinList() = default;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct AJoinEntry final
|
||||||
|
: Serializable
|
||||||
|
{
|
||||||
|
Serialize::Reference<NickCore> owner;
|
||||||
|
Anope::string channel;
|
||||||
|
Anope::string key;
|
||||||
|
|
||||||
|
AJoinEntry(Extensible *) : Serializable("AJoinEntry") { }
|
||||||
|
|
||||||
|
~AJoinEntry() override
|
||||||
|
{
|
||||||
|
auto *channels = owner->GetExt<AJoinList>(NICKSERV_AJOIN_LIST_EXT);
|
||||||
|
if (channels)
|
||||||
|
{
|
||||||
|
auto it = std::find((*channels)->begin(), (*channels)->end(), this);
|
||||||
|
if (it != (*channels)->end())
|
||||||
|
(*channels)->erase(it);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
@@ -19,12 +19,31 @@
|
|||||||
|
|
||||||
namespace NickServ
|
namespace NickServ
|
||||||
{
|
{
|
||||||
|
struct Cert;
|
||||||
class CertList;
|
class CertList;
|
||||||
class CertService;
|
class CertService;
|
||||||
|
|
||||||
ServiceReference<CertService> cert_service(NICKSERV_CERT_SERVICE, NICKSERV_CERT_SERVICE);
|
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
|
class NickServ::CertList
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
@@ -39,7 +58,7 @@ public:
|
|||||||
*
|
*
|
||||||
* Adds a new entry into the cert list.
|
* 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
|
/** 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.
|
* 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;
|
virtual unsigned GetCertCount() const = 0;
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
|
|||||||
@@ -1,83 +0,0 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
|
||||||
//
|
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
|
||||||
//
|
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
|
||||||
// for the complete terms of this license and docs/AUTHORS.txt for a list of
|
|
||||||
// contributors.
|
|
||||||
//
|
|
||||||
// Based on the original code of Epona by Lara
|
|
||||||
// Based on the original code of Services by Andy Church
|
|
||||||
//
|
|
||||||
// SPDX-License-Identifier: GPL-2.0-only
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
namespace Redis
|
|
||||||
{
|
|
||||||
struct Reply final
|
|
||||||
{
|
|
||||||
enum Type
|
|
||||||
{
|
|
||||||
NOT_PARSED,
|
|
||||||
NOT_OK,
|
|
||||||
OK,
|
|
||||||
INT,
|
|
||||||
BULK,
|
|
||||||
MULTI_BULK
|
|
||||||
}
|
|
||||||
type;
|
|
||||||
|
|
||||||
Reply() { Clear(); }
|
|
||||||
~Reply() { Clear(); }
|
|
||||||
|
|
||||||
void Clear()
|
|
||||||
{
|
|
||||||
type = NOT_PARSED;
|
|
||||||
i = 0;
|
|
||||||
bulk.clear();
|
|
||||||
multi_bulk_size = 0;
|
|
||||||
for (const auto *reply : multi_bulk)
|
|
||||||
delete reply;
|
|
||||||
multi_bulk.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
int64_t i;
|
|
||||||
Anope::string bulk;
|
|
||||||
int multi_bulk_size;
|
|
||||||
std::deque<Reply *> multi_bulk;
|
|
||||||
};
|
|
||||||
|
|
||||||
class Interface
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
Module *owner;
|
|
||||||
|
|
||||||
Interface(Module *m) : owner(m) { }
|
|
||||||
virtual ~Interface() = default;
|
|
||||||
|
|
||||||
virtual void OnResult(const Reply &r) = 0;
|
|
||||||
virtual void OnError(const Anope::string &error) { Log(owner) << error; }
|
|
||||||
};
|
|
||||||
|
|
||||||
class Provider
|
|
||||||
: public Service
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
Provider(Module *c, const Anope::string &n) : Service(c, "Redis::Provider", n) { }
|
|
||||||
|
|
||||||
virtual bool IsSocketDead() = 0;
|
|
||||||
|
|
||||||
virtual void SendCommand(Interface *i, const std::vector<Anope::string> &cmds) = 0;
|
|
||||||
virtual void SendCommand(Interface *i, const Anope::string &str) = 0;
|
|
||||||
|
|
||||||
virtual bool BlockAndProcess() = 0;
|
|
||||||
|
|
||||||
virtual void Subscribe(Interface *i, const Anope::string &pattern) = 0;
|
|
||||||
virtual void Unsubscribe(const Anope::string &pattern) = 0;
|
|
||||||
|
|
||||||
virtual void StartTransaction() = 0;
|
|
||||||
virtual void CommitTransaction() = 0;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
@@ -183,7 +183,7 @@ private:
|
|||||||
size_t minparams;
|
size_t minparams;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Event(Module *o, const Anope::string& e, size_t mp = 0)
|
Event(Module *o, const Anope::string &e, size_t mp = 0)
|
||||||
: Service(o, RPC_EVENT, e)
|
: Service(o, RPC_EVENT, e)
|
||||||
, minparams(mp)
|
, minparams(mp)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
|
|||||||
+16
-29
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
@@ -23,46 +23,33 @@ namespace SQL
|
|||||||
: public Serialize::Data
|
: public Serialize::Data
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
typedef std::map<Anope::string, std::stringstream *> Map;
|
Anope::unordered_map<Anope::string> data;
|
||||||
Map data;
|
|
||||||
|
|
||||||
~Data()
|
|
||||||
{
|
|
||||||
Clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
std::iostream &operator[](const Anope::string &key) override
|
|
||||||
{
|
|
||||||
std::stringstream *&ss = data[key];
|
|
||||||
if (!ss)
|
|
||||||
ss = new std::stringstream();
|
|
||||||
return *ss;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Hash() const override
|
size_t Hash() const override
|
||||||
{
|
{
|
||||||
size_t hash = 0;
|
size_t hash = 0;
|
||||||
for (const auto &[_, value] : this->data)
|
for (const auto &[_, value] : this->data)
|
||||||
{
|
{
|
||||||
if (!value->str().empty())
|
if (!value.empty())
|
||||||
hash ^= Anope::hash_cs()(value->str());
|
hash ^= Anope::hash_cs()(value);
|
||||||
}
|
}
|
||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::map<Anope::string, std::iostream *> GetData() const
|
bool LoadInternal(const Anope::string &key, Anope::string &value) override
|
||||||
{
|
{
|
||||||
std::map<Anope::string, std::iostream *> d;
|
auto it = this->data.find(key);
|
||||||
for (const auto &[key, value] : this->data)
|
if (it == this->data.end())
|
||||||
d[key] = value;
|
return false;
|
||||||
return d;
|
|
||||||
|
value = it->second;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Clear()
|
bool StoreInternal(const Anope::string &key, const Anope::string &value) override
|
||||||
{
|
{
|
||||||
for (const auto &[_, value] : this->data)
|
this->data[key] = value;
|
||||||
delete value;
|
return true;
|
||||||
this->data.clear();
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -157,7 +144,7 @@ namespace SQL
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const Anope::string Get(size_t index, const Anope::string &col) const
|
Anope::string Get(size_t index, const Anope::string &col) const
|
||||||
{
|
{
|
||||||
const std::map<Anope::string, Anope::string> rows = this->Row(index);
|
const std::map<Anope::string, Anope::string> rows = this->Row(index);
|
||||||
|
|
||||||
@@ -197,7 +184,7 @@ namespace SQL
|
|||||||
|
|
||||||
virtual std::vector<Query> CreateTable(const Anope::string &table, const Data &data) = 0;
|
virtual std::vector<Query> CreateTable(const Anope::string &table, const Data &data) = 0;
|
||||||
|
|
||||||
virtual Query BuildInsert(const Anope::string &table, unsigned int id, Data &data) = 0;
|
virtual Query BuildInsert(const Anope::string &table, Serializable::Id id, Data &data) = 0;
|
||||||
|
|
||||||
virtual Query GetTables(const Anope::string &prefix) = 0;
|
virtual Query GetTables(const Anope::string &prefix) = 0;
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
// Copyright (C) 2008-2011 Robin Burchell <w00t@inspircd.org>
|
// Copyright (C) 2008-2011 Robin Burchell <w00t@inspircd.org>
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
|
|||||||
+15
-3
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
@@ -58,6 +58,14 @@ public:
|
|||||||
*/
|
*/
|
||||||
virtual bool Parse(const Anope::string &message, Anope::map<Anope::string> &tags, Anope::string &source, Anope::string &command, std::vector<Anope::string> ¶ms);
|
virtual bool Parse(const Anope::string &message, Anope::map<Anope::string> &tags, Anope::string &source, Anope::string &command, std::vector<Anope::string> ¶ms);
|
||||||
|
|
||||||
|
/* Populates the tags that should be sent on all messages.
|
||||||
|
* @param tags The location to store tags.
|
||||||
|
* @param source Source of the message.
|
||||||
|
* @param command Command name.
|
||||||
|
* @param params Any extra parameters.
|
||||||
|
*/
|
||||||
|
virtual void PopulateTags(Anope::map<Anope::string> &tags, const MessageSource &source, const Anope::string &command, const std::vector<Anope::string> ¶ms);
|
||||||
|
|
||||||
/* Formats an outgoing message so it can be sent to the IRC server.
|
/* Formats an outgoing message so it can be sent to the IRC server.
|
||||||
* @param message The location to store the formatted message.
|
* @param message The location to store the formatted message.
|
||||||
* @param tags IRCv3 message tags.
|
* @param tags IRCv3 message tags.
|
||||||
@@ -80,6 +88,9 @@ public:
|
|||||||
/** Can we force servers to remove opers? */
|
/** Can we force servers to remove opers? */
|
||||||
bool CanSVSNOOP = false;
|
bool CanSVSNOOP = false;
|
||||||
|
|
||||||
|
/** Can we send multiple swhois messages? */
|
||||||
|
bool CanSendMultipleSWhois = false;
|
||||||
|
|
||||||
/* Can we set vhosts on users? */
|
/* Can we set vhosts on users? */
|
||||||
bool CanSetVHost = false;
|
bool CanSetVHost = false;
|
||||||
|
|
||||||
@@ -276,7 +287,8 @@ public:
|
|||||||
virtual void SendSVSHold(const Anope::string &, time_t) { }
|
virtual void SendSVSHold(const Anope::string &, time_t) { }
|
||||||
virtual void SendSVSHoldDel(const Anope::string &) { }
|
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, time_t priority, 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
|
/** Introduces a server to the uplink
|
||||||
*/
|
*/
|
||||||
@@ -303,7 +315,7 @@ public:
|
|||||||
*/
|
*/
|
||||||
virtual void SendOper(User *u);
|
virtual void SendOper(User *u);
|
||||||
|
|
||||||
virtual void SendClearModes(const MessageSource &user, Channel *c, User* u, const Anope::string &mode) { }
|
virtual void SendClearModes(const MessageSource &user, Channel *c, User *u, const Anope::string &mode) { }
|
||||||
|
|
||||||
virtual bool IsNickValid(const Anope::string &);
|
virtual bool IsNickValid(const Anope::string &);
|
||||||
virtual bool IsChannelValid(const Anope::string &);
|
virtual bool IsChannelValid(const Anope::string &);
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
|
|||||||
+115
-38
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
@@ -40,43 +40,11 @@ namespace Serialize
|
|||||||
UINT,
|
UINT,
|
||||||
};
|
};
|
||||||
|
|
||||||
class CoreExport Data
|
|
||||||
{
|
|
||||||
protected:
|
|
||||||
std::map<Anope::string, Serialize::DataType> types;
|
|
||||||
|
|
||||||
public:
|
|
||||||
virtual ~Data() = default;
|
|
||||||
|
|
||||||
virtual std::iostream &operator[](const Anope::string &key) = 0;
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
void Store(const Anope::string &key, const T &value)
|
|
||||||
{
|
|
||||||
using Type = std::remove_cv_t<std::remove_reference_t<T>>;
|
|
||||||
|
|
||||||
if constexpr (std::is_same_v<Type, bool>)
|
|
||||||
SetType(key, DataType::BOOL);
|
|
||||||
else if constexpr (std::is_floating_point_v<Type>)
|
|
||||||
SetType(key, DataType::FLOAT);
|
|
||||||
else if constexpr (std::is_integral_v<Type> && std::is_signed_v<Type>)
|
|
||||||
SetType(key, DataType::INT);
|
|
||||||
else if constexpr (std::is_integral_v<Type> && std::is_unsigned_v<Type>)
|
|
||||||
SetType(key, DataType::UINT);
|
|
||||||
|
|
||||||
this->operator[](key) << value;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual size_t Hash() const { throw CoreException("Not supported"); }
|
|
||||||
|
|
||||||
Serialize::DataType GetType(const Anope::string &key) const;
|
|
||||||
void SetType(const Anope::string &key, Serialize::DataType dt);
|
|
||||||
};
|
|
||||||
|
|
||||||
extern void RegisterTypes();
|
extern void RegisterTypes();
|
||||||
extern void CheckTypes();
|
extern void CheckTypes();
|
||||||
extern void CreateTypes();
|
extern void CreateTypes();
|
||||||
|
|
||||||
|
class Data;
|
||||||
class Type;
|
class Type;
|
||||||
template<typename T> class Checker;
|
template<typename T> class Checker;
|
||||||
template<typename T> class Reference;
|
template<typename T> class Reference;
|
||||||
@@ -106,6 +74,8 @@ private:
|
|||||||
size_t last_commit = 0;
|
size_t last_commit = 0;
|
||||||
/* The last time this object was committed to the database */
|
/* The last time this object was committed to the database */
|
||||||
time_t last_commit_time = 0;
|
time_t last_commit_time = 0;
|
||||||
|
/** Whether this object should be committed to the database. */
|
||||||
|
bool should_commit = true;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Serializable(const Anope::string &serialize_type);
|
Serializable(const Anope::string &serialize_type);
|
||||||
@@ -113,20 +83,34 @@ protected:
|
|||||||
|
|
||||||
Serializable &operator=(const Serializable &);
|
Serializable &operator=(const Serializable &);
|
||||||
|
|
||||||
|
template<typename Container,
|
||||||
|
typename Key = typename Container::key_type,
|
||||||
|
typename Value = typename Container::mapped_type>
|
||||||
|
bool InsertUnique(Container &container, const Key &key)
|
||||||
|
{
|
||||||
|
auto res = container.emplace(key, static_cast<Value>(this));
|
||||||
|
if (res.second)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
res.first->second->should_commit = false;
|
||||||
|
res.first->second = static_cast<Value>(this);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
using Id = uint64_t;
|
using Id = uint64_t;
|
||||||
virtual ~Serializable();
|
virtual ~Serializable();
|
||||||
|
|
||||||
/* Unique ID (per type, not globally) for this object */
|
/* Unique ID (per type, not globally) for this object */
|
||||||
Id id = 0;
|
Id object_id = 0;
|
||||||
|
|
||||||
/* Only used by redis, to ignore updates */
|
|
||||||
unsigned short redis_ignore = 0;
|
|
||||||
|
|
||||||
/** Marks the object as potentially being updated "soon".
|
/** Marks the object as potentially being updated "soon".
|
||||||
*/
|
*/
|
||||||
void QueueUpdate();
|
void QueueUpdate();
|
||||||
|
|
||||||
|
/** Determines whether the object should be committed to the database. */
|
||||||
|
bool ShouldCommit() const { return this->should_commit; }
|
||||||
|
|
||||||
bool IsCached(Serialize::Data &);
|
bool IsCached(Serialize::Data &);
|
||||||
void UpdateCache(Serialize::Data &);
|
void UpdateCache(Serialize::Data &);
|
||||||
|
|
||||||
@@ -137,10 +121,103 @@ public:
|
|||||||
* @return The serializable object type
|
* @return The serializable object type
|
||||||
*/
|
*/
|
||||||
Serialize::Type *GetSerializableType() const { return this->s_type; }
|
Serialize::Type *GetSerializableType() const { return this->s_type; }
|
||||||
|
const auto &GetSerializableName() const { return this->s_name; }
|
||||||
|
|
||||||
static const std::list<Serializable *> &GetItems();
|
static const std::list<Serializable *> &GetItems();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class CoreExport Serialize::Data
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
/** The specified data types of known fields. */
|
||||||
|
std::map<Anope::string, Serialize::DataType> types;
|
||||||
|
|
||||||
|
Data() = default;
|
||||||
|
|
||||||
|
/** Internal method for loading data from the database.
|
||||||
|
* @param key The field to get the value of.
|
||||||
|
* @param value The location to store the retrieved value.
|
||||||
|
*/
|
||||||
|
virtual bool LoadInternal(const Anope::string &key, Anope::string &value) = 0;
|
||||||
|
|
||||||
|
/** Internal method for storing data in the database.
|
||||||
|
* @param key The field to set the value of.
|
||||||
|
* @param value The value of the field.
|
||||||
|
*/
|
||||||
|
virtual bool StoreInternal(const Anope::string &key, const Anope::string &value) = 0;
|
||||||
|
|
||||||
|
/** Sets the data type of the specified field. This is called automatically from \ref Store.
|
||||||
|
* @param key The field to specify the data type for.
|
||||||
|
* @param dt The data type of the field.
|
||||||
|
*/
|
||||||
|
void SetType(const Anope::string &key, Serialize::DataType dt);
|
||||||
|
|
||||||
|
public:
|
||||||
|
virtual ~Data() = default;
|
||||||
|
|
||||||
|
/** Retrieves the data type for the specified field. If the field does not have a data type
|
||||||
|
* specified then it will default to TEXT.
|
||||||
|
* @param key The field to retrieve the data type for.
|
||||||
|
*/
|
||||||
|
Serialize::DataType GetType(const Anope::string &key) const;
|
||||||
|
|
||||||
|
/** Retrieves a unique hash for the data set. */
|
||||||
|
virtual size_t Hash() const { throw CoreException("Not supported"); }
|
||||||
|
|
||||||
|
/** Loads the value of a specific field.
|
||||||
|
* @param key The field to get the value of.
|
||||||
|
* @param def The default value if none is set.
|
||||||
|
*/
|
||||||
|
template <typename T = Anope::string>
|
||||||
|
T Load(const Anope::string &key, T def = T())
|
||||||
|
{
|
||||||
|
T out;
|
||||||
|
if (!TryLoad(key, out))
|
||||||
|
out = def;
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Stores the value of a specific field, automatically setting its type.
|
||||||
|
* @param key The field to set the value of.
|
||||||
|
* @param value The value of the field.
|
||||||
|
*/
|
||||||
|
template <typename T>
|
||||||
|
void Store(const Anope::string &key, const T &value)
|
||||||
|
{
|
||||||
|
using Type = std::remove_cv_t<std::remove_reference_t<T>>;
|
||||||
|
|
||||||
|
if constexpr (std::is_same_v<Type, bool>)
|
||||||
|
SetType(key, DataType::BOOL);
|
||||||
|
else if constexpr (std::is_floating_point_v<Type>)
|
||||||
|
SetType(key, DataType::FLOAT);
|
||||||
|
else if constexpr (std::is_integral_v<Type> && std::is_signed_v<Type>)
|
||||||
|
SetType(key, DataType::INT);
|
||||||
|
else if constexpr (std::is_integral_v<Type> && std::is_unsigned_v<Type>)
|
||||||
|
SetType(key, DataType::UINT);
|
||||||
|
|
||||||
|
StoreInternal(key, Anope::ToString(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Tries to load the value of a specific field.
|
||||||
|
* @param key The field to get the value of.
|
||||||
|
* @param out The location to store the retrieved value.
|
||||||
|
*/
|
||||||
|
template <typename T = Anope::string>
|
||||||
|
bool TryLoad(const Anope::string &key, T &out)
|
||||||
|
{
|
||||||
|
Anope::string out_str;
|
||||||
|
if (!LoadInternal(key, out_str))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
auto out_opt = Anope::TryConvert<T>(out_str);
|
||||||
|
if (!out_opt)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
out = out_opt.value();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
/* A serializable type. There should be a single instance of a subclass of this
|
/* A serializable type. There should be a single instance of a subclass of this
|
||||||
* for each subclass of Serializable as this is what is used to serialize and
|
* for each subclass of Serializable as this is what is used to serialize and
|
||||||
* deserialize data from the database.
|
* deserialize data from the database.
|
||||||
|
|||||||
+5
-5
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
@@ -57,11 +57,11 @@ private:
|
|||||||
/* Uplink for this server */
|
/* Uplink for this server */
|
||||||
Server *uplink;
|
Server *uplink;
|
||||||
/* Server is syncing */
|
/* Server is syncing */
|
||||||
bool syncing;
|
bool syncing = true;
|
||||||
/* The server is juped */
|
/* The server is juped */
|
||||||
bool juped;
|
bool juped;
|
||||||
/* The server is about to quit */
|
/* The server is about to quit */
|
||||||
bool quitting;
|
bool quitting = false;
|
||||||
/* Reason this server was quit */
|
/* Reason this server was quit */
|
||||||
Anope::string quit_reason;
|
Anope::string quit_reason;
|
||||||
|
|
||||||
@@ -69,12 +69,12 @@ public:
|
|||||||
/** Constructor
|
/** Constructor
|
||||||
* @param uplink The uplink this server is from, is only NULL when creating Me
|
* @param uplink The uplink this server is from, is only NULL when creating Me
|
||||||
* @param name The server name
|
* @param name The server name
|
||||||
* @param hops Hops from services server
|
|
||||||
* @param description Server rdescription
|
* @param description Server rdescription
|
||||||
* @param sid Server sid/numeric
|
* @param sid Server sid/numeric
|
||||||
|
* @param hops Hops from services server
|
||||||
* @param jupe If the server is juped
|
* @param jupe If the server is juped
|
||||||
*/
|
*/
|
||||||
Server(Server *uplink, const Anope::string &name, unsigned hops, const Anope::string &description, const Anope::string &sid = "", bool jupe = false);
|
Server(Server *uplink, const Anope::string &name, const Anope::string &description, const Anope::string &sid = "", unsigned hops = 0, bool jupe = false);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/** Destructor
|
/** Destructor
|
||||||
|
|||||||
+18
-8
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
@@ -138,20 +138,30 @@ class ServiceReference
|
|||||||
Anope::string name;
|
Anope::string name;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ServiceReference() = default;
|
ServiceReference(const Anope::string &t, const Anope::string &n = "")
|
||||||
|
: type(t)
|
||||||
ServiceReference(const Anope::string &t, const Anope::string &n) : type(t), name(n)
|
, name(n)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
const Anope::string &GetServiceName() const { return name; }
|
/** Retrieves the name of the service (e.g. mysql/main). */
|
||||||
|
const auto &GetServiceName() const { return name; }
|
||||||
|
|
||||||
const Anope::string &GetServiceType() const { return type; }
|
/** Retrieves the type of the service (e.g. SQL::Provider). */
|
||||||
|
const auto &GetServiceType() const { return type; }
|
||||||
|
|
||||||
inline void operator=(const Anope::string &n)
|
/** Invalidates the reference and changes the name of the referenced service. */
|
||||||
|
void SetServiceName(const Anope::string &newname)
|
||||||
{
|
{
|
||||||
this->name = n;
|
|
||||||
this->invalid = true;
|
this->invalid = true;
|
||||||
|
this->name = newname;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Invalidates the reference and changes the type of the referenced service. */
|
||||||
|
void SetServiceType(const Anope::string &newtype)
|
||||||
|
{
|
||||||
|
this->invalid = true;
|
||||||
|
this->type = newtype;
|
||||||
}
|
}
|
||||||
|
|
||||||
operator bool() override
|
operator bool() override
|
||||||
|
|||||||
+2
-4
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
@@ -27,7 +27,7 @@
|
|||||||
#include <exception>
|
#include <exception>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
#include <iostream>
|
#include <istream>
|
||||||
#include <list>
|
#include <list>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <set>
|
#include <set>
|
||||||
@@ -41,8 +41,6 @@
|
|||||||
#include "defs.h"
|
#include "defs.h"
|
||||||
#include "sysconf.h"
|
#include "sysconf.h"
|
||||||
|
|
||||||
#define BUFSIZE 1024
|
|
||||||
|
|
||||||
#define _(x) x
|
#define _(x) x
|
||||||
#define N_(x, y) x, y
|
#define N_(x, y) x, y
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
|
|||||||
+1
-3
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
@@ -28,8 +28,6 @@
|
|||||||
# include <afunix.h>
|
# include <afunix.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define NET_BUFSIZE 65535
|
|
||||||
|
|
||||||
/** A sockaddr union used to combine IPv4 and IPv6 sockaddrs
|
/** A sockaddr union used to combine IPv4 and IPv6 sockaddrs
|
||||||
*/
|
*/
|
||||||
union CoreExport sockaddrs
|
union CoreExport sockaddrs
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
|
|||||||
+23
-1
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
@@ -79,6 +79,12 @@ namespace Anope
|
|||||||
*/
|
*/
|
||||||
extern CoreExport Anope::string FormatCTCP(const Anope::string &name, const Anope::string &body = "");
|
extern CoreExport Anope::string FormatCTCP(const Anope::string &name, const Anope::string &body = "");
|
||||||
|
|
||||||
|
/** Formats a date/time as an IS0 8601 timestamp.
|
||||||
|
* @param ts UNIX timestamp to format.
|
||||||
|
* @param ms Number of milliseconds to format.
|
||||||
|
*/
|
||||||
|
extern CoreExport Anope::string FormatISO8601(time_t ts, unsigned long long ms);
|
||||||
|
|
||||||
/** Parses a CTCP message received from a client.
|
/** Parses a CTCP message received from a client.
|
||||||
* @param text The raw message to parse.
|
* @param text The raw message to parse.
|
||||||
* @param name The location to store the name of the CTCP.
|
* @param name The location to store the name of the CTCP.
|
||||||
@@ -101,6 +107,22 @@ namespace Anope
|
|||||||
extern CoreExport Anope::string Template(const Anope::string &str, const Anope::map<Anope::string> &vars);
|
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
|
class CoreExport HelpWrapper final
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
|
|||||||
+4
-15
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
@@ -31,23 +31,17 @@ private:
|
|||||||
*/
|
*/
|
||||||
time_t secs;
|
time_t secs;
|
||||||
|
|
||||||
/** True if this is a repeating timer
|
|
||||||
*/
|
|
||||||
bool repeat;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/** Constructor, initializes the triggering time
|
/** Constructor, initializes the triggering time
|
||||||
* @param time_from_now The number of seconds from now to trigger the timer
|
* @param time_from_now The number of seconds from now to trigger the timer
|
||||||
* @param repeating Repeat this timer every time_from_now if this is true
|
|
||||||
*/
|
*/
|
||||||
Timer(time_t time_from_now, bool repeating = false);
|
Timer(time_t time_from_now);
|
||||||
|
|
||||||
/** Constructor, initializes the triggering time
|
/** Constructor, initializes the triggering time
|
||||||
* @param creator The creator of the timer
|
* @param creator The creator of the timer
|
||||||
* @param time_from_now The number of seconds from now to trigger the timer
|
* @param time_from_now The number of seconds from now to trigger the timer
|
||||||
* @param repeating Repeat this timer every time_from_now if this is true
|
|
||||||
*/
|
*/
|
||||||
Timer(Module *creator, time_t time_from_now, bool repeating = false);
|
Timer(Module *creator, time_t time_from_now);
|
||||||
|
|
||||||
/** Destructor, removes the timer from the list
|
/** Destructor, removes the timer from the list
|
||||||
*/
|
*/
|
||||||
@@ -63,11 +57,6 @@ public:
|
|||||||
*/
|
*/
|
||||||
time_t GetTimer() const;
|
time_t GetTimer() const;
|
||||||
|
|
||||||
/** Returns true if the timer is set to repeat
|
|
||||||
* @return Returns true if the timer is set to repeat
|
|
||||||
*/
|
|
||||||
bool GetRepeat() const;
|
|
||||||
|
|
||||||
/** Set the interval between ticks
|
/** Set the interval between ticks
|
||||||
* @paramt t The new interval
|
* @paramt t The new interval
|
||||||
*/
|
*/
|
||||||
@@ -86,7 +75,7 @@ public:
|
|||||||
/** Called when the timer ticks
|
/** Called when the timer ticks
|
||||||
* This should be overridden with something useful
|
* This should be overridden with something useful
|
||||||
*/
|
*/
|
||||||
virtual void Tick() = 0;
|
virtual bool Tick() = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
/** This class manages sets of Timers, and triggers them at their defined times.
|
/** This class manages sets of Timers, and triggers them at their defined times.
|
||||||
|
|||||||
+4
-2
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
@@ -54,7 +54,9 @@ class UplinkSocket final
|
|||||||
, public BufferedSocket
|
, public BufferedSocket
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
bool error;
|
bool error = false;
|
||||||
|
size_t recv_msgs = 0;
|
||||||
|
size_t sent_msgs = 0;
|
||||||
UplinkSocket();
|
UplinkSocket();
|
||||||
~UplinkSocket();
|
~UplinkSocket();
|
||||||
bool ProcessRead() override;
|
bool ProcessRead() override;
|
||||||
|
|||||||
+4
-4
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
// Copyright (C) 2008-2011 Robin Burchell <w00t@inspircd.org>
|
// Copyright (C) 2008-2011 Robin Burchell <w00t@inspircd.org>
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
@@ -89,7 +89,7 @@ public: // XXX: exposing a tiny bit too much
|
|||||||
time_t awaytime = 0;
|
time_t awaytime = 0;
|
||||||
|
|
||||||
/* Channels the user is in */
|
/* Channels the user is in */
|
||||||
typedef std::map<Channel *, ChanUserContainer *> ChanUserList;
|
typedef std::map<Channel *, Membership *> ChanUserList;
|
||||||
ChanUserList chans;
|
ChanUserList chans;
|
||||||
|
|
||||||
/* Last time this user sent a memo command used */
|
/* Last time this user sent a memo command used */
|
||||||
@@ -338,9 +338,9 @@ public:
|
|||||||
* This is preferred over using FindUser in Channel, as there are usually more users in a channel
|
* This is preferred over using FindUser in Channel, as there are usually more users in a channel
|
||||||
* than channels a user is in
|
* than channels a user is in
|
||||||
* @param c The channel
|
* @param c The channel
|
||||||
* @return The channel container, or NULL
|
* @return The channel membership, or NULL
|
||||||
*/
|
*/
|
||||||
ChanUserContainer *FindChannel(Channel *c) const;
|
Membership *FindChannel(Channel *c) const;
|
||||||
|
|
||||||
/** Check if the user is protected from kicks and negative mode changes
|
/** Check if the user is protected from kicks and negative mode changes
|
||||||
* @return true or false
|
* @return true or false
|
||||||
|
|||||||
+18
-3
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
@@ -18,6 +18,8 @@
|
|||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
|
#include "sysconf.h"
|
||||||
|
|
||||||
static std::string get_git_hash(const std::string &git_dir)
|
static std::string get_git_hash(const std::string &git_dir)
|
||||||
{
|
{
|
||||||
std::fstream fd;
|
std::fstream fd;
|
||||||
@@ -78,14 +80,18 @@ static bool read_version_sh(const std::string &version_sh, std::map<std::string,
|
|||||||
|
|
||||||
static bool write_build_h(const std::string &buildh, const std::string &git_version)
|
static bool write_build_h(const std::string &buildh, const std::string &git_version)
|
||||||
{
|
{
|
||||||
std::fstream fd(buildh.c_str(), std::ios::in);
|
std::fstream fd;
|
||||||
|
|
||||||
std::string build = "#define BUILD 1";
|
std::string build = "#define BUILD 1";
|
||||||
|
|
||||||
|
#if !REPRODUCIBLE_BUILD
|
||||||
|
fd.open(buildh.c_str(), std::ios::in);
|
||||||
|
|
||||||
if (fd.is_open())
|
if (fd.is_open())
|
||||||
{
|
{
|
||||||
for (std::string filebuf; getline(fd, filebuf);)
|
for (std::string filebuf; getline(fd, filebuf);)
|
||||||
{
|
{
|
||||||
if (!filebuf.find("#define BUILD"))
|
if (!filebuf.find("#define BUILD\t"))
|
||||||
{
|
{
|
||||||
size_t tab = filebuf.find(' ');
|
size_t tab = filebuf.find(' ');
|
||||||
|
|
||||||
@@ -101,6 +107,8 @@ static bool write_build_h(const std::string &buildh, const std::string &git_vers
|
|||||||
}
|
}
|
||||||
|
|
||||||
fd.clear();
|
fd.clear();
|
||||||
|
#endif
|
||||||
|
|
||||||
fd.open(buildh.c_str(), std::ios::out);
|
fd.open(buildh.c_str(), std::ios::out);
|
||||||
if (!fd.is_open())
|
if (!fd.is_open())
|
||||||
{
|
{
|
||||||
@@ -111,6 +119,13 @@ static bool write_build_h(const std::string &buildh, const std::string &git_vers
|
|||||||
fd << "/* This file is automatically generated by version.cpp - do not edit it! */" << std::endl
|
fd << "/* This file is automatically generated by version.cpp - do not edit it! */" << std::endl
|
||||||
<< "#pragma once" << std::endl
|
<< "#pragma once" << std::endl
|
||||||
<< build << std::endl;
|
<< build << std::endl;
|
||||||
|
#if !REPRODUCIBLE_BUILD
|
||||||
|
auto time_now = time(NULL);
|
||||||
|
auto *local_tm = localtime(&time_now);
|
||||||
|
char buffer[100];
|
||||||
|
strftime(buffer, sizeof(buffer), "%a %b %e %Y %T %Z", local_tm);
|
||||||
|
fd << "#define BUILD_DATE \"" << buffer << "\"" << std::endl;
|
||||||
|
#endif
|
||||||
if (!git_version.empty())
|
if (!git_version.empty())
|
||||||
fd << "#define VERSION_GIT \"" << git_version << "\"" << std::endl;
|
fd << "#define VERSION_GIT \"" << git_version << "\"" << std::endl;
|
||||||
fd.close();
|
fd.close();
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
// Anope IRC Services <https://www.anope.org/>
|
// Anope IRC Services <https://www.anope.org/>
|
||||||
//
|
//
|
||||||
// Copyright (C) 2003-2025 Anope Contributors
|
// Copyright (C) 2003-2026 Anope Contributors
|
||||||
//
|
//
|
||||||
// Anope is free software. You can use, modify, and/or distribute it under the
|
// Anope is free software. You can use, modify, and/or distribute it under the
|
||||||
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
// terms of version 2 of the GNU General Public License. See docs/LICENSE.txt
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user