2020-11-02 22:45:37 +08:00
|
|
|
<?php
|
|
|
|
declare(strict_types=1);
|
2020-12-26 21:33:40 +08:00
|
|
|
/**
|
|
|
|
*
|
|
|
|
* This is my open source code, please do not use it for commercial applications.
|
|
|
|
*
|
|
|
|
* For the full copyright and license information,
|
|
|
|
* please view the LICENSE file that was distributed with this source code
|
|
|
|
*
|
|
|
|
* @author Yuandong<837215079@qq.com>
|
|
|
|
* @link https://github.com/gzydong/hyperf-chat
|
|
|
|
*/
|
2020-11-02 22:45:37 +08:00
|
|
|
|
|
|
|
namespace App\Amqp\Consumer;
|
|
|
|
|
2021-03-31 17:28:58 +08:00
|
|
|
use App\Model\Group\Group;
|
2020-11-22 23:10:00 +08:00
|
|
|
use Hyperf\Amqp\Annotation\Consumer;
|
|
|
|
use Hyperf\Amqp\Result;
|
|
|
|
use Hyperf\Amqp\Message\ConsumerMessage;
|
|
|
|
use Hyperf\Redis\Redis;
|
|
|
|
use Hyperf\Amqp\Message\Type;
|
|
|
|
use Hyperf\Amqp\Builder\QueueBuilder;
|
|
|
|
use PhpAmqpLib\Message\AMQPMessage;
|
|
|
|
use App\Model\User;
|
2020-11-29 14:44:11 +08:00
|
|
|
use App\Model\UsersFriend;
|
2020-11-21 19:53:01 +08:00
|
|
|
use App\Model\Chat\ChatRecord;
|
|
|
|
use App\Model\Chat\ChatRecordsCode;
|
|
|
|
use App\Model\Chat\ChatRecordsFile;
|
2020-11-21 22:47:21 +08:00
|
|
|
use App\Model\Chat\ChatRecordsInvite;
|
2020-11-29 14:44:11 +08:00
|
|
|
use App\Model\Chat\ChatRecordsForward;
|
|
|
|
use App\Service\SocketClientService;
|
2020-11-21 19:53:01 +08:00
|
|
|
use App\Service\SocketRoomService;
|
2020-12-01 17:47:25 +08:00
|
|
|
use App\Constants\SocketConstants;
|
2020-11-02 22:45:37 +08:00
|
|
|
|
|
|
|
/**
|
2020-11-27 19:48:41 +08:00
|
|
|
* 消息推送消费者队列
|
|
|
|
*
|
2020-11-29 14:44:11 +08:00
|
|
|
* @Consumer(name="ConsumerChat",enable=true)
|
2020-11-02 22:45:37 +08:00
|
|
|
*/
|
2020-11-04 11:57:16 +08:00
|
|
|
class ChatMessageConsumer extends ConsumerMessage
|
2020-11-02 22:45:37 +08:00
|
|
|
{
|
|
|
|
/**
|
|
|
|
* 交换机名称
|
|
|
|
*
|
|
|
|
* @var string
|
|
|
|
*/
|
2020-12-01 17:47:25 +08:00
|
|
|
public $exchange = SocketConstants::CONSUMER_MESSAGE_EXCHANGE;
|
2020-11-02 22:45:37 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* 交换机类型
|
|
|
|
*
|
|
|
|
* @var string
|
|
|
|
*/
|
|
|
|
public $type = Type::FANOUT;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 路由key
|
|
|
|
*
|
|
|
|
* @var string
|
|
|
|
*/
|
|
|
|
public $routingKey = 'consumer:im:message';
|
|
|
|
|
2020-11-04 07:54:11 +08:00
|
|
|
/**
|
2020-11-29 14:44:11 +08:00
|
|
|
* @var SocketClientService
|
2020-11-04 07:54:11 +08:00
|
|
|
*/
|
2020-11-29 14:44:11 +08:00
|
|
|
private $socketClientService;
|
2020-11-21 19:53:01 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @var SocketRoomService
|
|
|
|
*/
|
|
|
|
private $socketRoomService;
|
|
|
|
|
2020-11-27 19:48:41 +08:00
|
|
|
/**
|
2020-12-01 17:47:25 +08:00
|
|
|
* 消息事件与回调事件绑定
|
|
|
|
*
|
|
|
|
* @var array
|
2020-11-27 19:48:41 +08:00
|
|
|
*/
|
2020-11-22 23:10:00 +08:00
|
|
|
const EVENTS = [
|
2020-11-27 19:48:41 +08:00
|
|
|
// 聊天消息事件
|
2021-03-31 17:28:58 +08:00
|
|
|
SocketConstants::EVENT_TALK => 'onConsumeTalk',
|
2020-11-27 19:48:41 +08:00
|
|
|
|
|
|
|
// 键盘输入事件
|
2021-03-31 17:28:58 +08:00
|
|
|
SocketConstants::EVENT_KEYBOARD => 'onConsumeKeyboard',
|
2020-11-27 19:48:41 +08:00
|
|
|
|
|
|
|
// 用户在线状态事件
|
2020-12-01 17:47:25 +08:00
|
|
|
SocketConstants::EVENT_ONLINE_STATUS => 'onConsumeOnlineStatus',
|
2020-11-27 19:48:41 +08:00
|
|
|
|
|
|
|
// 聊天消息推送事件
|
2021-03-31 17:28:58 +08:00
|
|
|
SocketConstants::EVENT_REVOKE_TALK => 'onConsumeRevokeTalk',
|
2020-11-27 19:48:41 +08:00
|
|
|
|
|
|
|
// 好友申请相关事件
|
2021-03-31 17:28:58 +08:00
|
|
|
SocketConstants::EVENT_FRIEND_APPLY => 'onConsumeFriendApply'
|
2020-11-22 23:10:00 +08:00
|
|
|
];
|
|
|
|
|
2020-11-21 19:53:01 +08:00
|
|
|
/**
|
|
|
|
* ChatMessageConsumer constructor.
|
2020-11-29 14:44:11 +08:00
|
|
|
* @param SocketClientService $socketClientService
|
2020-11-22 23:10:00 +08:00
|
|
|
* @param SocketRoomService $socketRoomService
|
2020-11-21 19:53:01 +08:00
|
|
|
*/
|
2020-11-29 14:44:11 +08:00
|
|
|
public function __construct(SocketClientService $socketClientService, SocketRoomService $socketRoomService)
|
2020-11-03 17:12:57 +08:00
|
|
|
{
|
2020-11-29 14:44:11 +08:00
|
|
|
$this->socketClientService = $socketClientService;
|
2021-03-31 17:28:58 +08:00
|
|
|
$this->socketRoomService = $socketRoomService;
|
2020-12-01 17:47:25 +08:00
|
|
|
|
|
|
|
// 动态设置 Rabbit MQ 消费队列名称
|
2020-12-01 13:54:40 +08:00
|
|
|
$this->setQueue('queue:im_message:' . SERVER_RUN_ID);
|
2020-11-03 17:12:57 +08:00
|
|
|
}
|
|
|
|
|
2020-11-02 22:45:37 +08:00
|
|
|
/**
|
|
|
|
* 重写创建队列生成类
|
|
|
|
*
|
|
|
|
* 注释:设置自动删除队列
|
|
|
|
*
|
|
|
|
* @return QueueBuilder
|
|
|
|
*/
|
|
|
|
public function getQueueBuilder(): QueueBuilder
|
|
|
|
{
|
|
|
|
return parent::getQueueBuilder()->setAutoDelete(true);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 消费队列消息
|
|
|
|
*
|
|
|
|
* @param $data
|
|
|
|
* @param AMQPMessage $message
|
|
|
|
* @return string
|
|
|
|
*/
|
|
|
|
public function consumeMessage($data, AMQPMessage $message): string
|
2020-11-22 23:10:00 +08:00
|
|
|
{
|
|
|
|
if (isset($data['event'])) {
|
2020-12-01 17:47:25 +08:00
|
|
|
$redis = container()->get(Redis::class);
|
|
|
|
|
2021-03-31 17:28:58 +08:00
|
|
|
// [加锁]防止消息重复消费
|
2020-12-01 17:47:25 +08:00
|
|
|
$lockName = sprintf('ws:message-lock:%s:%s', SERVER_RUN_ID, $data['uuid']);
|
|
|
|
if (!$redis->rawCommand('SET', $lockName, 1, 'NX', 'EX', 60)) {
|
|
|
|
return Result::ACK;
|
|
|
|
}
|
|
|
|
|
|
|
|
// 调用对应事件绑定的回调方法
|
2020-11-22 23:10:00 +08:00
|
|
|
return $this->{self::EVENTS[$data['event']]}($data, $message);
|
|
|
|
}
|
|
|
|
|
|
|
|
return Result::ACK;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 对话聊天消息
|
|
|
|
*
|
|
|
|
* @param array $data 队列消息
|
|
|
|
* @param AMQPMessage $message
|
|
|
|
* @return string
|
|
|
|
*/
|
2020-12-01 13:54:40 +08:00
|
|
|
public function onConsumeTalk(array $data, AMQPMessage $message): string
|
2020-11-02 22:45:37 +08:00
|
|
|
{
|
2021-04-08 09:20:51 +08:00
|
|
|
$source = $data['data']['source'];
|
|
|
|
$fds = $this->socketClientService->findUserFds($data['data']['sender']);
|
|
|
|
$groupInfo = null;
|
2020-11-21 19:53:01 +08:00
|
|
|
|
|
|
|
if ($source == 1) {// 私聊
|
2020-11-29 14:44:11 +08:00
|
|
|
$fds = array_merge($fds, $this->socketClientService->findUserFds($data['data']['receive']));
|
2021-03-31 17:28:58 +08:00
|
|
|
} else if ($source == 2) {// 群聊
|
2020-11-22 23:10:00 +08:00
|
|
|
$userIds = $this->socketRoomService->getRoomMembers(strval($data['data']['receive']));
|
2020-11-21 19:53:01 +08:00
|
|
|
foreach ($userIds as $uid) {
|
2020-12-01 17:47:25 +08:00
|
|
|
$fds = array_merge($fds, $this->socketClientService->findUserFds((int)$uid));
|
2020-11-03 14:07:54 +08:00
|
|
|
}
|
2021-03-31 17:28:58 +08:00
|
|
|
|
2021-04-08 09:20:51 +08:00
|
|
|
$groupInfo = Group::where('id', $data['data']['receive'])->first(['group_name', 'avatar']);
|
2020-11-21 19:53:01 +08:00
|
|
|
}
|
|
|
|
|
2020-12-01 13:54:40 +08:00
|
|
|
// 客户端ID去重
|
2021-03-31 17:28:58 +08:00
|
|
|
if (!$fds = array_unique($fds)) return Result::ACK;
|
2020-11-21 19:53:01 +08:00
|
|
|
|
2020-11-21 22:47:21 +08:00
|
|
|
/**
|
|
|
|
* @var ChatRecord
|
|
|
|
*/
|
2020-11-21 19:53:01 +08:00
|
|
|
$result = ChatRecord::leftJoin('users', 'users.id', '=', 'chat_records.user_id')
|
2020-11-22 23:10:00 +08:00
|
|
|
->where('chat_records.id', $data['data']['record_id'])
|
2020-11-21 19:53:01 +08:00
|
|
|
->first([
|
|
|
|
'chat_records.id',
|
|
|
|
'chat_records.source',
|
|
|
|
'chat_records.msg_type',
|
|
|
|
'chat_records.user_id',
|
|
|
|
'chat_records.receive_id',
|
|
|
|
'chat_records.content',
|
|
|
|
'chat_records.is_revoke',
|
|
|
|
'chat_records.created_at',
|
|
|
|
'users.nickname',
|
2021-03-31 17:28:58 +08:00
|
|
|
'users.avatar',
|
2020-11-21 19:53:01 +08:00
|
|
|
]);
|
|
|
|
|
2020-12-01 13:54:40 +08:00
|
|
|
if (!$result) return Result::ACK;
|
2020-11-22 23:10:00 +08:00
|
|
|
|
2021-03-31 17:28:58 +08:00
|
|
|
$file = $code_block = $forward = $invite = [];
|
|
|
|
|
2020-11-21 22:47:21 +08:00
|
|
|
switch ($result->msg_type) {
|
2021-03-31 17:28:58 +08:00
|
|
|
case 2:// 文件消息
|
2020-11-21 22:47:21 +08:00
|
|
|
$file = ChatRecordsFile::where('record_id', $result->id)->first(['id', 'record_id', 'user_id', 'file_source', 'file_type', 'save_type', 'original_name', 'file_suffix', 'file_size', 'save_dir']);
|
|
|
|
$file = $file ? $file->toArray() : [];
|
2020-12-01 13:54:40 +08:00
|
|
|
$file && $file['file_url'] = get_media_url($file['save_dir']);
|
|
|
|
|
2020-11-21 22:47:21 +08:00
|
|
|
break;
|
2021-03-31 17:28:58 +08:00
|
|
|
case 3:// 入群消息/退群消息
|
2020-11-21 22:47:21 +08:00
|
|
|
$notifyInfo = ChatRecordsInvite::where('record_id', $result->id)->first([
|
|
|
|
'record_id', 'type', 'operate_user_id', 'user_ids'
|
|
|
|
]);
|
|
|
|
|
|
|
|
$userInfo = User::where('id', $notifyInfo->operate_user_id)->first(['nickname', 'id']);
|
2021-03-31 17:28:58 +08:00
|
|
|
$invite = [
|
|
|
|
'type' => $notifyInfo->type,
|
2020-11-21 22:47:21 +08:00
|
|
|
'operate_user' => ['id' => $userInfo->id, 'nickname' => $userInfo->nickname],
|
2021-03-31 17:28:58 +08:00
|
|
|
'users' => User::whereIn('id', parse_ids($notifyInfo->user_ids))->get(['id', 'nickname'])->toArray()
|
2020-11-21 22:47:21 +08:00
|
|
|
];
|
|
|
|
|
2020-12-01 13:54:40 +08:00
|
|
|
unset($notifyInfo, $userInfo);
|
2020-11-21 22:47:21 +08:00
|
|
|
break;
|
2021-03-31 17:28:58 +08:00
|
|
|
case 4: //会话记录消息
|
|
|
|
$forward = ['num' => 0, 'list' => []];
|
2020-11-24 23:23:12 +08:00
|
|
|
$forwardInfo = ChatRecordsForward::where('record_id', $result->id)->first(['records_id', 'text']);
|
|
|
|
if ($forwardInfo) {
|
|
|
|
$forward = [
|
2021-03-31 17:28:58 +08:00
|
|
|
'num' => count(parse_ids($forwardInfo->records_id)),
|
2020-11-24 23:23:12 +08:00
|
|
|
'list' => json_decode($forwardInfo->text, true) ?? []
|
|
|
|
];
|
|
|
|
}
|
2020-11-21 22:47:21 +08:00
|
|
|
|
|
|
|
break;
|
2021-03-31 17:28:58 +08:00
|
|
|
case 5: //代码块消息
|
2020-11-21 22:47:21 +08:00
|
|
|
$code_block = ChatRecordsCode::where('record_id', $result->id)->first(['record_id', 'code_lang', 'code']);
|
|
|
|
$code_block = $code_block ? $code_block->toArray() : [];
|
|
|
|
break;
|
2020-11-21 19:53:01 +08:00
|
|
|
}
|
|
|
|
|
2020-12-01 13:54:40 +08:00
|
|
|
$notify = [
|
2021-03-31 17:28:58 +08:00
|
|
|
'send_user' => $data['data']['sender'],
|
2020-11-22 23:10:00 +08:00
|
|
|
'receive_user' => $data['data']['receive'],
|
2021-03-31 17:28:58 +08:00
|
|
|
'source_type' => $data['data']['source'],
|
|
|
|
'data' => $this->formatTalkMessage([
|
2021-04-08 09:20:51 +08:00
|
|
|
'id' => $result->id,
|
|
|
|
'msg_type' => $result->msg_type,
|
|
|
|
'source' => $result->source,
|
|
|
|
'avatar' => $result->avatar,
|
|
|
|
'nickname' => $result->nickname,
|
|
|
|
'group_name' => $groupInfo ? $groupInfo->group_name : '',
|
|
|
|
'group_avatar' => $groupInfo ? $groupInfo->avatar : '',
|
|
|
|
"user_id" => $result->user_id,
|
|
|
|
"receive_id" => $result->receive_id,
|
|
|
|
"created_at" => $result->created_at,
|
|
|
|
"content" => $result->content,
|
|
|
|
"file" => $file,
|
|
|
|
"code_block" => $code_block,
|
|
|
|
'forward' => $forward,
|
|
|
|
'invite' => $invite
|
2020-11-21 19:53:01 +08:00
|
|
|
])
|
|
|
|
];
|
2020-11-20 19:17:11 +08:00
|
|
|
|
2020-12-01 17:47:25 +08:00
|
|
|
$this->socketPushNotify($fds, json_encode([SocketConstants::EVENT_TALK, $notify]));
|
2020-11-22 23:10:00 +08:00
|
|
|
|
|
|
|
return Result::ACK;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 键盘输入事件消息
|
|
|
|
*
|
|
|
|
* @param array $data 队列消息
|
|
|
|
* @param AMQPMessage $message
|
|
|
|
* @return string
|
|
|
|
*/
|
2020-12-01 13:54:40 +08:00
|
|
|
public function onConsumeKeyboard(array $data, AMQPMessage $message): string
|
2020-11-22 23:10:00 +08:00
|
|
|
{
|
2020-11-29 14:44:11 +08:00
|
|
|
$fds = $this->socketClientService->findUserFds($data['data']['receive_user']);
|
2020-12-01 13:54:40 +08:00
|
|
|
|
2020-12-01 17:47:25 +08:00
|
|
|
$this->socketPushNotify($fds, json_encode([SocketConstants::EVENT_KEYBOARD, $data['data']]));
|
2020-11-22 23:10:00 +08:00
|
|
|
|
|
|
|
return Result::ACK;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 用户上线或下线消息
|
|
|
|
*
|
|
|
|
* @param array $data 队列消息
|
|
|
|
* @param AMQPMessage $message
|
|
|
|
* @return string
|
|
|
|
*/
|
2020-12-01 13:54:40 +08:00
|
|
|
public function onConsumeOnlineStatus(array $data, AMQPMessage $message): string
|
2020-11-22 23:10:00 +08:00
|
|
|
{
|
2020-12-01 13:54:40 +08:00
|
|
|
$friends = UsersFriend::getFriendIds((int)$data['data']['user_id']);
|
2020-11-22 23:10:00 +08:00
|
|
|
|
|
|
|
$fds = [];
|
|
|
|
foreach ($friends as $friend_id) {
|
2020-12-01 13:54:40 +08:00
|
|
|
$fds = array_merge($fds, $this->socketClientService->findUserFds((int)$friend_id));
|
2020-11-22 23:10:00 +08:00
|
|
|
}
|
|
|
|
|
2020-12-01 17:47:25 +08:00
|
|
|
$this->socketPushNotify(array_unique($fds), json_encode([SocketConstants::EVENT_ONLINE_STATUS, $data['data']]));
|
2020-11-22 23:10:00 +08:00
|
|
|
|
|
|
|
return Result::ACK;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 撤销聊天消息
|
|
|
|
*
|
|
|
|
* @param array $data 队列消息
|
|
|
|
* @param AMQPMessage $message
|
|
|
|
* @return string
|
|
|
|
*/
|
2020-12-01 13:54:40 +08:00
|
|
|
public function onConsumeRevokeTalk(array $data, AMQPMessage $message): string
|
2020-11-22 23:10:00 +08:00
|
|
|
{
|
2020-11-27 19:48:41 +08:00
|
|
|
/** @var ChatRecord */
|
2020-11-22 23:10:00 +08:00
|
|
|
$record = ChatRecord::where('id', $data['data']['record_id'])->first(['id', 'source', 'user_id', 'receive_id']);
|
|
|
|
|
|
|
|
$fds = [];
|
|
|
|
if ($record->source == 1) {
|
2020-11-29 14:44:11 +08:00
|
|
|
$fds = array_merge($fds, $this->socketClientService->findUserFds((int)$record->user_id));
|
|
|
|
$fds = array_merge($fds, $this->socketClientService->findUserFds((int)$record->receive_id));
|
2020-11-22 23:10:00 +08:00
|
|
|
} else if ($record->source == 2) {
|
|
|
|
$userIds = $this->socketRoomService->getRoomMembers(strval($record->receive_id));
|
|
|
|
foreach ($userIds as $uid) {
|
2020-11-29 14:44:11 +08:00
|
|
|
$fds = array_merge($fds, $this->socketClientService->findUserFds((int)$uid));
|
2020-11-22 23:10:00 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-12-01 13:54:40 +08:00
|
|
|
$this->socketPushNotify(
|
|
|
|
array_unique($fds),
|
2020-12-01 17:47:25 +08:00
|
|
|
json_encode([SocketConstants::EVENT_REVOKE_TALK, [
|
2021-03-31 17:28:58 +08:00
|
|
|
'record_id' => $record->id,
|
|
|
|
'source' => $record->source,
|
|
|
|
'user_id' => $record->user_id,
|
2020-12-01 13:54:40 +08:00
|
|
|
'receive_id' => $record->receive_id,
|
|
|
|
]])
|
|
|
|
);
|
2020-11-03 14:07:54 +08:00
|
|
|
|
2020-11-08 17:10:05 +08:00
|
|
|
return Result::ACK;
|
2020-11-02 22:45:37 +08:00
|
|
|
}
|
2020-11-27 19:48:41 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* 好友申请消息
|
|
|
|
*
|
2020-11-29 14:44:11 +08:00
|
|
|
* @param array $data 队列消息
|
2020-11-27 19:48:41 +08:00
|
|
|
* @param AMQPMessage $message
|
2020-11-29 14:44:11 +08:00
|
|
|
* @return string
|
2020-11-27 19:48:41 +08:00
|
|
|
*/
|
2020-12-01 13:54:40 +08:00
|
|
|
public function onConsumeFriendApply(array $data, AMQPMessage $message): string
|
2020-11-27 19:48:41 +08:00
|
|
|
{
|
2020-11-29 14:44:11 +08:00
|
|
|
$fds = $this->socketClientService->findUserFds($data['data']['receive']);
|
|
|
|
|
2020-12-01 17:47:25 +08:00
|
|
|
$this->socketPushNotify(array_unique($fds), json_encode([SocketConstants::EVENT_FRIEND_APPLY, $data['data']]));
|
2020-12-01 13:54:40 +08:00
|
|
|
|
|
|
|
return Result::ACK;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* WebSocket 消息推送
|
|
|
|
*
|
|
|
|
* @param $fds
|
|
|
|
* @param $message
|
|
|
|
*/
|
|
|
|
private function socketPushNotify($fds, $message)
|
|
|
|
{
|
2020-11-30 22:59:49 +08:00
|
|
|
$server = server();
|
2020-11-27 19:48:41 +08:00
|
|
|
foreach ($fds as $fd) {
|
2020-12-01 13:54:40 +08:00
|
|
|
$server->exist($fd) && $server->push($fd, $message);
|
2020-11-27 19:48:41 +08:00
|
|
|
}
|
2020-12-01 13:54:40 +08:00
|
|
|
}
|
2020-11-27 19:48:41 +08:00
|
|
|
|
2020-12-01 13:54:40 +08:00
|
|
|
/**
|
|
|
|
* 格式化对话的消息体
|
|
|
|
*
|
|
|
|
* @param array $data 对话的消息
|
|
|
|
* @return array
|
|
|
|
*/
|
2020-12-01 22:50:43 +08:00
|
|
|
private function formatTalkMessage(array $data): array
|
2020-12-01 13:54:40 +08:00
|
|
|
{
|
|
|
|
$message = [
|
2021-04-17 16:37:07 +08:00
|
|
|
"id" => 0,// 消息记录ID
|
|
|
|
"source" => 1,// 消息来源[1:好友私信;2:群聊]
|
2021-04-08 09:20:51 +08:00
|
|
|
"msg_type" => 1,
|
2021-04-17 16:37:07 +08:00
|
|
|
"user_id" => 0,// 发送者用户ID
|
|
|
|
"receive_id" => 0,// 接收者ID[好友ID或群ID]
|
|
|
|
"content" => '',// 文本消息
|
|
|
|
"is_revoke" => 0,// 消息是否撤销
|
2020-12-01 13:54:40 +08:00
|
|
|
|
|
|
|
// 发送消息人的信息
|
2021-04-17 16:37:07 +08:00
|
|
|
"nickname" => "",// 用户昵称
|
|
|
|
"avatar" => "",// 用户头像
|
|
|
|
"group_name" => "",// 群组名称
|
|
|
|
"group_avatar" => "",// 群组头像
|
2020-12-01 13:54:40 +08:00
|
|
|
|
|
|
|
// 不同的消息类型
|
2021-04-08 09:20:51 +08:00
|
|
|
"file" => [],
|
|
|
|
"code_block" => [],
|
|
|
|
"forward" => [],
|
|
|
|
"invite" => [],
|
2020-12-01 13:54:40 +08:00
|
|
|
|
|
|
|
// 消息创建时间
|
2021-04-08 09:20:51 +08:00
|
|
|
"created_at" => "",
|
2020-12-01 13:54:40 +08:00
|
|
|
];
|
|
|
|
|
|
|
|
return array_merge($message, array_intersect_key($data, $message));
|
2020-11-27 19:48:41 +08:00
|
|
|
}
|
2020-11-02 22:45:37 +08:00
|
|
|
}
|