// 指定したモンスターのカスタムデータを更新
    public static async Task UpdateUserMonsterCustomDataAsync(FunctionExecutionContext <dynamic> context, string itemInstanceId, UserMonsterCustomData customData)
    {
        var serverApi = new PlayFabServerInstanceAPI(context.ApiSettings, context.AuthenticationContext);

        var customDataDict = UserDataUtil.GetCustomDataDict(customData);
        var result         = await serverApi.UpdateUserInventoryItemCustomDataAsync(new UpdateUserInventoryItemDataRequest()
        {
            PlayFabId      = context.CallerEntityProfile.Lineage.MasterPlayerAccountId,
            ItemInstanceId = itemInstanceId,
            Data           = customDataDict,
        });
    }
    // ユーザーインベントリ情報を取得する
    public static async Task <UserInventoryInfo> GetUserInventoryAsync(FunctionExecutionContext <dynamic> context)
    {
        var serverApi = new PlayFabServerInstanceAPI(context.ApiSettings, context.AuthenticationContext);

        var result = await serverApi.GetUserInventoryAsync(new GetUserInventoryRequest()
        {
            PlayFabId = context.CallerEntityProfile.Lineage.MasterPlayerAccountId,
        });

        var userInventory = UserDataUtil.GetUserInventory(result.Result);

        return(userInventory);
    }
    // ユーザーデータを取得する
    public static async Task <UserDataInfo> GetUserDataAsync(FunctionExecutionContext <dynamic> context)
    {
        var serverApi = new PlayFabServerInstanceAPI(context.ApiSettings, context.AuthenticationContext);

        var result = await serverApi.GetUserDataAsync(new GetUserDataRequest()
        {
            PlayFabId = context.CallerEntityProfile.Lineage.MasterPlayerAccountId,
        });

        // ユーザーデータのパラム名とそのデータのJsonの辞書にしてユーザーデータを取得
        var userData = UserDataUtil.GetUserData(result.Result.Data);

        return(userData);
    }
        public static async Task <dynamic> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            try{
                string body = await req.ReadAsStringAsync();

                var context = JsonConvert.DeserializeObject <FunctionExecutionContext <dynamic> >(body);
                var request = JsonConvert.DeserializeObject <FunctionExecutionContext <UpdateUserMonsterFormationApiRequest> >(body).FunctionArgument;

                var userData = await DataProcessor.GetUserDataAsync(context);

                var userMonsterPartyList = userData.userMonsterPartyList ?? new List <UserMonsterPartyInfo>();
                var index = userMonsterPartyList.FindIndex(u => u.partyId == request.partyId);
                if (index < 0)
                {
                    // 存在しない場合は新規作成して追加
                    var userMonsterParty = new UserMonsterPartyInfo()
                    {
                        id                = UserDataUtil.CreateUserDataId(),
                        partyId           = request.partyId,
                        userMonsterIdList = request.userMonsterIdList,
                    };
                    userMonsterPartyList.Add(userMonsterParty);
                }
                else
                {
                    // すでに存在する場合は更新
                    userMonsterPartyList[index].userMonsterIdList = request.userMonsterIdList;
                }
                await DataProcessor.UpdateUserDataAsync(context, new Dictionary <UserDataKey, object>() { { UserDataKey.userMonsterPartyList, userMonsterPartyList } });

                var response = new UpdateUserMonsterFormationApiResponse()
                {
                };
                return(PlayFabSimpleJson.SerializeObject(response));
            }catch (PMApiException e) {
                // レスポンスの作成
                var response = new PMApiResponseBase()
                {
                    errorCode = e.errorCode,
                    message   = e.message
                };
                return(PlayFabSimpleJson.SerializeObject(response));
            }
        }