Search code examples
phplaravelbotman

Laravel Botman issue - Can't call functions from the same class after nesting inside botman class


I am trying to use the native buttons and questions feature in Botman inside laravel, however i am struggling to understand how to chain functions without using static functions. I have it working where everything is a static function, however i want to use all the information gathered to send an email.

    // initialization function
     public function handle()
     {
         $botman->hears("{message}", function($botman, $message) {
                $this->selectHelpQuery($botman);
         });
     }

     // ask question function 
     public function selectHelpQuery($botman)
     {
         $question = Question::create("How can i help you, would you like to know about the following:")
                ->fallback("Unable to help at this time, please try again later")
                ->callbackId("choose_query")
                ->addButtons([
                    Button::create("button1")->value("val1"),
                    Button::create("button2")->value("val2"),
                ]);
          $botman->ask($question, function (Answer $answer, $botman) {
              // Detect if button was clicked:
              if ($answer->isInteractiveMessageReply()) {
                  if($answer->getValue() == "val1") 
                  {
                      $this->contactFollowUp($botman); //** not working
                  } else {
                      $this->contactNoFollowUp($botman); //** not working
                  }
              }
          });
      }

// other functions.....

However without declaring the contactFollowUp() function as static and accessing it by using the classname BotManController::contactFollowUp($botman) However if i do this i have issues with accessing and setting data for use in other functions. Specifically i get a Method contactFollowUp does not exist error.


Solution

  • So, after finding some github code examples i have managed to work out the issue. It is to do with the way the botman framework is structured. To achive linked conversations you have to use a function from the botman framework called startConversation() to envoke this you need to reference bot which is from the extended base class Conversation. So you will need an entry point and then the conversation you want to link to like so: *note you will need the default entry point of run() for each conversation.

    //BotManController.php
    <?php
    
        namespace App\Http\Controllers\Chatbot;
    
        use App\Http\Controllers\Controller;
        use BotMan\BotMan\BotMan;
        use Illuminate\Http\Request;
        use BotMan\BotMan\Messages\Incoming\Answer;
        use BotMan\BotMan\Messages\Outgoing\Actions\Button;
        use BotMan\BotMan\Messages\Outgoing\Question;
    
        class BotManController extends Controller
        {
            /**
             * start the conversation on intitlization
             */
            public function handle()
            {
                $botman = app("botman");
                $botman->hears("{message}", function($botman, $message) {
                    $botman->startConversation(new BotManStart);
                });
                $botman->listen();
            }
        }
    

    Then

    // BotManStart.php    
    <?php
    
        namespace App\Http\Controllers\Chatbot;
    
        use BotMan\BotMan\BotMan;
        use Illuminate\Http\Request;
        use BotMan\BotMan\Messages\Incoming\Answer;
        use BotMan\BotMan\Messages\Outgoing\Actions\Button;
        use BotMan\BotMan\Messages\Outgoing\Question;
        use BotMan\BotMan\Messages\Conversations\Conversation;
    
        class BotManStart extends Conversation
        {
            public function run()
            {
                $this->selectHelpQuery();
            }
    
            public function selectHelpQuery()
            {
                $question = Question::create("How can i help you, would you like to know about the following: ")
                    ->fallback("Unable to help at this time, please try again later")
                    ->callbackId("choose_query")
                    ->addButtons([
                        Button::create("Button 1")->value("button1"),
                        Button::create("Button 2")->value("button2"),
                    ]);
                $this->ask($question, function (Answer $answer) {
                    if ($answer->isInteractiveMessageReply()) {
                        switch ($answer->getValue()) {
                            case "button1":
                                $this->bot->startConversation(new BotManConversation1());
                                break;
                            case "button2":
                                $this->bot->startConversation(new BotManConversation2());
                                break;
                        }
                    }
                });
            }
        }