Бот для покупки товаров



Идея была сделать простого бота для клиентов проекта чтобы не зависеть от сторонних библиотек, Livewire это замечательный инструмент который упрощает работу в написании кастомных решений, после каждого действия происходит перезагрузка payload компонента, за счёт этого мы всегда получаем обновлённые state с которыми можем продолжать работать не перезагружая компонент вручную, конечно есть и свои недостатки, но всё же плюсов в нём больше.


Итак, приступим.


Для начала необходимо создать компонент php artisan make:livewire Dashboard\Customer\ChatBuy назвать можно как душе угодно


Далее перейдя в компонент добавим:


public $messages;

// Монтируем изначальные данные

public function mount()
{
    $this->menu();
}

// Создаем меню бота

public function menu()
{
    $this->messages = collect()->push([
        'avatar'     => asset('images/robot-chat.png'),
        'type'       => 'new_message',
        'role'       => 'bot',
        'username'   => 'Бот',
        'content'    => 'Какой материал вас интересует? ',
        'delay'      => 100,
        'created_at' => now()->toDateTimeString(),
        'actions'    => [
            'video'    => '<button wire:click="videos" wire:loading.attr="disabled" class="d-block btn btn-sm btn-outline-primary mb-2 w-100"><i class="fal fa-tv-alt"></i> Видеоматериалы</button>',
            'pdf'      => '<button wire:click="pdfs" wire:loading.attr="disabled" class="d-block btn btn-sm btn-outline-danger mb-2 w-100"><i class="fal fa-file-signature"></i> PDF материалы</button>',
        ],
        'feature'    => [
            'isDate' => false
        ]
    ]);
}

public function videos()
{
    $this->messages->where('type', '=', 'new_message')->each(function ($item, $i) {
        $this->messages->forget($i);
    });

    $this->type = 'video';

    $this->messages->push([
        'avatar'        => asset('images/robot-chat.png'),
        'type'          => 'reply_action',
        'role'          => 'user',
        'username'      => 'Бот',
        'content'       => 'Вот материал который на данный момент есть в продаже по запросу видеоматериалы, что-бы выбрать нажмите на него',
        'delay'         => 100,
        'created_at'    => now()->toDateTimeString(),
        'type_material' => 'video',
        'materials'     => (new VideoRepository())->getAll(),
        'class'         => 'btn btn-sm btn-outline-primary mb-2',
        'actions'       => [
            'other' => '<button wire:click="other" wire:loading.attr="disabled" class="d-block btn btn-sm btn-outline-primary mb-2 w-100"><i class="fal fa-network-wired"></i> Выбрать другие материалы</button>',
            'pay'   => '<button wire:click="pay" wire:loading.attr="disabled" class="d-block btn btn-sm btn-success mb-2 w-100"><i class="fal fa-ruble-sign"></i> Оплатить </button>',
            'clear' => '<button wire:click="clearSelect" wire:loading.attr="disabled" class="d-block btn btn-sm btn-outline-dark mb-2 w-100"><i class="fal fa-trash-alt"></i> Очистить</button>',
        ],
        'feature'       => [
            'getTotal' => true,
            'isDate'   => true
        ]
    ]);
}

public function pdfs()
{
    $this->messages->where('type', '=', 'new_message')->each(function ($item, $i) {
        $this->messages->forget($i);
    });

    $this->type = 'pdf';

    $this->messages->push([
        'avatar'        => asset('images/robot-chat.png'),
        'type'          => 'reply_action',
        'role'          => 'user',
        'username'      => 'Бот',
        'content'       => 'Вот материал который на данный момент есть в продаже по запросу PDF, что-бы выбрать нажмите на него',
        'delay'         => 100,
        'created_at'    => now()->toDateTimeString(),
        'type_material' => 'pdf',
        'materials'     => (new PdfRepository())->getAll(),
        'class'         => 'btn btn-sm btn-outline-danger mb-2',
        'actions'       => [
            'other' => '<button wire:click="other" wire:loading.attr="disabled" class="d-block btn btn-sm btn-outline-primary mb-2 w-100"><i class="fal fa-network-wired"></i> Выбрать другие материалы</button>',
            'pay'   => '<button wire:click="pay" wire:loading.attr="disabled" class="d-block btn btn-sm btn-success mb-2 w-100"><i class="fal fa-ruble-sign"></i> Оплатить </button>',
            'clear' => '<button wire:click="clearSelect" wire:loading.attr="disabled" class="d-block btn btn-sm btn-outline-dark mb-2 w-100"><i class="fal fa-trash-alt"></i> Очистить</button>',
        ],
        'feature'       => [
            'getTotal' => true,
            'isDate'   => true
        ]
    ]);
}

// Данный метод отвечает за отрисовку повторного меню

public function other()
{
    $this->menu();
}

// Процесс оплы, действия, или на ваше усмотрение, в моём случае это процесс оплаты

public function pay()
{
   
      $this->messages->each(function ($item, $i) {
          $this->messages->forget($i);
      });

      $this->messages->push([
          'avatar'     => asset('images/robot-chat.png'),
          'type'       => 'reply_action',
          'role'       => 'bot',
          'username'   => 'Бот',
          'content'    => 'Не удалось оплатить, причина в том что в вашей корзине нет добавленных товаров, пожалуйста выберите товары и попробуйте снова.',
          'delay'      => 100,
          'created_at' => now()->toDateTimeString(),
          'class'      => 'btn btn-sm btn-outline-primary mb-2',
          'actions'    => [
              'other' => '<button wire:click="other" class="d-block btn btn-sm btn-outline-primary mb-2 w-100"><i class="fal fa-redo"></i> Повторить попытку</button>',
          ],
          'feature'    => [
              'isDate' => false
          ]
      ]);

}


Вот такой не сложный бот, если кому интересно пишите @UNIQDEVELOPER помогу сделать такого же.

Заказать сайт
любой сложности