예제 #1
0
        private LeaderBoardPlayerDto CalculatePositionInLeaderBoard(GameEventSourceAdded @event)
        {
            var data = _gameEventSourceRepository.GetAll().GroupBy(x => x.UserId)
                       .Select(g => new { UserId = g.Key, Score = g.Sum(p => p.Score) })
                       .OrderByDescending(x => x.Score).ToList();
            var allUsersRank = data.Select((p, i) => new LeaderBoardItemDto
            {
                UserRank  = i + 1,
                UserId    = p.UserId,
                UserScore = p.Score
            }).ToList();


            var leaderBorderPlayer = new LeaderBoardPlayerDto()
            {
                UserId    = @event.UserId,
                UserRank  = allUsersRank?.SingleOrDefault(x => x.UserId == @event.UserId).UserRank ?? 0,
                UserScore = allUsersRank?.SingleOrDefault(x => x.UserId == @event.UserId).UserScore ?? 0,
            };
            var userBehind = allUsersRank.SingleOrDefault(x => x.UserRank > leaderBorderPlayer.UserRank && x.UserRank == leaderBorderPlayer.UserRank + 1);
            var userAhead  = allUsersRank.SingleOrDefault(x => x.UserRank < leaderBorderPlayer.UserRank && x.UserRank == leaderBorderPlayer.UserRank - 1);

            leaderBorderPlayer.LeaderBoardPlayerAhead  = userAhead;
            leaderBorderPlayer.LeaderBoardPlayerBehind = userBehind;
            return(leaderBorderPlayer);
        }
예제 #2
0
 public async Task PublishUserLeaderBoradInfoAsync(LeaderBoardPlayerDto @event)
 {
     await _hubContextWrapper.PublishToAllAsync("user_leader_board_info_added",
                                                new
     {
         userId    = @event.UserId,
         userRank  = @event.UserRank,
         userScore = @event.UserScore,
         leaderBoardPlayerBehind = @event.LeaderBoardPlayerBehind,
         leaderBoardPlayerAhead  = @event.LeaderBoardPlayerAhead,
     }
                                                );
 }
예제 #3
0
        public async Task HandleAsync(GameEventSourceAdded @event, ICorrelationContext context)
        {
            var gameEventSource = await _gameEventSourceRepository.GetAsync(@event.Id);

            if (gameEventSource != null)
            {
                gameEventSource.UpdateScoreAndIsWin(@event.Score, @event.IsWin);
                await _gameEventSourceRepository.UpdateAsync(gameEventSource);
            }
            else
            {
                var gameSource = new GameEventSource(@event.Id, @event.IsWin, @event.Score, @event.UserId);
                await _gameEventSourceRepository.AddAsync(gameSource);
            }
            _logger.LogInformation($"GameEventSource Added with id: '{@event.Id}'.");

            LeaderBoardPlayerDto leaderBorderPlayer = CalculatePositionInLeaderBoard(@event);

            await _hubService.PublishUserLeaderBoradInfoAsync(leaderBorderPlayer);
        }