diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/Chu3GameData.kt b/src/main/java/icu/samnyan/aqua/sega/chusan/model/Chu3GameData.kt index ba9125c6..54ab772c 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/model/Chu3GameData.kt +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/model/Chu3GameData.kt @@ -2,47 +2,30 @@ package icu.samnyan.aqua.sega.chusan.model import com.fasterxml.jackson.annotation.JsonIgnore import com.fasterxml.jackson.annotation.JsonProperty -import icu.samnyan.aqua.net.games.BaseEntity -import jakarta.persistence.* import java.time.LocalDateTime - -// BaseEntity does not expose id to json, but IdExposedEntity does -@MappedSuperclass -class IdExposedEntity { - @Id - var id: Long = 0 -} - -@Entity(name = "ChusanGameCharge") -@Table(name = "chusan_game_charge") -class GameCharge: BaseEntity() { +class GameCharge { var orderId = 0 - - @Column(unique = true) var chargeId = 0 var price = 0 - var startDate: LocalDateTime? = null - var endDate: LocalDateTime? = null + var startDate: LocalDateTime? = LocalDateTime.of(2019, 1, 1, 0, 0, 0) + var endDate: LocalDateTime? = LocalDateTime.of(2099, 1, 1, 0, 0, 0) var salePrice = 0 - var saleStartDate: LocalDateTime? = null - var saleEndDate: LocalDateTime? = null + var saleStartDate: LocalDateTime? = LocalDateTime.of(2019, 1, 1, 0, 0, 0) + var saleEndDate: LocalDateTime? = LocalDateTime.of(2099, 1, 1, 0, 0, 0) } -@Entity(name = "ChusanGameEvent") -@Table(name = "chusan_game_event") -class GameEvent: IdExposedEntity() { +class GameEvent { + var id: Long = 0 val type = 0 - val startDate: LocalDateTime? = null - val endDate: LocalDateTime? = null + val startDate: LocalDateTime? = LocalDateTime.of(2019, 1, 1, 0, 0, 0) + val endDate: LocalDateTime? = LocalDateTime.of(2099, 1, 1, 0, 0, 0) @JsonIgnore val enable = false } -@Entity(name = "ChusanGameGacha") -@Table(name = "chusan_game_gacha") -class GameGacha : IdExposedEntity() { +class GameGacha { var gachaId = 0 var gachaName: String? = null var type = 0 @@ -53,15 +36,14 @@ class GameGacha : IdExposedEntity() { var ceilingCnt = 0 var changeRateCnt1 = 0 var changeRateCnt2 = 0 - var startDate: LocalDateTime? = null - var endDate: LocalDateTime? = null - var noticeStartDate: LocalDateTime? = null - var noticeEndDate: LocalDateTime? = null + var startDate: LocalDateTime? = LocalDateTime.of(2019, 1, 1, 0, 0, 0) + var endDate: LocalDateTime? = LocalDateTime.of(2099, 1, 1, 0, 0, 0) + var noticeStartDate: LocalDateTime? = LocalDateTime.of(2019, 1, 1, 0, 0, 0) + var noticeEndDate: LocalDateTime? = LocalDateTime.of(2099, 1, 1, 0, 0, 0) } -@Entity(name = "ChusanGameGachaCard") -@Table(name = "chusan_game_gacha_card") -class GameGachaCard : IdExposedEntity() { +class GameGachaCard { + var id: Long = 0 var gachaId = 0 var cardId = 0 var rarity = 0 @@ -71,9 +53,8 @@ class GameGachaCard : IdExposedEntity() { var isPickup = false } -@Entity(name = "ChusanGameLoginBonus") -@Table(name = "chusan_game_login_bonus") -class GameLoginBonus : IdExposedEntity() { +class GameLoginBonus { + var id: Long = 0 var version = 0 var presetId = 0 var loginBonusId = 0 @@ -85,19 +66,17 @@ class GameLoginBonus : IdExposedEntity() { var loginBonusCategoryType = 0 } -@Entity(name = "ChusanGameLoginBonusPreset") -@Table(name = "chusan_game_login_bonus_preset") -class GameLoginBonusPreset : IdExposedEntity() { +class GameLoginBonusPreset { + var id: Long = 0 var version = 0 var presetName: String? = null var isEnabled = false } -@Entity(name = "ChusanGameLinkedVerse") -@Table(name = "chusan_game_linked_verse") -class GameLinkedVerse: IdExposedEntity() { +class GameLinkedVerse { + var id: Long = 0 var musicId = 0 var name: String? = null - var startDate: LocalDateTime? = null - var endDate: LocalDateTime? = null + var startDate: LocalDateTime? = LocalDateTime.of(2019, 1, 1, 0, 0, 0) + var endDate: LocalDateTime? = LocalDateTime.of(2099, 1, 1, 0, 0, 0) } \ No newline at end of file diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/Chu3Repos.kt b/src/main/java/icu/samnyan/aqua/sega/chusan/model/Chu3Repos.kt index 0c6edc4e..c479e7b5 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/model/Chu3Repos.kt +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/model/Chu3Repos.kt @@ -13,7 +13,8 @@ import org.springframework.data.jpa.repository.JpaRepository import org.springframework.data.jpa.repository.Query import org.springframework.data.repository.NoRepositoryBean import org.springframework.stereotype.Component -import java.util.* +import icu.samnyan.aqua.sega.util.GameDataService +import icu.samnyan.aqua.sega.util.StaticRepo @NoRepositoryBean @@ -147,44 +148,23 @@ interface Chu3UserChallengeRepo : Chu3UserLinked { fun findByUserAndUnlockChallengeId(user: Chu3UserData, unlockChallengeId: Int): Chu3UserChallenge? } -interface Chu3GameChargeRepo : JpaRepository - -interface Chu3GameEventRepo : JpaRepository { - fun findByEnable(enable: Boolean): List -} - -interface Chu3GameGachaCardRepo : JpaRepository { - fun findAllByGachaId(gachaId: Int): List -} - -interface Chu3GameGachaRepo : JpaRepository - -interface Chu3GameLoginBonusPresetsRepo : JpaRepository { - @Query( - value = "select * from chusan_game_login_bonus_preset where version = ?1 and is_enabled = ?2", - nativeQuery = true - ) - fun findLoginBonusPresets(version: Int, isEnabled: Int): List -} - -interface Chu3GameLoginBonusRepo : JpaRepository { - @Query( - value = "select * from chusan_game_login_bonus where version = ?1 and preset_id = ?2 order by need_login_day_count desc", - nativeQuery = true - ) - fun findGameLoginBonus(version: Int, presetId: Int): List - - @Query( - value = "select * from chusan_game_login_bonus where version = ?1 and preset_id = ?2 and need_login_day_count = ?3 limit 1", - nativeQuery = true - ) - fun findByRequiredDays(version: Int, presetId: Int, requiredDays: Int): GameLoginBonus? -} - interface Chu3UserRegionsRepo: Chu3UserLinked { fun findByUserAndRegionId(user: Chu3UserData, regionId: Int): UserRegions? } +class Chu3GameGachaCardRepo(data: List) : StaticRepo(data, { it.id }) { + fun findAllByGachaId(gachaId: Int) = data.filter { it.gachaId == gachaId } +} + +class Chu3GameLoginBonusPresetsRepo(data: List) : StaticRepo(data, { it.id }) { + fun findLoginBonusPresets(version: Int, isEnabled: Int) = data.filter { it.version == version && it.isEnabled == (isEnabled == 1) } +} + +class Chu3GameLoginBonusRepo(data: List) : StaticRepo(data, { it.id }) { + fun findGameLoginBonus(version: Int, presetId: Int) = data.filter { it.version == version && it.presetId == presetId }.sortedByDescending { it.needLoginDayCount } + fun findByRequiredDays(version: Int, presetId: Int, requiredDays: Int) = data.find { it.version == version && it.presetId == presetId && it.needLoginDayCount == requiredDays } +} + @Component class Chu3Repos( val userLoginBonus: Chu3UserLoginBonusRepo, @@ -209,11 +189,13 @@ class Chu3Repos( val userMisc: Chu3UserMiscRepo, val userChallenge: Chu3UserChallengeRepo, val userLinkedVerse: Chu3UserLinkedVerseRepo, - val gameCharge: Chu3GameChargeRepo, - val gameEvent: Chu3GameEventRepo, - val gameGachaCard: Chu3GameGachaCardRepo, - val gameGacha: Chu3GameGachaRepo, - val gameLoginBonusPresets: Chu3GameLoginBonusPresetsRepo, - val gameLoginBonus: Chu3GameLoginBonusRepo, - val gameLinkedVerse: Chu3GameLinkedVerseRepo -) \ No newline at end of file + val gameData: GameDataService +) { + val gameCharge = StaticRepo(gameData.chu3GameCharges) { it.orderId.toLong() } + val gameEvent = StaticRepo(gameData.chu3GameEvents) { it.id } + val gameGachaCard = Chu3GameGachaCardRepo(gameData.chu3GameGachaCards) + val gameGacha = StaticRepo(gameData.chu3GameGachas) { it.gachaId.toLong() } + val gameLoginBonusPresets = Chu3GameLoginBonusPresetsRepo(gameData.chu3GameLoginBonusPresets) + val gameLoginBonus = Chu3GameLoginBonusRepo(gameData.chu3GameLoginBonuses) + val gameLinkedVerse = StaticRepo(gameData.chu3GameLinkedVerses) { it.id } +} diff --git a/src/main/java/icu/samnyan/aqua/sega/maimai2/model/GameDataEntities.kt b/src/main/java/icu/samnyan/aqua/sega/maimai2/model/GameDataEntities.kt index ea990114..984b6926 100644 --- a/src/main/java/icu/samnyan/aqua/sega/maimai2/model/GameDataEntities.kt +++ b/src/main/java/icu/samnyan/aqua/sega/maimai2/model/GameDataEntities.kt @@ -1,43 +1,32 @@ package icu.samnyan.aqua.sega.maimai2.model import com.fasterxml.jackson.annotation.JsonIgnore -import icu.samnyan.aqua.net.games.BaseEntity -import jakarta.persistence.Column -import jakarta.persistence.Entity -import jakarta.persistence.Table -@Entity -@Table(name = "maimai2_game_event") -class Mai2GameEvent : BaseEntity() { +class Mai2GameEvent { @JsonIgnore(false) - override var id = 0L + var id = 0L var type = 0 - var startDate: String? = null - var endDate: String? = null + var startDate: String? = "2019-01-01 00:00:00.000000" + var endDate: String? = "2099-01-01 00:00:00.000000" @JsonIgnore var enable = false var disableArea = "" } -@Entity -@Table(name = "maimai2_game_charge") -class Mai2GameCharge : BaseEntity() { - @Column(unique = true) +class Mai2GameCharge { var chargeId = 0L - val orderId = 0L - val price = 0 - val startDate: String? = null - val endDate: String? = null + var orderId = 0L + var price = 0 + var startDate: String? = "2019-01-01 00:00:00.000000" + var endDate: String? = "2099-01-01 00:00:00.000000" } -@Entity -@Table(name = "maimai2_game_selling_card") -class Mai2GameSellingCard : BaseEntity() { +class Mai2GameSellingCard { var cardId = 0L - var startDate: String? = null - var endDate: String? = null - var noticeStartDate: String? = null - var noticeEndDate: String? = null + var startDate: String? = "2019-01-01 00:00:00.000000" + var endDate: String? = "2099-01-01 00:00:00.000000" + var noticeStartDate: String? = "2019-01-01 00:00:00.000000" + var noticeEndDate: String? = "2099-01-01 00:00:00.000000" } diff --git a/src/main/java/icu/samnyan/aqua/sega/maimai2/model/Repos.kt b/src/main/java/icu/samnyan/aqua/sega/maimai2/model/Repos.kt index ed62a0a0..7f6fb1f3 100644 --- a/src/main/java/icu/samnyan/aqua/sega/maimai2/model/Repos.kt +++ b/src/main/java/icu/samnyan/aqua/sega/maimai2/model/Repos.kt @@ -15,6 +15,8 @@ import org.springframework.data.jpa.repository.Modifying import org.springframework.data.repository.NoRepositoryBean import org.springframework.stereotype.Component import org.springframework.transaction.annotation.Transactional +import icu.samnyan.aqua.sega.util.GameDataService +import icu.samnyan.aqua.sega.util.StaticRepo import java.util.* @NoRepositoryBean @@ -117,14 +119,6 @@ interface MAi2UserIntimateRepo : Mai2UserLinked { fun findByUserAndPartnerId(user: Mai2UserDetail, partnerId: Int): Mai2UserIntimate? } -interface Mai2GameChargeRepo : JpaRepository - -interface Mai2GameEventRepo : JpaRepository { - fun findByEnable(enable: Boolean): List -} - -interface Mai2GameSellingCardRepo : JpaRepository - interface Mai2UserRegionsRepo: Mai2UserLinked { fun findByUserAndRegionId(user: Mai2UserDetail, regionId: Int): UserRegions? } @@ -152,8 +146,10 @@ class Mai2Repos( val userUdemae: Mai2UserUdemaeRepo, val userKaleidx: MAi2UserKaleidxRepo, val userIntimate: MAi2UserIntimateRepo, - val gameCharge: Mai2GameChargeRepo, - val gameEvent: Mai2GameEventRepo, - val gameSellingCard: Mai2GameSellingCardRepo, val userRegions: Mai2UserRegionsRepo, -) + gameData: GameDataService +) { + val gameCharge = StaticRepo(gameData.mai2Charges) { it.orderId } + val gameEvent = StaticRepo(gameData.mai2Events) { it.id } + val gameSellingCard = StaticRepo(gameData.mai2SellingCards) { it.cardId } +} diff --git a/src/main/java/icu/samnyan/aqua/sega/ongeki/OngekiRepos.kt b/src/main/java/icu/samnyan/aqua/sega/ongeki/OngekiRepos.kt index a30403e2..97202479 100644 --- a/src/main/java/icu/samnyan/aqua/sega/ongeki/OngekiRepos.kt +++ b/src/main/java/icu/samnyan/aqua/sega/ongeki/OngekiRepos.kt @@ -12,6 +12,8 @@ import org.springframework.data.jpa.repository.JpaRepository import org.springframework.data.jpa.repository.Query import org.springframework.data.repository.NoRepositoryBean import org.springframework.stereotype.Component +import icu.samnyan.aqua.sega.util.GameDataService +import icu.samnyan.aqua.sega.util.StaticRepo import java.util.* @@ -149,15 +151,12 @@ interface OgkUserRegionsRepo: OngekiUserLinked { fun findByUserAndRegionId(user: UserData, regionId: Int): UserRegions? } -interface OgkGameGachaCardRepo : JpaRepository { - fun findAllByGachaId(gachaId: Long): List - - @Query("SELECT g FROM OngekiGameGachaCard g WHERE g.gachaId = :gachaId OR g.gachaId = 1112") - fun findAllByGachaIdAndPermanent(gachaId: Long): List +class OngekiGameGachaCardRepo(data: List) : StaticRepo(data, { it.cardId }) { + private val gachaMap by lazy { data.groupBy { it.gachaId } } + fun findAllByGachaId(gachaId: Long) = gachaMap[gachaId] ?: emptyList() + fun findAllByGachaIdAndPermanent(gachaId: Long) = (gachaMap[gachaId] ?: emptyList()) + (gachaMap[1112L] ?: emptyList()) } -interface OgkGameGachaRepo : JpaRepository - interface OgkUserGachaRepo : OngekiUserLinked { fun findByUserAndGachaId(user: UserData, gachaId: Long): UserGacha? } @@ -166,14 +165,6 @@ interface OgkUserGachaRepo : OngekiUserLinked { interface OgkUserEventMapRepo : OngekiUserLinked interface OgkUserSkinRepo : OngekiUserLinked -interface OgkGameCardRepo : JpaRepository -interface OgkGameCharaRepo : JpaRepository -interface OgkGameEventRepo : JpaRepository -interface OgkGameMusicRepo : JpaRepository -interface OgkGamePointRepo : JpaRepository -interface OgkGamePresentRepo : JpaRepository -interface OgkGameRewardRepo : JpaRepository -interface OgkGameSkillRepo : JpaRepository @Component class OngekiUserRepos( @@ -211,17 +202,19 @@ class OngekiUserRepos( @Component class OngekiGameRepos( - val card: OgkGameCardRepo, - val chara: OgkGameCharaRepo, - val event: OgkGameEventRepo, - val music: OgkGameMusicRepo, - val point: OgkGamePointRepo, - val present: OgkGamePresentRepo, - val reward: OgkGameRewardRepo, - val skill: OgkGameSkillRepo, - val gachaCard: OgkGameGachaCardRepo, - val gacha:OgkGameGachaRepo -) + val gameData: GameDataService +) { + val card = StaticRepo(gameData.ogkGameCards) { it.cardId } + val chara = StaticRepo(gameData.ogkGameCharas) { it.modelId } + val event = StaticRepo(gameData.ogkGameEvents) { it.id } + val music = StaticRepo(gameData.ogkGameMusics) { it.id } + val point = StaticRepo(gameData.ogkGamePoints) { it.id } + val present = StaticRepo(gameData.ogkGamePresents) { it.id } + val reward = StaticRepo(gameData.ogkGameRewards) { it.id } + val skill = StaticRepo(gameData.ogkGameSkills) { it.id } + val gachaCard = OngekiGameGachaCardRepo(gameData.ogkGameGachaCards) + val gacha = StaticRepo(gameData.ogkGameGachas) { it.gachaId } +} @Component class OngekiRepos( diff --git a/src/main/java/icu/samnyan/aqua/sega/ongeki/model/OngekiGameEntities.kt b/src/main/java/icu/samnyan/aqua/sega/ongeki/model/OngekiGameEntities.kt index 6587d5fe..47c50725 100644 --- a/src/main/java/icu/samnyan/aqua/sega/ongeki/model/OngekiGameEntities.kt +++ b/src/main/java/icu/samnyan/aqua/sega/ongeki/model/OngekiGameEntities.kt @@ -1,14 +1,9 @@ package icu.samnyan.aqua.sega.ongeki.model -import com.fasterxml.jackson.annotation.JsonIgnore import com.fasterxml.jackson.annotation.JsonProperty -import jakarta.persistence.* -@Entity(name = "OngekiGameCard") -@Table(name = "ongeki_game_card") class GameCard { - @Id - var id: Long = 0 + var cardId: Long = 0 var name: String = "" var nickName: String = "" var attribute: String = "" @@ -24,30 +19,17 @@ class GameCard { var version: String = "" } - -@Entity(name = "OngekiGameChara") -@Table(name = "ongeki_game_chara") class GameChara { - @Id - var id: Long = 0 var name: String = "" var cv: String = "" var modelId = 0 } - -@Entity(name = "OngekiGameEvent") -@Table(name = "ongeki_game_event") class GameEvent { - @Id var id: Long = 0 } - -@Entity(name = "OngekiGameMusic") -@Table(name = "ongeki_game_music") class GameMusic { - @Id var id: Long = 0 var name: String = "" var sortName: String = "" @@ -62,26 +44,15 @@ class GameMusic { var level4: String = "" } - -@Entity(name = "OngekiGamePoint") -@Table(name = "ongeki_game_point", uniqueConstraints = [UniqueConstraint(columnNames = ["type"])]) class GamePoint { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @JsonIgnore var id: Long = 0 - @Enumerated(EnumType.ORDINAL) var type: OgkGpProductID = OgkGpProductID.A_Credit1 var cost: Int = 0 val startDate = "2000-01-01 05:00:00.0" val endDate = "2099-01-01 05:00:00.0" } - -@Entity(name = "OngekiGamePresent") -@Table(name = "ongeki_game_present") class GamePresent { - @Id var id: Long = 0 var presentName: String = "" var rewardId: Int = 0 // count @@ -91,33 +62,20 @@ class GamePresent { val endDate = "2099-01-01 05:00:00.0" } - -@Entity(name = "OngekiGameReward") -@Table(name = "ongeki_game_reward") class GameReward { - @Id var id: Long = 0 - - @Enumerated(EnumType.ORDINAL) var itemKind: OgkItemType = OgkItemType.None var itemId = 0 } - -@Entity(name = "OngekiGameSkill") -@Table(name = "ongeki_game_skill") class GameSkill { - @Id var id: Long = 0 var name: String = "" var category: String = "" var info: String = "" } -@Entity(name = "OngekiGameGachaCard") -@Table(name = "ongeki_game_gacha_card") class GameGachaCard { - @Id var cardId: Long = 0 var gachaId: Long = 0 var rarity: Int = 0 @@ -130,10 +88,7 @@ class GameGachaCard { var isSelect: Boolean = false } -@Entity(name = "OngekiGameGacha") -@Table(name = "ongeki_game_gacha") class GameGacha { - @Id var gachaId: Long = 0 var gachaName: String = "" var type: Int = 0 @@ -142,11 +97,11 @@ class GameGacha { var ceilingCnt: Int = 0 var changeRateCnt1: Int = 0 var changeRateCnt2: Int = 0 - var startDate: String = "" - var endDate: String = "" - var noticeStartDate: String = "" - var noticeEndDate: String = "" - var convertEndDate: String = "" + var startDate: String = "2020-01-01 00:00:00" + var endDate: String = "2099-01-01 00:00:00" + var noticeStartDate: String = "2020-01-01 00:00:00" + var noticeEndDate: String = "2099-01-01 00:00:00" + var convertEndDate: String = "2099-01-01 00:00:00" @JsonProperty("isCeiling") var isCeiling: Boolean = false diff --git a/src/main/java/icu/samnyan/aqua/sega/util/GameDataService.kt b/src/main/java/icu/samnyan/aqua/sega/util/GameDataService.kt new file mode 100644 index 00000000..b2322465 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/util/GameDataService.kt @@ -0,0 +1,114 @@ +package icu.samnyan.aqua.sega.util + +import com.fasterxml.jackson.core.type.TypeReference +import ext.logger +import ext.toJson +import icu.samnyan.aqua.sega.chusan.model.GameCharge as Chu3GameCharge +import icu.samnyan.aqua.sega.chusan.model.GameEvent as Chu3GameEvent +import icu.samnyan.aqua.sega.chusan.model.GameGacha as Chu3GameGacha +import icu.samnyan.aqua.sega.chusan.model.GameGachaCard as Chu3GameGachaCard +import icu.samnyan.aqua.sega.chusan.model.GameLinkedVerse as Chu3GameLinkedVerse +import icu.samnyan.aqua.sega.chusan.model.GameLoginBonus as Chu3GameLoginBonus +import icu.samnyan.aqua.sega.chusan.model.GameLoginBonusPreset as Chu3GameLoginBonusPreset +import icu.samnyan.aqua.sega.maimai2.model.Mai2GameCharge +import icu.samnyan.aqua.sega.maimai2.model.Mai2GameEvent +import icu.samnyan.aqua.sega.maimai2.model.Mai2GameSellingCard +import icu.samnyan.aqua.sega.ongeki.model.GameCard as OgkGameCard +import icu.samnyan.aqua.sega.ongeki.model.GameChara as OgkGameChara +import icu.samnyan.aqua.sega.ongeki.model.GameEvent as OgkGameEvent +import icu.samnyan.aqua.sega.ongeki.model.GameGacha as OgkGameGacha +import icu.samnyan.aqua.sega.ongeki.model.GameGachaCard as OgkGameGachaCard +import icu.samnyan.aqua.sega.ongeki.model.GameMusic as OgkGameMusic +import icu.samnyan.aqua.sega.ongeki.model.GamePoint as OgkGamePoint +import icu.samnyan.aqua.sega.ongeki.model.GamePresent as OgkGamePresent +import icu.samnyan.aqua.sega.ongeki.model.GameReward as OgkGameReward +import icu.samnyan.aqua.sega.ongeki.model.GameSkill as OgkGameSkill +import org.slf4j.LoggerFactory +import org.springframework.stereotype.Service +import java.io.File + +@Service +class GameDataService() { + companion object { + val log = logger() + val mapper = BasicMapper() + + inline fun load(game: String, file: String): List { + val f = File("data/game/$game/$file") + if (f.exists()) return mapper.read(f.readText(), object : TypeReference>() {}) + + // Try load from resources + val resPath = "/data/game/$game/$file" + val resStream = GameDataService::class.java.getResourceAsStream(resPath) + if (resStream != null) { + log.info("Loading game data from internal resources: $resPath") + return mapper.read(resStream.bufferedReader().use { it.readText() }, object : TypeReference>() {}) + } + + log.warn("Game data file $f or resource $resPath not found, using empty list") + return emptyList() + } + } + + // maimai2 + lateinit var mai2Events: List + lateinit var mai2Charges: List + lateinit var mai2SellingCards: List + + // chusan + lateinit var chu3GameLinkedVerses: List + lateinit var chu3GameCharges: List + lateinit var chu3GameEvents: List + lateinit var chu3GameGachaCards: List + lateinit var chu3GameGachas: List + lateinit var chu3GameLoginBonusPresets: List + lateinit var chu3GameLoginBonuses: List + + // ongeki + lateinit var ogkGameCards: List + lateinit var ogkGameCharas: List + lateinit var ogkGameEvents: List + lateinit var ogkGameMusics: List + lateinit var ogkGamePoints: List + lateinit var ogkGamePresents: List + lateinit var ogkGameRewards: List + lateinit var ogkGameSkills: List + lateinit var ogkGameGachaCards: List + lateinit var ogkGameGachas: List + + init { + load() + } + + fun load() { + mai2Events = load("maimai2", "game_event.json") + mai2Charges = load("maimai2", "game_charge.json") + mai2SellingCards = load("maimai2", "game_selling_card.json") + + chu3GameLinkedVerses = load("chusan", "game_linked_verse.json") + chu3GameCharges = load("chusan", "game_charge.json") + chu3GameEvents = load("chusan", "game_event.json") + chu3GameGachaCards = load("chusan", "game_gacha_card.json") + chu3GameGachas = load("chusan", "game_gacha.json") + chu3GameLoginBonusPresets = load("chusan", "game_login_bonus_preset.json") + chu3GameLoginBonuses = load("chusan", "game_login_bonus.json") + + ogkGameCards = load("ongeki", "game_card.json") + ogkGameCharas = load("ongeki", "game_chara.json") + ogkGameEvents = load("ongeki", "game_event.json") + ogkGameMusics = load("ongeki", "game_music.json") + ogkGamePoints = load("ongeki", "game_point.json") + ogkGamePresents = load("ongeki", "game_present.json") + ogkGameRewards = load("ongeki", "game_reward.json") + ogkGameSkills = load("ongeki", "game_skill.json") + ogkGameGachaCards = load("ongeki", "game_gacha_card.json") + ogkGameGachas = load("ongeki", "game_gacha.json") + } +} + +fun main(args: Array) { + GameDataService().let { + it.load() + println(it.mai2Events[0].toJson()) + } +} diff --git a/src/main/java/icu/samnyan/aqua/sega/util/StaticRepo.kt b/src/main/java/icu/samnyan/aqua/sega/util/StaticRepo.kt new file mode 100644 index 00000000..79a21176 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/util/StaticRepo.kt @@ -0,0 +1,26 @@ +package icu.samnyan.aqua.sega.util + +import java.lang.reflect.Field +import java.util.* + +open class StaticRepo(val data: List, val idGetter: (T) -> ID) { + fun findAll(): List = data + private val idMap by lazy { data.associateBy { idGetter(it) } } + fun findById(id: ID): Optional = Optional.ofNullable(idMap[id]) + + private val enableField by lazy { + data.firstOrNull()?.let { obj -> + var cls: Class<*>? = obj::class.java + var f: Field? = null + while (cls != null && f == null) { + f = cls.declaredFields.find { it.name == "enable" || it.name == "isEnabled" } + cls = cls.superclass + } + f?.apply { isAccessible = true } + } + } + + private val enableMap by lazy { data.groupBy { enableField?.get(it) as? Boolean } } + + fun findByEnable(enable: Boolean): List = enableMap[enable] ?: emptyList() +}