diff --git a/Modules.cpp b/Modules.cpp index 65529cc8..42e22249 100644 --- a/Modules.cpp +++ b/Modules.cpp @@ -515,6 +515,7 @@ bool CModule::PutModNotice(const CString& sLine, const CString& sIdent, const CS // CGlobalModule // /////////////////// CModule::EModRet CGlobalModule::OnConfigLine(const CString& sName, const CString& sValue, CUser* pUser, CChan* pChan) { return CONTINUE; } +CModule::EModRet CGlobalModule::OnDeleteUser(CUser& User) { return CONTINUE; } CModule::EModRet CGlobalModule::OnLoginAttempt(CSmartPtr Auth) { return CONTINUE; } @@ -596,6 +597,10 @@ bool CGlobalModules::OnConfigLine(const CString& sName, const CString& sValue, C GLOBALMODHALTCHK(OnConfigLine(sName, sValue, pUser, pChan)); } +bool CGlobalModules::OnDeleteUser(CUser& User) { + GLOBALMODHALTCHK(OnDeleteUser(User)); +} + bool CGlobalModules::OnLoginAttempt(CSmartPtr Auth) { GLOBALMODHALTCHK(OnLoginAttempt(Auth)); } diff --git a/Modules.h b/Modules.h index 5edf9053..162dda25 100644 --- a/Modules.h +++ b/Modules.h @@ -390,6 +390,7 @@ public: virtual ~CGlobalModule() {} virtual EModRet OnConfigLine(const CString& sName, const CString& sValue, CUser* pUser, CChan* pChan); + virtual EModRet OnDeleteUser(CUser& User); virtual EModRet OnLoginAttempt(CSmartPtr Auth); private: }; @@ -400,6 +401,7 @@ public: virtual ~CGlobalModules() {} virtual bool OnConfigLine(const CString& sName, const CString& sValue, CUser* pUser, CChan* pChan); + virtual bool OnDeleteUser(CUser& User); virtual bool OnLoginAttempt(CSmartPtr Auth); private: }; diff --git a/modules/partyline.cpp b/modules/partyline.cpp index 52e5746a..d9841e9f 100644 --- a/modules/partyline.cpp +++ b/modules/partyline.cpp @@ -32,6 +32,28 @@ public: return true; } + virtual EModRet OnDeleteUser(CUser& User) { + const CString& sNick = User.GetUserName(); + CString sHost = User.GetVHost(); + + CUser* pTmp = m_pUser; + m_pUser = &User; + + for (map >::iterator it = m_msChans.begin(); it != m_msChans.end(); it++) { // Loop through each chan + const CString& sChannel = it->first; + set& ssNicks = it->second; + + if (ssNicks.find(User.GetUserName()) != ssNicks.end()) { // If the user is on this chan + User.PutUser(":*" + GetModName() + "!znc@rottenboy.com KICK " + sChannel + " " + sNick + " :User Deleted"); + PutChan(ssNicks, ":*" + GetModName() + "!znc@rottenboy.com KICK " + sChannel + " ?" + sNick + " :User Deleted", false); + } + } + + m_pUser = pTmp; + + return CONTINUE; + } + virtual EModRet OnRaw(CString& sLine) { if (sLine.Token(1) == "005") { CString::size_type uPos = sLine.AsUpper().find("CHANTYPES="); @@ -98,7 +120,7 @@ public: return HALT; } - set& ssNicks = m_msChans[sChannel.AsLower()]; + set& ssNicks = m_msChans[sChannel.AsLower()]; // @todo do a lookup first const CString& sNick = m_pUser->GetUserName(); if (ssNicks.find(sNick) != ssNicks.end()) { diff --git a/znc.cpp b/znc.cpp index 7c47989e..265bf681 100644 --- a/znc.cpp +++ b/znc.cpp @@ -76,6 +76,12 @@ int CZNC::Loop() { if (m_ssDelUsers.size()) { for (set::iterator it = m_ssDelUsers.begin(); it != m_ssDelUsers.end(); it++) { CUser* pUser = *it; + +#ifdef _MODULES + if (GetModules().OnDeleteUser(*pUser)) { + continue; + } +#endif m_msUsers.erase(pUser->GetUserName()); CIRCSock* pIRCSock = pUser->GetIRCSock();