Commit 7fd5cfe3 authored by ryoii's avatar ryoii

Low level api for request event again

parent 73be4e03
...@@ -91,17 +91,13 @@ internal class QQAndroidBot constructor( ...@@ -91,17 +91,13 @@ internal class QQAndroidBot constructor(
"the request $event is outdated: You had already responded it on another device." "the request $event is outdated: You had already responded it on another device."
} }
network.run { _lowLevelSolveNewFriendRequestEvent(
NewContact.SystemMsgNewFriend.Action( eventId = event.eventId,
bot.client, fromId = event.fromId,
event, fromNick = event.fromNick,
accept = true accept = true,
).sendWithoutExpect() blackList = false
bot.friends.delegate.addLast(bot._lowLevelNewFriend(object : FriendInfo { )
override val uin: Long get() = event.fromId
override val nick: String get() = event.fromNick
}))
}
} }
override suspend fun rejectNewFriendRequest(event: NewFriendRequestEvent, blackList: Boolean) { override suspend fun rejectNewFriendRequest(event: NewFriendRequestEvent, blackList: Boolean) {
...@@ -117,14 +113,13 @@ internal class QQAndroidBot constructor( ...@@ -117,14 +113,13 @@ internal class QQAndroidBot constructor(
"the request $event is outdated: You had already responded it on another device." "the request $event is outdated: You had already responded it on another device."
} }
network.run { _lowLevelSolveNewFriendRequestEvent(
NewContact.SystemMsgNewFriend.Action( eventId = event.eventId,
bot.client, fromId = event.fromId,
event, fromNick = event.fromNick,
accept = false, accept = false,
blackList = blackList blackList = blackList
).sendWithoutExpect() )
}
} }
@OptIn(LowLevelAPI::class) @OptIn(LowLevelAPI::class)
...@@ -139,21 +134,14 @@ internal class QQAndroidBot constructor( ...@@ -139,21 +134,14 @@ internal class QQAndroidBot constructor(
"the request $this is outdated: Another operator has already responded it." "the request $this is outdated: Another operator has already responded it."
} }
network.run { _lowLevelSolveMemberJoinRequestEvent(
NewContact.SystemMsgNewGroup.Action( eventId = event.eventId,
bot.client, fromId = event.fromId,
event, fromNick = event.fromNick,
accept = true groupId = event.groupId,
).sendWithoutExpect() accept = true,
event.group.members.delegate.addLast(event.group.newMember(object : MemberInfo { blackList = false
override val nameCard: String get() = "" )
override val permission: MemberPermission get() = MemberPermission.MEMBER
override val specialTitle: String get() = ""
override val muteTimestamp: Int get() = 0
override val uin: Long get() = event.fromId
override val nick: String get() = event.fromNick
}))
}
} }
@Suppress("DuplicatedCode") @Suppress("DuplicatedCode")
...@@ -167,14 +155,15 @@ internal class QQAndroidBot constructor( ...@@ -167,14 +155,15 @@ internal class QQAndroidBot constructor(
check(!event.group.members.contains(event.fromId)) { check(!event.group.members.contains(event.fromId)) {
"the request $this is outdated: Another operator has already responded it." "the request $this is outdated: Another operator has already responded it."
} }
network.run {
NewContact.SystemMsgNewGroup.Action( _lowLevelSolveMemberJoinRequestEvent(
bot.client, eventId = event.eventId,
event, fromId = event.fromId,
accept = false, fromNick = event.fromNick,
blackList = blackList groupId = event.groupId,
).sendWithoutExpect() accept = false,
} blackList = blackList
)
} }
private inline fun checkGroupPermission(eventBot: Bot, eventGroup: Group, eventName: () -> String) { private inline fun checkGroupPermission(eventBot: Bot, eventGroup: Group, eventName: () -> String) {
...@@ -198,14 +187,15 @@ internal class QQAndroidBot constructor( ...@@ -198,14 +187,15 @@ internal class QQAndroidBot constructor(
check(event.responded.compareAndSet(false, true)) { check(event.responded.compareAndSet(false, true)) {
"the request $this has already been responded" "the request $this has already been responded"
} }
network.run {
NewContact.SystemMsgNewGroup.Action( _lowLevelSolveMemberJoinRequestEvent(
bot.client, eventId = event.eventId,
event, fromId = event.fromId,
accept = null, fromNick = event.fromNick,
blackList = blackList groupId = event.groupId,
).sendWithoutExpect() accept = null,
} blackList = blackList
)
} }
override suspend fun acceptInvitedJoinGroupRequest(event: BotInvitedJoinGroupRequestEvent) = override suspend fun acceptInvitedJoinGroupRequest(event: BotInvitedJoinGroupRequestEvent) =
...@@ -224,13 +214,12 @@ internal class QQAndroidBot constructor( ...@@ -224,13 +214,12 @@ internal class QQAndroidBot constructor(
"the request $this is outdated: Bot has been already in the group." "the request $this is outdated: Bot has been already in the group."
} }
network.run { _lowLevelSolveBotInvitedJoinGroupRequestEvent(
NewContact.SystemMsgNewGroup.Action( eventId = event.eventId,
bot.client, invitorId = event.invitorId,
event, groupId = event.groupId,
accept = accept accept = accept
).sendWithoutExpect() )
}
} }
} }
...@@ -719,6 +708,78 @@ internal abstract class QQAndroidBotBase constructor( ...@@ -719,6 +708,78 @@ internal abstract class QQAndroidBotBase constructor(
} }
} }
@LowLevelAPI
@MiraiExperimentalAPI
override suspend fun _lowLevelSolveNewFriendRequestEvent(eventId: Long, fromId: Long, fromNick: String, accept: Boolean, blackList: Boolean) {
network.apply {
NewContact.SystemMsgNewFriend.Action(
bot.client,
eventId = eventId,
fromId = fromId,
accept = accept,
blackList = blackList
).sendWithoutExpect()
bot.friends.delegate.addLast(bot._lowLevelNewFriend(object : FriendInfo {
override val uin: Long get() = fromId
override val nick: String get() = fromNick
}))
}
}
@LowLevelAPI
@MiraiExperimentalAPI
override suspend fun _lowLevelSolveBotInvitedJoinGroupRequestEvent(
eventId: Long,
invitorId: Long,
groupId: Long,
accept: Boolean
) {
network.run {
NewContact.SystemMsgNewGroup.Action(
bot.client,
eventId = eventId,
fromId = invitorId,
groupId = groupId,
isInvited = true,
accept = accept
).sendWithoutExpect()
}
}
@LowLevelAPI
@MiraiExperimentalAPI
override suspend fun _lowLevelSolveMemberJoinRequestEvent(
eventId: Long,
fromId: Long,
fromNick: String,
groupId: Long,
accept: Boolean?,
blackList: Boolean
) {
network.apply {
NewContact.SystemMsgNewGroup.Action(
bot.client,
eventId = eventId,
fromId = fromId,
groupId = groupId,
isInvited = false,
accept = accept,
blackList = blackList
).sendWithoutExpect()
groups[groupId].apply {
members.delegate.addLast(newMember(object : MemberInfo {
override val nameCard: String get() = ""
override val permission: MemberPermission get() = MemberPermission.MEMBER
override val specialTitle: String get() = ""
override val muteTimestamp: Int get() = 0
override val uin: Long get() = fromId
override val nick: String get() = fromNick
}))
}
}
}
@Suppress("DEPRECATION", "OverridingDeprecatedMember") @Suppress("DEPRECATION", "OverridingDeprecatedMember")
override suspend fun queryImageUrl(image: Image): String = when (image) { override suspend fun queryImageUrl(image: Image): String = when (image) {
is OnlineFriendImageImpl -> image.originUrl is OnlineFriendImageImpl -> image.originUrl
......
...@@ -13,7 +13,6 @@ package net.mamoe.mirai.qqandroid.network.protocol.packet.chat ...@@ -13,7 +13,6 @@ package net.mamoe.mirai.qqandroid.network.protocol.packet.chat
import kotlinx.io.core.ByteReadPacket import kotlinx.io.core.ByteReadPacket
import kotlinx.io.core.readBytes import kotlinx.io.core.readBytes
import net.mamoe.mirai.contact.Group
import net.mamoe.mirai.event.events.* import net.mamoe.mirai.event.events.*
import net.mamoe.mirai.getGroupOrNull import net.mamoe.mirai.getGroupOrNull
import net.mamoe.mirai.qqandroid.QQAndroidBot import net.mamoe.mirai.qqandroid.QQAndroidBot
...@@ -58,17 +57,15 @@ internal class NewContact { ...@@ -58,17 +57,15 @@ internal class NewContact {
override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): NewFriendRequestEvent? { override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): NewFriendRequestEvent? {
readBytes().loadAs(Structmsg.RspSystemMsgNew.serializer()).run { readBytes().loadAs(Structmsg.RspSystemMsgNew.serializer()).run {
val struct = friendmsgs?.firstOrNull() val struct = friendmsgs?.firstOrNull()
return if (struct == null) null else { return struct?.msg?.run {
struct.msg?.run { NewFriendRequestEvent(
NewFriendRequestEvent( bot,
bot, struct.msgSeq,
struct.msgSeq, msgAdditional,
msgAdditional, struct.reqUin,
struct.reqUin, groupCode,
groupCode, reqUinNick
reqUinNick )
)
}
} }
} }
} }
...@@ -77,7 +74,8 @@ internal class NewContact { ...@@ -77,7 +74,8 @@ internal class NewContact {
operator fun invoke( operator fun invoke(
client: QQAndroidClient, client: QQAndroidClient,
event: NewFriendRequestEvent, eventId: Long,
fromId: Long,
accept: Boolean, accept: Boolean,
blackList: Boolean = false blackList: Boolean = false
) = ) =
...@@ -92,8 +90,8 @@ internal class NewContact { ...@@ -92,8 +90,8 @@ internal class NewContact {
remark = "", remark = "",
blacklist = !accept && blackList blacklist = !accept && blackList
), ),
msgSeq = event.eventId, msgSeq = eventId,
reqUin = event.fromId, reqUin = fromId,
srcId = 6, srcId = 6,
subSrcId = 7, subSrcId = 7,
subType = 1 subType = 1
...@@ -147,7 +145,7 @@ internal class NewContact { ...@@ -147,7 +145,7 @@ internal class NewContact {
readBytes().loadAs(Structmsg.RspSystemMsgNew.serializer()).run { readBytes().loadAs(Structmsg.RspSystemMsgNew.serializer()).run {
val struct = groupmsgs?.firstOrNull() val struct = groupmsgs?.firstOrNull()
return if (struct == null) null else struct.msg?.run<Structmsg.SystemMsg, Packet> { return struct?.msg?.run<Structmsg.SystemMsg, Packet> {
//this.soutv("SystemMsg") //this.soutv("SystemMsg")
when (subType) { when (subType) {
1 -> { //管理员邀请 1 -> { //管理员邀请
...@@ -200,7 +198,10 @@ internal class NewContact { ...@@ -200,7 +198,10 @@ internal class NewContact {
operator fun invoke( operator fun invoke(
client: QQAndroidClient, client: QQAndroidClient,
event: MemberJoinRequestEvent, eventId: Long,
fromId: Long,
groupId: Long,
isInvited: Boolean,
accept: Boolean?, accept: Boolean?,
blackList: Boolean = false blackList: Boolean = false
) = ) =
...@@ -214,41 +215,17 @@ internal class NewContact { ...@@ -214,41 +215,17 @@ internal class NewContact {
true -> 11 // accept true -> 11 // accept
false -> 12 // reject false -> 12 // reject
}, },
groupCode = event.groupId, groupCode = groupId,
msg = "", msg = "",
remark = "", remark = "",
blacklist = blackList blacklist = blackList
), ),
groupMsgType = 1, groupMsgType = if (isInvited) 2 else 1,
language = 1000,
msgSeq = event.eventId,
reqUin = event.fromId,
srcId = 3,
subSrcId = 31,
subType = 1
)
)
}
operator fun invoke(
client: QQAndroidClient,
event: BotInvitedJoinGroupRequestEvent,
accept: Boolean
) =
buildOutgoingUniPacket(client) {
writeProtoBuf(
Structmsg.ReqSystemMsgAction.serializer(),
Structmsg.ReqSystemMsgAction(
actionInfo = Structmsg.SystemMsgActionInfo(
type = if (accept) 11 else 12,
groupCode = Group.calculateGroupCodeByGroupUin(event.groupId)
),
groupMsgType = 2,
language = 1000, language = 1000,
msgSeq = event.eventId, msgSeq = eventId,
reqUin = event.invitorId, reqUin = fromId,
srcId = 3, srcId = 3,
subSrcId = 10016, subSrcId = if (isInvited) 10016 else 31,
subType = 1 subType = 1
) )
) )
......
...@@ -13,6 +13,9 @@ import kotlinx.coroutines.Job ...@@ -13,6 +13,9 @@ import kotlinx.coroutines.Job
import net.mamoe.mirai.contact.Friend import net.mamoe.mirai.contact.Friend
import net.mamoe.mirai.contact.Group import net.mamoe.mirai.contact.Group
import net.mamoe.mirai.data.* import net.mamoe.mirai.data.*
import net.mamoe.mirai.event.events.BotInvitedJoinGroupRequestEvent
import net.mamoe.mirai.event.events.MemberJoinRequestEvent
import net.mamoe.mirai.event.events.NewFriendRequestEvent
import net.mamoe.mirai.utils.MiraiExperimentalAPI import net.mamoe.mirai.utils.MiraiExperimentalAPI
import net.mamoe.mirai.utils.WeakRef import net.mamoe.mirai.utils.WeakRef
...@@ -113,4 +116,26 @@ interface LowLevelBotAPIAccessor { ...@@ -113,4 +116,26 @@ interface LowLevelBotAPIAccessor {
@LowLevelAPI @LowLevelAPI
@MiraiExperimentalAPI @MiraiExperimentalAPI
suspend fun _lowLevelGetGroupActiveData(groupId: Long): GroupActiveData suspend fun _lowLevelGetGroupActiveData(groupId: Long): GroupActiveData
/**
* 处理一个账号请求添加机器人为好友的事件
*/
@LowLevelAPI
@MiraiExperimentalAPI
suspend fun _lowLevelSolveNewFriendRequestEvent(eventId: Long, fromId: Long, fromNick: String, accept: Boolean, blackList: Boolean)
/**
* 处理被邀请加入一个群请求事件
*/
@LowLevelAPI
@MiraiExperimentalAPI
suspend fun _lowLevelSolveBotInvitedJoinGroupRequestEvent(eventId: Long, invitorId: Long, groupId: Long, accept: Boolean)
/**
* 处理账号请求加入群事件
*/
@LowLevelAPI
@MiraiExperimentalAPI
suspend fun _lowLevelSolveMemberJoinRequestEvent(eventId: Long, fromId: Long, fromNick: String, groupId: Long, accept: Boolean?, blackList: Boolean)
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment