mirror of
https://github.com/Mrs4s/MiraiGo.git
synced 2025-05-04 11:07:40 +08:00
perf: add 0 alloc func OpenWriterF
This commit is contained in:
parent
26579583cc
commit
a70e0f20de
@ -19,6 +19,14 @@ func NewWriterF(f func(writer *Writer)) []byte {
|
|||||||
return b
|
return b
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// OpenWriterF must call func close
|
||||||
|
func OpenWriterF(f func(writer *Writer)) (b []byte, close func()) {
|
||||||
|
w := SelectWriter()
|
||||||
|
w.WriteByte(0)
|
||||||
|
f(w)
|
||||||
|
return w.Bytes(), func() { PutWriter(w) }
|
||||||
|
}
|
||||||
|
|
||||||
func (w *Writer) Write(b []byte) {
|
func (w *Writer) Write(b []byte) {
|
||||||
(*bytes.Buffer)(w).Write(b)
|
(*bytes.Buffer)(w).Write(b)
|
||||||
}
|
}
|
||||||
@ -73,9 +81,10 @@ func (w *Writer) EncryptAndWrite(key []byte, data []byte) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (w *Writer) WriteIntLvPacket(offset int, f func(writer *Writer)) {
|
func (w *Writer) WriteIntLvPacket(offset int, f func(writer *Writer)) {
|
||||||
data := NewWriterF(f)
|
data, close := OpenWriterF(f)
|
||||||
w.WriteUInt32(uint32(len(data) + offset))
|
w.WriteUInt32(uint32(len(data) + offset))
|
||||||
w.Write(data)
|
w.Write(data)
|
||||||
|
close()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *Writer) WriteUniPacket(commandName string, sessionId, extraData, body []byte) {
|
func (w *Writer) WriteUniPacket(commandName string, sessionId, extraData, body []byte) {
|
||||||
|
@ -49,3 +49,51 @@ func BenchmarkNewWriterF128_5(b *testing.B) {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func BenchmarkOpenWriterF128(b *testing.B) {
|
||||||
|
test := make([]byte, 128)
|
||||||
|
rand.Read(test)
|
||||||
|
b.StartTimer()
|
||||||
|
b.RunParallel(func(pb *testing.PB) {
|
||||||
|
for pb.Next() {
|
||||||
|
_, close := OpenWriterF(func(w *Writer) {
|
||||||
|
w.Write(test)
|
||||||
|
})
|
||||||
|
close()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func BenchmarkOpenWriterF128_3(b *testing.B) {
|
||||||
|
test := make([]byte, 128)
|
||||||
|
rand.Read(test)
|
||||||
|
b.StartTimer()
|
||||||
|
b.RunParallel(func(pb *testing.PB) {
|
||||||
|
for pb.Next() {
|
||||||
|
_, close := OpenWriterF(func(w *Writer) {
|
||||||
|
w.Write(test)
|
||||||
|
w.Write(test)
|
||||||
|
w.Write(test)
|
||||||
|
})
|
||||||
|
close()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func BenchmarkOpenWriterF128_5(b *testing.B) {
|
||||||
|
test := make([]byte, 128)
|
||||||
|
rand.Read(test)
|
||||||
|
b.StartTimer()
|
||||||
|
b.RunParallel(func(pb *testing.PB) {
|
||||||
|
for pb.Next() {
|
||||||
|
_, close := OpenWriterF(func(w *Writer) {
|
||||||
|
w.Write(test)
|
||||||
|
w.Write(test)
|
||||||
|
w.Write(test)
|
||||||
|
w.Write(test)
|
||||||
|
w.Write(test)
|
||||||
|
})
|
||||||
|
close()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
@ -169,10 +169,12 @@ func (c *QQClient) buildQRCodeLoginPacket(t106, t16a, t318 []byte) (uint16, []by
|
|||||||
|
|
||||||
w.Write(tlv.T18(16, uint32(c.Uin)))
|
w.Write(tlv.T18(16, uint32(c.Uin)))
|
||||||
w.Write(tlv.T1(uint32(c.Uin), c.deviceInfo.IpAddress))
|
w.Write(tlv.T1(uint32(c.Uin), c.deviceInfo.IpAddress))
|
||||||
w.Write(binary.NewWriterF(func(w *binary.Writer) {
|
wb, cl := binary.OpenWriterF(func(w *binary.Writer) {
|
||||||
w.WriteUInt16(0x106)
|
w.WriteUInt16(0x106)
|
||||||
w.WriteBytesShort(t106)
|
w.WriteBytesShort(t106)
|
||||||
}))
|
})
|
||||||
|
w.Write(wb)
|
||||||
|
cl()
|
||||||
// w.Write(tlv.T106(uint32(c.Uin), 0, c.version.AppId, c.version.SSOVersion, c.PasswordMd5, true, c.deviceInfo.Guid, c.deviceInfo.TgtgtKey, 0))
|
// w.Write(tlv.T106(uint32(c.Uin), 0, c.version.AppId, c.version.SSOVersion, c.PasswordMd5, true, c.deviceInfo.Guid, c.deviceInfo.TgtgtKey, 0))
|
||||||
w.Write(tlv.T116(c.version.MiscBitmap, c.version.SubSigmap))
|
w.Write(tlv.T116(c.version.MiscBitmap, c.version.SubSigmap))
|
||||||
w.Write(tlv.T100(c.version.SSOVersion, c.version.SubAppId, c.version.MainSigMap))
|
w.Write(tlv.T100(c.version.SSOVersion, c.version.SubAppId, c.version.MainSigMap))
|
||||||
@ -194,10 +196,12 @@ func (c *QQClient) buildQRCodeLoginPacket(t106, t16a, t318 []byte) (uint16, []by
|
|||||||
|
|
||||||
w.Write(tlv.T145(c.deviceInfo.Guid))
|
w.Write(tlv.T145(c.deviceInfo.Guid))
|
||||||
w.Write(tlv.T147(16, []byte(c.version.SortVersionName), c.version.ApkSign))
|
w.Write(tlv.T147(16, []byte(c.version.SortVersionName), c.version.ApkSign))
|
||||||
w.Write(binary.NewWriterF(func(w *binary.Writer) {
|
wb, cl = binary.OpenWriterF(func(w *binary.Writer) {
|
||||||
w.WriteUInt16(0x16A)
|
w.WriteUInt16(0x16A)
|
||||||
w.WriteBytesShort(t16a)
|
w.WriteBytesShort(t16a)
|
||||||
}))
|
})
|
||||||
|
w.Write(wb)
|
||||||
|
cl()
|
||||||
w.Write(tlv.T154(seq))
|
w.Write(tlv.T154(seq))
|
||||||
w.Write(tlv.T141(c.deviceInfo.SimInfo, c.deviceInfo.APN))
|
w.Write(tlv.T141(c.deviceInfo.SimInfo, c.deviceInfo.APN))
|
||||||
w.Write(tlv.T8(2052))
|
w.Write(tlv.T8(2052))
|
||||||
@ -219,10 +223,12 @@ func (c *QQClient) buildQRCodeLoginPacket(t106, t16a, t318 []byte) (uint16, []by
|
|||||||
w.Write(tlv.T516())
|
w.Write(tlv.T516())
|
||||||
w.Write(tlv.T521(8))
|
w.Write(tlv.T521(8))
|
||||||
// w.Write(tlv.T525(tlv.T536([]byte{0x01, 0x00})))
|
// w.Write(tlv.T525(tlv.T536([]byte{0x01, 0x00})))
|
||||||
w.Write(binary.NewWriterF(func(w *binary.Writer) {
|
wb, cl = binary.OpenWriterF(func(w *binary.Writer) {
|
||||||
w.WriteUInt16(0x318)
|
w.WriteUInt16(0x318)
|
||||||
w.WriteBytesShort(t318)
|
w.WriteBytesShort(t318)
|
||||||
}))
|
})
|
||||||
|
w.Write(wb)
|
||||||
|
cl()
|
||||||
})
|
})
|
||||||
sso := packets.BuildSsoPacket(seq, c.version.AppId, c.version.SubAppId, "wtlogin.login", c.deviceInfo.IMEI, []byte{}, c.OutGoingPacketSessionId, req, c.ksid)
|
sso := packets.BuildSsoPacket(seq, c.version.AppId, c.version.SubAppId, "wtlogin.login", c.deviceInfo.IMEI, []byte{}, c.OutGoingPacketSessionId, req, c.ksid)
|
||||||
packet := packets.BuildLoginPacket(c.Uin, 2, make([]byte, 16), sso, []byte{})
|
packet := packets.BuildLoginPacket(c.Uin, 2, make([]byte, 16), sso, []byte{})
|
||||||
@ -306,10 +312,12 @@ func (c *QQClient) buildRequestTgtgtNopicsigPacket() (uint16, []byte) {
|
|||||||
|
|
||||||
w.Write(tlv.T18(16, uint32(c.Uin)))
|
w.Write(tlv.T18(16, uint32(c.Uin)))
|
||||||
w.Write(tlv.T1(uint32(c.Uin), c.deviceInfo.IpAddress))
|
w.Write(tlv.T1(uint32(c.Uin), c.deviceInfo.IpAddress))
|
||||||
w.Write(binary.NewWriterF(func(w *binary.Writer) {
|
wb, cl := binary.OpenWriterF(func(w *binary.Writer) {
|
||||||
w.WriteUInt16(0x106)
|
w.WriteUInt16(0x106)
|
||||||
w.WriteBytesShort(c.sigInfo.encryptedA1)
|
w.WriteBytesShort(c.sigInfo.encryptedA1)
|
||||||
}))
|
})
|
||||||
|
w.Write(wb)
|
||||||
|
cl()
|
||||||
w.Write(tlv.T116(c.version.MiscBitmap, c.version.SubSigmap))
|
w.Write(tlv.T116(c.version.MiscBitmap, c.version.SubSigmap))
|
||||||
w.Write(tlv.T100(c.version.SSOVersion, 2, c.version.MainSigMap))
|
w.Write(tlv.T100(c.version.SSOVersion, 2, c.version.MainSigMap))
|
||||||
w.Write(tlv.T107(0))
|
w.Write(tlv.T107(0))
|
||||||
@ -989,13 +997,15 @@ func (c *QQClient) buildGroupKickPacket(groupCode, memberUin int64, kickMsg stri
|
|||||||
// OidbSvc.0x570_8
|
// OidbSvc.0x570_8
|
||||||
func (c *QQClient) buildGroupMutePacket(groupCode, memberUin int64, time uint32) (uint16, []byte) {
|
func (c *QQClient) buildGroupMutePacket(groupCode, memberUin int64, time uint32) (uint16, []byte) {
|
||||||
seq := c.nextSeq()
|
seq := c.nextSeq()
|
||||||
payload := c.packOIDBPackage(1392, 8, binary.NewWriterF(func(w *binary.Writer) {
|
b, cl := binary.OpenWriterF(func(w *binary.Writer) {
|
||||||
w.WriteUInt32(uint32(groupCode))
|
w.WriteUInt32(uint32(groupCode))
|
||||||
w.WriteByte(32)
|
w.WriteByte(32)
|
||||||
w.WriteUInt16(1)
|
w.WriteUInt16(1)
|
||||||
w.WriteUInt32(uint32(memberUin))
|
w.WriteUInt32(uint32(memberUin))
|
||||||
w.WriteUInt32(time)
|
w.WriteUInt32(time)
|
||||||
}))
|
})
|
||||||
|
payload := c.packOIDBPackage(1392, 8, b)
|
||||||
|
cl()
|
||||||
packet := packets.BuildUniPacket(c.Uin, seq, "OidbSvc.0x570_8", 1, c.OutGoingPacketSessionId, EmptyBytes, c.sigInfo.d2Key, payload)
|
packet := packets.BuildUniPacket(c.Uin, seq, "OidbSvc.0x570_8", 1, c.OutGoingPacketSessionId, EmptyBytes, c.sigInfo.d2Key, payload)
|
||||||
return seq, packet
|
return seq, packet
|
||||||
}
|
}
|
||||||
@ -1029,7 +1039,7 @@ func (c *QQClient) buildFriendPokePacket(target int64) (uint16, []byte) {
|
|||||||
// OidbSvc.0x55c_1
|
// OidbSvc.0x55c_1
|
||||||
func (c *QQClient) buildGroupAdminSetPacket(groupCode, member int64, flag bool) (uint16, []byte) {
|
func (c *QQClient) buildGroupAdminSetPacket(groupCode, member int64, flag bool) (uint16, []byte) {
|
||||||
seq := c.nextSeq()
|
seq := c.nextSeq()
|
||||||
payload := c.packOIDBPackage(1372, 1, binary.NewWriterF(func(w *binary.Writer) {
|
b, cl := binary.OpenWriterF(func(w *binary.Writer) {
|
||||||
w.WriteUInt32(uint32(groupCode))
|
w.WriteUInt32(uint32(groupCode))
|
||||||
w.WriteUInt32(uint32(member))
|
w.WriteUInt32(uint32(member))
|
||||||
w.WriteByte(func() byte {
|
w.WriteByte(func() byte {
|
||||||
@ -1038,7 +1048,9 @@ func (c *QQClient) buildGroupAdminSetPacket(groupCode, member int64, flag bool)
|
|||||||
}
|
}
|
||||||
return 0
|
return 0
|
||||||
}())
|
}())
|
||||||
}))
|
})
|
||||||
|
payload := c.packOIDBPackage(1372, 1, b)
|
||||||
|
cl()
|
||||||
packet := packets.BuildUniPacket(c.Uin, seq, "OidbSvc.0x55c_1", 1, c.OutGoingPacketSessionId, EmptyBytes, c.sigInfo.d2Key, payload)
|
packet := packets.BuildUniPacket(c.Uin, seq, "OidbSvc.0x55c_1", 1, c.OutGoingPacketSessionId, EmptyBytes, c.sigInfo.d2Key, payload)
|
||||||
return seq, packet
|
return seq, packet
|
||||||
}
|
}
|
||||||
@ -1049,10 +1061,12 @@ func (c *QQClient) buildQuitGroupPacket(groupCode int64) (uint16, []byte) {
|
|||||||
jw := jce.NewJceWriter()
|
jw := jce.NewJceWriter()
|
||||||
jw.WriteInt32(2, 0)
|
jw.WriteInt32(2, 0)
|
||||||
jw.WriteInt64(c.Uin, 1)
|
jw.WriteInt64(c.Uin, 1)
|
||||||
jw.WriteBytes(binary.NewWriterF(func(w *binary.Writer) {
|
b, cl := binary.OpenWriterF(func(w *binary.Writer) {
|
||||||
w.WriteUInt32(uint32(c.Uin))
|
w.WriteUInt32(uint32(c.Uin))
|
||||||
w.WriteUInt32(uint32(groupCode))
|
w.WriteUInt32(uint32(groupCode))
|
||||||
}), 2)
|
})
|
||||||
|
jw.WriteBytes(b, 2)
|
||||||
|
cl()
|
||||||
buf := &jce.RequestDataVersion3{Map: map[string][]byte{"GroupMngReq": packUniRequestData(jw.Bytes())}}
|
buf := &jce.RequestDataVersion3{Map: map[string][]byte{"GroupMngReq": packUniRequestData(jw.Bytes())}}
|
||||||
pkt := &jce.RequestPacket{
|
pkt := &jce.RequestPacket{
|
||||||
IVersion: 3,
|
IVersion: 3,
|
||||||
|
@ -459,12 +459,15 @@ func getSSOAddress() ([]*net.TCPAddr, error) {
|
|||||||
SFuncName: "HttpServerListReq",
|
SFuncName: "HttpServerListReq",
|
||||||
SBuffer: buf.ToBytes(),
|
SBuffer: buf.ToBytes(),
|
||||||
}
|
}
|
||||||
tea := binary.NewTeaCipher(key)
|
b, cl := binary.OpenWriterF(func(w *binary.Writer) {
|
||||||
rsp, err := utils.HttpPostBytes("https://configsvr.msf.3g.qq.com/configsvr/serverlist.jsp", tea.Encrypt(binary.NewWriterF(func(w *binary.Writer) {
|
|
||||||
w.WriteIntLvPacket(0, func(w *binary.Writer) {
|
w.WriteIntLvPacket(0, func(w *binary.Writer) {
|
||||||
w.Write(pkt.ToBytes())
|
w.Write(pkt.ToBytes())
|
||||||
})
|
})
|
||||||
})))
|
})
|
||||||
|
tea := binary.NewTeaCipher(key)
|
||||||
|
encpkt := tea.Encrypt(b)
|
||||||
|
cl()
|
||||||
|
rsp, err := utils.HttpPostBytes("https://configsvr.msf.3g.qq.com/configsvr/serverlist.jsp", encpkt)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrap(err, "unable to fetch server list")
|
return nil, errors.Wrap(err, "unable to fetch server list")
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user