[TS3 PHP Framework] Łączenie z serwerem oraz bloki try/catch

Poradniki
ts3, query
Jebanany
Jebanany

Łączymy się z serwerem TeamSpeak 3 za pomocą TeamSpeak 3 Server Query

W poprzednik poradniku https://lvlup.rok.ovh/t/poradnik-ts3-php-framework-tworzenie-konfiguracji/852 pokazałem Wam, jak w prosty sposób stworzyć plik konfiguracyjny naszych skryptów opartych o framework.

Następnym krokiem będzie połączenie się z naszym serwerem i poznanie podstaw obsługi obiektowego języka PHP.

Połączmy się więc!

// Ładujemy nasz framework
require_once("libraries/TeamSpeak3/TeamSpeak3.php");
// Ładujemy naszą konfigurację
require("ts_config.php");

Początkowy kod wyglądałby tak:

$ts3_VirtualServer = TeamSpeak3::factory("serverquery://username:password@127.0.0.1:10011/?server_port=9987");

My uprościmy go korzystając z utworzonej przez nas wcześniej konfiguracji

// $ts - tworzymy obiekt naszego wirtualnego serwera, a korzystając z wcześniejszej konfiguracji wpisujemy odpowiednie stałe w odpowiednie miejsca
$ts = TeamSpeak3::factory("serverquery://".ts_query_username.":".ts_query_password."@".ts_query_ip.":".ts_query_port."/?server_port=".ts_server_port);
 

Wartości dotyczące użytkownika, hasła, IP, portu Server Query, oraz portu serwera zastąpiliśmy odpowiednio stałymi - funkcja define() - ts_query_username, ts_query_password, ts_query_ip, ts_query_port, ts_server_port.

W całości połączenie z serwerem uzyskami tworząc plik connect.php o takiej zawartości.

require_once("libraries/TeamSpeak3/TeamSpeak3.php");
require("ts_config.php");
 
$ts = TeamSpeak3::factory("serverquery://".ts_query_username.":".ts_query_password."@".ts_query_ip.":".ts_query_port."/?server_port=".ts_server_port);
 

Od teraz możemy wysyłać komendy do naszego serwera.

W kolejnych poradnikach dowiemy się w jaki sposób pracować nad listą osób na serwerze oraz wykonywać najprostsze polecenia na użytkownikach.

Błędy w obiektowym programowaniu PHP

Pracując na obiektach PHP (inne języki również) daje nam możliwość wyświetlania błędów w przypadku błędnego użycia klas czy parametrów, ich rodzaju, miejscu powstania (dokładny numer linii) w sposób bardziej dokładny, ze względu na stworzenie odpowiednich reakcji na konkretne pomyłki programisty. Jak podaje nam Wikipedia:

Błędy nie muszą wynikać wyłącznie z nieuwagi programisty. Może je powodować użytkownik poprzez dziwne działania, niewłaściwą konfigurację lub nawet problemy systemowe. Obsługa błędów jest to jeden z istotniejszych elementów współczesnych aplikacji. Początkujący programiści często ją bagatelizują, kompletnie nie przejmując się tym, że przy złych ustawieniach na ekranie przeglądarki pojawia się 500 ostrzeżeń PHP, albo załatwiając sprawę najprostszą komendą die(). Wykorzystują to hakerzy, dla których ścieżki dostępu, nazwy plików i numery linii wyświetlane przy komunikatach PHP to znakomite źródło informacji o serwerze, skrypcie oraz umiejętnościach programisty.

Przyjrzyjmy się zatem dwóm blokom, z których będziemy często korzystać: try oraz catch. Jest również finally, jednak na tym etapie poradnika nie będzie nam potrzebny.


Załóżmy, że podczas łączenia się z serwerem wystąpi pewien problem. Np. podamy błędne hasło, serwer jest wyłączony, zostaniemy zbanowani itp. Jak się o tym dowiedzieć? To proste - używając bloków try oraz catch.

Połączmy się z naszym serwerem jeszcze raz, ale tym razem używając złego hasła:

// włączmy raportowanie błędów
error_reporting(E_ALL);
ini_set('display_errors', 1);
 
// połączmy się ze złym hasłem
$ts = TeamSpeak3::factory("serverquery://".ts_query_username.":bylejakiehaslo@".ts_query_ip.":".ts_query_port."/?server_port=".ts_server_port);

Skrypt zwróci nam taki błąd:

