From 4c9300ede35310ee5642f34e5ac227bd96fc7384 Mon Sep 17 00:00:00 2001 From: DukePyrolator 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