PDA

View Full Version : Userliste / Unsichtbarer SA / Last Login


mbutschek
18-01-2004, 23:03
Hallo,

ich hätte da 3 Fragen. Hab schon mal versucht in euerem Forum eine Antwort zu finden, doch außer langen Diskussionen zu den Themen hab ich keine direkte Antwort gefunden.


1. Frage: Online-Liste im Public-Mode ohne Telnet...

Ich bin SA auf einem TS2-Server und würde gerne eine Userliste aller Player haben, die zur Zeit online sind. Im Telnet-Mode geht das ja, nur ist die Anmeldeprzedur nicht gerade einfach.

Den Server im Clan-Mode laufen zu lassen würde das Probem lösen, doch will ich nicht, daß JEDER immer gleich jeden sieht, sondern nur die SAs sollten hin und wieder mal einen Blick drauf werfen können um Player schneller zu finden.

Geht das schon irgendwie (außer Telnet)?


2. Frage: SA ohne SA-Status...

Ist es irgendwie möglich, daß man als SA nicht von Usern erkannt werden kann? Problem ist, daß sobald ein SA online ist, alle sofort 100 Fragen haben. Ich würde gerne ein normaler, registrierter Benutzer auftreten und ganz normal mitchatten.

Ich weiß, daß ich ja auch als "User" rein kann und dann bei Bedarf wechseln könnte, doch ich würde das gerne machen, ohne rauszugehen, also entweder per Klick SA hinzufügen oder einfach nur SA sein, ohne das SA hinter dem Namen steht.

Ok, über Telnet geht's wieder, das ich mir einfach wenn nötig SA selbst gebe, aber wie oben finde ich das Telnet-Interface eher umständlich.

Ist das irgendwie möglich?


Falls jetzt beides nicht geht (ich vermute es ja, habe nämlich nichts gefunden, was mir das Gegenteil zeigen würde), ist denn eins dieser Features in zukünftigen Versionen geplant oder sollte ich es nach Verbesserungsvorschläge posten?


3. Last Login in Datenbank...

Ich würde gerne wissen, wann registrierte Benutzer das letzte mal online waren, um Karteileichen zu entfernen. Ich habe mir auch schon die Daten in der Datenbank angesehen (mit sqlite.bin), doch wird diese Information gar nicht gespeichert.

Weiß jemand, ob dies in Zukünftigen Versionen geplant ist?


Kurz noch Tech:
Server: TS2, 2.0.19.40 - Debian Linux
Client: TS2, 2.0.32.60 - Windows ME

Sorry für so viele Fragen, aber das war alles, was bei meinen Recherchen unbeantwortet blieb. Alles andere hab ich schon :-)

Danke schonmal für euere Bemühungen...

Dummer Sack
19-01-2004, 00:04
1. WebPost / Scrips forum, Online Display Script.
2. Ist nicht möglich.
3. Nicht einfach möglich.
Der schwierige weg: Access logging einschalten und mit eine script das server.log analysieten.

mbutschek
19-01-2004, 01:33
Vielen Dank für die Antwort.

1) Dumm von mir, WebPost hab ich ja oft genug gelesen. Das Zeug auf eine Webseite zu machen, um es schnell abrufen zu können, das kam mir dann wieder nicht in den Sinn.

2) Schade. Es wäre gut, hier eine Funktion zu machen, um den Login-User innerhalb einer Sitzung zu ändern, damit das möglich wäre oder auch einfach nur einen invisible-SA-Schalter zu integrieren. Ich werd das mal in die Verbesserungsvorschlage posten.

3) Na klar! Danke für den Tipp. Das einfachste sieht man oft gar nicht...

Hierzu gleich noch eine kurze Frage: Stört es die Datenbank, wenn in der Tabelle "ts2_clients" noch ein Feld "dt_client_lastlogin" hinzugefügt wird oder reagiert TS da möglicherweise allergisch drauf? Weil wenn ich es in der Datenbank hätte, könnte ein tägliches Cron-Script dies immer aktualisieren und so wäre das Auslesen per Script auch das einfachste...

Frage an die anderen (nicht Entwickler): Ich werd mir das sowieso schreiben, daher meine Frage, ob interesse besteht, falls ja, poste ich euch das Ergebnis, wenn es läuft...

mbutschek
19-01-2004, 03:39
Bei der Suche, in welchem Format die Registrierzeit in der Datenbank gespeichert ist, habe ich einen Thread gefunden, der genau meine Frage (Last Login) schon mal hatte. Schande über mich :-) Sorry...

Gut, das Thema hat sich erledigt, da es per Log möglich ist, dies zu prüfen.

Mir ist sogar eine ziemlich einfache Lösung gekommen:
1) Userliste auslesen:
./sqlite.bin -list server.dbs "select s_client_name from ts2_clients;"

2) Im Log alle Einträge ab einem gewünschten Datum anzeigen und jeweils gegen die Userliste prüfen.

3) Kommt der Name darin vor, war der User in dieser Zeit online.

4) Alle Namen der Userliste, die am Ende nicht vorkamen, werden gekickt.

Die Sache mit der Userliste hat sich ebenfalls erledigt, das geht per Webpost.

Gegen die Antwort bzgl. unsichtbarer SA möchte ich Einspruch erheben :-) Ne, hast schon recht, es geht wohl nicht, aber ich habe ne Lösung gefunden, wie ich das gewünschte Ergebnis doch noch realisieren kann:

