#include "inspircd.h"
-/* $ModDesc: Provides channel mode +f (message flood protection) */
-
/** Holds flood settings and state for mode +f
*/
class floodsettings
ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string ¶meter, bool adding)
{
- floodsettings *f = ext.get(channel);
-
if (adding)
{
std::string::size_type colon = parameter.find(':');
return MODEACTION_DENY;
}
+ floodsettings* f = ext.get(channel);
if ((f) && (nlines == f->lines) && (nsecs == f->secs) && (ban == f->ban))
// mode params match
return MODEACTION_DENY;
ext.set(channel, new floodsettings(ban, nsecs, nlines));
parameter = std::string(ban ? "*" : "") + ConvToStr(nlines) + ":" + ConvToStr(nsecs);
- channel->SetModeParam('f', parameter);
return MODEACTION_ALLOW;
}
else
{
- if (f)
- {
- ext.unset(channel);
- channel->SetModeParam('f', "");
- return MODEACTION_ALLOW;
- }
- }
+ if (!channel->IsModeSet(this))
+ return MODEACTION_DENY;
- return MODEACTION_DENY;
+ ext.unset(channel);
+ return MODEACTION_ALLOW;
+ }
}
};
ModuleMsgFlood()
: mf(this)
{
- if (!ServerInstance->Modes->AddMode(&mf))
- throw ModuleException("Could not add new modes!");
- ServerInstance->Extensions.Register(&mf.ext);
- Implementation eventlist[] = { I_OnUserPreNotice, I_OnUserPreMessage };
- ServerInstance->Modules->Attach(eventlist, this, 2);
+ }
+
+ void init() CXX11_OVERRIDE
+ {
+ ServerInstance->Modules->AddService(mf);
+ ServerInstance->Modules->AddService(mf.ext);
+ ServerInstance->Modules->Attach(I_OnUserPreMessage, this);
}
ModResult ProcessMessages(User* user,Channel* dest, const std::string &text)
{
- if ((!IS_LOCAL(user)) || !dest->IsModeSet('f'))
+ if ((!IS_LOCAL(user)) || !dest->IsModeSet(mf))
return MOD_RES_PASSTHRU;
if (ServerInstance->OnCheckExemption(user,dest,"flood") == MOD_RES_ALLOW)
std::vector<std::string> parameters;
parameters.push_back(dest->name);
parameters.push_back("+b");
- parameters.push_back(user->MakeWildHost());
- ServerInstance->SendGlobalMode(parameters, ServerInstance->FakeClient);
+ parameters.push_back("*!*@" + user->dhost);
+ ServerInstance->Modes->Process(parameters, ServerInstance->FakeClient);
}
- char kickmessage[MAXBUF];
- snprintf(kickmessage, MAXBUF, "Channel flood triggered (limit is %u lines in %u secs)", f->lines, f->secs);
+ const std::string kickMessage = "Channel flood triggered (limit is " + ConvToStr(f->lines) +
+ " in " + ConvToStr(f->secs) + " secs)";
- dest->KickUser(ServerInstance->FakeClient, user, kickmessage);
+ dest->KickUser(ServerInstance->FakeClient, user, kickMessage);
return MOD_RES_DENY;
}
return MOD_RES_PASSTHRU;
}
- ModResult OnUserPreMessage(User *user, void *dest, int target_type, std::string &text, char status, CUList &exempt_list)
- {
- if (target_type == TYPE_CHANNEL)
- return ProcessMessages(user,(Channel*)dest,text);
-
- return MOD_RES_PASSTHRU;
- }
-
- ModResult OnUserPreNotice(User *user, void *dest, int target_type, std::string &text, char status, CUList &exempt_list)
+ ModResult OnUserPreMessage(User* user, void* dest, int target_type, std::string& text, char status, CUList& exempt_list, MessageType msgtype) CXX11_OVERRIDE
{
if (target_type == TYPE_CHANNEL)
return ProcessMessages(user,(Channel*)dest,text);
return MOD_RES_PASSTHRU;
}
- ~ModuleMsgFlood()
+ void Prioritize()
{
+ // we want to be after all modules that might deny the message (e.g. m_muteban, m_noctcp, m_blockcolor, etc.)
+ ServerInstance->Modules->SetPriority(this, I_OnUserPreMessage, PRIORITY_LAST);
}
- Version GetVersion()
+ Version GetVersion() CXX11_OVERRIDE
{
return Version("Provides channel mode +f (message flood protection)", VF_VENDOR);
}