mirror of
https://github.com/znc/znc.git
synced 2026-07-05 01:11:53 +02:00
Add CMessage::GetType()
This commit is contained in:
+29
-2
@@ -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 {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
|
||||
Reference in New Issue
Block a user