mirror of https://github.com/znc/znc
Mirror of the official znc repository
https://znc.in
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
104 lines
3.0 KiB
104 lines
3.0 KiB
/* |
|
* Copyright (C) 2004-2022 ZNC, see the NOTICE file for details. |
|
* |
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
* you may not use this file except in compliance with the License. |
|
* You may obtain a copy of the License at |
|
* |
|
* http://www.apache.org/licenses/LICENSE-2.0 |
|
* |
|
* Unless required by applicable law or agreed to in writing, software |
|
* distributed under the License is distributed on an "AS IS" BASIS, |
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
* See the License for the specific language governing permissions and |
|
* limitations under the License. |
|
*/ |
|
|
|
#include <znc/Modules.h> |
|
#include <znc/IRCNetwork.h> |
|
|
|
using std::set; |
|
|
|
class CBlockMotd : public CModule { |
|
public: |
|
MODCONSTRUCTOR(CBlockMotd) { |
|
AddHelpCommand(); |
|
AddCommand("GetMotd", t_d("[<server>]"), |
|
t_d("Override the block with this command. Can optionally " |
|
"specify which server to query."), |
|
[this](const CString& sLine) { OverrideCommand(sLine); }); |
|
} |
|
|
|
~CBlockMotd() override {} |
|
|
|
void OverrideCommand(const CString& sLine) { |
|
if (!GetNetwork() || !GetNetwork()->GetIRCSock()) { |
|
PutModule(t_s("You are not connected to an IRC Server.")); |
|
return; |
|
} |
|
|
|
TemporarilyAcceptMotd(); |
|
const CString sServer = sLine.Token(1); |
|
|
|
if (sServer.empty()) { |
|
PutIRC("MOTD"); |
|
} else { |
|
PutIRC("MOTD " + sServer); |
|
} |
|
} |
|
|
|
EModRet OnNumericMessage(CNumericMessage& Message) override { |
|
if ((Message.GetCode() == 375 /* begin of MOTD */ || |
|
Message.GetCode() == 372 /* MOTD */) && |
|
!ShouldTemporarilyAcceptMotd()) |
|
return HALT; |
|
|
|
if (Message.GetCode() == 376 /* End of MOTD */) { |
|
if (!ShouldTemporarilyAcceptMotd()) { |
|
Message.SetParam(1, t_s("MOTD blocked by ZNC")); |
|
} |
|
StopTemporarilyAcceptingMotd(); |
|
} |
|
|
|
if (Message.GetCode() == 422) { |
|
// Server has no MOTD |
|
StopTemporarilyAcceptingMotd(); |
|
} |
|
|
|
return CONTINUE; |
|
} |
|
|
|
void OnIRCDisconnected() override { |
|
StopTemporarilyAcceptingMotd(); |
|
} |
|
|
|
bool ShouldTemporarilyAcceptMotd() const { |
|
return m_sTemporaryAcceptedMotdSocks.count(GetNetwork()->GetIRCSock()) > 0; |
|
} |
|
|
|
void TemporarilyAcceptMotd() { |
|
if (ShouldTemporarilyAcceptMotd()) { |
|
return; |
|
} |
|
|
|
m_sTemporaryAcceptedMotdSocks.insert(GetNetwork()->GetIRCSock()); |
|
} |
|
|
|
void StopTemporarilyAcceptingMotd() { |
|
m_sTemporaryAcceptedMotdSocks.erase(GetNetwork()->GetIRCSock()); |
|
} |
|
|
|
private: |
|
set<CIRCSock *> m_sTemporaryAcceptedMotdSocks; |
|
}; |
|
|
|
template <> |
|
void TModInfo<CBlockMotd>(CModInfo& Info) { |
|
Info.AddType(CModInfo::NetworkModule); |
|
Info.AddType(CModInfo::GlobalModule); |
|
Info.SetWikiPage("block_motd"); |
|
} |
|
|
|
USERMODULEDEFS( |
|
CBlockMotd, |
|
t_s("Block the MOTD from IRC so it's not sent to your client(s)."))
|
|
|