Add BlockingBot

This commit is contained in:
Him188 2020-01-18 22:28:37 +08:00
parent aa427c20de
commit 1f2d7e229f
2 changed files with 164 additions and 0 deletions

View File

@ -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<BlockingQQ> getQQs();
/**
* 获取缓存的 QQ 对象. 若没有对应的缓存, 则会线程安全地创建一个.
*/
BlockingQQ getQQ(long id);
/**
* 与这个机器人相关的群列表. 机器人不一定是群成员.
*/
@NotNull
List<BlockingGroup> 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();
/**
* 登录.
* <p>
* 最终调用 [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);
}

View File

@ -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<BlockingQQ> = bot.qqs.delegate.toList().map { it.blocking() }
override fun getQQ(id: Long): BlockingQQ = bot.getQQ(id).blocking()
@UseExperimental(MiraiInternalAPI::class)
override fun getGroups(): List<BlockingGroup> = 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)
}