Преглед изворни кода

rename MultiBotHandler to BotLuo

00ll00 пре 5 година
родитељ
комит
ba2547aeae

+ 1 - 1
build.gradle.kts

@@ -3,7 +3,7 @@ version = "1.4.0"
 
 dependencies {
     implementation(kotlin("stdlib"))
-    api("net.mamoe:mirai-core:2.7.0")
+    api("net.mamoe:mirai-core:2.7.1-dev-1")
     implementation("com.alibaba:fastjson:1.2.73")
     implementation("org.reflections:reflections:0.9.12")
     implementation ("org.apache.logging.log4j:log4j-api:2.14.0")

+ 1 - 2
src/main/kotlin/bot_luo_core/bot/BotContact.kt

@@ -2,7 +2,6 @@ package bot_luo_core.bot
 
 import net.mamoe.mirai.Bot
 import net.mamoe.mirai.contact.Contact
-import net.mamoe.mirai.event.events.EventCancelledException
 import net.mamoe.mirai.message.MessageReceipt
 import net.mamoe.mirai.message.data.Message
 
@@ -10,7 +9,7 @@ interface BotContact {
     val id: Long
     var bot: Bot?
     val contactType: BotContactType
-    val contact: Contact? get() = MultiBotHandler.getMiraiContact(this)
+    val contact: Contact? get() = BotLuo.getMiraiContact(this)
 
     suspend fun sendMessage(msg: Message): MessageReceipt<Contact>? = contact?.sendMessage(msg)
     suspend fun sendMessage(str: String): MessageReceipt<Contact>? = contact?.sendMessage(str)

+ 2 - 2
src/main/kotlin/bot_luo_core/bot/MultiBotHandler.kt → src/main/kotlin/bot_luo_core/bot/BotLuo.kt

@@ -17,9 +17,9 @@ import net.mamoe.mirai.utils.BotConfiguration
 import org.apache.logging.log4j.Level
 
 /**
- * # 多机器人管理类
+ * # 罗伯特
  */
-object MultiBotHandler {
+object BotLuo {
     private const val FILE_PATH = "data/bots.json"
 
     /**

+ 9 - 2
src/main/kotlin/bot_luo_core/cli/Checker.kt

@@ -22,8 +22,15 @@ interface Checker {
 
     companion object {
 
-        //排序与最终抛出的可能性有关
-        val CHECKERS = arrayListOf<KClass<out Checker>>(
+        /**
+         * ### 默认启用的[Checker]
+         *
+         * 默认情况下每个[命令方法][CmdExecutable]都会启用包含的Checker,可以在
+         * [bot_luo_core.cli.annotation.Method]注解中设置ignoreCheckers忽略不需要的Checker
+         *
+         * 也可以在[bot_luo_core.cli.annotation.Method]注解中设置addonCheckers附加其他Checker
+         */
+        val CHECKERS = arrayListOf(
             BotRunningChecker::class,
             GroupCmdWorkingChecker::class,
             UserCmdWorkingChecker::class,

+ 4 - 5
src/main/kotlin/bot_luo_core/cli/CmdContext.kt

@@ -1,7 +1,7 @@
 package bot_luo_core.cli
 
 import bot_luo_core.bot.BotContact
-import bot_luo_core.bot.MultiBotHandler
+import bot_luo_core.bot.BotLuo
 import bot_luo_core.data.Config.REPL_NO
 import bot_luo_core.data.Config.REPL_YES
 import bot_luo_core.data.Group
@@ -12,7 +12,6 @@ import bot_luo_core.util.Text.toLowercase
 import bot_luo_core.util.Time
 import kotlinx.coroutines.TimeoutCancellationException
 import net.mamoe.mirai.contact.Contact
-import net.mamoe.mirai.contact.Contact.Companion.uploadImage
 import net.mamoe.mirai.contact.FileSupported
 import net.mamoe.mirai.contact.MemberPermission
 import net.mamoe.mirai.event.events.EventCancelledException
@@ -145,11 +144,11 @@ class CmdContext(
     }
 
     @Throws(TimeoutCancellationException::class)
-    suspend inline fun nextMessage(timeoutMillis: Long = -1L): MessageChain = MultiBotHandler.catchNextMessage(user.id, group.id, timeoutMillis)
+    suspend inline fun nextMessage(timeoutMillis: Long = -1L): MessageChain = BotLuo.catchNextMessage(user.id, group.id, timeoutMillis)
 
     suspend inline fun nextMessage(timeoutMillis: Long = -1L, timeoutAction: () -> Unit): MessageChain {
         try {
-            return MultiBotHandler.catchNextMessage(user.id, group.id, timeoutMillis)
+            return BotLuo.catchNextMessage(user.id, group.id, timeoutMillis)
         } catch (e: TimeoutCancellationException) {
             timeoutAction()
         }
@@ -157,7 +156,7 @@ class CmdContext(
     }
     suspend inline fun nextYorN(timeoutMillis: Long, noinline timeoutAction: suspend () -> Boolean): Boolean {
         return try {
-            MultiBotHandler.catchNextMessage(user.id, group.id, timeoutMillis) {
+            BotLuo.catchNextMessage(user.id, group.id, timeoutMillis) {
                 it.content.trim().toLowercase() in REPL_YES + REPL_NO
             }.content.trim().toLowercase() in REPL_YES
         } catch (e: TimeoutCancellationException) {

+ 4 - 1
src/main/kotlin/bot_luo_core/cli/CmdExecutable.kt

@@ -51,7 +51,10 @@ class CmdExecutable(private val cmd: KClass<out Cmd>, private val meth: KFunctio
         else -> "${CMD_PREFIX[0]}$id(${methAnn.alias.joinToString(",")})"
     }
 
-    val checkers = CHECKERS.filter { it !in methAnn.ignoreCheckers }
+    val checkers = LinkedHashSet<KClass<out Checker>>().apply{
+        addAll(CHECKERS.filter { c -> c !in methAnn.ignoreCheckers })
+        addAll(methAnn.addonCheckers)
+    }
 
     val alias = cmdAnn.alias
     val subAlias = methAnn.alias

+ 9 - 0
src/main/kotlin/bot_luo_core/cli/annotation/Method.kt

@@ -21,9 +21,18 @@ annotation class Method(
 
     /**
      * 忽略的检查器
+     *
+     * @see[Checker.CHECKERS]
      */
     val ignoreCheckers: Array<KClass<out Checker>> = [],
 
+    /**
+     * 追加的检测器
+     *
+     * @see[Checker.CHECKERS]
+     */
+    val addonCheckers: Array<KClass<out Checker>> = [],
+
     /**
      * 默认的权限配置,用于生成默认权限组文件
      */

+ 1 - 1
src/main/kotlin/bot_luo_core/cli/commands/AnnounceCmd.kt

@@ -24,7 +24,7 @@ import java.lang.IllegalStateException
 import java.net.HttpURLConnection
 import java.net.URL
 import kotlin.reflect.KType
-//TODO 需要验证
+
 @Command(
     name = "announce",
     display = "公告",

+ 3 - 3
src/main/kotlin/bot_luo_core/cli/commands/ListCmd.kt

@@ -25,7 +25,7 @@ class ListCmd(context: CmdContext) : Cmd(context) {
         table.th("命令列表 —— 群组 ${group.name}(${group.id})").br()
 
         val map = HashMap<String, Pair<Boolean, CmdExecutable>>()
-        for (cmd in CmdCatalog.COMMANDS.sortedBy { it.id }) {
+        for (cmd in CmdCatalog.COMMANDS.distinctBy { it.id }.sortedBy { it.id }) {
             if (map[cmd.cmdName]?.first == true) continue
             try {
                 justCheck.forEach { it.createInstance().check(cmd, context) }
@@ -46,7 +46,7 @@ class ListCmd(context: CmdContext) : Cmd(context) {
         val table = TableBuilder(4)
         table.th("命令列表 —— 群组 ${group.name}(${group.id})").br()
 
-        for (cex in CmdCatalog.COMMANDS.sortedBy { it.id }) {
+        for (cex in CmdCatalog.COMMANDS.distinctBy { it.id }.sortedBy { it.id }) {
             try {
                 justCheck.forEach { it.createInstance().check(cex, context) }
                 table.tr(if (group.readCmdData(cex).working) "[√]" else "[×]").tb(cex.idFixed).tb(cex.subTitle)
@@ -63,7 +63,7 @@ class ListCmd(context: CmdContext) : Cmd(context) {
         val table = TableBuilder(4)
         table.th("命令列表 —— 群组 ${group.name}(${group.id})").br()
 
-        for (cex in CmdCatalog.COMMANDS.sortedBy { it.id }) {
+        for (cex in CmdCatalog.COMMANDS.distinctBy { it.id }.sortedBy { it.id }) {
             table.tr(if (group.readCmdData(cex).working) "[√]" else "[×]").tb(cex.idFixed).tb(cex.subTitle)
         }
 

+ 3 - 3
src/main/kotlin/bot_luo_core/cli/commands/SayCmd.kt

@@ -1,6 +1,6 @@
 package bot_luo_core.cli.commands
 
-import bot_luo_core.bot.MultiBotHandler
+import bot_luo_core.bot.BotLuo
 import bot_luo_core.bot.VirtualMessageEvent
 import bot_luo_core.cli.*
 import bot_luo_core.cli.annotation.Argument
@@ -30,8 +30,8 @@ class SayCmd(context: CmdContext) : Cmd(context) {
     ): CmdReceipt { with(context) {
 
         if (!group.virtual) {
-            group.bot = if (user.virtual) MultiBotHandler.getContactableBots(group).randomOrNull()
-            else MultiBotHandler.getBotOrNull(user.id)
+            group.bot = if (user.virtual) BotLuo.getContactableBots(group).randomOrNull()
+            else BotLuo.getBotOrNull(user.id)
             group.sendMessage(msg)
         }
 

+ 16 - 1
src/main/kotlin/bot_luo_core/data/Config.kt

@@ -1,8 +1,23 @@
 package bot_luo_core.data
 
 object Config {
+    /**
+     * 命令前缀
+     */
     val CMD_PREFIX = arrayOf('.','。','/')
+
+    /**
+     * 回复-确认
+     */
     val REPL_YES = arrayOf("y","ok","yes","好","是","好的","是的")
+
+    /**
+     * 回复-否认
+     */
     val REPL_NO = arrayOf("n","no","nop","不","否","不是","不要")
-    const val MAX_OUTPUT_LEN = 720
+
+    /**
+     * 输出消息最大长度
+     */
+    const val MAX_OUTPUT_LEN = 1000
 }

+ 2 - 3
src/main/kotlin/bot_luo_core/data/Group.kt

@@ -2,11 +2,10 @@ package bot_luo_core.data
 
 import bot_luo_core.bot.BotContact
 import bot_luo_core.bot.BotContactType
-import bot_luo_core.bot.MultiBotHandler
+import bot_luo_core.bot.BotLuo
 import net.mamoe.mirai.Bot
 import net.mamoe.mirai.contact.Group
 import net.mamoe.mirai.contact.MemberPermission
-import net.mamoe.mirai.message.data.Message
 
 /**
  * # 群组类
@@ -36,7 +35,7 @@ class Group internal constructor(
 
     inline fun withServeBot(pms: MemberPermission = MemberPermission.MEMBER, action: (contact: Group)->Unit): Boolean {
         if (virtual) return false
-        val contact = if (bot == null) MultiBotHandler.getContactableBots(this).map { it.getGroup(id) }.filter { it != null && it.botPermission >= pms }.randomOrNull()
+        val contact = if (bot == null) BotLuo.getContactableBots(this).map { it.getGroup(id) }.filter { it != null && it.botPermission >= pms }.randomOrNull()
         else bot?.getGroup(id)
         return if (contact == null) false
         else {

+ 2 - 11
src/main/kotlin/bot_luo_core/data/User.kt

@@ -2,21 +2,12 @@ package bot_luo_core.data
 
 import bot_luo_core.bot.BotContact
 import bot_luo_core.bot.BotContactType
-import bot_luo_core.bot.MultiBotHandler
-import bot_luo_core.cli.CmdExecutable
+import bot_luo_core.bot.BotLuo
 import bot_luo_core.cli.CmdReceipt
-import com.alibaba.fastjson.annotation.JSONField
-import kotlinx.coroutines.CoroutineDispatcher
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.runBlocking
-import kotlinx.coroutines.withContext
 import net.mamoe.mirai.Bot
 import net.mamoe.mirai.contact.*
-import net.mamoe.mirai.contact.Group
 import net.mamoe.mirai.contact.User
 import net.mamoe.mirai.message.data.At
-import net.mamoe.mirai.message.data.Message
-import kotlin.coroutines.CoroutineContext
 
 /**
  * # 用户类
@@ -55,7 +46,7 @@ class User internal constructor (
 
     inline fun withServeBot(action: (contact: User)->Unit): Boolean {
         if (virtual) return false
-        val contact = if (bot == null) MultiBotHandler.getContactableBots(this).map { it.getFriend(id)?:it.getStranger(id) }.randomOrNull()
+        val contact = if (bot == null) BotLuo.getContactableBots(this).map { it.getFriend(id)?:it.getStranger(id) }.randomOrNull()
         else bot?.getFriend(id)?:bot?.getStranger(id)
         return if (contact == null) false
         else {

+ 3 - 6
src/main/kotlin/bot_luo_core/util/ResourceManager.kt

@@ -7,6 +7,7 @@ import net.mamoe.mirai.contact.Contact
 import net.mamoe.mirai.message.data.*
 import net.mamoe.mirai.message.data.Image.Key.queryUrl
 import net.mamoe.mirai.utils.ExternalResource.Companion.toExternalResource
+import net.mamoe.mirai.utils.ExternalResource.Companion.uploadAsImage
 import java.io.*
 import java.net.HttpURLConnection
 import java.net.URL
@@ -67,9 +68,7 @@ object ResourceManager {
                     is Image -> {
                         val file = File(imageDir+it.imageId)
                         if (file.exists()) {
-                            file.inputStream().use { input ->
-                                mcb.add(contact.uploadImage(input.toExternalResource()))
-                            }
+                            file.toExternalResource().use { resource -> mcb.add(contact.uploadImage(resource)) }
                         } else {
                             mcb.add("[图片失效]")
                         }
@@ -78,9 +77,7 @@ object ResourceManager {
                         if (contact is AudioSupported) {
                             val file = File(audioDir + it.filename)
                             if (file.exists()) {
-                                file.inputStream().use { input ->
-                                    mcb.add(contact.uploadAudio(input.toExternalResource()))
-                                }
+                                file.toExternalResource().use { resource -> mcb.add(contact.uploadAudio(resource)) }
                             } else {
                                 mcb.add("[音频失效]")
                             }