Exemplo n.º 1
0
        public async Task MoveGameToArena(GameResultModel gameModel, ArenaSessionModel arenaModel)
        {
            using (var context = dbContext())
            {
                var sourceArena = context.ArenaSessions.Query().First(x => x.Id == gameModel.ArenaSessionId);
                var targetarena = context.ArenaSessions.Query().First(x => x.Id == arenaModel.Id);
                var game        = context.Games.Query().First(x => x.Id == gameModel.Id);

                if (sourceArena.Games.Contains(game))
                {
                    sourceArena.Games.Remove(game);
                    if (game.Victory)
                    {
                        sourceArena.Wins--;
                    }
                    else
                    {
                        sourceArena.Losses--;
                    }
                }
                if (!(Equals(targetarena.Hero, game.Hero)))
                {
                    game.Hero = targetarena.Hero;
                }
                AddGameToArena(game, targetarena);
                SetEndDateIfNeeded(targetarena);

                await context.SaveChangesAsync();

                var latestId = context.ArenaSessions.OrderByDescending(x => x.StartDate).Select(x => x.Id).FirstOrDefault();
                events.PublishOnBackgroundThread(new ArenaSessionUpdated(sourceArena.Id, latestId == sourceArena.Id));
                events.PublishOnBackgroundThread(new ArenaSessionUpdated(targetarena.Id, latestId == targetarena.Id));
                events.PublishOnBackgroundThread(new GameResultUpdated(gameModel.Id, game.ArenaSessionId));
            }
        }
Exemplo n.º 2
0
        public async Task AddGame(GameResultModel gameModel)
        {
            using (var context = dbContext())
            {
                var game = new GameResult();
                game.InjectFrom(gameModel);

                if (gameModel.Hero != null)
                {
                    game.Hero = context.Heroes.Find(gameModel.Hero.Id);
                }

                if (gameModel.OpponentHero != null)
                {
                    game.OpponentHero = context.Heroes.Find(gameModel.OpponentHero.Id);
                }

                ArenaSessionModel arenaModel = null;
                ArenaSession      arena      = null;
                if (gameModel.ArenaSession != null)
                {
                    gameModel.Deck = null;
                    game.DeckKey   = null;
                    game.Deck      = null;

                    arenaModel = gameModel.ArenaSession;
                    arena      = context.ArenaSessions.Query().FirstOrDefault(x => x.Id == arenaModel.Id);
                    if (arena == null)
                    {
                        throw new InvalidOperationException("Add arena using gameManager first!");
                    }
                    // context.Entry(arena).CurrentValues.SetValues(arenaModel);

                    AddGameToArena(game, arena);
                    SetEndDateIfNeeded(arena);
                    arena.Modified = DateTime.Now;
                }

                if (gameModel.Deck != null)
                {
                    game.Deck = context.Decks.Find(gameModel.Deck.Id);
                }

                context.Games.Add(game);

                await context.SaveChangesAsync();

                gameModel.InjectFrom(game);
                events.PublishOnBackgroundThread(new GameResultAdded(this, gameModel));
                if (arenaModel != null)
                {
                    arenaModel.InjectFrom(arena);
                    gameModel.ArenaSession = arenaModel;
                    arenaModel.Games.Add(gameModel);
                    var latestId = context.ArenaSessions.OrderByDescending(x => x.StartDate).Select(x => x.Id).FirstOrDefault();
                    events.PublishOnBackgroundThread(new ArenaSessionUpdated(arenaModel.Id, latestId == arenaModel.Id));
                }
            }
        }
 private string Handle(string content, ArenaSessionModel arena)
 {
     if (content.Contains(carenaWins))
     {
         content = content.Replace(carenaWins, arena.Wins.ToString(CultureInfo.InvariantCulture));
     }
     if (content.Contains(carenaLosses))
     {
         content = content.Replace(carenaLosses, arena.Losses.ToString(CultureInfo.InvariantCulture));
     }
     return(content);
 }
