-
Notifications
You must be signed in to change notification settings - Fork 3
/
request.go
400 lines (334 loc) · 7.48 KB
/
request.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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
package wechat
import (
"encoding/xml"
"strings"
)
const (
textValue = "text"
imageValue = "image"
voiceValue = "voice"
videoValue = "video"
shortVideoValue = "shortvideo"
locationValue = "location"
linkValue = "link"
eventValue = "event"
subscribeEventValue = "subscribe"
unsubscribeEventValue = "unsubscribe"
scanEventValue = "SCAN"
locationEventValue = "LOCATION"
clickEventValue = "CLICK"
viewEventValue = "VIEW"
scancodePushEventValue = "scancode_push"
scancodeWaitmsgEventValue = "scancode_waitmsg"
picSysphotoEventValue = "pic_sysphoto"
picPhotoOrAlbumEventValue = "pic_photo_or_album"
picWeixinEventValue = "pic_weixin"
locationSelectEventValue = "location_select"
templateSendJobFinishEventTypeValue = "TEMPLATESENDJOBFINISH"
)
type MsgType int
const (
UnknownType MsgType = iota
TextType
ImageType
VoiceType
VideoType
ShortVideoType
LocationType
LinkType
EventType
SubscribeEventType
UnsubscribeEventType
ScanEventType
ScanSubscribeEventType
LocationEventType
MenuViewEventType
MenuClickEventType
ScancodePushEventType
ScancodeWaitmsgEventType
PicSysphotoEventType
PicPhotoOrAlbumEventType
PicWeixinEventType
LocationSelectEvenType
TemplateSendJobFinishEventType
)
type ScanCodeInfo struct {
ScanType string
ScanResult string
}
type SendPicsInfo struct {
Count int
PicList []PicListItem
}
type PicMd5Sum struct {
PicMd5Sum string
}
type PicListItem struct {
Item PicMd5Sum `xml:"item"`
}
type SendLocationInfo struct {
Location_X float64
Location_Y float64
Scale float64
Label string
Poiname string
}
type requestMessage struct {
ToUserName string
FromUserName string
CreateTime int
MsgType string
Content string
MsgId int64
PicUrl string
MediaId string
Format string
Recognition string
ThumbMediaId string
Location_X float64
Location_Y float64
Scale int
Label string
Title string
Description string
Url string
Event string
EventKey string
Ticket string
Latitude float32
Longitude float32
Precision float32
MenuId int64
ScanCodeInfo ScanCodeInfo
SendPicsInfo SendPicsInfo
SendLocationInfo SendLocationInfo
Status string
}
type defaultRequestMessage struct {
rm requestMessage
}
func (dft *defaultRequestMessage) Unmarshal(data []byte) (err error) {
return xml.Unmarshal(data, &dft.rm)
}
func (dft *defaultRequestMessage) ToUserName() string {
return dft.rm.ToUserName
}
func (dft *defaultRequestMessage) FromUserName() string {
return dft.rm.FromUserName
}
func (dft *defaultRequestMessage) CreateTime() int {
return dft.rm.CreateTime
}
func (dft *defaultRequestMessage) MsgType() MsgType {
switch dft.rm.MsgType {
case textValue:
return TextType
case imageValue:
return ImageType
case voiceValue:
return VoiceType
case videoValue:
return VideoType
case shortVideoValue:
return ShortVideoType
case locationValue:
return LocationType
case linkValue:
return LinkType
case eventValue:
switch dft.Event() {
case unsubscribeEventValue:
return UnsubscribeEventType
case subscribeEventValue:
if strings.HasPrefix(dft.EventKey(), "qrscene_") {
return ScanSubscribeEventType
}
return SubscribeEventType
case scanEventValue:
return ScanEventType
case locationEventValue:
return LocationEventType
case clickEventValue:
return MenuClickEventType
case scancodePushEventValue:
return ScancodePushEventType
case scancodeWaitmsgEventValue:
return ScancodeWaitmsgEventType
case picSysphotoEventValue:
return PicSysphotoEventType
case picPhotoOrAlbumEventValue:
return PicPhotoOrAlbumEventType
case picWeixinEventValue:
return PicWeixinEventType
case locationSelectEventValue:
return LocationSelectEvenType
case templateSendJobFinishEventTypeValue:
return TemplateSendJobFinishEventType
}
}
return UnknownType
}
func (dft *defaultRequestMessage) Content() string {
return dft.rm.Content
}
func (dft *defaultRequestMessage) MsgId() int64 {
return dft.rm.MsgId
}
func (dft *defaultRequestMessage) PicUrl() string {
return dft.rm.PicUrl
}
func (dft *defaultRequestMessage) MediaId() string {
return dft.rm.MediaId
}
func (dft *defaultRequestMessage) Format() string {
return dft.rm.Format
}
func (dft *defaultRequestMessage) Recognition() string {
return dft.rm.Recognition
}
func (dft *defaultRequestMessage) ThumbMediaId() string {
return dft.rm.ThumbMediaId
}
func (dft *defaultRequestMessage) LocationX() float64 {
return dft.rm.Location_X
}
func (dft *defaultRequestMessage) LocationY() float64 {
return dft.rm.Location_Y
}
func (dft *defaultRequestMessage) Scale() int {
return dft.rm.Scale
}
func (dft *defaultRequestMessage) Label() string {
return dft.rm.Label
}
func (dft *defaultRequestMessage) Title() string {
return dft.rm.Title
}
func (dft *defaultRequestMessage) Description() string {
return dft.rm.Description
}
func (dft *defaultRequestMessage) Url() string {
return dft.rm.Url
}
func (dft *defaultRequestMessage) Event() string {
return dft.rm.Event
}
func (dft *defaultRequestMessage) EventKey() string {
return dft.rm.EventKey
}
func (dft *defaultRequestMessage) Ticket() string {
return dft.rm.Ticket
}
func (dft *defaultRequestMessage) Latitude() float32 {
return dft.rm.Latitude
}
func (dft *defaultRequestMessage) Longitude() float32 {
return dft.rm.Longitude
}
func (dft *defaultRequestMessage) Precision() float32 {
return dft.rm.Precision
}
func (dft *defaultRequestMessage) MenuId() int64 {
return dft.rm.MenuId
}
func (dft *defaultRequestMessage) ScanCodeInfo() ScanCodeInfo {
return dft.rm.ScanCodeInfo
}
func (dft *defaultRequestMessage) SendPicsInfo() SendPicsInfo {
return dft.rm.SendPicsInfo
}
func (dft *defaultRequestMessage) SendLocationInfo() SendLocationInfo {
return dft.rm.SendLocationInfo
}
func (dft *defaultRequestMessage) Status() string {
return dft.rm.Status
}
type baseMessage interface {
ToUserName() string
FromUserName() string
CreateTime() int
MsgType() MsgType
}
type TextMessage interface {
baseMessage
MsgId() int64
Content() string
}
type ImageMessage interface {
baseMessage
MsgId() int64
PicUrl() string
MediaId() string
}
type VoiceMessage interface {
baseMessage
MediaId() string
Recognition() string
Format() string
MsgId() int64
}
type VideoMessage interface {
baseMessage
MediaId() string
ThumbMediaId() string
MsgId() int64
}
type ShortVideoMessage interface {
baseMessage
MediaId() string
ThumbMediaId() string
MsgId() int64
}
type LocationMessage interface {
baseMessage
LocationX()
LocationY()
Scale() int
Label() string
MsgId() int64
}
type LinkMessage interface {
baseMessage
Title() string
Description() string
Url() string
MsgId() int64
}
type SubscribeEventMessage interface {
baseMessage
Event() string
}
type UnsubscribeEventMessage interface {
baseMessage
Event() string
}
type ScanSubscribeEventMessage interface {
baseMessage
Event() string
EventKey() string
Ticket() string
}
type ScanEventMessage interface {
baseMessage
Event() string
EventKey() string
Ticket() string
}
type LocationEventMessage interface {
baseMessage
Event() string
Latitude()
Longitude() float32
Precision() float32
}
type MenuViewEventMessage interface {
baseMessage
Event() string
EventKey() string
MenuId() int64
}
type MenuClickEventMessage interface {
baseMessage
Event() string
EventKey() string
}