mirror of
https://github.com/znc/znc.git
synced 2026-03-28 17:42:41 +01:00
merge with rev 932 psychon branch:
- module call for /me's - timestamps for playback and query buffer - WALLOP stuff / fix - properly join channels _after_ namesx or uhnames were set up - dont screw up raws on reconnect when you ran /lusers - change default quit msg and version reply to CZNC::GetTag(false) - change CZNC::GetTag() to point to sf.net - kind of an rewrite for partyline, added fixed channels (this doesnt work on irssi, did it ever work?) - add the timestamp support to webadmin too - add ConnectDelay config option to avoid being killed because we connected too fast - make znc handle usermodes correctly git-svn-id: https://znc.svn.sourceforge.net/svnroot/znc/trunk@799 726aef4b-f618-498e-8847-2d620e286838
This commit is contained in:
77
IRCSock.cpp
77
IRCSock.cpp
@@ -114,13 +114,6 @@ void CIRCSock::ReadLine(const CString& sData) {
|
||||
m_pUser->ClearRawBuffer();
|
||||
m_pUser->AddRawBuffer(":" + sServer + " " + sCmd + " ", " " + sRest);
|
||||
|
||||
// Now that we are connected, we need to join our chans
|
||||
const vector<CChan*>& vChans = m_pUser->GetChans();
|
||||
|
||||
for (unsigned int a = 0; a < vChans.size(); a++) {
|
||||
PutIRC("JOIN " + vChans[a]->GetName() + " " + vChans[a]->GetKey());
|
||||
}
|
||||
|
||||
CZNC::Get().ReleaseISpoof();
|
||||
m_bISpoofReleased = true;
|
||||
|
||||
@@ -128,6 +121,8 @@ void CIRCSock::ReadLine(const CString& sData) {
|
||||
}
|
||||
case 5:
|
||||
ParseISupport(sRest);
|
||||
m_pUser->AddRawBuffer(":" + sServer + " " + sCmd + " ", " " + sRest);
|
||||
break;
|
||||
case 2:
|
||||
case 3:
|
||||
case 4:
|
||||
@@ -138,10 +133,10 @@ void CIRCSock::ReadLine(const CString& sData) {
|
||||
case 255: // client count
|
||||
case 265: // local users
|
||||
case 266: // global users
|
||||
m_pUser->AddRawBuffer(":" + sServer + " " + sCmd + " ", " " + sRest);
|
||||
m_pUser->UpdateRawBuffer(":" + sServer + " " + sCmd + " ", " " + sRest);
|
||||
break;
|
||||
case 422: // MOTD File is missing
|
||||
case 375: // begin motd
|
||||
case 375: // begin motd
|
||||
m_pUser->ClearMotdBuffer();
|
||||
case 372: // motd
|
||||
case 376: // end motd
|
||||
@@ -508,16 +503,42 @@ void CIRCSock::ReadLine(const CString& sData) {
|
||||
return;
|
||||
}
|
||||
} else if (sCmd.CaseCmp("MODE") == 0) {
|
||||
CString sChan = sRest.Token(0);
|
||||
CString sTarget = sRest.Token(0);
|
||||
CString sModes = sRest.Token(1, true);
|
||||
if(sModes.Left(1) == ":")
|
||||
sModes = sModes.substr(1);
|
||||
|
||||
CChan* pChan = m_pUser->FindChan(sChan);
|
||||
CChan* pChan = m_pUser->FindChan(sTarget);
|
||||
if (pChan) {
|
||||
pChan->ModeChange(sModes, Nick.GetNick());
|
||||
|
||||
if (pChan->IsDetached()) {
|
||||
return;
|
||||
}
|
||||
} else if (sTarget == m_Nick.GetNick()) {
|
||||
CString sModeArg = sModes.Token(0);
|
||||
// CString sArgs = sModes.Token(1, true); Usermode changes got no params
|
||||
bool bAdd = true;
|
||||
/* no module call defined (yet?)
|
||||
#ifdef _MODULES
|
||||
MODULECALL(OnRawUserMode(*pOpNick, *this, sModeArg, sArgs), m_pUser, NULL, );
|
||||
#endif
|
||||
*/
|
||||
for (unsigned int a = 0; a < sModeArg.size(); a++) {
|
||||
const unsigned char& uMode = sModeArg[a];
|
||||
|
||||
if (uMode == '+') {
|
||||
bAdd = true;
|
||||
} else if (uMode == '-') {
|
||||
bAdd = false;
|
||||
} else {
|
||||
if(bAdd) {
|
||||
m_scUserModes.insert(uMode);
|
||||
} else {
|
||||
m_scUserModes.erase(uMode);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (sCmd.CaseCmp("KICK") == 0) {
|
||||
// :opnick!ident@host.com KICK #chan nick :msg
|
||||
@@ -637,7 +658,12 @@ void CIRCSock::ReadLine(const CString& sData) {
|
||||
} else if (sCmd.CaseCmp("WALLOPS") == 0) {
|
||||
// :blub!dummy@rox-8DBEFE92 WALLOPS :this is a test
|
||||
CString sMsg = sRest.Token(0, true);
|
||||
m_pUser->AddQueryBuffer(":" + Nick.GetNickMask() + " WALLOPS ", sMsg, false);
|
||||
|
||||
if(sMsg.Left(1) == ":") {
|
||||
sMsg.LeftChomp();
|
||||
}
|
||||
|
||||
m_pUser->AddQueryBuffer(":" + Nick.GetNickMask() + " WALLOPS ", ":" + m_pUser->AddTimestamp(sMsg), false);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -661,7 +687,12 @@ bool CIRCSock::OnCTCPReply(CNick& Nick, CString& sMessage) {
|
||||
}
|
||||
|
||||
bool CIRCSock::OnPrivCTCP(CNick& Nick, CString& sMessage) {
|
||||
MODULECALL(OnPrivCTCP(Nick, sMessage), m_pUser, NULL, return true);
|
||||
if (sMessage.Token(0).CaseCmp("ACTION") == 0) {
|
||||
sMessage = sMessage.Token(1, true);
|
||||
MODULECALL(OnPrivAction(Nick, sMessage), m_pUser, NULL, return true);
|
||||
} else {
|
||||
MODULECALL(OnPrivCTCP(Nick, sMessage), m_pUser, NULL, return true);
|
||||
}
|
||||
|
||||
if (strncasecmp(sMessage.c_str(), "DCC ", 4) == 0 && m_pUser && m_pUser->BounceDCCs() && m_pUser->IsUserAttached()) {
|
||||
// DCC CHAT chat 2453612361 44592
|
||||
@@ -722,7 +753,7 @@ bool CIRCSock::OnPrivCTCP(CNick& Nick, CString& sMessage) {
|
||||
|
||||
if (sReply.empty() && !m_pUser->IsUserAttached()) {
|
||||
if (sQuery == "VERSION") {
|
||||
sReply = "ZNC by prozac - http://znc.sourceforge.net";
|
||||
sReply = CZNC::GetTag();
|
||||
} else if (sQuery == "PING") {
|
||||
sReply = sMessage.Token(1, true);
|
||||
}
|
||||
@@ -742,7 +773,7 @@ bool CIRCSock::OnPrivNotice(CNick& Nick, CString& sMessage) {
|
||||
|
||||
if (!m_pUser->IsUserAttached()) {
|
||||
// If the user is detached, add to the buffer
|
||||
m_pUser->AddQueryBuffer(":" + Nick.GetNickMask() + " NOTICE ", " :" + sMessage);
|
||||
m_pUser->AddQueryBuffer(":" + Nick.GetNickMask() + " NOTICE ", " :" + m_pUser->AddTimestamp(sMessage));
|
||||
}
|
||||
|
||||
return false;
|
||||
@@ -753,7 +784,7 @@ bool CIRCSock::OnPrivMsg(CNick& Nick, CString& sMessage) {
|
||||
|
||||
if (!m_pUser->IsUserAttached()) {
|
||||
// If the user is detached, add to the buffer
|
||||
m_pUser->AddQueryBuffer(":" + Nick.GetNickMask() + " PRIVMSG ", " :" + sMessage);
|
||||
m_pUser->AddQueryBuffer(":" + Nick.GetNickMask() + " PRIVMSG ", " :" + m_pUser->AddTimestamp(sMessage));
|
||||
}
|
||||
|
||||
return false;
|
||||
@@ -763,8 +794,11 @@ bool CIRCSock::OnChanCTCP(CNick& Nick, const CString& sChan, CString& sMessage)
|
||||
CChan* pChan = m_pUser->FindChan(sChan);
|
||||
if (pChan) {
|
||||
// Record a /me
|
||||
if (sMessage.Token(0).CaseCmp("ACTION") == 0 && (pChan->KeepBuffer() || !m_pUser->IsUserAttached())) {
|
||||
pChan->AddBuffer(":" + Nick.GetNickMask() + " PRIVMSG " + sChan + " :\001" + sMessage + "\001");
|
||||
if (sMessage.Token(0).CaseCmp("ACTION") == 0) {
|
||||
if(pChan->KeepBuffer() || !m_pUser->IsUserAttached()) {
|
||||
pChan->AddBuffer(":" + Nick.GetNickMask() + " PRIVMSG " + sChan + " :\001ACTION " + m_pUser->AddTimestamp(sMessage.Token(1, true)) + "\001");
|
||||
}
|
||||
MODULECALL(OnChanAction(Nick, *pChan, sMessage), m_pUser, NULL, return true);
|
||||
} else {
|
||||
MODULECALL(OnChanCTCP(Nick, *pChan, sMessage), m_pUser, NULL, return true);
|
||||
}
|
||||
@@ -779,7 +813,7 @@ bool CIRCSock::OnChanNotice(CNick& Nick, const CString& sChan, CString& sMessage
|
||||
MODULECALL(OnChanNotice(Nick, *pChan, sMessage), m_pUser, NULL, return true);
|
||||
|
||||
if ((pChan->KeepBuffer()) || (!m_pUser->IsUserAttached())) {
|
||||
pChan->AddBuffer(":" + Nick.GetNickMask() + " NOTICE " + sChan + " :" + sMessage);
|
||||
pChan->AddBuffer(":" + Nick.GetNickMask() + " NOTICE " + sChan + " :" + m_pUser->AddTimestamp(sMessage));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -792,7 +826,7 @@ bool CIRCSock::OnChanMsg(CNick& Nick, const CString& sChan, CString& sMessage) {
|
||||
MODULECALL(OnChanMsg(Nick, *pChan, sMessage), m_pUser, NULL, return true);
|
||||
|
||||
if (pChan->KeepBuffer() || !m_pUser->IsUserAttached()) {
|
||||
pChan->AddBuffer(":" + Nick.GetNickMask() + " PRIVMSG " + sChan + " :" + sMessage);
|
||||
pChan->AddBuffer(":" + Nick.GetNickMask() + " PRIVMSG " + sChan + " :" + m_pUser->AddTimestamp(sMessage));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -832,6 +866,7 @@ void CIRCSock::Disconnected() {
|
||||
m_pUser->ClearMotdBuffer();
|
||||
|
||||
ResetChans();
|
||||
m_scUserModes.clear();
|
||||
}
|
||||
|
||||
void CIRCSock::SockError(int iErrno) {
|
||||
@@ -843,6 +878,7 @@ void CIRCSock::SockError(int iErrno) {
|
||||
m_pUser->ClearMotdBuffer();
|
||||
|
||||
ResetChans();
|
||||
m_scUserModes.clear();
|
||||
}
|
||||
|
||||
void CIRCSock::Timeout() {
|
||||
@@ -854,6 +890,7 @@ void CIRCSock::Timeout() {
|
||||
m_pUser->ClearMotdBuffer();
|
||||
|
||||
ResetChans();
|
||||
m_scUserModes.empty();
|
||||
}
|
||||
|
||||
void CIRCSock::ConnectionRefused() {
|
||||
|
||||
Reference in New Issue
Block a user