Add preliminary ngIRCd protocol module for Anope 1.9
authorAlexander Barton <alex@barton.de>
Sun, 10 Jul 2011 12:20:48 +0000 (14:20 +0200)
committerAlexander Barton <alex@barton.de>
Sun, 10 Jul 2011 12:23:11 +0000 (14:23 +0200)
See contrib/Anope/README and doc/Services.txt for more details
and installation instructions!

configure.in
contrib/Anope/0001-Revert-Removed-ngircd.patch [new file with mode: 0644]
contrib/Anope/0002-ngircd-whitespace-fixes.patch [new file with mode: 0644]
contrib/Anope/Makefile.am [new file with mode: 0644]
contrib/Anope/README [new file with mode: 0644]
contrib/Makefile.am
contrib/README
doc/Services.txt

index 5e334963975a660c92d95c7790054614aa5e9049..e48e9e394148514e94c8978e3c796849f8153c9f 100644 (file)
@@ -1,6 +1,6 @@
 #
 # ngIRCd -- The Next Generation IRC Daemon
 #
 # 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
 #
 # 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 \
        src/testsuite/Makefile \
        man/Makefile \
        contrib/Makefile \
+       contrib/Anope/Makefile \
        contrib/Debian/Makefile \
        contrib/MacOSX/Makefile \
        contrib/MacOSX/ngIRCd.xcodeproj/Makefile \
        contrib/Debian/Makefile \
        contrib/MacOSX/Makefile \
        contrib/MacOSX/ngIRCd.xcodeproj/Makefile \
diff --git a/contrib/Anope/0001-Revert-Removed-ngircd.patch b/contrib/Anope/0001-Revert-Removed-ngircd.patch
new file mode 100644 (file)
index 0000000..efed0ad
--- /dev/null
@@ -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
+
diff --git a/contrib/Anope/0002-ngircd-whitespace-fixes.patch b/contrib/Anope/0002-ngircd-whitespace-fixes.patch
new file mode 100644 (file)
index 0000000..60356a8
--- /dev/null
@@ -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
+
diff --git a/contrib/Anope/Makefile.am b/contrib/Anope/Makefile.am
new file mode 100644 (file)
index 0000000..7670384
--- /dev/null
@@ -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-
diff --git a/contrib/Anope/README b/contrib/Anope/README
new file mode 100644 (file)
index 0000000..ea47b06
--- /dev/null
@@ -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.
index b9da38e6b47b1cf8c4ff5b129b3c65a250c3154d..36ba245806f7cbd688a44d29a4a3e708df47ee62 100644 (file)
@@ -1,6 +1,6 @@
 #
 # ngIRCd -- The Next Generation IRC Daemon
 #
 # 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
 #
 # 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.
 #
 
 # 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
 
 EXTRA_DIST = README ngircd.spec systrace.policy ngindent ngircd-bsd.sh \
        ngIRCd-Logo.gif ngircd-redhat.init platformtest.sh
index 6593fdd2edc4f6d18b02bf637fb106755c3ea8b8..6097baeaeedf1793475df42cc2200ec3b3fabf22 100644 (file)
@@ -1,15 +1,17 @@
 
                      ngIRCd - Next Generation IRC Server
 
                      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 --
 
 
                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").
 
 Debian/
  - Various files for building Debian GNU/Linux packages (".deb's").
 
index 67053b16a93155e5315ca03e19fef9c709fd4f7a..c2059b246a69a0009df69a710e1fcde3cb4e3443 100644 (file)
@@ -1,9 +1,8 @@
 
                      ngIRCd - Next Generation IRC Server
 
                      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.
 
                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.
 
 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
 
 
 Setting up ngIRCd
@@ -36,6 +37,31 @@ Example:
      ServiceMask = *Serv
 
 
      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
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 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/>
 
 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!
 Please let us know if you are successfully using other IRC service packages or
 which problems you encounter, thanks!