108 lines
4.1 KiB
PHP
108 lines
4.1 KiB
PHP
<?php
|
|
namespace app\chat\model;
|
|
|
|
|
|
use ba\Random;
|
|
use support\Redis;
|
|
use support\think\Db;
|
|
|
|
class ChatMessage extends BaseModel
|
|
{
|
|
public $tabla_name = 'chat_message';
|
|
|
|
public static function getconverlist($uid, $user_type)
|
|
{
|
|
|
|
// 获取所有会话ID 自己发送过消息的或者别人发送过消息的
|
|
$sessionIds = Db::name('chat_message')->where('from_id', $uid)->WhereOr('to_id', $uid)
|
|
->group('session_id')->field('session_id,to_id as group_id,chat_type')->select()->toArray();
|
|
// 查看自己加了那些群
|
|
$group_arr = Db::name('chat_group_member')->where(['user_id' => $uid])->field('group_id')->select()->toArray();
|
|
|
|
$data = [];
|
|
if($sessionIds) {
|
|
foreach ($sessionIds as $k => $session_id) {
|
|
if($group_arr) {
|
|
foreach ($group_arr as $gk => &$group) {
|
|
$group['session_id'] = Random::build('alnum', 32);;
|
|
$group['chat_type'] = 2;
|
|
if ($session_id['chat_type'] == 2) {
|
|
if ($group['group_id'] == $session_id['group_id']) {
|
|
unset($group_arr[$gk]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}else {
|
|
if($group_arr) {
|
|
foreach ($group_arr as $gk => &$group) {
|
|
$group['session_id'] = Random::build('alnum', 32);;
|
|
$group['chat_type'] = 2;
|
|
}
|
|
}
|
|
}
|
|
$sessionIds = array_merge($sessionIds, $group_arr);
|
|
$group_id = '';
|
|
foreach ($sessionIds as $k => $session) {
|
|
$data[$k]['user_id'] = $uid;
|
|
if($session['chat_type'] == 1) {
|
|
$chat_user = Db::name('tb_user_info')->where(['id' => $session['group_id']])->field('nick_name,avatar')->find();
|
|
$avatar = $chat_user['head_img'];
|
|
$name = $chat_user['nick_name'];
|
|
$group_id = '';
|
|
$data[$k]['to_id'] = $session['group_id'];
|
|
}elseif($session['chat_type'] == 2) {
|
|
$group_info = Db::name('chat_group')->where(['id' => $session['group_id']])->field('id,name,avatar')->find();
|
|
$avatar = $group_info['avatar'];
|
|
$group_id = $group_info['id'];
|
|
$name = $group_info['name'];
|
|
$data[$k]['to_id'] = $group_id;
|
|
|
|
// 获取本人在群里的状态
|
|
$group_member = Db::name('chat_group_member')->where(['group_id' => $session['group_id'], 'user_id' => $uid])->find();
|
|
$data[$k]['member_status'] = 0;
|
|
// 如果在群里并且没有退群和被踢
|
|
if($group_member && $group_member['quit_time'] == null && $group_member['is_kicked'] == 0) {
|
|
$data[$k]['member_status'] = 1;
|
|
}
|
|
}
|
|
// 单聊的话 两个人对话用一样的会话ID
|
|
$data[$k]['avatar'] = $avatar;
|
|
$data[$k]['chat_type'] = $session['chat_type'];
|
|
$data[$k]['session_id'] = $session['session_id'];
|
|
$data[$k]['name'] = $name;
|
|
$data[$k]['group_id'] = $group_id;
|
|
$data[$k]['is_del'] = 0;
|
|
}
|
|
Redis::set('usermsg:list:' . $user_type . ':' . $uid, json_encode($data));
|
|
return $data;
|
|
}
|
|
|
|
|
|
// 更新会话列表
|
|
public static function updateConverList($uid, $user_type, $group_id)
|
|
{
|
|
$is_update = 'ok_up';
|
|
$list_json = Redis::get('usermsg:list:' . $user_type . ':' . $uid);
|
|
if($list_json) {
|
|
$list_arr = json_decode($list_json, true);
|
|
foreach ($list_arr as $k => $list) {
|
|
// 如果找到会话列表并且没有删除,则不更新
|
|
if($list['group_id'] == $group_id && $list['is_del'] == 0) {
|
|
$is_update = 'no_up';
|
|
}
|
|
}
|
|
}
|
|
if($is_update == 'ok_up') {
|
|
self::getconverlist($uid, $user_type);
|
|
}
|
|
}
|
|
|
|
public static function getUserIsQuit($uid, $group_id)
|
|
{
|
|
// $auit = Db::name('')->where()->find();
|
|
}
|
|
|
|
|
|
} |