diff --git a/Chan.cpp b/Chan.cpp index 164c8065..42194b09 100644 --- a/Chan.cpp +++ b/Chan.cpp @@ -330,6 +330,18 @@ void CChan::ModeChange(const CString& sModes, const CString& sOpNick) { break; } +#ifdef _MODULES + bool bNoChange; + if (bList) { + bNoChange = false; + } else if (bAdd) { + bNoChange = HasMode(uMode) && GetModeArg(uMode) == sArg; + } else { + bNoChange = !HasMode(uMode); + } + MODULECALL(OnMode(*pOpNick, *this, uMode, sArg, bAdd, bNoChange), m_pUser, NULL, ); +#endif + if (!bList) { (bAdd) ? AddMode(uMode, sArg) : RemMode(uMode, sArg); } @@ -372,10 +384,6 @@ bool CChan::HasMode(unsigned char uMode) const { } bool CChan::AddMode(unsigned char uMode, const CString& sArg) { - if (HasMode(uMode)) { - return false; - } - m_musModes[uMode] = sArg; return true; } diff --git a/Modules.cpp b/Modules.cpp index c0b3c87d..de22a27c 100644 --- a/Modules.cpp +++ b/Modules.cpp @@ -460,6 +460,7 @@ void CModule::OnDeop(const CNick& OpNick, const CNick& Nick, CChan& Channel, boo void CModule::OnVoice(const CNick& OpNick, const CNick& Nick, CChan& Channel, bool bNoChange) {} 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) {} +void CModule::OnMode(const CNick& OpNick, CChan& Channel, char uMode, const CString& sArg, bool bAdded, bool bNoChange) {} CModule::EModRet CModule::OnRaw(CString& sLine) { return CONTINUE; } @@ -583,6 +584,7 @@ bool CModules::OnDeop(const CNick& OpNick, const CNick& Nick, CChan& Channel, bo bool CModules::OnVoice(const CNick& OpNick, const CNick& Nick, CChan& Channel, bool bNoChange) { MODUNLOADCHK(OnVoice(OpNick, Nick, Channel, bNoChange)); return false; } bool CModules::OnDevoice(const CNick& OpNick, const CNick& Nick, CChan& Channel, bool bNoChange) { MODUNLOADCHK(OnDevoice(OpNick, Nick, Channel, bNoChange)); return false; } bool CModules::OnRawMode(const CNick& OpNick, CChan& Channel, const CString& sModes, const CString& sArgs) { MODUNLOADCHK(OnRawMode(OpNick, Channel, sModes, sArgs)); return false; } +bool CModules::OnMode(const CNick& OpNick, CChan& Channel, char uMode, const CString& sArg, bool bAdded, bool bNoChange) { MODUNLOADCHK(OnMode(OpNick, Channel, uMode, sArg, bAdded, bNoChange)); return false; } bool CModules::OnRaw(CString& sLine) { MODHALTCHK(OnRaw(sLine)); } bool CModules::OnUserAttached() { MODUNLOADCHK(OnUserAttached()); return false; } diff --git a/Modules.h b/Modules.h index 3a310664..4bcefa29 100644 --- a/Modules.h +++ b/Modules.h @@ -239,6 +239,7 @@ public: virtual void OnVoice(const CNick& OpNick, const CNick& Nick, CChan& Channel, bool bNoChange); 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 void OnMode(const CNick& OpNick, CChan& Channel, char uMode, const CString& sArg, bool bAdded, bool bNoChange); virtual EModRet OnRaw(CString& sLine); @@ -379,6 +380,7 @@ public: virtual bool OnVoice(const CNick& OpNick, const CNick& Nick, CChan& Channel, bool bNoChange); virtual bool OnDevoice(const CNick& OpNick, const CNick& Nick, CChan& Channel, bool bNoChange); virtual bool OnRawMode(const CNick& OpNick, CChan& Channel, const CString& sModes, const CString& sArgs); + virtual bool OnMode(const CNick& OpNick, CChan& Channel, char uMode, const CString& sArg, bool bAdded, bool bNoChange); virtual bool OnRaw(CString& sLine);