void userrec::DecrementModes()
{
- for (int n = 0; n < 64; n++)
+ ServerInstance->Log(DEBUG,"DecrementModes()");
+ for (unsigned char n = 'A'; n <= 'z'; n++)
{
- if (modes[n])
+ if (modes[n-65])
{
- ModeHandler* mh = ServerInstance->Modes->FindMode(n+65, MODETYPE_USER);
+ ServerInstance->Log(DEBUG,"DecrementModes() found mode %c", n);
+ ModeHandler* mh = ServerInstance->Modes->FindMode(n, MODETYPE_USER);
if (mh)
+ {
+ ServerInstance->Log(DEBUG,"Found handler %c and call ChangeCount", n);
mh->ChangeCount(-1);
+ }
}
}
}
// unset their oper type (what IS_OPER checks), and remove +o
*this->oper = 0;
this->modes[UM_OPERATOR] = 0;
-
- // remove them from the opers list.
- for (std::vector<userrec*>::iterator a = ServerInstance->all_opers.begin(); a < ServerInstance->all_opers.end(); a++)
- {
- if (*a == this)
- {
- ServerInstance->all_opers.erase(a);
- return;
- }
- }
+
+ // remove the user from the oper list. Will remove multiple entries as a safeguard against bug #404
+ ServerInstance->all_opers.remove(this);
}
}
{
New = new userrec(Instance);
}
- catch (CoreException &e)
+ catch (...)
{
Instance->Log(DEFAULT,"*** WTF *** Duplicated UUID! -- Crack smoking monkies have been unleashed.");
+ Instance->WriteOpers("*** WARNING *** Duplicate UUID allocated!");
return;
}