From 082d3cb110de12c93a6f6c526c59d33ce7b8ccd7 Mon Sep 17 00:00:00 2001 From: DarkRRb <177549718+DarkRRb@users.noreply.github.com> Date: Tue, 24 Dec 2024 10:27:27 +0800 Subject: [PATCH] [Core] Impl 0x88D_0 (#712) * [Core] impl 0x88D_0 * Clean up `using` --- Lagrange.Core.Test/Tests/NTLoginTest.cs | 1 - Lagrange.Core/Common/Entity/BotGroupInfo.cs | 30 +++++++ .../Common/Interface/Api/OperationExt.cs | 9 ++- .../Logic/Implementation/OperationLogic.cs | 10 ++- .../Message/GetLatestGroupMessageEvent.cs | 31 +++++++ .../Oidb/Request/OidbSvcTrpcTcp0x88D_0.cs | 73 +++++++++++++++++ .../Response/OidbSvcTrpcTcp0x88D_0Response.cs | 66 +++++++++++++++ .../Message/GetLatestGroupMessageService.cs | 80 +++++++++++++++++++ Lagrange.Core/Utility/Sign/LinuxSigner.cs | 7 -- Lagrange.Core/Utility/Sign/MacSigner.cs | 6 -- Lagrange.Core/Utility/Sign/WindowsSigner.cs | 6 -- Lagrange.OneBot/Core/Entity/OneBotStranger.cs | 1 - Lagrange.OneBot/Core/Entity/OnebotBusiness.cs | 1 - .../Operation/Converters/ForwardConverter.cs | 2 - .../Converters/NullIfEmptyConverter.cs | 3 +- .../Message/GetForwardMsgOperation.cs | 1 - .../Operation/Message/GetMusicArkOperation.cs | 1 - .../Core/Operation/Message/MessageCommon.cs | 1 - 18 files changed, 296 insertions(+), 33 deletions(-) create mode 100644 Lagrange.Core/Common/Entity/BotGroupInfo.cs create mode 100644 Lagrange.Core/Internal/Event/Message/GetLatestGroupMessageEvent.cs create mode 100644 Lagrange.Core/Internal/Packets/Service/Oidb/Request/OidbSvcTrpcTcp0x88D_0.cs create mode 100644 Lagrange.Core/Internal/Packets/Service/Oidb/Response/OidbSvcTrpcTcp0x88D_0Response.cs create mode 100644 Lagrange.Core/Internal/Service/Message/GetLatestGroupMessageService.cs diff --git a/Lagrange.Core.Test/Tests/NTLoginTest.cs b/Lagrange.Core.Test/Tests/NTLoginTest.cs index 9c8cd3d3a..85410c283 100644 --- a/Lagrange.Core.Test/Tests/NTLoginTest.cs +++ b/Lagrange.Core.Test/Tests/NTLoginTest.cs @@ -2,7 +2,6 @@ using Lagrange.Core.Common.Interface; using Lagrange.Core.Common.Interface.Api; using Lagrange.Core.Internal.Event.System; -using Lagrange.Core.Message; namespace Lagrange.Core.Test.Tests; diff --git a/Lagrange.Core/Common/Entity/BotGroupInfo.cs b/Lagrange.Core/Common/Entity/BotGroupInfo.cs new file mode 100644 index 000000000..2cde0171a --- /dev/null +++ b/Lagrange.Core/Common/Entity/BotGroupInfo.cs @@ -0,0 +1,30 @@ +namespace Lagrange.Core.Common.Entity; + +public class BotGroupInfo +{ + public string OwnerUid { get; set; } = string.Empty; + + public ulong CreateTime { get; set; } + + public ulong MaxMemberCount { get; set; } + + public ulong MemberCount { get; set; } + + public ulong Level { get; set; } + + public string Name { get; set; } = string.Empty; + + public string NoticePreview { get; set; } = string.Empty; + + public ulong Uin { get; set; } + + public ulong LastSequence { get; set; } + + public ulong LastMessageTime { get; set; } + + public string Question { get; set; } = string.Empty; + + public string Answer { get; set; } = string.Empty; + + public ulong MaxAdminCount { get; set; } +} \ No newline at end of file diff --git a/Lagrange.Core/Common/Interface/Api/OperationExt.cs b/Lagrange.Core/Common/Interface/Api/OperationExt.cs index e0f7e1bd5..626f4e9a7 100644 --- a/Lagrange.Core/Common/Interface/Api/OperationExt.cs +++ b/Lagrange.Core/Common/Interface/Api/OperationExt.cs @@ -137,8 +137,8 @@ public static Task SetCustomStatus(this BotContext bot, uint faceId, strin public static Task GroupTransfer(this BotContext bot, uint groupUin, uint targetUin) => bot.ContextCollection.Business.OperationLogic.GroupTransfer(groupUin, targetUin); - public static Task DeleteFriend (this BotContext bot, uint friendUin, bool block) - =>bot.ContextCollection.Business.OperationLogic.DeleteFriend(friendUin, block); + public static Task DeleteFriend(this BotContext bot, uint friendUin, bool block) + => bot.ContextCollection.Business.OperationLogic.DeleteFriend(friendUin, block); public static Task RequestFriend(this BotContext bot, uint targetUin, string question = "", string message = "") => bot.ContextCollection.Business.OperationLogic.RequestFriend(targetUin, question, message); @@ -206,6 +206,9 @@ public static Task GroupClockIn(this BotContext bot, uint public static Task FetchUserInfo(this BotContext bot, uint uin, bool refreshCache = false) => bot.ContextCollection.Business.OperationLogic.FetchUserInfo(uin, refreshCache); + public static Task<(int code, string? message, BotGroupInfo info)> FetchGroupInfo(this BotContext bot, ulong uin) + => bot.ContextCollection.Business.OperationLogic.FetchGroupInfo(uin); + public static Task?> FetchCustomFace(this BotContext bot) => bot.ContextCollection.Business.OperationLogic.FetchCustomFace(); @@ -293,7 +296,7 @@ public static Task UploadImage(this BotContext bot, ImageEntity entity) public static Task<(int Retcode, string Message)> SetPinGroup(this BotContext bot, uint uin, bool isPin) => bot.ContextCollection.Business.OperationLogic.SetPinGroup(uin, isPin); - + public static Task FetchPrivateFSDownload(this BotContext bot, string fileId, string fileHash, uint userId) => bot.ContextCollection.Business.OperationLogic.FetchPrivateFSDownload(fileId, fileHash, userId); } \ No newline at end of file diff --git a/Lagrange.Core/Internal/Context/Logic/Implementation/OperationLogic.cs b/Lagrange.Core/Internal/Context/Logic/Implementation/OperationLogic.cs index e7e94836c..231f4dc2f 100644 --- a/Lagrange.Core/Internal/Context/Logic/Implementation/OperationLogic.cs +++ b/Lagrange.Core/Internal/Context/Logic/Implementation/OperationLogic.cs @@ -222,7 +222,7 @@ public async Task FetchGroupFSDownload(uint groupUin, string fileId) var events = await Collection.Business.SendEvent(groupFSDownloadEvent); return $"{((GroupFSDownloadEvent)events[0]).FileUrl}{fileId}"; } - + public async Task FetchPrivateFSDownload(string fileId, string fileHash, uint userId) { var uid = await Collection.Business.CachingLogic.ResolveUid(null, userId); @@ -620,6 +620,14 @@ public async Task GroupSetSpecialTitle(uint groupUin, uint targetUin, stri return await Collection.Business.CachingLogic.GetCachedUsers(uin, refreshCache); } + public async Task<(int code, string? message, BotGroupInfo info)> FetchGroupInfo(ulong uin) + { + var events = await Collection.Business.SendEvent(GetGroupInfoEvent.Create(uin)); + if (events.Count == 0) return (-1, "No Result", new()); + var @event = (GetGroupInfoEvent)events[0]; + return (@event.ResultCode, @event.Message, @event.Info); + } + public async Task SetMessageReaction(uint groupUin, uint sequence, string code, bool isAdd) { if (isAdd) diff --git a/Lagrange.Core/Internal/Event/Message/GetLatestGroupMessageEvent.cs b/Lagrange.Core/Internal/Event/Message/GetLatestGroupMessageEvent.cs new file mode 100644 index 000000000..69c8009fd --- /dev/null +++ b/Lagrange.Core/Internal/Event/Message/GetLatestGroupMessageEvent.cs @@ -0,0 +1,31 @@ +using Lagrange.Core.Common.Entity; + +namespace Lagrange.Core.Internal.Event.Message; + +internal class GetGroupInfoEvent : ProtocolEvent +{ + public ulong Uin { get; } + + public string? Message { get; } + + public BotGroupInfo Info { get; } + + protected GetGroupInfoEvent(ulong uin) : base(true) + { + Uin = uin; + Info = new(); + } + + protected GetGroupInfoEvent(int code, string? message, BotGroupInfo info) : base(code) + { + Message = message; + Info = info; + } + + public static GetGroupInfoEvent Create(ulong uin) => new(uin); + + public static GetGroupInfoEvent Result(int code, string? message, BotGroupInfo info) + { + return new(code, message, info); + } +} \ No newline at end of file diff --git a/Lagrange.Core/Internal/Packets/Service/Oidb/Request/OidbSvcTrpcTcp0x88D_0.cs b/Lagrange.Core/Internal/Packets/Service/Oidb/Request/OidbSvcTrpcTcp0x88D_0.cs new file mode 100644 index 000000000..94a26b939 --- /dev/null +++ b/Lagrange.Core/Internal/Packets/Service/Oidb/Request/OidbSvcTrpcTcp0x88D_0.cs @@ -0,0 +1,73 @@ +using ProtoBuf; + +namespace Lagrange.Core.Internal.Packets.Service.Oidb.Request; + +#pragma warning disable CS8618 +// ReSharper disable InconsistentNaming + +/// +/// Get Cookie +/// +[ProtoContract] +[OidbSvcTrpcTcp(0x88D, 0)] +internal class OidbSvcTrpcTcp0x88D_0 +{ + [ProtoMember(1)] + public uint Field1 { get; set; } + + [ProtoMember(2)] + public OidbSvcTrpcTcp0x88D_0Config Config { get; set; } +} + +[ProtoContract] +internal class OidbSvcTrpcTcp0x88D_0Config +{ + [ProtoMember(1)] + public ulong Uin { get; set; } + + [ProtoMember(2)] + public OidbSvcTrpcTcp0x88D_0Flags Flags { get; set; } +} + +[ProtoContract] +internal class OidbSvcTrpcTcp0x88D_0Flags +{ + [ProtoMember(1)] + public bool? OwnerUid { get; set; } + + [ProtoMember(2)] + public bool? CreateTime { get; set; } + + [ProtoMember(5)] + public bool? MaxMemberCount { get; set; } + + [ProtoMember(6)] + public bool? MemberCount { get; set; } + + [ProtoMember(10)] + public bool? Level { get; set; } + + [ProtoMember(15)] + public string? Name { get; set; } + + [ProtoMember(16)] + public string? NoticePreview { get; set; } + + [ProtoMember(21)] + public bool? Uin { get; set; } + + [ProtoMember(22)] + public bool? LastSequence { get; set; } + + [ProtoMember(23)] + public bool? LastMessageTime { get; set; } + + [ProtoMember(24)] + public bool? Question { get; set; } + + [ProtoMember(25)] + public string? Answer { get; set; } + + [ProtoMember(29)] + public string? MaxAdminCount { get; set; } +} \ No newline at end of file diff --git a/Lagrange.Core/Internal/Packets/Service/Oidb/Response/OidbSvcTrpcTcp0x88D_0Response.cs b/Lagrange.Core/Internal/Packets/Service/Oidb/Response/OidbSvcTrpcTcp0x88D_0Response.cs new file mode 100644 index 000000000..a3407e4db --- /dev/null +++ b/Lagrange.Core/Internal/Packets/Service/Oidb/Response/OidbSvcTrpcTcp0x88D_0Response.cs @@ -0,0 +1,66 @@ +using ProtoBuf; + +namespace Lagrange.Core.Internal.Packets.Service.Oidb.Request; + +#pragma warning disable CS8618 +// ReSharper disable InconsistentNaming + +[ProtoContract] +internal class OidbSvcTrpcTcp0x88D_0Response +{ + [ProtoMember(1)] + public OidbSvcTrpcTcp0x88D_0ResponseGroupInfo GroupInfo { get; set; } +} + +[ProtoContract] +public class OidbSvcTrpcTcp0x88D_0ResponseGroupInfo +{ + [ProtoMember(1)] + public ulong Uin { get; set; } + + [ProtoMember(2)] + public OidbSvcTrpcTcp0x88D_0ResponseResults Results { get; set; } +} + +[ProtoContract] +public class OidbSvcTrpcTcp0x88D_0ResponseResults +{ + [ProtoMember(1)] + public string OwnerUid { get; set; } + + [ProtoMember(2)] + public ulong CreateTime { get; set; } + + [ProtoMember(5)] + public ulong MaxMemberCount { get; set; } + + [ProtoMember(6)] + public ulong MemberCount { get; set; } + + [ProtoMember(10)] + public ulong Level { get; set; } + + [ProtoMember(15)] + public string Name { get; set; } + + [ProtoMember(16)] + public string NoticePreview { get; set; } + + [ProtoMember(21)] + public ulong Uin { get; set; } + + [ProtoMember(22)] + public ulong LastSequence { get; set; } + + [ProtoMember(23)] + public ulong LastMessageTime { get; set; } + + [ProtoMember(24)] + public string Question { get; set; } + + [ProtoMember(25)] + public string Answer { get; set; } + + [ProtoMember(29)] + public ulong MaxAdminCount { get; set; } +} \ No newline at end of file diff --git a/Lagrange.Core/Internal/Service/Message/GetLatestGroupMessageService.cs b/Lagrange.Core/Internal/Service/Message/GetLatestGroupMessageService.cs new file mode 100644 index 000000000..aab1ebdf6 --- /dev/null +++ b/Lagrange.Core/Internal/Service/Message/GetLatestGroupMessageService.cs @@ -0,0 +1,80 @@ +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.Service.Oidb; +using Lagrange.Core.Internal.Packets.Service.Oidb.Request; +using Lagrange.Core.Utility.Extension; +using ProtoBuf; + +namespace Lagrange.Core.Internal.Service.Message; + +[EventSubscribe(typeof(GetGroupInfoEvent))] +[Service("OidbSvcTrpcTcp.0x88d_0")] +internal class GetGroupInfoService : BaseService +{ + protected override bool Build(GetGroupInfoEvent input, BotKeystore keystore, BotAppInfo appInfo, + BotDeviceInfo device, out Span output, out List>? extraPackets) + { + var packet = new OidbSvcTrpcTcpBase(new OidbSvcTrpcTcp0x88D_0 + { + Field1 = 537099973, + Config = new OidbSvcTrpcTcp0x88D_0Config + { + Uin = input.Uin, + Flags = new OidbSvcTrpcTcp0x88D_0Flags + { + OwnerUid = true, + CreateTime = true, + MaxMemberCount = true, + MemberCount = true, + Level = true, + Name = "", + NoticePreview = "", + Uin = true, + LastSequence = true, + LastMessageTime = true, + Question = true, + Answer = "", + MaxAdminCount = "", + } + } + }); + + output = packet.Serialize(); + extraPackets = null; + return true; + } + + protected override bool Parse(Span input, BotKeystore keystore, BotAppInfo appInfo, BotDeviceInfo device, + out GetGroupInfoEvent output, out List? extraEvents) + { + var payload = Serializer.Deserialize>(input); + + if (payload.ErrorCode == 0) + { + output = GetGroupInfoEvent.Result(0, null, new BotGroupInfo + { + OwnerUid = payload.Body.GroupInfo.Results.OwnerUid, + CreateTime = payload.Body.GroupInfo.Results.CreateTime, + MaxMemberCount = payload.Body.GroupInfo.Results.MaxMemberCount, + MemberCount = payload.Body.GroupInfo.Results.MemberCount, + Level = payload.Body.GroupInfo.Results.Level, + Name = payload.Body.GroupInfo.Results.Name, + NoticePreview = payload.Body.GroupInfo.Results.NoticePreview, + Uin = payload.Body.GroupInfo.Results.Uin, + LastSequence = payload.Body.GroupInfo.Results.LastSequence, + LastMessageTime = payload.Body.GroupInfo.Results.LastMessageTime, + Question = payload.Body.GroupInfo.Results.Question, + Answer = payload.Body.GroupInfo.Results.Answer, + MaxAdminCount = payload.Body.GroupInfo.Results.MaxAdminCount, + }); + } + else + { + output = GetGroupInfoEvent.Result((int)payload.ErrorCode, payload.ErrorMsg, new()); + } + extraEvents = null; + return true; + } +} \ No newline at end of file diff --git a/Lagrange.Core/Utility/Sign/LinuxSigner.cs b/Lagrange.Core/Utility/Sign/LinuxSigner.cs index b51b0e0d5..c819a8a47 100644 --- a/Lagrange.Core/Utility/Sign/LinuxSigner.cs +++ b/Lagrange.Core/Utility/Sign/LinuxSigner.cs @@ -1,10 +1,3 @@ -using System.Net.Http.Json; -using System.Text; -using System.Text.Json; -using System.Text.Json.Nodes; -using Lagrange.Core.Utility.Extension; -using Lagrange.Core.Utility.Network; - namespace Lagrange.Core.Utility.Sign; internal class LinuxSigner : UrlSigner diff --git a/Lagrange.Core/Utility/Sign/MacSigner.cs b/Lagrange.Core/Utility/Sign/MacSigner.cs index d1ac81ca4..69a418bfd 100644 --- a/Lagrange.Core/Utility/Sign/MacSigner.cs +++ b/Lagrange.Core/Utility/Sign/MacSigner.cs @@ -1,9 +1,3 @@ -using System.Net.Http.Json; -using System.Text; -using System.Text.Json; -using System.Text.Json.Nodes; -using Lagrange.Core.Utility.Extension; - namespace Lagrange.Core.Utility.Sign; internal class MacSigner : UrlSigner diff --git a/Lagrange.Core/Utility/Sign/WindowsSigner.cs b/Lagrange.Core/Utility/Sign/WindowsSigner.cs index 8abda8a43..d67316b74 100644 --- a/Lagrange.Core/Utility/Sign/WindowsSigner.cs +++ b/Lagrange.Core/Utility/Sign/WindowsSigner.cs @@ -1,9 +1,3 @@ -using System.Net.Http.Json; -using System.Text; -using System.Text.Json; -using System.Text.Json.Nodes; -using Lagrange.Core.Utility.Extension; - namespace Lagrange.Core.Utility.Sign; internal class WindowsSigner : UrlSigner diff --git a/Lagrange.OneBot/Core/Entity/OneBotStranger.cs b/Lagrange.OneBot/Core/Entity/OneBotStranger.cs index 638ccba4d..f1a732796 100644 --- a/Lagrange.OneBot/Core/Entity/OneBotStranger.cs +++ b/Lagrange.OneBot/Core/Entity/OneBotStranger.cs @@ -1,5 +1,4 @@ using System.Text.Json.Serialization; -using Lagrange.Core.Common.Entity; namespace Lagrange.OneBot.Core.Entity; diff --git a/Lagrange.OneBot/Core/Entity/OnebotBusiness.cs b/Lagrange.OneBot/Core/Entity/OnebotBusiness.cs index ba5e723a4..82b381d94 100644 --- a/Lagrange.OneBot/Core/Entity/OnebotBusiness.cs +++ b/Lagrange.OneBot/Core/Entity/OnebotBusiness.cs @@ -1,5 +1,4 @@ using System.Text.Json.Serialization; -using Lagrange.Core.Common.Entity; namespace Lagrange.OneBot.Core.Entity; diff --git a/Lagrange.OneBot/Core/Operation/Converters/ForwardConverter.cs b/Lagrange.OneBot/Core/Operation/Converters/ForwardConverter.cs index d3976174e..8d4d9348c 100644 --- a/Lagrange.OneBot/Core/Operation/Converters/ForwardConverter.cs +++ b/Lagrange.OneBot/Core/Operation/Converters/ForwardConverter.cs @@ -1,5 +1,3 @@ -using System.Buffers; -using System.Buffers.Text; using System.Text.Json; using System.Text.Json.Serialization; diff --git a/Lagrange.OneBot/Core/Operation/Converters/NullIfEmptyConverter.cs b/Lagrange.OneBot/Core/Operation/Converters/NullIfEmptyConverter.cs index eae49f967..a3343b32d 100644 --- a/Lagrange.OneBot/Core/Operation/Converters/NullIfEmptyConverter.cs +++ b/Lagrange.OneBot/Core/Operation/Converters/NullIfEmptyConverter.cs @@ -1,5 +1,4 @@ -using System; -using System.Text.Json; +using System.Text.Json; using System.Text.Json.Serialization; namespace Lagrange.OneBot.Core.Operation.Converters; diff --git a/Lagrange.OneBot/Core/Operation/Message/GetForwardMsgOperation.cs b/Lagrange.OneBot/Core/Operation/Message/GetForwardMsgOperation.cs index a0b6554f5..4b1e246ce 100644 --- a/Lagrange.OneBot/Core/Operation/Message/GetForwardMsgOperation.cs +++ b/Lagrange.OneBot/Core/Operation/Message/GetForwardMsgOperation.cs @@ -2,7 +2,6 @@ using System.Text.Json.Nodes; using Lagrange.Core; using Lagrange.Core.Common.Interface.Api; -using Lagrange.Core.Internal.Event.Message; using Lagrange.OneBot.Core.Entity.Action; using Lagrange.OneBot.Core.Entity.Action.Response; using Lagrange.OneBot.Core.Entity.Message; diff --git a/Lagrange.OneBot/Core/Operation/Message/GetMusicArkOperation.cs b/Lagrange.OneBot/Core/Operation/Message/GetMusicArkOperation.cs index f16609dc6..8cf1a22b1 100644 --- a/Lagrange.OneBot/Core/Operation/Message/GetMusicArkOperation.cs +++ b/Lagrange.OneBot/Core/Operation/Message/GetMusicArkOperation.cs @@ -1,5 +1,4 @@ using System.Net.Http.Json; -using System.Text; using System.Text.Json; using System.Text.Json.Nodes; using System.Text.Json.Serialization; diff --git a/Lagrange.OneBot/Core/Operation/Message/MessageCommon.cs b/Lagrange.OneBot/Core/Operation/Message/MessageCommon.cs index af7358f70..41e97d328 100644 --- a/Lagrange.OneBot/Core/Operation/Message/MessageCommon.cs +++ b/Lagrange.OneBot/Core/Operation/Message/MessageCommon.cs @@ -2,7 +2,6 @@ using System.Text.Json; using System.Text.RegularExpressions; using Lagrange.Core; -using Lagrange.Core.Common.Entity; using Lagrange.Core.Message; using Lagrange.Core.Utility.Extension; using Lagrange.OneBot.Core.Entity;