component CommunityMenuModel { CommunityMenuViewModel m_ViewModel; string m_CurrentUserType; string m_CurrentFollowType; int m_PagerIndex; int m_MaxPage; int m_MaxElemCount; string m_CurrentKeyword; list m_UserList; bool m_IsFetchNow; public CommunityMenuModel() { m_ViewModel = system.Layer_GetComponentByName("mainmenu_community_base"); m_PagerIndex = 0; m_MaxPage = 0; m_MaxElemCount = 0; m_UserList = new list(); m_IsFetchNow = false; } public bool IsFetchNow() { return m_IsFetchNow; } public void Close() { _Release(); m_CurrentUserType = COMMUNITY_FETCH_USER_TYPE_FOLLOWING; m_CurrentFollowType = COMMUNITY_FOLLOW_TYPE_ALL; m_PagerIndex = 0; m_CurrentKeyword = ""; m_IsFetchNow = false; } void _Release() { m_UserList.Clear(); } public void FetchUserList(string UserType, string FollowType, int PagerIndex, string keyword) { _Release(); m_MaxElemCount = (hsCanvasIsPortrait())? 14 : 12; m_CurrentUserType = UserType; m_CurrentFollowType = FollowType; m_PagerIndex = PagerIndex; int Offset = m_MaxElemCount * PagerIndex; m_CurrentKeyword = keyword; string channelId = hel_skyway_get_roomid(); // FollowType if(m_CurrentFollowType == COMMUNITY_FOLLOW_TYPE_ALL) { // FetchUserType if(m_CurrentUserType == COMMUNITY_FETCH_USER_TYPE_FOLLOWING) { m_IsFetchNow = true; heliport.v3.api.relationships.followings(_FetchUserListCallback, "%s" % channelId, "%d" % m_MaxElemCount, "%d" % Offset, m_CurrentKeyword); } else if(m_CurrentUserType == COMMUNITY_FETCH_USER_TYPE_FOLLOWERS) { m_IsFetchNow = true; heliport.v3.api.relationships.followers(_FetchUserListCallback, "%s" % channelId, "%d" % m_MaxElemCount, "%d" % Offset, m_CurrentKeyword); } } else if(m_CurrentFollowType == COMMUNITY_FOLLOW_TYPE_MUTUAL) { m_IsFetchNow = true; heliport.v3.api.relationships.mutualFollowings(_FetchMutualUserListCallback, "%s" % channelId, "%d" % m_MaxElemCount, "%d" % Offset, m_CurrentKeyword); } } void _FetchUserListCallback(JsVal val) { _AnalyseUserList(val, false); } void _FetchMutualUserListCallback(JsVal val) { _AnalyseUserList(val, true); } void _AnalyseUserList(JsVal val, bool IsFetchMutual) { m_IsFetchNow = false; ReturnType result = hsLoadReturnType(val); if(!result.IsValid()) return; int user_count = result.data.GetProperty("user_count").GetNum(); JsVal users = result.data.GetProperty("users"); if(users === null) return; list users_array = users.GetPropertyList(); for(int i = 0; i < users_array.Count; i++) { JsVal user = users_array[i].GetValue(); string vket_id = user.GetProperty("vket_id").GetStr(); string name = user.GetProperty("name").GetStr(); string circle_url; JsVal icon = user.GetProperty("icon"); if(icon !== null) { JsVal circle = icon.GetProperty("circle"); if(circle !== null) { circle_url = circle.GetProperty("url").GetStr(); } } bool follow_status = false; if(user.GetProperty("follow_status") !== null) follow_status = user.GetProperty("follow_status").GetBool(); bool follower_status = false; if(user.GetProperty("follower_status") !== null) follower_status = user.GetProperty("follower_status").GetBool(); // 相互フォロワーもしくはタブがフォロワーの場合は、フォロワーステータスは必ずTrueにする。 if(m_CurrentFollowType == COMMUNITY_FOLLOW_TYPE_MUTUAL || m_CurrentUserType == COMMUNITY_FETCH_USER_TYPE_FOLLOWERS) { follower_status = true; } bool invitable = false; if(user.GetProperty("invitable") !== null) invitable = user.GetProperty("invitable").GetBool(); bool joinable = false; if(user.GetProperty("joinable") !== null) joinable = user.GetProperty("joinable").GetBool(); bool same_position_channel = false; if(user.GetProperty("same_position_channel") !== null) same_position_channel = user.GetProperty("same_position_channel").GetBool(); bool is_online = (invitable || joinable || same_position_channel); CommunityMenuData Data = new CommunityMenuData(); Data.UserCode = vket_id; Data.UserName = name; Data.IconURL = circle_url; Data.FollowerStatus = follower_status; Data.IsMutual = ((follow_status && follower_status) || IsFetchMutual); // 相互フォローかどうか Data.IsOnline = is_online; Data.Invitable = invitable; Data.Joinable = joinable; Data.SamePositionChannel = same_position_channel; m_UserList.Add(Data); } m_MaxPage = (user_count + m_MaxElemCount - 1) / m_MaxElemCount; m_ViewModel.DrawUserList(m_UserList, m_MaxElemCount); } public void UpdatePager(int val) { m_PagerIndex += val; if(m_PagerIndex < 0) { m_PagerIndex = 0; return; } else if(m_PagerIndex >= m_MaxPage) { m_PagerIndex = (m_MaxPage - 1); return; } if(m_CurrentUserType == COMMUNITY_FETCH_USER_TYPE_FOLLOWING) { if(m_CurrentFollowType == COMMUNITY_FOLLOW_TYPE_ALL) { FetchUserList(COMMUNITY_FETCH_USER_TYPE_FOLLOWING, COMMUNITY_FOLLOW_TYPE_ALL, m_PagerIndex, m_CurrentKeyword); } else if(m_CurrentFollowType == COMMUNITY_FOLLOW_TYPE_MUTUAL) { FetchUserList(COMMUNITY_FETCH_USER_TYPE_FOLLOWING, COMMUNITY_FOLLOW_TYPE_MUTUAL, m_PagerIndex, m_CurrentKeyword); } } else if(m_CurrentUserType == COMMUNITY_FETCH_USER_TYPE_FOLLOWERS) { if(m_CurrentFollowType == COMMUNITY_FOLLOW_TYPE_ALL) { FetchUserList(COMMUNITY_FETCH_USER_TYPE_FOLLOWERS, COMMUNITY_FOLLOW_TYPE_ALL, m_PagerIndex, m_CurrentKeyword); } else if(m_CurrentFollowType == COMMUNITY_FOLLOW_TYPE_MUTUAL) { FetchUserList(COMMUNITY_FETCH_USER_TYPE_FOLLOWERS, COMMUNITY_FOLLOW_TYPE_MUTUAL, m_PagerIndex, m_CurrentKeyword); } } } public int GetPagerIndex() { return m_PagerIndex; } public string getIndexUserName(int Index) { if(Index < 0 || Index >= m_UserList.Count) return ""; CommunityMenuData user = m_UserList[Index]; return user.UserName; } public void FetchUserProfile(int Index) { if(Index < 0 || Index >= m_UserList.Count) return; Player SelfPlayer = hsPlayerGet(); string SelfUserCode = SelfPlayer.GetCustomState("UserCode"); string SelfUserType = SelfPlayer.GetCustomState("UserType"); CommunityMenuData user = m_UserList[Index]; string UserCode = user.UserCode; string UserType = "login"; // コミュニティ機能のユーザーリストは絶対にログインユーザーである { LayerBundle layer = hsLayerGet("other_profile"); if(layer !== null) { Func FindUserDataAndShowProfileFromUserID = system.Layer_GetComponentMethod(layer.GetCurrent()._GetInstanceID(), "ProfileModel", "FindUserDataAndShowProfileFromUserID"); if(!FindUserDataAndShowProfileFromUserID.IsEmpty()) FindUserDataAndShowProfileFromUserID(UserCode, UserType, (SelfUserType == "login" && SelfUserCode != UserCode)); } } } public void UserInvite(int Index) { string channelId = hel_skyway_get_roomid(); if(Index < 0 || Index >= m_UserList.Count) return; CommunityMenuData user = m_UserList[Index]; //VketId string vketId = user.UserCode; //ChannelId JsVal sendVal = makeJsObj(); sendVal.AddProperty("targetVketId").SetType(JS_STR).SetStr(vketId); sendVal.AddProperty("positionChannelCode").SetType(JS_STR).SetStr(channelId); heliport.v3.api.relationships.invitePositionChannel(_InvitePositionChannel, sendVal); { LayerBundle layer = hsLayerGet("mainmenu_community_base"); if(layer !== null) layer.CallComponentMethod("LoadingViewModel", "ShowLoading", "true"); } } private void _InvitePositionChannel(JsVal val) { LayerBundle layer = hsLayerGet("mainmenu_community_base"); if(layer !== null) layer.CallComponentMethod("LoadingViewModel", "ShowLoading", "false"); ReturnType result = hsLoadReturnType(val); if (result.status == "ok") { // 招待はサーバー経由で行われる } else { // note: dialog_message等のエラー時の追加パラメータは全てdataに入る string errorMessage = val.GetProperty("data").GetStr(); m_ViewModel.JoinInviteComErrorDialog(errorMessage); } } public void UserJoin(int Index) { string channelId = hel_skyway_get_roomid(); if(Index < 0 || Index >= m_UserList.Count) return; CommunityMenuData user = m_UserList[Index]; //VketId string vketId = user.UserCode; JsVal sendVal = makeJsObj(); sendVal.AddProperty("targetVketId").SetType(JS_STR).SetStr(vketId); sendVal.AddProperty("positionChannelCode").SetType(JS_STR).SetStr(channelId); heliport.v3.api.relationships.joinPositionChannel(_JoinPositionChannel, sendVal); { LayerBundle layer = hsLayerGet("mainmenu_community_base"); if(layer !== null) layer.CallComponentMethod("LoadingViewModel", "ShowLoading", "true"); } } private void _JoinPositionChannel(JsVal val) { LayerBundle layer = hsLayerGet("mainmenu_community_base"); if(layer !== null) layer.CallComponentMethod("LoadingViewModel", "ShowLoading", "false"); ReturnType result = hsLoadReturnType(val); if (result.status == "ok") { string url = result.data.GetProperty("url").GetStr(); // 同タブ遷移 JsVal urlVal = heliport.v3.api.routers.getCurrentUrl(); ReturnType urlResult = hsLoadReturnType(urlVal); if(!result.IsValid()) return; string currentUrl = urlResult.data.GetStr(); list urlArray = currentUrl.Split("?"); string originPath = urlArray[0]; urlArray = url.Split("?"); string joinOriginPath = urlArray[0]; // 合流先のworldId取得 urlArray = url.Split("worldid="); urlArray = urlArray[1].Split("&"); string joinWorldId = urlArray[0]; // 合流先のroomId取得 urlArray = url.Split("roomid="); urlArray = urlArray[1].Split("&"); string joinRoomId = urlArray[0]; bool sameOriginPath = originPath == joinOriginPath; bool sameWorld = hsGetCurrentWorldId() == joinWorldId; // URL遷移が必要なければチャンネルのみ変更 if (sameOriginPath && sameWorld) { string channelId; LayerBundle layer = hsLayerGet("vcc_icon_only_base"); if(layer !== null) { Func EnterChannelFromID = system.Layer_GetComponentMethod(layer.GetCurrent()._GetInstanceID(), "VCCViewModel", "EnterChannelFromID"); if(!EnterChannelFromID.IsEmpty()) EnterChannelFromID(joinRoomId); } return; } // 同タブ遷移 hsWebTransitionToPage(url); } else { // note: dialog_message等のエラー時の追加パラメータは全てdataに入る string errorMessage = val.GetProperty("data").GetStr(); m_ViewModel.JoinInviteComErrorDialog(errorMessage); } } }