Es gibt so ein paar Dinge, zu denen ich immer wieder zurückfinde. Zum Beispiel EVE-Online: Seit 2004 steige ich alle paar Jahre wieder in meine Rifter. Auch Python ist so ein Thema: Auch wenn mich dynamische Typisierung zuweilen verzweifeln lässt – nirgendwo sonst schaffe ich es, in so kurzer Zeit einen Prototypen zu entwickeln.

Wie viele Zeilen Code braucht es wohl, um EVE-Online Killmails (Benachrichtigungen über Abschüsse im Spiel) einzulesen und zu speichern? Wir verwenden natürlich Python 3.

Killmails abfragen

Zkillboard.com bietet einen RedisQ-Service an, den wir in kurzen Abständen aufrufen können, um alle Killmails der Plattform seit dem letzten Aufruf zu bekommen. Neben zwei Importen brauchen wir dafür drei Zeilen Python:

import json
import urllib.request

url = "https://redisq.zkillboard.com/listen.php"
data_json = urllib.request.urlopen(url).read()
data_dict = json.loads(data_json.decode('utf-8'))

Okay, jetzt haben wir eine schöne Killmail als Python-Dictionary. Es wäre also sinnvoll, das Skript häufig auszuführen, zum Beispiel als Cronjob.

In der Datenbank speichern

Vielleicht sollten wir die Daten also auch irgendwo abspeichern? Vielleicht in einer Datenbank? Mit MongoDB müssen wir uns fürs erste keine Gedanken um Datenbank-Schemata machen:

import pymongo

client = pymongo.MongoClient('localhost', 27017) # mongodb default port
database = client.eveonline
database.killmails.insert_one(data_dict)

Statistiken erzeugen

Vorausgesetzt, wir haben zuvor eine MongoDB-Instanz gestartet, liegen jetzt nach nicht einmal zehn Zeilen Python ein paar Killmails in unserer Datenbank. Das lässt sich jetzt zum Beispiel verwenden, um ein paar Statistiken zu erstellen. Wie schlägt sich denn die Rifter so im Großen und Ganzen?

# rifter ID is 587
database.killmails.count({"package.killmail.attackers.ship_type_id": 587})
database.killmails.count({"package.killmail.victim.ship_type_id": 587})

In meiner Datenbank hatte ich nach ein paar Tagen etwa 7000 Einträge, wobei ich nach „Solo“, also 1vs1-Kämpfen filtere, sonst wären es deutlich mehr. Die beiden Abfragen hier ergaben dann 58 Siege und 151 Abschüsse. Ohne Vergleichswerte ist das wenig aussagekräftig, also wiederholen wir das für ein paar ähnliche Schiffe:

SchiffSiegeVerluste
Rifter58151
Tormentor2368
Kestrel53
160
Tristan111303

Da zeichnet sich wohl recht klar ein 1:3 Bild ab. Allerdings sprechen wir hier auch über vier der billigsten Schiffe im ganzen Spiel.

Eine Rifter im Kampf

Weitere Schritte

Jetzt haben wir einen kleinen, minimalistischen Prototypen geschrieben dem natürlich noch ein wenig Optimierung gut tun würde:

  • Die Daten von zKillboard beinhalten mehr als nur die Killmail. Wir könnten also sinnvollerweise nur data_dict[„package“][„killmail“] speichern.
  • Spätestens dann wären ein paar Checks hilfreich, um KeyErrors abzufangen.
  • Damit verändern sich natürlich auch die Abfragen.
  • Das Skript sollte Killmails in einer Schleife konsumieren, bis der Service eine leere Antwort zurückgibt. Dann müsste man den Cronjob nur alle paar Minuten ausführen.

Alle EVE-Online bezogenen Materialien sind Eigentum von CCP Games