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

update func SendPrivateMessage().

add func QueryFriendImage().
This commit is contained in:
Mrs4s 2020-07-20 16:13:37 +08:00
parent 9f5f3199d5
commit 806ecc3697
5 changed files with 75 additions and 27 deletions

View File

@ -17,7 +17,6 @@ import (
"github.com/golang/protobuf/proto" "github.com/golang/protobuf/proto"
"math/rand" "math/rand"
"strconv" "strconv"
"time"
) )
var ( var (
@ -404,7 +403,7 @@ func (c *QQClient) buildGroupSendingPacket(groupCode int64, r int32, m *message.
} }
// MessageSvc.PbSendMsg // MessageSvc.PbSendMsg
func (c *QQClient) buildFriendSendingPacket(target int64, r int32, m *message.SendingMessage) (uint16, []byte) { func (c *QQClient) buildFriendSendingPacket(target int64, msgSeq, r int32, time int64, m *message.SendingMessage) (uint16, []byte) {
seq := c.nextSeq() seq := c.nextSeq()
req := &msg.SendMessageRequest{ req := &msg.SendMessageRequest{
RoutingHead: &msg.RoutingHead{C2C: &msg.C2C{ToUin: target}}, RoutingHead: &msg.RoutingHead{C2C: &msg.C2C{ToUin: target}},
@ -414,11 +413,11 @@ func (c *QQClient) buildFriendSendingPacket(target int64, r int32, m *message.Se
Elems: message.ToProtoElems(m.Elements), Elems: message.ToProtoElems(m.Elements),
}, },
}, },
MsgSeq: c.nextFriendSeq(), MsgSeq: msgSeq,
MsgRand: r, MsgRand: r,
SyncCookie: func() []byte { SyncCookie: func() []byte {
cookie := &msg.SyncCookie{ cookie := &msg.SyncCookie{
Time: time.Now().Unix(), Time: time,
Ran1: rand.Int63(), Ran1: rand.Int63(),
Ran2: rand.Int63(), Ran2: rand.Int63(),
Const1: syncConst1, Const1: syncConst1,

View File

@ -4,6 +4,7 @@ import (
"crypto/md5" "crypto/md5"
"errors" "errors"
"github.com/Mrs4s/MiraiGo/binary" "github.com/Mrs4s/MiraiGo/binary"
"github.com/Mrs4s/MiraiGo/client/pb/msg"
"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"
@ -144,6 +145,7 @@ func (c *QQClient) Login() (*LoginResponse, error) {
if l.Success { if l.Success {
c.registerClient() c.registerClient()
go c.heartbeat() go c.heartbeat()
_, _ = c.sendAndWait(c.buildGetMessageRequestPacket(msg.SyncFlag_START, time.Now().Unix()))
} }
return &l, nil return &l, nil
} }
@ -227,10 +229,24 @@ func (c *QQClient) SendGroupMessage(groupCode int64, m *message.SendingMessage)
return ret return ret
} }
func (c *QQClient) SendPrivateMessage(target int64, m *message.SendingMessage) { func (c *QQClient) SendPrivateMessage(target int64, m *message.SendingMessage) *message.PrivateMessage {
mr := int32(rand.Uint32()) mr := int32(rand.Uint32())
_, pkt := c.buildFriendSendingPacket(target, mr, m) seq := c.nextFriendSeq()
t := time.Now().Unix()
_, pkt := c.buildFriendSendingPacket(target, seq, mr, t, m)
_ = c.send(pkt) _ = c.send(pkt)
return &message.PrivateMessage{
Id: seq,
InternalId: mr,
Target: target,
Time: int32(t),
Sender: &message.Sender{
Uin: c.Uin,
Nickname: c.Nickname,
IsFriend: true,
},
Elements: m.Elements,
}
} }
func (c *QQClient) RecallGroupMessage(groupCode int64, msgId, msgInternalId int32) { func (c *QQClient) RecallGroupMessage(groupCode int64, msgId, msgInternalId int32) {
@ -256,7 +272,7 @@ func (c *QQClient) UploadGroupImage(groupCode int64, img []byte) (*message.Group
updServer := binary.UInt32ToIPV4Address(uint32(ip)) updServer := binary.UInt32ToIPV4Address(uint32(ip))
err := c.highwayUploadImage(updServer+":"+strconv.FormatInt(int64(rsp.UploadPort[i]), 10), rsp.UploadKey, img) err := c.highwayUploadImage(updServer+":"+strconv.FormatInt(int64(rsp.UploadPort[i]), 10), rsp.UploadKey, img)
if err != nil { if err != nil {
return nil, err continue
} }
return message.NewGroupImage(binary.CalculateImageResourceId(h[:]), h[:]), nil return message.NewGroupImage(binary.CalculateImageResourceId(h[:]), h[:]), nil
} }
@ -270,16 +286,10 @@ func (c *QQClient) UploadPrivateImage(target int64, img []byte) (*message.Friend
func (c *QQClient) uploadPrivateImage(target int64, img []byte, count int) (*message.FriendImageElement, error) { func (c *QQClient) uploadPrivateImage(target int64, img []byte, count int) (*message.FriendImageElement, error) {
count++ count++
h := md5.Sum(img) h := md5.Sum(img)
i, err := c.sendAndWait(c.buildOffPicUpPacket(target, h[:], int32(len(img)))) e, err := c.QueryFriendImage(target, h[:], int32(len(img)))
if err != nil { if err != nil {
return nil, err // use group highway upload and query again for image id.
} if _, err = c.UploadGroupImage(target, img); err != nil {
rsp := i.(imageUploadResponse)
if rsp.ResultCode != 0 {
return nil, errors.New(rsp.Message)
}
if !rsp.IsExists {
if _, err = c.UploadGroupImage(0, img); err != nil {
return nil, err return nil, err
} }
// safe // safe
@ -288,10 +298,7 @@ func (c *QQClient) uploadPrivateImage(target int64, img []byte, count int) (*mes
} }
return c.uploadPrivateImage(target, img, count) return c.uploadPrivateImage(target, img, count)
} }
return &message.FriendImageElement{ return e, nil
ImageId: rsp.ResourceId,
Md5: h[:],
}, nil
} }
func (c *QQClient) QueryGroupImage(groupCode int64, hash []byte, size int32) (*message.GroupImageElement, error) { func (c *QQClient) QueryGroupImage(groupCode int64, hash []byte, size int32) (*message.GroupImageElement, error) {
@ -309,6 +316,24 @@ func (c *QQClient) QueryGroupImage(groupCode int64, hash []byte, size int32) (*m
return nil, errors.New("image not exists") return nil, errors.New("image not exists")
} }
func (c *QQClient) QueryFriendImage(target int64, hash []byte, size int32) (*message.FriendImageElement, error) {
i, err := c.sendAndWait(c.buildOffPicUpPacket(target, hash, size))
if err != nil {
return nil, err
}
rsp := i.(imageUploadResponse)
if rsp.ResultCode != 0 {
return nil, errors.New(rsp.Message)
}
if !rsp.IsExists {
return nil, errors.New("image not exists")
}
return &message.FriendImageElement{
ImageId: rsp.ResourceId,
Md5: hash,
}, nil
}
func (c *QQClient) ReloadGroupList() error { func (c *QQClient) ReloadGroupList() error {
c.groupListLock.Lock() c.groupListLock.Lock()
defer c.groupListLock.Unlock() defer c.groupListLock.Unlock()
@ -467,7 +492,7 @@ func (c *QQClient) nextGroupSeq() int32 {
func (c *QQClient) nextFriendSeq() int32 { func (c *QQClient) nextFriendSeq() int32 {
s := atomic.LoadInt32(&c.friendSeq) s := atomic.LoadInt32(&c.friendSeq)
atomic.AddInt32(&c.friendSeq, 2) atomic.AddInt32(&c.friendSeq, 1)
return s return s
} }

View File

@ -10,6 +10,7 @@ import (
"github.com/Mrs4s/MiraiGo/client/pb/structmsg" "github.com/Mrs4s/MiraiGo/client/pb/structmsg"
"github.com/golang/protobuf/proto" "github.com/golang/protobuf/proto"
"sync" "sync"
"sync/atomic"
"time" "time"
) )
@ -208,6 +209,18 @@ func decodeMessageSvcPacket(c *QQClient, _ uint16, payload []byte) (interface{},
c.dispatchTempMessage(c.parseTempMessage(message)) c.dispatchTempMessage(c.parseTempMessage(message))
} }
case 166: // 好友消息 case 166: // 好友消息
if message.Head.FromUin == c.Uin {
for {
frdSeq := atomic.LoadInt32(&c.friendSeq)
if frdSeq < message.Head.MsgSeq {
if atomic.CompareAndSwapInt32(&c.friendSeq, frdSeq, message.Head.MsgSeq) {
break
}
} else {
break
}
}
}
if message.Body.RichText == nil || message.Body.RichText.Elems == nil { if message.Body.RichText == nil || message.Body.RichText.Elems == nil {
continue continue
} }

View File

@ -183,14 +183,20 @@ func (c *QQClient) parsePrivateMessage(msg *msg.Message) *message.PrivateMessage
if friend == nil { if friend == nil {
return nil return nil
} }
return &message.PrivateMessage{ ret := &message.PrivateMessage{
Id: msg.Head.MsgSeq, Id: msg.Head.MsgSeq,
Target: c.Uin,
Time: msg.Head.MsgTime,
Sender: &message.Sender{ Sender: &message.Sender{
Uin: friend.Uin, Uin: friend.Uin,
Nickname: friend.Nickname, Nickname: friend.Nickname,
}, },
Elements: message.ParseMessageElems(msg.Body.RichText.Elems), Elements: message.ParseMessageElems(msg.Body.RichText.Elems),
} }
if msg.Body.RichText.Attr != nil {
ret.InternalId = msg.Body.RichText.Attr.Random
}
return ret
} }
func (c *QQClient) parseTempMessage(msg *msg.Message) *message.TempMessage { func (c *QQClient) parseTempMessage(msg *msg.Message) *message.TempMessage {

View File

@ -9,6 +9,9 @@ import (
type PrivateMessage struct { type PrivateMessage struct {
Id int32 Id int32
InternalId int32
Target int64
Time int32
Sender *Sender Sender *Sender
Elements []IMessageElement Elements []IMessageElement
} }
@ -118,7 +121,9 @@ func (msg *GroupMessage) ToString() (res string) {
} }
func (msg *SendingMessage) Append(e IMessageElement) *SendingMessage { func (msg *SendingMessage) Append(e IMessageElement) *SendingMessage {
if e != nil {
msg.Elements = append(msg.Elements, e) msg.Elements = append(msg.Elements, e)
}
return msg return msg
} }