Skip to content

Commit

Permalink
WIP base for backend presence client events, to allow bots to type an…
Browse files Browse the repository at this point in the history
…d more. Relocated Channel classes to sub directory.
  • Loading branch information
RTippin committed Jul 6, 2021
1 parent 34182be commit 1b5ee7d
Show file tree
Hide file tree
Showing 10 changed files with 483 additions and 6 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?php

namespace RTippin\Messenger\Broadcasting;
namespace RTippin\Messenger\Broadcasting\Channels;

use Illuminate\Auth\Access\AuthorizationException;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?php

namespace RTippin\Messenger\Broadcasting;
namespace RTippin\Messenger\Broadcasting\Channels;

use RTippin\Messenger\Messenger;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?php

namespace RTippin\Messenger\Broadcasting;
namespace RTippin\Messenger\Broadcasting\Channels;

use Illuminate\Auth\Access\AuthorizationException;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
Expand Down
18 changes: 18 additions & 0 deletions src/Broadcasting/ClientEvents/Read.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?php

namespace RTippin\Messenger\Broadcasting\ClientEvents;

use RTippin\Messenger\Broadcasting\MessengerBroadcast;

class Read extends MessengerBroadcast
{
/**
* The event's broadcast name.
*
* @return string
*/
public function broadcastAs(): string
{
return 'client-read';
}
}
18 changes: 18 additions & 0 deletions src/Broadcasting/ClientEvents/StopTyping.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?php

namespace RTippin\Messenger\Broadcasting\ClientEvents;

use RTippin\Messenger\Broadcasting\MessengerBroadcast;

class StopTyping extends MessengerBroadcast
{
/**
* The event's broadcast name.
*
* @return string
*/
public function broadcastAs(): string
{
return 'client-stop-typing';
}
}
18 changes: 18 additions & 0 deletions src/Broadcasting/ClientEvents/Typing.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?php

namespace RTippin\Messenger\Broadcasting\ClientEvents;

use RTippin\Messenger\Broadcasting\MessengerBroadcast;

class Typing extends MessengerBroadcast
{
/**
* The event's broadcast name.
*
* @return string
*/
public function broadcastAs(): string
{
return 'client-typing';
}
}
6 changes: 3 additions & 3 deletions src/ChannelMap.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@
use Illuminate\Contracts\Broadcasting\Broadcaster;
use Illuminate\Contracts\Container\BindingResolutionException;
use Illuminate\Contracts\Foundation\Application;
use RTippin\Messenger\Broadcasting\CallChannel;
use RTippin\Messenger\Broadcasting\ProviderChannel;
use RTippin\Messenger\Broadcasting\ThreadChannel;
use RTippin\Messenger\Broadcasting\Channels\CallChannel;
use RTippin\Messenger\Broadcasting\Channels\ProviderChannel;
use RTippin\Messenger\Broadcasting\Channels\ThreadChannel;

/**
* @property-read Application $app
Expand Down
34 changes: 34 additions & 0 deletions src/Support/Helpers.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
use Exception;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Carbon;
use ReflectionClass;
use ReflectionException;

class Helpers
{
Expand Down Expand Up @@ -61,4 +63,36 @@ public static function SchemaMorphType(string $column, Blueprint $table): void
$table->numericMorphs($column);
}
}

/**
* @param string $abstract
* @param string $contract
* @return bool
*/
public static function checkImplementsInterface(string $abstract, string $contract): bool
{
try {
return (new ReflectionClass($abstract))->implementsInterface($contract);
} catch (ReflectionException $e) {
//skip
}

return false;
}

/**
* @param string $abstract
* @param string $parent
* @return bool
*/
public static function checkIsSubclassOf(string $abstract, string $parent): bool
{
try {
return (new ReflectionClass($abstract))->isSubclassOf($parent);
} catch (ReflectionException $e) {
//skip
}

return false;
}
}
189 changes: 189 additions & 0 deletions src/Support/PresenceEvents.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,189 @@
<?php

namespace RTippin\Messenger\Support;

