1
0
mirror of https://github.com/Mrs4s/MiraiGo.git synced 2025-05-04 11:07:40 +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)
}
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) {

View File

@ -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")

View File

@ -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()

View File

@ -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 {