Ejemplo n.º 1
0
        public static async Task <List <GiveResultModel> > GiveAsync(
            Services.MasterData.IMasterData masterData,
            Databases.personal.PersonalDBContext db,
            string accountAccessToken,
            long playerId, //playerIdの正当性は呼び出し元で保証してください
            long[] ids
            )
        {
            var results = new List <GiveResultModel>();

            var update = false;

            var list = await db.PresentBoxs.Where(r => r.playerId == playerId).ToListAsync();

            var now = DateTime.UtcNow;

            for (int i = 0; i < list.Count;)
            {
                var m = list[i];

                // 期限が切れたプレゼントを削除しておく(期限には少しだけ余裕を持たせる)
                if (m.endDate + TimeSpan.FromMinutes(1) <= now)
                {
                    Logger.Logging(
                        new LogObj().AddChild(new LogModels.GivePresent
                    {
                        PlayerId       = playerId,
                        Date           = now,
                        Type           = m.type,
                        Id             = m.presentId,
                        Amount         = m.amount,
                        ExpirationDate = m.endDate,
                        RouteType      = m.giveType,
                        Code           = Code.Expired,
                        GivenCode      = GiveAndTake.GiveResult.Ok,
                    })
                        );

                    db.PresentBoxs.Remove(m);
                    list.RemoveAt(i);
                    update = true;

                    continue;
                }

                i++;
            }

            var presentList = new List <Databases.personal.PresentBox>();

            foreach (var id in ids)
            {
                var present = list.Find(r => r.Id == id);

                if (present == null)
                {
                    var r = new GiveResultModel
                    {
                        id     = id,
                        result = GiveResult.Err,
                    };
                    results.Add(r);

                    Logger.Logging(
                        new LogObj().AddChild(new LogModels.GivePresent
                    {
                        PlayerId       = playerId,
                        Date           = now,
                        Type           = GiveAndTake.Type.Coin,
                        Id             = "",
                        Amount         = 0,
                        ExpirationDate = now,
                        RouteType      = Type.Management,
                        Code           = Code.Err,
                        GivenCode      = GiveAndTake.GiveResult.Ok,
                    })
                        );

                    continue;
                }

                presentList.Add(present);

                db.PresentBoxs.Remove(present);

                update = true;
            }

            if (update)
            {
                await db.SaveChangesAsync();
            }

            var rewards = new List <GiveAndTake.GiveModel>();

            foreach (var present in presentList)
            {
                var reward = new GiveAndTake.Model
                {
                    assetsId = "",
                    itemId   = "",
                    amount   = present.amount,
                };

                if (present.type == GiveAndTake.Type.Coin)
                {
                    reward.type = GiveAndTake.Type.Coin;
                }
                else if (present.type == GiveAndTake.Type.Assets)
                {
                    reward.type     = GiveAndTake.Type.Assets;
                    reward.assetsId = present.presentId;
                }
                else if (present.type == GiveAndTake.Type.Item)
                {
                    reward.type   = GiveAndTake.Type.Item;
                    reward.itemId = present.presentId;
                }

                rewards.Add(new GiveAndTake.GiveModel
                {
                    id           = present.Id,
                    model        = reward,
                    historyModel = new GiveAndTake.HistoryModel
                    {
                        giveType = present.giveType,
                        text     = present.text,
                    },
                });
            }

            // プレゼント獲得
            var giveModels = await GiveAndTake.GiveAsync(
                masterData,
                db,
                accountAccessToken,
                playerId,
                rewards);

            // 獲得結果集計
            foreach (var reward in rewards)
            {
                var giveModel = giveModels.Find(i => i.id == reward.id);
                if (giveModel == null)
                {
                    Logger.Logging(
                        new LogObj().AddChild(new LogModels.GivePresent
                    {
                        PlayerId       = playerId,
                        Date           = now,
                        Type           = GiveAndTake.Type.Coin,
                        Id             = "",
                        Amount         = 0,
                        ExpirationDate = now,
                        RouteType      = Type.Management,
                        Code           = Code.Err,
                        GivenCode      = GiveAndTake.GiveResult.Ok,
                    })
                        );
                    continue;
                }

                var r = new GiveResultModel
                {
                    id    = reward.id,
                    model = reward.model,
                };

                if (giveModel.result == GiveAndTake.GiveResult.Ok)
                {
                    r.result = GiveResult.Ok;
                }
                else if (giveModel.result == GiveAndTake.GiveResult.AlreadyOwned)
                {
                    r.result = GiveResult.Ok;

                    var convert = ItemConversion.GiveConvertModel(masterData, reward.model.itemId);
                    if (convert.result == ItemConversion.Result.Ok)
                    {
                        // 変換したモデルに差し替える
                        r.model = convert.model;
                    }
                }
                else if (giveModel.result == GiveAndTake.GiveResult.Err)
                {
                    r.result = GiveResult.Err;
                }

                var present = presentList.Find(i => i.Id == reward.id);
                Logger.Logging(
                    new LogObj().AddChild(new LogModels.GivePresent
                {
                    PlayerId       = playerId,
                    Date           = now,
                    Type           = reward.model.type,
                    Id             = (reward.model.type == GiveAndTake.Type.Item) ? reward.model.itemId : reward.model.assetsId,
                    Amount         = reward.model.amount,
                    ExpirationDate = (present != null) ? present.endDate: now,
                    RouteType      = (present != null) ? present.giveType : Type.Management,
                    Code           = Code.Ok,
                    GivenCode      = giveModel.result,
                })
                    );

                results.Add(r);
            }

            return(results);
        }
