修复:好友悄悄话文案根据互相状态精确区分
- notifyOnlineUser 加 $mutual 参数
- added + mutual=false → '但你还没有添加对方为好友'
- added + mutual=true → '你们现在互为好友 🎉'
- removed + mutual=true → '你的好友列表中仍保留对方'
- removed + mutual=false → '已将你从他的好友列表移除'
- 删除操作悄悄话改为灰色 (#6b7280),语义更准确
This commit is contained in:
@@ -42,7 +42,7 @@ class FriendController extends Controller
|
|||||||
*
|
*
|
||||||
* 返回:
|
* 返回:
|
||||||
* - is_friend: 当前用户是否已将对方加为好友
|
* - is_friend: 当前用户是否已将对方加为好友
|
||||||
* - mutual: 是否互相添加(双向好友)
|
* - mutual: 是否互相添加(双向好友)
|
||||||
*
|
*
|
||||||
* @param string $username 目标用户名
|
* @param string $username 目标用户名
|
||||||
*/
|
*/
|
||||||
@@ -73,8 +73,9 @@ class FriendController extends Controller
|
|||||||
* 1. 校验目标用户存在、且不是自己
|
* 1. 校验目标用户存在、且不是自己
|
||||||
* 2. 检查是否已经添加过
|
* 2. 检查是否已经添加过
|
||||||
* 3. 写入 friend_requests 记录
|
* 3. 写入 friend_requests 记录
|
||||||
* 4. 广播 FriendAdded 事件通知对方
|
* 4. 检查是否互相好友(B 是否已将 A 加为好友)
|
||||||
* 5. 若对方当前在线(Redis),向对方发送悄悄话
|
* 5. 广播 FriendAdded 事件通知对方(携带互相状态)
|
||||||
|
* 6. 若对方在线,向对方发送正确的悄悄话
|
||||||
*
|
*
|
||||||
* @param string $username 目标用户名
|
* @param string $username 目标用户名
|
||||||
*/
|
*/
|
||||||
@@ -99,7 +100,7 @@ class FriendController extends Controller
|
|||||||
return response()->json(['status' => 'error', 'message' => '已是好友,无需重复添加'], 422);
|
return response()->json(['status' => 'error', 'message' => '已是好友,无需重复添加'], 422);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 写入好友关系
|
// 写入好友关系(A → B)
|
||||||
FriendRequest::create([
|
FriendRequest::create([
|
||||||
'who' => $me->username,
|
'who' => $me->username,
|
||||||
'towho' => $username,
|
'towho' => $username,
|
||||||
@@ -114,8 +115,8 @@ class FriendController extends Controller
|
|||||||
// 广播给对方(仅对方可见),携带是否已回加的状态
|
// 广播给对方(仅对方可见),携带是否已回加的状态
|
||||||
broadcast(new FriendAdded($me->username, $username, $hasAddedBack));
|
broadcast(new FriendAdded($me->username, $username, $hasAddedBack));
|
||||||
|
|
||||||
// 若对方在线,推送聊天区悄悄话
|
// 若对方在线,推送聊天区悄悄话(文案根据互相状态区分)
|
||||||
$this->notifyOnlineUser($username, $me->username, 'added', $request->input('room_id'));
|
$this->notifyOnlineUser($username, $me->username, 'added', $request->input('room_id'), $hasAddedBack);
|
||||||
|
|
||||||
return response()->json([
|
return response()->json([
|
||||||
'status' => 'success',
|
'status' => 'success',
|
||||||
@@ -128,8 +129,9 @@ class FriendController extends Controller
|
|||||||
*
|
*
|
||||||
* 流程:
|
* 流程:
|
||||||
* 1. 删除 friend_requests 中「我 → 对方」的记录
|
* 1. 删除 friend_requests 中「我 → 对方」的记录
|
||||||
* 2. 广播 FriendRemoved 事件通知对方
|
* 2. 检查对方是否也将我加为好友(之前是否互相)
|
||||||
* 3. 若对方在线,向对方发送悄悄话
|
* 3. 广播 FriendRemoved 事件通知对方
|
||||||
|
* 4. 若对方在线,向对方发送悄悄话
|
||||||
*
|
*
|
||||||
* @param string $username 目标用户名
|
* @param string $username 目标用户名
|
||||||
*/
|
*/
|
||||||
@@ -153,8 +155,8 @@ class FriendController extends Controller
|
|||||||
// 广播给对方,携带之前的互相好友状态
|
// 广播给对方,携带之前的互相好友状态
|
||||||
broadcast(new FriendRemoved($me->username, $username, $hadAddedBack));
|
broadcast(new FriendRemoved($me->username, $username, $hadAddedBack));
|
||||||
|
|
||||||
// 若对方在线,推送聊天区悄悄话
|
// 若对方在线,推送聊天区悄悄话(文案根据互相状态区分)
|
||||||
$this->notifyOnlineUser($username, $me->username, 'removed', $request->input('room_id'));
|
$this->notifyOnlineUser($username, $me->username, 'removed', $request->input('room_id'), $hadAddedBack);
|
||||||
|
|
||||||
return response()->json([
|
return response()->json([
|
||||||
'status' => 'success',
|
'status' => 'success',
|
||||||
@@ -175,15 +177,17 @@ class FriendController extends Controller
|
|||||||
// 也把我加了的
|
// 也把我加了的
|
||||||
$addedMe = FriendRequest::where('towho', $me->username)->pluck('who');
|
$addedMe = FriendRequest::where('towho', $me->username)->pluck('who');
|
||||||
|
|
||||||
$friends = User::whereIn('username', $myAdded)->get(['username', 'usersf', 'user_level', 'sex'])->map(function ($u) use ($addedMe) {
|
$friends = User::whereIn('username', $myAdded)
|
||||||
return [
|
->get(['username', 'usersf', 'user_level', 'sex'])
|
||||||
'username' => $u->username,
|
->map(function ($u) use ($addedMe) {
|
||||||
'headface' => $u->headface,
|
return [
|
||||||
'user_level' => $u->user_level,
|
'username' => $u->username,
|
||||||
'sex' => $u->sex,
|
'headface' => $u->headface,
|
||||||
'mutual' => $addedMe->contains($u->username), // 是否互相添加
|
'user_level' => $u->user_level,
|
||||||
];
|
'sex' => $u->sex,
|
||||||
});
|
'mutual' => $addedMe->contains($u->username), // 是否互相添加
|
||||||
|
];
|
||||||
|
});
|
||||||
|
|
||||||
return response()->json(['status' => 'success', 'friends' => $friends]);
|
return response()->json(['status' => 'success', 'friends' => $friends]);
|
||||||
}
|
}
|
||||||
@@ -191,18 +195,20 @@ class FriendController extends Controller
|
|||||||
/**
|
/**
|
||||||
* 若目标用户在线,向其发送系统悄悄话通知。
|
* 若目标用户在线,向其发送系统悄悄话通知。
|
||||||
*
|
*
|
||||||
* 好友上线/下线使用此方法,不公开广播,只有本人可见。
|
* 根据 $action 和 $mutual 显示不同文案,避免「你们已是好友」的误导提示。
|
||||||
*
|
*
|
||||||
* @param string $targetUsername 接收通知的用户名
|
* @param string $targetUsername 接收通知的用户名
|
||||||
* @param string $fromUsername 发起操作的用户名
|
* @param string $fromUsername 发起操作的用户名
|
||||||
* @param string $action 'added' | 'removed' | 'online'
|
* @param string $action 'added' | 'removed' | 'online'
|
||||||
* @param int|null $roomId 当前房间 ID(用于推送到对应房间频道)
|
* @param int|null $roomId 当前房间 ID
|
||||||
|
* @param bool $mutual 是否互相好友(added: B 是否已回加;removed: 之前是否互相)
|
||||||
*/
|
*/
|
||||||
private function notifyOnlineUser(
|
private function notifyOnlineUser(
|
||||||
string $targetUsername,
|
string $targetUsername,
|
||||||
string $fromUsername,
|
string $fromUsername,
|
||||||
string $action,
|
string $action,
|
||||||
?int $roomId = null
|
?int $roomId = null,
|
||||||
|
bool $mutual = false,
|
||||||
): void {
|
): void {
|
||||||
if (! $roomId) {
|
if (! $roomId) {
|
||||||
return;
|
return;
|
||||||
@@ -214,9 +220,14 @@ class FriendController extends Controller
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 根据操作类型和互相状态生成不同文案
|
||||||
$content = match ($action) {
|
$content = match ($action) {
|
||||||
'added' => "💚 <b>{$fromUsername}</b> 将你加为好友了!你们现在是好友了 🎉",
|
'added' => $mutual
|
||||||
'removed' => "💔 <b>{$fromUsername}</b> 已将你从好友列表移除。",
|
? "💚 <b>{$fromUsername}</b> 将你加为好友了!你们现在互为好友 🎉"
|
||||||
|
: "💚 <b>{$fromUsername}</b> 将你加为好友了!但你还没有添加对方为好友。",
|
||||||
|
'removed' => $mutual
|
||||||
|
? "💔 <b>{$fromUsername}</b> 已将你从好友列表移除。你的好友列表中仍保留对方。"
|
||||||
|
: "💔 <b>{$fromUsername}</b> 已将你从他的好友列表移除。",
|
||||||
'online' => "🟢 你的好友 <b>{$fromUsername}</b> 上线啦!",
|
'online' => "🟢 你的好友 <b>{$fromUsername}</b> 上线啦!",
|
||||||
default => '',
|
default => '',
|
||||||
};
|
};
|
||||||
@@ -225,6 +236,9 @@ class FriendController extends Controller
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 删除相关用灰色,其他用绿色
|
||||||
|
$fontColor = $action === 'removed' ? '#6b7280' : '#16a34a';
|
||||||
|
|
||||||
// 构建系统悄悄话消息
|
// 构建系统悄悄话消息
|
||||||
$msg = [
|
$msg = [
|
||||||
'id' => $this->chatState->nextMessageId($roomId),
|
'id' => $this->chatState->nextMessageId($roomId),
|
||||||
@@ -233,7 +247,7 @@ class FriendController extends Controller
|
|||||||
'to_user' => $targetUsername,
|
'to_user' => $targetUsername,
|
||||||
'content' => $content,
|
'content' => $content,
|
||||||
'is_secret' => true,
|
'is_secret' => true,
|
||||||
'font_color' => '#16a34a',
|
'font_color' => $fontColor,
|
||||||
'action' => '',
|
'action' => '',
|
||||||
'sent_at' => now()->toDateTimeString(),
|
'sent_at' => now()->toDateTimeString(),
|
||||||
];
|
];
|
||||||
|
|||||||
Reference in New Issue
Block a user