Skip to content

Commit be9ed7a

Browse files
committed
完成合并转发
1 parent 1157e5f commit be9ed7a

9 files changed

Lines changed: 105 additions & 44 deletions

File tree

app/Controller/Laboratory/Ws/FriendController.php

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@
99
use App\Foundation\Facades\MessageParser;
1010
use App\Model\Auth\User;
1111
use App\Model\Laboratory\FriendChatHistory;
12+
use App\Model\Laboratory\GroupChatHistory;
1213
use App\Pool\Redis;
14+
use App\Service\Laboratory\MessageService;
1315
use Hyperf\HttpServer\Annotation\Controller;
1416
use Hyperf\HttpServer\Annotation\RequestMapping;
1517

@@ -84,12 +86,12 @@ public function pullMessage()
8486

8587
$list = [];
8688
foreach ($messageList as $key => $value) {
87-
$list[] = [
89+
$temp = [
8890
'id' => $value['message_id'],
8991
'status' => $value['status'],
9092
'type' => $value['type'],
91-
'sendTime' => intval($value['send_time']),
9293
'content' => $value['content'],
94+
'sendTime' => intval($value['send_time']),
9395
'toContactId' => $value['to_uid'],
9496
'fileSize' => $value['file_size'],
9597
'fileName' => $value['file_name'],
@@ -99,6 +101,8 @@ public function pullMessage()
99101
'displayName' => User::query()->where('id', $value['from_uid'])->value('desc'),
100102
],
101103
];
104+
if ($temp['type'] == FriendChatHistory::FRIEND_CHAT_MESSAGE_TYPE_FORWARD) $temp['content'] = MessageService::getInstance()->formatForwardMessage($temp['content'], $temp['fromUser']);
105+
$list[] = $temp;
102106
}
103107
return [
104108
'message_data' => [

app/Controller/Laboratory/Ws/GroupController.php

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use App\Model\Laboratory\GroupRelation;
1616
use App\Pool\Redis;
1717
use App\Service\Laboratory\GroupService;
18+
use App\Service\Laboratory\MessageService;
1819
use App\Task\Laboratory\GroupWsTask;
1920
use Hyperf\DbConnection\Db;
2021
use Hyperf\HttpServer\Annotation\Controller;
@@ -52,6 +53,8 @@ public function sendMessage()
5253
unset($contactData['fromUser']['lastSendTime']);
5354
unset($contactData['fromUser']['lastContent']);
5455

56+
//格式化转发消息类型
57+
if ($contactData['type'] == GroupChatHistory::GROUP_CHAT_MESSAGE_TYPE_FORWARD) $contactData['content'] = GroupService::getInstance()->formatForwardMessage($contactData['content'], $contactData['fromUser']);
5558
return [
5659
'message_data' => [
5760
'event' => '',
@@ -87,7 +90,7 @@ public function pullMessage()
8790
$messageList = array_reverse($messageList);
8891

8992
$list = [];
90-
foreach ($messageList as $key => $value) {
93+
foreach ($messageList as $key => $value) {
9194
$temp = [
9295
'id' => $value['message_id'],
9396
'status' => $value['status'],
@@ -104,7 +107,7 @@ public function pullMessage()
104107
'displayName' => User::query()->where('id', $value['from_uid'])->value('desc') ?? '',
105108
];
106109
//格式化转发类型的消息类型
107-
if ($value['type'] == GroupChatHistory::GROUP_CHAT_MESSAGE_TYPE_FORWARD) $temp['content'] = GroupService::getInstance()->formatForwardMessage($value['content'], $temp['fromUser']);
110+
if ($value['type'] == GroupChatHistory::GROUP_CHAT_MESSAGE_TYPE_FORWARD) $temp['content'] = MessageService::getInstance()->formatForwardMessage($value['content'], $temp['fromUser']);
108111
$list[] = $temp;
109112
}
110113
return [

app/Controller/Laboratory/Ws/MessageController.php

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@
99
use App\Foundation\Facades\MessageParser;
1010
use App\Model\Auth\User;
1111
use App\Model\Laboratory\FriendChatHistory;
12+
use App\Model\Laboratory\Group;
1213
use App\Pool\Redis;
14+
use App\Task\Laboratory\FriendWsTask;
1315
use App\Task\Laboratory\GroupWsTask;
1416
use Hyperf\HttpServer\Annotation\Controller;
1517
use Hyperf\HttpServer\Annotation\RequestMapping;
@@ -35,9 +37,15 @@ public function forwardMessage()
3537
$user = $contactData['user'];
3638
foreach ($contactData['contact'] as $item) {
3739
if ($item['is_group'] == 1) {
38-
$this->container->get(GroupWsTask::class)->forwardMessage($item, $user, $content);
40+
$groupInfo = Group::query()->where('group_id', $item['id'])->first();
41+
if (empty($groupInfo)) continue;
42+
$groupInfo = objToArray($groupInfo);
43+
$this->container->get(GroupWsTask::class)->forwardMessage($groupInfo, $user, $content);
3944
}else {
40-
var_dump($item);
45+
$userInfo = User::query()->where('id', $item['id'])->first();
46+
if (empty($userInfo)) continue;
47+
$userInfo = objToArray($userInfo);
48+
$this->container->get(FriendWsTask::class)->forwardMessage($userInfo, $user, $content);
4149
}
4250
}
4351
}

app/Controller/Laboratory/Ws/WebsocketController.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ public function onMessage($server, Frame $frame): void
5656
]));
5757
$targetUri = $message['uri'] ?? '';
5858
$requestMethod = $message['method'] ?? 'GET';
59-
var_dump($targetUri);
6059
$dispatcher = $this->container
6160
->get(DispatcherFactory::class)
6261
->getDispatcher('ws');

app/Model/Laboratory/FriendChatHistory.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ class FriendChatHistory extends Model
5050
const FRIEND_CHAT_MESSAGE_TYPE_IMAGE = 'image';
5151
const FRIEND_CHAT_MESSAGE_TYPE_FILE = 'file';
5252
const FRIEND_CHAT_MESSAGE_TYPE_EVENT = 'event';
53+
const FRIEND_CHAT_MESSAGE_TYPE_FORWARD = 'forward';
5354

5455
/**
5556
* 群消息状态枚举

app/Service/Laboratory/GroupService.php

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -64,33 +64,4 @@ public function getUnOnlineGroupMember(string $groupId) : array
6464
}
6565
return $uidList;
6666
}
67-
68-
/**
69-
* 格式化转发类型消息
70-
* @param string $content
71-
* @param array $fromUser
72-
* @return array
73-
*/
74-
public function formatForwardMessage(string $content, array $fromUser)
75-
{
76-
if (empty($content)) return [];
77-
$content = json_decode($content, true);
78-
if (is_null($content)) return [];
79-
80-
$messageList = GroupChatHistory::query()->whereIn('message_id', $content)->orderBy('send_time', 'asc')->get()->toArray();
81-
foreach ($messageList as $key => $value) {
82-
if ($value['from_uid'] != 0) $messageList[$key]['fromUser'] = [
83-
'id' => $value['from_uid'],
84-
'avatar' => User::query()->where('id', $value['from_uid'])->value('avatar') ?? '',
85-
'displayName' => User::query()->where('id', $value['from_uid'])->value('desc') ?? '',
86-
];
87-
}
88-
$total = count($messageList);
89-
90-
return [
91-
'message' => $messageList,
92-
'fromUser' => $fromUser,
93-
'total' => $total
94-
];
95-
}
9667
}

app/Service/Laboratory/MessageService.php

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
namespace App\Service\Laboratory;
33

44
use App\Foundation\Traits\Singleton;
5+
use App\Model\Auth\User;
6+
use App\Model\Laboratory\FriendChatHistory;
7+
use App\Model\Laboratory\GroupChatHistory;
58
use App\Service\BaseService;
69
use Hyperf\Di\Annotation\Inject;
710
use Swoole\Http\Request;
@@ -18,7 +21,38 @@ class MessageService extends BaseService
1821
{
1922
use Singleton;
2023

24+
/**
25+
* 格式化转发类型消息
26+
* @param string $content
27+
* @param array $fromUser
28+
* @return array
29+
*/
30+
public function formatForwardMessage(string $content, array $fromUser)
31+
{
32+
if (empty($content)) return [];
33+
$content = json_decode($content, true);
34+
if (is_null($content)) return [];
2135

36+
$messageList = GroupChatHistory::query()->whereIn('message_id', $content)->orderBy('send_time', 'asc')->get()->toArray();
37+
if (empty($messageList)) {
38+
$messageList = FriendChatHistory::query()->whereIn('message_id', $content)->orderBy('send_time', 'asc')->get()->toArray();
39+
}
40+
if (empty($messageList)) return [];
41+
foreach ($messageList as $key => $value) {
42+
if ($value['from_uid'] != 0) $messageList[$key]['fromUser'] = [
43+
'id' => $value['from_uid'],
44+
'avatar' => User::query()->where('id', $value['from_uid'])->value('avatar') ?? '',
45+
'displayName' => User::query()->where('id', $value['from_uid'])->value('desc') ?? '',
46+
];
47+
}
48+
$total = count($messageList);
49+
50+
return [
51+
'message' => $messageList,
52+
'fromUser' => $fromUser,
53+
'total' => $total
54+
];
55+
}
2256

2357

2458
}

app/Task/Laboratory/FriendWsTask.php

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,15 @@
33

44
namespace App\Task\Laboratory;
55

6+
use App\Constants\Laboratory\ChatRedisKey;
67
use App\Constants\Laboratory\GroupEvent;
78
use App\Constants\Laboratory\WsMessage;
89
use App\Model\Laboratory\FriendChatHistory;
910
use App\Model\Laboratory\FriendRelation;
1011
use App\Model\Laboratory\GroupRelation;
12+
use App\Pool\Redis;
1113
use App\Service\Laboratory\FriendService;
14+
use App\Service\Laboratory\MessageService;
1215
use Hyperf\Di\Annotation\Inject;
1316

1417
/**
@@ -59,4 +62,40 @@ public function friendOnlineAndOfflineNotify(array $userInfo, string $event, boo
5962
}
6063
return true;
6164
}
65+
66+
/**
67+
* 转发信息
68+
* @param array $userInfo
69+
* @param array $user
70+
* @param string $content
71+
* @return bool
72+
*/
73+
function forwardMessage(array $userInfo, array $user, string $content)
74+
{
75+
//添加聊天记录
76+
$message = [];
77+
$message['id'] = generate_rand_id();
78+
$message['from_uid'] = $user['id'];
79+
$message['to_uid'] = $userInfo['id'];
80+
$message['type'] = FriendChatHistory::FRIEND_CHAT_MESSAGE_TYPE_FORWARD;
81+
$message['status'] = FriendChatHistory::FRIEND_CHAT_MESSAGE_STATUS_SUCCEED;
82+
$message['sendTime'] = time() * 1000;
83+
$message['content'] = $content;
84+
$message['toContactId'] = $userInfo['id'];
85+
$message['fromUser'] = $user;
86+
$contactId = Redis::getInstance()->hget(ChatRedisKey::ONLINE_USER_FD_KEY, (string)$userInfo['id']);
87+
$fromUserFd = Redis::getInstance()->hget(ChatRedisKey::ONLINE_USER_FD_KEY, (string)$user['id']);
88+
$receptionState = empty($contactId) ? FriendChatHistory::RECEPTION_STATE_NO : FriendChatHistory::RECEPTION_STATE_YES;
89+
90+
//添加消息记录
91+
FriendChatHistory::addMessage($message, $receptionState);
92+
if ($message['type'] == FriendChatHistory::FRIEND_CHAT_MESSAGE_TYPE_FORWARD) $message['content'] = MessageService::getInstance()->formatForwardMessage($message['content'], $message['fromUser']);
93+
94+
$sendMessage = [
95+
'message' => $message,
96+
];
97+
$this->sender->push((int) $contactId, json_encode($sendMessage));
98+
$this->sender->push((int) $fromUserFd, json_encode($sendMessage));
99+
return true;
100+
}
62101
}

app/Task/Laboratory/GroupWsTask.php

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
use App\Model\Laboratory\GroupRelation;
1313
use App\Pool\Redis;
1414
use App\Service\Laboratory\GroupService;
15+
use App\Service\Laboratory\MessageService;
1516
use Hyperf\DbConnection\Db;
1617
use Hyperf\Di\Annotation\Inject;
1718
use Hyperf\Task\Annotation\Task;
@@ -308,23 +309,23 @@ function forwardMessage(array $groupInfo, array $user, string $content)
308309
$message = [];
309310
$message['id'] = generate_rand_id();
310311
$message['from_uid'] = $user['id'];
311-
$message['to_group_id'] = $groupInfo['id'];
312+
$message['to_group_id'] = $groupInfo['group_id'];
312313
$message['type'] = GroupChatHistory::GROUP_CHAT_MESSAGE_TYPE_FORWARD;
313314
$message['status'] = GroupChatHistory::GROUP_CHAT_MESSAGE_STATUS_SUCCEED;
314315
$message['sendTime'] = time() * 1000;
315316
$message['content'] = $content;
316-
$message['toContactId'] = $groupInfo['id'];
317+
$message['toContactId'] = $groupInfo['group_id'];
317318
$message['fromUser'] = $user;
318319

319320
//获取不在线用户,并添加到未读历史消息中
320-
$unOnlineUidList = GroupService::getInstance()->getUnOnlineGroupMember($groupInfo['id']);
321+
$unOnlineUidList = GroupService::getInstance()->getUnOnlineGroupMember($groupInfo['group_id']);
321322
foreach ($unOnlineUidList as $uid) {
322-
Redis::getInstance()->sAdd(ChatRedisKey::GROUP_CHAT_UNREAD_MESSAGE_BY_USER . $uid, $groupInfo['id']);
323+
Redis::getInstance()->sAdd(ChatRedisKey::GROUP_CHAT_UNREAD_MESSAGE_BY_USER . $uid, $groupInfo['group_id']);
323324
}
324-
325-
$this->sendMessage($groupInfo['id'], $message, GroupEvent::FORWARD_MESSAGE);
325+
$this->sendMessage($groupInfo['group_id'], $message, GroupEvent::FORWARD_MESSAGE);
326326
return true;
327327
}
328+
328329
/**
329330
* 组消息发送
330331
* @param string $groupId
@@ -339,14 +340,15 @@ public function sendMessage(string $groupId, array $message, $event = '')
339340
$message['fromUser']['id'] = 0;
340341
$message['fromUser']['displayName'] = '系统通知';
341342
}
343+
//添加聊天记录
344+
GroupChatHistory::addMessage($message, 1);
342345
$uidFdList = GroupService::getInstance()->getOnlineGroupMemberFd($groupId);
346+
if ($message['type'] == GroupChatHistory::GROUP_CHAT_MESSAGE_TYPE_FORWARD) $message['content'] = MessageService::getInstance()->formatForwardMessage($message['content'], $message['fromUser']);
343347
foreach ($uidFdList as $key => $value) {
344348
$sendMessage['event'] = $event;
345349
$sendMessage['message'] = $message;
346350
$this->sender->push((int) $value['fd'], json_encode($sendMessage));
347351
}
348-
//添加聊天记录
349-
GroupChatHistory::addMessage($message, 1);
350352
return true;
351353
}
352354
}

0 commit comments

Comments
 (0)