From 45d216d18f08c2d5310606f2345c5efce9e0635e Mon Sep 17 00:00:00 2001 From: sisi0318 Date: Fri, 11 Oct 2024 22:11:52 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E8=87=AA=E5=AE=9A=E4=B9=89?= =?UTF-8?q?=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Lagrange.Core/Common/Entity/BotUserInfo.cs | 8 ++- .../Oidb/Generics/OidbFriendProperty.cs | 1 + .../Oidb/Generics/OidbFriendPropertybyte.cs | 14 ++++ .../Response/OidbSvcTrpcTcp0xFE1_2Response.cs | 6 +- .../Service/System/FetchUserInfoService.cs | 66 ++++++++++++++++--- .../Info/GetStrangerInfoOperation.cs | 5 ++ 6 files changed, 87 insertions(+), 13 deletions(-) create mode 100644 Lagrange.Core/Internal/Packets/Service/Oidb/Generics/OidbFriendPropertybyte.cs diff --git a/Lagrange.Core/Common/Entity/BotUserInfo.cs b/Lagrange.Core/Common/Entity/BotUserInfo.cs index 4be4ec439..2163bf468 100644 --- a/Lagrange.Core/Common/Entity/BotUserInfo.cs +++ b/Lagrange.Core/Common/Entity/BotUserInfo.cs @@ -3,10 +3,11 @@ namespace Lagrange.Core.Common.Entity; [Serializable] public class BotUserInfo { - internal BotUserInfo(uint uin, string nickname, DateTime birthday, string city, string country, string school, uint age, DateTime registerTime, uint gender, string? qid, uint level, string sign,uint status) + internal BotUserInfo(uint uin, string nickname, string avatar, DateTime birthday, string city, string country, string school, uint age, DateTime registerTime, uint gender, string? qid, uint level, string sign, uint status, object[] customarray) { Uin = uin; - Avatar = $"https://q1.qlogo.cn/g?b=qq&nk={Uin}&s=640"; + Avatar = avatar; + // Avatar = $"https://q1.qlogo.cn/g?b=qq&nk={Uin}&s=640"; Nickname = nickname; Birthday = birthday; City = city; @@ -19,6 +20,7 @@ internal BotUserInfo(uint uin, string nickname, DateTime birthday, string city, Level = level; Sign = sign; Status = status; + Customarray = customarray; } public uint Uin { get; set; } @@ -49,6 +51,8 @@ internal BotUserInfo(uint uin, string nickname, DateTime birthday, string city, public uint Status { get; set; } + public object[] Customarray { get; set; } + public enum GenderInfo { Unset = 0, diff --git a/Lagrange.Core/Internal/Packets/Service/Oidb/Generics/OidbFriendProperty.cs b/Lagrange.Core/Internal/Packets/Service/Oidb/Generics/OidbFriendProperty.cs index 9b8e2159c..5f0902278 100644 --- a/Lagrange.Core/Internal/Packets/Service/Oidb/Generics/OidbFriendProperty.cs +++ b/Lagrange.Core/Internal/Packets/Service/Oidb/Generics/OidbFriendProperty.cs @@ -10,4 +10,5 @@ internal class OidbFriendProperty [ProtoMember(1)] public uint Code { get; set; } [ProtoMember(2)] public string Value { get; set; } + } \ No newline at end of file diff --git a/Lagrange.Core/Internal/Packets/Service/Oidb/Generics/OidbFriendPropertybyte.cs b/Lagrange.Core/Internal/Packets/Service/Oidb/Generics/OidbFriendPropertybyte.cs new file mode 100644 index 000000000..6c98b988e --- /dev/null +++ b/Lagrange.Core/Internal/Packets/Service/Oidb/Generics/OidbFriendPropertybyte.cs @@ -0,0 +1,14 @@ +using ProtoBuf; + +namespace Lagrange.Core.Internal.Packets.Service.Oidb.Generics; + +#pragma warning disable CS8618 + +[ProtoContract] +internal class OidbFriendPropertybyte +{ + [ProtoMember(1)] public uint Code { get; set; } + + [ProtoMember(2)] public byte[] Value { get; set; } + +} \ No newline at end of file diff --git a/Lagrange.Core/Internal/Packets/Service/Oidb/Response/OidbSvcTrpcTcp0xFE1_2Response.cs b/Lagrange.Core/Internal/Packets/Service/Oidb/Response/OidbSvcTrpcTcp0xFE1_2Response.cs index 0e7f04968..62a561ba9 100644 --- a/Lagrange.Core/Internal/Packets/Service/Oidb/Response/OidbSvcTrpcTcp0xFE1_2Response.cs +++ b/Lagrange.Core/Internal/Packets/Service/Oidb/Response/OidbSvcTrpcTcp0xFE1_2Response.cs @@ -28,5 +28,7 @@ internal class OidbSvcTrpcTcp0xFE1_2ResponseProperty { [ProtoMember(1)] public List NumberProperties { get; set; } - [ProtoMember(2)] public List StringProperties { get; set; } -} \ No newline at end of file + [ProtoMember(2)] public List StringProperties { get; set; } + +} + diff --git a/Lagrange.Core/Internal/Service/System/FetchUserInfoService.cs b/Lagrange.Core/Internal/Service/System/FetchUserInfoService.cs index b20101630..9d2a41347 100644 --- a/Lagrange.Core/Internal/Service/System/FetchUserInfoService.cs +++ b/Lagrange.Core/Internal/Service/System/FetchUserInfoService.cs @@ -21,13 +21,16 @@ protected override bool Build(FetchUserInfoEvent input, BotKeystore keystore, Bo { var keys = new List { 20002, 27394, 20009, 20031, 101, 103, 102, 20022, 20023, 20024, 24002, 27037, 27049, 20011, 20016, 20021, 20003, 20004, 20005, 20006, 20020, 20026, 24007, 104, 105, 42432, 42362, 41756, 41757, 42257, 27372, 42315, 107, 45160, 45161, 27406, 62026, 20037 }; + // 27406 自定义状态文本 + // 27372 状态 + object packet = input.Uid == null ? new OidbSvcTrpcTcpBase(new OidbSvcTrpcTcp0xFE1_2Uin { Uin = input.Uin, Field2 = 0, Keys = keys.Select(x => new OidbSvcTrpcTcp0xFE1_2Key { Key = x }).ToList() - }, 0xfe1, 2, false, true) + }, 0xfe1, 2, false, true) : new OidbSvcTrpcTcpBase(new OidbSvcTrpcTcp0xFE1_2 { Uid = input.Uid, @@ -44,14 +47,44 @@ protected override bool Parse(Span input, BotKeystore keystore, BotAppInfo out FetchUserInfoEvent output, out List? extraEvents) { var payload = Serializer.Deserialize>(input); - + var str = GetStringProperties(payload.Body.Body.Properties); var num = GetNumberProperties(payload.Body.Body.Properties); - var birthday = GetBirthday(str[20031]); + //如果是嵌套proto就Serializer.Deserialize(Value)如果是String就Encoding.UTF8.GetString(Value) + + var birthday = GetBirthday(Encoding.UTF8.GetString(str[20031])); var reg = DateTime.UnixEpoch.AddSeconds(num[20026]); - string? qid = str.GetValueOrDefault(27394); - var info = new BotUserInfo(payload.Body.Body.Uin, str[20002], birthday, str[20020], str[20003], str[20021], num[20037], reg, num[20009], qid, num[105] , str[102] , num[27372]); + + string? qid = Encoding.UTF8.GetString(str[27394]); + + byte[] custom = str[27406]; + + CustomStatus customs; + using (var stream = new MemoryStream(custom)) + { + customs = Serializer.Deserialize(stream); + } + object[] customarray = new object[] { customs.FaceId, customs.Msg ?? "" }; + + byte[] avatar = str[101]; + Avatar avatars; + using (var stream = new MemoryStream(avatar)) + { + avatars = Serializer.Deserialize(stream); + } + string? avatarurl = avatars.Url + "640"; + + + string? nickname = Encoding.UTF8.GetString(str[20002]); + string? city = Encoding.UTF8.GetString(str[20020]); + string? country = Encoding.UTF8.GetString(str[20003]); + string? school = Encoding.UTF8.GetString(str[20021]); + string? sign = Encoding.UTF8.GetString(str[102]); + + + + var info = new BotUserInfo(payload.Body.Body.Uin, nickname, avatarurl, birthday, city, country, school, num[20037], reg, num[20009], qid, num[105], sign, num[27372], customarray); output = FetchUserInfoEvent.Result(0, info); extraEvents = null; @@ -70,10 +103,10 @@ private static DateTime GetBirthday(String birthday) } return new DateTime(1970, 1, 1); } - - private static Dictionary GetStringProperties(OidbSvcTrpcTcp0xFE1_2ResponseProperty properties) + + private static Dictionary GetStringProperties(OidbSvcTrpcTcp0xFE1_2ResponseProperty properties) { - var result = new Dictionary(); + var result = new Dictionary(); foreach (var property in properties.StringProperties) { result[property.Code] = property.Value; @@ -81,7 +114,7 @@ private static Dictionary GetStringProperties(OidbSvcTrpcTcp0xFE1_ return result; } - + private static Dictionary GetNumberProperties(OidbSvcTrpcTcp0xFE1_2ResponseProperty properties) { var result = new Dictionary(); @@ -92,4 +125,19 @@ private static Dictionary GetNumberProperties(OidbSvcTrpcTcp0xFE1_2R return result; } + + [ProtoContract] + public class CustomStatus + { + [ProtoMember(1)] public uint FaceId { get; set; } + + [ProtoMember(2)] public string? Msg { get; set; } + } + + [ProtoContract] + public class Avatar + { + [ProtoMember(5)] public string? Url { get; set; } + } + } \ No newline at end of file diff --git a/Lagrange.OneBot/Core/Operation/Info/GetStrangerInfoOperation.cs b/Lagrange.OneBot/Core/Operation/Info/GetStrangerInfoOperation.cs index 4c185219c..e253044f9 100644 --- a/Lagrange.OneBot/Core/Operation/Info/GetStrangerInfoOperation.cs +++ b/Lagrange.OneBot/Core/Operation/Info/GetStrangerInfoOperation.cs @@ -68,6 +68,11 @@ public async Task HandleOperation(BotContext context, JsonNode? pa mask = (uint)((int)mask >> 31); status -= 268435456 & mask; string? Statusmsg = StatusArray.TryGetValue(status, out string? value) ? value : "未知状态"; + + if (status == 13633281) + { + Statusmsg = "[自定义状态]" + info.Customarray[1]; + } return new OneBotResult(new OneBotStranger { UserId = info.Uin,