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 = "받은 편지함을 불러오세요"; 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("이벤트 공지와 보상"); GUILayout.Label(message); GUILayout.Label("개최 시각 만들기(지금부터 몇 분 뒤인지)"); startMinutes = GUILayout.TextField(startMinutes); endMinutes = GUILayout.TextField(endMinutes); if (GUILayout.Button("시작·종료 시각 만들기")) MakeDates(); GUILayout.Label("Studio 시작 시각 / 종료 시각"); GUILayout.TextField(startsAt); GUILayout.TextField(endsAt); GUILayout.Label("SDK 템플릿 START_AT / END_AT"); GUILayout.TextField(startMillis); GUILayout.TextField(endMillis); GUI.enabled = !busy; if (GUILayout.Button("공지 수신 및 목록 갱신")) Run(() => Load()).Forget(); foreach (var item in messages.Binders) { GUILayout.Label(item.Payload); GUI.enabled = !busy && !item.IsRead; if (GUILayout.Button(item.IsRead ? "개봉 완료" : "개봉하고 보상 받기")) 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 = "시작은 종료보다 앞이어야 하며 현재로부터 전후 1440분 이내로 입력하세요"; 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 ? "도착한 메시지가 없습니다" : "받은 편지함을 갱신했습니다"; } private async UniTask Read(IActionableMessageBinder item) { await item.Read(); message = "개봉했습니다"; } }