Merge pull request #560 from ahf/join-channels-on-connect

Start joining channels immediately after connect
This commit is contained in:
Alexey Sokolov
2014-06-21 22:56:47 +01:00
5 changed files with 85 additions and 26 deletions
+9
View File
@@ -32,6 +32,8 @@ class CConfig;
class CChan;
class CServer;
class CIRCSock;
class CIRCNetworkPingTimer;
class CIRCNetworkJoinTimer;
class CIRCNetwork {
public:
@@ -41,6 +43,10 @@ public:
CIRCNetwork(CUser *pUser, const CIRCNetwork& Network);
~CIRCNetwork();
enum {
PING_TIMEOUT = 270
};
void Clone(const CIRCNetwork& Network, bool bCloneName = true);
CString GetNetworkPath();
@@ -196,6 +202,9 @@ protected:
CBuffer m_RawBuffer;
CBuffer m_MotdBuffer;
CBuffer m_QueryBuffer;
CIRCNetworkPingTimer* m_pPingTimer;
CIRCNetworkJoinTimer* m_pJoinTimer;
};
#endif // !_IRCNETWORK_H
+5
View File
@@ -257,6 +257,11 @@ public:
if (sLine.Token(1) == "396" && sLine.Token(3).find("users.quakenet.org") != CString::npos) {
m_bCloaked = true;
PutModule("Cloak successful: Your hostname is now cloaked.");
// Join channels immediately after our spoof is set.
if (m_bJoinAfterCloaked) {
m_pNetwork->JoinChans();
}
}
return CONTINUE;
}
+66 -1
View File
@@ -25,6 +25,59 @@
using std::vector;
using std::set;
class CIRCNetworkPingTimer : public CCron {
public:
CIRCNetworkPingTimer(CIRCNetwork *pNetwork) : CCron() {
m_pNetwork = pNetwork;
SetName("CIRCNetworkPingTimer::" + m_pNetwork->GetUser()->GetUserName() + "::" + m_pNetwork->GetName());
Start(30);
}
virtual ~CIRCNetworkPingTimer() {}
protected:
virtual void RunJob() {
CIRCSock* pIRCSock = m_pNetwork->GetIRCSock();
if (pIRCSock && pIRCSock->GetTimeSinceLastDataTransaction() >= CIRCNetwork::PING_TIMEOUT) {
pIRCSock->PutIRC("PING :ZNC");
}
vector<CClient*>& vClients = m_pNetwork->GetClients();
for (size_t b = 0; b < vClients.size(); b++) {
CClient* pClient = vClients[b];
if (pClient->GetTimeSinceLastDataTransaction() >= CIRCNetwork::PING_TIMEOUT) {
pClient->PutClient("PING :ZNC");
}
}
}
private:
CIRCNetwork* m_pNetwork;
};
class CIRCNetworkJoinTimer : public CCron {
public:
CIRCNetworkJoinTimer(CIRCNetwork *pNetwork) : CCron() {
m_pNetwork = pNetwork;
SetName("CIRCNetworkJoinTimer::" + m_pNetwork->GetUser()->GetUserName() + "::" + m_pNetwork->GetName());
Start(30);
}
virtual ~CIRCNetworkJoinTimer() {}
protected:
virtual void RunJob() {
if (m_pNetwork->IsIRCConnected()) {
m_pNetwork->JoinChans();
}
}
private:
CIRCNetwork* m_pNetwork;
};
bool CIRCNetwork::IsValidNetwork(const CString& sNetwork) {
// ^[-\w]+$
@@ -65,6 +118,12 @@ CIRCNetwork::CIRCNetwork(CUser *pUser, const CString& sName) {
m_MotdBuffer.SetLineCount(200, true); // This should be more than enough motd lines
m_QueryBuffer.SetLineCount(250, true);
m_pPingTimer = new CIRCNetworkPingTimer(this);
CZNC::Get().GetManager().AddCron(m_pPingTimer);
m_pJoinTimer = new CIRCNetworkJoinTimer(this);
CZNC::Get().GetManager().AddCron(m_pJoinTimer);
SetIRCConnectEnabled(true);
}
@@ -226,6 +285,9 @@ CIRCNetwork::~CIRCNetwork() {
// Make sure we are not in the connection queue
CZNC::Get().GetConnectionQueue().remove(this);
CZNC::Get().GetManager().DelCronByAddr(m_pPingTimer);
CZNC::Get().GetManager().DelCronByAddr(m_pJoinTimer);
}
void CIRCNetwork::DelServers() {
@@ -718,8 +780,11 @@ void CIRCNetwork::JoinChans() {
sChans.insert(pChan);
// Limit the number of joins
if (uJoins != 0 && --uJoins == 0)
if (uJoins != 0 && --uJoins == 0) {
// Reset the timer.
m_pJoinTimer->Reset();
break;
}
}
}
+4
View File
@@ -199,6 +199,10 @@ void CIRCSock::ReadLine(const CString& sData) {
m_pNetwork->ClearRawBuffer();
m_pNetwork->AddRawBuffer(":" + _NAMEDFMT(sServer) + " " + sCmd + " {target} " + _NAMEDFMT(sRest));
// Join the first set of channels as soon as we are connected
// and let the CIRCNetworkJoinTimer join the rest.
m_pNetwork->JoinChans();
break;
}
case 5:
+1 -25
View File
@@ -36,35 +36,11 @@ public:
private:
protected:
virtual void RunJob() {
vector<CIRCNetwork*> vNetworks = m_pUser->GetNetworks();
for (size_t a = 0; a < vNetworks.size(); a++) {
CIRCNetwork* pNetwork = vNetworks[a];
CIRCSock* pIRCSock = pNetwork->GetIRCSock();
if (pIRCSock && pIRCSock->GetTimeSinceLastDataTransaction() >= 270) {
pIRCSock->PutIRC("PING :ZNC");
}
if (pNetwork->IsIRCConnected()) {
pNetwork->JoinChans();
}
vector<CClient*>& vClients = pNetwork->GetClients();
for (size_t b = 0; b < vClients.size(); b++) {
CClient* pClient = vClients[b];
if (pClient->GetTimeSinceLastDataTransaction() >= 270) {
pClient->PutClient("PING :ZNC");
}
}
}
vector<CClient*>& vUserClients = m_pUser->GetUserClients();
for (size_t c = 0; c < vUserClients.size(); ++c) {
CClient* pUserClient = vUserClients[c];
if (pUserClient->GetTimeSinceLastDataTransaction() >= 270) {
if (pUserClient->GetTimeSinceLastDataTransaction() >= CIRCNetwork::PING_TIMEOUT) {
pUserClient->PutClient("PING :ZNC");
}
}