Commit 3c786cb0 authored by Him188's avatar Him188

Support `MemberJoinEvent.Active`, also fix #164

parent 418fb439
...@@ -49,6 +49,7 @@ import net.mamoe.mirai.qqandroid.network.protocol.packet.* ...@@ -49,6 +49,7 @@ import net.mamoe.mirai.qqandroid.network.protocol.packet.*
import net.mamoe.mirai.qqandroid.network.protocol.packet.chat.GroupInfoImpl import net.mamoe.mirai.qqandroid.network.protocol.packet.chat.GroupInfoImpl
import net.mamoe.mirai.qqandroid.network.protocol.packet.chat.NewContact import net.mamoe.mirai.qqandroid.network.protocol.packet.chat.NewContact
import net.mamoe.mirai.qqandroid.network.protocol.packet.list.FriendList import net.mamoe.mirai.qqandroid.network.protocol.packet.list.FriendList
import net.mamoe.mirai.qqandroid.utils._miraiContentToString
import net.mamoe.mirai.qqandroid.utils.io.serialization.decodeUniPacket import net.mamoe.mirai.qqandroid.utils.io.serialization.decodeUniPacket
import net.mamoe.mirai.qqandroid.utils.io.serialization.readProtoBuf import net.mamoe.mirai.qqandroid.utils.io.serialization.readProtoBuf
import net.mamoe.mirai.qqandroid.utils.io.serialization.toByteArray import net.mamoe.mirai.qqandroid.utils.io.serialization.toByteArray
...@@ -56,6 +57,7 @@ import net.mamoe.mirai.qqandroid.utils.io.serialization.writeProtoBuf ...@@ -56,6 +57,7 @@ import net.mamoe.mirai.qqandroid.utils.io.serialization.writeProtoBuf
import net.mamoe.mirai.utils.MiraiExperimentalAPI import net.mamoe.mirai.utils.MiraiExperimentalAPI
import net.mamoe.mirai.utils.MiraiInternalAPI import net.mamoe.mirai.utils.MiraiInternalAPI
import net.mamoe.mirai.utils.currentTimeSeconds import net.mamoe.mirai.utils.currentTimeSeconds
import net.mamoe.mirai.utils.debug
import kotlin.math.absoluteValue import kotlin.math.absoluteValue
import kotlin.random.Random import kotlin.random.Random
...@@ -70,6 +72,7 @@ internal class MessageSvc { ...@@ -70,6 +72,7 @@ internal class MessageSvc {
} }
override suspend fun QQAndroidBot.handle(packet: RequestPushNotify, sequenceId: Int): OutgoingPacket? { override suspend fun QQAndroidBot.handle(packet: RequestPushNotify, sequenceId: Int): OutgoingPacket? {
println(packet._miraiContentToString())
network.run { network.run {
return PbGetMsg( return PbGetMsg(
client, client,
...@@ -134,6 +137,54 @@ internal class MessageSvc { ...@@ -134,6 +137,54 @@ internal class MessageSvc {
object EmptyResponse : GetMsgSuccess(emptyList()) object EmptyResponse : GetMsgSuccess(emptyList())
private suspend fun MsgComm.Msg.getNewGroup(bot: QQAndroidBot): Group {
val troopNum = bot.network.run {
FriendList.GetTroopListSimplify(bot.client)
.sendAndExpect<FriendList.GetTroopListSimplify.Response>(retry = 2)
}.groups.first { it.groupUin == msgHead.fromUin }
@Suppress("DuplicatedCode")
return GroupImpl(
bot = bot,
coroutineContext = bot.coroutineContext,
id = Group.calculateGroupCodeByGroupUin(msgHead.fromUin),
groupInfo = bot._lowLevelQueryGroupInfo(troopNum.groupCode).apply {
this as GroupInfoImpl
if (this.delegate.groupName == null) {
this.delegate.groupName = troopNum.groupName
}
if (this.delegate.groupMemo == null) {
this.delegate.groupMemo = troopNum.groupMemo
}
if (this.delegate.groupUin == null) {
this.delegate.groupUin = troopNum.groupUin
}
this.delegate.groupCode = troopNum.groupCode
},
members = bot._lowLevelQueryGroupMemberList(
troopNum.groupUin,
troopNum.groupCode,
troopNum.dwGroupOwnerUin
)
)
}
private fun MsgComm.Msg.getNewMemberInfo(): MemberInfo {
return 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() = msgHead.authUin
override val nick: String = msgHead.authNick.takeIf { it.isNotEmpty() }
?: msgHead.fromNick
}
}
@OptIn(MiraiInternalAPI::class, MiraiExperimentalAPI::class, FlowPreview::class, LowLevelAPI::class) @OptIn(MiraiInternalAPI::class, MiraiExperimentalAPI::class, FlowPreview::class, LowLevelAPI::class)
override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Response { override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Response {
// 00 00 01 0F 08 00 12 00 1A 34 08 FF C1 C4 F1 05 10 FF C1 C4 F1 05 18 E6 ED B9 C3 02 20 89 FE BE A4 06 28 8A CA 91 D1 0C 48 9B A5 BD 9B 0A 58 DE 9D 99 F8 08 60 1D 68 FF C1 C4 F1 05 70 00 20 02 2A 9D 01 08 F3 C1 C4 F1 05 10 A2 FF 8C F0 03 18 01 22 8A 01 0A 2A 08 A2 FF 8C F0 03 10 DD F1 92 B7 07 18 A6 01 20 0B 28 AE F9 01 30 F4 C1 C4 F1 05 38 A7 E3 D8 D4 84 80 80 80 01 B8 01 CD B5 01 12 08 08 01 10 00 18 00 20 00 1A 52 0A 50 0A 27 08 00 10 F4 C1 C4 F1 05 18 A7 E3 D8 D4 04 20 00 28 0C 30 00 38 86 01 40 22 4A 0C E5 BE AE E8 BD AF E9 9B 85 E9 BB 91 12 08 0A 06 0A 04 4E 4D 53 4C 12 15 AA 02 12 9A 01 0F 80 01 01 C8 01 00 F0 01 00 F8 01 00 90 02 00 12 04 4A 02 08 00 30 01 2A 15 08 97 A2 C1 F1 05 10 95 A6 F5 E5 0C 18 01 30 01 40 01 48 81 01 2A 10 08 D3 F7 B5 F1 05 10 DD F1 92 B7 07 18 01 30 01 38 00 42 00 48 00 // 00 00 01 0F 08 00 12 00 1A 34 08 FF C1 C4 F1 05 10 FF C1 C4 F1 05 18 E6 ED B9 C3 02 20 89 FE BE A4 06 28 8A CA 91 D1 0C 48 9B A5 BD 9B 0A 58 DE 9D 99 F8 08 60 1D 68 FF C1 C4 F1 05 70 00 20 02 2A 9D 01 08 F3 C1 C4 F1 05 10 A2 FF 8C F0 03 18 01 22 8A 01 0A 2A 08 A2 FF 8C F0 03 10 DD F1 92 B7 07 18 A6 01 20 0B 28 AE F9 01 30 F4 C1 C4 F1 05 38 A7 E3 D8 D4 84 80 80 80 01 B8 01 CD B5 01 12 08 08 01 10 00 18 00 20 00 1A 52 0A 50 0A 27 08 00 10 F4 C1 C4 F1 05 18 A7 E3 D8 D4 04 20 00 28 0C 30 00 38 86 01 40 22 4A 0C E5 BE AE E8 BD AF E9 9B 85 E9 BB 91 12 08 0A 06 0A 04 4E 4D 53 4C 12 15 AA 02 12 9A 01 0F 80 01 01 C8 01 00 F0 01 00 F8 01 00 90 02 00 12 04 4A 02 08 00 30 01 2A 15 08 97 A2 C1 F1 05 10 95 A6 F5 E5 0C 18 01 30 01 40 01 48 81 01 2A 10 08 D3 F7 B5 F1 05 10 DD F1 92 B7 07 18 01 30 01 38 00 42 00 48 00
...@@ -158,7 +209,7 @@ internal class MessageSvc { ...@@ -158,7 +209,7 @@ internal class MessageSvc {
.flatMapConcat { it.msg!!.asFlow() } .flatMapConcat { it.msg!!.asFlow() }
.mapNotNull<MsgComm.Msg, Packet> { msg -> .mapNotNull<MsgComm.Msg, Packet> { msg ->
when (msg.msgHead.msgType) { when (msg.msgHead.msgType) {
33 -> { 33 -> { // 邀请入群
val group = bot.getGroupByUinOrNull(msg.msgHead.fromUin) val group = bot.getGroupByUinOrNull(msg.msgHead.fromUin)
if (msg.msgHead.authUin == bot.id) { if (msg.msgHead.authUin == bot.id) {
if (group != null) { if (group != null) {
...@@ -166,40 +217,7 @@ internal class MessageSvc { ...@@ -166,40 +217,7 @@ internal class MessageSvc {
} }
// 新群 // 新群
val troopNum = bot.network.run { val newGroup = msg.getNewGroup(bot)
FriendList.GetTroopListSimplify(bot.client)
.sendAndExpect<FriendList.GetTroopListSimplify.Response>(retry = 2)
}.groups.first { it.groupUin == msg.msgHead.fromUin }
@Suppress("DuplicatedCode")
val newGroup = GroupImpl(
bot = bot,
coroutineContext = bot.coroutineContext,
id = Group.calculateGroupCodeByGroupUin(msg.msgHead.fromUin),
groupInfo = bot._lowLevelQueryGroupInfo(troopNum.groupCode).apply {
this as GroupInfoImpl
if (this.delegate.groupName == null) {
this.delegate.groupName = troopNum.groupName
}
if (this.delegate.groupMemo == null) {
this.delegate.groupMemo = troopNum.groupMemo
}
if (this.delegate.groupUin == null) {
this.delegate.groupUin = troopNum.groupUin
}
this.delegate.groupCode = troopNum.groupCode
},
members = bot._lowLevelQueryGroupMemberList(
troopNum.groupUin,
troopNum.groupCode,
troopNum.dwGroupOwnerUin
)
)
bot.groups.delegate.addLast(newGroup) bot.groups.delegate.addLast(newGroup)
return@mapNotNull BotJoinGroupEvent(newGroup) return@mapNotNull BotJoinGroupEvent(newGroup)
} else { } else {
...@@ -208,15 +226,8 @@ internal class MessageSvc { ...@@ -208,15 +226,8 @@ internal class MessageSvc {
if (group.members.contains(msg.msgHead.authUin)) { if (group.members.contains(msg.msgHead.authUin)) {
return@mapNotNull null return@mapNotNull null
} }
return@mapNotNull MemberJoinEvent(group.newMember(object : MemberInfo { return@mapNotNull MemberJoinEvent.Invite(group.newMember(msg.getNewMemberInfo())
override val nameCard: String get() = "" .also { group.members.delegate.addLast(it) })
override val permission: MemberPermission get() = MemberPermission.MEMBER
override val specialTitle: String get() = ""
override val muteTimestamp: Int get() = 0
override val uin: Long get() = msg.msgHead.authUin
override val nick: String = msg.msgHead.authNick.takeIf { it.isNotEmpty() }
?: msg.msgHead.fromNick
}).also { group.members.delegate.addLast(it) })
} }
} }
166 -> { 166 -> {
...@@ -254,7 +265,10 @@ internal class MessageSvc { ...@@ -254,7 +265,10 @@ internal class MessageSvc {
if (member.lastMessageSequence.compareAndSet(instant, msg.msgHead.msgSeq)) { if (member.lastMessageSequence.compareAndSet(instant, msg.msgHead.msgSeq)) {
return@mapNotNull TempMessage( return@mapNotNull TempMessage(
member, member,
msg.toMessageChain(bot, groupIdOrZero = 0, onlineSource = true, isTemp = true) msg.toMessageChain(bot,
groupIdOrZero = 0,
onlineSource = true,
isTemp = true)
) )
} }
} else return@mapNotNull null } else return@mapNotNull null
...@@ -278,7 +292,27 @@ internal class MessageSvc { ...@@ -278,7 +292,27 @@ internal class MessageSvc {
} }
return@mapNotNull null return@mapNotNull null
} }
else -> return@mapNotNull null 732 -> { // ?
// 27 0B 60 E7 0C 01 3E 03 3F A2 5E 90 60 E2 00 01 44 71 47 90 00 00 02 58
bot.network.logger.debug { "unknown PbGetMsg type ${msg.msgHead.msgType}: ${msg._miraiContentToString()}" }
return@mapNotNull null
}
34 -> { // 主动入群
// 27 0B 60 E7 01 44 71 47 90 03 3E 03 3F A2 06 B4 B4 BD A8 D5 DF 00 30 36 42 35 35 46 45 32 45 35 36 43 45 45 44 30 38 30 35 31 41 35 42 37 36 39 35 34 45 30 46 43 43 36 36 45 44 43 46 45 43 42 39 33 41 41 44 32 32
val group = bot.getGroupByUinOrNull(msg.msgHead.fromUin)
group ?: return@mapNotNull null
if (group.members.contains(msg.msgHead.authUin)) {
return@mapNotNull null
}
return@mapNotNull MemberJoinEvent.Active(group.newMember(msg.getNewMemberInfo())
.also { group.members.delegate.addLast(it) })
}
else -> {
bot.network.logger.debug { "unknown PbGetMsg type ${msg.msgHead.msgType}: ${msg._miraiContentToString()}" }
return@mapNotNull null
}
} }
} }
......
...@@ -20,6 +20,7 @@ import net.mamoe.mirai.event.Event ...@@ -20,6 +20,7 @@ import net.mamoe.mirai.event.Event
import net.mamoe.mirai.event.broadcast import net.mamoe.mirai.event.broadcast
import net.mamoe.mirai.event.events.* import net.mamoe.mirai.event.events.*
import net.mamoe.mirai.getFriendOrNull import net.mamoe.mirai.getFriendOrNull
import net.mamoe.mirai.getGroupOrNull
import net.mamoe.mirai.message.GroupMessage import net.mamoe.mirai.message.GroupMessage
import net.mamoe.mirai.qqandroid.QQAndroidBot import net.mamoe.mirai.qqandroid.QQAndroidBot
import net.mamoe.mirai.qqandroid.contact.GroupImpl import net.mamoe.mirai.qqandroid.contact.GroupImpl
...@@ -43,6 +44,7 @@ import net.mamoe.mirai.qqandroid.network.protocol.packet.buildResponseUniPacket ...@@ -43,6 +44,7 @@ import net.mamoe.mirai.qqandroid.network.protocol.packet.buildResponseUniPacket
import net.mamoe.mirai.qqandroid.utils._miraiContentToString import net.mamoe.mirai.qqandroid.utils._miraiContentToString
import net.mamoe.mirai.qqandroid.utils.encodeToString import net.mamoe.mirai.qqandroid.utils.encodeToString
import net.mamoe.mirai.qqandroid.utils.io.JceStruct import net.mamoe.mirai.qqandroid.utils.io.JceStruct
import net.mamoe.mirai.qqandroid.utils.io.ProtoBuf
import net.mamoe.mirai.qqandroid.utils.io.readString import net.mamoe.mirai.qqandroid.utils.io.readString
import net.mamoe.mirai.qqandroid.utils.io.serialization.* import net.mamoe.mirai.qqandroid.utils.io.serialization.*
import net.mamoe.mirai.qqandroid.utils.io.serialization.jce.JceId import net.mamoe.mirai.qqandroid.utils.io.serialization.jce.JceId
...@@ -386,6 +388,7 @@ internal class OnlinePush { ...@@ -386,6 +388,7 @@ internal class OnlinePush {
*/ */
@OptIn(LowLevelAPI::class, MiraiInternalAPI::class) @OptIn(LowLevelAPI::class, MiraiInternalAPI::class)
object Transformers528 : Map<Long, MsgType0x210.(QQAndroidBot) -> Sequence<Packet>> by mapOf( object Transformers528 : Map<Long, MsgType0x210.(QQAndroidBot) -> Sequence<Packet>> by mapOf(
// 新好友
0xB3L to lambda528 { bot -> 0xB3L to lambda528 { bot ->
// 08 01 12 52 08 A2 FF 8C F0 03 10 00 1D 15 3D 90 5E 22 2E E6 88 91 E4 BB AC E5 B7 B2 E7 BB 8F E6 98 AF E5 A5 BD E5 8F 8B E5 95 A6 EF BC 8C E4 B8 80 E8 B5 B7 E6 9D A5 E8 81 8A E5 A4 A9 E5 90 A7 21 2A 09 48 69 6D 31 38 38 6D 6F 65 30 07 38 03 48 DD F1 92 B7 07 // 08 01 12 52 08 A2 FF 8C F0 03 10 00 1D 15 3D 90 5E 22 2E E6 88 91 E4 BB AC E5 B7 B2 E7 BB 8F E6 98 AF E5 A5 BD E5 8F 8B E5 95 A6 EF BC 8C E4 B8 80 E8 B5 B7 E6 9D A5 E8 81 8A E5 A4 A9 E5 90 A7 21 2A 09 48 69 6D 31 38 38 6D 6F 65 30 07 38 03 48 DD F1 92 B7 07
val body = vProtobuf.loadAs(Submsgtype0xb3.SubMsgType0xb3.MsgBody.serializer()) val body = vProtobuf.loadAs(Submsgtype0xb3.SubMsgType0xb3.MsgBody.serializer())
...@@ -410,9 +413,22 @@ internal class OnlinePush { ...@@ -410,9 +413,22 @@ internal class OnlinePush {
} }
} }
bot.network.logger.debug { msg._miraiContentToString() } bot.network.logger.debug { "OnlinePush528 0x44L: " + msg._miraiContentToString() }
return@lambda528 emptySequence() return@lambda528 emptySequence()
}, },
// bot 被踢
0xD4L to lambda528 { bot ->
@Serializable
data class SubD4(
val uin: Long
) : ProtoBuf
val uin = vProtobuf.loadAs(SubD4.serializer()).uin
val group = bot.getGroupByUinOrNull(uin) ?: bot.getGroupOrNull(uin)
// 08 E7 C1 AD B8 02
return@lambda528 group?.let { sequenceOf(BotKickEvent(group)) } ?: emptySequence()
},
// ModFriendRemark, DelFriend
0x27L to lambda528 { bot -> 0x27L to lambda528 { bot ->
fun Submsgtype0x27.SubMsgType0x27.ModFriendRemark.transform(bot: QQAndroidBot): Sequence<Packet> { fun Submsgtype0x27.SubMsgType0x27.ModFriendRemark.transform(bot: QQAndroidBot): Sequence<Packet> {
return this.msgFrdRmk?.asSequence()?.mapNotNull { return this.msgFrdRmk?.asSequence()?.mapNotNull {
......
...@@ -209,6 +209,16 @@ sealed class ImageUploadEvent : BotEvent, BotActiveEvent, AbstractCancellableEve ...@@ -209,6 +209,16 @@ sealed class ImageUploadEvent : BotEvent, BotActiveEvent, AbstractCancellableEve
// region 群 // region 群
/**
* 机器人被踢出群. 在事件广播前 [Bot.groups] 就已删除这个群.
*/
@SinceMirai("0.36.0")
data class BotKickEvent(
val group: Group
) : BotEvent, Packet {
override val bot: Bot get() = group.bot
}
/** /**
* Bot 在群里的权限被改变. 操作人一定是群主 * Bot 在群里的权限被改变. 操作人一定是群主
*/ */
...@@ -352,7 +362,19 @@ data class GroupAllowMemberInviteEvent( ...@@ -352,7 +362,19 @@ data class GroupAllowMemberInviteEvent(
/** /**
* 成员加入群的事件 * 成员加入群的事件
*/ */
data class MemberJoinEvent(override val member: Member) : GroupMemberEvent, BotPassiveEvent, Packet sealed class MemberJoinEvent(override val member: Member) : GroupMemberEvent, BotPassiveEvent, Packet {
/**
* 被邀请加入群
*/
@SinceMirai("0.36.0")
data class Invite(override val member: Member) : MemberJoinEvent(member)
/**
* 成员主动加入群
*/
@SinceMirai("0.36.0")
data class Active(override val member: Member) : MemberJoinEvent(member)
}
/** /**
* 成员离开群的事件. 在事件广播前成员就已经从 [Group.members] 中删除 * 成员离开群的事件. 在事件广播前成员就已经从 [Group.members] 中删除
......
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