felixms / arma-rcon-class-php

A lightweight client for sending commands easily to a BattlEye server.
MIT License
46 stars 22 forks source link

getPlayersArray / getBansArray #10

Closed 0FakE closed 8 years ago

0FakE commented 8 years ago

Nizarii commented 3 days ago

Mir ist bis jetzt nichts Ungewöhnliches aufgefallen, bis auf https://github.com/Nizarii/arma-rcon-class-php/blob/master/arc.php#L532. Kannst bitte mal die Funktion formatList durch diese hier ersetzten? Vielen Dank schon mal im voraus! :+1:

Ich habe das selbe Problem, dass offenbar schon geklärt wurde. Leider ist der "diese hier" Github Link von dir nicht mehr aktiv.

Die Fehlerquelle ist:

preg_match_all("#(\d+)\s+(\b\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}:\d+\b)\s+(\d+)\s+([0-9a-fA-F]+)(\w+)\s([\S ]+)$#im", $bans, $str);

Er sortiert das PlayersArray ordentlich, gibt aber bei den Bans boolean:null aus.

Ich kann den Fehler darin leider nicht finden. Die preg_match_all Suche liefert keinen Wert zurück. Warum, wo ist der Fehler? Das Suchmuster ist das selbige wie bei dem PlayerArray

felixms commented 8 years ago

Also getPlayersArray funktioniert bei dir so wie es sein soll?

0FakE commented 8 years ago

getPlayersArray & getBansArray geben ausschließlich leere Arrays zurück, obwohl getPlayers & getBans die unformatierte Version ordentlich anzeigt.

Ändere ich folgende Zeile in getPlayersArray

$playersRaw = $this->send("players");

in

$playersRaw = $this->send("players") ? $this->getAnswer() : false;

gelingt auch die formatierte Ausgabe des PlayerArrays.

Allerdings gibt das BanArray nur und auschließlich immer ein leeren Array zurück, obwohl Bans vorhanden sind und unformatiert sichtbar mit getBans.

Nach einigem Hin- und Herprobieren habe ich das Suchmuster "preg_match_all" als Fehlerquelle indifiziert, kenne mich aber mich Suchmustern nicht aus.

0FakE commented 8 years ago

Ebensfalls ein seltsames Phänomen ist es, dass die RCON Verbindung immer wieder sofort geschlossen wird. Setze ich die Variable

private $disconnected = true;

auf false, um die Verbindung selbst mit close zu schließen, ist die Funktion in diesem Falle nutzlos und gibt sogar noch verschiedene Fehler zurück.

Auch die Session private $socket = null; so zu definieren, gibt bei manueller Beendigung der Verbindung Warnungen und Fehler zurück.

0FakE commented 8 years ago

Falls näheres Interesse deinerseits besteht die Probleme zu lösen, können wir uns auch gern persönlich unterhalten. Wie und wo auch immer...

felixms commented 8 years ago

Vielen Dank für dein Feedback. Du hast mich auf einen kleinen Leichtsinnsfehler aufmerksam gemacht : Wie du schon geschrieben hast, $playersRaw = $this->send("players"); natürlich ist das Ergebnis leer, wenn die Antwort vom Server nicht abgelesen wird :joy: Die Verbindung sollte eigntl erst am Ende geschlossen werden, da close() erst im Destruktor aufgerufen wird. Um die Verbindung manuell zu schließen musst du nicht $disconnected = false setzen. Diese Variable ist nur Klassen intern da, um zu bestimmen, ob die Verbindung bereits geschlossen wurde, weshalb diese auch auf private gesetzt ist. Ich ändere kurz die beiden Funktionen, wäre nett, wenn du mir sagen könntest ob sie funktionieren :+1:

0FakE commented 8 years ago

In Ordnung. Ich lasse dir sobald alles verfügbar ist, ein Feedback zukommen.

Nochmal zum Thema Verbindung Beenden...

Wieso ist die Variable $disconnected dann in der Klasse extra definiert? Ich würde die Verbindung gern selbst aufrecht erhalten.

Okay... in den Deconstructor habe ich noch nicht geschaut.

felixms commented 8 years ago

Die Verbindung wird ja solange aufrecht erhalten, bis die Klasse nicht mehr gebraucht wird. Deswegen steht ja close() im Destruktor.

0FakE commented 8 years ago

Ja, ich würde die Verbindung gern solange aufrecht erhalten, bis ich sie schließe.


var_dump($rcon->getBans()); var_dump($rcon->getBansArray());

