From 28facf0d0f88475e77211ec349387e8f4955f334 Mon Sep 17 00:00:00 2001 From: Raphiiko Date: Tue, 26 Dec 2023 16:10:30 +0100 Subject: [PATCH] Added debug option for manually turning off OSC and OSCQuery servers. Added flags file with flag for disabling MDNS. --- src-core/Cargo.lock | 148 ++++++++++++++++++ src-core/Cargo.toml | 1 + src-core/flags.toml | 1 + src-core/src/globals.rs | 10 ++ src-core/src/main.rs | 29 +++- src-core/src/osc/commands.rs | 34 ++-- src-core/src/osc/mod.rs | 12 +- src-core/tauri.conf.json | 3 +- src-ui/app/models/settings.ts | 2 + src-ui/app/services/osc.service.ts | 43 +++-- .../settings-advanced-view.component.html | 30 ++-- .../settings-advanced-view.component.ts | 46 +++--- src-ui/assets/i18n/en.json | 19 +-- src-ui/assets/i18n/ko.json | 15 -- 14 files changed, 293 insertions(+), 100 deletions(-) create mode 100644 src-core/flags.toml diff --git a/src-core/Cargo.lock b/src-core/Cargo.lock index 1f793394..00bec74e 100644 --- a/src-core/Cargo.lock +++ b/src-core/Cargo.lock @@ -17,6 +17,17 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +[[package]] +name = "ahash" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a824f2aa7e75a0c98c5a504fceb80649e9c35265d44525b5f94de4771a395cd" +dependencies = [ + "getrandom 0.2.10", + "once_cell", + "version_check", +] + [[package]] name = "aho-corasick" version = "0.7.20" @@ -810,6 +821,25 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "config" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23738e11972c7643e4ec947840fc463b6a571afcd3e735bdfce7d03c7a784aca" +dependencies = [ + "async-trait", + "json5", + "lazy_static", + "nom", + "pathdiff", + "ron", + "rust-ini", + "serde", + "serde_json", + "toml 0.5.11", + "yaml-rust", +] + [[package]] name = "convert_case" version = "0.4.0" @@ -1207,6 +1237,12 @@ dependencies = [ "syn 2.0.41", ] +[[package]] +name = "dlv-list" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0688c2a7f92e427f44895cd63841bff7b29f8d7a1648b9e7e07a4a365b2e1257" + [[package]] name = "dtoa" version = "1.0.6" @@ -1919,6 +1955,9 @@ name = "hashbrown" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash", +] [[package]] name = "hashbrown" @@ -2438,6 +2477,17 @@ dependencies = [ "treediff", ] +[[package]] +name = "json5" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96b0db21af676c1ce64250b5f40f3ce2cf27e4e47cb91ed91eb6fe9350b430c1" +dependencies = [ + "pest", + "pest_derive", + "serde", +] + [[package]] name = "kuchiki" version = "0.8.1" @@ -2542,6 +2592,12 @@ dependencies = [ "cc", ] +[[package]] +name = "linked-hash-map" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" + [[package]] name = "linux-raw-sys" version = "0.3.8" @@ -3216,6 +3272,16 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" +[[package]] +name = "ordered-multimap" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccd746e37177e1711c20dd619a1620f34f5c8b569c53590a72dedd5344d8924a" +dependencies = [ + "dlv-list", + "hashbrown 0.12.3", +] + [[package]] name = "ordered-stream" version = "0.2.0" @@ -3294,6 +3360,7 @@ dependencies = [ "byteorder", "bytes", "chrono", + "config", "cronjob", "enumset", "futures", @@ -3449,6 +3516,51 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" +[[package]] +name = "pest" +version = "2.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae9cee2a55a544be8b89dc6848072af97a20f2422603c10865be2a42b580fff5" +dependencies = [ + "memchr", + "thiserror", + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81d78524685f5ef2a3b3bd1cafbc9fcabb036253d9b1463e726a91cd16e2dfc2" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68bd1206e71118b5356dae5ddc61c8b11e28b09ef6a31acbd15ea48a28e0c227" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn 2.0.41", +] + +[[package]] +name = "pest_meta" +version = "2.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c747191d4ad9e4a4ab9c8798f1e82a39affe7ef9648390b7e5548d18e099de6" +dependencies = [ + "once_cell", + "pest", + "sha2", +] + [[package]] name = "petgraph" version = "0.6.3" @@ -4086,6 +4198,17 @@ dependencies = [ "windows 0.37.0", ] +[[package]] +name = "ron" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88073939a61e5b7680558e6be56b419e208420c2adb92be54921fa6b72283f1a" +dependencies = [ + "base64 0.13.1", + "bitflags 1.3.2", + "serde", +] + [[package]] name = "rosc" version = "0.10.1" @@ -4096,6 +4219,16 @@ dependencies = [ "nom", ] +[[package]] +name = "rust-ini" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6d5f2436026b4f6e79dc829837d467cc7e9a55ee40e750d716713540715a2df" +dependencies = [ + "cfg-if", + "ordered-multimap", +] + [[package]] name = "rust_decimal" version = "1.33.1" @@ -5603,6 +5736,12 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +[[package]] +name = "ucd-trie" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" + [[package]] name = "uds_windows" version = "1.0.2" @@ -6593,6 +6732,15 @@ dependencies = [ "winapi", ] +[[package]] +name = "yaml-rust" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" +dependencies = [ + "linked-hash-map", +] + [[package]] name = "zbus" version = "3.12.0" diff --git a/src-core/Cargo.toml b/src-core/Cargo.toml index bf9e7756..859976d1 100644 --- a/src-core/Cargo.toml +++ b/src-core/Cargo.toml @@ -85,6 +85,7 @@ system_shutdown = "4.0.1" async-recursion = "1.0.5" enumset = "1.1.3" tauri-plugin-aptabase = "0.5" +config = "0.13.4" [dependencies.oyasumivr_oscquery] git = "https://github.com/Raphiiko/oyasumivr_oscquery.git" diff --git a/src-core/flags.toml b/src-core/flags.toml new file mode 100644 index 00000000..3182009c --- /dev/null +++ b/src-core/flags.toml @@ -0,0 +1 @@ +DISABLE_MDNS = false diff --git a/src-core/src/globals.rs b/src-core/src/globals.rs index 5b564d49..77bbd46b 100644 --- a/src-core/src/globals.rs +++ b/src-core/src/globals.rs @@ -1,3 +1,4 @@ +use config::Config; use tokio::sync::Mutex; pub const STEAM_APP_KEY: &str = "steam.overlay.2538150-DEV"; @@ -10,4 +11,13 @@ pub const APTABASE_APP_KEY: &str = "A-EU-0936106873"; lazy_static! { pub static ref TAURI_APP_HANDLE: Mutex> = Default::default(); pub static ref TAURI_CLI_MATCHES: Mutex> = Default::default(); + pub static ref FLAGS: Mutex> = Default::default(); +} + +pub async fn is_flag_set(flag: &str) -> bool { + let flags = FLAGS.lock().await; + if let Some(flags) = flags.as_ref() { + return flags.get_bool(flag).unwrap_or(false); + } + false } diff --git a/src-core/src/main.rs b/src-core/src/main.rs index 71ad802b..ac1e600c 100644 --- a/src-core/src/main.rs +++ b/src-core/src/main.rs @@ -27,11 +27,12 @@ mod vrc_log_parser; use std::sync::atomic::Ordering; +use config::Config; pub use flavour::BUILD_FLAVOUR; pub use grpc::models as Models; use cronjob::CronJob; -use globals::{APTABASE_APP_KEY, TAURI_APP_HANDLE}; +use globals::{APTABASE_APP_KEY, FLAGS, TAURI_APP_HANDLE}; use log::{info, warn, LevelFilter}; use oyasumivr_shared::windows::is_elevated; use serde_json::json; @@ -73,6 +74,30 @@ fn main() { .expect("An error occurred while running the application"); } +async fn load_configs() { + match Config::builder() + .add_source(config::File::with_name("flags")) + .build() + { + Ok(flags) => { + *FLAGS.lock().await = Some(flags); + } + Err(e) => match e { + config::ConfigError::NotFound(_) => { + warn!("[Core] Could not find flags config. Using default values."); + } + _ => { + warn!("[Core] Could not load flags config: {:#?}", e); + } + }, + }; + if globals::is_flag_set("DISABLE_MDNS").await { + warn!( + "[Core] DISABLE_MDNS flag set: MDNS is disabled. OSC and OSCQuery functionality cannot be expected to work." + ); + } +} + fn configure_command_handlers() -> impl Fn(tauri::Invoke) { tauri::generate_handler![ openvr::commands::openvr_get_devices, @@ -249,6 +274,8 @@ async fn app_setup(app_handle: tauri::AppHandle) { std::env::set_current_dir(&executable_path).unwrap(); // Run any migrations first migrations::run_migrations().await; + // Load configs + load_configs().await; // Set up app reference *TAURI_APP_HANDLE.lock().await = Some(app_handle.clone()); // Open devtools if we're in debug mode diff --git a/src-core/src/osc/commands.rs b/src-core/src/osc/commands.rs index 8c45debb..ec80ca03 100644 --- a/src-core/src/osc/commands.rs +++ b/src-core/src/osc/commands.rs @@ -15,6 +15,9 @@ lazy_static! { #[tauri::command] pub async fn get_vrchat_osc_address() -> Option { + if crate::globals::is_flag_set("DISABLE_MDNS").await { + return None; + } let addr = oyasumivr_oscquery::client::get_vrchat_osc_address().await; match addr { Some(addr) => Some(format!("{}:{}", addr.0, addr.1)), @@ -24,6 +27,9 @@ pub async fn get_vrchat_osc_address() -> Option { #[tauri::command] pub async fn get_vrchat_oscquery_address() -> Option { + if crate::globals::is_flag_set("DISABLE_MDNS").await { + return None; + } let addr = oyasumivr_oscquery::client::get_vrchat_oscquery_address().await; match addr { Some(addr) => Some(format!("{}:{}", addr.0, addr.1)), @@ -83,18 +89,21 @@ pub async fn start_osc_server() -> Option<(String, Option)> { let cancellation_token = super::spawn_receiver_task().await; *CANCELLATION_TOKEN.lock().await = Some(cancellation_token); // Start the OSCQuery server - let osc_query_addr_string = - match oyasumivr_oscquery::server::init("OyasumiVR", "127.0.0.1", osc_addr_port).await { - Ok(result) => Some(format!("{}:{}", result.0, result.1)), - Err(err) => { - error!("[Core] Could not initialize OSCQuery server: {:#?}", err); - None - } - }; - oyasumivr_oscquery::server::receive_vrchat_avatar_parameters().await; - match oyasumivr_oscquery::server::advertise().await { - Err(err) => error!("[Core] Could not advertise OSCQuery server: {:#?}", err), - _ => {} + let mut osc_query_addr_string = None; + if !crate::globals::is_flag_set("DISABLE_MDNS").await { + osc_query_addr_string = + match oyasumivr_oscquery::server::init("OyasumiVR", "127.0.0.1", osc_addr_port).await { + Ok(result) => Some(format!("{}:{}", result.0, result.1)), + Err(err) => { + error!("[Core] Could not initialize OSCQuery server: {:#?}", err); + None + } + }; + oyasumivr_oscquery::server::receive_vrchat_avatar_parameters().await; + match oyasumivr_oscquery::server::advertise().await { + Err(err) => error!("[Core] Could not advertise OSCQuery server: {:#?}", err), + _ => {} + } } // Return bound address Some((osc_addr_string, osc_query_addr_string)) @@ -110,7 +119,6 @@ pub async fn set_osc_method_value(address: String, value: String) { oyasumivr_oscquery::server::set_osc_method_value(address, Some(value)).await; } - #[tauri::command] pub async fn osc_send_int(addr: String, osc_addr: String, data: i32) -> Result { debug!( diff --git a/src-core/src/osc/mod.rs b/src-core/src/osc/mod.rs index 1a4e2e5e..ca1a30f7 100644 --- a/src-core/src/osc/mod.rs +++ b/src-core/src/osc/mod.rs @@ -22,10 +22,12 @@ lazy_static! { pub async fn init() { // Start looking for VRChat's OSC and OSCQuery services - match oyasumivr_oscquery::client::init().await { - Err(err) => error!("[Core] Could not initialize OSCQuery client: {:#?}", err), - _ => {} - }; + if !crate::globals::is_flag_set("DISABLE_MDNS").await { + match oyasumivr_oscquery::client::init().await { + Err(err) => error!("[Core] Could not initialize OSCQuery client: {:#?}", err), + _ => {} + }; + } // Setup sending socket *OSC_SEND_SOCKET.lock().await = match UdpSocket::bind((Ipv4Addr::UNSPECIFIED, 0)) { Ok(s) => Some(s), @@ -115,7 +117,7 @@ async fn spawn_receiver_task() -> CancellationToken { } } } + info!("[Core] Terminated OSC receiver task"); }); - info!("[Core] Terminated OSC receiver task"); cancellation_token } diff --git a/src-core/tauri.conf.json b/src-core/tauri.conf.json index 33f49f96..1783bcdb 100644 --- a/src-core/tauri.conf.json +++ b/src-core/tauri.conf.json @@ -69,6 +69,7 @@ }, "resources": [ "./openvr_api.dll", + "./flags.toml", "./steam_api64.dll", "./resources/**/*" ], @@ -195,4 +196,4 @@ } ] } -} \ No newline at end of file +} diff --git a/src-ui/app/models/settings.ts b/src-ui/app/models/settings.ts index 1dc81d61..b171db8b 100644 --- a/src-ui/app/models/settings.ts +++ b/src-ui/app/models/settings.ts @@ -24,6 +24,7 @@ export interface AppSettings { ignoredLighthouses: string[]; hotkeys: { [hotkeyId: string]: string[] }; hideSnowverlay: boolean; + oscServerEnabled: boolean; } export type QuitWithSteamVRMode = 'DISABLED' | 'IMMEDIATELY' | 'AFTERDELAY'; @@ -72,6 +73,7 @@ export const APP_SETTINGS_DEFAULT: AppSettings = { ignoredLighthouses: [], hotkeys: {}, hideSnowverlay: false, + oscServerEnabled: true, }; export type ExecutableReferenceStatus = diff --git a/src-ui/app/services/osc.service.ts b/src-ui/app/services/osc.service.ts index ebd3f60d..f944e869 100644 --- a/src-ui/app/services/osc.service.ts +++ b/src-ui/app/services/osc.service.ts @@ -6,8 +6,19 @@ import { TaskQueue } from '../utils/task-queue'; import { debug, error } from 'tauri-plugin-log-api'; import { listen } from '@tauri-apps/api/event'; import { OSCMessage, OSCMessageRaw, parseOSCMessage } from '../models/osc-message'; -import { BehaviorSubject, interval, Observable, Subject } from 'rxjs'; +import { + BehaviorSubject, + debounceTime, + distinctUntilChanged, + EMPTY, + interval, + map, + Observable, + Subject, + switchMap, +} from 'rxjs'; import { OscMethod } from './osc-control/osc-method'; +import { AppSettingsService } from './app-settings.service'; @Injectable({ providedIn: 'root', @@ -40,15 +51,31 @@ export class OscService { OscMethod[] >([]); - constructor() {} + constructor(private appSettings: AppSettingsService) {} async init() { await listen('OSC_MESSAGE', (data) => { this._messages.next(parseOSCMessage(data.payload)); }); - await this.startOscServer(); - await this.fetchVRChatOSCAddress(); - interval(1000).subscribe(() => this.fetchVRChatOSCAddress()); + this.appSettings.settings + .pipe( + map((s) => s.oscServerEnabled), + distinctUntilChanged(), + debounceTime(500), + switchMap(async (enabled) => { + if (enabled) { + await this.startOscServer(); + await this.fetchVRChatOSCAddress(); + } else { + await this.stopOscServer(); + } + return enabled; + }), + switchMap((enabled) => + enabled ? interval(1000).pipe(switchMap(() => this.fetchVRChatOSCAddress())) : EMPTY + ) + ) + .subscribe(); } private async startOscServer(): Promise<{ oscAddress: string; oscQueryAddress: string } | null> { @@ -89,6 +116,7 @@ export class OscService { private async stopOscServer(): Promise { this._oscServerAddress.next(null); + this._oscQueryServerAddress.next(null); await invoke('stop_osc_server'); } @@ -163,11 +191,6 @@ export class OscService { this._vrchatOscQueryAddress.next(oscquery_address); } - async restartOscServer() { - await this.stopOscServer(); - await this.startOscServer(); - } - private mapToOscMethod(method: OscMethod): { address: string; adType: 'Write' | 'Read' | 'ReadWrite'; diff --git a/src-ui/app/views/dashboard-view/views/settings-advanced-view/settings-advanced-view.component.html b/src-ui/app/views/dashboard-view/views/settings-advanced-view/settings-advanced-view.component.html index 8877ebac..26d47d4f 100644 --- a/src-ui/app/views/dashboard-view/views/settings-advanced-view/settings-advanced-view.component.html +++ b/src-ui/app/views/dashboard-view/views/settings-advanced-view/settings-advanced-view.component.html @@ -143,20 +143,6 @@

settings.advanced.fixes.title

-
-
- settings.advanced.fixes.oscRestart.title - settings.advanced.fixes.oscRestart.description -
-
- -
-
settings.advanced.fixes.memoryWatcher.title @@ -186,6 +172,22 @@

settings.advanced.fixes.title

+
+
+ settings.advanced.fixes.oscServerEnabled.title + settings.advanced.fixes.oscServerEnabled.description +
+
+ +
+
diff --git a/src-ui/app/views/dashboard-view/views/settings-advanced-view/settings-advanced-view.component.ts b/src-ui/app/views/dashboard-view/views/settings-advanced-view/settings-advanced-view.component.ts index 8d24875e..330360b0 100644 --- a/src-ui/app/views/dashboard-view/views/settings-advanced-view/settings-advanced-view.component.ts +++ b/src-ui/app/views/dashboard-view/views/settings-advanced-view/settings-advanced-view.component.ts @@ -27,12 +27,13 @@ import { relaunch } from '@tauri-apps/api/process'; import { EventLogService } from '../../../../services/event-log.service'; import { appLogDir } from '@tauri-apps/api/path'; import { IPCService } from '../../../../services/ipc.service'; -import { firstValueFrom } from 'rxjs'; +import { distinctUntilChanged, firstValueFrom, map } from 'rxjs'; import { SetDebugTranslationsRequest } from '../../../../../../src-grpc-web-client/overlay-sidecar_pb'; import { OpenVRService } from 'src-ui/app/services/openvr.service'; import { AppSettingsService } from '../../../../services/app-settings.service'; import { OscService } from '../../../../services/osc.service'; import { FLAVOUR } from '../../../../../build'; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @Component({ selector: 'app-settings-advanced-view', @@ -58,6 +59,7 @@ export class SettingsAdvancedViewComponent { ]; checkedPersistentStorageItems: string[] = []; memoryWatcherActive = FLAVOUR === 'DEV'; + oscServerEnabled = true; constructor( private router: Router, @@ -69,7 +71,17 @@ export class SettingsAdvancedViewComponent { private destroyRef: DestroyRef, private settingsService: AppSettingsService, private oscService: OscService - ) {} + ) { + this.settingsService.settings + .pipe( + takeUntilDestroyed(), + map((s) => s.oscServerEnabled), + distinctUntilChanged() + ) + .subscribe((oscServerEnabled) => { + this.oscServerEnabled = oscServerEnabled; + }); + } isPersistentStorageItemChecked(key: string) { if (key === 'ALL') { @@ -291,30 +303,6 @@ export class SettingsAdvancedViewComponent { protected readonly open = open; - async restartOscServer() { - try { - await this.oscService.restartOscServer(); - } catch (e) { - error('[AdvancedSettings] Could not restart OSC Server: ' + e); - this.modalService - .addModal(ConfirmModalComponent, { - title: 'settings.advanced.fixes.oscRestart.modal.error.title', - message: 'settings.advanced.fixes.oscRestart.modal.error.message', - showCancel: false, - }) - .subscribe(); - return; - } - error('[AdvancedSettings] Restarted OSC Server'); - this.modalService - .addModal(ConfirmModalComponent, { - title: 'settings.advanced.fixes.oscRestart.modal.success.title', - message: 'settings.advanced.fixes.oscRestart.modal.success.message', - showCancel: false, - }) - .subscribe(); - } - async activateMemoryWatcher() { this.memoryWatcherActive = true; if (await invoke('activate_memory_watcher')) { @@ -339,4 +327,10 @@ export class SettingsAdvancedViewComponent { async openDevTools() { await invoke('open_dev_tools'); } + + setOscServerEnabled(enabled: boolean) { + this.settingsService.updateSettings({ + oscServerEnabled: enabled, + }); + } } diff --git a/src-ui/assets/i18n/en.json b/src-ui/assets/i18n/en.json index 1c3de426..69d8987a 100644 --- a/src-ui/assets/i18n/en.json +++ b/src-ui/assets/i18n/en.json @@ -1164,21 +1164,6 @@ } } }, - "oscRestart": { - "title": "Restart OSC- & OSCQuery services", - "description": "Troubleshoot OSC communication by stopping and restarting the internal OSC- and OSCQuery services", - "action": "Restart Services", - "modal": { - "error": { - "title": "Restart Failed", - "message": "Something went wrong while trying to restart the OSC- and OSCQuery services. Please check the logs and contact a developer." - }, - "success": { - "title": "Restart Complete", - "message": "The internal OSC- and OSCQuery services have been restarted." - } - } - }, "devTools": { "title": "Open Developer Tools", "description": "Opens the Edge Developer Tools, for debugging purposes", @@ -1198,6 +1183,10 @@ "message": "The memory watcher has been activated!" } } + }, + "oscServerEnabled": { + "title": "Enable OSC & OSCQuery Servers", + "description": "Turning this off disables the built-in OSC and OSCQuery servers. This option persists between restarts. Note that several features of OyasumiVR will stop working if you turn this off, with no warnings. This option purely exists for debugging purposes and should not be turned off during general use." } } }, diff --git a/src-ui/assets/i18n/ko.json b/src-ui/assets/i18n/ko.json index 0106c896..a470c031 100644 --- a/src-ui/assets/i18n/ko.json +++ b/src-ui/assets/i18n/ko.json @@ -1117,21 +1117,6 @@ "advanced": { "fixes": { "description": "이 섹션에서는 문제 해결 및 문제 해결과 관련된 몇 가지 옵션과 조치를 설명해요. 일반적으로 자신이 무엇을 하고 있는지 모르거나 지원을 받을 때 이러한 조치를 사용하라는 요청을 받지 않는 한 이러한 조치를 사용해서는 안 됩니다.", - "oscRestart": { - "action": "서비스 재시작", - "description": "내부 OSC- 및 OSCQuery 서비스를 중지했다가 다시 시작하여 OSC 통신 문제를 해결합니다.", - "modal": { - "error": { - "message": "OSC- 및 OSCQuery 서비스를 다시 시작하는 동안 문제가 발생하였어요. 로그를 확인하시고 개발자에게 문의해주세요.", - "title": "재시작 실패" - }, - "success": { - "message": "내부 OSC- 및 OSCQuery 서비스가 다시 시작되었어요.", - "title": "재시작 완료" - } - }, - "title": "OSC- & OSCQuery 서비스 재시작" - }, "title": "수정 및 문제 해결", "vrManifestReregister": { "action": "매니페스트 재등록",