76 lines
2.0 KiB
PHP
76 lines
2.0 KiB
PHP
<?php
|
|
/**
|
|
* Author: cfn <cfn@leapy.cn>
|
|
*/
|
|
|
|
namespace App\Event;
|
|
|
|
use App\Model\Online;
|
|
use App\Utils\Token;
|
|
use Hyperf\Context\ApplicationContext;
|
|
use Hyperf\Contract\OnCloseInterface;
|
|
use Hyperf\Contract\OnMessageInterface;
|
|
use Hyperf\Contract\OnOpenInterface;
|
|
use Hyperf\WebSocketServer\Context;
|
|
|
|
/**
|
|
* 商户端socket
|
|
* Author: cfn <cfn@leapy.cn>
|
|
*/
|
|
class WebSocket implements OnMessageInterface, OnOpenInterface, OnCloseInterface
|
|
{
|
|
/**
|
|
* 连接关闭
|
|
* Author: cfn <cfn@leapy.cn>
|
|
* @param $server
|
|
* @param int $fd
|
|
* @param int $reactorId
|
|
* @return void
|
|
*/
|
|
public function onClose($server, int $fd, int $reactorId): void
|
|
{
|
|
$uuid = Context::get('uuid', "");
|
|
Online::leave($uuid);
|
|
}
|
|
|
|
/**
|
|
* 连接时
|
|
* Author: cfn <cfn@leapy.cn>
|
|
* @param $server
|
|
* @param $request
|
|
* @return void
|
|
*/
|
|
public function onOpen($server, $request): void
|
|
{
|
|
$token = $request->get['Authorization'];
|
|
$result = Token::parseToken(str_replace("Bearer ", "", $token));
|
|
|
|
$container = ApplicationContext::getContainer();
|
|
$redis = $container->get(\Hyperf\Redis\Redis::class);
|
|
$account = !empty($result) ? json_decode($redis->get("USER:" . $result['uuid']), true) : null;
|
|
if (!empty($account)) {
|
|
Online::live($result['uuid'], $request->fd);
|
|
Context::set('account', $account);
|
|
Context::set('uuid', $result['uuid']);
|
|
$server->push($request->fd, 'connection successful');
|
|
return;
|
|
}
|
|
$server->push($request->fd, 'connection refused');
|
|
}
|
|
|
|
/**
|
|
* 当接收到信息
|
|
* Author: cfn <cfn@leapy.cn>
|
|
* @param $server
|
|
* @param $frame
|
|
* @return void
|
|
*/
|
|
public function onMessage($server, $frame): void
|
|
{
|
|
if (strtolower($frame->data) == "ping") {
|
|
$server->push($frame->fd, 'pong');
|
|
return;
|
|
}
|
|
$server->push($frame->fd, 'Recv: ' . $frame->data);
|
|
}
|
|
} |