Ejemplo n.º 2
0
        public static async Task <List <GiveResultModel> > GiveAsync(
            Services.MasterData.IMasterData masterData,
            Databases.personal.PersonalDBContext db,
            string accountAccessToken,
            long playerId,             //playerIdの正当性は呼び出し元で保証してください
            List <GiveModel> rewards
            )
        {
            bool update = false;

            var results = new List <GiveResultModel>();

            // 獲得履歴
            var givenHistorys = new List <GivenHistory.Model>();
            // アイテム重複確認
            var alreadyOwnedItems = new List <string>();

            foreach (var reward in rewards)
            {
                ////////////////////////
                // Coins
                if (reward.model.type == Type.Coin)
                {
                    var requester = new Multiplatform.Inky.GiveFreePlatinum();
                    requester.request.amount = (int)reward.model.amount;

                    var response = await requester.PostAsync(accountAccessToken);

                    if (response.StatusCode == System.Net.HttpStatusCode.OK)
                    {
                        givenHistorys.Add(new GivenHistory.Model
                        {
                            type     = Type.Coin,
                            id       = "",
                            amount   = reward.model.amount,
                            giveType = reward.historyModel.giveType,
                            text     = reward.historyModel.text,
                        });

                        results.Add(new GiveResultModel
                        {
                            id     = reward.id,
                            result = GiveResult.Ok,
                        });
                        continue;
                    }
                    else
                    {
                        results.Add(new GiveResultModel
                        {
                            id     = reward.id,
                            result = GiveResult.Err,
                        });
                        continue;
                    }
                }

                ////////////////////////
                // Assets
                if (reward.model.type == Type.Assets)
                {
                    var assetsResult = await FirstOrDefaultAssetsAsync(masterData, db, playerId, reward.model);

                    if (assetsResult == GiveAssetsResult.Err || assetsResult == GiveAssetsResult.MaxValue)
                    {
                        results.Add(new GiveResultModel
                        {
                            id     = reward.id,
                            result = GiveResult.Err,
                        });
                        continue;
                    }

                    if (assetsResult == GiveAssetsResult.Add)
                    {
                        // サロゲートキーなテーブルにレコードaddした場合はSaveChangesAsyncする
                        await db.SaveChangesAsync();

                        // SaveChangesAsyncしたので更新フラグ解除
                        update = false;
                    }
                    else if (assetsResult == GiveAssetsResult.Update)
                    {
                        // 更新フラグを立てる
                        update = true;
                    }

                    givenHistorys.Add(new GivenHistory.Model
                    {
                        type     = Type.Assets,
                        id       = reward.model.assetsId,
                        amount   = reward.model.amount,
                        giveType = reward.historyModel.giveType,
                        text     = reward.historyModel.text,
                    });

                    results.Add(new GiveResultModel
                    {
                        id     = reward.id,
                        result = GiveResult.Ok,
                    });
                    continue;
                }

                ////////////////////////
                // Item
                if (reward.model.type == Type.Item)
                {
                    var itemInfo = masterData.GetItemFromItemId(reward.model.itemId);

                    if (itemInfo == null)
                    {
                        results.Add(new GiveResultModel
                        {
                            id     = reward.id,
                            result = GiveResult.Err,
                        });
                        continue;
                    }

                    var alreadyOwnedItem = false;

                    if (alreadyOwnedItems.Contains(reward.model.itemId))
                    {
                        alreadyOwnedItem = true;
                    }
                    else
                    {
                        alreadyOwnedItems.Add(reward.model.itemId);

                        if (masterData.CheckDefaultOwnedItem(reward.model.itemId))
                        {
                            alreadyOwnedItem = true;
                        }
                        else
                        {
                            var rec = await db.ItemInventories.FirstOrDefaultAsync(r =>
                                                                                   r.playerId == playerId && r.itemId == reward.model.itemId);

                            if (rec != null)
                            {
                                alreadyOwnedItem = true;
                            }
                        }
                    }

                    if (alreadyOwnedItem)
                    {
                        // マテリアル変換
                        var convert = ItemConversion.GiveConvertModel(masterData, reward.model.itemId);
                        if (convert.result == ItemConversion.Result.Err)
                        {
                            results.Add(new GiveResultModel
                            {
                                id     = reward.id,
                                result = GiveResult.Err,
                            });
                            continue;
                        }

                        var assetsResult = await FirstOrDefaultAssetsAsync(masterData, db, playerId, convert.model);

                        if (assetsResult == GiveAssetsResult.Err || assetsResult == GiveAssetsResult.MaxValue)
                        {
                            results.Add(new GiveResultModel
                            {
                                id     = reward.id,
                                result = GiveResult.Err,
                            });
                            continue;
                        }

                        if (assetsResult == GiveAssetsResult.Add)
                        {
                            // サロゲートキーなテーブルにレコードaddした場合はSaveChangesAsyncする
                            await db.SaveChangesAsync();

                            // SaveChangesAsyncしたので更新フラグ解除
                            update = false;
                        }
                        else if (assetsResult == GiveAssetsResult.Update)
                        {
                            // 更新フラグを立てる
                            update = true;
                        }

                        givenHistorys.Add(new GivenHistory.Model
                        {
                            type     = Type.Assets,
                            id       = convert.model.assetsId,
                            amount   = convert.model.amount,
                            giveType = reward.historyModel.giveType,
                            text     = reward.historyModel.text,
                        });

                        results.Add(new GiveResultModel
                        {
                            id     = reward.id,
                            result = GiveResult.AlreadyOwned,
                        });
                        continue;
                    }
                    else
                    {
                        // アイテム獲得
                        await db.ItemInventories.AddAsync(new Databases.personal.ItemInventory
                        {
                            playerId     = playerId,
                            itemId       = reward.model.itemId,
                            itemType     = itemInfo.itemType,
                            obtainedDate = DateTime.UtcNow,
                            obtainedWay  = Item.ObtainedWay.Game,
                            isNew        = true,
                        });

                        update = true;

                        givenHistorys.Add(new GivenHistory.Model
                        {
                            type     = Type.Item,
                            id       = reward.model.itemId,
                            amount   = 0,
                            giveType = reward.historyModel.giveType,
                            text     = reward.historyModel.text,
                        });

                        results.Add(new GiveResultModel
                        {
                            id     = reward.id,
                            result = GiveResult.Ok,
                        });
                        continue;
                    }
                }

                ////////////////////////
                // BattlePassExp
                if (reward.model.type == Type.BattlePassExp)
                {
                    // TODO
                    results.Add(new GiveResultModel
                    {
                        id     = reward.id,
                        result = GiveResult.Err,
                    });
                    continue;
                }

                ////////////////////////
                // Unknown
                results.Add(new GiveResultModel
                {
                    id     = reward.id,
                    result = GiveResult.Err,
                });
            }

            if (update)
            {
                await db.SaveChangesAsync();
            }

            ////////////////////////
            // 獲得履歴追加
            if (givenHistorys.Count > 0)
            {
                await GivenHistory.AddAsync(playerId, db, givenHistorys);
            }

            return(results);
        }