mirror of
https://github.com/anope/anope.git
synced 2026-07-03 13:03:14 +02:00
Compare commits
375 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| a1607f41b6 | |||
| 10901dd05b | |||
| 01177212bd | |||
| 64f83b3ccf | |||
| 172325ee97 | |||
| 969aacbf78 | |||
| 304e6eaabe | |||
| 564b8b8d9d | |||
| 309807c67f | |||
| 5fd1485938 | |||
| 7a741b467c | |||
| d24ae1f961 | |||
| eab5abb351 | |||
| f7b1b1907c | |||
| a563c8fb2f | |||
| def6a6deee | |||
| 1a3f890613 | |||
| d2d89ac412 | |||
| e090eaea65 | |||
| 1dbd7b406f | |||
| 27dde3266c | |||
| f1c3f0d820 | |||
| 0a78656804 | |||
| e2213e3cd2 | |||
| ec9931288b | |||
| 71ec1a93dd | |||
| 245a25877f | |||
| ae071cef75 | |||
| 57b31d43eb | |||
| 43152007c6 | |||
| 91ff17d10f | |||
| 357cd44bea | |||
| 46271fc348 | |||
| d8ca7c63bf | |||
| f7bac0839b | |||
| 862b101935 | |||
| 20d40fdc75 | |||
| 9650a3ffa5 | |||
| 14a957f8a0 | |||
| 8fb31b6441 | |||
| 969258352a | |||
| a6b09c1d9f | |||
| a9021f6284 | |||
| fa33bb2842 | |||
| cb9ab016f5 | |||
| 83e42f2adc | |||
| e0c3069c5f | |||
| 3e6d838285 | |||
| 64dd3c6655 | |||
| 9486cf9ecb | |||
| 0106d0b6bd | |||
| 3779ed916a | |||
| 3f05a42515 | |||
| d0e5a18848 | |||
| 670e73d69d | |||
| 07fffb0b90 | |||
| 1d3ca36768 | |||
| 8559c57cd6 | |||
| 792790a4d4 | |||
| 381d95e6da | |||
| 74556b77c0 | |||
| 91527cdcef | |||
| b9aa534731 | |||
| 658ecee817 | |||
| fb99dc43c9 | |||
| 144029fd61 | |||
| 2a1cd54bc7 | |||
| 0dd4a98e53 | |||
| f1577975a9 | |||
| fa833766a0 | |||
| 783f77d367 | |||
| dc840e9b99 | |||
| 0982becd98 | |||
| f83096c729 | |||
| eb7c9d0a86 | |||
| 8007cc8a3a | |||
| 30ea6365de | |||
| a11155551e | |||
| d45222798b | |||
| edb362eace | |||
| 1e9f1b09f5 | |||
| 16439f52a5 | |||
| 45640c43d3 | |||
| 6ebbec79ea | |||
| 096de4fb25 | |||
| 01946cb467 | |||
| 0e0538408d | |||
| 841b3f689e | |||
| 0315bd31f8 | |||
| 2539f34d3c | |||
| 7eb437b9fe | |||
| 0e0eb38b2a | |||
| 6fca33a2ba | |||
| 66e2dce646 | |||
| 06679e487e | |||
| 54acc25eb3 | |||
| a4c81c72c1 | |||
| 2060bacdea | |||
| 8d1fe0a36f | |||
| 165c0588d4 | |||
| 7c14f76bc8 | |||
| a86e15afe9 | |||
| 2b847c63e9 | |||
| 11b91fdc67 | |||
| 0dda705cdb | |||
| f4d7ae2e12 | |||
| 826e040d41 | |||
| 3ef227aa88 | |||
| f592417ec2 | |||
| ed13cd11ec | |||
| f8a0a645b0 | |||
| 12b0ff0593 | |||
| 13688c595b | |||
| 2b7dd6c2a0 | |||
| c5fc11f5fe | |||
| bf2f151c68 | |||
| 4c64c86ef4 | |||
| cb975f4a6c | |||
| 0383868a29 | |||
| b92711dc15 | |||
| e990259d6d | |||
| 5a4de87df1 | |||
| 9a488327b2 | |||
| f302367fc4 | |||
| 3866b002d6 | |||
| fab8b8b137 | |||
| 80d0e03f64 | |||
| a32ab376db | |||
| f39d94c84e | |||
| ac338266f4 | |||
| 7385580ffa | |||
| f4a0ee30b3 | |||
| bd94cbc25b | |||
| 3a97d196f9 | |||
| 22894e9e09 | |||
| 24f3066224 | |||
| d53c25b043 | |||
| 7dfc8e8ee8 | |||
| 3a9a0ef135 | |||
| e594937c0b | |||
| 085976adf5 | |||
| a2be8c402f | |||
| a29845cc56 | |||
| fac3b85903 | |||
| d1b5797f5d | |||
| f1fa7e1a5f | |||
| a2e9e45e37 | |||
| ee0636ac46 | |||
| ed9ec89061 | |||
| b7c6f8ec7f | |||
| 94f7962e1a | |||
| 3308ab7153 | |||
| 951de6b39d | |||
| 388fe38d00 | |||
| d034a9c36a | |||
| 49064ec67d | |||
| a9fa7edf82 | |||
| 42dd49233c | |||
| 3a422777c5 | |||
| e42f125a85 | |||
| f5a7a5d8bc | |||
| ca7769d8b4 | |||
| e5bd79ba19 | |||
| 804cb9b051 | |||
| 7582b6503f | |||
| cd9ec6fe10 | |||
| 8f60562dfa | |||
| 3bf6cdb6ac | |||
| c01f8cad22 | |||
| cea53460b0 | |||
| d8642972d9 | |||
| 9b26a0dc09 | |||
| 15c66af4e5 | |||
| 6661c3ebdb | |||
| 0c9117abce | |||
| ff17a9af7e | |||
| 1b636ed4ff | |||
| 61b6c92ee2 | |||
| e604e04847 | |||
| 461bc4c87e | |||
| d049bf0d8f | |||
| a53cbd82cc | |||
| 571ff82f69 | |||
| 7ddc6d8be5 | |||
| dd258b36d2 | |||
| 8e59e58987 | |||
| de902c6db3 | |||
| e02967bd4a | |||
| 92bf0c800f | |||
| 40c9226e3a | |||
| e897082f69 | |||
| b67dada56f | |||
| c66f28ed61 | |||
| 87e96d6f52 | |||
| f590c52321 | |||
| 911cc43d9c | |||
| 6ba8f8b264 | |||
| 94f465832f | |||
| 9ab97ae21a | |||
| 246a2c664b | |||
| ad4180e2d6 | |||
| 01906d0b74 | |||
| 005d3f9558 | |||
| a895077b54 | |||
| 7e10fca23b | |||
| b2d258328a | |||
| ef5c945e0b | |||
| 1e0bfbd15a | |||
| cb73ab9d23 | |||
| ac90a6935a | |||
| 766fe138e4 | |||
| dafccc1821 | |||
| ace25983a4 | |||
| bb7b8e27ee | |||
| 72fa53c20e | |||
| eb0c255fad | |||
| 01994c1ba1 | |||
| ec7bc8dd41 | |||
| 6ee50f852e | |||
| 6cd3b56805 | |||
| 27ad395a56 | |||
| c4247b71b2 | |||
| 5a51984db1 | |||
| b75abf9ba3 | |||
| f39c428ac5 | |||
| 60f0b2ff87 | |||
| 6242a60134 | |||
| dd198b89c0 | |||
| 2cfcf3c512 | |||
| 29bd5a7daa | |||
| 975b0cd374 | |||
| a0ebea2049 | |||
| cc8e88aec8 | |||
| 11d47efc7a | |||
| c7154edb4d | |||
| 5559f91fae | |||
| 3dd71f207d | |||
| 7776fb8548 | |||
| 7954542a86 | |||
| a1c45be517 | |||
| bab5a37970 | |||
| da1162f770 | |||
| abc8b4aa4e | |||
| 60c7b5b10f | |||
| a939b821a7 | |||
| 14150647bc | |||
| 1b265bf291 | |||
| ac279a1637 | |||
| 6ed06539be | |||
| b5242e3be0 | |||
| 84ac00e953 | |||
| 822e75b501 | |||
| e2c6825cd2 | |||
| fdcc5b5ee1 | |||
| 4f438917f1 | |||
| 250aecb683 | |||
| 4ca2b60f91 | |||
| e305db41ce | |||
| 6ad63349c1 | |||
| d0646a37dc | |||
| b80e0cb996 | |||
| 5b65c9ce87 | |||
| f07f92e30d | |||
| 594c161622 | |||
| 0570b57a99 | |||
| 727bcf1fde | |||
| 699bee06c3 | |||
| ab337e8de0 | |||
| 381f74a26e | |||
| 471043c5c4 | |||
| 29c8702c35 | |||
| 0b82d74262 | |||
| 5cb5dc197a | |||
| 664ca1bbf2 | |||
| efa7c81ca8 | |||
| 2874513e0a | |||
| 51d9b5056d | |||
| 3c219be3c7 | |||
| cc8f2117f8 | |||
| 230f9e9a35 | |||
| d468567a12 | |||
| d3d36ff73c | |||
| 4897cdf60f | |||
| ef8db98e5c | |||
| d9e57f5651 | |||
| e50c6a5efb | |||
| a331432030 | |||
| ac338268c9 | |||
| 1354bf8815 | |||
| ed1469d3b1 | |||
| 6b8277f152 | |||
| 2d69fea6d2 | |||
| af916f28f4 | |||
| 7c2db57965 | |||
| b13836f3cf | |||
| 2bd483c273 | |||
| 217a375517 | |||
| 97a42e4f7d | |||
| 113237964d | |||
| a3afe44ca6 | |||
| b60b06ad76 | |||
| 902158671a | |||
| 1873d67093 | |||
| 2629a580a1 | |||
| cfc81d5aca | |||
| 72ae5cacd4 | |||
| f2598bdb6e | |||
| 101fe6882d | |||
| a30afed7b2 | |||
| feedbd6b0d | |||
| 05bc74d9cb | |||
| e0cc7a6c0b | |||
| 2fdcb30beb | |||
| feff8c1fb1 | |||
| ea05ff108a | |||
| bcae4f00e1 | |||
| 01f65c7e64 | |||
| 958521b8c6 | |||
| 06d5233502 | |||
| a4b40f6f67 | |||
| 1d4f61e089 | |||
| 8ff16f17cc | |||
| 2bb115f6e4 | |||
| e46b0f0ccd | |||
| 572d1a94bd | |||
| 9210aae6f9 | |||
| d4b6968108 | |||
| 672acf306f | |||
| a408ceee74 | |||
| 55a564a0b4 | |||
| 027567b4b0 | |||
| 25e81f6ea9 | |||
| ea090fae8d | |||
| 74c5d989bc | |||
| 1dec3ee8fb | |||
| 446a6f6ea5 | |||
| 9d89891a90 | |||
| 1cbfdac929 | |||
| 49d1d9e79b | |||
| eb4510946f | |||
| 104b52b06e | |||
| 697f535f8b | |||
| 35ca9adc25 | |||
| 8f3958d0f4 | |||
| 57fb28e70a | |||
| 1ba8e796c7 | |||
| 645c224ff7 | |||
| 66a9b8605f | |||
| 9ee3f37bee | |||
| 9d7edd3055 | |||
| 2af1c0a5e9 | |||
| 08c8a883ef | |||
| 7cc23d874f | |||
| 324b4ee85e | |||
| 3ba4d4e97d | |||
| 9bb905229d | |||
| f98a3a85d6 | |||
| ef83568646 | |||
| 64fee38976 | |||
| 4768beb328 | |||
| 60c88393a0 | |||
| 07892e8b4b | |||
| 6c801d5780 | |||
| 0b76c8b5e6 | |||
| 942b1a8800 | |||
| 308d7937ef | |||
| 9c2591c20a | |||
| 6c51b17ef1 | |||
| 5a191ce5a6 | |||
| a68730adb1 | |||
| 9d24e8f35c | |||
| 4a8bc79a06 | |||
| b37da9de9e | |||
| a632cdc732 | |||
| c777c8d9aa |
@@ -1,5 +1,5 @@
|
|||||||
___
|
___
|
||||||
/ _ \ https://www.anope.org/
|
/ _ \ http://www.anope.org
|
||||||
| /_\ | _ __ _ _ _ _ ___
|
| /_\ | _ __ _ _ _ _ ___
|
||||||
| _ || '_ \/ _ \/ _ \ / _ \
|
| _ || '_ \/ _ \/ _ \ / _ \
|
||||||
| | | || | | |_| |_| | __/
|
| | | || | | |_| |_| | __/
|
||||||
@@ -9,11 +9,10 @@
|
|||||||
CURVER
|
CURVER
|
||||||
This program will help you to compile your Services, and ask you
|
This program will help you to compile your Services, and ask you
|
||||||
questions regarding the compile-time settings of it during the
|
questions regarding the compile-time settings of it during the
|
||||||
process. For more options type SOURCE_DIR/Config --help
|
process. For more options type ./Config --help
|
||||||
|
|
||||||
Anope is a set of Services for IRC networks that allows users to
|
Anope is a set of Services for IRC networks that allows users to
|
||||||
manage their nicks and channels in a secure and efficient way,
|
manage their nicks and channels in a secure and efficient way,
|
||||||
and administrators to manage their network with powerful tools.
|
and administrators to manage their network with powerful tools.
|
||||||
|
|
||||||
For all your Anope needs please visit our portal at
|
For all your Anope needs please visit our portal at www.anope.org
|
||||||
https://www.anope.org/
|
|
||||||
|
|||||||
@@ -1,33 +0,0 @@
|
|||||||
---
|
|
||||||
name: Bug report
|
|
||||||
about: Report a non-security issue with Anope.
|
|
||||||
---
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Please fill in the template below. It will help us process your bug report a lot faster. If you have multiple bugs to report then please open one issue for each bug.
|
|
||||||
-->
|
|
||||||
|
|
||||||
**Description**
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Steps to reproduce the issue:**
|
|
||||||
|
|
||||||
1.
|
|
||||||
2.
|
|
||||||
3.
|
|
||||||
|
|
||||||
**Describe the results you received:**
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Describe the results you expected:**
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Additional information you deem important (e.g. issue happens only occasionally):**
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Output of `services --version`:**
|
|
||||||
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
---
|
|
||||||
name: Feature request
|
|
||||||
about: Request that a new feature is added to Anope.
|
|
||||||
---
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Please fill in the template below. It will help us process your feature request a lot faster. If you have multiple features to request then please open one issue for each feature.
|
|
||||||
-->
|
|
||||||
|
|
||||||
**Description**
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Why this would be useful**
|
|
||||||
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
blank_issues_enabled: false
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
<!--
|
|
||||||
Please fill in the template below. It will help us process your pull request a lot faster.
|
|
||||||
-->
|
|
||||||
|
|
||||||
## Summary
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Briefly describe what this pull request changes.
|
|
||||||
-->
|
|
||||||
|
|
||||||
## Rationale
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Describe why you have made this change.
|
|
||||||
-->
|
|
||||||
|
|
||||||
## Testing Environment
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Describe the environment in which you have tested this change:
|
|
||||||
-->
|
|
||||||
|
|
||||||
I have tested this pull request on:
|
|
||||||
|
|
||||||
**Operating system name and version:** <!-- e.g. Linux 3.11 -->
|
|
||||||
**Compiler name and version:** <!-- e.g. GCC 4.2.0 -->
|
|
||||||
|
|
||||||
## Checks
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Tick the boxes for the checks you have made.
|
|
||||||
-->
|
|
||||||
|
|
||||||
I have ensured that:
|
|
||||||
|
|
||||||
- [ ] 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.
|
|
||||||
- [ ] 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).
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
# Security Policy
|
|
||||||
|
|
||||||
## Supported Versions
|
|
||||||
|
|
||||||
Currently the 2.0 (stable) branch is actively receiving security fixes.
|
|
||||||
|
|
||||||
The 2.1 (development) branch is still early in development and currently only receives security fixes when they are synced from the 2.0 branch.
|
|
||||||
|
|
||||||
Version | Supported
|
|
||||||
------- | ---------
|
|
||||||
2.1.x | :warning:
|
|
||||||
2.0.x | :white_check_mark:
|
|
||||||
1.8.x | :x:
|
|
||||||
|
|
||||||
## Reporting a Vulnerability
|
|
||||||
|
|
||||||
Please do not report security vulnerabilities on GitHub. Instead, email the details to team@anope.org or get the attention of a developer in our development IRC channel at irc.teranova.net #anope-devel and PM them the details.
|
|
||||||
|
|
||||||
We will triage your issue as soon as possible and try to release a fixed version within a week of receiving your report.
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
version: 2
|
|
||||||
updates:
|
|
||||||
- package-ecosystem: github-actions
|
|
||||||
directory: /
|
|
||||||
schedule:
|
|
||||||
interval: monthly
|
|
||||||
target-branch: "2.1"
|
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
name: Ubuntu CI
|
|
||||||
on:
|
|
||||||
- pull_request
|
|
||||||
- push
|
|
||||||
- workflow_dispatch
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
if: "!contains(github.event.head_commit.message, '[skip ubuntu ci]')"
|
|
||||||
runs-on: ubuntu-24.04
|
|
||||||
env:
|
|
||||||
CXX: ${{ matrix.compiler }}
|
|
||||||
CXXFLAGS: -std=${{ matrix.standard }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v6
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: |
|
|
||||||
sudo apt-get update --assume-yes
|
|
||||||
sudo apt-get install --assume-yes --no-install-recommends \
|
|
||||||
clang \
|
|
||||||
g++ \
|
|
||||||
gettext \
|
|
||||||
git \
|
|
||||||
libgnutls28-dev \
|
|
||||||
libldap2-dev \
|
|
||||||
libmysqlclient-dev \
|
|
||||||
libpcre2-dev \
|
|
||||||
libpcre3-dev \
|
|
||||||
libsqlite3-dev \
|
|
||||||
libssl-dev \
|
|
||||||
libtre-dev \
|
|
||||||
ninja-build
|
|
||||||
|
|
||||||
- name: Enable extras
|
|
||||||
run: |
|
|
||||||
for MODULE in m_ldap.cpp m_ldap_authentication.cpp m_ldap_oper.cpp m_mysql.cpp m_regex_pcre.cpp m_regex_pcre2.cpp m_regex_posix.cpp m_regex_tre.cpp m_sql_authentication.cpp m_sql_log.cpp m_sql_oper.cpp m_sqlite.cpp m_ssl_gnutls.cpp m_ssl_openssl.cpp stats
|
|
||||||
do
|
|
||||||
ln -s ${{ github.workspace }}/modules/extra/$MODULE ${{ github.workspace }}/modules
|
|
||||||
done
|
|
||||||
|
|
||||||
- name: Run CMake
|
|
||||||
run: |
|
|
||||||
mkdir build && cd build
|
|
||||||
cmake -GNinja -DCMAKE_BUILD_TYPE:STRING=DEBUG -DINSTDIR:STRING=${{ github.workspace }}/run ..
|
|
||||||
|
|
||||||
- name: Build Anope
|
|
||||||
run: |
|
|
||||||
ninja -C ${{ github.workspace }}/build install
|
|
||||||
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
compiler:
|
|
||||||
- clang++
|
|
||||||
- g++
|
|
||||||
standard:
|
|
||||||
- c++98
|
|
||||||
- c++17
|
|
||||||
@@ -1,74 +0,0 @@
|
|||||||
name: Windows CI
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
push:
|
|
||||||
release:
|
|
||||||
types:
|
|
||||||
- published
|
|
||||||
workflow_dispatch:
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
if: "!contains(github.event.head_commit.message, '[skip windows ci]')"
|
|
||||||
runs-on: windows-2025
|
|
||||||
env:
|
|
||||||
BUILD_TYPE: ${{ github.event_name == 'release' && 'Release' || 'Debug' }}
|
|
||||||
CONAN_USER_HOME: ${{ github.workspace }}/win/build
|
|
||||||
CONAN_USER_HOME_SHORT: None
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v6
|
|
||||||
|
|
||||||
- name: Setup NSIS
|
|
||||||
run: |-
|
|
||||||
choco install nsis
|
|
||||||
|
|
||||||
- name: Setup MSBuild
|
|
||||||
uses: microsoft/setup-msbuild@v2
|
|
||||||
|
|
||||||
- name: Setup Conan
|
|
||||||
uses: turtlebrowser/get-conan@v1.2
|
|
||||||
with:
|
|
||||||
version: 1.66.0
|
|
||||||
|
|
||||||
- name: Try to restore libraries from the cache
|
|
||||||
uses: actions/cache/restore@v4
|
|
||||||
id: library-cache
|
|
||||||
with:
|
|
||||||
key: conan-${{ hashFiles('src/win32/conanfile.txt') }}
|
|
||||||
path: ${{ env.CONAN_USER_HOME }}/.conan
|
|
||||||
|
|
||||||
- name: Install libraries
|
|
||||||
run: |
|
|
||||||
conan install ${{ github.workspace }}\src\win32 --build=missing
|
|
||||||
|
|
||||||
- name: Save libraries to the cache
|
|
||||||
if: ${{ steps.library-cache.outputs.cache-hit != 'true' }}
|
|
||||||
uses: actions/cache/save@v4
|
|
||||||
with:
|
|
||||||
key: ${{ steps.library-cache.outputs.cache-primary-key }}
|
|
||||||
path: ${{ env.CONAN_USER_HOME }}/.conan
|
|
||||||
|
|
||||||
- name: Run CMake
|
|
||||||
run: |
|
|
||||||
mkdir ${{ github.workspace }}\build
|
|
||||||
cd ${{ github.workspace }}\build
|
|
||||||
cmake -A x64 -D "CMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }}" -G "Visual Studio 17 2022" ..
|
|
||||||
|
|
||||||
- name: Build Anope
|
|
||||||
working-directory: ${{ github.workspace }}\build
|
|
||||||
run: |
|
|
||||||
msbuild PACKAGE.vcxproj /M:5 /P:Configuration=${{ env.BUILD_TYPE }} /P:Platform=x64 /VERBOSITY:MINIMAL
|
|
||||||
|
|
||||||
- name: Upload installer
|
|
||||||
if: "${{ github.event_name == 'release' }}"
|
|
||||||
working-directory: ${{ github.workspace }}\build
|
|
||||||
env:
|
|
||||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
run: |
|
|
||||||
gh release upload ${{ github.event.release.tag_name }} $(Get-ChildItem anope-*.exe)
|
|
||||||
|
|
||||||
- name: Upload artifact
|
|
||||||
if: "${{ github.event_name != 'release' }}"
|
|
||||||
uses: actions/upload-artifact@v5
|
|
||||||
with:
|
|
||||||
name: windows-installer
|
|
||||||
path: ${{ github.workspace }}\build\\anope-*.exe
|
|
||||||
+33
-18
@@ -1,20 +1,35 @@
|
|||||||
build/
|
*.so
|
||||||
|
*.o
|
||||||
|
*.s
|
||||||
|
Makefile
|
||||||
|
Makefile.inc
|
||||||
|
autom4te.cache/
|
||||||
config.cache
|
config.cache
|
||||||
docs/doxygen
|
config.log
|
||||||
|
config.status
|
||||||
include/sysconf.h
|
include/sysconf.h
|
||||||
modules/m_ldap.cpp
|
include/version.h
|
||||||
modules/m_ldap_authentication.cpp
|
include/language.h
|
||||||
modules/m_ldap_oper.cpp
|
lang/language.h
|
||||||
modules/m_mysql.cpp
|
src/bin/anoperc
|
||||||
modules/m_regex_pcre.cpp
|
lang/cat
|
||||||
modules/m_regex_pcre2.cpp
|
lang/de
|
||||||
modules/m_regex_posix.cpp
|
lang/en_us
|
||||||
modules/m_regex_tre.cpp
|
lang/es
|
||||||
modules/m_sql_authentication.cpp
|
lang/fr
|
||||||
modules/m_sql_log.cpp
|
lang/gr
|
||||||
modules/m_sql_oper.cpp
|
lang/hun
|
||||||
modules/m_sqlite.cpp
|
lang/index
|
||||||
modules/m_ssl_gnutls.cpp
|
lang/it
|
||||||
modules/m_ssl_openssl.cpp
|
lang/langcheck
|
||||||
modules/stats
|
lang/langcomp
|
||||||
run/
|
lang/nl
|
||||||
|
lang/pl
|
||||||
|
lang/pt
|
||||||
|
lang/ru
|
||||||
|
lang/tr
|
||||||
|
lang/ja_utf8
|
||||||
|
src/services
|
||||||
|
src/tools/anopesmtp
|
||||||
|
src/tools/db-merger
|
||||||
|
src/tools/epona2anope
|
||||||
|
|||||||
@@ -1,60 +0,0 @@
|
|||||||
(svnadmin) <svn@localhost> <svn svn@31f1291d-b8d6-0310-a050-a5561fc1590b@5417fbe8-f217-4b02-8779-1006273d7864>
|
|
||||||
Adam <adam@anope.org> <adam-@5417fbe8-f217-4b02-8779-1006273d7864>
|
|
||||||
Adam <adam@anope.org> <adam@adam-laptop.(none)>
|
|
||||||
Adam <adam@anope.org> <Adam@anope.org>
|
|
||||||
Adam <adam@anope.org> <Adam@drink-coca-cola.info>
|
|
||||||
Adam <adam@anope.org> <Adam@sigterm.info>
|
|
||||||
Adam Kramer <ribosome@anope.org> <ribosome ribosome@31f1291d-b8d6-0310-a050-a5561fc1590b@5417fbe8-f217-4b02-8779-1006273d7864>
|
|
||||||
Alvaro Toledo <atoledo@keldon.org> <atoledo atoledo@31f1291d-b8d6-0310-a050-a5561fc1590b@5417fbe8-f217-4b02-8779-1006273d7864>
|
|
||||||
Attila Molnar <attilamolnar@hush.com>
|
|
||||||
Björn Stiddien <keeper@anope.org> <keeper keeper@31f1291d-b8d6-0310-a050-a5561fc1590b@5417fbe8-f217-4b02-8779-1006273d7864>
|
|
||||||
Charles Kingsley <chaz@anope.org>
|
|
||||||
Charles Kingsley <chaz@anope.org> <sjaz@5417fbe8-f217-4b02-8779-1006273d7864>
|
|
||||||
Cronus <cronus@nite-serv.com>
|
|
||||||
Daniel Engel <dane@zero.org> <dane dane@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>
|
|
||||||
Dennis Friis <peavey@inspircd.org> <peavey peavey@inspircd.org@5417fbe8-f217-4b02-8779-1006273d7864>
|
|
||||||
Fabio Scotoni <cculex@gmail.com>
|
|
||||||
Filippo Cortigiani <simos@simosnap.org> <devel@devel.crtnet.it>
|
|
||||||
Filippo Cortigiani <simos@simosnap.org> <simos@H7-25.fritz.box>
|
|
||||||
Florian Schulze <certus@anope.org> <certus certus@31f1291d-b8d6-0310-a050-a5561fc1590b@5417fbe8-f217-4b02-8779-1006273d7864>
|
|
||||||
Gabriel Acevedo H. <drstein@anope.org> <drstein drstein@31f1291d-b8d6-0310-a050-a5561fc1590b@5417fbe8-f217-4b02-8779-1006273d7864>
|
|
||||||
Harakiri <harakiri@overstack.fr>
|
|
||||||
Hendrik Jäger <gitcommit@henk.geekmail.org> <github@henk.geekmail.org>
|
|
||||||
Jan Milants <viper@anope.org>
|
|
||||||
Jan Milants <viper@anope.org> <jantje_85@5417fbe8-f217-4b02-8779-1006273d7864>
|
|
||||||
Jan Milants <viper@anope.org> <viper viper@31f1291d-b8d6-0310-a050-a5561fc1590b@5417fbe8-f217-4b02-8779-1006273d7864>
|
|
||||||
Jens Voss <dukepyrolator@anope.org> <anope@s15355730.onlinehome-server.info>
|
|
||||||
Jens Voss <dukepyrolator@anope.org> <DukePyrolator@5417fbe8-f217-4b02-8779-1006273d7864>
|
|
||||||
Jens Voss <dukepyrolator@anope.org> <DukePyrolator@anope.org>
|
|
||||||
Jens Voss <dukepyrolator@anope.org> <jens@pyrobook.(none)>
|
|
||||||
k4be <k4be@pirc.pl> <34816207+k4bek4be@users.noreply.github.com>
|
|
||||||
Lee Holmes <lethality@anope.org>
|
|
||||||
Lee Holmes <lethality@anope.org> <lee@lethality.me.uk>
|
|
||||||
Mark Summers <mark@goopler.net> <mark mark@31f1291d-b8d6-0310-a050-a5561fc1590b@5417fbe8-f217-4b02-8779-1006273d7864>
|
|
||||||
Matt Schatz <genius3000@g3k.solutions>
|
|
||||||
Matt Ullman <matt@airraidsirens.com> <blindsight@gamesurge.net>
|
|
||||||
Michael Hazell <michaelhazell@hotmail.com> <Techman-@users.noreply.github.com>
|
|
||||||
Michael Stapelberg <michael@robustirc.net> <stapelberg@users.noreply.github.com>
|
|
||||||
Michael Wobst <wobst.michael@web.de>
|
|
||||||
Michael Wobst <wobst.michael@web.de> <michael@static.163.129.251.148.clients.your-server.de>
|
|
||||||
Michael Wobst <wobst.michael@web.de> <michael@wobst.at>
|
|
||||||
Naram Qashat <cyberbotx@anope.org> <cyberbotx@5417fbe8-f217-4b02-8779-1006273d7864>
|
|
||||||
Naram Qashat <cyberbotx@anope.org> <cyberbotx@cyberbotx.com>
|
|
||||||
Naram Qashat <cyberbotx@anope.org> <Naram Qashat cyberbotx@cyberbotx.com@5417fbe8-f217-4b02-8779-1006273d7864>
|
|
||||||
PeGaSuS <droider.pc@gmail.com>
|
|
||||||
PeGaSuS <droider.pc@gmail.com> <25697531+TehPeGaSuS@users.noreply.github.com>
|
|
||||||
Pieter Bootsma <geniusdex@anope.org> <geniusdex geniusdex@31f1291d-b8d6-0310-a050-a5561fc1590b@5417fbe8-f217-4b02-8779-1006273d7864>
|
|
||||||
Robby <robby@chatbelgie.be> <robby@anope.org>
|
|
||||||
Robby <robby@chatbelgie.be> <robby@chat.be>
|
|
||||||
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> <Robin Burchell w00t@inspircd.org@5417fbe8-f217-4b02-8779-1006273d7864>
|
|
||||||
Sadie Powell <sadie@sadiepowell.dev> <petpow@saberuk.com>
|
|
||||||
Sadie Powell <sadie@sadiepowell.dev> <sadie@witchery.services>
|
|
||||||
Sebastian Barfurth <github@afreshmelon.com>
|
|
||||||
Sebastian V. <hal9000@denorastats.org>
|
|
||||||
Sebastian V. <hal9000@denorastats.org> <pimpmylinux@5417fbe8-f217-4b02-8779-1006273d7864>
|
|
||||||
Trystan S. Lee <trystan@nomadirc.net> <trystan trystan@31f1291d-b8d6-0310-a050-a5561fc1590b@5417fbe8-f217-4b02-8779-1006273d7864>
|
|
||||||
Val Lorentz <progval+git@progval.net> <progval+git@progval.net>
|
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
branches:
|
||||||
|
except:
|
||||||
|
- 1.8
|
||||||
-549
@@ -1,549 +0,0 @@
|
|||||||
# This usage of CMake requires at least version 2.4 (checks are made to determine what to use when certain versions lack functions)
|
|
||||||
cmake_minimum_required(VERSION 2.4...3.20 FATAL_ERROR)
|
|
||||||
|
|
||||||
# Set the project as C++ primarily, but have C enabled for the checks required later
|
|
||||||
project(Anope CXX)
|
|
||||||
enable_language(C)
|
|
||||||
|
|
||||||
# Detect the version of CMake for the later conditional checks
|
|
||||||
execute_process(COMMAND ${CMAKE_COMMAND} --version OUTPUT_VARIABLE VERSION OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
||||||
string(REGEX REPLACE "cmake version 2\\.(.*)" "\\1" ONLY_VERSION "${VERSION}")
|
|
||||||
string(REGEX MATCH "-patch .*$" HAS_PATCH "${ONLY_VERSION}")
|
|
||||||
if(HAS_PATCH)
|
|
||||||
string(REGEX REPLACE "(.*)-patch .*" "\\1" MINOR_VERSION "${ONLY_VERSION}")
|
|
||||||
string(REGEX REPLACE ".*-patch (.*)" "\\1" PATCH_VERSION "${ONLY_VERSION}")
|
|
||||||
else(HAS_PATCH)
|
|
||||||
string(REGEX MATCH "\\." HAS_DOT "${ONLY_VERSION}")
|
|
||||||
if(HAS_DOT)
|
|
||||||
string(REGEX REPLACE "(.*)\\..*" "\\1" MINOR_VERSION "${ONLY_VERSION}")
|
|
||||||
string(REGEX REPLACE ".*\\.(.*)" "\\1" PATCH_VERSION "${ONLY_VERSION}")
|
|
||||||
else(HAS_DOT)
|
|
||||||
string(REGEX REPLACE "(.*)-beta" "\\1" MINOR_VERSION "${ONLY_VERSION}")
|
|
||||||
if(MINOR_VERSION STREQUAL "4-1\n")
|
|
||||||
set(PATCH_VERSION 1)
|
|
||||||
else(MINOR_VERSION STREQUAL "4-1\n")
|
|
||||||
set(PATCH_VERSION 0)
|
|
||||||
endif(MINOR_VERSION STREQUAL "4-1\n")
|
|
||||||
set(MINOR_VERSION 4)
|
|
||||||
endif(HAS_DOT)
|
|
||||||
endif(HAS_PATCH)
|
|
||||||
|
|
||||||
# Detect is we are using CMake 2.6 or better, these versions include functions that require less work than CMake 2.4 does
|
|
||||||
if(MINOR_VERSION GREATER 5)
|
|
||||||
set(CMAKE26_OR_BETTER TRUE)
|
|
||||||
set(CMAKE248_OR_BETTER TRUE)
|
|
||||||
set(CMAKE244_OR_BETTER TRUE)
|
|
||||||
set(CMAKE242_OR_BETTER TRUE)
|
|
||||||
else(MINOR_VERSION GREATER 5)
|
|
||||||
set(CMAKE26_OR_BETTER FALSE)
|
|
||||||
# Also detect if we are using CMake 2.4.8 or better, the FIND sub-command of list() is nonexistent in earlier versions
|
|
||||||
if(PATCH_VERSION GREATER 7)
|
|
||||||
set(CMAKE248_OR_BETTER TRUE)
|
|
||||||
set(CMAKE244_OR_BETTER TRUE)
|
|
||||||
set(CMAKE242_OR_BETTER TRUE)
|
|
||||||
else(PATCH_VERSION GREATER 7)
|
|
||||||
set(CMAKE248_OR_BETTER FALSE)
|
|
||||||
# Also detect if we are using CMake 2.4.4 or better, the CheckCXXCompilerFlag module and SORT sub-command of list() are nonexistent in earlier versions
|
|
||||||
if(PATCH_VERSION GREATER 3)
|
|
||||||
set(CMAKE244_OR_BETTER TRUE)
|
|
||||||
set(CMAKE242_OR_BETTER TRUE)
|
|
||||||
else(PATCH_VERSION GREATER 3)
|
|
||||||
set(CMAKE244_OR_BETTER FALSE)
|
|
||||||
# ALSO detect if we are using CMake 2.4.2 or better, the APPEND sub-command of list() is nonexistent in earlier versions
|
|
||||||
if(PATCH_VERSION GREATER 1)
|
|
||||||
set(CMAKE242_OR_BETTER TRUE)
|
|
||||||
else(PATCH_VERSION GREATER 1)
|
|
||||||
set(CMAKE242_OR_BETTER FALSE)
|
|
||||||
endif(PATCH_VERSION GREATER 1)
|
|
||||||
endif(PATCH_VERSION GREATER 3)
|
|
||||||
endif(PATCH_VERSION GREATER 7)
|
|
||||||
endif(MINOR_VERSION GREATER 5)
|
|
||||||
|
|
||||||
# Override the module include path to include our directory, for our Anope.cmake, as well as we are using our own version of the NSIS template
|
|
||||||
set(CMAKE_MODULE_PATH ${Anope_SOURCE_DIR}/cmake)
|
|
||||||
|
|
||||||
include(Anope)
|
|
||||||
|
|
||||||
# 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)
|
|
||||||
|
|
||||||
# Start with empty defaults for library and include directories, to be used by GNU compilers only
|
|
||||||
set(DEFAULT_LIBRARY_DIRS)
|
|
||||||
set(DEFAULT_INCLUDE_DIRS)
|
|
||||||
|
|
||||||
# Check that we aren't running on an ancient broken GCC
|
|
||||||
if(CMAKE_COMPILER_IS_GNUCXX)
|
|
||||||
execute_process(COMMAND ${CMAKE_CXX_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_FULL_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
||||||
string(REGEX REPLACE "^(\\d+\\.\\d+)" "\\1" GCC_VERSION ${GCC_FULL_VERSION})
|
|
||||||
if(GCC_VERSION LESS 4.2)
|
|
||||||
message(FATAL_ERROR "Your compiler is too old to build Anope. Upgrade to GCC 4.2 or newer!")
|
|
||||||
endif(GCC_VERSION LESS 4.2)
|
|
||||||
endif(CMAKE_COMPILER_IS_GNUCXX)
|
|
||||||
|
|
||||||
# If we are using a GNU compiler (have to use CXX because it seems to fail on C), we will be able to determine it's default paths for libraries and includes
|
|
||||||
if(CMAKE_COMPILER_IS_GNUCXX OR "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang$")
|
|
||||||
# First look for the compiler's default library directories
|
|
||||||
execute_process(COMMAND ${CMAKE_C_COMPILER} -print-search-dirs OUTPUT_VARIABLE LINES OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
||||||
# Find only the part after "libraries: "
|
|
||||||
string(REGEX REPLACE ".*\nlibraries: (.*)$" "\\1" LINE "${LINES}")
|
|
||||||
# Replace the colons in the list with semicolons (only when not on MinGW, which uses semicolons already), and if on MinGW, just copy the line
|
|
||||||
if(NOT MINGW)
|
|
||||||
string(REGEX REPLACE ":" ";" LIBRARIES ${LINE})
|
|
||||||
else(NOT MINGW)
|
|
||||||
set(LIBRARIES "${LINE}")
|
|
||||||
endif(NOT MINGW)
|
|
||||||
# Iterate through the libraries
|
|
||||||
foreach(LIBRARY ${LIBRARIES})
|
|
||||||
# Check if the first character is an equal sign, and skip that library directory as it is (I believe) the primary default and shows up later in the list anyways
|
|
||||||
string(SUBSTRING ${LIBRARY} 0 1 FIRST_CHAR)
|
|
||||||
if(NOT FIRST_CHAR STREQUAL "=")
|
|
||||||
# If the directory had no = in front of it, make sure it's absolute and add it to the list of default library directories
|
|
||||||
get_filename_component(LIBRARY ${LIBRARY} ABSOLUTE)
|
|
||||||
append_to_list(DEFAULT_LIBRARY_DIRS ${LIBRARY})
|
|
||||||
endif(NOT FIRST_CHAR STREQUAL "=")
|
|
||||||
endforeach(LIBRARY)
|
|
||||||
# Remove duplicate entries from the list
|
|
||||||
if(DEFAULT_LIBRARY_DIRS)
|
|
||||||
remove_list_duplicates(DEFAULT_LIBRARY_DIRS)
|
|
||||||
endif(DEFAULT_LIBRARY_DIRS)
|
|
||||||
# Create a temporary file to test for the default include directories
|
|
||||||
FILE(WRITE empty.cpp "")
|
|
||||||
# Next, we look for the compiler's default include directories
|
|
||||||
# Run the command to find the default include directories
|
|
||||||
execute_process(COMMAND ${CMAKE_C_COMPILER} -v -x c++ -E ${CMAKE_CURRENT_SOURCE_DIR}/empty.cpp ERROR_VARIABLE LINES OUTPUT_QUIET ERROR_STRIP_TRAILING_WHITESPACE)
|
|
||||||
# Remove the empty file, it is no longer needed
|
|
||||||
FILE(REMOVE empty.cpp)
|
|
||||||
# Convert the new lines to semicolons
|
|
||||||
string(REGEX REPLACE "\n" ";" LINES ${LINES})
|
|
||||||
# Temporary variable saying if we are in the search list or not
|
|
||||||
set(IN_SEARCH_LIST FALSE)
|
|
||||||
# Iterate through the lines
|
|
||||||
foreach(LINE ${LINES})
|
|
||||||
# If the line has the following on it, the next lines will contain directory names
|
|
||||||
if(LINE STREQUAL "#include <...> search starts here:")
|
|
||||||
set(IN_SEARCH TRUE)
|
|
||||||
else(LINE STREQUAL "#include <...> search starts here:")
|
|
||||||
# If the line has the following on it, we hit the end of the list
|
|
||||||
if(LINE STREQUAL "End of search list.")
|
|
||||||
set(IN_SEARCH FALSE)
|
|
||||||
else(LINE STREQUAL "End of search list.")
|
|
||||||
# If we are within the block between the above two lines...
|
|
||||||
if(IN_SEARCH)
|
|
||||||
# Get everything but the first character of the line
|
|
||||||
string(LENGTH ${LINE} LINE_LENGTH)
|
|
||||||
math(EXPR LINE_LENGTH "${LINE_LENGTH} - 1")
|
|
||||||
string(SUBSTRING ${LINE} 1 ${LINE_LENGTH} INCLUDE)
|
|
||||||
# For systems like Mac OS X, look for include paths that say " (framework directory)" at the end of them and strip that off
|
|
||||||
string(REGEX REPLACE " \\(framework directory\\)$" "" INCLUDE ${INCLUDE})
|
|
||||||
# Convert the path to an absolute one, just in case it wasn't
|
|
||||||
get_filename_component(INCLUDE ${INCLUDE} ABSOLUTE)
|
|
||||||
# Add that directory to the list of default include directories
|
|
||||||
append_to_list(DEFAULT_INCLUDE_DIRS ${INCLUDE})
|
|
||||||
endif(IN_SEARCH)
|
|
||||||
endif(LINE STREQUAL "End of search list.")
|
|
||||||
endif(LINE STREQUAL "#include <...> search starts here:")
|
|
||||||
endforeach(LINE)
|
|
||||||
# Remove duplicate entries from the list
|
|
||||||
if(DEFAULT_INCLUDE_DIRS)
|
|
||||||
remove_list_duplicates(DEFAULT_INCLUDE_DIRS)
|
|
||||||
endif(DEFAULT_INCLUDE_DIRS)
|
|
||||||
endif(CMAKE_COMPILER_IS_GNUCXX OR "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang$")
|
|
||||||
|
|
||||||
# If we are using Visual Studio, locate the path of the Windows Server 2008 SDK or Windows Server 2003 Platform SDK, depending on which is installed
|
|
||||||
if(MSVC)
|
|
||||||
# If the path comes up as "/registry" from any of these, the path wasn't found, otherwise, we'll set WSDK_PATH to the corresponding path
|
|
||||||
# Look for the 2008 SDK under HKLM first
|
|
||||||
get_filename_component(WSDK2008_PATH "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows;CurrentInstallFolder]" ABSOLUTE CACHE)
|
|
||||||
if(WSDK2008_PATH STREQUAL "/registry")
|
|
||||||
# If not found, look for the 2003 SDK under HKLM
|
|
||||||
get_filename_component(WSDK2003_PATH "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\MicrosoftSDK\\InstalledSDKs\\D2FF9F89-8AA2-4373-8A31-C838BF4DBBE1;Install Dir]" ABSOLUTE CACHE)
|
|
||||||
if(WSDK2003_PATH STREQUAL "/registry")
|
|
||||||
# If not found, look for the 2008 SDK under HKCU
|
|
||||||
get_filename_component(WSDK2008_PATH "[HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows;CurrentInstallFolder]" ABSOLUTE CACHE)
|
|
||||||
if(WSDK2008_PATH STREQUAL "/registry")
|
|
||||||
# If not found, look for the 2003 SDK under HKCU
|
|
||||||
get_filename_component(WSDK2003_PATH "[HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\MicrosoftSDK\\InstalledSDKs\\D2FF9F89-8AA2-4373-8A31-C838BF4DBBE1;Install Dir]" ABSOLUTE CACHE)
|
|
||||||
if(WSDK2003_PATH STREQUAL "/registry")
|
|
||||||
# The SDK was never found, set the path to nothing
|
|
||||||
set(WSDK_PATH "")
|
|
||||||
else(WSDK2003_PATH STREQUAL "/registry")
|
|
||||||
set(WSDK_PATH "${WSDK2003_PATH}")
|
|
||||||
endif(WSDK2003_PATH STREQUAL "/registry")
|
|
||||||
else(WSDK2008_PATH STREQUAL "/registry")
|
|
||||||
set(WSDK_PATH "${WSDK2008_PATH}")
|
|
||||||
endif(WSDK2008_PATH STREQUAL "/registry")
|
|
||||||
else(WSDK2003_PATH STREQUAL "/registry")
|
|
||||||
set(WSDK_PATH "${WSDK2003_PATH}")
|
|
||||||
endif(WSDK2003_PATH STREQUAL "/registry")
|
|
||||||
else(WSDK2008_PATH STREQUAL "/registry")
|
|
||||||
set(WSDK_PATH "${WSDK2008_PATH}")
|
|
||||||
endif(WSDK2008_PATH STREQUAL "/registry")
|
|
||||||
endif(MSVC)
|
|
||||||
|
|
||||||
# If the user specifies -DCMAKE_BUILD_TYPE on the command line, take their definition
|
|
||||||
# and dump it in the cache along with proper documentation, otherwise set CMAKE_BUILD_TYPE
|
|
||||||
# to Debug
|
|
||||||
# Only do this if not using Visual Studio
|
|
||||||
if(NOT MSVC)
|
|
||||||
if(CMAKE_BUILD_TYPE)
|
|
||||||
set(CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE} CACHE STRING "Choose the type of build, options are: None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel.")
|
|
||||||
else(CMAKE_BUILD_TYPE)
|
|
||||||
set(CMAKE_BUILD_TYPE DEBUG CACHE STRING "Choose the type of build, options are: None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel.")
|
|
||||||
endif(CMAKE_BUILD_TYPE)
|
|
||||||
endif(NOT MSVC)
|
|
||||||
|
|
||||||
# If running under MinGW, we have to force the resource compiler settings (hopefully this will be fixed in a later version of CMake)
|
|
||||||
if(MINGW)
|
|
||||||
set(CMAKE_RC_COMPILER_INIT windres)
|
|
||||||
enable_language(RC)
|
|
||||||
set(CMAKE_RC_COMPILE_OBJECT "<CMAKE_RC_COMPILER> <FLAGS> <DEFINES> -o <OBJECT> <SOURCE>")
|
|
||||||
endif(MINGW)
|
|
||||||
|
|
||||||
# Include the checking functions used later in this CMakeLists.txt
|
|
||||||
include(CheckFunctionExists)
|
|
||||||
include(CheckIncludeFile)
|
|
||||||
include(CheckTypeSize)
|
|
||||||
include(CheckLibraryExists)
|
|
||||||
if(CMAKE244_OR_BETTER)
|
|
||||||
include(CheckCXXCompilerFlag)
|
|
||||||
else(CMAKE244_OR_BETTER)
|
|
||||||
include(TestCXXAcceptsFlag)
|
|
||||||
endif(CMAKE244_OR_BETTER)
|
|
||||||
|
|
||||||
# If extra include directories were specified, tell cmake about them.
|
|
||||||
if(EXTRA_INCLUDE)
|
|
||||||
include_directories(${EXTRA_INCLUDE})
|
|
||||||
endif(EXTRA_INCLUDE)
|
|
||||||
|
|
||||||
# If extra library directories were specified, tell cmake about them.
|
|
||||||
if(EXTRA_LIBS)
|
|
||||||
link_directories(${EXTRA_LIBS})
|
|
||||||
endif(EXTRA_LIBS)
|
|
||||||
|
|
||||||
# setup conan
|
|
||||||
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/conanbuildinfo.cmake")
|
|
||||||
include("${CMAKE_CURRENT_SOURCE_DIR}/conanbuildinfo.cmake")
|
|
||||||
conan_basic_setup()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Find gettext
|
|
||||||
find_package(Gettext)
|
|
||||||
|
|
||||||
option(USE_PCH "Use precompiled headers" OFF)
|
|
||||||
|
|
||||||
# Use the following directories as includes
|
|
||||||
# Note that it is important the binary include directory comes before the
|
|
||||||
# source include directory so the precompiled headers work correctly.
|
|
||||||
include_directories(${Anope_BINARY_DIR}/include ${Anope_SOURCE_DIR}/include ${Anope_BINARY_DIR}/language ${Anope_SOURCE_DIR}/modules/pseudoclients)
|
|
||||||
|
|
||||||
# Pass on REPRODUCIBLE_BUILD
|
|
||||||
if(REPRODUCIBLE_BUILD)
|
|
||||||
add_definitions(-DREPRODUCIBLE_BUILD)
|
|
||||||
endif(REPRODUCIBLE_BUILD)
|
|
||||||
|
|
||||||
# If using Windows, always add the _WIN32 define
|
|
||||||
if(WIN32)
|
|
||||||
add_definitions(-D_WIN32)
|
|
||||||
# And include the windows specific folder for our anope_windows.h
|
|
||||||
include_directories(${Anope_SOURCE_DIR}/src/win32)
|
|
||||||
endif(WIN32)
|
|
||||||
|
|
||||||
# If using Visual Studio, set the C++ flags accordingly
|
|
||||||
if(MSVC)
|
|
||||||
# Remove the default exception handling flags, also remove default warning level flag
|
|
||||||
string(REPLACE "/EHsc " "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
|
|
||||||
string(REPLACE "/GX " "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
|
|
||||||
string(REPLACE "/W3 " "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
|
|
||||||
# Set the compile flags to have warnings on the max setting (but disable a few annoying ones), exception handling turned on, the proper defines
|
|
||||||
set(CXXFLAGS "${CXXFLAGS} /W4 /wd4100 /wd4127 /wd4250 /wd4251 /wd4355 /wd4706 /wd4800 /wd4996 /EHs")
|
|
||||||
add_definitions(-DMSVCPP -D_CRT_SECURE_NO_WARNINGS)
|
|
||||||
# Otherwise, we're not using Visual Studio
|
|
||||||
else(MSVC)
|
|
||||||
# Set the compile flags to have all warnings on (including shadowed variables)
|
|
||||||
set(CXXFLAGS "${CXXFLAGS} -Wall -Wshadow")
|
|
||||||
# If on a *nix system, also set the compile flags to remove GNU extensions (favor ISO C++) as well as reject non-ISO C++ code, also remove all leading underscores in exported symbols (only on GNU compiler)
|
|
||||||
if(UNIX)
|
|
||||||
set(CXXFLAGS "${CXXFLAGS} -ansi -pedantic ${CMAKE_CXX_FLAGS}")
|
|
||||||
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
|
||||||
set(CXXFLAGS "${CXXFLAGS} -Wno-long-long -fno-leading-underscore")
|
|
||||||
endif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
|
||||||
# If we aren't on a *nix system, we are using MinGW
|
|
||||||
else(UNIX)
|
|
||||||
# Also, if we are building under MinGW, add another define for MinGW
|
|
||||||
if(MINGW)
|
|
||||||
add_definitions(-DMINGW)
|
|
||||||
endif(MINGW)
|
|
||||||
endif(UNIX)
|
|
||||||
endif(MSVC)
|
|
||||||
|
|
||||||
# If CMake has found that the given system requires a special library for dl* calls, include it with the linker flags
|
|
||||||
if(CMAKE_DL_LIBS)
|
|
||||||
append_to_list(LINK_LIBS ${CMAKE_DL_LIBS})
|
|
||||||
endif(CMAKE_DL_LIBS)
|
|
||||||
|
|
||||||
# Under MinGW, the -shared flag isn't properly set in the module-specific linker flags, add it from the C flags for shared libraries
|
|
||||||
if(MINGW)
|
|
||||||
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS}")
|
|
||||||
endif(MINGW)
|
|
||||||
|
|
||||||
if(NOT PROGRAM_NAME)
|
|
||||||
# Under Windows, we set the executable name for Anope to be anope
|
|
||||||
if(WIN32)
|
|
||||||
set(PROGRAM_NAME anope)
|
|
||||||
# Under *nix, we set the executable name for Anope to be services
|
|
||||||
else(WIN32)
|
|
||||||
set(PROGRAM_NAME services)
|
|
||||||
endif(WIN32)
|
|
||||||
endif(NOT PROGRAM_NAME)
|
|
||||||
|
|
||||||
# If we are not using Visual Studio, we'll run the following checks
|
|
||||||
if(NOT MSVC)
|
|
||||||
# Check if the C++ compiler can accept the -pipe flag, and add it to the compile flags if it works
|
|
||||||
if(CMAKE244_OR_BETTER)
|
|
||||||
# If using CMake 2.4.4 or better, we can use check_cxx_compiler_flag
|
|
||||||
check_cxx_compiler_flag(-pipe HAVE_PIPE_FLAG)
|
|
||||||
else(CMAKE244_OR_BETTER)
|
|
||||||
# If using CMake 2.4.3 or older, we will use check_cxx_accepts_flags instead
|
|
||||||
check_cxx_accepts_flag(-pipe HAVE_PIPE_FLAG)
|
|
||||||
endif(CMAKE244_OR_BETTER)
|
|
||||||
# If the flag was accepted, add it to the list of flags
|
|
||||||
if(HAVE_PIPE_FLAG)
|
|
||||||
set(CXXFLAGS "${CXXFLAGS} -pipe")
|
|
||||||
endif(HAVE_PIPE_FLAG)
|
|
||||||
|
|
||||||
# The following are additional library checks, they are not required for Windows
|
|
||||||
if(NOT WIN32)
|
|
||||||
# Check if socket is within the socket library (if the library exists), and add it to the linker flags if needed
|
|
||||||
check_library_exists(socket socket "" HAVE_SOCKET_LIB)
|
|
||||||
if(HAVE_SOCKET_LIB)
|
|
||||||
append_to_list(LINK_LIBS socket)
|
|
||||||
endif(HAVE_SOCKET_LIB)
|
|
||||||
# Check if inet_addr is within the nsl library (if the library exists), and add it to the linker flags if needed
|
|
||||||
check_library_exists(nsl inet_addr "" HAVE_NSL_LIB)
|
|
||||||
if(HAVE_NSL_LIB)
|
|
||||||
append_to_list(LINK_LIBS nsl)
|
|
||||||
endif(HAVE_NSL_LIB)
|
|
||||||
# Check if pthread_create is within the pthread library (if the library exists), and add it to the linker flags if needed
|
|
||||||
check_library_exists(pthread pthread_create "" HAVE_PTHREAD)
|
|
||||||
if(HAVE_PTHREAD)
|
|
||||||
if(NOT APPLE)
|
|
||||||
set(LDFLAGS "${LDFLAGS} -pthread")
|
|
||||||
endif(NOT APPLE)
|
|
||||||
else(HAVE_PTHREAD)
|
|
||||||
message(FATAL_ERROR "The pthread library is required to build Anope")
|
|
||||||
endif(HAVE_PTHREAD)
|
|
||||||
endif(NOT WIN32)
|
|
||||||
endif(NOT MSVC)
|
|
||||||
|
|
||||||
# If DEFUMASK wasn't passed to CMake, set a default depending on if RUNGROUP was passed in or not
|
|
||||||
if(NOT DEFUMASK)
|
|
||||||
if(RUNGROUP)
|
|
||||||
set(DEFUMASK "007")
|
|
||||||
else(RUNGROUP)
|
|
||||||
set(DEFUMASK "077")
|
|
||||||
endif(RUNGROUP)
|
|
||||||
endif(NOT DEFUMASK)
|
|
||||||
|
|
||||||
# Set the DEBUG_BUILD for sysconf.h
|
|
||||||
if(CMAKE_BUILD_TYPE STREQUAL "DEBUG" OR CMAKE_BUILD_TYPE STREQUAL "RELWITHDEBINFO")
|
|
||||||
set(DEBUG_BUILD TRUE)
|
|
||||||
endif(CMAKE_BUILD_TYPE STREQUAL "DEBUG" OR CMAKE_BUILD_TYPE STREQUAL "RELWITHDEBINFO")
|
|
||||||
|
|
||||||
# Check for the existence of the following include files
|
|
||||||
check_include_file(cstdint HAVE_CSTDINT)
|
|
||||||
check_include_file(stdint.h HAVE_STDINT_H)
|
|
||||||
check_include_file(strings.h HAVE_STRINGS_H)
|
|
||||||
|
|
||||||
# Check for the existence of the following functions
|
|
||||||
check_function_exists(strcasecmp HAVE_STRCASECMP)
|
|
||||||
check_function_exists(stricmp HAVE_STRICMP)
|
|
||||||
check_function_exists(umask HAVE_UMASK)
|
|
||||||
check_function_exists(epoll_wait HAVE_EPOLL)
|
|
||||||
check_function_exists(poll HAVE_POLL)
|
|
||||||
check_function_exists(kqueue HAVE_KQUEUE)
|
|
||||||
|
|
||||||
# Strip the leading and trailing spaces from the compile flags
|
|
||||||
if(CXXFLAGS)
|
|
||||||
strip_string(${CXXFLAGS} CXXFLAGS)
|
|
||||||
endif(CXXFLAGS)
|
|
||||||
# Strip the leading and trailing spaces from the linker flags
|
|
||||||
if(LDFLAGS)
|
|
||||||
strip_string(${LDFLAGS} LDFLAGS)
|
|
||||||
endif(LDFLAGS)
|
|
||||||
|
|
||||||
# Search for the following programs
|
|
||||||
find_program(GREP grep)
|
|
||||||
find_program(SH sh)
|
|
||||||
find_program(CHGRP chgrp)
|
|
||||||
find_program(CHMOD chmod)
|
|
||||||
|
|
||||||
# If a INSTDIR was passed in to CMake, use it as the install prefix, otherwise set the default install prefix to the services directory under the user's home directory
|
|
||||||
if(INSTDIR)
|
|
||||||
set(CMAKE_INSTALL_PREFIX "${INSTDIR}")
|
|
||||||
elseif(NOT CMAKE_INSTALL_PREFIX)
|
|
||||||
set(CMAKE_INSTALL_PREFIX "$ENV{HOME}/services")
|
|
||||||
endif(INSTDIR)
|
|
||||||
|
|
||||||
# Set default paths for various directories if not already defined
|
|
||||||
if(NOT BIN_DIR)
|
|
||||||
set(BIN_DIR "bin")
|
|
||||||
endif(NOT BIN_DIR)
|
|
||||||
if(NOT DB_DIR)
|
|
||||||
set(DB_DIR "data")
|
|
||||||
endif(NOT DB_DIR)
|
|
||||||
if(NOT DOC_DIR)
|
|
||||||
set(DOC_DIR "doc")
|
|
||||||
endif(NOT DOC_DIR)
|
|
||||||
if(NOT CONF_DIR)
|
|
||||||
set(CONF_DIR "conf")
|
|
||||||
endif(NOT CONF_DIR)
|
|
||||||
if(NOT LIB_DIR)
|
|
||||||
set(LIB_DIR "lib")
|
|
||||||
endif(NOT LIB_DIR)
|
|
||||||
if(NOT LOCALE_DIR)
|
|
||||||
set(LOCALE_DIR "locale")
|
|
||||||
endif(NOT LOCALE_DIR)
|
|
||||||
if(NOT LOGS_DIR)
|
|
||||||
set(LOGS_DIR "logs")
|
|
||||||
endif(NOT LOGS_DIR)
|
|
||||||
|
|
||||||
# Version number processing
|
|
||||||
# Find all lines in src/version.sh that start with VERSION_
|
|
||||||
read_from_file(${Anope_SOURCE_DIR}/src/version.sh "^VERSION_" VERSIONS)
|
|
||||||
# Iterate through the strings found
|
|
||||||
foreach(VERSION_STR ${VERSIONS})
|
|
||||||
string(REGEX REPLACE "^VERSION_([A-Z]+)=\"?([^\"]*)\"?$" "\\1;\\2" VERSION_OUT ${VERSION_STR})
|
|
||||||
list(LENGTH VERSION_OUT VERSION_LEN)
|
|
||||||
list(GET VERSION_OUT 0 VERSION_TYPE)
|
|
||||||
if(${VERSION_LEN} GREATER 1)
|
|
||||||
list(GET VERSION_OUT 1 VERSION_DATA)
|
|
||||||
set(VERSION_${VERSION_TYPE} ${VERSION_DATA})
|
|
||||||
endif(${VERSION_LEN} GREATER 1)
|
|
||||||
endforeach(VERSION_STR ${VERSIONS})
|
|
||||||
|
|
||||||
# Default build version to 0
|
|
||||||
set(VERSION_BUILD 0)
|
|
||||||
|
|
||||||
# Only change the build number if version.h exists
|
|
||||||
if(EXISTS "${Anope_SOURCE_DIR}/include/version.h")
|
|
||||||
# Attempt to read the build number from include/version.h
|
|
||||||
read_from_file(${Anope_SOURCE_DIR}/include/version.h "^#define VERSION_BUILD" VERSIONS)
|
|
||||||
foreach(VERSION_STR ${VERSIONS})
|
|
||||||
# Get the length of the string
|
|
||||||
string(LENGTH ${VERSION_STR} VERSION_LEN)
|
|
||||||
# Subtract 22 from the string's length
|
|
||||||
math(EXPR VERSION_NUM_LEN "${VERSION_LEN} - 22")
|
|
||||||
# Extract the value from the string
|
|
||||||
string(SUBSTRING ${VERSION_STR} 22 ${VERSION_NUM_LEN} VERSION)
|
|
||||||
# Set VERSION_BUILD correctly
|
|
||||||
set(VERSION_BUILD ${VERSION})
|
|
||||||
endforeach(VERSION_STR ${VERSIONS})
|
|
||||||
endif(EXISTS "${Anope_SOURCE_DIR}/include/version.h")
|
|
||||||
|
|
||||||
# Set the version variables based on what was found above
|
|
||||||
set(VERSION_COMMA "${VERSION_MAJOR},${VERSION_MINOR},${VERSION_PATCH},${VERSION_BUILD}")
|
|
||||||
set(VERSION_DOTTED_NOBUILD "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}")
|
|
||||||
set(VERSION_DOTTED "${VERSION_DOTTED_NOBUILD}.${VERSION_BUILD}")
|
|
||||||
set(VERSION_FULL "${VERSION_DOTTED}${VERSION_EXTRA}")
|
|
||||||
set(VERSION_FULL_NOBUILD "${VERSION_DOTTED_NOBUILD}${VERSION_EXTRA}")
|
|
||||||
|
|
||||||
# Only do the following for Windows
|
|
||||||
if(WIN32)
|
|
||||||
# Generate the win32.rc file using the above variables
|
|
||||||
configure_file(${Anope_SOURCE_DIR}/src/win32/win32.rc.cmake ${Anope_BINARY_DIR}/src/win32/win32.rc)
|
|
||||||
endif(WIN32)
|
|
||||||
|
|
||||||
# Add the initial files to ignore which will be ignored regardless of if you are building in-source or out-of-source
|
|
||||||
add_to_cpack_ignored_files(".git\;config.cache\;CMakeFiles\;sysconf.h$\;build" TRUE)
|
|
||||||
# Add the files we don't want the periods converted for
|
|
||||||
add_to_cpack_ignored_files(".\\\\\\\\.so$;.\\\\\\\\.o$;.\\\\\\\\.s$;${Anope_SOURCE_DIR}/Makefile$")
|
|
||||||
# If the two directories are the same, we are building in-source, thus we need to ignore more files from the build
|
|
||||||
if(${Anope_SOURCE_DIR} STREQUAL ${Anope_BINARY_DIR})
|
|
||||||
# Add the files that need their periods converted
|
|
||||||
add_to_cpack_ignored_files("Makefile\;cmake_install.cmake\;sysconf.h$\;CMakeCache.txt\;install_manifest.txt" TRUE)
|
|
||||||
# Add the files we don't want the periods converted for
|
|
||||||
add_to_cpack_ignored_files(".\\\\\\\\.so$;CPack.;anope-${VERSION_FULL_NOBUILD}-source\\\\\\\\..")
|
|
||||||
# If using Visual Studio, add these files as well
|
|
||||||
if(MSVC)
|
|
||||||
add_to_cpack_ignored_files(".vcproj$\;.sln$\;.ncb$\;.suo$\;.dir$\;.ilk$\;.exp$\;.pdb$\;.lib$\;/debug$;/release$;/relwithdebinfo$;/minsizerel$" TRUE)
|
|
||||||
endif(MSVC)
|
|
||||||
endif(${Anope_SOURCE_DIR} STREQUAL ${Anope_BINARY_DIR})
|
|
||||||
|
|
||||||
# Get the filename of the Anope binary, to use later
|
|
||||||
set(SERVICES_BINARY "$<TARGET_FILE:${PROGRAM_NAME}>")
|
|
||||||
get_filename_component(SERVICES_BINARY ${SERVICES_BINARY} NAME)
|
|
||||||
|
|
||||||
# At install time, create the following additional directories
|
|
||||||
install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${DB_DIR}/backups\")")
|
|
||||||
install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${LOGS_DIR}\")")
|
|
||||||
if(WIN32)
|
|
||||||
install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${DB_DIR}/runtime\")")
|
|
||||||
endif(WIN32)
|
|
||||||
# On non-Windows platforms, if RUNGROUP is set, change the permissions of the below directories, as well as the group of the data directory
|
|
||||||
if(NOT WIN32 AND RUNGROUP)
|
|
||||||
install(CODE "execute_process(COMMAND ${CHMOD} 2775 \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/\${DB_DIR}/backups\")")
|
|
||||||
install(CODE "execute_process(COMMAND ${CHMOD} 2775 \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/\${LOGS_DIR}\")")
|
|
||||||
install(CODE "execute_process(COMMAND ${CHGRP} -R ${RUNGROUP} \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}\")")
|
|
||||||
endif(NOT WIN32 AND RUNGROUP)
|
|
||||||
# On Windows platforms, install extra files
|
|
||||||
if(WIN32)
|
|
||||||
install(FILES ${Anope_SOURCE_DIR}/src/win32/anope.bat
|
|
||||||
DESTINATION ${BIN_DIR}
|
|
||||||
)
|
|
||||||
endif(WIN32)
|
|
||||||
|
|
||||||
install(CODE "file(REMOVE_RECURSE \"$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/${LIB_DIR}/modules\")")
|
|
||||||
|
|
||||||
# Only process the CPack section if we have CPack
|
|
||||||
if(EXISTS "${CMAKE_ROOT}/Modules/CPack.cmake")
|
|
||||||
# Various options for CPack
|
|
||||||
set(CPACK_PACKAGE_NAME "Anope IRC Services")
|
|
||||||
set(CPACK_PACKAGE_VENDOR "Anope Team")
|
|
||||||
set(CPACK_PACKAGE_VERSION_MAJOR ${VERSION_MAJOR})
|
|
||||||
set(CPACK_PACKAGE_VERSION_MINOR ${VERSION_MINOR})
|
|
||||||
set(CPACK_PACKAGE_VERSION_PATCH "${VERSION_PATCH}${VERSION_EXTRA}")
|
|
||||||
set(CPACK_PACKAGE_FILE_NAME "anope-${VERSION_FULL_NOBUILD}")
|
|
||||||
set(CPACK_RESOURCE_FILE_LICENSE "${Anope_SOURCE_DIR}/docs/COPYING")
|
|
||||||
# The following doesn't actually do anything. :(
|
|
||||||
#set(CPACK_RESOURCE_FILE_README "${Anope_SOURCE_DIR}/docs/README")
|
|
||||||
# The following is primarily for NSIS
|
|
||||||
if(WIN32)
|
|
||||||
# By default, do not warn when built on machines using only VS Express:
|
|
||||||
IF(NOT DEFINED CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_NO_WARNINGS)
|
|
||||||
SET(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_NO_WARNINGS ON)
|
|
||||||
ENDIF(NOT DEFINED CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_NO_WARNINGS)
|
|
||||||
# Also for Windows, include installing the MSVCRT library
|
|
||||||
include(InstallRequiredSystemLibraries)
|
|
||||||
set(CPACK_GENERATOR "NSIS")
|
|
||||||
set(CPACK_PACKAGE_INSTALL_DIRECTORY "Anope")
|
|
||||||
set(CPACK_PACKAGE_EXECUTABLES "")
|
|
||||||
set(CPACK_NSIS_MENU_LINKS
|
|
||||||
"bin\\\\${SERVICES_BINARY}" "Anope IRC Services"
|
|
||||||
"bin\\\\anope.bat\\\" \\\"-debug -nofork" "Anope IRC Services (Debug and Window Logging)"
|
|
||||||
"bin\\\\anope.bat\\\" \\\"-nofork" "Anope IRC Services (Window Logging)"
|
|
||||||
"bin\\\\anope.bat\\\" \\\"-nothird" "Anope IRC Services (No Third Party Modules)"
|
|
||||||
"https://www.anope.org/" "Anope Web Site"
|
|
||||||
)
|
|
||||||
# The following doesn't work, but a bug report has been filed about it
|
|
||||||
#set(CPACK_CREATE_DESKTOP_LINK_${SERVICES_BINARY} TRUE)
|
|
||||||
set(CPACK_NSIS_MUI_ICON "${Anope_SOURCE_DIR}/src\\\\win32\\\\anope-icon.ico")
|
|
||||||
set(CPACK_NSIS_MUI_UNIICON "${Anope_SOURCE_DIR}/src\\\\win32\\\\anope-icon.ico")
|
|
||||||
set(CPACK_NSIS_INSTALLED_ICON_NAME "${SERVICES_BINARY}")
|
|
||||||
set(CPACK_NSIS_URL_INFO_ABOUT "https://www.anope.org/")
|
|
||||||
set(CPACK_NSIS_COMPRESSOR "/SOLID lzma")
|
|
||||||
endif(WIN32)
|
|
||||||
set(CPACK_SOURCE_PACKAGE_FILE_NAME "anope-${VERSION_FULL_NOBUILD}-source")
|
|
||||||
set(CPACK_SOURCE_GENERATOR "TGZ")
|
|
||||||
set(CPACK_SOURCE_IGNORE_FILES "$ENV{CPACK_IGNORED_FILES}")
|
|
||||||
set(CPACK_MONOLITHIC_INSTALL TRUE)
|
|
||||||
include(CPack)
|
|
||||||
endif(EXISTS "${CMAKE_ROOT}/Modules/CPack.cmake")
|
|
||||||
|
|
||||||
# Go into the following directories and run their CMakeLists.txt as well
|
|
||||||
add_subdirectory(data)
|
|
||||||
add_subdirectory(docs)
|
|
||||||
add_subdirectory(language)
|
|
||||||
add_subdirectory(src)
|
|
||||||
add_subdirectory(modules)
|
|
||||||
add_subdirectory(include)
|
|
||||||
|
|
||||||
+917
@@ -0,0 +1,917 @@
|
|||||||
|
Anope Version 1.8.9
|
||||||
|
-------------------
|
||||||
|
** ADDED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
** MODIFIED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
** DELETED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
Anope Version 1.8.8
|
||||||
|
-------------------
|
||||||
|
** ADDED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
** MODIFIED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
** DELETED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
|
||||||
|
Anope Version 1.8.7
|
||||||
|
-------------------
|
||||||
|
** ADDED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
** MODIFIED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
** DELETED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
|
||||||
|
Anope Version 1.8.6
|
||||||
|
-------------------
|
||||||
|
** ADDED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
** MODIFIED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
** DELETED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
|
||||||
|
Anope Version 1.8.5
|
||||||
|
-------------------
|
||||||
|
** ADDED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
# ForkForMail [OPTIONAL]
|
||||||
|
#
|
||||||
|
# When enabled, services will fork when sending mail, which means there is no
|
||||||
|
# services lag from mail. This is only supported on operating systems that allow
|
||||||
|
# the use of forking (eg, not Windows).
|
||||||
|
#
|
||||||
|
|
||||||
|
#ForkForMail
|
||||||
|
|
||||||
|
inspircd20 - IRCDModule
|
||||||
|
|
||||||
|
** MODIFIED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
# DefSessionLimit <limit> [REQUIRED]
|
||||||
|
# Default session limit per host. Once a host reaches it's session limit,
|
||||||
|
# all clients attempting to connect from that host will be killed.
|
||||||
|
|
||||||
|
DefSessionLimit 3
|
||||||
|
|
||||||
|
** DELETED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
|
||||||
|
Anope Version 1.8.4
|
||||||
|
-------------------
|
||||||
|
** ADDED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
** MODIFIED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
** DELETED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
|
||||||
|
Anope Version 1.8.3
|
||||||
|
-------------------
|
||||||
|
** ADDED CONFIGURATION DIRECTIVES **
|
||||||
|
inspircd12 - IRCDModule
|
||||||
|
** MODIFIED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
** DELETED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
Anope Version 1.8.2
|
||||||
|
-------------------
|
||||||
|
** ADDED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
** MODIFIED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
** DELETED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
Anope Version 1.8.1
|
||||||
|
-------------------
|
||||||
|
** ADDED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
** MODIFIED CONFIGURATION DIRECTIVES **
|
||||||
|
# IRCDModule <module_name> [REQUIRED]
|
||||||
|
# The ircd protocol module should be used when connecting anope to your
|
||||||
|
# chosen IRCD. This should be one of the following options, or a file
|
||||||
|
# provided by your IRCD author.
|
||||||
|
#
|
||||||
|
# Bahamut 1.4.27 [or later] - "bahamut"
|
||||||
|
# Charybdis 1.0 [or later] - "charybdis"
|
||||||
|
# DreamForge 4.6.7 - "dreamforge"
|
||||||
|
# Hybrid IRCd 7.0 [experimental] - "hybrid"
|
||||||
|
# InspIRCd 1.1 [beta 8 or later] - "inspircd11"
|
||||||
|
# Plexus 3.0 [or later] - "plexus3"
|
||||||
|
# Plexus 2.0 [or later] - "plexus2"
|
||||||
|
# PTLink 6.15.0 [experimental] - "ptlink"
|
||||||
|
# RageIRCd 2.0.x - "rageircd"
|
||||||
|
# Ratbox 2.0.6 [or later] - "ratbox"
|
||||||
|
# ShadowIRCD 4.0x [beta 7 or later] - "shadowircd"
|
||||||
|
# Solid IRCD 3.4.x [3.4.6 or later] - "solidircd"
|
||||||
|
# UltimateIRCd 3.0.0 [or later] - "ultimate3"
|
||||||
|
# UltimateIRCd 2.8.2 [or later] - "ultimate2"
|
||||||
|
# Unreal 3.2 [beta-19 or later] - "unreal32"
|
||||||
|
# Unreal 3.1.1 [or later] - "unreal31"
|
||||||
|
# ViagraIRCd 1.3.x [or later] - "viagra"
|
||||||
|
#
|
||||||
|
|
||||||
|
#IRCDModule "unreal32"
|
||||||
|
|
||||||
|
|
||||||
|
# SuperAdmin [OPTIONAL]
|
||||||
|
# When enabled, Services Roots will be able to use SuperAdmin [ON|OFF]
|
||||||
|
# which will temporarily grant them extra privileges, such as being a
|
||||||
|
# founder of _all_ channels, ability to adjust another users modes etc..
|
||||||
|
|
||||||
|
#SuperAdmin
|
||||||
|
|
||||||
|
|
||||||
|
# UnRestrictSAdmin [OPTIONAL]
|
||||||
|
# On many ircd Anope removes the umode of +a from users whom are not
|
||||||
|
# Service Admin in Anope. This mode is NOT used by Anope for any form
|
||||||
|
# of access. Thus this option allows them to keep the mode without having
|
||||||
|
# to be a Service Admin in Anope
|
||||||
|
#UnRestrictSAdmin
|
||||||
|
|
||||||
|
** DELETED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
Anope Version 1.8.0
|
||||||
|
-------------------
|
||||||
|
** ADDED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
** MODIFIED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
** DELETED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
|
||||||
|
Anope Version 1.7.24
|
||||||
|
--------------------
|
||||||
|
** ADDED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
** MODIFIED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
** DELETED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
Anope Version 1.7.23b
|
||||||
|
--------------------
|
||||||
|
** ADDED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
** MODIFIED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
** DELETED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
Anope Version 1.7.23
|
||||||
|
--------------------
|
||||||
|
** ADDED CONFIGURATION DIRECTIVES **
|
||||||
|
# OSIgnoreDBName [OPTIONAL]
|
||||||
|
# Module: os_ignore_db
|
||||||
|
#
|
||||||
|
# Use the given filename as database for services ignores.
|
||||||
|
# If not given, the default of "os_ignore.db" will be used.
|
||||||
|
#
|
||||||
|
#OSIgnoreDBName "os_ignore.db"
|
||||||
|
|
||||||
|
** MODIFIED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
** DELETED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
Anope Version 1.7.22
|
||||||
|
--------------------
|
||||||
|
** ADDED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
** MODIFIED CONFIGURATION DIRECTIVES **
|
||||||
|
# BotCoreModules <list> [RECOMMENDED]
|
||||||
|
# These modules will be loaded as part of BotServ's core.
|
||||||
|
# It is not recommended you change these settings unless you are
|
||||||
|
# sure you understand exactly what it is you are doing.
|
||||||
|
BotCoreModules "bs_help bs_botlist bs_assign bs_set bs_kick bs_badwords bs_act bs_info bs_say bs_unassign bs_bot bs_fantasy bs_fantasy_kick bs_fantasy_kickban bs_fantasy_owner bs_fantasy_seen"
|
||||||
|
|
||||||
|
** DELETED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
Anope Version 1.7.21
|
||||||
|
--------------------
|
||||||
|
** ADDED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
** MODIFIED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
** DELETED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
Anope Version 1.7.20
|
||||||
|
--------------------
|
||||||
|
** ADDED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
** MODIFIED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
** DELETED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
Anope Version 1.7.19
|
||||||
|
--------------------
|
||||||
|
** ADDED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
** MODIFIED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
** DELETED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
Anope Version 1.7.18
|
||||||
|
--------------------
|
||||||
|
** ADDED CONFIGURATION DIRECTIVES **
|
||||||
|
###########################################################################
|
||||||
|
#
|
||||||
|
# Encryption settings
|
||||||
|
#
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
# EncModule <module_name> [REQUIRED]
|
||||||
|
# The encryption module to use when dealing with passwords.
|
||||||
|
# This determines how the passwords are stored in the databases,
|
||||||
|
# and does not add any security as far as transmitting passwords over
|
||||||
|
# the network goes.
|
||||||
|
# enc_none provides no password encryption, storing the password in
|
||||||
|
# plain text, this is the most versiatle as passwords can easily be
|
||||||
|
# recovered.
|
||||||
|
#
|
||||||
|
# NOTE: users of anope's previous (broken) md5 implementation should
|
||||||
|
# select the enc_old option, or things may break.
|
||||||
|
#
|
||||||
|
# NOTE2: Some of these encryption methods are one-way (md5, sha1, old)
|
||||||
|
# meaning that you can NOT retrive the passwords in plain text once
|
||||||
|
# encrypted.
|
||||||
|
#
|
||||||
|
# Plain Text - enc_none
|
||||||
|
# Previous (broken) MD5 - enc_old
|
||||||
|
# MD5 - enc_md5
|
||||||
|
# SHA1 - enc_sha1
|
||||||
|
#
|
||||||
|
|
||||||
|
EncModule "enc_none"
|
||||||
|
|
||||||
|
** MODIFIED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
** DELETED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
Anope Version 1.7.17
|
||||||
|
--------------------
|
||||||
|
** ADDED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
** MODIFIED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
** DELETED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
Anope Version 1.7.16
|
||||||
|
--------------------
|
||||||
|
** ADDED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
** MODIFIED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
** DELETED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
Anope Version 1.7.15
|
||||||
|
--------------------
|
||||||
|
** ADDED CONFIGURATION DIRECTIVES **
|
||||||
|
# UseStrictPrivMsg [OPTIONAL]
|
||||||
|
# Using this directive will force services to only respond to privmsgs
|
||||||
|
# addressed to Nick@ServerName - e.g. NickServ@localhost.net.
|
||||||
|
# This should be used on conjunction with ircd aliases.
|
||||||
|
#
|
||||||
|
|
||||||
|
#UseStrictPrivMsg
|
||||||
|
|
||||||
|
# NSResendDelay <time> [RECOMMENDED]
|
||||||
|
# Sets the minimum length of time between consecutive uses of the
|
||||||
|
# RESEND command. If not given, this restriction is disabled (note
|
||||||
|
# that this allows "resend flooding" or "mail bombing").
|
||||||
|
|
||||||
|
NSResendDelay 90s
|
||||||
|
|
||||||
|
NSDefAutoop
|
||||||
|
|
||||||
|
** MODIFIED CONFIGURATION DIRECTIVES **
|
||||||
|
ModuleDelayedAutoload "cs_appendtopic cs_enforce ns_maxemail os_info hs_request"
|
||||||
|
|
||||||
|
# LimitSessions [OPTIONAL]
|
||||||
|
# Enables session limiting. Session limiting prevents users from
|
||||||
|
# connecting more than a certain number of times from the same host at the
|
||||||
|
# same time - thus preventing most types of cloning. Once a host reaches
|
||||||
|
# it's session limit, all clients attempting to connect from that host
|
||||||
|
# will be killed. Exceptions to the default session limit, which are based
|
||||||
|
# on host names, can be defined via the exception list. It should be noted
|
||||||
|
# that session limiting, along with a large exception list, can degrade
|
||||||
|
# services' performance. See the source and comments in sessions.c and the
|
||||||
|
# online help for more information about session limiting.
|
||||||
|
#
|
||||||
|
# NOTE: This option is not available when STREAMLINED is defined in
|
||||||
|
# the Makefile.
|
||||||
|
|
||||||
|
LimitSessions
|
||||||
|
|
||||||
|
** DELETED CONFIGURATION DIRECTIVES **
|
||||||
|
# NSAutoOPDBName [OPTIONAL]
|
||||||
|
# Module: ns_noop
|
||||||
|
#
|
||||||
|
# Use the given filename as database for the autoop list. If not given,
|
||||||
|
# the default of "autoop.db" will be used.
|
||||||
|
#
|
||||||
|
#NSAutoOPDBName "autoop.db"
|
||||||
|
|
||||||
|
# KillClonesAkillExpire <time> [REQUIRED]
|
||||||
|
# Sets the expiry time for autokills added for hosts that have been
|
||||||
|
# killed using the KILLCLONES command.
|
||||||
|
|
||||||
|
KillClonesAkillExpire 30m
|
||||||
|
|
||||||
|
# CheckClones <minusers> <maxdelay> <warningdelay> [DEPRECATED]
|
||||||
|
# Causes Services to try and detect "clones" connecting to the network.
|
||||||
|
# A WALLOPS (or GOPER, if supported on the IRC server) will be sent if
|
||||||
|
# Services thinks it has found clones.
|
||||||
|
#
|
||||||
|
# This feature has been superseded by Session Limiting.
|
||||||
|
#
|
||||||
|
# <minusers> sets the minimum number of users which must successively
|
||||||
|
# connect to the network before Services will send a clone warning.
|
||||||
|
#
|
||||||
|
# <maxdelay> sets the maximum time that can elapse between successive
|
||||||
|
# users before Services decides they are not clones.
|
||||||
|
#
|
||||||
|
# <warningdelay> sets the minimum time between clone warnings for
|
||||||
|
# clones from the same host.
|
||||||
|
#
|
||||||
|
# NOTE: This option is not available when STREAMLINED is defined in
|
||||||
|
# the Makefile.
|
||||||
|
|
||||||
|
# CheckClones 5 10s 30s
|
||||||
|
|
||||||
|
# KillClones [DISCOURAGED] [DEPRECATED]
|
||||||
|
# Causes Services to kill users which trigger the clone warnings. (If
|
||||||
|
# CheckClones is disabled, this will have no effect.)
|
||||||
|
#
|
||||||
|
# This feature has been superceded by Session Limiting.
|
||||||
|
#
|
||||||
|
# BEWARE! The clone checking code is easily fooled; it can be
|
||||||
|
# triggered falsely under many conditions, for example:
|
||||||
|
#
|
||||||
|
# - Multiple users connecting from a shell machine.
|
||||||
|
#
|
||||||
|
# - A single user repeatedly connecting and disconnecting.
|
||||||
|
#
|
||||||
|
# Be very sure you know what you're doing before you even think about
|
||||||
|
# enabling this option, and remember that Services comes with no
|
||||||
|
# warranty.
|
||||||
|
#
|
||||||
|
# If that wasn't enough discouragement:
|
||||||
|
#
|
||||||
|
# ***** DO NOT ENABLE THIS OPTION! *****
|
||||||
|
#
|
||||||
|
# NOTE: This option is not available when STREAMLINED is defined in
|
||||||
|
# the Makefile.
|
||||||
|
|
||||||
|
#KillClones
|
||||||
|
|
||||||
|
Anope Version 1.7.13
|
||||||
|
--------------------
|
||||||
|
** ADDED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
** MODIFIED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
** DELETED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
Anope Version 1.7.12
|
||||||
|
--------------------
|
||||||
|
** ADDED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
# BSFantasyCharacter [REQUIRED]
|
||||||
|
# This option allows you to change the default prefix for fantasy
|
||||||
|
# commands in channels. This character will have to be prepended to all
|
||||||
|
# fantasy commands. If you choose "!" (the default), fantasy commands
|
||||||
|
# will, for example, be "!kick", "!op", etc.
|
||||||
|
|
||||||
|
BSFantasyCharacter "!"
|
||||||
|
|
||||||
|
** MODIFIED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
** DELETED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
Anope Version 1.7.11
|
||||||
|
--------------------
|
||||||
|
** ADDED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
# NickLen [REQUIRED]
|
||||||
|
# Set this to the maximum allowed nick length on your network. Anope does
|
||||||
|
# not support values larger than 31, so setting them makes no sense. Be
|
||||||
|
# sure to set this correctly, as setting this wrong can result in services
|
||||||
|
# being disconnected from the network.
|
||||||
|
|
||||||
|
NickLen 31
|
||||||
|
|
||||||
|
** MODIFIED CONFIGURATION DIRECTIVES **
|
||||||
|
# UserKey1|2|3 <value> [RECOMMENDED]
|
||||||
|
#
|
||||||
|
# These keys are required to initiate the random number generator. These
|
||||||
|
# numbers MUST be random as you want your passcodes to be random. Don't
|
||||||
|
# give these keys to anyone! Keep them private!
|
||||||
|
#
|
||||||
|
# *** NOTE ***
|
||||||
|
# If you don't enable these, or keep their default values, any talented
|
||||||
|
# programmer would be able to easily "guess" random strings used to mask
|
||||||
|
# information. Be safe, and come up with three different 7 digit numbers
|
||||||
|
|
||||||
|
#UserKey1 9866235
|
||||||
|
#UserKey2 8362013
|
||||||
|
#UserKey3 2362899
|
||||||
|
|
||||||
|
** DELETED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
Anope Version 1.7.10
|
||||||
|
--------------------
|
||||||
|
** ADDED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
** MODIFIED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
** DELETED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
Anope Version 1.7.9
|
||||||
|
-------------------
|
||||||
|
** ADDED CONFIGURATION DIRECTIVES **
|
||||||
|
# IRCDModule <module_name> [REQUIRED]
|
||||||
|
# The ircd protocol module should be used when connecting anope to your
|
||||||
|
# chosen IRCD. This should be one of the following options, or a file
|
||||||
|
# provided by your IRCD author.
|
||||||
|
#
|
||||||
|
# Bahamut 1.4.27 [or later] - "bahamut"
|
||||||
|
# DreamForge 4.6.7 - "dreamforge"
|
||||||
|
# Hybrid IRCd 7.0 [experimental] - "hybrid"
|
||||||
|
# InspIRCd 1.0 Beta 5 - "inspircd"
|
||||||
|
# InspIRCd module is provided by Brain <brain@inspircd.org>
|
||||||
|
# Plexus 2.0 [or later] - "plexus"
|
||||||
|
# PTLink 6.15.0 [experimental] - "ptlink"
|
||||||
|
# RageIRCd 2.0.0 [beta-6 of later] - "rageircd"
|
||||||
|
# Ratbox 2.0.6 [or later] - "ratbox"
|
||||||
|
# ShadowIRCD 4.0x [beta 7 or later] - "shadowircd"
|
||||||
|
# Solid IRCD 3.4.x [3.4.6 or later] - "solidircd"
|
||||||
|
# UltimateIRCd 3.0.0 [or later] - "ultimate3"
|
||||||
|
# UltimateIRCd 2.8.2 [or later] - "ultimate2"
|
||||||
|
# Unreal 3.2 [beta-19 or later] - "unreal32"
|
||||||
|
# Unreal 3.1.1 [or later] - "unreal31"
|
||||||
|
# ViagraIRCd 1.3.x [or later] - "viagra"
|
||||||
|
#
|
||||||
|
|
||||||
|
#IRCDModule "unreal32"
|
||||||
|
|
||||||
|
# HostCoreModules <list> [RECOMMENDED]
|
||||||
|
# These modules will be loaded as part of HostServ's core.
|
||||||
|
# It is not recommended you change these settings unless you are
|
||||||
|
# sure you understand exactly what it is you are doing.
|
||||||
|
HostCoreModules "hs_help hs_on hs_off hs_group hs_list hs_set hs_setall hs_del hs_delall"
|
||||||
|
|
||||||
|
# MemoCoreModules <list> [RECOMMENDED]
|
||||||
|
# These modules will be loaded as part of MemoServ's core.
|
||||||
|
# It is not recommended you change these settings unless you are
|
||||||
|
# sure you understand exactly what it is you are doing.
|
||||||
|
MemoCoreModules "ms_send ms_cancel ms_list ms_read ms_del ms_set ms_info ms_rsend ms_check ms_staff ms_sendall ms_help"
|
||||||
|
|
||||||
|
# HelpCoreModules <list> [RECOMMENDED]
|
||||||
|
# These modules will be loaded as part of HelpServ's core.
|
||||||
|
# It is not recommended you change these settings unless you are
|
||||||
|
# sure you understand exactly what it is you are doing.
|
||||||
|
HelpCoreModules "he_help"
|
||||||
|
|
||||||
|
# BotCoreModules <list> [RECOMMENDED]
|
||||||
|
# These modules will be loaded as part of BotServ's core.
|
||||||
|
# It is not recommended you change these settings unless you are
|
||||||
|
# sure you understand exactly what it is you are doing.
|
||||||
|
BotCoreModules "bs_help bs_botlist bs_assign bs_set bs_kick bs_badwords bs_act bs_info bs_say bs_unassign bs_bot bs_fantasy bs_fantasy_kick bs_fantasy_kickban bs_fantasy_owner bs_fantasy_seen bs_fantasy_unban"
|
||||||
|
|
||||||
|
# OperCoreModules <list> [RECOMMENDED]
|
||||||
|
# These modules will be loaded as part of OperServ's core.
|
||||||
|
# It is not recommended you change these settings unless you are
|
||||||
|
# sure you understand exactly what it is you are doing.
|
||||||
|
OperCoreModules "os_help os_global os_stats os_oper os_admin os_staff os_mode os_kick os_clearmodes os_killclones os_akill os_sgline os_sqline os_szline os_chanlist os_userlist os_logonnews os_randomnews os_opernews os_session os_noop os_jupe os_ignore os_set os_reload os_update os_restart os_quit os_shutdown os_defcon os_chankill os_svsnick os_oline os_umode os_modload os_modunload os_modlist os_modinfo"
|
||||||
|
|
||||||
|
# NickCoreModules <list> [RECOMMENDED]
|
||||||
|
# These modules will be loaded as part of NickServ's core.
|
||||||
|
# It is not recommended you change these settings unless you are
|
||||||
|
# sure you understand exactly what it is you are doing.
|
||||||
|
NickCoreModules "ns_help ns_register ns_group ns_identify ns_access ns_set ns_drop ns_recover ns_release ns_sendpass ns_ghost ns_alist ns_info ns_list ns_logout ns_status ns_update ns_getpass ns_getemail ns_forbid ns_suspend"
|
||||||
|
|
||||||
|
# ChanCoreModules <list> [RECOMMENDED]
|
||||||
|
# These modules will be loaded as part of ChanServ's core.
|
||||||
|
# It is not recommended you change these settings unless you are
|
||||||
|
# sure you understand exactly what it is you are doing.
|
||||||
|
ChanCoreModules "cs_help cs_register cs_identify cs_set cs_xop cs_access cs_akick cs_drop cs_sendpass cs_ban cs_clear cs_modes cs_getkey cs_invite cs_kick cs_list cs_logout cs_topic cs_info cs_getpass cs_forbid cs_suspend cs_status"
|
||||||
|
|
||||||
|
# OSOpersOnly [RECOMMENDED]
|
||||||
|
# If this is defined, only IRC Operators will be permitted to use
|
||||||
|
# OperServ, regardless of module based command access restrictions.
|
||||||
|
|
||||||
|
OSOpersOnly
|
||||||
|
|
||||||
|
# NSEmailMax [OPTIONAL]
|
||||||
|
# Module: ns_maxemail
|
||||||
|
#
|
||||||
|
# Limit the amount of registrations with the same email address to the
|
||||||
|
# amount given here. If set to 0 or left commented, there will be no limit
|
||||||
|
# enforced when registering new accounts or using /msg NickServ SET EMAIL.
|
||||||
|
#
|
||||||
|
#NSEmailMax 1
|
||||||
|
|
||||||
|
# NSAutoOPDBName [OPTIONAL]
|
||||||
|
# Module: ns_noop
|
||||||
|
#
|
||||||
|
# Use the given filename as database for the autoop list. If not given,
|
||||||
|
# the default of "autoop.db" will be used.
|
||||||
|
#
|
||||||
|
#NSAutoOPDBName "autoop.db"
|
||||||
|
|
||||||
|
# OSInfoDBName [OPTIONAL]
|
||||||
|
# Module: os_info
|
||||||
|
#
|
||||||
|
# Use the given filename as database for the oper information lines.
|
||||||
|
# If not given, the default of "os_info.db" will be used.
|
||||||
|
#
|
||||||
|
#OSInfoDBName "os_info.db"
|
||||||
|
|
||||||
|
** MODIFIED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
# UserKey1|2|3 <value> [REQUIRED]
|
||||||
|
#
|
||||||
|
# These keys are required to initiate the random number generator. These
|
||||||
|
# numbers MUST be random as you want your passcodes to be random. Don't
|
||||||
|
# give these keys to no anyone! Keep them private!
|
||||||
|
# For those pple who don't understand what to do here: Just pick three
|
||||||
|
# _different_ _random_ numbers with about 6 or 7 digits and put them here.
|
||||||
|
# If the keys don't work, they might be too long or you forgot to remove
|
||||||
|
# the # in front of them. Example:
|
||||||
|
# UserKey1 9866235
|
||||||
|
|
||||||
|
# UserKey1 <your_first_random_number_here>
|
||||||
|
# UserKey2 <your_second_random_number_here>
|
||||||
|
# UserKey3 <you_third_random_number_here>
|
||||||
|
|
||||||
|
# Numeric [OPTIONAL]
|
||||||
|
# Many ircd identify themselves with a Numeric ID when using this option
|
||||||
|
# consult your ircds documentation before using this.
|
||||||
|
#Numeric "3AX"
|
||||||
|
#Numeric "4"
|
||||||
|
|
||||||
|
# ModuleDelayedAutoload [OPTIONAL]
|
||||||
|
#
|
||||||
|
# When compiled with module support, this contains a space separated list
|
||||||
|
# of modules to automaticaly load when services are ready for new clients.
|
||||||
|
# e.g. new pesudo clients such as CatServ :-) *meow*
|
||||||
|
# By default a number of modules that we found worth adding by default are
|
||||||
|
# loaded. Feel free to change this if you want to add more, or remove some
|
||||||
|
# from the list.
|
||||||
|
#
|
||||||
|
ModuleDelayedAutoload "cs_appendtopic cs_enforce ns_maxemail ns_noop os_info"
|
||||||
|
|
||||||
|
** DELETED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
#
|
||||||
|
# Proxy detection
|
||||||
|
#
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
# Note: if ProxyDetect is not set, all parameters after it in this section
|
||||||
|
# are optional.
|
||||||
|
|
||||||
|
# ProxyDetect [OPTIONAL]
|
||||||
|
#
|
||||||
|
# Enables insecure proxy detection. Services will automatically
|
||||||
|
# scan each incoming user and akill those that use insecure proxy.
|
||||||
|
#
|
||||||
|
# Anope currently supports detection of Wingate (port 23), SOCKS4/5
|
||||||
|
# (port 1080), and HTTP proxy (ports 3128 and 8080). It uses the
|
||||||
|
# protocol of each proxy type to connect to an IRC server, it does
|
||||||
|
# not only check if the port is open (so your users may still have
|
||||||
|
# an open telnet server on their port 23 for example).
|
||||||
|
#
|
||||||
|
# WARNING: You should get the authorization of the administrator of
|
||||||
|
# the computer which runs the proxy detector before enabling it; not
|
||||||
|
# all administrators will accept it. Also note that in certain
|
||||||
|
# countries, port scanning is prohibited.
|
||||||
|
#
|
||||||
|
# This feature requires threading support to be compiled into Anope.
|
||||||
|
|
||||||
|
#ProxyDetect
|
||||||
|
|
||||||
|
# ProxyThreads <number> [REQUIRED]
|
||||||
|
#
|
||||||
|
# Sets the number of threads Services will launch when starting. Each
|
||||||
|
# thread will have the responsibility to scan queued hostname for
|
||||||
|
# proxies.
|
||||||
|
#
|
||||||
|
# This value must be set depending of the number of users you have
|
||||||
|
# on your network. The more threads are used, the more simultaneous
|
||||||
|
# checks can be done. Remember however, that threads are
|
||||||
|
# resource-consuming.
|
||||||
|
#
|
||||||
|
# WARNING: On Linux, each thread takes a background process, and there
|
||||||
|
# is an additional process used for thread management; this is a problem
|
||||||
|
# if you are limited in the number of background process you can use
|
||||||
|
# (on a paid shell for example).
|
||||||
|
|
||||||
|
ProxyThreads 5
|
||||||
|
|
||||||
|
# ProxyMessage... <message> [RECOMMENDED]
|
||||||
|
#
|
||||||
|
# Sets the notices that will be sent out to users before Services
|
||||||
|
# scan them for proxy. You may not use all of them, but just as much as
|
||||||
|
# necessary.
|
||||||
|
|
||||||
|
ProxyMessage1 "I will now detect if you're using an insecure proxy."
|
||||||
|
ProxyMessage2 "If you see a connection on port 23, 1080, 3128 or 8080 from"
|
||||||
|
ProxyMessage3 "my.box.net, please disregard it, as it is the detector in action."
|
||||||
|
ProxyMessage4 "See http://proxy.myirc.net/ for information about our proxy policy."
|
||||||
|
#ProxyMessage5 "Enter"
|
||||||
|
#ProxyMessage6 "whatever"
|
||||||
|
#ProxyMessage7 "you want"
|
||||||
|
#ProxyMessage8 "here."
|
||||||
|
|
||||||
|
# ProxyCheck... [OPTIONAL]
|
||||||
|
#
|
||||||
|
# Determines what types of proxy Anope will try to find (respectively
|
||||||
|
# Wingate on port 23, SOCKS4 on port 1080, SOCKS5 on port 1080, HTTP
|
||||||
|
# proxy on port 3128, HTTP proxy on port 8080 and HTTP proxy on port
|
||||||
|
# 80).
|
||||||
|
|
||||||
|
ProxyCheckWingate
|
||||||
|
ProxyCheckSocks4
|
||||||
|
ProxyCheckSocks5
|
||||||
|
ProxyCheckHTTP1
|
||||||
|
ProxyCheckHTTP2
|
||||||
|
ProxyCheckHTTP3
|
||||||
|
|
||||||
|
# ProxyTimeout <time> [REQUIRED]
|
||||||
|
|
||||||
|
# Sets the maximum length of time we allow a connect/read operation to
|
||||||
|
# take. If you set this value too high, your threads may hang on a single
|
||||||
|
# check for a very long time. The best is to try different values
|
||||||
|
# and see which one is the more efficient for your network.
|
||||||
|
|
||||||
|
ProxyTimeout 15s
|
||||||
|
|
||||||
|
# ProxyTestServer <ip> <port> [REQUIRED]
|
||||||
|
#
|
||||||
|
# Sets the *IP* and port of the IRC server to use as a target when
|
||||||
|
# testing users for proxy.
|
||||||
|
|
||||||
|
ProxyTestServer "1.2.3.4" 6667
|
||||||
|
|
||||||
|
# ProxyExpire <time> [RECOMMENDED]
|
||||||
|
#
|
||||||
|
# Sets the length of time before a proxy host cache entry expires, if
|
||||||
|
# not used. If this is not set the default time is 2 days.
|
||||||
|
|
||||||
|
ProxyExpire 30d
|
||||||
|
|
||||||
|
# ProxyCacheExpire <time> [REQUIRED]
|
||||||
|
#
|
||||||
|
# Sets the length of time before a normal host cache entry expires, if
|
||||||
|
# not used. This cannot be set to 0d.
|
||||||
|
#
|
||||||
|
# Every non-proxy hosts will be stored in cache (to avoid too many scans
|
||||||
|
# to the same host), so you should set this enough low to not fill your
|
||||||
|
# memory, especially on large networks.
|
||||||
|
|
||||||
|
ProxyCacheExpire 1d
|
||||||
|
|
||||||
|
# ProxyAkillReason <reason> [REQUIRED]
|
||||||
|
#
|
||||||
|
# Sets the reason that will be used to AKILL an user from the network
|
||||||
|
# if a proxy is detected.
|
||||||
|
|
||||||
|
ProxyAkillReason "You're using an insecure proxy. See http://proxy.myirc.net/config.html for information about how to config your proxy in a safe manner."
|
||||||
|
|
||||||
|
# WallProxy [OPTIONAL]
|
||||||
|
#
|
||||||
|
# Sends a WALLOPS/GLOBOPS when an user using an insecure proxy is being
|
||||||
|
# AKILLed.
|
||||||
|
|
||||||
|
WallProxy
|
||||||
|
|
||||||
|
# ProxyMax <number> [REQUIRED]
|
||||||
|
#
|
||||||
|
# Sets the maximum proxy cache entries that can be displayed in a single
|
||||||
|
# call to OperServ CACHE.
|
||||||
|
|
||||||
|
ProxyMax 50
|
||||||
|
|
||||||
|
|
||||||
|
Anope Version 1.7.8
|
||||||
|
-------------------
|
||||||
|
** ADDED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
# UseTS6 [OPTIONAL]
|
||||||
|
#
|
||||||
|
# Modern hybrid ircd like Ratbox 2.0.x support a protocol called TS6.
|
||||||
|
# However this protocol is optional thus our default support is for without
|
||||||
|
# TS6, if you want to take advantage of TS6, enable this option.
|
||||||
|
|
||||||
|
#UseTS6
|
||||||
|
|
||||||
|
** MODIFIED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
** DELETED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
Anope Version 1.7.7
|
||||||
|
-------------------
|
||||||
|
** ADDED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
# NSAddAccessOnReg [OPTIONAL]
|
||||||
|
#
|
||||||
|
# When enabled, services will add the usermask of registering users to the
|
||||||
|
# access list of their newly created account. If you disable this, users
|
||||||
|
# will always have to identify to nickserv before being recognized, unless
|
||||||
|
# they manually add an address to the access list of their account.
|
||||||
|
|
||||||
|
NSAddAccessOnReg
|
||||||
|
|
||||||
|
# UlineServers [OPTIONAL]
|
||||||
|
#
|
||||||
|
# A list of ulined servers on your network, these servers are assumed they
|
||||||
|
# can set channel modes and we will not attempt to take them from them
|
||||||
|
# WARNING: do not put your user servers in this option
|
||||||
|
|
||||||
|
UlineServers "stats.your.network, proxy.your.network"
|
||||||
|
|
||||||
|
# KillOnSGline [OPTIONAL]
|
||||||
|
#
|
||||||
|
# When enabled, this option makes the services send an (SVS)KILL command
|
||||||
|
# immediately after SGLINE ADD. This eliminates the need of killing the
|
||||||
|
# users after the SGLINE has been added.
|
||||||
|
|
||||||
|
# KillOnSGline
|
||||||
|
|
||||||
|
# KillOnSQline [OPTIONAL]
|
||||||
|
#
|
||||||
|
# When enabled, this option makes the services send an (SVS)KILL command
|
||||||
|
# immediately after SQLINE ADD. This eliminates the need of killing the
|
||||||
|
# users after the SQLINE has been added.
|
||||||
|
|
||||||
|
# KillOnSQline
|
||||||
|
|
||||||
|
** MODIFIED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
** DELETED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
# NetworkDomain <name> [OPTIONAL]
|
||||||
|
#
|
||||||
|
# If your network has a common domain name, specify it there (for
|
||||||
|
# example, all IRCZONE servers have a name ending in ".irczone.cl",
|
||||||
|
# so "irczone.cl" would be set there.
|
||||||
|
#
|
||||||
|
# You can specify more than one Network Domain by separating each one by
|
||||||
|
# a space: NetworkDomain "localnet.net localnet.com"
|
||||||
|
#
|
||||||
|
# Note that this directive is no longer used by the GLOBAL command, since
|
||||||
|
# it uses a dynamic list of connected servers regardless of their
|
||||||
|
# domains. However, some modules may still use this value, so you might
|
||||||
|
# want to keep it just in case.
|
||||||
|
|
||||||
|
NetworkDomain "localnet.com"
|
||||||
|
|
||||||
|
# ListOpersOnly [DEPRECATED]
|
||||||
|
# When enabled, limits use of the ChanServ and NickServ LIST commands
|
||||||
|
# to IRC operators.
|
||||||
|
#
|
||||||
|
# This directive has been superseded by the NSListOpersOnly and
|
||||||
|
# CSListOpersOnly directives.
|
||||||
|
|
||||||
|
#ListOpersOnly
|
||||||
|
|
||||||
|
Anope Version 1.7.6
|
||||||
|
-------------------
|
||||||
|
** ADDED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
# UserKey1|2|3 <value> [REQUIRED]
|
||||||
|
#
|
||||||
|
# These keys are required to initiate the random number generator. These
|
||||||
|
# numbers MUST be random as you want your passcodes to be random. Don't
|
||||||
|
# give these keys to no anyone! Keep them private!
|
||||||
|
|
||||||
|
#UserKey1 9866235
|
||||||
|
#UserKey2 5216332
|
||||||
|
#UserKey3 9651291
|
||||||
|
|
||||||
|
|
||||||
|
# RestrictOperNick [OPTIONAL]
|
||||||
|
# Forbids the registration of nicks that contain nick with services
|
||||||
|
# access. So if Tester is a Services Oper, for example, You can't
|
||||||
|
# register NewTester or Tester123 unless you are an IRC operator.
|
||||||
|
#RestrictOperNicks
|
||||||
|
|
||||||
|
# UseTokens [OPTIONAL]
|
||||||
|
# Allows irc networks to use TOKEN commands instead of the
|
||||||
|
# standard commands. This saves bandwidth but can break older
|
||||||
|
# modules that are not set to trap for TOKEN - if you are using
|
||||||
|
# older modules do NOT use this option
|
||||||
|
#UseTokens
|
||||||
|
|
||||||
|
# UseSVS2MODE [OPTIONAL]
|
||||||
|
# On Unreal IRCD use SVS2MODE instead of SVSMODE, doing this will
|
||||||
|
# show services changing user modes.
|
||||||
|
#UseSVS2MODE
|
||||||
|
|
||||||
|
# NewsCount [OPTIONAL]
|
||||||
|
# The number of LOGON/OPER News item to display when a user logs
|
||||||
|
# on. The default value is 3
|
||||||
|
#NewsCount 3
|
||||||
|
|
||||||
|
# Numeric [OPTIONAL]
|
||||||
|
# Many ircd identify themselves with a Numeric when using this option
|
||||||
|
# consult your ircds documentation before using this
|
||||||
|
#Numeric 0
|
||||||
|
|
||||||
|
# UnRestrictSAdmin [OPTIONAL]
|
||||||
|
# On many ircd Anope removes the umode of +a from users whom are not
|
||||||
|
# Service Admin in Anope. This mode is NOT used by Anope for any form
|
||||||
|
# of access. Thus this option allows them to keep the mode without having
|
||||||
|
# to be a Service Admin in Anope
|
||||||
|
#UnRestrictSAdmin
|
||||||
|
|
||||||
|
|
||||||
|
** MODIFIED CONFIGURATION DIRECTIVES **
|
||||||
|
** DELETED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
Anope Version 1.7.5
|
||||||
|
-------------------
|
||||||
|
** ADDED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
# UseSVSHOLD [OPTIONAL]
|
||||||
|
# Allows Bahamut-networks to use SVSHOLD instead of the services
|
||||||
|
# enforcer. This option has been introduced in Bahamut 1.4.35 and
|
||||||
|
# places a temporary Q:Line instead of introducing a new nick,
|
||||||
|
# which is better for both CPU and bandwidth. If you enable this
|
||||||
|
# option on a pre-1.4.35 Bahamut, it is most likely to break.
|
||||||
|
#UseSVSHOLD
|
||||||
|
|
||||||
|
** MODIFIED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
# NetworkDomain <name> [OPTIONAL]
|
||||||
|
#
|
||||||
|
# If your network has a common domain name, specify it there (for
|
||||||
|
# example, all IRCZONE servers have a name ending in ".irczone.cl",
|
||||||
|
# so "irczone.cl" would be set there.
|
||||||
|
#
|
||||||
|
# You can specify more than one Network Domain by separating each one by
|
||||||
|
# a space: NetworkDomain "localnet.net localnet.com"
|
||||||
|
#
|
||||||
|
# Note that this directive is no longer used by the GLOBAL command, since
|
||||||
|
# it uses a dynamic list of connected servers regardless of their
|
||||||
|
# domains. However, some modules may still use this value, so you might
|
||||||
|
# want to keep it just in case.
|
||||||
|
|
||||||
|
NetworkDomain "localnet.com"
|
||||||
|
|
||||||
|
** DELETED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
Anope Version 1.7.4
|
||||||
|
-------------------
|
||||||
|
** ADDED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
# NSNickTracking [OPTIONAL]
|
||||||
|
#
|
||||||
|
# When enabled, services will track your last nick identified when issuing
|
||||||
|
# nick changes.
|
||||||
|
|
||||||
|
#NSNickTracking
|
||||||
|
|
||||||
|
** MODIFIED CONFIGURATION DIRECTIVES **
|
||||||
|
** DELETED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
Anope Version 1.7.3
|
||||||
|
-------------------
|
||||||
|
** ADDED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
# BSCaseSensitive [OPTIONAL]
|
||||||
|
# This option will make botserv use cAsE sEnSiTiVe checking for badwords
|
||||||
|
|
||||||
|
# BSCaseSensitive
|
||||||
|
|
||||||
|
# MSMemoReceipt [OPTIONAL]
|
||||||
|
# Allow the use of memo receipts for the following groups:
|
||||||
|
# 1 - Opers Only
|
||||||
|
# 2 - Everybody
|
||||||
|
#
|
||||||
|
#MSMemoReceipt 1
|
||||||
|
|
||||||
|
Anope Version 1.7.2
|
||||||
|
--------------------
|
||||||
|
No Changes.
|
||||||
|
|
||||||
|
Anope Version 1.7.1
|
||||||
|
--------------------
|
||||||
|
** ADDED CONFIGURATION DIRECTIVES **
|
||||||
|
|
||||||
|
# UseRDB [OPTIONAL]
|
||||||
|
#
|
||||||
|
# Enable this if you want anope to load its data from a remote database.
|
||||||
|
# (e.g. MySQL)
|
||||||
|
#
|
||||||
|
#UseRDB
|
||||||
|
|
||||||
|
# NickRegDelay <seconds> [OPTIONAL]
|
||||||
|
# Prevents users from regging their nick if they are not
|
||||||
|
# connected for at least X seconds.
|
||||||
|
#NickRegDelay 30
|
||||||
|
|
||||||
|
** MODIFIED CONFIGURATION DIRECTIVES **
|
||||||
|
** DELETED CONFIGURATION DIRECTIVES **
|
||||||
+640
@@ -0,0 +1,640 @@
|
|||||||
|
Anope Version 1.8.9
|
||||||
|
-------------------
|
||||||
|
*** New Strings:
|
||||||
|
|
||||||
|
*** Mod Strings:
|
||||||
|
|
||||||
|
*** Del Strings:
|
||||||
|
|
||||||
|
|
||||||
|
Anope Version 1.8.8
|
||||||
|
-------------------
|
||||||
|
*** New Strings:
|
||||||
|
|
||||||
|
*** Mod Strings:
|
||||||
|
|
||||||
|
*** Del Strings:
|
||||||
|
|
||||||
|
|
||||||
|
Anope Version 1.8.7
|
||||||
|
-------------------
|
||||||
|
*** New Strings:
|
||||||
|
|
||||||
|
*** Mod Strings:
|
||||||
|
|
||||||
|
*** Del Strings:
|
||||||
|
|
||||||
|
|
||||||
|
Anope Version 1.8.6
|
||||||
|
-------------------
|
||||||
|
*** New Strings:
|
||||||
|
|
||||||
|
*** Mod Strings:
|
||||||
|
|
||||||
|
*** Del Strings:
|
||||||
|
|
||||||
|
|
||||||
|
Anope Version 1.8.5
|
||||||
|
-------------------
|
||||||
|
*** New Strings:
|
||||||
|
|
||||||
|
*** Mod Strings:
|
||||||
|
|
||||||
|
*** Del Strings:
|
||||||
|
|
||||||
|
|
||||||
|
Anope Version 1.8.4
|
||||||
|
-------------------
|
||||||
|
*** New Strings:
|
||||||
|
|
||||||
|
*** Mod Strings:
|
||||||
|
NICK_HELP_LIST
|
||||||
|
|
||||||
|
*** Del Strings:
|
||||||
|
|
||||||
|
|
||||||
|
Anope Version 1.8.3
|
||||||
|
-------------------
|
||||||
|
*** New Strings:
|
||||||
|
|
||||||
|
*** Mod Strings:
|
||||||
|
NEWS_HELP_LOGON
|
||||||
|
NEWS_HELP_OPER
|
||||||
|
NEWS_HELP_RANDOM
|
||||||
|
|
||||||
|
*** Del Strings:
|
||||||
|
|
||||||
|
Anope Version 1.8.2
|
||||||
|
-------------------
|
||||||
|
*** New Strings:
|
||||||
|
|
||||||
|
*** Mod Strings:
|
||||||
|
|
||||||
|
*** Del Strings:
|
||||||
|
|
||||||
|
Anope Version 1.8.1
|
||||||
|
-------------------
|
||||||
|
*** New Strings:
|
||||||
|
HOST_OFF
|
||||||
|
*** Mod Strings:
|
||||||
|
|
||||||
|
*** Del Strings:
|
||||||
|
|
||||||
|
Anope Version 1.8.0
|
||||||
|
-------------------
|
||||||
|
*** New Strings:
|
||||||
|
|
||||||
|
*** Mod Strings:
|
||||||
|
|
||||||
|
*** Del Strings:
|
||||||
|
|
||||||
|
Anope Version 1.7.24
|
||||||
|
--------------------
|
||||||
|
*** New Strings:
|
||||||
|
OPER_STATS_HOSTSERV_MEM
|
||||||
|
|
||||||
|
*** Mod Strings:
|
||||||
|
NICK_HELP_SASET_AUTOOP
|
||||||
|
|
||||||
|
*** Del Strings:
|
||||||
|
|
||||||
|
Anope Version 1.7.23b
|
||||||
|
--------------------
|
||||||
|
*** New Strings:
|
||||||
|
|
||||||
|
*** Mod Strings:
|
||||||
|
|
||||||
|
*** Del Strings:
|
||||||
|
|
||||||
|
Anope Version 1.7.23
|
||||||
|
--------------------
|
||||||
|
*** New Strings:
|
||||||
|
PASSWORD_TOO_LONG
|
||||||
|
CHAN_LOGOUT_FOUNDER_FAILED
|
||||||
|
|
||||||
|
*** Mod Strings:
|
||||||
|
OPER_HELP_OPER
|
||||||
|
NICK_HELP_SASET_PASSWORD
|
||||||
|
OPER_IGNORE_SYNTAX
|
||||||
|
OPER_HELP_IGNORE
|
||||||
|
CHAN_LOGOUT_ALL_SUCCEEDED
|
||||||
|
OPER_HELP_MODLIST
|
||||||
|
|
||||||
|
*** Del Strings:
|
||||||
|
PASSWORD_TRUNCATED
|
||||||
|
|
||||||
|
Anope Version 1.7.22
|
||||||
|
--------------------
|
||||||
|
*** New Strings:
|
||||||
|
NICK_SASET_LANGUAGE_SYNTAX
|
||||||
|
NICK_SASET_LANGUAGE_UNKNOWN
|
||||||
|
NICK_SASET_LANGUAGE_CHANGED
|
||||||
|
NICK_HELP_SASET_LANGUAGE
|
||||||
|
NICK_HELP_RESEND
|
||||||
|
|
||||||
|
*** Mod Strings:
|
||||||
|
NICK_HELP_SASET
|
||||||
|
NICK_RECOVERED
|
||||||
|
NICK_LIST_SERVADMIN_SYNTAX
|
||||||
|
NICK_SERVADMIN_HELP_LIST
|
||||||
|
CHAN_GETKEY_KEY
|
||||||
|
NICK_SERVADMIN_HELP_LIST
|
||||||
|
CHAN_SERVADMIN_HELP_LIST
|
||||||
|
OPER_HELP_GLOBAL
|
||||||
|
OPER_HELP_UMODE
|
||||||
|
OPER_HELP_OLINE
|
||||||
|
OPER_HELP_KICK
|
||||||
|
OPER_HELP_SVSNICK
|
||||||
|
OPER_HELP_SET_LOGCHAN
|
||||||
|
OPER_HELP_SET_SUPERADMIN
|
||||||
|
CHAN_HELP_AKICK
|
||||||
|
NICK_HELP_RECOVER
|
||||||
|
NICK_HELP_RELEASE
|
||||||
|
NEWS_HELP_LOGON
|
||||||
|
NEWS_HELP_OPER
|
||||||
|
OPER_HELP_IGNORE
|
||||||
|
OPER_IGNORE_TIME_DONE
|
||||||
|
OPER_IGNORE_PERM_DONE
|
||||||
|
OPER_IGNORE_DEL_DONE
|
||||||
|
|
||||||
|
*** Del Strings:
|
||||||
|
NICK_SET_UNKNOWN_OPTION_OR_BAD_NICK
|
||||||
|
OPER_HELP_KILLCLONES
|
||||||
|
|
||||||
|
Anope Version 1.7.21
|
||||||
|
--------------------
|
||||||
|
*** New Strings:
|
||||||
|
|
||||||
|
*** Mod Strings:
|
||||||
|
|
||||||
|
*** Del Strings:
|
||||||
|
|
||||||
|
Anope Version 1.7.20
|
||||||
|
--------------------
|
||||||
|
*** New Strings:
|
||||||
|
NICK_HELP_CONFIRM
|
||||||
|
CHAN_XOP_NOT_AVAILABLE
|
||||||
|
HELP_LIMIT_SERV_OPER
|
||||||
|
HELP_LIMIT_SERV_ADMIN
|
||||||
|
HELP_LIMIT_SERV_ROOT
|
||||||
|
HELP_LIMIT_IRC_OPER
|
||||||
|
HELP_LIMIT_HOST_SETTER
|
||||||
|
HELP_LIMIT_HOST_REMOVER
|
||||||
|
|
||||||
|
*** Mod Strings:
|
||||||
|
OPER_HELP_SET
|
||||||
|
In all of the following strings only the trailing 'Limited to ...' line has been removed:
|
||||||
|
OPER_HELP_EXCEPTION
|
||||||
|
OPER_HELP_SESSION
|
||||||
|
NICK_HELP_SASET
|
||||||
|
NICK_HELP_SASET_DISPLAY
|
||||||
|
NICK_HELP_SASET_PASSWORD
|
||||||
|
NICK_HELP_SASET_URL
|
||||||
|
NICK_HELP_SASET_EMAIL
|
||||||
|
NICK_HELP_SASET_ICQ
|
||||||
|
NICK_HELP_SASET_GREET
|
||||||
|
NICK_HELP_SASET_KILL
|
||||||
|
NICK_HELP_SASET_SECURE
|
||||||
|
NICK_HELP_SASET_PRIVATE
|
||||||
|
NICK_HELP_SASET_HIDE
|
||||||
|
NICK_HELP_SASET_MSG
|
||||||
|
NICK_HELP_SASET_NOEXPIRE
|
||||||
|
NICK_HELP_SASET_AUTOOP
|
||||||
|
NICK_SERVADMIN_HELP_GETPASS
|
||||||
|
NICK_SERVADMIN_HELP_GETEMAIL
|
||||||
|
NICK_SERVADMIN_HELP_FORBID
|
||||||
|
NICK_SERVADMIN_HELP_SUSPEND
|
||||||
|
NICK_SERVADMIN_HELP_UNSUSPEND
|
||||||
|
CHAN_SERVADMIN_HELP_SET_NOEXPIRE
|
||||||
|
CHAN_SERVADMIN_HELP_GETPASS
|
||||||
|
CHAN_SERVADMiN_HELP_FORBID
|
||||||
|
CHAN_SERVADMIN_HELP_SUSPEND
|
||||||
|
CHAN_SERVADMIN_HELP_UNSUSPEND
|
||||||
|
CHAN_SERVADMIN_HELP_STATUS
|
||||||
|
OPER_HELP_MODE
|
||||||
|
OPER_HELP_CLEARMODES
|
||||||
|
OPER_HELP_KICK
|
||||||
|
OPER_HELP_SVSNICK
|
||||||
|
OPER_HELP_AKILL
|
||||||
|
OPER_HELP_SGLINE
|
||||||
|
OPER_HELP_SQLINE
|
||||||
|
OPER_HELP_SZLINE
|
||||||
|
OPER_HELP_SET
|
||||||
|
OPER_HELP_NOOP
|
||||||
|
OPER_HELP_JUPE
|
||||||
|
OPER_HELP_RAW
|
||||||
|
OPER_HELP_UPDATE
|
||||||
|
OPER_HELP_RELOAD
|
||||||
|
OPER_HELP_QUIT
|
||||||
|
OPER_HELP_SHUTDOWN
|
||||||
|
OPER_HELP_RESTART
|
||||||
|
OPER_HELP_KILLCLONES
|
||||||
|
OPER_HELP_CHANLIST
|
||||||
|
OPER_HELP_USERLIST
|
||||||
|
OPER_HELP_MODLOAD
|
||||||
|
OPER_HELP_MODUNLOAD
|
||||||
|
OPER_HELP_MODINFO
|
||||||
|
OPER_HELP_MODLIST
|
||||||
|
BOT_SERVADMIN_HELP_SET_NOBOT
|
||||||
|
BOT_SERVADMIN_HELP_SET_PRIVATE
|
||||||
|
HOST_HELP_SET
|
||||||
|
HOST_HELP_DELALL
|
||||||
|
HOST_HELP_SETALL
|
||||||
|
HOST_HELP_DEL
|
||||||
|
HOST_HELP_LIST
|
||||||
|
|
||||||
|
*** Del Strings:
|
||||||
|
|
||||||
|
Anope Version 1.7.19
|
||||||
|
--------------------
|
||||||
|
*** New Strings:
|
||||||
|
|
||||||
|
*** Mod Strings:
|
||||||
|
CHAN_HELP_LIST
|
||||||
|
BOT_SET_SYNTAX
|
||||||
|
BOT_HELP_SET
|
||||||
|
|
||||||
|
*** Del Strings:
|
||||||
|
|
||||||
|
Anope Version 1.7.18
|
||||||
|
--------------------
|
||||||
|
*** New Strings:
|
||||||
|
|
||||||
|
*** Mod Strings:
|
||||||
|
|
||||||
|
*** Del Strings:
|
||||||
|
|
||||||
|
Anope Version 1.7.17
|
||||||
|
--------------------
|
||||||
|
*** New Strings:
|
||||||
|
|
||||||
|
*** Mod Strings:
|
||||||
|
|
||||||
|
*** Del Strings:
|
||||||
|
|
||||||
|
Anope Version 1.7.16
|
||||||
|
--------------------
|
||||||
|
*** New Strings:
|
||||||
|
|
||||||
|
*** Mod Strings:
|
||||||
|
|
||||||
|
*** Del Strings:
|
||||||
|
|
||||||
|
Anope Version 1.7.15
|
||||||
|
--------------------
|
||||||
|
*** New Strings:
|
||||||
|
INVALID_TARGET
|
||||||
|
NICK_SET_AUTOOP_SYNTAX
|
||||||
|
NICK_SET_AUTOOP_ON
|
||||||
|
NICK_SET_AUTOOP_OFF
|
||||||
|
BOT_LONG_IDENT
|
||||||
|
|
||||||
|
*** Mod Strings:
|
||||||
|
NICK_HELP_SET
|
||||||
|
*** Del Strings:
|
||||||
|
|
||||||
|
Anope Version 1.7.14
|
||||||
|
--------------------
|
||||||
|
*** New Strings:
|
||||||
|
CHAN_X_INVALID
|
||||||
|
|
||||||
|
*** Mod Strings:
|
||||||
|
|
||||||
|
*** Del Strings:
|
||||||
|
|
||||||
|
Anope Version 1.7.13
|
||||||
|
--------------------
|
||||||
|
*** New Strings:
|
||||||
|
|
||||||
|
*** Mod Strings:
|
||||||
|
|
||||||
|
*** Del Strings:
|
||||||
|
|
||||||
|
Anope Version 1.7.12
|
||||||
|
--------------------
|
||||||
|
*** New Strings:
|
||||||
|
OPER_STATS_UPLINK_SERVER
|
||||||
|
OPER_STATS_UPLINK_CAPAB
|
||||||
|
OPER_STATS_UPLINK_SERVER_COUNT
|
||||||
|
|
||||||
|
*** Mod Strings:
|
||||||
|
OPER_HELP_STATS
|
||||||
|
|
||||||
|
*** Del Strings:
|
||||||
|
|
||||||
|
Anope Version 1.7.11
|
||||||
|
---------------------
|
||||||
|
*** New Strings:
|
||||||
|
NICK_SASET_SYNTAX
|
||||||
|
NICK_SASET_DISABLED
|
||||||
|
NICK_SASET_UNKNOWN_OPTION
|
||||||
|
NICK_SASET_BAD_NICK
|
||||||
|
NICK_SASET_OPTION_DISABLED
|
||||||
|
NICK_SASET_DISPLAY_INVALID
|
||||||
|
NICK_SASET_DISPLAY_CHANGED
|
||||||
|
NICK_SASET_PASSWORD_FAILED
|
||||||
|
NICK_SASET_PASSWORD_CHANGED
|
||||||
|
NICK_SASET_PASSWORD_CHANGED_TO
|
||||||
|
NICK_SASET_LANGUAGE_SYNTAX
|
||||||
|
NICK_SASET_LANGUAGE_UNKNOWN
|
||||||
|
NICK_SASET_LANGUAGE_CHANGED
|
||||||
|
NICK_SASET_URL_CHANGED
|
||||||
|
NICK_SASET_URL_UNSET
|
||||||
|
NICK_SASET_EMAIL_CHANGED
|
||||||
|
NICK_SASET_EMAIL_UNSET
|
||||||
|
NICK_SASET_EMAIL_UNSET_IMPOSSIBLE
|
||||||
|
NICK_SASET_ICQ_CHANGED
|
||||||
|
NICK_SASET_ICQ_UNSET
|
||||||
|
NICK_SASET_ICQ_INVALID
|
||||||
|
NICK_SASET_GREET_CHANGED
|
||||||
|
NICK_SASET_GREET_UNSET
|
||||||
|
NICK_SASET_KILL_SYNTAX
|
||||||
|
NICK_SASET_KILL_IMMED_SYNTAX
|
||||||
|
NICK_SASET_KILL_ON
|
||||||
|
NICK_SASET_KILL_QUICK
|
||||||
|
NICK_SASET_KILL_IMMED
|
||||||
|
NICK_SASET_KILL_IMMED_DISABLED
|
||||||
|
NICK_SASET_KILL_OFF
|
||||||
|
NICK_SASET_SECURE_SYNTAX
|
||||||
|
NICK_SASET_SECURE_ON
|
||||||
|
NICK_SASET_SECURE_OFF
|
||||||
|
NICK_SASET_PRIVATE_SYNTAX
|
||||||
|
NICK_SASET_PRIVATE_ON
|
||||||
|
NICK_SASET_PRIVATE_OFF
|
||||||
|
NICK_SASET_HIDE_SYNTAX
|
||||||
|
NICK_SASET_HIDE_EMAIL_ON
|
||||||
|
NICK_SASET_HIDE_EMAIL_OFF
|
||||||
|
NICK_SASET_HIDE_MASK_ON
|
||||||
|
NICK_SASET_HIDE_MASK_OFF
|
||||||
|
NICK_SASET_HIDE_QUIT_ON
|
||||||
|
NICK_SASET_HIDE_QUIT_OFF
|
||||||
|
NICK_SASET_HIDE_STATUS_ON
|
||||||
|
NICK_SASET_HIDE_STATUS_OFF
|
||||||
|
NICK_SASET_MSG_SYNTAX
|
||||||
|
NICK_SASET_MSG_ON
|
||||||
|
NICK_SASET_MSG_OFF
|
||||||
|
NICK_SASET_NOEXPIRE_SYNTAX
|
||||||
|
NICK_SASET_NOEXPIRE_ON
|
||||||
|
NICK_SASET_NOEXPIRE_OFF
|
||||||
|
NICK_HELP_SASET
|
||||||
|
NICK_HELP_SASET_DISPLAY
|
||||||
|
NICK_HELP_SASET_PASSWORD
|
||||||
|
NICK_HELP_SASET_LANGUAGE
|
||||||
|
NICK_HELP_SASET_URL
|
||||||
|
NICK_HELP_SASET_EMAIL
|
||||||
|
NICK_HELP_SASET_ICQ
|
||||||
|
NICK_HELP_SASET_GREET
|
||||||
|
NICK_HELP_SASET_KILL
|
||||||
|
NICK_HELP_SASET_SECURE
|
||||||
|
NICK_HELP_SASET_PRIVATE
|
||||||
|
NICK_HELP_SASET_HIDE
|
||||||
|
NICK_HELP_SASET_MSG
|
||||||
|
NICK_HELP_SASET_NOEXPIRE
|
||||||
|
NICK_HELP_CMD_SASET
|
||||||
|
|
||||||
|
*** Mod Strings:
|
||||||
|
OPER_HELP_MODLIST
|
||||||
|
|
||||||
|
*** Del Strings:
|
||||||
|
NICK_SERVADMIN_HELP_SET
|
||||||
|
NICK_SERVADMIN_HELP_SET_NOEXPIRE
|
||||||
|
NICK_SET_NOEXPIRE_SYNTAX
|
||||||
|
NICK_SET_NOEXPIRE_ON
|
||||||
|
NICK_SET_NOEXPIRE_OFF
|
||||||
|
NICK_SASET_LANGUAGE_SYNTAX
|
||||||
|
NICK_SASET_LANGUAGE_UNKNOWN
|
||||||
|
NICK_SASET_LANGUAGE_CHANGED
|
||||||
|
NICK_HELP_SASET_LANGUAGE
|
||||||
|
|
||||||
|
|
||||||
|
Anope Version 1.7.10
|
||||||
|
--------------------
|
||||||
|
*** New Strings:
|
||||||
|
|
||||||
|
*** Mod Strings:
|
||||||
|
|
||||||
|
*** Del Strings:
|
||||||
|
|
||||||
|
Anope Version 1.7.9
|
||||||
|
-------------------
|
||||||
|
*** New Strings:
|
||||||
|
CHAN_HELP_IRCD_HALFOP
|
||||||
|
CHAN_HELP_IRCD_PROTECT
|
||||||
|
CHAN_GETKEY_SYNTAX
|
||||||
|
CHAN_GETKEY_NOKEY
|
||||||
|
CHAN_GETKEY_KEY
|
||||||
|
OPER_SET_SQL_ERROR_DISABLED
|
||||||
|
NICK_X_SUSPENDED
|
||||||
|
NICK_INFO_SUSPENDED
|
||||||
|
NICK_SUSPEND_SYNTAX
|
||||||
|
NICK_SUSPEND_SUCCEEDED
|
||||||
|
NICK_SUSPEND_FAILED
|
||||||
|
NICK_UNSUSPEND_SYNTAX
|
||||||
|
NICK_UNSUSPEND_SUCCEEDED
|
||||||
|
NICK_UNSUSPEND_FAILED
|
||||||
|
NICK_SERVADMIN_HELP_SUSPEND
|
||||||
|
NICK_SERVADMIN_HELP_UNSUSPEND
|
||||||
|
|
||||||
|
*** Mod Strings:
|
||||||
|
OPER_HELP_SET
|
||||||
|
NICK_HELP
|
||||||
|
CHAN_AOP_CLEAR
|
||||||
|
CHAN_HOP_CLEAR
|
||||||
|
CHAN_SOP_CLEAR
|
||||||
|
CHAN_VOP_CLEAR
|
||||||
|
CHAN_ACCESS_CLEAR
|
||||||
|
CHAN_AKICK_CLEAR
|
||||||
|
CHAN_SET_KEEPTOPIC_ON
|
||||||
|
CHAN_SET_KEEPTOPIC_OFF
|
||||||
|
CHAN_SET_TOPICLOCK_ON
|
||||||
|
CHAN_SET_TOPICLOCK_OFF
|
||||||
|
CHAN_SET_PEACE_ON
|
||||||
|
CHAN_SET_PEACE_OFF
|
||||||
|
CHAN_SET_PRIVATE_ON
|
||||||
|
CHAN_SET_PRIVATE_OFF
|
||||||
|
CHAN_SET_SECUREOPS_ON
|
||||||
|
CHAN_SET_SECUREOPS_OFF
|
||||||
|
CHAN_SET_SECUREFOUNDER_ON
|
||||||
|
CHAN_SET_SECUREFOUNDER_OFF
|
||||||
|
CHAN_SET_RESTRICTED_ON
|
||||||
|
CHAN_SET_RESTRICTED_OFF
|
||||||
|
CHAN_SET_SECURE_ON
|
||||||
|
CHAN_SET_SECURE_OFF
|
||||||
|
CHAN_SET_SIGNKICK_ON
|
||||||
|
CHAN_SET_SIGNKICK_LEVEL
|
||||||
|
CHAN_SET_SIGNKICK_OFF
|
||||||
|
CHAN_SET_OPNOTICE_ON
|
||||||
|
CHAN_SET_OPNOTICE_OFF
|
||||||
|
CHAN_SET_XOP_ON
|
||||||
|
CHAN_SET_XOP_OFF
|
||||||
|
|
||||||
|
*** Del Strings:
|
||||||
|
CHAN_HELP_ULTIMATE
|
||||||
|
OPER_STATS_PROXY_MEM
|
||||||
|
OPER_CACHE_SYNTAX
|
||||||
|
OPER_CACHE_DISABLED
|
||||||
|
OPER_CACHE_NOT_FOUND
|
||||||
|
OPER_CACHE_REMOVED
|
||||||
|
OPER_CACHE_HEADER
|
||||||
|
OPER_CACHE_LIST
|
||||||
|
OPER_CACHE_FOOTER
|
||||||
|
OPER_CACHE_QUEUED
|
||||||
|
OPER_CACHE_PROGRESS
|
||||||
|
OPER_CACHE_NORMAL
|
||||||
|
OPER_CACHE_WINGATE
|
||||||
|
OPER_CACHE_SOCKS4
|
||||||
|
OPER_CACHE_SOCKS5
|
||||||
|
OPER_CACHE_HTTP
|
||||||
|
OPER_HELP_CACHE
|
||||||
|
|
||||||
|
Anope Version 1.7.8
|
||||||
|
-------------------
|
||||||
|
*** New Strings:
|
||||||
|
OPER_HELP_SET_IGNORE
|
||||||
|
OPER_HELP_ADMIN_CMD_EXTRA
|
||||||
|
OPER_HELP_ADMIN_CMD_OLINE
|
||||||
|
OPER_HELP_ADMIN_CMD_UMODE
|
||||||
|
OPER_HELP_ADMIN_CMD_SVSNICK
|
||||||
|
OPER_HELP_OPER_CMD_EXTRA
|
||||||
|
OPER_HELP_OPER_CMD_SGLINE
|
||||||
|
OPER_HELP_OPER_CMD_SQLINE
|
||||||
|
OPER_HELP_OPER_CMD_SZLINE
|
||||||
|
|
||||||
|
*** Mod Strings:
|
||||||
|
HOST_OFF_UNREAL
|
||||||
|
OPER_HELP_OPER_CMD
|
||||||
|
OPER_HELP_ADMIN_CMD
|
||||||
|
|
||||||
|
*** Del Strings:
|
||||||
|
|
||||||
|
Anope Version 1.7.7
|
||||||
|
-------------------
|
||||||
|
*** New Strings:
|
||||||
|
MEMO_NO_RSEND_SELF
|
||||||
|
NICK_REGISTERED_NO_MASK
|
||||||
|
OPER_ADMIN_MOVED
|
||||||
|
OPER_OPER_MOVED
|
||||||
|
OPER_HELP_SET_SQL
|
||||||
|
OPER_SET_SQL_ON
|
||||||
|
OPER_SET_SQL_OFF
|
||||||
|
OPER_SET_SQL_ERROR
|
||||||
|
OPER_SET_SQL_ERROR_INIT
|
||||||
|
OPER_EXCEPTION_EXISTS
|
||||||
|
OPER_EXCEPTION_CHANGED
|
||||||
|
OPER_SET_LIST_OPTION_ON
|
||||||
|
OPER_SET_LIST_OPTION_OFF
|
||||||
|
OPER_HELP_SET_LIST
|
||||||
|
OPER_SUPER_ADMIN_NOT_ENABLED
|
||||||
|
|
||||||
|
*** Mod Strings:
|
||||||
|
|
||||||
|
BOT_SERVADMIN_HELP_BOT
|
||||||
|
NICK_HELP_STATUS
|
||||||
|
|
||||||
|
*** Del Strings:
|
||||||
|
|
||||||
|
Anope Version 1.7.6
|
||||||
|
-------------------
|
||||||
|
*** New Strings:
|
||||||
|
|
||||||
|
CHAN_REGISTER_NONE_CHANNEL
|
||||||
|
CHAN_SYMBOL_REQUIRED
|
||||||
|
OPER_SVSNICK_UNSUPPORTED
|
||||||
|
OPER_SQLINE_UNSUPPORTED
|
||||||
|
OPER_SVSO_UNSUPPORTED
|
||||||
|
OPER_UMODE_UNSUPPORTED
|
||||||
|
CHAN_CLEARED_INVITES
|
||||||
|
NICK_INFO_VHOST2
|
||||||
|
NICK_STATUS_0
|
||||||
|
NICK_STATUS_1
|
||||||
|
NICK_STATUS_2
|
||||||
|
NICK_STATUS_3
|
||||||
|
CHAN_STATUS_SYNTAX
|
||||||
|
CHAN_STATUS_NOT_REGGED
|
||||||
|
CHAN_STATUS_FORBIDDEN
|
||||||
|
CHAN_STATUS_NOTONLINE
|
||||||
|
CHAN_STATUS_INFO
|
||||||
|
NICK_INFO_EXPIRE
|
||||||
|
NICK_GLIST_REPLY
|
||||||
|
NICK_GLIST_REPLY_ADMIN
|
||||||
|
CHAN_INFO_EXPIRE
|
||||||
|
NICK_ACCESS_LIST_EMPTY
|
||||||
|
NICK_ACCESS_LIST_X_EMPTY
|
||||||
|
|
||||||
|
*** Mod Strings:
|
||||||
|
|
||||||
|
*** Del Strings:
|
||||||
|
|
||||||
|
Anope Version 1.7.5
|
||||||
|
-------------------
|
||||||
|
*** New Strings:
|
||||||
|
|
||||||
|
*** Mod Strings:
|
||||||
|
|
||||||
|
MEMO_HELP
|
||||||
|
CHAN_LEVEL_NOJOIN
|
||||||
|
|
||||||
|
*** Del Strings:
|
||||||
|
|
||||||
|
Anope Version 1.7.4
|
||||||
|
-------------------
|
||||||
|
*** New Strings:
|
||||||
|
|
||||||
|
CHAN_CLEARED_HOPS
|
||||||
|
OPER_MODULE_LIST_HEADER
|
||||||
|
OPER_MODULE_LIST_FOOTER
|
||||||
|
NICK_X_IS_SERVICES
|
||||||
|
|
||||||
|
*** Mod Strings:
|
||||||
|
|
||||||
|
CHAN_HELP_CLEAR
|
||||||
|
|
||||||
|
*** Del Strings:
|
||||||
|
|
||||||
|
Anope Version 1.7.3
|
||||||
|
-------------------
|
||||||
|
*** New Strings:
|
||||||
|
|
||||||
|
MEMO_RSEND_PLEASE_WAIT
|
||||||
|
MEMO_RSEND_DISABLED
|
||||||
|
MEMO_RSEND_SYNTAX
|
||||||
|
MEMO_RSEND_NICK_MEMO_TEXT
|
||||||
|
MEMO_RSEND_CHAN_MEMO_TEXT
|
||||||
|
MEMO_RSEND_USER_NOTIFICATION
|
||||||
|
MEMO_HELP_RSEND
|
||||||
|
MEMO_CHECK_SYNTAX
|
||||||
|
MEMO_CHECK_NOT_READ
|
||||||
|
MEMO_CHECK_READ
|
||||||
|
MEMO_CHECK_NO_MEMO
|
||||||
|
MEMO_HELP_CHECK
|
||||||
|
|
||||||
|
*** Mod Strings:
|
||||||
|
MEMO_HELP
|
||||||
|
NICK_LIST_SERVADMIN_SYNTAX
|
||||||
|
NICK_SERVADMIN_HELP_LIST
|
||||||
|
|
||||||
|
Anope Version 1.7.2
|
||||||
|
--------------------
|
||||||
|
No Changes.
|
||||||
|
|
||||||
|
Anope Version 1.7.1
|
||||||
|
--------------------
|
||||||
|
*** New Strings:
|
||||||
|
|
||||||
|
MEMO_SET_NOTIFY_MAIL
|
||||||
|
MEMO_SET_NOTIFY_NOMAIL
|
||||||
|
MEMO_SET_NOTIFY_INVALIDMAIL
|
||||||
|
MEMO_MAIL_SUBJECT
|
||||||
|
MEMO_MAIL_TEXT1
|
||||||
|
MEMO_MAIL_TEXT2
|
||||||
|
MEMO_MAIL_TEXT3
|
||||||
|
NICK_INFO_SERVICES_ROOT
|
||||||
|
NICK_SET_HIDE_STATUS_ON
|
||||||
|
NICK_SET_HIDE_STATUS_OFF
|
||||||
|
NICK_REG_DELAY
|
||||||
|
|
||||||
|
*** Mod Strings:
|
||||||
|
MEMO_SET_NOTIFY_SYNTAX
|
||||||
|
NICK_HELP_SET_HIDE
|
||||||
|
|
||||||
|
*** Del Strings:
|
||||||
+165
@@ -0,0 +1,165 @@
|
|||||||
|
Anope Version 1.8.9
|
||||||
|
-------------------
|
||||||
|
- NONE
|
||||||
|
|
||||||
|
Anope Version 1.8.8
|
||||||
|
-------------------
|
||||||
|
- NONE
|
||||||
|
|
||||||
|
Anope Version 1.8.7
|
||||||
|
-------------------
|
||||||
|
- NONE
|
||||||
|
|
||||||
|
Anope Version 1.8.6
|
||||||
|
-------------------
|
||||||
|
- NONE
|
||||||
|
|
||||||
|
Anope Version 1.8.5
|
||||||
|
-------------------
|
||||||
|
- NONE
|
||||||
|
|
||||||
|
Anope Version 1.8.4
|
||||||
|
-------------------
|
||||||
|
- NONE
|
||||||
|
|
||||||
|
Anope Version 1.8.3
|
||||||
|
-------------------
|
||||||
|
ALTER TABLE `anope_ns_access` DROP INDEX `display` ;
|
||||||
|
|
||||||
|
Anope Version 1.8.2
|
||||||
|
-------------------
|
||||||
|
- NONE
|
||||||
|
|
||||||
|
Anope Version 1.8.1
|
||||||
|
-------------------
|
||||||
|
- NONE
|
||||||
|
|
||||||
|
Anope Version 1.8.0
|
||||||
|
-------------------
|
||||||
|
ALTER TABLE `anope_ns_access` DROP INDEX display;
|
||||||
|
|
||||||
|
Anope Version 1.7.24
|
||||||
|
--------------------
|
||||||
|
- NONE
|
||||||
|
|
||||||
|
Anope Version 1.7.23b
|
||||||
|
--------------------
|
||||||
|
- NONE
|
||||||
|
|
||||||
|
Anope Version 1.7.23
|
||||||
|
--------------------
|
||||||
|
- NONE
|
||||||
|
|
||||||
|
Anope Version 1.7.22
|
||||||
|
--------------------
|
||||||
|
- NONE
|
||||||
|
|
||||||
|
Anope Version 1.7.21
|
||||||
|
--------------------
|
||||||
|
- NONE
|
||||||
|
|
||||||
|
Anope Version 1.7.20
|
||||||
|
--------------------
|
||||||
|
ALTER TABLE `anope_ns_request` DROP INDEX `nick_index` ;
|
||||||
|
ALTER TABLE `anope_ns_core` DROP INDEX `display_index` ;
|
||||||
|
ALTER TABLE `anope_ns_access` ADD UNIQUE (`display`) ;
|
||||||
|
ALTER TABLE `anope_ms_info` ADD UNIQUE (`nm_id` , `serv`) ;
|
||||||
|
ALTER TABLE `anope_ns_alias` DROP INDEX `nick_index` ;
|
||||||
|
ALTER TABLE `anope_cs_info` DROP INDEX `name_index` ;
|
||||||
|
ALTER TABLE `anope_cs_access` ADD UNIQUE (`channel` , `display`) ;
|
||||||
|
ALTER TABLE `anope_cs_levels` ADD UNIQUE (`channel` , `position`) ;
|
||||||
|
ALTER TABLE `anope_cs_akicks` CHANGE `dmask` `dmask` VARCHAR( 255 ) NOT NULL ;
|
||||||
|
ALTER TABLE `anope_cs_akicks` ADD UNIQUE (`channel` , `dmask`) ;
|
||||||
|
ALTER TABLE `anope_cs_badwords` CHANGE `word` `word` VARCHAR( 255 ) NOT NULL ;
|
||||||
|
ALTER TABLE `anope_cs_badwords` ADD UNIQUE (`channel` , `word`) ;
|
||||||
|
ALTER TABLE `anope_cs_ttb` ADD UNIQUE (`channel` , `ttb_id`) ;
|
||||||
|
ALTER TABLE `anope_os_akills` CHANGE `user` `user` VARCHAR( 255 ) NOT NULL , CHANGE `host` `host` VARCHAR( 255 ) NOT NULL ;
|
||||||
|
ALTER TABLE `anope_os_akills` ADD UNIQUE (`user` , `host`) ;
|
||||||
|
ALTER TABLE `anope_os_sglines` CHANGE `mask` `mask` VARCHAR( 255 ) NOT NULL ;
|
||||||
|
ALTER TABLE `anope_os_sglines` ADD UNIQUE (`mask`) ;
|
||||||
|
ALTER TABLE `anope_os_sqlines` CHANGE `mask` `mask` VARCHAR( 255 ) NOT NULL ;
|
||||||
|
ALTER TABLE `anope_os_sqlines` ADD UNIQUE (`mask`) ;
|
||||||
|
ALTER TABLE `anope_os_szlines` CHANGE `mask` `mask` VARCHAR( 255 ) NOT NULL ;
|
||||||
|
ALTER TABLE `anope_os_szlines` ADD UNIQUE (`mask`) ;
|
||||||
|
ALTER TABLE `anope_os_news` ADD UNIQUE (`type` , `num` , `time`) ;
|
||||||
|
ALTER TABLE `anope_os_exceptions` CHANGE `mask` `mask` VARCHAR( 255 ) NOT NULL ;
|
||||||
|
ALTER TABLE `anope_os_exceptions` ADD UNIQUE (`mask`) ;
|
||||||
|
ALTER TABLE `anope_hs_core` DROP INDEX `nick_index` ;
|
||||||
|
ALTER TABLE `anope_bs_core` DROP INDEX `nick_index` ;
|
||||||
|
ALTER TABLE `anope_ms_info` CHANGE `receiver` `receiver` VARCHAR( 255 ) NOT NULL ;
|
||||||
|
ALTER TABLE `anope_ms_info` ADD INDEX ( `receiver` , `serv` ) ;
|
||||||
|
|
||||||
|
Anope Version 1.7.19
|
||||||
|
--------------------
|
||||||
|
- NONE
|
||||||
|
|
||||||
|
Anope Version 1.7.18
|
||||||
|
--------------------
|
||||||
|
- DROP TABLE IF EXISTS `anope_os_status`
|
||||||
|
- ALTER TABLE `anope_bs_core` ADD `active` TINYINT( 1 ) DEFAULT '1' NOT NULL
|
||||||
|
- ALTER TABLE `anope_cs_access` ADD `active` TINYINT( 1 ) DEFAULT '1' NOT NULL
|
||||||
|
- ALTER TABLE `anope_cs_akicks` ADD `active` TINYINT( 1 ) DEFAULT '1' NOT NULL
|
||||||
|
- ALTER TABLE `anope_cs_badwords` ADD `active` TINYINT( 1 ) DEFAULT '1' NOT NULL
|
||||||
|
- ALTER TABLE `anope_cs_levels` ADD `active` TINYINT( 1 ) DEFAULT '1' NOT NULL
|
||||||
|
- ALTER TABLE `anope_cs_ttb` ADD `active` TINYINT( 1 ) DEFAULT '1' NOT NULL
|
||||||
|
- ALTER TABLE `anope_hs_core` ADD `active` TINYINT( 1 ) DEFAULT '1' NOT NULL
|
||||||
|
- ALTER TABLE `anope_ms_info` ADD `active` TINYINT( 1 ) DEFAULT '1' NOT NULL
|
||||||
|
- ALTER TABLE `anope_ns_access` ADD `active` TINYINT( 1 ) DEFAULT '1' NOT NULL
|
||||||
|
- ALTER TABLE `anope_ns_request` CHANGE `active` `active` TINYINT( 1 ) DEFAULT '1' NOT NULL
|
||||||
|
- ALTER TABLE `anope_os_akills` ADD `active` TINYINT( 1 ) DEFAULT '1' NOT NULL
|
||||||
|
- ALTER TABLE `anope_os_exceptions` ADD `active` TINYINT( 1 ) DEFAULT '1' NOT NULL
|
||||||
|
- ALTER TABLE `anope_os_news` ADD `active` TINYINT( 1 ) DEFAULT '1' NOT NULL
|
||||||
|
- ALTER TABLE `anope_os_sglines` ADD `active` TINYINT( 1 ) DEFAULT '1' NOT NULL
|
||||||
|
- ALTER TABLE `anope_os_sqlines` ADD `active` TINYINT( 1 ) DEFAULT '1' NOT NULL
|
||||||
|
- ALTER TABLE `anope_os_szlines` ADD `active` TINYINT( 1 ) DEFAULT '1' NOT NULL
|
||||||
|
|
||||||
|
Anope Version 1.7.17
|
||||||
|
--------------------
|
||||||
|
- CREATE TABLE anope_cs_ttb (
|
||||||
|
ct_id int(11) NOT NULL auto_increment,
|
||||||
|
channel varchar(255) NOT NULL default '',
|
||||||
|
ttb_id int(11) NOT NULL default '0',
|
||||||
|
value int(11) NOT NULL default '0',
|
||||||
|
PRIMARY KEY (ct_id)
|
||||||
|
) TYPE=MyISAM
|
||||||
|
- ALTER TABLE anope_cs_info DROP ttb
|
||||||
|
|
||||||
|
Anope Version 1.7.16
|
||||||
|
--------------------
|
||||||
|
- NONE
|
||||||
|
|
||||||
|
Anope Version 1.7.15
|
||||||
|
--------------------
|
||||||
|
- NONE
|
||||||
|
|
||||||
|
Anope Version 1.7.14
|
||||||
|
--------------------
|
||||||
|
- NONE
|
||||||
|
|
||||||
|
Anope Version 1.7.13
|
||||||
|
--------------------
|
||||||
|
- NONE
|
||||||
|
|
||||||
|
Anope Version 1.7.12
|
||||||
|
--------------------
|
||||||
|
- NONE
|
||||||
|
|
||||||
|
Anope Version 1.7.11
|
||||||
|
--------------------
|
||||||
|
- NONE
|
||||||
|
|
||||||
|
Anope Version 1.7.10
|
||||||
|
--------------------
|
||||||
|
- NONE
|
||||||
|
|
||||||
|
Anope Version 1.7.9
|
||||||
|
-------------------
|
||||||
|
- DROP TABLE IF EXISTS anope_os_cache
|
||||||
|
|
||||||
|
Anope Version 1.7.8
|
||||||
|
-------------------
|
||||||
|
- NONE
|
||||||
|
|
||||||
|
Anope Version 1.7.7
|
||||||
|
-------------------
|
||||||
|
- ALTER TABLE anope_ns_alias CHANGE status status int(11) unsigned NOT NULL default '0'
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# Configuration script for Services.
|
# Configuration script for Services.
|
||||||
#
|
#
|
||||||
# Anope (C) 2003-2024 Anope Team
|
# Anope (c) 2003-2014 Anope Team
|
||||||
# Contact us at team@anope.org
|
# Contact us at team@anope.org
|
||||||
#
|
#
|
||||||
# This program is free but copyrighted software; see the file COPYING for
|
# This program is free but copyrighted software; see the file COPYING for
|
||||||
@@ -14,110 +14,73 @@
|
|||||||
###########################################################################
|
###########################################################################
|
||||||
|
|
||||||
echo2 () {
|
echo2 () {
|
||||||
$ECHO2 "$*$ECHO2SUF" # these are defined later
|
$ECHO2 "$*$ECHO2SUF" # these are defined later
|
||||||
}
|
}
|
||||||
|
|
||||||
exists () { # because some shells don't have test -e
|
exists () { # because some shells don't have test -e
|
||||||
if [ -f $1 -o -d $1 -o -p $1 -o -c $1 -o -b $1 ] ; then
|
if [ -f $1 -o -d $1 -o -p $1 -o -c $1 -o -b $1 ] ; then
|
||||||
return 0
|
return 0
|
||||||
else
|
else
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
Load_Cache () {
|
Load_Cache () {
|
||||||
if [ -f $SOURCE_DIR/config.cache -a -r $SOURCE_DIR/config.cache -a ! "$IGNORE_CACHE" ] ; then
|
if [ -f config.cache -a -r config.cache -a ! "$IGNORE_CACHE" ] ; then
|
||||||
echo "Using defaults from config.cache. To ignore, $SOURCE_DIR/Config -nocache"
|
echo "Using defaults from config.cache. To ignore, ./Config -nocache"
|
||||||
echo ""
|
echo ""
|
||||||
. $SOURCE_DIR/config.cache
|
. ./config.cache
|
||||||
CAN_QUICK="yes"
|
CAN_QUICK="yes"
|
||||||
else
|
else
|
||||||
CAN_QUICK="no"
|
CAN_QUICK="no"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
Run_Build_System () {
|
Run_Configure () {
|
||||||
WITH_INST=""
|
WITH_BIN=""
|
||||||
WITH_RUN=""
|
WITH_DATA=""
|
||||||
WITH_PERM=""
|
WITH_ENC=""
|
||||||
EXTRA_INCLUDE=""
|
WITH_RUN=""
|
||||||
EXTRA_LIBS=""
|
WITH_PERM=""
|
||||||
GEN_TYPE=""
|
WITH_MYSQL=""
|
||||||
|
|
||||||
if [ "$INSTDIR" != "" ] ; then
|
if [ "$BINDEST" != "" ] ; then
|
||||||
WITH_INST="-DINSTDIR:STRING=$INSTDIR"
|
WITH_BIN=" --with-bindir=$BINDEST"
|
||||||
fi
|
WITH_DATA=" --with-datadir=$DATDEST"
|
||||||
|
fi
|
||||||
|
|
||||||
if [ "$RUNGROUP" != "" ] ; then
|
if [ "$DATDEST" != "" ] ; then
|
||||||
WITH_RUN="-DRUNGROUP:STRING=$RUNGROUP"
|
WITH_DATA=" --with-datadir=$DATDEST"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$UMASK" != "" ] ; then
|
if [ "$RUNGROUP" != "" ] ; then
|
||||||
WITH_PERM="-DDEFUMASK:STRING=$UMASK"
|
WITH_RUN=" --with-rungroup=$RUNGROUP"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$DEBUG" = "yes" ] ; then
|
if [ "$UMASK" != "" ] ; then
|
||||||
BUILD_TYPE="-DCMAKE_BUILD_TYPE:STRING=DEBUG"
|
WITH_PERM=" --with-permissions=$UMASK"
|
||||||
else
|
fi
|
||||||
BUILD_TYPE="-DCMAKE_BUILD_TYPE:STRING=RELEASE"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$USE_PCH" = "yes" ] ; then
|
if [ "$MYSQL" != "yes" ] ; then
|
||||||
PCH="-DUSE_PCH:BOOLEAN=ON"
|
WITH_MYSQL=" --without-mysql"
|
||||||
else
|
fi
|
||||||
PCH="-DUSE_PCH:BOOLEAN=OFF"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$EXTRA_INCLUDE_DIRS" != "" ] ; then
|
|
||||||
EXTRA_INCLUDE="-DEXTRA_INCLUDE:STRING=$EXTRA_INCLUDE_DIRS"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$EXTRA_LIB_DIRS" != "" ] ; then
|
echo "./configure $WITH_BIN $WITH_DATA $WITH_ENC $WITH_RUN $WITH_PERM $WITH_MYSQL"
|
||||||
EXTRA_LIBS="-DEXTRA_LIBS:STRING=$EXTRA_LIB_DIRS"
|
|
||||||
fi
|
|
||||||
|
|
||||||
case `uname -s` in
|
./configure $WITH_BIN $WITH_DATA $WITH_ENC $WITH_RUN $WITH_PERM $WITH_MYSQL
|
||||||
MINGW*)
|
|
||||||
GEN_TYPE="-G\"MSYS Makefiles\""
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
if [ "$SOURCE_DIR" = "." ] ; then
|
|
||||||
pwdsave=`pwd`
|
|
||||||
test -d build || mkdir build
|
|
||||||
cd "build"
|
|
||||||
REAL_SOURCE_DIR=".."
|
|
||||||
else
|
|
||||||
REAL_SOURCE_DIR="$SOURCE_DIR"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "cmake $GEN_TYPE $WITH_INST $WITH_RUN $WITH_PERM $BUILD_TYPE $PCH $EXTRA_INCLUDE $EXTRA_LIBS $EXTRA_CONFIG_ARGS $REAL_SOURCE_DIR"
|
|
||||||
|
|
||||||
cmake $GEN_TYPE $WITH_INST $WITH_RUN $WITH_PERM $BUILD_TYPE $PCH $EXTRA_INCLUDE $EXTRA_LIBS $EXTRA_CONFIG_ARGS $REAL_SOURCE_DIR
|
|
||||||
if [ $? -ne 0 ]; then
|
|
||||||
echo "You should fix these issues and then run ./Config -quick to rerun CMake."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
if [ "$SOURCE_DIR" = "." ] ; then
|
|
||||||
echo "Now cd build, then run make to build Anope."
|
|
||||||
cd "$pwdsave"
|
|
||||||
else
|
|
||||||
echo "Now run make to build Anope."
|
|
||||||
fi
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ECHO2SUF=''
|
ECHO2SUF=''
|
||||||
if [ "`echo -n a ; echo -n b`" = "ab" ] ; then
|
if [ "`echo -n a ; echo -n b`" = "ab" ] ; then
|
||||||
ECHO2='echo -n'
|
ECHO2='echo -n'
|
||||||
elif [ "`echo 'a\c' ; echo 'b\c'`" = "ab" ] ; then
|
elif [ "`echo 'a\c' ; echo 'b\c'`" = "ab" ] ; then
|
||||||
ECHO2='echo' ; ECHO2SUF='\c'
|
ECHO2='echo' ; ECHO2SUF='\c'
|
||||||
elif [ "`printf 'a' 2>&1 ; printf 'b' 2>&1`" = "ab" ] ; then
|
elif [ "`printf 'a' 2>&1 ; printf 'b' 2>&1`" = "ab" ] ; then
|
||||||
ECHO2='printf "%s"'
|
ECHO2='printf "%s"'
|
||||||
else
|
else
|
||||||
# oh well...
|
# oh well...
|
||||||
ECHO2='echo'
|
ECHO2='echo'
|
||||||
fi
|
fi
|
||||||
export ECHO2 ECHO2SUF
|
export ECHO2 ECHO2SUF
|
||||||
|
|
||||||
@@ -125,80 +88,50 @@ export ECHO2 ECHO2SUF
|
|||||||
# Init values
|
# Init values
|
||||||
###########################################################################
|
###########################################################################
|
||||||
|
|
||||||
INSTDIR=$HOME/services
|
BINDEST=$HOME/services
|
||||||
|
DATDEST=$HOME/services
|
||||||
RUNGROUP=
|
RUNGROUP=
|
||||||
UMASK=
|
UMASK=
|
||||||
DEBUG="no"
|
IRCTYPE="no default"
|
||||||
USE_PCH="no"
|
|
||||||
EXTRA_INCLUDE_DIRS=
|
|
||||||
EXTRA_LIB_DIRS=
|
|
||||||
EXTRA_CONFIG_ARGS=
|
|
||||||
CAN_QUICK="no"
|
CAN_QUICK="no"
|
||||||
SOURCE_DIR=`dirname $0`
|
|
||||||
|
|
||||||
###########################################################################
|
###########################################################################
|
||||||
# Check out the options
|
# Check out the options
|
||||||
###########################################################################
|
###########################################################################
|
||||||
|
|
||||||
while [ $# -ge 1 ] ; do
|
while [ $# -ge 1 ] ; do
|
||||||
if [ $1 = "--help" ] ; then
|
if [ $1 = "--help" ] ; then
|
||||||
echo "Config utility for Anope"
|
echo "Config utility for Anope"
|
||||||
echo "------------------------"
|
echo "------------------------"
|
||||||
echo "Syntax: ./Config [options]"
|
echo "Syntax: ./Config [options]"
|
||||||
echo "-nocache Ignore settings saved in config.cache"
|
echo "-nocache Ignore settings saved in config.cache"
|
||||||
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 configure"
|
||||||
exit 0
|
exit 0
|
||||||
elif [ $1 = "-devel" ] ; then
|
elif [ $1 = "-nocache" ] ; then
|
||||||
DEBUG="yes"
|
IGNORE_CACHE="1"
|
||||||
INSTDIR="$PWD/run"
|
elif [ $1 = "-nointro" ] ; then
|
||||||
elif [ $1 = "-nocache" ] ; then
|
NO_INTRO="1"
|
||||||
IGNORE_CACHE="1"
|
elif [ $1 = "-quick" -o $1 = "-q" ] ; then
|
||||||
elif [ $1 = "-nointro" ] ; then
|
Load_Cache
|
||||||
NO_INTRO="1"
|
if [ $CAN_QUICK = "yes" ] ; then
|
||||||
elif [ $1 = "-quick" -o $1 = "-q" ] ; then
|
Run_Configure
|
||||||
Load_Cache
|
else
|
||||||
if [ "$CAN_QUICK" = "yes" ] ; then
|
echo ""
|
||||||
Run_Build_System
|
echo "Can't find cache file (config.cache), aborting..."
|
||||||
else
|
fi
|
||||||
echo ""
|
exit 0
|
||||||
echo "Can't find cache file (config.cache), aborting..."
|
fi
|
||||||
fi
|
shift 1
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
shift 1
|
|
||||||
done
|
done
|
||||||
|
|
||||||
###########################################################################
|
###########################################################################
|
||||||
# Check for CMake and (optionally) install it
|
|
||||||
###########################################################################
|
|
||||||
|
|
||||||
cmake --version 2>&1 > /dev/null
|
|
||||||
if [ $? -ne 0 ] ; then
|
|
||||||
clear
|
|
||||||
echo "Anope requires CMake 2.4 or newer, which can be downloaded at https://cmake.org/ or through your system's package manager."
|
|
||||||
echo "If you have installed CMake already, ensure it is in your PATH environment variable."
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
###########################################################################
|
|
||||||
|
|
||||||
if [ ! "$NO_INTRO" ] ; then
|
if [ ! "$NO_INTRO" ] ; then
|
||||||
case `uname -s` in
|
clear
|
||||||
MINGW*)
|
. ./version.log
|
||||||
PAGER=less
|
cat .BANNER | sed "s/CURVER/$VERSION_MAJOR.$VERSION_MINOR.$VERSION_PATCH$VERSION_EXTRA/" | more
|
||||||
;;
|
echo ""
|
||||||
*)
|
|
||||||
PAGER=more
|
|
||||||
clear
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
export MORE='-e'
|
|
||||||
. $SOURCE_DIR/src/version.sh
|
|
||||||
cat $SOURCE_DIR/.BANNER | sed "s/CURVER/$VERSION_MAJOR.$VERSION_MINOR.$VERSION_PATCH$VERSION_EXTRA/" | sed "s@SOURCE_DIR@$SOURCE_DIR@" | $PAGER
|
|
||||||
echo ""
|
|
||||||
else
|
else
|
||||||
echo ""
|
echo ""
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "Beginning Services configuration."
|
echo "Beginning Services configuration."
|
||||||
@@ -207,9 +140,8 @@ echo ""
|
|||||||
###########################################################################
|
###########################################################################
|
||||||
# Load the cache
|
# Load the cache
|
||||||
###########################################################################
|
###########################################################################
|
||||||
|
|
||||||
if [ ! "$IGNORE_CACHE" ] ; then
|
if [ ! "$IGNORE_CACHE" ] ; then
|
||||||
Load_Cache
|
Load_Cache
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Ask the user anything we need to know ahead of time.
|
# Ask the user anything we need to know ahead of time.
|
||||||
@@ -219,12 +151,13 @@ export ok INPUT
|
|||||||
####
|
####
|
||||||
|
|
||||||
ok=0
|
ok=0
|
||||||
echo "In what directory should Anope be installed?"
|
echo "Note: press Return for the default, or enter a new value."
|
||||||
|
echo "In what directory do you want the binaries to be installed?"
|
||||||
while [ $ok -eq 0 ] ; do
|
while [ $ok -eq 0 ] ; do
|
||||||
echo2 "[$INSTDIR] "
|
echo2 "[$BINDEST] "
|
||||||
if read INPUT ; then : ; else echo "" ; exit 1 ; fi
|
if read INPUT ; then : ; else echo "" ; exit 1 ; fi
|
||||||
if [ ! "$INPUT" ] ; then
|
if [ ! "$INPUT" ] ; then
|
||||||
INPUT=$INSTDIR
|
INPUT=$BINDEST
|
||||||
fi
|
fi
|
||||||
if [ ! -d "$INPUT" ] ; then
|
if [ ! -d "$INPUT" ] ; then
|
||||||
if exists "$INPUT" ; then
|
if exists "$INPUT" ; then
|
||||||
@@ -245,174 +178,148 @@ while [ $ok -eq 0 ] ; do
|
|||||||
ok=1
|
ok=1
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
INSTDIR=$INPUT
|
BINDEST=$INPUT
|
||||||
|
DATDEST=$INPUT
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
|
||||||
|
####
|
||||||
|
|
||||||
|
ok=0
|
||||||
|
echo "Where do you want the data files to be installed?"
|
||||||
|
while [ $ok -eq 0 ] ; do
|
||||||
|
echo2 "[$DATDEST] "
|
||||||
|
if read INPUT ; then : ; else echo "" ; exit 1 ; fi
|
||||||
|
if [ ! "$INPUT" ] ; then
|
||||||
|
INPUT=$DATDEST
|
||||||
|
fi
|
||||||
|
if [ ! -d "$INPUT" ] ; then
|
||||||
|
if exists "$INPUT" ; then
|
||||||
|
echo "$INPUT exists, but is not a directory!"
|
||||||
|
else
|
||||||
|
echo "$INPUT does not exist. Create it?"
|
||||||
|
echo2 "[y] "
|
||||||
|
read YN
|
||||||
|
if [ "$YN" != "n" ] ; then
|
||||||
|
if mkdir -p $INPUT ; then
|
||||||
|
ok=1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
elif exists "$INPUT/include/services.h" ; then
|
||||||
|
echo "You cannot use the Services source directory as a target directory."
|
||||||
|
else
|
||||||
|
ok=1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
DATDEST=$INPUT
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
####
|
####
|
||||||
|
|
||||||
|
|
||||||
OLD_RUNGROUP="$RUNGROUP"
|
OLD_RUNGROUP="$RUNGROUP"
|
||||||
if [ "$RUNGROUP" ] ; then
|
if [ "$RUNGROUP" ] ; then
|
||||||
echo "Which group should all Services data files be owned by? (If Services"
|
echo "Which group should all Services data files be owned by? (If Services"
|
||||||
echo "should not force files to be owned by a particular group, type \"none\""
|
echo "should not force files to be owned by a particular group, type "\"none\"
|
||||||
echo "(without the quotes) and press Return.)"
|
echo "(without the quotes) and press Return.)"
|
||||||
else
|
else
|
||||||
echo "Which group should all Services data files be owned by? (If Services"
|
echo "Which group should all Services data files be owned by? (If Services"
|
||||||
echo "should not force files to be owned by a particular group, just press"
|
echo "should not force files to be owned by a particular group, just press"
|
||||||
echo "Return.)"
|
echo "Return.)"
|
||||||
fi
|
fi
|
||||||
echo2 "[$RUNGROUP] "
|
echo2 "[$RUNGROUP] "
|
||||||
if read INPUT ; then : ; else echo "" ; exit 1 ; fi
|
if read INPUT ; then : ; else echo "" ; exit 1 ; fi
|
||||||
if [ "$INPUT" ] ; then
|
if [ "$INPUT" ] ; then
|
||||||
if [ "$INPUT" = "none" ] ; then
|
if [ "$INPUT" = "none" ] ; then
|
||||||
RUNGROUP=""
|
RUNGROUP=""
|
||||||
else
|
else
|
||||||
RUNGROUP="$INPUT"
|
RUNGROUP="$INPUT"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
####
|
####
|
||||||
|
|
||||||
if [ ! "$UMASK" -o "$RUNGROUP" != "$OLD_RUNGROUP" ] ; then
|
if [ ! "$UMASK" -o "$RUNGROUP" != "$OLD_RUNGROUP" ] ; then
|
||||||
if [ "$RUNGROUP" ] ; then
|
if [ "$RUNGROUP" ] ; then
|
||||||
UMASK=007
|
UMASK=007
|
||||||
else
|
else
|
||||||
UMASK=077
|
UMASK=077
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
ok=0
|
ok=0
|
||||||
echo "What should the default umask for data files be (in octal)?"
|
echo "What should the default umask for data files be (in octal)?"
|
||||||
echo "(077 = only accessible by owner; 007 = accessible by owner and group)"
|
echo "(077 = only accessible by owner; 007 = accessible by owner and group)"
|
||||||
while [ $ok -eq 0 ] ; do
|
while [ $ok -eq 0 ] ; do
|
||||||
echo2 "[$UMASK] "
|
echo2 "[$UMASK] "
|
||||||
if read INPUT ; then : ; else echo "" ; exit 1 ; fi
|
if read INPUT ; then : ; else echo "" ; exit 1 ; fi
|
||||||
if [ ! "$INPUT" ] ; then
|
if [ ! "$INPUT" ] ; then
|
||||||
INPUT=$UMASK
|
INPUT=$UMASK
|
||||||
fi
|
fi
|
||||||
if [ `echo "$INPUT" | grep -c '[^0-7]'` -gt 0 ] ; then
|
if [ `echo "$INPUT" | grep -c '[^0-7]'` -gt 0 ] ; then
|
||||||
echo "$UMASK is not a valid octal number!"
|
echo "$UMASK is not a valid octal number!"
|
||||||
else
|
else
|
||||||
if [ "`echo $INPUT | cut -c1`" != "0" ] ; then
|
if [ "`echo $INPUT | cut -c1`" != "0" ] ; then
|
||||||
INPUT=0$INPUT
|
INPUT=0$INPUT
|
||||||
fi
|
fi
|
||||||
ok=1
|
ok=1
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
UMASK=$INPUT
|
UMASK=$INPUT
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
####
|
####
|
||||||
|
|
||||||
TEMP_YN="n"
|
ok=0
|
||||||
if [ "$DEBUG" = "yes" ] ; then
|
DEF=yes
|
||||||
TEMP_YN="y"
|
echo "Allow anope to automatically check for mysql libaries?"
|
||||||
fi
|
echo "unless you get errors with make, there is no need to"
|
||||||
echo "Would you like to build a debug version of Anope?"
|
echo "change this setting."
|
||||||
echo2 "[$TEMP_YN] "
|
while [ $ok -eq 0 ] ; do
|
||||||
read YN
|
echo2 "[$DEF] "
|
||||||
if [ "$YN" ] ; then
|
if read INPUT ; then : ; else echo "" ; exit 1 ; fi
|
||||||
if [ "$YN" = "y" ] ; then
|
if [ ! "$INPUT" ] ; then
|
||||||
DEBUG="yes"
|
INPUT=$DEF
|
||||||
else
|
fi
|
||||||
DEBUG="no"
|
case $INPUT in
|
||||||
fi
|
n*|N*)
|
||||||
fi
|
MYSQL=
|
||||||
|
ok=1
|
||||||
|
;;
|
||||||
|
y*|Y*)
|
||||||
|
MYSQL="yes"
|
||||||
|
ok=1
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Please enter 'yes' or 'no'."
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
####
|
####
|
||||||
|
|
||||||
TEMP_YN="n"
|
|
||||||
if [ "$USE_PCH" = "yes" ] ; then
|
|
||||||
TEMP_YN="y"
|
|
||||||
fi
|
|
||||||
echo "Do you want to build using precompiled headers? This can speed up"
|
|
||||||
echo "the build, but uses more disk space."
|
|
||||||
echo2 "[$TEMP_YN] "
|
|
||||||
read YN
|
|
||||||
if [ "$YN" ] ; then
|
|
||||||
if [ "$YN" = "y" ] ; then
|
|
||||||
USE_PCH="yes"
|
|
||||||
else
|
|
||||||
USE_PCH="no"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
####
|
|
||||||
|
|
||||||
echo "Are there any extra include directories you wish to use?"
|
|
||||||
echo "You may only need to do this if CMake is unable to locate"
|
|
||||||
echo "missing dependencies without hints."
|
|
||||||
echo "Separate directories with semicolons."
|
|
||||||
echo "If you need no extra include directories, enter NONE in all caps."
|
|
||||||
echo2 "[$EXTRA_INCLUDE_DIRS] "
|
|
||||||
if read INPUT ; then : ; else echo "" ; exit 1 ; fi
|
|
||||||
if [ "$INPUT" ] ; then
|
|
||||||
if [ "$INPUT" = "NONE" ] ; then
|
|
||||||
EXTRA_INCLUDE_DIRS=""
|
|
||||||
else
|
|
||||||
EXTRA_INCLUDE_DIRS=$INPUT
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
####
|
|
||||||
|
|
||||||
echo "Are there any extra library directories you wish to use?"
|
|
||||||
echo "You may only need to do this if CMake is unable to locate"
|
|
||||||
echo "missing dependencies without hints."
|
|
||||||
echo "Separate directories with semicolons."
|
|
||||||
echo "If you need no extra library directories, enter NONE in all caps."
|
|
||||||
echo2 "[$EXTRA_LIB_DIRS] "
|
|
||||||
if read INPUT ; then : ; else echo "" ; exit 1 ; fi
|
|
||||||
if [ "$INPUT" ] ; then
|
|
||||||
if [ "$INPUT" = "NONE" ] ; then
|
|
||||||
EXTRA_LIB_DIRS=""
|
|
||||||
else
|
|
||||||
EXTRA_LIB_DIRS=$INPUT
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
####
|
|
||||||
|
|
||||||
echo "Are there any extra arguments you wish to pass to CMake?"
|
|
||||||
echo "If you need no extra arguments to CMake, enter NONE in all caps."
|
|
||||||
echo2 "[$EXTRA_CONFIG_ARGS] "
|
|
||||||
if read INPUT ; then : ; else echo "" ; exit 1 ; fi
|
|
||||||
if [ "$INPUT" ] ; then
|
|
||||||
if [ "$INPUT" = "NONE" ] ; then
|
|
||||||
EXTRA_CONFIG_ARGS=""
|
|
||||||
else
|
|
||||||
EXTRA_CONFIG_ARGS=$INPUT
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
####
|
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
# Store values
|
# Store values
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
echo2 "Saving configuration results in config.cache... "
|
echo2 "Saving configuration results in config.cache... "
|
||||||
|
|
||||||
cat <<EOT >$SOURCE_DIR/config.cache
|
cat <<EOT >config.cache
|
||||||
INSTDIR="$INSTDIR"
|
BINDEST="$BINDEST"
|
||||||
|
DATDEST="$DATDEST"
|
||||||
RUNGROUP="$RUNGROUP"
|
RUNGROUP="$RUNGROUP"
|
||||||
UMASK=$UMASK
|
UMASK=$UMASK
|
||||||
DEBUG="$DEBUG"
|
IRCTYPE="$IRCTYPE"
|
||||||
USE_PCH="$USE_PCH"
|
IRCTYPE_DEF="$IRCTYPE_DEF"
|
||||||
EXTRA_INCLUDE_DIRS="$EXTRA_INCLUDE_DIRS"
|
MYSQL="$MYSQL"
|
||||||
EXTRA_LIB_DIRS="$EXTRA_LIB_DIRS"
|
|
||||||
EXTRA_CONFIG_ARGS="$EXTRA_CONFIG_ARGS"
|
|
||||||
EOT
|
EOT
|
||||||
echo "done."
|
echo "done."
|
||||||
|
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
# Build the build system string
|
# Build the configure string
|
||||||
################################################################################
|
################################################################################
|
||||||
|
Run_Configure
|
||||||
Run_Build_System
|
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
@echo off
|
||||||
|
cscript /nologo install.js
|
||||||
|
|
||||||
BIN
Binary file not shown.
+131
@@ -0,0 +1,131 @@
|
|||||||
|
CC=@CC@
|
||||||
|
INCLUDEDIR=../include
|
||||||
|
ANOPELIBS=@ANOPELIBS@
|
||||||
|
CFLAGS=@CFLAGS@
|
||||||
|
STRICT=-Wall -ansi -pedantic
|
||||||
|
PROFILE=-pg
|
||||||
|
LDPROFILE=
|
||||||
|
SHELL=/bin/sh
|
||||||
|
SUBDIRS=src
|
||||||
|
BINDEST=@BINDEST@
|
||||||
|
DATDEST=@DATDEST@
|
||||||
|
INSTALL=@INSTALL@
|
||||||
|
RM=@RM@
|
||||||
|
CP=@CP@
|
||||||
|
TOUCH=@TOUCH@
|
||||||
|
MODULE_PATH=@MODULE_PATH@
|
||||||
|
MYSQL=@MYSQL@
|
||||||
|
RDB=@RDB@
|
||||||
|
LDFLAGS=@LDFLAGS@
|
||||||
|
RUNGROUP=@RUNGROUP@
|
||||||
|
SHARED=@SHARED@
|
||||||
|
MODULEFLAGS=@MODULEFLAGS@
|
||||||
|
|
||||||
|
all: language headers build core protocols tools modules
|
||||||
|
strict: language headers strict_build strict_core strict_protocols strict_tools strict_modules
|
||||||
|
profile: language headers profile_build profile_core profile_protocols profile_tools profile_modules
|
||||||
|
|
||||||
|
MAKEARGS = 'CFLAGS=${CFLAGS}' 'CC=${CC}' 'ANOPELIBS=${ANOPELIBS}' \
|
||||||
|
'LDFLAGS=${LDFLAGS}' 'BINDEST=${BINDEST}' 'INSTALL=${INSTALL}' \
|
||||||
|
'INCLUDEDIR=${INCLUDEDIR}' 'RM=${RM}' 'CP=${CP}' \
|
||||||
|
'TOUCH=${TOUCH}' 'SHELL=${SHELL}' 'DATDEST=${DATDEST}' \
|
||||||
|
'RUNGROUP=${RUNGROUP}' 'MODULE_PATH=${MODULE_PATH}' 'RDB=${RDB}'\
|
||||||
|
'MYSQL=${MYSQL}' 'SHARED=${SHARED}' 'MODULEFLAGS=${MODULEFLAGS}'
|
||||||
|
|
||||||
|
build: language headers
|
||||||
|
@for i in $(SUBDIRS); do \
|
||||||
|
echo "*** Building $$i";\
|
||||||
|
( cd $$i; ${MAKE} ${MAKEARGS} all; ) \
|
||||||
|
done
|
||||||
|
|
||||||
|
strict_build:
|
||||||
|
@for i in $(SUBDIRS); do \
|
||||||
|
echo "*** Strict Building $$i";\
|
||||||
|
( cd $$i; ${MAKE} ${MAKEARGS} 'CFLAGS=${CFLAGS} $(STRICT)' all; ) \
|
||||||
|
done
|
||||||
|
|
||||||
|
profile_build:
|
||||||
|
@for i in $(SUBDIRS); do \
|
||||||
|
echo "*** Strict Building $$i";\
|
||||||
|
( cd $$i; ${MAKE} ${MAKEARGS} 'CFLAGS=${CFLAGS} $(PROFILE)' 'LDFLAGS=${LDFLAGS} ${PROFILE}' all; ) \
|
||||||
|
done
|
||||||
|
|
||||||
|
modules: build
|
||||||
|
(cd src/modules ; ./configure ; ${MAKE} ${MAKEARGS} all; )
|
||||||
|
@echo "*** All done, now (g)make install to install Anope/Modules";
|
||||||
|
|
||||||
|
clean_modules:
|
||||||
|
(cd src ; ${MAKE} ${MAKEARGS} clean_modules )
|
||||||
|
|
||||||
|
distclean_modules:
|
||||||
|
(cd src ; ${MAKE} ${MAKEARGS} distclean_modules )
|
||||||
|
|
||||||
|
protocols: build
|
||||||
|
@echo "*** Building protocol support";
|
||||||
|
(cd src/protocol ; ./configure ; ${MAKE} ${MAKEARGS} all; )
|
||||||
|
|
||||||
|
strict_protocols: build
|
||||||
|
@echo "*** Building protocol support";
|
||||||
|
(cd src/protocol ; ./configure ; ${MAKE} ${MAKEARGS} 'CFLAGS=${CFLAGS} $(STRICT)' all; )
|
||||||
|
|
||||||
|
profile_protocols: build
|
||||||
|
@echo "*** Building protocol support";
|
||||||
|
(cd src/protocol ; ./configure ; ${MAKE} ${MAKEARGS} 'CFLAGS=${CFLAGS} ${PROFILE}' 'PROFILE=${PROFILE}' all; )
|
||||||
|
|
||||||
|
core: build
|
||||||
|
@echo "*** Building Core modules";
|
||||||
|
(cd src/ ; ${MAKE} ${MAKEARGS} core; )
|
||||||
|
|
||||||
|
strict_core: build
|
||||||
|
@echo "*** Building Core modules";
|
||||||
|
(cd src/ ; ${MAKE} ${MAKEARGS} 'CFLAGS=${CFLAGS} $(STRICT)' core; )
|
||||||
|
|
||||||
|
profile_core: build
|
||||||
|
@echo "*** Building Core modules";
|
||||||
|
(cd src/ ; ${MAKE} ${MAKEARGS} 'CFLAGS=${CFLAGS} ${PROFILE}' 'PROFILE=${PROFILE}' core; )
|
||||||
|
|
||||||
|
tools: build
|
||||||
|
(cd src/tools ; ${MAKE} ${MAKEARGS} all; )
|
||||||
|
@echo "*** All done, now (g)make install to install Anope/Modules/Tools";
|
||||||
|
|
||||||
|
strict_tools: strict_build
|
||||||
|
(cd src/tools ; ${MAKE} ${MAKEARGS} 'CFLAGS=${CFLAGS} $(STRICT)' all; )
|
||||||
|
@echo "*** All done, now (g)make install to install Anope/Modules/Tools";
|
||||||
|
|
||||||
|
profile_tools: profile_build
|
||||||
|
(cd src/tools ; ${MAKE} ${MAKEARGS} 'CFLAGS=${CFLAGS} $(PROFILE)' all; )
|
||||||
|
@echo "*** All done, now (g)make install to install Anope/Modules/Tools";
|
||||||
|
|
||||||
|
strict_modules: strict_build
|
||||||
|
(cd src/modules ; ./configure ; ${MAKE} ${MAKEARGS} 'CFLAGS=$(CFLAGS) $(STRICT)' all; )
|
||||||
|
@echo "*** All done, now (g)make install to install Anope/Modules";
|
||||||
|
|
||||||
|
profile_modules: profile_build
|
||||||
|
(cd src/modules ; ./configure ; ${MAKE} ${MAKEARGS} 'CFLAGS=${CFLAGS} ${PROFILE}' 'PROFILE=${PROFILE}' all; )
|
||||||
|
@echo "*** All done, now (g)make install to install Anope/Modules";
|
||||||
|
|
||||||
|
language:
|
||||||
|
(cd lang ; $(MAKE) ${MAKEARGS} all language.h ; )
|
||||||
|
|
||||||
|
headers:
|
||||||
|
(cd include ; ${MAKE} ${MAKEARGS} )
|
||||||
|
|
||||||
|
clean:
|
||||||
|
(cd lang ; ${MAKE} ${MAKEARGS} clean )
|
||||||
|
(cd include ; ${MAKE} ${MAKEARGS} clean )
|
||||||
|
(cd src ; ${MAKE} ${MAKEARGS} clean )
|
||||||
|
(cd src/tools ; ${MAKE} ${MAKEARGS} clean )
|
||||||
|
|
||||||
|
distclean: clean
|
||||||
|
(cd lang ; ${MAKE} distclean )
|
||||||
|
(cd include ; ${MAKE} distclean )
|
||||||
|
(cd src ; ${MAKE} distclean )
|
||||||
|
(cd src/tools ; ${MAKE} distclean )
|
||||||
|
rm -f config.log config.status config.cache Makefile src/bin/anoperc
|
||||||
|
|
||||||
|
install: DUMMY
|
||||||
|
(cd src ; ${MAKE} ${MAKEARGS} install)
|
||||||
|
(cd src/tools ; ${MAKE} ${MAKEARGS} install)
|
||||||
|
@echo "*** All done, Anope is now installed. Please read docs/INSTALL for details on what to do now.";
|
||||||
|
|
||||||
|
DUMMY:
|
||||||
@@ -0,0 +1,96 @@
|
|||||||
|
# Makefile for Anope.
|
||||||
|
#
|
||||||
|
# (C) 2003-2014 Anope Team
|
||||||
|
# Contact us at team@anope.org
|
||||||
|
#
|
||||||
|
# This program is free but copyrighted software; see the file COPYING for
|
||||||
|
# details.
|
||||||
|
#
|
||||||
|
# Based on the original code of Epona by Lara.
|
||||||
|
# Based on the original code of Services by Andy Church.
|
||||||
|
|
||||||
|
include Makefile.inc.win32
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
all: src core protocols languages tools modules install
|
||||||
|
|
||||||
|
src: include\version.h include\sysconf.h include\language.h include\sysconf.h
|
||||||
|
cd src && $(MAKE) && cd ..
|
||||||
|
|
||||||
|
install:
|
||||||
|
-@mkdir $(DATDEST)\backups
|
||||||
|
-@mkdir $(DATDEST)\logs
|
||||||
|
-@mkdir $(DATDEST)\languages
|
||||||
|
cd lang && $(MAKE) install && cd ..
|
||||||
|
cd src && $(MAKE) install && cd ..
|
||||||
|
cd src\modules && $(MAKE) install && cd ..
|
||||||
|
cd src\modules && $(MAKE) subs-install && cd ..
|
||||||
|
cd src\protocol && $(MAKE) install && cd ..
|
||||||
|
cd src\core && $(MAKE) install && cd ..
|
||||||
|
cd src\tools && $(MAKE) install && cd ..
|
||||||
|
-@echo ---
|
||||||
|
-@echo Anope has been installed successfully!
|
||||||
|
-@echo See docs\INSTALL for details on how to configure Anope for use.
|
||||||
|
-@echo ---
|
||||||
|
|
||||||
|
spotless:
|
||||||
|
cd lang && $(MAKE) spotless && cd ..
|
||||||
|
cd src && $(MAKE) spotless && cd ..
|
||||||
|
cd src\modules && $(MAKE) spotless && cd ..\..
|
||||||
|
cd src\protocol && $(MAKE) spotless && cd ..\..
|
||||||
|
cd src\core && $(MAKE) spotless && cd ..\..
|
||||||
|
cd src\tools && $(MAKE) spotless && cd ..\..
|
||||||
|
-@erase include\language.h include\version.h *.manifest *~ anope.exe version.sh.exe *.obj anopesmtp.exe
|
||||||
|
-@echo --
|
||||||
|
-@echo NOTICE:
|
||||||
|
-@echo You will need to run config.bat again
|
||||||
|
-@echo --
|
||||||
|
|
||||||
|
mypasql:
|
||||||
|
$(MYPASQL_BUILD)
|
||||||
|
|
||||||
|
distclean: spotless
|
||||||
|
|
||||||
|
clean: spotless
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
|
||||||
|
languages: FRC
|
||||||
|
cd lang && $(MAKE) && cd ..
|
||||||
|
|
||||||
|
tools: FRC
|
||||||
|
cd src\tools && $(MAKE) && cd ..\..
|
||||||
|
|
||||||
|
core: FRC
|
||||||
|
cd src\core && $(MAKE) && cd ..\..
|
||||||
|
|
||||||
|
protocols: FRC
|
||||||
|
cd src\protocol && $(MAKE) && cd ..\..
|
||||||
|
|
||||||
|
modules: FRC
|
||||||
|
cd src\modules && $(MAKE) && cd ..\..
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
include\sysconf.h:
|
||||||
|
copy include\sysconf.h.win32 include\sysconf.h
|
||||||
|
|
||||||
|
lang\language.h: lang\Makefile lang\index
|
||||||
|
cd lang && $(MAKE) language.h && cd ..
|
||||||
|
|
||||||
|
lang\index:
|
||||||
|
cd lang && $(MAKE) index && cd ..
|
||||||
|
|
||||||
|
include\language.h: lang\language.h
|
||||||
|
cd lang && copy language.h ..\include\language.h && cd ..
|
||||||
|
|
||||||
|
include\version.h: version.sh.exe version.log include\services.h include\pseudo.h include\messages.h
|
||||||
|
version.sh.exe
|
||||||
|
move version.h include\version.h
|
||||||
|
|
||||||
|
version.sh.exe:
|
||||||
|
$(CC) $(BASE_CFLAGS) include\version.sh.c /link $(LFLAGS)
|
||||||
|
|
||||||
|
FRC:
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
## About
|
|
||||||
|
|
||||||
Anope is an open source set of IRC Services. It is highly modular, with a vast number of configurable parameters, and is the most used IRC services package. There are also many modules on the [modsite](https://modules.anope.org) to add additional features. It runs on Linux, BSD, and Windows, and supports many modern IRCds, including InspIRCd, UnrealIRCd, and ircd-hybrid. For more details, credits, command line options, and contact information see [docs/README](https://github.com/anope/anope/blob/2.0/docs/README).
|
|
||||||
|
|
||||||
* [Website](https://anope.org)
|
|
||||||
* [GitHub](https://github.com/anope)
|
|
||||||
* IRC \#anope on irc.teranova.net
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
### Linux/BSD
|
|
||||||
Download the latest release off of the [releases page](https://github.com/anope/anope/releases).
|
|
||||||
|
|
||||||
|
|
||||||
```
|
|
||||||
$ ./Config
|
|
||||||
$ cd build
|
|
||||||
$ make
|
|
||||||
$ make install
|
|
||||||
```
|
|
||||||
|
|
||||||
Now change to the directory where you installed Anope to, e.g. `$ cd ~/services/`
|
|
||||||
|
|
||||||
### Windows
|
|
||||||
Download the latest release off of the [releases page](https://github.com/anope/anope/releases) and run the installer.
|
|
||||||
|
|
||||||
|
|
||||||
## Configuration
|
|
||||||
|
|
||||||
Copy conf/example.conf to conf/services.conf
|
|
||||||
|
|
||||||
```
|
|
||||||
$ cp conf/example.conf conf/services.conf
|
|
||||||
```
|
|
||||||
|
|
||||||
Edit services.conf, configuring the uplink, serverinfo, and protocol module configurations. Example link blocks for popular IRCds are included in the the example.conf documentation. The [Anope wiki](https://wiki.anope.org) is also a good source of information. Our support channel is located at #anope on [irc.teranova.net](ircs://irc.teranova.net/anope).
|
|
||||||
|
|
||||||
Note that the example configuration file includes other example configuration files. If you want to modify the other example configuration files, copy them (e.g. `modules.example.conf` to `modules.conf`) and modify the `include` directive in `services.conf` to include the new file.
|
|
||||||
|
|
||||||
## Running
|
|
||||||
|
|
||||||
Run `$ ./bin/services` to start Anope. If asked to provide logs for support, use the `--support` flag, e.g.: `$ ./bin/services --support`
|
|
||||||
|
|
||||||
## Installing extra modules
|
|
||||||
|
|
||||||
Extra modules, which are usually modules which require extra libraries to use, such as m\_mysql, can be enabled with the `./extras` command from the source directory. Then re-run `Config`, `make` and `make install` again. Third party modules can be installed by placing them into the `modules/third` directory.
|
|
||||||
Vendored
+863
@@ -0,0 +1,863 @@
|
|||||||
|
dnl aclocal.m4 generated automatically by aclocal 1.4-p6
|
||||||
|
|
||||||
|
dnl Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc.
|
||||||
|
dnl This file is free software; the Free Software Foundation
|
||||||
|
dnl gives unlimited permission to copy and/or distribute it,
|
||||||
|
dnl with or without modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
dnl This program is distributed in the hope that it will be useful,
|
||||||
|
dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
||||||
|
dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||||
|
dnl PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
# lib-prefix.m4 serial 4 (gettext-0.14.2)
|
||||||
|
dnl Copyright (C) 2001-2005 Free Software Foundation, Inc.
|
||||||
|
dnl This file is free software; the Free Software Foundation
|
||||||
|
dnl gives unlimited permission to copy and/or distribute it,
|
||||||
|
dnl with or without modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
dnl From Bruno Haible.
|
||||||
|
|
||||||
|
dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and
|
||||||
|
dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't
|
||||||
|
dnl require excessive bracketing.
|
||||||
|
ifdef([AC_HELP_STRING],
|
||||||
|
[AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])],
|
||||||
|
[AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])])
|
||||||
|
|
||||||
|
dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed
|
||||||
|
dnl to access previously installed libraries. The basic assumption is that
|
||||||
|
dnl a user will want packages to use other packages he previously installed
|
||||||
|
dnl with the same --prefix option.
|
||||||
|
dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate
|
||||||
|
dnl libraries, but is otherwise very convenient.
|
||||||
|
AC_DEFUN([AC_LIB_PREFIX],
|
||||||
|
[
|
||||||
|
AC_BEFORE([$0], [AC_LIB_LINKFLAGS])
|
||||||
|
AC_REQUIRE([AC_PROG_CC])
|
||||||
|
AC_REQUIRE([AC_CANONICAL_HOST])
|
||||||
|
AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
|
||||||
|
dnl By default, look in $includedir and $libdir.
|
||||||
|
use_additional=yes
|
||||||
|
AC_LIB_WITH_FINAL_PREFIX([
|
||||||
|
eval additional_includedir=\"$includedir\"
|
||||||
|
eval additional_libdir=\"$libdir\"
|
||||||
|
])
|
||||||
|
AC_LIB_ARG_WITH([lib-prefix],
|
||||||
|
[ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib
|
||||||
|
--without-lib-prefix don't search for libraries in includedir and libdir],
|
||||||
|
[
|
||||||
|
if test "X$withval" = "Xno"; then
|
||||||
|
use_additional=no
|
||||||
|
else
|
||||||
|
if test "X$withval" = "X"; then
|
||||||
|
AC_LIB_WITH_FINAL_PREFIX([
|
||||||
|
eval additional_includedir=\"$includedir\"
|
||||||
|
eval additional_libdir=\"$libdir\"
|
||||||
|
])
|
||||||
|
else
|
||||||
|
additional_includedir="$withval/include"
|
||||||
|
additional_libdir="$withval/lib"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
if test $use_additional = yes; then
|
||||||
|
dnl Potentially add $additional_includedir to $CPPFLAGS.
|
||||||
|
dnl But don't add it
|
||||||
|
dnl 1. if it's the standard /usr/include,
|
||||||
|
dnl 2. if it's already present in $CPPFLAGS,
|
||||||
|
dnl 3. if it's /usr/local/include and we are using GCC on Linux,
|
||||||
|
dnl 4. if it doesn't exist as a directory.
|
||||||
|
if test "X$additional_includedir" != "X/usr/include"; then
|
||||||
|
haveit=
|
||||||
|
for x in $CPPFLAGS; do
|
||||||
|
AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
|
||||||
|
if test "X$x" = "X-I$additional_includedir"; then
|
||||||
|
haveit=yes
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if test -z "$haveit"; then
|
||||||
|
if test "X$additional_includedir" = "X/usr/local/include"; then
|
||||||
|
if test -n "$GCC"; then
|
||||||
|
case $host_os in
|
||||||
|
linux* | gnu* | k*bsd*-gnu) haveit=yes;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if test -z "$haveit"; then
|
||||||
|
if test -d "$additional_includedir"; then
|
||||||
|
dnl Really add $additional_includedir to $CPPFLAGS.
|
||||||
|
CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
dnl Potentially add $additional_libdir to $LDFLAGS.
|
||||||
|
dnl But don't add it
|
||||||
|
dnl 1. if it's the standard /usr/lib,
|
||||||
|
dnl 2. if it's already present in $LDFLAGS,
|
||||||
|
dnl 3. if it's /usr/local/lib and we are using GCC on Linux,
|
||||||
|
dnl 4. if it doesn't exist as a directory.
|
||||||
|
if test "X$additional_libdir" != "X/usr/lib"; then
|
||||||
|
haveit=
|
||||||
|
for x in $LDFLAGS; do
|
||||||
|
AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
|
||||||
|
if test "X$x" = "X-L$additional_libdir"; then
|
||||||
|
haveit=yes
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if test -z "$haveit"; then
|
||||||
|
if test "X$additional_libdir" = "X/usr/local/lib"; then
|
||||||
|
if test -n "$GCC"; then
|
||||||
|
case $host_os in
|
||||||
|
linux*) haveit=yes;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if test -z "$haveit"; then
|
||||||
|
if test -d "$additional_libdir"; then
|
||||||
|
dnl Really add $additional_libdir to $LDFLAGS.
|
||||||
|
LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix,
|
||||||
|
dnl acl_final_exec_prefix, containing the values to which $prefix and
|
||||||
|
dnl $exec_prefix will expand at the end of the configure script.
|
||||||
|
AC_DEFUN([AC_LIB_PREPARE_PREFIX],
|
||||||
|
[
|
||||||
|
dnl Unfortunately, prefix and exec_prefix get only finally determined
|
||||||
|
dnl at the end of configure.
|
||||||
|
if test "X$prefix" = "XNONE"; then
|
||||||
|
acl_final_prefix="$ac_default_prefix"
|
||||||
|
else
|
||||||
|
acl_final_prefix="$prefix"
|
||||||
|
fi
|
||||||
|
if test "X$exec_prefix" = "XNONE"; then
|
||||||
|
acl_final_exec_prefix='${prefix}'
|
||||||
|
else
|
||||||
|
acl_final_exec_prefix="$exec_prefix"
|
||||||
|
fi
|
||||||
|
acl_save_prefix="$prefix"
|
||||||
|
prefix="$acl_final_prefix"
|
||||||
|
eval acl_final_exec_prefix=\"$acl_final_exec_prefix\"
|
||||||
|
prefix="$acl_save_prefix"
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the
|
||||||
|
dnl variables prefix and exec_prefix bound to the values they will have
|
||||||
|
dnl at the end of the configure script.
|
||||||
|
AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX],
|
||||||
|
[
|
||||||
|
acl_save_prefix="$prefix"
|
||||||
|
prefix="$acl_final_prefix"
|
||||||
|
acl_save_exec_prefix="$exec_prefix"
|
||||||
|
exec_prefix="$acl_final_exec_prefix"
|
||||||
|
$1
|
||||||
|
exec_prefix="$acl_save_exec_prefix"
|
||||||
|
prefix="$acl_save_prefix"
|
||||||
|
])
|
||||||
|
|
||||||
|
# lib-link.m4 serial 6 (gettext-0.14.3)
|
||||||
|
dnl Copyright (C) 2001-2005 Free Software Foundation, Inc.
|
||||||
|
dnl This file is free software; the Free Software Foundation
|
||||||
|
dnl gives unlimited permission to copy and/or distribute it,
|
||||||
|
dnl with or without modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
dnl From Bruno Haible.
|
||||||
|
|
||||||
|
AC_PREREQ(2.50)
|
||||||
|
|
||||||
|
dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and
|
||||||
|
dnl the libraries corresponding to explicit and implicit dependencies.
|
||||||
|
dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and
|
||||||
|
dnl augments the CPPFLAGS variable.
|
||||||
|
AC_DEFUN([AC_LIB_LINKFLAGS],
|
||||||
|
[
|
||||||
|
AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
|
||||||
|
AC_REQUIRE([AC_LIB_RPATH])
|
||||||
|
define([Name],[translit([$1],[./-], [___])])
|
||||||
|
define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
|
||||||
|
[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
|
||||||
|
AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [
|
||||||
|
AC_LIB_LINKFLAGS_BODY([$1], [$2])
|
||||||
|
ac_cv_lib[]Name[]_libs="$LIB[]NAME"
|
||||||
|
ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME"
|
||||||
|
ac_cv_lib[]Name[]_cppflags="$INC[]NAME"
|
||||||
|
])
|
||||||
|
LIB[]NAME="$ac_cv_lib[]Name[]_libs"
|
||||||
|
LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs"
|
||||||
|
INC[]NAME="$ac_cv_lib[]Name[]_cppflags"
|
||||||
|
AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
|
||||||
|
AC_SUBST([LIB]NAME)
|
||||||
|
AC_SUBST([LTLIB]NAME)
|
||||||
|
dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the
|
||||||
|
dnl results of this search when this library appears as a dependency.
|
||||||
|
HAVE_LIB[]NAME=yes
|
||||||
|
undefine([Name])
|
||||||
|
undefine([NAME])
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode)
|
||||||
|
dnl searches for libname and the libraries corresponding to explicit and
|
||||||
|
dnl implicit dependencies, together with the specified include files and
|
||||||
|
dnl the ability to compile and link the specified testcode. If found, it
|
||||||
|
dnl sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} and
|
||||||
|
dnl LTLIB${NAME} variables and augments the CPPFLAGS variable, and
|
||||||
|
dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs
|
||||||
|
dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty.
|
||||||
|
AC_DEFUN([AC_LIB_HAVE_LINKFLAGS],
|
||||||
|
[
|
||||||
|
AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
|
||||||
|
AC_REQUIRE([AC_LIB_RPATH])
|
||||||
|
define([Name],[translit([$1],[./-], [___])])
|
||||||
|
define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
|
||||||
|
[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
|
||||||
|
|
||||||
|
dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME
|
||||||
|
dnl accordingly.
|
||||||
|
AC_LIB_LINKFLAGS_BODY([$1], [$2])
|
||||||
|
|
||||||
|
dnl Add $INC[]NAME to CPPFLAGS before performing the following checks,
|
||||||
|
dnl because if the user has installed lib[]Name and not disabled its use
|
||||||
|
dnl via --without-lib[]Name-prefix, he wants to use it.
|
||||||
|
ac_save_CPPFLAGS="$CPPFLAGS"
|
||||||
|
AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
|
||||||
|
|
||||||
|
AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [
|
||||||
|
ac_save_LIBS="$LIBS"
|
||||||
|
LIBS="$LIBS $LIB[]NAME"
|
||||||
|
AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name=no])
|
||||||
|
LIBS="$ac_save_LIBS"
|
||||||
|
])
|
||||||
|
if test "$ac_cv_lib[]Name" = yes; then
|
||||||
|
HAVE_LIB[]NAME=yes
|
||||||
|
AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the $1 library.])
|
||||||
|
AC_MSG_CHECKING([how to link with lib[]$1])
|
||||||
|
AC_MSG_RESULT([$LIB[]NAME])
|
||||||
|
else
|
||||||
|
HAVE_LIB[]NAME=no
|
||||||
|
dnl If $LIB[]NAME didn't lead to a usable library, we don't need
|
||||||
|
dnl $INC[]NAME either.
|
||||||
|
CPPFLAGS="$ac_save_CPPFLAGS"
|
||||||
|
LIB[]NAME=
|
||||||
|
LTLIB[]NAME=
|
||||||
|
fi
|
||||||
|
AC_SUBST([HAVE_LIB]NAME)
|
||||||
|
AC_SUBST([LIB]NAME)
|
||||||
|
AC_SUBST([LTLIB]NAME)
|
||||||
|
undefine([Name])
|
||||||
|
undefine([NAME])
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl Determine the platform dependent parameters needed to use rpath:
|
||||||
|
dnl libext, shlibext, hardcode_libdir_flag_spec, hardcode_libdir_separator,
|
||||||
|
dnl hardcode_direct, hardcode_minus_L.
|
||||||
|
AC_DEFUN([AC_LIB_RPATH],
|
||||||
|
[
|
||||||
|
dnl Tell automake >= 1.10 to complain if config.rpath is missing.
|
||||||
|
m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([config.rpath])])
|
||||||
|
AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS
|
||||||
|
AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld
|
||||||
|
AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host
|
||||||
|
AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir
|
||||||
|
AC_CACHE_CHECK([for shared library run path origin], acl_cv_rpath, [
|
||||||
|
CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \
|
||||||
|
${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh
|
||||||
|
. ./conftest.sh
|
||||||
|
rm -f ./conftest.sh
|
||||||
|
acl_cv_rpath=done
|
||||||
|
])
|
||||||
|
wl="$acl_cv_wl"
|
||||||
|
libext="$acl_cv_libext"
|
||||||
|
shlibext="$acl_cv_shlibext"
|
||||||
|
hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
|
||||||
|
hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
|
||||||
|
hardcode_direct="$acl_cv_hardcode_direct"
|
||||||
|
hardcode_minus_L="$acl_cv_hardcode_minus_L"
|
||||||
|
dnl Determine whether the user wants rpath handling at all.
|
||||||
|
AC_ARG_ENABLE(rpath,
|
||||||
|
[ --disable-rpath do not hardcode runtime library paths],
|
||||||
|
:, enable_rpath=yes)
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and
|
||||||
|
dnl the libraries corresponding to explicit and implicit dependencies.
|
||||||
|
dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables.
|
||||||
|
AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
|
||||||
|
[
|
||||||
|
define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
|
||||||
|
[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
|
||||||
|
dnl By default, look in $includedir and $libdir.
|
||||||
|
use_additional=yes
|
||||||
|
AC_LIB_WITH_FINAL_PREFIX([
|
||||||
|
eval additional_includedir=\"$includedir\"
|
||||||
|
eval additional_libdir=\"$libdir\"
|
||||||
|
])
|
||||||
|
AC_LIB_ARG_WITH([lib$1-prefix],
|
||||||
|
[ --with-lib$1-prefix[=DIR] search for lib$1 in DIR/include and DIR/lib
|
||||||
|
--without-lib$1-prefix don't search for lib$1 in includedir and libdir],
|
||||||
|
[
|
||||||
|
if test "X$withval" = "Xno"; then
|
||||||
|
use_additional=no
|
||||||
|
else
|
||||||
|
if test "X$withval" = "X"; then
|
||||||
|
AC_LIB_WITH_FINAL_PREFIX([
|
||||||
|
eval additional_includedir=\"$includedir\"
|
||||||
|
eval additional_libdir=\"$libdir\"
|
||||||
|
])
|
||||||
|
else
|
||||||
|
additional_includedir="$withval/include"
|
||||||
|
additional_libdir="$withval/lib"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
dnl Search the library and its dependencies in $additional_libdir and
|
||||||
|
dnl $LDFLAGS. Using breadth-first-seach.
|
||||||
|
LIB[]NAME=
|
||||||
|
LTLIB[]NAME=
|
||||||
|
INC[]NAME=
|
||||||
|
rpathdirs=
|
||||||
|
ltrpathdirs=
|
||||||
|
names_already_handled=
|
||||||
|
names_next_round='$1 $2'
|
||||||
|
while test -n "$names_next_round"; do
|
||||||
|
names_this_round="$names_next_round"
|
||||||
|
names_next_round=
|
||||||
|
for name in $names_this_round; do
|
||||||
|
already_handled=
|
||||||
|
for n in $names_already_handled; do
|
||||||
|
if test "$n" = "$name"; then
|
||||||
|
already_handled=yes
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if test -z "$already_handled"; then
|
||||||
|
names_already_handled="$names_already_handled $name"
|
||||||
|
dnl See if it was already located by an earlier AC_LIB_LINKFLAGS
|
||||||
|
dnl or AC_LIB_HAVE_LINKFLAGS call.
|
||||||
|
uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'`
|
||||||
|
eval value=\"\$HAVE_LIB$uppername\"
|
||||||
|
if test -n "$value"; then
|
||||||
|
if test "$value" = yes; then
|
||||||
|
eval value=\"\$LIB$uppername\"
|
||||||
|
test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value"
|
||||||
|
eval value=\"\$LTLIB$uppername\"
|
||||||
|
test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value"
|
||||||
|
else
|
||||||
|
dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined
|
||||||
|
dnl that this library doesn't exist. So just drop it.
|
||||||
|
:
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
dnl Search the library lib$name in $additional_libdir and $LDFLAGS
|
||||||
|
dnl and the already constructed $LIBNAME/$LTLIBNAME.
|
||||||
|
found_dir=
|
||||||
|
found_la=
|
||||||
|
found_so=
|
||||||
|
found_a=
|
||||||
|
if test $use_additional = yes; then
|
||||||
|
if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then
|
||||||
|
found_dir="$additional_libdir"
|
||||||
|
found_so="$additional_libdir/lib$name.$shlibext"
|
||||||
|
if test -f "$additional_libdir/lib$name.la"; then
|
||||||
|
found_la="$additional_libdir/lib$name.la"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
if test -f "$additional_libdir/lib$name.$libext"; then
|
||||||
|
found_dir="$additional_libdir"
|
||||||
|
found_a="$additional_libdir/lib$name.$libext"
|
||||||
|
if test -f "$additional_libdir/lib$name.la"; then
|
||||||
|
found_la="$additional_libdir/lib$name.la"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if test "X$found_dir" = "X"; then
|
||||||
|
for x in $LDFLAGS $LTLIB[]NAME; do
|
||||||
|
AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
|
||||||
|
case "$x" in
|
||||||
|
-L*)
|
||||||
|
dir=`echo "X$x" | sed -e 's/^X-L//'`
|
||||||
|
if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then
|
||||||
|
found_dir="$dir"
|
||||||
|
found_so="$dir/lib$name.$shlibext"
|
||||||
|
if test -f "$dir/lib$name.la"; then
|
||||||
|
found_la="$dir/lib$name.la"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
if test -f "$dir/lib$name.$libext"; then
|
||||||
|
found_dir="$dir"
|
||||||
|
found_a="$dir/lib$name.$libext"
|
||||||
|
if test -f "$dir/lib$name.la"; then
|
||||||
|
found_la="$dir/lib$name.la"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
if test "X$found_dir" != "X"; then
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
if test "X$found_dir" != "X"; then
|
||||||
|
dnl Found the library.
|
||||||
|
LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name"
|
||||||
|
if test "X$found_so" != "X"; then
|
||||||
|
dnl Linking with a shared library. We attempt to hardcode its
|
||||||
|
dnl directory into the executable's runpath, unless it's the
|
||||||
|
dnl standard /usr/lib.
|
||||||
|
if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then
|
||||||
|
dnl No hardcoding is needed.
|
||||||
|
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
|
||||||
|
else
|
||||||
|
dnl Use an explicit option to hardcode DIR into the resulting
|
||||||
|
dnl binary.
|
||||||
|
dnl Potentially add DIR to ltrpathdirs.
|
||||||
|
dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
|
||||||
|
haveit=
|
||||||
|
for x in $ltrpathdirs; do
|
||||||
|
if test "X$x" = "X$found_dir"; then
|
||||||
|
haveit=yes
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if test -z "$haveit"; then
|
||||||
|
ltrpathdirs="$ltrpathdirs $found_dir"
|
||||||
|
fi
|
||||||
|
dnl The hardcoding into $LIBNAME is system dependent.
|
||||||
|
if test "$hardcode_direct" = yes; then
|
||||||
|
dnl Using DIR/libNAME.so during linking hardcodes DIR into the
|
||||||
|
dnl resulting binary.
|
||||||
|
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
|
||||||
|
else
|
||||||
|
if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then
|
||||||
|
dnl Use an explicit option to hardcode DIR into the resulting
|
||||||
|
dnl binary.
|
||||||
|
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
|
||||||
|
dnl Potentially add DIR to rpathdirs.
|
||||||
|
dnl The rpathdirs will be appended to $LIBNAME at the end.
|
||||||
|
haveit=
|
||||||
|
for x in $rpathdirs; do
|
||||||
|
if test "X$x" = "X$found_dir"; then
|
||||||
|
haveit=yes
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if test -z "$haveit"; then
|
||||||
|
rpathdirs="$rpathdirs $found_dir"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
dnl Rely on "-L$found_dir".
|
||||||
|
dnl But don't add it if it's already contained in the LDFLAGS
|
||||||
|
dnl or the already constructed $LIBNAME
|
||||||
|
haveit=
|
||||||
|
for x in $LDFLAGS $LIB[]NAME; do
|
||||||
|
AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
|
||||||
|
if test "X$x" = "X-L$found_dir"; then
|
||||||
|
haveit=yes
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if test -z "$haveit"; then
|
||||||
|
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir"
|
||||||
|
fi
|
||||||
|
if test "$hardcode_minus_L" != no; then
|
||||||
|
dnl FIXME: Not sure whether we should use
|
||||||
|
dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
|
||||||
|
dnl here.
|
||||||
|
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
|
||||||
|
else
|
||||||
|
dnl We cannot use $hardcode_runpath_var and LD_RUN_PATH
|
||||||
|
dnl here, because this doesn't fit in flags passed to the
|
||||||
|
dnl compiler. So give up. No hardcoding. This affects only
|
||||||
|
dnl very old systems.
|
||||||
|
dnl FIXME: Not sure whether we should use
|
||||||
|
dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
|
||||||
|
dnl here.
|
||||||
|
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
if test "X$found_a" != "X"; then
|
||||||
|
dnl Linking with a static library.
|
||||||
|
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a"
|
||||||
|
else
|
||||||
|
dnl We shouldn't come here, but anyway it's good to have a
|
||||||
|
dnl fallback.
|
||||||
|
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
dnl Assume the include files are nearby.
|
||||||
|
additional_includedir=
|
||||||
|
case "$found_dir" in
|
||||||
|
*/lib | */lib/)
|
||||||
|
basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'`
|
||||||
|
additional_includedir="$basedir/include"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
if test "X$additional_includedir" != "X"; then
|
||||||
|
dnl Potentially add $additional_includedir to $INCNAME.
|
||||||
|
dnl But don't add it
|
||||||
|
dnl 1. if it's the standard /usr/include,
|
||||||
|
dnl 2. if it's /usr/local/include and we are using GCC on Linux,
|
||||||
|
dnl 3. if it's already present in $CPPFLAGS or the already
|
||||||
|
dnl constructed $INCNAME,
|
||||||
|
dnl 4. if it doesn't exist as a directory.
|
||||||
|
if test "X$additional_includedir" != "X/usr/include"; then
|
||||||
|
haveit=
|
||||||
|
if test "X$additional_includedir" = "X/usr/local/include"; then
|
||||||
|
if test -n "$GCC"; then
|
||||||
|
case $host_os in
|
||||||
|
linux* | gnu* | k*bsd*-gnu) haveit=yes;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if test -z "$haveit"; then
|
||||||
|
for x in $CPPFLAGS $INC[]NAME; do
|
||||||
|
AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
|
||||||
|
if test "X$x" = "X-I$additional_includedir"; then
|
||||||
|
haveit=yes
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if test -z "$haveit"; then
|
||||||
|
if test -d "$additional_includedir"; then
|
||||||
|
dnl Really add $additional_includedir to $INCNAME.
|
||||||
|
INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
dnl Look for dependencies.
|
||||||
|
if test -n "$found_la"; then
|
||||||
|
dnl Read the .la file. It defines the variables
|
||||||
|
dnl dlname, library_names, old_library, dependency_libs, current,
|
||||||
|
dnl age, revision, installed, dlopen, dlpreopen, libdir.
|
||||||
|
save_libdir="$libdir"
|
||||||
|
case "$found_la" in
|
||||||
|
*/* | *\\*) . "$found_la" ;;
|
||||||
|
*) . "./$found_la" ;;
|
||||||
|
esac
|
||||||
|
libdir="$save_libdir"
|
||||||
|
dnl We use only dependency_libs.
|
||||||
|
for dep in $dependency_libs; do
|
||||||
|
case "$dep" in
|
||||||
|
-L*)
|
||||||
|
additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
|
||||||
|
dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME.
|
||||||
|
dnl But don't add it
|
||||||
|
dnl 1. if it's the standard /usr/lib,
|
||||||
|
dnl 2. if it's /usr/local/lib and we are using GCC on Linux,
|
||||||
|
dnl 3. if it's already present in $LDFLAGS or the already
|
||||||
|
dnl constructed $LIBNAME,
|
||||||
|
dnl 4. if it doesn't exist as a directory.
|
||||||
|
if test "X$additional_libdir" != "X/usr/lib"; then
|
||||||
|
haveit=
|
||||||
|
if test "X$additional_libdir" = "X/usr/local/lib"; then
|
||||||
|
if test -n "$GCC"; then
|
||||||
|
case $host_os in
|
||||||
|
linux* | gnu* | k*bsd*-gnu) haveit=yes;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if test -z "$haveit"; then
|
||||||
|
haveit=
|
||||||
|
for x in $LDFLAGS $LIB[]NAME; do
|
||||||
|
AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
|
||||||
|
if test "X$x" = "X-L$additional_libdir"; then
|
||||||
|
haveit=yes
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if test -z "$haveit"; then
|
||||||
|
if test -d "$additional_libdir"; then
|
||||||
|
dnl Really add $additional_libdir to $LIBNAME.
|
||||||
|
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
haveit=
|
||||||
|
for x in $LDFLAGS $LTLIB[]NAME; do
|
||||||
|
AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
|
||||||
|
if test "X$x" = "X-L$additional_libdir"; then
|
||||||
|
haveit=yes
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if test -z "$haveit"; then
|
||||||
|
if test -d "$additional_libdir"; then
|
||||||
|
dnl Really add $additional_libdir to $LTLIBNAME.
|
||||||
|
LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
-R*)
|
||||||
|
dir=`echo "X$dep" | sed -e 's/^X-R//'`
|
||||||
|
if test "$enable_rpath" != no; then
|
||||||
|
dnl Potentially add DIR to rpathdirs.
|
||||||
|
dnl The rpathdirs will be appended to $LIBNAME at the end.
|
||||||
|
haveit=
|
||||||
|
for x in $rpathdirs; do
|
||||||
|
if test "X$x" = "X$dir"; then
|
||||||
|
haveit=yes
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if test -z "$haveit"; then
|
||||||
|
rpathdirs="$rpathdirs $dir"
|
||||||
|
fi
|
||||||
|
dnl Potentially add DIR to ltrpathdirs.
|
||||||
|
dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
|
||||||
|
haveit=
|
||||||
|
for x in $ltrpathdirs; do
|
||||||
|
if test "X$x" = "X$dir"; then
|
||||||
|
haveit=yes
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if test -z "$haveit"; then
|
||||||
|
ltrpathdirs="$ltrpathdirs $dir"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
-l*)
|
||||||
|
dnl Handle this in the next round.
|
||||||
|
names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
|
||||||
|
;;
|
||||||
|
*.la)
|
||||||
|
dnl Handle this in the next round. Throw away the .la's
|
||||||
|
dnl directory; it is already contained in a preceding -L
|
||||||
|
dnl option.
|
||||||
|
names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
dnl Most likely an immediate library name.
|
||||||
|
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep"
|
||||||
|
LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
dnl Didn't find the library; assume it is in the system directories
|
||||||
|
dnl known to the linker and runtime loader. (All the system
|
||||||
|
dnl directories known to the linker should also be known to the
|
||||||
|
dnl runtime loader, otherwise the system is severely misconfigured.)
|
||||||
|
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
|
||||||
|
LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
done
|
||||||
|
if test "X$rpathdirs" != "X"; then
|
||||||
|
if test -n "$hardcode_libdir_separator"; then
|
||||||
|
dnl Weird platform: only the last -rpath option counts, the user must
|
||||||
|
dnl pass all path elements in one option. We can arrange that for a
|
||||||
|
dnl single library, but not when more than one $LIBNAMEs are used.
|
||||||
|
alldirs=
|
||||||
|
for found_dir in $rpathdirs; do
|
||||||
|
alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir"
|
||||||
|
done
|
||||||
|
dnl Note: hardcode_libdir_flag_spec uses $libdir and $wl.
|
||||||
|
acl_save_libdir="$libdir"
|
||||||
|
libdir="$alldirs"
|
||||||
|
eval flag=\"$hardcode_libdir_flag_spec\"
|
||||||
|
libdir="$acl_save_libdir"
|
||||||
|
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
|
||||||
|
else
|
||||||
|
dnl The -rpath options are cumulative.
|
||||||
|
for found_dir in $rpathdirs; do
|
||||||
|
acl_save_libdir="$libdir"
|
||||||
|
libdir="$found_dir"
|
||||||
|
eval flag=\"$hardcode_libdir_flag_spec\"
|
||||||
|
libdir="$acl_save_libdir"
|
||||||
|
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if test "X$ltrpathdirs" != "X"; then
|
||||||
|
dnl When using libtool, the option that works for both libraries and
|
||||||
|
dnl executables is -R. The -R options are cumulative.
|
||||||
|
for found_dir in $ltrpathdirs; do
|
||||||
|
LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR,
|
||||||
|
dnl unless already present in VAR.
|
||||||
|
dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes
|
||||||
|
dnl contains two or three consecutive elements that belong together.
|
||||||
|
AC_DEFUN([AC_LIB_APPENDTOVAR],
|
||||||
|
[
|
||||||
|
for element in [$2]; do
|
||||||
|
haveit=
|
||||||
|
for x in $[$1]; do
|
||||||
|
AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
|
||||||
|
if test "X$x" = "X$element"; then
|
||||||
|
haveit=yes
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if test -z "$haveit"; then
|
||||||
|
[$1]="${[$1]}${[$1]:+ }$element"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
])
|
||||||
|
|
||||||
|
# lib-ld.m4 serial 3 (gettext-0.13)
|
||||||
|
dnl Copyright (C) 1996-2003 Free Software Foundation, Inc.
|
||||||
|
dnl This file is free software; the Free Software Foundation
|
||||||
|
dnl gives unlimited permission to copy and/or distribute it,
|
||||||
|
dnl with or without modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
dnl Subroutines of libtool.m4,
|
||||||
|
dnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision
|
||||||
|
dnl with libtool.m4.
|
||||||
|
|
||||||
|
dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no.
|
||||||
|
AC_DEFUN([AC_LIB_PROG_LD_GNU],
|
||||||
|
[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], acl_cv_prog_gnu_ld,
|
||||||
|
[# I'd rather use --version here, but apparently some GNU ld's only accept -v.
|
||||||
|
case `$LD -v 2>&1 </dev/null` in
|
||||||
|
*GNU* | *'with BFD'*)
|
||||||
|
acl_cv_prog_gnu_ld=yes ;;
|
||||||
|
*)
|
||||||
|
acl_cv_prog_gnu_ld=no ;;
|
||||||
|
esac])
|
||||||
|
with_gnu_ld=$acl_cv_prog_gnu_ld
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl From libtool-1.4. Sets the variable LD.
|
||||||
|
AC_DEFUN([AC_LIB_PROG_LD],
|
||||||
|
[AC_ARG_WITH(gnu-ld,
|
||||||
|
[ --with-gnu-ld assume the C compiler uses GNU ld [default=no]],
|
||||||
|
test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no)
|
||||||
|
AC_REQUIRE([AC_PROG_CC])dnl
|
||||||
|
AC_REQUIRE([AC_CANONICAL_HOST])dnl
|
||||||
|
# Prepare PATH_SEPARATOR.
|
||||||
|
# The user is always right.
|
||||||
|
if test "${PATH_SEPARATOR+set}" != set; then
|
||||||
|
echo "#! /bin/sh" >conf$$.sh
|
||||||
|
echo "exit 0" >>conf$$.sh
|
||||||
|
chmod +x conf$$.sh
|
||||||
|
if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
|
||||||
|
PATH_SEPARATOR=';'
|
||||||
|
else
|
||||||
|
PATH_SEPARATOR=:
|
||||||
|
fi
|
||||||
|
rm -f conf$$.sh
|
||||||
|
fi
|
||||||
|
ac_prog=ld
|
||||||
|
if test "$GCC" = yes; then
|
||||||
|
# Check if gcc -print-prog-name=ld gives a path.
|
||||||
|
AC_MSG_CHECKING([for ld used by GCC])
|
||||||
|
case $host in
|
||||||
|
*-*-mingw*)
|
||||||
|
# gcc leaves a trailing carriage return which upsets mingw
|
||||||
|
ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
|
||||||
|
*)
|
||||||
|
ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
|
||||||
|
esac
|
||||||
|
case $ac_prog in
|
||||||
|
# Accept absolute paths.
|
||||||
|
[[\\/]* | [A-Za-z]:[\\/]*)]
|
||||||
|
[re_direlt='/[^/][^/]*/\.\./']
|
||||||
|
# Canonicalize the path of ld
|
||||||
|
ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'`
|
||||||
|
while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
|
||||||
|
ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
|
||||||
|
done
|
||||||
|
test -z "$LD" && LD="$ac_prog"
|
||||||
|
;;
|
||||||
|
"")
|
||||||
|
# If it fails, then pretend we aren't using GCC.
|
||||||
|
ac_prog=ld
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
# If it is relative, then search for the first ld in PATH.
|
||||||
|
with_gnu_ld=unknown
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
elif test "$with_gnu_ld" = yes; then
|
||||||
|
AC_MSG_CHECKING([for GNU ld])
|
||||||
|
else
|
||||||
|
AC_MSG_CHECKING([for non-GNU ld])
|
||||||
|
fi
|
||||||
|
AC_CACHE_VAL(acl_cv_path_LD,
|
||||||
|
[if test -z "$LD"; then
|
||||||
|
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
|
||||||
|
for ac_dir in $PATH; do
|
||||||
|
test -z "$ac_dir" && ac_dir=.
|
||||||
|
if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
|
||||||
|
acl_cv_path_LD="$ac_dir/$ac_prog"
|
||||||
|
# Check to see if the program is GNU ld. I'd rather use --version,
|
||||||
|
# but apparently some GNU ld's only accept -v.
|
||||||
|
# Break only if it was the GNU/non-GNU ld that we prefer.
|
||||||
|
case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in
|
||||||
|
*GNU* | *'with BFD'*)
|
||||||
|
test "$with_gnu_ld" != no && break ;;
|
||||||
|
*)
|
||||||
|
test "$with_gnu_ld" != yes && break ;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
IFS="$ac_save_ifs"
|
||||||
|
else
|
||||||
|
acl_cv_path_LD="$LD" # Let the user override the test with a path.
|
||||||
|
fi])
|
||||||
|
LD="$acl_cv_path_LD"
|
||||||
|
if test -n "$LD"; then
|
||||||
|
AC_MSG_RESULT($LD)
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
fi
|
||||||
|
test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
|
||||||
|
AC_LIB_PROG_LD_GNU
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl Macro: anope_CHECK_TYPE_SIZES
|
||||||
|
dnl
|
||||||
|
dnl Check the size of several types and define a valid int16_t and int32_t.
|
||||||
|
dnl
|
||||||
|
AC_DEFUN(anope_CHECK_TYPE_SIZES,
|
||||||
|
[dnl Check type sizes
|
||||||
|
AC_CHECK_SIZEOF(short)
|
||||||
|
AC_CHECK_SIZEOF(int)
|
||||||
|
AC_CHECK_SIZEOF(long)
|
||||||
|
if test "$ac_cv_sizeof_int" = 2 ; then
|
||||||
|
AC_CHECK_TYPE(int16_t, int)
|
||||||
|
AC_CHECK_TYPE(u_int16_t, unsigned int)
|
||||||
|
elif test "$ac_cv_sizeof_short" = 2 ; then
|
||||||
|
AC_CHECK_TYPE(int16_t, short)
|
||||||
|
AC_CHECK_TYPE(u_int16_t, unsigned short)
|
||||||
|
else
|
||||||
|
AC_MSG_ERROR([Cannot find a type with size of 16 bits])
|
||||||
|
fi
|
||||||
|
if test "$ac_cv_sizeof_int" = 4 ; then
|
||||||
|
AC_CHECK_TYPE(int32_t, int)
|
||||||
|
AC_CHECK_TYPE(u_int32_t, unsigned int)
|
||||||
|
elif test "$ac_cv_sizeof_short" = 4 ; then
|
||||||
|
AC_CHECK_TYPE(int32_t, short)
|
||||||
|
AC_CHECK_TYPE(u_int32_t, unsigned short)
|
||||||
|
elif test "$ac_cv_sizeof_long" = 4 ; then
|
||||||
|
AC_CHECK_TYPE(int32_t, long)
|
||||||
|
AC_CHECK_TYPE(u_int32_t, unsigned long)
|
||||||
|
else
|
||||||
|
AC_MSG_ERROR([Cannot find a type with size of 32 bits])
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
dnl Macro: anope_CHECK_TYPE_SIZES
|
||||||
|
dnl
|
||||||
|
dnl Check the size of several types and define a valid int16_t and int32_t.
|
||||||
|
dnl
|
||||||
|
AC_DEFUN(anope_CHECK_TYPE_SIZES,
|
||||||
|
[dnl Check type sizes
|
||||||
|
AC_CHECK_SIZEOF(short)
|
||||||
|
AC_CHECK_SIZEOF(int)
|
||||||
|
AC_CHECK_SIZEOF(long)
|
||||||
|
if test "$ac_cv_sizeof_int" = 2 ; then
|
||||||
|
AC_CHECK_TYPE(int16_t, int)
|
||||||
|
AC_CHECK_TYPE(u_int16_t, unsigned int)
|
||||||
|
elif test "$ac_cv_sizeof_short" = 2 ; then
|
||||||
|
AC_CHECK_TYPE(int16_t, short)
|
||||||
|
AC_CHECK_TYPE(u_int16_t, unsigned short)
|
||||||
|
else
|
||||||
|
AC_MSG_ERROR([Cannot find a type with size of 16 bits])
|
||||||
|
fi
|
||||||
|
if test "$ac_cv_sizeof_int" = 4 ; then
|
||||||
|
AC_CHECK_TYPE(int32_t, int)
|
||||||
|
AC_CHECK_TYPE(u_int32_t, unsigned int)
|
||||||
|
elif test "$ac_cv_sizeof_short" = 4 ; then
|
||||||
|
AC_CHECK_TYPE(int32_t, short)
|
||||||
|
AC_CHECK_TYPE(u_int32_t, unsigned short)
|
||||||
|
elif test "$ac_cv_sizeof_long" = 4 ; then
|
||||||
|
AC_CHECK_TYPE(int32_t, long)
|
||||||
|
AC_CHECK_TYPE(u_int32_t, unsigned long)
|
||||||
|
else
|
||||||
|
AC_MSG_ERROR([Cannot find a type with size of 32 bits])
|
||||||
|
fi
|
||||||
|
])
|
||||||
@@ -1,555 +0,0 @@
|
|||||||
###############################################################################
|
|
||||||
# strip_string(<input string> <output string>)
|
|
||||||
#
|
|
||||||
# A macro to handle stripping the leading and trailing spaces from a string,
|
|
||||||
# uses string(STRIP) if using CMake 2.6.x or better, otherwise uses
|
|
||||||
# string(REGEX REPLACE).
|
|
||||||
###############################################################################
|
|
||||||
macro(strip_string INPUT_STRING OUTPUT_STRING)
|
|
||||||
if(CMAKE26_OR_BETTER)
|
|
||||||
# For CMake 2.6.x or better, we can just use the STRIP sub-command of string()
|
|
||||||
string(STRIP ${INPUT_STRING} ${OUTPUT_STRING})
|
|
||||||
else(CMAKE26_OR_BETTER)
|
|
||||||
# For CMake 2.4.x, we will have to use the REGEX REPLACE sub-command of string() instead
|
|
||||||
# First check if the input string is empty or not
|
|
||||||
if (${INPUT_STRING} STREQUAL "")
|
|
||||||
set(${OUTPUT_STRING} "")
|
|
||||||
else(${INPUT_STRING} STREQUAL "")
|
|
||||||
# Determine if the string is entirely empty or not
|
|
||||||
string(REGEX MATCH "^[ \t]*$" EMPTY_STRING "${INPUT_STRING}")
|
|
||||||
if(EMPTY_STRING)
|
|
||||||
set(${OUTPUT_STRING} "")
|
|
||||||
else(EMPTY_STRING)
|
|
||||||
# We detect if there is any leading whitespace and remove any if there is
|
|
||||||
string(SUBSTRING "${INPUT_STRING}" 0 1 FIRST_CHAR)
|
|
||||||
if(FIRST_CHAR STREQUAL " " OR FIRST_CHAR STREQUAL "\t")
|
|
||||||
string(REGEX REPLACE "^[ \t]+" "" TEMP_STRING "${INPUT_STRING}")
|
|
||||||
else(FIRST_CHAR STREQUAL " " OR FIRST_CHAR STREQUAL "\t")
|
|
||||||
set(TEMP_STRING "${INPUT_STRING}")
|
|
||||||
endif(FIRST_CHAR STREQUAL " " OR FIRST_CHAR STREQUAL "\t")
|
|
||||||
# Next we detect if there is any trailing whitespace and remove any if there is
|
|
||||||
string(LENGTH "${TEMP_STRING}" STRING_LEN)
|
|
||||||
math(EXPR STRING_LEN "${STRING_LEN} - 1")
|
|
||||||
string(SUBSTRING "${TEMP_STRING}" ${STRING_LEN} 1 LAST_CHAR)
|
|
||||||
if(LAST_CHAR STREQUAL " " OR LAST_CHAR STREQUAL "\t")
|
|
||||||
string(REGEX REPLACE "[ \t]+$" "" ${OUTPUT_STRING} "${TEMP_STRING}")
|
|
||||||
else(LAST_CHAR STREQUAL " " OR LAST_CHAR STREQUAL "\t")
|
|
||||||
set(${OUTPUT_STRING} "${TEMP_STRING}")
|
|
||||||
endif(LAST_CHAR STREQUAL " " OR LAST_CHAR STREQUAL "\t")
|
|
||||||
endif(EMPTY_STRING)
|
|
||||||
endif(${INPUT_STRING} STREQUAL "")
|
|
||||||
endif(CMAKE26_OR_BETTER)
|
|
||||||
endmacro(strip_string)
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
# append_to_list(<list> <args>...)
|
|
||||||
#
|
|
||||||
# A macro to handle appending to lists, uses list(APPEND) if using CMake 2.4.2
|
|
||||||
# or better, otherwise uses set() instead.
|
|
||||||
###############################################################################
|
|
||||||
macro(append_to_list LIST)
|
|
||||||
if(CMAKE242_OR_BETTER)
|
|
||||||
# For CMake 2.4.2 or better, we can just use the APPEND sub-command of list()
|
|
||||||
list(APPEND ${LIST} ${ARGN})
|
|
||||||
else(CMAKE242_OR_BETTER)
|
|
||||||
# For CMake 2.4.x before 2.4.2, we have to do this manually use set() instead
|
|
||||||
set(${LIST} ${${LIST}} ${ARGN})
|
|
||||||
endif(CMAKE242_OR_BETTER)
|
|
||||||
endmacro(append_to_list)
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
# find_in_list(<list> <value> <output variable>)
|
|
||||||
#
|
|
||||||
# A macro to handle searching within a list, will store the result in the
|
|
||||||
# given <output variable>, uses list(FIND) if using CMake 2.6.x or better
|
|
||||||
# (or CMake 2.4.8 or better), otherwise it iterates through the list to find
|
|
||||||
# the item.
|
|
||||||
###############################################################################
|
|
||||||
macro(find_in_list LIST ITEM_TO_FIND FOUND)
|
|
||||||
if(CMAKE248_OR_BETTER)
|
|
||||||
# For CMake 2.4.8 or better, we can use the FIND sub-command of list()
|
|
||||||
list(FIND ${LIST} ${ITEM_TO_FIND} ITEM_FOUND)
|
|
||||||
else(CMAKE248_OR_BETTER)
|
|
||||||
# For CMake 2.4.x before 2.4.8, we have to do this ourselves (NOTE: This is very slow due to a lack of break() as well)
|
|
||||||
# Firstly we set the position to -1 indicating nothing found, we also use a temporary position
|
|
||||||
set(ITEM_FOUND -1)
|
|
||||||
set(POS 0)
|
|
||||||
# Iterate through the list
|
|
||||||
foreach(ITEM ${${LIST}})
|
|
||||||
# If the item we are looking at is the item we are trying to find, set that we've found the item
|
|
||||||
if(${ITEM} STREQUAL ${ITEM_TO_FIND})
|
|
||||||
set(ITEM_FOUND ${POS})
|
|
||||||
endif(${ITEM} STREQUAL ${ITEM_TO_FIND})
|
|
||||||
# Increase the position value by 1
|
|
||||||
math(EXPR POS "${POS} + 1")
|
|
||||||
endforeach(ITEM)
|
|
||||||
endif(CMAKE248_OR_BETTER)
|
|
||||||
# Set the given FOUND variable to the result
|
|
||||||
set(${FOUND} ${ITEM_FOUND})
|
|
||||||
endmacro(find_in_list)
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
# remove_list_duplicates(<list>)
|
|
||||||
#
|
|
||||||
# A macro to handle removing duplicates from a list, uses
|
|
||||||
# list(REMOVE_DUPLICATES) if using CMake 2.6.x or better, otherwise it uses
|
|
||||||
# a slower method of creating a temporary list and only adding to it when
|
|
||||||
# a duplicate item hasn't been found.
|
|
||||||
###############################################################################
|
|
||||||
macro(remove_list_duplicates LIST)
|
|
||||||
if(CMAKE26_OR_BETTER)
|
|
||||||
# For CMake 2.6.x or better, this can be done automatically
|
|
||||||
list(REMOVE_DUPLICATES ${LIST})
|
|
||||||
else(CMAKE26_OR_BETTER)
|
|
||||||
# For CMake 2.4.x, we have to do this ourselves, firstly we'll clear a temporary list
|
|
||||||
set(NEW_LIST)
|
|
||||||
# Iterate through the old list
|
|
||||||
foreach(ITEM ${${LIST}})
|
|
||||||
# Check if the item is in the new list
|
|
||||||
find_in_list(NEW_LIST ${ITEM} FOUND_ITEM)
|
|
||||||
if(FOUND_ITEM EQUAL -1)
|
|
||||||
# If the item was not found, append it to the list
|
|
||||||
append_to_list(NEW_LIST ${ITEM})
|
|
||||||
endif(FOUND_ITEM EQUAL -1)
|
|
||||||
endforeach(ITEM)
|
|
||||||
# Replace the old list with the new list
|
|
||||||
set(${LIST} ${NEW_LIST})
|
|
||||||
endif(CMAKE26_OR_BETTER)
|
|
||||||
endmacro(remove_list_duplicates)
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
# remove_item_from_list(<list> <value>)
|
|
||||||
#
|
|
||||||
# A macro to handle removing a value from a list, uses list(REMOVE_ITEM) in
|
|
||||||
# both cases, but can remove the value itself using CMake 2.4.2 or better,
|
|
||||||
# while older versions use a slower method of iterating the list to find the
|
|
||||||
# index of the value to remove.
|
|
||||||
###############################################################################
|
|
||||||
macro(remove_item_from_list LIST VALUE)
|
|
||||||
if(CMAKE242_OR_BETTER)
|
|
||||||
# For CMake 2.4.2 or better, this can be done automatically
|
|
||||||
list(REMOVE_ITEM ${LIST} ${VALUE})
|
|
||||||
else(CMAKE242_OR_BETTER)
|
|
||||||
# For CMake 2.4.x before 2.4.2, we have to do this ourselves, firstly we set the index and a variable to indicate if the item was found
|
|
||||||
set(INDEX 0)
|
|
||||||
set(FOUND FALSE)
|
|
||||||
# Iterate through the old list
|
|
||||||
foreach(ITEM ${${LIST}})
|
|
||||||
# If the item hasn't been found yet, but the current item is the same, remove it
|
|
||||||
if(NOT FOUND)
|
|
||||||
if(ITEM STREQUAL ${VALUE})
|
|
||||||
set(FOUND TRUE)
|
|
||||||
list(REMOVE_ITEM ${LIST} ${INDEX})
|
|
||||||
endif(ITEM STREQUAL ${VALUE})
|
|
||||||
endif(NOT FOUND)
|
|
||||||
# Increase the index value by 1
|
|
||||||
math(EXPR INDEX "${INDEX} + 1")
|
|
||||||
endforeach(ITEM)
|
|
||||||
endif(CMAKE242_OR_BETTER)
|
|
||||||
endmacro(remove_item_from_list)
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
# sort_list(<list>)
|
|
||||||
#
|
|
||||||
# A macro to handle sorting a list, uses list(SORT) if using CMake 2.4.4 or
|
|
||||||
# better, otherwise it uses a slower method of creating a temporary list and
|
|
||||||
# adding elements in alphabetical order.
|
|
||||||
###############################################################################
|
|
||||||
macro(sort_list LIST)
|
|
||||||
if(CMAKE244_OR_BETTER)
|
|
||||||
# For CMake 2.4.4 or better, this can be done automatically
|
|
||||||
list(SORT ${LIST})
|
|
||||||
else(CMAKE244_OR_BETTER)
|
|
||||||
# For CMake 2.4.x before 2.4.4, we have to do this ourselves, firstly we'll create a temporary list
|
|
||||||
set(NEW_LIST)
|
|
||||||
# Iterate through the old list
|
|
||||||
foreach(ITEM ${${LIST}})
|
|
||||||
# Temporary index position for the new list, as well as temporary value to store if the item was ever found
|
|
||||||
set(INDEX 0)
|
|
||||||
set(FOUND FALSE)
|
|
||||||
# Iterate through the new list
|
|
||||||
foreach(NEW_ITEM ${NEW_LIST})
|
|
||||||
# Compare the items, only if nothing was found before
|
|
||||||
if(NOT FOUND)
|
|
||||||
if(NEW_ITEM STRGREATER "${ITEM}")
|
|
||||||
set(FOUND TRUE)
|
|
||||||
list(INSERT NEW_LIST ${INDEX} ${ITEM})
|
|
||||||
endif(NEW_ITEM STRGREATER "${ITEM}")
|
|
||||||
endif(NOT FOUND)
|
|
||||||
# Increase the index value by 1
|
|
||||||
math(EXPR INDEX "${INDEX} + 1")
|
|
||||||
endforeach(NEW_ITEM)
|
|
||||||
# If the item was never found, just append it to the end
|
|
||||||
if(NOT FOUND)
|
|
||||||
append_to_list(NEW_LIST ${ITEM})
|
|
||||||
endif(NOT FOUND)
|
|
||||||
endforeach(ITEM)
|
|
||||||
# Replace the old list with the new list
|
|
||||||
set(${LIST} ${NEW_LIST})
|
|
||||||
endif(CMAKE244_OR_BETTER)
|
|
||||||
endmacro(sort_list)
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
# read_from_file(<filename> <regex> <output variable>)
|
|
||||||
#
|
|
||||||
# A macro to handle reading specific lines from a file, uses file(STRINGS) if
|
|
||||||
# using CMake 2.6.x or better, otherwise we read in the entire file and
|
|
||||||
# perform a string(REGEX MATCH) on each line of the file instead. This
|
|
||||||
# macro can also be used to read in all the lines of a file if REGEX is set
|
|
||||||
# to "".
|
|
||||||
###############################################################################
|
|
||||||
macro(read_from_file FILE REGEX STRINGS)
|
|
||||||
if(CMAKE26_OR_BETTER)
|
|
||||||
# For CMake 2.6.x or better, we can just use the STRINGS sub-command to get the lines that match the given regular expression (if one is given, otherwise get all lines)
|
|
||||||
if(REGEX STREQUAL "")
|
|
||||||
file(STRINGS ${FILE} RESULT)
|
|
||||||
else(REGEX STREQUAL "")
|
|
||||||
file(STRINGS ${FILE} RESULT REGEX ${REGEX})
|
|
||||||
endif(REGEX STREQUAL "")
|
|
||||||
else(CMAKE26_OR_BETTER)
|
|
||||||
# For CMake 2.4.x, we need to do this manually, firstly we read the file in
|
|
||||||
execute_process(COMMAND ${CMAKE_COMMAND} -DFILE:STRING=${FILE} -P ${Anope_SOURCE_DIR}/cmake/ReadFile.cmake ERROR_VARIABLE ALL_STRINGS)
|
|
||||||
# Next we replace all newlines with semicolons
|
|
||||||
string(REGEX REPLACE "\n" ";" ALL_STRINGS ${ALL_STRINGS})
|
|
||||||
if(REGEX STREQUAL "")
|
|
||||||
# For no regular expression, just set the result to all the lines
|
|
||||||
set(RESULT ${ALL_STRINGS})
|
|
||||||
else(REGEX STREQUAL "")
|
|
||||||
# Clear the result list
|
|
||||||
set(RESULT)
|
|
||||||
# Iterate through all the lines of the file
|
|
||||||
foreach(STRING ${ALL_STRINGS})
|
|
||||||
# Check for a match against the given regular expression
|
|
||||||
string(REGEX MATCH ${REGEX} STRING_MATCH ${STRING})
|
|
||||||
# If we had a match, append the match to the list
|
|
||||||
if(STRING_MATCH)
|
|
||||||
append_to_list(RESULT ${STRING})
|
|
||||||
endif(STRING_MATCH)
|
|
||||||
endforeach(STRING)
|
|
||||||
endif(REGEX STREQUAL "")
|
|
||||||
endif(CMAKE26_OR_BETTER)
|
|
||||||
# Set the given STRINGS variable to the result
|
|
||||||
set(${STRINGS} ${RESULT})
|
|
||||||
endmacro(read_from_file)
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
# extract_include_filename(<line> <output variable> [<optional output variable of quote type>])
|
|
||||||
#
|
|
||||||
# This macro will take a #include line and extract the filename.
|
|
||||||
###############################################################################
|
|
||||||
macro(extract_include_filename INCLUDE FILENAME)
|
|
||||||
# Strip the leading and trailing spaces from the include line
|
|
||||||
strip_string(${INCLUDE} INCLUDE_STRIPPED)
|
|
||||||
# Make sure to only do the following if there is a string
|
|
||||||
if(INCLUDE_STRIPPED STREQUAL "")
|
|
||||||
set(FILE "")
|
|
||||||
else(INCLUDE_STRIPPED STREQUAL "")
|
|
||||||
# Extract the filename including the quotes or angle brackets
|
|
||||||
string(REGEX REPLACE "^.*([\"<].*[\">]).*$" "\\1" FILE "${INCLUDE_STRIPPED}")
|
|
||||||
# If an optional 3rd argument is given, we'll store if the quote style was quoted or angle bracketed
|
|
||||||
if(${ARGC} GREATER 2)
|
|
||||||
string(SUBSTRING ${FILE} 0 1 QUOTE)
|
|
||||||
if(QUOTE STREQUAL "<")
|
|
||||||
set(${ARGV2} "angle brackets")
|
|
||||||
else(QUOTE STREQUAL "<")
|
|
||||||
set(${ARGV2} "quotes")
|
|
||||||
endif(QUOTE STREQUAL "<")
|
|
||||||
endif(${ARGC} GREATER 2)
|
|
||||||
# Now remove the quotes or angle brackets
|
|
||||||
string(REGEX REPLACE "^[\"<](.*)[\">]$" "\\1" FILE "${FILE}")
|
|
||||||
endif(INCLUDE_STRIPPED STREQUAL "")
|
|
||||||
# Set the filename to the the given variable
|
|
||||||
set(${FILENAME} "${FILE}")
|
|
||||||
endmacro(extract_include_filename)
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
# find_includes(<source filename> <output variable>)
|
|
||||||
#
|
|
||||||
# This macro will search through a file for #include lines, regardless of
|
|
||||||
# whitespace, but only returns the lines that are valid for the current
|
|
||||||
# platform CMake is running on.
|
|
||||||
###############################################################################
|
|
||||||
macro(find_includes SRC INCLUDES)
|
|
||||||
# Read all lines from the file that start with #, regardless of whitespace before the #
|
|
||||||
read_from_file(${SRC} "^[ \t]*#.*$" LINES)
|
|
||||||
# Set that any #include lines found are valid, and create temporary variables for the last found #ifdef/#ifndef
|
|
||||||
set(VALID_LINE TRUE)
|
|
||||||
set(LAST_DEF)
|
|
||||||
set(LAST_CHECK)
|
|
||||||
# Create an empty include list
|
|
||||||
set(INCLUDES_LIST)
|
|
||||||
# Iterate through all the # lines
|
|
||||||
foreach(LINE ${LINES})
|
|
||||||
# Search for #ifdef, #ifndef, #else, #endif, and #include
|
|
||||||
string(REGEX MATCH "^[ \t]*#[ \t]*ifdef[ \t]*.*$" FOUND_IFDEF ${LINE})
|
|
||||||
string(REGEX MATCH "^[ \t]*#[ \t]*ifndef[ \t]*.*$" FOUND_IFNDEF ${LINE})
|
|
||||||
string(REGEX MATCH "^[ \t]*#[ \t]*else.*$" FOUND_ELSE ${LINE})
|
|
||||||
string(REGEX MATCH "^[ \t]*#[ \t]*endif.*$" FOUND_ENDIF ${LINE})
|
|
||||||
string(REGEX MATCH "^[ \t]*#[ \t]*include[ \t]*[\"<].*[\">][\ t]*.*$" FOUND_INCLUDE ${LINE})
|
|
||||||
# If we found a #ifdef on the line, extract the data after the #ifdef and set if the lines after it are valid based on the variables in CMake
|
|
||||||
if(FOUND_IFDEF)
|
|
||||||
# Extract the define
|
|
||||||
string(REGEX REPLACE "^[ \t]*#[ \t]*ifdef[ \t]*(.*)$" "\\1" DEFINE ${LINE})
|
|
||||||
# Replace _WIN32 with WIN32, so we can check if the WIN32 variable of CMake is set instead of _WIN32
|
|
||||||
if(DEFINE STREQUAL "_WIN32")
|
|
||||||
set(DEFINE WIN32)
|
|
||||||
endif(DEFINE STREQUAL "_WIN32")
|
|
||||||
# Set the last define to this one, and set the last check to true, so when #else is encountered, we can do an opposing check
|
|
||||||
set(LAST_DEF ${DEFINE})
|
|
||||||
set(LAST_CHECK TRUE)
|
|
||||||
# If the define is true (it either exists or is a non-false result), the lines following will be checked, otherwise they will be skipped
|
|
||||||
if(${DEFINE})
|
|
||||||
set(VALID_LINE TRUE)
|
|
||||||
else(${DEFINE})
|
|
||||||
set(VALID_LINE FALSE)
|
|
||||||
endif(${DEFINE})
|
|
||||||
else(FOUND_IFDEF)
|
|
||||||
# If we found a #ifndef on the line, the same thing as #ifdef is done, except with the checks in the opposite direction
|
|
||||||
if(FOUND_IFNDEF)
|
|
||||||
# Extract the define
|
|
||||||
string(REGEX REPLACE "^[ \t]*#[ \t]*ifndef[ \t]*(.*)$" "\\1" DEFINE ${LINE})
|
|
||||||
# Replace _WIN32 with WIN32, so we can check if the WIN32 variable of CMake is set instead of _WIN32
|
|
||||||
if(DEFINE STREQUAL "_WIN32")
|
|
||||||
set(DEFINE WIN32)
|
|
||||||
endif(DEFINE STREQUAL "_WIN32")
|
|
||||||
# Set the last define to this one, and set the last check to false, so when #else is encountered, we can do an opposing check
|
|
||||||
set(LAST_DEF ${DEFINE})
|
|
||||||
set(LAST_CHECK FALSE)
|
|
||||||
# If the define is not true (it either doesn't exists or is a false result), the lines following will be checked, otherwise they will be skipped
|
|
||||||
if(${DEFINE})
|
|
||||||
set(VALID_LINE FALSE)
|
|
||||||
else(${DEFINE})
|
|
||||||
set(VALUE_LINE TRUE)
|
|
||||||
endif(${DEFINE})
|
|
||||||
else(FOUND_IFNDEF)
|
|
||||||
# If we found a #else on the line, we check the last define in the opposite direction
|
|
||||||
if(FOUND_ELSE)
|
|
||||||
# When LAST_CHECK is true, we were inside a #ifdef, now act as if we are entering a #ifndef section by doing an opposing check
|
|
||||||
if(LAST_CHECK)
|
|
||||||
if(${LAST_DEF})
|
|
||||||
set(VALID_LINE FALSE)
|
|
||||||
else(${LAST_DEF})
|
|
||||||
set(VALID_LINE TRUE)
|
|
||||||
endif(${LAST_DEF})
|
|
||||||
# When LAST_CHECK is false, we were inside a #ifndef, now act as if we are entering a #ifdef section by doing an opposing check
|
|
||||||
else(LAST_CHECK)
|
|
||||||
if(${LAST_DEF})
|
|
||||||
set(VALID_LINE TRUE)
|
|
||||||
else(${LAST_DEF})
|
|
||||||
set(VALID_LINE FALSE)
|
|
||||||
endif(${LAST_DEF})
|
|
||||||
endif(LAST_CHECK)
|
|
||||||
else(FOUND_ELSE)
|
|
||||||
# If we found a #endif on the line, we'll assume everything following the line is valid until we meet another one of the above lines
|
|
||||||
if(FOUND_ENDIF)
|
|
||||||
set(VALID_LINE TRUE)
|
|
||||||
else(FOUND_ENDIF)
|
|
||||||
# If we found a #include on the line, add the entire line to the list of includes unless the line isn't valid
|
|
||||||
if(FOUND_INCLUDE)
|
|
||||||
if(VALID_LINE)
|
|
||||||
append_to_list(INCLUDES_LIST "${LINE}")
|
|
||||||
endif(VALID_LINE)
|
|
||||||
endif(FOUND_INCLUDE)
|
|
||||||
endif(FOUND_ENDIF)
|
|
||||||
endif(FOUND_ELSE)
|
|
||||||
endif(FOUND_IFNDEF)
|
|
||||||
endif(FOUND_IFDEF)
|
|
||||||
endforeach(LINE)
|
|
||||||
set(${INCLUDES} ${INCLUDES_LIST})
|
|
||||||
endmacro(find_includes)
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
# calculate_depends(<source filename> [<optional output variable for includes>])
|
|
||||||
#
|
|
||||||
# This macro is used in most of the src (sub)directories to calculate the
|
|
||||||
# header file dependencies for the given source file.
|
|
||||||
###############################################################################
|
|
||||||
macro(calculate_depends SRC)
|
|
||||||
# Temporarily set that we didn't get a 3rd argument before we actually check if we did get one or not
|
|
||||||
set(CHECK_ANGLE_INCLUDES FALSE)
|
|
||||||
# Check for a third argument
|
|
||||||
if(${ARGC} GREATER 1)
|
|
||||||
set(CHECK_ANGLE_INCLUDES TRUE)
|
|
||||||
endif(${ARGC} GREATER 1)
|
|
||||||
# Find all the lines in the given source file that have any form of #include on them, regardless of whitespace, but only if they are valid for the platform we are on
|
|
||||||
find_includes(${SRC} INCLUDES)
|
|
||||||
# Reset the list of headers to empty
|
|
||||||
set(HEADERS)
|
|
||||||
# Iterate through the strings containing #include (if any)
|
|
||||||
foreach(INCLUDE ${INCLUDES})
|
|
||||||
# Extract the filename from the #include line
|
|
||||||
extract_include_filename(${INCLUDE} FILENAME QUOTE_TYPE)
|
|
||||||
if(QUOTE_TYPE STREQUAL "angle brackets")
|
|
||||||
# The following checks will only be done if there was a request for angle includes to be checked
|
|
||||||
if(CHECK_ANGLE_INCLUDES)
|
|
||||||
# Find the path of the include file
|
|
||||||
if(DEFAULT_INCLUDE_DIRS OR WSDK_PATH OR DEFINED $ENV{VCINSTALLDIR})
|
|
||||||
find_path(FOUND_${FILENAME}_INCLUDE NAMES ${FILENAME} PATHS ${DEFAULT_INCLUDE_DIRS} ${WSDK_PATH}/include $ENV{VCINSTALLDIR}/include ${EXTRA_INCLUDE})
|
|
||||||
else(DEFAULT_INCLUDE_DIRS OR WSDK_PATH OR DEFINED $ENV{VCINSTALLDIR})
|
|
||||||
find_path(FOUND_${FILENAME}_INCLUDE NAMES ${FILENAME} ${EXTRA_INCLUDE})
|
|
||||||
endif(DEFAULT_INCLUDE_DIRS OR WSDK_PATH OR DEFINED $ENV{VCINSTALLDIR})
|
|
||||||
# If the include file was found, add it's path to the list of include paths, but only if it doesn't already exist and isn't in the defaults for the compiler
|
|
||||||
if(FOUND_${FILENAME}_INCLUDE)
|
|
||||||
# This used to be find_in_list, but it was changed to this loop to do a find on each default include directory, this fixes Mac OS X trying to get it's framework directories in here
|
|
||||||
set(FOUND_IN_DEFAULTS -1)
|
|
||||||
foreach(DEFAULT_INCLUDE_DIR ${DEFAULT_INCLUDE_DIRS})
|
|
||||||
string(REGEX REPLACE "\\+" "\\\\+" DEFAULT_INCLUDE_DIR ${DEFAULT_INCLUDE_DIR})
|
|
||||||
string(REGEX MATCH ${DEFAULT_INCLUDE_DIR} FOUND_DEFAULT ${FOUND_${FILENAME}_INCLUDE})
|
|
||||||
if(FOUND_DEFAULT)
|
|
||||||
set(FOUND_IN_DEFAULTS 0)
|
|
||||||
endif(FOUND_DEFAULT)
|
|
||||||
endforeach(DEFAULT_INCLUDE_DIR)
|
|
||||||
if(FOUND_IN_DEFAULTS EQUAL -1)
|
|
||||||
find_in_list(${ARGV1} "${FOUND_${FILENAME}_INCLUDE}" FOUND_IN_INCLUDES)
|
|
||||||
if(FOUND_IN_INCLUDES EQUAL -1)
|
|
||||||
append_to_list(${ARGV1} "${FOUND_${FILENAME}_INCLUDE}")
|
|
||||||
endif(FOUND_IN_INCLUDES EQUAL -1)
|
|
||||||
endif(FOUND_IN_DEFAULTS EQUAL -1)
|
|
||||||
else(FOUND_${FILENAME}_INCLUDE)
|
|
||||||
# XXX
|
|
||||||
if(NOT ${FILENAME} STREQUAL "libintl.h")
|
|
||||||
message(WARNING "${SRC} needs header file ${FILENAME} but we were unable to locate that header file! Check that the header file is within the search path of your OS.")
|
|
||||||
endif(NOT ${FILENAME} STREQUAL "libintl.h")
|
|
||||||
endif(FOUND_${FILENAME}_INCLUDE)
|
|
||||||
endif(CHECK_ANGLE_INCLUDES)
|
|
||||||
endif(QUOTE_TYPE STREQUAL "angle brackets")
|
|
||||||
endforeach(INCLUDE)
|
|
||||||
endmacro(calculate_depends)
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
# calculate_libraries(<source filename> <output variable for linker flags> <output variable for extra depends>)
|
|
||||||
#
|
|
||||||
# This macro is used in most of the module (sub)directories to calculate the
|
|
||||||
# library dependencies for the given source file.
|
|
||||||
###############################################################################
|
|
||||||
macro(calculate_libraries SRC SRC_LDFLAGS EXTRA_DEPENDS)
|
|
||||||
# Set up a temporary LDFLAGS for this file
|
|
||||||
set(THIS_LDFLAGS "${LDFLAGS}")
|
|
||||||
# Reset extra dependencies
|
|
||||||
set(EXTRA_DEPENDENCIES)
|
|
||||||
# Reset library paths
|
|
||||||
set(LIBRARY_PATHS)
|
|
||||||
# Reset libraries
|
|
||||||
set(LIBRARIES)
|
|
||||||
# Check to see if there are any lines matching: /* RequiredLibraries: [something] */
|
|
||||||
if(WIN32)
|
|
||||||
read_from_file(${SRC} "/\\\\*[ \t]*RequiredWindowsLibraries:[ \t]*.*[ \t]*\\\\*/" REQUIRED_LIBRARIES)
|
|
||||||
else(WIN32)
|
|
||||||
read_from_file(${SRC} "/\\\\*[ \t]*RequiredLibraries:[ \t]*.*[ \t]*\\\\*/" REQUIRED_LIBRARIES)
|
|
||||||
endif(WIN32)
|
|
||||||
# Iterate through those lines
|
|
||||||
foreach(REQUIRED_LIBRARY ${REQUIRED_LIBRARIES})
|
|
||||||
# Strip off the /* RequiredLibraries: and */ from the line
|
|
||||||
string(REGEX REPLACE "/\\*[ \t]*Required.*Libraries:[ \t]*([^ \t]*)[ \t]*\\*/" "\\1" REQUIRED_LIBRARY ${REQUIRED_LIBRARY})
|
|
||||||
# Replace all commas with semicolons
|
|
||||||
string(REGEX REPLACE "," ";" REQUIRED_LIBRARY ${REQUIRED_LIBRARY})
|
|
||||||
# Iterate through the libraries given
|
|
||||||
foreach(LIBRARY ${REQUIRED_LIBRARY})
|
|
||||||
# If the library has multiple names extract the alternate.
|
|
||||||
unset(LIBRARY_ALT)
|
|
||||||
if (${LIBRARY} MATCHES "^.+\\|.+$")
|
|
||||||
string(REGEX REPLACE ".+\\|(.*)" "\\1" LIBRARY_ALT ${LIBRARY})
|
|
||||||
string(REGEX REPLACE "(.+)\\|.*" "\\1" LIBRARY ${LIBRARY})
|
|
||||||
endif(${LIBRARY} MATCHES "^.+\\|.+$")
|
|
||||||
# Locate the library to see if it exists
|
|
||||||
if(DEFAULT_LIBRARY_DIRS OR WSDK_PATH OR DEFINED $ENV{VCINSTALLDIR})
|
|
||||||
find_library(FOUND_${LIBRARY}_LIBRARY NAMES ${LIBRARY} ${LIBRARY_ALT} PATHS ${DEFAULT_LIBRARY_DIRS} ${WSDK_PATH}/lib $ENV{VCINSTALLDIR}/lib ${EXTRA_INCLUDE} ${EXTRA_LIBS})
|
|
||||||
else(DEFAULT_LIBRARY_DIRS OR WSDK_PATH OR DEFINED $ENV{VCINSTALLDIR})
|
|
||||||
find_library(FOUND_${LIBRARY}_LIBRARY NAMES ${LIBRARY} ${LIBRARY_ALT} PATHS ${EXTRA_INCLUDE} ${EXTRA_LIBS} NO_DEFAULT_PATH)
|
|
||||||
find_library(FOUND_${LIBRARY}_LIBRARY NAMES ${LIBRARY} ${LIBRARY_ALT} PATHS ${EXTRA_INCLUDE} ${EXTRA_LIBS})
|
|
||||||
endif(DEFAULT_LIBRARY_DIRS OR WSDK_PATH OR DEFINED $ENV{VCINSTALLDIR})
|
|
||||||
# If the library was found, we will add it to the linker flags
|
|
||||||
if(FOUND_${LIBRARY}_LIBRARY)
|
|
||||||
if(MSVC)
|
|
||||||
# For Visual Studio, instead of editing the linker flags, we'll add the library to a separate list of extra dependencies
|
|
||||||
append_to_list(EXTRA_DEPENDENCIES "${FOUND_${LIBRARY}_LIBRARY}")
|
|
||||||
else(MSVC)
|
|
||||||
# Get the path only of the library, to add it to library paths.
|
|
||||||
get_filename_component(LIBRARY_PATH ${FOUND_${LIBRARY}_LIBRARY} PATH)
|
|
||||||
append_to_list(LIBRARY_PATHS "${LIBRARY_PATH}")
|
|
||||||
# Extract the library short name, add it to the library path
|
|
||||||
get_filename_component(LIBRARY_NAME ${FOUND_${LIBRARY}_LIBRARY} NAME_WE)
|
|
||||||
string(REGEX REPLACE "^lib" "" LIBRARY_NAME ${LIBRARY_NAME})
|
|
||||||
append_to_list(LIBRARIES ${LIBRARY_NAME})
|
|
||||||
endif(MSVC)
|
|
||||||
else(FOUND_${LIBRARY}_LIBRARY)
|
|
||||||
# In the case of the library not being found, we fatally error so CMake stops trying to generate
|
|
||||||
message(FATAL_ERROR "${SRC} needs library ${LIBRARY} but we were unable to locate that library! Check that the library is within the search path of your OS.")
|
|
||||||
endif(FOUND_${LIBRARY}_LIBRARY)
|
|
||||||
endforeach(LIBRARY)
|
|
||||||
endforeach(REQUIRED_LIBRARY)
|
|
||||||
# Remove duplicates from the library paths
|
|
||||||
if(LIBRARY_PATHS)
|
|
||||||
remove_list_duplicates(LIBRARY_PATHS)
|
|
||||||
endif(LIBRARY_PATHS)
|
|
||||||
# Remove diplicates from the libraries
|
|
||||||
if(LIBRARIES)
|
|
||||||
remove_list_duplicates(LIBRARIES)
|
|
||||||
endif(LIBRARIES)
|
|
||||||
# Iterate through library paths and add them to the linker flags
|
|
||||||
foreach(LIBRARY_PATH ${LIBRARY_PATHS})
|
|
||||||
find_in_list(DEFAULT_LIBRARY_DIRS "${LIBRARY_PATH}" FOUND_IN_DEFAULTS)
|
|
||||||
if(FOUND_IN_DEFAULTS EQUAL -1)
|
|
||||||
set(THIS_LDFLAGS "${THIS_LDFLAGS} -L${LIBRARY_PATH}")
|
|
||||||
endif(FOUND_IN_DEFAULTS EQUAL -1)
|
|
||||||
endforeach(LIBRARY_PATH)
|
|
||||||
# Iterate through libraries and add them to the linker flags
|
|
||||||
foreach(LIBRARY ${LIBRARIES})
|
|
||||||
append_to_list(EXTRA_DEPENDENCIES "${LIBRARY}")
|
|
||||||
endforeach(LIBRARY)
|
|
||||||
set(${SRC_LDFLAGS} "${THIS_LDFLAGS}")
|
|
||||||
set(${EXTRA_DEPENDS} "${EXTRA_DEPENDENCIES}")
|
|
||||||
endmacro(calculate_libraries)
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
# check_functions(<source filename> <output variable set to TRUE on success>)
|
|
||||||
#
|
|
||||||
# This macro is used in most of the module (sub)directories to calculate the
|
|
||||||
# function dependencies for the given source file.
|
|
||||||
###############################################################################
|
|
||||||
macro(check_functions SRC SUCCESS)
|
|
||||||
# Default to true
|
|
||||||
set(${SUCCESS} TRUE)
|
|
||||||
# Check to see if there are any lines matching: /* RequiredFunctions: [something] */
|
|
||||||
read_from_file(${SRC} "/\\\\*[ \t]*RequiredFunctions:[ \t]*.*[ \t]*\\\\*/" REQUIRED_FUNCTIONS)
|
|
||||||
# Iterate through those lines
|
|
||||||
foreach(REQUIRED_FUNCTION ${REQUIRED_FUNCTIONS})
|
|
||||||
# Strip off the /* RequiredFunctions: and */ from the line
|
|
||||||
string(REGEX REPLACE "/\\*[ \t]*RequiredFunctions:[ \t]*([^ \t]*)[ \t]*\\*/" "\\1" REQUIRED_FUNCTION ${REQUIRED_FUNCTION})
|
|
||||||
# Replace all commas with semicolons
|
|
||||||
string(REGEX REPLACE "," ";" REQUIRED_FUNCTION ${REQUIRED_FUNCTION})
|
|
||||||
# Iterate through the functions given
|
|
||||||
foreach(FUNCTION ${REQUIRED_FUNCTION})
|
|
||||||
# Check if the function exists
|
|
||||||
check_function_exists(${REQUIRED_FUNCTION} HAVE_${REQUIRED_FUNCTION})
|
|
||||||
# If we don't have the function warn the user and set SUCCESS to FALSE
|
|
||||||
if(NOT HAVE_${REQUIRED_FUNCTION})
|
|
||||||
message("${SRC} needs function ${REQUIRED_FUNCTION} but we were unable to locate that function!")
|
|
||||||
set(${SUCCESS} FALSE)
|
|
||||||
endif(NOT HAVE_${REQUIRED_FUNCTION})
|
|
||||||
endforeach(FUNCTION)
|
|
||||||
endforeach(REQUIRED_FUNCTION)
|
|
||||||
endmacro(check_functions)
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
# add_to_cpack_ignored_files(<item> [TRUE])
|
|
||||||
#
|
|
||||||
# A macro to update the environment variable CPACK_IGNORED_FILES which
|
|
||||||
# contains a list of files for CPack to ignore. If the optional 2nd argument
|
|
||||||
# of TRUE is given, periods will be converted to \\. for CPack.
|
|
||||||
###############################################################################
|
|
||||||
macro(add_to_cpack_ignored_files ITEM)
|
|
||||||
# Temporary copy of the original item
|
|
||||||
set(REAL_ITEM "${ITEM}")
|
|
||||||
# If we have 2+ arguments, assume that the second one was something like TRUE (doesn't matter really) and convert periods so they will be \\. for CPack
|
|
||||||
if(${ARGC} GREATER 1)
|
|
||||||
string(REPLACE "." "\\\\." REAL_ITEM ${REAL_ITEM})
|
|
||||||
endif(${ARGC} GREATER 1)
|
|
||||||
# If the environment variable is already defined, just tack the item to the end
|
|
||||||
if(DEFINED ENV{CPACK_IGNORED_FILES})
|
|
||||||
set(ENV{CPACK_IGNORED_FILES} "$ENV{CPACK_IGNORED_FILES};${REAL_ITEM}")
|
|
||||||
# Otherwise set the environment variable to the item
|
|
||||||
else(DEFINED ENV{CPACK_IGNORED_FILES})
|
|
||||||
set(ENV{CPACK_IGNORED_FILES} "${REAL_ITEM}")
|
|
||||||
endif(DEFINED ENV{CPACK_IGNORED_FILES})
|
|
||||||
endmacro(add_to_cpack_ignored_files)
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
# Find the header files, libs, and executables for gettext
|
|
||||||
if(NOT WIN32)
|
|
||||||
find_path(GETTEXT_INCLUDE libintl.h /usr/include /usr/local/include ${EXTRA_INCLUDE})
|
|
||||||
find_library(GETTEXT_LIBRARY intl PATHS /usr/lib /usr/lib64 ${EXTRA_LIBS})
|
|
||||||
find_program(GETTEXT_MSGFMT msgfmt PATHS /usr/bin/ /usr/local/bin ${EXTRA_INCLUDE})
|
|
||||||
if(GETTEXT_INCLUDE AND GETTEXT_MSGFMT)
|
|
||||||
set(GETTEXT_FOUND TRUE)
|
|
||||||
if(GETTEXT_LIBRARY)
|
|
||||||
set(GETTEXT_LIBRARIES ${GETTEXT_LIBRARY})
|
|
||||||
endif(GETTEXT_LIBRARY)
|
|
||||||
endif(GETTEXT_INCLUDE AND GETTEXT_MSGFMT)
|
|
||||||
else(NOT WIN32)
|
|
||||||
find_path(GETTEXT_INCLUDE libintl.h)
|
|
||||||
find_library(GETTEXT_LIBRARY gnuintl)
|
|
||||||
find_program(GETTEXT_MSGFMT msgfmt)
|
|
||||||
if(GETTEXT_INCLUDE AND GETTEXT_LIBRARY AND GETTEXT_MSGFMT)
|
|
||||||
set(GETTEXT_FOUND TRUE)
|
|
||||||
set(GETTEXT_LIBRARIES ${GETTEXT_LIBRARY})
|
|
||||||
endif(GETTEXT_INCLUDE AND GETTEXT_LIBRARY AND GETTEXT_MSGFMT)
|
|
||||||
endif(NOT WIN32)
|
|
||||||
|
|
||||||
# If we found everything we need set variables correctly for lang/CMakeLists.txt to use
|
|
||||||
if(GETTEXT_FOUND)
|
|
||||||
include_directories("${GETTEXT_INCLUDE}")
|
|
||||||
set(GETTEXT_MSGFMT_EXECUTABLE ${GETTEXT_MSGFMT})
|
|
||||||
endif(GETTEXT_FOUND)
|
|
||||||
@@ -1,825 +0,0 @@
|
|||||||
; CPack install script designed for a nmake build
|
|
||||||
|
|
||||||
;--------------------------------
|
|
||||||
; You must define these values
|
|
||||||
|
|
||||||
!define VERSION "@CPACK_PACKAGE_VERSION@"
|
|
||||||
!define INST_DIR "@CPACK_TEMPORARY_DIRECTORY@"
|
|
||||||
|
|
||||||
;--------------------------------
|
|
||||||
;Variables
|
|
||||||
|
|
||||||
Var MUI_TEMP
|
|
||||||
Var STARTMENU_FOLDER
|
|
||||||
Var SV_ALLUSERS
|
|
||||||
Var START_MENU
|
|
||||||
Var DO_NOT_ADD_TO_PATH
|
|
||||||
Var ADD_TO_PATH_ALL_USERS
|
|
||||||
Var ADD_TO_PATH_CURRENT_USER
|
|
||||||
Var INSTALL_DESKTOP
|
|
||||||
|
|
||||||
;--------------------------------
|
|
||||||
;Include Modern UI
|
|
||||||
|
|
||||||
!include "MUI2.nsh"
|
|
||||||
|
|
||||||
;Default installation folder
|
|
||||||
InstallDir "$PROGRAMFILES\@CPACK_PACKAGE_INSTALL_DIRECTORY@"
|
|
||||||
|
|
||||||
;--------------------------------
|
|
||||||
;General
|
|
||||||
|
|
||||||
;Name and file
|
|
||||||
Name "@CPACK_PACKAGE_NAME@ @CPACK_PACKAGE_VERSION@"
|
|
||||||
OutFile "@CPACK_TOPLEVEL_DIRECTORY@/@CPACK_OUTPUT_FILE_NAME@"
|
|
||||||
|
|
||||||
;Set compression
|
|
||||||
SetCompressor @CPACK_NSIS_COMPRESSOR@
|
|
||||||
|
|
||||||
@CPACK_NSIS_DEFINES@
|
|
||||||
|
|
||||||
!include Sections.nsh
|
|
||||||
|
|
||||||
;--- Component support macros: ---
|
|
||||||
; The code for the add/remove functionality is from:
|
|
||||||
; http://nsis.sourceforge.net/Add/Remove_Functionality
|
|
||||||
; It has been modified slightly and extended to provide
|
|
||||||
; inter-component dependencies.
|
|
||||||
Var AR_SecFlags
|
|
||||||
Var AR_RegFlags
|
|
||||||
@CPACK_NSIS_SECTION_SELECTED_VARS@
|
|
||||||
|
|
||||||
; Loads the "selected" flag for the section named SecName into the
|
|
||||||
; variable VarName.
|
|
||||||
!macro LoadSectionSelectedIntoVar SecName VarName
|
|
||||||
SectionGetFlags ${${SecName}} $${VarName}
|
|
||||||
IntOp $${VarName} $${VarName} & ${SF_SELECTED} ;Turn off all other bits
|
|
||||||
!macroend
|
|
||||||
|
|
||||||
; Loads the value of a variable... can we get around this?
|
|
||||||
!macro LoadVar VarName
|
|
||||||
IntOp $R0 0 + $${VarName}
|
|
||||||
!macroend
|
|
||||||
|
|
||||||
; Sets the value of a variable
|
|
||||||
!macro StoreVar VarName IntValue
|
|
||||||
IntOp $${VarName} 0 + ${IntValue}
|
|
||||||
!macroend
|
|
||||||
|
|
||||||
!macro InitSection SecName
|
|
||||||
; This macro reads component installed flag from the registry and
|
|
||||||
;changes checked state of the section on the components page.
|
|
||||||
;Input: section index constant name specified in Section command.
|
|
||||||
|
|
||||||
ClearErrors
|
|
||||||
;Reading component status from registry
|
|
||||||
ReadRegDWORD $AR_RegFlags HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_NAME@\Components\${SecName}" "Installed"
|
|
||||||
IfErrors "default_${SecName}"
|
|
||||||
;Status will stay default if registry value not found
|
|
||||||
;(component was never installed)
|
|
||||||
IntOp $AR_RegFlags $AR_RegFlags & ${SF_SELECTED} ;Turn off all other bits
|
|
||||||
SectionGetFlags ${${SecName}} $AR_SecFlags ;Reading default section flags
|
|
||||||
IntOp $AR_SecFlags $AR_SecFlags & 0xFFFE ;Turn lowest (enabled) bit off
|
|
||||||
IntOp $AR_SecFlags $AR_RegFlags | $AR_SecFlags ;Change lowest bit
|
|
||||||
|
|
||||||
; Note whether this component was installed before
|
|
||||||
!insertmacro StoreVar ${SecName}_was_installed $AR_RegFlags
|
|
||||||
IntOp $R0 $AR_RegFlags & $AR_RegFlags
|
|
||||||
|
|
||||||
;Writing modified flags
|
|
||||||
SectionSetFlags ${${SecName}} $AR_SecFlags
|
|
||||||
|
|
||||||
"default_${SecName}:"
|
|
||||||
!insertmacro LoadSectionSelectedIntoVar ${SecName} ${SecName}_selected
|
|
||||||
!macroend
|
|
||||||
|
|
||||||
!macro FinishSection SecName
|
|
||||||
; This macro reads section flag set by user and removes the section
|
|
||||||
;if it is not selected.
|
|
||||||
;Then it writes component installed flag to registry
|
|
||||||
;Input: section index constant name specified in Section command.
|
|
||||||
|
|
||||||
SectionGetFlags ${${SecName}} $AR_SecFlags ;Reading section flags
|
|
||||||
;Checking lowest bit:
|
|
||||||
IntOp $AR_SecFlags $AR_SecFlags & ${SF_SELECTED}
|
|
||||||
IntCmp $AR_SecFlags 1 "leave_${SecName}"
|
|
||||||
;Section is not selected:
|
|
||||||
;Calling Section uninstall macro and writing zero installed flag
|
|
||||||
!insertmacro "Remove_${${SecName}}"
|
|
||||||
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_NAME@\Components\${SecName}" \
|
|
||||||
"Installed" 0
|
|
||||||
Goto "exit_${SecName}"
|
|
||||||
|
|
||||||
"leave_${SecName}:"
|
|
||||||
;Section is selected:
|
|
||||||
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_NAME@\Components\${SecName}" \
|
|
||||||
"Installed" 1
|
|
||||||
|
|
||||||
"exit_${SecName}:"
|
|
||||||
!macroend
|
|
||||||
|
|
||||||
!macro RemoveSection_CPack SecName
|
|
||||||
; This macro is used to call section's Remove_... macro
|
|
||||||
;from the uninstaller.
|
|
||||||
;Input: section index constant name specified in Section command.
|
|
||||||
|
|
||||||
!insertmacro "Remove_${${SecName}}"
|
|
||||||
!macroend
|
|
||||||
|
|
||||||
; Determine whether the selection of SecName changed
|
|
||||||
!macro MaybeSelectionChanged SecName
|
|
||||||
!insertmacro LoadVar ${SecName}_selected
|
|
||||||
SectionGetFlags ${${SecName}} $R1
|
|
||||||
IntOp $R1 $R1 & ${SF_SELECTED} ;Turn off all other bits
|
|
||||||
|
|
||||||
; See if the status has changed:
|
|
||||||
IntCmp $R0 $R1 "${SecName}_unchanged"
|
|
||||||
!insertmacro LoadSectionSelectedIntoVar ${SecName} ${SecName}_selected
|
|
||||||
|
|
||||||
IntCmp $R1 ${SF_SELECTED} "${SecName}_was_selected"
|
|
||||||
!insertmacro "Deselect_required_by_${SecName}"
|
|
||||||
goto "${SecName}_unchanged"
|
|
||||||
|
|
||||||
"${SecName}_was_selected:"
|
|
||||||
!insertmacro "Select_${SecName}_depends"
|
|
||||||
|
|
||||||
"${SecName}_unchanged:"
|
|
||||||
!macroend
|
|
||||||
;--- End of Add/Remove macros ---
|
|
||||||
|
|
||||||
;--------------------------------
|
|
||||||
;Interface Settings
|
|
||||||
|
|
||||||
!define MUI_ABORTWARNING
|
|
||||||
|
|
||||||
;----------------------------------------
|
|
||||||
; based upon a script of "Written by KiCHiK 2003-01-18 05:57:02"
|
|
||||||
;----------------------------------------
|
|
||||||
!verbose 3
|
|
||||||
!include "WinMessages.NSH"
|
|
||||||
!verbose 4
|
|
||||||
|
|
||||||
;====================================================
|
|
||||||
; get_NT_environment
|
|
||||||
; Returns: the selected environment
|
|
||||||
; Output : head of the stack
|
|
||||||
;====================================================
|
|
||||||
!macro select_NT_profile UN
|
|
||||||
Function ${UN}select_NT_profile
|
|
||||||
StrCmp $ADD_TO_PATH_ALL_USERS "1" 0 environment_single
|
|
||||||
DetailPrint "Selected environment for all users"
|
|
||||||
Push "all"
|
|
||||||
Return
|
|
||||||
environment_single:
|
|
||||||
DetailPrint "Selected environment for current user only."
|
|
||||||
Push "current"
|
|
||||||
Return
|
|
||||||
FunctionEnd
|
|
||||||
!macroend
|
|
||||||
!insertmacro select_NT_profile ""
|
|
||||||
!insertmacro select_NT_profile "un."
|
|
||||||
;----------------------------------------------------
|
|
||||||
!define NT_current_env 'HKCU "Environment"'
|
|
||||||
!define NT_all_env 'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"'
|
|
||||||
|
|
||||||
!ifndef WriteEnvStr_RegKey
|
|
||||||
!ifdef ALL_USERS
|
|
||||||
!define WriteEnvStr_RegKey \
|
|
||||||
'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"'
|
|
||||||
!else
|
|
||||||
!define WriteEnvStr_RegKey 'HKCU "Environment"'
|
|
||||||
!endif
|
|
||||||
!endif
|
|
||||||
|
|
||||||
; AddToPath - Adds the given dir to the search path.
|
|
||||||
; Input - head of the stack
|
|
||||||
; Note - Win9x systems requires reboot
|
|
||||||
|
|
||||||
Function AddToPath
|
|
||||||
Exch $0
|
|
||||||
Push $1
|
|
||||||
Push $2
|
|
||||||
Push $3
|
|
||||||
|
|
||||||
# don't add if the path doesn't exist
|
|
||||||
IfFileExists "$0\*.*" "" AddToPath_done
|
|
||||||
|
|
||||||
ReadEnvStr $1 PATH
|
|
||||||
Push "$1;"
|
|
||||||
Push "$0;"
|
|
||||||
Call StrStr
|
|
||||||
Pop $2
|
|
||||||
StrCmp $2 "" "" AddToPath_done
|
|
||||||
Push "$1;"
|
|
||||||
Push "$0\;"
|
|
||||||
Call StrStr
|
|
||||||
Pop $2
|
|
||||||
StrCmp $2 "" "" AddToPath_done
|
|
||||||
GetFullPathName /SHORT $3 $0
|
|
||||||
Push "$1;"
|
|
||||||
Push "$3;"
|
|
||||||
Call StrStr
|
|
||||||
Pop $2
|
|
||||||
StrCmp $2 "" "" AddToPath_done
|
|
||||||
Push "$1;"
|
|
||||||
Push "$3\;"
|
|
||||||
Call StrStr
|
|
||||||
Pop $2
|
|
||||||
StrCmp $2 "" "" AddToPath_done
|
|
||||||
|
|
||||||
Call IsNT
|
|
||||||
Pop $1
|
|
||||||
StrCmp $1 1 AddToPath_NT
|
|
||||||
; Not on NT
|
|
||||||
StrCpy $1 $WINDIR 2
|
|
||||||
FileOpen $1 "$1\autoexec.bat" a
|
|
||||||
FileSeek $1 -1 END
|
|
||||||
FileReadByte $1 $2
|
|
||||||
IntCmp $2 26 0 +2 +2 # DOS EOF
|
|
||||||
FileSeek $1 -1 END # write over EOF
|
|
||||||
FileWrite $1 "$\r$\nSET PATH=%PATH%;$3$\r$\n"
|
|
||||||
FileClose $1
|
|
||||||
SetRebootFlag true
|
|
||||||
Goto AddToPath_done
|
|
||||||
|
|
||||||
AddToPath_NT:
|
|
||||||
ReadRegStr $1 ${WriteEnvStr_RegKey} "PATH"
|
|
||||||
StrCmp $1 "" AddToPath_NTdoIt
|
|
||||||
Push $1
|
|
||||||
Call Trim
|
|
||||||
Pop $1
|
|
||||||
StrCpy $0 "$1;$0"
|
|
||||||
AddToPath_NTdoIt:
|
|
||||||
WriteRegExpandStr ${WriteEnvStr_RegKey} "PATH" $0
|
|
||||||
SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
|
|
||||||
|
|
||||||
AddToPath_done:
|
|
||||||
Pop $3
|
|
||||||
Pop $2
|
|
||||||
Pop $1
|
|
||||||
Pop $0
|
|
||||||
FunctionEnd
|
|
||||||
|
|
||||||
|
|
||||||
; RemoveFromPath - Remove a given dir from the path
|
|
||||||
; Input: head of the stack
|
|
||||||
|
|
||||||
Function un.RemoveFromPath
|
|
||||||
Exch $0
|
|
||||||
Push $1
|
|
||||||
Push $2
|
|
||||||
Push $3
|
|
||||||
Push $4
|
|
||||||
Push $5
|
|
||||||
Push $6
|
|
||||||
|
|
||||||
IntFmt $6 "%c" 26 # DOS EOF
|
|
||||||
|
|
||||||
Call un.IsNT
|
|
||||||
Pop $1
|
|
||||||
StrCmp $1 1 unRemoveFromPath_NT
|
|
||||||
; Not on NT
|
|
||||||
StrCpy $1 $WINDIR 2
|
|
||||||
FileOpen $1 "$1\autoexec.bat" r
|
|
||||||
GetTempFileName $4
|
|
||||||
FileOpen $2 $4 w
|
|
||||||
GetFullPathName /SHORT $0 $0
|
|
||||||
StrCpy $0 "SET PATH=%PATH%;$0"
|
|
||||||
Goto unRemoveFromPath_dosLoop
|
|
||||||
|
|
||||||
unRemoveFromPath_dosLoop:
|
|
||||||
FileRead $1 $3
|
|
||||||
StrCpy $5 $3 1 -1 # read last char
|
|
||||||
StrCmp $5 $6 0 +2 # if DOS EOF
|
|
||||||
StrCpy $3 $3 -1 # remove DOS EOF so we can compare
|
|
||||||
StrCmp $3 "$0$\r$\n" unRemoveFromPath_dosLoopRemoveLine
|
|
||||||
StrCmp $3 "$0$\n" unRemoveFromPath_dosLoopRemoveLine
|
|
||||||
StrCmp $3 "$0" unRemoveFromPath_dosLoopRemoveLine
|
|
||||||
StrCmp $3 "" unRemoveFromPath_dosLoopEnd
|
|
||||||
FileWrite $2 $3
|
|
||||||
Goto unRemoveFromPath_dosLoop
|
|
||||||
unRemoveFromPath_dosLoopRemoveLine:
|
|
||||||
SetRebootFlag true
|
|
||||||
Goto unRemoveFromPath_dosLoop
|
|
||||||
|
|
||||||
unRemoveFromPath_dosLoopEnd:
|
|
||||||
FileClose $2
|
|
||||||
FileClose $1
|
|
||||||
StrCpy $1 $WINDIR 2
|
|
||||||
Delete "$1\autoexec.bat"
|
|
||||||
CopyFiles /SILENT $4 "$1\autoexec.bat"
|
|
||||||
Delete $4
|
|
||||||
Goto unRemoveFromPath_done
|
|
||||||
|
|
||||||
unRemoveFromPath_NT:
|
|
||||||
ReadRegStr $1 ${WriteEnvStr_RegKey} "PATH"
|
|
||||||
StrCpy $5 $1 1 -1 # copy last char
|
|
||||||
StrCmp $5 ";" +2 # if last char != ;
|
|
||||||
StrCpy $1 "$1;" # append ;
|
|
||||||
Push $1
|
|
||||||
Push "$0;"
|
|
||||||
Call un.StrStr ; Find `$0;` in $1
|
|
||||||
Pop $2 ; pos of our dir
|
|
||||||
StrCmp $2 "" unRemoveFromPath_done
|
|
||||||
; else, it is in path
|
|
||||||
# $0 - path to add
|
|
||||||
# $1 - path var
|
|
||||||
StrLen $3 "$0;"
|
|
||||||
StrLen $4 $2
|
|
||||||
StrCpy $5 $1 -$4 # $5 is now the part before the path to remove
|
|
||||||
StrCpy $6 $2 "" $3 # $6 is now the part after the path to remove
|
|
||||||
StrCpy $3 $5$6
|
|
||||||
|
|
||||||
StrCpy $5 $3 1 -1 # copy last char
|
|
||||||
StrCmp $5 ";" 0 +2 # if last char == ;
|
|
||||||
StrCpy $3 $3 -1 # remove last char
|
|
||||||
|
|
||||||
WriteRegExpandStr ${WriteEnvStr_RegKey} "PATH" $3
|
|
||||||
SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
|
|
||||||
|
|
||||||
unRemoveFromPath_done:
|
|
||||||
Pop $6
|
|
||||||
Pop $5
|
|
||||||
Pop $4
|
|
||||||
Pop $3
|
|
||||||
Pop $2
|
|
||||||
Pop $1
|
|
||||||
Pop $0
|
|
||||||
FunctionEnd
|
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
; Uninstall stuff
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
###########################################
|
|
||||||
# Utility Functions #
|
|
||||||
###########################################
|
|
||||||
|
|
||||||
;====================================================
|
|
||||||
; IsNT - Returns 1 if the current system is NT, 0
|
|
||||||
; otherwise.
|
|
||||||
; Output: head of the stack
|
|
||||||
;====================================================
|
|
||||||
; IsNT
|
|
||||||
; no input
|
|
||||||
; output, top of the stack = 1 if NT or 0 if not
|
|
||||||
;
|
|
||||||
; Usage:
|
|
||||||
; Call IsNT
|
|
||||||
; Pop $R0
|
|
||||||
; ($R0 at this point is 1 or 0)
|
|
||||||
|
|
||||||
!macro IsNT un
|
|
||||||
Function ${un}IsNT
|
|
||||||
Push $0
|
|
||||||
ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion
|
|
||||||
StrCmp $0 "" 0 IsNT_yes
|
|
||||||
; we are not NT.
|
|
||||||
Pop $0
|
|
||||||
Push 0
|
|
||||||
Return
|
|
||||||
|
|
||||||
IsNT_yes:
|
|
||||||
; NT!!!
|
|
||||||
Pop $0
|
|
||||||
Push 1
|
|
||||||
FunctionEnd
|
|
||||||
!macroend
|
|
||||||
!insertmacro IsNT ""
|
|
||||||
!insertmacro IsNT "un."
|
|
||||||
|
|
||||||
; StrStr
|
|
||||||
; input, top of stack = string to search for
|
|
||||||
; top of stack-1 = string to search in
|
|
||||||
; output, top of stack (replaces with the portion of the string remaining)
|
|
||||||
; modifies no other variables.
|
|
||||||
;
|
|
||||||
; Usage:
|
|
||||||
; Push "this is a long ass string"
|
|
||||||
; Push "ass"
|
|
||||||
; Call StrStr
|
|
||||||
; Pop $R0
|
|
||||||
; ($R0 at this point is "ass string")
|
|
||||||
|
|
||||||
!macro StrStr un
|
|
||||||
Function ${un}StrStr
|
|
||||||
Exch $R1 ; st=haystack,old$R1, $R1=needle
|
|
||||||
Exch ; st=old$R1,haystack
|
|
||||||
Exch $R2 ; st=old$R1,old$R2, $R2=haystack
|
|
||||||
Push $R3
|
|
||||||
Push $R4
|
|
||||||
Push $R5
|
|
||||||
StrLen $R3 $R1
|
|
||||||
StrCpy $R4 0
|
|
||||||
; $R1=needle
|
|
||||||
; $R2=haystack
|
|
||||||
; $R3=len(needle)
|
|
||||||
; $R4=cnt
|
|
||||||
; $R5=tmp
|
|
||||||
loop:
|
|
||||||
StrCpy $R5 $R2 $R3 $R4
|
|
||||||
StrCmp $R5 $R1 done
|
|
||||||
StrCmp $R5 "" done
|
|
||||||
IntOp $R4 $R4 + 1
|
|
||||||
Goto loop
|
|
||||||
done:
|
|
||||||
StrCpy $R1 $R2 "" $R4
|
|
||||||
Pop $R5
|
|
||||||
Pop $R4
|
|
||||||
Pop $R3
|
|
||||||
Pop $R2
|
|
||||||
Exch $R1
|
|
||||||
FunctionEnd
|
|
||||||
!macroend
|
|
||||||
!insertmacro StrStr ""
|
|
||||||
!insertmacro StrStr "un."
|
|
||||||
|
|
||||||
Function Trim ; Added by Pelaca
|
|
||||||
Exch $R1
|
|
||||||
Push $R2
|
|
||||||
Loop:
|
|
||||||
StrCpy $R2 "$R1" 1 -1
|
|
||||||
StrCmp "$R2" " " RTrim
|
|
||||||
StrCmp "$R2" "$\n" RTrim
|
|
||||||
StrCmp "$R2" "$\r" RTrim
|
|
||||||
StrCmp "$R2" ";" RTrim
|
|
||||||
GoTo Done
|
|
||||||
RTrim:
|
|
||||||
StrCpy $R1 "$R1" -1
|
|
||||||
Goto Loop
|
|
||||||
Done:
|
|
||||||
Pop $R2
|
|
||||||
Exch $R1
|
|
||||||
FunctionEnd
|
|
||||||
|
|
||||||
Function ConditionalAddToRegistry
|
|
||||||
Pop $0
|
|
||||||
Pop $1
|
|
||||||
StrCmp "$0" "" ConditionalAddToRegistry_EmptyString
|
|
||||||
WriteRegStr SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_NAME@" \
|
|
||||||
"$1" "$0"
|
|
||||||
;MessageBox MB_OK "Set Registry: '$1' to '$0'"
|
|
||||||
DetailPrint "Set install registry entry: '$1' to '$0'"
|
|
||||||
ConditionalAddToRegistry_EmptyString:
|
|
||||||
FunctionEnd
|
|
||||||
|
|
||||||
;--------------------------------
|
|
||||||
|
|
||||||
!ifdef CPACK_USES_DOWNLOAD
|
|
||||||
Function DownloadFile
|
|
||||||
IfFileExists $INSTDIR\* +2
|
|
||||||
CreateDirectory $INSTDIR
|
|
||||||
Pop $0
|
|
||||||
|
|
||||||
; Skip if already downloaded
|
|
||||||
IfFileExists $INSTDIR\$0 0 +2
|
|
||||||
Return
|
|
||||||
|
|
||||||
StrCpy $1 "@CPACK_DOWNLOAD_SITE@"
|
|
||||||
|
|
||||||
try_again:
|
|
||||||
NSISdl::download "$1/$0" "$INSTDIR\$0"
|
|
||||||
|
|
||||||
Pop $1
|
|
||||||
StrCmp $1 "success" success
|
|
||||||
StrCmp $1 "Cancelled" cancel
|
|
||||||
MessageBox MB_OK "Download failed: $1"
|
|
||||||
cancel:
|
|
||||||
Return
|
|
||||||
success:
|
|
||||||
FunctionEnd
|
|
||||||
!endif
|
|
||||||
|
|
||||||
;--------------------------------
|
|
||||||
; Installation types
|
|
||||||
@CPACK_NSIS_INSTALLATION_TYPES@
|
|
||||||
|
|
||||||
;--------------------------------
|
|
||||||
; Component sections
|
|
||||||
@CPACK_NSIS_COMPONENT_SECTIONS@
|
|
||||||
|
|
||||||
;--------------------------------
|
|
||||||
; Define some macro setting for the gui
|
|
||||||
@CPACK_NSIS_INSTALLER_MUI_ICON_CODE@
|
|
||||||
@CPACK_NSIS_INSTALLER_ICON_CODE@
|
|
||||||
@CPACK_NSIS_INSTALLER_MUI_COMPONENTS_DESC@
|
|
||||||
|
|
||||||
;--------------------------------
|
|
||||||
;Pages
|
|
||||||
!define MUI_LANGDLL_REGISTRY_ROOT "SHCTX"
|
|
||||||
!define MUI_LANGDLL_REGISTRY_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_NAME@"
|
|
||||||
!define MUI_LANGDLL_REGISTRY_VALUENAME "NSIS:Language"
|
|
||||||
|
|
||||||
!insertmacro MUI_PAGE_WELCOME
|
|
||||||
|
|
||||||
!insertmacro MUI_PAGE_LICENSE "@CPACK_RESOURCE_FILE_LICENSE@"
|
|
||||||
!insertmacro MUI_PAGE_DIRECTORY
|
|
||||||
|
|
||||||
;Start Menu Folder Page Configuration
|
|
||||||
!define MUI_STARTMENUPAGE_REGISTRY_ROOT "SHCTX"
|
|
||||||
!define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@"
|
|
||||||
!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder"
|
|
||||||
!insertmacro MUI_PAGE_STARTMENU Application $STARTMENU_FOLDER
|
|
||||||
|
|
||||||
@CPACK_NSIS_PAGE_COMPONENTS@
|
|
||||||
|
|
||||||
!insertmacro MUI_PAGE_INSTFILES
|
|
||||||
|
|
||||||
!define MUI_FINISHPAGE_SHOWREADME "$INSTDIR\doc\README.txt"
|
|
||||||
!insertmacro MUI_PAGE_FINISH
|
|
||||||
|
|
||||||
!insertmacro MUI_UNPAGE_CONFIRM
|
|
||||||
!insertmacro MUI_UNPAGE_INSTFILES
|
|
||||||
|
|
||||||
;--------------------------------
|
|
||||||
;Languages
|
|
||||||
|
|
||||||
!insertmacro MUI_LANGUAGE "Dutch"
|
|
||||||
!insertmacro MUI_LANGUAGE "English"
|
|
||||||
!insertmacro MUI_LANGUAGE "French"
|
|
||||||
!insertmacro MUI_LANGUAGE "German"
|
|
||||||
!insertmacro MUI_LANGUAGE "Italian"
|
|
||||||
!insertmacro MUI_LANGUAGE "Portuguese"
|
|
||||||
!insertmacro MUI_LANGUAGE "Spanish"
|
|
||||||
|
|
||||||
;--------------------------------
|
|
||||||
;Installer Sections
|
|
||||||
|
|
||||||
Section "-Core installation"
|
|
||||||
;Use the entire tree produced by the INSTALL target. Keep the
|
|
||||||
;list of directories here in sync with the RMDir commands below.
|
|
||||||
SetOutPath "$INSTDIR"
|
|
||||||
@CPACK_NSIS_FULL_INSTALL@
|
|
||||||
|
|
||||||
;Store installation folder
|
|
||||||
WriteRegStr SHCTX "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "" $INSTDIR
|
|
||||||
|
|
||||||
;Create uninstaller
|
|
||||||
WriteUninstaller "$INSTDIR\Uninstall.exe"
|
|
||||||
Push "DisplayName"
|
|
||||||
Push "@CPACK_NSIS_DISPLAY_NAME@"
|
|
||||||
Call ConditionalAddToRegistry
|
|
||||||
Push "DisplayVersion"
|
|
||||||
Push "@CPACK_PACKAGE_VERSION@"
|
|
||||||
Call ConditionalAddToRegistry
|
|
||||||
Push "Publisher"
|
|
||||||
Push "@CPACK_PACKAGE_VENDOR@"
|
|
||||||
Call ConditionalAddToRegistry
|
|
||||||
Push "UninstallString"
|
|
||||||
Push "$INSTDIR\Uninstall.exe"
|
|
||||||
Call ConditionalAddToRegistry
|
|
||||||
Push "NoRepair"
|
|
||||||
Push "1"
|
|
||||||
Call ConditionalAddToRegistry
|
|
||||||
|
|
||||||
!ifdef CPACK_NSIS_ADD_REMOVE
|
|
||||||
;Create add/remove functionality
|
|
||||||
Push "ModifyPath"
|
|
||||||
Push "$INSTDIR\AddRemove.exe"
|
|
||||||
Call ConditionalAddToRegistry
|
|
||||||
!else
|
|
||||||
Push "NoModify"
|
|
||||||
Push "1"
|
|
||||||
Call ConditionalAddToRegistry
|
|
||||||
!endif
|
|
||||||
|
|
||||||
; Optional registration
|
|
||||||
Push "DisplayIcon"
|
|
||||||
Push "$INSTDIR\@CPACK_NSIS_INSTALLED_ICON_NAME@"
|
|
||||||
Call ConditionalAddToRegistry
|
|
||||||
Push "HelpLink"
|
|
||||||
Push "@CPACK_NSIS_HELP_LINK@"
|
|
||||||
Call ConditionalAddToRegistry
|
|
||||||
Push "URLInfoAbout"
|
|
||||||
Push "@CPACK_NSIS_URL_INFO_ABOUT@"
|
|
||||||
Call ConditionalAddToRegistry
|
|
||||||
Push "Contact"
|
|
||||||
Push "@CPACK_NSIS_CONTACT@"
|
|
||||||
Call ConditionalAddToRegistry
|
|
||||||
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
|
|
||||||
|
|
||||||
;Create shortcuts
|
|
||||||
CreateDirectory "$SMPROGRAMS\$STARTMENU_FOLDER"
|
|
||||||
@CPACK_NSIS_CREATE_ICONS@
|
|
||||||
@CPACK_NSIS_CREATE_ICONS_EXTRA@
|
|
||||||
CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Uninstall.lnk" "$INSTDIR\Uninstall.exe"
|
|
||||||
|
|
||||||
; Write special uninstall registry entries
|
|
||||||
Push "StartMenu"
|
|
||||||
Push "$STARTMENU_FOLDER"
|
|
||||||
Call ConditionalAddToRegistry
|
|
||||||
Push "DoNotAddToPath"
|
|
||||||
Push "$DO_NOT_ADD_TO_PATH"
|
|
||||||
Call ConditionalAddToRegistry
|
|
||||||
Push "AddToPathAllUsers"
|
|
||||||
Push "$ADD_TO_PATH_ALL_USERS"
|
|
||||||
Call ConditionalAddToRegistry
|
|
||||||
Push "AddToPathCurrentUser"
|
|
||||||
Push "$ADD_TO_PATH_CURRENT_USER"
|
|
||||||
Call ConditionalAddToRegistry
|
|
||||||
Push "InstallToDesktop"
|
|
||||||
Push "$INSTALL_DESKTOP"
|
|
||||||
Call ConditionalAddToRegistry
|
|
||||||
|
|
||||||
@CPACK_NSIS_EXTRA_INSTALL_COMMANDS@
|
|
||||||
|
|
||||||
!insertmacro MUI_STARTMENU_WRITE_END
|
|
||||||
|
|
||||||
SectionEnd
|
|
||||||
|
|
||||||
;--------------------------------
|
|
||||||
; determine admin versus local install
|
|
||||||
Function un.onInit
|
|
||||||
|
|
||||||
ClearErrors
|
|
||||||
UserInfo::GetName
|
|
||||||
IfErrors noLM
|
|
||||||
Pop $0
|
|
||||||
UserInfo::GetAccountType
|
|
||||||
Pop $1
|
|
||||||
StrCmp $1 "Admin" 0 +3
|
|
||||||
SetShellVarContext all
|
|
||||||
;MessageBox MB_OK 'User "$0" is in the Admin group'
|
|
||||||
Goto done
|
|
||||||
StrCmp $1 "Power" 0 +3
|
|
||||||
SetShellVarContext all
|
|
||||||
;MessageBox MB_OK 'User "$0" is in the Power Users group'
|
|
||||||
Goto done
|
|
||||||
|
|
||||||
noLM:
|
|
||||||
;Get installation folder from registry if available
|
|
||||||
|
|
||||||
done:
|
|
||||||
|
|
||||||
!insertmacro MUI_UNGETLANGUAGE
|
|
||||||
FunctionEnd
|
|
||||||
|
|
||||||
;--- Add/Remove callback functions: ---
|
|
||||||
!macro SectionList MacroName
|
|
||||||
;This macro used to perform operation on multiple sections.
|
|
||||||
;List all of your components in following manner here.
|
|
||||||
@CPACK_NSIS_COMPONENT_SECTION_LIST@
|
|
||||||
!macroend
|
|
||||||
|
|
||||||
Section -FinishComponents
|
|
||||||
;Removes unselected components and writes component status to registry
|
|
||||||
!insertmacro SectionList "FinishSection"
|
|
||||||
|
|
||||||
!ifdef CPACK_NSIS_ADD_REMOVE
|
|
||||||
; Get the name of the installer executable
|
|
||||||
System::Call 'kernel32::GetModuleFileNameA(i 0, t .R0, i 1024) i r1'
|
|
||||||
StrCpy $R3 $R0
|
|
||||||
|
|
||||||
; Strip off the last 13 characters, to see if we have AddRemove.exe
|
|
||||||
StrLen $R1 $R0
|
|
||||||
IntOp $R1 $R0 - 13
|
|
||||||
StrCpy $R2 $R0 13 $R1
|
|
||||||
StrCmp $R2 "AddRemove.exe" addremove_installed
|
|
||||||
|
|
||||||
; We're not running AddRemove.exe, so install it
|
|
||||||
CopyFiles $R3 $INSTDIR\AddRemove.exe
|
|
||||||
|
|
||||||
addremove_installed:
|
|
||||||
!endif
|
|
||||||
SectionEnd
|
|
||||||
;--- End of Add/Remove callback functions ---
|
|
||||||
|
|
||||||
;--------------------------------
|
|
||||||
; Component dependencies
|
|
||||||
Function .onSelChange
|
|
||||||
!insertmacro SectionList MaybeSelectionChanged
|
|
||||||
FunctionEnd
|
|
||||||
|
|
||||||
;--------------------------------
|
|
||||||
;Uninstaller Section
|
|
||||||
|
|
||||||
Section "Uninstall"
|
|
||||||
ReadRegStr $START_MENU SHCTX \
|
|
||||||
"Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_NAME@" "StartMenu"
|
|
||||||
;MessageBox MB_OK "Start menu is in: $START_MENU"
|
|
||||||
ReadRegStr $DO_NOT_ADD_TO_PATH SHCTX \
|
|
||||||
"Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_NAME@" "DoNotAddToPath"
|
|
||||||
ReadRegStr $ADD_TO_PATH_ALL_USERS SHCTX \
|
|
||||||
"Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_NAME@" "AddToPathAllUsers"
|
|
||||||
ReadRegStr $ADD_TO_PATH_CURRENT_USER SHCTX \
|
|
||||||
"Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_NAME@" "AddToPathCurrentUser"
|
|
||||||
;MessageBox MB_OK "Add to path: $DO_NOT_ADD_TO_PATH all users: $ADD_TO_PATH_ALL_USERS"
|
|
||||||
ReadRegStr $INSTALL_DESKTOP SHCTX \
|
|
||||||
"Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_NAME@" "InstallToDesktop"
|
|
||||||
;MessageBox MB_OK "Install to desktop: $INSTALL_DESKTOP "
|
|
||||||
|
|
||||||
@CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS@
|
|
||||||
|
|
||||||
;Remove files we installed.
|
|
||||||
;Keep the list of directories here in sync with the File commands above.
|
|
||||||
@CPACK_NSIS_DELETE_FILES@
|
|
||||||
@CPACK_NSIS_DELETE_DIRECTORIES@
|
|
||||||
|
|
||||||
!ifdef CPACK_NSIS_ADD_REMOVE
|
|
||||||
;Remove the add/remove program
|
|
||||||
Delete "$INSTDIR\AddRemove.exe"
|
|
||||||
!endif
|
|
||||||
|
|
||||||
;Remove the uninstaller itself.
|
|
||||||
Delete "$INSTDIR\Uninstall.exe"
|
|
||||||
DeleteRegKey SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_NAME@"
|
|
||||||
|
|
||||||
;Remove the installation directory if it is empty.
|
|
||||||
RMDir "$INSTDIR"
|
|
||||||
|
|
||||||
; Remove the registry entries.
|
|
||||||
DeleteRegKey SHCTX "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@"
|
|
||||||
|
|
||||||
; Removes all optional components
|
|
||||||
!insertmacro SectionList "RemoveSection_CPack"
|
|
||||||
|
|
||||||
!insertmacro MUI_STARTMENU_GETFOLDER Application $MUI_TEMP
|
|
||||||
|
|
||||||
Delete "$SMPROGRAMS\$MUI_TEMP\Uninstall.lnk"
|
|
||||||
@CPACK_NSIS_DELETE_ICONS@
|
|
||||||
@CPACK_NSIS_DELETE_ICONS_EXTRA@
|
|
||||||
|
|
||||||
;Delete empty start menu parent directories
|
|
||||||
StrCpy $MUI_TEMP "$SMPROGRAMS\$MUI_TEMP"
|
|
||||||
|
|
||||||
startMenuDeleteLoop:
|
|
||||||
ClearErrors
|
|
||||||
RMDir $MUI_TEMP
|
|
||||||
GetFullPathName $MUI_TEMP "$MUI_TEMP\.."
|
|
||||||
|
|
||||||
IfErrors startMenuDeleteLoopDone
|
|
||||||
|
|
||||||
StrCmp "$MUI_TEMP" "$SMPROGRAMS" startMenuDeleteLoopDone startMenuDeleteLoop
|
|
||||||
startMenuDeleteLoopDone:
|
|
||||||
|
|
||||||
; If the user changed the shortcut, then uninstall may not work. This should
|
|
||||||
; try to fix it.
|
|
||||||
StrCpy $MUI_TEMP "$START_MENU"
|
|
||||||
Delete "$SMPROGRAMS\$MUI_TEMP\Uninstall.lnk"
|
|
||||||
@CPACK_NSIS_DELETE_ICONS_EXTRA@
|
|
||||||
|
|
||||||
;Delete empty start menu parent directories
|
|
||||||
StrCpy $MUI_TEMP "$SMPROGRAMS\$MUI_TEMP"
|
|
||||||
|
|
||||||
secondStartMenuDeleteLoop:
|
|
||||||
ClearErrors
|
|
||||||
RMDir $MUI_TEMP
|
|
||||||
GetFullPathName $MUI_TEMP "$MUI_TEMP\.."
|
|
||||||
|
|
||||||
IfErrors secondStartMenuDeleteLoopDone
|
|
||||||
|
|
||||||
StrCmp "$MUI_TEMP" "$SMPROGRAMS" secondStartMenuDeleteLoopDone secondStartMenuDeleteLoop
|
|
||||||
secondStartMenuDeleteLoopDone:
|
|
||||||
|
|
||||||
DeleteRegKey /ifempty SHCTX "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@"
|
|
||||||
|
|
||||||
Push $INSTDIR\bin
|
|
||||||
StrCmp $DO_NOT_ADD_TO_PATH_ "1" doNotRemoveFromPath 0
|
|
||||||
Call un.RemoveFromPath
|
|
||||||
doNotRemoveFromPath:
|
|
||||||
SectionEnd
|
|
||||||
|
|
||||||
;--------------------------------
|
|
||||||
; determine admin versus local install
|
|
||||||
; Is install for "AllUsers" or "JustMe"?
|
|
||||||
; Default to "JustMe" - set to "AllUsers" if admin or on Win9x
|
|
||||||
; This function is used for the very first "custom page" of the installer.
|
|
||||||
; This custom page does not show up visibly, but it executes prior to the
|
|
||||||
; first visible page and sets up $INSTDIR properly...
|
|
||||||
; Choose different default installation folder based on SV_ALLUSERS...
|
|
||||||
; "Program Files" for AllUsers, "My Documents" for JustMe...
|
|
||||||
|
|
||||||
Function .onInit
|
|
||||||
!insertmacro MUI_LANGDLL_DISPLAY
|
|
||||||
; Reads components status for registry
|
|
||||||
!insertmacro SectionList "InitSection"
|
|
||||||
|
|
||||||
StrCpy $SV_ALLUSERS "JustMe"
|
|
||||||
StrCpy $INSTDIR "$DOCUMENTS\@CPACK_PACKAGE_INSTALL_DIRECTORY@"
|
|
||||||
|
|
||||||
ClearErrors
|
|
||||||
UserInfo::GetName
|
|
||||||
IfErrors noLM
|
|
||||||
Pop $0
|
|
||||||
UserInfo::GetAccountType
|
|
||||||
Pop $1
|
|
||||||
StrCmp $1 "Admin" 0 +3
|
|
||||||
SetShellVarContext all
|
|
||||||
;MessageBox MB_OK 'User "$0" is in the Admin group'
|
|
||||||
StrCpy $SV_ALLUSERS "AllUsers"
|
|
||||||
Goto done
|
|
||||||
StrCmp $1 "Power" 0 +3
|
|
||||||
SetShellVarContext all
|
|
||||||
;MessageBox MB_OK 'User "$0" is in the Power Users group'
|
|
||||||
StrCpy $SV_ALLUSERS "AllUsers"
|
|
||||||
Goto done
|
|
||||||
|
|
||||||
noLM:
|
|
||||||
StrCpy $SV_ALLUSERS "AllUsers"
|
|
||||||
;Get installation folder from registry if available
|
|
||||||
|
|
||||||
done:
|
|
||||||
StrCmp $SV_ALLUSERS "AllUsers" 0 +2
|
|
||||||
StrCpy $INSTDIR "$PROGRAMFILES\@CPACK_PACKAGE_INSTALL_DIRECTORY@"
|
|
||||||
|
|
||||||
FunctionEnd
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
# This file is external to the read_from_file macro in Anope.cmake in order to
|
|
||||||
# get around a possible memory leak in older versions of CMake.
|
|
||||||
|
|
||||||
file(READ "${FILE}" RESULT)
|
|
||||||
message("${RESULT}")
|
|
||||||
Vendored
+1526
File diff suppressed because it is too large
Load Diff
Vendored
+1662
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
+306
@@ -0,0 +1,306 @@
|
|||||||
|
dnl autoconf.in for Services.
|
||||||
|
dnl
|
||||||
|
dnl Anope (c) 2003-2014 Anope Team
|
||||||
|
dnl Contact us at team@anope.org
|
||||||
|
|
||||||
|
dnl This program is free but copyrighted software; see the file COPYING for
|
||||||
|
dnl details.
|
||||||
|
|
||||||
|
dnl Based heavily on the Unreal configure.in script, and extra thanks to
|
||||||
|
dnl codemastr from UnrealIRCD.
|
||||||
|
|
||||||
|
AC_INIT
|
||||||
|
|
||||||
|
# If no bindir, we tell him to run ./Config.
|
||||||
|
if test "${with_bindir+set}" != set || test "${with_datadir+set}" != set; then
|
||||||
|
echo "You might want to run ./Config or provide some parameters to this script."
|
||||||
|
echo "./configure --help for information about this script"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
AC_CONFIG_SRCDIR([src/actions.c])
|
||||||
|
AC_CONFIG_HEADER(include/sysconf.h)
|
||||||
|
AC_PROG_CC
|
||||||
|
if test "$ac_cv_c_compiler_gnu" = "yes"; then
|
||||||
|
# CFLAGS="$CFLAGS -funsigned-char"
|
||||||
|
AC_CACHE_CHECK(if gcc has a working -pipe, ac_cv_pipe, [
|
||||||
|
save_cflags="$CFLAGS"
|
||||||
|
CFLAGS="$CFLAGS -pipe"
|
||||||
|
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],[ac_cv_pipe="yes"],[ac_cv_pipe="no"])
|
||||||
|
CFLAGS="$save_cflags"
|
||||||
|
])
|
||||||
|
if test "$ac_cv_pipe" = "yes"; then
|
||||||
|
CFLAGS="-pipe $CFLAGS"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
dnl CFLAGS="$CFLAGS -W -Wall"
|
||||||
|
|
||||||
|
AC_PATH_PROG(RM,rm)
|
||||||
|
AC_PATH_PROG(CP,cp)
|
||||||
|
AC_PATH_PROG(TOUCH,touch)
|
||||||
|
AC_PATH_PROG(INSTALL,install)
|
||||||
|
AC_CHECK_LIB(nsl,inet_ntoa,ANOPELIBS="$ANOPELIBS-lnsl ")
|
||||||
|
AC_CHECK_LIB(socket, socket,ANOPELIBS="$ANOPELIBS-lsocket ")
|
||||||
|
AC_CHECK_LIB(resolv, res_query,ANOPELIBS="$ANOPELIBS-lresolv ")
|
||||||
|
AC_CHECK_LIB(bsd, revoke,ANOPELIBS="$ANOPELIBS-lbsd ")
|
||||||
|
|
||||||
|
dnl Does this platform require array notation to assign to a va_list?
|
||||||
|
dnl If cross-compiling, we assume va_list is "normal". If this breaks
|
||||||
|
dnl you, set ac_cv_valistisarray=true and maybe define HAVE_VA_LIST_AS_ARRAY
|
||||||
|
dnl also just to be sure.
|
||||||
|
|
||||||
|
dnl NOTE: this autoconf test is taken from mozilla: www.mozilla.org.
|
||||||
|
|
||||||
|
AC_MSG_CHECKING(whether va_list assignments need array notation)
|
||||||
|
AC_CACHE_VAL(ac_cv_valistisarray,
|
||||||
|
[AC_RUN_IFELSE([AC_LANG_SOURCE([[#include <stdlib.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
void foo(int i, ...) {
|
||||||
|
va_list ap1, ap2;
|
||||||
|
va_start(ap1, i);
|
||||||
|
ap2 = ap1;
|
||||||
|
if (va_arg(ap2, int) != 123 || va_arg(ap1, int) != 123) { exit(1); }
|
||||||
|
va_end(ap1); va_end(ap2);
|
||||||
|
}
|
||||||
|
int main()
|
||||||
|
{ foo(0, 123); return(0); }]])],[ac_cv_valistisarray=false],[ac_cv_valistisarray=true],[ac_cv_valistisarray=false])])
|
||||||
|
|
||||||
|
if test "$ac_cv_valistisarray" = true ; then
|
||||||
|
AC_DEFINE(HAVE_VA_LIST_AS_ARRAY,[1],[va_list as array])
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
DIS_MYSQL=" MySQL: No"
|
||||||
|
AC_ARG_WITH(mysql, [ --without-mysql Do not use MySQL or attempt to find it],,[
|
||||||
|
AC_ARG_WITH(mysqlconfig-path, [ --with-mysqlconfig-path=PATH Complete path to the mysql_config executable],
|
||||||
|
mysql_config_path="$withval", mysql_config_path="")
|
||||||
|
MYSQLCONF=""
|
||||||
|
if test "$mysql_config_path" != ""; then
|
||||||
|
if test -x "$mysql_config_path"; then
|
||||||
|
MYSQLCONF="$mysql_config_path"
|
||||||
|
echo "checking for mysql_config... $MYSQLCONF" >&6
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if test "$MYSQLCONF" = ""; then
|
||||||
|
AC_PATH_PROG(MYSQLCONF,mysql_config, "")
|
||||||
|
fi
|
||||||
|
if test "$MYSQLCONF" != ""; then
|
||||||
|
hold_cflags="$CFLAGS"
|
||||||
|
hold_ldflags="$LDFLAGS"
|
||||||
|
if test "$MYSQL_CFLAGS" = ""; then
|
||||||
|
MYSQL_CFLAGS="`$MYSQLCONF --cflags`"
|
||||||
|
fi
|
||||||
|
if test "$MYSQL_LDFLAGS" = ""; then
|
||||||
|
MYSQL_LDFLAGS="`$MYSQLCONF --libs`"
|
||||||
|
fi
|
||||||
|
CFLAGS="$CFLAGS $MYSQL_CFLAGS"
|
||||||
|
LDFLAGS="$LDFLAGS $MYSQL_LDFLAGS"
|
||||||
|
LIBS="$MYSQL_LDFLAGS"
|
||||||
|
echo $ECHO_N "checking if mysql_config produces valid values... $ECHO_C" >&6
|
||||||
|
AC_RUN_IFELSE([AC_LANG_SOURCE([[
|
||||||
|
#include <mysql.h>
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
MYSQL *mysql = mysql_init(0);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
]])],[ac_cv_mysql_valid=yes],[ac_cv_mysql_valid=no],[])
|
||||||
|
echo $ac_cv_mysql_valid >&6
|
||||||
|
if test "$ac_cv_mysql_valid" = "yes"; then
|
||||||
|
AC_DEFINE_UNQUOTED(USE_MYSQL,1,"Use Mysql")
|
||||||
|
AC_DEFINE_UNQUOTED(USE_RDB,1,"Use RDB")
|
||||||
|
MYSQL=" mysql.c "
|
||||||
|
RDB=" rdb.c "
|
||||||
|
AC_SUBST(MYSQL)
|
||||||
|
AC_SUBST(RDB)
|
||||||
|
DIS_MYSQL=" MySQL: Yes"
|
||||||
|
else
|
||||||
|
CFLAGS="$hold_cflags"
|
||||||
|
LDFLAGS="$hold_ldflags"
|
||||||
|
LIBS=""
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_MSG_CHECKING(whether this is a bit or little endian system)
|
||||||
|
AC_RUN_IFELSE([AC_LANG_SOURCE([[
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
short s = 1;
|
||||||
|
short* ptr = &s;
|
||||||
|
unsigned char c = *((char*)ptr);
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
]])],[AC_DEFINE(BIG_ENDIAN)
|
||||||
|
AC_MSG_RESULT(big)
|
||||||
|
],[AC_DEFINE(LITTLE_ENDIAN)
|
||||||
|
AC_MSG_RESULT(little)
|
||||||
|
],[])
|
||||||
|
|
||||||
|
AC_SUBST(ANOPELIBS)
|
||||||
|
AC_SUBST(LDFLAGS)
|
||||||
|
|
||||||
|
AC_CHECK_HEADER(sys/types.h,AC_DEFINE(HAS_SYS_TYPES_H,1,"Has sys/types.h"))
|
||||||
|
|
||||||
|
DIS_MODULES="Modules: Yes"
|
||||||
|
|
||||||
|
dnl module checking based on Unreal's module checking code
|
||||||
|
AC_DEFUN(AC_ENABLE_DYN,
|
||||||
|
[
|
||||||
|
AC_CHECK_FUNC(dlopen,, AC_CHECK_LIB(dl,dlopen,[
|
||||||
|
ANOPELIBS="$ANOPELIBS -ldl"
|
||||||
|
AC_DEFINE(USE_MODULES,1,"Modules are available")
|
||||||
|
USE_MODULES="yes"
|
||||||
|
DIS_MODULES="Modules: Yes"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
AC_MSG_WARN(Dynamic linking is not enabled because dlopen was not found)
|
||||||
|
AC_DEFINE(STATIC_LINKING,"NO_MODULES","modules not available")
|
||||||
|
DIS_MODULES="Modules: No"
|
||||||
|
]))
|
||||||
|
|
||||||
|
hold_cflags=$CFLAGS
|
||||||
|
CFLAGS="$CFLAGS -export-dynamic"
|
||||||
|
AC_CACHE_CHECK(if we need the -export-dynamic flag, ac_cv_export_dynamic, [
|
||||||
|
AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[int i;]])],[ac_cv_export_dynamic=yes],[ac_cv_export_dynamic=no])])
|
||||||
|
if test "$ac_cv_export_dynamic" = "no"; then
|
||||||
|
CFLAGS=$hold_cflags
|
||||||
|
fi
|
||||||
|
|
||||||
|
AC_CACHE_CHECK(for compiler option to produce PIC,ac_cv_pic,[
|
||||||
|
if test "$ac_cv_c_compiler_gnu" = "yes"; then
|
||||||
|
ac_cv_pic="-fPIC -DPIC -shared"
|
||||||
|
case `uname -s` in
|
||||||
|
Darwin*[)]
|
||||||
|
ac_cv_pic="-bundle -flat_namespace -undefined suppress"
|
||||||
|
;;
|
||||||
|
HP-UX*[)]
|
||||||
|
ac_cv_pic="-fPIC"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
else
|
||||||
|
case `uname -s` in
|
||||||
|
SunOS*[)]
|
||||||
|
ac_cv_pic="-KPIC -DPIC -G"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
])
|
||||||
|
|
||||||
|
if test "$ac_cv_c_compiler_gnu" = "yes"; then
|
||||||
|
case `uname -s` in
|
||||||
|
Darwin*[)]
|
||||||
|
SHARED="-bundle -flat_namespace -undefined suppress"
|
||||||
|
AC_SUBST(SHARED)
|
||||||
|
;;
|
||||||
|
*[)]
|
||||||
|
SHARED="-shared"
|
||||||
|
AC_SUBST(SHARED)
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
AC_CACHE_CHECK(if your system prepends an underscore on symbols,ac_cv_underscore,[
|
||||||
|
cat >uscore.c << __EOF__
|
||||||
|
int main() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
__EOF__
|
||||||
|
$CC -o uscore $CFLAGS uscore.c 1>&5
|
||||||
|
if test -z "`strings -a uscore |grep '^_main$'`"; then
|
||||||
|
ac_cv_underscore=no
|
||||||
|
else
|
||||||
|
ac_cv_underscore=yes
|
||||||
|
fi
|
||||||
|
|
||||||
|
rm -f uscore uscore.c
|
||||||
|
])
|
||||||
|
if test "$ac_cv_underscore" = "yes"; then
|
||||||
|
AC_DEFINE(DL_PREFIX,"_","Underscore needed for dlopen")
|
||||||
|
else
|
||||||
|
AC_DEFINE(DL_PREFIX,"","No prefix needed for dlopen")
|
||||||
|
fi
|
||||||
|
|
||||||
|
MODULEFLAGS=$ac_cv_pic
|
||||||
|
AC_SUBST(MODULEFLAGS)
|
||||||
|
AC_DEFINE(USE_MODULES,1,"Modules available")
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_ENABLE_DYN
|
||||||
|
anope_CHECK_TYPE_SIZES
|
||||||
|
|
||||||
|
AC_CHECK_HEADER(strings.h,AC_DEFINE(HAVE_STRINGS_H,1,""))
|
||||||
|
AC_CHECK_HEADER(sys/select.h,AC_DEFINE(HAVE_SYS_SELECT_H,1,""))
|
||||||
|
|
||||||
|
AC_CHECK_FUNCS(backtrace,AC_DEFINE(HAVE_BACKTRACE,1))
|
||||||
|
AC_CHECK_FUNCS(strerror,AC_DEFINE(HAVE_STRERROR,1))
|
||||||
|
AC_CHECK_FUNCS(sys_errlist,AC_DEFINE(HAVE_SYS_ERRLIST,1))
|
||||||
|
AC_CHECK_FUNCS(snprintf,AC_DEFINE(HAVE_SNPRINTF,1))
|
||||||
|
AC_CHECK_FUNCS(stricmp,AC_DEFINE(HAVE_STRICMP,1))
|
||||||
|
AC_CHECK_FUNCS(strcasecmp,AC_DEFINE(HAVE_STRCASECMP,1))
|
||||||
|
AC_CHECK_FUNCS(strdup,AC_DEFINE(HAVE_STRDUP,1))
|
||||||
|
AC_CHECK_FUNCS(strspn,AC_DEFINE(HAVE_STRSPN,1))
|
||||||
|
AC_CHECK_FUNCS(strsignal,AC_DEFINE(HAVE_STRSIGNAL,1))
|
||||||
|
AC_CHECK_FUNCS(gettimeofday,AC_DEFINE(HAVE_GETTIMEOFDAY,1))
|
||||||
|
AC_CHECK_FUNCS(setgrent,AC_DEFINE(HAVE_SETGRENT,1))
|
||||||
|
AC_CHECK_FUNCS(umask,AC_DEFINE(HAVE_UMASK,1))
|
||||||
|
AC_CHECK_FUNCS(fork,AC_DEFINE(HAVE_FORK,1))
|
||||||
|
AC_CHECK_FUNCS(gethostbyname,AC_DEFINE(HAVE_GETHOSTBYNAME,1))
|
||||||
|
AC_CHECK_FUNCS(gethostbyname_r,AC_DEFINE(HAVE_GETHOSTBYNAME_R,1))
|
||||||
|
AC_CHECK_FUNCS(strlcpy,AC_DEFINE(HAVE_STRLCPY,1))
|
||||||
|
AC_CHECK_FUNCS(strlcat,AC_DEFINE(HAVE_STRLCAT,1))
|
||||||
|
|
||||||
|
AC_ARG_WITH(rungroup, [ --with-rungroup=group Specify the rungroup for anope], [
|
||||||
|
AC_DEFINE_UNQUOTED(RUNGROUP,"$withval","Run group")
|
||||||
|
RUNGROUP=$withval
|
||||||
|
])
|
||||||
|
AC_SUBST(RUNGROUP)
|
||||||
|
|
||||||
|
dnl AC_DEFINE_UNQUOTED(MYOSNAME,"`uname -a`","uname")
|
||||||
|
|
||||||
|
AC_ARG_WITH(permissions, [ --with-permissions=permissions Specify the default permissions for anope], AC_DEFINE_UNQUOTED(DEFUMASK,$withval,"Default umask permissions"), AC_DEFINE(DEFUMASK, 007,"Default umask Permissions"))
|
||||||
|
|
||||||
|
AC_ARG_WITH(bindir, [ --with-bindir=bindir Specify the default binary dir for anope], [
|
||||||
|
AC_DEFINE_UNQUOTED(SERVICES_BIN,"${withval}/services","Binary Dir")
|
||||||
|
BINDEST=$withval
|
||||||
|
DATDEST=$withval
|
||||||
|
MODULE_PATH=${withval}/modules/
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_SUBST(BINDEST)
|
||||||
|
|
||||||
|
AC_ARG_WITH(datadir, [ --with-datadir=datadir Specify the location of the services data folder], [
|
||||||
|
AC_DEFINE_UNQUOTED(SERVICES_DIR,"$withval","services bin dir")
|
||||||
|
AC_DEFINE_UNQUOTED(MODULE_PATH,"${withval}/modules/","Module dir")
|
||||||
|
DATDEST=$withval
|
||||||
|
MODULE_PATH=${withval}/modules/
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_SUBST(DATDEST)
|
||||||
|
AC_SUBST(MODULE_PATH)
|
||||||
|
|
||||||
|
AC_CONFIG_FILES( \
|
||||||
|
Makefile \
|
||||||
|
src/bin/anoperc \
|
||||||
|
)
|
||||||
|
|
||||||
|
AC_OUTPUT
|
||||||
|
|
||||||
|
cat <<EOT
|
||||||
|
|
||||||
|
$DIS_MODULES
|
||||||
|
$DIS_MYSQL
|
||||||
|
|
||||||
|
All done! Now run "make" (or possibly "gmake") to compile Anope.
|
||||||
|
See the INSTALL, README and FAQ files if you have any problems.
|
||||||
|
EOT
|
||||||
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
# Only install example.chk and example.conf from this directory
|
|
||||||
# NOTE: I would've had this just find all files in the directory, but that would include files not needed (like this file)
|
|
||||||
set(DATA example.chk botserv.example.conf example.conf hostserv.example.conf modules.example.conf operserv.example.conf chanserv.example.conf global.example.conf memoserv.example.conf nickserv.example.conf chanstats.example.conf irc2sql.example.conf stats.standalone.example.conf)
|
|
||||||
install(FILES ${DATA}
|
|
||||||
DESTINATION ${CONF_DIR}
|
|
||||||
)
|
|
||||||
@@ -1,404 +0,0 @@
|
|||||||
/*
|
|
||||||
* Example configuration file for BotServ.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* First, create the service. If you do not want to have a 'BotServ', but do want the ability to have
|
|
||||||
* ChanServ assigned to channels for the use of fantasy commands, you may delete the below 'service' block.
|
|
||||||
*
|
|
||||||
* Note that deleting a 'service' block for a pseudoclient that is already online will not remove the
|
|
||||||
* client, the client becomes no different from a normal service bot, so you will have to use botserv/bot
|
|
||||||
* to manually delete the client.
|
|
||||||
*
|
|
||||||
* You may then want to map some of the below commands to other services, like placing botserv/bot on
|
|
||||||
* OperServ so you can delete the below client, and mapping assign and unassign to ChanServ so users are
|
|
||||||
* able to control whether or not ChanServ is in the channel. You may also want to map botserv/set/nobot
|
|
||||||
* to OperServ so you can restrict who can assign the other core service clients.
|
|
||||||
*/
|
|
||||||
service
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* The name of the BotServ client.
|
|
||||||
* If you change this value, you probably want to change the client directive in the configuration for the botserv module too.
|
|
||||||
*/
|
|
||||||
nick = "BotServ"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The username of the BotServ client.
|
|
||||||
*/
|
|
||||||
user = "services"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The hostname of the BotServ client.
|
|
||||||
*/
|
|
||||||
host = "services.host"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The realname of the BotServ client.
|
|
||||||
*/
|
|
||||||
gecos = "Bot Service"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The modes this client should use.
|
|
||||||
* Do not modify this unless you know what you are doing.
|
|
||||||
*
|
|
||||||
* These modes are very IRCd specific. If left commented, sane defaults
|
|
||||||
* are used based on what protocol module you have loaded.
|
|
||||||
*
|
|
||||||
* Note that setting this option incorrectly could potentially BREAK some, if
|
|
||||||
* not all, usefulness of the client. We will not support you if this client is
|
|
||||||
* unable to do certain things if this option is enabled.
|
|
||||||
*/
|
|
||||||
#modes = "+o"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* An optional comma separated list of channels this service should join. Outside
|
|
||||||
* of log channels this is not very useful, as the service will just idle in the
|
|
||||||
* specified channels, and will not accept any types of commands.
|
|
||||||
*
|
|
||||||
* Prefixes may be given to the channels in the form of mode characters or prefix symbols.
|
|
||||||
*/
|
|
||||||
#channels = "@#services,#mychan"
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Core BotServ module.
|
|
||||||
*
|
|
||||||
* Provides essential functionality for BotServ.
|
|
||||||
*/
|
|
||||||
module
|
|
||||||
{
|
|
||||||
name = "botserv"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The name of the client that should be BotServ.
|
|
||||||
*
|
|
||||||
* This directive is optional.
|
|
||||||
*/
|
|
||||||
client = "BotServ"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The default bot options for newly registered channels. Note that changing these options
|
|
||||||
* will have no effect on channels which are already registered. The list must be separated
|
|
||||||
* by spaces.
|
|
||||||
*
|
|
||||||
* The options are:
|
|
||||||
* - dontkickops: Channel operators will be protected against BotServ kicks
|
|
||||||
* - dontkickvoices: Voiced users will be protected against BotServ kicks
|
|
||||||
* - greet: The channel's BotServ bot will greet incoming users that have set a greet
|
|
||||||
* in their NickServ settings
|
|
||||||
* - fantasy: Enables the use of BotServ fantasy commands in the channel
|
|
||||||
*
|
|
||||||
* This directive is optional, if left blank, there will be no defaults.
|
|
||||||
*/
|
|
||||||
defaults = "greet fantasy"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The minimum number of users there must be in a channel before the bot joins it. The best
|
|
||||||
* value for this setting is 1 or 2. This can be 0, the service bots will not part unless
|
|
||||||
* specifically unassigned, and will keep the channel open.
|
|
||||||
*/
|
|
||||||
minusers = 1
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The bots are currently not affected by any modes or bans when they try to join a channel.
|
|
||||||
* But some people may want to make it act like a real bot, that is, for example, remove all
|
|
||||||
* the bans affecting the bot before joining the channel, remove a ban that affects the bot
|
|
||||||
* set by a user when it is in the channel, and so on. Since it consumes a bit more CPU
|
|
||||||
* time, you should not enable this on larger networks.
|
|
||||||
*
|
|
||||||
* This directive is optional.
|
|
||||||
*/
|
|
||||||
#smartjoin = yes
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Modes to set on service bots when they join channels, comment this out for no modes
|
|
||||||
*
|
|
||||||
* This directive is optional.
|
|
||||||
*/
|
|
||||||
botmodes = "ao"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* User modes to set on service bots. Read the comment about the service:modes directive
|
|
||||||
* on why this can be a bad idea to set.
|
|
||||||
*/
|
|
||||||
#botumodes = "i"
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Core BotServ commands.
|
|
||||||
*
|
|
||||||
* In Anope modules can provide (multiple) commands, each of which has a unique command name. Once these modules
|
|
||||||
* are loaded you can then configure the commands to be added to any client you like with any name you like.
|
|
||||||
*
|
|
||||||
* Additionally, you may provide a permission name that must be in the opertype of users executing the command.
|
|
||||||
*
|
|
||||||
* Sane defaults are provided below that do not need to be edited unless you wish to change the default behavior.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Give it a help command. */
|
|
||||||
command { service = "BotServ"; name = "HELP"; command = "generic/help"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* bs_assign
|
|
||||||
*
|
|
||||||
* Provides the commands:
|
|
||||||
* botserv/assign - Used to assign BotServ bots to channels
|
|
||||||
* botserv/unassign - Used to unassign BotServ bots
|
|
||||||
* botserv/set/nobot - Used to prohibit channels from being assigned BotServ bots.
|
|
||||||
*
|
|
||||||
* Used for assigning and unassigning bots to channels.
|
|
||||||
*/
|
|
||||||
module { name = "bs_assign" }
|
|
||||||
command { service = "BotServ"; name = "ASSIGN"; command = "botserv/assign"; }
|
|
||||||
command { service = "BotServ"; name = "UNASSIGN"; command = "botserv/unassign"; }
|
|
||||||
command { service = "BotServ"; name = "SET NOBOT"; command = "botserv/set/nobot"; permission = "botserv/set/nobot"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* bs_autoassign
|
|
||||||
*
|
|
||||||
* Allows service bots to be automatically assigned to channels upon registration.
|
|
||||||
*/
|
|
||||||
#module
|
|
||||||
{
|
|
||||||
name = "bs_autoassign"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Automatically assign ChanServ to channels upon registration.
|
|
||||||
*/
|
|
||||||
bot = "ChanServ"
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* bs_badwords
|
|
||||||
*
|
|
||||||
* Provides the command botserv/badwords.
|
|
||||||
*
|
|
||||||
* Used for controlling the channel badword list.
|
|
||||||
*/
|
|
||||||
module
|
|
||||||
{
|
|
||||||
name = "bs_badwords"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The maximum number of entries a single bad words list can have.
|
|
||||||
*/
|
|
||||||
badwordsmax = 32
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If set, BotServ will use case sensitive checking for badwords.
|
|
||||||
*
|
|
||||||
* This directive is optional.
|
|
||||||
*/
|
|
||||||
#casesensitive = yes
|
|
||||||
}
|
|
||||||
command { service = "BotServ"; name = "BADWORDS"; command = "botserv/badwords"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* bs_bot
|
|
||||||
*
|
|
||||||
* Provides the command botserv/bot.
|
|
||||||
*
|
|
||||||
* Used for administrating BotServ bots.
|
|
||||||
*/
|
|
||||||
module { name = "bs_bot" }
|
|
||||||
command { service = "BotServ"; name = "BOT"; command = "botserv/bot"; permission = "botserv/bot"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* bs_botlist
|
|
||||||
*
|
|
||||||
* Provides the command botserv/botlist.
|
|
||||||
*
|
|
||||||
* Used for listing all available bots.
|
|
||||||
*/
|
|
||||||
module { name = "bs_botlist" }
|
|
||||||
command { service = "BotServ"; name = "BOTLIST"; command = "botserv/botlist"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* bs_control
|
|
||||||
*
|
|
||||||
* Provides the commands botserv/act and botserv/say.
|
|
||||||
*
|
|
||||||
* Used for making the bot message a channel.
|
|
||||||
*/
|
|
||||||
module { name = "bs_control" }
|
|
||||||
command { service = "BotServ"; name = "ACT"; command = "botserv/act"; }
|
|
||||||
command { service = "BotServ"; name = "SAY"; command = "botserv/say"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* bs_info
|
|
||||||
*
|
|
||||||
* Provides the command botserv/info.
|
|
||||||
*
|
|
||||||
* Used for getting information on bots or channels.
|
|
||||||
*/
|
|
||||||
module { name = "bs_info" }
|
|
||||||
command { service = "BotServ"; name = "INFO"; command = "botserv/info"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* bs_kick
|
|
||||||
*
|
|
||||||
* Provides the commands:
|
|
||||||
* botserv/kick - Dummy help wrapper for the KICK command.
|
|
||||||
* botserv/kick/amsg - Configures BotServ's AMSG kicker.
|
|
||||||
* botserv/kick/badwords - Configures BotServ's badwords kicker.
|
|
||||||
* botserv/kick/bolds - Configures BotServ's bold text kicker.
|
|
||||||
* botserv/kick/caps - Configures BotServ's capital letters kicker.
|
|
||||||
* botserv/kick/colors - Configures BotServ's color kicker.
|
|
||||||
* botserv/kick/flood - Configures BotServ's flood kicker.
|
|
||||||
* botserv/kick/italics - Configures BotServ's italics kicker.
|
|
||||||
* botserv/kick/repeat - Configures BotServ's repeat kicker.
|
|
||||||
* botserv/kick/reverses - Configures BotServ's reverse kicker.
|
|
||||||
* botserv/kick/underlines - Configures BotServ's underline kicker.
|
|
||||||
* botserv/set/dontkickops - Used for preventing BotServ from kicking channel operators.
|
|
||||||
* botserv/set/dontkickvoices - Used for preventing BotServ from kicking voices.
|
|
||||||
*
|
|
||||||
* Used for configuring what bots should kick for.
|
|
||||||
*/
|
|
||||||
module
|
|
||||||
{
|
|
||||||
name = "bs_kick"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The amount of time that data for a user is valid in BotServ. If the data exceeds this time,
|
|
||||||
* it is reset or deleted depending on the case. Do not set it too high, otherwise your
|
|
||||||
* resources will be slightly affected.
|
|
||||||
*/
|
|
||||||
keepdata = 10m
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If set, the bots will use a kick reason that does not state the word when it is kicking.
|
|
||||||
* This is especially useful if you have young people on your network.
|
|
||||||
*
|
|
||||||
* This directive is optional.
|
|
||||||
*/
|
|
||||||
gentlebadwordreason = yes
|
|
||||||
}
|
|
||||||
command { service = "BotServ"; name = "KICK"; command = "botserv/kick"; }
|
|
||||||
command { service = "BotServ"; name = "KICK AMSG"; command = "botserv/kick/amsg"; }
|
|
||||||
command { service = "BotServ"; name = "KICK BADWORDS"; command = "botserv/kick/badwords"; }
|
|
||||||
command { service = "BotServ"; name = "KICK BOLDS"; command = "botserv/kick/bolds"; }
|
|
||||||
command { service = "BotServ"; name = "KICK CAPS"; command = "botserv/kick/caps"; }
|
|
||||||
command { service = "BotServ"; name = "KICK COLORS"; command = "botserv/kick/colors"; }
|
|
||||||
command { service = "BotServ"; name = "KICK FLOOD"; command = "botserv/kick/flood"; }
|
|
||||||
command { service = "BotServ"; name = "KICK ITALICS"; command = "botserv/kick/italics"; }
|
|
||||||
command { service = "BotServ"; name = "KICK REPEAT"; command = "botserv/kick/repeat"; }
|
|
||||||
command { service = "BotServ"; name = "KICK REVERSES"; command = "botserv/kick/reverses"; }
|
|
||||||
command { service = "BotServ"; name = "KICK UNDERLINES"; command = "botserv/kick/underlines"; }
|
|
||||||
|
|
||||||
command { service = "BotServ"; name = "SET DONTKICKOPS"; command = "botserv/set/dontkickops"; }
|
|
||||||
command { service = "BotServ"; name = "SET DONTKICKVOICES"; command = "botserv/set/dontkickvoices"; }
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* bs_set
|
|
||||||
*
|
|
||||||
* Provides the commands:
|
|
||||||
* botserv/set/private - Used to prohibit specific BotServ bots from being assigned to channels.
|
|
||||||
*/
|
|
||||||
module { name = "bs_set" }
|
|
||||||
command { service = "BotServ"; name = "SET"; command = "botserv/set"; }
|
|
||||||
command { service = "BotServ"; name = "SET BANEXPIRE"; command = "botserv/set/banexpire"; }
|
|
||||||
command { service = "BotServ"; name = "SET PRIVATE"; command = "botserv/set/private"; permission = "botserv/set/private"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* greet
|
|
||||||
*
|
|
||||||
* Provides the commands:
|
|
||||||
* botserv/set/greet - Used for enabling or disabling BotServ's greet messages in a channel.
|
|
||||||
* nickserv/set/greet, nickserv/saset/greet - Used for changing a users greet message, which is displayed when they enter channels.
|
|
||||||
*/
|
|
||||||
module { name = "greet" }
|
|
||||||
command { service = "BotServ"; name = "SET GREET"; command = "botserv/set/greet"; }
|
|
||||||
command { service = "NickServ"; name = "SET GREET"; command = "nickserv/set/greet"; }
|
|
||||||
command { service = "NickServ"; name = "SASET GREET"; command = "nickserv/saset/greet"; permission = "nickserv/saset/greet"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* GREET privilege.
|
|
||||||
*
|
|
||||||
* Used by 'greet'.
|
|
||||||
*
|
|
||||||
* Users with this privilege have their greet shown when they join channels.
|
|
||||||
*/
|
|
||||||
privilege
|
|
||||||
{
|
|
||||||
name = "GREET"
|
|
||||||
rank = 40
|
|
||||||
level = 5
|
|
||||||
flag = "g"
|
|
||||||
xop = "AOP"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* fantasy
|
|
||||||
*
|
|
||||||
* Allows fantasy commands (e.g. !kick) to be used in channels.
|
|
||||||
*
|
|
||||||
* Provides the commands:
|
|
||||||
* botserv/set/fantasy - Used for enabling or disabling BotServ's fantasy commands.
|
|
||||||
*/
|
|
||||||
module
|
|
||||||
{
|
|
||||||
name = "fantasy"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Defines the prefixes for fantasy commands in channels. One of these characters will have to be prepended
|
|
||||||
* to all fantasy commands. If you choose "!", for example, fantasy commands will be "!kick",
|
|
||||||
* "!op", etc. This directive is optional, if left out, the default fantasy character is "!".
|
|
||||||
*/
|
|
||||||
#fantasycharacter = "!."
|
|
||||||
}
|
|
||||||
command { service = "BotServ"; name = "SET FANTASY"; command = "botserv/set/fantasy"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Fantasy commands
|
|
||||||
*
|
|
||||||
* Fantasy commands can be executed in channels that have a BotServ bot by prefixing the
|
|
||||||
* command with one of the fantasy characters configured in botserv's fantasycharacter
|
|
||||||
* directive.
|
|
||||||
*
|
|
||||||
* Sane defaults are provided below that do not need to be edited unless you wish to change the default behavior.
|
|
||||||
*/
|
|
||||||
fantasy { name = "ACCESS"; command = "chanserv/access"; }
|
|
||||||
fantasy { name = "AKICK"; command = "chanserv/akick"; }
|
|
||||||
fantasy { name = "AOP"; command = "chanserv/xop"; }
|
|
||||||
fantasy { name = "BAN"; command = "chanserv/ban"; }
|
|
||||||
fantasy { name = "CLONE"; command = "chanserv/clone"; }
|
|
||||||
fantasy { name = "DEHALFOP"; command = "chanserv/modes"; }
|
|
||||||
fantasy { name = "DEOP"; command = "chanserv/modes"; }
|
|
||||||
fantasy { name = "DEOWNER"; command = "chanserv/modes"; }
|
|
||||||
fantasy { name = "DEPROTECT"; command = "chanserv/modes"; }
|
|
||||||
fantasy { name = "DEVOICE"; command = "chanserv/modes"; }
|
|
||||||
fantasy { name = "DOWN"; command = "chanserv/down"; }
|
|
||||||
fantasy { name = "ENFORCE"; command = "chanserv/enforce"; }
|
|
||||||
fantasy { name = "ENTRYMSG"; command = "chanserv/entrymsg"; }
|
|
||||||
fantasy { name = "FLAGS"; command = "chanserv/flags"; }
|
|
||||||
fantasy { name = "HALFOP"; command = "chanserv/modes"; }
|
|
||||||
fantasy { name = "HELP"; command = "generic/help"; prepend_channel = no; }
|
|
||||||
fantasy { name = "HOP"; command = "chanserv/xop"; }
|
|
||||||
fantasy { name = "INFO"; command = "chanserv/info"; prepend_channel = no; }
|
|
||||||
fantasy { name = "INVITE"; command = "chanserv/invite"; }
|
|
||||||
fantasy { name = "K"; command = "chanserv/kick"; }
|
|
||||||
fantasy { name = "KB"; command = "chanserv/ban"; }
|
|
||||||
fantasy { name = "KICK"; command = "chanserv/kick"; }
|
|
||||||
fantasy { name = "LEVELS"; command = "chanserv/levels"; }
|
|
||||||
fantasy { name = "LIST"; command = "chanserv/list"; prepend_channel = no; }
|
|
||||||
fantasy { name = "LOG"; command = "chanserv/log"; }
|
|
||||||
fantasy { name = "MODE"; command = "chanserv/mode"; }
|
|
||||||
fantasy { name = "MUTE"; command = "chanserv/ban"; kick = no; mode = "QUIET"; }
|
|
||||||
fantasy { name = "OP"; command = "chanserv/modes"; }
|
|
||||||
fantasy { name = "OWNER"; command = "chanserv/modes"; }
|
|
||||||
fantasy { name = "PROTECT"; command = "chanserv/modes"; }
|
|
||||||
fantasy { name = "QOP"; command = "chanserv/xop"; }
|
|
||||||
fantasy { name = "SEEN"; command = "chanserv/seen"; prepend_channel = no; }
|
|
||||||
fantasy { name = "SOP"; command = "chanserv/xop"; }
|
|
||||||
fantasy { name = "STATUS"; command = "chanserv/status"; }
|
|
||||||
fantasy { name = "SUSPEND"; command = "chanserv/suspend"; permission = "chanserv/suspend"; }
|
|
||||||
fantasy { name = "SYNC"; command = "chanserv/sync"; }
|
|
||||||
fantasy { name = "TOPIC"; command = "chanserv/topic"; }
|
|
||||||
fantasy { name = "UNBAN"; command = "chanserv/unban"; }
|
|
||||||
fantasy { name = "UNSUSPEND"; command = "chanserv/unsuspend"; permission = "chanserv/suspend"; }
|
|
||||||
fantasy { name = "UP"; command = "chanserv/up"; }
|
|
||||||
fantasy { name = "VOICE"; command = "chanserv/modes"; }
|
|
||||||
fantasy { name = "VOP"; command = "chanserv/xop"; }
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,51 +0,0 @@
|
|||||||
/*
|
|
||||||
* Example configuration file for Chanstats.
|
|
||||||
* Make sure BotServ, ChanServ and NickServ are running.
|
|
||||||
*/
|
|
||||||
|
|
||||||
module
|
|
||||||
{
|
|
||||||
name = "m_chanstats"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The name of this engine.
|
|
||||||
* This must match with the name of an SQL engine block.
|
|
||||||
*/
|
|
||||||
|
|
||||||
engine = "mysql/main"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* An optional prefix to prepended to the name of each created table.
|
|
||||||
* Do not use the same prefix for other programs.
|
|
||||||
*/
|
|
||||||
prefix = "anope_"
|
|
||||||
|
|
||||||
smileyshappy = ":) :-) ;) ;-) :D :-D :P :-P"
|
|
||||||
smileyssad = ":( :-( ;( ;-("
|
|
||||||
smileysother = ":/ :-/"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Enable Chanstats for newly registered nicks / channels.
|
|
||||||
*/
|
|
||||||
ns_def_chanstats = yes
|
|
||||||
cs_def_chanstats = yes
|
|
||||||
}
|
|
||||||
command { service = "ChanServ"; name = "SET CHANSTATS"; command = "chanserv/set/chanstats"; }
|
|
||||||
command { service = "NickServ"; name = "SET CHANSTATS"; command = "nickserv/set/chanstats"; }
|
|
||||||
command { service = "NickServ"; name = "SASET CHANSTATS"; command = "nickserv/saset/chanstats"; permission = "nickserv/saset/chanstats"; }
|
|
||||||
|
|
||||||
module { name = "cs_fantasy_stats" }
|
|
||||||
command { service = "ChanServ"; name = "STATS"; command = "chanserv/stats"; }
|
|
||||||
command { service = "ChanServ"; name = "GSTATS"; command = "chanserv/gstats"; }
|
|
||||||
fantasy { name = "STATS"; command = "chanserv/stats"; }
|
|
||||||
fantasy { name = "GSTATS"; command = "chanserv/gstats"; }
|
|
||||||
|
|
||||||
module { name = "cs_fantasy_top" }
|
|
||||||
command { service = "ChanServ"; name = "TOP"; command = "chanserv/top"; }
|
|
||||||
command { service = "ChanServ"; name = "TOP10"; command = "chanserv/top10"; }
|
|
||||||
command { service = "ChanServ"; name = "GTOP"; command = "chanserv/gtop"; }
|
|
||||||
command { service = "ChanServ"; name = "GTOP10"; command = "chanserv/gtop10"; }
|
|
||||||
fantasy { name = "TOP"; command = "chanserv/top"; }
|
|
||||||
fantasy { name = "TOP10"; command = "chanserv/top10"; }
|
|
||||||
fantasy { name = "GTOP"; command = "chanserv/gtop"; }
|
|
||||||
fantasy { name = "GTOP10"; command = "chanserv/gtop10"; }
|
|
||||||
+5
-9
@@ -9,10 +9,7 @@
|
|||||||
###############################################################
|
###############################################################
|
||||||
|
|
||||||
# Anope binary directory
|
# Anope binary directory
|
||||||
ANOPATH=/home/ircd/services/bin
|
ANOPATH=/home/ircd/services/
|
||||||
|
|
||||||
# Anope data directory
|
|
||||||
ANODATA=/home/ircd/services/data
|
|
||||||
|
|
||||||
# Name of the pid file
|
# Name of the pid file
|
||||||
ANOPIDF=services.pid
|
ANOPIDF=services.pid
|
||||||
@@ -34,15 +31,14 @@ ANOPID=
|
|||||||
|
|
||||||
cd $ANOPATH
|
cd $ANOPATH
|
||||||
|
|
||||||
if [ -f "$ANODATA/$ANOPIDF" ]
|
if [ -f $ANOPIDF ]
|
||||||
then
|
then
|
||||||
ANOPID=`cat "$ANODATA/$ANOPIDF"`
|
ANOPID=`cat $ANOPIDF`
|
||||||
kill -0 $ANOPID 2>/dev/null
|
if [ `ps auwx | grep $ANOPROG | grep $ANOPID | grep -v -c grep` = 1 ]
|
||||||
if [ $? -eq 0 ]
|
|
||||||
then
|
then
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
rm -f "$ANODATA/$ANOPIDF"
|
rm -f $ANOPIDF
|
||||||
fi
|
fi
|
||||||
|
|
||||||
./$ANOPROG $ANOARGS
|
./$ANOPROG $ANOARGS
|
||||||
|
|||||||
+1620
-1315
File diff suppressed because it is too large
Load Diff
@@ -1,115 +0,0 @@
|
|||||||
/*
|
|
||||||
* Example configuration file for Global.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* First, create the service.
|
|
||||||
*/
|
|
||||||
service
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* The name of the Global client.
|
|
||||||
* If you change this value, you probably want to change the client directive in the configuration for the global module too.
|
|
||||||
*/
|
|
||||||
nick = "Global"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The username of the Global client.
|
|
||||||
*/
|
|
||||||
user = "services"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The hostname of the Global client.
|
|
||||||
*/
|
|
||||||
host = "services.host"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The realname of the Global client.
|
|
||||||
*/
|
|
||||||
gecos = "Global Noticer"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The modes this client should use.
|
|
||||||
* Do not modify this unless you know what you are doing.
|
|
||||||
*
|
|
||||||
* These modes are very IRCd specific. If left commented, sane defaults
|
|
||||||
* are used based on what protocol module you have loaded.
|
|
||||||
*
|
|
||||||
* Note that setting this option incorrectly could potentially BREAK some, if
|
|
||||||
* not all, usefulness of the client. We will not support you if this client is
|
|
||||||
* unable to do certain things if this option is enabled.
|
|
||||||
*/
|
|
||||||
#modes = "+o"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* An optional comma separated list of channels this service should join. Outside
|
|
||||||
* of log channels this is not very useful, as the service will just idle in the
|
|
||||||
* specified channels, and will not accept any types of commands.
|
|
||||||
*
|
|
||||||
* Prefixes may be given to the channels in the form of mode characters or prefix symbols.
|
|
||||||
*/
|
|
||||||
#channels = "@#services,#mychan"
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Core Global module.
|
|
||||||
*
|
|
||||||
* Provides essential functionality for Global.
|
|
||||||
*/
|
|
||||||
module
|
|
||||||
{
|
|
||||||
name = "global"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The name of the client that should be Global.
|
|
||||||
*/
|
|
||||||
client = "Global"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This is the global message that will be sent when Services are being
|
|
||||||
* shutdown/restarted.
|
|
||||||
*
|
|
||||||
* This directive is optional.
|
|
||||||
*/
|
|
||||||
#globaloncycledown = "Services are restarting, they will be back shortly - please be good while they're gone"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This is the global message that will be sent when Services (re)join the
|
|
||||||
* network.
|
|
||||||
*
|
|
||||||
* This directive is optional.
|
|
||||||
*/
|
|
||||||
#globaloncycleup = "Services are now back online - have a nice day"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If set, Services will hide the IRC Operator's nick in a global
|
|
||||||
* message/notice.
|
|
||||||
*
|
|
||||||
* This directive is optional.
|
|
||||||
*/
|
|
||||||
#anonymousglobal = yes
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Core Global commands.
|
|
||||||
*
|
|
||||||
* In Anope modules can provide (multiple) commands, each of which has a unique command name. Once these modules
|
|
||||||
* are loaded you can then configure the commands to be added to any client you like with any name you like.
|
|
||||||
*
|
|
||||||
* Additionally, you may provide a permission name that must be in the opertype of users executing the command.
|
|
||||||
*
|
|
||||||
* Sane defaults are provided below that do not need to be edited unless you wish to change the default behavior.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Give it a help command. */
|
|
||||||
command { service = "Global"; name = "HELP"; command = "generic/help"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* gl_global
|
|
||||||
*
|
|
||||||
* Provides the command global/global.
|
|
||||||
*
|
|
||||||
* Used for sending a message to every online user.
|
|
||||||
*/
|
|
||||||
module { name = "gl_global" }
|
|
||||||
command { service = "Global"; name = "GLOBAL"; command = "global/global"; permission = "global/global"; }
|
|
||||||
@@ -1,188 +0,0 @@
|
|||||||
/*
|
|
||||||
* Example configuration file for HostServ.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* First, create the service.
|
|
||||||
*/
|
|
||||||
service
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* The name of the HostServ client.
|
|
||||||
* If you change this value, you probably want to change the client directive in the configuration for the hostserv module too.
|
|
||||||
*/
|
|
||||||
nick = "HostServ"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The username of the HostServ client.
|
|
||||||
*/
|
|
||||||
user = "services"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The hostname of the HostServ client.
|
|
||||||
*/
|
|
||||||
host = "services.host"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The realname of the HostServ client.
|
|
||||||
*/
|
|
||||||
gecos = "vHost Service"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The modes this client should use.
|
|
||||||
* Do not modify this unless you know what you are doing.
|
|
||||||
*
|
|
||||||
* These modes are very IRCd specific. If left commented, sane defaults
|
|
||||||
* are used based on what protocol module you have loaded.
|
|
||||||
*
|
|
||||||
* Note that setting this option incorrectly could potentially BREAK some, if
|
|
||||||
* not all, usefulness of the client. We will not support you if this client is
|
|
||||||
* unable to do certain things if this option is enabled.
|
|
||||||
*/
|
|
||||||
#modes = "+o"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* An optional comma separated list of channels this service should join. Outside
|
|
||||||
* of log channels this is not very useful, as the service will just idle in the
|
|
||||||
* specified channels, and will not accept any types of commands.
|
|
||||||
*
|
|
||||||
* Prefixes may be given to the channels in the form of mode characters or prefix symbols.
|
|
||||||
*/
|
|
||||||
#channels = "@#services,#mychan"
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Core HostServ module.
|
|
||||||
*
|
|
||||||
* Provides essential functionality for HostServ.
|
|
||||||
*/
|
|
||||||
module
|
|
||||||
{
|
|
||||||
name = "hostserv"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The name of the client that should be HostServ.
|
|
||||||
*/
|
|
||||||
client = "HostServ"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If enabled, vhosts are activated on users immediately when they are set.
|
|
||||||
*/
|
|
||||||
activate_on_set = no
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Core HostServ commands.
|
|
||||||
*
|
|
||||||
* In Anope modules can provide (multiple) commands, each of which has a unique command name. Once these modules
|
|
||||||
* are loaded you can then configure the commands to be added to any client you like with any name you like.
|
|
||||||
*
|
|
||||||
* Additionally, you may provide a permission name that must be in the opertype of users executing the command.
|
|
||||||
*
|
|
||||||
* Sane defaults are provided below that do not need to be edited unless you wish to change the default behavior.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Give it a help command. */
|
|
||||||
command { service = "HostServ"; name = "HELP"; command = "generic/help"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* hs_del
|
|
||||||
*
|
|
||||||
* Provides the commands hostserv/del and hostserv/delall.
|
|
||||||
*
|
|
||||||
* Used for removing users' vHosts.
|
|
||||||
*/
|
|
||||||
module { name = "hs_del" }
|
|
||||||
command { service = "HostServ"; name = "DEL"; command = "hostserv/del"; permission = "hostserv/del"; }
|
|
||||||
command { service = "HostServ"; name = "DELALL"; command = "hostserv/delall"; permission = "hostserv/del"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* hs_group
|
|
||||||
*
|
|
||||||
* Provides the command hostserv/group.
|
|
||||||
*
|
|
||||||
* Used for grouping one vHost to many nicks.
|
|
||||||
*/
|
|
||||||
module
|
|
||||||
{
|
|
||||||
name = "hs_group"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Upon nickserv/group, this option syncs the nick's main vHost to the grouped nick.
|
|
||||||
*/
|
|
||||||
syncongroup = no
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This makes vhosts act as if they are per account.
|
|
||||||
*/
|
|
||||||
synconset = no
|
|
||||||
}
|
|
||||||
command { service = "HostServ"; name = "GROUP"; command = "hostserv/group"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* hs_list
|
|
||||||
*
|
|
||||||
* Provides the command hostserv/list.
|
|
||||||
*
|
|
||||||
* Used for listing actively set vHosts.
|
|
||||||
*/
|
|
||||||
module { name = "hs_list" }
|
|
||||||
command { service = "HostServ"; name = "LIST"; command = "hostserv/list"; permission = "hostserv/list"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* hs_off
|
|
||||||
*
|
|
||||||
* Provides the command hostserv/off.
|
|
||||||
*
|
|
||||||
* Used for turning off your vHost.
|
|
||||||
*/
|
|
||||||
module { name = "hs_off" }
|
|
||||||
command { service = "HostServ"; name = "OFF"; command = "hostserv/off"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* hs_on
|
|
||||||
*
|
|
||||||
* Provides the command hostserv/on.
|
|
||||||
*
|
|
||||||
* Used for turning on your vHost.
|
|
||||||
*/
|
|
||||||
module { name = "hs_on" }
|
|
||||||
command { service = "HostServ"; name = "ON"; command = "hostserv/on"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* hs_request
|
|
||||||
*
|
|
||||||
* Provides the commands hostserv/request, hostserv/activate, hostserv/reject, and hostserv/waiting.
|
|
||||||
*
|
|
||||||
* Used to manage vHosts requested by users.
|
|
||||||
*/
|
|
||||||
module
|
|
||||||
{
|
|
||||||
name = "hs_request"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If set, Services will send a memo to the user requesting a vHost when it's been
|
|
||||||
* approved or rejected.
|
|
||||||
*/
|
|
||||||
#memouser = yes
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If set, Services will send a memo to all Services staff when a new vHost is requested.
|
|
||||||
*/
|
|
||||||
#memooper = yes
|
|
||||||
}
|
|
||||||
command { service = "HostServ"; name = "REQUEST"; command = "hostserv/request"; }
|
|
||||||
command { service = "HostServ"; name = "ACTIVATE"; command = "hostserv/activate"; permission = "hostserv/set"; }
|
|
||||||
command { service = "HostServ"; name = "REJECT"; command = "hostserv/reject"; permission = "hostserv/set"; }
|
|
||||||
command { service = "HostServ"; name = "WAITING"; command = "hostserv/waiting"; permission = "hostserv/set"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* hs_set
|
|
||||||
*
|
|
||||||
* Provides the commands hostserv/set and hostserv/setall.
|
|
||||||
*
|
|
||||||
* Used for setting users' vHosts.
|
|
||||||
*/
|
|
||||||
module { name = "hs_set" }
|
|
||||||
command { service = "HostServ"; name = "SET"; command = "hostserv/set"; permission = "hostserv/set"; }
|
|
||||||
command { service = "HostServ"; name = "SETALL"; command = "hostserv/setall"; permission = "hostserv/set"; }
|
|
||||||
@@ -1,97 +0,0 @@
|
|||||||
/*
|
|
||||||
* Example configuration file for the irc2sql gateway
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
service
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* The name of the StatServ client.
|
|
||||||
*/
|
|
||||||
nick = "StatServ"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The username of the StatServ client.
|
|
||||||
*/
|
|
||||||
user = "StatServ"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The hostname of the StatServ client.
|
|
||||||
*/
|
|
||||||
host = "stats.host"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The realname of the StatServ client.
|
|
||||||
*/
|
|
||||||
gecos = "Statistical Service"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The modes this client should use.
|
|
||||||
* Do not modify this unless you know what you are doing.
|
|
||||||
*
|
|
||||||
* These modes are very IRCd specific. If left commented, sane defaults
|
|
||||||
* are used based on what protocol module you have loaded.
|
|
||||||
*
|
|
||||||
* Note that setting this option incorrectly could potentially BREAK some, if
|
|
||||||
* not all, usefulness of the client. We will not support you if this client is
|
|
||||||
* unable to do certain things if this option is enabled.
|
|
||||||
*/
|
|
||||||
#modes = "+o"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* An optional comma separated list of channels this service should join. Outside
|
|
||||||
* of log channels this is not very useful, as the service will just idle in the
|
|
||||||
* specified channels, and will not accept any types of commands.
|
|
||||||
*
|
|
||||||
* Prefixes may be given to the channels in the form of mode characters or prefix symbols.
|
|
||||||
*/
|
|
||||||
#channels = "@#stats,#mychan"
|
|
||||||
}
|
|
||||||
|
|
||||||
module
|
|
||||||
{
|
|
||||||
name = "irc2sql"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The name of the client that should send the CTCP VERSION requests.
|
|
||||||
* It must already exist or must be defined in the following service block.
|
|
||||||
*/
|
|
||||||
client = "StatServ"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The name of the SQL engine to use.
|
|
||||||
* This must be MySQL and must match the name in the mysql{} block
|
|
||||||
*/
|
|
||||||
engine = "mysql/main"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* An optional prefix to prepended to the name of each created table.
|
|
||||||
* Do not use the same prefix for other programs.
|
|
||||||
*/
|
|
||||||
prefix = "anope_"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* GeoIP - Automatically adds users geoip location to the user table.
|
|
||||||
* Tables are created by irc2sql, you have to run the
|
|
||||||
* geoipupdate script after you started Anope to download
|
|
||||||
* and import the GeoIP database.
|
|
||||||
*
|
|
||||||
* The geoip database can be the smaller "country" database or the
|
|
||||||
* larger "city" database. Comment to disable geoip lookup.
|
|
||||||
*/
|
|
||||||
geoip_database = "country"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Get the CTCP version from users
|
|
||||||
* The users connecting to the network will receive a CTCP VERSION
|
|
||||||
* request from the above configured stats client
|
|
||||||
*/
|
|
||||||
ctcpuser = "yes"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Send out CTCP VERSION requests to users during burst.
|
|
||||||
* Disable this if you restart Anope often and don't want to
|
|
||||||
* annoy your users.
|
|
||||||
*/
|
|
||||||
ctcpeob = "yes"
|
|
||||||
}
|
|
||||||
@@ -1,240 +0,0 @@
|
|||||||
/*
|
|
||||||
* Example configuration file for MemoServ.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* First, create the service.
|
|
||||||
*/
|
|
||||||
service
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* The name of the MemoServ client.
|
|
||||||
* If you change this value, you probably want to change the client directive in the configuration for the memoserv module too.
|
|
||||||
*/
|
|
||||||
nick = "MemoServ"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The username of the MemoServ client.
|
|
||||||
*/
|
|
||||||
user = "services"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The hostname of the MemoServ client.
|
|
||||||
*/
|
|
||||||
host = "services.host"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The realname of the MemoServ client.
|
|
||||||
*/
|
|
||||||
gecos = "Memo Service"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The modes this client should use.
|
|
||||||
* Do not modify this unless you know what you are doing.
|
|
||||||
*
|
|
||||||
* These modes are very IRCd specific. If left commented, sane defaults
|
|
||||||
* are used based on what protocol module you have loaded.
|
|
||||||
*
|
|
||||||
* Note that setting this option incorrectly could potentially BREAK some, if
|
|
||||||
* not all, usefulness of the client. We will not support you if this client is
|
|
||||||
* unable to do certain things if this option is enabled.
|
|
||||||
*/
|
|
||||||
#modes = "+o"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* An optional comma separated list of channels this service should join. Outside
|
|
||||||
* of log channels this is not very useful, as the service will just idle in the
|
|
||||||
* specified channels, and will not accept any types of commands.
|
|
||||||
*
|
|
||||||
* Prefixes may be given to the channels in the form of mode characters or prefix symbols.
|
|
||||||
*/
|
|
||||||
#channels = "@#services,#mychan"
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Core MemoServ module.
|
|
||||||
*
|
|
||||||
* Provides essential functionality for MemoServ.
|
|
||||||
*/
|
|
||||||
module
|
|
||||||
{
|
|
||||||
name = "memoserv"
|
|
||||||
/*
|
|
||||||
* The name of the client that should be MemoServ. Clients are configured
|
|
||||||
* with the service blocks.
|
|
||||||
*/
|
|
||||||
client = "MemoServ"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The maximum number of memos a user is allowed to keep by default. Normal users may set the
|
|
||||||
* limit anywhere between 0 and this value. Services Admins can change it to any value or
|
|
||||||
* disable it.
|
|
||||||
*
|
|
||||||
* This directive is optional, but recommended. If not set, the limit is disabled
|
|
||||||
* by default, and normal users can set any limit they want.
|
|
||||||
*/
|
|
||||||
maxmemos = 20
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The delay between consecutive uses of the MemoServ SEND command. This can help prevent spam
|
|
||||||
* as well as denial-of-service attacks from sending large numbers of memos and filling up disk
|
|
||||||
* space (and memory).
|
|
||||||
*
|
|
||||||
* This directive is optional, but recommended.
|
|
||||||
*/
|
|
||||||
senddelay = 3s
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Core MemoServ commands.
|
|
||||||
*
|
|
||||||
* In Anope modules can provide (multiple) commands, each of which has a unique command name. Once these modules
|
|
||||||
* are loaded you can then configure the commands to be added to any client you like with any name you like.
|
|
||||||
*
|
|
||||||
* Additionally, you may provide a permission name that must be in the opertype of users executing the command.
|
|
||||||
*
|
|
||||||
* Sane defaults are provided below that do not need to be edited unless you wish to change the default behavior.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Give it a help command. */
|
|
||||||
command { service = "MemoServ"; name = "HELP"; command = "generic/help"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ms_cancel
|
|
||||||
*
|
|
||||||
* Provides the command memoserv/cancel.
|
|
||||||
*
|
|
||||||
* Used to cancel memos already sent but not yet read.
|
|
||||||
*/
|
|
||||||
module { name = "ms_cancel" }
|
|
||||||
command { service = "MemoServ"; name = "CANCEL"; command = "memoserv/cancel"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ms_check
|
|
||||||
*
|
|
||||||
* Provides the command memoserv/check.
|
|
||||||
*
|
|
||||||
* Used to check if a sent memo has been read.
|
|
||||||
*/
|
|
||||||
module { name = "ms_check" }
|
|
||||||
command { service = "MemoServ"; name = "CHECK"; command = "memoserv/check"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ms_del
|
|
||||||
*
|
|
||||||
* Provides the command memoserv/del.
|
|
||||||
*
|
|
||||||
* Used to delete your memos.
|
|
||||||
*/
|
|
||||||
module { name = "ms_del" }
|
|
||||||
command { service = "MemoServ"; name = "DEL"; command = "memoserv/del"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ms_ignore
|
|
||||||
*
|
|
||||||
* Provides the command memoserv/ignore.
|
|
||||||
*
|
|
||||||
* Used to ignore memos from specific users.
|
|
||||||
*/
|
|
||||||
module
|
|
||||||
{
|
|
||||||
name = "ms_ignore"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The maximum number of entries that may be on a memo ignore list.
|
|
||||||
*
|
|
||||||
* This directive is optional.
|
|
||||||
*/
|
|
||||||
max = 32
|
|
||||||
}
|
|
||||||
command { service = "MemoServ"; name = "IGNORE"; command = "memoserv/ignore"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ms_info
|
|
||||||
*
|
|
||||||
* Provides the command memoserv/info.
|
|
||||||
*
|
|
||||||
* Used to show memo related information about an account or a channel.
|
|
||||||
*/
|
|
||||||
module { name = "ms_info" }
|
|
||||||
command { service = "MemoServ"; name = "INFO"; command = "memoserv/info"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ms_list
|
|
||||||
*
|
|
||||||
* Provides the command memoserv/list.
|
|
||||||
*
|
|
||||||
* Used to list your current memos.
|
|
||||||
*/
|
|
||||||
module { name = "ms_list" }
|
|
||||||
command { service = "MemoServ"; name = "LIST"; command = "memoserv/list"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ms_read
|
|
||||||
*
|
|
||||||
* Provides the command memoserv/read.
|
|
||||||
*
|
|
||||||
* Used to read your memos.
|
|
||||||
*/
|
|
||||||
module { name = "ms_read" }
|
|
||||||
command { service = "MemoServ"; name = "READ"; command = "memoserv/read"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ms_rsend
|
|
||||||
*
|
|
||||||
* Provides the command memoserv/rsend.
|
|
||||||
*
|
|
||||||
* Used to send a memo requiring a receipt be sent back once it is read.
|
|
||||||
*/
|
|
||||||
#module
|
|
||||||
{
|
|
||||||
name = "ms_rsend"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Only allow Services Operators to use ms_rsend.
|
|
||||||
*
|
|
||||||
* This directive is optional.
|
|
||||||
*/
|
|
||||||
operonly = no
|
|
||||||
}
|
|
||||||
#command { service = "MemoServ"; name = "RSEND"; command = "memoserv/rsend"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ms_send
|
|
||||||
*
|
|
||||||
* Provides the command memoserv/send.
|
|
||||||
*
|
|
||||||
* Used to send memos.
|
|
||||||
*/
|
|
||||||
module { name = "ms_send" }
|
|
||||||
command { service = "MemoServ"; name = "SEND"; command = "memoserv/send"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ms_sendall
|
|
||||||
*
|
|
||||||
* Provides the command memoserv/sendall.
|
|
||||||
*
|
|
||||||
* Used to send a mass memo to every registered user.
|
|
||||||
*/
|
|
||||||
module { name = "ms_sendall" }
|
|
||||||
command { service = "MemoServ"; name = "SENDALL"; command = "memoserv/sendall"; permission = "memoserv/sendall"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ms_set
|
|
||||||
*
|
|
||||||
* Provides the command memoserv/set.
|
|
||||||
*
|
|
||||||
* Used to set settings such as how you are notified of new memos, and your memo limit.
|
|
||||||
*/
|
|
||||||
module { name = "ms_set" }
|
|
||||||
command { service = "MemoServ"; name = "SET"; command = "memoserv/set"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ms_staff
|
|
||||||
*
|
|
||||||
* Provides the command memoserv/staff.
|
|
||||||
*
|
|
||||||
* Used to send a memo to all registered staff members.
|
|
||||||
*/
|
|
||||||
module { name = "ms_staff" }
|
|
||||||
command { service = "MemoServ"; name = "STAFF"; command = "memoserv/staff"; permission = "memoserv/staff"; }
|
|
||||||
@@ -1,798 +0,0 @@
|
|||||||
/*
|
|
||||||
* [OPTIONAL] Non-Core Modules
|
|
||||||
*
|
|
||||||
* The following blocks are used to load all non-core modules, including 3rd-party modules.
|
|
||||||
* Modules can be prevented from loading by commenting out the line, other modules can be added by
|
|
||||||
* adding a module block. These modules will be loaded prior to Services connecting to your network.
|
|
||||||
*
|
|
||||||
* Note that some of these modules are labeled EXTRA, and must be enabled prior to compiling by
|
|
||||||
* running the 'extras' script on Linux and UNIX.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* help
|
|
||||||
*
|
|
||||||
* Provides the command generic/help.
|
|
||||||
*
|
|
||||||
* This is a generic help command that can be used with any client.
|
|
||||||
*/
|
|
||||||
module { name = "help" }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* m_dns
|
|
||||||
*
|
|
||||||
* Adds support for the DNS protocol. By itself this module does nothing useful,
|
|
||||||
* but other modules such as m_dnsbl and os_dns require this.
|
|
||||||
*/
|
|
||||||
#module
|
|
||||||
{
|
|
||||||
name = "m_dns"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The nameserver to use for resolving hostnames, must be an IP or a resolver configuration file.
|
|
||||||
* The below should work fine on all UNIX-like systems. Windows users will have to find their nameservers
|
|
||||||
* from ipconfig /all and put the IP here.
|
|
||||||
*/
|
|
||||||
nameserver = "/etc/resolv.conf"
|
|
||||||
#nameserver = "127.0.0.1"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* How long to wait in seconds before a DNS query has timed out.
|
|
||||||
*/
|
|
||||||
timeout = 5
|
|
||||||
|
|
||||||
|
|
||||||
/* Only edit below if you are expecting to use os_dns or otherwise answer DNS queries. */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The IP and port services use to listen for DNS queries.
|
|
||||||
* Note that ports less than 1024 are privileged on UNIX/Linux systems, and
|
|
||||||
* require Anope to be started as root. If you do this, it is recommended you
|
|
||||||
* set options:user and options:group so Anope can change users after binding
|
|
||||||
* to this port.
|
|
||||||
*/
|
|
||||||
ip = "0.0.0.0"
|
|
||||||
port = 53
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* SOA record information.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* E-mail address of the DNS administrator. */
|
|
||||||
admin = "admin@example.com"
|
|
||||||
|
|
||||||
/* This should be the names of the public facing nameservers serving the records. */
|
|
||||||
nameservers = "ns1.example.com ns2.example.com"
|
|
||||||
|
|
||||||
/* The time secondary servers are allowed to cache for. This should be reasonably low
|
|
||||||
* if you want your records to be updated without much delay.
|
|
||||||
*/
|
|
||||||
refresh = 3600
|
|
||||||
|
|
||||||
/* A notify block. There should probably be one per nameserver listed in 'nameservers'.
|
|
||||||
*/
|
|
||||||
notify
|
|
||||||
{
|
|
||||||
ip = "192.0.2.0"
|
|
||||||
port = 53
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* m_dnsbl
|
|
||||||
*
|
|
||||||
* Allows configurable DNS blacklists to check connecting users against. If a user
|
|
||||||
* is found on the blacklist they will be immediately banned. This is a crucial module
|
|
||||||
* to prevent bot attacks.
|
|
||||||
*/
|
|
||||||
#module
|
|
||||||
{
|
|
||||||
name = "m_dnsbl"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If set, Services will check clients against the DNSBLs when services connect to its uplink.
|
|
||||||
* This is not recommended, and on large networks will open a very large amount of DNS queries.
|
|
||||||
* Whilst services are not drastically affected by this, your nameserver/DNSBL might care.
|
|
||||||
*/
|
|
||||||
check_on_connect = no
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If set, Services will check clients when coming back from a netsplit. This can cause a large number
|
|
||||||
* of DNS queries open at once. Whilst services are not drastically affected by this, your nameserver/DNSBL
|
|
||||||
* might care.
|
|
||||||
*/
|
|
||||||
check_on_netburst = no
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If set, OperServ will add clients found in the DNSBL to the akill list. Without it, OperServ simply sends
|
|
||||||
* a timed G/K-line to the IRCd and forgets about it. Can be useful if your akill list is being fill up by bots.
|
|
||||||
*/
|
|
||||||
add_to_akill = yes
|
|
||||||
|
|
||||||
blacklist
|
|
||||||
{
|
|
||||||
/* Name of the blacklist. */
|
|
||||||
name = "rbl.efnetrbl.org"
|
|
||||||
|
|
||||||
/* How long to set the ban for. */
|
|
||||||
time = 4h
|
|
||||||
|
|
||||||
/* Reason for akill.
|
|
||||||
* %n is the nick of the user
|
|
||||||
* %u is the ident/username of the user
|
|
||||||
* %g is the realname of the user
|
|
||||||
* %h is the hostname of the user
|
|
||||||
* %i is the IP of the user
|
|
||||||
* %r is the reply reason (configured below). Will be nothing if not configured.
|
|
||||||
* %N is the network name set in networkinfo:networkname
|
|
||||||
*/
|
|
||||||
reason = "You are listed in the EFnet RBL, visit https://rbl.efnetrbl.org/?i=%i for info"
|
|
||||||
|
|
||||||
/* Replies to ban and their reason. If no replies are configured, all replies get banned. */
|
|
||||||
reply
|
|
||||||
{
|
|
||||||
code = 1
|
|
||||||
reason = "Open Proxy"
|
|
||||||
}
|
|
||||||
|
|
||||||
#reply
|
|
||||||
{
|
|
||||||
code = 2
|
|
||||||
reason = "spamtrap666"
|
|
||||||
}
|
|
||||||
|
|
||||||
#reply
|
|
||||||
{
|
|
||||||
code = 3
|
|
||||||
reason = "spamtrap50"
|
|
||||||
}
|
|
||||||
|
|
||||||
reply
|
|
||||||
{
|
|
||||||
code = 4
|
|
||||||
reason = "TOR"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If set, users identified to services at the time the result comes back
|
|
||||||
* will not be banned.
|
|
||||||
*/
|
|
||||||
#allow_account = yes
|
|
||||||
}
|
|
||||||
|
|
||||||
reply
|
|
||||||
{
|
|
||||||
code = 5
|
|
||||||
reason = "Drones / Flooding"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#blacklist
|
|
||||||
{
|
|
||||||
name = "dnsbl.dronebl.org"
|
|
||||||
time = 4h
|
|
||||||
reason = "You have a host listed in the DroneBL. For more information, visit https://dronebl.org/lookup_branded?ip=%i&network=%N"
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Exempt localhost from DNSBL checks */
|
|
||||||
exempt { ip = "127.0.0.0/8" }
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* m_helpchan
|
|
||||||
*
|
|
||||||
* Gives users who are op in the specified help channel usermode +h (helpop).
|
|
||||||
*/
|
|
||||||
#module
|
|
||||||
{
|
|
||||||
name = "m_helpchan"
|
|
||||||
|
|
||||||
helpchannel = "#help"
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* m_httpd
|
|
||||||
*
|
|
||||||
* Allows services to serve web pages. By itself, this module does nothing useful.
|
|
||||||
*
|
|
||||||
* Note that using this will allow users to get the IP of your services.
|
|
||||||
* To prevent this we recommend using a reverse proxy or a tunnel.
|
|
||||||
*/
|
|
||||||
#module
|
|
||||||
{
|
|
||||||
name = "m_httpd"
|
|
||||||
|
|
||||||
httpd
|
|
||||||
{
|
|
||||||
/* Name of this service. */
|
|
||||||
name = "httpd/main"
|
|
||||||
|
|
||||||
/* IP to listen on. */
|
|
||||||
ip = "0.0.0.0"
|
|
||||||
|
|
||||||
/* Port to listen on. */
|
|
||||||
port = 8080
|
|
||||||
|
|
||||||
/* Time before connections to this server are timed out. */
|
|
||||||
timeout = 30
|
|
||||||
|
|
||||||
/* Listen using SSL. Requires an SSL module. */
|
|
||||||
#ssl = yes
|
|
||||||
|
|
||||||
/* If you are using a reverse proxy that sends one of the
|
|
||||||
* extforward_headers set below, set this to its IP.
|
|
||||||
* This allows services to obtain the real IP of users by
|
|
||||||
* reading the forwarded-for HTTP header.
|
|
||||||
* Multiple IP addresses can be specified separated by a space character.
|
|
||||||
*/
|
|
||||||
#extforward_ip = "192.168.0.255 192.168.1.255"
|
|
||||||
|
|
||||||
/* The header to look for. These probably work as is. */
|
|
||||||
extforward_header = "X-Forwarded-For Forwarded-For"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* [EXTRA] m_ldap
|
|
||||||
*
|
|
||||||
* This module allows other modules to use LDAP. By itself, this module does nothing useful.
|
|
||||||
*/
|
|
||||||
#module
|
|
||||||
{
|
|
||||||
name = "m_ldap"
|
|
||||||
|
|
||||||
ldap
|
|
||||||
{
|
|
||||||
server = "ldap://127.0.0.1"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Admin credentials used for performing searches and adding users.
|
|
||||||
*/
|
|
||||||
admin_binddn = "cn=Manager,dc=anope,dc=org"
|
|
||||||
admin_password = "secret"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* [EXTRA] m_ldap_authentication
|
|
||||||
*
|
|
||||||
* This module allows many commands such as IDENTIFY, RELEASE, RECOVER, GHOST, etc. use
|
|
||||||
* LDAP to authenticate users. Requires m_ldap.
|
|
||||||
*/
|
|
||||||
#module
|
|
||||||
{
|
|
||||||
name = "m_ldap_authentication"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The distinguished name used for searching for users's accounts.
|
|
||||||
*/
|
|
||||||
basedn = "ou=users,dc=anope,dc=org"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The search filter used to look up users's accounts.
|
|
||||||
* %account is replaced with the user's account.
|
|
||||||
* %object_class is replaced with the object_class configured below.
|
|
||||||
*/
|
|
||||||
search_filter = "(&(uid=%account)(objectClass=%object_class))"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The object class used by LDAP to store user account information.
|
|
||||||
* This is used for adding new users to LDAP if registration is allowed.
|
|
||||||
*/
|
|
||||||
object_class = "anopeUser"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The attribute value used for account names.
|
|
||||||
*/
|
|
||||||
username_attribute = "uid"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The attribute value used for email addresses.
|
|
||||||
* This directive is optional.
|
|
||||||
*/
|
|
||||||
email_attribute = "email"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The attribute value used for passwords.
|
|
||||||
* Used when registering new accounts in LDAP.
|
|
||||||
*/
|
|
||||||
password_attribute = "userPassword"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If set, the reason to give the users who try to register with NickServ,
|
|
||||||
* including nick registration from grouping.
|
|
||||||
*
|
|
||||||
* If not set, then registration is not blocked.
|
|
||||||
*/
|
|
||||||
#disable_register_reason = "To register on this network visit https://some.misconfigured.site.example/register"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If set, the reason to give the users who try to "/msg NickServ SET EMAIL".
|
|
||||||
* If not set, then email changing is not blocked.
|
|
||||||
*/
|
|
||||||
#disable_email_reason = "To change your email address visit https://some.misconfigured.site.example"
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* [EXTRA] m_ldap_oper
|
|
||||||
*
|
|
||||||
* This module dynamically ties users to Anope opertypes when they identify
|
|
||||||
* via LDAP group membership. Requires m_ldap.
|
|
||||||
*
|
|
||||||
* Note that this doesn't give the user privileges on the IRCd, only in Services.
|
|
||||||
*/
|
|
||||||
#module
|
|
||||||
{
|
|
||||||
name = "m_ldap_oper"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* An optional binddn to use when searching for groups.
|
|
||||||
* %a is replaced with the account name of the user.
|
|
||||||
*/
|
|
||||||
#binddn = "cn=Manager,dc=anope,dc=org"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* An optional password to bind with.
|
|
||||||
*/
|
|
||||||
#password = "secret"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The base DN where the groups are.
|
|
||||||
*/
|
|
||||||
basedn = "ou=groups,dc=anope,dc=org"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The filter to use when searching for users.
|
|
||||||
* %a is replaced with the account name of the user.
|
|
||||||
*/
|
|
||||||
filter = "(member=uid=%a,ou=users,dc=anope,dc=org)"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The attribute of the group that is the name of the opertype.
|
|
||||||
* The cn attribute should match a known opertype in the config.
|
|
||||||
*/
|
|
||||||
opertype_attribute = "cn"
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* [EXTRA] m_mysql
|
|
||||||
*
|
|
||||||
* This module allows other modules to use MySQL.
|
|
||||||
*/
|
|
||||||
#module
|
|
||||||
{
|
|
||||||
name = "m_mysql"
|
|
||||||
|
|
||||||
mysql
|
|
||||||
{
|
|
||||||
/* The name of this service. */
|
|
||||||
name = "mysql/main"
|
|
||||||
database = "anope"
|
|
||||||
server = "127.0.0.1"
|
|
||||||
username = "anope"
|
|
||||||
password = "mypassword"
|
|
||||||
port = 3306
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* m_redis
|
|
||||||
*
|
|
||||||
* This module allows other modules to use Redis.
|
|
||||||
*/
|
|
||||||
#module
|
|
||||||
{
|
|
||||||
name = "m_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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* [DEPRECATED] [EXTRA] m_regex_pcre
|
|
||||||
*
|
|
||||||
* Provides the regex engine regex/pcre, which uses version 1 of the Perl Compatible Regular
|
|
||||||
* Expressions library. This can not be loaded at the same time as the m_regex_pcre2 module.
|
|
||||||
*/
|
|
||||||
#module { name = "m_regex_pcre" }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* [EXTRA] m_regex_pcre2
|
|
||||||
*
|
|
||||||
* Provides the regex engine regex/pcre, which uses version 2 of the Perl Compatible Regular
|
|
||||||
* Expressions library. This can not be loaded at the same time as the m_regex_pcre module.
|
|
||||||
*/
|
|
||||||
#module { name = "m_regex_pcre2" }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* [EXTRA] m_regex_posix
|
|
||||||
*
|
|
||||||
* Provides the regex engine regex/posix, which uses the POSIX compliant regular expressions.
|
|
||||||
* This is likely the only regex module you will not need extra libraries for.
|
|
||||||
*/
|
|
||||||
#module { name = "m_regex_posix" }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* [EXTRA] m_regex_tre
|
|
||||||
*
|
|
||||||
* Provides the regex engine regex/tre, which uses the TRE regex library.
|
|
||||||
*/
|
|
||||||
#module { name = "m_regex_tre" }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* m_rewrite
|
|
||||||
*
|
|
||||||
* Allows rewriting commands sent to/from clients.
|
|
||||||
*/
|
|
||||||
#module { name = "m_rewrite" }
|
|
||||||
#command
|
|
||||||
{
|
|
||||||
service = "ChanServ"; name = "CLEAR"; command = "rewrite"
|
|
||||||
|
|
||||||
/* Enable m_rewrite. */
|
|
||||||
rewrite = yes
|
|
||||||
|
|
||||||
/* Source message to match. A $ can be used to match anything. */
|
|
||||||
rewrite_source = "CLEAR $ USERS"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Message to rewrite the source message to. A $ followed by a number, e.g. $0, gets
|
|
||||||
* replaced by the number-th word from the source_message, starting from 0.
|
|
||||||
*/
|
|
||||||
rewrite_target = "KICK $1 *"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The command description. This only shows up in HELP's output.
|
|
||||||
* Comment this option to prevent the command from showing in the
|
|
||||||
* HELP command.
|
|
||||||
*/
|
|
||||||
rewrite_description = "Clears all users from a channel"
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* m_proxyscan
|
|
||||||
*
|
|
||||||
* This module allows you to scan connecting clients for open proxies.
|
|
||||||
* Note that using this will allow users to get the IP of your services.
|
|
||||||
*
|
|
||||||
* Currently the two supported proxy types are HTTP and SOCKS5.
|
|
||||||
*
|
|
||||||
* The proxy scanner works by attempting to connect to clients when they
|
|
||||||
* connect to the network, and if they have a proxy running instruct it to connect
|
|
||||||
* back to services. If services are able to connect through the proxy to itself
|
|
||||||
* then it knows it is an insecure proxy, and will ban it.
|
|
||||||
*/
|
|
||||||
#module
|
|
||||||
{
|
|
||||||
name = "m_proxyscan"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The target IP services tells the proxy to connect back to. This must be a publicly
|
|
||||||
* available IP that remote proxies can connect to.
|
|
||||||
*/
|
|
||||||
#target_ip = "127.0.0.1"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The port services tells the proxy to connect to.
|
|
||||||
*/
|
|
||||||
target_port = 7226
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The listen IP services listen on for incoming connections from suspected proxies.
|
|
||||||
* This probably will be the same as target_ip, but may not be if you are behind a firewall (NAT).
|
|
||||||
*/
|
|
||||||
#listen_ip = "127.0.0.1"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The port services should listen on for incoming connections from suspected proxies.
|
|
||||||
* This most likely will be the same as target_port.
|
|
||||||
*/
|
|
||||||
listen_port = 7226
|
|
||||||
|
|
||||||
/*
|
|
||||||
* An optional notice sent to clients upon connect.
|
|
||||||
*/
|
|
||||||
#connect_notice = "We will now scan your host for insecure proxies. If you do not consent to this scan please disconnect immediately."
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Who the notice should be sent from.
|
|
||||||
*/
|
|
||||||
#connect_source = "OperServ"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If set, OperServ will add infected clients to the akill list. Without it, OperServ simply sends
|
|
||||||
* a timed G/K-line to the IRCd and forgets about it. Can be useful if your akill list is being filled up by bots.
|
|
||||||
*/
|
|
||||||
add_to_akill = yes
|
|
||||||
|
|
||||||
/*
|
|
||||||
* How long before connections should be timed out.
|
|
||||||
*/
|
|
||||||
timeout = 5
|
|
||||||
|
|
||||||
proxyscan
|
|
||||||
{
|
|
||||||
/* The type of proxy to check for. A comma separated list is allowed. */
|
|
||||||
type = "HTTP"
|
|
||||||
|
|
||||||
/* The ports to check. */
|
|
||||||
port = "80,8080"
|
|
||||||
|
|
||||||
/* How long to set the ban for. */
|
|
||||||
time = 4h
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The reason to ban the user for.
|
|
||||||
* %h is replaced with the type of proxy found.
|
|
||||||
* %i is replaced with the IP of proxy found.
|
|
||||||
* %p is replaced with the port.
|
|
||||||
*/
|
|
||||||
reason = "You have an open proxy running on your host (%t:%i:%p)"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* m_sasl
|
|
||||||
*
|
|
||||||
* Provides support for authentication to services via IRCv3 SASL. This is a standardised
|
|
||||||
* alternative to ns_identify that is supported by several IRCds.
|
|
||||||
*
|
|
||||||
* You will need to configure your IRCd to use SASL. See the following links for details:
|
|
||||||
*
|
|
||||||
* InspIRCd: https://docs.inspircd.org/4/modules/sasl/
|
|
||||||
* UnrealIRCd: https://www.unrealircd.org/docs/SASL#Enabling_SASL_on_the_server
|
|
||||||
*/
|
|
||||||
module
|
|
||||||
{
|
|
||||||
name = "m_sasl"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The nick of the client which operates as the SASL agent.
|
|
||||||
*/
|
|
||||||
#agent = "NickServ"
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* [EXTRA] m_ssl_gnutls
|
|
||||||
*
|
|
||||||
* This module provides SSL services to Anope using GnuTLS, for example to
|
|
||||||
* connect to the uplink server(s) via SSL.
|
|
||||||
*
|
|
||||||
* You may only load either m_ssl_gnutls or m_ssl_openssl, but not both.
|
|
||||||
*/
|
|
||||||
#module
|
|
||||||
{
|
|
||||||
name = "m_ssl_gnutls"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* An optional certificate and key for m_ssl_gnutls to give to the uplink.
|
|
||||||
*
|
|
||||||
* You can generate your own certificate and key pair by using:
|
|
||||||
*
|
|
||||||
* certtool --generate-privkey --bits 2048 --outfile anope.key
|
|
||||||
* certtool --generate-self-signed --load-privkey anope.key --outfile anope.crt
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
cert = "data/anope.crt"
|
|
||||||
key = "data/anope.key"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Diffie-Hellman parameters to use when acting as a server. This is only
|
|
||||||
* required for TLS servers that want to use ephemeral DH cipher suites.
|
|
||||||
*
|
|
||||||
* This is NOT required for Anope to connect to the uplink server(s) via SSL.
|
|
||||||
*
|
|
||||||
* You can generate DH parameters by using:
|
|
||||||
*
|
|
||||||
* certtool --generate-dh-params --bits 2048 --outfile dhparams.pem
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
# dhparams = "data/dhparams.pem"
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* [EXTRA] m_ssl_openssl
|
|
||||||
*
|
|
||||||
* This module provides SSL services to Anope using OpenSSL, for example to
|
|
||||||
* connect to the uplink server(s) via SSL.
|
|
||||||
*
|
|
||||||
* You may only load either m_ssl_openssl or m_ssl_gnutls, but not both.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#module
|
|
||||||
{
|
|
||||||
name = "m_ssl_openssl"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* An optional certificate and key for m_ssl_openssl to give to the uplink.
|
|
||||||
*
|
|
||||||
* You can generate your own certificate and key pair by using:
|
|
||||||
*
|
|
||||||
* openssl genrsa -out anope.key 2048
|
|
||||||
* openssl req -new -x509 -key anope.key -out anope.crt -days 1095
|
|
||||||
*/
|
|
||||||
cert = "data/anope.crt"
|
|
||||||
key = "data/anope.key"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* As of 2014 SSL 3.0 is considered insecure, but it might be enabled
|
|
||||||
* on some systems by default for compatibility reasons.
|
|
||||||
* You can use the following option to enable or disable it explicitly.
|
|
||||||
* Leaving this option not set defaults to the default system behavior.
|
|
||||||
*/
|
|
||||||
#sslv3 = no
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* [EXTRA] m_sql_authentication
|
|
||||||
*
|
|
||||||
* This module allows authenticating users against an external SQL database using a custom
|
|
||||||
* query.
|
|
||||||
*/
|
|
||||||
#module
|
|
||||||
{
|
|
||||||
name = "m_sql_authentication"
|
|
||||||
|
|
||||||
/* SQL engine to use. Should be configured elsewhere with m_mysql, m_sqlite, etc. */
|
|
||||||
engine = "mysql/main"
|
|
||||||
|
|
||||||
/* Query to execute to authenticate. A non empty result from this query is considered a success,
|
|
||||||
* and the user will be authenticated.
|
|
||||||
*
|
|
||||||
* @a@ is replaced with the user's account name
|
|
||||||
* @p@ is replaced with the user's password
|
|
||||||
* @n@ is replaced with the user's nickname
|
|
||||||
* @i@ is replaced with the user's IP
|
|
||||||
*
|
|
||||||
* Note that @n@ and @i@ may not always exist in the case of a user identifying outside of the normal
|
|
||||||
* nickserv/identify command, such as through the web panel.
|
|
||||||
*
|
|
||||||
* Furthermore, if a field named email is returned from this query the user's email is
|
|
||||||
* set to its value.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* We've included some example queries for some popular website/forum systems.
|
|
||||||
*
|
|
||||||
* Drupal 6: "SELECT `mail` AS `email` FROM `users` WHERE `name` = @a@ AND `pass` = MD5(@p@) AND `status` = 1"
|
|
||||||
* e107 cms: "SELECT `user_email` AS `email` FROM `e107_user` WHERE `user_loginname` = @a@ AND `user_password` = MD5(@p@)"
|
|
||||||
* SMF Forum: "SELECT `email_address` AS `email` FROM `smf_members` WHERE `member_name` = @a@ AND `passwd` = SHA1(CONCAT(LOWER(@a@), @p@))"
|
|
||||||
* vBulletin: "SELECT `email` FROM `user` WHERE `username` = @a@ AND `password` = MD5(CONCAT(MD5(@p@), `salt`))"
|
|
||||||
* IP.Board: "SELECT `email` FROM `ibf_members` WHERE `name` = @a@ AND `members_pass_hash` = MD5(CONCAT(MD5(`members_pass_salt`), MD5(@p@)))"
|
|
||||||
*/
|
|
||||||
query = "SELECT `email_addr` AS `email` FROM `my_users` WHERE `username` = @a@ AND `password` = MD5(CONCAT('salt', @p@))"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If set, the reason to give the users who try to "/msg NickServ REGISTER".
|
|
||||||
* If not set, then registration is not blocked.
|
|
||||||
*/
|
|
||||||
#disable_reason = "To register on this network visit https://some.misconfigured.site.example/register"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If set, the reason to give the users who try to "/msg NickServ SET EMAIL".
|
|
||||||
* If not set, then email changing is not blocked.
|
|
||||||
*/
|
|
||||||
#disable_email_reason = "To change your email address visit https://some.misconfigured.site.example"
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* [EXTRA] m_sql_log
|
|
||||||
*
|
|
||||||
* This module adds an additional target option to log{} blocks
|
|
||||||
* that allows logging Services' logs to SQL. To log to SQL, add
|
|
||||||
* the SQL service name to log:targets prefixed by sql_log:. For
|
|
||||||
* example:
|
|
||||||
*
|
|
||||||
* log
|
|
||||||
* {
|
|
||||||
* targets = "services.log sql_log:mysql/main"
|
|
||||||
* ...
|
|
||||||
* }
|
|
||||||
*
|
|
||||||
* By default this module logs to the table `logs`, and will create
|
|
||||||
* it if it doesn't exist. This module does not create any indexes (keys)
|
|
||||||
* on the table and it is recommended you add them yourself as necessary.
|
|
||||||
*/
|
|
||||||
#module { name = "m_sql_log" }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* [EXTRA] m_sql_oper
|
|
||||||
*
|
|
||||||
* This module allows granting users services operator privileges and possibly IRC Operator
|
|
||||||
* privileges based on an external SQL database using a custom query.
|
|
||||||
*/
|
|
||||||
#module
|
|
||||||
{
|
|
||||||
name = "m_sql_oper"
|
|
||||||
|
|
||||||
/* SQL engine to use. Should be configured elsewhere with m_mysql, m_sqlite, etc. */
|
|
||||||
engine = "mysql/main"
|
|
||||||
|
|
||||||
/* Query to execute to determine if a user should have operator privileges.
|
|
||||||
* A field named opertype must be returned in order to link the user to their oper type.
|
|
||||||
* The oper types must be configured earlier in services.conf.
|
|
||||||
*
|
|
||||||
* If a field named modes is returned from this query then those modes are set on the user.
|
|
||||||
* Without this, only a simple +o is sent.
|
|
||||||
*
|
|
||||||
* @a@ is replaced with the user's account name
|
|
||||||
* @i@ is replaced with the user's IP
|
|
||||||
*/
|
|
||||||
query = "SELECT `opertype` FROM `my_users` WHERE `user_name` = @a@"
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* [EXTRA] m_sqlite
|
|
||||||
*
|
|
||||||
* This module allows other modules to use SQLite.
|
|
||||||
*/
|
|
||||||
#module
|
|
||||||
{
|
|
||||||
name = "m_sqlite"
|
|
||||||
|
|
||||||
/* A SQLite database */
|
|
||||||
sqlite
|
|
||||||
{
|
|
||||||
/* The name of this service. */
|
|
||||||
name = "sqlite/main"
|
|
||||||
|
|
||||||
/* The database name, it will be created if it does not exist. */
|
|
||||||
database = "anope.sqlite"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* webcpanel
|
|
||||||
*
|
|
||||||
* This module creates a web configuration panel that allows users and operators to perform any task
|
|
||||||
* as they could over IRC. If you are using the default configuration you should be able to access
|
|
||||||
* this panel by visiting http://127.0.0.1:8080 in your web browser from the machine Anope is running on.
|
|
||||||
*
|
|
||||||
* This module requires m_httpd.
|
|
||||||
*/
|
|
||||||
#module
|
|
||||||
{
|
|
||||||
name = "webcpanel"
|
|
||||||
|
|
||||||
/* Web server to use. */
|
|
||||||
server = "httpd/main"
|
|
||||||
|
|
||||||
/* Template to use. */
|
|
||||||
template = "default"
|
|
||||||
|
|
||||||
/* Page title. */
|
|
||||||
title = "Anope IRC Services"
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* m_xmlrpc
|
|
||||||
*
|
|
||||||
* Allows remote applications (websites) to execute queries in real time to retrieve data from Anope.
|
|
||||||
* By itself this module does nothing, but allows other modules (m_xmlrpc_main) to receive and send XMLRPC queries.
|
|
||||||
*/
|
|
||||||
#module
|
|
||||||
{
|
|
||||||
name = "m_xmlrpc"
|
|
||||||
|
|
||||||
/* Web service to use. Requires m_httpd. */
|
|
||||||
server = "httpd/main"
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* m_xmlrpc_main
|
|
||||||
*
|
|
||||||
* Adds the main XMLRPC core functions.
|
|
||||||
* Requires m_xmlrpc.
|
|
||||||
*/
|
|
||||||
#module { name = "m_xmlrpc_main" }
|
|
||||||
@@ -1,672 +0,0 @@
|
|||||||
/*
|
|
||||||
* Example configuration file for NickServ.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* First, create the service.
|
|
||||||
*/
|
|
||||||
service
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* The name of the NickServ client.
|
|
||||||
* If you change this value, you probably want to change the client directive in the configuration for the nickserv module too.
|
|
||||||
*/
|
|
||||||
nick = "NickServ"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The username of the NickServ client.
|
|
||||||
*/
|
|
||||||
user = "services"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The hostname of the NickServ client.
|
|
||||||
*/
|
|
||||||
host = "services.host"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The realname of the NickServ client.
|
|
||||||
*/
|
|
||||||
gecos = "Nickname Registration Service"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The modes this client should use.
|
|
||||||
* Do not modify this unless you know what you are doing.
|
|
||||||
*
|
|
||||||
* These modes are very IRCd specific. If left commented, sane defaults
|
|
||||||
* are used based on what protocol module you have loaded.
|
|
||||||
*
|
|
||||||
* Note that setting this option incorrectly could potentially BREAK some, if
|
|
||||||
* not all, usefulness of the client. We will not support you if this client is
|
|
||||||
* unable to do certain things if this option is enabled.
|
|
||||||
*/
|
|
||||||
#modes = "+o"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* An optional comma separated list of channels this service should join. Outside
|
|
||||||
* of log channels this is not very useful, as the service will just idle in the
|
|
||||||
* specified channels, and will not accept any types of commands.
|
|
||||||
*
|
|
||||||
* Prefixes may be given to the channels in the form of mode characters or prefix symbols.
|
|
||||||
*/
|
|
||||||
#channels = "@#services,#mychan"
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Core NickServ module.
|
|
||||||
*
|
|
||||||
* Provides essential functionality for NickServ.
|
|
||||||
*/
|
|
||||||
module
|
|
||||||
{
|
|
||||||
name = "nickserv"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The name of the client that should be NickServ.
|
|
||||||
*/
|
|
||||||
client = "NickServ"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Force users to give an e-mail address when they register a nick.
|
|
||||||
*
|
|
||||||
* This directive defaults to "yes" and is recommended to be enabled.
|
|
||||||
*/
|
|
||||||
forceemail = yes
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Require users who change their email address to confirm they
|
|
||||||
* own their new email.
|
|
||||||
*/
|
|
||||||
confirmemailchanges = no
|
|
||||||
|
|
||||||
/*
|
|
||||||
* A message sent to users on connect if they use an unregistered nick. %n will be replaced with the user's nickname.
|
|
||||||
*
|
|
||||||
* This directive is optional.
|
|
||||||
*/
|
|
||||||
#unregistered_notice = "Your nickname is not registered. To register it, use: /msg NickServ REGISTER password email"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The default options for newly registered nicks. Note that changing these options
|
|
||||||
* will have no effect on nicks which are already registered. The list must be separated
|
|
||||||
* by spaces.
|
|
||||||
*
|
|
||||||
* The options are:
|
|
||||||
* - killprotect: Kill nick if not identified within 60 seconds
|
|
||||||
* - kill_quick: Kill nick if not identified within 20 seconds, this one overrides the killprotect
|
|
||||||
* option and the killprotect option must be specified with this one
|
|
||||||
* - kill_immed: Kill nick immediately if not identified, this one overrides both the killprotect
|
|
||||||
* and kill_quick options and the killprotect option must be specified with this one
|
|
||||||
* - ns_secure: Enable nickname security, requiring the nick's password before any operations
|
|
||||||
* can be done on it
|
|
||||||
* - ns_private: Hide the nick from NickServ's LIST command
|
|
||||||
* - hide_email: Hide the nick's e-mail address from NickServ's INFO command
|
|
||||||
* - hide_mask: Hide the nick's last or current user@host from NickServ's INFO command
|
|
||||||
* - hide_status: Hide the nick's services operator access status from NickServ's INFO command
|
|
||||||
* - hide_quit: Hide the nick's last quit message from NickServ's INFO command
|
|
||||||
* - memo_signon: Notify user if they have a new memo when they sign into the nick
|
|
||||||
* - memo_receive: Notify user if they have a new memo as soon as it's received
|
|
||||||
* - memo_mail: Notify user if they have a new memo by mail
|
|
||||||
* - autoop: User will be automatically opped in channels they enter and have access to
|
|
||||||
* - msg: Services messages will be sent as PRIVMSGs instead of NOTICEs, requires
|
|
||||||
* options:useprivmsg to be enabled as well
|
|
||||||
* - ns_keep_modes: Enables keepmodes, which retains user modes across sessions
|
|
||||||
*
|
|
||||||
* This directive is optional, if left blank, the options will default to ns_secure, memo_signon, and
|
|
||||||
* memo_receive. If you really want no defaults, use "none" by itself as the option.
|
|
||||||
*/
|
|
||||||
defaults = "killprotect ns_secure ns_private hide_email hide_mask memo_signon memo_receive autoop"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
regdelay = 30s
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The length of time before a nick's registration expires.
|
|
||||||
*
|
|
||||||
* This directive is optional, but recommended. If not set, the default is 21 days.
|
|
||||||
*/
|
|
||||||
expire = 21d
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Prevents the use of the ACCESS and CERT (excluding their LIST subcommand), DROP, FORBID, SUSPEND,
|
|
||||||
* GETPASS and SET PASSWORD commands by services operators on other services operators.
|
|
||||||
*
|
|
||||||
* This directive is optional, but recommended.
|
|
||||||
*/
|
|
||||||
secureadmins = yes
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If set, Services will set the channel modes a user has access to upon identifying, assuming
|
|
||||||
* they are not already set.
|
|
||||||
*
|
|
||||||
* This directive is optional.
|
|
||||||
*/
|
|
||||||
modeonid = yes
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If set, Services will set these user modes on any user who identifies.
|
|
||||||
*
|
|
||||||
* This directive is optional.
|
|
||||||
*/
|
|
||||||
#modesonid = "+R"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If set, Services will not show netsplits in the last quit message field
|
|
||||||
* of NickServ's INFO command.
|
|
||||||
*/
|
|
||||||
hidenetsplitquit = no
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If set, is the length of time NickServ's killquick and kill options wait before
|
|
||||||
* forcing users off of protected nicknames.
|
|
||||||
*/
|
|
||||||
killquick = 20s
|
|
||||||
kill = 60s
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If set, forbids the registration of nicks that contain an existing
|
|
||||||
* nick with Services access. For example, if Tester is a Services Oper,
|
|
||||||
* you can't register NewTester or Tester123 unless you are an IRC
|
|
||||||
* Operator.
|
|
||||||
*
|
|
||||||
* NOTE: If you enable this, you will have to be logged in as an IRC
|
|
||||||
* operator in order to register a Services Root nick when setting up
|
|
||||||
* Anope for the first time.
|
|
||||||
*
|
|
||||||
* This directive is optional.
|
|
||||||
*/
|
|
||||||
#restrictopernicks = yes
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The username, and possibly hostname, used for fake users created when Services needs to
|
|
||||||
* hold a nickname.
|
|
||||||
*/
|
|
||||||
enforceruser = "enforcer"
|
|
||||||
enforcerhost = "services.host"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The length of time Services hold nicknames.
|
|
||||||
*
|
|
||||||
* This directive is optional, but recommended. If not set it defaults to 1 minute.
|
|
||||||
*/
|
|
||||||
releasetimeout = 1m
|
|
||||||
|
|
||||||
/*
|
|
||||||
* When a user's nick is forcibly changed to enforce a "nick kill", their new nick will start
|
|
||||||
* with this value. The rest will be made up of 6 or 7 digits.
|
|
||||||
* Make sure this is a valid nick and Nicklen+7 is not longer than the allowed Nicklen on your ircd.
|
|
||||||
*
|
|
||||||
* This directive is optional. If not set it defaults to "Guest"
|
|
||||||
*/
|
|
||||||
guestnickprefix = "Guest"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If set, Services do not allow ownership of nick names, only ownership of accounts.
|
|
||||||
*/
|
|
||||||
nonicknameownership = no
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The maximum length of passwords
|
|
||||||
*
|
|
||||||
* This directive is optional. If not set it defaults to 32.
|
|
||||||
*/
|
|
||||||
passlen = 32
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Core NickServ commands.
|
|
||||||
*
|
|
||||||
* In Anope modules can provide (multiple) commands, each of which has a unique command name. Once these modules
|
|
||||||
* are loaded you can then configure the commands to be added to any client you like with any name you like.
|
|
||||||
*
|
|
||||||
* Additionally, you may provide a permission name that must be in the opertype of users executing the command.
|
|
||||||
*
|
|
||||||
* Sane defaults are provided below that do not need to be edited unless you wish to change the default behavior.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Command group configuration for NickServ.
|
|
||||||
*
|
|
||||||
* Commands may optionally be placed into groups to make NickServ's HELP output easier to understand.
|
|
||||||
* Remove the following groups to use the old behavior of simply listing all NickServ commands from HELP.
|
|
||||||
*/
|
|
||||||
command_group
|
|
||||||
{
|
|
||||||
name = "nickserv/admin"
|
|
||||||
description = _("Services Operator commands")
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Give it a help command. */
|
|
||||||
command { service = "NickServ"; name = "HELP"; command = "generic/help"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ns_access
|
|
||||||
*
|
|
||||||
* Provides the command nickserv/access.
|
|
||||||
*
|
|
||||||
* Used for configuring what hosts have access to your account.
|
|
||||||
*/
|
|
||||||
module
|
|
||||||
{
|
|
||||||
name = "ns_access"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The maximum number of entries allowed on a nickname's access list.
|
|
||||||
* If not set, the default is 32. This number cannot be set to 0.
|
|
||||||
*/
|
|
||||||
accessmax = 32
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If set, Services will add the usermask of registering users to the access list of their
|
|
||||||
* newly created account. If not set, users will always have to identify to NickServ before
|
|
||||||
* being recognized, unless they manually add an address to the access list of their account.
|
|
||||||
* This directive is optional.
|
|
||||||
*/
|
|
||||||
addaccessonreg = no
|
|
||||||
}
|
|
||||||
command { service = "NickServ"; name = "ACCESS"; command = "nickserv/access"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ns_ajoin
|
|
||||||
*
|
|
||||||
* Provides the command nickserv/ajoin.
|
|
||||||
*
|
|
||||||
* Used for configuring channels to join once you identify.
|
|
||||||
*/
|
|
||||||
module
|
|
||||||
{
|
|
||||||
name = "ns_ajoin"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The maximum number of channels a user can have on NickServ's AJOIN command.
|
|
||||||
*/
|
|
||||||
ajoinmax = 10
|
|
||||||
}
|
|
||||||
command { service = "NickServ"; name = "AJOIN"; command = "nickserv/ajoin"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ns_alist
|
|
||||||
*
|
|
||||||
* Provides the command nickserv/alist.
|
|
||||||
*
|
|
||||||
* Used for viewing what channels you have access to.
|
|
||||||
*/
|
|
||||||
module { name = "ns_alist" }
|
|
||||||
command { service = "NickServ"; name = "ALIST"; command = "nickserv/alist"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ns_cert
|
|
||||||
*
|
|
||||||
* Provides the command nickserv/cert.
|
|
||||||
*
|
|
||||||
* Used for configuring your SSL certificate list, which can be used to automatically identify you.
|
|
||||||
*/
|
|
||||||
module
|
|
||||||
{
|
|
||||||
name = "ns_cert"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The maximum number of entries allowed on a nickname's certificate fingerprint list.
|
|
||||||
* The default is 5. This number cannot be set to 0.
|
|
||||||
*/
|
|
||||||
max = 5
|
|
||||||
}
|
|
||||||
command { service = "NickServ"; name = "CERT"; command = "nickserv/cert"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ns_drop
|
|
||||||
*
|
|
||||||
* Provides the command nickserv/drop.
|
|
||||||
*
|
|
||||||
* Used for unregistering names.
|
|
||||||
*/
|
|
||||||
module { name = "ns_drop" }
|
|
||||||
command { service = "NickServ"; name = "DROP"; command = "nickserv/drop"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ns_getemail
|
|
||||||
*
|
|
||||||
* Provides the command nickserv/getemail.
|
|
||||||
*
|
|
||||||
* Used for getting registered accounts by searching for emails.
|
|
||||||
*/
|
|
||||||
module { name = "ns_getemail" }
|
|
||||||
command { service = "NickServ"; name = "GETEMAIL"; command = "nickserv/getemail"; permission = "nickserv/getemail"; group = "nickserv/admin"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* [DEPRECATED] ns_getpass
|
|
||||||
*
|
|
||||||
* Provides the command nickserv/getpass.
|
|
||||||
*
|
|
||||||
* Used for getting users passwords.
|
|
||||||
*
|
|
||||||
* Requires no encryption is being used.
|
|
||||||
*/
|
|
||||||
#module { name = "ns_getpass" }
|
|
||||||
#command { service = "NickServ"; name = "GETPASS"; command = "nickserv/getpass"; permission = "nickserv/getpass"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ns_group
|
|
||||||
*
|
|
||||||
* Provides the commands nickserv/group, nickserv/glist, and nickserv/ungroup.
|
|
||||||
*
|
|
||||||
* Used for controlling nick groups.
|
|
||||||
*/
|
|
||||||
module
|
|
||||||
{
|
|
||||||
name = "ns_group"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The maximum number of nicks allowed in a group.
|
|
||||||
*
|
|
||||||
* This directive is optional, but recommended. If not set or set to 0, no limits will be applied.
|
|
||||||
*/
|
|
||||||
maxaliases = 16
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If set, the NickServ GROUP command won't allow any group changes. This is recommended to
|
|
||||||
* prevent users from accidentally dropping their nicks, as it forces users to explicitly
|
|
||||||
* drop their nicks before adding it to another group.
|
|
||||||
*
|
|
||||||
* This directive is optional, but recommended.
|
|
||||||
*/
|
|
||||||
nogroupchange = yes
|
|
||||||
}
|
|
||||||
command { service = "NickServ"; name = "GLIST"; command = "nickserv/glist"; }
|
|
||||||
command { service = "NickServ"; name = "GROUP"; command = "nickserv/group"; }
|
|
||||||
command { service = "NickServ"; name = "UNGROUP"; command = "nickserv/ungroup"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ns_identify
|
|
||||||
*
|
|
||||||
* Provides the command nickserv/identify.
|
|
||||||
*
|
|
||||||
* Used for identifying to accounts.
|
|
||||||
*/
|
|
||||||
module
|
|
||||||
{
|
|
||||||
name = "ns_identify"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If set, limits the number of concurrent users that can be logged in as a given account at once.
|
|
||||||
*/
|
|
||||||
maxlogins = 10
|
|
||||||
}
|
|
||||||
command { service = "NickServ"; name = "ID"; command = "nickserv/identify"; hide = yes; }
|
|
||||||
command { service = "NickServ"; name = "IDENTIFY"; command = "nickserv/identify"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ns_info
|
|
||||||
*
|
|
||||||
* Provides the commands:
|
|
||||||
* nickserv/info. - Used for gathering information about an account.
|
|
||||||
* nickserv/set/hide, nickserv/saset/hide - Used for configuring which options are publicly shown in nickserv/info.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
module { name = "ns_info" }
|
|
||||||
command { service = "NickServ"; name = "INFO"; command = "nickserv/info"; }
|
|
||||||
|
|
||||||
command { service = "NickServ"; name = "SET HIDE"; command = "nickserv/set/hide"; }
|
|
||||||
command { service = "NickServ"; name = "SASET HIDE"; command = "nickserv/saset/hide"; permission = "nickserv/saset/hide"; }
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ns_list
|
|
||||||
*
|
|
||||||
* Provides the commands:
|
|
||||||
* nickserv/list - Used for retrieving and searching the registered account list.
|
|
||||||
* nickserv/set/private, nickserv/saset/private - Used for configuring whether or a users account shows up in nickserv/list.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
module
|
|
||||||
{
|
|
||||||
name = "ns_list"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The maximum number of nicks to be returned for a NickServ LIST command.
|
|
||||||
*/
|
|
||||||
listmax = 50
|
|
||||||
}
|
|
||||||
command { service = "NickServ"; name = "LIST"; command = "nickserv/list"; }
|
|
||||||
|
|
||||||
command { service = "NickServ"; name = "SET PRIVATE"; command = "nickserv/set/private"; }
|
|
||||||
command { service = "NickServ"; name = "SASET PRIVATE"; command = "nickserv/saset/private"; permission = "nickserv/saset/private"; }
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ns_logout
|
|
||||||
*
|
|
||||||
* Provides the command nickserv/logout.
|
|
||||||
*
|
|
||||||
* Used for logging out of your account.
|
|
||||||
*/
|
|
||||||
module { name = "ns_logout" }
|
|
||||||
command { service = "NickServ"; name = "LOGOUT"; command = "nickserv/logout"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ns_recover
|
|
||||||
*
|
|
||||||
* Provides the command nickserv/recover.
|
|
||||||
*
|
|
||||||
* Used for recovering your nick from services or another user.
|
|
||||||
*/
|
|
||||||
module
|
|
||||||
{
|
|
||||||
name = "ns_recover"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If set, Services will svsnick and svsjoin users who use the recover
|
|
||||||
* command on an identified user to the nick and channels of the recovered user.
|
|
||||||
*
|
|
||||||
* This directive is optional.
|
|
||||||
*/
|
|
||||||
restoreonrecover = yes
|
|
||||||
}
|
|
||||||
command { service = "NickServ"; name = "RECOVER"; command = "nickserv/recover"; }
|
|
||||||
# Uncomment below to emulate 1.8's behavior of ghost and release.
|
|
||||||
#command { service = "NickServ"; name = "GHOST"; command = "nickserv/recover"; }
|
|
||||||
#command { service = "NickServ"; name = "RELEASE"; command = "nickserv/recover"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ns_register
|
|
||||||
*
|
|
||||||
* Provides the commands nickserv/confirm, nickserv/register, and nickserv/resend.
|
|
||||||
*
|
|
||||||
* Used for registering accounts.
|
|
||||||
*/
|
|
||||||
module
|
|
||||||
{
|
|
||||||
name = "ns_register"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Registration confirmation setting. Set to "none" for no registration confirmation,
|
|
||||||
* "mail" for email confirmation, and "admin" to have services operators manually confirm
|
|
||||||
* every registration. Set to "disable" to completely disable all registrations.
|
|
||||||
*/
|
|
||||||
registration = "none"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The minimum length of time between consecutive uses of NickServ's RESEND command.
|
|
||||||
*
|
|
||||||
* This directive is optional, but recommended. If not set, this restriction will be disabled.
|
|
||||||
*/
|
|
||||||
resenddelay = 90s
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Prevents users from registering their nick if they are not connected
|
|
||||||
* for at least the given number of seconds.
|
|
||||||
*
|
|
||||||
* This directive is optional.
|
|
||||||
*/
|
|
||||||
#nickregdelay = 30s
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The length of time a user using an unconfirmed account has
|
|
||||||
* before the account will be released for general use again.
|
|
||||||
*/
|
|
||||||
#unconfirmedexpire = 1d
|
|
||||||
}
|
|
||||||
command { service = "NickServ"; name = "CONFIRM"; command = "nickserv/confirm"; }
|
|
||||||
command { service = "NickServ"; name = "REGISTER"; command = "nickserv/register"; }
|
|
||||||
command { service = "NickServ"; name = "RESEND"; command = "nickserv/resend"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ns_resetpass
|
|
||||||
*
|
|
||||||
* Provides the command nickserv/resetpass.
|
|
||||||
*
|
|
||||||
* Used for resetting passwords by emailing users a temporary one.
|
|
||||||
*/
|
|
||||||
module { name = "ns_resetpass" }
|
|
||||||
command { service = "NickServ"; name = "RESETPASS"; command = "nickserv/resetpass"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ns_set
|
|
||||||
*
|
|
||||||
* Provides the commands:
|
|
||||||
* nickserv/set, nickserv/saset - Dummy help wrappers for the SET and SASET commands.
|
|
||||||
* nickserv/set/autoop, nickserv/saset/autoop - Determines whether or not modes are automatically set users when joining a channel.
|
|
||||||
* nickserv/set/display, nickserv/saset/display - Used for setting a users display name.
|
|
||||||
* nickserv/set/email, nickserv/saset/email - Used for setting a users email address.
|
|
||||||
* nickserv/set/keepmodes, nickserv/saset/keepmodes - Configure whether or not services should retain a user's modes across sessions.
|
|
||||||
* nickserv/set/kill, nickserv/saset/kill - Used for configuring nickname protection.
|
|
||||||
* nickserv/set/language, nickserv/saset/language - Used for configuring what language services use.
|
|
||||||
* nickserv/set/message, nickserv/saset/message - Used to configure how services send messages to you.
|
|
||||||
* nickserv/set/password, nickserv/saset/password - Used for changing a users password.
|
|
||||||
* nickserv/set/secure, nickserv/saset/secure - Used for configuring whether a user can identify by simply being recognized by nickserv/access.
|
|
||||||
* nickserv/saset/noexpire - Used for configuring noexpire, which prevents nicks from expiring.
|
|
||||||
*/
|
|
||||||
module
|
|
||||||
{
|
|
||||||
name = "ns_set"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Allow the use of the IMMED option in the NickServ SET KILL command.
|
|
||||||
*
|
|
||||||
* This directive is optional.
|
|
||||||
*/
|
|
||||||
#allowkillimmed = yes
|
|
||||||
}
|
|
||||||
|
|
||||||
command { service = "NickServ"; name = "SET"; command = "nickserv/set"; }
|
|
||||||
command { service = "NickServ"; name = "SASET"; command = "nickserv/saset"; permission = "nickserv/saset/"; group = "nickserv/admin"; }
|
|
||||||
|
|
||||||
command { service = "NickServ"; name = "SET AUTOOP"; command = "nickserv/set/autoop"; }
|
|
||||||
command { service = "NickServ"; name = "SASET AUTOOP"; command = "nickserv/saset/autoop"; permission = "nickserv/saset/autoop"; }
|
|
||||||
|
|
||||||
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 = "SET EMAIL"; command = "nickserv/set/email"; }
|
|
||||||
command { service = "NickServ"; name = "SASET EMAIL"; command = "nickserv/saset/email"; permission = "nickserv/saset/email"; }
|
|
||||||
|
|
||||||
command { service = "NickServ"; name = "SET KEEPMODES"; command = "nickserv/set/keepmodes"; }
|
|
||||||
command { service = "NickServ"; name = "SASET KEEPMODES"; command = "nickserv/saset/keepmodes"; permission = "nickserv/saset/keepmodes"; }
|
|
||||||
|
|
||||||
command { service = "NickServ"; name = "SET KILL"; command = "nickserv/set/kill"; }
|
|
||||||
command { service = "NickServ"; name = "SASET KILL"; command = "nickserv/saset/kill"; permission = "nickserv/saset/kill"; }
|
|
||||||
|
|
||||||
command { service = "NickServ"; name = "SET LANGUAGE"; command = "nickserv/set/language"; }
|
|
||||||
command { service = "NickServ"; name = "SASET LANGUAGE"; command = "nickserv/saset/language"; permission = "nickserv/saset/language"; }
|
|
||||||
|
|
||||||
command { service = "NickServ"; name = "SET MESSAGE"; command = "nickserv/set/message"; }
|
|
||||||
command { service = "NickServ"; name = "SASET MESSAGE"; command = "nickserv/saset/message"; permission = "nickserv/saset/message"; }
|
|
||||||
|
|
||||||
command { service = "NickServ"; name = "SET PASSWORD"; command = "nickserv/set/password"; }
|
|
||||||
command { service = "NickServ"; name = "SASET PASSWORD"; command = "nickserv/saset/password"; permission = "nickserv/saset/password"; }
|
|
||||||
|
|
||||||
command { service = "NickServ"; name = "SET SECURE"; command = "nickserv/set/secure"; }
|
|
||||||
command { service = "NickServ"; name = "SASET SECURE"; command = "nickserv/saset/secure"; permission = "nickserv/saset/secure"; }
|
|
||||||
|
|
||||||
command { service = "NickServ"; name = "SASET NOEXPIRE"; command = "nickserv/saset/noexpire"; permission = "nickserv/saset/noexpire"; }
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ns_set_misc
|
|
||||||
*
|
|
||||||
* Provides the command nickserv/set/misc.
|
|
||||||
*
|
|
||||||
* Allows you to create arbitrary commands to set data, and have that data show up in nickserv/info.
|
|
||||||
* A field named misc_description may be given for use with help output.
|
|
||||||
*/
|
|
||||||
module { name = "ns_set_misc" }
|
|
||||||
command { service = "NickServ"; name = "SET URL"; command = "nickserv/set/misc"; misc_description = _("Associate a URL with your account"); }
|
|
||||||
command { service = "NickServ"; name = "SASET URL"; command = "nickserv/saset/misc"; misc_description = _("Associate a URL with this account"); permission = "nickserv/saset/url"; group = "nickserv/admin"; }
|
|
||||||
#command { service = "NickServ"; name = "SET DISCORD"; command = "nickserv/set/misc"; misc_description = _("Associate a Discord account with your account"); }
|
|
||||||
#command { service = "NickServ"; name = "SASET DISCORD"; command = "nickserv/saset/misc"; misc_description = _("Associate a Discord account with this account"); permission = "nickserv/saset/discord"; group = "nickserv/admin"; }
|
|
||||||
#command { service = "NickServ"; name = "SET MASTODON"; command = "nickserv/set/misc"; misc_description = _("Associate a Mastodon account with your account"); }
|
|
||||||
#command { service = "NickServ"; name = "SASET MASTODON"; command = "nickserv/saset/misc"; misc_description = _("Associate a Mastodon account with this account"); permission = "nickserv/saset/mastodon"; group = "nickserv/admin"; }
|
|
||||||
#command { service = "NickServ"; name = "SET TIMEZONE"; command = "nickserv/set/misc"; misc_description = _("Associate a time zone with your account"); }
|
|
||||||
#command { service = "NickServ"; name = "SASET TIMEZONE"; command = "nickserv/saset/misc"; misc_description = _("Associate a time zone with this account"); permission = "nickserv/saset/timezone"; group = "nickserv/admin"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ns_status
|
|
||||||
*
|
|
||||||
* Provides the nickserv/status command.
|
|
||||||
*
|
|
||||||
* Used to determine if a user is recognized or identified by services.
|
|
||||||
*/
|
|
||||||
module { name = "ns_status" }
|
|
||||||
command { service = "NickServ"; name = "STATUS"; command = "nickserv/status"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ns_suspend
|
|
||||||
*
|
|
||||||
* Provides the commands nickserv/suspend and nickserv/unsuspend.
|
|
||||||
*
|
|
||||||
* Used to suspend and unsuspend nicknames. Suspended nicknames can not be used but their settings are preserved.
|
|
||||||
*/
|
|
||||||
module
|
|
||||||
{
|
|
||||||
name = "ns_suspend"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The length of time before a suspended nick becomes unsuspended.
|
|
||||||
*
|
|
||||||
* This directive is optional. If not set, the default is never.
|
|
||||||
*/
|
|
||||||
#suspendexpire = 90d
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Settings to show to non-opers in NickServ's INFO output.
|
|
||||||
* Comment to completely disable showing any information about
|
|
||||||
* suspended nicknames to non-opers.
|
|
||||||
*/
|
|
||||||
show = "suspended, by, reason, on, expires"
|
|
||||||
}
|
|
||||||
command { service = "NickServ"; name = "SUSPEND"; command = "nickserv/suspend"; permission = "nickserv/suspend"; group = "nickserv/admin"; }
|
|
||||||
command { service = "NickServ"; name = "UNSUSPEND"; command = "nickserv/unsuspend"; permission = "nickserv/suspend"; group = "nickserv/admin"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ns_update
|
|
||||||
*
|
|
||||||
* Provides the command nickserv/update.
|
|
||||||
*
|
|
||||||
* Used to update your status on all channels, turn on your vHost, etc.
|
|
||||||
*/
|
|
||||||
module { name = "ns_update" }
|
|
||||||
command { service = "NickServ"; name = "UPDATE"; command = "nickserv/update"; }
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Extra NickServ related modules.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ns_maxemail
|
|
||||||
*
|
|
||||||
* Limits how many times the same email address may be used in Anope
|
|
||||||
* to register accounts.
|
|
||||||
*/
|
|
||||||
#module
|
|
||||||
{
|
|
||||||
name = "ns_maxemail"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The limit to how many registered nicks can use the same e-mail address. If set to 0 or left
|
|
||||||
* commented, there will be no limit enforced when registering new accounts or using
|
|
||||||
* /msg NickServ SET EMAIL.
|
|
||||||
*/
|
|
||||||
maxemails = 1
|
|
||||||
}
|
|
||||||
@@ -1,698 +0,0 @@
|
|||||||
/*
|
|
||||||
* Example configuration file for OperServ.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* First, create the service.
|
|
||||||
*/
|
|
||||||
service
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* The name of the OperServ client.
|
|
||||||
* If you change this value, you probably want to change the client directive in the configuration for the operserv module too.
|
|
||||||
*/
|
|
||||||
nick = "OperServ"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The username of the OperServ client.
|
|
||||||
*/
|
|
||||||
user = "services"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The hostname of the OperServ client.
|
|
||||||
*/
|
|
||||||
host = "services.host"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The realname of the OperServ client.
|
|
||||||
*/
|
|
||||||
gecos = "Operator Service"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The modes this client should use.
|
|
||||||
* Do not modify this unless you know what you are doing.
|
|
||||||
*
|
|
||||||
* These modes are very IRCd specific. If left commented, sane defaults
|
|
||||||
* are used based on what protocol module you have loaded.
|
|
||||||
*
|
|
||||||
* Note that setting this option incorrectly could potentially BREAK some, if
|
|
||||||
* not all, usefulness of the client. We will not support you if this client is
|
|
||||||
* unable to do certain things if this option is enabled.
|
|
||||||
*/
|
|
||||||
#modes = "+o"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* An optional comma separated list of channels this service should join. Outside
|
|
||||||
* of log channels this is not very useful, as the service will just idle in the
|
|
||||||
* specified channels, and will not accept any types of commands.
|
|
||||||
*
|
|
||||||
* Prefixes may be given to the channels in the form of mode characters or prefix symbols.
|
|
||||||
*/
|
|
||||||
#channels = "@#services,#mychan"
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Core OperServ module.
|
|
||||||
*
|
|
||||||
* Provides essential functionality for OperServ.
|
|
||||||
*/
|
|
||||||
module
|
|
||||||
{
|
|
||||||
name = "operserv"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The name of the client that should be OperServ.
|
|
||||||
*/
|
|
||||||
client = "OperServ"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* These define the default expiration times for, respectively, AKILLs, CHANKILLs, SNLINEs,
|
|
||||||
* and SQLINEs.
|
|
||||||
*/
|
|
||||||
autokillexpiry = 30d
|
|
||||||
chankillexpiry = 30d
|
|
||||||
snlineexpiry = 30d
|
|
||||||
sqlineexpiry = 30d
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If set, this option will make Services send an AKILL command immediately after it has been
|
|
||||||
* added with AKILL ADD. This eliminates the need for killing the user after the AKILL has
|
|
||||||
* been added.
|
|
||||||
*
|
|
||||||
* This directive is optional, but recommended.
|
|
||||||
*/
|
|
||||||
akillonadd = yes
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If set, this option will make Services send an (SVS)KILL command immediately after SNLINE ADD.
|
|
||||||
* This eliminates the need for killing the user after the SNLINE has been added.
|
|
||||||
*
|
|
||||||
* This directive is optional.
|
|
||||||
*/
|
|
||||||
killonsnline = yes
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If set, this option will make Services send an (SVS)KILL command immediately after SQLINE ADD.
|
|
||||||
* This eliminates the need for killing the user after the SQLINE has been added.
|
|
||||||
*
|
|
||||||
* This directive is optional.
|
|
||||||
*/
|
|
||||||
killonsqline = yes
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Adds the nickname of the Services Operator issuing an AKILL to the kill reason.
|
|
||||||
*
|
|
||||||
* This directive is optional.
|
|
||||||
*/
|
|
||||||
addakiller = yes
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Adds akill IDs to akills. Akill IDs are given to users in their ban reason and can be used to easily view,
|
|
||||||
* modify, or remove an akill from the ID.
|
|
||||||
*/
|
|
||||||
akillids = yes
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If set, only IRC Operators will be permitted to use OperServ, regardless of command access restrictions.
|
|
||||||
*
|
|
||||||
* This directive is optional, but recommended.
|
|
||||||
*/
|
|
||||||
opersonly = yes
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Core OperServ commands.
|
|
||||||
*
|
|
||||||
* In Anope modules can provide (multiple) commands, each of which has a unique command name. Once these modules
|
|
||||||
* are loaded you can then configure the commands to be added to any client you like with any name you like.
|
|
||||||
*
|
|
||||||
* Additionally, you may provide a permission name that must be in the opertype of users executing the command.
|
|
||||||
*
|
|
||||||
* Sane defaults are provided below that do not need to be edited unless you wish to change the default behavior.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Give it a help command. */
|
|
||||||
command { service = "OperServ"; name = "HELP"; command = "generic/help"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* os_akill
|
|
||||||
*
|
|
||||||
* Provides the command operserv/akill.
|
|
||||||
*
|
|
||||||
* Used to ban users from the network.
|
|
||||||
*/
|
|
||||||
module { name = "os_akill" }
|
|
||||||
command { service = "OperServ"; name = "AKILL"; command = "operserv/akill"; permission = "operserv/akill"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* os_chankill
|
|
||||||
*
|
|
||||||
* Provides the command operserv/chankill.
|
|
||||||
*
|
|
||||||
* Used to akill users from an entire channel.
|
|
||||||
*/
|
|
||||||
module { name = "os_chankill" }
|
|
||||||
command { service = "OperServ"; name = "CHANKILL"; command = "operserv/chankill"; permission = "operserv/chankill"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* os_defcon
|
|
||||||
*
|
|
||||||
* Provides the command operserv/defcon.
|
|
||||||
*
|
|
||||||
* Allows you to set services in DefCon mode, which can be used to restrict services access
|
|
||||||
* during bot attacks.
|
|
||||||
*/
|
|
||||||
#module
|
|
||||||
{
|
|
||||||
name = "os_defcon"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Default DefCon level (1-5) to use when starting Services up. Level 5 constitutes normal operation
|
|
||||||
* while level 1 constitutes the most restrictive operation. If this setting is left out or set to
|
|
||||||
* 0, DefCon will be disabled and the rest of this block will be ignored.
|
|
||||||
*/
|
|
||||||
#defaultlevel = 5
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The following 4 directives define what operations will take place when DefCon is set to levels
|
|
||||||
* 1 through 4. Each level is a list that must be separated by spaces.
|
|
||||||
*
|
|
||||||
* The following operations can be defined at each level:
|
|
||||||
* - nonewchannels: Disables registering new channels
|
|
||||||
* - nonewnicks: Disables registering new nicks
|
|
||||||
* - nomlockchanges: Disables changing MLOCK on registered channels
|
|
||||||
* - forcechanmodes: Forces all channels to have the modes given in the later chanmodes directive
|
|
||||||
* - reducedsessions: Reduces the session limit to the value given in the later sessionlimit directive
|
|
||||||
* - nonewclients: KILL any new clients trying to connect
|
|
||||||
* - operonly: Ignore all non-IRCops
|
|
||||||
* - silentoperonly: Silently ignore all non-IRCops
|
|
||||||
* - akillnewclients: AKILL any new clients trying to connect
|
|
||||||
* - nonewmemos: No new memos will be sent to block MemoServ attacks
|
|
||||||
*/
|
|
||||||
level4 = "nonewchannels nonewnicks nomlockchanges reducedsessions"
|
|
||||||
level3 = "nonewchannels nonewnicks nomlockchanges forcechanmodes reducedsessions"
|
|
||||||
level2 = "nonewchannels nonewnicks nomlockchanges forcechanmodes reducedsessions silentoperonly"
|
|
||||||
level1 = "nonewchannels nonewnicks nomlockchanges forcechanmodes reducedsessions silentoperonly akillnewclients"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* New session limit to use when a DefCon level is using "reduced" session limiting.
|
|
||||||
*/
|
|
||||||
#sessionlimit = 2
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Length of time to add an AKILL for when DefCon is preventing new clients from connecting to the
|
|
||||||
* network.
|
|
||||||
*/
|
|
||||||
#akillexpire = 5m
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The channel modes to set on all channels when the DefCon channel mode system is in use.
|
|
||||||
*
|
|
||||||
* Note 1: Choose these modes carefully, because when DefCon switches to a level which does NOT have
|
|
||||||
* the mode setting selected, Services will set the reverse on all channels, e.g. if this setting
|
|
||||||
* is +RN when DefCon is used, all channels will be set to +RN, when DefCon is removed, all
|
|
||||||
* channels will be set to -RN. You don't want to set this to +k for example, because when DefCon
|
|
||||||
* is removed, all channels are set -k, removing the key from previously keyed channels.
|
|
||||||
*
|
|
||||||
* Note 2: MLOCKed modes will not be lost.
|
|
||||||
*/
|
|
||||||
#chanmodes = "+R"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This value can be used to automatically return the network to DefCon level 5 after the specified
|
|
||||||
* time period, just in case any IRC Operator forgets to remove a DefCon setting.
|
|
||||||
*
|
|
||||||
* This directive is optional.
|
|
||||||
*/
|
|
||||||
#timeout = 15m
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If set, Services will send a global message on DefCon level changes.
|
|
||||||
*
|
|
||||||
* This directive is optional.
|
|
||||||
*/
|
|
||||||
#globalondefcon = yes
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If set, Services will send the global message defined in the message directive on DefCon level
|
|
||||||
* changes.
|
|
||||||
*
|
|
||||||
* This directive is optional.
|
|
||||||
*/
|
|
||||||
#globalondefconmore = yes
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Defines the message that will be sent on DefCon level changes when globalondefconmore is set.
|
|
||||||
*
|
|
||||||
* This directive is required only when globalondefconmore is set.
|
|
||||||
*/
|
|
||||||
#message = "Put your message to send your users here. Don't forget to uncomment globalondefconmore"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Defines the message that will be sent when DefCon is returned to level 5. This directive is optional,
|
|
||||||
* and will also override globalondefcon and globalondefconmore when set.
|
|
||||||
*/
|
|
||||||
#offmessage = "Services are now back to normal, sorry for any inconvenience"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Defines the reason to use when clients are KILLed or AKILLed from the network while the proper
|
|
||||||
* DefCon operation is in effect.
|
|
||||||
*/
|
|
||||||
#akillreason = "This network is currently not accepting connections, please try again later."
|
|
||||||
}
|
|
||||||
#command { service = "OperServ"; name = "DEFCON"; command = "operserv/defcon"; permission = "operserv/defcon"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* os_dns
|
|
||||||
*
|
|
||||||
* Provides the command operserv/dns.
|
|
||||||
*
|
|
||||||
* This module requires that m_dns is loaded.
|
|
||||||
*
|
|
||||||
* This module allows controlling a DNS zone. This is useful for
|
|
||||||
* controlling what servers users are placed on for load balancing,
|
|
||||||
* and to automatically remove split servers.
|
|
||||||
*
|
|
||||||
* To use this module you must set a nameserver record for services
|
|
||||||
* so that DNS queries go to services.
|
|
||||||
*
|
|
||||||
* Alternatively, you may use a secondary DNS server to hide services' IP,
|
|
||||||
* provide query caching, and provide better fault tolerance.
|
|
||||||
*
|
|
||||||
* To do this using BIND, configure similar to:
|
|
||||||
*
|
|
||||||
* options { max-refresh-time 60; };
|
|
||||||
* zone "irc.example.com" IN {
|
|
||||||
* type secondary;
|
|
||||||
* primaries { 127.0.0.1 port 5353; };
|
|
||||||
* };
|
|
||||||
*
|
|
||||||
* Where 127.0.0.1:5353 is the IP and port services are listening on.
|
|
||||||
* We recommend you externally firewall both UDP and TCP to the port
|
|
||||||
* Anope is listening on.
|
|
||||||
*
|
|
||||||
* Finally set a NS record for irc.example.com. to BIND or services.
|
|
||||||
*/
|
|
||||||
#module
|
|
||||||
{
|
|
||||||
name = "os_dns"
|
|
||||||
|
|
||||||
/* TTL for records. This should be very low if your records change often. */
|
|
||||||
ttl = 1m
|
|
||||||
|
|
||||||
/* If a server drops this many users the server is automatically removed from the DNS zone.
|
|
||||||
* This directive is optional.
|
|
||||||
*/
|
|
||||||
user_drop_mark = 50
|
|
||||||
|
|
||||||
/* The time used for user_drop_mark. */
|
|
||||||
user_drop_time = 1m
|
|
||||||
|
|
||||||
/* When a server is removed from the zone for dropping users, it is readded after this time.
|
|
||||||
* This directive is optional.
|
|
||||||
*/
|
|
||||||
user_drop_readd_time = 5m
|
|
||||||
|
|
||||||
/* If set, when a server splits, it is automatically removed from the zone. */
|
|
||||||
remove_split_servers = yes
|
|
||||||
|
|
||||||
/* If set, when a server connects to the network, it will be automatically added to
|
|
||||||
* the zone if it is a known server.
|
|
||||||
*/
|
|
||||||
readd_connected_servers = no
|
|
||||||
}
|
|
||||||
#command { service = "OperServ"; name = "DNS"; command = "operserv/dns"; permission = "operserv/dns"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* os_config
|
|
||||||
*
|
|
||||||
* Provides the command operserv/config.
|
|
||||||
*
|
|
||||||
* Used to view and set configuration options while services are running.
|
|
||||||
*/
|
|
||||||
module { name = "os_config" }
|
|
||||||
command { service = "OperServ"; name = "CONFIG"; command = "operserv/config"; permission = "operserv/config"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* os_forbid
|
|
||||||
*
|
|
||||||
* Provides the command operserv/forbid.
|
|
||||||
*
|
|
||||||
* Used to forbid specific nicks, channels, emails, etc. from being used.
|
|
||||||
*/
|
|
||||||
module { name = "os_forbid" }
|
|
||||||
command { service = "OperServ"; name = "FORBID"; command = "operserv/forbid"; permission = "operserv/forbid"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* os_ignore
|
|
||||||
*
|
|
||||||
* Provides the command operserv/ignore.
|
|
||||||
*
|
|
||||||
* Used to make Services ignore users.
|
|
||||||
*/
|
|
||||||
module { name = "os_ignore" }
|
|
||||||
command { service = "OperServ"; name = "IGNORE"; command = "operserv/ignore"; permission = "operserv/ignore"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* os_info
|
|
||||||
*
|
|
||||||
* Provides the command operserv/info.
|
|
||||||
*
|
|
||||||
* Used to add oper only notes to users and channels.
|
|
||||||
*/
|
|
||||||
module { name = "os_info" }
|
|
||||||
command { service = "OperServ"; name = "INFO"; command = "operserv/info"; permission = "operserv/info"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* os_jupe
|
|
||||||
*
|
|
||||||
* Provides the command operserv/jupe.
|
|
||||||
*
|
|
||||||
* Used to disconnect servers from the network and prevent them from relinking.
|
|
||||||
*/
|
|
||||||
module { name = "os_jupe" }
|
|
||||||
command { service = "OperServ"; name = "JUPE"; command = "operserv/jupe"; permission = "operserv/jupe"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* os_kick
|
|
||||||
*
|
|
||||||
* Provides the command operserv/kick.
|
|
||||||
*
|
|
||||||
* Used to kick users from channels.
|
|
||||||
*/
|
|
||||||
module { name = "os_kick" }
|
|
||||||
command { service = "OperServ"; name = "KICK"; command = "operserv/kick"; permission = "operserv/kick"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* os_kill
|
|
||||||
*
|
|
||||||
* Provides the command operserv/kill.
|
|
||||||
*
|
|
||||||
* Used to forcibly disconnect users from the network.
|
|
||||||
*/
|
|
||||||
module { name = "os_kill" }
|
|
||||||
command { service = "OperServ"; name = "KILL"; command = "operserv/kill"; permission = "operserv/kill"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* os_list
|
|
||||||
*
|
|
||||||
* Provides the commands operserv/chanlist and operserv/userlist.
|
|
||||||
*
|
|
||||||
* Used to list and search the channels and users currently on the network.
|
|
||||||
*/
|
|
||||||
module { name = "os_list" }
|
|
||||||
command { service = "OperServ"; name = "CHANLIST"; command = "operserv/chanlist"; permission = "operserv/chanlist"; }
|
|
||||||
command { service = "OperServ"; name = "USERLIST"; command = "operserv/userlist"; permission = "operserv/userlist"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* os_login
|
|
||||||
*
|
|
||||||
* Provides the commands operserv/login and operserv/logout.
|
|
||||||
*
|
|
||||||
* Used to login to OperServ, only required if your oper block requires this.
|
|
||||||
*/
|
|
||||||
module { name = "os_login" }
|
|
||||||
command { service = "OperServ"; name = "LOGIN"; command = "operserv/login"; }
|
|
||||||
command { service = "OperServ"; name = "LOGOUT"; command = "operserv/logout"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* os_logsearch
|
|
||||||
*
|
|
||||||
* Provides the command operserv/logsearch.
|
|
||||||
*
|
|
||||||
* Used to search services log files.
|
|
||||||
*/
|
|
||||||
module
|
|
||||||
{
|
|
||||||
name = "os_logsearch"
|
|
||||||
|
|
||||||
/* The log file name to search. There should be a log{} block configured to log
|
|
||||||
* to a file of this name.
|
|
||||||
*/
|
|
||||||
logname = "services.log"
|
|
||||||
}
|
|
||||||
command { service = "OperServ"; name = "LOGSEARCH"; command = "operserv/logsearch"; permission = "operserv/logsearch"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* os_mode
|
|
||||||
*
|
|
||||||
* Provides the commands operserv/mode and operserv/umode.
|
|
||||||
*
|
|
||||||
* Used to change user and channel modes.
|
|
||||||
*/
|
|
||||||
module { name = "os_mode" }
|
|
||||||
command { service = "OperServ"; name = "UMODE"; command = "operserv/umode"; permission = "operserv/umode"; }
|
|
||||||
command { service = "OperServ"; name = "MODE"; command = "operserv/mode"; permission = "operserv/mode"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* os_modinfo
|
|
||||||
*
|
|
||||||
* Provides the commands operserv/modinfo and operserv/modlist.
|
|
||||||
*
|
|
||||||
* Used to show information about loaded modules.
|
|
||||||
*/
|
|
||||||
module { name = "os_modinfo" }
|
|
||||||
command { service = "OperServ"; name = "MODINFO"; command = "operserv/modinfo"; permission = "operserv/modinfo"; }
|
|
||||||
command { service = "OperServ"; name = "MODLIST"; command = "operserv/modlist"; permission = "operserv/modinfo"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* os_module
|
|
||||||
*
|
|
||||||
* Provides the commands operserv/modload, operserv/modreload, and operserv/modunload.
|
|
||||||
*
|
|
||||||
* Used to load, reload, and unload modules.
|
|
||||||
*/
|
|
||||||
module { name = "os_module" }
|
|
||||||
command { service = "OperServ"; name = "MODLOAD"; command = "operserv/modload"; permission = "operserv/modload"; }
|
|
||||||
command { service = "OperServ"; name = "MODRELOAD"; command = "operserv/modreload"; permission = "operserv/modload"; }
|
|
||||||
command { service = "OperServ"; name = "MODUNLOAD"; command = "operserv/modunload"; permission = "operserv/modload"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* os_news
|
|
||||||
*
|
|
||||||
* Provides the commands operserv/logonnews, operserv/opernews, and operserv/randomnews.
|
|
||||||
*
|
|
||||||
* Used to configure news notices shown to users when they connect, and opers when they oper.
|
|
||||||
*/
|
|
||||||
module
|
|
||||||
{
|
|
||||||
name = "os_news"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The service bot names to use to send news to users on connection
|
|
||||||
* and to opers when they oper.
|
|
||||||
*/
|
|
||||||
announcer = "Global"
|
|
||||||
oper_announcer = "OperServ"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The number of LOGON/OPER news items to display when a user logs on.
|
|
||||||
*
|
|
||||||
* This directive is optional, if not set it will default to 3.
|
|
||||||
*/
|
|
||||||
#newscount = 3
|
|
||||||
}
|
|
||||||
command { service = "OperServ"; name = "LOGONNEWS"; command = "operserv/logonnews"; permission = "operserv/news"; }
|
|
||||||
command { service = "OperServ"; name = "OPERNEWS"; command = "operserv/opernews"; permission = "operserv/news"; }
|
|
||||||
command { service = "OperServ"; name = "RANDOMNEWS"; command = "operserv/randomnews"; permission = "operserv/news"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* os_noop
|
|
||||||
*
|
|
||||||
* Provides the command operserv/noop.
|
|
||||||
*
|
|
||||||
* Used to NOOP a server, which prevents users from opering on that server.
|
|
||||||
*/
|
|
||||||
module { name = "os_noop" }
|
|
||||||
command { service = "OperServ"; name = "NOOP"; command = "operserv/noop"; permission = "operserv/noop"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* [DEPRECATED] os_oline
|
|
||||||
*
|
|
||||||
* Provides the command operserv/oline.
|
|
||||||
*
|
|
||||||
* Used to set oper flags on users, and is specific to UnrealIRCd 3.2.
|
|
||||||
* See /helpop ?svso on your IRCd for more information.
|
|
||||||
*/
|
|
||||||
#module { name = "os_oline" }
|
|
||||||
#command { service = "OperServ"; name = "OLINE"; command = "operserv/oline"; permission = "operserv/oline"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* os_oper
|
|
||||||
*
|
|
||||||
* Provides the command operserv/oper.
|
|
||||||
*
|
|
||||||
* Used to configure opers and show information about opertypes.
|
|
||||||
*/
|
|
||||||
module { name = "os_oper" }
|
|
||||||
command { service = "OperServ"; name = "OPER"; command = "operserv/oper"; permission = "operserv/oper"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* os_reload
|
|
||||||
*
|
|
||||||
* Provides the command operserv/reload.
|
|
||||||
*
|
|
||||||
* Used to reload the services.conf configuration file.
|
|
||||||
*/
|
|
||||||
module { name = "os_reload" }
|
|
||||||
command { service = "OperServ"; name = "RELOAD"; command = "operserv/reload"; permission = "operserv/reload"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* os_session
|
|
||||||
*
|
|
||||||
* Provides the commands operserv/exception and operserv/session.
|
|
||||||
*
|
|
||||||
* This module enables session limiting. Session limiting prevents users from connecting more than a certain
|
|
||||||
* number of times from the same IP at the same time - thus preventing most types of cloning.
|
|
||||||
* Once a host reaches its session limit, all clients attempting to connect from that host will
|
|
||||||
* be killed. Exceptions to the default session limit can be defined via the exception list.
|
|
||||||
*
|
|
||||||
* Used to manage the session limit exception list, and view currently active sessions.
|
|
||||||
*/
|
|
||||||
module
|
|
||||||
{
|
|
||||||
name = "os_session"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Default session limit per host. Once a host reaches its session limit, all clients attempting
|
|
||||||
* to connect from that host will be killed.
|
|
||||||
*
|
|
||||||
* This directive is required if os_session is loaded.
|
|
||||||
*/
|
|
||||||
defaultsessionlimit = 5
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The maximum session limit that may be set for a host in an exception.
|
|
||||||
*
|
|
||||||
* This directive is required if os_session is loaded.
|
|
||||||
*/
|
|
||||||
maxsessionlimit = 100
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Sets the default expiry time for session exceptions.
|
|
||||||
*/
|
|
||||||
#exceptionexpiry = 1d
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The message that will be NOTICE'd to a user just before they are removed from the network because
|
|
||||||
* their host's session limit has been exceeded. It may be used to give a slightly more descriptive
|
|
||||||
* reason for the impending kill as opposed to simply "Session limit exceeded".
|
|
||||||
*
|
|
||||||
* This directive is optional, if not set, nothing will be sent.
|
|
||||||
*/
|
|
||||||
sessionlimitexceeded = "The session limit for your IP %IP% has been exceeded."
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Same as above, but should be used to provide a website address where users can find out more
|
|
||||||
* about session limits and how to go about applying for an exception.
|
|
||||||
*
|
|
||||||
* Note: This directive has been intentionally commented out in an effort to remind you to change
|
|
||||||
* the URL it contains. It is recommended that you supply an address/URL where people can get help
|
|
||||||
* regarding session limits.
|
|
||||||
*
|
|
||||||
* This directive is optional, if not set, nothing will be sent.
|
|
||||||
*/
|
|
||||||
#sessionlimitdetailsloc = "Please visit https://your.website.url/ for more information about session limits."
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If set and is not 0, this directive tells Services to add an AKILL if the number of subsequent kills
|
|
||||||
* for the same host exceeds this value, preventing the network from experiencing KILL floods.
|
|
||||||
*
|
|
||||||
* This directive is optional.
|
|
||||||
*/
|
|
||||||
maxsessionkill = 15
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Sets the expiry time for AKILLs set for hosts exceeding the maxsessionkill directive limit.
|
|
||||||
*
|
|
||||||
* This directive is optional, if not set, defaults to 30 minutes.
|
|
||||||
*/
|
|
||||||
sessionautokillexpiry = 30m
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Sets the CIDR value used to determine which IP addresses represent the same person.
|
|
||||||
* By default this would limit 3 connections per IPv4 IP and 3 connections per IPv6 IP.
|
|
||||||
* If you are receiving IPv6 clone attacks it may be useful to set session_ipv6_cidr to
|
|
||||||
* 64 or 48.
|
|
||||||
*/
|
|
||||||
session_ipv4_cidr = 32
|
|
||||||
session_ipv6_cidr = 128
|
|
||||||
}
|
|
||||||
command { service = "OperServ"; name = "EXCEPTION"; command = "operserv/exception"; permission = "operserv/exception"; }
|
|
||||||
command { service = "OperServ"; name = "SESSION"; command = "operserv/session"; permission = "operserv/session"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* os_set
|
|
||||||
*
|
|
||||||
* Provides the command operserv/set.
|
|
||||||
*
|
|
||||||
* Used to set various settings such as superadmin, debug mode, etc.
|
|
||||||
*/
|
|
||||||
module
|
|
||||||
{
|
|
||||||
name = "os_set"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If set, Services Admins will be able to use SUPERADMIN [ON|OFF] which will temporarily grant
|
|
||||||
* them extra privileges such as being a founder on ALL channels.
|
|
||||||
*
|
|
||||||
* This directive is optional.
|
|
||||||
*/
|
|
||||||
#superadmin = yes
|
|
||||||
}
|
|
||||||
command { service = "OperServ"; name = "SET"; command = "operserv/set"; permission = "operserv/set"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* os_shutdown
|
|
||||||
*
|
|
||||||
* Provides the commands operserv/quit, operserv/restart, and operserv/shutdown.
|
|
||||||
*
|
|
||||||
* Used to quit, restart, or shutdown services.
|
|
||||||
*/
|
|
||||||
module { name = "os_shutdown" }
|
|
||||||
command { service = "OperServ"; name = "QUIT"; command = "operserv/quit"; permission = "operserv/quit"; }
|
|
||||||
command { service = "OperServ"; name = "RESTART"; command = "operserv/restart"; permission = "operserv/restart"; }
|
|
||||||
command { service = "OperServ"; name = "SHUTDOWN"; command = "operserv/shutdown"; permission = "operserv/shutdown"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* os_stats
|
|
||||||
*
|
|
||||||
* Provides the operserv/stats command.
|
|
||||||
*
|
|
||||||
* Used to show statistics about services.
|
|
||||||
*/
|
|
||||||
module { name = "os_stats" }
|
|
||||||
command { service = "OperServ"; name = "STATS"; command = "operserv/stats"; permission = "operserv/stats"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* os_svs
|
|
||||||
*
|
|
||||||
* Provides the commands operserv/svsnick, operserv/svsjoin, and operserv/svspart.
|
|
||||||
*
|
|
||||||
* Used to force users to change nicks, join and part channels.
|
|
||||||
*/
|
|
||||||
module { name = "os_svs" }
|
|
||||||
command { service = "OperServ"; name = "SVSNICK"; command = "operserv/svsnick"; permission = "operserv/svs"; }
|
|
||||||
command { service = "OperServ"; name = "SVSJOIN"; command = "operserv/svsjoin"; permission = "operserv/svs"; }
|
|
||||||
command { service = "OperServ"; name = "SVSPART"; command = "operserv/svspart"; permission = "operserv/svs"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* os_sxline
|
|
||||||
*
|
|
||||||
* Provides the operserv/snline and operserv/sqline commands.
|
|
||||||
*
|
|
||||||
* Used to ban real names, nick names, and possibly channels.
|
|
||||||
*/
|
|
||||||
module { name = "os_sxline" }
|
|
||||||
command { service = "OperServ"; name = "SNLINE"; command = "operserv/snline"; permission = "operserv/snline"; }
|
|
||||||
command { service = "OperServ"; name = "SQLINE"; command = "operserv/sqline"; permission = "operserv/sqline"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* os_update
|
|
||||||
*
|
|
||||||
* Provides the operserv/update command.
|
|
||||||
*
|
|
||||||
* Use to immediately update the databases.
|
|
||||||
*/
|
|
||||||
module { name = "os_update" }
|
|
||||||
command { service = "OperServ"; name = "UPDATE"; command = "operserv/update"; permission = "operserv/update"; }
|
|
||||||
@@ -1,511 +0,0 @@
|
|||||||
/*
|
|
||||||
* Example configuration file for Services. After making the appropriate
|
|
||||||
* changes to this file, place it in the Services conf directory (as
|
|
||||||
* specified in the "configure" script, default /home/username/services/conf)
|
|
||||||
* under the name "services.conf".
|
|
||||||
*
|
|
||||||
* The format of this file is fairly simple: three types of comments are supported:
|
|
||||||
* - All text after a '#' on a line is ignored, as in shell scripting
|
|
||||||
* - All text after '//' on a line is ignored, as in C++
|
|
||||||
* - A block of text like this one is ignored, as in C
|
|
||||||
*
|
|
||||||
* Outside of comments, there are three structures: blocks, keys, and values.
|
|
||||||
*
|
|
||||||
* A block is a named container, which contains a number of key to value pairs
|
|
||||||
* - you may think of this as an array.
|
|
||||||
*
|
|
||||||
* A block is created like so:
|
|
||||||
* foobar
|
|
||||||
* {
|
|
||||||
* moo = "cow"
|
|
||||||
* foo = bar
|
|
||||||
* }
|
|
||||||
*
|
|
||||||
* Note that nameless blocks are allowed and are often used with comments to allow
|
|
||||||
* easily commenting an entire block, for example:
|
|
||||||
* #foobar
|
|
||||||
* {
|
|
||||||
* moo = "cow"
|
|
||||||
* foo = bar
|
|
||||||
* }
|
|
||||||
* is an entirely commented block.
|
|
||||||
*
|
|
||||||
* Keys are case insensitive. Values depend on what key - generally, information is
|
|
||||||
* given in the key comment. The quoting of values (and most other syntax) is quite
|
|
||||||
* flexible, however, please do not forget to quote your strings:
|
|
||||||
*
|
|
||||||
* "This is a parameter string with spaces in it"
|
|
||||||
*
|
|
||||||
* If you need to include a double quote inside a quoted string, precede it
|
|
||||||
* by a backslash:
|
|
||||||
*
|
|
||||||
* "This string has \"double quotes\" in it"
|
|
||||||
*
|
|
||||||
* Time parameters can be specified either as an integer representing a
|
|
||||||
* number of seconds (e.g. "3600" = 1 hour), or as an integer with a unit
|
|
||||||
* specifier: "s" = seconds, "m" = minutes, "h" = hours, "d" = days.
|
|
||||||
* Combinations (such as "1h30m") are not permitted. Examples (all of which
|
|
||||||
* represent the same length of time, one day):
|
|
||||||
*
|
|
||||||
* "86400", "86400s", "1440m", "24h", "1d"
|
|
||||||
*
|
|
||||||
* In the documentation for each directive, one of the following will be
|
|
||||||
* included to indicate whether an option is required:
|
|
||||||
*
|
|
||||||
* [REQUIRED]
|
|
||||||
* Indicates a directive which must be given. Without it, Services will
|
|
||||||
* not start.
|
|
||||||
*
|
|
||||||
* [RECOMMENDED]
|
|
||||||
* Indicates a directive which may be omitted, but omitting it may cause
|
|
||||||
* undesirable side effects.
|
|
||||||
*
|
|
||||||
* [OPTIONAL]
|
|
||||||
* Indicates a directive which is optional. If not given, the feature
|
|
||||||
* will typically be disabled. If this is not the case, more
|
|
||||||
* information will be given in the documentation.
|
|
||||||
*
|
|
||||||
* [DEPRECATED]
|
|
||||||
* Indicates a directive which will disappear in a future version of
|
|
||||||
* Services, usually because its functionality has been either
|
|
||||||
* superseded by that of other directives or incorporated into the main
|
|
||||||
* program.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* [OPTIONAL] Defines
|
|
||||||
*
|
|
||||||
* You can define values to other values, which can be used to easily change
|
|
||||||
* many values in the configuration at once.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The services.host define is used in multiple different locations throughout the
|
|
||||||
* configuration for the server name and pseudoclient hostnames.
|
|
||||||
*/
|
|
||||||
define
|
|
||||||
{
|
|
||||||
name = "services.host"
|
|
||||||
value = "stats.example.com"
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* [OPTIONAL] Additional Includes
|
|
||||||
*
|
|
||||||
* You can include additional configuration files here.
|
|
||||||
* You may also include executable files, which will be executed and
|
|
||||||
* the output from it will be included into your configuration.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include
|
|
||||||
{
|
|
||||||
type = "file"
|
|
||||||
name = "some.conf"
|
|
||||||
}
|
|
||||||
|
|
||||||
#include
|
|
||||||
{
|
|
||||||
type = "executable"
|
|
||||||
name = "/usr/bin/wget -q -O - https://some.misconfigured.network.com/stats.conf"
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* [REQUIRED] IRCd Config
|
|
||||||
*
|
|
||||||
* This section is used to set up Anope to connect to your IRC network.
|
|
||||||
* This section can be included multiple times, and Anope will attempt to
|
|
||||||
* connect to each server until it finally connects.
|
|
||||||
*
|
|
||||||
* Each uplink IRCd should have a corresponding configuration to allow Services
|
|
||||||
* to link to it.
|
|
||||||
*
|
|
||||||
* An example configuration for InspIRCd that is compatible with the below uplink
|
|
||||||
* and serverinfo configuration would look like:
|
|
||||||
*
|
|
||||||
* # This goes in inspircd.conf, *NOT* your Anope config!
|
|
||||||
* <module name="hidechans">
|
|
||||||
* <module name="services_account">
|
|
||||||
* <module name="spanningtree">
|
|
||||||
* <bind address="127.0.0.1" port="7000" type="servers">
|
|
||||||
* <link name="stats.example.com"
|
|
||||||
* ipaddr="127.0.0.1"
|
|
||||||
* port="7000"
|
|
||||||
* sendpass="mypassword"
|
|
||||||
* recvpass="mypassword">
|
|
||||||
* <uline server="stats.example.com" silent="yes">
|
|
||||||
*
|
|
||||||
* An example configuration for UnrealIRCd that is compatible with the below uplink
|
|
||||||
* and serverinfo configuration would look like:
|
|
||||||
*
|
|
||||||
* // This goes in unrealircd.conf, *NOT* your Anope config!
|
|
||||||
* listen {
|
|
||||||
* ip 127.0.0.1;
|
|
||||||
* port 7000;
|
|
||||||
* options {
|
|
||||||
* serversonly;
|
|
||||||
* };
|
|
||||||
* };
|
|
||||||
* link stats.example.com {
|
|
||||||
* incoming {
|
|
||||||
* mask *@127.0.0.1;
|
|
||||||
* };
|
|
||||||
* password "mypassword";
|
|
||||||
* class servers;
|
|
||||||
* };
|
|
||||||
* ulines { stats.example.com; };
|
|
||||||
*/
|
|
||||||
uplink
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* The IP or hostname of the IRC server you wish to connect Services to.
|
|
||||||
* Usually, you will want to connect Services over 127.0.0.1 (aka localhost).
|
|
||||||
*
|
|
||||||
* NOTE: On some shell providers, this will not be an option.
|
|
||||||
*/
|
|
||||||
host = "127.0.0.1"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Enable if Services should connect using IPv6.
|
|
||||||
*/
|
|
||||||
ipv6 = no
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Enable if Services should connect using SSL.
|
|
||||||
* You must have an SSL module loaded for this to work.
|
|
||||||
*/
|
|
||||||
ssl = no
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The port to connect to.
|
|
||||||
* The IRCd *MUST* be configured to listen on this port, and to accept
|
|
||||||
* server connections.
|
|
||||||
*
|
|
||||||
* Refer to your IRCd documentation for how this is to be done.
|
|
||||||
*/
|
|
||||||
port = 7000
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The password to send to the IRC server for authentication.
|
|
||||||
* This must match the link block on your IRCd.
|
|
||||||
*
|
|
||||||
* Refer to your IRCd documentation for more information on link blocks.
|
|
||||||
*/
|
|
||||||
password = "mypassword"
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* [REQUIRED] Server Information
|
|
||||||
*
|
|
||||||
* This section contains information about the Services server.
|
|
||||||
*/
|
|
||||||
serverinfo
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* The hostname that Services will be seen as, it must have no conflicts with any
|
|
||||||
* other server names on the rest of your IRC network. Note that it does not have
|
|
||||||
* to be an existing hostname, just one that isn't on your network already.
|
|
||||||
*/
|
|
||||||
name = "stats.example.com"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The text which should appear as the server's information in /WHOIS and similar
|
|
||||||
* queries.
|
|
||||||
*/
|
|
||||||
description = "Stats for IRC Networks"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The local address that Services will bind to before connecting to the remote
|
|
||||||
* server. This may be useful for multihomed hosts. If omitted, Services will let
|
|
||||||
* the Operating System choose the local address. This directive is optional.
|
|
||||||
*
|
|
||||||
* If you don't know what this means or don't need to use it, just leave this
|
|
||||||
* directive commented out.
|
|
||||||
*/
|
|
||||||
#localhost = "nowhere."
|
|
||||||
|
|
||||||
/*
|
|
||||||
* What Server ID to use for this connection?
|
|
||||||
* Note: This should *ONLY* be used for TS6/P10 IRCds. Refer to your IRCd documentation
|
|
||||||
* to see if this is needed.
|
|
||||||
*/
|
|
||||||
#id = "00A"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The filename containing the Services process ID. The path is relative to the
|
|
||||||
* services root directory.
|
|
||||||
*/
|
|
||||||
pid = "data/stats.pid"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The filename containing the Message of the Day. The path is relative to the
|
|
||||||
* services root directory.
|
|
||||||
*/
|
|
||||||
motd = "conf/stats.motd"
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* [REQUIRED] Protocol module
|
|
||||||
*
|
|
||||||
* This directive tells Anope which IRCd Protocol to speak when connecting.
|
|
||||||
* You MUST modify this to match the IRCd you run.
|
|
||||||
*
|
|
||||||
* Supported:
|
|
||||||
* - [DEPRECATED] bahamut
|
|
||||||
* - charybdis
|
|
||||||
* - hybrid
|
|
||||||
* - [DEPRECATED] inspircd12
|
|
||||||
* - [DEPRECATED] inspircd20
|
|
||||||
* - inspircd3 (for 3.x and 4.x)
|
|
||||||
* - ngircd
|
|
||||||
* - plexus
|
|
||||||
* - ratbox
|
|
||||||
* - [DEPRECATED] unreal (for 3.2.x)
|
|
||||||
* - unreal4 (for 4.x or later)
|
|
||||||
*/
|
|
||||||
module
|
|
||||||
{
|
|
||||||
name = "inspircd3"
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* [REQUIRED] Network Information
|
|
||||||
*
|
|
||||||
* This section contains information about the IRC network that Services will be
|
|
||||||
* connecting to.
|
|
||||||
*/
|
|
||||||
networkinfo
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* This is the name of the network that Services will be running on.
|
|
||||||
*/
|
|
||||||
networkname = "LocalNet"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Set this to the maximum allowed nick length on your network.
|
|
||||||
* Be sure to set this correctly, as setting this wrong can result in
|
|
||||||
* Services being disconnected from the network.
|
|
||||||
*/
|
|
||||||
nicklen = 31
|
|
||||||
|
|
||||||
/* Set this to the maximum allowed ident length on your network.
|
|
||||||
* Be sure to set this correctly, as setting this wrong can result in
|
|
||||||
* Services being disconnected from the network.
|
|
||||||
*/
|
|
||||||
userlen = 10
|
|
||||||
|
|
||||||
/* Set this to the maximum allowed hostname length on your network.
|
|
||||||
* Be sure to set this correctly, as setting this wrong can result in
|
|
||||||
* Services being disconnected from the network.
|
|
||||||
*/
|
|
||||||
hostlen = 64
|
|
||||||
|
|
||||||
/* Set this to the maximum allowed channel length on your network.
|
|
||||||
*/
|
|
||||||
chanlen = 32
|
|
||||||
|
|
||||||
/* The maximum number of list modes settable on a channel (such as b, e, I).
|
|
||||||
* Comment out or set to 0 to disable.
|
|
||||||
*/
|
|
||||||
modelistsize = 100
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The characters allowed in hostnames. This is used for validating hostnames given
|
|
||||||
* to services, such as BotServ bot hostnames and user vhosts. Changing this is not
|
|
||||||
* recommended unless you know for sure your IRCd supports whatever characters you are
|
|
||||||
* wanting to use. Telling services to set a vHost containing characters your IRCd
|
|
||||||
* disallows could potentially break the IRCd and/or Services.
|
|
||||||
*
|
|
||||||
* It is recommended you DON'T change this.
|
|
||||||
*/
|
|
||||||
vhost_chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.-/"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If set to true, allows vHosts to not contain dots (.).
|
|
||||||
* Newer IRCds generally do not have a problem with this, but the same warning as
|
|
||||||
* vhost_chars applies.
|
|
||||||
*
|
|
||||||
* It is recommended you DON'T change this.
|
|
||||||
*/
|
|
||||||
allow_undotted_vhosts = no
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The characters that are not allowed to be at the very beginning or very ending
|
|
||||||
* of a vHost. The same warning as vhost_chars applies.
|
|
||||||
*
|
|
||||||
* It is recommended you DON'T change this.
|
|
||||||
*/
|
|
||||||
disallow_start_or_end = ".-/"
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* [REQUIRED] Services Options
|
|
||||||
*
|
|
||||||
* This section contains various options which determine how Services will operate.
|
|
||||||
*/
|
|
||||||
options
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* On Linux/UNIX systems Anope can setuid and setgid to this user and group
|
|
||||||
* after starting up. This is useful if Anope has to bind to privileged ports
|
|
||||||
*/
|
|
||||||
#user = "anope"
|
|
||||||
#group = "anope"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The case mapping used by services. This must be set to a valid locale name
|
|
||||||
* installed on your machine. Services use this case map to compare, with
|
|
||||||
* case insensitivity, things such as nick names, channel names, etc.
|
|
||||||
*
|
|
||||||
* We provide two special casemaps shipped with Anope, ascii and rfc1459.
|
|
||||||
*
|
|
||||||
* This value should be set to what your IRCd uses, which is probably rfc1459,
|
|
||||||
* however Anope has always used ascii for comparison, so the default is ascii.
|
|
||||||
*
|
|
||||||
* Changing this value once set is not recommended.
|
|
||||||
*/
|
|
||||||
casemap = "ascii"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Sets the timeout period for reading from the uplink.
|
|
||||||
*/
|
|
||||||
readtimeout = 5s
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If set, Services will only show /stats o to IRC Operators. This directive
|
|
||||||
* is optional.
|
|
||||||
*/
|
|
||||||
#hidestatso = yes
|
|
||||||
|
|
||||||
/*
|
|
||||||
* A space-separated list of U-lined servers on your network, it is assumed that
|
|
||||||
* the servers in this list are allowed to set channel modes and Services will
|
|
||||||
* not attempt to reverse their mode changes.
|
|
||||||
*
|
|
||||||
* WARNING: Do NOT put your normal IRC user servers in this directive.
|
|
||||||
*
|
|
||||||
* This directive is optional.
|
|
||||||
*/
|
|
||||||
#ulineservers = "services.your.network"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* How long to wait between connection retries with the uplink(s).
|
|
||||||
*/
|
|
||||||
retrywait = 60s
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* [RECOMMENDED] Logging Configuration
|
|
||||||
*
|
|
||||||
* This section is used for configuring what is logged and where it is logged to.
|
|
||||||
* You may have multiple log blocks if you wish. Remember to properly secure any
|
|
||||||
* channels you choose to have Anope log to!
|
|
||||||
*/
|
|
||||||
log
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* Target(s) to log to, which may be one of the following:
|
|
||||||
* - a channel name
|
|
||||||
* - a filename
|
|
||||||
* - globops
|
|
||||||
*/
|
|
||||||
target = "stats.log"
|
|
||||||
|
|
||||||
/* Log to both stats.log and the channel #stats
|
|
||||||
*
|
|
||||||
* Note that some older IRCds, such as Ratbox, require services to be in the
|
|
||||||
* log channel to be able to message it. To do this, configure service:channels to
|
|
||||||
* join your logging channel.
|
|
||||||
*/
|
|
||||||
#target = "stats.log #stats"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The source(s) to only accept log messages from. Leave commented to allow all sources.
|
|
||||||
* This can be a users name, a channel name, one of our clients (e.g. OperServ), or a server name.
|
|
||||||
*/
|
|
||||||
#source = ""
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The bot used to log generic messages which have no predefined sender if the
|
|
||||||
* target directive is set to a channel or globops.
|
|
||||||
*/
|
|
||||||
bot = "Global"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The number of days to keep log files, only useful if you are logging to a file.
|
|
||||||
* Set to 0 to never delete old log files.
|
|
||||||
*
|
|
||||||
* Note that Anope must run 24 hours a day for this feature to work correctly.
|
|
||||||
*/
|
|
||||||
logage = 7
|
|
||||||
|
|
||||||
/*
|
|
||||||
* What types of log messages should be logged by this block. There are nine general categories:
|
|
||||||
*
|
|
||||||
* servers - Server actions, linking, squitting, etc.
|
|
||||||
* channels - Actions in channels such as joins, parts, kicks, etc.
|
|
||||||
* users - User actions such as connecting, disconnecting, changing name, etc.
|
|
||||||
* other - All other messages without a category.
|
|
||||||
* rawio - Logs raw input and output from services
|
|
||||||
* debug - Debug messages (log files can become VERY large from this).
|
|
||||||
*
|
|
||||||
* These options determine what messages from the categories should be logged. Wildcards are accepted, and
|
|
||||||
* you can also negate values with a ~. For example, "~operserv/akill operserv/*" would log all operserv
|
|
||||||
* messages except for operserv/akill. Note that processing stops at the first matching option, which
|
|
||||||
* means "* ~operserv/*" would log everything because * matches everything.
|
|
||||||
*
|
|
||||||
* Valid server options are:
|
|
||||||
* connect, quit, sync, squit
|
|
||||||
*
|
|
||||||
* Valid channel options are:
|
|
||||||
* create, destroy, join, part, kick, leave, mode
|
|
||||||
*
|
|
||||||
* Valid user options are:
|
|
||||||
* connect, disconnect, quit, nick, ident, host, mode, maxusers, oper, away
|
|
||||||
*
|
|
||||||
* Rawio and debug are simple yes/no answers, there are no types for them.
|
|
||||||
*
|
|
||||||
* Note that modules may add their own values to these options.
|
|
||||||
*/
|
|
||||||
servers = "*"
|
|
||||||
#channels = "~mode *"
|
|
||||||
users = "connect disconnect nick"
|
|
||||||
other = "*"
|
|
||||||
rawio = no
|
|
||||||
debug = no
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* [REQUIRED] MySQL Database configuration.
|
|
||||||
*
|
|
||||||
* m_mysql
|
|
||||||
*
|
|
||||||
* This module allows other modules to use MySQL.
|
|
||||||
*/
|
|
||||||
module
|
|
||||||
{
|
|
||||||
name = "m_mysql"
|
|
||||||
|
|
||||||
mysql
|
|
||||||
{
|
|
||||||
/* The name of this service. */
|
|
||||||
name = "mysql/main"
|
|
||||||
database = "anope"
|
|
||||||
server = "127.0.0.1"
|
|
||||||
username = "anope"
|
|
||||||
password = "mypassword"
|
|
||||||
port = 3306
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* IRC2SQL Gateway
|
|
||||||
* This module collects data about users, channels and servers. It doesn't build stats
|
|
||||||
* itself, however, it gives you the database, it's up to you how you use it.
|
|
||||||
*
|
|
||||||
* Requires a MySQL Database and MySQL version 5.5 or higher
|
|
||||||
*/
|
|
||||||
include
|
|
||||||
{
|
|
||||||
type = "file"
|
|
||||||
name = "irc2sql.example.conf"
|
|
||||||
}
|
|
||||||
+432
@@ -0,0 +1,432 @@
|
|||||||
|
|
||||||
|
-- If you need to create your db, uncomment the following lines.
|
||||||
|
--
|
||||||
|
-- CREATE DATABASE anope;
|
||||||
|
-- USE anope;
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table 'anope_bs_core'
|
||||||
|
--
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS anope_bs_core;
|
||||||
|
CREATE TABLE anope_bs_core (
|
||||||
|
bs_id int(11) NOT NULL auto_increment,
|
||||||
|
nick varchar(255) NOT NULL default '',
|
||||||
|
`user` text NOT NULL,
|
||||||
|
host text NOT NULL,
|
||||||
|
rname text NOT NULL,
|
||||||
|
flags int(11) NOT NULL default '0',
|
||||||
|
created int(11) NOT NULL default '0',
|
||||||
|
chancount int(11) NOT NULL default '0',
|
||||||
|
active int(1) NOT NULL default '1',
|
||||||
|
PRIMARY KEY (bs_id),
|
||||||
|
UNIQUE KEY nick (nick)
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table 'anope_cs_access'
|
||||||
|
--
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS anope_cs_access;
|
||||||
|
CREATE TABLE anope_cs_access (
|
||||||
|
ca_id int(11) NOT NULL auto_increment,
|
||||||
|
in_use int(11) NOT NULL default '0',
|
||||||
|
`level` int(11) NOT NULL default '0',
|
||||||
|
display varchar(255) NOT NULL default '',
|
||||||
|
channel varchar(255) NOT NULL default '',
|
||||||
|
last_seen int(11) NOT NULL default '0',
|
||||||
|
active tinyint(1) NOT NULL default '1',
|
||||||
|
PRIMARY KEY (ca_id),
|
||||||
|
UNIQUE KEY channel (channel,display)
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table 'anope_cs_akicks'
|
||||||
|
--
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS anope_cs_akicks;
|
||||||
|
CREATE TABLE anope_cs_akicks (
|
||||||
|
ck_id int(11) NOT NULL auto_increment,
|
||||||
|
channel varchar(255) NOT NULL default '',
|
||||||
|
flags int(11) NOT NULL default '0',
|
||||||
|
dmask varchar(255) NOT NULL,
|
||||||
|
reason text NOT NULL,
|
||||||
|
creator text NOT NULL,
|
||||||
|
addtime int(11) NOT NULL default '0',
|
||||||
|
active tinyint(1) NOT NULL default '1',
|
||||||
|
PRIMARY KEY (ck_id),
|
||||||
|
UNIQUE KEY channel (channel,dmask)
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table 'anope_cs_badwords'
|
||||||
|
--
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS anope_cs_badwords;
|
||||||
|
CREATE TABLE anope_cs_badwords (
|
||||||
|
cw_id int(11) NOT NULL auto_increment,
|
||||||
|
channel varchar(255) NOT NULL default '',
|
||||||
|
word varchar(255) NOT NULL,
|
||||||
|
`type` int(11) NOT NULL default '0',
|
||||||
|
active tinyint(1) NOT NULL default '1',
|
||||||
|
PRIMARY KEY (cw_id),
|
||||||
|
UNIQUE KEY channel (channel,word)
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table 'anope_cs_info'
|
||||||
|
--
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS anope_cs_info;
|
||||||
|
CREATE TABLE anope_cs_info (
|
||||||
|
ci_id int(11) NOT NULL auto_increment,
|
||||||
|
`name` varchar(255) NOT NULL default '',
|
||||||
|
founder text NOT NULL,
|
||||||
|
successor text NOT NULL,
|
||||||
|
founderpass tinyblob NOT NULL,
|
||||||
|
descr text NOT NULL,
|
||||||
|
url text NOT NULL,
|
||||||
|
email text NOT NULL,
|
||||||
|
time_registered int(10) unsigned NOT NULL default '0',
|
||||||
|
last_used int(10) unsigned NOT NULL default '0',
|
||||||
|
last_topic text NOT NULL,
|
||||||
|
last_topic_setter text NOT NULL,
|
||||||
|
last_topic_time int(10) unsigned NOT NULL default '0',
|
||||||
|
flags int(10) unsigned NOT NULL default '0',
|
||||||
|
forbidby text NOT NULL,
|
||||||
|
forbidreason text NOT NULL,
|
||||||
|
bantype smallint(6) NOT NULL default '0',
|
||||||
|
accesscount smallint(6) NOT NULL default '0',
|
||||||
|
akickcount smallint(6) NOT NULL default '0',
|
||||||
|
mlock_on int(10) unsigned NOT NULL default '0',
|
||||||
|
mlock_off int(10) unsigned NOT NULL default '0',
|
||||||
|
mlock_limit int(10) unsigned NOT NULL default '0',
|
||||||
|
mlock_key text NOT NULL,
|
||||||
|
mlock_flood text NOT NULL,
|
||||||
|
mlock_redirect text NOT NULL,
|
||||||
|
entry_message text NOT NULL,
|
||||||
|
memomax smallint(5) unsigned NOT NULL default '0',
|
||||||
|
botnick varchar(255) NOT NULL default '',
|
||||||
|
botflags int(10) unsigned NOT NULL default '0',
|
||||||
|
bwcount smallint(6) NOT NULL default '0',
|
||||||
|
capsmin smallint(6) NOT NULL default '0',
|
||||||
|
capspercent smallint(6) NOT NULL default '0',
|
||||||
|
floodlines smallint(6) NOT NULL default '0',
|
||||||
|
floodsecs smallint(6) NOT NULL default '0',
|
||||||
|
repeattimes smallint(6) NOT NULL default '0',
|
||||||
|
active tinyint(1) NOT NULL default '1',
|
||||||
|
PRIMARY KEY (ci_id),
|
||||||
|
UNIQUE KEY `name` (`name`)
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table 'anope_cs_levels'
|
||||||
|
--
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS anope_cs_levels;
|
||||||
|
CREATE TABLE anope_cs_levels (
|
||||||
|
cl_id int(11) NOT NULL auto_increment,
|
||||||
|
channel varchar(255) NOT NULL default '',
|
||||||
|
position int(11) NOT NULL default '0',
|
||||||
|
`level` int(11) NOT NULL default '0',
|
||||||
|
active tinyint(1) NOT NULL default '1',
|
||||||
|
PRIMARY KEY (cl_id),
|
||||||
|
UNIQUE KEY channel (channel,position)
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table 'anope_cs_ttb'
|
||||||
|
--
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS anope_cs_ttb;
|
||||||
|
CREATE TABLE anope_cs_ttb (
|
||||||
|
ct_id int(11) NOT NULL auto_increment,
|
||||||
|
channel varchar(255) NOT NULL default '',
|
||||||
|
ttb_id int(11) NOT NULL default '0',
|
||||||
|
`value` int(11) NOT NULL default '0',
|
||||||
|
active tinyint(1) NOT NULL default '1',
|
||||||
|
PRIMARY KEY (ct_id),
|
||||||
|
UNIQUE KEY channel (channel,ttb_id)
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table 'anope_hs_core'
|
||||||
|
--
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS anope_hs_core;
|
||||||
|
CREATE TABLE anope_hs_core (
|
||||||
|
bs_id int(11) NOT NULL auto_increment,
|
||||||
|
nick varchar(255) NOT NULL default '',
|
||||||
|
vident text NOT NULL,
|
||||||
|
vhost text NOT NULL,
|
||||||
|
creator text NOT NULL,
|
||||||
|
`time` int(11) NOT NULL default '0',
|
||||||
|
active tinyint(1) NOT NULL default '1',
|
||||||
|
PRIMARY KEY (bs_id),
|
||||||
|
UNIQUE KEY nick (nick)
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table 'anope_info'
|
||||||
|
--
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS anope_info;
|
||||||
|
CREATE TABLE anope_info (
|
||||||
|
version int(11) default NULL,
|
||||||
|
`date` datetime default NULL
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table 'anope_ms_info'
|
||||||
|
--
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS anope_ms_info;
|
||||||
|
CREATE TABLE anope_ms_info (
|
||||||
|
nm_id int(11) NOT NULL auto_increment,
|
||||||
|
receiver varchar(255) NOT NULL,
|
||||||
|
number int(11) NOT NULL default '0',
|
||||||
|
flags int(11) NOT NULL default '0',
|
||||||
|
`time` int(11) NOT NULL default '0',
|
||||||
|
sender text NOT NULL,
|
||||||
|
`text` blob NOT NULL,
|
||||||
|
serv enum('NICK','CHAN') NOT NULL default 'NICK',
|
||||||
|
active tinyint(1) NOT NULL default '1',
|
||||||
|
PRIMARY KEY (nm_id),
|
||||||
|
UNIQUE KEY nm_id (nm_id,serv),
|
||||||
|
KEY receiver (receiver,serv)
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table 'anope_ns_access'
|
||||||
|
--
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS anope_ns_access;
|
||||||
|
CREATE TABLE anope_ns_access (
|
||||||
|
na_id int(11) NOT NULL auto_increment,
|
||||||
|
display varchar(255) NOT NULL default '',
|
||||||
|
access text NOT NULL,
|
||||||
|
active tinyint(1) NOT NULL default '1',
|
||||||
|
PRIMARY KEY (na_id)
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table 'anope_ns_alias'
|
||||||
|
--
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS anope_ns_alias;
|
||||||
|
CREATE TABLE anope_ns_alias (
|
||||||
|
na_id int(11) NOT NULL auto_increment,
|
||||||
|
display varchar(255) NOT NULL default '',
|
||||||
|
nick varchar(255) NOT NULL default '',
|
||||||
|
time_registered int(10) unsigned NOT NULL default '0',
|
||||||
|
last_seen int(10) unsigned NOT NULL default '0',
|
||||||
|
`status` int(11) unsigned NOT NULL default '0',
|
||||||
|
last_usermask text NOT NULL,
|
||||||
|
last_realname text NOT NULL,
|
||||||
|
last_quit text NOT NULL,
|
||||||
|
active tinyint(1) NOT NULL default '1',
|
||||||
|
PRIMARY KEY (na_id),
|
||||||
|
UNIQUE KEY nick (nick)
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table 'anope_ns_core'
|
||||||
|
--
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS anope_ns_core;
|
||||||
|
CREATE TABLE anope_ns_core (
|
||||||
|
nc_id int(11) NOT NULL auto_increment,
|
||||||
|
display varchar(255) NOT NULL default '',
|
||||||
|
pass tinyblob NOT NULL,
|
||||||
|
email text NOT NULL,
|
||||||
|
icq int(10) unsigned NOT NULL default '0',
|
||||||
|
url text NOT NULL,
|
||||||
|
flags int(11) NOT NULL default '0',
|
||||||
|
`language` smallint(5) unsigned NOT NULL default '0',
|
||||||
|
accesscount smallint(6) NOT NULL default '0',
|
||||||
|
memocount smallint(5) unsigned NOT NULL default '0',
|
||||||
|
memomax smallint(5) unsigned NOT NULL default '0',
|
||||||
|
channelcount smallint(5) unsigned NOT NULL default '0',
|
||||||
|
channelmax smallint(5) unsigned NOT NULL default '0',
|
||||||
|
greet text NOT NULL,
|
||||||
|
active tinyint(1) NOT NULL default '1',
|
||||||
|
PRIMARY KEY (nc_id),
|
||||||
|
UNIQUE KEY display (display)
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table 'anope_ns_request'
|
||||||
|
--
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS anope_ns_request;
|
||||||
|
CREATE TABLE anope_ns_request (
|
||||||
|
nr_id int(11) NOT NULL auto_increment,
|
||||||
|
nick varchar(255) NOT NULL default '',
|
||||||
|
passcode text NOT NULL,
|
||||||
|
`password` tinyblob NOT NULL,
|
||||||
|
email text NOT NULL,
|
||||||
|
requested int(11) NOT NULL default '0',
|
||||||
|
active tinyint(1) NOT NULL default '1',
|
||||||
|
PRIMARY KEY (nr_id),
|
||||||
|
UNIQUE KEY nick (nick)
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table 'anope_os_akills'
|
||||||
|
--
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS anope_os_akills;
|
||||||
|
CREATE TABLE anope_os_akills (
|
||||||
|
ok_id int(11) NOT NULL auto_increment,
|
||||||
|
`user` varchar(255) NOT NULL,
|
||||||
|
host varchar(255) NOT NULL,
|
||||||
|
xby text NOT NULL,
|
||||||
|
reason text NOT NULL,
|
||||||
|
seton int(11) NOT NULL default '0',
|
||||||
|
expire int(11) NOT NULL default '0',
|
||||||
|
active tinyint(1) NOT NULL default '1',
|
||||||
|
PRIMARY KEY (ok_id),
|
||||||
|
UNIQUE KEY `user` (`user`,host)
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table 'anope_os_core'
|
||||||
|
--
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS anope_os_core;
|
||||||
|
CREATE TABLE anope_os_core (
|
||||||
|
oc_id int(11) NOT NULL auto_increment,
|
||||||
|
maxusercnt int(11) NOT NULL default '0',
|
||||||
|
maxusertime int(11) NOT NULL default '0',
|
||||||
|
akills_count int(11) NOT NULL default '0',
|
||||||
|
sglines_count int(11) NOT NULL default '0',
|
||||||
|
sqlines_count int(11) NOT NULL default '0',
|
||||||
|
szlines_count int(11) NOT NULL default '0',
|
||||||
|
PRIMARY KEY (oc_id)
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table 'anope_os_exceptions'
|
||||||
|
--
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS anope_os_exceptions;
|
||||||
|
CREATE TABLE anope_os_exceptions (
|
||||||
|
oe_id int(11) NOT NULL auto_increment,
|
||||||
|
mask varchar(255) NOT NULL,
|
||||||
|
lim int(11) NOT NULL default '0',
|
||||||
|
who text NOT NULL,
|
||||||
|
reason text NOT NULL,
|
||||||
|
`time` int(11) NOT NULL default '0',
|
||||||
|
expires int(11) NOT NULL default '0',
|
||||||
|
active tinyint(1) NOT NULL default '1',
|
||||||
|
PRIMARY KEY (oe_id),
|
||||||
|
UNIQUE KEY mask (mask)
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table 'anope_os_news'
|
||||||
|
--
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS anope_os_news;
|
||||||
|
CREATE TABLE anope_os_news (
|
||||||
|
on_id int(11) NOT NULL auto_increment,
|
||||||
|
`type` int(11) NOT NULL default '0',
|
||||||
|
num int(11) NOT NULL default '0',
|
||||||
|
ntext text NOT NULL,
|
||||||
|
who text NOT NULL,
|
||||||
|
`time` int(11) NOT NULL default '0',
|
||||||
|
active tinyint(1) NOT NULL default '1',
|
||||||
|
PRIMARY KEY (on_id),
|
||||||
|
UNIQUE KEY `type` (`type`,num,`time`)
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table 'anope_os_sglines'
|
||||||
|
--
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS anope_os_sglines;
|
||||||
|
CREATE TABLE anope_os_sglines (
|
||||||
|
og_id int(11) NOT NULL auto_increment,
|
||||||
|
mask varchar(255) NOT NULL,
|
||||||
|
xby text NOT NULL,
|
||||||
|
reason text NOT NULL,
|
||||||
|
seton int(11) NOT NULL default '0',
|
||||||
|
expire int(11) NOT NULL default '0',
|
||||||
|
active tinyint(1) NOT NULL default '1',
|
||||||
|
PRIMARY KEY (og_id),
|
||||||
|
UNIQUE KEY mask (mask)
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table 'anope_os_sqlines'
|
||||||
|
--
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS anope_os_sqlines;
|
||||||
|
CREATE TABLE anope_os_sqlines (
|
||||||
|
og_id int(11) NOT NULL auto_increment,
|
||||||
|
mask varchar(255) NOT NULL,
|
||||||
|
xby text NOT NULL,
|
||||||
|
reason text NOT NULL,
|
||||||
|
seton int(11) NOT NULL default '0',
|
||||||
|
expire int(11) NOT NULL default '0',
|
||||||
|
active tinyint(1) NOT NULL default '1',
|
||||||
|
PRIMARY KEY (og_id),
|
||||||
|
UNIQUE KEY mask (mask)
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table 'anope_os_szlines'
|
||||||
|
--
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS anope_os_szlines;
|
||||||
|
CREATE TABLE anope_os_szlines (
|
||||||
|
og_id int(11) NOT NULL auto_increment,
|
||||||
|
mask varchar(255) NOT NULL,
|
||||||
|
xby text NOT NULL,
|
||||||
|
reason text NOT NULL,
|
||||||
|
seton int(11) NOT NULL default '0',
|
||||||
|
expire int(11) NOT NULL default '0',
|
||||||
|
active tinyint(1) NOT NULL default '1',
|
||||||
|
PRIMARY KEY (og_id),
|
||||||
|
UNIQUE KEY mask (mask)
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
@@ -1 +0,0 @@
|
|||||||
astyle --style=java --indent=tab --brackets=break-closing --indent-switches --indent-cases --brackets=break
|
|
||||||
@@ -1 +1,4 @@
|
|||||||
For all bug reports / updates please see https://github.com/anope/anope/issues
|
Reported Bugs from Tracker: http://bugs.anope.org/
|
||||||
|
---------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
-111
@@ -1,111 +0,0 @@
|
|||||||
C++-style Casting
|
|
||||||
=================
|
|
||||||
|
|
||||||
In C, you can cast in one of two ways:
|
|
||||||
|
|
||||||
(type)var
|
|
||||||
type(var)
|
|
||||||
|
|
||||||
The problem with C-style casting is that it allows a programmer to get away
|
|
||||||
with too much, and is also not designed to handle C++ classes.
|
|
||||||
|
|
||||||
C++ has 4 types of casting in addition to allowing C-style casting. They are:
|
|
||||||
|
|
||||||
static_cast
|
|
||||||
const_cast
|
|
||||||
dynamic_cast
|
|
||||||
reinterpret_cast
|
|
||||||
|
|
||||||
The syntax is usually *_cast<type>(var).
|
|
||||||
|
|
||||||
static_cast
|
|
||||||
-----------
|
|
||||||
|
|
||||||
From my experience, this cast is closest to C-style casting for non-pointer
|
|
||||||
types as well as between some (but not all) pointer types. This type of cast,
|
|
||||||
like C-style casting, is performed at compile-time. static_cast can also do
|
|
||||||
a downcast of a derived class to a base class, but only if the base class is
|
|
||||||
not a virtual base class. Sometimes the result of this cast can become
|
|
||||||
undefined. static_cast is a bit more strict that C-style casting, though. It
|
|
||||||
disallows certain class conversions that would've been allowed with a C-style
|
|
||||||
cast. static_cast also doesn't allow you to cast to an incomplete type. In
|
|
||||||
these cases, I would try either dynamic_cast or reinterpret_cast.
|
|
||||||
|
|
||||||
const_cast
|
|
||||||
----------
|
|
||||||
|
|
||||||
This cast is mainly to add or remove const-ness or volatile-ness from a
|
|
||||||
variable. This is safer than using a C-style cast to change the const-ness
|
|
||||||
of a variable. In most cases if you try to use one of the other casts and it
|
|
||||||
complains about const-ness, you will want to either use this cast instead or
|
|
||||||
wrap the other cast around this cast. An example:
|
|
||||||
|
|
||||||
const int *a;
|
|
||||||
static_cast<void *>(a); <-- This will fail.
|
|
||||||
|
|
||||||
To remedy the above, you would might try this:
|
|
||||||
|
|
||||||
const int *a;
|
|
||||||
const_cast<void *>(a); <-- But this will still fail.
|
|
||||||
|
|
||||||
The real solution is this:
|
|
||||||
|
|
||||||
const int *a;
|
|
||||||
static_cast<void *>(const_cast<int *>(a));
|
|
||||||
|
|
||||||
It is not recommended to use const_cast on the this variable within a member
|
|
||||||
function of a class that is declared const. Instead you should use the mutable
|
|
||||||
keyword on the variable in the class's definition.
|
|
||||||
|
|
||||||
dynamic_cast
|
|
||||||
------------
|
|
||||||
|
|
||||||
This cast can only be used on pointers or references to classes. It can cast a
|
|
||||||
derived class to a base class, a derived class to another derived class
|
|
||||||
(provided that both are children of the same base class), or a base class to a
|
|
||||||
derived class. You can also use this to cast a class to void *. This cast is
|
|
||||||
done at run-time as opposed to the other casts, and relies on C++'s RTTI to be
|
|
||||||
enabled. It is meant to be used on polymorphic classes, so use static_cast on
|
|
||||||
non-polymorphic classes.
|
|
||||||
|
|
||||||
derived-to-base conversions are actually done statically, so you use either
|
|
||||||
dynamic_cast or static_cast on them, regardless of if the classes are
|
|
||||||
polymorphic or not.
|
|
||||||
|
|
||||||
derived-to-derived or base-to-derived conversions, however, rely on run-time
|
|
||||||
type information, and this cast is used on those classes that are polymorphic.
|
|
||||||
This is safer than C-style casting in that an invalid pointer conversion will
|
|
||||||
return a NULL pointer, and an invalid reference conversion will throw a
|
|
||||||
Bad_cast exception.
|
|
||||||
|
|
||||||
Note that in Anope we prefer if Anope::debug_cast is used.
|
|
||||||
This uses dynamic_cast (and checks for a NULL pointer return) on debug builds
|
|
||||||
and static_cast on release builds, to speed up the program because of dynamic_cast's
|
|
||||||
reliance on RTTI.
|
|
||||||
|
|
||||||
reinterpret_cast
|
|
||||||
----------------
|
|
||||||
|
|
||||||
This cast I would use only as a last resort if static_cast isn't allowed on a
|
|
||||||
conversion. It allows for conversions between two unrelated types, such as
|
|
||||||
going from char * to int *. It can also be used to convert a pointer to an
|
|
||||||
integral type and vica versa. The sites I've read mention how the result is
|
|
||||||
non-portable, which I assume means the resulting object code is non-portable,
|
|
||||||
so since the code is compiled on many systems anyways, I don't see this as
|
|
||||||
being a huge issue. It is recommended to only use this if necessary, though.
|
|
||||||
|
|
||||||
Links
|
|
||||||
=====
|
|
||||||
|
|
||||||
The following links are web sites I've used to get this information, and might
|
|
||||||
describe some of the above a bit better than I have. :P
|
|
||||||
|
|
||||||
https://www.acm.org/crossroads/xrds3-1/ovp3-1.html
|
|
||||||
http://www.cplusplus.com/doc/tutorial/typecasting.html
|
|
||||||
http://www.codeguru.com/forum/showthread.php?t=312456
|
|
||||||
https://web.archive.org/web/20170810222238/http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/BitOp/cast.html
|
|
||||||
https://www.microsoft.com/en-us/download/details.aspx?id=55984
|
|
||||||
https://en.wikibooks.org/wiki/C%2B%2B_Programming/Type_Casting
|
|
||||||
https://web.archive.org/web/20160510114447/http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=134
|
|
||||||
|
|
||||||
-- CyberBotX, Nov 23, 2008
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
# We only need to install these docs on Windows as most Windows installations will be binary, not source
|
|
||||||
if(WIN32)
|
|
||||||
# Only install given files from this directory
|
|
||||||
# NOTE: I would've had this just find all files in the directory, but that would include files not needed (like this file)
|
|
||||||
execute_process(COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/README ${CMAKE_CURRENT_BINARY_DIR}/README.txt)
|
|
||||||
if(IN_SOURCE)
|
|
||||||
# Add README.txt to list of files for CPack to ignore
|
|
||||||
add_to_cpack_ignored_files("README.txt$" TRUE)
|
|
||||||
endif(IN_SOURCE)
|
|
||||||
set(DOCS Changes Changes.conf DEFCON FAQ INSTALL LANGUAGE MODULES NEWS ${CMAKE_CURRENT_BINARY_DIR}/README.txt WIN32.txt)
|
|
||||||
install(FILES ${DOCS}
|
|
||||||
DESTINATION ${DOC_DIR}
|
|
||||||
)
|
|
||||||
set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${CMAKE_CURRENT_BINARY_DIR}/README.txt")
|
|
||||||
endif(WIN32)
|
|
||||||
-239
@@ -1,239 +0,0 @@
|
|||||||
Originally pulled from: https://wiki.inspircd.org/Coding_Guidelines
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
InspIRCd Coding Guidelines
|
|
||||||
|
|
||||||
The following are a set of guidelines for writing patches to InspIRCd, or for
|
|
||||||
creating modules for distribution with the official package. These guidelines
|
|
||||||
were written a time after InspIRCd development started, and so not all code
|
|
||||||
yet follows these. This will be rectified with time.
|
|
||||||
|
|
||||||
|
|
||||||
1. Comments
|
|
||||||
|
|
||||||
* Multi Line
|
|
||||||
Multiple line comments should follow the C-style comment, for example:
|
|
||||||
/*
|
|
||||||
* This is a multiple line comment, huzzah..
|
|
||||||
*/
|
|
||||||
|
|
||||||
* Single Line
|
|
||||||
Single line comments should also be in the C style, for example:
|
|
||||||
/* This is a boring one-line comment */
|
|
||||||
|
|
||||||
* Doxygen commenting
|
|
||||||
If you wish your comment to show in doxygen, the comment should be directly
|
|
||||||
above the item you are documenting (a class, function, enum, etc) and the
|
|
||||||
first line should be "/**". For example:
|
|
||||||
/** This is a doxygen multiline comment.
|
|
||||||
* Description of thingymebob here.
|
|
||||||
*/
|
|
||||||
|
|
||||||
The first line after the "**" is used as the short description of the item
|
|
||||||
(up to the full stop) and everything afterwards as the detailed description.
|
|
||||||
|
|
||||||
|
|
||||||
2. Indentation
|
|
||||||
|
|
||||||
Tabs. Tabs. ONLY TABS. Use a single tab for each level of indentation,
|
|
||||||
for example:
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
<tab>if (condition)
|
|
||||||
<tab>{
|
|
||||||
<tab><tab>code
|
|
||||||
<tab>}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
3. Separation
|
|
||||||
|
|
||||||
Always put a space in between a keyword like if/while and the condition,
|
|
||||||
for example:
|
|
||||||
if (foo == bar)
|
|
||||||
NOT
|
|
||||||
if(foo == bar)
|
|
||||||
|
|
||||||
|
|
||||||
4. Braces
|
|
||||||
|
|
||||||
Always put braces opening and closing blocks on separate lines, see the
|
|
||||||
indentation example. For example, place braces like this:
|
|
||||||
if (apples == "green")
|
|
||||||
{
|
|
||||||
cout << "Apples are green" << endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
and not:
|
|
||||||
if (apples == "green") {
|
|
||||||
cout << "Apples are green" << endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
The one exception to this is if you are declaring a class method which is
|
|
||||||
only one line long, in that case the following is acceptable in most cases:
|
|
||||||
class foo : public bar
|
|
||||||
{
|
|
||||||
foo() { }
|
|
||||||
getrandomfoo() { return rand(); }
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
5. Templates
|
|
||||||
|
|
||||||
Where possible, use templates rather than #defines. Avoid use of RTTI.
|
|
||||||
|
|
||||||
|
|
||||||
6. Structs
|
|
||||||
|
|
||||||
Structs should be declared in the following fashion:
|
|
||||||
struct BodyPartBasket
|
|
||||||
{
|
|
||||||
int arms;
|
|
||||||
int legs;
|
|
||||||
int scrotalsacs;
|
|
||||||
};
|
|
||||||
and not like this:
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
int arms;
|
|
||||||
int legs;
|
|
||||||
int scrotalsacs;
|
|
||||||
} BodyPartBasket;
|
|
||||||
|
|
||||||
The second way is not required in C++ to be able to do this:
|
|
||||||
BodyPartBasket mybasket;
|
|
||||||
|
|
||||||
Plus, placing the name at the bottom of the declaration makes readability
|
|
||||||
more difficult (as you have to scroll down to the bottom of the struct to
|
|
||||||
find its name). (where possible, call them classes rather than structs.)
|
|
||||||
|
|
||||||
|
|
||||||
7. Variable naming
|
|
||||||
|
|
||||||
Class and struct names should be in camel case with a leading capital letter,
|
|
||||||
for example "MyBagOfBones" and not "my_bag_of_bones" or "mybagofbones".
|
|
||||||
Variable names can be in either camel case with a leading capital letter or
|
|
||||||
alternatively all lower case, so long as the same naming convention is
|
|
||||||
adhered to throughout the class. No classes or variables should be named in
|
|
||||||
capitals unless this makes sense for the name (for example "class DNS").
|
|
||||||
Constants and enum values should always be completely in CAPITALS and
|
|
||||||
underscores may be used, for example:
|
|
||||||
enum DecayState
|
|
||||||
{
|
|
||||||
DECAYED_MOULDY = 0,
|
|
||||||
DECAYED_SMELLY = 1,
|
|
||||||
DECAYED_MAGGOTS = 2
|
|
||||||
};
|
|
||||||
All value names in an enum should be started with the same text which should
|
|
||||||
be related in some way to the enum's use. For example "DNS_CNAME, DNS_A,
|
|
||||||
DNS_AAAA".
|
|
||||||
|
|
||||||
|
|
||||||
8. Use of references
|
|
||||||
|
|
||||||
Wherever possible, when dealing with any complex class, pass a const reference
|
|
||||||
rather than a copy of the class. For example:
|
|
||||||
MyThingy::MyThingy(const std::string &thingyvalue)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
Of course, if you intended to change the string you can just omit the 'const'.
|
|
||||||
|
|
||||||
|
|
||||||
9. Use of char pointers
|
|
||||||
|
|
||||||
Whenever you use char pointers (char*, char**) try to use const equivalents.
|
|
||||||
This is much safer and avoids ugly and dangerous casts. For example:
|
|
||||||
MyThingy::Thingify(const char* const* wotsits)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
If it is possible without performance loss, consider avoiding char pointers
|
|
||||||
altogether and using std::string instead.
|
|
||||||
|
|
||||||
|
|
||||||
10. Use of STL
|
|
||||||
|
|
||||||
For more information on use of STL in InspIRCd, please see the separate
|
|
||||||
STL FAQ.
|
|
||||||
|
|
||||||
|
|
||||||
11. Making copies of data
|
|
||||||
|
|
||||||
Never ever make a copy of a piece of data unless it is absolutely necessary.
|
|
||||||
For example, don't use strlcpy() to make a copy of the const char* string
|
|
||||||
returned by std::string::c_str(), if the change can be done to the std::string
|
|
||||||
itself. The same goes for unnecessary variable assignments, especially those
|
|
||||||
which assign large classes.
|
|
||||||
|
|
||||||
|
|
||||||
12. namespace std
|
|
||||||
|
|
||||||
Avoid the following:
|
|
||||||
using namespace std;
|
|
||||||
It might take a bit more typing, but things work better if you don't set
|
|
||||||
(then later assume) the namespace -- specify it explicitly when you want to
|
|
||||||
use it.
|
|
||||||
|
|
||||||
|
|
||||||
13. Linefeeds
|
|
||||||
|
|
||||||
Unix linefeeds only please. We do not like to see our screens covered in ^M.
|
|
||||||
|
|
||||||
|
|
||||||
14. Portability
|
|
||||||
|
|
||||||
Always make sure your code is portable to all supported operating systems,
|
|
||||||
remember of course that as of 1.1.8 this includes windows. Don't write code
|
|
||||||
that only works on windows, or only works on Linux. Test your code on all
|
|
||||||
platforms or ask for help from other developers who have the platforms you
|
|
||||||
want to test on.
|
|
||||||
|
|
||||||
* new() and delete(), malloc() and free()
|
|
||||||
Apart from the fact that using malloc() and free() is bad practice in C++
|
|
||||||
code, you must never use malloc() or free() in InspIRCd, within its modules
|
|
||||||
or within the core. This is because if you use malloc() or free() in windows,
|
|
||||||
the memory is claimed from the program's local heap.
|
|
||||||
In windows, each shared object (module, dll) has its own heap, which is
|
|
||||||
protected from other dlls and executables. To get around this issue and
|
|
||||||
allow more posix-like memory access from other dlls in the program (other
|
|
||||||
modules), InspIRCd overrides the operators new and delete to ensure that
|
|
||||||
memory allocated by them comes from the windows global heap. If you use
|
|
||||||
malloc() and free() for this, the ircd will segfault when another module
|
|
||||||
tries to access the memory you have allocated!
|
|
||||||
|
|
||||||
* strdup()
|
|
||||||
As with malloc(), above, strdup() should be avoided. Where strdup() is
|
|
||||||
absolutely necessary, use strnewdup() which is our strdup() implementation
|
|
||||||
that calls operator new instead of using malloc().
|
|
||||||
char arrays allocated by strnewdup() should be deleted with operator delete[].
|
|
||||||
|
|
||||||
* CoreExport and DllImport
|
|
||||||
Prefix all types you want to import or export to other modules with CoreExport
|
|
||||||
and DllImport macros. These do nothing in POSIX operating systems, however
|
|
||||||
in windows these are expanded to the instructions __declspec(dllimport) and
|
|
||||||
__declspec(dllexport) respectively depending on where they are used and how.
|
|
||||||
|
|
||||||
|
|
||||||
15. External Dependencies
|
|
||||||
|
|
||||||
If a module is compiled as standard, or the code is part of the core, you must
|
|
||||||
not use any dependencies that are not available as standard on all supported
|
|
||||||
operating systems beyond libstdc++, libc, and whatever else is currently
|
|
||||||
required to build the core. Modules which use nonstandard dependencies belong
|
|
||||||
in the modules/extra directory.
|
|
||||||
|
|
||||||
|
|
||||||
16. Profiling and Performance
|
|
||||||
|
|
||||||
It is one thing to assume that code performs bad, it is another thing to prove
|
|
||||||
that it actually is. A lot of experienced programmers talk about 'premature
|
|
||||||
optimisation', and here is what it means: if you have a piece of code called
|
|
||||||
once on startup that takes 10 seconds instead of one second to run, and a
|
|
||||||
piece of code that takes 0.05 seconds to run when it should take 0.01, and
|
|
||||||
it is called once per second, the second piece of code is the priority.
|
|
||||||
|
|
||||||
In other words, make sure that what you think is slow, and a performance
|
|
||||||
problem in Insp actually is.
|
|
||||||
To do this, use the callgrind tool from Valgrind (valgrind --tool=cachegrind
|
|
||||||
bin/inspircd -nofork -debug), and kcachegrind (or similar) to view the output
|
|
||||||
files.
|
|
||||||
-525
@@ -1,525 +0,0 @@
|
|||||||
Anope Version 2.0.21-git
|
|
||||||
------------------------
|
|
||||||
No significant changes.
|
|
||||||
|
|
||||||
Anope Version 2.0.20
|
|
||||||
--------------------
|
|
||||||
Fixed an escaped value that wasn't escaped enough in chanstats.
|
|
||||||
Fixed not having a handler for the FNAME message on InspIRCd.
|
|
||||||
Fixed os_stats reporting the SGLine expiry time as the SQLine expiry time.
|
|
||||||
Fixed the DNs and search filters not being escaped correctly in the ldap_authentication and ldap_oper modules.
|
|
||||||
Modernised the advice in docs/LANGUAGE regarding the installation of language packs.
|
|
||||||
|
|
||||||
Anope Version 2.0.19
|
|
||||||
--------------------
|
|
||||||
Added a Doxygen config file.
|
|
||||||
Backported various minor config changes from 2.1.
|
|
||||||
Fixed chanserv/enforce enforcing against founders.
|
|
||||||
Fixed creating channel entries in irc2sql.
|
|
||||||
Fixed not respecting the mode state when removing a mode lock.
|
|
||||||
Fixed reading the settings in m_dns.
|
|
||||||
Fixed resetpass confirming accounts when not using email confirmation.
|
|
||||||
Fixed trying to write to a buffered socket when there's no data.
|
|
||||||
Fixed various minor spelling issues.
|
|
||||||
Updated some messages for the language used by modern BIND versions.
|
|
||||||
|
|
||||||
Anope Version 2.0.18
|
|
||||||
--------------------
|
|
||||||
Backported better sendmail error messages from 2.1.
|
|
||||||
Backported the Windows CI fom 2.1.
|
|
||||||
Fixed a CMake error when it encounters a hard to parse header file.
|
|
||||||
Fixed being able to group guest nicknames.
|
|
||||||
Fixed building Anope with CMake 4.
|
|
||||||
Fixed compatibility with MariaDB.
|
|
||||||
Fixed counting email addresses in ns_maxemail.
|
|
||||||
Fixed importing user ICQ and URL data from 1.8.
|
|
||||||
Fixed operserv/ignore not being prioritised first.
|
|
||||||
Fixed resetting the stats with operserv/stats.
|
|
||||||
Updated the Dutch translation.
|
|
||||||
|
|
||||||
Anope Version 2.0.17
|
|
||||||
--------------------
|
|
||||||
Fixed importing large flatfile databases into SQL.
|
|
||||||
Fixed marking channels as permanent.
|
|
||||||
Fixed serialising unset boolean extension items.
|
|
||||||
Fixed the documentation about how to import SQL databases.
|
|
||||||
Fixed the documentation of options:usemail.
|
|
||||||
Fixed the location of the geoipupdate CSV files.
|
|
||||||
Fixed translating memo emails.
|
|
||||||
Fixed unnecessary SQL updates caused by dereferencing user accounts.
|
|
||||||
Increased the size of the chanstats letter and word count columns.
|
|
||||||
Updated the location of the Anope IRC channels.
|
|
||||||
|
|
||||||
Anope Version 2.0.16
|
|
||||||
--------------------
|
|
||||||
Added a workaround for users matching expired sqlines.
|
|
||||||
Fixed a copy/paste error in webcpanel.
|
|
||||||
Fixed a crash in db_flatfile caused by trying to serialize data without a type.
|
|
||||||
Fixed duplicate messages when synconset/syncongroup is set.
|
|
||||||
Fixed expiring channel suspensions.
|
|
||||||
Fixed expiring forbids.
|
|
||||||
Fixed expiring nick suspensions.
|
|
||||||
Fixed feature detection on InspIRCd.
|
|
||||||
Fixed InspIRCd account cloaks causing CHGHOST spam when a user also has a services vhost.
|
|
||||||
Fixed joining users to channels with a key set on InspIRCd.
|
|
||||||
Fixed logging users out fully when their nick gets suspended.
|
|
||||||
Fixed marking boolean columns in SQL as TEXT instead of INT.
|
|
||||||
Fixed matching extbans on InspIRCd and implement missing matchers.
|
|
||||||
Fixed operserv/sqline expiry on UnrealIRCd
|
|
||||||
Fixed respecting --noexpire in cs_suspend and ns_suspend.
|
|
||||||
Fixed sending emails to nicks ending with a backslash.
|
|
||||||
Fixed sending SVSTOPIC when topiclock is loaded on InspIRCd.
|
|
||||||
Fixed some SQL tables taking up too much space on disk.
|
|
||||||
Fixed the default config for channel suspensions.
|
|
||||||
Fixed the TIME message on InspIRCd.
|
|
||||||
Fixed trying to escape SQL data when not connected to MySQL.
|
|
||||||
Fixed {ldap,sql}_authentication creating zombie accounts on expiry.
|
|
||||||
|
|
||||||
Anope Version 2.0.15
|
|
||||||
--------------------
|
|
||||||
Fixed a race condition in changing the nick of a user.
|
|
||||||
Fixed being able to reset the password of suspended accounts.
|
|
||||||
Fixed chanserv/suspend info not being visible to regular users.
|
|
||||||
Fixed removing entries by an alias in chanserv/access and chanserv/xop.
|
|
||||||
Fixed various grammar issues in messages.
|
|
||||||
Made the SASL PLAIN implementation more robust.
|
|
||||||
Updated the Dutch translation.
|
|
||||||
Updated the French translation.
|
|
||||||
Updated the Turkish translation.
|
|
||||||
|
|
||||||
Anope Version 2.0.14
|
|
||||||
--------------------
|
|
||||||
Added support for sqlining channels on UnrealIRCd.
|
|
||||||
Fixed a crash when trying to access config for non-loaded modules.
|
|
||||||
Fixed detection of the InspIRCd nopartmsg module.
|
|
||||||
Fixed not getting memo notifications when authing with SASL.
|
|
||||||
Fixed not serialising dontkickops/dontkickvoices in botserv/kick.
|
|
||||||
Fixed sending emails with the wrong kind of line terminator.
|
|
||||||
Fixed sending log messages from a renamed pseudoclient.
|
|
||||||
Fixed telling users their passcode is incorrect when they need to authenticate in nickserv/confirm.
|
|
||||||
Fixed the Config script freezing on some versions of util-linux.
|
|
||||||
Updated the Windows packaging scripts to use dependencies from Conan.
|
|
||||||
|
|
||||||
Anope Version 2.0.13
|
|
||||||
--------------------
|
|
||||||
Fixed a crash on some compilers when trying to call methods on a null pointer
|
|
||||||
Fixed a crash when encountering an unterminated commented config block
|
|
||||||
Fixed erroneously rejecting spaces in fantasy:name
|
|
||||||
Fixed marking services pseudoclients as an oper on InspIRCd
|
|
||||||
Fixed not checking user@ip as well as user@host when logging into an operator account
|
|
||||||
Fixed setting the vhost/vident during SASL on UnrealIRCd
|
|
||||||
Updated the German translation
|
|
||||||
Updated the Italian translation
|
|
||||||
|
|
||||||
Anope Version 2.0.12
|
|
||||||
--------------------
|
|
||||||
Added account confirmation to the web panel
|
|
||||||
Added the regex_pcre2 module which provides regex/pcre with PCRE2
|
|
||||||
Documented the cs_no_expire channel default
|
|
||||||
Fixed config validation mistakenly allowing spaces in some fields
|
|
||||||
Fixed the bahamut protocol module not knowing about halfops
|
|
||||||
Fixed writing a flatfile database not being atomic
|
|
||||||
Updated the hybrid protocol module for recent protocol changes
|
|
||||||
|
|
||||||
Anope Version 2.0.11
|
|
||||||
--------------------
|
|
||||||
Fixed ldap on OpenLDAP 2.5+
|
|
||||||
Fixed not using utf-8 encoding for outgoing email
|
|
||||||
Fixed ns_resetpass not returning a response for XMLRPC
|
|
||||||
Fixed some message params being sent as <middle> instead of <trailing>
|
|
||||||
Fixed unsetting vhosts on unreal4
|
|
||||||
Fixed username validity checking on ircd-hybrid
|
|
||||||
Send the oper mode for services pseudoclients on InspIRCd
|
|
||||||
Updated the pl_PL translation
|
|
||||||
Updated unreal4 for various protocol changes
|
|
||||||
|
|
||||||
Anope Version 2.0.10
|
|
||||||
--------------------
|
|
||||||
Add support for channel SQLines on InspIRCd
|
|
||||||
Change default protocol module from inspircd20 to inspircd3
|
|
||||||
Change the character set used by chanstats and irc2sql to utf8mb4
|
|
||||||
Fix a ton of typos in messages
|
|
||||||
Fix being able to override MAXLIST on InspIRCd
|
|
||||||
Fix blocking on boot when trying to upgrade SQL databases without account identifiers
|
|
||||||
Fix not flushing the ERROR message on squit
|
|
||||||
Fix using an invalidated iterator when deleting bots
|
|
||||||
Fix various harmless compiler warnings
|
|
||||||
Fix webcpanel not using the forwarded IP
|
|
||||||
Show the account name in nickserv/info
|
|
||||||
|
|
||||||
Anope Version 2.0.9
|
|
||||||
-------------------
|
|
||||||
Fix a regression from 2.0.8 that prevented serialising to MySQL
|
|
||||||
Send account identifiers to InspIRCd on SASL logins too
|
|
||||||
Fix a query bug in irc2sql
|
|
||||||
|
|
||||||
Anope Version 2.0.8
|
|
||||||
-------------------
|
|
||||||
Add +K channel mode for ircd-hybrid
|
|
||||||
Add immutable identifiers to user accounts
|
|
||||||
Fix build on systems that use musl libc
|
|
||||||
Fix help of global/global not showing the correct origin nick
|
|
||||||
Fix not removing vhosts when an nick is dropped
|
|
||||||
Fix parsing channel metadata on InspIRCd 3+
|
|
||||||
Fix parsing kicks on InspIRCd 3+
|
|
||||||
Fix parsing topic changes on InspIRCd 3+
|
|
||||||
Fix topiclock on InspIRCd
|
|
||||||
Modernize the ircd-hybrid protocol module
|
|
||||||
|
|
||||||
|
|
||||||
Anope Version 2.0.7
|
|
||||||
-------------------
|
|
||||||
Fix not sending login data on successful NickServ GROUP
|
|
||||||
Fix m_httpd to not consider headers to be case sensitive
|
|
||||||
Add InspIRCd 3 protocol support
|
|
||||||
Add 'n' email token for use in the email change template
|
|
||||||
Add logging for NickServ UNGROUP
|
|
||||||
Fix setting swhois on UnrealIRCd
|
|
||||||
Add nickserv/recover permission to allow opers to recover other users
|
|
||||||
Fix superadmin not being removed when deopering
|
|
||||||
Fix setting nickserv access list in webcpanel
|
|
||||||
Add support for post-handshake SASL in Unreal 4.2.2+
|
|
||||||
Add logging for channel memo deletionso
|
|
||||||
|
|
||||||
Anope Version 2.0.6
|
|
||||||
-------------------
|
|
||||||
Log client IP for web clients running commands via webcpanel
|
|
||||||
Fix log file path for the config file could not be opened log message
|
|
||||||
Allow nickserv/group to be used via XMLRPC
|
|
||||||
Fix logsearch without wildcards
|
|
||||||
Support cidr exempts in m_dnsbl
|
|
||||||
Add support for IPv6 dnsbls
|
|
||||||
Add +u and +L channel modes for ircd-hybrid
|
|
||||||
Set +x after hostserv/off on InspIRCd and UnrealIRCd
|
|
||||||
Fix chanserv/mode not being able to set extbans
|
|
||||||
Send CHGIDENT/CHGHOST on SVSLOGIN on InspIRCd
|
|
||||||
Fix escaping replies from commands in webcpanel
|
|
||||||
Enable require_oper for all opers added via operserv/oper
|
|
||||||
Advertise SASL mechanisms to UnrealIRCd servers
|
|
||||||
|
|
||||||
Anope Version 2.0.5
|
|
||||||
-------------------
|
|
||||||
Fix negative levels to not match users with negative access
|
|
||||||
Fix memo sender to always be the account name of the sender
|
|
||||||
Allow unregistered users to use the ChanServ seen command
|
|
||||||
Fix secureops to not be enforced on operators with the chanserv/administration privilege
|
|
||||||
Fix command name in HELP syntax messages to always be upper case
|
|
||||||
Show unconfirmed nickname messages on registration in webcpanel
|
|
||||||
Fix NickServ SET EMAIL to be executable via XMLRPC
|
|
||||||
Fix OperServ USERLIST/CHANLIST to accept regexes
|
|
||||||
Allow OperServ USERLIST to also match realname syntax (n!u@h#r)
|
|
||||||
Fix db_old importing languages to use the UTF-8 version
|
|
||||||
Fix m_dns to return REFUSED if no answers could be found
|
|
||||||
Fix ns_maxemail to be case insensitive
|
|
||||||
Add MemoServ READ ALL command
|
|
||||||
Add support for NickServ GROUP to be executed via XMLRPC
|
|
||||||
Add support for logging hostname/ip of SASL authentication attempts, if supported by IRCd
|
|
||||||
|
|
||||||
Anope Version 2.0.4
|
|
||||||
-------------------
|
|
||||||
Add notice rpc method to XMLRPC
|
|
||||||
Fix access check in cs_updown to not allow actions on users with equal access
|
|
||||||
Fix randomnews to work when there are more than 'newscount' random news
|
|
||||||
Fix crash from handling nick introduction collisions on unreal4
|
|
||||||
Add support for GCC6
|
|
||||||
Fix handling /join 0 on ratbox
|
|
||||||
Fix saset display to update the account of the proper user
|
|
||||||
Fix nickserv/confirm to send account and +r when appropriate
|
|
||||||
Fix chankill to not add duplicate akills
|
|
||||||
Allow nickserv/maxemail to disregard gmail style aliases when comparing emails
|
|
||||||
Fix chanserv/mode when setting listmodes with CIDR ranges
|
|
||||||
Fix reported expiry time when the time is divisible by 1 year
|
|
||||||
Clarify botserv repeat kicker help and allow setting repeat times to 1
|
|
||||||
Send vident/vhost with SASL login
|
|
||||||
Add support for SASL reauth
|
|
||||||
Fix log and database backup directories to be properly created by the installer
|
|
||||||
|
|
||||||
Anope Version 2.0.3
|
|
||||||
-------------------
|
|
||||||
Add support for UnrealIRCd 4
|
|
||||||
Fix cs_access to respect chanserv/access/list privilege
|
|
||||||
Fix cs_access to match level -1 as every user, not any level <0
|
|
||||||
Fix problems related to object destruction order when using db_sql_live
|
|
||||||
Show memo notify settings in ms_info
|
|
||||||
Fix some actions bumping channels last used time that shouldn't have
|
|
||||||
Add maxlogins configuration directive to limit the number of concurrent logins to one account
|
|
||||||
Fix race with auto svsnick on ghost sometimes causing nick collisions instead
|
|
||||||
Fix saset language reply
|
|
||||||
Show akill/sxlines ids in VIEW
|
|
||||||
Fix crash when an oper is configured in both the configuration and via os_oper
|
|
||||||
Fix m_ldap reconnect logic not properly setting protocol and network timeout settings
|
|
||||||
Fix crash from unloading regex modules when regex xlines exist
|
|
||||||
Fix irc2sql to store away messages
|
|
||||||
Add notice method to m_xmlrpc_main
|
|
||||||
Fix numerics on InspIRCd from being sent to user UID
|
|
||||||
Fix usermode +I on UnrealIRCd to be considered oper only
|
|
||||||
Fix crash in webcpanel when deleting your own access on a channel
|
|
||||||
Fix webcpanel allowing suspended users to login
|
|
||||||
Fix hs_off on InspIRCd to not desync active user host
|
|
||||||
Fix bs_bot to not allow colliding bots into users
|
|
||||||
Don't allow hostserv modules to load if there is no hostserv
|
|
||||||
Fix ns_register allowing bot nicks to be registered through webcpanel
|
|
||||||
Don't update chanserv keepmodes during inhabit
|
|
||||||
Fix build on cmake 2.4
|
|
||||||
Allow searching emails by wildcard in ns_getemail
|
|
||||||
|
|
||||||
Anope Version 2.0.2
|
|
||||||
-------------------
|
|
||||||
Fix keepmodes preventing the first user of a channel from being deopped
|
|
||||||
Fix SQlines that don't begin with # from matching channels
|
|
||||||
Made cs_clone behave like the help describes, copying many settings and lists by default
|
|
||||||
Allow cs_clone to clone levels, too
|
|
||||||
Update Hybrid protocol module for 8.2
|
|
||||||
Fix not unescaping all characters sent over XMLRPC
|
|
||||||
Fix crash when os_mode is used to destroy channels, like when unsetting permanent channel mode from an empty channel
|
|
||||||
Allow users with topic change privilege to change the topic instead of requiring them to use ChanServ's topic command
|
|
||||||
Fix negatively locking param modes in default mlock
|
|
||||||
Change entrymsg to check for the SET privilege, not real founder
|
|
||||||
Allow configuring characters allowed in nicknames
|
|
||||||
Fix crash when non users register channels externally (like XMLRPC)
|
|
||||||
Remove operserv/exception MOVE, it did not function correctly. Instead reorder the list by deleting/adding entries.
|
|
||||||
Allow flood ttb to be 0.
|
|
||||||
Enforce mlock when disabling defcon modes
|
|
||||||
Fix cs_mode not being able to apply mlock on register
|
|
||||||
Add log message when users send memos
|
|
||||||
Fix old collide timers from staying around after successful identify. Fixes being able to identify and logout and still being hit by the old timers.
|
|
||||||
Fix undefined behavior in cs_mode which usually crashes when clearing large list modes
|
|
||||||
Show all opertypes in operserv/info, even if no opers use them
|
|
||||||
|
|
||||||
Anope Version 2.0.1
|
|
||||||
-------------------
|
|
||||||
Fix access entries on accounts sometimes not updating when a user's display name changes
|
|
||||||
Fix ns_group to properly validate the account of the user against the target
|
|
||||||
Fix os_stats not saving max user count and time when using SQL
|
|
||||||
Fix nickalias's 'nc' field sometimes not being updated when using SQL
|
|
||||||
Fix several crashes on Windows related to being unable to load modules
|
|
||||||
Fix bs_bot change not properly reintroducing bots after changing their ident, host, or realname
|
|
||||||
|
|
||||||
Add English language file to allow users to easily modify language strings
|
|
||||||
Add configuring which mode cs_ban sets, and added a MUTE command to BotServ's fantasy
|
|
||||||
Allow SVSPART to take an optional reason
|
|
||||||
Allow cs_list to search channel topics and descriptions
|
|
||||||
|
|
||||||
Anope Version 2.0.0
|
|
||||||
-------------------
|
|
||||||
Added irc2sql stats module
|
|
||||||
|
|
||||||
Anope Version 1.9.9
|
|
||||||
-------------------
|
|
||||||
A Added a better webpanel template, removed the old one
|
|
||||||
A Added SQL logging support
|
|
||||||
A Added Redis database support
|
|
||||||
A Added ability to configure what privileges XOP commands give
|
|
||||||
U Updated Dutch language file, from Robby <robby@chat.be>
|
|
||||||
U Updated Spanish language file, from Isaac Fontal <i_fontal@hotmail.com>
|
|
||||||
F Fix build on Solaris and OSX
|
|
||||||
F Fixed setting BotServ's default settings in the config
|
|
||||||
F Fixed some names of config items, including NickServ's kill protect
|
|
||||||
|
|
||||||
Anope Version 1.9.8
|
|
||||||
-------------------
|
|
||||||
A Ability to configure fantasy commands in the config
|
|
||||||
A Add SVSJOIN and SVSPART commands
|
|
||||||
F Fix "leave" channel log level from not logging
|
|
||||||
F Fix users able to "resend" their registration mail with registration set to admin only
|
|
||||||
F Fix build on OpenBSD
|
|
||||||
F Fix not logging debug logs to the logfile when debug mode is enabled
|
|
||||||
F Fix defcon timeout timer
|
|
||||||
F Fix crash in os_forbid with expiring entries
|
|
||||||
F Fix several issues with db_sql_live
|
|
||||||
|
|
||||||
Anope Version 1.9.7
|
|
||||||
-------------------
|
|
||||||
A Added ability for using regex as patterns for various commands
|
|
||||||
A Extended ability of operserv/akill to also match against nick and realname
|
|
||||||
A Added chanserv:require configuration option
|
|
||||||
A Added nickserv:unregistered_notice and nickserv:registration configuration option
|
|
||||||
A Added options:casemap configuration option
|
|
||||||
A Added a web panel
|
|
||||||
A db_sql_live now allows all tables to be "live", not just a select few
|
|
||||||
|
|
||||||
Anope Version 1.9.6
|
|
||||||
-------------------
|
|
||||||
A Added ability to configure emails sent by services
|
|
||||||
A Added chanserv/up and chanserv/down
|
|
||||||
A Added m_proxyscan
|
|
||||||
A Added more configurability for what vhosts are valid
|
|
||||||
A Added chanserv/log
|
|
||||||
A Added ability to configure ChanServ privileges
|
|
||||||
A Added a new database format
|
|
||||||
A Added SQLite support
|
|
||||||
A Added more verbose messages on startup
|
|
||||||
A Added ability for chanserv/suspend and nickserv/suspend to take an expiry time
|
|
||||||
A Added no nickname ownership config option
|
|
||||||
A Added m_rewrite
|
|
||||||
A Added akill IDs
|
|
||||||
F Fixed crash in clearusers
|
|
||||||
F Fixed crash in /os oper info
|
|
||||||
F Fixed eventfd Config check to work properly on OpenVZ
|
|
||||||
|
|
||||||
Anope Version 1.9.5
|
|
||||||
-------------------
|
|
||||||
A Extended LDAP support
|
|
||||||
A Added os_oper, os_kill, os_forbid, m_statusupdate, cs_sync, and bs_autoassign
|
|
||||||
A Added a new configuration file format
|
|
||||||
A Added a new commands system
|
|
||||||
A Added a new access system, and cs_flags
|
|
||||||
F Fixed not logging debug logs to file
|
|
||||||
F Fixed the mail delay time
|
|
||||||
F Fixed sending account data for unconfirmed nicks
|
|
||||||
F Fixed poll() engine build on FreeBSD
|
|
||||||
F Fixed really large HELP replies being truncated
|
|
||||||
F Fixed sometimes appending !*@* to valid hosts on access lists
|
|
||||||
F Fixed m_ssl sometimes failing connecting for no reason
|
|
||||||
F Fixed crash in cs_entrymsg
|
|
||||||
F Fixed setting -P on channels with only a botserv bot in it
|
|
||||||
F Fixed modemanager complaining about prefixless modes on InspIRCd
|
|
||||||
|
|
||||||
Anope Version 1.9.4
|
|
||||||
-------------------
|
|
||||||
A Automatically set channel founder to the user with the highest access if there is no successor
|
|
||||||
A /chanserv clone command to copy settings from one channel to another.
|
|
||||||
A /chanserv mode command
|
|
||||||
A Ability for users to delete their own access in channels
|
|
||||||
A Added support for Plexus 3
|
|
||||||
A Readded in support for /cs op/deop/etc to op/deop you in all channels
|
|
||||||
A Added LDAP support
|
|
||||||
A Added live SQL support
|
|
||||||
A Added support for learning tracking/storing/locking all modes at runtime
|
|
||||||
A Added m_alias
|
|
||||||
A Added support for XMLRPC queries
|
|
||||||
A Added /botserv set msg
|
|
||||||
A Added /operserv config
|
|
||||||
A Added /ns cert
|
|
||||||
A Added /operserv login
|
|
||||||
F Changed the GHOST command to not allow ghosting unidentified users if the RECOVER command exists
|
|
||||||
F Some failed logic in /operserv exception that prevents proper exceptions from being added
|
|
||||||
F Fixed the anope_os_sxlines MySQL table and code to work after restarting
|
|
||||||
|
|
||||||
Anope Version 1.9.3
|
|
||||||
-------------------
|
|
||||||
A Added italics BotServ kicks support
|
|
||||||
A Tell users when their nicks expire in /ns glist and /ns info
|
|
||||||
A Added SSL support
|
|
||||||
A Prevent negative mode changes, kicks, bans, and autokicks from affecting people with the 'god' user mode (On UnrealIRCd, usermode +q)
|
|
||||||
A Added nickserv/auxpex permission
|
|
||||||
A Added nickserv ungroup command
|
|
||||||
A Renamed the SGLINE to be SNLINE
|
|
||||||
A Added /chanserv saset command
|
|
||||||
A Added threads for mail sending
|
|
||||||
A Added m_dnsbl and an asynchronous DNS system
|
|
||||||
A Added a new language system that uses gettext
|
|
||||||
A Added m_mysql which uses threads to execute queries
|
|
||||||
A Added many subcommand modules for some commands, eg ns_set_autoop, ns_set_email, etc
|
|
||||||
A Added a new logging system that is a bit more flexible
|
|
||||||
A Added cs_set_misc and ns_set_misc to add miscellaneous set commands
|
|
||||||
A Added os_modreload, which allows reloading some modules not normally unloadable, like the protocol module
|
|
||||||
A Added FOUNDER access level
|
|
||||||
A Made OperServ, Global, MemoServ, and ChanServ optional
|
|
||||||
F Shutting down if a config reload fails
|
|
||||||
F Autoid to live through restarts on Unreal
|
|
||||||
F Storing vhosts in MySQL
|
|
||||||
F Not flushing the anope_extra table before rewriting database
|
|
||||||
F Anoperc start/stop to send the globaloncycle global, and fixed anoperc rehash to really rehash
|
|
||||||
F Fixed a potential crash if HostServ or BotServ was disabled
|
|
||||||
|
|
||||||
Anope Version 1.9.2
|
|
||||||
-------------------
|
|
||||||
A K alias to chanserv kick command
|
|
||||||
A KB alias to chanserv ban command
|
|
||||||
A The ability to register empty nonregistered channels
|
|
||||||
A Flatfile plaintext databases and removed old binary ones
|
|
||||||
A Added in live updating SQL and the ability to execute commands through SQL (see docs/MYSQL)
|
|
||||||
A Added support for many more modes into Anope and the ability to have generic support for modes unknown to Anope
|
|
||||||
A Added a mode stacker to combine many mode changes into fewer
|
|
||||||
A Added in the CS SET PERSIST command which can be used to keep service bots in channels even when the channel is empty
|
|
||||||
A Added AUTOOWNER OWNER and OWNERME into CS LEVELS
|
|
||||||
A Added ns_resetpass module to the core
|
|
||||||
A CS ACCESS VIEW which shows who added the access and last time used
|
|
||||||
A Last used time to CS AKICK VIEW
|
|
||||||
A Added a sha_256 encryption module
|
|
||||||
A Added the ability to load multiple encryption modules, and the ability to seamlessly convert your database between different encryptions
|
|
||||||
A Added configuration options to allow Anope to reconnect if it disconnects from the uplink instead of dying
|
|
||||||
A Added support for linking with IPv6
|
|
||||||
F Unban command to accept an optional nick arg
|
|
||||||
F Some typos in services.conf
|
|
||||||
F Crash when users change their host that are identified to a group, but not a nick
|
|
||||||
F Host length checking in HS SET(ALL) and HS REQUEST
|
|
||||||
F Only show if a user is online in NS INFO if they are really identified for the group of the nick they are on
|
|
||||||
F Crash when using BSSmartJoin
|
|
||||||
F Converting access entries to access from xop when a users access is below voice
|
|
||||||
F A bad pointer passed to the OnDelEvent which could cause some 3rd party modules to crash
|
|
||||||
F CS FORBID allows to you forbid unregistered channels
|
|
||||||
F The -nothird command line option to work
|
|
||||||
F ms_rsend to really work
|
|
||||||
F SQUITing juped servers on InspIRCd1.2+
|
|
||||||
|
|
||||||
Anope Version 1.9.1
|
|
||||||
-------------------
|
|
||||||
F Don't enforce akick/forbidden/etc.-restrictions on clients on ulined servers.
|
|
||||||
F Remove modules_unload_all fini + hack that goes with it.
|
|
||||||
F Signal handling cleanup.
|
|
||||||
A Seamless fantasy support on all ChanServ commands, instead of requiring bs_fantasy_*.
|
|
||||||
F Allow fantasy to be disabled on some commands (e.g. FORBID).
|
|
||||||
F Some commands (e.g. !help) need to strip the pre-provided channelname from them.
|
|
||||||
D HelpServ removed
|
|
||||||
F Command parser cleanup: mod_current_buffer removed and replaced with proper parser. Commands now indicate how they want the buffer split.
|
|
||||||
F Make NS ENFORCE/RELEASE stuff more sane, redo timers.
|
|
||||||
A Opertypes (similar to InspIRCd's opertypes)
|
|
||||||
|
|
||||||
Provided by Ankit <ankit@nevitus.com> - 2009
|
|
||||||
F Segfault on shutdown
|
|
||||||
|
|
||||||
Provided by Adam <adam@anope.org> - 2009
|
|
||||||
F NickServ registration is sometimes denied.
|
|
||||||
F Applied patch from Adam to fix some potential screwups
|
|
||||||
F More fixes to bs_bot from Adam, plus an extra fix within DoAdd not covered in Adam's patch.
|
|
||||||
F Fix bs_bot to use the correct parameters, patch from Adam.
|
|
||||||
F Fix for bug #1004, based from second half of patch from Adam.
|
|
||||||
F Partial patch by Adam, commenting fix for #1006 for future reference.
|
|
||||||
F Forward-port r1946: Patch by Adam fixing #1006 (originally caused by #922): modes set by ChanServ are reversed. Thanks!
|
|
||||||
|
|
||||||
Provided by DukePyrolator <dukepyrolator@gmx.de> - 2009
|
|
||||||
F Patch converting all match calls to new method, thanks!
|
|
||||||
F Add 'w' and 'y' support to dotime(), also prevent an overflow.
|
|
||||||
F Allow NS STATUS from unregistered users, thanks DP!
|
|
||||||
F Wild pointers do not a happy Anope make. Thanks DP :)
|
|
||||||
F Allow NS REGISTER to unregistered nicks, silly oversight. Thanks DP! :)
|
|
||||||
F Fix call order, thanks to DP
|
|
||||||
F Pass the right array to do_umode(), fixes mode tracking on Unreal. Thanks to DukePyrolator (yet again :P)
|
|
||||||
F Fix bs_set help, thanks to DukePyrolator! :)
|
|
||||||
F Fix two segfaults, noted by DukePyrolator. Thanks!
|
|
||||||
F Fix part one of #1010, reported by DukePyrolator. (Language settings are not respected in message sending.) Thanks!
|
|
||||||
F Memory leak on +beI modes.
|
|
||||||
|
|
||||||
Provided by Liber <Liber@jasonirc.net> - 2009
|
|
||||||
F Support operoverride and such things (stop reversing changes from nonopped people where unnecessary)
|
|
||||||
|
|
||||||
Anope Version 1.9.0
|
|
||||||
-------------------
|
|
||||||
F Modified compile to use g++
|
|
||||||
F Improve protocol modules support (classes, virtual methods, etc)
|
|
||||||
F Move core services to use BotInfo
|
|
||||||
F Move BotInfo and related methods into a class
|
|
||||||
F Move modules into a class
|
|
||||||
F Fixed ns resending of passcode issue
|
|
||||||
F Modules now delete themselves
|
|
||||||
F additional field where users' masked host can be stored so both masked IP and vhost are available instead of just one.
|
|
||||||
F No struct Uid, ugly, and, unnecessary that we store UID in BotInfo.
|
|
||||||
F Prevent deletion of core services via /bs bot
|
|
||||||
F Module subsystem cleanup ('modules' branch)
|
|
||||||
F Move modules to use classes somewhat (AnopeInit, AnopeFini)
|
|
||||||
F Change MODULE_INIT to return a pointer
|
|
||||||
F Remove duplicate module creation.. have loadModule return a pointer rather than creating one
|
|
||||||
F Remove buffered loading/unloading, this makes os_modunload perm, but who cares
|
|
||||||
F Remove 'delayed' loading, this is necessary because of before/after connected to ircd (ircd is before, rest after), I'm sure this can be done better.
|
|
||||||
A Remove old config, replace with insp-inspired (albeit bind format) config (CBX)
|
|
||||||
F Clean up protocol modules a bit
|
|
||||||
A InspIRCd 1.2 support
|
|
||||||
F Remove old (prior to 1.8.0) db compat
|
|
||||||
F Establish a proper base for services pseudoclients
|
|
||||||
F Add ss_main StatServ Hal9000 to play with :)
|
|
||||||
F Burn automake with fire (CBX)
|
|
||||||
|
|
||||||
Provided by mooncup <mooncup@anonnet.org> - 2009
|
|
||||||
F Automatically reapply vhost on hs off for unreal.
|
|
||||||
@@ -1,256 +0,0 @@
|
|||||||
Anope Version 2.0.21-git
|
|
||||||
------------------------
|
|
||||||
No significant changes.
|
|
||||||
|
|
||||||
Anope Version 2.0.20
|
|
||||||
--------------------
|
|
||||||
No significant changes.
|
|
||||||
|
|
||||||
Anope Version 2.0.19
|
|
||||||
--------------------
|
|
||||||
No significant changes.
|
|
||||||
|
|
||||||
Anope Version 2.0.18
|
|
||||||
--------------------
|
|
||||||
No significant changes.
|
|
||||||
|
|
||||||
Anope Version 2.0.17
|
|
||||||
--------------------
|
|
||||||
No significant changes.
|
|
||||||
|
|
||||||
Anope Version 2.0.16
|
|
||||||
--------------------
|
|
||||||
No significant changes.
|
|
||||||
|
|
||||||
Anope Version 2.0.15
|
|
||||||
--------------------
|
|
||||||
No significant changes.
|
|
||||||
|
|
||||||
Anope Version 2.0.14
|
|
||||||
--------------------
|
|
||||||
Added mail:content_type to allow customizing the content type of emails.
|
|
||||||
|
|
||||||
Anope Version 2.0.13
|
|
||||||
--------------------
|
|
||||||
No significant changes.
|
|
||||||
|
|
||||||
Anope Version 2.0.12
|
|
||||||
--------------------
|
|
||||||
Added the regex_pcre2 module
|
|
||||||
|
|
||||||
Anope Version 2.0.11
|
|
||||||
--------------------
|
|
||||||
No significant changes.
|
|
||||||
|
|
||||||
Anope Version 2.0.10
|
|
||||||
--------------------
|
|
||||||
No significant changes.
|
|
||||||
|
|
||||||
Anope Version 2.0.9
|
|
||||||
-------------------
|
|
||||||
No significant changes.
|
|
||||||
|
|
||||||
Anope Version 2.0.8
|
|
||||||
-------------------
|
|
||||||
Fix ns_register:unconfirmedexpire not being used
|
|
||||||
|
|
||||||
Anope Version 2.0.7
|
|
||||||
-------------------
|
|
||||||
Add nickserv/recover permission
|
|
||||||
Add inspircd3 protocol module
|
|
||||||
Add default permission for chanstats saset chanstats command
|
|
||||||
|
|
||||||
Anope Version 2.0.6
|
|
||||||
-------------------
|
|
||||||
Mark enc_md5 and enc_sha1 as deprecated. Their use has been discouraged for years, and they will be removed in a future release.
|
|
||||||
Exempt all of 127.0.0.0/8 from m_dnsbl by default
|
|
||||||
Load m_sasl by default
|
|
||||||
Fix documentation for nickserv default option ns_keep_modes
|
|
||||||
|
|
||||||
Anope Version 2.0.5
|
|
||||||
-------------------
|
|
||||||
No significant changes.
|
|
||||||
|
|
||||||
Anope Version 2.0.4
|
|
||||||
-------------------
|
|
||||||
Removed m_sasl_dh-aes and m_sasl_dh-blowfish
|
|
||||||
|
|
||||||
Anope Version 2.0.3
|
|
||||||
-------------------
|
|
||||||
Add operserv/chankill to default globops log
|
|
||||||
Add ns_identify:maxlogins to limit the max number of concurrent logins per account
|
|
||||||
Document ns_no_expire nickserv default
|
|
||||||
Remove default session exception expiry time
|
|
||||||
|
|
||||||
Anope Version 2.0.2
|
|
||||||
-------------------
|
|
||||||
Add an operserv/oper/modify privilege, required to use oper add and oper del
|
|
||||||
Add a chanserv/access/list privilege, which allow readonly access to ChanServ access and akick lists
|
|
||||||
Changed m_dnsbl's result configuration to be more extensible
|
|
||||||
Add 'max' setting to cs_mode
|
|
||||||
Add 'nickchars' setting to networkinfo
|
|
||||||
Add 'botserv/fantasy', 'chanserv/access/list', and 'operserv/oper/modify' oper privileges
|
|
||||||
Fix 'emailchange_message' to include the proper email address
|
|
||||||
Set a default permission on operserv/defcon
|
|
||||||
|
|
||||||
Anope Version 2.0.1
|
|
||||||
-------------------
|
|
||||||
Add MUTE command to BotServ fantasy configuration
|
|
||||||
Document memo_mail option in nickserv.conf
|
|
||||||
Add 'show' setting to ns_info and cs_info to control which fields are shown to non opers
|
|
||||||
|
|
||||||
Anope Version 2.0.0
|
|
||||||
-------------------
|
|
||||||
options:passlen, enforceruser, enforcerhost, releasetimeout, and guestnickprefix moved to nickserv's module configuration
|
|
||||||
options:hideregisteredcommands added
|
|
||||||
m_ssl renamed to m_ssl_openssl
|
|
||||||
mail:restrict removed
|
|
||||||
|
|
||||||
Anope Version 1.9.9
|
|
||||||
-------------------
|
|
||||||
There is not many config changes between 1.9.8 and 1.9.9, however many of the
|
|
||||||
options have been moved around to make more sense, too many to list here,
|
|
||||||
so get a new config.
|
|
||||||
|
|
||||||
Anope Version 1.9.8
|
|
||||||
-------------------
|
|
||||||
networkinfo:chanlen added
|
|
||||||
options:user and options:group added
|
|
||||||
nickserv:modesonid added to set modes on everyone who identifies
|
|
||||||
nickserv:kill and nickserv:killquick added to configure NickServ's kill timeout
|
|
||||||
nickserv:restoreonrecover added to try to restore a user's session after a ghost
|
|
||||||
command:group added
|
|
||||||
fantasy block added
|
|
||||||
dns block has been moved to modules.conf as a part of m_dns
|
|
||||||
|
|
||||||
Anope Version 1.9.7
|
|
||||||
-------------------
|
|
||||||
operserv:notifications removed in favor of log{} blocks
|
|
||||||
options:regexengine added
|
|
||||||
options:casemap added
|
|
||||||
chanserv:require added
|
|
||||||
nickserv:registration added, emailregistration removed.
|
|
||||||
nickserv:unregistered_notice added
|
|
||||||
|
|
||||||
Anope Version 1.9.6
|
|
||||||
-------------------
|
|
||||||
service:channels added to join services to channels
|
|
||||||
mail block modified to allow configuring of email messages
|
|
||||||
oper:host and oper:vhost added
|
|
||||||
oper:require_oper added
|
|
||||||
options:nonicknameownership added
|
|
||||||
operserv:akillids added
|
|
||||||
nickserv/access oper privilege added
|
|
||||||
|
|
||||||
Anope Version 1.9.5
|
|
||||||
-------------------
|
|
||||||
Don't even try it, get a new config and start over.
|
|
||||||
|
|
||||||
Anope Version 1.9.4
|
|
||||||
-------------------
|
|
||||||
** ADDED CONFIGURATION DIRECTIVES **
|
|
||||||
memoserv:modules added ms_ignore
|
|
||||||
chanserv:modules added cs_clone and cs_mode
|
|
||||||
nickserv:suspendexpire and nickserv:forbidexpire added
|
|
||||||
chanserv:suspendexpire and chanserv:forbidexpire added
|
|
||||||
module added cs_entrymsg
|
|
||||||
nickserv:modules added ns_ajoin, ns_cert
|
|
||||||
options:nomlock added
|
|
||||||
log:target added globops
|
|
||||||
nickserv:confirmemailchanges added
|
|
||||||
operserv:modules added os_config, os_login
|
|
||||||
|
|
||||||
** MODIFIED CONFIGURATION DIRECTIVES **
|
|
||||||
operserv:notifications removed osglobal, osmode, oskick, osakill, ossnline, ossqline, osszline, osnoop, osjupe, getpass, setpass, forbid, drop
|
|
||||||
renamed nickserv:preregexpire to nickserv:unconfirmedexpire
|
|
||||||
|
|
||||||
** DELETED CONFIGURATION DIRECTIVES **
|
|
||||||
opertype:commands removed operserv/umode
|
|
||||||
operserv:modules removed os_umode
|
|
||||||
|
|
||||||
Anope Version 1.9.3
|
|
||||||
-------------------
|
|
||||||
** ADDED CONFIGURATION DIRECTIVES **
|
|
||||||
nickserv/auspex privilege added
|
|
||||||
SSL module added for SSL support
|
|
||||||
opertype:inherits added to allow opertypes to inherit commands and privs from other opertypes
|
|
||||||
Various nickserv/saset/* and chanserv/saset/* opertype command privileges added
|
|
||||||
nickserv:modules added many new ns_set_command modules
|
|
||||||
chanserv:modules added many new cs_set_command modules
|
|
||||||
opertype:commands added nickserv/saset/* and chanserv/saset/*
|
|
||||||
options:socketengine added to choose what socket engine to use
|
|
||||||
module:cs_set_misc and module:ns_set_misc added to replace the old set url/icq/email modules
|
|
||||||
options:hideprivilegedcommands added to hide privileged commands from normal users
|
|
||||||
log block added to customize logging
|
|
||||||
dns block added to configure dns settings
|
|
||||||
m_dnsbl added
|
|
||||||
mysql configuration block added
|
|
||||||
|
|
||||||
** MODIFIED CONFIGURATION DIRECTIVES **
|
|
||||||
opertype:commands changed operserv/sgline to opserv/snline
|
|
||||||
operserv:modules changed os_sgline to os_snline
|
|
||||||
operserv:modules added os_modreload
|
|
||||||
operserv:sglineexpiry changed to operserv:snlineexpiry
|
|
||||||
operserv:killonsgline changed to operserv:killonsnline
|
|
||||||
operserv:notifications ossgline changed ossnline
|
|
||||||
memoserv was made optional
|
|
||||||
moved operserv:global configuration into its own global block
|
|
||||||
chanserv was made optional
|
|
||||||
|
|
||||||
** DELETED CONFIGURATION DIRECTIVES **
|
|
||||||
serverinfo:helpchannel removed because it has been readded in m_helpchan
|
|
||||||
networkinfo:logchannel, logbot, logusers, logmaxusers, logchannel, and options:keeplogs removed because of the log block
|
|
||||||
dumpcore because it really didn't do anything
|
|
||||||
|
|
||||||
Anope Version 1.9.2
|
|
||||||
-------------------
|
|
||||||
** ADDED CONFIGURATION DIRECTIVES **
|
|
||||||
options:enablelogchannel added to auto turn on the logchannel on startup
|
|
||||||
options:mlock added to configure the default mlock modes on new channels
|
|
||||||
options:database added for the database modules
|
|
||||||
options:botmodes added to configure modes BotServ bots should use
|
|
||||||
options:userlen added to configure maximum ident length
|
|
||||||
options:hostlen added to configure maximum hostname length
|
|
||||||
options:database added to configure what database modules to use
|
|
||||||
options:passlen added to specify the maximum length of passwords
|
|
||||||
uplink:ipv6 added to enable IPv6 connectivity
|
|
||||||
options:maxretries added to specify the number of reconnect attempts allowed
|
|
||||||
options:retrywait added to specify how long to wait between reconnect attempts
|
|
||||||
opertype command chanserv/aop/list removed as it was unnecessary, use chanserv/access/list instead
|
|
||||||
|
|
||||||
** MODIFIED CONFIGURATION DIRECTIVES **
|
|
||||||
options:encryption added enc_sha256
|
|
||||||
chanserv:modules added cs_unban
|
|
||||||
nickserv:modules added ns_resetpass
|
|
||||||
|
|
||||||
** DELETED CONFIGURATION DIRECTIVES **
|
|
||||||
nickserv:database deleted because of new database system
|
|
||||||
nickserv:prenickdatabase deleted because of new database system
|
|
||||||
chanserv:database deleted because of the new database system
|
|
||||||
botserv:database deleted because of the new database system
|
|
||||||
hostserv:database deleted because of the new database system
|
|
||||||
operserv:database deleted because of the new database system
|
|
||||||
operserv:newsdatabase deleted because of the new database system
|
|
||||||
operserv:exceptiondatabase deleted because of the new database system
|
|
||||||
hs_request:database deleted because of the new database system
|
|
||||||
os_ignore:database deleted because of the new database system
|
|
||||||
serverinfo:localport deleted
|
|
||||||
|
|
||||||
Anope Version 1.9.1
|
|
||||||
-------------------
|
|
||||||
** ADDED CONFIGURATION DIRECTIVES **
|
|
||||||
Opertypes have been added, through the opertype blocks.
|
|
||||||
Services Operators are now specified in the oper blocks.
|
|
||||||
|
|
||||||
** MODIFIED CONFIGURATION DIRECTIVES **
|
|
||||||
botserv:modules no longer contains bs_fantasy* modules, fantasy is now seamless.
|
|
||||||
operserv:modules has replaced os_logonnews, os_opernews, and os_randomnews with os_news.
|
|
||||||
operserv:modules no longer contains os_admin and os_oper modules, removed in favor of oper blocks.
|
|
||||||
operserv:notifications no longer contains osraw due to removal of OS RAW.
|
|
||||||
|
|
||||||
** DELETED CONFIGURATION DIRECTIVES **
|
|
||||||
Nick tracking has been removed as an option.
|
|
||||||
Restricting of NS GETPASS and CS GETPASS removed in favor of opertypes.
|
|
||||||
Host Setters were removed in favor of opertypes.
|
|
||||||
HelpServ has been removed entirely.
|
|
||||||
operserv:disableraw removed due to removal of OS RAW.
|
|
||||||
+45
-20
@@ -31,11 +31,10 @@ Anope DefCon
|
|||||||
|
|
||||||
The DefCon system is part of Anope's core,
|
The DefCon system is part of Anope's core,
|
||||||
|
|
||||||
The DefCon system has to be configured on your operserv.conf file to
|
The DefCon system has to be configured on your services.conf file to
|
||||||
be enabled. Defcon will be disabled if "defaultlevel" in the defcon
|
be enabled. All directives are optional unless they depend on what
|
||||||
block is left commented, or set to 0. Look for the defcon block
|
options you enable for each level. Look for the "DefCon configuration"
|
||||||
on your operserv.conf file for more information on enabling and
|
section on your services.conf file for more information.
|
||||||
configuring it.
|
|
||||||
|
|
||||||
Make sure you restart Anope after changing the DefCon configuration
|
Make sure you restart Anope after changing the DefCon configuration
|
||||||
directives.
|
directives.
|
||||||
@@ -44,19 +43,40 @@ Anope DefCon
|
|||||||
|
|
||||||
Pre-defined DefCon actions:
|
Pre-defined DefCon actions:
|
||||||
|
|
||||||
No new channel registrations
|
No new channel registrations 1
|
||||||
No New Nick Registrations
|
No New Nick Registrations 2
|
||||||
No Mode Lock changes
|
No MLOCK changes 4
|
||||||
Force Chan Mode
|
Force Chan Mode 8
|
||||||
Use Reduced Session Limit
|
Use Reduced Session Limit 16
|
||||||
KILL any new clients trying to connect
|
KILL any new clients trying to connect 32
|
||||||
Services will ignore everyone but opers
|
Services will ignore everyone but opers 64
|
||||||
Services will silently ignore everyone but opers
|
Services will silently ignore everyone but opers 128
|
||||||
AKILL all new clients trying to connect
|
AKILL all new clients trying to connect 256
|
||||||
No new memos sent to block MemoServ attacks
|
No new memos sent to block MemoServ attacks 512
|
||||||
|
|
||||||
Information regarding how to enable this for specific defcon levels can
|
These are the values used to determine each defcon setting, are set via:
|
||||||
be found in operserv.conf
|
|
||||||
|
DefCon1 XX
|
||||||
|
DefCon2 XX
|
||||||
|
DefCon3 XX
|
||||||
|
DefCon4 XX
|
||||||
|
|
||||||
|
To set the desired value, you simply add the value of the numbers together
|
||||||
|
and place that as your DefCon# setting. For instance:
|
||||||
|
|
||||||
|
Say you wish to set:
|
||||||
|
|
||||||
|
No Channel Registrations, No Nickname Registrations and Services Ignoring
|
||||||
|
everyone except for Operators. You would do this by:
|
||||||
|
|
||||||
|
1 + 2 + 128 (Each value listed above is added together)
|
||||||
|
Giving: 131
|
||||||
|
|
||||||
|
You would then place this as which ever Defcon setting you want:
|
||||||
|
|
||||||
|
DefCon1 131
|
||||||
|
|
||||||
|
The recommended default values are safe to use on any network.
|
||||||
|
|
||||||
4) Usage
|
4) Usage
|
||||||
|
|
||||||
@@ -71,18 +91,22 @@ Anope DefCon
|
|||||||
|
|
||||||
/msg OperServ DEFCON 4
|
/msg OperServ DEFCON 4
|
||||||
|
|
||||||
|
*** Global -- from OperServ: dengel Changed the DEFCON level to 4
|
||||||
|
|
||||||
-OperServ- Services are now at DEFCON 4
|
-OperServ- Services are now at DEFCON 4
|
||||||
-OperServ- * No new channel registrations
|
-OperServ- * No new channel registrations
|
||||||
-OperServ- * No new nick registrations
|
-OperServ- * No new nick registrations
|
||||||
-OperServ- * No mode lock changes
|
-OperServ- * No MLOCK changes
|
||||||
-OperServ- * Use the reduced session limit of 5
|
-OperServ- * Use the reduced session limit of 5
|
||||||
|
|
||||||
-Global- The Defcon Level is now at: 4
|
-Global- The Defcon Level is now at Level: 4
|
||||||
|
|
||||||
Restore normal readiness:
|
Restore normal readiness:
|
||||||
|
|
||||||
/msg OperServ DEFCON 5
|
/msg OperServ DEFCON 5
|
||||||
|
|
||||||
|
*** Global -- from OperServ: dengel Changed the DEFCON level to 5
|
||||||
|
|
||||||
-OperServ- Services are now at DEFCON 5
|
-OperServ- Services are now at DEFCON 5
|
||||||
|
|
||||||
-Global- Services are now back to normal, sorry for any inconvenience
|
-Global- Services are now back to normal, sorry for any inconvenience
|
||||||
@@ -90,4 +114,5 @@ Anope DefCon
|
|||||||
6) Support
|
6) Support
|
||||||
|
|
||||||
You might get DefCon support by posting on our online forum, or maybe on
|
You might get DefCon support by posting on our online forum, or maybe on
|
||||||
our #anope channel at /server irc.teranova.net.
|
our #anope channel at /server irc.anope.org.
|
||||||
|
|
||||||
|
|||||||
-313
@@ -1,313 +0,0 @@
|
|||||||
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 =
|
|
||||||
+460
-18
@@ -2,33 +2,475 @@ Anope Internal Events
|
|||||||
---------------------
|
---------------------
|
||||||
|
|
||||||
1) Intro
|
1) Intro
|
||||||
2) Using Events
|
2) Complex Events
|
||||||
|
3) Triggered Events
|
||||||
|
4) Triggered Events List
|
||||||
|
|
||||||
1) Introduction to Internal Events
|
1) Introduction to Internal Events
|
||||||
|
|
||||||
Internal Events are setup to give module developers more information
|
Internal Events are setup to give module developers more information
|
||||||
about what the core is doing at different times. This information can
|
about what the core is doing at different times. This information can
|
||||||
be as complex as data we are feeding to the uplink, to simple triggered
|
be as complex as data we are feeding to the uplink, to simple triggered
|
||||||
events such as the databases being saved.
|
events such as the databases being saved. A list of triggered events
|
||||||
|
can be found below. Additional there is a module included with the core
|
||||||
Additionally there is a module included with the core
|
which can provide some clue as to how to use the code in your modules.
|
||||||
which can provide some clue as to how to use the code in your modules.
|
|
||||||
The rest of this document assumes that you are used to writing modules.
|
The rest of this document assumes that you are used to writing modules.
|
||||||
|
|
||||||
2) Using Events
|
2) Complex Events
|
||||||
|
|
||||||
Each Event in Anope calls a function.
|
This type of events are based around what happens when we talk to the
|
||||||
You must override these functions in your main modules class.
|
IRCd, much like MESSAGE events that the IRCD sends to us. The events
|
||||||
The full list of functions and parameters are in modules.h. In this
|
are triggered when Anope writes to the ircd. To watch for these events
|
||||||
case, you would be overriding OnJoinChannel() and OnPartChannel() like so:
|
you must have some knowledge of how the IRCd command system works. In
|
||||||
|
our example we will trap for NICK events.
|
||||||
|
|
||||||
void OnJoinChannel(User *u, Channel *c) anope_override { }
|
A) All functions most be formatted as:
|
||||||
void OnPartChannel(User *u, Channel *c) anope_override { }
|
|
||||||
|
|
||||||
Some of these event overrides can be used to prevent or allow things to
|
int functioname(char *source, int ac, char **av);
|
||||||
happen that would normally not be allowed or denied. You can also use
|
|
||||||
ModuleManager (not explained here) to set control which order the modules
|
|
||||||
are queried (when multiple modules hook to the same event).
|
|
||||||
|
|
||||||
The "anope_override" identifier is for compatibility with C++11.
|
B) In AnopeInit you must declare EvtMessage in some fashion, it is into
|
||||||
Its usage is highly recommended.
|
this variable that we will create the event handler. Here is what the
|
||||||
|
base AnopeInit should look like at this point:
|
||||||
|
|
||||||
|
int AnopeInit(int argc, char **argv)
|
||||||
|
{
|
||||||
|
EvtMessage *msg = NULL;
|
||||||
|
int status;
|
||||||
|
|
||||||
|
moduleAddAuthor(AUTHOR);
|
||||||
|
moduleAddVersion(VERSION);
|
||||||
|
return MOD_CONT;
|
||||||
|
}
|
||||||
|
|
||||||
|
Note that AUTHOR and VERSION should be defined above the AnopeInit
|
||||||
|
function, just like you should do with any module.
|
||||||
|
|
||||||
|
C) Pass "createEventHandler" the name of the message in this case NICK,
|
||||||
|
and the function that was created in Step A. At this point you should
|
||||||
|
assign the return of "createEventHandler" to the EvtMessage variable.
|
||||||
|
|
||||||
|
msg = createEventHandler("NICK", my_nick);
|
||||||
|
|
||||||
|
D) The Handler is not ready for use yet; now you must add it to the hash
|
||||||
|
with "moduleAddEventHandler". You will want to pass to this function
|
||||||
|
the return of "createEventHandler".
|
||||||
|
|
||||||
|
status = moduleAddEventHandler(msg);
|
||||||
|
|
||||||
|
It will return the same module error codes as adding a regular message,
|
||||||
|
which you can use to confirm it was added correctly.
|
||||||
|
|
||||||
|
E) With that setup in your function you will be passed 3 items. The source
|
||||||
|
most of the time this will be set to ServerName or NULL; consult our
|
||||||
|
IRCd documentation about how messages are formatted. AC is the count of
|
||||||
|
variables you will find in AV.
|
||||||
|
|
||||||
|
int my_nick(char *source, int ac, char **av)
|
||||||
|
{
|
||||||
|
alog("Internal Event - nick is %s",av[0]);
|
||||||
|
return MOD_CONT;
|
||||||
|
}
|
||||||
|
|
||||||
|
3) Triggered Events
|
||||||
|
|
||||||
|
These events also known as "event hooks" are internal events such as
|
||||||
|
expiring of nicks to the saving of databases.
|
||||||
|
|
||||||
|
A) All functions most be formatted as:
|
||||||
|
|
||||||
|
int functioname(int argc, char **argv);
|
||||||
|
|
||||||
|
B) In AnopeInit you must declare EvtHook in some fashion; it is into
|
||||||
|
this variable that we will create the event handler. Here is what
|
||||||
|
the base AnopeInit should look like at this point:
|
||||||
|
|
||||||
|
int AnopeInit(int argc, char **argv)
|
||||||
|
{
|
||||||
|
EvtHook *hook = NULL;
|
||||||
|
int status;
|
||||||
|
|
||||||
|
moduleAddAuthor(AUTHOR);
|
||||||
|
moduleAddVersion(VERSION);
|
||||||
|
return MOD_CONT;
|
||||||
|
}
|
||||||
|
|
||||||
|
C) Pass "createEventHook" the name of the event. In this case we are
|
||||||
|
going to hook to the saving of databases, "EVENT_DB_SAVING".
|
||||||
|
|
||||||
|
hook = createEventHook(EVENT_DB_SAVING, my_save);
|
||||||
|
|
||||||
|
D) The Handler is not ready for use yet; now you must add it to the hash
|
||||||
|
with "moduleAddEventHook". You will want to pass to this function the
|
||||||
|
return of "createEventHook"
|
||||||
|
|
||||||
|
status = moduleAddEventHook(hook);
|
||||||
|
|
||||||
|
It will return the same module error codes as adding a regular message,
|
||||||
|
which you can use to confirm it was added correctly.
|
||||||
|
|
||||||
|
E) With that setup in your function you will be passed 1 item. The message
|
||||||
|
is very simple; it could be as simple as a start, stop or message. In
|
||||||
|
the case of saving it has a start and stop.
|
||||||
|
|
||||||
|
int my_save(int argc, char **argv)
|
||||||
|
{
|
||||||
|
if (argc < 1) {
|
||||||
|
return MOD_CONT;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!stricmp(argv[0], EVENT_START)) {
|
||||||
|
alog("Saving the databases! has started");
|
||||||
|
} else {
|
||||||
|
alog("Saving the databases is complete");
|
||||||
|
}
|
||||||
|
return MOD_CONT;
|
||||||
|
}
|
||||||
|
|
||||||
|
4) Triggered Events List
|
||||||
|
|
||||||
|
Here's a list of all event hooks we currently offer, with a description
|
||||||
|
of what argument is being passed to the event functions for this type of
|
||||||
|
event. All arguments are plain-text strings (char *). The list is sorted
|
||||||
|
in alphabetical order.
|
||||||
|
|
||||||
|
Note that all events are emitted AFTER the action has taken place, so
|
||||||
|
any deleted nick/channel/etc won't exist anymore and any created one will
|
||||||
|
exist when your function is being run, unless noted otherwise.
|
||||||
|
|
||||||
|
Also note that EVENT_START and EVENT_STOP should not be matched with an
|
||||||
|
equal sign, but with string comparision. See the bundled events module for
|
||||||
|
an example on how to do this.
|
||||||
|
|
||||||
|
The arguments are given as av[0] for the first argument, av[1] for the
|
||||||
|
second argument, and so on. If av[0] and av[1] are given, the event has
|
||||||
|
two arguments, and argc should be 2.
|
||||||
|
|
||||||
|
EVENT_ACCESS_ADD
|
||||||
|
An user has been added to a channel access list.
|
||||||
|
av[0] Name of the channel the user has been added to.
|
||||||
|
av[1] The nickname of the user that has just added an entry to the
|
||||||
|
access list.
|
||||||
|
av[2] The nickname of the user that has been added to the access
|
||||||
|
list.
|
||||||
|
av[3] The level number the user has been added with.
|
||||||
|
|
||||||
|
EVENT_ACCESS_CHANGE
|
||||||
|
An user level has been changed on a channel access list.
|
||||||
|
av[0] Name of the channel the access list has been modified which.
|
||||||
|
av[1] The nickname of the user that has just modified the access
|
||||||
|
list of the channel.
|
||||||
|
av[2] The nickname of the user wich his access level has just been
|
||||||
|
modified.
|
||||||
|
av[3] The new access level for the user.
|
||||||
|
|
||||||
|
EVENT_ACCESS_CLEAR
|
||||||
|
A channel access list has been cleared.
|
||||||
|
av[0] Name of the channel the access list has been cleared of
|
||||||
|
av[1] The nickname of the user that has cleared the access list
|
||||||
|
|
||||||
|
EVENT_ACCESS_DEL
|
||||||
|
An user has been deleted of a channel access list.
|
||||||
|
av[0] Name of the channel the access entry has been deleted which.
|
||||||
|
av[1] The nickname of the user that has just deleted the access entry.
|
||||||
|
av[2] [OPTIONAL] The nickname of the user wich his access level has just
|
||||||
|
been removed. Not present if numbers were used (e.g. /cs access
|
||||||
|
del 7).
|
||||||
|
|
||||||
|
EVENT_BOT_ASSIGN
|
||||||
|
A BotServ bot has been assigned to a channel.
|
||||||
|
av[0] Name of the channel the bot has been assigned to.
|
||||||
|
av[1] The nickname of the bot that has been assigned to the channel.
|
||||||
|
|
||||||
|
EVENT_BOT_BAN
|
||||||
|
A BotServ bot has banned a user, e.g. kickers.
|
||||||
|
av[0] The nick of the user banned.
|
||||||
|
av[1] The Channel the user was banned from.
|
||||||
|
av[2] The mask that was banned.
|
||||||
|
|
||||||
|
EVENT_BOT_CHANGE
|
||||||
|
The properties of a BotServ bot have been changed.
|
||||||
|
av[0] The nickname of the bot involved.
|
||||||
|
|
||||||
|
EVENT_BOT_CREATE
|
||||||
|
A new BotServ bot has been created, and is ready to use.
|
||||||
|
av[0] The nickname of the newly created bot.
|
||||||
|
|
||||||
|
EVENT_BOT_DEL
|
||||||
|
A BotServ bot is being deleted from BotServ. This event is being sent
|
||||||
|
just before the actual deletion is performed.
|
||||||
|
av[0] The nickname of the bot being deleted.
|
||||||
|
|
||||||
|
EVENT_BOT_FANTASY
|
||||||
|
A fantasy command of the bot has been triggered. This event should be
|
||||||
|
used to create your own fantasy commands.
|
||||||
|
av[0] The fantasy command that has been triggered without leading '!'.
|
||||||
|
av[1] The nickname of the user that has triggered the fantasy
|
||||||
|
command.
|
||||||
|
av[2] The name of the channel the fantasy command has been triggered
|
||||||
|
on.
|
||||||
|
av[3] Contains any optional paramenters passed after the fantasy
|
||||||
|
command. If none are present, this will not exist, and argc will
|
||||||
|
will be 3.
|
||||||
|
|
||||||
|
EVENT_BOT_FANTASY_NO_ACCESS
|
||||||
|
A fantasy command of the bot has been triggered by someone without
|
||||||
|
access to BotServ FANTASY commands on the channel. This will NOT
|
||||||
|
trigger if someone with access has triggered a fantasy command; use
|
||||||
|
EVENT_BOT_FANTASY for those. Hook to both events to catch both event
|
||||||
|
triggers.
|
||||||
|
av[0] The fantasy command that has been triggered without leading '!'.
|
||||||
|
av[1] The nickname of the user that has triggered the fantasy
|
||||||
|
command.
|
||||||
|
av[2] The name of the channel the fantasy command has been triggered
|
||||||
|
on.
|
||||||
|
av[3] Contains any optional paramenters passed after the fantasy
|
||||||
|
command. If none are present, this will not exist, and argc will
|
||||||
|
will be 3.
|
||||||
|
|
||||||
|
EVENT_BOT_JOIN
|
||||||
|
A BotServ bot has joined a channel and opped itself.
|
||||||
|
av[0] The channel name the bot has just joined.
|
||||||
|
av[1] The nickname of the bot that has joined the channel.
|
||||||
|
|
||||||
|
EVENT_BOT_KICK
|
||||||
|
A BotServ bot has kicked a user from a channel.
|
||||||
|
av[0] The name of the user that has been kicked.
|
||||||
|
av[1] The name of the channel the user was kicked from.
|
||||||
|
av[2] The reason for the kick.
|
||||||
|
|
||||||
|
EVENT_BOT_UNASSIGN
|
||||||
|
A BotServ bot is being unassigned from a channel. This event is being
|
||||||
|
sent before the actual removing of the bot is done.
|
||||||
|
av[0] The channel name the bot has been unassigned from.
|
||||||
|
av[1] The nickname of the bot that has been unassigned.
|
||||||
|
|
||||||
|
EVENT_CHAN_DROP
|
||||||
|
A channel has been dropped and deleted.
|
||||||
|
av[0] The name of the channel that has been dropped.
|
||||||
|
|
||||||
|
EVENT_CHAN_EXPIRE
|
||||||
|
A channel has been expired and will be deleted. The event will be
|
||||||
|
emitted just before the actual channel deletion happens.
|
||||||
|
av[0] The name of the channel that has been expired.
|
||||||
|
|
||||||
|
EVENT_CHAN_FORBIDDEN
|
||||||
|
A channel has been forbidden (ChanServ FORBID).
|
||||||
|
av[0] The name of the channel that has been forbidden.
|
||||||
|
|
||||||
|
EVENT_CHAN_KICK
|
||||||
|
Someone has just been kicked from a channel.
|
||||||
|
av[0] The nick of the user that has been kicked.
|
||||||
|
av[1] The channel the user has been kicked from.
|
||||||
|
|
||||||
|
EVENT_CHAN_REGISTERED
|
||||||
|
A new channel has been registered.
|
||||||
|
av[0] The name of the channel that has been registered.
|
||||||
|
|
||||||
|
EVENT_NICK_REQUESTED
|
||||||
|
A new nick has been requested, and mail has been sent to confirm the nick.
|
||||||
|
av[0] The name of the nick that was requested
|
||||||
|
|
||||||
|
EVENT_CHAN_SUSPENDED
|
||||||
|
A channel has been suspended (ChanServ SUSPEND).
|
||||||
|
av[0] The name of the channel that has been suspended.
|
||||||
|
|
||||||
|
EVENT_CHAN_UNSUSPEND
|
||||||
|
A channel has been unsuspended (ChanServ UNSUSPEND).
|
||||||
|
av[0] The name of the channel that has been unsuspended.
|
||||||
|
|
||||||
|
EVENT_CHANGE_NICK
|
||||||
|
A user has just changed its nick.
|
||||||
|
av[0] The new nickname of the user. Event is called after the user has been changed
|
||||||
|
to this nickname.
|
||||||
|
av[1] The old nickname of the user.
|
||||||
|
|
||||||
|
EVENT_CONNECT
|
||||||
|
This event is emitted when the connection to our uplink hub is being
|
||||||
|
made.
|
||||||
|
av[0] EVENT_START or EVENT_STOP, to indicate if it's emitted before
|
||||||
|
or after the connection has been made. EVENT_STOP is emitted
|
||||||
|
before our burst is being sent over the link.
|
||||||
|
|
||||||
|
EVENT_DB_EXPIRE
|
||||||
|
This event is emitted when the expiry routines for all things that can
|
||||||
|
expire in Anope are being run.
|
||||||
|
av[0] EVENT_START or EVENT_STOP, to indicate if it's being emitted
|
||||||
|
before or after the expiry routines have been run.
|
||||||
|
|
||||||
|
EVENT_DB_SAVING
|
||||||
|
This event is emitted when the databases are being saved.
|
||||||
|
av[0] EVENT_START or EVENT_STOP, to indicate if it's emitted before
|
||||||
|
or after the saving routines have been run.
|
||||||
|
|
||||||
|
EVENT_DB_BACKUP
|
||||||
|
This event is emitted when the databases are backed up.
|
||||||
|
av[0] EVENT_START when the backup commences, and EVENT_STOP when it
|
||||||
|
finishes.
|
||||||
|
|
||||||
|
EVENT_DEFCON_LEVEL
|
||||||
|
The DefCon level has just been changed. This event is emitted before
|
||||||
|
any DefCon-related action is taken. The internal DefConLevel has
|
||||||
|
already been raised at this point.
|
||||||
|
av[0] The new level of DefCon being invoked.
|
||||||
|
|
||||||
|
EVENT_GROUP
|
||||||
|
A user has grouped its nickname to another user group.
|
||||||
|
av[0] The nickname of the user that joined the group.
|
||||||
|
|
||||||
|
EVENT_JOIN_CHANNEL
|
||||||
|
A user joins a channel.
|
||||||
|
av[0] EVENT_START or EVENT_STOP. EVENT_START when the user has passed
|
||||||
|
all access checks and is allowed to join, but has not yet
|
||||||
|
joined the channel. EVENT_STOP when the user has joined and all
|
||||||
|
needed modes are set etc.
|
||||||
|
av[1] The nickname of the user joining the channel.
|
||||||
|
av[2] The name of the channel the user has joined.
|
||||||
|
|
||||||
|
EVENT_NEWNICK
|
||||||
|
A new user has been introduced on the network.
|
||||||
|
av[0] The nickname of the newly introduced user.
|
||||||
|
|
||||||
|
EVENT_NICK_DROPPED
|
||||||
|
A user's nick has just been dropped. Note that the nickname information
|
||||||
|
has already been deleted!
|
||||||
|
av[0] The nickname of the user that has just been dropped.
|
||||||
|
|
||||||
|
EVENT_NICK_EXPIRE
|
||||||
|
A user's nick has just expired. Note that, as with EVENT_NICK_DROPPED,
|
||||||
|
the nickname information has already been deleted!
|
||||||
|
av[0] The nickname of the user that has just expired.
|
||||||
|
|
||||||
|
EVENT_NICK_FORBIDDEN
|
||||||
|
A user's nick has just been forbidden.
|
||||||
|
av[0] The nickname that has just been forbidden.
|
||||||
|
|
||||||
|
EVENT_CORE_DROPPED
|
||||||
|
A NickCore will be dropped. Usually send when the last alias is dopped.
|
||||||
|
This is send BEFORE the event that confirms deletion of the alias.
|
||||||
|
Note that this event is send before the core data is removed.
|
||||||
|
av[0] The display nickname of the core that is being dropped.
|
||||||
|
|
||||||
|
EVENT_CORE_NEWDISPLAY
|
||||||
|
The display nick of a NickCore is being changed.
|
||||||
|
This is send BEFORE the actual change is made in the database.
|
||||||
|
av[0] The old display nickname of the core.
|
||||||
|
av[1] The new display nickname of the core.
|
||||||
|
|
||||||
|
EVENT_NICK_GHOSTED
|
||||||
|
A user has just been ghosted.
|
||||||
|
av[0] EVENT_START or EVENT_STOP. EVENT_START when the user is about
|
||||||
|
to be removed from the network, EVENT_STOP when this has been
|
||||||
|
done.
|
||||||
|
av[1] The nickname of the user doing the ghosting.
|
||||||
|
av[2] The nickname being ghosted.
|
||||||
|
|
||||||
|
EVENT_NICK_IDENTIFY
|
||||||
|
A user has just identified for its nickname with NickServ.
|
||||||
|
av[0] The nickname of the user that just identified.
|
||||||
|
|
||||||
|
EVENT_NICK_LOGOUT
|
||||||
|
A user has just (been) logged out.
|
||||||
|
av[0] The nickname of the user that has (been) logged out.
|
||||||
|
|
||||||
|
EVENT_NICK_RECOVERED
|
||||||
|
A user's nickname has just been recovered.
|
||||||
|
av[0] EVENT_START or EVENT_STOP. EVENT_START when the user is about
|
||||||
|
to be recovered, EVENT_STOP when this has been done.
|
||||||
|
av[1] The nickname of the user doing the recovery.
|
||||||
|
av[2] The nickname being recovered.
|
||||||
|
|
||||||
|
EVENT_NICK_REGISTERED
|
||||||
|
A new user has just registered its nickname. This event is being
|
||||||
|
emitted when the registration is completed, but the user modes have not
|
||||||
|
yet been set.
|
||||||
|
av[0] The nickname of the newly registered user.
|
||||||
|
|
||||||
|
EVENT_NICK_SUSPENDED
|
||||||
|
A user's nick has just been suspended.
|
||||||
|
av[0] The nickname that has just been suspended.
|
||||||
|
|
||||||
|
EVENT_NICK_UNSUSPEND
|
||||||
|
A user's nick has just been unsuspended.
|
||||||
|
av[0] The nickname that has just been unsuspended.
|
||||||
|
|
||||||
|
EVENT_PART_CHANNEL
|
||||||
|
A user parts a channel.
|
||||||
|
av[0] EVENT_START or EVENT_STOP. EVENT_START when the user is about
|
||||||
|
to be removed from the channel internally, EVENT_STOP when
|
||||||
|
this has been done.
|
||||||
|
av[1] The nickname of the user parting the channel.
|
||||||
|
av[2] The name of the channel the user has parted.
|
||||||
|
av[3] The reason the user parted the channel, this is not always sent
|
||||||
|
so check the count to make sure it was passed. (ac == 4)
|
||||||
|
|
||||||
|
EVENT_RELOAD
|
||||||
|
This event is emitted after the configuration file has been reloaded.
|
||||||
|
av[0] Always EVENT_START.
|
||||||
|
|
||||||
|
EVENT_RESTART
|
||||||
|
This event is emitted before the services are being restarted.
|
||||||
|
av[0] Always EVENT_START.
|
||||||
|
|
||||||
|
EVENT_SERVER_CONNECT
|
||||||
|
A new server has just connected to the network.
|
||||||
|
av[0] The name of the new server.
|
||||||
|
|
||||||
|
EVENT_SERVER_SQUIT
|
||||||
|
A server has sent an SQUIT and is about to be removed from the
|
||||||
|
network. This event is being sent before the server is actually
|
||||||
|
removed from the network.
|
||||||
|
av[0] The name of the server that is being removed.
|
||||||
|
|
||||||
|
EVENT_SHUTDOWN
|
||||||
|
This event is emitted when Anope is being shut down.
|
||||||
|
av[0] EVENT_START or EVENT_STOP, to indicate where in the process of
|
||||||
|
restarting the core is. With EVENT_START, services are still
|
||||||
|
fully online and operating. With EVENT_STOP, every internal
|
||||||
|
clean up has been done already, and the SQUIT has been sent;
|
||||||
|
the only thing done after emitting the event is closing the
|
||||||
|
socket to the uplink hub.
|
||||||
|
|
||||||
|
EVENT_SIGNAL
|
||||||
|
This event is emitted when Anope is quitting because of a signal it
|
||||||
|
received.
|
||||||
|
av[0] The quit message that will be sent with the SQUIT for this
|
||||||
|
shutdown.
|
||||||
|
|
||||||
|
EVENT_TOPIC_UPDATED
|
||||||
|
A channel topic has been succesfully updated. Note that this event is
|
||||||
|
only emitted if the new topic has been fully accepted and set by the
|
||||||
|
Anope core.
|
||||||
|
av[0] The name of the channel involved.
|
||||||
|
av[1] The new topic set on the channel.
|
||||||
|
|
||||||
|
EVENT_USER_LOGOFF
|
||||||
|
A user has left the network. This event is emitted before the internal
|
||||||
|
removal is performed, so the user still exists internally.
|
||||||
|
av[0] The nickname of the user leaving the network.
|
||||||
|
|
||||||
|
EVENT_MODLOAD
|
||||||
|
A module has been loaded. This event is emitted after the loading
|
||||||
|
sequence has been finished: AnopeInit() has been called and the
|
||||||
|
module has already been added to the modules table.
|
||||||
|
av[0] Name of the loaded module.
|
||||||
|
|
||||||
|
EVENT_MODUNLOAD
|
||||||
|
A module has been unloaded. This event is emitted when the unloading
|
||||||
|
sequence is almost complete: AnopeFini() has been called and all
|
||||||
|
commands, hooks and callbacks have been removed. The module itself
|
||||||
|
is still in memory however.
|
||||||
|
av[0] Name of the unloaded module.
|
||||||
|
|
||||||
|
EVENT_ADDCOMMAND
|
||||||
|
A command hook has been added to anopes command table.
|
||||||
|
Note that the command may have previously existed and merely a new hook
|
||||||
|
was added before or after an existing command hook.
|
||||||
|
av[0] Name of the module adding the command.
|
||||||
|
av[1] Name of the command hook that was added.
|
||||||
|
|
||||||
|
EVENT_DELCOMMAND
|
||||||
|
A command hook has been removed from anopes command table.
|
||||||
|
Note that the command may still exist in anopes command table if other
|
||||||
|
modules have hooks for the same command.
|
||||||
|
av[0] Name of the module deleting the command.
|
||||||
|
av[1] Name of the command hook that was removed.
|
||||||
|
|||||||
+109
-40
@@ -19,79 +19,146 @@ Note: You should also read the README and FAQ files!
|
|||||||
The very first thing you need to do is to get the Anope package (if not
|
The very first thing you need to do is to get the Anope package (if not
|
||||||
already done). You can find it at:
|
already done). You can find it at:
|
||||||
|
|
||||||
https://www.anope.org/
|
http://www.anope.org/
|
||||||
|
|
||||||
Anope requires cmake to build. You can check if CMake is already
|
|
||||||
installed on your system using the command:
|
|
||||||
|
|
||||||
cmake --version
|
|
||||||
|
|
||||||
If it's installed, you will get a line that says something similar to
|
|
||||||
"cmake version 2.8.12.2". If the version is less than 2.4 or you get
|
|
||||||
an error saying the command was not found, you will not be able to use
|
|
||||||
CMake unless you install it yourself into your home directory. CMake
|
|
||||||
can be downloaded from:
|
|
||||||
|
|
||||||
https://cmake.org/download/
|
|
||||||
|
|
||||||
Next, unpack the package in your home directory, and go into the created
|
Next, unpack the package in your home directory, and go into the created
|
||||||
directory.
|
directory.
|
||||||
|
|
||||||
If there are any extra modules you want to enable, such as m_mysql, run
|
|
||||||
the 'extras' script to enable them. If you do not know you can come back
|
|
||||||
later and enable them.
|
|
||||||
|
|
||||||
Now type ./Config to start the configuration script. It will ask you a
|
Now type ./Config to start the configuration script. It will ask you a
|
||||||
few questions, and figure out how to compile Anope on your system. If
|
few questions, and figure out how to compile Anope on your system. If
|
||||||
you are unsure about the answer to a question, use the default value.
|
you are unsure about the answer to a question, use the default value.
|
||||||
|
|
||||||
Now cd build and type make and make install. This will install
|
NOTE: although you may specify different binary and data paths, it is
|
||||||
|
RECOMMENDED that you use the same value for both.
|
||||||
|
|
||||||
|
You can now type make to compile Anope. If there are errors in the
|
||||||
|
Makefile, *try to use gmake* instead. If it still doesn't work, you (or
|
||||||
|
the system administrator if it's a shell) must install GNU make. You may
|
||||||
|
find it at ftp://prep.ai.mit.edu/pub/gnu/.
|
||||||
|
|
||||||
|
Now type make install (or gmake install; see above). This will install
|
||||||
all the needed files in the paths you specified with the configure
|
all the needed files in the paths you specified with the configure
|
||||||
script, and setup file permissions. You should ensure that the data
|
script, and setup file permissions. You should ensure that the data
|
||||||
directory is not accessible by other users, as malicious users may
|
directory is not accessible by other users, as malicious users may
|
||||||
cause trouble on your network if passwords are not encrypted, or read
|
cause trouble on your network if passwords are not encrypted, or read
|
||||||
the memos of any user.
|
the memos of any user.
|
||||||
|
|
||||||
Now go into the conf directory (by default, ~/services/conf). Copy the example
|
If you see errors during this process, please mail us with the *complete*
|
||||||
|
error output, and don't forget to mention your OS, compiler and C library
|
||||||
|
versions.
|
||||||
|
|
||||||
|
Now go into the data directory (by default, ~/services). Copy the example
|
||||||
configuration file (example.conf) to services.conf, and open the latter
|
configuration file (example.conf) to services.conf, and open the latter
|
||||||
with your favorite text editor. It contains all the configuration
|
with your favorite text editor. It contains all the configuration
|
||||||
directives Anope will use at startup. Read the instructions contained in
|
directives Anope will use at startup. Read the instructions contained in
|
||||||
the file carefully. Using the default values is NOT a good idea, and will
|
the file carefully. Using the default values is NOT a good idea, and will
|
||||||
most likely not work!
|
most likely not work!
|
||||||
|
|
||||||
If you need help, you should visit https://forum.anope.org/ or #anope on
|
If you need help, you should subscribe to the Anope mailing list and mail
|
||||||
irc.teranova.net. Provide *complete* error output, along with other relevant
|
there to get help from other users. See the README file for more
|
||||||
information eg. OS, compiler and C++ library versions.
|
information.
|
||||||
See the README file for more information.
|
|
||||||
|
|
||||||
2) Upgrading Anope
|
2) Upgrading Anope
|
||||||
|
|
||||||
|
If you got a .diff file and want to patch the old Anope sources with it,
|
||||||
|
do the following:
|
||||||
|
|
||||||
|
* Copy the .diff file into the root Anope sources directory.
|
||||||
|
* Type patch -p1 <file.diff
|
||||||
|
|
||||||
|
Note that upgrading anope with a patchfile isn't recommended. You should
|
||||||
|
download a new, clean source package, as this will give the best results.
|
||||||
|
|
||||||
To upgrade Anope, just follow the installation instructions described in
|
To upgrade Anope, just follow the installation instructions described in
|
||||||
section 1. There are however a few specific guidelines:
|
section 1. There are however a few specific guidelines:
|
||||||
|
|
||||||
* IMPORTANT: Back up your old databases!
|
* IMPORTANT: Back up your old databases!
|
||||||
* If you are upgrading to a new major release, ALWAYS restart a
|
* Check Changes.conf for the new version for small config changes.
|
||||||
|
* If you are upgrading to a new major release, create a
|
||||||
fresh configuration file from example.conf.
|
fresh configuration file from example.conf.
|
||||||
|
|
||||||
3) Setting up the IRCd
|
3) Setting up the IRCd
|
||||||
|
|
||||||
Services acts as an IRC server with pseudo-clients on it. To link them to
|
Services acts as an IRC server with pseudo-clients on it. To link them to
|
||||||
your network, you'll need to configure your IRCd to allow services to link.
|
your network, you'll need to add some lines in the ircd.conf of their hub
|
||||||
|
server (as stated in the RemoteServer configuration directive).
|
||||||
|
|
||||||
The configuration varies depending on the IRCd, but you will probably need
|
For samples below we'll take services.localhost.net as the name of the
|
||||||
a link block (also called connect block, or C line), a U line (also called
|
Services (as stated in the ServerName configuration directive). Note that
|
||||||
a shared block), and be sure that the IRCd is listening on the given port
|
this samples are made to be as generic as possible, but there might be
|
||||||
in the link block.
|
small variations, depending on your IRCd. For IRCd-specific help with
|
||||||
|
configuration, read near the end of this section.
|
||||||
|
|
||||||
Example link configurations can be found in example.conf for some of the
|
First, the C/N lines, that allow Services to link. They also need a
|
||||||
popular IRCds.
|
Y:line to work correctly.
|
||||||
|
|
||||||
|
Y:27:180:0:0:4000000
|
||||||
|
C:127.0.0.1:mypass:services.localhost.net::30
|
||||||
|
N:127.0.0.1:mypass:services.localhost.net::30
|
||||||
|
|
||||||
|
"mypass" is the same password you mentioned in the RemoteServer
|
||||||
|
configuration directive. 127.0.0.1 is the IP from which Services connect
|
||||||
|
from (linking in localhost is the most efficient way to run Services).
|
||||||
|
|
||||||
|
Then, you have to set-up an U:line, that will allow Services to change
|
||||||
|
channel modes, topics, and much more without being opped in the channel.
|
||||||
|
|
||||||
|
U:services.localhost.net:*:*
|
||||||
|
|
||||||
|
NOTE: if you have more than one server in your network, this line MUST
|
||||||
|
be added on ALL servers, or things won't work correctly.
|
||||||
|
|
||||||
|
Finally, you'll need to add an H:line, to make the OperServ JUPE command
|
||||||
|
work correctly.
|
||||||
|
|
||||||
|
H:*::Services.LocalHost.Net
|
||||||
|
|
||||||
Don't forget to /rehash your IRCd to apply changes.
|
Don't forget to /rehash your IRCd to apply changes.
|
||||||
|
|
||||||
|
A new trend in ircd configuration is popping all over the place, good
|
||||||
|
examples are the latest Hybrid, Unreal, Bahamut & InspIRCd, which use a more
|
||||||
|
"readable" form of configuration. For those, use something like:
|
||||||
|
|
||||||
|
|
||||||
|
UnrealIRCd
|
||||||
|
|
||||||
|
link services.localhost.net
|
||||||
|
{
|
||||||
|
username *;
|
||||||
|
hostname localhost;
|
||||||
|
bind-ip *;
|
||||||
|
port 7000;
|
||||||
|
hub *;
|
||||||
|
password-connect "mypass";
|
||||||
|
password-receive "mypass";
|
||||||
|
class servers;
|
||||||
|
};
|
||||||
|
|
||||||
|
InspIRCd
|
||||||
|
|
||||||
|
<link name="services.localhost.net"
|
||||||
|
ipaddr="127.0.0.1"
|
||||||
|
port="7000"
|
||||||
|
allowmask="127.0.0.0/8"
|
||||||
|
sendpass="mypass"
|
||||||
|
recvpass="mypass">
|
||||||
|
|
||||||
|
|
||||||
|
Note that this block-style configuration files differ heavily, depending
|
||||||
|
on the IRCd. Consult the interactive link maker (link is below) for more
|
||||||
|
details on the exact configuration used by your IRCd.
|
||||||
|
|
||||||
|
If you're unable to get a link with your IRCd after reading this section,
|
||||||
|
you might try the interactive link maker, which is located at:
|
||||||
|
|
||||||
|
http://www.anope.org/ilm.php
|
||||||
|
|
||||||
|
Or finally, contact your IRCd Support Community to seek advice.
|
||||||
|
|
||||||
4) Starting Anope
|
4) Starting Anope
|
||||||
|
|
||||||
Go into the directory where binaries were installed (by default, this is
|
Go into the directory where binaries were installed (by default, this is
|
||||||
~/services/bin). Type ./services to launch Anope.
|
~/services). Type ./services to launch Anope.
|
||||||
|
|
||||||
If there are syntax errors in the configuration file they will be
|
If there are syntax errors in the configuration file they will be
|
||||||
displayed on the screen. Correct them until there are no errors anymore.
|
displayed on the screen. Correct them until there are no errors anymore.
|
||||||
@@ -103,25 +170,27 @@ Note: You should also read the README and FAQ files!
|
|||||||
to launch Anope with ./services -debug -nofork to see any errors that it
|
to launch Anope with ./services -debug -nofork to see any errors that it
|
||||||
encounters, and try to correct them.
|
encounters, and try to correct them.
|
||||||
|
|
||||||
If you need help to solve errors, feel free to subscribe to the Anope
|
If you need help to solve errors, feel free to visit us on IRC at
|
||||||
mailing list and ask there. See the README file for details.
|
irc.anope.org #anope and ask there. See the README file for further details.
|
||||||
|
|
||||||
5) Setting up a crontab
|
5) Setting up a crontab
|
||||||
|
|
||||||
A crontab entry will allow you to check periodically whether Anope is
|
A crontab entry will allow you to check periodically whether Anope is
|
||||||
still running, and restart it if not.
|
still running, and restart it if not. You'll need to have Anope binaries
|
||||||
|
and data installed in the same directory for this to work without
|
||||||
|
modification.
|
||||||
|
|
||||||
First rename the example.chk script that is in Anope path (by default,
|
First rename the example.chk script that is in Anope path (by default,
|
||||||
this is ~/services/conf) to services.chk and edit it. You'll need to
|
this is ~/services) to services.chk and edit it. You'll need to modify
|
||||||
modify the CONFIGURATION part of the file. Then ensure that the file is
|
the CONFIGURATION part of the file. Then ensure that the file is marked
|
||||||
marked as executable by typing chmod +x services.chk, and try to launch the
|
as executable by typing chmod +x services.chk, and try to launch the
|
||||||
script to see if it works (Anope must not be running when you do this ;))
|
script to see if it works (Anope must not be running when you do this ;))
|
||||||
|
|
||||||
When this is done, you'll have to add the crontab entry. Type crontab -e.
|
When this is done, you'll have to add the crontab entry. Type crontab -e.
|
||||||
This will open the default text editor with the crontab file. Enter the
|
This will open the default text editor with the crontab file. Enter the
|
||||||
following (with correct path):
|
following (with correct path):
|
||||||
|
|
||||||
*/5 * * * * /home/ircd/services/conf/services.chk >/dev/null 2>&1
|
*/5 * * * * /home/ircd/services/services.chk >/dev/null 2>&1
|
||||||
|
|
||||||
The */5 at the beginning means "check every 5 minutes". You may replace
|
The */5 at the beginning means "check every 5 minutes". You may replace
|
||||||
the 5 with other another number if you want (but less than 60). Consult
|
the 5 with other another number if you want (but less than 60). Consult
|
||||||
|
|||||||
-144
@@ -1,144 +0,0 @@
|
|||||||
Instructions d'installation d'Anope
|
|
||||||
-----------------------------------
|
|
||||||
|
|
||||||
1) Installation d'Anope
|
|
||||||
2) Mettre Ă jour Anope
|
|
||||||
3) Configuration de l'IRCd
|
|
||||||
4) Mettre en route Anope
|
|
||||||
5) Mettre en place un crontab
|
|
||||||
|
|
||||||
Note : Vous devrez également lire les fichiers README et FAQ !
|
|
||||||
|
|
||||||
1) Installation d'Anope
|
|
||||||
|
|
||||||
NOTE IMPORTANTE : il est déconseillé d'utiliser (et même d'installer)
|
|
||||||
Anope en tant que root. Utilisez un utilisateur non
|
|
||||||
privilégié. Celui que vous utilisez pour l'IRCd ou
|
|
||||||
un utilisateur dédié suffira.
|
|
||||||
|
|
||||||
La première chose que vous devez faire est d'obtenir le package Anope
|
|
||||||
(si ce n'est déjà fait). Vous pouvez le trouver ici :
|
|
||||||
|
|
||||||
https://www.anope.org/
|
|
||||||
|
|
||||||
Anope nécessite cmake pour être compilé. Vous pouvez vérifier si CMake
|
|
||||||
est déjà installé sur votre système avec la commande :
|
|
||||||
|
|
||||||
cmake --version
|
|
||||||
|
|
||||||
Si CMake est installé, vous aurez une ligne qui dit quelque chose comme
|
|
||||||
"cmake version 2.8.12.2". Si la version est inférieure à 2.4 ou si vous
|
|
||||||
obtenez une erreur disant que la commande n'a pas été trouvée, vous ne
|
|
||||||
pourrez pas utiliser CMake Ă moins de l'installer vous-mĂŞme dans votre
|
|
||||||
répertoire home. CMake peut être téléchargé ici :
|
|
||||||
|
|
||||||
https://cmake.org/download/
|
|
||||||
|
|
||||||
Ensuite, décompressez le package dans votre répertoire home, et allez
|
|
||||||
dans le répértoire qui vient d'être créé.
|
|
||||||
|
|
||||||
Si il y a des modules facultatifs que vous voulez activer comme m_mysql,
|
|
||||||
exécuter le script 'extras' pour les activer. Si vous ne savez pas, vous
|
|
||||||
pouvez les activer plus tard.
|
|
||||||
|
|
||||||
Maintenant, tapez ./Config pour lancer le script de configuration. Il
|
|
||||||
va vous poser quelques questions, et déterminer comment compiler Anope
|
|
||||||
sur votre système. Si vous ne savez pas comment répondre à une question,
|
|
||||||
utilisez la valeur par défaut.
|
|
||||||
|
|
||||||
Allez dans le dossier build (cd build) et tapez make et make install.
|
|
||||||
Ceci va installer tous les fichiers nécessaires dans les dossiers que
|
|
||||||
vous avez indiqués avec le script Config et régler les permissions des
|
|
||||||
fichiers. Vous devez vous assurer que le répertoire data n'est pas
|
|
||||||
accessible par les autres utilisateurs, car des utilisateurs
|
|
||||||
malveillants pourraient causer des problèmes sur votre réseau, si les
|
|
||||||
mots de passe ne sont pas chiffrés, ou lire les mémos de tous les
|
|
||||||
utilisateurs.
|
|
||||||
|
|
||||||
Allez maintenant dans le répertoire conf (par défaut, ~/services/conf).
|
|
||||||
Copiez l'exemple de fichier de configuration (example.conf) en
|
|
||||||
services.conf et ouvrez ce dernier avec votre éditeur de texte favori.
|
|
||||||
Il contient toutes les directives de configuration qu'Anope va utiliser
|
|
||||||
en démarrant. Lisez attentivement les instructions contenues dans le
|
|
||||||
fichier. L'utilisation des valeurs par défaut n'est pas toujours
|
|
||||||
recommandée, et Anope ne fonctionnera probablement pas !
|
|
||||||
|
|
||||||
Si vous avez besoin d'aide, vous pouvez aller sur le site
|
|
||||||
https://forum.anope.org/ ou le canal #anope sur irc.teranova.net.
|
|
||||||
Fournissez *l'essemble* des erreurs qui apparaîssent, en plus de
|
|
||||||
toutes informations utiles, comme les versions de votre OS, du
|
|
||||||
compilateur utilisé et de la librairie C++. Lisez le fichier README
|
|
||||||
pour plus d'informations.
|
|
||||||
|
|
||||||
2) Mettre Ă jour Anope
|
|
||||||
|
|
||||||
Pour mettre Ă jour Anope, suivez simplement les instructions
|
|
||||||
d'installation décrites dans la section 1. Prenez garde cependant :
|
|
||||||
|
|
||||||
* IMPORTANT : Sauvegardez vos anciennes bases de données !
|
|
||||||
* Si vous mettez Ă jour vers une nouvelle version majeure,
|
|
||||||
recommencez *toujours* toute votre configuration Ă partir du
|
|
||||||
fichier example.conf.
|
|
||||||
|
|
||||||
3) Configuration de l'IRCd
|
|
||||||
|
|
||||||
Les Services agissent comme un serveur IRC avec des pseudo-clients.
|
|
||||||
Pour les relier à votre réseau, vous aurez besoin de configurer votre
|
|
||||||
IRCd pour permettre aux services de se connecter.
|
|
||||||
|
|
||||||
La configuration dépend de l'IRCd utilisé, mais vous aurez probablement
|
|
||||||
besoin d'un bloc link (aussi appelé connect block, ou C:line) et un
|
|
||||||
U:line (aussi appelé shared block). Assurez-vous que l'IRCd écoute
|
|
||||||
sur le port donné dans le bloc link.
|
|
||||||
|
|
||||||
Des exemples de configurations de bloc link peuvent être trouvés dans
|
|
||||||
le fichier example.conf pour certains des IRCd les plus populaires.
|
|
||||||
|
|
||||||
Souvenez-vous de /rehash votre IRCd pour appliquer les changements.
|
|
||||||
|
|
||||||
4) Mettre en route Anope
|
|
||||||
|
|
||||||
Allez dans le répertoire où les fichiers binaires ont été installés
|
|
||||||
(par défaut, ~/services/bin). Tapez ./services pour lancer Anope.
|
|
||||||
|
|
||||||
S'il y a des erreurs de syntaxe dans le fichier de configuration, elles
|
|
||||||
seront affichées à l'écran. Corrigez-les jusqu'à ce qu'il n'y en ait
|
|
||||||
plus. Un démarrage réussi ne générera pas de message.
|
|
||||||
|
|
||||||
Donnez aux services au moins une minute pour se connecter Ă votre
|
|
||||||
réseau, car certains IRCds sur certains systèmes peuvent être très
|
|
||||||
lents pour le processus de liaison. Si rien ne se passe après environ
|
|
||||||
une minute, il y a probablement un problème de configuration. Essayez
|
|
||||||
de lancer Anope en mode debug avec ./services -debug -nofork pour voir
|
|
||||||
toutes les erreurs rencontrées et essayez de les corriger.
|
|
||||||
|
|
||||||
Si vous avez besoin d'aide pour rĂ©soudre des erreurs, n'hĂ©sitez pas Ă
|
|
||||||
vous abonner Ă la liste de diffusion Anope et d'y poser vos question.
|
|
||||||
Voir le fichier README pour plus de détails.
|
|
||||||
|
|
||||||
5) Mettre en place un crontab
|
|
||||||
|
|
||||||
Une entrée crontab vous permettra de vérifier périodiquement si Anope
|
|
||||||
est toujours en cours d'exécution et de le redémarrer s'il n'est pas.
|
|
||||||
|
|
||||||
D'abord renommez le script example.chk qui est dans les dossiers
|
|
||||||
d'Anope (par défaut, ~/services/conf) en services.chk et modifiez-le.
|
|
||||||
Vous aurez besoin de modifier la partie CONFIGURATION du fichier.
|
|
||||||
Assurez-vous ensuite que le fichier est marqué comme exécutable en
|
|
||||||
tapant chmod +x services.chk et essayez de lancer le script pour voir
|
|
||||||
si cela fonctionne (Anope ne doit pas ĂŞtre en marche lorsque vous
|
|
||||||
testez cela ;))
|
|
||||||
|
|
||||||
Lorsque c'est fait, vous devrez ajouter l'entrée crontab. Entrez
|
|
||||||
crontab -e. Cela va ouvrir l'éditeur de texte par défaut avec le
|
|
||||||
fichier crontab. Entrez la ligne suivante (avec le chemin correct) :
|
|
||||||
|
|
||||||
*/5 * * * * /home/ircd/services/conf/services.chk > /dev/null 2>&1
|
|
||||||
|
|
||||||
Le */5 au début signifie "vérifier toutes les 5 minutes". Vous pouvez
|
|
||||||
remplacer le 5 par un autre numéro si vous voulez (mais moins de 60).
|
|
||||||
Consultez les pages de manuel de votre système pour plus de détails sur
|
|
||||||
la syntaxe du fichier crontab. Les pages de manuel intéressantes sont
|
|
||||||
crontab(5), crontab(1) et cron(8).
|
|
||||||
|
|
||||||
Sauvegardez, quittez, et c'est installé !
|
|
||||||
@@ -0,0 +1,527 @@
|
|||||||
|
How To Add IRCd Support
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
1) Files to Edit
|
||||||
|
2) Modifing the Header File
|
||||||
|
3) The Code
|
||||||
|
4) Modes
|
||||||
|
5) Functions / Events
|
||||||
|
6) CAPAB/PROTOCTL
|
||||||
|
|
||||||
|
1) Files to Edit
|
||||||
|
|
||||||
|
When preparing to add support to Anope for your ircd, you need to edit
|
||||||
|
the following files.
|
||||||
|
|
||||||
|
A) Make a copy of the .c and .h file of the IRCd that matches the ircd
|
||||||
|
that you are attempting to add support for best.
|
||||||
|
|
||||||
|
First step in this process is to rename the .c and .h file after the IRCd
|
||||||
|
that you are going to be adding support for. Its recommended that you come
|
||||||
|
up with a name that is clear and easy to understand.
|
||||||
|
|
||||||
|
You are now ready to start getting into the code.
|
||||||
|
|
||||||
|
2) Modifying the Header File
|
||||||
|
|
||||||
|
Now that you have gotten past the first part of the creation process, you
|
||||||
|
are into the code. This part is the harder and more complex part. You
|
||||||
|
will need a general understanding of C code to continue. Here are the
|
||||||
|
step by step instructions required to make this work.
|
||||||
|
|
||||||
|
Open the .h file and find the section of code with
|
||||||
|
|
||||||
|
#define UMODE_a 0x00000001
|
||||||
|
#define UMODE_b 0x00000002
|
||||||
|
|
||||||
|
This is where you define the MODES. All user modes are stored
|
||||||
|
with UMODE_ followed by a letter matching the modes case; be careful to
|
||||||
|
use the correct case as this will make it clear when you setup MODES in
|
||||||
|
the .c in a few. Use hex values for the modes so starting at 0x00000001
|
||||||
|
to 0x8000000. In most cases you want to list all modes. If you run out of
|
||||||
|
values look at removing any modes that do not impact services.
|
||||||
|
|
||||||
|
Channel modes are done much like user modes, with the exception that
|
||||||
|
bans, exceptions, invites, and modes that are applied to a user such as
|
||||||
|
op and voice are not defined here. All other modes are defined in here.
|
||||||
|
Again be clear and use the correct case and use hex values as done with
|
||||||
|
user modes.
|
||||||
|
|
||||||
|
Finally we come to DEFAULT_MLOCK; this is the mode that services will set
|
||||||
|
by default on channels when they are registered. In general you want this
|
||||||
|
to be what is acceptable by the ircd; in most cases this is "+ntr". This is
|
||||||
|
expressed by:
|
||||||
|
|
||||||
|
#define DEFAULT_MLOCK CMODE_n | CMODE_t | CMODE_r
|
||||||
|
|
||||||
|
3) The Code
|
||||||
|
|
||||||
|
Here is where the code of the .c file comes in. Be prepared to spend at
|
||||||
|
least an hour, if not longer, going over the code and getting it right;
|
||||||
|
Especially if you are setting up an ircd that is completely different
|
||||||
|
than the one you used as a base. This section covers the majority of the
|
||||||
|
code that is in use.
|
||||||
|
|
||||||
|
The first bit of code you will face is:
|
||||||
|
|
||||||
|
IRCDVar ircd[] = { }
|
||||||
|
|
||||||
|
This struct contains your basic IRCd functions. Your base source file has
|
||||||
|
the list of all available variables; note that you should not swap any
|
||||||
|
around, or you will break stuff. Here is a brief description of the usage
|
||||||
|
of each.
|
||||||
|
|
||||||
|
1) Name: This member tells Anope about the IRCD's name. It may contain
|
||||||
|
text about its name and version. This is used to identify the
|
||||||
|
build on startup.
|
||||||
|
|
||||||
|
2) NickServ Mode: This is the user mode set by Anope on NickServ.
|
||||||
|
Normally you want this to be some form of oper flag,
|
||||||
|
or a services flag.
|
||||||
|
|
||||||
|
3) ChanServ Mode: This is the user mode set by Anope on ChanServ.
|
||||||
|
Normally you want this to be some form of oper flag,
|
||||||
|
or a services flag.
|
||||||
|
|
||||||
|
4) MemoServ Mode: This is the user mode set by Anope on MemoServ.
|
||||||
|
Normally you want this to be some form of oper flag,
|
||||||
|
or a services flag.
|
||||||
|
|
||||||
|
5) HostServ Mode: This is the user mode set by Anope on HostServ.
|
||||||
|
Normally you want this to be some form of oper flag,
|
||||||
|
or a services flag. Note that if your ircd does not
|
||||||
|
support HostServ, you can safely make this NULL or +,
|
||||||
|
as there is a check before bringing HostServ online.
|
||||||
|
|
||||||
|
6) OperServ Mode: This is the user mode set by Anope on OperServ.
|
||||||
|
Normally you want this to be some form of oper flag,
|
||||||
|
or a services flag.
|
||||||
|
|
||||||
|
7) BotServ Mode: This is the user mode set by Anope on BotServ.
|
||||||
|
Normally you want this to be some form of oper flag,
|
||||||
|
or a services flag.
|
||||||
|
|
||||||
|
8) HelpServ Mode: This is the user mode set by Anope on HelpServ.
|
||||||
|
Normally you want this to be some form of oper flag,
|
||||||
|
or a services flag.
|
||||||
|
|
||||||
|
9) DevNull Mode: This is the user mode set by Anope on DevNull.
|
||||||
|
Normally you want this to be some form of oper flag,
|
||||||
|
or a services flag.
|
||||||
|
|
||||||
|
10) Global Mode: This is the user mode set by Anope on Global.
|
||||||
|
Normally you want this to be some form of oper flag,
|
||||||
|
or a services flag.
|
||||||
|
|
||||||
|
11) NickServ Alias Mode: This is the user mode set by Anope on the alias
|
||||||
|
of NickServ. Normally you want this to be some
|
||||||
|
form of oper flag, or a services flag.
|
||||||
|
|
||||||
|
12) ChanServ Alias Mode: This is the user mode set by Anope on the alias
|
||||||
|
of ChanServ. Normally you want this to be some
|
||||||
|
form of oper flag, or a services flag.
|
||||||
|
|
||||||
|
13) MemoServ Alias Mode: This is the user mode set by Anope on the alias
|
||||||
|
of MemoServ. Normally you want this to be some
|
||||||
|
form of oper flag, or a services flag.
|
||||||
|
|
||||||
|
14) HostServ Alias Mode: This is the user mode set by Anope on the alias
|
||||||
|
of MemoServ. Normally you want this to be some
|
||||||
|
form of oper flag, or a services flag. Note that
|
||||||
|
if your ircd does not support HostServ, you can
|
||||||
|
safely make this NULL or +, as there is a check
|
||||||
|
before bringing HostServ online.
|
||||||
|
|
||||||
|
15) OperServ Alias Mode: This is the user mode set by Anope on the alias
|
||||||
|
of OperServ. Normally you want this to be some
|
||||||
|
form of oper flag, or a services flag.
|
||||||
|
|
||||||
|
16) BotServ Alias Mode: This is the user mode set by Anope on the alias
|
||||||
|
of BotServ. Normally you want this to be some
|
||||||
|
form of oper flag, or a services flag.
|
||||||
|
|
||||||
|
17) HelpServ Alias Mode: This is the user mode set by Anope on the alias
|
||||||
|
of HelpServ. Normally you want this to be some
|
||||||
|
form of oper flag, or a services flag.
|
||||||
|
|
||||||
|
18) DevNull Alias Mode: This is the user mode set by Anope on the alias
|
||||||
|
of DevNull. Normally you want this to be some
|
||||||
|
form of oper flag, or a services flag.
|
||||||
|
|
||||||
|
19) Global Alias Mode: This is the user mode set by Anope on the alias
|
||||||
|
of Global. Normally you want this to be some form
|
||||||
|
of oper flag, or a services flag.
|
||||||
|
|
||||||
|
20) BotServ Bots Mode: This is the user mode set by Anope on all BotServ
|
||||||
|
bots. Normally you want this to be a some form of
|
||||||
|
service or bot flag; you can use + for no mode at
|
||||||
|
all.
|
||||||
|
|
||||||
|
21) Max Channelmode Symbols: This is the total number of possible channel
|
||||||
|
modes that can appear before a nick. Do
|
||||||
|
remember to count each possible mode, so +ov
|
||||||
|
is 2.
|
||||||
|
|
||||||
|
22) Modes to Remove: This is every mode that Anope should remove when
|
||||||
|
stripping channel modes.
|
||||||
|
|
||||||
|
23) Channelmode for bots: When a BotServ bot joins a channel, this is the
|
||||||
|
mode set on them. Normally you will want them
|
||||||
|
opped (+o), and protected (+a) on IRCd's that
|
||||||
|
support it.
|
||||||
|
|
||||||
|
24) SVSNICK: Can the ircd use SVSNICK to change some ones nick? Otherwise,
|
||||||
|
KILL is used. Use 1 for yes, 0 for no.
|
||||||
|
|
||||||
|
25) VHOST: Can a user's host be changed on the fly? Enabling this allow
|
||||||
|
HostServ online. Use 1 for yes, 0 for no.
|
||||||
|
|
||||||
|
26) OWNER: Has a channel umode for being the channel owner. For example,
|
||||||
|
UnrealIRCd has mode +q. Use 1 for yes, 0 for no.
|
||||||
|
|
||||||
|
27) OWNER MODE SET: What mode to set to make someone the owner. If the
|
||||||
|
IRCd doesn't support owners, set this to NULL.
|
||||||
|
|
||||||
|
28) OWNER MODE UNSET: What mode to unset to take away someone's channel
|
||||||
|
owner status. If the IRCd doesn't support owners,
|
||||||
|
set this to NULL.
|
||||||
|
|
||||||
|
29) ADMIN MODE SET: What mode to set to make someone a channel admin.
|
||||||
|
If the IRCd dosn't support admins, set to NULL.
|
||||||
|
|
||||||
|
30) ADMIN MODE UNSET: What mode to unset to take away channel admin.
|
||||||
|
If the IRCd dosn't support admins, set to NULL.
|
||||||
|
|
||||||
|
31) Mode on Nick Register: What mode to give users when they register
|
||||||
|
with NickServ. If your ircd doesn't set expect
|
||||||
|
a mode to be set on registration, you should
|
||||||
|
set this to NULL.
|
||||||
|
|
||||||
|
32) Mode on Root ID: What modes to set on services roots when they identify
|
||||||
|
|
||||||
|
33) Mode on Admin ID: What modes to set on services admins when they identify
|
||||||
|
|
||||||
|
34) Mode on Oper ID: What modes to set on services opers when they identify
|
||||||
|
|
||||||
|
35) Mode on Nick Unregister: What mode to set give users when they cancel
|
||||||
|
their registration with NickServ. If your
|
||||||
|
IRCd doesn't set a mode for registered users
|
||||||
|
you should set this to NULL.
|
||||||
|
|
||||||
|
36) Mode on Nick Change: What mode to give users when they change their
|
||||||
|
nick. If your ircd doesn't set a mode, you
|
||||||
|
should set this to NULL.
|
||||||
|
|
||||||
|
37) SGLINE: Does the IRCd support realname (geocs) bans? Use 1 for yes,
|
||||||
|
0 for no.
|
||||||
|
|
||||||
|
38) SQLINE: Does the IRCd support nick bans? Use 1 for yes, 0 for no.
|
||||||
|
|
||||||
|
39) SZLINE: Does the IRCd support SZLINES? Use 1 for yes, 0 for no.
|
||||||
|
|
||||||
|
40) HALFOP: Is channel mode +h for halfop supported by the IRCd? Use 1 for
|
||||||
|
yes, 0 for no.
|
||||||
|
|
||||||
|
41) Number of Server Args: When an IRCd connects, this is the number of
|
||||||
|
parameters that are passed.
|
||||||
|
|
||||||
|
42) Join to Set: Services must join a channel to set any modes on that
|
||||||
|
channel. Use 1 for yes, 0 for no.
|
||||||
|
|
||||||
|
43) Join to Message: Services must join a channel to send any message to
|
||||||
|
that channel (cannot override +n). Use 1 for yes,
|
||||||
|
0 for no.
|
||||||
|
|
||||||
|
44) Exceptions: Support for channel exceptions (mode +e). Use 1 for yes,
|
||||||
|
0 for no.
|
||||||
|
|
||||||
|
45) TS Topic Forward: Some IRCd's (like UnrealIRCd) like their topic TS
|
||||||
|
set forward by +1. Use 1 for yes, 0 for no.
|
||||||
|
|
||||||
|
46) TS Topic Backward: Some IRCd's (mainly older DreamForge-like ones)
|
||||||
|
like their topic TS set back by -1. Use 1 for yes,
|
||||||
|
0 for no.
|
||||||
|
|
||||||
|
47) Protected Umode: UMODE_ define that defines the protected usermod.
|
||||||
|
Use 0 for no support, or enter the UMODE_ define.
|
||||||
|
|
||||||
|
48) Admin: Support for channel admins (Mainly used by UltimateIRCd). Use
|
||||||
|
1 for yes, 0 for no.
|
||||||
|
|
||||||
|
49) SQline Channels: The IRCd's supports banning channel names via
|
||||||
|
SQLINES. Use 1 for yes, 0 for no.
|
||||||
|
|
||||||
|
50) Quit On Kill: When we (SVS)KILL a user, does the IRCd send back a
|
||||||
|
QUIT message for that user? Use 1 for yes, 0 for no.
|
||||||
|
|
||||||
|
51) SVSMODE -b: We can use SVSMODE to unban hosts from a channel. Use
|
||||||
|
1 for yes, 0 for no.
|
||||||
|
|
||||||
|
52) Protect: Support for channel protect (mode +a, mainly being used by
|
||||||
|
UnrealIRCd and ViagraIRCd). Use 1 for yes, 0 for no.
|
||||||
|
|
||||||
|
53) Reverse: We can do a reverse check when unbanning. For use with
|
||||||
|
DreamForge based IRCd's. Use 1 for yes, 0 for no.
|
||||||
|
|
||||||
|
54) Register Channels: Supports sending a channelmode for registered
|
||||||
|
channels. Use 1 for yes, 0 for no.
|
||||||
|
|
||||||
|
55) Registered Mode: Channelmode to set on registered channels, see the
|
||||||
|
option above. Use 1 for yes, 0 for no.
|
||||||
|
|
||||||
|
56) vIdent: Support for including a user's ident in their vHost. Use
|
||||||
|
1 for yes, 0 for no.
|
||||||
|
|
||||||
|
57) SVSHOLD: Support for temporarily 'holding' a nick, instead of using
|
||||||
|
a nick enforcer client. Use 1 for yes, 0 for no.
|
||||||
|
|
||||||
|
58) TS on MODE: We need to send a timestamp when modes are being changed.
|
||||||
|
Use 1 for yes, 0 for no.
|
||||||
|
|
||||||
|
59) NICKIP: The IP address of new users is being sent along with their
|
||||||
|
hostname when new users are being introduced on the network.
|
||||||
|
Use 1 for yes, 0 for no.
|
||||||
|
|
||||||
|
60) Omode: We can use OperServ to change a user's mode. Use 1 for yes,
|
||||||
|
0 for no.
|
||||||
|
|
||||||
|
61) Umode: We can use OperServ to change a user's mode. Use 1 for yes,
|
||||||
|
0 for no.
|
||||||
|
|
||||||
|
62) Vhost On Nick: On NICK the IRCd sends the VHOST. Use 1 for yes,
|
||||||
|
0 for no.
|
||||||
|
|
||||||
|
63) Change Realname: Change real name. Use 1 for yes, 0 for no.
|
||||||
|
|
||||||
|
64) No Knock: CMODE_ that defines NO KNOCK. Use 0 for no support.
|
||||||
|
|
||||||
|
65) Admin Only: CMODE_ that defines Admin Only. Use 0 for no support.
|
||||||
|
|
||||||
|
66) Default MLock: Default channelmodes for MLOCK. Use 0 for no modes.
|
||||||
|
|
||||||
|
67) Vhost Umode: UMODE_ that indicates if the user currently has a vHost.
|
||||||
|
Use 0 for no support.
|
||||||
|
|
||||||
|
68) Flood Mode: The IRCd has a channelmode for blocking floods. Use 1 for
|
||||||
|
yes, 0 for no.
|
||||||
|
|
||||||
|
69) Link Mode: The IRCd has a channelmode for linking a channel to some
|
||||||
|
other channel. Use 1 for yes, 0 for no.
|
||||||
|
|
||||||
|
70) CMode F: CMODE_ that defines flood mode. Use 0 for no support.
|
||||||
|
|
||||||
|
71) CMode L: CMODE_ that defines link mode. Use 0 for no support.
|
||||||
|
|
||||||
|
72) Check Nick ID: Should we check if a user should remain identified when
|
||||||
|
changing their nick? This is for IRCd's that remove
|
||||||
|
their registered-user mode when someone changes their
|
||||||
|
nick (like Bahamut does).
|
||||||
|
Use 1 for yes, 0 for no.
|
||||||
|
|
||||||
|
73) No Knock Requires +i: Does the No Knock channel mode require invite
|
||||||
|
only channels? Use 1 for yes, 0 for no.
|
||||||
|
|
||||||
|
74) Chan Modes: If sent in CAPAB/PROTOCOL, we store it in here. This is
|
||||||
|
NULL by default.
|
||||||
|
|
||||||
|
75) Tokens: Can we use tokens to talk to the IRCd? Use 1 for yes,
|
||||||
|
0 for no.
|
||||||
|
|
||||||
|
76) Token Case Senstive: Are the IRCd's TOKENS/COMMANDS case sensitive?
|
||||||
|
Use 1 for yes, 0 for no.
|
||||||
|
|
||||||
|
77) base64 SJOIN TS: Are the timestamps sent with a SJOIN in base64? Use
|
||||||
|
1 for yes, 0 for no.
|
||||||
|
|
||||||
|
78) Supports +I: Does the IRCd support channelmode +I? Use 1 for yes,
|
||||||
|
0 for no.
|
||||||
|
|
||||||
|
79) SJOIN Ban Char: Character used to identify bans. Use ''.
|
||||||
|
|
||||||
|
80) SJOIN Except Char: Character used to identify exceptions. Use ''.
|
||||||
|
|
||||||
|
81) SJOIN Invex Char: Character used to identify invexes. Use ''.
|
||||||
|
|
||||||
|
82) SVSMODE UCMODE: Can we clear user channel modes with SVSMODE? Use
|
||||||
|
1 for yes, 0 for no.
|
||||||
|
|
||||||
|
83) SGline Enforce: Does the IRCd enforce SGLINES for us or do we need to
|
||||||
|
do so? Use 1 for yes, 0 for no.
|
||||||
|
|
||||||
|
84) Vhost Character: The character used to represent the vHost mode, if
|
||||||
|
this is supported by the IRCd.
|
||||||
|
|
||||||
|
85) TS6: Does the IRCd support TS6? Use 1 for yes, 0 for no.
|
||||||
|
|
||||||
|
86) UMode +h: Does the IRCd support usermode +h for helpers?
|
||||||
|
Use 1 for yes, 0 for no.
|
||||||
|
|
||||||
|
87) P10: Is this IRCd a P10-style IRCd? Use 1 for yes, 0 for no.
|
||||||
|
|
||||||
|
88) Character Set: Unreal passes the character set during PROTOCTL,
|
||||||
|
the value is stored here. Set this NULL to start.
|
||||||
|
|
||||||
|
89) Reports sync: Does the IRCd report when it's in sync (or done bursting,
|
||||||
|
depending on how you want to say it)? Remember to set
|
||||||
|
the sync state for servers correctly if it does.
|
||||||
|
Use 1 for yes, 0 for no.
|
||||||
|
|
||||||
|
90) Channel CIDR: Set to 1 if channel bans, excepts and invites
|
||||||
|
support CIDR masks. Expected syntax: *!*@ip/mask.
|
||||||
|
When set to 1, anope will only parse strict CIDR masks.
|
||||||
|
IRCd's that try to correct invalid CIDR's (like nefarious)
|
||||||
|
will need a custom implementation in the core.
|
||||||
|
Contact the anope Dev Team if this is the case.
|
||||||
|
Set to 0 if CIDR's are not supported by your IRCd.
|
||||||
|
|
||||||
|
91) Throttle Mode: The IRCd has a channelmode for throttling joins per-user.
|
||||||
|
Use 1 for yes, 0 for no.
|
||||||
|
|
||||||
|
92) CMode j: CMODE_ that defines throttle mode. Use 0 for no support.
|
||||||
|
|
||||||
|
93) Delayed client introduction: Delay the introduction of services pseudo-
|
||||||
|
client till after we have received the uplinks
|
||||||
|
CAPAB.
|
||||||
|
|
||||||
|
So we've had this long list. Now there's a second struct to fill. This
|
||||||
|
struct isn't as long as the previous one though, so we'll handle it quite
|
||||||
|
quick compared to the previous one.
|
||||||
|
|
||||||
|
IRCDCAPAB ircdcap[] = { }
|
||||||
|
|
||||||
|
This struct is based on the CAPAB defines. You should review the CAPAB
|
||||||
|
table below to see how this should be done.
|
||||||
|
|
||||||
|
Define Table
|
||||||
|
--------------------------------------------------------------------------
|
||||||
|
Define | Value | Token | Description
|
||||||
|
----------------|------------|-----------|--------------------------------
|
||||||
|
CAPAB_NOQUIT | 0x00000001 | NOQUIT | NOQUIT protocol support
|
||||||
|
CAPAB_TSMODE | 0x00000002 | TS | Chanmodes are timestamped
|
||||||
|
CAPAB_UNCONNECT | 0x00000004 | UNCONNECT | UNCONNECT protocol support
|
||||||
|
CAPAB_NICKIP | 0x00000008 | NICKIP | IP sent in the NICK line
|
||||||
|
CAPAB_NSJOIN | 0x00000010 | SSJOIN | Smart SJOIN support
|
||||||
|
CAPAB_ZIP | 0x00000020 | ZIP | Support for gzipped links
|
||||||
|
CAPAB_BURST | 0x00000040 | BURST | Supports BURST command
|
||||||
|
CAPAB_TS3 | 0x00000080 | TS3 | Support for TS3 protocol
|
||||||
|
CAPAB_TS5 | 0x00000100 | TS5 | Support for TS5 protocol
|
||||||
|
CAPAB_DKEY | 0x00000200 | DKEY | DH-Key exchange using DKEY
|
||||||
|
CAPAB_DOZIP | 0x00000400 | ZIP | Link traffic will be gzipped
|
||||||
|
CAPAB_DODKEY | 0x00000800 | DKEY | Do DKEY with this link
|
||||||
|
CAPAB_QS | 0x00001000 | QS | Supports quit storm removal
|
||||||
|
CAPAB_SCS | 0x00002000 | SCS | String Cache System support
|
||||||
|
CAPAB_PT4 | 0x00004000 | PT4 | Support for PT4 protocol
|
||||||
|
CAPAB_UID | 0x00008000 | UID | Support for UIDs
|
||||||
|
CAPAB_KNOCK | 0x00010000 | KNOCK | Supports KNOCK
|
||||||
|
CAPAB_CLIENT | 0x00020000 | CLIENT | Supports CLIENT
|
||||||
|
CAPAB_IPV6 | 0x00040000 | IPV6 | Support for IPv6 addresses
|
||||||
|
CAPAB_SSJ5 | 0x00080000 | SSJ5 | Smart Join protocol 5 support
|
||||||
|
CAPAB_SN2 | 0x00100000 | SN2 | Support for SN2 protocol
|
||||||
|
CAPAB_VHOST | 0x00200000 | VHOST | Supports VHOST protocol
|
||||||
|
CAPAB_TOKEN | 0x00400000 | TOKEN | Supports s2s tokens
|
||||||
|
CAPAB_SSJ3 | 0x00800000 | SSJ3 | Smart Join protocol 3 support
|
||||||
|
CAPAB_NICK2 | 0x01000000 | NICK2 | Support for extended NICK (v2)
|
||||||
|
CAPAB_UMODE2 | 0x02000000 | UMODE2 | Supports UMODE2 command
|
||||||
|
CAPAB_VL | 0x04000000 | VL | VLine information in info field
|
||||||
|
CAPAB_TLKEXT | 0x08000000 | TLKEXT | Not 8, but 10 params in TKL's
|
||||||
|
CAPAB_CHANMODE | 0x10000000 | CHANMODE | Channel modes are passed here
|
||||||
|
CAPAB_SJB64 | 0x20000000 | SJB64 | SJOIN timestamps are base64 encoded
|
||||||
|
CAPAB_NICKCHARS | 0x40000000 | NICKCHARS | Character set used by the IRCD for nicks
|
||||||
|
|
||||||
|
|
||||||
|
4) Modes
|
||||||
|
|
||||||
|
The next thing you should do is defining the user modes. You will want to
|
||||||
|
have your .h file handy for this part.
|
||||||
|
|
||||||
|
unsigned long umodes[128] = { }
|
||||||
|
|
||||||
|
This array goes from 0 to 127 in the ASCII character set. Insert the user
|
||||||
|
modes at the slot where the mode fits. If you are adding a the user mode
|
||||||
|
of +i find the 105th (ASCII code of 'i') character slot in the array, and
|
||||||
|
place the UMODE_i into this slot. Your base .c file should contain a good
|
||||||
|
start for this, as well as a little help locating the characters.
|
||||||
|
|
||||||
|
The following mode set is for the channel symbols. During a SJOIN event
|
||||||
|
the modes are sent usually before the nick. These normally are @, +, %
|
||||||
|
etc.. depending on the ircd. Starting at ASCII 0 and running to 127.
|
||||||
|
Replace the 0 with the character (o = @, h = %) for the given mode. In the
|
||||||
|
case of halfop which is usually sent as % replace the 37th character with
|
||||||
|
'h', do this until all modes that are possible be received in this manor
|
||||||
|
have been inserted into the array.
|
||||||
|
|
||||||
|
Now that you have that complete, the following array is ready to be dealt
|
||||||
|
with. This is the cmmodes array, like the others it is a ASCII array
|
||||||
|
starting at 0 and going to 127. However at the given letter you will want
|
||||||
|
to enter the add, and delete function for the given mode. In the case of
|
||||||
|
bans (+b) there is add_ban, and del_ban. Anope provides functions for
|
||||||
|
bans, exceptions and invites, should your ircd have more then these please
|
||||||
|
contact Anope to discuss what can be done to add this mode.
|
||||||
|
|
||||||
|
5) Functions and Events
|
||||||
|
|
||||||
|
A brief word about functions and events. All events are captured using:
|
||||||
|
|
||||||
|
void moduleAddIRCDMsgs(void)
|
||||||
|
{
|
||||||
|
m = createMessage("NICK", anope_event_nick);
|
||||||
|
addCoreMessage(IRCD, m);
|
||||||
|
}
|
||||||
|
|
||||||
|
Each event should have a event handler if its important enough to be
|
||||||
|
processed by services. All event functions should be formed like this:
|
||||||
|
|
||||||
|
int anope_event_capab(char *source, int ac, char **av)
|
||||||
|
{
|
||||||
|
return MOD_CONT;
|
||||||
|
}
|
||||||
|
|
||||||
|
They will receive the source; this can be NULL at times depending on the
|
||||||
|
event. Next, ac is the number of arguments that are in the event, and av
|
||||||
|
holds the values for each; so av[0] is the first variable, av[1] will be
|
||||||
|
the second one, and so on. Events are likely to pass to various upper
|
||||||
|
level event handlers; see the previous ircd source for how they handle
|
||||||
|
these events.
|
||||||
|
|
||||||
|
All commands are formed like this:
|
||||||
|
|
||||||
|
void anope_cmd_svsnoop(char *server, int set)
|
||||||
|
{
|
||||||
|
send_cmd(NULL, "SVSNOOP %s %s", server, (set ? "+" : "-"));
|
||||||
|
}
|
||||||
|
|
||||||
|
They may take any number of arguments, depending on the command. They
|
||||||
|
should eventually come to a send_cmd(); this root function is how
|
||||||
|
commands are sent to the IRCd.
|
||||||
|
|
||||||
|
6) CAPAB/PROTOCTL
|
||||||
|
|
||||||
|
Most IRCD send a CAPAB or PROTOCTL line so that they can work out what
|
||||||
|
the other end of the connection is capable of doing. Anope has a function
|
||||||
|
to read these lines and set itself up to to handle these events better.
|
||||||
|
When adding support for your ircd, take the following steps.
|
||||||
|
|
||||||
|
1) In the ircd.h file make sure to place the defines (see below) that
|
||||||
|
match your IRCd's tokens; only use the ones that matter to your ircd.
|
||||||
|
Should your IRCd add new features not covered in the defined, please
|
||||||
|
contact the Anope Dev team before doing so. See README for information
|
||||||
|
on how to contact the Anope team.
|
||||||
|
|
||||||
|
2) Ensure that the CAPAB/PROTOCTL event his handled correctly.
|
||||||
|
|
||||||
|
A) In the function "moduleAddIRCDMsgs" making sure that you have the
|
||||||
|
following two lines:
|
||||||
|
|
||||||
|
m = createMessage("CAPAB", anope_event_capab);
|
||||||
|
addCoreMessage(IRCD, m);
|
||||||
|
|
||||||
|
B) Add the function to handle the event
|
||||||
|
|
||||||
|
int anope_event_capab(char *source, int ac, char **av)
|
||||||
|
{
|
||||||
|
capab_parse(ac, av);
|
||||||
|
return MOD_CONT;
|
||||||
|
}
|
||||||
|
|
||||||
|
This function should call the capab_parse function which parses
|
||||||
|
the received CAPAB/PROTOCTL line.
|
||||||
@@ -1,60 +0,0 @@
|
|||||||
Anope Multi Language Support
|
|
||||||
----------------------------
|
|
||||||
|
|
||||||
1) Building Anope with gettext support
|
|
||||||
2) Adding a new language
|
|
||||||
3) Using languages with modules
|
|
||||||
4) Updating a language file
|
|
||||||
|
|
||||||
1) Building Anope with gettext support
|
|
||||||
|
|
||||||
To build Anope with gettext support, gettext and its development libraries must be installed on the system.
|
|
||||||
|
|
||||||
On Debian-based systems install the locales-all package.
|
|
||||||
|
|
||||||
On RHEL-based systems run `yum list glibc-langpack-*` and install the languages you want to enable.
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
2) Adding a new language
|
|
||||||
|
|
||||||
Anope uses gettext (https://www.gnu.org/software/gettext/) to translate messages for users. To add a new language
|
|
||||||
install gettext and run `msginit -l language -o anope.language.po -i anope.pot`. For example if I was translating to
|
|
||||||
Spanish I could run `msginit -l es_ES -o anope.es_ES.po -i anope.pot`. Open the newly generating .po file and start
|
|
||||||
translating. Once you are done simply rerun ./Config; make && make install and add the language to your services.conf.
|
|
||||||
Note that on Windows it is not quite this simple, windows.cpp must be edited and Anope recompiled and restarted.
|
|
||||||
|
|
||||||
Poedit (https://poedit.net/) is a popular po file editor, and we recommend using it or another editor designed to edit
|
|
||||||
po files (especially on Windows).
|
|
||||||
|
|
||||||
If you have finished a language file translation and you want others to use it, please file a pull request on GitHub.
|
|
||||||
You'll of course get full credit for it.
|
|
||||||
|
|
||||||
3) Using languages with modules
|
|
||||||
|
|
||||||
Module authors can easily add the ability to have their modules translated by adding _() around the strings they
|
|
||||||
want translated (messages to the user, etc).
|
|
||||||
|
|
||||||
If you want to translate a module someone has made, first generate a .pot file if there isn't one already using
|
|
||||||
`xgettext -s -d modulename -o modulename.pot --from-code=utf-8 --keyword --keyword=_ modulename.cpp`.
|
|
||||||
The .pot file is a template of all of the language strings extracted from the source file.
|
|
||||||
|
|
||||||
Next, run msginit on the .pot file with
|
|
||||||
`msginit -l language -o modulename.language.po -i modulename.pot`.
|
|
||||||
Translate the new .po file and rerun ./Config; make && make install.
|
|
||||||
|
|
||||||
All .po and .pot files should be placed in modules/third/language. Additionally an update script is provided there
|
|
||||||
that will create .pot files and merge any changes to it with existing .po files.
|
|
||||||
|
|
||||||
4) Updating a language file
|
|
||||||
|
|
||||||
Poedit (https://poedit.net/) is a popular po file editor, and we recommend using it or another editor designed to edit
|
|
||||||
po files (especially on Windows).
|
|
||||||
|
|
||||||
Before editing the relevant file in languages/, run `update.sh` in the languages/ folder, i.e. `cd` to it and run
|
|
||||||
./update.sh
|
|
||||||
This will update the language file to contain all strings that need a translation.
|
|
||||||
|
|
||||||
Then commit only the changed .po files in git.
|
|
||||||
+41
-45
@@ -22,16 +22,16 @@ Anope Modules
|
|||||||
1. If modules are supported by your system, they will be configured
|
1. If modules are supported by your system, they will be configured
|
||||||
automatically when you run ./Config. The modules will be installed
|
automatically when you run ./Config. The modules will be installed
|
||||||
to the modules directory in your data path (by default this will
|
to the modules directory in your data path (by default this will
|
||||||
be ~/services/data/modules).
|
be ~/services/modules).
|
||||||
|
|
||||||
2. Compile Anope as usual using ./Config. The "make" process will now
|
Note: you might need to run "make distclean" prior to running ./Config
|
||||||
compile module support into Anope, and compile the default sample
|
|
||||||
modules, and any other module located in the modules folder or any
|
|
||||||
of its sub-directories, eg. modules/extra.
|
|
||||||
|
|
||||||
3. Install Anope as usual. The "make install" process will place the
|
2. Compile Anope as usual. The (g)make process will now compile module
|
||||||
compiled modules in their runtime location, making them available
|
support into Anope, and compile the default sample modules, and/or
|
||||||
for loading.
|
any other module located on the modules folder ("src/modules/").
|
||||||
|
|
||||||
|
3. Install Anope as usual. The install process will place the compiled
|
||||||
|
modules in their runtime location, making them available for loading.
|
||||||
|
|
||||||
4. Start or restart services to make use of the new Anope executable.
|
4. Start or restart services to make use of the new Anope executable.
|
||||||
Note that you do not need to restart to load new or changed modules,
|
Note that you do not need to restart to load new or changed modules,
|
||||||
@@ -42,64 +42,59 @@ Anope Modules
|
|||||||
All module manipulation commands are done through OperServ. These are:
|
All module manipulation commands are done through OperServ. These are:
|
||||||
|
|
||||||
MODLOAD Load a module
|
MODLOAD Load a module
|
||||||
MODRELOAD Reload a module
|
|
||||||
MODUNLOAD Un-Load a module
|
MODUNLOAD Un-Load a module
|
||||||
MODLIST List loaded modules
|
MODLIST List loaded modules
|
||||||
MODINFO Info about a loaded module
|
MODINFO Info about a loaded module
|
||||||
|
|
||||||
Access to the above commands require the operserv/modload and modlist
|
These commands available to Service Roots only.
|
||||||
permissions. Refer to operserv.example.conf.
|
|
||||||
|
|
||||||
You can also load (and pre-load) Modules automatically by loading them
|
You can also load (and pre-load) Modules automatically by loading them
|
||||||
on startup. To do so, edit any one of the configuration files (you may
|
on startup. To do so, edit your services.conf file and change the values
|
||||||
want to use modules.conf for third-party/extra modules, or a config
|
of "ModuleAutoload" and "ModuleDelayedAutoload" to include the modules
|
||||||
file relevant to the *Serv your module operates on, eg. hostserv.conf),
|
you want to load every time Anope starts.
|
||||||
and use the following method to load a module on startup or reload:
|
|
||||||
module { name="hs_modname" }
|
|
||||||
|
|
||||||
4) Usage Example
|
4) Usage Example
|
||||||
|
|
||||||
/msg OperServ modload ns_identify
|
/msg OperServ modload hs_moo
|
||||||
-OperServ- Module ns_identify loaded
|
*** Global -- from OperServ: dengel loaded module hs_moo
|
||||||
|
-OperServ- Module hs_moo loaded
|
||||||
|
|
||||||
/msg OperServ modinfo ns_identify
|
/msg OperServ modinfo hs_moo
|
||||||
-OperServ- Module: ns_identify Version: 1.9.7 Author: Anope loaded: Jun 17 18:43:08 2012 BST (2 minutes ago)
|
-OperServ- Module: hs_moo Version: 1.1 Author: Anope loaded: Mar 21 10:54:37 2004 CLT
|
||||||
-OperServ- Providing service: nickserv/identify
|
-OperServ- Providing command: /msg HostServ moo
|
||||||
-OperServ- Command ID on NickServ is linked to nickserv/identify
|
|
||||||
-OperServ- Command IDENTIFY on NickServ is linked to nickserv/identify
|
|
||||||
|
|
||||||
/msg OperServ modreload ns_identify
|
/msg HostServ moo
|
||||||
-OperServ- Module ns_identify reloaded
|
-HostServ- MOO! - This command was loaded via a module!
|
||||||
|
|
||||||
/msg OperServ modunload ns_identify
|
/msg OperServ modunload hs_moo
|
||||||
-OperServ- Module ns_identify unloaded
|
*** Global -- from OperServ: dengel unloaded module hs_moo
|
||||||
|
-OperServ- Module hs_moo unloaded
|
||||||
|
|
||||||
/msg NickServ IDENTIFY
|
/msg HostServ moo
|
||||||
-NickServ- Unknown command identify. "/msg NickServ HELP" for help.
|
-HostServ- Unknown command moo. "/msg HostServ HELP" for help.
|
||||||
NOTE: Doing the above, with the command still existing in a config file,
|
|
||||||
will result in a log message, similar to the following:
|
|
||||||
<@NickServ> Command IDENTIFY exists on me, but its service nickserv/identify was not found!
|
|
||||||
|
|
||||||
* Note that the name of the module source file is "ns_identify.cpp", yet we
|
* Note that the name of the module file is "hs_moo.c", yet we load
|
||||||
load and reference the module as "ns_identify" only. By naming convention
|
and reference the module as "hs_moo" only. By naming convention
|
||||||
modules have an abbreviated service name they attach to (hs_ for
|
modules have an abbreviated service name they attach to (hs_ for
|
||||||
HostServ, cs_ for ChanServ, etc) followed by a descriptive keyword.
|
HostServ, cs_ for ChanServ, etc) followed by a descriptive keyword.
|
||||||
|
|
||||||
5) More Modules
|
5) More Modules
|
||||||
|
|
||||||
You can download more useful modules from https://modules.anope.org/. Just
|
Anope ships with three sample modules that only illustrates some of the
|
||||||
grab the module file (usually with a .cpp extension). Place the module
|
implemented module capabilities. They don't really do much or anything
|
||||||
file in your modules (anope-1.9.x/modules/third) folder; although any of
|
useful.
|
||||||
the other folders within the modules directory will work.
|
|
||||||
|
You can download more useful modules from http://modules.anope.org/. Just
|
||||||
|
grab the module file (usually with a .c extension). Place the module
|
||||||
|
file in your modules (src/modules) folder; the same folder that contains
|
||||||
|
both hs_moo.c and catserv.c module files.
|
||||||
|
|
||||||
The new modules need to be compiled and installed before you can make
|
The new modules need to be compiled and installed before you can make
|
||||||
use of them:
|
use of them:
|
||||||
|
|
||||||
1. Make sure you're in the main source directory. (usually anope-1.X.XX/)
|
1. Make sure you're in the main source directory. (usually anope-1.X.XX/)
|
||||||
2. Run ./Config to find and configure modules, then `cd build`.
|
2. Run `make modules` to compile any new or changed modules.
|
||||||
3. Run `make` to compile Anope, and any modules.
|
3. Run `make install` to install the modules.
|
||||||
4. Run `make install` to copy the compiled binaries to the ~/services/
|
|
||||||
directory.
|
|
||||||
|
|
||||||
You can now use /msg OperServ MODLOAD to load the new modules.
|
You can now use /msg OperServ MODLOAD to load the new modules.
|
||||||
|
|
||||||
@@ -111,18 +106,19 @@ Anope Modules
|
|||||||
Use modules at your own risk, and make sure you get them from a
|
Use modules at your own risk, and make sure you get them from a
|
||||||
reputable source. You might get module support by contacting the module
|
reputable source. You might get module support by contacting the module
|
||||||
author, posting on our online forum, or maybe on our #anope channel
|
author, posting on our online forum, or maybe on our #anope channel
|
||||||
at /server irc.teranova.net.
|
at /server irc.anope.org.
|
||||||
|
|
||||||
7) Information for Developers
|
7) Information for Developers
|
||||||
|
|
||||||
There are a number of useful documents on the Anope Wiki. The Anope Wiki
|
There are a number of useful documents on the Anope Wiki. The Anope Wiki
|
||||||
can be reached at:
|
can be reached at:
|
||||||
|
|
||||||
* https://wiki.anope.org/
|
* http://wiki.anope.org/
|
||||||
|
|
||||||
|
|
||||||
8) Modules Repository
|
8) Modules Repository
|
||||||
|
|
||||||
You can find modules at https://modules.anope.org/
|
You can find modules at http://modules.anope.org
|
||||||
|
|
||||||
These modules are 3rd party and as such are not supported by the Anope Team.
|
These modules are 3rd party and as such are not supported by the Anope Team.
|
||||||
Contact the Module Author directly with problems, not the Anope Team.
|
Contact the Module Author directly with problems, not the Anope Team.
|
||||||
|
|||||||
+109
@@ -0,0 +1,109 @@
|
|||||||
|
Anope MySQL Support
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
1) Introduction
|
||||||
|
|
||||||
|
Anope 1.6 onwards supports MySQL databases. On Anope 1.6.0 only PHASE 1
|
||||||
|
has been implemented. Since the next phases require major changes in the
|
||||||
|
core, we decided to save it for 2.0. However, having your db's easily
|
||||||
|
accessible on your website is still a great feature.
|
||||||
|
|
||||||
|
PHASE 1:Anope will be able to save all its databases to MySQL. It will
|
||||||
|
happen in conjunction with the current FFF databases. This first step is
|
||||||
|
nothing more than a MySQL dump of the databases (i.e. read-only), since
|
||||||
|
Anope will not (for now) read from Mysql. (COMPLETED)
|
||||||
|
|
||||||
|
PHASE 2:The next step is load the databases from MySQL, being able to
|
||||||
|
replace the FFF completely as an archive method (since all changes to
|
||||||
|
the MySQL db would be lost on the next Services save). All, while keeping
|
||||||
|
FFF intact. This is still not the final goal, but it's a milestone.
|
||||||
|
(COMPLETED)
|
||||||
|
|
||||||
|
UPDATE: Anope 1.7.0 (Revision 11 and above) finally supports phase 2!
|
||||||
|
A new config directive called 'UseRDB' has been added.
|
||||||
|
If you enable this, anope will automatically try to load its
|
||||||
|
data from MySQL (if configured and compiled with).
|
||||||
|
|
||||||
|
PHASE 3:The next step, and most convoluted of all (since we'll need to
|
||||||
|
modify pretty much all the source) is to load/save (SELECT/INSERT) data
|
||||||
|
in realtime. That way the MySQL db could be modified externally (web?).
|
||||||
|
Again, the FFF will be kept intact.
|
||||||
|
|
||||||
|
2) Requirements
|
||||||
|
|
||||||
|
1. MySQL server version 3.23.32 or greater
|
||||||
|
2. MySQL libs and development files (usually called mysql-dev).
|
||||||
|
3. A MySQL user account
|
||||||
|
4. A MySQL database
|
||||||
|
|
||||||
|
3) Installation
|
||||||
|
|
||||||
|
1. The ./Config script automatically detects if your system is capable
|
||||||
|
of running Anope with MySQL support. There is no need anymore to
|
||||||
|
answer yes when asked.
|
||||||
|
|
||||||
|
Note: You might need to run "make distclean" prior to running ./Config
|
||||||
|
|
||||||
|
2. Compile Anope as usual. The (g)make process will now compile MySQL
|
||||||
|
support into Anope.
|
||||||
|
|
||||||
|
3. Install Anope as usual.
|
||||||
|
|
||||||
|
4) Configuration
|
||||||
|
|
||||||
|
1. Go to your "services bin directory" (eg: /home/someuser/services/) and run mydbgen
|
||||||
|
to help on the schema creation and adjustments.
|
||||||
|
|
||||||
|
2. Edit services.conf and add your MySQL data to the MySQL configuration
|
||||||
|
block.
|
||||||
|
|
||||||
|
3. Start or restart services to make use of the new Anope executable.
|
||||||
|
|
||||||
|
5) Security
|
||||||
|
|
||||||
|
To add a layer of security you have the option of encrypting or encoding
|
||||||
|
all passwords for nicks and chans. Use the "MysqlSecure" directive on your
|
||||||
|
services.conf file to enable it. The available storage methods are:
|
||||||
|
|
||||||
|
#MysqlSecure ""
|
||||||
|
|
||||||
|
or
|
||||||
|
|
||||||
|
MysqlSecure ""
|
||||||
|
|
||||||
|
Disables security. All passwords will be saved on the MySQL database
|
||||||
|
as clear text, with no encryption or encoding. FASTEST
|
||||||
|
|
||||||
|
MysqlSecure "des"
|
||||||
|
|
||||||
|
Encrypts all passwords using a UNIX DES encryption. This is a one way
|
||||||
|
encryption algorithm. You can only validate it against another DES
|
||||||
|
encrypted string, using the same "salt" (the first two characters of
|
||||||
|
the encrypted string). FAST
|
||||||
|
|
||||||
|
MysqlSecure "md5"
|
||||||
|
|
||||||
|
Calculates an MD5 128-bit checksum for the password. The value is
|
||||||
|
returned as a 32-digit hex number that may be used as a hash key.
|
||||||
|
This is a one way encryption algorithm. SLOW
|
||||||
|
|
||||||
|
MysqlSecure "sha"
|
||||||
|
|
||||||
|
Calculates an SHA 160-bit checksum for the password. The value is
|
||||||
|
returned as a 40-digit hex number. This is a one way encryption
|
||||||
|
algorithm. SLOWEST
|
||||||
|
|
||||||
|
MysqlSecure "mykey"
|
||||||
|
|
||||||
|
Encodes the passwords using "mykey" as the encryption password. It
|
||||||
|
produces a binary string and can be decoded using the MySQL built in
|
||||||
|
function DECODE(crypt_str,mykey). VARIABLE
|
||||||
|
|
||||||
|
Caveat: Keep in mind that this if you use any method other than clear
|
||||||
|
text, services will need to encrypt/encode every single password on
|
||||||
|
every database save. On large networks, it may impact responsiveness
|
||||||
|
during the saves.
|
||||||
|
|
||||||
|
Caveat: If you enable MysqlSecure you can not longer use the UseRDB directive
|
||||||
|
as all the password types are encrypted with a one way encryption method for
|
||||||
|
older MySQL servers.
|
||||||
@@ -1,6 +1,56 @@
|
|||||||
Highlighted News in Anope 1.9
|
Highlighted News in Anope 1.8
|
||||||
=============================
|
============================================
|
||||||
|
* Added optional mail forking on non Windows OS
|
||||||
|
* Added a new and improved ./Config script.
|
||||||
|
* Added MySQL phase 2 implementation (see docs/MYSQL).
|
||||||
|
* Added NickServ registration delays.
|
||||||
|
* Added read receipts for memos.
|
||||||
|
* Added a way for modules to store data with internal structures.
|
||||||
|
* Added nick tracking support.
|
||||||
|
* Added support for SVSHOLD.
|
||||||
|
* Added support for U:Lined servers.
|
||||||
|
* Added support for TS6 IRCd's.
|
||||||
|
* Added support for Windows.
|
||||||
|
* Added internal events for modules.
|
||||||
|
* Added a way to suspend nicks.
|
||||||
|
* Added support for module configuration directives.
|
||||||
|
* Added translation support for modules.
|
||||||
|
* Added a module pack with handy modules.
|
||||||
|
* Added IRCd protocol modules.
|
||||||
|
* Added support for new IRCd's. Currently supported:
|
||||||
|
- Bahamut 1.4.27 or later (including 1.8)
|
||||||
|
- Charybdis 1.0 or later
|
||||||
|
- DreamForge 4.6.7
|
||||||
|
- Hybrid 7 or later
|
||||||
|
- InspIRCd 1.x and 2.0
|
||||||
|
- Plexus 2.0 or later (including 3.0)
|
||||||
|
- PTLink 6.15 or later
|
||||||
|
- RageIRCd 2.0 or later
|
||||||
|
- Ratbox 2.0.6 or later
|
||||||
|
- ShadowIRCd 4.0 beta 7 or later
|
||||||
|
- Solid IRCd 3.4.6 or later
|
||||||
|
- UltimateIRCd 2.8.2 or later (including 3.0)
|
||||||
|
- UnrealIRCd 3.1.1 or later (including 3.2)
|
||||||
|
- ViagraIRCd 1.3 or later
|
||||||
|
* Added new languages. Currently included:
|
||||||
|
Catalan, German, English, Spanish, French, Greek,
|
||||||
|
Hungarian, Italian, Dutch, Polish, Portugese,
|
||||||
|
Russian, Turkish
|
||||||
|
* Added support for CIDR channel lists.
|
||||||
|
* Converted the core to be completely modular.
|
||||||
|
* Improved random number algorithm.
|
||||||
|
* Removed proxy detector (see docs/PROXY).
|
||||||
|
* Fixed various exploits and vulnerabilities.
|
||||||
|
* Fixed various language typos and inconsistencies.
|
||||||
|
* Fixed a bug in the database system causing nickserv passwords
|
||||||
|
to be saved incorrectly. Note that this breaks backwards
|
||||||
|
compatibility on nick.db !!!
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
For the full changes, see the Changes file.
|
||||||
|
|
||||||
|
For announcements and discussions about Anope, please visit our
|
||||||
|
web site http://www.anope.org
|
||||||
|
|
||||||
|
|
||||||
* Added in live updating SQL and the ability to execute commands through SQL
|
|
||||||
* Re-designed configuration file
|
|
||||||
* Code refresh / rewrite into C++
|
|
||||||
|
|||||||
+1299
File diff suppressed because it is too large
Load Diff
+139
@@ -0,0 +1,139 @@
|
|||||||
|
Highlighted News in Anope 1.7 (and soon 1.8)
|
||||||
|
============================================
|
||||||
|
* Added a new and improved ./Config script.
|
||||||
|
* Added MySQL phase 2 implementation (see docs/MYSQL).
|
||||||
|
* Added NickServ registration delays.
|
||||||
|
* Added read receipts for memos.
|
||||||
|
* Added a way for modules to store data with internal structures.
|
||||||
|
* Added nick tracking support.
|
||||||
|
* Added support for SVSHOLD.
|
||||||
|
* Added support for U:Lined servers.
|
||||||
|
* Added support for TS6 IRCd's.
|
||||||
|
* Added support for Windows.
|
||||||
|
* Added internal events for modules.
|
||||||
|
* Added a way to suspend nicks.
|
||||||
|
* Added support for module configuration directives.
|
||||||
|
* Added translation support for modules.
|
||||||
|
* Added a module pack with handy modules.
|
||||||
|
* Added IRCd protocol modules.
|
||||||
|
* Added support for new IRCd's. Currently supported:
|
||||||
|
- Bahamut 1.4.27 or later (including 1.8)
|
||||||
|
- Charybdis 1.0 or later
|
||||||
|
- DreamForge 4.6.7
|
||||||
|
- Hybrid 7 or later
|
||||||
|
- InspIRCd 1.0 or later (including 1.1)
|
||||||
|
- Plexus 2.0 or later (including 3.0)
|
||||||
|
- PTLink 6.15 or later
|
||||||
|
- RageIRCd 2.0 or later
|
||||||
|
- Ratbox 2.0.6 or later
|
||||||
|
- ShadowIRCd 4.0 beta 7 or later
|
||||||
|
- Solid IRCd 3.4.6 or later
|
||||||
|
- UltimateIRCd 2.8.2 or later (including 3.0)
|
||||||
|
- UnrealIRCd 3.1.1 or later (including 3.2)
|
||||||
|
- ViagraIRCd 1.3 or later
|
||||||
|
* Added new languages. Currently included:
|
||||||
|
Catalan, German, English, Spanish, French, Greek,
|
||||||
|
Hungarian, Italian, Dutch, Polish, Portugese,
|
||||||
|
Russian, Turkish
|
||||||
|
* Added support for CIDR channel lists.
|
||||||
|
* Converted the core to be completely modular.
|
||||||
|
* Improved random number algorithm.
|
||||||
|
* Removed proxy detector (see docs/PROXY).
|
||||||
|
* Fixed various exploits and vulnerabilities.
|
||||||
|
* Fixed various language typos and inconsistencies.
|
||||||
|
* Fixed a bug in the database system causing nickserv passwords
|
||||||
|
to be saved incorrectly. Note that this breaks backwards
|
||||||
|
compatibility on nick.db !!!
|
||||||
|
|
||||||
|
Highlighted News in Anope 1.6
|
||||||
|
=============================
|
||||||
|
* Fixed various exploits and vulnerabilities.
|
||||||
|
* Fixed various language typos and inconsistencies.
|
||||||
|
* Improved ignore system.
|
||||||
|
* Improved ./configure script.
|
||||||
|
* Removed all compile warning fixed.
|
||||||
|
* Converted HelpServ into a proper service.
|
||||||
|
* Added external module support.
|
||||||
|
* Added Defense Condition (DEFCON) System.
|
||||||
|
* Added MySQL support for mirroring databases.
|
||||||
|
* Added multi-server configuration.
|
||||||
|
* Added multi-domain /OS GLOBAL support.
|
||||||
|
* Added combined +oq +oa +ha +va on net-joins.
|
||||||
|
* Added support for ircd changes and upgrades.
|
||||||
|
* Added HostSetters configuration directive.
|
||||||
|
* Added /OS STAFF command.
|
||||||
|
* Added /OS SVSNICK command.
|
||||||
|
* Added /OS CHANKILL command.
|
||||||
|
* Added /MS STAFF command.
|
||||||
|
* Added /NS UPDATE command.
|
||||||
|
* Added /MS SENDALL command.
|
||||||
|
* Added /NS GETMAIL command.
|
||||||
|
* Added /HS DELALL command.
|
||||||
|
* Added /HS LIST command with pattern matching.
|
||||||
|
* New support scripts and tools.
|
||||||
|
* New ircd support, complete list: DreamForge 4.6.7, Bahamut 1.4.27,
|
||||||
|
UnrealIRCd 3.1.1, UltimateIRCd 2.8.2,
|
||||||
|
UltimateIRCd 3.0.0, Hybrid IRCd 7.0
|
||||||
|
ViagraIRCd 1.3.x, PTlink 6.15.0
|
||||||
|
* New Language files, complete list: cat.l, de.l, en_us.l, es.l, fr.l,
|
||||||
|
gr.l, it.l, nl.l, pt.l, ru.l, tr.l
|
||||||
|
|
||||||
|
Highlighted News in Anope 1.4
|
||||||
|
=============================
|
||||||
|
|
||||||
|
After the change from Epona to Anope
|
||||||
|
------------------------------------
|
||||||
|
* New Italian Language file
|
||||||
|
* Added support for UltimateIRCd 3.0 and later
|
||||||
|
* Services realtime logging to a channel
|
||||||
|
* SuperAdmin directive for access to "super" commands.
|
||||||
|
* Ban system is now exception aware.
|
||||||
|
* HostServ for hostname masquerading.
|
||||||
|
* Smarter XOP System.
|
||||||
|
* Email verification/handshake upon registration.
|
||||||
|
* Services can now /ignore users.
|
||||||
|
* Smarter memo notification for channels.
|
||||||
|
* Channel can be SUSPENDed instead of FORBIDen.
|
||||||
|
|
||||||
|
Before the change from Epona to Anope
|
||||||
|
-------------------------------------
|
||||||
|
* HostServ for networks that support them.
|
||||||
|
* UnrealIRCd support has been rewritten, it is now fully
|
||||||
|
working (hopefully) and officially supported again.
|
||||||
|
* Added support for UltimateIRCd 2.8.2 and later.
|
||||||
|
* A multi-threaded proxy detector that can scan Wingates,
|
||||||
|
SOCKS 4/5 and HTTP proxies on ports 3128 and 8080. Don't use
|
||||||
|
it if you have not been authorized to use it by your system
|
||||||
|
administrator!
|
||||||
|
* The ChanServ AOP/SOP/VOP commands, and, on networks that
|
||||||
|
support halfops, the HOP command, have been added. They
|
||||||
|
allow a more user-friendly control of channel privileges.
|
||||||
|
* Use of services IDs that allow an user to be automatically
|
||||||
|
identified after a split (if he was identified before the split)
|
||||||
|
in a secure way. This also saves lots of bandwidth.
|
||||||
|
* Services' default language can now be set in services.conf.
|
||||||
|
* The OperServ RANDOMNEWS command provides an easy way to show
|
||||||
|
network news in a random manner without flooding your users
|
||||||
|
with them (one news per connection).
|
||||||
|
* The BotServ SET PRIVATE option allows services admins to
|
||||||
|
make the bot usable by IRC operators only.
|
||||||
|
* The OperServ SQLINE command allows you to forbid nick masks
|
||||||
|
and even channel masks with the latest Bahamut.
|
||||||
|
* The ChanServ AKICK STICK command allows akicks to be permanently
|
||||||
|
kept on channel.
|
||||||
|
* The ChanServ SET TOPIC command has been renamed to TOPIC, and
|
||||||
|
a new BAN command has been added. They both have their own
|
||||||
|
associated levels.
|
||||||
|
* A SET PEACE command has been added to ChanServ. It prevents
|
||||||
|
users to use pejorative services commands (DEOP, KICK, ...)
|
||||||
|
on users with greater or equal levels.
|
||||||
|
|
||||||
|
Networks using Bahamut must upgrade to Bahamut 1.4.27 or later,
|
||||||
|
while networks using UnrealIRCd must upgrade to Unreal 3.1.1.
|
||||||
|
|
||||||
|
For the full changes, see the Changes file.
|
||||||
|
|
||||||
|
For announcements and discussions about Anope, please visit our
|
||||||
|
web site http://www.anope.org
|
||||||
|
|
||||||
|
|
||||||
+41
@@ -0,0 +1,41 @@
|
|||||||
|
Anope Proxy Detector
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
1) Introduction
|
||||||
|
2) Alternatives
|
||||||
|
|
||||||
|
1) Introduction
|
||||||
|
|
||||||
|
Anope has had a built-in proxy detector since its first version. Recently,
|
||||||
|
however, this built-in proxy detector has been removed. This was because
|
||||||
|
the Anope team found that the proxy detector was showing its age, and the
|
||||||
|
time needed to restore it to a good state wasn't worth it, also considering
|
||||||
|
that there are currently good alternatives out there which do the job as
|
||||||
|
good as it can be done already.
|
||||||
|
|
||||||
|
2) Alternatives
|
||||||
|
|
||||||
|
A) Blitzed Open Proxy Monitor (BOPM)
|
||||||
|
B) NeoStats + OPSB
|
||||||
|
|
||||||
|
Note that these are seperate projects and that the Anope team won't give
|
||||||
|
support on these programs. For support, please refer to the sites of the
|
||||||
|
creators of the software packages.
|
||||||
|
|
||||||
|
A) Blitzed Open Proxy Monitor (BOPM)
|
||||||
|
|
||||||
|
URL: http://wiki.blitzed.org/BOPM
|
||||||
|
|
||||||
|
BOPM is currently the leading proxy detector for IRC networks out
|
||||||
|
there. Altough it is not designed to run on a central place for the
|
||||||
|
entire network, it can be done with some minor tweaking on most IRCd's.
|
||||||
|
The Anope Team advises BOPM for the best security.
|
||||||
|
|
||||||
|
B) NeoStats + OPSB
|
||||||
|
|
||||||
|
URL: http://www.neostats.net/
|
||||||
|
|
||||||
|
NeoStats is the swiss knife of IRC tools. In combination with the OPSB
|
||||||
|
module by NeoStats Software, it can scan for proxies in a similar way
|
||||||
|
as BOPM does. The OPSB module is based on BOPM and has been adjusted to
|
||||||
|
be able to scan all clients from one centralized proxy detector.
|
||||||
+233
-63
@@ -1,14 +1,16 @@
|
|||||||
Anope -- a set of IRC services for IRC networks
|
Anope - a set of IRC services for IRC networks
|
||||||
-----------------------------------------------
|
----------------------------------------------
|
||||||
|
|
||||||
Anope is 2003-2024 Anope Team <team@anope.org>.
|
Anope is 2003-2014 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>.
|
||||||
|
|
||||||
This program is free but copyrighted software; see the file COPYING for
|
This program is free but copyrighted software; see the file COPYING for
|
||||||
details.
|
details.
|
||||||
|
|
||||||
Information about Anope may be found at https://www.anope.org/
|
Information about Anope may be found at http://www.anope.org/
|
||||||
|
Information about Epona may be found at http://www.epona.org/
|
||||||
|
Information about Services may be found at http://www.ircservices.esper.net/
|
||||||
|
|
||||||
Table of Contents
|
Table of Contents
|
||||||
-----------------
|
-----------------
|
||||||
@@ -17,7 +19,8 @@ Table of Contents
|
|||||||
3) Installation
|
3) Installation
|
||||||
4) Command Line Options
|
4) Command Line Options
|
||||||
5) Messages Translation
|
5) Messages Translation
|
||||||
6) Contact
|
6) Adding Your Translation Into The Source
|
||||||
|
7) Contact and Mailing List
|
||||||
|
|
||||||
1) Credits
|
1) Credits
|
||||||
|
|
||||||
@@ -75,7 +78,7 @@ Table of Contents
|
|||||||
* Alvaro Toledo <atoledo@keldon.org>
|
* Alvaro Toledo <atoledo@keldon.org>
|
||||||
* Amanda Folson <amanda@anope.org>
|
* Amanda Folson <amanda@anope.org>
|
||||||
* Andrew Berquist <vash@anope.org>
|
* Andrew Berquist <vash@anope.org>
|
||||||
* Björn Stiddien <keeper@anope.org>
|
* Björn Stiddien <keeper@anope.org>
|
||||||
* Charles Kingsley <chaz@anope.org>
|
* Charles Kingsley <chaz@anope.org>
|
||||||
* Chris Hogben <heinz@anope.org>
|
* Chris Hogben <heinz@anope.org>
|
||||||
* Daniel Engel <dane@zero.org>
|
* Daniel Engel <dane@zero.org>
|
||||||
@@ -92,31 +95,58 @@ Table of Contents
|
|||||||
* Lee Holmes <lethality@anope.org>
|
* Lee Holmes <lethality@anope.org>
|
||||||
* Lucas Nussbaum <lucas@lucas-nussbaum.net>
|
* Lucas Nussbaum <lucas@lucas-nussbaum.net>
|
||||||
* Mark Summers <mark@goopler.net>
|
* Mark Summers <mark@goopler.net>
|
||||||
* Matthew Beeching <jobe@mdbnet.co.uk>
|
* Matthew Beeching <jobe@invictachat.net>
|
||||||
* Naram Qashat <cyberbotx@anope.org>
|
* Naram Qashat <cyberbotx@anope.org>
|
||||||
* Phil Lavin <phil@anope.org>
|
* Phil Lavin <phil@anope.org>
|
||||||
* Pieter Bootsma <geniusdex@anope.org>
|
* Pieter Bootsma <geniusdex@anope.org>
|
||||||
* Robin Burchell <w00t@inspircd.org>
|
* Robin Burchell <w00t@inspircd.org>
|
||||||
* Sean Roe <therock247uk@anope.org>
|
* Sean Roe <therock247uk@anope.org>
|
||||||
* Sebastian V <hal9000@anope.org>
|
* Sebastian V <hal9000@anope.org>
|
||||||
* Thomas Juberg StensĂĄs <ShadowMaster@Shadow-Realm.org>
|
* Thomas Juberg StensĂĄs <ShadowMaster@Shadow-Realm.org>
|
||||||
* Trystan .S Lee <trystan@nomadirc.net>
|
* Trystan .S Lee <trystan@nomadirc.net>
|
||||||
* openglx <openglx@brasnerd.com.br>
|
* openglx <openglx@brasnerd.com.br>
|
||||||
|
|
||||||
Anope Translations:
|
Anope Translations:
|
||||||
|
|
||||||
* Robby <robby@chatbelgie.be> (nl_NL)
|
* GeniusDex <geniusdex@anope.org> (nl.l)
|
||||||
* Kein <kein-of@yandex.ru> (ru_RU)
|
* Kein <kein-of@yandex.ru> (ru.l)
|
||||||
* Maik Funke <Han@mefalcon.org> (de_DE)
|
* Maik Funke <Han@mefalcon.org> (de.l)
|
||||||
* Isaac Fontal <i_fontal@hotmail.com> (es_ES)
|
* Gabriel Acevedo H. <drstein@anope.org> (es.l)
|
||||||
* Janos Kapitany <sarkanyka@cjbchat.hu> (hu_HU)
|
* Janos Kapitany <sarkanyka@cjbchat.hu> (hun.l)
|
||||||
* Szymon S'wierkosz <szymek@adres.pl> (pl_PL)
|
* Szymon S'wierkosz <szymek@adres.pl> (pl.l)
|
||||||
* Christopher N. <saka@epiknet.org> (fr_FR)
|
* Christopher N. <saka@epiknet.org> (fr.l)
|
||||||
* Yusuf Kurekci <ysfm.20@gmail.com> (tr_TR)
|
* Yusuf Kurekci <ysfm.20@gmail.com> (tr.l)
|
||||||
|
|
||||||
Anope Web panel:
|
Anope uses the strlcat() and strlcpy() functions from OpenSSH 2.5.1p2.
|
||||||
|
These functions are copyrighted by Todd C. Miller:
|
||||||
|
|
||||||
|
Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions
|
||||||
|
are met:
|
||||||
|
1. Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
3. The name of the author may not be used to endorse or promote
|
||||||
|
products derived from this software without specific prior written
|
||||||
|
permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED `AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||||
|
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||||
|
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||||
|
OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
|
||||||
|
TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
||||||
|
USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
SUCH DAMAGE.
|
||||||
|
|
||||||
* Denis M. (Phr33d0m) <god@politeia.in>
|
|
||||||
|
|
||||||
2) Presentation
|
2) Presentation
|
||||||
|
|
||||||
@@ -162,18 +192,27 @@ Table of Contents
|
|||||||
|
|
||||||
* HostServ, a neat service that allows users to show custom vHosts
|
* HostServ, a neat service that allows users to show custom vHosts
|
||||||
(virtual hosts) instead of their real IP address; this only works
|
(virtual hosts) instead of their real IP address; this only works
|
||||||
on daemons supporting ip cloaking, such as UnrealIRCd.
|
on daemons supporting ip cloaking, such as UnrealIRCd, UltimateIRCd
|
||||||
|
and ViagraIRCd.
|
||||||
|
|
||||||
|
* HelpServ, a skeleton service used to serve help files.
|
||||||
|
|
||||||
Anope currently works with:
|
Anope currently works with:
|
||||||
|
|
||||||
* Bahamut 1.4.27 or later (including 1.8)
|
* Bahamut 1.4.27 or later (including 1.8)
|
||||||
* Charybdis 3.4 or later
|
* Charybdis 1.0 or later
|
||||||
* ircd-hybrid 8.2.23 or later
|
* DreamForge 4.6.7
|
||||||
* InspIRCd 1.2 or later
|
* Hybrid 8.1 or later
|
||||||
* ngIRCd 19.2 or later
|
* InspIRCd 1.x, and 2.0
|
||||||
* Plexus 3 or later
|
* Plexus 2.0 or later (including 3.0)
|
||||||
|
* PTlink 6.15 or later
|
||||||
|
* RageIRCd 2.0 beta-6 or later
|
||||||
* Ratbox 2.0.6 or later
|
* Ratbox 2.0.6 or later
|
||||||
* UnrealIRCd 3.2 or later
|
* ShadowIRCd 4.0 beta 7 or later
|
||||||
|
* Solid IRCd 3.4.6 or later
|
||||||
|
* UltimateIRCd 2.8.2 or later (including 3.0)
|
||||||
|
* UnrealIRCd 3.1.1 or later (including 3.2)
|
||||||
|
* ViagraIRCd 1.3 or later
|
||||||
|
|
||||||
Anope could also work with some of the daemons derived by the ones listed
|
Anope could also work with some of the daemons derived by the ones listed
|
||||||
above, but there's no support for them if they work or don't work.
|
above, but there's no support for them if they work or don't work.
|
||||||
@@ -187,72 +226,203 @@ Table of Contents
|
|||||||
4) Command Line Options
|
4) Command Line Options
|
||||||
|
|
||||||
Normally, Anope can be run simply by invoking the "services" executable.
|
Normally, Anope can be run simply by invoking the "services" executable.
|
||||||
Any of the following command-line options can be specified to change
|
Anope will then use the defaults specified in the services.conf file, and
|
||||||
|
connect to the specified uplink server. Alternatively, any of the
|
||||||
|
following command-line options can be specified to change the default
|
||||||
|
values:
|
||||||
|
|
||||||
|
-remote server[:port] Connect to the specified server
|
||||||
|
-local host -or- Connect from the specified address (e.g. for
|
||||||
|
[host]:[port] multihomed servers)
|
||||||
|
-name servername Our server name (e.g. services.some.net)
|
||||||
|
-desc string Description of us (e.g. SomeNet Services)
|
||||||
|
-user username Username for Services' nicks (e.g. services)
|
||||||
|
-host hostname Hostname for Services' nicks (e.g. esper.net)
|
||||||
|
-dir directory Directory containing Services' data files
|
||||||
|
(e.g. /usr/local/lib/services)
|
||||||
|
-log filename Services log filename (e.g. services.log)
|
||||||
|
-update secs How often to update databases (in seconds)
|
||||||
|
-expire secs How often to check for nick/channel
|
||||||
|
expiration (in seconds)
|
||||||
|
|
||||||
|
Additionally, the following command-line options can be used to modify
|
||||||
the behavior of Anope:
|
the behavior of Anope:
|
||||||
|
|
||||||
--debug Enable debugging mode; more info sent to log (give
|
-debug Enable debugging mode; more info sent to log (give
|
||||||
option more times for more info)
|
option more times for more info)
|
||||||
--readonly Enable read-only mode; no changes to databases
|
-readonly Enable read-only mode; no changes to databases
|
||||||
allowed
|
allowed, .db files and log not written
|
||||||
--nofork Do not fork after startup; log messages will be
|
-skeleton Enable skeleton mode; like read-only mode, but only
|
||||||
written to terminal
|
OperServ is available
|
||||||
--noexpire Expiration routines won't be run at all
|
-nofork Do not fork after startup; log messages will be
|
||||||
--version Display the version of Anope
|
written to terminal (as well as to the log file
|
||||||
--nothird Do not load the non-core modules specified
|
if not in read-only mode)
|
||||||
--protocoldebug Debug each incoming message after protocol parsing
|
-forceload Try to load as much of the databases as possible,
|
||||||
--support Used for support, same as --debug --nofork --nothird
|
even if errors are encountered
|
||||||
|
-noexpire Expiration routines won't be run at all
|
||||||
Upon starting, Anope will parse its command-line parameters then
|
-logchan Startup with logchan enabled
|
||||||
(assuming the --nofork option is not given) detach itself and run in the
|
-version Display the version of Anope
|
||||||
background. If Anope encounters a problem reading the database files or
|
-nothird Do not load the modules specified in ModulesAutoload
|
||||||
cannot connect to its uplink server, it will terminate immediately;
|
or ModulesDelayedAutoload in the config file
|
||||||
otherwise, it will run until the connection is terminated (or a QUIT,
|
-protocoldebug Debug each incoming message after protocol parsing
|
||||||
SHUTDOWN, or RESTART command is sent; see OperServ's help).
|
-support Used for support, same as -debug -nofork -nothird
|
||||||
|
|
||||||
|
Upon starting, Anope will parse its command-line parameters, open its
|
||||||
|
logfile, then (assuming the -nofork option is not given) detach itself
|
||||||
|
and run in the background. If Anope encounters a problem reading the
|
||||||
|
database files or cannot connect to its uplink server, it will terminate
|
||||||
|
immediately; otherwise, it will run until the connection is terminated
|
||||||
|
(or a QUIT, SHUTDOWN, or RESTART command is sent; see OperServ's help).
|
||||||
In the case of an error, an appropriate error message will be written to
|
In the case of an error, an appropriate error message will be written to
|
||||||
the log file.
|
the log file.
|
||||||
|
|
||||||
If Anope is run with the "--readonly" command-line option, it can serve as
|
If Anope is run with the "-readonly" command-line option, it can serve as
|
||||||
a "backup" to the full version of services. A "full" version of services
|
a "backup" to the full version of services. A "full" version of services
|
||||||
(run without --readonly) will automatically reintroduce its pseudo-clients
|
(run without -readonly) will automatically reintroduce its pseudo-clients
|
||||||
(NickServ, ChanServ, etc.), while a "backup" services will not, thus
|
(NickServ, ChanServ, etc.), while a "backup" services will not, thus
|
||||||
allowing full services to be brought up at any time without disrupting
|
allowing full services to be brought up at any time without disrupting
|
||||||
the network (and without having to take backup services down beforehand).
|
the network (and without having to take backup services down beforehand).
|
||||||
|
|
||||||
The "--debug" option is useful if you find or suspect a problem in Anope.
|
If Anope is run with the "-skeleton" command-line option, it will not try
|
||||||
|
to load the nickname or channel databases, and will respond with "service
|
||||||
|
is inactive" messages to any commands sent to NickServ, ChanServ,
|
||||||
|
MemoServ or BotServ. This can be useful as an emergency stopgap measure
|
||||||
|
when the main copy of Anope cannot be started.
|
||||||
|
|
||||||
|
The "-debug" option is useful if you find or suspect a problem in Anope.
|
||||||
Giving it once on the command line will cause all traffic to and from
|
Giving it once on the command line will cause all traffic to and from
|
||||||
services as well as some other debugging information to be recorded in
|
services as well as some other debugging information to be recorded in
|
||||||
the log file; if you send a bug report, PLEASE include an excerpt from
|
the log file; if you send a bug report, PLEASE include an excerpt from
|
||||||
the log file WITH DEBUGGING ACTIVE; we cannot emphasize enough how
|
the log file WITH DEBUGGING ACTIVE; we cannot emphasize enough how
|
||||||
important this is to tracking down problems. (You can also enable
|
important this is to tracking down problems. (You can also enable
|
||||||
debugging while Services is running using OperServ's SET DEBUG command.)
|
debugging while Services is running using OperServ's SET DEBUG command.)
|
||||||
If you repeat use --debug=<level>, the debugging level will be increased,
|
If you repeat the -debug option more than once, the debugging level will
|
||||||
which provides more detailed information but may also slow Anope down
|
be increased, which provides more detailed information but may also slow
|
||||||
considerably and make the log file grow dramatically faster. In general,
|
Anope down considerably and make the log file grow dramatically faster
|
||||||
a debug level of 1 is sufficient for the coding team to be able to trace
|
(in particular, at debug level 4 a message is written to the log for
|
||||||
a problem, because all network traffic is included and we can usually
|
every character received from the server). In general, a debug level of 1
|
||||||
reproduce the problem.
|
is sufficient for the coding team to be able to trace a problem, because
|
||||||
|
all network traffic is included and we can usually reproduce the problem.
|
||||||
|
|
||||||
|
The "-forceload" option is provided to attempt recovery of data from
|
||||||
|
corrupted or truncated databases. Normally, if Anope encounters an error
|
||||||
|
writing to a database file, it will attempt to restore the original
|
||||||
|
version of the file and report an error to the logfile and through
|
||||||
|
WALLOPS. However, if this should fail (which normally should not happen),
|
||||||
|
or if Anope is terminated abruptly e.g. by kill -9 or a power failure,
|
||||||
|
then one or more of the databases may be corrupt. Normally, this will
|
||||||
|
cause Anope to abort the next time you try to run it; however, if yo
|
||||||
|
give the -forceload option to Anope, it will instead read as much as it
|
||||||
|
can, then skip to the next database. For obvious reasons, it's highly
|
||||||
|
recommended to keep backup copies of your databases in case something
|
||||||
|
does happen (since Anope will stop at the first error in a database, even
|
||||||
|
with -forceload, meaning you lose any data after that).
|
||||||
|
|
||||||
5) Messages Translations
|
5) Messages Translations
|
||||||
|
|
||||||
Please see LANGUAGE for this information
|
Anope has a powerful option in NickServ allowing users to choose what
|
||||||
|
language it must use when sending messages to users. Messages are stored
|
||||||
|
in language files (located in the lang directory).
|
||||||
|
|
||||||
6) Contact
|
Anope is currently provided with thirteen languages: Catalan, Dutch,
|
||||||
|
English, French, German, Greek, Hungarian, Italian, Polish, Portuguese,
|
||||||
|
Russian, Spanish and Turkish. If you want to translate Anope messages
|
||||||
|
into another language, follow this instructions:
|
||||||
|
|
||||||
|
* Copy the lang/en_us.l file to a meaningful name (for example, if
|
||||||
|
you would like to translate messages in Spanish, you would rename
|
||||||
|
it to es.l).
|
||||||
|
|
||||||
|
* Edit the file with your favorite text editor. Carefully read the
|
||||||
|
instructions given at the top of the file, and start translating
|
||||||
|
the whole file. The file is big, so make sure you have some coffee
|
||||||
|
available ;) Try to avoid the use of English words as much as
|
||||||
|
possible. If the new language contains only a few 'special'
|
||||||
|
characters, try and use latin representations of it, if possible.
|
||||||
|
Remember that most clients are only capable of handling the
|
||||||
|
ISO-8859-1 charset. Of course, if you are translating Anope to a
|
||||||
|
language with a totally different charset, such as Russian, feel
|
||||||
|
free to use the one that suites it best (and the one that is in use
|
||||||
|
by most speakers of that language ;)).
|
||||||
|
|
||||||
|
* When this is done, you have two solutions: either patch Services
|
||||||
|
source code so they take in account the new language file (section 6),
|
||||||
|
or send us the translated file so we can make the patch and include
|
||||||
|
your language in the next Anope release.
|
||||||
|
|
||||||
|
* Note that there is a language tool on bin/langtool.pl that can aid
|
||||||
|
the verification process on newly created language files. Try to
|
||||||
|
use it before you submit a language file.
|
||||||
|
|
||||||
|
When new major releases come out, you'll not have to retranslate the
|
||||||
|
whole file; the Changes.lang file will help you to know which messages
|
||||||
|
were added, modified or deleted.
|
||||||
|
|
||||||
|
If you did a language file translation, and want to let others use it,
|
||||||
|
please send it to team@anope.org (don't forget to mention clearly your
|
||||||
|
(nick)name, your e-mail and the language name). You'll of course get full
|
||||||
|
credit for it, and will even get future final major releases before
|
||||||
|
anyone else to complete the translation!... ;)
|
||||||
|
|
||||||
|
6) Adding Your Translation Into The Source
|
||||||
|
|
||||||
|
First, get the latest version of Anope. This can be done by doing
|
||||||
|
'git clone git://github.com/anope/anope anope-stable'
|
||||||
|
|
||||||
|
Second, Place your language file in lang/, and type 'git add file.l`. Where file is
|
||||||
|
your language file.
|
||||||
|
|
||||||
|
Next, edit lang/Makefile(.win32) and add your file into both the LANGOBJS variable and
|
||||||
|
the LANGSRCS variable (alphabetically please). Then, go down and add an entry for
|
||||||
|
it similar the others, eg:
|
||||||
|
en_us: en_us.l langcomp index
|
||||||
|
./langcomp $@.l
|
||||||
|
(which creates the english language file)
|
||||||
|
|
||||||
|
Now, edit include/services.h and search for "#define LANG_EN_US", and add your language to
|
||||||
|
the bottom of the list, eg:
|
||||||
|
#define LANG_BLAH 16 /* Blah language! */
|
||||||
|
(given the language above its number is 15).
|
||||||
|
Then change the NUM_LANGS to one more than it currently is (in this case, 17)
|
||||||
|
and add one to USED_LANGS.
|
||||||
|
|
||||||
|
Finially, edit src/language.c and add your language to the bottom of the array there, eg:
|
||||||
|
...
|
||||||
|
LANG_HUN, /* Hungarian */
|
||||||
|
LANG_PL, /* Polish */
|
||||||
|
LANG_BLAH, /* Blah language! */
|
||||||
|
};
|
||||||
|
then, go down and add it with the others using load_lang(), eg:
|
||||||
|
...
|
||||||
|
load_lang(LANG_HUN, "hun");
|
||||||
|
load_lang(LANG_PL, "pl");
|
||||||
|
load_lang(LANG_BLAH, "blah");
|
||||||
|
|
||||||
|
Now use 'git diff HEAD > language.diff` to get the changes you made, and if it looks good (test it)
|
||||||
|
email it to team@anope.org!
|
||||||
|
|
||||||
|
Please be aware we will only include a new language if there is sufficient demand for it.
|
||||||
|
|
||||||
|
Please do not be disappointed if we do not include your language within Anope.
|
||||||
|
|
||||||
|
Check Changes.lang in order for your language to continue to work on your copy of Anope upgrades.
|
||||||
|
|
||||||
|
7) Contact
|
||||||
|
|
||||||
For announcements and discussions about Anope, please visit our
|
For announcements and discussions about Anope, please visit our
|
||||||
Portal and Forums at https://www.anope.org/ -- make sure you register
|
Portal and Forums at http://www.anope.org/ -- make sure you register
|
||||||
yourself to get full benefits.
|
yourself and your network to get full benefits.
|
||||||
|
|
||||||
If you read the documentation carefully, and didn't find the answer to
|
If you read the documentation carefully, and didn't find the answer to
|
||||||
your question, feel free to post on the website forums or join our irc
|
your question, feel free to post on the website forums or join our irc
|
||||||
channel (irc.teranova.net #anope). Once you join our Support channel be as
|
channel (irc.anope.org #anope). Once you join our Support channel, just
|
||||||
precise as possible when asking a question, because we have no extraordinary
|
type "? report" for instructions on how to report a Bug. Be as precise as
|
||||||
powers and can't guess things if they aren't provided.
|
possible when asking a question, because we have no extraordinary powers
|
||||||
|
and can't guess things if they aren't provided. The more precise you are,
|
||||||
The more precise you are the sooner you'll be likely to get an answer.
|
the sooner you'll be likely to get an answer.
|
||||||
|
|
||||||
If you think you found a bug, add it to the bug tracking system
|
If you think you found a bug, add it to the bug tracking system
|
||||||
(https://github.com/anope/anope/issues) and - again - be as precise as possible.
|
(http://bugs.anope.org) and - again - be as precise as possible. Also say
|
||||||
Also say whether the bug happens always or under what circumstances, and anything
|
whether the bug happens always or under what circumstances, and anything
|
||||||
that could be useful to track your bug down. If you wrote a patch, send
|
that could be useful to track your bug down. If you wrote a patch, send
|
||||||
it over. :)
|
it over. :)
|
||||||
|
|||||||
-160
@@ -1,160 +0,0 @@
|
|||||||
Starting in Anope 1.9.9, 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 "Services for IRC Networks"
|
|
||||||
|
|
||||||
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 (Services for IRC Networks) 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.
|
|
||||||
-25
@@ -1,25 +0,0 @@
|
|||||||
Anope Bundled Tools
|
|
||||||
-------------------
|
|
||||||
|
|
||||||
1) Anope SMTP Client
|
|
||||||
|
|
||||||
Provided with Anope is a simple SMTP client which can be used instead of
|
|
||||||
programs like SendMail in some cases.
|
|
||||||
|
|
||||||
The SMTP client can be used instead of sendmail for use with Anope's mail
|
|
||||||
options. To use the SMTP client instead of sendmail, find the line in your
|
|
||||||
services configuration file (services.conf) that defines sendmailpath. On
|
|
||||||
that line, change the path to your services installation directory, then
|
|
||||||
followed by "bin/anopesmtp" and the IP address of a valid SMTP server. It
|
|
||||||
should look like this:
|
|
||||||
|
|
||||||
sendmailpath = "/home/anope/services/bin/anopesmtp 127.0.0.1"
|
|
||||||
|
|
||||||
If the SMTP client doesn't send mail, or if there's an other problem with
|
|
||||||
it, you can enable debug mode by passing the --debug flag after the server
|
|
||||||
address. This should generate a log file of what happened when it tried
|
|
||||||
to connect to the SMTP server.
|
|
||||||
|
|
||||||
Credits:
|
|
||||||
Originally written by Dominick Meglio <codemastr@unrealircd.com>
|
|
||||||
Ported to *nix by Trystan Scott Lee <trystan@nomadirc.net>
|
|
||||||
+92
-51
@@ -18,18 +18,28 @@ Anope for Windows
|
|||||||
1) Download the required files:
|
1) Download the required files:
|
||||||
|
|
||||||
* Current Anope source:
|
* Current Anope source:
|
||||||
https://github.com/anope/anope/releases
|
http://sourceforge.net/project/showfiles.php?group_id=94081
|
||||||
|
|
||||||
* CMake:
|
If you have Visual C++ 2008, 2010, or 2012 skip ahead to step 2, else you
|
||||||
https://cmake.org/download/
|
need to download the following free components from Microsoft. Once
|
||||||
|
downloaded, install one of the following, for best results use MS VC 2010.
|
||||||
|
|
||||||
(NOTE: When installing, tell CMake to add itself to the PATH.)
|
* Microsoft Visual C++ 2010 Express
|
||||||
|
http://www.microsoft.com/visualstudio/eng/products/visual-studio-2010-express
|
||||||
|
|
||||||
If you have Visual C++ 10 or 11 (2010/2012) skip ahead to step 2, else you
|
or
|
||||||
need to download and install the following free component from Microsoft.
|
|
||||||
|
* Microsoft Visual C++ 2008 Express Edition:
|
||||||
|
http://www.microsoft.com/en-us/download/details.aspx?id=14597
|
||||||
|
|
||||||
|
* Microsoft Windows Platform SDK: (Requires WGA validation)
|
||||||
|
http://www.microsoft.com/en-us/download/details.aspx?id=3138
|
||||||
|
|
||||||
|
* MySQL for Windows (only needed if building with MySQL enabled):
|
||||||
|
http://dev.mysql.com/
|
||||||
|
|
||||||
|
(NOTE: Anope can be compiled against MySQL Version 3.23 and above)
|
||||||
|
|
||||||
* 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
|
2) Unpack the Anope tarball with your favorite uncompression program
|
||||||
(WinZip or WinRAR, etc).
|
(WinZip or WinRAR, etc).
|
||||||
@@ -38,20 +48,17 @@ Anope for Windows
|
|||||||
DOS Command Prompt like window, which will set the environment
|
DOS Command Prompt like window, which will set the environment
|
||||||
properties needed to make Anope.
|
properties needed to make Anope.
|
||||||
|
|
||||||
Create a new directory, which will be used to hold the build files. You can make it
|
Change directories to where you unpacked the source code in step 2, by typing:
|
||||||
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 extracted source>
|
||||||
|
|
||||||
cd <path to build directory>
|
e.g.
|
||||||
|
|
||||||
e.g.
|
cd c:\anope-stable
|
||||||
|
|
||||||
cd c:\anope-build
|
|
||||||
|
|
||||||
4) You now need to configure Anope to your requirements. At the prompt type:
|
4) You now need to configure Anope to your requirements. At the prompt type:
|
||||||
|
|
||||||
<path to source directory>\Config.exe
|
Config.bat
|
||||||
|
|
||||||
NOTE: If you run an Anti-Virus program such as McAfee or Norton, you may
|
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-
|
be unable to run this command due to the protection in place. Some Anti-
|
||||||
@@ -62,49 +69,26 @@ Anope for Windows
|
|||||||
assistance.
|
assistance.
|
||||||
|
|
||||||
An interactive configuration program should guide you through the install
|
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
|
options, and then detect your Microsoft Visual C++ Library files. If it
|
||||||
inside the command prompt window you are in. If you want to build within
|
fails to detect them, you should check you have everything installed.
|
||||||
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
|
If you cannot find whats causing the error, please visit our forums or
|
||||||
our IRC Support channel for assistance.
|
our IRC Support channel for assistance.
|
||||||
|
|
||||||
Some Anope modules require third party libraries, such as m_mysql and
|
5) You are now ready to compile. At the prompt type:
|
||||||
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
|
nmake -f Makefile.win32
|
||||||
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
|
Once you are back at the command prompt again, if there have been no
|
||||||
errors, you are ready to go.
|
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
|
Should you encounter errors with the installation process, check the
|
||||||
messages displayed for advice on resolving them. If you are unable to
|
messages displayed for advice on resolving them. If you are unable to
|
||||||
resolve the issues yourself, seek assistance on our forums or in our
|
resolve the issues yourself, seek assistance on our forums or in our
|
||||||
IRC Support channel.
|
IRC Support channel.
|
||||||
|
|
||||||
6) Finally you will need to install Anope. If you said you wanted to use NMake
|
6) Anope will install the files where they belong. The only thing you need
|
||||||
in step 4, at the prompt type:
|
to do is rename "data/example.conf" to be "data/services.conf".
|
||||||
|
|
||||||
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/example.conf" to be "data/services.conf",
|
|
||||||
and then follow the steps to set up Anope.
|
|
||||||
|
|
||||||
You have now completed the building phase of Anope for Windows. You can
|
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.
|
now move on to the next section, which is related to setting up Anope.
|
||||||
@@ -121,10 +105,22 @@ Anope for Windows
|
|||||||
edit the file correctly.
|
edit the file correctly.
|
||||||
|
|
||||||
Open services.conf, and read through it carefully and adjust the settings
|
Open services.conf, and read through it carefully and adjust the settings
|
||||||
you think you need to adjust.
|
you think you need to adjust. Pay special attention to these settings:
|
||||||
|
|
||||||
|
A) IRCDModule: This is the name of an IRCd Module that Anope will use
|
||||||
|
to communicate with your server. Anope supports 15 IRCds,
|
||||||
|
so ensure you set the right value here.
|
||||||
|
B) RemoteServer: This is the address to your ircd, along with the port
|
||||||
|
and password. You should consult your ircd
|
||||||
|
documentation on how to link ircds.
|
||||||
|
C) ServicesRoot: Remove the # and change the names to your nick so you
|
||||||
|
can take control of services once they are online.
|
||||||
|
D) UserKey1/2/3: Remove the # infront of the three UserKey settings, and
|
||||||
|
change the parameters to numbers; around 6-7 digits will
|
||||||
|
do.
|
||||||
|
|
||||||
If you are unsure of the settings, you can go to the dos command prompt
|
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
|
and run "anope.exe -nofork -debug" and watch the information as it
|
||||||
attempts to connect.
|
attempts to connect.
|
||||||
|
|
||||||
You can launch services in two ways. If you are sure that the entered
|
You can launch services in two ways. If you are sure that the entered
|
||||||
@@ -137,13 +133,57 @@ Anope for Windows
|
|||||||
3) Compiling Modules
|
3) Compiling Modules
|
||||||
|
|
||||||
If you want to build other modules than the ones shipped by default, you
|
If you want to build other modules than the ones shipped by default, you
|
||||||
will need to rerun Config.exe
|
will need to modify the Makefile.inc.win32 file, in the src\modules folder.
|
||||||
|
|
||||||
|
A) Add modules; find the line stating "SRCS=" and add the name of the
|
||||||
|
file to the end of the line. So if you have two files:
|
||||||
|
|
||||||
|
SRCS=file.c file2.c
|
||||||
|
|
||||||
|
If you are compiling a folder of module components, such as the example
|
||||||
|
"catserv", you will need to add/change the "SUBS=" line. If you were
|
||||||
|
compiling the "catserv" example, the line would look like this:
|
||||||
|
|
||||||
|
SUBS=catserv
|
||||||
|
|
||||||
|
B) When you've done this, use the same command prompt you set up in part
|
||||||
|
1, change directories to the src\modules folder, and type:
|
||||||
|
|
||||||
|
nmake -f Makefile.win32
|
||||||
|
|
||||||
|
followed afterwards, by:
|
||||||
|
|
||||||
|
nmake -f Makefile.win32 install
|
||||||
|
|
||||||
|
C) You should now be able to load your modules on IRC via OperServ, or via
|
||||||
|
the services.conf file.
|
||||||
|
|
||||||
|
|
||||||
4) Other compile options
|
4) Other compile options
|
||||||
|
|
||||||
A) If you have trouble recompiling Anope, you should delete all files and folders
|
A) If you have trouble recompiling Anope, you should try:
|
||||||
within the build folder you created in step 3 of section 1. Afterwards, follow
|
|
||||||
the directions from step 4 of section 1 down.
|
nmake -f Makefile.win32 distclean
|
||||||
|
|
||||||
|
This will clean up the source directory and allow for chages to be applied
|
||||||
|
to previously compiled files.
|
||||||
|
|
||||||
|
B) A list of valid options are:
|
||||||
|
|
||||||
|
install
|
||||||
|
distclean
|
||||||
|
clean
|
||||||
|
spotless
|
||||||
|
all
|
||||||
|
core
|
||||||
|
protocols
|
||||||
|
mypasql
|
||||||
|
languages
|
||||||
|
modules
|
||||||
|
|
||||||
|
The syntax for these options is:
|
||||||
|
|
||||||
|
nmake -f Makefile.win32 [option]
|
||||||
|
|
||||||
5) Credits
|
5) Credits
|
||||||
|
|
||||||
@@ -159,3 +199,4 @@ Anope for Windows
|
|||||||
Anope's Windows Installer was made using:
|
Anope's Windows Installer was made using:
|
||||||
|
|
||||||
* NSIS 2.20 <http://nsis.sourceforge.net>
|
* NSIS 2.20 <http://nsis.sourceforge.net>
|
||||||
|
|
||||||
|
|||||||
@@ -1,29 +0,0 @@
|
|||||||
Starting with Anope 1.9.4 XMLRPC using PHP's xmlrpc_encode_request and xmlrpc_decode functions is supported.
|
|
||||||
This allows external applications, such as websites, to execute remote procedure calls to Anope in real time.
|
|
||||||
|
|
||||||
Currently there are 5 supported XMLRPC calls, provided by m_xmlrpc_main:
|
|
||||||
|
|
||||||
checkAuthentication - Takes two parameters, an account name and a password. Checks if the account name is valid and the password
|
|
||||||
is correct for the account name, useful for making login pages on websites.
|
|
||||||
|
|
||||||
command - Takes three parameters, a service name (BotServ, ChanServ, NickServ), a user name (whether online or not), and the command
|
|
||||||
to execute. This will execute the given command to Anope using the given service name. If the user given is online, the
|
|
||||||
command reply will go to them, if not it is returned by XMLRPC.
|
|
||||||
|
|
||||||
stats - Takes no parameters, returns miscellaneous stats that can be found in the /operserv stats command.
|
|
||||||
|
|
||||||
channel - Takes one parameter, a channel name, and returns real time information regarding that channel, such as users, modes
|
|
||||||
(ban lists and such), topic etc.
|
|
||||||
|
|
||||||
user - Takes one parameter, a user name, and returns real time information regarding that user.
|
|
||||||
|
|
||||||
opers - Takes no parameters, returns opertypes, their privileges and commands.
|
|
||||||
|
|
||||||
notice - Takes three parameters, source user, target user, and message. Sends a message to the user.
|
|
||||||
|
|
||||||
XMLRPC was designed to be used with db_sql, and will not return any information that can be pulled from the SQL
|
|
||||||
database, such as accounts and registered channel information. It is instead used for pulling realtime data such
|
|
||||||
as users and channels currently online. For examples on how to use these calls in PHP, see xmlrpc.php in docs/XMLRPC.
|
|
||||||
|
|
||||||
Also note that the parameter named "id" is reserved for query ID. If you pass a query to Anope containing a value for id. it will
|
|
||||||
be stored by Anope and the same id will be passed back in the result.
|
|
||||||
@@ -1,145 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* XMLRPC Functions
|
|
||||||
*
|
|
||||||
* (C) 2003-2024 Anope Team
|
|
||||||
* Contact us at team@anope.org
|
|
||||||
*/
|
|
||||||
|
|
||||||
class AnopeXMLRPC
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* The XMLRPC host
|
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
private $host;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initiate a new AnopeXMLRPC instance
|
|
||||||
*
|
|
||||||
* @param $host
|
|
||||||
*/
|
|
||||||
public function __construct($host)
|
|
||||||
{
|
|
||||||
$this->host = $host;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Run an XMLRPC command. Name should be a query name and params an array of parameters, eg:
|
|
||||||
* $this->raw("checkAuthentication", ["adam", "qwerty"]);
|
|
||||||
* If successful returns back an array of useful information.
|
|
||||||
*
|
|
||||||
* Note that $params["id"] is reserved for query ID, you may set it to something if you wish.
|
|
||||||
* If you do, the same ID will be passed back with the reply from Anope.
|
|
||||||
*
|
|
||||||
* @param $name
|
|
||||||
* @param $params
|
|
||||||
* @return array|null
|
|
||||||
*/
|
|
||||||
public function run($name, $params)
|
|
||||||
{
|
|
||||||
$xmlquery = xmlrpc_encode_request($name, $params);
|
|
||||||
$context = stream_context_create(["http" => [
|
|
||||||
"method" => "POST",
|
|
||||||
"header" => "Content-Type: text/xml",
|
|
||||||
"content" => $xmlquery]]);
|
|
||||||
|
|
||||||
$inbuf = file_get_contents($this->host, false, $context);
|
|
||||||
$response = xmlrpc_decode($inbuf);
|
|
||||||
|
|
||||||
if ($response) {
|
|
||||||
return $response;
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Do Command on Service as User, eg:
|
|
||||||
* $anope->command("ChanServ", "Adam", "REGISTER #adam");
|
|
||||||
* Returns an array of information regarding the command execution, if
|
|
||||||
* If 'online' is set to yes, then the reply to the command was sent to the user on IRC.
|
|
||||||
* If 'online' is set to no, then the reply to the command is in the array member 'return'
|
|
||||||
*
|
|
||||||
* @param $service
|
|
||||||
* @param $user
|
|
||||||
* @param $command
|
|
||||||
* @return array|null
|
|
||||||
*/
|
|
||||||
public function command($service, $user, $command)
|
|
||||||
{
|
|
||||||
return $this->run("command", [$service, $user, $command]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check an account/nick name and password to see if they are valid
|
|
||||||
* Returns the account display name if valid
|
|
||||||
*
|
|
||||||
* @param $account
|
|
||||||
* @param $pass
|
|
||||||
* @return string|null
|
|
||||||
*/
|
|
||||||
public function auth($account, $pass)
|
|
||||||
{
|
|
||||||
$ret = $this->run("checkAuthentication", [$account, $pass]);
|
|
||||||
|
|
||||||
if ($ret && $ret["result"] == "Success") {
|
|
||||||
return $ret["account"];
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns an array of misc stats regarding Anope
|
|
||||||
*
|
|
||||||
* @return array|null
|
|
||||||
*/
|
|
||||||
public function stats()
|
|
||||||
{
|
|
||||||
return $this->run("stats", null);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Look up data for a channel
|
|
||||||
* Returns an array containing channel information, or an array of size one
|
|
||||||
* (just containing the name) if the channel does not exist
|
|
||||||
*
|
|
||||||
* @param $channel
|
|
||||||
* @return array|null
|
|
||||||
*/
|
|
||||||
public function channel($channel)
|
|
||||||
{
|
|
||||||
return $this->run("channel", [$channel]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sent a notice to a user.
|
|
||||||
* Returns an array containing channel information, or an array of size one
|
|
||||||
* (just containing the name) if the channel does not exist
|
|
||||||
*
|
|
||||||
* @param $source
|
|
||||||
* @param $target
|
|
||||||
* @param $message
|
|
||||||
* @return array|null
|
|
||||||
*/
|
|
||||||
public function notice($source, $target, $message)
|
|
||||||
{
|
|
||||||
return $this->run("notice", [$source, $target, $message]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Like channel(), but different.
|
|
||||||
*
|
|
||||||
* @param $user
|
|
||||||
* @return array|null
|
|
||||||
*/
|
|
||||||
public function user($user)
|
|
||||||
{
|
|
||||||
return $this->run("user", [$user]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$anope = new AnopeXMLRPC("http://127.0.0.1:8080/xmlrpc");
|
|
||||||
@@ -1,168 +0,0 @@
|
|||||||
#!/usr/bin/env perl
|
|
||||||
|
|
||||||
#
|
|
||||||
# Script taken from InspIRCd, https://www.inspircd.org/
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
||||||
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
|
||||||
# details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
#
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN { require 5.8.0; }
|
|
||||||
|
|
||||||
use strict;
|
|
||||||
use warnings FATAL => qw(all);
|
|
||||||
|
|
||||||
use File::Copy ();
|
|
||||||
use Cwd;
|
|
||||||
|
|
||||||
sub list_extras ();
|
|
||||||
sub enable_extras (@);
|
|
||||||
sub disable_extras (@);
|
|
||||||
|
|
||||||
# Routine to list out the extra/ modules that have been enabled.
|
|
||||||
# Note: when getting any filenames out and comparing, it's important to lc it if the
|
|
||||||
# file system is not case-sensitive (== Epoc, MacOS, OS/2 (incl DOS/DJGPP), VMS, Win32
|
|
||||||
# (incl NetWare, Symbian)). Cygwin may or may not be case-sensitive, depending on
|
|
||||||
# configuration, however, File::Spec does not currently tell us (it assumes Unix behavior).
|
|
||||||
sub list_extras () {
|
|
||||||
use File::Spec;
|
|
||||||
# @_ not used
|
|
||||||
my $srcdir = File::Spec->catdir("modules");
|
|
||||||
my $abs_srcdir = File::Spec->rel2abs($srcdir);
|
|
||||||
local $_;
|
|
||||||
my $dd;
|
|
||||||
opendir $dd, File::Spec->catdir($abs_srcdir, "extra") or die (File::Spec->catdir($abs_srcdir, "extra") . ": $!\n");
|
|
||||||
my @extras = map { File::Spec->case_tolerant() ? lc($_) : $_ } (readdir($dd));
|
|
||||||
closedir $dd;
|
|
||||||
undef $dd;
|
|
||||||
opendir $dd, $abs_srcdir or die "$abs_srcdir: $!\n";
|
|
||||||
my @sources = map { File::Spec->case_tolerant() ? lc($_) : $_ } (readdir($dd));
|
|
||||||
closedir $dd;
|
|
||||||
undef $dd;
|
|
||||||
my $maxlen = (sort { $b <=> $a } (map {length($_)} (@extras)))[0];
|
|
||||||
my %extras = ();
|
|
||||||
EXTRA: for my $extra (@extras) {
|
|
||||||
next if (File::Spec->curdir() eq $extra || File::Spec->updir() eq $extra);
|
|
||||||
my $abs_extra = File::Spec->catfile($abs_srcdir, "extra", $extra);
|
|
||||||
my $abs_source = File::Spec->catfile($abs_srcdir, $extra);
|
|
||||||
next unless ($extra =~ m/\.(cpp|h)$/ || (-d $abs_extra)); # C++ Source/Header, or directory
|
|
||||||
if (-l $abs_source) {
|
|
||||||
# Symlink, is it in the right place?
|
|
||||||
my $targ = readlink($abs_source);
|
|
||||||
my $abs_targ = File::Spec->rel2abs($targ, $abs_srcdir);
|
|
||||||
if ($abs_targ eq $abs_extra) {
|
|
||||||
$extras{$extra} = "\e[32;1menabled\e[0m";
|
|
||||||
} else {
|
|
||||||
$extras{$extra} = sprintf("\e[31;1mwrong symlink target (%s)\e[0m", $abs_targ);
|
|
||||||
}
|
|
||||||
} elsif (-e $abs_source) {
|
|
||||||
my ($devext, $inoext) = stat($abs_extra);
|
|
||||||
my ($devsrc, $inosrc, undef, $lnksrc) = stat($abs_source);
|
|
||||||
if ($lnksrc > 1) {
|
|
||||||
if ($devsrc == $devext && $inosrc == $inoext) {
|
|
||||||
$extras{$extra} = "\e[32;1menabled\e[0m";
|
|
||||||
} else {
|
|
||||||
$extras{$extra} = sprintf("\e[31;1mwrong hardlink target (%d:%d)\e[0m", $devsrc, $inosrc);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
open my $extfd, "<", $abs_extra;
|
|
||||||
open my $srcfd, "<", $abs_source;
|
|
||||||
local $/ = undef;
|
|
||||||
if (scalar(<$extfd>) eq scalar(<$srcfd>)) {
|
|
||||||
$extras{$extra} = "\e[32;1menabled\e[0m";
|
|
||||||
} else {
|
|
||||||
$extras{$extra} = sprintf("\e[31;1mout of synch (re-copy)\e[0m");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$extras{$extra} = "\e[33;1mdisabled\e[0m";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for my $extra (sort {$a cmp $b} keys(%extras)) {
|
|
||||||
my $text = $extras{$extra};
|
|
||||||
if ($text =~ m/needed by/ && $text !~ m/enabled/) {
|
|
||||||
printf "\e[31;1;5m%-*s = %s%s\e[0m\n", $maxlen, $extra, $text, ($text =~ m/needed by/ ? ")" : "");
|
|
||||||
} else {
|
|
||||||
printf "%-*s = %s%s\n", $maxlen, $extra, $text, ($text =~ m/needed by/ ? "\e[0m)" : "");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return keys(%extras) if wantarray; # Can be used by manage_extras.
|
|
||||||
}
|
|
||||||
|
|
||||||
sub enable_extras (@) {
|
|
||||||
my (@extras) = @_;
|
|
||||||
for my $extra (@extras) {
|
|
||||||
my $extrapath = "modules/extra/$extra";
|
|
||||||
if (!-e $extrapath) {
|
|
||||||
print STDERR "Cannot enable \e[32;1m$extra\e[0m : No such file or directory in modules/extra\n";
|
|
||||||
next;
|
|
||||||
}
|
|
||||||
my $source = "modules/$extra";
|
|
||||||
if (-e $source) {
|
|
||||||
print STDERR "Cannot enable \e[32;1m$extra\e[0m : destination in modules exists (might already be enabled?)\n";
|
|
||||||
next;
|
|
||||||
}
|
|
||||||
print "Enabling $extra ... \n";
|
|
||||||
symlink "extra/$extra", $source or print STDERR "$source: Cannot link to 'extra/$extra': $!\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sub disable_extras (@)
|
|
||||||
{
|
|
||||||
opendir my $dd, "modules/extra/";
|
|
||||||
my @files = readdir($dd);
|
|
||||||
closedir $dd;
|
|
||||||
my (@extras) = @_;
|
|
||||||
EXTRA: for my $extra (@extras) {
|
|
||||||
my $extrapath = "modules/extra/$extra";
|
|
||||||
my $source = "modules/$extra";
|
|
||||||
if (!-e $extrapath) {
|
|
||||||
print STDERR "Cannot disable \e[32;1m$extra\e[0m : Is not an extra\n";
|
|
||||||
next;
|
|
||||||
}
|
|
||||||
if ((! -l $source) || readlink($source) ne "extra/$extra") {
|
|
||||||
print STDERR "Cannot disable \e[32;1m$extra\e[0m : Source is not a link or doesn't refer to the right file. Remove manually if this is in error.\n";
|
|
||||||
next;
|
|
||||||
}
|
|
||||||
# Now remove.
|
|
||||||
print "Disabling $extra ... \n";
|
|
||||||
unlink "modules/$extra" or print STDERR "Cannot disable \e[32;1m$extra\e[0m : $!\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
my $clearscreen = `clear`;
|
|
||||||
print $clearscreen;
|
|
||||||
while (1)
|
|
||||||
{
|
|
||||||
list_extras; # print the module list
|
|
||||||
print "\nPlease enter the name of the module or type 'q' to quit.: ";
|
|
||||||
my $input = <STDIN>;
|
|
||||||
chop($input); # remove the trailing \n from the user input
|
|
||||||
|
|
||||||
if ($input eq "q") {
|
|
||||||
if (-e "build/CMakeFiles") {
|
|
||||||
system("cmake", "build/.");
|
|
||||||
print "\nNow cd build, then run make to build Anope.\n\n";
|
|
||||||
} else {
|
|
||||||
print "\nBuild directory not found. You should run ./Config now.\n\n"
|
|
||||||
}
|
|
||||||
exit 0;
|
|
||||||
}
|
|
||||||
print $clearscreen;
|
|
||||||
if ($input eq "") {
|
|
||||||
next;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (-e "modules/$input") {
|
|
||||||
disable_extras($input)
|
|
||||||
} else {
|
|
||||||
enable_extras($input)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,64 +0,0 @@
|
|||||||
# Set version.cpp to use C++ as well as set its compile flags
|
|
||||||
set_source_files_properties(version.cpp PROPERTIES LANGUAGE CXX COMPILE_FLAGS "${CXXFLAGS}")
|
|
||||||
# Generate version-bin executable to modify version.h, setting it's linker flags as well
|
|
||||||
add_executable(version-bin version.cpp)
|
|
||||||
set_target_properties(version-bin PROPERTIES LINKER_LANGUAGE CXX LINK_FLAGS "${LDFLAGS}")
|
|
||||||
set(version_BINARY "$<TARGET_FILE:version-bin>")
|
|
||||||
# Modify version.h from the above executable, with dependencies to version.cpp
|
|
||||||
# and all of the source files in the main build
|
|
||||||
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/version.h ${CMAKE_CURRENT_BINARY_DIR}/build.h
|
|
||||||
COMMAND version-bin ${Anope_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/version.h ${CMAKE_CURRENT_BINARY_DIR}/build.h
|
|
||||||
DEPENDS version-bin ${SRC_SRCS}
|
|
||||||
)
|
|
||||||
# Add version-bin to list of files for CPack to ignore
|
|
||||||
get_filename_component(version_BINARY ${version_BINARY} NAME)
|
|
||||||
add_to_cpack_ignored_files("${version_BINARY}$" TRUE)
|
|
||||||
if(NOT WIN32)
|
|
||||||
add_to_cpack_ignored_files("version.h$" TRUE)
|
|
||||||
add_to_cpack_ignored_files("build.h$" TRUE)
|
|
||||||
endif(NOT WIN32)
|
|
||||||
|
|
||||||
set(PCH_SOURCES_GCH "")
|
|
||||||
if(USE_PCH AND CMAKE_COMPILER_IS_GNUCXX)
|
|
||||||
string(REPLACE " " ";" PCH_CXXFLAGS "${CXXFLAGS} ${CMAKE_CXX_FLAGS}")
|
|
||||||
|
|
||||||
file(GLOB PCH_SOURCES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.h")
|
|
||||||
sort_list(PCH_SOURCES)
|
|
||||||
|
|
||||||
foreach(PCH_SOURCE ${PCH_SOURCES})
|
|
||||||
find_includes(${PCH_SOURCE} INCLUDES)
|
|
||||||
set(INCLUDES_LIST)
|
|
||||||
append_to_list(INCLUDES_LIST ${PCH_SOURCE})
|
|
||||||
foreach(INCLUDE ${INCLUDES})
|
|
||||||
# Extract the filename from the #include line
|
|
||||||
extract_include_filename(${INCLUDE} FILENAME QUOTE_TYPE)
|
|
||||||
if(QUOTE_TYPE STREQUAL "quotes")
|
|
||||||
find_in_list(PCH_SOURCES "${FILENAME}" FOUND)
|
|
||||||
if(NOT FOUND EQUAL -1)
|
|
||||||
append_to_list(INCLUDES_LIST ${FILENAME})
|
|
||||||
endif(NOT FOUND EQUAL -1)
|
|
||||||
endif(QUOTE_TYPE STREQUAL "quotes")
|
|
||||||
endforeach(INCLUDE)
|
|
||||||
|
|
||||||
set(PCH_EXTRAFLAGS "")
|
|
||||||
if(DEBUG_BUILD)
|
|
||||||
set(PCH_EXTRAFLAGS "-g")
|
|
||||||
endif(DEBUG_BUILD)
|
|
||||||
if(PCH_SOURCE STREQUAL "module.h")
|
|
||||||
set(PCH_EXTRAFLAGS ${PCH_EXTRAFLAGS} -fPIC)
|
|
||||||
endif(PCH_SOURCE STREQUAL "module.h")
|
|
||||||
if(GETTEXT_INCLUDE)
|
|
||||||
set(PCH_GETTEXT_INCLUDE "-I${GETTEXT_INCLUDE}")
|
|
||||||
endif(GETTEXT_INCLUDE)
|
|
||||||
|
|
||||||
set(PCH_SOURCES_GCH "${PCH_SOURCES_GCH};${CMAKE_CURRENT_BINARY_DIR}/${PCH_SOURCE}.gch")
|
|
||||||
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${PCH_SOURCE}.gch
|
|
||||||
COMMAND ${CMAKE_CXX_COMPILER} ARGS ${PCH_CXXFLAGS} ${PCH_EXTRAFLAGS}
|
|
||||||
${PCH_GETTEXT_INCLUDE} -I${CMAKE_CURRENT_BINARY_DIR} -I${Anope_SOURCE_DIR}/modules/pseudoclients ${CMAKE_CURRENT_SOURCE_DIR}/${PCH_SOURCE} -o ${CMAKE_CURRENT_BINARY_DIR}/${PCH_SOURCE}.gch
|
|
||||||
DEPENDS ${INCLUDES_LIST} VERBATIM
|
|
||||||
)
|
|
||||||
endforeach(PCH_SOURCE ${PCH_SOURCES})
|
|
||||||
endif(USE_PCH AND CMAKE_COMPILER_IS_GNUCXX)
|
|
||||||
|
|
||||||
# Add a custom target to the above file
|
|
||||||
add_custom_target(headers DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/version.h ${CMAKE_CURRENT_BINARY_DIR}/build.h ${PCH_SOURCES_GCH})
|
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
|
||||||
|
all: services.h extern.h pseudo.h version.h
|
||||||
|
|
||||||
|
version.h: Makefile version.sh services.h pseudo.h messages.h $(SRCS)
|
||||||
|
sh version.sh
|
||||||
|
|
||||||
|
services.h: sysconf.h config.h extern.h
|
||||||
|
touch $@
|
||||||
|
|
||||||
|
extern.h: slist.h
|
||||||
|
touch $@
|
||||||
|
|
||||||
|
pseudo.h: commands.h timeout.h encrypt.h datafiles.h slist.h
|
||||||
|
touch $@
|
||||||
|
|
||||||
|
clean:
|
||||||
|
(rm -f language.h)
|
||||||
|
|
||||||
|
distclean: clean
|
||||||
|
(rm -f sysconf.h version.h)
|
||||||
@@ -1,174 +0,0 @@
|
|||||||
/*
|
|
||||||
*
|
|
||||||
* (C) 2003-2026 Anope Team
|
|
||||||
* Contact us at team@anope.org
|
|
||||||
*
|
|
||||||
* Please read COPYING and README for further details.
|
|
||||||
*
|
|
||||||
* Based on the original code of Epona by Lara.
|
|
||||||
* Based on the original code of Services by Andy Church.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef ACCESS_H
|
|
||||||
#define ACCESS_H
|
|
||||||
|
|
||||||
#include "services.h"
|
|
||||||
#include "anope.h"
|
|
||||||
#include "serialize.h"
|
|
||||||
#include "service.h"
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
ACCESS_INVALID = -10000,
|
|
||||||
ACCESS_FOUNDER = 10001
|
|
||||||
};
|
|
||||||
|
|
||||||
/* A privilege, probably configured using a privilege{} block. Most
|
|
||||||
* commands require specific privileges to be executed. The AccessProvider
|
|
||||||
* backing each ChanAccess determines whether that ChanAccess has a given
|
|
||||||
* privilege.
|
|
||||||
*/
|
|
||||||
struct CoreExport Privilege
|
|
||||||
{
|
|
||||||
Anope::string name;
|
|
||||||
Anope::string desc;
|
|
||||||
/* Rank relative to other privileges */
|
|
||||||
int rank;
|
|
||||||
|
|
||||||
Privilege(const Anope::string &name, const Anope::string &desc, int rank);
|
|
||||||
bool operator==(const Privilege &other) const;
|
|
||||||
};
|
|
||||||
|
|
||||||
class CoreExport PrivilegeManager
|
|
||||||
{
|
|
||||||
static std::vector<Privilege> Privileges;
|
|
||||||
public:
|
|
||||||
static void AddPrivilege(Privilege p);
|
|
||||||
static void RemovePrivilege(Privilege &p);
|
|
||||||
static Privilege *FindPrivilege(const Anope::string &name);
|
|
||||||
static std::vector<Privilege> &GetPrivileges();
|
|
||||||
static void ClearPrivileges();
|
|
||||||
};
|
|
||||||
|
|
||||||
/* A provider of access. Only used for creating ChanAccesses, as
|
|
||||||
* they contain pure virtual functions.
|
|
||||||
*/
|
|
||||||
class CoreExport AccessProvider : public Service
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
AccessProvider(Module *owner, const Anope::string &name);
|
|
||||||
virtual ~AccessProvider();
|
|
||||||
|
|
||||||
/** Creates a new ChanAccess entry using this provider.
|
|
||||||
* @return The new entry
|
|
||||||
*/
|
|
||||||
virtual ChanAccess *Create() = 0;
|
|
||||||
|
|
||||||
private:
|
|
||||||
static std::list<AccessProvider *> Providers;
|
|
||||||
public:
|
|
||||||
static const std::list<AccessProvider *>& GetProviders();
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Represents one entry of an access list on a channel. */
|
|
||||||
class CoreExport ChanAccess : public Serializable
|
|
||||||
{
|
|
||||||
Anope::string mask;
|
|
||||||
/* account this access entry is for, if any */
|
|
||||||
Serialize::Reference<NickCore> nc;
|
|
||||||
|
|
||||||
public:
|
|
||||||
typedef std::vector<ChanAccess *> Path;
|
|
||||||
|
|
||||||
/* The provider that created this access entry */
|
|
||||||
AccessProvider *provider;
|
|
||||||
/* Channel this access entry is on */
|
|
||||||
Serialize::Reference<ChannelInfo> ci;
|
|
||||||
Anope::string creator;
|
|
||||||
time_t last_seen;
|
|
||||||
time_t created;
|
|
||||||
|
|
||||||
ChanAccess(AccessProvider *p);
|
|
||||||
virtual ~ChanAccess();
|
|
||||||
|
|
||||||
void SetMask(const Anope::string &mask, ChannelInfo *ci);
|
|
||||||
const Anope::string &Mask() const;
|
|
||||||
NickCore *GetAccount() const;
|
|
||||||
|
|
||||||
void Serialize(Serialize::Data &data) const anope_override;
|
|
||||||
static Serializable* Unserialize(Serializable *obj, Serialize::Data &);
|
|
||||||
|
|
||||||
static const unsigned int MAX_DEPTH = 4;
|
|
||||||
|
|
||||||
/** Check if this access entry matches the given user or account
|
|
||||||
* @param u The user
|
|
||||||
* @param nc The account
|
|
||||||
* @param next Next channel to check if any
|
|
||||||
*/
|
|
||||||
virtual bool Matches(const User *u, const NickCore *nc, ChannelInfo* &next) const;
|
|
||||||
|
|
||||||
/** Check if this access entry has the given privilege.
|
|
||||||
* @param name The privilege name
|
|
||||||
*/
|
|
||||||
virtual bool HasPriv(const Anope::string &name) const = 0;
|
|
||||||
|
|
||||||
/** Serialize the access given by this access entry into a human
|
|
||||||
* readable form. chanserv/access will return a number, chanserv/xop
|
|
||||||
* will be AOP, SOP, etc.
|
|
||||||
*/
|
|
||||||
virtual Anope::string AccessSerialize() const = 0;
|
|
||||||
|
|
||||||
/** Unserialize this access entry from the given data. This data
|
|
||||||
* will be fetched from AccessSerialize.
|
|
||||||
*/
|
|
||||||
virtual void AccessUnserialize(const Anope::string &data) = 0;
|
|
||||||
|
|
||||||
/* Comparison operators to other Access entries */
|
|
||||||
virtual bool operator>(const ChanAccess &other) const;
|
|
||||||
virtual bool operator<(const ChanAccess &other) const;
|
|
||||||
bool operator>=(const ChanAccess &other) const;
|
|
||||||
bool operator<=(const ChanAccess &other) const;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* A group of access entries. This is used commonly, for example with ChannelInfo::AccessFor,
|
|
||||||
* to show what access a user has on a channel because users can match multiple access entries.
|
|
||||||
*/
|
|
||||||
class CoreExport AccessGroup
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
/* access entries + paths */
|
|
||||||
std::vector<ChanAccess::Path> paths;
|
|
||||||
/* Channel these access entries are on */
|
|
||||||
const ChannelInfo *ci;
|
|
||||||
/* Account these entries affect, if any */
|
|
||||||
const NickCore *nc;
|
|
||||||
/* super_admin always gets all privs. founder is a special case where ci->founder == nc */
|
|
||||||
bool super_admin, founder;
|
|
||||||
|
|
||||||
AccessGroup();
|
|
||||||
|
|
||||||
/** Check if this access group has a certain privilege. Eg, it
|
|
||||||
* will check every ChanAccess entry of this group for any that
|
|
||||||
* has the given privilege.
|
|
||||||
* @param priv The privilege
|
|
||||||
* @return true if any entry has the given privilege
|
|
||||||
*/
|
|
||||||
bool HasPriv(const Anope::string &priv) const;
|
|
||||||
|
|
||||||
/** Get the "highest" access entry from this group of entries.
|
|
||||||
* The highest entry is determined by the entry that has the privilege
|
|
||||||
* with the highest rank (see Privilege::rank).
|
|
||||||
* @return The "highest" entry
|
|
||||||
*/
|
|
||||||
const ChanAccess *Highest() const;
|
|
||||||
|
|
||||||
/* Comparison operators to other AccessGroups */
|
|
||||||
bool operator>(const AccessGroup &other) const;
|
|
||||||
bool operator<(const AccessGroup &other) const;
|
|
||||||
bool operator>=(const AccessGroup &other) const;
|
|
||||||
bool operator<=(const AccessGroup &other) const;
|
|
||||||
|
|
||||||
inline bool empty() const { return paths.empty(); }
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,290 +0,0 @@
|
|||||||
/*
|
|
||||||
*
|
|
||||||
* (C) 2003-2026 Anope Team
|
|
||||||
* Contact us at team@anope.org
|
|
||||||
*
|
|
||||||
* Please read COPYING and README for further details.
|
|
||||||
*
|
|
||||||
* Based on the original code of Epona by Lara.
|
|
||||||
* Based on the original code of Services by Andy Church.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef ACCOUNT_H
|
|
||||||
#define ACCOUNT_H
|
|
||||||
|
|
||||||
#include "extensible.h"
|
|
||||||
#include "serialize.h"
|
|
||||||
#include "anope.h"
|
|
||||||
#include "memo.h"
|
|
||||||
#include "base.h"
|
|
||||||
|
|
||||||
typedef Anope::hash_map<NickAlias *> nickalias_map;
|
|
||||||
typedef Anope::hash_map<NickCore *> nickcore_map;
|
|
||||||
typedef TR1NS::unordered_map<uint64_t, NickCore *> nickcoreid_map;
|
|
||||||
|
|
||||||
extern CoreExport Serialize::Checker<nickalias_map> NickAliasList;
|
|
||||||
extern CoreExport Serialize::Checker<nickcore_map> NickCoreList;
|
|
||||||
extern CoreExport nickcoreid_map NickCoreIdList;
|
|
||||||
|
|
||||||
/* A registered nickname.
|
|
||||||
* It matters that Base is here before Extensible (it is inherited by Serializable)
|
|
||||||
*/
|
|
||||||
class CoreExport NickAlias : public Serializable, public Extensible
|
|
||||||
{
|
|
||||||
Anope::string vhost_ident, vhost_host, vhost_creator;
|
|
||||||
time_t vhost_created;
|
|
||||||
|
|
||||||
public:
|
|
||||||
Anope::string nick;
|
|
||||||
Anope::string last_quit;
|
|
||||||
Anope::string last_realname;
|
|
||||||
/* Last usermask this nick was seen on, eg user@host */
|
|
||||||
Anope::string last_usermask;
|
|
||||||
/* Last uncloaked usermask, requires nickserv/auspex to see */
|
|
||||||
Anope::string last_realhost;
|
|
||||||
time_t time_registered;
|
|
||||||
time_t last_seen;
|
|
||||||
/* Account this nick is tied to. Multiple nicks can be tied to a single account. */
|
|
||||||
Serialize::Reference<NickCore> nc;
|
|
||||||
|
|
||||||
/** Constructor
|
|
||||||
* @param nickname The nick
|
|
||||||
* @param nickcore The nickcore for this nick
|
|
||||||
*/
|
|
||||||
NickAlias(const Anope::string &nickname, NickCore *nickcore);
|
|
||||||
~NickAlias();
|
|
||||||
|
|
||||||
void Serialize(Serialize::Data &data) const anope_override;
|
|
||||||
static Serializable* Unserialize(Serializable *obj, Serialize::Data &);
|
|
||||||
|
|
||||||
/** Set a vhost for the user
|
|
||||||
* @param ident The ident
|
|
||||||
* @param host The host
|
|
||||||
* @param creator Who created the vhost
|
|
||||||
* @param time When the vhost was created
|
|
||||||
*/
|
|
||||||
void SetVhost(const Anope::string &ident, const Anope::string &host, const Anope::string &creator, time_t created = Anope::CurTime);
|
|
||||||
|
|
||||||
/** Remove a users vhost
|
|
||||||
**/
|
|
||||||
void RemoveVhost();
|
|
||||||
|
|
||||||
/** Check if the user has a vhost
|
|
||||||
* @return true or false
|
|
||||||
*/
|
|
||||||
bool HasVhost() const;
|
|
||||||
|
|
||||||
/** Retrieve the vhost ident
|
|
||||||
* @return the ident
|
|
||||||
*/
|
|
||||||
const Anope::string &GetVhostIdent() const;
|
|
||||||
|
|
||||||
/** Retrieve the vhost host
|
|
||||||
* @return the host
|
|
||||||
*/
|
|
||||||
const Anope::string &GetVhostHost() const;
|
|
||||||
|
|
||||||
/** Retrieve the vhost creator
|
|
||||||
* @return the creator
|
|
||||||
*/
|
|
||||||
const Anope::string &GetVhostCreator() const;
|
|
||||||
|
|
||||||
/** Retrieve when the vhost was created
|
|
||||||
* @return the time it was created
|
|
||||||
*/
|
|
||||||
time_t GetVhostCreated() const;
|
|
||||||
|
|
||||||
/** Finds a registered nick
|
|
||||||
* @param nick The nick to lookup
|
|
||||||
* @return the nick, if found
|
|
||||||
*/
|
|
||||||
static NickAlias *Find(const Anope::string &nick);
|
|
||||||
};
|
|
||||||
|
|
||||||
/* A registered account. Each account must have a NickAlias with the same nick as the
|
|
||||||
* account's display.
|
|
||||||
* It matters that Base is here before Extensible (it is inherited by Serializable)
|
|
||||||
*/
|
|
||||||
class CoreExport NickCore : public Serializable, public Extensible
|
|
||||||
{
|
|
||||||
/* Channels which reference this core in some way (this is on their access list, akick list, is founder, successor, etc) */
|
|
||||||
Serialize::Checker<std::map<ChannelInfo *, int> > chanaccess;
|
|
||||||
/* Unique identifier for the account. */
|
|
||||||
uint64_t id;
|
|
||||||
public:
|
|
||||||
/* Name of the account. Find(display)->nc == this. */
|
|
||||||
Anope::string display;
|
|
||||||
/* User password in form of hashm:data */
|
|
||||||
Anope::string pass;
|
|
||||||
Anope::string email;
|
|
||||||
/* Locale name of the language of the user. Empty means default language */
|
|
||||||
Anope::string language;
|
|
||||||
/* Access list, contains user@host masks of users who get certain privileges based
|
|
||||||
* on if NI_SECURE is set and what (if any) kill protection is enabled. */
|
|
||||||
std::vector<Anope::string> access;
|
|
||||||
MemoInfo memos;
|
|
||||||
std::map<Anope::string, Anope::string> last_modes;
|
|
||||||
|
|
||||||
/* Nicknames registered that are grouped to this account.
|
|
||||||
* for n in aliases, n->nc == this.
|
|
||||||
*/
|
|
||||||
Serialize::Checker<std::vector<NickAlias *> > aliases;
|
|
||||||
|
|
||||||
/* Set if this user is a services operator. o->ot must exist. */
|
|
||||||
Oper *o;
|
|
||||||
|
|
||||||
/* Unsaved data */
|
|
||||||
|
|
||||||
/* Number of channels registered by this account */
|
|
||||||
uint16_t channelcount;
|
|
||||||
/* Last time an email was sent to this user */
|
|
||||||
time_t lastmail;
|
|
||||||
/* Users online now logged into this account */
|
|
||||||
std::list<User *> users;
|
|
||||||
|
|
||||||
/** Constructor
|
|
||||||
* @param display The display nick
|
|
||||||
* @param id The account id
|
|
||||||
*/
|
|
||||||
NickCore(const Anope::string &nickdisplay, uint64_t nickid = 0);
|
|
||||||
~NickCore();
|
|
||||||
|
|
||||||
void Serialize(Serialize::Data &data) const anope_override;
|
|
||||||
static Serializable* Unserialize(Serializable *obj, Serialize::Data &);
|
|
||||||
|
|
||||||
/** Changes the display for this account
|
|
||||||
* @param na The new display, must be grouped to this account.
|
|
||||||
*/
|
|
||||||
void SetDisplay(const NickAlias *na);
|
|
||||||
|
|
||||||
/** Checks whether this account is a services oper or not.
|
|
||||||
* @return True if this account is a services oper, false otherwise.
|
|
||||||
*/
|
|
||||||
virtual bool IsServicesOper() const;
|
|
||||||
|
|
||||||
/** Add an entry to the nick's access list
|
|
||||||
*
|
|
||||||
* @param entry The nick!ident@host entry to add to the access list
|
|
||||||
*
|
|
||||||
* Adds a new entry into the access list.
|
|
||||||
*/
|
|
||||||
void AddAccess(const Anope::string &entry);
|
|
||||||
|
|
||||||
/** Get an entry from the nick's access list by index
|
|
||||||
*
|
|
||||||
* @param entry Index in the access list vector to retrieve
|
|
||||||
* @return The access list entry of the given index if within bounds, an empty string if the vector is empty or the index is out of bounds
|
|
||||||
*
|
|
||||||
* Retrieves an entry from the access list corresponding to the given index.
|
|
||||||
*/
|
|
||||||
Anope::string GetAccess(unsigned entry) const;
|
|
||||||
|
|
||||||
/** Get the number of entries on the access list for this account.
|
|
||||||
*/
|
|
||||||
unsigned GetAccessCount() const;
|
|
||||||
|
|
||||||
/** Retrieves the account id for this user */
|
|
||||||
uint64_t GetId();
|
|
||||||
|
|
||||||
/** Find an entry in the nick's access list
|
|
||||||
*
|
|
||||||
* @param entry The nick!ident@host entry to search for
|
|
||||||
* @return True if the entry is found in the access list, false otherwise
|
|
||||||
*
|
|
||||||
* Search for an entry within the access list.
|
|
||||||
*/
|
|
||||||
bool FindAccess(const Anope::string &entry);
|
|
||||||
|
|
||||||
/** Erase an entry from the nick's access list
|
|
||||||
*
|
|
||||||
* @param entry The nick!ident@host entry to remove
|
|
||||||
*
|
|
||||||
* Removes the specified access list entry from the access list.
|
|
||||||
*/
|
|
||||||
void EraseAccess(const Anope::string &entry);
|
|
||||||
|
|
||||||
/** Clears the entire nick's access list
|
|
||||||
*
|
|
||||||
* Deletes all the memory allocated in the access list vector and then clears the vector.
|
|
||||||
*/
|
|
||||||
void ClearAccess();
|
|
||||||
|
|
||||||
/** Is the given user on this accounts access list?
|
|
||||||
*
|
|
||||||
* @param u The user
|
|
||||||
*
|
|
||||||
* @return true if the user is on the access list
|
|
||||||
*/
|
|
||||||
bool IsOnAccess(const User *u) const;
|
|
||||||
|
|
||||||
/** Finds an account
|
|
||||||
* @param nick The account name to find
|
|
||||||
* @return The account, if it exists
|
|
||||||
*/
|
|
||||||
static NickCore* Find(const Anope::string &nick);
|
|
||||||
|
|
||||||
void AddChannelReference(ChannelInfo *ci);
|
|
||||||
void RemoveChannelReference(ChannelInfo *ci);
|
|
||||||
void GetChannelReferences(std::deque<ChannelInfo *> &queue);
|
|
||||||
};
|
|
||||||
|
|
||||||
/* A request to check if an account/password is valid. These can exist for
|
|
||||||
* extended periods due to the time some authentication modules take.
|
|
||||||
*/
|
|
||||||
class CoreExport IdentifyRequest
|
|
||||||
{
|
|
||||||
/* Owner of this request, used to cleanup requests if a module is unloaded
|
|
||||||
* while a request us pending */
|
|
||||||
Module *owner;
|
|
||||||
Anope::string account;
|
|
||||||
Anope::string password;
|
|
||||||
|
|
||||||
std::set<Module *> holds;
|
|
||||||
bool dispatched;
|
|
||||||
bool success;
|
|
||||||
|
|
||||||
static std::set<IdentifyRequest *> Requests;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
IdentifyRequest(Module *o, const Anope::string &acc, const Anope::string &pass);
|
|
||||||
virtual ~IdentifyRequest();
|
|
||||||
|
|
||||||
public:
|
|
||||||
/* One of these is called when the request goes through */
|
|
||||||
virtual void OnSuccess() = 0;
|
|
||||||
virtual void OnFail() = 0;
|
|
||||||
|
|
||||||
Module *GetOwner() const { return owner; }
|
|
||||||
const Anope::string &GetAccount() const { return account; }
|
|
||||||
const Anope::string &GetPassword() const { return password; }
|
|
||||||
|
|
||||||
/* Holds this request. When a request is held it must be Released later
|
|
||||||
* for the request to complete. Multiple modules may hold a request at any time,
|
|
||||||
* but the request is not complete until every module has released it. If you do not
|
|
||||||
* require holding this (eg, your password check is done in this thread and immediately)
|
|
||||||
* then you don't need to hold the request before calling `Success()`.
|
|
||||||
* @param m The module holding this request
|
|
||||||
*/
|
|
||||||
void Hold(Module *m);
|
|
||||||
|
|
||||||
/** Releases a held request
|
|
||||||
* @param m The module releasing the hold
|
|
||||||
*/
|
|
||||||
void Release(Module *m);
|
|
||||||
|
|
||||||
/** Called by modules when this IdentifyRequest has succeeded.
|
|
||||||
* If this request is behind held it must still be Released after calling this.
|
|
||||||
* @param m The module confirming authentication
|
|
||||||
*/
|
|
||||||
void Success(Module *m);
|
|
||||||
|
|
||||||
/** Used to either finalize this request or marks
|
|
||||||
* it as dispatched and begins waiting for the module(s)
|
|
||||||
* that have holds to finish.
|
|
||||||
*/
|
|
||||||
void Dispatch();
|
|
||||||
|
|
||||||
static void ModuleUnload(Module *m);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // ACCOUNT_H
|
|
||||||
-798
@@ -1,798 +0,0 @@
|
|||||||
/*
|
|
||||||
*
|
|
||||||
* (C) 2003-2026 Anope Team
|
|
||||||
* Contact us at team@anope.org
|
|
||||||
*
|
|
||||||
* Please read COPYING and README for further details.
|
|
||||||
*
|
|
||||||
* Based on the original code of Epona by Lara.
|
|
||||||
* Based on the original code of Services by Andy Church.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef ANOPE_H
|
|
||||||
#define ANOPE_H
|
|
||||||
|
|
||||||
#include <signal.h>
|
|
||||||
|
|
||||||
#include "hashcomp.h"
|
|
||||||
|
|
||||||
namespace Anope
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* A wrapper string class around all the other string classes, this class will
|
|
||||||
* allow us to only require one type of string everywhere that can be converted
|
|
||||||
* at any time to a specific type of string.
|
|
||||||
*/
|
|
||||||
class CoreExport string
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
/**
|
|
||||||
* The actual string is stored in an std::string as it can be converted to
|
|
||||||
* ci::string, or a C-style string at any time.
|
|
||||||
*/
|
|
||||||
std::string _string;
|
|
||||||
public:
|
|
||||||
/**
|
|
||||||
* Extras.
|
|
||||||
*/
|
|
||||||
typedef std::string::iterator iterator;
|
|
||||||
typedef std::string::const_iterator const_iterator;
|
|
||||||
typedef std::string::reverse_iterator reverse_iterator;
|
|
||||||
typedef std::string::const_reverse_iterator const_reverse_iterator;
|
|
||||||
typedef std::string::size_type size_type;
|
|
||||||
static const size_type npos = static_cast<size_type>(-1);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructors that can take in any type of string.
|
|
||||||
*/
|
|
||||||
string() : _string("") { }
|
|
||||||
string(char chr) : _string() { _string = chr; }
|
|
||||||
string(size_type n, char chr) : _string(n, chr) { }
|
|
||||||
string(const char *_str) : _string(_str) { }
|
|
||||||
string(const char *_str, size_type n) : _string(_str, n) { }
|
|
||||||
string(const std::string &_str) : _string(_str) { }
|
|
||||||
string(const ci::string &_str) : _string(_str.c_str()) { }
|
|
||||||
string(const string &_str, size_type pos, size_type n = npos) : _string(_str._string, pos, n) { }
|
|
||||||
template <class InputIterator> string(InputIterator first, InputIterator last) : _string(first, last) { }
|
|
||||||
#if __cplusplus >= 201103L
|
|
||||||
string(const string &) = default;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Assignment operators, so any type of string can be assigned to this class.
|
|
||||||
*/
|
|
||||||
inline string &operator=(char chr) { this->_string = chr; return *this; }
|
|
||||||
inline string &operator=(const char *_str) { this->_string = _str; return *this; }
|
|
||||||
inline string &operator=(const std::string &_str) { this->_string = _str; return *this; }
|
|
||||||
inline string &operator=(const string &_str) { if (this != &_str) this->_string = _str._string; return *this; }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Equality operators, to compare to any type of string.
|
|
||||||
*/
|
|
||||||
inline bool operator==(const char *_str) const { return this->_string == _str; }
|
|
||||||
inline bool operator==(const std::string &_str) const { return this->_string == _str; }
|
|
||||||
inline bool operator==(const string &_str) const { return this->_string == _str._string; }
|
|
||||||
|
|
||||||
inline bool equals_cs(const char *_str) const { return this->_string == _str; }
|
|
||||||
inline bool equals_cs(const std::string &_str) const { return this->_string == _str; }
|
|
||||||
inline bool equals_cs(const string &_str) const { return this->_string == _str._string; }
|
|
||||||
|
|
||||||
inline bool equals_ci(const char *_str) const { return ci::string(this->_string.c_str()) == _str; }
|
|
||||||
inline bool equals_ci(const std::string &_str) const { return ci::string(this->_string.c_str()) == _str.c_str(); }
|
|
||||||
inline bool equals_ci(const string &_str) const { return ci::string(this->_string.c_str()) == _str._string.c_str(); }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Inequality operators, exact opposites of the above.
|
|
||||||
*/
|
|
||||||
inline bool operator!=(const char *_str) const { return !operator==(_str); }
|
|
||||||
inline bool operator!=(const std::string &_str) const { return !operator==(_str); }
|
|
||||||
inline bool operator!=(const string &_str) const { return !operator==(_str); }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Compound addition operators, overloaded to do concatenation.
|
|
||||||
*/
|
|
||||||
inline string &operator+=(char chr) { this->_string += chr; return *this; }
|
|
||||||
inline string &operator+=(const char *_str) { this->_string += _str; return *this; }
|
|
||||||
inline string &operator+=(const std::string &_str) { this->_string += _str; return *this; }
|
|
||||||
inline string &operator+=(const string &_str) { if (this != &_str) this->_string += _str._string; return *this; }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Addition operators, overloaded to do concatenation.
|
|
||||||
*/
|
|
||||||
inline const string operator+(char chr) const { return string(*this) += chr; }
|
|
||||||
inline const string operator+(const char *_str) const { return string(*this) += _str; }
|
|
||||||
inline const string operator+(const std::string &_str) const { return string(*this) += _str; }
|
|
||||||
inline const string operator+(const string &_str) const { return string(*this) += _str; }
|
|
||||||
|
|
||||||
friend const string operator+(char chr, const string &str);
|
|
||||||
friend const string operator+(const char *_str, const string &str);
|
|
||||||
friend const string operator+(const std::string &_str, const string &str);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Less-than operator.
|
|
||||||
*/
|
|
||||||
inline bool operator<(const string &_str) const { return this->_string < _str._string; }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The following functions return the various types of strings.
|
|
||||||
*/
|
|
||||||
inline const char *c_str() const { return this->_string.c_str(); }
|
|
||||||
inline const char *data() const { return this->_string.data(); }
|
|
||||||
inline std::string &str() { return this->_string; }
|
|
||||||
inline const std::string &str() const { return this->_string; }
|
|
||||||
inline ci::string ci_str() const { return ci::string(this->_string.c_str()); }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns if the string is empty or not.
|
|
||||||
*/
|
|
||||||
inline bool empty() const { return this->_string.empty(); }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the string's length.
|
|
||||||
*/
|
|
||||||
inline size_type length() const { return this->_string.length(); }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the size of the currently allocated storage space in the string object.
|
|
||||||
* This can be equal or greater than the length of the string.
|
|
||||||
*/
|
|
||||||
inline size_type capacity() const { return this->_string.capacity(); }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add a char to the end of the string.
|
|
||||||
*/
|
|
||||||
inline void push_back(char c) { return this->_string.push_back(c); }
|
|
||||||
|
|
||||||
inline string& append(const string &s) { this->_string.append(s.str()); return *this; }
|
|
||||||
inline string& append(const char *s, size_t n) { this->_string.append(s, n); return *this; }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Resizes the string content to n characters.
|
|
||||||
*/
|
|
||||||
inline void resize(size_type n) { return this->_string.resize(n); }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Erases characters from the string.
|
|
||||||
*/
|
|
||||||
inline iterator erase(const iterator &i) { return this->_string.erase(i); }
|
|
||||||
inline iterator erase(const iterator &first, const iterator &last) { return this->_string.erase(first, last); }
|
|
||||||
inline void erase(size_type pos = 0, size_type n = std::string::npos) { this->_string.erase(pos, n); }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Trim leading and trailing white spaces from the string.
|
|
||||||
*/
|
|
||||||
|
|
||||||
inline string& ltrim(const Anope::string &what = " \t\r\n")
|
|
||||||
{
|
|
||||||
while (!this->_string.empty() && what.find(this->_string[0]) != Anope::string::npos)
|
|
||||||
this->_string.erase(this->_string.begin());
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline string& rtrim(const Anope::string &what = " \t\r\n")
|
|
||||||
{
|
|
||||||
while (!this->_string.empty() && what.find(this->_string[this->_string.length() - 1]) != Anope::string::npos)
|
|
||||||
this->_string.erase(this->_string.length() - 1);
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline string& trim(const Anope::string &what = " \t\r\n")
|
|
||||||
{
|
|
||||||
this->ltrim(what);
|
|
||||||
this->rtrim(what);
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Clears the string.
|
|
||||||
*/
|
|
||||||
inline void clear() { this->_string.clear(); }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Find substrings of the string.
|
|
||||||
*/
|
|
||||||
inline size_type find(const string &_str, size_type pos = 0) const { return this->_string.find(_str._string, pos); }
|
|
||||||
inline size_type find(char chr, size_type pos = 0) const { return this->_string.find(chr, pos); }
|
|
||||||
inline size_type find_ci(const string &_str, size_type pos = 0) const { return ci::string(this->_string.c_str()).find(ci::string(_str._string.c_str()), pos); }
|
|
||||||
inline size_type find_ci(char chr, size_type pos = 0) const { return ci::string(this->_string.c_str()).find(chr, pos); }
|
|
||||||
|
|
||||||
inline size_type rfind(const string &_str, size_type pos = npos) const { return this->_string.rfind(_str._string, pos); }
|
|
||||||
inline size_type rfind(char chr, size_type pos = npos) const { return this->_string.rfind(chr, pos); }
|
|
||||||
inline size_type rfind_ci(const string &_str, size_type pos = npos) const { return ci::string(this->_string.c_str()).rfind(ci::string(_str._string.c_str()), pos); }
|
|
||||||
inline size_type rfind_ci(char chr, size_type pos = npos) const { return ci::string(this->_string.c_str()).rfind(chr, pos); }
|
|
||||||
|
|
||||||
inline size_type find_first_of(const string &_str, size_type pos = 0) const { return this->_string.find_first_of(_str._string, pos); }
|
|
||||||
inline size_type find_first_of_ci(const string &_str, size_type pos = 0) const { return ci::string(this->_string.c_str()).find_first_of(ci::string(_str._string.c_str()), pos); }
|
|
||||||
|
|
||||||
inline size_type find_first_not_of(const string &_str, size_type pos = 0) const { return this->_string.find_first_not_of(_str._string, pos); }
|
|
||||||
inline size_type find_first_not_of_ci(const string &_str, size_type pos = 0) const { return ci::string(this->_string.c_str()).find_first_not_of(ci::string(_str._string.c_str()), pos); }
|
|
||||||
|
|
||||||
inline size_type find_last_of(const string &_str, size_type pos = npos) const { return this->_string.find_last_of(_str._string, pos); }
|
|
||||||
inline size_type find_last_of_ci(const string &_str, size_type pos = npos) const { return ci::string(this->_string.c_str()).find_last_of(ci::string(_str._string.c_str()), pos); }
|
|
||||||
|
|
||||||
inline size_type find_last_not_of(const string &_str, size_type pos = npos) const { return this->_string.find_last_not_of(_str._string, pos); }
|
|
||||||
inline size_type find_last_not_of_ci(const string &_str, size_type pos = npos) const { return ci::string(this->_string.c_str()).find_last_not_of(ci::string(_str._string.c_str()), pos); }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Determine if string consists of only numbers.
|
|
||||||
*/
|
|
||||||
inline bool is_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; }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Replace parts of the string.
|
|
||||||
*/
|
|
||||||
inline string replace(size_type pos, size_type n, const string &_str) { return string(this->_string.replace(pos, n, _str._string)); }
|
|
||||||
inline string replace(size_type pos, size_type n, const string &_str, size_type pos1, size_type n1) { return string(this->_string.replace(pos, n, _str._string, pos1, n1)); }
|
|
||||||
inline string replace(size_type pos, size_type n, size_type n1, char chr) { return string(this->_string.replace(pos, n, n1, chr)); }
|
|
||||||
inline string replace(iterator first, iterator last, const string &_str) { return string(this->_string.replace(first, last, _str._string)); }
|
|
||||||
inline string replace(iterator first, iterator last, size_type n, char chr) { return string(this->_string.replace(first, last, n, chr)); }
|
|
||||||
template <class InputIterator> inline string replace(iterator first, iterator last, InputIterator f, InputIterator l) { return string(this->_string.replace(first, last, f, l)); }
|
|
||||||
inline string replace_all_cs(const string &_orig, const string &_repl) const
|
|
||||||
{
|
|
||||||
Anope::string new_string = *this;
|
|
||||||
size_type pos = new_string.find(_orig), orig_length = _orig.length(), repl_length = _repl.length();
|
|
||||||
while (pos != npos)
|
|
||||||
{
|
|
||||||
new_string = new_string.substr(0, pos) + _repl + new_string.substr(pos + orig_length);
|
|
||||||
pos = new_string.find(_orig, pos + repl_length);
|
|
||||||
}
|
|
||||||
return new_string;
|
|
||||||
}
|
|
||||||
inline string replace_all_ci(const string &_orig, const string &_repl) const
|
|
||||||
{
|
|
||||||
Anope::string new_string = *this;
|
|
||||||
size_type pos = new_string.find_ci(_orig), orig_length = _orig.length(), repl_length = _repl.length();
|
|
||||||
while (pos != npos)
|
|
||||||
{
|
|
||||||
new_string = new_string.substr(0, pos) + _repl + new_string.substr(pos + orig_length);
|
|
||||||
pos = new_string.find_ci(_orig, pos + repl_length);
|
|
||||||
}
|
|
||||||
return new_string;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the string in lowercase.
|
|
||||||
*/
|
|
||||||
inline string lower() const
|
|
||||||
{
|
|
||||||
Anope::string new_string = *this;
|
|
||||||
for (size_type i = 0; i < new_string.length(); ++i)
|
|
||||||
new_string[i] = Anope::tolower(new_string[i]);
|
|
||||||
return new_string;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the string in uppercase.
|
|
||||||
*/
|
|
||||||
inline string upper() const
|
|
||||||
{
|
|
||||||
Anope::string new_string = *this;
|
|
||||||
for (size_type i = 0; i < new_string.length(); ++i)
|
|
||||||
new_string[i] = Anope::toupper(new_string[i]);
|
|
||||||
return new_string;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get a substring of the string.
|
|
||||||
*/
|
|
||||||
inline string substr(size_type pos = 0, size_type n = npos) const { return string(this->_string.substr(pos, n)); }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Iterators to the string.
|
|
||||||
*/
|
|
||||||
inline iterator begin() { return this->_string.begin(); }
|
|
||||||
inline const_iterator begin() const { return this->_string.begin(); }
|
|
||||||
inline iterator end() { return this->_string.end(); }
|
|
||||||
inline const_iterator end() const { return this->_string.end(); }
|
|
||||||
inline reverse_iterator rbegin() { return this->_string.rbegin(); }
|
|
||||||
inline const_reverse_iterator rbegin() const { return this->_string.rbegin(); }
|
|
||||||
inline reverse_iterator rend() { return this->_string.rend(); }
|
|
||||||
inline const_reverse_iterator rend() const { return this->_string.rend(); }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Subscript operator, to access individual characters of the string.
|
|
||||||
*/
|
|
||||||
inline char &operator[](size_type n) { return this->_string[n]; }
|
|
||||||
inline const char &operator[](size_type n) const { return this->_string[n]; }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Stream insertion operator, must be friend because they cannot be inside the class.
|
|
||||||
*/
|
|
||||||
friend std::ostream &operator<<(std::ostream &os, const string &_str);
|
|
||||||
friend std::istream &operator>>(std::istream &is, string &_str);
|
|
||||||
};
|
|
||||||
|
|
||||||
inline std::ostream &operator<<(std::ostream &os, const string &_str) { return os << _str._string; }
|
|
||||||
/* This is not standard to make operator>> behave like operator<< in that it will allow extracting a whole line, not just one word */
|
|
||||||
inline std::istream &operator>>(std::istream &is, string &_str) { return std::getline(is, _str._string); }
|
|
||||||
|
|
||||||
inline const string operator+(char chr, const string &str) { string tmp(chr); tmp += str; return tmp; }
|
|
||||||
inline const string operator+(const char *_str, const string &str) { string tmp(_str); tmp += str; return tmp; }
|
|
||||||
inline const string operator+(const std::string &_str, const string &str) { string tmp(_str); tmp += str; return tmp; }
|
|
||||||
|
|
||||||
struct hash_ci
|
|
||||||
{
|
|
||||||
inline size_t operator()(const string &s) const
|
|
||||||
{
|
|
||||||
return TR1NS::hash<std::string>()(s.lower().str());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
struct hash_cs
|
|
||||||
{
|
|
||||||
inline size_t operator()(const string &s) const
|
|
||||||
{
|
|
||||||
return TR1NS::hash<std::string>()(s.str());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
struct compare
|
|
||||||
{
|
|
||||||
inline bool operator()(const string &s1, const string &s2) const
|
|
||||||
{
|
|
||||||
return s1.equals_ci(s2);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template<typename T> class map : public std::map<string, T, ci::less> { };
|
|
||||||
template<typename T> class multimap : public std::multimap<string, T, ci::less> { };
|
|
||||||
template<typename T> class hash_map : public TR1NS::unordered_map<string, T, hash_ci, compare> { };
|
|
||||||
|
|
||||||
#ifndef REPRODUCIBLE_BUILD
|
|
||||||
static const char *const compiled = __TIME__ " " __DATE__;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** The time Anope started.
|
|
||||||
*/
|
|
||||||
extern CoreExport time_t StartTime;
|
|
||||||
|
|
||||||
/** The value to return from main()
|
|
||||||
*/
|
|
||||||
extern int ReturnValue;
|
|
||||||
|
|
||||||
extern sig_atomic_t Signal;
|
|
||||||
extern CoreExport bool Quitting;
|
|
||||||
extern CoreExport bool Restarting;
|
|
||||||
extern CoreExport Anope::string QuitReason;
|
|
||||||
|
|
||||||
/** The current system time, which is pretty close to being accurate.
|
|
||||||
* Use this unless you need very specific time checks
|
|
||||||
*/
|
|
||||||
extern CoreExport time_t CurTime;
|
|
||||||
|
|
||||||
/** The debug level we are running at.
|
|
||||||
*/
|
|
||||||
extern CoreExport int Debug;
|
|
||||||
|
|
||||||
/** Other command line options.
|
|
||||||
*/
|
|
||||||
extern CoreExport bool ReadOnly, NoFork, NoThird, NoExpire, ProtocolDebug;
|
|
||||||
|
|
||||||
/** The root of the services installation. Usually ~/services
|
|
||||||
*/
|
|
||||||
extern CoreExport Anope::string ServicesDir;
|
|
||||||
|
|
||||||
/** Services binary name (eg services)
|
|
||||||
*/
|
|
||||||
extern CoreExport Anope::string ServicesBin;
|
|
||||||
|
|
||||||
/** Various directory paths. These can be set at runtime by command line args
|
|
||||||
*/
|
|
||||||
extern CoreExport Anope::string ConfigDir;
|
|
||||||
extern CoreExport Anope::string DataDir;
|
|
||||||
extern CoreExport Anope::string ModuleDir;
|
|
||||||
extern CoreExport Anope::string LocaleDir;
|
|
||||||
extern CoreExport Anope::string LogDir;
|
|
||||||
|
|
||||||
/** The uplink we are currently connected to
|
|
||||||
*/
|
|
||||||
extern CoreExport int CurrentUplink;
|
|
||||||
|
|
||||||
/** Various methods to determine the Anope version running
|
|
||||||
*/
|
|
||||||
extern CoreExport string Version();
|
|
||||||
extern CoreExport string VersionShort();
|
|
||||||
extern CoreExport string VersionBuildString();
|
|
||||||
extern CoreExport int VersionMajor();
|
|
||||||
extern CoreExport int VersionMinor();
|
|
||||||
extern CoreExport int VersionPatch();
|
|
||||||
|
|
||||||
/** Determines if we are still attached to the terminal, and can print
|
|
||||||
* messages to the user via stderr/stdout.
|
|
||||||
* @return true if still attached
|
|
||||||
*/
|
|
||||||
extern bool AtTerm();
|
|
||||||
|
|
||||||
/** Used to "fork" the process and go into the background during initial startup
|
|
||||||
* while we are AtTerm(). The actual fork is not done here, but earlier, and this
|
|
||||||
* simply notifies the parent via kill() to exit().
|
|
||||||
*/
|
|
||||||
extern void Fork();
|
|
||||||
|
|
||||||
/** Does something with the signal in Anope::Signal
|
|
||||||
*/
|
|
||||||
extern void HandleSignal();
|
|
||||||
|
|
||||||
/** One of the first functions called, does general initialization such as reading
|
|
||||||
* command line args, loading the configuration, doing the initial fork() if necessary,
|
|
||||||
* initializing language support, loading modules, and loading databases.
|
|
||||||
* @throws CoreException if something bad went wrong
|
|
||||||
*/
|
|
||||||
extern void Init(int ac, char **av);
|
|
||||||
|
|
||||||
/** Calls the save database event
|
|
||||||
*/
|
|
||||||
extern CoreExport void SaveDatabases();
|
|
||||||
|
|
||||||
/** Check whether two strings match.
|
|
||||||
* @param str The string to check against the pattern (e.g. foobar)
|
|
||||||
* @param mask The pattern to check (e.g. foo*bar)
|
|
||||||
* @param case_sensitive Whether or not the match is case sensitive, default false.
|
|
||||||
* @param use_regex Whether or not to try regex. case_sensitive is not used in regex.
|
|
||||||
*/
|
|
||||||
extern CoreExport bool Match(const string &str, const string &mask, bool case_sensitive = false, bool use_regex = false);
|
|
||||||
|
|
||||||
/** Converts a string to hex
|
|
||||||
* @param the data to be converted
|
|
||||||
* @return a anope::string containing the hex value
|
|
||||||
*/
|
|
||||||
extern CoreExport string Hex(const string &data);
|
|
||||||
extern CoreExport string Hex(const char *data, unsigned len);
|
|
||||||
|
|
||||||
/** Converts a string from hex
|
|
||||||
* @param src The data to be converted
|
|
||||||
* @param dest The destination string
|
|
||||||
*/
|
|
||||||
extern CoreExport void Unhex(const string &src, string &dest);
|
|
||||||
extern CoreExport void Unhex(const string &src, char *dest, size_t sz);
|
|
||||||
|
|
||||||
/** Base 64 encode a string
|
|
||||||
* @param src The string to encode
|
|
||||||
* @param target Where the encoded string is placed
|
|
||||||
*/
|
|
||||||
extern CoreExport void B64Encode(const string &src, string &target);
|
|
||||||
|
|
||||||
/** Base 64 decode a string
|
|
||||||
* @param src The base64 encoded string
|
|
||||||
* @param target The plain text result
|
|
||||||
*/
|
|
||||||
extern CoreExport void B64Decode(const string &src, string &target);
|
|
||||||
|
|
||||||
/** Encrypts what is in 'src' to 'dest'
|
|
||||||
* @param src The source string to encrypt
|
|
||||||
* @param dest The destination where the encrypted string is placed
|
|
||||||
*/
|
|
||||||
extern CoreExport void Encrypt(const Anope::string &src, Anope::string &dest);
|
|
||||||
|
|
||||||
/** Decrypts what is in 'src' to 'dest'.
|
|
||||||
* @param src The source string to decrypt
|
|
||||||
* @param dest The destination where the decrypted string is placed
|
|
||||||
* @return true if decryption was successful. This is usually not the case
|
|
||||||
* as most encryption methods we use are one way.
|
|
||||||
*/
|
|
||||||
extern CoreExport bool Decrypt(const Anope::string &src, Anope::string &dest);
|
|
||||||
|
|
||||||
/** Hashes a buffer with SipHash-2-4
|
|
||||||
* @param src The start of the buffer to hash
|
|
||||||
* @param src_sz The total number of bytes in the buffer
|
|
||||||
* @param key A 16 byte key to hash the buffer with.
|
|
||||||
*/
|
|
||||||
extern CoreExport uint64_t SipHash24(const void *src, unsigned long src_sz, const char key[16]);
|
|
||||||
|
|
||||||
/** Returns a sequence of data formatted as the format argument specifies.
|
|
||||||
** After the format parameter, the function expects at least as many
|
|
||||||
** additional arguments as specified in format.
|
|
||||||
* @param fmt Format of the Message
|
|
||||||
* @param ... any number of parameters
|
|
||||||
* @return a Anope::string
|
|
||||||
*/
|
|
||||||
extern CoreExport string printf(const char *fmt, ...);
|
|
||||||
|
|
||||||
/** Return the last error code
|
|
||||||
* @return The error code
|
|
||||||
*/
|
|
||||||
extern CoreExport int LastErrorCode();
|
|
||||||
|
|
||||||
/** Return the last error, uses errno/GetLastError() to determine this
|
|
||||||
* @return An error message
|
|
||||||
*/
|
|
||||||
extern CoreExport const string LastError();
|
|
||||||
|
|
||||||
/** Determines if a path is a file
|
|
||||||
*/
|
|
||||||
extern CoreExport bool IsFile(const Anope::string &file);
|
|
||||||
|
|
||||||
/** Converts a string into seconds
|
|
||||||
* @param s The string, eg 3d
|
|
||||||
* @return The time represented by the string, eg 259,200
|
|
||||||
*/
|
|
||||||
extern CoreExport time_t DoTime(const Anope::string &s);
|
|
||||||
|
|
||||||
/** Retrieves a human readable string representing the time in seconds
|
|
||||||
* @param seconds The time on seconds, eg 60
|
|
||||||
* @param nc The account to use language settings for to translate this string, if applicable
|
|
||||||
* @return A human readable string, eg "1 minute"
|
|
||||||
*/
|
|
||||||
extern CoreExport Anope::string Duration(time_t seconds, const NickCore *nc = NULL);
|
|
||||||
|
|
||||||
/** Generates a human readable string of type "expires in ..."
|
|
||||||
* @param expires time in seconds
|
|
||||||
* @param nc The account to use language settings for to translate this string, if applicable
|
|
||||||
* @return A human readable string, eg "expires in 5 days"
|
|
||||||
*/
|
|
||||||
extern CoreExport Anope::string Expires(time_t seconds, const NickCore *nc = NULL);
|
|
||||||
|
|
||||||
/** Converts a time in seconds (epoch) to a human readable format.
|
|
||||||
* @param t The time
|
|
||||||
* @param nc The account to use language settings for to translate this string, if applicable
|
|
||||||
* @param short_output If true, the output is just a date (eg, "Apr 12 20:18:22 2009 MSD"), else it includes the date and how long ago/from now that date is, (eg "Apr 12 20:18:22 2009 MSD (1313 days, 9 hours, 32 minutes ago)"
|
|
||||||
*/
|
|
||||||
extern CoreExport Anope::string strftime(time_t t, const NickCore *nc = NULL, bool short_output = false);
|
|
||||||
|
|
||||||
/** Normalize buffer, stripping control characters and colors
|
|
||||||
* @param A string to be parsed for control and color codes
|
|
||||||
* @return A string stripped of control and color codes
|
|
||||||
*/
|
|
||||||
extern CoreExport Anope::string NormalizeBuffer(const Anope::string &);
|
|
||||||
|
|
||||||
/** Main processing routine. Parses the message and takes the appropriate action.
|
|
||||||
* @param Raw message from the uplink
|
|
||||||
*/
|
|
||||||
extern void Process(const Anope::string &);
|
|
||||||
|
|
||||||
/** Does a blocking dns query and returns the first IP.
|
|
||||||
* @param host host to look up
|
|
||||||
* @param type inet addr type
|
|
||||||
* @return the IP if it was found, else the host
|
|
||||||
*/
|
|
||||||
extern Anope::string Resolve(const Anope::string &host, int type);
|
|
||||||
|
|
||||||
/** Does a blocking dns query and returns all IPs.
|
|
||||||
* @param host host to look up
|
|
||||||
* @param type inet addr type
|
|
||||||
* @return A list of all IPs that the host resolves to
|
|
||||||
*/
|
|
||||||
extern std::vector<Anope::string> ResolveMultiple(const Anope::string &host, int type);
|
|
||||||
|
|
||||||
/** Generate a string of random letters and numbers
|
|
||||||
* @param len The length of the string returned
|
|
||||||
*/
|
|
||||||
extern CoreExport Anope::string Random(size_t len);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** sepstream allows for splitting token separated lists.
|
|
||||||
* Each successive call to sepstream::GetToken() returns
|
|
||||||
* the next token, until none remain, at which point the method returns
|
|
||||||
* an empty string.
|
|
||||||
*/
|
|
||||||
class CoreExport sepstream
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
/** Original string.
|
|
||||||
*/
|
|
||||||
Anope::string tokens;
|
|
||||||
/** Separator value
|
|
||||||
*/
|
|
||||||
char sep;
|
|
||||||
/** Current string position
|
|
||||||
*/
|
|
||||||
size_t pos;
|
|
||||||
/** If set then GetToken() can return an empty string
|
|
||||||
*/
|
|
||||||
bool allow_empty;
|
|
||||||
public:
|
|
||||||
/** Create a sepstream and fill it with the provided data
|
|
||||||
*/
|
|
||||||
sepstream(const Anope::string &source, char separator, bool allowempty = false);
|
|
||||||
|
|
||||||
/** Fetch the next token from the stream
|
|
||||||
* @param token The next token from the stream is placed here
|
|
||||||
* @return True if tokens still remain, false if there are none left
|
|
||||||
*/
|
|
||||||
bool GetToken(Anope::string &token);
|
|
||||||
|
|
||||||
/** Gets token number 'num' from the stream
|
|
||||||
* @param token The token is placed here
|
|
||||||
* @param num The token number to fetch
|
|
||||||
* @return True if the token was able to be fetched
|
|
||||||
*/
|
|
||||||
bool GetToken(Anope::string &token, int num);
|
|
||||||
|
|
||||||
/** Gets every token from this stream
|
|
||||||
* @param token Tokens are pushed back here
|
|
||||||
*/
|
|
||||||
template<typename T> void GetTokens(T& token)
|
|
||||||
{
|
|
||||||
token.clear();
|
|
||||||
Anope::string t;
|
|
||||||
while (this->GetToken(t))
|
|
||||||
token.push_back(t);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Gets token number 'num' from the stream and all remaining tokens.
|
|
||||||
* @param token The token is placed here
|
|
||||||
* @param num The token number to fetch
|
|
||||||
* @return True if the token was able to be fetched
|
|
||||||
*/
|
|
||||||
bool GetTokenRemainder(Anope::string &token, int num);
|
|
||||||
|
|
||||||
/** Determines the number of tokens in this stream.
|
|
||||||
* @return The number of tokens in this stream
|
|
||||||
*/
|
|
||||||
int NumTokens();
|
|
||||||
|
|
||||||
/** Fetch the entire remaining stream, without tokenizing
|
|
||||||
* @return The remaining part of the stream
|
|
||||||
*/
|
|
||||||
const Anope::string GetRemaining();
|
|
||||||
|
|
||||||
/** Returns true if the end of the stream has been reached
|
|
||||||
* @return True if the end of the stream has been reached, otherwise false
|
|
||||||
*/
|
|
||||||
bool StreamEnd();
|
|
||||||
};
|
|
||||||
|
|
||||||
/** A derived form of sepstream, which separates on commas
|
|
||||||
*/
|
|
||||||
class commasepstream : public sepstream
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
/** Initialize with comma separator
|
|
||||||
*/
|
|
||||||
commasepstream(const Anope::string &source, bool allowempty = false) : sepstream(source, ',', allowempty) { }
|
|
||||||
};
|
|
||||||
|
|
||||||
/** A derived form of sepstream, which separates on spaces
|
|
||||||
*/
|
|
||||||
class spacesepstream : public sepstream
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
/** Initialize with space separator
|
|
||||||
*/
|
|
||||||
spacesepstream(const Anope::string &source) : sepstream(source, ' ') { }
|
|
||||||
};
|
|
||||||
|
|
||||||
/** This class can be used on its own to represent an exception, or derived to represent a module-specific exception.
|
|
||||||
* When a module whishes to abort, e.g. within a constructor, it should throw an exception using ModuleException or
|
|
||||||
* a class derived from ModuleException. If a module throws an exception during its constructor, the module will not
|
|
||||||
* be loaded. If this happens, the error message returned by ModuleException::GetReason will be displayed to the user
|
|
||||||
* attempting to load the module, or dumped to the console if the ircd is currently loading for the first time.
|
|
||||||
*/
|
|
||||||
class CoreException : public std::exception
|
|
||||||
{
|
|
||||||
protected:
|
|
||||||
/** Holds the error message to be displayed
|
|
||||||
*/
|
|
||||||
Anope::string err;
|
|
||||||
/** Source of the exception
|
|
||||||
*/
|
|
||||||
Anope::string source;
|
|
||||||
public:
|
|
||||||
/** Default constructor, just uses the error message 'Core threw an exception'.
|
|
||||||
*/
|
|
||||||
CoreException() : err("Core threw an exception"), source("The core") { }
|
|
||||||
/** This constructor can be used to specify an error message before throwing.
|
|
||||||
*/
|
|
||||||
CoreException(const Anope::string &message) : err(message), source("The core") { }
|
|
||||||
/** This constructor can be used to specify an error message before throwing,
|
|
||||||
* and to specify the source of the exception.
|
|
||||||
*/
|
|
||||||
CoreException(const Anope::string &message, const Anope::string &src) : err(message), source(src) { }
|
|
||||||
/** This destructor solves world hunger, cancels the world debt, and causes the world to end.
|
|
||||||
* Actually no, it does nothing. Never mind.
|
|
||||||
* @throws Nothing!
|
|
||||||
*/
|
|
||||||
virtual ~CoreException() throw() { }
|
|
||||||
/** Returns the reason for the exception.
|
|
||||||
* The module should probably put something informative here as the user will see this upon failure.
|
|
||||||
*/
|
|
||||||
virtual const Anope::string &GetReason() const
|
|
||||||
{
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual const Anope::string &GetSource() const
|
|
||||||
{
|
|
||||||
return source;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class ModuleException : public CoreException
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
/** Default constructor, just uses the error message 'Module threw an exception'.
|
|
||||||
*/
|
|
||||||
ModuleException() : CoreException("Module threw an exception", "A Module") { }
|
|
||||||
|
|
||||||
/** This constructor can be used to specify an error message before throwing.
|
|
||||||
*/
|
|
||||||
ModuleException(const Anope::string &message) : CoreException(message, "A Module") { }
|
|
||||||
/** This destructor solves world hunger, cancels the world debt, and causes the world to end.
|
|
||||||
* Actually no, it does nothing. Never mind.
|
|
||||||
* @throws Nothing!
|
|
||||||
*/
|
|
||||||
virtual ~ModuleException() throw() { }
|
|
||||||
};
|
|
||||||
|
|
||||||
class ConvertException : public CoreException
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
ConvertException(const Anope::string &reason = "") : CoreException(reason) { }
|
|
||||||
|
|
||||||
virtual ~ConvertException() throw() { }
|
|
||||||
};
|
|
||||||
|
|
||||||
/** Convert something to a string
|
|
||||||
*/
|
|
||||||
template<typename T> inline Anope::string stringify(const T &x)
|
|
||||||
{
|
|
||||||
std::ostringstream stream;
|
|
||||||
|
|
||||||
if (!(stream << x))
|
|
||||||
throw ConvertException("Stringify fail");
|
|
||||||
|
|
||||||
return stream.str();
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T> inline void convert(const Anope::string &s, T &x, Anope::string &leftover, bool failIfLeftoverChars = true)
|
|
||||||
{
|
|
||||||
leftover.clear();
|
|
||||||
std::istringstream i(s.str());
|
|
||||||
char c;
|
|
||||||
if (!(i >> x))
|
|
||||||
throw ConvertException("Convert fail");
|
|
||||||
if (failIfLeftoverChars)
|
|
||||||
{
|
|
||||||
if (i.get(c))
|
|
||||||
throw ConvertException("Convert fail");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
std::string left;
|
|
||||||
getline(i, left);
|
|
||||||
leftover = left;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T> inline void convert(const Anope::string &s, T &x, bool failIfLeftoverChars = true)
|
|
||||||
{
|
|
||||||
Anope::string Unused;
|
|
||||||
convert(s, x, Unused, failIfLeftoverChars);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T> inline T convertTo(const Anope::string &s, Anope::string &leftover, bool failIfLeftoverChars = true)
|
|
||||||
{
|
|
||||||
T x;
|
|
||||||
convert(s, x, leftover, failIfLeftoverChars);
|
|
||||||
return x;
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T> inline T convertTo(const Anope::string &s, bool failIfLeftoverChars = true)
|
|
||||||
{
|
|
||||||
T x;
|
|
||||||
convert(s, x, failIfLeftoverChars);
|
|
||||||
return x;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Casts to be used instead of dynamic_cast, this uses dynamic_cast
|
|
||||||
* for debug builds and static_cast on release builds
|
|
||||||
* to speed up the program because dynamic_cast relies on RTTI.
|
|
||||||
*/
|
|
||||||
#ifdef DEBUG_BUILD
|
|
||||||
# include <typeinfo>
|
|
||||||
template<typename T, typename O> inline T anope_dynamic_static_cast(O ptr)
|
|
||||||
{
|
|
||||||
T ret = dynamic_cast<T>(ptr);
|
|
||||||
if (ptr != NULL && ret == NULL)
|
|
||||||
throw CoreException(Anope::string("anope_dynamic_static_cast<") + typeid(T).name() + ">(" + typeid(O).name() + ") fail");
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
template<typename T, typename O> inline T anope_dynamic_static_cast(O ptr)
|
|
||||||
{
|
|
||||||
return static_cast<T>(ptr);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif // ANOPE_H
|
|
||||||
-143
@@ -1,143 +0,0 @@
|
|||||||
/*
|
|
||||||
*
|
|
||||||
* (C) 2008-2011 Adam <Adam@anope.org>
|
|
||||||
* (C) 2008-2026 Anope Team <team@anope.org>
|
|
||||||
*
|
|
||||||
* Please read COPYING and README for further details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef BASE_H
|
|
||||||
#define BASE_H
|
|
||||||
|
|
||||||
#include "services.h"
|
|
||||||
|
|
||||||
/** The base class that most classes in Anope inherit from
|
|
||||||
*/
|
|
||||||
class CoreExport Base
|
|
||||||
{
|
|
||||||
/* References to this base class */
|
|
||||||
std::set<ReferenceBase *> *references;
|
|
||||||
public:
|
|
||||||
Base();
|
|
||||||
virtual ~Base();
|
|
||||||
|
|
||||||
/** Adds a reference to this object. Eg, when a Reference
|
|
||||||
* is created referring to this object this is called. It is used to
|
|
||||||
* cleanup references when this object is destructed.
|
|
||||||
*/
|
|
||||||
void AddReference(ReferenceBase *r);
|
|
||||||
|
|
||||||
void DelReference(ReferenceBase *r);
|
|
||||||
};
|
|
||||||
|
|
||||||
class ReferenceBase
|
|
||||||
{
|
|
||||||
protected:
|
|
||||||
bool invalid;
|
|
||||||
public:
|
|
||||||
ReferenceBase() : invalid(false) { }
|
|
||||||
ReferenceBase(const ReferenceBase &other) : invalid(other.invalid) { }
|
|
||||||
virtual ~ReferenceBase() { }
|
|
||||||
inline void Invalidate() { this->invalid = true; }
|
|
||||||
};
|
|
||||||
|
|
||||||
/** Used to hold pointers to objects that may be deleted. A Reference will
|
|
||||||
* no longer be valid once the object it refers is destructed.
|
|
||||||
*/
|
|
||||||
template<typename T>
|
|
||||||
class Reference : public ReferenceBase
|
|
||||||
{
|
|
||||||
protected:
|
|
||||||
T *ref;
|
|
||||||
public:
|
|
||||||
Reference() : ref(NULL)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
Reference(T *obj) : ref(obj)
|
|
||||||
{
|
|
||||||
if (ref)
|
|
||||||
ref->AddReference(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
Reference(const Reference<T> &other) : ReferenceBase(other), ref(other.ref)
|
|
||||||
{
|
|
||||||
if (operator bool())
|
|
||||||
ref->AddReference(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual ~Reference()
|
|
||||||
{
|
|
||||||
if (operator bool())
|
|
||||||
ref->DelReference(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline Reference<T>& operator=(const Reference<T> &other)
|
|
||||||
{
|
|
||||||
if (this != &other)
|
|
||||||
{
|
|
||||||
if (*this)
|
|
||||||
this->ref->DelReference(this);
|
|
||||||
|
|
||||||
this->ref = other.ref;
|
|
||||||
this->invalid = other.invalid;
|
|
||||||
|
|
||||||
if (*this)
|
|
||||||
this->ref->AddReference(this);
|
|
||||||
}
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* We explicitly call operator bool here in several places to prevent other
|
|
||||||
* operators, such operator T*, from being called instead, which will mess
|
|
||||||
* with any class inheriting from this that overloads this operator.
|
|
||||||
*/
|
|
||||||
virtual operator bool()
|
|
||||||
{
|
|
||||||
if (!this->invalid)
|
|
||||||
return this->ref != NULL;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline operator T*()
|
|
||||||
{
|
|
||||||
if (operator bool())
|
|
||||||
return this->ref;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline T* operator->()
|
|
||||||
{
|
|
||||||
if (operator bool())
|
|
||||||
return this->ref;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline T* operator*()
|
|
||||||
{
|
|
||||||
if (operator bool())
|
|
||||||
return this->ref;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Note that we can't have an operator< that returns this->ref < other.ref
|
|
||||||
* because this function is used to sort objects in containers (such as set
|
|
||||||
* or map), and if the references themselves can change if the object they
|
|
||||||
* refer to is invalidated or changed, then this screws with the order that
|
|
||||||
* the objects would be in the container without properly adjusting the
|
|
||||||
* container, resulting in weird stuff.
|
|
||||||
*
|
|
||||||
* As such, we don't allow storing references in containers that require
|
|
||||||
* operator<, because they would not be able to compare what the references
|
|
||||||
* actually referred to.
|
|
||||||
*/
|
|
||||||
|
|
||||||
inline bool operator==(const Reference<T> &other)
|
|
||||||
{
|
|
||||||
if (!this->invalid)
|
|
||||||
return this->ref == other;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // BASE_H
|
|
||||||
-135
@@ -1,135 +0,0 @@
|
|||||||
/*
|
|
||||||
*
|
|
||||||
* (C) 2008-2011 Robin Burchell <w00t@inspircd.org>
|
|
||||||
* (C) 2008-2026 Anope Team <team@anope.org>
|
|
||||||
*
|
|
||||||
* Please read COPYING and README for further details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef BOTS_H
|
|
||||||
#define BOTS_H
|
|
||||||
|
|
||||||
#include "users.h"
|
|
||||||
#include "anope.h"
|
|
||||||
#include "serialize.h"
|
|
||||||
#include "commands.h"
|
|
||||||
|
|
||||||
|
|
||||||
typedef Anope::map<BotInfo *> botinfo_map;
|
|
||||||
|
|
||||||
extern CoreExport Serialize::Checker<botinfo_map> BotListByNick, BotListByUID;
|
|
||||||
|
|
||||||
/* A service bot (NickServ, ChanServ, a BotServ bot, etc). */
|
|
||||||
class CoreExport BotInfo : public User, public Serializable
|
|
||||||
{
|
|
||||||
/* Channels this bot is assigned to */
|
|
||||||
Serialize::Checker<std::set<ChannelInfo *> > channels;
|
|
||||||
public:
|
|
||||||
time_t created;
|
|
||||||
/* Last time this bot said something (via privmsg) */
|
|
||||||
time_t lastmsg;
|
|
||||||
/* Map of actual command names -> service name/permission required */
|
|
||||||
CommandInfo::map commands;
|
|
||||||
/* Modes the bot should have as configured in service:modes */
|
|
||||||
Anope::string botmodes;
|
|
||||||
/* Channels the bot should be in as configured in service:channels */
|
|
||||||
std::vector<Anope::string> botchannels;
|
|
||||||
/* Whether or not this bot is introduced to the network */
|
|
||||||
bool introduced;
|
|
||||||
/* Bot can only be assigned by irc ops */
|
|
||||||
bool oper_only;
|
|
||||||
/* Bot is defined in the configuration file */
|
|
||||||
bool conf;
|
|
||||||
|
|
||||||
/** Create a new bot.
|
|
||||||
* @param nick The nickname to assign to the bot.
|
|
||||||
* @param user The ident to give the bot.
|
|
||||||
* @param host The hostname to give the bot.
|
|
||||||
* @param real The realname to give the bot.
|
|
||||||
* @param bmodes The modes to give the bot.
|
|
||||||
*/
|
|
||||||
BotInfo(const Anope::string &nick, const Anope::string &user = "", const Anope::string &host = "", const Anope::string &real = "", const Anope::string &bmodes = "");
|
|
||||||
|
|
||||||
/** Destroy a bot, clearing up appropriately.
|
|
||||||
*/
|
|
||||||
virtual ~BotInfo();
|
|
||||||
|
|
||||||
void Serialize(Serialize::Data &data) const;
|
|
||||||
static Serializable* Unserialize(Serializable *obj, Serialize::Data &);
|
|
||||||
|
|
||||||
void GenerateUID();
|
|
||||||
|
|
||||||
void OnKill();
|
|
||||||
|
|
||||||
/** Change the nickname for the bot.
|
|
||||||
* @param newnick The nick to change to
|
|
||||||
*/
|
|
||||||
void SetNewNick(const Anope::string &newnick);
|
|
||||||
|
|
||||||
/** Return the channels this bot is assigned to
|
|
||||||
*/
|
|
||||||
const std::set<ChannelInfo *> &GetChannels() const;
|
|
||||||
|
|
||||||
/** Assign this bot to a given channel, removing the existing assigned bot if one exists.
|
|
||||||
* @param u The user assigning the bot, or NULL
|
|
||||||
* @param ci The channel registration to assign the bot to.
|
|
||||||
*/
|
|
||||||
void Assign(User *u, ChannelInfo *ci);
|
|
||||||
|
|
||||||
/** Remove this bot from a given channel.
|
|
||||||
* @param u The user requesting the unassign, or NULL.
|
|
||||||
* @param ci The channel registration to remove the bot from.
|
|
||||||
*/
|
|
||||||
void UnAssign(User *u, ChannelInfo *ci);
|
|
||||||
|
|
||||||
/** Get the number of channels this bot is assigned to
|
|
||||||
*/
|
|
||||||
unsigned GetChannelCount() const;
|
|
||||||
|
|
||||||
/** Join this bot to a channel
|
|
||||||
* @param c The channel
|
|
||||||
* @param status The status the bot should have on the channel
|
|
||||||
*/
|
|
||||||
void Join(Channel *c, ChannelStatus *status = NULL);
|
|
||||||
|
|
||||||
/** Join this bot to a channel
|
|
||||||
* @param chname The channel name
|
|
||||||
* @param status The status the bot should have on the channel
|
|
||||||
*/
|
|
||||||
void Join(const Anope::string &chname, ChannelStatus *status = NULL);
|
|
||||||
|
|
||||||
/** Part this bot from a channel
|
|
||||||
* @param c The channel
|
|
||||||
* @param reason The reason we're parting
|
|
||||||
*/
|
|
||||||
void Part(Channel *c, const Anope::string &reason = "");
|
|
||||||
|
|
||||||
/** Called when a user messages this bot
|
|
||||||
* @param u The user
|
|
||||||
* @param message The users' message
|
|
||||||
*/
|
|
||||||
virtual void OnMessage(User *u, const Anope::string &message);
|
|
||||||
|
|
||||||
/** Link a command name to a command in services
|
|
||||||
* @param cname The command name
|
|
||||||
* @param sname The service name
|
|
||||||
* @param permission Permission required to execute the command, if any
|
|
||||||
* @return The commandinfo for the newly created command
|
|
||||||
*/
|
|
||||||
CommandInfo& SetCommand(const Anope::string &cname, const Anope::string &sname, const Anope::string &permission = "");
|
|
||||||
|
|
||||||
/** Get command info for a command
|
|
||||||
* @param cname The command name
|
|
||||||
* @return A struct containing service name and permission
|
|
||||||
*/
|
|
||||||
CommandInfo *GetCommand(const Anope::string &cname);
|
|
||||||
|
|
||||||
/** Find a bot by nick
|
|
||||||
* @param nick The nick
|
|
||||||
* @param nick_only True to only look by nick, and not by UID
|
|
||||||
* @return The bot, if it exists
|
|
||||||
*/
|
|
||||||
static BotInfo* Find(const Anope::string &nick, bool nick_only = false);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // BOTS_H
|
|
||||||
@@ -1,315 +0,0 @@
|
|||||||
/* Channel support
|
|
||||||
*
|
|
||||||
* (C) 2008-2026 Anope Team
|
|
||||||
* Contact us at team@anope.org
|
|
||||||
*
|
|
||||||
* Please read COPYING and README for further details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef CHANNELS_H
|
|
||||||
#define CHANNELS_H
|
|
||||||
|
|
||||||
#include "anope.h"
|
|
||||||
#include "extensible.h"
|
|
||||||
#include "modes.h"
|
|
||||||
#include "serialize.h"
|
|
||||||
|
|
||||||
typedef Anope::hash_map<Channel *> channel_map;
|
|
||||||
|
|
||||||
extern CoreExport channel_map ChannelList;
|
|
||||||
|
|
||||||
/* A user container, there is one of these per user per channel. */
|
|
||||||
struct ChanUserContainer : public Extensible
|
|
||||||
{
|
|
||||||
User *user;
|
|
||||||
Channel *chan;
|
|
||||||
/* Status the user has in the channel */
|
|
||||||
ChannelStatus status;
|
|
||||||
|
|
||||||
ChanUserContainer(User *u, Channel *c) : user(u), chan(c) { }
|
|
||||||
};
|
|
||||||
|
|
||||||
class CoreExport Channel : public Base, public Extensible
|
|
||||||
{
|
|
||||||
static std::vector<Channel *> deleting;
|
|
||||||
|
|
||||||
public:
|
|
||||||
typedef std::multimap<Anope::string, Anope::string> ModeList;
|
|
||||||
private:
|
|
||||||
/** A map of channel modes with their parameters set on this channel
|
|
||||||
*/
|
|
||||||
ModeList modes;
|
|
||||||
|
|
||||||
public:
|
|
||||||
/* Channel name */
|
|
||||||
Anope::string name;
|
|
||||||
/* Set if this channel is registered. ci->c == this. Contains information relevant to the registered channel */
|
|
||||||
Serialize::Reference<ChannelInfo> ci;
|
|
||||||
/* When the channel was created */
|
|
||||||
time_t creation_time;
|
|
||||||
/* If the channel has just been created in a netjoin */
|
|
||||||
bool syncing;
|
|
||||||
/* Is configured in the conf as a channel bots should be in */
|
|
||||||
bool botchannel;
|
|
||||||
|
|
||||||
/* Users in the channel */
|
|
||||||
typedef std::map<User *, ChanUserContainer *> ChanUserList;
|
|
||||||
ChanUserList users;
|
|
||||||
|
|
||||||
/* Current topic of the channel */
|
|
||||||
Anope::string topic;
|
|
||||||
/* Who set the topic */
|
|
||||||
Anope::string topic_setter;
|
|
||||||
/* The timestamp associated with the topic. Not necessarily anywhere close to Anope::CurTime.
|
|
||||||
* This is the time the topic was *originally set*. When we restore the topic we want to change the TS back
|
|
||||||
* to this, but we can only do this on certain IRCds.
|
|
||||||
*/
|
|
||||||
time_t topic_ts;
|
|
||||||
/* The actual time the topic was set, probably close to Anope::CurTime */
|
|
||||||
time_t topic_time;
|
|
||||||
|
|
||||||
time_t server_modetime; /* Time of last server MODE */
|
|
||||||
time_t chanserv_modetime; /* Time of last check_modes() */
|
|
||||||
int16_t server_modecount; /* Number of server MODEs this second */
|
|
||||||
int16_t chanserv_modecount; /* Number of check_mode()'s this sec */
|
|
||||||
int16_t bouncy_modes; /* Did we fail to set modes here? */
|
|
||||||
|
|
||||||
private:
|
|
||||||
/** Constructor
|
|
||||||
* @param name The channel name
|
|
||||||
* @param ts The time the channel was created
|
|
||||||
*/
|
|
||||||
Channel(const Anope::string &nname, time_t ts = Anope::CurTime);
|
|
||||||
|
|
||||||
public:
|
|
||||||
/** Destructor
|
|
||||||
*/
|
|
||||||
~Channel();
|
|
||||||
|
|
||||||
/** Call if we need to unset all modes and clear all user status (internally).
|
|
||||||
* Only useful if we get a SJOIN with a TS older than what we have here
|
|
||||||
*/
|
|
||||||
void Reset();
|
|
||||||
|
|
||||||
/** Restore the channel topic, set mlock (key), set stickied bans, etc
|
|
||||||
*/
|
|
||||||
void Sync();
|
|
||||||
|
|
||||||
/** Check if a channels modes are correct.
|
|
||||||
*/
|
|
||||||
void CheckModes();
|
|
||||||
|
|
||||||
/** Check if this channel should be deleted
|
|
||||||
*/
|
|
||||||
bool CheckDelete();
|
|
||||||
|
|
||||||
/** Join a user internally to the channel
|
|
||||||
* @param u The user
|
|
||||||
* @param status The status to give the user, if any
|
|
||||||
* @return The UserContainer for the user
|
|
||||||
*/
|
|
||||||
ChanUserContainer* JoinUser(User *u, const ChannelStatus *status);
|
|
||||||
|
|
||||||
/** Remove a user internally from the channel
|
|
||||||
* @param u The user
|
|
||||||
*/
|
|
||||||
void DeleteUser(User *u);
|
|
||||||
|
|
||||||
/** Check if the user is on the channel
|
|
||||||
* @param u The user
|
|
||||||
* @return A user container if found, else NULL
|
|
||||||
*/
|
|
||||||
ChanUserContainer *FindUser(User *u) const;
|
|
||||||
|
|
||||||
/** Check if a user has a status on a channel
|
|
||||||
* @param u The user
|
|
||||||
* @param cms The status mode, or NULL to represent no status
|
|
||||||
* @return true or false
|
|
||||||
*/
|
|
||||||
bool HasUserStatus(User *u, ChannelModeStatus *cms);
|
|
||||||
|
|
||||||
/** Check if a user has a status on a channel
|
|
||||||
* Use the overloaded function for ChannelModeStatus* to check for no status
|
|
||||||
* @param u The user
|
|
||||||
* @param name The mode name, eg CMODE_OP, CMODE_VOICE
|
|
||||||
* @return true or false
|
|
||||||
*/
|
|
||||||
bool HasUserStatus(User *u, const Anope::string &name);
|
|
||||||
|
|
||||||
/** See if a channel has a mode
|
|
||||||
* @param name The mode name
|
|
||||||
* @return The number of modes set
|
|
||||||
* @param param The optional mode param
|
|
||||||
*/
|
|
||||||
size_t HasMode(const Anope::string &name, const Anope::string ¶m = "");
|
|
||||||
|
|
||||||
/** Set a mode internally on a channel, this is not sent out to the IRCd
|
|
||||||
* @param setter The setter
|
|
||||||
* @param cm The mode
|
|
||||||
* @param param The param
|
|
||||||
* @param enforce_mlock true if mlocks should be enforced, false to override mlock
|
|
||||||
*/
|
|
||||||
void SetModeInternal(MessageSource &source, ChannelMode *cm, const Anope::string ¶m = "", bool enforce_mlock = true);
|
|
||||||
|
|
||||||
/** Remove a mode internally on a channel, this is not sent out to the IRCd
|
|
||||||
* @param setter The Setter
|
|
||||||
* @param cm The mode
|
|
||||||
* @param param The param
|
|
||||||
* @param enforce_mlock true if mlocks should be enforced, false to override mlock
|
|
||||||
*/
|
|
||||||
void RemoveModeInternal(MessageSource &source, ChannelMode *cm, const Anope::string ¶m = "", bool enforce_mlock = true);
|
|
||||||
|
|
||||||
/** Set a mode on a channel
|
|
||||||
* @param bi The client setting the modes
|
|
||||||
* @param cm The mode
|
|
||||||
* @param param Optional param arg for the mode
|
|
||||||
* @param enforce_mlock true if mlocks should be enforced, false to override mlock
|
|
||||||
*/
|
|
||||||
void SetMode(BotInfo *bi, ChannelMode *cm, const Anope::string ¶m = "", bool enforce_mlock = true);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set a mode on a channel
|
|
||||||
* @param bi The client setting the modes
|
|
||||||
* @param name The mode name
|
|
||||||
* @param param Optional param arg for the mode
|
|
||||||
* @param enforce_mlock true if mlocks should be enforced, false to override mlock
|
|
||||||
*/
|
|
||||||
void SetMode(BotInfo *bi, const Anope::string &name, const Anope::string ¶m = "", bool enforce_mlock = true);
|
|
||||||
|
|
||||||
/** Remove a mode from a channel
|
|
||||||
* @param bi The client setting the modes
|
|
||||||
* @param cm The mode
|
|
||||||
* @param param Optional param arg for the mode
|
|
||||||
* @param enforce_mlock true if mlocks should be enforced, false to override mlock
|
|
||||||
*/
|
|
||||||
void RemoveMode(BotInfo *bi, ChannelMode *cm, const Anope::string ¶m = "", bool enforce_mlock = true);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Remove a mode from a channel
|
|
||||||
* @param bi The client setting the modes
|
|
||||||
* @param name The mode name
|
|
||||||
* @param param Optional param arg for the mode
|
|
||||||
* @param enforce_mlock true if mlocks should be enforced, false to override mlock
|
|
||||||
*/
|
|
||||||
void RemoveMode(BotInfo *bi, const Anope::string &name, const Anope::string ¶m = "", bool enforce_mlock = true);
|
|
||||||
|
|
||||||
/** Get a modes parameter for the channel
|
|
||||||
* @param name The mode
|
|
||||||
* @param target a string to put the param into
|
|
||||||
* @return true if the parameter was fetched, false if on error (mode not set) etc.
|
|
||||||
*/
|
|
||||||
bool GetParam(const Anope::string &name, Anope::string &target) const;
|
|
||||||
|
|
||||||
/** Set a string of modes on the channel
|
|
||||||
* @param bi The client setting the modes
|
|
||||||
* @param enforce_mlock Should mlock be enforced on this mode change
|
|
||||||
* @param cmodes The modes to set
|
|
||||||
*/
|
|
||||||
void SetModes(BotInfo *bi, bool enforce_mlock, const char *cmodes, ...);
|
|
||||||
|
|
||||||
/** Set a string of modes internally on a channel
|
|
||||||
* @param source The setter
|
|
||||||
* @param mode the modes
|
|
||||||
* @param enforce_mlock true to enforce mlock
|
|
||||||
*/
|
|
||||||
void SetModesInternal(MessageSource &source, const Anope::string &mode, time_t ts = 0, bool enforce_mlock = true);
|
|
||||||
|
|
||||||
/** Does the given user match the given list? (CMODE_BAN, CMODE_EXCEPT, etc, a list mode)
|
|
||||||
* @param u The user
|
|
||||||
* @param list The mode of the list to check (eg CMODE_BAN)
|
|
||||||
* @return true if the user matches the list
|
|
||||||
*/
|
|
||||||
bool MatchesList(User *u, const Anope::string &list);
|
|
||||||
|
|
||||||
/** Kick a user from a channel internally
|
|
||||||
* @param source The sender of the kick
|
|
||||||
* @param nick The nick being kicked
|
|
||||||
* @param reason The reason for the kick
|
|
||||||
*/
|
|
||||||
void KickInternal(const MessageSource &source, const Anope::string &nick, const Anope::string &reason);
|
|
||||||
|
|
||||||
/** Kick a user from the channel
|
|
||||||
* @param bi The sender, can be NULL for the service bot for this channel
|
|
||||||
* @param u The user being kicked
|
|
||||||
* @param reason The reason for the kick
|
|
||||||
* @return true if the kick was successful, false if a module blocked the kick
|
|
||||||
*/
|
|
||||||
bool Kick(BotInfo *bi, User *u, const char *reason = NULL, ...);
|
|
||||||
|
|
||||||
/** Get all modes set on this channel, excluding status modes.
|
|
||||||
* @return a map of modes and their optional parameters.
|
|
||||||
*/
|
|
||||||
const ModeList &GetModes() const;
|
|
||||||
|
|
||||||
/** Get a list of modes on a channel
|
|
||||||
* @param name A mode name to get the list of
|
|
||||||
* @return a vector of the list mode entries
|
|
||||||
*/
|
|
||||||
std::vector<Anope::string> GetModeList(const Anope::string &name);
|
|
||||||
|
|
||||||
/** Get a string of the modes set on this channel
|
|
||||||
* @param complete Include mode parameters
|
|
||||||
* @param plus If set to false (with complete), mode parameters will not be given for modes requiring no parameters to be unset
|
|
||||||
* @return A mode string
|
|
||||||
*/
|
|
||||||
Anope::string GetModes(bool complete, bool plus);
|
|
||||||
|
|
||||||
/** Update the topic of the channel internally, and reset it if topiclock etc says to
|
|
||||||
* @param user The user setting the new topic
|
|
||||||
* @param newtopic The new topic
|
|
||||||
* @param ts The time the new topic is being set
|
|
||||||
*/
|
|
||||||
void ChangeTopicInternal(User *u, const Anope::string &user, const Anope::string &newtopic, time_t ts = Anope::CurTime);
|
|
||||||
|
|
||||||
/** Update the topic of the channel, and reset it if topiclock etc says to
|
|
||||||
* @param user The user setting the topic
|
|
||||||
* @param newtopic The new topic
|
|
||||||
* @param ts The time when the new topic is being set
|
|
||||||
*/
|
|
||||||
void ChangeTopic(const Anope::string &user, const Anope::string &newtopic, time_t ts = Anope::CurTime);
|
|
||||||
|
|
||||||
/** Set the correct modes, or remove the ones granted without permission,
|
|
||||||
* for the specified user.
|
|
||||||
* @param user The user to give/remove modes to/from
|
|
||||||
* @param give_modes if true modes may be given to the user
|
|
||||||
*/
|
|
||||||
void SetCorrectModes(User *u, bool give_modes);
|
|
||||||
|
|
||||||
/** Unbans a user from this channel.
|
|
||||||
* @param u The user to unban
|
|
||||||
* @param mode The mode to unban
|
|
||||||
* @param full Whether or not to match using the user's real host and IP
|
|
||||||
* @return whether or not a ban was removed
|
|
||||||
*/
|
|
||||||
bool Unban(User *u, const Anope::string &mode, bool full = false);
|
|
||||||
|
|
||||||
/** Check whether a user is permitted to be on this channel
|
|
||||||
* @param u The user
|
|
||||||
* @return true if they are allowed, false if they aren't and were kicked
|
|
||||||
*/
|
|
||||||
bool CheckKick(User *user);
|
|
||||||
|
|
||||||
/** Find which bot should send mode/topic/etc changes for this channel
|
|
||||||
* @return The bot
|
|
||||||
*/
|
|
||||||
BotInfo *WhoSends() const;
|
|
||||||
|
|
||||||
/** Finds a channel
|
|
||||||
* @param name The channel to find
|
|
||||||
* @return The channel, if found
|
|
||||||
*/
|
|
||||||
static Channel* Find(const Anope::string &name);
|
|
||||||
|
|
||||||
/** Finds or creates a channel
|
|
||||||
* @param name The channel name
|
|
||||||
* @param created Set to true if the channel was just created
|
|
||||||
* @param ts The time the channel was created
|
|
||||||
*/
|
|
||||||
static Channel *FindOrCreate(const Anope::string &name, bool &created, time_t ts = Anope::CurTime);
|
|
||||||
|
|
||||||
void QueueForDeletion();
|
|
||||||
|
|
||||||
static void DeleteChannels();
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // CHANNELS_H
|
|
||||||
+18
-172
@@ -1,187 +1,33 @@
|
|||||||
/* Declarations for command data.
|
/* Declarations for command data.
|
||||||
*
|
*
|
||||||
* (C) 2003-2026 Anope Team
|
* (C) 2003-2014 Anope Team
|
||||||
* Contact us at team@anope.org
|
* Contact us at team@anope.org
|
||||||
*
|
*
|
||||||
* Please read COPYING and README for further details.
|
* Please read COPYING and README for further details.
|
||||||
*
|
*
|
||||||
* Based on the original code of Epona by Lara.
|
* Based on the original code of Epona by Lara.
|
||||||
* Based on the original code of Services by Andy Church.
|
* Based on the original code of Services by Andy Church.
|
||||||
|
*
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef COMMAND_H
|
#include "modules.h"
|
||||||
#define COMMAND_H
|
|
||||||
|
|
||||||
#include "service.h"
|
/*************************************************************************/
|
||||||
#include "anope.h"
|
|
||||||
#include "channels.h"
|
|
||||||
|
|
||||||
struct CommandGroup
|
/* Routines for looking up commands. Command lists are arrays that must be
|
||||||
{
|
* terminated with a NULL name.
|
||||||
Anope::string name, description;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Used in BotInfo::commands */
|
|
||||||
struct CommandInfo
|
|
||||||
{
|
|
||||||
typedef Anope::map<CommandInfo> map;
|
|
||||||
|
|
||||||
CommandInfo() : hide(false), prepend_channel(false) { }
|
|
||||||
|
|
||||||
/* Service name of the command */
|
|
||||||
Anope::string name;
|
|
||||||
/* Permission required to execute the command */
|
|
||||||
Anope::string permission;
|
|
||||||
/* Group this command is in */
|
|
||||||
Anope::string group;
|
|
||||||
/* whether or not to hide this command in help output */
|
|
||||||
bool hide;
|
|
||||||
/* Only used with fantasy */
|
|
||||||
bool prepend_channel;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Where the replies from commands go to. User inherits from this and is the normal
|
|
||||||
* source of a CommandReply
|
|
||||||
*/
|
*/
|
||||||
struct CoreExport CommandReply
|
|
||||||
{
|
|
||||||
virtual ~CommandReply() { }
|
|
||||||
virtual void SendMessage(BotInfo *source, const Anope::string &msg) = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* The source for a command */
|
extern MDE Command *lookup_cmd(Command *list, char *name);
|
||||||
class CoreExport CommandSource
|
extern void run_cmd(char *service, User *u, Command *list,
|
||||||
{
|
char *name);
|
||||||
/* The nick executing the command */
|
extern void help_cmd(char *service, User *u, Command *list,
|
||||||
Anope::string nick;
|
char *name);
|
||||||
/* User executing the command, may be NULL */
|
extern void do_run_cmd(char *service, User * u, Command *c,const char *cmd);
|
||||||
Reference<User> u;
|
extern MDE void do_help_limited(char *service, User * u, Command * c);
|
||||||
public:
|
extern void do_help_cmd(char *service, User * u, Command *c,const char *cmd);
|
||||||
/* The account executing the command */
|
extern MDE void mod_help_cmd(char *service, User *u, CommandHash *cmdTable[],const char *cmd);
|
||||||
Reference<NickCore> nc;
|
extern MDE void mod_run_cmd(char *service, User *u, CommandHash *cmdTable[],const char *cmd);
|
||||||
/* for web clients */
|
|
||||||
Anope::string ip;
|
|
||||||
/* Where the reply should go */
|
|
||||||
CommandReply *reply;
|
|
||||||
/* Channel the command was executed on (fantasy) */
|
|
||||||
Reference<Channel> c;
|
|
||||||
/* The service this command is on */
|
|
||||||
Reference<BotInfo> service;
|
|
||||||
/* The actual name of the command being executed */
|
|
||||||
Anope::string command;
|
|
||||||
/* The permission of the command being executed */
|
|
||||||
Anope::string permission;
|
|
||||||
|
|
||||||
CommandSource(const Anope::string &n, User *user, NickCore *core, CommandReply *reply, BotInfo *bi);
|
/*************************************************************************/
|
||||||
|
|
||||||
const Anope::string &GetNick() const;
|
|
||||||
User *GetUser();
|
|
||||||
NickCore *GetAccount();
|
|
||||||
AccessGroup AccessFor(ChannelInfo *ci);
|
|
||||||
bool IsFounder(ChannelInfo *ci);
|
|
||||||
|
|
||||||
void Reply(const char *message, ...);
|
|
||||||
void Reply(const Anope::string &message);
|
|
||||||
|
|
||||||
bool HasCommand(const Anope::string &cmd);
|
|
||||||
bool HasPriv(const Anope::string &cmd);
|
|
||||||
bool IsServicesOper();
|
|
||||||
bool IsOper();
|
|
||||||
};
|
|
||||||
|
|
||||||
/** Every services command is a class, inheriting from Command.
|
|
||||||
*/
|
|
||||||
class CoreExport Command : public Service
|
|
||||||
{
|
|
||||||
Anope::string desc;
|
|
||||||
std::vector<Anope::string> syntax;
|
|
||||||
/* Allow unregistered users to use this command */
|
|
||||||
bool allow_unregistered;
|
|
||||||
/* Command requires that a user is executing it */
|
|
||||||
bool require_user;
|
|
||||||
|
|
||||||
public:
|
|
||||||
/* Maximum parameters accepted by this command */
|
|
||||||
size_t max_params;
|
|
||||||
/* Minimum parameters required to use this command */
|
|
||||||
size_t min_params;
|
|
||||||
|
|
||||||
/* Module which owns us */
|
|
||||||
Module *module;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
/** Create a new command.
|
|
||||||
* @param owner The owner of the command
|
|
||||||
* @param sname The command name
|
|
||||||
* @param min_params The minimum number of parameters the parser will require to execute this command
|
|
||||||
* @param max_params The maximum number of parameters the parser will create, after max_params, all will be combined into the last argument.
|
|
||||||
* NOTE: If max_params is not set (default), there is no limit to the max number of params.
|
|
||||||
*/
|
|
||||||
Command(Module *owner, const Anope::string &sname, size_t min_params, size_t max_params = 0);
|
|
||||||
|
|
||||||
public:
|
|
||||||
virtual ~Command();
|
|
||||||
|
|
||||||
protected:
|
|
||||||
void SetDesc(const Anope::string &d);
|
|
||||||
|
|
||||||
void ClearSyntax();
|
|
||||||
void SetSyntax(const Anope::string &s);
|
|
||||||
void SendSyntax(CommandSource &);
|
|
||||||
|
|
||||||
void AllowUnregistered(bool b);
|
|
||||||
void RequireUser(bool b);
|
|
||||||
|
|
||||||
public:
|
|
||||||
bool AllowUnregistered() const;
|
|
||||||
bool RequireUser() const;
|
|
||||||
|
|
||||||
/** Get the command description
|
|
||||||
* @param source The source wanting the command description
|
|
||||||
* @return The commands description
|
|
||||||
*/
|
|
||||||
virtual const Anope::string GetDesc(CommandSource &source) const;
|
|
||||||
|
|
||||||
/** Execute this command.
|
|
||||||
* @param source The source
|
|
||||||
* @param params Command parameters
|
|
||||||
*/
|
|
||||||
virtual void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms) = 0;
|
|
||||||
|
|
||||||
/** Called when HELP is requested for the client this command is on.
|
|
||||||
* @param source The source
|
|
||||||
*/
|
|
||||||
virtual void OnServHelp(CommandSource &source);
|
|
||||||
|
|
||||||
/** Requested when the user is requesting help on this command. Help on this command should be sent to the user.
|
|
||||||
* @param source The source
|
|
||||||
* @param subcommand The subcommand the user is requesting help on, or an empty string. (e.g. /ns help set foo bar lol gives a subcommand of "FOO BAR LOL")
|
|
||||||
* @return true if help was provided to the user, false otherwise.
|
|
||||||
*/
|
|
||||||
virtual bool OnHelp(CommandSource &source, const Anope::string &subcommand);
|
|
||||||
|
|
||||||
/** Requested when the user provides bad syntax to this command (not enough params, etc).
|
|
||||||
* @param source The source
|
|
||||||
* @param subcommand The subcommand the user tried to use
|
|
||||||
*/
|
|
||||||
virtual void OnSyntaxError(CommandSource &source, const Anope::string &subcommand);
|
|
||||||
|
|
||||||
/** Runs a command
|
|
||||||
* @param source The source of the command
|
|
||||||
* @param message The full message to run, the command is at the beginning of the message
|
|
||||||
*/
|
|
||||||
static void Run(CommandSource &source, const Anope::string &message);
|
|
||||||
|
|
||||||
void Run(CommandSource &source, const Anope::string &, const CommandInfo &, std::vector<Anope::string> ¶ms);
|
|
||||||
|
|
||||||
/** Looks up a command name from the service name.
|
|
||||||
* Note that if the same command exists multiple places this will return the first one encountered
|
|
||||||
* @param command_service The command service to lookup, eg, nickserv/register
|
|
||||||
* @param bot If found, is set to the bot the command is on, eg NickServ
|
|
||||||
* @param name If found, is set to the command name, eg REGISTER
|
|
||||||
* @return true if the given command service exists
|
|
||||||
*/
|
|
||||||
static bool FindCommandFromService(const Anope::string &command_service, BotInfo* &bi, Anope::string &name);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // COMMANDS_H
|
|
||||||
|
|||||||
+49
-168
@@ -1,194 +1,75 @@
|
|||||||
/*
|
/* Services configuration.
|
||||||
*
|
*
|
||||||
* (C) 2003-2026 Anope Team
|
* (C) 2003-2014 Anope Team
|
||||||
* Contact us at team@anope.org
|
* Contact us at team@anope.org
|
||||||
*
|
*
|
||||||
* Please read COPYING and README for further details.
|
* Please read COPYING and README for further details.
|
||||||
*
|
*
|
||||||
* Based on the original code of Epona by Lara.
|
* Based on the original code of Epona by Lara.
|
||||||
* Based on the original code of Services by Andy Church.
|
* Based on the original code of Services by Andy Church.
|
||||||
|
*
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef CONFIG_H
|
#ifndef CONFIG_H
|
||||||
#define CONFIG_H
|
#define CONFIG_H
|
||||||
|
|
||||||
#include "account.h"
|
/* Note that most of the options which used to be here have been moved to
|
||||||
#include "regchannel.h"
|
* services.conf. */
|
||||||
#include "users.h"
|
|
||||||
#include "opertype.h"
|
|
||||||
#include <stack>
|
|
||||||
|
|
||||||
namespace Configuration
|
/*************************************************************************/
|
||||||
{
|
|
||||||
namespace Internal
|
|
||||||
{
|
|
||||||
class CoreExport Block
|
|
||||||
{
|
|
||||||
friend struct Configuration::Conf;
|
|
||||||
|
|
||||||
public:
|
/******* General configuration *******/
|
||||||
typedef Anope::map<Anope::string> item_map;
|
|
||||||
typedef Anope::multimap<Block> block_map;
|
|
||||||
|
|
||||||
private:
|
/* Name of configuration file (in Services directory) */
|
||||||
Anope::string name;
|
#define SERVICES_CONF "services.conf"
|
||||||
item_map items;
|
|
||||||
block_map blocks;
|
|
||||||
int linenum;
|
|
||||||
|
|
||||||
/* Represents a missing tag. */
|
/* Name of log file (in Services directory) */
|
||||||
static Block EmptyBlock;
|
#define LOG_FILENAME "services.log"
|
||||||
|
|
||||||
public:
|
/* Maximum amount of data from/to the network to buffer (bytes). */
|
||||||
Block(const Anope::string &);
|
#define NET_BUFSIZE 65536
|
||||||
const Anope::string &GetName() const;
|
|
||||||
int CountBlock(const Anope::string &name) const;
|
|
||||||
const Block* GetBlock(const Anope::string &name, int num = 0) const;
|
|
||||||
Block* GetMutableBlock(const Anope::string &name, int num = 0);
|
|
||||||
|
|
||||||
template<typename T> inline T Get(const Anope::string &tag) const
|
/******* OperServ configuration *******/
|
||||||
{
|
|
||||||
return this->Get<T>(tag, "");
|
|
||||||
}
|
|
||||||
/* VS 2008 has an issue with having a default argument here (def = ""), which is why the above
|
|
||||||
* function exists.
|
|
||||||
*/
|
|
||||||
template<typename T> T Get(const Anope::string &tag, const Anope::string &def) const
|
|
||||||
{
|
|
||||||
const Anope::string &value = this->Get<const Anope::string>(tag, def);
|
|
||||||
if (!value.empty())
|
|
||||||
try
|
|
||||||
{
|
|
||||||
return convertTo<T>(value);
|
|
||||||
}
|
|
||||||
catch (const ConvertException &) { }
|
|
||||||
return T();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Set(const Anope::string &tag, const Anope::string &value);
|
/* Define this to enable OperServ's svs commands (superadmin only). */
|
||||||
const item_map* GetItems() const;
|
#define USE_OSSVS
|
||||||
};
|
|
||||||
|
|
||||||
template<> CoreExport const Anope::string Block::Get(const Anope::string &tag, const Anope::string& def) const;
|
/* Define this to enable OperServ's debugging commands (Services root
|
||||||
template<> CoreExport time_t Block::Get(const Anope::string &tag, const Anope::string &def) const;
|
* only). These commands are undocumented; "use the source, Luke!" */
|
||||||
template<> CoreExport bool Block::Get(const Anope::string &tag, const Anope::string &def) const;
|
/* #define DEBUG_COMMANDS */
|
||||||
} // namespace Internal
|
|
||||||
|
|
||||||
typedef const Internal::Block Block;
|
/******************* END OF USER-CONFIGURABLE SECTION ********************/
|
||||||
typedef Internal::Block MutableBlock;
|
|
||||||
|
|
||||||
/** Represents a configuration file
|
/* Size of input buffer (note: this is different from BUFSIZ)
|
||||||
*/
|
* This must be big enough to hold at least one full IRC message, or messy
|
||||||
class File
|
* things will happen. */
|
||||||
{
|
#define BUFSIZE 1024
|
||||||
Anope::string name;
|
|
||||||
bool executable;
|
|
||||||
FILE *fp;
|
|
||||||
public:
|
|
||||||
File(const Anope::string &, bool);
|
|
||||||
~File();
|
|
||||||
const Anope::string &GetName() const;
|
|
||||||
Anope::string GetPath() const;
|
|
||||||
|
|
||||||
bool IsOpen() const;
|
/* Extra warning: If you change CHANMAX, your ChanServ database will be
|
||||||
bool Open();
|
* unusable.
|
||||||
void Close();
|
|
||||||
bool End() const;
|
|
||||||
Anope::string Read();
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Uplink;
|
|
||||||
|
|
||||||
struct CoreExport Conf : Block
|
|
||||||
{
|
|
||||||
/* options:readtimeout */
|
|
||||||
time_t ReadTimeout;
|
|
||||||
/* options:useprivmsg */
|
|
||||||
bool UsePrivmsg;
|
|
||||||
/* If we should default to privmsging clients */
|
|
||||||
bool DefPrivmsg;
|
|
||||||
/* Default language */
|
|
||||||
Anope::string DefLanguage;
|
|
||||||
/* options:timeoutcheck */
|
|
||||||
time_t TimeoutCheck;
|
|
||||||
/* options:usestrictprivmsg */
|
|
||||||
bool UseStrictPrivmsg;
|
|
||||||
/* networkinfo:nickchars */
|
|
||||||
Anope::string NickChars;
|
|
||||||
|
|
||||||
/* either "/msg " or "/" */
|
|
||||||
Anope::string StrictPrivmsg;
|
|
||||||
/* List of uplink servers to try and connect to */
|
|
||||||
std::vector<Uplink> Uplinks;
|
|
||||||
/* A vector of our logfile options */
|
|
||||||
std::vector<LogInfo> LogInfos;
|
|
||||||
/* Array of ulined servers */
|
|
||||||
std::vector<Anope::string> Ulines;
|
|
||||||
/* List of available opertypes */
|
|
||||||
std::vector<OperType *> MyOperTypes;
|
|
||||||
/* List of pairs of opers and their opertype from the config */
|
|
||||||
std::vector<Oper *> Opers;
|
|
||||||
/* Map of fantasy commands */
|
|
||||||
CommandInfo::map Fantasy;
|
|
||||||
/* Command groups */
|
|
||||||
std::vector<CommandGroup> CommandGroups;
|
|
||||||
/* List of modules to autoload */
|
|
||||||
std::vector<Anope::string> ModulesAutoLoad;
|
|
||||||
|
|
||||||
/* module configuration blocks */
|
|
||||||
std::map<Anope::string, Block *> modules;
|
|
||||||
Anope::map<Anope::string> bots;
|
|
||||||
|
|
||||||
Conf();
|
|
||||||
~Conf();
|
|
||||||
|
|
||||||
void LoadConf(File &file);
|
|
||||||
void Post(Conf *old);
|
|
||||||
|
|
||||||
Block *GetModule(Module *);
|
|
||||||
Block *GetModule(const Anope::string &name);
|
|
||||||
|
|
||||||
BotInfo *GetClient(const Anope::string &name);
|
|
||||||
|
|
||||||
const Block *GetCommand(CommandSource &);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Uplink
|
|
||||||
{
|
|
||||||
Anope::string host;
|
|
||||||
unsigned port;
|
|
||||||
Anope::string password;
|
|
||||||
bool ipv6;
|
|
||||||
|
|
||||||
Uplink(const Anope::string &_host, int _port, const Anope::string &_password, bool _ipv6) : host(_host), port(_port), password(_password), ipv6(_ipv6) { }
|
|
||||||
inline bool operator==(const Uplink &other) const { return host == other.host && port == other.port && password == other.password && ipv6 == other.ipv6; }
|
|
||||||
inline bool operator!=(const Uplink &other) const { return !(*this == other); }
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/** This class can be used on its own to represent an exception, or derived to represent a module-specific exception.
|
|
||||||
* When a module whishes to abort, e.g. within a constructor, it should throw an exception using ModuleException or
|
|
||||||
* a class derived from ModuleException. If a module throws an exception during its constructor, the module will not
|
|
||||||
* be loaded. If this happens, the error message returned by ModuleException::GetReason will be displayed to the user
|
|
||||||
* attempting to load the module, or dumped to the console if the ircd is currently loading for the first time.
|
|
||||||
*/
|
*/
|
||||||
class ConfigException : public CoreException
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
/** Default constructor, just uses the error message 'Config threw an exception'.
|
|
||||||
*/
|
|
||||||
ConfigException() : CoreException("Config threw an exception", "Config Parser") { }
|
|
||||||
/** This constructor can be used to specify an error message before throwing.
|
|
||||||
*/
|
|
||||||
ConfigException(const Anope::string &message) : CoreException(message, "Config Parser") { }
|
|
||||||
/** This destructor solves world hunger, cancels the world debt, and causes the world to end.
|
|
||||||
* Actually no, it does nothing. Never mind.
|
|
||||||
* @throws Nothing!
|
|
||||||
*/
|
|
||||||
virtual ~ConfigException() throw() { }
|
|
||||||
};
|
|
||||||
|
|
||||||
extern Configuration::File ServicesConf;
|
/* Maximum length of a channel name, including the trailing null. Any
|
||||||
extern CoreExport Configuration::Conf *Config;
|
* channels with a length longer than (CHANMAX-1) including the leading #
|
||||||
|
* will not be usable with ChanServ. */
|
||||||
|
#define CHANMAX 64
|
||||||
|
|
||||||
#endif // CONFIG_H
|
/* Maximum length of a nickname, including the trailing null. This MUST be
|
||||||
|
* at least one greater than the maximum allowable nickname length on your
|
||||||
|
* network, or people will run into problems using Services! The default
|
||||||
|
* (32) works with all servers I know of. */
|
||||||
|
#define NICKMAX 32
|
||||||
|
|
||||||
|
/* Maximum length of a password */
|
||||||
|
#define PASSMAX 32
|
||||||
|
|
||||||
|
/* Maximum length of a username */
|
||||||
|
#define USERMAX 10
|
||||||
|
|
||||||
|
/* Maximum length of a domain */
|
||||||
|
#define HOSTMAX 64
|
||||||
|
|
||||||
|
/**************************************************************************/
|
||||||
|
|
||||||
|
#endif /* CONFIG_H */
|
||||||
|
|||||||
@@ -0,0 +1,70 @@
|
|||||||
|
/* Database file descriptor structure and file handling routine prototypes.
|
||||||
|
*
|
||||||
|
* (C) 2003-2014 Anope Team
|
||||||
|
* Contact us at team@anope.org
|
||||||
|
*
|
||||||
|
* Please read COPYING and README for further details.
|
||||||
|
*
|
||||||
|
* Based on the original code of Epona by Lara.
|
||||||
|
* Based on the original code of Services by Andy Church.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef DATAFILES_H
|
||||||
|
#define DATAFILES_H
|
||||||
|
|
||||||
|
#ifndef _WIN32
|
||||||
|
#include <sys/param.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*************************************************************************/
|
||||||
|
|
||||||
|
typedef struct dbFILE_ dbFILE;
|
||||||
|
struct dbFILE_ {
|
||||||
|
int mode; /* 'r' for reading, 'w' for writing */
|
||||||
|
FILE *fp; /* The normal file descriptor */
|
||||||
|
FILE *backupfp; /* Open file pointer to a backup copy of
|
||||||
|
* the database file (if non-NULL) */
|
||||||
|
char filename[MAXPATHLEN]; /* Name of the database file */
|
||||||
|
char backupname[MAXPATHLEN]; /* Name of the backup file */
|
||||||
|
};
|
||||||
|
|
||||||
|
/*************************************************************************/
|
||||||
|
|
||||||
|
/* Prototypes and macros: */
|
||||||
|
|
||||||
|
E void check_file_version(dbFILE *f);
|
||||||
|
E int get_file_version(dbFILE *f);
|
||||||
|
E int write_file_version(dbFILE *f, uint32 version);
|
||||||
|
|
||||||
|
E dbFILE *open_db(const char *service, const char *filename, const char *mode, uint32 version);
|
||||||
|
E void restore_db(dbFILE *f); /* Restore to state before open_db() */
|
||||||
|
E void close_db(dbFILE *f);
|
||||||
|
E void backup_databases(void);
|
||||||
|
|
||||||
|
#define read_db(f,buf,len) (fread((buf),1,(len),(f)->fp))
|
||||||
|
#define write_db(f,buf,len) (fwrite((buf),1,(len),(f)->fp))
|
||||||
|
#define getc_db(f) (fgetc((f)->fp))
|
||||||
|
|
||||||
|
E int read_int16(uint16 *ret, dbFILE *f);
|
||||||
|
E int write_int16(uint16 val, dbFILE *f);
|
||||||
|
E int read_int32(uint32 *ret, dbFILE *f);
|
||||||
|
E int write_int32(uint32 val, dbFILE *f);
|
||||||
|
E int read_ptr(void **ret, dbFILE *f);
|
||||||
|
E int write_ptr(const void *ptr, dbFILE *f);
|
||||||
|
E int read_string(char **ret, dbFILE *f);
|
||||||
|
E int write_string(const char *s, dbFILE *f);
|
||||||
|
|
||||||
|
#define read_int8(ret,f) ((*(ret)=fgetc((f)->fp))==EOF ? -1 : 0)
|
||||||
|
#define write_int8(val,f) (fputc((val),(f)->fp)==EOF ? -1 : 0)
|
||||||
|
#define read_buffer(buf,f) (read_db((f),(buf),sizeof(buf)) == sizeof(buf))
|
||||||
|
#define write_buffer(buf,f) (write_db((f),(buf),sizeof(buf)) == sizeof(buf))
|
||||||
|
#define read_buflen(buf,len,f) (read_db((f),(buf),(len)) == (len))
|
||||||
|
#define write_buflen(buf,len,f) (write_db((f),(buf),(len)) == (len))
|
||||||
|
#define read_variable(var,f) (read_db((f),&(var),sizeof(var)) == sizeof(var))
|
||||||
|
#define write_variable(var,f) (write_db((f),&(var),sizeof(var)) == sizeof(var))
|
||||||
|
|
||||||
|
/*************************************************************************/
|
||||||
|
|
||||||
|
#endif /* DATAFILES_H */
|
||||||
+30
-44
@@ -1,53 +1,39 @@
|
|||||||
/*
|
/* Set default values for any constants that should be in include files but
|
||||||
*
|
*
|
||||||
* (C) 2003-2026 Anope Team
|
* (C) 2003-2014 Anope Team
|
||||||
* Contact us at team@anope.org
|
* Contact us at team@anope.org
|
||||||
*
|
*
|
||||||
* Please read COPYING and README for further details.
|
* Please read COPYING and README for further details.
|
||||||
*
|
*
|
||||||
* Based on the original code of Epona by Lara.
|
* Based on the original code of Epona by Lara.
|
||||||
* Based on the original code of Services by Andy Church.
|
* Based on the original code of Services by Andy Church.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
class AccessGroup;
|
/*************************************************************************/
|
||||||
class AutoKick;
|
|
||||||
class BotInfo;
|
#ifndef NAME_MAX
|
||||||
class CallBack;
|
# define NAME_MAX 255
|
||||||
class ChanAccess;
|
#endif
|
||||||
class Channel;
|
|
||||||
class ChannelInfo;
|
#ifndef BUFSIZ
|
||||||
class ChannelStatus;
|
# define BUFSIZ 256
|
||||||
struct ChanUserContainer;
|
#else
|
||||||
class ClientSocket;
|
# if BUFSIZ < 256
|
||||||
class Command;
|
# define BUFSIZ 256
|
||||||
class CommandSource;
|
# endif
|
||||||
namespace Configuration { struct Conf; }
|
#endif
|
||||||
class ConnectionSocket;
|
|
||||||
namespace DNS { struct Query; }
|
/* Length of an array: */
|
||||||
class Entry;
|
#define lenof(a) (sizeof(a) / sizeof(*(a)))
|
||||||
class IdentifyRequest;
|
|
||||||
class InfoFormatter;
|
/* Telling compilers about printf()-like functions: */
|
||||||
class IRCDProto;
|
#ifdef __GNUC__
|
||||||
class ListenSocket;
|
# define FORMAT(type,fmt,start) __attribute__((format(type,fmt,start)))
|
||||||
class Log;
|
#else
|
||||||
class Memo;
|
# define FORMAT(type,fmt,start)
|
||||||
class MessageSource;
|
#endif
|
||||||
class Module;
|
|
||||||
class NickAlias;
|
/*************************************************************************/
|
||||||
class NickCore;
|
|
||||||
class OperType;
|
|
||||||
class ReferenceBase;
|
|
||||||
class Regex;
|
|
||||||
class Serializable;
|
|
||||||
class Server;
|
|
||||||
class Socket;
|
|
||||||
class Thread;
|
|
||||||
class User;
|
|
||||||
class XLine;
|
|
||||||
class XLineManager;
|
|
||||||
struct BadWord;
|
|
||||||
struct Exception;
|
|
||||||
struct MemoInfo;
|
|
||||||
struct ModeLock;
|
|
||||||
struct Oper;
|
|
||||||
namespace SASL { struct Message; }
|
|
||||||
|
|||||||
@@ -0,0 +1,127 @@
|
|||||||
|
/* depricated.h
|
||||||
|
*
|
||||||
|
* (C) 2003-2014 Anope Team
|
||||||
|
* Contact us at team@anope.org
|
||||||
|
*
|
||||||
|
* Please read COPYING and README for further details.
|
||||||
|
*
|
||||||
|
* Based on the original code of Epona by Lara.
|
||||||
|
* Based on the original code of Services by Andy Church.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
All of these functions were replaced in 1.7.6, you should move your modules
|
||||||
|
to use the new functions
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define change_user_mode(u, modes, arg) common_svsmode(u, modes, arg)
|
||||||
|
#define GetIdent(x) common_get_vident(x)
|
||||||
|
#define GetHost(x) common_get_vhost(x)
|
||||||
|
|
||||||
|
#define NEWNICK(nick,user,host,real,modes,qline) \
|
||||||
|
anope_cmd_bot_nick(nick,user,host,real,modes)
|
||||||
|
|
||||||
|
#define s_akill(user, host, who, when, expires, reason) \
|
||||||
|
anope_cmd_akill(user, host, who, when, expires, reason)
|
||||||
|
|
||||||
|
#define set_umode(user, ac, av) anope_set_umode(user, ac, av)
|
||||||
|
|
||||||
|
#define s_svsnoop(server, set) anope_cmd_svsnoop(server, set)
|
||||||
|
|
||||||
|
#define s_sqline(mask, reason) anope_cmd_sqline(mask, reason)
|
||||||
|
|
||||||
|
#define s_sgline(mask, reason) anope_cmd_sgline(mask, reason)
|
||||||
|
#define s_szline(mask, reason) anope_cmd_szline(mask, reason)
|
||||||
|
#define s_unsgline(mask) anope_cmd_unsgline(mask)
|
||||||
|
#define s_unsqline(mask) anope_cmd_unsqline(mask)
|
||||||
|
#define s_unszline(mask) anope_cmd_unszline(mask)
|
||||||
|
|
||||||
|
#define s_rakill(user, host) anope_cmd_remove_akill(user, host)
|
||||||
|
|
||||||
|
|
||||||
|
# define NICKSERV_MODE ircd->nickservmode
|
||||||
|
# define CHANSERV_MODE ircd->chanservmode
|
||||||
|
# define HOSTSERV_MODE ircd->hostservmode
|
||||||
|
# define MEMOSERV_MODE ircd->memoservmode
|
||||||
|
# define BOTSERV_MODE ircd->botservmode
|
||||||
|
# define HELPSERV_MODE ircd->helpservmode
|
||||||
|
# define OPERSERV_MODE ircd->oprservmode
|
||||||
|
# define DEVNULL_MODE ircd->devnullmode
|
||||||
|
# define GLOBAL_MODE ircd->globalmode
|
||||||
|
# define NICKSERV_ALIAS_MODE ircd->nickservaliasmode
|
||||||
|
# define CHANSERV_ALIAS_MODE ircd->chanservaliasmode
|
||||||
|
# define MEMOSERV_ALIAS_MODE ircd->memoservaliasmode
|
||||||
|
# define BOTSERV_ALIAS_MODE ircd->botservaliasmode
|
||||||
|
# define HELPSERV_ALIAS_MODE ircd->helpservaliasmode
|
||||||
|
# define OPERSERV_ALIAS_MODE ircd->operservaliasmode
|
||||||
|
# define DEVNULL_ALIAS_MODE ircd->devnullaliasmode
|
||||||
|
# define GLOBAL_ALIAS_MODE ircd->globalaliasmode
|
||||||
|
# define HOSTSERV_ALIAS_MODE ircd->hostservaliasmode
|
||||||
|
# define BOTSERV_BOTS_MODE ircd->botserv_bot_mode
|
||||||
|
#define CHAN_MAX_SYMBOL ircd->max_symbols
|
||||||
|
#define MODESTOREMOVE ircd->modestoremove
|
||||||
|
|
||||||
|
#ifdef IRC_HYBRID
|
||||||
|
# define HAS_HALFOP
|
||||||
|
# define HAS_EXCEPT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef IRC_VIAGRA
|
||||||
|
# define HAS_HALFOP
|
||||||
|
# define HAS_VHOST
|
||||||
|
# define HAS_VIDENT
|
||||||
|
# define HAS_EXCEPT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef IRC_BAHAMUT
|
||||||
|
# define HAS_NICKIP
|
||||||
|
# define HAS_EXCEPT
|
||||||
|
# define HAS_SVSHOLD
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef IRC_RAGE2
|
||||||
|
# define HAS_HALFOP
|
||||||
|
# define HAS_EXCEPT
|
||||||
|
# define HAS_VHOST
|
||||||
|
# define HAS_NICKVHOST
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef IRC_PTLINK
|
||||||
|
# define HAS_NICKVHOST
|
||||||
|
# define HAS_VHOST
|
||||||
|
# define HAS_FMODE
|
||||||
|
# define HAS_EXCEPT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef IRC_ULTIMATE2
|
||||||
|
# define IRC_ULTIMATE /* gotta do this for old mods */
|
||||||
|
# define HAS_FMODE
|
||||||
|
# define HAS_HALFOP
|
||||||
|
# define HAS_LMODE
|
||||||
|
# define HAS_VHOST
|
||||||
|
# define HAS_VIDENT
|
||||||
|
# define HAS_EXCEPT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(IRC_UNREAL31) || defined(IRC_UNREAL32)
|
||||||
|
# define IRC_UNREAL /* gotta do this for old mods */
|
||||||
|
# define HAS_FMODE
|
||||||
|
# define HAS_HALFOP
|
||||||
|
# define HAS_LMODE
|
||||||
|
# define HAS_NICKVHOST
|
||||||
|
# define HAS_VHOST
|
||||||
|
# define HAS_VIDENT
|
||||||
|
# define HAS_EXCEPT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef IRC_ULTIMATE3
|
||||||
|
# define HAS_HALFOP
|
||||||
|
# define HAS_VHOST
|
||||||
|
# define HAS_NICKVHOST
|
||||||
|
# define HAS_VIDENT
|
||||||
|
# define HAS_EXCEPT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
/* Include file for high-level encryption routines.
|
||||||
|
*
|
||||||
|
* (C) 2003-2014 Anope Team
|
||||||
|
* Contact us at team@anope.org
|
||||||
|
*
|
||||||
|
* Please read COPYING and README for further details.
|
||||||
|
*
|
||||||
|
* Based on the original code of Epona by Lara.
|
||||||
|
* Based on the original code of Services by Andy Church.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef struct encryption_ {
|
||||||
|
int (*encrypt)(const char *src, int len, char *dest, int size);
|
||||||
|
int (*encrypt_check_len)(int passlen, int bufsize);
|
||||||
|
int (*decrypt)(const char *src, char *dest, int size);
|
||||||
|
int (*check_password)(const char *plaintext, const char *password);
|
||||||
|
} Encryption;
|
||||||
|
|
||||||
@@ -0,0 +1,72 @@
|
|||||||
|
/* Prototypes and external variable declarations.
|
||||||
|
*
|
||||||
|
* (C) 2003-2014 Anope Team
|
||||||
|
* Contact us at team@anope.org
|
||||||
|
*
|
||||||
|
* Please read COPYING and README for further details.
|
||||||
|
*
|
||||||
|
* Based on the original code of Epona by Lara.
|
||||||
|
* Based on the original code of Services by Andy Church.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define EVENT_START "start"
|
||||||
|
#define EVENT_STOP "stop"
|
||||||
|
|
||||||
|
#define EVENT_DB_SAVING "db_saving"
|
||||||
|
#define EVENT_DB_BACKUP "db_backup"
|
||||||
|
#define EVENT_NEWNICK "newnick"
|
||||||
|
#define EVENT_BOT_UNASSIGN "bot_unassign"
|
||||||
|
#define EVENT_BOT_JOIN "bot_join"
|
||||||
|
#define EVENT_BOT_CREATE "bot_create"
|
||||||
|
#define EVENT_BOT_CHANGE "bot_change"
|
||||||
|
#define EVENT_BOT_FANTASY "bot_command"
|
||||||
|
#define EVENT_BOT_FANTASY_NO_ACCESS "bot_command_no_access"
|
||||||
|
#define EVENT_BOT_DEL "bot_del"
|
||||||
|
#define EVENT_BOT_ASSIGN "bot_assign"
|
||||||
|
#define EVENT_BOT_KICK "bot_kick"
|
||||||
|
#define EVENT_BOT_BAN "bot_ban"
|
||||||
|
#define EVENT_TOPIC_UPDATED "chan_topic_updated"
|
||||||
|
#define EVENT_CHAN_EXPIRE "chan_expire"
|
||||||
|
#define EVENT_CHAN_REGISTERED "chan_registered"
|
||||||
|
#define EVENT_CHAN_DROP "chan_dropped"
|
||||||
|
#define EVENT_CHAN_FORBIDDEN "chan_forbidden"
|
||||||
|
#define EVENT_CHAN_SUSPENDED "chan_suspended"
|
||||||
|
#define EVENT_CHAN_UNSUSPEND "chan_unsuspend"
|
||||||
|
#define EVENT_CONNECT "connect"
|
||||||
|
#define EVENT_DB_EXPIRE "db_expire"
|
||||||
|
#define EVENT_RESTART "restart"
|
||||||
|
#define EVENT_RELOAD "reload"
|
||||||
|
#define EVENT_SHUTDOWN "shutdown"
|
||||||
|
#define EVENT_SIGNAL "signal"
|
||||||
|
#define EVENT_NICK_REGISTERED "nick_registered"
|
||||||
|
#define EVENT_NICK_REQUESTED "nick_requested"
|
||||||
|
#define EVENT_NICK_DROPPED "nick_dropped"
|
||||||
|
#define EVENT_NICK_FORBIDDEN "nick_forbidden"
|
||||||
|
#define EVENT_NICK_EXPIRE "nick_expire"
|
||||||
|
#define EVENT_CORE_DROPPED "nickcore_dropped"
|
||||||
|
#define EVENT_CORE_NEWDISPLAY "nickcore_newdisplay"
|
||||||
|
#define EVENT_CHANGE_NICK "change_nick"
|
||||||
|
#define EVENT_USER_LOGOFF "user_logoff"
|
||||||
|
#define EVENT_NICK_GHOSTED "nick_ghosted"
|
||||||
|
#define EVENT_NICK_RECOVERED "nick_recovered"
|
||||||
|
#define EVENT_GROUP "nick_group"
|
||||||
|
#define EVENT_NICK_IDENTIFY "nick_id"
|
||||||
|
#define EVENT_SERVER_SQUIT "server_squit"
|
||||||
|
#define EVENT_SERVER_CONNECT "server_connect"
|
||||||
|
#define EVENT_DEFCON_LEVEL "defcon_level"
|
||||||
|
#define EVENT_NICK_SUSPENDED "nick_suspended"
|
||||||
|
#define EVENT_NICK_UNSUSPEND "nick_unsuspend"
|
||||||
|
#define EVENT_JOIN_CHANNEL "join_channel"
|
||||||
|
#define EVENT_PART_CHANNEL "part_channel"
|
||||||
|
#define EVENT_ACCESS_ADD "access_add"
|
||||||
|
#define EVENT_ACCESS_CHANGE "access_change"
|
||||||
|
#define EVENT_ACCESS_DEL "access_del"
|
||||||
|
#define EVENT_ACCESS_CLEAR "access_clear"
|
||||||
|
#define EVENT_NICK_LOGOUT "nick_logout"
|
||||||
|
#define EVENT_CHAN_KICK "chan_kick"
|
||||||
|
#define EVENT_MODLOAD "modload"
|
||||||
|
#define EVENT_MODUNLOAD "modunload"
|
||||||
|
#define EVENT_ADDCOMMAND "addcommand"
|
||||||
|
#define EVENT_DELCOMMAND "delcommand"
|
||||||
@@ -1,264 +0,0 @@
|
|||||||
/*
|
|
||||||
*
|
|
||||||
* (C) 2003-2026 Anope Team
|
|
||||||
* Contact us at team@anope.org
|
|
||||||
*
|
|
||||||
* Please read COPYING and README for further details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef EXTENSIBLE_H
|
|
||||||
#define EXTENSIBLE_H
|
|
||||||
|
|
||||||
#include "anope.h"
|
|
||||||
#include "serialize.h"
|
|
||||||
#include "service.h"
|
|
||||||
#include "logger.h"
|
|
||||||
|
|
||||||
class Extensible;
|
|
||||||
|
|
||||||
class CoreExport ExtensibleBase : public Service
|
|
||||||
{
|
|
||||||
protected:
|
|
||||||
std::map<Extensible *, void *> items;
|
|
||||||
|
|
||||||
ExtensibleBase(Module *m, const Anope::string &n);
|
|
||||||
~ExtensibleBase();
|
|
||||||
|
|
||||||
public:
|
|
||||||
virtual void Unset(Extensible *obj) = 0;
|
|
||||||
|
|
||||||
/* called when an object we are keep track of is serializing */
|
|
||||||
virtual void ExtensibleSerialize(const Extensible *, const Serializable *, Serialize::Data &) const { }
|
|
||||||
virtual void ExtensibleUnserialize(Extensible *, Serializable *, Serialize::Data &) { }
|
|
||||||
};
|
|
||||||
|
|
||||||
class CoreExport Extensible
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
std::set<ExtensibleBase *> extension_items;
|
|
||||||
|
|
||||||
virtual ~Extensible();
|
|
||||||
|
|
||||||
void UnsetExtensibles();
|
|
||||||
|
|
||||||
template<typename T> T* GetExt(const Anope::string &name) const;
|
|
||||||
bool HasExt(const Anope::string &name) const;
|
|
||||||
|
|
||||||
template<typename T> T* Extend(const Anope::string &name, const T &what);
|
|
||||||
template<typename T> T* Extend(const Anope::string &name);
|
|
||||||
template<typename T> T* Require(const Anope::string &name);
|
|
||||||
template<typename T> void Shrink(const Anope::string &name);
|
|
||||||
|
|
||||||
static void ExtensibleSerialize(const Extensible *, const Serializable *, Serialize::Data &data);
|
|
||||||
static void ExtensibleUnserialize(Extensible *, Serializable *, Serialize::Data &data);
|
|
||||||
};
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
class BaseExtensibleItem : public ExtensibleBase
|
|
||||||
{
|
|
||||||
protected:
|
|
||||||
virtual T *Create(Extensible *) = 0;
|
|
||||||
|
|
||||||
public:
|
|
||||||
BaseExtensibleItem(Module *m, const Anope::string &n) : ExtensibleBase(m, n) { }
|
|
||||||
|
|
||||||
~BaseExtensibleItem()
|
|
||||||
{
|
|
||||||
while (!items.empty())
|
|
||||||
{
|
|
||||||
std::map<Extensible *, void *>::iterator it = items.begin();
|
|
||||||
Extensible *obj = it->first;
|
|
||||||
T *value = static_cast<T *>(it->second);
|
|
||||||
|
|
||||||
obj->extension_items.erase(this);
|
|
||||||
items.erase(it);
|
|
||||||
delete value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
T* Set(Extensible *obj, const T &value)
|
|
||||||
{
|
|
||||||
T* t = Set(obj);
|
|
||||||
if (t)
|
|
||||||
*t = value;
|
|
||||||
return t;
|
|
||||||
}
|
|
||||||
|
|
||||||
T* Set(Extensible *obj)
|
|
||||||
{
|
|
||||||
T* t = Create(obj);
|
|
||||||
Unset(obj);
|
|
||||||
items[obj] = t;
|
|
||||||
obj->extension_items.insert(this);
|
|
||||||
return t;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Unset(Extensible *obj) anope_override
|
|
||||||
{
|
|
||||||
T *value = Get(obj);
|
|
||||||
items.erase(obj);
|
|
||||||
obj->extension_items.erase(this);
|
|
||||||
delete value;
|
|
||||||
}
|
|
||||||
|
|
||||||
T* Get(const Extensible *obj) const
|
|
||||||
{
|
|
||||||
std::map<Extensible *, void *>::const_iterator it = items.find(const_cast<Extensible *>(obj));
|
|
||||||
if (it != items.end())
|
|
||||||
return static_cast<T *>(it->second);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool HasExt(const Extensible *obj) const
|
|
||||||
{
|
|
||||||
return items.find(const_cast<Extensible *>(obj)) != items.end();
|
|
||||||
}
|
|
||||||
|
|
||||||
T* Require(Extensible *obj)
|
|
||||||
{
|
|
||||||
T* t = Get(obj);
|
|
||||||
if (t)
|
|
||||||
return t;
|
|
||||||
|
|
||||||
return Set(obj);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
class ExtensibleItem : public BaseExtensibleItem<T>
|
|
||||||
{
|
|
||||||
protected:
|
|
||||||
T* Create(Extensible *obj) anope_override
|
|
||||||
{
|
|
||||||
return new T(obj);
|
|
||||||
}
|
|
||||||
public:
|
|
||||||
ExtensibleItem(Module *m, const Anope::string &n) : BaseExtensibleItem<T>(m, n) { }
|
|
||||||
};
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
class PrimitiveExtensibleItem : public BaseExtensibleItem<T>
|
|
||||||
{
|
|
||||||
protected:
|
|
||||||
T* Create(Extensible *obj) anope_override
|
|
||||||
{
|
|
||||||
return new T();
|
|
||||||
}
|
|
||||||
public:
|
|
||||||
PrimitiveExtensibleItem(Module *m, const Anope::string &n) : BaseExtensibleItem<T>(m, n) { }
|
|
||||||
};
|
|
||||||
|
|
||||||
template<>
|
|
||||||
class PrimitiveExtensibleItem<bool> : public BaseExtensibleItem<bool>
|
|
||||||
{
|
|
||||||
protected:
|
|
||||||
bool* Create(Extensible *) anope_override
|
|
||||||
{
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
public:
|
|
||||||
PrimitiveExtensibleItem(Module *m, const Anope::string &n) : BaseExtensibleItem<bool>(m, n) { }
|
|
||||||
};
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
class SerializableExtensibleItem : public PrimitiveExtensibleItem<T>
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
SerializableExtensibleItem(Module *m, const Anope::string &n) : PrimitiveExtensibleItem<T>(m, n) { }
|
|
||||||
|
|
||||||
void ExtensibleSerialize(const Extensible *e, const Serializable *s, Serialize::Data &data) const anope_override
|
|
||||||
{
|
|
||||||
T* t = this->Get(e);
|
|
||||||
data[this->name] << *t;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ExtensibleUnserialize(Extensible *e, Serializable *s, Serialize::Data &data) anope_override
|
|
||||||
{
|
|
||||||
T t;
|
|
||||||
if (data[this->name] >> t)
|
|
||||||
this->Set(e, t);
|
|
||||||
else
|
|
||||||
this->Unset(e);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template<>
|
|
||||||
class SerializableExtensibleItem<bool> : public PrimitiveExtensibleItem<bool>
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
SerializableExtensibleItem(Module *m, const Anope::string &n) : PrimitiveExtensibleItem<bool>(m, n) { }
|
|
||||||
|
|
||||||
void ExtensibleSerialize(const Extensible *e, const Serializable *s, Serialize::Data &data) const anope_override
|
|
||||||
{
|
|
||||||
data.SetType(this->name, Serialize::Data::DT_INT);
|
|
||||||
data[this->name] << this->HasExt(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ExtensibleUnserialize(Extensible *e, Serializable *s, Serialize::Data &data) anope_override
|
|
||||||
{
|
|
||||||
bool b = false;
|
|
||||||
data[this->name] >> b;
|
|
||||||
if (b)
|
|
||||||
this->Set(e);
|
|
||||||
else
|
|
||||||
this->Unset(e);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
struct ExtensibleRef : ServiceReference<BaseExtensibleItem<T> >
|
|
||||||
{
|
|
||||||
ExtensibleRef(const Anope::string &n) : ServiceReference<BaseExtensibleItem<T> >("Extensible", n) { }
|
|
||||||
};
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
T* Extensible::GetExt(const Anope::string &name) const
|
|
||||||
{
|
|
||||||
ExtensibleRef<T> ref(name);
|
|
||||||
if (ref)
|
|
||||||
return ref->Get(this);
|
|
||||||
|
|
||||||
Log(LOG_DEBUG) << "GetExt for nonexistent type " << name << " on " << static_cast<const void *>(this);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
T* Extensible::Extend(const Anope::string &name, const T &what)
|
|
||||||
{
|
|
||||||
T* t = Extend<T>(name);
|
|
||||||
if (t)
|
|
||||||
*t = what;
|
|
||||||
return t;
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
T* Extensible::Extend(const Anope::string &name)
|
|
||||||
{
|
|
||||||
ExtensibleRef<T> ref(name);
|
|
||||||
if (ref)
|
|
||||||
return ref->Set(this);
|
|
||||||
|
|
||||||
Log(LOG_DEBUG) << "Extend for nonexistent type " << name << " on " << static_cast<void *>(this);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
T* Extensible::Require(const Anope::string &name)
|
|
||||||
{
|
|
||||||
if (HasExt(name))
|
|
||||||
return GetExt<T>(name);
|
|
||||||
else
|
|
||||||
return Extend<T>(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
void Extensible::Shrink(const Anope::string &name)
|
|
||||||
{
|
|
||||||
ExtensibleRef<T> ref(name);
|
|
||||||
if (ref)
|
|
||||||
ref->Unset(this);
|
|
||||||
else
|
|
||||||
Log(LOG_DEBUG) << "Shrink for nonexistent type " << name << " on " << static_cast<void *>(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // EXTENSIBLE_H
|
|
||||||
+1405
File diff suppressed because it is too large
Load Diff
@@ -1,199 +0,0 @@
|
|||||||
/*
|
|
||||||
*
|
|
||||||
* (C) 2002-2011 InspIRCd Development Team
|
|
||||||
* (C) 2009-2026 Anope Team <team@anope.org>
|
|
||||||
*
|
|
||||||
* Please read COPYING and README for further details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef HASHCOMP_H
|
|
||||||
#define HASHCOMP_H
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <locale>
|
|
||||||
|
|
||||||
#if defined _LIBCPP_VERSION || defined _WIN32
|
|
||||||
#include <unordered_map>
|
|
||||||
#define TR1NS std
|
|
||||||
#else
|
|
||||||
#include <tr1/unordered_map>
|
|
||||||
#define TR1NS std::tr1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "services.h"
|
|
||||||
|
|
||||||
namespace Anope
|
|
||||||
{
|
|
||||||
class string;
|
|
||||||
|
|
||||||
/* Casemap in use by Anope. ci::string's comparison functions use this (and thus Anope::string) */
|
|
||||||
extern std::locale casemap;
|
|
||||||
|
|
||||||
extern void CaseMapRebuild();
|
|
||||||
extern unsigned char tolower(unsigned char);
|
|
||||||
extern unsigned char toupper(unsigned char);
|
|
||||||
|
|
||||||
/* ASCII case insensitive ctype. */
|
|
||||||
template<typename char_type>
|
|
||||||
class ascii_ctype : public std::ctype<char_type>
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
char_type do_toupper(char_type c) const anope_override
|
|
||||||
{
|
|
||||||
if (c >= 'a' && c <= 'z')
|
|
||||||
return c - 32;
|
|
||||||
else
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
|
|
||||||
char_type do_tolower(char_type c) const anope_override
|
|
||||||
{
|
|
||||||
if (c >= 'A' && c <= 'Z')
|
|
||||||
return c + 32;
|
|
||||||
else
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/* rfc1459 case insensitive ctype, { = [, } = ], and | = \ */
|
|
||||||
template<typename char_type>
|
|
||||||
class rfc1459_ctype : public ascii_ctype<char_type>
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
char_type do_toupper(char_type c) const anope_override
|
|
||||||
{
|
|
||||||
if (c == '{' || c == '}' || c == '|')
|
|
||||||
return c - 32;
|
|
||||||
else
|
|
||||||
return ascii_ctype<char_type>::do_toupper(c);
|
|
||||||
}
|
|
||||||
|
|
||||||
char_type do_tolower(char_type c) const anope_override
|
|
||||||
{
|
|
||||||
if (c == '[' || c == ']' || c == '\\')
|
|
||||||
return c + 32;
|
|
||||||
else
|
|
||||||
return ascii_ctype<char_type>::do_tolower(c);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/** The ci namespace contains a number of helper classes relevant to case insensitive strings.
|
|
||||||
*/
|
|
||||||
namespace ci
|
|
||||||
{
|
|
||||||
/** The ci_char_traits class is used for ASCII-style comparison of strings.
|
|
||||||
* This class is used to implement ci::string, a case-insensitive, ASCII-
|
|
||||||
* comparing string class.
|
|
||||||
*/
|
|
||||||
struct CoreExport ci_char_traits : std::char_traits<char>
|
|
||||||
{
|
|
||||||
/** Check if two chars match.
|
|
||||||
* @param c1st First character
|
|
||||||
* @param c2nd Second character
|
|
||||||
* @return true if the characters are equal
|
|
||||||
*/
|
|
||||||
static bool eq(char c1st, char c2nd);
|
|
||||||
|
|
||||||
/** Check if two chars do NOT match.
|
|
||||||
* @param c1st First character
|
|
||||||
* @param c2nd Second character
|
|
||||||
* @return true if the characters are unequal
|
|
||||||
*/
|
|
||||||
static bool ne(char c1st, char c2nd);
|
|
||||||
|
|
||||||
/** Check if one char is less than another.
|
|
||||||
* @param c1st First character
|
|
||||||
* @param c2nd Second character
|
|
||||||
* @return true if c1st is less than c2nd
|
|
||||||
*/
|
|
||||||
static bool lt(char c1st, char c2nd);
|
|
||||||
|
|
||||||
/** Compare two strings of size n.
|
|
||||||
* @param str1 First string
|
|
||||||
* @param str2 Second string
|
|
||||||
* @param n Length to compare to
|
|
||||||
* @return similar to strcmp, zero for equal, less than zero for str1
|
|
||||||
* being less and greater than zero for str1 being greater than str2.
|
|
||||||
*/
|
|
||||||
static int compare(const char *str1, const char *str2, size_t n);
|
|
||||||
|
|
||||||
/** Find a char within a string up to position n.
|
|
||||||
* @param s1 String to find in
|
|
||||||
* @param n Position to search up to
|
|
||||||
* @param c Character to search for
|
|
||||||
* @return Pointer to the first occurrence of c in s1
|
|
||||||
*/
|
|
||||||
static const char *find(const char *s1, int n, char c);
|
|
||||||
};
|
|
||||||
|
|
||||||
/** This typedef declares ci::string based upon ci_char_traits.
|
|
||||||
*/
|
|
||||||
typedef std::basic_string<char, ci_char_traits, std::allocator<char> > string;
|
|
||||||
|
|
||||||
struct CoreExport less
|
|
||||||
{
|
|
||||||
/** Compare two Anope::strings as ci::strings and find which one is less
|
|
||||||
* @param s1 The first string
|
|
||||||
* @param s2 The second string
|
|
||||||
* @return true if s1 < s2, else false
|
|
||||||
*/
|
|
||||||
bool operator()(const Anope::string &s1, const Anope::string &s2) const;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Define operators for + and == with ci::string to std::string for easy assignment
|
|
||||||
* and comparison
|
|
||||||
*
|
|
||||||
* Operator +
|
|
||||||
*/
|
|
||||||
inline std::string operator+(std::string &leftval, ci::string &rightval)
|
|
||||||
{
|
|
||||||
return leftval + std::string(rightval.c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Define operators for + and == with ci::string to std::string for easy assignment
|
|
||||||
* and comparison
|
|
||||||
*
|
|
||||||
* Operator +
|
|
||||||
*/
|
|
||||||
inline ci::string operator+(ci::string &leftval, std::string &rightval)
|
|
||||||
{
|
|
||||||
return leftval + ci::string(rightval.c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Define operators for + and == with ci::string to std::string for easy assignment
|
|
||||||
* and comparison
|
|
||||||
*
|
|
||||||
* Operator ==
|
|
||||||
*/
|
|
||||||
inline bool operator==(const std::string &leftval, const ci::string &rightval)
|
|
||||||
{
|
|
||||||
return leftval.c_str() == rightval;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Define operators for + and == with ci::string to std::string for easy assignment
|
|
||||||
* and comparison
|
|
||||||
*
|
|
||||||
* Operator ==
|
|
||||||
*/
|
|
||||||
inline bool operator==(const ci::string &leftval, const std::string &rightval)
|
|
||||||
{
|
|
||||||
return leftval == rightval.c_str();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Define operators != for ci::string to std::string for easy comparison
|
|
||||||
*/
|
|
||||||
inline bool operator!=(const ci::string &leftval, const std::string &rightval)
|
|
||||||
{
|
|
||||||
return !(leftval == rightval.c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Define operators != for std::string to ci::string for easy comparison
|
|
||||||
*/
|
|
||||||
inline bool operator!=(const std::string &leftval, const ci::string &rightval)
|
|
||||||
{
|
|
||||||
return !(leftval.c_str() == rightval);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // HASHCOMP_H
|
|
||||||
@@ -1,127 +0,0 @@
|
|||||||
/*
|
|
||||||
*
|
|
||||||
* (C) 2008-2026 Anope Team
|
|
||||||
* Contact us at team@anope.org
|
|
||||||
*
|
|
||||||
* Please read COPYING and README for further details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "anope.h"
|
|
||||||
|
|
||||||
namespace Language
|
|
||||||
{
|
|
||||||
|
|
||||||
/* Languages we support as configured in services.conf. They are
|
|
||||||
* added to this list if we detect a language exists in the correct
|
|
||||||
* location for each language.
|
|
||||||
*/
|
|
||||||
extern CoreExport std::vector<Anope::string> Languages;
|
|
||||||
|
|
||||||
/* Domains to search when looking for translations other than the
|
|
||||||
* default "anope domain. This is used by modules who add their own
|
|
||||||
* language files (and thus domains) to Anope. If a module is loaded
|
|
||||||
* and we detect a language file exists for at least one of the supported
|
|
||||||
* languages for the module, then we add the module's domain (its name)
|
|
||||||
* here.
|
|
||||||
*
|
|
||||||
* When strings are translated they are checked against all domains.
|
|
||||||
*/
|
|
||||||
extern std::vector<Anope::string> Domains;
|
|
||||||
|
|
||||||
/** Initialize the language system. Finds valid language files and
|
|
||||||
* populates the Languages list.
|
|
||||||
*/
|
|
||||||
extern void InitLanguages();
|
|
||||||
|
|
||||||
/** Translates a string to the default language.
|
|
||||||
* @param string A string to translate
|
|
||||||
* @return The translated string if found, else the original string.
|
|
||||||
*/
|
|
||||||
extern CoreExport const char *Translate(const char *string);
|
|
||||||
|
|
||||||
/** Translates a string to the language of the given user.
|
|
||||||
* @param u The user to translate the string for
|
|
||||||
* @param string A string to translate
|
|
||||||
* @return The translated string if found, else the original string.
|
|
||||||
*/
|
|
||||||
extern CoreExport const char *Translate(User *u, const char *string);
|
|
||||||
|
|
||||||
/** Translates a string to the language of the given account.
|
|
||||||
* @param nc The account to translate the string for
|
|
||||||
* @param string A string to translate
|
|
||||||
* @return The translated string if count, else the original string
|
|
||||||
*/
|
|
||||||
extern CoreExport const char *Translate(const NickCore *nc, const char *string);
|
|
||||||
|
|
||||||
/** Translatesa string to the given language.
|
|
||||||
* @param lang The language to translate to
|
|
||||||
* @param string The string to translate
|
|
||||||
* @return The translated string if found, else the original string.
|
|
||||||
*/
|
|
||||||
extern CoreExport const char *Translate(const char *lang, const char *string);
|
|
||||||
|
|
||||||
} // namespace Language
|
|
||||||
|
|
||||||
/* Commonly used language strings */
|
|
||||||
#define MORE_INFO _("\002%s%s HELP %s\002 for more information.")
|
|
||||||
#define BAD_USERHOST_MASK _("Mask must be in the form \037user\037@\037host\037.")
|
|
||||||
#define BAD_EXPIRY_TIME _("Invalid expiry time.")
|
|
||||||
#define USERHOST_MASK_TOO_WIDE _("%s coverage is too wide; Please use a more specific mask.")
|
|
||||||
#define READ_ONLY_MODE _("Services are in read-only mode!")
|
|
||||||
#define PASSWORD_INCORRECT _("Password incorrect.")
|
|
||||||
#define ACCESS_DENIED _("Access denied.")
|
|
||||||
#define MORE_OBSCURE_PASSWORD _("Please try again with a more obscure password. Passwords should be at least\n" \
|
|
||||||
"five characters long, should not be something easily guessed\n" \
|
|
||||||
"(e.g. your real name or your nick), and cannot contain the space or tab characters.")
|
|
||||||
#define PASSWORD_TOO_LONG _("Your password is too long. It must not exceed %u characters.")
|
|
||||||
#define NICK_NOT_REGISTERED _("Your nick isn't registered.")
|
|
||||||
#define NICK_X_NOT_REGISTERED _("Nick \002%s\002 isn't registered.")
|
|
||||||
#define NICK_X_NOT_IN_USE _("Nick \002%s\002 isn't currently in use.")
|
|
||||||
#define NICK_X_NOT_ON_CHAN _("\002%s\002 is not currently on channel %s.")
|
|
||||||
#define NICK_X_SUSPENDED _("Nick %s is currently suspended.")
|
|
||||||
#define CHAN_X_SUSPENDED _("Channel %s is currently suspended.")
|
|
||||||
#define CHAN_X_NOT_REGISTERED _("Channel \002%s\002 isn't registered.")
|
|
||||||
#define CHAN_X_NOT_IN_USE _("Channel \002%s\002 doesn't exist.")
|
|
||||||
#define NICK_IDENTIFY_REQUIRED _("You must be logged into an account to use that command.")
|
|
||||||
#define MAIL_X_INVALID _("\002%s\002 is not a valid e-mail address.")
|
|
||||||
#define UNKNOWN _("<unknown>")
|
|
||||||
#define NO_EXPIRE _("does not expire")
|
|
||||||
#define LIST_INCORRECT_RANGE _("Incorrect range specified. The correct syntax is \002#\037from\037-\037to\037\002.")
|
|
||||||
#define NICK_IS_REGISTERED _("This nick is owned by someone else. Please choose another.\n" \
|
|
||||||
"(If this is your nick, type \002%s%s IDENTIFY \037password\037\002.)")
|
|
||||||
#define NICK_IS_SECURE _("This nickname is registered and protected. If it is your\n" \
|
|
||||||
"nick, type \002%s%s IDENTIFY \037password\037\002. Otherwise,\n" \
|
|
||||||
"please choose a different nick.")
|
|
||||||
#define FORCENICKCHANGE_NOW _("This nickname has been registered; you may not use it.")
|
|
||||||
#define NICK_CANNOT_BE_REGISTERED _("Nickname \002%s\002 may not be registered.")
|
|
||||||
#define NICK_ALREADY_REGISTERED _("Nickname \002%s\002 is already registered!")
|
|
||||||
#define NICK_SET_DISPLAY_CHANGED _("The new display is now \002%s\002.")
|
|
||||||
#define NICK_CONFIRM_INVALID _("Invalid passcode has been entered, please check the e-mail again, and retry.")
|
|
||||||
#define CHAN_NOT_ALLOWED_TO_JOIN _("You are not permitted to be on this channel.")
|
|
||||||
#define CHAN_X_INVALID _("Channel %s is not a valid channel.")
|
|
||||||
#define CHAN_REACHED_CHANNEL_LIMIT _("Sorry, you have already reached your limit of \002%d\002 channels.")
|
|
||||||
#define CHAN_EXCEEDED_CHANNEL_LIMIT _("Sorry, you have already exceeded your limit of \002%d\002 channels.")
|
|
||||||
#define CHAN_SYMBOL_REQUIRED _("Please use the symbol of \002#\002 when attempting to register.")
|
|
||||||
#define CHAN_SETTING_CHANGED _("%s for %s set to %s.")
|
|
||||||
#define CHAN_SETTING_UNSET _("%s for %s unset.")
|
|
||||||
#define CHAN_ACCESS_LEVEL_RANGE _("Access level must be between %d and %d inclusive.")
|
|
||||||
#define CHAN_INFO_HEADER _("Information for channel \002%s\002:")
|
|
||||||
#define CHAN_EXCEPTED _("\002%s\002 matches an except on %s and cannot be banned until the except has been removed.")
|
|
||||||
#define MEMO_NEW_X_MEMO_ARRIVED _("There is a new memo on channel %s.\n" \
|
|
||||||
"Type \002%s%s READ %s %d\002 to read it.")
|
|
||||||
#define MEMO_NEW_MEMO_ARRIVED _("You have a new memo from %s.\n" \
|
|
||||||
"Type \002%s%s READ %d\002 to read it.")
|
|
||||||
#define MEMO_HAVE_NO_MEMOS _("You have no memos.")
|
|
||||||
#define MEMO_X_HAS_NO_MEMOS _("%s has no memos.")
|
|
||||||
#define MEMO_SEND_DISABLED _("Sorry, memo sending is temporarily disabled.")
|
|
||||||
#define MEMO_HAVE_NO_NEW_MEMOS _("You have no new memos.")
|
|
||||||
#define MEMO_X_HAS_NO_NEW_MEMOS _("%s has no new memos.")
|
|
||||||
#define BOT_DOES_NOT_EXIST _("Bot \002%s\002 does not exist.")
|
|
||||||
#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 HOST_SET_ERROR _("A vHost must be in the format of a valid hostname.")
|
|
||||||
#define HOST_SET_IDENT_ERROR _("A vHost ident must be in the format of a valid ident.")
|
|
||||||
#define HOST_SET_TOOLONG _("Error! The vHost is too long, please use a hostname shorter than %d characters.")
|
|
||||||
#define HOST_SET_IDENTTOOLONG _("Error! The vHost ident is too long, please use an ident shorter than %d characters.")
|
|
||||||
#define HOST_NOT_ASSIGNED _("Please contact an Operator to get a vHost assigned to this nick.")
|
|
||||||
#define HOST_NO_VIDENT _("Your IRCd does not support vIdent's, if this is incorrect, please report this as a possible bug")
|
|
||||||
@@ -1,94 +0,0 @@
|
|||||||
/*
|
|
||||||
*
|
|
||||||
* (C) 2003-2026 Anope Team
|
|
||||||
* Contact us at team@anope.org
|
|
||||||
*
|
|
||||||
* Please read COPYING and README for further details.
|
|
||||||
*
|
|
||||||
* Based on the original code of Epona by Lara.
|
|
||||||
* Based on the original code of Services by Andy Church.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef LISTS_H
|
|
||||||
#define LISTS_H
|
|
||||||
|
|
||||||
#include "services.h"
|
|
||||||
#include "anope.h"
|
|
||||||
|
|
||||||
/** A class to process numbered lists (passed to most DEL/LIST/VIEW commands).
|
|
||||||
* The function HandleNumber is called for every number in the list. Note that
|
|
||||||
* if descending is true it gets called in descending order. This is so deleting
|
|
||||||
* the index passed to the function from an array will not cause the other indexes
|
|
||||||
* passed to the function to be incorrect. This keeps us from having to have an
|
|
||||||
* 'in use' flag on everything.
|
|
||||||
*/
|
|
||||||
class CoreExport NumberList
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
bool is_valid;
|
|
||||||
|
|
||||||
std::set<unsigned> numbers;
|
|
||||||
|
|
||||||
bool desc;
|
|
||||||
public:
|
|
||||||
/** Processes a numbered list
|
|
||||||
* @param list The list
|
|
||||||
* @param descending True to make HandleNumber get called with numbers in descending order
|
|
||||||
*/
|
|
||||||
NumberList(const Anope::string &list, bool descending);
|
|
||||||
|
|
||||||
/** Destructor, does nothing
|
|
||||||
*/
|
|
||||||
virtual ~NumberList();
|
|
||||||
|
|
||||||
/** Should be called after the constructors are done running. This calls the callbacks.
|
|
||||||
*/
|
|
||||||
void Process();
|
|
||||||
|
|
||||||
/** Called with a number from the list
|
|
||||||
* @param number The number
|
|
||||||
*/
|
|
||||||
virtual void HandleNumber(unsigned number);
|
|
||||||
|
|
||||||
/** Called when there is an error with the numbered list
|
|
||||||
* Return false to immediately stop processing the list and return
|
|
||||||
* This is all done before we start calling HandleNumber, so no numbers will have been processed yet
|
|
||||||
* @param list The list
|
|
||||||
* @return false to stop processing
|
|
||||||
*/
|
|
||||||
virtual bool InvalidRange(const Anope::string &list);
|
|
||||||
};
|
|
||||||
|
|
||||||
/** This class handles formatting LIST/VIEW replies.
|
|
||||||
*/
|
|
||||||
class CoreExport ListFormatter
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
typedef std::map<Anope::string, Anope::string> ListEntry;
|
|
||||||
private:
|
|
||||||
NickCore *nc;
|
|
||||||
std::vector<Anope::string> columns;
|
|
||||||
std::vector<ListEntry> entries;
|
|
||||||
public:
|
|
||||||
ListFormatter(NickCore *nc);
|
|
||||||
ListFormatter &AddColumn(const Anope::string &name);
|
|
||||||
void AddEntry(const ListEntry &entry);
|
|
||||||
bool IsEmpty() const;
|
|
||||||
void Process(std::vector<Anope::string> &);
|
|
||||||
};
|
|
||||||
|
|
||||||
/** This class handles formatting INFO replies
|
|
||||||
*/
|
|
||||||
class CoreExport InfoFormatter
|
|
||||||
{
|
|
||||||
NickCore *nc;
|
|
||||||
std::vector<std::pair<Anope::string, Anope::string> > replies;
|
|
||||||
unsigned longest;
|
|
||||||
public:
|
|
||||||
InfoFormatter(NickCore *nc);
|
|
||||||
void Process(std::vector<Anope::string> &);
|
|
||||||
Anope::string &operator[](const Anope::string &key);
|
|
||||||
void AddOption(const Anope::string &opt);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // LISTS_H
|
|
||||||
@@ -1,144 +0,0 @@
|
|||||||
/*
|
|
||||||
*
|
|
||||||
* (C) 2003-2026 Anope Team
|
|
||||||
* Contact us at team@anope.org
|
|
||||||
*
|
|
||||||
* Please read COPYING and README for further details.
|
|
||||||
*
|
|
||||||
* Based on the original code of Epona by Lara.
|
|
||||||
* Based on the original code of Services by Andy Church.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef LOGGER_H
|
|
||||||
#define LOGGER_H
|
|
||||||
|
|
||||||
#include "anope.h"
|
|
||||||
#include "defs.h"
|
|
||||||
|
|
||||||
enum LogType
|
|
||||||
{
|
|
||||||
/* Used whenever an administrator uses an administrative command */
|
|
||||||
LOG_ADMIN,
|
|
||||||
/* Used whenever an administrator overrides something, such as adding
|
|
||||||
* access to a channel where they don't have permission to.
|
|
||||||
*/
|
|
||||||
LOG_OVERRIDE,
|
|
||||||
/* Any other command usage */
|
|
||||||
LOG_COMMAND,
|
|
||||||
LOG_SERVER,
|
|
||||||
LOG_CHANNEL,
|
|
||||||
LOG_USER,
|
|
||||||
LOG_MODULE,
|
|
||||||
LOG_NORMAL,
|
|
||||||
LOG_TERMINAL,
|
|
||||||
LOG_RAWIO,
|
|
||||||
LOG_DEBUG,
|
|
||||||
LOG_DEBUG_2,
|
|
||||||
LOG_DEBUG_3,
|
|
||||||
LOG_DEBUG_4
|
|
||||||
};
|
|
||||||
|
|
||||||
struct LogFile
|
|
||||||
{
|
|
||||||
Anope::string filename;
|
|
||||||
std::ofstream stream;
|
|
||||||
|
|
||||||
LogFile(const Anope::string &name);
|
|
||||||
~LogFile();
|
|
||||||
const Anope::string &GetName() const;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Represents a single log message */
|
|
||||||
class CoreExport Log
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
/* Bot that should log this message */
|
|
||||||
BotInfo *bi;
|
|
||||||
/* For commands, the user executing the command, but might not always exist */
|
|
||||||
User *u;
|
|
||||||
/* For commands, the account executing the command, but will not always exist */
|
|
||||||
NickCore *nc;
|
|
||||||
/* For commands, the command being executed */
|
|
||||||
Command *c;
|
|
||||||
/* For commands, the command source */
|
|
||||||
CommandSource *source;
|
|
||||||
/* Used for LOG_CHANNEL */
|
|
||||||
Channel *chan;
|
|
||||||
/* For commands, the channel the command was executed on, will not always exist */
|
|
||||||
const ChannelInfo *ci;
|
|
||||||
/* For LOG_SERVER */
|
|
||||||
Server *s;
|
|
||||||
/* For LOG_MODULE */
|
|
||||||
Module *m;
|
|
||||||
LogType type;
|
|
||||||
Anope::string category;
|
|
||||||
|
|
||||||
std::stringstream buf;
|
|
||||||
|
|
||||||
Log(LogType type = LOG_NORMAL, const Anope::string &category = "", BotInfo *bi = NULL);
|
|
||||||
|
|
||||||
/* LOG_COMMAND/OVERRIDE/ADMIN */
|
|
||||||
Log(LogType type, CommandSource &source, Command *c, ChannelInfo *ci = NULL);
|
|
||||||
|
|
||||||
/* LOG_CHANNEL */
|
|
||||||
Log(User *u, Channel *c, const Anope::string &category = "");
|
|
||||||
|
|
||||||
/* LOG_USER */
|
|
||||||
Log(User *u, const Anope::string &category = "", BotInfo *bi = NULL);
|
|
||||||
|
|
||||||
/* LOG_SERVER */
|
|
||||||
Log(Server *s, const Anope::string &category = "", BotInfo *bi = NULL);
|
|
||||||
|
|
||||||
Log(BotInfo *b, const Anope::string &category = "");
|
|
||||||
|
|
||||||
Log(Module *m, const Anope::string &category = "", BotInfo *bi = NULL);
|
|
||||||
|
|
||||||
~Log();
|
|
||||||
|
|
||||||
private:
|
|
||||||
Anope::string FormatSource() const;
|
|
||||||
Anope::string FormatCommand() const;
|
|
||||||
|
|
||||||
public:
|
|
||||||
Anope::string BuildPrefix() const;
|
|
||||||
|
|
||||||
template<typename T> Log &operator<<(T val)
|
|
||||||
{
|
|
||||||
this->buf << val;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Configured in the configuration file, actually does the message logging */
|
|
||||||
class CoreExport LogInfo
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
BotInfo *bot;
|
|
||||||
std::vector<Anope::string> targets;
|
|
||||||
std::vector<LogFile *> logfiles;
|
|
||||||
int last_day;
|
|
||||||
std::vector<Anope::string> sources;
|
|
||||||
int log_age;
|
|
||||||
std::vector<Anope::string> admin;
|
|
||||||
std::vector<Anope::string> override;
|
|
||||||
std::vector<Anope::string> commands;
|
|
||||||
std::vector<Anope::string> servers;
|
|
||||||
std::vector<Anope::string> users;
|
|
||||||
std::vector<Anope::string> channels;
|
|
||||||
std::vector<Anope::string> normal;
|
|
||||||
bool raw_io;
|
|
||||||
bool debug;
|
|
||||||
|
|
||||||
LogInfo(int logage, bool rawio, bool debug);
|
|
||||||
|
|
||||||
~LogInfo();
|
|
||||||
|
|
||||||
void OpenLogFiles();
|
|
||||||
|
|
||||||
bool HasType(LogType ltype, const Anope::string &type) const;
|
|
||||||
|
|
||||||
/* Logs the message l if configured to */
|
|
||||||
void ProcessMessage(const Log *l);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // LOGGER_H
|
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
/*
|
|
||||||
*
|
|
||||||
* (C) 2003-2026 Anope Team
|
|
||||||
* Contact us at team@anope.org
|
|
||||||
*
|
|
||||||
* Please read COPYING and README for further details.
|
|
||||||
*
|
|
||||||
* Based on the original code of Epona by Lara.
|
|
||||||
* Based on the original code of Services by Andy Church.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef MAIL_H
|
|
||||||
#define MAIL_H
|
|
||||||
|
|
||||||
#include "anope.h"
|
|
||||||
#include "threadengine.h"
|
|
||||||
#include "serialize.h"
|
|
||||||
|
|
||||||
namespace Mail
|
|
||||||
{
|
|
||||||
extern CoreExport bool Send(User *from, NickCore *to, BotInfo *service, const Anope::string &subject, const Anope::string &message);
|
|
||||||
extern CoreExport bool Send(NickCore *to, const Anope::string &subject, const Anope::string &message);
|
|
||||||
extern CoreExport bool Validate(const Anope::string &email);
|
|
||||||
|
|
||||||
/* A email message being sent */
|
|
||||||
class Message : public Thread
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
Anope::string error;
|
|
||||||
Anope::string sendmail_path;
|
|
||||||
Anope::string send_from;
|
|
||||||
Anope::string mail_to;
|
|
||||||
Anope::string addr;
|
|
||||||
Anope::string subject;
|
|
||||||
Anope::string message;
|
|
||||||
Anope::string content_type;
|
|
||||||
bool dont_quote_addresses;
|
|
||||||
|
|
||||||
public:
|
|
||||||
/** Construct this message. Once constructed call Thread::Start to launch the mail sending.
|
|
||||||
* @param sf Config->SendFrom
|
|
||||||
* @param mailto Name of person being mailed (u->nick, nc->display, etc)
|
|
||||||
* @param addr Destination address to mail
|
|
||||||
* @param subject Message subject
|
|
||||||
* @param message The actual message
|
|
||||||
*/
|
|
||||||
Message(const Anope::string &sf, const Anope::string &mailto, const Anope::string &addr, const Anope::string &subject, const Anope::string &message);
|
|
||||||
|
|
||||||
~Message();
|
|
||||||
|
|
||||||
/* Called from within the thread to actually send the mail */
|
|
||||||
void Run() anope_override;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace Mail
|
|
||||||
|
|
||||||
#endif // MAIL_H
|
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
# Make file for Win32
|
||||||
|
#
|
||||||
|
# (C) 2003-2014 Anope Team
|
||||||
|
# Contact us at team@anope.org
|
||||||
|
#
|
||||||
|
# Please read COPYING and README for further details.
|
||||||
|
#
|
||||||
|
# Based on the original code of Epona by Lara.
|
||||||
|
# Based on the original code of Services by Andy Church.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
clean:
|
||||||
|
-@erase language.h
|
||||||
|
|
||||||
|
spotless: clean
|
||||||
|
-@erase sysconf.h version.h
|
||||||
|
|
||||||
|
distclean: spotless
|
||||||
|
|
||||||
|
|
||||||
|
FRC:
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user