Skip to content

Commit 89e152a

Browse files
committed
Merge branch 'dev'
2 parents fc5ab1e + c1c0059 commit 89e152a

10 files changed

Lines changed: 120 additions & 175 deletions

File tree

VRCOSC.App/OSC/VRChat/VRChatOscClient.cs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
using VRCOSC.App.OSC.Query;
1212
using VRCOSC.App.SDK.Parameters;
1313
using VRCOSC.App.Settings;
14+
using VRCOSC.App.Utils;
1415

1516
namespace VRCOSC.App.OSC.VRChat;
1617

@@ -122,15 +123,18 @@ private static void auditNode(OSCQueryNode node, List<VRChatParameter> parameter
122123
{
123124
var rawName = node.FullPath[(VRChatOSCConstants.ADDRESS_AVATAR_PARAMETERS.Length + 1)..];
124125

125-
VRChatParameter parameter = node.OscType switch
126+
VRChatParameter? parameter = node.OscType switch
126127
{
127128
"f" => new VRChatParameter(rawName, (float)(double)node.Value[0]),
128129
"i" => new VRChatParameter(rawName, (int)(long)node.Value[0]),
129130
"T" => new VRChatParameter(rawName, (bool)node.Value[0]), // T gets returned for true and false
130-
_ => throw new InvalidOperationException($"Unknown type '{node.OscType}'")
131+
_ => null
131132
};
132133

133-
parameters.Add(parameter);
134+
if (parameter is null)
135+
Logger.Error(new Exception($"Invalid type '{node.OscType}' for OSCQuery node {node.FullPath}"), "Error encountered when auditing nodes");
136+
else
137+
parameters.Add(parameter);
134138
}
135139

136140
if (node.Contents is null) return;

VRCOSC.App/Packages/PackageManager.cs

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,6 @@ public PackageManager()
5858
SettingsManager.GetInstance().GetObservable<bool>(VRCOSCSetting.AllowPreReleasePackages).Subscribe(() => MainWindow.GetInstance().PackagesView.Refresh());
5959
}
6060

61-
public PackageSource? GetPackage(string packageID) => Sources.FirstOrDefault(packageSource => packageSource.PackageID == packageID);
62-
public PackageSource? GetPackageSourceForRelease(PackageRelease packageRelease) => Sources.FirstOrDefault(packageSource => packageSource.FilteredReleases.Contains(packageRelease));
63-
6461
public async Task Load()
6562
{
6663
builtinSources.ForEach(source => Sources.Add(source));
@@ -86,25 +83,21 @@ public async Task RefreshAllSources(bool forceRemoteGrab)
8683
await Task.WhenAll(tasks);
8784

8885
if (forceRemoteGrab) CacheExpireTime = DateTime.Now + TimeSpan.FromDays(1);
89-
serialisationManager.Serialise();
90-
MainWindow.GetInstance().PackagesView.Refresh();
9186
}
9287

93-
public bool AnyInstalledPackageUpdates(bool includePreRelease) => Sources.Where(source => source.IsInstalled()).Any(packageSource => packageSource.GetLatestPackages(includePreRelease) is not null);
94-
9588
public async Task UpdateAllInstalledPackages(bool includePreRelease)
9689
{
9790
var tasks = Sources.Where(source => source.IsInstalled()).Select(packageSource =>
9891
{
99-
var latestRelease = packageSource.GetLatestPackages(includePreRelease);
100-
return latestRelease is null ? Task.CompletedTask : InstallPackage(packageSource, latestRelease, false, false);
92+
var updateRelease = packageSource.GetUpdateRelease(includePreRelease);
93+
return updateRelease is null ? Task.CompletedTask : InstallPackage(packageSource, updateRelease, false, false, false);
10194
});
10295

10396
await Task.WhenAll(tasks);
104-
105-
serialisationManager.Serialise();
10697
}
10798

99+
public void Serialise() => serialisationManager.Serialise();
100+
108101
public async Task<bool> InstallPackage(PackageSource packageSource, PackageRelease? packageRelease = null, bool reloadAll = true, bool refreshBeforeInstall = true, bool closeWindows = true)
109102
{
110103
if (!packageSource.IsAvailable()) return false;
@@ -117,7 +110,7 @@ public async Task<bool> InstallPackage(PackageSource packageSource, PackageRelea
117110
}
118111
}
119112

120-
if (IsInstalled(packageSource)) storage.DeleteDirectory(packageSource.PackageID!);
113+
storage.DeleteDirectory(packageSource.PackageID!);
121114
if (refreshBeforeInstall) await packageSource.Refresh(true);
122115

