100 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			100 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
// Minimal, bulletproof Mumble stats collector
 | 
						|
 | 
						|
require_once "/usr/share/php/Ice.php";
 | 
						|
if (!class_exists("Ice\\Value")) {
 | 
						|
    eval("namespace Ice; class Value {}");
 | 
						|
}
 | 
						|
if (!class_exists("Ice\\UserException")) {
 | 
						|
    eval("namespace Ice; class UserException extends \\Exception {}");
 | 
						|
}
 | 
						|
require_once __DIR__ . "/MumbleServer.php";
 | 
						|
 | 
						|
$iceConnectionString = "Meta:tcp -h 127.0.0.1 -p 6502";
 | 
						|
$serverId = 1;
 | 
						|
$iceSecret = "PASSWORD1234";
 | 
						|
$userStatsFile = __DIR__ . "/mumble_users.json";
 | 
						|
$now = time();
 | 
						|
$today = date("Y-m-d");
 | 
						|
 | 
						|
// Load stats
 | 
						|
$userStats = [];
 | 
						|
if (file_exists($userStatsFile)) {
 | 
						|
    $userStats = json_decode(file_get_contents($userStatsFile), true) ?: [];
 | 
						|
}
 | 
						|
 | 
						|
// Remove legacy fields
 | 
						|
foreach ($userStats as &$userData) {
 | 
						|
    unset($userData["sessions"], $userData["channels"]);
 | 
						|
}
 | 
						|
unset($userData);
 | 
						|
 | 
						|
try {
 | 
						|
    $ICE = Ice\initialize();
 | 
						|
    $proxy = $ICE->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);
 |