Ein Script, das tcpquery benutzt, um einen User mit einem bestimmten Login-Name (nehmen wir "admin" an) sucht und dann per sppriv diesem SA-Rechte verleiht.

Dem Script kann ich dann meinen Login verraten und SA abschalten. Damit bin ich ganz normaler Benutzer. Sollte SA möglich sein, starte ich das Script und werde damit SA. Wenn ich es nicht mehr brauche, kann ich es ja selbst abschalten.

Das Script (habe es in PHP gelöst) poste ich euch hier, aber aufgrund der Längenbeschränkung erst im reply direkt hier drunter.

Danke für den Denkanstoß bei den anderen beiden Themen. Ich hoffe, ich kann dem einen oder anderen mit meiner Lösung vom unsichtbaren SA etwas helfen...

Grüße, Mike

mbutschek
19-01-2004, 03:45
Das folgende Script öffnet eine Verbindung zu tcpquery eines TS-Servers und gibt einem Benutzer mit dem angegebenen Login-Namen SA-Status.

Es dient dazu, das der SA "anonym" (also ohne SA-Rechte) auf dem Server sein kann und dennoch im Falle eines Falles sich schnell und einfach SA-Status geben kann.

Das Script läuft unter PHP4, die ersten Zeilen des Programms müßt ihr natürlich an euere Gegebenheiten anpassen.

#! /usr/bin/php4 -q
<?

# Settings
$TCPSERVER="localhost"; # Name or IP of the server
$TCPPORT=51234; # Port of the tcpquery
$TSPORT=8767; # Port of the TS server
$SULOGIN="superadmin"; # Name of the super admin
$SUPASSWORD="mypass"; # Password of the super admin
$SALOGIN="admin"; # Name which uses SA to log on

# FUNCTION TO READ DATA FROM SERVER
function tcpquery($data)
{
global $handle;
fputs($handle, $data);
$data="";
$newdata=" ";
while ($newdata!="")
{
$newdata="";
$newdata=fgets($handle,1024);
$data.=$newdata;
}
return $data;
}

# OPEN CONNECTION
$handle=fsockopen($TCPSERVER, $TCPPORT, $errno, $errstr, 5);
if (!$handle)
die ("Verbindungsaufbau fehlgeschlagen:\n($errno) $errstr");
socket_set_blocking($handle, 0);

# COMMUNICATION WITH SERVER
tcpquery("\n");
tcpquery("sel $TSPORT\n");
tcpquery("slogin $SULOGIN $SUPASSWORD\n");
tcpquery("slogin $SULOGIN $SUPASSWORD\n");
$PLAYERDATA=tcpquery("pl\n");

# Clientnummer suchen
$PLAYERDATA=explode("\n", $PLAYERDATA);
while(list($KEY, $LINE)=each ($PLAYERDATA))
{
$LINEARRAY=explode("\t", trim($LINE));
if ($LINEARRAY[15]=="\"$SALOGIN\"")
{
tcpquery("sppriv $LINEARRAY[0] privilege_serveradmin 1\n");
echo("User $LINEARRAY[14] wurde zum SA ernannt");
}
}

# COMMUNICATION WITH SERVER
tcpquery("quit\n");

# CLOSE CONNECTION
fclose($handle);
echo "\n";
?>

Das Script hat KEINE Fehlerprüfung o.Ä. eingebaut, es "läuft" und das genügt mir vorerst. In dem Sinne, daß es verschiedene TS-Server gibt, wäre eine Prüfung jedoch angebracht. Wer es verbessern will gerne, aber seit dann bitte so nett, und postet es dann auch wieder, damit jeder was davon hat.

Das Script ist frei von Copyright, es kann jeder einsetzen, verändern, weitergeben oder was auch immer damit machen. Für die Funktionsfähigkeit oder eventuelle Schäden übernehme ich keine Haftung.

TR-13
19-01-2004, 07:01
Hallo mbutschek

Poste dieses Script doch bitte in der Abteilung Webpost/Scripts.
Ich mach es dann Sticky und jeder kanns benutzen.

Wenn geht noch ne englische Beschreibung dazu. Wenn nicht mach ich es und dann sollte es zu noch mehr und noch besseren Scripts kommen.

:D

mbutschek
19-01-2004, 11:52
Ok, mach ich. Gib mir noch 2 Tage, dann sieht's vielleicht noch etwas besser aus.

Dummer Sack
19-01-2004, 13:21
Nett das du dir so viel arbeit gemacht hast.
Allerdings würde ich auch bei zukünftigen projekten raten die datenbank selber nicht verändern (Höchstens eine neue tabelle hinzufügen, die auf bestehende tabellen verweist, aber keine bestehenden tabellen verändern).
Der neue b51 (heute angekündigt) der evtl. morgen rauskommt hat ein lastlogin feature, das wohl dann auch in der db steht. Somit könnte deine änderung an der datenbank im konflikt mit den änderungen für b51 stehen.

mbutschek
19-01-2004, 13:29
...womit alle Probleme gelöst wären :-) Gefällt mir, also muss ich auf die neue Version warten...

Wegen der Arbeit: Ich freu mich auch, daß ihr so tolle Arbeit leistet. Ich meine, nicht jeder hat die Geduld dazu, immer und immer wieder gestellte Fragen immer und immer wieder zu beantworten. Und ohne euer Forum und die Kniffe, die ich darin fand hätte mir TS sicherlich nicht so gut gefallen.