github.com/Mrs4s/MiraiGo@v0.0.0-20240226124653-54bdd873e3fe/client/face.go (about)

     1  package client
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/pkg/errors"
     7  
     8  	"github.com/Mrs4s/MiraiGo/client/internal/network"
     9  	"github.com/Mrs4s/MiraiGo/client/pb/faceroam"
    10  	"github.com/Mrs4s/MiraiGo/internal/proto"
    11  )
    12  
    13  type CustomFace struct {
    14  	ResId string
    15  	Url   string
    16  }
    17  
    18  func init() {
    19  	decoders["Faceroam.OpReq"] = decodeFaceroamResponse
    20  }
    21  
    22  func (c *QQClient) GetCustomFaces() ([]*CustomFace, error) {
    23  	i, err := c.sendAndWait(c.buildFaceroamRequestPacket())
    24  	if err != nil {
    25  		return nil, errors.Wrap(err, "get faces error")
    26  	}
    27  	return i.([]*CustomFace), nil
    28  }
    29  
    30  func (c *QQClient) buildFaceroamRequestPacket() (uint16, []byte) {
    31  	payload, _ := proto.Marshal(&faceroam.FaceroamReqBody{
    32  		Comm: &faceroam.PlatInfo{
    33  			Implat: proto.Int64(109),
    34  			Osver:  proto.String(string(c.Device().Version.Release)),
    35  			Mqqver: proto.Some(c.version().SortVersionName),
    36  		},
    37  		Uin:         proto.Uint64(uint64(c.Uin)),
    38  		SubCmd:      proto.Uint32(1),
    39  		ReqUserInfo: &faceroam.ReqUserInfo{},
    40  	})
    41  	return c.uniPacket("Faceroam.OpReq", payload)
    42  }
    43  
    44  func decodeFaceroamResponse(c *QQClient, pkt *network.Packet) (any, error) {
    45  	rsp := faceroam.FaceroamRspBody{}
    46  	if err := proto.Unmarshal(pkt.Payload, &rsp); err != nil {
    47  		return nil, errors.Wrap(err, "failed to unmarshal protobuf message")
    48  	}
    49  	if rsp.RspUserInfo == nil {
    50  		return nil, errors.New("user info not found")
    51  	}
    52  	res := make([]*CustomFace, len(rsp.RspUserInfo.Filename))
    53  	for i := len(rsp.RspUserInfo.Filename) - 1; i >= 0; i-- {
    54  		res[len(rsp.RspUserInfo.Filename)-1-i] = &CustomFace{
    55  			ResId: rsp.RspUserInfo.Filename[i],
    56  			Url:   fmt.Sprintf("https://p.qpic.cn/%s/%d/%s/0", rsp.RspUserInfo.Bid.Unwrap(), c.Uin, rsp.RspUserInfo.Filename[i]),
    57  		}
    58  	}
    59  	return res, nil
    60  }