mirror of
https://github.com/mamoe/mirai.git
synced 2025-04-25 04:50:26 +08:00
Syncing when joined group by other client & Add missed invitor in invite event (#804)
* Introduce UserInfo and change uin to id * Stranger api: List and asStranger * Stranger api: Events * Stranger api: MessageDSL and MessageSource * Update docs * Improve LoginSolver fix project-mirai/mirai-login-solver-selenium#4 * Improve SeleniumLoginSolver loading * Fix MessageChain.fragmented * 2.0-M2-1 * Stranger api change: StrangerRelationChangeEvent * Stranger impl: list and asStranger * Stranger impl: get stranger list and del stranger protocol * Stranger impl: add stranger protocol * Stranger impl: MessageSource refactor and sending&receiving message * Stranger impl: Dropping long message support (server rejected) * Stranger impl: sending stranger message when member is stranger * Fix wrong key Co-authored-by: Him188 <Him188@mamoe.net> * Add @LowLevelApi Co-authored-by: Him188 <Him188@mamoe.net> * Remove redundant val modifier * Replace nudge if statement to when statement * Move list seq to QQAndroidClient * Replace id with uin in UserInfo and fix build error * Using by lazy in asStranger * Fix wrong wordings * Fix wrong wordings in uploading image * Fix nudge * Fix #478, sync other client join group * Change to NormalMember and update toString method Co-authored-by: Karlatemp <karlatemp@vip.qq.com> * Launch on bot network scope Co-authored-by: Him188 <Him188@mamoe.net> * Fix TarsDecoder fix #762 * Fix TarsInput.skipField Co-authored-by: Him188 <Him188@mamoe.net> Co-authored-by: Karlatemp <karlatemp@vip.qq.com>
This commit is contained in:
parent
d0fd05d4d5
commit
7d43ab20f8
mirai-core-api/src/commonMain/kotlin/event/events
mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive
@ -251,9 +251,13 @@ public sealed class MemberJoinEvent(
|
||||
* 被邀请加入群
|
||||
*/
|
||||
public data class Invite @MiraiInternalApi constructor(
|
||||
public override val member: NormalMember
|
||||
public override val member: NormalMember,
|
||||
/**
|
||||
* 邀请者
|
||||
*/
|
||||
public val invitor: NormalMember
|
||||
) : MemberJoinEvent(member) {
|
||||
public override fun toString(): String = "MemberJoinEvent.Invite(member=${member.id})"
|
||||
public override fun toString(): String = "MemberJoinEvent.Invite(member=${member.id}, invitor=${invitor.id})"
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -21,6 +21,7 @@ import kotlinx.io.core.ByteReadPacket
|
||||
import kotlinx.io.core.discardExact
|
||||
import kotlinx.io.core.readUByte
|
||||
import kotlinx.io.core.readUShort
|
||||
import kotlinx.io.core.*
|
||||
import net.mamoe.mirai.Mirai
|
||||
import net.mamoe.mirai.contact.Group
|
||||
import net.mamoe.mirai.contact.MemberPermission
|
||||
@ -47,7 +48,6 @@ import net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacketFactory
|
||||
import net.mamoe.mirai.internal.network.protocol.packet.buildOutgoingUniPacket
|
||||
import net.mamoe.mirai.internal.network.protocol.packet.chat.GroupInfoImpl
|
||||
import net.mamoe.mirai.internal.network.protocol.packet.chat.NewContact
|
||||
import net.mamoe.mirai.internal.network.protocol.packet.chat.toLongUnsigned
|
||||
import net.mamoe.mirai.internal.network.protocol.packet.list.FriendList
|
||||
import net.mamoe.mirai.internal.utils.*
|
||||
import net.mamoe.mirai.internal.utils.io.serialization.loadAs
|
||||
@ -248,48 +248,57 @@ private fun MsgComm.Msg.getNewMemberInfo(): MemberInfo {
|
||||
internal suspend fun MsgComm.Msg.transform(bot: QQAndroidBot): Packet? {
|
||||
when (msgHead.msgType) {
|
||||
33 -> bot.groupListModifyLock.withLock {
|
||||
|
||||
if (msgHead.authUin == bot.id) {
|
||||
// 邀请入群
|
||||
return bot.createGroupForBot(msgHead.fromUin)?.let { group ->
|
||||
// package: 27 0B 60 E7 01 CA CC 69 8B 83 44 71 47 90 06 B9 DC C0 ED D4 B1 00 30 33 44 30 42 38 46 30 39 37 32 38 35 43 34 31 38 30 33 36 41 34 36 31 36 31 35 32 37 38 46 46 43 30 41 38 30 36 30 36 45 38 31 43 39 41 34 38 37
|
||||
// package: groupUin + 01 CA CC 69 8B 83 + invitorUin + length(06) + string + magicKey
|
||||
val invitorUin = msgBody.msgContent.sliceArray(10..13).toInt().toLongUnsigned()
|
||||
val invitor = group[invitorUin] ?: return@let null
|
||||
BotJoinGroupEvent.Invite(invitor)
|
||||
msgBody.msgContent.read {
|
||||
val groupUin = readUInt().toLong()
|
||||
val group = bot.getGroupByUinOrNull(groupUin) ?: bot.createGroupForBot(groupUin) ?: return null
|
||||
discardExact(1)
|
||||
val joinedMemberUin = readUInt().toLong()
|
||||
val joinType = readByte().toInt()
|
||||
val invitorUin = readUInt().toLong()
|
||||
return when (joinType) {
|
||||
//邀请加入
|
||||
-125, 3 -> {
|
||||
val invitor = if (invitorUin == bot.id) {
|
||||
group.botAsMember
|
||||
} else {
|
||||
group[invitorUin]
|
||||
} ?: return null
|
||||
if (joinedMemberUin == bot.id) {
|
||||
BotJoinGroupEvent.Invite(invitor)
|
||||
} else {
|
||||
MemberJoinEvent.Invite(
|
||||
group.newMember(getNewMemberInfo()).cast<NormalMember>()
|
||||
.also { group.members.delegate.add(it) }, invitor
|
||||
)
|
||||
}
|
||||
}
|
||||
//通过群员分享的二维码/直接加入
|
||||
-126, 2 -> {
|
||||
if (joinedMemberUin == bot.id) {
|
||||
BotJoinGroupEvent.Active(group)
|
||||
} else {
|
||||
MemberJoinEvent.Active(
|
||||
group.newMember(getNewMemberInfo()).cast<NormalMember>()
|
||||
.also { group.members.delegate.add(it) })
|
||||
}
|
||||
}
|
||||
//忽略
|
||||
else -> {
|
||||
null
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
||||
// 成员申请入群
|
||||
val group = bot.getGroupByUinOrNull(msgHead.fromUin)
|
||||
?: return null
|
||||
|
||||
// 主动入群, 直接加入: msgContent=27 0B 60 E7 01 76 E4 B8 DD 82 3E 03 3F A2 06 B4 B4 BD A8 D5 DF 00 30 42 39 41 30 33 45 38 34 30 39 34 42 46 30 45 32 45 38 42 31 43 43 41 34 32 42 38 42 44 42 35 34 44 42 31 44 32 32 30 46 30 38 39 46 46 35 41 38
|
||||
// 主动直接加入 27 0B 60 E7 01 76 E4 B8 DD 82 3E 03 3F A2 06 B4 B4 BD A8 D5 DF 00 30 33 30 45 38 42 31 33 46 41 41 31 33 46 38 31 35 34 41 38 33 32 37 31 43 34 34 38 35 33 35 46 45 31 38 32 43 39 42 43 46 46 32 44 39 39 46 41 37
|
||||
|
||||
// 有人被邀请(经过同意后)加入 27 0B 60 E7 01 76 E4 B8 DD 83 3E 03 3F A2 06 B4 B4 BD A8 D5 DF 00 30 34 30 34 38 32 33 38 35 37 41 37 38 46 33 45 37 35 38 42 39 38 46 43 45 44 43 32 41 30 31 36 36 30 34 31 36 39 35 39 30 38 39 30 39 45 31 34 34
|
||||
// 搜索到群, 直接加入 27 0B 60 E7 01 07 6E 47 BA 82 3E 03 3F A2 06 B4 B4 BD A8 D5 DF 00 30 32 30 39 39 42 39 41 46 32 39 41 35 42 33 46 34 32 30 44 36 44 36 39 35 44 38 45 34 35 30 46 30 45 30 38 45 31 41 39 42 46 46 45 32 30 32 34 35
|
||||
|
||||
// msgBody.msgContent.soutv("33类型的content")
|
||||
|
||||
if (group.members.contains(msgHead.authUin)) {
|
||||
return null
|
||||
}
|
||||
|
||||
if (msgBody.msgContent.read {
|
||||
discardExact(9)
|
||||
readByte().toInt().and(0xff)
|
||||
} == 0x83) {
|
||||
return MemberJoinEvent.Invite(group.newMember(getNewMemberInfo())
|
||||
.cast<NormalMember>()
|
||||
.also { group.members.delegate.add(it) })
|
||||
}
|
||||
|
||||
return MemberJoinEvent.Active(group.newMember(getNewMemberInfo())
|
||||
.cast<NormalMember>()
|
||||
.also { group.members.delegate.add(it) })
|
||||
}
|
||||
}
|
||||
// 邀请入群
|
||||
// package: 27 0B 60 E7 01 CA CC 69 8B 83 44 71 47 90 06 B9 DC C0 ED D4 B1 00 30 33 44 30 42 38 46 30 39 37 32 38 35 43 34 31 38 30 33 36 41 34 36 31 36 31 35 32 37 38 46 46 43 30 41 38 30 36 30 36 45 38 31 43 39 41 34 38 37
|
||||
// package: groupUin + 01 CA CC 69 8B 83 + invitorUin + length(06) + string + magicKey
|
||||
|
||||
|
||||
// 主动入群, 直接加入: msgContent=27 0B 60 E7 01 76 E4 B8 DD 82 3E 03 3F A2 06 B4 B4 BD A8 D5 DF 00 30 42 39 41 30 33 45 38 34 30 39 34 42 46 30 45 32 45 38 42 31 43 43 41 34 32 42 38 42 44 42 35 34 44 42 31 44 32 32 30 46 30 38 39 46 46 35 41 38
|
||||
// 主动直接加入 27 0B 60 E7 01 76 E4 B8 DD 82 3E 03 3F A2 06 B4 B4 BD A8 D5 DF 00 30 33 30 45 38 42 31 33 46 41 41 31 33 46 38 31 35 34 41 38 33 32 37 31 43 34 34 38 35 33 35 46 45 31 38 32 43 39 42 43 46 46 32 44 39 39 46 41 37
|
||||
|
||||
// 有人被邀请(经过同意后)加入 27 0B 60 E7 01 76 E4 B8 DD 83 3E 03 3F A2 06 B4 B4 BD A8 D5 DF 00 30 34 30 34 38 32 33 38 35 37 41 37 38 46 33 45 37 35 38 42 39 38 46 43 45 44 43 32 41 30 31 36 36 30 34 31 36 39 35 39 30 38 39 30 39 45 31 34 34
|
||||
// 搜索到群, 直接加入 27 0B 60 E7 01 07 6E 47 BA 82 3E 03 3F A2 06 B4 B4 BD A8 D5 DF 00 30 32 30 39 39 42 39 41 46 32 39 41 35 42 33 46 34 32 30 44 36 44 36 39 35 44 38 45 34 35 30 46 30 45 30 38 45 31 41 39 42 46 46 45 32 30 32 34 35
|
||||
}
|
||||
|
||||
34 -> { // 与 33 重复
|
||||
return null
|
||||
@ -301,7 +310,6 @@ internal suspend fun MsgComm.Msg.transform(bot: QQAndroidBot): Packet? {
|
||||
}
|
||||
|
||||
85 -> bot.groupListModifyLock.withLock { // 其他客户端入群
|
||||
|
||||
// msgHead.authUin: 处理人
|
||||
|
||||
return if (msgHead.toUin == bot.id) {
|
||||
|
@ -15,6 +15,12 @@
|
||||
package net.mamoe.mirai.internal.network.protocol.packet.chat.receive
|
||||
|
||||
import kotlinx.io.core.*
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.sync.withLock
|
||||
import kotlinx.io.core.ByteReadPacket
|
||||
import kotlinx.io.core.discardExact
|
||||
import kotlinx.io.core.readBytes
|
||||
import kotlinx.io.core.readUInt
|
||||
import kotlinx.serialization.Serializable
|
||||
import kotlinx.serialization.protobuf.ProtoNumber
|
||||
import net.mamoe.mirai.JavaFriendlyAPI
|
||||
@ -22,6 +28,7 @@ import net.mamoe.mirai.Mirai
|
||||
import net.mamoe.mirai.contact.*
|
||||
import net.mamoe.mirai.data.FriendInfoImpl
|
||||
import net.mamoe.mirai.data.GroupHonorType
|
||||
import net.mamoe.mirai.event.broadcast
|
||||
import net.mamoe.mirai.event.events.*
|
||||
import net.mamoe.mirai.internal.QQAndroidBot
|
||||
import net.mamoe.mirai.internal.contact.*
|
||||
@ -515,6 +522,17 @@ internal object Transformers528 : Map<Long, Lambda528> by mapOf(
|
||||
}
|
||||
msg.msgFriendMsgSync != null -> {
|
||||
|
||||
}
|
||||
msg.msgGroupMsgSync != null -> {
|
||||
when (msg.msgGroupMsgSync.processflag) {
|
||||
1, 2 -> bot.network.launch {
|
||||
bot.groupListModifyLock.withLock {
|
||||
bot.createGroupForBot(msg.msgGroupMsgSync.grpCode)?.let {
|
||||
BotJoinGroupEvent.Active(it).broadcast()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else -> {
|
||||
bot.network.logger.debug { "OnlinePush528 0x44L: " + msg._miraiContentToString() }
|
||||
|
Loading…
Reference in New Issue
Block a user