Бот для покупки товаров
Идея была сделать простого бота для клиентов проекта чтобы не зависеть от сторонних библиотек, 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 помогу сделать такого же.