From 335c1e1c68ad8211fa9bc46bfbc92fa23becde6a Mon Sep 17 00:00:00 2001 From: tudor <7089284+tudddorrr@users.noreply.github.com> Date: Mon, 12 Oct 2026 18:30:05 +0100 Subject: [PATCH] add props support to player relationship subscriptions --- .../Runtime/APIs/PlayerRelationshipsAPI.cs | 63 +++++++++++++++++-- .../Entities/PlayerAliasSubscription.cs | 2 +- .../PlayerRelationshipsSubscribeToRequest.cs | 1 + .../PlayerRelationshipsUpdatePropsRequest.cs | 10 +++ ...yerRelationshipsUpdatePropsRequest.cs.meta | 2 + .../Scripts/SubscriptionsManager.cs | 4 +- 6 files changed, 74 insertions(+), 8 deletions(-) create mode 100644 Assets/Talo Game Services/Talo/Runtime/Requests/PlayerRelationshipsUpdatePropsRequest.cs create mode 100644 Assets/Talo Game Services/Talo/Runtime/Requests/PlayerRelationshipsUpdatePropsRequest.cs.meta diff --git a/Assets/Talo Game Services/Talo/Runtime/APIs/PlayerRelationshipsAPI.cs b/Assets/Talo Game Services/Talo/Runtime/APIs/PlayerRelationshipsAPI.cs index aca679cd..c0deee08 100644 --- a/Assets/Talo Game Services/Talo/Runtime/APIs/PlayerRelationshipsAPI.cs +++ b/Assets/Talo Game Services/Talo/Runtime/APIs/PlayerRelationshipsAPI.cs @@ -174,19 +174,58 @@ public void Broadcast(string message) Talo.Socket.Send(new SocketRequest("v1.player-relationships.broadcast", payload)); } - public async Task SubscribeTo(int playerAliasId, RelationshipType relationshipType) + public async Task SubscribeTo(int playerAliasId, RelationshipType relationshipType, params (string, string)[] propTuples) { Talo.IdentityCheck(); var request = new PlayerRelationshipsSubscribeToRequest { aliasId = playerAliasId, - relationshipType = PlayerAliasSubscription.RelationshipTypeToString(relationshipType) + relationshipType = PlayerAliasSubscription.RelationshipTypeToString(relationshipType), + props = propTuples.Select((propTuple) => new Prop(propTuple)).ToArray() }; - var json = await Call(GetUri(), "POST", JsonUtility.ToJson(request)); - var response = JsonUtility.FromJson(json); - return response.subscription; + try + { + var json = await Call(GetUri(), "POST", Prop.SanitiseJson(JsonUtility.ToJson(request))); + var response = JsonUtility.FromJson(json); + + return new SubscriptionUpsertResult(true, response.subscription); + } + catch (RequestException ex) + { + if (ex.IsBadRequest()) + { + return new SubscriptionUpsertResult(false, null, RejectedProp.FromJson(ex.responseBody)); + } + throw; + } + } + + public async Task UpdateSubscriptionProps(int subscriptionId, params (string, string)[] propTuples) + { + Talo.IdentityCheck(); + + var request = new PlayerRelationshipsUpdatePropsRequest + { + props = propTuples.Select((propTuple) => new Prop(propTuple)).ToArray() + }; + + try + { + var json = await Call(new Uri($"{baseUrl}/{subscriptionId}"), "PATCH", Prop.SanitiseJson(JsonUtility.ToJson(request))); + var response = JsonUtility.FromJson(json); + + return new SubscriptionUpsertResult(true, response.subscription); + } + catch (RequestException ex) + { + if (ex.IsBadRequest()) + { + return new SubscriptionUpsertResult(false, null, RejectedProp.FromJson(ex.responseBody)); + } + throw; + } } public async Task RevokeSubscription(int subscriptionId) @@ -279,5 +318,19 @@ public async Task GetSubscriptions var json = await Call(uri, "GET"); return JsonUtility.FromJson(json); } + + public class SubscriptionUpsertResult + { + public bool Success { get; } + public PlayerAliasSubscription Subscription { get; } + public RejectedProp[] RejectedProps { get; } + + public SubscriptionUpsertResult(bool success, PlayerAliasSubscription subscription, RejectedProp[] rejectedProps = null) + { + Success = success; + Subscription = subscription; + RejectedProps = rejectedProps ?? Array.Empty(); + } + } } } diff --git a/Assets/Talo Game Services/Talo/Runtime/Entities/PlayerAliasSubscription.cs b/Assets/Talo Game Services/Talo/Runtime/Entities/PlayerAliasSubscription.cs index eb5ad9a3..6e2054d0 100644 --- a/Assets/Talo Game Services/Talo/Runtime/Entities/PlayerAliasSubscription.cs +++ b/Assets/Talo Game Services/Talo/Runtime/Entities/PlayerAliasSubscription.cs @@ -9,7 +9,7 @@ public enum RelationshipType } [Serializable] - public class PlayerAliasSubscription + public class PlayerAliasSubscription : EntityWithProps { public int id; public PlayerAlias subscriber; diff --git a/Assets/Talo Game Services/Talo/Runtime/Requests/PlayerRelationshipsSubscribeToRequest.cs b/Assets/Talo Game Services/Talo/Runtime/Requests/PlayerRelationshipsSubscribeToRequest.cs index c935873c..eb901ae1 100644 --- a/Assets/Talo Game Services/Talo/Runtime/Requests/PlayerRelationshipsSubscribeToRequest.cs +++ b/Assets/Talo Game Services/Talo/Runtime/Requests/PlayerRelationshipsSubscribeToRequest.cs @@ -7,5 +7,6 @@ public class PlayerRelationshipsSubscribeToRequest { public int aliasId; public string relationshipType; + public Prop[] props; } } diff --git a/Assets/Talo Game Services/Talo/Runtime/Requests/PlayerRelationshipsUpdatePropsRequest.cs b/Assets/Talo Game Services/Talo/Runtime/Requests/PlayerRelationshipsUpdatePropsRequest.cs new file mode 100644 index 00000000..e418a68e --- /dev/null +++ b/Assets/Talo Game Services/Talo/Runtime/Requests/PlayerRelationshipsUpdatePropsRequest.cs @@ -0,0 +1,10 @@ +using System; + +namespace TaloGameServices +{ + [Serializable] + public class PlayerRelationshipsUpdatePropsRequest + { + public Prop[] props; + } +} diff --git a/Assets/Talo Game Services/Talo/Runtime/Requests/PlayerRelationshipsUpdatePropsRequest.cs.meta b/Assets/Talo Game Services/Talo/Runtime/Requests/PlayerRelationshipsUpdatePropsRequest.cs.meta new file mode 100644 index 00000000..32f97f9f --- /dev/null +++ b/Assets/Talo Game Services/Talo/Runtime/Requests/PlayerRelationshipsUpdatePropsRequest.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 34ad4b14b0e5041c6b9e776b48a23c15 \ No newline at end of file diff --git a/Assets/Talo Game Services/Talo/Samples/FriendsDemo/Scripts/SubscriptionsManager.cs b/Assets/Talo Game Services/Talo/Samples/FriendsDemo/Scripts/SubscriptionsManager.cs index 426624e4..dec5a5b2 100644 --- a/Assets/Talo Game Services/Talo/Samples/FriendsDemo/Scripts/SubscriptionsManager.cs +++ b/Assets/Talo Game Services/Talo/Samples/FriendsDemo/Scripts/SubscriptionsManager.cs @@ -52,8 +52,8 @@ public async Task LoadOutgoingRequests() public async Task SendFriendRequest(PlayerAlias alias) { - var subscription = await Talo.PlayerRelationships.SubscribeTo(alias.id, RelationshipType.Bidirectional); - return subscription != null; + var result = await Talo.PlayerRelationships.SubscribeTo(alias.id, RelationshipType.Bidirectional); + return result.Success; } public async Task AcceptFriendRequest(PlayerAlias alias)