]> arthur.barton.de Git - ngircd-alex.git/blobdiff - contrib/Anope/0007-ngircd-Fix-handling-of-JOIN-commands.patch
Update preliminary ngIRCd protocol module for Anope 1.9.6
[ngircd-alex.git] / contrib / Anope / 0007-ngircd-Fix-handling-of-JOIN-commands.patch
diff --git a/contrib/Anope/0007-ngircd-Fix-handling-of-JOIN-commands.patch b/contrib/Anope/0007-ngircd-Fix-handling-of-JOIN-commands.patch
new file mode 100644 (file)
index 0000000..f507499
--- /dev/null
@@ -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
+