Exemplo n.º 4
0
        public async Task MergeArenas(ArenaSessionModel source, ArenaSessionModel target)
        {
            if (source == null ||
                target == null ||
                source.Hero == null ||
                target.Hero == null ||
                source.Hero.Id != target.Hero.Id)
            {
                Log.Error("Error merging arenas, null parameters or heroes are not the same.");
                return;
            }

            using (var context = dbContext())
            {
                var sourceArena = context.ArenaSessions.Query().FirstOrDefault(x => x.Id == source.Id);
                var targetArena = context.ArenaSessions.Query().FirstOrDefault(x => x.Id == target.Id);
                if (sourceArena == null ||
                    targetArena == null)
                {
                    Log.Error("Error merging arenas, source or target does not exist");
                    return;
                }

                var updatedGames = new List <GameResult>();
                foreach (var sourceGame in sourceArena.Games)
                {
                    AddGameToArena(sourceGame, targetArena);
                    updatedGames.Add(sourceGame);
                }

                for (var i = sourceArena.Games.Count - 1; i >= 0; i--)
                {
                    sourceArena.Games.Remove(sourceArena.Games[i]);
                }

                context.ArenaSessions.Remove(sourceArena);

                SetEndDateIfNeeded(targetArena);

                await context.SaveChangesAsync();

                target.MapFrom(targetArena);
                events.PublishOnBackgroundThread(new ArenaSessionDeleted(source));
                events.PublishOnBackgroundThread(new ArenaSessionUpdated(targetArena.Id));
                foreach (var game in updatedGames)
                {
                    events.PublishOnBackgroundThread(new GameResultUpdated(game.Id, game.ArenaSessionId));
                }
            }
        }
Exemplo n.º 5
0
        public void Load(ArenaSessionModel arenaSessionModel)
        {
            if (arenaSessionModel == null)
            {
                return;
            }

            SelectedArenaSession = arenaSessionModel;
            InitLatest();
            InitViewModel(SelectedArenaSession);

            IsOpen = true;

            events.PublishOnBackgroundThread(new SelectedArenaSessionChanged(this, arenaSessionModel.Id));
        }
Exemplo n.º 6
0
        public async Task Retire(ArenaSessionModel arenaModel)
        {
            using (var context = dbContext())
            {
                var arena = context.ArenaSessions.Query().First(x => x.Id == arenaModel.Id);
                arena.Retired = true;
                if (arena.EndDate == null)
                {
                    arena.EndDate = DateTime.Now;
                }
                arena.Modified = DateTime.Now;
                await context.SaveChangesAsync();

                arenaModel.InjectFrom(arena);
            }
        }
Exemplo n.º 7
0
        public async Task UpdateArenaSession(ArenaSessionModel arenaModel)
        {
            using (var context = dbContext())
            {
                var arena = context.ArenaSessions.Query().FirstOrDefault(x => x.Id == arenaModel.Id);
                if (arena == null)
                {
                    throw new ArgumentException("arena does not exist", "arenaModel");
                }
                if (!Equals(arenaModel.Hero, arena.Hero))
                {
                    arena.Hero = context.Heroes.Find(arenaModel.Hero.Id);
                }
                if (arenaModel.Image1 != null)
                {
                    var img = context.ArenaDeckImages.Find(arenaModel.Image1.Id);
                    if (img == null)
                    {
                        img = arenaModel.Image1;
                        context.ArenaDeckImages.Add(img);
                    }
                    context.Entry(img).CurrentValues.SetValues(arenaModel.Image1);
                    arena.Image1 = img;
                }
                if (arenaModel.Image2 != null)
                {
                    var img = context.ArenaDeckImages.Find(arenaModel.Image2.Id);
                    if (img == null)
                    {
                        img = arenaModel.Image2;
                        context.ArenaDeckImages.Add(img);
                    }
                    context.Entry(img).CurrentValues.SetValues(arenaModel.Image2);
                    arena.Image2 = img;
                }

                context.Entry(arena).CurrentValues.SetValues(arenaModel);
                SetEndDateIfNeeded(arena);
                arena.Modified = DateTime.Now;
                await context.SaveChangesAsync();

                arena = context.ArenaSessions.Query().First(x => x.Id == arena.Id);
                var latestId = context.ArenaSessions.OrderByDescending(x => x.StartDate).Select(x => x.Id).FirstOrDefault();
                arenaModel.InjectFrom(arena);
                events.PublishOnBackgroundThread(new ArenaSessionUpdated(arenaModel.Id, latestId == arena.Id));
            }
        }
        public async Task Save()
        {
            var arena = new ArenaSessionModel();

            arena.Hero      = this.Hero;
            arena.StartDate = this.Started;
            arena.Losses    = this.Losses;
            arena.Wins      = this.Wins;
            arena.Server    = SelectedServer.Name;

            await gameManager.AddArenaSession(arena);

            events.PublishOnBackgroundThread(new SendNotification("Arena successfully saved."));
            Reset();
            IsOpen = false;
            ArenaFlyout.Load(arena);
        }