getBans -> liefert den unformierten Text zurück getBansArray --> liefert ein leeres Array

0FakE commented 8 years ago

Wie ich gestern schon geschrieben habe, konnte ich den Fehler auf die Funktion preg_match_all eingrenzen, kenne mich aber nicht mit Suchmustern aus.

Vielleicht könntest du hier nochmal drüber schauen?

Ansonsten ist alles Standard im Script bis jetzt. Die Aufrechterhaltung der Verbindung ändere ich später, wenn alle Probleme behoben sind.

felixms commented 8 years ago

Danke für die Rückmeldung, ich schau mir mal die RegEx an. Nochmals wegen der Verbindung, diese bleibt bis zur Beendung des Scripts bestehen und wird dann automatisch geschlossen. Solltest du diese vorher schließen wollen, musst du nur close() ausführen. Die Verbindung aufrecht zu erhalten nach Ausführung des Scripts ist nur mit einem Daemon möglich und es sollte da ebenfalls kein Problem mit dem Destruktor auftreten.

0FakE commented 8 years ago

Auf was ich auch aufmerksam geworden bin, ist die Tatsache, dass zum kicken eines Spielers ein integer nötig ist, also dessen aktuelle ID auf dem Server.

ban (name, ID or Player#)
kick (name, ID or Player#)

Die Befehle die an den Server via. RCON gesendet werden, können auch den Namen, die ID oder die GUID enthalten. In deiner Funktion banPlayer kann einen String angeben, also sowohl die Name, ID usw.

Vielleicht wäre eine Überarbeitung hier auch nicht verkehrt, die sowohl kicks und bans via. Name, ID & GUID erlaubt. Die cmds die ans RCON gesendet werden, erlauben dies ja.

Nützlich oder unnützlich?

0FakE commented 8 years ago

Was auch noch zu erwähnen wäre, ist die Tatsache, dass bei einem Fehler das Script einen falschen boolean Wert zurück gibt.

var_dump($rcon->kickPlayer("FakE", "TEST BAN"));

Gekickt werde soll der Spieler FakE. Da die Funktion allerdings nur einen integer Wert, statt dem Namen zulässt, sollte eigentlich ein Fehler erscheinen. Nicht zuletzt dann, wenn der RCON Befehl nicht ausgeführt werden konnte.

Stattdessen bekomme ich allerdings true zurück.

dashboard.php:10:boolean true


Auch die Funktion banPlayer hat das gleiche Problem. Deine Parameterbeschreibung lautet:

@param string $player Player who will be banned

Es ist aber nicht detailliert angegeben, welchen String ich verwenden soll. Player Name, vielleicht auch die ID oder doch die GUID?

Und auch hier gibt das Script boolean:true zurück, obwohl nichts passiert ist.

felixms commented 8 years ago

Mit dem Parameter kümmer ich mich drum. Aktuell wird halt nur gecheckt, ob der Befehl gesendet werden konnte. Vielleicht hast du ja eine Idee, wie man checken kann, ob der Befehl ausgeführt wurde.

0FakE commented 8 years ago

Oh stimmt... Ich habe noch nicht nachgeschaut, wie der return ermittelt wird. Denkt man genauer darüber nach, stellt sich mir dann die selbe Frage, die du mir stellst.


Ignorieren wir diesen Punkt mal...

Hat sich etwas neues bzgl. den banArrays ergeben?

felixms commented 8 years ago

Ich kam bis jetzt noch nicht dazu, mir die RegEx genauer anzuschauen, ich meld mich morgen, ob es etwas neues gibt.

0FakE commented 8 years ago

Alles klar. Ich danke dir. Ich würde mich sehr freuen, wenn das Problem irgendwie behoben werden kann.

felixms commented 8 years ago

Mir ist bis jetzt nichts ungewöhnliches im Suchmuster aufgefallen. Ich werde, sofern heute noch möglich, den Author des Musters kontaktieren und ihn mal fragen.

felixms commented 8 years ago

getPlayers() funktioniert mit der neusten Version, um getBans() kümmer ich mich.

0FakE commented 8 years ago

Wie gesagt, getBansArray() gibt immer 0 aus. Kannst du ja selbst nachprüfen...

felixms commented 8 years ago

getBans funktioniert mit der neusten Version ;)

nerdalertdk commented 8 years ago

Next time take it English that way I can see the array function was giving som problems :)

felixms commented 8 years ago

Yes, would have been better :)