1
0
mirror of https://github.com/Mrs4s/MiraiGo.git synced 2025-05-04 11:07:40 +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"
"math/rand"
"strconv"
"time"
)
var (
@ -404,7 +403,7 @@ func (c *QQClient) buildGroupSendingPacket(groupCode int64, r int32, m *message.
}
// 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()
req := &msg.SendMessageRequest{
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),
},
},
MsgSeq: c.nextFriendSeq(),
MsgSeq: msgSeq,
MsgRand: r,
SyncCookie: func() []byte {
cookie := &msg.SyncCookie{
Time: time.Now().Unix(),
Time: time,
Ran1: rand.Int63(),
Ran2: rand.Int63(),
Const1: syncConst1,

View File

@ -4,6 +4,7 @@ import (
"crypto/md5"
"errors"
"github.com/Mrs4s/MiraiGo/binary"
"github.com/Mrs4s/MiraiGo/client/pb/msg"
"github.com/Mrs4s/MiraiGo/message"
"github.com/Mrs4s/MiraiGo/protocol/packets"
"github.com/Mrs4s/MiraiGo/utils"
@ -144,6 +145,7 @@ func (c *QQClient) Login() (*LoginResponse, error) {
if l.Success {
c.registerClient()
go c.heartbeat()
_, _ = c.sendAndWait(c.buildGetMessageRequestPacket(msg.SyncFlag_START, time.Now().Unix()))
}
return &l, nil
}
@ -227,10 +229,24 @@ func (c *QQClient) SendGroupMessage(groupCode int64, m *message.SendingMessage)
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())
_, pkt := c.buildFriendSendingPacket(target, mr, m)
seq := c.nextFriendSeq()
t := time.Now().Unix()
_, pkt := c.buildFriendSendingPacket(target, seq, mr, t, m)
_ = 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) {
@ -256,7 +272,7 @@ func (c *QQClient) UploadGroupImage(groupCode int64, img []byte) (*message.Group
updServer := binary.UInt32ToIPV4Address(uint32(ip))
err := c.highwayUploadImage(updServer+":"+strconv.FormatInt(int64(rsp.UploadPort[i]), 10), rsp.UploadKey, img)
if err != nil {
return nil, err
continue
}
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) {
count++
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 {
return nil, err
}
rsp := i.(imageUploadResponse)
if rsp.ResultCode != 0 {
return nil, errors.New(rsp.Message)
}
if !rsp.IsExists {
if _, err = c.UploadGroupImage(0, img); err != nil {
// use group highway upload and query again for image id.
if _, err = c.UploadGroupImage(target, img); err != nil {
return nil, err
}
// safe
@ -288,10 +298,7 @@ func (c *QQClient) uploadPrivateImage(target int64, img []byte, count int) (*mes
}
return c.uploadPrivateImage(target, img, count)
}
return &message.FriendImageElement{
ImageId: rsp.ResourceId,
Md5: h[:],
}, nil
return e, nil
}
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")
}
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 {
c.groupListLock.Lock()
defer c.groupListLock.Unlock()
@ -467,7 +492,7 @@ func (c *QQClient) nextGroupSeq() int32 {
func (c *QQClient) nextFriendSeq() int32 {
s := atomic.LoadInt32(&c.friendSeq)
atomic.AddInt32(&c.friendSeq, 2)
atomic.AddInt32(&c.friendSeq, 1)
return s
}

View File

@ -10,6 +10,7 @@ import (
"github.com/Mrs4s/MiraiGo/client/pb/structmsg"
"github.com/golang/protobuf/proto"
"sync"
"sync/atomic"
"time"
)
@ -208,6 +209,18 @@ func decodeMessageSvcPacket(c *QQClient, _ uint16, payload []byte) (interface{},
c.dispatchTempMessage(c.parseTempMessage(message))
}
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 {
continue
}

View File

@ -183,14 +183,20 @@ func (c *QQClient) parsePrivateMessage(msg *msg.Message) *message.PrivateMessage
if friend == nil {
return nil
}
return &message.PrivateMessage{
ret := &message.PrivateMessage{
Id: msg.Head.MsgSeq,
Target: c.Uin,
Time: msg.Head.MsgTime,
Sender: &message.Sender{
Uin: friend.Uin,
Nickname: friend.Nickname,
},
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 {

View File

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