Pointer instead of slice in StructuredMessageElement (#3)
This commit is contained in:
parent
b23ab4492c
commit
d4acc115a0
@ -14,11 +14,11 @@ const (
|
||||
// ReadAction means that the event was a previous recipient reading their respective
|
||||
// messages.
|
||||
ReadAction
|
||||
// PostBackAction represents post call back
|
||||
// PostBackAction represents post call back.
|
||||
PostBackAction
|
||||
// OptInAction represents opting in through the Send to Messenger button
|
||||
// OptInAction represents opting in through the Send to Messenger button.
|
||||
OptInAction
|
||||
// ReferralAction represents ?ref parameter in m.me URLs
|
||||
// ReferralAction represents ?ref parameter in m.me URLs.
|
||||
ReferralAction
|
||||
// AccountLinkingAction means that the event concerns changes in account linking
|
||||
// status.
|
||||
|
@ -56,7 +56,7 @@ type Read struct {
|
||||
Seq int `json:"seq"`
|
||||
}
|
||||
|
||||
// PostBack represents postback callback
|
||||
// PostBack represents postback callback.
|
||||
type PostBack struct {
|
||||
// Sender is who the message was sent from.
|
||||
Sender Sender `json:"-"`
|
||||
@ -94,7 +94,7 @@ func (r Read) Watermark() time.Time {
|
||||
}
|
||||
|
||||
// GetNLP simply unmarshals the NLP entities to the given struct and returns
|
||||
// an error if it's not possible
|
||||
// an error if it's not possible.
|
||||
func (m *Message) GetNLP(i interface{}) error {
|
||||
return json.Unmarshal(m.NLP, &i)
|
||||
}
|
||||
|
22
messenger.go
22
messenger.go
@ -135,17 +135,17 @@ func (m *Messenger) HandleRead(f ReadHandler) {
|
||||
m.readHandlers = append(m.readHandlers, f)
|
||||
}
|
||||
|
||||
// HandlePostBack adds a new PostBackHandler to the Messenger
|
||||
// HandlePostBack adds a new PostBackHandler to the Messenger.
|
||||
func (m *Messenger) HandlePostBack(f PostBackHandler) {
|
||||
m.postBackHandlers = append(m.postBackHandlers, f)
|
||||
}
|
||||
|
||||
// HandleReferral adds a new ReferralHandler to the Messenger
|
||||
// HandleReferral adds a new ReferralHandler to the Messenger.
|
||||
func (m *Messenger) HandleReferral(f ReferralHandler) {
|
||||
m.referralHandlers = append(m.referralHandlers, f)
|
||||
}
|
||||
|
||||
// HandleAccountLinking adds a new AccountLinkingHandler to the Messenger
|
||||
// HandleAccountLinking adds a new AccountLinkingHandler to the Messenger.
|
||||
func (m *Messenger) HandleAccountLinking(f AccountLinkingHandler) {
|
||||
m.accountLinkingHandlers = append(m.accountLinkingHandlers, f)
|
||||
}
|
||||
@ -163,7 +163,7 @@ func (m *Messenger) Handler() http.Handler {
|
||||
// - Name
|
||||
// - First Name
|
||||
// - Last Name
|
||||
// - Profile Picture
|
||||
// - Profile Picture.
|
||||
func (m *Messenger) ProfileByID(id int64, profileFields []string) (Profile, error) {
|
||||
p := Profile{}
|
||||
url := fmt.Sprintf("%v%v", ProfileURL, id)
|
||||
@ -204,7 +204,7 @@ func (m *Messenger) ProfileByID(id int64, profileFields []string) (Profile, erro
|
||||
return p, err
|
||||
}
|
||||
|
||||
// GreetingSetting sends settings for greeting
|
||||
// GreetingSetting sends settings for greeting.
|
||||
func (m *Messenger) GreetingSetting(text string) (QueryResponse, error) {
|
||||
var qr QueryResponse
|
||||
|
||||
@ -239,7 +239,7 @@ func (m *Messenger) GreetingSetting(text string) (QueryResponse, error) {
|
||||
return getFacebookQueryResponse(resp.Body)
|
||||
}
|
||||
|
||||
// CallToActionsSetting sends settings for Get Started or Persistent Menu
|
||||
// CallToActionsSetting sends settings for Get Started or Persistent Menu.
|
||||
func (m *Messenger) CallToActionsSetting(state string, actions []CallToActionsItem) (QueryResponse, error) {
|
||||
var qr QueryResponse
|
||||
|
||||
@ -296,7 +296,7 @@ func (m *Messenger) handle(w http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
|
||||
if rec.Object != "page" {
|
||||
fmt.Println("Object is not page, undefined behaviour. Got", rec.Object)
|
||||
fmt.Println("Object is not page, undefined behavior. Got", rec.Object)
|
||||
respond(w, http.StatusUnprocessableEntity)
|
||||
return
|
||||
}
|
||||
@ -319,7 +319,7 @@ func respond(w http.ResponseWriter, code int) {
|
||||
fmt.Fprintf(w, `{"code": %d, "status": "%s"}`, code, http.StatusText(code))
|
||||
}
|
||||
|
||||
// checkIntegrity checks the integrity of the requests received
|
||||
// checkIntegrity checks the integrity of the requests received.
|
||||
func (m *Messenger) checkIntegrity(r *http.Request) error {
|
||||
if m.appSecret == "" {
|
||||
return xerrors.New("missing app secret")
|
||||
@ -424,7 +424,7 @@ func (m *Messenger) dispatch(r Receive) {
|
||||
}
|
||||
}
|
||||
|
||||
// Response returns new Response object
|
||||
// Response returns new Response object.
|
||||
func (m *Messenger) Response(to int64) *Response {
|
||||
return &Response{
|
||||
to: Recipient{to},
|
||||
@ -437,7 +437,7 @@ func (m *Messenger) Send(to Recipient, message string, messagingType MessagingTy
|
||||
return m.SendWithReplies(to, message, nil, messagingType, metadata, tags...)
|
||||
}
|
||||
|
||||
// SendGeneralMessage will send the GenericTemplate message
|
||||
// SendGeneralMessage will send the GenericTemplate message.
|
||||
func (m *Messenger) SendGeneralMessage(to Recipient, elements *[]StructuredMessageElement, messagingType MessagingType, metadata string, tags ...string) (QueryResponse, error) {
|
||||
r := &Response{
|
||||
token: m.token,
|
||||
@ -515,7 +515,7 @@ func (m *Messenger) classify(info MessageInfo) Action {
|
||||
return UnknownAction
|
||||
}
|
||||
|
||||
// newVerifyHandler returns a function which can be used to handle webhook verification
|
||||
// newVerifyHandler returns a function which can be used to handle webhook verification.
|
||||
func newVerifyHandler(token string) func(w http.ResponseWriter, r *http.Request) {
|
||||
return func(w http.ResponseWriter, r *http.Request) {
|
||||
if r.FormValue("hub.verify_token") == token {
|
||||
|
@ -1,6 +1,6 @@
|
||||
package messenger
|
||||
|
||||
// Profile is the public information of a Facebook user
|
||||
// Profile is the public information of a Facebook user.
|
||||
type Profile struct {
|
||||
Name string `json:"name"`
|
||||
FirstName string `json:"first_name"`
|
||||
|
@ -58,7 +58,7 @@ type OptIn struct {
|
||||
Ref string `json:"ref"`
|
||||
}
|
||||
|
||||
// ReferralMessage represents referral endpoint
|
||||
// ReferralMessage represents referral endpoint.
|
||||
type ReferralMessage struct {
|
||||
*Referral
|
||||
|
||||
@ -70,7 +70,7 @@ type ReferralMessage struct {
|
||||
Time time.Time `json:"-"`
|
||||
}
|
||||
|
||||
// Referral represents referral info
|
||||
// Referral represents referral info.
|
||||
type Referral struct {
|
||||
// Data originally passed in the ref param
|
||||
Ref string `json:"ref"`
|
||||
@ -112,13 +112,13 @@ type QuickReply struct {
|
||||
|
||||
// Payload is the information on where an attachment is.
|
||||
type Payload struct {
|
||||
URL string `json:"url,omitempty"`
|
||||
URL string `json:"url,omitempty"`
|
||||
Title string `json:"title,omitempty"`
|
||||
// Coordinates is Lat/Long pair of location pin
|
||||
Coordinates *Coordinates `json:"coordinates,omitempty"`
|
||||
}
|
||||
|
||||
// Coordinates is a pair of latitude and longitude
|
||||
// Coordinates is a pair of latitude and longitude.
|
||||
type Coordinates struct {
|
||||
// Lat is latitude
|
||||
Lat float64 `json:"lat"`
|
||||
|
57
response.go
57
response.go
@ -39,13 +39,13 @@ const (
|
||||
// FileAttachment is file attachment type.
|
||||
FileAttachment AttachmentType = "file"
|
||||
|
||||
// ResponseType is response messaging type
|
||||
// ResponseType is response messaging type.
|
||||
ResponseType MessagingType = "RESPONSE"
|
||||
// UpdateType is update messaging type
|
||||
// UpdateType is update messaging type.
|
||||
UpdateType MessagingType = "UPDATE"
|
||||
// MessageTagType is message_tag messaging type
|
||||
// MessageTagType is message_tag messaging type.
|
||||
MessageTagType MessagingType = "MESSAGE_TAG"
|
||||
// NonPromotionalSubscriptionType is NON_PROMOTIONAL_SUBSCRIPTION messaging type
|
||||
// NonPromotionalSubscriptionType is NON_PROMOTIONAL_SUBSCRIPTION messaging type.
|
||||
NonPromotionalSubscriptionType MessagingType = "NON_PROMOTIONAL_SUBSCRIPTION"
|
||||
|
||||
// TopElementStyle is compact.
|
||||
@ -60,14 +60,14 @@ const (
|
||||
)
|
||||
|
||||
// QueryResponse is the response sent back by Facebook when setting up things
|
||||
// like greetings or call-to-actions
|
||||
// like greetings or call-to-actions.
|
||||
type QueryResponse struct {
|
||||
Error *QueryError `json:"error,omitempty"`
|
||||
RecipientID string `json:"recipient_id"`
|
||||
MessageID string `json:"message_id"`
|
||||
}
|
||||
|
||||
// QueryError is representing an error sent back by Facebook
|
||||
// QueryError is representing an error sent back by Facebook.
|
||||
type QueryError struct {
|
||||
Message string `json:"message"`
|
||||
Type string `json:"type"`
|
||||
@ -76,7 +76,7 @@ type QueryError struct {
|
||||
FBTraceID string `json:"fbtrace_id"`
|
||||
}
|
||||
|
||||
// QueryError implements error
|
||||
// QueryError implements error.
|
||||
func (e QueryError) Error() string {
|
||||
return e.Message
|
||||
}
|
||||
@ -126,7 +126,8 @@ func (r *Response) Text(message string, messagingType MessagingType, metadata st
|
||||
|
||||
// TextWithReplies sends a textual message with some replies
|
||||
// messagingType should be one of the following: "RESPONSE","UPDATE","MESSAGE_TAG","NON_PROMOTIONAL_SUBSCRIPTION"
|
||||
// only supply tags when messagingType == "MESSAGE_TAG" (see https://developers.facebook.com/docs/messenger-platform/send-messages#messaging_types for more)
|
||||
// only supply tags when messagingType == "MESSAGE_TAG"
|
||||
// (see https://developers.facebook.com/docs/messenger-platform/send-messages#messaging_types for more).
|
||||
func (r *Response) TextWithReplies(message string, replies []QuickReply, messagingType MessagingType, metadata string, tags ...string) (QueryResponse, error) {
|
||||
var tag string
|
||||
if len(tags) > 0 {
|
||||
@ -147,7 +148,7 @@ func (r *Response) TextWithReplies(message string, replies []QuickReply, messagi
|
||||
return r.DispatchMessage(&m)
|
||||
}
|
||||
|
||||
// AttachmentWithReplies sends a attachment message with some replies
|
||||
// AttachmentWithReplies sends a attachment message with some replies.
|
||||
func (r *Response) AttachmentWithReplies(attachment *StructuredMessageAttachment, replies []QuickReply, messagingType MessagingType, metadata string, tags ...string) (QueryResponse, error) {
|
||||
var tag string
|
||||
if len(tags) > 0 {
|
||||
@ -204,15 +205,15 @@ func (r *Response) Attachment(dataType AttachmentType, url string, messagingType
|
||||
return r.DispatchMessage(&m)
|
||||
}
|
||||
|
||||
// copied from multipart package
|
||||
// copied from multipart package.
|
||||
var quoteEscaper = strings.NewReplacer("\\", "\\\\", `"`, "\\\"")
|
||||
|
||||
// copied from multipart package
|
||||
// copied from multipart package.
|
||||
func escapeQuotes(s string) string {
|
||||
return quoteEscaper.Replace(s)
|
||||
}
|
||||
|
||||
// copied from multipart package with slight changes due to fixed content-type there
|
||||
// copied from multipart package with slight changes due to fixed content-type there.
|
||||
func createFormFile(filename string, w *multipart.Writer, contentType string) (io.Writer, error) {
|
||||
h := make(textproto.MIMEHeader)
|
||||
h.Set("Content-Disposition",
|
||||
@ -267,7 +268,7 @@ func (r *Response) AttachmentData(dataType AttachmentType, filename string, file
|
||||
return getFacebookQueryResponse(resp.Body)
|
||||
}
|
||||
|
||||
// ButtonTemplate sends a message with the main contents being button elements
|
||||
// ButtonTemplate sends a message with the main contents being button elements.
|
||||
func (r *Response) ButtonTemplate(text string, buttons *[]StructuredMessageButton, messagingType MessagingType, metadata string, tags ...string) (QueryResponse, error) {
|
||||
var tag string
|
||||
if len(tags) > 0 {
|
||||
@ -295,7 +296,7 @@ func (r *Response) ButtonTemplate(text string, buttons *[]StructuredMessageButto
|
||||
return r.DispatchMessage(&m)
|
||||
}
|
||||
|
||||
// GenericTemplate is a message which allows for structural elements to be sent
|
||||
// GenericTemplate is a message which allows for structural elements to be sent.
|
||||
func (r *Response) GenericTemplate(elements *[]StructuredMessageElement, messagingType MessagingType, metadata string, tags ...string) (QueryResponse, error) {
|
||||
var tag string
|
||||
if len(tags) > 0 {
|
||||
@ -321,7 +322,7 @@ func (r *Response) GenericTemplate(elements *[]StructuredMessageElement, messagi
|
||||
return r.DispatchMessage(&m)
|
||||
}
|
||||
|
||||
// ListTemplate sends a list of elements
|
||||
// ListTemplate sends a list of elements.
|
||||
func (r *Response) ListTemplate(elements *[]StructuredMessageElement, messagingType MessagingType, tags ...string) (QueryResponse, error) {
|
||||
var tag string
|
||||
if len(tags) > 0 {
|
||||
@ -347,7 +348,7 @@ func (r *Response) ListTemplate(elements *[]StructuredMessageElement, messagingT
|
||||
return r.DispatchMessage(&m)
|
||||
}
|
||||
|
||||
// SenderAction sends a info about sender action
|
||||
// SenderAction sends a info about sender action.
|
||||
func (r *Response) SenderAction(action string) (QueryResponse, error) {
|
||||
m := SendSenderAction{
|
||||
Recipient: r.to,
|
||||
@ -356,7 +357,7 @@ func (r *Response) SenderAction(action string) (QueryResponse, error) {
|
||||
return r.DispatchMessage(&m)
|
||||
}
|
||||
|
||||
// DispatchMessage posts the message to messenger, return the error if there's any
|
||||
// DispatchMessage posts the message to messenger, return the error if there's any.
|
||||
func (r *Response) DispatchMessage(m interface{}) (QueryResponse, error) {
|
||||
var res QueryResponse
|
||||
data, err := json.Marshal(m)
|
||||
@ -453,7 +454,7 @@ type StructuredMessageAttachment struct {
|
||||
Payload StructuredMessagePayload `json:"payload"`
|
||||
}
|
||||
|
||||
// StructuredMessagePayload is the actual payload of an attachment
|
||||
// StructuredMessagePayload is the actual payload of an attachment.
|
||||
type StructuredMessagePayload struct {
|
||||
// TemplateType must be button, generic or receipt
|
||||
TemplateType string `json:"template_type,omitempty"`
|
||||
@ -500,14 +501,14 @@ type Adjustment struct {
|
||||
Amount float32 `json:"amount,omitempty"`
|
||||
}
|
||||
|
||||
// StructuredMessageElement is a response containing structural elements
|
||||
// StructuredMessageElement is a response containing structural elements.
|
||||
type StructuredMessageElement struct {
|
||||
Title string `json:"title"`
|
||||
ImageURL string `json:"image_url"`
|
||||
ItemURL string `json:"item_url,omitempty"`
|
||||
Subtitle string `json:"subtitle"`
|
||||
DefaultAction *DefaultAction `json:"default_action,omitempty"`
|
||||
Buttons []StructuredMessageButton `json:"buttons"`
|
||||
Title string `json:"title"`
|
||||
ImageURL string `json:"image_url"`
|
||||
ItemURL string `json:"item_url,omitempty"`
|
||||
Subtitle string `json:"subtitle"`
|
||||
DefaultAction *DefaultAction `json:"default_action,omitempty"`
|
||||
Buttons *[]StructuredMessageButton `json:"buttons"`
|
||||
ReceiptMessageElement
|
||||
}
|
||||
|
||||
@ -517,7 +518,7 @@ type ReceiptMessageElement struct {
|
||||
Currency string `json:"currency,omitempty"`
|
||||
}
|
||||
|
||||
// DefaultAction is a response containing default action properties
|
||||
// DefaultAction is a response containing default action properties.
|
||||
type DefaultAction struct {
|
||||
Type string `json:"type"`
|
||||
URL string `json:"url,omitempty"`
|
||||
@ -527,7 +528,7 @@ type DefaultAction struct {
|
||||
WebviewShareButton string `json:"webview_share_button,omitempty"`
|
||||
}
|
||||
|
||||
// StructuredMessageButton is a response containing buttons
|
||||
// StructuredMessageButton is a response containing buttons.
|
||||
type StructuredMessageButton struct {
|
||||
Type string `json:"type"`
|
||||
URL string `json:"url,omitempty"`
|
||||
@ -540,7 +541,7 @@ type StructuredMessageButton struct {
|
||||
ShareContents *StructuredMessageData `json:"share_contents,omitempty"`
|
||||
}
|
||||
|
||||
// SendSenderAction is the information about sender action
|
||||
// SendSenderAction is the information about sender action.
|
||||
type SendSenderAction struct {
|
||||
Recipient Recipient `json:"recipient"`
|
||||
SenderAction string `json:"sender_action"`
|
||||
|
@ -17,25 +17,25 @@ const (
|
||||
WebviewFull = "full"
|
||||
)
|
||||
|
||||
// GreetingSetting is the setting for greeting message
|
||||
// GreetingSetting is the setting for greeting message.
|
||||
type GreetingSetting struct {
|
||||
SettingType string `json:"setting_type"`
|
||||
Greeting GreetingInfo `json:"greeting"`
|
||||
}
|
||||
|
||||
// GreetingInfo contains greeting message
|
||||
// GreetingInfo contains greeting message.
|
||||
type GreetingInfo struct {
|
||||
Text string `json:"text"`
|
||||
}
|
||||
|
||||
// CallToActionsSetting is the settings for Get Started and Persist Menu
|
||||
// CallToActionsSetting is the settings for Get Started and Persist Menu.
|
||||
type CallToActionsSetting struct {
|
||||
SettingType string `json:"setting_type"`
|
||||
ThreadState string `json:"thread_state"`
|
||||
CallToActions []CallToActionsItem `json:"call_to_actions"`
|
||||
}
|
||||
|
||||
// CallToActionsItem contains Get Started button or item of Persist Menu
|
||||
// CallToActionsItem contains Get Started button or item of Persist Menu.
|
||||
type CallToActionsItem struct {
|
||||
Type string `json:"type,omitempty"`
|
||||
Title string `json:"title,omitempty"`
|
||||
|
Loading…
Reference in New Issue
Block a user