#include "inspircd.h"
-#include "inspstring.h"
/* +s (secret) */
-#include "modes/cmode_s.h"
/* +p (private) */
-#include "modes/cmode_p.h"
-/* +b (bans) */
-#include "modes/cmode_b.h"
/* +m (moderated) */
-#include "modes/cmode_m.h"
/* +t (only (half) ops can change topic) */
-#include "modes/cmode_t.h"
/* +n (no external messages) */
-#include "modes/cmode_n.h"
/* +i (invite only) */
-#include "modes/cmode_i.h"
+/* +w (see wallops) */
+/* +i (invisible) */
+#include "modes/simplemodes.h"
+/* +b (bans) */
+#include "modes/cmode_b.h"
/* +k (keyed channel) */
#include "modes/cmode_k.h"
/* +l (channel user limit) */
#include "modes/cmode_o.h"
/* +v (channel voice) */
#include "modes/cmode_v.h"
-/* +w (see wallops) */
-#include "modes/umode_w.h"
-/* +i (invisible) */
-#include "modes/umode_i.h"
/* +o (operator) */
#include "modes/umode_o.h"
/* +s (server notice masks) */
LastParseParams.clear();
LastParseTranslate.clear();
- if (!targetchannel && !targetuser)
+ if ((!targetchannel) && ((!targetuser) || (IS_SERVER(targetuser))))
{
user->WriteNumeric(ERR_NOSUCHNICK, "%s %s :No such nick/channel",user->nick.c_str(),target.c_str());
return;
continue;
}
- std::string parameter = "";
+ std::string parameter;
int pcnt = mh->GetNumParams(adding);
if (pcnt && param_at == parameters.size())
{
switch (mh->GetModeType())
{
case MODETYPE_USER:
- for (user_hash::iterator i = ServerInstance->Users->clientlist->begin(); i != ServerInstance->Users->clientlist->end(); i++)
+ for (user_hash::iterator i = ServerInstance->Users->clientlist->begin(); i != ServerInstance->Users->clientlist->end(); )
{
- mh->RemoveMode(i->second);
+ User* user = i->second;
+ ++i;
+ mh->RemoveMode(user);
}
break;
case MODETYPE_CHANNEL:
- for (chan_hash::iterator i = ServerInstance->chanlist->begin(); i != ServerInstance->chanlist->end(); i++)
+ for (chan_hash::iterator i = ServerInstance->chanlist->begin(); i != ServerInstance->chanlist->end(); )
{
- mh->RemoveMode(i->second);
+ // The channel may not be in the hash after RemoveMode(), see m_permchannels
+ Channel* chan = i->second;
+ ++i;
+ mh->RemoveMode(chan);
}
break;
}