X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_topiclock.cpp;h=c6125878455fe10ad9c095dd452b9dec5dc5eca2;hb=HEAD;hp=c7431b4c67582d2c95fcab03f0291a6b267e905f;hpb=11916574f67962dce1d7a2fdf7ef6a3d2d1fa49f;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_topiclock.cpp b/src/modules/m_topiclock.cpp index c7431b4c6..c61258784 100644 --- a/src/modules/m_topiclock.cpp +++ b/src/modules/m_topiclock.cpp @@ -1,7 +1,8 @@ /* * InspIRCd -- Internet Relay Chat Daemon * - * Copyright (C) 2012 Attila Molnar + * Copyright (C) 2013, 2017-2019 Sadie Powell + * Copyright (C) 2012, 2014-2016 Attila Molnar * * 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 +19,12 @@ #include "inspircd.h" +enum +{ + // InspIRCd-specific. + ERR_TOPICLOCK = 744 +}; + class CommandSVSTOPIC : public Command { public: @@ -27,7 +34,7 @@ class CommandSVSTOPIC : public Command flags_needed = FLAG_SERVERONLY; } - CmdResult Handle(const std::vector ¶meters, User *user) + CmdResult Handle(User* user, const Params& parameters) CXX11_OVERRIDE { if (!user->server->IsULine()) { @@ -42,59 +49,37 @@ class CommandSVSTOPIC : public Command if (parameters.size() == 4) { // 4 parameter version, set all topic data on the channel to the ones given in the parameters - time_t topicts = ConvToInt(parameters[1]); + time_t topicts = ConvToNum(parameters[1]); if (!topicts) { ServerInstance->Logs->Log(MODNAME, LOG_DEFAULT, "Received SVSTOPIC with a 0 topicts, dropped."); return CMD_INVALID; } - std::string newtopic; - newtopic.assign(parameters[3], 0, ServerInstance->Config->Limits.MaxTopic); - bool topics_differ = (chan->topic != newtopic); - if ((topics_differ) || (chan->topicset != topicts) || (chan->setby != parameters[2])) - { - // Update when any parameter differs - chan->topicset = topicts; - chan->setby.assign(parameters[2], 0, 127); - chan->topic = newtopic; - // Send TOPIC to clients only if the actual topic has changed, be silent otherwise - if (topics_differ) - chan->WriteChannel(user, "TOPIC %s :%s", chan->name.c_str(), chan->topic.c_str()); - } + chan->SetTopic(user, parameters[3], topicts, ¶meters[2]); } else { // 1 parameter version, nuke the topic - bool topic_empty = chan->topic.empty(); - if (!topic_empty || !chan->setby.empty()) - { - chan->topicset = 0; - chan->setby.clear(); - chan->topic.clear(); - if (!topic_empty) - chan->WriteChannel(user, "TOPIC %s :", chan->name.c_str()); - } + chan->SetTopic(user, std::string(), 0); + chan->setby.clear(); } return CMD_SUCCESS; } - RouteDescriptor GetRouting(User* user, const std::vector& parameters) + RouteDescriptor GetRouting(User* user, const Params& parameters) CXX11_OVERRIDE { return ROUTE_BROADCAST; } }; +// TODO: add a BoolExtItem to replace this. class FlagExtItem : public ExtensionItem { public: FlagExtItem(const std::string& key, Module* owner) - : ExtensionItem(key, owner) - { - } - - ~FlagExtItem() + : ExtensionItem(key, ExtensionItem::EXT_CHANNEL, owner) { } @@ -103,15 +88,18 @@ class FlagExtItem : public ExtensionItem return (get_raw(container) != NULL); } - std::string serialize(SerializeFormat format, const Extensible* container, void* item) const + std::string ToHuman(const Extensible* container, void* item) const CXX11_OVERRIDE { - if (format == FORMAT_USER) - return "true"; + // Make the human version more readable. + return "true"; + } + std::string ToNetwork(const Extensible* container, void* item) const CXX11_OVERRIDE + { return "1"; } - void unserialize(SerializeFormat format, Extensible* container, const std::string& value) + void FromNetwork(Extensible* container, const std::string& value) CXX11_OVERRIDE { if (value == "1") set_raw(container, this); @@ -132,7 +120,7 @@ class FlagExtItem : public ExtensionItem unset_raw(container); } - void free(void* item) + void free(Extensible* container, void* item) CXX11_OVERRIDE { // nothing to free } @@ -154,7 +142,7 @@ class ModuleTopicLock : public Module // Only fired for local users currently, but added a check anyway if ((IS_LOCAL(user)) && (topiclock.get(chan))) { - user->WriteNumeric(744, "%s :TOPIC cannot be changed due to topic lock being active on the channel", chan->name.c_str()); + user->WriteNumeric(ERR_TOPICLOCK, chan->name, "TOPIC cannot be changed due to topic lock being active on the channel"); return MOD_RES_DENY; } @@ -163,7 +151,7 @@ class ModuleTopicLock : public Module Version GetVersion() CXX11_OVERRIDE { - return Version("Implements server-side topic locks and the server-to-server command SVSTOPIC", VF_COMMON | VF_VENDOR); + return Version("Allows services to lock the channel topic so that it can not be changed.", VF_COMMON | VF_VENDOR); } };