From 1f2d7e229f7ec1a9b425415cb60a9b3338c91d9b Mon Sep 17 00:00:00 2001 From: Him188 Date: Sat, 18 Jan 2020 22:28:37 +0800 Subject: [PATCH] Add BlockingBot --- .../net/mamoe/mirai/japt/BlockingBot.java | 123 ++++++++++++++++++ .../net/mamoe/mirai/japt/BlockingBotImpl.kt | 41 ++++++ 2 files changed, 164 insertions(+) create mode 100644 mirai-japt/src/main/kotlin/net/mamoe/mirai/japt/BlockingBotImpl.kt diff --git a/mirai-japt/src/main/java/net/mamoe/mirai/japt/BlockingBot.java b/mirai-japt/src/main/java/net/mamoe/mirai/japt/BlockingBot.java index dd50312b6..428cbc0af 100644 --- a/mirai-japt/src/main/java/net/mamoe/mirai/japt/BlockingBot.java +++ b/mirai-japt/src/main/java/net/mamoe/mirai/japt/BlockingBot.java @@ -1,6 +1,129 @@ package net.mamoe.mirai.japt; +import kotlinx.io.core.ByteReadPacket; +import net.mamoe.mirai.BotAccount; +import net.mamoe.mirai.contact.GroupId; +import net.mamoe.mirai.contact.GroupInternalId; +import net.mamoe.mirai.data.AddFriendResult; +import net.mamoe.mirai.data.ImageLink; +import net.mamoe.mirai.message.data.Image; +import net.mamoe.mirai.network.BotNetworkHandler; +import net.mamoe.mirai.utils.GroupNotFoundException; +import net.mamoe.mirai.utils.MiraiInternalAPI; +import net.mamoe.mirai.utils.MiraiLogger; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + public interface BlockingBot { + /** + * 账号信息 + */ + @MiraiInternalAPI + @NotNull + BotAccount getAccount(); + /** + * QQ 号码. 实际类型为 uint + */ + long getUin(); + /** + * 日志记录器 + */ + @NotNull + MiraiLogger getLogger(); + + // region contacts + + /** + * 与这个机器人相关的 QQ 列表. 机器人与 QQ 不一定是好友 + */ + @NotNull + List getQQs(); + + /** + * 获取缓存的 QQ 对象. 若没有对应的缓存, 则会线程安全地创建一个. + */ + BlockingQQ getQQ(long id); + + /** + * 与这个机器人相关的群列表. 机器人不一定是群成员. + */ + @NotNull + List getGroups(); + + /** + * 获取缓存的群对象. 若没有对应的缓存, 则会线程安全地创建一个. + * 若 {@code id} 无效, 将会抛出 {@link GroupNotFoundException} + */ + @NotNull + BlockingGroup getGroup(long id); + + /** + * 获取缓存的群对象. 若没有对应的缓存, 则会线程安全地创建一个. + * 若 {@code id} 无效, 将会抛出 {@link GroupNotFoundException} + */ + @NotNull + BlockingGroup getGroup(@NotNull GroupId id); + + /** + * 获取缓存的群对象. 若没有对应的缓存, 则会线程安全地创建一个. + * 若 {@code internalId} 无效, 将会抛出 {@link GroupNotFoundException} + */ + @NotNull + BlockingGroup getGroup(@NotNull GroupInternalId internalId); + + // endregion + + // region network + + /** + * 网络模块 + */ + @NotNull + BotNetworkHandler getNetwork(); + + /** + * 登录. + *

+ * 最终调用 [net.mamoe.mirai.network.BotNetworkHandler.login] + * + * @throws net.mamoe.mirai.utils.LoginFailedException + */ + @SuppressWarnings("JavaDoc") + void login(); + + // endregion + + // region actions + + @NotNull + ImageLink getLink(@NotNull Image image); + + byte[] downloadAsByteArray(@NotNull Image image); + + @NotNull + ByteReadPacket download(@NotNull Image image); + + /** + * 添加一个好友 + * + * @param message 若需要验证请求时的验证消息. + * @param remark 好友备注 + */ + @NotNull + AddFriendResult addFriend(long id, @Nullable String message, @Nullable String remark); + + /** + * 同意来自陌生人的加好友请求 + */ + void approveFriendAddRequest(long id, @Nullable String remark); + // endregion + + /** + * 关闭这个 [Bot], 停止一切相关活动. 不可重新登录. + */ + void dispose(@Nullable Throwable throwable); } diff --git a/mirai-japt/src/main/kotlin/net/mamoe/mirai/japt/BlockingBotImpl.kt b/mirai-japt/src/main/kotlin/net/mamoe/mirai/japt/BlockingBotImpl.kt new file mode 100644 index 000000000..19c1f3bbd --- /dev/null +++ b/mirai-japt/src/main/kotlin/net/mamoe/mirai/japt/BlockingBotImpl.kt @@ -0,0 +1,41 @@ +package net.mamoe.mirai.japt + +import kotlinx.coroutines.runBlocking +import kotlinx.io.core.ByteReadPacket +import net.mamoe.mirai.Bot +import net.mamoe.mirai.BotAccount +import net.mamoe.mirai.contact.GroupId +import net.mamoe.mirai.contact.GroupInternalId +import net.mamoe.mirai.data.AddFriendResult +import net.mamoe.mirai.data.ImageLink +import net.mamoe.mirai.message.data.Image +import net.mamoe.mirai.network.BotNetworkHandler +import net.mamoe.mirai.utils.MiraiInternalAPI +import net.mamoe.mirai.utils.MiraiLogger +import net.mamoe.mirai.utils.toList + +internal class BlockingBotImpl(private val bot: Bot) : BlockingBot { + @MiraiInternalAPI + override fun getAccount(): BotAccount = bot.account + + override fun getUin(): Long = bot.uin + override fun getLogger(): MiraiLogger = bot.logger + @UseExperimental(MiraiInternalAPI::class) + override fun getQQs(): List = bot.qqs.delegate.toList().map { it.blocking() } + + override fun getQQ(id: Long): BlockingQQ = bot.getQQ(id).blocking() + @UseExperimental(MiraiInternalAPI::class) + override fun getGroups(): List = bot.groups.delegate.toList().map { it.blocking() } + + override fun getGroup(id: Long): BlockingGroup = runBlocking { bot.getGroup(id) }.blocking() + override fun getGroup(id: GroupId): BlockingGroup = runBlocking { bot.getGroup(id) }.blocking() + override fun getGroup(internalId: GroupInternalId): BlockingGroup = runBlocking { bot.getGroup(internalId) }.blocking() + override fun getNetwork(): BotNetworkHandler = bot.network + override fun login() = runBlocking { bot.login() } + override fun getLink(image: Image): ImageLink = bot.run { runBlocking { image.getLink() } } + override fun downloadAsByteArray(image: Image): ByteArray = bot.run { runBlocking { image.downloadAsByteArray() } } + override fun download(image: Image): ByteReadPacket = bot.run { runBlocking { image.download() } } + override fun addFriend(id: Long, message: String?, remark: String?): AddFriendResult = runBlocking { bot.addFriend(id, message, remark) } + override fun approveFriendAddRequest(id: Long, remark: String?) = runBlocking { bot.approveFriendAddRequest(id, remark) } + override fun dispose(throwable: Throwable?) = bot.dispose(throwable) +} \ No newline at end of file