Benutzer online
Gäste online 1
Mitglieder online 0

Mitglieder insgesamt: 1
Neuestes Mitglied: Loop1403
Foren-Statistiken
Besucher-Zähler
Besucher heute: 36
Besucher gestern: 19
Rekord: 485 (09.09.2026)
Besucher gesamt: 4961

Gesamt-Statistiken
Themen gesamt: 19
Beiträge gesamt: 19
Mitgliederumfragen
Hostet ihr eure Clouds selber?
ja100 %
100% [1 Vote]
Nein0 %
0% [0 Votes]
Kontaktformular
Für Hinweise, Fragen und Kritik haben wir stets ein offenes Ohr.
Einfach nachfolgendes Formular absenden und wir antworten schnellstmöglich.
CAPTCHA ImageRefresh Image

Dokumentation & Installation: TS3 Live-Panel mit Auto-Refresh für PHP-Fusion 9

Letzte Aktualisierung
Loop1403Loop1403Seiten Administrator
Veröffentlicht am
# 🚜 Dokumentation & Installation: TS3 Live-Panel mit Auto-Refresh für PHP-Fusion 9

Diese Anleitung beschreibt die dauerhafte Einbindung einer Live-Kanalliste deines TeamSpeak 3 Servers in die Seitenleiste von PHP-Fusion 9. Dank moderner AJAX-Technologie aktualisiert sich die Anzeige alle 10 Sekunden vollautomatisch im Hintergrund, ohne dass Benutzer das Forum neu laden müssen.

---

## 🛠️ TEIL 1: Technische Installation (Für den Administrator)

Um das System vor CMS-Code-Manipulationen zu schützen und den automatischen Hintergrund-Refresh zu ermöglichen, wird die Logik in eine eigenständige PHP-Datei ausgelagert und vom Forum per Include geladen.

### Schritt 1: Die PHP-Datei auf dem FTP-Server anlegen
1. Verbinde dich per FTP-Client (z. B. FileZilla) mit dem Webspace deines Forums.
2. Navigiere in das Verzeichnis: infusions/
3. Erstelle dort eine neue, leere Datei mit dem Namen: ts3_live.php
4. Öffne die Datei mit einem Texteditor, kopiere den folgenden Code hinein und passe die Platzhalter ganz oben an deine Zugangsdaten an:

php
<?php
// Erlaubt den Zugriff über PHP-Fusion ODER über das AJAX-Skript, verhindert aber Layout-Abbrüche bei Gästen
if (!defined('IN_FUSION') && (!isset($_SERVER['HTTP_X_REQUESTED_WITH']) || strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) !== 'xmlhttprequest')) {
 echo "<div style='color: #721c24; padding: 10px; background: #f8d7da; border: 1px solid #f5c6cb; border-radius: 4px; font-size: 11px; text-align: center;'>Zugriff verweigert.</div>";
 return;
}

