false, 'ERROR' => 'method_not_allowed'], 405); } $address = trim($_GET['Address'] ?? ''); if ($address === '') jsonResponse(['OK' => false, 'ERROR' => 'address_required']); $agent = queryOne("SELECT * FROM Sprinter_Agents WHERE FullAddress = ?", [$address]); if (!$agent) jsonResponse(['OK' => false, 'ERROR' => 'user_not_found']); // Get last activity from channel memberships $lastActivity = queryOne( "SELECT MAX(LastViewedAt) as LastSeen FROM Hub_ChannelMembers WHERE AgentAddress = ?", [$address] ); // Get last message sent $lastMessage = queryOne( "SELECT MAX(CreatedAt) as LastMessageAt FROM Hub_Messages WHERE SenderAddress = ? AND IsDeleted = 0", [$address] ); $lastSeen = $lastActivity['LastSeen'] ?? null; $lastMessageAt = $lastMessage['LastMessageAt'] ?? null; // Use the most recent of the two $latestActivity = null; if ($lastSeen && $lastMessageAt) { $latestActivity = max($lastSeen, $lastMessageAt); } else { $latestActivity = $lastSeen ?: $lastMessageAt; } // Consider "online" if active in last 5 minutes $isOnline = false; if ($latestActivity) { $diff = time() - strtotime($latestActivity); $isOnline = ($diff < 300); } jsonResponse([ 'OK' => true, 'Status' => [ 'Address' => $address, 'IsOnline' => $isOnline, 'LastActivityAt' => $latestActivity ? toISO8601($latestActivity) : null, 'IsActive' => (bool) $agent['IsActive'], ], ]);