diff --git a/src/main/kotlin/com/dowstats/WikiApplication.kt b/src/main/kotlin/com/dowstats/WikiApplication.kt index c64caf1..781b9f7 100644 --- a/src/main/kotlin/com/dowstats/WikiApplication.kt +++ b/src/main/kotlin/com/dowstats/WikiApplication.kt @@ -4,10 +4,8 @@ import org.springframework.boot.autoconfigure.SpringBootApplication import org.springframework.boot.context.properties.ConfigurationPropertiesScan import org.springframework.boot.context.properties.EnableConfigurationProperties import org.springframework.boot.runApplication -import org.springframework.scheduling.annotation.EnableScheduling @SpringBootApplication -@EnableScheduling @ConfigurationPropertiesScan("com.dowstats.configuration") @EnableConfigurationProperties class WikiApplication diff --git a/src/main/kotlin/com/dowstats/controllers/RgdController.kt b/src/main/kotlin/com/dowstats/controllers/RgdController.kt deleted file mode 100644 index 88170dc..0000000 --- a/src/main/kotlin/com/dowstats/controllers/RgdController.kt +++ /dev/null @@ -1,30 +0,0 @@ -package com.dowstats.controllers - -import com.dowstats.data.rgd.RgdData -import com.dowstats.service.w40k.RgdParserService -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.http.MediaType -import org.springframework.web.bind.annotation.PostMapping -import org.springframework.web.bind.annotation.RequestBody -import org.springframework.web.bind.annotation.RequestMapping -import org.springframework.web.bind.annotation.RequestParam -import org.springframework.web.bind.annotation.RestController -import org.springframework.web.multipart.MultipartFile -import java.io.DataInputStream - -@RestController -@RequestMapping("api/v1/rgd") -class RgdController @Autowired constructor( - val rgdParserService: RgdParserService, -) { - - - @PostMapping( - value = ["/parse"], - consumes = [MediaType.APPLICATION_OCTET_STREAM_VALUE], - produces = [MediaType.APPLICATION_JSON_VALUE] - ) - fun parseRgdBytes(@RequestBody body: ByteArray): List { - return rgdParserService.parseRgdFileStream(DataInputStream(body.inputStream())) - } -} diff --git a/src/main/kotlin/com/dowstats/controllers/instruments/RgdTreeController.kt b/src/main/kotlin/com/dowstats/controllers/instruments/RgdTreeController.kt new file mode 100644 index 0000000..a573f5d --- /dev/null +++ b/src/main/kotlin/com/dowstats/controllers/instruments/RgdTreeController.kt @@ -0,0 +1,31 @@ +package com.dowstats.controllers.instruments + +import com.dowstats.data.dto.controllers.instruments.RgdNodeDto +import com.dowstats.data.dto.controllers.instruments.toRgdNodeDto +import com.dowstats.service.w40k.RgdParserService +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.http.MediaType +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RequestParam +import org.springframework.web.bind.annotation.RestController +import org.springframework.web.multipart.MultipartFile +import java.io.DataInputStream + +@RestController +@RequestMapping("api/v1/instruments/rgd") +class RgdTreeController @Autowired constructor( + val rgdParserService: RgdParserService, +) { + + @PostMapping( + value = ["/tree"], + consumes = [MediaType.MULTIPART_FORM_DATA_VALUE], + produces = [MediaType.APPLICATION_JSON_VALUE], + ) + fun parseRgdToTree(@RequestParam("file") file: MultipartFile): List { + return file.inputStream.use { input -> + rgdParserService.parseRgdFileStream(DataInputStream(input)) + }.map { it.toRgdNodeDto() } + } +} diff --git a/src/main/kotlin/com/dowstats/data/dto/controllers/instruments/RgdNodeDto.kt b/src/main/kotlin/com/dowstats/data/dto/controllers/instruments/RgdNodeDto.kt new file mode 100644 index 0000000..8e738b8 --- /dev/null +++ b/src/main/kotlin/com/dowstats/data/dto/controllers/instruments/RgdNodeDto.kt @@ -0,0 +1,20 @@ +package com.dowstats.data.dto.controllers.instruments + +import com.dowstats.data.rgd.RgdData + +data class RgdNodeDto( + val name: String, + val type: Int, + val value: Any?, + val children: List?, +) + +fun RgdData.toRgdNodeDto(): RgdNodeDto { + val children = (value as? List<*>)?.filterIsInstance()?.map { it.toRgdNodeDto() } + return RgdNodeDto( + name = name, + type = type, + value = if (children == null) value else null, + children = children, + ) +} diff --git a/src/main/kotlin/com/dowstats/service/schedulers/Schedulers.kt b/src/main/kotlin/com/dowstats/service/schedulers/Schedulers.kt deleted file mode 100644 index f6505cb..0000000 --- a/src/main/kotlin/com/dowstats/service/schedulers/Schedulers.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.dowstats.service.schedulers - -import com.dowstats.service.integrations.ModStorageIntegrationService -import org.apache.commons.logging.LogFactory -import org.springframework.scheduling.annotation.Scheduled -import org.springframework.stereotype.Component - - -@Component -class Schedulers ( - val modStorageIntegrationService: ModStorageIntegrationService -) { - - @Scheduled(fixedDelay = 600000) - fun synchronizeLastMods() { - modStorageIntegrationService.requestAvailableMods() - } -} \ No newline at end of file diff --git a/src/main/kotlin/com/dowstats/service/w40k/UnitRgdExtractService.kt b/src/main/kotlin/com/dowstats/service/w40k/UnitRgdExtractService.kt index d759109..d776b08 100644 --- a/src/main/kotlin/com/dowstats/service/w40k/UnitRgdExtractService.kt +++ b/src/main/kotlin/com/dowstats/service/w40k/UnitRgdExtractService.kt @@ -167,7 +167,7 @@ class UnitRgdExtractService @Autowired constructor( unit.deathExplosions.addAll(deathExplosionRgdExtractService.getDeathExplosions(unitData, armorTypes).toMutableSet()) - val sergeantsData = getSergeantsData(squadData) + val sergeantsData = getSergeantsData(squadData, unitData) val sergeantsEntities: List>>? = sergeantsData.first?.mapNotNull { sergeantData -> val sergeantFile = sergeantData.filePath.split("\\").last().replace(".lua", ".rgd") @@ -367,14 +367,22 @@ class UnitRgdExtractService @Autowired constructor( - private fun getSergeantsData(squadData: List?): Pair?, Int?> { + private fun getSergeantsData(squadData: List?, unitData: List): Pair?, Int?> { val squadTable = squadData ?.getRgdTableByName("squad_leader_ext") val maxSergeants = squadTable?.getIntByName("max_leaders") - val sergeantsData = squadTable?.mapNotNull { sergeantData -> + + // Не хочется городить таблицы, путсть тот, в кого превращается юнит тоже будет сержантом + val entrenchedBlueprint = unitData + .getRgdTableByName("entrench_ext") + ?.getStringByName("entrenched_blueprint_name") + + val sergeantsData = if (!entrenchedBlueprint.isNullOrEmpty()) { + listOf(SergeantData(entrenchedBlueprint, BuildCost(null, null, null, null, null, null))) + } else squadTable?.mapNotNull { sergeantData -> if (sergeantData.name.contains("leader_")) { val sergeantRgdTable = sergeantData.value as List