예제 #1
0
	virtual void RunJob()
	{
		if (!m_pUser->GetIRCSock())
			return;

		for (MCString::iterator it = BeginNV(); it != EndNV(); ++it)
		{
			CChan *pChan = m_pUser->FindChan(it->first);
			if (!pChan) {
				pChan = new CChan(it->first, m_pUser, true);
				if (!it->second.empty())
					pChan->SetKey(it->second);
				if (!m_pUser->AddChan(pChan)) {
					/* AddChan() deleted that channel */
					PutModule("Could not join [" + it->first
							+ "] (# prefix missing?)");
					continue;
				}
			}
			if (!pChan->IsOn()) {
				PutModule("Joining [" + pChan->GetName() + "]");
				PutIRC("JOIN " + pChan->GetName() + (pChan->GetKey().empty()
							? "" : " " + pChan->GetKey()));
			}
		}
	}
예제 #2
0
파일: kickrejoin.cpp 프로젝트: bpcampbe/znc
	virtual void RunJob() {
		CUser* user = m_pModule->GetUser();
		CChan* pChan = user->FindChan(GetName().Token(1, true));

		if (pChan) {
			pChan->Enable();
			GetModule()->PutIRC("JOIN " + pChan->GetName() + " " + pChan->GetKey());
		}
	}
예제 #3
0
파일: kickrejoin.cpp 프로젝트: James-TR/znc
	virtual void RunJob() override {
		CIRCNetwork* pNetwork = GetModule()->GetNetwork();
		CChan* pChan = pNetwork->FindChan(GetName().Token(1, true));

		if (pChan) {
			pChan->Enable();
			GetModule()->PutIRC("JOIN " + pChan->GetName() + " " + pChan->GetKey());
		}
	}
예제 #4
0
파일: IRCNetwork.cpp 프로젝트: Jyzee/znc
void CIRCNetwork::JoinChans() {
    bool bHaveKey = false;
    size_t joinLength = 4;  // join
    CString sChannels, sKeys;

    for (vector<CChan*>::iterator it = m_vChans.begin(); it != m_vChans.end(); ++it) {
        CChan *pChan = *it;

        if (pChan->IsOn() || pChan->IsDisabled() || !JoinChan(pChan)) {
            continue;
        }

        size_t length = pChan->GetName().length() + pChan->GetKey().length() + 2;  // +2 for either space or commas

        if ((joinLength + length) >= 510) {
            // Sent what we got, and cleanup
            PutIRC("JOIN " + sChannels + (bHaveKey ? (" " + sKeys) : ""));

            sChannels = "";
            sKeys = "";
            joinLength = 4;  // join
            bHaveKey = false;
        }

        if (!sChannels.empty()) {
            sChannels += ",";
            sKeys += ",";
        }

        if (!pChan->GetKey().empty()) {
            bHaveKey = true;
            sKeys += pChan->GetKey();
        }

        sChannels += pChan->GetName();
        joinLength += length;
    }

    if (!sChannels.empty()) {
        PutIRC("JOIN " + sChannels + (bHaveKey ? (" " + sKeys) : ""));
    }
}
예제 #5
0
파일: kickrejoin.cpp 프로젝트: bpcampbe/znc
	virtual void OnKick(const CNick& OpNick, const CString& sKickedNick, CChan& pChan, const CString& sMessage) {
		if (m_pUser->GetCurNick().Equals(sKickedNick)) {
			if (!delay) {
				PutIRC("JOIN " + pChan.GetName() + " " + pChan.GetKey());
				pChan.Enable();
				return;
			}
			AddTimer(new CRejoinJob(this, delay, 1, "Rejoin " + pChan.GetName(),
						"Rejoin channel after a delay"));
		}
	}
예제 #6
0
파일: Chan.cpp 프로젝트: jimloco/znc
void CChan::Clone(CChan& chan) {
	// We assume that m_sName and m_pNetwork are equal
	SetBufferCount(chan.GetBufferCount(), true);
	SetKeepBuffer(chan.KeepBuffer());
	SetKey(chan.GetKey());
	SetDefaultModes(chan.GetDefaultModes());

	if (IsDetached() != chan.IsDetached()) {
		// Only send something if it makes sense
		// (= Only detach if client is on the channel
		//    and only attach if we are on the channel)
		if (IsOn()) {
			if (IsDetached()) {
				JoinUser(false, "");
			} else {
				DetachUser();
			}
		}
		SetDetached(chan.IsDetached());
	}
}