聊天,基本完结
This commit is contained in:
@@ -2,16 +2,10 @@
|
|||||||
namespace app\chat\model;
|
namespace app\chat\model;
|
||||||
|
|
||||||
|
|
||||||
|
use support\think\Db;
|
||||||
|
|
||||||
class ChatGroupMember extends BaseModel
|
class ChatGroupMember extends BaseModel
|
||||||
{
|
{
|
||||||
public $tabla_name = 'chat_group_member';
|
public $tabla_name = 'chat_group_member';
|
||||||
|
|
||||||
// 是否退群
|
|
||||||
public static function getUserQuit($uid, $group_id)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -49,6 +49,7 @@ class ChatMessage extends BaseModel
|
|||||||
$avatar = $chat_user['avatar'];
|
$avatar = $chat_user['avatar'];
|
||||||
$name = $chat_user['nick_name'];
|
$name = $chat_user['nick_name'];
|
||||||
$group_id = '';
|
$group_id = '';
|
||||||
|
$data[$i]['user_id'] = $session['group_id'];
|
||||||
}elseif($session['chat_type'] == 2) {
|
}elseif($session['chat_type'] == 2) {
|
||||||
$group_info = Db::name('chat_group')->where(['id' => $session['group_id']])->field('id,name,avatar')->find();
|
$group_info = Db::name('chat_group')->where(['id' => $session['group_id']])->field('id,name,avatar')->find();
|
||||||
$avatar = $group_info['avatar'];
|
$avatar = $group_info['avatar'];
|
||||||
@@ -57,6 +58,7 @@ class ChatMessage extends BaseModel
|
|||||||
if($lastMsg) {
|
if($lastMsg) {
|
||||||
$chat_user = Db::name('chat_user')->where(['user_id' => $lastMsg['from_id']])->field('nick_name,avatar')->find();
|
$chat_user = Db::name('chat_user')->where(['user_id' => $lastMsg['from_id']])->field('nick_name,avatar')->find();
|
||||||
}
|
}
|
||||||
|
$data[$i]['user_id'] = $group_id;
|
||||||
}
|
}
|
||||||
// 单聊的话 两个人对话用一样的会话ID
|
// 单聊的话 两个人对话用一样的会话ID
|
||||||
$msg = '';
|
$msg = '';
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
namespace extend\chat\model;
|
namespace extend\chat\model;
|
||||||
|
|
||||||
use app\chat\model\ChatGroupMute;
|
use app\chat\model\ChatGroupMute;
|
||||||
|
use app\chat\model\ChatMessage;
|
||||||
use app\exception\MyBusinessException;
|
use app\exception\MyBusinessException;
|
||||||
use ba\Random;
|
use ba\Random;
|
||||||
use GatewayWorker\Lib\Gateway;
|
use GatewayWorker\Lib\Gateway;
|
||||||
@@ -70,25 +71,70 @@ namespace extend\chat\model;
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static function init(string $client_id, array $message)
|
public static function insertChatUser()
|
||||||
{
|
{
|
||||||
self::$user_info = self::getUser($message['token']);
|
// 存入chat_user
|
||||||
// 先拿到会话列表
|
// 如果是用户
|
||||||
$list_json = Redis::get('usermsg:list:' . self::$user_info['user_type'] . ':' . self::$user_info['uid']);
|
if(self::$user_info['user_type'] == 1) {
|
||||||
$list_arr = [];
|
$chat_user = Db::name('chat_user')->where(['user_id' => self::$user_info['uid'], 'type' => 1])->find();
|
||||||
// 绑定自己的UID
|
if(!$chat_user) {
|
||||||
Gateway::bindUid($client_id, self::getUid(self::$user_info['uid'], self::$user_info['user_type']));
|
$user_info = Db::name('tb_user_info')->where(['id' => self::$user_info['uid']])->find();
|
||||||
if($list_json) {
|
if($user_info) {
|
||||||
$list_arr = json_decode($list_json, true);
|
Db::name('chat_user')->insert([
|
||||||
// 挨个加入分组
|
'user_id' => self::$user_info['uid'],
|
||||||
foreach ($list_arr as $k => $list) {
|
'nick_name' => $user_info['nick_name'],
|
||||||
if($list['chat_type'] == 2) {
|
'avatar' => $user_info['head_img'],
|
||||||
// 如果是群聊 按照会话ID加入分组 不能按照会话ID绑定
|
'type' => 1,
|
||||||
Gateway::joinGroup($client_id, $list['group_id']);
|
'created_time' => d(),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}elseif (self::$user_info['user_type'] == 2) {
|
||||||
|
// 如果是商家
|
||||||
|
$chat_user = Db::name('chat_user')->where(['user_id' => self::$user_info['uid'], 'type' => 2])->find();
|
||||||
|
if(!$chat_user) {
|
||||||
|
$sys_user_info = Db::name('sys_user')->where(['id' => self::$user_info['uid']])->find();
|
||||||
|
if($sys_user_info) {
|
||||||
|
Db::name('chat_user')->insert([
|
||||||
|
'user_id' => self::$user_info['uid'],
|
||||||
|
'nick_name' => $sys_user_info['nick_name'],
|
||||||
|
'avatar' => $sys_user_info['avatar'],
|
||||||
|
'type' => 2,
|
||||||
|
'created_time' => d(),
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return $list_arr;
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public static function init(string $client_id, array $message)
|
||||||
|
{
|
||||||
|
self::$user_info = self::getUser($message['token']);
|
||||||
|
// 存入chat_user
|
||||||
|
self::insertChatUser();
|
||||||
|
$list_arr = [];
|
||||||
|
// 绑定自己的UID
|
||||||
|
Gateway::bindUid($client_id, self::getUid(self::$user_info['uid'], self::$user_info['user_type']));
|
||||||
|
// 先拿到会话列表
|
||||||
|
$list_json = Redis::get('usermsg:list:' . self::$user_info['user_type'] . ':' . self::$user_info['uid']);
|
||||||
|
if($list_json) {
|
||||||
|
$list_arr = json_decode($list_json, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 回馈
|
||||||
|
Gateway::sendToClient($client_id, self::sendGormat($message, $list_arr));
|
||||||
|
|
||||||
|
$str_uid = self::getUid(self::$user_info['uid'], self::$user_info['user_type']);
|
||||||
|
// 上线后立马发送没有发送的消息
|
||||||
|
$send_data = Redis::get('nosuccessful:message:sent:' . $str_uid);
|
||||||
|
if($send_data) {
|
||||||
|
Gateway::sendToClient($client_id, $send_data);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -98,6 +144,19 @@ namespace extend\chat\model;
|
|||||||
$group_id = null;
|
$group_id = null;
|
||||||
if($message['chat_type'] == 2) {
|
if($message['chat_type'] == 2) {
|
||||||
$group_id = $message['to_id'];
|
$group_id = $message['to_id'];
|
||||||
|
// 查询此人是否再群里
|
||||||
|
$is_member = Db::name('chat_group_member')->where(['group_id' => $group_id, 'user_id' => self::$user_info['uid']])->find();
|
||||||
|
if(!$is_member) {
|
||||||
|
Gateway::sendToClient($client_id, json_encode(['msg' => '你不在群内无法发言']));
|
||||||
|
return;
|
||||||
|
}else {
|
||||||
|
// 被踢或者退出
|
||||||
|
if($is_member['quit_time'] || $is_member['is_kicked'] == 1) {
|
||||||
|
Gateway::sendToClient($client_id, json_encode(['msg' => '你不在群内无法发言']));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 查询此人是否被禁言
|
// 查询此人是否被禁言
|
||||||
$chat_group_mute = ChatGroupMute::getUserMuteStatus(self::$user_info['uid'], $group_id);
|
$chat_group_mute = ChatGroupMute::getUserMuteStatus(self::$user_info['uid'], $group_id);
|
||||||
if($chat_group_mute['is_mute'] == 1) {
|
if($chat_group_mute['is_mute'] == 1) {
|
||||||
@@ -108,12 +167,6 @@ namespace extend\chat\model;
|
|||||||
Gateway::sendToClient($client_id, json_encode(['msg' => '你已被永久禁言']));
|
Gateway::sendToClient($client_id, json_encode(['msg' => '你已被永久禁言']));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 是否退群
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
$session_id = $message['session_id'];
|
$session_id = $message['session_id'];
|
||||||
if(empty($session_id)) {
|
if(empty($session_id)) {
|
||||||
@@ -131,6 +184,12 @@ namespace extend\chat\model;
|
|||||||
if($to_message_one && !$from_message_one) {
|
if($to_message_one && !$from_message_one) {
|
||||||
$session_id = $to_message_one['session_id'];
|
$session_id = $to_message_one['session_id'];
|
||||||
}
|
}
|
||||||
|
// 加入未读计数
|
||||||
|
if(!Db::name('chat_unread_count')->where(['user_id' => $message['to_id']])->find()) {
|
||||||
|
Db::name('chat_unread_count')->where(['user_id' => $message['to_id'], 'session_id' => $session_id])->update(['count' => 1, 'updated_time' => d()]);
|
||||||
|
}else {
|
||||||
|
Db::name('chat_unread_count')->where(['user_id' => $message['to_id'], 'session_id' => $session_id])->inc('count')->update(['updated_time' => d()]);
|
||||||
|
}
|
||||||
}elseif ($message['chat_type'] == 2) {
|
}elseif ($message['chat_type'] == 2) {
|
||||||
// 群聊
|
// 群聊
|
||||||
// 如果发过群聊消息
|
// 如果发过群聊消息
|
||||||
@@ -142,11 +201,82 @@ namespace extend\chat\model;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
$time = d();
|
||||||
|
// 通知数据
|
||||||
|
$notice_data = [
|
||||||
|
'from_id' => self::$user_info['uid'],
|
||||||
|
'to_id' => $message['to_id'],
|
||||||
|
'operate_type' => $message['operate_type'],
|
||||||
|
'group_id' => $group_id,
|
||||||
|
'chat_type' => $message['chat_type'],
|
||||||
|
'msg_type' => $message['msg_type'],
|
||||||
|
'content' => $message['content'],
|
||||||
|
'image_url' => $message['image_url'],
|
||||||
|
'order_id' => $message['order_id'],
|
||||||
|
'send_time' => $time,
|
||||||
|
'session_id' => $session_id,
|
||||||
|
];
|
||||||
|
$res = Db::name('chat_message')->insert($notice_data);
|
||||||
|
if(!$res) {
|
||||||
|
// 插入失败
|
||||||
|
Gateway::sendToClient($client_id, self::sendGormat($message, [], 0));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果是单聊推给对方
|
||||||
|
if($message['chat_type'] == 1) {
|
||||||
|
if($message['to_user_type'] == 1) {
|
||||||
|
$chat_user = Db::name('chat_user')->where(['user_id' => $message['to_id'], 'type' => 1])->find();
|
||||||
|
}else {
|
||||||
|
$chat_user = Db::name('chat_user')->where(['user_id' => $message['to_id'], 'type' => 2])->find();
|
||||||
|
}
|
||||||
|
// 通知数据中加入会话信息
|
||||||
|
$notice_data['avatar'] = $chat_user['avatar'];
|
||||||
|
$notice_data['nick_name'] = $chat_user['nick_name'];
|
||||||
|
$str_uid = self::getUid($message['to_id'], $message['to_user_type']);
|
||||||
|
// 更新对方会话列表
|
||||||
|
ChatMessage::getconverlist($message['to_id'], $message['to_user_type']);
|
||||||
|
// 对方是否在线,在线发 不在线存起来等上线了发
|
||||||
|
if(Gateway::isUidOnline($str_uid)) {
|
||||||
|
Gateway::sendToUid($str_uid, self::sendReceive($notice_data));
|
||||||
|
return;
|
||||||
|
}else {
|
||||||
|
// 不在线的存下来等上线了发
|
||||||
|
Redis::set('nosuccessful:message:sent:' . $str_uid, json_encode($notice_data));
|
||||||
|
}
|
||||||
|
|
||||||
Db::name()->insert();
|
}elseif ($message['chat_type'] == 2) {
|
||||||
// 通知
|
// 群聊
|
||||||
|
$group = Db::name('chat_group')->where(['id' => $message['to_id']])->find();
|
||||||
|
// 通知数据中加入会话信息
|
||||||
|
$notice_data['avatar'] = $group['avatar'];
|
||||||
|
$notice_data['nick_name'] = $group['name'];
|
||||||
|
|
||||||
|
// 找到群组中的人,挨个通知,退群的不通知,自己不通知
|
||||||
|
$group_user = Db::name('chat_group_member')->where(['group_id' => $group_id, 'quit_time' => null, 'is_kicked' => 0])->select()->toArray();
|
||||||
|
foreach ($group_user as $k => $grep) {
|
||||||
|
if($grep['user_id'] != self::$user_info['uid']) {
|
||||||
|
$user_type = $grep['role']==1?2:1;
|
||||||
|
$str_uid = self::getUid($grep['user_id'], $user_type);
|
||||||
|
// 群成员是否在线,在线发 不在线存起来等上线了发
|
||||||
|
if(Gateway::isUidOnline($str_uid)) {
|
||||||
|
Gateway::sendToUid($str_uid, self::sendReceive($notice_data));
|
||||||
|
return;
|
||||||
|
}else {
|
||||||
|
// 不在线的存下来等上线了发
|
||||||
|
Redis::set('nosuccessful:message:sent:' . $str_uid, json_encode($notice_data));
|
||||||
|
}
|
||||||
|
// 加入未读计数
|
||||||
|
if(!Db::name('chat_unread_count')->where(['user_id' => $grep['user_id']])->find()) {
|
||||||
|
Db::name('chat_unread_count')->where(['user_id' => $grep['user_id'], 'session_id' => $session_id])->update(['count' => 1, 'updated_time' => d()]);
|
||||||
|
}else {
|
||||||
|
Db::name('chat_unread_count')->where(['user_id' => $grep['user_id'], 'session_id' => $session_id])->inc('count')->update(['updated_time' => d()]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 给发送者反馈
|
||||||
|
Gateway::sendToClient($client_id, self::sendGormat($message));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -156,12 +286,27 @@ namespace extend\chat\model;
|
|||||||
return $user_type . '_' . $uid;
|
return $user_type . '_' . $uid;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function sendGormat($message, $data, $status = 1):string
|
|
||||||
{
|
|
||||||
|
|
||||||
|
// 发送者反馈
|
||||||
|
public static function sendGormat($message, $data = [], $status = 1):string
|
||||||
|
{
|
||||||
|
$data = [
|
||||||
|
'type' => $message['type'],
|
||||||
|
'operate_type' => $message['operate_type'],
|
||||||
|
'status' => $status,
|
||||||
|
'data' => $data
|
||||||
|
];
|
||||||
|
$json = json_encode($data);
|
||||||
|
return $json;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// 接收消息
|
||||||
|
public static function sendReceive($data = [], $status = 1):string
|
||||||
|
{
|
||||||
$data = [
|
$data = [
|
||||||
'type' => $message['type'],
|
'type' => 'chat',
|
||||||
'operate_type' => $message['operate_type'],
|
'operate_type' => 'receive_msg',
|
||||||
'status' => $status,
|
'status' => $status,
|
||||||
'data' => $data
|
'data' => $data
|
||||||
];
|
];
|
||||||
@@ -171,4 +316,6 @@ namespace extend\chat\model;
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -18,7 +18,7 @@ class OnbocChat extends Base
|
|||||||
// 初始化
|
// 初始化
|
||||||
public static function init(string $client_id, array $message)
|
public static function init(string $client_id, array $message)
|
||||||
{
|
{
|
||||||
Gateway::sendToClient($client_id, self::sendGormat($message, Base::init($client_id, $message)));
|
Base::init($client_id, $message);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function sendMsg(string $client_id, array $message)
|
public static function sendMsg(string $client_id, array $message)
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ class ShoppingChat extends Base
|
|||||||
// 初始化
|
// 初始化
|
||||||
public static function init(string $client_id, array $message):void
|
public static function init(string $client_id, array $message):void
|
||||||
{
|
{
|
||||||
Gateway::sendToClient($client_id, self::sendGormat($message, Base::init($client_id, $message)));
|
Base::init($client_id, $message);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function sendMsg(string $client_id, array $message)
|
public static function sendMsg(string $client_id, array $message)
|
||||||
|
|||||||
Reference in New Issue
Block a user