123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302 |
- <?php
- namespace addons\shopro\library\chat\traits;
- /**
- * 在 nsp 连接实例绑定数据
- */
- trait NspData
- {
- // data 的格式
- // 'data' => [
- // 'room_ids' => ['admin'] // 客服房间数组,目前只有 admin
- // 'session_ids' => ['user' => [1,2,3], 'admin' => [1,2,3]] // 登录的身份的 ids
- // 'connections' => [
- // room_id => [
- // 'session_id' => customer_service_id
- // ]
- // ],
- // 'waitings' => [
- // 'room_id' => [排队的用户]
- // ]
- // ]
- /**
- * 获取存储的数据,当前 Nsp
- *
- * @param string $name
- * @param mixed $value
- * @return mixed
- */
- public function nspData($name = null, $value = '')
- {
- $data = $this->nsp->nspData ?? [];
- if (is_null($name)) {
- // 获取全部数据
- return $data;
- }
- if ('' === $value) {
- // 获取缓存
- return 0 === strpos($name, '?') ? isset($data[$name]) : ($data[$name] ?? null);
- } elseif (is_null($value)) {
- // 删除缓存
- unset($data[$name]);
- $this->nsp->nspData = $data;
- }
- // 存数据
- $data[$name] = $value;
- $this->nsp->nspData = $data;
- }
- /**
- * 获取等待中的排队,如果有房间,返回当前房间的
- *
- * @param string $room_id
- * @return array
- */
- // public function nspGetSessionIds($auth)
- // {
- // $sessionIds = $this->nspData('session_ids');
- // $sessionIds = $sessionIds ?: [];
- // return $auth ? $sessionIds[$auth] ?? [] : $sessionIds;
- // }
- /**
- * 保存当前在线的 auth id
- *
- * @param integer $session_id
- * @return void
- */
- // public function nspSessionIdAdd($session_id, $auth)
- // {
- // $sessionIds = $this->nspData('session_ids');
- // $sessionIds = $sessionIds ?: [];
- // // 当前 auth 的 ids
- // $currentsessionIds = $sessionIds[$auth] ?? [];
- // // 已经存在直接忽略
- // if (!in_array($session_id, $currentsessionIds)) {
- // // 追加auth
- // $currentsessionIds[] = $session_id;
- // $sessionIds[$auth] = $currentsessionIds;
- // $this->nspData('session_ids', $sessionIds);
- // }
- // }
- /**
- * 删除一个 auth id (离线了)
- *
- * @param integer $session_id
- * @return void
- */
- // public function nspSessionIdDel($session_id, $auth)
- // {
- // $sessionIds = $this->nspData('session_ids');
- // $sessionIds = $sessionIds ?: [];
- // // 当前 auth 的 ids
- // $currentsessionIds = $sessionIds[$auth] ?? [];
- // $key = array_search($session_id, $currentsessionIds);
- // if ($key !== false) {
- // // 移除
- // unset($currentsessionIds[$key]);
- // // 重新赋值
- // $sessionIds[$auth] = array_values($currentsessionIds);
- // $this->nspData('session_ids', $sessionIds);
- // }
- // }
- /**
- * 获取顾客的连接客服(这个信息只会存 10s,防止用户刷新,重新分配客服问题)
- *
- * @param string $room_id
- * @return array
- */
- public function nspGetConnectionCustomerServiceId($room_id, $session_id)
- {
- $connections = $this->nspData('connections');
- $connections = $connections ?: [];
- // 当前房间的 waitings
- $roomConnections = $connections[$room_id] ?? [];
- $data_str = $roomConnections[$session_id] ?? '';
- if ($data_str) {
- // 删除 connections
- unset($roomConnections[$session_id]);
- $connections[$room_id] = $roomConnections;
- $this->nspData('connections', $connections);
- // 获取 客服 id
- $data = explode('-', $data_str);
- if ($data[0] >= (time() - 300)) {
- return $data[1] ?? null;
- }
- }
- return null;
- }
- /**
- * 记录用户的服务客服
- *
- * @param string $room_id
- * @param string $session_id
- * @param string $customer_service_id
- * @return void
- */
- public function nspConnectionAdd($room_id, $session_id, $customer_service_id)
- {
- // 所有 waitings
- $connections = $this->nspData('connections');
- $connections = $connections ?: [];
- // 当前房间的 waitings
- $roomConnections = $connections[$room_id] ?? [];
- if (!in_array($session_id, $roomConnections)) {
- // 将 session_id 和对应的 客服 id 关联
- $roomConnections[$session_id] = time() . '-' . $customer_service_id;
- // 重新赋值
- $connections[$room_id] = $roomConnections;
- // 保存
- $this->nspData('connections', $connections);
- }
- }
- /**
- * 记录要创建的 客服 room 房间
- *
- * @param string $room_id
- * @return void
- */
- public function nspRoomIdAdd($room_id)
- {
- $roomIds = $this->nspData('room_ids');
- $roomIds = $roomIds ?: [];
- // 已经存在直接忽略
- if (!in_array($room_id, $roomIds)) {
- // 追加房间
- $roomIds[] = $room_id;
- $this->nspData('room_ids', $roomIds);
- }
- }
- /**
- * 获取等待中的排队,如果有房间,返回当前房间的
- *
- * @param string $room_id
- * @return array
- */
- public function nspGetWaitings($room_id = null)
- {
- $waitings = $this->nspData('waitings');
- $waitings = $waitings ?: [];
- return $room_id ? $waitings[$room_id] ?? [] : $waitings;
- }
- /**
- * 给对应房间的排队中追加顾客,如果已经存在,忽略
- *
- * @param string $room_id
- * @param string $session_id
- * @return void
- */
- public function nspWaitingAdd($room_id, $session_id)
- {
- // 所有 waitings
- $waitings = $this->nspData('waitings');
- $waitings = $waitings ? : [];
- // 当前房间的 waitings
- $roomWaitings = $waitings[$room_id] ?? [];
- if (!in_array($session_id, $roomWaitings)) {
- // 将 session_id 加入 房间 waitings,如果存在,忽略
- $roomWaitings[] = $session_id;
- // 重新赋值
- $waitings[$room_id] = $roomWaitings;
- // 保存
- $this->nspData('waitings', $waitings);
- }
- }
- /**
- * 删除对应房间中排队的顾客,如果不存在忽略
- *
- * @param string $room_id
- * @param string $session_id
- * @return void
- */
- public function nspWaitingDel($room_id, $session_id)
- {
- // 所有 waitings
- $waitings = $this->nspData('waitings');
- $waitings = $waitings ?: [];
- // 当前房间的 waitings
- $roomWaitings = $waitings[$room_id] ?? [];
- $key = array_search($session_id, $roomWaitings);
- if ($key !== false) {
- // 移除
- unset($roomWaitings[$key]);
- // 重新赋值
- $waitings[$room_id] = array_values($roomWaitings);
- $this->nspData('waitings', $waitings);
- }
- }
- /**
- * 获取在房间中的排名
- *
- * @param string $room_id
- * @param string $session_id
- * @return integer
- */
- public function nspWaitingRank($room_id, $session_id)
- {
- // 所有 waitings
- $waitings = $this->nspData('waitings');
- $waitings = $waitings ?: [];
- // 当前房间的 waitings
- $roomWaitings = $waitings[$room_id] ?? [];
- // 获取 session_id 的下标,就是当前顾客前面还有多少位 顾客
- $key = array_search($session_id, $roomWaitings);
- return $key !== false ? $key : 0;
- }
- }
|