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 { [SerializeField] private AdventureLogin login; private Gs2Domain Client => login.Gs2; private IGameSession Session => login == null ? null : login.Session; 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 = "adventure-friend"; private const string RankingNamespace = "adventure-ranking"; private const string GuildNamespace = "adventure-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(); } }