Einzelnen Beitrag anzeigen

cyxcyx

Registriert seit: 16. Nov 2007
6 Beiträge
 
#6

Re: teamspeak server online benutzer ermitteln

  Alt 16. Nov 2007, 16:56
Sers @ all!

Es wird benötigt:
  • 1x TIdTCPClient
  • 1x TListBox
  • 1x TButton


Delphi-Code + erklärung:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  PlayerID, PlayerName: String;
  EOfRead: Boolean; //End Of Read
  aLine: String;
  I: Integer;
begin
  with IdTCPClient1 do
  begin
    Host := '127.0.0.1'; //Server IP-Adresse
    Port := 51234; //Server TCP-Port
    Connect(); //Verbindung herstellen

    if (Connected) then //Verbindung erfolgreich aufgebaut, dann...
    begin
      aLine := ReadLn; //1. Zeile aus dem Buffer holen
      if not (aLine = '[TS]') then //Wenn die erste Zeile nicht "[TS]" ist dann
      begin
        Disconnect(); //Disconnecten vom Server
        MessageDlg('Kein TeamSpeak 2 Server', //Fehler meldung zeigen
                   mtError,[mbOK],0);
        Exit; //Procedure beenden
      end;

      WriteLn('SEL 8767'); //Server auswählen, "SEL " + UDP Port
      aLine := ReadLn; //Zeile aus dem Buffer holen
      if not (aLine = 'OK') then //Wenn Server nicht ausgwählt werden kann, dann...
      begin
        Disconnect(); //Disconnecten vom Server
        MessageDlg('UDP-Port Falsch!', //Fehler meldung zeigen
                   mtError,[mbOK],0);
        Exit; //Procedure beenden
      end;

      WriteLn('PL'); //Player Liste anfordern!
      EOfRead := False; //Ende der Repeat schleife = False
      repeat
        aLine := ReadLn; //Nächste Zeile aus dem Buffer
        if (aLine[1] +
            aLine[2] +
            aLine[3] +
            aLine[4] = 'p_id') then aLine := ReadLn; //Wenn die erste Zeile p_id ist dann
                                                                       //MUSS nochmal eine Zeile ausgelesen werden!!

        if (UpperCase(aLine[1] +
                      aLine[2] +
                      aLine[3] +
                      aLine[4] +
                      aLine[5]) = 'ERROR') or (aLine = 'OK') then
                      EOfRead := True // Wenn niemand auf dem Server ist wird direkt nach p_id,
                                                                       //"error" oder "OK" ausgegeben, damit die App nicht abstürzt MUSS dies auch sein!
        else begin
          PlayerID := aLine; //Sollte einleuchtend sein
          Delete(PlayerID,Pos(#9,PlayerID),Length(PlayerID)); //Die "ID" vom rest trennen

          PlayerName := aLine;
          for I := 1 to 3 do Delete(PlayerName,1,Pos('"',PlayerName)); //Dies muss 3x durch geführt werden weil als erstes die IP ausgegeben wird, dann erst der Name!
          Delete(PlayerName,Pos('"',PlayerName),Length(PlayerName)); //Ab dem nächsten " den rest löschen!

          ListBox1.Items.Add(PlayerID + ' ' + PlayerName); //ID und Name in die ListBox eintragen!
        end;
        Application.ProcessMessages; //Alle nachrichten verarbeiten
      until (EOfRead) or (ReadLnTimedOut); //Auf EOfRead = True oder ReadLnTimedOut = True warten
    end;
    Disconnect(); //Verbindung Trennen
  end;
end;
Mit freundlichen Grüßen, Andre
  Mit Zitat antworten Zitat