完整插件示例

这一示例包含消息入口、外部请求、自定义事件和定时更新。

文件组成

plugins/weather/
├── Weather.kt
├── WeatherCommand.kt
├── WeatherService.kt
├── WeatherUpdatedEvent.kt
└── WeatherVo.kt

插件入口

@Plugin(name = "天气", tag = "工具", desc = "查询城市天气")
class Weather {
    private val query = queueMessage(Regex("天气\\s+(.+)")) { (city) ->
        val weather = WeatherService.query(city)
        sendReply(weather.toMessage(), reference = true)
        publishEvent(WeatherUpdatedEvent(city, weather.temperature))
    }

    private val refresh = periodicScheduling(30.minutes, useGreeting = false) {
        WeatherService.refresh()
    }

    init {
        query.register()
        refresh.register()
    }
}

配置

bot:
  plugin:
    weather:
      endpoint: "https://weather.example.com"
      apiKey: "YOUR_API_KEY"
object WeatherService {
    private val endpoint by lazy { pluginConfigProperty("endpoint") }
    private val apiKey by lazy { pluginConfigProperty("apiKey") }

    suspend fun query(city: String): WeatherVo =
        webclient().get("$endpoint/current") {
            parameter("city", city)
            bearerAuth(apiKey)
        }.body()

    suspend fun refresh() { /* 更新缓存 */ }
}

自定义事件

data class WeatherUpdatedEvent(
    val city: String,
    val temperature: Double,
) : Plugin.Listener.Event {
    override val source = ReceiveMessage.Source.system()
    override val actor = ReceiveMessage.User.empty()
}

private val changed = eventListener<WeatherUpdatedEvent> { event ->
    log().info("天气已更新:{} {}", event.city, event.temperature)
}

注册器、队列参数、事件字段和调度参数可分别在对应开发指南中查询。