• Hallo Besucher!

    Du bist neu im Forum? Dann registriere dich hier, um Diskussionen beizutreten oder eigene Themen zu erstellen. Für die Registrierung ist es erforderlich, dass du einen Spielaccount bei Die Stämme hast.

    Andernfalls kannst du dich hier direkt einloggen.

    Falls du dein Passwort vergessen hast, kannst du hier ein neues Passwort anfordern.

Weltdaten und Interface

DeletedUser

Gast
Hallo, irgendwie bin ich noch nicht anhand der vorhandenen Daten dahinter gestiegen, wie man ein Dorf einem Spieler zuordnen kann, also wer der Besitzer eines Dorfs ist, da diese Information ja nicht in der village.txt enthalten ist.

Das Einzige was mir einfallen würde bis jetzt wäre der sehr umständliche Umweg über die conquer.txt.

Hat vielleicht einer eine bessere Idee oder Umsetzung?
 
Zuletzt bearbeitet von einem Moderator:

DeletedUser

Gast
In der Village.txt steht die ID des Besitzers ;)..
D.h. um den Spieler-Namen herauszufinden musst du noch die tribe.txt benutzen, und da halt nach der ID des "Tribes" suchen..
 

DeletedUser

Gast
Jo hab mich von der Bezeichnung tribe für die ID des Spieler verwirren lassen...
Danke schön ^^
 

DeletedUser

Gast
Ich weiß nicht genau ob ich der Einzige bin, dem das so geht, aber irgendwie kommen keine Umlaute mit den Textdateien 'rüber, wenn man die downloadet? So wie dieser hier (ally.txt)?

39422,%C3%96tzis,%C3%96tzis,4,6,25603,25603,586

Oder was mach ich falsch...
 

DeletedUser61508

Gast
Du machst nichts falsch. Die Weltdaten sind UTF-8 kodiert. Was das ist findest du z.B. hier.

Einen Online-Decoder findest du hier am Ende der Seite.

Deine Zeile lautet z.B. dekodiert 39422,Ötzis,Ötzis,4,6,25603,25603,586

Normalerweise besitzt "jede" Programmiersprache mit der man die Weltdaten einlesen könnte UTF-8 (de-)kodierung.
 

DeletedUser24674

Gast
utf8 dekodieren reicht nicht, die daten sind (raw)URLcodiert!
 

DeletedUser

Gast
nichts desto trotz hätte ich den Text bestenfalls als 'normalen' Text (...ja, ich muß mir diesen ganzen UTF-Krams bald mal angucken :mrgreen:) per Konsolen-Befehl...

Weil hab nen BASH-Script (Linux-Server), der mir die Daten via wget besorgt, und ich würd die gerne danach in ne Postgres-Datenbank rein hauen. Damit man nicht immer für Abfragen so ewig braucht...

Aber falls wer ne bessere Variante findet, die Welt-Daten in die Postgres-DB zu bekommen, sag bescheid ;-)
 

DeletedUser61508

Gast
Aber falls wer ne bessere Variante findet, die Welt-Daten in die Postgres-DB zu bekommen, sag bescheid ;-)

Zu Befehl. ^^ Ein PHP-Script und das aus deinem Shell-Script heraus aufrufen. Davon gibts sicher schon einige fertig Lösungen, z.B. bei PHPBB.
 

DeletedUser

Gast
Weltdaten per Bash-Script in ne PostgreSQL-DB? Na gut...

Download
Code:
wget -qO- <URL> | gunzip | tr '+' ' ' | tr -d '\015\032' | tr '\134' '\134\134' | tr '\011' ' ' | awk -f urldecode.awk --source 'BEGIN { FS="," } { $2 = urldecode($2); gsub(/\t/, " ", $2); gsub(/\\/, "\\\\", $2); gsub(/[\r\n]+/, "", $2); if ( $3 !~ /[0-9]+/ || $3 == "0" ) { $3 = "\\N" } if ( $4 !~ /[0-9]+/ ) { $4 = "0" } if ( $5 !~ /[0-9]+/ ) { $5 = "0" } if ( $6 ~ /[0-9]+/ ) { print $1 "\t" $2 "\t" $3 "\t" $4 "\t" $5 "\t" $6 } }' > <FILE>

