@startuml

namespace MessengerFramework {

  interface "Bot" as IBot {
    + replyMessage(String to)
    + pushMessage(String to)
    + testSignature(String requestBody, String signature)
    + parseEvent(String requestBody)
    + getProfile(String userId)
  }

  class Event {
    + [Key => Value] rawData
    + String replyToken
    + String userId
    + String type
    + String|null text
    + [Key => Value]|null postbackData
  }

  note top of Event
    Event#typeについて
    Message.TextとMessage.File、Postbackの3種類
  end note

  class MessengerBot {
    - [MessageBuilder] messagesWillSent
    + Bot core
    + [Event:stdObject|null] getEvents()
    + addText(String message)
    + addTemplate(Array [String title, String description, String imageUrl, Array buttons])
    + addImage(String fileUrl, String|null previewUrl)
    + addVideo(String fileUrl, String|null previewUrl)
    + addAudio(String fileUrl, Int|null duration)
    + [String|Exception] push(String recipient)
    + [String|Exception] reply(String replyToken)
    + [String:String] getProfile(String userId)
    + [String:BinaryString] getFilesIn(Event message)
    - notifyAlive()
    - validateRequest()
  }

  note top of MessengerBot
    複数送信する予定のメッセージの内容messagesWillSentを
    ここで持たせてreplyMessagesやpushMessagesが実際に呼ばれた時に
    個々の実装に依って(LineだとMultiMessageBuilder、Facebookならリクエスト複数)送信する

    設定ファイル(項目の説明を書いておく)から
    LineやFacebookにあったトークンを読み込みBotインタフェースのクラスとCurlを生成する

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

  namespace FacebookBot {

    class FacebookBot {
      + [String:BinaryString] getFiles(stdClass rawEvent)
      + setText(String message)
      + setGeneric([String:String|Array])
      + setImage(String url)
      + setVideo(String url)
      + setAudio(String url)
    }

  }

  namespace LineBot {

    class LineBot {
      + [String:BinaryString] getFile(stdClass rawEvent)
      + addText(String url)
      + addCarousel([String:String|Array])
      + addImage(String url, String previewUrl)
      + addVideo(String url, String previewUrl)
      + addAudio(String url, Int duration)
    }

  }

  namespace HttpClient {

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

  }

}

' MessengerFramework内の関連

MessengerFramework.MessengerBot *.l.> MessengerFramework.IBot
MessengerFramework.MessengerBot .d.> MessengerFramework.FacebookBot.FacebookBot
MessengerFramework.MessengerBot .d.> MessengerFramework.LineBot.LineBot
MessengerFramework.MessengerBot .l.> MessengerFramework.HttpClient.Curl
MessengerFramework.MessengerBot .l.> MessengerFramework.Event

MessengerFramework.FacebookBot.FacebookBot .u.|> MessengerFramework.IBot
MessengerFramework.FacebookBot.FacebookBot *..> MessengerFramework.HttpClient.Curl

MessengerFramework.LineBot.LineBot .u.|> MessengerFramework.IBot
MessengerFramework.LineBot.LineBot *..> MessengerFramework.HttpClient.Curl

@enduml
