X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fcoremods%2Fcore_channel%2Fcmd_topic.cpp;h=0417f1a0cf422e6a1ebcb48088693a251eaa8be1;hb=f8a9b6ba4ae0b4b3c7b2a408332230dd82eb4608;hp=ea723c0244fff1712263959463951e0c0371422a;hpb=8f5efbc7aa33b792e02d01e3288f553e6e98ccaa;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/coremods/core_channel/cmd_topic.cpp b/src/coremods/core_channel/cmd_topic.cpp index ea723c024..0417f1a0c 100644 --- a/src/coremods/core_channel/cmd_topic.cpp +++ b/src/coremods/core_channel/cmd_topic.cpp @@ -25,6 +25,7 @@ CommandTopic::CommandTopic(Module* parent) : SplitCommand(parent, "TOPIC", 1, 2) + , exemptionprov(parent) , secretmode(parent, "secret") , topiclockmode(parent, "topiclock") { @@ -32,12 +33,12 @@ CommandTopic::CommandTopic(Module* parent) Penalty = 2; } -CmdResult CommandTopic::HandleLocal(const std::vector& parameters, LocalUser* user) +CmdResult CommandTopic::HandleLocal(LocalUser* user, const Params& parameters) { Channel* c = ServerInstance->FindChan(parameters[0]); if (!c) { - user->WriteNumeric(ERR_NOSUCHNICK, "%s :No such nick/channel", parameters[0].c_str()); + user->WriteNumeric(Numerics::NoSuchChannel(parameters[0])); return CMD_FAILURE; } @@ -45,18 +46,17 @@ CmdResult CommandTopic::HandleLocal(const std::vector& parameters, { if ((c->IsModeSet(secretmode)) && (!c->HasUser(user))) { - user->WriteNumeric(ERR_NOSUCHNICK, "%s :No such nick/channel", c->name.c_str()); + user->WriteNumeric(Numerics::NoSuchChannel(c->name)); return CMD_FAILURE; } if (c->topic.length()) { - user->WriteNumeric(RPL_TOPIC, "%s :%s", c->name.c_str(), c->topic.c_str()); - user->WriteNumeric(RPL_TOPICTIME, "%s %s %lu", c->name.c_str(), c->setby.c_str(), (unsigned long)c->topicset); + Topic::ShowTopic(user, c); } else { - user->WriteNumeric(RPL_NOTOPICSET, "%s :No topic is set.", c->name.c_str()); + user->WriteNumeric(RPL_NOTOPICSET, c->name, "No topic is set."); } return CMD_SUCCESS; } @@ -71,16 +71,32 @@ CmdResult CommandTopic::HandleLocal(const std::vector& parameters, { if (!c->HasUser(user)) { - user->WriteNumeric(ERR_NOTONCHANNEL, "%s :You're not on that channel!", c->name.c_str()); + user->WriteNumeric(ERR_NOTONCHANNEL, c->name, "You're not on that channel!"); return CMD_FAILURE; } - if (c->IsModeSet(topiclockmode) && !ServerInstance->OnCheckExemption(user, c, "topiclock").check(c->GetPrefixValue(user) >= HALFOP_VALUE)) + if (c->IsModeSet(topiclockmode)) { - user->WriteNumeric(ERR_CHANOPRIVSNEEDED, "%s :You do not have access to change the topic on this channel", c->name.c_str()); - return CMD_FAILURE; + ModResult MOD_RESULT = CheckExemption::Call(exemptionprov, user, c, "topiclock"); + if (!MOD_RESULT.check(c->GetPrefixValue(user) >= HALFOP_VALUE)) + { + user->WriteNumeric(ERR_CHANOPRIVSNEEDED, c->name, "You do not have access to change the topic on this channel"); + return CMD_FAILURE; + } } } - c->SetTopic(user, t); + // Make sure the topic is not longer than the limit in the config + if (t.length() > ServerInstance->Config->Limits.MaxTopic) + t.erase(ServerInstance->Config->Limits.MaxTopic); + + // Only change if the new topic is different than the current one + if (c->topic != t) + c->SetTopic(user, t, ServerInstance->Time()); return CMD_SUCCESS; } + +void Topic::ShowTopic(LocalUser* user, Channel* chan) +{ + user->WriteNumeric(RPL_TOPIC, chan->name, chan->topic); + user->WriteNumeric(RPL_TOPICTIME, chan->name, chan->setby, (unsigned long)chan->topicset); +}