——————————这是分隔符——————————
第四天开发报告 (摸鱼记录):
年初我就一直期待mirai对群文件的支持,正好我手上就有个业务需要远程传送文件。文件这块内容在官方文档中还未来得及更新,故我仅依靠着对代码中相关注释的理解进行开发,若有纰漏之处望不吝赐教。
准备开始之前,必须打开 RemoteFile.kt 或在IDEA中 搜索 net.mamoe.mirai.utils.RemoteFile,请仔细阅读作者给出的注释,它能给你开发思路!!!
关于群文件的操作,我只举例上传与下载,其余的可以翻阅源码,食用方法注释写得很详细。
上文说过,我写了一个handler用于处理群消息,下文是一个栗子
@CheckPermission(isAdminOnly = true)
public void onMessage(@NotNull GroupMessageEvent event) {
//发送人信息
Member sender = event.getSender();
//目标消息所在群
Group group = event.getSource().getGroup();
//消息文本
String msg = event.getMessage().contentToString();
}
group.getFilesRoot()方法可以让我们定位到群文件的根目录“/”,亦是我们在客户端中点开群文件第一个显示的目录界面。
resolve()方法可以将操作定位到我们需要前去的目录或所需要操作的文件,详见注释。
我们可以这样遍历群文件,不过在键入group.getFilesRoot().listFilesIterator(false).var后回车,IDEA自动创建的变量的类型直接为Iterator,兴许是还没这么智能,建议手动补全为Iterator<RemoteFile>。善于挖掘源码的你也一定注意到了,listFilesIterator()方法支持懒加载。
if (msg.contains("遍历群文件")) {
if (!permission) return;
Iterator<RemoteFile> iterator = group.getFilesRoot().listFilesIterator(false);
List<RemoteFile> list = group.getFilesRoot().listFilesCollection();
}
RemoteFile还提供了俩方法 isFile()和isDirectory()用于判断目标类型。反正要么是文件,要么是文档,任君选择。
getDownloadInfo()方法会返回一个叫DownloadInfo的bean,其中包含了该文件在群文件的路径,ID,下载链接等一系列信息,值得一提的是,它提供了md5和sha1,方便我们对下载的文件进行完整性校验。下文便是一个文件下载栗子,文件下载轮子我用的是hutool,GAV附上
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-http</artifactId>
<version>5.5.1</version>
</dependency>
List<RemoteFile> list = group.getFilesRoot().listFilesCollection();
//一系列的判断,校验
String url = files.get(0).getDownloadInfo().getUrl();
file = HttpUtil.downloadFileFromUrl(url, "temp");
mirai更新2.6.3了,只需要更新一下版本号即可,GAV:
<dependency>
<groupId>net.mamoe</groupId>
<artifactId>mirai-core-jvm</artifactId>
<version>2.6.3</version>
</dependency>
然后就是文件上传,文件上传这块感觉和OSS(对象存储)很相似,不过暂时mirai还不能做到查看所给的“文件名”,自动创建不存在的文件夹。废话不多说,上代码
if (msg.startsWith("文件上传")) {
File file = new File("C:\\deviceInfo.json");
RemoteFile remoteFile = group.getFilesRoot().resolve("/test").resolve(file.getName());
remoteFile.uploadAndSend(file);
}
其实在文件上传这块 resolve()方法其实相当于是设置你上传的文件的“文件名”,如果给定的“文件名”包含一个路径(例 “\test\Test.java”),则自动将上传的Test.java放入根目录文件中的test文件夹。如果这个“test”文件夹不存在,mirai不会自动创建之,取而代之的是一个报错。
我给出一个方案
if (msg.startsWith("文件上传")) {
File file = new File("C:\\deviceInfo.json");
// 这是一个不存在的文件夹
String path = "/fileTestDocument";
RemoteFile resolve = group.getFilesRoot().resolve(path);
if (!resolve.exists()) {
resolve.mkdir();
}
resolve.resolve(file.getName()).uploadAndSend(file);
}
上述方案中,我选择exists()方法作为目标文件夹是否存在的判断方法,如果你的bot在这个业务中具有管理员权限,那可以直接调用mkdir()
第四天补充完成,我当前的业务是以群文件为主。后续的话,新的消息我可能用不了多少,但是会逐步完善功能。
——————————这是分隔符——————————