From fb9a062fdb315c9307d5c8bbbd8afd1214034570 Mon Sep 17 00:00:00 2001 From: prozacx Date: Wed, 12 Oct 2005 02:12:42 +0000 Subject: [PATCH] Added module hooks for OnUserJoin() and OnUserPart() git-svn-id: https://znc.svn.sourceforge.net/svnroot/znc/trunk@566 726aef4b-f618-498e-8847-2d620e286838 --- Modules.cpp | 184 +++++++++++++-------------------------------------- Modules.h | 30 +++++---- UserSock.cpp | 59 ++++++++++++++--- 3 files changed, 114 insertions(+), 159 deletions(-) diff --git a/Modules.cpp b/Modules.cpp index 6ab40684..8746579b 100644 --- a/Modules.cpp +++ b/Modules.cpp @@ -435,8 +435,6 @@ CString CModule::GetModNick() const { return ((m_pUser) ? m_pUser->GetStatusPref bool CModule::OnLoad(const CString& sArgs) { return true; } bool CModule::OnBoot() { return true; } -void CModule::OnUserAttached() {} -void CModule::OnUserDetached() {} void CModule::OnIRCDisconnected() {} void CModule::OnIRCConnected() {} CModule::EModRet CModule::OnBroadcast(CString& sMessage) { return CONTINUE; } @@ -450,7 +448,6 @@ void CModule::OnVoice(const CNick& OpNick, const CNick& Nick, CChan& Channel, bo void CModule::OnDevoice(const CNick& OpNick, const CNick& Nick, CChan& Channel, bool bNoChange) {} void CModule::OnRawMode(const CNick& OpNick, CChan& Channel, const CString& sModes, const CString& sArgs) {} -CModule::EModRet CModule::OnUserRaw(CString& sLine) { return CONTINUE; } CModule::EModRet CModule::OnRaw(CString& sLine) { return CONTINUE; } CModule::EModRet CModule::OnStatusCommand(const CString& sCommand) { return CONTINUE; } @@ -464,15 +461,21 @@ void CModule::OnKick(const CNick& Nick, const CString& sKickedNick, CChan& Chann void CModule::OnJoin(const CNick& Nick, CChan& Channel) {} void CModule::OnPart(const CNick& Nick, CChan& Channel) {} +void CModule::OnUserAttached() {} +void CModule::OnUserDetached() {} +CModule::EModRet CModule::OnUserRaw(CString& sLine) { return CONTINUE; } CModule::EModRet CModule::OnUserCTCPReply(CString& sTarget, CString& sMessage) { return CONTINUE; } -CModule::EModRet CModule::OnCTCPReply(CNick& Nick, CString& sMessage) { return CONTINUE; } CModule::EModRet CModule::OnUserCTCP(CString& sTarget, CString& sMessage) { return CONTINUE; } +CModule::EModRet CModule::OnUserMsg(CString& sTarget, CString& sMessage) { return CONTINUE; } +CModule::EModRet CModule::OnUserNotice(CString& sTarget, CString& sMessage) { return CONTINUE; } +CModule::EModRet CModule::OnUserJoin(CString& sChannel, CString& sKey) { return CONTINUE; } +CModule::EModRet CModule::OnUserPart(CString& sChannel, CString& sMessage) { return CONTINUE; } + +CModule::EModRet CModule::OnCTCPReply(CNick& Nick, CString& sMessage) { return CONTINUE; } CModule::EModRet CModule::OnPrivCTCP(CNick& Nick, CString& sMessage) { return CONTINUE; } CModule::EModRet CModule::OnChanCTCP(CNick& Nick, CChan& Channel, CString& sMessage) { return CONTINUE; } -CModule::EModRet CModule::OnUserMsg(CString& sTarget, CString& sMessage) { return CONTINUE; } CModule::EModRet CModule::OnPrivMsg(CNick& Nick, CString& sMessage) { return CONTINUE; } CModule::EModRet CModule::OnChanMsg(CNick& Nick, CChan& Channel, CString& sMessage) { return CONTINUE; } -CModule::EModRet CModule::OnUserNotice(CString& sTarget, CString& sMessage) { return CONTINUE; } CModule::EModRet CModule::OnPrivNotice(CNick& Nick, CString& sMessage) { return CONTINUE; } CModule::EModRet CModule::OnChanNotice(CNick& Nick, CChan& Channel, CString& sMessage) { return CONTINUE; } @@ -531,141 +534,44 @@ bool CModules::OnBoot() { return true; } -void CModules::OnIRCConnected() { - MODUNLOADCHK(OnIRCConnected()); -} +void CModules::OnIRCConnected() { MODUNLOADCHK(OnIRCConnected()); } +bool CModules::OnBroadcast(CString& sMessage) { MODHALTCHK(OnBroadcast(sMessage)); } +void CModules::OnIRCDisconnected() { MODUNLOADCHK(OnIRCDisconnected()); } +bool CModules::OnDCCUserSend(const CNick& RemoteNick, unsigned long uLongIP, unsigned short uPort, const CString& sFile, unsigned long uFileSize) { MODHALTCHK(OnDCCUserSend(RemoteNick, uLongIP, uPort, sFile, uFileSize)); } +void CModules::OnChanPermission(const CNick& OpNick, const CNick& Nick, CChan& Channel, unsigned char uMode, bool bAdded, bool bNoChange) { MODUNLOADCHK(OnChanPermission(OpNick, Nick, Channel, uMode, bAdded, bNoChange)); } +void CModules::OnOp(const CNick& OpNick, const CNick& Nick, CChan& Channel, bool bNoChange) { MODUNLOADCHK(OnOp(OpNick, Nick, Channel, bNoChange)); } +void CModules::OnDeop(const CNick& OpNick, const CNick& Nick, CChan& Channel, bool bNoChange) { MODUNLOADCHK(OnDeop(OpNick, Nick, Channel, bNoChange)); } +void CModules::OnVoice(const CNick& OpNick, const CNick& Nick, CChan& Channel, bool bNoChange) { MODUNLOADCHK(OnVoice(OpNick, Nick, Channel, bNoChange)); } +void CModules::OnDevoice(const CNick& OpNick, const CNick& Nick, CChan& Channel, bool bNoChange) { MODUNLOADCHK(OnDevoice(OpNick, Nick, Channel, bNoChange)); } +void CModules::OnRawMode(const CNick& OpNick, CChan& Channel, const CString& sModes, const CString& sArgs) { MODUNLOADCHK(OnRawMode(OpNick, Channel, sModes, sArgs)); } +bool CModules::OnRaw(CString& sLine) { MODHALTCHK(OnRaw(sLine)); } -bool CModules::OnBroadcast(CString& sMessage) { - MODHALTCHK(OnBroadcast(sMessage)); -} +void CModules::OnUserAttached() { MODUNLOADCHK(OnUserAttached()); } +void CModules::OnUserDetached() { MODUNLOADCHK(OnUserDetached()); } +bool CModules::OnUserRaw(CString& sLine) { MODHALTCHK(OnUserRaw(sLine)); } +bool CModules::OnUserCTCPReply(CString& sTarget, CString& sMessage) { MODHALTCHK(OnUserCTCPReply(sTarget, sMessage)); } +bool CModules::OnUserCTCP(CString& sTarget, CString& sMessage) { MODHALTCHK(OnUserCTCP(sTarget, sMessage)); } +bool CModules::OnUserMsg(CString& sTarget, CString& sMessage) { MODHALTCHK(OnUserMsg(sTarget, sMessage)); } +bool CModules::OnUserNotice(CString& sTarget, CString& sMessage) { MODHALTCHK(OnUserNotice(sTarget, sMessage)); } +bool CModules::OnUserJoin(CString& sChannel, CString& sKey) { MODHALTCHK(OnUserJoin(sChannel, sKey)); } +bool CModules::OnUserPart(CString& sChannel, CString& sMessage) { MODHALTCHK(OnUserPart(sChannel, sMessage)); } -void CModules::OnUserAttached() { - MODUNLOADCHK(OnUserAttached()); -} - -void CModules::OnUserDetached() { - MODUNLOADCHK(OnUserDetached()); -} - -void CModules::OnIRCDisconnected() { - MODUNLOADCHK(OnIRCDisconnected()); -} - -bool CModules::OnDCCUserSend(const CNick& RemoteNick, unsigned long uLongIP, unsigned short uPort, const CString& sFile, unsigned long uFileSize) { - MODHALTCHK(OnDCCUserSend(RemoteNick, uLongIP, uPort, sFile, uFileSize)); -} - -void CModules::OnChanPermission(const CNick& OpNick, const CNick& Nick, CChan& Channel, unsigned char uMode, bool bAdded, bool bNoChange) { - MODUNLOADCHK(OnChanPermission(OpNick, Nick, Channel, uMode, bAdded, bNoChange)); -} - -void CModules::OnOp(const CNick& OpNick, const CNick& Nick, CChan& Channel, bool bNoChange) { - MODUNLOADCHK(OnOp(OpNick, Nick, Channel, bNoChange)); -} - -void CModules::OnDeop(const CNick& OpNick, const CNick& Nick, CChan& Channel, bool bNoChange) { - MODUNLOADCHK(OnDeop(OpNick, Nick, Channel, bNoChange)); -} - -void CModules::OnVoice(const CNick& OpNick, const CNick& Nick, CChan& Channel, bool bNoChange) { - MODUNLOADCHK(OnVoice(OpNick, Nick, Channel, bNoChange)); -} - -void CModules::OnDevoice(const CNick& OpNick, const CNick& Nick, CChan& Channel, bool bNoChange) { - MODUNLOADCHK(OnDevoice(OpNick, Nick, Channel, bNoChange)); -} - -void CModules::OnRawMode(const CNick& OpNick, CChan& Channel, const CString& sModes, const CString& sArgs) { - MODUNLOADCHK(OnRawMode(OpNick, Channel, sModes, sArgs)); -} - -bool CModules::OnRaw(CString& sLine) { - MODHALTCHK(OnRaw(sLine)); -} - -bool CModules::OnUserRaw(CString& sLine) { - MODHALTCHK(OnUserRaw(sLine)); -} - -void CModules::OnQuit(const CNick& Nick, const CString& sMessage, const vector& vChans) { - MODUNLOADCHK(OnQuit(Nick, sMessage, vChans)); -} - -void CModules::OnNick(const CNick& Nick, const CString& sNewNick, const vector& vChans) { - MODUNLOADCHK(OnNick(Nick, sNewNick, vChans)); -} - -void CModules::OnKick(const CNick& Nick, const CString& sKickedNick, CChan& Channel, const CString& sMessage) { - MODUNLOADCHK(OnKick(Nick, sKickedNick, Channel, sMessage)); -} - -void CModules::OnJoin(const CNick& Nick, CChan& Channel) { - MODUNLOADCHK(OnJoin(Nick, Channel)); -} - -void CModules::OnPart(const CNick& Nick, CChan& Channel) { - MODUNLOADCHK(OnPart(Nick, Channel)); -} - -bool CModules::OnUserCTCPReply(CString& sTarget, CString& sMessage) { - MODHALTCHK(OnUserCTCPReply(sTarget, sMessage)); -} - -bool CModules::OnCTCPReply(CNick& Nick, CString& sMessage) { - MODHALTCHK(OnCTCPReply(Nick, sMessage)); -} - -bool CModules::OnUserCTCP(CString& sTarget, CString& sMessage) { - MODHALTCHK(OnUserCTCP(sTarget, sMessage)); -} - -bool CModules::OnPrivCTCP(CNick& Nick, CString& sMessage) { - MODHALTCHK(OnPrivCTCP(Nick, sMessage)); -} - -bool CModules::OnChanCTCP(CNick& Nick, CChan& Channel, CString& sMessage) { - MODHALTCHK(OnChanCTCP(Nick, Channel, sMessage)); -} - -bool CModules::OnUserMsg(CString& sTarget, CString& sMessage) { - MODHALTCHK(OnUserMsg(sTarget, sMessage)); -} - -bool CModules::OnPrivMsg(CNick& Nick, CString& sMessage) { - MODHALTCHK(OnPrivMsg(Nick, sMessage)); -} - -bool CModules::OnChanMsg(CNick& Nick, CChan& Channel, CString& sMessage) { - MODHALTCHK(OnChanMsg(Nick, Channel, sMessage)); -} - -bool CModules::OnUserNotice(CString& sTarget, CString& sMessage) { - MODHALTCHK(OnUserNotice(sTarget, sMessage)); -} - -bool CModules::OnPrivNotice(CNick& Nick, CString& sMessage) { - MODHALTCHK(OnPrivNotice(Nick, sMessage)); -} - -bool CModules::OnChanNotice(CNick& Nick, CChan& Channel, CString& sMessage) { - MODHALTCHK(OnChanNotice(Nick, Channel, sMessage)); -} - -bool CModules::OnStatusCommand(const CString& sCommand) { - MODHALTCHK(OnStatusCommand(sCommand)); -} - -void CModules::OnModCommand(const CString& sCommand) { - MODUNLOADCHK(OnModCommand(sCommand)); -} - -void CModules::OnModNotice(const CString& sMessage) { - MODUNLOADCHK(OnModNotice(sMessage)); -} - -void CModules::OnModCTCP(const CString& sMessage) { - MODUNLOADCHK(OnModCTCP(sMessage)); -} +void CModules::OnQuit(const CNick& Nick, const CString& sMessage, const vector& vChans) { MODUNLOADCHK(OnQuit(Nick, sMessage, vChans)); } +void CModules::OnNick(const CNick& Nick, const CString& sNewNick, const vector& vChans) { MODUNLOADCHK(OnNick(Nick, sNewNick, vChans)); } +void CModules::OnKick(const CNick& Nick, const CString& sKickedNick, CChan& Channel, const CString& sMessage) { MODUNLOADCHK(OnKick(Nick, sKickedNick, Channel, sMessage)); } +void CModules::OnJoin(const CNick& Nick, CChan& Channel) { MODUNLOADCHK(OnJoin(Nick, Channel)); } +void CModules::OnPart(const CNick& Nick, CChan& Channel) { MODUNLOADCHK(OnPart(Nick, Channel)); } +bool CModules::OnCTCPReply(CNick& Nick, CString& sMessage) { MODHALTCHK(OnCTCPReply(Nick, sMessage)); } +bool CModules::OnPrivCTCP(CNick& Nick, CString& sMessage) { MODHALTCHK(OnPrivCTCP(Nick, sMessage)); } +bool CModules::OnChanCTCP(CNick& Nick, CChan& Channel, CString& sMessage) { MODHALTCHK(OnChanCTCP(Nick, Channel, sMessage)); } +bool CModules::OnPrivMsg(CNick& Nick, CString& sMessage) { MODHALTCHK(OnPrivMsg(Nick, sMessage)); } +bool CModules::OnChanMsg(CNick& Nick, CChan& Channel, CString& sMessage) { MODHALTCHK(OnChanMsg(Nick, Channel, sMessage)); } +bool CModules::OnPrivNotice(CNick& Nick, CString& sMessage) { MODHALTCHK(OnPrivNotice(Nick, sMessage)); } +bool CModules::OnChanNotice(CNick& Nick, CChan& Channel, CString& sMessage) { MODHALTCHK(OnChanNotice(Nick, Channel, sMessage)); } +bool CModules::OnStatusCommand(const CString& sCommand) { MODHALTCHK(OnStatusCommand(sCommand)); } +void CModules::OnModCommand(const CString& sCommand) { MODUNLOADCHK(OnModCommand(sCommand)); } +void CModules::OnModNotice(const CString& sMessage) { MODUNLOADCHK(OnModNotice(sMessage)); } +void CModules::OnModCTCP(const CString& sMessage) { MODUNLOADCHK(OnModCTCP(sMessage)); } //////////////////// // CGlobalModules // diff --git a/Modules.h b/Modules.h index f72b152b..9df6bc93 100644 --- a/Modules.h +++ b/Modules.h @@ -198,8 +198,6 @@ public: virtual bool OnLoad(const CString& sArgs); virtual bool OnBoot(); - virtual void OnUserAttached(); - virtual void OnUserDetached(); virtual void OnIRCDisconnected(); virtual void OnIRCConnected(); virtual EModRet OnBroadcast(CString& sMessage); @@ -213,7 +211,6 @@ public: virtual void OnDevoice(const CNick& OpNick, const CNick& Nick, CChan& Channel, bool bNoChange); virtual void OnRawMode(const CNick& OpNick, CChan& Channel, const CString& sModes, const CString& sArgs); - virtual EModRet OnUserRaw(CString& sLine); virtual EModRet OnRaw(CString& sLine); virtual EModRet OnStatusCommand(const CString& sCommand); @@ -227,15 +224,21 @@ public: virtual void OnJoin(const CNick& Nick, CChan& Channel); virtual void OnPart(const CNick& Nick, CChan& Channel); + virtual void OnUserAttached(); + virtual void OnUserDetached(); + virtual EModRet OnUserRaw(CString& sLine); virtual EModRet OnUserCTCPReply(CString& sTarget, CString& sMessage); - virtual EModRet OnCTCPReply(CNick& Nick, CString& sMessage); virtual EModRet OnUserCTCP(CString& sTarget, CString& sMessage); + virtual EModRet OnUserMsg(CString& sTarget, CString& sMessage); + virtual EModRet OnUserNotice(CString& sTarget, CString& sMessage); + virtual EModRet OnUserJoin(CString& sChannel, CString& sKey); + virtual EModRet OnUserPart(CString& sChannel, CString& sMessage); + + virtual EModRet OnCTCPReply(CNick& Nick, CString& sMessage); virtual EModRet OnPrivCTCP(CNick& Nick, CString& sMessage); virtual EModRet OnChanCTCP(CNick& Nick, CChan& Channel, CString& sMessage); - virtual EModRet OnUserMsg(CString& sTarget, CString& sMessage); virtual EModRet OnPrivMsg(CNick& Nick, CString& sMessage); virtual EModRet OnChanMsg(CNick& Nick, CChan& Channel, CString& sMessage); - virtual EModRet OnUserNotice(CString& sTarget, CString& sMessage); virtual EModRet OnPrivNotice(CNick& Nick, CString& sMessage); virtual EModRet OnChanNotice(CNick& Nick, CChan& Channel, CString& sMessage); @@ -323,8 +326,6 @@ public: void UnloadAll(); virtual bool OnBoot(); // Return false to abort - virtual void OnUserAttached(); - virtual void OnUserDetached(); virtual void OnIRCDisconnected(); virtual void OnIRCConnected(); virtual bool OnBroadcast(CString& sMessage); @@ -338,7 +339,6 @@ public: virtual void OnDevoice(const CNick& OpNick, const CNick& Nick, CChan& Channel, bool bNoChange); virtual void OnRawMode(const CNick& OpNick, CChan& Channel, const CString& sModes, const CString& sArgs); - virtual bool OnUserRaw(CString& sLine); virtual bool OnRaw(CString& sLine); virtual bool OnStatusCommand(const CString& sCommand); @@ -352,15 +352,21 @@ public: virtual void OnJoin(const CNick& Nick, CChan& Channel); virtual void OnPart(const CNick& Nick, CChan& Channel); + virtual void OnUserAttached(); + virtual void OnUserDetached(); + virtual bool OnUserRaw(CString& sLine); virtual bool OnUserCTCPReply(CString& sTarget, CString& sMessage); - virtual bool OnCTCPReply(CNick& Nick, CString& sMessage); virtual bool OnUserCTCP(CString& sTarget, CString& sMessage); + virtual bool OnUserMsg(CString& sTarget, CString& sMessage); + virtual bool OnUserNotice(CString& sTarget, CString& sMessage); + virtual bool OnUserJoin(CString& sChannel, CString& sKey); + virtual bool OnUserPart(CString& sChannel, CString& sMessage); + + virtual bool OnCTCPReply(CNick& Nick, CString& sMessage); virtual bool OnPrivCTCP(CNick& Nick, CString& sMessage); virtual bool OnChanCTCP(CNick& Nick, CChan& Channel, CString& sMessage); - virtual bool OnUserMsg(CString& sTarget, CString& sMessage); virtual bool OnPrivMsg(CNick& Nick, CString& sMessage); virtual bool OnChanMsg(CNick& Nick, CChan& Channel, CString& sMessage); - virtual bool OnUserNotice(CString& sTarget, CString& sMessage); virtual bool OnPrivNotice(CNick& Nick, CString& sMessage); virtual bool OnChanNotice(CNick& Nick, CChan& Channel, CString& sMessage); diff --git a/UserSock.cpp b/UserSock.cpp index a35e5e3b..7e5756a4 100644 --- a/UserSock.cpp +++ b/UserSock.cpp @@ -86,7 +86,9 @@ void CUserSock::ReadLine(const CString& sData) { } return; // Don't forward this msg. ZNC has already registered us. - } else if (!m_pUser) { + } + + if (!m_pUser) { Close(); return; } @@ -116,24 +118,59 @@ void CUserSock::ReadLine(const CString& sData) { } else if (sCommand.CaseCmp("PONG") == 0) { return; // Block pong replies, we already responded to the pings } else if (sCommand.CaseCmp("JOIN") == 0) { - CString sChan = sLine.Token(1); + CString sChans = sLine.Token(1); CString sKey = sLine.Token(2); - if (sChan.Left(1) == ":") { - sChan.LeftChomp(); + if (sChans.Left(1) == ":") { + sChans.LeftChomp(); } if (m_pUser) { - CChan* pChan = m_pUser->FindChan(sChan); + VCString vChans; + sChans.Split(",", vChans, false); + sChans.clear(); - if (pChan) { - pChan->JoinUser(false, sKey); + for (unsigned int a = 0; a < vChans.size(); a++) { + CString sChannel = vChans[a]; + CZNC::Get().GetModules().SetUserSock(this); + MODULECALLCONT(OnUserJoin(sChannel, sKey)); + CZNC::Get().GetModules().SetUserSock(NULL); + + CChan* pChan = m_pUser->FindChan(sChannel); + + if (pChan) { + pChan->JoinUser(false, sKey); + continue; + } + + if (!sChannel.empty()) { + sChans += (sChans.empty()) ? sChannel : CString("," + sChannel); + } + } + + if (sChans.empty()) { return; } + + sLine = "JOIN " + sChans; + + if (!sKey.empty()) { + sLine += " " + sKey; + } } } else if (sCommand.CaseCmp("PART") == 0) { + CString sChan = sLine.Token(1); + CString sMessage = sLine.Token(2, true); + + if (sMessage.Left(1) == ":") { + sMessage.LeftChomp(); + } + + CZNC::Get().GetModules().SetUserSock(this); + MODULECALLRET(OnUserPart(sChan, sMessage)); + CZNC::Get().GetModules().SetUserSock(NULL); + if (m_pUser) { - CString sChan = sLine.Token(1); CChan* pChan = m_pUser->FindChan(sChan); if (pChan && !pChan->IsOn()) { @@ -142,6 +179,12 @@ void CUserSock::ReadLine(const CString& sData) { return; } } + + sLine = "PART " + sChan; + + if (!sMessage.empty()) { + sLine += " :" + sMessage; + } } else if (sCommand.CaseCmp("QUIT") == 0) { if (m_pIRCSock) { m_pUser->UserDisconnected(this);