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 }