X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_delaymsg.cpp;h=27e2c3e4011ca6c65870763b1c888c353f2580fa;hb=e2b0f3dc9ef4d56c71d7abda13e6139ca092e387;hp=f64297e15b8c678ce29d0969b8583400175e2ebf;hpb=8f5efbc7aa33b792e02d01e3288f553e6e98ccaa;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_delaymsg.cpp b/src/modules/m_delaymsg.cpp index f64297e15..27e2c3e40 100644 --- a/src/modules/m_delaymsg.cpp +++ b/src/modules/m_delaymsg.cpp @@ -1,7 +1,10 @@ /* * InspIRCd -- Internet Relay Chat Daemon * - * Copyright (C) 2009 Daniel De Graaf + * Copyright (C) 2013, 2017-2020 Sadie Powell + * Copyright (C) 2012-2015 Attila Molnar + * Copyright (C) 2012, 2019 Robby + * Copyright (C) 2009-2010 Daniel De Graaf * * This file is part of InspIRCd. InspIRCd is free software: you can * redistribute it and/or modify it under the terms of the GNU General Public @@ -18,6 +21,7 @@ #include "inspircd.h" +#include "modules/ctctags.h" class DelayMsgMode : public ParamMode { @@ -27,43 +31,52 @@ class DelayMsgMode : public ParamMode : ParamMode(Parent, "delaymsg", 'd') , jointime("delaymsg", ExtensionItem::EXT_MEMBERSHIP, Parent) { - levelrequired = OP_VALUE; + ranktoset = ranktounset = OP_VALUE; + syntax = ""; } - 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())); + return ConvToNum(their_param) < ConvToNum(our_param); } - 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(parameter); + if (limit <= 0) limit = 1; ext.set(chan, limit); @@ -82,7 +95,7 @@ void DelayMsgMode::OnUnset(User* source, Channel* chan) Version ModuleDelayMsg::GetVersion() { - return Version("Provides channelmode +d , to deny messages to a channel until seconds.", VF_VENDOR); + return Version("Adds channel mode d (delaymsg) which prevents newly joined users from speaking until the specified number of seconds have passed.", VF_VENDOR); } void ModuleDelayMsg::OnUserJoin(Membership* memb, bool sync, bool created, CUList&) @@ -93,15 +106,25 @@ void ModuleDelayMsg::OnUserJoin(Membership* memb, bool sync, bool created, CULis } } -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(); Membership* memb = channel->GetUser(user); if (!memb) @@ -118,8 +141,8 @@ ModResult ModuleDelayMsg::OnUserPreMessage(User* user, void* dest, int target_ty { if (channel->GetPrefixValue(user) < VOICE_VALUE) { - user->WriteNumeric(ERR_CANNOTSENDTOCHAN, "%s :You must wait %d seconds after joining to send to channel (+d)", - channel->name.c_str(), len); + const std::string message = InspIRCd::Format("You cannot send messages to this channel until you have been a member for %d seconds.", len); + user->WriteNumeric(Numerics::CannotSendTo(channel, message)); return MOD_RES_DENY; } }