From: <ps...@us...> - 2008-07-21 10:16:02
|
Revision: 1140 http://znc.svn.sourceforge.net/znc/?rev=1140&view=rev Author: psychon Date: 2008-07-21 10:15:16 +0000 (Mon, 21 Jul 2008) Log Message: ----------- We are in a channel when we received the JOIN for it, not it's "end of /names" This moves some calls from the raw 366 handler to the JOIN handler and it might even fix a bug (well, which no one would ever have triggered). Modified Paths: -------------- trunk/IRCSock.cpp Modified: trunk/IRCSock.cpp =================================================================== --- trunk/IRCSock.cpp 2008-07-20 15:06:33 UTC (rev 1139) +++ trunk/IRCSock.cpp 2008-07-21 10:15:16 UTC (rev 1140) @@ -393,10 +393,7 @@ CChan* pChan = m_pUser->FindChan(sRest.Token(0)); if (pChan) { - if (!pChan->IsOn()) { - pChan->SetIsOn(true); - PutIRC("MODE " + pChan->GetName()); - + if (pChan->IsOn()) { // If we are the only one in the chan, set our default modes if (pChan->GetNickCount() == 1) { CString sModes = pChan->GetDefaultModes(); @@ -510,6 +507,9 @@ if (pChan) { pChan->ResetJoinTries(); pChan->Enable(); + pChan->SetIsOn(true); + PutIRC("MODE " + pChan->GetName()); + } } else { pChan = m_pUser->FindChan(sChan); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sil...@us...> - 2008-12-29 18:43:49
|
Revision: 1309 http://znc.svn.sourceforge.net/znc/?rev=1309&view=rev Author: silverleo Date: 2008-12-29 18:43:47 +0000 (Mon, 29 Dec 2008) Log Message: ----------- Block pong replies that we requested. Modified Paths: -------------- trunk/IRCSock.cpp Modified: trunk/IRCSock.cpp =================================================================== --- trunk/IRCSock.cpp 2008-12-29 18:11:17 UTC (rev 1308) +++ trunk/IRCSock.cpp 2008-12-29 18:43:47 UTC (rev 1309) @@ -81,6 +81,9 @@ if (sLine.Equals("PING ", false, 5)) { PutIRC("PONG " + sLine.substr(5)); + } else if (sLine.Token(1).Equals("PONG") && sLine.Token(3).Equals(":ZNC")) { + // We asked for this so don't forward the reply to clients. + return; } else if (sLine.Equals("ERROR ", false, 6)) { //ERROR :Closing Link: nick[24.24.24.24] (Excess Flood) CString sError(sLine.substr(7)); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2009-01-09 17:22:28
|
Revision: 1325 http://znc.svn.sourceforge.net/znc/?rev=1325&view=rev Author: psychon Date: 2009-01-09 17:22:15 +0000 (Fri, 09 Jan 2009) Log Message: ----------- Update channel buffers for detached channels Now ZNC produces a normal buffer playback if you re-attach a detached channel. Modified Paths: -------------- trunk/IRCSock.cpp Modified: trunk/IRCSock.cpp =================================================================== --- trunk/IRCSock.cpp 2009-01-08 15:57:32 UTC (rev 1324) +++ trunk/IRCSock.cpp 2009-01-09 17:22:15 UTC (rev 1325) @@ -727,7 +727,7 @@ if (pChan) { // Record a /me if (sMessage.TrimPrefix("ACTION ")) { - if (pChan->KeepBuffer() || !m_pUser->IsUserAttached()) { + if (pChan->KeepBuffer() || !m_pUser->IsUserAttached() || pChan->IsDetached()) { pChan->AddBuffer(":" + Nick.GetNickMask() + " PRIVMSG " + sChan + " :\001ACTION " + m_pUser->AddTimestamp(sMessage) + "\001"); } MODULECALL(OnChanAction(Nick, *pChan, sMessage), m_pUser, NULL, return true); @@ -747,7 +747,7 @@ if (pChan) { MODULECALL(OnChanNotice(Nick, *pChan, sMessage), m_pUser, NULL, return true); - if ((pChan->KeepBuffer()) || (!m_pUser->IsUserAttached())) { + if (pChan->KeepBuffer() || !m_pUser->IsUserAttached() || pChan->IsDetached()) { pChan->AddBuffer(":" + Nick.GetNickMask() + " NOTICE " + sChan + " :" + m_pUser->AddTimestamp(sMessage)); } } @@ -760,7 +760,7 @@ if (pChan) { MODULECALL(OnChanMsg(Nick, *pChan, sMessage), m_pUser, NULL, return true); - if (pChan->KeepBuffer() || !m_pUser->IsUserAttached()) { + if (pChan->KeepBuffer() || !m_pUser->IsUserAttached() || pChan->IsDetached()) { pChan->AddBuffer(":" + Nick.GetNickMask() + " PRIVMSG " + sChan + " :" + m_pUser->AddTimestamp(sMessage)); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2009-01-11 08:47:40
|
Revision: 1327 http://znc.svn.sourceforge.net/znc/?rev=1327&view=rev Author: psychon Date: 2009-01-11 08:47:27 +0000 (Sun, 11 Jan 2009) Log Message: ----------- Handle JOIN redirects due to +L Without this, ZNC would keep trying to join the channel which is full and which caused the redirect. Modified Paths: -------------- trunk/IRCSock.cpp Modified: trunk/IRCSock.cpp =================================================================== --- trunk/IRCSock.cpp 2009-01-10 10:12:10 UTC (rev 1326) +++ trunk/IRCSock.cpp 2009-01-11 08:47:27 UTC (rev 1327) @@ -156,6 +156,23 @@ case 376: // end motd m_pUser->AddMotdBuffer(":" + sServer + " " + sCmd + " ", " " + sRest); break; + case 470: { + // :irc.unreal.net 470 mynick [Link] #chan1 has become full, so you are automatically being transferred to the linked channel #chan2 + // :mccaffrey.freenode.net 470 mynick #electronics ##electronics :Forwarding to another channel + + // freenode style numeric + CChan* pChan = m_pUser->FindChan(sRest.Token(0)); + if (!pChan) { + // unreal style numeric + pChan = m_pUser->FindChan(sRest.Token(1)); + } + if (pChan) { + pChan->Disable(); + m_pUser->PutStatus("Channel [" + pChan->GetName() + "] is linked to " + "another channel and was thus disabled."); + } + break; + } case 437: // :irc.server.net 437 * badnick :Nick/channel is temporarily unavailable // :irc.server.net 437 mynick badnick :Nick/channel is temporarily unavailable This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2009-02-03 18:21:36
|
Revision: 1367 http://znc.svn.sourceforge.net/znc/?rev=1367&view=rev Author: psychon Date: 2009-02-03 18:21:33 +0000 (Tue, 03 Feb 2009) Log Message: ----------- Improve the error messages we give for failed connect attempts... again EADDRNOTAVAIL is generated for these failed vhosts instead of EDOM as it did before. Yay for Csocket. Modified Paths: -------------- trunk/IRCSock.cpp Modified: trunk/IRCSock.cpp =================================================================== --- trunk/IRCSock.cpp 2009-02-03 18:18:05 UTC (rev 1366) +++ trunk/IRCSock.cpp 2009-02-03 18:21:33 UTC (rev 1367) @@ -836,8 +836,12 @@ sError = "Your VHost could not be resolved"; } else if (iErrno == EADDRNOTAVAIL) { // Csocket uses this if it can't resolve the dest host name + // ...but it also does generate this if bind() fails -.- sError = strerror(iErrno); - sError += " (Is your IRC server's host name valid?)"; + if (GetBindHost().empty()) + sError += " (Is your IRC server's host name valid?)"; + else + sError += " (Is your IRC server's host name and vhost valid?)"; } else { sError = strerror(iErrno); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2009-03-01 14:22:42
|
Revision: 1405 http://znc.svn.sourceforge.net/znc/?rev=1405&view=rev Author: psychon Date: 2009-03-01 13:07:11 +0000 (Sun, 01 Mar 2009) Log Message: ----------- Only add WALLOPS to the buffer if no client is attached Thanks to flakes for finding this. Modified Paths: -------------- trunk/IRCSock.cpp Modified: trunk/IRCSock.cpp =================================================================== --- trunk/IRCSock.cpp 2009-02-27 20:58:34 UTC (rev 1404) +++ trunk/IRCSock.cpp 2009-03-01 13:07:11 UTC (rev 1405) @@ -614,7 +614,9 @@ sMsg.LeftChomp(); } - m_pUser->AddQueryBuffer(":" + Nick.GetNickMask() + " WALLOPS ", ":" + m_pUser->AddTimestamp(sMsg), false); + if (!m_pUser->IsUserAttached()) { + m_pUser->AddQueryBuffer(":" + Nick.GetNickMask() + " WALLOPS ", ":" + m_pUser->AddTimestamp(sMsg), false); + } } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sil...@us...> - 2009-03-13 17:24:51
|
Revision: 1425 http://znc.svn.sourceforge.net/znc/?rev=1425&view=rev Author: silverleo Date: 2009-03-13 17:24:36 +0000 (Fri, 13 Mar 2009) Log Message: ----------- Added raw 432 processing for illegal and erroneous nicks and changed the condition to trigger SendAltNick() since ircds like to interpret the standards. Modified Paths: -------------- trunk/IRCSock.cpp Modified: trunk/IRCSock.cpp =================================================================== --- trunk/IRCSock.cpp 2009-03-11 21:11:58 UTC (rev 1424) +++ trunk/IRCSock.cpp 2009-03-13 17:24:36 UTC (rev 1425) @@ -179,11 +179,12 @@ // :irc.server.net 437 mynick badnick :Cannot change nickname while banned on channel if (m_pUser->IsChan(sRest.Token(0)) || sNick != "*") break; + case 432: // :irc.server.com 432 * nick :Erroneous Nickname: Illegal characters case 433: { CString sBadNick = sRest.Token(0); CString sConfNick = m_pUser->GetNick().Left(GetMaxNickLen()); - if (sNick == "*") { + if (!m_bAuthed) { SendAltNick(sBadNick); return; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2009-05-29 20:30:20
|
Revision: 1528 http://znc.svn.sourceforge.net/znc/?rev=1528&view=rev Author: psychon Date: 2009-05-29 20:29:18 +0000 (Fri, 29 May 2009) Log Message: ----------- Remove some useless check The code checked if every line received from the IRC server started with a colon and contained at least two spaces using a wildcard comparison. Since not doing this would violate the IRC specs, we can safely assume this. This command removes this if and reindents a shitload of code. The only change in there is a removed comment, everything else should be the same. Modified Paths: -------------- trunk/IRCSock.cpp Modified: trunk/IRCSock.cpp =================================================================== --- trunk/IRCSock.cpp 2009-05-29 20:26:37 UTC (rev 1527) +++ trunk/IRCSock.cpp 2009-05-29 20:29:18 UTC (rev 1528) @@ -91,533 +91,533 @@ } m_pUser->PutStatus("Error from Server [" + sError + "]"); - } else if (sLine.WildCmp(":* * *")) { //"^:(\\S+) (\\d\\d\\d) (.*?) (.*)$", vCap)) { - CString sCmd = sLine.Token(1); + } - if ((sCmd.length() == 3) && (isdigit(sCmd[0])) && (isdigit(sCmd[1])) && (isdigit(sCmd[2]))) { - CString sServer = sLine.Token(0); sServer.LeftChomp(); - unsigned int uRaw = sCmd.ToUInt(); - CString sNick = sLine.Token(2); - CString sRest = sLine.Token(3, true); + CString sCmd = sLine.Token(1); - switch (uRaw) { - case 1: {// :irc.server.com 001 nick :Welcome to the Internet Relay Network nick - m_pUser->SetIRCServer(sServer); - SetTimeout(240, TMO_READ); // Now that we are connected, let nature take its course - PutIRC("WHO " + sNick); + if ((sCmd.length() == 3) && (isdigit(sCmd[0])) && (isdigit(sCmd[1])) && (isdigit(sCmd[2]))) { + CString sServer = sLine.Token(0); sServer.LeftChomp(); + unsigned int uRaw = sCmd.ToUInt(); + CString sNick = sLine.Token(2); + CString sRest = sLine.Token(3, true); - m_bAuthed = true; - m_pUser->PutStatus("Connected!"); + switch (uRaw) { + case 1: {// :irc.server.com 001 nick :Welcome to the Internet Relay Network nick + m_pUser->SetIRCServer(sServer); + SetTimeout(240, TMO_READ); // Now that we are connected, let nature take its course + PutIRC("WHO " + sNick); - vector<CClient*>& vClients = m_pUser->GetClients(); + m_bAuthed = true; + m_pUser->PutStatus("Connected!"); - for (unsigned int a = 0; a < vClients.size(); a++) { - CClient* pClient = vClients[a]; - CString sClientNick = pClient->GetNick(false); + vector<CClient*>& vClients = m_pUser->GetClients(); - if (!sClientNick.Equals(sNick)) { - // If they connected with a nick that doesn't match the one we got on irc, then we need to update them - pClient->PutClient(":" + sClientNick + "!" + m_Nick.GetIdent() + "@" + m_Nick.GetHost() + " NICK :" + sNick); - } + for (unsigned int a = 0; a < vClients.size(); a++) { + CClient* pClient = vClients[a]; + CString sClientNick = pClient->GetNick(false); + + if (!sClientNick.Equals(sNick)) { + // If they connected with a nick that doesn't match the one we got on irc, then we need to update them + pClient->PutClient(":" + sClientNick + "!" + m_Nick.GetIdent() + "@" + m_Nick.GetHost() + " NICK :" + sNick); } + } - SetNick(sNick); + SetNick(sNick); - MODULECALL(OnIRCConnected(), m_pUser, NULL, ); + MODULECALL(OnIRCConnected(), m_pUser, NULL, ); - m_pUser->ClearRawBuffer(); - m_pUser->AddRawBuffer(":" + sServer + " " + sCmd + " ", " " + sRest); + m_pUser->ClearRawBuffer(); + m_pUser->AddRawBuffer(":" + sServer + " " + sCmd + " ", " " + sRest); - CZNC::Get().ReleaseISpoof(); - m_bISpoofReleased = true; + CZNC::Get().ReleaseISpoof(); + m_bISpoofReleased = true; - break; + break; + } + case 5: + ParseISupport(sRest); + m_pUser->AddRawBuffer(":" + sServer + " " + sCmd + " ", " " + sRest); + break; + case 2: + case 3: + case 4: + case 250: // highest connection count + case 251: // user count + case 252: // oper count + case 254: // channel count + case 255: // client count + case 265: // local users + case 266: // global users + m_pUser->UpdateRawBuffer(":" + sServer + " " + sCmd + " ", " " + sRest); + break; + case 422: // MOTD File is missing + case 375: // begin motd + m_pUser->ClearMotdBuffer(); + case 372: // motd + case 376: // end motd + m_pUser->AddMotdBuffer(":" + sServer + " " + sCmd + " ", " " + sRest); + break; + case 470: { + // :irc.unreal.net 470 mynick [Link] #chan1 has become full, so you are automatically being transferred to the linked channel #chan2 + // :mccaffrey.freenode.net 470 mynick #electronics ##electronics :Forwarding to another channel + + // freenode style numeric + CChan* pChan = m_pUser->FindChan(sRest.Token(0)); + if (!pChan) { + // unreal style numeric + pChan = m_pUser->FindChan(sRest.Token(1)); } - case 5: - ParseISupport(sRest); - m_pUser->AddRawBuffer(":" + sServer + " " + sCmd + " ", " " + sRest); + if (pChan) { + pChan->Disable(); + m_pUser->PutStatus("Channel [" + pChan->GetName() + "] is linked to " + "another channel and was thus disabled."); + } + break; + } + case 437: + // :irc.server.net 437 * badnick :Nick/channel is temporarily unavailable + // :irc.server.net 437 mynick badnick :Nick/channel is temporarily unavailable + // :irc.server.net 437 mynick badnick :Cannot change nickname while banned on channel + if (m_pUser->IsChan(sRest.Token(0)) || sNick != "*") break; - case 2: - case 3: - case 4: - case 250: // highest connection count - case 251: // user count - case 252: // oper count - case 254: // channel count - case 255: // client count - case 265: // local users - case 266: // global users - m_pUser->UpdateRawBuffer(":" + sServer + " " + sCmd + " ", " " + sRest); - break; - case 422: // MOTD File is missing - case 375: // begin motd - m_pUser->ClearMotdBuffer(); - case 372: // motd - case 376: // end motd - m_pUser->AddMotdBuffer(":" + sServer + " " + sCmd + " ", " " + sRest); - break; - case 470: { - // :irc.unreal.net 470 mynick [Link] #chan1 has become full, so you are automatically being transferred to the linked channel #chan2 - // :mccaffrey.freenode.net 470 mynick #electronics ##electronics :Forwarding to another channel + case 432: // :irc.server.com 432 * nick :Erroneous Nickname: Illegal characters + case 433: { + CString sBadNick = sRest.Token(0); - // freenode style numeric - CChan* pChan = m_pUser->FindChan(sRest.Token(0)); - if (!pChan) { - // unreal style numeric - pChan = m_pUser->FindChan(sRest.Token(1)); - } - if (pChan) { - pChan->Disable(); - m_pUser->PutStatus("Channel [" + pChan->GetName() + "] is linked to " - "another channel and was thus disabled."); - } - break; + if (!m_bAuthed) { + SendAltNick(sBadNick); + return; } - case 437: - // :irc.server.net 437 * badnick :Nick/channel is temporarily unavailable - // :irc.server.net 437 mynick badnick :Nick/channel is temporarily unavailable - // :irc.server.net 437 mynick badnick :Cannot change nickname while banned on channel - if (m_pUser->IsChan(sRest.Token(0)) || sNick != "*") - break; - case 432: // :irc.server.com 432 * nick :Erroneous Nickname: Illegal characters - case 433: { - CString sBadNick = sRest.Token(0); + break; + } + case 331: { + // :irc.server.com 331 yournick #chan :No topic is set. + CChan* pChan = m_pUser->FindChan(sLine.Token(3)); - if (!m_bAuthed) { - SendAltNick(sBadNick); - return; - } - break; + if (pChan) { + pChan->SetTopic(""); } - case 331: { - // :irc.server.com 331 yournick #chan :No topic is set. - CChan* pChan = m_pUser->FindChan(sLine.Token(3)); - if (pChan) { - pChan->SetTopic(""); - } + break; + } + case 332: { + // :irc.server.com 332 yournick #chan :This is a topic + CChan* pChan = m_pUser->FindChan(sLine.Token(3)); - break; + if (pChan) { + CString sTopic = sLine.Token(4, true); + sTopic.LeftChomp(); + pChan->SetTopic(sTopic); } - case 332: { - // :irc.server.com 332 yournick #chan :This is a topic - CChan* pChan = m_pUser->FindChan(sLine.Token(3)); - if (pChan) { - CString sTopic = sLine.Token(4, true); - sTopic.LeftChomp(); - pChan->SetTopic(sTopic); - } + break; + } + case 333: { + // :irc.server.com 333 yournick #chan setternick 1112320796 + CChan* pChan = m_pUser->FindChan(sLine.Token(3)); - break; + if (pChan) { + sNick = sLine.Token(4); + unsigned long ulDate = sLine.Token(5).ToULong(); + + pChan->SetTopicOwner(sNick); + pChan->SetTopicDate(ulDate); } - case 333: { - // :irc.server.com 333 yournick #chan setternick 1112320796 - CChan* pChan = m_pUser->FindChan(sLine.Token(3)); - if (pChan) { - sNick = sLine.Token(4); - unsigned long ulDate = sLine.Token(5).ToULong(); + break; + } + case 352: { + // :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 sIdent = sLine.Token(4); + CString sHost = sLine.Token(5); - pChan->SetTopicOwner(sNick); - pChan->SetTopicDate(ulDate); - } + sServer.LeftChomp(); - break; + if (sNick.Equals(GetNick())) { + m_Nick.SetIdent(sIdent); + m_Nick.SetHost(sHost); } - case 352: { - // :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 sIdent = sLine.Token(4); - CString sHost = sLine.Token(5); - sServer.LeftChomp(); + m_pUser->SetIRCNick(m_Nick); + m_pUser->SetIRCServer(sServer); - if (sNick.Equals(GetNick())) { - m_Nick.SetIdent(sIdent); - m_Nick.SetHost(sHost); - } + const vector<CChan*>& vChans = m_pUser->GetChans(); - m_pUser->SetIRCNick(m_Nick); - m_pUser->SetIRCServer(sServer); + for (unsigned int a = 0; a < vChans.size(); a++) { + vChans[a]->OnWho(sNick, sIdent, sHost); + } - const vector<CChan*>& vChans = m_pUser->GetChans(); + break; + } + case 324: { // MODE + sRest.Trim(); + CChan* pChan = m_pUser->FindChan(sRest.Token(0)); - for (unsigned int a = 0; a < vChans.size(); a++) { - vChans[a]->OnWho(sNick, sIdent, sHost); - } + if (pChan) { + pChan->SetModes(sRest.Token(1, true)); + } + } + break; + case 329: { + sRest.Trim(); + CChan* pChan = m_pUser->FindChan(sRest.Token(0)); - break; + if (pChan) { + unsigned long ulDate = sLine.Token(4).ToULong(); + pChan->SetCreationDate(ulDate); } - case 324: { // MODE - sRest.Trim(); - CChan* pChan = m_pUser->FindChan(sRest.Token(0)); - - if (pChan) { - pChan->SetModes(sRest.Token(1, true)); + } + break; + case 353: { // NAMES + sRest.Trim(); + // Todo: allow for non @+= server msgs + CChan* pChan = m_pUser->FindChan(sRest.Token(1)); + // If we don't know that channel, some client might have + // requested a /names for it and we really should forward this. + if (pChan) { + CString sNicks = sRest.Token(2, true); + if (sNicks.Left(1) == ":") { + sNicks.LeftChomp(); } - } - break; - case 329: { - sRest.Trim(); - CChan* pChan = m_pUser->FindChan(sRest.Token(0)); - if (pChan) { - unsigned long ulDate = sLine.Token(4).ToULong(); - pChan->SetCreationDate(ulDate); - } + pChan->AddNicks(sNicks); } - break; - case 353: { // NAMES - sRest.Trim(); - // Todo: allow for non @+= server msgs - CChan* pChan = m_pUser->FindChan(sRest.Token(1)); - // If we don't know that channel, some client might have - // requested a /names for it and we really should forward this. - if (pChan) { - CString sNicks = sRest.Token(2, true); - if (sNicks.Left(1) == ":") { - sNicks.LeftChomp(); - } - pChan->AddNicks(sNicks); - } + ForwardRaw353(sLine); - ForwardRaw353(sLine); + // We forwarded it already, so return + return; + } + case 366: { // end of names list + m_pUser->PutUser(sLine); // First send them the raw - // We forwarded it already, so return - return; - } - case 366: { // end of names list - m_pUser->PutUser(sLine); // First send them the raw + // :irc.server.com 366 nick #chan :End of /NAMES list. + CChan* pChan = m_pUser->FindChan(sRest.Token(0)); - // :irc.server.com 366 nick #chan :End of /NAMES list. - CChan* pChan = m_pUser->FindChan(sRest.Token(0)); + if (pChan) { + if (pChan->IsOn()) { + // If we are the only one in the chan, set our default modes + if (pChan->GetNickCount() == 1) { + CString sModes = pChan->GetDefaultModes(); - if (pChan) { - if (pChan->IsOn()) { - // If we are the only one in the chan, set our default modes - if (pChan->GetNickCount() == 1) { - CString sModes = pChan->GetDefaultModes(); + if (sModes.empty()) { + sModes = m_pUser->GetDefaultChanModes(); + } - if (sModes.empty()) { - sModes = m_pUser->GetDefaultChanModes(); - } - - if (!sModes.empty()) { - PutIRC("MODE " + pChan->GetName() + " " + sModes); - } + if (!sModes.empty()) { + PutIRC("MODE " + pChan->GetName() + " " + sModes); } } } + } - return; // return so we don't send them the raw twice - } + return; // return so we don't send them the raw twice } - } else { //if (CUtils::wildcmp(":*!*@* * *", sLine.c_str())) { - CNick Nick(sLine.Token(0).LeftChomp_n()); - sCmd = sLine.Token(1); - CString sRest = sLine.Token(2, true); + } + } else { + CNick Nick(sLine.Token(0).LeftChomp_n()); + sCmd = sLine.Token(1); + CString sRest = sLine.Token(2, true); - if (sCmd.Equals("NICK")) { - CString sNewNick = sRest; - bool bIsVisible = false; + if (sCmd.Equals("NICK")) { + CString sNewNick = sRest; + bool bIsVisible = false; - if (sNewNick.Left(1) == ":") { - sNewNick.LeftChomp(); - } + if (sNewNick.Left(1) == ":") { + sNewNick.LeftChomp(); + } - vector<CChan*> vFoundChans; - const vector<CChan*>& vChans = m_pUser->GetChans(); + vector<CChan*> vFoundChans; + const vector<CChan*>& vChans = m_pUser->GetChans(); - for (unsigned int a = 0; a < vChans.size(); a++) { - CChan* pChan = vChans[a]; + for (unsigned int a = 0; a < vChans.size(); a++) { + CChan* pChan = vChans[a]; - if (pChan->ChangeNick(Nick.GetNick(), sNewNick)) { - vFoundChans.push_back(pChan); + if (pChan->ChangeNick(Nick.GetNick(), sNewNick)) { + vFoundChans.push_back(pChan); - if (!pChan->IsDetached()) { - bIsVisible = true; - } + if (!pChan->IsDetached()) { + bIsVisible = true; } } + } - // Todo: use nick compare function here - if (Nick.GetNick().Equals(GetNick())) { - // We are changing our own nick, the clients always must see this! - bIsVisible = true; - SetNick(sNewNick); - } + // Todo: use nick compare function here + if (Nick.GetNick().Equals(GetNick())) { + // We are changing our own nick, the clients always must see this! + bIsVisible = true; + SetNick(sNewNick); + } - MODULECALL(OnNick(Nick, sNewNick, vFoundChans), m_pUser, NULL, ); + MODULECALL(OnNick(Nick, sNewNick, vFoundChans), m_pUser, NULL, ); - if (!bIsVisible) { - return; - } - } else if (sCmd.Equals("QUIT")) { - CString sMessage = sRest; - bool bIsVisible = false; + if (!bIsVisible) { + return; + } + } else if (sCmd.Equals("QUIT")) { + CString sMessage = sRest; + bool bIsVisible = false; - if (sMessage.Left(1) == ":") { - sMessage.LeftChomp(); - } + if (sMessage.Left(1) == ":") { + sMessage.LeftChomp(); + } - // :nick!id...@ho... QUIT :message + // :nick!id...@ho... QUIT :message - if (Nick.GetNick().Equals(GetNick())) { - m_pUser->PutStatus("You quit [" + sMessage + "]"); - } + if (Nick.GetNick().Equals(GetNick())) { + m_pUser->PutStatus("You quit [" + sMessage + "]"); + } - vector<CChan*> vFoundChans; - const vector<CChan*>& vChans = m_pUser->GetChans(); + vector<CChan*> vFoundChans; + const vector<CChan*>& vChans = m_pUser->GetChans(); - for (unsigned int a = 0; a < vChans.size(); a++) { - CChan* pChan = vChans[a]; + for (unsigned int a = 0; a < vChans.size(); a++) { + CChan* pChan = vChans[a]; - if (pChan->RemNick(Nick.GetNick())) { - vFoundChans.push_back(pChan); + if (pChan->RemNick(Nick.GetNick())) { + vFoundChans.push_back(pChan); - if (!pChan->IsDetached()) { - bIsVisible = true; - } + if (!pChan->IsDetached()) { + bIsVisible = true; } } + } - MODULECALL(OnQuit(Nick, sMessage, vFoundChans), m_pUser, NULL, ); + MODULECALL(OnQuit(Nick, sMessage, vFoundChans), m_pUser, NULL, ); - if (!bIsVisible) { - return; - } - } else if (sCmd.Equals("JOIN")) { - CString sChan = sRest.Token(0); - if (sChan.Left(1) == ":") { - sChan.LeftChomp(); - } + if (!bIsVisible) { + return; + } + } else if (sCmd.Equals("JOIN")) { + CString sChan = sRest.Token(0); + if (sChan.Left(1) == ":") { + sChan.LeftChomp(); + } - CChan* pChan; + CChan* pChan; - // Todo: use nick compare function - if (Nick.GetNick().Equals(GetNick())) { - m_pUser->AddChan(sChan, false); - pChan = m_pUser->FindChan(sChan); - if (pChan) { - pChan->ResetJoinTries(); - pChan->Enable(); - pChan->SetIsOn(true); - PutIRC("MODE " + pChan->GetName()); + // Todo: use nick compare function + if (Nick.GetNick().Equals(GetNick())) { + m_pUser->AddChan(sChan, false); + pChan = m_pUser->FindChan(sChan); + if (pChan) { + pChan->ResetJoinTries(); + pChan->Enable(); + pChan->SetIsOn(true); + PutIRC("MODE " + pChan->GetName()); - } - } else { - pChan = m_pUser->FindChan(sChan); } + } else { + pChan = m_pUser->FindChan(sChan); + } - if (pChan) { - pChan->AddNick(Nick.GetNickMask()); - MODULECALL(OnJoin(Nick.GetNickMask(), *pChan), m_pUser, NULL, ); + if (pChan) { + pChan->AddNick(Nick.GetNickMask()); + MODULECALL(OnJoin(Nick.GetNickMask(), *pChan), m_pUser, NULL, ); - if (pChan->IsDetached()) { - return; - } + if (pChan->IsDetached()) { + return; } - } else if (sCmd.Equals("PART")) { - CString sChan = sRest.Token(0); - if (sChan.Left(1) == ":") { - sChan.LeftChomp(); - } + } + } else if (sCmd.Equals("PART")) { + CString sChan = sRest.Token(0); + if (sChan.Left(1) == ":") { + sChan.LeftChomp(); + } - CChan* pChan = m_pUser->FindChan(sChan); - bool bDetached = false; - if (pChan) { - pChan->RemNick(Nick.GetNick()); - MODULECALL(OnPart(Nick.GetNickMask(), *pChan), m_pUser, NULL, ); + CChan* pChan = m_pUser->FindChan(sChan); + bool bDetached = false; + if (pChan) { + pChan->RemNick(Nick.GetNick()); + MODULECALL(OnPart(Nick.GetNickMask(), *pChan), m_pUser, NULL, ); - if (pChan->IsDetached()) - bDetached = true; - } + if (pChan->IsDetached()) + bDetached = true; + } - // Todo: use nick compare function - if (Nick.GetNick().Equals(GetNick())) { - m_pUser->DelChan(sChan); - } + // Todo: use nick compare function + if (Nick.GetNick().Equals(GetNick())) { + m_pUser->DelChan(sChan); + } - /* - * We use this boolean because - * m_pUser->DelChan() will delete this channel - * and thus we would dereference an - * already-freed pointer! - */ - if (bDetached) { + /* + * We use this boolean because + * m_pUser->DelChan() will delete this channel + * and thus we would dereference an + * already-freed pointer! + */ + if (bDetached) { + return; + } + } else if (sCmd.Equals("MODE")) { + CString sTarget = sRest.Token(0); + CString sModes = sRest.Token(1, true); + if (sModes.Left(1) == ":") + sModes = sModes.substr(1); + + CChan* pChan = m_pUser->FindChan(sTarget); + if (pChan) { + pChan->ModeChange(sModes, Nick.GetNick()); + + if (pChan->IsDetached()) { return; } - } else if (sCmd.Equals("MODE")) { - CString sTarget = sRest.Token(0); - CString sModes = sRest.Token(1, true); - if (sModes.Left(1) == ":") - sModes = sModes.substr(1); - - 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); + } 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; + bool bAdd = true; /* no module call defined (yet?) - MODULECALL(OnRawUserMode(*pOpNick, *this, sModeArg, sArgs), m_pUser, NULL, ); + MODULECALL(OnRawUserMode(*pOpNick, *this, sModeArg, sArgs), m_pUser, NULL, ); */ - for (unsigned int a = 0; a < sModeArg.size(); a++) { - const unsigned char& uMode = sModeArg[a]; + for (unsigned int a = 0; a < sModeArg.size(); a++) { + const unsigned char& uMode = sModeArg[a]; - if (uMode == '+') { - bAdd = true; - } else if (uMode == '-') { - bAdd = false; + if (uMode == '+') { + bAdd = true; + } else if (uMode == '-') { + bAdd = false; + } else { + if (bAdd) { + m_scUserModes.insert(uMode); } else { - if (bAdd) { - m_scUserModes.insert(uMode); - } else { - m_scUserModes.erase(uMode); - } + m_scUserModes.erase(uMode); } } } - } else if (sCmd.Equals("KICK")) { - // :opnick!id...@ho... KICK #chan nick :msg - CString sChan = sRest.Token(0); - CString sKickedNick = sRest.Token(1); - CString sMsg = sRest.Token(2, true); - sMsg.LeftChomp(); + } + } else if (sCmd.Equals("KICK")) { + // :opnick!id...@ho... KICK #chan nick :msg + CString sChan = sRest.Token(0); + CString sKickedNick = sRest.Token(1); + CString sMsg = sRest.Token(2, true); + sMsg.LeftChomp(); - CChan* pChan = m_pUser->FindChan(sChan); + CChan* pChan = m_pUser->FindChan(sChan); - if (pChan) { - pChan->RemNick(sKickedNick); - MODULECALL(OnKick(Nick.GetNickMask(), sKickedNick, *pChan, sMsg), m_pUser, NULL, ); - } + if (pChan) { + pChan->RemNick(sKickedNick); + MODULECALL(OnKick(Nick.GetNickMask(), sKickedNick, *pChan, sMsg), m_pUser, NULL, ); + } - if (GetNick().Equals(sKickedNick) && pChan) { - pChan->SetIsOn(false); + if (GetNick().Equals(sKickedNick) && pChan) { + pChan->SetIsOn(false); - // Don't try to rejoin! - pChan->Disable(); - } + // Don't try to rejoin! + pChan->Disable(); + } - if ((pChan) && (pChan->IsDetached())) { - return; - } - } else if (sCmd.Equals("NOTICE")) { - // :nick!id...@ho... NOTICE #chan :Message - CString sTarget = sRest.Token(0); - CString sMsg = sRest.Token(1, true); + if ((pChan) && (pChan->IsDetached())) { + return; + } + } else if (sCmd.Equals("NOTICE")) { + // :nick!id...@ho... NOTICE #chan :Message + CString sTarget = sRest.Token(0); + CString sMsg = sRest.Token(1, true); + sMsg.LeftChomp(); + + if (sMsg.WildCmp("\001*\001")) { sMsg.LeftChomp(); + sMsg.RightChomp(); - if (sMsg.WildCmp("\001*\001")) { - sMsg.LeftChomp(); - sMsg.RightChomp(); + if (sTarget.Equals(GetNick())) { + if (OnCTCPReply(Nick, sMsg)) { + return; + } + } - if (sTarget.Equals(GetNick())) { - if (OnCTCPReply(Nick, sMsg)) { - return; - } + m_pUser->PutUser(":" + Nick.GetNickMask() + " NOTICE " + sTarget + " :\001" + sMsg + "\001"); + return; + } else { + if (sTarget.Equals(GetNick())) { + if (OnPrivNotice(Nick, sMsg)) { + return; } - - m_pUser->PutUser(":" + Nick.GetNickMask() + " NOTICE " + sTarget + " :\001" + sMsg + "\001"); - return; } else { - if (sTarget.Equals(GetNick())) { - if (OnPrivNotice(Nick, sMsg)) { - return; - } - } else { - if (OnChanNotice(Nick, sTarget, sMsg)) { - return; - } + if (OnChanNotice(Nick, sTarget, sMsg)) { + return; } } + } - if (Nick.GetNick().Equals(m_pUser->GetIRCServer())) { - m_pUser->PutUser(":" + Nick.GetNick() + " NOTICE " + sTarget + " :" + sMsg); - } else { - m_pUser->PutUser(":" + Nick.GetNickMask() + " NOTICE " + sTarget + " :" + sMsg); - } + if (Nick.GetNick().Equals(m_pUser->GetIRCServer())) { + m_pUser->PutUser(":" + Nick.GetNick() + " NOTICE " + sTarget + " :" + sMsg); + } else { + m_pUser->PutUser(":" + Nick.GetNickMask() + " NOTICE " + sTarget + " :" + sMsg); + } - return; - } else if (sCmd.Equals("TOPIC")) { - // :nick!id...@ho... TOPIC #chan :This is a topic - CChan* pChan = m_pUser->FindChan(sLine.Token(2)); + return; + } else if (sCmd.Equals("TOPIC")) { + // :nick!id...@ho... TOPIC #chan :This is a topic + CChan* pChan = m_pUser->FindChan(sLine.Token(2)); - if (pChan) { - CString sTopic = sLine.Token(3, true); - sTopic.LeftChomp(); + if (pChan) { + CString sTopic = sLine.Token(3, true); + sTopic.LeftChomp(); - MODULECALL(OnTopic(Nick, *pChan, sTopic), m_pUser, NULL, return) + MODULECALL(OnTopic(Nick, *pChan, sTopic), m_pUser, NULL, return) - pChan->SetTopicOwner(Nick.GetNick()); - pChan->SetTopicDate((unsigned long) time(NULL)); - pChan->SetTopic(sTopic); + pChan->SetTopicOwner(Nick.GetNick()); + pChan->SetTopicDate((unsigned long) time(NULL)); + pChan->SetTopic(sTopic); - if (pChan->IsDetached()) { - return; // Don't forward this - } - - sLine = ":" + Nick.GetNickMask() + " TOPIC " + pChan->GetName() + " :" + sTopic; + if (pChan->IsDetached()) { + return; // Don't forward this } - } else if (sCmd.Equals("PRIVMSG")) { - // :nick!id...@ho... PRIVMSG #chan :Message - CString sTarget = sRest.Token(0); - CString sMsg = sRest.Token(1, true); - if (sMsg.Left(1) == ":") { - sMsg.LeftChomp(); - } + sLine = ":" + Nick.GetNickMask() + " TOPIC " + pChan->GetName() + " :" + sTopic; + } + } else if (sCmd.Equals("PRIVMSG")) { + // :nick!id...@ho... PRIVMSG #chan :Message + CString sTarget = sRest.Token(0); + CString sMsg = sRest.Token(1, true); - if (sMsg.WildCmp("\001*\001")) { - sMsg.LeftChomp(); - sMsg.RightChomp(); + if (sMsg.Left(1) == ":") { + sMsg.LeftChomp(); + } - if (sTarget.Equals(GetNick())) { - if (OnPrivCTCP(Nick, sMsg)) { - return; - } - } else { - if (OnChanCTCP(Nick, sTarget, sMsg)) { - return; - } + if (sMsg.WildCmp("\001*\001")) { + sMsg.LeftChomp(); + sMsg.RightChomp(); + + if (sTarget.Equals(GetNick())) { + if (OnPrivCTCP(Nick, sMsg)) { + return; } - - m_pUser->PutUser(":" + Nick.GetNickMask() + " PRIVMSG " + sTarget + " :\001" + sMsg + "\001"); - return; } else { - if (sTarget.Equals(GetNick())) { - if (OnPrivMsg(Nick, sMsg)) { - return; - } - } else { - if (OnChanMsg(Nick, sTarget, sMsg)) { - return; - } + if (OnChanCTCP(Nick, sTarget, sMsg)) { + return; } - - m_pUser->PutUser(":" + Nick.GetNickMask() + " PRIVMSG " + sTarget + " :" + sMsg); - return; } - } else if (sCmd.Equals("WALLOPS")) { - // :blub!dummy@rox-8DBEFE92 WALLOPS :this is a test - CString sMsg = sRest.Token(0, true); - if (sMsg.Left(1) == ":") { - sMsg.LeftChomp(); + m_pUser->PutUser(":" + Nick.GetNickMask() + " PRIVMSG " + sTarget + " :\001" + sMsg + "\001"); + return; + } else { + if (sTarget.Equals(GetNick())) { + if (OnPrivMsg(Nick, sMsg)) { + return; + } + } else { + if (OnChanMsg(Nick, sTarget, sMsg)) { + return; + } } - if (!m_pUser->IsUserAttached()) { - m_pUser->AddQueryBuffer(":" + Nick.GetNickMask() + " WALLOPS ", ":" + m_pUser->AddTimestamp(sMsg), false); - } + m_pUser->PutUser(":" + Nick.GetNickMask() + " PRIVMSG " + sTarget + " :" + sMsg); + return; } + } else if (sCmd.Equals("WALLOPS")) { + // :blub!dummy@rox-8DBEFE92 WALLOPS :this is a test + CString sMsg = sRest.Token(0, true); + + if (sMsg.Left(1) == ":") { + sMsg.LeftChomp(); + } + + if (!m_pUser->IsUserAttached()) { + m_pUser->AddQueryBuffer(":" + Nick.GetNickMask() + " WALLOPS ", ":" + m_pUser->AddTimestamp(sMsg), false); + } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2009-05-29 20:34:56
|
Revision: 1529 http://znc.svn.sourceforge.net/znc/?rev=1529&view=rev Author: psychon Date: 2009-05-29 20:33:45 +0000 (Fri, 29 May 2009) Log Message: ----------- Minor fixup Meh, there is a point in saving the file *before* generating a diff... Modified Paths: -------------- trunk/IRCSock.cpp Modified: trunk/IRCSock.cpp =================================================================== --- trunk/IRCSock.cpp 2009-05-29 20:29:18 UTC (rev 1528) +++ trunk/IRCSock.cpp 2009-05-29 20:33:45 UTC (rev 1529) @@ -79,6 +79,8 @@ if (sLine.Equals("PING ", false, 5)) { PutIRC("PONG " + sLine.substr(5)); + m_pUser->PutUser(sLine); + return; } else if (sLine.Equals("PONG ", false, 5) && sLine.Token(3).Equals(":ZNC")) { // We asked for this so don't forward the reply to clients. return; @@ -91,6 +93,7 @@ } m_pUser->PutStatus("Error from Server [" + sError + "]"); + return; } CString sCmd = sLine.Token(1); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2009-08-01 08:59:22
|
Revision: 1583 http://znc.svn.sourceforge.net/znc/?rev=1583&view=rev Author: psychon Date: 2009-08-01 08:59:06 +0000 (Sat, 01 Aug 2009) Log Message: ----------- Send a "remove all user mode" MODE to clients when we lose the irc connections Without this we could cause a client desync (ZNC still got the correct information). Bug reported by tomaw and patch provided by flakes, thanks. Modified Paths: -------------- trunk/IRCSock.cpp Modified: trunk/IRCSock.cpp =================================================================== --- trunk/IRCSock.cpp 2009-07-26 19:38:57 UTC (rev 1582) +++ trunk/IRCSock.cpp 2009-08-01 08:59:06 UTC (rev 1583) @@ -830,6 +830,19 @@ m_pUser->ClearMotdBuffer(); ResetChans(); + + // send a "reset user modes" cmd to the client. + // otherwise, on reconnect, it might think it still + // had user modes that it actually doesn't have. + CString sUserMode; + for (set<unsigned char>::const_iterator it = m_scUserModes.begin(); it != m_scUserModes.end(); it++) { + sUserMode += *it; + } + if (!sUserMode.empty()) { + m_pUser->PutUser(":" + m_pUser->GetIRCNick().GetNickMask() + " MODE " + m_pUser->GetIRCNick().GetNick() + " :-" + sUserMode); + } + + // also clear the user modes in our space: m_scUserModes.clear(); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2009-09-09 10:15:46
|
Revision: 1620 http://znc.svn.sourceforge.net/znc/?rev=1620&view=rev Author: psychon Date: 2009-09-09 10:15:36 +0000 (Wed, 09 Sep 2009) Log Message: ----------- Improve the AltNick handling Thanks to ViciousPotato for reporting that AltNicks were truncated to 9 characters. We assumed the server's maximum nick length to be 9 by default which made the code truncate the AltNick to 9 characters. Now we save the nick we sent last to the IRC server. If the server reports a "nick is already in use" with a nick shorter than we sent it, we assume this that the server truncated our nick to the allowed length and use this length for our retries (appending different characters to the default nick). Not all irc servers truncate the nick this way if it's too long, on those that don't this patch shouldn't cause any behavior change. Modified Paths: -------------- trunk/IRCSock.cpp Modified: trunk/IRCSock.cpp =================================================================== --- trunk/IRCSock.cpp 2009-09-08 20:44:12 UTC (rev 1619) +++ trunk/IRCSock.cpp 2009-09-09 10:15:36 UTC (rev 1620) @@ -816,6 +816,9 @@ PutIRC("NICK " + sNick); PutIRC("USER " + sIdent + " \"" + sIdent + "\" \"" + sIdent + "\" :" + sRealName); + + // SendAltNick() needs this + m_Nick.SetNick(sNick); } void CIRCSock::Disconnected() { @@ -1002,24 +1005,34 @@ } void CIRCSock::SendAltNick(const CString& sBadNick) { - const unsigned int uMax = GetMaxNickLen(); - const CString& sConfNick = m_pUser->GetNick().Left(uMax); - const CString& sAltNick = m_pUser->GetAltNick().Left(uMax); + const CString& sLastNick = m_Nick.GetNick(); - if (sBadNick.Equals(sConfNick)) { + // We don't know the maximum allowed nick length yet, but we know which + // nick we sent last. If sBadNick is shorter than that, we assume the + // server truncated our nick. + if (sBadNick.length() < sLastNick.length()) + m_uMaxNickLen = sBadNick.length(); + + unsigned int uMax = m_uMaxNickLen; + + const CString& sConfNick = m_pUser->GetNick(); + const CString& sAltNick = m_pUser->GetAltNick(); + CString sNewNick; + + if (sLastNick.Equals(sConfNick)) { if ((!sAltNick.empty()) && (!sConfNick.Equals(sAltNick))) { - PutIRC("NICK " + sAltNick); + sNewNick = sAltNick; } else { - PutIRC("NICK " + sConfNick.Left(uMax -1) + "-"); + sNewNick = sConfNick.Left(uMax - 1) + "-"; } - } else if (sBadNick.Equals(sAltNick)) { - PutIRC("NICK " + sConfNick.Left(uMax -1) + "-"); - } else if (sBadNick.Equals(CString(sConfNick.Left(uMax -1) + "-"))) { - PutIRC("NICK " + sConfNick.Left(uMax -1) + "|"); - } else if (sBadNick.Equals(CString(sConfNick.Left(uMax -1) + "|"))) { - PutIRC("NICK " + sConfNick.Left(uMax -1) + "^"); - } else if (sBadNick.Equals(CString(sConfNick.Left(uMax -1) + "^"))) { - PutIRC("NICK " + sConfNick.Left(uMax -1) + "a"); + } else if (sLastNick.Equals(sAltNick)) { + sNewNick = sConfNick.Left(uMax -1) + "-"; + } else if (sLastNick.Equals(CString(sConfNick.Left(uMax -1) + "-"))) { + sNewNick = sConfNick.Left(uMax -1) + "|"; + } else if (sLastNick.Equals(CString(sConfNick.Left(uMax -1) + "|"))) { + sNewNick = sConfNick.Left(uMax -1) + "^"; + } else if (sLastNick.Equals(CString(sConfNick.Left(uMax -1) + "^"))) { + sNewNick = sConfNick.Left(uMax -1) + "a"; } else { char cLetter = 0; if (sBadNick.empty()) { @@ -1036,9 +1049,10 @@ return; } - CString sSend = "NICK " + sConfNick.Left(uMax -1) + ++cLetter; - PutIRC(sSend); + sNewNick = sConfNick.Left(uMax -1) + ++cLetter; } + PutIRC("NICK " + sNewNick); + m_Nick.SetNick(sNewNick); } unsigned char CIRCSock::GetPermFromMode(unsigned char uMode) const { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2009-11-07 15:08:36
|
Revision: 1656 http://znc.svn.sourceforge.net/znc/?rev=1656&view=rev Author: psychon Date: 2009-11-07 15:08:27 +0000 (Sat, 07 Nov 2009) Log Message: ----------- Reorder the numerics in IRCSock.cpp They are now sorted (where possible). Modified Paths: -------------- trunk/IRCSock.cpp Modified: trunk/IRCSock.cpp =================================================================== --- trunk/IRCSock.cpp 2009-11-07 14:54:45 UTC (rev 1655) +++ trunk/IRCSock.cpp 2009-11-07 15:08:27 UTC (rev 1656) @@ -153,52 +153,31 @@ case 266: // global users m_pUser->UpdateRawBuffer(":" + sServer + " " + sCmd + " ", " " + sRest); break; - case 422: // MOTD File is missing - case 375: // begin motd - m_pUser->ClearMotdBuffer(); - case 372: // motd - case 376: // end motd - m_pUser->AddMotdBuffer(":" + sServer + " " + sCmd + " ", " " + sRest); + case 305: + m_pUser->SetIRCAway(false); break; - case 470: { - // :irc.unreal.net 470 mynick [Link] #chan1 has become full, so you are automatically being transferred to the linked channel #chan2 - // :mccaffrey.freenode.net 470 mynick #electronics ##electronics :Forwarding to another channel + case 306: + m_pUser->SetIRCAway(true); + break; + case 324: { // MODE + sRest.Trim(); + CChan* pChan = m_pUser->FindChan(sRest.Token(0)); - // freenode style numeric - CChan* pChan = m_pUser->FindChan(sRest.Token(0)); - if (!pChan) { - // unreal style numeric - pChan = m_pUser->FindChan(sRest.Token(1)); - } if (pChan) { - pChan->Disable(); - m_pUser->PutStatus("Channel [" + pChan->GetName() + "] is linked to " - "another channel and was thus disabled."); + pChan->SetModes(sRest.Token(1, true)); } + } break; - } - case 437: - // :irc.server.net 437 * badnick :Nick/channel is temporarily unavailable - // :irc.server.net 437 mynick badnick :Nick/channel is temporarily unavailable - // :irc.server.net 437 mynick badnick :Cannot change nickname while banned on channel - if (m_pUser->IsChan(sRest.Token(0)) || sNick != "*") - break; - case 432: // :irc.server.com 432 * nick :Erroneous Nickname: Illegal characters - case 433: { - CString sBadNick = sRest.Token(0); + case 329: { + sRest.Trim(); + CChan* pChan = m_pUser->FindChan(sRest.Token(0)); - if (!m_bAuthed) { - SendAltNick(sBadNick); - return; + if (pChan) { + unsigned long ulDate = sLine.Token(4).ToULong(); + pChan->SetCreationDate(ulDate); } - break; } - case 305: - m_pUser->SetIRCAway(false); break; - case 306: - m_pUser->SetIRCAway(true); - break; case 331: { // :irc.server.com 331 yournick #chan :No topic is set. CChan* pChan = m_pUser->FindChan(sLine.Token(3)); @@ -260,25 +239,6 @@ break; } - case 324: { // MODE - sRest.Trim(); - CChan* pChan = m_pUser->FindChan(sRest.Token(0)); - - if (pChan) { - pChan->SetModes(sRest.Token(1, true)); - } - } - break; - case 329: { - sRest.Trim(); - CChan* pChan = m_pUser->FindChan(sRest.Token(0)); - - if (pChan) { - unsigned long ulDate = sLine.Token(4).ToULong(); - pChan->SetCreationDate(ulDate); - } - } - break; case 353: { // NAMES sRest.Trim(); // Todo: allow for non @+= server msgs @@ -324,6 +284,46 @@ return; // return so we don't send them the raw twice } + case 375: // begin motd + case 422: // MOTD File is missing + m_pUser->ClearMotdBuffer(); + case 372: // motd + case 376: // end motd + m_pUser->AddMotdBuffer(":" + sServer + " " + sCmd + " ", " " + sRest); + break; + case 437: + // :irc.server.net 437 * badnick :Nick/channel is temporarily unavailable + // :irc.server.net 437 mynick badnick :Nick/channel is temporarily unavailable + // :irc.server.net 437 mynick badnick :Cannot change nickname while banned on channel + if (m_pUser->IsChan(sRest.Token(0)) || sNick != "*") + break; + case 432: // :irc.server.com 432 * nick :Erroneous Nickname: Illegal characters + case 433: { + CString sBadNick = sRest.Token(0); + + if (!m_bAuthed) { + SendAltNick(sBadNick); + return; + } + break; + } + case 470: { + // :irc.unreal.net 470 mynick [Link] #chan1 has become full, so you are automatically being transferred to the linked channel #chan2 + // :mccaffrey.freenode.net 470 mynick #electronics ##electronics :Forwarding to another channel + + // freenode style numeric + CChan* pChan = m_pUser->FindChan(sRest.Token(0)); + if (!pChan) { + // unreal style numeric + pChan = m_pUser->FindChan(sRest.Token(1)); + } + if (pChan) { + pChan->Disable(); + m_pUser->PutStatus("Channel [" + pChan->GetName() + "] is linked to " + "another channel and was thus disabled."); + } + break; + } } } else { CNick Nick(sLine.Token(0).LeftChomp_n()); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sil...@us...> - 2009-11-24 13:06:33
|
Revision: 1668 http://znc.svn.sourceforge.net/znc/?rev=1668&view=rev Author: silverleo Date: 2009-11-24 13:06:25 +0000 (Tue, 24 Nov 2009) Log Message: ----------- Revert a commit from r1527 that made some PONG replies pass through to the client. Modified Paths: -------------- trunk/IRCSock.cpp Modified: trunk/IRCSock.cpp =================================================================== --- trunk/IRCSock.cpp 2009-11-20 16:42:44 UTC (rev 1667) +++ trunk/IRCSock.cpp 2009-11-24 13:06:25 UTC (rev 1668) @@ -81,7 +81,7 @@ PutIRC("PONG " + sLine.substr(5)); m_pUser->PutUser(sLine); return; - } else if (sLine.Equals("PONG ", false, 5) && sLine.Token(3).Equals(":ZNC")) { + } else if (sLine.Token(1).Equals("PONG") && sLine.Token(3).Equals(":ZNC")) { // We asked for this so don't forward the reply to clients. return; } else if (sLine.Equals("ERROR ", false, 6)) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2010-01-02 13:02:48
|
Revision: 1687 http://znc.svn.sourceforge.net/znc/?rev=1687&view=rev Author: psychon Date: 2010-01-02 13:02:33 +0000 (Sat, 02 Jan 2010) Log Message: ----------- Query buffer: Include /me's Before, the query buffer did include regular channel messages, but CTCP ACTIONs were just discarded. This is now fixed. Thanks to jarryd for finding and reporting this. Modified Paths: -------------- trunk/IRCSock.cpp Modified: trunk/IRCSock.cpp =================================================================== --- trunk/IRCSock.cpp 2009-12-31 12:28:59 UTC (rev 1686) +++ trunk/IRCSock.cpp 2010-01-02 13:02:33 UTC (rev 1687) @@ -640,11 +640,18 @@ } bool CIRCSock::OnPrivCTCP(CNick& Nick, CString& sMessage) { + MODULECALL(OnPrivCTCP(Nick, sMessage), m_pUser, NULL, return true); + if (sMessage.TrimPrefix("ACTION ")) { MODULECALL(OnPrivAction(Nick, sMessage), m_pUser, NULL, return true); + + if (!m_pUser->IsUserAttached()) { + // If the user is detached, add to the buffer + m_pUser->AddQueryBuffer(":" + Nick.GetNickMask() + " PRIVMSG ", " :\001ACTION " + m_pUser->AddTimestamp(sMessage) + "\001"); + } + sMessage = "ACTION " + sMessage; } - MODULECALL(OnPrivCTCP(Nick, sMessage), m_pUser, NULL, return true); if (sMessage.Equals("DCC ", false, 4) && m_pUser && m_pUser->BounceDCCs() && m_pUser->IsUserAttached()) { // DCC CHAT chat 2453612361 44592 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2010-02-18 13:08:44
|
Revision: 1760 http://znc.svn.sourceforge.net/znc/?rev=1760&view=rev Author: psychon Date: 2010-02-18 12:13:22 +0000 (Thu, 18 Feb 2010) Log Message: ----------- Don't let a ZNC user connect to itself If you let your ZNC user to itself, you generate a loop. ZNC will send the "Welcome to ZNC message" to the connected client, which is itself. So it receives that messages and sends it to its client again, which... We detect this situation because we see raw 001 two times, which should never happen on a normal IRC server. To get even less than zero ;) false positive, we only disconnect if the second raw 001 is from a server called "irc.znc.in". Modified Paths: -------------- trunk/IRCSock.cpp Modified: trunk/IRCSock.cpp =================================================================== --- trunk/IRCSock.cpp 2010-02-18 12:10:13 UTC (rev 1759) +++ trunk/IRCSock.cpp 2010-02-18 12:13:22 UTC (rev 1760) @@ -106,6 +106,13 @@ switch (uRaw) { case 1: {// :irc.server.com 001 nick :Welcome to the Internet Relay Network nick + if (m_bAuthed && sServer == "irc.znc.in") { + // m_bAuthed == true => we already received another 001 => we might be in a traffic loop + m_pUser->PutStatus("ZNC seems to be connected to itself, disconnecting..."); + Quit(); + return; + } + m_pUser->SetIRCServer(sServer); SetTimeout(240, TMO_READ); // Now that we are connected, let nature take its course PutIRC("WHO " + sNick); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2010-03-06 15:34:57
|
Revision: 1807 http://znc.svn.sourceforge.net/znc/?rev=1807&view=rev Author: psychon Date: 2010-03-06 15:34:48 +0000 (Sat, 06 Mar 2010) Log Message: ----------- Optimize our ISUPPORT token parsing CString::Split() is nice and beautiful and way better than what we did before. Modified Paths: -------------- trunk/IRCSock.cpp Modified: trunk/IRCSock.cpp =================================================================== --- trunk/IRCSock.cpp 2010-03-04 14:10:45 UTC (rev 1806) +++ trunk/IRCSock.cpp 2010-03-06 15:34:48 UTC (rev 1807) @@ -934,13 +934,15 @@ } void CIRCSock::ParseISupport(const CString& sLine) { - unsigned int i = 0; - CString sArg = sLine.Token(i++); + VCString vsTokens; + VCString::iterator it; - while (!sArg.empty()) { - CString sName = sArg.Token(0, false, "="); - CString sValue = sArg.Token(1, true, "="); + sLine.Split(" ", vsTokens, false); + for (it = vsTokens.begin(); it != vsTokens.end(); ++it) { + CString sName = it->Token(0, false, "="); + CString sValue = it->Token(1, true, "="); + if (sName.Equals("PREFIX")) { CString sPrefixes = sValue.Token(1, false, ")"); CString sPermModes = sValue.Token(0, false, ")"); @@ -971,14 +973,16 @@ } } } else if (sName.Equals("NAMESX")) { + if (m_bNamesx) + continue; m_bNamesx = true; PutIRC("PROTOCTL NAMESX"); } else if (sName.Equals("UHNAMES")) { + if (m_bUHNames) + continue; m_bUHNames = true; PutIRC("PROTOCTL UHNAMES"); } - - sArg = sLine.Token(i++); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2010-03-07 13:45:02
|
Revision: 1812 http://znc.svn.sourceforge.net/znc/?rev=1812&view=rev Author: psychon Date: 2010-03-07 13:44:56 +0000 (Sun, 07 Mar 2010) Log Message: ----------- Add basic support for CAP This adds support for the general CAP protocol and the multi-prefix and userhost-in-names (NAMESX and UHNAMES) to znc. There is no module call for CAP tokens yet, but if modules really want to "catch" capabilities, we should most likely add one. Modified Paths: -------------- trunk/IRCSock.cpp Modified: trunk/IRCSock.cpp =================================================================== --- trunk/IRCSock.cpp 2010-03-07 13:24:14 UTC (rev 1811) +++ trunk/IRCSock.cpp 2010-03-07 13:44:56 UTC (rev 1812) @@ -634,6 +634,39 @@ if (!m_pUser->IsUserAttached()) { m_pUser->AddQueryBuffer(":" + Nick.GetNickMask() + " WALLOPS ", ":" + m_pUser->AddTimestamp(sMsg), false); } + } else if (sCmd.Equals("CAP")) { + // sRest.Token(0) 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 sArgs = sRest.Token(2, true).TrimPrefix_n(":"); + + if (sSubCmd == "LS" && !m_bAuthed) { + VCString vsTokens; + VCString::iterator it; + sArgs.Split(" ", vsTokens, false); + + for (it = vsTokens.begin(); it != vsTokens.end(); ++it) { + if (*it == "multi-prefix" || *it == "userhost-in-names") { + PutIRC("CAP REQ " + *it); + } + } + + // Tell the IRC server we are done with CAP + PutIRC("CAP END"); + } else if (sSubCmd == "ACK" && !m_bAuthed) { + VCString vsTokens; + VCString::iterator it; + sArgs.Split(" ", vsTokens, false); + + for (it = vsTokens.begin(); it != vsTokens.end(); ++it) { + if (*it == "multi-prefix") { + m_bNamesx = true; + } else if (*it == "userhost-in-names") { + m_bUHNames = true; + } + } + } } } @@ -833,6 +866,8 @@ MODULECALL(OnIRCRegistration(sPass, sNick, sIdent, sRealName), m_pUser, NULL, return); + PutIRC("CAP LS"); + if (!sPass.empty()) { PutIRC("PASS " + sPass); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2010-03-30 15:09:42
|
Revision: 1860 http://znc.svn.sourceforge.net/znc/?rev=1860&view=rev Author: psychon Date: 2010-03-30 15:09:32 +0000 (Tue, 30 Mar 2010) Log Message: ----------- Don't forward our own QUITs to clients Colloquy disconnects if it receives a QUIT from the server. Also, the old behavior wasn't really consistent, a quit was only forwarded if the user was in any non-detached channels. Modified Paths: -------------- trunk/IRCSock.cpp Modified: trunk/IRCSock.cpp =================================================================== --- trunk/IRCSock.cpp 2010-03-30 12:20:31 UTC (rev 1859) +++ trunk/IRCSock.cpp 2010-03-30 15:09:32 UTC (rev 1860) @@ -384,6 +384,10 @@ if (Nick.GetNick().Equals(GetNick())) { m_pUser->PutStatus("You quit [" + sMessage + "]"); + // We don't call module hooks and we don't + // forward this quit to clients (Some clients + // disconnect if they receive such a QUIT) + return; } vector<CChan*> vFoundChans; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2010-06-07 11:40:41
|
Revision: 2012 http://znc.svn.sourceforge.net/znc/?rev=2012&view=rev Author: psychon Date: 2010-06-07 11:40:34 +0000 (Mon, 07 Jun 2010) Log Message: ----------- Add a ":" to the argument list of our CAP REQ Modified Paths: -------------- trunk/IRCSock.cpp Modified: trunk/IRCSock.cpp =================================================================== --- trunk/IRCSock.cpp 2010-06-06 11:41:31 UTC (rev 2011) +++ trunk/IRCSock.cpp 2010-06-07 11:40:34 UTC (rev 2012) @@ -652,7 +652,7 @@ for (it = vsTokens.begin(); it != vsTokens.end(); ++it) { if (*it == "multi-prefix" || *it == "userhost-in-names") { - PutIRC("CAP REQ " + *it); + PutIRC("CAP REQ :" + *it); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cf...@us...> - 2010-06-22 15:00:57
|
Revision: 2038 http://znc.svn.sourceforge.net/znc/?rev=2038&view=rev Author: cflakes Date: 2010-06-22 15:00:50 +0000 (Tue, 22 Jun 2010) Log Message: ----------- Changed OnKick module call to be useful. Modified Paths: -------------- trunk/IRCSock.cpp Modified: trunk/IRCSock.cpp =================================================================== --- trunk/IRCSock.cpp 2010-06-22 14:35:10 UTC (rev 2037) +++ trunk/IRCSock.cpp 2010-06-22 15:00:50 UTC (rev 2038) @@ -517,8 +517,10 @@ CChan* pChan = m_pUser->FindChan(sChan); if (pChan) { + MODULECALL(OnKick(Nick, sKickedNick, *pChan, sMsg), m_pUser, NULL, ); + // do not remove the nick till after the OnKick call, so modules + // can do Chan.FindNick or something to get more info. pChan->RemNick(sKickedNick); - MODULECALL(OnKick(Nick, sKickedNick, *pChan, sMsg), m_pUser, NULL, ); } if (GetNick().Equals(sKickedNick) && pChan) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2010-06-22 16:14:38
|
Revision: 2041 http://znc.svn.sourceforge.net/znc/?rev=2041&view=rev Author: psychon Date: 2010-06-22 16:14:31 +0000 (Tue, 22 Jun 2010) Log Message: ----------- Correctly handle large CAP lists from the IRCd As DarthGandalf noticed, the spec asks for an "*" to be prepended if the reply needs to be split up into multiple lines. It doesn't really matter for the current code, but let's make this future-proof. :) Modified Paths: -------------- trunk/IRCSock.cpp Modified: trunk/IRCSock.cpp =================================================================== --- trunk/IRCSock.cpp 2010-06-22 15:26:17 UTC (rev 2040) +++ trunk/IRCSock.cpp 2010-06-22 16:14:31 UTC (rev 2041) @@ -645,8 +645,17 @@ // CAP spec don't mention this, but all implementations // I've seen add this extra asterisk CString sSubCmd = sRest.Token(1); - CString sArgs = sRest.Token(2, true).TrimPrefix_n(":"); + // If the caplist of a reply is too long, it's split + // into multiple replies. A "*" is prepended to show + // that the list was split into multiple replies. + CString sArgs; + if (sRest.Token(2) == "*") { + sArgs = sRest.Token(3, true).TrimPrefix_n(":"); + } else { + sArgs = sRest.Token(2, true).TrimPrefix_n(":"); + } + if (sSubCmd == "LS" && !m_bAuthed) { VCString vsTokens; VCString::iterator it; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sil...@us...> - 2010-07-06 15:38:29
|
Revision: 2070 http://znc.svn.sourceforge.net/znc/?rev=2070&view=rev Author: silverleo Date: 2010-07-06 15:38:21 +0000 (Tue, 06 Jul 2010) Log Message: ----------- Suppress a CAP error on servers that dont support it. Modified Paths: -------------- trunk/IRCSock.cpp Modified: trunk/IRCSock.cpp =================================================================== --- trunk/IRCSock.cpp 2010-07-05 17:23:19 UTC (rev 2069) +++ trunk/IRCSock.cpp 2010-07-06 15:38:21 UTC (rev 2070) @@ -316,6 +316,11 @@ } break; } + case 451: + // :irc.server.com 451 CAP :You have not registered + // Servers that dont support CAP will give us this error, dont send it to the client + if (sNick.Equals("CAP")) + return; case 470: { // :irc.unreal.net 470 mynick [Link] #chan1 has become full, so you are automatically being transferred to the linked channel #chan2 // :mccaffrey.freenode.net 470 mynick #electronics ##electronics :Forwarding to another channel This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |