mirror of
https://github.com/mamoe/mirai.git
synced 2025-02-14 20:30:12 +08:00
parent
2eaa13a7c2
commit
ce06ce85f0
@ -165,6 +165,8 @@ internal open class QQAndroidClient(
|
|||||||
|
|
||||||
class MessageSvcSyncData {
|
class MessageSvcSyncData {
|
||||||
val firstNotify: AtomicBoolean = atomic(true)
|
val firstNotify: AtomicBoolean = atomic(true)
|
||||||
|
var latestMsgNewGroupTime: Long = currentTimeSeconds()
|
||||||
|
var latestMsgNewFriendTime: Long = currentTimeSeconds()
|
||||||
|
|
||||||
@Volatile
|
@Volatile
|
||||||
var syncCookie: ByteArray? = null
|
var syncCookie: ByteArray? = null
|
||||||
|
@ -19,6 +19,7 @@ import net.mamoe.mirai.event.events.MemberJoinRequestEvent
|
|||||||
import net.mamoe.mirai.event.events.NewFriendRequestEvent
|
import net.mamoe.mirai.event.events.NewFriendRequestEvent
|
||||||
import net.mamoe.mirai.internal.QQAndroidBot
|
import net.mamoe.mirai.internal.QQAndroidBot
|
||||||
import net.mamoe.mirai.internal.message.contextualBugReportException
|
import net.mamoe.mirai.internal.message.contextualBugReportException
|
||||||
|
import net.mamoe.mirai.internal.network.MultiPacketByIterable
|
||||||
import net.mamoe.mirai.internal.network.Packet
|
import net.mamoe.mirai.internal.network.Packet
|
||||||
import net.mamoe.mirai.internal.network.QQAndroidClient
|
import net.mamoe.mirai.internal.network.QQAndroidClient
|
||||||
import net.mamoe.mirai.internal.network.protocol.data.proto.Structmsg
|
import net.mamoe.mirai.internal.network.protocol.data.proto.Structmsg
|
||||||
@ -27,11 +28,12 @@ import net.mamoe.mirai.internal.network.protocol.packet.buildOutgoingUniPacket
|
|||||||
import net.mamoe.mirai.internal.utils._miraiContentToString
|
import net.mamoe.mirai.internal.utils._miraiContentToString
|
||||||
import net.mamoe.mirai.internal.utils.io.serialization.loadAs
|
import net.mamoe.mirai.internal.utils.io.serialization.loadAs
|
||||||
import net.mamoe.mirai.internal.utils.io.serialization.writeProtoBuf
|
import net.mamoe.mirai.internal.utils.io.serialization.writeProtoBuf
|
||||||
|
import net.mamoe.mirai.utils.currentTimeSeconds
|
||||||
|
|
||||||
internal class NewContact {
|
internal class NewContact {
|
||||||
|
|
||||||
internal object SystemMsgNewFriend :
|
internal object SystemMsgNewFriend :
|
||||||
OutgoingPacketFactory<NewFriendRequestEvent?>("ProfileService.Pb.ReqSystemMsgNew.Friend") {
|
OutgoingPacketFactory<Packet?>("ProfileService.Pb.ReqSystemMsgNew.Friend") {
|
||||||
|
|
||||||
operator fun invoke(client: QQAndroidClient) = buildOutgoingUniPacket(client) {
|
operator fun invoke(client: QQAndroidClient) = buildOutgoingUniPacket(client) {
|
||||||
writeProtoBuf(
|
writeProtoBuf(
|
||||||
@ -55,18 +57,29 @@ internal class NewContact {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): NewFriendRequestEvent? {
|
override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Packet? {
|
||||||
readBytes().loadAs(Structmsg.RspSystemMsgNew.serializer()).run {
|
readBytes().loadAs(Structmsg.RspSystemMsgNew.serializer()).run {
|
||||||
val struct = friendmsgs.firstOrNull()// 会有重复且无法过滤, 不要用 map
|
return friendmsgs.filter {
|
||||||
return struct?.msg?.run {
|
it.msgTime > bot.client.syncingController.latestMsgNewFriendTime
|
||||||
NewFriendRequestEvent(
|
}.mapNotNull { struct ->
|
||||||
bot,
|
struct.msg?.run {
|
||||||
struct.msgSeq,
|
NewFriendRequestEvent(
|
||||||
msgAdditional,
|
bot,
|
||||||
struct.reqUin,
|
struct.msgSeq,
|
||||||
groupCode,
|
msgAdditional,
|
||||||
reqUinNick
|
struct.reqUin,
|
||||||
)
|
groupCode,
|
||||||
|
reqUinNick
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}.let { packets ->
|
||||||
|
when {
|
||||||
|
packets.isEmpty() -> null
|
||||||
|
packets.size == 1 -> packets[0]
|
||||||
|
else -> MultiPacketByIterable(packets)
|
||||||
|
}
|
||||||
|
}.also {
|
||||||
|
bot.client.syncingController.latestMsgNewFriendTime = currentTimeSeconds()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -143,18 +156,8 @@ internal class NewContact {
|
|||||||
|
|
||||||
|
|
||||||
override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Packet? {
|
override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Packet? {
|
||||||
return readBytes().loadAs(Structmsg.RspSystemMsgNew.serializer()).run {
|
fun handleStruct(struct: Structmsg.StructMsg): Packet? {
|
||||||
val struct = groupmsgs.firstOrNull() ?: return null // 会有重复且无法过滤, 不要用 map
|
return struct.msg?.run {
|
||||||
|
|
||||||
if (!bot.client.syncingController.systemMsgNewGroupCacheList.addCache(
|
|
||||||
QQAndroidClient.MessageSvcSyncData.SystemMsgNewGroupSyncId(struct.msgSeq, struct.msgTime)
|
|
||||||
)
|
|
||||||
) { // duplicate
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
|
|
||||||
struct.msg?.run {
|
|
||||||
//this.soutv("SystemMsg")
|
|
||||||
when (subType) {
|
when (subType) {
|
||||||
1 -> { // 处理被邀请入群 或 处理成员入群申请
|
1 -> { // 处理被邀请入群 或 处理成员入群申请
|
||||||
when (groupMsgType) {
|
when (groupMsgType) {
|
||||||
@ -232,6 +235,31 @@ internal class NewContact {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return readBytes().loadAs(Structmsg.RspSystemMsgNew.serializer()).run {
|
||||||
|
groupmsgs.filter {
|
||||||
|
it.msgTime > bot.client.syncingController.latestMsgNewGroupTime
|
||||||
|
}.mapNotNull { struct ->
|
||||||
|
if (!bot.client.syncingController.systemMsgNewGroupCacheList.addCache(
|
||||||
|
QQAndroidClient.MessageSvcSyncData.SystemMsgNewGroupSyncId(
|
||||||
|
struct.msgSeq,
|
||||||
|
struct.msgTime
|
||||||
|
)
|
||||||
|
)
|
||||||
|
) { // duplicate
|
||||||
|
return@mapNotNull null
|
||||||
|
}
|
||||||
|
handleStruct(struct)
|
||||||
|
}.let { packets ->
|
||||||
|
when {
|
||||||
|
packets.isEmpty() -> null
|
||||||
|
packets.size == 1 -> packets[0]
|
||||||
|
else -> MultiPacketByIterable(packets)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}.also {
|
||||||
|
bot.client.syncingController.latestMsgNewGroupTime = currentTimeSeconds()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal object Action : OutgoingPacketFactory<Nothing?>("ProfileService.Pb.ReqSystemMsgAction.Group") {
|
internal object Action : OutgoingPacketFactory<Nothing?>("ProfileService.Pb.ReqSystemMsgAction.Group") {
|
||||||
|
Loading…
Reference in New Issue
Block a user