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,43 +24,108 @@ 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 {
var game = games[group.id] "24点" reply {
if (game == null || game.time.plusMinutes(1) < LocalDateTime.now()) { var game = games[group.id]
game = Point24() if (game == null || game.time.plusMinutes(1) < LocalDateTime.now()) {
games[group.id] = game game = Point24()
"请用 $game 组成结果为24的算式以'$prefix'开头验证" games[group.id] = game
} else Unit "请用 $game 组成结果为24的算式以'$prefix'开头验证"
} } else Unit
}
startsWith(prefix) quoteReply { "24点榜" reply {
val game = games[group.id] val g = PluginData.stats[group.id]
if (game != null) { // 一小时内仅可查询一次
try { if (g != null && rankTimes[group.id]?.plusHours(1)?.isBefore(LocalDateTime.now()) != false) {
val result = game.evaluate(message.contentToString().removePrefix(prefix).trim()) // 记录查询时间
if (result == 24.0) { rankTimes[group.id] = LocalDateTime.now()
val newGame = Point24() // 拼接排行榜
games[group.id] = newGame val sb = StringBuilder()
val duration = Duration.between(game.time, LocalDateTime.now()) sb.appendLine("[均时榜]")
"答对了! ${duration.toMinutes()}:${duration.toSecondsPart()}\n下一题:$newGame" sb.append(g.entries.sortedBy { it.value.avgTime }.take(3).joinToString("\n") {
} else { "${df.format(it.value.avgTime)}s | ${group[it.key]?.nameCardOrNick ?: "侠名"}"
"答错了,计算结果为 $result" }).appendLine().appendLine()
} sb.appendLine("[速度榜]")
} catch (e: Throwable) { 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 {
val game = games[group.id]
if (game != null) {
try {
val result = game.evaluate(message.contentToString().removePrefix(prefix).trim())
if (result == 24.0) {
val newGame = Point24()
games[group.id] = newGame
val duration = Duration.between(game.time, LocalDateTime.now())
// 群
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 {
"答错了,计算结果为 $result"
}
} catch (e: Throwable) {
// logger.error(e) // logger.error(e)
"错误:${e.message}" "错误:${e.message}"
} }
} else Unit } else Unit
}
} }
}
} }
} }