zhamao-framework/src/ZM/Event/Swoole/MessageEvent.php

100 lines
3.3 KiB
PHP
Raw Normal View History

2020-03-02 16:14:20 +08:00
<?php
namespace ZM\Event\Swoole;
use Closure;
2020-08-31 10:11:06 +08:00
use ZM\ConnectionManager\ManagerGM;
use ZM\Console\Console;
2020-03-02 16:14:20 +08:00
use Swoole\WebSocket\Frame;
use Swoole\WebSocket\Server;
use ZM\Annotation\Swoole\SwooleEventAfter;
use ZM\Annotation\Swoole\SwooleEventAt;
use Exception;
use ZM\Event\EventHandler;
2020-08-31 10:11:06 +08:00
use ZM\Store\ZMBuf;
2020-03-02 16:14:20 +08:00
use ZM\Utils\ZMUtil;
class MessageEvent implements SwooleEvent
{
/**
* @var Server
*/
public $server;
/**
* @var Frame
*/
public $frame;
public function __construct(Server $server, Frame $frame) {
$this->server = $server;
$this->frame = $frame;
}
/**
* @inheritDoc
*/
public function onActivate() {
ZMUtil::checkWait();
2020-08-31 10:11:06 +08:00
$conn = ManagerGM::get(context()->getFrame()->fd);
2020-03-02 16:14:20 +08:00
try {
2020-08-31 10:11:06 +08:00
if ($conn->getName() == "qq") {
2020-05-06 17:26:50 +08:00
$data = json_decode(context()->getFrame()->data, true);
2020-03-09 00:33:04 +08:00
if (isset($data["post_type"])) {
set_coroutine_params(["data" => $data, "connection" => $conn]);
2020-05-10 23:45:45 +08:00
ctx()->setCache("level", 0);
2020-08-31 10:11:06 +08:00
Console::debug("Calling CQ Event from fd=" . $conn->getFd());
EventHandler::callCQEvent($data, ManagerGM::get(context()->getFrame()->fd), 0);
2020-05-23 17:23:29 +08:00
} else{
set_coroutine_params(["connection" => $conn]);
2020-03-02 16:14:20 +08:00
EventHandler::callCQResponse($data);
2020-05-23 17:23:29 +08:00
}
2020-03-02 16:14:20 +08:00
}
foreach (ZMBuf::$events[SwooleEventAt::class] ?? [] as $v) {
if (strtolower($v->type) == "message" && $this->parseSwooleRule($v)) {
$c = $v->class;
2020-05-08 16:37:38 +08:00
EventHandler::callWithMiddleware(
$c,
$v->method,
["server" => $this->server, "frame" => $this->frame, "connection" => $conn],
[$conn]
);
2020-05-06 17:26:50 +08:00
if (context()->getCache("block_continue") === true) break;
2020-03-02 16:14:20 +08:00
}
}
} catch (Exception $e) {
Console::warning("Websocket message event exception: " . (($cs = $e->getMessage()) == "" ? get_class($e) : $cs));
2020-05-10 23:45:45 +08:00
Console::warning("In ". $e->getFile() . " at line ".$e->getLine());
2020-03-02 16:14:20 +08:00
}
return $this;
}
/**
* @inheritDoc
*/
public function onAfter() {
foreach (ZMBuf::$events[SwooleEventAfter::class] ?? [] as $v) {
if (strtolower($v->type) == "message" && $this->parseSwooleRule($v) === true) {
$c = $v->class;
2020-08-31 10:11:06 +08:00
$class = new $c();
2020-03-02 16:14:20 +08:00
call_user_func_array([$class, $v->method], []);
2020-05-06 17:26:50 +08:00
if (context()->getCache("block_continue") === true) break;
2020-03-02 16:14:20 +08:00
}
}
return $this;
}
private function parseSwooleRule($v) {
switch (explode(":", $v->rule)[0]) {
case "connectType": //websocket连接类型
2020-08-31 10:11:06 +08:00
if ($v->callback instanceof Closure) return call_user_func($v->callback, ManagerGM::get($this->frame->fd));
2020-03-02 16:14:20 +08:00
break;
case "dataEqual": //handle websocket message事件时才能用
if ($v->callback instanceof Closure) return call_user_func($v->callback, $this->frame->data);
break;
}
return true;
}
}