github.com/line/line-bot-sdk-go/v7@v7.21.0/linebot/message.go (about)

     1  // Copyright 2016 LINE Corporation
     2  //
     3  // LINE Corporation licenses this file to you under the Apache License,
     4  // version 2.0 (the "License"); you may not use this file except in compliance
     5  // with the License. You may obtain a copy of the License at:
     6  //
     7  //   http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
    11  // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
    12  // License for the specific language governing permissions and limitations
    13  // under the License.
    14  
    15  package linebot
    16  
    17  import (
    18  	"encoding/json"
    19  )
    20  
    21  // MessageType type
    22  type MessageType string
    23  
    24  // MessageType constants
    25  const (
    26  	MessageTypeText     MessageType = "text"
    27  	MessageTypeImage    MessageType = "image"
    28  	MessageTypeVideo    MessageType = "video"
    29  	MessageTypeAudio    MessageType = "audio"
    30  	MessageTypeFile     MessageType = "file"
    31  	MessageTypeLocation MessageType = "location"
    32  	MessageTypeSticker  MessageType = "sticker"
    33  	MessageTypeTemplate MessageType = "template"
    34  	MessageTypeImagemap MessageType = "imagemap"
    35  	MessageTypeFlex     MessageType = "flex"
    36  )
    37  
    38  // Message interface
    39  type Message interface {
    40  	Message()
    41  	Type() MessageType
    42  }
    43  
    44  // SendingMessage interface
    45  type SendingMessage interface {
    46  	Message
    47  	WithQuickReplies(*QuickReplyItems) SendingMessage
    48  	WithSender(*Sender) SendingMessage
    49  	AddEmoji(emoji *Emoji) SendingMessage
    50  }
    51  
    52  // TextMessage type
    53  type TextMessage struct {
    54  	ID     string
    55  	Text   string
    56  	Emojis []*Emoji
    57  
    58  	quickReplyItems *QuickReplyItems
    59  	sender          *Sender
    60  	messageType     MessageType
    61  
    62  	Mention *Mention
    63  }
    64  
    65  // MarshalJSON method of TextMessage
    66  func (m *TextMessage) MarshalJSON() ([]byte, error) {
    67  	return json.Marshal(&struct {
    68  		Type       MessageType      `json:"type"`
    69  		Text       string           `json:"text"`
    70  		QuickReply *QuickReplyItems `json:"quickReply,omitempty"`
    71  		Sender     *Sender          `json:"sender,omitempty"`
    72  		Emojis     []*Emoji         `json:"emojis,omitempty"`
    73  	}{
    74  		Type:       m.messageType,
    75  		Text:       m.Text,
    76  		QuickReply: m.quickReplyItems,
    77  		Sender:     m.sender,
    78  		Emojis:     m.Emojis,
    79  	})
    80  }
    81  
    82  // WithQuickReplies method of TextMessage
    83  func (m *TextMessage) WithQuickReplies(items *QuickReplyItems) SendingMessage {
    84  	m.quickReplyItems = items
    85  	return m
    86  }
    87  
    88  // WithSender method of TextMessage
    89  func (m *TextMessage) WithSender(sender *Sender) SendingMessage {
    90  	m.sender = sender
    91  	return m
    92  }
    93  
    94  // AddEmoji method of TextMessage
    95  func (m *TextMessage) AddEmoji(emoji *Emoji) SendingMessage {
    96  	m.Emojis = append(m.Emojis, emoji)
    97  	return m
    98  }
    99  
   100  // ImageMessage type
   101  type ImageMessage struct {
   102  	ID                 string
   103  	OriginalContentURL string
   104  	PreviewImageURL    string
   105  	ContentProvider    *ContentProvider
   106  	ImageSet           *ImageSet
   107  
   108  	quickReplyItems *QuickReplyItems
   109  	sender          *Sender
   110  	messageType     MessageType
   111  }
   112  
   113  // MarshalJSON method of ImageMessage
   114  func (m *ImageMessage) MarshalJSON() ([]byte, error) {
   115  	return json.Marshal(&struct {
   116  		Type               MessageType      `json:"type"`
   117  		OriginalContentURL string           `json:"originalContentUrl"`
   118  		PreviewImageURL    string           `json:"previewImageUrl"`
   119  		ContentProvider    *ContentProvider `json:"contentProvider,omitempty"`
   120  		ImageSet           *ImageSet        `json:"imageSet,omitempty"`
   121  		QuickReply         *QuickReplyItems `json:"quickReply,omitempty"`
   122  		Sender             *Sender          `json:"sender,omitempty"`
   123  	}{
   124  		Type:               m.messageType,
   125  		OriginalContentURL: m.OriginalContentURL,
   126  		PreviewImageURL:    m.PreviewImageURL,
   127  		ContentProvider:    m.ContentProvider,
   128  		ImageSet:           m.ImageSet,
   129  		QuickReply:         m.quickReplyItems,
   130  		Sender:             m.sender,
   131  	})
   132  }
   133  
   134  // WithQuickReplies method of ImageMessage
   135  func (m *ImageMessage) WithQuickReplies(items *QuickReplyItems) SendingMessage {
   136  	m.quickReplyItems = items
   137  	return m
   138  }
   139  
   140  // WithSender method of ImageMessage
   141  func (m *ImageMessage) WithSender(sender *Sender) SendingMessage {
   142  	m.sender = sender
   143  	return m
   144  }
   145  
   146  // AddEmoji method of ImageMessage
   147  func (m *ImageMessage) AddEmoji(*Emoji) SendingMessage {
   148  	return m
   149  }
   150  
   151  // VideoMessage type
   152  type VideoMessage struct {
   153  	ID                 string
   154  	OriginalContentURL string
   155  	PreviewImageURL    string
   156  	Duration           int
   157  	ContentProvider    *ContentProvider
   158  
   159  	quickReplyItems *QuickReplyItems
   160  	sender          *Sender
   161  	messageType     MessageType
   162  }
   163  
   164  // MarshalJSON method of VideoMessage
   165  func (m *VideoMessage) MarshalJSON() ([]byte, error) {
   166  	return json.Marshal(&struct {
   167  		Type               MessageType      `json:"type"`
   168  		OriginalContentURL string           `json:"originalContentUrl"`
   169  		PreviewImageURL    string           `json:"previewImageUrl"`
   170  		Duration           int              `json:"duration,omitempty"`
   171  		QuickReply         *QuickReplyItems `json:"quickReply,omitempty"`
   172  		Sender             *Sender          `json:"sender,omitempty"`
   173  	}{
   174  		Type:               m.messageType,
   175  		OriginalContentURL: m.OriginalContentURL,
   176  		PreviewImageURL:    m.PreviewImageURL,
   177  		Duration:           m.Duration,
   178  		QuickReply:         m.quickReplyItems,
   179  		Sender:             m.sender,
   180  	})
   181  }
   182  
   183  // WithQuickReplies method of VideoMessage
   184  func (m *VideoMessage) WithQuickReplies(items *QuickReplyItems) SendingMessage {
   185  	m.quickReplyItems = items
   186  	return m
   187  }
   188  
   189  // WithSender method of VideoMessage
   190  func (m *VideoMessage) WithSender(sender *Sender) SendingMessage {
   191  	m.sender = sender
   192  	return m
   193  }
   194  
   195  // AddEmoji method of VideoMessage
   196  func (m *VideoMessage) AddEmoji(*Emoji) SendingMessage {
   197  	return m
   198  }
   199  
   200  // AudioMessage type
   201  type AudioMessage struct {
   202  	ID                 string
   203  	OriginalContentURL string
   204  	Duration           int
   205  	ContentProvider    *ContentProvider
   206  
   207  	quickReplyItems *QuickReplyItems
   208  	sender          *Sender
   209  	messageType     MessageType
   210  }
   211  
   212  // MarshalJSON method of AudioMessage
   213  func (m *AudioMessage) MarshalJSON() ([]byte, error) {
   214  	return json.Marshal(&struct {
   215  		Type               MessageType      `json:"type"`
   216  		OriginalContentURL string           `json:"originalContentUrl"`
   217  		Duration           int              `json:"duration"`
   218  		QuickReply         *QuickReplyItems `json:"quickReply,omitempty"`
   219  		Sender             *Sender          `json:"sender,omitempty"`
   220  	}{
   221  		Type:               m.messageType,
   222  		OriginalContentURL: m.OriginalContentURL,
   223  		Duration:           m.Duration,
   224  		QuickReply:         m.quickReplyItems,
   225  		Sender:             m.sender,
   226  	})
   227  }
   228  
   229  // WithQuickReplies method of AudioMessage
   230  func (m *AudioMessage) WithQuickReplies(items *QuickReplyItems) SendingMessage {
   231  	m.quickReplyItems = items
   232  	return m
   233  }
   234  
   235  // WithSender method of AudioMessage
   236  func (m *AudioMessage) WithSender(sender *Sender) SendingMessage {
   237  	m.sender = sender
   238  	return m
   239  }
   240  
   241  // AddEmoji method of AudioMessage
   242  func (m *AudioMessage) AddEmoji(*Emoji) SendingMessage {
   243  	return m
   244  }
   245  
   246  // FileMessage type
   247  type FileMessage struct {
   248  	ID          string
   249  	FileName    string
   250  	FileSize    int
   251  	messageType MessageType
   252  }
   253  
   254  // LocationMessage type
   255  type LocationMessage struct {
   256  	ID        string
   257  	Title     string
   258  	Address   string
   259  	Latitude  float64
   260  	Longitude float64
   261  
   262  	quickReplyItems *QuickReplyItems
   263  	sender          *Sender
   264  	messageType     MessageType
   265  }
   266  
   267  // MarshalJSON method of LocationMessage
   268  func (m *LocationMessage) MarshalJSON() ([]byte, error) {
   269  	return json.Marshal(&struct {
   270  		Type       MessageType      `json:"type"`
   271  		Title      string           `json:"title"`
   272  		Address    string           `json:"address"`
   273  		Latitude   float64          `json:"latitude"`
   274  		Longitude  float64          `json:"longitude"`
   275  		QuickReply *QuickReplyItems `json:"quickReply,omitempty"`
   276  		Sender     *Sender          `json:"sender,omitempty"`
   277  	}{
   278  		Type:       m.messageType,
   279  		Title:      m.Title,
   280  		Address:    m.Address,
   281  		Latitude:   m.Latitude,
   282  		Longitude:  m.Longitude,
   283  		QuickReply: m.quickReplyItems,
   284  		Sender:     m.sender,
   285  	})
   286  }
   287  
   288  // WithQuickReplies method of LocationMessage
   289  func (m *LocationMessage) WithQuickReplies(items *QuickReplyItems) SendingMessage {
   290  	m.quickReplyItems = items
   291  	return m
   292  }
   293  
   294  // WithSender method of LocationMessage
   295  func (m *LocationMessage) WithSender(sender *Sender) SendingMessage {
   296  	m.sender = sender
   297  	return m
   298  }
   299  
   300  // AddEmoji method of LocationMessage
   301  func (m *LocationMessage) AddEmoji(*Emoji) SendingMessage {
   302  	return m
   303  }
   304  
   305  // StickerMessage type
   306  type StickerMessage struct {
   307  	ID                  string
   308  	PackageID           string
   309  	StickerID           string
   310  	StickerResourceType StickerResourceType
   311  	Keywords            []string
   312  	Text                string
   313  
   314  	quickReplyItems *QuickReplyItems
   315  	sender          *Sender
   316  	messageType     MessageType
   317  }
   318  
   319  // MarshalJSON method of StickerMessage
   320  func (m *StickerMessage) MarshalJSON() ([]byte, error) {
   321  	return json.Marshal(&struct {
   322  		Type                MessageType         `json:"type"`
   323  		PackageID           string              `json:"packageId"`
   324  		StickerID           string              `json:"stickerId"`
   325  		StickerResourceType StickerResourceType `json:"stickerResourceType,omitempty"`
   326  		Keywords            []string            `json:"keywords,omitempty"`
   327  		QuickReply          *QuickReplyItems    `json:"quickReply,omitempty"`
   328  		Sender              *Sender             `json:"sender,omitempty"`
   329  		Text                string              `json:"text,omitempty"`
   330  	}{
   331  		Type:                m.messageType,
   332  		PackageID:           m.PackageID,
   333  		StickerID:           m.StickerID,
   334  		StickerResourceType: m.StickerResourceType,
   335  		Keywords:            m.Keywords,
   336  		QuickReply:          m.quickReplyItems,
   337  		Sender:              m.sender,
   338  		Text:                m.Text,
   339  	})
   340  }
   341  
   342  // WithQuickReplies method of StickerMessage
   343  func (m *StickerMessage) WithQuickReplies(items *QuickReplyItems) SendingMessage {
   344  	m.quickReplyItems = items
   345  	return m
   346  }
   347  
   348  // WithSender method of StickerMessage
   349  func (m *StickerMessage) WithSender(sender *Sender) SendingMessage {
   350  	m.sender = sender
   351  	return m
   352  }
   353  
   354  // AddEmoji method of StickerMessage
   355  func (m *StickerMessage) AddEmoji(*Emoji) SendingMessage {
   356  	return m
   357  }
   358  
   359  // TemplateMessage type
   360  type TemplateMessage struct {
   361  	AltText  string
   362  	Template Template
   363  
   364  	quickReplyItems *QuickReplyItems
   365  	sender          *Sender
   366  	messageType     MessageType
   367  }
   368  
   369  // MarshalJSON method of TemplateMessage
   370  func (m *TemplateMessage) MarshalJSON() ([]byte, error) {
   371  	return json.Marshal(&struct {
   372  		Type       MessageType      `json:"type"`
   373  		AltText    string           `json:"altText"`
   374  		Template   Template         `json:"template"`
   375  		QuickReply *QuickReplyItems `json:"quickReply,omitempty"`
   376  		Sender     *Sender          `json:"sender,omitempty"`
   377  	}{
   378  		Type:       m.messageType,
   379  		AltText:    m.AltText,
   380  		Template:   m.Template,
   381  		QuickReply: m.quickReplyItems,
   382  		Sender:     m.sender,
   383  	})
   384  }
   385  
   386  // WithQuickReplies method of TemplateMessage
   387  func (m *TemplateMessage) WithQuickReplies(items *QuickReplyItems) SendingMessage {
   388  	m.quickReplyItems = items
   389  	return m
   390  }
   391  
   392  // WithSender method of TemplateMessage
   393  func (m *TemplateMessage) WithSender(sender *Sender) SendingMessage {
   394  	m.sender = sender
   395  	return m
   396  }
   397  
   398  // AddEmoji method of TemplateMessage
   399  func (m *TemplateMessage) AddEmoji(*Emoji) SendingMessage {
   400  	return m
   401  }
   402  
   403  // ImagemapMessage type
   404  type ImagemapMessage struct {
   405  	BaseURL  string
   406  	AltText  string
   407  	BaseSize ImagemapBaseSize
   408  	Actions  []ImagemapAction
   409  	Video    *ImagemapVideo
   410  
   411  	quickReplyItems *QuickReplyItems
   412  	sender          *Sender
   413  	messageType     MessageType
   414  }
   415  
   416  // MarshalJSON method of ImagemapMessage
   417  func (m *ImagemapMessage) MarshalJSON() ([]byte, error) {
   418  	return json.Marshal(&struct {
   419  		Type       MessageType      `json:"type"`
   420  		BaseURL    string           `json:"baseUrl"`
   421  		AltText    string           `json:"altText"`
   422  		BaseSize   ImagemapBaseSize `json:"baseSize"`
   423  		Actions    []ImagemapAction `json:"actions"`
   424  		Video      *ImagemapVideo   `json:"video,omitempty"`
   425  		QuickReply *QuickReplyItems `json:"quickReply,omitempty"`
   426  		Sender     *Sender          `json:"sender,omitempty"`
   427  	}{
   428  		Type:       m.messageType,
   429  		BaseURL:    m.BaseURL,
   430  		AltText:    m.AltText,
   431  		BaseSize:   m.BaseSize,
   432  		Actions:    m.Actions,
   433  		Video:      m.Video,
   434  		QuickReply: m.quickReplyItems,
   435  		Sender:     m.sender,
   436  	})
   437  }
   438  
   439  // WithVideo method
   440  func (m *ImagemapMessage) WithVideo(video *ImagemapVideo) *ImagemapMessage {
   441  	m.Video = video
   442  	return m
   443  }
   444  
   445  // WithQuickReplies method of ImagemapMessage
   446  func (m *ImagemapMessage) WithQuickReplies(items *QuickReplyItems) SendingMessage {
   447  	m.quickReplyItems = items
   448  	return m
   449  }
   450  
   451  // WithSender method of ImagemapMessage
   452  func (m *ImagemapMessage) WithSender(sender *Sender) SendingMessage {
   453  	m.sender = sender
   454  	return m
   455  }
   456  
   457  // AddEmoji method of ImagemapMessage
   458  func (m *ImagemapMessage) AddEmoji(*Emoji) SendingMessage {
   459  	return m
   460  }
   461  
   462  // FlexMessage type
   463  type FlexMessage struct {
   464  	AltText  string
   465  	Contents FlexContainer
   466  
   467  	quickReplyItems *QuickReplyItems
   468  	sender          *Sender
   469  	messageType     MessageType
   470  }
   471  
   472  // MarshalJSON method of FlexMessage
   473  func (m *FlexMessage) MarshalJSON() ([]byte, error) {
   474  	return json.Marshal(&struct {
   475  		Type       MessageType      `json:"type"`
   476  		AltText    string           `json:"altText"`
   477  		Contents   interface{}      `json:"contents"`
   478  		QuickReply *QuickReplyItems `json:"quickReply,omitempty"`
   479  		Sender     *Sender          `json:"sender,omitempty"`
   480  	}{
   481  		Type:       m.messageType,
   482  		AltText:    m.AltText,
   483  		Contents:   m.Contents,
   484  		QuickReply: m.quickReplyItems,
   485  		Sender:     m.sender,
   486  	})
   487  }
   488  
   489  // WithQuickReplies method of FlexMessage
   490  func (m *FlexMessage) WithQuickReplies(items *QuickReplyItems) SendingMessage {
   491  	m.quickReplyItems = items
   492  	return m
   493  }
   494  
   495  // WithSender method of FlexMessage
   496  func (m *FlexMessage) WithSender(sender *Sender) SendingMessage {
   497  	m.sender = sender
   498  	return m
   499  }
   500  
   501  // AddEmoji method of FlexMessage
   502  func (m *FlexMessage) AddEmoji(*Emoji) SendingMessage {
   503  	return m
   504  }
   505  
   506  // Message implements Message interface
   507  func (*FileMessage) Message() {}
   508  
   509  // Message implements Message interface
   510  func (*TextMessage) Message() {}
   511  
   512  // Message implements Message interface
   513  func (*ImageMessage) Message() {}
   514  
   515  // Message implements Message interface
   516  func (*VideoMessage) Message() {}
   517  
   518  // Message implements Message interface
   519  func (*AudioMessage) Message() {}
   520  
   521  // Message implements Message interface
   522  func (*LocationMessage) Message() {}
   523  
   524  // Message implements Message interface
   525  func (*StickerMessage) Message() {}
   526  
   527  // Message implements Message interface
   528  func (*TemplateMessage) Message() {}
   529  
   530  // Message implements Message interface
   531  func (*ImagemapMessage) Message() {}
   532  
   533  // Message implements Message interface
   534  func (*FlexMessage) Message() {}
   535  
   536  // Type implements Message interface
   537  func (m *FileMessage) Type() MessageType { return m.messageType }
   538  
   539  // Type implements Message interface
   540  func (m *TextMessage) Type() MessageType { return m.messageType }
   541  
   542  // Type implements Message interface
   543  func (m *ImageMessage) Type() MessageType { return m.messageType }
   544  
   545  // Type implements Message interface
   546  func (m *VideoMessage) Type() MessageType { return m.messageType }
   547  
   548  // Type implements Message interface
   549  func (m *AudioMessage) Type() MessageType { return m.messageType }
   550  
   551  // Type implements Message interface
   552  func (m *LocationMessage) Type() MessageType { return m.messageType }
   553  
   554  // Type implements Message interface
   555  func (m *StickerMessage) Type() MessageType { return m.messageType }
   556  
   557  // Type implements Message interface
   558  func (m *TemplateMessage) Type() MessageType { return m.messageType }
   559  
   560  // Type implements Message interface
   561  func (m *ImagemapMessage) Type() MessageType { return m.messageType }
   562  
   563  // Type implements Message interface
   564  func (m *FlexMessage) Type() MessageType { return m.messageType }
   565  
   566  // NewTextMessage function
   567  func NewTextMessage(content string) *TextMessage {
   568  	return &TextMessage{
   569  		Text:        content,
   570  		messageType: MessageTypeText,
   571  	}
   572  }
   573  
   574  // NewImageMessage function
   575  func NewImageMessage(originalContentURL, previewImageURL string) *ImageMessage {
   576  	return &ImageMessage{
   577  		OriginalContentURL: originalContentURL,
   578  		PreviewImageURL:    previewImageURL,
   579  		messageType:        MessageTypeImage,
   580  	}
   581  }
   582  
   583  // NewVideoMessage function
   584  func NewVideoMessage(originalContentURL, previewImageURL string) *VideoMessage {
   585  	return &VideoMessage{
   586  		OriginalContentURL: originalContentURL,
   587  		PreviewImageURL:    previewImageURL,
   588  		messageType:        MessageTypeVideo,
   589  	}
   590  }
   591  
   592  // NewAudioMessage function
   593  func NewAudioMessage(originalContentURL string, duration int) *AudioMessage {
   594  	return &AudioMessage{
   595  		OriginalContentURL: originalContentURL,
   596  		Duration:           duration,
   597  		messageType:        MessageTypeAudio,
   598  	}
   599  }
   600  
   601  // NewLocationMessage function
   602  func NewLocationMessage(title, address string, latitude, longitude float64) *LocationMessage {
   603  	return &LocationMessage{
   604  		Title:       title,
   605  		Address:     address,
   606  		Latitude:    latitude,
   607  		Longitude:   longitude,
   608  		messageType: MessageTypeLocation,
   609  	}
   610  }
   611  
   612  // NewStickerMessage function
   613  func NewStickerMessage(packageID, stickerID string) *StickerMessage {
   614  	return &StickerMessage{
   615  		PackageID:   packageID,
   616  		StickerID:   stickerID,
   617  		messageType: MessageTypeSticker,
   618  	}
   619  }
   620  
   621  // NewTemplateMessage function
   622  func NewTemplateMessage(altText string, template Template) *TemplateMessage {
   623  	return &TemplateMessage{
   624  		AltText:     altText,
   625  		Template:    template,
   626  		messageType: MessageTypeTemplate,
   627  	}
   628  }
   629  
   630  // NewImagemapMessage function
   631  func NewImagemapMessage(baseURL, altText string, baseSize ImagemapBaseSize, actions ...ImagemapAction) *ImagemapMessage {
   632  	return &ImagemapMessage{
   633  		BaseURL:     baseURL,
   634  		AltText:     altText,
   635  		BaseSize:    baseSize,
   636  		Actions:     actions,
   637  		messageType: MessageTypeImagemap,
   638  	}
   639  }
   640  
   641  // NewFlexMessage function
   642  func NewFlexMessage(altText string, contents FlexContainer) *FlexMessage {
   643  	return &FlexMessage{
   644  		AltText:     altText,
   645  		Contents:    contents,
   646  		messageType: MessageTypeFlex,
   647  	}
   648  }