@startuml

namespace MessengerFramework {

  class Event {
    + stdClass rawData
    + String|null replyToken
    + String|null userId
    + String type
    + Array|null data
    + Array|null origin
  }

  note top of Event
    Event#typeについて
    Message.TextとMessage.File、Message.Location、Postback、Unsupportedの5種類
    Event#dataについて
    text、postback、locationのキーがイベントに合わせて作られる
  end note

  class MessengerBot {
    + FacebookBot|LineBot core
    + [Event:stdObject|null] getEvents()
    + addText(String message)
    + addTemplate(Array [String title, String description, String imageUrl, Array buttons])
    + addImage(String fileUrl, String previewUrl)
    + addVideo(String fileUrl, String previewUrl)
    + addAudio(String fileUrl, Int duration)
    + addButtons(String description, Array buttons)
    + addConfirm(String text, Array buttons)
    + addRawMessage(Array message)
    + bool push(String recipient)
    + bool reply(String replyToken)
    + stdClass getProfile(String userId)
    + [String:BinaryString] getFilesIn(Event message)
    + String getPlatform()
    + array getMessagePayload()
    + clearMessages()
    + string sendRawData(string $body)
  }

  note top of MessengerBot
    リクエストの検証処理(FacebookやLineからのリクエストかどうか)はgetEvents()内で行う
  end note

  class FacebookBot {
    + bool replyMessage(String to)
    + bool pushMessage(String to)
    + testSignature(String requestBody, String signature)
    + parseEvent(String requestBody)
    + stdClass getProfile(String userId)
    + [String:BinaryString] getFiles(Event event)
    + addText(String message)
    + addGeneric([String:String|Array])
    + addButton(String text, Array replies)
    + addImage(String url)
    + addVideo(String url)
    + addAudio(String url)
    + addRawMessage(Array message)
    + array getMessagePayloads()
    + clearMessages()
    + string sendRawData(string $body)
  }

  class LineBot {
    + bool replyMessage(String to)
    + bool pushMessage(String to)
    + testSignature(String requestBody, String signature)
    + parseEvent(String requestBody)
    + stdClass getProfile(String userId)
    + [String:BinaryString] getFiles(Event event)
    + addText(String url)
    + addCarousel([String:String|Array], String altText)
    + addButtons(String description, Array buttons, String|null title, Strin|null thumbnailUrl, String altText)
    + addConfirm(String text, Array buttons, String altText)
    + addImage(String url, String previewUrl)
    + addVideo(String url, String previewUrl)
    + addAudio(String url, Int duration)
    + addRawMessage(Array message)
    + array getMessagePayload()
    + clearMessages()
    + string sendRawData(string $body)
  }

  class Curl {
    + String post(String url, Array headers, Array bodyArray, Bool isJSON)
    + String get(String url, Array headers, Array aueryArray)
  }

  class Config {
    + String getPlatform()
    + String getFacebookAppSecret()
    + String getFacebookAccessToken()
    + String getLineChannelSecret()
    + String getLineAccessToken()
  }

}

' MessengerFramework内の関連

MessengerFramework.MessengerBot .d.> MessengerFramework.FacebookBot
MessengerFramework.MessengerBot .d.> MessengerFramework.LineBot
MessengerFramework.MessengerBot .l.> MessengerFramework.Curl
MessengerFramework.MessengerBot .l.> MessengerFramework.Event

MessengerFramework.FacebookBot *..> MessengerFramework.Curl

MessengerFramework.LineBot *..> MessengerFramework.Curl

@enduml
