我们假设它有一个字符串格式的唯一标识 id ,并且需要再通过一个字符串格式的密码 password 进行登录。
定义 FooBot 接口
首先,定义接口 FooBot 并实现 Bot:
interface FooBot : Bot {
// 1️⃣
override val coroutineContext: CoroutineContext
override val isActive: Boolean
override val isCompleted: Boolean
override val isStarted: Boolean
override fun onCompletion(handle: OnCompletion)
@JvmSynthetic
override suspend fun join()
override fun cancel(reason: Throwable?)
// 2️⃣
@JvmSynthetic
override suspend fun start()
override val component: Component
override val id: ID
override val name: String
override fun isMe(id: ID): Boolean
override val contactRelation: ContactRelation?
override val groupRelation: GroupRelation?
override val guildRelation: GuildRelation?
}
interface FooChannel : ChatChannel {
override val id: ID
/**
* `FooChannel` 没有分类。
*/
override val category: Category?
get() = null
override val name: String
@ST
override suspend fun send(text: String): FooMessageReceipt
@ST
override suspend fun send(message: Message): FooMessageReceipt
@ST
override suspend fun send(messageContent: MessageContent): FooMessageReceipt
}
并做如下假设:
FooChannel 没有分类(Category)。
FooChannel 发送消息的返回值使用 FooMessageReceipt 类型。
FooMessageReceipt
定义一个 FooMessageReceipt ,用来代表在 FooXxx 中发送消息的回执。
我们假设:回执中可以获取到消息发送后的 id, 以及可以根据ID删除它。
class FooMessageReceipt(public val id: String) : MessageReceipt {
@JvmSynthetic // 因为 delete 没有返回值,因此不需要使用 @ST 等编译器插件注解来覆盖实现
override suspend fun delete(vararg options: DeleteOption) {
val deleted = doDelete()
// 如果成功,直接结束
if (deleted) return
// 没有成功,根据 options 来判断
// 如果 options 要求忽略失败/错误的情况,则结束,否则抛出异常
// 这里借助 standardAnalysis 来快捷的进行标准的判断
val stdOpts = options.standardAnalysis()
if (stdOpts.isIgnoreOnFailure) return
// 没有要求忽略失败情况,则抛出异常
throw DeleteFailureException("删除失败")
}
/**
* 假设这里是用 id 删除消息的具体逻辑。
* 比如通过 id 请求了一个 API。
*/
private suspend fun doDelete(): Boolean {
// TODO 实现根据ID删除消息的功能
// 这里作为示例,直接返回 true
return true
}
}
FooMember
定义一个 FooMember, 并实现 Member。
interface FooMember : Member {
override val id: ID
override val name: String
override val nick: String?
override val avatar: String?
@ST
override suspend fun send(text: String): FooMessageReceipt
@ST
override suspend fun send(message: Message): FooMessageReceipt
@ST
override suspend fun send(messageContent: MessageContent): FooMessageReceipt
}