return $text;
}
+sub min {
+ my ($x,$y) = @_;
+ return ($x > $y ? $y : $x);
+}
+
+sub max {
+ my ($x,$y) = @_;
+ return ($x < $y ? $y : $x);
+}
+
+sub listTargets {
+ my $query = $ND::DBH->prepare(qq{SELECT t.id, r.id AS raid, r.tick+c.wave-1 AS landingtick, released_coords, coords(x,y,z),c.launched
+FROM raid_claims c
+ JOIN raid_targets t ON c.target = t.id
+ JOIN raids r ON t.raid = r.id
+ JOIN current_planet_stats p ON t.planet = p.id
+WHERE c.uid = ? AND r.tick+c.wave > ? AND r.open AND not r.removed
+ORDER BY r.tick+c.wave,x,y,z});
+ $query->execute($ND::UID,$ND::TICK);
+ my @targets;
+ while (my $target = $query->fetchrow_hashref){
+ my $coords = "Target $target->{id}";
+ $coords = $target->{coords} if $target->{released_coords};
+ push @targets,{Coords => $coords, Launched => $target->{launched}, Raid => $target->{raid}
+ , Target => $target->{id}, Tick => $target->{landingtick}};
+ }
+ my $template = HTML::Template->new(filename => "templates/targetlist.tmpl");
+ $template->param(Targets => \@targets);
+ return $template->output;
+}
+
1;
our $LOG = $DBH->prepare('INSERT INTO log (uid,text) VALUES(?,?)');
my $page = 'main';
-if (param('page') =~ /^(main|check|motd|points|covop|top100|launchConfirmation|addintel|defrequest)$/){
+if (param('page') =~ /^(main|check|motd|points|covop|top100|launchConfirmation|addintel|defrequest|raids)$/){
$page = $1;
}
-print header;
-$ND::BODY = HTML::Template->new(filename => "templates/${page}.tmpl");
+our $XML = 0;
+$XML = 1 if param('xml') and $page =~ /^(raids)$/;
+
+if ($XML){
+ print header(-type=>'text/xml');
+ $ND::TEMPLATE = HTML::Template->new(filename => "templates/xml.tmpl");
+ $ND::BODY = HTML::Template->new(filename => "templates/${page}.xml.tmpl");
+}else{
+ print header;
+ $ND::BODY = HTML::Template->new(filename => "templates/${page}.tmpl");
+}
+
unless (my $return = do "${page}.pl"){
print "<p><b>couldn't parse $page: $@</b></p>" if $@;
print "<p><b>couldn't run $page</b></p>" unless $return;
}
-my $fleetupdate = $DBH->selectrow_array('SELECT landing_tick FROM fleets WHERE uid = ? AND fleet = 0',undef,$UID);
-
-$TEMPLATE->param(Tick => $TICK);
-$TEMPLATE->param(isMember => (($TICK - $fleetupdate < 24) || isScanner()) && $PLANET && isMember());
-$TEMPLATE->param(isHC => isHC());
-$TEMPLATE->param(isDC => isDC());
-$TEMPLATE->param(isBC => isBC());
-$TEMPLATE->param(isAttacker => $ATTACKER && (!isMember() || ((($TICK - $fleetupdate < 24) || isScanner()) && $PLANET)));
-if ($ATTACKER && (!isMember() || ((($TICK - $fleetupdate < 24) || isScanner()) && $PLANET))){
- my $query = $DBH->prepare(qq{SELECT t.id, r.id AS raid, r.tick+c.wave-1 AS landingtick, released_coords, coords(x,y,z),c.launched
-FROM raid_claims c
- JOIN raid_targets t ON c.target = t.id
- JOIN raids r ON t.raid = r.id
- JOIN current_planet_stats p ON t.planet = p.id
-WHERE c.uid = ? AND r.tick+c.wave > ? AND r.open AND not r.removed
-ORDER BY r.tick+c.wave,x,y,z});
- $query->execute($UID,$TICK);
- my @targets;
- while (my $target = $query->fetchrow_hashref){
- my $coords = "Target $target->{id}";
- $coords = $target->{coords} if $target->{released_coords};
- push @targets,{Coords => $coords, Launched => $target->{launched}, Raid => $target->{raid}
- , Target => $target->{id}, Tick => $target->{landingtick}};
+unless ($XML){
+ my $fleetupdate = $DBH->selectrow_array('SELECT landing_tick FROM fleets WHERE uid = ? AND fleet = 0',undef,$UID);
+
+ $TEMPLATE->param(Tick => $TICK);
+ $TEMPLATE->param(isMember => (($TICK - $fleetupdate < 24) || isScanner()) && $PLANET && isMember());
+ $TEMPLATE->param(isHC => isHC());
+ $TEMPLATE->param(isDC => isDC());
+ $TEMPLATE->param(isBC => isBC());
+ $TEMPLATE->param(isAttacker => $ATTACKER && (!isMember() || ((($TICK - $fleetupdate < 24) || isScanner()) && $PLANET)));
+ if ($ATTACKER && (!isMember() || ((($TICK - $fleetupdate < 24) || isScanner()) && $PLANET))){
+ $ND::TEMPLATE->param(Targets => listTargets());
}
- $ND::TEMPLATE->param(Targets => \@targets);
-}
+}
$ND::TEMPLATE->param(BODY => $ND::BODY->output);
print $TEMPLATE->output;
--- /dev/null
+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 @*/
+
+ if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
+ try {
+ xmlhttp = new XMLHttpRequest();
+ } catch (e) {
+ xmlhttp = false;
+ }
+ }
+ return xmlhttp;
+}
+
+var HTTP = getHTTPObject();
+var modified = '_';
+
+function claim(dataSource, target, wave,cmd){
+ if(HTTP) {
+ var url = dataSource + '&cmd='+cmd+'&target=' + target + '&wave=' + wave;
+ //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){
+ var re = new RegExp("targetlist>(.*)</targetlist", "m");
+ re.test(HTTP.responseText);
+ obj.innerHTML = RegExp.$1;
+ }
+ }
+ }
+ HTTP.send(null);
+ }
+}
+
+function listTargets(dataSource){
+ var http = getHTTPObject();
+ http.open("GET",dataSource+'&cmd=gettargets',true);
+ http.onreadystatechange = function(){
+ if (http.readyState == 4 &&
+ http.status == 200) {
+ var obj = document.getElementById("targets");
+ if (obj)
+ obj.innerHTML = http.responseText;
+ }
+ }
+ http.send(null);
+}
+
+function update(dataSource){
+ if(HTTP) {
+ HTTP.open("GET",dataSource+"&cmd=update&from="+modified,true);
+ HTTP.onreadystatechange = function(){
+ if (HTTP.readyState == 4 &&
+ HTTP.status == 200) {
+ updateClaims(dataSource,HTTP.responseXML,true);
+ }
+ }
+ HTTP.send(null);
+ }
+}
+
+function updateClaims(dataSource,xmldoc,timestamp){
+ targets = xmldoc.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 = '';
+ var waves = targets[i].getElementsByTagName("wave");;
+ for (var j = 0; j < waves.length; j++){
+ var command = waves[j].firstChild.nextSibling;
+ var claimers = command.nextSibling;
+ var joinable = claimers.nextSibling;
+ 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';
+ command = 'set&joinable=TRUE';
+ if (joinable == 1){
+ b.value = 'N';
+ command = 'set&joinable=FALSE';
+ }
+ b.setAttribute("onClick", "claim('"+dataSource+"',"+target+","+wave+",'"+command+"')");
+ obj.appendChild(b);
+ }
+ }
+ obj = document.getElementById("coords"+target);
+ var coords = targets[i].getElementsByTagName("coords");;
+ if (obj)
+ obj.innerHTML = coords[0].firstChild.nodeValue;
+ }
+ if (timestamp){
+ timestamp = xmldoc.getElementsByTagName("timestamp");
+ if (timestamp)
+ modified = timestamp[0].firstChild.nodeValue;
+ }
+}
--- /dev/null
+#**************************************************************************
+# Copyright (C) 2006 by Michael Andreen <harvATruinDOTnu> *
+# *
+# 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. *
+#**************************************************************************/
+
+use strict;
+use POSIX;
+our $BODY;
+our $DBH;
+our $LOG;
+our $XML;
+
+my $raid;
+if (param('raid') =~ /^(\d+)$/){
+ 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,$1,$ND::UID);
+}
+
+unless ($XML){
+ $ND::TEMPLATE->param(TITLE => 'Raids');
+ $ND::TEMPLATE->param(HEADER => '<script type="text/javascript" src="raid.js"></script>');
+ if ($raid){#We have a raid, so list all targets
+ $BODY->param(Raid => $raid->{id});
+ my $noingal = '';
+ my $planet;
+ if ($ND::PLANET){
+ my $query = $DBH->prepare("SELECT value, score,x,y FROM current_planet_stats WHERE id = ?");
+ $planet = $DBH->selectrow_hashref($query,undef,$ND::PLANET);
+ $noingal = "AND NOT (x = $planet->{x} AND y = $planet->{y})";
+ }
+ $BODY->param(Message => parseMarkup($raid->{message}));
+ $BODY->param(LandingTick => parseMarkup($raid->{tick}));
+ my $targetquery = $DBH->prepare(qq{SELECT r.id, r.planet, size, score, value, coords(p.x,p.y,p.z), race, p.value - p.size*200 -coalesce(c.metal+c.crystal+c.eonium,0)/150 - coalesce(c.structures,(SELECT avg(structures) FROM covop_targets)::int)*1500 AS fleetvalue,(c.metal+c.crystal+c.eonium)/100 AS resvalue, comment
+FROM current_planet_stats p
+ JOIN raid_targets r ON p.id = r.planet
+ LEFT OUTER JOIN covop_targets c ON p.id = c.planet
+WHERE r.raid = ?
+ $noingal
+ORDER BY size});
+ $targetquery->execute($raid->{id});
+ my @targets;
+ while (my $target = $targetquery->fetchrow_hashref){
+ my %target;
+ $target{Id} = $target->{id};
+ my $num = pow(10,length($target->{score})-2);
+ $target{Score} = ceil($target->{score}/$num)*$num;
+ $num = pow(10,length($target->{value})-2);
+ $target{Value} = 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;
+ $num = pow(10,length($target->{resvalue})-2);
+ $target{ResValue} = floor($target->{resvalue}/$num)*$num;
+ $target{comment} = parseMarkup($target->{comment}) if ($target->{comment});
+ my @roids;
+ my $size = $target{Size};
+ for (my $i = 1; $i <= $raid->{waves}; $i++){
+ my $roids = floor(0.25*$size);
+ $size -= $roids;
+ my $xp;
+ if ($planet){
+ $xp = max(0,floor($roids * 10 * (min(2,$target{Score}/$planet->{score}) + min(2,$target{Value}/$planet->{value})-1)));
+ }
+ push @roids,{Wave => $i, Roids => $roids, XP => $xp};
+ }
+ $target{Roids} = \@roids;
+
+ push @targets,\%target;
+ }
+ $BODY->param(Targets => \@targets);
+ }else{#list raids if we haven't chosen one yet
+ my $query = $DBH->prepare(q{SELECT id,released_coords FROM raids WHERE open AND not removed AND
+id IN (SELECT raid FROM raid_access NATURAL JOIN groupmembers WHERE uid = ?)});
+ $query->execute($ND::UID);
+ my @raids;
+ while (my $raid = $query->fetchrow_hashref){
+ push @raids,{Raid => $raid->{id}, ReleasedCoords => $raid->{released_coords}, isBC => isBC()};
+ }
+ $BODY->param(Raids => \@raids);
+
+ if (isBC()){
+ my $query = $DBH->prepare(q{SELECT id,open FROM raids WHERE not removed AND (not open
+OR id NOT IN (SELECT raid FROM raid_access NATURAL JOIN groupmembers WHERE uid = ?))});
+ $query->execute($ND::UID);
+ my @raids;
+ while (my $raid = $query->fetchrow_hashref){
+ push @raids,{Raid => $raid->{id}, Open => $raid->{open}};
+ }
+ $BODY->param(ClosedRaids => \@raids);
+ }
+ }
+}
+1;
--- /dev/null
+<TMPL_LOOP Raids>
+ <p><a href="index.pl?page=raids&raid=<TMPL_VAR NAME=Raid>"><TMPL_VAR NAME=Raid></a>
+ <TMPL_IF isBC>
+ <a href="index.pl?page=editRaids&raid=<TMPL_VAR NAME=Raid>">Edit</a>
+ <a href="index.pl?page=editRaids&raid=<TMPL_VAR NAME=Raid>&cmd=close">Close raid.</a>
+ <TMPL_UNLESS ReleasedCoords>
+ <a href="index.pl?page=editRaids&raid=<TMPL_VAR NAME=Raid>&cmd=showcoords">Show coords.</a>
+ </TMPL_UNLESS>
+ </TMPL_IF>
+ </p>
+</TMPL_LOOP>
+<TMPL_IF ClosedRaids>
+<p> Closed raids </p>
+<TMPL_LOOP ClosedRaids>
+ <p>
+ <a href="index.pl?page=editRaids&raid=<TMPL_VAR NAME=Raid>">Edit raid <TMPL_VAR NAME=Raid></a>
+
+ <TMPL_UNLESS Open>
+ <a href="index.pl?page=editRaids&raid=<TMPL_VAR NAME=Raid>&cmd=open">Open raid.</a>
+ </TMPL_UNLESS>
+ </p>
+</TMPL_LOOP>
+</TMPL_IF>
+
+<TMPL_IF Raid>
+<fieldset> <legend>Message</legend>
+ <p><b>REMEMBER TO PASTE LAUNCH CONFIRMATION IF YOU WANT AN ATTACK POINT</b></p>
+ <p><b style="color: red;">DO NOT JOIN A WAVE UNLESS YOU HAVE PERMISSION FROM THE PERSON WHO CLAIMED IT</b></p>
+ <p>Landing tick first wave: <TMPL_VAR NAME=LandingTick></p>
+ <p><TMPL_VAR NAME=Message></p>
+</fieldset>
+
+<form action="index.pl" method="post">
+ <p>
+ <input type="button" value="Update claims"
+ onclick = "update('index.pl?page=raids&raid=<TMPL_VAR NAME=Raid>')"/>
+ <input type="button" value="Update target list"
+ onclick = "listTargets('index.pl?page=raids&raid=<TMPL_VAR NAME=Raid>')"/>
+ </p>
+</form>
+<TMPL_LOOP Targets>
+<fieldset> <legend>Target: #<TMPL_VAR NAME=Id></legend>
+<a name="target<TMPL_VAR NAME=Id>"/>
+ <div class="leftinfo"><ul>
+ <li>Size: <TMPL_VAR NAME=Size></li>
+ <li class="<TMPL_VAR NAME=ScoreBash>">Score: <TMPL_VAR NAME=Score></li>
+ <li class="<TMPL_VAR NAME=ValueBash>">Value: <TMPL_VAR NAME=Value></li>
+ <li>Fleet value: <TMPL_VAR NAME=FleetValue></li>
+ <li>Resource value: <TMPL_VAR NAME=ResValue></li>
+ <li>Race: <TMPL_VAR NAME=Race></li>
+ <TMPL_LOOP Roids>
+ <li>Roids wave <TMPL_VAR NAME=Wave>: <TMPL_VAR NAME=Roids> (<TMPL_VAR NAME=XP> xp)</li>
+ </TMPL_LOOP>
+ </ul>
+ <TMPL_IF Comment>
+ <fieldset> <legend>Comment</legend>
+ <p><TMPL_VAR NAME=Comment></p>
+ </fieldset>
+ </TMPL_IF>
+ <TMPL_VAR NAME=PlanetScan>
+ </div>
+ <TMPL_LOOP Scans>
+ <div class="leftinfo">
+ <TMPL_VAR NAME=Scan>
+ </div>
+ </TMPL_LOOP>
+</fieldset>
+</TMPL_LOOP>
+
+</TMPL_IF>
--- /dev/null
+<targets>
+ <timestamp><TMPL_VAR NAME=Timestamp></timestamp>
+<TMPL_IF TargetList>
+ <targetlist>
+ <TMPL_VAR NAME=TargetList>
+ </targetlist>
+</TMPL_IF>
+<TMPL_LOOP Targets>
+ <target id="<TMPL_VAR NAME=Id>">
+ <TMPL_LOOP Waves>
+ <wave id="<TMPL_VAR NAME=Id>">
+ <command><TMPL_VAR NAME=Command></command>
+ <claimers><TMPL_VAR NAME=Claimers></claimers>
+ <joinable><TMPL_VAR NAME=Joinable></joinable>
+ <coords><TMPL_VAR NAME=Coords></coords>
+ </wave>
+ </TMPL_LOOP>
+ </target>
+</TMPL_LOOP>
+</targets>
</p></form></li>
<li><a href="index.pl?page=raids">Web raids</a></li>
</ul>
- <div id="targets"><TMPL_IF Targets>
- <table><tr><th>Target</th><th>Landing tick</th></tr>
- <TMPL_LOOP Targets>
- <tr><td><a href="index.pl?page=check&coords=<TMPL_VAR NAME=Coords>"><TMPL_VAR NAME=Coords></a><TMPL_IF Launched>*</TMPL_IF></td><td><a href="raids.php?raid=<TMPL_VAR NAME=Raid>#target<TMPL_VAR NAME=Target>"><TMPL_VAR NAME=Tick></a></td></tr>
- </TMPL_LOOP>
- </table>
- </TMPL_IF></div>
+ <div id="targets"><TMPL_VAR NAME=Targets></div>
</TMPL_IF>
<TMPL_IF isBC>
<p>BC menu</p>
--- /dev/null
+<TMPL_IF Targets>
+ <table><tr><th>Target</th><th>Landing tick</th></tr>
+ <TMPL_LOOP Targets>
+ <tr><td><a href="index.pl?page=check&coords=<TMPL_VAR NAME=Coords>"><TMPL_VAR NAME=Coords></a><TMPL_IF Launched>*</TMPL_IF></td><td><a href="raids.php?raid=<TMPL_VAR NAME=Raid>#target<TMPL_VAR NAME=Target>"><TMPL_VAR NAME=Tick></a></td></tr>
+ </TMPL_LOOP>
+ </table>
+</TMPL_IF>
--- /dev/null
+<?xml version="1.0"?>
+<TMPL_VAR NAME=BODY>