diff --git a/Lagrange.Core/Internal/Context/Logic/Implementation/OperationLogic.cs b/Lagrange.Core/Internal/Context/Logic/Implementation/OperationLogic.cs index 59aa9169d..d217c1bcd 100644 --- a/Lagrange.Core/Internal/Context/Logic/Implementation/OperationLogic.cs +++ b/Lagrange.Core/Internal/Context/Logic/Implementation/OperationLogic.cs @@ -251,7 +251,7 @@ public async Task RecallGroupMessage(MessageChain chain) var events = await Collection.Business.SendEvent(fetchRequestsEvent); if (events.Count == 0) return null; - var resolved = ((FetchGroupRequestsEvent)events[0]).Events; + var resolved = events.Cast().SelectMany(e => e.Events).ToList(); var results = new List(); foreach (var result in resolved) diff --git a/Lagrange.Core/Internal/Packets/Service/Oidb/Request/OidbSvcTrpcTcp0x10C0_2.cs b/Lagrange.Core/Internal/Packets/Service/Oidb/Request/OidbSvcTrpcTcp0x10C0_2.cs new file mode 100644 index 000000000..20e5afef7 --- /dev/null +++ b/Lagrange.Core/Internal/Packets/Service/Oidb/Request/OidbSvcTrpcTcp0x10C0_2.cs @@ -0,0 +1,17 @@ +using ProtoBuf; + +namespace Lagrange.Core.Internal.Packets.Service.Oidb.Request; + +// ReSharper disable InconsistentNaming + +/// +/// Fetch Friends & Group Notification filtered List +/// +[ProtoContract] +[OidbSvcTrpcTcp(0x10c0, 2)] +internal class OidbSvcTrpcTcp0x10C0_2 +{ + [ProtoMember(1)] public uint Count { get; set; } // 20 + + [ProtoMember(2)] public uint Field2 { get; set; } // 0 +} \ No newline at end of file diff --git a/Lagrange.Core/Internal/Packets/Service/Oidb/Response/OidbSvcTrpcTcp0x10C0_1Response.cs b/Lagrange.Core/Internal/Packets/Service/Oidb/Response/OidbSvcTrpcTcp0x10C0Response.cs similarity index 66% rename from Lagrange.Core/Internal/Packets/Service/Oidb/Response/OidbSvcTrpcTcp0x10C0_1Response.cs rename to Lagrange.Core/Internal/Packets/Service/Oidb/Response/OidbSvcTrpcTcp0x10C0Response.cs index e89084aad..da2e7542b 100644 --- a/Lagrange.Core/Internal/Packets/Service/Oidb/Response/OidbSvcTrpcTcp0x10C0_1Response.cs +++ b/Lagrange.Core/Internal/Packets/Service/Oidb/Response/OidbSvcTrpcTcp0x10C0Response.cs @@ -6,9 +6,9 @@ namespace Lagrange.Core.Internal.Packets.Service.Oidb.Response; #pragma warning disable CS8618 [ProtoContract] -internal class OidbSvcTrpcTcp0x10C0_1Response +internal class OidbSvcTrpcTcp0x10C0Response { - [ProtoMember(1)] public List Requests { get; set; } + [ProtoMember(1)] public List? Requests { get; set; } [ProtoMember(2)] public ulong Field2 { get; set; } @@ -22,7 +22,7 @@ internal class OidbSvcTrpcTcp0x10C0_1Response } [ProtoContract] -internal class OidbSvcTrpcTcp0x10C0_1ResponseRequests +internal class OidbSvcTrpcTcp0x10C0ResponseRequests { [ProtoMember(1)] public ulong Sequence { get; set; } @@ -30,13 +30,13 @@ internal class OidbSvcTrpcTcp0x10C0_1ResponseRequests [ProtoMember(3)] public uint State { get; set; } // 2 for Join, 1 for waiting for action - [ProtoMember(4)] public OidbSvcTrpcTcp0x10C0_1ResponseGroup Group { get; set; } + [ProtoMember(4)] public OidbSvcTrpcTcp0x10C0ResponseGroup Group { get; set; } - [ProtoMember(5)] public OidbSvcTrpcTcp0x10C0_1ResponseUser Target { get; set; } + [ProtoMember(5)] public OidbSvcTrpcTcp0x10C0ResponseUser Target { get; set; } - [ProtoMember(6)] public OidbSvcTrpcTcp0x10C0_1ResponseUser? Invitor { get; set; } + [ProtoMember(6)] public OidbSvcTrpcTcp0x10C0ResponseUser? Invitor { get; set; } - [ProtoMember(7)] public OidbSvcTrpcTcp0x10C0_1ResponseUser? Operator { get; set; } + [ProtoMember(7)] public OidbSvcTrpcTcp0x10C0ResponseUser? Operator { get; set; } [ProtoMember(9)] public string Field9 { get; set; } @@ -44,7 +44,7 @@ internal class OidbSvcTrpcTcp0x10C0_1ResponseRequests } [ProtoContract] -internal class OidbSvcTrpcTcp0x10C0_1ResponseGroup +internal class OidbSvcTrpcTcp0x10C0ResponseGroup { [ProtoMember(1)] public uint GroupUin { get; set; } @@ -52,7 +52,7 @@ internal class OidbSvcTrpcTcp0x10C0_1ResponseGroup } [ProtoContract] -internal class OidbSvcTrpcTcp0x10C0_1ResponseUser +internal class OidbSvcTrpcTcp0x10C0ResponseUser { [ProtoMember(1)] public string Uid { get; set; } diff --git a/Lagrange.Core/Internal/Service/System/FetchFilteredGroupRequestsService.cs b/Lagrange.Core/Internal/Service/System/FetchFilteredGroupRequestsService.cs new file mode 100644 index 000000000..b25ec4b0b --- /dev/null +++ b/Lagrange.Core/Internal/Service/System/FetchFilteredGroupRequestsService.cs @@ -0,0 +1,52 @@ +using Lagrange.Core.Common; +using Lagrange.Core.Internal.Event; +using Lagrange.Core.Internal.Event.System; +using Lagrange.Core.Internal.Packets.Service.Oidb; +using Lagrange.Core.Internal.Packets.Service.Oidb.Request; +using Lagrange.Core.Internal.Packets.Service.Oidb.Response; +using Lagrange.Core.Utility.Extension; +using ProtoBuf; + +namespace Lagrange.Core.Internal.Service.System; + +[EventSubscribe(typeof(FetchGroupRequestsEvent))] +[Service("OidbSvcTrpcTcp.0x10c0_2")] +internal class FetchFilteredGroupRequestsService : BaseService +{ + protected override bool Build(FetchGroupRequestsEvent input, BotKeystore keystore, BotAppInfo appInfo, + BotDeviceInfo device, out Span output, out List>? extraPackets) + { + var packet = new OidbSvcTrpcTcpBase(new OidbSvcTrpcTcp0x10C0_2 + { + Count = 20, + Field2 = 0 + }); + + output = packet.Serialize(); + extraPackets = null; + return true; + } + + protected override bool Parse(Span input, BotKeystore keystore, BotAppInfo appInfo, BotDeviceInfo device, out FetchGroupRequestsEvent output, + out List? extraEvents) + { + var payload = Serializer.Deserialize>(input); + var events = payload.Body.Requests?.Select(x => new FetchGroupRequestsEvent.RawEvent( + x.Group.GroupUin, + x.Invitor?.Uid, + x.Invitor?.Name, + x.Target.Uid, + x.Target.Name, + x.Operator?.Uid, + x.Operator?.Name, + x.Sequence, + x.State, + x.EventType, + x.Comment + )).ToList() ?? new List(); + + output = FetchGroupRequestsEvent.Result((int)payload.ErrorCode, events); + extraEvents = null; + return true; + } +} \ No newline at end of file diff --git a/Lagrange.Core/Internal/Service/System/FetchGroupRequestsService.cs b/Lagrange.Core/Internal/Service/System/FetchGroupRequestsService.cs index 86a9060fe..02552c32c 100644 --- a/Lagrange.Core/Internal/Service/System/FetchGroupRequestsService.cs +++ b/Lagrange.Core/Internal/Service/System/FetchGroupRequestsService.cs @@ -30,8 +30,8 @@ protected override bool Build(FetchGroupRequestsEvent input, BotKeystore keystor protected override bool Parse(Span input, BotKeystore keystore, BotAppInfo appInfo, BotDeviceInfo device, out FetchGroupRequestsEvent output, out List? extraEvents) { - var payload = Serializer.Deserialize>(input); - var events = payload.Body.Requests.Select(x => new FetchGroupRequestsEvent.RawEvent( + var payload = Serializer.Deserialize>(input); + var events = payload.Body.Requests?.Select(x => new FetchGroupRequestsEvent.RawEvent( x.Group.GroupUin, x.Invitor?.Uid, x.Invitor?.Name, @@ -43,7 +43,7 @@ protected override bool Parse(Span input, BotKeystore keystore, BotAppInfo x.State, x.EventType, x.Comment - )).ToList(); + )).ToList() ?? new List(); output = FetchGroupRequestsEvent.Result((int)payload.ErrorCode, events); extraEvents = null;