8
8
)
9
9
10
10
const (
11
- // WebhookURL is where the Messenger client should listen for webhook events.
12
- WebhookURL = "/webhook"
13
-
14
11
// ProfileURL is the API endpoint used for retrieving profiles.
15
12
// Used in the form: https://graph.facebook.com/v2.6/<USER_ID>?fields=first_name,last_name,profile_pic&access_token=<PAGE_ACCESS_TOKEN>
16
13
ProfileURL = "https://graph.facebook.com/v2.6/"
@@ -26,6 +23,8 @@ type Options struct {
26
23
VerifyToken string
27
24
// Token is the access token of the Facebook page to send messages from.
28
25
Token string
26
+ // WebhookURL is where the Messenger client should listen for webhook events.
27
+ WebhookURL string
29
28
}
30
29
31
30
// MessageHandler is a handler used for responding to a message containing text.
@@ -34,11 +33,15 @@ type MessageHandler func(Message, *Response)
34
33
// DeliveryHandler is a handler used for responding to a read receipt.
35
34
type DeliveryHandler func (Delivery , * Response )
36
35
36
+ // PostBackHandler is a handler used postback callbacks.
37
+ type PostBackHandler func (PostBack , * Response )
38
+
37
39
// Messenger is the client which manages communication with the Messenger Platform API.
38
40
type Messenger struct {
39
41
mux * http.ServeMux
40
42
messageHandlers []MessageHandler
41
43
deliveryHandlers []DeliveryHandler
44
+ postBackHandlers []PostBackHandler
42
45
token string
43
46
verifyHandler func (http.ResponseWriter , * http.Request )
44
47
}
@@ -51,7 +54,7 @@ func New(mo Options) *Messenger {
51
54
}
52
55
53
56
m .verifyHandler = newVerifyHandler (mo .VerifyToken )
54
- m .mux .HandleFunc (WebhookURL , m .handle )
57
+ m .mux .HandleFunc (mo . WebhookURL , m .handle )
55
58
56
59
return m
57
60
}
@@ -68,6 +71,11 @@ func (m *Messenger) HandleDelivery(f DeliveryHandler) {
68
71
m .deliveryHandlers = append (m .deliveryHandlers , f )
69
72
}
70
73
74
+ // HandlePostBack adds a new PostBackHandler to the Messenger
75
+ func (m * Messenger ) HandlePostBack (f PostBackHandler ) {
76
+ m .postBackHandlers = append (m .postBackHandlers , f )
77
+ }
78
+
71
79
// Handler returns the Messenger in HTTP client form.
72
80
func (m * Messenger ) Handler () http.Handler {
73
81
return m .mux
@@ -106,7 +114,6 @@ func (m *Messenger) handle(w http.ResponseWriter, r *http.Request) {
106
114
err := json .NewDecoder (r .Body ).Decode (& rec )
107
115
if err != nil {
108
116
fmt .Println (err )
109
-
110
117
fmt .Fprintln (w , `{status: 'not ok'}` )
111
118
return
112
119
}
@@ -136,19 +143,26 @@ func (m *Messenger) dispatch(r Receive) {
136
143
}
137
144
138
145
switch a {
139
- case TextAction :
140
- for _ , f := range m .messageHandlers {
141
- message := * info .Message
142
- message .Sender = info .Sender
143
- message .Recipient = info .Recipient
144
- message .Time = time .Unix (info .Timestamp , 0 )
145
-
146
- f (message , resp )
147
- }
148
- case DeliveryAction :
149
- for _ , f := range m .deliveryHandlers {
150
- f (* info .Delivery , resp )
151
- }
146
+ case TextAction :
147
+ for _ , f := range m .messageHandlers {
148
+ message := * info .Message
149
+ message .Sender = info .Sender
150
+ message .Recipient = info .Recipient
151
+ message .Time = time .Unix (info .Timestamp , 0 )
152
+ f (message , resp )
153
+ }
154
+ case DeliveryAction :
155
+ for _ , f := range m .deliveryHandlers {
156
+ f (* info .Delivery , resp )
157
+ }
158
+ case PostBackAction :
159
+ for _ , f := range m .postBackHandlers {
160
+ message := * info .PostBack
161
+ message .Sender = info .Sender
162
+ message .Recipient = info .Recipient
163
+ message .Time = time .Unix (info .Timestamp , 0 )
164
+ f (message , resp )
165
+ }
152
166
}
153
167
}
154
168
}
@@ -160,8 +174,9 @@ func (m *Messenger) classify(info MessageInfo, e Entry) Action {
160
174
return TextAction
161
175
} else if info .Delivery != nil {
162
176
return DeliveryAction
177
+ } else if info .PostBack != nil {
178
+ return PostBackAction
163
179
}
164
-
165
180
return UnknownAction
166
181
}
167
182
@@ -172,7 +187,6 @@ func newVerifyHandler(token string) func(w http.ResponseWriter, r *http.Request)
172
187
fmt .Fprintln (w , r .FormValue ("hub.challenge" ))
173
188
return
174
189
}
175
-
176
190
fmt .Fprintln (w , "Incorrect verify token." )
177
191
}
178
192
}
0 commit comments