]> ruin.nu Git - ndwebbie.git/commitdiff
working on raids
authorMichael Andreen <harv@ruin.nu>
Wed, 13 Dec 2006 12:19:45 +0000 (12:19 +0000)
committerMichael Andreen <harv@ruin.nu>
Wed, 13 Dec 2006 12:19:45 +0000 (12:19 +0000)
include.pl
index.pl
raid.js [new file with mode: 0644]
raids.pl [new file with mode: 0644]
templates/raids.tmpl [new file with mode: 0644]
templates/raids.xml.tmpl [new file with mode: 0644]
templates/skel.tmpl
templates/targetlist.tmpl [new file with mode: 0644]
templates/xml.tmpl [new file with mode: 0644]

index 9cb4f7d55c0dc0f6928c8dd3170d9f79be01cd29..408361a369ecab58a8fceeec08ff5f41613efde8 100644 (file)
@@ -52,4 +52,35 @@ sub parseMarkup {
        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;
index ff0381f0be616ac4fbc9f20ae5d91d66cb8e7415..061cbfa089e6e417b4f3c7a1e35e563380034da1 100755 (executable)
--- a/index.pl
+++ b/index.pl
@@ -66,12 +66,22 @@ while (my ($name,$attack,$gid) = $query->fetchrow()){
 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 $@;
@@ -79,33 +89,20 @@ unless (my $return = do "${page}.pl"){
        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;
 
diff --git a/raid.js b/raid.js
new file mode 100644 (file)
index 0000000..5a4eb14
--- /dev/null
+++ b/raid.js
@@ -0,0 +1,138 @@
+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;
+       }
+}
diff --git a/raids.pl b/raids.pl
new file mode 100644 (file)
index 0000000..6c43f9e
--- /dev/null
+++ b/raids.pl
@@ -0,0 +1,108 @@
+#**************************************************************************
+#   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;
diff --git a/templates/raids.tmpl b/templates/raids.tmpl
new file mode 100644 (file)
index 0000000..9c48aa5
--- /dev/null
@@ -0,0 +1,70 @@
+<TMPL_LOOP Raids>
+       <p><a href="index.pl?page=raids&amp;raid=<TMPL_VAR NAME=Raid>"><TMPL_VAR NAME=Raid></a>
+       <TMPL_IF isBC>
+               <a href="index.pl?page=editRaids&amp;raid=<TMPL_VAR NAME=Raid>">Edit</a>
+               <a href="index.pl?page=editRaids&amp;raid=<TMPL_VAR NAME=Raid>&amp;cmd=close">Close raid.</a>
+               <TMPL_UNLESS ReleasedCoords>
+               <a href="index.pl?page=editRaids&amp;raid=<TMPL_VAR NAME=Raid>&amp;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&amp;raid=<TMPL_VAR NAME=Raid>">Edit raid <TMPL_VAR NAME=Raid></a>
+                       
+                       <TMPL_UNLESS Open>
+                       <a href="index.pl?page=editRaids&amp;raid=<TMPL_VAR NAME=Raid>&amp;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&amp;raid=<TMPL_VAR NAME=Raid>')"/>
+               <input type="button" value="Update target list"
+                       onclick = "listTargets('index.pl?page=raids&amp;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>
diff --git a/templates/raids.xml.tmpl b/templates/raids.xml.tmpl
new file mode 100644 (file)
index 0000000..95c0f27
--- /dev/null
@@ -0,0 +1,20 @@
+<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>
index 904a93f96cd7cb7bf02bf799a259c444bd0f92c1..31c68601807e7b9c67e80777b1a5279ab4dd1fcc 100644 (file)
                                </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&amp;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>
diff --git a/templates/targetlist.tmpl b/templates/targetlist.tmpl
new file mode 100644 (file)
index 0000000..43024ad
--- /dev/null
@@ -0,0 +1,7 @@
+<TMPL_IF Targets>
+       <table><tr><th>Target</th><th>Landing tick</th></tr>
+       <TMPL_LOOP Targets>
+               <tr><td><a href="index.pl?page=check&amp;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>
diff --git a/templates/xml.tmpl b/templates/xml.tmpl
new file mode 100644 (file)
index 0000000..a3acc24
--- /dev/null
@@ -0,0 +1,2 @@
+<?xml version="1.0"?>
+<TMPL_VAR NAME=BODY>