Registriert seit: 16. Nov 2007
6 Beiträge
|
Re: teamspeak server online benutzer ermitteln
16. Nov 2007, 17: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
|
|
Zitat
|