diff --git a/src/Client.cpp b/src/Client.cpp index 6591e7f5..bda6f7a1 100644 --- a/src/Client.cpp +++ b/src/Client.cpp @@ -20,6 +20,7 @@ #include #include +using std::set; using std::map; using std::vector; @@ -415,31 +416,34 @@ void CClient::ReadLine(const CString& sData) { } if (sCommand.Equals("DETACH")) { - CString sChannels = sLine.Token(1).TrimPrefix_n(); + CString sPatterns = sLine.Token(1, true); - if (sChannels.empty()) { - PutStatusNotice("Usage: /detach <#chan>"); + if (sPatterns.empty()) { + PutStatusNotice("Usage: /detach <#chans>"); return; } - VCString vChans; - sChannels.Split(",", vChans, false); - sChannels.clear(); + VCString vsChans; + sPatterns.Replace(",", " "); + sPatterns.Split(" ", vsChans, false, "", "", true, true); - for (VCString::const_iterator channelIterator = vChans.begin(); - channelIterator != vChans.end(); - ++channelIterator) - { - CString sChannel = *channelIterator; - - CChan *pChannel = m_pNetwork->FindChan(sChannel); - if (pChannel) { - pChannel->DetachUser(); - } else { - PutStatusNotice("You are not on [" + sChannel + "]"); - } + set sChans; + for (const CString& sChan : vsChans) { + vector vChans = m_pNetwork->FindChans(sChan); + sChans.insert(vChans.begin(), vChans.end()); } + unsigned int uDetached = 0; + for (CChan* pChan : sChans) { + if (pChan->IsDetached()) + continue; + uDetached++; + pChan->DetachUser(); + } + + PutStatusNotice("There were [" + CString(sChans.size()) + "] channels matching [" + sPatterns + "]"); + PutStatusNotice("Detached [" + CString(uDetached) + "] channels"); + return; } else if (sCommand.Equals("JOIN")) { CString sChans = sLine.Token(1).TrimPrefix_n(); diff --git a/src/ClientCommand.cpp b/src/ClientCommand.cpp index 6869cc9e..868b0dfa 100644 --- a/src/ClientCommand.cpp +++ b/src/ClientCommand.cpp @@ -112,31 +112,32 @@ void CClient::UserCommand(CString& sLine) { return; } - CString sChan = sLine.Token(1).MakeLower(); + CString sPatterns = sLine.Token(1, true); - if (sChan.empty()) { - PutStatus("Usage: Detach <#chan>"); + if (sPatterns.empty()) { + PutStatus("Usage: Detach <#chans>"); return; } - const vector& vChans = m_pNetwork->GetChans(); - vector::const_iterator it; - unsigned int uMatches = 0, uDetached = 0; - for (it = vChans.begin(); it != vChans.end(); ++it) { - CChan *pChannel = *it; - CString channelName = pChannel->GetName().AsLower(); + VCString vsChans; + sPatterns.Replace(",", " "); + sPatterns.Split(" ", vsChans, false, "", "", true, true); - if (!channelName.WildCmp(sChan)) - continue; - uMatches++; - - if ((*it)->IsDetached()) - continue; - uDetached++; - (*it)->DetachUser(); + set sChans; + for (const CString& sChan : vsChans) { + vector vChans = m_pNetwork->FindChans(sChan); + sChans.insert(vChans.begin(), vChans.end()); } - PutStatus("There were [" + CString(uMatches) + "] channels matching [" + sChan + "]"); + unsigned int uDetached = 0; + for (CChan* pChan : sChans) { + if (pChan->IsDetached()) + continue; + uDetached++; + pChan->DetachUser(); + } + + PutStatus("There were [" + CString(sChans.size()) + "] channels matching [" + sPatterns + "]"); PutStatus("Detached [" + CString(uDetached) + "] channels"); } else if (sCommand.Equals("VERSION")) { PutStatus(CZNC::GetTag()); @@ -363,26 +364,30 @@ void CClient::UserCommand(CString& sLine) { return; } - CString sChan = sLine.Token(1, true); + CString sPatterns = sLine.Token(1, true); - if (sChan.empty()) { - PutStatus("Usage: EnableChan "); + if (sPatterns.empty()) { + PutStatus("Usage: EnableChan <#chans>"); } else { - const vector& vChans = m_pNetwork->GetChans(); - vector::const_iterator it; - unsigned int uMatches = 0, uEnabled = 0; - for (it = vChans.begin(); it != vChans.end(); ++it) { - if (!(*it)->GetName().WildCmp(sChan)) - continue; - uMatches++; + VCString vsChans; + sPatterns.Replace(",", " "); + sPatterns.Split(" ", vsChans, false, "", "", true, true); - if (!(*it)->IsDisabled()) - continue; - uEnabled++; - (*it)->Enable(); + set sChans; + for (const CString& sChan : vsChans) { + vector vChans = m_pNetwork->FindChans(sChan); + sChans.insert(vChans.begin(), vChans.end()); } - PutStatus("There were [" + CString(uMatches) + "] channels matching [" + sChan + "]"); + unsigned int uEnabled = 0; + for (CChan* pChan : sChans) { + if (!pChan->IsDisabled()) + continue; + uEnabled++; + pChan->Enable(); + } + + PutStatus("There were [" + CString(sChans.size()) + "] channels matching [" + sPatterns + "]"); PutStatus("Enabled [" + CString(uEnabled) + "] channels"); } } else if (sCommand.Equals("DISABLECHAN")) { @@ -391,26 +396,30 @@ void CClient::UserCommand(CString& sLine) { return; } - CString sChan = sLine.Token(1, true); + CString sPatterns = sLine.Token(1, true); - if (sChan.empty()) { - PutStatus("Usage: DisableChan "); + if (sPatterns.empty()) { + PutStatus("Usage: DisableChan <#chans>"); } else { - const vector& vChans = m_pNetwork->GetChans(); - vector::const_iterator it; - unsigned int uMatches = 0, uDisabled = 0; - for (it = vChans.begin(); it != vChans.end(); ++it) { - if (!(*it)->GetName().WildCmp(sChan)) - continue; - uMatches++; + VCString vsChans; + sPatterns.Replace(",", " "); + sPatterns.Split(" ", vsChans, false, "", "", true, true); - if ((*it)->IsDisabled()) - continue; - uDisabled++; - (*it)->Disable(); + set sChans; + for (const CString& sChan : vsChans) { + vector vChans = m_pNetwork->FindChans(sChan); + sChans.insert(vChans.begin(), vChans.end()); } - PutStatus("There were [" + CString(uMatches) + "] channels matching [" + sChan + "]"); + unsigned int uDisabled = 0; + for (CChan* pChan : sChans) { + if (pChan->IsDisabled()) + continue; + uDisabled++; + pChan->Disable(); + } + + PutStatus("There were [" + CString(sChans.size()) + "] channels matching [" + sPatterns + "]"); PutStatus("Disabled [" + CString(uDisabled) + "] channels"); } } else if (sCommand.Equals("LISTCHANS")) { @@ -1594,9 +1603,9 @@ void CClient::HelpUser(const CString& sFilter) { AddCommandHelp(Table, "AddServer", " [[+]port] [pass]", "Add a server to the list of alternate/backup servers of current IRC network.", sFilter); AddCommandHelp(Table, "DelServer", " [port] [pass]", "Remove a server from the list of alternate/backup servers of current IRC network", sFilter); - AddCommandHelp(Table, "EnableChan", "<#chan>", "Enable the channel", sFilter); - AddCommandHelp(Table, "DisableChan", "<#chan>", "Disable the channel", sFilter); - AddCommandHelp(Table, "Detach", "<#chan>", "Detach from the channel", sFilter); + AddCommandHelp(Table, "EnableChan", "<#chans>", "Enable channels", sFilter); + AddCommandHelp(Table, "DisableChan", "<#chans>", "Disable channels", sFilter); + AddCommandHelp(Table, "Detach", "<#chans>", "Detach from channels", sFilter); AddCommandHelp(Table, "Topics", "", "Show topics in all your channels", sFilter); AddCommandHelp(Table, "PlayBuffer", "<#chan|query>", "Play back the specified buffer", sFilter);