NspData.php 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. <?php
  2. namespace addons\shopro\library\chat\traits;
  3. /**
  4. * 在 nsp 连接实例绑定数据
  5. */
  6. trait NspData
  7. {
  8. // data 的格式
  9. // 'data' => [
  10. // 'room_ids' => ['admin'] // 客服房间数组,目前只有 admin
  11. // 'session_ids' => ['user' => [1,2,3], 'admin' => [1,2,3]] // 登录的身份的 ids
  12. // 'connections' => [
  13. // room_id => [
  14. // 'session_id' => customer_service_id
  15. // ]
  16. // ],
  17. // 'waitings' => [
  18. // 'room_id' => [排队的用户]
  19. // ]
  20. // ]
  21. /**
  22. * 获取存储的数据,当前 Nsp
  23. *
  24. * @param string $name
  25. * @param mixed $value
  26. * @return mixed
  27. */
  28. public function nspData($name = null, $value = '')
  29. {
  30. $data = $this->nsp->nspData ?? [];
  31. if (is_null($name)) {
  32. // 获取全部数据
  33. return $data;
  34. }
  35. if ('' === $value) {
  36. // 获取缓存
  37. return 0 === strpos($name, '?') ? isset($data[$name]) : ($data[$name] ?? null);
  38. } elseif (is_null($value)) {
  39. // 删除缓存
  40. unset($data[$name]);
  41. $this->nsp->nspData = $data;
  42. }
  43. // 存数据
  44. $data[$name] = $value;
  45. $this->nsp->nspData = $data;
  46. }
  47. /**
  48. * 获取等待中的排队,如果有房间,返回当前房间的
  49. *
  50. * @param string $room_id
  51. * @return array
  52. */
  53. // public function nspGetSessionIds($auth)
  54. // {
  55. // $sessionIds = $this->nspData('session_ids');
  56. // $sessionIds = $sessionIds ?: [];
  57. // return $auth ? $sessionIds[$auth] ?? [] : $sessionIds;
  58. // }
  59. /**
  60. * 保存当前在线的 auth id
  61. *
  62. * @param integer $session_id
  63. * @return void
  64. */
  65. // public function nspSessionIdAdd($session_id, $auth)
  66. // {
  67. // $sessionIds = $this->nspData('session_ids');
  68. // $sessionIds = $sessionIds ?: [];
  69. // // 当前 auth 的 ids
  70. // $currentsessionIds = $sessionIds[$auth] ?? [];
  71. // // 已经存在直接忽略
  72. // if (!in_array($session_id, $currentsessionIds)) {
  73. // // 追加auth
  74. // $currentsessionIds[] = $session_id;
  75. // $sessionIds[$auth] = $currentsessionIds;
  76. // $this->nspData('session_ids', $sessionIds);
  77. // }
  78. // }
  79. /**
  80. * 删除一个 auth id (离线了)
  81. *
  82. * @param integer $session_id
  83. * @return void
  84. */
  85. // public function nspSessionIdDel($session_id, $auth)
  86. // {
  87. // $sessionIds = $this->nspData('session_ids');
  88. // $sessionIds = $sessionIds ?: [];
  89. // // 当前 auth 的 ids
  90. // $currentsessionIds = $sessionIds[$auth] ?? [];
  91. // $key = array_search($session_id, $currentsessionIds);
  92. // if ($key !== false) {
  93. // // 移除
  94. // unset($currentsessionIds[$key]);
  95. // // 重新赋值
  96. // $sessionIds[$auth] = array_values($currentsessionIds);
  97. // $this->nspData('session_ids', $sessionIds);
  98. // }
  99. // }
  100. /**
  101. * 获取顾客的连接客服(这个信息只会存 10s,防止用户刷新,重新分配客服问题)
  102. *
  103. * @param string $room_id
  104. * @return array
  105. */
  106. public function nspGetConnectionCustomerServiceId($room_id, $session_id)
  107. {
  108. $connections = $this->nspData('connections');
  109. $connections = $connections ?: [];
  110. // 当前房间的 waitings
  111. $roomConnections = $connections[$room_id] ?? [];
  112. $data_str = $roomConnections[$session_id] ?? '';
  113. if ($data_str) {
  114. // 删除 connections
  115. unset($roomConnections[$session_id]);
  116. $connections[$room_id] = $roomConnections;
  117. $this->nspData('connections', $connections);
  118. // 获取 客服 id
  119. $data = explode('-', $data_str);
  120. if ($data[0] >= (time() - 300)) {
  121. return $data[1] ?? null;
  122. }
  123. }
  124. return null;
  125. }
  126. /**
  127. * 记录用户的服务客服
  128. *
  129. * @param string $room_id
  130. * @param string $session_id
  131. * @param string $customer_service_id
  132. * @return void
  133. */
  134. public function nspConnectionAdd($room_id, $session_id, $customer_service_id)
  135. {
  136. // 所有 waitings
  137. $connections = $this->nspData('connections');
  138. $connections = $connections ?: [];
  139. // 当前房间的 waitings
  140. $roomConnections = $connections[$room_id] ?? [];
  141. if (!in_array($session_id, $roomConnections)) {
  142. // 将 session_id 和对应的 客服 id 关联
  143. $roomConnections[$session_id] = time() . '-' . $customer_service_id;
  144. // 重新赋值
  145. $connections[$room_id] = $roomConnections;
  146. // 保存
  147. $this->nspData('connections', $connections);
  148. }
  149. }
  150. /**
  151. * 记录要创建的 客服 room 房间
  152. *
  153. * @param string $room_id
  154. * @return void
  155. */
  156. public function nspRoomIdAdd($room_id)
  157. {
  158. $roomIds = $this->nspData('room_ids');
  159. $roomIds = $roomIds ?: [];
  160. // 已经存在直接忽略
  161. if (!in_array($room_id, $roomIds)) {
  162. // 追加房间
  163. $roomIds[] = $room_id;
  164. $this->nspData('room_ids', $roomIds);
  165. }
  166. }
  167. /**
  168. * 获取等待中的排队,如果有房间,返回当前房间的
  169. *
  170. * @param string $room_id
  171. * @return array
  172. */
  173. public function nspGetWaitings($room_id = null)
  174. {
  175. $waitings = $this->nspData('waitings');
  176. $waitings = $waitings ?: [];
  177. return $room_id ? $waitings[$room_id] ?? [] : $waitings;
  178. }
  179. /**
  180. * 给对应房间的排队中追加顾客,如果已经存在,忽略
  181. *
  182. * @param string $room_id
  183. * @param string $session_id
  184. * @return void
  185. */
  186. public function nspWaitingAdd($room_id, $session_id)
  187. {
  188. // 所有 waitings
  189. $waitings = $this->nspData('waitings');
  190. $waitings = $waitings ? : [];
  191. // 当前房间的 waitings
  192. $roomWaitings = $waitings[$room_id] ?? [];
  193. if (!in_array($session_id, $roomWaitings)) {
  194. // 将 session_id 加入 房间 waitings,如果存在,忽略
  195. $roomWaitings[] = $session_id;
  196. // 重新赋值
  197. $waitings[$room_id] = $roomWaitings;
  198. // 保存
  199. $this->nspData('waitings', $waitings);
  200. }
  201. }
  202. /**
  203. * 删除对应房间中排队的顾客,如果不存在忽略
  204. *
  205. * @param string $room_id
  206. * @param string $session_id
  207. * @return void
  208. */
  209. public function nspWaitingDel($room_id, $session_id)
  210. {
  211. // 所有 waitings
  212. $waitings = $this->nspData('waitings');
  213. $waitings = $waitings ?: [];
  214. // 当前房间的 waitings
  215. $roomWaitings = $waitings[$room_id] ?? [];
  216. $key = array_search($session_id, $roomWaitings);
  217. if ($key !== false) {
  218. // 移除
  219. unset($roomWaitings[$key]);
  220. // 重新赋值
  221. $waitings[$room_id] = array_values($roomWaitings);
  222. $this->nspData('waitings', $waitings);
  223. }
  224. }
  225. /**
  226. * 获取在房间中的排名
  227. *
  228. * @param string $room_id
  229. * @param string $session_id
  230. * @return integer
  231. */
  232. public function nspWaitingRank($room_id, $session_id)
  233. {
  234. // 所有 waitings
  235. $waitings = $this->nspData('waitings');
  236. $waitings = $waitings ?: [];
  237. // 当前房间的 waitings
  238. $roomWaitings = $waitings[$room_id] ?? [];
  239. // 获取 session_id 的下标,就是当前顾客前面还有多少位 顾客
  240. $key = array_search($session_id, $roomWaitings);
  241. return $key !== false ? $key : 0;
  242. }
  243. }