mirror of
https://github.com/anope/anope.git
synced 2026-07-08 20:33:12 +02:00
Compare commits
69 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 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
|
||||||
| /_\ | _ __ _ _ _ _ ___
|
| /_\ | _ __ _ _ _ _ ___
|
||||||
| _ || '_ \/ _ \/ _ \ / _ \
|
| _ || '_ \/ _ \/ _ \ / _ \
|
||||||
| | | || | | |_| |_| | __/
|
| | | || | | |_| |_| | __/
|
||||||
@@ -7,13 +7,12 @@
|
|||||||
| |
|
| |
|
||||||
|_| IRC Services
|
|_| IRC Services
|
||||||
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,26 +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 -->
|
|
||||||
@@ -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.anope.org #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,59 +0,0 @@
|
|||||||
name: Alpine CI
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
push:
|
|
||||||
schedule:
|
|
||||||
- cron: '0 0 * * 0'
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
if: "!contains(github.event.head_commit.message, '[skip alpine ci]')"
|
|
||||||
container: alpine:edge
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
env:
|
|
||||||
CXX: ${{ matrix.compiler }}
|
|
||||||
CXXFLAGS: -Werror
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: |
|
|
||||||
echo "http://dl-cdn.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories
|
|
||||||
apk update
|
|
||||||
apk add \
|
|
||||||
argon2-dev \
|
|
||||||
clang \
|
|
||||||
cmake \
|
|
||||||
g++ \
|
|
||||||
gettext \
|
|
||||||
git \
|
|
||||||
gnutls-dev \
|
|
||||||
mariadb-dev \
|
|
||||||
openldap-dev \
|
|
||||||
openssl-dev \
|
|
||||||
pcre2-dev \
|
|
||||||
samurai \
|
|
||||||
sqlite-dev \
|
|
||||||
tre-dev
|
|
||||||
|
|
||||||
- name: Enable extras
|
|
||||||
run: |
|
|
||||||
for MODULE in enc_argon2 enc_posix ldap mysql regex_pcre2 regex_posix regex_tre sqlite ssl_gnutls ssl_openssl
|
|
||||||
do
|
|
||||||
ln -s $PWD/modules/extra/$MODULE.cpp $PWD/modules
|
|
||||||
done
|
|
||||||
|
|
||||||
- name: Run CMake
|
|
||||||
run: |
|
|
||||||
mkdir build && cd build
|
|
||||||
cmake -GNinja -DCMAKE_BUILD_TYPE:STRING=DEBUG -DINSTDIR:STRING=$(readlink -f ../run) ..
|
|
||||||
|
|
||||||
- name: Build Anope
|
|
||||||
run: |
|
|
||||||
ninja -C build install
|
|
||||||
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
compiler:
|
|
||||||
- clang++
|
|
||||||
- g++
|
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
name: Ubuntu CI
|
|
||||||
on:
|
|
||||||
- pull_request
|
|
||||||
- push
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
if: "!contains(github.event.head_commit.message, '[skip ubuntu ci]')"
|
|
||||||
runs-on: ubuntu-20.04
|
|
||||||
env:
|
|
||||||
CXX: ${{ matrix.compiler }}
|
|
||||||
CXXFLAGS: -Werror
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: |
|
|
||||||
sudo apt-get update --assume-yes
|
|
||||||
sudo apt-get install --assume-yes --no-install-recommends \
|
|
||||||
clang \
|
|
||||||
g++ \
|
|
||||||
gettext \
|
|
||||||
git \
|
|
||||||
libargon2-dev \
|
|
||||||
libgnutls28-dev \
|
|
||||||
libldap2-dev \
|
|
||||||
libmysqlclient-dev \
|
|
||||||
libpcre2-dev \
|
|
||||||
libsqlite3-dev \
|
|
||||||
libssl-dev \
|
|
||||||
libtre-dev \
|
|
||||||
ninja-build
|
|
||||||
|
|
||||||
- name: Enable extras
|
|
||||||
run: |
|
|
||||||
for MODULE in enc_argon2 enc_posix ldap mysql regex_pcre2 regex_posix regex_tre sqlite ssl_gnutls ssl_openssl
|
|
||||||
do
|
|
||||||
ln -s ${{ github.workspace }}/modules/extra/$MODULE.cpp ${{ 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++
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
name: Windows CI
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
push:
|
|
||||||
release:
|
|
||||||
types:
|
|
||||||
- published
|
|
||||||
schedule:
|
|
||||||
- cron: '0 0 * * 0'
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
if: "!contains(github.event.head_commit.message, '[skip windows ci]')"
|
|
||||||
runs-on: windows-2019
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Setup MSBuild
|
|
||||||
uses: microsoft/setup-msbuild@v2
|
|
||||||
|
|
||||||
- name: Setup Conan
|
|
||||||
uses: turtlebrowser/get-conan@v1.2
|
|
||||||
with:
|
|
||||||
version: 1.64.0
|
|
||||||
|
|
||||||
- name: Install libraries
|
|
||||||
run: |
|
|
||||||
conan install ${{ github.workspace }}\src\win32 --build=missing
|
|
||||||
|
|
||||||
- name: Run CMake
|
|
||||||
run: |
|
|
||||||
mkdir ${{ github.workspace }}\build
|
|
||||||
cd ${{ github.workspace }}\build
|
|
||||||
cmake -A "x64" -D "CMAKE_BUILD_TYPE=${{ github.event_name == 'release' && 'Release' || 'Debug' }}" -G "Visual Studio 16 2019" ..
|
|
||||||
|
|
||||||
- name: Build Anope
|
|
||||||
working-directory: ${{ github.workspace }}\build
|
|
||||||
run: |
|
|
||||||
msbuild PACKAGE.vcxproj /M:3 /P:Configuration=${{ github.event_name == 'release' && 'Release' || 'Debug' }} /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)
|
|
||||||
-16
@@ -1,16 +0,0 @@
|
|||||||
build/
|
|
||||||
config.cache
|
|
||||||
include/sysconf.h
|
|
||||||
modules/enc_argon2.cpp
|
|
||||||
modules/enc_posix.cpp
|
|
||||||
modules/ldap.cpp
|
|
||||||
modules/mysql.cpp
|
|
||||||
modules/regex_pcre2.cpp
|
|
||||||
modules/regex_posix.cpp
|
|
||||||
modules/regex_tre.cpp
|
|
||||||
modules/sqlite.cpp
|
|
||||||
modules/ssl_gnutls.cpp
|
|
||||||
modules/ssl_openssl.cpp
|
|
||||||
modules/stats
|
|
||||||
run/
|
|
||||||
*.mo
|
|
||||||
@@ -1,50 +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> <robbeh@5417fbe8-f217-4b02-8779-1006273d7864>
|
|
||||||
David Robson <rob@anope.org> <rob rob@31f1291d-b8d6-0310-a050-a5561fc1590b@5417fbe8-f217-4b02-8779-1006273d7864>
|
|
||||||
Dennis Friis <peavey@inspircd.org> <peavey peavey@inspircd.org@5417fbe8-f217-4b02-8779-1006273d7864>
|
|
||||||
Fabio Scotoni <cculex@gmail.com>
|
|
||||||
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>
|
|
||||||
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 Voß <jens@pyrobook.(none)>
|
|
||||||
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 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>
|
|
||||||
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>
|
|
||||||
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@witchery.services> Peter Powell <petpow@saberuk.com>
|
|
||||||
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>
|
|
||||||
-419
@@ -1,419 +0,0 @@
|
|||||||
# This usage of CMake requires at least version 3.8
|
|
||||||
cmake_minimum_required(VERSION 3.8 FATAL_ERROR)
|
|
||||||
|
|
||||||
# Set the project as C++ primarily, but have C enabled for the checks required later
|
|
||||||
project(Anope CXX)
|
|
||||||
enable_language(C)
|
|
||||||
|
|
||||||
# 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)
|
|
||||||
|
|
||||||
# We require C++17 to build
|
|
||||||
set(CMAKE_CXX_EXTENSIONS OFF)
|
|
||||||
set(CMAKE_CXX_STANDARD 17)
|
|
||||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|
||||||
|
|
||||||
# Put modules in their own folder
|
|
||||||
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
|
||||||
|
|
||||||
# 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()
|
|
||||||
set(LIBRARIES "${LINE}")
|
|
||||||
endif()
|
|
||||||
# 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)
|
|
||||||
list(APPEND DEFAULT_LIBRARY_DIRS ${LIBRARY})
|
|
||||||
endif()
|
|
||||||
endforeach()
|
|
||||||
# Remove duplicate entries from the list
|
|
||||||
if(DEFAULT_LIBRARY_DIRS)
|
|
||||||
list(REMOVE_DUPLICATES DEFAULT_LIBRARY_DIRS)
|
|
||||||
endif()
|
|
||||||
# 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()
|
|
||||||
# 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()
|
|
||||||
# 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
|
|
||||||
list(APPEND DEFAULT_INCLUDE_DIRS ${INCLUDE})
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
endforeach()
|
|
||||||
# Remove duplicate entries from the list
|
|
||||||
if(DEFAULT_INCLUDE_DIRS)
|
|
||||||
list(REMOVE_DUPLICATES DEFAULT_INCLUDE_DIRS)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# 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()
|
|
||||||
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()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# 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()
|
|
||||||
|
|
||||||
# Include the checking functions used later in this CMakeLists.txt
|
|
||||||
include(CheckFunctionExists)
|
|
||||||
include(CheckTypeSize)
|
|
||||||
include(CheckLibraryExists)
|
|
||||||
include(CheckCXXCompilerFlag)
|
|
||||||
|
|
||||||
# If extra include directories were specified, tell cmake about them.
|
|
||||||
if(EXTRA_INCLUDE)
|
|
||||||
include_directories(${EXTRA_INCLUDE})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# If extra library directories were specified, tell cmake about them.
|
|
||||||
if(EXTRA_LIBS)
|
|
||||||
link_directories(${EXTRA_LIBS})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# setup conan
|
|
||||||
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/conanbuildinfo.cmake")
|
|
||||||
include("${CMAKE_CURRENT_SOURCE_DIR}/conanbuildinfo.cmake")
|
|
||||||
conan_basic_setup()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Find gettext
|
|
||||||
find_package(Gettext)
|
|
||||||
find_package(Intl)
|
|
||||||
if(GETTEXT_FOUND AND Intl_FOUND)
|
|
||||||
set(HAVE_LOCALIZATION ON)
|
|
||||||
include_directories(${Intl_INCLUDE_DIRS})
|
|
||||||
else()
|
|
||||||
message("Unable to find gettext and libintl; disabling localization")
|
|
||||||
set(HAVE_LOCALIZATION OFF)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Use the following directories as includes
|
|
||||||
include_directories(
|
|
||||||
${Anope_BINARY_DIR}/include
|
|
||||||
${Anope_SOURCE_DIR}/include
|
|
||||||
${Anope_SOURCE_DIR}/vendor
|
|
||||||
)
|
|
||||||
|
|
||||||
# Pass on REPRODUCIBLE_BUILD
|
|
||||||
if(REPRODUCIBLE_BUILD)
|
|
||||||
add_definitions(-DREPRODUCIBLE_BUILD)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(WIN32)
|
|
||||||
# If using Windows, include the windows specific folder for anope_windows.h
|
|
||||||
include_directories(${Anope_SOURCE_DIR}/src/win32)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# 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 /wd4267 /wd4275 /wd4355 /wd4706 /wd4800 /wd4996 /EHs")
|
|
||||||
add_definitions(-D_CRT_SECURE_NO_WARNINGS)
|
|
||||||
# Otherwise, we're not using Visual Studio
|
|
||||||
else()
|
|
||||||
# Set the compile flags to have all warnings on (including shadowed variables)
|
|
||||||
set(CXXFLAGS "${CXXFLAGS} -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wextra -Wformat=2 -Wmissing-format-attribute -Wpedantic -Wno-format-nonliteral -Wno-format-zero-length -Wno-unused-parameter ${CMAKE_CXX_FLAGS}")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# 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)
|
|
||||||
list(APPEND LINK_LIBS ${CMAKE_DL_LIBS})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Find the linker flags required for using threads.
|
|
||||||
find_package("Threads" REQUIRED)
|
|
||||||
if(CMAKE_THREAD_LIBS_INIT)
|
|
||||||
list(APPEND LINK_LIBS ${CMAKE_THREAD_LIBS_INIT})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# 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()
|
|
||||||
|
|
||||||
if(NOT PROGRAM_NAME)
|
|
||||||
set(PROGRAM_NAME anope)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# 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
|
|
||||||
check_cxx_compiler_flag(-pipe HAVE_PIPE_FLAG)
|
|
||||||
# If the flag was accepted, add it to the list of flags
|
|
||||||
if(HAVE_PIPE_FLAG)
|
|
||||||
set(CXXFLAGS "${CXXFLAGS} -pipe")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# 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()
|
|
||||||
set(DEFUMASK "077")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Set the DEBUG_BUILD for sysconf.h
|
|
||||||
if(CMAKE_BUILD_TYPE STREQUAL "DEBUG" OR CMAKE_BUILD_TYPE STREQUAL "RELWITHDEBINFO")
|
|
||||||
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
|
||||||
set(DEBUG_BUILD TRUE)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Check for the existence of the following functions
|
|
||||||
check_function_exists(clock_gettime HAVE_CLOCK_GETTIME)
|
|
||||||
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)
|
|
||||||
string(STRIP ${CXXFLAGS} CXXFLAGS)
|
|
||||||
endif()
|
|
||||||
# Strip the leading and trailing spaces from the linker flags
|
|
||||||
if(LDFLAGS)
|
|
||||||
string(STRIP ${LDFLAGS} LDFLAGS)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Search for the following programs
|
|
||||||
if(NOT WIN32 AND RUNGROUP)
|
|
||||||
find_program(CHGRP "chgrp" REQUIRED)
|
|
||||||
find_program(CHMOD "chmod" REQUIRED)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# If a INSTDIR was passed in to CMake, use it as the install prefix, otherwise set the default install prefix to the anope 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}/anope")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Set default paths for various directories if not already defined
|
|
||||||
if(NOT BIN_DIR)
|
|
||||||
set(BIN_DIR "bin")
|
|
||||||
endif()
|
|
||||||
if(NOT DATA_DIR)
|
|
||||||
set(DATA_DIR "data")
|
|
||||||
endif()
|
|
||||||
if(NOT DOC_DIR)
|
|
||||||
set(DOC_DIR "doc")
|
|
||||||
endif()
|
|
||||||
if(NOT CONF_DIR)
|
|
||||||
set(CONF_DIR "conf")
|
|
||||||
endif()
|
|
||||||
if(NOT MODULE_DIR)
|
|
||||||
set(MODULE_DIR "modules")
|
|
||||||
endif()
|
|
||||||
if(NOT LOCALE_DIR)
|
|
||||||
set(LOCALE_DIR "locale")
|
|
||||||
endif()
|
|
||||||
if(NOT LOG_DIR)
|
|
||||||
set(LOG_DIR "logs")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Version number processing
|
|
||||||
# Find all lines in src/version.sh that start with VERSION_
|
|
||||||
file(STRINGS ${Anope_SOURCE_DIR}/src/version.sh VERSIONS REGEX "^VERSION_")
|
|
||||||
# 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()
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
# 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
|
|
||||||
file(STRINGS ${Anope_SOURCE_DIR}/src/version.sh VERSIONS REGEX "^#define VERSION_BUILD")
|
|
||||||
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()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# 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()
|
|
||||||
|
|
||||||
# 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()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# 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)
|
|
||||||
|
|
||||||
# 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
|
|
||||||
get_filename_component(ABSOLUTE_DATA_DIR ${DATA_DIR} REALPATH BASE_DIR ${CMAKE_INSTALL_PREFIX})
|
|
||||||
get_filename_component(ABSOLUTE_LOG_DIR ${LOG_DIR} REALPATH BASE_DIR ${CMAKE_INSTALL_PREFIX})
|
|
||||||
install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${ABSOLUTE_DATA_DIR}/backups\")")
|
|
||||||
install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${ABSOLUTE_LOG_DIR}\")")
|
|
||||||
if(WIN32)
|
|
||||||
install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${ABSOLUTE_DATA_DIR}/runtime\")")
|
|
||||||
endif()
|
|
||||||
# On non-Windows platforms, if RUNGROUP is set, change the permissions of the below directories, as well as the group of the data directory
|
|
||||||
if(NOT WIN32 AND RUNGROUP)
|
|
||||||
install(CODE "execute_process(COMMAND ${CHMOD} 2775 \"\$ENV{DESTDIR}${ABSOLUTE_DATA_DIR}/backups\")")
|
|
||||||
install(CODE "execute_process(COMMAND ${CHMOD} 2775 \"\$ENV{DESTDIR}${ABSOLUTE_LOG_DIR}\")")
|
|
||||||
install(CODE "execute_process(COMMAND ${CHGRP} -R ${RUNGROUP} \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}\")")
|
|
||||||
endif()
|
|
||||||
# On Windows platforms, install extra files
|
|
||||||
if(WIN32)
|
|
||||||
install(FILES ${Anope_SOURCE_DIR}/src/win32/anope.bat
|
|
||||||
DESTINATION ${BIN_DIR}
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
get_filename_component(ABSOLUTE_MODULE_DIR ${MODULE_DIR} REALPATH BASE_DIR ${CMAKE_INSTALL_PREFIX})
|
|
||||||
install(CODE "file(REMOVE_RECURSE \"$ENV{DESTDIR}${ABSOLUTE_MODULE_DIR}\")")
|
|
||||||
|
|
||||||
# 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()
|
|
||||||
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()
|
|
||||||
+842
@@ -0,0 +1,842 @@
|
|||||||
|
Anope Version 1.8 SVN
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
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 **
|
||||||
+577
@@ -0,0 +1,577 @@
|
|||||||
|
Anope Version 1.8 SVN
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
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:
|
||||||
+140
@@ -0,0 +1,140 @@
|
|||||||
|
Anope Version 1.8 SVN
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
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'
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
#
|
#
|
||||||
# Configuration script for Anope.
|
# Configuration script for Services.
|
||||||
#
|
#
|
||||||
# Anope (C) 2003-2024 Anope Team
|
# Anope (c) 2003-2007 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,98 +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 [ "$EXTRA_INCLUDE_DIRS" != "" ] ; then
|
if [ "$MYSQL" != "yes" ] ; then
|
||||||
EXTRA_INCLUDE="-DEXTRA_INCLUDE:STRING=$EXTRA_INCLUDE_DIRS"
|
WITH_MYSQL=" --without-mysql"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$EXTRA_LIB_DIRS" != "" ] ; then
|
|
||||||
EXTRA_LIBS="-DEXTRA_LIBS:STRING=$EXTRA_LIB_DIRS"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$SOURCE_DIR" = "." ] ; then
|
echo "./configure $WITH_BIN $WITH_DATA $WITH_ENC $WITH_RUN $WITH_PERM $WITH_MYSQL"
|
||||||
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 $EXTRA_INCLUDE $EXTRA_LIBS $EXTRA_CONFIG_ARGS $REAL_SOURCE_DIR"
|
./configure $WITH_BIN $WITH_DATA $WITH_ENC $WITH_RUN $WITH_PERM $WITH_MYSQL
|
||||||
|
|
||||||
cmake $GEN_TYPE $WITH_INST $WITH_RUN $WITH_PERM $BUILD_TYPE $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
|
||||||
|
|
||||||
@@ -113,81 +88,60 @@ export ECHO2 ECHO2SUF
|
|||||||
# Init values
|
# Init values
|
||||||
###########################################################################
|
###########################################################################
|
||||||
|
|
||||||
INSTDIR=$HOME/anope
|
BINDEST=$HOME/services
|
||||||
|
DATDEST=$HOME/services
|
||||||
RUNGROUP=
|
RUNGROUP=
|
||||||
UMASK=
|
UMASK=
|
||||||
DEBUG="no"
|
IRCTYPE="no default"
|
||||||
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 3.8 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
|
||||||
export MORE='-e'
|
clear
|
||||||
. $SOURCE_DIR/src/version.sh
|
. ./version.log
|
||||||
cat $SOURCE_DIR/.BANNER | sed "s/CURVER/$VERSION_MAJOR.$VERSION_MINOR.$VERSION_PATCH$VERSION_EXTRA/" | sed "s@SOURCE_DIR@$SOURCE_DIR@" | more
|
cat .BANNER | sed "s/CURVER/$VERSION_MAJOR.$VERSION_MINOR.$VERSION_PATCH$VERSION_EXTRA/" | more
|
||||||
echo ""
|
echo ""
|
||||||
else
|
else
|
||||||
echo ""
|
echo ""
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "Beginning Anope configuration."
|
echo "Beginning Services configuration."
|
||||||
echo ""
|
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.
|
||||||
@@ -197,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
|
||||||
@@ -218,159 +173,153 @@ while [ $ok -eq 0 ] ; do
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
elif exists "$INPUT/include/services.h" ; then
|
elif exists "$INPUT/include/services.h" ; then
|
||||||
echo "You cannot use the Anope source directory as a target directory."
|
echo "You cannot use the Services source directory as a target directory."
|
||||||
else
|
else
|
||||||
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 Anope data files be owned by? (If Anope"
|
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 Anope data files be owned by? (If Anope"
|
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 ""
|
||||||
|
|
||||||
####
|
####
|
||||||
|
|
||||||
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"
|
||||||
EXTRA_INCLUDE_DIRS="$EXTRA_INCLUDE_DIRS"
|
IRCTYPE_DEF="$IRCTYPE_DEF"
|
||||||
EXTRA_LIB_DIRS="$EXTRA_LIB_DIRS"
|
MYSQL="$MYSQL"
|
||||||
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-2009 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 cscript /nologo install.js 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.anope.org
|
|
||||||
|
|
||||||
## 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 ~/anope/`
|
|
||||||
|
|
||||||
### Windows
|
|
||||||
Download the latest release off of the [releases page](https://github.com/anope/anope/releases) and run the installer.
|
|
||||||
|
|
||||||
|
|
||||||
## Configuration
|
|
||||||
|
|
||||||
Copy conf/anope.example.conf to conf/anope.conf
|
|
||||||
|
|
||||||
```
|
|
||||||
$ cp conf/anope.example.conf conf/anope.conf
|
|
||||||
```
|
|
||||||
|
|
||||||
Edit anope.conf, configuring the uplink, serverinfo, and protocol module configurations. Example link blocks for popular IRCds are included in the anope.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.anope.org](irc://irc.anope.org/#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 `anope.conf` to include the new file.
|
|
||||||
|
|
||||||
## Running
|
|
||||||
|
|
||||||
Run `$ ./bin/anope` to start Anope. If asked to provide logs for support, use the `--support` flag, e.g.: `$ ./bin/anope --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,106 +0,0 @@
|
|||||||
###############################################################################
|
|
||||||
# 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)
|
|
||||||
file(STRINGS ${SRC} REQUIRED_LIBRARIES REGEX "/\\*[ \t]*RequiredWindowsLibraries:[ \t]*.*[ \t]*\\*/")
|
|
||||||
else()
|
|
||||||
file(STRINGS ${SRC} REQUIRED_LIBRARIES REGEX "/\\*[ \t]*RequiredLibraries:[ \t]*.*[ \t]*\\*/")
|
|
||||||
endif()
|
|
||||||
# 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()
|
|
||||||
# Locate the library to see if it exists
|
|
||||||
if(DEFAULT_LIBRARY_DIRS OR DEFINED $ENV{VCINSTALLDIR})
|
|
||||||
find_library(FOUND_${LIBRARY}_LIBRARY NAMES ${LIBRARY} ${LIBRARY_ALT} PATHS ${DEFAULT_LIBRARY_DIRS} $ENV{VCINSTALLDIR}/lib ${EXTRA_INCLUDE} ${EXTRA_LIBS})
|
|
||||||
else()
|
|
||||||
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()
|
|
||||||
# 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
|
|
||||||
list(APPEND EXTRA_DEPENDENCIES "${FOUND_${LIBRARY}_LIBRARY}")
|
|
||||||
else()
|
|
||||||
# Get the path only of the library, to add it to library paths.
|
|
||||||
get_filename_component(LIBRARY_PATH ${FOUND_${LIBRARY}_LIBRARY} PATH)
|
|
||||||
list(APPEND 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})
|
|
||||||
list(APPEND LIBRARIES ${LIBRARY_NAME})
|
|
||||||
endif()
|
|
||||||
else()
|
|
||||||
# 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()
|
|
||||||
endforeach()
|
|
||||||
endforeach()
|
|
||||||
# Remove duplicates from the library paths
|
|
||||||
if(LIBRARY_PATHS)
|
|
||||||
list(REMOVE_DUPLICATES LIBRARY_PATHS)
|
|
||||||
endif()
|
|
||||||
# Remove diplicates from the libraries
|
|
||||||
if(LIBRARIES)
|
|
||||||
list(REMOVE_DUPLICATES LIBRARIES)
|
|
||||||
endif()
|
|
||||||
# Iterate through library paths and add them to the linker flags
|
|
||||||
foreach(LIBRARY_PATH ${LIBRARY_PATHS})
|
|
||||||
if(NOT "${LIBRARY_PATH}" IN_LIST DEFAULT_LIBRARY_DIRS)
|
|
||||||
set(THIS_LDFLAGS "${THIS_LDFLAGS} -L${LIBRARY_PATH}")
|
|
||||||
endif()
|
|
||||||
endforeach()
|
|
||||||
# Iterate through libraries and add them to the linker flags
|
|
||||||
foreach(LIBRARY ${LIBRARIES})
|
|
||||||
list(APPEND EXTRA_DEPENDENCIES "${LIBRARY}")
|
|
||||||
endforeach()
|
|
||||||
set(${SRC_LDFLAGS} "${THIS_LDFLAGS}")
|
|
||||||
set(${EXTRA_DEPENDS} "${EXTRA_DEPENDENCIES}")
|
|
||||||
endmacro()
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
# 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()
|
|
||||||
# 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()
|
|
||||||
set(ENV{CPACK_IGNORED_FILES} "${REAL_ITEM}")
|
|
||||||
endif()
|
|
||||||
endmacro()
|
|
||||||
@@ -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
|
|
||||||
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
+304
@@ -0,0 +1,304 @@
|
|||||||
|
dnl autoconf.in for Services.
|
||||||
|
dnl
|
||||||
|
dnl Anope (c) 2003-2007 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"
|
||||||
|
echo $ECHO_N "checking if mysql_config produces valid values... $ECHO_C" >&6
|
||||||
|
AC_TRY_RUN([
|
||||||
|
#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"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_MSG_CHECKING(whether this is a bit or little endian system)
|
||||||
|
AC_TRY_RUN([
|
||||||
|
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 anope.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 cron.example.sh anope.example.conf botserv.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}
|
|
||||||
)
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,405 +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 = 50
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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"
|
|
||||||
desc = _("Greet message displayed on join")
|
|
||||||
rank = 40
|
|
||||||
level = 5
|
|
||||||
flag = "g"
|
|
||||||
xop = "AOP"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* fantasy
|
|
||||||
*
|
|
||||||
* Allows 'fantasist' commands to be used in channels.
|
|
||||||
*
|
|
||||||
* Provides the commands:
|
|
||||||
* botserv/set/fantasy - Used for enabling or disabling BotServ's fantasist 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 = false; }
|
|
||||||
fantasy { name = "HOP"; command = "chanserv/xop"; }
|
|
||||||
fantasy { name = "INFO"; command = "chanserv/info"; prepend_channel = false; }
|
|
||||||
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 = false; }
|
|
||||||
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 = false; }
|
|
||||||
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 = "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"; }
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
# Crontab script for Anope
|
# Crontab script for Anope
|
||||||
#
|
#
|
||||||
# To know how to install the crontab, read the INSTALL file.
|
# To know how to install the crontab, read the INSTALL file.
|
||||||
|
|
||||||
###############################################################
|
###############################################################
|
||||||
@@ -9,16 +9,13 @@
|
|||||||
###############################################################
|
###############################################################
|
||||||
|
|
||||||
# Anope binary directory
|
# Anope binary directory
|
||||||
ANOPATH=/home/ircd/anope/bin
|
ANOPATH=/home/ircd/services/
|
||||||
|
|
||||||
# Anope data directory
|
|
||||||
ANODATA=/home/ircd/anope/data
|
|
||||||
|
|
||||||
# Name of the pid file
|
# Name of the pid file
|
||||||
ANOPIDF=anope.pid
|
ANOPIDF=services.pid
|
||||||
|
|
||||||
# Name of the executable
|
# Name of the executable
|
||||||
ANOPROG=anope
|
ANOPROG=services
|
||||||
|
|
||||||
# Parameters to pass to the executable
|
# Parameters to pass to the executable
|
||||||
ANOARGS=""
|
ANOARGS=""
|
||||||
@@ -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
|
||||||
+1597
File diff suppressed because it is too large
Load Diff
@@ -1,141 +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 Anope is 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 Anope (re)joins the
|
|
||||||
* network.
|
|
||||||
*
|
|
||||||
* This directive is optional.
|
|
||||||
*/
|
|
||||||
#globaloncycleup = "Services are now back online - have a nice day"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If set, Anope 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"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* gl_queue
|
|
||||||
*
|
|
||||||
* Provides the command global/queue.
|
|
||||||
*
|
|
||||||
* Used for queuing messages to send to every online user.
|
|
||||||
*/
|
|
||||||
module
|
|
||||||
{
|
|
||||||
name = "gl_queue"
|
|
||||||
|
|
||||||
/* The maximum number of messages in a message queue. Defaults to 10. */
|
|
||||||
maxqueue = 10
|
|
||||||
}
|
|
||||||
command { service = "Global"; name = "QUEUE"; command = "global/queue"; permission = "global/queue"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* gl_server
|
|
||||||
*
|
|
||||||
* Provides the command global/server.
|
|
||||||
*
|
|
||||||
* Used for sending a message to every online user on a server.
|
|
||||||
*/
|
|
||||||
module { name = "gl_server" }
|
|
||||||
command { service = "Global"; name = "SERVER"; command = "global/server"; permission = "global/server"; }
|
|
||||||
@@ -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 = false
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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 = true
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This makes vhosts act as if they are per account.
|
|
||||||
*/
|
|
||||||
synconset = true
|
|
||||||
}
|
|
||||||
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, Anope will send a memo to the user requesting a vHost when it's been
|
|
||||||
* approved or rejected.
|
|
||||||
*/
|
|
||||||
#memouser = yes
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If set, Anope 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,243 +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). The default 3-second wait means a maximum average of 150 bytes of memo
|
|
||||||
* per second per user under the current IRC protocol.
|
|
||||||
*
|
|
||||||
* This directive is optional, but recommended.
|
|
||||||
*/
|
|
||||||
senddelay = 30s
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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 = 50
|
|
||||||
}
|
|
||||||
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.
|
|
||||||
*
|
|
||||||
* Requires configuring memoserv:memoreceipt.
|
|
||||||
*/
|
|
||||||
#module
|
|
||||||
{
|
|
||||||
name = "ms_rsend"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Only allow Services Operators to use ms_rsend.
|
|
||||||
*
|
|
||||||
* This directive is optional.
|
|
||||||
*/
|
|
||||||
operonly = false
|
|
||||||
}
|
|
||||||
#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,807 +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 Anope 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" }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* dns
|
|
||||||
*
|
|
||||||
* Adds support for the DNS protocol. By itself this module does nothing useful,
|
|
||||||
* but other modules such as dnsbl and os_dns require this.
|
|
||||||
*/
|
|
||||||
#module
|
|
||||||
{
|
|
||||||
name = "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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Email 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 slave servers are allowed to cache. 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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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 = "dnsbl"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If set, Anope 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, Anope 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" }
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* helpchan
|
|
||||||
*
|
|
||||||
* Gives users who are op in the specified help channel usermode +h (helpop).
|
|
||||||
*/
|
|
||||||
#module
|
|
||||||
{
|
|
||||||
name = "helpchan"
|
|
||||||
|
|
||||||
helpchannel = "#help"
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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 = "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"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ldap [EXTRA]
|
|
||||||
*
|
|
||||||
* This module allows other modules to use LDAP. By itself, this module does nothing useful.
|
|
||||||
*/
|
|
||||||
#module
|
|
||||||
{
|
|
||||||
name = "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"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ldap_authentication
|
|
||||||
*
|
|
||||||
* This module allows many commands such as IDENTIFY, RELEASE, RECOVER, GHOST, etc. use
|
|
||||||
* LDAP to authenticate users. Requires ldap.
|
|
||||||
*/
|
|
||||||
#module
|
|
||||||
{
|
|
||||||
name = "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/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"
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ldap_oper
|
|
||||||
*
|
|
||||||
* This module dynamically ties users to Anope opertypes when they identify
|
|
||||||
* via LDAP group membership. Requires ldap.
|
|
||||||
*
|
|
||||||
* Note that this doesn't give the user privileges on the IRCd, only in Anope.
|
|
||||||
*/
|
|
||||||
#module
|
|
||||||
{
|
|
||||||
name = "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"
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* mysql [EXTRA]
|
|
||||||
*
|
|
||||||
* This module allows other modules to use MySQL.
|
|
||||||
*/
|
|
||||||
#module
|
|
||||||
{
|
|
||||||
name = "mysql"
|
|
||||||
|
|
||||||
mysql
|
|
||||||
{
|
|
||||||
/* The name of this service. */
|
|
||||||
name = "mysql/main"
|
|
||||||
database = "anope"
|
|
||||||
server = "127.0.0.1"
|
|
||||||
username = "anope"
|
|
||||||
password = "mypassword"
|
|
||||||
port = 3306
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* redis
|
|
||||||
*
|
|
||||||
* This module allows other modules to use Redis.
|
|
||||||
*/
|
|
||||||
#module
|
|
||||||
{
|
|
||||||
name = "redis"
|
|
||||||
|
|
||||||
/* A redis database */
|
|
||||||
redis
|
|
||||||
{
|
|
||||||
/* The name of this service */
|
|
||||||
name = "redis/main"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The redis database to use. New connections default to 0.
|
|
||||||
*/
|
|
||||||
db = 0
|
|
||||||
|
|
||||||
ip = "127.0.0.1"
|
|
||||||
port = 6379
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* regex_pcre2 [EXTRA]
|
|
||||||
*
|
|
||||||
* Provides the regex engine regex/pcre, which uses version 2 of the Perl Compatible Regular
|
|
||||||
* Expressions library.
|
|
||||||
*/
|
|
||||||
#module { name = "regex_pcre2" }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* regex_posix [EXTRA]
|
|
||||||
*
|
|
||||||
* Provides the regex engine regex/posix, which uses the POSIX compliant regular expressions.
|
|
||||||
*/
|
|
||||||
#module { name = "regex_posix" }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* regex_stdlib
|
|
||||||
*
|
|
||||||
* Provides the regex engine regex/stdlib, which uses the regular expression library that is part of
|
|
||||||
* the C++ standard library.
|
|
||||||
*/
|
|
||||||
module
|
|
||||||
{
|
|
||||||
name = "regex_stdlib"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The syntax scheme to use. Can be set to awk to use the regular expression grammar used by the
|
|
||||||
* awk utility in POSIX, basic to use the basic POSIX regular expression grammar, ecmascript to
|
|
||||||
* use the modified ECMAScript regular expression grammar, egrep to use the regular expression
|
|
||||||
* grammar used by the grep utility with the -E option in POSIX, extended to use the extended
|
|
||||||
* POSIX regular expression grammar, or grep to use the regular expression grammar used by the
|
|
||||||
* grep utility in POSIX.
|
|
||||||
*
|
|
||||||
* See https://en.cppreference.com/w/cpp/regex/syntax_option_type for more information.
|
|
||||||
*/
|
|
||||||
syntax = "ecmascript"
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* regex_tre [EXTRA]
|
|
||||||
*
|
|
||||||
* Provides the regex engine regex/tre, which uses the TRE regex library.
|
|
||||||
*/
|
|
||||||
#module { name = "regex_tre" }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* rewrite
|
|
||||||
*
|
|
||||||
* Allows rewriting commands sent to/from clients.
|
|
||||||
*/
|
|
||||||
#module { name = "rewrite" }
|
|
||||||
#command
|
|
||||||
{
|
|
||||||
service = "ChanServ"; name = "CLEAR"; command = "rewrite"
|
|
||||||
|
|
||||||
/* Enable rewrite. */
|
|
||||||
rewrite = true
|
|
||||||
|
|
||||||
/* 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"
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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 = "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)"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* sasl
|
|
||||||
*
|
|
||||||
* Some IRCds allow "SASL" authentication to let users identify to services
|
|
||||||
* during the IRCd user registration process. If this module is loaded, Anope will allow
|
|
||||||
* authenticating users through this mechanism. Supported mechanisms are:
|
|
||||||
* PLAIN, EXTERNAL.
|
|
||||||
*/
|
|
||||||
module { name = "sasl" }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ssl_gnutls [EXTRA]
|
|
||||||
*
|
|
||||||
* 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 ssl_gnutls or ssl_openssl, but not both.
|
|
||||||
*/
|
|
||||||
#module
|
|
||||||
{
|
|
||||||
name = "ssl_gnutls"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* An optional certificate and key for ssl_gnutls to give to the uplink. All
|
|
||||||
* paths are relative to the config directory.
|
|
||||||
*
|
|
||||||
* You can generate your own certificate and key pair by using:
|
|
||||||
*
|
|
||||||
* certtool --generate-privkey --bits 2048 --outfile privkey.pem
|
|
||||||
* certtool --generate-self-signed --load-privkey privkey.pem --outfile fullchain.pem
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
cert = "fullchain.pem"
|
|
||||||
key = "privkey.pem"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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 = "dhparams.pem"
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ssl_openssl [EXTRA]
|
|
||||||
*
|
|
||||||
* 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 ssl_openssl or ssl_gnutls, but not both.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#module
|
|
||||||
{
|
|
||||||
name = "ssl_openssl"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* An optional certificate and key for ssl_openssl to give to the uplink.
|
|
||||||
* All paths are relative to the config directory.
|
|
||||||
*
|
|
||||||
* You can generate your own certificate and key pair by using:
|
|
||||||
*
|
|
||||||
* openssl genrsa -out privkey.pem 2048
|
|
||||||
* openssl req -new -x509 -key privkey.pem -out fullchain.pem -days 1095
|
|
||||||
*/
|
|
||||||
cert = "fullchain.pem"
|
|
||||||
key = "privkey.pem"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If you wish to increase security you can disable support for older
|
|
||||||
* versions of TLS with no known vulnerabilities but that provide less
|
|
||||||
* security. For your security SSLv2 and SSLv3 are always disabled.
|
|
||||||
*/
|
|
||||||
#tlsv10 = no
|
|
||||||
#tlsv11 = no
|
|
||||||
#tlsv12 = yes
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* sql_authentication
|
|
||||||
*
|
|
||||||
* This module allows authenticating users against an external SQL database using a custom
|
|
||||||
* query.
|
|
||||||
*/
|
|
||||||
#module
|
|
||||||
{
|
|
||||||
name = "sql_authentication"
|
|
||||||
|
|
||||||
/* SQL engine to use. Should be configured elsewhere with mysql, 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/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"
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* sql_log
|
|
||||||
*
|
|
||||||
* This module adds an additional target option to log{} blocks
|
|
||||||
* that allows logging Service's 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 = "sql_log" }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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 = "sql_oper"
|
|
||||||
|
|
||||||
/* SQL engine to use. Should be configured elsewhere with mysql, 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 anope.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@"
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* sqlite [EXTRA]
|
|
||||||
*
|
|
||||||
* This module allows other modules to use SQLite.
|
|
||||||
*/
|
|
||||||
#module
|
|
||||||
{
|
|
||||||
name = "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.db"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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 httpd.
|
|
||||||
*/
|
|
||||||
#module
|
|
||||||
{
|
|
||||||
name = "webcpanel"
|
|
||||||
|
|
||||||
/* Web server to use. */
|
|
||||||
server = "httpd/main";
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The directory containing the webcpanel templates. This is relative to the
|
|
||||||
* data directory.
|
|
||||||
*/
|
|
||||||
template_dir = "webcpanel/templates/default";
|
|
||||||
|
|
||||||
/* Page title. */
|
|
||||||
title = "Anope IRC Services";
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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 (xmlrpc_main) to receive and send XMLRPC queries.
|
|
||||||
*/
|
|
||||||
#module
|
|
||||||
{
|
|
||||||
name = "xmlrpc"
|
|
||||||
|
|
||||||
/* Web service to use. Requires httpd. */
|
|
||||||
server = "httpd/main"
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* xmlrpc_main
|
|
||||||
*
|
|
||||||
* Adds the main XMLRPC core functions.
|
|
||||||
* Requires xmlrpc.
|
|
||||||
*/
|
|
||||||
#module { name = "xmlrpc_main" }
|
|
||||||
@@ -1,643 +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"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Requires users to give an email 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_private: Hide the nick from NickServ's LIST command
|
|
||||||
* - hide_email: Hide the nick's email 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
|
|
||||||
* - neverop: User can not be added to access lists
|
|
||||||
* - msg: 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 memo_signon, and
|
|
||||||
* memo_receive. If you really want no defaults, use "none" by itself as the option.
|
|
||||||
*/
|
|
||||||
defaults = "killprotect 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 = 5m
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The length of time before a nick's registration expires.
|
|
||||||
*
|
|
||||||
* This directive is optional, but recommended. If not set, the default is 90 days.
|
|
||||||
*/
|
|
||||||
expire = 90d
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Prevents the use of the ACCESS and CERT (excluding their LIST subcommand), DROP, FORBID, SUSPEND
|
|
||||||
* and SET PASSWORD commands by services operators on other services operators.
|
|
||||||
*
|
|
||||||
* This directive is optional, but recommended.
|
|
||||||
*/
|
|
||||||
secureadmins = yes
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If set, Anope 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, Anope will set these user modes on any user who identifies.
|
|
||||||
*
|
|
||||||
* This directive is optional.
|
|
||||||
*/
|
|
||||||
#modesonid = "+R"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If set, Anope 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 Anope needs to
|
|
||||||
* hold a nickname.
|
|
||||||
*/
|
|
||||||
enforceruser = "enforcer"
|
|
||||||
enforcerhost = "services.host"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The length of time Anope should hold nicknames for.
|
|
||||||
*
|
|
||||||
* 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, Anope does not allow ownership of nick names, only ownership of accounts.
|
|
||||||
*/
|
|
||||||
nonicknameownership = no
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The minimum length of passwords
|
|
||||||
*
|
|
||||||
* This directive is optional. If not set it defaults to 10.
|
|
||||||
*/
|
|
||||||
minpasslen = 10
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The maximum length of passwords
|
|
||||||
*
|
|
||||||
* This directive is optional. If not set it defaults to 50.
|
|
||||||
*/
|
|
||||||
maxpasslen = 50
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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_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"; }
|
|
||||||
command { service = "NickServ"; name = "ACCESS"; command = "nickserv/alist"; hide = true; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Should users who are connected with a SSL client certificate have its fingerprint be added to
|
|
||||||
* their account when they register. Defaults to yes.
|
|
||||||
*/
|
|
||||||
automatic = yes
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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 = 10
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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 = true; }
|
|
||||||
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, Anope 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"; }
|
|
||||||
|
|
||||||
# For compatibility with Anope 1.8 and Atheme.
|
|
||||||
command { service = "NickServ"; name = "GHOST"; command = "nickserv/recover"; hide = true; }
|
|
||||||
command { service = "NickServ"; name = "RELEASE"; command = "nickserv/recover"; hide = true; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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 = 15s
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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/message, nickserv/saset/message - Used to configure how services send messages to you.
|
|
||||||
* nickserv/set/neverop, nickserv/saset/neverop - Used to configure whether a user can be added to access lists
|
|
||||||
* nickserv/saset/noexpire - Used for configuring noexpire, which prevents nicks from expiring.
|
|
||||||
* nickserv/set/password, nickserv/saset/password - Used for changing a users password.
|
|
||||||
*/
|
|
||||||
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 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 NEVEROP"; command = "nickserv/set/neverop"; }
|
|
||||||
command { service = "NickServ"; name = "SASET NEVEROP"; command = "nickserv/saset/neverop"; permission = "nickserv/saset/neverop"; }
|
|
||||||
|
|
||||||
command { service = "NickServ"; name = "SASET NOEXPIRE"; command = "nickserv/saset/noexpire"; permission = "nickserv/saset/noexpire"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ns_set_language
|
|
||||||
*
|
|
||||||
* Provides the command nickserv/set/language and nickserv/saset/language.
|
|
||||||
*
|
|
||||||
* Allows configuring the language that services uses.
|
|
||||||
*/
|
|
||||||
module { name = "ns_set_language" }
|
|
||||||
command { service = "NickServ"; name = "SET LANGUAGE"; command = "nickserv/set/language"; }
|
|
||||||
command { service = "NickServ"; name = "SASET LANGUAGE"; command = "nickserv/saset/language"; permission = "nickserv/saset/language"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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 FACEBOOK"; command = "nickserv/set/misc"; misc_description = _("Associate a Facebook URL with your account"); }
|
|
||||||
#command { service = "NickServ"; name = "SASET FACEBOOK"; command = "nickserv/saset/misc"; misc_description = _("Associate a Facebook URL with this account"); permission = "nickserv/saset/facebook"; 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"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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 email 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,687 +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 Anope 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 Anope 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 Anope 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 IRC 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 Anope 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, Anope 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, Anope will send a global message on DefCon level changes.
|
|
||||||
*
|
|
||||||
* This directive is optional.
|
|
||||||
*/
|
|
||||||
#globalondefcon = yes
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If set, Anope 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 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 slave DNS server to hide service's 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 slave;
|
|
||||||
* masters { 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 Anope 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"; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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 anope.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 Anope 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,518 +0,0 @@
|
|||||||
/*
|
|
||||||
* Example configuration file for Anope. After making the appropriate
|
|
||||||
* changes to this file, place it in the Anope conf directory (as
|
|
||||||
* specified in the "Config" script, default /home/username/anope/conf)
|
|
||||||
* under the name "anope.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, Anope 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.
|
|
||||||
*
|
|
||||||
* [DISCOURAGED]
|
|
||||||
* Indicates a directive which may cause undesirable side effects if
|
|
||||||
* specified.
|
|
||||||
*
|
|
||||||
* [DEPRECATED]
|
|
||||||
* Indicates a directive which will disappear in a future version of
|
|
||||||
* Anope, 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 stats.host define is used in multiple different locations throughout the
|
|
||||||
* configuration for the stats client hostname.
|
|
||||||
*/
|
|
||||||
define
|
|
||||||
{
|
|
||||||
name = "stats.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 Anope
|
|
||||||
* 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!
|
|
||||||
* <link name="stats.example.com"
|
|
||||||
* ipaddr="127.0.0.1"
|
|
||||||
* port="7000"
|
|
||||||
* sendpass="mypassword"
|
|
||||||
* recvpass="mypassword">
|
|
||||||
* <uline server="stats.example.com" silent="yes">
|
|
||||||
* <bind address="127.0.0.1" port="7000" type="servers">
|
|
||||||
*
|
|
||||||
* 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 address, hostname, or UNIX socket path of the IRC server you wish
|
|
||||||
* to connect Anope to.
|
|
||||||
* Usually, you will want to connect over 127.0.0.1 (aka localhost).
|
|
||||||
*
|
|
||||||
* NOTE: On some shell providers, this will not be an option.
|
|
||||||
*/
|
|
||||||
host = "127.0.0.1"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The protocol that Anope should use when connecting to the uplink. Can
|
|
||||||
* be set to "ipv4" (the default), "ipv6", or "unix".
|
|
||||||
*/
|
|
||||||
protocol = "ipv4"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Enable if Anope 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 Anope 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 = "Anope IRC Statistics"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The local address that Anope will bind to before connecting to the remote
|
|
||||||
* server. This may be useful for multihomed hosts. If omitted, Anope 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 Anope process ID. The path is relative to the
|
|
||||||
* data directory.
|
|
||||||
*/
|
|
||||||
pid = "anope.pid"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The filename containing the Message of the Day. The path is relative to the
|
|
||||||
* config directory.
|
|
||||||
*/
|
|
||||||
motd = "motd.txt"
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* [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:
|
|
||||||
* - bahamut
|
|
||||||
* - hybrid
|
|
||||||
* - inspircd
|
|
||||||
* - ngircd
|
|
||||||
* - plexus
|
|
||||||
* - ratbox
|
|
||||||
* - solanum
|
|
||||||
* - unrealircd
|
|
||||||
*/
|
|
||||||
module
|
|
||||||
{
|
|
||||||
name = "inspircd"
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* [REQUIRED] Network Information
|
|
||||||
*
|
|
||||||
* This section contains information about the IRC network that Anope will be
|
|
||||||
* connecting to.
|
|
||||||
*/
|
|
||||||
networkinfo
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* This is the name of the network that Anope 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
|
|
||||||
* Anope being disconnected from the network. Defaults to 31.
|
|
||||||
*/
|
|
||||||
#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
|
|
||||||
* Anope being disconnected from the network. Defaults to 10.
|
|
||||||
*/
|
|
||||||
#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
|
|
||||||
* Anope being disconnected from the network. Defaults to 64.
|
|
||||||
*/
|
|
||||||
#hostlen = 64
|
|
||||||
|
|
||||||
/* Set this to the maximum allowed channel length on your network.
|
|
||||||
* Defaults to 64.
|
|
||||||
*/
|
|
||||||
#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 Anope.
|
|
||||||
*
|
|
||||||
* 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 = false
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The characters that are not allowed to be at the very beginning or very ending
|
|
||||||
* of a vHost. The same warning as vhost_chars applies.
|
|
||||||
*
|
|
||||||
* It is recommended you DON'T change this.
|
|
||||||
*/
|
|
||||||
disallow_start_or_end = ".-"
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* [REQUIRED] Anope Options
|
|
||||||
*
|
|
||||||
* This section contains various options which determine how Anope 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. Anope uses 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
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Sets the interval between sending warning messages for program errors via
|
|
||||||
* WALLOPS/GLOBOPS.
|
|
||||||
*/
|
|
||||||
warningtimeout = 4h
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If set, Anope 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 Anope 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 there
|
|
||||||
* is a channel in the target directive.
|
|
||||||
*/
|
|
||||||
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.
|
|
||||||
*
|
|
||||||
* mysql
|
|
||||||
*
|
|
||||||
* This module allows other modules to use MySQL.
|
|
||||||
*/
|
|
||||||
module
|
|
||||||
{
|
|
||||||
name = "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"
|
|
||||||
}
|
|
||||||
+433
@@ -0,0 +1,433 @@
|
|||||||
|
|
||||||
|
-- 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),
|
||||||
|
UNIQUE KEY display (display)
|
||||||
|
) 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;
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
Reported Bugs from Bugzilla: http://bugs.anope.org/
|
||||||
|
---------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
@@ -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()
|
|
||||||
set(DOCS Changes Changes.conf DEFCON FAQ INSTALL LANGUAGE MODULES ${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()
|
|
||||||
+252
-260
@@ -1,347 +1,339 @@
|
|||||||
GNU GENERAL PUBLIC LICENSE
|
GNU GENERAL PUBLIC LICENSE
|
||||||
Version 2, June 1991
|
Version 2, June 1991
|
||||||
|
|
||||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||||
|
675 Mass Ave, Cambridge, MA 02139, USA
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
Preamble
|
||||||
|
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
The licenses for most software are designed to take away your
|
||||||
of this license document, but changing it is not allowed.
|
freedom to share and change it. By contrast, the GNU General Public
|
||||||
|
License is intended to guarantee your freedom to share and change free
|
||||||
Preamble
|
software--to make sure the software is free for all its users. This
|
||||||
|
General Public License applies to most of the Free Software
|
||||||
The licenses for most software are designed to take away your
|
Foundation's software and to any other program whose authors commit to
|
||||||
freedom to share and change it. By contrast, the GNU General Public
|
using it. (Some other Free Software Foundation software is covered by
|
||||||
License is intended to guarantee your freedom to share and change free
|
the GNU Library General Public License instead.) You can apply it to
|
||||||
software--to make sure the software is free for all its users. This
|
|
||||||
General Public License applies to most of the Free Software
|
|
||||||
Foundation's software and to any other program whose authors commit to
|
|
||||||
using it. (Some other Free Software Foundation software is covered by
|
|
||||||
the GNU Lesser General Public License instead.) You can apply it to
|
|
||||||
your programs, too.
|
your programs, too.
|
||||||
|
|
||||||
When we speak of free software, we are referring to freedom, not
|
When we speak of free software, we are referring to freedom, not
|
||||||
price. Our General Public Licenses are designed to make sure that you
|
price. Our General Public Licenses are designed to make sure that you
|
||||||
have the freedom to distribute copies of free software (and charge for
|
have the freedom to distribute copies of free software (and charge for
|
||||||
this service if you wish), that you receive source code or can get it
|
this service if you wish), that you receive source code or can get it
|
||||||
if you want it, that you can change the software or use pieces of it
|
if you want it, that you can change the software or use pieces of it
|
||||||
in new free programs; and that you know you can do these things.
|
in new free programs; and that you know you can do these things.
|
||||||
|
|
||||||
To protect your rights, we need to make restrictions that forbid
|
To protect your rights, we need to make restrictions that forbid
|
||||||
anyone to deny you these rights or to ask you to surrender the rights.
|
anyone to deny you these rights or to ask you to surrender the rights.
|
||||||
These restrictions translate to certain responsibilities for you if you
|
These restrictions translate to certain responsibilities for you if you
|
||||||
distribute copies of the software, or if you modify it.
|
distribute copies of the software, or if you modify it.
|
||||||
|
|
||||||
For example, if you distribute copies of such a program, whether
|
For example, if you distribute copies of such a program, whether
|
||||||
gratis or for a fee, you must give the recipients all the rights that
|
gratis or for a fee, you must give the recipients all the rights that
|
||||||
you have. You must make sure that they, too, receive or can get the
|
you have. You must make sure that they, too, receive or can get the
|
||||||
source code. And you must show them these terms so they know their
|
source code. And you must show them these terms so they know their
|
||||||
rights.
|
rights.
|
||||||
|
|
||||||
We protect your rights with two steps: (1) copyright the software, and
|
We protect your rights with two steps: (1) copyright the software, and
|
||||||
(2) offer you this license which gives you legal permission to copy,
|
(2) offer you this license which gives you legal permission to copy,
|
||||||
distribute and/or modify the software.
|
distribute and/or modify the software.
|
||||||
|
|
||||||
Also, for each author's protection and ours, we want to make certain
|
Also, for each author's protection and ours, we want to make certain
|
||||||
that everyone understands that there is no warranty for this free
|
that everyone understands that there is no warranty for this free
|
||||||
software. If the software is modified by someone else and passed on, we
|
software. If the software is modified by someone else and passed on, we
|
||||||
want its recipients to know that what they have is not the original, so
|
want its recipients to know that what they have is not the original, so
|
||||||
that any problems introduced by others will not reflect on the original
|
that any problems introduced by others will not reflect on the original
|
||||||
authors' reputations.
|
authors' reputations.
|
||||||
|
|
||||||
Finally, any free program is threatened constantly by software
|
Finally, any free program is threatened constantly by software
|
||||||
patents. We wish to avoid the danger that redistributors of a free
|
patents. We wish to avoid the danger that redistributors of a free
|
||||||
program will individually obtain patent licenses, in effect making the
|
program will individually obtain patent licenses, in effect making the
|
||||||
program proprietary. To prevent this, we have made it clear that any
|
program proprietary. To prevent this, we have made it clear that any
|
||||||
patent must be licensed for everyone's free use or not licensed at all.
|
patent must be licensed for everyone's free use or not licensed at all.
|
||||||
|
|
||||||
The precise terms and conditions for copying, distribution and
|
The precise terms and conditions for copying, distribution and
|
||||||
modification follow.
|
modification follow.
|
||||||
|
|
||||||
GNU GENERAL PUBLIC LICENSE
|
GNU GENERAL PUBLIC LICENSE
|
||||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||||
|
|
||||||
|
0. This License applies to any program or other work which contains
|
||||||
|
a notice placed by the copyright holder saying it may be distributed
|
||||||
|
under the terms of this General Public License. The "Program", below,
|
||||||
|
refers to any such program or work, and a "work based on the Program"
|
||||||
|
means either the Program or any derivative work under copyright law:
|
||||||
|
that is to say, a work containing the Program or a portion of it,
|
||||||
|
either verbatim or with modifications and/or translated into another
|
||||||
|
language. (Hereinafter, translation is included without limitation in
|
||||||
|
the term "modification".) Each licensee is addressed as "you".
|
||||||
|
|
||||||
0. This License applies to any program or other work which contains
|
Activities other than copying, distribution and modification are not
|
||||||
a notice placed by the copyright holder saying it may be distributed
|
covered by this License; they are outside its scope. The act of
|
||||||
under the terms of this General Public License. The "Program", below,
|
running the Program is not restricted, and the output from the Program
|
||||||
refers to any such program or work, and a "work based on the Program"
|
is covered only if its contents constitute a work based on the
|
||||||
means either the Program or any derivative work under copyright law:
|
Program (independent of having been made by running the Program).
|
||||||
that is to say, a work containing the Program or a portion of it,
|
|
||||||
either verbatim or with modifications and/or translated into another
|
|
||||||
language. (Hereinafter, translation is included without limitation in
|
|
||||||
the term "modification".) Each licensee is addressed as "you".
|
|
||||||
|
|
||||||
Activities other than copying, distribution and modification are not
|
|
||||||
covered by this License; they are outside its scope. The act of
|
|
||||||
running the Program is not restricted, and the output from the Program
|
|
||||||
is covered only if its contents constitute a work based on the
|
|
||||||
Program (independent of having been made by running the Program).
|
|
||||||
Whether that is true depends on what the Program does.
|
Whether that is true depends on what the Program does.
|
||||||
|
|
||||||
1. You may copy and distribute verbatim copies of the Program's
|
1. You may copy and distribute verbatim copies of the Program's
|
||||||
source code as you receive it, in any medium, provided that you
|
source code as you receive it, in any medium, provided that you
|
||||||
conspicuously and appropriately publish on each copy an appropriate
|
conspicuously and appropriately publish on each copy an appropriate
|
||||||
copyright notice and disclaimer of warranty; keep intact all the
|
copyright notice and disclaimer of warranty; keep intact all the
|
||||||
notices that refer to this License and to the absence of any warranty;
|
notices that refer to this License and to the absence of any warranty;
|
||||||
and give any other recipients of the Program a copy of this License
|
and give any other recipients of the Program a copy of this License
|
||||||
along with the Program.
|
along with the Program.
|
||||||
|
|
||||||
You may charge a fee for the physical act of transferring a copy, and
|
You may charge a fee for the physical act of transferring a copy, and
|
||||||
you may at your option offer warranty protection in exchange for a fee.
|
you may at your option offer warranty protection in exchange for a fee.
|
||||||
|
|
||||||
2. You may modify your copy or copies of the Program or any portion
|
2. You may modify your copy or copies of the Program or any portion
|
||||||
of it, thus forming a work based on the Program, and copy and
|
of it, thus forming a work based on the Program, and copy and
|
||||||
distribute such modifications or work under the terms of Section 1
|
distribute such modifications or work under the terms of Section 1
|
||||||
above, provided that you also meet all of these conditions:
|
above, provided that you also meet all of these conditions:
|
||||||
|
|
||||||
a) You must cause the modified files to carry prominent notices
|
a) You must cause the modified files to carry prominent notices
|
||||||
stating that you changed the files and the date of any change.
|
stating that you changed the files and the date of any change.
|
||||||
|
|
||||||
b) You must cause any work that you distribute or publish, that in
|
b) You must cause any work that you distribute or publish, that in
|
||||||
whole or in part contains or is derived from the Program or any
|
whole or in part contains or is derived from the Program or any
|
||||||
part thereof, to be licensed as a whole at no charge to all third
|
part thereof, to be licensed as a whole at no charge to all third
|
||||||
parties under the terms of this License.
|
parties under the terms of this License.
|
||||||
|
|
||||||
c) If the modified program normally reads commands interactively
|
c) If the modified program normally reads commands interactively
|
||||||
when run, you must cause it, when started running for such
|
when run, you must cause it, when started running for such
|
||||||
interactive use in the most ordinary way, to print or display an
|
interactive use in the most ordinary way, to print or display an
|
||||||
announcement including an appropriate copyright notice and a
|
announcement including an appropriate copyright notice and a
|
||||||
notice that there is no warranty (or else, saying that you provide
|
notice that there is no warranty (or else, saying that you provide
|
||||||
a warranty) and that users may redistribute the program under
|
a warranty) and that users may redistribute the program under
|
||||||
these conditions, and telling the user how to view a copy of this
|
these conditions, and telling the user how to view a copy of this
|
||||||
License. (Exception: if the Program itself is interactive but
|
License. (Exception: if the Program itself is interactive but
|
||||||
does not normally print such an announcement, your work based on
|
does not normally print such an announcement, your work based on
|
||||||
the Program is not required to print an announcement.)
|
the Program is not required to print an announcement.)
|
||||||
|
|
||||||
|
These requirements apply to the modified work as a whole. If
|
||||||
|
identifiable sections of that work are not derived from the Program,
|
||||||
|
and can be reasonably considered independent and separate works in
|
||||||
|
themselves, then this License, and its terms, do not apply to those
|
||||||
|
sections when you distribute them as separate works. But when you
|
||||||
|
distribute the same sections as part of a whole which is a work based
|
||||||
|
on the Program, the distribution of the whole must be on the terms of
|
||||||
|
this License, whose permissions for other licensees extend to the
|
||||||
|
entire whole, and thus to each and every part regardless of who wrote it.
|
||||||
|
|
||||||
These requirements apply to the modified work as a whole. If
|
Thus, it is not the intent of this section to claim rights or contest
|
||||||
identifiable sections of that work are not derived from the Program,
|
your rights to work written entirely by you; rather, the intent is to
|
||||||
and can be reasonably considered independent and separate works in
|
exercise the right to control the distribution of derivative or
|
||||||
themselves, then this License, and its terms, do not apply to those
|
|
||||||
sections when you distribute them as separate works. But when you
|
|
||||||
distribute the same sections as part of a whole which is a work based
|
|
||||||
on the Program, the distribution of the whole must be on the terms of
|
|
||||||
this License, whose permissions for other licensees extend to the entire
|
|
||||||
whole, and thus to each and every part regardless of who wrote it.
|
|
||||||
|
|
||||||
Thus, it is not the intent of this section to claim rights or contest
|
|
||||||
your rights to work written entirely by you; rather, the intent is to
|
|
||||||
exercise the right to control the distribution of derivative or
|
|
||||||
collective works based on the Program.
|
collective works based on the Program.
|
||||||
|
|
||||||
In addition, mere aggregation of another work not based on the Program
|
In addition, mere aggregation of another work not based on the Program
|
||||||
with the Program (or with a work based on the Program) on a volume of
|
with the Program (or with a work based on the Program) on a volume of
|
||||||
a storage or distribution medium does not bring the other work under
|
a storage or distribution medium does not bring the other work under
|
||||||
the scope of this License.
|
the scope of this License.
|
||||||
|
|
||||||
3. You may copy and distribute the Program (or a work based on it,
|
3. You may copy and distribute the Program (or a work based on it,
|
||||||
under Section 2) in object code or executable form under the terms of
|
under Section 2) in object code or executable form under the terms of
|
||||||
Sections 1 and 2 above provided that you also do one of the following:
|
Sections 1 and 2 above provided that you also do one of the following:
|
||||||
|
|
||||||
a) Accompany it with the complete corresponding machine-readable
|
a) Accompany it with the complete corresponding machine-readable
|
||||||
source code, which must be distributed under the terms of Sections
|
source code, which must be distributed under the terms of Sections
|
||||||
1 and 2 above on a medium customarily used for software interchange; or,
|
1 and 2 above on a medium customarily used for software interchange; or,
|
||||||
|
|
||||||
b) Accompany it with a written offer, valid for at least three years,
|
b) Accompany it with a written offer, valid for at least three
|
||||||
to give any third party, for a charge no more than your cost of
|
years, to give any third party, for a charge no more than your
|
||||||
physically performing source distribution, a complete machine-readable
|
cost of physically performing source distribution, a complete
|
||||||
copy of the corresponding source code, to be distributed under the terms
|
machine-readable copy of the corresponding source code, to be
|
||||||
of Sections 1 and 2 above on a medium customarily used for software
|
distributed under the terms of Sections 1 and 2 above on a medium
|
||||||
interchange; or,
|
customarily used for software interchange; or,
|
||||||
|
|
||||||
c) Accompany it with the information you received as to the offer
|
c) Accompany it with the information you received as to the offer
|
||||||
to distribute corresponding source code. (This alternative is allowed
|
to distribute corresponding source code. (This alternative is
|
||||||
only for noncommercial distribution and only if you received the program
|
allowed only for noncommercial distribution and only if you
|
||||||
in object code or executable form with such an offer, in accord with
|
received the program in object code or executable form with such
|
||||||
Subsection b above.)
|
an offer, in accord with Subsection b above.)
|
||||||
|
|
||||||
The source code for a work means the preferred form of the work for
|
The source code for a work means the preferred form of the work for
|
||||||
making modifications to it. For an executable work, complete source
|
making modifications to it. For an executable work, complete source
|
||||||
code means all the source code for all modules it contains, plus any
|
code means all the source code for all modules it contains, plus any
|
||||||
associated interface definition files, plus the scripts used to
|
associated interface definition files, plus the scripts used to
|
||||||
control compilation and installation of the executable. However, as a
|
control compilation and installation of the executable. However, as a
|
||||||
special exception, the source code distributed need not include
|
special exception, the source code distributed need not include
|
||||||
anything that is normally distributed (in either source or binary
|
anything that is normally distributed (in either source or binary
|
||||||
form) with the major components (compiler, kernel, and so on) of the
|
form) with the major components (compiler, kernel, and so on) of the
|
||||||
operating system on which the executable runs, unless that component
|
operating system on which the executable runs, unless that component
|
||||||
itself accompanies the executable.
|
itself accompanies the executable.
|
||||||
|
|
||||||
If distribution of executable or object code is made by offering
|
If distribution of executable or object code is made by offering
|
||||||
access to copy from a designated place, then offering equivalent
|
access to copy from a designated place, then offering equivalent
|
||||||
access to copy the source code from the same place counts as
|
access to copy the source code from the same place counts as
|
||||||
distribution of the source code, even though third parties are not
|
distribution of the source code, even though third parties are not
|
||||||
compelled to copy the source along with the object code.
|
compelled to copy the source along with the object code.
|
||||||
|
|
||||||
4. You may not copy, modify, sublicense, or distribute the Program
|
4. You may not copy, modify, sublicense, or distribute the Program
|
||||||
except as expressly provided under this License. Any attempt
|
except as expressly provided under this License. Any attempt
|
||||||
otherwise to copy, modify, sublicense or distribute the Program is
|
otherwise to copy, modify, sublicense or distribute the Program is
|
||||||
void, and will automatically terminate your rights under this License.
|
void, and will automatically terminate your rights under this License.
|
||||||
However, parties who have received copies, or rights, from you under
|
However, parties who have received copies, or rights, from you under
|
||||||
this License will not have their licenses terminated so long as such
|
this License will not have their licenses terminated so long as such
|
||||||
parties remain in full compliance.
|
parties remain in full compliance.
|
||||||
|
|
||||||
5. You are not required to accept this License, since you have not
|
5. You are not required to accept this License, since you have not
|
||||||
signed it. However, nothing else grants you permission to modify or
|
signed it. However, nothing else grants you permission to modify or
|
||||||
distribute the Program or its derivative works. These actions are
|
distribute the Program or its derivative works. These actions are
|
||||||
prohibited by law if you do not accept this License. Therefore, by
|
prohibited by law if you do not accept this License. Therefore, by
|
||||||
modifying or distributing the Program (or any work based on the
|
modifying or distributing the Program (or any work based on the
|
||||||
Program), you indicate your acceptance of this License to do so, and
|
Program), you indicate your acceptance of this License to do so, and
|
||||||
all its terms and conditions for copying, distributing or modifying
|
all its terms and conditions for copying, distributing or modifying
|
||||||
the Program or works based on it.
|
the Program or works based on it.
|
||||||
|
|
||||||
6. Each time you redistribute the Program (or any work based on the
|
6. Each time you redistribute the Program (or any work based on the
|
||||||
Program), the recipient automatically receives a license from the
|
Program), the recipient automatically receives a license from the
|
||||||
original licensor to copy, distribute or modify the Program subject to
|
original licensor to copy, distribute or modify the Program subject to
|
||||||
these terms and conditions. You may not impose any further
|
these terms and conditions. You may not impose any further
|
||||||
restrictions on the recipients' exercise of the rights granted herein.
|
restrictions on the recipients' exercise of the rights granted herein.
|
||||||
You are not responsible for enforcing compliance by third parties to
|
You are not responsible for enforcing compliance by third parties to
|
||||||
this License.
|
this License.
|
||||||
|
|
||||||
7. If, as a consequence of a court judgment or allegation of patent
|
7. If, as a consequence of a court judgment or allegation of patent
|
||||||
infringement or for any other reason (not limited to patent issues),
|
infringement or for any other reason (not limited to patent issues),
|
||||||
conditions are imposed on you (whether by court order, agreement or
|
conditions are imposed on you (whether by court order, agreement or
|
||||||
otherwise) that contradict the conditions of this License, they do not
|
otherwise) that contradict the conditions of this License, they do not
|
||||||
excuse you from the conditions of this License. If you cannot
|
excuse you from the conditions of this License. If you cannot
|
||||||
distribute so as to satisfy simultaneously your obligations under this
|
distribute so as to satisfy simultaneously your obligations under this
|
||||||
License and any other pertinent obligations, then as a consequence you
|
License and any other pertinent obligations, then as a consequence you
|
||||||
may not distribute the Program at all. For example, if a patent license
|
may not distribute the Program at all. For example, if a patent
|
||||||
would not permit royalty-free redistribution of the Program by all those
|
license would not permit royalty-free redistribution of the Program by
|
||||||
who receive copies directly or indirectly through you, then the only way
|
all those who receive copies directly or indirectly through you, then
|
||||||
you could satisfy both it and this License would be to refrain entirely
|
the only way you could satisfy both it and this License would be to
|
||||||
from distribution of the Program.
|
refrain entirely from distribution of the Program.
|
||||||
|
|
||||||
If any portion of this section is held invalid or unenforceable under
|
If any portion of this section is held invalid or unenforceable under
|
||||||
any particular circumstance, the balance of the section is intended to
|
any particular circumstance, the balance of the section is intended to
|
||||||
apply and the section as a whole is intended to apply in other
|
apply and the section as a whole is intended to apply in other
|
||||||
circumstances.
|
circumstances.
|
||||||
|
|
||||||
It is not the purpose of this section to induce you to infringe any
|
It is not the purpose of this section to induce you to infringe any
|
||||||
patents or other property right claims or to contest validity of any
|
patents or other property right claims or to contest validity of any
|
||||||
such claims; this section has the sole purpose of protecting the
|
such claims; this section has the sole purpose of protecting the
|
||||||
integrity of the free software distribution system, which is implemented
|
integrity of the free software distribution system, which is
|
||||||
by public license practices. Many people have made generous contributions
|
implemented by public license practices. Many people have made
|
||||||
to the wide range of software distributed through that system in reliance
|
generous contributions to the wide range of software distributed
|
||||||
on consistent application of that system; it is up to the author/donor to
|
through that system in reliance on consistent application of that
|
||||||
decide if he or she is willing to distribute software through any other
|
system; it is up to the author/donor to decide if he or she is willing
|
||||||
system and a licensee cannot impose that choice.
|
to distribute software through any other system and a licensee cannot
|
||||||
|
impose that choice.
|
||||||
|
|
||||||
This section is intended to make thoroughly clear what is believed to be
|
This section is intended to make thoroughly clear what is believed to
|
||||||
a consequence of the rest of this License.
|
be a consequence of the rest of this License.
|
||||||
|
|
||||||
|
8. If the distribution and/or use of the Program is restricted in
|
||||||
8. If the distribution and/or use of the Program is restricted in
|
certain countries either by patents or by copyrighted interfaces, the
|
||||||
certain countries either by patents or by copyrighted interfaces, the
|
original copyright holder who places the Program under this License
|
||||||
original copyright holder who places the Program under this License
|
may add an explicit geographical distribution limitation excluding
|
||||||
may add an explicit geographical distribution limitation excluding
|
those countries, so that distribution is permitted only in or among
|
||||||
those countries, so that distribution is permitted only in or among
|
countries not thus excluded. In such case, this License incorporates
|
||||||
countries not thus excluded. In such case, this License incorporates
|
|
||||||
the limitation as if written in the body of this License.
|
the limitation as if written in the body of this License.
|
||||||
|
|
||||||
9. The Free Software Foundation may publish revised and/or new versions
|
9. The Free Software Foundation may publish revised and/or new versions
|
||||||
of the General Public License from time to time. Such new versions will
|
of the General Public License from time to time. Such new versions will
|
||||||
be similar in spirit to the present version, but may differ in detail to
|
be similar in spirit to the present version, but may differ in detail to
|
||||||
address new problems or concerns.
|
address new problems or concerns.
|
||||||
|
|
||||||
Each version is given a distinguishing version number. If the Program
|
Each version is given a distinguishing version number. If the Program
|
||||||
specifies a version number of this License which applies to it and "any
|
specifies a version number of this License which applies to it and "any
|
||||||
later version", you have the option of following the terms and conditions
|
later version", you have the option of following the terms and conditions
|
||||||
either of that version or of any later version published by the Free
|
either of that version or of any later version published by the Free
|
||||||
Software Foundation. If the Program does not specify a version number of
|
Software Foundation. If the Program does not specify a version number of
|
||||||
this License, you may choose any version ever published by the Free Software
|
this License, you may choose any version ever published by the Free Software
|
||||||
Foundation.
|
Foundation.
|
||||||
|
|
||||||
10. If you wish to incorporate parts of the Program into other free
|
10. If you wish to incorporate parts of the Program into other free
|
||||||
programs whose distribution conditions are different, write to the author
|
programs whose distribution conditions are different, write to the author
|
||||||
to ask for permission. For software which is copyrighted by the Free
|
to ask for permission. For software which is copyrighted by the Free
|
||||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||||
make exceptions for this. Our decision will be guided by the two goals
|
make exceptions for this. Our decision will be guided by the two goals
|
||||||
of preserving the free status of all derivatives of our free software and
|
of preserving the free status of all derivatives of our free software and
|
||||||
of promoting the sharing and reuse of software generally.
|
of promoting the sharing and reuse of software generally.
|
||||||
|
|
||||||
NO WARRANTY
|
NO WARRANTY
|
||||||
|
|
||||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||||
REPAIR OR CORRECTION.
|
REPAIR OR CORRECTION.
|
||||||
|
|
||||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||||
POSSIBILITY OF SUCH DAMAGES.
|
POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
Appendix: How to Apply These Terms to Your New Programs
|
||||||
|
|
||||||
How to Apply These Terms to Your New Programs
|
If you develop a new program, and you want it to be of the greatest
|
||||||
|
possible use to the public, the best way to achieve this is to make it
|
||||||
|
free software which everyone can redistribute and change under these terms.
|
||||||
|
|
||||||
If you develop a new program, and you want it to be of the greatest
|
To do so, attach the following notices to the program. It is safest
|
||||||
possible use to the public, the best way to achieve this is to make
|
to attach them to the start of each source file to most effectively
|
||||||
it free software which everyone can redistribute and change under
|
convey the exclusion of warranty; and each file should have at least
|
||||||
these terms.
|
|
||||||
|
|
||||||
To do so, attach the following notices to the program. It is safest
|
|
||||||
to attach them to the start of each source file to most effectively
|
|
||||||
convey the exclusion of warranty; and each file should have at least
|
|
||||||
the "copyright" line and a pointer to where the full notice is found.
|
the "copyright" line and a pointer to where the full notice is found.
|
||||||
|
|
||||||
<one line to give the program's name and an idea of what it does.>
|
<one line to give the program's name and a brief idea of what it does.>
|
||||||
Copyright (C) yyyy name of author
|
Copyright (C) 19yy <name of author>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or
|
This program is free software; you can redistribute it and/or modify
|
||||||
modify it under the terms of the GNU General Public License
|
it under the terms of the GNU General Public License as published by
|
||||||
as published by the Free Software Foundation; either version 2
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
of the License, or (at your option) any later version.
|
(at your option) any later version.
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
This program is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program; if not, write to the Free Software
|
along with this program; if not, write to the Free Software
|
||||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
02110-1301, USA.
|
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
If the program is interactive, make it output a short notice like this
|
If the program is interactive, make it output a short notice like this
|
||||||
when it starts in an interactive mode:
|
when it starts in an interactive mode:
|
||||||
|
|
||||||
Gnomovision version 69, Copyright (C) year name of author
|
Gnomovision version 69, Copyright (C) 19yy name of author
|
||||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details
|
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||||
type `show w'. This is free software, and you are welcome
|
This is free software, and you are welcome to redistribute it
|
||||||
to redistribute it under certain conditions; type `show c'
|
under certain conditions; type `show c' for details.
|
||||||
for details.
|
|
||||||
|
|
||||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||||
parts of the General Public License. Of course, the commands you use may
|
parts of the General Public License. Of course, the commands you use may
|
||||||
be called something other than `show w' and `show c'; they could even be
|
be called something other than `show w' and `show c'; they could even be
|
||||||
mouse-clicks or menu items--whatever suits your program.
|
mouse-clicks or menu items--whatever suits your program.
|
||||||
|
|
||||||
You should also get your employer (if you work as a programmer) or your
|
You should also get your employer (if you work as a programmer) or your
|
||||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||||
necessary. Here is a sample; alter the names:
|
necessary. Here is a sample; alter the names:
|
||||||
|
|
||||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||||
|
|
||||||
<signature of Ty Coon>, 1 April 1989
|
<signature of Ty Coon>, 1 April 1989
|
||||||
Ty Coon, President of Vice
|
Ty Coon, President of Vice
|
||||||
|
|
||||||
This General Public License does not permit incorporating your program into
|
This General Public License does not permit incorporating your program into
|
||||||
proprietary programs. If your program is a subroutine library, you may
|
proprietary programs. If your program is a subroutine library, you may
|
||||||
consider it more useful to permit linking proprietary applications with the
|
consider it more useful to permit linking proprietary applications with the
|
||||||
library. If this is what you want to do, use the GNU Lesser General
|
library. If this is what you want to do, use the GNU Library General
|
||||||
Public License instead of this License.
|
Public License instead of this License.
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
-125
@@ -1,125 +0,0 @@
|
|||||||
Anope Version 2.1.7
|
|
||||||
-------------------
|
|
||||||
Added importing of akick reasons, forbid reasons, opers and session exceptions to db_atheme.
|
|
||||||
Added support for sending tag messages.
|
|
||||||
Added the ability to look up account information of an authenticated user.
|
|
||||||
Fixed a crash in ns_cert when an IRC user is not present during a nick registration.
|
|
||||||
Fixed a null pointer dereference in the global module.
|
|
||||||
Fixed a rare memory leak in os_akill and os_sxline.
|
|
||||||
Improved the performance of some code that looks up the primary nick from an account.
|
|
||||||
Removed the broken Catalan, Hungarian, and Russian translations.
|
|
||||||
Reworked the protocol interface for sending messages.
|
|
||||||
Updated the Turkish translation.
|
|
||||||
|
|
||||||
Anope Version 2.1.6
|
|
||||||
-------------------
|
|
||||||
Added opportunistic upgrading of TLS fingerprints to more secure algorithms on InspIRCd.
|
|
||||||
Added support for logging out partially connected users on Plexus.
|
|
||||||
Added the account registration time to nickserv/info.
|
|
||||||
Changed ns_cert to automatically add a TLS fingerprint to new accounts if available.
|
|
||||||
Clarified that a non-deprecated encryption module must be loaded.
|
|
||||||
Fixed creating the runtime directory on Windows.
|
|
||||||
Fixed mistakenly allowing badpasslimit to be set to a negative value.
|
|
||||||
Fixed parsing backup TLS fingerprints on InspIRCd.
|
|
||||||
Fixed parsing the flood mode on UnrealIRCd.
|
|
||||||
Fixed parsing the history mode on UnrealIRCd.
|
|
||||||
Fixed various iterator invalidation issues.
|
|
||||||
Partially rewrote the Portuguese translation.
|
|
||||||
Removed some incorrect strings from the Turkish translation.
|
|
||||||
Renamed the --modulesdir option to --moduledir to match the name of other path options.
|
|
||||||
|
|
||||||
Anope Version 2.1.5
|
|
||||||
-------------------
|
|
||||||
Added an example systemd unit file.
|
|
||||||
Added support for BIGLINES on UnrealIRCd.
|
|
||||||
Bumped the minimum supported version of Bahamut to 2.0.
|
|
||||||
Fixed truncating messages in global/global and global/server.
|
|
||||||
Improved building Anope for use as a system package.
|
|
||||||
Updated the Turkish translation.
|
|
||||||
|
|
||||||
Anope Version 2.1.4
|
|
||||||
-------------------
|
|
||||||
Added a check for a non-deprecated encryption module on start.
|
|
||||||
Added a way for protocol modules to report an error to the uplink.
|
|
||||||
Added more account settings to the webcpanel.
|
|
||||||
Added self-test functionality for all encryption modules.
|
|
||||||
Added support for challenge authentication on InspIRCd.
|
|
||||||
Added support for importing databases from Atheme.
|
|
||||||
Added support for sending client tags on UnrealIRCd.
|
|
||||||
Added support for the InspIRCd 1206 (v4) protocol.
|
|
||||||
Added the --nopid option to disable writing a pid file.
|
|
||||||
Added the enc_argon2 module to encrypt passwords with Argon2.
|
|
||||||
Added the enc_sha2 module to encrypt passwords with HMAC-SHA-2.
|
|
||||||
Added the global/queue command for queueing multi-line messages.
|
|
||||||
Added the global/server command for sending messages to an individual server.
|
|
||||||
Added the PASSWORD category to operserv/stats to view password encryption methods.
|
|
||||||
Added the verify-only enc_posix module to validate passwords from Atheme that were encrypted with Argon2.
|
|
||||||
Changed nickserv/drop to use confirmation codes to confirm a nickname drop.
|
|
||||||
Changed various paths to be relative to the data and config directories.
|
|
||||||
Converted some IRCDProto member functions to variables.
|
|
||||||
Converted the enc_md5, enc_none, enc_old, enc_sha1, and enc_sha256 modules to be verify-only.
|
|
||||||
Deduplicated page headers and footers in the webcpanel templates.
|
|
||||||
Deprecated the enc_sha256 module.
|
|
||||||
Fixed inconsistent spelling/casing of email, vhost, and vident.
|
|
||||||
Fixed various bugs in the inspircd module.
|
|
||||||
Improved portability of email sending.
|
|
||||||
Improved protocol debug messages.
|
|
||||||
Improved the performance and reliability of internal conversion logic.
|
|
||||||
Improved the randomness of randomly generated numbers.
|
|
||||||
Refactored the enc_bcrypt module and exposed it as an encryption context.
|
|
||||||
Removed several duplicate translation strings.
|
|
||||||
Replaced the custom MD5 implementation in enc_md5 with a vendored one.
|
|
||||||
Replaced the custom SHA256 implementation in enc_sha256 with a vendored one.
|
|
||||||
The ldap_authentication, ldap_oper, sql_authentication, sql_log, and sql_oper modules are now always enabled.
|
|
||||||
|
|
||||||
Anope Version 2.1.3
|
|
||||||
-------------------
|
|
||||||
Added alternate command suggestions when a user runs an invalid command.
|
|
||||||
Added support for the IRCv3 +draft/channel-context tag.
|
|
||||||
Added support for the IRCv3 +draft/reply tag.
|
|
||||||
Allow using more than one fingerprint in an oper block.
|
|
||||||
Changed chanserv/drop to use confirmation codes to confirm a channel drop.
|
|
||||||
Cleaned up more of the codebase to use Modern C++17.
|
|
||||||
Enabled using more field limits sent by the IRC server instead of requiring the user to configure them.
|
|
||||||
Fixed NickServ lying about the minimum password length.
|
|
||||||
Fixed a crash when sending emails.
|
|
||||||
Fixed bs_kick not using the correct kick message for automatic kicks.
|
|
||||||
Increased the security of randomly generated confirmation codes.
|
|
||||||
Removed the ns_access module and associated cs_secure and ns_secure options.
|
|
||||||
Removed the ns_status module.
|
|
||||||
Reworked how messages are sent in protocol modules to allow sending message tags.
|
|
||||||
|
|
||||||
Anope Version 2.1.2
|
|
||||||
-------------------
|
|
||||||
Bumped the minimum OpenSSL version to 1.1.0.
|
|
||||||
Bumped the minimum GnuTLS version to 3.0.0.
|
|
||||||
Disabled SSLv3 support in the m_ssl_openssl module.
|
|
||||||
Modernized mutex and thread code to use Modern C++.
|
|
||||||
Normalised the program exit codes.
|
|
||||||
Updated the Dutch translation.
|
|
||||||
Updated the French translation.
|
|
||||||
|
|
||||||
Anope Version 2.1.1
|
|
||||||
-------------------
|
|
||||||
Added the UNBANME privilege to allow users to unban themselves.
|
|
||||||
Fixed building on Windows systems without chgrp/chmod.
|
|
||||||
Fixed creating sockets in the m_dns, m_httpd, m_proxyscan, and m_redis modules.
|
|
||||||
Fixed reading the values of command line arguments.
|
|
||||||
Moved core privilege descriptions to the example configs.
|
|
||||||
Updated the Italian translation.
|
|
||||||
Updated the Polish translation.
|
|
||||||
|
|
||||||
Anope Version 2.1.0
|
|
||||||
-------------------
|
|
||||||
Added support for access list entry descriptions.
|
|
||||||
Added support for linking over a UNIX socket.
|
|
||||||
Added support for server-initiated logins and logouts on UnrealIRCd.
|
|
||||||
Added support for server-initiated logouts on InspIRCd.
|
|
||||||
Added support for the ANONYMOUS SASL mechanism.
|
|
||||||
Allowed users to opt-out of being added to channel access lists.
|
|
||||||
Cleaned up the codebase to use Modern C++17.
|
|
||||||
Modernized the build system to use a modern version of CMake.
|
|
||||||
Removed support for using insecure encryption methods as the primary method.
|
|
||||||
Removed the Windows-only anopesmtp tool.
|
|
||||||
Removed the two day X-line cap.
|
|
||||||
Updated all references to IRCServices to refer to Anope instead.
|
|
||||||
@@ -1,83 +0,0 @@
|
|||||||
Anope Version 2.1.7
|
|
||||||
-------------------
|
|
||||||
Moved nickserv/set/language and nickserv/saset/language to the ns_set_language module.
|
|
||||||
Renamed module:expire for the cs_suspend module to suspendexpire.
|
|
||||||
Renamed the FANTASIA privilege to FANTASY.
|
|
||||||
|
|
||||||
Anope Version 2.1.6
|
|
||||||
-------------------
|
|
||||||
Added module:automatic to the ns_cert module (defaults to yes).
|
|
||||||
Removed module:use_server_side_mlock for the protocol modules (now always enabled).
|
|
||||||
Removed module:use_server_side_topiclock for the protocol modules (now always enabled).
|
|
||||||
|
|
||||||
Anope Version 2.1.5
|
|
||||||
-------------------
|
|
||||||
Added the nickserv/drop/override and chanserv/drop/override oper privileges.
|
|
||||||
|
|
||||||
Anope Version 2.1.4
|
|
||||||
-------------------
|
|
||||||
Added the db_atheme module.
|
|
||||||
Added the enc_argon2 module.
|
|
||||||
Added the enc_posix module.
|
|
||||||
Added the enc_sha2 module.
|
|
||||||
Added the gl_queue module.
|
|
||||||
Added the gl_server module.
|
|
||||||
Added the global/queue operator privilege.
|
|
||||||
Added the global/server operator privilege.
|
|
||||||
Changed serverinfo:motd to be relative to the config directory.
|
|
||||||
Changed serverinfo:pid to be relative to the data directory.
|
|
||||||
Changed the default value of mail:sendmailpath to "/usr/sbin/sendmail -it".
|
|
||||||
Changed the default value of module:accessmax for the chanserv module to 1000.
|
|
||||||
Changed the default value of module:inhabit for the chanserv module to 1 minute.
|
|
||||||
Changed the default value of module:max for the cs_mode module to 50.
|
|
||||||
Changed the default value of module:max for the ms_ignore module to 50.
|
|
||||||
Removed options:seed.
|
|
||||||
Replaced module:template for the webcpanel module with module:template_dir.
|
|
||||||
|
|
||||||
|
|
||||||
Anope Version 2.1.3
|
|
||||||
-------------------
|
|
||||||
Added options:didyoumeandifference.
|
|
||||||
Added support for multiple SSL fingerprints in oper:certfp.
|
|
||||||
Added the chanserv/cert oper privilege for modifying other user's certificate lists.
|
|
||||||
Changed networkinfo:chanlen to default to 32 if not set.
|
|
||||||
Changed networkinfo:hostlen to default to 64 if not set.
|
|
||||||
Changed networkinfo:modelistsize to default to 100 if not set.
|
|
||||||
Changed networkinfo:nicklen to default to 31 if not set.
|
|
||||||
Changed networkinfo:userlen to default to 10 if not set.
|
|
||||||
Increased the default maximum password length to 50 characters.
|
|
||||||
Increased the default minimum password length to 10 characters.
|
|
||||||
Removed the cs_secure option in module:defaults from the chanserv module (now always enabled).
|
|
||||||
Removed the nickserv/saset/secure command.
|
|
||||||
Removed the nickserv/saset/secure oper privilege.
|
|
||||||
Removed the nickserv/set/secure command.
|
|
||||||
Removed the nickserv/status command.
|
|
||||||
Removed the ns_access module.
|
|
||||||
Removed the ns_secure option in module:defaults from the nickserv module (now always enabled).
|
|
||||||
|
|
||||||
Anope Version 2.1.2
|
|
||||||
-------------------
|
|
||||||
Added module:tlsv10 to the ssl_openssl module for configuring whether TLSv1.0 is usable (defaults to no).
|
|
||||||
Added module:tlsv11 to the ssl_openssl module for configuring whether TLSv1.1 is usable (defaults to yes).
|
|
||||||
Added module:tlsv12 to the ssl_openssl module for configuring whether TLSv1.2 is usable (defaults to yes).
|
|
||||||
Removed module:sslv3 from the ssl_openssl module (now always disabled).
|
|
||||||
Removed the m_ prefix from the names of the chanstats, dns, dnsbl, helpchan, httpd, ldap, ldap_oper, mysql, proxyscan, redis, regex_pcre2, regex_posix, regex_stdlib, regex_tre, rewrite, sasl, sql_log, sql_oper, sqlite, ssl_gnutls, ssl_openssl, xmlrpc, and xmlrpc_main modules.
|
|
||||||
|
|
||||||
Anope Version 2.1.1
|
|
||||||
-------------------
|
|
||||||
Added the m_regex_stdlib module.
|
|
||||||
Removed the m_regex_pcre module (use m_regex_pcre2 instead).
|
|
||||||
|
|
||||||
Anope Version 2.1.0
|
|
||||||
-------------------
|
|
||||||
Added nickserv:minpasslen for configuring the minimum password length (defaults to 8).
|
|
||||||
Removed nickserv:strictpasswords as it is obsolete now nickserv:minpasslen exists.
|
|
||||||
Removed the inspircd12 and inspircd20 modules (use inspircd instead).
|
|
||||||
Removed the ns_getpass module (no supported encryption modules).
|
|
||||||
Removed the os_oline module (no supported IRCds).
|
|
||||||
Removed the unreal module (use unrealircd instead).
|
|
||||||
Renamed nickserv:passlen to nickserv:maxpasslen.
|
|
||||||
Renamed the charybdis module to solanum.
|
|
||||||
Renamed the inspircd3 module to inspircd.
|
|
||||||
Renamed the unreal4 module to unrealircd.
|
|
||||||
Replaced uplink:ipv6 with uplink:protocol.
|
|
||||||
+54
-29
@@ -1,4 +1,4 @@
|
|||||||
Anope DefCon
|
Anope DefCon
|
||||||
------------
|
------------
|
||||||
|
|
||||||
1) Introduction
|
1) Introduction
|
||||||
@@ -10,8 +10,8 @@ Anope DefCon
|
|||||||
|
|
||||||
1) Introduction
|
1) Introduction
|
||||||
|
|
||||||
Anope supports a unique protection mechanism based on the
|
Anope 1.6 onwards supports a unique protection mechanism based on the
|
||||||
military "Defense Readiness Condition" (DefCon) system. It is based on
|
military "Defense Readiness Condition" (DefCon) system. It is based on
|
||||||
5 levels of defense readiness defined as:
|
5 levels of defense readiness defined as:
|
||||||
|
|
||||||
DEFCON5 Normal peacetime readiness
|
DEFCON5 Normal peacetime readiness
|
||||||
@@ -23,19 +23,18 @@ Anope DefCon
|
|||||||
These are configurable levels that mandates what actions Anope should
|
These are configurable levels that mandates what actions Anope should
|
||||||
take in case of emergency and change in readiness status.
|
take in case of emergency and change in readiness status.
|
||||||
|
|
||||||
It is used to prevent abuse to both Anope, and the IRCd on which they
|
It is used to prevent abuse to both Services, and the ircd on which they
|
||||||
are running. Also to protect the users, primarily in the event of Clones
|
are running. Also to protect the users, primarily in the event of Clones
|
||||||
and/or FloodBOT attacks.
|
and/or FloodBOT attacks.
|
||||||
|
|
||||||
2) Installation
|
2) Installation
|
||||||
|
|
||||||
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,26 +43,47 @@ 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
|
||||||
Ignore everyone but opers
|
Services will ignore everyone but opers 64
|
||||||
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
|
||||||
|
|
||||||
Anope starts up in DEFCON5 (normal readiness). To change the Defcon level
|
Anope starts up in DEFCON5 (normal readiness). To change the Defcon level
|
||||||
in action use:
|
in action use:
|
||||||
|
|
||||||
/msg OperServ DEFCON 1|2|3|4|5
|
/msg OperServ DEFCON 1|2|3|4|5
|
||||||
|
|
||||||
5) Usage Example
|
5) Usage Example
|
||||||
|
|
||||||
@@ -71,23 +91,28 @@ 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
|
||||||
|
|
||||||
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.anope.org.
|
our #anope channel at /server irc.anope.org.
|
||||||
|
|
||||||
|
|||||||
+416
@@ -0,0 +1,416 @@
|
|||||||
|
Anope Internal Events
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
1) Intro
|
||||||
|
2) Complex Events
|
||||||
|
3) Triggered Events
|
||||||
|
4) Triggered Events List
|
||||||
|
|
||||||
|
1) Introduction to Internal Events
|
||||||
|
|
||||||
|
Internal Events are setup to give module developers more information
|
||||||
|
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
|
||||||
|
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
|
||||||
|
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.
|
||||||
|
|
||||||
|
2) Complex Events
|
||||||
|
|
||||||
|
This type of events are based around what happens when we talk to the
|
||||||
|
IRCd, much like MESSAGE events that the IRCD sends to us. The events
|
||||||
|
are triggered when Anope writes to the ircd. To watch for these events
|
||||||
|
you must have some knowledge of how the IRCd command system works. In
|
||||||
|
our example we will trap for NICK events.
|
||||||
|
|
||||||
|
A) All functions most be formatted as:
|
||||||
|
|
||||||
|
int functioname(char *source, int ac, char **av);
|
||||||
|
|
||||||
|
B) In AnopeInit you must declare EvtMessage 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)
|
||||||
|
{
|
||||||
|
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_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 it's nick.
|
||||||
|
av[0] The new 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 it's 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_NICK_IDENTIFY
|
||||||
|
A user has just identified for it's 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_REGISTERED
|
||||||
|
A new user has just registered it's 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.
|
||||||
@@ -1,10 +1,480 @@
|
|||||||
Frequently Asked Questions (FAQ) concerning Anope
|
Frequently Asked Questions (FAQ) concerning Anope
|
||||||
-------------------------------------------------
|
------------------------------------------------
|
||||||
|
|
||||||
The information in the 2.0 FAQ is subject to change at any
|
NOTE:
|
||||||
moment due to new developments. Please visit our website
|
An updated version of this FAQ can be found on our website: www.anope.org
|
||||||
for the most up to date information.
|
|
||||||
|
|
||||||
An updated version of the FAQ can be found here:
|
Table of Contents
|
||||||
|
-----------------
|
||||||
|
|
||||||
https://wiki.anope.org/index.php/2.0/FAQ
|
1) General
|
||||||
|
1.1) What is Anope?
|
||||||
|
1.2) Where can I find Anope?
|
||||||
|
1.3) Does Anope run under Windows?
|
||||||
|
1.4) Can I send you questions without reading the FAQ, INSTALL or README
|
||||||
|
files?
|
||||||
|
1.5) I need support for the XYZ protocol.
|
||||||
|
1.6) Your Services program doesn't do XYZ like DALnet (or other) Services.
|
||||||
|
What's wrong?
|
||||||
|
1.7) I've got a great new idea for Services. Do you want it?
|
||||||
|
1.8) Examples of features we have been asked about and why we won't add (or
|
||||||
|
haven't yet added) them, so don't ask us about them:
|
||||||
|
1.9) Can you help me?
|
||||||
|
1.10) Where is RootServ?
|
||||||
|
|
||||||
|
2) Installation / Configuration
|
||||||
|
2.1) When I run "make", I get an error message like "missing separator",
|
||||||
|
"Unassociated shell command", "Unexpected end of line seen", etc.
|
||||||
|
2.2) I get an error like "Makefile.inc not found".
|
||||||
|
2.3) I typed "./services" at the command line, but nothing happened!
|
||||||
|
2.4) Whenever I start Anope, I get a message on my IRC server saying
|
||||||
|
"connection refused" or something similar, and Anope gives an error
|
||||||
|
message from the server saying "Closing Link: ...".
|
||||||
|
2.5) My IRC server is giving me messages like "Connection to
|
||||||
|
services.whatever.net[127.0.0.1] activated" and then "Access denied --
|
||||||
|
no N line". Why?
|
||||||
|
2.6) When I say "/connect services.*", it doesn't work!
|
||||||
|
2.7) Anope starts up okay, but if I try to register a nickname, it comes
|
||||||
|
back with "Sorry, registration failed."
|
||||||
|
2.8) Anope reports (via /stats u or /msg OperServ STATS) a different number
|
||||||
|
of users online than I get from doing /lusers.
|
||||||
|
|
||||||
|
3) OperServ
|
||||||
|
3.1) Using the OperServ JUPE command results in server messages like
|
||||||
|
"Server juped.server introduced by non-hub server services.my.net".
|
||||||
|
3.2) I can't use the ADMIN command to add Services admins, it tells me
|
||||||
|
"Permission denied."
|
||||||
|
3.3) When I add an AKILL, the users matching it don't get killed.
|
||||||
|
3.4) Trying to use OperServ gives me "Access denied", but my nick is in the
|
||||||
|
ServicesRoot directive and is registered, and I've identified for my
|
||||||
|
nick.
|
||||||
|
3.5) When I used the OperServ RAW command, Anope and/or my network crashed,
|
||||||
|
or did weird things! Please fix this bug!
|
||||||
|
3.6) I would like to have the list of the different RAW on OperServ.
|
||||||
|
3.7) I can't get /OS UMODES and /OS SVSNICK to work!
|
||||||
|
3.8) What is a Super-Admin? How does it work? Why might it not work?
|
||||||
|
3.9) How can i enable the OperServ RAW command?
|
||||||
|
|
||||||
|
4) Bugs / Crashes
|
||||||
|
4.1) Anope always dies after about five minutes, saying "FATAL ERROR! Can't
|
||||||
|
back up nick.db".
|
||||||
|
4.2) Anope crashed with a segmentation fault.
|
||||||
|
4.3) I've found a bug that's not mentioned here or in the README or BUGS
|
||||||
|
files. What should I do?
|
||||||
|
4.4) My FreeBSD box complains about 'Shared object "nss_dns.so.1" not
|
||||||
|
found'
|
||||||
|
4.5) Anope and long (more then 30 character) nicknames.
|
||||||
|
|
||||||
|
5) ChanServ
|
||||||
|
5.1) Anope's channel mode setting doesn't work. I can't set modes with
|
||||||
|
OperServ, and every time ChanServ tries to set a mode, my server
|
||||||
|
reverses the change.
|
||||||
|
5.2) Anope ignored the SET SUCCESSOR setting and deleted a channel when the
|
||||||
|
founder expired.
|
||||||
|
5.3) How to auto voice all those whom join my #channel?
|
||||||
|
5.4) Channel options like RESTRICTED or SECUREOPS don't work. What's wrong?
|
||||||
|
|
||||||
|
6) BotServ
|
||||||
|
6.1) How do I add bots to BotServ?
|
||||||
|
6.2) Why do kick triggers and fantasy commands fail to work with my Bahamut
|
||||||
|
IRCd?
|
||||||
|
|
||||||
|
7) Language
|
||||||
|
7.1) Anope complains in the logfile about being unable to load the default
|
||||||
|
language.
|
||||||
|
7.2) Anope spricht kein Deutsch!, etc. (Anope doesn't speak my language!)
|
||||||
|
7.3) I selected a language other than English, but sometimes Anope sends
|
||||||
|
responses in English instead.
|
||||||
|
|
||||||
|
8) DevNull
|
||||||
|
8.1) What is the purpose of DevNull?
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
1) General
|
||||||
|
|
||||||
|
1.1) What is Anope?
|
||||||
|
|
||||||
|
Anope is a set of services for IRC networks. See the README file for more
|
||||||
|
information. And in case you were wondering, Anope is Epona spelt backwards
|
||||||
|
:)
|
||||||
|
|
||||||
|
1.2) Where can I find Anope?
|
||||||
|
|
||||||
|
The latest version can always be found at the official Anope distribution
|
||||||
|
site:
|
||||||
|
|
||||||
|
* http://www.anope.org/
|
||||||
|
|
||||||
|
New version announcements can also be found at http://www.anope.org/ in the
|
||||||
|
main page.
|
||||||
|
|
||||||
|
1.3) Does Anope run under Windows?
|
||||||
|
|
||||||
|
Yes. For more information on how to obtain the windows version of Anope
|
||||||
|
visit http://wiki.anope.org/Windows
|
||||||
|
|
||||||
|
1.4) Can I send you questions without reading the FAQ, INSTALL or README files?
|
||||||
|
|
||||||
|
No. If you don't read those files, your messages will most probably be
|
||||||
|
ignored. We don't mean to be rude, but if we took the time to write down
|
||||||
|
some documentation, we'd expect you to take some time to read it.
|
||||||
|
|
||||||
|
1.5) I need support for the XYZ protocol.
|
||||||
|
|
||||||
|
Since Anope 1.7.9, support for other IRCD's, and thus protocols, has been
|
||||||
|
made modular. More information on making a support file for your favorite
|
||||||
|
IRCD can be found in the docs/IRCD file.
|
||||||
|
|
||||||
|
1.6) Your Services program doesn't do XYZ like DALnet (or other) Services.
|
||||||
|
What's wrong?
|
||||||
|
|
||||||
|
Nothing is wrong, except your expectations. Anope is a completely
|
||||||
|
different program from that used on DALnet; they are similar in concept
|
||||||
|
only.
|
||||||
|
|
||||||
|
1.7) I've got a great new idea for Services. Do you want it?
|
||||||
|
|
||||||
|
We are always interested in hearing new ideas. HOWEVER, do not expect your
|
||||||
|
proposal to be in the next Anope release for sure. As a rule, we usually
|
||||||
|
don't add anything that can be equivalently done by other means, or that we
|
||||||
|
consider totally useless; see question 1.8 for examples of things we don't
|
||||||
|
plan to add.
|
||||||
|
|
||||||
|
Our general intent is for Anope to provide as much functionality as
|
||||||
|
possible--while staying as lean as possible. So features which are
|
||||||
|
arguably beneficial will tend to be added, while features of limited or no
|
||||||
|
benefit or which can be equally provided by something else already in use
|
||||||
|
will tend to be passed over.
|
||||||
|
|
||||||
|
If you'd like to give us your idea, you can go to our website at
|
||||||
|
http://www.anope.org/ and add it on our online Forum, in the Feature
|
||||||
|
Requests section.
|
||||||
|
|
||||||
|
1.8) Examples of features we have been asked about and why we won't add (or
|
||||||
|
haven't yet added) them, so don't ask us about them:
|
||||||
|
|
||||||
|
* An option to make ChanServ stay in some/all registered channels: we see
|
||||||
|
absolutely no necessity for this feature, since BotServ already does this
|
||||||
|
anyway.
|
||||||
|
|
||||||
|
* A "current time" field in NickServ and ChanServ INFO displays: Most
|
||||||
|
people have clocks of some sort either on their computer screens or on
|
||||||
|
their walls (or both), and all IRC servers, as well as Services, have a
|
||||||
|
command to return the server's current time. Thus a current-time field in
|
||||||
|
INFO displays would simply take up extra space for no reason.
|
||||||
|
|
||||||
|
1.9) Can you help me?
|
||||||
|
|
||||||
|
No, we can't help you unless you tell us what you need help with.
|
||||||
|
|
||||||
|
1.10) Where is RootServ?
|
||||||
|
|
||||||
|
Anope does not supply RootServ. All functions you would find in RootServ
|
||||||
|
have been integrated into OperServ. If you really want to use RootServ, you
|
||||||
|
can set the OperServAlias in services.conf to be RootServ. This will enable
|
||||||
|
the RootServ nick to be used for OperServ as well. Read the comments near
|
||||||
|
OperServAlias in the configuration file for more information.
|
||||||
|
|
||||||
|
|
||||||
|
2) Installation / Configuration
|
||||||
|
|
||||||
|
2.1) When I run "make", I get an error message like "missing separator",
|
||||||
|
"Unassociated shell command", "Unexpected end of line seen", etc.
|
||||||
|
|
||||||
|
Your make program isn't compatible with the Makefile for Anope. The
|
||||||
|
Makefile was designed to work with GNU make, and as such may not work on
|
||||||
|
other systems' "make" programs. If you get an error from "make", obtain
|
||||||
|
GNU make from ftp://prep.ai.mit.edu/pub/gnu/ (or wherever you prefer) and
|
||||||
|
use it instead of your system's default "make". Note that GNU make may
|
||||||
|
already be installed on your system; try using the command "gmake" instead
|
||||||
|
of "make".
|
||||||
|
|
||||||
|
The make programs bundled with SunOS/Solaris and FreeBSD have been reported
|
||||||
|
not to work; you will need to use GNU make on these systems.
|
||||||
|
|
||||||
|
2.2) I get an error like "Makefile.inc not found".
|
||||||
|
|
||||||
|
You forgot to run the Config script first. See the INSTALL file for
|
||||||
|
compilation instructions.
|
||||||
|
|
||||||
|
2.3) I typed "./services" at the command line, but nothing happened!
|
||||||
|
|
||||||
|
Anope puts itself in the background when it starts, so you get your shell
|
||||||
|
prompt right back. Meanwhile, Anope will continue setting up, then connect
|
||||||
|
to the IRC server specified in services.conf (or on the command line). If
|
||||||
|
it doesn't connect, you probably specified the wrong server type in the
|
||||||
|
configuration file. (Also make sure that you are actually running one of
|
||||||
|
the supported servers. There are a gazillion different variations on the
|
||||||
|
basic IRC protocol out there, and we have neither the time nor the desire
|
||||||
|
to add support for them.)
|
||||||
|
|
||||||
|
The recommended server, under which Epona (the original code base used by
|
||||||
|
Anope) was developed, is Bahamut. DreamForge 4.6.7 will also work fine, but
|
||||||
|
it's a bit obsolete nowadays. Derivatives of Bahamut and DreamForge may
|
||||||
|
also work, if they don't change the server<->server protocol too much;
|
||||||
|
contact their authors for more information. Most people, though, are
|
||||||
|
running Anope with UnrealIRCd, UltimateIRCd or Bahamut.
|
||||||
|
|
||||||
|
As always, you can check the log file (services.log by default) for error
|
||||||
|
messages. You can also start services with the -nofork command line option
|
||||||
|
to prevent it from running in the background, and it will output the
|
||||||
|
messages written to the log file to the console as well.
|
||||||
|
|
||||||
|
2.4) Whenever I start Anope, I get a message on my IRC server saying
|
||||||
|
"connection refused" or something similar, and Anope gives an error
|
||||||
|
message from the server saying "Closing Link: ...".
|
||||||
|
|
||||||
|
See section 3 of the INSTALL file.
|
||||||
|
|
||||||
|
2.5) My IRC server is giving me messages like "Connection to
|
||||||
|
services.whatever.net[127.0.0.1] activated" and then "Access denied -- no
|
||||||
|
N line". Why?
|
||||||
|
|
||||||
|
This is typically caused by including a port number in the C:line for
|
||||||
|
services, which tells your server to try to autoconnect to it (depending on
|
||||||
|
the class (Y:line) settings). This is not what you want, because Anope
|
||||||
|
will connect to the server itself, but does not listen for servers to
|
||||||
|
connect to it. The solution is to remove the port number from the C:line.
|
||||||
|
|
||||||
|
2.6) When I say "/connect services.*", it doesn't work!
|
||||||
|
|
||||||
|
Of course not. RTFM (Read The Fine Manual), and see the previous answer.
|
||||||
|
|
||||||
|
2.7) Anope starts up okay, but if I try to register a nickname, it comes back
|
||||||
|
with "Sorry, registration failed."
|
||||||
|
|
||||||
|
Make sure you've selected the correct IRC server type in the configure
|
||||||
|
script; see question 2.4 for details.
|
||||||
|
|
||||||
|
2.8) Anope reports (via /stats u or /msg OperServ STATS) a different number of
|
||||||
|
users online than I get from doing /lusers.
|
||||||
|
|
||||||
|
Anope doesn't count its own pseudo-clients (NickServ, ChanServ, etc.) in
|
||||||
|
its user count, while the IRC server does.
|
||||||
|
|
||||||
|
|
||||||
|
3) OperServ
|
||||||
|
|
||||||
|
3.1) Using the OperServ JUPE command results in server messages like "Server
|
||||||
|
juped.server introduced by non-hub server services.my.net".
|
||||||
|
|
||||||
|
Services' uplink must have an H: line for Services in the ircd.conf file,
|
||||||
|
which looks something like:
|
||||||
|
|
||||||
|
H:*::services.whatever.net
|
||||||
|
|
||||||
|
3.2) I can't use the ADMIN command to add Services admins, it tells me
|
||||||
|
"Permission denied."
|
||||||
|
|
||||||
|
Did you define yourself as the Services root? You need to insert your
|
||||||
|
nickname in the ServicesRoot directive in services.conf. Also, you must be
|
||||||
|
a global IRC Operator and your nickname must be registered and properly
|
||||||
|
indentified with NickServ.
|
||||||
|
|
||||||
|
3.3) When I add an AKILL, the users matching it don't get killed.
|
||||||
|
|
||||||
|
Use the AkillOnAdd configuration directive.
|
||||||
|
|
||||||
|
3.4) Trying to use OperServ gives me "Access denied", but my nick is in the
|
||||||
|
ServicesRoot directive and is registered, and I've identified for my nick.
|
||||||
|
|
||||||
|
You need to be a global oper (i.e. user mode +o) to access OperServ. This
|
||||||
|
can be configured via the OSOpersOnly directive in services.conf .
|
||||||
|
|
||||||
|
3.5) When I used the OperServ RAW command, Anope and/or my network crashed, or
|
||||||
|
did weird things! Please fix this bug!
|
||||||
|
|
||||||
|
"That's not a bug, it's a feature."
|
||||||
|
|
||||||
|
Have you ever typed /msg OperServ HELP RAW? It's clearly stated there that
|
||||||
|
this command is dangerous and that its use may result in very bad things.
|
||||||
|
|
||||||
|
And that's why this command has been disabled by default. If you enabled
|
||||||
|
and used it, YOU'RE ON YOUR OWN. All help requests will be ignored, even if
|
||||||
|
the problem happens not immediately.
|
||||||
|
|
||||||
|
3.6) I would like to have the list of the different RAW on OperServ.
|
||||||
|
|
||||||
|
If you have to ask, you should not be messing with RAW :)
|
||||||
|
|
||||||
|
3.7) I can't get /OS UMODES and /OS SVSNICK to work!
|
||||||
|
|
||||||
|
You need to be a SuperAdmin to be able to use these commands.
|
||||||
|
|
||||||
|
3.8) What is a Super-Admin? How does it work? Why might it not work?
|
||||||
|
|
||||||
|
Super-Admin's have extra privileges, including being founder on all
|
||||||
|
channels. It must be activated on a per user basis and is only available to
|
||||||
|
Services Roots. It is set using OperServ and is not persistent. It only
|
||||||
|
works if SuperAdmin is not commented in the services configuration file.
|
||||||
|
This is commented by default. Read /msg OperServ HELP SET SUPERADMIN for
|
||||||
|
further help.
|
||||||
|
|
||||||
|
3.9) How can i enable the OperServ RAW command?
|
||||||
|
|
||||||
|
Enabling the OperServ RAW command is VERY dangerous and should never be
|
||||||
|
done on a real network without thinking about it very well first. The RAW
|
||||||
|
command can easily break your whole network if used incorrectly, and thus
|
||||||
|
you will receive NO SUPPORT if you enable RAW on your network.
|
||||||
|
|
||||||
|
Before you enable RAW, be very sure you really want to enable it, and keep
|
||||||
|
in mind that you will NOT BE ABLE to receive ANY SUPPORT anymore, because
|
||||||
|
Anope's stability cannot be guaranteed if RAW is enabled.
|
||||||
|
|
||||||
|
The RAW command comes bundled as a core module for operserv. To load it,
|
||||||
|
add the os_raw module to the list of OperServ core modules. But be sure to
|
||||||
|
keep in mind that when you enable the RAW command, you CANNOT GET ANY
|
||||||
|
SUPPORT for Anope anymore.
|
||||||
|
|
||||||
|
|
||||||
|
4) Bugs / Crashes
|
||||||
|
|
||||||
|
4.1) Anope always dies after about five minutes, saying "FATAL ERROR! Can't
|
||||||
|
back up nick.db".
|
||||||
|
|
||||||
|
Make sure that the user Anope runs as has write access to the data
|
||||||
|
directory, and that the data directory actually exists (the latter
|
||||||
|
shouldn't be a problem if you ran the Config script). This means Anope
|
||||||
|
needs write and execute permission on the data directory itself and execute
|
||||||
|
permission on every parent directory of the data directory.
|
||||||
|
|
||||||
|
4.2) Anope crashed with a segmentation fault.
|
||||||
|
|
||||||
|
See if you can reproduce this by doing a certain sequence of things. If
|
||||||
|
so, please report it to us (see part 6 of README file). If not, you're
|
||||||
|
probably out of luck; if you like, you can report it to us anyway, but
|
||||||
|
chances are it won't get fixed if we don't have instructions on reproducing
|
||||||
|
it. If you do have such a problem, you may find the crontab utility useful
|
||||||
|
for dealing with it.
|
||||||
|
|
||||||
|
Also, see the DumpCore directive in the configuration file. It allows Anope
|
||||||
|
to dump its core whenever it's segfaulting, usually calling it core and
|
||||||
|
placing it into Anope's main directory. Open up gdb by issuing the
|
||||||
|
following command at your shell:
|
||||||
|
|
||||||
|
* gdb services core
|
||||||
|
|
||||||
|
(of course replacing 'core' with the name of the core if different) and
|
||||||
|
type 'bt' at the gdb prompt. After that, send us the output you got and
|
||||||
|
keep the core file in a safe place, in case we need it to dig deeper into
|
||||||
|
the problem.
|
||||||
|
|
||||||
|
4.3) I've found a bug that's not mentioned here or in the README or BUGS files.
|
||||||
|
What should I do?
|
||||||
|
|
||||||
|
See section 6 of the README file.
|
||||||
|
|
||||||
|
4.4) My FreeBSD box complains about 'Shared object "nss_dns.so.1" not found'
|
||||||
|
|
||||||
|
We haven't figured out the exact cause yet, but as a quickfix you can
|
||||||
|
delete the /etc/nsswitch.conf file. Please keep in mind that removing a
|
||||||
|
configuration file can be dangerous, so only do this if you know what you
|
||||||
|
are doing.
|
||||||
|
|
||||||
|
4.5) Anope and long (more then 30 character) nicknames.
|
||||||
|
|
||||||
|
By default anope only supports nicknames up to 30 characters (NICKLEN=30).
|
||||||
|
If your IRCd allows for longer nicknames or has been modified to do so
|
||||||
|
anope will start logging a lot of ("NICK from nonexistent nick") messages.
|
||||||
|
This is because once a user uses a nick that is too long for anope to handle,
|
||||||
|
anope loses track of the user for the remainder of the session.
|
||||||
|
It is POSSIBLE but not NOT RECOMMENDED to extend the maximum length of nicknames
|
||||||
|
anope can track, however this will also break database compatibility. DBs saved
|
||||||
|
with anope set to allow for example 40 chars cannot be read by a default anope
|
||||||
|
and vice versa. So changing the maximum nick length is only possible
|
||||||
|
when starting with fresh databases and even then the consequences of this are
|
||||||
|
UNTESTED.
|
||||||
|
In order to change the maximum internal nick length, change the NICKMAX setting
|
||||||
|
in include/config.h, recompile anope and start without databases.
|
||||||
|
|
||||||
|
|
||||||
|
5) ChanServ
|
||||||
|
|
||||||
|
5.1) Anope's channel mode setting doesn't work. I can't set modes with
|
||||||
|
OperServ, and every time ChanServ tries to set a mode, my server reverses
|
||||||
|
the change.
|
||||||
|
|
||||||
|
Make sure EVERY server on your network has a U: line for Services in
|
||||||
|
ircd.conf, for example:
|
||||||
|
|
||||||
|
U:services.whatever.net:*:*
|
||||||
|
|
||||||
|
5.2) Anope ignored the SET SUCCESSOR setting and deleted a channel when the
|
||||||
|
founder expired.
|
||||||
|
|
||||||
|
Normally, this is because the successor had too many channels registered;
|
||||||
|
in this case, you will see an entry in the log file like the following:
|
||||||
|
|
||||||
|
[date] Successor (SuccessorNick) of channel #somechannel owns too many
|
||||||
|
channels, deleting channel #somechannel
|
||||||
|
|
||||||
|
If you don't get a message like this or you can verify that the successor
|
||||||
|
wasn't running into the channel limit, please report it using the
|
||||||
|
bug-reporting procedure below (see section 6 of the README file).
|
||||||
|
|
||||||
|
5.3) How to auto voice all those whom join my #channel?
|
||||||
|
|
||||||
|
Execute the following commands (/cs is an alias for /msg ChanServ):
|
||||||
|
|
||||||
|
/cs set #channel secure off
|
||||||
|
/cs set #channel xop off
|
||||||
|
/cs levels #channel set AUTOVOICE -1
|
||||||
|
|
||||||
|
5.4) Channel options like RESTRICTED or SECUREOPS don't work. What's wrong?
|
||||||
|
|
||||||
|
Make sure that you didn't put any of your normal IRCd's as a ULined server
|
||||||
|
in Anope. Some access checks for clients from ULined servers are skipped to
|
||||||
|
avoid fights between the ULined servers. This is usually only useful when
|
||||||
|
you have a statistics server connected to your network.
|
||||||
|
|
||||||
|
|
||||||
|
6) BotServ
|
||||||
|
|
||||||
|
6.1) How do I add bots to BotServ?
|
||||||
|
|
||||||
|
Read /msg BotServ HELP and /msg BotServ HELP BOT. Note that you need to be
|
||||||
|
opered up and identified as a Services Administrator before you can use the
|
||||||
|
BOT command.
|
||||||
|
|
||||||
|
6.2) Why do kick triggers and fantasy commands fail to work with my Bahamut
|
||||||
|
IRCd?
|
||||||
|
|
||||||
|
Bahamut allows you to setup a server as 'serviceshub'. This will filter
|
||||||
|
certain data services usually don't need to process. This option also
|
||||||
|
filters channel messages, because DALnet's services have no use for them.
|
||||||
|
Anope parses the channel messages for kick triggers and fantasy commands.
|
||||||
|
To make sure these work the server type of the hub they're linked to should
|
||||||
|
be simply 'hub' and not 'serviceshub'.
|
||||||
|
|
||||||
|
|
||||||
|
7) Language
|
||||||
|
|
||||||
|
7.1) Anope complains in the logfile about being unable to load the default
|
||||||
|
language.
|
||||||
|
|
||||||
|
You forgot to run "make install".
|
||||||
|
|
||||||
|
7.2) Anope spricht kein Deutsch!, etc. (Anope doesn't speak my language!)
|
||||||
|
|
||||||
|
See section 5 of the README file.
|
||||||
|
|
||||||
|
7.3) I selected a language other than English, but sometimes Anope sends
|
||||||
|
responses in English instead.
|
||||||
|
|
||||||
|
Some language files are not complete--in other words, they don't have a
|
||||||
|
translation of every message Anope uses, but only some of them. In this
|
||||||
|
case, the missing messages will be displayed in English. You can either
|
||||||
|
wait for the primary translator to provide us with a translation, or do the
|
||||||
|
translation yourself and send us the messages translated into your
|
||||||
|
language.
|
||||||
|
|
||||||
|
|
||||||
|
8) DevNull
|
||||||
|
|
||||||
|
8.1) What is the purpose of DevNull?
|
||||||
|
|
||||||
|
DevNull functions as a message sink. Any message sent to it will be
|
||||||
|
ignored. It will not be logged, there will be no response. It will be lost
|
||||||
|
forever. Whether it's useful or not is up to you; we just provide you with
|
||||||
|
the option.
|
||||||
|
|||||||
+98
-45
@@ -6,7 +6,7 @@ Anope Installation Instructions
|
|||||||
3) Setting up the IRCd
|
3) Setting up the IRCd
|
||||||
4) Starting Anope
|
4) Starting Anope
|
||||||
5) Setting up a crontab
|
5) Setting up a crontab
|
||||||
|
|
||||||
Note: You should also read the README and FAQ files!
|
Note: You should also read the README and FAQ files!
|
||||||
|
|
||||||
1) Installing Anope
|
1) Installing Anope
|
||||||
@@ -19,88 +19,139 @@ 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 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, ~/anope/conf). Copy the example
|
If you see errors during this process, please mail us with the *complete*
|
||||||
configuration file (anope.example.conf) to anope.conf, and open the latter
|
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
|
||||||
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.anope.org. 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
|
* If you are upgrading to a new major release, ALWAYS restart a
|
||||||
fresh configuration file from anope.example.conf.
|
fresh configuration file from example.conf.
|
||||||
|
|
||||||
3) Setting up the IRCd
|
3) Setting up the IRCd
|
||||||
|
|
||||||
Anope 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 anope.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 and Bahamut, which use a more
|
||||||
|
"readable" form of configuration. For those, use something like:
|
||||||
|
|
||||||
|
link services.localhost.net
|
||||||
|
{
|
||||||
|
username *;
|
||||||
|
hostname localhost;
|
||||||
|
bind-ip *;
|
||||||
|
port 6667;
|
||||||
|
hub *;
|
||||||
|
password-connect "mypass";
|
||||||
|
password-receive "mypass";
|
||||||
|
class servers;
|
||||||
|
};
|
||||||
|
|
||||||
|
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://anope.org/ilm.php
|
||||||
|
|
||||||
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
|
||||||
~/anope/bin). Type ./anope 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.
|
||||||
A successful startup won't generate any message.
|
A successful startup won't generate any message.
|
||||||
|
|
||||||
Give Anope at least one minute to link to your network, as certain
|
Give Services at least one minute to link to your network, as certain
|
||||||
IRCds on some OSes may be really slow for the link process. If nothing
|
IRCds on some OSes may be really slow for the link process. If nothing
|
||||||
happens after about a minute, it is probably a configuration problem. Try
|
happens after about a minute, it is probably a configuration problem. Try
|
||||||
to launch Anope with ./anope -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 subscribe to the Anope
|
||||||
@@ -109,19 +160,21 @@ Note: You should also read the README and FAQ files!
|
|||||||
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 ~/anope/conf) to anope.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 anope.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/anope/conf/anope.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 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, ~/anope/conf).
|
|
||||||
Copiez l'exemple de fichier de configuration (anope.example.conf) en
|
|
||||||
anope.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.anope.org.
|
|
||||||
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 anope.example.conf.
|
|
||||||
|
|
||||||
3) Configuration de l'IRCd
|
|
||||||
|
|
||||||
Anope agit 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 anope.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, ~/anope/bin). Tapez ./anope 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 ./anope -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, ~/anope/conf) en anope.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 anope.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/anope/conf/anope.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,606 @@
|
|||||||
|
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.
|
||||||
|
B) Make a backup copy of include/services.h, include/sysconf.h.in
|
||||||
|
C) Make a backup copy of Config and configure.in
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
Now that you have the files that you will need to create your own ircd
|
||||||
|
support, starting with Config. This file is a shell script file; scroll
|
||||||
|
down until you find the list of ircs for the user to select. Indicate
|
||||||
|
the based ircd version which is supported such as a series 1.x or 2.2.x,
|
||||||
|
placing in the comment side an exact version that the support is for or
|
||||||
|
"experimental" if you are not the ircd developer. The next step is to
|
||||||
|
decide how the IRCd will be defined, following the existing examples edit
|
||||||
|
'IRCTYPE_DEF="IRC_RATBOX"' to be the descriptive define for your ircd.
|
||||||
|
|
||||||
|
With the Config file ready to go, edit configure.in and find in there the
|
||||||
|
reference to --with-ircd. You should see the various other ircds, and
|
||||||
|
you will want to add yours in there using the same IRC_ name you came up
|
||||||
|
with above. Important in this step is to make sure that you set the
|
||||||
|
IRCDFILE to the name of the .c file you set in step 1. Once you have the
|
||||||
|
configure.in created you can remove the old configure and at the command
|
||||||
|
prompt type "autconf"; this will generate the new configure file.
|
||||||
|
|
||||||
|
Getting close to actually modify code. Open sysconf.h.in and add two
|
||||||
|
lines for your given ircd, which is similar to this:
|
||||||
|
|
||||||
|
/* "First IRCD type" */
|
||||||
|
#undef IRC_RATBOX
|
||||||
|
|
||||||
|
Open services.h and add a line with the rest of the ircd include files to
|
||||||
|
match the name of the .h file you set in step 1.
|
||||||
|
|
||||||
|
#include "ratbox.h"
|
||||||
|
|
||||||
|
Taking the .c and .h file open them and replace the #ifdef IRC_* with the
|
||||||
|
IRC_ name you set in step two. Ensure that the code comments at the top
|
||||||
|
of the file match the ircd that the code will be for.
|
||||||
|
|
||||||
|
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 PROTECT_SET_MODE "+"
|
||||||
|
#define PROTECT_UNSET_MODE "-"
|
||||||
|
#define CS_CMD_PROTECT "PROTECT"
|
||||||
|
#define CS_CMD_DEPROTECT "DEPROTECT"
|
||||||
|
#define FANT_PROTECT_ADD "!protect"
|
||||||
|
#define FANT_PROTECT_DEL "!deprotect"
|
||||||
|
#define LEVEL_PROTECT_WORD "AUTOPROTECT"
|
||||||
|
#define LEVELINFO_PROTECT_WORD "PROTECT"
|
||||||
|
#define LEVELINFO_PROTECTME_WORD "PROTECTME"
|
||||||
|
|
||||||
|
If the ircd supports a protective/admin (not owner) mode, set the
|
||||||
|
PROTECT_SET_MODE and PROTECT_UNSET_MODE to be that mode. On most ircds
|
||||||
|
it's usermode "a" so you will be setting it to "+a" and "-a". The next
|
||||||
|
two are based more on what this mode is called. When you message ChanServ
|
||||||
|
to get this mode, this is the command you will be using. After this are
|
||||||
|
the fantasy commands which can be used in channel to get these modes. The
|
||||||
|
next three relate to the ACCESS LEVEL list system. Again these are the
|
||||||
|
words to gain these levels in the ACCESS LEVEL system. If your ircd does
|
||||||
|
not have these functions, leave them at what ever value is currently set;
|
||||||
|
the core code will ignore the request of the user.
|
||||||
|
|
||||||
|
Now that this is set, you can 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 "+nt"
|
||||||
|
|
||||||
|
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:
|
||||||
|
|
||||||
|
const char version_protocol[] = "Ratbox IRCD";
|
||||||
|
|
||||||
|
This the protocol name which will appear in various places; especially
|
||||||
|
when you do -version at the command prompt, this is where you state the
|
||||||
|
server name. The version is not always needed unless you are showing that
|
||||||
|
the support is for one branch of a ircd family, such as Unreal 3.1 and
|
||||||
|
Unreal 3.2.
|
||||||
|
|
||||||
|
Once you have decided on this little piece of code, you will come to
|
||||||
|
flood mode characters being used for setting and removing. If your IRCd
|
||||||
|
does not support flood modes, you can just use ""; we will be setting if
|
||||||
|
your IRCD supports flooding or not in a little bit.
|
||||||
|
|
||||||
|
const char flood_mode_char_set[] = "+f";
|
||||||
|
const char flood_mode_char_remove[] = "-f";
|
||||||
|
|
||||||
|
The next task that you will face is setting whether the IRCD sends time
|
||||||
|
stamps on modes but does not tell us that it will do so. If it does, set
|
||||||
|
UseTSMODE to 1; if it does not set it to be 0. If you're not sure refer
|
||||||
|
to your IRCd's documentation on how MODE is sent.
|
||||||
|
|
||||||
|
int UseTSMODE = 0;
|
||||||
|
|
||||||
|
Now you've come to the part where you setup your ircd. There are two
|
||||||
|
structs which hold this information; This allows you to quickly setup
|
||||||
|
your specific ircd.
|
||||||
|
|
||||||
|
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 it's 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 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.
|
||||||
|
|
||||||
|
33) 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.
|
||||||
|
|
||||||
|
34) SGLINE: Does the IRCd support realname (geocs) bans? Use 1 for yes,
|
||||||
|
0 for no.
|
||||||
|
|
||||||
|
35) SQLINE: Does the IRCd support nick bans? Use 1 for yes, 0 for no.
|
||||||
|
|
||||||
|
36) SZLINE: Does the IRCd support SZLINES? Use 1 for yes, 0 for no.
|
||||||
|
|
||||||
|
37) HALFOP: Is channel mode +h for halfop supported by the IRCd? Use 1 for
|
||||||
|
yes, 0 for no.
|
||||||
|
|
||||||
|
38) Number of Server Args: When an IRCd connects, this is the number of
|
||||||
|
parameters that are passed.
|
||||||
|
|
||||||
|
39) Join to Set: Services must join a channel to set any modes on that
|
||||||
|
channel. Use 1 for yes, 0 for no.
|
||||||
|
|
||||||
|
40) 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.
|
||||||
|
|
||||||
|
41) Exceptions: Support for channel exceptions (mode +e). Use 1 for yes,
|
||||||
|
0 for no.
|
||||||
|
|
||||||
|
42) TS Topic Forward: Some IRCd's (like UnrealIRCd) like their topic TS
|
||||||
|
set forward by +1. Use 1 for yes, 0 for no.
|
||||||
|
|
||||||
|
43) 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.
|
||||||
|
|
||||||
|
44) Protected Umode: UMODE_ define that defines the protected usermod.
|
||||||
|
Use 0 for no support, or enter the UMODE_ define.
|
||||||
|
|
||||||
|
45) Admin: Support for channel admins (Mainly used by UltimateIRCd). Use
|
||||||
|
1 for yes, 0 for no.
|
||||||
|
|
||||||
|
46) SQline Channels: The IRCd's supports banning channel names via
|
||||||
|
SQLINES. Use 1 for yes, 0 for no.
|
||||||
|
|
||||||
|
47) 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.
|
||||||
|
|
||||||
|
48) SVSMODE -b: We can use SVSMODE to unban hosts from a channel. Use
|
||||||
|
1 for yes, 0 for no.
|
||||||
|
|
||||||
|
49) Protect: Support for channel protect (mode +a, mainly being used by
|
||||||
|
UnrealIRCd and ViagraIRCd). Use 1 for yes, 0 for no.
|
||||||
|
|
||||||
|
50) Reverse: We can do a reverse check when unbanning. For use with
|
||||||
|
DreamForge based IRCd's. Use 1 for yes, 0 for no.
|
||||||
|
|
||||||
|
51) Register Channels: Supports sending a channelmode for registered
|
||||||
|
channels. Use 1 for yes, 0 for no.
|
||||||
|
|
||||||
|
52) Registered Mode: Channelmode to set on registered channels, see the
|
||||||
|
option above. Use 1 for yes, 0 for no.
|
||||||
|
|
||||||
|
53) vIdent: Support for including a user's ident in their vHost. Use
|
||||||
|
1 for yes, 0 for no.
|
||||||
|
|
||||||
|
54) SVSHOLD: Support for temporarily 'holding' a nick, instead of using
|
||||||
|
a nick enforcer client. Use 1 for yes, 0 for no.
|
||||||
|
|
||||||
|
55) TS on MODE: We need to send a timestamp when modes are being changed.
|
||||||
|
Use 1 for yes, 0 for no.
|
||||||
|
|
||||||
|
56) 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.
|
||||||
|
|
||||||
|
57) Umode: We can use OperServ to change a user's mode. Use 1 for yes,
|
||||||
|
0 for no.
|
||||||
|
|
||||||
|
58) O:LINE: We can use OperServ to give some user a temporary O:LINE.
|
||||||
|
Use 1 for yes, 0 for no.
|
||||||
|
|
||||||
|
59) Vhost On Nick: On NICK the IRCd sends the VHOST. Use 1 for yes,
|
||||||
|
0 for no.
|
||||||
|
|
||||||
|
60) Change Realname: Change real name. Use 1 for yes, 0 for no.
|
||||||
|
|
||||||
|
61) Extra Help: If the IRCd has more help for functions in ChanServ than
|
||||||
|
the default help, you should put the language string
|
||||||
|
identifier here. Use 0 for no extra help.
|
||||||
|
|
||||||
|
62) No Knock: CMODE_ that defines NO KNOCK. Use 0 for no support.
|
||||||
|
|
||||||
|
63) Admin Only: CMODE_ that defines Admin Only. Use 0 for no support.
|
||||||
|
|
||||||
|
64) Default MLock: Default channelmodes for MLOCK. Use 0 for no modes.
|
||||||
|
|
||||||
|
65) Vhost Umode: UMODE_ that indicates if the user currently has a vHost.
|
||||||
|
Use 0 for no support.
|
||||||
|
|
||||||
|
66) Flood Mode: The IRCd has a channelmode for blocking floods. Use 1 for
|
||||||
|
yes, 0 for no.
|
||||||
|
|
||||||
|
67) Link Mode: The IRCd has a channelmode for linking a channel to some
|
||||||
|
other channel. Use 1 for yes, 0 for no.
|
||||||
|
|
||||||
|
68) CMode F: CMODE_ that defines flood mode. Use 0 for no support.
|
||||||
|
|
||||||
|
69) CMode L: CMODE_ that defines link mode. Use 0 for no support.
|
||||||
|
|
||||||
|
70) 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.
|
||||||
|
|
||||||
|
71) No Knock Requires +i: Does the No Knock channel mode require invite
|
||||||
|
only channels? Use 1 for yes, 0 for no.
|
||||||
|
|
||||||
|
72) Chan Modes: If sent in CAPAB/PROTOCOL, we store it in here. This is
|
||||||
|
NULL by default.
|
||||||
|
|
||||||
|
73) Tokens: Can we use tokens to talk to the IRCd? Use 1 for yes,
|
||||||
|
0 for no.
|
||||||
|
|
||||||
|
74) Token Case Senstive: Are the IRCd's TOKENS/COMMANDS case sensitive?
|
||||||
|
Use 1 for yes, 0 for no.
|
||||||
|
|
||||||
|
75) base64 SJOIN TS: Are the timestamps sent with a SJOIN in base64? Use
|
||||||
|
1 for yes, 0 for no.
|
||||||
|
|
||||||
|
76) Supports +I: Does the IRCd support channelmode +I? Use 1 for yes,
|
||||||
|
0 for no.
|
||||||
|
|
||||||
|
77) SJOIN Ban Char: Character used to identify bans. Use ''.
|
||||||
|
|
||||||
|
78) SJOIN Except Char: Character used to identify exceptions. use ''.
|
||||||
|
|
||||||
|
79) SVSMODE UCMODE: Can we clear user channel modes with SVSMODE? Use
|
||||||
|
1 for yes, 0 for no.
|
||||||
|
|
||||||
|
80) SGline Enforce: Does the IRCd enforce SGLINES for us or do we need to
|
||||||
|
do so? Use 1 for yes, 0 for no.
|
||||||
|
|
||||||
|
81) Vhost Character: The character used to represent the vHost mode, if
|
||||||
|
this is supported by the IRCd.
|
||||||
|
|
||||||
|
82) TS6: Does the IRCd support TS6? Use 1 for yes, 0 for no.
|
||||||
|
|
||||||
|
83) UMode +h: Does the IRCd support usermode +h for helpers?
|
||||||
|
Use 1 for yes, 0 for no.
|
||||||
|
|
||||||
|
84) P10: Is this IRCd a P10-style IRCd? Use 1 for yes, 0 for no.
|
||||||
|
|
||||||
|
85) Character Set: Unreal passes the character set during PROTOCTL,
|
||||||
|
the value is stored here. Set this NULL to start.
|
||||||
|
|
||||||
|
86) 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.
|
||||||
|
|
||||||
|
87) 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.
|
||||||
|
|
||||||
|
88) Throttle Mode: The IRCd has a channelmode for throttling joins per-user.
|
||||||
|
Use 1 for yes, 0 for no.
|
||||||
|
|
||||||
|
89) CMode j: CMODE_ that defines throttle mode. Use 0 for no support.
|
||||||
|
|
||||||
|
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.c find the function anope_cmd_capab(); this function will
|
||||||
|
send the CAPAB/PROTOCTL line (consult your ircd documentation for
|
||||||
|
which to send). In a single line type in the tokens that anope must
|
||||||
|
send. Here is an example of Hybrid's capab line:
|
||||||
|
|
||||||
|
/* CAPAB */
|
||||||
|
void anope_cmd_capab()
|
||||||
|
{
|
||||||
|
send_cmd(NULL, "CAPAB TS5 EX IE HOPS HUB AOPS");
|
||||||
|
}
|
||||||
|
|
||||||
|
2) 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.
|
||||||
|
|
||||||
|
3) 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,65 +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 install the locales-all package.
|
|
||||||
|
|
||||||
On Ubuntu run locale-gen for each language you want to enable.
|
|
||||||
For example:
|
|
||||||
locale-gen es_ES.UTF-8
|
|
||||||
|
|
||||||
Then execute:
|
|
||||||
dpkg-reconfigure locales
|
|
||||||
|
|
||||||
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 anope.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 send it to team@anope.org
|
|
||||||
(don't forget to mention clearly your (nick)name, your email and the language name). You'll of course get full credit for it.
|
|
||||||
|
|
||||||
NOTE: There is no guarantee we will use your work so please do not be offended if we say no thanks.
|
|
||||||
|
|
||||||
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.
|
|
||||||
+42
-46
@@ -12,7 +12,7 @@ Anope Modules
|
|||||||
|
|
||||||
1) Introduction
|
1) Introduction
|
||||||
|
|
||||||
Anope supports external modules. External modules are pieces
|
Anope 1.6 onwards supports external modules. External modules are pieces
|
||||||
of code that can be attached to a running Anope process dynamically. These
|
of code that can be attached to a running Anope process dynamically. These
|
||||||
modules can serve several purposes, and perform all kind of operations to
|
modules can serve several purposes, and perform all kind of operations to
|
||||||
enhance your network.
|
enhance your network.
|
||||||
@@ -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 ~/anope/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 ~/anope/
|
|
||||||
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.
|
||||||
|
|
||||||
@@ -117,12 +112,13 @@ Anope Modules
|
|||||||
|
|
||||||
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:
|
||||||
|
|
||||||
|
* http://wiki.anope.org/
|
||||||
|
|
||||||
* https://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 it's 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.
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
Highlighted News in Anope 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 !!!
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
For the full changes, see the Changes file.
|
||||||
|
|
||||||
|
For announcements and discussions about Anope, please visit our
|
||||||
|
web site http://www.anope.org
|
||||||
|
|
||||||
|
|
||||||
+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 it's 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 it's 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.
|
||||||
+190
-69
@@ -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-2009 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,7 @@ Table of Contents
|
|||||||
3) Installation
|
3) Installation
|
||||||
4) Command Line Options
|
4) Command Line Options
|
||||||
5) Messages Translation
|
5) Messages Translation
|
||||||
6) Contact
|
6) Contact and Mailing List
|
||||||
|
|
||||||
1) Credits
|
1) Credits
|
||||||
|
|
||||||
@@ -74,8 +76,8 @@ Table of Contents
|
|||||||
* Adam <adam@anope.org>
|
* Adam <adam@anope.org>
|
||||||
* 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>
|
||||||
@@ -89,38 +91,59 @@ Table of Contents
|
|||||||
* Jens Voss <dukepyrolator@anope.org>
|
* Jens Voss <dukepyrolator@anope.org>
|
||||||
* JH <jh@irc-chat.net>
|
* JH <jh@irc-chat.net>
|
||||||
* Joris Vink <joris@anope.org>
|
* Joris Vink <joris@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>
|
|
||||||
* 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>
|
* Thomas Juberg Stensås <ShadowMaster@Shadow-Realm.org>
|
||||||
* Sebastian V <hal9000@anope.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)
|
* Stuff <the.stuff@gmx.de> (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)
|
|
||||||
* Yusuf Kurekci <ysfm.20@gmail.com> (tr_TR)
|
|
||||||
|
|
||||||
Anope Web panel:
|
Anope uses the strlcat() and strlcpy() functions from OpenSSH 2.5.1p2.
|
||||||
|
These functions are copyrighted by Todd C. Miller:
|
||||||
* Denis M. (Phr33d0m) <god@politeia.in>
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
|
||||||
2) Presentation
|
2) Presentation
|
||||||
|
|
||||||
Anope is a set of services for IRC networks that allows users to manage
|
Anope is a set of Services for IRC networks that allows users to manage
|
||||||
their nicks and channels in a secure and efficient way, and administrators
|
their nicks and channels in a secure and efficient way, and administrators
|
||||||
to manage their network with powerful tools.
|
to manage their network with powerful tools.
|
||||||
|
|
||||||
@@ -162,18 +185,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 2.0 or later
|
* Bahamut 1.4.27 or later (including 1.8)
|
||||||
* ircd-hybrid 8.2.23 or later
|
* Charybdis 1.0 or later
|
||||||
* InspIRCd 3 or later
|
* DreamForge 4.6.7
|
||||||
* ngIRCd 19.2 or later
|
* Hybrid 7 or later
|
||||||
* Plexus 3 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 beta-6 or later
|
||||||
* Ratbox 2.0.6 or later
|
* Ratbox 2.0.6 or later
|
||||||
* Solanum (all versions)
|
* ShadowIRCd 4.0 beta 7 or later
|
||||||
* UnrealIRCd 4 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 +219,161 @@ 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 Anope 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).
|
||||||
|
|
||||||
|
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
|
||||||
|
(basically, you'll have to modify lang/Makefile, language.c and
|
||||||
|
maybe services.h), 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) Contact
|
6) 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.anope.org #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 @@
|
|||||||
Anope has Redis database support (https://redis.io/).
|
|
||||||
This document explains the data structure used by Anope, and explains how
|
|
||||||
keyspace notification works.
|
|
||||||
|
|
||||||
This is not a tutorial on how to use Redis, see https://redis.io/documentation
|
|
||||||
for that.
|
|
||||||
|
|
||||||
Table of Contents
|
|
||||||
-----------------
|
|
||||||
1) Data structure
|
|
||||||
2) Keyspace notifications
|
|
||||||
3) Examples of modifying, deleting, and creating objects
|
|
||||||
|
|
||||||
1) Data structure
|
|
||||||
|
|
||||||
There are 4 key namespaces in Anope, they are:
|
|
||||||
|
|
||||||
id - The keys in id are used to atomically create object ids for new
|
|
||||||
objects. For example, if I were to create a new BotInfo I would first:
|
|
||||||
|
|
||||||
redis 127.0.0.1:6379> INCR id:BotInfo
|
|
||||||
|
|
||||||
To get the object ID of the new object.
|
|
||||||
|
|
||||||
ids - The keys in ids contain a set of all object ids of the given type.
|
|
||||||
For example:
|
|
||||||
|
|
||||||
redis 127.0.0.1:6379> SMEMBERS ids:BotInfo
|
|
||||||
|
|
||||||
Returns "1", "2", "3", "4", "5", "6", "7", "8" because I have 8 bots that
|
|
||||||
have IDs 1, 2, 3, 4, 5, 6, 7, and 8, respectively.
|
|
||||||
|
|
||||||
hash - The keys in hash are the actual objects, stored as hashes. For
|
|
||||||
example, if I had just looked up all BotInfo ids and wanted to iterate
|
|
||||||
over all of them, I would start by:
|
|
||||||
|
|
||||||
redis 127.0.0.1:6379> HGETALL hash:BotInfo:1
|
|
||||||
|
|
||||||
Which gets all keys and values from the hash of type BotInfo with id 1.
|
|
||||||
This may return:
|
|
||||||
|
|
||||||
"nick" -> "BotServ"
|
|
||||||
"user" -> "services"
|
|
||||||
"host" -> "services.anope.org"
|
|
||||||
"created" -> "1368704765"
|
|
||||||
|
|
||||||
value - The keys in value only exist to aid looking up object IDs. They
|
|
||||||
are sets of object IDs and are used to map key+value pairs to objects.
|
|
||||||
For example:
|
|
||||||
|
|
||||||
redis 127.0.0.1:6379> SMEMBERS value:NickAlias:nick:Adam
|
|
||||||
|
|
||||||
Returns a set of object ids of NickAlias objects that have the key
|
|
||||||
'nick' set to the value 'Adam' in its hash. Clearly this can only
|
|
||||||
ever contain at most one object, since it is not possible to have
|
|
||||||
more than one registered nick with the same name, but other keys
|
|
||||||
will contain more than one, such as:
|
|
||||||
|
|
||||||
redis 127.0.0.1:6379> SMEMBERS value:NickCore:email:adam@anope.org
|
|
||||||
|
|
||||||
Which would return all accounts with the email "adam@anope.org".
|
|
||||||
|
|
||||||
redis 127.0.0.1:6379> SMEMBERS value:ChanAccess:mask:Adam
|
|
||||||
|
|
||||||
Which would return all access entries set on the account "Adam".
|
|
||||||
|
|
||||||
Behavior similar to SQL's AND, can be achieved using the
|
|
||||||
SINTER command, which does set intersection on one or more sets.
|
|
||||||
|
|
||||||
2) Keyspace notifications
|
|
||||||
|
|
||||||
Redis 2.7 (unstable) and 2.8 (stable) and newer support keyspace notifications
|
|
||||||
(https://redis.io/topics/notifications). This allows Redis to notify Anope of
|
|
||||||
any external changes to objects in the database. Once notified, Anope will
|
|
||||||
immediately update the object. Otherwise, Anope keeps all objects in memory
|
|
||||||
and will not regularly read from the database once started.
|
|
||||||
|
|
||||||
You can use this to modify objects in Redis and have them immediately reflected
|
|
||||||
back into Anope. Additionally you can use this feature to run multiple Anope
|
|
||||||
instances simultaneously from the same database (see also, Redis database
|
|
||||||
replication).
|
|
||||||
|
|
||||||
To use keyspace notifications you MUST execute
|
|
||||||
|
|
||||||
redis 127.0.0.1:6379> CONFIG SET notify-keyspace-events KA
|
|
||||||
OK
|
|
||||||
|
|
||||||
or set notify-keyspace-events in redis.conf properly. Anope always executes
|
|
||||||
CONFIG SET when it first connects.
|
|
||||||
|
|
||||||
If you do not enable keyspace events properly Anope will be UNABLE to see any
|
|
||||||
object modifications you do.
|
|
||||||
|
|
||||||
The key space ids and value are managed entirely by Anope, you do
|
|
||||||
not (and should not) modify them. Once you modify the object (hash), Anope will
|
|
||||||
update them for you to correctly reflect any changes made to the object.
|
|
||||||
|
|
||||||
Finally, always use atomic operations. If you are inserting a new object with
|
|
||||||
multiple commands, or inserting multiple objects at once, specifically if the
|
|
||||||
objects depend on each other, you MUST use a transaction.
|
|
||||||
|
|
||||||
3) Examples of modifying, deleting, and creating objects
|
|
||||||
|
|
||||||
These examples will ONLY work if you meet the criteria in section 2.
|
|
||||||
|
|
||||||
If I want to change the email account 'Adam' to 'Adam@anope.org', I would execute the following:
|
|
||||||
|
|
||||||
redis 127.0.0.1:6379> SMEMBERS value:NickCore:display:Adam
|
|
||||||
|
|
||||||
Which returns a value of "1", which is the object id I want to modify.
|
|
||||||
Now to change the email:
|
|
||||||
|
|
||||||
redis 127.0.0.1:6379> HSET hash:NickCore:1 email Adam@anope.org
|
|
||||||
|
|
||||||
You can now see this in NickServ's INFO command:
|
|
||||||
-NickServ- Email address: Adam@anope.org
|
|
||||||
|
|
||||||
If I want to drop the account "Adam", I would execute the following:
|
|
||||||
|
|
||||||
redis 127.0.0.1:6379> SMEMBERS value:NickCore:display:Adam
|
|
||||||
|
|
||||||
Which returns a value of "1". I would then check:
|
|
||||||
|
|
||||||
redis 127.0.0.1:6379> SMEMBERS value:NickAlias:nc:Adam
|
|
||||||
|
|
||||||
To see what nicknames depend on this account to exist, as I will
|
|
||||||
have to remove those too. This returns the values "2", and "3".
|
|
||||||
|
|
||||||
Finally, I can drop the nick using a transaction via:
|
|
||||||
|
|
||||||
redis 127.0.0.1:6379> MULTI
|
|
||||||
OK
|
|
||||||
redis 127.0.0.1:6379> DEL hash:NickAlias:2
|
|
||||||
QUEUED
|
|
||||||
redis 127.0.0.1:6379> DEL hash:NickAlias:3
|
|
||||||
QUEUED
|
|
||||||
redis 127.0.0.1:6379> DEL hash:NickCore:1
|
|
||||||
QUEUED
|
|
||||||
redis 127.0.0.1:6379> EXEC
|
|
||||||
|
|
||||||
Or alternatively simply:
|
|
||||||
|
|
||||||
redis 127.0.0.1:6379> DEL hash:NickAlias:2 hash:NickAlias:3 hash:NickCore:1
|
|
||||||
|
|
||||||
If I wanted to create a BotServ bot, I would execute the following:
|
|
||||||
|
|
||||||
redis 127.0.0.1:6379> INCR id:BotInfo
|
|
||||||
|
|
||||||
Which returns a new object ID for me, in this example it will be "8".
|
|
||||||
Now I can create the object:
|
|
||||||
|
|
||||||
HMSET hash:BotInfo:8 nick redis user redis host services.anope.org realname "Anope IRC Services"
|
|
||||||
|
|
||||||
Note if you are using HSET instead of HMSET you will need to use a transaction, as shown in the above example.
|
|
||||||
If you are watching your services logs you will immediately see:
|
|
||||||
|
|
||||||
USERS: redis!redis@services.anope.org (Anope IRC Services) connected to the network (services.anope.org)
|
|
||||||
|
|
||||||
And the bot redis will be in BotServ's bot list.
|
|
||||||
Notice how ids:BotInfo and the value keys are updated automatically.
|
|
||||||
+209
-161
@@ -1,161 +1,209 @@
|
|||||||
Anope for Windows
|
Anope for Windows
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
1) Building the Source
|
1) Building the Source
|
||||||
2) Installation
|
2) Installation
|
||||||
3) Compiling Modules
|
3) Compiling Modules
|
||||||
4) Other compile options
|
4) Other compile options
|
||||||
5) Credits
|
5) Credits
|
||||||
|
|
||||||
1) Building the Source
|
1) Building the Source
|
||||||
|
|
||||||
NOTE: If you have downloaded one of the pre-compiled installers, you do
|
NOTE: If you have downloaded one of the pre-compiled installers, you do
|
||||||
NOT need to complete this step, and you can proceed to step 2.
|
NOT need to complete this step, and you can proceed to step 2.
|
||||||
|
|
||||||
If you want to build Anope from source on a Win32 system, you will need
|
If you want to build Anope from source on a Win32 system, you will need
|
||||||
to follow this instructions:
|
to follow this instructions:
|
||||||
|
|
||||||
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++ 6, 7 (.NET 2002/2003) or 8 (2005) skip ahead to step 2, else you
|
||||||
https://cmake.org/download/
|
need to download the following free components from Microsoft. Once
|
||||||
|
downloaded, install these packages.
|
||||||
(NOTE: When installing, tell CMake to add itself to the PATH.)
|
|
||||||
|
* Microsoft Visual C++ 2008 Express Edition:
|
||||||
If you have Visual C++ 10 or 11 (2010/2012) skip ahead to step 2, else you
|
http://www.microsoft.com/express/vc/
|
||||||
need to download and install the following free component from Microsoft.
|
|
||||||
|
or
|
||||||
* Microsoft Visual C++ 2010 Express Edition:
|
|
||||||
http://www.microsoft.com/visualstudio/eng/downloads#d-2010-express
|
* Microsoft Visual C++ 2005 Express Edition:
|
||||||
|
http://msdn.microsoft.com/vstudio/express/visualc/download/
|
||||||
2) Unpack the Anope tarball with your favorite uncompression program
|
|
||||||
(WinZip or WinRAR, etc).
|
then download and install:
|
||||||
|
|
||||||
3) Bring up the Visual C++ Command Prompt; This will launch a
|
* Microsoft Windows PlatformSDK: (Requires WGA validation)
|
||||||
DOS Command Prompt like window, which will set the environment
|
http://www.microsoft.com/downloads/details.aspx?FamilyId=0BAF2B35-C656-4969-ACE8-E4C0C0716ADB&displaylang=en
|
||||||
properties needed to make Anope.
|
|
||||||
|
(NOTE: Although this says for Windows Server 2003, it does infact work on all supported
|
||||||
Create a new directory, which will be used to hold the build files. You can make it
|
versions of Windows. When installing, you should select the Custom option, and ensure
|
||||||
be a directory under the source directory unpacked in step 2, or somewhere else entirely.
|
that only the top selection, and the bottom selection are checked. This will cut down
|
||||||
|
install time dramatically)
|
||||||
Change directories to this new folder, by typing:
|
|
||||||
|
* MySQL for Windows (only needed if building with MySQL enabled):
|
||||||
cd <path to build directory>
|
http://dev.mysql.com/
|
||||||
|
|
||||||
e.g.
|
(NOTE: Anope can be compiled against MySQL Version 3.23 and above)
|
||||||
|
|
||||||
cd c:\anope-build
|
|
||||||
|
2) Unpack the Anope tarball with your favorite uncompression program
|
||||||
4) You now need to configure Anope to your requirements. At the prompt type:
|
(WinZip or WinRAR, etc).
|
||||||
|
|
||||||
<path to source directory>\Config.exe
|
3) Bring up the Visual C++ Command Prompt; This will launch a
|
||||||
|
DOS Command Prompt like window, which will set the environment
|
||||||
NOTE: If you run an Anti-Virus program such as McAfee or Norton, you may
|
properties needed to make Anope.
|
||||||
be unable to run this command due to the protection in place. Some Anti-
|
|
||||||
Virus programs may detect the Anope Configuration Tool as a worm, however
|
Change directories to where you unpacked the source code in step 2, by typing:
|
||||||
this is not the case. If you are prompted to allow or deny execution of
|
|
||||||
the script, you should choose allow. If the script fails to run, and no
|
cd <path to extracted source>
|
||||||
notice is displayed, please check your Anti-Virus settings before seeking
|
|
||||||
assistance.
|
e.g.
|
||||||
|
|
||||||
An interactive configuration program should guide you through the install
|
cd c:\anope-trunk
|
||||||
options. You will be given a choice to use NMake or not. NMake will compile
|
|
||||||
inside the command prompt window you are in. If you want to build within
|
4) You now need to configure Anope to your requirements. At the prompt type:
|
||||||
the Visual C++ IDE, say no to that option, and it'll create a Solution for
|
|
||||||
you to open up.
|
Config.bat
|
||||||
|
|
||||||
If you cannot find whats causing the error, please visit our forums or
|
NOTE: If you run an Anti-Virus program such as McAfee or Norton, you may
|
||||||
our IRC Support channel for assistance.
|
be unable to run this command due to the protection in place. Some Anti-
|
||||||
|
Virus programs may detect the Anope Configuration Tool as a worm, however
|
||||||
Some Anope modules require third party libraries, such as mysql and
|
this is not the case. If you are prompted to allow or deny execution of
|
||||||
the SSL modules. If these libraries are installed in nonstandard
|
the script, you should choose allow. If the script fails to run, and no
|
||||||
locations, cmake will probably not find them and should be told where
|
notice is displayed, please check your Anti-Virus settings before seeking
|
||||||
they are by passing their location to Config.
|
assistance.
|
||||||
|
|
||||||
The libraries used to build the 'extra' modules are available at
|
An interactive configuration program should guide you through the install
|
||||||
https://github.com/Adam-/windows-scripts.
|
options, and then detect your Microsoft Visual C++ Library files. If it
|
||||||
|
fails to detect them, you should check you have everything installed.
|
||||||
5) You are now ready to compile. If you said you wanted to use NMake in step 4,
|
|
||||||
at the prompt type:
|
If you cannot find whats causing the error, please visit our forums or
|
||||||
|
our IRC Support channel for assistance.
|
||||||
nmake
|
|
||||||
|
5) You are now ready to compile. At the prompt type:
|
||||||
Once you are back at the command prompt again, if there have been no
|
|
||||||
errors, you are ready to go.
|
nmake -f Makefile.win32
|
||||||
|
|
||||||
If instead you decided to use the Visual C++ IDE, open up the Anope.sln
|
Once you are back at the command prompt again, if there have been no
|
||||||
file. After the IDE has fully loaded, hit F7 to build everything.
|
errors, you are ready to go.
|
||||||
|
|
||||||
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
|
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.
|
||||||
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.
|
2) Installation
|
||||||
|
|
||||||
When you have done this, all the files will be installed to where they belong.
|
Since Anope for Windows does not use a visual interface, you must do the
|
||||||
The only thing you need to do is rename "data/anope.example.conf" to be "data/anope.conf",
|
configuration with a text editor before proceeding with running Anope
|
||||||
and then follow the steps to set up Anope.
|
itself.
|
||||||
|
|
||||||
You have now completed the building phase of Anope for Windows. You can
|
NOTE: You may need to open the configuration file with Wordpad, or a text
|
||||||
now move on to the next section, which is related to setting up Anope.
|
editor which supports UNIX line endings. Opening the configuration file in
|
||||||
|
Notepad will cause strange characters to appear, and you may not be able to
|
||||||
2) Installation
|
edit the file correctly.
|
||||||
|
|
||||||
Since Anope for Windows does not use a visual interface, you must do the
|
Open services.conf, and read through it carefully and adjust the settings
|
||||||
configuration with a text editor before proceeding with running Anope
|
you think you need to adjust. Pay special attention to these settings:
|
||||||
itself.
|
|
||||||
|
A) IRCDModule: This is the name of an IRCd Module that Anope will use
|
||||||
NOTE: You may need to open the configuration file with Wordpad, or a text
|
to communicate with your server. Anope supports 15 IRCds,
|
||||||
editor which supports UNIX line endings. Opening the configuration file in
|
so ensure you set the right value here.
|
||||||
Notepad will cause strange characters to appear, and you may not be able to
|
B) RemoteServer: This is the address to your ircd, along with the port
|
||||||
edit the file correctly.
|
and password. You should consult your ircd
|
||||||
|
documentation on how to link ircds.
|
||||||
Open anope.conf, and read through it carefully and adjust the settings
|
C) ServicesRoot: Remove the # and change the names to your nick so you
|
||||||
you think you need to adjust.
|
can take control of services once they are online.
|
||||||
|
D) UserKey1/2/3: Remove the # infront of the three UserKey settings, and
|
||||||
If you are unsure of the settings, you can go to the dos command prompt
|
change the parameters to numbers; around 6-7 digits will
|
||||||
and run "anope.exe --nofork --debug" and watch the information as it
|
do.
|
||||||
attempts to connect.
|
|
||||||
|
If you are unsure of the settings, you can go to the dos command prompt
|
||||||
You can launch services in two ways. If you are sure that the entered
|
and run "anope.exe -nofork -debug" and watch the information as it
|
||||||
configuration information is correct, simply double clicking the Anope
|
attempts to connect.
|
||||||
executable will cause it to start; no window will pop up. If you'd rather
|
|
||||||
have a more textual output, you can start at the dos prompt and type in
|
You can launch services in two ways. If you are sure that the entered
|
||||||
"anope.exe". If services are successfully started up the dos prompt will
|
configuration information is correct, simply double clicking the Anope
|
||||||
seem to hang; at this point you can safely close the dos window.
|
executable will cause it to start; no window will pop up. If you'd rather
|
||||||
|
have a more textual output, you can start at the dos prompt and type in
|
||||||
3) Compiling Modules
|
"anope.exe". If services are successfully started up the dos prompt will
|
||||||
|
seem to hang; at this point you can safely close the dos window.
|
||||||
If you want to build other modules than the ones shipped by default, you
|
|
||||||
will need to rerun Config.exe
|
3) Compiling Modules
|
||||||
|
|
||||||
4) Other compile options
|
If you want to build other modules than the ones shipped by default, you
|
||||||
|
will need to modify the Makefile.inc.win32 file, in the src\modules folder.
|
||||||
A) If you have trouble recompiling Anope, you should delete all files and folders
|
|
||||||
within the build folder you created in step 3 of section 1. Afterwards, follow
|
A) Add modules; find the line stating "SRCS=" and add the name of the
|
||||||
the directions from step 4 of section 1 down.
|
file to the end of the line. So if you have two files:
|
||||||
|
|
||||||
5) Credits
|
SRCS=file.c file2.c
|
||||||
|
|
||||||
Anope is based on Epona and IRCServices. See CREDITS for more credits and
|
If you are compiling a folder of module components, such as the example
|
||||||
a complete list of all developers.
|
"catserv", you will need to add/change the "SUBS=" line. If you were
|
||||||
|
compiling the "catserv" example, the line would look like this:
|
||||||
Anope's Windows-specific code is provided by:
|
|
||||||
|
SUBS=catserv
|
||||||
* Dominick Meglio <codemastr@unrealircd.com>
|
|
||||||
* Trystan Scott Lee <trystan@nomadirc.net>
|
B) When you've done this, use the same command prompt you set up in part
|
||||||
* Chris Hogben <heinz@anope.org>
|
1, change directories to the src\modules folder, and type:
|
||||||
|
|
||||||
Anope's Windows Installer was made using:
|
nmake -f Makefile.win32
|
||||||
|
|
||||||
* NSIS 2.20 <http://nsis.sourceforge.net>
|
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
|
||||||
|
|
||||||
|
A) If you have trouble recompiling Anope, you should try:
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
Anope is based on Epona and IRCServices. See CREDITS for more credits and
|
||||||
|
a complete list of all developers.
|
||||||
|
|
||||||
|
Anope's Windows-specific code is provided by:
|
||||||
|
|
||||||
|
* Dominick Meglio <codemastr@unrealircd.com>
|
||||||
|
* Trystan Scott Lee <trystan@nomadirc.net>
|
||||||
|
* Chris Hogben <heinz@anope.org>
|
||||||
|
|
||||||
|
Anope's Windows Installer was made using:
|
||||||
|
|
||||||
|
* NSIS 2.20 <http://nsis.sourceforge.net>
|
||||||
|
|
||||||
|
|||||||
@@ -1,29 +0,0 @@
|
|||||||
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 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,22 +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()
|
|
||||||
|
|
||||||
# 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)
|
|
||||||
@@ -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-2024 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#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 final
|
|
||||||
{
|
|
||||||
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 final
|
|
||||||
{
|
|
||||||
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;
|
|
||||||
Anope::string description;
|
|
||||||
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 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 final
|
|
||||||
{
|
|
||||||
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(); }
|
|
||||||
};
|
|
||||||
@@ -1,246 +0,0 @@
|
|||||||
/*
|
|
||||||
*
|
|
||||||
* (C) 2003-2024 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "extensible.h"
|
|
||||||
#include "serialize.h"
|
|
||||||
#include "anope.h"
|
|
||||||
#include "memo.h"
|
|
||||||
#include "base.h"
|
|
||||||
|
|
||||||
typedef Anope::unordered_map<NickAlias *> nickalias_map;
|
|
||||||
typedef Anope::unordered_map<NickCore *> nickcore_map;
|
|
||||||
typedef std::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 final
|
|
||||||
: public Serializable
|
|
||||||
, public Extensible
|
|
||||||
{
|
|
||||||
Anope::string vhost_ident, vhost_host, vhost_creator;
|
|
||||||
time_t vhost_created = 0;
|
|
||||||
|
|
||||||
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 = Anope::CurTime;
|
|
||||||
time_t last_seen = Anope::CurTime;
|
|
||||||
|
|
||||||
/* 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 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 mask
|
|
||||||
* @param the mask
|
|
||||||
*/
|
|
||||||
Anope::string GetVHostMask() 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 final
|
|
||||||
: 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;
|
|
||||||
/* Last time an email was sent to this user */
|
|
||||||
time_t lastmail = 0;
|
|
||||||
/* The time this account was registered */
|
|
||||||
time_t time_registered = Anope::CurTime;
|
|
||||||
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 = nullptr;
|
|
||||||
|
|
||||||
/* Unsaved data */
|
|
||||||
|
|
||||||
/** The display nick for this account. */
|
|
||||||
NickAlias *na = nullptr;
|
|
||||||
/* Number of channels registered by this account */
|
|
||||||
uint16_t channelcount = 0;
|
|
||||||
/* 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 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(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;
|
|
||||||
|
|
||||||
/** Retrieves the account id for this user */
|
|
||||||
uint64_t GetId();
|
|
||||||
|
|
||||||
/** 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 = false;
|
|
||||||
bool success = false;
|
|
||||||
|
|
||||||
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);
|
|
||||||
};
|
|
||||||
-794
@@ -1,794 +0,0 @@
|
|||||||
/*
|
|
||||||
*
|
|
||||||
* (C) 2003-2024 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#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 final
|
|
||||||
{
|
|
||||||
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;
|
|
||||||
typedef std::string::value_type value_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) { }
|
|
||||||
string(const string &) = default;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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 <rim(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); }
|
|
||||||
|
|
||||||
inline int compare(size_t pos, size_t len, const string &str) const { return ci::string(this->_string.c_str()).compare(pos, len, ci::string(str.c_str())); }
|
|
||||||
inline int compare(size_t pos, size_t len, const string &str, size_t subpos, size_type sublen = npos) const { return ci::string(this->_string.c_str()).compare(pos, len, ci::string(str.c_str()), subpos, sublen); }
|
|
||||||
inline int compare(size_t pos, size_t len, const char *s, size_type n = npos) const { return ci::string(this->_string.c_str()).compare(pos, len, s, n); }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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 (auto &chr : new_string)
|
|
||||||
chr = Anope::tolower(chr);
|
|
||||||
return new_string;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the string in uppercase.
|
|
||||||
*/
|
|
||||||
inline string upper() const
|
|
||||||
{
|
|
||||||
Anope::string new_string = *this;
|
|
||||||
for (auto &chr : new_string)
|
|
||||||
chr = Anope::toupper(chr);
|
|
||||||
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 final
|
|
||||||
{
|
|
||||||
inline size_t operator()(const string &s) const
|
|
||||||
{
|
|
||||||
return std::hash<std::string>()(s.lower().str());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
struct hash_cs final
|
|
||||||
{
|
|
||||||
inline size_t operator()(const string &s) const
|
|
||||||
{
|
|
||||||
return std::hash<std::string>()(s.str());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
struct compare final
|
|
||||||
{
|
|
||||||
inline bool operator()(const string &s1, const string &s2) const
|
|
||||||
{
|
|
||||||
return s1.equals_ci(s2);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
using map = std::map<string, T, ci::less>;
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
using multimap = std::multimap<string, T, ci::less>;
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
using unordered_map = std::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;
|
|
||||||
extern CoreExport long long CurTimeNs;
|
|
||||||
|
|
||||||
/** The debug level we are running at.
|
|
||||||
*/
|
|
||||||
extern CoreExport int Debug;
|
|
||||||
|
|
||||||
/** Other command line options.
|
|
||||||
*/
|
|
||||||
extern CoreExport bool ReadOnly, NoFork, NoThird, NoPID, NoExpire, ProtocolDebug;
|
|
||||||
|
|
||||||
/** The root of the Anope installation. Usually ~/anope
|
|
||||||
*/
|
|
||||||
extern CoreExport Anope::string ServicesDir;
|
|
||||||
|
|
||||||
/** Anope binary name (eg anope)
|
|
||||||
*/
|
|
||||||
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 size_t 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 bool 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 bool Encrypt(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, ...) ATTR_FORMAT(1, 2);
|
|
||||||
|
|
||||||
/** 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 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 &);
|
|
||||||
|
|
||||||
/** Parses a raw message from the uplink and calls its command handler.
|
|
||||||
* @param message Raw message from the uplink
|
|
||||||
*/
|
|
||||||
extern void Process(const Anope::string &message);
|
|
||||||
|
|
||||||
/** Calls the command handler for an already parsed message.
|
|
||||||
* @param source Source of the message.
|
|
||||||
* @param command Command name.
|
|
||||||
* @param params Any extra parameters.
|
|
||||||
* @param tags IRCv3 message tags.
|
|
||||||
*/
|
|
||||||
extern CoreExport void ProcessInternal(MessageSource &src, const Anope::string &command, const std::vector<Anope::string> ¶ms, const Anope::map<Anope::string> & tags);
|
|
||||||
|
|
||||||
/** 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);
|
|
||||||
|
|
||||||
/** Generate a random number. */
|
|
||||||
extern CoreExport int RandomNumber();
|
|
||||||
|
|
||||||
/** Calculates the levenshtein distance between two strings.
|
|
||||||
* @param s1 The first string.
|
|
||||||
* @param s2 The second string.
|
|
||||||
*/
|
|
||||||
extern CoreExport size_t Distance(const Anope::string &s1, const Anope::string &s2);
|
|
||||||
|
|
||||||
/** Update the current time. */
|
|
||||||
extern CoreExport void UpdateTime();
|
|
||||||
|
|
||||||
/** Expands a path fragment that is relative to the base directory.
|
|
||||||
* @param base The base directory that it is relative to.
|
|
||||||
* @param fragment The fragment to expand.
|
|
||||||
*/
|
|
||||||
extern CoreExport Anope::string Expand(const Anope::string &base, const Anope::string &fragment);
|
|
||||||
|
|
||||||
/** Expands a config path. */
|
|
||||||
inline auto ExpandConfig(const Anope::string &path) { return Expand(ConfigDir, path); }
|
|
||||||
|
|
||||||
/** Expands a data path. */
|
|
||||||
inline auto ExpandData(const Anope::string &path) { return Expand(DataDir, path); }
|
|
||||||
|
|
||||||
/** Expands a locale path. */
|
|
||||||
inline auto ExpandLocale(const Anope::string &path) { return Expand(LocaleDir, path); }
|
|
||||||
|
|
||||||
/** Expands a log path. */
|
|
||||||
inline auto ExpandLog(const Anope::string &path) { return Expand(LogDir, path); }
|
|
||||||
|
|
||||||
/** Expands a module path. */
|
|
||||||
inline auto ExpandModule(const Anope::string &path) { return Expand(ModuleDir, path); }
|
|
||||||
|
|
||||||
/** Formats a CTCP message for sending to a client.
|
|
||||||
* @param name The name of the CTCP.
|
|
||||||
* @param body If present then the body of the CTCP.
|
|
||||||
* @return A formatted CTCP ready to send to a client.
|
|
||||||
*/
|
|
||||||
extern CoreExport Anope::string FormatCTCP(const Anope::string &name, const Anope::string &body = "");
|
|
||||||
|
|
||||||
/** Parses a CTCP message received from a client.
|
|
||||||
* @param text The raw message to parse.
|
|
||||||
* @param name The location to store the name of the CTCP.
|
|
||||||
* @param body The location to store body of the CTCP if one is present.
|
|
||||||
* @return True if the message was a well formed CTCP; otherwise, false.
|
|
||||||
*/
|
|
||||||
extern CoreExport bool ParseCTCP(const Anope::string &text, Anope::string &name, Anope::string &body);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** 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 = 0;
|
|
||||||
/** 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);
|
|
||||||
|
|
||||||
/** Retrieves the underlying string. */
|
|
||||||
const auto &GetString() const { return tokens; }
|
|
||||||
|
|
||||||
/** 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
|
|
||||||
*/
|
|
||||||
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 final
|
|
||||||
: 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 final
|
|
||||||
: 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 CoreExport CoreException
|
|
||||||
: public std::exception
|
|
||||||
{
|
|
||||||
protected:
|
|
||||||
/** Holds the error message to be displayed
|
|
||||||
*/
|
|
||||||
Anope::string err;
|
|
||||||
/** Source of the exception
|
|
||||||
*/
|
|
||||||
Anope::string source;
|
|
||||||
public:
|
|
||||||
/** 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() noexcept = default;
|
|
||||||
/** 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 CoreExport ModuleException
|
|
||||||
: public CoreException
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
/** 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() noexcept = default;
|
|
||||||
};
|
|
||||||
|
|
||||||
/** 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
|
|
||||||
|
|
||||||
#include "convert.h"
|
|
||||||
-138
@@ -1,138 +0,0 @@
|
|||||||
/*
|
|
||||||
*
|
|
||||||
* (C) 2008-2011 Adam <Adam@anope.org>
|
|
||||||
* (C) 2008-2024 Anope Team <team@anope.org>
|
|
||||||
*
|
|
||||||
* Please read COPYING and README for further details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#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 = nullptr;
|
|
||||||
public:
|
|
||||||
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 = false;
|
|
||||||
public:
|
|
||||||
ReferenceBase() = default;
|
|
||||||
ReferenceBase(const ReferenceBase &other) : invalid(other.invalid) { }
|
|
||||||
virtual ~ReferenceBase() = default;
|
|
||||||
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 = nullptr;
|
|
||||||
public:
|
|
||||||
Reference() = default;
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
-135
@@ -1,135 +0,0 @@
|
|||||||
/*
|
|
||||||
*
|
|
||||||
* (C) 2008-2011 Robin Burchell <w00t@inspircd.org>
|
|
||||||
* (C) 2008-2024 Anope Team <team@anope.org>
|
|
||||||
*
|
|
||||||
* Please read COPYING and README for further details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#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 final
|
|
||||||
: 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
|
|
||||||
* @params tags Message tags
|
|
||||||
*/
|
|
||||||
virtual void OnMessage(User *u, const Anope::string &message, const Anope::map<Anope::string> &tags);
|
|
||||||
|
|
||||||
/** 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);
|
|
||||||
};
|
|
||||||
@@ -1,317 +0,0 @@
|
|||||||
/* Channel support
|
|
||||||
*
|
|
||||||
* (C) 2008-2024 Anope Team
|
|
||||||
* Contact us at team@anope.org
|
|
||||||
*
|
|
||||||
* Please read COPYING and README for further details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "anope.h"
|
|
||||||
#include "extensible.h"
|
|
||||||
#include "modes.h"
|
|
||||||
#include "serialize.h"
|
|
||||||
|
|
||||||
typedef Anope::unordered_map<Channel *> channel_map;
|
|
||||||
|
|
||||||
extern CoreExport channel_map ChannelList;
|
|
||||||
|
|
||||||
/* A user container, there is one of these per user per channel. */
|
|
||||||
struct ChanUserContainer final
|
|
||||||
: 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 final
|
|
||||||
: 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, ...) ATTR_FORMAT(4, 5);
|
|
||||||
void SetModes(BotInfo *bi, bool enforce_mlock, const Anope::string &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, ...) ATTR_FORMAT(4, 5);
|
|
||||||
bool Kick(BotInfo *bi, User *u, const Anope::string &reason);
|
|
||||||
|
|
||||||
/** 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();
|
|
||||||
};
|
|
||||||
+21
-173
@@ -1,186 +1,34 @@
|
|||||||
/* Declarations for command data.
|
/* Declarations for command data.
|
||||||
*
|
*
|
||||||
* (C) 2003-2024 Anope Team
|
* (C) 2003-2009 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 furhter 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.
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#pragma once
|
#include "modules.h"
|
||||||
|
|
||||||
#include "service.h"
|
/*************************************************************************/
|
||||||
#include "anope.h"
|
|
||||||
#include "channels.h"
|
|
||||||
|
|
||||||
struct CommandGroup final
|
/* 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 final
|
|
||||||
{
|
|
||||||
typedef Anope::map<CommandInfo> map;
|
|
||||||
|
|
||||||
/* 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 = false;
|
|
||||||
/* Only used with fantasy */
|
|
||||||
bool prepend_channel = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Where the replies from commands go to. User inherits from this and is the normal
|
|
||||||
* source of a CommandReply
|
|
||||||
*/
|
*/
|
||||||
struct CoreExport CommandReply
|
|
||||||
{
|
|
||||||
virtual ~CommandReply() = default;
|
|
||||||
virtual void SendMessage(BotInfo *source, const Anope::string &msg) = 0;
|
|
||||||
virtual void SendMessage(CommandSource &source, const Anope::string &msg);
|
|
||||||
};
|
|
||||||
|
|
||||||
/* The source for a command */
|
extern MDE Command *lookup_cmd(Command *list, char *name);
|
||||||
class CoreExport CommandSource final
|
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 = nullptr;
|
|
||||||
/* 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;
|
|
||||||
/* The unique identifier of the executing message. */
|
|
||||||
Anope::string msgid;
|
|
||||||
|
|
||||||
CommandSource(const Anope::string &n, User *user, NickCore *core, CommandReply *reply, BotInfo *bi, const Anope::string &m = "");
|
/*************************************************************************/
|
||||||
|
|
||||||
const Anope::string &GetNick() const;
|
|
||||||
User *GetUser();
|
|
||||||
NickCore *GetAccount();
|
|
||||||
AccessGroup AccessFor(ChannelInfo *ci);
|
|
||||||
bool IsFounder(ChannelInfo *ci);
|
|
||||||
|
|
||||||
void Reply(const char *message, ...) ATTR_FORMAT(2, 3);
|
|
||||||
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() = default;
|
|
||||||
|
|
||||||
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);
|
|
||||||
};
|
|
||||||
|
|||||||
+55
-157
@@ -1,178 +1,76 @@
|
|||||||
/*
|
/* Services configuration.
|
||||||
*
|
*
|
||||||
* (C) 2003-2024 Anope Team
|
* (C) 2003-2009 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 furhter 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.
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#pragma once
|
#ifndef 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"
|
|
||||||
|
|
||||||
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> T Get(const Anope::string &tag, const Anope::string &def = "") const
|
/******* OperServ configuration *******/
|
||||||
{
|
|
||||||
return Anope::TryConvert<T>(this->Get<const Anope::string>(tag, def)).value_or(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 final
|
* things will happen. */
|
||||||
{
|
#define BUFSIZE 1024
|
||||||
Anope::string name;
|
|
||||||
bool executable;
|
|
||||||
FILE *fp = nullptr;
|
|
||||||
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 final
|
|
||||||
: 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 final
|
|
||||||
{
|
|
||||||
Anope::string host;
|
|
||||||
unsigned port;
|
|
||||||
Anope::string password;
|
|
||||||
int protocol;
|
|
||||||
|
|
||||||
Uplink(const Anope::string &_host, int _port, const Anope::string &_password, int _protocol) : host(_host), port(_port), password(_password), protocol(_protocol) { }
|
|
||||||
inline bool operator==(const Uplink &other) const { return host == other.host && port == other.port && password == other.password && protocol == other.protocol; }
|
|
||||||
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 CoreExport ConfigException final
|
|
||||||
: 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() noexcept = default;
|
|
||||||
};
|
|
||||||
|
|
||||||
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
|
||||||
|
|
||||||
|
/* 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 */
|
||||||
|
|||||||
@@ -1,132 +0,0 @@
|
|||||||
/*
|
|
||||||
*
|
|
||||||
* (C) 2003-2024 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <optional>
|
|
||||||
|
|
||||||
namespace Anope
|
|
||||||
{
|
|
||||||
/** Attempts to convert a string to any type.
|
|
||||||
* @param in The value to convert.
|
|
||||||
* @param leftover If non-nullptr then the location to store leftover data.
|
|
||||||
*/
|
|
||||||
template<typename T>
|
|
||||||
inline std::optional<T> TryConvert(const Anope::string &in, Anope::string *leftover = nullptr)
|
|
||||||
{
|
|
||||||
std::istringstream tmp(in.str());
|
|
||||||
T out;
|
|
||||||
if (!(tmp >> out))
|
|
||||||
return std::nullopt;
|
|
||||||
|
|
||||||
if (leftover)
|
|
||||||
{
|
|
||||||
leftover->clear();
|
|
||||||
std::getline(tmp, leftover->str());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
char extra;
|
|
||||||
if (tmp >> extra)
|
|
||||||
return std::nullopt;
|
|
||||||
}
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Converts a string to any type.
|
|
||||||
* @param in The value to convert.
|
|
||||||
* @param def The default to use if the conversion failed.
|
|
||||||
* @param leftover If non-nullptr then the location to store leftover data.
|
|
||||||
*/
|
|
||||||
template<typename T>
|
|
||||||
inline T Convert(const Anope::string &in, T def, Anope::string *leftover = nullptr)
|
|
||||||
{
|
|
||||||
return TryConvert<T>(in, leftover).value_or(def);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Attempts to convert any type to a string.
|
|
||||||
* @param in The value to convert.
|
|
||||||
*/
|
|
||||||
template <class T>
|
|
||||||
inline std::optional<Anope::string> TryString(const T &in)
|
|
||||||
{
|
|
||||||
std::ostringstream tmp;
|
|
||||||
if (!(tmp << in))
|
|
||||||
return std::nullopt;
|
|
||||||
return tmp.str();
|
|
||||||
}
|
|
||||||
|
|
||||||
/** No-op function that returns the string that was passed to it.
|
|
||||||
* @param in The string to return.
|
|
||||||
*/
|
|
||||||
inline const string &ToString(const string &in)
|
|
||||||
{
|
|
||||||
return in;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Converts a std::string to a string.
|
|
||||||
* @param in The value to convert.
|
|
||||||
*/
|
|
||||||
inline string ToString(const std::string &in)
|
|
||||||
{
|
|
||||||
return in;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Converts a char array to a string.
|
|
||||||
* @param in The value to convert.
|
|
||||||
*/
|
|
||||||
inline string ToString(const char *in)
|
|
||||||
{
|
|
||||||
return string(in);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Converts a char to a string.
|
|
||||||
* @param in The value to convert.
|
|
||||||
*/
|
|
||||||
inline string ToString(char in)
|
|
||||||
{
|
|
||||||
return string(1, static_cast<string::value_type>(in));
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Converts an unsigned char to a string.
|
|
||||||
* @param in The value to convert.
|
|
||||||
*/
|
|
||||||
inline string ToString(unsigned char in)
|
|
||||||
{
|
|
||||||
return string(1, static_cast<string::value_type>(in));
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Converts a bool to a string.
|
|
||||||
* @param in The value to convert.
|
|
||||||
*/
|
|
||||||
inline string ToString(bool in)
|
|
||||||
{
|
|
||||||
return (in ? "1" : "0");
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Converts a type that std::to_string is implemented for to a string.
|
|
||||||
* @param in The value to convert.
|
|
||||||
*/
|
|
||||||
template<typename Stringable>
|
|
||||||
inline std::enable_if_t<std::is_arithmetic_v<Stringable>, string> ToString(const Stringable &in)
|
|
||||||
{
|
|
||||||
return std::to_string(in);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Converts any type to a string.
|
|
||||||
* @param in The value to convert.
|
|
||||||
*/
|
|
||||||
template <class T>
|
|
||||||
inline std::enable_if_t<!std::is_arithmetic_v<T>, string> ToString(const T &in)
|
|
||||||
{
|
|
||||||
return TryString(in).value_or(Anope::string());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,71 @@
|
|||||||
|
/* Database file descriptor structure and file handling routine prototypes.
|
||||||
|
*
|
||||||
|
* (C) 2003-2009 Anope Team
|
||||||
|
* Contact us at team@anope.org
|
||||||
|
*
|
||||||
|
* Please read COPYING and README for furhter details.
|
||||||
|
*
|
||||||
|
* Based on the original code of Epona by Lara.
|
||||||
|
* Based on the original code of Services by Andy Church.
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#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 */
|
||||||
+32
-47
@@ -1,55 +1,40 @@
|
|||||||
/*
|
/* Set default values for any constants that should be in include files but
|
||||||
*
|
*
|
||||||
* (C) 2003-2024 Anope Team
|
* (C) 2003-2009 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 furhter 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.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#pragma once
|
/*************************************************************************/
|
||||||
|
|
||||||
class AccessGroup;
|
#ifndef NAME_MAX
|
||||||
class AutoKick;
|
# define NAME_MAX 255
|
||||||
class BotInfo;
|
#endif
|
||||||
class CallBack;
|
|
||||||
class ChanAccess;
|
#ifndef BUFSIZ
|
||||||
class Channel;
|
# define BUFSIZ 256
|
||||||
class ChannelInfo;
|
#else
|
||||||
class ChannelStatus;
|
# if BUFSIZ < 256
|
||||||
struct ChanUserContainer;
|
# define BUFSIZ 256
|
||||||
class ClientSocket;
|
# endif
|
||||||
class Command;
|
#endif
|
||||||
class CommandSource;
|
|
||||||
namespace Configuration { struct Conf; }
|
/* Length of an array: */
|
||||||
class ConnectionSocket;
|
#define lenof(a) (sizeof(a) / sizeof(*(a)))
|
||||||
namespace DNS { struct Query; }
|
|
||||||
class Entry;
|
/* Telling compilers about printf()-like functions: */
|
||||||
class IdentifyRequest;
|
#ifdef __GNUC__
|
||||||
class InfoFormatter;
|
# define FORMAT(type,fmt,start) __attribute__((format(type,fmt,start)))
|
||||||
class IRCDProto;
|
#else
|
||||||
class ListenSocket;
|
# define FORMAT(type,fmt,start)
|
||||||
class Log;
|
#endif
|
||||||
class Memo;
|
|
||||||
class MessageSource;
|
/*************************************************************************/
|
||||||
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-2009 Anope Team
|
||||||
|
* Contact us at team@anope.org
|
||||||
|
*
|
||||||
|
* Please read COPYING and README for furhter 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,22 @@
|
|||||||
|
/* Include file for high-level encryption routines.
|
||||||
|
*
|
||||||
|
* (C) 2003-2009 Anope Team
|
||||||
|
* Contact us at team@anope.org
|
||||||
|
*
|
||||||
|
* Please read COPYING and README for furhter details.
|
||||||
|
*
|
||||||
|
* Based on the original code of Epona by Lara.
|
||||||
|
* Based on the original code of Services by Andy Church.
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef struct encryption_ {
|
||||||
|
int (*encrypt)(const char *src, int len, char *dest, int size);
|
||||||
|
int (*encrypt_in_place)(char *buf, 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,64 @@
|
|||||||
|
/* Prototypes and external variable declarations.
|
||||||
|
*
|
||||||
|
* (C) 2003-2009 Anope Team
|
||||||
|
* Contact us at team@anope.org
|
||||||
|
*
|
||||||
|
* Please read COPYING and README for furhter details.
|
||||||
|
*
|
||||||
|
* Based on the original code of Epona by Lara.
|
||||||
|
* Based on the original code of Services by Andy Church.
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#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_DROPPED "nick_dropped"
|
||||||
|
#define EVENT_NICK_FORBIDDEN "nick_forbidden"
|
||||||
|
#define EVENT_NICK_EXPIRE "nick_expire"
|
||||||
|
#define EVENT_CHANGE_NICK "change_nick"
|
||||||
|
#define EVENT_USER_LOGOFF "user_logoff"
|
||||||
|
#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"
|
||||||
@@ -1,267 +0,0 @@
|
|||||||
/*
|
|
||||||
*
|
|
||||||
* (C) 2003-2024 Anope Team
|
|
||||||
* Contact us at team@anope.org
|
|
||||||
*
|
|
||||||
* Please read COPYING and README for further details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#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) 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) 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) 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 *) 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 override
|
|
||||||
{
|
|
||||||
T *t = this->Get(e);
|
|
||||||
data[this->name] << *t;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ExtensibleUnserialize(Extensible *e, Serializable *s, Serialize::Data &data) 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 override
|
|
||||||
{
|
|
||||||
data.SetType(this->name, Serialize::Data::DT_INT);
|
|
||||||
data[this->name] << true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ExtensibleUnserialize(Extensible *e, Serializable *s, Serialize::Data &data) override
|
|
||||||
{
|
|
||||||
bool b = false;
|
|
||||||
data[this->name] >> b;
|
|
||||||
if (b)
|
|
||||||
this->Set(e);
|
|
||||||
else
|
|
||||||
this->Unset(e);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
struct ExtensibleRef final
|
|
||||||
: 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);
|
|
||||||
}
|
|
||||||
+1413
File diff suppressed because it is too large
Load Diff
@@ -1,192 +0,0 @@
|
|||||||
/*
|
|
||||||
*
|
|
||||||
* (C) 2002-2011 InspIRCd Development Team
|
|
||||||
* (C) 2009-2024 Anope Team <team@anope.org>
|
|
||||||
*
|
|
||||||
* Please read COPYING and README for further details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <locale>
|
|
||||||
#include <unordered_map>
|
|
||||||
|
|
||||||
#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 CoreExport void CaseMapRebuild();
|
|
||||||
extern CoreExport unsigned char tolower(unsigned char);
|
|
||||||
extern CoreExport 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 override
|
|
||||||
{
|
|
||||||
if (c >= 'a' && c <= 'z')
|
|
||||||
return c - 32;
|
|
||||||
else
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
|
|
||||||
char_type do_tolower(char_type c) const override
|
|
||||||
{
|
|
||||||
if (c >= 'A' && c <= 'Z')
|
|
||||||
return c + 32;
|
|
||||||
else
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/* rfc1459 case insensitive ctype, { = [, } = ], and | = \ */
|
|
||||||
template<typename char_type>
|
|
||||||
class rfc1459_ctype final
|
|
||||||
: public ascii_ctype<char_type>
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
char_type do_toupper(char_type c) const 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 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 final
|
|
||||||
: 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 final
|
|
||||||
{
|
|
||||||
/** 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);
|
|
||||||
}
|
|
||||||
@@ -1,129 +0,0 @@
|
|||||||
/*
|
|
||||||
*
|
|
||||||
* (C) 2008-2024 Anope Team
|
|
||||||
* Contact us at team@anope.org
|
|
||||||
*
|
|
||||||
* Please read COPYING and README for further details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "anope.h"
|
|
||||||
|
|
||||||
namespace Language
|
|
||||||
{
|
|
||||||
|
|
||||||
/* Languages we support as configured in anope.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 CONFIRM_DROP _("Please confirm that you want to drop \002%s\002 with \002%s%s DROP %s %s\002")
|
|
||||||
#define SERVICE_UNAVAILABLE _("Sorry, %s is temporarily unavailable.")
|
|
||||||
#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 temporarily 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 not be\n" \
|
|
||||||
"something that could be easily guessed (e.g. your real name or your nick) and\n" \
|
|
||||||
"cannot contain the space or tab characters.\n")
|
|
||||||
#define PASSWORD_TOO_SHORT _("Your password is too short. It must be longer than %u characters.")
|
|
||||||
#define PASSWORD_TOO_LONG _("Your password is too long. It must be shorter than %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 email 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_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 email 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 %zu\002 to read it.")
|
|
||||||
#define MEMO_NEW_MEMO_ARRIVED _("You have a new memo from %s.\n" \
|
|
||||||
"Type \002%s%s READ %zu\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_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 vident 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 %zu characters.")
|
|
||||||
#define HOST_SET_IDENTTOOLONG _("Error! The vident is too long, please use an ident shorter than %zu 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 vidents. If this is incorrect please report this as a possible bug.")
|
|
||||||
@@ -1,91 +0,0 @@
|
|||||||
/*
|
|
||||||
*
|
|
||||||
* (C) 2003-2024 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#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 = true;
|
|
||||||
|
|
||||||
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() = default;
|
|
||||||
|
|
||||||
/** 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 final
|
|
||||||
{
|
|
||||||
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 final
|
|
||||||
{
|
|
||||||
NickCore *nc;
|
|
||||||
std::vector<std::pair<Anope::string, Anope::string> > replies;
|
|
||||||
unsigned longest = 0;
|
|
||||||
public:
|
|
||||||
InfoFormatter(NickCore *nc);
|
|
||||||
void Process(std::vector<Anope::string> &);
|
|
||||||
Anope::string &operator[](const Anope::string &key);
|
|
||||||
void AddOption(const Anope::string &opt);
|
|
||||||
};
|
|
||||||
@@ -1,141 +0,0 @@
|
|||||||
/*
|
|
||||||
*
|
|
||||||
* (C) 2003-2024 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#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 final
|
|
||||||
{
|
|
||||||
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 final
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
/* Bot that should log this message */
|
|
||||||
BotInfo *bi = nullptr;
|
|
||||||
/* For commands, the user executing the command, but might not always exist */
|
|
||||||
User *u = nullptr;
|
|
||||||
/* For commands, the account executing the command, but will not always exist */
|
|
||||||
NickCore *nc = nullptr;
|
|
||||||
/* For commands, the command being executed */
|
|
||||||
Command *c = nullptr;
|
|
||||||
/* For commands, the command source */
|
|
||||||
CommandSource *source = nullptr;
|
|
||||||
/* Used for LOG_CHANNEL */
|
|
||||||
Channel *chan = nullptr;
|
|
||||||
/* For commands, the channel the command was executed on, will not always exist */
|
|
||||||
const ChannelInfo *ci = nullptr;
|
|
||||||
/* For LOG_SERVER */
|
|
||||||
Server *s = nullptr;
|
|
||||||
/* For LOG_MODULE */
|
|
||||||
Module *m = nullptr;
|
|
||||||
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 final
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
BotInfo *bot = nullptr;
|
|
||||||
std::vector<Anope::string> targets;
|
|
||||||
std::vector<LogFile *> logfiles;
|
|
||||||
int last_day = 0;
|
|
||||||
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);
|
|
||||||
};
|
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
/*
|
|
||||||
*
|
|
||||||
* (C) 2003-2024 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#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 final
|
|
||||||
: 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() override;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace Mail
|
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
# Make file for Win32
|
||||||
|
#
|
||||||
|
# (C) 2003-2009 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.
|
||||||
|
#
|
||||||
|
# $Id$
|
||||||
|
#
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
clean:
|
||||||
|
-@erase language.h
|
||||||
|
|
||||||
|
spotless: clean
|
||||||
|
-@erase sysconf.h version.h
|
||||||
|
|
||||||
|
distclean: spotless
|
||||||
|
|
||||||
|
|
||||||
|
FRC:
|
||||||
@@ -1,53 +0,0 @@
|
|||||||
/*
|
|
||||||
*
|
|
||||||
* (C) 2003-2024 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "anope.h"
|
|
||||||
#include "serialize.h"
|
|
||||||
|
|
||||||
class CoreExport Memo final
|
|
||||||
: public Serializable
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
MemoInfo *mi;
|
|
||||||
bool unread;
|
|
||||||
bool receipt;
|
|
||||||
Memo();
|
|
||||||
~Memo();
|
|
||||||
|
|
||||||
void Serialize(Serialize::Data &data) const override;
|
|
||||||
static Serializable *Unserialize(Serializable *obj, Serialize::Data &);
|
|
||||||
|
|
||||||
Anope::string owner;
|
|
||||||
/* When it was sent */
|
|
||||||
time_t time;
|
|
||||||
Anope::string sender;
|
|
||||||
Anope::string text;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Memo info structures. Since both nicknames and channels can have memos,
|
|
||||||
* we encapsulate memo data in a MemoInfo to make it easier to handle.
|
|
||||||
*/
|
|
||||||
struct CoreExport MemoInfo final
|
|
||||||
{
|
|
||||||
int16_t memomax = 0;
|
|
||||||
Serialize::Checker<std::vector<Memo *> > memos;
|
|
||||||
std::vector<Anope::string> ignores;
|
|
||||||
|
|
||||||
MemoInfo();
|
|
||||||
Memo *GetMemo(unsigned index) const;
|
|
||||||
unsigned GetIndex(Memo *m) const;
|
|
||||||
void Del(unsigned index);
|
|
||||||
bool HasIgnore(User *u);
|
|
||||||
|
|
||||||
static MemoInfo *GetMemoInfo(const Anope::string &targ, bool &is_chan);
|
|
||||||
};
|
|
||||||
+13
-185
@@ -1,195 +1,23 @@
|
|||||||
/*
|
/* Declarations of IRC message structures, variables, and functions.
|
||||||
*
|
*
|
||||||
* (C) 2003-2024 Anope Team
|
* (C) 2003-2009 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 furhter 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.
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#pragma once
|
/*************************************************************************/
|
||||||
|
#include "modules.h"
|
||||||
|
|
||||||
#include "protocol.h"
|
extern Message messages[];
|
||||||
|
extern void moduleAddMsgs(void);
|
||||||
|
extern Message *find_message(const char *name);
|
||||||
|
|
||||||
/* Common IRCD messages.
|
|
||||||
* Protocol modules may chose to include some, none, or all of these handlers
|
|
||||||
* as they see fit.
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Message
|
/*************************************************************************/
|
||||||
{
|
|
||||||
|
|
||||||
struct CoreExport Away
|
|
||||||
: IRCDMessage
|
|
||||||
{
|
|
||||||
Away(Module *creator, const Anope::string &mname = "AWAY") : IRCDMessage(creator, mname, 0) { SetFlag(FLAG_REQUIRE_USER); SetFlag(FLAG_SOFT_LIMIT); }
|
|
||||||
|
|
||||||
void Run(MessageSource &source, const std::vector<Anope::string> ¶ms, const Anope::map<Anope::string> &tags) override;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct CoreExport Capab
|
|
||||||
: IRCDMessage
|
|
||||||
{
|
|
||||||
Capab(Module *creator, const Anope::string &mname = "CAPAB") : IRCDMessage(creator, mname, 1) { SetFlag(FLAG_SOFT_LIMIT); }
|
|
||||||
|
|
||||||
void Run(MessageSource &source, const std::vector<Anope::string> ¶ms, const Anope::map<Anope::string> &tags) override;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct CoreExport Error
|
|
||||||
: IRCDMessage
|
|
||||||
{
|
|
||||||
Error(Module *creator, const Anope::string &mname = "ERROR") : IRCDMessage(creator, mname, 1) { }
|
|
||||||
|
|
||||||
void Run(MessageSource &source, const std::vector<Anope::string> ¶ms, const Anope::map<Anope::string> &tags) override;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct CoreExport Invite
|
|
||||||
: IRCDMessage
|
|
||||||
{
|
|
||||||
Invite(Module *creator, const Anope::string &mname = "INVITE") : IRCDMessage(creator, mname, 2) { SetFlag(FLAG_REQUIRE_USER); SetFlag(FLAG_SOFT_LIMIT); }
|
|
||||||
|
|
||||||
void Run(MessageSource &source, const std::vector<Anope::string> ¶ms, const Anope::map<Anope::string> &tags) override;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct CoreExport Join
|
|
||||||
: IRCDMessage
|
|
||||||
{
|
|
||||||
Join(Module *creator, const Anope::string &mname = "JOIN") : IRCDMessage(creator, mname, 1) { SetFlag(FLAG_REQUIRE_USER); SetFlag(FLAG_SOFT_LIMIT); }
|
|
||||||
|
|
||||||
void Run(MessageSource &source, const std::vector<Anope::string> ¶ms, const Anope::map<Anope::string> &tags) override;
|
|
||||||
|
|
||||||
typedef std::pair<ChannelStatus, User *> SJoinUser;
|
|
||||||
|
|
||||||
/** Handle a SJOIN.
|
|
||||||
* @param source The source of the SJOIN
|
|
||||||
* @param chan The channel the users are joining to
|
|
||||||
* @param ts The TS for the channel
|
|
||||||
* @param modes The modes sent with the SJOIN, if any
|
|
||||||
* @param users The users and their status, if any
|
|
||||||
*/
|
|
||||||
static void SJoin(MessageSource &source, const Anope::string &chan, time_t ts, const Anope::string &modes, const std::list<SJoinUser> &users);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct CoreExport Kick
|
|
||||||
: IRCDMessage
|
|
||||||
{
|
|
||||||
Kick(Module *creator, const Anope::string &mname = "KICK") : IRCDMessage(creator, mname, 2) { SetFlag(FLAG_SOFT_LIMIT); }
|
|
||||||
|
|
||||||
void Run(MessageSource &source, const std::vector<Anope::string> ¶ms, const Anope::map<Anope::string> &tags) override;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct CoreExport Kill
|
|
||||||
: IRCDMessage
|
|
||||||
{
|
|
||||||
Kill(Module *creator, const Anope::string &mname = "KILL") : IRCDMessage(creator, mname, 2) { }
|
|
||||||
|
|
||||||
void Run(MessageSource &source, const std::vector<Anope::string> ¶ms, const Anope::map<Anope::string> &tags) override;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct CoreExport Mode
|
|
||||||
: IRCDMessage
|
|
||||||
{
|
|
||||||
Mode(Module *creator, const Anope::string &mname = "MODE") : IRCDMessage(creator, mname, 2) { SetFlag(FLAG_SOFT_LIMIT); }
|
|
||||||
|
|
||||||
void Run(MessageSource &source, const std::vector<Anope::string> ¶ms, const Anope::map<Anope::string> &tags) override;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct CoreExport MOTD
|
|
||||||
: IRCDMessage
|
|
||||||
{
|
|
||||||
MOTD(Module *creator, const Anope::string &mname = "MOTD") : IRCDMessage(creator, mname, 1) { }
|
|
||||||
|
|
||||||
void Run(MessageSource &source, const std::vector<Anope::string> ¶ms, const Anope::map<Anope::string> &tags) override;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct CoreExport Notice
|
|
||||||
: IRCDMessage
|
|
||||||
{
|
|
||||||
Notice(Module *creator, const Anope::string &mname = "NOTICE") : IRCDMessage(creator, mname, 2) { SetFlag(FLAG_REQUIRE_USER); }
|
|
||||||
|
|
||||||
void Run(MessageSource &source, const std::vector<Anope::string> ¶ms, const Anope::map<Anope::string> &tags) override;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct CoreExport Part
|
|
||||||
: IRCDMessage
|
|
||||||
{
|
|
||||||
Part(Module *creator, const Anope::string &mname = "PART") : IRCDMessage(creator, mname, 1) { SetFlag(FLAG_REQUIRE_USER); SetFlag(FLAG_SOFT_LIMIT); }
|
|
||||||
|
|
||||||
void Run(MessageSource &source, const std::vector<Anope::string> ¶ms, const Anope::map<Anope::string> &tags) override;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct CoreExport Ping
|
|
||||||
: IRCDMessage
|
|
||||||
{
|
|
||||||
Ping(Module *creator, const Anope::string &mname = "PING") : IRCDMessage(creator, mname, 1) { SetFlag(FLAG_SOFT_LIMIT); }
|
|
||||||
|
|
||||||
void Run(MessageSource &source, const std::vector<Anope::string> ¶ms, const Anope::map<Anope::string> &tags) override;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct CoreExport Privmsg
|
|
||||||
: IRCDMessage
|
|
||||||
{
|
|
||||||
Privmsg(Module *creator, const Anope::string &mname = "PRIVMSG") : IRCDMessage(creator, mname, 2) { SetFlag(FLAG_REQUIRE_USER); }
|
|
||||||
|
|
||||||
void Run(MessageSource &source, const std::vector<Anope::string> ¶ms, const Anope::map<Anope::string> &tags) override;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct CoreExport Quit
|
|
||||||
: IRCDMessage
|
|
||||||
{
|
|
||||||
Quit(Module *creator, const Anope::string &mname = "QUIT") : IRCDMessage(creator, mname, 1) { SetFlag(FLAG_REQUIRE_USER); }
|
|
||||||
|
|
||||||
void Run(MessageSource &source, const std::vector<Anope::string> ¶ms, const Anope::map<Anope::string> &tags) override;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct CoreExport SQuit
|
|
||||||
: IRCDMessage
|
|
||||||
{
|
|
||||||
SQuit(Module *creator, const Anope::string &mname = "SQUIT") : IRCDMessage(creator, mname, 2) { }
|
|
||||||
|
|
||||||
void Run(MessageSource &source, const std::vector<Anope::string> ¶ms, const Anope::map<Anope::string> &tags) override;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct CoreExport Stats
|
|
||||||
: IRCDMessage
|
|
||||||
{
|
|
||||||
Stats(Module *creator, const Anope::string &mname = "STATS") : IRCDMessage(creator, mname, 1) { SetFlag(FLAG_REQUIRE_USER); SetFlag(FLAG_SOFT_LIMIT); }
|
|
||||||
|
|
||||||
void Run(MessageSource &source, const std::vector<Anope::string> ¶ms, const Anope::map<Anope::string> &tags) override;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct CoreExport Time
|
|
||||||
: IRCDMessage
|
|
||||||
{
|
|
||||||
Time(Module *creator, const Anope::string &mname = "TIME") : IRCDMessage(creator, mname, 0) { SetFlag(FLAG_SOFT_LIMIT); }
|
|
||||||
|
|
||||||
void Run(MessageSource &source, const std::vector<Anope::string> ¶ms, const Anope::map<Anope::string> &tags) override;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct CoreExport Topic
|
|
||||||
: IRCDMessage
|
|
||||||
{
|
|
||||||
Topic(Module *creator, const Anope::string &mname = "TOPIC") : IRCDMessage(creator, mname, 2) { SetFlag(FLAG_REQUIRE_USER); }
|
|
||||||
|
|
||||||
void Run(MessageSource &source, const std::vector<Anope::string> ¶ms, const Anope::map<Anope::string> &tags) override;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct CoreExport Version
|
|
||||||
: IRCDMessage
|
|
||||||
{
|
|
||||||
Version(Module *creator, const Anope::string &mname = "VERSION") : IRCDMessage(creator, mname, 0) { SetFlag(FLAG_SOFT_LIMIT); }
|
|
||||||
|
|
||||||
void Run(MessageSource &source, const std::vector<Anope::string> ¶ms, const Anope::map<Anope::string> &tags) override;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct CoreExport Whois
|
|
||||||
: IRCDMessage
|
|
||||||
{
|
|
||||||
Whois(Module *creator, const Anope::string &mname = "WHOIS") : IRCDMessage(creator, mname, 1) { SetFlag(FLAG_SOFT_LIMIT); }
|
|
||||||
|
|
||||||
void Run(MessageSource &source, const std::vector<Anope::string> ¶ms, const Anope::map<Anope::string> &tags) override;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace Message
|
|
||||||
|
|||||||
-432
@@ -1,432 +0,0 @@
|
|||||||
/* Mode support
|
|
||||||
*
|
|
||||||
* (C) 2008-2011 Adam <Adam@anope.org>
|
|
||||||
* (C) 2008-2024 Anope Team <team@anope.org>
|
|
||||||
*
|
|
||||||
* Please read COPYING and README for further details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "anope.h"
|
|
||||||
#include "base.h"
|
|
||||||
|
|
||||||
/** The different types of modes
|
|
||||||
*/
|
|
||||||
enum ModeType
|
|
||||||
{
|
|
||||||
/* Regular mode */
|
|
||||||
MODE_REGULAR,
|
|
||||||
/* b/e/I */
|
|
||||||
MODE_LIST,
|
|
||||||
/* k/l etc */
|
|
||||||
MODE_PARAM,
|
|
||||||
/* v/h/o/a/q */
|
|
||||||
MODE_STATUS
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Classes of modes, Channel modes and User modes
|
|
||||||
*/
|
|
||||||
enum ModeClass
|
|
||||||
{
|
|
||||||
MC_CHANNEL,
|
|
||||||
MC_USER
|
|
||||||
};
|
|
||||||
|
|
||||||
/** This class is the basis of all modes in Anope
|
|
||||||
*/
|
|
||||||
class CoreExport Mode
|
|
||||||
: public Base
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
/* Mode name */
|
|
||||||
Anope::string name;
|
|
||||||
/* Class of mode this is (user/channel) */
|
|
||||||
ModeClass mclass;
|
|
||||||
/* Mode char for this, eg 'b' */
|
|
||||||
char mchar;
|
|
||||||
/* Type of mode this is, eg MODE_LIST */
|
|
||||||
ModeType type;
|
|
||||||
|
|
||||||
/** constructor
|
|
||||||
* @param mname The mode name
|
|
||||||
* @param mclass The type of mode this is
|
|
||||||
* @param mc The mode char
|
|
||||||
* @param type The mode type
|
|
||||||
*/
|
|
||||||
Mode(const Anope::string &mname, ModeClass mclass, char mc, ModeType type);
|
|
||||||
virtual ~Mode() = default;
|
|
||||||
|
|
||||||
/** Can a user set this mode, used for mlock
|
|
||||||
* @param u The user
|
|
||||||
*/
|
|
||||||
virtual bool CanSet(User *u) const;
|
|
||||||
};
|
|
||||||
|
|
||||||
/** This class is a user mode, all user modes use this/inherit from this
|
|
||||||
*/
|
|
||||||
class CoreExport UserMode
|
|
||||||
: public Mode
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
/** constructor
|
|
||||||
* @param name The mode name
|
|
||||||
* @param mc The mode char
|
|
||||||
*/
|
|
||||||
UserMode(const Anope::string &name, char mc);
|
|
||||||
};
|
|
||||||
|
|
||||||
class CoreExport UserModeParam
|
|
||||||
: public UserMode
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
/** constructor
|
|
||||||
* @param name The mode name
|
|
||||||
* @param mc The mode char
|
|
||||||
*/
|
|
||||||
UserModeParam(const Anope::string &name, char mc);
|
|
||||||
|
|
||||||
/** Check if the param is valid
|
|
||||||
* @param value The param
|
|
||||||
* @return true or false
|
|
||||||
*/
|
|
||||||
virtual bool IsValid(Anope::string &value) const { return true; }
|
|
||||||
};
|
|
||||||
|
|
||||||
/** This class is a channel mode, all channel modes use this/inherit from this
|
|
||||||
*/
|
|
||||||
class CoreExport ChannelMode
|
|
||||||
: public Mode
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
/* channel modes that can possibly unwrap this mode */
|
|
||||||
std::vector<ChannelMode *> listeners;
|
|
||||||
|
|
||||||
/** constructor
|
|
||||||
* @param name The mode name
|
|
||||||
* @param mc The mode char
|
|
||||||
*/
|
|
||||||
ChannelMode(const Anope::string &name, char mc);
|
|
||||||
|
|
||||||
bool CanSet(User *u) const override;
|
|
||||||
|
|
||||||
virtual void Check() { }
|
|
||||||
|
|
||||||
/** 'wrap' this channel mode and param to the underlying mode and param
|
|
||||||
*/
|
|
||||||
virtual ChannelMode *Wrap(Anope::string ¶m);
|
|
||||||
|
|
||||||
/** 'unwrap' this mode to our internal representation
|
|
||||||
*/
|
|
||||||
ChannelMode *Unwrap(Anope::string ¶m);
|
|
||||||
|
|
||||||
/** called when a mode is being unwrapped, and is asking us if we can unwrap it
|
|
||||||
*/
|
|
||||||
virtual ChannelMode *Unwrap(ChannelMode *, Anope::string ¶m);
|
|
||||||
};
|
|
||||||
|
|
||||||
/** This is a mode for lists, eg b/e/I. These modes should inherit from this
|
|
||||||
*/
|
|
||||||
class CoreExport ChannelModeList
|
|
||||||
: public ChannelMode
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
/** constructor
|
|
||||||
* @param name The mode name
|
|
||||||
* @param mc The mode char
|
|
||||||
*/
|
|
||||||
ChannelModeList(const Anope::string &name, char mc);
|
|
||||||
|
|
||||||
/** Is the mask valid
|
|
||||||
* @param mask The mask
|
|
||||||
* @return true for yes, false for no
|
|
||||||
*/
|
|
||||||
virtual bool IsValid(Anope::string &mask) const;
|
|
||||||
|
|
||||||
/** Checks if mask affects user
|
|
||||||
* Should only be used for extbans or other weird ircd-specific things.
|
|
||||||
* @param u The user
|
|
||||||
* @param e The entry to match against
|
|
||||||
* @return true on match
|
|
||||||
*/
|
|
||||||
virtual bool Matches(User *u, const Entry *e) { return false; }
|
|
||||||
|
|
||||||
/** Called when a mask is added to a channel
|
|
||||||
* @param chan The channel
|
|
||||||
* @param mask The mask
|
|
||||||
*/
|
|
||||||
virtual void OnAdd(Channel *chan, const Anope::string &mask) { }
|
|
||||||
|
|
||||||
/** Called when a mask is removed from a channel
|
|
||||||
* @param chan The channel
|
|
||||||
* @param mask The mask
|
|
||||||
*/
|
|
||||||
virtual void OnDel(Channel *chan, const Anope::string &mask) { }
|
|
||||||
};
|
|
||||||
|
|
||||||
/** This is a mode with a parameter, eg +k/l. These modes should use/inherit from this
|
|
||||||
*/
|
|
||||||
class CoreExport ChannelModeParam
|
|
||||||
: public ChannelMode
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
/** constructor
|
|
||||||
* @param name The mode name
|
|
||||||
* @param mc The mode char
|
|
||||||
* @param minus_no_arg true if this mode sends no arg when unsetting
|
|
||||||
*/
|
|
||||||
ChannelModeParam(const Anope::string &name, char mc, bool minus_no_arg = false);
|
|
||||||
|
|
||||||
/* Should we send an arg when unsetting this mode? */
|
|
||||||
bool minus_no_arg;
|
|
||||||
|
|
||||||
/** Is the param valid
|
|
||||||
* @param value The param
|
|
||||||
* @return true for yes, false for no
|
|
||||||
*/
|
|
||||||
virtual bool IsValid(Anope::string &value) const { return true; }
|
|
||||||
};
|
|
||||||
|
|
||||||
/** This is a mode that is a channel status, eg +v/h/o/a/q.
|
|
||||||
*/
|
|
||||||
class CoreExport ChannelModeStatus
|
|
||||||
: public ChannelMode
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
/* The symbol, eg @ % + */
|
|
||||||
char symbol;
|
|
||||||
/* The "level" of the mode, used to compare with other modes.
|
|
||||||
* Used so we know op > halfop > voice etc.
|
|
||||||
*/
|
|
||||||
unsigned level;
|
|
||||||
|
|
||||||
/** constructor
|
|
||||||
* @param name The mode name
|
|
||||||
* @param mc The mode char
|
|
||||||
* @param msymbol The symbol for the mode, eg @ %
|
|
||||||
* @param mlevel A level for the mode, which is usually determined by the PREFIX capab
|
|
||||||
*/
|
|
||||||
ChannelModeStatus(const Anope::string &name, char mc, char msymbol, unsigned mlevel);
|
|
||||||
};
|
|
||||||
|
|
||||||
/** A virtual mode. This mode doesn't natively exist on the IRCd (like extbans),
|
|
||||||
* but we still have a representation for it.
|
|
||||||
*/
|
|
||||||
template<typename T>
|
|
||||||
class CoreExport ChannelModeVirtual
|
|
||||||
: public T
|
|
||||||
{
|
|
||||||
Anope::string base;
|
|
||||||
ChannelMode *basech;
|
|
||||||
|
|
||||||
public:
|
|
||||||
ChannelModeVirtual(const Anope::string &mname, const Anope::string &basename);
|
|
||||||
|
|
||||||
~ChannelModeVirtual();
|
|
||||||
|
|
||||||
void Check() override;
|
|
||||||
|
|
||||||
ChannelMode *Wrap(Anope::string ¶m) override;
|
|
||||||
|
|
||||||
ChannelMode *Unwrap(ChannelMode *cm, Anope::string ¶m) override = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* The status a user has on a channel (+v, +h, +o) etc */
|
|
||||||
class CoreExport ChannelStatus final
|
|
||||||
{
|
|
||||||
Anope::string modes;
|
|
||||||
public:
|
|
||||||
ChannelStatus() = default;
|
|
||||||
ChannelStatus(const Anope::string &modes);
|
|
||||||
void AddMode(char c);
|
|
||||||
void DelMode(char c);
|
|
||||||
bool HasMode(char c) const;
|
|
||||||
bool Empty() const;
|
|
||||||
void Clear();
|
|
||||||
const Anope::string &Modes() const;
|
|
||||||
Anope::string BuildModePrefixList() const;
|
|
||||||
};
|
|
||||||
|
|
||||||
class CoreExport UserModeOperOnly
|
|
||||||
: public UserMode
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
UserModeOperOnly(const Anope::string &mname, char um) : UserMode(mname, um) { }
|
|
||||||
|
|
||||||
bool CanSet(User *u) const override;
|
|
||||||
};
|
|
||||||
|
|
||||||
class CoreExport UserModeNoone
|
|
||||||
: public UserMode
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
UserModeNoone(const Anope::string &mname, char um) : UserMode(mname, um) { }
|
|
||||||
|
|
||||||
bool CanSet(User *u) const override;
|
|
||||||
};
|
|
||||||
|
|
||||||
/** Channel mode +k (key)
|
|
||||||
*/
|
|
||||||
class CoreExport ChannelModeKey
|
|
||||||
: public ChannelModeParam
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
ChannelModeKey(char mc) : ChannelModeParam("KEY", mc) { }
|
|
||||||
|
|
||||||
bool IsValid(Anope::string &value) const override;
|
|
||||||
};
|
|
||||||
|
|
||||||
/** This class is used for oper only channel modes
|
|
||||||
*/
|
|
||||||
class CoreExport ChannelModeOperOnly
|
|
||||||
: public ChannelMode
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
ChannelModeOperOnly(const Anope::string &mname, char mc) : ChannelMode(mname, mc) { }
|
|
||||||
|
|
||||||
/* Opers only */
|
|
||||||
bool CanSet(User *u) const override;
|
|
||||||
};
|
|
||||||
|
|
||||||
/** This class is used for channel modes only servers may set
|
|
||||||
*/
|
|
||||||
class CoreExport ChannelModeNoone
|
|
||||||
: public ChannelMode
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
ChannelModeNoone(const Anope::string &mname, char mc) : ChannelMode(mname, mc) { }
|
|
||||||
|
|
||||||
bool CanSet(User *u) const override;
|
|
||||||
};
|
|
||||||
|
|
||||||
/** This is the mode manager
|
|
||||||
* It contains functions for adding modes to Anope so Anope can track them
|
|
||||||
* and do things such as MLOCK.
|
|
||||||
* This also contains a mode stacker that will combine multiple modes and set
|
|
||||||
* them on a channel or user at once
|
|
||||||
*/
|
|
||||||
class CoreExport ModeManager final
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
/* Number of generic channel and user modes we are tracking */
|
|
||||||
static unsigned GenericChannelModes;
|
|
||||||
static unsigned GenericUserModes;
|
|
||||||
|
|
||||||
/** Add a user mode to Anope
|
|
||||||
* @param um A UserMode or UserMode derived class
|
|
||||||
* @return true on success, false on error
|
|
||||||
*/
|
|
||||||
static bool AddUserMode(UserMode *um);
|
|
||||||
|
|
||||||
/** Add a channel mode to Anope
|
|
||||||
* @param cm A ChannelMode or ChannelMode derived class
|
|
||||||
* @return true on success, false on error
|
|
||||||
*/
|
|
||||||
static bool AddChannelMode(ChannelMode *cm);
|
|
||||||
|
|
||||||
/** Remove a user mode from Anope
|
|
||||||
* @param um A UserMode to remove
|
|
||||||
*/
|
|
||||||
static void RemoveUserMode(UserMode *um);
|
|
||||||
|
|
||||||
/** Remove a channel mode from Anope
|
|
||||||
* @param um A ChanneMode to remove
|
|
||||||
*/
|
|
||||||
static void RemoveChannelMode(ChannelMode *cm);
|
|
||||||
|
|
||||||
/** Find a channel mode
|
|
||||||
* @param mode The mode
|
|
||||||
* @return The mode class
|
|
||||||
*/
|
|
||||||
static ChannelMode *FindChannelModeByChar(char mode);
|
|
||||||
|
|
||||||
/** Find a user mode
|
|
||||||
* @param mode The mode
|
|
||||||
* @return The mode class
|
|
||||||
*/
|
|
||||||
static UserMode *FindUserModeByChar(char mode);
|
|
||||||
|
|
||||||
/** Find a channel mode
|
|
||||||
* @param name The modename
|
|
||||||
* @return The mode class
|
|
||||||
*/
|
|
||||||
static ChannelMode *FindChannelModeByName(const Anope::string &name);
|
|
||||||
|
|
||||||
/** Find a user mode
|
|
||||||
* @param name The modename
|
|
||||||
* @return The mode class
|
|
||||||
*/
|
|
||||||
static UserMode *FindUserModeByName(const Anope::string &name);
|
|
||||||
|
|
||||||
/** Gets the channel mode char for a symbol (eg + returns v)
|
|
||||||
* @param symbol The symbol
|
|
||||||
* @return The char
|
|
||||||
*/
|
|
||||||
static char GetStatusChar(char symbol);
|
|
||||||
|
|
||||||
static const std::vector<ChannelMode *> &GetChannelModes();
|
|
||||||
static const std::vector<UserMode *> &GetUserModes();
|
|
||||||
static const std::vector<ChannelModeStatus *> &GetStatusChannelModesByRank();
|
|
||||||
static void RebuildStatusModes();
|
|
||||||
|
|
||||||
/** Add a mode to the stacker to be set on a channel
|
|
||||||
* @param bi The client to set the modes from
|
|
||||||
* @param c The channel
|
|
||||||
* @param cm The channel mode
|
|
||||||
* @param set true for setting, false for removing
|
|
||||||
* @param param The param, if there is one
|
|
||||||
*/
|
|
||||||
static void StackerAdd(BotInfo *bi, Channel *c, ChannelMode *cm, bool set, const Anope::string ¶m = "");
|
|
||||||
|
|
||||||
/** Add a mode to the stacker to be set on a user
|
|
||||||
* @param bi The client to set the modes from
|
|
||||||
* @param u The user
|
|
||||||
* @param um The user mode
|
|
||||||
* @param set true for setting, false for removing
|
|
||||||
* @param param The param, if there is one
|
|
||||||
*/
|
|
||||||
static void StackerAdd(BotInfo *bi, User *u, UserMode *um, bool set, const Anope::string ¶m = "");
|
|
||||||
|
|
||||||
/** Process all of the modes in the stacker and send them to the IRCd to be set on channels/users
|
|
||||||
*/
|
|
||||||
static void ProcessModes();
|
|
||||||
|
|
||||||
/** Delete a user, channel, or mode from the stacker
|
|
||||||
*/
|
|
||||||
static void StackerDel(User *u);
|
|
||||||
static void StackerDel(Channel *c);
|
|
||||||
static void StackerDel(Mode *m);
|
|
||||||
};
|
|
||||||
|
|
||||||
/** Represents a mask set on a channel (b/e/I)
|
|
||||||
*/
|
|
||||||
class CoreExport Entry final
|
|
||||||
{
|
|
||||||
Anope::string name;
|
|
||||||
Anope::string mask;
|
|
||||||
public:
|
|
||||||
unsigned short cidr_len = 0;
|
|
||||||
int family = 0;
|
|
||||||
Anope::string nick, user, host, real;
|
|
||||||
|
|
||||||
/** Constructor
|
|
||||||
* @param mode What mode this host is for, can be empty for unknown/no mode
|
|
||||||
* @param host A full or partial nick!ident@host/cidr#real name mask
|
|
||||||
*/
|
|
||||||
Entry(const Anope::string &mode, const Anope::string &host);
|
|
||||||
|
|
||||||
/** Get the banned mask for this entry
|
|
||||||
* @return The mask
|
|
||||||
*/
|
|
||||||
Anope::string GetMask() const;
|
|
||||||
|
|
||||||
Anope::string GetNUHMask() const;
|
|
||||||
|
|
||||||
/** Check if this entry matches a user
|
|
||||||
* @param u The user
|
|
||||||
* @param full True to match against a users real host and IP
|
|
||||||
* @return true on match
|
|
||||||
*/
|
|
||||||
bool Matches(User *u, bool full = false) const;
|
|
||||||
};
|
|
||||||
+13
-48
@@ -1,51 +1,16 @@
|
|||||||
/*
|
#ifndef MODULE_H
|
||||||
*
|
#define MODULE_H
|
||||||
* (C) 2003-2024 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "access.h"
|
|
||||||
#include "account.h"
|
|
||||||
#include "anope.h"
|
|
||||||
#include "base.h"
|
|
||||||
#include "bots.h"
|
|
||||||
#include "channels.h"
|
|
||||||
#include "commands.h"
|
|
||||||
#include "config.h"
|
|
||||||
#include "extensible.h"
|
|
||||||
#include "hashcomp.h"
|
|
||||||
#include "language.h"
|
|
||||||
#include "lists.h"
|
|
||||||
#include "logger.h"
|
|
||||||
#include "mail.h"
|
|
||||||
#include "memo.h"
|
|
||||||
#include "messages.h"
|
|
||||||
#include "modes.h"
|
|
||||||
#include "modules.h"
|
|
||||||
#include "opertype.h"
|
|
||||||
#include "protocol.h"
|
|
||||||
#include "regexpr.h"
|
|
||||||
#include "regchannel.h"
|
|
||||||
#include "serialize.h"
|
|
||||||
#include "servers.h"
|
|
||||||
#include "service.h"
|
|
||||||
#include "services.h"
|
#include "services.h"
|
||||||
#include "socketengine.h"
|
#include "commands.h"
|
||||||
#include "sockets.h"
|
#include "language.h"
|
||||||
#include "threadengine.h"
|
#include "modules.h"
|
||||||
#include "timers.h"
|
#include "depricated.h"
|
||||||
#include "uplink.h"
|
#include "version.h"
|
||||||
#include "users.h"
|
|
||||||
#include "xline.h"
|
#define MOD_UNIQUE 0
|
||||||
|
#define MOD_HEAD 1
|
||||||
|
#define MOD_TAIL 2
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "modules/pseudoclients/chanserv.h"
|
|
||||||
#include "modules/pseudoclients/global.h"
|
|
||||||
#include "modules/pseudoclients/memoserv.h"
|
|
||||||
#include "modules/pseudoclients/nickserv.h"
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user