1
0
mirror of https://github.com/osmarks/ngircd.git synced 2024-12-13 02:10:27 +00:00

Add preliminary ngIRCd protocol module for Anope 1.9

See contrib/Anope/README and doc/Services.txt for more details
and installation instructions!
This commit is contained in:
Alexander Barton 2011-07-10 14:20:48 +02:00
parent c041bb340c
commit 54566b6b32
8 changed files with 654 additions and 12 deletions

View File

@ -1,6 +1,6 @@
#
# ngIRCd -- The Next Generation IRC Daemon
# Copyright (c)2001-2010 Alexander Barton <alex@barton.de>
# Copyright (c)2001-2011 Alexander Barton (alex@barton.de) and Contributors
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@ -544,6 +544,7 @@ AC_OUTPUT([ \
src/testsuite/Makefile \
man/Makefile \
contrib/Makefile \
contrib/Anope/Makefile \
contrib/Debian/Makefile \
contrib/MacOSX/Makefile \
contrib/MacOSX/ngIRCd.xcodeproj/Makefile \

View File

@ -0,0 +1,496 @@
From bc5023fdba8091ab7eee29fe0deeca6843159743 Mon Sep 17 00:00:00 2001
From: Alexander Barton <alex@barton.de>
Date: Mon, 16 May 2011 18:23:01 +0200
Subject: [PATCH 1/2] Revert "Removed ngircd as we've decided not to support it at this time"
This reverts commit 605b5d57171d2f0fac56ee2ee3e1b1bbdadeb24f and re-enables
the ngIRCd protocol module for Anope.
---
modules/protocol/ngircd.cpp | 475 +++++++++++++++++++++++++++++++++++++++++++
1 files changed, 475 insertions(+), 0 deletions(-)
create mode 100644 modules/protocol/ngircd.cpp
diff --git a/modules/protocol/ngircd.cpp b/modules/protocol/ngircd.cpp
new file mode 100644
index 0000000..6e1f21f
--- /dev/null
+++ b/modules/protocol/ngircd.cpp
@@ -0,0 +1,475 @@
+/* ngIRCd IRCD functions
+ *
+ * (C) 2003-2011 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.
+ */
+
+#include "services.h"
+#include "modules.h"
+
+IRCDVar myIrcd[] = {
+ {"ngIRCd", /* ircd name */
+ "+oi", /* Modes used by pseudoclients */
+ 0, /* SVSNICK */
+ 0, /* Vhost */
+ 0, /* Supports SNlines */
+ 0, /* Supports SQlines */
+ 0, /* Supports SZlines */
+ 0, /* Join 2 Message */
+ 0, /* Chan SQlines */
+ 1, /* Quit on Kill */
+ 0, /* vidents */
+ 0, /* svshold */
+ 0, /* time stamp on mode */
+ 0, /* UMODE */
+ 0, /* O:LINE */
+ 0, /* No Knock requires +i */
+ 0, /* Can remove User Channel Modes with SVSMODE */
+ 0, /* Sglines are not enforced until user reconnects */
+ 0, /* ts6 */
+ "$", /* TLD Prefix for Global */
+ 20, /* Max number of modes we can send per line */
+ 0, /* IRCd sends a SSL users certificate fingerprint */
+ }
+ ,
+ {NULL}
+};
+
+/* PASS */
+class ngIRCdProto : public IRCDProto
+{
+ void SendAkill(User *u, const XLine *x)
+ {
+ if (SGLine && u == NULL)
+ for (Anope::insensitive_map<User *>::iterator it = UserListByNick.begin(); it != UserListByNick.end();)
+ {
+ u = it->second;
+ ++it;
+ if (SGLine->Check(u) != NULL)
+ break;
+ }
+ }
+
+ void SendAkillDel(const XLine*) { }
+
+ void SendGlobopsInternal(const BotInfo *source, const Anope::string &buf)
+ {
+ send_cmd(source ? source->nick : Config->ServerName, "WALLOPS :%s", buf.c_str());
+ }
+
+ void SendJoin(BotInfo *user, Channel *c, const ChannelStatus *status)
+ {
+ send_cmd(user->nick, "JOIN %s", c->name.c_str());
+ if (status)
+ for (unsigned i = 0; i < ModeManager::ChannelModes.size(); ++i)
+ if (status->HasFlag(ModeManager::ChannelModes[i]->Name))
+ c->SetMode(user, ModeManager::ChannelModes[i], user->nick, false);
+ }
+
+ void SendSVSKillInternal(const BotInfo *source, const User *user, const Anope::string &buf)
+ {
+ send_cmd(source ? source->nick : Config->ServerName, "KILL %s :%s", user->nick.c_str(), buf.c_str());
+ }
+
+ /* SERVER name hop descript */
+ void SendServer(const Server *server)
+ {
+ send_cmd("", "SERVER %s %d :%s", server->GetName().c_str(), server->GetHops(), server->GetDescription().c_str());
+ }
+
+ void SendConnect()
+ {
+ send_cmd("", "PASS %s 0210-IRC+ Anope|%s:CLHSo P", uplink_server->password.c_str(), Anope::VersionShort().c_str());
+ /* Make myself known to myself in the serverlist */
+ SendServer(Me);
+ /* finish the enhanced server handshake and register the connection */
+ this->SendNumeric(Config->ServerName, 376, "*", ":End of MOTD command");
+ }
+
+ // Received: :dev.anope.de NICK DukeP 1 ~DukePyro p57ABF9C9.dip.t-dialin.net 1 +i :DukePyrolator
+ void SendClientIntroduction(const User *u, const Anope::string &modes)
+ {
+ EnforceQlinedNick(u->nick, "");
+ send_cmd(Config->ServerName, "NICK %s 1 %s %s 1 %s :%s", u->nick.c_str(), u->GetIdent().c_str(), u->host.c_str(), modes.c_str(), u->realname.c_str());
+ }
+
+ void SendPartInternal(const BotInfo *bi, const Channel *chan, const Anope::string &buf)
+ {
+ if (!buf.empty())
+ send_cmd(bi->nick, "PART %s :%s", chan->name.c_str(), buf.c_str());
+ else
+ send_cmd(bi->nick, "PART %s", chan->name.c_str());
+ }
+
+ void SendModeInternal(const BotInfo *bi, const Channel *dest, const Anope::string &buf)
+ {
+ send_cmd(bi ? bi->nick : Config->ServerName, "MODE %s %s", dest->name.c_str(), buf.c_str());
+ }
+
+ void SendModeInternal(const BotInfo *bi, const User *u, const Anope::string &buf)
+ {
+ send_cmd(bi ? bi->nick : Config->ServerName, "MODE %s %s", u->nick.c_str(), buf.c_str());
+ }
+
+ void SendKickInternal(const BotInfo *bi, const Channel *chan, const User *user, const Anope::string &buf)
+ {
+ if (!buf.empty())
+ send_cmd(bi->nick, "KICK %s %s :%s", chan->name.c_str(), user->nick.c_str(), buf.c_str());
+ else
+ send_cmd(bi->nick, "KICK %s %s", chan->name.c_str(), user->nick.c_str());
+ }
+
+ void SendNoticeChanopsInternal(const BotInfo *source, const Channel *dest, const Anope::string &buf)
+ {
+ send_cmd(source ? source->nick : Config->s_ChanServ, "NOTICE @%s :%s", dest->name.c_str(), buf.c_str());
+ }
+
+ /* INVITE */
+ void SendInvite(BotInfo *source, const Anope::string &chan, const Anope::string &nick)
+ {
+ send_cmd(source->nick, "INVITE %s %s", nick.c_str(), chan.c_str());
+ }
+
+ void SendChannel(Channel *c)
+ {
+ Anope::string mlock_modes = get_mlock_modes(c->ci, true);
+ if (mlock_modes.empty())
+ mlock_modes = "+";
+ send_cmd(Config->ServerName, "CHANINFO %s %s", c->name.c_str(), mlock_modes.c_str());
+ }
+ void SendTopic(BotInfo *bi, Channel *c)
+ {
+ send_cmd(bi->nick, "TOPIC %s :%s", c->name.c_str(), c->topic.c_str());
+ }
+};
+
+class ngIRCdIRCdMessage : public IRCdMessage
+{
+ public:
+ bool OnSJoin(const Anope::string&, const std::vector<Anope::string>&) { return false; }
+
+ /*
+ * Received: :dev.anope.de MODE #anope +b *!*@*aol*
+ */
+ bool OnMode(const Anope::string &source, const std::vector<Anope::string> &params)
+ {
+ if (params.size() < 2)
+ return true;
+
+ Anope::string modes = params[1];
+ for (unsigned i = 2; i < params.size(); ++i)
+ modes += " " + params[i];
+
+ if (params[0][0] == '#' || params[0][0] == '&')
+ do_cmode(source, params[0], modes, "");
+ else
+ do_umode(params[0], params[1]);
+
+ return true;
+ }
+
+ /*
+ Received: :DukeP_ NICK :test2
+ Received: :dev.anope.de NICK DukeP_ 1 ~DukePyro ip-2-201-236-154.web.vodafone.de 1 + :DukePyrolator
+ source = nickname on nickchange, servername on newuser
+ params[0] = nick
+ params[1] = <unknown>
+ params[2] = username
+ params[3] = host
+ params[4] = <unknown>
+ params[5] = modes
+ params[6] = info
+ */
+ bool OnNick(const Anope::string &source, const std::vector<Anope::string> &params)
+ {
+ if (params.size() == 1)
+ {
+ // we have a nickchange
+ do_nick(source, params[0], "", "", "", "", Anope::CurTime, "", "", "", "");
+ }
+ else if (params.size() == 7)
+ {
+ // a new user is connecting to the network
+ User *user = do_nick("", params[0], params[2], params[3], source, params[6], Anope::CurTime, "", "", "", params[5]);
+ if (user)
+ validate_user(user);
+ }
+ else
+ {
+ Log() << "Received NICK with invalid number of parameters. source = " << source << "param[0] = " << params[0] << "params.size() = " << params.size();
+ }
+ return true;
+ }
+
+ bool OnServer(const Anope::string &source, const std::vector<Anope::string> &params)
+ {
+ if (params.size() == 3)
+ do_server("", params[0], 0, params[2], params[1]);
+ else
+ do_server(source, params[0], params[1].is_pos_number_only() ? convertTo<unsigned>(params[1]) : 0, params[3], params[2]);
+ return true;
+ }
+
+ bool OnTopic(const Anope::string &source, const std::vector<Anope::string> &params)
+ {
+ Channel *c = findchan(params[0]);
+ if (!c)
+ {
+ Log() << "TOPIC for nonexistant channel " << params[0];
+ return true;
+ }
+
+ c->ChangeTopicInternal(source, params[1]);
+ return true;
+ }
+
+ /*
+ * <@po||ux> DukeP: RFC 2813, 4.2.1: the JOIN command on server-server links
+ * separates the modes ("o") with ASCII 7, not space. And you can't see ASCII 7.
+ *
+ * if a user joins a new channel, the ircd sends <channelname>\7<umode>
+ */
+ bool OnJoin (const Anope::string &source, const std::vector<Anope::string> &params)
+ {
+ if (!params.empty())
+ {
+ size_t pos = params[0].find('\7');
+ if (pos != Anope::string::npos)
+ {
+ Anope::string channel = params[0].substr(0, pos);
+ Anope::string mode = '+' + params[0].substr(pos, params[0].length()) + " " + source;
+ do_join(source, channel, "");
+ do_cmode(source, channel, mode, "");
+ }
+ else
+ do_join(source, params[0], "");
+ }
+ return true;
+ }
+};
+
+/*
+ * CHANINFO <chan> +<modes>
+ * CHANINFO <chan> +<modes> :<topic>
+ * CHANINFO <chan> +<modes> <key> <limit> :<topic>
+ */
+bool event_chaninfo(const Anope::string &source, const std::vector<Anope::string> &params)
+{
+
+ Channel *c = findchan(params[0]);
+ if (!c)
+ c = new Channel(params[0]);
+
+ Anope::string modes = params[1];
+
+ if (params.size() == 3)
+ {
+ c->ChangeTopicInternal(source, params[2], Anope::CurTime);
+ }
+ else if (params.size() == 5)
+ {
+ for (size_t i = 0, end = params[1].length(); i < end; ++i)
+ {
+ switch(params[1][i])
+ {
+ case 'k':
+ modes += " " + params[2];
+ continue;
+ case 'l':
+ modes += " " + params[3];
+ continue;
+ }
+ }
+ c->ChangeTopicInternal(source, params[4], Anope::CurTime);
+ }
+
+ c->SetModesInternal(NULL, modes);
+
+ return true;
+}
+
+/*
+ * Received: :dev.anope.de NJOIN #test :DukeP2,@DukeP
+ */
+bool event_njoin(const Anope::string &source, const std::vector<Anope::string> &params)
+{
+ Channel *c = findchan(params[0]);
+ commasepstream sep(params[1]);
+ Anope::string buf;
+
+ if (!c)
+ {
+ c = new Channel(params[0], Anope::CurTime);
+ c->SetFlag(CH_SYNCING);
+ }
+
+ while (sep.GetToken(buf))
+ {
+ std::list<ChannelMode *> Status;
+ char ch;
+
+ /* Get prefixes from the nick */
+ while ((ch = ModeManager::GetStatusChar(buf[0])))
+ {
+ buf.erase(buf.begin());
+ ChannelMode *cm = ModeManager::FindChannelModeByChar(ch);
+ if (!cm)
+ {
+ Log() << "Received unknown mode prefix " << ch << " in NJOIN string.";
+ continue;
+ }
+ Status.push_back(cm);
+ }
+ User *u = finduser(buf);
+ if (!u)
+ {
+ Log(LOG_DEBUG) << "NJOIN for nonexistant user " << buf << " on " << c->name;
+ continue;
+ }
+
+ EventReturn MOD_RESULT;
+ FOREACH_RESULT(I_OnPreJoinChannel, OnPreJoinChannel(u, c));
+
+ /* Add the user to the Channel */
+ c->JoinUser(u);
+
+ /* Update their status internally on the channel
+ * This will enforce secureops etc on the user
+ */
+ for (std::list<ChannelMode *>::iterator it = Status.begin(), it_end = Status.end(); it != it_end; ++it)
+ c->SetModeInternal(*it, buf);
+ /* Now set whatever modes this user is allowed to have on the channel */
+ chan_set_correct_modes(u, c, 1);
+
+ /* Check to see if modules want the user to join, if they do
+ * check to see if they are allowed to join (CheckKick will kick/ban them)
+ * Don't trigger OnJoinChannel event then as the user will be destroyed
+ */
+ if (MOD_RESULT != EVENT_STOP && c->ci && c->ci->CheckKick(u))
+ continue;
+
+ FOREACH_MOD(I_OnJoinChannel, OnJoinChannel(u, c));
+ } /* while */
+
+ if (c->HasFlag(CH_SYNCING))
+ {
+ c->UnsetFlag(CH_SYNCING);
+ c->Sync();
+ }
+
+ return true;
+}
+
+bool event_kick(const Anope::string &source, const std::vector<Anope::string> &params)
+{
+ if (params.size() > 2)
+ do_kick(source, params[0], params[1], params[2]);
+ return true;
+}
+
+bool event_pass(const Anope::string &source, const std::vector<Anope::string> &params)
+{
+ return true;
+}
+
+bool event_005(const Anope::string &source, const std::vector<Anope::string> &params)
+{
+ size_t pos;
+ Anope::string name, data;
+ for (unsigned i = 0, end = params.size(); i < end; ++i)
+ {
+ pos = params[i].find('=');
+ if (pos != Anope::string::npos)
+ {
+ name = params[i].substr(0, pos);
+ data = params[i].substr(pos+1, params[i].length());
+ if (name == "NICKLEN")
+ {
+ unsigned newlen = convertTo<unsigned>(data);
+ if (Config->NickLen != newlen)
+ {
+ Log() << "Config->NickLen changed from " << Config->NickLen << " to " << newlen;
+ Config->NickLen = newlen;
+ }
+ }
+ }
+ }
+ return true;
+}
+
+bool event_442(const Anope::string &source, const std::vector<Anope::string> &params)
+{
+ return true;
+}
+
+bool event_376(const Anope::string &source, const std::vector<Anope::string> &params)
+{
+ return true;
+}
+
+
+class ProtongIRCd : public Module
+{
+ Message message_kick, message_pass, message_njoin, message_chaninfo, message_005,
+ message_442, message_376;
+
+ ngIRCdProto ircd_proto;
+ ngIRCdIRCdMessage ircd_message;
+
+ void AddModes()
+ {
+ /* Add user modes */
+ ModeManager::AddUserMode(new UserMode(UMODE_ADMIN, 'a'));
+ ModeManager::AddUserMode(new UserMode(UMODE_INVIS, 'i'));
+ ModeManager::AddUserMode(new UserMode(UMODE_OPER, 'o'));
+ ModeManager::AddUserMode(new UserMode(UMODE_RESTRICTED, 'r'));
+ ModeManager::AddUserMode(new UserMode(UMODE_SNOMASK, 's'));
+ ModeManager::AddUserMode(new UserMode(UMODE_WALLOPS, 'w'));
+ ModeManager::AddUserMode(new UserMode(UMODE_CLOAK, 'x'));
+
+ /* b/e/I */
+ ModeManager::AddChannelMode(new ChannelModeBan(CMODE_BAN, 'b'));
+ ModeManager::AddChannelMode(new ChannelModeList(CMODE_INVITEOVERRIDE, 'I'));
+
+ /* v/h/o/a/q */
+ ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_VOICE, 'v', '+'));
+ ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_OP, 'o', '@'));
+
+ /* Add channel modes */
+ // channel modes: biIklmnoPstvz
+ ModeManager::AddChannelMode(new ChannelMode(CMODE_INVITE, 'i'));
+ ModeManager::AddChannelMode(new ChannelModeKey('k'));
+ ModeManager::AddChannelMode(new ChannelModeParam(CMODE_LIMIT, 'l'));
+ ModeManager::AddChannelMode(new ChannelMode(CMODE_MODERATED, 'm'));
+ ModeManager::AddChannelMode(new ChannelMode(CMODE_NOEXTERNAL, 'n'));
+ ModeManager::AddChannelMode(new ChannelMode(CMODE_PERM, 'P'));
+ ModeManager::AddChannelMode(new ChannelMode(CMODE_SECRET, 's'));
+ ModeManager::AddChannelMode(new ChannelMode(CMODE_TOPIC, 't'));
+ ModeManager::AddChannelMode(new ChannelMode(CMODE_SSL, 'z'));
+ }
+
+ public:
+ ProtongIRCd(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator),
+ message_kick("KICK", event_kick), message_pass("PASS", event_pass),
+ message_njoin("NJOIN", event_njoin), message_chaninfo("CHANINFO", event_chaninfo),
+ message_005("005", event_005), message_442("442", event_442), message_376("376", event_376)
+ {
+ this->SetAuthor("Anope");
+ this->SetType(PROTOCOL);
+
+ Capab.SetFlag(CAPAB_QS);
+
+ pmodule_ircd_var(myIrcd);
+ pmodule_ircd_proto(&this->ircd_proto);
+ pmodule_ircd_message(&this->ircd_message);
+
+ this->AddModes();
+ }
+};
+
+MODULE_INIT(ProtongIRCd)
--
1.7.2.5

