Add support for websocket vendor events

This commit is contained in:
WarmUpTill
2022-09-14 00:56:50 +02:00
committed by WarmUpTill
parent 6d755ad570
commit 1a8a4584c1
9 changed files with 331 additions and 25 deletions

View File

@@ -33,6 +33,7 @@ public:
void Load(obs_data_t *obj);
void Save(obs_data_t *obj);
std::string GetName() { return _name; }
std::vector<std::string> &Events() { return _client.Events(); }
private:
std::string _name = "";

View File

@@ -13,6 +13,22 @@ using websocketpp::lib::bind;
obs_websocket_vendor vendor;
void ClearWebsocketMessages()
{
switcher->websocketMessages.clear();
for (auto &connection : switcher->connections) {
connection.Events().clear();
}
}
void SendWebsocketEvent(const std::string &eventMsg)
{
auto data = obs_data_create();
obs_data_set_string(data, "message", eventMsg.c_str());
obs_websocket_vendor_emit_event(vendor, VendorEvent, data);
obs_data_release(data);
}
void ReceiveWebsocketMessage(obs_data_t *request_data, obs_data_t *, void *)
{
if (!obs_data_has_user_value(request_data, "message")) {
@@ -232,6 +248,31 @@ void WSConnection::HandleHello(obs_data_t *helloMsg)
Send(response);
}
void WSConnection::HandleEvent(obs_data_t *msg)
{
auto d = obs_data_get_obj(msg, "d");
auto eventData = obs_data_get_obj(d, "eventData");
if (strcmp(obs_data_get_string(eventData, "vendorName"), VendorName) !=
0) {
vblog(LOG_INFO, "ignoring vendor event from \"%s\"",
obs_data_get_string(eventData, "vendorName"));
return;
}
if (strcmp(obs_data_get_string(eventData, "eventType"), VendorEvent) !=
0) {
vblog(LOG_INFO, "ignoring event type\"%s\"",
obs_data_get_string(eventData, "eventType"));
return;
}
auto eventDataNested = obs_data_get_obj(eventData, "eventData");
_messages.emplace_back(obs_data_get_string(eventDataNested, "message"));
vblog(LOG_INFO, "received event msg \"%s\"",
obs_data_get_string(eventDataNested, "message"));
obs_data_release(eventDataNested);
obs_data_release(eventData);
obs_data_release(d);
}
void WSConnection::HandleResponse(obs_data_t *response)
{
auto data = obs_data_get_obj(response, "d");
@@ -278,6 +319,9 @@ void WSConnection::OnMessage(connection_hdl, client::message_ptr message)
case 2: // Identified
_status = Status::AUTHENTICATED;
break;
case 5: // Event (Vendor)
HandleEvent(json);
break;
case 7: // RequestResponse
HandleResponse(json);
break;

View File

@@ -24,6 +24,10 @@ typedef websocketpp::client<websocketpp::config::asio_client> client;
constexpr char VendorName[] = "AdvancedSceneSwitcher";
constexpr char VendorRequest[] = "AdvancedSceneSwitcherMessage";
constexpr char VendorEvent[] = "AdvancedSceneSwitcherEvent";
void ClearWebsocketMessages();
void SendWebsocketEvent(const std::string &);
class WSConnection : public QObject {
public:
@@ -34,6 +38,7 @@ public:
bool _reconnect, int reconnectDelay = 10);
void Disconnect();
void SendRequest(const std::string &msg);
std::vector<std::string> &Events() { return _messages; }
std::string GetFail() { return _failMsg; }
enum class Status {
@@ -51,6 +56,7 @@ private:
void Send(const std::string &);
void ConnectThread();
void HandleHello(obs_data_t *helloMsg);
void HandleEvent(obs_data_t *event);
void HandleResponse(obs_data_t *response);
client _client;
@@ -66,4 +72,6 @@ private:
std::string _failMsg = "";
std::atomic<Status> _status = {Status::DISCONNECTED};
std::atomic_bool _disconnect{false};
std::vector<std::string> _messages;
};