From 38fa27876d05edecbf9f238947d18d1319ca2757 Mon Sep 17 00:00:00 2001 From: Sadie Powell Date: Sat, 28 Aug 2021 23:45:26 +0100 Subject: Forward SQUERY to services instead of downgrading it to PRIVMSG. --- src/modules/m_spanningtree/compat.cpp | 59 +++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 src/modules/m_spanningtree/compat.cpp (limited to 'src/modules/m_spanningtree/compat.cpp') diff --git a/src/modules/m_spanningtree/compat.cpp b/src/modules/m_spanningtree/compat.cpp new file mode 100644 index 000000000..1efe86316 --- /dev/null +++ b/src/modules/m_spanningtree/compat.cpp @@ -0,0 +1,59 @@ +/* + * InspIRCd -- Internet Relay Chat Daemon + * + * Copyright (C) 2021 Sadie Powell + * + * 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 + * License as published by the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + + +#include "inspircd.h" +#include "main.h" + +void TreeSocket::WriteLine(const std::string& original_line) +{ + if (LinkState != CONNECTED || proto_version == PROTO_NEWEST) + { + // Don't translate connections which have negotiated PROTO_NEWEST or + // where the protocol hasn't been negotiated yet. + WriteLineInternal(original_line); + return; + } + + std::string line = original_line; + size_t cmdstart = 0; + + if (line[0] == '@') // Skip the tags. + cmdstart = line.find(' ', cmdstart + 1); + + if (line[0] == ':') // Skip the prefix. + cmdstart = line.find(' ', cmdstart + 1); + + // Find the end of the command. + size_t cmdend = line.find(' ', cmdstart + 1); + if (cmdend == std::string::npos) + cmdend = line.size(); + + std::string command(line, cmdstart + 1, cmdend - cmdstart - 1); + if (proto_version == PROTO_INSPIRCD_30) + { + if (irc::equals(command, "SQUERY")) + { + // SQUERY was introduced in PROTO_INSPIRCD_40_A1; convert to PRIVMSG. + line.replace(cmdstart + 1, cmdend - cmdstart - 1, "PRIVMSG"); + } + } + + WriteLineInternal(line); + return; +} -- cgit v1.3.1-10-gc9f91