using Gs2.Unity.Core; using System; using Cysharp.Threading.Tasks; using Gs2.Core; using Gs2.Unity.Gs2Guild.Domain.Model; using Gs2.Unity.Util; using UnityEngine; public sealed class AdventureSocial : MonoBehaviour { private Gs2Domain Client => Gs2ClientHolder.Instance.Gs2; private IGameSession Session => Gs2GameSessionHolder.Instance != null && Gs2GameSessionHolder.Instance.Initialized ? Gs2GameSessionHolder.Instance.GameSession : null; private string displayName = "모험가 A"; private string targetUserId = ""; private string score = "100"; private string guildName = ""; private string message = "프로필을 저장하세요"; private bool busy; private Vector2 scroll; private const string FriendNamespace = "Friend"; private const string RankingNamespace = "Ranking"; private const string GuildNamespace = "Guild"; private void OnGUI() { if (Session == null) return; GUILayout.BeginArea(new Rect(700, 20, 650, 650), GUI.skin.box); scroll = GUILayout.BeginScrollView(scroll); GUILayout.Label("교류 / 내 ID: " + Session.AccessToken.UserId); if (GUILayout.Button("내 ID 복사")) GUIUtility.systemCopyBuffer = Session.AccessToken.UserId; GUILayout.Label(message); GUI.enabled = !busy; GUILayout.Label("표시 이름"); displayName = GUILayout.TextField(displayName); if (GUILayout.Button("내 이름 저장")) Run(() => SaveProfile()).Forget(); GUILayout.Label("상대 플레이어 ID"); targetUserId = GUILayout.TextField(targetUserId); if (GUILayout.Button("상대 이름 읽기")) Run(() => ReadProfile()).Forget(); GUILayout.Label("점수"); score = GUILayout.TextField(score); if (GUILayout.Button("점수 보내기")) Run(() => PutScore()).Forget(); if (GUILayout.Button("랭킹 읽기")) Run(() => ReadRanking()).Forget(); if (GUILayout.Button("친구 신청 보내기")) Run(() => SendFriend()).Forget(); if (GUILayout.Button("상대 신청 승인")) Run(() => AcceptFriend()).Forget(); if (GUILayout.Button("친구 목록 읽기")) Run(() => ReadFriends()).Forget(); if (GUILayout.Button("친구 해제")) Run(() => DeleteFriend()).Forget(); GUILayout.Label("길드 ID"); guildName = GUILayout.TextField(guildName); if (GUILayout.Button("모험가 길드 만들기")) Run(() => CreateGuild()).Forget(); if (GUILayout.Button("이 길드에 가입·신청")) Run(() => JoinGuild()).Forget(); if (GUILayout.Button("멤버 목록 읽기")) Run(() => ReadGuild()).Forget(); if (GUILayout.Button("이 길드 탈퇴")) Run(() => LeaveGuild()).Forget(); if (GUILayout.Button("마스터: 승인제로 변경")) Run(() => ManageGuild(false)).Forget(); if (GUILayout.Button("마스터: 상대 신청 승인")) Run(() => ManageGuild(true)).Forget(); GUI.enabled = true; GUILayout.EndScrollView(); GUILayout.EndArea(); } 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 SaveProfile() { var request = await Client.Friend.Namespace(FriendNamespace).Me(Session).Profile() .UpdateProfileAsync(publicProfile: displayName); message = "이름을 저장했습니다"; } private async UniTask ReadProfile() { var domain = Client.Friend.Namespace(FriendNamespace).User(targetUserId).PublicProfile(); domain.Invalidate(); var request = await domain.ModelAsync(); message = (request?.PublicProfile ?? "아직 이름이 등록되지 않았습니다"); } private async UniTask PutScore() { if (!long.TryParse(score, out var value)) { message = "점수를 정수로 입력하세요"; return; } var request = await Client.Ranking2.Namespace(RankingNamespace).GlobalRankingModel("adventure") .GlobalRankingSeason(Session).PutGlobalRankingAsync(value, displayName); await ReadRanking(); } private async UniTask ReadRanking() { var ranking = Client.Ranking2.Namespace(RankingNamespace).GlobalRankingModel("adventure").GlobalRankingSeason(Session); ranking.InvalidateGlobalRankings(); message = ""; await foreach (var item in ranking.GlobalRankingsAsync()) { if (item != null) message += item.Rank + "위 / " + item.Metadata + " / " + item.Score + " / " + item.UserId + "\n"; } } private async UniTask SendFriend() { var request = await Client.Friend.Namespace(FriendNamespace).Me(Session).SendRequestAsync(targetUserId); message = "친구 신청을 보냈습니다"; } private async UniTask AcceptFriend() { var request = await Client.Friend.Namespace(FriendNamespace).Me(Session).ReceiveFriendRequest(targetUserId).AcceptAsync(); await ReadFriends(); } private async UniTask DeleteFriend() { var request = await Client.Friend.Namespace(FriendNamespace).Me(Session).Friend(true).DeleteFriendAsync(targetUserId); await ReadFriends(); } private async UniTask ReadFriends() { var me = Client.Friend.Namespace(FriendNamespace).Me(Session); me.InvalidateFriends(); message = "친구 목록\n"; await foreach (var item in me.FriendsAsync(withProfile: true)) { if (item != null) message += item.UserId + " / " + item.PublicProfile + "\n"; } } private async UniTask CreateGuild() { var request = await Client.Guild.Namespace(GuildNamespace).Me(Session).CreateGuildAsync("adventure", "모험가 길드", "anybody"); guildName = request.GuildName; await ReadGuild(); } private async UniTask JoinGuild() { var request = await Client.Guild.Namespace(GuildNamespace).Me(Session).SendRequestAsync("adventure", guildName); message = "가입 요청을 보냈습니다. 멤버 목록에서 결과를 확인하세요"; await ReadGuild(); } private async UniTask ReadGuild() { var domain = Client.Super.Guild.Namespace(GuildNamespace).Guild("adventure", guildName); domain.Invalidate(); var request = await domain.ModelAsync(Session.AccessToken); if (request == null) { message = "길드를 찾을 수 없습니다"; return; } message = request.DisplayName + " / " + request.JoinPolicy + "\n"; foreach (var member in request.Members) message += member.UserId + " / " + member.RoleName + "\n"; } private async UniTask LeaveGuild() { var request = await Client.Guild.Namespace(GuildNamespace).Me(Session).JoinedGuild("adventure", guildName).WithdrawGuildAsync(); message = "길드를 탈퇴했습니다"; } private async UniTask ManageGuild(bool accept) { var assume = await Client.Guild.Namespace(GuildNamespace).Me(Session).AssumeAsync( new GatewaySetting { gatewayNamespaceName = "default", allowConcurrentAccess = true }, "adventure", guildName); var guild = Client.Guild.Namespace(GuildNamespace).GuildGameSession("adventure", assume); if (accept) { var request = await guild.ReceiveMemberRequest(targetUserId).AcceptAsync(); } else { var request = await guild.UpdateGuildAsync(Session.AccessToken.Token, "모험가 길드", "approval"); } await ReadGuild(); } }