起因

这就不得不提一款二字游戏 “鸣潮” 是的。

本项目也是为了开发一个 鸣潮的Bot OneBotv11协议的机器人

项目

https://github.com/FxRayHughes/chaobot

这个项目并未使用任何 QQ 微信相关的实现代码

未对任何软件进行逆向!

历程

首先肯定是得要有一个Kotlin项目了 😅

然后引入 TabooLib的 插件和依赖 设置 kts 简单放一个我写的

创建项目

import io.izzel.taboolib.gradle.*

plugins {
    id("io.izzel.taboolib") version "2.0.12"
    kotlin("jvm") version "1.9.24"
    application
}

taboolib {
    env {
        install(APPLICATION)
        install(CONFIGURATION)
        install(EXPANSION_COMMAND_HELPER)
        // 依赖下载目录
        fileLibs = "libraries"
        // 资源下载目录
        fileAssets = "assets"
    }
    version {
        taboolib = "6.1.1"
        coroutines = "1.7.3"
        skipKotlinRelocate = true
        skipTabooLibRelocate = true
    }
}

repositories {
    mavenCentral()
}

dependencies {
    taboo("io.javalin:javalin:6.1.3")
    taboo("org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.24")
    taboo("org.slf4j:slf4j-simple:2.0.10")
    taboo("com.alibaba.fastjson2:fastjson2-kotlin:2.0.50")
    taboo("com.squareup.okhttp3:okhttp:4.12.0")
    testImplementation(kotlin("test"))
    testImplementation("com.alibaba.fastjson2:fastjson2-kotlin:2.0.50")
    taboo(kotlin("reflect"))
}

tasks.test {
    useJUnitPlatform()
}

kotlin {
    jvmToolchain(8)
}

tasks.jar {
    manifest {
        attributes("Main-Class" to "top.maplex.chaobot.Main")
    }
}

application {
    mainClass.set("top.maplex.chaobot.Main")
}

设置启动与关闭

我是这样设计的

先注册关闭逻辑 然后 进行启动逻辑

    fun main(args: Array<String>) {
        Runtime.getRuntime().addShutdownHook(Thread {
            tPrintln("&c服务器即将关闭")
            App.shutdown()
        })

        App.init()
        LogManager.start()
        StartHook.eval()
        tPrintln("&3鸣潮Bot · 枫溪 &7- &8Chaobot - &f1.0.0")

    }

具体行为看GitHub仓库 这里就简单说一下

颜色部分抄的大阔的项目 嘻嘻

  1. 先设置一下关闭App时候的回调 让Taboolib执行关闭回调

  2. 启动TabooLib的初始化方法 App.init()

  3. 加载Log管理器

  4. 启动自己实现的Hook

实现一些Hook

其实这才是这篇文章的重点

具体实现方式看我的仓库吧 StartHook 部分

根据不同的优先级 对类进行扫描

    fun eval() {
        evalConfig()
        evalAwake()
        evalEvent()
        evalCommand()
    }

依次实现了

  1. Config 文件的自动注入与释放

  2. Awake 自唤醒运行方法

  3. EventBus 的启动与初始化 对声明的Listener进行注册

  4. Command 注册机器人的命令模块

实现EventBus

是的 event 是各个平台实现的 由于taboolibapp自己不带eventbus 所以我就自己实现了一下

但是写起来也不难这种东西

根据这个图片的设计思路就可以快速的制作了!

由于我用的是Kotlin语言 所以我把这个 HanderList 外置了 存进了一个Map里

并没有使用伴生类进行使用 这会导致更加繁琐

解决了这个问题之后 其他的问题就都好解决了!

感悟

手拿把掐!

完全不难~