atcheck/app/Http/Controllers/WebSocketController.php

76 lines
3.1 KiB
PHP

<?php
namespace App\Http\Controllers;
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
class WebSocketController extends Controller implements MessageComponentInterface{
private $connections = [];
/**
* When a new connection is opened it will be passed to this method
* @param ConnectionInterface $conn The socket/connection that just connected to your application
* @throws \Exception
*/
function onOpen(ConnectionInterface $conn){
$this->connections[$conn->resourceId] = compact('conn') + ['user_id' => null];
}
/**
* This is called before or after a socket is closed (depends on how it's closed). SendMessage to $conn will not result in an error if it has already been closed.
* @param ConnectionInterface $conn The socket/connection that is closing/closed
* @throws \Exception
*/
function onClose(ConnectionInterface $conn) {
$disconnectedId = $conn->resourceId;
unset($this->connections[$disconnectedId]);
foreach($this->connections as &$connection)
$connection['conn']->send(json_encode([
'offline_user' => $disconnectedId,
'from_user_id' => 'server control',
'from_resource_id' => null
]));
}
/**
* If there is an error with one of the sockets, or somewhere in the application where an Exception is thrown,
* the Exception is sent back down the stack, handled by the Server and bubbled back up the application through this method
* @param ConnectionInterface $conn
* @param \Exception $e
* @throws \Exception
*/
function onError(ConnectionInterface $conn, \Exception $e){
$userId = $this->connections[$conn->resourceId]['user_id'];
echo "An error has occurred with user $userId: {$e->getMessage()}\n";
unset($this->connections[$conn->resourceId]);
$conn->close();
}
/**
* Triggered when a client sends data through the socket
* @param \Ratchet\ConnectionInterface $conn The socket/connection that sent the message to your application
* @param string $msg The message received
* @throws \Exception
*/
function onMessage(ConnectionInterface $conn, $msg){
if(is_null($this->connections[$conn->resourceId]['user_id'])){
$this->connections[$conn->resourceId]['user_id'] = $msg;
$onlineUsers = [];
foreach($this->connections as $resourceId => &$connection){
$connection['conn']->send(json_encode([$conn->resourceId => $msg]));
if($conn->resourceId != $resourceId)
$onlineUsers[$resourceId] = $connection['user_id'];
}
$conn->send(json_encode(['online_users' => $onlineUsers]));
} else{
$fromUserId = $this->connections[$conn->resourceId]['user_id'];
$msg = json_decode($msg, true);
$this->connections[$msg['to']]['conn']->send(json_encode([
'msg' => $msg['content'],
'from_user_id' => $fromUserId,
'from_resource_id' => $conn->resourceId
]));
}
}
}