{"id":7486,"date":"2012-05-09T00:55:54","date_gmt":"2012-05-08T22:55:54","guid":{"rendered":"https:\/\/www.gambaru.de\/blog\/?p=7486"},"modified":"2012-05-09T00:55:54","modified_gmt":"2012-05-08T22:55:54","slug":"pyqscore-spielstatistiken-fur-openarena-erstellen","status":"publish","type":"post","link":"https:\/\/gambaru.de\/blog\/2012\/05\/09\/pyqscore-spielstatistiken-fur-openarena-erstellen\/","title":{"rendered":"Pyqscore: Spielstatistiken f\u00fcr OpenArena erstellen"},"content":{"rendered":"<p>Zur\u00fcck zu meinem Steckenpferd. Im folgenden geht es darum, wie man aus einer Logdatei f\u00fcr OpenArena eine sinnvolle Spielstatistik erstellen kann. <a href=\"http:\/\/www.openarena.ws\">OpenArena<\/a> ist kurz gesagt ein modifiziertes Quake3 mit Medieninhalten, die vollst\u00e4ndig unter einer freien GPL-Lizenz stehen. F\u00fcr meinen <a href=\"http:\/\/linuxiuvat.de\/\">\u00f6ffentlichen OpenArena-Server<\/a> habe ich mich f\u00fcr Deathmatch entschieden, da ich das Gef\u00fchl hatte, die meisten Spieler bevorzugen diesen Spielmodus.<br \/>\nEin weiterer Vorteil ist sicherlich, dass \"Jeder-gegen-Jeden\" am einfachsten zu \u00fcberwachen ist, denn im Prinzip geht es nur darum, dass Spieler X Spieler Y fraggt und alles ein Zeitspiel ist.<br \/>\nEs gibt verschiedene Werkzeuge und Programme, die einem beim Erstellen von Statistiken helfen k\u00f6nnen. Im Grunde l\u00e4uft es aber immer auf das Parsen der Logdatei heraus. Das <a href=\"http:\/\/openarena.wikia.com\/wiki\/Servers\">OpenArena-Wiki<\/a> f\u00fchrt hier z.B. <a href=\"http:\/\/vsp.goquake.com\/\">VSP<\/a>, <a href=\"http:\/\/www.aestats.com\">AEstats<\/a> oder <a href=\"http:\/\/code.google.com\/p\/oastat\/\">oastats<\/a> an.<br \/>\nF\u00fcr mich war nur eine Sache klar. Ich wollte keinen zus\u00e4tzlichen Datenbank-Server. Irgendwie erschien mir das nicht die richtige L\u00f6sung zu sein, um eine einzelne Logdatei zu parsen.<br \/>\nDer Gewinner war schlie\u00dflich <a href=\"http:\/\/openarena.ws\/board\/index.php?topic=4151.0\">Pyqscore<\/a>.<br \/>\nPyqscore ist ein in Python geschriebenes Programm, dass die Datei <em>games.log<\/em> analysieren kann und zus\u00e4tzlich noch einen Cache benutzt, damit schon zuvor analysierte Werte nicht noch einmal ausgewertet werden m\u00fcssen.<br \/>\nDas urspr\u00fcngliche Skript <em>pyqscore.py<\/em> habe ich auf meinem Server in <em>\/usr\/local\/bin<\/em> abgespeichert. Es wird t\u00e4glich mit Hilfe von Cron ausgef\u00fchrt. Erw\u00e4hnt hatte ich es schon bei meinem <a href=\"https:\/\/www.gambaru.de\/blog\/2012\/04\/22\/cron-und-logrotate-ein-beispiel-anhand-eines-spieleservers\/\">Cron- und Logrotate-Beispiel<\/a>.<br \/>\nJeden morgen wird deswegen die zuvor mit Logrotate rotierte Datei <em>games.log.1<\/em> ausgewertet und als <a href=\"http:\/\/linuxiuvat.de\/stats\/oa\/daily.htm\">daily.htm<\/a> abgespeichert. Mit Hilfe von cat addiere ich alle t\u00e4glichen Logdateien in die Datei <em>monat.log<\/em>, wor\u00fcber ich dann ein leicht modifiziertes Pyqscore ausf\u00fchren lasse, dass die Statistik des Monats wiederum in der Datei <a href=\"http:\/\/linuxiuvat.de\/stats\/oa\/monthly.htm\">monthly.htm<\/a> abspeichert.<br \/>\nF\u00fcr die t\u00e4glichen Statistiken benutze ich dieses Skript<\/p>\n<pre class=\"brush:shell\">\n#!\/bin\/sh\n# T\u00e4gliche Statistiken mit pyqscore erzeugen, im HTML-Format ausgeben und mit tidy s\u00e4ubern\nset -e\nBase=\"\/var\/games\/openarena-server\/.openarena\/baseoa\/\"\ncd $Base\nif [ -f games.l_cache.p ]; then\n        rm games.l_cache.p\nfi\n\/usr\/local\/bin\/pyqscore.py games.log.1\n\/usr\/bin\/tidy -utf8 -m -q daily.htm || true\n<\/pre>\n<p>Hier wird jeden Tag in das entsprechende Verzeichnis gewechselt und der alte Cache gel\u00f6scht. Das ist notwendig, weil Pyqscore bei einer gr\u00f6\u00dferen Logdatei den Cache zum schnelleren Analysieren heranzieht, bei kleineren Logdateien aber eine komplett neue Cache-Datei anlegt.<br \/>\nDamit keine Fehler entstehen, l\u00f6sche ich den Cache bei der t\u00e4glichen Statistik. Anschlie\u00dfend wird nur noch die <em>games.log.1<\/em> ausgewertet und <a href=\"https:\/\/www.gambaru.de\/blog\/2012\/03\/09\/webseiten-aufraumen-mit-tidy\/\">mit Hilfe von Tidy<\/a> ges\u00e4ubert.<br \/>\nEin anderes Skript kopiert dann automatisch die erzeugte <em>daily.htm<\/em> in das Webserver-Verzeichnis.<br \/>\nF\u00fcr die monatlichen Statistiken verfahre ich so:<\/p>\n<pre class=\"brush:shell\">\n#!\/bin\/sh\n# Monatliche Statistiken mit pyqscore erzeugen und im HTML-Format ausgeben\nset -e\nToday=`\/bin\/date +%d`\nMonth=`\/bin\/date -d \"last month\" +%m`\nYear=`\/bin\/date +%y`\nBase=\"\/var\/games\/openarena-server\/.openarena\/baseoa\/\"\nif [ $Today -eq 02 ]; then\n        rm ${Base}monat.log\n        cp ${Base}monthly.htm ${Base}${Year}${Month}_stats.htm\nfi\ncd $Base\ncat games.log.1 >> monat.log\n\/usr\/bin\/nice -19 \/usr\/local\/bin\/pyqscore_mon.py monat.log\n\/usr\/bin\/tidy -utf8 -m -q monthly.htm || true\n<\/pre>\n<p>Ok, hier werden folgende Sachen \u00fcberpr\u00fcft. Am Morgen jedes zweiten Tages im Monat wird die alte Datei <em>monat.log<\/em> gel\u00f6scht und die Auswertung beginnt von vorne. Ich sichere danach die alte Datei <em>monthly.htm<\/em>.<br \/>\nUrspr\u00fcnglich hatte ich daran gedacht, so etwas wie eine \"Siegerehrung\" zu machen, also eine Extraseite mit den ersten Pl\u00e4tzen. Sollte tats\u00e4chlich jemand das Bed\u00fcrfnis nach einer solchen Seite haben, kann ich das nun immer noch nachtragen. \ud83d\ude09<br \/>\nAnsonsten wird die t\u00e4gliche Logdatei an die monatliche angeh\u00e4ngt und ausgewertet und das ganze wieder mit Tidy ordentlich aufbereitet. Damit ich nicht permanent E-Mails von Cron mit Fehlermeldungen erhalte, erzwinge ich den Exit-Status von Tidy mit \"true\". Ansonsten kann man jeden Tag lesen, dass die urspr\u00fcngliche HTML-Datei Fehler enthalten hat.<br \/>\nDas war es im Prinzip auch schon. Der Vorteil von Pyqscore liegt darin, dass man statische HTML-Seiten mit Statistiken erh\u00e4lt ohne zuvor eine Datenbank installiert zu haben. Bei einem Projekt, wo es um jedes MB Arbeitsspeicher geht, sicher ein Vorteil.<br \/>\nIch habe Pyqscore an meine Bed\u00fcrfnisse angepasst. Im Laufe der Zeit sind mir bisher ein paar kleinere Schw\u00e4chen aufgefallen, die ich versucht habe zu beseitigen. F\u00fcr alle Interessierten biete ich Pyqscore hier <a href='https:\/\/gambaru.de\/blog\/wp-content\/uploads\/2012\/05\/pyqscore.tar1_.gz'>zum Download<\/a> an.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Zur\u00fcck zu meinem Steckenpferd. Im folgenden geht es darum, wie man aus einer Logdatei f\u00fcr OpenArena eine sinnvolle Spielstatistik erstellen kann. OpenArena ist kurz gesagt ein modifiziertes Quake3 mit Medieninhalten, die vollst\u00e4ndig unter einer freien GPL-Lizenz stehen. F\u00fcr meinen \u00f6ffentlichen OpenArena-Server habe ich mich f\u00fcr Deathmatch entschieden, da ich das Gef\u00fchl hatte, die meisten Spieler &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/gambaru.de\/blog\/2012\/05\/09\/pyqscore-spielstatistiken-fur-openarena-erstellen\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201ePyqscore: Spielstatistiken f\u00fcr OpenArena erstellen\u201c<\/span> weiterlesen<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[10,7],"tags":[53,108,144],"_links":{"self":[{"href":"https:\/\/gambaru.de\/blog\/wp-json\/wp\/v2\/posts\/7486"}],"collection":[{"href":"https:\/\/gambaru.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gambaru.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gambaru.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gambaru.de\/blog\/wp-json\/wp\/v2\/comments?post=7486"}],"version-history":[{"count":0,"href":"https:\/\/gambaru.de\/blog\/wp-json\/wp\/v2\/posts\/7486\/revisions"}],"wp:attachment":[{"href":"https:\/\/gambaru.de\/blog\/wp-json\/wp\/v2\/media?parent=7486"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gambaru.de\/blog\/wp-json\/wp\/v2\/categories?post=7486"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gambaru.de\/blog\/wp-json\/wp\/v2\/tags?post=7486"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}