EVERYTHING

This commit is contained in:
niko
2026-06-01 17:19:55 +02:00
parent d063b81359
commit b62bac090b
1081 changed files with 1716544 additions and 0 deletions
@@ -0,0 +1,246 @@
using System;
using System.Collections;
using System.Text;
using UnityEngine;
using UnityEngine.Networking;
namespace BlockSpace.Voxels
{
public sealed class InventoryBackendClient
{
[Serializable]
public sealed class ListResponse
{
public bool ok;
public string[] ids;
public string equippedId;
public string error;
}
[Serializable]
public sealed class PutResponse
{
public bool ok;
public bool saved;
public string id;
public string error;
}
[Serializable]
public sealed class EquipResponse
{
public bool ok;
public string equippedId;
public string error;
}
[Serializable]
private sealed class EquipRequest
{
public string playerId;
public string avatarId;
}
private readonly string baseUrl;
public InventoryBackendClient(string baseUrl)
{
this.baseUrl = (baseUrl ?? string.Empty).Trim().TrimEnd('/');
}
public IEnumerator ListAvatars(string playerId, Action<ListResponse> onDone)
{
yield return GetJson("/api/inventory/avatars?playerId=" + UnityWebRequest.EscapeURL(playerId ?? ""), onDone);
}
public IEnumerator ListCreations(string playerId, Action<ListResponse> onDone)
{
yield return GetJson("/api/inventory/creations?playerId=" + UnityWebRequest.EscapeURL(playerId ?? ""), onDone);
}
public IEnumerator DownloadAvatar(string playerId, string avatarId, Action<string> onDone)
{
string uri = baseUrl + "/api/inventory/avatars/" + UnityWebRequest.EscapeURL(avatarId ?? "") + "?playerId=" + UnityWebRequest.EscapeURL(playerId ?? "");
using UnityWebRequest request = UnityWebRequest.Get(uri);
request.downloadHandler = new DownloadHandlerBuffer();
yield return request.SendWebRequest();
if (request.result != UnityWebRequest.Result.Success)
{
Debug.LogWarning($"DownloadAvatar failed: {request.result} {request.responseCode} {request.error}");
onDone?.Invoke(string.Empty);
yield break;
}
string text = request.downloadHandler.text ?? string.Empty;
Debug.Log($"DownloadAvatar ok: code={request.responseCode} bytes={((text != null) ? Encoding.UTF8.GetByteCount(text) : 0)}");
onDone?.Invoke(text);
}
public IEnumerator UploadAvatar(string playerId, string avatarId, string payloadJson, Action<PutResponse> onDone)
{
string url = baseUrl + "/api/inventory/avatars/" + UnityWebRequest.EscapeURL(avatarId ?? "") + "?playerId=" + UnityWebRequest.EscapeURL(playerId ?? "");
byte[] body = Encoding.UTF8.GetBytes(payloadJson ?? "{}");
using UnityWebRequest request = new UnityWebRequest(url, "PUT");
request.uploadHandler = new UploadHandlerRaw(body);
request.downloadHandler = new DownloadHandlerBuffer();
request.chunkedTransfer = false;
request.uploadHandler.contentType = "application/json; charset=utf-8";
request.SetRequestHeader("Content-Type", "application/json; charset=utf-8");
yield return request.SendWebRequest();
PutResponse putResponse = null;
if (request.result == UnityWebRequest.Result.Success)
{
try
{
putResponse = JsonUtility.FromJson<PutResponse>(request.downloadHandler.text);
}
catch
{
}
Debug.Log($"UploadAvatar ok: code={request.responseCode} bytes={body.Length} respLen={((request.downloadHandler.text != null) ? request.downloadHandler.text.Length : 0)}");
}
else
{
Debug.LogWarning($"UploadAvatar failed: {request.result} {request.responseCode} {request.error} bytes={body.Length}");
}
if (putResponse == null)
{
putResponse = new PutResponse
{
ok = false,
saved = false,
id = (avatarId ?? ""),
error = request.error
};
}
onDone?.Invoke(putResponse);
}
public IEnumerator EquipAvatar(string playerId, string avatarId, Action<EquipResponse> onDone)
{
string url = baseUrl + "/api/inventory/avatars/equip";
string s = JsonUtility.ToJson(new EquipRequest
{
playerId = (playerId ?? ""),
avatarId = (avatarId ?? "")
});
byte[] bytes = Encoding.UTF8.GetBytes(s);
using UnityWebRequest request = new UnityWebRequest(url, "POST");
request.uploadHandler = new UploadHandlerRaw(bytes);
request.downloadHandler = new DownloadHandlerBuffer();
request.SetRequestHeader("Content-Type", "application/json; charset=utf-8");
yield return request.SendWebRequest();
EquipResponse equipResponse = null;
if (request.result == UnityWebRequest.Result.Success)
{
try
{
equipResponse = JsonUtility.FromJson<EquipResponse>(request.downloadHandler.text);
}
catch
{
}
}
if (equipResponse == null)
{
equipResponse = new EquipResponse
{
ok = false,
equippedId = "",
error = request.error
};
}
onDone?.Invoke(equipResponse);
}
public IEnumerator DownloadCreation(string playerId, string creationId, Action<byte[]> onDone)
{
string uri = baseUrl + "/api/inventory/creations/" + UnityWebRequest.EscapeURL(creationId ?? "") + "?playerId=" + UnityWebRequest.EscapeURL(playerId ?? "");
using UnityWebRequest request = UnityWebRequest.Get(uri);
request.downloadHandler = new DownloadHandlerBuffer();
yield return request.SendWebRequest();
if (request.result != UnityWebRequest.Result.Success)
{
onDone?.Invoke(Array.Empty<byte>());
yield break;
}
onDone?.Invoke(request.downloadHandler.data ?? Array.Empty<byte>());
}
public IEnumerator UploadCreation(string playerId, string creationId, byte[] gzipBytes, Action<PutResponse> onDone)
{
string url = baseUrl + "/api/inventory/creations/" + UnityWebRequest.EscapeURL(creationId ?? "") + "?playerId=" + UnityWebRequest.EscapeURL(playerId ?? "");
byte[] body = gzipBytes ?? Array.Empty<byte>();
using UnityWebRequest request = new UnityWebRequest(url, "PUT");
request.uploadHandler = new UploadHandlerRaw(body);
request.downloadHandler = new DownloadHandlerBuffer();
request.chunkedTransfer = false;
request.uploadHandler.contentType = "application/octet-stream";
request.SetRequestHeader("Content-Type", "application/octet-stream");
yield return request.SendWebRequest();
PutResponse putResponse = null;
if (request.result == UnityWebRequest.Result.Success)
{
try
{
putResponse = JsonUtility.FromJson<PutResponse>(request.downloadHandler.text);
}
catch
{
}
Debug.Log($"UploadCreation ok: code={request.responseCode} bytes={body.Length}");
}
else
{
Debug.LogWarning($"UploadCreation failed: {request.result} {request.responseCode} {request.error}");
}
if (putResponse == null)
{
putResponse = new PutResponse
{
ok = false,
saved = false,
id = (creationId ?? ""),
error = request.error
};
}
onDone?.Invoke(putResponse);
}
private IEnumerator GetJson<T>(string pathAndQuery, Action<T> onDone) where T : class
{
if (string.IsNullOrEmpty(baseUrl))
{
onDone?.Invoke(null);
yield break;
}
string url = baseUrl + pathAndQuery;
using UnityWebRequest request = UnityWebRequest.Get(url);
request.downloadHandler = new DownloadHandlerBuffer();
yield return request.SendWebRequest();
if (request.result != UnityWebRequest.Result.Success)
{
Debug.LogWarning($"InventoryBackendClient GET failed: {url} {request.result} {request.responseCode} {request.error}");
onDone?.Invoke(null);
yield break;
}
T obj = null;
try
{
obj = JsonUtility.FromJson<T>(request.downloadHandler.text);
}
catch
{
}
onDone?.Invoke(obj);
}
}
}