Buffer websocket messages until they were processed

This commit is contained in:
WarmUpTill 2024-01-21 14:33:07 +01:00 committed by WarmUpTill
parent cf5f338902
commit 9b34af98fd
4 changed files with 34 additions and 16 deletions

View File

@ -22,32 +22,34 @@ const static std::map<MacroConditionWebsocket::Type, std::string>
bool MacroConditionWebsocket::CheckCondition()
{
std::vector<std::string> messages;
std::vector<WSMessage> *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;
}
}

View File

@ -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<std::string> &Events() { return _client.Events(); }
std::vector<WSMessage> &Events() { return _client.Events(); }
bool IsUsingOBSProtocol() { return _useOBSWSProtocol; }
private:

View File

@ -21,7 +21,7 @@ constexpr char VendorEvent[] = "AdvancedSceneSwitcherEvent";
obs_websocket_vendor vendor;
static void clearWebsocketMessages();
static std::vector<std::string> websocketMessages;
static std::vector<WSMessage> websocketMessages;
static void registerWebsocketVendor();
static bool setup();
@ -34,20 +34,30 @@ bool setup()
return true;
}
std::vector<std::string> &GetWebsocketMessages()
std::vector<WSMessage> &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 *>(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());
}
}

View File

@ -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<std::string> &GetWebsocketMessages();
std::vector<WSMessage> &GetWebsocketMessages();
class WSConnection : public QObject {
using server = websocketpp::server<websocketpp::config::asio>;
@ -38,7 +44,7 @@ public:
bool _reconnect, int reconnectDelay = 10);
void Disconnect();
void SendRequest(const std::string &msg);
std::vector<std::string> &Events() { return _messages; }
std::vector<WSMessage> &Events() { return _messages; }
std::string GetFail() { return _failMsg; }
enum class Status {
@ -76,7 +82,7 @@ private:
std::atomic<Status> _status = {Status::DISCONNECTED};
std::atomic_bool _disconnect{false};
std::vector<std::string> _messages;
std::vector<WSMessage> _messages;
};
} // namespace advss