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