| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625 |
- <?php
- use addons\fastchat\library\Common;
- use GatewayWorker\Lib\Gateway;
- use think\Db;
- /**
- *
- */
- class Message
- {
- function __construct()
- {
- }
- /*清退链接*/
- public function clear($client_id)
- {
- Gateway::closeClient($client_id);
- }
- public function ping()
- {
- // 用户端心跳
- }
- /*直接标记消息已读*/
- public function read_message($client_id, $data)
- {
- Db::name('fastchat_record')->where('id', $data['record_id'])->update(['status' => 1]);
- }
- /*推送消息*/
- public function push_message($client_id, $data)
- {
- if (!isset($data['token']) || !isset($data['service_user'])) {
- Gateway::closeClient($client_id);
- }
- // 验证 token
- $token = Common::getEncryptedToken($data['token']);
- $service_user = Db::name('fastchat_service_user')
- ->where('id', $data['service_user'])
- ->where('status', '1')
- ->where('deletetime', NULL)
- ->find();
- if (!$service_user || $service_user['token'] != $token) {
- Gateway::closeClient($client_id);
- }
- $service_user_id = $service_user['id'] . '||service_user';
- // 发送消息给用户
- if (isset($data['user'])) {
- $user = explode(',', $data['user']);
- foreach ($user as $key => $value) {
- $session_user = $value . '||user';
- Common::send_message($service_user_id, $session_user, $data['content']);
- }
- }
- // 发送消息给助教
- if (isset($data["massager"])) {
- $massager = explode(',', $data['massager']);
- foreach ($massager as $key => $value) {
- $session_user = $value . '||massager';
- Common::send_message($service_user_id, $session_user, $data['content']);
- }
- }
- // 发送消息给管理员
- if (isset($data['admin'])) {
- $user = explode(',', $data['admin']);
- foreach ($user as $key => $value) {
- $session_user = $value . '||admin';
- Common::send_message($service_user_id, $session_user, $data['content']);
- }
- }
- // 发送消息给用户组
- if (isset($data['user_group']) && $data['user_group']) {
- // 查得这个组中的所有用户
- $user = Db::name('user')->field('id')->whereIn('group_id', $data['user_group'])->select();
- foreach ($user as $key => $value) {
- $session_user = $value['id'] . '||user';
- Common::send_message($service_user_id, $session_user, $data['content']);
- }
- }
- // 发送消息给管理员组
- if (isset($data['admin_group']) && $data['admin_group']) {
- // 查得这个组中的所有管理员
- $user = Db::name('auth_group_access')->field('uid')->distinct(true)->where('group_id', $data['admin_group'])->select();
- foreach ($user as $key => $value) {
- $session_user = $value['uid'] . '||admin';
- Common::send_message($service_user_id, $session_user, $data['content']);
- }
- }
- }
- public function del_session($client_id, $data)
- {
- $session_info = Db::name('fastchat_session')->where('id', $data['session_id'])->find();
- if (!$session_info) {
- Gateway::sendToClient($client_id, json_encode(['msgtype' => 'del_session', 'code' => 0, 'msg' => '会话找不到啦!']));
- }
- if ($session_info['deleteuser'] && $session_info['deleteuser'] != $_SESSION['user_id']) {
- Db::name('fastchat_session')->where('id', $data['session_id'])->update(['deletetime' => time()]);
- } else {
- Db::name('fastchat_session')->where('id', $data['session_id'])->update(['deleteuser' => $_SESSION['user_id']]);
- }
- }
- public function send_message($client_id, $data)
- {
- if (!isset($data['session_id'])) {
- Gateway::sendToClient($client_id, json_encode(['msgtype' => 'send_message', 'code' => 0, 'msg' => '发送失败,会话找不到啦!']));
- }
- $session_info = Db::name('fastchat_session')->where('id', $data['session_id'])->find();
- if (!$session_info) {
- Gateway::sendToClient($client_id, json_encode(['msgtype' => 'send_message', 'code' => 0, 'msg' => '发送失败,会话找不到啦!']));
- }
- // 确定收信人
- $session_user = Common::session_user($session_info);
- $res = Common::send_message($_SESSION['user_id'], $session_user, $data['message']);
- Gateway::sendToClient($client_id, json_encode($res));
- }
- /*聊天记录*/
- public function chat_record($client_id, $data)
- {
- $page_count = 20;//一次加载20条
- if (!isset($data['session_id'])) {
- Gateway::sendToClient($client_id, json_encode(['msgtype' => 'chat_record', 'code' => 1, 'data' =>
- [
- 'chat_record' => [],
- 'session_info' => [
- 'nickname' => '无会话'
- ],
- 'next_page' => 'done',
- 'page' => $data['page']
- ]
- ]));
- return '';
- }
- if (!isset($data['page'])) {
- $data['page'] = 1;
- }
- $chat_record_count = Db::name('fastchat_record')
- ->where('session_id', $data['session_id'])
- ->where('is_del', 0)
- ->count('id');
- $page_number = ceil($chat_record_count / $page_count);
- if ($data['page'] == 1) {
- $min = 0;
- } else {
- $min = ($data['page'] - 1) * $page_count;
- }
- // 会话信息
- $session_info = Db::name('fastchat_session')->where('id', $data['session_id'])->find();
- if (!$session_info) {
- Gateway::sendToClient($client_id, json_encode(['msgtype' => 'chat_record', 'code' => 0, 'msg' => '会话找不到啦!']));
- }
- // 标记此会话所有不是当前用户发的消息为已读->SQL不使用不等于->查得会话对象的ID
- $session_user = Common::session_user($session_info);
- Db::name('fastchat_record')->where('sender', $session_user)->where('status', 0)->update(['status' => 1]);
- $session_user_info = Common::user_info($session_user);
- // 是否屏蔽此人
- $session_user_info['blacklist'] = Db::name('fastchat_blacklist')
- ->where('user_id', $_SESSION['user_id'])
- ->where('session_user_id', $session_user)
- ->value('id');
- $chat_record = Db::name('fastchat_record')
- ->where('session_id', $data['session_id'])
- ->where('is_del', 0)
- ->limit($min, $page_count)
- ->order('createtime desc')
- ->select();
- if ($data['page'] == 1) {
- $chat_record = array_reverse($chat_record, false);
- }
- // 消息按时间分组
- if ($chat_record) {
- $record_temp = [];
- $createtime = $chat_record[0]['createtime'];
- foreach ($chat_record as $key => $value) {
- $value['sender'] = ($value['sender'] == $_SESSION['user_id']) ? 'me' : 'you';
- $value['message'] = htmlspecialchars_decode($value['message']);
- if (($value['createtime'] - $createtime) < 3600) {
- $record_temp[$createtime][] = $value;
- } else {
- $createtime = $value['createtime'];
- $record_temp[$createtime][] = $value;
- }
- }
- unset($chat_record);
- foreach ($record_temp as $key => $value) {
- $chat_record[] = [
- 'datetime' => Common::format_time($key),
- 'data' => $value
- ];
- }
- unset($record_temp);
- } else {
- $chat_record[] = [
- 'datetime' => '还没有消息',
- 'data' => []
- ];
- }
- Gateway::sendToClient($client_id, json_encode(['msgtype' => 'chat_record', 'code' => 1, 'data' =>
- [
- 'chat_record' => $chat_record,
- 'session_info' => $session_user_info,
- 'next_page' => ($data['page'] >= $page_number) ? 'done' : $data['page'] + 1,
- 'page' => $data['page']
- ]
- ]));
- }
- /*获取会话列表*/
- public function session_list($client_id, $data)
- {
- $user = Common::user_info($_SESSION['user_id']);
- $session_list = Db::name('fastchat_session')
- ->where(function ($query) {
- $query->where('user_id', $_SESSION['user_id'])->where('deletetime', null);
- })->whereOr(function ($query) use ($user) {
- $query->where('session_user_id', $user['id'])->where('session_type', $user['session_type'])->where('deletetime', null);
- })
- ->order('createtime desc')
- ->select();
- if (!$session_list) {
- // 添加需要自动添加的会话
- $auto_add_session = Db::name('fastchat_service_user')
- ->field('CONCAT(id,"||service_user") as id,CONCAT(admin_id,"||admin") as admin_id,welcome_news,add_sessiondata')
- ->where("add_sessiondata='0' OR add_sessiondata='1'")
- ->where('status', '1')
- ->where('deletetime', NULL)
- ->select();
- foreach ($auto_add_session as $key => $value) {
- if (($value['add_sessiondata'] == 0 && Gateway::isUidOnline($value['id'])) || $value['add_sessiondata'] == 1) {
- $session = $session_list[] = Common::add_session($value['id']);
- // 发送欢迎消息
- if ($value['welcome_news']) {
- $message = [
- 'session_id' => $session['id'],
- 'sender' => $value['id'],
- 'message' => $value['welcome_news'],
- 'createtime' => time()
- ];
- Db::name('fastchat_record')->insert($message);
- }
- }
- }
- }
- $session_list = array_reverse($session_list, false);
- foreach ($session_list as $key => $value) {
- if ($value['deleteuser'] == $_SESSION['user_id']) {
- unset($session_list[$key]);
- continue;
- }
- $session_list[$key]['last_time'] = Common::format_time($value['createtime']);
- // 最后一条聊天记录
- $last_message = Db::name('fastchat_record')
- ->where('session_id', $value['id'])
- ->order('createtime desc')
- ->find();
- $session_list[$key]['session_user'] = $session_user = Common::session_user($value);
- $session_user_info = Common::user_info($session_user);
- $session_list[$key]['avatar'] = $session_user_info['avatar'];
- $session_list[$key]['nickname'] = $session_user_info['nickname'];
- if ($last_message) {
- $session_list[$key]['last_message'] = Common::session_message($last_message['message']);
- $last_message['message'] = htmlspecialchars_decode($last_message['message']);
- $session_list[$key]['last_time'] = Common::format_time($last_message['createtime']);
- } else if (isset($session_user_info['bio'])) {
- $session_list[$key]['last_message'] = $session_user_info['bio'];
- } else {
- $session_list[$key]['last_message'] = '';
- }
- // 未读消息条数->查询不是当前用户发送的消息
- $session_list[$key]['unread_msg_count'] = Db::name('fastchat_record')
- ->where('session_id', $value['id'])
- ->where('sender', $session_user)
- ->where('status', 0)
- ->count('id');
- // 会话对象是否在线
- if ($session_user_info['session_type'] == 5 && $session_user_info['online_status'] == 0) {
- $session_list[$key]['online'] = 1;
- } else {
- $session_list[$key]['online'] = Gateway::isUidOnline($session_user);
- }
- }
- $session_list = array_values($session_list);
- Gateway::sendToClient($client_id, json_encode(['msgtype' => 'message_list', 'data' => $session_list]));
- }
- /*搜索用户*/
- public function search_user($client_id, $keywords)
- {
- $config_data = get_addon_config('fastchat');
- $where = array();
- $session_type = explode(',', $config_data['session_type']);
- foreach ($session_type as $key => $value) {
- switch ($value) {
- case "username":
- $where['username'] = ['like', '%' . $keywords . '%'];
- break;
- case "usermobile":
- $where['mobile'] = $keywords;
- break;
- case "userid":
- $where['id'] = $keywords;
- break;
- case "nickname":
- $where['nickname'] = ['like', '%' . $keywords . '%'];
- break;
- }
- }
- // 每种身份最多搜索出 8 位预选人,可随意调整
- $user_list = Db::name('user')->field('CONCAT(id,"||user") as id,nickname,avatar')->whereOr($where)->limit(8)->select();
- unset($where['mobile']);
- if ($config_data['user_to_admin'] == 1) {
- $admin_list = Db::name('admin')->field('CONCAT(id,"||admin") as id,nickname,avatar')->whereOr($where)->limit(8)->select();
- } else {
- $admin_list = array();
- }
- if (isset($where['username'])) {
- $where['nickname'] = $where['username'];
- unset($where['username']);
- }
- $service_users = Db::name('fastchat_service_user')
- ->field('CONCAT(id,"||service_user") as id,nickname,avatar')
- ->whereOr($where)
- ->limit(8)
- ->select();
- $user_list = array_merge($user_list, $admin_list, $service_users);
- foreach ($user_list as $key => $value) {
- $user_list[$key]['avatar'] = $value['avatar'] ? cdnurl($value['avatar'], $_SESSION['origin']) : $_SESSION['origin'] . '/assets/img/avatar.png';
- // 去掉用户自己
- if ($value['id'] == $_SESSION['user_id']) {
- unset($user_list[$key]);
- }
- }
- $user_list = array_values($user_list);
- Gateway::sendToClient($client_id, json_encode(['msgtype' => 'search_user', 'data' => $user_list]));
- }
- /*屏蔽会话*/
- public function shielding_session($client_id, $data)
- {
- if (!isset($data['session_id']) || $data['session_id'] <= 0) {
- Gateway::sendToClient($client_id, json_encode(['msgtype' => 'shielding_session', 'code' => 0, 'msg' => '会话找不到啦!']));
- return;
- }
- $session_info = Db::name('fastchat_session')->where('id', $data['session_id'])->find();
- if (!$session_info) {
- Gateway::sendToClient($client_id, json_encode(['msgtype' => 'shielding_session', 'code' => 0, 'msg' => '会话找不到啦!']));
- }
- // 获取会话人
- $session_user_id = Common::session_user($session_info);
- $blacklist_id = Db::name('fastchat_blacklist')
- ->where('user_id', $_SESSION['user_id'])
- ->where('session_user_id', $session_user_id)
- ->value('id');
- if ($blacklist_id) {
- if (Db::name('fastchat_blacklist')->where('id', $blacklist_id)->delete()) {
- Gateway::sendToClient($client_id, json_encode(['msgtype' => 'shielding_session', 'code' => 2, 'session_id' => $data['session_id']]));
- } else {
- Gateway::sendToClient($client_id, json_encode(['msgtype' => 'shielding_session', 'code' => 0, 'msg' => '操作失败,请重试!']));
- }
- return;
- }
- $blacklist = [
- 'user_id' => $_SESSION['user_id'],
- 'session_user_id' => $session_user_id,
- 'createtime' => time()
- ];
- if (Db::name('fastchat_blacklist')->insert($blacklist)) {
- Gateway::sendToClient($client_id, json_encode(['msgtype' => 'shielding_session', 'code' => 1, 'session_id' => $data['session_id']]));
- } else {
- Gateway::sendToClient($client_id, json_encode(['msgtype' => 'shielding_session', 'code' => 0, 'msg' => '操作失败,请重试!']));
- }
- }
- /*添加会话*/
- public function add_session($client_id, $data)
- {
- $config_data = get_addon_config('fastchat');
- if (!isset($data['user_id']) || $data['user_id'] <= 0) {
- Gateway::sendToClient($client_id, json_encode(['msgtype' => 'add_session', 'code' => 0, 'msg' => '用户找不到啦!']));
- return;
- }
- $session_user = Common::user_info($data['user_id']);
- $user_info = Common::user_info($_SESSION['user_id']);
- if ($user_info['session_type'] == 2 || $user_info['session_type'] == 3 || $user_info['session_type'] == 4) {
- if (!$config_data['anonymous_to_admin'] && $session_user['session_type'] == 1) {
- Gateway::sendToClient($client_id, json_encode(['msgtype' => 'add_session', 'code' => 0, 'msg' => '禁止匿名向管理员发起会话!']));
- return;
- }
- if (!$config_data['anonymous_to_user'] && $session_user['session_type'] == 0) {
- Gateway::sendToClient($client_id, json_encode(['msgtype' => 'add_session', 'code' => 0, 'msg' => '禁止匿名向用户发起会话!']));
- return;
- }
- }
- // 插入会话表
- $existing_session = false;
- $session = Db::name('fastchat_session')->where(function ($query) use ($session_user) {
- $query->where('user_id', $_SESSION['user_id'])
- ->where('session_type', $session_user['session_type'])
- ->where('session_user_id', $session_user['id']);
- })->whereOr(function ($query) use ($data, $user_info) {
- $query->where('user_id', $data['user_id'])
- ->where('session_type', $user_info['session_type'])
- ->where('session_user_id', $user_info['id']);
- })
- ->find();
- if (!$session) {
- $session = [
- 'user_id' => $_SESSION['user_id'],
- 'session_type' => $session_user['session_type'],
- 'session_user_id' => $session_user['id'],
- 'createtime' => time()
- ];
- Db::name('fastchat_session')->insert($session);
- $session['id'] = Db::name('fastchat_session')->getLastInsID();
- } else {
- // 会话列表已存在此会话,修改会话的时间
- $existing_session = true;
- if ($session['deletetime']) {
- // deleteuser 改为对方
- $session_user_id = Common::session_user($session);
- Db::name('fastchat_session')->where('id', $session['id'])->update(['deleteuser' => $session_user_id, 'deletetime' => NULL, 'createtime' => time()]);
- } else if ($session['deleteuser'] == $_SESSION['user_id']) {
- Db::name('fastchat_session')->where('id', $session['id'])->update(['deleteuser' => '', 'deletetime' => NULL, 'createtime' => time()]);
- } else {
- Db::name('fastchat_session')->where('id', $session['id'])->update(['createtime' => time()]);
- }
- }
- // 用户与客服聊天
- if (strstr($_SESSION["user_id"], "service_user") || $session["session_type"] == 5) {
- $record = Db::name("fastchat_record")->where([
- "session_id" => $session["id"],
- "message" => "您稍等,客服正在接通中..."
- ]);
- if (!$record) {
- Db::name("fastchat_record")->insert([
- "session_id" => $session["id"],
- "sender" => strstr($_SESSION["user_id"], "service_user") ? $_SESSION["user_id"] : "{$session["session_user_id"]}||service_user",
- "message" => "您稍等,客服正在接通中...",
- "status" => 0,
- "is_del" => 0,
- "createtime" => time()
- ]);
- }
- }
- // 用户与助教聊天
- if (strstr($_SESSION["user_id"], "massager") || $session["session_type"] == 6) {
- $record = Db::name("fastchat_record")->where([
- "session_id" => $session["id"],
- "message" => "客户,您好!"
- ]);
- if (!$record) {
- Db::name("fastchat_record")->insert([
- "session_id" => $session["id"],
- "sender" => strstr($_SESSION["user_id"], "massager") ? $_SESSION["user_id"] : "{$session["session_user_id"]}||massager",
- "message" => "客户,您好!",
- "status" => 0,
- "is_del" => 0,
- "createtime" => time()
- ]);
- }
- }
- // 读取最后一条聊天记录
- $last_message = Db::name('fastchat_record')
- ->where('session_id', $session['id'])
- ->order('createtime desc')
- ->find();
- if ($last_message) {
- $last_message_text = $last_message['message'];
- } else if (isset($session_user['bio'])) {
- $last_message_text = $session_user['bio'];
- } else {
- $last_message_text = '';
- }
- $blacklist_id = Db::name('fastchat_blacklist')
- ->where('user_id', $_SESSION['user_id'])
- ->where('session_user_id', $data['user_id'])
- ->value('id');
- $resdata = [
- 'id' => $session['id'],
- 'avatar' => $session_user['avatar'],
- 'nickname' => isset($session_user['nickname']) ? $session_user['nickname'] : (isset($session_user["name"]) ? $session_user["name"] : "未知"),
- 'last_message' => Common::session_message($last_message_text),
- 'existing_session' => $existing_session,
- 'blacklist' => $blacklist_id
- ];
- // 会话对象是否在线
- if ($session_user['session_type'] == 5 && $session_user['online_status'] == 0) {
- $resdata['online'] = 1;
- } else {
- if (!isset($session_user_id)) {
- $session_user_id = Common::session_user($session);
- }
- $resdata['session_user'] = $session_user_id;
- $resdata['online'] = Gateway::isUidOnline($session_user_id);
- }
- if ($existing_session || !$last_message['createtime']) {
- $resdata['last_time'] = Common::format_time(null);
- } else {
- $resdata['last_time'] = Common::format_time($last_message['createtime']);
- }
- dump($resdata);
- Gateway::sendToClient($client_id, json_encode(['msgtype' => 'add_session', 'code' => 1, 'data' => $resdata]));
- }
- }
|