Merge branch 'reorder'

This commit is contained in:
Alexey Sokolov
2020-10-04 20:40:45 +01:00
11 changed files with 207 additions and 19 deletions
+51 -1
View File
@@ -453,6 +453,46 @@ void CClient::UserCommand(CString& sLine) {
PutStatus(t_p("Disabled {1} channel", "Disabled {1} channels",
uDisabled)(uDisabled));
}
} else if (sCommand.Equals("MOVECHAN")) {
if (!m_pNetwork) {
PutStatus(t_s(
"You must be connected with a network to use this command"));
return;
}
const auto sChan = sLine.Token(1);
const auto sTarget = sLine.Token(2);
if (sChan.empty() || sTarget.empty()) {
PutStatus(t_s("Usage: MoveChan <#chan> <index>"));
return;
}
unsigned int uIndex = sTarget.ToUInt();
CString sError;
if (m_pNetwork->MoveChan(sChan, uIndex - 1, sError))
PutStatus(t_f("Moved channel {1} to index {2}")(sChan, uIndex));
else
PutStatus(sError);
} else if (sCommand.Equals("SWAPCHANS")) {
if (!m_pNetwork) {
PutStatus(t_s(
"You must be connected with a network to use this command"));
return;
}
const auto sChan1 = sLine.Token(1);
const auto sChan2 = sLine.Token(2);
if (sChan1.empty() || sChan2.empty()) {
PutStatus(t_s("Usage: SwapChans <#chan1> <#chan2>"));
return;
}
CString sError;
if (m_pNetwork->SwapChans(sChan1, sChan2, sError))
PutStatus(t_f("Swapped channels {1} and {2}")(sChan1, sChan2));
else
PutStatus(sError);
} else if (sCommand.Equals("LISTCHANS")) {
if (!m_pNetwork) {
PutStatus(t_s(
@@ -496,6 +536,7 @@ void CClient::UserCommand(CString& sLine) {
}
CTable Table;
Table.AddColumn(t_s("Index", "listchans"));
Table.AddColumn(t_s("Name", "listchans"));
Table.AddColumn(t_s("Status", "listchans"));
Table.AddColumn(t_s("In config", "listchans"));
@@ -508,10 +549,12 @@ void CClient::UserCommand(CString& sLine) {
Table.AddColumn(CString(cPerm));
}
unsigned int uNumDetached = 0, uNumDisabled = 0, uNumJoined = 0;
unsigned int uNumDetached = 0, uNumDisabled = 0, uNumJoined = 0,
uChanIndex = 1;
for (const CChan* pChan : vChans) {
Table.AddRow();
Table.SetCell(t_s("Index", "listchans"), CString(uChanIndex));
Table.SetCell(t_s("Name", "listchans"),
pChan->GetPermStr() + pChan->GetName());
Table.SetCell(
@@ -545,6 +588,8 @@ void CClient::UserCommand(CString& sLine) {
if (pChan->IsDetached()) uNumDetached++;
if (pChan->IsOn()) uNumJoined++;
if (pChan->IsDisabled()) uNumDisabled++;
uChanIndex++;
}
PutStatus(Table);
@@ -1781,6 +1826,11 @@ void CClient::HelpUser(const CString& sFilter) {
t_s("Enable channels", "helpcmd|EnableChan|desc"));
AddCommandHelp("DisableChan", t_s("<#chans>", "helpcmd|DisableChan|args"),
t_s("Disable channels", "helpcmd|DisableChan|desc"));
AddCommandHelp("MoveChan", t_s("<#chan> <index>", "helpcmd|MoveChan|args"),
t_s("Move channel in sort order", "helpcmd|MoveChan|desc"));
AddCommandHelp(
"SwapChans", t_s("<#chan1> <#chan2>", "helpcmd|SwapChans|args"),
t_s("Swap channels in sort order", "helpcmd|SwapChans|desc"));
AddCommandHelp("Attach", t_s("<#chans>", "helpcmd|Attach|args"),
t_s("Attach to channels", "helpcmd|Attach|desc"));
AddCommandHelp("Detach", t_s("<#chans>", "helpcmd|Detach|args"),
+7 -4
View File
@@ -68,6 +68,7 @@ bool CConfig::Parse(CFile& file, CString& sErrorMsg) {
std::stringstream stream; \
stream << "Error on line " << uLineNum << ": " << arg; \
sErrorMsg = stream.str(); \
m_SubConfigNameSets.clear(); \
m_SubConfigs.clear(); \
m_ConfigEntries.clear(); \
return false; \
@@ -122,14 +123,16 @@ bool CConfig::Parse(CFile& file, CString& sErrorMsg) {
else
pActiveConfig = &ConfigStack.top().Config;
SubConfig& conf = pActiveConfig->m_SubConfigs[sTag.AsLower()];
SubConfig::const_iterator it = conf.find(sName);
const auto sTagLower = sTag.AsLower();
auto& nameset = pActiveConfig->m_SubConfigNameSets[sTagLower];
if (it != conf.end())
if (nameset.find(sName) != nameset.end())
ERROR("Duplicate entry for tag \"" << sTag << "\" name \""
<< sName << "\".");
conf[sName] = CConfigEntry(myConfig);
nameset.insert(sName);
pActiveConfig->m_SubConfigs[sTagLower].emplace_back(sName,
myConfig);
} else {
if (sValue.empty())
ERROR("Empty block name at begin of block.");
+43
View File
@@ -942,6 +942,49 @@ bool CIRCNetwork::DelChan(const CString& sName) {
return false;
}
bool CIRCNetwork::MoveChan(const CString& sChan, unsigned int uIndex,
CString& sError) {
if (uIndex >= m_vChans.size()) {
sError = t_s("Invalid index");
return false;
}
auto it = m_vChans.begin();
for (; it != m_vChans.end(); ++it)
if ((*it)->GetName().Equals(sChan)) break;
if (it == m_vChans.end()) {
sError = t_f("You are not on {1}")(sChan);
return false;
}
const auto pChan = *it;
m_vChans.erase(it);
m_vChans.insert(m_vChans.begin() + uIndex, pChan);
return true;
}
bool CIRCNetwork::SwapChans(const CString& sChan1, const CString& sChan2,
CString& sError) {
auto it1 = m_vChans.begin();
for (; it1 != m_vChans.end(); ++it1)
if ((*it1)->GetName().Equals(sChan1)) break;
if (it1 == m_vChans.end()) {
sError = t_f("You are not on {1}")(sChan1);
return false;
}
auto it2 = m_vChans.begin();
for (; it2 != m_vChans.end(); ++it2)
if ((*it2)->GetName().Equals(sChan2)) break;
if (it2 == m_vChans.end()) {
sError = t_f("You are not on {1}")(sChan2);
return false;
}
std::swap(*it1, *it2);
return true;
}
void CIRCNetwork::JoinChans() {
// Avoid divsion by zero, it's bad!
if (m_vChans.empty()) return;