123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- 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
|