From b6f54dbb7b1511e2cf4248cf54efb4ffa44abeac Mon Sep 17 00:00:00 2001 From: Him188 Date: Sun, 27 Oct 2019 23:20:53 +0800 Subject: [PATCH] Fixed image --- README.md | 309 +++++++++++++++--- .../message/internal/MessageDataInternal.kt | 5 +- mirai-demos/mirai-demo-gentleman/build.gradle | 2 + .../lib/ExImageGallery.jar | Bin 0 -> 67729 bytes .../main/kotlin/demo/gentleman/Gentleman.kt | 119 ++++++- .../src/main/kotlin/demo/gentleman/Main.kt | 33 +- 6 files changed, 411 insertions(+), 57 deletions(-) create mode 100644 mirai-demos/mirai-demo-gentleman/lib/ExImageGallery.jar diff --git a/README.md b/README.md index d1a63355d..a1fb1f95f 100644 --- a/README.md +++ b/README.md @@ -1,64 +1,287 @@ # Mirai [![HitCount](http://hits.dwyl.io/him188/mamoe/mirai.svg)](http://hits.dwyl.io/him188/mamoe/mirai) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/7d0ec3ea244b424f93a6f59038a9deeb)](https://www.codacy.com/manual/Him188/mirai?utm_source=github.com&utm_medium=referral&utm_content=mamoe/mirai&utm_campaign=Badge_Grade) -一个以 **TIM PC协议(非web)** 驱动的跨平台QQ机器人服务端核心, 虽然目前仅支持 JVM -采用服务端-插件模式运行,同时提供独立的跨平台核心库. -Mirai 的所有模块均开源 +一个以 **TIM PC协议(非web)** 驱动的跨平台开源 QQ 机器人服务端核心, 目前仅支持 JVM +Mirai 在 JVM 平台采用插件模式运行,同时提供独立的跨平台核心库. +未来会在 Native(Win32) 平台提供目前比较流行的几种机器人软件的 API 转接 -项目处于开发阶段, 还有很多未完善的地方. 欢迎任何的代码贡献, 或是 issue. +若您有任何意见或建议, 欢迎提交 issue. + 部分协议来自网络上开源项目 + **一切开发旨在学习,请勿用于非法用途** -## 抢先体验 -核心框架结构已经开发完毕,一些核心功能也测试完成。 -仅需几分钟就可以测试 Mirai. +## Try + +现在您可以开始体验低付出高效率的 Mirai -目前还没有写构建,请使用 IDE 运行单个 main 函数。 1. Clone 2. Import as Gradle project -3. Run demo main [Demo 1 Main](mirai-demos/mirai-demo-1/src/main/java/demo1/Main.kt#L22) +3. Run demo main [Demo 1 Main](mirai-demos/mirai-demo-1/src/main/java/demo/subscribe/SubscribeSamples.kt) -### 事件 +**转到[开发文档](#Development-Guide---Kotlin)** -#### 使用 Kotlin -这里只演示进行不终止地监听。 -##### Top-level reified -多数情况下这是最好的方式。 +## Update log + +- 发送好友/群消息(10/14) +- 接受解析好友消息(10/14) +- 接收解析群消息(10/14) + - 成员昵称(10/18) + - 成员权限(10/18, 计划优化) +- 好友在线状态改变(10/14) +- Android客户端上线/下线(10/18) +- 上传并发送好友/群图片(10/21, 10/26) + +计划中: 添加好友 + +## Requirements + +所有平台: +- Kotlin 1.3.50 + +JVM 平台: +- Java 8 + +#### Libraries used +Mirai 使用以下开源库: +- kotlin-stdlib +- kotlinx-coroutines +- kotlinx-io +- kotlin-reflect +- pcap4j +- atomicfu +- ktor +- klock +- tornadofx +- javafx + +## Development Guide - Kotlin + +平台通用开发帮助(不含协议层). + +您需要有一定 Kotlin 基础才能读懂以下内容. +若您对本文档有建议, 请告诉我们 + +目录: +- [Introduction](#Introduction) Mirai 介绍 +- [Modules](#Modules) 模块介绍 + - [mirai-core](#mirai-core) 核心模块 + - [mirai-console](#mirai-console) JVM 控制台 + - [mirai-demo](#mirai-demo) 示例和演示程序 + - [mirai-debug](#mirai-debug) 抓包工具和分析工具\ +- [Logger](#Logger) 日志系统 +- [Bot](#Bot) 机器人类 +- [Contact](#Contact) 联系人 +- [Message](#Message) 消息 + - [MessageChain](#MessageChain) `MessageChain` + - [Types](#Types) 消息类型 + - [Operators](#Operators) `Message` 一般用法 + - [Extensions](#Extensions) `Message` 的常用扩展方法 +- [Image](#Image) 图片 + - [Image JVM](#Image-JVM) JVM 平台扩展实现 +- [Event](#Event) 事件 + - [Subscription](#Subscription) 事件监听(订阅) + - [Message Event](#Message-Event) 针对消息事件的订阅实现 + +### Introduction + +Mirai 目前为快速流转(Moving fast)状态, 增量版本之间可能不具有兼容性,任何功能都可能在没有警告的情况下添加、删除或者更改。 + +### Modules +Mirai 的模块组成 + +#### mirai-core +Mirai 的核心部分. + +- 独立的跨平台设计, 可以被以库的形式内置在任意项目内. +- 现有 JVM 支持 +- 未来计划 Android, Native 支持 + +#### mirai-console +- 仅 JVM 平台 +- 仅命令行 +- Jar 插件支持 + +#### mirai-demo +Samples and demos. +目前仅有 [SubscribeSamples](mirai-demos/mirai-demo-1/src/main/java/demo/subscribe/SubscribeSamples.kt) + +#### mirai-debug +抓包工具和分析工具. 不会进行稳定性维护. + +- 抓包自动解密和分析 +- Hex 着色比较器 +- GUI Hex 调试器(值转换) + +### Logger +[Contact](mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/MiraiLogger.kt) +Mirai 维护跨平台日志系统, 针对平台的实现为 `expect class PlatformLogger`, +一般推荐使用顶层的 `var DefaultLogger: (identity: String?) -> PlatformLogger` 通过 `DefaultLogger( ... )` 来创建日志记录器. +每个 `Bot` 都拥有一个日志记录器, 可通过 `Bot.logger` 获取 + +-日志记录尚不完善, 以后可能会修改- + +### Bot +[Bot](mirai-core/src/commonMain/kotlin/net.mamoe.mirai/Bot.kt) 为机器人 +一个机器人实例只有一个账号. +一个机器人实例由多个模块构成. +- `BotNetworkHandler` (管理所有网络方面事务, 本文不介绍) +- `ContactSystem` (管理联系人, 维护一个 `QQ` 列表和一个 `Group` 列表) + +Mirai 能同时维护多个机器人账号. + +[BotHelper](mirai-core/src/commonMain/kotlin/net.mamoe.mirai/BotHelper.kt) 中存在一些快捷方法 + +### Contact +[Contact](mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/Contact.kt) 为联系人. +虽是联系人, 但它包含 `QQ` 和 `Group`. +联系人并不是独立的, 它必须隶属于某个 `Bot` + +**共有方法**: +- `sendMessage`(`String`|`Message`|`MessageChain`) + +**共有属性**: +- id (即 QQ 号和群号) + +注: 为减少出错概率, 联系人的 `id` 均使用无符号整型 `UInt`, 这是 Kotlin 1.3 的一个实验性类型 +我们建议您在开发中也使用 `UInt`, 以避免产生一些难以发现的问题 + +### Message +Mirai 中所有的消息均为对象化的 [Message](mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/Message.kt) +实际上, 所有的 `Message` 都是 `inline class`, 保证无性能损失的前提下又不失使用的严谨性和便捷性. +`Message` 有大量扩展和相关函数. 本文只介绍使用较多的一部分. 其他函数您也将会在实际开发中通过注释指引了解到. + +#### MessageChain + +一条消息为一个 `MessageChain` 对象. +`MessageChain` 也是 `Message` 的一种 +`MessageChain` 实现 `MutableList` 接口. +它有多种实现: +- `inline class MessageChainImpl` 通常的 `MutableList` 实现 +- `inline class SingleMessageChain` 单个消息的不可变代表包装 +- `object NullMessageChain` 空的不可变实现. 用于替代 `null` 情况 + +仅 `NullMessageChain` 是公开(public)的. 在开发中无需考虑另外两个的存在, 他们将会在 Mirai 内部合适地使用. + +#### Types +现支持的消息类型: +- `PlainText` 纯文本 +- `Image` 图片 (将会有独立章节来说明图片的上传等) +- `Face` 表情 (QQ 自带表情) + +计划中: +- `At` (仅限群, 将会被 QQ 显示为蓝色的连接) +- `XML` +- `File` (文件上传) + +#### Operators + +| 操作表示 | 说明 | +|---| ---| +| Message + Message | 连接 `Message`, 得到 `MessageChain` | +| Message + String | 连接 `Message` 与 `String`(`PlainText`) 为 `MessageChain` | +| Message eq String | 可读字符串如 "\[@10000\]" 判断 | +| String in Message | 内容包含判断 | + +#### Extensions + +| 扩展方法 | 说明 | +|---| ---| +|String.toChain():MessageChain| PlainText(this) | +|Message.toChain():MessageChain| 构造上文提到的 SingleMessageChain | +|suspend Message.sendTo(Contact)| 发送给联系人 | + +### Image +考虑到协议需求和内存消耗, Mirai 的所有 API 均使用 [ExternalImage](mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/ExternalImage.kt) +`ExternalImage` 包含图片长宽、大小、格式、文件数据 +您只需通过扩展函数处理图片. + +| 扩展函数 | 说明 | +|---| ---| +|suspend ExternalImage.sendTo(Contact)| 上传图片并以纯图片消息发送给联系人 | +|suspend ExternalImage.upload():Image | 上传图片并得到 [Image] 消息 | +|suspend Contact.sendImage(ExternalImage) | 上传图片并发送给指定联系人 | + +注: 使用 `upload` 而不是 `toMessage` 作为函数名是为了强调它是一个耗时的过程. + +#### Image JVM + +对于 JVM 平台, Mirai 提供额外的足以应对大多数情况的扩展函数: +[ExternalImageJvm](mirai-core/src/jvmMain/kotlin/net.mamoe.mirai/utils/ExternalImageJvm.kt) +若有必要, 这些函数将会创建临时文件以避免使用内存缓存图片 +一下内容中, `IMAGE` 可替换为 `ExternalImage`, `BufferedImage`, `File`, `InputStream`, `URL` 或 `Input` (来自 `kotlinx.io`) + +转为 `ExternalImage` +- `suspend IMAGE.toExternalImage():ExternalImage` + +直接发送 +- `suspend IMAGE.sendTo(Contact)` +- `suspend Contact.sendImage(IMAGE)` + +转为 Message +- `suspend IMAGE.upload(Contact)` +- `suspend Contact.upload(IMAGE)` + +只要语义上正确的函数, 在 Mirai 都是可行的. + +### Event + +#### Subscription + +[查看相关监听代码](mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/Subscribers.kt) + +您可以通过顶层 (top-level) 方法 `subscribeXXX` 对某个事件进行监听, 其中 `XXX` 可以是 + - Always (不断监听) + - Once (一次监听) + - Until / While (条件监听) + +例: ```kotlin -inline fun subscribeAlways(handler: (E) -> Unit) - subscribeAlways{ //it: FriendMessageEvent } ``` -![AYWVE86P](.github/A%7DYWVE860U%28%25YQD%24R1GB1%5BP.png) +#### Message Event -### 图片测试 -现在可以接收图片消息(并解析为消息链): -![JsssF](.github/J%5DCE%29IK4BU08%28EO~UVLJ%7B%5BF.png) -![](.github/68f8fec9.png) +对于消息事件, Mirai 还提供了更强大的 DSL 监听方式. +[MessageSubscribersBuilder](mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/MessageSubscribers.kt#L140) +可用条件方法为: + - case (内容相等) + - contains + - startsWith + - endsWith + - sentBy (特定发送者) -上传发送图片已经完成, 您可以在 Demo 中找到发送方式. -机器人可以转发图片消息.详情查看 [Image.kt](mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/Message.kt#L81) - -## 现已支持 - -- 发送好友/群消息(10/14) -- 接受解析好友消息(10/14) -- 接收解析群消息(10/14) - - 成员权限, 昵称(10/18) -- 好友在线状态改变(10/14) -- Android客户端上线/下线(10/18) -- 上传并发送图片(10/21) - -## 使用方法 -### 要求 - - Kotlin 1.3+ -#### 用于 JVM 平台 - - Java 8 -## 插件开发 -``` text - to be continued - ... +```kotlin +// 监听所有群和好友消息 +subscribeMessages {// this: MessageSubscribersBuilder + case("你好"){ + // this: SenderAndMessage + // message: MessageChain + // sender: QQ + // it: String (来自 MessageChain.toString) + // group: Group (如果是群消息) + reply("你好!")// reply将发送给这个事件的主体(群消息的群, 好友消息的好友) + } + + replyCase("你好"){ "你好!" } // lambda 的返回值将会作为回复消息 + + "Hello" reply "World" // 收到 "Hello" 回复 "World" +} ``` + +当然, 您也可以仅监听来自群或好友的消息 +```kotlin +// 监听所有好友消息 +subscribeFriendMessages { } +//监听所有群消息 +subscribeGroupMessages { } +``` + +另外, 由于 Mirai 可同时维护多个机器人账号, Mirai 也提供了对单个机器人的事件的监听. +为了限制只监听来自某个机器人账号的事件, 您只需要在 `subscribeMessages` 前添加 `bot.` 将其修改为调用扩展方法. +例: +```kotlin +bot.subscribeMessages { } +``` \ No newline at end of file diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/internal/MessageDataInternal.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/internal/MessageDataInternal.kt index 0c121a8f0..8bcb81c3c 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/internal/MessageDataInternal.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/internal/MessageDataInternal.kt @@ -27,8 +27,9 @@ internal fun IoBuffer.parseLongText0x19(): PlainText { //01 00 59 AA 02 56 30 01 3A 40 6E 35 46 4F 62 68 75 4B 6F 65 31 4E 63 45 41 6B 77 4B 51 5A 5A 4C 47 54 57 43 68 30 4B 56 7A 57 44 38 67 58 70 37 62 77 6A 67 51 69 66 66 53 4A 63 4F 69 78 4F 75 37 36 49 49 4F 37 48 32 55 63 9A 01 0F 80 01 01 C8 01 00 F0 01 00 F8 01 00 90 02 00 14 01 75 01 01 6B 01 78 9C CD 92 BB 4E C3 30 14 86 77 9E C2 32 73 DA A4 21 24 48 4E AA F4 06 A5 B4 51 55 A0 A8 0B 4A 5D 27 35 E4 82 72 69 4B B7 6E 08 06 C4 C0 06 42 48 30 20 21 60 62 EB E3 34 F4 31 70 4A 11 23 23 FC 96 2C F9 D8 BF CF F1 77 8C F2 23 D7 01 03 12 84 D4 F7 54 28 64 78 08 88 87 FD 1E F5 6C 15 C6 91 C5 29 30 AF AD 00 26 E4 86 36 E8 06 94 58 2A CC FC 73 41 E0 1E 5A D4 21 0D D3 25 2A 2C 55 0A 1B D2 BA 5E E0 24 91 D7 B9 B5 72 41 E1 74 B9 5C E0 78 25 27 8B 92 28 14 45 45 FF 76 B4 E8 98 39 18 05 13 47 0B 24 03 4A 86 F5 D8 89 68 3D B4 21 B0 1C 93 71 11 21 08 49 30 A0 98 54 4B 6C 25 A5 E6 80 84 B4 A7 42 4F AA 18 DD 7E 5C F3 89 D0 C0 65 FD 78 58 6B 76 3A 3B 9B BB ED 62 9F AF ED 8F DB 25 C5 3E 38 91 BB C3 23 BB 49 2D AB B5 8D 0D 3A 32 62 79 BD 5A 35 E4 AD DC 1E 86 40 03 88 46 C4 05 8E 79 EA C7 11 EB 09 64 91 88 46 0E D1 C0 5F 73 FD 4D 00 65 97 95 02 D4 0F 34 94 65 D3 B2 78 80 7D C7 0F 54 B8 AA F0 E9 60 8F 4A EE 1E 3F 6E 2E 84 E4 F6 7E 3E 7D 9E 5D 5E 25 EF 67 C9 E4 15 FC DC 81 B2 29 08 0D 85 7E 1C 60 02 BC 45 33 E7 93 F3 D9 C3 D3 FC E5 6D 36 BD 86 2C C3 D7 66 7A 98 FD 4F ED 13 9B C7 C1 78 02 00 04 00 00 00 23 0E 00 07 01 00 04 00 00 00 09 discardExact(1)//0x01 val raw = readLVByteArray() + //TODO 这应该是手机发送时的字体或气泡之类的 println("parseLongText0x19.raw=${raw.toUHexString()}") - return PlainText(raw.toUHexString()) + return PlainText("") } internal fun IoBuffer.parseMessageImage0x06(): Image { @@ -100,6 +101,8 @@ internal fun ByteReadPacket.readMessage(): Message? { println("0x14的未知压缩的data=" + value.toUHexString()) //todo 未知压缩算法 + return PlainText("") + //后面似乎还有一节? //discardExact(7)//02 00 04 00 00 00 23 return PlainText(value.toUHexString()) diff --git a/mirai-demos/mirai-demo-gentleman/build.gradle b/mirai-demos/mirai-demo-gentleman/build.gradle index 08e1a2973..e1134735f 100644 --- a/mirai-demos/mirai-demo-gentleman/build.gradle +++ b/mirai-demos/mirai-demo-gentleman/build.gradle @@ -8,4 +8,6 @@ dependencies { compile group: 'com.alibaba', name: 'fastjson', version: '1.2.62' implementation 'org.jsoup:jsoup:1.12.1' + + implementation files('./lib/ExImageGallery.jar') } diff --git a/mirai-demos/mirai-demo-gentleman/lib/ExImageGallery.jar b/mirai-demos/mirai-demo-gentleman/lib/ExImageGallery.jar new file mode 100644 index 0000000000000000000000000000000000000000..8ebac4b50f05e268695d23bd7575dff277159ec2 GIT binary patch literal 67729 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

