GetMatchId() public method

public GetMatchId ( ) : System.Guid
return System.Guid
Exemplo n.º 1
0
        private void RegistrerNyPostSynkront(string deltakerId, string lagId, string postkode, string bruktVåpen)
        {
            var matchId = _currentMatchProvider.GetMatchId();

            using (var context = _dataContextFactory.Create())
            {
                using (var transaction = context.Database.BeginTransaction())
                {
                    try
                    {
                        if (string.IsNullOrEmpty(postkode))
                        {
                            return;
                        }

                        postkode = postkode.Trim();

                        var lagIMatch = (from lm in context.LagIMatch.Include(x => x.Lag)
                                         where lm.Lag.LagId == lagId && lm.Match.MatchId == matchId
                                         select lm).SingleOrDefault();

                        if (lagIMatch == null)
                        {
                            return;
                        }

                        var post = (from pim in context.PosterIMatch.Include(x => x.Post).Include(x => x.Match)
                                    where pim.Post.HemmeligKode == postkode && pim.Match.MatchId == matchId
                                    select pim).SingleOrDefault();

                        if (post == null)
                        {
                            _eventPublisher.PrøvdeÅRegistrereEnPostMedFeilKode(lagId, deltakerId);
                            return; // Feil kode eller post - straff?
                        }

                        if (!post.ErSynlig)
                        {
                            _eventPublisher.PrøvdeÅRegistrereEnPostSomIkkeErSynlig(lagId, deltakerId);
                        }
                        else
                        {
                            if (context.PostRegisteringer.Any(x => x.RegistertForLag.Id == lagIMatch.Id && x.RegistertPost.Id == post.Id))
                            {
                                _eventPublisher.AlleredeRegistrert(lagId, deltakerId);
                                return; // Allerede registrert post denne matchen
                            }

                            var deltaker = context.Deltakere.Single(x => x.DeltakerId == deltakerId);

                            var poeng = post.HentPoengOgInkrementerIndex();

                            if (!string.IsNullOrEmpty(post.RiggetVåpen))
                            {
                                poeng      = KjørRiggedeVåpenOgReturnerPoeng(post, poeng, bruktVåpen, lagId, deltakerId);
                                bruktVåpen = null; // bruker ikke eget våpen når felle går av
                            }
                            else
                            {
                                _eventPublisher.PoengScoret(lagId, deltakerId, poeng);
                            }

                            lagIMatch.PoengSum += poeng;

                            var registrering = new PostRegistrering
                            {
                                PoengForRegistrering = poeng,
                                RegistertForLag      = lagIMatch,
                                RegistrertAvDeltaker = deltaker,
                                RegistertPost        = post,
                                BruktVaapenId        = bruktVåpen,
                                RegistertTidspunkt   = TimeService.Now
                            };

                            context.PostRegisteringer.Add(registrering);

                            if (!string.IsNullOrEmpty(bruktVåpen))
                            {
                                var brukt = (from v in context.VåpenBeholdning
                                             where v.VaapenId == bruktVåpen &&
                                             v.LagIMatchId == lagIMatch.Id &&
                                             v.BruktIPostRegistrering == null
                                             select v).FirstOrDefault();

                                // Har prøvd å bruke noe laget ikke har
                                if (brukt != null)
                                {
                                    brukt.BruktIPostRegistrering = registrering;

                                    if (bruktVåpen == Constants.Våpen.Bombe)
                                    {
                                        post.SynligFraTid = TimeService.Now.AddSeconds(_settings.PostSkjulesISekunderEtterVåpen);
                                        _eventPublisher.BrukteBombe(lagId, deltakerId);
                                    }
                                    if (bruktVåpen == Constants.Våpen.Felle)
                                    {
                                        post.RiggetVåpen      = Constants.Våpen.Felle;
                                        post.RiggetVåpenParam = lagId;

                                        _eventPublisher.RiggetEnFelle(lagId, deltakerId);
                                    }
                                }
                            }
                        }

                        context.SaveChanges();
                        transaction.Commit();
                    }
                    catch (Exception)
                    {
                        transaction.Rollback();
                        throw;
                    }
                }
            }

            _gameState.Calculate();
        }
        public void Calculate()
        {
            var matchId = _currentMatchProvider.GetMatchId();

            //using (With.ReadUncommitted())
            using (var context = _dataContextFactory.Create())
            {
                var sorterteLag =
                    context.LagIMatch.Include(x => x.Lag.Deltakere).Include(x => x.VåpenBeholdning).Include("Våpenbeholdning.BruktIPostRegistrering")
                    .Where(x => x.Match.MatchId == matchId)
                    .OrderByDescending(x => x.PoengSum)
                    .ToList();

                // Legg på poeng fra Achievements
                var achievementsPoeng = from a in context.Achievements
                                        group a by a.LagId
                                        into g
                                        select new { LagId = g.Key, Poeng = g.Sum(x => x.Score), Achievements = g };

                foreach (var lagPoeng in achievementsPoeng)
                {
                    var p   = lagPoeng;
                    var lag = sorterteLag.Single(x => x.Lag.LagId == p.LagId);
                    lag.PoengSum += p.Poeng;
                }

                var poster = (from p in context.PosterIMatch.Include(x => x.Post)
                              where p.Match.MatchId == matchId
                              select new TempPost
                {
                    PostId = p.Post.PostId,
                    Latitude = p.Post.Latitude,
                    Longitude = p.Post.Longitude,
                    CurrentPoengIndex = p.CurrentPoengIndex,
                    PoengArray = p.PoengArray,
                    Navn = p.Post.Navn,
                    ErSynlig = p.SynligFraTid < TimeService.Now && TimeService.Now < p.SynligTilTid,
                    SynligFra = p.SynligFraTid,
                    SynligTil = p.SynligTilTid,
                    RiggetMedVåpen = p.RiggetVåpen
                }).ToList();

                var postRegistreringer = (from l in context.LagIMatch
                                          from p in l.PostRegistreringer
                                          where l.Match.MatchId == matchId
                                          select new
                {
                    PostId = p.RegistertPost.Post.PostId,
                    LagIMatchId = p.RegistertForLag.Id,
                    Poeng = p.PoengForRegistrering,
                    Deltaker = p.RegistrertAvDeltaker
                }).ToList();


                var rankedeLag = (from l in sorterteLag
                                  select new
                {
                    Id = l.Id,
                    Lag = l.Lag,
                    Rank = sorterteLag.Count(x => x.PoengSum > l.PoengSum) + 1,
                    PoengSum = l.PoengSum,
                    LagIMatch = l
                }).OrderBy(x => x.Rank).ToList();

                var poengsummer = (from l in rankedeLag
                                   select l.PoengSum).Distinct().OrderByDescending(x => x).ToList();

                var nyGameState = new Dictionary <string, GameStateForLag>();
                var random      = new Random();

                foreach (var lag in rankedeLag)
                {
                    var egenPoengIndex = poengsummer.IndexOf(lag.PoengSum);

                    var poengForover = egenPoengIndex == 0 ? lag.PoengSum : poengsummer[egenPoengIndex - 1];
                    var poengBakover = egenPoengIndex == poengsummer.Count - 1 ? lag.PoengSum : poengsummer[egenPoengIndex + 1];

                    var state = new GameStateForLag
                    {
                        LagId    = lag.Lag.LagId,
                        LagNavn  = lag.Lag.Navn,
                        LagFarge = lag.Lag.Farge,
                        LagIkon  = lag.Lag.Ikon,
                        Score    = lag.PoengSum,
                        Ranking  = new GameStateRanking
                        {
                            Rank = lag.Rank,
                            PoengBakLagetForan = poengForover - lag.PoengSum,
                            PoengForanLagetBak = lag.PoengSum - poengBakover,
                        },
                        Poster = (from p in poster.Where(x => x.ErSynlig)
                                  join r in postRegistreringer.Where(x => x.LagIMatchId == lag.Id) on p.PostId equals r.PostId into j
                                  from reg in j.DefaultIfEmpty()
                                  select new GameStatePost
                        {
                            PostId = p.PostId.ToString(),
                            Navn = p.Navn,
                            Latitude = p.Latitude,
                            Longitude = p.Longitude,
                            PoengVerdi = reg != null ? reg.Poeng : PostIMatch.BeregnPoengForNesteRegistrering(p.PoengArray, p.CurrentPoengIndex),
                            HarRegistrert = reg != null,
                        }).OrderBy(x => x.Navn).ToList(),
                        Vaapen = lag.LagIMatch.VåpenBeholdning.Where(x => x.BruktIPostRegistrering == null).Select(x => new GameStateVaapen {
                            VaapenId = x.VaapenId
                        }).ToList(),
                        Deltakere = lag.Lag.Deltakere.Select(x => new GameStateDeltaker {
                            DeltakerId = x.DeltakerId, Navn = x.Navn
                        }).ToList(),
                        Achievements = new List <GameStateAchievement>()//achievementsPoeng.Where(x => x.LagId == lag.Lag.LagId).Select(x => x.Achievements)
                    };

                    nyGameState.Add(state.LagId, state);
                }

                var scoreboard = new ScoreboardState();
                scoreboard.Poster = (from p in poster
                                     select new ScoreboardPost
                {
                    PostId = p.PostId.ToString(),
                    Latitude = p.Latitude,
                    Longitude = p.Longitude,
                    ErSynlig = p.ErSynlig,
                    Navn = p.Navn,
                    Verdi = PostIMatch.BeregnPoengForNesteRegistrering(p.PoengArray, p.CurrentPoengIndex),
                    AntallRegistreringer = postRegistreringer.Count(x => x.PostId == p.PostId),
                    SynligFra = p.SynligFra,
                    RiggetMedVåpen = p.RiggetMedVåpen
                }).OrderBy(x => x.Navn).ToList();

                scoreboard.Lag = sorterteLag.Select(l => new ScoreboardLag
                {
                    LagId                = l.Lag.LagId,
                    LagNavn              = l.Lag.Navn,
                    LagFarge             = l.Lag.Farge,
                    Score                = l.PoengSum,
                    Ranking              = sorterteLag.Count(x => x.PoengSum > l.PoengSum) + 1,
                    AntallRegistreringer = postRegistreringer.Count(x => x.LagIMatchId == l.Id)
                }).ToList();

                var deltakerPoeng = postRegistreringer
                                    .GroupBy(p => p.Deltaker.DeltakerId)
                                    .Select(g => new
                {
                    DeltakerId           = g.Key,
                    Navn                 = g.First().Deltaker.Navn,
                    LagIMatchId          = g.First().LagIMatchId,
                    AntallRegistreringer = g.Count(),
                    Poengsum             = g.Sum(x => x.Poeng)
                }).ToList();

                scoreboard.Deltakere = (from p in deltakerPoeng
                                        join l in sorterteLag on p.LagIMatchId equals l.Id
                                        select new ScoreboardDeltaker
                {
                    DeltakerId = p.DeltakerId,
                    Navn = p.Navn,
                    AntallRegistreringer = p.AntallRegistreringer,
                    Score = p.Poengsum,
                    LagId = l.Lag.LagId,
                    LagFarge = l.Lag.Farge,
                    LagIkon = l.Lag.Ikon,
                    LagNavn = l.Lag.Navn,
                    MostValueablePlayerRanking = deltakerPoeng.Count(x => x.Poengsum > p.Poengsum) + 1
                }).OrderByDescending(x => x.MostValueablePlayerRanking).ToList();

                var førsteTidspunktEtterNå = (from p in poster
                                              from t in p.Tider
                                              where t > TimeService.Now
                                              select t).Union(new[] { DateTime.MaxValue }).Min();

                scoreboard.Match = LagScoreboardMatchInfo(context, matchId);

                // swap current state
                _matchStates[matchId] = new MatchState(matchId, nyGameState, scoreboard, førsteTidspunktEtterNå);

                // IKKE SAVE CHANGES
            }
        }