From 65b6ad5e61018b85e742fec6f5163f32b86c70a9 Mon Sep 17 00:00:00 2001 From: pk5ls20 Date: Wed, 9 Oct 2024 11:17:32 +0800 Subject: [PATCH] [All] Try to simply parse `MsgPush.PushGroupProMsg` --- .../Event/EventArg/GroupProMessageEvent.cs | 13 +++ Lagrange.Core/Event/EventInvoker.Events.cs | 2 + Lagrange.Core/Event/EventInvoker.cs | 1 + .../Logic/Implementation/MessagingLogic.cs | 4 +- .../Packets/Message/PushGroupProMsg.cs | 95 +++++++++++++++++++ .../Message/PushGroupProMessageService.cs | 32 +++++++ Lagrange.Core/Message/Entity/FaceEntity.cs | 4 + Lagrange.Core/Message/MessageChain.cs | 5 +- Lagrange.Core/Message/MessagePacker.cs | 43 +++++++++ Lagrange.OneBot/Message/MessageService.cs | 8 ++ 10 files changed, 205 insertions(+), 2 deletions(-) create mode 100644 Lagrange.Core/Event/EventArg/GroupProMessageEvent.cs create mode 100644 Lagrange.Core/Internal/Packets/Message/PushGroupProMsg.cs create mode 100644 Lagrange.Core/Internal/Service/Message/PushGroupProMessageService.cs diff --git a/Lagrange.Core/Event/EventArg/GroupProMessageEvent.cs b/Lagrange.Core/Event/EventArg/GroupProMessageEvent.cs new file mode 100644 index 000000000..2d4e47e49 --- /dev/null +++ b/Lagrange.Core/Event/EventArg/GroupProMessageEvent.cs @@ -0,0 +1,13 @@ +using Lagrange.Core.Message; + +namespace Lagrange.Core.Event.EventArg; + +public class GroupProMessageEvent : EventBase +{ + public MessageChain Chain { get; set; } + + public GroupProMessageEvent(MessageChain chain) + { + Chain = chain; + } +} \ No newline at end of file diff --git a/Lagrange.Core/Event/EventInvoker.Events.cs b/Lagrange.Core/Event/EventInvoker.Events.cs index fcfb502c2..9577c3cac 100644 --- a/Lagrange.Core/Event/EventInvoker.Events.cs +++ b/Lagrange.Core/Event/EventInvoker.Events.cs @@ -19,6 +19,8 @@ public partial class EventInvoker public event LagrangeEvent? OnFriendMessageReceived; public event LagrangeEvent? OnGroupMessageReceived; + + public event LagrangeEvent? OnGroupProMessageReceived; public event LagrangeEvent? OnTempMessageReceived; diff --git a/Lagrange.Core/Event/EventInvoker.cs b/Lagrange.Core/Event/EventInvoker.cs index 666ff1162..75cf82353 100644 --- a/Lagrange.Core/Event/EventInvoker.cs +++ b/Lagrange.Core/Event/EventInvoker.cs @@ -23,6 +23,7 @@ internal EventInvoker(BotContext context) RegisterEvent((GroupInvitationEvent e) => OnGroupInvitationReceived?.Invoke(context, e)); RegisterEvent((FriendMessageEvent e) => OnFriendMessageReceived?.Invoke(context, e)); RegisterEvent((GroupMessageEvent e) => OnGroupMessageReceived?.Invoke(context, e)); + RegisterEvent((GroupProMessageEvent e) => OnGroupProMessageReceived?.Invoke(context, e)); RegisterEvent((TempMessageEvent e) => OnTempMessageReceived?.Invoke(context, e)); RegisterEvent((GroupAdminChangedEvent e) => OnGroupAdminChangedEvent?.Invoke(context, e)); RegisterEvent((GroupMemberIncreaseEvent e) => OnGroupMemberIncreaseEvent?.Invoke(context, e)); diff --git a/Lagrange.Core/Internal/Context/Logic/Implementation/MessagingLogic.cs b/Lagrange.Core/Internal/Context/Logic/Implementation/MessagingLogic.cs index 86271dcba..50d4d844d 100644 --- a/Lagrange.Core/Internal/Context/Logic/Implementation/MessagingLogic.cs +++ b/Lagrange.Core/Internal/Context/Logic/Implementation/MessagingLogic.cs @@ -1,3 +1,4 @@ +using Lagrange.Core.Common.Entity; using Lagrange.Core.Event; using Lagrange.Core.Event.EventArg; using Lagrange.Core.Internal.Context.Attributes; @@ -64,6 +65,7 @@ public override async Task Incoming(ProtocolEvent e) MessageChain.MessageType.Friend => new FriendMessageEvent(chain), MessageChain.MessageType.Group => new GroupMessageEvent(chain), MessageChain.MessageType.Temp => new TempMessageEvent(chain), + MessageChain.MessageType.GroupPro => new GroupProMessageEvent(chain), _ => throw new ArgumentOutOfRangeException() }; Collection.Invoker.PostEvent(args); @@ -436,7 +438,7 @@ private async Task ResolveOutgoingChain(MessageChain chain) /// The target chain private async Task ResolveChainMetadata(MessageChain chain) { - if (chain is { IsGroup: true, GroupUin: not null }) + if (chain is { IsGroup: true, GroupUin: not null , IsGroupPro: false }) { var groups = await Collection.Business.CachingLogic.GetCachedMembers(chain.GroupUin.Value, false); chain.GroupMemberInfo = chain.FriendUin == 0 diff --git a/Lagrange.Core/Internal/Packets/Message/PushGroupProMsg.cs b/Lagrange.Core/Internal/Packets/Message/PushGroupProMsg.cs new file mode 100644 index 000000000..0942883cc --- /dev/null +++ b/Lagrange.Core/Internal/Packets/Message/PushGroupProMsg.cs @@ -0,0 +1,95 @@ +using Lagrange.Core.Internal.Packets.System; +using ProtoBuf; + +namespace Lagrange.Core.Internal.Packets.Message; + +#pragma warning disable CS8618 + +[ProtoContract] +internal class PushGroupProMsg +{ + [ProtoMember(1)] public PushGroupProMsgBody Message { get; set; } + + [ProtoMember(3)] public int? Status { get; set; } + + [ProtoMember(4)] public NTSysEvent? NtEvent { get; set; } + + [ProtoMember(5)] public int? PingFLag { get; set; } + + [ProtoMember(9)] public int? GeneralFlag { get; set; } +} + +[ProtoContract] +internal class PushGroupProMsgBody +{ + [ProtoMember(1)] public Unknown1 Unknown1 { get; set; } + + [ProtoMember(2)] public PushGroupProMsgContentHead ContentHead { get; set; } + + [ProtoMember(3)] public MessageBody? Body { get; set; } + + [ProtoMember(4)] public Unknown4? Unknown4 { get; set; } +} + +[ProtoContract] +internal class Unknown1 +{ + [ProtoMember(1)] public Unknown1Field1? Field1 { get; set; } + + [ProtoMember(2)] public Unknown1Field2? Field2 { get; set; } +} + +[ProtoContract] +internal class Unknown1Field1 +{ + [ProtoMember(1)] public ulong? GuildId { get; set; } + + [ProtoMember(4)] public ulong? SenderId { get; set; } +} + +[ProtoContract] +internal class Unknown1Field2 +{ + [ProtoMember(4)] public uint? Seq { get; set; } +} + + +[ProtoContract] +internal class PushGroupProMsgContentHead +{ + [ProtoMember(1)] public uint Type { get; set; } + + [ProtoMember(2)] public uint? SubType { get; set; } + + [ProtoMember(3)] public uint? DivSeq { get; set; } + + [ProtoMember(4)] public long? MsgId { get; set; } + + [ProtoMember(5)] public uint? Sequence { get; set; } + + [ProtoMember(6)] public long? Timestamp { get; set; } + + [ProtoMember(7)] public long? Field7 { get; set; } + + [ProtoMember(8)] public uint? Field8 { get; set; } + + [ProtoMember(9)] public uint? Field9 { get; set; } + + [ProtoMember(11)] public uint? FriendSequence { get; set; } + + [ProtoMember(12)] public ulong? NewId { get; set; } +} + +[ProtoContract] +internal class Unknown4 +{ + [ProtoMember(1)] public string? SenderNickName { get; set; } + + [ProtoMember(2)] public string? GuildName { get; set; } + + [ProtoMember(3)] public string? SubGuildName { get; set; } + + [ProtoMember(8)] public string? SenderGuildName { get; set; } + + [ProtoMember(9)] public uint? Timestamp { get; set; } +} \ No newline at end of file diff --git a/Lagrange.Core/Internal/Service/Message/PushGroupProMessageService.cs b/Lagrange.Core/Internal/Service/Message/PushGroupProMessageService.cs new file mode 100644 index 000000000..b1e61509f --- /dev/null +++ b/Lagrange.Core/Internal/Service/Message/PushGroupProMessageService.cs @@ -0,0 +1,32 @@ +using Lagrange.Core.Common; +using Lagrange.Core.Common.Entity; +using Lagrange.Core.Internal.Event; +using Lagrange.Core.Internal.Event.Message; +using Lagrange.Core.Internal.Packets.Message; +using Lagrange.Core.Message; +using static Lagrange.Core.Message.MessageChain; +using ProtoBuf; + +// ReSharper disable InconsistentNaming + +namespace Lagrange.Core.Internal.Service.Message; + +[EventSubscribe(typeof(PushMessageEvent))] +[Service("MsgPush.PushGroupProMsg")] +internal class PushGroupProMessageService : BaseService +{ + protected override bool Parse(Span input, BotKeystore keystore, BotAppInfo appInfo, BotDeviceInfo device, + out PushMessageEvent output, out List? extraEvents) + { + var message = Serializer.Deserialize(input); + var chain = MessagePacker.Parse(message.Message); + // patch, what i can say + chain.Type = MessageType.GroupPro; + chain.GroupMemberInfo = new BotGroupMember(); + chain.GroupMemberInfo.MemberName = message.Message.Unknown4?.SenderNickName ?? ""; + chain.GroupMemberInfo.Uin = (uint)(message.Message.Unknown1.Field1?.SenderId ?? 0 % ((ulong)uint.MaxValue + 1)); + output = PushMessageEvent.Create(chain); + extraEvents = new List(); + return true; + } +} diff --git a/Lagrange.Core/Message/Entity/FaceEntity.cs b/Lagrange.Core/Message/Entity/FaceEntity.cs index c149e3569..b08ab555c 100644 --- a/Lagrange.Core/Message/Entity/FaceEntity.cs +++ b/Lagrange.Core/Message/Entity/FaceEntity.cs @@ -50,6 +50,10 @@ IEnumerable IMessageEntity.PackElement() } } }; + } + else if (FaceId >= 260) + { + } return new Elem[] { new() { Face = new Face { Index = FaceId } } }; diff --git a/Lagrange.Core/Message/MessageChain.cs b/Lagrange.Core/Message/MessageChain.cs index ba38404b5..d3ae4449e 100644 --- a/Lagrange.Core/Message/MessageChain.cs +++ b/Lagrange.Core/Message/MessageChain.cs @@ -35,6 +35,8 @@ public sealed class MessageChain : List internal string? Uid { get; set; } internal bool IsGroup { get => GroupUin != null; } + + internal bool IsGroupPro { get => Type == MessageType.GroupPro; } internal List Elements { get; set; } @@ -118,6 +120,7 @@ public enum MessageType { Group, Temp, - Friend + Friend, + GroupPro, } } diff --git a/Lagrange.Core/Message/MessagePacker.cs b/Lagrange.Core/Message/MessagePacker.cs index 9f7a98998..f8452b087 100644 --- a/Lagrange.Core/Message/MessagePacker.cs +++ b/Lagrange.Core/Message/MessagePacker.cs @@ -14,6 +14,7 @@ using PushMsgBody = Lagrange.Core.Internal.Packets.Message.PushMsgBody; using ResponseHead = Lagrange.Core.Internal.Packets.Message.ResponseHead; using RoutingHead = Lagrange.Core.Internal.Packets.Message.RoutingHead; +using PushGroupProMsgBody = Lagrange.Core.Internal.Packets.Message.PushGroupProMsgBody; namespace Lagrange.Core.Message; @@ -153,6 +154,31 @@ public static MessageChain Parse(PushMsgBody message, bool isFake = false) } return chain; } + + public static MessageChain Parse(PushGroupProMsgBody message, bool isFake = false) + { + var chain = ParseChain(message); + + if (message.Body?.RichText is { Elems: { } elements }) // 怎么Body还能是null的 + { + foreach (var element in elements) + { + foreach (var (entityType, expectElems) in EntityToElem) + { + foreach (var expectElem in expectElems) + { + if (expectElem.GetValueByExpr(element) is not null && + Factory[entityType].UnpackElement(element) is { } entity) + { + chain.Add(entity); + break; + } + } + } + } + } + return chain; + } public static MessageChain ParsePrivateFile(PushMsgBody message) { @@ -272,6 +298,23 @@ private static MessageChain ParseChain(PushMsgBody message) return chain; } + + private static MessageChain ParseChain(PushGroupProMsgBody message) + { + var chain = new MessageChain( + (uint)(message.Unknown1.Field1?.GuildId ?? 0 % ((ulong)uint.MaxValue + 1)) , + (uint)(message.Unknown1.Field1?.SenderId ?? 0 % ((ulong)uint.MaxValue + 1)), + message.Unknown1.Field2?.Seq ?? 0, + message.ContentHead.NewId ?? 0, + 0 + ); + + if (message.Body?.RichText?.Elems is { } elems) chain.Elements.AddRange(elems); + + chain.Time = DateTimeOffset.FromUnixTimeSeconds(message.ContentHead.Timestamp ?? 0).LocalDateTime; + + return chain; + } private static MessageChain ParseFakeChain(PushMsgBody message) { diff --git a/Lagrange.OneBot/Message/MessageService.cs b/Lagrange.OneBot/Message/MessageService.cs index ed2ca76b4..c19ebbda5 100644 --- a/Lagrange.OneBot/Message/MessageService.cs +++ b/Lagrange.OneBot/Message/MessageService.cs @@ -3,6 +3,7 @@ using System.Text.Json; using System.Text.Json.Serialization.Metadata; using Lagrange.Core; +using Lagrange.Core.Common.Entity; using Lagrange.Core.Event.EventArg; using Lagrange.Core.Message; using Lagrange.Core.Utility.Extension; @@ -45,6 +46,7 @@ public MessageService(BotContext bot, LagrangeWebSvcCollection service, LiteData invoker.OnFriendMessageReceived += OnFriendMessageReceived; invoker.OnGroupMessageReceived += OnGroupMessageReceived; + invoker.OnGroupProMessageReceived += OnGroupProMessageReceived; invoker.OnTempMessageReceived += OnTempMessageReceived; _entityToFactory = new Dictionary>(); @@ -107,6 +109,12 @@ private void OnGroupMessageReceived(BotContext bot, GroupMessageEvent e) _ = _service.SendJsonAsync(request); } + + private void OnGroupProMessageReceived(BotContext bot, GroupProMessageEvent e) + { + var request = ConvertToGroupMsg(bot.BotUin, e.Chain); + _ = _service.SendJsonAsync(request); + } public object ConvertToGroupMsg(uint uin, MessageChain chain) {