stringToProxy($iceConnectionString); $meta = class_exists("\Murmur\MetaPrxHelper") ? \Murmur\MetaPrxHelper::checkedCast($proxy) : \MumbleServer\MetaPrxHelper::checkedCast($proxy); $context = ["secret" => $iceSecret]; $server = $meta->getServer($serverId, $context); $rawUsers = $server->getUsers($context); } catch (Exception $e) { exit(1); } // Build online user hashes $onlineHashes = []; foreach ($rawUsers as $id => $user) { $userName = is_object($user) ? $user->name ?? "Unknown User" : $user["name"] ?? "Unknown User"; $userHash = is_object($user) ? $user->hash ?? md5($userName) : $user["hash"] ?? md5($userName); $onlineHashes[$userHash] = $userName; } // Process online users foreach ($onlineHashes as $userHash => $userName) { if (!isset($userStats[$userHash])) { $userStats[$userHash] = [ "name" => $userName, "first_seen" => $now, "last_seen" => $now, "connect_count" => 1, "days" => [$today => 1], "total_time" => 0, "current_session" => ["start" => $now], "is_connected" => true, ]; } else { $userStats[$userHash]["name"] = $userName; $userStats[$userHash]["last_seen"] = $now; if (empty($userStats[$userHash]["is_connected"])) { $userStats[$userHash]["connect_count"]++; $userStats[$userHash]["current_session"] = ["start" => $now]; } $userStats[$userHash]["is_connected"] = true; if (!isset($userStats[$userHash]["days"][$today])) { $userStats[$userHash]["days"][$today] = 1; } } } // Process disconnects foreach ($userStats as $userHash => &$userData) { if (!isset($onlineHashes[$userHash])) { if (!empty($userData["is_connected"])) { $userData["is_connected"] = false; if (isset($userData["current_session"]["start"])) { $duration = $now - $userData["current_session"]["start"]; $userData["total_time"] += $duration; unset($userData["current_session"]); } } } } unset($userData); file_put_contents($userStatsFile, json_encode($userStats, JSON_PRETTY_PRINT)); chmod($userStatsFile, 0666);