Chat.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. <?php
  2. namespace App\Module;
  3. use Cache;
  4. use DB;
  5. /**
  6. * Class Chat
  7. * @package App\Module
  8. */
  9. class Chat
  10. {
  11. /**
  12. * 打开对话(创建对话)
  13. * @param string $username 发送者用户名
  14. * @param string $receive 接受者用户名
  15. * @return mixed
  16. */
  17. public static function openDialog($username, $receive)
  18. {
  19. if (!$username || !$receive) {
  20. return Base::retError('参数错误!');
  21. }
  22. $cacheKey = $username . "@" . $receive;
  23. $result = Cache::remember($cacheKey, now()->addMinutes(10), function() use ($receive, $username) {
  24. $row = Base::DBC2A(DB::table('chat_dialog')->where([
  25. 'user1' => $username,
  26. 'user2' => $receive,
  27. ])->first());
  28. if ($row) {
  29. $row['recField'] = 2; //接受者的字段位置
  30. return Base::retSuccess('already1', $row);
  31. }
  32. $row = Base::DBC2A(DB::table('chat_dialog')->where([
  33. 'user1' => $receive,
  34. 'user2' => $username,
  35. ])->first());
  36. if ($row) {
  37. $row['recField'] = 1;
  38. return Base::retSuccess('already2', $row);
  39. }
  40. //
  41. DB::table('chat_dialog')->insert([
  42. 'user1' => $username,
  43. 'user2' => $receive,
  44. 'indate' => Base::time()
  45. ]);
  46. $row = Base::DBC2A(DB::table('chat_dialog')->where([
  47. 'user1' => $username,
  48. 'user2' => $receive,
  49. ])->first());
  50. if ($row) {
  51. $row['recField'] = 2;
  52. return Base::retSuccess('success', $row);
  53. }
  54. //
  55. return Base::retError('系统繁忙,请稍后再试!');
  56. });
  57. if (Base::isError($result)) {
  58. Cache::forget($cacheKey);
  59. }
  60. return $result;
  61. }
  62. /**
  63. * 删除对话缓存
  64. * @param $username
  65. * @param $receive
  66. * @return bool
  67. */
  68. public static function forgetDialog($username, $receive)
  69. {
  70. if (!$username || !$receive) {
  71. return false;
  72. }
  73. Cache::forget($username . "@" . $receive);
  74. Cache::forget($receive . "@" . $username);
  75. return true;
  76. }
  77. /**
  78. * 保存对话消息
  79. * @param string $username 发送者用户名
  80. * @param string $receive 接受者用户名
  81. * @param array $message
  82. * @return mixed
  83. */
  84. public static function saveMessage($username, $receive, $message)
  85. {
  86. $dialog = self::openDialog($username, $receive);
  87. if (Base::isError($dialog)) {
  88. return $dialog;
  89. } else {
  90. $dialog = $dialog['data'];
  91. }
  92. //
  93. $indate = abs($message['indate'] - time()) > 60 ? time() : $message['indate'];
  94. if (isset($message['id'])) unset($message['id']);
  95. if (isset($message['username'])) unset($message['username']);
  96. if (isset($message['userimg'])) unset($message['userimg']);
  97. if (isset($message['indate'])) unset($message['indate']);
  98. $inArray = [
  99. 'did' => $dialog['id'],
  100. 'username' => $username,
  101. 'receive' => $receive,
  102. 'message' => Base::array2string($message),
  103. 'indate' => $indate
  104. ];
  105. //
  106. switch ($message['type']) {
  107. case 'text':
  108. $lastText = $message['text'];
  109. break;
  110. case 'image':
  111. $lastText = '[图片]';
  112. break;
  113. case 'taskB':
  114. $lastText = $message['detail'] . " [来自关注任务]";
  115. break;
  116. default:
  117. $lastText = '[未知类型]';
  118. break;
  119. }
  120. if ($lastText) {
  121. $upArray = Base::DBUP([
  122. ($dialog['recField'] == 1 ? 'unread1' : 'unread2') => 1,
  123. ]);
  124. $upArray['lasttext'] = $lastText;
  125. $upArray['lastdate'] = $indate;
  126. if ($dialog['del1']) {
  127. $upArray['del1'] = 0;
  128. }
  129. if ($dialog['del2']) {
  130. $upArray['del2'] = 0;
  131. }
  132. DB::table('chat_dialog')->where('id', $dialog['id'])->update($upArray);
  133. if ($dialog['del1'] || $dialog['del2']) {
  134. Chat::forgetDialog($dialog['user1'], $dialog['user2']);
  135. }
  136. }
  137. $inArray['id'] = DB::table('chat_msg')->insertGetId($inArray);
  138. $inArray['message'] = $message;
  139. //
  140. return Base::retSuccess('success', $inArray);
  141. }
  142. }