Chat.php 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. <?php
  2. namespace App\Module;
  3. use App\Model\DBCache;
  4. use Cache;
  5. use DB;
  6. use Request;
  7. use Session;
  8. /**
  9. * Class Chat
  10. * @package App\Module
  11. */
  12. class Chat
  13. {
  14. /**
  15. * 打开对话(创建对话)
  16. * @param string $username 发送者用户名
  17. * @param string $receive 接受者用户名
  18. * @return mixed
  19. */
  20. public static function openDialog($username, $receive)
  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. return Base::retSuccess('already1', $row);
  30. }
  31. $row = Base::DBC2A(DB::table('chat_dialog')->where([
  32. 'user1' => $receive,
  33. 'user2' => $username,
  34. ])->first());
  35. if ($row) {
  36. return Base::retSuccess('already2', $row);
  37. }
  38. //
  39. DB::table('chat_dialog')->insert([
  40. 'user1' => $username,
  41. 'user2' => $receive,
  42. 'indate' => Base::time()
  43. ]);
  44. $row = Base::DBC2A(DB::table('chat_dialog')->where([
  45. 'user1' => $username,
  46. 'user2' => $receive,
  47. ])->first());
  48. if ($row) {
  49. return Base::retSuccess('success', $row);
  50. }
  51. //
  52. return Base::retError('系统繁忙,请稍后再试!');
  53. });
  54. if (Base::isError($result)) {
  55. Cache::forget($cacheKey);
  56. }
  57. return $result;
  58. }
  59. /**
  60. * 保存对话消息
  61. * @param string $username 发送者用户名
  62. * @param string $receive 接受者用户名
  63. * @param array $message
  64. * @return mixed
  65. */
  66. public static function saveMessage($username, $receive, $message)
  67. {
  68. $dialog = self::openDialog($username, $receive);
  69. if (Base::isError($dialog)) {
  70. return $dialog;
  71. } else {
  72. $dialog = $dialog['data'];
  73. }
  74. //
  75. $indate = abs($message['indate'] - time()) > 30 ? time() : $message['indate'];
  76. $inArray = [
  77. 'did' => $dialog['id'],
  78. 'username' => $username,
  79. 'receive' => $receive,
  80. 'message' => Base::array2string($message),
  81. 'indate' => $indate
  82. ];
  83. //
  84. switch ($message['type']) {
  85. case 'text':
  86. $lastText = $message['text'];
  87. break;
  88. case 'image':
  89. $lastText = '[图片]';
  90. break;
  91. default:
  92. $lastText = '[未知类型]';
  93. break;
  94. }
  95. if ($lastText) {
  96. DB::table('chat_dialog')->where('id', $dialog['id'])->update([
  97. 'lasttext' => $lastText,
  98. 'lastdate' => $indate,
  99. ]);
  100. }
  101. $inArray['id'] = DB::table('chat_msg')->insertGetId($inArray);
  102. $inArray['message'] = $message;
  103. //
  104. return Base::retSuccess('success', $inArray);
  105. }
  106. }