u6|5?)`ot5{92pm(9?aSe&?cz`O&v%}G##B=mrV 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 literal 0 HcmV?d00001 diff --git a/mirai-demos/mirai-demo-gentleman/src/main/kotlin/demo/gentleman/Gentleman.kt b/mirai-demos/mirai-demo-gentleman/src/main/kotlin/demo/gentleman/Gentleman.kt index b4589a058..a0a798c08 100644 --- a/mirai-demos/mirai-demo-gentleman/src/main/kotlin/demo/gentleman/Gentleman.kt +++ b/mirai-demos/mirai-demo-gentleman/src/main/kotlin/demo/gentleman/Gentleman.kt @@ -1,10 +1,23 @@ package demo.gentleman -import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.* +import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.channels.Channel -import kotlinx.coroutines.launch +import net.mamoe.ex.content.RandomAccessHDImage +import net.mamoe.ex.network.ExNetwork +import net.mamoe.ex.network.connections.defaults.DownloadHDImageStreamSpider +import net.mamoe.ex.network.connections.defaults.ExIPWhiteListSpider import net.mamoe.mirai.contact.Contact +import net.mamoe.mirai.contact.Group +import net.mamoe.mirai.contact.QQ +import net.mamoe.mirai.message.sendTo +import net.mamoe.mirai.message.uploadImage +import net.mamoe.robot.AsyncTaskPool +import java.io.Closeable +import java.io.InputStream +import java.util.* +import java.util.concurrent.ExecutionException +import java.util.concurrent.Future /** @@ -23,6 +36,104 @@ object Gentlemen : MutableMap by mutableMapOf() { fun getOrPut(key: Contact): Gentleman = this.getOrPut(key.id) { Gentleman(key) } } + +private val sessionMap = LinkedHashMap() + +val ERROR_LINK = "https://i.loli.net/2019/08/05/usINjXSiZxrQJkT.jpg" +val TITLE_PICTURE_LINK = "https://i.loli.net/2019/08/04/B5ZMw1rdzVQI7Yv.jpg" + +var minstar = 100 + +class HPictureSession constructor(private val group: Group, private val sender: QQ, val keyword: String) : Closeable { + + private var hdImage: RandomAccessHDImage? = null + var sentCount: Int = 0 + set(sentCount) { + field = this.sentCount + }//已经发送了几个 ImageSet + + private var fetchTask: Future? = null + + init { + AsyncTaskPool.submit { + try { + Thread.sleep((1000 * 60 * 10).toLong())//10min + } catch (ignored: InterruptedException) { + } + + close() + } + } + + init { + GlobalScope.launch { reloadImage() } + } + + private suspend fun reloadImage() { + if (keyword.isEmpty()) { + group.sendMessage("正在搜寻随机色图") + } else { + group.sendMessage("正在搜寻有关 $keyword 的色图") + } + try { + withContext(IO) { + if (!ExNetwork.doSpider(ExIPWhiteListSpider()).get()) { + group.sendMessage("无法连接EX") + close() + return@withContext + } + } + } catch (e: InterruptedException) { + e.printStackTrace() + close() + return + } catch (e: ExecutionException) { + e.printStackTrace() + close() + return + } + + this.fetchTask = ExNetwork.getRandomImage(keyword, minstar) { value -> + this.hdImage = value + if (this.hdImage == null) { + runBlocking { group.sendMessage("没找到") } + close() + } else { + with(this.hdImage!!) { + if (this.picId != null) { + runBlocking { + group.sendMessage(picId) + } + } else { + AsyncTaskPool.submit { + try { + runBlocking { + group.uploadImage(ExNetwork.doSpider(DownloadHDImageStreamSpider(this@with)).get() as InputStream).sendTo(group) + } + } catch (var7: Exception) { + var7.printStackTrace() + } + + } + } + } + + } + } + } + + override fun close() { + this.hdImage = null + if (this.fetchTask != null) { + if (!this.fetchTask!!.isCancelled && !this.fetchTask!!.isDone) { + this.fetchTask!!.cancel(true) + } + } + this.fetchTask = null + sessionMap.entries.removeIf { longHPictureSessionEntry -> longHPictureSessionEntry.value === this } + } +} + @ExperimentalCoroutinesApi class Gentleman(private val contact: Contact) : Channel by Channel(IMAGE_BUFFER_CAPACITY) { init { @@ -30,7 +141,7 @@ class Gentleman(private val contact: Contact) : Channel by Channel( GlobalScope.launch { while (!isClosedForSend) { send(GentleImage().apply { - sample_url = "http://dev.itxtech.org:10322/randomImg.uue?tdsourcetag=s_pctim_aiomsg" + sample_url = "http://dev.itxtech.org:10322/randomImg.uue?tdsourcetag=s_pctim_aiomsg&size=large" contact = this@Gentleman.contact image.await() diff --git a/mirai-demos/mirai-demo-gentleman/src/main/kotlin/demo/gentleman/Main.kt b/mirai-demos/mirai-demo-gentleman/src/main/kotlin/demo/gentleman/Main.kt index e2c8ce8e5..3b6391ef7 100644 --- a/mirai-demos/mirai-demo-gentleman/src/main/kotlin/demo/gentleman/Main.kt +++ b/mirai-demos/mirai-demo-gentleman/src/main/kotlin/demo/gentleman/Main.kt @@ -2,12 +2,14 @@ package demo.gentleman +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import net.mamoe.mirai.Bot import net.mamoe.mirai.BotAccount +import net.mamoe.mirai.event.subscribeGroupMessages import net.mamoe.mirai.event.subscribeMessages import net.mamoe.mirai.login -import net.mamoe.mirai.message.Image -import net.mamoe.mirai.message.ImageId import net.mamoe.mirai.network.protocol.tim.packet.login.requireSuccess import java.io.File @@ -37,17 +39,30 @@ suspend fun main() { bot.subscribeMessages { "你好" reply "你好!" - startsWith("发送图片", removePrefix = true) { - reply(Image(ImageId(it))) + startsWith("随机色图", removePrefix = true) { + withContext(Dispatchers.Default) { + try { + repeat(it.toIntOrNull() ?: 1) { + launch { + Gentlemen.getOrPut(subject).receive().image.await().send() + } + } + } catch (e: Exception) { + reply(e.message ?: "exception: null") + } + } } - case("随机色图") { - Gentlemen.getOrPut(subject).receive().image.await().send() + } + + bot.subscribeGroupMessages { + startsWith("色图", removePrefix = true) { + HPictureSession(group, sender, it) } - "色图" caseReply { - - "" + startsWith("minstar=", removePrefix = true) { + minstar = it.toInt() + reply("minStar set to $minstar") } }