use Closure;
use InvalidArgumentException;
use RTippin\Messenger\Broadcasting\ClientEvents\Read;
use RTippin\Messenger\Broadcasting\ClientEvents\StopTyping;
use RTippin\Messenger\Broadcasting\ClientEvents\Typing;
use RTippin\Messenger\Broadcasting\MessengerBroadcast;
use RTippin\Messenger\Contracts\MessengerProvider;
use RTippin\Messenger\Facades\Messenger;
use RTippin\Messenger\Models\Message;

class PresenceEvents
{
/**
* @var string|MessengerBroadcast
*/
private static string $typingClass = Typing::class;

/**
* @var string|MessengerBroadcast
*/
private static string $stopTypingClass = StopTyping::class;

/**
* @var string|MessengerBroadcast
*/
private static string $readClass = Read::class;

/**
* @var Closure|null
*/
private static ?Closure $typingClosure = null;

/**
* @var Closure|null
*/
private static ?Closure $stopTypingClosure = null;

/**
* @var Closure|null
*/
private static ?Closure $readClosure = null;

/**
* @param Closure $typing
*/
public static function setTypingClosure(Closure $typing): void
{
self::$typingClosure = $typing;
}

/**
* @param string $abstractTyping
* @throws InvalidArgumentException
*/
public static function setTypingClass(string $abstractTyping): void
{
if (! Helpers::checkIsSubclassOf($abstractTyping, MessengerBroadcast::class)) {
throw new InvalidArgumentException("$abstractTyping must extend our base ".MessengerBroadcast::class);
}

self::$typingClass = $abstractTyping;
}

/**
* @return string
*/
public static function getTypingClass(): string
{
return self::$typingClass;
}

/**
* @param Closure $stopTyping
*/
public static function setStopTypingClosure(Closure $stopTyping): void
{
self::$stopTypingClosure = $stopTyping;
}

/**
* @param string $abstractStopTyping
* @throws InvalidArgumentException
*/
public static function setStopTypingClass(string $abstractStopTyping): void
{
if (! Helpers::checkIsSubclassOf($abstractStopTyping, MessengerBroadcast::class)) {
throw new InvalidArgumentException("$abstractStopTyping must extend our base ".MessengerBroadcast::class);
}

self::$stopTypingClass = $abstractStopTyping;
}

/**
* @return string
*/
public static function getStopTypingClass(): string
{
return self::$stopTypingClass;
}

/**
* @param Closure $read
*/
public static function setReadClosure(Closure $read): void
{
self::$readClosure = $read;
}

/**
* @param string $abstractRead
* @throws InvalidArgumentException
*/
public static function setReadClass(string $abstractRead): void
{
if (! Helpers::checkIsSubclassOf($abstractRead, MessengerBroadcast::class)) {
throw new InvalidArgumentException("$abstractRead must extend our base ".MessengerBroadcast::class);
}

self::$readClass = $abstractRead;
}

/**
* @return string
*/
public static function getReadClass(): string
{
return self::$readClass;
}

/**
* @param MessengerProvider $provider
* @return array
*/
public static function makeTypingEvent(MessengerProvider $provider): array
{
if (is_null(self::$typingClosure)) {
return [
'provider_id' => $provider->getKey(),
'provider_alias' => Messenger::findProviderAlias($provider),
'name' => $provider->getProviderName(),
'avatar' => $provider->getProviderAvatarRoute(),
];
}

return (self::$typingClosure)($provider);
}

/**
* @param MessengerProvider $provider
* @return array
*/
public static function makeStopTypingEvent(MessengerProvider $provider): array
{
if (is_null(self::$stopTypingClosure)) {
return [
'provider_id' => $provider->getKey(),
'provider_alias' => Messenger::findProviderAlias($provider),
'name' => $provider->getProviderName(),
'avatar' => $provider->getProviderAvatarRoute(),
];
}

return (self::$stopTypingClosure)($provider);
}

/**
* @param MessengerProvider $provider
* @param Message $message
* @return array
*/
public static function makeReadEvent(MessengerProvider $provider, Message $message): array
{
if (is_null(self::$readClosure)) {
return [
'provider_id' => $provider->getKey(),
'provider_alias' => Messenger::findProviderAlias($provider),
'name' => $provider->getProviderName(),
'avatar' => $provider->getProviderAvatarRoute(),
'message_id' => $message->id,
];
}

return (self::$readClosure)($provider, $message);
}
}
Loading

0 comments on commit 1b5ee7d

Please sign in to comment.