try {
 // 1. VERBINDUNGSDATEN
 $query_user = "serveradmin";
 $query_pass = "deinpasswort";
 $server_ip = "deine ts server ip";
 $join_domain = "deine join domain";
 $query_port = 10011;
 $voice_port = 9987;

 // DEFINIERE DEINE TS3 GRUPPEN-NAMEN UND FARBEN (Hier ggf. IDs anpassen!)
 $group_names = [
 6 => ['name' => 'Admin', 'color' => '#dc3545'], // Rot für Admin
 // 8 => ['name' => 'Mod', 'color' => '#ffc107'], // Gelb für Moderator (Beispiel)
 // 10 => ['name' => 'Serverleitung', 'color' => '#6f42c1'] // Lila für Leitung (Beispiel)
 ];

 $socket = @fsockopen($server_ip, $query_port, $errno, $errstr, 2);
 if (!$socket) {
 throw new Exception("TS3-Server intern nicht erreichbar.");
 }
 
 stream_set_timeout($socket, 1);
 fgets($socket);
 fgets($socket);
 
 // 2. LOGIN
 fwrite($socket, "login client_login_name=" . $query_user . " client_login_password=" . $query_pass . "rn");
 $login_res = fgets($socket);
 if (strpos($login_res, "error id=0") === false) {
 throw new Exception("Login abgelehnt.");
 }
 
 // 3. VIRTUELLEN SERVER WÄHLEN
 fwrite($socket, "use port=" . $voice_port . "rn");
 fgets($socket);
 
 // 4. KANALLISTE ABBRUFEN
 fwrite($socket, "channellistrn");
 $channel_res = "";
 while (!feof($socket)) {
 $line = fgets($socket);
 $channel_res .= $line;
 if (strpos($line, "error id=0") !== false || stream_get_meta_data($socket)['timed_out']) break;
 }
 
 // 5. CLIENTLISTE ABBRUFEN (Mit dem Parameter -groups, um Ränge auszulesen)
 fwrite($socket, "clientlist -groupsrn");
 $client_res = "";
 while (!feof($socket)) {
 $line = fgets($socket);
 $client_res .= $line;
 if (strpos($line, "error id=0") !== false || stream_get_meta_data($socket)['timed_out']) break;
 }
 
 fwrite($socket, "quitrn");
 fclose($socket);

 $ts_decode = function($str) {
 $str = str_replace(['s', 'p', '/'], [' ', '|', '/'], $str);
 if (function_exists('mb_convert_encoding')) {
 $str = mb_convert_encoding($str, 'HTML-ENTITIES', 'UTF-8');
 }
 return $str;
 };

 // USER PARSEN
 $users_in_channels = [];
 $raw_clients = explode("|", $client_res);
 foreach ($raw_clients as $raw_client) {
 if (empty($raw_client)) continue;
 $c_blocks = explode(" ", $raw_client);
 $u_cid = ""; $u_name = ""; $u_type = ""; $u_groups = "";
 foreach ($c_blocks as $b) {
 if (strpos($b, "cid=") === 0) $u_cid = substr($b, 4);
 if (strpos($b, "client_nickname=") === 0) $u_name = $ts_decode(substr($b, 16));
 if (strpos($b, "client_type=") === 0) $u_type = substr($b, 12);
 if (strpos($b, "client_servergroups=") === 0) $u_groups = substr($b, 20);
 }
 
 if (!empty($u_cid) && !empty($u_name) && $u_type === "0") {
 // Speichere Usernamen zusammen mit seinen Gruppen-IDs ab
 $users_in_channels[$u_cid][] = [
 'name' => $u_name,
 'groups' => explode(',', $u_groups)
 ];
 }
 }

 // INHALT AUSGEBEN MIT MODERNEM ICON-SUPPORT
 echo "<a href='ts3server://$join_domain?port=$voice_port' class='btn btn-primary btn-block' style='display: block; text-align: center; padding: 10px; background: #007bff; color: white; border-radius: 4px; text-decoration: none; font-weight: bold; margin-bottom: 18px; box-shadow: 0 2px 4px rgba(0,123,255,0.2); max-width: 100%; box-sizing: border-box;'><i class='fa-solid fa-right-to-bracket' style='margin-right:8px;'></i>SERVER BEITRETEN</a>";
 echo "<div style='font-weight: bold; color: #007bff; border-bottom: 2px solid #007bff; padding-bottom: 5px; margin-bottom: 10px; text-transform: uppercase; font-size: 11px; letter-spacing: 0.5px;'><i class='fa-solid fa-network-wired' style='margin-right:6px;'></i>Echte Live-Kanäle:</div>";
 echo "<div class='ts3-tree' style='padding-left: 2px; max-width: 100%; overflow: hidden;'>";

 $raw_channels = explode("|", $channel_res);
 foreach ($raw_channels as $raw_channel) {
 if (empty($raw_channel)) continue;
 $blocks = explode(" ", $raw_channel);
 $c_id = ""; $c_name = ""; $is_spacer = false;
 foreach ($blocks as $block) {
 if (strpos($block, "cid=") === 0) $c_id = substr($block, 4);
 if (strpos($block, "channel_name=") === 0) $c_name = $ts_decode(substr($block, 13));
 if (strpos($block, "channel_flag_spacer=1") === 0) $is_spacer = true;
 }

 if (!empty($c_id) && !empty($c_name)) {
 if ($is_spacer) continue;
 $c_join = "ts3server://$join_domain?port=$voice_port&cid=$c_id";

 echo "<div class='ts-chan-row' style='margin-top: 2px; padding: 4px 6px; border-bottom: 1px solid #f9f9f9; max-width: 100%; box-sizing: border-box;'>";
 echo "<div style='display: flex; justify-content: space-between; align-items: center; min-width: 0; gap: 5px;'>";
 echo "<span style='font-weight: 600; color: #2c3e50; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; flex: 1; min-width: 0;'><i class='fa-solid fa-folder' style='color:#f39c12; margin-right:6px; font-size:12px;'></i>" . $c_name . "</span>";
 echo "<a href='" . $c_join . "' style='text-decoration: none; font-size: 10px; background: #28a745; color: white; padding: 3px 8px; border-radius: 12px; font-weight: bold; text-transform: uppercase; flex-shrink: 0;'>Join</a>";
 echo "</div>";

 if (isset($users_in_channels[$c_id])) {
 echo "<div style='padding-left: 12px; margin-top: 5px; border-left: 2px solid #28a745; margin-bottom: 5px; max-width: 100%; overflow: hidden;'>";
 foreach ($users_in_channels[$c_id] as $userdata) {
 echo "<div style='margin-top: 4px; font-size: 12px; color: #212529; display: flex; align-items: center; background: #f8f9fa; padding: 3px 8px; border-radius: 4px; border: 1px solid #e9ecef; max-width: 100%; box-sizing: border-box;'>";
 echo "<i class='fa-solid fa-user' style='color: #28a745; font-size: 10px; margin-right: 8px; flex-shrink: 0;'></i>";
 
 // Name ausgeben
 echo "<span style='font-weight: bold; color: #495057; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; flex: 1; min-width: 0; margin-right:6px;'>" . $userdata['name'] . "</span>";
 
 // Ränge/Status als Badge anhängen, wenn definiert
 foreach ($userdata['groups'] as $gid) {
 if (isset($group_names[$gid])) {
 echo "<span style='font-size: 9px; background: " . $group_names[$gid]['color'] . "; color: white; padding: 1px 5px; border-radius: 3px; font-weight: bold; text-transform: uppercase; margin-left: 4px; flex-shrink: 0; line-height: 1;'>" . $group_names[$gid]['name'] . "</span>";
 }
 }
 
 echo "</div>";
 }
 echo "</div>";
 }
 echo "</div>";
 }
 }
 echo "</div>";

} catch (Exception $e) {
 echo "<div style='color: #721c24; font-weight: bold; padding: 12px; border: 1px solid #f5c6cb; border-radius: 4px; background-color: #f8d7da; font-size: 12px; max-width: 100%; text-align: center;'>";
 echo "<i class='fa-solid fa-triangle-exclamation' style='margin-right:6px;'></i>TS3-Status aktuell nicht verfügbar.";
 echo "</div>";
}



