Um eine Verbindung zu den TS-Servern herzustellen benutze ich folgende
Telnet-Klasse:
http://www.dali.net.nz/Telnet.class.php.txt
Die Verbindungsherstellung funktioniert mit $telnet = new
Telnet($server_ip, "10011"); und ich bin auch in der Lage mit $result
= $telnet->exec("channelcreate channel_name=test
channel_flag_permanent=1"); einen Channel zu erstellen.
Mein Problem ist: als $result wird mir unabhängig von der Abfrage ein
leerer String zurückgegeben, so dass ich Channels nicht wieder löschen
kann, da mir die Channel ID nicht übermittelt wird. Die Ausgabe bei
der oben genannten Anfrage sollte eigentlich etwa so lauten:
cid=25
error id=0 msg=ok
Mir ist völlig unklar, warum ich keine Rückgabe erhalte und wäre für
Hilfe sehr dankbar. Liebe Grüße.
> Hallo, ich versuche eine Gaming-Plattform auf die Beine zu stellen und
> entwickle hierfür mit PHP. Ich möchte in der Lage sein über PHP mit
> unseren Teamspeak-Servern zu kommunizieren um dynamisch neue Channels
> zu erstellen und diese bei Bedarf wieder zu löschen.
>
> Um eine Verbindung zu den TS-Servern herzustellen benutze ich folgende
> Telnet-Klasse:
> http://www.dali.net.nz/Telnet.class.php.txt
<http://www.dali.net.nz/Telnet.class.phps> wäre wahrscheinlich besser lesbar
gewesen, siehe <http://php.net/highlight_file>.
> Die Verbindungsherstellung funktioniert mit $telnet = new
> Telnet($server_ip, "10011"); und ich bin auch in der Lage mit $result
> = $telnet->exec("channelcreate channel_name=test
> channel_flag_permanent=1"); einen Channel zu erstellen.
>
> Mein Problem ist: als $result wird mir unabhängig von der Abfrage ein
> leerer String zurückgegeben, so dass ich Channels nicht wieder löschen
> kann, da mir die Channel ID nicht übermittelt wird. Die Ausgabe bei
> der oben genannten Anfrage sollte eigentlich etwa so lauten:
> cid=25
> error id=0 msg=ok
>
> Mir ist völlig unklar, warum ich keine Rückgabe erhalte und wäre für
> Hilfe sehr dankbar. Liebe Grüße.
Mit telnet(1) kann man zwar grundsätzlich beliebige TCP-Verbindungen
aufbauen, Telnet ist aber trotzdem ein anderes Protokoll als TeamSpeak.
Wenn Du Dir das Script genauer anschaust (oder einen Debugger, wie z.B.
Zend Debugger in Eclipse PDT einsetzt):
| public function exec($command) {
| $this->write($command);
| $this->waitPrompt();
| return $this->getBuffer();
| }
| […]
| private function write($buffer, $addNewLine = true){
| if (!$this->socket){
| throw new Exception("Telnet connection closed");
| }
|
| // clear buffer from last command
| $this->clearBuffer();
|
| if ($addNewLine == true){
| $buffer .= "\n";
| }
|
| if (!fwrite($this->socket, $buffer) < 0){
| throw new Exception("Error writing to socket");
| }
|
| return self::TELNET_OK;
| }
| […]
| private function waitPrompt(){
| return $this->readTo($this->prompt);
| }
| […]
| private function readTo($prompt){
| if (!$this->socket){
| throw new Exception("Telnet connection closed");
| }
|
| // clear the buffer
| $this->clearBuffer();
|
| do{
| $c = $this->getc();
|
| if ($c === false){
| throw new Exception("Couldn't find the requested : '" . $prompt
| . "', it was not in the data returned from server : '" . $buf
| . "'");
| }
|
| // Interpreted As Command
| if ($c == $this->IAC){
| if ($this->negotiateTelnetOptions()){
| continue;
| }
| }
|
| // append current char to global buffer
| $this->buffer .= $c;
|
| // we've encountered the prompt. Break out of the loop
| if ((substr($this->buffer, strlen($this->buffer) - strlen($prompt)))
| == $prompt){
| return self::TELNET_OK;
| }
|
| } while($c != $this->NULL || $c != $this->DC1);
| }
| […]
| private function getBuffer(){
| // cut last line (is always prompt)
| $buf = explode("\n", $this->buffer);
| unset($buf[count($buf)-1]);
| $buf = implode("\n",$buf);
| return trim($buf);
| }
Etwa ist $this->prompt da noch NULL, da die Eigenschaft deklariert wird als
| private $prompt;
und der Konstruktoraufruf nur $this->connect() aufruft. Eine Zuweisung an
$this->prompt findet erst in
| public function login($username, $password) {
| […]
| $this->setPrompt();
| […]
| }
statt. Du müsstest also evtl. $telnet->setPrompt(…) vor $telnet->exec()
aufrufen, damit nicht zuviel gelesen wird.
Grundsätzlich halte ich diese Klasse für Deine Zwecke für ungeeignet, da
einerseits sowohl Overkill als auch für das falsche Protokoll ausgelegt.
Ich finde es seltsam, das Du sie benutzen willst, denn eine Google-Suche
nach "teamspeak php" führt mehr oder weniger direkt zu
<http://forum.teamspeak.com/showthread.php?t=21905>.
Ausserdem hat die Telnet-Klasse anscheinend einen Bug:
| } while($c != $this->NULL || $c != $this->DC1);
Das `||' müsste sinnvollerweise ein `&&' sein, sonst würde das Script auch
bei DC1 (0x11) nicht anhalten, da ja `$c != $this->NULL' zu `true' führt
(0x11 != 0x0).
HTH
--
PointedEars
Am 09.01.2011 19:15, schrieb Thomas 'PointedEars' Lahn:
> InV4in wrote:
> ^^^^^^
> Bitte trag an dieser Stelle Deinen vollständigen/richtigen Namen ein. Das
> gilt hier im deutschsprachigen Usenet als höflich und erhöht somit Deine
> Chancen auf sinnvolle Antworten. [psf 7.16]
Das mag als höflich gelten, eine Forderung dieser Art steht aber im
völligen Gegensatz zu deutschen Datenschutzbestimmungen, die die
Möglichkeit pseudonymer Nutzung von Diensten zwingend vorsehen, wenn
nicht Abrechnungsgründe dagegen sprechen. Als das Usenet und die
entsprechende Netiquette entstanden sind, gab es diese gesetzlichen
Regelungen noch nicht. Mittlerweile gibt es sie, und sie gelten
selbstverständlich auch für das deutschsprachige Usenet. Entsprechende
Passagen aus der Netiquette können daher allenfalls als Empfehlung
aufgefaßt werden und sollten mit einem Vermerk auf die Rechtslage
versehen werden. Einen Realnamens-Zwang darf es nicht geben, der wäre
gesetzeswidrig. Natürlich steht es dir frei, auf pseudonyme Beiträge
nicht zu antworten. Jedoch sind angesichts der seit den frühen Zeiten
des Usenets veränderten Rechtslage solche Belehrungen fehl am Platze.
XPost und F'up2 de.soc.usenet, weil hier völlig off topic.
Grüße,
Alex
> Nur mal so eine Anmerkung:
> Am 09.01.2011 19:15, schrieb Thomas 'PointedEars' Lahn:
>> InV4in wrote:
>> ^^^^^^
>> Bitte trag an dieser Stelle Deinen vollständigen/richtigen Namen ein.
>> Das gilt hier im deutschsprachigen Usenet als höflich und erhöht somit
>> Deine Chancen auf sinnvolle Antworten. [psf 7.16]
>
> Das mag als höflich gelten, eine Forderung dieser Art steht aber im
> völligen Gegensatz zu deutschen Datenschutzbestimmungen, die die
> Möglichkeit pseudonymer Nutzung von Diensten zwingend vorsehen,
Das ist Unsinn. Das eine hat mit dem anderen nichts zu tun, und de.ALL
steht _nicht_ für Deutschland.ALL. Etwaige Datenschutzbestimmungen der
Bundesrepublik Deutschland sind hier also nur teilweise relevant, wenn
überhaupt.
> XPost und F'up2 de.soc.usenet, weil hier völlig off topic.
Warum postest Du es dann? Das Thema wurde schon so oft durchgekaut, dass es
schon stinkt. Und ich werde ausnahmsweise nicht das F'up2 beachten, damit
nämlich dieser Unsinn nicht in der Ursprungsgruppe unkommentiert stehen
bleibt.
Geh weg.
F°up2 gesetzt.
--
PointedEars
> Am 09.01.2011 19:15, schrieb Thomas 'PointedEars' Lahn:
>
>> InV4in wrote:
>> ^^^^^^
>> Bitte trag an dieser Stelle Deinen vollständigen/richtigen Namen ein. Das
>> gilt hier im deutschsprachigen Usenet als höflich und erhöht somit Deine
>> Chancen auf sinnvolle Antworten. [psf 7.16]
>
> Das mag als höflich gelten, eine Forderung dieser Art steht aber im
> völligen Gegensatz zu deutschen Datenschutzbestimmungen, die die
> Möglichkeit pseudonymer Nutzung von Diensten zwingend vorsehen
Zunächst mal ist es keine Forderung, sondern eine Bitte. Es steht InV4in
vollkommen frei, dieser Bitte nachzukommen oder es sein zu lassen. Die
Konsequenzen seiner Entscheidung hat er in jedem Fall selber zu tragen.
> Entsprechende
> Passagen aus der Netiquette können daher allenfalls als Empfehlung
> aufgefaßt werden
Mehr ist die Netiquette nicht. War sie nie. Wird sie wohl auch nie sein.
> Einen Realnamens-Zwang darf es nicht geben
Gibt es nicht. Gab es nie. Wird es wohl auch nie geben.
Aber all das wurde hier schon zigtausendmal durchdiskutiert.
> XPost und F'up2 de.soc.usenet, weil hier völlig off topic.
Ignoriert. Du hast Dich hier darüber ausgelassen und bekommt - zumindest
von mir - auch hier Deine Antwort.
Gruß. Claus
Eine Realnameforderung in obiger Weise ist nicht rechtswidrig bezüglich der
Gesetze, die du anführst. Das bezieht sich auf Dienstanbieter.
Da aber bekannt ist, dass man in öffentlichen Datennetzen (und das Usenet ist
ein solches, auch der Teil unter "de.*") mit der Angabe personenbezogener
Daten (und dazu gehört freilich der vollständige bürgerliche Name) vorsichtig
sein sollte, ist eine Realnameforderung unangebracht, irreführend und frech -
gegenüber Unerfahrenen sogar gemein.
> XPost und F'up2 de.soc.usenet, weil hier völlig off topic.
Man sollte den Realnameforderungen dort widersprechen, wo sie begangen
werden. Das hast du schon sehr richtig gemacht. Auch die Einbeziehung von
de.soc.usenet war richtig, da auf diese Weise das Fehlverhalten von
"PointedEars" einer breiteren Öffentlichkeit dargestellt wurde. Die weitere
Diskussion sollte in beiden Gruppen stattfinden. Wenn "PointedEars" das nicht
gut findet, sollte er halt keine Realnameforderung aussprechen - es ist so
einfach.
In allen diesen Fällen ist man dumm, wenn man auf die "Bitte" eingeht.
So auch bei der "Bitte" von unserem lieben "PointedEars".
Woher willst du das wissen?
Die Wahrheit ist: du _kannst_ es nicht wissen.
Weil sich hier jeder "Werner Schlenker", "Heiko Müller" oder "Bernd Maier"
nennen kann, ohne tatsächlich so zu heißen (Beispiele frei erfunden). Und du
kannst den Unterschied von dort, wo du gerade sitzt, nicht erkennen.
> und das dürfte die überwiegende Haltung sein.
Diese Aussage dürfte (auch) falsch sein.