}
}
-void CChan::ModeChange(const CString& sModes, const VCString& vsModes, const CNick* pOpNick) {
+void CChan::ModeChange(const CString& sModes, const VCString& vsModes,
+ const CNick* pOpNick) {
bool bAdd = true;
/* Try to find a CNick* from this channel so that pOpNick->HasPerm()
}
VCString::const_iterator argIter = vsModes.begin();
+ const CString sEmpty;
+ auto nextArg = [&]() -> const CString& {
+ if (argIter == vsModes.end()) {
+ return sEmpty;
+ }
+ return *argIter++;
+ };
for (unsigned int a = 0; a < sModes.size(); a++) {
const char& cMode = sModes[a];
} else if (cMode == '-') {
bAdd = false;
} else if (m_pNetwork->GetIRCSock()->IsPermMode(cMode)) {
- CString sArg = *argIter++;
+ const CString& sArg = nextArg();
CNick* pNick = FindNick(sArg);
if (pNick) {
- char cPerm =
- m_pNetwork->GetIRCSock()->GetPermFromMode(cMode);
+ char cPerm = m_pNetwork->GetIRCSock()->GetPermFromMode(cMode);
if (cPerm) {
bool bNoChange = (pNick->HasPerm(cPerm) == bAdd);
switch (m_pNetwork->GetIRCSock()->GetModeType(cMode)) {
case CIRCSock::ListArg:
bList = true;
- sArg = *argIter++;
+ sArg = nextArg();
break;
case CIRCSock::HasArg:
- sArg = *argIter++;
+ sArg = nextArg();
break;
case CIRCSock::NoArg:
break;
case CIRCSock::ArgWhenSet:
if (bAdd) {
- sArg = *argIter++;
+ sArg = nextArg();
}
break;
}
TEST_F(IRCSockTest, StatusModes) {
- m_pTestSock->ReadLine(":server 005 user PREFIX=(Yohv)!@%+ :are supported by this server");
+ m_pTestSock->ReadLine(
+ ":server 005 user PREFIX=(Yohv)!@%+ :are supported by this server");
EXPECT_TRUE(m_pTestSock->IsPermMode('Y'));
EXPECT_TRUE(m_pTestSock->IsPermMode('o'));
EXPECT_EQ(m_pTestChan->GetBuffer().GetLine(0, *m_pTestClient),
":someone PRIVMSG @#chan :hello ops");
}
+
+TEST_F(IRCSockTest, ChanMode) {
+ // https://github.com/znc/znc/issues/1684
+ m_pTestSock->ReadLine(
+ ":irc.znc.in 001 me :Welcome to the Internet Relay Network me");
+ m_pTestSock->ReadLine(
+ ":irc.znc.in 005 me CHANMODES=be,f,lj,nti "
+ ":are supported by this server");
+ m_pTestSock->ReadLine(":irc.znc.in 324 me #chan +ntf ");
+}