]> ruin.nu Git - ndwebbie.git/blob - lib/NDWeb/Controller/Graphs.pm
Change database structure for planets and alliances + PG 8.4 changes
[ndwebbie.git] / lib / NDWeb / Controller / Graphs.pm
1 package NDWeb::Controller::Graphs;
2
3 use strict;
4 use warnings;
5 use parent 'Catalyst::Controller';
6
7 use ND::Include;
8
9 =head1 NAME
10
11 NDWeb::Controller::Graphs - Catalyst Controller
12
13 =head1 DESCRIPTION
14
15 Catalyst Controller.
16
17 =head1 METHODS
18
19 =cut
20
21
22 =head2 index 
23
24 =cut
25
26 sub begin : Private {
27         my ( $self, $c ) = @_;
28
29         $c->stash(width => 500);
30         $c->stash(height => 300);
31         $c->stash(settings => {
32                 line_width => 1,
33                 y_number_format => sub { prettyValue abs $_[0]},
34                 legend_placement => 'BL',
35                 #zero_axis => 1,
36                 box_axis => 0,
37                 boxclr => 'black',
38                 axislabelclr => 'black',
39                 use_axis => [2,1,2,2],
40                 y1_label => 'size',
41                 two_axes => 1,
42                 y2_label => 'rest',
43                 });
44         $c->stash(defaultgraph => 1);
45 }
46
47 sub planetranks : Local {
48         my ( $self, $c, $planet ) = @_;
49         my $dbh = $c->model;
50
51         $c->cache_page(3600);
52
53         $c->stash->{settings}->{y_max_value} = '0';
54         my $query = $dbh->prepare(q{SELECT tick,-scorerank AS score,-sizerank AS size
55                 ,-valuerank AS value,-xprank AS xp
56                 FROM planets NATUral JOIN planet_stats
57                 WHERE pid = $1 ORDER BY tick ASC
58                 });
59         $query->execute($planet);
60         $c->stash(query => $query);
61 }
62
63 sub planetstats : Local {
64         my ( $self, $c, $planet ) = @_;
65         my $dbh = $c->model;
66
67         $c->cache_page(3600);
68
69         $c->stash->{settings}->{y_min_value} = '0';
70         my $query = $dbh->prepare(q{SELECT tick,score,size,value,xp*60 AS "xp*60"
71                 FROM planets NATURAL JOIN planet_stats
72                 WHERE pid = $1 ORDER BY tick ASC
73                 });
74         $query->execute($planet);
75         $c->stash(query => $query);
76 }
77
78
79 sub galaxyranks : Local {
80         my ( $self, $c, $x,$y ) = @_;
81         my $dbh = $c->model;
82
83         $c->cache_page(3600);
84
85         $c->stash->{settings}->{title} = "Ranks : $x:$y";
86         $c->stash->{settings}->{y_max_value} = '0';
87         my $query = $dbh->prepare(q{SELECT tick,-scorerank AS score,-sizerank AS size
88                 ,-valuerank AS value,-xprank AS xp
89                 FROM galaxies WHERE x = $1 AND y = $2
90                 ORDER BY tick ASC
91                 });
92         $query->execute($x,$y);
93         $c->stash(query => $query);
94 }
95
96 sub galaxystats : Local {
97         my ( $self, $c, $x,$y ) = @_;
98         my $dbh = $c->model;
99
100         $c->cache_page(3600);
101
102         $c->stash->{settings}->{title} = "Stats : $x:$y";
103         $c->stash->{settings}->{y_min_value} = '0';
104         my $query = $dbh->prepare(q{SELECT tick,score,size,value,xp*60 AS "xp*60"
105                 FROM galaxies WHERE x = $1 AND y = $2
106                 ORDER BY tick ASC
107                 });
108         $query->execute($x,$y);
109         $c->stash(query => $query);
110 }
111
112 sub planetvsnd : Local {
113         my ( $self, $c, $planet ) = @_;
114         my $dbh = $c->model;
115
116         $c->cache_page(3600);
117
118         $c->stash->{settings}->{title} = 'You vs ND AVG';
119         $c->stash->{settings}->{use_axis} = [2,1,1,2];
120         $c->stash->{settings}->{y2_label} = 'score';
121
122         my $query = $dbh->prepare(q{SELECT a.tick,a.score/LEAST(members,60) AS NDscore
123                 ,a.size/members as NDsize,memsize, memscore
124                 FROM (SELECT tick,size AS memsize,score AS memscore
125                         FROM planets p JOIN planet_stats ps USING (pid) WHERE pid = $1) p
126                 JOIN alliance_stats a ON a.tick = p.tick
127                 WHERE aid = 1 ORDER BY tick
128                 });
129         $query->execute($planet);
130         $c->stash(query => $query);
131 }
132
133
134 sub alliancevsintel : Local {
135         my ( $self, $c, $alliance ) = @_;
136         my $dbh = $c->model;
137
138         $c->stash->{settings}->{title} = 'Alliance vs known members';
139         $c->stash->{settings}->{use_axis} = [2,1,1,2];
140         $c->stash->{settings}->{y2_label} = 'score';
141
142         my $query = $dbh->prepare(q{SELECT a.tick,a.score,a.size,memsize, memscore
143                 FROM (SELECT tick,aid,SUM(size) AS memsize,SUM(score) AS memscore
144                         FROM alliances a
145                                 JOIN planets p USING (alliance)
146                                 JOIN planet_stats ps USING (pid)
147                         GROUP BY tick,aid ) p
148                         JOIN alliance_stats a USING (aid,tick)
149                 WHERE aid = $1
150                         AND tick > (SELECT max(tick) - 50 FROM alliance_stats)
151                 ORDER BY tick
152                 });
153         $query->execute($alliance);
154         $c->stash(query => $query);
155 }
156
157 sub avgalliancevsintel : Local {
158         my ( $self, $c, $alliance ) = @_;
159         my $dbh = $c->model;
160
161         $c->stash->{settings}->{title} = 'Average alliance vs known members';
162         $c->stash->{settings}->{use_axis} = [2,1,1,2];
163         $c->stash->{settings}->{y2_label} = 'score';
164
165         my $query = $dbh->prepare(q{SELECT a.tick,a.score/LEAST(members,60) AS score
166                 ,a.size/members AS size,memsize, memscore
167                 FROM (SELECT tick,aid,AVG(size) AS memsize,AVG(score) AS memscore
168                         FROM alliances a
169                                 JOIN planets p USING (alliance)
170                                 JOIN planet_stats ps USING (pid)
171                         GROUP BY tick,aid) p
172                 JOIN alliance_stats a USING (aid,tick)
173                 WHERE aid = $1
174                         AND tick > (SELECT max(tick) - 50 FROM alliance_stats)
175                 ORDER BY tick
176                 });
177         $query->execute($alliance);
178         $c->stash(query => $query);
179 }
180
181
182 sub end : ActionClass('RenderView') {
183         my ( $self, $c ) = @_;
184         $c->res->headers->content_type('image/png');
185         if ($c->stash->{defaultgraph}){
186                 $c->stash(template => 'graphs/index.tt2');
187
188                 my $query = $c->stash->{query};
189                 my $fields = $query->{NUM_OF_FIELDS};
190                 my @fields;
191                 for (my $i = 0; $i < $fields; $i++){
192                         push @fields,[];
193                 }
194                 while (my @result = $query->fetchrow){
195                         for (my $i = 0; $i < $fields; $i++){
196                                 push @{$fields[$i]},$result[$i];
197                         }
198                 }
199                 $c->stash->{settings}->{x_label_skip} = int(1+(scalar @{$fields[0]}) / 6);
200                 my @legend = @{$query->{NAME}}[1..$fields];
201                 $c->stash(legend => \@legend);
202                 $c->stash(data => \@fields);
203         }
204         
205 }
206
207 =head1 AUTHOR
208
209 Michael Andreen (harv@ruin.nu)
210
211 =head1 LICENSE
212
213 GPL 2.0, or later.
214
215 =cut
216
217 1;