From b1a7289bb7acbb4e911b62557acb7812492d90d5 Mon Sep 17 00:00:00 2001 From: Michael Andreen Date: Fri, 11 Jul 2008 23:46:37 +0200 Subject: [PATCH] Converted raids page --- NDWeb/Pages/Raids.pm | 377 ---------------------------------- database/group_roles.sql | 8 + database/raids.sql | 23 +++ lib/NDWeb/Controller/JSRPC.pm | 222 ++++++++++++++++++++ lib/NDWeb/Controller/Raids.pm | 255 +++++++++++++++++++++++ root/lib/inc/targetlist.tt2 | 15 +- root/lib/site/leftbar.tt2 | 2 +- root/lib/site/wrapper.tt2 | 3 + root/lib/site/xml.tt2 | 4 + root/src/jsrpc/update.tt2 | 19 ++ root/src/raids/index.tt2 | 55 +++++ root/src/raids/view.tt2 | 147 +++++++++++++ root/static/default.css | 19 +- root/static/js/raid.js | 209 ++++++------------- t/controller_JSRPC.t | 10 + t/controller_Raids.t | 10 + templates/raids.tmpl | 182 ---------------- templates/raids.xml.tmpl | 17 -- 18 files changed, 832 insertions(+), 745 deletions(-) delete mode 100644 NDWeb/Pages/Raids.pm create mode 100644 database/raids.sql create mode 100644 lib/NDWeb/Controller/JSRPC.pm create mode 100644 lib/NDWeb/Controller/Raids.pm create mode 100644 root/lib/site/xml.tt2 create mode 100644 root/src/jsrpc/update.tt2 create mode 100644 root/src/raids/index.tt2 create mode 100644 root/src/raids/view.tt2 create mode 100644 t/controller_JSRPC.t create mode 100644 t/controller_Raids.t delete mode 100644 templates/raids.tmpl delete mode 100644 templates/raids.xml.tmpl diff --git a/NDWeb/Pages/Raids.pm b/NDWeb/Pages/Raids.pm deleted file mode 100644 index 31be782..0000000 --- a/NDWeb/Pages/Raids.pm +++ /dev/null @@ -1,377 +0,0 @@ -#************************************************************************** -# Copyright (C) 2006 by Michael Andreen * -# * -# This program is free software; you can redistribute it and/or modify * -# it under the terms of the GNU General Public License as published by * -# the Free Software Foundation; either version 2 of the License, or * -# (at your option) any later version. * -# * -# This program is distributed in the hope that it will be useful, * -# but WITHOUT ANY WARRANTY; without even the implied warranty of * -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * -# GNU General Public License for more details. * -# * -# You should have received a copy of the GNU General Public License * -# along with this program; if not, write to the * -# Free Software Foundation, Inc., * -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * -#**************************************************************************/ - -package NDWeb::Pages::Raids; -use strict; -use warnings; -use ND::Include; -use POSIX; -use CGI qw/:standard/; -use NDWeb::Include; - -use base qw/NDWeb::XMLPage/; - -$NDWeb::Page::PAGES{raids} = __PACKAGE__; - -sub process { - my $self = shift; - $self->{XML} = 1 if param('xml'); -} - - -sub generateClaimXml : method { - my $self = shift; - my ($BODY,$raid, $from, $target) = @_; - my $DBH = $self->{DBH}; - - my ($timestamp) = $DBH->selectrow_array("SELECT MAX(modified)::timestamp AS modified FROM raid_targets"); - $BODY->param(Timestamp => $timestamp); - if ($target){ - $target = "r.id = $target"; - $_ = $self->listTargets; - $BODY->param(TargetList => $_); - }else{ - $target = "r.raid = $raid->{id}"; - } - - if ($from){ - $from = "AND modified > '$from'"; - }else{ - $from = ''; - } - my $targets = $DBH->prepare(qq{SELECT r.id,r.planet FROM raid_targets r WHERE $target $from}); - $targets->execute or print p($DBH->errstr); - my $claims = $DBH->prepare(qq{ SELECT username,joinable,launched FROM raid_claims - NATURAL JOIN users WHERE target = ? AND wave = ?}); - my @targets; - while (my $target = $targets->fetchrow_hashref){ - my %target; - $target{Id} = $target->{id}; - my @waves; - for (my $i = 1; $i <= $raid->{waves}; $i++){ - my %wave; - $wave{Id} = $i; - $claims->execute($target->{id},$i); - my $joinable = 0; - my $claimers; - if ($claims->rows != 0){ - my $owner = 0; - my @claimers; - while (my $claim = $claims->fetchrow_hashref){ - $owner = 1 if ($self->{USER} eq $claim->{username}); - $joinable = 1 if ($claim->{joinable}); - $claim->{username} .= '*' if ($claim->{launched}); - push @claimers,$claim->{username}; - } - $claimers = join '/', @claimers; - if ($owner){ - $wave{Command} = 'Unclaim'; - }elsif ($joinable){ - $wave{Command} = 'Join'; - }else{ - $wave{Command} = 'none'; - } - }else{ - #if (!isset($planet) || ($target->value/$planet->value > 0.4 || $target->score/$planet->score > 0.4)) - $wave{Command} = 'Claim'; - } - $wave{Claimers} = $claimers; - $wave{Joinable} = $joinable; - push @waves,\%wave; - } - $target{Waves} = \@waves; - push @targets,\%target; - } - $BODY->param(Targets => \@targets); - return $BODY; -} - -sub render_body { - my $self = shift; - my ($BODY) = @_; - $self->{TITLE} = 'Raids'; - my $DBH = $self->{DBH}; - - - my $raid; - if (defined param('raid')){ - my $query = $DBH->prepare(q{SELECT id,tick,waves,message,released_coords FROM raids WHERE id = ? AND open AND not removed AND id IN (SELECT raid FROM raid_access NATURAL JOIN groupmembers WHERE uid = ?)}); - $raid = $DBH->selectrow_hashref($query,undef,param('raid'),$ND::UID); - } - - if (defined param('cmd') && defined param('target') && defined param('wave') && param('target') =~ /^(\d+)$/ && param('wave') =~ /^(\d+)$/){ - my $target = param('target'); - my $wave = param('wave'); - - $DBH->begin_work; - my $findtarget = $DBH->prepare(q{SELECT rt.id FROM raid_targets rt - NATURAL JOIN raid_access ra NATURAL JOIN groupmembers - WHERE uid = ? AND id = ? - FOR UPDATE - }); - my $result = $DBH->selectrow_array($findtarget,undef,$ND::UID,$target); - if ($result != $target){ - $DBH->rollback; - return $self->noAccess; - } - - if (param('cmd') eq 'Claim'){ - my $claims = $DBH->prepare(qq{SELECT username FROM raid_claims NATURAL JOIN users WHERE target = ? AND wave = ?}); - $claims->execute($target,$wave); - if ($claims->rows == 0){ - my $query = $DBH->prepare(q{INSERT INTO raid_claims (target,uid,wave) VALUES(?,?,?)}); - if($query->execute($target,$ND::UID,$wave)){ - log_message $ND::UID,"Claimed target $target wave $wave."; - } - } - } - if (param('cmd') eq 'Join'){ - my $claims = $DBH->prepare(qq{SELECT username FROM raid_claims - NATURAL JOIN users WHERE target = ? AND wave = ? AND - joinable = TRUE}); - $claims->execute($target,$wave); - if ($claims->rows != 0){ - my $query = $DBH->prepare(q{INSERT INTO raid_claims (target,uid,wave,joinable) VALUES(?,?,?,TRUE)}); - if($query->execute($target,$ND::UID,$wave)){ - log_message $ND::UID,"Joined target $target wave $wave."; - } - } - } - if (param('cmd') eq 'set' && defined param('joinable') && param('joinable') =~ /(TRUE|FALSE)/){ - my $claims = $DBH->prepare(qq{SELECT username FROM raid_claims NATURAL JOIN users WHERE target = ? AND wave = ? AND uid = ?}); - $claims->execute($target,$wave,$ND::UID); - if ($claims->rows != 0){ - $DBH->do(q{UPDATE raid_claims SET joinable = ? WHERE target = ? AND wave = ?},undef,$1,$target,$wave) - } - } - if (param('cmd') eq 'Unclaim'){ - my $query = $DBH->prepare(qq{DELETE FROM raid_claims WHERE target = ? AND uid = ? AND wave = ?}); - if ($query->execute($target,$ND::UID,$wave)){ - log_message $ND::UID,"Unclaimed target $target wave $wave."; - } - } - $DBH->commit; - if ($self->{XML} && $raid){ - return $self->generateClaimXml($BODY,$raid,undef,$target); - } - } - if ($self->{XML} && $raid && param('cmd') eq 'update' ){ - my $from; - if (param('from') =~ /^[-\d\ \:\.]+$/){ - $from = param('from'); - } - return $self->generateClaimXml($BODY,$raid,$from); - } - if ($self->{XML} && param('cmd') eq 'gettargets' ){ - $_ = $self->listTargets(); - $BODY->param(TargetList => $_); - } - - return $BODY if $self->{XML}; - - if ($raid){#We have a raid, so list all targets - $BODY->param(Raid => $raid->{id}); - $BODY->param(Ajax => $self->{AJAX}); - my $noingal = ''; - my $planet; - if ($self->{PLANET}){ - my $query = $DBH->prepare("SELECT value, score,x,y FROM current_planet_stats WHERE id = ?"); - $planet = $DBH->selectrow_hashref($query,undef,$self->{PLANET}); - $noingal = "AND NOT (x = $planet->{x} AND y = $planet->{y})"; - } - $BODY->param(Message => parseMarkup($raid->{message})); - $BODY->param(LandingTick => $raid->{tick}); - my $targetquery = $DBH->prepare(qq{SELECT r.id, r.planet, size, score, value - , p.x,p.y,p.z, race - , p.value - p.size*200 - - COALESCE(ps.metal+ps.crystal+ps.eonium,0)/150 - - COALESCE(ss.total ,(SELECT - COALESCE(avg(total),0) FROM - structure_scans)::int)*1500 AS fleetvalue - ,(metal+crystal+eonium)/100 AS resvalue, comment - , hidden, light, medium, heavy - FROM current_planet_stats p - JOIN raid_targets r ON p.id = r.planet - LEFT OUTER JOIN planet_scans ps ON p.id = ps.planet - LEFT OUTER JOIN structure_scans ss ON p.id = ss.planet - WHERE r.raid = ? - $noingal - ORDER BY size}); - $targetquery->execute($raid->{id}); - my @targets; - my %production = (0 => 'None', 35 => 'Light', 65 => 'Medium', 100 => 'High'); - while (my $target = $targetquery->fetchrow_hashref){ - my %target; - if ($planet){ - if ($planet->{x} == $target->{x}){ - $target{style} = 'incluster'; - } - $target{ScoreBash} = 'bash' if ($target->{score}/$planet->{score} < 0.4); - $target{ValueBash} = 'bash' if ($target->{value}/$planet->{value} < 0.4); - #next if ($target->{score}/$planet->{score} < 0.4) && ($target->{value}/$planet->{value} < 0.4); - } - $target{Id} = $target->{id}; - $target{Race} = $target->{race}; - my $num = pow(10,length($target->{score})-2); - $target{Score} = "Hidden"; #ceil($target->{score}/$num)*$num; - $num = pow(10,length($target->{value})-2); - $target{Value} = "Hidden"; #ceil($target->{value}/$num)*$num; - $num = pow(10,length($target->{size})-2); - $target{Size} = floor($target->{size}/$num)*$num; - $num = pow(10,length($target->{fleetvalue})-2); - $target{FleetValue} = floor($target->{fleetvalue}/$num)*$num; - if (defined $target->{resvalue}){ - $num = pow(10,length($target->{resvalue})-2); - $target{ResValue} = floor($target->{resvalue}/$num)*$num; - } - $target{comment} = parseMarkup($target->{comment}) if ($target->{comment}); - - $target{Hidden} = int($target->{hidden} / 100); - $target{Light} = $production{$target->{light}}; - $target{Medium} = $production{$target->{medium}}; - $target{Heavy} = $production{$target->{heavy}}; - - my $unitscans = $DBH->prepare(q{ - SELECT DISTINCT ON (name) i.id,i.name, i.tick, i.amount - FROM fleets i - WHERE i.uid = -1 - AND i.sender = ? - AND i.mission = 'Full fleet' - GROUP BY i.id,i.tick,i.name,i.amount - ORDER BY name,i.tick DESC - }); - $unitscans->execute($target->{planet}) or warn $DBH->errstr; - my $ships = $DBH->prepare(q{SELECT ship,amount FROM fleet_ships - WHERE id = ? ORDER BY num - }); - my @missions; - while (my $mission = $unitscans->fetchrow_hashref){ - my @ships; - $ships->execute($mission->{id}); - while (my $ship = $ships->fetchrow_hashref){ - push @ships,$ship; - } - push @ships, {ship => 'No', amount => 'ships'} if @ships == 0; - $mission->{ships} = \@ships; - $mission->{amount} =~ s/(^[-+]?\d+?(?=(?>(?:\d{3})+)(?!\d))|\G\d{3}(?=\d))/$1,/g; #Add comma for ever 3 digits, i.e. 1000 => 1,000 - delete $mission->{id}; - push @missions,$mission; - } - $target{missions} = \@missions; - - my $query = $DBH->prepare(q{SELECT DISTINCT ON(rid) tick,category,name,amount - FROM planet_data pd JOIN planet_data_types pdt ON pd.rid = pdt.id - WHERE pd.id = $1 AND rid in (1,2,3,4,5,6,9,10,14,15,16,17,18) - ORDER BY rid,tick DESC - }); - $query->execute($target->{planet}); - while (my $data = $query->fetchrow_hashref){ - $data->{amount} =~ s/(^[-+]?\d+?(?=(?>(?:\d{3})+)(?!\d))|\G\d{3}(?=\d))/$1,/g; #Add comma for ever 3 digits, i.e. 1000 => 1,000 - $target{$data->{category}.$data->{name}} = $data->{amount}; - } - - my @roids; - my @claims; - my $size = $target{Size}; - for (my $i = 1; $i <= $raid->{waves}; $i++){ - my $roids = floor(0.25*$size); - $size -= $roids; - my $xp = 0; - if ($planet){ - $xp = pa_xp($roids,$planet->{score},$planet->{value},$target->{score},$target->{value}); - } - push @roids,{Wave => $i, Roids => $roids, XP => $xp}; - if ($self->{AJAX}){ - push @claims,{Wave => $i, Target => $target{Id}} - }else{ - push @claims,{Wave => $i, Target => $target{Id}, Command => 'Claim' - , Owner => 1, Raid => $raid->{id}, Joinable => 0}; - } - } - $target{Roids} = \@roids; - $target{Claims} = \@claims; - - push @targets,\%target; - } - @targets = sort {$b->{Roids}[0]{XP} <=> $a->{Roids}[0]{XP} or $b->{Size} <=> $a->{Size}} @targets; - - $BODY->param(Targets => \@targets); - }else{#list raids if we haven't chosen one yet - my $launched = 0; - my $query = $DBH->prepare(q{SELECT r.id AS raid,released_coords AS releasedcoords,tick,waves*COUNT(DISTINCT rt.id) AS waves, - COUNT(rc.uid) AS claims, COUNT(nullif(rc.launched,false)) AS launched,COUNT(NULLIF(rc.uid > 0,true)) AS blocked - FROM raids r JOIN raid_targets rt ON r.id = rt.raid - LEFT OUTER JOIN raid_claims rc ON rt.id = rc.target - WHERE open AND not removed AND r.id - IN (SELECT raid FROM raid_access NATURAL JOIN groupmembers WHERE uid = ?) - GROUP BY r.id,released_coords,tick,waves}); - $query->execute($ND::UID); - my @raids; - while (my $raid = $query->fetchrow_hashref){ - $raid->{waves} -= $raid->{blocked}; - $raid->{claims} -= $raid->{blocked}; - delete $raid->{blocked}; - $launched += $raid->{launched}; - push @raids,$raid; - } - $BODY->param(Raids => \@raids); - - if ($self->isBC){ - $BODY->param(isBC => 1); - my $query = $DBH->prepare(q{SELECT r.id AS raid,open ,tick,waves*COUNT(DISTINCT rt.id) AS waves, - COUNT(rc.uid) AS claims, COUNT(nullif(rc.launched,false)) AS launched ,COUNT(NULLIF(uid > 0,true)) AS blocked - FROM raids r JOIN raid_targets rt ON r.id = rt.raid - LEFT OUTER JOIN raid_claims rc ON rt.id = rc.target - WHERE not removed AND (not open - OR r.id NOT IN (SELECT raid FROM raid_access NATURAL JOIN groupmembers WHERE uid = ?)) - GROUP BY r.id,open,tick,waves}); - $query->execute($ND::UID); - my @raids; - while (my $raid = $query->fetchrow_hashref){ - $raid->{waves} -= $raid->{blocked}; - $raid->{claims} -= $raid->{blocked}; - delete $raid->{blocked}; - $launched += $raid->{launched}; - push @raids,$raid; - } - $BODY->param(ClosedRaids => \@raids); - - - $query = $DBH->prepare(q{SELECT r.id AS raid,tick,waves*COUNT(DISTINCT rt.id) AS waves, - COUNT(rc.uid) AS claims, COUNT(nullif(rc.launched,false)) AS launched ,COUNT(NULLIF(uid > 0,true)) AS blocked - FROM raids r JOIN raid_targets rt ON r.id = rt.raid - LEFT OUTER JOIN raid_claims rc ON rt.id = rc.target - WHERE removed - GROUP BY r.id,tick,waves}); - $query->execute; - my @oldraids; - while (my $raid = $query->fetchrow_hashref){ - $raid->{waves} -= $raid->{blocked}; - $raid->{claims} -= $raid->{blocked}; - delete $raid->{blocked}; - $launched += $raid->{launched}; - push @oldraids,$raid; - } - $BODY->param(RemovedRaids => \@oldraids); - $BODY->param(Launched => $launched); - } - } - return $BODY; -} -1; diff --git a/database/group_roles.sql b/database/group_roles.sql index 088af44..16d6c7c 100644 --- a/database/group_roles.sql +++ b/database/group_roles.sql @@ -24,6 +24,8 @@ INSERT INTO roles VALUES('members_points_nolimit'); INSERT INTO roles VALUES('covop'); INSERT INTO roles VALUES('calls_list'); INSERT INTO roles VALUES('calls_edit'); +INSERT INTO roles VALUES('raids_info'); +INSERT INTO roles VALUES('raids_edit'); INSERT INTO group_roles (gid,role) VALUES(2,'member_menu'); INSERT INTO group_roles (gid,role) VALUES(2,'attack_menu'); @@ -35,6 +37,8 @@ INSERT INTO group_roles (gid,role) VALUES(6,'calls_list'); INSERT INTO group_roles (gid,role) VALUES(6,'calls_edit'); INSERT INTO group_roles (gid,role) VALUES(4,'bc_menu'); +INSERT INTO group_roles (gid,role) VALUES(4,'raids_info'); +INSERT INTO group_roles (gid,role) VALUES(4,'raids_edit'); INSERT INTO group_roles (gid,role) VALUES(5,'intel_menu'); @@ -52,6 +56,8 @@ INSERT INTO group_roles (gid,role) VALUES(1,'alliances_resources'); INSERT INTO group_roles (gid,role) VALUES(1,'graphs_intel'); INSERT INTO group_roles (gid,role) VALUES(1,'calls_list'); INSERT INTO group_roles (gid,role) VALUES(1,'calls_edit'); +INSERT INTO group_roles (gid,role) VALUES(1,'raids_info'); +INSERT INTO group_roles (gid,role) VALUES(1,'raids_edit'); INSERT INTO group_roles (gid,role) VALUES(3,'dc_menu'); INSERT INTO group_roles (gid,role) VALUES(3,'bc_menu'); @@ -63,3 +69,5 @@ INSERT INTO group_roles (gid,role) VALUES(3,'alliances_resources'); INSERT INTO group_roles (gid,role) VALUES(3,'graphs_intel'); INSERT INTO group_roles (gid,role) VALUES(3,'calls_list'); INSERT INTO group_roles (gid,role) VALUES(3,'calls_edit'); +INSERT INTO group_roles (gid,role) VALUES(3,'raids_info'); +INSERT INTO group_roles (gid,role) VALUES(3,'raids_edit'); diff --git a/database/raids.sql b/database/raids.sql new file mode 100644 index 0000000..3df4bd1 --- /dev/null +++ b/database/raids.sql @@ -0,0 +1,23 @@ +INSERT INTO forum_boards (fcid,fbid,board) VALUES(9,-5,'Raid logs'); + +ALTER TABLE raids ADD COLUMN ftid INTEGER; + + +CREATE OR REPLACE FUNCTION add_raid() RETURNS trigger +AS $$ +DECLARE + rec RECORD; +BEGIN + INSERT INTO forum_threads (ftid,fbid,subject,uid) VALUES + (DEFAULT,-5,'Raid ' || NEW.id,-3) RETURNING ftid INTO rec; + NEW.ftid := rec.ftid; + return NEW; +END; +$$ + LANGUAGE plpgsql; + + +CREATE TRIGGER add_raid + BEFORE INSERT ON raids + FOR EACH ROW + EXECUTE PROCEDURE add_raid(); diff --git a/lib/NDWeb/Controller/JSRPC.pm b/lib/NDWeb/Controller/JSRPC.pm new file mode 100644 index 0000000..41c7c3d --- /dev/null +++ b/lib/NDWeb/Controller/JSRPC.pm @@ -0,0 +1,222 @@ +package NDWeb::Controller::JSRPC; + +use strict; +use warnings; +use parent 'Catalyst::Controller'; + +=head1 NAME + +NDWeb::Controller::JSRPC - Catalyst Controller + +=head1 DESCRIPTION + +Catalyst Controller. + +=head1 METHODS + +=cut + + +=head2 index + +=cut + +sub index :Path :Args(0) { + my ( $self, $c ) = @_; + + $c->response->body('Matched NDWeb::Controller::JSRPC in JSRPC.'); +} + +sub update : Local { + my ($self, $c, $raid, $from, $target) = @_; + my $dbh = $c->model; + + $c->forward('/raids/findRaid'); + $raid = $c->stash->{raid}; + + my $targets;; + if ($from){ + my ($timestamp) = $dbh->selectrow_array("SELECT MAX(modified)::timestamp AS modified FROM raid_targets"); + $c->stash(timestamp => $timestamp); + $targets = $dbh->prepare(q{SELECT r.id,r.planet FROM raid_targets r + WHERE r.raid = ? AND modified > ? + }); + $targets->execute($raid->{id},$from); + }elsif($target){ + $targets = $dbh->prepare(q{SELECT r.id,r.planet FROM raid_targets r + WHERE r.raid = $1 AND r.id = $2 + }); + $targets->execute($raid->{id},$target); + } + + my $claims = $dbh->prepare(qq{ SELECT username,joinable,launched FROM raid_claims + NATURAL JOIN users WHERE target = ? AND wave = ?}); + my @targets; + while (my $target = $targets->fetchrow_hashref){ + my %target; + $target{id} = $target->{id}; + my @waves; + for (my $i = 1; $i <= $raid->{waves}; $i++){ + my %wave; + $wave{id} = $i; + $claims->execute($target->{id},$i); + my $joinable = 0; + my $claimers; + if ($claims->rows != 0){ + my $owner = 0; + my @claimers; + while (my $claim = $claims->fetchrow_hashref){ + $owner = 1 if ($c->user->username eq $claim->{username}); + $joinable = 1 if ($claim->{joinable}); + $claim->{username} .= '*' if ($claim->{launched}); + push @claimers,$claim->{username}; + } + $claimers = join '/', @claimers; + if ($owner){ + $wave{command} = 'unclaim'; + }elsif ($joinable){ + $wave{command} = 'join'; + }else{ + $wave{command} = 'taken'; + } + }else{ + $wave{command} = 'claim'; + } + $wave{claimers} = $claimers; + $wave{joinable} = $joinable; + push @waves,\%wave; + } + $target{waves} = \@waves; + push @targets,\%target; + } + $c->stash(targets => \@targets); + +} + +sub claim : Local { + my ($self, $c, $raid, $from, $target, $wave) = @_; + my $dbh = $c->model; + + $dbh->begin_work; + $c->forward('assertTarget'); + + my $claims = $dbh->prepare(qq{SELECT username FROM raid_claims + NATURAL JOIN users WHERE target = ? AND wave = ? + }); + $claims->execute($target,$wave); + if ($claims->rows == 0){ + my $query = $dbh->prepare(q{INSERT INTO raid_claims (target,uid,wave) VALUES(?,?,?)}); + $query->execute($target,$c->user->id,$wave); + $c->forward('/raids/log',[$raid, "Claimed target $target wave $wave"]); + $c->forward('/listTargets'); + } + $dbh->commit; + + $c->stash(template => 'jsrpc/update.tt2'); + $c->forward('update'); +} + + +sub join : Local { + my ($self, $c, $raid, $from, $target, $wave) = @_; + my $dbh = $c->model; + + $dbh->begin_work; + $c->forward('assertTarget'); + + my $claims = $dbh->prepare(q{SELECT username FROM raid_claims + NATURAL JOIN users WHERE target = ? AND wave = ? AND joinable = TRUE + }); + $claims->execute($target,$wave); + if ($claims->rows != 0){ + my $query = $dbh->prepare(q{INSERT INTO raid_claims (target,uid,wave,joinable) + VALUES(?,?,?,TRUE) + }); + $query->execute($target,$c->user->id,$wave); + $c->forward('/raids/log',[$raid, "Joined target $target wave $wave"]); + $c->forward('/listTargets'); + } + $dbh->commit; + + $c->stash(template => 'jsrpc/update.tt2'); + $c->forward('update'); +} + +sub unclaim : Local { + my ($self, $c, $raid, $from, $target, $wave) = @_; + my $dbh = $c->model; + + $dbh->begin_work; + my $query = $dbh->prepare(q{DELETE FROM raid_claims WHERE target = ? + AND uid = ? AND wave = ? + }); + $query->execute($target,$c->user->id,$wave); + $c->forward('/raids/log',[$raid, "Unclaimed target $target wave $wave"]); + $dbh->commit; + + $c->stash(template => 'jsrpc/update.tt2'); + $c->forward('/listTargets'); + $c->forward('update'); +} + +sub joinable : Local { + my ($self, $c, $raid, $from, $target, $wave,$joinable) = @_; + my $dbh = $c->model; + + my $claims = $dbh->prepare(q{SELECT username FROM raid_claims NATURAL JOIN users + WHERE target = ? AND wave = ? AND uid = ? + }); + $claims->execute($target,$wave,$c->user->id); + if ($claims->rows != 0){ + my $query = $dbh->prepare(q{UPDATE raid_claims SET joinable = NOT ? + WHERE target = ? AND wave = ? + }); + $query->execute($joinable,$target,$wave); + $c->forward('/listTargets'); + } + + $c->stash(template => 'jsrpc/update.tt2'); + $c->forward('/listTargets'); + $c->forward('update'); +} + +sub listTargets : Local { + my ($self, $c) = @_; + + $c->stash(template => 'jsrpc/update.tt2'); + $c->forward('/listTargets'); +} + +sub assertTarget : Private { + my ($self, $c, $raid, $from, $target, $wave) = @_; + my $dbh = $c->model; + + my $findtarget = $dbh->prepare(q{SELECT rt.id FROM raid_targets rt + NATURAL JOIN raid_access ra NATURAL JOIN groupmembers + WHERE uid = ? AND id = ? + FOR UPDATE + }); + + my $result = $dbh->selectrow_array($findtarget,undef,$c->user->id,$target); + if ($result != $target){ + $dbh->rollback; + die 'Access denied'; + } +} + +sub end : ActionClass('RenderView') { + my ($self,$c) = @_; + $c->res->content_type('application/xml'); +} + +=head1 AUTHOR + +Michael Andreen (harv@ruin.nu) + +=head1 LICENSE + +GPL 2.0, or later + +=cut + +1; diff --git a/lib/NDWeb/Controller/Raids.pm b/lib/NDWeb/Controller/Raids.pm new file mode 100644 index 0000000..13a2956 --- /dev/null +++ b/lib/NDWeb/Controller/Raids.pm @@ -0,0 +1,255 @@ +package NDWeb::Controller::Raids; + +use strict; +use warnings; +use parent 'Catalyst::Controller'; + +use POSIX; +use NDWeb::Include; +use ND::Include; + +=head1 NAME + +NDWeb::Controller::Raids - Catalyst Controller + +=head1 DESCRIPTION + +Catalyst Controller. + +=head1 METHODS + +=cut + + +=head2 index + +=cut + +sub index :Path :Args(0) { + my ( $self, $c ) = @_; + my $dbh = $c->model; + + my $launched = 0; + my $query = $dbh->prepare(q{SELECT r.id,released_coords AS releasedcoords,tick,waves*COUNT(DISTINCT rt.id) AS waves, + COUNT(rc.uid) AS claims, COUNT(nullif(rc.launched,false)) AS launched,COUNT(NULLIF(rc.uid > 0,true)) AS blocked + FROM raids r JOIN raid_targets rt ON r.id = rt.raid + LEFT OUTER JOIN raid_claims rc ON rt.id = rc.target + WHERE open AND not removed AND r.id + IN (SELECT raid FROM raid_access NATURAL JOIN groupmembers WHERE uid = ?) + GROUP BY r.id,released_coords,tick,waves}); + $query->execute($c->user->id); + my @raids; + while (my $raid = $query->fetchrow_hashref){ + $raid->{waves} -= $raid->{blocked}; + $raid->{claims} -= $raid->{blocked}; + delete $raid->{blocked}; + $launched += $raid->{launched}; + push @raids,$raid; + } + $c->stash(raids => \@raids); + + if ($c->check_user_roles(qw/raids_info/)){ + my $query = $dbh->prepare(q{SELECT r.id,open ,tick,waves*COUNT(DISTINCT rt.id) AS waves, + COUNT(rc.uid) AS claims, COUNT(nullif(rc.launched,false)) AS launched ,COUNT(NULLIF(uid > 0,true)) AS blocked + FROM raids r JOIN raid_targets rt ON r.id = rt.raid + LEFT OUTER JOIN raid_claims rc ON rt.id = rc.target + WHERE not removed AND (not open + OR r.id NOT IN (SELECT raid FROM raid_access NATURAL JOIN groupmembers WHERE uid = ?)) + GROUP BY r.id,open,tick,waves}); + $query->execute($c->user->id); + my @raids; + while (my $raid = $query->fetchrow_hashref){ + $raid->{waves} -= $raid->{blocked}; + $raid->{claims} -= $raid->{blocked}; + delete $raid->{blocked}; + $launched += $raid->{launched}; + push @raids,$raid; + } + $c->stash(closedraids => \@raids); + + + $query = $dbh->prepare(q{SELECT r.id,tick,waves*COUNT(DISTINCT rt.id) AS waves, + COUNT(rc.uid) AS claims, COUNT(nullif(rc.launched,false)) AS launched ,COUNT(NULLIF(uid > 0,true)) AS blocked + FROM raids r JOIN raid_targets rt ON r.id = rt.raid + LEFT OUTER JOIN raid_claims rc ON rt.id = rc.target + WHERE removed + GROUP BY r.id,tick,waves}); + $query->execute; + my @oldraids; + while (my $raid = $query->fetchrow_hashref){ + $raid->{waves} -= $raid->{blocked}; + $raid->{claims} -= $raid->{blocked}; + delete $raid->{blocked}; + $launched += $raid->{launched}; + push @oldraids,$raid; + } + $c->stash(removedraids => \@oldraids); + $c->stash(launched => $launched); + } + +} + +sub view : Local { + my ( $self, $c, $raid ) = @_; + my $dbh = $c->model; + + $c->forward('findRaid'); + $raid = $c->stash->{raid}; + + + $c->stash(raid => $raid->{id}); + my $noingal = ''; + my $planet; + if ($c->user->planet){ + my $query = $dbh->prepare("SELECT value, score,x,y FROM current_planet_stats WHERE id = ?"); + $planet = $dbh->selectrow_hashref($query,undef,$c->user->planet); + $noingal = "AND NOT (x = $planet->{x} AND y = $planet->{y})"; + } + $c->stash(message => parseMarkup($raid->{message})); + $c->stash(landingtick => $raid->{tick}); + my $targetquery = $dbh->prepare(qq{SELECT r.id, r.planet, size, score, value + , p.x,p.y,p.z, race + , p.value - p.size*200 - + COALESCE(ps.metal+ps.crystal+ps.eonium,0)/150 - + COALESCE(ss.total ,(SELECT + COALESCE(avg(total),0) FROM + structure_scans)::int)*1500 AS fleetvalue + ,(metal+crystal+eonium)/100 AS resvalue, comment + , hidden, light, medium, heavy + FROM current_planet_stats p + JOIN raid_targets r ON p.id = r.planet + LEFT OUTER JOIN planet_scans ps ON p.id = ps.planet + LEFT OUTER JOIN structure_scans ss ON p.id = ss.planet + WHERE r.raid = ? + $noingal + ORDER BY size}); + $targetquery->execute($raid->{id}); + my @targets; + my %production = (0 => 'None', 35 => 'Light', 65 => 'Medium', 100 => 'High'); + while (my $target = $targetquery->fetchrow_hashref){ + my %target; + if ($planet){ + if ($planet->{x} == $target->{x}){ + $target{style} = 'incluster'; + } + $target{scorebash} = 'bash' if ($target->{score}/$planet->{score} < 0.4); + $target{valuebash} = 'bash' if ($target->{value}/$planet->{value} < 0.4); + #next if ($target->{score}/$planet->{score} < 0.4) && ($target->{value}/$planet->{value} < 0.4); + } + $target{id} = $target->{id}; + $target{race} = $target->{race}; + my $num = pow(10,length($target->{score})-2); + $target{score} = "Hidden"; #ceil($target->{score}/$num)*$num; + $num = pow(10,length($target->{value})-2); + $target{value} = "Hidden"; #ceil($target->{value}/$num)*$num; + $num = pow(10,length($target->{size})-2); + $target{size} = floor($target->{size}/$num)*$num; + $num = pow(10,length($target->{fleetvalue})-2); + $target{fleetvalue} = floor($target->{fleetvalue}/$num)*$num; + if (defined $target->{resvalue}){ + $num = pow(10,length($target->{resvalue})-2); + $target{resvalue} = floor($target->{resvalue}/$num)*$num; + } + $target{comment} = parseMarkup($target->{comment}) if ($target->{comment}); + + $target{hidden} = int($target->{hidden} / 100); + $target{light} = $production{$target->{light}}; + $target{medium} = $production{$target->{medium}}; + $target{heavy} = $production{$target->{heavy}}; + + my $unitscans = $dbh->prepare(q{ + SELECT DISTINCT ON (name) i.id,i.name, i.tick, i.amount + FROM fleets i + WHERE i.uid = -1 + AND i.sender = ? + AND i.mission = 'Full fleet' + GROUP BY i.id,i.tick,i.name,i.amount + ORDER BY name,i.tick DESC + }); + $unitscans->execute($target->{planet}); + my $ships = $dbh->prepare(q{SELECT ship,amount FROM fleet_ships + WHERE id = ? ORDER BY num + }); + my @missions; + while (my $mission = $unitscans->fetchrow_hashref){ + my @ships; + $ships->execute($mission->{id}); + while (my $ship = $ships->fetchrow_hashref){ + push @ships,$ship; + } + push @ships, {ship => 'No', amount => 'ships'} if @ships == 0; + $mission->{ships} = \@ships; + $mission->{amount} =~ s/(^[-+]?\d+?(?=(?>(?:\d{3})+)(?!\d))|\G\d{3}(?=\d))/$1,/g; #Add comma for ever 3 digits, i.e. 1000 => 1,000 + delete $mission->{id}; + push @missions,$mission; + } + $target{missions} = \@missions; + + my $query = $dbh->prepare(q{SELECT DISTINCT ON(rid) tick,category,name,amount + FROM planet_data pd JOIN planet_data_types pdt ON pd.rid = pdt.id + WHERE pd.id = $1 AND rid in (1,2,3,4,5,6,9,10,14,15,16,17,18) + ORDER BY rid,tick DESC + }); + $query->execute($target->{planet}); + while (my $data = $query->fetchrow_hashref){ + $data->{amount} =~ s/(^[-+]?\d+?(?=(?>(?:\d{3})+)(?!\d))|\G\d{3}(?=\d))/$1,/g; #Add comma for ever 3 digits, i.e. 1000 => 1,000 + $data->{name} =~ s/ /_/g; + $target{$data->{category}.$data->{name}} = $data->{amount}; + } + + my @roids; + my @claims; + my $size = $target{size}; + for (my $i = 1; $i <= $raid->{waves}; $i++){ + my $roids = floor(0.25*$size); + $size -= $roids; + my $xp = 0; + if ($planet){ + $xp = pa_xp($roids,$planet->{score},$planet->{value},$target->{score},$target->{value}); + } + push @roids,{wave => $i, roids => $roids, xp => $xp}; + push @claims,{wave => $i} + } + $target{roids} = \@roids; + $target{claims} = \@claims; + + push @targets,\%target; + } + @targets = sort {$b->{roids}[0]{xp} <=> $a->{roids}[0]{xp} or $b->{size} <=> $a->{size}} @targets; + + $c->stash(targets => \@targets); +} + +sub log : Private { + my ($self, $c, $raid, $message) = @_; + my $dbh = $c->model; + + my $log = $dbh->prepare(q{INSERT INTO forum_posts (uid,ftid,message) + VALUES($1,(SELECT ftid FROM raids WHERE id = $2),$3) + }); + $log->execute($c->user->id,$raid,$message); +} + +sub findRaid : Private { + my ( $self, $c, $raid ) = @_; + my $dbh = $c->model; + + my $query = $dbh->prepare(q{SELECT id,tick,waves,message,released_coords + FROM raids WHERE id = ? AND open AND not removed AND id IN + (SELECT raid FROM raid_access NATURAL JOIN groupmembers WHERE uid = ?) + }); + $raid = $dbh->selectrow_hashref($query,undef,$raid,$c->user->id); + $c->stash(raid => $raid); +} + +=head1 AUTHOR + +Michael Andreen (harv@ruin.nu) + +=head1 LICENSE + +GPL 2.0, or later. + +=cut + +1; diff --git a/root/lib/inc/targetlist.tt2 b/root/lib/inc/targetlist.tt2 index 4f8cced..43431ce 100644 --- a/root/lib/inc/targetlist.tt2 +++ b/root/lib/inc/targetlist.tt2 @@ -1,18 +1,19 @@ -[% IF targets%] +[% IF claimedtargets.size > 0 %] [% FOR target IN claimedtargets %] - - + [% END %] diff --git a/root/lib/site/leftbar.tt2 b/root/lib/site/leftbar.tt2 index 6c1aea1..733ac21 100644 --- a/root/lib/site/leftbar.tt2 +++ b/root/lib/site/leftbar.tt2 @@ -58,7 +58,7 @@
  • Web raids
  • + onclick = "listTargets()">

    [% PROCESS inc/targetlist.tt2 %]
    [% END %] diff --git a/root/lib/site/wrapper.tt2 b/root/lib/site/wrapper.tt2 index 3a7af07..6da016b 100644 --- a/root/lib/site/wrapper.tt2 +++ b/root/lib/site/wrapper.tt2 @@ -4,6 +4,9 @@ ELSIF template.name.match('graphs/'); debug("Passing page through graph: $template.name"); content; +ELSIF template.name.match('jsrpc/'); + debug("Passing page through xml: $template.name"); + content WRAPPER site/xml.tt2; ELSE; debug("Applying HTML page layout wrappers to $template.name\n"); content WRAPPER site/html.tt2 + site/layout.tt2; diff --git a/root/lib/site/xml.tt2 b/root/lib/site/xml.tt2 new file mode 100644 index 0000000..f752df8 --- /dev/null +++ b/root/lib/site/xml.tt2 @@ -0,0 +1,4 @@ + + +[% content %] + diff --git a/root/src/jsrpc/update.tt2 b/root/src/jsrpc/update.tt2 new file mode 100644 index 0000000..ff6e91a --- /dev/null +++ b/root/src/jsrpc/update.tt2 @@ -0,0 +1,19 @@ +[% IF timestamp %] + [% timestamp %] +[% END %] +[% FOR t IN targets %] + + [% FOR w IN t.waves %] + + [% w.command %] + [% w.claimers %] + [% w.joinable %] + + [% END %] + +[% END %] +[% IF claimedtargets %] + +[% PROCESS inc/targetlist.tt2 | html %] + +[% END %] diff --git a/root/src/raids/index.tt2 b/root/src/raids/index.tt2 new file mode 100644 index 0000000..485ebde --- /dev/null +++ b/root/src/raids/index.tt2 @@ -0,0 +1,55 @@ +[% META title = 'List raids' %] +[% IF launched %] +

    Total launched fleets: [% launched %]

    +[% END %] +

    Open raids

    +[% FOR r IN raids %] +

    Raid [% r.id %] + Landing tick: [% r.tick %] + [% IF c.check_user_roles('raids_edit') %] + Edit + Close raid. + [% UNLESS r.releasedcoords %] + Show coords. + [% END %] + [% END %] + [% IF c.check_user_roles('raids_info') %] + Waves: [% r.waves %] + Claims: [% r.claims %] + Launched: [% r.launched %] + [% END %] +

    +[% END %] + +[% IF c.check_user_roles('raids_info') %] +

    Closed raids

    + [% FOR r IN closedraids %] +

    + [% IF c.check_user_roles('raids_edit') %] + Edit Raid [% r.id %] + Open raid. + [% UNLESS r.releasedcoords %] + Show coords. + [% END %] + [% END %] + Landing tick: [% r.tick %] + Waves: [% r.waves %] + Claims: [% r.claims %] + Launched: [% r.launched %] +

    + [% END %] + +

    Removed raids

    + [% FOR r IN removedraids %] +

    + [% IF c.check_user_roles('raids_edit') %] + Edit Raid [% r.id %] + Open raid. + [% END %] + Landing tick: [% r.tick %] + Waves: [% r.waves %] + Claims: [% r.claims %] + Launched: [% r.launched %] +

    + [% END %] +[% END %] diff --git a/root/src/raids/view.tt2 b/root/src/raids/view.tt2 new file mode 100644 index 0000000..e163b9d --- /dev/null +++ b/root/src/raids/view.tt2 @@ -0,0 +1,147 @@ +[% META title = 'Raid claiming' %] + +
    Message +

    REMEMBER TO PASTE LAUNCH CONFIRMATION IF YOU WANT AN ATTACK POINT

    +

    DO NOT JOIN A WAVE UNLESS YOU HAVE PERMISSION FROM THE PERSON WHO CLAIMED IT

    +

    COORDS ARE NOT SHOWN UNTIL AT LEAST 10 MIN AFTER YOUR CLAIM

    +

    Landing tick first wave: [% landingtick %]

    + [% message %] +
    + +
    +
    + + +
    + +[% FOR t IN targets %] +
    Target: #[% t.id %] +
      +
    • Size: [% t.size %]
    • +
    • Score: [% t.score %]
    • +
    • Value: [% t.value %]
    • +
    • Fleet value: [% t.fleetvalue %]
    • +
    • Resource value: [% t.resvalue %]
    • +
    • Hidden value: [% t.hidden %]
    • +
    • Factory Usage: [% t.light %], [% t.medium %], [% t.heavy %]
    • +
    • Race: [% t.race %]
    • + [% FOR r IN t.roids %] +
    • Roids wave [% r.wave %]: [% r.roids %] ([% r.xp %] xp)
    • + [% END %] +
    + [% IF t.comment %] +
    Comment + [% t.comment %] +
    + [% END %] +
    TargetTick
    - [% target.released_coords and target.coords%][% IF target.launched%]*[% END %] + [% IF target.released_coords %] + [% target.coords%][% IF target.launched%]*[% END %] + [%ELSE%]Target [%target.id%][% END %] [% target.landingtick %] - + + "$.get('/jsrpc/joinable/[% target.raid %]//[% target.id %]/[% target.wave %]/[% target.joinable %]',{},parseUpdate)">
    + + + + + + + + + + + + + + +
    MetalCrystalEonium
    Roids[% t.roidMetal %][% t.roidCrystal %][% t.roidEonium %]
    Resources[% t.resourceMetal %][% t.resourceCrystal %][% t.resourceEonium %]
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Waves
    Research[% t.techWaves %]
    Amps[% t.strucWave_Amplifier %]
    Dists[% t.strucWave_Distorter %]
    Production
    Research[% t.techHulls %]
    Light factory[% t.strucLight_Factory %]
    Medium factory[% t.strucMedium_Factory %]
    Heavy factory[% t.strucHeavy_Factory %]
    +
    + [% FOR m IN t.missions %] +
    + +

    [% m.name %]
    + Tick: [% m.tick %]
    + Ships: [% m.amount %] +

    + + [% FOR s IN m.ships %] + + + + [% END %] +
    [% s.ship %][% s.amount %]
    +
    + [% END %] +
     
    +
    + +
    + +[% END %] + + diff --git a/root/static/default.css b/root/static/default.css index 3275e9f..84d6b4b 100644 --- a/root/static/default.css +++ b/root/static/default.css @@ -129,20 +129,19 @@ td.Attack{ color: black; } -a.Unclaim{ - color: green; -} -input.Unclaim{ +input.unclaim{ background: green; } -a.Claim{ - color: blue; +input.join{ + background: #00AAAA; } -a.Join{ - color: #00AAAA; +input.taken{ + background: #AA0000; } -input.Join{ - background: #00AAAA; + +input.blocked{ + background: black; + color: gray; } td.Friendly{ diff --git a/root/static/js/raid.js b/root/static/js/raid.js index 8bec240..89a06b6 100644 --- a/root/static/js/raid.js +++ b/root/static/js/raid.js @@ -1,158 +1,65 @@ -function getHTTPObject() { - var xmlhttp; - /*@cc_on - @if (@_jscript_version >= 5) - try { - xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); - } catch (e) { - try { - xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); - } catch (E) { - xmlhttp = false; - } - } - @else - xmlhttp = false; - @end @*/ +modified = "0000-01-01"; - if (!xmlhttp && typeof XMLHttpRequest != 'undefined') { - try { - xmlhttp = new XMLHttpRequest(); - } catch (e) { - xmlhttp = false; - } - } - return xmlhttp; -} - -var modified = '_'; - -function claim(dataSource, target, wave,cmd){ - var HTTP = getHTTPObject(); - if(HTTP) { - var url = dataSource + '&cmd='+cmd+'&target=' + target + '&wave=' + wave + '&rand='+ Math.random(); - //obj.innerHTML = "test"; - HTTP.open("GET", url,true); - HTTP.onreadystatechange = function(){ - if (HTTP.readyState == 4 && - HTTP.status == 200) { - updateClaims(dataSource,HTTP.responseXML,false); - var obj = document.getElementById("targets"); - if (obj){ - clearObject(obj); - var re = new RegExp("targetlist>((.|\\n)*)'); + var command = $(this).find('command').text(); + b.addClass(command); + b.click(function(){ + claim(target,wave,command); + }); + div.append(b); + switch ($(this).find('command').text()){ + case 'taken': + b.attr('disabled','disabled'); + b.val('Taken by '+$(this).find('claimers').text()); + if ($(this).find('claimers').text() == 'BLOCKED'){ + b.val($(this).find('claimers').text()); + b.addClass('blocked'); + } + break; + case 'claim': + b.val('Claim wave '+wave); + break; + case 'join': + b.val('Join wave '+wave + +' ('+$(this).find('claimers').text()+')'); + break; + case 'unclaim': + b.val('Unclaim wave '+wave + +' ('+$(this).find('claimers').text()+')'); + var j = $(''); + var joinable = $(this).find('joinable').text(); + j.click(function(){ + join(target,wave,joinable); + }); + div.append(j); + switch(joinable){ + case '0': + j.val('J'); + j.attr('title','Make target joinable'); + break; + case '1': + j.val('N'); + j.attr('title','Disable joinable'); + break; + } + break; } - } - HTTP.send(null); + }); + }); + if ($('targetlist',xml).text()){ + $('#targets').empty().html($('targetlist',xml).text()); } } -function updateClaims(dataSource,xmlthingy,timestamp){ - var targets = xmlthingy.getElementsByTagName("target"); - for (var i = 0; i < targets.length; i++){ - var target = targets[i].attributes.getNamedItem("id").nodeValue; - var obj = document.getElementById("claim"+target); - if (!obj) - continue; - //obj.innerHTML = ''; - clearObject(obj); - var waves = targets[i].getElementsByTagName("wave");; - for (var j = 0; j < waves.length; j++){ - var command = waves[j].getElementsByTagName("command")[0]; - var claimers = waves[j].getElementsByTagName("claimers")[0]; - var joinable = waves[j].getElementsByTagName("joinable")[0]; - var wave = waves[j].attributes.getNamedItem("id").nodeValue; - command = command.firstChild.nodeValue; - if(claimers.firstChild){ - claimers = '('+claimers.firstChild.nodeValue+')'; - }else - claimers = ''; - joinable = joinable.firstChild.nodeValue; - if (command == 'none'){ - var s = document.createElement("b"); - s.appendChild(document.createTextNode("Claimed by "+claimers)); - obj.appendChild(s); - }else{ - var b = document.createElement("input"); - b.type = 'button'; - b.setAttribute("class", command); - b.value = command +' wave '+wave+' '+claimers; - b.setAttribute("onclick", "claim('"+dataSource+"',"+target+","+wave+",'"+command+"');"); - /*b.onclick = function(){ - claim(dataSource,t,wave,command); - }*/ - obj.appendChild(b); - } - if (command == 'Unclaim'){ - var b = document.createElement("input"); - b.type = 'button'; - b.value = 'J'; - b.title = 'Make target joinable'; - command = 'set&joinable=TRUE'; - if (joinable == 1){ - b.value = 'N'; - b.title = 'Disable join'; - command = 'set&joinable=FALSE'; - } - b.setAttribute("onclick", "claim('"+dataSource+"',"+target+","+wave+",'"+command+"');"); - obj.appendChild(b); - } - /*@cc_on - obj.innerHTML = obj.innerHTML; // IE doesn't understand unless you tell it twice - @*/ - } - /* - obj = document.getElementById("coords"+target); - var coords = targets[i].getElementsByTagName("coords");; - if (obj) - obj.innerHTML = coords[0].firstChild.nodeValue; - */ - } - if (timestamp){ - timestamp = xmlthingy.getElementsByTagName("timestamp"); - if (timestamp) - modified = timestamp[0].firstChild.nodeValue; - } +function listTargets(){ + $.get("/jsrpc/listTargets",{},parseUpdate); } diff --git a/t/controller_JSRPC.t b/t/controller_JSRPC.t new file mode 100644 index 0000000..8a4f0db --- /dev/null +++ b/t/controller_JSRPC.t @@ -0,0 +1,10 @@ +use strict; +use warnings; +use Test::More tests => 3; + +BEGIN { use_ok 'Catalyst::Test', 'NDWeb' } +BEGIN { use_ok 'NDWeb::Controller::JSRPC' } + +ok( request('/jsrpc')->is_success, 'Request should succeed' ); + + diff --git a/t/controller_Raids.t b/t/controller_Raids.t new file mode 100644 index 0000000..129d23b --- /dev/null +++ b/t/controller_Raids.t @@ -0,0 +1,10 @@ +use strict; +use warnings; +use Test::More tests => 3; + +BEGIN { use_ok 'Catalyst::Test', 'NDWeb' } +BEGIN { use_ok 'NDWeb::Controller::Raids' } + +ok( request('/raids')->is_success, 'Request should succeed' ); + + diff --git a/templates/raids.tmpl b/templates/raids.tmpl deleted file mode 100644 index 4b88667..0000000 --- a/templates/raids.tmpl +++ /dev/null @@ -1,182 +0,0 @@ - -

    Total launched fleets:

    -
    -

    Open raids

    - -

    Raid - Landing tick: - - Edit - Close raid. - - Show coords. - - Waves: - Claims: - Launched: - -

    -
    - -

    Closed raids

    - -

    - Edit raid - Landing tick: - - Open raid. - - Waves: - Claims: - Launched: -

    -
    -
    - - -

    Removed raids

    - -

    - Edit raid - Landing tick: - Waves: - Claims: - Launched: -

    -
    -
    - - -
    Message -

    REMEMBER TO PASTE LAUNCH CONFIRMATION IF YOU WANT AN ATTACK POINT

    -

    DO NOT JOIN A WAVE UNLESS YOU HAVE PERMISSION FROM THE PERSON WHO CLAIMED IT

    -

    COORDS ARE NOT SHOWN UNTIL AT LEAST 10 MIN AFTER YOUR CLAIM

    -

    Landing tick first wave:

    - -
    - - -
    -

    - - -

    -
    -
    - -
    Target: # - -
      -
    • Size:
    • -
    • Score:
    • -
    • Value:
    • -
    • Fleet value:
    • -
    • Resource value:
    • -
    • Hidden value:
    • -
    • Factory Usage: , ,
    • -
    • Race:
    • - -
    • Roids wave : ( xp)
    • -
      -
    - -
    Comment - -
    -
    - - - - - - - - - - - - - - - -
    MetalCrystalEonium
    Roids
    Resources
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Waves
    Research
    Amps
    Dists
    Production
    Research
    Light factory
    Medium factory
    Heavy factory
    -
    - -
    - -


    - Tick:
    - Ships: -

    - - - - - - -
    -
    -
    -
     
    -
    - -
    -
    -
    - - - - -
    diff --git a/templates/raids.xml.tmpl b/templates/raids.xml.tmpl deleted file mode 100644 index 804a379..0000000 --- a/templates/raids.xml.tmpl +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - -- 2.39.2