1
0
mirror of https://github.com/Mrs4s/MiraiGo.git synced 2025-05-04 19:17:38 +08:00

internal/oicq: reduce lambda

This commit is contained in:
wdvxdr 2021-12-24 14:22:10 +08:00
parent cf864799cb
commit 254eef3a5a
No known key found for this signature in database
GPG Key ID: 703F8C071DE7A1B6
4 changed files with 76 additions and 82 deletions

View File

@ -55,8 +55,8 @@ func (w *Writer) WriteHex(h string) {
w.Write(b) w.Write(b)
} }
func (w *Writer) WriteByte(b byte) error { func (w *Writer) WriteByte(b byte) {
return (*bytes.Buffer)(w).WriteByte(b) (*bytes.Buffer)(w).WriteByte(b)
} }
func (w *Writer) WriteUInt16(v uint16) { func (w *Writer) WriteUInt16(v uint16) {

View File

@ -330,7 +330,7 @@ func (c *QQClient) packOIDBPackageProto(cmd, serviceType int32, msg proto.Messag
return c.packOIDBPackage(cmd, serviceType, b) return c.packOIDBPackage(cmd, serviceType, b)
} }
func (c *QQClient) unpackOIDBPackage(buff []byte, payload proto.Message) error { func unpackOIDBPackage(buff []byte, payload proto.Message) error {
pkg := new(oidb.OIDBSSOPkg) pkg := new(oidb.OIDBSSOPkg)
if err := proto.Unmarshal(buff, pkg); err != nil { if err := proto.Unmarshal(buff, pkg); err != nil {
return errors.Wrap(err, "failed to unmarshal protobuf message") return errors.Wrap(err, "failed to unmarshal protobuf message")

View File

@ -192,7 +192,7 @@ func (s *GuildService) GetUserProfile(tinyId uint64) (*GuildUserProfile, error)
return nil, errors.Wrap(err, "send packet error") return nil, errors.Wrap(err, "send packet error")
} }
body := new(channel.ChannelOidb0Xfc9Rsp) body := new(channel.ChannelOidb0Xfc9Rsp)
if err = s.c.unpackOIDBPackage(rsp, body); err != nil { if err = unpackOIDBPackage(rsp, body); err != nil {
return nil, errors.Wrap(err, "decode packet error") return nil, errors.Wrap(err, "decode packet error")
} }
// todo: 解析个性档案 // todo: 解析个性档案
@ -231,7 +231,7 @@ func (s *GuildService) FetchGuildMemberListWithRole(guildId, channelId uint64, s
return nil, errors.Wrap(err, "send packet error") return nil, errors.Wrap(err, "send packet error")
} }
body := new(channel.ChannelOidb0Xf5BRsp) body := new(channel.ChannelOidb0Xf5BRsp)
if err = s.c.unpackOIDBPackage(rsp, body); err != nil { if err = unpackOIDBPackage(rsp, body); err != nil {
return nil, errors.Wrap(err, "decode packet error") return nil, errors.Wrap(err, "decode packet error")
} }
var ret []*GuildMemberInfo var ret []*GuildMemberInfo
@ -286,7 +286,7 @@ func (s *GuildService) FetchGuildMemberProfileInfo(guildId, tinyId uint64) (*Gui
return nil, errors.Wrap(err, "send packet error") return nil, errors.Wrap(err, "send packet error")
} }
body := new(channel.ChannelOidb0Xf88Rsp) body := new(channel.ChannelOidb0Xf88Rsp)
if err = s.c.unpackOIDBPackage(rsp, body); err != nil { if err = unpackOIDBPackage(rsp, body); err != nil {
return nil, errors.Wrap(err, "decode packet error") return nil, errors.Wrap(err, "decode packet error")
} }
roles, err := s.fetchMemberRoles(guildId, tinyId) roles, err := s.fetchMemberRoles(guildId, tinyId)
@ -311,7 +311,7 @@ func (s *GuildService) GetGuildRoles(guildId uint64) ([]*GuildRole, error) {
return nil, errors.Wrap(err, "send packet error") return nil, errors.Wrap(err, "send packet error")
} }
body := new(channel.ChannelOidb0X1019Rsp) body := new(channel.ChannelOidb0X1019Rsp)
if err = s.c.unpackOIDBPackage(rsp, body); err != nil { if err = unpackOIDBPackage(rsp, body); err != nil {
return nil, errors.Wrap(err, "decode packet error") return nil, errors.Wrap(err, "decode packet error")
} }
roles := make([]*GuildRole, 0, len(body.GetRoles())) roles := make([]*GuildRole, 0, len(body.GetRoles()))
@ -351,7 +351,7 @@ func (s *GuildService) CreateGuildRole(guildId uint64, name string, color uint32
return 0, errors.Wrap(err, "send packet error") return 0, errors.Wrap(err, "send packet error")
} }
body := new(channel.ChannelOidb0X1016Rsp) body := new(channel.ChannelOidb0X1016Rsp)
if err = s.c.unpackOIDBPackage(rsp, body); err != nil { if err = unpackOIDBPackage(rsp, body); err != nil {
return 0, errors.Wrap(err, "decode packet error") return 0, errors.Wrap(err, "decode packet error")
} }
return body.GetRoleId(), nil return body.GetRoleId(), nil
@ -434,7 +434,7 @@ func (s *GuildService) FetchGuestGuild(guildId uint64) (*GuildMeta, error) {
return nil, errors.Wrap(err, "send packet error") return nil, errors.Wrap(err, "send packet error")
} }
body := new(channel.ChannelOidb0Xf57Rsp) body := new(channel.ChannelOidb0Xf57Rsp)
if err = s.c.unpackOIDBPackage(rsp, body); err != nil { if err = unpackOIDBPackage(rsp, body); err != nil {
return nil, errors.Wrap(err, "decode packet error") return nil, errors.Wrap(err, "decode packet error")
} }
return &GuildMeta{ return &GuildMeta{
@ -463,7 +463,7 @@ func (s *GuildService) FetchChannelList(guildId uint64) (r []*ChannelInfo, e err
return nil, errors.Wrap(err, "send packet error") return nil, errors.Wrap(err, "send packet error")
} }
body := new(channel.ChannelOidb0Xf5DRsp) body := new(channel.ChannelOidb0Xf5DRsp)
if err = s.c.unpackOIDBPackage(rsp, body); err != nil { if err = unpackOIDBPackage(rsp, body); err != nil {
return nil, errors.Wrap(err, "decode packet error") return nil, errors.Wrap(err, "decode packet error")
} }
for _, info := range body.Rsp.Channels { for _, info := range body.Rsp.Channels {
@ -479,7 +479,7 @@ func (s *GuildService) FetchChannelInfo(guildId, channelId uint64) (*ChannelInfo
return nil, errors.Wrap(err, "send packet error") return nil, errors.Wrap(err, "send packet error")
} }
body := new(channel.ChannelOidb0Xf55Rsp) body := new(channel.ChannelOidb0Xf55Rsp)
if err = s.c.unpackOIDBPackage(rsp, body); err != nil { if err = unpackOIDBPackage(rsp, body); err != nil {
return nil, errors.Wrap(err, "decode packet error") return nil, errors.Wrap(err, "decode packet error")
} }
return convertChannelInfo(body.Info), nil return convertChannelInfo(body.Info), nil
@ -632,7 +632,7 @@ func (s *GuildService) fetchMemberRoles(guildId uint64, tinyId uint64) ([]*Guild
return nil, errors.Wrap(err, "send packet error") return nil, errors.Wrap(err, "send packet error")
} }
body := new(channel.ChannelOidb0X1017Rsp) body := new(channel.ChannelOidb0X1017Rsp)
if err = s.c.unpackOIDBPackage(rsp, body); err != nil { if err = unpackOIDBPackage(rsp, body); err != nil {
return nil, errors.Wrap(err, "decode packet error") return nil, errors.Wrap(err, "decode packet error")
} }
p1 := body.GetP1() p1 := body.GetP1()

View File

@ -20,42 +20,35 @@ type Transport struct {
} }
func (t *Transport) packBody(req *Request, w *binary.Writer) { func (t *Transport) packBody(req *Request, w *binary.Writer) {
w.WriteIntLvPacket(4, func(writer *binary.Writer) { pos := w.FillUInt32()
if req.Type == RequestTypeLogin { if req.Type == RequestTypeLogin {
writer.WriteUInt32(uint32(req.SequenceID)) w.WriteUInt32(uint32(req.SequenceID))
writer.WriteUInt32(t.Version.AppId) w.WriteUInt32(t.Version.AppId)
writer.WriteUInt32(t.Version.SubAppId) w.WriteUInt32(t.Version.SubAppId)
writer.Write([]byte{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00}) w.Write([]byte{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00})
tgt := t.Sig.TGT tgt := t.Sig.TGT
if len(tgt) == 0 || len(tgt) == 4 { if len(tgt) == 0 || len(tgt) == 4 {
writer.WriteUInt32(0x04) w.WriteUInt32(0x04)
} else { } else {
writer.WriteUInt32(uint32(len(tgt) + 4)) w.WriteUInt32(uint32(len(tgt) + 4))
writer.Write(tgt) w.Write(tgt)
} }
} }
writer.WriteString(req.CommandName) w.WriteString(req.CommandName)
writer.WriteIntLvPacket(4, func(w *binary.Writer) { w.WriteUInt32(uint32(len(t.Sig.OutPacketSessionID) + 4))
w.Write(t.Sig.OutPacketSessionID) w.Write(t.Sig.OutPacketSessionID)
})
// writer.WriteUInt32(uint32(len(t.Sig.OutPacketSessionID) + 4))
// w.Write(t.Sig.OutPacketSessionID)
if req.Type == RequestTypeLogin { if req.Type == RequestTypeLogin {
writer.WriteString(t.Device.IMEI) w.WriteString(t.Device.IMEI)
writer.WriteUInt32(0x04) w.WriteUInt32(0x04)
{
writer.WriteUInt16(uint16(len(t.Sig.Ksid)) + 2)
writer.Write(t.Sig.Ksid)
}
}
writer.WriteUInt32(0x04)
})
w.WriteIntLvPacket(4, func(w *binary.Writer) { w.WriteUInt16(uint16(len(t.Sig.Ksid)) + 2)
w.Write(t.Sig.Ksid)
}
w.WriteUInt32(0x04)
w.WriteUInt32At(pos, uint32(w.Len()-pos))
w.WriteUInt32(uint32(len(req.Body) + 4))
w.Write(req.Body) w.Write(req.Body)
})
// w.WriteUInt32(uint32(len(req.Body) + 4))
// w.Write(req.Body)
} }
// PackPacket packs a packet. // PackPacket packs a packet.
@ -65,7 +58,9 @@ func (t *Transport) PackPacket(req *Request) []byte {
req.EncryptType = EncryptTypeEmptyKey req.EncryptType = EncryptTypeEmptyKey
} }
return binary.NewWriterF(func(w *binary.Writer) { w := binary.SelectWriter()
defer binary.PutWriter(w)
pos := w.FillUInt32() pos := w.FillUInt32()
// vvv w.Write(head) vvv // vvv w.Write(head) vvv
w.WriteUInt32(uint32(req.Type)) w.WriteUInt32(uint32(req.Type))
@ -85,23 +80,22 @@ func (t *Transport) PackPacket(req *Request) []byte {
w.WriteByte(0x00) w.WriteByte(0x00)
w.WriteString(strconv.FormatInt(req.Uin, 10)) w.WriteString(strconv.FormatInt(req.Uin, 10))
// ^^^ w.Write(head) ^^^ // ^^^ w.Write(head) ^^^
w.Write(binary.NewWriterF(func(w *binary.Writer) {
w2 := binary.SelectWriter()
t.packBody(req, w2)
body := w2.Bytes()
// encrypt body // encrypt body
switch req.EncryptType { switch req.EncryptType {
case EncryptTypeD2Key: case EncryptTypeD2Key:
wt, cl := binary.OpenWriterF(func(w *binary.Writer) { t.packBody(req, w) }) body = binary.NewTeaCipher(t.Sig.D2Key).Encrypt(body)
w.EncryptAndWrite(t.Sig.D2Key, wt)
cl()
case EncryptTypeEmptyKey: case EncryptTypeEmptyKey:
wt, cl := binary.OpenWriterF(func(w *binary.Writer) { t.packBody(req, w) }) body = binary.NewTeaCipher(emptyKey).Encrypt(body)
w.EncryptAndWrite(emptyKey, wt)
cl()
default:
t.packBody(req, w)
} }
})) w.Write(body)
binary.PutWriter(w2)
w.WriteUInt32At(pos, uint32(w.Len())) w.WriteUInt32At(pos, uint32(w.Len()))
}) return append([]byte(nil), w.Bytes()...)
} }
func (t *Transport) parse(head []byte) *Request { func (t *Transport) parse(head []byte) *Request {