Skip to content

Commit

Permalink
[All] Try to simply parse MsgPush.PushGroupProMsg
Browse files Browse the repository at this point in the history
  • Loading branch information
pk5ls20 committed Oct 9, 2024
1 parent 2ca2363 commit 65b6ad5
Show file tree
Hide file tree
Showing 10 changed files with 205 additions and 2 deletions.
13 changes: 13 additions & 0 deletions Lagrange.Core/Event/EventArg/GroupProMessageEvent.cs
Original file line number Diff line number Diff line change
@@ -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;
}
}
2 changes: 2 additions & 0 deletions Lagrange.Core/Event/EventInvoker.Events.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ public partial class EventInvoker
public event LagrangeEvent<FriendMessageEvent>? OnFriendMessageReceived;

public event LagrangeEvent<GroupMessageEvent>? OnGroupMessageReceived;

public event LagrangeEvent<GroupProMessageEvent>? OnGroupProMessageReceived;

public event LagrangeEvent<TempMessageEvent>? OnTempMessageReceived;

Expand Down
1 change: 1 addition & 0 deletions Lagrange.Core/Event/EventInvoker.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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));
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
using Lagrange.Core.Common.Entity;
using Lagrange.Core.Event;
using Lagrange.Core.Event.EventArg;
using Lagrange.Core.Internal.Context.Attributes;
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -436,7 +438,7 @@ private async Task ResolveOutgoingChain(MessageChain chain)
/// <param name="chain">The target chain</param>
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
Expand Down
95 changes: 95 additions & 0 deletions Lagrange.Core/Internal/Packets/Message/PushGroupProMsg.cs
Original file line number Diff line number Diff line change
@@ -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; }
}
Original file line number Diff line number Diff line change
@@ -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<PushMessageEvent>
{
protected override bool Parse(Span<byte> input, BotKeystore keystore, BotAppInfo appInfo, BotDeviceInfo device,
out PushMessageEvent output, out List<ProtocolEvent>? extraEvents)
{
var message = Serializer.Deserialize<PushGroupProMsg>(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<ProtocolEvent>();
return true;
}
}
4 changes: 4 additions & 0 deletions Lagrange.Core/Message/Entity/FaceEntity.cs
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,10 @@ IEnumerable<Elem> IMessageEntity.PackElement()
}
}
};
}
else if (FaceId >= 260)
{

}

return new Elem[] { new() { Face = new Face { Index = FaceId } } };
Expand Down
5 changes: 4 additions & 1 deletion Lagrange.Core/Message/MessageChain.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ public sealed class MessageChain : List<IMessageEntity>
internal string? Uid { get; set; }

internal bool IsGroup { get => GroupUin != null; }

internal bool IsGroupPro { get => Type == MessageType.GroupPro; }

internal List<Elem> Elements { get; set; }

Expand Down Expand Up @@ -118,6 +120,7 @@ public enum MessageType
{
Group,
Temp,
Friend
Friend,
GroupPro,
}
}
43 changes: 43 additions & 0 deletions Lagrange.Core/Message/MessagePacker.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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)
{
Expand Down Expand Up @@ -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)
{
Expand Down
8 changes: 8 additions & 0 deletions Lagrange.OneBot/Message/MessageService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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<Type, List<(string, SegmentBase)>>();
Expand Down Expand Up @@ -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)
{
Expand Down

0 comments on commit 65b6ad5

Please sign in to comment.