Private
Public Access
1
0
Files
MineSeeker/src/Mine/SeekerBundle/Topic/AcmeTopic.php

103 lines
3.1 KiB
PHP
Raw Normal View History

<?php
namespace Mine\SeekerBundle\Topic;
2016-10-25 11:19:50 +02:00
use Doctrine\ORM\EntityManager;
use Gos\Bundle\WebSocketBundle\Client\ClientManipulatorInterface;
use Gos\Bundle\WebSocketBundle\Topic\TopicInterface;
use Gos\Bundle\WebSocketBundle\Router\WampRequest;
use Ratchet\ConnectionInterface;
use Ratchet\Wamp\Topic;
class AcmeTopic implements TopicInterface
{
/** @var ClientManipulatorInterface */
protected $clientManipulator;
2016-10-25 11:19:50 +02:00
/** @var EntityManager */
protected $entityManager;
/**
* AcmeTopic constructor.
*
* @param $clientManipulator ClientManipulatorInterface
2016-10-25 11:19:50 +02:00
* @param EntityManager $entityManager
*/
2016-10-25 11:19:50 +02:00
public function __construct(ClientManipulatorInterface $clientManipulator, EntityManager $entityManager)
{
$this->clientManipulator = $clientManipulator;
2016-10-25 11:19:50 +02:00
$this->entityManager = $entityManager;
}
/**
* 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)
{
/** 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();
$topic->broadcast([
2016-10-25 11:19:50 +02:00
'userTopicId' => $connection->resourceId,
'channel' => $topic->getId(),
'user' => $userName,
'userCnt' => $topic->count()
]);
}
/**
* 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)
{
/** this will broadcast the message to ALL subscribers of this topic. */
$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();
$topic->broadcast([
2016-10-25 11:19:50 +02:00
'userTopicId' => $connection->resourceId,
'channel' => $topic->getId(),
'user' => $userName,
'userCnt' => $topic->count(),
'data' => $event
]);
}
/**
* Like RPC is will use to prefix the channel
* @return string
*/
public function getName()
{
return 'acme.topic';
}
}