Add Mumble/mumble_stats_collector.php
This commit is contained in:
		
							parent
							
								
									6faaeec92f
								
							
						
					
					
						commit
						e7e857fc0a
					
				
					 1 changed files with 100 additions and 0 deletions
				
			
		
							
								
								
									
										100
									
								
								Mumble/mumble_stats_collector.php
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								Mumble/mumble_stats_collector.php
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,100 @@
 | 
			
		|||
<?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);
 | 
			
		||||
		Loading…
	
	Add table
		
		Reference in a new issue