Exemplo n.º 9
0
        private void InitViewModel(ArenaSessionModel arenaSession)
        {
            this.Started        = arenaSession.StartDate;
            this.Ended          = arenaSession.EndDate;
            this.Wins           = arenaSession.Wins;
            this.Losses         = arenaSession.Losses;
            this.Hero           = arenaSession.Hero;
            this.IsEnded        = arenaSession.IsEnded;
            this.Retired        = arenaSession.Retired;
            this.RewardDust     = arenaSession.RewardDust;
            this.RewardGold     = arenaSession.RewardGold;
            this.RewardPacks    = arenaSession.RewardPacks;
            this.Notes          = arenaSession.Notes;
            this.SelectedServer = servers.FirstOrDefault(x => x.Name == arenaSession.Server);

            this.DeckScreenshot1 = null;
            this.DeckScreenshot2 = null;
            if (arenaSession.Image1 != null)
            {
                this.DeckScreenshot1 = CreateBitmapImage(arenaSession.Image1.Image);
            }

            if (arenaSession.Image2 != null)
            {
                this.DeckScreenshot2 = CreateBitmapImage(arenaSession.Image2.Image);
            }

            NotifyOfPropertyChange(() => IsLatest);

            if (IsLatest && !IsEnded)
            {
                this.Header = this.DisplayName = "Running Arena:";
            }
            else if (IsLatest)
            {
                this.Header = this.DisplayName = "Last Arena:";
            }
            else
            {
                this.Header = this.DisplayName = "Finished Arena:";
            }
        }
Exemplo n.º 10
0
        private async Task <ArenaSessionModel> TryCreateArenaSession(string detectedHero)
        {
            if (detectedHero == null)
            {
                Log.Warn("TryCreateArenaSession called without hero");
                return(null);
            }

            using (await newArenaLock.LockAsync())
            {
                var arena = new ArenaSessionModel
                {
                    Hero = await heroRepository.FirstOrDefaultAsync(x => x.Key == detectedHero),
                };
                arena = await gameManager.AddArenaSession(arena);

                // for web api
                events.PublishOnBackgroundThread(new ArenaSessionStarted(arena.StartDate, arena.Hero.Key, arena.Wins, arena.Losses));
                return(arena);
            }
        }
Exemplo n.º 11
0
        public async Task <ArenaSessionModel> AddArenaSession(ArenaSessionModel arenaModel)
        {
            using (var context = dbContext())
            {
                var arena = new ArenaSession();
                arena.InjectFrom(arenaModel);
                if (arenaModel.Hero != null)
                {
                    arena.Hero = context.Heroes.Find(arenaModel.Hero.Id);
                }
                if (arenaModel.Image1 != null)
                {
                    var img = context.ArenaDeckImages.Find(arenaModel.Image1.Id);
                    if (img == null)
                    {
                        img = arenaModel.Image1;
                        context.ArenaDeckImages.Add(img);
                    }
                    context.Entry(img).CurrentValues.SetValues(arenaModel.Image1);
                    arena.Image1 = img;
                }
                if (arenaModel.Image2 != null)
                {
                    var img = context.ArenaDeckImages.Find(arenaModel.Image2.Id);
                    if (img == null)
                    {
                        img = arenaModel.Image2;
                        context.ArenaDeckImages.Add(img);
                    }
                    context.Entry(img).CurrentValues.SetValues(arenaModel.Image2);
                    arena.Image2 = img;
                }
                context.ArenaSessions.Add(arena);
                await context.SaveChangesAsync();

                arenaModel.InjectFrom(arena);
            }
            events.PublishOnBackgroundThread(new ArenaSessionAdded(arenaModel));
            return(arenaModel);
        }
Exemplo n.º 12
0
        public async Task AssignGameToArena(GameResultModel gameModel, ArenaSessionModel arenaModel)
        {
            using (var context = dbContext())
            {
                // var lastGame = context.Games.Where(x => x.ArenaSessionId == arenaModel.Id).OrderByDescending(x => x.ArenaGameNo).FirstOrDefault();
                var arena = context.ArenaSessions.Query().First(x => x.Id == arenaModel.Id);
                var game  = context.Games.Query().First(x => x.Id == gameModel.Id);
                // game.ArenaGameNo = lastGame == null ? 1 : lastGame.ArenaGameNo + 1;

                AddGameToArena(game, arena);
                SetEndDateIfNeeded(arena);
                arena.Modified = DateTime.Now;
                game.Modified  = DateTime.Now;
                await context.SaveChangesAsync();

                gameModel.InjectFrom(game);
                arenaModel.InjectFrom(arena);

                gameModel.ArenaSession = arenaModel;
                arenaModel.Games.Add(gameModel);
            }
        }
