-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsend_api.go
300 lines (257 loc) · 10.6 KB
/
send_api.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
package fbmbotapi
//go:generate ffjson $GOFILE
import "fmt"
// RequestNotificationType defines request notification type
type RequestNotificationType string
const (
// RequestNotificationTypeRegular is for regular notifications
RequestNotificationTypeRegular = RequestNotificationType("REGULAR")
// RequestNotificationTypeSilentPush is for silent notifications
RequestNotificationTypeSilentPush = RequestNotificationType("SILENT_PUSH")
// RequestNotificationTypeNoPush is for no push notifications
RequestNotificationTypeNoPush = RequestNotificationType("NO_PUSH")
)
const (
// RequestAttachmentTypeImage is for image attachment
RequestAttachmentTypeImage = "image"
// RequestAttachmentTypeTemplate is for template attachment
RequestAttachmentTypeTemplate = "template"
)
const (
// RequestAttachmentTemplateTypeGeneric is generic
RequestAttachmentTemplateTypeGeneric = "generic"
// RequestAttachmentTemplateTypeList is list
RequestAttachmentTemplateTypeList = "list"
// RequestAttachmentTemplateTypeButton is button
RequestAttachmentTemplateTypeButton = "button"
// RequestAttachmentTemplateTypeReceipt is receipt
RequestAttachmentTemplateTypeReceipt = "receipt"
)
const (
// RequestButtonTypePostback os postback
RequestButtonTypePostback = "postback"
// RequestButtonTypeWebURL is for web url
RequestButtonTypeWebURL = "web_url"
)
// Request is request
type Request struct {
Recipient RequestRecipient `json:"recipient"`
Message RequestMessage `json:"message"`
NotificationType RequestNotificationType `json:"notification_type,omitempty"` // Optional: Push notification type: REGULAR, SILENT_PUSH, NO_PUSH
}
// RequestRecipient describes recipient
type RequestRecipient struct { // phone_number or id must be set
ID string `json:"id,omitempty"` // Alex: changed from int64 on 21st November
PhoneNumber string `json:"phone_number,omitempty"` // Phone number of the recipient with the format +1(212)555-2368
}
// RequestMessage is request message
type RequestMessage struct { // text or attachment must be set
Text string `json:"text,omitempty"` // Message text, must be UTF-8, 320 character limit
Attachment *RequestAttachment `json:"attachment,omitempty"` // Attachment data
}
// RequestAttachment is request attachment
type RequestAttachment struct {
Type string `json:"type,omitempty"`
Payload RequestAttachmentPayload `json:"payload,omitempty"`
}
// RequestAttachmentImage is request attachment image
type RequestAttachmentImage struct {
URL string `json:"url,omitempty"`
}
// RequestAttachmentGenericTemplate is request attachment generic template
type RequestAttachmentGenericTemplate struct {
Elements []RequestElement `json:"elements,omitempty"` // Data for each bubble in message
}
// RequestAttachmentListTemplate is request attachment list template
type RequestAttachmentListTemplate struct {
RequestAttachmentGenericTemplate
TopElementStyle string `json:"top_element_style,omitempty"`
}
// TopElementStyle defines top element style
type TopElementStyle string
const (
// TopElementStyleCompact for compact top element
TopElementStyleCompact TopElementStyle = "compact"
// TopElementStyleLarge for large top element
TopElementStyleLarge TopElementStyle = "large"
)
// RequestAttachmentButtonTemplate defines attachment button template
type RequestAttachmentButtonTemplate struct {
Text string `json:"text,omitempty"`
Buttons []RequestButton `json:"buttons,omitempty"`
}
// RequestAttachmentReceiptTemplate defines receipt template
type RequestAttachmentReceiptTemplate struct {
}
// RequestAttachmentTemplate defines attachment template
type RequestAttachmentTemplate struct {
TemplateType string `json:"template_type,omitempty"`
RequestAttachmentListTemplate // Used for both List & Generic templates
// RequestAttachmentGenericTemplate - conflicts with RequestAttachmentListTemplate on json.Marshal - silently not marshalling Elements.
RequestAttachmentButtonTemplate
RequestAttachmentReceiptTemplate
}
// RequestAttachmentPayload defines attachment payload
type RequestAttachmentPayload struct {
RequestAttachmentImage
RequestAttachmentTemplate
}
// RequestWebURLAction defines web URL action
type RequestWebURLAction struct {
URL string `json:"url,omitempty"` // For web_url buttons, this URL is opened in a mobile browser when the button is tapped
FallbackURL string `json:"fallback_url,omitempty"`
WebviewHeightRatio WebviewHeightRatio `json:"webview_height_ratio,omitempty"`
MessengerExtensions bool `json:"messenger_extensions,omitempty"`
}
// RequestPostbackAction defines postback action
type RequestPostbackAction struct {
Payload string `json:"payload,omitempty"` // For postback buttons, this data will be sent back to you via webhook
}
// RequestButton defines request button
type RequestButton struct {
Type string `json:"type"` // Value is web_url or postback
Title string `json:"title"` // Button title
RequestWebURLAction
RequestPostbackAction
}
// NewRequestPostbackButton creates new postback button
func NewRequestPostbackButton(title, payload string) RequestButton {
return RequestButton{
Type: RequestButtonTypePostback,
Title: title,
RequestPostbackAction: RequestPostbackAction{Payload: payload},
}
}
// NewRequestWebURLButton creates new URL button
func NewRequestWebURLButton(title, url string) RequestButton {
return RequestButton{
Type: RequestButtonTypeWebURL,
Title: title,
RequestWebURLAction: RequestWebURLAction{URL: url},
}
}
// NewRequestWebURLButtonWithRatio create new web url button with ratio
func NewRequestWebURLButtonWithRatio(title, url string, webviewHeightRatio WebviewHeightRatio) RequestButton {
return RequestButton{
Type: RequestButtonTypeWebURL,
Title: title,
RequestWebURLAction: RequestWebURLAction{
URL: url,
WebviewHeightRatio: webviewHeightRatio,
},
}
}
// NewRequestWebExtentionURLButtonWithRatio creates new URL extention button
func NewRequestWebExtentionURLButtonWithRatio(title, url string, webviewHeightRatio WebviewHeightRatio) RequestButton {
return RequestButton{
Type: RequestButtonTypeWebURL,
Title: title,
RequestWebURLAction: RequestWebURLAction{
URL: url,
MessengerExtensions: true,
WebviewHeightRatio: webviewHeightRatio,
},
}
}
// RequestDefaultAction defines default action
type RequestDefaultAction struct {
Type string `json:"type"` // Value is web_url or postback
RequestWebURLAction
RequestPostbackAction
}
// NewDefaultActionWithWebURL creates new default action
func NewDefaultActionWithWebURL(action RequestWebURLAction) RequestDefaultAction {
return RequestDefaultAction{
Type: RequestButtonTypeWebURL,
RequestWebURLAction: action,
}
}
// RequestElement defines request element
type RequestElement struct {
Title string `json:"title"` // Required: Bubble title
Subtitle string `json:"subtitle,omitempty"` // Optional: Bubble subtitle
ImageURL string `json:"image_url,omitempty"` // Optional: Bubble image
ItemURL string `json:"item_url,omitempty"` // Optional: URL that is opened when bubble is tapped
DefaultAction *RequestDefaultAction `json:"default_action,omitempty"`
Buttons []RequestButton `json:"buttons,omitempty"` // Optional: Set of buttons that appear as call-to-actions
}
// NewRequestElementWithDefaultAction creates new request element with default action
func NewRequestElementWithDefaultAction(title, subtitle string, defaultAction RequestDefaultAction, buttons ...RequestButton) RequestElement {
return RequestElement{
Title: title,
Subtitle: subtitle,
DefaultAction: &defaultAction,
Buttons: buttons,
}
}
// NewRequestElement creates new request element
func NewRequestElement(title, subtitle string, buttons ...RequestButton) RequestElement {
return RequestElement{
Title: title,
Subtitle: subtitle,
Buttons: buttons,
}
}
// NewGenericTemplate creates new generic template
func NewGenericTemplate(elements ...RequestElement) RequestAttachmentPayload {
return RequestAttachmentPayload{
RequestAttachmentTemplate: RequestAttachmentTemplate{
TemplateType: RequestAttachmentTemplateTypeGeneric,
RequestAttachmentListTemplate: RequestAttachmentListTemplate{
RequestAttachmentGenericTemplate: RequestAttachmentGenericTemplate{Elements: elements},
},
},
}
}
// NewButtonTemplate creates new button template
func NewButtonTemplate(text string, buttons ...RequestButton) RequestAttachmentPayload {
return RequestAttachmentPayload{
RequestAttachmentTemplate: RequestAttachmentTemplate{
TemplateType: RequestAttachmentTemplateTypeButton,
RequestAttachmentButtonTemplate: RequestAttachmentButtonTemplate{
Text: text,
Buttons: buttons,
},
},
}
}
// NewListTemplate creates new list template
func NewListTemplate(topElementStyle TopElementStyle, elements ...RequestElement) RequestAttachmentPayload {
switch topElementStyle {
case TopElementStyleCompact:
case TopElementStyleLarge:
default:
panic(fmt.Sprintf("Unknown topElementStyle: %v. Expected either 'large' or 'compact'.", topElementStyle))
}
if elementsLen := len(elements); elementsLen == 0 {
panic("len(elements) == 0")
} else if elementsLen > listTemplateMaxButtonsCount {
panic(fmt.Sprintf("len(elements)=%v > listTemplateMaxButtonsCount=%v", elementsLen, listTemplateMaxButtonsCount))
} else {
//els := make([]RequestElement, elementsLen)
//copy(els, elements)
return RequestAttachmentPayload{
RequestAttachmentTemplate: RequestAttachmentTemplate{
TemplateType: RequestAttachmentTemplateTypeList,
RequestAttachmentListTemplate: RequestAttachmentListTemplate{
RequestAttachmentGenericTemplate: RequestAttachmentGenericTemplate{Elements: elements},
TopElementStyle: string(topElementStyle),
},
},
}
}
}
// RequestWhitelistDomain see https://developers.facebook.com/docs/messenger-platform/thread-settings/domain-whitelisting
type RequestWhitelistDomain struct {
SettingType string `json:"setting_type"` // Must be domain_whitelisting.
DomainActionType string `json:"domain_action_type"`
WhitelistedDomains []string `json:"whitelisted_domains"`
}
// NewRequestWhitelistDomain creates new request for whitelisted domains
func NewRequestWhitelistDomain(domainActionType string, domains ...string) RequestWhitelistDomain {
return RequestWhitelistDomain{
SettingType: "domain_whitelisting",
DomainActionType: domainActionType,
WhitelistedDomains: domains,
}
}