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

prealloc.

This commit is contained in:
wdvxdr 2021-03-23 20:37:50 +08:00
parent 336be30cc8
commit f3beaae4e4
No known key found for this signature in database
GPG Key ID: 55FF1414A69CEBA6
22 changed files with 120 additions and 131 deletions

View File

@ -173,7 +173,7 @@ func (c *QQClient) buildQRCodeLoginPacket(t106, t16a, t318 []byte) (uint16, []by
w.WriteUInt16(0x106) w.WriteUInt16(0x106)
w.WriteBytesShort(t106) w.WriteBytesShort(t106)
})) }))
//w.Write(tlv.T106(uint32(c.Uin), 0, c.version.AppId, c.version.SSOVersion, c.PasswordMd5, true, SystemDeviceInfo.Guid, SystemDeviceInfo.TgtgtKey, 0)) // w.Write(tlv.T106(uint32(c.Uin), 0, c.version.AppId, c.version.SSOVersion, c.PasswordMd5, true, SystemDeviceInfo.Guid, SystemDeviceInfo.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.AppId, c.version.MainSigMap)) w.Write(tlv.T100(c.version.SSOVersion, c.version.AppId, c.version.MainSigMap))
w.Write(tlv.T107(0)) w.Write(tlv.T107(0))
@ -218,7 +218,7 @@ func (c *QQClient) buildQRCodeLoginPacket(t106, t16a, t318 []byte) (uint16, []by
w.Write(tlv.T177(c.version.BuildTime, c.version.SdkVersion)) w.Write(tlv.T177(c.version.BuildTime, c.version.SdkVersion))
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) { w.Write(binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(0x318) w.WriteUInt16(0x318)
w.WriteBytesShort(t318) w.WriteBytesShort(t318)
@ -347,7 +347,6 @@ func (c *QQClient) buildRequestTgtgtNopicsigPacket() (uint16, []byte) {
w.Write(tlv.T516()) w.Write(tlv.T516())
w.Write(tlv.T521(0)) w.Write(tlv.T521(0))
w.Write(tlv.T525(tlv.T536([]byte{0x01, 0x00}))) w.Write(tlv.T525(tlv.T536([]byte{0x01, 0x00})))
}) })
packet := packets.BuildUniPacket(c.Uin, seq, "wtlogin.exchange_emp", 2, c.OutGoingPacketSessionId, []byte{}, make([]byte, 16), req) packet := packets.BuildUniPacket(c.Uin, seq, "wtlogin.exchange_emp", 2, c.OutGoingPacketSessionId, []byte{}, make([]byte, 16), req)
return seq, packet return seq, packet
@ -1016,11 +1015,11 @@ func (c *QQClient) buildWordSegmentationPacket(data []byte) (uint16, []byte) {
} }
// OidbSvc.0xdad_1 // OidbSvc.0xdad_1
func (c *QQClient) sendGroupGiftPacket(groupCode, uin uint64, productId message.GroupGift) (uint16, []byte) { func (c *QQClient) sendGroupGiftPacket(groupCode, uin uint64, productID message.GroupGift) (uint16, []byte) {
seq := c.nextSeq() seq := c.nextSeq()
payload := c.packOIDBPackageProto(3501, 1, &oidb.DADReqBody{ payload := c.packOIDBPackageProto(3501, 1, &oidb.DADReqBody{
Client: 1, Client: 1,
ProductId: uint64(productId), ProductId: uint64(productID),
ToUin: uin, ToUin: uin,
Gc: groupCode, Gc: groupCode,
Version: "V 8.4.5.4745", Version: "V 8.4.5.4745",

View File

@ -82,14 +82,14 @@ type QQClient struct {
pwdFlag bool pwdFlag bool
lastMessageSeq int32 lastMessageSeq int32
//lastMessageSeqTmp sync.Map // lastMessageSeqTmp sync.Map
msgSvcCache *utils.Cache msgSvcCache *utils.Cache
transCache *utils.Cache transCache *utils.Cache
lastLostMsg string lastLostMsg string
groupSysMsgCache *GroupSystemMessages groupSysMsgCache *GroupSystemMessages
groupMsgBuilders sync.Map groupMsgBuilders sync.Map
onlinePushCache *utils.Cache onlinePushCache *utils.Cache
requestPacketRequestId int32 requestPacketRequestID int32
groupSeq int32 groupSeq int32
friendSeq int32 friendSeq int32
heartbeatEnabled bool heartbeatEnabled bool
@ -178,7 +178,7 @@ func NewClientMd5(uin int64, passwordMd5 [16]byte) *QQClient {
RandomKey: make([]byte, 16), RandomKey: make([]byte, 16),
OutGoingPacketSessionId: []byte{0x02, 0xB0, 0x5B, 0x8B}, OutGoingPacketSessionId: []byte{0x02, 0xB0, 0x5B, 0x8B},
sigInfo: &loginSigInfo{}, sigInfo: &loginSigInfo{},
requestPacketRequestId: 1921334513, requestPacketRequestID: 1921334513,
groupSeq: int32(rand.Intn(20000)), groupSeq: int32(rand.Intn(20000)),
friendSeq: 22911, friendSeq: 22911,
highwayApplyUpSeq: 77918, highwayApplyUpSeq: 77918,
@ -485,8 +485,8 @@ func (c *QQClient) GetFriendList() (*FriendListResponse, error) {
return r, nil return r, nil
} }
func (c *QQClient) GetForwardMessage(resId string) *message.ForwardMessage { func (c *QQClient) GetForwardMessage(resID string) *message.ForwardMessage {
m := c.DownloadForwardMessage(resId) m := c.DownloadForwardMessage(resID)
if m == nil { if m == nil {
return nil return nil
} }
@ -779,11 +779,8 @@ func (c *QQClient) connect() error {
return errors.New("All servers are unreachable") return errors.New("All servers are unreachable")
} }
c.Error("connect server error: %v", err) c.Error("connect server error: %v", err)
if err = c.connect(); err != nil {
return err return err
} }
return nil
}
c.retryTimes = 0 c.retryTimes = 0
c.ConnectTime = time.Now() c.ConnectTime = time.Now()
c.Conn = conn c.Conn = conn
@ -817,7 +814,7 @@ func (c *QQClient) nextSeq() uint16 {
} }
func (c *QQClient) nextPacketSeq() int32 { func (c *QQClient) nextPacketSeq() int32 {
return atomic.AddInt32(&c.requestPacketRequestId, 2) return atomic.AddInt32(&c.requestPacketRequestID, 2)
} }
func (c *QQClient) nextGroupSeq() int32 { func (c *QQClient) nextGroupSeq() int32 {
@ -875,7 +872,7 @@ func (c *QQClient) sendAndWait(seq uint16, pkt []byte, params ...requestParams)
}, params: p}) }, params: p})
retry := 0 retry := 0
for true { for {
select { select {
case rsp := <-ch: case rsp := <-ch:
return rsp.Response, rsp.Error return rsp.Response, rsp.Error
@ -886,12 +883,11 @@ func (c *QQClient) sendAndWait(seq uint16, pkt []byte, params ...requestParams)
continue continue
} }
c.handlers.Delete(seq) c.handlers.Delete(seq)
//c.Error("packet timed out, seq: %v", seq) // c.Error("packet timed out, seq: %v", seq)
//println("Packet Timed out") // println("Packet Timed out")
return nil, errors.New("Packet timed out") return nil, errors.New("Packet timed out")
} }
} }
return nil, nil
} }
// 等待一个或多个数据包解析, 优先级低于 sendAndWait // 等待一个或多个数据包解析, 优先级低于 sendAndWait
@ -939,7 +935,7 @@ func (c *QQClient) netLoop() {
} }
continue continue
} }
data, err := reader.ReadBytes(int(l) - 4) data, _ := reader.ReadBytes(int(l) - 4)
pkt, err := packets.ParseIncomingPacket(data, c.sigInfo.d2Key) pkt, err := packets.ParseIncomingPacket(data, c.sigInfo.d2Key)
if err != nil { if err != nil {
c.Error("parse incoming packet error: %v", err) c.Error("parse incoming packet error: %v", err)

View File

@ -59,7 +59,7 @@ func decodeLoginResponse(c *QQClient, _ *incomingPacketInfo, payload []byte) (in
}, nil }, nil
} }
if t == 2 { if t == 2 {
c.t104, _ = m[0x104] c.t104 = m[0x104]
if m.Exists(0x192) { if m.Exists(0x192) {
return LoginResponse{ return LoginResponse{
Success: false, Success: false,
@ -136,7 +136,6 @@ func decodeLoginResponse(c *QQClient, _ *incomingPacketInfo, payload []byte) (in
ErrorMessage: "", ErrorMessage: "",
}, nil }, nil
} }
} }
if t == 162 { if t == 162 {
@ -444,7 +443,7 @@ func decodeFriendGroupListResponse(_ *QQClient, _ *incomingPacketInfo, payload [
totalFriendCount := r.ReadInt16(5) totalFriendCount := r.ReadInt16(5)
friends := []jce.FriendInfo{} friends := []jce.FriendInfo{}
r.ReadSlice(&friends, 7) r.ReadSlice(&friends, 7)
var l []*FriendInfo var l = make([]*FriendInfo, 0, len(friends))
for _, f := range friends { for _, f := range friends {
l = append(l, &FriendInfo{ l = append(l, &FriendInfo{
Uin: f.FriendUin, Uin: f.FriendUin,
@ -471,7 +470,7 @@ func decodeGroupListResponse(c *QQClient, _ *incomingPacketInfo, payload []byte)
groups := []jce.TroopNumber{} groups := []jce.TroopNumber{}
r.ReadSlice(&vecCookie, 4) r.ReadSlice(&vecCookie, 4)
r.ReadSlice(&groups, 5) r.ReadSlice(&groups, 5)
var l []*GroupInfo var l = make([]*GroupInfo, 0, len(groups))
for _, g := range groups { for _, g := range groups {
l = append(l, &GroupInfo{ l = append(l, &GroupInfo{
Uin: g.GroupUin, Uin: g.GroupUin,
@ -504,7 +503,7 @@ func decodeGroupMemberListResponse(_ *QQClient, _ *incomingPacketInfo, payload [
members := []jce.TroopMemberInfo{} members := []jce.TroopMemberInfo{}
r.ReadSlice(&members, 3) r.ReadSlice(&members, 3)
next := r.ReadInt64(4) next := r.ReadInt64(4)
var l []*GroupMemberInfo var l = make([]*GroupMemberInfo, 0, len(members))
for _, m := range members { for _, m := range members {
l = append(l, &GroupMemberInfo{ l = append(l, &GroupMemberInfo{
Uin: m.MemberUin, Uin: m.MemberUin,
@ -627,15 +626,13 @@ func decodeOnlinePushTransPacket(c *QQClient, _ *incomingPacketInfo, payload []b
case 0x02: case 0x02:
if target == c.Uin { if target == c.Uin {
c.dispatchLeaveGroupEvent(&GroupLeaveEvent{Group: g}) c.dispatchLeaveGroupEvent(&GroupLeaveEvent{Group: g})
} else { } else if m := g.FindMember(target); m != nil {
if m := g.FindMember(target); m != nil {
g.removeMember(target) g.removeMember(target)
c.dispatchMemberLeaveEvent(&MemberLeaveGroupEvent{ c.dispatchMemberLeaveEvent(&MemberLeaveGroupEvent{
Group: g, Group: g,
Member: m, Member: m,
}) })
} }
}
case 0x03: case 0x03:
if err = c.ReloadGroupList(); err != nil { if err = c.ReloadGroupList(); err != nil {
return nil, err return nil, err
@ -645,8 +642,7 @@ func decodeOnlinePushTransPacket(c *QQClient, _ *incomingPacketInfo, payload []b
Group: g, Group: g,
Operator: g.FindMember(operator), Operator: g.FindMember(operator),
}) })
} else { } else if m := g.FindMember(target); m != nil {
if m := g.FindMember(target); m != nil {
g.removeMember(target) g.removeMember(target)
c.dispatchMemberLeaveEvent(&MemberLeaveGroupEvent{ c.dispatchMemberLeaveEvent(&MemberLeaveGroupEvent{
Group: g, Group: g,
@ -654,7 +650,6 @@ func decodeOnlinePushTransPacket(c *QQClient, _ *incomingPacketInfo, payload []b
Operator: g.FindMember(operator), Operator: g.FindMember(operator),
}) })
} }
}
case 0x82: case 0x82:
if m := g.FindMember(target); m != nil { if m := g.FindMember(target); m != nil {
g.removeMember(target) g.removeMember(target)
@ -678,7 +673,7 @@ func decodeOnlinePushTransPacket(c *QQClient, _ *incomingPacketInfo, payload []b
if info.GetMsgType() == 44 { if info.GetMsgType() == 44 {
data.ReadBytes(5) data.ReadBytes(5)
var4 := int32(data.ReadByte()) var4 := int32(data.ReadByte())
var var5 int64 = 0 var var5 = int64(0)
target := int64(uint32(data.ReadInt32())) target := int64(uint32(data.ReadInt32()))
if var4 != 0 && var4 != 1 { if var4 != 0 && var4 != 1 {
var5 = int64(uint32(data.ReadInt32())) var5 = int64(uint32(data.ReadInt32()))
@ -782,11 +777,11 @@ func decodeImageOcrResponse(_ *QQClient, _ *incomingPacketInfo, payload []byte)
return nil, errors.New(rsp.Wording) return nil, errors.New(rsp.Wording)
} }
if rsp.RetCode != 0 { if rsp.RetCode != 0 {
return nil, errors.New(fmt.Sprintf("server error, code: %v msg: %v", rsp.RetCode, rsp.ErrMsg)) return nil, errors.Errorf("server error, code: %v msg: %v", rsp.RetCode, rsp.ErrMsg)
} }
var texts []*TextDetection var texts = make([]*TextDetection, 0, len(rsp.OcrRspBody.TextDetections))
for _, text := range rsp.OcrRspBody.TextDetections { for _, text := range rsp.OcrRspBody.TextDetections {
var points []*Coordinate var points = make([]*Coordinate, 0, len(text.Polygon.Coordinates))
for _, c := range text.Polygon.Coordinates { for _, c := range text.Polygon.Coordinates {
points = append(points, &Coordinate{ points = append(points, &Coordinate{
X: c.X, X: c.X,

View File

@ -59,7 +59,7 @@ type (
Nickname string Nickname string
Remark string Remark string
FaceId int16 FaceId int16
//msgSeqList *utils.Cache // msgSeqList *utils.Cache
} }
SummaryCardInfo struct { SummaryCardInfo struct {

View File

@ -443,7 +443,7 @@ func getSSOAddress() ([]*net.TCPAddr, error) {
reader := jce.NewJceReader(data.Map["HttpServerListRes"][1:]) reader := jce.NewJceReader(data.Map["HttpServerListRes"][1:])
servers := []jce.SsoServerInfo{} servers := []jce.SsoServerInfo{}
reader.ReadSlice(&servers, 2) reader.ReadSlice(&servers, 2)
var adds []*net.TCPAddr var adds = make([]*net.TCPAddr, 0, len(servers))
for _, s := range servers { for _, s := range servers {
if strings.Contains(s.Server, "com") { if strings.Contains(s.Server, "com") {
continue continue
@ -552,9 +552,9 @@ func XmlEscape(c string) string {
return buf.String() return buf.String()
} }
func genForwardTemplate(resId, preview, title, brief, source, summary string, ts int64, items []*msg.PbMultiMsgItem) *message.ForwardElement { func genForwardTemplate(resID, preview, title, brief, source, summary string, ts int64, items []*msg.PbMultiMsgItem) *message.ForwardElement {
template := fmt.Sprintf(`<?xml version='1.0' encoding='UTF-8'?><msg serviceID="35" templateID="1" action="viewMultiMsg" brief="%s" m_resid="%s" m_fileName="%d" tSum="3" sourceMsgId="0" url="" flag="3" adverSign="0" multiMsgFlag="0"><item layout="1"><title color="#000000" size="34">%s</title> %s<hr></hr><summary size="26" color="#808080">%s</summary></item><source name="%s"></source></msg>`, template := fmt.Sprintf(`<?xml version='1.0' encoding='UTF-8'?><msg serviceID="35" templateID="1" action="viewMultiMsg" brief="%s" m_resid="%s" m_fileName="%d" tSum="3" sourceMsgId="0" url="" flag="3" adverSign="0" multiMsgFlag="0"><item layout="1"><title color="#000000" size="34">%s</title> %s<hr></hr><summary size="26" color="#808080">%s</summary></item><source name="%s"></source></msg>`,
brief, resId, ts, title, preview, summary, source, brief, resID, ts, title, preview, summary, source,
) )
for _, item := range items { for _, item := range items {
if item.GetFileName() == "MultiMsg" { if item.GetFileName() == "MultiMsg" {
@ -564,12 +564,12 @@ func genForwardTemplate(resId, preview, title, brief, source, summary string, ts
return &message.ForwardElement{ return &message.ForwardElement{
FileName: strconv.FormatInt(ts, 10), FileName: strconv.FormatInt(ts, 10),
Content: template, Content: template,
ResId: resId, ResId: resID,
Items: items, Items: items,
} }
} }
func genLongTemplate(resId, brief string, ts int64) *message.ServiceElement { func genLongTemplate(resID, brief string, ts int64) *message.ServiceElement {
limited := func() string { limited := func() string {
if len(brief) > 30 { if len(brief) > 30 {
return brief[:30] + "…" return brief[:30] + "…"
@ -577,12 +577,12 @@ func genLongTemplate(resId, brief string, ts int64) *message.ServiceElement {
return brief return brief
}() }()
template := fmt.Sprintf(`<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><msg serviceID="35" templateID="1" action="viewMultiMsg" brief="%s" m_resid="%s" m_fileName="%d" sourceMsgId="0" url="" flag="3" adverSign="0" multiMsgFlag="1"> <item layout="1"> <title>%s</title> <hr hidden="false" style="0"/> <summary>点击查看完整消息</summary> </item> <source name="聊天记录" icon="" action="" appid="-1"/> </msg>`, template := fmt.Sprintf(`<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><msg serviceID="35" templateID="1" action="viewMultiMsg" brief="%s" m_resid="%s" m_fileName="%d" sourceMsgId="0" url="" flag="3" adverSign="0" multiMsgFlag="1"> <item layout="1"> <title>%s</title> <hr hidden="false" style="0"/> <summary>点击查看完整消息</summary> </item> <source name="聊天记录" icon="" action="" appid="-1"/> </msg>`,
XmlEscape(limited), resId, ts, XmlEscape(limited), XmlEscape(limited), resID, ts, XmlEscape(limited),
) )
return &message.ServiceElement{ return &message.ServiceElement{
Id: 35, Id: 35,
Content: template, Content: template,
ResId: resId, ResId: resID,
SubType: "Long", SubType: "Long",
} }
} }

View File

@ -109,12 +109,12 @@ func (fs *GroupFileSystem) Root() ([]*GroupFile, []*GroupFolder, error) {
return fs.GetFilesByFolder("/") return fs.GetFilesByFolder("/")
} }
func (fs *GroupFileSystem) GetFilesByFolder(folderId string) ([]*GroupFile, []*GroupFolder, error) { func (fs *GroupFileSystem) GetFilesByFolder(folderID string) ([]*GroupFile, []*GroupFolder, error) {
var startIndex uint32 = 0 var startIndex uint32 = 0
var files []*GroupFile var files []*GroupFile
var folders []*GroupFolder var folders []*GroupFolder
for { for {
i, err := fs.client.sendAndWait(fs.client.buildGroupFileListRequestPacket(fs.GroupCode, folderId, startIndex)) i, err := fs.client.sendAndWait(fs.client.buildGroupFileListRequestPacket(fs.GroupCode, folderID, startIndex))
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
} }
@ -191,7 +191,7 @@ func (fs *GroupFileSystem) UploadFile(p, name, folderId string) error {
return fs.client.send(pkt) return fs.client.send(pkt)
} }
if len(rsp.UploadIpLanV4) == 0 { if len(rsp.UploadIpLanV4) == 0 {
return errors.New("server requires unsupported ftn upload.") return errors.New("server requires unsupported ftn upload")
} }
ext, _ := proto.Marshal(&exciting.GroupFileUploadExt{ ext, _ := proto.Marshal(&exciting.GroupFileUploadExt{
Unknown1: proto.Int32(100), Unknown1: proto.Int32(100),
@ -243,22 +243,22 @@ func (fs *GroupFileSystem) GetDownloadUrl(file *GroupFile) string {
// DeleteFile 删除群文件,需要管理权限. // DeleteFile 删除群文件,需要管理权限.
// 返回错误, 空为删除成功 // 返回错误, 空为删除成功
func (fs *GroupFileSystem) DeleteFile(parentFolderId, fileId string, busId int32) string { func (fs *GroupFileSystem) DeleteFile(parentFolderID, fileId string, busId int32) string {
i, err := fs.client.sendAndWait(fs.client.buildGroupFileDeleteReqPacket(fs.GroupCode, parentFolderId, fileId, busId)) i, err := fs.client.sendAndWait(fs.client.buildGroupFileDeleteReqPacket(fs.GroupCode, parentFolderID, fileId, busId))
if err != nil { if err != nil {
return err.Error() return err.Error()
} }
return i.(string) return i.(string)
} }
func (c *QQClient) buildGroupFileUploadReqPacket(parentFolderId, fileName string, groupCode, fileSize int64, md5, sha1 []byte) (uint16, []byte) { func (c *QQClient) buildGroupFileUploadReqPacket(parentFolderID, fileName string, groupCode, fileSize int64, md5, sha1 []byte) (uint16, []byte) {
seq := c.nextSeq() seq := c.nextSeq()
b, _ := proto.Marshal(&oidb.D6D6ReqBody{UploadFileReq: &oidb.UploadFileReqBody{ b, _ := proto.Marshal(&oidb.D6D6ReqBody{UploadFileReq: &oidb.UploadFileReqBody{
GroupCode: groupCode, GroupCode: groupCode,
AppId: 3, AppId: 3,
BusId: 102, BusId: 102,
Entrance: 5, Entrance: 5,
ParentFolderId: parentFolderId, ParentFolderId: parentFolderID,
FileName: fileName, FileName: fileName,
LocalPath: "/storage/emulated/0/Pictures/files/s/" + fileName, LocalPath: "/storage/emulated/0/Pictures/files/s/" + fileName,
Int64FileSize: fileSize, Int64FileSize: fileSize,
@ -277,13 +277,13 @@ func (c *QQClient) buildGroupFileUploadReqPacket(parentFolderId, fileName string
return seq, packet return seq, packet
} }
func (c *QQClient) buildGroupFileFeedsRequest(groupCode int64, fileId string, busId, msgRand int32) (uint16, []byte) { func (c *QQClient) buildGroupFileFeedsRequest(groupCode int64, fileID string, busId, msgRand int32) (uint16, []byte) {
seq := c.nextSeq() seq := c.nextSeq()
req := c.packOIDBPackageProto(1753, 4, &oidb.D6D9ReqBody{FeedsInfoReq: &oidb.FeedsReqBody{ req := c.packOIDBPackageProto(1753, 4, &oidb.D6D9ReqBody{FeedsInfoReq: &oidb.FeedsReqBody{
GroupCode: proto.Uint64(uint64(groupCode)), GroupCode: proto.Uint64(uint64(groupCode)),
AppId: proto.Uint32(3), AppId: proto.Uint32(3),
FeedsInfoList: []*oidb.GroupFileFeedsInfo{{ FeedsInfoList: []*oidb.GroupFileFeedsInfo{{
FileId: &fileId, FileId: &fileID,
FeedFlag: proto.Uint32(1), FeedFlag: proto.Uint32(1),
BusId: proto.Uint32(uint32(busId)), BusId: proto.Uint32(uint32(busId)),
MsgRandom: proto.Uint32(uint32(msgRand)), MsgRandom: proto.Uint32(uint32(msgRand)),
@ -294,12 +294,12 @@ func (c *QQClient) buildGroupFileFeedsRequest(groupCode int64, fileId string, bu
} }
// OidbSvc.0x6d8_1 // OidbSvc.0x6d8_1
func (c *QQClient) buildGroupFileListRequestPacket(groupCode int64, folderId string, startIndex uint32) (uint16, []byte) { func (c *QQClient) buildGroupFileListRequestPacket(groupCode int64, folderID string, startIndex uint32) (uint16, []byte) {
seq := c.nextSeq() seq := c.nextSeq()
body := &oidb.D6D8ReqBody{FileListInfoReq: &oidb.GetFileListReqBody{ body := &oidb.D6D8ReqBody{FileListInfoReq: &oidb.GetFileListReqBody{
GroupCode: proto.Uint64(uint64(groupCode)), GroupCode: proto.Uint64(uint64(groupCode)),
AppId: proto.Uint32(3), AppId: proto.Uint32(3),
FolderId: &folderId, FolderId: &folderID,
FileCount: proto.Uint32(20), FileCount: proto.Uint32(20),
AllFileCount: proto.Uint32(0), AllFileCount: proto.Uint32(0),
ReqFrom: proto.Uint32(3), ReqFrom: proto.Uint32(3),

View File

@ -564,8 +564,8 @@ func (c *QQClient) parseGroupMessage(m *msg.Message) *message.GroupMessage {
} }
// SetEssenceMessage 设为群精华消息 // SetEssenceMessage 设为群精华消息
func (c *QQClient) SetEssenceMessage(groupCode int64, msgId, msgInternalId int32) error { func (c *QQClient) SetEssenceMessage(groupCode int64, msgID, msgInternalId int32) error {
r, err := c.sendAndWait(c.buildEssenceMsgOperatePacket(groupCode, uint32(msgId), uint32(msgInternalId), 1)) r, err := c.sendAndWait(c.buildEssenceMsgOperatePacket(groupCode, uint32(msgID), uint32(msgInternalId), 1))
if err != nil { if err != nil {
return errors.Wrap(err, "set essence msg network") return errors.Wrap(err, "set essence msg network")
} }
@ -577,8 +577,8 @@ func (c *QQClient) SetEssenceMessage(groupCode int64, msgId, msgInternalId int32
} }
// DeleteEssenceMessage 移出群精华消息 // DeleteEssenceMessage 移出群精华消息
func (c *QQClient) DeleteEssenceMessage(groupCode int64, msgId, msgInternalId int32) error { func (c *QQClient) DeleteEssenceMessage(groupCode int64, msgID, msgInternalId int32) error {
r, err := c.sendAndWait(c.buildEssenceMsgOperatePacket(groupCode, uint32(msgId), uint32(msgInternalId), 2)) r, err := c.sendAndWait(c.buildEssenceMsgOperatePacket(groupCode, uint32(msgID), uint32(msgInternalId), 2))
if err != nil { if err != nil {
return errors.Wrap(err, "set essence msg networ") return errors.Wrap(err, "set essence msg networ")
} }

View File

@ -23,8 +23,8 @@ import (
"google.golang.org/protobuf/proto" "google.golang.org/protobuf/proto"
) )
func (c *QQClient) highwayUpload(ip uint32, port int, updKey, data []byte, cmdId int32) error { func (c *QQClient) highwayUpload(ip uint32, port int, updKey, data []byte, cmdID int32) error {
return c.highwayUploadStream(ip, port, updKey, bytes.NewReader(data), cmdId) return c.highwayUploadStream(ip, port, updKey, bytes.NewReader(data), cmdID)
} }
func (c *QQClient) highwayUploadStream(ip uint32, port int, updKey []byte, stream io.ReadSeeker, cmdId int32) error { func (c *QQClient) highwayUploadStream(ip uint32, port int, updKey []byte, stream io.ReadSeeker, cmdId int32) error {
@ -48,10 +48,10 @@ func (c *QQClient) highwayUploadStream(ip uint32, port int, updKey []byte, strea
for { for {
chunk := make([]byte, chunkSize) chunk := make([]byte, chunkSize)
rl, err := io.ReadFull(stream, chunk) rl, err := io.ReadFull(stream, chunk)
if err == io.EOF { if errors.Is(err, io.EOF) {
break break
} }
if err == io.ErrUnexpectedEOF { if errors.Is(err, io.ErrUnexpectedEOF) {
chunk = chunk[:rl] chunk = chunk[:rl]
} }
ch := md5.Sum(chunk) ch := md5.Sum(chunk)
@ -72,7 +72,7 @@ func (c *QQClient) highwayUploadStream(ip uint32, port int, updKey []byte, strea
Datalength: int32(rl), Datalength: int32(rl),
Serviceticket: updKey, Serviceticket: updKey,
Md5: ch[:], Md5: ch[:],
FileMd5: fh[:], FileMd5: fh,
}, },
ReqExtendinfo: EmptyBytes, ReqExtendinfo: EmptyBytes,
}) })
@ -131,10 +131,10 @@ func (c *QQClient) highwayUploadByBDH(stream io.ReadSeeker, cmdId int32, ticket,
for { for {
chunk := make([]byte, chunkSize) chunk := make([]byte, chunkSize)
rl, err := io.ReadFull(stream, chunk) rl, err := io.ReadFull(stream, chunk)
if err == io.EOF { if errors.Is(err, io.EOF) {
break break
} }
if err == io.ErrUnexpectedEOF { if errors.Is(err, io.ErrUnexpectedEOF) {
chunk = chunk[:rl] chunk = chunk[:rl]
} }
ch := md5.Sum(chunk) ch := md5.Sum(chunk)
@ -306,7 +306,7 @@ func (c *QQClient) highwayUploadFileMultiThreadingByBDH(path string, cmdId int32
Datalength: int32(ri), Datalength: int32(ri),
Serviceticket: ticket, Serviceticket: ticket,
Md5: ch[:], Md5: ch[:],
FileMd5: fh[:], FileMd5: fh,
}, },
ReqExtendinfo: ext, ReqExtendinfo: ext,
}) })

View File

@ -14,8 +14,8 @@ import (
"github.com/Mrs4s/MiraiGo/message" "github.com/Mrs4s/MiraiGo/message"
"github.com/Mrs4s/MiraiGo/protocol/packets" "github.com/Mrs4s/MiraiGo/protocol/packets"
"github.com/Mrs4s/MiraiGo/utils" "github.com/Mrs4s/MiraiGo/utils"
"github.com/golang/protobuf/proto"
"github.com/pkg/errors" "github.com/pkg/errors"
"google.golang.org/protobuf/proto"
) )
func init() { func init() {
@ -26,7 +26,7 @@ func (c *QQClient) UploadGroupImage(groupCode int64, img io.ReadSeeker) (*messag
_, _ = img.Seek(0, io.SeekStart) // safe _, _ = img.Seek(0, io.SeekStart) // safe
fh, length := utils.ComputeMd5AndLength(img) fh, length := utils.ComputeMd5AndLength(img)
_, _ = img.Seek(0, io.SeekStart) _, _ = img.Seek(0, io.SeekStart)
seq, pkt := c.buildGroupImageStorePacket(groupCode, fh[:], int32(length)) seq, pkt := c.buildGroupImageStorePacket(groupCode, fh, int32(length))
r, err := c.sendAndWait(seq, pkt) r, err := c.sendAndWait(seq, pkt)
if err != nil { if err != nil {
return nil, err return nil, err
@ -57,7 +57,7 @@ ok:
if bytes.Equal(tmp, []byte{0x47, 0x49, 0x46, 0x38}) { if bytes.Equal(tmp, []byte{0x47, 0x49, 0x46, 0x38}) {
imageType = 2000 imageType = 2000
} }
return message.NewGroupImage(binary.CalculateImageResourceId(fh[:]), fh[:], rsp.FileId, int32(length), int32(i.Width), int32(i.Height), imageType), nil return message.NewGroupImage(binary.CalculateImageResourceId(fh), fh, rsp.FileId, int32(length), int32(i.Width), int32(i.Height), imageType), nil
} }
func (c *QQClient) UploadGroupImageByFile(groupCode int64, path string) (*message.GroupImageElement, error) { func (c *QQClient) UploadGroupImageByFile(groupCode int64, path string) (*message.GroupImageElement, error) {
@ -110,7 +110,7 @@ func (c *QQClient) uploadPrivateImage(target int64, img io.ReadSeeker, count int
count++ count++
fh, length := utils.ComputeMd5AndLength(img) fh, length := utils.ComputeMd5AndLength(img)
_, _ = img.Seek(0, io.SeekStart) _, _ = img.Seek(0, io.SeekStart)
e, err := c.QueryFriendImage(target, fh[:], int32(length)) e, err := c.QueryFriendImage(target, fh, int32(length))
if errors.Is(err, ErrNotExists) { if errors.Is(err, ErrNotExists) {
// use group highway upload and query again for image id. // use group highway upload and query again for image id.
if _, err = c.UploadGroupImage(target, img); err != nil { if _, err = c.UploadGroupImage(target, img); err != nil {

View File

@ -62,7 +62,7 @@ func decodeMultiApplyUpResponse(_ *QQClient, _ *incomingPacketInfo, payload []by
} }
// MultiMsg.ApplyDown // MultiMsg.ApplyDown
func (c *QQClient) buildMultiApplyDownPacket(resId string) (uint16, []byte) { func (c *QQClient) buildMultiApplyDownPacket(resID string) (uint16, []byte) {
seq := c.nextSeq() seq := c.nextSeq()
req := &multimsg.MultiReqBody{ req := &multimsg.MultiReqBody{
Subcmd: 2, Subcmd: 2,
@ -72,7 +72,7 @@ func (c *QQClient) buildMultiApplyDownPacket(resId string) (uint16, []byte) {
BuildVer: "8.2.0.1296", BuildVer: "8.2.0.1296",
MultimsgApplydownReq: []*multimsg.MultiMsgApplyDownReq{ MultimsgApplydownReq: []*multimsg.MultiMsgApplyDownReq{
{ {
MsgResid: []byte(resId), MsgResid: []byte(resID),
MsgType: 3, MsgType: 3,
}, },
}, },

View File

@ -38,9 +38,9 @@ type (
) )
// grayTipProcessor 提取出来专门用于处理群内 notify tips // grayTipProcessor 提取出来专门用于处理群内 notify tips
func (c *QQClient) grayTipProcessor(groupId int64, tipInfo *notify.GeneralGrayTipInfo) { func (c *QQClient) grayTipProcessor(groupID int64, tipInfo *notify.GeneralGrayTipInfo) {
if tipInfo.BusiType == 12 && tipInfo.BusiId == 1061 { if tipInfo.BusiType == 12 && tipInfo.BusiId == 1061 {
var sender int64 = 0 var sender = int64(0)
receiver := c.Uin receiver := c.Uin
for _, templ := range tipInfo.MsgTemplParam { for _, templ := range tipInfo.MsgTemplParam {
if templ.Name == "uin_str1" { if templ.Name == "uin_str1" {
@ -52,7 +52,7 @@ func (c *QQClient) grayTipProcessor(groupId int64, tipInfo *notify.GeneralGrayTi
} }
if sender != 0 { if sender != 0 {
c.dispatchGroupNotifyEvent(&GroupPokeNotifyEvent{ c.dispatchGroupNotifyEvent(&GroupPokeNotifyEvent{
GroupCode: groupId, GroupCode: groupID,
Sender: sender, Sender: sender,
Receiver: receiver, Receiver: receiver,
}) })
@ -71,7 +71,7 @@ func (c *QQClient) grayTipProcessor(groupId int64, tipInfo *notify.GeneralGrayTi
} }
} }
c.dispatchGroupNotifyEvent(&MemberHonorChangedNotifyEvent{ c.dispatchGroupNotifyEvent(&MemberHonorChangedNotifyEvent{
GroupCode: groupId, GroupCode: groupID,
Honor: func() HonorType { Honor: func() HonorType {
switch tipInfo.TemplId { switch tipInfo.TemplId {
case 1052: case 1052:

View File

@ -41,7 +41,7 @@ func decodeOnlinePushReqPacket(c *QQClient, info *incomingPacketInfo, payload []
// 0x2dc // 0x2dc
if m.MsgType == 732 { if m.MsgType == 732 {
r := binary.NewReader(m.VMsg) r := binary.NewReader(m.VMsg)
groupId := int64(uint32(r.ReadInt32())) groupID := int64(uint32(r.ReadInt32()))
iType := r.ReadByte() iType := r.ReadByte()
r.ReadByte() r.ReadByte()
switch iType { switch iType {
@ -54,7 +54,7 @@ func decodeOnlinePushReqPacket(c *QQClient, info *incomingPacketInfo, payload []
target := int64(uint32(r.ReadInt32())) target := int64(uint32(r.ReadInt32()))
t := r.ReadInt32() t := r.ReadInt32()
c.dispatchGroupMuteEvent(&GroupMuteEvent{ c.dispatchGroupMuteEvent(&GroupMuteEvent{
GroupCode: groupId, GroupCode: groupID,
OperatorUin: operator, OperatorUin: operator,
TargetUin: target, TargetUin: target,
Time: t, Time: t,
@ -69,7 +69,7 @@ func decodeOnlinePushReqPacket(c *QQClient, info *incomingPacketInfo, payload []
continue continue
} }
c.dispatchGroupMessageRecalledEvent(&GroupMessageRecalledEvent{ c.dispatchGroupMessageRecalledEvent(&GroupMessageRecalledEvent{
GroupCode: groupId, GroupCode: groupID,
OperatorUin: b.OptMsgRecall.Uin, OperatorUin: b.OptMsgRecall.Uin,
AuthorUin: rm.AuthorUin, AuthorUin: rm.AuthorUin,
MessageId: rm.Seq, MessageId: rm.Seq,
@ -78,12 +78,12 @@ func decodeOnlinePushReqPacket(c *QQClient, info *incomingPacketInfo, payload []
} }
} }
if b.OptGeneralGrayTip != nil { if b.OptGeneralGrayTip != nil {
c.grayTipProcessor(groupId, b.OptGeneralGrayTip) c.grayTipProcessor(groupID, b.OptGeneralGrayTip)
} }
if b.OptMsgRedTips != nil { if b.OptMsgRedTips != nil {
if b.OptMsgRedTips.LuckyFlag == 1 { // 运气王提示 if b.OptMsgRedTips.LuckyFlag == 1 { // 运气王提示
c.dispatchGroupNotifyEvent(&GroupRedBagLuckyKingNotifyEvent{ c.dispatchGroupNotifyEvent(&GroupRedBagLuckyKingNotifyEvent{
GroupCode: groupId, GroupCode: groupID,
Sender: int64(b.OptMsgRedTips.SenderUin), Sender: int64(b.OptMsgRedTips.SenderUin),
LuckyKing: int64(b.OptMsgRedTips.LuckyUin), LuckyKing: int64(b.OptMsgRedTips.LuckyUin),
}) })
@ -178,8 +178,7 @@ func msgType0x210Sub27Decoder(c *QQClient, protobuf []byte) error {
for _, m := range s27.ModInfos { for _, m := range s27.ModInfos {
if m.ModGroupProfile != nil { if m.ModGroupProfile != nil {
for _, info := range m.ModGroupProfile.GroupProfileInfos { for _, info := range m.ModGroupProfile.GroupProfileInfos {
switch info.GetField() { // 1 -> group name 2 -> group head 3 -> group creditLevel if info.GetField() == 1 {
case 1:
if g := c.FindGroup(int64(m.ModGroupProfile.GetGroupCode())); g != nil { if g := c.FindGroup(int64(m.ModGroupProfile.GetGroupCode())); g != nil {
old := g.Name old := g.Name
g.Name = string(info.GetValue()) g.Name = string(info.GetValue())

View File

@ -276,7 +276,7 @@ func decodeGroupPttStoreResponse(_ *QQClient, _ *incomingPacketInfo, payload []b
if rsp.BoolFileExit { if rsp.BoolFileExit {
return pttUploadResponse{IsExists: true}, nil return pttUploadResponse{IsExists: true}, nil
} }
var ip []string var ip = make([]string, 0, len(rsp.Uint32UpIp))
for _, i := range rsp.Uint32UpIp { for _, i := range rsp.Uint32UpIp {
ip = append(ip, binary.UInt32ToIPV4Address(uint32(i))) ip = append(ip, binary.UInt32ToIPV4Address(uint32(i)))
} }

View File

@ -10,24 +10,24 @@ import (
// 撤回相关处理逻辑 // 撤回相关处理逻辑
func (c *QQClient) RecallGroupMessage(groupCode int64, msgId, msgInternalId int32) error { func (c *QQClient) RecallGroupMessage(groupCode int64, msgID, msgInternalId int32) error {
if m, _ := c.GetGroupMessages(groupCode, int64(msgId), int64(msgId)); len(m) > 0 { if m, _ := c.GetGroupMessages(groupCode, int64(msgID), int64(msgID)); len(m) > 0 {
content := m[0].OriginalObject.Content content := m[0].OriginalObject.Content
if content.GetPkgNum() > 1 { if content.GetPkgNum() > 1 {
if m, err := c.GetGroupMessages(groupCode, int64(msgId-content.GetPkgIndex()-1), int64(msgId+(content.GetPkgNum()-content.GetPkgIndex()+1))); err == nil { if m, err := c.GetGroupMessages(groupCode, int64(msgID-content.GetPkgIndex()-1), int64(msgID+(content.GetPkgNum()-content.GetPkgIndex()+1))); err == nil {
if flag, _ := c.internalGroupRecall(groupCode, msgInternalId, m); flag { if flag, _ := c.internalGroupRecall(groupCode, msgInternalId, m); flag {
return nil return nil
} }
} }
} }
} }
_, err := c.sendAndWait(c.buildGroupRecallPacket(groupCode, msgId, msgInternalId)) _, err := c.sendAndWait(c.buildGroupRecallPacket(groupCode, msgID, msgInternalId))
return err return err
} }
func (c *QQClient) internalGroupRecall(groupCode int64, msgInternalId int32, m []*message.GroupMessage) (flag bool, err error) { func (c *QQClient) internalGroupRecall(groupCode int64, msgInternalID int32, m []*message.GroupMessage) (flag bool, err error) {
for _, item := range m { for _, item := range m {
if item.InternalId == msgInternalId { if item.InternalId == msgInternalID {
flag = true flag = true
if _, err := c.sendAndWait(c.buildGroupRecallPacket(groupCode, item.Id, item.InternalId)); err != nil { if _, err := c.sendAndWait(c.buildGroupRecallPacket(groupCode, item.Id, item.InternalId)); err != nil {
return false, err return false, err
@ -37,8 +37,8 @@ func (c *QQClient) internalGroupRecall(groupCode int64, msgInternalId int32, m [
return flag, nil return flag, nil
} }
func (c *QQClient) RecallPrivateMessage(uin, ts int64, msgId, msgInternalId int32) error { func (c *QQClient) RecallPrivateMessage(uin, ts int64, msgID, msgInternalId int32) error {
_, err := c.sendAndWait(c.buildPrivateRecallPacket(uin, ts, msgId, msgInternalId)) _, err := c.sendAndWait(c.buildPrivateRecallPacket(uin, ts, msgID, msgInternalId))
return err return err
} }

View File

@ -56,7 +56,7 @@ func (c *QQClient) GetAllowedClients() ([]*OtherClientInfo, error) {
return nil, err return nil, err
} }
list := i.([]jce.SvcDevLoginInfo) list := i.([]jce.SvcDevLoginInfo)
var ret []*OtherClientInfo var ret = make([]*OtherClientInfo, 0, len(list))
for _, l := range list { for _, l := range list {
ret = append(ret, &OtherClientInfo{ ret = append(ret, &OtherClientInfo{
AppId: l.AppId, AppId: l.AppId,
@ -210,7 +210,7 @@ func (c *QQClient) buildSyncMsgRequestPacket() (uint16, []byte) {
}, },
}}) }})
regReq := &jce.SvcReqRegisterNew{ regReq := &jce.SvcReqRegisterNew{
RequestOptional: 128 | 0 | 64 | 256 | 2 | 8192 | 16384 | 65536, RequestOptional: 128 | 64 | 256 | 2 | 8192 | 16384 | 65536,
DisGroupMsgFilter: 1, DisGroupMsgFilter: 1,
C2CMsg: &jce.SvcReqGetMsgV2{ C2CMsg: &jce.SvcReqGetMsgV2{
Uin: c.Uin, Uin: c.Uin,

View File

@ -134,11 +134,11 @@ func (c *QQClient) buildSystemMsgNewGroupPacket(suspicious bool) (uint16, []byte
} }
// ProfileService.Pb.ReqSystemMsgAction.Group // ProfileService.Pb.ReqSystemMsgAction.Group
func (c *QQClient) buildSystemMsgGroupActionPacket(reqId, requester, group int64, msgType int32, isInvite, accept, block bool, reason string) (uint16, []byte) { func (c *QQClient) buildSystemMsgGroupActionPacket(reqID, requester, group int64, msgType int32, isInvite, accept, block bool, reason string) (uint16, []byte) {
seq := c.nextSeq() seq := c.nextSeq()
req := &structmsg.ReqSystemMsgAction{ req := &structmsg.ReqSystemMsgAction{
MsgType: msgType, MsgType: msgType,
MsgSeq: reqId, MsgSeq: reqID,
ReqUin: requester, ReqUin: requester,
SubType: 1, SubType: 1,
SrcId: 3, SrcId: 3,
@ -174,11 +174,11 @@ func (c *QQClient) buildSystemMsgGroupActionPacket(reqId, requester, group int64
} }
// ProfileService.Pb.ReqSystemMsgAction.Friend // ProfileService.Pb.ReqSystemMsgAction.Friend
func (c *QQClient) buildSystemMsgFriendActionPacket(reqId, requester int64, accept bool) (uint16, []byte) { func (c *QQClient) buildSystemMsgFriendActionPacket(reqID, requester int64, accept bool) (uint16, []byte) {
seq := c.nextSeq() seq := c.nextSeq()
req := &structmsg.ReqSystemMsgAction{ req := &structmsg.ReqSystemMsgAction{
MsgType: 1, MsgType: 1,
MsgSeq: reqId, MsgSeq: reqID,
ReqUin: requester, ReqUin: requester,
SubType: 1, SubType: 1,
SrcId: 6, SrcId: 6,

View File

@ -150,9 +150,9 @@ func (c *QQClient) decodeT186(data []byte) {
// --- tlv readers --- // --- tlv readers ---
func readT125(data []byte) (openId, openKey []byte) { func readT125(data []byte) (openID, openKey []byte) {
reader := binary.NewReader(data) reader := binary.NewReader(data)
openId = reader.ReadBytesShort() openID = reader.ReadBytesShort()
openKey = reader.ReadBytesShort() openKey = reader.ReadBytesShort()
return return
} }
@ -166,9 +166,9 @@ func readT11A(data []byte) (nick string, age, gender uint16) {
return return
} }
func readT199(data []byte) (openId, payToken []byte) { func readT199(data []byte) (openID, payToken []byte) {
reader := binary.NewReader(data) reader := binary.NewReader(data)
openId = reader.ReadBytesShort() openID = reader.ReadBytesShort()
payToken = reader.ReadBytesShort() payToken = reader.ReadBytesShort()
return return
} }

View File

@ -588,7 +588,7 @@ func (forMsg *ForwardMessage) CalculateValidationDataForward(seq, random int32,
} }
func (forMsg *ForwardMessage) packForwardMsg(seq int32, random int32, groupCode int64) []*msg.Message { func (forMsg *ForwardMessage) packForwardMsg(seq int32, random int32, groupCode int64) []*msg.Message {
var msgs []*msg.Message var msgs = make([]*msg.Message, 0, len(forMsg.Nodes))
for _, node := range forMsg.Nodes { for _, node := range forMsg.Nodes {
msgs = append(msgs, &msg.Message{ msgs = append(msgs, &msg.Message{
Head: &msg.MessageHead{ Head: &msg.MessageHead{

View File

@ -5,7 +5,7 @@ import (
"github.com/Mrs4s/MiraiGo/binary" "github.com/Mrs4s/MiraiGo/binary"
"github.com/Mrs4s/MiraiGo/client/pb/msg" "github.com/Mrs4s/MiraiGo/client/pb/msg"
"github.com/golang/protobuf/proto" "google.golang.org/protobuf/proto"
) )
var imgOld = []byte{0x15, 0x36, 0x20, 0x39, 0x32, 0x6B, 0x41, 0x31, 0x00, 0x38, 0x37, 0x32, 0x66, 0x30, 0x36, 0x36, 0x30, 0x33, 0x61, 0x65, 0x31, 0x30, 0x33, 0x62, 0x37, 0x20, 0x20, 0x20, 0x20, 0x20, var imgOld = []byte{0x15, 0x36, 0x20, 0x39, 0x32, 0x6B, 0x41, 0x31, 0x00, 0x38, 0x37, 0x32, 0x66, 0x30, 0x36, 0x36, 0x30, 0x33, 0x61, 0x65, 0x31, 0x30, 0x33, 0x62, 0x37, 0x20, 0x20, 0x20, 0x20, 0x20,
@ -101,7 +101,7 @@ func (e *GroupImageElement) Pack() (r []*msg.Elem) {
FilePath: &e.ImageId, FilePath: &e.ImageId,
ImageType: &e.ImageType, ImageType: &e.ImageType,
Size: &e.Size, Size: &e.Size,
Md5: e.Md5[:], Md5: e.Md5,
Flag: make([]byte, 4), Flag: make([]byte, 4),
//OldData: imgOld, //OldData: imgOld,
}, },
@ -216,7 +216,7 @@ func (e *GroupFlashPicElement) Pack() (r []*msg.Elem) {
FileId: proto.Int32(int32(e.FileId)), FileId: proto.Int32(int32(e.FileId)),
FilePath: &e.ImageId, FilePath: &e.ImageId,
Size: &e.Size, Size: &e.Size,
Md5: e.Md5[:], Md5: e.Md5,
Flag: make([]byte, 4), Flag: make([]byte, 4),
}, },
} }
@ -250,7 +250,7 @@ func (e *GroupShowPicElement) Pack() (r []*msg.Elem) {
FileId: proto.Int32(int32(e.FileId)), FileId: proto.Int32(int32(e.FileId)),
FilePath: &e.ImageId, FilePath: &e.ImageId,
Size: &e.Size, Size: &e.Size,
Md5: e.Md5[:], Md5: e.Md5,
Flag: []byte{0x11, 0x00, 0x00, 0x00}, Flag: []byte{0x11, 0x00, 0x00, 0x00},
//OldData: imgOld, //OldData: imgOld,
PbReserve: reserve, PbReserve: reserve,

View File

@ -25,7 +25,7 @@ func BuildLoginPacket(uin int64, bodyType byte, key, body, extraData []byte) []b
return w.Bytes() return w.Bytes()
} }
func BuildUniPacket(uin int64, seq uint16, commandName string, encryptType byte, sessionId, extraData, key, body []byte) []byte { func BuildUniPacket(uin int64, seq uint16, commandName string, encryptType byte, sessionID, extraData, key, body []byte) []byte {
w := binary.NewWriter() w := binary.NewWriter()
w.WriteIntLvPacket(4, func(w *binary.Writer) { w.WriteIntLvPacket(4, func(w *binary.Writer) {
w.WriteUInt32(0x0B) w.WriteUInt32(0x0B)
@ -34,7 +34,7 @@ func BuildUniPacket(uin int64, seq uint16, commandName string, encryptType byte,
w.WriteByte(0) w.WriteByte(0)
w.WriteString(strconv.FormatInt(uin, 10)) w.WriteString(strconv.FormatInt(uin, 10))
w.EncryptAndWrite(key, binary.NewWriterF(func(w *binary.Writer) { w.EncryptAndWrite(key, binary.NewWriterF(func(w *binary.Writer) {
w.WriteUniPacket(commandName, sessionId, extraData, body) w.WriteUniPacket(commandName, sessionID, extraData, body)
})) }))
}) })
return w.Bytes() return w.Bytes()

View File

@ -72,12 +72,12 @@ func BuildCode2DRequestPacket(seq uint32, j uint64, cmd uint16, bodyFunc func(wr
}) })
} }
func BuildSsoPacket(seq uint16, appId uint32, commandName, imei string, extData, outPacketSessionId, body, ksid []byte) []byte { func BuildSsoPacket(seq uint16, appID uint32, commandName, imei string, extData, outPacketSessionId, body, ksid []byte) []byte {
p := binary.NewWriter() p := binary.NewWriter()
p.WriteIntLvPacket(4, func(writer *binary.Writer) { p.WriteIntLvPacket(4, func(writer *binary.Writer) {
writer.WriteUInt32(uint32(seq)) writer.WriteUInt32(uint32(seq))
writer.WriteUInt32(appId) writer.WriteUInt32(appID)
writer.WriteUInt32(appId) writer.WriteUInt32(appID)
writer.Write([]byte{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00}) writer.Write([]byte{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00})
if len(extData) == 0 || len(extData) == 4 { if len(extData) == 0 || len(extData) == 4 {
writer.WriteUInt32(0x04) writer.WriteUInt32(0x04)
@ -142,7 +142,7 @@ func parseSsoFrame(payload []byte, flag2 byte) (*IncomingPacket, error) {
if reader.ReadInt32()-4 > int32(reader.Len()) { if reader.ReadInt32()-4 > int32(reader.Len()) {
return nil, errors.WithStack(ErrPacketDropped) return nil, errors.WithStack(ErrPacketDropped)
} }
seqId := reader.ReadInt32() seqID := reader.ReadInt32()
retCode := reader.ReadInt32() retCode := reader.ReadInt32()
if retCode != 0 { if retCode != 0 {
if retCode == -10008 { if retCode == -10008 {
@ -152,13 +152,13 @@ func parseSsoFrame(payload []byte, flag2 byte) (*IncomingPacket, error) {
} }
reader.ReadBytes(int(reader.ReadInt32()) - 4) // extra data reader.ReadBytes(int(reader.ReadInt32()) - 4) // extra data
commandName := reader.ReadString() commandName := reader.ReadString()
sessionId := reader.ReadBytes(int(reader.ReadInt32()) - 4) sessionID := reader.ReadBytes(int(reader.ReadInt32()) - 4)
if commandName == "Heartbeat.Alive" { if commandName == "Heartbeat.Alive" {
return &IncomingPacket{ return &IncomingPacket{
SequenceId: uint16(seqId), SequenceId: uint16(seqID),
Flag2: flag2, Flag2: flag2,
CommandName: commandName, CommandName: commandName,
SessionId: sessionId, SessionId: sessionID,
Payload: []byte{}, Payload: []byte{},
}, nil }, nil
} }
@ -182,10 +182,10 @@ func parseSsoFrame(payload []byte, flag2 byte) (*IncomingPacket, error) {
return nil return nil
}() }()
return &IncomingPacket{ return &IncomingPacket{
SequenceId: uint16(seqId), SequenceId: uint16(seqID),
Flag2: flag2, Flag2: flag2,
CommandName: commandName, CommandName: commandName,
SessionId: sessionId, SessionId: sessionID,
Payload: packet, Payload: packet,
}, nil }, nil
} }

View File

@ -44,7 +44,7 @@ func ChunkString(s string, chunkSize int) []string {
func ChineseLength(str string, limit int) int { func ChineseLength(str string, limit int) int {
sum := 0 sum := 0
for _, r := range []rune(str) { for _, r := range str {
switch { switch {
case r >= '\u0000' && r <= '\u007F': case r >= '\u0000' && r <= '\u007F':
sum += 1 sum += 1
@ -62,9 +62,9 @@ func ChineseLength(str string, limit int) int {
return sum return sum
} }
// from github.com/savsgio/gotils/strconv
// B2S converts byte slice to a string without memory allocation. // B2S converts byte slice to a string without memory allocation.
// See https://groups.google.com/forum/#!msg/Golang-Nuts/ENgbUzYvCuU/90yGx7GUAgAJ . // See https://groups.google.com/forum/#!msg/Golang-Nuts/ENgbUzYvCuU/90yGx7GUAgAJ .
// from github.com/savsgio/gotils/strconv
func B2S(b []byte) string { func B2S(b []byte) string {
return *(*string)(unsafe.Pointer(&b)) return *(*string)(unsafe.Pointer(&b))
} }