diff --git a/client/builders.go b/client/builders.go index 05ccb95..28af439 100644 --- a/client/builders.go +++ b/client/builders.go @@ -7,6 +7,7 @@ import ( "github.com/ProtocolScience/AstralGo/client/internal/auth" "github.com/ProtocolScience/AstralGo/client/pb/cmd0x6ff" "github.com/ProtocolScience/AstralGo/client/pb/nt/media" + "github.com/ProtocolScience/AstralGo/client/pb/nt/oidb/oidbSvcTrpcTcp0x1250_0" "github.com/ProtocolScience/AstralGo/client/pb/nt/oidb/oidbSvcTrpcTcp0x8FC_2" "github.com/ProtocolScience/AstralGo/client/pb/nt/oidb/oidbSvcTrpcTcp0xFD4_1" "github.com/ProtocolScience/AstralGo/client/pb/nt/oidb/oidbSvcTrpcTcp0xFE1_2" @@ -1443,6 +1444,27 @@ func (c *QQClient) buildAppInfoRequestPacket(id string) (uint16, []byte) { } */ +func (c *QQClient) buildFriendRelationPacket(uin int64) (uint16, []byte) { + + request := &oidbSvcTrpcTcp0x1250_0.Request{ + TargetUin: uin, + Field3: 1, + Field6: 1, + RelationInfo: &oidbSvcTrpcTcp0x1250_0.RelationInfo{ + UinInfo: &oidbSvcTrpcTcp0x1250_0.UinInfo{ + SelfUin: c.Uin, + TargetUin: uin, + }, + Field5: 3436, + }, + } + + b, _ := proto.Marshal(request) + payload := c.packOIDBPackage(0x1250, 0, b) + return c.uniPacket("OidbSvcTrpcTcp.0x1250_0", payload) + +} + func (c *QQClient) buildWordSegmentationPacket(data []byte) (uint16, []byte) { payload := c.packOIDBPackageProto(3449, 1, &oidb.D79ReqBody{ Uin: uint64(c.Uin), diff --git a/client/client.go b/client/client.go index 55baa5a..f54a5bb 100644 --- a/client/client.go +++ b/client/client.go @@ -678,6 +678,17 @@ func (c *QQClient) getGroupMembers(group *GroupInfo, interner *intern.StringInte } }*/ +func (c *QQClient) GetFriendRelation(target int64) (*FriendRelation, error) { + rsp, err := c.sendAndWait(c.buildFriendRelationPacket(target)) + if err != nil { + return nil, err + } + if rsp == nil { + return nil, errors.New("friend relation is unavailable: rsp is nil") + } + return rsp.(*FriendRelation), nil +} + func (c *QQClient) getGroupMembers(group *GroupInfo, interner *intern.StringInterner) ([]*GroupMemberInfo, error) { var nextUin int64 var list []*GroupMemberInfo diff --git a/client/friend-relation.go b/client/friend-relation.go new file mode 100644 index 0000000..c806c51 --- /dev/null +++ b/client/friend-relation.go @@ -0,0 +1,25 @@ +package client + +type ( + FriendRelation struct { + FriendAddInfo *FriendAddInfo + CommonGroupInfo *CommonGroupInfoList + } + + FriendAddInfo struct { + Reason string + } + + CommonGroupInfoList struct { + CommonGroupInfo []*CommonGroupInfo + SpecialGroupInfo *CommonGroupInfo + Reason string + } + + CommonGroupInfo struct { + GroupUin int64 + GroupId int64 + GroupName string + Timestamp int64 + } +) diff --git a/client/nt.go b/client/nt.go index 9e4a213..928bca7 100644 --- a/client/nt.go +++ b/client/nt.go @@ -10,6 +10,7 @@ import ( "github.com/ProtocolScience/AstralGo/client/pb/notify" "github.com/ProtocolScience/AstralGo/client/pb/nt/event" ntMsg "github.com/ProtocolScience/AstralGo/client/pb/nt/message" + "github.com/ProtocolScience/AstralGo/client/pb/nt/oidb/oidbSvcTrpcTcp0x1250_0" "github.com/ProtocolScience/AstralGo/client/pb/nt/oidb/oidbSvcTrpcTcp0xFD4_1" "github.com/ProtocolScience/AstralGo/client/pb/nt/oidb/oidbSvcTrpcTcp0xFE1_2" "github.com/ProtocolScience/AstralGo/client/pb/nt/oidb/oidbSvcTrpcTcp0xFE5_2" @@ -57,6 +58,7 @@ var NTDecoders = map[string]func(*QQClient, *network.Packet) (any, error){ "OidbSvcTrpcTcp.0x126e_100": decodeNewTechMediaResponse, "OidbSvcTrpcTcp.0x126e_200": decodeNewTechMediaResponse, "OidbSvcTrpcTcp.0x9067_202": decodeNewTechMediaResponse, + "OidbSvcTrpcTcp.0x1250_0": decodeNewTechFriendRelationResponse, } func init() { @@ -147,6 +149,41 @@ func decodeNewTechGetTroopListSimplyResponse(c *QQClient, pkt *network.Packet) ( } return l, nil } + +func decodeNewTechFriendRelationResponse(_ *QQClient, pkt *network.Packet) (any, error) { + rsp := oidbSvcTrpcTcp0x1250_0.Response{} + err := unpackOIDBPackage(pkt.Payload, &rsp) + if err != nil { + return nil, err + } + groupList := make([]*CommonGroupInfo, 0, len(rsp.CommonGroupInfo.CommonGroupInfo)) + for _, g := range rsp.CommonGroupInfo.CommonGroupInfo { + groupList = append(groupList, &CommonGroupInfo{ + GroupUin: g.GroupUin, + GroupId: g.GroupId, + GroupName: g.GroupName, + Timestamp: g.Timestamp, + }) + } + specialGroup := &CommonGroupInfo{ + GroupUin: rsp.CommonGroupInfo.SpecialGroupInfo.GroupUin, + GroupId: rsp.CommonGroupInfo.SpecialGroupInfo.GroupId, + GroupName: rsp.CommonGroupInfo.SpecialGroupInfo.GroupName, + Timestamp: rsp.CommonGroupInfo.SpecialGroupInfo.Timestamp, + } + + return &FriendRelation{ + FriendAddInfo: &FriendAddInfo{ + Reason: rsp.FriendAddInfo.Reason, + }, + CommonGroupInfo: &CommonGroupInfoList{ + CommonGroupInfo: groupList, + SpecialGroupInfo: specialGroup, + Reason: rsp.CommonGroupInfo.Reason, + }, + }, nil +} + func decodeNewTechGetTroopMemberListResponse(_ *QQClient, pkt *network.Packet) (any, error) { rsp := oidbSvcTrpcTcp0xFE7_3.Response{} err := unpackOIDBPackage(pkt.Payload, &rsp) diff --git a/client/pb/nt/oidb/oidbSvcTrpcTcp0x1250_0/oidbSvcTrpcTcp0x1250_0.pb.go b/client/pb/nt/oidb/oidbSvcTrpcTcp0x1250_0/oidbSvcTrpcTcp0x1250_0.pb.go new file mode 100644 index 0000000..3c93fae --- /dev/null +++ b/client/pb/nt/oidb/oidbSvcTrpcTcp0x1250_0/oidbSvcTrpcTcp0x1250_0.pb.go @@ -0,0 +1,51 @@ +// Code generated by protoc-gen-golite. DO NOT EDIT. +// source: pb/nt/oidb/oidbSvcTrpcTcp0x1250_0/oidbSvcTrpcTcp0x1250_0.proto + +package oidbSvcTrpcTcp0x1250_0 + +type Request struct { + TargetUin int64 `protobuf:"varint,2,opt"` + Field3 int32 `protobuf:"varint,4,opt"` // 1 + RelationInfo *RelationInfo `protobuf:"bytes,5,opt"` + Field6 int32 `protobuf:"varint,6,opt"` // 1 + _ [0]func() +} + +type RelationInfo struct { + UinInfo *UinInfo `protobuf:"bytes,3,opt"` + Field5 int32 `protobuf:"varint,5,opt"` // 3436 + _ [0]func() +} + +type UinInfo struct { + SelfUin int64 `protobuf:"varint,1,opt"` + TargetUin int64 `protobuf:"varint,2,opt"` + _ [0]func() +} + +type Response struct { + SelfUin int64 `protobuf:"varint,1,opt"` + TargetUin int64 `protobuf:"varint,2,opt"` + FriendAddInfo *FriendAddInfo `protobuf:"bytes,11,opt"` + CommonGroupInfo *CommonGroupInfoList `protobuf:"bytes,12,opt"` + _ [0]func() +} + +type FriendAddInfo struct { + Reason string `protobuf:"bytes,4,opt"` + _ [0]func() +} + +type CommonGroupInfoList struct { + CommonGroupInfo []*CommonGroupInfo `protobuf:"bytes,1,rep"` + SpecialGroupInfo *CommonGroupInfo `protobuf:"bytes,2,opt"` + Reason string `protobuf:"bytes,3,opt"` +} + +type CommonGroupInfo struct { + GroupUin int64 `protobuf:"varint,1,opt"` + GroupId int64 `protobuf:"varint,2,opt"` + GroupName string `protobuf:"bytes,3,opt"` + Timestamp int64 `protobuf:"varint,4,opt"` + _ [0]func() +} diff --git a/client/pb/nt/oidb/oidbSvcTrpcTcp0x1250_0/oidbSvcTrpcTcp0x1250_0.proto b/client/pb/nt/oidb/oidbSvcTrpcTcp0x1250_0/oidbSvcTrpcTcp0x1250_0.proto new file mode 100644 index 0000000..dd858b7 --- /dev/null +++ b/client/pb/nt/oidb/oidbSvcTrpcTcp0x1250_0/oidbSvcTrpcTcp0x1250_0.proto @@ -0,0 +1,43 @@ +syntax = "proto3"; +option go_package = "github.com/ProtocolScience/AstralGo/client/pb/nt/oidb/oidbSvcTrpcTcp0x1250_0"; + +message Request { + int64 targetUin = 2; + int32 field3 = 4; // 1 + RelationInfo relationInfo = 5; + int32 field6 = 6; // 1 +} + +message RelationInfo { + UinInfo uinInfo = 3; + int32 field5 = 5; // 3436 +} + +message UinInfo { + int64 selfUin = 1; + int64 targetUin = 2; +} + +message Response { + int64 selfUin = 1; + int64 targetUin = 2; + FriendAddInfo friendAddInfo = 11; + CommonGroupInfoList commonGroupInfo = 12; +} + +message FriendAddInfo { + string reason = 4; +} + +message CommonGroupInfoList{ + repeated CommonGroupInfo commonGroupInfo = 1; + CommonGroupInfo specialGroupInfo = 2; + string reason = 3; +} + +message CommonGroupInfo{ + int64 groupUin = 1; + int64 groupId = 2; + string groupName = 3; + int64 timestamp = 4; +} \ No newline at end of file