123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245 |
- <?php
- namespace App\Module;
- use Cache;
- use DB;
- /**
- * Class Chat
- * @package App\Module
- */
- class Chat
- {
- /**
- * 打开对话(创建对话)
- * @param string $username 发送者用户名
- * @param string $receive 接受者用户名
- * @param bool $forceRefresh 是否强制刷新缓存
- * @return mixed
- */
- public static function openDialog($username, $receive, $forceRefresh = false)
- {
- if (!$username || !$receive) {
- return Base::retError('参数错误!');
- }
- $cacheKey = $username . "@" . $receive;
- if ($forceRefresh === true) {
- Cache::forget($cacheKey);
- }
- $result = Cache::remember($cacheKey, now()->addMinutes(10), function() use ($receive, $username) {
- $row = Base::DBC2A(DB::table('chat_dialog')->where([
- 'user1' => $username,
- 'user2' => $receive,
- ])->first());
- if ($row) {
- $row['recField'] = 2; //接受者的字段位置
- return Base::retSuccess('already1', $row);
- }
- $row = Base::DBC2A(DB::table('chat_dialog')->where([
- 'user1' => $receive,
- 'user2' => $username,
- ])->first());
- if ($row) {
- $row['recField'] = 1;
- return Base::retSuccess('already2', $row);
- }
- //
- DB::table('chat_dialog')->insert([
- 'user1' => $username,
- 'user2' => $receive,
- 'indate' => Base::time()
- ]);
- $row = Base::DBC2A(DB::table('chat_dialog')->where([
- 'user1' => $username,
- 'user2' => $receive,
- ])->first());
- if ($row) {
- $row['recField'] = 2;
- return Base::retSuccess('success', $row);
- }
- //
- return Base::retError('系统繁忙,请稍后再试!');
- });
- if (Base::isError($result)) {
- Cache::forget($cacheKey);
- }
- return $result;
- }
- /**
- * 删除对话缓存
- * @param $username
- * @param $receive
- * @return bool
- */
- public static function forgetDialog($username, $receive)
- {
- if (!$username || !$receive) {
- return false;
- }
- Cache::forget($username . "@" . $receive);
- Cache::forget($receive . "@" . $username);
- return true;
- }
- /**
- * 保存对话消息
- * @param string $username 发送者用户名
- * @param string $receive 接受者用户名
- * @param array $message
- * @return mixed
- */
- public static function saveMessage($username, $receive, $message)
- {
- $dialog = self::openDialog($username, $receive);
- if (Base::isError($dialog)) {
- return $dialog;
- } else {
- $dialog = $dialog['data'];
- }
- //
- $indate = abs($message['indate'] - time()) > 60 ? time() : $message['indate'];
- if (isset($message['id'])) unset($message['id']);
- if (isset($message['username'])) unset($message['username']);
- if (isset($message['userimg'])) unset($message['userimg']);
- if (isset($message['indate'])) unset($message['indate']);
- if (isset($message['replaceId'])) unset($message['replaceId']);
- $inArray = [
- 'did' => $dialog['id'],
- 'username' => $username,
- 'receive' => $receive,
- 'message' => Base::array2string($message),
- 'indate' => $indate
- ];
- //
- if (mb_strlen($message['text']) > 20000) {
- return Base::retError("发送内容长度已超出最大限制!");
- }
- $field = ($dialog['recField'] == 1 ? 'unread1' : 'unread2');
- $unread = intval(DB::table('chat_dialog')->where('id', $dialog['id'])->value($field));
- $lastText = self::messageDesc($message);
- if ($lastText) {
- $upArray = [];
- if ($username != $receive) {
- $upArray = Base::DBUP([
- $field => 1,
- ]);
- $unread += 1;
- }
- $upArray['lasttext'] = mb_substr($lastText, 0, 100);
- $upArray['lastdate'] = $indate;
- if ($dialog['del1']) {
- $upArray['del1'] = 0;
- }
- if ($dialog['del2']) {
- $upArray['del2'] = 0;
- }
- DB::table('chat_dialog')->where('id', $dialog['id'])->update($upArray);
- if ($dialog['del1'] || $dialog['del2']) {
- Chat::forgetDialog($dialog['user1'], $dialog['user2']);
- }
- }
- $inArray['id'] = DB::table('chat_msg')->insertGetId($inArray);
- $inArray['message'] = $message;
- $inArray['unread'] = $unread;
- //
- return Base::retSuccess('success', $inArray);
- }
- /**
- * 格式化信息(来自接收)
- * @param $data
- * @return array
- */
- public static function formatMsgReceive($data) {
- return self::formatMsgData(Base::json2array($data));
- }
- /**
- * 格式化信息(用于发送)
- * @param $array
- * @return string
- */
- public static function formatMsgSend($array) {
- return Base::array2json(self::formatMsgData($array));
- }
- /**
- * 格式化信息
- * @param array $array
- * @return array
- */
- public static function formatMsgData($array = []) {
- if (!is_array($array)) {
- $array = [];
- }
- //messageType来自客户端(前端->后端):refresh/unread/read/roger/user/info/team/docs/appActivity
- //messageType来自服务端(后端->前端):error/open/kick/user/back/unread/docs
- if (!isset($array['messageType'])) $array['messageType'] = ''; //消息类型
- if (!isset($array['messageId'])) $array['messageId'] = ''; //消息ID(用于back给客户端)
- if (!isset($array['contentId'])) $array['contentId'] = 0; //消息数据ID(用于roger给服务端)
- if (!isset($array['channel'])) $array['channel'] = ''; //渠道(用于多端登录)
- if (!isset($array['username'])) $array['username'] = ''; //发送者
- if (!isset($array['target'])) $array['target'] = null; //接受者
- if (!isset($array['body'])) $array['body'] = []; //正文内容
- if (!isset($array['time'])) $array['time'] = time(); //时间
- //
- $array['contentId'] = intval($array['contentId']);
- if (!is_array($array['body']) || empty($array['body'])) $array['body'] = ['_' => time()];
- return $array;
- }
- /**
- * 获取跟任务有关系的(在线)用户(关注的、在项目里的、负责人、创建者)
- * @param $taskId
- * @return array
- */
- public static function getTaskUsers($taskId)
- {
- $tmpLists = Project::taskSomeUsers($taskId);
- if (empty($tmpLists)) {
- return [];
- }
- //
- return Base::DBC2A(DB::table('ws')->select(['fd', 'username', 'channel'])->where([
- ['update', '>', time() - 600],
- ])->whereIn('username', array_values(array_unique($tmpLists)))->get());
- }
- /**
- * 获取消息简述
- * @param array $message
- * @return mixed|string
- */
- public static function messageDesc($message)
- {
- switch ($message['type']) {
- case 'text':
- $lastText = $message['text'];
- break;
- case 'image':
- $lastText = '[图片]';
- break;
- case 'file':
- $lastText = '[文件]';
- break;
- case 'taskB':
- $lastText = $message['text'] . " [来自关注任务]";
- break;
- case 'report':
- $lastText = $message['text'] . " [来自工作报告]";
- break;
- case 'video':
- $lastText = '[视频通话]';
- break;
- case 'voice':
- $lastText = '[语音通话]';
- break;
- default:
- $lastText = '[未知类型]';
- break;
- }
- return $lastText;
- }
- }
|