[TS3 PHP Framework] Gotowa lista klientów

Jebanany | 2018-06-13 11:49:48 UTC | #1

Tworzenie tabeli z użytkownikami na stronie

Dzisiaj pokażę Wam, w jaki sposób umieścić tabelę z listą użytkowników na swojej stronie internetowej. Pomoże nam w tym TS3 PHP Framework oraz Bootstrap. Oczywiście, aby sobie pomóc korzystamy również z dokumentacji PHP.

INFO: (cały kod przedstawionego poradnika dostępny do pobrania na końcu postu)


Zaczynajmy - potrzebne narzędzia

Wykorzystamy do tego Boostrap - o nim poczytacie więcej na jego stronie. Nie będę zagłębiać się tutaj w to, jak wygląda tworzenie strony internetowej, po prostu przejdę do konkretów.

Skorzystamy również z witryn/witryny, która dostarcza przy pomocy CDN plików JavaScript, CSS itp.
Jak podaje Wikipedia:

Content delivery network (ang. CDN) - duży, rozproszony system dostarczania treści do wielu centrów danych i punktów wymiany ruchu (IX) w Internecie. Celem CDN jest udostępnianie zawartości o wysokiej dostępności i wydajności końcowym użytkownikom.

i co ważne:

Optymalizacja z użyciem CDN przynosi zazwyczaj niższe koszty za usługi hostingowe, przyspiesza wczytywanie stron internetowych oraz zwiększa odporność na przejściowe zwiększenie natężenia ruchu na obsługiwanej stronie.

Czyli zamiast pobierać np. skrypty i kaskadowe arkusze stylów z naszego hosta, użyjemy po prostu zewnętrznych linków, które przyspieszą działanie naszej strony i zapewnią 100% dostępność do tych plików.

Zazwyczaj znane projekty same utrzymują swoje biblioteki, ale istnieją popularne serwisy, które za darmo hostują wiele popularnych bibliotek - ułatwia to proces umieszczania takowych w swojej stronie. Np:

W swoim poradniku skorzystam z tych od GibHuba.


Tworzymy prostą i czytelną stronę internetową

W tagu <head> umieszczamy potrzebne style (Bootstrap) oraz biblioteke JQuery - uzyskane ze strony GitHub.

<html>
    <head>      
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">

        <title>Tabela użytkowników na serwerze TeamSpeak 3</title>

        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.css" />

        <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.js"></script>
    </head>

    <body>
        <div class="container">
            <h1>Lista użytkowników online</h1>
            <p>Tabelka</p>
        </div>
    </body>
</html>

Jeśli poprawnie stworzymy kod, strona powinna wyglądać tak:


Tworzenie tabeli z użytkownikami online

To, jak uzyskać listę użytkowników, wiecie już z poprzedniego poradnika
https://forum.lvlup.pro/t/poradnik-ts3-php-framework-pobieranie-listy-klientow-dzialamy/1116

Teraz musimy tylko to ładnie ubrać i wpleść w tabelkę HTML. W tym celu umieszczamy pętlę w PHP wewnątrz tabeli i dla każdego użytkownika tworzymy oddzielny wiersz.

Kod takiej tabeli powinien wyglądać tak:

<table id="ts_users_table" class="table">
    <thead>
        <tr>
            <th>Nickname</th>
            <th>Czas online (sekundy)</th>
        </tr>
    </thead>
    <tbody>
        <?php 
        foreach($clients as $client){
            if($client['client_type']) continue; //pomijamy ServerQuery
        ?>
        <tr>
            <td><?php echo $client['client_nickname']; ?></td>
            <td><?php echo $client['connection_connected_time']/1000; ?></td>
        </tr>
        <?php
        }
        ?>
    </tbody>
</table>

Na jakim kanale przebywa użytkownik

Dodajmy jeszcze informację - kanał, na którym przebywa użytkownik. Pobieramy w tym celu listę kanałów na serwerze TeamSpeak 3.

$channels = $ts->channelList();

Następnie w naszej pętli dodajemy dodatkową kolumnę wyświetlającą kanał, na którym jest użytkownik:

<td><?php echo $channels[$client['cid']]; ?></td>

Małe zabezpieczenia

Dodajmy jeszcze try i catch oraz funkcje, które usprawnią wyświetlanie nicków, które mogą kłócić się z językiem HTML.

<?php 
    try{
        foreach($clients as $client){
            if($client['client_type']) continue; //pomijamy ServerQuery
        ?>
        <tr>
            <td><?php echo htmlentities($client['client_nickname']); ?></td>
            <td><?php echo round($client['connection_connected_time']/1000, 0); ?></td>
            <td><?php echo htmlentities($channels[$client['cid']]); ?></td>
        </tr>
        <?php
        }
    }
    catch(Exception $e){
        echo 'Wystąpił błąd podczas generowania listy użytkowników: <br>Kod błędu: <code><b>'.$e->getCode().'</b></code> oraz treść błędu: <b><code>'.$e->getMessage().'</code></b>';
    }
?>

Funkcja htmlentities() zabezpiecza nas przed nieporządanymi dla HTML znakami np. <br> itp.
Funkcja round() zaokrągli liczbę sekund online (dzielimy czas online przez 1000, bo jest podany w mikrosekundach).

Natomiast zastosowanie try oraz catch było omawiane we wcześniejszym poradniku:
https://forum.lvlup.pro/t/poradnik-ts3-php-framework-laczenie-z-serwerem-oraz-bloki-try-catch/1081

Dzięki temu, podczas wystąpienia błędu - strona się nie wysypie, a pokaże komunikat np.:

Jeśli wszystko zrobimy zgodnie z poradnikiem otrzymamy taki rezultat:


