@@ -24,17 +24,20 @@ class LauncherViewModel: ObservableObject {
2424 " ScreenEdgeScrollEnabledInWindowedApp " : valStr,
2525 " CursorCaptureEnabledInWindowedGame " : isWindowedEdgeScrollEnabled ? " yes " : " no "
2626 ] )
27+ reportSettingChange ( " windowed_edge_scroll " , isWindowedEdgeScrollEnabled)
2728 }
2829 }
2930 @Published var showHotkeyLabels : Bool = SettingsDefaults . showHotkeyLabels {
3031 didSet {
3132 OptionsIniHelper . writeValue ( value: showHotkeyLabels ? " yes " : " no " , forKey: " ShowHotKeyLabels " )
33+ reportSettingChange ( " hotkey_labels " , showHotkeyLabels)
3234 }
3335 }
3436 @Published var gameLanguage : String = SettingsDefaults . gameLanguage {
3537 didSet {
3638 guard !isInitializing else { return }
3739 OptionsIniHelper . writeValue ( value: gameLanguage, forKey: " Language " )
40+ reportSettingChange ( " game_language " , gameLanguage)
3841 }
3942 }
4043
@@ -51,23 +54,35 @@ class LauncherViewModel: ObservableObject {
5154
5255 // settings.json render settings
5356 @Published var limitFramerate : Bool = SettingsDefaults . limitFramerate {
54- didSet { saveSettings ( ) }
57+ didSet {
58+ saveSettings ( )
59+ reportSettingChange ( " limit_framerate " , limitFramerate)
60+ }
5561 }
5662 @Published var fpsLimit : Double = SettingsDefaults . fpsLimit {
5763 didSet { saveSettings ( ) }
5864 }
5965 @Published var statsOverlay : Bool = SettingsDefaults . statsOverlay {
60- didSet { saveSettings ( ) }
66+ didSet {
67+ saveSettings ( )
68+ reportSettingChange ( " stats_overlay " , statsOverlay)
69+ }
6170 }
6271
6372 // settings.json network settings
6473 @Published var useAlternativeEndpoint : Bool = SettingsDefaults . useAlternativeEndpoint {
65- didSet { saveSettings ( ) }
74+ didSet {
75+ saveSettings ( )
76+ reportSettingChange ( " alternative_endpoint " , useAlternativeEndpoint)
77+ }
6678 }
6779
6880 // settings.json debug settings
6981 @Published var verboseLogging : Bool = SettingsDefaults . verboseLogging {
70- didSet { saveSettings ( ) }
82+ didSet {
83+ saveSettings ( )
84+ reportSettingChange ( " verbose_logging " , verboseLogging)
85+ }
7186 }
7287
7388 var steamCMD = SteamCMDManager ( )
@@ -135,13 +150,21 @@ class LauncherViewModel: ObservableObject {
135150
136151 self . isInitializing = false
137152 updateChecker. startPeriodicChecks ( )
153+
154+ Analytics . logOpen ( uiLanguage: selectedLanguage)
155+ Analytics . logSettingsSnapshot ( self )
138156 }
139157
140158 func saveCredentials( ) {
141159 guard !steamUsername. isEmpty, !steamPassword. isEmpty else { return }
142160 KeychainHelper . save ( account: steamUsername, password: steamPassword)
143161 }
144162
163+ private func reportSettingChange( _ key: String , _ value: Any ) {
164+ guard !isInitializing else { return }
165+ Analytics . logSettingChanged ( key, value: value)
166+ }
167+
145168 private func saveSettings( ) {
146169 guard !isInitializing else { return }
147170 SettingsJsonHelper . writeSettings (
@@ -244,6 +267,7 @@ class LauncherViewModel: ObservableObject {
244267 }
245268
246269 func confirmPatching( ) {
270+ Analytics . logPatchStarted ( source: activeTab. rawValue)
247271 switch activeTab {
248272 case . steam:
249273 assetPatcher. startPatching ( rootDir: steamCMD. installDir, zhDir: steamCMD. assetsDir)
@@ -280,6 +304,8 @@ class LauncherViewModel: ObservableObject {
280304 do {
281305 try task. run ( )
282306
307+ Analytics . logGameLaunched ( )
308+
283309 DispatchQueue . global ( ) . async {
284310 Thread . sleep ( forTimeInterval: 0.5 )
285311 DispatchQueue . main. async {
0 commit comments