From cec9741003e7250ee43fd02209bd0849b0a013f2 Mon Sep 17 00:00:00 2001 From: RealKindOne Date: Sun, 23 Aug 2026 15:28:49 -0400 Subject: [PATCH] flooddetach: Modernize and add test. --- modules/flooddetach.cpp | 36 ++++++++++------ test/integration/tests/modules.cpp | 66 ++++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+), 13 deletions(-) diff --git a/modules/flooddetach.cpp b/modules/flooddetach.cpp index 8c761972..6f923638 100644 --- a/modules/flooddetach.cpp +++ b/modules/flooddetach.cpp @@ -152,31 +152,41 @@ class CFloodDetachMod : public CModule { } } - EModRet OnChanMsg(CNick& Nick, CChan& Channel, CString& sMessage) override { - Message(Channel); + EModRet OnChanTextMessage(CTextMessage& TextMessage) override { + CChan* pChan = TextMessage.GetChan(); + if (pChan) { + Message(*pChan); + } return CONTINUE; } - // This also catches OnChanAction() - EModRet OnChanCTCP(CNick& Nick, CChan& Channel, - CString& sMessage) override { - Message(Channel); + // This also catches OnChanActionMessage() + EModRet OnChanCTCPMessage(CCTCPMessage& TextMessage) override { + CChan* pChan = TextMessage.GetChan(); + if (pChan) { + Message(*pChan); + } return CONTINUE; } - EModRet OnChanNotice(CNick& Nick, CChan& Channel, - CString& sMessage) override { - Message(Channel); + EModRet OnChanNoticeMessage(CNoticeMessage& TextMessage) override { + CChan* pChan = TextMessage.GetChan(); + if (pChan) { + Message(*pChan); + } return CONTINUE; } - EModRet OnTopic(CNick& Nick, CChan& Channel, CString& sTopic) override { - Message(Channel); + EModRet OnTopicMessage(CTopicMessage& TextMessage) override { + CChan* pChan = TextMessage.GetChan(); + if (pChan) { + Message(*pChan); + } return CONTINUE; } - void OnNick(const CNick& Nick, const CString& sNewNick, - const std::vector& vChans) override { + void OnNickMessage(CNickMessage& NickMessage, + const std::vector& vChans) override { for (CChan* pChan : vChans) { Message(*pChan); } diff --git a/test/integration/tests/modules.cpp b/test/integration/tests/modules.cpp index 0c6e15d9..5a71682b 100644 --- a/test/integration/tests/modules.cpp +++ b/test/integration/tests/modules.cpp @@ -820,5 +820,71 @@ TEST_F(ZNCTest, CtcpFloodModule) { client.ReadUntil("Limit reached by"); } +TEST_F(ZNCTest, FloodDetachModule) { + auto znc = Run(); + auto ircd = ConnectIRCd(); + auto client = LoginClient(); + + client.Write("znc loadmod flooddetach"); + client.ReadUntil("Loaded module"); + ircd.Write(":server 001 nick :Hello"); + + auto JoinChan = [&](const QString& sChan) { + ircd.Write((":nick JOIN :" + sChan).toUtf8()); + ircd.Write((":server 353 nick = " + sChan + " :nick someone").toUtf8()); + ircd.Write( + (":server 366 nick " + sChan + " :End of /NAMES list").toUtf8()); + client.ReadUntil("End of /NAMES"); + }; + // Just use 10 for everything. + + // OnChanMessage + JoinChan("#test-privmsg"); + for (int i = 1; i <= 10; i++) { + ircd.Write((":someone!user@host PRIVMSG #test-privmsg :message" + + QString::number(i)) + .toUtf8()); + } + client.ReadUntil("Channel #test-privmsg was flooded"); + + // OnNickMessage + JoinChan("#test-nick"); + QString sNick = "someone"; + for (int i = 1; i <= 10; i++) { + QString sNewNick = "someone" + QString::number(i + 1); + ircd.Write((":" + sNick + "!user@host NICK " + sNewNick).toUtf8()); + sNick = sNewNick; + } + client.ReadUntil("Channel #test-nick was flooded"); + + // OnTopicMessage + JoinChan("#test-topic"); + for (int i = 1; i <= 10; i++) { + ircd.Write( + (":someone!user@host TOPIC #test-topic :TOPIC" + QString::number(i)) + .toUtf8()); + } + client.ReadUntil("Channel #test-topic was flooded"); + + // OnNoticeMessage + JoinChan("#test-notice"); + for (int i = 1; i <= 10; i++) { + ircd.Write((":someone!user@host NOTICE #test-notice :notice" + + QString::number(i)) + .toUtf8()); + } + client.ReadUntil("Channel #test-notice was flooded"); + + // OnChanActionMessage / OnChanCTCPMessage + JoinChan("#test-ctcp"); + for (int i = 1; i <= 10; i++) { + ircd.Write((":someone!user@host PRIVMSG #test-ctcp :\001" + "ACTION action" + + QString::number(i) + "\001") + .toUtf8()); + } + client.ReadUntil("Channel #test-ctcp was flooded"); +} + } // namespace } // namespace znc_inttest