[+] Use data jsons instead of db

This commit is contained in:
Azalea
2026-03-28 05:49:56 -04:00
parent 78b48c0f5c
commit afa9564392
8 changed files with 236 additions and 202 deletions
@@ -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)
}
@@ -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<Chu3UserChallenge> {
fun findByUserAndUnlockChallengeId(user: Chu3UserData, unlockChallengeId: Int): Chu3UserChallenge?
}
interface Chu3GameChargeRepo : JpaRepository<GameCharge, Long>
interface Chu3GameEventRepo : JpaRepository<GameEvent, Int> {
fun findByEnable(enable: Boolean): List<GameEvent>
}
interface Chu3GameGachaCardRepo : JpaRepository<GameGachaCard, Long> {
fun findAllByGachaId(gachaId: Int): List<GameGachaCard>
}
interface Chu3GameGachaRepo : JpaRepository<GameGacha, Long>
interface Chu3GameLoginBonusPresetsRepo : JpaRepository<GameLoginBonusPreset, Long> {
@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<GameLoginBonusPreset>
}
interface Chu3GameLoginBonusRepo : JpaRepository<GameLoginBonus, Int> {
@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<GameLoginBonus>
@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<UserRegions> {
fun findByUserAndRegionId(user: Chu3UserData, regionId: Int): UserRegions?
}
class Chu3GameGachaCardRepo(data: List<GameGachaCard>) : StaticRepo<GameGachaCard, Long>(data, { it.id }) {
fun findAllByGachaId(gachaId: Int) = data.filter { it.gachaId == gachaId }
}
class Chu3GameLoginBonusPresetsRepo(data: List<GameLoginBonusPreset>) : StaticRepo<GameLoginBonusPreset, Long>(data, { it.id }) {
fun findLoginBonusPresets(version: Int, isEnabled: Int) = data.filter { it.version == version && it.isEnabled == (isEnabled == 1) }
}
class Chu3GameLoginBonusRepo(data: List<GameLoginBonus>) : StaticRepo<GameLoginBonus, Long>(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
)
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 }
}
@@ -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"
}
@@ -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<Mai2UserIntimate> {
fun findByUserAndPartnerId(user: Mai2UserDetail, partnerId: Int): Mai2UserIntimate?
}
interface Mai2GameChargeRepo : JpaRepository<Mai2GameCharge, Long>
interface Mai2GameEventRepo : JpaRepository<Mai2GameEvent, Int> {
fun findByEnable(enable: Boolean): List<Mai2GameEvent>
}
interface Mai2GameSellingCardRepo : JpaRepository<Mai2GameSellingCard, Long>
interface Mai2UserRegionsRepo: Mai2UserLinked<UserRegions> {
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 }
}
@@ -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<UserRegions> {
fun findByUserAndRegionId(user: UserData, regionId: Int): UserRegions?
}
interface OgkGameGachaCardRepo : JpaRepository<GameGachaCard, Long> {
fun findAllByGachaId(gachaId: Long): List<GameGachaCard>
@Query("SELECT g FROM OngekiGameGachaCard g WHERE g.gachaId = :gachaId OR g.gachaId = 1112")
fun findAllByGachaIdAndPermanent(gachaId: Long): List<GameGachaCard>
class OngekiGameGachaCardRepo(data: List<GameGachaCard>) : StaticRepo<GameGachaCard, Long>(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<GameGacha, Long>
interface OgkUserGachaRepo : OngekiUserLinked<UserGacha> {
fun findByUserAndGachaId(user: UserData, gachaId: Long): UserGacha?
}
@@ -166,14 +165,6 @@ interface OgkUserGachaRepo : OngekiUserLinked<UserGacha> {
interface OgkUserEventMapRepo : OngekiUserLinked<UserEventMap>
interface OgkUserSkinRepo : OngekiUserLinked<UserSkin>
interface OgkGameCardRepo : JpaRepository<GameCard, Long>
interface OgkGameCharaRepo : JpaRepository<GameChara, Long>
interface OgkGameEventRepo : JpaRepository<GameEvent, Long>
interface OgkGameMusicRepo : JpaRepository<GameMusic, Long>
interface OgkGamePointRepo : JpaRepository<GamePoint, Long>
interface OgkGamePresentRepo : JpaRepository<GamePresent, Long>
interface OgkGameRewardRepo : JpaRepository<GameReward, Long>
interface OgkGameSkillRepo : JpaRepository<GameSkill, Long>
@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(
@@ -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
@@ -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 <reified T> load(game: String, file: String): List<T> {
val f = File("data/game/$game/$file")
if (f.exists()) return mapper.read(f.readText(), object : TypeReference<List<T>>() {})
// 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<List<T>>() {})
}
log.warn("Game data file $f or resource $resPath not found, using empty list")
return emptyList()
}
}
// maimai2
lateinit var mai2Events: List<Mai2GameEvent>
lateinit var mai2Charges: List<Mai2GameCharge>
lateinit var mai2SellingCards: List<Mai2GameSellingCard>
// chusan
lateinit var chu3GameLinkedVerses: List<Chu3GameLinkedVerse>
lateinit var chu3GameCharges: List<Chu3GameCharge>
lateinit var chu3GameEvents: List<Chu3GameEvent>
lateinit var chu3GameGachaCards: List<Chu3GameGachaCard>
lateinit var chu3GameGachas: List<Chu3GameGacha>
lateinit var chu3GameLoginBonusPresets: List<Chu3GameLoginBonusPreset>
lateinit var chu3GameLoginBonuses: List<Chu3GameLoginBonus>
// ongeki
lateinit var ogkGameCards: List<OgkGameCard>
lateinit var ogkGameCharas: List<OgkGameChara>
lateinit var ogkGameEvents: List<OgkGameEvent>
lateinit var ogkGameMusics: List<OgkGameMusic>
lateinit var ogkGamePoints: List<OgkGamePoint>
lateinit var ogkGamePresents: List<OgkGamePresent>
lateinit var ogkGameRewards: List<OgkGameReward>
lateinit var ogkGameSkills: List<OgkGameSkill>
lateinit var ogkGameGachaCards: List<OgkGameGachaCard>
lateinit var ogkGameGachas: List<OgkGameGacha>
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<String>) {
GameDataService().let {
it.load()
println(it.mai2Events[0].toJson())
}
}
@@ -0,0 +1,26 @@
package icu.samnyan.aqua.sega.util
import java.lang.reflect.Field
import java.util.*
open class StaticRepo<T : Any, ID>(val data: List<T>, val idGetter: (T) -> ID) {
fun findAll(): List<T> = data
private val idMap by lazy { data.associateBy { idGetter(it) } }
fun findById(id: ID): Optional<T> = 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<T> = enableMap[enable] ?: emptyList()
}