Exemple #1
0
        public async Task <bool> DeleteChainAsync(int gameId)
        {
            var success = true;

            var gameEntity = _context.Find(typeof(GameEntity), gameId) as GameEntity;

            if (gameEntity != null)
            {
                var randomDrawEvents = from Chain in gameEntity.Chain
                                       join evnt in gameEntity.Events
                                       on Chain.Id equals evnt.Id
                                       where evnt.Type == EventType.RandomDraw
                                       select evnt;

                // clear any random draw jobs
                foreach (var randomDraw in randomDrawEvents)
                {
                    await _randomDrawEventService.ClearDrawExecutionJobs(randomDraw.Id);
                }

                gameEntity.Chain = null;

                foreach (var id in _context.Entries.Where(x => x.GameId == gameId).Select(e => e.Id))
                {
                    var entity = new EntryEntity {
                        Id = id
                    };
                    _context.Entries.Attach(entity);
                    _context.Entries.Remove(entity);
                }
                foreach (var id in _context.Players.Where(x => x.GameId == gameId).Select(e => e.Id))
                {
                    var entity = new PlayerEntity {
                        Id = id
                    };
                    _context.Players.Attach(entity);
                    _context.Players.Remove(entity);
                }
                //gameEntity.Entries.Clear(); // clear all entries for this game.
                //gameEntity.Players.Clear(); // clear all players for this game.
            }

            else
            {
                success = false;
            }

            await _context.SaveChangesAsync();

            return(success);
        }
        public async Task <bool> DeleteEventAsync(int eventId)
        {
            var success = true;

            var entityToUpdate = _context.Find(typeof(EventEntity), eventId) as EventEntity;

            if (entityToUpdate != null)
            {
                var game = _context.Find(typeof(GameEntity), entityToUpdate.GameId) as GameEntity;

                var chainCount = 0;

                if (entityToUpdate.Game.Chain != null)
                {
                    chainCount = entityToUpdate.Game.Chain.Count(x => x.Id == entityToUpdate.Id);
                }

                if (chainCount > 0)
                {
                    var randomDrawEvents = from Chain in game.Chain
                                           join evnt in game.Events
                                           on Chain.Id equals evnt.Id
                                           where evnt.Type == EventType.RandomDraw
                                           select evnt;

                    // clear any random draw jobs
                    foreach (var randomDraw in randomDrawEvents)
                    {
                        await _randomDrawEventService.ClearDrawExecutionJobs(randomDraw.Id);
                    }

                    game.Chain = null; // remove chain for this game too as the event is being used in the chain.

                    foreach (var id in _context.Entries.Where(x => x.GameId == game.Id).Select(e => e.Id))
                    {
                        var entity = new EntryEntity {
                            Id = id
                        };
                        _context.Entries.Attach(entity);
                        _context.Entries.Remove(entity);
                    }
                    foreach (var id in _context.Players.Where(x => x.GameId == game.Id).Select(e => e.Id))
                    {
                        var entity = new PlayerEntity {
                            Id = id
                        };
                        _context.Players.Attach(entity);
                        _context.Players.Remove(entity);
                    }

                    //game.Entries.Clear(); // clear all entries for this game.
                    //game.Players.Clear(); // clear all players for this game.
                }

                _context.Events.Remove(entityToUpdate);
            }
            else
            {
                success = false;
            }

            await _context.SaveChangesAsync();

            return(success);
        }
Exemple #3
0
        /// <summary>
        /// Attempt to manually advance an events entry.
        /// </summary>
        /// <param name="entry"></param>
        /// <returns>Will return true if move successfull.</returns>
        public async Task <bool> ManuallyAdvanceEntry(EntryEntity entry)
        {
            var currentEvent = await _context.Events.FirstAsync(x => x.Id == entry.State);

            var chain = entry.Game.Chain.SingleOrDefault(x => x.Id == entry.State);

            if (currentEvent.TransitionType == TransitionType.Timed &&
                currentEvent.ManualAdvance == true) // if manual advance should be true.
            {
                // then if valid this entry should move on to the next event state.
                // first check the pass round
                var successeventId = chain.SuccessEvent ?? 0;
                var faileventId    = chain.FailEvent ?? 0;

                if (currentEvent.Type == EventType.RandomDraw)
                {
                    // check event state to see if its been drawn already
                    var state = currentEvent.EventState.ToObject <RandomEventState>();
                    if (!state.IsDrawn)
                    {
                        await _randomDrawEventService.ClearDrawExecutionJobs(currentEvent.Id);

                        if (await _randomDrawEventService.ExecuteDraw(currentEvent.Id))
                        {
                            state.HangfireJobId = "ManualAdvanceTrigger";
                            state.IsDrawn       = true;
                            await _context.SaveChangesAsync();
                        }
                    }
                    return(true);
                }

                if (currentEvent.Type == EventType.Moderate)
                {
                    // Then they entries must be moderated to move onto the next event.
                    return(false);
                }

                // all other manual advances will try success event then fail.
                if (successeventId != 0)
                {
                    if (await ValidateMove(entry, successeventId))
                    {
                        entry.State = successeventId;
                        await _context.SaveChangesAsync();

                        return(true);
                    }
                }

                if (faileventId != 0)
                {
                    if (await ValidateMove(entry, faileventId))
                    {
                        entry.State = faileventId;
                        await _context.SaveChangesAsync();

                        return(true);
                    }
                }
            }

            return(false);
        }