Ejemplo n.º 1
0
        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));
        }