Update docs about FileCacheStrategy, close #1046

This commit is contained in:
Him188 2021-03-22 12:52:18 +08:00
parent daa7453d73
commit c006a48de5
4 changed files with 57 additions and 9 deletions

View File

@ -3,7 +3,19 @@
**目录**
- [1. 创建和配置 `Bot`](#1-创建和配置-bot)
- [配置 Bot](#配置-bot)
- [常用配置](#常用配置)
- [修改运行目录](#修改运行目录)
- [修改 Bot 缓存目录](#修改-bot-缓存目录)
- [设备信息](#设备信息)
- [切换登录协议](#切换登录协议)
- [重定向日志](#重定向日志)
- [覆盖登录解决器](#覆盖登录解决器)
- [启用列表缓存](#启用列表缓存)
- [获取当前所有 `Bot` 实例](#获取当前所有-bot-实例)
- [2. 登录](#2-登录)
- [处理滑动验证码](#处理滑动验证码)
- [常见登录失败原因](#常见登录失败原因)
## 1. 创建和配置 `Bot`
@ -68,7 +80,7 @@ workingDir = File("C:/mirai")
setWorkingDir(File("C:/mirai"))
```
#### 修改缓存目录
#### 修改 Bot 缓存目录
缓存目录会相对于 `workingDir` 解析。如 `File("cache")` 将会解析为 `workingDir` 内的 `cache` 目录。而 `File("C:/cache")` 将会解析为绝对的 `C:/cache` 目录。
@ -87,6 +99,10 @@ setCacheDir(File("C:/cache")) // 最终为 C:/cache
目前缓存目录会存储列表缓存、登录服务器、资源会话秘钥等。这些数据的存储方式有可能变化,请不要修改缓存目录中的文件。
[FileCacheStrategy]: ../mirai-core-api/src/commonMain/kotlin/utils/FileCacheStrategy.kt#L55
注意,`cacheDir` 仅存储与 Bot 相关的上述信息。其他的如 `InputStream` 的缓存由 [FileCacheStrategy] 管理,默认使用系统临时文件。
#### 设备信息
Bot 默认使用全随机的设备信息。**在更换账号地点时候使用随机设备信息可能会导致无法登录**,当然,**成功登录时使用的设备信息也可以保存后在新的设备使用**。

View File

@ -54,6 +54,8 @@ public interface IMirai : LowLevelApiAccessor {
* Mirai 全局使用的 [FileCacheStrategy].
*
* 覆盖后将会立即应用到全局.
*
* 要覆盖 [FileCacheStrategy],
*/
public var FileCacheStrategy: FileCacheStrategy

View File

@ -22,6 +22,7 @@ import net.mamoe.mirai.Bot
import net.mamoe.mirai.BotFactory
import net.mamoe.mirai.event.events.BotOfflineEvent
import java.io.File
import java.io.InputStream
import kotlin.coroutines.CoroutineContext
import kotlin.coroutines.EmptyCoroutineContext
import kotlin.coroutines.coroutineContext
@ -386,7 +387,18 @@ public open class BotConfiguration { // open for Java
//////////////////////////////////////////////////////////////////////////
/**
* 缓存数据目录, 相对于 [workingDir]
* 缓存数据目录, 相对于 [workingDir].
*
* 缓存目录保存的内容均属于不稳定的 Mirai 内部数据, 请不要手动修改它们. 清空缓存不会影响功能. 只会导致一些操作如读取全部群列表要重新进行.
* 默认启用的缓存可以加快登录过程.
*
* 注意: 这个目录只存储能在 [BotConfiguration] 配置的内容, 即包含:
* - 联系人列表
* - 登录服务器列表
* - 资源服务秘钥
*
* 其他内容如通过 [InputStream] 发送图片时的缓存使用 [FileCacheStrategy], 默认使用系统临时文件且会在关闭时删除文件.
*
* @since 2.4
*/
public var cacheDir: File = File("cache")

View File

@ -12,10 +12,13 @@
package net.mamoe.mirai.utils
import kotlinx.coroutines.Dispatchers
import net.mamoe.mirai.Bot
import net.mamoe.mirai.IMirai
import net.mamoe.mirai.utils.ExternalResource.Companion.sendAsImageTo
import net.mamoe.mirai.utils.ExternalResource.Companion.toExternalResource
import net.mamoe.mirai.utils.ExternalResource.Companion.uploadAsImage
import net.mamoe.mirai.utils.FileCacheStrategy.MemoryCache
import net.mamoe.mirai.utils.FileCacheStrategy.TempCache
import java.io.File
import java.io.IOException
import java.io.InputStream
@ -25,12 +28,27 @@ import java.io.InputStream
*
* 由于上传资源时服务器要求提前给出 MD5 和文件大小等数据, 一些资源如 [InputStream] 需要首先缓存才能使用.
*
* Mirai 全局都使用 [IMirai.FileCacheStrategy]. 可以覆盖.
* 资源的缓存都是将 [InputStream] 缓存未 [ExternalResource]. 根据 [FileCacheStrategy] 实现不同, 可以以临时文件存储, 也可以在数据库或是内存按需存储.
* Mirai 内置的实现有 [内存存储][MemoryCache] [临时文件存储][TempCache].
* 操作 [ExternalResource.toExternalResource] 时将会使用 [IMirai.FileCacheStrategy]. 可以覆盖, 示例:
* ```
* // Kotlin
* Mirai.FileCacheStrategy = FileCacheStrategy.TempCache() // 使用系统默认缓存路径, 也是默认的行为
* Mirai.FileCacheStrategy = FileCacheStrategy.TempCache(File("C:/cache")) // 使用自定义缓存路径
*
* // Java
* Mirai.getInstance().setFileCacheStrategy(new FileCacheStrategy.TempCache()); // 使用系统默认缓存路径, 也是默认的行为
* Mirai.getInstance().setFileCacheStrategy(new FileCacheStrategy.TempCache(new File("C:/cache"))); // 使用自定义的缓存路径
* ```
*
* 此接口的实现和使用都是稳定的. 自行实现的 [FileCacheStrategy] 也可以被 Mirai 使用.
*
* 注意, 此接口目前仅缓存 [InputStream] 等一次性数据. 好友列表等数据由每个 [Bot] [BotConfiguration.cacheDir] 缓存.
*
* ### 使用 [FileCacheStrategy] 的操作
* [ExternalResource.toExternalResource],
* [ExternalResource.uploadAsImage],
* [ExternalResource.sendAsImageTo]
* - [ExternalResource.toExternalResource]
* - [ExternalResource.uploadAsImage]
* - [ExternalResource.sendAsImageTo]
*
* @see ExternalResource
*/
@ -58,7 +76,7 @@ public interface FileCacheStrategy {
public fun newCache(input: InputStream): ExternalResource = newCache(input, null)
/**
* 使用内存直接存储所有图片文件.
* 使用内存直接存储所有图片文件. JVM 执行 GC.
*/
public object MemoryCache : FileCacheStrategy {
@Throws(IOException::class)
@ -68,9 +86,9 @@ public interface FileCacheStrategy {
}
/**
* 使用系统临时文件夹缓存图片文件. 在图片使用完毕后删除临时文件.
* 使用系统临时文件夹缓存图片文件. 在图片使用完毕后JVM 正常结束时删除临时文件.
*/
public class TempCache @JvmOverloads constructor(
public class TempCache @JvmOverloads public constructor(
/**
* 缓存图片存放位置. `null` 时使用主机系统的临时文件夹: `File.createTempFile("tmp", null, directory)`
*/