* ---------------------------------------------------
*/
-/* $Core */
-
#include "inspircd.h"
#include "inspstring.h"
{
}
-ModeHandler::~ModeHandler()
+CullResult ModeHandler::cull()
{
ServerInstance->Modes->DelMode(this);
+ return classbase::cull();
+}
+
+ModeHandler::~ModeHandler()
+{
+ if (ServerInstance && ServerInstance->Modes->FindMode(mode, m_type) == this)
+ ServerInstance->Logs->Log("MODE", DEBUG, "ERROR: Destructor for mode %c called while not culled", mode);
}
bool ModeHandler::IsListMode()
return;
}
- std::string mode_sequence = parameters[1];
+ ModResult MOD_RESULT;
+ FIRST_MOD_RESULT(OnPreMode, MOD_RESULT, (user, targetuser, targetchannel, parameters));
bool SkipAccessChecks = false;
- if (!IS_LOCAL(user) || ServerInstance->ULine(user->server))
- {
+ if (!IS_LOCAL(user) || ServerInstance->ULine(user->server) || MOD_RESULT == MOD_RES_ALLOW)
SkipAccessChecks = true;
- }
- else
- {
- ModResult MOD_RESULT;
- FIRST_MOD_RESULT(OnPreMode, MOD_RESULT, (user, targetuser, targetchannel, parameters));
- if (MOD_RESULT == MOD_RES_DENY)
- return;
- SkipAccessChecks = (MOD_RESULT == MOD_RES_ALLOW);
- }
+ else if (MOD_RESULT == MOD_RES_DENY)
+ return;
if (targetuser && !SkipAccessChecks && user != targetuser)
{
return;
}
+ std::string mode_sequence = parameters[1];
+
std::string output_mode;
std::ostringstream output_parameters;
LastParseParams.push_back(output_mode);
mh->GetModeType() == MODETYPE_USER ? mask = MASK_USER : mask = MASK_CHANNEL;
pos = (mh->GetModeChar()-65) | mask;
- if (!modehandlers[pos])
+ if (modehandlers[pos] != mh)
return false;
/* Note: We can't stack here, as we have modes potentially being removed across many different channels.
{
ModeHandler* mh = ServerInstance->Modes->FindMode('h', MODETYPE_CHANNEL);
if (mh)
+ {
+ mh->cull();
delete mh;
+ }
}