From 56e424c29bb52d072336816d6567dc7380213602 Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Sun, 5 Jan 2025 02:13:55 -0500 Subject: [PATCH] [+] Mut --- src/main/java/ext/Ext.kt | 6 +++++- src/main/java/icu/samnyan/aqua/net/Bot.kt | 4 ++-- src/main/java/icu/samnyan/aqua/net/Safety.kt | 5 +++-- .../java/icu/samnyan/aqua/net/games/GameApiController.kt | 4 ++-- src/main/java/icu/samnyan/aqua/net/games/GameHelper.kt | 3 ++- src/main/java/icu/samnyan/aqua/net/games/mai2/Maimai2.kt | 2 +- src/main/java/icu/samnyan/aqua/sega/allnet/AllNet.kt | 2 +- .../icu/samnyan/aqua/sega/chusan/handler/ChusanApis.kt | 4 ++-- .../java/icu/samnyan/aqua/sega/general/BaseHandler.kt | 2 +- .../icu/samnyan/aqua/sega/general/IntegerListConverter.kt | 5 +++-- .../samnyan/aqua/sega/maimai2/Maimai2ServletController.kt | 8 ++++---- src/main/java/icu/samnyan/aqua/sega/wacca/WaccaServer.kt | 8 ++++---- .../samnyan/aqua/sega/wacca/model/db/WaccaUserModels.kt | 2 +- 13 files changed, 31 insertions(+), 24 deletions(-) diff --git a/src/main/java/ext/Ext.kt b/src/main/java/ext/Ext.kt index d9480486..a94651df 100644 --- a/src/main/java/ext/Ext.kt +++ b/src/main/java/ext/Ext.kt @@ -190,7 +190,7 @@ val Any?.truthy get() = when (this) { fun ls(vararg args: T) = args.toList() inline fun arr(vararg args: T) = arrayOf(*args) operator fun Map.plus(map: Map) = - (if (this is MutableMap) this else toMutableMap()).apply { putAll(map) } + (if (this is MutableMap) this else mut).apply { putAll(map) } operator fun MutableMap.plusAssign(map: Map) { putAll(map) } fun Map.vNotNull(): Map = filterValues { it != null }.mapValues { it.value!! } fun MutableList.popAll(list: List) = list.also { removeAll(it) } @@ -201,6 +201,10 @@ fun Map.recursiveNotNull(): Map = mapNotNull { (k, v) - k to if (v is Map<*, *>) (v as Map).recursiveNotNull() else v }.toMap() as Map +val List.mut get() = toMutableList() +val Map.mut get() = toMutableMap() +val Set.mut get() = toMutableSet() + // Optionals operator fun Optional.invoke(): T? = orElse(null) fun Optional.expect(message: Str = "Value is not present") = orElseGet { (400 - message) } diff --git a/src/main/java/icu/samnyan/aqua/net/Bot.kt b/src/main/java/icu/samnyan/aqua/net/Bot.kt index c7f0bd5b..96b9b8d6 100644 --- a/src/main/java/icu/samnyan/aqua/net/Bot.kt +++ b/src/main/java/icu/samnyan/aqua/net/Bot.kt @@ -57,11 +57,11 @@ class BotController( us.cardRepo.findByExtId(cardId.long)(), us.cardRepo.findByLuid(cardId)(), us.cardRepo.findById(cardId.long)(), - ).toMutableList() + ).mut cards += cards.flatMap { (it.aquaUser?.cards ?: emptyList()) + listOfNotNull(it.aquaUser?.ghostCard) } - cards = cards.distinctBy { it.id }.toMutableList() + cards = cards.distinctBy { it.id }.mut return cards.map { card -> // Find all games played by this card diff --git a/src/main/java/icu/samnyan/aqua/net/Safety.kt b/src/main/java/icu/samnyan/aqua/net/Safety.kt index ecf6bf6a..04588caf 100644 --- a/src/main/java/icu/samnyan/aqua/net/Safety.kt +++ b/src/main/java/icu/samnyan/aqua/net/Safety.kt @@ -1,6 +1,7 @@ package icu.samnyan.aqua.net import ext.HTTP +import ext.mut import ext.toJson import icu.samnyan.aqua.net.games.BaseEntity import io.ktor.client.call.* @@ -54,8 +55,8 @@ class AquaNetSafetyService( */ suspend fun isSafeBatch(rawContents: List): List { val contents = rawContents.map { Normalizer.normalize(it, Normalizer.Form.NFKC) } - val origMap = safety.findAll().associateBy { it.content }.toMutableMap() - val map = safety.findAll().associateBy { it.content.lowercase().trim() }.toMutableMap() + val origMap = safety.findAll().associateBy { it.content }.mut + val map = safety.findAll().associateBy { it.content.lowercase().trim() }.mut // Process unseen content with OpenAI val news = contents.filter { it.lowercase().trim() !in map && it !in contents }.map { inp -> diff --git a/src/main/java/icu/samnyan/aqua/net/games/GameApiController.kt b/src/main/java/icu/samnyan/aqua/net/games/GameApiController.kt index fae5e98e..e37d2569 100644 --- a/src/main/java/icu/samnyan/aqua/net/games/GameApiController.kt +++ b/src/main/java/icu/samnyan/aqua/net/games/GameApiController.kt @@ -146,13 +146,13 @@ abstract class GameApiController(val name: String, userDataClass: plays.forEach { play -> val lvl = musicMapping[play.musicId]?.notes?.getOrNull(if (play.level == 10) 0 else play.level)?.lv ?: return@forEach shownRanks.find { (s, _) -> play.achievement > s }?.let { (_, v) -> - val ranks = detailedRanks.getOrPut(lvl.toInt()) { rankMap.toMutableMap() } + val ranks = detailedRanks.getOrPut(lvl.toInt()) { rankMap.mut } ranks[v] = ranks[v]!! + 1 } } // Collapse detailed ranks to get non-detailed ranks map - val ranks = shownRanks.associate { (_, v) -> v to 0 }.toMutableMap().also { ranks -> + val ranks = shownRanks.associate { (_, v) -> v to 0 }.mut.also { ranks -> plays.forEach { play -> shownRanks.find { (s, _) -> play.achievement > s }?.let { (_, v) -> ranks[v] = ranks[v]!! + 1 } } diff --git a/src/main/java/icu/samnyan/aqua/net/games/GameHelper.kt b/src/main/java/icu/samnyan/aqua/net/games/GameHelper.kt index 0bd09f87..095823eb 100644 --- a/src/main/java/icu/samnyan/aqua/net/games/GameHelper.kt +++ b/src/main/java/icu/samnyan/aqua/net/games/GameHelper.kt @@ -2,6 +2,7 @@ package icu.samnyan.aqua.net.games import ext.isoDate import ext.minus +import ext.mut import java.time.LocalDate const val LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + @@ -60,7 +61,7 @@ fun findTrend(log: List): List { val trend = d.distinctBy { it.date } .map { TrendOut(it.date, maxRating[it.date] ?: 0, playCounts[it.date] ?: 0) } - .sortedBy { it.date }.toMutableList() + .sortedBy { it.date }.mut // Fill in the missing dates (min date and current date) trend[0].let { if (it.date > minDate) trend.add(0, TrendOut(minDate, 0, 0)) } diff --git a/src/main/java/icu/samnyan/aqua/net/games/mai2/Maimai2.kt b/src/main/java/icu/samnyan/aqua/net/games/mai2/Maimai2.kt index cbab54ed..d51eabc4 100644 --- a/src/main/java/icu/samnyan/aqua/net/games/mai2/Maimai2.kt +++ b/src/main/java/icu/samnyan/aqua/net/games/mai2/Maimai2.kt @@ -127,7 +127,7 @@ class Maimai2( user = repos.userData.findByCardExtId(myCard.extId).orElse(null) ?: (404 - "User not found") propertyKey = "favorite_rival" } - val myRivalList = myRival.propertyValue.split(',').filter { it.isNotEmpty() }.toMutableSet() + val myRivalList = myRival.propertyValue.split(',').filter { it.isNotEmpty() }.mut if (isAdd && myRivalList.size >= 4) { (400 - "Rival list is full") diff --git a/src/main/java/icu/samnyan/aqua/sega/allnet/AllNet.kt b/src/main/java/icu/samnyan/aqua/sega/allnet/AllNet.kt index f7375110..d02fd4be 100644 --- a/src/main/java/icu/samnyan/aqua/sega/allnet/AllNet.kt +++ b/src/main/java/icu/samnyan/aqua/sega/allnet/AllNet.kt @@ -139,7 +139,7 @@ class AllNet( val ver = reqMap["ver"] ?: "1.0" val formatVer = reqMap["format_ver"] ?: "" - val resp = props.map.toMutableMap() + mapOf( + val resp = props.map.mut + mapOf( "uri" to switchUri(localAddr, localPort, gameId, ver, session), "host" to props.host.ifBlank { localAddr }, ) diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanApis.kt b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanApis.kt index 030b6299..e446975e 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanApis.kt +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanApis.kt @@ -91,7 +91,7 @@ fun ChusanController.chusanInit() { data["nextIndex"] = rawIndex % 10000000000L mapOf("itemKind" to kind) grabs { // TODO: All unlock - val items = db.userItem.findAllByUser_Card_ExtIdAndItemKind(uid, kind).toMutableList() + val items = db.userItem.findAllByUser_Card_ExtIdAndItemKind(uid, kind).mut // Check game options db.userData.findByCard_ExtId(uid)()?.card?.aquaUser?.gameOptions?.let { @@ -146,7 +146,7 @@ fun ChusanController.chusanInit() { // Compatibility: Older chusan uses boolean for isSuccess fun checkAncient(d: List) = data["version"]?.double?.let { if (it >= 2.15) d else d.map { - d.toJson().jsonMap().toMutableMap().apply { this["isSuccess"] = this["isSuccess"].truthy } + d.toJson().jsonMap().mut.apply { this["isSuccess"] = this["isSuccess"].truthy } } } ?: d db.userMusicDetail.findByUser_Card_ExtId(uid).groupBy { it.musicId } diff --git a/src/main/java/icu/samnyan/aqua/sega/general/BaseHandler.kt b/src/main/java/icu/samnyan/aqua/sega/general/BaseHandler.kt index 50726065..1b0d6e88 100644 --- a/src/main/java/icu/samnyan/aqua/sega/general/BaseHandler.kt +++ b/src/main/java/icu/samnyan/aqua/sega/general/BaseHandler.kt @@ -62,7 +62,7 @@ abstract class MeowApi(val serialize: (String, Any?) -> String) { } else pageCache[cacheKey] = millis() to list - (mapOf("userId" to uid, "length" to lst.size, "nextIndex" to iAfter, key to lst) + add).toMutableMap() + (mapOf("userId" to uid, "length" to lst.size, "nextIndex" to iAfter, key to lst) + add).mut .also { p.post?.invoke(it) } } fun String.paged(key: String, fn: PagedHandler) = pagedWithKind(key) { PagedProcessor(null, fn) } diff --git a/src/main/java/icu/samnyan/aqua/sega/general/IntegerListConverter.kt b/src/main/java/icu/samnyan/aqua/sega/general/IntegerListConverter.kt index ad047057..74adde13 100644 --- a/src/main/java/icu/samnyan/aqua/sega/general/IntegerListConverter.kt +++ b/src/main/java/icu/samnyan/aqua/sega/general/IntegerListConverter.kt @@ -1,11 +1,12 @@ package icu.samnyan.aqua.sega.general +import ext.ls import jakarta.persistence.AttributeConverter import jakarta.persistence.Converter @Converter class IntegerListConverter : AttributeConverter, String> { override fun convertToDatabaseColumn(lst: List?) = lst?.joinToString(";") ?: "" - override fun convertToEntityAttribute(str: String?) = if (str.isNullOrBlank()) mutableListOf() else - str.split(';').map { it.toInt() }.toMutableList() + override fun convertToEntityAttribute(str: String?) = if (str.isNullOrBlank()) ls() else + str.split(';').map { it.toInt() } } diff --git a/src/main/java/icu/samnyan/aqua/sega/maimai2/Maimai2ServletController.kt b/src/main/java/icu/samnyan/aqua/sega/maimai2/Maimai2ServletController.kt index 22e9d5f1..6834233a 100644 --- a/src/main/java/icu/samnyan/aqua/sega/maimai2/Maimai2ServletController.kt +++ b/src/main/java/icu/samnyan/aqua/sega/maimai2/Maimai2ServletController.kt @@ -319,17 +319,17 @@ class Maimai2ServletController( "GetUserScoreRankingApi", "UpsertClientBookkeepingApi", "UpsertClientSettingApi", "UpsertClientTestmodeApi", "UpsertClientUploadApi", "Ping", "RemoveTokenApi", "CMLoginApi", "CMLogoutApi", "CMUpsertBuyCardApi", "GetGameSettingApi", "GetGameKaleidxScopeApi", "GetGameMusicScoreApi", - "GetUserKaleidxScopeApi", "GetUserNewItemApi", "GetUserNewItemListApi").toMutableList() + "GetUserKaleidxScopeApi", "GetUserNewItemApi", "GetUserNewItemListApi").mut - val noopEndpoint = endpointList.popAll("GetUserScoreRankingApi", "UpsertClientBookkeepingApi", + val noopEndpoint = setOf("GetUserScoreRankingApi", "UpsertClientBookkeepingApi", "UpsertClientSettingApi", "UpsertClientTestmodeApi", "UpsertClientUploadApi", "Ping", "RemoveTokenApi", "CMLoginApi", "CMLogoutApi", "CMUpsertBuyCardApi", "UserLogoutApi", "GetGameMapAreaConditionApi", - "UpsertUserChargelogApi") + "UpsertUserChargelogApi").also { endpointList.removeAll(it) } val staticEndpoint = mapOf( "CreateTokenApi" to """{"Bearer":"meow"}""", "CMUpsertUserPrintlogApi" to """{"returnCode":1,"orderId":"0","serialId":"FAKECARDIMAG12345678"}""", - ).also { endpointList.popAll(it.keys.toList()) } + ).also { endpointList.removeAll(it.keys.toSet()) } val members = this::class.declaredMemberProperties val handlers: Map = endpointList.associateWith { api -> diff --git a/src/main/java/icu/samnyan/aqua/sega/wacca/WaccaServer.kt b/src/main/java/icu/samnyan/aqua/sega/wacca/WaccaServer.kt index c5cb14e4..a1496ab2 100644 --- a/src/main/java/icu/samnyan/aqua/sega/wacca/WaccaServer.kt +++ b/src/main/java/icu/samnyan/aqua/sega/wacca/WaccaServer.kt @@ -196,7 +196,7 @@ fun WaccaServer.init() { "user/status/GetDetail" api@ { _, (uid) -> val u = user(uid) ?: return@api "[]" val o = options(u) - val items = rp.item.findByUser(u).groupBy { it.type }.toMutableMap() + val items = rp.item.findByUser(u).groupBy { it.type }.mut val scores = rp.bestScore.findByUser(u) val scoreMap = scores.associateBy { it.musicId to it.level } val gates = rp.gate.findByUser(u) @@ -343,7 +343,7 @@ fun WaccaServer.init() { ?: WcUserScore().apply { user = u; musicId = pl.musicId; level = pl.level }).apply { grades[WaccaGrades.valueMap[pl.grade]?.ordinal ?: (400 - "Grade ${pl.grade} invalid")]++ - clears = clears.zip(pl.clears()) { a, b -> a + b }.toMutableList() + clears = clears.zip(pl.clears()) { a, b -> a + b }.mut achievement = max(achievement, pl.achievement) bestCombo = max(bestCombo, pl.maxCombo) lowestMissCt = min(lowestMissCt, pl.judgements[3]) @@ -425,7 +425,7 @@ fun WaccaServer.init() { "user/status/update" empty { req, (uid, playType, items, isContinue, isFirstPlayFree, itemsUsed, lastSong) -> val u = user(uid) ?: (404 - "User not found") - u.lastSongInfo = (lastSong as List).toMutableList() + u.lastSongInfo = (lastSong as List).mut afterPlay(u, items as List>, playType.int(), req.appVersion) } @@ -462,7 +462,7 @@ fun WaccaServer.init() { clearStatus = clearType.int() // 0..3: Fail, Blue, Silver, Gold clearSongCt = clearCt.int() playCt++ - if (scores.sum() > s.songScores.sum()) songScores = scores.toMutableList() + if (scores.sum() > s.songScores.sum()) songScores = scores.mut }) if (dan.int() > u.danLevel || (dan.int() == u.danLevel && clearType.int() > u.danType)) { diff --git a/src/main/java/icu/samnyan/aqua/sega/wacca/model/db/WaccaUserModels.kt b/src/main/java/icu/samnyan/aqua/sega/wacca/model/db/WaccaUserModels.kt index bc68ea9e..349e3e17 100644 --- a/src/main/java/icu/samnyan/aqua/sega/wacca/model/db/WaccaUserModels.kt +++ b/src/main/java/icu/samnyan/aqua/sega/wacca/model/db/WaccaUserModels.kt @@ -101,7 +101,7 @@ class WcUserScore : WaccaUserEntity() { var clears: MutableList = mutableListOf(0, 0, 0, 0, 0) // Played, Clear, Full Combo, Missless, All Marv @Convert(converter = IntegerListConverter::class) - var grades: MutableList = (1..13).map { 0 }.toMutableList() // From D to SSS+ + var grades: MutableList = (1..13).map { 0 }.mut // From D to SSS+ var bestCombo = 0 var lowestMissCt = Int.MAX_VALUE var rating = 0