mirror of
https://github.com/WarmUpTill/SceneSwitcher.git
synced 2026-03-21 17:34:57 -05:00
Buffer websocket messages until they were processed
This commit is contained in:
parent
cf5f338902
commit
9b34af98fd
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user