Skip to content

Commit

Permalink
[Core] Fetch the filtered requests simultaneously in FetchGroupReques…
Browse files Browse the repository at this point in the history
…ts (#571)
  • Loading branch information
pk5ls20 authored Sep 4, 2024
1 parent 2b8014d commit afd3b17
Show file tree
Hide file tree
Showing 5 changed files with 82 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -255,7 +255,7 @@ public async Task<bool> 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<FetchGroupRequestsEvent>().SelectMany(e => e.Events).ToList();
var results = new List<BotGroupRequest>();

foreach (var result in resolved)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
using ProtoBuf;

namespace Lagrange.Core.Internal.Packets.Service.Oidb.Request;

// ReSharper disable InconsistentNaming

/// <summary>
/// Fetch Friends & Group Notification filtered List
/// </summary>
[ProtoContract]
[OidbSvcTrpcTcp(0x10c0, 2)]
internal class OidbSvcTrpcTcp0x10C0_2
{
[ProtoMember(1)] public uint Count { get; set; } // 20

[ProtoMember(2)] public uint Field2 { get; set; } // 0
}
Original file line number Diff line number Diff line change
Expand Up @@ -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<OidbSvcTrpcTcp0x10C0_1ResponseRequests> Requests { get; set; }
[ProtoMember(1)] public List<OidbSvcTrpcTcp0x10C0ResponseRequests>? Requests { get; set; }

[ProtoMember(2)] public ulong Field2 { get; set; }

Expand All @@ -22,37 +22,37 @@ internal class OidbSvcTrpcTcp0x10C0_1Response
}

[ProtoContract]
internal class OidbSvcTrpcTcp0x10C0_1ResponseRequests
internal class OidbSvcTrpcTcp0x10C0ResponseRequests
{
[ProtoMember(1)] public ulong Sequence { get; set; }

[ProtoMember(2)] public uint EventType { get; set; } // 13 for exit group, 22 for group request

[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; }

[ProtoMember(10)] public string Comment { get; set; }
}

[ProtoContract]
internal class OidbSvcTrpcTcp0x10C0_1ResponseGroup
internal class OidbSvcTrpcTcp0x10C0ResponseGroup
{
[ProtoMember(1)] public uint GroupUin { get; set; }

[ProtoMember(2)] public string GroupName { get; set; } // 13 for exit group, 22 for group request
}

[ProtoContract]
internal class OidbSvcTrpcTcp0x10C0_1ResponseUser
internal class OidbSvcTrpcTcp0x10C0ResponseUser
{
[ProtoMember(1)] public string Uid { get; set; }

Expand Down
Original file line number Diff line number Diff line change
@@ -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<FetchGroupRequestsEvent>
{
protected override bool Build(FetchGroupRequestsEvent input, BotKeystore keystore, BotAppInfo appInfo,
BotDeviceInfo device, out Span<byte> output, out List<Memory<byte>>? extraPackets)
{
var packet = new OidbSvcTrpcTcpBase<OidbSvcTrpcTcp0x10C0_2>(new OidbSvcTrpcTcp0x10C0_2
{
Count = 20,
Field2 = 0
});

output = packet.Serialize();
extraPackets = null;
return true;
}

protected override bool Parse(Span<byte> input, BotKeystore keystore, BotAppInfo appInfo, BotDeviceInfo device, out FetchGroupRequestsEvent output,
out List<ProtocolEvent>? extraEvents)
{
var payload = Serializer.Deserialize<OidbSvcTrpcTcpBase<OidbSvcTrpcTcp0x10C0Response>>(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<FetchGroupRequestsEvent.RawEvent>();

output = FetchGroupRequestsEvent.Result((int)payload.ErrorCode, events);
extraEvents = null;
return true;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,8 @@ protected override bool Build(FetchGroupRequestsEvent input, BotKeystore keystor
protected override bool Parse(Span<byte> input, BotKeystore keystore, BotAppInfo appInfo, BotDeviceInfo device, out FetchGroupRequestsEvent output,
out List<ProtocolEvent>? extraEvents)
{
var payload = Serializer.Deserialize<OidbSvcTrpcTcpBase<OidbSvcTrpcTcp0x10C0_1Response>>(input);
var events = payload.Body.Requests.Select(x => new FetchGroupRequestsEvent.RawEvent(
var payload = Serializer.Deserialize<OidbSvcTrpcTcpBase<OidbSvcTrpcTcp0x10C0Response>>(input);
var events = payload.Body.Requests?.Select(x => new FetchGroupRequestsEvent.RawEvent(
x.Group.GroupUin,
x.Invitor?.Uid,
x.Invitor?.Name,
Expand All @@ -43,7 +43,7 @@ protected override bool Parse(Span<byte> input, BotKeystore keystore, BotAppInfo
x.State,
x.EventType,
x.Comment
)).ToList();
)).ToList() ?? new List<FetchGroupRequestsEvent.RawEvent>();

output = FetchGroupRequestsEvent.Result((int)payload.ErrorCode, events);
extraEvents = null;
Expand Down

0 comments on commit afd3b17

Please sign in to comment.