### Schritt 2: Das Custom-Panel im PHP-Fusion Admin-Bereich einrichten
1. Logge dich im Admin-Panel deines Forums ein.
2. Navigiere zu **System-Admin** -> **Seitenwände (Panels)**.
3. Bearbeite dein bestehendes TeamSpeak-Panel oder erstelle ein neues Custom-Panel.
4. Füge in das große Inhaltsfeld diesen Steuerungscode ein (er erzeugt den weißen Rahmen und steuert den automatischen 10-Sekunden-Timer):

php
if (!defined("IN_FUSION")) { die("Access Denied"); }

// 1. Container ohne kritische Anführungszeichen öffnen
echo "<div id='ts3_live_container' style='font-family:Arial,sans-serif;font-size:13px;padding:15px;background:#ffffff;color:#333;border:1px solid #e0e0e0;border-radius:6px;box-shadow:0 2px 5px rgba(0,0,0,0.05);box-sizing:border-box;width:100%;max-width:100%;clear:both;overflow:hidden;'>";

if (file_exists(INFUSIONS."ts3_live.php")) {
 include(INFUSIONS."ts3_live.php");
} else {
 echo "TS3-Datei nicht gefunden.";
}

echo "</div>";

// 2. Das AJAX-Script (Ganz ohne einfache/doppelte Konflikte bei der URL)
$ajax_url = INFUSIONS."ts3_live.php";

