Update version to v0.1.3

增加答题统计
增加排行榜
This commit is contained in:
2022-07-25 21:47:20 +08:00
parent cf51506432
commit b4dd18cc19
3 changed files with 135 additions and 30 deletions

View File

@ -7,7 +7,7 @@ plugins {
} }
group = "top.jie65535" group = "top.jie65535"
version = "0.1.2" version = "0.1.3"
repositories { repositories {
maven("https://maven.aliyun.com/repository/public") // 阿里云国内代理仓库 maven("https://maven.aliyun.com/repository/public") // 阿里云国内代理仓库

View File

@ -0,0 +1,38 @@
package top.jie65535.j24
import net.mamoe.mirai.console.data.AutoSavePluginData
import net.mamoe.mirai.console.data.value
object PluginData : AutoSavePluginData("data") {
/**
* 统计数据
* -
* - 群员
* - 数据
*/
val stats: MutableMap<Long, MutableMap<Long, PlayerStat>> by value()
}
@kotlinx.serialization.Serializable
data class PlayerStat(
/**
* 总答题数
*/
var totalCount: Int = 0,
/**
* 统计答题数
*/
var count: Int = 0,
/**
* 平均答题时间(S)
*/
var avgTime: Double = 0.0,
/**
* 最快答题时间(S)
*/
var minTime: Double = Double.MAX_VALUE,
)

View File

@ -3,10 +3,12 @@ package top.jie65535.j24
import net.mamoe.mirai.console.command.CommandManager.INSTANCE.register import net.mamoe.mirai.console.command.CommandManager.INSTANCE.register
import net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription import net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription
import net.mamoe.mirai.console.plugin.jvm.KotlinPlugin import net.mamoe.mirai.console.plugin.jvm.KotlinPlugin
import net.mamoe.mirai.contact.nameCardOrNick
import net.mamoe.mirai.event.GlobalEventChannel import net.mamoe.mirai.event.GlobalEventChannel
import net.mamoe.mirai.event.events.GroupMessageEvent import net.mamoe.mirai.event.events.GroupMessageEvent
import net.mamoe.mirai.event.subscribeGroupMessages import net.mamoe.mirai.event.subscribeGroupMessages
import net.mamoe.mirai.utils.info import net.mamoe.mirai.utils.info
import java.text.DecimalFormat
import java.time.Duration import java.time.Duration
import java.time.LocalDateTime import java.time.LocalDateTime
@ -14,7 +16,7 @@ object PluginMain : KotlinPlugin(
JvmPluginDescription( JvmPluginDescription(
id = "top.jie65535.j24", id = "top.jie65535.j24",
name = "J 24点游戏", name = "J 24点游戏",
version = "0.1.2" version = "0.1.3"
) { ) {
author("jie65535") author("jie65535")
info("24点游戏") info("24点游戏")
@ -22,16 +24,26 @@ object PluginMain : KotlinPlugin(
) { ) {
private val games: MutableMap<Long, Point24> = mutableMapOf() private val games: MutableMap<Long, Point24> = mutableMapOf()
private val df = DecimalFormat("0.00")
private const val prefix = "=" private const val prefix = "="
/**
* 排行榜计时器
* 为了防止频繁刷屏记录出榜时间一定间隔后才可再次触发
*/
private val rankTimes = mutableMapOf<Long, LocalDateTime>()
override fun onEnable() { override fun onEnable() {
logger.info { "Plugin loaded" } logger.info { "Plugin loaded" }
PluginCommand.register() PluginCommand.register()
PluginConfig.reload() PluginConfig.reload()
PluginData.reload()
val eventChannel = GlobalEventChannel.parentScope(this) GlobalEventChannel.parentScope(this)
eventChannel.filter { it is GroupMessageEvent && PluginConfig.enabledGroups.contains(it.group.id) }.subscribeGroupMessages { .filter { it is GroupMessageEvent && PluginConfig.enabledGroups.contains(it.group.id) }
startsWith("24点") reply { .subscribeGroupMessages {
"24点" reply {
var game = games[group.id] var game = games[group.id]
if (game == null || game.time.plusMinutes(1) < LocalDateTime.now()) { if (game == null || game.time.plusMinutes(1) < LocalDateTime.now()) {
game = Point24() game = Point24()
@ -40,6 +52,30 @@ object PluginMain : KotlinPlugin(
} else Unit } else Unit
} }
"24点榜" reply {
val g = PluginData.stats[group.id]
// 一小时内仅可查询一次
if (g != null && rankTimes[group.id]?.plusHours(1)?.isBefore(LocalDateTime.now()) != false) {
// 记录查询时间
rankTimes[group.id] = LocalDateTime.now()
// 拼接排行榜
val sb = StringBuilder()
sb.appendLine("[均时榜]")
sb.append(g.entries.sortedBy { it.value.avgTime }.take(3).joinToString("\n") {
"${df.format(it.value.avgTime)}s | ${group[it.key]?.nameCardOrNick ?: "侠名"}"
}).appendLine().appendLine()
sb.appendLine("[速度榜]")
sb.append(g.entries.sortedBy { it.value.minTime }.take(3).joinToString("\n") {
"${df.format(it.value.minTime)}s | ${group[it.key]?.nameCardOrNick ?: "侠名"}"
}).appendLine().appendLine()
sb.appendLine("[答题榜]")
sb.append(g.entries.sortedByDescending { it.value.totalCount }.take(3).joinToString("\n") {
"${it.value.totalCount} 道 | ${group[it.key]?.nameCardOrNick ?: "侠名"}"
})
sb.toString()
} else Unit
}
startsWith(prefix) quoteReply { startsWith(prefix) quoteReply {
val game = games[group.id] val game = games[group.id]
if (game != null) { if (game != null) {
@ -49,7 +85,38 @@ object PluginMain : KotlinPlugin(
val newGame = Point24() val newGame = Point24()
games[group.id] = newGame games[group.id] = newGame
val duration = Duration.between(game.time, LocalDateTime.now()) val duration = Duration.between(game.time, LocalDateTime.now())
"答对了! ${duration.toMinutes()}:${duration.toSecondsPart()}\n下一题:$newGame"
// 群
var g = PluginData.stats[group.id]
if (g == null) {
g = mutableMapOf()
PluginData.stats[group.id] = g
}
// 玩家
var stat = g[sender.id]
if (stat == null) {
stat = PlayerStat()
g[sender.id] = stat
}
// 答题数增加
stat.totalCount += 1
// 用时
val t = duration.seconds + duration.nano / 1000000000.0
if (stat.minTime > t) {
stat.minTime = t
}
// 仅统计百秒内的平均值
if (t < 100) {
// 计数增加
stat.count += 1
// 更新均值
stat.avgTime += (t - stat.avgTime) / stat.count
"答对了!用时:${df.format(t)}s 平均:${df.format(stat.avgTime)}s 最快:${df.format(stat.minTime)}s\n" +
"下一题:$newGame"
} else {
"答对了!下一题:$newGame"
}
} else { } else {
"答错了,计算结果为 $result" "答错了,计算结果为 $result"
} }