Add CMessage::GetType()

This commit is contained in:
J-P Nurmi
2015-09-01 23:38:00 +02:00
parent 2bee156316
commit 5880bb4180
3 changed files with 152 additions and 2 deletions
+29 -2
View File
@@ -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 {
+70
View File
@@ -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<CString, Type> 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;
}
}
}
+53
View File
@@ -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());