From 2312d611bece7651d0bc3e4658f84fd1857a8be9 Mon Sep 17 00:00:00 2001 From: psychon Date: Fri, 20 Aug 2010 15:02:36 +0000 Subject: [PATCH] Add clearbufferonmsg module This module clears all channel buffers whenever the user does something. This means that channel buffers will only be cleared after we are 100% sure they were read. Yay for no longer losing buffer playback when the client breaks. git-svn-id: https://znc.svn.sourceforge.net/svnroot/znc/trunk@2107 726aef4b-f618-498e-8847-2d620e286838 --- modules/extra/clearbufferonmsg.cpp | 72 ++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 modules/extra/clearbufferonmsg.cpp diff --git a/modules/extra/clearbufferonmsg.cpp b/modules/extra/clearbufferonmsg.cpp new file mode 100644 index 00000000..d6d55e75 --- /dev/null +++ b/modules/extra/clearbufferonmsg.cpp @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2004-2010 See the AUTHORS file for details. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published + * by the Free Software Foundation. + */ + +#include "Chan.h" +#include "Modules.h" +#include "User.h" + +class CClearBufferOnMsgMod : public CModule { +public: + MODCONSTRUCTOR(CClearBufferOnMsgMod) {} + + void ClearAllBuffers() { + const vector& vChans = GetUser()->GetChans(); + vector::const_iterator it; + + for (it = vChans.begin(); it != vChans.end(); ++it) { + (*it)->ClearBuffer(); + // We force KeepBuffer on all channels since this module + // doesnt make any sense without + (*it)->SetKeepBuffer(true); + } + + } + + virtual EModRet OnUserMsg(CString& sTarget, CString& sMessage) { + ClearAllBuffers(); + return CONTINUE; + } + + virtual EModRet OnUserCTCP(CString& sTarget, CString& sMessage) { + ClearAllBuffers(); + return CONTINUE; + } + + virtual EModRet OnUserAction(CString& sTarget, CString& sMessage) { + ClearAllBuffers(); + return CONTINUE; + } + + virtual EModRet OnUserNotice(CString& sTarget, CString& sMessage) { + ClearAllBuffers(); + return CONTINUE; + } + + virtual EModRet OnUserJoin(CString& sChannel, CString& sKey) { + ClearAllBuffers(); + return CONTINUE; + } + + virtual EModRet OnUserPart(CString& sChannel, CString& sMessage) { + ClearAllBuffers(); + return CONTINUE; + } + + virtual EModRet OnUserTopic(CString& sChannel, CString& sTopic) { + ClearAllBuffers(); + return CONTINUE; + } + + virtual void OnClientLogin() { + ClearAllBuffers(); + } + + // No OnClientDisconnect(), disconnect could be coming from e.g. a timeout +}; + +MODULEDEFS(CClearBufferOnMsgMod, "Clear all channel buffers whenever the user does something")