forked from LagrangeDev/LagrangeGo
-
Notifications
You must be signed in to change notification settings - Fork 0
/
message.go
122 lines (113 loc) · 3.53 KB
/
message.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
package client
import (
"github.com/2mf8/LagrangeGo/client/packets/pb/action"
"github.com/2mf8/LagrangeGo/client/packets/pb/message"
message2 "github.com/2mf8/LagrangeGo/message"
"github.com/2mf8/LagrangeGo/utils"
"github.com/2mf8/LagrangeGo/utils/crypto"
"github.com/RomiChan/protobuf/proto"
)
func (c *QQClient) SendRawMessage(route *message.RoutingHead, body *message.MessageBody) (resp *action.SendMessageResponse, err error) {
msg := &message.Message{
RoutingHead: route,
ContentHead: &message.ContentHead{
Type: 1,
SubType: proto.Some(uint32(0)),
DivSeq: proto.Some(uint32(0)),
},
Body: body,
Seq: proto.Some(c.getSequence()),
Rand: proto.Some(crypto.RandU32()),
}
// grp_id not null
if (route.Grp != nil && route.Grp.GroupCode.IsSome()) || (route.GrpTmp != nil && route.GrpTmp.GroupUin.IsSome()) {
msg.Ctrl = &message.MessageControl{MsgFlag: int32(utils.TimeStamp())}
}
data, err := proto.Marshal(msg)
if err != nil {
return
}
packet, err := c.sendUniPacketAndWait("MessageSvc.PbSendMsg", data)
if err != nil {
return
}
resp = &action.SendMessageResponse{}
err = proto.Unmarshal(packet, resp)
if err != nil {
return
}
return
}
func (c *QQClient) SendGroupMessage(groupUin uint32, elements []message2.IMessageElement) (resp *action.SendMessageResponse, err error) {
elements = preprocessGroupMessage(c, groupUin, elements)
body := message2.BuildMessageElements(elements)
route := &message.RoutingHead{
Grp: &message.Grp{GroupCode: proto.Some(groupUin)},
}
return c.SendRawMessage(route, body)
}
func (c *QQClient) SendPrivateMessage(uin uint32, elements []message2.IMessageElement) (resp *action.SendMessageResponse, err error) {
elements = preprocessPrivateMessage(c, uin, elements)
body := message2.BuildMessageElements(elements)
route := &message.RoutingHead{
C2C: &message.C2C{
Uid: proto.Some(c.GetUid(uin)),
},
}
return c.SendRawMessage(route, body)
}
func (c *QQClient) SendTempMessage(groupID uint32, uin uint32, elements []message2.IMessageElement) (resp *action.SendMessageResponse, err error) {
body := message2.BuildMessageElements(elements)
route := &message.RoutingHead{
GrpTmp: &message.GrpTmp{
GroupUin: proto.Some(groupID),
ToUin: proto.Some(uin),
},
}
return c.SendRawMessage(route, body)
}
func preprocessGroupMessage(client *QQClient, groupUin uint32, elements []message2.IMessageElement) []message2.IMessageElement {
for _, element := range elements {
switch elem := element.(type) {
case *message2.AtElement:
member, _ := client.GetCachedMemberInfo(elem.Target, groupUin)
if member != nil {
elem.UID = member.Uid
if member.MemberCard != "" {
elem.Display = "@" + member.MemberCard
} else {
elem.Display = "@" + member.MemberName
}
}
case *message2.GroupImageElement:
_, err := client.ImageUploadGroup(groupUin, elem)
if err != nil {
networkLogger.Errorln(err)
}
if elem.MsgInfo == nil {
networkLogger.Errorln("ImageUploadGroup failed")
continue
}
default:
}
}
return elements
}
func preprocessPrivateMessage(client *QQClient, targetUin uint32, elements []message2.IMessageElement) []message2.IMessageElement {
for _, element := range elements {
switch elem := element.(type) {
case *message2.FriendImageElement:
targetUid := client.GetUid(targetUin)
_, err := client.ImageUploadPrivate(targetUid, elem)
if err != nil {
networkLogger.Errorln(err)
}
if elem.MsgInfo == nil {
networkLogger.Errorln("ImageUploadPrivate failed")
continue
}
default:
}
}
return elements
}