From c74cd65e44a06146dd86b06539b67cde49b08fc1 Mon Sep 17 00:00:00 2001 From: MaxAndreassenRPM Date: Tue, 28 Nov 2023 16:49:11 +0000 Subject: [PATCH] feat: WIP refactor of lowest level CAC layer --- Runtime/AvatarCreator/AuthManager.cs | 14 ++--- Runtime/AvatarCreator/AvatarManager.cs | 20 +++---- Runtime/AvatarCreator/Data/Avatars.meta | 3 + Runtime/AvatarCreator/Data/Avatars/Avatar.cs | 9 +++ .../AvatarCreator/Data/Avatars/Avatar.cs.meta | 3 + .../Data/Avatars/AvatarTemplatesResponse.cs | 18 ++++++ .../Avatars/AvatarTemplatesResponse.cs.meta | 3 + .../Data/Avatars/CreateDraftAvatarResponse.cs | 7 +++ .../Avatars/CreateDraftAvatarResponse.cs.meta | 3 + .../Data/Avatars/UserAvatarResponse.cs | 16 ++++++ .../Data/Avatars/UserAvatarResponse.cs.meta | 3 + .../Data/Endpoints/AvatarEndpoints.cs | 12 +--- .../AvatarCreator/Data/Endpoints/Endpoints.cs | 4 +- Runtime/AvatarCreator/PartnerAssetsManager.cs | 8 +-- Runtime/AvatarCreator/TemplateFetcher.cs | 8 +-- ...{PartnerAssetsRequests.cs => AssetsApi.cs} | 39 ++----------- ...setsRequests.cs.meta => AssetsApi.cs.meta} | 0 .../{AuthenticationRequests.cs => AuthApi.cs} | 4 +- ...cationRequests.cs.meta => AuthApi.cs.meta} | 0 .../{AvatarAPIRequests.cs => AvatarApi.cs} | 55 +++++++++---------- ...rAPIRequests.cs.meta => AvatarApi.cs.meta} | 0 Runtime/AvatarCreator/WebRequests/ImageApi.cs | 24 ++++++++ .../WebRequests/ImageApi.cs.meta | 3 + 23 files changed, 151 insertions(+), 105 deletions(-) create mode 100644 Runtime/AvatarCreator/Data/Avatars.meta create mode 100644 Runtime/AvatarCreator/Data/Avatars/Avatar.cs create mode 100644 Runtime/AvatarCreator/Data/Avatars/Avatar.cs.meta create mode 100644 Runtime/AvatarCreator/Data/Avatars/AvatarTemplatesResponse.cs create mode 100644 Runtime/AvatarCreator/Data/Avatars/AvatarTemplatesResponse.cs.meta create mode 100644 Runtime/AvatarCreator/Data/Avatars/CreateDraftAvatarResponse.cs create mode 100644 Runtime/AvatarCreator/Data/Avatars/CreateDraftAvatarResponse.cs.meta create mode 100644 Runtime/AvatarCreator/Data/Avatars/UserAvatarResponse.cs create mode 100644 Runtime/AvatarCreator/Data/Avatars/UserAvatarResponse.cs.meta rename Runtime/AvatarCreator/WebRequests/{PartnerAssetsRequests.cs => AssetsApi.cs} (75%) rename Runtime/AvatarCreator/WebRequests/{PartnerAssetsRequests.cs.meta => AssetsApi.cs.meta} (100%) rename Runtime/AvatarCreator/WebRequests/{AuthenticationRequests.cs => AuthApi.cs} (97%) rename Runtime/AvatarCreator/WebRequests/{AuthenticationRequests.cs.meta => AuthApi.cs.meta} (100%) rename Runtime/AvatarCreator/WebRequests/{AvatarAPIRequests.cs => AvatarApi.cs} (81%) rename Runtime/AvatarCreator/WebRequests/{AvatarAPIRequests.cs.meta => AvatarApi.cs.meta} (100%) create mode 100644 Runtime/AvatarCreator/WebRequests/ImageApi.cs create mode 100644 Runtime/AvatarCreator/WebRequests/ImageApi.cs.meta diff --git a/Runtime/AvatarCreator/AuthManager.cs b/Runtime/AvatarCreator/AuthManager.cs index 7a4f2c9e..2c86f6ae 100644 --- a/Runtime/AvatarCreator/AuthManager.cs +++ b/Runtime/AvatarCreator/AuthManager.cs @@ -11,7 +11,7 @@ namespace ReadyPlayerMe.AvatarCreator public static class AuthManager { private const string TAG = nameof(AuthManager); - private static readonly AuthenticationRequests AuthenticationRequests; + private static readonly AuthApi AuthApi; private static UserSession userSession; public static UserSession UserSession => userSession; @@ -25,12 +25,12 @@ public static class AuthManager static AuthManager() { - AuthenticationRequests = new AuthenticationRequests(CoreSettingsHandler.CoreSettings.Subdomain); + AuthApi = new AuthApi(CoreSettingsHandler.CoreSettings.Subdomain); } public static async Task LoginAsAnonymous() { - userSession = await AuthenticationRequests.LoginAsAnonymous(); + userSession = await AuthApi.LoginAsAnonymous(); IsSignedInAnonymously = true; } @@ -43,14 +43,14 @@ public static void SetUser(UserSession session) public static async void SendEmailCode(string email) { - await AuthenticationRequests.SendCodeToEmail(email, userSession.Id); + await AuthApi.SendCodeToEmail(email, userSession.Id); } public static async Task LoginWithCode(string otp) { try { - userSession = await AuthenticationRequests.LoginWithCode(otp); + userSession = await AuthApi.LoginWithCode(otp); IsSignedIn = true; OnSignedIn?.Invoke(userSession); return true; @@ -64,7 +64,7 @@ public static async Task LoginWithCode(string otp) public static async void Signup(string email) { - await AuthenticationRequests.Signup(email, userSession.Id); + await AuthApi.Signup(email, userSession.Id); } public static async Task RefreshToken() @@ -72,7 +72,7 @@ public static async Task RefreshToken() (string, string) newTokens; try { - newTokens = await AuthenticationRequests.RefreshToken(userSession.Token, userSession.RefreshToken); + newTokens = await AuthApi.RefreshToken(userSession.Token, userSession.RefreshToken); } catch (Exception e) { diff --git a/Runtime/AvatarCreator/AvatarManager.cs b/Runtime/AvatarCreator/AvatarManager.cs index 5aa46d29..ba1753ce 100644 --- a/Runtime/AvatarCreator/AvatarManager.cs +++ b/Runtime/AvatarCreator/AvatarManager.cs @@ -14,7 +14,7 @@ public class AvatarManager : IDisposable { private const string TAG = nameof(AvatarManager); private readonly BodyType bodyType; - private readonly AvatarAPIRequests avatarAPIRequests; + private readonly AvatarApi avatarApi; private readonly string avatarConfigParameters; private readonly InCreatorAvatarLoader inCreatorAvatarLoader; private readonly CancellationTokenSource ctxSource; @@ -38,7 +38,7 @@ public AvatarManager(BodyType bodyType, AvatarConfig avatarConfig = null, Cancel ctxSource = CancellationTokenSource.CreateLinkedTokenSource(token); inCreatorAvatarLoader = new InCreatorAvatarLoader(); - avatarAPIRequests = new AvatarAPIRequests(ctxSource.Token); + avatarApi = new AvatarApi(ctxSource.Token); } /// @@ -51,7 +51,7 @@ public AvatarManager(BodyType bodyType, AvatarConfig avatarConfig = null, Cancel GameObject avatar = null; try { - avatarProperties = await avatarAPIRequests.CreateNewAvatar(avatarProperties); + avatarProperties = await avatarApi.CreateNewAvatar(avatarProperties); gender = avatarProperties.Gender; if (ctxSource.IsCancellationRequested) { @@ -81,7 +81,7 @@ public AvatarManager(BodyType bodyType, AvatarConfig avatarConfig = null, Cancel var avatarProperties = new AvatarProperties(); try { - avatarProperties = await avatarAPIRequests.CreateFromTemplateAvatar( + avatarProperties = await avatarApi.CreateFromTemplateAvatar( id, CoreSettingsHandler.CoreSettings.Subdomain, bodyType @@ -118,7 +118,7 @@ public async void PrecompileAvatar(string id, PrecompileData precompileData) } try { - await avatarAPIRequests.PrecompileAvatar(id, precompileData, avatarConfigParameters); + await avatarApi.PrecompileAvatar(id, precompileData, avatarConfigParameters); } catch (Exception e) { @@ -144,7 +144,7 @@ public async Task GetAvatar(string id, bool isPreview = false) byte[] data; try { - data = await avatarAPIRequests.GetAvatar(avatarId, isPreview, avatarConfigParameters); + data = await avatarApi.GetAvatar(avatarId, isPreview, avatarConfigParameters); } catch (Exception e) { @@ -183,7 +183,7 @@ public async Task UpdateAsset(Category category, object assetId) byte[] data; try { - data = await avatarAPIRequests.UpdateAvatar(avatarId, payload, avatarConfigParameters); + data = await avatarApi.UpdateAvatar(avatarId, payload, avatarConfigParameters); } catch (Exception e) { @@ -204,7 +204,7 @@ public async Task LoadAvatarColors() ColorPalette[] colors = null; try { - colors = await avatarAPIRequests.GetAllAvatarColors(avatarId); + colors = await avatarApi.GetAllAvatarColors(avatarId); } catch (Exception e) { @@ -221,7 +221,7 @@ public async Task Save() { try { - await avatarAPIRequests.SaveAvatar(avatarId); + await avatarApi.SaveAvatar(avatarId); } catch (Exception e) { @@ -239,7 +239,7 @@ public async void Delete(bool isDraft) { try { - await avatarAPIRequests.DeleteAvatar(avatarId, isDraft); + await avatarApi.DeleteAvatar(avatarId, isDraft); } catch (Exception e) { diff --git a/Runtime/AvatarCreator/Data/Avatars.meta b/Runtime/AvatarCreator/Data/Avatars.meta new file mode 100644 index 00000000..a1125721 --- /dev/null +++ b/Runtime/AvatarCreator/Data/Avatars.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 231b9386f6c247debfe8db8c0e58f7f9 +timeCreated: 1701189330 \ No newline at end of file diff --git a/Runtime/AvatarCreator/Data/Avatars/Avatar.cs b/Runtime/AvatarCreator/Data/Avatars/Avatar.cs new file mode 100644 index 00000000..7d4e17d3 --- /dev/null +++ b/Runtime/AvatarCreator/Data/Avatars/Avatar.cs @@ -0,0 +1,9 @@ +namespace ReadyPlayerMe.AvatarCreator.Avatars +{ + public class Avatar + { + public string Id { get; set; } + + //TODO: ADD MORE PROPERTIES HERE + } +} diff --git a/Runtime/AvatarCreator/Data/Avatars/Avatar.cs.meta b/Runtime/AvatarCreator/Data/Avatars/Avatar.cs.meta new file mode 100644 index 00000000..59ef8f99 --- /dev/null +++ b/Runtime/AvatarCreator/Data/Avatars/Avatar.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b1ec432349af449eaa3a5ad8832a488b +timeCreated: 1701189820 \ No newline at end of file diff --git a/Runtime/AvatarCreator/Data/Avatars/AvatarTemplatesResponse.cs b/Runtime/AvatarCreator/Data/Avatars/AvatarTemplatesResponse.cs new file mode 100644 index 00000000..2239ded2 --- /dev/null +++ b/Runtime/AvatarCreator/Data/Avatars/AvatarTemplatesResponse.cs @@ -0,0 +1,18 @@ +using System.Collections.Generic; + +namespace ReadyPlayerMe.AvatarCreator.Avatars +{ + public class AvatarTemplateResponse + { + public List Data { get; set; } + } + + public class AvatarTemplate + { + public string Id { get; set; } + + public string Gender { get; set; } + + public string ImageUrl { get; set; } + } +} diff --git a/Runtime/AvatarCreator/Data/Avatars/AvatarTemplatesResponse.cs.meta b/Runtime/AvatarCreator/Data/Avatars/AvatarTemplatesResponse.cs.meta new file mode 100644 index 00000000..f74d3465 --- /dev/null +++ b/Runtime/AvatarCreator/Data/Avatars/AvatarTemplatesResponse.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: e271848732924269b6a846ea819a3b97 +timeCreated: 1701189675 \ No newline at end of file diff --git a/Runtime/AvatarCreator/Data/Avatars/CreateDraftAvatarResponse.cs b/Runtime/AvatarCreator/Data/Avatars/CreateDraftAvatarResponse.cs new file mode 100644 index 00000000..0c79fb97 --- /dev/null +++ b/Runtime/AvatarCreator/Data/Avatars/CreateDraftAvatarResponse.cs @@ -0,0 +1,7 @@ +namespace ReadyPlayerMe.AvatarCreator.Avatars +{ + public class CreateDraftAvatarResponse + { + public Avatar Data { get; set; } + } +} diff --git a/Runtime/AvatarCreator/Data/Avatars/CreateDraftAvatarResponse.cs.meta b/Runtime/AvatarCreator/Data/Avatars/CreateDraftAvatarResponse.cs.meta new file mode 100644 index 00000000..e00ad8f4 --- /dev/null +++ b/Runtime/AvatarCreator/Data/Avatars/CreateDraftAvatarResponse.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 4a8d648155914ed297e1a394d3df5044 +timeCreated: 1701189788 \ No newline at end of file diff --git a/Runtime/AvatarCreator/Data/Avatars/UserAvatarResponse.cs b/Runtime/AvatarCreator/Data/Avatars/UserAvatarResponse.cs new file mode 100644 index 00000000..d4e745d9 --- /dev/null +++ b/Runtime/AvatarCreator/Data/Avatars/UserAvatarResponse.cs @@ -0,0 +1,16 @@ +using System.Collections.Generic; + +namespace ReadyPlayerMe.AvatarCreator.Avatars +{ + public class UserAvatarResponse + { + public List Data { get; set; } + } + + public class UserAvatar + { + public string Partner { get; set; } + + public string Id { get; set; } + } +} diff --git a/Runtime/AvatarCreator/Data/Avatars/UserAvatarResponse.cs.meta b/Runtime/AvatarCreator/Data/Avatars/UserAvatarResponse.cs.meta new file mode 100644 index 00000000..e4429f52 --- /dev/null +++ b/Runtime/AvatarCreator/Data/Avatars/UserAvatarResponse.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: f40f89105b774039ad338343dde1af4f +timeCreated: 1701189344 \ No newline at end of file diff --git a/Runtime/AvatarCreator/Data/Endpoints/AvatarEndpoints.cs b/Runtime/AvatarCreator/Data/Endpoints/AvatarEndpoints.cs index e09ff76e..70a75129 100644 --- a/Runtime/AvatarCreator/Data/Endpoints/AvatarEndpoints.cs +++ b/Runtime/AvatarCreator/Data/Endpoints/AvatarEndpoints.cs @@ -2,15 +2,10 @@ { public abstract class AvatarEndpoints : Endpoints { - private const string AVATAR_API_V2_ENDPOINT = API_V2_ENDPOINT + "avatars"; + private const string AVATAR_API_V2_ENDPOINT = API_V2_BASE_URL + "avatars"; private const string AVATAR_API_V1_ENDPOINT = API_V1_ENDPOINT + "avatars"; private const string MODELS_URL_PREFIX = "https://models.readyplayer.me"; - public static string GetColorEndpoint(string avatarId) - { - return $"{AVATAR_API_V2_ENDPOINT}/{avatarId}/colors?type=skin,beard,hair,eyebrow"; - } - public static string GetAvatarPublicUrl(string avatarId) { return $"{MODELS_URL_PREFIX}/{avatarId}.glb"; @@ -67,11 +62,6 @@ public static string GetUpdateAvatarEndpoint(string avatarId, string parameters) return $"{AVATAR_API_V2_ENDPOINT}/{avatarId}?responseType=glb&{parameters}"; } - public static string GetSaveAvatarEndpoint(string avatarId) - { - return $"{AVATAR_API_V2_ENDPOINT}/{avatarId}"; - } - public static string GetDeleteAvatarEndpoint(string avatarId, bool isDraft) { var draft = isDraft ? "draft" : ""; diff --git a/Runtime/AvatarCreator/Data/Endpoints/Endpoints.cs b/Runtime/AvatarCreator/Data/Endpoints/Endpoints.cs index ced00d89..3555c76d 100644 --- a/Runtime/AvatarCreator/Data/Endpoints/Endpoints.cs +++ b/Runtime/AvatarCreator/Data/Endpoints/Endpoints.cs @@ -3,7 +3,7 @@ public class Endpoints { protected const string API_SUBDOMAIN_ENDPOINT = "https://{0}.readyplayer.me/api{1}"; - protected const string API_V2_ENDPOINT = "https://api.readyplayer.me/v2/"; - protected const string API_V1_ENDPOINT = "https://api.readyplayer.me/v1/"; + public const string API_V2_BASE_URL = "https://api.readyplayer.me/v2/"; + public const string API_V1_BASE_URL = "https://api.readyplayer.me/v1/"; } } diff --git a/Runtime/AvatarCreator/PartnerAssetsManager.cs b/Runtime/AvatarCreator/PartnerAssetsManager.cs index 0b04661b..a44e859a 100644 --- a/Runtime/AvatarCreator/PartnerAssetsManager.cs +++ b/Runtime/AvatarCreator/PartnerAssetsManager.cs @@ -18,14 +18,14 @@ public class PartnerAssetsManager : IDisposable private const string EYE_MASK_SIZE_SIZE = "?w=256"; private const string ASSET_ICON_SIZE = "?w=64"; - private readonly PartnerAssetsRequests partnerAssetsRequests; + private readonly AssetsApi assetsApi; private Dictionary> assetsByCategory; public Action OnError { get; set; } public PartnerAssetsManager() { - partnerAssetsRequests = new PartnerAssetsRequests(CoreSettingsHandler.CoreSettings.AppId); + assetsApi = new AssetsApi(CoreSettingsHandler.CoreSettings.AppId); assetsByCategory = new Dictionary>(); } @@ -33,7 +33,7 @@ public async Task>> GetAssets(BodyType bo { var startTime = Time.time; - var assets = await partnerAssetsRequests.Get(bodyType, gender, token); + var assets = await assetsApi.Get(bodyType, gender, token); assetsByCategory = assets.GroupBy(asset => asset.Category).ToDictionary( group => group.Key, @@ -98,7 +98,7 @@ private async Task DownloadIcons(List chunk, Action + var iconTask = ImageApi.DownloadImageAsync(url, icon => { onDownload?.Invoke(asset.Id, icon); }, diff --git a/Runtime/AvatarCreator/TemplateFetcher.cs b/Runtime/AvatarCreator/TemplateFetcher.cs index 7c524c37..89d86bfd 100644 --- a/Runtime/AvatarCreator/TemplateFetcher.cs +++ b/Runtime/AvatarCreator/TemplateFetcher.cs @@ -8,19 +8,19 @@ namespace ReadyPlayerMe.AvatarCreator public class TemplateFetcher { private readonly CancellationToken ctx; - private readonly AvatarAPIRequests avatarAPIRequests; + private readonly AvatarApi avatarApi; private readonly List templates; public TemplateFetcher(CancellationToken ctx = default) { this.ctx = ctx; - avatarAPIRequests = new AvatarAPIRequests(ctx); + avatarApi = new AvatarApi(ctx); templates = new List(); } public async Task> GetTemplates() { - var avatarTemplates = await avatarAPIRequests.GetTemplates(); + var avatarTemplates = await avatarApi.GetTemplates(); await GetAllTemplateRenders(avatarTemplates); return templates; } @@ -37,7 +37,7 @@ private async Task GetAllTemplateRenders(IEnumerable templateAvata private async Task GetAvatarRender(TemplateData templateData) { - templateData.Texture = await avatarAPIRequests.GetTemplateAvatarImage(templateData.ImageUrl); + templateData.Texture = await ImageApi.DownloadImageAsync(templateData.ImageUrl, ctx: ctx); templates.Add(templateData); } } diff --git a/Runtime/AvatarCreator/WebRequests/PartnerAssetsRequests.cs b/Runtime/AvatarCreator/WebRequests/AssetsApi.cs similarity index 75% rename from Runtime/AvatarCreator/WebRequests/PartnerAssetsRequests.cs rename to Runtime/AvatarCreator/WebRequests/AssetsApi.cs index d24e0522..a710faba 100644 --- a/Runtime/AvatarCreator/WebRequests/PartnerAssetsRequests.cs +++ b/Runtime/AvatarCreator/WebRequests/AssetsApi.cs @@ -7,27 +7,24 @@ using Newtonsoft.Json.Linq; using ReadyPlayerMe.Core; using UnityEngine; -using UnityEngine.Networking; namespace ReadyPlayerMe.AvatarCreator { - public class PartnerAssetsRequests + public class AssetsApi { - private const string TAG = nameof(PartnerAssetsRequests); + private const string TAG = nameof(AssetsApi); private const int LIMIT = 100; private readonly AuthorizedRequest authorizedRequest; private readonly string appId; - private readonly Dictionary icons; - public PartnerAssetsRequests(string appId) + public AssetsApi(string appId) { authorizedRequest = new AuthorizedRequest(); - icons = new Dictionary(); this.appId = appId; } - public async Task Get(BodyType bodyType, OutfitGender gender, CancellationToken ctx = new CancellationToken()) + public async Task Get(BodyType bodyType, OutfitGender gender, CancellationToken ctx = default) { var assets = new HashSet(); AssetData assetData; @@ -122,33 +119,5 @@ public PartnerAssetsRequests(string appId) Pagination = pagination }; } - - public async Task GetAssetIcon(string url, Action completed, CancellationToken ctx = new CancellationToken()) - { - if (icons.ContainsKey(url)) - { - completed?.Invoke(icons[url]); - return icons[url]; - } - - var downloadHandler = new DownloadHandlerTexture(); - var response = await authorizedRequest.SendRequest(new RequestData - { - Url = url, - Method = HttpMethod.GET, - DownloadHandler = downloadHandler - }, ctx: ctx); - - response.ThrowIfError(); - - // This check is needed because the same url can be requested multiple times - if (!icons.ContainsKey(url)) - { - icons.Add(url, response.Texture); - } - - completed?.Invoke(response.Texture); - return response.Texture; - } } } diff --git a/Runtime/AvatarCreator/WebRequests/PartnerAssetsRequests.cs.meta b/Runtime/AvatarCreator/WebRequests/AssetsApi.cs.meta similarity index 100% rename from Runtime/AvatarCreator/WebRequests/PartnerAssetsRequests.cs.meta rename to Runtime/AvatarCreator/WebRequests/AssetsApi.cs.meta diff --git a/Runtime/AvatarCreator/WebRequests/AuthenticationRequests.cs b/Runtime/AvatarCreator/WebRequests/AuthApi.cs similarity index 97% rename from Runtime/AvatarCreator/WebRequests/AuthenticationRequests.cs rename to Runtime/AvatarCreator/WebRequests/AuthApi.cs index 35facc91..bbcff80e 100644 --- a/Runtime/AvatarCreator/WebRequests/AuthenticationRequests.cs +++ b/Runtime/AvatarCreator/WebRequests/AuthApi.cs @@ -5,7 +5,7 @@ namespace ReadyPlayerMe.AvatarCreator { - public class AuthenticationRequests + public class AuthApi { private readonly string domain; private readonly Dictionary headers = new Dictionary @@ -15,7 +15,7 @@ public class AuthenticationRequests private readonly WebRequestDispatcher webRequestDispatcher; - public AuthenticationRequests(string domain) + public AuthApi(string domain) { this.domain = domain; webRequestDispatcher = new WebRequestDispatcher(); diff --git a/Runtime/AvatarCreator/WebRequests/AuthenticationRequests.cs.meta b/Runtime/AvatarCreator/WebRequests/AuthApi.cs.meta similarity index 100% rename from Runtime/AvatarCreator/WebRequests/AuthenticationRequests.cs.meta rename to Runtime/AvatarCreator/WebRequests/AuthApi.cs.meta diff --git a/Runtime/AvatarCreator/WebRequests/AvatarAPIRequests.cs b/Runtime/AvatarCreator/WebRequests/AvatarApi.cs similarity index 81% rename from Runtime/AvatarCreator/WebRequests/AvatarAPIRequests.cs rename to Runtime/AvatarCreator/WebRequests/AvatarApi.cs index 0d247eb5..e4f0d350 100644 --- a/Runtime/AvatarCreator/WebRequests/AvatarAPIRequests.cs +++ b/Runtime/AvatarCreator/WebRequests/AvatarApi.cs @@ -4,24 +4,20 @@ using System.Threading.Tasks; using Newtonsoft.Json; using Newtonsoft.Json.Linq; +using ReadyPlayerMe.AvatarCreator.Avatars; using ReadyPlayerMe.Core; -using UnityEngine; -using UnityEngine.Networking; namespace ReadyPlayerMe.AvatarCreator { - public class AvatarAPIRequests + public class AvatarApi { private const string FULL_BODY = "fullbody"; private const string HALF_BODY = "halfbody"; - private const string PARTNER = "partner"; - private const string DATA = "data"; - private const string ID = "id"; - + private readonly AuthorizedRequest authorizedRequest; private readonly CancellationToken ctx; - public AvatarAPIRequests(CancellationToken ctx = default) + public AvatarApi(CancellationToken ctx = default) { this.ctx = ctx; authorizedRequest = new AuthorizedRequest(); @@ -32,16 +28,19 @@ public async Task> GetUserAvatars(string userId) var response = await authorizedRequest.SendRequest( new RequestData { - Url = AvatarEndpoints.GetUserAvatarsEndpoint(userId), + Url = $"{Endpoints.API_V1_BASE_URL}avatars?select=id,partner&userId={userId}", Method = HttpMethod.GET }, ctx: ctx ); response.ThrowIfError(); - var json = JObject.Parse(response.Text); - var data = json[DATA]!; - return data.ToDictionary(element => element[ID]!.ToString(), element => element[PARTNER]!.ToString()); + var userAvatarResponse = JsonConvert.DeserializeObject(response.Text); + + return userAvatarResponse.Data.ToDictionary(element => + element.Id!.ToString(), + element => element.Partner!.ToString() + ); } public async Task> GetTemplates() @@ -56,19 +55,9 @@ public async Task> GetTemplates() ); response.ThrowIfError(); - var json = JObject.Parse(response.Text); - var data = json[DATA]!; - return JsonConvert.DeserializeObject>(data.ToString()); - } - - public async Task GetTemplateAvatarImage(string url) - { - var downloadHandler = new DownloadHandlerTexture(); - var webRequestDispatcher = new WebRequestDispatcher(); - var response = await webRequestDispatcher.SendRequest(url, HttpMethod.GET, downloadHandler: downloadHandler, ctx: ctx); - - response.ThrowIfError(); - return response.Texture; + var avatarTemplateResponse = JsonConvert.DeserializeObject(response.Text); + + return JsonConvert.DeserializeObject>(avatarTemplateResponse.Data.ToString()); } public async Task CreateFromTemplateAvatar(string templateId, string partner, BodyType bodyType) @@ -93,8 +82,9 @@ public async Task CreateFromTemplateAvatar(string templateId, response.ThrowIfError(); - var json = JObject.Parse(response.Text); - var data = json[DATA]!.ToString(); + var createDraftAvatarResponse = JsonConvert.DeserializeObject(response.Text); + var data = createDraftAvatarResponse.Data!.ToString(); + return JsonConvert.DeserializeObject(data); } @@ -103,7 +93,7 @@ public async Task GetAllAvatarColors(string avatarId) var response = await authorizedRequest.SendRequest( new RequestData { - Url = AvatarEndpoints.GetColorEndpoint(avatarId), + Url = $"{Endpoints.API_V2_BASE_URL}avatars/{avatarId}/colors?type=skin,beard,hair,eyebrow", Method = HttpMethod.GET }, ctx: ctx @@ -198,7 +188,7 @@ public async Task SaveAvatar(string avatarId) var response = await authorizedRequest.SendRequest( new RequestData { - Url = AvatarEndpoints.GetSaveAvatarEndpoint(avatarId), + Url = $"{Endpoints.API_V2_BASE_URL}avatars/{avatarId}", Method = HttpMethod.PUT }, ctx: ctx); @@ -209,10 +199,15 @@ public async Task SaveAvatar(string avatarId) public async Task DeleteAvatar(string avatarId, bool isDraft = false) { + var url = $"{Endpoints.API_V2_BASE_URL}avatars/{avatarId}/"; + + if (isDraft) + url += "draft"; + var response = await authorizedRequest.SendRequest( new RequestData { - Url = AvatarEndpoints.GetDeleteAvatarEndpoint(avatarId, isDraft), + Url = url, Method = HttpMethod.DELETE }, ctx: ctx); diff --git a/Runtime/AvatarCreator/WebRequests/AvatarAPIRequests.cs.meta b/Runtime/AvatarCreator/WebRequests/AvatarApi.cs.meta similarity index 100% rename from Runtime/AvatarCreator/WebRequests/AvatarAPIRequests.cs.meta rename to Runtime/AvatarCreator/WebRequests/AvatarApi.cs.meta diff --git a/Runtime/AvatarCreator/WebRequests/ImageApi.cs b/Runtime/AvatarCreator/WebRequests/ImageApi.cs new file mode 100644 index 00000000..db89c7fc --- /dev/null +++ b/Runtime/AvatarCreator/WebRequests/ImageApi.cs @@ -0,0 +1,24 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using ReadyPlayerMe.Core; +using UnityEngine; +using UnityEngine.Networking; + +namespace ReadyPlayerMe.AvatarCreator +{ + public static class ImageApi + { + public static async Task DownloadImageAsync(string url, Action completed = null, CancellationToken ctx = default) + { + var downloadHandler = new DownloadHandlerTexture(); + var webRequestDispatcher = new WebRequestDispatcher(); + var response = await webRequestDispatcher.SendRequest(url, HttpMethod.GET, downloadHandler: downloadHandler, ctx: ctx); + + response.ThrowIfError(); + completed?.Invoke(response.Texture); + + return response.Texture; + } + } +} diff --git a/Runtime/AvatarCreator/WebRequests/ImageApi.cs.meta b/Runtime/AvatarCreator/WebRequests/ImageApi.cs.meta new file mode 100644 index 00000000..2bb3fa5a --- /dev/null +++ b/Runtime/AvatarCreator/WebRequests/ImageApi.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 5b6d91a495a84506b41f6353950dd6d0 +timeCreated: 1701187074 \ No newline at end of file