AbstractExternalResource

abstract class AbstractExternalResource constructor(displayName: String? = null, cleanup: AbstractExternalResource.ResourceCleanCallback? = null) : ExternalResource

一个实现了基本方法的外部资源

实现

AbstractExternalResource 实现了大部分必要的方法, 只有 ExternalResource.inputStream, ExternalResource.size 还未实现

其中 ExternalResource.inputStream 要求每次读取的内容都是一致的

Example:

class MyCustomExternalResource: AbstractExternalResource() {
override fun inputStream0(): InputStream = FileInputStream("/test.txt")
override val size: Long get() = File("/test.txt").length()
}

资源释放

如同 mirai 内置的 ExternalResource 实现一样, AbstractExternalResource 也会被注册进入资源泄露监视器 (即意味着 AbstractExternalResource 也要求手动关闭)

为了确保逻辑正确性, AbstractExternalResource 不允许覆盖其 close 方法, 必须在构造 AbstractExternalResource 的时候给定一个 ResourceCleanCallback 以进行资源释放

对于 ResourceCleanCallback, 有以下要求

Example:

class MyRes(
cleanup: ResourceCleanCallback,
val delegate: Closable,
): AbstractExternalResource(cleanup) {
}

// 错误, 该写法会导致 Resource 永远也不会被自动释放
lateinit var myRes: MyRes
val cleanup = ResourceCleanCallback {
myRes.delegate.close()
}
myRes = MyRes(cleanup, fetchDelegate())

// 正确
val delegate: Closable
val cleanup = ResourceCleanCallback {
delegate.close()
}
val myRes = MyRes(cleanup, delegate)

Since

2.9

See also

Constructors

Link copied to clipboard
constructor(displayName: String? = null, cleanup: AbstractExternalResource.ResourceCleanCallback? = null)

Types

Link copied to clipboard
fun interface ResourceCleanCallback

Functions

Link copied to clipboard
Link copied to clipboard
fun close()
Link copied to clipboard
open override fun input(): Input

打开 Input. 在返回的 Input关闭 前无法再次打开流. 注意: 此 API 不稳定, 请使用 inputStream 代替.

Link copied to clipboard
override fun inputStream(): <Error class: unknown class>

打开 InputStream. 在返回的 InputStream 被 InputStream.close 前无法再次打开流.

Link copied to clipboard

上传文件并发送件消息. 如果要上传的文件格式是图片或者语音, 也会将它们作为文件上传而不会调整消息类型.

Link copied to clipboard
@JvmName(name = "sendAsImage")
expect suspend fun <C : Contact> ExternalResource.sendAsImageTo(contact: C): MessageReceipt<C>

将图片作为单独的消息发送给指定联系人.

actual suspend fun <C : Contact> ExternalResource.sendAsImageTo(contact: C): MessageReceipt<C>

将图片作为单独的消息发送给指定联系人.

Link copied to clipboard

创建一个在 使用一次 后就会自动 close 的 ExternalResource.

Link copied to clipboard
expect suspend fun ExternalResource.uploadAsImage(contact: Contact): Image

上传图片并构造 Image. 这个函数可能需消耗一段时间.

actual suspend fun ExternalResource.uploadAsImage(contact: Contact): Image

上传图片并构造 Image. 这个函数可能需消耗一段时间.

Properties

Link copied to clipboard
override val closed: Deferred<Unit>

close 时会 CompletableDeferred.completeDeferred.

Link copied to clipboard
open override val formatName: String

文件格式,如 "png", "amr". 当无法自动识别格式时为 DEFAULT_FORMAT_NAME.

Link copied to clipboard
actual open val isAutoClose: Boolean

是否在 使用一次 后自动 close.

Link copied to clipboard
open override val md5: ByteArray

文件内容 MD5. 16 bytes

Link copied to clipboard
actual open val origin: Any?

ExternalResource 的数据来源, 可能有以下的返回

Link copied to clipboard
open override val sha1: ByteArray

文件内容 SHA1. 16 bytes

Link copied to clipboard
actual abstract val size: Long

文件大小 bytes