From 20b656e0755b51a0a3e524dd1cbee64ec5bb0fc2 Mon Sep 17 00:00:00 2001 From: RikaCelery <94585272+RikaCelery@users.noreply.github.com> Date: Mon, 20 Jan 2025 14:38:54 +0800 Subject: [PATCH] [OneBot] get_rkey (#742) --- .../Internal/Event/System/FetchRKeyEvent.cs | 16 +++++----- .../Service/System/FetchRKeyService.cs | 4 +-- .../Action/Response/OneBotGetRkeyResponse.cs | 18 +++++++++++ .../Core/Operation/Generic/GetRkey.cs | 30 +++++++++++++++++++ 4 files changed, 58 insertions(+), 10 deletions(-) create mode 100644 Lagrange.OneBot/Core/Entity/Action/Response/OneBotGetRkeyResponse.cs create mode 100644 Lagrange.OneBot/Core/Operation/Generic/GetRkey.cs diff --git a/Lagrange.Core/Internal/Event/System/FetchRKeyEvent.cs b/Lagrange.Core/Internal/Event/System/FetchRKeyEvent.cs index 232a65457..488a1e315 100644 --- a/Lagrange.Core/Internal/Event/System/FetchRKeyEvent.cs +++ b/Lagrange.Core/Internal/Event/System/FetchRKeyEvent.cs @@ -1,19 +1,19 @@ +using Lagrange.Core.Internal.Packets.Service.Oidb.Common; + namespace Lagrange.Core.Internal.Event.System; internal class FetchRKeyEvent : ProtocolEvent { - public List RKeys { get; } = new(); + public List RKeys { get; } = new(); - private FetchRKeyEvent() : base(true) - { - } + private FetchRKeyEvent() : base(true) { } - private FetchRKeyEvent(int resultCode, List rKeys) : base(resultCode) + private FetchRKeyEvent(int resultCode, List rKeys) : base(resultCode) { RKeys = rKeys; } - + public static FetchRKeyEvent Create() => new(); - - public static FetchRKeyEvent Result(int resultCode, List rKeys) => new(resultCode, rKeys); + + public static FetchRKeyEvent Result(int resultCode, List rKeys) => new(resultCode, rKeys); } \ No newline at end of file diff --git a/Lagrange.Core/Internal/Service/System/FetchRKeyService.cs b/Lagrange.Core/Internal/Service/System/FetchRKeyService.cs index 74023ce6a..3dd0934f7 100644 --- a/Lagrange.Core/Internal/Service/System/FetchRKeyService.cs +++ b/Lagrange.Core/Internal/Service/System/FetchRKeyService.cs @@ -43,12 +43,12 @@ protected override bool Build(FetchRKeyEvent input, BotKeystore keystore, BotApp return true; } - protected override bool Parse(Span input, BotKeystore keystore, BotAppInfo appInfo, BotDeviceInfo device, + protected override bool Parse(Span input, BotKeystore keystore, BotAppInfo appInfo, BotDeviceInfo device, out FetchRKeyEvent output, out List? extraEvents) { var payload = Serializer.Deserialize>(input); - output = FetchRKeyEvent.Result((int)payload.ErrorCode, payload.Body.DownloadRKey.RKeys.Select(x => x.Rkey).ToList()); + output = FetchRKeyEvent.Result((int)payload.ErrorCode, payload.Body.DownloadRKey.RKeys); extraEvents = null; return true; } diff --git a/Lagrange.OneBot/Core/Entity/Action/Response/OneBotGetRkeyResponse.cs b/Lagrange.OneBot/Core/Entity/Action/Response/OneBotGetRkeyResponse.cs new file mode 100644 index 000000000..e57874fdb --- /dev/null +++ b/Lagrange.OneBot/Core/Entity/Action/Response/OneBotGetRkeyResponse.cs @@ -0,0 +1,18 @@ +using System.Text.Json.Serialization; + +namespace Lagrange.OneBot.Core.Entity.Action.Response; + +[Serializable] +public class OneBotGetRkeyResponse(List rkeys) +{ + [JsonPropertyName("rkeys")] public List Rkeys { get; set; } = rkeys; +} + +[Serializable] +public class OneBotRkey +{ + [JsonPropertyName("type")] public string? Type { get; set; } + [JsonPropertyName("rkey")] public string? Rkey { get; set; } + [JsonPropertyName("created_at")] public uint? CreateTime { get; set; } + [JsonPropertyName("ttl")] public ulong? TtlSeconds { get; set; } +} \ No newline at end of file diff --git a/Lagrange.OneBot/Core/Operation/Generic/GetRkey.cs b/Lagrange.OneBot/Core/Operation/Generic/GetRkey.cs new file mode 100644 index 000000000..71bfd5dd8 --- /dev/null +++ b/Lagrange.OneBot/Core/Operation/Generic/GetRkey.cs @@ -0,0 +1,30 @@ +using System.Text.Json.Nodes; +using Lagrange.Core; +using Lagrange.Core.Internal.Event.System; +using Lagrange.OneBot.Core.Entity.Action; +using Lagrange.OneBot.Core.Entity.Action.Response; + +namespace Lagrange.OneBot.Core.Operation.Generic; + +[Operation("get_rkey")] +public class GetRkey : IOperation +{ + public async Task HandleOperation(BotContext context, JsonNode? payload) + { + var fetchRKeyEvent = FetchRKeyEvent.Create(); + var events = await context.ContextCollection.Business.SendEvent(fetchRKeyEvent); + var rKeyEvent = (FetchRKeyEvent)events[0]; + if (rKeyEvent.ResultCode != 0) return new OneBotResult(null, rKeyEvent.ResultCode, "failed"); + var response = new OneBotGetRkeyResponse(rKeyEvent.RKeys.Select(x => new OneBotRkey + { + Type = x.Type == 10 + ? "private" + : "group", + Rkey = x.Rkey, + CreateTime = x.RkeyCreateTime, + TtlSeconds = x.RkeyTtlSec + }) + .ToList()); + return new OneBotResult(response, 0, "ok"); + } +} \ No newline at end of file