Added in HTTP interactive options messages and Controller
This commit is contained in:
parent
29d3591125
commit
c5a13046ed
42
src/Http/Controllers/InteractiveOptionsController.php
Normal file
42
src/Http/Controllers/InteractiveOptionsController.php
Normal file
@ -0,0 +1,42 @@
|
||||
<?php
|
||||
|
||||
namespace Slack\Http\Controllers;
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Slack\Client\Payload;
|
||||
use Slack\Options\Factory as SlackOptionsFactory;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
|
||||
class InteractiveOptionsController extends Controller
|
||||
{
|
||||
private const LOGKEY = 'CIO';
|
||||
|
||||
/**
|
||||
* Fire slack event
|
||||
*
|
||||
* @param Request $request
|
||||
* @return \Illuminate\Http\Response|\Laravel\Lumen\Http\ResponseFactory
|
||||
*/
|
||||
public function fire(Request $request)
|
||||
{
|
||||
$event = SlackOptionsFactory::make(new Payload(json_decode($request->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);
|
||||
}
|
||||
}
|
||||
}
|
@ -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':
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -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;
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -33,4 +33,9 @@ app('router')
|
||||
'uses' => 'InteractiveMessageController@fire',
|
||||
'as' => 'imsg',
|
||||
]);
|
||||
|
||||
$router->post('imsgopt', [
|
||||
'uses' => 'InteractiveOptionsController@fire',
|
||||
'as' => 'imsgopt',
|
||||
]);
|
||||
});
|
Loading…
Reference in New Issue
Block a user