diff --git a/plugins/base/macro-condition-websocket.cpp b/plugins/base/macro-condition-websocket.cpp index b4d92174..54e548a0 100644 --- a/plugins/base/macro-condition-websocket.cpp +++ b/plugins/base/macro-condition-websocket.cpp @@ -22,32 +22,34 @@ const static std::map bool MacroConditionWebsocket::CheckCondition() { - std::vector messages; + std::vector *messages; switch (_type) { case MacroConditionWebsocket::Type::REQUEST: - messages = GetWebsocketMessages(); + messages = &GetWebsocketMessages(); break; case MacroConditionWebsocket::Type::EVENT: { auto connection = _connection.lock(); if (!connection) { return false; } - messages = connection->Events(); + messages = &connection->Events(); break; } default: break; } - for (const auto &msg : messages) { + for (auto &m : *messages) { if (_regex.Enabled()) { - if (_regex.Matches(msg, _message)) { - SetVariableValue(msg); + if (_regex.Matches(m.message, _message)) { + SetVariableValue(m.message); + m.processed = true; return true; } } else { - if (msg == std::string(_message)) { - SetVariableValue(msg); + if (m.message == std::string(_message)) { + SetVariableValue(m.message); + m.processed = true; return true; } } diff --git a/plugins/base/utils/connection-manager.hpp b/plugins/base/utils/connection-manager.hpp index a8482bae..821f5099 100644 --- a/plugins/base/utils/connection-manager.hpp +++ b/plugins/base/utils/connection-manager.hpp @@ -41,7 +41,7 @@ public: void Load(obs_data_t *obj); void Save(obs_data_t *obj) const; std::string GetName() { return _name; } - std::vector &Events() { return _client.Events(); } + std::vector &Events() { return _client.Events(); } bool IsUsingOBSProtocol() { return _useOBSWSProtocol; } private: diff --git a/plugins/base/utils/websocket-helpers.cpp b/plugins/base/utils/websocket-helpers.cpp index d8241cdb..18d36358 100644 --- a/plugins/base/utils/websocket-helpers.cpp +++ b/plugins/base/utils/websocket-helpers.cpp @@ -21,7 +21,7 @@ constexpr char VendorEvent[] = "AdvancedSceneSwitcherEvent"; obs_websocket_vendor vendor; static void clearWebsocketMessages(); -static std::vector websocketMessages; +static std::vector websocketMessages; static void registerWebsocketVendor(); static bool setup(); @@ -34,20 +34,30 @@ bool setup() return true; } -std::vector &GetWebsocketMessages() +std::vector &GetWebsocketMessages() { return websocketMessages; } static void clearWebsocketMessages() { - websocketMessages.clear(); + websocketMessages.erase(std::remove_if(websocketMessages.begin(), + websocketMessages.end(), + [](const WSMessage &message) { + return message.processed; + }), + websocketMessages.end()); for (auto &connection : GetConnections()) { auto c = dynamic_cast(connection.get()); if (!c) { continue; } - c->Events().clear(); + auto &messages = c->Events(); + messages.erase(std::remove_if(messages.begin(), messages.end(), + [](const WSMessage &message) { + return message.processed; + }), + messages.end()); } } diff --git a/plugins/base/utils/websocket-helpers.hpp b/plugins/base/utils/websocket-helpers.hpp index 091f3e86..8dafba85 100644 --- a/plugins/base/utils/websocket-helpers.hpp +++ b/plugins/base/utils/websocket-helpers.hpp @@ -22,9 +22,15 @@ namespace advss { using websocketpp::connection_hdl; +struct WSMessage { + WSMessage(const std::string &m) : message(m) {} + std::string message = ""; + bool processed = false; +}; + void SendWebsocketEvent(const std::string &); std::string ConstructVendorRequestMessage(const std::string &message); -std::vector &GetWebsocketMessages(); +std::vector &GetWebsocketMessages(); class WSConnection : public QObject { using server = websocketpp::server; @@ -38,7 +44,7 @@ public: bool _reconnect, int reconnectDelay = 10); void Disconnect(); void SendRequest(const std::string &msg); - std::vector &Events() { return _messages; } + std::vector &Events() { return _messages; } std::string GetFail() { return _failMsg; } enum class Status { @@ -76,7 +82,7 @@ private: std::atomic _status = {Status::DISCONNECTED}; std::atomic_bool _disconnect{false}; - std::vector _messages; + std::vector _messages; }; } // namespace advss