Exemplo n.º 13
0
        //private void OnSelectedArenaChanged()
        //{
        //    if (!PauseNotify.IsPaused(this))
        //    {
        //        this.events.PublishOnBackgroundThread(new SelectedArenaSessionChanged(this, this.SelectedArenaSession != null ? this.SelectedArenaSession.Id : (Guid?)null));
        //    }
        //}

        private async Task Retire(ArenaSessionModel arenaSession)
        {
            await gameManager.Retire(arenaSession);
        }
Exemplo n.º 14
0
 public ArenaSessionAdded(ArenaSessionModel arenaSession)
 {
     this.ArenaSession = arenaSession;
 }
Exemplo n.º 15
0
 public ArenaSessionDeleted(ArenaSessionModel arenaSession)
 {
     ArenaSession = arenaSession;
 }
Exemplo n.º 16
0
        private async Task Save()
        {
            using (var bsy = Busy.GetTicket())
            {
                var gameResult = new GameResultModel();
                ArenaSessionModel arenasession = null;
                var newArena = false;
                gameResult.GameMode = GameMode;
                gameResult.Conceded = Conceded;

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

                gameResult.GoFirst      = GoFirst;
                gameResult.Hero         = Hero;
                gameResult.OpponentHero = OpponentHero;
                gameResult.Started      = StartTime;
                gameResult.Stopped      = Stopped;
                gameResult.Turns        = Turns;
                gameResult.Victory      = Victory;
                gameResult.Notes        = Notes;
                gameResult.Server       = BindableServerCollection.Instance.DefaultName;

                if (gameResult.GameMode == GameMode.Arena)
                {
                    var serverName  = gameResult.Server;
                    var latestArena = arenaRepository.Query(a => a.Where(x => x.Server == serverName).OrderByDescending(x => x.StartDate).FirstOrDefault());
                    if (latestArena == null
                        ||
                        latestArena.IsEnded
                        ||
                        (gameResult.Hero != null && latestArena.Hero.Key != gameResult.Hero.Key))
                    {
                        Log.Debug("Creating new arena.");
                        newArena     = true;
                        arenasession = new ArenaSessionModel
                        {
                            Hero      = gameResult.Hero,
                            StartDate = gameResult.Started
                        };
                        try
                        {
                            GlobalLocks.NewArenaLock.Reset();
                            await gameManager.AddArenaSession(arenasession);
                        }
                        finally
                        {
                            GlobalLocks.NewArenaLock.Set();
                        }
                    }
                    else
                    {
                        arenasession = latestArena.ToModel();
                    }
                    gameResult.ArenaSession = arenasession;
                }
                await gameManager.AddGame(gameResult);

                // for webapi
                if (arenasession != null)
                {
                    if (newArena)
                    {
                        events.PublishOnBackgroundThread(new ArenaSessionStarted(arenasession.StartDate, arenasession.Hero.Key, arenasession.Wins, arenasession.Losses));
                    }
                    else
                    {
                        if (arenasession.IsEnded &&
                            arenasession.EndDate.HasValue)
                        {
                            events.PublishOnBackgroundThread(new ArenaSessionEnded(arenasession.StartDate, arenasession.EndDate.Value, arenasession.Hero.Key, arenasession.Wins, arenasession.Losses));
                        }
                    }
                }

                // notifications
                //var wonString = gameResult.Victory ? "You won!" : "You lost!";

                var title = "New game tracked.";
                //var hero = gameResult.Hero != null ? gameResult.Hero.ClassName : String.Empty;
                //var oppHero = gameResult.OpponentHero != null ? gameResult.OpponentHero.ClassName : String.Empty;
                //var msg = string.Format("Hero: {0}, Opponent: {1}, {2}", hero, oppHero, wonString);
                //events.PublishOnBackgroundThread(new SendNotification(String.Format("{0} {1}", title, msg)));

                var vm = IoC.Get <GameResultBalloonViewModel>();
                vm.SetGameResult(gameResult);
                events.PublishOnBackgroundThread(new TrayNotification(title, vm, 10000)
                {
                    BalloonType = BalloonTypes.GameStartEnd
                });

                // reset
                Clear();
                IsOpen = false;
            }
        }