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.
134 lines
4.1 KiB
134 lines
4.1 KiB
/* |
|
* Copyright (C) 2004-2022 ZNC, see the NOTICE file for details. |
|
* This was originally written by cycomate. |
|
* |
|
* 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. |
|
*/ |
|
|
|
/* |
|
* Autorejoin module |
|
* rejoin channel (after a delay) when kicked |
|
* Usage: LoadModule = rejoin [delay] |
|
* |
|
*/ |
|
|
|
#include <znc/Chan.h> |
|
#include <znc/IRCNetwork.h> |
|
|
|
class CRejoinJob : public CTimer { |
|
public: |
|
CRejoinJob(CModule* pModule, unsigned int uInterval, unsigned int uCycles, |
|
const CString& sLabel, const CString& sDescription) |
|
: CTimer(pModule, uInterval, uCycles, sLabel, sDescription) {} |
|
|
|
~CRejoinJob() override {} |
|
|
|
protected: |
|
void RunJob() override { |
|
CIRCNetwork* pNetwork = GetModule()->GetNetwork(); |
|
CChan* pChan = pNetwork->FindChan(GetName().Token(1, true)); |
|
|
|
if (pChan) { |
|
pChan->Enable(); |
|
GetModule()->PutIRC("JOIN " + pChan->GetName() + " " + |
|
pChan->GetKey()); |
|
} |
|
} |
|
}; |
|
|
|
class CRejoinMod : public CModule { |
|
private: |
|
unsigned int delay = 10; |
|
|
|
public: |
|
MODCONSTRUCTOR(CRejoinMod) { |
|
AddHelpCommand(); |
|
AddCommand("SetDelay", t_d("<secs>"), t_d("Set the rejoin delay"), |
|
[=](const CString& sLine) { OnSetDelayCommand(sLine); }); |
|
AddCommand("ShowDelay", "", t_d("Show the rejoin delay"), |
|
[=](const CString& sLine) { OnShowDelayCommand(sLine); }); |
|
} |
|
~CRejoinMod() override {} |
|
|
|
bool OnLoad(const CString& sArgs, CString& sErrorMsg) override { |
|
if (sArgs.empty()) { |
|
CString sDelay = GetNV("delay"); |
|
|
|
if (sDelay.empty()) |
|
delay = 10; |
|
else |
|
delay = sDelay.ToUInt(); |
|
} else { |
|
int i = sArgs.ToInt(); |
|
if ((i == 0 && sArgs == "0") || i > 0) |
|
delay = i; |
|
else { |
|
sErrorMsg = |
|
t_s("Illegal argument, must be a positive number or 0"); |
|
return false; |
|
} |
|
} |
|
|
|
return true; |
|
} |
|
|
|
void OnSetDelayCommand(const CString& sCommand) { |
|
int i; |
|
i = sCommand.Token(1).ToInt(); |
|
|
|
if (i < 0) { |
|
PutModule(t_s("Negative delays don't make any sense!")); |
|
return; |
|
} |
|
|
|
delay = i; |
|
SetNV("delay", CString(delay)); |
|
|
|
if (delay) |
|
PutModule(t_p("Rejoin delay set to 1 second", |
|
"Rejoin delay set to {1} seconds", delay)(delay)); |
|
else |
|
PutModule(t_s("Rejoin delay disabled")); |
|
} |
|
|
|
void OnShowDelayCommand(const CString& sCommand) { |
|
if (delay) |
|
PutModule(t_p("Rejoin delay is set to 1 second", |
|
"Rejoin delay is set to {1} seconds", delay)(delay)); |
|
else |
|
PutModule(t_s("Rejoin delay is disabled")); |
|
} |
|
|
|
void OnKick(const CNick& OpNick, const CString& sKickedNick, CChan& pChan, |
|
const CString& sMessage) override { |
|
if (GetNetwork()->GetCurNick().Equals(sKickedNick)) { |
|
if (!delay) { |
|
PutIRC("JOIN " + pChan.GetName() + " " + pChan.GetKey()); |
|
pChan.Enable(); |
|
return; |
|
} |
|
AddTimer(new CRejoinJob(this, delay, 1, "Rejoin " + pChan.GetName(), |
|
"Rejoin channel after a delay")); |
|
} |
|
} |
|
}; |
|
|
|
template <> |
|
void TModInfo<CRejoinMod>(CModInfo& Info) { |
|
Info.SetWikiPage("kickrejoin"); |
|
Info.SetHasArgs(true); |
|
Info.SetArgsHelpText(Info.t_s( |
|
"You might enter the number of seconds to wait before rejoining.")); |
|
} |
|
|
|
NETWORKMODULEDEFS(CRejoinMod, t_s("Autorejoins on kick"))
|
|
|