From c5a13046ed42674099755ced8e282a9d05e98e25 Mon Sep 17 00:00:00 2001 From: Deon George Date: Thu, 24 Feb 2022 12:27:36 +1100 Subject: [PATCH] Added in HTTP interactive options messages and Controller --- .../InteractiveOptionsController.php | 42 +++++++++++++++++++ src/Http/Middleware/CheckRequest.php | 5 +-- src/Message.php | 3 +- src/Options/Base.php | 8 ++-- src/Options/Factory.php | 13 +++--- src/Options/InteractiveMessage.php | 5 +-- src/routes.php | 5 +++ 7 files changed, 65 insertions(+), 16 deletions(-) create mode 100644 src/Http/Controllers/InteractiveOptionsController.php diff --git a/src/Http/Controllers/InteractiveOptionsController.php b/src/Http/Controllers/InteractiveOptionsController.php new file mode 100644 index 0000000..9ba6c4d --- /dev/null +++ b/src/Http/Controllers/InteractiveOptionsController.php @@ -0,0 +1,42 @@ +payload,TRUE),TRUE)); + Log::debug(sprintf('%s:Firing Event [%s] and responding [%s]',static::LOGKEY,get_class($event),$event->respondNow)); + + if ($event->respondNow) { + if (! method_exists($event,'respond')) { + Log::alert(sprintf('%s:Cant respond to Event [%s], no respond method',static::LOGKEY,get_class($event)),['m'=>__METHOD__]); + + } else { + return ($x=$event->respond())->isEmpty() ? NULL : $x; + } + + } else { + event($event); + + Log::info(sprintf('%s:Dispatched Event [%s]',static::LOGKEY,get_class($event)),['m'=>__METHOD__]); + return response('IO Event Processed',200); + } + } +} \ No newline at end of file diff --git a/src/Http/Middleware/CheckRequest.php b/src/Http/Middleware/CheckRequest.php index 60024fb..fbcf310 100644 --- a/src/Http/Middleware/CheckRequest.php +++ b/src/Http/Middleware/CheckRequest.php @@ -8,8 +8,7 @@ use Illuminate\Support\Facades\Log; use Slack\Client\Payload; use Slack\Event\Factory as EventFactory; use Slack\Interactive\Factory as InteractiveFactory; - -use App\Slack\Options\Factory as OptionsFactory; +use Slack\Options\Factory as OptionsFactory; class CheckRequest { @@ -47,7 +46,7 @@ class CheckRequest break; case 'api/imsgopt': - $event = OptionsFactory::make($request); + $event = OptionsFactory::make(new Payload(json_decode($request->payload,TRUE),TRUE)); break; case 'api/imsg': diff --git a/src/Message.php b/src/Message.php index ac278e2..aa46646 100644 --- a/src/Message.php +++ b/src/Message.php @@ -298,11 +298,12 @@ final class Message extends BlockKit * * @param Collection $collection * @return Message - * @todo - Check this is a valid option */ public function option_groups(Collection $collection): self { $this->option_groups = $collection; + + return $this; } /** diff --git a/src/Options/Base.php b/src/Options/Base.php index 642b0c3..1b0d753 100644 --- a/src/Options/Base.php +++ b/src/Options/Base.php @@ -9,14 +9,16 @@ use Slack\Base as SlackBase; abstract class Base extends SlackBase { // Does the event respond with a reply to the HTTP request, or via a post with a trigger + // Child class should have a respond() function. + // (There should be a local implementation of the child class should respondNow = TRUE) public $respondNow = TRUE; - public function __construct(Request $request) + public function __construct(array $request) { Log::info(sprintf('SOb:Slack INTERACTIVE MESSAGE Initialised [%s]',get_class($this)),['m'=>__METHOD__]); // Our data is in a payload value - $this->_data = json_decode($request->input('payload')); + parent::__construct($request); } /** @@ -48,4 +50,4 @@ abstract class Base extends SlackBase return object_get($this->_data,$key); } } -} +} \ No newline at end of file diff --git a/src/Options/Factory.php b/src/Options/Factory.php index fb01893..7059bcb 100644 --- a/src/Options/Factory.php +++ b/src/Options/Factory.php @@ -6,6 +6,8 @@ use Illuminate\Http\Request; use Illuminate\Support\Arr; use Illuminate\Support\Facades\App; use Illuminate\Support\Facades\Log; +use Slack\Client\Payload; +use Slack\Interactive\Unknown; class Factory { private const LOGKEY = 'SOf'; @@ -14,7 +16,7 @@ class Factory { * @var array event type to event class mapping */ public const map = [ - 'interactive_message'=>InteractiveMessage::class, + //'interactive_message' => InteractiveMessage::class, ]; /** @@ -24,9 +26,9 @@ class Factory { * @param Request $request * @return Base */ - public static function create(string $type,Request $request) + public static function create(string $type,array $request) { - $class = Arr::get(self::map,$type,Unknown::class); + $class = Arr::get(config('slack.options',self::map),$type,Unknown::class); Log::debug(sprintf('%s:Working out Interactive Options Event Class for [%s] as [%s]',static::LOGKEY,$type,$class),['m'=>__METHOD__]); if (App::environment() == 'dev') @@ -35,16 +37,15 @@ class Factory { return new $class($request); } - public static function make(Request $request): Base + public static function make(Payload $request): Base { // During the life of the event, this method is called twice - once during Middleware processing, and finally by the Controller. static $o = NULL; static $or = NULL; if (! $o OR ($or != $request)) { - $data = json_decode($request->input('payload')); $or = $request; - $o = self::create($data->type,$request); + $o = self::create(Arr::get($request->getData(),'payload.type'),Arr::get($request->getData(),'payload')); } return $o; diff --git a/src/Options/InteractiveMessage.php b/src/Options/InteractiveMessage.php index b0e4f3e..342f071 100644 --- a/src/Options/InteractiveMessage.php +++ b/src/Options/InteractiveMessage.php @@ -34,7 +34,7 @@ use Slack\Message; */ class InteractiveMessage extends Base { - private const LOGKEY = 'OIM'; + protected const LOGKEY = 'OIM'; public function __get($key) { @@ -69,5 +69,4 @@ class InteractiveMessage extends Base return (new Message)->blank(); } - -} +} \ No newline at end of file diff --git a/src/routes.php b/src/routes.php index 42b6e62..08cfab2 100644 --- a/src/routes.php +++ b/src/routes.php @@ -33,4 +33,9 @@ app('router') 'uses' => 'InteractiveMessageController@fire', 'as' => 'imsg', ]); + + $router->post('imsgopt', [ + 'uses' => 'InteractiveOptionsController@fire', + 'as' => 'imsgopt', + ]); }); \ No newline at end of file