user()); $messages = CharacterMessage::query() ->where(function ($q) use ($me, $character): void { $q->where('from_character_id', $me->id)->where('to_character_id', $character->id); }) ->orWhere(function ($q) use ($me, $character): void { $q->where('from_character_id', $character->id)->where('to_character_id', $me->id); }) ->orderBy('id') ->limit(100) ->get() ->map(fn (CharacterMessage $m) => [ 'from' => (int) $m->from_character_id, 'body' => $m->body, 'at' => $m->created_at?->toIso8601String(), ]); return response()->json([ 'me' => $me->id, 'them' => $character->id, 'messages' => $messages, ]); } /** * Send a chat message to another character. */ public function send(Request $request, Character $character): JsonResponse { $me = Character::ensureForUser($request->user()); if ((int) $character->id === (int) $me->id) { return response()->json(['message' => __('city.social_self')], 422); } $data = $request->validate([ 'body' => ['required', 'string', 'max:1000'], ]); $message = CharacterMessage::create([ 'from_character_id' => $me->id, 'to_character_id' => $character->id, 'body' => $data['body'], ]); return response()->json([ 'message' => __('city.chat_sent'), 'id' => $message->id, ]); } }