#!/usr/bin/perl -W
$ploticus_chron = 'ploticus png -prefab chron data=- x=1 y=2 xgrid=color=0.3 ygrid=color=0.3 datefmt=yyyymmdd mode=line gapmissing=yes yrange=0 -font Arial -diagfile /dev/null -backcolor black -color brightgreen';
$bar_width = 600;
################################################################################
use Time::Local;
%capacity_day = ();
%players_day = ();
%capacity_hour = ();
%players_hour = ();
%capacity_10m = ();
%players_10m = ();
%map = ();
%game = ();
%map7 = ();
%game7 = ();
$grand_total = 0;
$grand_total7 = 0;
$now = time;
while ($line = <>) {
chomp $line;
($datetime, $game, $mission, $map, $maxplayers, $players) = split /\t/, $line;
next if $map eq '';
$datetime =~ m|(....)(..)(..)/(..)(..)| or die 'match failed';
$year = $1;
$month = $2;
$day = $3;
$date = "$year$month$day";
$hour = $4;
$min = $5;
$time = timegm(0, $min, $hour, $day, $month - 1, $year);
# $gmm = "$game: $mission: $map";
$gmm = $map;
$gm = "$game: $mission";
$players = 0 if ($players < 0);
$maxplayers = 0 if ($maxplayers < 0);
$grand_total += $players;
# all time stats
if (exists $players_day{$date}) {
$players_day{$date} += $players;
$capacity_day{$date} += $maxplayers;
} else {
$players_day{$date} = $players;
$capacity_day{$date} = $maxplayers;
}
if ($players != 0) {
if (exists $map{$gmm}) {
$map{$gmm} += $players;
} else {
$map{$gmm} = $players;
}
if (exists $game{$gm}) {
$game{$gm} += $players;
} else {
$game{$gm} = $players;
}
}
# last 7 days
next unless ($now - 7 * 24 * 60 * 60 < $time);
$grand_total7 += $players;
if (exists $players_hour{"$date.$hour"}) {
$players_hour{"$date.$hour"} += $players;
$capacity_hour{"$date.$hour"} += $maxplayers;
} else {
$players_hour{"$date.$hour"} = $players;
$capacity_hour{"$date.$hour"} = $maxplayers;
}
if ($players != 0) {
if (exists $map7{$gmm}) {
$map7{$gmm} += $players;
} else {
$map7{$gmm} = $players;
}
if (exists $game7{$gm}) {
$game7{$gm} += $players;
} else {
$game7{$gm} = $players;
}
}
# last 24 hours
next unless ($now - 24 * 60 * 60 < $time);
if (exists $players_10m{"$date.$hour:$min"}) {
$players_10m{"$date.$hour:$min"} += $players;
$capacity_10m{"$date.$hour:$min"} += $maxplayers;
} else {
$players_10m{"$date.$hour:$min"} = $players;
$capacity_10m{"$date.$hour:$min"} = $maxplayers;
}
}
################################################################################
undef $/;
open HEADER, '< header' or die "Failed to open header: $!";
$header =
Updated every hour, last update $now UTC. All times in UTC. Data collected every 10 minutes by QStat, processed by a script, and graphs plotted with ploticus. Created by James Bursa.
END ################################################################################ open PLOTA1, "|$ploticus_chron xinc='30 days' stubfmt='Mmmdd' -o images/players_full.png"; open PLOTA2, "|$ploticus_chron xinc='30 days' stubfmt='Mmmdd' -o images/capacity_full.png"; open PLOTA3, "|$ploticus_chron xinc='30 days' stubfmt='Mmmdd' -o images/usage_full.png"; foreach $date (sort keys %players_day) { $meanplayer = $players_day{$date} / (6.0 * 24.0); $meancapacity = $capacity_day{$date} / (6.0 * 24.0); $usage = $meanplayer / $meancapacity * 100.0; print PLOTA1 "$date\t$meanplayer\n"; print PLOTA2 "$date\t$meancapacity\n"; print PLOTA3 "$date\t$usage\n"; } close PLOTA1; close PLOTA2; close PLOTA3; open PLOTB1, "|$ploticus_chron unittype=datetime xinc='1 day' stubfmt='Www' -o images/players_week.png"; open PLOTB2, "|$ploticus_chron unittype=datetime xinc='1 day' stubfmt='Www' -o images/capacity_week.png"; open PLOTB3, "|$ploticus_chron unittype=datetime xinc='1 day' stubfmt='Www' -o images/usage_week.png"; foreach $date (sort keys %players_hour) { $meanplayer = $players_hour{$date} / 6.0; $meancapacity = $capacity_hour{$date} / 6.0; $usage = $meanplayer / $meancapacity * 100.0; print PLOTB1 "$date:00\t$meanplayer\n"; print PLOTB2 "$date:00\t$meancapacity\n"; print PLOTB3 "$date:00\t$usage\n"; } close PLOTB1; close PLOTB2; close PLOTB3; open PLOTC1, "|$ploticus_chron unittype=datetime xinc='2 hours' stubfmt='hh' -o images/players_day.png"; open PLOTC2, "|$ploticus_chron unittype=datetime xinc='2 hours' stubfmt='hh' -o images/capacity_day.png"; open PLOTC3, "|$ploticus_chron unittype=datetime xinc='2 hours' stubfmt='hh' -o images/usage_day.png"; foreach $date (sort keys %players_10m) { $meanplayer = $players_10m{$date}; $meancapacity = $capacity_10m{$date}; $usage = $meanplayer / $meancapacity * 100.0; print PLOTC1 "$date\t$meanplayer\n"; print PLOTC2 "$date\t$meancapacity\n"; print PLOTC3 "$date\t$usage\n"; } close PLOTC1; close PLOTC2; close PLOTC3; print INDEX <All available data, averaged over each day. More graphs.
Graphs plotted with ploticus.
All available data, averaged over each day:
Last 7 days, averaged over each hour:
Last 24 hours, sampled every 10 minutes: