Skip to content

Commit

Permalink
refactor: 群聊和私聊图片合并,增加自定义图片描述
Browse files Browse the repository at this point in the history
  • Loading branch information
Redmomn committed Jun 16, 2024
1 parent 46d99e8 commit 79ecc2a
Show file tree
Hide file tree
Showing 9 changed files with 110 additions and 134 deletions.
4 changes: 2 additions & 2 deletions client/message.go
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ func (c *QQClient) preProcessGroupMessage(groupUin uint32, elements []message2.I
elem.Display = "@" + member.MemberName
}
}
case *message2.GroupImageElement:
case *message2.ImageElement:
_, err := c.ImageUploadGroup(groupUin, elem)
if err != nil {
c.errorln(err)
Expand All @@ -114,7 +114,7 @@ func (c *QQClient) preProcessGroupMessage(groupUin uint32, elements []message2.I
func (c *QQClient) preProcessPrivateMessage(targetUin uint32, elements []message2.IMessageElement) []message2.IMessageElement {
for _, element := range elements {
switch elem := element.(type) {
case *message2.FriendImageElement:
case *message2.ImageElement:
targetUid := c.GetUid(targetUin)
_, err := c.ImageUploadPrivate(targetUid, elem)
if err != nil {
Expand Down
22 changes: 11 additions & 11 deletions client/packets/oidb/GroupImageUpload.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,22 +3,21 @@ package oidb
import (
"encoding/hex"
"errors"
"fmt"
"math/rand"

"github.com/LagrangeDev/LagrangeGo/message"

"github.com/LagrangeDev/LagrangeGo/client/packets/pb/service/oidb"
"github.com/LagrangeDev/LagrangeGo/utils"
"github.com/LagrangeDev/LagrangeGo/utils/crypto"
)

func BuildGroupImageUploadReq(groupUin uint32, data []byte) (*OidbPacket, error) {
func BuildGroupImageUploadReq(groupUin uint32, image *message.ImageElement) (*OidbPacket, error) {
// OidbSvcTrpcTcp.0x11c4_100
if data == nil {
if image.Stream == nil {
return nil, errors.New("image data is null")
}
md5Hash := crypto.MD5Digest(data)
sha1Hash := crypto.SHA1Digest(data)
format, size, err := utils.ImageResolve(data)

format, size, err := utils.ImageResolve(image.Stream)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -52,10 +51,10 @@ func BuildGroupImageUploadReq(groupUin uint32, data []byte) (*OidbPacket, error)
UploadInfo: []*oidb.UploadInfo{
{
FileInfo: &oidb.FileInfo{
FileSize: uint32(len(data)),
FileHash: fmt.Sprintf("%x", md5Hash),
FileSha1: fmt.Sprintf("%x", sha1Hash),
FileName: fmt.Sprintf("%x.%s", md5Hash, imageExt),
FileSize: image.Size,
FileHash: hex.EncodeToString(image.Md5),
FileSha1: hex.EncodeToString(image.Sha1),
FileName: hex.EncodeToString(image.Md5) + "." + imageExt,
Type: &oidb.FileType{
Type: 1,
PicFormat: uint32(format),
Expand All @@ -77,6 +76,7 @@ func BuildGroupImageUploadReq(groupUin uint32, data []byte) (*OidbPacket, error)
ExtBizInfo: &oidb.ExtBizInfo{
Pic: &oidb.PicExtBizInfo{
BytesPbReserveTroop: bytesPbReserveTroop,
TextSummary: image.Summary,
},
Video: &oidb.VideoExtBizInfo{
BytesPbReserve: []byte{},
Expand Down
25 changes: 14 additions & 11 deletions client/packets/oidb/PrivateImageUpload.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,21 @@ package oidb
import (
"encoding/hex"
"errors"
"fmt"
"math/rand"

"github.com/LagrangeDev/LagrangeGo/message"

"github.com/LagrangeDev/LagrangeGo/client/packets/pb/service/oidb"
"github.com/LagrangeDev/LagrangeGo/utils"
"github.com/LagrangeDev/LagrangeGo/utils/crypto"
)

func BuildImageUploadReq(targetUid string, data []byte) (*OidbPacket, error) {
func BuildPrivateImageUploadReq(targetUid string, image *message.ImageElement) (*OidbPacket, error) {
// OidbSvcTrpcTcp.0x11c5_100
md5Hash := crypto.MD5Digest(data)
sha1Hash := crypto.SHA1Digest(data)
format, size, err := utils.ImageResolve(data)
if image.Stream == nil {
return nil, errors.New("image data is null")
}

format, size, err := utils.ImageResolve(image.Stream)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -50,10 +52,10 @@ func BuildImageUploadReq(targetUid string, data []byte) (*OidbPacket, error) {
UploadInfo: []*oidb.UploadInfo{
{
FileInfo: &oidb.FileInfo{
FileSize: uint32(len(data)),
FileHash: fmt.Sprintf("%x", md5Hash),
FileSha1: fmt.Sprintf("%x", sha1Hash),
FileName: fmt.Sprintf("%x.%s", md5Hash, imageExt),
FileSize: image.Size,
FileHash: hex.EncodeToString(image.Md5),
FileSha1: hex.EncodeToString(image.Sha1),
FileName: hex.EncodeToString(image.Md5) + "." + imageExt,
Type: &oidb.FileType{
Type: 1,
PicFormat: uint32(format),
Expand All @@ -75,6 +77,7 @@ func BuildImageUploadReq(targetUid string, data []byte) (*OidbPacket, error) {
ExtBizInfo: &oidb.ExtBizInfo{
Pic: &oidb.PicExtBizInfo{
BytesPbReserveC2C: bytesPbReserveC2c,
TextSummary: image.Summary,
},
Video: &oidb.VideoExtBizInfo{
BytesPbReserve: []byte{},
Expand All @@ -92,7 +95,7 @@ func BuildImageUploadReq(targetUid string, data []byte) (*OidbPacket, error) {
return BuildOidbPacket(0x11c5, 100, body, false, true)
}

func ParseImageUploadResp(data []byte) (*oidb.NTV2RichMediaResp, error) {
func ParsePrivateImageUploadResp(data []byte) (*oidb.NTV2RichMediaResp, error) {
var resp oidb.NTV2RichMediaResp
baseResp, err := ParseOidbPacket(data, &resp)
if err != nil {
Expand Down
18 changes: 9 additions & 9 deletions client/richmedia.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,20 +29,20 @@ func oidbIPv4ToNTHighwayIPv4(ipv4s []*oidb2.IPv4) []*highway.NTHighwayIPv4 {
return hwipv4s
}

func (c *QQClient) ImageUploadPrivate(targetUid string, element message.IMessageElement) (*message.FriendImageElement, error) {
image, ok := element.(*message.FriendImageElement)
func (c *QQClient) ImageUploadPrivate(targetUid string, element message.IMessageElement) (*message.ImageElement, error) {
image, ok := element.(*message.ImageElement)
if !ok {
return nil, errors.New("element type is not friend image")
}
req, err := oidb.BuildImageUploadReq(targetUid, image.Stream)
req, err := oidb.BuildPrivateImageUploadReq(targetUid, image)
if err != nil {
return nil, err
}
resp, err := c.sendOidbPacketAndWait(req)
if err != nil {
return nil, err
}
uploadResp, err := oidb.ParseImageUploadResp(resp)
uploadResp, err := oidb.ParsePrivateImageUploadResp(resp)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -92,12 +92,12 @@ func (c *QQClient) ImageUploadPrivate(targetUid string, element message.IMessage
return image, nil
}

func (c *QQClient) ImageUploadGroup(groupUin uint32, element message.IMessageElement) (*message.GroupImageElement, error) {
image, ok := element.(*message.GroupImageElement)
func (c *QQClient) ImageUploadGroup(groupUin uint32, element message.IMessageElement) (*message.ImageElement, error) {
image, ok := element.(*message.ImageElement)
if !ok {
return nil, errors.New("element type is not group image")
}
req, err := oidb.BuildGroupImageUploadReq(groupUin, image.Stream)
req, err := oidb.BuildGroupImageUploadReq(groupUin, image)
if err != nil {
return nil, err
}
Expand All @@ -110,7 +110,7 @@ func (c *QQClient) ImageUploadGroup(groupUin uint32, element message.IMessageEle
return nil, err
}
ukey := uploadResp.Upload.UKey.Unwrap()
c.debugln("private image upload ukey:", ukey)
c.debugln("group image upload ukey:", ukey)
if ukey != "" {
index := uploadResp.Upload.MsgInfo.MsgInfoBody[0].Index
sha1hash, err := hex.DecodeString(index.Info.FileSha1)
Expand Down Expand Up @@ -146,7 +146,7 @@ func (c *QQClient) ImageUploadGroup(groupUin uint32, element message.IMessageEle
}
}
image.MsgInfo = uploadResp.Upload.MsgInfo
image.CompatFace = uploadResp.Upload.CompatQMsg
_ = proto.Unmarshal(uploadResp.Upload.CompatQMsg, image.CompatFace)
return image, nil
}

Expand Down
8 changes: 4 additions & 4 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,17 +48,17 @@ func main() {

qqclient.GroupMessageEvent.Subscribe(func(client *client.QQClient, event *message.GroupMessage) {
if event.ToString() == "114514" {
img, _ := os.ReadFile("testgroup.png")
_, err := client.SendGroupMessage(event.GroupCode, []message.IMessageElement{&message.GroupImageElement{Stream: img}})
img, _ := message.NewImageByFile("testgroup.png")
_, err := client.SendGroupMessage(event.GroupCode, []message.IMessageElement{img})
if err != nil {
return
}
}
})

qqclient.PrivateMessageEvent.Subscribe(func(client *client.QQClient, event *message.PrivateMessage) {
img, _ := os.ReadFile("testprivate.png")
_, err := client.SendPrivateMessage(event.Sender.Uin, []message.IMessageElement{&message.FriendImageElement{Stream: img}})
img, _ := message.NewImageByFile("testprivate.png")
_, err := client.SendPrivateMessage(event.Sender.Uin, []message.IMessageElement{img})
if err != nil {
return
}
Expand Down
25 changes: 5 additions & 20 deletions message/build.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,39 +59,24 @@ func (e *FaceElement) BuildElement() []*message.Elem {
}
}

func (e *GroupImageElement) BuildElement() []*message.Elem {
func (e *ImageElement) BuildElement() []*message.Elem {
common, err := proto.Marshal(e.MsgInfo)
if err != nil {
return nil
}
msg := []*message.Elem{{
msg := []*message.Elem{{}, {
CommonElem: &message.CommonElem{
ServiceType: 48,
PbElem: common,
BusinessType: 10,
},
}}
return msg
}

func (e *FriendImageElement) BuildElement() []*message.Elem {
common, err := proto.Marshal(e.MsgInfo)
if err != nil {
return nil
if e.CompatFace != nil {
msg[0].CustomFace = e.CompatFace
}
var msg []*message.Elem
if e.CompatImage != nil {
msg = []*message.Elem{{
NotOnlineImage: e.CompatImage,
}}
msg[0].NotOnlineImage = e.CompatImage
}
msg = append(msg, &message.Elem{
CommonElem: &message.CommonElem{
ServiceType: 48,
PbElem: common,
BusinessType: 10,
},
})
return msg
}

Expand Down
77 changes: 53 additions & 24 deletions message/elements.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ import (
"os"
"strconv"

"github.com/LagrangeDev/LagrangeGo/client/packets/pb/message"

"github.com/LagrangeDev/LagrangeGo/utils/crypto"

"github.com/LagrangeDev/LagrangeGo/client/packets/pb/service/oidb"
Expand Down Expand Up @@ -50,6 +52,31 @@ type (
Duration uint32
Data []byte
}

ImageElement struct {
ImageId string
FileId int64
ImageType int32
Size uint32
Width uint32
Height uint32
Url string

// EffectID show pic effect id.
EffectID int32
Flash bool

// send
Summary string
Ext string
Md5 []byte
Sha1 []byte
MsgInfo *oidb.MsgInfo
Stream []byte
CompatFace *message.CustomFace // GroupImage
CompatImage *message.NotOnlineImage // FriendImage
}

ShortVideoElement struct {
Name string
Uuid []byte
Expand Down Expand Up @@ -85,22 +112,6 @@ func NewAt(target uint32, display ...string) *AtElement {
}
}

func NewGroupImage(data []byte) *GroupImageElement {
return &GroupImageElement{
Stream: data,
}
}

func NewGroupImageByFile(path string) (*GroupImageElement, error) {
data, err := os.ReadFile(path)
if err != nil {
return nil, err
}
return &GroupImageElement{
Stream: data,
}, nil
}

func NewRecord(data []byte, duration uint32) *VoiceElement {
return &VoiceElement{
Size: uint32(len(data)),
Expand All @@ -111,6 +122,28 @@ func NewRecord(data []byte, duration uint32) *VoiceElement {
}
}

func NewImage(data []byte, Summary ...string) *ImageElement {
var summary string
if len(Summary) != 0 {
summary = Summary[0]
}
return &ImageElement{
Size: uint32(len(data)),
Summary: summary,
Stream: data,
Md5: crypto.MD5Digest(data),
Sha1: crypto.SHA1Digest(data),
}
}

func NewImageByFile(path string, Summary ...string) (*ImageElement, error) {
data, err := os.ReadFile(path)
if err != nil {
return nil, err
}
return NewImage(data, Summary...), nil
}

func (e *TextElement) Type() ElementType {
return Text
}
Expand All @@ -123,14 +156,6 @@ func (e *FaceElement) Type() ElementType {
return Face
}

func (e *GroupImageElement) Type() ElementType {
return Image
}

func (e *FriendImageElement) Type() ElementType {
return Image
}

func (e *ReplyElement) Type() ElementType {
return Reply
}
Expand All @@ -139,6 +164,10 @@ func (e *VoiceElement) Type() ElementType {
return Voice
}

func (e *ImageElement) Type() ElementType {
return Image
}

func (e *ShortVideoElement) Type() ElementType {
return Video
}
Loading

0 comments on commit 79ecc2a

Please sign in to comment.