From 560ac53009b898f65963f008d1eb4f2f711e831d Mon Sep 17 00:00:00 2001 From: RTAkland Date: Sun, 8 Sep 2024 15:07:43 +0800 Subject: [PATCH] feat: add niuzi command --- src/main/kotlin/cn/rtast/fancybot/FancyBot.kt | 25 +--- .../rtast/fancybot/commands/NiuziCommand.kt | 125 ++++++++++++++++++ .../cn/rtast/fancybot/entity/db/NiuziTable.kt | 24 ++++ .../kotlin/cn/rtast/fancybot/util/Database.kt | 2 + .../rtast/fancybot/util/file/NiuziManager.kt | 89 +++++++++++++ .../rtast/fancybot/util/file/SignManager.kt | 6 +- 6 files changed, 247 insertions(+), 24 deletions(-) create mode 100644 src/main/kotlin/cn/rtast/fancybot/commands/NiuziCommand.kt create mode 100644 src/main/kotlin/cn/rtast/fancybot/entity/db/NiuziTable.kt create mode 100644 src/main/kotlin/cn/rtast/fancybot/util/file/NiuziManager.kt diff --git a/src/main/kotlin/cn/rtast/fancybot/FancyBot.kt b/src/main/kotlin/cn/rtast/fancybot/FancyBot.kt index 5a32a86..2790b77 100644 --- a/src/main/kotlin/cn/rtast/fancybot/FancyBot.kt +++ b/src/main/kotlin/cn/rtast/fancybot/FancyBot.kt @@ -7,24 +7,7 @@ package cn.rtast.fancybot -import cn.rtast.fancybot.commands.AntiRevokeCommand -import cn.rtast.fancybot.commands.CigaretteCommand -import cn.rtast.fancybot.commands.EchoCommand -import cn.rtast.fancybot.commands.FKXQSCommand -import cn.rtast.fancybot.commands.HelpCommand -import cn.rtast.fancybot.commands.HitokotoCommand -import cn.rtast.fancybot.commands.JrrpCommand -import cn.rtast.fancybot.commands.MCPingCommand -import cn.rtast.fancybot.commands.MusicCommand -import cn.rtast.fancybot.commands.MyPointCommand -import cn.rtast.fancybot.commands.NslookupCommand -import cn.rtast.fancybot.commands.PixivCommand -import cn.rtast.fancybot.commands.QRCodeCommand -import cn.rtast.fancybot.commands.RUACommand -import cn.rtast.fancybot.commands.RedeemCommand -import cn.rtast.fancybot.commands.RemakeCommand -import cn.rtast.fancybot.commands.SignCommand -import cn.rtast.fancybot.commands.WeatherCommand +import cn.rtast.fancybot.commands.* import cn.rtast.fancybot.commands.misc.BVParseCommand import cn.rtast.fancybot.commands.misc.ImageURLCommand import cn.rtast.fancybot.entity.enums.WSType @@ -32,6 +15,7 @@ import cn.rtast.fancybot.items.BaisiItem import cn.rtast.fancybot.items.HeisiItem import cn.rtast.fancybot.items.SetuItem import cn.rtast.fancybot.util.file.ConfigManager +import cn.rtast.fancybot.util.file.NiuziManager import cn.rtast.fancybot.util.file.SignManager import cn.rtast.fancybot.util.initDatabase import cn.rtast.fancybot.util.item.ItemManager @@ -88,6 +72,7 @@ class FancyBot : OBMessage { val configManager = ConfigManager() val itemManager = ItemManager() val signManager = SignManager() +val niuziManager = NiuziManager() val items = listOf( HeisiItem(), @@ -104,7 +89,9 @@ val commands = listOf( MCPingCommand(), HelpCommand(), WeatherCommand(), CigaretteCommand(), RemakeCommand(), PixivCommand(), - RUACommand(), NslookupCommand() + RUACommand(), NslookupCommand(), + NiuziSignCommand(), MyNiuziSignCommand(), + JiJianCommand() ) suspend fun main() { diff --git a/src/main/kotlin/cn/rtast/fancybot/commands/NiuziCommand.kt b/src/main/kotlin/cn/rtast/fancybot/commands/NiuziCommand.kt new file mode 100644 index 0000000..852b962 --- /dev/null +++ b/src/main/kotlin/cn/rtast/fancybot/commands/NiuziCommand.kt @@ -0,0 +1,125 @@ +/* + * Copyright © 2024 RTAkland + * Author: RTAkland + * Date: 2024/9/8 + */ + + +package cn.rtast.fancybot.commands + +import cn.rtast.fancybot.niuziManager +import cn.rtast.rob.entity.GroupMessage +import cn.rtast.rob.enums.ArrayMessageType +import cn.rtast.rob.util.BaseCommand +import cn.rtast.rob.util.ob.MessageChain +import cn.rtast.rob.util.ob.OBMessage + +class NiuziSignCommand : BaseCommand() { + override val commandNames = listOf("牛子签到") + + override suspend fun executeGroup(listener: OBMessage, message: GroupMessage, args: List) { + if (niuziManager.isSigned(message.sender.userId)) { + val msg = MessageChain.Builder() + .addAt(message.sender.userId) + .addText("你今天已经对你的牛子使用了签到啦,明天再来吧~") + .build() + listener.sendGroupMessage(message.groupId, msg) + return + } + val afterStatus = niuziManager.sign(message.sender.userId) + val msg = MessageChain.Builder() + .addAt(message.sender.userId) + .addText("签到成功~") + .addNewLine() + .addText("你的牛子增加了${afterStatus.first}cm~ 总长度为: ${afterStatus.second?.length}") + .build() + listener.sendGroupMessage(message.groupId, msg) + } +} + +class JiJianCommand : BaseCommand() { + override val commandNames = listOf("击剑", "jj") + + override suspend fun executeGroup(listener: OBMessage, message: GroupMessage, args: List) { + if (args.isEmpty()) { + val msg = MessageChain.Builder() + .addAt(message.sender.userId) + .addText("发送`击剑 @xxx`即可对某人进行击剑") + .build() + listener.sendGroupMessage(message.groupId, msg) + return + } + + val target = message.message.find { it.type == ArrayMessageType.at }!!.data + val targetId = target.qq!!.toLong() + if (!niuziManager.exists(message.sender.userId)) { + val msg = MessageChain.Builder() + .addAt(message.sender.userId) + .addText("你还没有牛子呢, 发送`牛子签到`领取你的牛子吧~") + .build() + listener.sendGroupMessage(message.groupId, msg) + return + } + if (!niuziManager.exists(targetId)) { + val msg = MessageChain.Builder() + .addAt(targetId) + .addText("对方还没有牛子呢, 提醒他领取一根牛子吧~") + .build() + listener.sendGroupMessage(message.groupId, msg) + return + } + if (niuziManager.getUser(targetId)?.length!! < 0.0) { + val msg = MessageChain.Builder() + .addAt(message.sender.userId) + .addText("他已经没有牛子啦!(他的牛子已经凹进去了!!)你不能和他击剑") + .build() + listener.sendGroupMessage(message.groupId, msg) + return + } + val result = niuziManager.jijian(message.sender.userId, targetId) + if (result.first) { + val msg = MessageChain.Builder() + .addAt(message.sender.userId) + .addText("你以已绝对的长度在这场击剑中获胜了~, 你的牛子增加了${result.second}cm") + .build() + listener.sendGroupMessage(message.groupId, msg) + } else { + val msg = MessageChain.Builder() + .addAt(message.sender.userId) + .addText("很不幸你的牛子没能战胜${target.name}, 你的牛子缩短了${result.second}cm") + .addNewLine() + .addText("对方的牛子增加了${result.second}cm~") + .build() + listener.sendGroupMessage(message.groupId, msg) + } + } +} + +class MyNiuziSignCommand : BaseCommand() { + override val commandNames = listOf("我的牛子") + + override suspend fun executeGroup(listener: OBMessage, message: GroupMessage, args: List) { + val niuzi = niuziManager.getUser(message.sender.userId) + if (niuzi == null) { + val msg = MessageChain.Builder() + .addAt(message.sender.userId) + .addText("你还没有牛子呢, 发送`牛子签到`来领取一根专属于你的牛子吧~") + .build() + listener.sendGroupMessage(message.groupId, msg) + return + } + val msg = MessageChain.Builder() + .addAt(message.sender.userId) + .addText("你的牛子长度为: ${niuzi.length}cm") + + val niuziString = when (niuzi.length) { + in -999.0..0.0 -> "你的牛子已经凹进去了!!!!" + in 0.1..6.0 -> "小小的也很可爱呢~" + in 6.1..15.0 -> "好长的牛子!" + in 15.1..30.0 -> "你的牛子已经快突破天际了!!!" + else -> "牛子也太长啦把天捅穿啦!!!!!!" + } + msg.addText(niuziString) + listener.sendGroupMessage(message.groupId, msg.build()) + } +} \ No newline at end of file diff --git a/src/main/kotlin/cn/rtast/fancybot/entity/db/NiuziTable.kt b/src/main/kotlin/cn/rtast/fancybot/entity/db/NiuziTable.kt new file mode 100644 index 0000000..422e793 --- /dev/null +++ b/src/main/kotlin/cn/rtast/fancybot/entity/db/NiuziTable.kt @@ -0,0 +1,24 @@ +/* + * Copyright © 2024 RTAkland + * Author: RTAkland + * Date: 2024/9/8 + */ + + +package cn.rtast.fancybot.entity.db + +import org.jetbrains.exposed.sql.Table + +object NiuziTable : Table("niuzu") { + val length = double("length") + val id = long("id").autoIncrement() + val userId = long("userId").uniqueIndex() + val timestamp = long("timestamp") + override val primaryKey = PrimaryKey(id) +} + +data class Niuzi( + val userId: Long, + val length: Double, + val timestamp: Long +) \ No newline at end of file diff --git a/src/main/kotlin/cn/rtast/fancybot/util/Database.kt b/src/main/kotlin/cn/rtast/fancybot/util/Database.kt index 5f5635f..772ad80 100644 --- a/src/main/kotlin/cn/rtast/fancybot/util/Database.kt +++ b/src/main/kotlin/cn/rtast/fancybot/util/Database.kt @@ -9,6 +9,7 @@ package cn.rtast.fancybot.util import cn.rtast.fancybot.ROOT_PATH import cn.rtast.fancybot.entity.db.JrrpTable +import cn.rtast.fancybot.entity.db.NiuziTable import cn.rtast.fancybot.entity.db.SignTable import kotlinx.coroutines.Dispatchers import org.jetbrains.exposed.sql.Database @@ -20,6 +21,7 @@ suspend fun initDatabase() { suspendedTransaction { SchemaUtils.createMissingTablesAndColumns(JrrpTable) SchemaUtils.createMissingTablesAndColumns(SignTable) + SchemaUtils.createMissingTablesAndColumns(NiuziTable) } } diff --git a/src/main/kotlin/cn/rtast/fancybot/util/file/NiuziManager.kt b/src/main/kotlin/cn/rtast/fancybot/util/file/NiuziManager.kt new file mode 100644 index 0000000..4627897 --- /dev/null +++ b/src/main/kotlin/cn/rtast/fancybot/util/file/NiuziManager.kt @@ -0,0 +1,89 @@ +/* + * Copyright © 2024 RTAkland + * Author: RTAkland + * Date: 2024/9/8 + */ + + +package cn.rtast.fancybot.util.file + +import cn.rtast.fancybot.entity.db.Niuzi +import cn.rtast.fancybot.entity.db.NiuziTable +import cn.rtast.fancybot.entity.db.NiuziTable.length +import cn.rtast.fancybot.entity.db.NiuziTable.timestamp +import cn.rtast.fancybot.entity.db.NiuziTable.userId +import cn.rtast.fancybot.util.isSameDay +import cn.rtast.fancybot.util.suspendedTransaction +import org.jetbrains.exposed.sql.insert +import org.jetbrains.exposed.sql.selectAll +import org.jetbrains.exposed.sql.update +import java.time.Instant +import kotlin.random.Random + +class NiuziManager { + suspend fun getUser(id: Long): Niuzi? { + return suspendedTransaction { + NiuziTable.selectAll().where { userId eq id }.map { + Niuzi( + it[userId], + it[length], + it[timestamp] + ) + }.singleOrNull() + } + } + + suspend fun isSigned(id: Long): Boolean { + val record = getUser(id) + return record?.timestamp?.isSameDay(Instant.now().epochSecond) ?: false + } + + suspend fun sign(id: Long): Pair { + val randomLength = Random.nextDouble(-5.0, 10.0) + if (getUser(id) == null) { + suspendedTransaction { + NiuziTable.insert { + it[userId] = id + it[timestamp] = Instant.now().epochSecond + it[length] = 0.0 + } + } + } + val record = getUser(id) + suspendedTransaction { + NiuziTable.update({ userId eq id }) { + it[length] = record?.length!! + randomLength + it[timestamp] = Instant.now().epochSecond + } + } + return randomLength to this.getUser(id) + } + + suspend fun updateLength(id: Long, newLength: Double) { + val current = getUser(id) + suspendedTransaction { + NiuziTable.update({ userId eq id }) { + it[length] = current?.length!! + newLength + } + } + } + + suspend fun exists(userId: Long): Boolean { + return getUser(userId) != null + } + + suspend fun jijian(fromUser: Long, targetUser: Long): Pair { + val fromUserStatus = getUser(fromUser)!! + val targetUserStatus = getUser(targetUser)!! + val randomLength = Random.nextDouble(1.0, 10.0) + val success = Random.nextBoolean() + if (success) { + this.updateLength(fromUser, randomLength) + this.updateLength(targetUser, -randomLength) + } else { + this.updateLength(fromUser, -randomLength) + this.updateLength(targetUser, randomLength) + } + return success to randomLength + } +} \ No newline at end of file diff --git a/src/main/kotlin/cn/rtast/fancybot/util/file/SignManager.kt b/src/main/kotlin/cn/rtast/fancybot/util/file/SignManager.kt index be589ac..e4d2c31 100644 --- a/src/main/kotlin/cn/rtast/fancybot/util/file/SignManager.kt +++ b/src/main/kotlin/cn/rtast/fancybot/util/file/SignManager.kt @@ -36,11 +36,7 @@ class SignManager { suspend fun isSigned(id: Long): Boolean { val record = getRecord(id) - return if (record != null) { - record.timestamp.isSameDay(Instant.now().epochSecond) - } else { - false - } + return record?.timestamp?.isSameDay(Instant.now().epochSecond) ?: false } suspend fun sign(id: Long): Long {