commit 54566b6b32441044660c8fca784ef7b09b933a7e from: Alexander Barton date: Sun Jul 10 12:23:11 2011 UTC Add preliminary ngIRCd protocol module for Anope 1.9 See contrib/Anope/README and doc/Services.txt for more details and installation instructions! commit - c041bb340cd69654cab68fe6e9cefd62b1c1c30a commit + 54566b6b32441044660c8fca784ef7b09b933a7e blob - 5e334963975a660c92d95c7790054614aa5e9049 blob + e48e9e394148514e94c8978e3c796849f8153c9f --- configure.in +++ configure.in @@ -1,6 +1,6 @@ # # ngIRCd -- The Next Generation IRC Daemon -# Copyright (c)2001-2010 Alexander Barton +# 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 \ blob - /dev/null blob + efed0adbdf1905a012c790b1fa57460decb04d72 (mode 644) --- /dev/null +++ contrib/Anope/0001-Revert-Removed-ngircd.patch @@ -0,0 +1,496 @@ +From bc5023fdba8091ab7eee29fe0deeca6843159743 Mon Sep 17 00:00:00 2001 +From: Alexander Barton +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::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&) { return false; } ++ ++ /* ++ * Received: :dev.anope.de MODE #anope +b *!*@*aol* ++ */ ++ bool OnMode(const Anope::string &source, const std::vector ¶ms) ++ { ++ 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] = ++ params[2] = username ++ params[3] = host ++ params[4] = ++ params[5] = modes ++ params[6] = info ++ */ ++ bool OnNick(const Anope::string &source, const std::vector ¶ms) ++ { ++ 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 ¶ms) ++ { ++ 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(params[1]) : 0, params[3], params[2]); ++ return true; ++ } ++ ++ bool OnTopic(const Anope::string &source, const std::vector ¶ms) ++ { ++ 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 \7 ++ */ ++ bool OnJoin (const Anope::string &source, const std::vector ¶ms) ++ { ++ 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 + ++ * CHANINFO + : ++ * CHANINFO + : ++ */ ++bool event_chaninfo(const Anope::string &source, const std::vector ¶ms) ++{ ++ ++ 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 ¶ms) ++{ ++ 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 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::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 ¶ms) ++{ ++ 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 ¶ms) ++{ ++ return true; ++} ++ ++bool event_005(const Anope::string &source, const std::vector ¶ms) ++{ ++ 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(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 ¶ms) ++{ ++ return true; ++} ++ ++bool event_376(const Anope::string &source, const std::vector ¶ms) ++{ ++ 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 + blob - /dev/null blob + 60356a8812d752969db6deda1a9041da8b3b3490 (mode 644) --- /dev/null +++ contrib/Anope/0002-ngircd-whitespace-fixes.patch @@ -0,0 +1,60 @@ +From 1ea1dd2095e63cef34edbebb729edc687f410a96 Mon Sep 17 00:00:00 2001 +From: Alexander Barton +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::vectorChangeTopicInternal(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 & + c = new Channel(params[0], Anope::CurTime); + c->SetFlag(CH_SYNCING); + } +- ++ + while (sep.GetToken(buf)) + { + std::list Status; +@@ -415,9 +415,9 @@ bool event_376(const Anope::string &source, const std::vector &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 + blob - /dev/null blob + 7670384f1ef85142f8605092951c74bb62087274 (mode 644) --- /dev/null +++ contrib/Anope/Makefile.am @@ -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- blob - /dev/null blob + ea47b0695f200a6b85ba88b38eb3ee9acfe59b80 (mode 644) --- /dev/null +++ contrib/Anope/README @@ -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. blob - b9da38e6b47b1cf8c4ff5b129b3c65a250c3154d blob + 36ba245806f7cbd688a44d29a4a3e708df47ee62 --- contrib/Makefile.am +++ contrib/Makefile.am @@ -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 blob - 6593fdd2edc4f6d18b02bf637fb106755c3ea8b8 blob + 6097baeaeedf1793475df42cc2200ec3b3fabf22 --- contrib/README +++ contrib/README @@ -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"). blob - 67053b16a93155e5315ca03e19fef9c709fd4f7a blob + c2059b246a69a0009df69a710e1fcde3cb4e3443 --- doc/Services.txt +++ doc/Services.txt @@ -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,11 +13,13 @@ At the moment, ngIRCd doesn't implement a "special IRC 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: . This document describes setting up -ngIRCd and these services. +Support for Services has been tested using "IRC Services" version 5.x by +Andrew Church (), and a Anope 1.9 using a +preliminary protocol module for ngIRCd (). +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: + Please let us know if you are successfully using other IRC service packages or which problems you encounter, thanks!