id === (int) $id; }); // 聊天室房间 Presence Channel 鉴权与成员信息抓取 Broadcast::channel('room.{roomId}', function ($user, $roomId) { $room = \App\Models\Room::find($roomId); if (! $room || ! $room->canUserEnter($user)) { return false; } $chatState = app(\App\Services\ChatStateService::class); if (! $chatState->isUserInRoom((int) $roomId, $user->username)) { return false; } $superLevel = (int) \App\Models\Sysparam::getValue('superlevel', '100'); // 预加载当前在职职务,供右侧在线名单直接显示职务图标与名称。 $activePosition = $user->activePosition()->with('position.department')->first(); $position = $activePosition?->position; return [ 'id' => $user->id, 'username' => $user->username, 'user_level' => $user->user_level, 'sex' => $user->sex, 'headface' => $user->headface, // 通过 accessor 读取 usersf,默认 1.gif 'vip_icon' => $user->vipIcon(), 'vip_name' => $user->vipName(), 'vip_color' => $user->isVip() ? ($user->vipLevel?->color ?? '') : '', 'is_admin' => $user->user_level >= $superLevel, 'position_icon' => $position?->icon ?? '', 'position_name' => $position?->name ?? '', 'department_name' => $position?->department?->name ?? '', ]; }); // 用户私有频道鉴权(好友通知:FriendAdded / FriendRemoved / BannerNotification) // 使用数字 ID 命名频道,避免中文用户名导致 Pusher 频道名验证失败。 Broadcast::channel('user.{id}', function ($user, $id) { return (int) $user->id === (int) $id; }); // 五子棋对局私有频道(仅对局双方可订阅,用于实时同步落子) Broadcast::channel('gomoku.{gameId}', function ($user, $gameId) { $game = \App\Models\GomokuGame::find($gameId); if (! $game) { return false; } return $game->belongsToUser($user->id); });