2016-10-18 15:58:53 +02:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
namespace Mine\SeekerBundle\Topic;
|
|
|
|
|
|
2016-10-25 11:19:50 +02:00
|
|
|
use Doctrine\ORM\EntityManager;
|
2016-10-19 13:27:55 +02:00
|
|
|
use Gos\Bundle\WebSocketBundle\Client\ClientManipulatorInterface;
|
2016-10-18 15:58:53 +02:00
|
|
|
use Gos\Bundle\WebSocketBundle\Topic\TopicInterface;
|
|
|
|
|
use Gos\Bundle\WebSocketBundle\Router\WampRequest;
|
|
|
|
|
use Ratchet\ConnectionInterface;
|
|
|
|
|
use Ratchet\Wamp\Topic;
|
|
|
|
|
|
|
|
|
|
class AcmeTopic implements TopicInterface
|
|
|
|
|
{
|
2016-10-19 13:27:55 +02:00
|
|
|
/** @var ClientManipulatorInterface */
|
|
|
|
|
protected $clientManipulator;
|
|
|
|
|
|
2016-10-25 11:19:50 +02:00
|
|
|
/** @var EntityManager */
|
|
|
|
|
protected $entityManager;
|
|
|
|
|
|
2016-10-19 13:27:55 +02:00
|
|
|
/**
|
|
|
|
|
* AcmeTopic constructor.
|
|
|
|
|
*
|
|
|
|
|
* @param $clientManipulator ClientManipulatorInterface
|
2016-10-25 11:19:50 +02:00
|
|
|
* @param EntityManager $entityManager
|
2016-10-19 13:27:55 +02:00
|
|
|
*/
|
2016-10-25 11:19:50 +02:00
|
|
|
public function __construct(ClientManipulatorInterface $clientManipulator, EntityManager $entityManager)
|
2016-10-19 13:27:55 +02:00
|
|
|
{
|
|
|
|
|
$this->clientManipulator = $clientManipulator;
|
2016-10-25 11:19:50 +02:00
|
|
|
$this->entityManager = $entityManager;
|
2016-10-19 13:27:55 +02:00
|
|
|
}
|
2016-10-18 15:58:53 +02:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This will receive any Subscription requests for this topic.
|
|
|
|
|
*
|
|
|
|
|
* @param ConnectionInterface $connection
|
|
|
|
|
* @param Topic $topic
|
|
|
|
|
* @param WampRequest $request
|
|
|
|
|
* @return void
|
|
|
|
|
*/
|
|
|
|
|
public function onSubscribe(ConnectionInterface $connection, Topic $topic, WampRequest $request)
|
|
|
|
|
{
|
2016-10-19 13:27:55 +02:00
|
|
|
/** this will broadcast the message to ALL subscribers of this topic. */
|
|
|
|
|
$user = $this->clientManipulator->getClient($connection);
|
2016-10-25 11:19:50 +02:00
|
|
|
$userName = is_string($user) ? $user : $user->getUsername();
|
|
|
|
|
|
2016-10-31 18:07:37 +01:00
|
|
|
/** if more user wants to connect than 2 to one channel */
|
|
|
|
|
if ($topic->count() > 2) {
|
|
|
|
|
$topic->remove($connection);
|
|
|
|
|
} else {
|
|
|
|
|
$topic->broadcast([
|
|
|
|
|
'userTopicId' => $connection->resourceId,
|
|
|
|
|
'channel' => $topic->getId(),
|
|
|
|
|
'user' => $userName,
|
|
|
|
|
'userCnt' => $topic->count()
|
|
|
|
|
]);
|
|
|
|
|
}
|
2016-10-18 15:58:53 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This will receive any UnSubscription requests for this topic.
|
|
|
|
|
*
|
|
|
|
|
* @param ConnectionInterface $connection
|
|
|
|
|
* @param Topic $topic
|
|
|
|
|
* @param WampRequest $request
|
|
|
|
|
* @return void
|
|
|
|
|
*/
|
|
|
|
|
public function onUnSubscribe(ConnectionInterface $connection, Topic $topic, WampRequest $request)
|
|
|
|
|
{
|
2016-10-19 13:27:55 +02:00
|
|
|
/** this will broadcast the message to ALL subscribers of this topic. */
|
2016-10-18 15:58:53 +02:00
|
|
|
$topic->broadcast(['msg' => $connection->resourceId . " has left " . $topic->getId()]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This will receive any Publish requests for this topic.
|
|
|
|
|
*
|
|
|
|
|
* @param ConnectionInterface $connection
|
|
|
|
|
* @param Topic $topic
|
|
|
|
|
* @param WampRequest $request
|
|
|
|
|
* @param $event
|
|
|
|
|
* @param array $exclude
|
|
|
|
|
* @param array $eligible
|
|
|
|
|
* @return mixed|void
|
|
|
|
|
* @internal param Topic $Topic
|
|
|
|
|
* @internal param array $eligibles
|
|
|
|
|
*/
|
|
|
|
|
public function onPublish(ConnectionInterface $connection, Topic $topic, WampRequest $request, $event, array $exclude, array $eligible)
|
|
|
|
|
{
|
2016-10-25 11:19:50 +02:00
|
|
|
$user = $this->clientManipulator->getClient($connection);
|
|
|
|
|
$userName = is_string($user) ? $user : $user->getUsername();
|
|
|
|
|
|
2016-10-18 15:58:53 +02:00
|
|
|
$topic->broadcast([
|
2016-10-25 11:19:50 +02:00
|
|
|
'userTopicId' => $connection->resourceId,
|
|
|
|
|
'channel' => $topic->getId(),
|
|
|
|
|
'user' => $userName,
|
|
|
|
|
'userCnt' => $topic->count(),
|
|
|
|
|
'data' => $event
|
2016-10-18 15:58:53 +02:00
|
|
|
]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Like RPC is will use to prefix the channel
|
|
|
|
|
* @return string
|
|
|
|
|
*/
|
|
|
|
|
public function getName()
|
|
|
|
|
{
|
|
|
|
|
return 'acme.topic';
|
|
|
|
|
}
|
|
|
|
|
}
|