diff --git a/modules/modperl/functions.in b/modules/modperl/functions.in index 4efb3e8a..87d4c867 100644 --- a/modules/modperl/functions.in +++ b/modules/modperl/functions.in @@ -63,6 +63,8 @@ EModRet OnTopic(CNick& Nick, CChan& Channel, CString& sTopic) bool OnServerCapAvailable(const CString& sCap) bool OnServerCap302Available(const CString& sCap, const CString& sValue) void OnServerCapResult(const CString& sCap, bool bSuccess) +void OnClientAttached() +void OnClientDetached() EModRet OnTimerAutoJoin(CChan& Channel) bool OnEmbeddedWebRequest(CWebSock& WebSock, const CString& sPageName, CTemplate& Tmpl) EModRet OnAddNetwork(CIRCNetwork& Network, CString& sErrorRet) diff --git a/modules/modperl/module.h b/modules/modperl/module.h index 673f5158..71a6469e 100644 --- a/modules/modperl/module.h +++ b/modules/modperl/module.h @@ -118,6 +118,8 @@ class ZNC_EXPORT_LIB_EXPORT CPerlModule : public CModule { bool OnServerCapAvailable(const CString& sCap) override; bool OnServerCap302Available(const CString& sCap, const CString& sValue) override; void OnServerCapResult(const CString& sCap, bool bSuccess) override; + void OnClientAttached() override; + void OnClientDetached() override; EModRet OnTimerAutoJoin(CChan& Channel) override; bool OnEmbeddedWebRequest(CWebSock&, const CString&, CTemplate&) override; EModRet OnAddNetwork(CIRCNetwork& Network, CString& sErrorRet) override; diff --git a/modules/modperl/startup.pl b/modules/modperl/startup.pl index d86bdf74..e32cbe50 100644 --- a/modules/modperl/startup.pl +++ b/modules/modperl/startup.pl @@ -406,6 +406,8 @@ sub OnChanNotice {} sub OnTopic {} sub OnServerCapAvailable {} sub OnServerCap302Available { my ($self, $cap, $value) = @_; $self->OnServerCapAvailable($cap) } +sub OnClientAttached {} +sub OnClientDetached {} sub OnServerCapResult {} sub OnTimerAutoJoin {} sub OnEmbeddedWebRequest {} diff --git a/modules/modpython/functions.in b/modules/modpython/functions.in index 142522d7..e66ce0db 100644 --- a/modules/modpython/functions.in +++ b/modules/modpython/functions.in @@ -63,6 +63,8 @@ EModRet OnTopic(CNick& Nick, CChan& Channel, CString& sTopic) bool OnServerCapAvailable(const CString& sCap) bool OnServerCap302Available(const CString& sCap, const CString& sValue) void OnServerCapResult(const CString& sCap, bool bSuccess) +void OnClientAttached() +void OnClientDetached() EModRet OnTimerAutoJoin(CChan& Channel) bool OnEmbeddedWebRequest(CWebSock& WebSock, const CString& sPageName, CTemplate& Tmpl) EModRet OnAddNetwork(CIRCNetwork& Network, CString& sErrorRet) diff --git a/modules/modpython/module.h b/modules/modpython/module.h index b96e09b2..8d688787 100644 --- a/modules/modpython/module.h +++ b/modules/modpython/module.h @@ -138,6 +138,8 @@ class ZNC_EXPORT_LIB_EXPORT CPyModule : public CModule { bool OnServerCapAvailable(const CString& sCap) override; bool OnServerCap302Available(const CString& sCap, const CString& sValue) override; void OnServerCapResult(const CString& sCap, bool bSuccess) override; + void OnClientAttached() override; + void OnClientDetached() override; EModRet OnTimerAutoJoin(CChan& Channel) override; bool OnEmbeddedWebRequest(CWebSock&, const CString&, CTemplate&) override; EModRet OnAddNetwork(CIRCNetwork& Network, CString& sErrorRet) override; diff --git a/modules/modpython/znc.py b/modules/modpython/znc.py index 03a47204..ce4f2743 100644 --- a/modules/modpython/znc.py +++ b/modules/modpython/znc.py @@ -413,6 +413,12 @@ class Module: def OnServerCap302Available(self, sCap, sValue): return self.OnServerCapAvailable(sCap) + def OnClientAttached(self): + pass + + def OnClientDetached(self): + pass + def OnServerCapResult(self, sCap, bSuccess): pass diff --git a/test/ClientTest.cpp b/test/ClientTest.cpp index eea656c4..0ff6370a 100644 --- a/test/ClientTest.cpp +++ b/test/ClientTest.cpp @@ -172,22 +172,6 @@ TEST_F(ClientTest, UserhostInNames) { // aka UHNAMES ElementsAre(msg.ToString(), extmsg.ToString())); } -TEST_F(ClientTest, ExtendedJoin) { - m_pTestSock->ReadLine(":server CAP * ACK :extended-join"); - m_pTestClient->Reset(); - - CMessage msg(":nick!user@host JOIN #channel"); - CMessage extmsg(":nick!user@host JOIN #channel account :Real Name"); - EXPECT_FALSE(m_pTestClient->HasExtendedJoin()); - m_pTestClient->PutClient(extmsg); - EXPECT_THAT(m_pTestClient->vsLines, ElementsAre(msg.ToString())); - m_pTestClient->SetExtendedJoin(true); - EXPECT_TRUE(m_pTestClient->HasExtendedJoin()); - m_pTestClient->PutClient(extmsg); - EXPECT_THAT(m_pTestClient->vsLines, - ElementsAre(msg.ToString(), extmsg.ToString())); -} - TEST_F(ClientTest, StatusMsg) { m_pTestSock->ReadLine( ":irc.znc.in 001 me :Welcome to the Internet Relay Network me"); diff --git a/test/integration/tests/core.cpp b/test/integration/tests/core.cpp index b82abda0..2160bfa6 100644 --- a/test/integration/tests/core.cpp +++ b/test/integration/tests/core.cpp @@ -271,6 +271,26 @@ TEST_F(ZNCTest, AwayNotify) { client.Write("znc shutdown"); } +TEST_F(ZNCTest, ExtendedJoin) { + auto znc = Run(); + auto ircd = ConnectIRCd(); + auto client = LoginClient(); + ircd.Write(":server 001 user :welcome"); + client.ReadUntil(" 001 "); + ircd.Write(":nick!user@host JOIN #channel account :Real Name"); + // Not sure why it is like this when server sends such format unexpectedly. + client.ReadUntil("JOIN #channel account :Real Name"); + ircd.Write("CAP nick ACK extended-join"); + ircd.Write(":nick!user@host JOIN #channel2 account :Real Name"); + QByteArray line; + client.ReadUntilAndGet("JOIN", line); + EXPECT_EQ(line.toStdString(), "JOIN #channel2"); + client.Write("CAP REQ extended-join"); + client.ReadUntil("CAP user ACK :extended-join"); + ircd.Write(":nick!user@host JOIN #channel3 account :Real Name"); + client.ReadUntil("JOIN #channel3 account :Real Name"); +} + TEST_F(ZNCTest, CAP302LSWaitFull) { auto znc = Run(); auto ircd = ConnectIRCd();