Code:
wget -qO- <URL> | gunzip | tr '+' ' ' | tr -d '\015\032' | tr '\134' '\134\134' | tr '\011' ' ' | awk -f urldecode.awk --source 'BEGIN { FS="," } { $2 = urldecode($2); gsub(/\t/, " ", $2); gsub(/\\/, "\\\\", $2); gsub(/[\r\n]+/, "", $2); $3 = urldecode($3); gsub(/\t/, " ", $3); gsub(/\\/, "\\\\", $3); gsub(/[\r\n]+/, "", $3); if ( $4 !~ /[0-9]+/ ) { $4 = "0" } if ( $5 !~ /[0-9]+/ ) { $5 = "0" } if ( $6 !~ /[0-9]+/ ) { $6 = "0" } if ( $7 !~ /[0-9]+/ ) { $7 = "0" } if ( $8 ~ /[0-9]+/ ) { print $1 "\t" $2 "\t" $3 "\t" $4 "\t" $5 "\t" $6 "\t" $7 "\t" $8 } }' > <FILE>

Code:
wget -qO- <URL> | gunzip | tr '+' ' ' | tr -d '\015\032' | tr '\134' '\134\134' | tr '\011' ' ' | awk -f urldecode.awk --source 'BEGIN { FS="," } { $2 = urldecode($2); gsub(/\t/, " ", $2); gsub(/\\/, "\\\\", $2); gsub(/[\r\n]+/, "", $2); if ( $5 !~ /[0-9]+/ || $5 == "0" ) { $5 = "\\N" } if ( $6 !~ /[0-9]+/ ) { $6 = "0" } print $1 "\t" $2 "\t" $3 "\t" $4 "\t" $5 "\t" $6 "\t0\t" $7 }' > <FILE>

Code:
wget -qO- <URL> | gunzip | tr '+' ' ' | tr -d '\015\032' | tr '\134' '\134\134' | tr '\011' ' ' | awk -f urldecode.awk --source 'BEGIN { FS="," } { $2 = urldecode($2); gsub(/\t/, " ", $2); gsub(/\\/, "\\\\", $2); gsub(/[\r\n]+/, "", $2); if ( $5 !~ /[0-9]+/ || $5 == "0" ) { $5 = "\\N" } if ( $6 !~ /[0-9]+/ ) { $6 = "0" } if ( $7 ~ /[0-9]+/ ) { print $1 "\t" $2 "\t" $3 "\t" $4 "\t" $5 "\t" $6 "\t" $7 "\t0" } }' > <FILE>

<URL> mit der Download-Adresse ersetzen
<FILE> mit dem Dateinamen ersetzen, in welche temporär gespeichert wird

Die Download-Scripts verwenden eine Datei "urldecode.awk". Diese befindet sich weiter unten.
Für den Download wird das Programm "gawk" benötigt. Debian installiert als Standard hingegen mawk, welches o.g. Scripte nicht ausführen kann

Code:
psql --username <USER> --dbname <DB> --command "COPY <TABLE> FROM '<FILE>' WITH DELIMITER '\t'"

<DB> mit dem Namen der Datenbank ersetzen
<TABLE> mit dem Namen der entsprechenden Tabelle ersetzen
<FILE> mit dem Namen der Datei ersetzen, aus welcher importiert werden soll


Code:
function urldecode(str) {
  hextab ["0"] = 0;
  hextab ["1"] = 1;
  hextab ["2"] = 2;
  hextab ["3"] = 3;
  hextab ["4"] = 4;
  hextab ["5"] = 5;
  hextab ["6"] = 6;
  hextab ["7"] = 7;
  hextab ["8"] = 8;
  hextab ["9"] = 9;
  hextab ["A"] = hextab ["a"] = 10;
  hextab ["B"] = hextab ["b"] = 11;
  hextab ["C"] = hextab ["c"] = 12;
  hextab ["D"] = hextab ["d"] = 13;
  hextab ["E"] = hextab ["e"] = 14;
  hextab ["F"] = hextab ["f"] = 15;
  decoded = ""
  i   = 1
  len = length (str)
  while ( i <= len ) {
    c = substr (str, i, 1)
    if ( c == "%" ) {
      if ( i+2 <= len ) {
        c1 = substr (str, i+1, 1)
        c2 = substr (str, i+2, 1)
        if ( hextab [c1] != "" && hextab [c2] != "" ) {
          code = 0 + hextab [c1] * 16 + hextab [c2] + 0
          c = sprintf ("%c", code)
          i = i + 2
        }
      }
    } else if ( c == "+" ) {
      c = " "
    }
    decoded = decoded c
    ++i
  }
  return decoded
}

