GameService.kt

  1. package delta.codecharacter.server.game

  2. import com.fasterxml.jackson.databind.ObjectMapper
  3. import com.fasterxml.jackson.module.kotlin.registerKotlinModule
  4. import delta.codecharacter.server.code.LanguageEnum
  5. import delta.codecharacter.server.exception.CustomException
  6. import delta.codecharacter.server.game.game_log.GameLogService
  7. import delta.codecharacter.server.game.queue.entities.GameRequestEntity
  8. import delta.codecharacter.server.game.queue.entities.GameStatusUpdateEntity
  9. import delta.codecharacter.server.params.GameParameters
  10. import org.springframework.amqp.rabbit.core.RabbitTemplate
  11. import org.springframework.beans.factory.annotation.Autowired
  12. import org.springframework.http.HttpStatus
  13. import org.springframework.stereotype.Service
  14. import java.util.UUID

  15. @Service
  16. class GameService(
  17.     @Autowired private val gameRepository: GameRepository,
  18.     @Autowired private val gameLogService: GameLogService,
  19.     @Autowired private val rabbitTemplate: RabbitTemplate,
  20.     @Autowired private val parameters: GameParameters,
  21. ) {
  22.     private var mapper = ObjectMapper().registerKotlinModule()

  23.     fun getGame(id: UUID): GameEntity {
  24.         return gameRepository.findById(id).orElseThrow {
  25.             throw CustomException(HttpStatus.NOT_FOUND, "Game not found")
  26.         }
  27.     }

  28.     fun createGame(matchId: UUID): GameEntity {
  29.         val game =
  30.             GameEntity(
  31.                 id = UUID.randomUUID(),
  32.                 coinsUsed = 0,
  33.                 destruction = 0.0,
  34.                 status = GameStatusEnum.IDLE,
  35.                 matchId = matchId,
  36.             )
  37.         return gameRepository.save(game)
  38.     }

  39.     fun sendGameRequest(game: GameEntity, sourceCode: String, language: LanguageEnum, map: String) {
  40.         val gameRequest =
  41.             GameRequestEntity(
  42.                 gameId = game.id,
  43.                 sourceCode = sourceCode,
  44.                 language = language,
  45.                 parameters = parameters,
  46.                 map = map
  47.             )
  48.         rabbitTemplate.convertAndSend("gameRequestQueue", mapper.writeValueAsString(gameRequest))
  49.     }

  50.     fun updateGameStatus(gameStatusUpdateJson: String): GameEntity {
  51.         val gameStatusUpdateEntity =
  52.             mapper.readValue(gameStatusUpdateJson, GameStatusUpdateEntity::class.java)

  53.         val oldGameEntity =
  54.             gameRepository.findById(gameStatusUpdateEntity.gameId).orElseThrow {
  55.                 throw CustomException(HttpStatus.NOT_FOUND, "Game not found")
  56.             }
  57.         if (gameStatusUpdateEntity.gameResult == null) {
  58.             val newGameEntity = oldGameEntity.copy(status = gameStatusUpdateEntity.gameStatus)
  59.             return gameRepository.save(newGameEntity)
  60.         }

  61.         val gameResult = gameStatusUpdateEntity.gameResult

  62.         val (destructionPercentage, coinsUsed) = gameResult
  63.         val gameStatus =
  64.             if (gameResult.hasErrors) {
  65.                 GameStatusEnum.EXECUTE_ERROR
  66.             } else {
  67.                 GameStatusEnum.EXECUTED
  68.             }

  69.         val newGameEntity =
  70.             oldGameEntity.copy(
  71.                 destruction = destructionPercentage, coinsUsed = coinsUsed, status = gameStatus
  72.             )
  73.         val game = gameRepository.save(newGameEntity)
  74.         gameLogService.saveGameLog(game.id, gameResult.log)
  75.         return game
  76.     }
  77. }