From a206b0077ce73b696eb0a4f819aff7dd3ecf559f Mon Sep 17 00:00:00 2001 From: Mrs4s Date: Sat, 11 Dec 2021 02:34:32 +0800 Subject: [PATCH] feat: update FetchGuildMemberProfileInfo api --- client/guild.go | 82 ++++++++++++++++++--------------- client/pb/channel/unknown.pb.go | 47 ++++++++++++++++--- client/pb/channel/unknown.proto | 11 ++++- 3 files changed, 95 insertions(+), 45 deletions(-) diff --git a/client/guild.go b/client/guild.go index 5f10138e..21b4271e 100644 --- a/client/guild.go +++ b/client/guild.go @@ -59,6 +59,7 @@ type ( OwnerId uint64 } + // GuildMemberInfo 频道成员信息, 仅通过频道成员列表API获取 GuildMemberInfo struct { TinyId uint64 Title string @@ -74,6 +75,7 @@ type ( Nickname string AvatarUrl string JoinTime int64 // 只有 GetGuildMemberProfileInfo 函数才会有 + Roles []*GuildRole } // GuildRole 频道身份组信息 @@ -266,7 +268,8 @@ func (s *GuildService) FetchGuildMemberListWithRole(guildId, channelId uint64, s }, nil } -func (s *GuildService) GetGuildMemberProfileInfo(guildId, tinyId uint64) (*GuildUserProfile, error) { +// FetchGuildMemberProfileInfo 获取单个频道成员资料 +func (s *GuildService) FetchGuildMemberProfileInfo(guildId, tinyId uint64) (*GuildUserProfile, error) { seq := s.c.nextSeq() flags := binary.DynamicProtoMessage{} for i := 3; i <= 29; i++ { @@ -288,12 +291,17 @@ func (s *GuildService) GetGuildMemberProfileInfo(guildId, tinyId uint64) (*Guild if err = s.c.unpackOIDBPackage(rsp, body); err != nil { return nil, errors.Wrap(err, "decode packet error") } + roles, err := s.fetchMemberRoles(guildId, tinyId) + if err != nil { + return nil, errors.Wrap(err, "fetch roles error") + } // todo: 解析个性档案 return &GuildUserProfile{ TinyId: tinyId, Nickname: body.Profile.GetNickname(), AvatarUrl: body.Profile.GetAvatarUrl(), JoinTime: body.Profile.GetJoinTime(), + Roles: roles, }, nil } @@ -325,42 +333,6 @@ func (s *GuildService) GetGuildRoles(guildId uint64) ([]*GuildRole, error) { return roles, nil } -func (s *GuildService) GetUserRoles(guildId uint64, userId uint64) ([]*GuildRole, error) { - seq := s.c.nextSeq() - u1 := uint32(1) - packet := packets.BuildUniPacket(s.c.Uin, seq, "OidbSvcTrpcTcp.0x1017_1", 1, s.c.OutGoingPacketSessionId, []byte{}, s.c.sigInfo.d2Key, - s.c.packOIDBPackageDynamically(4119, 1, binary.DynamicProtoMessage{ - 1: guildId, - 2: userId, - 4: binary.DynamicProtoMessage{ - 1: u1, - 2: u1, - 3: u1, - }, - })) - rsp, err := s.c.sendAndWaitDynamic(seq, packet) - if err != nil { - return nil, errors.Wrap(err, "send packet error") - } - body := new(channel.ChannelOidb0X1017Rsp) - if err = s.c.unpackOIDBPackage(rsp, body); err != nil { - return nil, errors.Wrap(err, "decode packet error") - } - p1 := body.GetP1() - if p1 == nil { - return nil, errors.New("packet OidbSvcTrpcTcp.0x1017_1: decode p1 error") - } - roles := make([]*GuildRole, 0, len(p1.GetRoles())) - for _, role := range p1.GetRoles() { - roles = append(roles, &GuildRole{ - RoleId: role.GetRoleId(), - RoleName: role.GetName(), - ArgbColor: role.GetArgbColor(), - }) - } - return roles, nil -} - func (s *GuildService) CreateGuildRole(guildId uint64, name string, color uint32, independent bool, initialUsers []uint64) (uint64, error) { seq := s.c.nextSeq() u1 := uint32(1) @@ -656,6 +628,42 @@ func (s *GuildService) PostTopicChannelFeed(guildId, channelId uint64, feed *top return errors.New("post feed error") } +func (s *GuildService) fetchMemberRoles(guildId uint64, tinyId uint64) ([]*GuildRole, error) { + seq := s.c.nextSeq() + u1 := uint32(1) + packet := packets.BuildUniPacket(s.c.Uin, seq, "OidbSvcTrpcTcp.0x1017_1", 1, s.c.OutGoingPacketSessionId, []byte{}, s.c.sigInfo.d2Key, + s.c.packOIDBPackageDynamically(4119, 1, binary.DynamicProtoMessage{ + 1: guildId, + 2: tinyId, + 4: binary.DynamicProtoMessage{ + 1: u1, + 2: u1, + 3: u1, + }, + })) + rsp, err := s.c.sendAndWaitDynamic(seq, packet) + if err != nil { + return nil, errors.Wrap(err, "send packet error") + } + body := new(channel.ChannelOidb0X1017Rsp) + if err = s.c.unpackOIDBPackage(rsp, body); err != nil { + return nil, errors.Wrap(err, "decode packet error") + } + p1 := body.GetP1() + if p1 == nil { + return nil, errors.New("packet OidbSvcTrpcTcp.0x1017_1: decode p1 error") + } + roles := make([]*GuildRole, 0, len(p1.GetRoles())) + for _, role := range p1.GetRoles() { + roles = append(roles, &GuildRole{ + RoleId: role.GetRoleId(), + RoleName: role.GetName(), + ArgbColor: role.GetArgbColor(), + }) + } + return roles, nil +} + /* need analysis func (s *GuildService) fetchChannelListState(guildId uint64, channels []*ChannelInfo) { seq := s.c.nextSeq() diff --git a/client/pb/channel/unknown.pb.go b/client/pb/channel/unknown.pb.go index 7d5344d3..a8f4a0ae 100644 --- a/client/pb/channel/unknown.pb.go +++ b/client/pb/channel/unknown.pb.go @@ -138,18 +138,18 @@ func (x *ChannelOidb0X1017Rsp) GetP1() *P10X1017 { } type P10X1017 struct { - UserId *uint64 `protobuf:"varint,1,opt"` - Roles []*GuildRole `protobuf:"bytes,3,rep"` + TinyId *uint64 `protobuf:"varint,1,opt"` + Roles []*GuildUserRole `protobuf:"bytes,3,rep"` } -func (x *P10X1017) GetUserId() uint64 { - if x != nil && x.UserId != nil { - return *x.UserId +func (x *P10X1017) GetTinyId() uint64 { + if x != nil && x.TinyId != nil { + return *x.TinyId } return 0 } -func (x *P10X1017) GetRoles() []*GuildRole { +func (x *P10X1017) GetRoles() []*GuildUserRole { if x != nil { return x.Roles } @@ -407,6 +407,41 @@ func (x *GuildRole) GetMaxNum() int32 { return 0 } +type GuildUserRole struct { + RoleId *uint64 `protobuf:"varint,1,opt"` + Name *string `protobuf:"bytes,2,opt"` + ArgbColor *uint32 `protobuf:"varint,3,opt"` + Independent *int32 `protobuf:"varint,4,opt"` +} + +func (x *GuildUserRole) GetRoleId() uint64 { + if x != nil && x.RoleId != nil { + return *x.RoleId + } + return 0 +} + +func (x *GuildUserRole) GetName() string { + if x != nil && x.Name != nil { + return *x.Name + } + return "" +} + +func (x *GuildUserRole) GetArgbColor() uint32 { + if x != nil && x.ArgbColor != nil { + return *x.ArgbColor + } + return 0 +} + +func (x *GuildUserRole) GetIndependent() int32 { + if x != nil && x.Independent != nil { + return *x.Independent + } + return 0 +} + type GuildMeta struct { GuildCode *uint64 `protobuf:"varint,2,opt"` CreateTime *int64 `protobuf:"varint,4,opt"` diff --git a/client/pb/channel/unknown.proto b/client/pb/channel/unknown.proto index e0b855b5..483b23f5 100644 --- a/client/pb/channel/unknown.proto +++ b/client/pb/channel/unknown.proto @@ -42,8 +42,8 @@ message ChannelOidb0x1017Rsp { } message P10x1017 { - optional uint64 userId = 1; - repeated GuildRole roles = 3; + optional uint64 tinyId = 1; + repeated GuildUserRole roles = 3; } message ChannelOidb0x1019Rsp { @@ -131,6 +131,13 @@ message GuildRole { // 9: ? } +message GuildUserRole { + optional uint64 roleId = 1; + optional string name = 2; + optional uint32 argbColor = 3; + optional int32 independent = 4; +} + /* message SetGuildRole { optional uint64 roleId = 1;