echo "<script type='text/javascript'>
function refreshTS3Panel() {
 var container = document.getElementById('ts3_live_container');
 if (!container) return;
 
 var xhr = new XMLHttpRequest();
 xhr.open('GET', '".$ajax_url."', true);
 xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
 
 xhr.onreadystatechange = function() {
 if (xhr.readyState == 4 && xhr.status == 200) {
 if (xhr.responseText.trim() !== '' && xhr.responseText.indexOf('Access Denied') === -1) {
 container.innerHTML = xhr.responseText;
 }
 }
 };
 xhr.send();
}
setInterval(refreshTS3Panel, 10000);
</script>";


5. **Wichtig:** Setze die Option **„Ausführung von PHP-Code erlauben?“** auf **Ja**.
6. Klicke auf **Panel speichern**.

---

## 📖 TEIL 3: Benutzerhandbuch (Für die Foren-Community / Ankündigung)

### 🚀 Funktionen der neuen Live-Seitenleiste:

* **Schnell-Verbindung (Gesamter Server):**
Durch Klicken auf den großen blauen Button **"SERVER BEITRETEN"** ganz oben im Panel verbindet sich dein installierter TeamSpeak 3 Client automatisch mit unserem Server.

* **Gezielter Kanal-Beitritt (Direkt-Join):**
Rechts neben jedem Kanalnamen befindet sich ein grüner, runder **"JOIN"**-Button. Klickst du darauf, wirst du vom System direkt in diesen spezifischen Raum geschoben. Lästiges Suchen entfällt!

Echtzeit-User Statusanzeige mit Auto-Refresh:Das Panel listet alle aktiven Räume untereinander auf. Befinden sich Spieler in einem Raum, öffnet sich automatisch eine kleine Box mit einem grünen Online-Punkt und dem Namen des Spielers.Das Beste: Die Liste aktualisiert sich alle 10 Sekunden vollautomatisch im Hintergrund. Du musst das Forum nicht neu laden, um zu sehen, ob jemand den Kanal gewechselt hat oder neu online gekommen ist!
zuletzt bearbeitet von Loop1403 am 11-08-2026 23:29,
Deine Benutzerrechte reichen nicht aus, um die Anhänge des Themas zu sehen.
Du kannst alle Themen in diesem Forum sehen.
Du kannst nicht ein neues Thema in diesem Forum eröffnen.
Du kannst nicht auf dieses Thema antworten.
Du kannst nicht Umfragen in diesem Forum erstellen.
Du kannst nicht Anhänge in diesem Forum hochladen.
Du kannst nicht Anhänge in diesem Forum herunterladen.
Anmelden
Noch keinen Account? Klicke hier, um dich zu registrieren.
Passwort vergessen?
Shoutbox
Du musst dich anmelden, um eine Nachricht zu senden.
Loop1403
Loop1403#1
Moingsen
SERVER BEITRETEN
Echte Live-Kanäle:
Eurotruck SimulatorJoin
LS 25Join
Schwesing BahnhofJoin
MindenerwaldJoin
Hebby`s SabbeleckeJoin
Sven,s ZockerbudeJoin
Left for DeadJoin
CounterstrikeJoin
World of WarshipsJoin
BattlefieldJoin
Klönecke( wenn nicht Gespielt wird)Join
Tratschecke ( im Single Player )Join
TeamJoin
AwayJoin
BesprechungJoin