From 55385a5d584c0c9c8d3d3c3b528d3cf2570f985e Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Sun, 16 Aug 2015 17:57:32 +0200 Subject: [PATCH] Add CTargetMessage: a base class for "targeted" priv/chan messages This will be useful for implementing the upcoming OnUserXxxMessage() module hooks, that are allowed to modify the message target. --- include/znc/Message.h | 23 ++++++++++----- test/MessageTest.cpp | 68 +++++++++++++++++++++++++++++++------------ 2 files changed, 65 insertions(+), 26 deletions(-) diff --git a/include/znc/Message.h b/include/znc/Message.h index df9272c1..3ed2522f 100644 --- a/include/znc/Message.h +++ b/include/znc/Message.h @@ -87,19 +87,25 @@ private: CChan* m_pChan = nullptr; }; -class CActionMessage : public CMessage { +class CTargetMessage : public CMessage { +public: + CString GetTarget() const { return GetParam(0); } + void SetTarget(const CString& sTarget) { SetParam(0, sTarget); } +}; + +class CActionMessage : public CTargetMessage { public: CString GetText() const { return GetParam(1).TrimPrefix_n("\001ACTION ").TrimSuffix_n("\001"); } void SetText(const CString& sText) { SetParam(1, "\001ACTION " + sText + "\001"); } }; -class CCTCPMessage : public CMessage { +class CCTCPMessage : public CTargetMessage { public: CString GetText() const { return GetParam(1).TrimPrefix_n("\001").TrimSuffix_n("\001"); } void SetText(const CString& sText) { SetParam(1, "\001" + sText + "\001"); } }; -class CJoinMessage : public CMessage { +class CJoinMessage : public CTargetMessage { public: }; @@ -110,13 +116,13 @@ public: void SetNewNick(const CString& sNick) { SetParam(0, sNick); } }; -class CNoticeMessage : public CMessage { +class CNoticeMessage : public CTargetMessage { public: CString GetText() const { return GetParam(1); } void SetText(const CString& sText) { SetParam(1, sText); } }; -class CKickMessage : public CMessage { +class CKickMessage : public CTargetMessage { public: CString GetKickedNick() const { return GetParam(1); } void SetKickedNick(const CString& sNick) { SetParam(1, sNick); } @@ -124,7 +130,7 @@ public: void SetReason(const CString& sReason) { SetParam(2, sReason); } }; -class CPartMessage : public CMessage { +class CPartMessage : public CTargetMessage { public: CString GetReason() const { return GetParam(1); } void SetReason(const CString& sReason) { SetParam(1, sReason); } @@ -136,13 +142,13 @@ public: void SetReason(const CString& sReason) { SetParam(0, sReason); } }; -class CTextMessage : public CMessage { +class CTextMessage : public CTargetMessage { public: CString GetText() const { return GetParam(1); } void SetText(const CString& sText) { SetParam(1, sText); } }; -class CTopicMessage : public CMessage { +class CTopicMessage : public CTargetMessage { public: CString GetTopic() const { return GetParam(1); } void SetTopic(const CString& sTopic) { SetParam(1, sTopic); } @@ -159,6 +165,7 @@ static_assert(sizeof(CPartMessage) == sizeof(CMessage), "No data members allowed static_assert(sizeof(CNickMessage) == sizeof(CMessage), "No data members allowed in CMessage subclasses."); static_assert(sizeof(CKickMessage) == sizeof(CMessage), "No data members allowed in CMessage subclasses."); static_assert(sizeof(CQuitMessage) == sizeof(CMessage), "No data members allowed in CMessage subclasses."); +static_assert(sizeof(CTargetMessage) == sizeof(CMessage), "No data members allowed in CMessage subclasses."); static_assert(sizeof(CTextMessage) == sizeof(CMessage), "No data members allowed in CMessage subclasses."); static_assert(sizeof(CTopicMessage) == sizeof(CMessage), "No data members allowed in CMessage subclasses."); diff --git a/test/MessageTest.cpp b/test/MessageTest.cpp index ee7f648b..1983aeab 100644 --- a/test/MessageTest.cpp +++ b/test/MessageTest.cpp @@ -72,11 +72,14 @@ TEST(MessageTest, ChanAction) { CActionMessage& chan = static_cast(msg); EXPECT_EQ("sender", chan.GetNick().GetNick()); EXPECT_EQ("PRIVMSG", chan.GetCommand()); + EXPECT_EQ("#chan", chan.GetTarget()); EXPECT_EQ("ACTS", chan.GetText()); + chan.SetTarget("#znc"); + EXPECT_EQ("#znc", chan.GetTarget()); chan.SetText("foo bar"); EXPECT_EQ("foo bar", chan.GetText()); - EXPECT_EQ(":sender PRIVMSG #chan :\001ACTION foo bar\001", chan.ToString()); + EXPECT_EQ(":sender PRIVMSG #znc :\001ACTION foo bar\001", chan.ToString()); } TEST(MessageTest, ChanCTCP) { @@ -84,23 +87,29 @@ TEST(MessageTest, ChanCTCP) { CCTCPMessage& chan = static_cast(msg); EXPECT_EQ("sender", chan.GetNick().GetNick()); EXPECT_EQ("PRIVMSG", chan.GetCommand()); + EXPECT_EQ("#chan", chan.GetTarget()); EXPECT_EQ("text", chan.GetText()); + chan.SetTarget("#znc"); + EXPECT_EQ("#znc", chan.GetTarget()); chan.SetText("foo bar"); EXPECT_EQ("foo bar", chan.GetText()); - EXPECT_EQ(":sender PRIVMSG #chan :\001foo bar\001", chan.ToString()); + EXPECT_EQ(":sender PRIVMSG #znc :\001foo bar\001", chan.ToString()); } TEST(MessageTest, ChanMsg) { CMessage msg(":sender PRIVMSG #chan :text"); - CTextMessage& priv = static_cast(msg); - EXPECT_EQ("sender", priv.GetNick().GetNick()); - EXPECT_EQ("PRIVMSG", priv.GetCommand()); - EXPECT_EQ("text", priv.GetText()); + CTextMessage& chan = static_cast(msg); + EXPECT_EQ("sender", chan.GetNick().GetNick()); + EXPECT_EQ("PRIVMSG", chan.GetCommand()); + EXPECT_EQ("#chan", chan.GetTarget()); + EXPECT_EQ("text", chan.GetText()); - priv.SetText("foo bar"); - EXPECT_EQ("foo bar", priv.GetText()); - EXPECT_EQ(":sender PRIVMSG #chan :foo bar", priv.ToString()); + chan.SetTarget("#znc"); + EXPECT_EQ("#znc", chan.GetTarget()); + chan.SetText("foo bar"); + EXPECT_EQ("foo bar", chan.GetText()); + EXPECT_EQ(":sender PRIVMSG #znc :foo bar", chan.ToString()); } TEST(MessageTest, Kick) { @@ -108,21 +117,29 @@ TEST(MessageTest, Kick) { CKickMessage& kick = static_cast(msg); EXPECT_EQ("nick", kick.GetNick().GetNick()); EXPECT_EQ("KICK", kick.GetCommand()); + EXPECT_EQ("#chan", kick.GetTarget()); EXPECT_EQ("person", kick.GetKickedNick()); EXPECT_EQ("reason", kick.GetReason()); + kick.SetTarget("#znc"); + EXPECT_EQ("#znc", kick.GetTarget()); kick.SetKickedNick("noone"); EXPECT_EQ("noone", kick.GetKickedNick()); kick.SetReason("test"); EXPECT_EQ("test", kick.GetReason()); - EXPECT_EQ(":nick KICK #chan noone test", kick.ToString()); + EXPECT_EQ(":nick KICK #znc noone test", kick.ToString()); } TEST(MessageTest, Join) { CMessage msg(":nick JOIN #chan"); - EXPECT_EQ("nick", msg.GetNick().GetNick()); - EXPECT_EQ("JOIN", msg.GetCommand()); - EXPECT_EQ("#chan", msg.GetParam(0)); + CJoinMessage& join = static_cast(msg); + EXPECT_EQ("nick", join.GetNick().GetNick()); + EXPECT_EQ("JOIN", join.GetCommand()); + EXPECT_EQ("#chan", join.GetTarget()); + + join.SetTarget("#znc"); + EXPECT_EQ("#znc", join.GetTarget()); + EXPECT_EQ(":nick JOIN #znc", join.ToString()); } TEST(MessageTest, Nick) { @@ -143,11 +160,14 @@ TEST(MessageTest, Part) { CPartMessage& part = static_cast(msg); EXPECT_EQ("nick", part.GetNick().GetNick()); EXPECT_EQ("PART", part.GetCommand()); + EXPECT_EQ("#chan", part.GetTarget()); EXPECT_EQ("reason", part.GetReason()); + part.SetTarget("#znc"); + EXPECT_EQ("#znc", part.GetTarget()); part.SetReason("test"); EXPECT_EQ("test", part.GetReason()); - EXPECT_EQ(":nick PART #chan test", part.ToString()); + EXPECT_EQ(":nick PART #znc test", part.ToString()); } TEST(MessageTest, PrivAction) { @@ -155,11 +175,14 @@ TEST(MessageTest, PrivAction) { CActionMessage& priv = static_cast(msg); EXPECT_EQ("sender", priv.GetNick().GetNick()); EXPECT_EQ("PRIVMSG", priv.GetCommand()); + EXPECT_EQ("receiver", priv.GetTarget()); EXPECT_EQ("ACTS", priv.GetText()); + priv.SetTarget("noone"); + EXPECT_EQ("noone", priv.GetTarget()); priv.SetText("foo bar"); EXPECT_EQ("foo bar", priv.GetText()); - EXPECT_EQ(":sender PRIVMSG receiver :\001ACTION foo bar\001", priv.ToString()); + EXPECT_EQ(":sender PRIVMSG noone :\001ACTION foo bar\001", priv.ToString()); } TEST(MessageTest, PrivCTCP) { @@ -167,11 +190,14 @@ TEST(MessageTest, PrivCTCP) { CCTCPMessage& priv = static_cast(msg); EXPECT_EQ("sender", priv.GetNick().GetNick()); EXPECT_EQ("PRIVMSG", priv.GetCommand()); + EXPECT_EQ("receiver", priv.GetTarget()); EXPECT_EQ("text", priv.GetText()); + priv.SetTarget("noone"); + EXPECT_EQ("noone", priv.GetTarget()); priv.SetText("foo bar"); EXPECT_EQ("foo bar", priv.GetText()); - EXPECT_EQ(":sender PRIVMSG receiver :\001foo bar\001", priv.ToString()); + EXPECT_EQ(":sender PRIVMSG noone :\001foo bar\001", priv.ToString()); } TEST(MessageTest, PrivMsg) { @@ -179,11 +205,14 @@ TEST(MessageTest, PrivMsg) { CTextMessage& priv = static_cast(msg); EXPECT_EQ("sender", priv.GetNick().GetNick()); EXPECT_EQ("PRIVMSG", priv.GetCommand()); + EXPECT_EQ("receiver", priv.GetTarget()); EXPECT_EQ("foo bar", priv.GetText()); + priv.SetTarget("noone"); + EXPECT_EQ("noone", priv.GetTarget()); priv.SetText(":)"); EXPECT_EQ(":)", priv.GetText()); - EXPECT_EQ(":sender PRIVMSG receiver ::)", priv.ToString()); + EXPECT_EQ(":sender PRIVMSG noone ::)", priv.ToString()); } TEST(MessageTest, Quit) { @@ -203,11 +232,14 @@ TEST(MessageTest, Topic) { CTopicMessage& topic = static_cast(msg); EXPECT_EQ("nick", topic.GetNick().GetNick()); EXPECT_EQ("TOPIC", topic.GetCommand()); + EXPECT_EQ("#chan", topic.GetTarget()); EXPECT_EQ("topic", topic.GetTopic()); + topic.SetTarget("#znc"); + EXPECT_EQ("#znc", topic.GetTarget()); topic.SetTopic("test"); EXPECT_EQ("test", topic.GetTopic()); - EXPECT_EQ(":nick TOPIC #chan test", topic.ToString()); + EXPECT_EQ(":nick TOPIC #znc test", topic.ToString()); } TEST(MessageTest, Parse) {