From: <ps...@us...> - 2008-07-21 13:58:16
|
Revision: 1141 http://znc.svn.sourceforge.net/znc/?rev=1141&view=rev Author: psychon Date: 2008-07-21 13:58:24 +0000 (Mon, 21 Jul 2008) Log Message: ----------- partyline: Some fixes for users who are not connected to IRC This was found via default channels (LoadModule = partyline ~#chan). - Always use a valid (=non-empty) server name - If a user is not connected to IRC, all clients might have a different idea of the current nick. Handle this for SendNickList() via a new function PutUserIRCNick() that uses the irc nick if we are connected to IRC and else correctly uses the nick that clients thinks it curretnly has. Modified Paths: -------------- trunk/modules/partyline.cpp Modified: trunk/modules/partyline.cpp =================================================================== --- trunk/modules/partyline.cpp 2008-07-21 10:15:16 UTC (rev 1140) +++ trunk/modules/partyline.cpp 2008-07-21 13:58:24 UTC (rev 1141) @@ -61,7 +61,7 @@ CUser* pUser = it->second; if (pUser->GetIRCSock()) { if (pUser->GetChanPrefixes().find("~") == CString::npos) { - pUser->PutUser(":" + pUser->GetIRCServer() + " 005 " + pUser->GetIRCNick().GetNick() + " CHANTYPES=" + pUser->GetChanPrefixes() + "~ :are supported by this server."); + pUser->PutUser(":" + GetIRCServer(pUser) + " 005 " + pUser->GetIRCNick().GetNick() + " CHANTYPES=" + pUser->GetChanPrefixes() + "~ :are supported by this server."); } } } @@ -163,32 +163,41 @@ virtual void OnUserAttached() { if (m_spInjectedPrefixes.find(m_pUser) == m_spInjectedPrefixes.end()) { - m_pClient->PutClient(":" + m_pUser->GetIRCServer() + " 005 " + m_pUser->GetIRCNick().GetNick() + " CHANTYPES=" + m_pUser->GetChanPrefixes() + "~ :are supported by this server."); + m_pClient->PutClient(":" + GetIRCServer(m_pUser) + " 005 " + m_pUser->GetIRCNick().GetNick() + " CHANTYPES=" + m_pUser->GetChanPrefixes() + "~ :are supported by this server."); } // Make sure this user is in the default channels for (set<CString>::iterator a = m_ssDefaultChans.begin(); a != m_ssDefaultChans.end(); a++) { CPartylineChannel* pChannel = GetChannel(*a); const CString& sNick = m_pUser->GetUserName(); + + if (pChannel->IsInChannel(sNick)) + continue; + CString sHost = m_pUser->GetVHost(); const set<CString>& ssNicks = pChannel->GetNicks(); if (sHost.empty()) { sHost = m_pUser->GetIRCNick().GetHost(); } + if (sHost.empty()) { + sHost = "znc.com"; + } PutChan(ssNicks, ":?" + sNick + "!" + m_pUser->GetIdent() + "@" + sHost + " JOIN " + *a, false); pChannel->AddNick(sNick); } + CString sNickMask = m_pClient->GetNickMask(); + for (set<CPartylineChannel*>::iterator it = m_ssChannels.begin(); it != m_ssChannels.end(); it++) { const set<CString>& ssNicks = (*it)->GetNicks(); if ((*it)->IsInChannel(m_pUser->GetUserName())) { - m_pClient->PutClient(":" + m_pUser->GetIRCNick().GetNickMask() + " JOIN " + (*it)->GetName()); + m_pClient->PutClient(":" + sNickMask + " JOIN " + (*it)->GetName()); if (!(*it)->GetTopic().empty()) { - m_pClient->PutClient(":" + m_pUser->GetIRCServer() + " 332 " + m_pUser->GetIRCNick().GetNickMask() + " " + (*it)->GetName() + " :" + (*it)->GetTopic()); + m_pClient->PutClient(":" + GetIRCServer(m_pUser) + " 332 " + m_pUser->GetIRCNick().GetNickMask() + " " + (*it)->GetName() + " :" + (*it)->GetTopic()); } SendNickList(m_pUser, ssNicks, (*it)->GetName()); @@ -257,7 +266,7 @@ } if (sChannel.Left(2) != "~#") { - m_pClient->PutClient(":" + m_pUser->GetIRCServer() + " 403 " + m_pUser->GetIRCNick().GetNick() + " " + sChannel + " :No such channel"); + m_pClient->PutClient(":" + GetIRCServer(m_pUser) + " 403 " + m_pUser->GetIRCNick().GetNick() + " " + sChannel + " :No such channel"); return HALT; } @@ -303,7 +312,7 @@ } if (sChannel.Left(2) != "~#") { - m_pClient->PutClient(":" + m_pUser->GetIRCServer() + " 403 " + m_pUser->GetIRCNick().GetNick() + " " + sChannel + " :Channels look like ~#znc"); + m_pClient->PutClient(":" + GetIRCServer(m_pUser) + " 403 " + m_pUser->GetIRCNick().GetNick() + " " + sChannel + " :Channels look like ~#znc"); return HALT; } @@ -331,7 +340,7 @@ PutChan(ssNicks, ":?" + sNick + "!" + pUser->GetIdent() + "@" + sHost + " JOIN " + pChannel->GetName(), false); if (!pChannel->GetTopic().empty()) { - pUser->PutUser(":" + pUser->GetIRCServer() + " 332 " + pUser->GetIRCNick().GetNickMask() + " " + pChannel->GetName() + " :" + pChannel->GetTopic()); + pUser->PutUser(":" + GetIRCServer(pUser) + " 332 " + pUser->GetIRCNick().GetNickMask() + " " + pChannel->GetName() + " :" + pChannel->GetTopic()); } SendNickList(pUser, ssNicks, pChannel->GetName()); @@ -360,7 +369,7 @@ if (cPrefix == '~') { if (FindChannel(sTarget) == NULL) { - m_pClient->PutClient(":" + m_pUser->GetIRCServer() + " 403 " + m_pUser->GetIRCNick().GetNick() + " " + sTarget + " :No such channel"); + m_pClient->PutClient(":" + GetIRCServer(m_pUser) + " 403 " + m_pUser->GetIRCNick().GetNick() + " " + sTarget + " :No such channel"); return HALT; } @@ -372,7 +381,7 @@ if (pUser) { pUser->PutUser(":?" + m_pUser->GetUserName() + "!" + m_pUser->GetIdent() + "@" + sHost + " PRIVMSG " + pUser->GetIRCNick().GetNick() + " :" + sMessage); } else { - m_pClient->PutClient(":" + m_pUser->GetIRCServer() + " 403 " + m_pUser->GetIRCNick().GetNick() + " " + sTarget + " :No such znc user: " + sNick + ""); + m_pClient->PutClient(":" + GetIRCServer(m_pUser) + " 403 " + m_pUser->GetIRCNick().GetNick() + " " + sTarget + " :No such znc user: " + sNick + ""); } } @@ -542,6 +551,14 @@ } } + const CString GetIRCServer(CUser *pUser) { + const CString& sServer = pUser->GetIRCServer(); + + if (!sServer.empty()) + return sServer; + return "irc.znc.com"; + } + bool PutChan(const CString& sChan, const CString& sLine, bool bIncludeCurUser = true, bool bIncludeClient = true, CUser* pUser = NULL, CClient* pClient = NULL) { CPartylineChannel* pChannel = FindChannel(sChan); @@ -574,8 +591,23 @@ } } + void PutUserIRCNick(CUser *pUser, const CString& sPre, const CString& sPost) { + const CString& sIRCNick = pUser->GetIRCNick().GetNick(); + if (!sIRCNick.empty()) { + pUser->PutUser(sPre + sIRCNick + sPost); + return; + } + + const vector<CClient*>& vClients = pUser->GetClients(); + vector<CClient*>::const_iterator it; + for (it = vClients.begin(); it != vClients.end(); it++) { + (*it)->PutClient(sPre + (*it)->GetNick() + sPost); + } + } + void SendNickList(CUser* pUser, const set<CString>& ssNicks, const CString& sChan) { CString sNickList; + for (set<CString>::iterator it = ssNicks.begin(); it != ssNicks.end(); it++) { CUser* pChanUser = CZNC::Get().FindUser(*it); @@ -586,16 +618,16 @@ sNickList += "?" + (*it) + " "; if (sNickList.size() >= 500) { - pUser->PutUser(":" + pUser->GetIRCServer() + " 353 " + pUser->GetIRCNick().GetNick() + " @ " + sChan + " :" + sNickList); + PutUserIRCNick(pUser, ":" + GetIRCServer(pUser) + " 353 ", " @ " + sChan + " :" + sNickList); sNickList.clear(); } } if (sNickList.size()) { - pUser->PutUser(":" + pUser->GetIRCServer() + " 353 " + pUser->GetIRCNick().GetNick() + " @ " + sChan + " :" + sNickList); + PutUserIRCNick(pUser, ":" + GetIRCServer(pUser) + " 353 ", " @ " + sChan + " :" + sNickList); } - pUser->PutUser(":" + pUser->GetIRCServer() + " 366 " + pUser->GetIRCNick().GetNick() + " " + sChan + " :End of /NAMES list."); + PutUserIRCNick(pUser, ":" + GetIRCServer(pUser) + " 366 ", " " + sChan + " :End of /NAMES list."); } CPartylineChannel* FindChannel(const CString& sChan) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <kr...@us...> - 2008-09-10 14:23:56
|
Revision: 1195 http://znc.svn.sourceforge.net/znc/?rev=1195&view=rev Author: kroimon Date: 2008-09-10 14:24:07 +0000 (Wed, 10 Sep 2008) Log Message: ----------- partyline: Adjusted the hostmask for actions from rottenboy.com to znc.in to ensure uniformity to the rest of znc. See also commit 1181. Modified Paths: -------------- trunk/modules/partyline.cpp Modified: trunk/modules/partyline.cpp =================================================================== --- trunk/modules/partyline.cpp 2008-09-09 15:54:34 UTC (rev 1194) +++ trunk/modules/partyline.cpp 2008-09-10 14:24:07 UTC (rev 1195) @@ -133,8 +133,8 @@ const set<CString>& ssNicks = (*it)->GetNicks(); if (ssNicks.find(User.GetUserName()) != ssNicks.end()) { // If the user is on this chan - User.PutUser(":*" + GetModName() + "!zn...@ro... KICK " + sChannel + " " + sNick + " :User Deleted"); - PutChan(ssNicks, ":*" + GetModName() + "!zn...@ro... KICK " + sChannel + " ?" + sNick + " :User Deleted", false); + User.PutUser(":*" + GetModName() + "!zn...@zn... KICK " + sChannel + " " + sNick + " :User Deleted"); + PutChan(ssNicks, ":*" + GetModName() + "!zn...@zn... KICK " + sChannel + " ?" + sNick + " :User Deleted", false); } } @@ -201,7 +201,7 @@ } SendNickList(m_pUser, ssNicks, (*it)->GetName()); - PutChan(ssNicks, ":*" + GetModName() + "!zn...@ro... MODE " + (*it)->GetName() + " +" + CString(m_pUser->IsAdmin() ? "o" : "v") + " ?" + m_pUser->GetUserName(), true); + PutChan(ssNicks, ":*" + GetModName() + "!zn...@zn... MODE " + (*it)->GetName() + " +" + CString(m_pUser->IsAdmin() ? "o" : "v") + " ?" + m_pUser->GetUserName(), true); } } } @@ -212,7 +212,7 @@ const set<CString>& ssNicks = (*it)->GetNicks(); if (ssNicks.find(m_pUser->GetUserName()) != ssNicks.end()) { - PutChan(ssNicks, ":*" + GetModName() + "!zn...@ro... MODE " + (*it)->GetName() + " -ov ?" + m_pUser->GetUserName() + " ?" + m_pUser->GetUserName(), true); + PutChan(ssNicks, ":*" + GetModName() + "!zn...@zn... MODE " + (*it)->GetName() + " -ov ?" + m_pUser->GetUserName() + " ?" + m_pUser->GetUserName(), true); } } } @@ -345,7 +345,7 @@ SendNickList(pUser, ssNicks, pChannel->GetName()); if (pUser->IsAdmin()) { - PutChan(ssNicks, ":*" + GetModName() + "!zn...@ro... MODE " + pChannel->GetName() + " +o ?" + pUser->GetUserName(), (pUser == m_pUser) ? false : true, pUser); + PutChan(ssNicks, ":*" + GetModName() + "!zn...@zn... MODE " + pChannel->GetName() + " +o ?" + pUser->GetUserName(), (pUser == m_pUser) ? false : true, pUser); } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2008-10-27 19:21:14
|
Revision: 1263 http://znc.svn.sourceforge.net/znc/?rev=1263&view=rev Author: psychon Date: 2008-10-27 19:21:08 +0000 (Mon, 27 Oct 2008) Log Message: ----------- Partyline: clean up when a force-joined user is deleted The old code didn't properly clean up after deleted users :( Modified Paths: -------------- trunk/modules/partyline.cpp Modified: trunk/modules/partyline.cpp =================================================================== --- trunk/modules/partyline.cpp 2008-10-26 19:47:17 UTC (rev 1262) +++ trunk/modules/partyline.cpp 2008-10-27 19:21:08 UTC (rev 1263) @@ -122,24 +122,10 @@ } virtual EModRet OnDeleteUser(CUser& User) { - const CString& sNick = User.GetUserName(); - CString sHost = User.GetVHost(); - - CUser* pTmp = m_pUser; - m_pUser = &User; - for (set<CPartylineChannel*>::iterator it = m_ssChannels.begin(); it != m_ssChannels.end(); it++) { // Loop through each chan - const CString& sChannel = (*it)->GetName(); - const set<CString>& ssNicks = (*it)->GetNicks(); - - if (ssNicks.find(User.GetUserName()) != ssNicks.end()) { // If the user is on this chan - User.PutUser(":*" + GetModName() + "!zn...@zn... KICK " + sChannel + " " + sNick + " :User Deleted"); - PutChan(ssNicks, ":*" + GetModName() + "!zn...@zn... KICK " + sChannel + " ?" + sNick + " :User Deleted", false); - } + PartUser(&User, *it, true, "User deleted"); } - m_pUser = pTmp; - return CONTINUE; } @@ -275,11 +261,16 @@ return HALT; } - void PartUser(CUser* pUser, CPartylineChannel* pChannel, bool bForce = false) { + void PartUser(CUser* pUser, CPartylineChannel* pChannel, bool bForce = false, + const CString& sMessage = "") { if (!pChannel || !pChannel->IsInChannel(pUser->GetUserName())) { return; } + CString sMsg = sMessage; + if (!sMsg.empty()) + sMsg = " :" + sMsg; + if (!pChannel->IsFixedChan(pUser->GetUserName()) || bForce) { pChannel->DelNick(pUser->GetUserName()); pChannel->DelFixedNick(pUser->GetUserName()); @@ -291,8 +282,10 @@ sHost = pUser->GetIRCNick().GetHost(); } - pUser->PutUser(":" + pUser->GetIRCNick().GetNickMask() + " PART " + pChannel->GetName()); - PutChan(ssNicks, ":?" + pUser->GetUserName() + "!" + pUser->GetIdent() + "@" + sHost + " PART " + pChannel->GetName(), false); + pUser->PutUser(":" + pUser->GetIRCNick().GetNickMask() + " PART " + + pChannel->GetName() + sMsg); + PutChan(ssNicks, ":?" + pUser->GetUserName() + "!" + pUser->GetIdent() + "@" + sHost + " PART " + + pChannel->GetName() + sMsg, false); if (ssNicks.empty()) { delete pChannel; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2008-10-27 19:34:06
|
Revision: 1264 http://znc.svn.sourceforge.net/znc/?rev=1264&view=rev Author: psychon Date: 2008-10-27 19:34:03 +0000 (Mon, 27 Oct 2008) Log Message: ----------- Fix the behaviour change of the last commit Modified Paths: -------------- trunk/modules/partyline.cpp Modified: trunk/modules/partyline.cpp =================================================================== --- trunk/modules/partyline.cpp 2008-10-27 19:21:08 UTC (rev 1263) +++ trunk/modules/partyline.cpp 2008-10-27 19:34:03 UTC (rev 1264) @@ -122,8 +122,9 @@ } virtual EModRet OnDeleteUser(CUser& User) { - for (set<CPartylineChannel*>::iterator it = m_ssChannels.begin(); it != m_ssChannels.end(); it++) { // Loop through each chan - PartUser(&User, *it, true, "User deleted"); + // Loop through each chan + for (set<CPartylineChannel*>::iterator it = m_ssChannels.begin(); it != m_ssChannels.end(); it++) { + RemoveUser(&User, *it, "KICK", true, "User deleted"); } return CONTINUE; @@ -263,10 +264,16 @@ void PartUser(CUser* pUser, CPartylineChannel* pChannel, bool bForce = false, const CString& sMessage = "") { + RemoveUser(pUser, pChannel, "PART", bForce, sMessage); + } + + void RemoveUser(CUser* pUser, CPartylineChannel* pChannel, const CString& sCommand, + bool bForce = false, const CString& sMessage = "") { if (!pChannel || !pChannel->IsInChannel(pUser->GetUserName())) { return; } + CString sCmd = " " + sCommand + " "; CString sMsg = sMessage; if (!sMsg.empty()) sMsg = " :" + sMsg; @@ -282,10 +289,10 @@ sHost = pUser->GetIRCNick().GetHost(); } - pUser->PutUser(":" + pUser->GetIRCNick().GetNickMask() + " PART " + pUser->PutUser(":" + pUser->GetIRCNick().GetNickMask() + sCmd + pChannel->GetName() + sMsg); - PutChan(ssNicks, ":?" + pUser->GetUserName() + "!" + pUser->GetIdent() + "@" + sHost + " PART " - + pChannel->GetName() + sMsg, false); + PutChan(ssNicks, ":?" + pUser->GetUserName() + "!" + pUser->GetIdent() + "@" + sHost + + sCmd + pChannel->GetName() + sMsg, false); if (ssNicks.empty()) { delete pChannel; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2009-03-31 15:49:53
|
Revision: 1472 http://znc.svn.sourceforge.net/znc/?rev=1472&view=rev Author: psychon Date: 2009-03-31 15:49:49 +0000 (Tue, 31 Mar 2009) Log Message: ----------- Don't ask me, I don't know That false/true thing makes no sense and pUser was passed in to a bool argument which means it was always true... weird... Modified Paths: -------------- trunk/modules/partyline.cpp Modified: trunk/modules/partyline.cpp =================================================================== --- trunk/modules/partyline.cpp 2009-03-31 15:11:32 UTC (rev 1471) +++ trunk/modules/partyline.cpp 2009-03-31 15:49:49 UTC (rev 1472) @@ -343,7 +343,7 @@ SendNickList(pUser, ssNicks, pChannel->GetName()); if (pUser->IsAdmin()) { - PutChan(ssNicks, ":*" + GetModName() + "!zn...@zn... MODE " + pChannel->GetName() + " +o ?" + pUser->GetUserName(), (pUser == m_pUser) ? false : true, pUser); + PutChan(ssNicks, ":*" + GetModName() + "!zn...@zn... MODE " + pChannel->GetName() + " +o ?" + pUser->GetUserName(), false); } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2009-04-07 16:14:35
|
Revision: 1485 http://znc.svn.sourceforge.net/znc/?rev=1485&view=rev Author: psychon Date: 2009-04-07 16:14:14 +0000 (Tue, 07 Apr 2009) Log Message: ----------- Partyline: Add defines for the used channel prefix Modified Paths: -------------- trunk/modules/partyline.cpp Modified: trunk/modules/partyline.cpp =================================================================== --- trunk/modules/partyline.cpp 2009-04-07 11:38:17 UTC (rev 1484) +++ trunk/modules/partyline.cpp 2009-04-07 16:14:14 UTC (rev 1485) @@ -9,6 +9,11 @@ #include "User.h" #include "znc.h" +// If you change these and it breaks, you get to keep the pieces +#define CHAN_PREFIX_1 "~" +#define CHAN_PREFIX_1C '~' +#define CHAN_PREFIX CHAN_PREFIX_1 "#" + class CPartylineChannel { public: CPartylineChannel(const CString& sName) { m_sName = sName.AsLower(); } @@ -60,8 +65,8 @@ for (map<CString, CUser*>::const_iterator it = msUsers.begin(); it != msUsers.end(); it++) { CUser* pUser = it->second; if (pUser->GetIRCSock()) { - if (pUser->GetChanPrefixes().find("~") == CString::npos) { - pUser->PutUser(":" + GetIRCServer(pUser) + " 005 " + pUser->GetIRCNick().GetNick() + " CHANTYPES=" + pUser->GetChanPrefixes() + "~ :are supported by this server."); + if (pUser->GetChanPrefixes().find(CHAN_PREFIX_1) == CString::npos) { + pUser->PutUser(":" + GetIRCServer(pUser) + " 005 " + pUser->GetIRCNick().GetNick() + " CHANTYPES=" + pUser->GetChanPrefixes() + CHAN_PREFIX_1 " :are supported by this server."); } } } @@ -69,7 +74,7 @@ CString sChan; unsigned int a = 0; while (!(sChan = sArgs.Token(a++)).empty()) { - if (sChan.Left(2) == "~#") { + if (sChan.Left(2) == CHAN_PREFIX) { sChan = sChan.Left(32); m_ssDefaultChans.insert(sChan); } @@ -136,7 +141,7 @@ if (uPos != CString::npos) { uPos = sLine.find(" ", uPos); - sLine.insert(uPos, "~"); + sLine.insert(uPos, CHAN_PREFIX_1); m_spInjectedPrefixes.insert(m_pUser); } } @@ -150,7 +155,7 @@ virtual void OnClientLogin() { if (m_spInjectedPrefixes.find(m_pUser) == m_spInjectedPrefixes.end()) { - m_pClient->PutClient(":" + GetIRCServer(m_pUser) + " 005 " + m_pUser->GetIRCNick().GetNick() + " CHANTYPES=" + m_pUser->GetChanPrefixes() + "~ :are supported by this server."); + m_pClient->PutClient(":" + GetIRCServer(m_pUser) + " 005 " + m_pUser->GetIRCNick().GetNick() + " CHANTYPES=" + m_pUser->GetChanPrefixes() + CHAN_PREFIX_1 " :are supported by this server."); } // Make sure this user is in the default channels @@ -206,11 +211,11 @@ } virtual EModRet OnUserRaw(CString& sLine) { - if (sLine.Equals("WHO ~", false, 5)) { + if (sLine.Equals("WHO " CHAN_PREFIX_1, false, 5)) { return HALT; - } else if (sLine.Equals("MODE ~", false, 6)) { + } else if (sLine.Equals("MODE " CHAN_PREFIX_1, false, 6)) { return HALT; - } else if (sLine.Equals("TOPIC ~#", false, 8)) { + } else if (sLine.Equals("TOPIC " CHAN_PREFIX, false, 8)) { CString sChannel = sLine.Token(1); CString sTopic = sLine.Token(2, true); @@ -246,11 +251,11 @@ } virtual EModRet OnUserPart(CString& sChannel, CString& sMessage) { - if (sChannel.Left(1) != "~") { + if (sChannel.Left(1) != CHAN_PREFIX_1) { return CONTINUE; } - if (sChannel.Left(2) != "~#") { + if (sChannel.Left(2) != CHAN_PREFIX) { m_pClient->PutClient(":" + GetIRCServer(m_pUser) + " 403 " + m_pUser->GetIRCNick().GetNick() + " " + sChannel + " :No such channel"); return HALT; } @@ -305,12 +310,12 @@ } virtual EModRet OnUserJoin(CString& sChannel, CString& sKey) { - if (sChannel.Left(1) != "~") { + if (sChannel.Left(1) != CHAN_PREFIX_1) { return CONTINUE; } - if (sChannel.Left(2) != "~#") { - m_pClient->PutClient(":" + GetIRCServer(m_pUser) + " 403 " + m_pUser->GetIRCNick().GetNick() + " " + sChannel + " :Channels look like ~#znc"); + if (sChannel.Left(2) != CHAN_PREFIX) { + m_pClient->PutClient(":" + GetIRCServer(m_pUser) + " 403 " + m_pUser->GetIRCNick().GetNick() + " " + sChannel + " :Channels look like " CHAN_PREFIX "znc"); return HALT; } @@ -355,7 +360,7 @@ char cPrefix = sTarget[0]; - if (cPrefix != '~' && cPrefix != '?') { + if (cPrefix != CHAN_PREFIX_1C && cPrefix != '?') { return CONTINUE; } @@ -365,7 +370,7 @@ sHost = m_pUser->GetIRCNick().GetHost(); } - if (cPrefix == '~') { + if (cPrefix == CHAN_PREFIX_1C) { if (FindChannel(sTarget) == NULL) { m_pClient->PutClient(":" + GetIRCServer(m_pUser) + " 403 " + m_pUser->GetIRCNick().GetNick() + " " + sTarget + " :No such channel"); return HALT; @@ -455,7 +460,7 @@ CUser* pUser = CZNC::Get().FindUser(sUser); CPartylineChannel* pChan; - if (sChan.Left(2) != "~#") { + if (sChan.Left(2) != CHAN_PREFIX) { PutModule("Invalid channel name"); return; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2009-04-09 08:22:28
|
Revision: 1486 http://znc.svn.sourceforge.net/znc/?rev=1486&view=rev Author: psychon Date: 2009-04-09 08:22:20 +0000 (Thu, 09 Apr 2009) Log Message: ----------- partyline: Fix the KICK sent for deleted users Before this, the KICK message was missing a target which was kicked. Now the user kicks himself. :) Thanks to JoeK for reporting this bug. Modified Paths: -------------- trunk/modules/partyline.cpp Modified: trunk/modules/partyline.cpp =================================================================== --- trunk/modules/partyline.cpp 2009-04-07 16:14:14 UTC (rev 1485) +++ trunk/modules/partyline.cpp 2009-04-09 08:22:20 UTC (rev 1486) @@ -129,7 +129,7 @@ virtual EModRet OnDeleteUser(CUser& User) { // Loop through each chan for (set<CPartylineChannel*>::iterator it = m_ssChannels.begin(); it != m_ssChannels.end(); it++) { - RemoveUser(&User, *it, "KICK", true, "User deleted"); + RemoveUser(&User, *it, "KICK", true, "User deleted", true); } return CONTINUE; @@ -273,7 +273,7 @@ } void RemoveUser(CUser* pUser, CPartylineChannel* pChannel, const CString& sCommand, - bool bForce = false, const CString& sMessage = "") { + bool bForce = false, const CString& sMessage = "", bool bNickAsTarget = false) { if (!pChannel || !pChannel->IsInChannel(pUser->GetUserName())) { return; } @@ -294,10 +294,17 @@ sHost = pUser->GetIRCNick().GetHost(); } - pUser->PutUser(":" + pUser->GetIRCNick().GetNickMask() + sCmd - + pChannel->GetName() + sMsg); - PutChan(ssNicks, ":?" + pUser->GetUserName() + "!" + pUser->GetIdent() + "@" + sHost - + sCmd + pChannel->GetName() + sMsg, false); + if (bNickAsTarget) { + pUser->PutUser(":" + pUser->GetIRCNick().GetNickMask() + sCmd + + pChannel->GetName() + " " + pUser->GetIRCNick().GetNick() + sMsg); + PutChan(ssNicks, ":?" + pUser->GetUserName() + "!" + pUser->GetIdent() + "@" + sHost + + sCmd + pChannel->GetName() + " ?" + pUser->GetUserName() + sMsg, false); + } else { + pUser->PutUser(":" + pUser->GetIRCNick().GetNickMask() + sCmd + + pChannel->GetName() + sMsg); + PutChan(ssNicks, ":?" + pUser->GetUserName() + "!" + pUser->GetIdent() + "@" + sHost + + sCmd + pChannel->GetName() + sMsg, false); + } if (ssNicks.empty()) { delete pChannel; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2009-12-19 16:18:34
|
Revision: 1682 http://znc.svn.sourceforge.net/znc/?rev=1682&view=rev Author: psychon Date: 2009-12-19 16:18:27 +0000 (Sat, 19 Dec 2009) Log Message: ----------- Minor spelling fix in partyline Thanks to the-me for noticing this and sending a patch. Modified Paths: -------------- trunk/modules/partyline.cpp Modified: trunk/modules/partyline.cpp =================================================================== --- trunk/modules/partyline.cpp 2009-12-18 17:06:47 UTC (rev 1681) +++ trunk/modules/partyline.cpp 2009-12-19 16:18:27 UTC (rev 1682) @@ -547,7 +547,7 @@ } PutModule("--- End of list"); } else { - PutModule("Unkown command, try 'HELP'"); + PutModule("Unknown command, try 'HELP'"); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2010-02-03 16:47:55
|
Revision: 1731 http://znc.svn.sourceforge.net/znc/?rev=1731&view=rev Author: psychon Date: 2010-02-03 16:47:48 +0000 (Wed, 03 Feb 2010) Log Message: ----------- partyline: Send the user list on forced rejoin When a client tries to part from a channel to which it was fixed, we sent it a join again to make it rejoin (bad irssi for not waiting for the server's reply to PART!). The problem here was that we didn't send the nicklist and thus the channel appeared empty. This fixes SF.net #2802684. Modified Paths: -------------- trunk/modules/partyline.cpp Modified: trunk/modules/partyline.cpp =================================================================== --- trunk/modules/partyline.cpp 2010-02-03 14:46:57 UTC (rev 1730) +++ trunk/modules/partyline.cpp 2010-02-03 16:47:48 UTC (rev 1731) @@ -313,6 +313,11 @@ } else { // some clients dont wait for the server to send an answer to a part, so we need to make them join again pUser->PutUser(":" + pUser->GetIRCNick().GetNickMask() + " JOIN " + pChannel->GetName()); + if (!pChannel->GetTopic().empty()) { + pUser->PutUser(":" + GetIRCServer(pUser) + " 332 " + pUser->GetIRCNick().GetNickMask() + " " + pChannel->GetName() + " :" + pChannel->GetTopic()); + } + const set<CString>& ssNicks = pChannel->GetNicks(); + SendNickList(pUser, ssNicks, pChannel->GetName()); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2010-02-18 12:09:29
|
Revision: 1758 http://znc.svn.sourceforge.net/znc/?rev=1758&view=rev Author: psychon Date: 2010-02-18 12:09:23 +0000 (Thu, 18 Feb 2010) Log Message: ----------- Handle more messages in partyline partyline channels now also know about notices, /me and ctcp. Modified Paths: -------------- trunk/modules/partyline.cpp Modified: trunk/modules/partyline.cpp =================================================================== --- trunk/modules/partyline.cpp 2010-02-18 12:07:49 UTC (rev 1757) +++ trunk/modules/partyline.cpp 2010-02-18 12:09:23 UTC (rev 1758) @@ -365,7 +365,7 @@ } } - virtual EModRet OnUserMsg(CString& sTarget, CString& sMessage) { + virtual EModRet HandleMessage(const CString& sCmd, const CString& sTarget, const CString& sMessage) { if (sTarget.empty()) { return CONTINUE; } @@ -388,13 +388,13 @@ return HALT; } - PutChan(sTarget, ":?" + m_pUser->GetUserName() + "!" + m_pUser->GetIdent() + "@" + sHost + " PRIVMSG " + sTarget + " :" + sMessage, true, false); + PutChan(sTarget, ":?" + m_pUser->GetUserName() + "!" + m_pUser->GetIdent() + "@" + sHost + " " + sCmd + " " + sTarget + " :" + sMessage, true, false); } else { CString sNick = sTarget.LeftChomp_n(1); CUser* pUser = CZNC::Get().FindUser(sNick); if (pUser) { - pUser->PutUser(":?" + m_pUser->GetUserName() + "!" + m_pUser->GetIdent() + "@" + sHost + " PRIVMSG " + pUser->GetIRCNick().GetNick() + " :" + sMessage); + pUser->PutUser(":?" + m_pUser->GetUserName() + "!" + m_pUser->GetIdent() + "@" + sHost + " " + sCmd + " " + pUser->GetIRCNick().GetNick() + " :" + sMessage); } else { m_pClient->PutClient(":" + GetIRCServer(m_pUser) + " 403 " + m_pUser->GetIRCNick().GetNick() + " " + sTarget + " :No such znc user: " + sNick + ""); } @@ -403,6 +403,26 @@ return HALT; } + virtual EModRet OnUserMsg(CString& sTarget, CString& sMessage) { + return HandleMessage("PRIVMSG", sTarget, sMessage); + } + + virtual EModRet OnUserNotice(CString& sTarget, CString& sMessage) { + return HandleMessage("NOTICE", sTarget, sMessage); + } + + virtual EModRet OnUserAction(CString& sTarget, CString& sMessage) { + return HandleMessage("PRIVMSG", sTarget, "\001ACTION " + sMessage + "\001"); + } + + virtual EModRet OnUserCTCP(CString& sTarget, CString& sMessage) { + return HandleMessage("PRIVMSG", sTarget, "\001" + sMessage + "\001"); + } + + virtual EModRet OnUserCTCPReply(CString& sTarget, CString& sMessage) { + return HandleMessage("NOTICE", sTarget, "\001" + sMessage + "\001"); + } + virtual void OnModCommand(const CString& sLine) { CString sCommand = sLine.Token(0); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2010-04-08 15:56:26
|
Revision: 1898 http://znc.svn.sourceforge.net/znc/?rev=1898&view=rev Author: psychon Date: 2010-04-08 15:56:19 +0000 (Thu, 08 Apr 2010) Log Message: ----------- partyline: Save channel topics across restarts This implements some feature request on sf.net. Patch by Reed Loden (r33d), thanks a lot. Modified Paths: -------------- trunk/modules/partyline.cpp Modified: trunk/modules/partyline.cpp =================================================================== --- trunk/modules/partyline.cpp 2010-04-07 19:28:39 UTC (rev 1897) +++ trunk/modules/partyline.cpp 2010-04-08 15:56:19 UTC (rev 1898) @@ -87,24 +87,42 @@ } void Load() { - VCString vsChannels; + CString sAction, sKey; + CPartylineChannel* pChannel; for (MCString::iterator it = BeginNV(); it != EndNV(); ++it) { - CUser* pUser = CZNC::Get().FindUser(it->first); - CPartylineChannel* pChannel; - it->second.Split(",", vsChannels, false); - - if (!pUser) { - // TODO: give some usefull message? - continue; + if (it->first.find(":") != CString::npos) { + sAction = it->first.Token(0, false, ":"); + sKey = it->first.Token(1, true, ":"); + } else { + // backwards compatibility for older NV data + sAction = "fixedchan"; + sKey = it->first; } - for (VCString::iterator i = vsChannels.begin(); i != vsChannels.end(); ++i) { - if (i->Trim_n().empty()) + if (sAction == "fixedchan") { + CUser* pUser = CZNC::Get().FindUser(sKey); + if (!pUser) { + // TODO: give some useful message? continue; - pChannel = GetChannel(*i); - JoinUser(pUser, pChannel); - pChannel->AddFixedNick(it->first); + } + + VCString vsChannels; + it->second.Split(",", vsChannels, false); + for (VCString::iterator i = vsChannels.begin(); i != vsChannels.end(); ++i) { + if (i->Trim_n().empty()) + continue; + pChannel = GetChannel(*i); + JoinUser(pUser, pChannel); + pChannel->AddFixedNick(sKey); + } } + + if (sAction == "topic") { + pChannel = FindChannel(sKey); + if (pChannel && !sKey.empty()) { + pChannel->SetTopic(it->second); + } + } } return; @@ -122,11 +140,18 @@ } if (!sChans.empty()) - SetNV(sUser, sChans.substr(1)); // Strip away the first , + SetNV("fixedchan:" + sUser, sChans.substr(1)); // Strip away the first , else - DelNV(sUser); + DelNV("fixedchan:" + sUser); } + void SaveTopic(CPartylineChannel* pChannel) { + if (!pChannel->GetTopic().empty()) + SetNV("topic:" + pChannel->GetName(), pChannel->GetTopic()); + else + DelNV("topic:" + pChannel->GetName()); + } + virtual EModRet OnDeleteUser(CUser& User) { // Loop through each chan for (set<CPartylineChannel*>::iterator it = m_ssChannels.begin(); it != m_ssChannels.end(); ++it) { @@ -230,6 +255,7 @@ if (m_pUser->IsAdmin()) { PutChan(ssNicks, ":" + m_pUser->GetIRCNick().GetNickMask() + " TOPIC " + sChannel + " :" + sTopic); pChannel->SetTopic(sTopic); + SaveTopic(pChannel); } else { m_pUser->PutUser(":irc.znc.in 482 " + m_pUser->GetIRCNick().GetNick() + " " + sChannel + " :You're not channel operator"); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2010-04-11 08:58:21
|
Revision: 1901 http://znc.svn.sourceforge.net/znc/?rev=1901&view=rev Author: psychon Date: 2010-04-11 08:58:15 +0000 (Sun, 11 Apr 2010) Log Message: ----------- partyline: Minor fix to loading saved channel topics Follow up patch to r1898. Patch again by Reed Loden (r33d), thanks a lot. Modified Paths: -------------- trunk/modules/partyline.cpp Modified: trunk/modules/partyline.cpp =================================================================== --- trunk/modules/partyline.cpp 2010-04-08 16:42:37 UTC (rev 1900) +++ trunk/modules/partyline.cpp 2010-04-11 08:58:15 UTC (rev 1901) @@ -119,7 +119,8 @@ if (sAction == "topic") { pChannel = FindChannel(sKey); - if (pChannel && !sKey.empty()) { + if (pChannel && !(it->second).empty()) { + PutChan(pChannel->GetNicks(), ":irc.znc.in TOPIC " + pChannel->GetName() + " :" + it->second); pChannel->SetTopic(it->second); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2010-04-11 11:43:15
|
Revision: 1904 http://znc.svn.sourceforge.net/znc/?rev=1904&view=rev Author: psychon Date: 2010-04-11 11:43:09 +0000 (Sun, 11 Apr 2010) Log Message: ----------- partyline: Fix desync with {add,del}fixchan Again, thanks to r33d for the patch. Modified Paths: -------------- trunk/modules/partyline.cpp Modified: trunk/modules/partyline.cpp =================================================================== --- trunk/modules/partyline.cpp 2010-04-11 11:29:55 UTC (rev 1903) +++ trunk/modules/partyline.cpp 2010-04-11 11:43:09 UTC (rev 1904) @@ -326,12 +326,13 @@ pUser->PutUser(":" + pUser->GetIRCNick().GetNickMask() + sCmd + pChannel->GetName() + " " + pUser->GetIRCNick().GetNick() + sMsg); PutChan(ssNicks, ":?" + pUser->GetUserName() + "!" + pUser->GetIdent() + "@" + sHost - + sCmd + pChannel->GetName() + " ?" + pUser->GetUserName() + sMsg, false); + + sCmd + pChannel->GetName() + " ?" + pUser->GetUserName() + sMsg, + false, true, pUser); } else { pUser->PutUser(":" + pUser->GetIRCNick().GetNickMask() + sCmd + pChannel->GetName() + sMsg); PutChan(ssNicks, ":?" + pUser->GetUserName() + "!" + pUser->GetIdent() + "@" + sHost - + sCmd + pChannel->GetName() + sMsg, false); + + sCmd + pChannel->GetName() + sMsg, false, true, pUser); } if (ssNicks.empty()) { @@ -380,7 +381,7 @@ } pUser->PutUser(":" + pUser->GetIRCNick().GetNickMask() + " JOIN " + pChannel->GetName()); - PutChan(ssNicks, ":?" + sNick + "!" + pUser->GetIdent() + "@" + sHost + " JOIN " + pChannel->GetName(), false); + PutChan(ssNicks, ":?" + sNick + "!" + pUser->GetIdent() + "@" + sHost + " JOIN " + pChannel->GetName(), false, true, pUser); if (!pChannel->GetTopic().empty()) { pUser->PutUser(":" + GetIRCServer(pUser) + " 332 " + pUser->GetIRCNick().GetNickMask() + " " + pChannel->GetName() + " :" + pChannel->GetTopic()); @@ -388,7 +389,7 @@ SendNickList(pUser, ssNicks, pChannel->GetName()); if (pUser->IsAdmin()) { - PutChan(ssNicks, ":*" + GetModName() + "!zn...@zn... MODE " + pChannel->GetName() + " +o ?" + pUser->GetUserName(), false); + PutChan(ssNicks, ":*" + GetModName() + "!zn...@zn... MODE " + pChannel->GetName() + " +o ?" + pUser->GetUserName(), false, true, pUser); } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2010-07-16 21:01:56
|
Revision: 2087 http://znc.svn.sourceforge.net/znc/?rev=2087&view=rev Author: psychon Date: 2010-07-16 21:01:50 +0000 (Fri, 16 Jul 2010) Log Message: ----------- Fix a std::out_of_range error in partyline If the CHANTYPES token was the last one in a 005 numeric, partyline would call std::insert() with CString::npos for the position to insert at. This throws a std::out_of_range error. Fix this by using CString::append() in this case. Thanks to Superfly_ for the bug report and helping me reproduce this. Modified Paths: -------------- trunk/modules/partyline.cpp Modified: trunk/modules/partyline.cpp =================================================================== --- trunk/modules/partyline.cpp 2010-07-14 18:51:12 UTC (rev 2086) +++ trunk/modules/partyline.cpp 2010-07-16 21:01:50 UTC (rev 2087) @@ -168,7 +168,10 @@ if (uPos != CString::npos) { uPos = sLine.find(" ", uPos); - sLine.insert(uPos, CHAN_PREFIX_1); + if (uPos == CString::npos) + sLine.append(CHAN_PREFIX_1); + else + sLine.insert(uPos, CHAN_PREFIX_1); m_spInjectedPrefixes.insert(m_pUser); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2010-10-21 17:27:25
|
Revision: 2162 http://znc.svn.sourceforge.net/znc/?rev=2162&view=rev Author: psychon Date: 2010-10-21 17:27:19 +0000 (Thu, 21 Oct 2010) Log Message: ----------- partyline: Only inject prefixes if we know the prefixes There are apparently "IRC" daemons (which don't deserve that name) that don't send any 005. Yes, I'm looking at you, chat.wikileaks.org. For these servers we shouldn't inject partyline's channel prefix because that makes us send out a "CHANTYPES=~" line which severely confuses clients. XChat then turns everything into a query! Modified Paths: -------------- trunk/modules/partyline.cpp Modified: trunk/modules/partyline.cpp =================================================================== --- trunk/modules/partyline.cpp 2010-10-21 16:12:03 UTC (rev 2161) +++ trunk/modules/partyline.cpp 2010-10-21 17:27:19 UTC (rev 2162) @@ -184,7 +184,7 @@ } virtual void OnClientLogin() { - if (m_spInjectedPrefixes.find(m_pUser) == m_spInjectedPrefixes.end()) { + if (m_spInjectedPrefixes.find(m_pUser) == m_spInjectedPrefixes.end() && !m_pUser->GetChanPrefixes().empty()) { m_pClient->PutClient(":" + GetIRCServer(m_pUser) + " 005 " + m_pUser->GetIRCNick().GetNick() + " CHANTYPES=" + m_pUser->GetChanPrefixes() + CHAN_PREFIX_1 " :are supported by this server."); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |