Exemple #1
0
        public async void CorrectWin()
        {
            // events.PublishOnBackgroundThread(new CorrectLastGameResult(gameResult.Id){ Won = true });
            if (gameResult == null)
            {
                return;
            }

            gameResult.Victory = true;
            Victory            = true;
            await gameManager.UpdateGame(gameResult);
        }
Exemple #2
0
        public async Task Save()
        {
            using (var busy = Busy.GetTicket())
            {
                GameResultModel gameResult = null;
                var             added      = false;
                if (LastGameId == null)
                {
                    gameResult = new GameResultModel();
                    added      = true;
                }
                else
                {
                    // gameResult = (await gameRepository.FirstOrDefaultAsync(x => x.Id == this.LastGameId)).ToModel();
                    gameResult = SelectedGame;
                }

                SetGameResult(gameResult);

                if (ArenaSession != null)
                {
                    gameResult.ArenaSession = ArenaSession;
                }

                if (added)
                {
                    await gameManager.AddGame(gameResult);
                }
                else
                {
                    await gameManager.UpdateGame(gameResult);
                }

                events.PublishOnBackgroundThread(new SendNotification("Game successfully saved."));
                LastGameId = gameResult.Id;
                LoadGameResult(gameResult);
            }
        }
Exemple #3
0
        private async Task HandleArenaDetect()
        {
            if (!GlobalLocks.NewArenaLock.Wait(1000))
            {
                Log.Debug("Waited for NewArenaLock lock");
                GlobalLocks.NewArenaLock.Wait();
            }

            // arena session is always the latest session in the db.
            var serverName  = BindableServerCollection.Instance.DefaultName;
            var latestArena = arenaRepository.Query(a => a.Where(x => x.Server == serverName).OrderByDescending(x => x.StartDate).FirstOrDefault().ToModel());

            try
            {
                if (latestArena == null)
                {
                    latestArena = await TryCreateArenaSession(detectedHero);

                    return;
                }

                // weird case
                if (latestArena.IsEnded &&
                    latestArena.EndDate != null)
                {
                    var diff = DateTime.Now.Subtract(latestArena.EndDate.Value);
                    if (diff < TimeSpan.FromMinutes(5))
                    {
                        Log.Debug("Latest arena is ended (and ended less then 5 minutes ago). Ignoring...");
                        return;
                        //Log.Debug("Latest arena is ended (and started more then 5 minutes ago). Creating new arena");
                        //latestArena = await TryCreateArenaSession(detectedHero);
                        //return;
                    }
                }

                // new arena started because new hero
                if (detectedHero != latestArena.Hero.Key)
                {
                    Log.Debug("detectedHero ({0}) != latestArena.Hero.Key ({1}), starting new arena.", detectedHero, latestArena.Hero.Key);
                    if (!latestArena.IsEnded)
                    {
                        Log.Debug("Retiring, previous arena.");
                        // retired
                        await Retire(latestArena);
                    }

                    latestArena = await TryCreateArenaSession(detectedHero);

                    return;
                }

                // check if we need to correct last game
                if (latestArena.IsEnded)
                {
                    if (detectedLosses >= 0 &&
                        detectedLosses < 3)
                    {
                        // last game was not a loss
                        Log.Debug("Correcting last game to be a win, because arena was ended, but losses is {0}.", detectedLosses);
                        var lastgame = latestArena.Games.OrderByDescending(x => x.Started).FirstOrDefault();
                        if (lastgame != null)
                        {
                            lastgame.Victory = true;
                            await gameManager.UpdateGame(lastgame);
                        }
                    }
                }

                // doesn't work very well.
                //if ((detectedLosses >= 0 && detectedLosses < latestArena.Losses) ||
                //    (detectedWins >= 0 && detectedWins < latestArena.Wins))
                //{
                //    Log.Debug(
                //        "Detected wins/losses ({0}/{1}) smaller then last ({2}/{3}). Starting new arena.",
                //        detectedWins,
                //        detectedLosses,
                //        latestArena.Wins,
                //        latestArena.Losses);
                //    latestArena = await TryCreateArenaSession(detectedHero);
                //    return;
                //}
            }
            finally
            {
                LatestArenaSession  = latestArena;
                detectedHero        = null;
                detectedWins        = -1;
                detectedLosses      = -1;
                handlingArenaDetect = false;
                if (latestArena != null)
                {
                    Load(latestArena);

                    if (latestArena.Image1 == null)
                    {
                        // add screenshot async
                        arenaIdForScreenshot = latestArena.Id;
                        TakingScreenshot     = true;
                        CanTakeScreenshot    = false;
                        Task.Delay(1000).ContinueWith(t => events.PublishOnBackgroundThread(new RequestArenaDeckScreenshot()));
                    }
                }
            }
        }