22using CollapseLauncher . Helper . JsonConverter ;
33using CollapseLauncher . Helper . LauncherApiLoader ;
44using CollapseLauncher . Helper . LauncherApiLoader . HoYoPlay ;
5+ using CollapseLauncher . Interfaces . Class ;
56using Hi3Helper ;
67using Hi3Helper . Data ;
78using Hi3Helper . EncTool ;
@@ -241,46 +242,45 @@ internal static class PresetConfigExt
241242 string launcherIdOrPasswordHead , string gameIdOrGamePackageIdHead ,
242243 string ? launcherIdOrPassword , string ? gameIdOrGamePackageId )
243244 {
244- if ( string . IsNullOrEmpty ( url ) )
245+ if ( string . IsNullOrEmpty ( url )
246+ || string . IsNullOrEmpty ( launcherIdOrPassword )
247+ || string . IsNullOrEmpty ( gameIdOrGamePackageId ) )
245248 return url ;
246249
247- if ( string . IsNullOrEmpty ( launcherIdOrPassword ) || string . IsNullOrEmpty ( gameIdOrGamePackageId ) )
248- return url ;
249-
250- int urlLen = url . Length + ( 1 << 10 ) ;
251- char [ ] urlBuffer = ArrayPool < char > . Shared . Rent ( urlLen ) ;
252- Span < char > urlSpanBuffer = urlBuffer ;
253- ReadOnlySpan < char > urlSpan = url ;
250+ int urlLen = url . Length + ( 1 << 10 ) ;
251+ char [ ] urlBuffer = ArrayPool < char > . Shared . Rent ( urlLen ) ;
252+ Span < char > urlSpanBuffer = urlBuffer ;
253+ ReadOnlySpan < char > urlSpan = url ;
254254
255255 try
256256 {
257- int urlSpanBufferLen = 0 ;
258- Span < Range > splitRanges = stackalloc Range [ 32 ] ;
259- int urlSplitRangesLen = urlSpan . Split ( splitRanges , '?' , StringSplitOptions . RemoveEmptyEntries ) ;
257+ int urlSpanBufferLen = 0 ;
258+ Span < Range > splitRanges = stackalloc Range [ 32 ] ;
259+ int urlSplitRangesLen = urlSpan . Split ( splitRanges , '?' , StringSplitOptions . RemoveEmptyEntries ) ;
260260 if ( urlSplitRangesLen < 2 )
261261 return url ;
262262
263263 ReadOnlySpan < char > urlPathSpan = urlSpan [ splitRanges [ 0 ] ] ;
264- ReadOnlySpan < char > querySpan = urlSpan [ splitRanges [ 1 ] ] ;
264+ ReadOnlySpan < char > querySpan = urlSpan [ splitRanges [ 1 ] ] ;
265265
266266 if ( ! urlPathSpan . TryCopyTo ( urlSpanBuffer ) )
267267 throw new InvalidOperationException ( "Failed to copy url path string to buffer" ) ;
268- urlSpanBufferLen += splitRanges [ 0 ] . End . Value - splitRanges [ 0 ] . Start . Value ;
269- urlSpanBuffer [ urlSpanBufferLen ++ ] = '?' ;
268+ urlSpanBufferLen += splitRanges [ 0 ] . End . Value - splitRanges [ 0 ] . Start . Value ;
269+ urlSpanBuffer [ urlSpanBufferLen ++ ] = '?' ;
270270
271271 #region Parse and split queries - Sanitize the GameId and GameId query
272272 int querySplitRangesLen = querySpan . Split ( splitRanges , '&' , StringSplitOptions . RemoveEmptyEntries ) ;
273273 int queryWritten = 0 ;
274274 Span < char > querySpanBuffer = urlSpanBuffer [ urlSpanBufferLen ..] ;
275275 for ( int i = querySplitRangesLen - 1 ; i > - 1 ; i -- )
276276 {
277- Range segmentRange = splitRanges [ i ] ;
278- int segmentLen = segmentRange . End . Value - segmentRange . Start . Value ;
277+ Range segmentRange = splitRanges [ i ] ;
278+ int segmentLen = segmentRange . End . Value - segmentRange . Start . Value ;
279279 ReadOnlySpan < char > querySegment = querySpan [ segmentRange ] ;
280280
281281 // Skip GameId or GameId query head
282- if ( querySegment . StartsWith ( launcherIdOrPasswordHead , StringComparison . OrdinalIgnoreCase )
283- || querySegment . StartsWith ( gameIdOrGamePackageIdHead , StringComparison . OrdinalIgnoreCase ) )
282+ if ( querySegment . StartsWith ( launcherIdOrPasswordHead , StringComparison . OrdinalIgnoreCase )
283+ || querySegment . StartsWith ( gameIdOrGamePackageIdHead , StringComparison . OrdinalIgnoreCase ) )
284284 continue ;
285285
286286 // Otherwise, add others
@@ -294,7 +294,7 @@ internal static class PresetConfigExt
294294
295295 // Append '&'
296296 if ( queryWritten > 0 && querySpanBuffer [ queryWritten - 1 ] != '&'
297- && querySpanBuffer [ queryWritten - 1 ] != '?' )
297+ && querySpanBuffer [ queryWritten - 1 ] != '?' )
298298 querySpanBuffer [ queryWritten ++ ] = '&' ;
299299
300300 urlSpanBufferLen += queryWritten ;
@@ -303,8 +303,8 @@ internal static class PresetConfigExt
303303 #region Append GameId and GameId query
304304 if ( ! launcherIdOrPasswordHead . TryCopyTo ( urlSpanBuffer [ urlSpanBufferLen ..] ) )
305305 throw new InvalidOperationException ( "Failed to copy launcher id or password head string to buffer" ) ;
306- urlSpanBufferLen += launcherIdOrPasswordHead . Length ;
307- urlSpanBuffer [ urlSpanBufferLen ++ ] = '=' ;
306+ urlSpanBufferLen += launcherIdOrPasswordHead . Length ;
307+ urlSpanBuffer [ urlSpanBufferLen ++ ] = '=' ;
308308 if ( ! launcherIdOrPassword . TryCopyTo ( urlSpanBuffer [ urlSpanBufferLen ..] ) )
309309 throw new InvalidOperationException ( "Failed to copy launcher id or password value string to buffer" ) ;
310310 urlSpanBufferLen += launcherIdOrPassword . Length ;
@@ -313,13 +313,13 @@ internal static class PresetConfigExt
313313
314314 if ( ! gameIdOrGamePackageIdHead . TryCopyTo ( urlSpanBuffer [ urlSpanBufferLen ..] ) )
315315 throw new InvalidOperationException ( "Failed to copy game id or package id head string to buffer" ) ;
316- urlSpanBufferLen += gameIdOrGamePackageIdHead . Length ;
317- urlSpanBuffer [ urlSpanBufferLen ++ ] = '=' ;
316+ urlSpanBufferLen += gameIdOrGamePackageIdHead . Length ;
317+ urlSpanBuffer [ urlSpanBufferLen ++ ] = '=' ;
318318 if ( ! gameIdOrGamePackageId . TryCopyTo ( urlSpanBuffer [ urlSpanBufferLen ..] ) )
319319 throw new InvalidOperationException ( "Failed to copy game id or package id value string to buffer" ) ;
320320 urlSpanBufferLen += gameIdOrGamePackageId . Length ;
321321
322- string returnString = new string ( urlBuffer , 0 , urlSpanBufferLen ) ;
322+ string returnString = new ( urlBuffer , 0 , urlSpanBufferLen ) ;
323323#if DEBUG
324324 LogWriteLine ( $ "URL string's GameId or Password and GameId or PackageId association has been successfully replaced!\r \n Source: { url } \r \n Result: { returnString } ", LogType . Debug , true ) ;
325325#endif
@@ -337,7 +337,8 @@ internal static class PresetConfigExt
337337 [ JsonSerializable ( typeof ( PresetConfig ) ) ]
338338 internal sealed partial class PresetConfigJsonContext : JsonSerializerContext ;
339339
340- public class PresetConfig
340+ [ GeneratedBindableCustomProperty ]
341+ public partial class PresetConfig : NotifyPropertyChanged
341342 {
342343 #region Constants
343344 // ReSharper disable once UnusedMember.Local
@@ -795,12 +796,8 @@ private void SetVoiceLanguageID_StarRail(int langID)
795796 if ( ! value . DataVersion . TryGetValue ( verInt , out GameDataVersion ? verData ) )
796797 {
797798 // Fallback to find the default value anyway
798- KeyValuePair < int , GameDataVersion > ? kvpTemp = value . DataVersion . FirstOrDefault ( ) ;
799- if ( kvpTemp == null )
800- return null ;
801-
802- // ReSharper disable once ConstantConditionalAccessQualifier
803- verData = kvpTemp ? . Value ;
799+ KeyValuePair < int , GameDataVersion > kvpTemp = value . DataVersion . FirstOrDefault ( ) ;
800+ verData = kvpTemp . Value ;
804801 }
805802
806803 if ( verData == null )
0 commit comments