mirror of
https://github.com/jie65535/mirai-console-j24-plugin.git
synced 2025-06-01 17:29:15 +08:00
Update version to v0.1.3
增加答题统计 增加排行榜
This commit is contained in:
parent
cf51506432
commit
b4dd18cc19
@ -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") // 阿里云国内代理仓库
|
||||||
|
38
src/main/kotlin/PluginData.kt
Normal file
38
src/main/kotlin/PluginData.kt
Normal 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,
|
||||||
|
)
|
@ -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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user