Dodajmy małe sortowanie - DataTables

Kolejna biblioteka! Cudownie. Ułatwi nam ona sortowanie danych, co za chwilę zobaczycie na screenie. Dodajemy ponownie z CDN (style, skrypty):

<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/datatables/1.10.13/css/dataTables.bootstrap.css" />

<script src="https://cdnjs.cloudflare.com/ajax/libs/datatables/1.10.13/js/jquery.dataTables.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/datatables/1.10.13/js/dataTables.bootstrap.min.js"></script>

<script>
    $(document).ready( function () {
        $('#ts_users_table').DataTable(); //id naszej tabeli
    });
</script>

Ostateczny wygląd

Użycie DataTables umożliwia nam wygodną paginację, sortowanie wierszy tabeli oraz wyszukiwanie bez potrzeby odświeżania strony:

Podsumowanie

Mam nadzieję, że teraz jeszcze lepiej rozumiesz to, jak korzystać z TS3 PHP Framework. Taką tabelkę możecie dowolnie przebudować i umieścić na swojej stronie internetowej. Warto zauważyć, iż każde odświeżenie strony powoduje ponowne pobranie danych z serwera TeamSpeak 3. W następnych częściach dowiecie się, jak zapisać dane o użytkownikach w pliku, aby pobierały się tylko co jakiś czas (np. co 1 minutę).

Cały kod do pobrania

Tutaj jest dostępny cały kod do pobrania (paczka zip): gotowalistaklientow.zip

Propozycje

Piszcie w komentarzach, co myślicie o takich poradnikach. Wolicie gotowe rozwiązania? Czy chcecie wiedzieć jak to działa? Komentujcie i oceniajcie!


Timo | 2017-03-22 19:21:52 UTC | #2

Bardzo ciekawe, jak będę tworzył serwer teamspeaka to koniecznie zastosuję :)
A jeszcze pytanie - czy dałoby się z kolumny Aktualny Kanał usunąć oznaczenia [cspacer], [spacer] lub inne? Lub ewentualnie żeby sformatować tekst w tej kolumnie jedynie do liter (by wyświetlało litery, dla przykładu [cspacer] → Fajny Kanał ← wyświetlało samo Fajny Kanał) :D


anon82750602 | 2017-03-22 20:25:14 UTC | #3

Fajny dodatek na stronę gdy będę otwierał ts-a dla sieci


Jebanany | 2017-03-22 22:02:16 UTC | #4

Jak najbardziej jest to możliwe, istnieją funkcje w Frameworku, które to sprawdzają, ale ja preferują delikatną zmianę na takie coś.

Przygotowałem 3 funkcje

Trzeba pamiętać, że spacer’y nie mają swojego pid - spacer może być spacer’em tylko wtedy, gdy jest podkanałem serwera - nie będacy podkanałem żadnego kanału.

Przyjmijmy, że $lista_kanalow to nasza zmienna z kanałami:

function channelIsSpacer($cid){
    global $lista_kanalow;
    // sprawdzamy, czy w ogóle istnieje taki kanał
    // sprawdzamy, czy jest spacer'em - czy jest podkanałem serwera
    // dodany jest też warunek, czy kanał jest kanałem stałym
    // kanały temporary i semi-permanent - nie mogą być spacerem
    if(isset($lista_kanalow[$cid])){ 
        return (preg_match("/\[[^\]]*spacer[^\]]*\]/", $lista_kanalow[$cid]['channel_name']) && $lista_kanalow[$cid]["channel_flag_permanent"] && !$lista_kanalow[$cid]["pid"]) ? true : false;
    }
    else{
        return false;
    }

}

// sprawdzamy typ spacer'a
// jakie wyrównanie tekstu
function channelSpacerType($cid){
    global $lista_kanalow;
    if(isset($lista_kanalow[$cid])){
        if(!channelIsSpacer($cid) || !preg_match("/\[(.*)spacer.*\]/", $lista_kanalow[$cid]['channel_name'], $matches) || !isset($matches[1])){
            return 'LEFT';
        }
        else{
            switch($matches[1]){
                case "*":
                return 'REPEAT';

                case "c":
                return 'CENTER';

                case "r":
                return 'RIGHT';

                default:
                return 'LEFT';
            }
        }
    }
    else{
        return false;
    }
}

// uzyskujemy nazwę spacer'a - najbardziej trywialne rozwiązanie jakie istnieje
// podzielenie nazwy w miejscu wystąpienia pierwszego znaku "]"
function return_spacer_name($cid){
    global $lista_kanalow;
    $cid = $lista_kanalow[$cid]['channel_name'];
    $array = explode(']', $cid);
    array_shift($array);
    $channel_name = implode('', $array);
    return htmlspecialchars($channel_name);

}

W taki oto sposób można sobie poradzić z spacer’ami na swoim serwerze. Przykład budowy drzewa i zastosowania moich powyższych funkcji znajdziesz na Użytkownicy Online - Teamspeak Eqipa.pl - Nowy Wymiar Rozmów


Glupikocz | 2017-04-10 06:24:33 UTC | #5

Jebanany a można np zmienić sekundy na minuty lub godziny?

a tu oddzielny temat dało by rade zrobić coś takiego? lub jest to może jakiś gotowy skrypt bo widzę ty się na tym znasz?


DBanaszewski | 2017-04-10 06:45:43 UTC | #6

Pytanie nie do mnie, ale powiem :stuckouttongue:

Tak, jak najbardziej :slight_smile:

https://pastebin.com/HFPQXpmY

Po użyciu opcji czasNaGodziny(ilość sekund) nie musisz dawać go w echo (czyli echo czasNaGodziny(ilość sekund); jest błędem).