diff --git a/ClientCommand.cpp b/ClientCommand.cpp index 37acbf99..5b38e56f 100644 --- a/ClientCommand.cpp +++ b/ClientCommand.cpp @@ -234,11 +234,38 @@ void CClient::UserCommand(CString& sLine) { return; } + CString sArgs = sLine.Token(1, true); + CServer *pServer = NULL; + + if (!sArgs.empty()) { + pServer = m_pUser->FindServer(sArgs); + if (!pServer) { + PutStatus("Server [" + sArgs + "] not found"); + return; + } + m_pUser->SetNextServer(pServer); + + if (!GetIRCSock()) { + // If we are already connecting to some server, + // we have to abort that attempt + Csock *pIRCSock = CZNC::Get().GetManager() + .FindSockByName("IRC::" + m_pUser->GetUserName()); + if (pIRCSock) + pIRCSock->Close(); + } + } + if (GetIRCSock()) { GetIRCSock()->Quit(); - PutStatus("Jumping to the next server in the list..."); + if (pServer) + PutStatus("Connecting to [" + pServer->GetName() + "]..."); + else + PutStatus("Jumping to the next server in the list..."); } else { - PutStatus("Connecting..."); + if (pServer) + PutStatus("Connecting to [" + pServer->GetName() + "]..."); + else + PutStatus("Connecting..."); } m_pUser->SetIRCConnectEnabled(true); @@ -1193,8 +1220,8 @@ void CClient::HelpUser() { } Table.AddRow(); - Table.SetCell("Command", "Jump"); - Table.SetCell("Description", "Jump to the next server in the list"); + Table.SetCell("Command", "Jump [server]"); + Table.SetCell("Description", "Jump to the next or the specified server"); Table.AddRow(); Table.SetCell("Command", "Disconnect"); diff --git a/User.cpp b/User.cpp index 97acada3..54522f42 100644 --- a/User.cpp +++ b/User.cpp @@ -925,6 +925,17 @@ CServer* CUser::GetCurrentServer() const { return m_vServers[uIdx]; } +bool CUser::SetNextServer(const CServer* pServer) { + for (unsigned int a = 0; a < m_vServers.size(); a++) { + if (m_vServers[a] == pServer) { + m_uServerIdx = a; + return true; + } + } + + return false; +} + bool CUser::CheckPass(const CString& sPass) const { switch (m_eHashType) { diff --git a/User.h b/User.h index 44304911..e762eaf5 100644 --- a/User.h +++ b/User.h @@ -60,6 +60,7 @@ public: bool AddServer(const CString& sName, unsigned short uPort, const CString& sPass = "", bool bSSL = false); CServer* GetNextServer(); CServer* GetCurrentServer() const; + bool SetNextServer(const CServer* pServer); bool CheckPass(const CString& sPass) const; bool AddAllowedHost(const CString& sHostMask); bool IsHostAllowed(const CString& sHostMask) const;