+ virtual void On005Numeric(std::string &output)
+ {
+ ServerInstance->AddExtBanChar('N');
+ }
+
+ virtual ModResult OnUserPreNick(User* user, const std::string &newnick)
+ {
+ if (!IS_LOCAL(user))
+ return MOD_RES_PASSTHRU;
+
+ if (isdigit(newnick[0])) /* don't even think about touching a switch to uid! */
+ return MOD_RES_PASSTHRU;
+
+ // Allow forced nick changes.
+ if (User::NICKForced.get(user))
+ return MOD_RES_PASSTHRU;
+
+ for (UCListIter i = user->chans.begin(); i != user->chans.end(); i++)
+ {
+ Channel* curr = *i;
+
+ if (CHANOPS_EXEMPT('N') && curr->GetPrefixValue(user) == OP_VALUE)
+ continue;
+
+ if (!curr->GetExtBanStatus(user, 'N').check(!curr->IsModeSet('N')))
+ {
+ user->WriteNumeric(ERR_CANTCHANGENICK, "%s :Can't change nickname while on %s (+N is set)",
+ user->nick.c_str(), curr->name.c_str());
+ return MOD_RES_DENY;
+ }
+ }
+
+ return MOD_RES_PASSTHRU;
+ }
+};