123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259 |
- <?php
- namespace addons\shopro\library\chat;
- use addons\shopro\library\chat\traits\Helper;
- use addons\shopro\library\chat\traits\Session;
- use addons\shopro\library\chat\traits\BindUId;
- use addons\shopro\library\chat\traits\sender\SenderFunc;
- use PHPSocketIO\SocketIO;
- use PHPSocketIO\Socket;
- use PHPSocketIO\Nsp;
- /**
- * 客服 Sender 发送类
- */
- class Sender
- {
- /**
- * 绑定 UID 助手
- */
- use BindUId;
- /**
- * 特定的发送方法
- */
- use SenderFunc;
- /**
- * session
- */
- use Session;
- /**
- * 帮助方法
- */
- use Helper;
- /**
- * 当前 socket 实例
- *
- * @var Socket
- */
- protected $socket = null;
- /**
- * 当前 phpsocket.io 实例
- *
- * @var SocketIO
- */
- protected $io = null;
- /**
- * 当前 phpsocket.io 的 nsp 实例
- *
- * @var Nsp
- */
- protected $nsp = null;
- /**
- * 当前 获取 实例
- *
- * @var Getter
- */
- protected $getter = null;
- public function __construct(Socket $socket = null, SocketIo $io, Nsp $nsp, Getter $getter = null)
- {
- $this->socket = $socket;
- $this->io = $io;
- $this->nsp = $nsp;
- $this->getter = $getter;
- }
- /**
- * 返回成功方法
- *
- * @param string $event
- * @param string $msg
- * @param array $data
- * @param Socket|Nsp $data
- * @return void
- */
- public function success($event, $msg = '', $data = null, $sender = null)
- {
- $result = [
- 'code' => 1,
- 'msg' => $msg,
- 'data' => $data
- ];
- if ($event instanceof \Closure) {
- $event($result);
- } else {
- $sender && $sender->emit($event, $result);
- }
- }
- /**
- * 返回成功方法
- *
- * @param string $event
- * @param string $msg
- * @param Socket|Nsp $data
- * @return void
- */
- public function error($event, $msg = '', $data = null, $sender = null)
- {
- $result = [
- 'code' => 0,
- 'msg' => $msg,
- 'data' => $data
- ];
- if ($event instanceof \Closure) {
- $event($result);
- } else {
- $sender && $sender->emit($event, $result);
- }
- }
- /**
- * 成功发给当前渠道
- *
- * @param string $event
- * @param string $msg
- * @param Socket|Nsp $data
- * @return void
- */
- public function successSocket($event, $msg = '', $data = null)
- {
- $this->success($event, $msg, $data, $this->socket);
- }
- /**
- * 失败发给当前渠道
- *
- * @param string $event
- * @param string $msg
- * @param Socket|Nsp $data
- * @return void
- */
- public function errorSocket($event, $msg = '', $data = null)
- {
- $this->error($event, $msg, $data, $this->socket);
- }
- /**
- * 通过 clients 发送成功事件
- *
- * @param string $event
- * @param string $msg
- * @param array $data
- * @param array $clientIds
- * @return void
- */
- public function successClients($event, $msg = '', $data = null, $clientIds = [])
- {
- $clientIds = $clientIds ? (is_array($clientIds) ? $clientIds : [$clientIds]) : [];
- foreach ($clientIds as $client_id) {
- if (isset($this->nsp->connected[$client_id])) {
- $sender = $this->nsp->connected[$client_id];
- $this->success($event, $msg, $data, $sender);
- }
- }
- }
- /**
- * 通过 UId 发送成功事件
- *
- * @param string $event
- * @param string $msg
- * @param array $data
- * @param array $uIdData
- * @return void
- */
- public function successUId($event, $msg = '', $data = null, $uIdData = [])
- {
- $uIdData = $uIdData ? $uIdData : [];
- if ($uIdData) {
- $clientIds = $this->getClientIdByUId($uIdData['id'], $uIdData['type']);
- $this->successClients($event, $msg, $data, $clientIds);
- }
- }
- /**
- * 通过 UId 发送成功事件
- *
- * @param string $event
- * @param string $msg
- * @param array $data
- * @param string $room
- * @return void
- */
- public function successRoom($event, $msg = '', $data = null, $room = '')
- {
- $room = $room ? $room : '';
- if ($room) {
- $sender = $this->nsp->to($room);
- $this->success($event, $msg, $data, $sender);
- }
- }
- /**
- * 转发, message 开头保存数据库
- */
- public function __call($name, $arguments)
- {
- $currentName = $name;
- // 需要存储数据库的消息,先存储数据库,再发送
- if (strpos($name, 'message') === 0) {
- $room_id = $this->session('room_id');
- // 存库
- $chatRecord = $this->getter('db')->addMessage($room_id, $name, $arguments);
- // 将 message 追加到 content 里面
- $content = $arguments[2] ?? [];
- $content['message'] = $chatRecord->toArray();
- $arguments[2] = $content;
- // 重载方法名
- $currentName = str_replace('message', 'success', $name);
- }
-
- $sender_status = true;
- switch($currentName) {
- case 'successUId':
- if (!isset($arguments[3]) || !isset($arguments[3]['id']) || !$arguments[3]['id']) {
- // 缺少参数 id
- $sender_status = false;
- }
- break;
- case 'successClients':
- if (!isset($arguments[3]) || !$arguments[3]) {
- // 缺少接收的 clientIds
- $sender_status = false;
- }
- }
- if ($sender_status) {
- // 接收者正常
- return self::$currentName(...$arguments);
- }
- }
- }
|