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 }