Ich hoffe, es sind durchs kopieren der Scripte keine Fehler passiert. Ansonsten viel Spaß beim Fehlersuchen.
Ach ja: die Scripte funktionieren! Ich gebe jedoch hier keinen Support für diese Scripte!
 

DeletedUser

Gast
Boah...

Das muß ich erst mal verarbeiten, grins, danke erstema!!!

Mal sehen, wie das so funzt... :mrgreen:
 

DeletedUser

Gast
So, verarbeitet, meine Datenbank ist voll mit allem!

Inclusive der ganzen Adelungen braucht das fertige Script so um die 15-20 sec. aufm Server...

Ein großes Lob an identify und danke! Hast mir sehr geholfen...

Hast du sowas auch in Benutzung? Wegen des Austausches. Kannst mir ja ma ne PM schicken!

btw. funzt bei mir der import in die DB nicht mit COPY, sondern \\copy:

#!/bin/bash
# Spielerdaten holen (made by identify/DS-Forum)
wget -qO- http://de20.die-staemme.de/map/tribe.txt.gz | gunzip | tr '+' ' ' | tr -d '\015\032' | tr '\134' '\134\134' | tr '\011' ' ' | awk -f urldecode.awk --source 'BEGIN { FS="," } { $2 = urldecode($2); gsub(/\t/, " ", $2); gsub(/\\/, "\\\\", $2); gsub(/[\r\n]+/, "", $2); if ( $3 !~ /[0-9]+/ || $3 == "0" ) { $3 = "\\N" } if ( $4 !~ /[0-9]+/ ) { $4 = "0" } if ( $5 !~ /[0-9]+/ ) { $5 = "0" } if ( $6 ~ /[0-9]+/ ) { print $1 "\t" $2 "\t" $3 "\t" $4 "\t" $5 "\t" $6 } }' > tribe.txt
echo "tribe.txt erstellt (Spieler)"

# Stamm-Daten holen (made by identify)
wget -qO- http://de20.die-staemme.de/map/ally.txt.gz | gunzip | tr '+' ' ' | tr -d '\015\032' | tr '\134' '\134\134' | tr '\011' ' ' | awk -f urldecode.awk --source 'BEGIN { FS="," } { $2 = urldecode($2); gsub(/\t/, " ", $2); gsub(/\\/, "\\\\", $2); gsub(/[\r\n]+/, "", $2); $3 = urldecode($3); gsub(/\t/, " ", $3); gsub(/\\/, "\\\\", $3); gsub(/[\r\n]+/, "", $3); if ( $4 !~ /[0-9]+/ ) { $4 = "0" } if ( $5 !~ /[0-9]+/ ) { $5 = "0" } if ( $6 !~ /[0-9]+/ ) { $6 = "0" } if ( $7 !~ /[0-9]+/ ) { $7 = "0" } if ( $8 ~ /[0-9]+/ ) { print $1 "\t" $2 "\t" $3 "\t" $4 "\t" $5 "\t" $6 "\t" $7 "\t" $8 } }' > ally.txt
echo "ally.txt erstellt (Staemme)"

# Dorf-Daten holen (made by identify)
wget -qO- http://de20.die-staemme.de/map/village.txt.gz | gunzip | tr '+' ' ' | tr -d '\015\032' | tr '\134' '\134\134' | tr '\011' ' ' | awk -f urldecode.awk --source 'BEGIN { FS="," } { $2 = urldecode($2); gsub(/\t/, " ", $2); gsub(/\\/, "\\\\", $2); gsub(/[\r\n]+/, "", $2); if ( $5 !~ /[0-9]+/ || $5 == "0" ) { $5 = "\\N" } if ( $6 !~ /[0-9]+/ ) { $6 = "0" } print $1 "\t" $2 "\t" $3 "\t" $4 "\t" $5 "\t" $6 "\t0\t" $7 }' > village.txt
echo "village.txt erstellt (Doerfer)"

