diff --git a/src/main/kotlin/net/taehui/twilight/qwilight/QwilightAvatar.kt b/src/main/kotlin/net/taehui/twilight/qwilight/QwilightAvatar.kt index 5d7b226..2d89526 100644 --- a/src/main/kotlin/net/taehui/twilight/qwilight/QwilightAvatar.kt +++ b/src/main/kotlin/net/taehui/twilight/qwilight/QwilightAvatar.kt @@ -817,6 +817,7 @@ val inputMode = targetComputing.inputMode val lastAvatarAbility = when (inputMode) { Component.InputMode.INPUT_MODE_5_1 -> DB.getAvatarAbility5K(avatarID) + Component.InputMode.INPUT_MODE_6 -> DB.getAvatarAbility6K(avatarID) Component.InputMode.INPUT_MODE_7_1 -> DB.getAvatarAbility7K(avatarID) Component.InputMode.INPUT_MODE_9 -> DB.getAvatarAbility9K(avatarID) else -> 0.0 @@ -824,6 +825,7 @@ val lastAvatarLevel = DB.getAvatarLevels(it)[0] val abilityClassVariety = when (inputMode) { Component.InputMode.INPUT_MODE_5_1 -> AbilityClassSystem.AbilityClassVariety.INPUT_MODE_5K + Component.InputMode.INPUT_MODE_6 -> AbilityClassSystem.AbilityClassVariety.INPUT_MODE_6K Component.InputMode.INPUT_MODE_7_1 -> AbilityClassSystem.AbilityClassVariety.INPUT_MODE_7K Component.InputMode.INPUT_MODE_9 -> AbilityClassSystem.AbilityClassVariety.INPUT_MODE_9K else -> null @@ -894,6 +896,7 @@ val avatarAbility = when (inputMode) { Component.InputMode.INPUT_MODE_5_1 -> DB.getAvatarAbility5K(avatarID) + Component.InputMode.INPUT_MODE_6 -> DB.getAvatarAbility6K(avatarID) Component.InputMode.INPUT_MODE_7_1 -> DB.getAvatarAbility7K(avatarID) Component.InputMode.INPUT_MODE_9 -> DB.getAvatarAbility9K(avatarID) else -> 0.0 diff --git a/src/main/kotlin/net/taehui/twilight/system/AbilityClassSystem.kt b/src/main/kotlin/net/taehui/twilight/system/AbilityClassSystem.kt index 6ea1a1e..f8c3674 100644 --- a/src/main/kotlin/net/taehui/twilight/system/AbilityClassSystem.kt +++ b/src/main/kotlin/net/taehui/twilight/system/AbilityClassSystem.kt @@ -10,7 +10,7 @@ object AbilityClassSystem : Logger { enum class AbilityClassVariety(@JvmField val value: Int) { - ETC(-1), INPUT_MODE_5K(0), INPUT_MODE_7K(1), INPUT_MODE_9K(2); + ETC(-1), INPUT_MODE_5K(0), INPUT_MODE_6K(1), INPUT_MODE_7K(2), INPUT_MODE_9K(3); @JsonValue fun getValue(): Int { @@ -128,6 +128,7 @@ when (abilityClassVariety) { AbilityClassVariety.ETC -> "" AbilityClassVariety.INPUT_MODE_5K -> "5K" + AbilityClassVariety.INPUT_MODE_6K -> "6K" AbilityClassVariety.INPUT_MODE_7K -> "7K" AbilityClassVariety.INPUT_MODE_9K -> "9K" } diff --git a/src/main/kotlin/net/taehui/twilight/system/DB.kt b/src/main/kotlin/net/taehui/twilight/system/DB.kt index 2513a31..139c34f 100644 --- a/src/main/kotlin/net/taehui/twilight/system/DB.kt +++ b/src/main/kotlin/net/taehui/twilight/system/DB.kt @@ -100,6 +100,7 @@ Total_Notes INTEGER NOT NULL, Is_Salt BOOLEAN NOT NULL, Ability_5K REAL NOT NULL, + Ability_6K REAL NOT NULL, Ability_7K REAL NOT NULL, Ability_9K REAL NOT NULL, Length REAL NOT NULL, @@ -113,6 +114,7 @@ FULLTEXT (Genre), KEY (Is_Salt), KEY (Ability_5K), + KEY (Ability_6K), KEY (Ability_7K), KEY (Ability_9K), KEY (Total_Count), @@ -1848,7 +1850,7 @@ it.prepareStatement( """ REPLACE INTO tw_note - VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0, 0, 0) + VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0, 0, 0, 0) """.trimIndent() ).use { dbStatement -> val isSalt = targetComputing.isSalt @@ -1875,7 +1877,7 @@ dbStatement.setDouble( 14, if (isSalt) 0.0 else AbilitySystem.getAbility( - AbilityClassSystem.AbilityClassVariety.INPUT_MODE_7K, + AbilityClassSystem.AbilityClassVariety.INPUT_MODE_6K, noteID128, noteID256 ) @@ -1883,6 +1885,14 @@ dbStatement.setDouble( 15, if (isSalt) 0.0 else AbilitySystem.getAbility( + AbilityClassSystem.AbilityClassVariety.INPUT_MODE_7K, + noteID128, + noteID256 + ) + ) + dbStatement.setDouble( + 16, + if (isSalt) 0.0 else AbilitySystem.getAbility( AbilityClassSystem.AbilityClassVariety.INPUT_MODE_9K, noteID128, noteID256 @@ -1961,7 +1971,7 @@ it.prepareStatement( """ UPDATE tw_note - SET Ability_5K = ?, Ability_7K = ?, Ability_9K = ? + SET Ability_5K = ?, Ability_6K = ?, Ability_7K = ?, Ability_9K = ? WHERE Note_ID = ? """.trimIndent() ).use { dbStatement -> @@ -1976,7 +1986,7 @@ dbStatement.setDouble( 2, if (isSalt) 0.0 else AbilitySystem.getAbility( - AbilityClassSystem.AbilityClassVariety.INPUT_MODE_7K, + AbilityClassSystem.AbilityClassVariety.INPUT_MODE_6K, noteID128, noteID256 ) @@ -1984,6 +1994,14 @@ dbStatement.setDouble( 3, if (isSalt) 0.0 else AbilitySystem.getAbility( + AbilityClassSystem.AbilityClassVariety.INPUT_MODE_7K, + noteID128, + noteID256 + ) + ) + dbStatement.setDouble( + 4, + if (isSalt) 0.0 else AbilitySystem.getAbility( AbilityClassSystem.AbilityClassVariety.INPUT_MODE_9K, noteID128, noteID256 @@ -2821,6 +2839,10 @@ var avatarAbility5KPlace = 0 var avatarAbility5KCount = 0 var avatarAbility5KStatus = 0.0 + var avatarAbility6K = 0.0 + var avatarAbility6KPlace = 0 + var avatarAbility6KCount = 0 + var avatarAbility6KStatus = 0.0 var avatarAbility7K = 0.0 var avatarAbility7KPlace = 0 var avatarAbility7KCount = 0 @@ -3005,6 +3027,21 @@ avatarAbility5K ) }, logFuture { + val rawAbilities6K = getAbilities6K() + val targetAbilities6K = getAbilities(rawAbilities6K).toList() + val validAbilities6K = targetAbilities6K.stream().filter { it.second.second }.toList() + val targetAbility6K = + targetAbilities6K.stream().filter { it.first.first == avatarID }.findAny().orElse( + Pair(Pair(avatarID, avatarName), Pair(0.0, false)) + ) + avatarAbility6K = targetAbility6K.second.first + avatarAbility6KPlace = validAbilities6K.indexOf(targetAbility6K) + avatarAbility6KCount = validAbilities6K.size + avatarAbility6KStatus = AbilityClassSystem.getStatus( + AbilityClassSystem.AbilityClassVariety.INPUT_MODE_6K, + avatarAbility6K + ) + }, logFuture { val rawAbilities7K = getAbilities7K() val targetAbilities7K = getAbilities(rawAbilities7K).toList() val validAbilities7K = targetAbilities7K.stream().filter { it.second.second }.toList() @@ -3052,6 +3089,10 @@ val avatarAbility5KPlace = avatarAbility5KPlace + 1 val avatarAbility5KCount = avatarAbility5KCount val avatarAbility5KStatus = avatarAbility5KStatus + val avatarAbility6K = avatarAbility6K + val avatarAbility6KPlace = avatarAbility6KPlace + 1 + val avatarAbility6KCount = avatarAbility6KCount + val avatarAbility6KStatus = avatarAbility6KStatus val avatarAbility7K = avatarAbility7K val avatarAbility7KPlace = avatarAbility7KPlace + 1 val avatarAbility7KCount = avatarAbility7KCount @@ -3077,6 +3118,13 @@ Pair(0.0, false) ).first + val rawAbilities6K = getAbilities6K() + val targetAbilities6K = getAbilities(rawAbilities6K).toList() + val targetAbility6K = + targetAbilities6K.stream().filter { it.first.first == avatarID }.map { it.second }.findAny().orElse( + Pair(0.0, false) + ).first + val rawAbilities7K = getAbilities7K() val targetAbilities7K = getAbilities(rawAbilities7K).toList() val targetAbility7K = @@ -3093,10 +3141,8 @@ return AbilityClassSystem.getPlatformAbilityText( minOf( - AbilityClassSystem.getValue( - AbilityClassSystem.AbilityClassVariety.INPUT_MODE_5K, - targetAbility5K - ), + AbilityClassSystem.getValue(AbilityClassSystem.AbilityClassVariety.INPUT_MODE_5K, targetAbility5K), + AbilityClassSystem.getValue(AbilityClassSystem.AbilityClassVariety.INPUT_MODE_6K, targetAbility6K), AbilityClassSystem.getValue(AbilityClassSystem.AbilityClassVariety.INPUT_MODE_7K, targetAbility7K), AbilityClassSystem.getValue(AbilityClassSystem.AbilityClassVariety.INPUT_MODE_9K, targetAbility9K) ) @@ -3233,6 +3279,7 @@ return logValueFuture { (when (inputMode) { Component.InputMode.INPUT_MODE_5_1 -> getAbilities5K(true) + Component.InputMode.INPUT_MODE_6 -> getAbilities6K(true) Component.InputMode.INPUT_MODE_7_1 -> getAbilities7K(true) Component.InputMode.INPUT_MODE_9 -> getAbilities9K(true) else -> emptyMap() @@ -3509,6 +3556,79 @@ } } + private fun getAbilities6K(getHandled: Boolean = false): Map, MutableCollection> { + val abilities6K = mutableMapOf, MutableCollection>() + pool.connection.use { + it.prepareStatement( + """ + SELECT tw_note.Note_ID, Note_Variety, Artist, Title, Genre, Level_Text, tw_note.Level, Stand, Avatar_ID, Avatar_Name, Ability_6K * (POWER(Stand / 1000000, 3) - 0.5 * POWER(Stand / 1000000, 2) + 0.5 * (Stand / 1000000)) AS Value + FROM tw_comment + INNER JOIN tw_note USING(Note_ID) + INNER JOIN tn_avatar ON tw_comment.Avatar = tn_avatar.Avatar_ID + WHERE Ability_6K > 0.0 AND ${ + getAbilityFilter( + Component.DEFAULT_INPUT_FAVOR_MODE, + Component.MODE_5_INPUT_FAVOR_MODE, + Component.MODE_5_1_INPUT_FAVOR_MODE + ) + } AND Is_Max = true + ORDER BY Value DESC + """.trimIndent() + ).use { dbStatement -> + dbStatement.executeQuery().use { rows -> + while (rows.next()) { + val avatarID = rows.getString("Avatar_ID") + val noteID = rows.getString("Note_ID") + val abilities = abilities6K.computeIfAbsent( + Pair(avatarID, rows.getString("Avatar_Name")) + ) { ArrayList() } + if (abilities.size < 50) { + abilities.add( + JSON.TwilightWwwAvatarAbility( + rows, + 0.95.pow(abilities.size.toDouble()), + if (getHandled) getHandled(avatarID, noteID) else Component.Handled.NOT + ) + ) + } + } + } + } + } + return abilities6K + } + + fun getAvatarAbility6K(avatarID: String): Double { + pool.connection.use { db -> + db.prepareStatement( + """ + SELECT Ability_6K * (POWER(Stand / 1000000, 3) - 0.5 * POWER(Stand / 1000000, 2) + 0.5 * (Stand / 1000000)) AS Value + FROM tw_comment + INNER JOIN tw_note USING(Note_ID) + INNER JOIN tn_avatar ON tw_comment.Avatar = tn_avatar.Avatar_ID + WHERE Avatar = ? AND Ability_6K > 0.0 AND ${ + getAbilityFilter( + Component.DEFAULT_INPUT_FAVOR_MODE, + Component.MODE_5_INPUT_FAVOR_MODE, + Component.MODE_5_1_INPUT_FAVOR_MODE + ) + } AND Is_Max = true + ORDER BY Value DESC + LIMIT 50 + """.trimIndent() + ).use { dbStatement -> + dbStatement.setString(1, avatarID) + dbStatement.executeQuery().use { rows -> + val abilities = mutableListOf() + while (rows.next()) { + abilities.add(rows.getDouble("Value") * 0.95.pow(abilities.size.toDouble())) + } + return abilities.sumOf { it } + } + } + } + } + private fun getAbilities7K(getHandled: Boolean = false): Map, MutableCollection> { val abilities7K = mutableMapOf, MutableCollection>() pool.connection.use { @@ -3931,6 +4051,7 @@ getAbilities( when (inputMode) { Component.InputMode.INPUT_MODE_5_1 -> getAbilities5K() + Component.InputMode.INPUT_MODE_6 -> getAbilities6K() Component.InputMode.INPUT_MODE_7_1 -> getAbilities7K() Component.InputMode.INPUT_MODE_9 -> getAbilities9K() else -> emptyMap() diff --git a/src/main/kotlin/net/taehui/twilight/system/IO.kt b/src/main/kotlin/net/taehui/twilight/system/IO.kt index c3d510f..6061d15 100644 --- a/src/main/kotlin/net/taehui/twilight/system/IO.kt +++ b/src/main/kotlin/net/taehui/twilight/system/IO.kt @@ -1,18 +1,13 @@ package net.taehui.twilight.system -import net.taehui.twilight.BaseCompiler import net.taehui.twilight.Logger -import net.taehui.twilight.TwilightComponent -import net.taehui.twilight.Utility +import org.jline.reader.EndOfFileException import org.jline.reader.UserInterruptException -import java.nio.file.Files import java.nio.file.Path import java.time.LocalDateTime import java.util.concurrent.CompletableFuture import java.util.concurrent.Future import java.util.concurrent.atomic.AtomicInteger -import java.util.stream.StreamSupport - object IO : Logger { private val futureLearnNotesStatus = AtomicInteger() @@ -520,6 +515,7 @@ } } } catch (_: UserInterruptException) { + } catch (_: EndOfFileException) { } catch (e: Exception) { logFault(e) } diff --git a/src/main/kotlin/net/taehui/twilight/www/WwwAvatar.kt b/src/main/kotlin/net/taehui/twilight/www/WwwAvatar.kt index 38fd072..44f99a8 100644 --- a/src/main/kotlin/net/taehui/twilight/www/WwwAvatar.kt +++ b/src/main/kotlin/net/taehui/twilight/www/WwwAvatar.kt @@ -313,6 +313,13 @@ send(ctx, it) } + "/qwilight/www/avatar/ability/6K" -> DB.getAvatarAbility( + Component.InputMode.INPUT_MODE_6, + avatarID + ).thenAccept { + send(ctx, it) + } + "/qwilight/www/avatar/ability/7K" -> DB.getAvatarAbility( Component.InputMode.INPUT_MODE_7_1, avatarID @@ -387,6 +394,11 @@ send(ctx, it) } + "/qwilight/www/hall/ability/6K" -> DB.getHallAbility(Component.InputMode.INPUT_MODE_6) + .thenAccept { + send(ctx, it) + } + "/qwilight/www/hall/ability/7K" -> DB.getHallAbility(Component.InputMode.INPUT_MODE_7_1) .thenAccept { send(ctx, it)