#include "inspircd.h"
+#include "modules/ctctags.h"
class DelayMsgMode : public ParamMode<DelayMsgMode, LocalIntExt>
{
: ParamMode<DelayMsgMode, LocalIntExt>(Parent, "delaymsg", 'd')
, jointime("delaymsg", ExtensionItem::EXT_MEMBERSHIP, Parent)
{
- levelrequired = OP_VALUE;
+ ranktoset = ranktounset = OP_VALUE;
+ syntax = "<seconds>";
}
- bool ResolveModeConflict(std::string &their_param, const std::string &our_param, Channel*)
+ bool ResolveModeConflict(std::string& their_param, const std::string& our_param, Channel*) CXX11_OVERRIDE
{
return (atoi(their_param.c_str()) < atoi(our_param.c_str()));
}
- ModeAction OnSet(User* source, Channel* chan, std::string& parameter);
- void OnUnset(User* source, Channel* chan);
+ ModeAction OnSet(User* source, Channel* chan, std::string& parameter) CXX11_OVERRIDE;
+ void OnUnset(User* source, Channel* chan) CXX11_OVERRIDE;
- void SerializeParam(Channel* chan, int n, std::string& out)
+ void SerializeParam(Channel* chan, intptr_t n, std::string& out)
{
out += ConvToStr(n);
}
};
-class ModuleDelayMsg : public Module
+class ModuleDelayMsg
+ : public Module
+ , public CTCTags::EventListener
{
+ private:
DelayMsgMode djm;
bool allownotice;
+ ModResult HandleMessage(User* user, const MessageTarget& target, bool notice);
+
public:
- ModuleDelayMsg() : djm(this)
+ ModuleDelayMsg()
+ : CTCTags::EventListener(this)
+ , djm(this)
{
}
Version GetVersion() CXX11_OVERRIDE;
void OnUserJoin(Membership* memb, bool sync, bool created, CUList&) CXX11_OVERRIDE;
- ModResult OnUserPreMessage(User* user, void* dest, int target_type, std::string& text, char status, CUList& exempt_list, MessageType msgtype) CXX11_OVERRIDE;
+ ModResult OnUserPreMessage(User* user, const MessageTarget& target, MessageDetails& details) CXX11_OVERRIDE;
+ ModResult OnUserPreTagMessage(User* user, const MessageTarget& target, CTCTags::TagMessageDetails& details) CXX11_OVERRIDE;
void ReadConfig(ConfigStatus& status) CXX11_OVERRIDE;
};
ModeAction DelayMsgMode::OnSet(User* source, Channel* chan, std::string& parameter)
{
// Setting a new limit, sanity check
- unsigned int limit = ConvToInt(parameter);
- if (limit == 0)
+ intptr_t limit = ConvToNum<intptr_t>(parameter);
+ if (limit <= 0)
limit = 1;
ext.set(chan, limit);
Version ModuleDelayMsg::GetVersion()
{
- return Version("Provides channelmode +d <int>, to deny messages to a channel until <int> seconds.", VF_VENDOR);
+ return Version("Provides channel mode +d <int>, to deny messages to a channel until <int> seconds have passed", VF_VENDOR);
}
void ModuleDelayMsg::OnUserJoin(Membership* memb, bool sync, bool created, CUList&)
}
}
-ModResult ModuleDelayMsg::OnUserPreMessage(User* user, void* dest, int target_type, std::string& text, char status, CUList& exempt_list, MessageType msgtype)
+ModResult ModuleDelayMsg::OnUserPreMessage(User* user, const MessageTarget& target, MessageDetails& details)
+{
+ return HandleMessage(user, target, details.type == MSG_NOTICE);
+}
+
+ModResult ModuleDelayMsg::OnUserPreTagMessage(User* user, const MessageTarget& target, CTCTags::TagMessageDetails& details)
+{
+ return HandleMessage(user, target, false);
+}
+
+ModResult ModuleDelayMsg::HandleMessage(User* user, const MessageTarget& target, bool notice)
{
if (!IS_LOCAL(user))
return MOD_RES_PASSTHRU;
- if ((target_type != TYPE_CHANNEL) || ((!allownotice) && (msgtype == MSG_NOTICE)))
+ if ((target.type != MessageTarget::TYPE_CHANNEL) || ((!allownotice) && (notice)))
return MOD_RES_PASSTHRU;
- Channel* channel = (Channel*) dest;
+ Channel* channel = target.Get<Channel>();
Membership* memb = channel->GetUser(user);
if (!memb)
{
if (channel->GetPrefixValue(user) < VOICE_VALUE)
{
- user->WriteNumeric(ERR_CANNOTSENDTOCHAN, channel->name, InspIRCd::Format("You must wait %d seconds after joining to send to channel (+d)", len));
+ user->WriteNumeric(ERR_CANNOTSENDTOCHAN, channel->name, InspIRCd::Format("You must wait %d seconds after joining to send to the channel (+d is set)", len));
return MOD_RES_DENY;
}
}