# Dorfwechsel holen
wget http://de20.die-staemme.de/map/conquer.txt
echo "conquer.txt erstellt (Dorfwechsel)"

psql --username abc --dbname abc --command "delete from ally"
psql --username abc --dbname abc --command "delete from tribe"
psql --username abc --dbname abc --command "delete from village"
psql --username abc --dbname abc --command "delete from conquer"
psql --username abc --dbname abc --command "\\copy ally FROM 'ally.txt' WITH DELIMITER '\t'"
echo "ally importiert (Staemme)"
psql --username abc --dbname abc --command "\\copy tribe FROM 'tribe.txt' WITH DELIMITER '\t'"
echo "tribe importiert (Spieler)"
psql --username abc --dbname abc --command "\\copy village FROM 'village.txt' WITH DELIMITER '\t'"
echo "village importiert (Doerfer)"
psql --username abc --dbname abc --command "\\copy conquer from 'conquer.txt' with delimiter ','"
echo "conquer importiert (Dorfwechsel)"

...Wobei ich mir sicher bin, das ich die ganzen Kürzel (den Namen dafür wußte ich auch mal...) nicht begriffen habe, loool!
 
Zuletzt bearbeitet von einem Moderator:

DeletedUser

Gast
Haste mal getimed wie lange das braucht?

Hab ich oben schon mal geschrieben: So um die 15-20 sekunden, für etwas über 1 Mio. Datensätze, etwas über 40MB Daten.

Macht mein Server jetzt alle 2 Stunden (stündlich ist glaube ich erlaubt, aber wir wollen es ja nicht übertreiben...) ;-)

Und mittlerweile hab' ich auch 'raus wie ich den Krams im IRC-Channel auswerte... Mal sehen, was mein Stamm dazu morgen sagt ;-)
 

DeletedUser71696

Gast
Icons für die Dörfer in Abhängigkeit von den Punkten...

Auf der Karte in DS werden die Dörfer duch Bildchen wie z.B. http://de18.die-staemme.de/graphic/map/v5.png dargestellt, also v1.png,...,v6.png. Hat jemand eine Tabelle mit den zugehörigen Punkten, die bestimmen, welches Icon verwendet wird. Oder ist das komplizierter, z.B. Ausbaustufen?

Danke
Basko von Gradenegg
 

DeletedUser

Gast
Auf den neuen Welten heißt es player.txt, bzw. player.txt.gz !

€: Auf allen Welten geht ales, also player + tribe...
 

DeletedUser

Gast
wood(level) = wood * wood_factor^level

verständlich?

MfG Dömel
 

DeletedUser

Gast
Gibt es ein Interface, um nur Infos zu bestimmten Stämmen (und deren Spielern) oder Spielern generell abzurufen?

Das würde in vielen Fallen den Traffic erheblich mindern...

Gut, für Tool Seiten zu DS wär es jetz nich praktisch, aber füt Otto-Normal-DS-Spieler...
 

DeletedUser61508

Gast
Gibt es ein Interface, um nur Infos zu bestimmten Stämmen (und deren Spielern) oder Spielern generell abzurufen?

Das würde in vielen Fallen den Traffic erheblich mindern...

Gut, für Tool Seiten zu DS wär es jetz nich praktisch, aber füt Otto-Normal-DS-Spieler...

Das "Interface" für Otto-Normal-Nutzer nennt sich "Rangliste". ;-)
Eine direkte Datenbankanbindung, wie du sie vermutlich erfragen wolltest, gibts wohl nicht und solch eine Schnittstelle würde wohl unweigerlich zu Performanceproblemen führen, da sicherlich auch jeder Tools-Entwickler interessiert wäre, 100% aktuelle Daten zu bekommen.
 
Oben