123116
var targetDirectory = storage.GetStorageForDirectory(packageSource.PackageID!);
@@ -126,8 +119,7 @@ public async Task<bool> InstallPackage(PackageSource packageSource, PackageRelea
126119
Logger.Log($"Installing {packageSource.InternalReference}");
127120

128121
await downloadRelease(packageSource, release, targetDirectory);
129-
130-
InstalledPackages[packageSource.PackageID!] = packageRelease?.Version ?? packageSource.LatestVersion;
122+
InstalledPackages[packageSource.PackageID!] = release.Version;
131123

132124
if (reloadAll)
133125
{

VRCOSC.App/Packages/PackageSource.cs

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,27 @@ public class PackageSource
3535
public PackageSourceState State { get; private set; } = PackageSourceState.Unknown;
3636
public string? PackageID => Repository?.PackageFile?.PackageID;
3737
public string LatestVersion => LatestRelease.Version;
38-
public PackageRelease LatestRelease => filterReleases(false, true).First();
38+
public PackageRelease LatestRelease => filterReleases(true, true).First();
3939
public PackageRelease? InstalledRelease => FilteredReleases.SingleOrDefault(packageRelease => packageRelease.Version == InstalledVersion);
4040

4141
public List<PackageRelease> FilteredReleases => filterReleases(true, true);
4242

43-
private List<PackageRelease> filterReleases(bool includeInstalledRelease, bool includePreReleases) =>
44-
Repository!.Releases.Where(packageRelease => SettingsManager.GetInstance().GetValue<bool>(VRCOSCSetting.AllowPreReleasePackages) && packageRelease.IsPreRelease && includePreReleases
45-
|| !packageRelease.IsPreRelease
46-
|| packageRelease.Version == InstalledVersion && includeInstalledRelease).ToList();
43+
private List<PackageRelease> filterReleases(bool includeInstalledRelease, bool includePreReleases)
44+
{
45+
var allowPreReleasePackages = SettingsManager.GetInstance().GetValue<bool>(VRCOSCSetting.AllowPreReleasePackages);
46+
var installedVersion = InstalledVersion;
47+
48+
return Repository!.Releases.Where(release =>
49+
{
50+
if (release.Version == installedVersion && !includeInstalledRelease)
51+
return false;
52+
53+
if (release.IsPreRelease && !(allowPreReleasePackages && includePreReleases))
54+
return false;
55+
56+
return true;
57+
}).ToList();
58+
}
4759

4860
public bool IsInstalled() => PackageManager.GetInstance().IsInstalled(this);
4961

@@ -56,7 +68,7 @@ public bool IsUpdateAvailable()
5668
return SemVersion.ComparePrecedence(latestVersion, installedVersion) == 1;
5769
}
5870

59-
public PackageRelease? GetLatestPackages(bool includePreRelease)
71+
public PackageRelease? GetUpdateRelease(bool includePreRelease)
6072
{
6173
var latestRelease = filterReleases(true, includePreRelease).FirstOrDefault();
6274
if (latestRelease is null) return null;

VRCOSC.App/SDK/Providers/PiShock/LegacyPiShock.cs

Lines changed: 0 additions & 57 deletions
This file was deleted.

VRCOSC.App/SDK/Providers/PiShock/PiShockProvider.cs

Lines changed: 13 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
using System.IO.Ports;
88
using System.Linq;
99
using System.Net.Http;
10-
using System.Text;
1110
using System.Text.Json;
1211
using System.Text.Json.Serialization;
1312
using System.Threading;
@@ -61,7 +60,7 @@ public async Task<bool> Initialise()
6160
if (!refreshClientResult) return false;
6261

6362
var refreshShockersResult = await populateAvailableShockers();
64-
if (!refreshShockersResult) return false;
63+
if (!refreshShockersResult.IsSuccess) return false;
6564

6665
webSocket = new WebSocketClient($"{broker_endpoint}?Username={username}&ApiKey={apiKey}", 2000, 3);
6766
webSocket.OnWsDisconnected += () => initialised = false;
@@ -116,7 +115,7 @@ private async Task<bool> authenticateUser()
116115
{
117116
var authResult = await PiShockRequestFactory.AuthenticateUser(username, apiKey);
118117

119-
if (!authResult)
118+
if (!authResult.IsSuccess)
120119
{
121120
Logger.Error(authResult.Exception, $"Error in {nameof(PiShockProvider)}");
122121
userId = -1;
@@ -132,7 +131,7 @@ private async Task<bool> populateClientId()
132131
{
133132
var devicesResult = await PiShockRequestFactory.GetUserDevices(userId, apiKey);
134133

135-
if (!devicesResult)
134+
if (!devicesResult.IsSuccess)
136135
{
137136
Logger.Error(devicesResult.Exception, $"Error in {nameof(PiShockProvider)}");
138137
clientId = -1;
@@ -144,14 +143,14 @@ private async Task<bool> populateClientId()
144143
return true;
145144
}
146145

147-
private async Task<bool> populateAvailableShockers()
146+
private async Task<Result> populateAvailableShockers()
148147
{
149148
var shareIDResult = await PiShockRequestFactory.GetShareCodesByOwner(userId, apiKey);
150149

151-
if (!shareIDResult)
150+
if (!shareIDResult.IsSuccess)
152151
{
153152
Logger.Error(shareIDResult.Exception, $"Error in {nameof(PiShockProvider)}");
154-
return false;
153+
return shareIDResult.Exception;
155154
}
156155

157156
var shareIDs = shareIDResult.Value;
@@ -161,10 +160,10 @@ private async Task<bool> populateAvailableShockers()
161160

162161
var localAvailableShockersResult = await getShockersFromShareIds(shareIDs.SelectMany(pair => pair.Value));
163162

164-
if (!localAvailableShockersResult)
163+
if (!localAvailableShockersResult.IsSuccess)
165164
{
166165
Logger.Error(localAvailableShockersResult.Exception, $"Error in {nameof(PiShockProvider)}");
167-
return false;
166+
return localAvailableShockersResult.Exception;
168167
}
169168

170169
var localAvailableShockers = localAvailableShockersResult.Value;
@@ -182,7 +181,7 @@ private async Task<Result<PiShockShocker[]>> getShockersFromShareIds(IEnumerable
182181
{
183182
var devicesResult = await PiShockRequestFactory.GetShockersByShareIDs(userId, apiKey, shareIds);
184183

185-
if (!devicesResult)
184+
if (!devicesResult.IsSuccess)
186185
{
187186
Logger.Error(devicesResult.Exception, $"Error in {nameof(PiShockProvider)}");
188187
return devicesResult.Exception;
@@ -347,16 +346,13 @@ public async Task<PiShockResult> ExecuteAsync(IEnumerable<string> shareCodes, Pi
347346
var shareCodeArray = shareCodes.ToArray();
348347
var missingShareCodes = shareCodeArray.Where(code => availableShockers.All(shocker => shocker.ShareCode != code)).ToArray();
349348

350-
foreach (var code in missingShareCodes)
351-
{
352-
var claimed = await claimShareCode(code);
353-
if (!claimed.Success) return claimed;
354-
}
355-
356349
if (missingShareCodes.Length != 0)
357350
{
351+
var claimed = await PiShockRequestFactory.ClaimSharecodes(username, apiKey, missingShareCodes);
352+
if (!claimed.IsSuccess) return new PiShockResult(false, claimed.Exception.ToString());
353+
358354
var refreshResult = await populateAvailableShockers();
359-
if (!refreshResult) return new PiShockResult(false, $"{nameof(PiShockProvider)} cannot execute due to an error when refreshing shockers");
355+
if (!refreshResult.IsSuccess) return new PiShockResult(false, $"{nameof(PiShockProvider)} cannot execute due to an error when refreshing shockers\n{refreshResult.Exception}");
360356
}
361357

362358
foreach (var shareCode in shareCodeArray)
@@ -417,58 +413,4 @@ private async Task executeAsync(string channel, IEnumerable<int> shockerIds, PiS
417413

418414
await webSocket!.SendAsync(content);
419415
}
420-
421-
private async Task<PiShockResult> claimShareCode(string shareCode)
422-
{
423-
try
424-
{
425-
var shocker = await legacyRetrieveShockerInfo(shareCode);
426-
if (shocker is null) return new PiShockResult(false, $"Shocker for sharecode '{shareCode}' does not exist");
427-
428-
var request = new LegacyPiShockVibrateActionRequest
429-
{
430-
Duration = "1",
431-
Intensity = "1",
432-
AppName = $"{AppManager.APP_NAME}-{username}",
433-
Username = username,
434-
ApiKey = apiKey,
435-
ShareCode = shareCode
436-
};
437-
438-
var response = await httpClient.PostAsync("https://ps.pishock.com/pishock/operate", new StringContent(JsonSerializer.Serialize(request, serialiserOptions), Encoding.UTF8, "application/json"));
439-
response.EnsureSuccessStatusCode();
440-
441-
var responseString = await response.Content.ReadAsStringAsync();
442-
return new PiShockResult(responseString.Contains("Succeeded") || responseString.Contains("Attempted"), responseString);
443-
}
444-
catch (Exception e)
445-
{
446-
Logger.Error(e, $"{nameof(PiShockProvider)} has experienced an exception when claiming sharecode '{shareCode}'");
447-
return new PiShockResult(false, $"{nameof(PiShockProvider)} has experienced an exception when claiming sharecode '{shareCode}'");
448-
}
449-
}
450-
451-
private async Task<LegacyPiShockShocker?> legacyRetrieveShockerInfo(string shareCode)
452-
{
453-
try
454-
{
455-
var request = new LegacyPiShockShockerInfoRequest
456-
{
457-
Username = username,
458-
ApiKey = apiKey,
459-
ShareCode = shareCode
460-
};
461-
462-
var response = await httpClient.PostAsync("https://do.pishock.com/api/GetShockerInfo", new StringContent(JsonSerializer.Serialize(request, serialiserOptions), Encoding.UTF8, "application/json"));
463-
response.EnsureSuccessStatusCode();
464-
465-
var responseString = await response.Content.ReadAsStringAsync();
466-
return JsonSerializer.Deserialize<LegacyPiShockShocker>(responseString);
467-
}
468-
catch (Exception e)
469-
{
470-
Logger.Error(e, $"{nameof(PiShockProvider)} has experienced an exception when retrieving legacy shocker info for sharecode '{shareCode}'");
471-
return null;
472-
}
473-
}
474416
}

0 commit comments

Comments
 (0)