using Gs2.Unity.Util; using Gs2.Unity.Core; using System; using Cysharp.Threading.Tasks; using GS2Studio.Generated.Message; using UnityEngine; public sealed class AdventureEventView : MonoBehaviour { private Gs2Domain Client => Gs2ClientHolder.Instance.Gs2; private IGameSession Session => Gs2GameSessionHolder.Instance != null && Gs2GameSessionHolder.Instance.Initialized ? Gs2GameSessionHolder.Instance.GameSession : null; [SerializeField] private MessageListHandler messages; private bool busy; private string message = "Load the inbox"; private Vector2 scroll; private string startMinutes = "15"; private string endMinutes = "30"; private string startsAt = ""; private string endsAt = ""; private string startMillis = ""; private string endMillis = ""; private const string Inbox = "Inbox"; private void OnGUI() { if (Session == null) return; GUILayout.BeginArea(new Rect(700, 20, 650, Screen.height - 40), GUI.skin.box); scroll = GUILayout.BeginScrollView(scroll); GUILayout.Label("Event announcements and rewards"); GUILayout.Label(message); GUILayout.Label("Set event times (minutes from now)"); startMinutes = GUILayout.TextField(startMinutes); endMinutes = GUILayout.TextField(endMinutes); if (GUILayout.Button("Generate start and end times")) MakeDates(); GUILayout.Label("Studio start time / end time"); GUILayout.TextField(startsAt); GUILayout.TextField(endsAt); GUILayout.Label("SDK template START_AT / END_AT"); GUILayout.TextField(startMillis); GUILayout.TextField(endMillis); GUI.enabled = !busy; if (GUILayout.Button("Receive announcements and update inbox")) Run(() => Load()).Forget(); foreach (var item in messages.Binders) { GUILayout.Label(item.Payload); GUI.enabled = !busy && !item.IsRead; if (GUILayout.Button(item.IsRead ? "Opened" : "Open and claim reward")) Run(() => Read(item)).Forget(); } GUI.enabled = true; GUILayout.EndScrollView(); GUILayout.EndArea(); } private void MakeDates() { if (!int.TryParse(startMinutes, out var start) || !int.TryParse(endMinutes, out var end) || start >= end || start < -1440 || end > 1440) { message = "Set start before end, both within 1440 minutes of now"; return; } var now = System.DateTimeOffset.Now; startsAt = now.AddMinutes(start).ToString("yyyy-MM-dd HH:mm:ss zzz"); endsAt = now.AddMinutes(end).ToString("yyyy-MM-dd HH:mm:ss zzz"); startMillis = now.AddMinutes(start).ToUnixTimeMilliseconds().ToString(); endMillis = now.AddMinutes(end).ToUnixTimeMilliseconds().ToString(); } private async UniTask Run(System.Func action) { if (busy) return; busy = true; try { await action(); } catch (System.Exception error) { message = error.Message; } finally { busy = false; } } private async UniTask Load() { var user = Client.Inbox.Namespace(Inbox).Me(Session); await user.ReceiveGlobalMessageAsync(); user.InvalidateMessages(); await messages.ReloadAsync(); message = messages.Count == 0 ? "No messages received" : "Inbox updated"; } private async UniTask Read(IActionableMessageBinder item) { await item.Read(); message = "Message opened"; } }