diff --git a/templates/themes/rrdtool/theme.php b/templates/themes/rrdtool/theme.php index 91b6f4c5..c28b5a04 100644 --- a/templates/themes/rrdtool/theme.php +++ b/templates/themes/rrdtool/theme.php @@ -15,10 +15,10 @@ // Wrap functions in a class so they don't interfere with normal Tinyboard operations class TB_RRDTool { public function build($action, $settings) { - global $config, $_theme; + global $config, $_theme, $argv; $this->boards = explode(' ', $settings['boards']); - $this->spans = Array('minute', 'hour', 'day', 'week', 'month'); + $this->spans = Array('minute', 'hour', 'day', 'week', 'month', 'year'); $this->interval = 120; $this->height = 150; $this->width = 700; @@ -39,19 +39,19 @@ 'DS:posts:GAUGE:' . ($this->interval*2) . ':0:10000', 'RRA:MIN:0:1:' . (3600/$this->interval), // hour - 'RRA:MIN:0:60:' . (86400/$this->interval), // day + 'RRA:MIN:0:1:' . (86400/$this->interval), // day 'RRA:MIN:0:60:' . (604800/$this->interval), // week 'RRA:MIN:0:60:' . (2592000/$this->interval), // month 'RRA:MIN:0:1440:' . (31536000/$this->interval), // year 'RRA:AVERAGE:0:1:' . (3600/$this->interval), // hour - 'RRA:AVERAGE:0:60:' . (86400/$this->interval), // day + 'RRA:AVERAGE:0:1:' . (86400/$this->interval), // day 'RRA:AVERAGE:0:60:' . (604800/$this->interval), // week 'RRA:AVERAGE:0:60:' . (2592000/$this->interval), // month 'RRA:AVERAGE:0:1440:' . (31536000/$this->interval), // year 'RRA:MAX:0:1:' . (3600/$this->interval), // hour - 'RRA:MAX:0:60:' . (86400/$this->interval), // day + 'RRA:MAX:0:1:' . (86400/$this->interval), // day 'RRA:MAX:0:60:' . (604800/$this->interval), // week 'RRA:MAX:0:60:' . (2592000/$this->interval), // month 'RRA:MAX:0:1440:' . (31536000/$this->interval), // year @@ -59,24 +59,27 @@ error('RRDtool failed: ' . htmlentities(rrd_error())); } - // Update graph - $query = prepare(sprintf("SELECT COUNT(*) AS `count` FROM `posts_%s` WHERE `time` >= :time", $board)); - $query->bindValue(':time', time() - $this->interval, PDO::PARAM_INT); - $query->execute() or error(db_error($query)); - $count = $query->fetch(); - $count = $count['count']; + // debug just the graphing (not updating) with the --debug switch + if(!isset($argv[1]) || $argv[1] != '--debug') { + // Update graph + $query = prepare(sprintf("SELECT COUNT(*) AS `count` FROM `posts_%s` WHERE `time` >= :time", $board)); + $query->bindValue(':time', time() - $this->interval, PDO::PARAM_INT); + $query->execute() or error(db_error($query)); + $count = $query->fetch(); + $count = $count['count']; - if(!rrd_update($file, Array( - '-t', - 'posts', - 'N:' . $count))) - error('RRDtool failed: ' . htmlentities(rrd_error())); + if(!rrd_update($file, Array( + '-t', + 'posts', + 'N:' . $count))) + error('RRDtool failed: ' . htmlentities(rrd_error())); + } foreach($this->spans as &$span) { // Graph graph if(!rrd_graph($settings['images'] . '/' . $board . '-' . $span . '.png', Array( '-s -1' . $span, - '-t Posts on ' . sprintf($config['board_abbreviation'] . ' this ' . $span, $board), + '-t Posts on ' . sprintf($config['board_abbreviation'], $board) .' this ', '--lazy', '-l 0', '-h', $this->height, '-w', $this->width, @@ -85,7 +88,6 @@ '-W', 'Powered by Tinyboard', '-E', '-X', '0', - //'-L', '4', '-Y', '-v posts/minute', 'DEF:posts=' . $file . ':posts:AVERAGE', @@ -97,6 +99,67 @@ error('RRDtool failed: ' . htmlentities(rrd_error())); } } + + // combined graph + foreach($this->spans as &$span) { + $options = Array( + '-s -1' . $span, + '-t Posts', + '--lazy', + '-l 0', + '-h', $this->height, '-w', $this->width, + '-a', 'PNG', + '-R', 'mono', + '-W', 'Powered by Tinyboard', + '-E', + '-X', '0', + '-Y', + '-v posts/minute'); + + $red = 0; + $green = 0; + $blue = 0; + $c = 0; + $cc = 0; + + foreach($this->boards as &$board) { + $color = str_pad(dechex($red*85), 2, '0', STR_PAD_LEFT) . + str_pad(dechex($green*85), 2, '0', STR_PAD_LEFT) . + str_pad(dechex($blue*85), 2, '0', STR_PAD_LEFT); + echo $color . PHP_EOL; + + $options[] = 'DEF:posts' . $board . '=' . $settings['path'] . '/' . $board . '.rrd' . ':posts:AVERAGE'; + $options[] = 'LINE2:posts' . $board . '#' . $color . ':' . + sprintf($config['board_abbreviation'], $board); + + // Randomize colors using this horrible undocumented algorithm I threw together while debugging + if($c == 0) + $red++; + elseif($c == 1) + $green++; + elseif($c == 2) + $blue++; + elseif($c == 3) + $green--; + elseif($c == 4) + $red--; + + $cc++; + if($cc > 3) { + $c++; + $cc = 0; + } + if($c>4) $c = 0; + + if($red>3) $red = 0; + if($green>3) $green = 0; + if($blue>3) $blue = 0; + } + $options[] = 'HRULE:0#000000'; + + if(!rrd_graph($settings['images'] . '/combined-' . $span . '.png', $options)) + error('RRDtool failed: ' . htmlentities(rrd_error())); + } } } };