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); }
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, } ); }
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); }