From 254eef3a5a6170204701593cff3737f07202396a Mon Sep 17 00:00:00 2001 From: wdvxdr Date: Fri, 24 Dec 2021 14:22:10 +0800 Subject: [PATCH] internal/oicq: reduce lambda --- binary/writer.go | 4 +- client/global.go | 2 +- client/guild.go | 18 ++-- client/internal/network/transport.go | 134 +++++++++++++-------------- 4 files changed, 76 insertions(+), 82 deletions(-) diff --git a/binary/writer.go b/binary/writer.go index e993ca9d..d8a8703a 100644 --- a/binary/writer.go +++ b/binary/writer.go @@ -55,8 +55,8 @@ func (w *Writer) WriteHex(h string) { w.Write(b) } -func (w *Writer) WriteByte(b byte) error { - return (*bytes.Buffer)(w).WriteByte(b) +func (w *Writer) WriteByte(b byte) { + (*bytes.Buffer)(w).WriteByte(b) } func (w *Writer) WriteUInt16(v uint16) { diff --git a/client/global.go b/client/global.go index 13ddcc13..455af61c 100644 --- a/client/global.go +++ b/client/global.go @@ -330,7 +330,7 @@ func (c *QQClient) packOIDBPackageProto(cmd, serviceType int32, msg proto.Messag 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) if err := proto.Unmarshal(buff, pkg); err != nil { return errors.Wrap(err, "failed to unmarshal protobuf message") diff --git a/client/guild.go b/client/guild.go index 2adbadde..56dc5dde 100644 --- a/client/guild.go +++ b/client/guild.go @@ -192,7 +192,7 @@ func (s *GuildService) GetUserProfile(tinyId uint64) (*GuildUserProfile, error) return nil, errors.Wrap(err, "send packet error") } 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") } // todo: 解析个性档案 @@ -231,7 +231,7 @@ func (s *GuildService) FetchGuildMemberListWithRole(guildId, channelId uint64, s return nil, errors.Wrap(err, "send packet error") } 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") } var ret []*GuildMemberInfo @@ -286,7 +286,7 @@ func (s *GuildService) FetchGuildMemberProfileInfo(guildId, tinyId uint64) (*Gui return nil, errors.Wrap(err, "send packet error") } 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") } 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") } 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") } 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") } 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 body.GetRoleId(), nil @@ -434,7 +434,7 @@ func (s *GuildService) FetchGuestGuild(guildId uint64) (*GuildMeta, error) { return nil, errors.Wrap(err, "send packet error") } 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 &GuildMeta{ @@ -463,7 +463,7 @@ func (s *GuildService) FetchChannelList(guildId uint64) (r []*ChannelInfo, e err return nil, errors.Wrap(err, "send packet error") } 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") } 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") } 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 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") } 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") } p1 := body.GetP1() diff --git a/client/internal/network/transport.go b/client/internal/network/transport.go index 839c8cc2..6f4c234b 100644 --- a/client/internal/network/transport.go +++ b/client/internal/network/transport.go @@ -20,42 +20,35 @@ type Transport struct { } func (t *Transport) packBody(req *Request, w *binary.Writer) { - w.WriteIntLvPacket(4, func(writer *binary.Writer) { - if req.Type == RequestTypeLogin { - writer.WriteUInt32(uint32(req.SequenceID)) - writer.WriteUInt32(t.Version.AppId) - writer.WriteUInt32(t.Version.SubAppId) - writer.Write([]byte{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00}) - tgt := t.Sig.TGT - if len(tgt) == 0 || len(tgt) == 4 { - writer.WriteUInt32(0x04) - } else { - writer.WriteUInt32(uint32(len(tgt) + 4)) - writer.Write(tgt) - } + pos := w.FillUInt32() + if req.Type == RequestTypeLogin { + w.WriteUInt32(uint32(req.SequenceID)) + w.WriteUInt32(t.Version.AppId) + w.WriteUInt32(t.Version.SubAppId) + w.Write([]byte{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00}) + tgt := t.Sig.TGT + if len(tgt) == 0 || len(tgt) == 4 { + w.WriteUInt32(0x04) + } else { + w.WriteUInt32(uint32(len(tgt) + 4)) + w.Write(tgt) } - writer.WriteString(req.CommandName) - writer.WriteIntLvPacket(4, func(w *binary.Writer) { - w.Write(t.Sig.OutPacketSessionID) - }) - // writer.WriteUInt32(uint32(len(t.Sig.OutPacketSessionID) + 4)) - // w.Write(t.Sig.OutPacketSessionID) - if req.Type == RequestTypeLogin { - writer.WriteString(t.Device.IMEI) - writer.WriteUInt32(0x04) - { - writer.WriteUInt16(uint16(len(t.Sig.Ksid)) + 2) - writer.Write(t.Sig.Ksid) - } - } - writer.WriteUInt32(0x04) - }) + } + w.WriteString(req.CommandName) + w.WriteUInt32(uint32(len(t.Sig.OutPacketSessionID) + 4)) + w.Write(t.Sig.OutPacketSessionID) + if req.Type == RequestTypeLogin { + w.WriteString(t.Device.IMEI) + w.WriteUInt32(0x04) - w.WriteIntLvPacket(4, func(w *binary.Writer) { - w.Write(req.Body) - }) - // w.WriteUInt32(uint32(len(req.Body) + 4)) - // w.Write(req.Body) + 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) } // PackPacket packs a packet. @@ -65,43 +58,44 @@ func (t *Transport) PackPacket(req *Request) []byte { req.EncryptType = EncryptTypeEmptyKey } - return binary.NewWriterF(func(w *binary.Writer) { - pos := w.FillUInt32() - // vvv w.Write(head) vvv - w.WriteUInt32(uint32(req.Type)) - w.WriteByte(byte(req.EncryptType)) - switch req.Type { - case RequestTypeLogin: - switch req.EncryptType { - case EncryptTypeD2Key: - w.WriteUInt32(uint32(len(t.Sig.D2) + 4)) - w.Write(t.Sig.D2) - default: - w.WriteUInt32(4) - } - case RequestTypeSimple: - w.WriteUInt32(uint32(req.SequenceID)) + w := binary.SelectWriter() + defer binary.PutWriter(w) + + pos := w.FillUInt32() + // vvv w.Write(head) vvv + w.WriteUInt32(uint32(req.Type)) + w.WriteByte(byte(req.EncryptType)) + switch req.Type { + case RequestTypeLogin: + switch req.EncryptType { + case EncryptTypeD2Key: + w.WriteUInt32(uint32(len(t.Sig.D2) + 4)) + w.Write(t.Sig.D2) + default: + w.WriteUInt32(4) } - w.WriteByte(0x00) - w.WriteString(strconv.FormatInt(req.Uin, 10)) - // ^^^ w.Write(head) ^^^ - w.Write(binary.NewWriterF(func(w *binary.Writer) { - // encrypt body - switch req.EncryptType { - case EncryptTypeD2Key: - wt, cl := binary.OpenWriterF(func(w *binary.Writer) { t.packBody(req, w) }) - w.EncryptAndWrite(t.Sig.D2Key, wt) - cl() - case EncryptTypeEmptyKey: - wt, cl := binary.OpenWriterF(func(w *binary.Writer) { t.packBody(req, w) }) - w.EncryptAndWrite(emptyKey, wt) - cl() - default: - t.packBody(req, w) - } - })) - w.WriteUInt32At(pos, uint32(w.Len())) - }) + case RequestTypeSimple: + w.WriteUInt32(uint32(req.SequenceID)) + } + w.WriteByte(0x00) + w.WriteString(strconv.FormatInt(req.Uin, 10)) + // ^^^ w.Write(head) ^^^ + + w2 := binary.SelectWriter() + t.packBody(req, w2) + body := w2.Bytes() + // encrypt body + switch req.EncryptType { + case EncryptTypeD2Key: + body = binary.NewTeaCipher(t.Sig.D2Key).Encrypt(body) + case EncryptTypeEmptyKey: + body = binary.NewTeaCipher(emptyKey).Encrypt(body) + } + w.Write(body) + binary.PutWriter(w2) + + w.WriteUInt32At(pos, uint32(w.Len())) + return append([]byte(nil), w.Bytes()...) } func (t *Transport) parse(head []byte) *Request {