summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--data/chanserv.example.conf6
-rw-r--r--modules/protocol/inspircd-ts6.h4
-rw-r--r--modules/protocol/inspircd12.cpp2
-rw-r--r--modules/protocol/inspircd20.cpp18
4 files changed, 22 insertions, 8 deletions
diff --git a/data/chanserv.example.conf b/data/chanserv.example.conf
index e605dc8b3..f507c5cab 100644
--- a/data/chanserv.example.conf
+++ b/data/chanserv.example.conf
@@ -199,6 +199,12 @@ chanserv
* services immediately reversing mode changes for locked modes.
*/
use_server_side_mlock = yes
+
+ /*
+ * Some IRCds can enforce topic locks server-side. This reduces the spam caused by
+ * services immediately reversing topic changes.
+ */
+ use_server_side_topiclock = yes
}
/*
diff --git a/modules/protocol/inspircd-ts6.h b/modules/protocol/inspircd-ts6.h
index 870546438..207fde99b 100644
--- a/modules/protocol/inspircd-ts6.h
+++ b/modules/protocol/inspircd-ts6.h
@@ -96,7 +96,7 @@ class InspIRCdTS6Proto : public IRCDProto
{
if (has_svstopic_topiclock)
{
- UplinkSocket::Message(Me) << "SVSTOPIC " << c->name << " " << c->topic_ts << " " << c->topic_setter << " :" << c->topic;
+ UplinkSocket::Message(c->ci->WhoSends()) << "SVSTOPIC " << c->name << " " << c->topic_ts << " " << c->topic_setter << " :" << c->topic;
}
else
{
@@ -521,7 +521,7 @@ struct IRCDMessageFTopic : IRCDMessage
bool Run(MessageSource &source, const std::vector<Anope::string> &params) anope_override
{
- /* :source FTOPIC channel ts setby :topic */
+ /* :source FTOPIC channel topicts setby :topic */
Channel *c = findchan(params[0]);
if (c)
diff --git a/modules/protocol/inspircd12.cpp b/modules/protocol/inspircd12.cpp
index 1a1ebb65e..97d2b6259 100644
--- a/modules/protocol/inspircd12.cpp
+++ b/modules/protocol/inspircd12.cpp
@@ -19,7 +19,7 @@ static bool has_chghostmod = false;
static bool has_chgidentmod = false;
static bool has_rlinemod = false;
static bool has_svstopic_topiclock = false;
-static unsigned int spanningtree_proto_ver = 1201;
+//static unsigned int spanningtree_proto_ver = 1201;
#include "inspircd-ts6.h"
static bool has_servicesmod = false;
diff --git a/modules/protocol/inspircd20.cpp b/modules/protocol/inspircd20.cpp
index 04a23c104..abe9779b6 100644
--- a/modules/protocol/inspircd20.cpp
+++ b/modules/protocol/inspircd20.cpp
@@ -538,7 +538,7 @@ class ProtoInspIRCd : public Module
Capab.insert("NOQUIT");
- Implementation i[] = { I_OnUserNickChange, I_OnServerSync, I_OnChannelCreate, I_OnChanRegistered, I_OnDelChan, I_OnMLock, I_OnUnMLock };
+ Implementation i[] = { I_OnUserNickChange, I_OnServerSync, I_OnChannelCreate, I_OnChanRegistered, I_OnDelChan, I_OnMLock, I_OnUnMLock, I_OnSetChannelOption };
ModuleManager::Attach(i, this, sizeof(i) / sizeof(Implementation));
if (Config->Numeric.empty())
@@ -576,13 +576,13 @@ class ProtoInspIRCd : public Module
void OnChanRegistered(ChannelInfo *ci) anope_override
{
- if (Config->UseServerSideMLock)
+ if (Config->UseServerSideMLock && ci->c)
{
Anope::string modes = ci->GetMLockAsString(false).replace_all_cs("+", "").replace_all_cs("-", "");
SendChannelMetadata(ci->c, "mlock", modes);
}
- if (Config->UseServerSideTopicLock && has_svstopic_topiclock)
+ if (Config->UseServerSideTopicLock && has_svstopic_topiclock && ci->c)
{
Anope::string on = ci->HasFlag(CI_TOPICLOCK) ? "1" : "";
SendChannelMetadata(ci->c, "topiclock", on);
@@ -591,10 +591,10 @@ class ProtoInspIRCd : public Module
void OnDelChan(ChannelInfo *ci) anope_override
{
- if (Config->UseServerSideMLock)
+ if (Config->UseServerSideMLock && ci->c)
SendChannelMetadata(ci->c, "mlock", "");
- if (Config->UseServerSideTopicLock && has_svstopic_topiclock)
+ if (Config->UseServerSideTopicLock && has_svstopic_topiclock && ci->c)
SendChannelMetadata(ci->c, "topiclock", "");
}
@@ -621,6 +621,14 @@ class ProtoInspIRCd : public Module
return EVENT_CONTINUE;
}
+
+ EventReturn OnSetChannelOption(CommandSource &source, Command *cmd, ChannelInfo *ci, const Anope::string &setting) anope_override
+ {
+ if (cmd->name == "chanserv/set/topiclock" && ci->c)
+ SendChannelMetadata(ci->c, "topiclock", setting.equals_ci("ON") ? "1" : "");
+
+ return EVENT_CONTINUE;
+ }
};
MODULE_INIT(ProtoInspIRCd)