vendor/botman/botman/src/Commands/ConversationManager.php line 85

Open in your IDE?
  1. <?php
  2. namespace BotMan\BotMan\Commands;
  3. use BotMan\BotMan\Interfaces\DriverInterface;
  4. use BotMan\BotMan\Messages\Attachments\Audio;
  5. use BotMan\BotMan\Messages\Attachments\Contact;
  6. use BotMan\BotMan\Messages\Attachments\File;
  7. use BotMan\BotMan\Messages\Attachments\Image;
  8. use BotMan\BotMan\Messages\Attachments\Location;
  9. use BotMan\BotMan\Messages\Attachments\Video;
  10. use BotMan\BotMan\Messages\Incoming\Answer;
  11. use BotMan\BotMan\Messages\Incoming\IncomingMessage;
  12. use BotMan\BotMan\Messages\Matcher;
  13. use BotMan\BotMan\Messages\Matching\MatchingMessage;
  14. use BotMan\BotMan\Middleware\MiddlewareManager;
  15. use Illuminate\Support\Collection;
  16. class ConversationManager
  17. {
  18. protected $matcher;
  19. public function __construct(?Matcher $matcher = null)
  20. {
  21. $this->matcher = $matcher ?? new Matcher();
  22. }
  23. /**
  24. * Messages to listen to.
  25. * @var Command[]
  26. */
  27. protected $listenTo = [];
  28. public function listenTo(Command $command)
  29. {
  30. $this->listenTo[] = $command;
  31. }
  32. /**
  33. * Add additional data (image,video,audio,location,files) data to
  34. * callable parameters.
  35. *
  36. * @param IncomingMessage $message
  37. * @param array $parameters
  38. * @return array
  39. */
  40. public function addDataParameters(IncomingMessage $message, array $parameters)
  41. {
  42. $messageText = $message->getText();
  43. if ($messageText === Image::PATTERN) {
  44. $parameters[] = $message->getImages();
  45. } elseif ($messageText === Video::PATTERN) {
  46. $parameters[] = $message->getVideos();
  47. } elseif ($messageText === Audio::PATTERN) {
  48. $parameters[] = $message->getAudio();
  49. } elseif ($messageText === Location::PATTERN) {
  50. $parameters[] = $message->getLocation();
  51. } elseif ($messageText === Contact::PATTERN) {
  52. $parameters[] = $message->getContact();
  53. } elseif ($messageText === File::PATTERN) {
  54. $parameters[] = $message->getFiles();
  55. }
  56. return $parameters;
  57. }
  58. /**
  59. * @param IncomingMessage[] $messages
  60. * @param MiddlewareManager $middleware
  61. * @param Answer $answer
  62. * @param DriverInterface $driver
  63. * @param bool $withReceivedMiddleware
  64. * @return array|MatchingMessage[]
  65. */
  66. public function getMatchingMessages($messages, MiddlewareManager $middleware, Answer $answer, DriverInterface $driver, $withReceivedMiddleware = true): array
  67. {
  68. $messages = Collection::make($messages)->reject(function (IncomingMessage $message) {
  69. return $message->isFromBot();
  70. });
  71. $matchingMessages = [];
  72. foreach ($messages as $message) {
  73. if ($withReceivedMiddleware) {
  74. $message = $middleware->applyMiddleware('received', $message);
  75. }
  76. foreach ($this->listenTo as $command) {
  77. if ($this->matcher->isMessageMatching($message, $answer, $command, $driver, $middleware->matching())) {
  78. $matchingMessages[] = new MatchingMessage($command, $message, $this->matcher->getMatches());
  79. }
  80. }
  81. }
  82. return $matchingMessages;
  83. }
  84. }