Commit Diff


commit - c16133c5ee72256ef5b8fa586e72e5e3598e75bb
commit + 89d99e2ff97e5217e80190765d3e1e9bb59239d6
blob - /dev/null
blob + c4ea0e6d6bf4577bdba5ae75890f12a31a197e64 (mode 644)
--- /dev/null
+++ contrib/Anope/0003-Update-ngIRCd-protocol-module-for-current-Anope-1.9.patch
@@ -0,0 +1,128 @@
+From d8eddbeaadc7d161865b5342d59748b80266533c Mon Sep 17 00:00:00 2001
+From: DukePyrolator <DukePyrolator@anope.org>
+Date: Mon, 22 Aug 2011 14:53:37 +0200
+Subject: [PATCH 03/16] Update ngIRCd protocol module for current Anope 1.9
+ GIT
+
+---
+ modules/protocol/ngircd.cpp |   37 ++++++++++++++++++-------------------
+ 1 files changed, 18 insertions(+), 19 deletions(-)
+
+diff --git a/modules/protocol/ngircd.cpp b/modules/protocol/ngircd.cpp
+index e546d05..790b8f4 100644
+--- a/modules/protocol/ngircd.cpp
++++ b/modules/protocol/ngircd.cpp
+@@ -11,6 +11,8 @@
+ 
+ #include "services.h"
+ #include "modules.h"
++#include "nickserv.h"
++#include "oper.h"
+ 
+ IRCDVar myIrcd[] = {
+ 	{"ngIRCd",	/* ircd name */
+@@ -45,14 +47,7 @@ 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;
+-			}
++		// TODO: ADD SOME CODE
+ 	}
+ 
+ 	void SendAkillDel(const XLine*) { }
+@@ -62,13 +57,16 @@ class ngIRCdProto : public IRCDProto
+ 		send_cmd(source ? source->nick : Config->ServerName, "WALLOPS :%s", buf.c_str());
+ 	}
+ 
+-	void SendJoin(BotInfo *user, Channel *c, const ChannelStatus *status)
++	void SendJoin(User *user, Channel *c, const ChannelStatus *status)
+ 	{
+ 		send_cmd(user->nick, "JOIN %s", c->name.c_str());
+ 		if (status)
++		{
++			BotInfo *setter = findbot(user->nick);
+ 			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);
++					c->SetMode(setter, ModeManager::ChannelModes[i], user->nick, false);
++		}
+ 	}
+ 
+ 	void SendSVSKillInternal(const BotInfo *source, const User *user, const Anope::string &buf)
+@@ -84,7 +82,7 @@ class ngIRCdProto : public IRCDProto
+ 
+ 	void SendConnect()
+ 	{
+-		send_cmd("", "PASS %s 0210-IRC+ Anope|%s:CLHSo P", uplink_server->password.c_str(), Anope::VersionShort().c_str());
++		send_cmd("", "PASS %s 0210-IRC+ Anope|%s:CLHSo P", Config->Uplinks[CurrentUplink]->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 */
+@@ -92,9 +90,11 @@ class ngIRCdProto : public IRCDProto
+ 	}
+ 
+ 	// 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)
++	void SendClientIntroduction(const User *u)
+ 	{
+-		EnforceQlinedNick(u->nick, "");
++		Anope::string modes = "+" + u->GetModes();
++		XLine x(u->nick, "Reserved for services");
++		ircdproto->SendSQLine(NULL, &x);
+ 		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());
+ 	}
+ 
+@@ -126,7 +126,7 @@ class ngIRCdProto : public IRCDProto
+ 
+ 	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());
++		send_cmd(source->nick, "NOTICE @%s :%s", dest->name.c_str(), buf.c_str());
+ 	}
+ 
+ 	/* INVITE */
+@@ -196,8 +196,8 @@ class ngIRCdIRCdMessage : public IRCdMessage
+ 		{
+ 			// 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);
++			if (user && nickserv)
++				nickserv->Validate(user);
+ 		}
+ 		else
+ 		{
+@@ -433,7 +433,7 @@ class ProtongIRCd : public Module
+ 		ModeManager::AddUserMode(new UserMode(UMODE_CLOAK, 'x'));
+ 
+ 		/* b/e/I */
+-		ModeManager::AddChannelMode(new ChannelModeBan(CMODE_BAN, 'b'));
++		ModeManager::AddChannelMode(new ChannelModeList(CMODE_BAN, 'b'));
+ 		ModeManager::AddChannelMode(new ChannelModeList(CMODE_INVITEOVERRIDE, 'I'));
+ 
+ 		/* v/h/o/a/q */
+@@ -454,13 +454,12 @@ class ProtongIRCd : public Module
+ 	}
+ 
+  public:
+-	ProtongIRCd(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator),
++	ProtongIRCd(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, PROTOCOL),
+ 		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);
+ 
+-- 
+1.7.8.3
+
blob - ea47b0695f200a6b85ba88b38eb3ee9acfe59b80
blob + 50f025c7c24f6aa1a3df531a622886a1aa468676
--- contrib/Anope/README
+++ contrib/Anope/README
@@ -2,7 +2,7 @@
                      ngIRCd - Next Generation IRC Server
                            http://ngircd.barton.de/
 