View File

@ -0,0 +1,60 @@
From 1ea1dd2095e63cef34edbebb729edc687f410a96 Mon Sep 17 00:00:00 2001
From: Alexander Barton <alex@barton.de>
Date: Mon, 16 May 2011 18:26:56 +0200
Subject: [PATCH 2/2] ngircd: whitespace fixes
---
modules/protocol/ngircd.cpp | 12 ++++++------
1 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/modules/protocol/ngircd.cpp b/modules/protocol/ngircd.cpp
index 6e1f21f..e546d05 100644
--- a/modules/protocol/ngircd.cpp
+++ b/modules/protocol/ngircd.cpp
@@ -266,11 +266,11 @@ bool event_chaninfo(const Anope::string &source, const std::vector<Anope::string
c = new Channel(params[0]);
Anope::string modes = params[1];
-
+
if (params.size() == 3)
{
c->ChangeTopicInternal(source, params[2], Anope::CurTime);
- }
+ }
else if (params.size() == 5)
{
for (size_t i = 0, end = params[1].length(); i < end; ++i)
@@ -307,7 +307,7 @@ bool event_njoin(const Anope::string &source, const std::vector<Anope::string> &
c = new Channel(params[0], Anope::CurTime);
c->SetFlag(CH_SYNCING);
}
-
+
while (sep.GetToken(buf))
{
std::list<ChannelMode *> Status;
@@ -415,9 +415,9 @@ bool event_376(const Anope::string &source, const std::vector<Anope::string> &pa
class ProtongIRCd : public Module
{
- Message message_kick, message_pass, message_njoin, message_chaninfo, message_005,
+ Message message_kick, message_pass, message_njoin, message_chaninfo, message_005,
message_442, message_376;
-
+
ngIRCdProto ircd_proto;
ngIRCdIRCdMessage ircd_message;
@@ -461,7 +461,7 @@ class ProtongIRCd : public Module
{
this->SetAuthor("Anope");
this->SetType(PROTOCOL);
-
+
Capab.SetFlag(CAPAB_QS);
pmodule_ircd_var(myIrcd);
--
1.7.2.5

20
contrib/Anope/Makefile.am Normal file
View File

@ -0,0 +1,20 @@
#
# ngIRCd -- The Next Generation IRC Daemon
# Copyright (c)2001-2011 Alexander Barton (alex@barton.de) and Contributors
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
# Please read the file COPYING, README and AUTHORS for more information.
#
EXTRA_DIST = \
README \
0001-Revert-Removed-ngircd.patch \
0002-ngircd-whitespace-fixes.patch
maintainer-clean-local:
rm -f Makefile Makefile.in
# -eof-

36
contrib/Anope/README Normal file
View File

@ -0,0 +1,36 @@
ngIRCd - Next Generation IRC Server
http://ngircd.barton.de/
(c)2001-2011 Alexander Barton and Contributors.
ngIRCd is free software and published under the
terms of the GNU General Public License.
-- contrib/Anope/README --
This directory contains two preliminary patches that (re-) add a ngIRCd
protocol module to the Anope 1.9 development branch. It has been tested
with Anope 1.9.4, there is no guarantee that it will work with other
versions as Anope 1.9.x is under heavy development ...
To build this Anope protocol module, you have to
- Download the Anope 1.9.x sources (tested with 1.9.4),
- Patch in the ngIRCd protocol module,
- Build and install Anope as usual,
- Configure Anope as usual, use "ngircd" as protocol module.
So the command sequence can be something like this:
$ tar xzf anope-1.9.4-source.tar.gz
$ cd anope-1.9.4-source
$ patch -p1 < .../ngircd/contrib/Anope/0001-Revert-Removed-ngircd.patch
$ patch -p1 < .../ngircd/contrib/Anope/0002-ngircd-whitespace-fixes.patch
$ ./Config
$ cd build
$ make
$ make install
Please have a look at the file doc/Services.txt for more information about
how to set up ngIRCd and Anope.

View File

@ -1,6 +1,6 @@
#
# ngIRCd -- The Next Generation IRC Daemon
# Copyright (c)2001-2009 Alexander Barton (alex@barton.de)
# Copyright (c)2001-2011 Alexander Barton (alex@barton.de) and Contributors
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@ -9,7 +9,7 @@
# Please read the file COPYING, README and AUTHORS for more information.
#
SUBDIRS = Debian MacOSX
SUBDIRS = Anope Debian MacOSX
EXTRA_DIST = README ngircd.spec systrace.policy ngindent ngircd-bsd.sh \
ngIRCd-Logo.gif ngircd-redhat.init platformtest.sh

View File

@ -1,15 +1,17 @@
ngIRCd - Next Generation IRC Server
http://ngircd.barton.de/
(c)2001-2009 Alexander Barton,
alex@barton.de, http://www.barton.de/
(c)2001-2011 Alexander Barton and Contributors.
ngIRCd is free software and published under the
terms of the GNU General Public License.
-- Contributions --
Anope/
- A preliminary patch that adds a ngIRCd protocol module to Anope 1.9.
Debian/
- Various files for building Debian GNU/Linux packages (".deb's").

View File

@ -1,9 +1,8 @@
ngIRCd - Next Generation IRC Server
http://ngircd.barton.de/
(c)2001-2008 Alexander Barton,
alex@barton.de, http://www.barton.de/
(c)2001-2011 Alexander Barton and Contributors.
ngIRCd is free software and published under the
terms of the GNU General Public License.
@ -14,9 +13,11 @@ At the moment, ngIRCd doesn't implement a "special IRC services interface".
But services acting as a "regular server" are supported, either using the IRC
protocol defined in RFC 1459 or RFC 2812.
Services have been tested using "IRC Services" version 5.x by Andrew Church,
homepage: <http://www.ircservices.za.net/>. This document describes setting up
ngIRCd and these services.
Support for Services has been tested using "IRC Services" version 5.x by
Andrew Church (<http://achurch.org/services/>), and a Anope 1.9 using a
preliminary protocol module for ngIRCd (<http://www.anope.org/>).
This document describes setting up ngIRCd and these services.
Setting up ngIRCd
@ -36,6 +37,31 @@ Example:
ServiceMask = *Serv
Setting up Anope 1.9.x
~~~~~~~~~~~~~~~~~~~~~~
Anope 1.9.4 (and above) can be used with ngIRCd using a preliminary "ngircd"
protocol module contained in our contrib/Anope/ directory. Please see the
file contrib/Anope/README for installation instructions!
After patching and installing Anope, at least the following configuration
variables have to be adjusted in data/services.conf, in addition to all the
settings marked as required:
uplink
{
host = "server.irc.net"
port = 6667
password = "123abc"
}
serverinfo
{
name = "services.irc.net"
type = "ngircd"
}
Setting up IRC Services 5.1.x
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@ -66,5 +92,6 @@ In modules.conf:
The documentation of IRC Services can be found here:
<http://www.ircservices.za.net/docs/>
Please let us know if you are successfully using other IRC service packages or
which problems you encounter, thanks!