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