-               (c)2001-2011 Alexander Barton and Contributors.
+               (c)2001-2012 Alexander Barton and Contributors.
                ngIRCd is free software and published under the
                    terms of the GNU General Public License.
 
@@ -11,22 +11,21 @@
 
 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
+with Anope 1.9.6, 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),
+ - Download the Anope 1.9.x sources (only tested with 1.9.6!),
  - 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
+ $ tar xzf anope-1.9.6-source.tar.gz
+ $ cd anope-1.9.6-source
+ $ for p in .../ngircd/contrib/Anope/*.patch ; do patch -p1 < $p ; done
  $ ./Config
  $ cd build
  $ make
blob - /dev/null
blob + 0aec3e9e15a8968652ad14b347fbfd85245a61d6 (mode 644)
--- /dev/null
+++ contrib/Anope/0004-ngircd-Do-PING-PONG-on-server-burst-to-sync-servers.patch
@@ -0,0 +1,93 @@
+From 88b2b14a76b8ee053b1f6ea64139350260590043 Mon Sep 17 00:00:00 2001
+From: DukePyrolator <DukePyrolator@anope.org>
+Date: Mon, 22 Aug 2011 14:55:07 +0200
+Subject: [PATCH 04/16] ngircd: Do PING-PONG on server burst to "sync servers"
+
+Imagine we had three servers, A, B & C linked like so: A<->B<->C:
+
+If Anope is linked to A and B splits from A and then reconnects B
+introduces itself, introduces C, sends EOS for C, introduces B's clients
+introduces C's clients, sends EOS for B. This causes all of C's clients
+to be introduced with their server "not syncing".
+
+We now send a PING immediately when receiving a new server and then
+finish sync once we get a pong back from that server.
+---
+ modules/protocol/ngircd.cpp |   28 ++++++++++++++++++++++++++--
+ 1 files changed, 26 insertions(+), 2 deletions(-)
+
+diff --git a/modules/protocol/ngircd.cpp b/modules/protocol/ngircd.cpp
+index 790b8f4..89aecfd 100644
+--- a/modules/protocol/ngircd.cpp
++++ b/modules/protocol/ngircd.cpp
+@@ -108,11 +108,13 @@ class ngIRCdProto : public IRCDProto
+ 
+ 	void SendModeInternal(const BotInfo *bi, const Channel *dest, const Anope::string &buf)
+ 	{
++Log(LOG_DEBUG) << "SendModeInternal 1";
+ 		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)
+ 	{
++Log(LOG_DEBUG) << "SendModeInternal 2";
+ 		send_cmd(bi ? bi->nick : Config->ServerName, "MODE %s %s", u->nick.c_str(), buf.c_str());
+ 	}
+ 
+@@ -212,6 +214,8 @@ class ngIRCdIRCdMessage : public IRCdMessage
+ 			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]);
++
++		ircdproto->SendPing(Config->ServerName, params[0]);
+ 		return true;
+ 	}
+ 
+@@ -253,6 +257,25 @@ class ngIRCdIRCdMessage : public IRCdMessage
+ 	}
+ };
+ 
++/** This is here because:
++ *
++ * If we had three servers, A, B & C linked like so: A<->B<->C
++ * If Anope is linked to A and B splits from A and then reconnects
++ * B introduces itself, introduces C, sends EOS for C, introduces Bs clients
++ * introduces Cs clients, sends EOS for B. This causes all of Cs clients to be introduced
++ * with their server "not syncing". We now send a PING immediately when receiving a new server
++ * and then finish sync once we get a pong back from that server.
++ */
++bool event_pong(const Anope::string &source, const std::vector<Anope::string> &params)
++{
++	Server *s = Server::Find(source);
++	if (s && !s->IsSynced())
++		s->Sync(false);
++	return true;
++}
++
++
++
+ /*
+  * CHANINFO <chan> +<modes>
+  * CHANINFO <chan> +<modes> :<topic>
+@@ -416,7 +439,7 @@ 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_442, message_376;
++		message_442, message_376, message_pong;
+ 
+ 	ngIRCdProto ircd_proto;
+ 	ngIRCdIRCdMessage ircd_message;
+@@ -457,7 +480,8 @@ class ProtongIRCd : public Module
+ 	ProtongIRCd(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, PROTOCOL),
+ 		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)
++		message_005("005", event_005), message_442("442", event_442), message_376("376", event_376),
++		message_pong("PONG", event_pong)
+ 	{
+ 		this->SetAuthor("Anope");
+ 
+-- 
+1.7.8.3
+
blob - /dev/null
blob + 27b716388508014bb51a90d3a8bc1e14eecb892f (mode 644)
--- /dev/null
+++ contrib/Anope/0005-ngircd-always-prefix-modes-in-CHANINFO-with.patch
@@ -0,0 +1,29 @@
+From 0d83f8f9ca0de651d664eca6f467f36df0417f7d Mon Sep 17 00:00:00 2001
+From: Alexander Barton <alex@barton.de>
+Date: Mon, 22 Aug 2011 14:59:49 +0200
+Subject: [PATCH 05/16] ngircd: always prefix modes in CHANINFO with "+"
+
+---
+ modules/protocol/ngircd.cpp |    6 ++----
+ 1 files changed, 2 insertions(+), 4 deletions(-)
+
+diff --git a/modules/protocol/ngircd.cpp b/modules/protocol/ngircd.cpp
+index 89aecfd..3e5beb3 100644
+--- a/modules/protocol/ngircd.cpp
++++ b/modules/protocol/ngircd.cpp
+@@ -139,10 +139,8 @@ Log(LOG_DEBUG) << "SendModeInternal 2";
+ 
+ 	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());
++		Anope::string modes = c->GetModes(true, true);
++		send_cmd(Config->ServerName, "CHANINFO %s +%s", c->name.c_str(), modes.c_str());
+ 	}
+ 	void SendTopic(BotInfo *bi, Channel *c)
+ 	{
+-- 
+1.7.8.3
+
blob - /dev/null
blob + 8038555ce6afa2c5345031635dc69777ff9fdb9e (mode 644)
--- /dev/null
+++ contrib/Anope/0006-ngircd-support-user-mode-R-and-channel-mode-R.patch
@@ -0,0 +1,47 @@
+From 1914a36b83b1fc6b4678ef261a1a06eefab9a0ca Mon Sep 17 00:00:00 2001
+From: Alexander Barton <alex@barton.de>
+Date: Fri, 26 Aug 2011 17:51:37 +0200
+Subject: [PATCH 06/16] ngircd: support user mode "R" and channel mode "R"
+
+---
+ modules/protocol/ngircd.cpp |    7 ++++---
+ 1 files changed, 4 insertions(+), 3 deletions(-)
+
+diff --git a/modules/protocol/ngircd.cpp b/modules/protocol/ngircd.cpp
+index 3e5beb3..7f4186e 100644
+--- a/modules/protocol/ngircd.cpp
++++ b/modules/protocol/ngircd.cpp
+@@ -449,26 +449,27 @@ class ProtongIRCd : public Module
+ 		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_REGISTERED, '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 */
++		/* Add modes for ban and invite lists */
+ 		ModeManager::AddChannelMode(new ChannelModeList(CMODE_BAN, 'b'));
+ 		ModeManager::AddChannelMode(new ChannelModeList(CMODE_INVITEOVERRIDE, 'I'));
+ 
+-		/* v/h/o/a/q */
++		/* Add channel user modes */
+ 		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_REGISTEREDONLY, 'R'));
+ 		ModeManager::AddChannelMode(new ChannelMode(CMODE_SECRET, 's'));
+ 		ModeManager::AddChannelMode(new ChannelMode(CMODE_TOPIC, 't'));
+ 		ModeManager::AddChannelMode(new ChannelMode(CMODE_SSL, 'z'));
+-- 
+1.7.8.3
+
blob - /dev/null
blob + f507499c9fb8a839bafd6b2590e903c806a8d2c2 (mode 644)
--- /dev/null
+++ contrib/Anope/0007-ngircd-Fix-handling-of-JOIN-commands.patch
@@ -0,0 +1,96 @@
+From 4c9300ede35310ee5642f34e5ac227bd96fc7384 Mon Sep 17 00:00:00 2001
+From: DukePyrolator <DukePyrolator@anope.org>
+Date: Sun, 4 Sep 2011 15:08:55 +0200
+Subject: [PATCH 07/16] ngircd: Fix handling of JOIN commands
+
+---
+ modules/protocol/ngircd.cpp |   60 +++++++++++++++++++++++++++++++++++++++---
+ 1 files changed, 55 insertions(+), 5 deletions(-)
+
+diff --git a/modules/protocol/ngircd.cpp b/modules/protocol/ngircd.cpp
+index 7f4186e..3024fdd 100644
+--- a/modules/protocol/ngircd.cpp
++++ b/modules/protocol/ngircd.cpp
+@@ -240,16 +240,58 @@ class ngIRCdIRCdMessage : public IRCdMessage
+ 	{
+ 		if (!params.empty())
+ 		{
++			Anope::string channel, mode;
+ 			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, "");
++				channel = params[0].substr(0, pos);
++				mode = '+' + params[0].substr(pos+1, params[0].length()) + " " + source;
+ 			}
+ 			else
+-				do_join(source, params[0], "");
++				channel = params[0];
++
++			Channel *c = findchan(channel);
++
++			if (!c)
++			{
++				c = new Channel(channel, Anope::CurTime);
++				c->SetFlag(CH_SYNCING);
++			}
++
++			User *u = finduser(source);
++
++			if (!u)
++			{
++				Log(LOG_DEBUG) << "JOIN for nonexistant user " << source << " on " << channel;
++				return false;
++			}
++
++			EventReturn MOD_RESULT;
++			FOREACH_RESULT(I_OnPreJoinChannel, OnPreJoinChannel(u, c));
++
++			/* Add the user to the channel */
++			c->JoinUser(u);
++
++			/* set the usermodes to the channel */
++			do_cmode(source, channel, mode, "");
++
++			/* 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))
++				return false;
++
++			FOREACH_MOD(I_OnJoinChannel, OnJoinChannel(u, c));
++
++			if (c->HasFlag(CH_SYNCING))
++			{
++				c->UnsetFlag(CH_SYNCING);
++				c->Sync();
++			}
+ 		}
+ 		return true;
+ 	}
+@@ -491,7 +533,15 @@ class ProtongIRCd : public Module
+ 		pmodule_ircd_message(&this->ircd_message);
+ 
+ 		this->AddModes();
++
++		ModuleManager::Attach(I_OnUserNickChange, this);
+ 	}
++
++	void OnUserNickChange(User *u, const Anope::string &)
++	{
++		u->RemoveModeInternal(ModeManager::FindUserModeByName(UMODE_REGISTERED));
++	}
++
+ };
+ 
+ MODULE_INIT(ProtongIRCd)
+-- 
+1.7.8.3
+
blob - /dev/null
blob + eb2c214d41aaccc8da27fc01782a8d96d5c1e7a5 (mode 644)
--- /dev/null
+++ contrib/Anope/0008-ngircd-Allow-setting-modes-by-clients-on-burst.patch
@@ -0,0 +1,38 @@
+From d363ebd841ea7e1db3c62730023759d69520e0d8 Mon Sep 17 00:00:00 2001
+From: Alexander Barton <alex@barton.de>
+Date: Tue, 27 Sep 2011 15:08:09 +0200
+Subject: [PATCH 08/16] ngircd: Allow setting modes by clients on burst
+
+This change is required by commit 43201ead9575a for the ngIRCd protocol
+module as well.
+---
+ modules/protocol/ngircd.cpp |    7 +++++--
+ 1 files changed, 5 insertions(+), 2 deletions(-)
+
+diff --git a/modules/protocol/ngircd.cpp b/modules/protocol/ngircd.cpp
+index 3024fdd..2774168 100644
+--- a/modules/protocol/ngircd.cpp
++++ b/modules/protocol/ngircd.cpp
+@@ -57,14 +57,17 @@ class ngIRCdProto : public IRCDProto
+ 		send_cmd(source ? source->nick : Config->ServerName, "WALLOPS :%s", buf.c_str());
+ 	}
+ 
+-	void SendJoin(User *user, Channel *c, const ChannelStatus *status)
++	void SendJoin(User *user, Channel *c, ChannelStatus *status)
+ 	{
+ 		send_cmd(user->nick, "JOIN %s", c->name.c_str());
+ 		if (status)
+ 		{
++			ChannelStatus cs = *status;
++			status->ClearFlags();
++
+ 			BotInfo *setter = findbot(user->nick);
+ 			for (unsigned i = 0; i < ModeManager::ChannelModes.size(); ++i)
+-				if (status->HasFlag(ModeManager::ChannelModes[i]->Name))
++				if (cs.HasFlag(ModeManager::ChannelModes[i]->Name))
+ 					c->SetMode(setter, ModeManager::ChannelModes[i], user->nick, false);
+ 		}
+ 	}
+-- 
+1.7.8.3
+
blob - /dev/null
blob + b6a003abec5157bd87947da71e81bd12eff4e998 (mode 644)
--- /dev/null
+++ contrib/Anope/0009-ngircd-Update-protocol-module-for-current-Anope-1.9.patch
@@ -0,0 +1,143 @@
+From e74a5303f2357f4a9915bb91038a2e326323db3c Mon Sep 17 00:00:00 2001
+From: Alexander Barton <alex@barton.de>
+Date: Fri, 25 Nov 2011 19:16:37 +0100
+Subject: [PATCH 09/16] ngircd: Update protocol module for current Anope 1.9
+ GIT
+
+This changes are rquired by:
+
+ - b14f5ea88: Fixed accidentally clearing botmodes when joins are sent
+ - cef3eb78d: Remove send_cmd and replace it with a stringstream
+ - ddc3c2f38: Added options:nonicknameownership config option
+---
+ modules/protocol/ngircd.cpp |   54 ++++++++++++++++++++++--------------------
+ 1 files changed, 28 insertions(+), 26 deletions(-)
+
+diff --git a/modules/protocol/ngircd.cpp b/modules/protocol/ngircd.cpp
+index 2774168..55cb8d7 100644
+--- a/modules/protocol/ngircd.cpp
++++ b/modules/protocol/ngircd.cpp
+@@ -54,16 +54,22 @@ class ngIRCdProto : public IRCDProto
+ 
+ 	void SendGlobopsInternal(const BotInfo *source, const Anope::string &buf)
+ 	{
+-		send_cmd(source ? source->nick : Config->ServerName, "WALLOPS :%s", buf.c_str());
++		UplinkSocket::Message(source ? source->nick : Config->ServerName) << "WALLOPS :" << buf;
+ 	}
+ 
+-	void SendJoin(User *user, Channel *c, ChannelStatus *status)
++	void SendJoin(User *user, Channel *c, const ChannelStatus *status)
+ 	{
+-		send_cmd(user->nick, "JOIN %s", c->name.c_str());
++		UplinkSocket::Message(user->nick) << "JOIN " << c->name;
+ 		if (status)
+ 		{
++			/* First save the channel status incase uc->Status == status */
+ 			ChannelStatus cs = *status;
+-			status->ClearFlags();
++			/* If the user is internally on the channel with flags, kill them so that
++			 * the stacker will allow this.
++			 */
++			UserContainer *uc = c->FindUser(user);
++			if (uc != NULL)
++				uc->Status->ClearFlags();
+ 
+ 			BotInfo *setter = findbot(user->nick);
+ 			for (unsigned i = 0; i < ModeManager::ChannelModes.size(); ++i)
+@@ -74,18 +80,18 @@ class ngIRCdProto : public IRCDProto
+ 
+ 	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());
++		UplinkSocket::Message(source ? source->nick : Config->ServerName) << "KILL " << user->nick << " :" << buf;
+ 	}
+ 
+ 	/* 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());
++		UplinkSocket::Message() << "SERVER " << server->GetName() << " " << server->GetHops() << " :" << server->GetDescription();
+ 	}
+ 
+ 	void SendConnect()
+ 	{
+-		send_cmd("", "PASS %s 0210-IRC+ Anope|%s:CLHSo P", Config->Uplinks[CurrentUplink]->password.c_str(), Anope::VersionShort().c_str());
++		UplinkSocket::Message() << "PASS " << Config->Uplinks[CurrentUplink]->password << " 0210-IRC+ Anope|" << Anope::VersionShort() << ":CLHSo P";
+ 		/* Make myself known to myself in the serverlist */
+ 		SendServer(Me);
+ 		/* finish the enhanced server handshake and register the connection */
+@@ -98,56 +104,52 @@ class ngIRCdProto : public IRCDProto
+ 		Anope::string modes = "+" + u->GetModes();
+ 		XLine x(u->nick, "Reserved for services");
+ 		ircdproto->SendSQLine(NULL, &x);
+-		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());
++		UplinkSocket::Message(Config->ServerName) << "NICK " << u->nick << " 1 " << u->GetIdent() << " " << u->host << " 1 " << modes << " :" << u->realname;
+ 	}
+ 
+ 	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());
++			UplinkSocket::Message(bi->nick) << "PART " << chan->name << " :" << buf;
+ 		else
+-			send_cmd(bi->nick, "PART %s", chan->name.c_str());
++			UplinkSocket::Message(bi->nick) << "PART " << chan->name;
+ 	}
+ 
+ 	void SendModeInternal(const BotInfo *bi, const Channel *dest, const Anope::string &buf)
+ 	{
+-Log(LOG_DEBUG) << "SendModeInternal 1";
+-		send_cmd(bi ? bi->nick : Config->ServerName, "MODE %s %s", dest->name.c_str(), buf.c_str());
++		UplinkSocket::Message(bi ? bi->nick : Config->ServerName) << "MODE " << dest->name << " " << buf;
+ 	}
+ 
+ 	void SendModeInternal(const BotInfo *bi, const User *u, const Anope::string &buf)
+ 	{
+-Log(LOG_DEBUG) << "SendModeInternal 2";
+-		send_cmd(bi ? bi->nick : Config->ServerName, "MODE %s %s", u->nick.c_str(), buf.c_str());
++		UplinkSocket::Message(bi ? bi->nick : Config->ServerName) << "MODE " << u->nick << " " << buf;
+ 	}
+ 
+ 	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());
++			UplinkSocket::Message(bi->nick) << "KICK " << chan->name << " " << user->nick << " :" << buf;
+ 		else
+-			send_cmd(bi->nick, "KICK %s %s", chan->name.c_str(), user->nick.c_str());
++			UplinkSocket::Message(bi->nick) << "KICK " << chan->name << " " << user->nick;
+ 	}
+ 
+-	void SendNoticeChanopsInternal(const BotInfo *source, const Channel *dest, const Anope::string &buf)
++	void SendChannel(Channel *c)
+ 	{
+-		send_cmd(source->nick, "NOTICE @%s :%s", dest->name.c_str(), buf.c_str());
++		Anope::string modes = c->GetModes(true, true);
++		UplinkSocket::Message(Config->ServerName) << "CHANINFO " << c->name << " +" << modes;
+ 	}
+ 
+-	/* INVITE */
+-	void SendInvite(BotInfo *source, const Anope::string &chan, const Anope::string &nick)
++	void SendTopic(BotInfo *bi, Channel *c)
+ 	{
+-		send_cmd(source->nick, "INVITE %s %s", nick.c_str(), chan.c_str());
++		UplinkSocket::Message(bi->nick) << "TOPIC " << c->name << " :" << c->topic;
+ 	}
+ 
+-	void SendChannel(Channel *c)
++	void SendLogin(User *u)
+ 	{
+-		Anope::string modes = c->GetModes(true, true);
+-		send_cmd(Config->ServerName, "CHANINFO %s +%s", c->name.c_str(), modes.c_str());
+ 	}
+-	void SendTopic(BotInfo *bi, Channel *c)
++
++	void SendLogout(User *u)
+ 	{
+-		send_cmd(bi->nick, "TOPIC %s :%s", c->name.c_str(), c->topic.c_str());
+ 	}
+ };
+ 
+-- 
+1.7.8.3
+
blob - /dev/null
blob + 42cd4a515047ce6d391db95b2ddbc09e6288fbdd (mode 644)
--- /dev/null
+++ contrib/Anope/0010-ngircd-Add-ProtongIRCd.patch
@@ -0,0 +1,57 @@
+From d2c45d7c578ec684d3b471020f631847316de196 Mon Sep 17 00:00:00 2001
+From: Alexander Barton <alex@barton.de>
+Date: Fri, 25 Nov 2011 19:17:19 +0100
+Subject: [PATCH 10/16] ngircd: Add ~ProtongIRCd()
+
+---
+ modules/protocol/ngircd.cpp |   13 ++++++++-----
+ 1 files changed, 8 insertions(+), 5 deletions(-)
+
+diff --git a/modules/protocol/ngircd.cpp b/modules/protocol/ngircd.cpp
+index 55cb8d7..5fd62db 100644
+--- a/modules/protocol/ngircd.cpp
++++ b/modules/protocol/ngircd.cpp
+@@ -302,8 +302,7 @@ class ngIRCdIRCdMessage : public IRCdMessage
+ 	}
+ };
+ 
+-/** This is here because:
+- *
++/*
+  * If we had three servers, A, B & C linked like so: A<->B<->C
+  * If Anope is linked to A and B splits from A and then reconnects
+  * B introduces itself, introduces C, sends EOS for C, introduces Bs clients
+@@ -319,8 +318,6 @@ bool event_pong(const Anope::string &source, const std::vector<Anope::string> &p
+ 	return true;
+ }
+ 
+-
+-
+ /*
+  * CHANINFO <chan> +<modes>
+  * CHANINFO <chan> +<modes> :<topic>
+@@ -480,7 +477,6 @@ bool event_376(const Anope::string &source, const std::vector<Anope::string> &pa
+ 	return true;
+ }
+ 
+-
+ class ProtongIRCd : public Module
+ {
+ 	Message message_kick, message_pass, message_njoin, message_chaninfo, message_005,
+@@ -542,6 +538,13 @@ class ProtongIRCd : public Module
+ 		ModuleManager::Attach(I_OnUserNickChange, this);
+ 	}
+ 
++        ~ProtongIRCd()
++        {
++                pmodule_ircd_var(NULL);
++                pmodule_ircd_proto(NULL);
++                pmodule_ircd_message(NULL);
++        }
++
+ 	void OnUserNickChange(User *u, const Anope::string &)
+ 	{
+ 		u->RemoveModeInternal(ModeManager::FindUserModeByName(UMODE_REGISTERED));
+-- 
+1.7.8.3
+
blob - /dev/null
blob + bbf2b633c55ade60b67395b017872f71bc00e34f (mode 644)
--- /dev/null
+++ contrib/Anope/0011-ngircd-Update-protocol-module-for-current-Anope-1.9.patch
@@ -0,0 +1,29 @@
+From 4dc5a3d3e2fbb218461d9459bff1c0a392a75881 Mon Sep 17 00:00:00 2001
+From: Alexander Barton <alex@barton.de>
+Date: Sat, 31 Dec 2011 16:12:52 +0100
+Subject: [PATCH 11/16] ngircd: Update protocol module for current Anope 1.9
+ GIT
+
+This changes are rquired by:
+
+ - 150831c1a: Made capab management a bit simplier
+---
+ modules/protocol/ngircd.cpp |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+diff --git a/modules/protocol/ngircd.cpp b/modules/protocol/ngircd.cpp
+index 5fd62db..9c26ec8 100644
+--- a/modules/protocol/ngircd.cpp
++++ b/modules/protocol/ngircd.cpp
+@@ -527,7 +527,7 @@ class ProtongIRCd : public Module
+ 	{
+ 		this->SetAuthor("Anope");
+ 
+-		Capab.SetFlag(CAPAB_QS);
++		Capab.insert("QS");
+ 
+ 		pmodule_ircd_var(myIrcd);
+ 		pmodule_ircd_proto(&this->ircd_proto);
+-- 
+1.7.8.3
+
blob - /dev/null
blob + 2127c269fb7af0351d149078ccdb23d098c4bd5f (mode 644)
--- /dev/null
+++ contrib/Anope/0012-ngircd-Channel-mode-r-is-supported-now.patch
@@ -0,0 +1,25 @@
+From 99c18cafdee28bfb17fad5f0526b3ed5d1f5f312 Mon Sep 17 00:00:00 2001
+From: Alexander Barton <alex@barton.de>
+Date: Sat, 31 Dec 2011 16:17:50 +0100
+Subject: [PATCH 12/16] ngircd: let Anope know that channel mode "r" is
+ supported
+
+---
+ modules/protocol/ngircd.cpp |    1 +
+ 1 files changed, 1 insertions(+), 0 deletions(-)
+
+diff --git a/modules/protocol/ngircd.cpp b/modules/protocol/ngircd.cpp
+index 9c26ec8..6155667 100644
+--- a/modules/protocol/ngircd.cpp
++++ b/modules/protocol/ngircd.cpp
+@@ -512,6 +512,7 @@ class ProtongIRCd : public Module
+ 		ModeManager::AddChannelMode(new ChannelMode(CMODE_MODERATED, 'm'));
+ 		ModeManager::AddChannelMode(new ChannelMode(CMODE_NOEXTERNAL, 'n'));
+ 		ModeManager::AddChannelMode(new ChannelMode(CMODE_PERM, 'P'));
++		ModeManager::AddChannelMode(new ChannelModeRegistered('r'));
+ 		ModeManager::AddChannelMode(new ChannelMode(CMODE_REGISTEREDONLY, 'R'));
+ 		ModeManager::AddChannelMode(new ChannelMode(CMODE_SECRET, 's'));
+ 		ModeManager::AddChannelMode(new ChannelMode(CMODE_TOPIC, 't'));
+-- 
+1.7.8.3
+
blob - /dev/null
blob + 759076d487ba599316da3df64675306a5656f6e9 (mode 644)
--- /dev/null
+++ contrib/Anope/0013-ngircd-Update-copyright-notice.patch
@@ -0,0 +1,28 @@
+From 5a19b69f0daceb5b12ec751bc919519a7f712f2d Mon Sep 17 00:00:00 2001
+From: Alexander Barton <alex@barton.de>
+Date: Sun, 15 Jan 2012 13:36:14 +0100
+Subject: [PATCH 13/16] ngircd: Update copyright notice
+
+---
+ modules/protocol/ngircd.cpp |    7 ++++---
+ 1 files changed, 4 insertions(+), 3 deletions(-)
+
+diff --git a/modules/protocol/ngircd.cpp b/modules/protocol/ngircd.cpp
+index 6155667..024c61d 100644
+--- a/modules/protocol/ngircd.cpp
++++ b/modules/protocol/ngircd.cpp
+@@ -1,7 +1,8 @@
+-/* ngIRCd IRCD functions
++/*
++ * ngIRCd Protocol module for Anope IRC Services
+  *
+- * (C) 2003-2011 Anope Team
+- * Contact us at team@anope.org
++ * (C) 2011-2012 Alexander Barton <alex@barton.de>
++ * (C) 2011 Anope Team <team@anope.org>
+  *
+  * Please read COPYING and README for further details.
+  *
+-- 
+1.7.8.3
+
blob - /dev/null
blob + c02ac6e8fd2ed3078ef690e06637292a6b6acc65 (mode 644)
--- /dev/null
+++ contrib/Anope/0014-ngircd-set-unset-GLINE-s-on-AKILL-commands.patch
@@ -0,0 +1,35 @@
+From acc24a7f4488f6ef0fb240a76766db4220b62d53 Mon Sep 17 00:00:00 2001
+From: Alexander Barton <alex@barton.de>
+Date: Sun, 22 Jan 2012 19:05:28 +0100
+Subject: [PATCH 14/16] ngircd: set/unset GLINE's on AKILL commands
+
+---
+ modules/protocol/ngircd.cpp |   10 ++++++++--
+ 1 files changed, 8 insertions(+), 2 deletions(-)
+
+diff --git a/modules/protocol/ngircd.cpp b/modules/protocol/ngircd.cpp
+index 024c61d..3bc3812 100644
+--- a/modules/protocol/ngircd.cpp
++++ b/modules/protocol/ngircd.cpp
+@@ -48,10 +48,16 @@ class ngIRCdProto : public IRCDProto
+ {
+ 	void SendAkill(User *u, const XLine *x)
+ 	{
+-		// TODO: ADD SOME CODE
++		// Calculate the time left before this would expire, capping it at 2 days
++		time_t timeleft = x->Expires - Anope::CurTime;
++		if (timeleft > 172800 || !x->Expires)
++			timeleft = 172800;
++		UplinkSocket::Message(Config->ServerName) << "GLINE " << x->Mask << " " << timeleft << " :" << x->Reason << " (" << x->By << ")";
+ 	}
+ 
+-	void SendAkillDel(const XLine*) { }
++	void SendAkillDel(const XLine *x) {
++		UplinkSocket::Message(Config->ServerName) << "GLINE " << x->Mask;
++	}
+ 
+ 	void SendGlobopsInternal(const BotInfo *source, const Anope::string &buf)
+ 	{
+-- 
+1.7.8.3
+
blob - /dev/null
blob + 7a25c9a9f025fee2c1edca13e126b1884380a459 (mode 644)
--- /dev/null
+++ contrib/Anope/0015-ngircd-ngIRCd-supports-channel-mode-e-now.patch
@@ -0,0 +1,27 @@
+From 3a61b190db79848d4519296432ebb2ab714c42b7 Mon Sep 17 00:00:00 2001
+From: Alexander Barton <alex@barton.de>
+Date: Sun, 22 Jan 2012 19:06:34 +0100
+Subject: [PATCH 15/16] ngircd: ngIRCd supports channel mode 'e' now
+
+---
+ modules/protocol/ngircd.cpp |    3 ++-
+ 1 files changed, 2 insertions(+), 1 deletions(-)
+
+diff --git a/modules/protocol/ngircd.cpp b/modules/protocol/ngircd.cpp
+index 3bc3812..0f87cbd 100644
+--- a/modules/protocol/ngircd.cpp
++++ b/modules/protocol/ngircd.cpp
+@@ -504,8 +504,9 @@ class ProtongIRCd : public Module
+ 		ModeManager::AddUserMode(new UserMode(UMODE_WALLOPS, 'w'));
+ 		ModeManager::AddUserMode(new UserMode(UMODE_CLOAK, 'x'));
+ 
+-		/* Add modes for ban and invite lists */
++		/* Add modes for ban, exception, and invite lists */
+ 		ModeManager::AddChannelMode(new ChannelModeList(CMODE_BAN, 'b'));
++		ModeManager::AddChannelMode(new ChannelModeList(CMODE_EXCEPT, 'e'));
+ 		ModeManager::AddChannelMode(new ChannelModeList(CMODE_INVITEOVERRIDE, 'I'));
+ 
+ 		/* Add channel user modes */
+-- 
+1.7.8.3
+
blob - /dev/null
blob + a3346a4a8841a6f820bfc56a39121aa3f3b13fa1 (mode 644)
--- /dev/null
+++ contrib/Anope/0016-ngircd-support-SQUERY-command.patch
@@ -0,0 +1,35 @@
+From a7c48fcf47af757cf1b4eeaa6bcc96f4ae1f7410 Mon Sep 17 00:00:00 2001
+From: Alexander Barton <alex@barton.de>
+Date: Sat, 4 Feb 2012 11:13:36 +0100
+Subject: [PATCH 16/16] ngircd: support SQUERY command
+
+Thanks to DukePyrolator for explaining these changes to me.
+---
+ modules/protocol/ngircd.cpp |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/modules/protocol/ngircd.cpp b/modules/protocol/ngircd.cpp
+index 0f87cbd..530686e 100644
+--- a/modules/protocol/ngircd.cpp
++++ b/modules/protocol/ngircd.cpp
+@@ -487,7 +487,7 @@ 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_442, message_376, message_pong;
++		message_442, message_376, message_pong, message_squery;
+ 
+ 	ngIRCdProto ircd_proto;
+ 	ngIRCdIRCdMessage ircd_message;
+@@ -532,7 +532,7 @@ class ProtongIRCd : public Module
+ 		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),
+-		message_pong("PONG", event_pong)
++		message_pong("PONG", event_pong), message_squery("SQUERY", ::OnPrivmsg)
+ 	{
+ 		this->SetAuthor("Anope");
+ 
+-- 
+1.7.8.3
+