summaryrefslogtreecommitdiffstats
path: root/src/Event.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Event.hpp')
-rw-r--r--src/Event.hpp116
1 files changed, 116 insertions, 0 deletions
diff --git a/src/Event.hpp b/src/Event.hpp
new file mode 100644
index 0000000..2d830a4
--- /dev/null
+++ b/src/Event.hpp
@@ -0,0 +1,116 @@
+#pragma once
+
+#include <queue>
+#include <map>
+#include <thread>
+#include <mutex>
+#include <condition_variable>
+#include <chrono>
+#include <variant>
+#include <functional>
+
+#include "Vector.hpp"
+#include "Packet.hpp"
+
+enum class EventType {
+ Echo,
+ ChunkChanged,
+ ConnectToServer,
+ ConnectionSuccessfull,
+ GlobalAppState,
+ Disconnect,
+ SendPacket,
+ ReceivePacket,
+};
+
+struct EchoData {
+ std::chrono::time_point<std::chrono::high_resolution_clock> time;
+};
+
+struct ChunkChangedData {
+ Vector chunkPosition;
+};
+
+struct ConnectToServerData {
+ std::string address;
+ unsigned short port;
+};
+
+struct ConnectionSuccessfullData {
+
+};
+
+enum class GlobalState {
+ InitialLoading,
+ MainMenu,
+ Loading,
+ InGame,
+ PauseMenu,
+ Exiting,
+};
+
+struct GlobalAppStateData {
+ GlobalState state;
+};
+
+struct DisconnectData {
+
+};
+
+struct SendPacketData {
+ std::shared_ptr<Packet> packet;
+};
+
+struct ReceivePacketData {
+ std::shared_ptr<Packet> packet;
+};
+
+using EventData = std::variant<EchoData, ChunkChangedData, ConnectToServerData, ConnectionSuccessfullData,
+ GlobalAppStateData, DisconnectData, SendPacketData, ReceivePacketData>;
+
+struct Event {
+ EventType type;
+ EventData data;
+};
+
+class EventListener {
+ friend class EventAgregator;
+
+ using HandlerFunc = std::function<void(EventData)>;
+
+ std::map<EventType, HandlerFunc> handlers; //TODO: There must be more elegant solution than std::variant of all data
+
+ std::mutex eventsMutex;
+
+ std::queue<Event> events;
+
+ void PushEvent(Event event);
+
+public:
+ EventListener();
+ ~EventListener();
+ bool IsEventsQueueIsNotEmpty();
+
+ void RegisterHandler(EventType type, HandlerFunc handler);
+
+ void HandleEvent();
+};
+
+class EventAgregator {
+ friend EventListener;
+
+ EventAgregator() = default;
+ static std::queue<Event> eventsToHandle;
+ static std::mutex queueMutex;
+ static bool isStarted;
+ static std::vector<EventListener *> listeners;
+ static std::mutex listenersMutex;
+
+ static void EventHandlingLoop();
+
+ static void RegisterListener(EventListener &listener);
+ static void UnregisterListener(EventListener &listener);
+
+public:
+ static void PushEvent(EventType type, EventData data);
+}; \ No newline at end of file