From 5880bb41806db8c3150cdb8efdab793717c1d4a6 Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Tue, 1 Sep 2015 23:38:00 +0200 Subject: [PATCH] Add CMessage::GetType() --- include/znc/Message.h | 31 +++++++++++++++++-- src/Message.cpp | 70 +++++++++++++++++++++++++++++++++++++++++++ test/MessageTest.cpp | 53 ++++++++++++++++++++++++++++++++ 3 files changed, 152 insertions(+), 2 deletions(-) diff --git a/include/znc/Message.h b/include/znc/Message.h index 022248ee..0c0f2a08 100644 --- a/include/znc/Message.h +++ b/include/znc/Message.h @@ -31,6 +31,31 @@ public: explicit CMessage(const CString& sMessage = ""); CMessage(const CNick& Nick, const CString& sCommand, const VCString& vsParams = VCString(), const MCString& mssTags = MCString::EmptyMap); + enum class Type { + Unknown, + Account, + Action, + Away, + Capability, + CTCP, + Error, + Invite, + Join, + Kick, + Mode, + Nick, + Notice, + Numeric, + Part, + Ping, + Pong, + Quit, + Text, + Topic, + Wallops, + }; + Type GetType() const { return m_eType; } + void Clone(const CMessage& Other); // ZNC <-> IRC @@ -49,11 +74,11 @@ public: void SetNick(const CNick& Nick) { m_Nick = Nick; } const CString& GetCommand() const { return m_sCommand; } - void SetCommand(const CString& sCommand) { m_sCommand = sCommand; } + void SetCommand(const CString& sCommand); const VCString& GetParams() const { return m_vsParams; } CString GetParams(unsigned int uIdx, unsigned int uLen = -1) const; - void SetParams(const VCString& vsParams) { m_vsParams = vsParams; } + void SetParams(const VCString& vsParams); CString GetParam(unsigned int uIdx) const; void SetParam(unsigned int uIdx, const CString& sParam); @@ -78,6 +103,7 @@ public: private: void InitTime(); + void InitType(); CNick m_Nick; CString m_sCommand; @@ -87,6 +113,7 @@ private: CIRCNetwork* m_pNetwork = nullptr; CClient* m_pClient = nullptr; CChan* m_pChan = nullptr; + Type m_eType = Type::Unknown; }; class CTargetMessage : public CMessage { diff --git a/src/Message.cpp b/src/Message.cpp index 5f40fc1b..66cd8332 100644 --- a/src/Message.cpp +++ b/src/Message.cpp @@ -36,6 +36,12 @@ void CMessage::Clone(const CMessage& Message) } } +void CMessage::SetCommand(const CString& sCommand) +{ + m_sCommand = sCommand; + InitType(); +} + CString CMessage::GetParams(unsigned int uIdx, unsigned int uLen) const { if (m_vsParams.empty() || uLen == 0) { @@ -56,6 +62,15 @@ CString CMessage::GetParams(unsigned int uIdx, unsigned int uLen) const return CString(" ").Join(vsParams.begin(), vsParams.end()); } +void CMessage::SetParams(const VCString& vsParams) +{ + m_vsParams = vsParams; + + if (m_eType == Type::Text || m_eType == Type::Notice || m_eType == Type::Action || m_eType == Type::CTCP) { + InitType(); + } +} + CString CMessage::GetParam(unsigned int uIdx) const { if (uIdx >= m_vsParams.size()) { @@ -70,6 +85,10 @@ void CMessage::SetParam(unsigned int uIdx, const CString& sParam) m_vsParams.resize(uIdx + 1); } m_vsParams[uIdx] = sParam; + + if (uIdx == 1 && (m_eType == Type::Text || m_eType == Type::Notice || m_eType == Type::Action || m_eType == Type::CTCP)) { + InitType(); + } } CString CMessage::GetTag(const CString& sKey) const @@ -164,6 +183,8 @@ void CMessage::Parse(CString sMessage) sMessage = sMessage.Token(1, true); } } + + InitType(); } void CMessage::InitTime() @@ -188,3 +209,52 @@ void CMessage::InitTime() m_time.tv_usec = 0; } } + +void CMessage::InitType() +{ + if (m_sCommand.length() == 3 && isdigit(m_sCommand[0]) && isdigit(m_sCommand[1]) && isdigit(m_sCommand[2])) { + m_eType = Type::Numeric; + } else if (m_sCommand.Equals("PRIVMSG")) { + CString sParam = GetParam(1); + if (sParam.TrimPrefix("\001") && sParam.EndsWith("\001")) { + if (sParam.StartsWith("ACTION ")) { + m_eType = Type::Action; + } else { + m_eType = Type::CTCP; + } + } else { + m_eType = Type::Text; + } + } else if (m_sCommand.Equals("NOTICE")) { + CString sParam = GetParam(1); + if (sParam.StartsWith("\001") && sParam.EndsWith("\001")) { + m_eType = Type::CTCP; + } else { + m_eType = Type::Notice; + } + } else { + std::map mTypes = { + {"ACCOUNT", Type::Account}, + {"AWAY", Type::Away}, + {"CAP", Type::Capability}, + {"ERROR", Type::Error}, + {"INVITE", Type::Invite}, + {"JOIN", Type::Join}, + {"KICK", Type::Kick}, + {"MODE", Type::Mode}, + {"NICK", Type::Nick}, + {"PART", Type::Part}, + {"PING", Type::Ping}, + {"PONG", Type::Pong}, + {"QUIT", Type::Quit}, + {"TOPIC", Type::Topic}, + {"WALLOPS", Type::Wallops}, + }; + auto it = mTypes.find(m_sCommand.AsUpper()); + if (it != mTypes.end()) { + m_eType = it->second; + } else { + m_eType = Type::Unknown; + } + } +} diff --git a/test/MessageTest.cpp b/test/MessageTest.cpp index 7762018d..add99650 100644 --- a/test/MessageTest.cpp +++ b/test/MessageTest.cpp @@ -101,6 +101,46 @@ TEST(MessageTest, FormatFlags) { EXPECT_EQ("COMMAND param", msg.ToString(CMessage::ExcludePrefix|CMessage::ExcludeTags)); } +TEST(MessageTest, Type) { + EXPECT_EQ(CMessage::Type::Unknown, CMessage("FOO").GetType()); + EXPECT_EQ(CMessage::Type::Account, CMessage("ACCOUNT").GetType()); + EXPECT_EQ(CMessage::Type::Away, CMessage("AWAY").GetType()); + EXPECT_EQ(CMessage::Type::Capability, CMessage("CAP").GetType()); + EXPECT_EQ(CMessage::Type::Error, CMessage("ERROR").GetType()); + EXPECT_EQ(CMessage::Type::Invite, CMessage("INVITE").GetType()); + EXPECT_EQ(CMessage::Type::Join, CMessage("JOIN").GetType()); + EXPECT_EQ(CMessage::Type::Kick, CMessage("KICK").GetType()); + EXPECT_EQ(CMessage::Type::Mode, CMessage("MODE").GetType()); + EXPECT_EQ(CMessage::Type::Nick, CMessage("NICK").GetType()); + EXPECT_EQ(CMessage::Type::Notice, CMessage("NOTICE").GetType()); + EXPECT_EQ(CMessage::Type::Numeric, CMessage("123").GetType()); + EXPECT_EQ(CMessage::Type::Part, CMessage("PART").GetType()); + EXPECT_EQ(CMessage::Type::Ping, CMessage("PING").GetType()); + EXPECT_EQ(CMessage::Type::Pong, CMessage("PONG").GetType()); + EXPECT_EQ(CMessage::Type::Quit, CMessage("QUIT").GetType()); + EXPECT_EQ(CMessage::Type::Text, CMessage("PRIVMSG").GetType()); + EXPECT_EQ(CMessage::Type::Topic, CMessage("TOPIC").GetType()); + EXPECT_EQ(CMessage::Type::Wallops, CMessage("WALLOPS").GetType()); + + CMessage msg; + EXPECT_EQ(CMessage::Type::Unknown, msg.GetType()); + + msg.SetCommand("PRIVMSG"); + EXPECT_EQ(CMessage::Type::Text, msg.GetType()); + + msg.SetParams({"target", "\001ACTION foo\001"}); + EXPECT_EQ(CMessage::Type::Action, msg.GetType()); + + msg.SetParam(1, "\001foo\001"); + EXPECT_EQ(CMessage::Type::CTCP, msg.GetType()); + + msg.SetCommand("NOTICE"); + EXPECT_EQ(CMessage::Type::CTCP, msg.GetType()); + + msg.SetParam(1, "foo"); + EXPECT_EQ(CMessage::Type::Notice, msg.GetType()); +} + TEST(MessageTest, ChanAction) { CActionMessage msg; msg.Parse(":sender PRIVMSG #chan :\001ACTION ACTS\001"); @@ -108,6 +148,7 @@ TEST(MessageTest, ChanAction) { EXPECT_EQ("PRIVMSG", msg.GetCommand()); EXPECT_EQ("#chan", msg.GetTarget()); EXPECT_EQ("ACTS", msg.GetText()); + EXPECT_EQ(CMessage::Type::Action, msg.GetType()); msg.SetTarget("#znc"); EXPECT_EQ("#znc", msg.GetTarget()); @@ -124,6 +165,7 @@ TEST(MessageTest, ChanCTCP) { EXPECT_EQ("#chan", msg.GetTarget()); EXPECT_EQ("text", msg.GetText()); EXPECT_FALSE(msg.IsReply()); + EXPECT_EQ(CMessage::Type::CTCP, msg.GetType()); msg.SetTarget("#znc"); EXPECT_EQ("#znc", msg.GetTarget()); @@ -139,6 +181,7 @@ TEST(MessageTest, ChanMsg) { EXPECT_EQ("PRIVMSG", msg.GetCommand()); EXPECT_EQ("#chan", msg.GetTarget()); EXPECT_EQ("text", msg.GetText()); + EXPECT_EQ(CMessage::Type::Text, msg.GetType()); msg.SetTarget("#znc"); EXPECT_EQ("#znc", msg.GetTarget()); @@ -155,6 +198,7 @@ TEST(MessageTest, CTCPReply) { EXPECT_EQ("nick", msg.GetTarget()); EXPECT_EQ("FOO bar", msg.GetText()); EXPECT_TRUE(msg.IsReply()); + EXPECT_EQ(CMessage::Type::CTCP, msg.GetType()); msg.SetTarget("noone"); EXPECT_EQ("noone", msg.GetTarget()); @@ -171,6 +215,7 @@ TEST(MessageTest, Kick) { EXPECT_EQ("#chan", msg.GetTarget()); EXPECT_EQ("person", msg.GetKickedNick()); EXPECT_EQ("reason", msg.GetReason()); + EXPECT_EQ(CMessage::Type::Kick, msg.GetType()); msg.SetTarget("#znc"); EXPECT_EQ("#znc", msg.GetTarget()); @@ -187,6 +232,7 @@ TEST(MessageTest, Join) { EXPECT_EQ("nick", msg.GetNick().GetNick()); EXPECT_EQ("JOIN", msg.GetCommand()); EXPECT_EQ("#chan", msg.GetTarget()); + EXPECT_EQ(CMessage::Type::Join, msg.GetType()); msg.SetTarget("#znc"); EXPECT_EQ("#znc", msg.GetTarget()); @@ -213,6 +259,7 @@ TEST(MessageTest, Nick) { EXPECT_EQ("NICK", msg.GetCommand()); EXPECT_EQ("nick", msg.GetOldNick()); EXPECT_EQ("person", msg.GetNewNick()); + EXPECT_EQ(CMessage::Type::Nick, msg.GetType()); msg.SetNewNick("test"); EXPECT_EQ("test", msg.GetNewNick()); @@ -235,6 +282,7 @@ TEST(MessageTest, Part) { EXPECT_EQ("PART", msg.GetCommand()); EXPECT_EQ("#chan", msg.GetTarget()); EXPECT_EQ("reason", msg.GetReason()); + EXPECT_EQ(CMessage::Type::Part, msg.GetType()); msg.SetTarget("#znc"); EXPECT_EQ("#znc", msg.GetTarget()); @@ -250,6 +298,7 @@ TEST(MessageTest, PrivAction) { EXPECT_EQ("PRIVMSG", msg.GetCommand()); EXPECT_EQ("receiver", msg.GetTarget()); EXPECT_EQ("ACTS", msg.GetText()); + EXPECT_EQ(CMessage::Type::Action, msg.GetType()); msg.SetTarget("noone"); EXPECT_EQ("noone", msg.GetTarget()); @@ -266,6 +315,7 @@ TEST(MessageTest, PrivCTCP) { EXPECT_EQ("receiver", msg.GetTarget()); EXPECT_EQ("text", msg.GetText()); EXPECT_FALSE(msg.IsReply()); + EXPECT_EQ(CMessage::Type::CTCP, msg.GetType()); msg.SetTarget("noone"); EXPECT_EQ("noone", msg.GetTarget()); @@ -281,6 +331,7 @@ TEST(MessageTest, PrivMsg) { EXPECT_EQ("PRIVMSG", msg.GetCommand()); EXPECT_EQ("receiver", msg.GetTarget()); EXPECT_EQ("foo bar", msg.GetText()); + EXPECT_EQ(CMessage::Type::Text, msg.GetType()); msg.SetTarget("noone"); EXPECT_EQ("noone", msg.GetTarget()); @@ -295,6 +346,7 @@ TEST(MessageTest, Quit) { EXPECT_EQ("nick", msg.GetNick().GetNick()); EXPECT_EQ("QUIT", msg.GetCommand()); EXPECT_EQ("reason", msg.GetReason()); + EXPECT_EQ(CMessage::Type::Quit, msg.GetType()); msg.SetReason("test"); EXPECT_EQ("test", msg.GetReason()); @@ -308,6 +360,7 @@ TEST(MessageTest, Topic) { EXPECT_EQ("TOPIC", msg.GetCommand()); EXPECT_EQ("#chan", msg.GetTarget()); EXPECT_EQ("topic", msg.GetTopic()); + EXPECT_EQ(CMessage::Type::Topic, msg.GetType()); msg.SetTarget("#znc"); EXPECT_EQ("#znc", msg.GetTarget());