- /* Bog off */
- // TODO replace with a real search for the proper prefix
- char needed = neededrank > HALFOP_VALUE ? '@' : '%';
- user->WriteNumeric(ERR_CHANOPRIVSNEEDED, "%s %s :You must have channel privilege %c or above to %sset channel mode %c",
- user->nick.c_str(), chan->name.c_str(), needed, adding ? "" : "un", modechar);
+ ModeHandler* neededmh = NULL;
+ for(char c='A'; c <= 'z'; c++)
+ {
+ ModeHandler *privmh = FindMode(modechar, type);
+ if (privmh->GetPrefixRank() >= neededrank)
+ {
+ // this mode is sufficient to allow this action
+ if (!neededmh || privmh->GetPrefixRank() < neededmh->GetPrefixRank())
+ neededmh = privmh;
+ }
+ }
+ if (neededmh)
+ user->WriteNumeric(ERR_CHANOPRIVSNEEDED, "%s %s :You must have channel %s access or above to %sset channel mode %c",
+ user->nick.c_str(), chan->name.c_str(), neededmh->name.c_str(), adding ? "" : "un", modechar);
+ else
+ user->WriteNumeric(ERR_CHANOPRIVSNEEDED, "%s %s :You cannot %sset channel mode %c",
+ user->nick.c_str(), chan->name.c_str(), adding ? "" : "un", modechar);