Compare commits

..

25 Commits
5.2.2 ... 5.3.0

Author SHA1 Message Date
ec2cdc8475 base: Update version to 5.3.0
- Various minor build process cleanups
- Various code cleanups
- requesthandler: Added NotReady request status
- base: Pause requests and events during start, SC change, and shutdown
- eventhandler: Use OBS_FRONTEND_EVENT_SCRIPTING_SHUTDOWN for exit
- requesthandler: Added SetRecordDirectory
- websocketserver: Retry listen on IPv4 if IPv6 is not available
2023-09-05 14:31:41 -04:00
3cd8163945 base: Fix error to save configuration at obs_module_unload
When `obs_module_unload` is called, the frontend API is no longer
available so that `_config->Save()` is failing with error messages.
Since the configuration is saved from the OK or the Apply button on the
dialog, it is not necessary to save it again at `obs_module_unload`.
2023-08-16 12:56:12 -07:00
132d4bafdd CI: Add obs-crowdin-sync 2023-08-16 12:51:54 -07:00
d991e21f29 Update translations from Crowdin 2023-08-13 14:09:13 +00:00
a74468e07e docs(ci): Update generated docs - 55b3f88 [skip ci] 2023-08-10 01:53:35 +00:00
55b3f88db9 base: Fix a comment for SetSceneSceneTransitionOverride 2023-08-09 21:53:17 -04:00
ba7839bb69 locale: Remove obsolete translations 2023-08-09 21:52:11 -04:00
417725801c base,deps,src: Replace qr submodule by prefix/system install 2023-07-15 16:58:18 -07:00
93713c438e docs: Fix URL in docs README 2023-05-29 13:20:53 -07:00
6db08f960e docs(ci): Update generated docs - 6434c42 [skip ci] 2023-05-28 05:54:49 +00:00
6434c42155 websocketserver: Retry listen on IPv4 if IPv6 is not available
Fixes #1311
2023-05-27 22:54:02 -07:00
ac00465565 requesthandler: Add SetRecordDirectory
I've admittedly done a pretty bad job of communicating the intention of
having `SetProfileParameter` be the go-to method of configuring the
record directory. In hindsight, such a commonly needed feature should
not be locked behind an arguably complex request.

Closes #1142
Closes #1062
Closes #1035
2023-05-27 22:30:08 -07:00
2606f262e6 docs: Add big text to README in the docs directory linking protocol.md
I bet people have been getting confused here
2023-05-27 22:14:16 -07:00
2caecf6c01 README: A few minor tweaks 2023-05-27 22:14:05 -07:00
19170fe6d9 WebSocketApi: Add missing GPL license headers 2023-05-27 22:06:46 -07:00
1fc7900b1c Config: Move default values to header file
Just to make the code style align with other places
2023-05-27 22:00:51 -07:00
53d7596160 base: Various random code nitpicks 2023-05-27 22:00:26 -07:00
886738547a websocketserver: Clean up WebSocketSession class implementation
Makes it header-only with inlines, so there's theoretically some very
small performance improvements too.
2023-05-27 21:50:55 -07:00
c11874eb17 eventhandler: Use OBS_FRONTEND_EVENT_SCRIPTING_SHUTDOWN for exit
Fixes #1136
2023-05-09 22:53:43 -07:00
a0ffe16e91 base: Pause requests and events during start, SC change, and shutdown
This implements the functionality described by the new NotReady request
status. Behavior should now be *much* more reliable.
2023-05-09 22:53:43 -07:00
e3d0751385 docs(ci): Update generated docs - d518541 [skip ci] 2023-05-10 01:38:50 +00:00
d5185417ec requesthandler: Add NotReady request status
During scene collection change and OBS exit, performing requests
constitutes undefined behavior. Previously, we attempted to help this
by providing the `SceneCollectionChanging` event for any clients to
pause requests client-side, but this method has proven to not be
adequate to fix the issue. As such, this allows us to tell clients
explicitly that a request cannot be fulfilled reliably, and they
may decide whether or not to retry.
2023-05-09 18:26:25 -07:00
f7637250f1 cmake: Silences Qt warnings emitted by clang with default Xcode settings 2023-05-09 15:01:45 -07:00
57a9c19f2c Update translations from Crowdin 2023-05-01 23:11:11 +00:00
6633144ce8 README: Prevent Firefox from flagging Macro Deck as a security risk
Removes the 'www․' in the Macro Deck link in README.md to Prevent
Firefox from flagging the Macro Deck website as a potential security
risk.
2023-04-19 12:06:36 -07:00
71 changed files with 424 additions and 488 deletions

22
.github/workflows/crowdin_upload.yml vendored Normal file
View File

@ -0,0 +1,22 @@
name: Upload Language Files 🌐
on:
push:
branches:
- master
paths:
- "**/en-US.ini"
jobs:
upload-language-files:
name: Upload Language Files 🌐
if: github.repository_owner == 'obsproject'
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 100
- name: Upload US English Language Files 🇺🇸
uses: obsproject/obs-crowdin-sync/upload@30b5446e3b5eb19595aa68a81ddf896a857302cf
env:
CROWDIN_PAT: ${{ secrets.CROWDIN_SYNC_CROWDIN_PAT }}
GITHUB_EVENT_BEFORE: ${{ github.event.before }}
SUBMODULE_NAME: obs-websocket

3
.gitmodules vendored
View File

@ -1,3 +0,0 @@
[submodule "deps/qr"]
path = deps/qr
url = https://github.com/nayuki/QR-Code-generator.git

View File