Fatal error:  Uncaught exception 'TeamSpeak3_Transport_Exception' with message 'Connection refused' in /lvlup/libraries/TeamSpeak3/Transport/TCP.php:54
Stack trace:
#0 /lvlup/libraries/TeamSpeak3/Transport/TCP.php(108): TeamSpeak3_Transport_TCP->connect()
#1 /lvlup/libraries/TeamSpeak3/Adapter/ServerQuery.php(76): TeamSpeak3_Transport_TCP->readLine()
#2 /lvlup/libraries/TeamSpeak3/Adapter/Abstract.php(60): TeamSpeak3_Adapter_ServerQuery->syn()
#3 /lvlup/libraries/TeamSpeak3/TeamSpeak3.php(320): TeamSpeak3_Adapter_Abstract->__construct(Array)
#4 /lvlup/lvlup.php(12): TeamSpeak3::factory('serverquery://s...')
#5 {main}
  thrown in /lvlup/libraries/TeamSpeak3/Transport/TCP.php on line 54

Bład krytyczny! Uncaught exception!


Spróbujmy z blokami try i catch

// włączmy raportowanie błędów
error_reporting(E_ALL);
ini_set('display_errors', 1);
 
// połączmy się ze złym hasłem oraz blokiem try i catch
try{
	$ts = TeamSpeak3::factory("serverquery://".ts_query_username.":bylejakiehaslo@".ts_query_ip.":".ts_query_port."/?server_port=".ts_server_port);
}
catch(Exception $e){
	// przypiszmy błąd do $e 
	// wyświetlmy kod błędu oraz jego treść
	echo 'Kod błędu: '.$e->getCode().' oraz treść błędu: '.$e->getMessage().'';
}

Skrypt zwróci:

Kod błędu: 111 oraz treść błędu: Connection refused

Na podstawie kodu błędu oraz jego treści możemy zdiagnozować problem, który wystąpił. Będzie to tyczyć się większości operacji, jakie będziemy chcieli dokonać już po zalogowaniu na nasz serwer. W tym wypadku podaliśmy błędne hasło i serwer odrzucił nasze połączenie - jak możemy się domyślić z podania błędnych danych logowania.

Jak czytamy na https://pl.wikibooks.org/wiki/PHP/Wyj%C4%85tki

Konstruktor klasy Exception przyjmuje do trzech argumentów:

Komunikat $message Kod błędu $code Poprzedni wyjątek $previous

Ponadto mamy do dyspozycji szereg metod służących do pobierania informacji o wyjątku, gdy już go przechwycimy:

getMessage() - zwraca komunikat błędu. getCode() - zwraca kod błędu. getPrevious() - zwraca poprzedni wyjątek. getFile() - zwraca nazwę pliku, w którym wyjątek został rzucony. getLine() - zwraca numer linii, w której wyjątek został rzucony. getTrace() - zwraca tablicę zawierającą ślad stosu, czyli informacje o wszystkich funkcjach i metodach wywołanych w momencie rzucenia wyjątku. getTraceAsString() - zwraca ślad stosu, ale jako tekst.

Jeśli chcesz dowiedzieć się więcej zachęcam do przeczytania o wyjątkach tutaj: https://pl.wikibooks.org/wiki/PHP/Wyj%C4%85tki http://php.net/manual/en/language.exceptions.php http://www.w3schools.com/php/php_exception.asp


Reasumując dzisiejszą część poradnika. Dzięki zastosowaniu w odpowiedni sposób bloków try i catch będziemy mogli zdiagnozować błędy występujące w naszym skrypcie lub podczas jego używania. Połączenie z serwerem nie będzie stanowiło już problemu.

ArrMeeR
ArrMeeR

Poradnik bardzo fajny i ładnie napisany :slight_smile:

Osobiście wolę używać ts3admin, ale to już sprawa indywidualna

Czekam na więcej poradników :D

Szymon
Szymon

w ts3admin jest taki problem, że nie jest w stanie obsługiwać eventów (a przynajmniej mi się tak wydaje).

ts3admin odbiera wiadomości tylko wtedy kiedy potrzebujesz tego ty. A Przynajmniej mi się tak wydaje.

Jebanany
Jebanany

Co masz dokładniej na myśli? Rozbudowane boty można stworzyć i tu i tu. Co byś chciał osiągnąć?

Szymon
Szymon

Nie można nasłuchiwać eventów, które są wbudowane w Server Query. Chodzi mi o notify...

Jebanany
Jebanany

Jak najbardziej TS3Framework ma takie funkcje, a w ts3admin nie zagłębiałem się. Masz rację.