Retire awaynick (resolves #661)

== built-in awaynick ==

debug output on startup:

    [ .. ] Loading network module [awaynick]...
    [ !! ] Module [awaynick] aborted: retired module - see http://wiki.znc.in/awaynick
    [ .. ] Loading network module [simple_away] instead...
    [ >> ] [/Users/jpnurmi/znc/lib/znc/simple_away.so]

loadmod client command:

    <jpnurmi> loadmod awaynick
    <*status> Module [awaynick] aborted: retired module - see http://wiki.znc.in/awaynick

webadmin description:

    retired module - see http://wiki.znc.in/awaynick

webadmin load attempt:

    Unable to load module [awaynick] [Module [awaynick] aborted:
    retired module - see http://wiki.znc.in/awaynick]

== external awaynick ==

znc-buildmod:

    $ znc-buildmod awaynick.cpp
    Building "awaynick.so" for ZNC 1.5... [ ok ]

debug output on startup:

    [ .. ] Loading network module [awaynick]...
    [ >> ] [/Users/jpnurmi/.znc/modules/awaynick.so]

loadmod client command:

    <jpnurmi> loadmod awaynick
    <*status> Loaded module [awaynick] [/Users/jpnurmi/.znc/modules/awaynick.so]

webadmin description:

    Change your nick while you are away
This commit is contained in:
J-P Nurmi
2014-09-26 15:25:13 +02:00
parent 2286291d6b
commit 14e09e1a10
3 changed files with 33 additions and 180 deletions
+5 -176
View File
@@ -14,191 +14,20 @@
* limitations under the License.
*/
// @todo handle raw 433 (nick in use)
#include <znc/IRCSock.h>
#include <znc/IRCNetwork.h>
class CAwayNickMod;
class CAwayNickTimer : public CTimer {
public:
CAwayNickTimer(CAwayNickMod& Module);
private:
virtual void RunJob();
private:
CAwayNickMod& m_Module;
};
class CBackNickTimer : public CTimer {
public:
CBackNickTimer(CModule& Module)
: CTimer(&Module, 3, 1, "BackNickTimer", "Set your nick back when you reattach"),
m_Module(Module) {}
private:
virtual void RunJob() {
CIRCNetwork* pNetwork = m_Module.GetNetwork();
if (pNetwork->IsUserAttached() && pNetwork->IsIRCConnected()) {
CString sConfNick = pNetwork->GetNick();
m_Module.PutIRC("NICK " + sConfNick);
}
}
private:
CModule& m_Module;
};
#include <znc/Modules.h>
class CAwayNickMod : public CModule {
public:
MODCONSTRUCTOR(CAwayNickMod) {}
virtual bool OnLoad(const CString& sArgs, CString& sMessage) {
if (!sArgs.empty())
m_sFormat = sArgs;
else
m_sFormat = GetNV("nick");
if (m_sFormat.empty()) {
m_sFormat = "zz_%nick%";
}
SetNV("nick", m_sFormat);
return true;
virtual bool OnLoad(const CString&, CString& sMessage) {
sMessage = "retired module - see http://wiki.znc.in/awaynick";
return false;
}
virtual ~CAwayNickMod() {
}
void StartAwayNickTimer() {
RemTimer("AwayNickTimer");
if (FindTimer("BackNickTimer")) {
// Client disconnected before we got set back, so do nothing.
RemTimer("BackNickTimer");
return;
}
AddTimer(new CAwayNickTimer(*this));
}
void StartBackNickTimer() {
CIRCSock* pIRCSock = GetNetwork()->GetIRCSock();
if (pIRCSock) {
CString sConfNick = GetNetwork()->GetNick();
if (pIRCSock->GetNick().Equals(m_sAwayNick.Left(pIRCSock->GetNick().length()))) {
RemTimer("BackNickTimer");
AddTimer(new CBackNickTimer(*this));
}
}
}
virtual EModRet OnIRCRegistration(CString& sPass, CString& sNick,
CString& sIdent, CString& sRealName) {
CIRCNetwork* pNetwork = GetNetwork();
if (pNetwork && !pNetwork->IsUserAttached()) {
m_sAwayNick = m_sFormat;
// ExpandString doesn't know our nick yet, so do it by hand.
m_sAwayNick.Replace("%nick%", sNick);
// We don't limit this to NICKLEN, because we dont know
// NICKLEN yet.
sNick = m_sAwayNick = pNetwork->ExpandString(m_sAwayNick);
}
return CONTINUE;
}
virtual void OnIRCDisconnected() {
RemTimer("AwayNickTimer");
RemTimer("BackNickTimer");
}
virtual void OnClientLogin() {
StartBackNickTimer();
}
virtual void OnClientDisconnect() {
if (!GetNetwork()->IsUserAttached()) {
StartAwayNickTimer();
}
}
virtual void OnModCommand(const CString& sLine) {
CString sCommand = sLine.Token(0);
if (sCommand.Equals("TIMERS")) {
ListTimers();
}
else if (sCommand.Equals("SET")) {
CString sFormat = sLine.Token(1);
if (!sFormat.empty()) {
m_sFormat = sFormat;
SetNV("nick", m_sFormat);
}
if (GetNetwork()) {
CString sExpanded = GetAwayNick();
CString sMsg = "AwayNick is set to [" + m_sFormat + "]";
if (m_sFormat != sExpanded) {
sMsg += " (" + sExpanded + ")";
}
PutModule(sMsg);
}
} else if (sCommand.Equals("SHOW")) {
if (GetNetwork()) {
CString sExpanded = GetAwayNick();
CString sMsg = "AwayNick is set to [" + m_sFormat + "]";
if (m_sFormat != sExpanded) {
sMsg += " (" + sExpanded + ")";
}
PutModule(sMsg);
}
} else if (sCommand.Equals("HELP")) {
PutModule("Commands are: show, timers, set [awaynick]");
}
}
CString GetAwayNick() {
unsigned int uLen = 9;
CIRCSock* pIRCSock = GetNetwork()->GetIRCSock();
if (pIRCSock) {
uLen = pIRCSock->GetMaxNickLen();
}
m_sAwayNick = GetNetwork()->ExpandString(m_sFormat).Left(uLen);
return m_sAwayNick;
}
private:
CString m_sFormat;
CString m_sAwayNick;
};
CAwayNickTimer::CAwayNickTimer(CAwayNickMod& Module)
: CTimer(&Module, 30, 1, "AwayNickTimer", "Set your nick while you're detached"),
m_Module(Module) {}
void CAwayNickTimer::RunJob() {
CIRCNetwork* pNetwork = m_Module.GetNetwork();
if (!pNetwork->IsUserAttached() && pNetwork->IsIRCConnected()) {
m_Module.PutIRC("NICK " + m_Module.GetAwayNick());
}
}
template<> void TModInfo<CAwayNickMod>(CModInfo& Info) {
Info.SetWikiPage("awaynick");
Info.SetHasArgs(true);
Info.SetArgsHelpText("This will be your nickname while you are away. Examples: nick_off or zzz_nick.");
}
NETWORKMODULEDEFS(CAwayNickMod, "Change your nick while you are away")
NETWORKMODULEDEFS(CAwayNickMod, "retired module - see http://wiki.znc.in/awaynick")
+14 -2
View File
@@ -22,6 +22,7 @@
#include <znc/Server.h>
#include <znc/Chan.h>
#include <znc/Query.h>
#include <algorithm>
using std::vector;
using std::set;
@@ -404,8 +405,19 @@ bool CIRCNetwork::ParseConfig(CConfig *pConfig, CString& sError, bool bUpgrade)
bool bModRet = LoadModule(sModName, sArgs, sNotice, sModRet);
if (!bModRet) {
sError = sModRet;
return false;
// XXX The awaynick module was retired in 1.6 (still available as external module)
if (sModName == "awaynick") {
// load simple_away instead, unless it's already on the list
if (std::find(vsList.begin(), vsList.end(), "simple_away") == vsList.end()) {
sNotice = "Loading network module [simple_away] instead";
sModName = "simple_away";
// not a fatal error if simple_away is not available
LoadModule(sModName, sArgs, sNotice, sModRet);
}
} else {
sError = sModRet;
return false;
}
}
}
}
+14 -2
View File
@@ -21,6 +21,7 @@
#include <znc/IRCSock.h>
#include <znc/Chan.h>
#include <math.h>
#include <algorithm>
using std::vector;
using std::set;
@@ -418,8 +419,19 @@ bool CUser::ParseConfig(CConfig* pConfig, CString& sError) {
CUtils::PrintStatus(bModRet, sModRet);
if (!bModRet) {
sError = sModRet;
return false;
// XXX The awaynick module was retired in 1.6 (still available as external module)
if (sModName == "awaynick") {
// load simple_away instead, unless it's already on the list
if (std::find(vsList.begin(), vsList.end(), "simple_away") == vsList.end()) {
sNotice = "Loading [simple_away] module instead";
sModName = "simple_away";
// not a fatal error if simple_away is not available
LoadModule(sModName, sArgs, sNotice, sModRet);
}
} else {
sError = sModRet;
return false;
}
}
continue;
}