@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.16...3.25)
legacy_check()
set(obs-websocket_VERSION 5.2.2)
set(obs-websocket_VERSION 5.3.0)
set(OBS_WEBSOCKET_RPC_VERSION 1)
option(ENABLE_WEBSOCKET "Enable building OBS with websocket plugin" ON)
@ -11,17 +11,15 @@ if(NOT ENABLE_WEBSOCKET)
return()
endif()
# Submodule deps check
if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/deps/qr/cpp/QrCode.hpp")
message(FATAL_ERROR "obs-websocket submodule deps not available.")
endif()
# Find Qt
find_qt(COMPONENTS Core Widgets Svg Network)
# Find nlohmann JSON
find_package(nlohmann_json 3 REQUIRED)
# Find qrcodegencpp
find_package(Libqrcodegencpp REQUIRED)
# Find WebSocket++
find_package(Websocketpp 0.8 REQUIRED)
@ -53,7 +51,6 @@ target_sources(
PRIVATE src/websocketserver/WebSocketServer.cpp
src/websocketserver/WebSocketServer_Protocol.cpp
src/websocketserver/WebSocketServer.h
src/websocketserver/rpc/WebSocketSession.cpp
src/websocketserver/rpc/WebSocketSession.h
src/websocketserver/types/WebSocketCloseCode.h
src/websocketserver/types/WebSocketOpCode.h)
@ -125,8 +122,6 @@ target_sources(
src/utils/Platform.h
src/utils/Utils.h)
target_sources(obs-websocket PRIVATE deps/qr/cpp/QrCode.cpp deps/qr/cpp/QrCode.hpp)
configure_file(src/plugin-macros.h.in plugin-macros.generated.h)
target_sources(obs-websocket PRIVATE plugin-macros.generated.h)
@ -142,7 +137,7 @@ target_compile_options(
$<$<PLATFORM_ID:Darwin,Linux,FreeBSD>:-Wall>
$<$<COMPILE_LANG_AND_ID:CXX,GNU,AppleClang,Clang>:-Wno-error=float-conversion;-Wno-error=shadow>
$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-Wno-error=format-overflow;-Wno-error=int-conversion;-Wno-error=comment>
$<$<COMPILE_LANG_AND_ID:CXX,AppleClang,Clang>:-Wno-error=null-pointer-subtraction;-Wno-error=deprecated-declarations;-Wno-error=implicit-int-conversion;-Wno-error=shorten-64-to-32>
$<$<COMPILE_LANG_AND_ID:CXX,AppleClang,Clang>:-Wno-error=null-pointer-subtraction;-Wno-error=deprecated-declarations;-Wno-error=implicit-int-conversion;-Wno-error=shorten-64-to-32;-Wno-comma;-Wno-quoted-include-in-framework-header>
)
target_link_libraries(
@ -155,7 +150,8 @@ target_link_libraries(
Qt::Network
nlohmann_json::nlohmann_json
Websocketpp::Websocketpp
Asio::Asio)
Asio::Asio
Libqrcodegencpp::Libqrcodegencpp)
set_target_properties_obs(
obs-websocket

View File

@ -13,7 +13,7 @@ WebSocket API for OBS Studio.
## Downloads
obs-websocket is now included by default with OBS Studio 28.0.0 and above. As such, **there should be no need to download obs-websocket if you have OBS Studio > 28.0.0.**
**obs-websocket is now included by default with OBS Studio 28.0.0 and above. As such, there should be no need to download obs-websocket if you have OBS Studio > 28.0.0.**
Binaries **for OBS Studio < 28.0.0** on Windows, MacOS, and Linux are available in the [Releases](https://github.com/obsproject/obs-websocket/releases) section.
@ -31,7 +31,7 @@ It is **highly recommended** to keep obs-websocket protected with a password aga
### Client software
- [Macro Deck](https://www.macrodeck.org/)
- [Macro Deck](https://macrodeck.org/)
- [Touch Portal](https://www.touch-portal.com/)
- [Twitchat](https://twitchat.fr/)
- [OBS-web](https://github.com/Niek/obs-web) - hosted client at [obs-web.niek.tv/](http://obs-web.niek.tv/)
@ -65,12 +65,11 @@ We'd like to know what you're building with obs-websocket! If you do something i
### Code Contributors
This project exists thanks to [all the people](graphs/contributors) who contribute. [Contribute](wiki/Contributing-Guidelines).
<a href="https://github.com/obsproject/obs-websocket/graphs/contributors"><img src="https://opencollective.com/obs-websocket-dev/contributors.svg?width=890&button=false" /></a>
This project exists thanks to [all the people](https://github.com/obsproject/obs-websocket/graphs/contributors) who contribute. [Contribute Code](https://github.com/obsproject/obs-websocket/wiki/Contributing-Guidelines).
### Financial Contributors
Become a financial contributor and help us sustain our community. [Contribute](https://opencollective.com/obs-websocket-dev/contribute)
Become a financial contributor and help us sustain our community. [Contribute Financially](https://opencollective.com/obs-websocket-dev/contribute)
#### Individuals

View File

@ -1,4 +1,4 @@
project(obs-websocket VERSION 5.2.2)
project(obs-websocket VERSION 5.3.0)
set(OBS_WEBSOCKET_RPC_VERSION 1)
option(ENABLE_WEBSOCKET "Enable building OBS with websocket plugin" ON)
@ -8,11 +8,6 @@ if(NOT ENABLE_WEBSOCKET OR NOT ENABLE_UI)
return()
endif()
# Submodule deps check
if(NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/deps/qr/cpp/QrCode.hpp)
obs_status(FATAL_ERROR "obs-websocket submodule deps not available.")
endif()
# Plugin tests flag
option(PLUGIN_TESTS "Enable plugin runtime tests" OFF)
@ -22,6 +17,9 @@ find_qt(COMPONENTS Core Widgets Svg Network)
# Find nlohmann JSON
find_package(nlohmann_json 3 REQUIRED)
# Find qrcodegencpp
find_package(Libqrcodegencpp REQUIRED)
# Find WebSocket++
find_package(Websocketpp 0.8 REQUIRED)
@ -67,7 +65,6 @@ target_sources(
src/websocketserver/WebSocketServer.cpp
src/websocketserver/WebSocketServer_Protocol.cpp
src/websocketserver/WebSocketServer.h
src/websocketserver/rpc/WebSocketSession.cpp
src/websocketserver/rpc/WebSocketSession.h
src/websocketserver/types/WebSocketCloseCode.h
src/websocketserver/types/WebSocketOpCode.h
@ -128,9 +125,7 @@ target_sources(
src/utils/Platform.h
src/utils/Compat.cpp
src/utils/Compat.h
src/utils/Utils.h
deps/qr/cpp/QrCode.cpp
deps/qr/cpp/QrCode.hpp)
src/utils/Utils.h)
target_link_libraries(
obs-websocket
@ -142,7 +137,8 @@ target_link_libraries(
Qt::Network
nlohmann_json::nlohmann_json
Websocketpp::Websocketpp
Asio::Asio)
Asio::Asio
Libqrcodegencpp::Libqrcodegencpp)
target_compile_features(obs-websocket PRIVATE cxx_std_17)

9
data/locale/af-ZA.ini Normal file
View File

@ -0,0 +1,9 @@
OBSWebSocket.Settings.ServerSettingsTitle="Bedienerinstellings"
OBSWebSocket.Settings.Password="Bedienerwagwoord"
OBSWebSocket.Settings.GeneratePassword="Genereer wagwoord"
OBSWebSocket.Settings.ServerPort="Bedienerpoort"
OBSWebSocket.SessionTable.IdentifiedTitle="Geïdentifiseer"
OBSWebSocket.ConnectInfo.CopyText="Kopieer"
OBSWebSocket.ConnectInfo.ServerIp="Bediener-IP (beste skatting)"
OBSWebSocket.ConnectInfo.ServerPort="Bedienerpoort"
OBSWebSocket.ConnectInfo.ServerPassword="Bedienerwagwoord"

View File

@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="فشل مصادقة We
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="فشل العميل %1 في المصادقة."
OBSWebSocket.TrayNotification.Disconnected.Title="تم قطع اتصال عميل WebSocket"
OBSWebSocket.TrayNotification.Disconnected.Body="العميل %1 قطع الاتصال."
OBSWebSocket.Server.StartFailed.Title="فشل خادم WebSocket"
OBSWebSocket.Server.StartFailed.Message="فشل تشغيل خادم WebSocket. قد يكون منفذ TCP %1 قيد الاستخدام في تطبيق آخر على هذا النظام. حاول تعيين منفذ TCP مختلف في إعدادات خادم WebSocket، أو إيقاف أي تطبيق يمكن أن يستخدم هذا المنفذ.\n رسالة الخطأ: %2"

View File

@ -1,10 +1,10 @@
OBSWebSocket.Plugin.Description="Control remot de l'OBS Studio mitjançant un servidor web"
OBSWebSocket.Plugin.Description="Control remot de l'OBS Studio mitjançant WebSocket"
OBSWebSocket.Settings.DialogTitle="Configuració del servidor WebSocket"
OBSWebSocket.Settings.PluginSettingsTitle="Configuració del complement"
OBSWebSocket.Settings.ServerEnable="Habilita el servidor web"
OBSWebSocket.Settings.ServerEnable="Habilita el servidor WebSocket"
OBSWebSocket.Settings.AlertsEnable="Habilita les notificacions a la barra de tasques"
OBSWebSocket.Settings.DebugEnable="Habilita l'informe de depuració"
OBSWebSocket.Settings.DebugEnableHoverText="Habilita l'informe de depuració només per a la instància actual de l'OBS i no queda resident en inicis posteriors.\nUtilitzeu --websocket_debug si us cal que el canvi sigui persistent."
OBSWebSocket.Settings.DebugEnableHoverText="Habilita l'informe de depuració només per a la instància actual de l'OBS. No persisteix en inicis posteriors.\nUtilitzeu --websocket_debug si us cal que el canvi sigui persistent."
OBSWebSocket.Settings.ServerSettingsTitle="Configuració del servidor"
OBSWebSocket.Settings.AuthRequired="Habilita l'autenticació"
OBSWebSocket.Settings.Password="Contrasenya del servidor"
@ -15,29 +15,27 @@ OBSWebSocket.Settings.ShowConnectInfoWarningTitle="Atenció: Actualment en direc
OBSWebSocket.Settings.ShowConnectInfoWarningMessage="Sembla que una sortida (retransmissió, gravació, etc.) està actualment activa."
OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="Segur que voleu mostrar la vostra informació de connexió?"
OBSWebSocket.Settings.Save.UserPasswordWarningTitle="Atenció: Risc potencial de seguretat"
OBSWebSocket.Settings.Save.UserPasswordWarningMessage="El servidor web del l'OBS (obs-websocket) emmagatzema la contrasenya del servidor com a text pla. És altament recomanable l'ús d'una contrasenya generada automàticament."
OBSWebSocket.Settings.Save.UserPasswordWarningMessage="obs-websocket emmagatzema la contrasenya del servidor com a text pla. És altament recomanable l'ús d'una contrasenya generada automàticament."
OBSWebSocket.Settings.Save.UserPasswordWarningInfoText="Segur que voleu utilitzar la vostra contrasenya?"
OBSWebSocket.Settings.Save.PasswordInvalidErrorTitle="Error: Configuració no vàlida"
OBSWebSocket.Settings.Save.PasswordInvalidErrorMessage="Utilitzeu una contrasenya de 6 o més caràcters."
OBSWebSocket.SessionTable.Title="Sessions de servidor connectades"
OBSWebSocket.SessionTable.Title="Sessions de WebSocket connectades"
OBSWebSocket.SessionTable.RemoteAddressColumnTitle="Adreça remota"
OBSWebSocket.SessionTable.SessionDurationColumnTitle="Durada de la sessió"
OBSWebSocket.SessionTable.MessagesInOutColumnTitle="Missatges d'entrada/sortida"
OBSWebSocket.SessionTable.IdentifiedTitle="Identificat"
OBSWebSocket.SessionTable.KickButtonColumnTitle="Expuls?"
OBSWebSocket.SessionTable.KickButtonColumnTitle="Expulsar?"
OBSWebSocket.SessionTable.KickButtonText="Expulsa"
OBSWebSocket.ConnectInfo.DialogTitle="Informació de connexió del servidor Web (WebSocket)"
OBSWebSocket.ConnectInfo.DialogTitle="Informació de connexió del servidor WebSocket"
OBSWebSocket.ConnectInfo.CopyText="Copia"
OBSWebSocket.ConnectInfo.ServerIp="Adreça IP (més acurada)"
OBSWebSocket.ConnectInfo.ServerPort="Port"
OBSWebSocket.ConnectInfo.ServerPassword="Contrasenya"
OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText="[Autenticació inhabilitada]"
OBSWebSocket.ConnectInfo.QrTitle="QR de la connexió"
OBSWebSocket.TrayNotification.Identified.Title="Connexió nova de servidor Web (WebSocket)"
OBSWebSocket.TrayNotification.Identified.Title="Connexió nova de WebSocket"
OBSWebSocket.TrayNotification.Identified.Body="Client %1 identificat."
OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Ha fallat l'autenticació del servidor Web"
OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Ha fallat l'autenticació del servidor WebSocket"
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Ha fallat l'autenticació del client %1."
OBSWebSocket.TrayNotification.Disconnected.Title="Client desconnectat del servidor Web"
OBSWebSocket.TrayNotification.Disconnected.Title="Client desconnectat del servidor WebSocket"
OBSWebSocket.TrayNotification.Disconnected.Body="Client %1 desconnectat."
OBSWebSocket.Server.StartFailed.Title="Ha fallat el servidor Web (WebSocket)"
OBSWebSocket.Server.StartFailed.Message="El servidor Web ha fallat en iniciar. Potser el port TCP %1 ja està en ús per altre programa del sistema. Proveu un port diferent a la configuració del servidor Web (WebSocket), o atureu qualsevol altra aplicació que pugui utilitzar aquest port.\n Missatge d'error: %2"

View File

@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Chyba přihlášení k
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Klient %1 nebyl přihlášen"
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket klient se odpojil"
OBSWebSocket.TrayNotification.Disconnected.Body="Klient %1 se odpojil."
OBSWebSocket.Server.StartFailed.Title="Chyba WebSocket serveru"
OBSWebSocket.Server.StartFailed.Message="WebSocket server se nepodařilo spustit. TCP port %1 může být používán jinou aplikací. Zkuste nastavit jiný TCP port v nastavení WebSocket serveru nebo zavřete aplikaci, která může používat tento port.\n Chybová zpráva: %2"

View File

@ -38,5 +38,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="WebSocket godkendelses
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Klienten %1 kunne ikke godkendes."
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket-klient frakoblet"
OBSWebSocket.TrayNotification.Disconnected.Body="Klient %1 frakoblet."
OBSWebSocket.Server.StartFailed.Title="WebSocket-serverfejl"
OBSWebSocket.Server.StartFailed.Message="WebSocket-serveren started ikke. TCP-port %1 bruges måske allerede på dette system af et andet program. Prøv at angive en anden TCP-port i WebSocket-serverindstillingerne, eller stop ethvert program, der kan bruge denne port.\n Fejlmeddelelse: %2"

View File

@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="WebSocket-Authentifizi
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Client %1 konnte sich nicht authentifizieren."
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket-Client getrennt"
OBSWebSocket.TrayNotification.Disconnected.Body="Client %1 getrennt."
OBSWebSocket.Server.StartFailed.Title="WebSocket-Serverfehler"
OBSWebSocket.Server.StartFailed.Message="Der WebSocket-Server konnte nicht gestartet werden, da der TCP-Port %1 möglicherweise benutzt wird. Versuchen Sie, den Port in den WebSocket-Servereinstellungen zu ändern oder Anwendungen zu schließen, die diesen verwenden könnten.\nFehler: %2"

View File

@ -1,4 +1,5 @@
OBSWebSocket.Plugin.Description="Απομακρυσμένος έλεγχος του OBS Studio μέσω WebSocket"
OBSWebSocket.Settings.DialogTitle="Ρυθμίσεις Διακομιστή WebSocket"
OBSWebSocket.Settings.PluginSettingsTitle="Ρυθμίσεις Προσθέτων"
OBSWebSocket.Settings.ServerEnable="Ενεργοποίηση διακομιστή WebSocket"
OBSWebSocket.Settings.AlertsEnable="Ενεργοποίηση Ειδοποιήσεων στο System Tray"
@ -38,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Αποτυχία Τα
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Αποτυχία ταυτοποίησης του πελάτη %1."
OBSWebSocket.TrayNotification.Disconnected.Title="Αποσυνδέθηκε ο Πελάτης του WebSocket"
OBSWebSocket.TrayNotification.Disconnected.Body="Ο πελάτης %1 αποσυνδέθηκε."
OBSWebSocket.Server.StartFailed.Title="Αποτυχία Διακομιστή WebSocket"
OBSWebSocket.Server.StartFailed.Message="Ο διακομιστής WebSocket απέτυχε να ξεκινήσει. Η θύρα %1 TCP μπορεί ήδη να χρησιμοποιείται από μια άλλη εφαρμογή σε αυτό το σύστημα. Δοκιμάστε να ορίσετε μια διαφορετική θύρα TCP στις ρυθμίσεις διακομιστή WebSocket ή να σταματήσετε οποιαδήποτε εφαρμογή που θα μπορούσε να χρησιμοποιήσει αυτή τη θύρα.\n Μήνυμα σφάλματος: %2"

1
data/locale/en-GB.ini Normal file
View File

@ -0,0 +1 @@
#

View File

@ -45,6 +45,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="WebSocket Authenticati
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Client %1 failed to authenticate."
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket Client Disconnected"
OBSWebSocket.TrayNotification.Disconnected.Body="Client %1 disconnected."
OBSWebSocket.Server.StartFailed.Title="WebSocket Server Failure"
OBSWebSocket.Server.StartFailed.Message="The WebSocket server failed to start. TCP port %1 may already be in use elsewhere on this system by another application. Try setting a different TCP port in the WebSocket server settings, or stop any application that could be using this port.\n Error message: %2"

View File

@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Fallo de autenticació
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="El cliente %1 no se pudo autenticar."
OBSWebSocket.TrayNotification.Disconnected.Title="Cliente WebSocket desconectado"
OBSWebSocket.TrayNotification.Disconnected.Body="Cliente %1 desconectado."
OBSWebSocket.Server.StartFailed.Title="Fallo del servidor WebSocket"
OBSWebSocket.Server.StartFailed.Message="El servidor WebSocket no pudo iniciarse. El puerto TCP %1 puede que ya esté en uso en otro lugar de este sistema por otra aplicación. Intente configurar un puerto TCP diferente en la configuración del servidor WebSocket o detenga cualquier aplicación que pueda estar usando este puerto.\n Mensaje de error: %2"

View File

@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="WebSocket autentimise
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Kliendi %1 autentimine ebaõnnestus."
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket kliendi ühendus katkenud"
OBSWebSocket.TrayNotification.Disconnected.Body="Kliendi %1 ühendus katkenud."
OBSWebSocket.Server.StartFailed.Title="WebSocket serveri tõrge"
OBSWebSocket.Server.StartFailed.Message="WebSocket'i serveri käivitamine ebaõnnestus. TCP-port %1 võib olla juba mujal selles süsteemis mõne teise rakenduse poolt kasutusel. Proovige määrata WebSocket'i serveri seadetes teine TCP-port või peatada rakendus, mis võib seda porti kasutada.\n Veateade: %2"

View File

@ -38,5 +38,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="WebSocket Autentikazio
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="%1 bezeroak autentifikatzen huts egin du."
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket Bezeroa deskonektatu da"
OBSWebSocket.TrayNotification.Disconnected.Body="%1 bezeroa deskonektatu da."
OBSWebSocket.Server.StartFailed.Title="WebSocket Zerbitzari hutsegitea"
OBSWebSocket.Server.StartFailed.Message="WebSocket zerbitzaria ez da hasi. %1 TCP portua agian dagoeneko beste aplikazio batek erabiltzen ari du sistema honetan. Saiatu beste TCP portu bat konfiguratzen WebSocket zerbitzariaren konfigurazioan, edo portu hori erabiltzen ari den edozein aplikazio geldiarazi.\nErrore-mezua: %2"

View File

@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="خرابی تأیید
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="سرویس گیرنده %1 احراز هویت نشد."
OBSWebSocket.TrayNotification.Disconnected.Title="سرویس گیرنده سوکت وب قطع شد"
OBSWebSocket.TrayNotification.Disconnected.Body="سرویس گیرنده %1 قطع شد."
OBSWebSocket.Server.StartFailed.Title="خرابی سرور سوکت وب"
OBSWebSocket.Server.StartFailed.Message="سرور WebSocket راه‌اندازی نشد. درگاه TCP % 1 ممکن است قبلاً در جای دیگری در این سیستم توسط برنامه دیگری استفاده شده باشد. یک پورت TCP دیگر را در تنظیمات سرور WebSocket تنظیم کنید، یا هر برنامه‌ای را که می‌تواند از این پورت استفاده کند متوقف کنید.\n پیام خطا: %2"

View File

@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="WebSocket-tunnistusvir
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Asiakas %1 todennus epäonnistui."
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket-asiakas katkaisi yhteyden"
OBSWebSocket.TrayNotification.Disconnected.Body="Asiakas %1 on katkaistu."
OBSWebSocket.Server.StartFailed.Title="WebSocket-palvelinvirhe"
OBSWebSocket.Server.StartFailed.Message="WebSocket-palvelin ei käynnistynyt. TCP-portti %1 saattaa olla jo toisen sovelluksen käytössä. Yritä määrittää toinen TCP-portti WebSocket-palvelimen asetuksissa tai lopeta kaikki sovellukset, jotka saattavat käyttää tätä porttia.\nVirheilmoitus: %2"

View File

@ -35,5 +35,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Nabigo sa Pagpapatunay
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Nabigo ang kliyenteng %1 na patotohanan."
OBSWebSocket.TrayNotification.Disconnected.Title="Nadiskonekta ang WebSocket Client"
OBSWebSocket.TrayNotification.Disconnected.Body="Nadiskonekta ang kliyenteng %1."
OBSWebSocket.Server.StartFailed.Title="Nabigo ng WebSocket Server"
OBSWebSocket.Server.StartFailed.Message="Nabigong magsimula ang WebSocket server. Ang TCP port %1 ay maaaring ginagamit na sa ibang lugar sa system na ito ng isa pang application. Subukang magtakda ng ibang TCP port sa mga setting ng WebSocket server, o ihinto ang anumang application na maaaring gumagamit ng port na ito.\n Mensahe ng error: %2"

View File

@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Échec de l'authentifi
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Échec d'authentification du client %1."
OBSWebSocket.TrayNotification.Disconnected.Title="Client WebSocket déconnecté"
OBSWebSocket.TrayNotification.Disconnected.Body="Client %1 déconnecté."
OBSWebSocket.Server.StartFailed.Title="Échec du serveur WebSocket"
OBSWebSocket.Server.StartFailed.Message="Le serveur WebSocket n'a pas pu démarrer. Le port TCP %1 est peut être déjà utilisé par une autre application ailleurs sur ce système. Essayez de définir un port TCP différent dans les paramètres du serveur WebSocket, ou arrêtez toute application qui pourrait utiliser ce port.\n Message d'erreur : %2"

View File

@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="אימות WebSocket
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="לקוח %1 נכשל באימות"
OBSWebSocket.TrayNotification.Disconnected.Title="לקוח WebSocket התנתק"
OBSWebSocket.TrayNotification.Disconnected.Body="לקוח %1 התנתק."
OBSWebSocket.Server.StartFailed.Title="שגיאת שרת WebSocket"
OBSWebSocket.Server.StartFailed.Message="שרת ה-WebSocket נכשל בהפעלה. ייתכן שפורט TCP %1 כבר נמצא בשימוש במקום אחר במערכת זו על ידי יישום אחר. יש לנסות להגדיר פורט TCP אחר בהגדרות שרת WebSocket, או לעצור כל יישום שעשוי להשתמש בפורט זה.\nהודעת שגיאה: %2"

View File

@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="WebSocket सत्य
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="क्लाइंट %1प्रमाणित करने में विफल रहा."
OBSWebSocket.TrayNotification.Disconnected.Title="वेबसॉकेट क्लाइंट डिस्कनेक्ट हो गया"
OBSWebSocket.TrayNotification.Disconnected.Body="क्लाइंट %1 डिस्कनेक्ट हो गया."
OBSWebSocket.Server.StartFailed.Title="वेबसॉकेट सर्वर विफलता"
OBSWebSocket.Server.StartFailed.Message="WebSocket सर्वर प्रारंभ करने में विफल रहा. TCP पोर्ट %1 पहले से ही इस सिस्टम पर किसी अन्य एप्लिकेशन द्वारा कहीं और उपयोग में हो सकता है. वेबसॉकेट सर्वर सेटिंग्स में एक अलग TCP पोर्ट सेट करने का प्रयास करें, या इस पोर्ट का उपयोग करने वाले किसी भी एप्लिकेशन को रोकें.\n त्रुटि संदेश : %2"

View File

@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="WebSocket hitelesíté
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="A(z) %1 kliens hitelesítése sikertelen."
OBSWebSocket.TrayNotification.Disconnected.Title="A WebSocket-kliens bontotta a kapcsolatot"
OBSWebSocket.TrayNotification.Disconnected.Body="A(z) %1 kliens bontotta a kapcsolatot"
OBSWebSocket.Server.StartFailed.Title="WebSocket kiszolgálóhiba"
OBSWebSocket.Server.StartFailed.Message="A WebSocket-kiszolgáló nem tudott elindulni. A(z) %1 TCP-portot lehet, hogy már egy másik alkalmazás használja. Próbáljon eltérő TCP-portot beállítani a WebSocket-kiszolgáló beállítasaiban, vagy állítson le minden olyan alkalmazást, amely ezt a portot használhatja.\n Hibaüzenet: %2"

View File

@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="WebSocket վավերա
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="%1 հաճախորդը չհաջողվեց նույնականացնել:"
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket հաճախորդն անջատված է"
OBSWebSocket.TrayNotification.Disconnected.Body="%1 հաճախորդն անջատվել է:"
OBSWebSocket.Server.StartFailed.Title="WebSocket սերվերի սխալ"
OBSWebSocket.Server.StartFailed.Message="Չհաջողվեց գործարկել WebSockt սերվերը: Հնարավոր է, որ TCP %1 պորտն արդեն օգտագործվում է մեկ այլ հավելվածի կողմից: Փորձեք կարգավորել այլ TCP պորտ WebSocket սերվերի կարգավորումներում կամ դադարեցնել ցանկացած ծրագիր, որը կարող է օգտագործել այս պորտը:\n Սխալի հաղորդագրություն՝ %2։"

View File

@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Autentikasi WebSocket
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Klien %1 gagal mengautentikasi."
OBSWebSocket.TrayNotification.Disconnected.Title="Klien WebSocket Terputus"
OBSWebSocket.TrayNotification.Disconnected.Body="Klien %1 terputus."
OBSWebSocket.Server.StartFailed.Title="Server WebSocket Gagal"
OBSWebSocket.Server.StartFailed.Message="Server WebSocket gagal untuk memulai. Port TCP %1 mungkin sudah digunakan siapa pun pada sistem ini oleh aplikasi lain. Coba atur port TCP yang berbeda di pengaturan server WebSocket, atau hentikan aplikasi apapun yang bisa menggunakan port ini.\n Pesan galat: %2"

View File

@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Errore di autenticazio
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Il client %1 non è riuscito ad autenticarsi."
OBSWebSocket.TrayNotification.Disconnected.Title="Client WebSocket disconnesso"
OBSWebSocket.TrayNotification.Disconnected.Body="Client %1 disconnesso."
OBSWebSocket.Server.StartFailed.Title="Errore del server WebSocket"
OBSWebSocket.Server.StartFailed.Message="Impossibile avviare il server WebSocket.\nLa porta TCP %1 potrebbe essere già usata in questo sistema da un'altra applicazione.\nProva a impostare nelle impostazioni del server WebSocket una porta TCP diversa oppure interrompi qualsiasi applicazione che potrebbe usare questa porta.\nMessaggio di errore: %2."

View File

@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="WebSocket認証失敗"
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="クライアント %1 の認証に失敗しました。"
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocketクライアントが切断されました"
OBSWebSocket.TrayNotification.Disconnected.Body="クライアント %1 が切断されました。"
OBSWebSocket.Server.StartFailed.Title="WebSocketサーバー障害"
OBSWebSocket.Server.StartFailed.Message="WebSocketサーバーの起動に失敗しました。TCPポート %1 はこのシステム上の他の場所で別のアプリケーションによって既に使用されている可能性があります。 WebSocketサーバーの設定で別のTCPポートを設定するか、このポートを使用している可能性のあるアプリケーションを終了してください。\n エラーメッセージ: %2"

View File

@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="WebSocket-შესვ
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="კლიენტი %1 ვერ დამოწმდა."
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket-კლიენტი გამოითიშა"
OBSWebSocket.TrayNotification.Disconnected.Body="კლიენტი %1 გამოთიშეულია."
OBSWebSocket.Server.StartFailed.Title="WebSocket-სერვერის ხარვეზი"
OBSWebSocket.Server.StartFailed.Message="WebSocket-სერვერი ვერ ამუშავდა. TCP-პორტი %1 შეიძლება უკვე გამოიყენება სისტემაში სხვა პროგამის მიერ. მოსინჯეთ განსხვავებული TCP-პორტი WebSocket-სერვერის პარამეტრებში ან გათიშეთ ყველა პროგრამა, რომელიც ამ პორტს უნდა იყენებდეს.\n შეცდომის აღწერა: %2"

View File

@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Rastandina WebSocket t
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Rastandina rajegir %1 têk çû."
OBSWebSocket.TrayNotification.Disconnected.Title="Girêdana rajegira WebSocket qut bû"
OBSWebSocket.TrayNotification.Disconnected.Body="Girêdana rajegir %1 qut bû."
OBSWebSocket.Server.StartFailed.Title="Rajekara WebSocket têk çû"
OBSWebSocket.Server.StartFailed.Message="Destpêkirina rajekara WebSocket têk çû. Dibe ku dergeha TCP %1 jixwe ji hêla sepaneke din ve li cîhek din li ser vê pergalê were bikaranîn. Kontrol bike ku di sazkariyên rajekara WebSocket de dergehek TCP a cuda saz bikî, an jî sepanek ku dikare vê dergehê bi kar bîne rawestîne.\n Peyama çewtiyê: %2"

View File

@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="WebSocket 인증 실
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="클라이언트 %1 인증 실패."
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket 클라이언트 연결 해제됨"
OBSWebSocket.TrayNotification.Disconnected.Body="클라이언트 %1 연결 해제됨."
OBSWebSocket.Server.StartFailed.Title="WebSocket 서버 기동 실패"
OBSWebSocket.Server.StartFailed.Message="WebSocket 서버를 시작하는 데 실패했습니다. %1 TCP 포트가 타 응용 프로그램에 의해 이 시스템에서 이미 사용 중일 수 있습니다. WebSocket 서버 설정에서 다른 TCP 포트로 변경하거나 이 포트를 사용하는 응용 프로그램을 종료하십시오.\n 오류 메시지: %2"

View File

@ -38,5 +38,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Kegagalan Pengesahihan
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Klien %1 gagal disahihkan."
OBSWebSocket.TrayNotification.Disconnected.Title="Klien WebSocket Terputus"
OBSWebSocket.TrayNotification.Disconnected.Body="Klien %1 terputus."
OBSWebSocket.Server.StartFailed.Title="Kegagalan Pelayan WebSocket"
OBSWebSocket.Server.StartFailed.Message="Pelayan WebSocket gagal dimulakan. Port TCP %1 mungkin telah digunakan di tempat lain dalam sistem ini oleh aplikasi lain. Cuba tetapkan port TCP lain dalam tetapan pelayan WebSocket, atau hentikan mana-mana aplikasi yang guna port tersebut.\n Mesej ralat: %2"

2
data/locale/nb-NO.ini Normal file
View File

@ -0,0 +1,2 @@
OBSWebSocket.Settings.Password="Server Passord"
OBSWebSocket.Settings.GeneratePassword="Generer Passord"

View File

@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="WebSocket Authenticati
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Authenticatie van client %1 mislukt."
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket Client losgekoppeld"
OBSWebSocket.TrayNotification.Disconnected.Body="Client %1 ontkoppeld."
OBSWebSocket.Server.StartFailed.Title="WebSocket Server fout"
OBSWebSocket.Server.StartFailed.Message="De WebSocket server kon niet worden gestart. TCP-poort %1 is mogelijk al in gebruik op dit systeem door een andere toepassing. Probeer een andere TCP-poort in te stellen in de WebSocket server-instellingen, of stop elke toepassing die deze poort zou kunnen gebruiken.\n Foutmelding: %2"

View File

@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Błąd uwierzytelniani
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Klient %1 nie został uwierzytelniony."
OBSWebSocket.TrayNotification.Disconnected.Title="Klient WebSocket odłączony"
OBSWebSocket.TrayNotification.Disconnected.Body="Klient %1 odłączony."
OBSWebSocket.Server.StartFailed.Title="Błąd serwera WebSocket"
OBSWebSocket.Server.StartFailed.Message="Nie udało się uruchomić serwera WebSocket. Port TCP %1 może być już używany w innym miejscu tego systemu przez inną aplikację. Spróbuj ustawić inny port TCP w ustawieniach serwera WebSocket lub zatrzymaj aplikację, która może korzystać z tego portu.\n Komunikat błędu: %2"

View File

@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Falha na Autenticaçã
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Cliente %1 falhou na autenticação."
OBSWebSocket.TrayNotification.Disconnected.Title="Cliente WebSocket Desconectado"
OBSWebSocket.TrayNotification.Disconnected.Body="Cliente %1 desconectado."
OBSWebSocket.Server.StartFailed.Title="Falha no Servidor WebSocket"
OBSWebSocket.Server.StartFailed.Message="O servidor de WebSocket falhou ao iniciar. A porta TCP %1 já pode estar em uso em outro lugar neste sistema por outro aplicativo. Tente definir uma porta TCP diferente nas configurações do servidor de WebSocket, ou pare qualquer aplicativo que possa estar usando essa porta.\n Mensagem de erro: %2"

View File

@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Falha na autenticaçã
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Cliente %1 falhou na autenticação."
OBSWebSocket.TrayNotification.Disconnected.Title="Cliente WebSocket desligado"
OBSWebSocket.TrayNotification.Disconnected.Body="Cliente %1 desligado."
OBSWebSocket.Server.StartFailed.Title="Falha no servidor WebSocket"
OBSWebSocket.Server.StartFailed.Message="O servidor de WebSocket falhou ao iniciar. A porta TCP %1 pode já estar em uso noutro local deste sistema por outra aplicação. Tente definir uma porta TCP diferente nas configurações do servidor de WebSocket, ou pare qualquer aplicação que possa estar a usar essa porta.\n Mensagem de erro: %2"

View File

@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Eroare de autentificar
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Client %1 nu a reușit să se autentifice."
OBSWebSocket.TrayNotification.Disconnected.Title="Client WebSocket deconectat"
OBSWebSocket.TrayNotification.Disconnected.Body="Clientul %1 s-a deconectat."
OBSWebSocket.Server.StartFailed.Title="Eroare de server WebSocket"
OBSWebSocket.Server.StartFailed.Message="Serverul WebSocket nu a reușit să pornească. Este posibil ca portul TCP %1 să fie deja utilizat în altă parte pe acest sistem de o altă aplicație. Încearcă să setezi un alt port TCP în setările serverului WebSocket sau oprește orice aplicație care ar putea utiliza acest port.\n Mesaj de eroare: %2"

View File

@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Ошибка ауте
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Клиент %1 не смог аутентифицироваться."
OBSWebSocket.TrayNotification.Disconnected.Title="Клиент WebSocket отключился"
OBSWebSocket.TrayNotification.Disconnected.Body="Клиент %1 отключился."
OBSWebSocket.Server.StartFailed.Title="Ошибка сервера WebSocket"
OBSWebSocket.Server.StartFailed.Message="Не удалось запустить сервер WebSockt. Возможно, порт TCP %1 уже используется другим приложением. Попробуйте установить другой TCP-порт в настройках сервера WebSocket или остановите любое приложение, которое может использовать этот порт.\n Сообщение ошибки: %2"

View File

@ -1,4 +1,5 @@
OBSWebSocket.Settings.PluginSettingsTitle="පේනුවේ සැකසුම්"
OBSWebSocket.Settings.DebugEnable="නිදොස්කරණ සටහන් තැබීම සබල කරන්න"
OBSWebSocket.Settings.ServerSettingsTitle="සේවාදායකයේ සැකසුම්"
OBSWebSocket.Settings.AuthRequired="සත්‍යාපනය සබල කරන්න"
OBSWebSocket.Settings.Password="සේවාදායකයේ මුරපදය"
@ -11,6 +12,7 @@ OBSWebSocket.SessionTable.SessionDurationColumnTitle="වාරයේ පරා
OBSWebSocket.SessionTable.MessagesInOutColumnTitle="පණිවිඩ එන/යන"
OBSWebSocket.SessionTable.IdentifiedTitle="හඳුනා ගැනිණි"
OBSWebSocket.ConnectInfo.CopyText="පිටපතක්"
OBSWebSocket.ConnectInfo.ServerIp="සේවාදායකයේ අ.ජා.කෙ. (අනුමානය)"
OBSWebSocket.ConnectInfo.ServerPort="සේවාදායකයේ තොට"
OBSWebSocket.ConnectInfo.ServerPassword="සේවාදායකයේ මුරපදය"
OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText="[සත්‍යාපනය අබලයි]"

View File

@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Zlyhanie WebSocket aut
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Klientovi %1 sa nepodarilo autentifikovať."
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket klient odpojený"
OBSWebSocket.TrayNotification.Disconnected.Body="Klient %1 odpojený."
OBSWebSocket.Server.StartFailed.Title="Zlyhanie WebSocket servera"
OBSWebSocket.Server.StartFailed.Message="WebSocket server zlyhal pri spustení. TCP port %1 sa môže používať na inom mieste, na tomto systéme, inou aplikáciou. Skúste nastaviť iný TCP port v nastaveniach WebSocket servera, alebo zastavte iné aplikácie, ktoré by mohli používať tento port.\n Chybová správa: %2"

View File

@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Spodletelo ovetjanje W
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Odjemalec %1 ni prestal overjanja."
OBSWebSocket.TrayNotification.Disconnected.Title="Odjemalec WebSocket je prekinil povezavo"
OBSWebSocket.TrayNotification.Disconnected.Body="Odjemalec %1 ni več povezan."
OBSWebSocket.Server.StartFailed.Title="Odpoved strežnika WebSocket"
OBSWebSocket.Server.StartFailed.Message="Strežnik WebSocket se ni uspel zagnati. Vrata TCP %1 morda že uporablja drug program na tem sistemu. Poskusite določiti druga vrata TCP v nastavitvah strežnika WebSocket ali pa ustaviti program, ki bi lahko uporabljal želena vrata.\nSporočilo o napaki: %2"

View File

@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Autentisering av WebSo
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Klient %1 misslyckades att autentiseras."
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket-klient frånkopplades"
OBSWebSocket.TrayNotification.Disconnected.Body="Klient %1 frånkopplades."
OBSWebSocket.Server.StartFailed.Title="WebSocket-serverfel"
OBSWebSocket.Server.StartFailed.Message="WebSocket-servern kunde inte startaw. TCP-porten %1 kanske redan används någon annanstans på detta system av ett annat program. Prova att ange en annan TCP-port i WebSocket-serverinställningarna eller stoppa alla program som kan använda denna port.\n Felmeddelande: %2"

View File

@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="WebSocket Kimlik Doğr
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="%1 istemcisinin kimlik doğrulaması başarısız oldu."
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket İstemcisinin Bağlantısı Kesildi"
OBSWebSocket.TrayNotification.Disconnected.Body="%1 istemcisinin bağlantısı kesildi."
OBSWebSocket.Server.StartFailed.Title="WebSocket Sunucu Hatası"
OBSWebSocket.Server.StartFailed.Message="WebSocket sunucusu başlatılamadı. %1 TCP kapısı bu sistemde başka bir yerde başka bir uygulama tarafından zaten kullanılıyor olabilir. WebSocket sunucu ayarlarında farklı bir TCP kapısı ayarlamayı deneyin, veya bu kapıyı kullanıyor olabilecek herhangi bir uygulamayı durdurun.\n Hata mesajı: %2"

View File

@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Помилка авт
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Клієнт %1 не зміг автентифікуватися."
OBSWebSocket.TrayNotification.Disconnected.Title="Клієнт WebSocket від'єднаний"
OBSWebSocket.TrayNotification.Disconnected.Body="Клієнт %1 від'єднаний."
OBSWebSocket.Server.StartFailed.Title="Помилка сервера WebSocket"
OBSWebSocket.Server.StartFailed.Message="Не вдалося запустити сервер WebSocket. Порт TCP %1 може вже використовуватися в іншому місці цим системним інтерфейсом. Спробуйте встановити інший TCP порт в налаштуваннях WebSocket сервера або зупинити будь-які застосунки, які можуть використовувати цей порт.\n Повідомлення про помилку: %2"

View File

@ -1,13 +1,37 @@
OBSWebSocket.Plugin.Description="Điều khiển từ xa OBS Studio thông qua WebSocket"
OBSWebSocket.Settings.DialogTitle="Cài đặt máy chủ WebSocket"
OBSWebSocket.Settings.PluginSettingsTitle="Thiết đặt trình cắm"
OBSWebSocket.Settings.ServerEnable="Bật máy chủ WebSocket"
OBSWebSocket.Settings.AlertsEnable="Bật cảnh báo khay hệ thống"
OBSWebSocket.Settings.DebugEnable="Bật ghi nhật ký gỡ lỗi"
OBSWebSocket.Settings.DebugEnableHoverText="Cho phép ghi nhật ký gỡ lỗi cho phiên bản OBS hiện tại. Không tồn tại khi tải.\nUde --websocket gỡ lỗi để bật khi tải."
OBSWebSocket.Settings.ServerSettingsTitle="Thiết đặt máy chủ"
OBSWebSocket.Settings.AuthRequired="Bật xác thực"
OBSWebSocket.Settings.Password="Mật khẩu máy chủ"
OBSWebSocket.Settings.GeneratePassword="Tạo mật khẩu"
OBSWebSocket.Settings.ServerPort="Cổng máy chủ"
OBSWebSocket.Settings.ShowConnectInfo="Hiện thông tin kết nối"
OBSWebSocket.Settings.ShowConnectInfoWarningTitle="Cảnh báo: Hiện đang chạy"
OBSWebSocket.Settings.ShowConnectInfoWarningMessage="Có vẻ như một đầu ra (luồng, bản ghi, v.v.) hiện đang hoạt động."
OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="Bạn có chắc chắn muốn hiển thị thông tin kết nối của mình không?"
OBSWebSocket.Settings.Save.UserPasswordWarningTitle="Cảnh báo: Vấn đề bảo mật tiềm ẩn"
OBSWebSocket.Settings.Save.UserPasswordWarningMessage="obs-websocket lưu trữ mật khẩu máy chủ dưới dạng văn bản thuần túy. Bạn nên sử dụng mật khẩu được tạo bởi obs-websocket."
OBSWebSocket.Settings.Save.UserPasswordWarningInfoText="Bạn có chắc bạn muốn sử dụng mật khẩu của mình?"
OBSWebSocket.Settings.Save.PasswordInvalidErrorTitle="Lỗi: Thiết lập không hợp lệ"
OBSWebSocket.Settings.Save.PasswordInvalidErrorMessage="Bạn phải sử dụng mật khẩu có 6 ký tự trở lên."
OBSWebSocket.SessionTable.Title="Các phiên WebSocket được kết nối"
OBSWebSocket.SessionTable.RemoteAddressColumnTitle="Địa chỉ từ xa"
OBSWebSocket.SessionTable.SessionDurationColumnTitle="Thời lượng phiên"
OBSWebSocket.SessionTable.MessagesInOutColumnTitle="Tin nhắn vào/ra"
OBSWebSocket.SessionTable.IdentifiedTitle="Định dạng"
OBSWebSocket.ConnectInfo.DialogTitle="Thông tin kết nối WebSocket"
OBSWebSocket.ConnectInfo.ServerIp="IP Máy chủ (Gợi ý tốt nhất)"
OBSWebSocket.ConnectInfo.ServerPort="Cổng máy chủ"
OBSWebSocket.ConnectInfo.ServerPassword="Mật khẩu máy chủ"
OBSWebSocket.ConnectInfo.QrTitle="Kết nối bằng mã QR"
OBSWebSocket.TrayNotification.Identified.Title="Tạo cổng kết nối WebSocket mới"
OBSWebSocket.TrayNotification.Identified.Body="Máy khách %1 được xác định."
OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Lỗi xác thực WebSocket"
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Máy khách %1 không xác thực được."
OBSWebSocket.TrayNotification.Disconnected.Title="Máy khách WebSocket bị ngắt kết nối"
OBSWebSocket.TrayNotification.Disconnected.Body="Máy khách %1 bị ngắt kết nối."

View File

@ -6,23 +6,23 @@ OBSWebSocket.Settings.AlertsEnable="开启系统托盘提醒"
OBSWebSocket.Settings.DebugEnable="开启调试日志"
OBSWebSocket.Settings.DebugEnableHoverText="开启当前 OBS 实例的调试日志。下次启动时需重新设置。\n使用 --websocket_debug 在启动 OBS 时开启日志。"
OBSWebSocket.Settings.ServerSettingsTitle="服务器设置"
OBSWebSocket.Settings.AuthRequired="开启鉴权"
OBSWebSocket.Settings.AuthRequired="开启身份认证"
OBSWebSocket.Settings.Password="服务器密码"
OBSWebSocket.Settings.GeneratePassword="生成密码"
OBSWebSocket.Settings.ServerPort="服务器端口"
OBSWebSocket.Settings.ShowConnectInfo="显示连接信息"
OBSWebSocket.Settings.ShowConnectInfoWarningTitle="警告:正在直播"
OBSWebSocket.Settings.ShowConnectInfoWarningMessage="似乎正在输出(串流、录像等)。"
OBSWebSocket.Settings.ShowConnectInfoWarningMessage="似乎输出(串流、录像等)正在进行。"
OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="您确定要显示您的连接信息吗?"
OBSWebSocket.Settings.Save.UserPasswordWarningTitle="警告:潜在安全问题"
OBSWebSocket.Settings.Save.UserPasswordWarningMessage="obs-websocket 会以明文形式储存服务器密码。强烈建议使用 obs-websocket 生成的密码。"
OBSWebSocket.Settings.Save.UserPasswordWarningInfoText="您确定要使用自定义密码吗?"
OBSWebSocket.Settings.Save.PasswordInvalidErrorTitle="错误:配置无效"
OBSWebSocket.Settings.Save.PasswordInvalidErrorTitle="错误:无效的配置"
OBSWebSocket.Settings.Save.PasswordInvalidErrorMessage="您的密码必须包含 6 个或以上的字符。"
OBSWebSocket.SessionTable.Title="已连接的 WebSocket 会话"
OBSWebSocket.SessionTable.RemoteAddressColumnTitle="远程地址"
OBSWebSocket.SessionTable.SessionDurationColumnTitle="会话持续时间"
OBSWebSocket.SessionTable.MessagesInOutColumnTitle="消息传入/出"
OBSWebSocket.SessionTable.MessagesInOutColumnTitle="消息传入/出"
OBSWebSocket.SessionTable.IdentifiedTitle="已识别"
OBSWebSocket.SessionTable.KickButtonColumnTitle="踢出?"
OBSWebSocket.SessionTable.KickButtonText="踢出"
@ -31,13 +31,11 @@ OBSWebSocket.ConnectInfo.CopyText="复制"
OBSWebSocket.ConnectInfo.ServerIp="服务器 IP最佳猜测"
OBSWebSocket.ConnectInfo.ServerPort="服务器端口"
OBSWebSocket.ConnectInfo.ServerPassword="服务器密码"
OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText="[鉴权已停用]"
OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText="[身份认证已停用]"
OBSWebSocket.ConnectInfo.QrTitle="连接 QR 码"
OBSWebSocket.TrayNotification.Identified.Title="新 WebSocket 连接"
OBSWebSocket.TrayNotification.Identified.Body="已识别 %1 客户端。"
OBSWebSocket.TrayNotification.AuthenticationFailed.Title="WebSocket 鉴权失败"
OBSWebSocket.TrayNotification.Identified.Body="客户端%1已识别 。"
OBSWebSocket.TrayNotification.AuthenticationFailed.Title="WebSocket 认证失败"
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="%1 客户端认证失败。"
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket 客户端已断开"
OBSWebSocket.TrayNotification.Disconnected.Body="%1 客户端已断开。"
OBSWebSocket.Server.StartFailed.Title="WebSocket 服务器启动失败"
OBSWebSocket.Server.StartFailed.Message="WebSocket 服务器启动失败。TCP 端口 %1 可能已被其它程序占用。请尝试在 WebSocket 服务器设置中更改不同的 TCP 端口号,或者结束其它任何可能占用此端口的程序。\n错误信息%2"

View File

@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="WebSocket 認證失敗
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="%1 用戶端無法進行認證。"
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket 用戶端已斷線"
OBSWebSocket.TrayNotification.Disconnected.Body="%1 用戶端已斷線。"
OBSWebSocket.Server.StartFailed.Title="WebSocket 伺服器錯誤"
OBSWebSocket.Server.StartFailed.Message="無法啟動 WebSocket 伺服器。可能 TCP 連線埠 %1 已經被系統中的某個應用程式佔用。請嘗試在 WebSocket 伺服器設定更改不同的 TCP 連線埠,或停止任何可能正在使用這個連線埠的應用程式。\n錯誤訊息%2"

1
deps/qr vendored

Submodule deps/qr deleted from 8518684c0f

View File

@ -1,5 +1,7 @@
# obs-websocket documentation
## If you're looking for the documentation page, it's [here](generated/protocol.md)
This is the documentation for obs-websocket. Run `build_docs.sh` to auto generate the latest docs from the `src` directory. There are 3 components to the docs generation:
- `comments/comments.js`: Generates the `work/comments.json` file from the code comments in the src directory.

View File

@ -237,6 +237,14 @@
"initialVersion": "5.0.0",
"enumValue": 206
},
{
"description": "The server is not ready to handle the request.\n\nNote: This usually occurs during OBS scene collection change or exit. Requests may be tried again after a delay if this code is given.",
"enumIdentifier": "NotReady",
"rpcVersion": "1",
"deprecated": false,
"initialVersion": "5.3.0",
"enumValue": 207
},
{
"description": "A required request field is missing.",
"enumIdentifier": "MissingRequestField",
@ -1217,7 +1225,7 @@
{
"description": "Gets the current directory that the record output is set to.",
"requestType": "GetRecordDirectory",
"complexity": 1,
"complexity": 2,
"rpcVersion": "1",
"deprecated": false,
"initialVersion": "5.0.0",
@ -1231,6 +1239,26 @@
}
]
},
{
"description": "Sets the current directory that the record output writes files to.",
"requestType": "SetRecordDirectory",
"complexity": 2,
"rpcVersion": "1",
"deprecated": false,
"initialVersion": "5.3.0",
"category": "config",
"requestFields": [
{
"valueName": "recordDirectory",
"valueType": "String",
"valueDescription": "Output directory",
"valueRestrictions": null,
"valueOptional": false,
"valueOptionalBehavior": null
}
],
"responseFields": []
},
{
"description": "Gets an array of all of a source's filters.",
"requestType": "GetSourceFilterList",
@ -3926,7 +3954,7 @@
]
},
{
"description": "Gets the scene transition overridden for a scene.",
"description": "Sets the scene transition overridden for a scene.",
"requestType": "SetSceneSceneTransitionOverride",
"complexity": 2,
"rpcVersion": "1",

View File

@ -471,6 +471,7 @@ These are enumeration declarations, which are referenced throughout obs-websocke
- [RequestStatus::UnknownRequestType](#requeststatusunknownrequesttype)
- [RequestStatus::GenericError](#requeststatusgenericerror)
- [RequestStatus::UnsupportedRequestBatchExecutionType](#requeststatusunsupportedrequestbatchexecutiontype)
- [RequestStatus::NotReady](#requeststatusnotready)
- [RequestStatus::MissingRequestField](#requeststatusmissingrequestfield)
- [RequestStatus::MissingRequestData](#requeststatusmissingrequestdata)
- [RequestStatus::InvalidRequestField](#requeststatusinvalidrequestfield)
@ -879,6 +880,18 @@ The request batch execution type is not supported.
---
### RequestStatus::NotReady
The server is not ready to handle the request.
Note: This usually occurs during OBS scene collection change or exit. Requests may be tried again after a delay if this code is given.
- Identifier Value: `207`
- Latest Supported RPC Version: `1`
- Added in v5.3.0
---
### RequestStatus::MissingRequestField
A required request field is missing.
@ -2530,6 +2543,7 @@ communication is desired.
- [GetStreamServiceSettings](#getstreamservicesettings)
- [SetStreamServiceSettings](#setstreamservicesettings)
- [GetRecordDirectory](#getrecorddirectory)
- [SetRecordDirectory](#setrecorddirectory)
- [Sources Requests](#sources-requests)
- [GetSourceActive](#getsourceactive)
- [GetSourceScreenshot](#getsourcescreenshot)
@ -3107,7 +3121,7 @@ Note: Simple RTMP settings can be set with type `rtmp_custom` and the settings f
Gets the current directory that the record output is set to.
- Complexity Rating: `1/5`
- Complexity Rating: `2/5`
- Latest Supported RPC Version: `1`
- Added in v5.0.0
@ -3117,6 +3131,22 @@ Gets the current directory that the record output is set to.
| ---- | :---: | ----------- |
| recordDirectory | String | Output directory |
---
### SetRecordDirectory
Sets the current directory that the record output writes files to.
- Complexity Rating: `2/5`
- Latest Supported RPC Version: `1`
- Added in v5.3.0
**Request Fields:**
| Name | Type | Description | Value Restrictions | ?Default Behavior |
| ---- | :---: | ----------- | :----------------: | ----------------- |
| recordDirectory | String | Output directory | None | N/A |
## Sources Requests
### GetSourceActive
@ -3385,7 +3415,7 @@ Gets the scene transition overridden for a scene.
### SetSceneSceneTransitionOverride
Gets the scene transition overridden for a scene.
Sets the scene transition overridden for a scene.
- Complexity Rating: `2/5`
- Latest Supported RPC Version: `1`

View File

@ -38,16 +38,6 @@ with this program. If not, see <https://www.gnu.org/licenses/>
#define CMDLINE_WEBSOCKET_DEBUG "websocket_debug"
Config::Config()
: PortOverridden(false),
PasswordOverridden(false),
FirstLoad(true),
ServerEnabled(false),
ServerPort(4455),
Ipv4Only(false),
DebugEnabled(false),
AlertsEnabled(false),
AuthRequired(true),
ServerPassword("")
{
SetDefaultsToGlobalStore();
}

View File

@ -30,17 +30,17 @@ struct Config {
void Load();
void Save();
void SetDefaultsToGlobalStore();
config_t *GetConfigStore();
static config_t *GetConfigStore();
std::atomic<bool> PortOverridden;
std::atomic<bool> PasswordOverridden;
std::atomic<bool> PortOverridden = false;
std::atomic<bool> PasswordOverridden = false;
std::atomic<bool> FirstLoad;
std::atomic<bool> ServerEnabled;
std::atomic<uint16_t> ServerPort;
std::atomic<bool> Ipv4Only;
std::atomic<bool> DebugEnabled;
std::atomic<bool> AlertsEnabled;
std::atomic<bool> AuthRequired;
std::atomic<bool> FirstLoad = true;
std::atomic<bool> ServerEnabled = false;
std::atomic<uint16_t> ServerPort = 4455;
std::atomic<bool> Ipv4Only = false;
std::atomic<bool> DebugEnabled = false;
std::atomic<bool> AlertsEnabled = false;
std::atomic<bool> AuthRequired = true;
QString ServerPassword;
};

View File

@ -1,3 +1,21 @@
/*
obs-websocket
Copyright (C) 2020-2023 Kyle Manning <tt2468@gmail.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program. If not, see <https://www.gnu.org/licenses/>
*/
#include "WebSocketApi.h"
#include "requesthandler/RequestHandler.h"
#include "obs-websocket.h"

View File

@ -1,3 +1,21 @@
/*
obs-websocket
Copyright (C) 2020-2023 Kyle Manning <tt2468@gmail.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program. If not, see <https://www.gnu.org/licenses/>
*/
#pragma once
#include <functional>

View File

@ -20,11 +20,6 @@ with this program. If not, see <https://www.gnu.org/licenses/>
#include "EventHandler.h"
EventHandler::EventHandler()
: _obsLoaded(false),
_inputVolumeMetersRef(0),
_inputActiveStateChangedRef(0),
_inputShowStateChangedRef(0),
_sceneItemTransformChangedRef(0)
{
blog_debug("[EventHandler::EventHandler] Setting up...");
@ -67,9 +62,9 @@ void EventHandler::SetBroadcastCallback(EventHandler::BroadcastCallback cb)
_broadcastCallback = cb;
}
void EventHandler::SetObsLoadedCallback(EventHandler::ObsLoadedCallback cb)
void EventHandler::SetObsReadyCallback(EventHandler::ObsReadyCallback cb)
{
_obsLoadedCallback = cb;
_obsReadyCallback = cb;
}
// Function to increment refcounts for high volume event subscriptions
@ -261,15 +256,12 @@ void EventHandler::OnFrontendEvent(enum obs_frontend_event event, void *private_
{
auto eventHandler = static_cast<EventHandler *>(private_data);
if (!eventHandler->_obsLoaded.load() && event != OBS_FRONTEND_EVENT_FINISHED_LOADING)
return;
switch (event) {
// General
case OBS_FRONTEND_EVENT_FINISHED_LOADING:
eventHandler->FrontendFinishedLoadingMultiHandler();
break;
case OBS_FRONTEND_EVENT_EXIT:
case OBS_FRONTEND_EVENT_SCRIPTING_SHUTDOWN:
eventHandler->FrontendExitMultiHandler();
break;
@ -283,7 +275,11 @@ void EventHandler::OnFrontendEvent(enum obs_frontend_event event, void *private_
}
obs_frontend_source_list_free(&transitions);
}
// Before ready update to allow event to broadcast
eventHandler->HandleCurrentSceneCollectionChanging();
eventHandler->_obsReady = false;
if (eventHandler->_obsReadyCallback)
eventHandler->_obsReadyCallback(false);
break;
case OBS_FRONTEND_EVENT_SCENE_COLLECTION_CHANGED: {
obs_frontend_source_list transitions = {};
@ -294,6 +290,9 @@ void EventHandler::OnFrontendEvent(enum obs_frontend_event event, void *private_
}
obs_frontend_source_list_free(&transitions);
}
eventHandler->_obsReady = true;
if (eventHandler->_obsReadyCallback)
eventHandler->_obsReadyCallback(true);
eventHandler->HandleCurrentSceneCollectionChanged();
break;
case OBS_FRONTEND_EVENT_SCENE_COLLECTION_LIST_CHANGED:
@ -430,30 +429,6 @@ void EventHandler::FrontendFinishedLoadingMultiHandler()
blog_debug(
"[EventHandler::FrontendFinishedLoadingMultiHandler] OBS has finished loading. Connecting final handlers and enabling events...");
// Connect source signals and enable events only after OBS has fully loaded (to reduce extra logging).
_obsLoaded.store(true);
// In the case that plugins become hotloadable, this will have to go back into `EventHandler::EventHandler()`
// Enumerate inputs and connect each one
{
auto enumInputs = [](void *param, obs_source_t *source) {
auto eventHandler = static_cast<EventHandler *>(param);
eventHandler->ConnectSourceSignals(source);
return true;
};
obs_enum_sources(enumInputs, this);
}
// Enumerate scenes and connect each one
{
auto enumScenes = [](void *param, obs_source_t *source) {
auto eventHandler = static_cast<EventHandler *>(param);
eventHandler->ConnectSourceSignals(source);
return true;
};
obs_enum_scenes(enumScenes, this);
}
// Enumerate all scene transitions and connect each one
{
obs_frontend_source_list transitions = {};
@ -465,41 +440,23 @@ void EventHandler::FrontendFinishedLoadingMultiHandler()
obs_frontend_source_list_free(&transitions);
}
blog_debug("[EventHandler::FrontendFinishedLoadingMultiHandler] Finished.");
_obsReady = true;
if (_obsReadyCallback)
_obsReadyCallback(true);
if (_obsLoadedCallback)
_obsLoadedCallback();
blog_debug("[EventHandler::FrontendFinishedLoadingMultiHandler] Finished.");
}
void EventHandler::FrontendExitMultiHandler()
{
HandleExitStarted();
blog_debug("[EventHandler::FrontendExitMultiHandler] OBS is unloading. Disabling events...");
HandleExitStarted();
// Disconnect source signals and disable events when OBS starts unloading (to reduce extra logging).
_obsLoaded.store(false);
// In the case that plugins become hotloadable, this will have to go back into `EventHandler::~EventHandler()`
// Enumerate inputs and disconnect each one
{
auto enumInputs = [](void *param, obs_source_t *source) {
auto eventHandler = static_cast<EventHandler *>(param);
eventHandler->DisconnectSourceSignals(source);
return true;
};
obs_enum_sources(enumInputs, this);
}
// Enumerate scenes and disconnect each one
{
auto enumScenes = [](void *param, obs_source_t *source) {
auto eventHandler = static_cast<EventHandler *>(param);
eventHandler->DisconnectSourceSignals(source);
return true;
};
obs_enum_scenes(enumScenes, this);
}
_obsReady = false;
if (_obsReadyCallback)
_obsReadyCallback(false);
// Enumerate all scene transitions and disconnect each one
{
@ -520,10 +477,6 @@ void EventHandler::SourceCreatedMultiHandler(void *param, calldata_t *data)
{
auto eventHandler = static_cast<EventHandler *>(param);
// Don't react to signals until OBS has finished loading
if (!eventHandler->_obsLoaded.load())
return;
obs_source_t *source = GetCalldataPointer<obs_source_t>(data, "source");
if (!source)
return;
@ -556,10 +509,6 @@ void EventHandler::SourceDestroyedMultiHandler(void *param, calldata_t *data)
// Disconnect all signals from the source
eventHandler->DisconnectSourceSignals(source);
// Don't react to signals if OBS is unloading
if (!eventHandler->_obsLoaded.load())
return;
switch (obs_source_get_type(source)) {
case OBS_SOURCE_TYPE_INPUT:
// Only emit removed if the input has not already been removed. This is the case when removing the last scene item of an input.
@ -582,9 +531,6 @@ void EventHandler::SourceRemovedMultiHandler(void *param, calldata_t *data)
{
auto eventHandler = static_cast<EventHandler *>(param);
if (!eventHandler->_obsLoaded.load())
return;
obs_source_t *source = GetCalldataPointer<obs_source_t>(data, "source");
if (!source)
return;
@ -605,9 +551,6 @@ void EventHandler::SourceRenamedMultiHandler(void *param, calldata_t *data)
{
auto eventHandler = static_cast<EventHandler *>(param);
if (!eventHandler->_obsLoaded.load())
return;
obs_source_t *source = GetCalldataPointer<obs_source_t>(data, "source");
if (!source)
return;

View File

@ -34,25 +34,26 @@ public:
EventHandler();
~EventHandler();
typedef std::function<void(uint64_t, std::string, json, uint8_t)> BroadcastCallback;
typedef std::function<void(uint64_t, std::string, json, uint8_t)>
BroadcastCallback; // uint64_t requiredIntent, std::string eventType, json eventData, uint8_t rpcVersion
void SetBroadcastCallback(BroadcastCallback cb);
typedef std::function<void()> ObsLoadedCallback;
void SetObsLoadedCallback(ObsLoadedCallback cb);
typedef std::function<void(bool)> ObsReadyCallback; // bool ready
void SetObsReadyCallback(ObsReadyCallback cb);
void ProcessSubscription(uint64_t eventSubscriptions);
void ProcessUnsubscription(uint64_t eventSubscriptions);
private:
BroadcastCallback _broadcastCallback;
ObsLoadedCallback _obsLoadedCallback;
ObsReadyCallback _obsReadyCallback;
std::atomic<bool> _obsLoaded;
std::atomic<bool> _obsReady = false;
std::unique_ptr<Utils::Obs::VolumeMeter::Handler> _inputVolumeMetersHandler;
std::atomic<uint64_t> _inputVolumeMetersRef;
std::atomic<uint64_t> _inputActiveStateChangedRef;
std::atomic<uint64_t> _inputShowStateChangedRef;
std::atomic<uint64_t> _sceneItemTransformChangedRef;
std::atomic<uint64_t> _inputVolumeMetersRef = 0;
std::atomic<uint64_t> _inputActiveStateChangedRef = 0;
std::atomic<uint64_t> _inputShowStateChangedRef = 0;
std::atomic<uint64_t> _sceneItemTransformChangedRef = 0;
void ConnectSourceSignals(obs_source_t *source);
void DisconnectSourceSignals(obs_source_t *source);

View File

@ -21,9 +21,9 @@ with this program. If not, see <https://www.gnu.org/licenses/>
#include <QPainter>
#include <QUrl>
#include <obs-module.h>
#include <qrcodegen.hpp>
#include "ConnectInfo.h"
#include "../../deps/qr/cpp/QrCode.hpp"
#include "../obs-websocket.h"
#include "../Config.h"
#include "../utils/Platform.h"

View File

@ -89,7 +89,24 @@ bool obs_module_load(void)
return true;
}
void obs_module_unload()
#ifdef PLUGIN_TESTS
void test_register_vendor();
#endif
void obs_module_post_load(void)
{
#ifdef PLUGIN_TESTS
test_register_vendor();
#endif
// Server will accept clients, but requests and events will not be served until FINISHED_LOADING occurs
if (_config->ServerEnabled) {
blog(LOG_INFO, "[obs_module_post_load] WebSocket server is enabled, starting...");
_webSocketServer->Start();
}
}
void obs_module_unload(void)
{
blog(LOG_INFO, "[obs_module_unload] Shutting down...");
@ -108,8 +125,7 @@ void obs_module_unload()
// Destroy the event handler
_eventHandler.reset();
// Save and destroy the config manager
_config->Save();
// Destroy the config manager
_config.reset();
// Destroy the cpu stats
@ -193,18 +209,18 @@ static void test_vendor_request_cb(obs_data_t *requestData, obs_data_t *response
obs_websocket_vendor_emit_event(priv_data, "TestEvent", requestData);
}
void obs_module_post_load()
void test_register_vendor()
{
blog(LOG_INFO, "[obs_module_post_load] Post load started.");
blog(LOG_INFO, "[test_register_vendor] Registering test vendor...");
// Test plugin API version fetch
uint apiVersion = obs_websocket_get_api_version();
blog(LOG_INFO, "[obs_module_post_load] obs-websocket plugin API version: %u", apiVersion);
blog(LOG_INFO, "[test_register_vendor] obs-websocket plugin API version: %u", apiVersion);
// Test calling obs-websocket requests
struct obs_websocket_request_response *response = obs_websocket_call_request("GetVersion");
if (response) {
blog(LOG_INFO, "[obs_module_post_load] Called GetVersion. Status Code: %u | Comment: %s | Response Data: %s",
blog(LOG_INFO, "[test_register_vendor] Called GetVersion. Status Code: %u | Comment: %s | Response Data: %s",
response->status_code, response->comment, response->response_data);
obs_websocket_request_response_free(response);
}
@ -212,17 +228,17 @@ void obs_module_post_load()
// Test vendor creation
auto vendor = obs_websocket_register_vendor("obs-websocket-test");
if (!vendor) {
blog(LOG_WARNING, "[obs_module_post_load] Failed to create vendor!");
blog(LOG_WARNING, "[test_register_vendor] Failed to create vendor!");
return;
}
// Test vendor request registration
if (!obs_websocket_vendor_register_request(vendor, "TestRequest", test_vendor_request_cb, vendor)) {
blog(LOG_WARNING, "[obs_module_post_load] Failed to register vendor request!");
blog(LOG_WARNING, "[test_register_vendor] Failed to register vendor request!");
return;
}
blog(LOG_INFO, "[obs_module_post_load] Post load completed.");
blog(LOG_INFO, "[test_register_vendor] Post load completed.");
}
#endif

View File

@ -31,17 +31,13 @@ struct SerialFrameBatch {
json &variables;
bool haltOnFailure;
size_t frameCount;
size_t sleepUntilFrame;
size_t frameCount = 0;
size_t sleepUntilFrame = 0;
std::mutex conditionMutex;
std::condition_variable condition;
SerialFrameBatch(RequestHandler &requestHandler, json &variables, bool haltOnFailure)
: requestHandler(requestHandler),
variables(variables),
haltOnFailure(haltOnFailure),
frameCount(0),
sleepUntilFrame(0)
: requestHandler(requestHandler), variables(variables), haltOnFailure(haltOnFailure)
{
}
};

View File

@ -51,6 +51,7 @@ const std::unordered_map<std::string, RequestMethodHandler> RequestHandler::_han
{"GetStreamServiceSettings", &RequestHandler::GetStreamServiceSettings},
{"SetStreamServiceSettings", &RequestHandler::SetStreamServiceSettings},
{"GetRecordDirectory", &RequestHandler::GetRecordDirectory},
{"SetRecordDirectory", &RequestHandler::SetRecordDirectory},
// Sources
{"GetSourceActive", &RequestHandler::GetSourceActive},
@ -220,9 +221,8 @@ RequestResult RequestHandler::ProcessRequest(const Request &request)
std::vector<std::string> RequestHandler::GetRequestList()
{
std::vector<std::string> ret;
for (auto const &[key, val] : _handlerMap) {
for (auto const &[key, val] : _handlerMap)
ret.push_back(key);
}
return ret;
}

View File

@ -70,6 +70,7 @@ private:
RequestResult GetStreamServiceSettings(const Request &);
RequestResult SetStreamServiceSettings(const Request &);
RequestResult GetRecordDirectory(const Request &);
RequestResult SetRecordDirectory(const Request &);
// Sources
RequestResult GetSourceActive(const Request &);

View File

@ -622,7 +622,7 @@ RequestResult RequestHandler::SetStreamServiceSettings(const Request &request)
* @responseField recordDirectory | String | Output directory
*
* @requestType GetRecordDirectory
* @complexity 1
* @complexity 2
* @rpcVersion -1
* @initialVersion 5.0.0
* @api requests
@ -635,3 +635,35 @@ RequestResult RequestHandler::GetRecordDirectory(const Request &)
return RequestResult::Success(responseData);
}
/**
* Sets the current directory that the record output writes files to.
*
* @requestField recordDirectory | String | Output directory
*
* @requestType SetRecordDirectory
* @complexity 2
* @rpcVersion -1
* @initialVersion 5.3.0
* @api requests
* @category config
*/
RequestResult RequestHandler::SetRecordDirectory(const Request &request)
{
if (obs_frontend_recording_active())
return RequestResult::Error(RequestStatus::OutputRunning);
RequestStatus::RequestStatus statusCode;
std::string comment;
if (!request.ValidateString("recordDirectory", statusCode, comment))
return RequestResult::Error(statusCode, comment);
std::string recordDirectory = request.RequestData["recordDirectory"];
config_t *config = obs_frontend_get_profile_config();
config_set_string(config, "AdvOut", "RecFilePath", recordDirectory.c_str());
config_set_string(config, "SimpleOutput", "FilePath", recordDirectory.c_str());
config_save(config);
return RequestResult::Success();
}

View File

@ -317,7 +317,7 @@ RequestResult RequestHandler::GetSceneSceneTransitionOverride(const Request &req
}
/**
* Gets the scene transition overridden for a scene.
* Sets the scene transition overridden for a scene.
*
* @requestField sceneName | String | Name of the scene
* @requestField ?transitionName | String | Name of the scene transition to use as override. Specify `null` to remove | Unchanged

View File

@ -103,6 +103,19 @@ namespace RequestStatus {
* @api enums
*/
UnsupportedRequestBatchExecutionType = 206,
/**
* The server is not ready to handle the request.
*
* Note: This usually occurs during OBS scene collection change or exit. Requests may be tried again after a delay if this code is given.
*
* @enumIdentifier NotReady
* @enumValue 207
* @enumType RequestStatus
* @rpcVersion -1
* @initialVersion 5.3.0
* @api enums
*/
NotReady = 207,
/**
* A required request field is missing.

View File

@ -31,7 +31,7 @@ with this program. If not, see <https://www.gnu.org/licenses/>
#include "../utils/Platform.h"
#include "../utils/Compat.h"
WebSocketServer::WebSocketServer() : QObject(nullptr), _sessions()
WebSocketServer::WebSocketServer() : QObject(nullptr)
{
_server.get_alog().clear_channels(websocketpp::log::alevel::all);
_server.get_elog().clear_channels(websocketpp::log::elevel::all);
@ -52,7 +52,7 @@ WebSocketServer::WebSocketServer() : QObject(nullptr), _sessions()
eventHandler->SetBroadcastCallback(std::bind(&WebSocketServer::BroadcastEvent, this, std::placeholders::_1,
std::placeholders::_2, std::placeholders::_3, std::placeholders::_4));
eventHandler->SetObsLoadedCallback(std::bind(&WebSocketServer::onObsLoaded, this));
eventHandler->SetObsReadyCallback(std::bind(&WebSocketServer::onObsReady, this, std::placeholders::_1));
}
WebSocketServer::~WebSocketServer()
@ -113,6 +113,10 @@ void WebSocketServer::Start()
} else {
blog(LOG_INFO, "[WebSocketServer::Start] Not locked to IPv4 bindings");
_server.listen(conf->ServerPort, errorCode);
if (errorCode && errorCode == websocketpp::lib::asio::error::address_family_not_supported) {
blog(LOG_INFO, "[WebSocketServer::Start] IPv6 address family not supported, binding only to IPv4");
_server.listen(websocketpp::lib::asio::ip::tcp::v4(), conf->ServerPort, errorCode);
}
}
if (errorCode) {
@ -158,9 +162,8 @@ void WebSocketServer::Stop()
_threadPool.waitForDone();
// This can delay the thread that it is running on. Bad but kinda required.
while (_sessions.size() > 0) {
while (_sessions.size() > 0)
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
_serverThread.join();
@ -205,18 +208,9 @@ std::vector<WebSocketServer::WebSocketSessionState> WebSocketServer::GetWebSocke
return webSocketSessions;
}
void WebSocketServer::onObsLoaded()
void WebSocketServer::onObsReady(bool ready)
{
auto conf = GetConfig();
if (!conf) {
blog(LOG_ERROR, "[WebSocketServer::onObsLoaded] Unable to retreive config!");
return;
}
if (conf->ServerEnabled) {
blog(LOG_INFO, "[WebSocketServer::onObsLoaded] WebSocket server is enabled, starting...");
Start();
}
_obsReady = ready;
}
bool WebSocketServer::onValidate(websocketpp::connection_hdl hdl)
@ -266,7 +260,7 @@ void WebSocketServer::onOpen(websocketpp::connection_hdl hdl)
json helloMessageData;
helloMessageData["obsWebSocketVersion"] = OBS_WEBSOCKET_VERSION;
helloMessageData["rpcVersion"] = OBS_WEBSOCKET_RPC_VERSION;
if (conf->AuthRequired) {
if (session->AuthenticationRequired()) {
session->SetSecret(_authenticationSecret);
std::string sessionChallenge = Utils::Crypto::GenerateSalt();
session->SetChallenge(sessionChallenge);

View File

@ -77,7 +77,7 @@ private:
void ServerRunner();
void onObsLoaded();
void onObsReady(bool loaded);
bool onValidate(websocketpp::connection_hdl hdl);
void onOpen(websocketpp::connection_hdl hdl);
void onClose(websocketpp::connection_hdl hdl);
@ -96,4 +96,6 @@ private:
std::mutex _sessionMutex;
std::map<websocketpp::connection_hdl, SessionPtr, std::owner_less<websocketpp::connection_hdl>> _sessions;
std::atomic<bool> _obsReady = false;
};

View File

@ -82,7 +82,7 @@ void WebSocketServer::ProcessMessage(SessionPtr session, WebSocketServer::Proces
}
// Only `Identify` is allowed when not identified
if (!session->IsIdentified() && opCode != 1) {
if (!session->IsIdentified() && opCode != WebSocketOpCode::Identify) {
ret.closeCode = WebSocketCloseCode::NotIdentified;
ret.closeReason = "You attempted to send a non-Identify message while not identified.";
return;
@ -146,9 +146,8 @@ void WebSocketServer::ProcessMessage(SessionPtr session, WebSocketServer::Proces
session->SetRpcVersion(requestedRpcVersion);
SetSessionParameters(session, ret, payloadData);
if (ret.closeCode != WebSocketCloseCode::DontClose) {
if (ret.closeCode != WebSocketCloseCode::DontClose)
return;
}
// Increment refs for event subscriptions
auto eventHandler = GetEventHandler();
@ -178,9 +177,8 @@ void WebSocketServer::ProcessMessage(SessionPtr session, WebSocketServer::Proces
eventHandler->ProcessUnsubscription(session->EventSubscriptions());
SetSessionParameters(session, ret, payloadData);
if (ret.closeCode != WebSocketCloseCode::DontClose) {
if (ret.closeCode != WebSocketCloseCode::DontClose)
return;
}
// Increment refs for new subscriptions
eventHandler->ProcessSubscription(session->EventSubscriptions());
@ -209,13 +207,17 @@ void WebSocketServer::ProcessMessage(SessionPtr session, WebSocketServer::Proces
return;
}
RequestHandler requestHandler(session);
std::string requestType = payloadData["requestType"];
json requestData = payloadData["requestData"];
Request request(requestType, requestData);
RequestResult requestResult;
if (_obsReady) {
json requestData = payloadData["requestData"];
Request request(requestType, requestData);
RequestResult requestResult = requestHandler.ProcessRequest(request);
RequestHandler requestHandler(session);
requestResult = requestHandler.ProcessRequest(request);
} else {
requestResult = RequestResult::Error(RequestStatus::NotReady, "OBS is not ready to perform the request.");
}
json resultPayloadData;
resultPayloadData["requestType"] = requestType;
@ -303,22 +305,34 @@ void WebSocketServer::ProcessMessage(SessionPtr session, WebSocketServer::Proces
}
std::vector<json> requests = payloadData["requests"];
std::vector<RequestResult> resultsVector;
if (_obsReady) {
std::vector<RequestBatchRequest> requestsVector;
for (auto &requestJson : requests) {
if (!requestJson["requestType"].is_string())
requestJson["requestType"] =
""; // Workaround for what would otherwise be extensive additional logic for a rare edge case
std::string requestType = requestJson["requestType"];
json requestData = requestJson["requestData"];
json inputVariables = requestJson["inputVariables"];
json outputVariables = requestJson["outputVariables"];
requestsVector.emplace_back(requestType, requestData, executionType, inputVariables,
outputVariables);
}
std::vector<RequestBatchRequest> requestsVector;
for (auto &requestJson : requests) {
if (!requestJson["requestType"].is_string())
requestJson["requestType"] =
""; // Workaround for what would otherwise be extensive additional logic for a rare edge case
std::string requestType = requestJson["requestType"];
json requestData = requestJson["requestData"];
json inputVariables = requestJson["inputVariables"];
json outputVariables = requestJson["outputVariables"];
requestsVector.emplace_back(requestType, requestData, executionType, inputVariables, outputVariables);
resultsVector = RequestBatchHandler::ProcessRequestBatch(
_threadPool, session, executionType, requestsVector, payloadData["variables"], haltOnFailure);
} else {
// I lowkey hate this, but whatever
if (haltOnFailure) {
resultsVector.emplace_back(RequestStatus::NotReady, "OBS is not ready to perform the request.");
} else {
for (size_t i = 0; i < requests.size(); i++)
resultsVector.emplace_back(RequestStatus::NotReady,
"OBS is not ready to perform the request.");
}
}
auto resultsVector = RequestBatchHandler::ProcessRequestBatch(_threadPool, session, executionType, requestsVector,
payloadData["variables"], haltOnFailure);
size_t i = 0;
std::vector<json> results;
for (auto &requestResult : resultsVector) {
@ -342,7 +356,7 @@ void WebSocketServer::ProcessMessage(SessionPtr session, WebSocketServer::Proces
void WebSocketServer::BroadcastEvent(uint64_t requiredIntent, const std::string &eventType, const json &eventData,
uint8_t rpcVersion)
{
if (!_server.is_listening())
if (!_server.is_listening() || !_obsReady)
return;
_threadPool.start(Utils::Compat::CreateFunctionRunnable([=]() {
@ -361,19 +375,16 @@ void WebSocketServer::BroadcastEvent(uint64_t requiredIntent, const std::string
// Recurse connected sessions and send the event to suitable sessions.
std::unique_lock<std::mutex> lock(_sessionMutex);
for (auto &it : _sessions) {
if (!it.second->IsIdentified()) {
if (!it.second->IsIdentified())
continue;
}
if (rpcVersion && it.second->RpcVersion() != rpcVersion) {
if (rpcVersion && it.second->RpcVersion() != rpcVersion)
continue;
}
if ((it.second->EventSubscriptions() & requiredIntent) != 0) {
websocketpp::lib::error_code errorCode;
switch (it.second->Encoding()) {
case WebSocketEncoding::Json:
if (messageJson.empty()) {
if (messageJson.empty())
messageJson = eventMessage.dump();
}
_server.send((websocketpp::connection_hdl)it.first, messageJson,
websocketpp::frame::opcode::text, errorCode);
it.second->IncrementOutgoingMessages();

View File

@ -1,153 +0,0 @@
/*
obs-websocket
Copyright (C) 2016-2021 Stephane Lepin <stephane.lepin@gmail.com>
Copyright (C) 2020-2021 Kyle Manning <tt2468@gmail.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program. If not, see <https://www.gnu.org/licenses/>
*/
#include "WebSocketSession.h"
#include "../../eventhandler/types/EventSubscription.h"
WebSocketSession::WebSocketSession()
: _remoteAddress(""),
_connectedAt(0),
_incomingMessages(0),
_outgoingMessages(0),
_encoding(0),
_challenge(""),
_rpcVersion(OBS_WEBSOCKET_RPC_VERSION),
_isIdentified(false),
_eventSubscriptions(EventSubscription::All)
{
}
std::string WebSocketSession::RemoteAddress()
{
std::lock_guard<std::mutex> lock(_remoteAddressMutex);
std::string ret(_remoteAddress);
return ret;
}
void WebSocketSession::SetRemoteAddress(std::string address)
{
std::lock_guard<std::mutex> lock(_remoteAddressMutex);
_remoteAddress = address;
}
uint64_t WebSocketSession::ConnectedAt()
{
return _connectedAt.load();
}
void WebSocketSession::SetConnectedAt(uint64_t at)
{
_connectedAt.store(at);
}
uint64_t WebSocketSession::IncomingMessages()
{
return _incomingMessages.load();
}
void WebSocketSession::IncrementIncomingMessages()
{
_incomingMessages++;
}
uint64_t WebSocketSession::OutgoingMessages()
{
return _outgoingMessages.load();
}
void WebSocketSession::IncrementOutgoingMessages()
{
_outgoingMessages++;
}
uint8_t WebSocketSession::Encoding()
{
return _encoding.load();
}
void WebSocketSession::SetEncoding(uint8_t encoding)
{
_encoding.store(encoding);
}
bool WebSocketSession::AuthenticationRequired()
{
return _authenticationRequired.load();
}
void WebSocketSession::SetAuthenticationRequired(bool required)
{
_authenticationRequired.store(required);
}
std::string WebSocketSession::Secret()
{
std::lock_guard<std::mutex> lock(_secretMutex);
std::string ret(_secret);
return ret;
}
void WebSocketSession::SetSecret(std::string secret)
{
std::lock_guard<std::mutex> lock(_secretMutex);
_secret = secret;
}
std::string WebSocketSession::Challenge()
{
std::lock_guard<std::mutex> lock(_challengeMutex);
std::string ret(_challenge);
return ret;
}
void WebSocketSession::SetChallenge(std::string challengeString)
{
std::lock_guard<std::mutex> lock(_challengeMutex);
_challenge = challengeString;
}
uint8_t WebSocketSession::RpcVersion()
{
return _rpcVersion.load();
}
void WebSocketSession::SetRpcVersion(uint8_t version)
{
_rpcVersion.store(version);
}
bool WebSocketSession::IsIdentified()
{
return _isIdentified.load();
}
void WebSocketSession::SetIsIdentified(bool identified)
{
_isIdentified.store(identified);
}
uint64_t WebSocketSession::EventSubscriptions()
{
return _eventSubscriptions.load();
}
void WebSocketSession::SetEventSubscriptions(uint64_t subscriptions)
{
_eventSubscriptions.store(subscriptions);
}

View File

@ -24,6 +24,7 @@ with this program. If not, see <https://www.gnu.org/licenses/>
#include <atomic>
#include <memory>
#include "../../eventhandler/types/EventSubscription.h"
#include "plugin-macros.generated.h"
class WebSocketSession;
@ -31,56 +32,78 @@ typedef std::shared_ptr<WebSocketSession> SessionPtr;
class WebSocketSession {
public:
WebSocketSession();
inline std::string RemoteAddress()
{
std::lock_guard<std::mutex> lock(_remoteAddressMutex);
return _remoteAddress;
}
inline void SetRemoteAddress(std::string address)
{
std::lock_guard<std::mutex> lock(_remoteAddressMutex);
_remoteAddress = address;
}
std::string RemoteAddress();
void SetRemoteAddress(std::string address);
inline uint64_t ConnectedAt() { return _connectedAt; }
inline void SetConnectedAt(uint64_t at) { _connectedAt = at; }
uint64_t ConnectedAt();
void SetConnectedAt(uint64_t at);
inline uint64_t IncomingMessages() { return _incomingMessages; }
inline void IncrementIncomingMessages() { _incomingMessages++; }
uint64_t IncomingMessages();
void IncrementIncomingMessages();
inline uint64_t OutgoingMessages() { return _outgoingMessages; }
inline void IncrementOutgoingMessages() { _outgoingMessages++; }
uint64_t OutgoingMessages();
void IncrementOutgoingMessages();
inline uint8_t Encoding() { return _encoding; }
inline void SetEncoding(uint8_t encoding) { _encoding = encoding; }
uint8_t Encoding();
void SetEncoding(uint8_t encoding);
inline bool AuthenticationRequired() { return _authenticationRequired; }
inline void SetAuthenticationRequired(bool required) { _authenticationRequired = required; }
bool AuthenticationRequired();
void SetAuthenticationRequired(bool required);
inline std::string Secret()
{
std::lock_guard<std::mutex> lock(_secretMutex);
return _secret;
}
inline void SetSecret(std::string secret)
{
std::lock_guard<std::mutex> lock(_secretMutex);
_secret = secret;
}
std::string Secret();
void SetSecret(std::string secret);
inline std::string Challenge()
{
std::lock_guard<std::mutex> lock(_challengeMutex);
return _challenge;
}
inline void SetChallenge(std::string challenge)
{
std::lock_guard<std::mutex> lock(_challengeMutex);
_challenge = challenge;
}
std::string Challenge();
void SetChallenge(std::string challenge);
inline uint8_t RpcVersion() { return _rpcVersion; }
inline void SetRpcVersion(uint8_t version) { _rpcVersion = version; }
uint8_t RpcVersion();
void SetRpcVersion(uint8_t version);
inline bool IsIdentified() { return _isIdentified; }
inline void SetIsIdentified(bool identified) { _isIdentified = identified; }
bool IsIdentified();
void SetIsIdentified(bool identified);
uint64_t EventSubscriptions();
void SetEventSubscriptions(uint64_t subscriptions);
inline uint64_t EventSubscriptions() { return _eventSubscriptions; }
inline void SetEventSubscriptions(uint64_t subscriptions) { _eventSubscriptions = subscriptions; }
std::mutex OperationMutex;
private:
std::mutex _remoteAddressMutex;
std::string _remoteAddress;
std::atomic<uint64_t> _connectedAt;
std::atomic<uint64_t> _incomingMessages;
std::atomic<uint64_t> _outgoingMessages;
std::atomic<uint8_t> _encoding;
std::atomic<bool> _authenticationRequired;
std::atomic<uint64_t> _connectedAt = 0;
std::atomic<uint64_t> _incomingMessages = 0;
std::atomic<uint64_t> _outgoingMessages = 0;
std::atomic<uint8_t> _encoding = 0;
std::atomic<bool> _authenticationRequired = false;
std::mutex _secretMutex;
std::string _secret;
std::mutex _challengeMutex;
std::string _challenge;
std::atomic<uint8_t> _rpcVersion;
std::atomic<bool> _isIdentified;
std::atomic<uint64_t> _eventSubscriptions;
std::atomic<uint8_t> _rpcVersion = OBS_WEBSOCKET_RPC_VERSION;
std::atomic<bool> _isIdentified = false;
std::atomic<uint64_t> _eventSubscriptions = EventSubscription::All;
};