public async Task SendReactionAsync(ReactionDto reactionDto) { var game = await gameRepository.GetAsync(reactionDto.GameId); if (game.DrawerPlayerId != reactionDto.UserId) { await Clients.Caller.SendAsync("Error", new ErrorMessage { Id = "send-reaction-error", Message = "Only selected drawer can draw on canvas" }); return; } var message = await chatMessageRepository.GetAsync(reactionDto.MessageId); var messageSender = await userRepository.GetAsync(message.UserId); if (reactionDto.Reaction == Reaction.Warm && message.Reaction == Reaction.None) { if (!game.PointsByPlayerId.ContainsKey(message.UserId)) { game.PointsByPlayerId[message.UserId] = 0; } if (game.PointsByPlayerId[message.UserId] <= 48) { game.PointsByPlayerId[message.UserId] += 2; messageSender.Points += 2; await userRepository.MergeAsync(messageSender); } await gameRepository.MergeAsync(game); } if (message.Reaction == Reaction.Correct) { var passedTime = (DateTime.UtcNow - game.StartTime.Value).Seconds; var timeLeft = game.GameTimeInSeconds - passedTime; game.PointsByPlayerId[game.DrawerPlayerId] = timeLeft; if (!game.PointsByPlayerId.ContainsKey(message.UserId)) { game.PointsByPlayerId[message.UserId] = 0; } game.PointsByPlayerId[message.UserId] += 50; messageSender.Points += 50; await userRepository.MergeAsync(messageSender); game.FinishTime = DateTime.UtcNow; game.Status = GameStatus.Finished; await gameRepository.MergeAsync(game); } message.Reaction = reactionDto.Reaction; await chatMessageRepository.MergeAsync(message); var groupName = reactionDto.GameId.ToString(); var reactionToSendDto = mapper.Map <ReactionToSendDto>(reactionDto); await Clients.Group(groupName).SendAsync("SendReaction", reactionToSendDto); }
public async Task <IActionResult> GetGameByIdAsync([FromRoute] Guid gameId) { var gameEntity = await gameRepository.GetAsync(gameId); var gameToSendDto = mapper.Map <GameToSendDto>(gameEntity); var playerNamesById = new Dictionary <Guid, string>(); foreach (var playerId in gameEntity.PlayersIds) { var player = await userRepository.GetAsync(playerId); playerNamesById[playerId] = player.Login; var playerToSend = mapper.Map <UserToSendDto>(player); gameToSendDto.Players.Add(playerToSend); } if (gameToSendDto.DrawerPlayerId != Guid.Empty) { gameToSendDto.DrawerLogin = playerNamesById[gameEntity.DrawerPlayerId]; } foreach (var chatMessageId in gameEntity.ChatMessageIds) { var chatMessageEntity = await chatMessageRepository.GetAsync(chatMessageId); var messageDto = mapper.Map <ChatMessageToSendDto>(chatMessageEntity); messageDto.UserName = playerNamesById[messageDto.UserId]; gameToSendDto.ChatMessages.Add(messageDto); } var passedTime = gameEntity.Status == GameStatus.Active ? (DateTime.UtcNow - gameEntity.StartTime.Value).Seconds : 0; var timeLeft = gameEntity.GameTimeInSeconds - passedTime; if (timeLeft < 0) { timeLeft = 0; if (gameEntity.Status == GameStatus.Active) { gameEntity.Status = GameStatus.Finished; await gameRepository.MergeAsync(gameEntity); } } gameToSendDto.GameTimeLeftInSeconds = timeLeft; gameToSendDto.GameWord = (await gameWordRepository.GetAsync(gameEntity.GameWordId)).Word; return(Ok(gameToSendDto)); }