Add Mumble/mumble_stats_collector.php

This commit is contained in:
Clay 2025-07-29 14:53:46 -04:00
parent 6faaeec92f
commit e7e857fc0a

View 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);