2020-11-22 23:10:00 +08:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace App\Service;
|
|
|
|
|
2021-07-05 21:52:44 +08:00
|
|
|
use App\Constants\SocketConstants;
|
|
|
|
use App\Constants\TalkMsgType;
|
|
|
|
use App\Constants\TalkType;
|
2020-11-22 23:10:00 +08:00
|
|
|
use Hyperf\Di\Annotation\Inject;
|
2020-11-29 14:44:11 +08:00
|
|
|
use Swoole\Http\Response;
|
|
|
|
use Swoole\WebSocket\Frame;
|
|
|
|
use Swoole\WebSocket\Server;
|
2020-11-22 23:10:00 +08:00
|
|
|
use App\Amqp\Producer\ChatMessageProducer;
|
2021-07-05 21:52:44 +08:00
|
|
|
use App\Model\Chat\TalkRecords;
|
2021-03-25 17:32:36 +08:00
|
|
|
use App\Model\Group\Group;
|
2020-11-22 23:10:00 +08:00
|
|
|
use App\Model\UsersFriend;
|
2021-05-20 22:23:48 +08:00
|
|
|
use App\Cache\LastMessage;
|
|
|
|
use App\Cache\UnreadTalk;
|
2020-11-22 23:10:00 +08:00
|
|
|
|
|
|
|
class MessageHandleService
|
|
|
|
{
|
|
|
|
/**
|
|
|
|
* @inject
|
2020-11-29 14:44:11 +08:00
|
|
|
* @var SocketClientService
|
2020-11-22 23:10:00 +08:00
|
|
|
*/
|
2020-11-29 14:44:11 +08:00
|
|
|
private $socketClientService;
|
|
|
|
|
2020-11-22 23:10:00 +08:00
|
|
|
/**
|
|
|
|
* 对话消息
|
|
|
|
*
|
|
|
|
* @param Response|Server $server
|
2021-04-20 16:30:57 +08:00
|
|
|
* @param Frame $frame
|
|
|
|
* @param array|string $data 解析后数据
|
2021-04-22 16:14:34 +08:00
|
|
|
* @return void
|
2020-11-22 23:10:00 +08:00
|
|
|
*/
|
|
|
|
public function onTalk($server, Frame $frame, $data)
|
|
|
|
{
|
2020-11-29 14:44:11 +08:00
|
|
|
$user_id = $this->socketClientService->findFdUserId($frame->fd);
|
2021-07-05 21:52:44 +08:00
|
|
|
if ($user_id != $data['sender_id']) {
|
2020-11-22 23:10:00 +08:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-04-22 16:54:01 +08:00
|
|
|
// 验证消息类型 私聊|群聊
|
2021-07-05 21:52:44 +08:00
|
|
|
if (!in_array($data['talk_type'], TalkType::getTypes())) {
|
2020-11-22 23:10:00 +08:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-04-22 16:54:01 +08:00
|
|
|
// 验证发送消息用户与接受消息用户之间是否存在好友或群聊关系(后期走缓存)
|
2021-07-05 21:52:44 +08:00
|
|
|
if ($data['talk_type'] == TalkType::PRIVATE_CHAT) {
|
2021-04-22 16:54:01 +08:00
|
|
|
// 判断发送者和接受者是否是好友关系
|
2021-07-05 21:52:44 +08:00
|
|
|
if (!UsersFriend::isFriend((int)$data['sender_id'], (int)$data['receiver_id'], true)) {
|
2020-11-22 23:10:00 +08:00
|
|
|
return;
|
|
|
|
}
|
2021-07-05 21:52:44 +08:00
|
|
|
} else if ($data['talk_type'] == TalkType::GROUP_CHAT) {
|
2021-04-22 16:54:01 +08:00
|
|
|
// 判断是否属于群成员
|
2021-07-05 21:52:44 +08:00
|
|
|
if (!Group::isMember((int)$data['receiver_id'], (int)$data['sender_id'])) {
|
2020-11-22 23:10:00 +08:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-07-05 21:52:44 +08:00
|
|
|
$result = TalkRecords::create([
|
|
|
|
'talk_type' => $data['talk_type'],
|
|
|
|
'user_id' => $data['sender_id'],
|
|
|
|
'receiver_id' => $data['receiver_id'],
|
|
|
|
'msg_type' => TalkMsgType::TEXT_MESSAGE,
|
|
|
|
'content' => htmlspecialchars($data['text_message']),
|
|
|
|
'created_at' => date('Y-m-d H:i:s'),
|
|
|
|
'updated_at' => date('Y-m-d H:i:s'),
|
2020-11-22 23:10:00 +08:00
|
|
|
]);
|
|
|
|
|
2020-12-12 18:59:28 +08:00
|
|
|
if (!$result) return;
|
2020-11-22 23:10:00 +08:00
|
|
|
|
|
|
|
// 判断是否私聊
|
2021-07-05 21:52:44 +08:00
|
|
|
if ($result->talk_type == TalkType::PRIVATE_CHAT) {
|
2020-11-22 23:10:00 +08:00
|
|
|
// 设置好友消息未读数
|
2021-07-05 21:52:44 +08:00
|
|
|
UnreadTalk::getInstance()->increment($result->user_id, $result->receiver_id);
|
2020-11-22 23:10:00 +08:00
|
|
|
}
|
|
|
|
|
2021-05-20 22:23:48 +08:00
|
|
|
// 缓存最后一条聊天消息
|
2021-07-05 21:52:44 +08:00
|
|
|
LastMessage::getInstance()->save($result->talk_type, $result->user_id, $result->receiver_id, [
|
2021-04-20 16:30:57 +08:00
|
|
|
'text' => mb_substr($result->content, 0, 30),
|
2020-12-12 18:59:28 +08:00
|
|
|
'created_at' => $result->created_at
|
2021-05-20 22:23:48 +08:00
|
|
|
]);
|
2020-12-12 18:59:28 +08:00
|
|
|
|
2021-07-05 21:52:44 +08:00
|
|
|
push_amqp(new ChatMessageProducer(SocketConstants::EVENT_TALK, [
|
|
|
|
'sender_id' => $result->user_id,
|
|
|
|
'receiver_id' => $result->receiver_id,
|
|
|
|
'talk_type' => $result->talk_type,
|
|
|
|
'record_id' => $result->id
|
2021-05-13 18:01:34 +08:00
|
|
|
]));
|
2020-11-22 23:10:00 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 键盘输入消息
|
|
|
|
*
|
|
|
|
* @param Response|Server $server
|
2021-04-20 16:30:57 +08:00
|
|
|
* @param Frame $frame
|
|
|
|
* @param array|string $data 解析后数据
|
2021-07-05 21:52:44 +08:00
|
|
|
* @return false
|
2020-11-22 23:10:00 +08:00
|
|
|
*/
|
|
|
|
public function onKeyboard($server, Frame $frame, $data)
|
|
|
|
{
|
2021-07-05 21:52:44 +08:00
|
|
|
push_amqp(new ChatMessageProducer(SocketConstants::EVENT_KEYBOARD, [
|
|
|
|
'sender_id' => intval($data['sender_id']),
|
|
|
|
'receiver_id' => intval($data['receiver_id']),
|
2021-05-13 18:01:34 +08:00
|
|
|
]));
|
2020-11-22 23:10:00 +08:00
|
|
|
}
|
|
|
|
}
|