From 1b56cc4e99c391a94fc05a24e1f71c8e425168f1 Mon Sep 17 00:00:00 2001 From: Vaxry <43317083+vaxerski@users.noreply.github.com> Date: Sun, 19 Feb 2023 20:54:53 +0000 Subject: Added an Event Hook System (#1578) * added an eventHookSystem * Add all socket2 events to hooks --- src/managers/HookSystemManager.hpp | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 src/managers/HookSystemManager.hpp (limited to 'src/managers/HookSystemManager.hpp') diff --git a/src/managers/HookSystemManager.hpp b/src/managers/HookSystemManager.hpp new file mode 100644 index 00000000..57f1e58b --- /dev/null +++ b/src/managers/HookSystemManager.hpp @@ -0,0 +1,36 @@ +#pragma once + +#include "../defines.hpp" + +#include +#include +#include + +// global typedef for hooked functions. Passes itself as a ptr when called, and `data` additionally. +typedef std::function HOOK_CALLBACK_FN; + +#define EMIT_HOOK_EVENT(name, param) \ + { \ + static auto* const PEVENTVEC = g_pHookSystem->getVecForEvent(name); \ + g_pHookSystem->emit(PEVENTVEC, param); \ + } + +class CHookSystemManager { + public: + CHookSystemManager(); + + // returns the pointer to the function + HOOK_CALLBACK_FN* hookDynamic(const std::string& event, HOOK_CALLBACK_FN fn); + void hookStatic(const std::string& event, HOOK_CALLBACK_FN* fn); + void unhook(HOOK_CALLBACK_FN* fn); + + void emit(const std::vector* callbacks, std::any data = 0); + std::vector* getVecForEvent(const std::string& event); + + private: + // todo: this is slow. Maybe static ptrs should be somehow allowed. unique ptr for vec? + std::list>> m_lpRegisteredHooks; + std::list m_lCallbackFunctions; +}; + +inline std::unique_ptr g_pHookSystem; \ No newline at end of file -- cgit v1.2.3