mirror of
https://github.com/znc/znc.git
synced 2026-05-03 03:52:33 +02:00
CIRCSock::ReadLine(): use CMessage as a helper
This commit is contained in:
108
src/IRCSock.cpp
108
src/IRCSock.cpp
@@ -20,6 +20,7 @@
|
||||
#include <znc/IRCNetwork.h>
|
||||
#include <znc/Server.h>
|
||||
#include <znc/Query.h>
|
||||
#include <znc/Message.h>
|
||||
#include <time.h>
|
||||
|
||||
using std::set;
|
||||
@@ -156,29 +157,31 @@ void CIRCSock::ReadLine(const CString& sData) {
|
||||
IRCSOCKMODULECALL(OnRaw(sLine), &bReturn);
|
||||
if (bReturn) return;
|
||||
|
||||
if (sLine.StartsWith("PING ")) {
|
||||
CMessage Message(sLine);
|
||||
Message.SetNetwork(m_pNetwork);
|
||||
|
||||
CString sCmd = Message.GetCommand();
|
||||
|
||||
if (sCmd.Equals("PING")) {
|
||||
// Generate a reply and don't forward this to any user,
|
||||
// we don't want any PING forwarded
|
||||
PutIRCQuick("PONG " + sLine.substr(5));
|
||||
PutIRCQuick("PONG " + Message.GetParam(0));
|
||||
return;
|
||||
} else if (sLine.Token(1).Equals("PONG")) {
|
||||
} else if (sCmd.Equals("PONG")) {
|
||||
// Block PONGs, we already responded to the pings
|
||||
return;
|
||||
} else if (sLine.StartsWith("ERROR ")) {
|
||||
} else if (sCmd.Equals("ERROR")) {
|
||||
//ERROR :Closing Link: nick[24.24.24.24] (Excess Flood)
|
||||
CString sError(sLine.substr(6));
|
||||
sError.TrimPrefix();
|
||||
CString sError = Message.GetParam(0);
|
||||
m_pNetwork->PutStatus("Error from Server [" + sError + "]");
|
||||
return;
|
||||
}
|
||||
|
||||
CString sCmd = sLine.Token(1);
|
||||
|
||||
if ((sCmd.length() == 3) && (isdigit(sCmd[0])) && (isdigit(sCmd[1])) && (isdigit(sCmd[2]))) {
|
||||
CString sServer = sLine.Token(0).LeftChomp_n();
|
||||
CString sServer = Message.GetNick().GetHostMask();
|
||||
unsigned int uRaw = sCmd.ToUInt();
|
||||
CString sNick = sLine.Token(2);
|
||||
CString sRest = sLine.Token(3, true);
|
||||
CString sNick = Message.GetParam(0);
|
||||
CString sRest = Message.GetParams(1);
|
||||
CString sTmp;
|
||||
|
||||
switch (uRaw) {
|
||||
@@ -224,9 +227,9 @@ void CIRCSock::ReadLine(const CString& sData) {
|
||||
m_pNetwork->UpdateExactRawBuffer(":" + _NAMEDFMT(sServer) + " " + sCmd + " {target} " + _NAMEDFMT(sRest));
|
||||
break;
|
||||
case 10: { // :irc.server.com 010 nick <hostname> <port> :<info>
|
||||
CString sHost = sRest.Token(0);
|
||||
CString sPort = sRest.Token(1);
|
||||
CString sInfo = sRest.Token(2, true).TrimPrefix_n();
|
||||
CString sHost = Message.GetParam(1);
|
||||
CString sPort = Message.GetParam(2);
|
||||
CString sInfo = Message.GetParam(3);
|
||||
m_pNetwork->PutStatus("Server [" + m_pNetwork->GetCurrentServer()->GetString(false) +
|
||||
"] redirects us to [" + sHost + ":" + sPort + "] with reason [" + sInfo + "]");
|
||||
m_pNetwork->PutStatus("Perhaps you want to add it as a new server.");
|
||||
@@ -278,7 +281,7 @@ void CIRCSock::ReadLine(const CString& sData) {
|
||||
CChan* pChan = m_pNetwork->FindChan(sRest.Token(0));
|
||||
|
||||
if (pChan) {
|
||||
unsigned long ulDate = sLine.Token(4).ToULong();
|
||||
unsigned long ulDate = Message.GetParam(2).ToULong();
|
||||
pChan->SetCreationDate(ulDate);
|
||||
|
||||
if (!pChan->IsModeKnown()) {
|
||||
@@ -296,7 +299,7 @@ void CIRCSock::ReadLine(const CString& sData) {
|
||||
break;
|
||||
case 331: {
|
||||
// :irc.server.com 331 yournick #chan :No topic is set.
|
||||
CChan* pChan = m_pNetwork->FindChan(sLine.Token(3));
|
||||
CChan* pChan = m_pNetwork->FindChan(Message.GetParam(1));
|
||||
|
||||
if (pChan) {
|
||||
pChan->SetTopic("");
|
||||
@@ -309,11 +312,10 @@ void CIRCSock::ReadLine(const CString& sData) {
|
||||
}
|
||||
case 332: {
|
||||
// :irc.server.com 332 yournick #chan :This is a topic
|
||||
CChan* pChan = m_pNetwork->FindChan(sLine.Token(3));
|
||||
CChan* pChan = m_pNetwork->FindChan(Message.GetParam(1));
|
||||
|
||||
if (pChan) {
|
||||
CString sTopic = sLine.Token(4, true);
|
||||
sTopic.LeftChomp();
|
||||
CString sTopic = Message.GetParam(2);
|
||||
pChan->SetTopic(sTopic);
|
||||
if (pChan->IsDetached()) {
|
||||
return;
|
||||
@@ -324,11 +326,11 @@ void CIRCSock::ReadLine(const CString& sData) {
|
||||
}
|
||||
case 333: {
|
||||
// :irc.server.com 333 yournick #chan setternick 1112320796
|
||||
CChan* pChan = m_pNetwork->FindChan(sLine.Token(3));
|
||||
CChan* pChan = m_pNetwork->FindChan(Message.GetParam(1));
|
||||
|
||||
if (pChan) {
|
||||
sNick = sLine.Token(4);
|
||||
unsigned long ulDate = sLine.Token(5).ToULong();
|
||||
sNick = Message.GetParam(2);
|
||||
unsigned long ulDate = Message.GetParam(3).ToULong();
|
||||
|
||||
pChan->SetTopicOwner(sNick);
|
||||
pChan->SetTopicDate(ulDate);
|
||||
@@ -342,13 +344,10 @@ void CIRCSock::ReadLine(const CString& sData) {
|
||||
}
|
||||
case 352: { // WHO
|
||||
// :irc.yourserver.com 352 yournick #chan ident theirhost.com irc.theirserver.com theirnick H :0 Real Name
|
||||
sServer = sLine.Token(0);
|
||||
sNick = sLine.Token(7);
|
||||
CString sChan = sLine.Token(3);
|
||||
CString sIdent = sLine.Token(4);
|
||||
CString sHost = sLine.Token(5);
|
||||
|
||||
sServer.LeftChomp();
|
||||
sNick = Message.GetParam(5);
|
||||
CString sChan = Message.GetParam(1);
|
||||
CString sIdent = Message.GetParam(2);
|
||||
CString sHost = Message.GetParam(3);
|
||||
|
||||
if (sNick.Equals(GetNick())) {
|
||||
m_Nick.SetIdent(sIdent);
|
||||
@@ -505,12 +504,10 @@ void CIRCSock::ReadLine(const CString& sData) {
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
CNick Nick(sLine.Token(0).TrimPrefix_n());
|
||||
sCmd = sLine.Token(1);
|
||||
CString sRest = sLine.Token(2, true);
|
||||
CNick Nick = Message.GetNick();
|
||||
|
||||
if (sCmd.Equals("NICK")) {
|
||||
CString sNewNick = sRest.TrimPrefix_n();
|
||||
CString sNewNick = Message.GetParam(0);
|
||||
bool bIsVisible = false;
|
||||
|
||||
vector<CChan*> vFoundChans;
|
||||
@@ -539,7 +536,7 @@ void CIRCSock::ReadLine(const CString& sData) {
|
||||
return;
|
||||
}
|
||||
} else if (sCmd.Equals("QUIT")) {
|
||||
CString sMessage = sRest.TrimPrefix_n();
|
||||
CString sMessage = Message.GetParam(0);
|
||||
bool bIsVisible = false;
|
||||
|
||||
// :nick!ident@host.com QUIT :message
|
||||
@@ -571,7 +568,7 @@ void CIRCSock::ReadLine(const CString& sData) {
|
||||
return;
|
||||
}
|
||||
} else if (sCmd.Equals("JOIN")) {
|
||||
CString sChan = sRest.Token(0).TrimPrefix_n();
|
||||
CString sChan = Message.GetParam(0);
|
||||
CChan* pChan;
|
||||
|
||||
if (Nick.NickEquals(GetNick())) {
|
||||
@@ -610,8 +607,8 @@ void CIRCSock::ReadLine(const CString& sData) {
|
||||
}
|
||||
}
|
||||
} else if (sCmd.Equals("PART")) {
|
||||
CString sChan = sRest.Token(0).TrimPrefix_n();
|
||||
CString sMsg = sRest.Token(1, true).TrimPrefix_n();
|
||||
CString sChan = Message.GetParam(0);
|
||||
CString sMsg = Message.GetParam(1);
|
||||
|
||||
CChan* pChan = m_pNetwork->FindChan(sChan);
|
||||
bool bDetached = false;
|
||||
@@ -637,8 +634,8 @@ void CIRCSock::ReadLine(const CString& sData) {
|
||||
return;
|
||||
}
|
||||
} else if (sCmd.Equals("MODE")) {
|
||||
CString sTarget = sRest.Token(0);
|
||||
CString sModes = sRest.Token(1, true).TrimPrefix_n(":");
|
||||
CString sTarget = Message.GetParam(0);
|
||||
CString sModes = Message.GetParams(1);
|
||||
|
||||
CChan* pChan = m_pNetwork->FindChan(sTarget);
|
||||
if (pChan) {
|
||||
@@ -671,10 +668,9 @@ void CIRCSock::ReadLine(const CString& sData) {
|
||||
}
|
||||
} else if (sCmd.Equals("KICK")) {
|
||||
// :opnick!ident@host.com KICK #chan nick :msg
|
||||
CString sChan = sRest.Token(0);
|
||||
CString sKickedNick = sRest.Token(1);
|
||||
CString sMsg = sRest.Token(2, true);
|
||||
sMsg.LeftChomp();
|
||||
CString sChan = Message.GetParam(0);
|
||||
CString sKickedNick = Message.GetParam(1);
|
||||
CString sMsg = Message.GetParam(2);
|
||||
|
||||
CChan* pChan = m_pNetwork->FindChan(sChan);
|
||||
|
||||
@@ -697,9 +693,8 @@ void CIRCSock::ReadLine(const CString& sData) {
|
||||
}
|
||||
} else if (sCmd.Equals("NOTICE")) {
|
||||
// :nick!ident@host.com NOTICE #chan :Message
|
||||
CString sTarget = sRest.Token(0);
|
||||
CString sMsg = sRest.Token(1, true);
|
||||
sMsg.LeftChomp();
|
||||
CString sTarget = Message.GetParam(0);
|
||||
CString sMsg = Message.GetParam(1);
|
||||
|
||||
if (sMsg.WildCmp("\001*\001")) {
|
||||
sMsg.LeftChomp();
|
||||
@@ -734,11 +729,10 @@ void CIRCSock::ReadLine(const CString& sData) {
|
||||
return;
|
||||
} else if (sCmd.Equals("TOPIC")) {
|
||||
// :nick!ident@host.com TOPIC #chan :This is a topic
|
||||
CChan* pChan = m_pNetwork->FindChan(sLine.Token(2));
|
||||
CChan* pChan = m_pNetwork->FindChan(Message.GetParam(0));
|
||||
|
||||
if (pChan) {
|
||||
CString sTopic = sLine.Token(3, true);
|
||||
sTopic.LeftChomp();
|
||||
CString sTopic = Message.GetParam(1);
|
||||
|
||||
IRCSOCKMODULECALL(OnTopic(Nick, *pChan, sTopic), &bReturn);
|
||||
if (bReturn) return;
|
||||
@@ -755,8 +749,8 @@ void CIRCSock::ReadLine(const CString& sData) {
|
||||
}
|
||||
} else if (sCmd.Equals("PRIVMSG")) {
|
||||
// :nick!ident@host.com PRIVMSG #chan :Message
|
||||
CString sTarget = sRest.Token(0);
|
||||
CString sMsg = sRest.Token(1, true).TrimPrefix_n();
|
||||
CString sTarget = Message.GetParam(0);
|
||||
CString sMsg = Message.GetParam(1);
|
||||
|
||||
if (sMsg.WildCmp("\001*\001")) {
|
||||
sMsg.LeftChomp();
|
||||
@@ -790,7 +784,7 @@ void CIRCSock::ReadLine(const CString& sData) {
|
||||
}
|
||||
} else if (sCmd.Equals("WALLOPS")) {
|
||||
// :blub!dummy@rox-8DBEFE92 WALLOPS :this is a test
|
||||
CString sMsg = sRest.Token(0, true).TrimPrefix_n();
|
||||
CString sMsg = Message.GetParam(0);
|
||||
|
||||
if (!m_pNetwork->IsUserOnline()) {
|
||||
m_pNetwork->AddNoticeBuffer(":" + _NAMEDFMT(Nick.GetNickMask()) + " WALLOPS :{text}", sMsg);
|
||||
@@ -798,10 +792,10 @@ void CIRCSock::ReadLine(const CString& sData) {
|
||||
} else if (sCmd.Equals("CAP")) {
|
||||
// CAPs are supported only before authorization.
|
||||
if (!m_bAuthed) {
|
||||
// sRest.Token(0) is most likely "*". No idea why, the
|
||||
// The first parameter is most likely "*". No idea why, the
|
||||
// CAP spec don't mention this, but all implementations
|
||||
// I've seen add this extra asterisk
|
||||
CString sSubCmd = sRest.Token(1);
|
||||
CString sSubCmd = Message.GetParam(1);
|
||||
|
||||
// If the caplist of a reply is too long, it's split
|
||||
// into multiple replies. A "*" is prepended to show
|
||||
@@ -815,10 +809,10 @@ void CIRCSock::ReadLine(const CString& sData) {
|
||||
// to recognize past request of NAK by 100 chars
|
||||
// of this reply.
|
||||
CString sArgs;
|
||||
if (sRest.Token(2) == "*") {
|
||||
sArgs = sRest.Token(3, true).TrimPrefix_n();
|
||||
if (Message.GetParam(2) == "*") {
|
||||
sArgs = Message.GetParam(3);
|
||||
} else {
|
||||
sArgs = sRest.Token(2, true).TrimPrefix_n();
|
||||
sArgs = Message.GetParam(2);
|
||||
}
|
||||
|
||||
std::map<CString, std::function<void(bool bVal)>> mSupportedCaps = {
|
||||
|
||||
Reference in New Issue
Block a user