From 59cc37c90aaf6fea162e7b080c45f421a02db374 Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Wed, 17 Aug 2022 20:48:28 +0200 Subject: [PATCH] Add websocket condition --- src/advanced-scene-switcher.cpp | 2 + src/macro-core/macro-condition-websocket.cpp | 121 +++++++++++++++++++ src/macro-core/macro-condition-websocket.hpp | 58 +++++++++ 3 files changed, 181 insertions(+) create mode 100644 src/macro-core/macro-condition-websocket.cpp create mode 100644 src/macro-core/macro-condition-websocket.hpp diff --git a/src/advanced-scene-switcher.cpp b/src/advanced-scene-switcher.cpp index e88925f2..99868874 100644 --- a/src/advanced-scene-switcher.cpp +++ b/src/advanced-scene-switcher.cpp @@ -227,6 +227,8 @@ void SwitcherData::Thread() } } + websocketMessages.clear(); + // After this point we will call frontend functions like // obs_frontend_set_current_scene() and // obs_frontend_set_current_transition() diff --git a/src/macro-core/macro-condition-websocket.cpp b/src/macro-core/macro-condition-websocket.cpp new file mode 100644 index 00000000..009e0b00 --- /dev/null +++ b/src/macro-core/macro-condition-websocket.cpp @@ -0,0 +1,121 @@ +#include "macro-condition-edit.hpp" +#include "macro-condition-websocket.hpp" +#include "utility.hpp" +#include "advanced-scene-switcher.hpp" + +#include + +const std::string MacroConditionWebsocket::id = "websocket"; + +bool MacroConditionWebsocket::_registered = MacroConditionFactory::Register( + MacroConditionWebsocket::id, + {MacroConditionWebsocket::Create, MacroConditionWebsocketEdit::Create, + "AdvSceneSwitcher.condition.websocket"}); + +static bool matchRegex(const std::string &msg, const std::string &expr) +{ + try { + std::regex regExpr(expr); + return std::regex_match(msg, regExpr); + } catch (const std::regex_error &) { + } + return false; +} + +bool MacroConditionWebsocket::CheckCondition() +{ + for (const auto &msg : switcher->websocketMessages) { + if (_useRegex) { + if (matchRegex(msg, _message)) { + return true; + } + } else { + if (msg == _message) { + return true; + } + } + } + return false; +} + +bool MacroConditionWebsocket::Save(obs_data_t *obj) +{ + MacroCondition::Save(obj); + obs_data_set_string(obj, "message", _message.c_str()); + obs_data_set_bool(obj, "useRegex", _useRegex); + return true; +} + +bool MacroConditionWebsocket::Load(obs_data_t *obj) +{ + MacroCondition::Load(obj); + _message = obs_data_get_string(obj, "message"); + _useRegex = obs_data_get_bool(obj, "useRegex"); + return true; +} + +std::string MacroConditionWebsocket::GetShortDesc() +{ + return ""; +} + +MacroConditionWebsocketEdit::MacroConditionWebsocketEdit( + QWidget *parent, std::shared_ptr entryData) + : QWidget(parent), + _message(new ResizingPlainTextEdit(this)), + _useRegex(new QCheckBox(obs_module_text( + "AdvSceneSwitcher.condition.websocket.useRegex"))) +{ + QWidget::connect(_message, SIGNAL(textChanged()), this, + SLOT(MessageChanged())); + QWidget::connect(_useRegex, SIGNAL(stateChanged(int)), this, + SLOT(UseRegexChanged(int))); + + QVBoxLayout *mainLayout = new QVBoxLayout; + + mainLayout->addWidget(new QLabel( + obs_module_text("AdvSceneSwitcher.condition.websocket.entry"))); + mainLayout->addWidget(_message); + mainLayout->addWidget(_useRegex); + setLayout(mainLayout); + + _entryData = entryData; + UpdateEntryData(); + _loading = false; +} + +void MacroConditionWebsocketEdit::UpdateEntryData() +{ + if (!_entryData) { + return; + } + + _message->setPlainText(QString::fromStdString(_entryData->_message)); + _useRegex->setChecked(_entryData->_useRegex); + + adjustSize(); + updateGeometry(); +} + +void MacroConditionWebsocketEdit::MessageChanged() +{ + if (_loading || !_entryData) { + return; + } + + std::lock_guard lock(switcher->m); + _entryData->_message = _message->toPlainText().toUtf8().constData(); + + adjustSize(); + updateGeometry(); +} + +void MacroConditionWebsocketEdit::UseRegexChanged(int state) +{ + if (_loading || !_entryData) { + return; + } + + std::lock_guard lock(switcher->m); + _entryData->_useRegex = state; +} diff --git a/src/macro-core/macro-condition-websocket.hpp b/src/macro-core/macro-condition-websocket.hpp new file mode 100644 index 00000000..03f5d14c --- /dev/null +++ b/src/macro-core/macro-condition-websocket.hpp @@ -0,0 +1,58 @@ +#pragma once +#include "macro.hpp" +#include "resizing-text-edit.hpp" + +#include + +class MacroConditionWebsocket : public MacroCondition { +public: + MacroConditionWebsocket(Macro *m) : MacroCondition(m) {} + bool CheckCondition(); + bool Save(obs_data_t *obj); + bool Load(obs_data_t *obj); + std::string GetShortDesc(); + std::string GetId() { return id; }; + static std::shared_ptr Create(Macro *m) + { + return std::make_shared(m); + } + + std::string _message = obs_module_text("AdvSceneSwitcher.enterText"); + bool _useRegex = false; + +private: + static bool _registered; + static const std::string id; +}; + +class MacroConditionWebsocketEdit : public QWidget { + Q_OBJECT + +public: + MacroConditionWebsocketEdit( + QWidget *parent, + std::shared_ptr cond = nullptr); + void UpdateEntryData(); + static QWidget *Create(QWidget *parent, + std::shared_ptr cond) + { + return new MacroConditionWebsocketEdit( + parent, + std::dynamic_pointer_cast( + cond)); + } + +private slots: + void MessageChanged(); + void UseRegexChanged(int state); +signals: + void HeaderInfoChanged(const QString &); + +protected: + ResizingPlainTextEdit *_message; + QCheckBox *_useRegex; + std::shared_ptr _entryData; + +private: + bool _loading = true; +};