105 lines
4.2 KiB
C#
105 lines
4.2 KiB
C#
using System;
|
|
using System.Text;
|
|
using BrewMonster;
|
|
using Cysharp.Threading.Tasks;
|
|
using UnityEngine;
|
|
using UnityEngine.Networking;
|
|
|
|
namespace BrewMonster.Scripts
|
|
{
|
|
/// <summary>
|
|
/// Kết quả lấy contentVersion / assetsBaseUrl (từ server hoặc hardcode).
|
|
/// Result of fetching contentVersion / assetsBaseUrl (from server or hardcoded).
|
|
/// </summary>
|
|
public readonly struct GameContentVersionFetchResult
|
|
{
|
|
public GameContentVersionFetchResult(bool ok, string contentVersion, string assetsBaseUrl, string error)
|
|
{
|
|
Ok = ok;
|
|
ContentVersion = contentVersion;
|
|
AssetsBaseUrl = assetsBaseUrl;
|
|
Error = error;
|
|
}
|
|
|
|
public bool Ok { get; }
|
|
public string ContentVersion { get; }
|
|
public string AssetsBaseUrl { get; }
|
|
public string Error { get; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gửi GET hoặc POST (JSON body) lên server, parse JSON phẳng (JsonUtility).
|
|
/// Sends GET or POST (JSON body) to server and parses flat JSON (JsonUtility).
|
|
/// </summary>
|
|
public static class GameContentVersionServerClient
|
|
{
|
|
/// <summary>
|
|
/// GET hoặc POST JSON; response: { "contentVersion": "12", "assetsBaseUrl": "https://..." }.
|
|
/// GET or POST JSON; response shape: { "contentVersion": "12", "assetsBaseUrl": "https://..." }.
|
|
/// </summary>
|
|
/// <param name="usePost">false = GET; true = POST với <paramref name="postJsonBody"/> (rỗng → "{}"). / false = GET; true = POST with body (empty → "{}").</param>
|
|
public static async UniTask<GameContentVersionFetchResult> FetchAsync(
|
|
string url,
|
|
int timeoutSeconds,
|
|
bool usePost = false,
|
|
string postJsonBody = null)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(url))
|
|
return new GameContentVersionFetchResult(false, null, null, "version URL is empty");
|
|
|
|
try
|
|
{
|
|
UnityWebRequest req;
|
|
if (usePost)
|
|
{
|
|
string body = string.IsNullOrWhiteSpace(postJsonBody) ? "{}" : postJsonBody.Trim();
|
|
byte[] raw = Encoding.UTF8.GetBytes(body);
|
|
req = new UnityWebRequest(url, UnityWebRequest.kHttpVerbPOST);
|
|
req.uploadHandler = new UploadHandlerRaw(raw) { contentType = "application/json" };
|
|
req.downloadHandler = new DownloadHandlerBuffer();
|
|
req.SetRequestHeader("Content-Type", "application/json");
|
|
}
|
|
else
|
|
{
|
|
req = UnityWebRequest.Get(url);
|
|
}
|
|
|
|
using (req)
|
|
{
|
|
req.timeout = Mathf.Max(5, timeoutSeconds);
|
|
await req.SendWebRequest().ToUniTask();
|
|
|
|
if (req.result != UnityWebRequest.Result.Success)
|
|
return new GameContentVersionFetchResult(false, null, null, req.error);
|
|
|
|
string json = req.downloadHandler?.text;
|
|
if (string.IsNullOrWhiteSpace(json))
|
|
return new GameContentVersionFetchResult(false, null, null, "Empty response body");
|
|
|
|
var parsed = JsonUtility.FromJson<VersionResponseJson>(json);
|
|
if (parsed == null || string.IsNullOrWhiteSpace(parsed.contentVersion))
|
|
return new GameContentVersionFetchResult(false, null, null, "JSON missing contentVersion");
|
|
|
|
return new GameContentVersionFetchResult(
|
|
true,
|
|
parsed.contentVersion.Trim(),
|
|
string.IsNullOrWhiteSpace(parsed.assetsBaseUrl) ? null : parsed.assetsBaseUrl.Trim(),
|
|
null);
|
|
}
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
BMLogger.LogError($"[Cuong] GameContentVersionServerClient: {e.Message}");
|
|
return new GameContentVersionFetchResult(false, null, null, e.Message);
|
|
}
|
|
}
|
|
|
|
[Serializable]
|
|
class VersionResponseJson
|
|
{
|
|
public string contentVersion;
|
|
public string assetsBaseUrl;
|
|
}
|
|
}
|
|
}
|