+ Channel* const chan = ServerInstance->FindChan(parameters[0]);
+ if (!chan)
+ {
+ src->WriteNumeric(ERR_NOSUCHNICK, "%s :No such nick/channel", parameters[0].c_str());
+ return CMD_FAILURE;
+ }
+
+ if (parameters.size() == 1)
+ {
+ DisplayList(src, chan);
+ return CMD_SUCCESS;
+ }
+ unsigned int i = 1;
+ Modes::ChangeList modes;
+ while (i < parameters.size())
+ {
+ std::string prop = parameters[i++];
+ bool plus = prop[0] != '-';
+ if (prop[0] == '+' || prop[0] == '-')
+ prop.erase(prop.begin());
+
+ ModeHandler* mh = ServerInstance->Modes->FindMode(prop, MODETYPE_CHANNEL);
+ if (mh)
+ {
+ if (mh->GetNumParams(plus))
+ {
+ if (i != parameters.size())
+ modes.push(mh, plus, parameters[i++]);
+ }
+ else
+ modes.push(mh, plus);
+ }
+ }
+ ServerInstance->Modes->ProcessSingle(src, chan, NULL, modes, ModeParser::MODE_CHECKACCESS);
+ return CMD_SUCCESS;