Chat.php 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  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. $cacheKey = $username . "@" . $receive;
  20. $result = Cache::remember($cacheKey, now()->addMinutes(10), function() use ($receive, $username) {
  21. $row = Base::DBC2A(DB::table('chat_dialog')->where([
  22. 'user1' => $username,
  23. 'user2' => $receive,
  24. ])->first());
  25. if ($row) {
  26. return Base::retSuccess('already1', $row);
  27. }
  28. $row = Base::DBC2A(DB::table('chat_dialog')->where([
  29. 'user1' => $receive,
  30. 'user2' => $username,
  31. ])->first());
  32. if ($row) {
  33. return Base::retSuccess('already2', $row);
  34. }
  35. //
  36. DB::table('chat_dialog')->insert([
  37. 'user1' => $username,
  38. 'user2' => $receive,
  39. 'indate' => Base::time()
  40. ]);
  41. $row = Base::DBC2A(DB::table('chat_dialog')->where([
  42. 'user1' => $username,
  43. 'user2' => $receive,
  44. ])->first());
  45. if ($row) {
  46. return Base::retSuccess('success', $row);
  47. }
  48. //
  49. return Base::retError('系统繁忙,请稍后再试!');
  50. });
  51. if (Base::isError($result)) {
  52. Cache::forget($cacheKey);
  53. }
  54. return $result;
  55. }
  56. /**
  57. * 保存对话消息
  58. * @param string $username 发送者用户名
  59. * @param string $receive 接受者用户名
  60. * @param array $message
  61. * @return mixed
  62. */
  63. public static function saveMessage($username, $receive, $message)
  64. {
  65. $dialog = self::openDialog($username, $receive);
  66. if (Base::isError($dialog)) {
  67. return $dialog;
  68. } else {
  69. $dialog = $dialog['data'];
  70. }
  71. //
  72. $indate = abs($message['indate'] - time()) > 30 ? time() : $message['indate'];
  73. if (isset($message['id'])) unset($message['id']);
  74. if (isset($message['username'])) unset($message['username']);
  75. if (isset($message['userimg'])) unset($message['userimg']);
  76. if (isset($message['indate'])) unset($message['indate']);
  77. $inArray = [
  78. 'did' => $dialog['id'],
  79. 'username' => $username,
  80. 'receive' => $receive,
  81. 'message' => Base::array2string($message),
  82. 'indate' => $indate
  83. ];
  84. //
  85. switch ($message['type']) {
  86. case 'text':
  87. $lastText = $message['text'];
  88. break;
  89. case 'image':
  90. $lastText = '[图片]';
  91. break;
  92. default:
  93. $lastText = '[未知类型]';
  94. break;
  95. }
  96. if ($lastText) {
  97. DB::table('chat_dialog')->where('id', $dialog['id'])->update([
  98. 'lasttext' => $lastText,
  99. 'lastdate' => $indate,
  100. ]);
  101. }
  102. $inArray['id'] = DB::table('chat_msg')->insertGetId($inArray);
  103. $inArray['message'] = $message;
  104. //
  105. return Base::retSuccess('success', $inArray);
  106. }
  107. }