diff --git a/src/IRCSock.cpp b/src/IRCSock.cpp index 4c4ab4e9..94250be5 100644 --- a/src/IRCSock.cpp +++ b/src/IRCSock.cpp @@ -536,8 +536,6 @@ bool CIRCSock::OnChgHostMessage(CChgHostMessage& Message) { } } - if (!bNeedEmulate) return true; - CNick NewNick = Message.GetNick(); NewNick.SetIdent(Message.GetNewIdent()); NewNick.SetHost(Message.GetNewHost()); @@ -548,6 +546,9 @@ bool CIRCSock::OnChgHostMessage(CChgHostMessage& Message) { pNick->SetHost(Message.GetNewHost()); } + if (!bNeedEmulate) continue; + if (pChan->IsDetached()) continue; + CTargetMessage ModeMsg; ModeMsg.SetNick(CNick(":irc.znc.in")); ModeMsg.SetTags(Message.GetTags()); diff --git a/test/integration/tests/core.cpp b/test/integration/tests/core.cpp index 2b455cd9..d9364924 100644 --- a/test/integration/tests/core.cpp +++ b/test/integration/tests/core.cpp @@ -775,6 +775,15 @@ TEST_F(ZNCTest, ChgHostEmulation) { client1.ReadUntil("MODE"); ircd.Write(":user!ident-2@host-2 CHGHOST ident-3 host-3"); client1.ReadUntil(":irc.znc.in MODE #chan +ov user user"); + + // Only attached channel should receive emulation + ircd.Write(":user!ident-3@host-3 JOIN #chan2"); + client1.ReadUntil("JOIN #chan2"); + client1.Write("DETACH #chan2"); + client1.ReadUntil("Detached 1 channel"); + ircd.Write(":user!ident-3@host-3 CHGHOST ident host"); + ASSERT_THAT(client1.ReadRemainder().toStdString(), + Not(HasSubstr("#chan2"))); } TEST_F(ZNCTest, ChgHostOnce) {